From d5fc08e49e902ba2cca242884b4c1e48517012e8 Mon Sep 17 00:00:00 2001 From: Belem Zhang Date: Fri, 26 Jul 2024 13:26:38 +0800 Subject: [PATCH] ORT Update: Create MLGraphBuilder for every model builder --- assets/dist/ort-wasm-simd-threaded.jsep.mjs | 186 ++++---- assets/dist/ort-wasm-simd-threaded.jsep.wasm | Bin 21248100 -> 21278083 bytes assets/dist/ort.all.bundle.min.mjs | 452 +++++++++---------- assets/dist/ort.all.bundle.min.mjs.map | 6 +- assets/dist/ort.webgpu.bundle.min.mjs | 334 +++++++------- assets/dist/ort.webgpu.bundle.min.mjs.map | 6 +- 6 files changed, 492 insertions(+), 492 deletions(-) diff --git a/assets/dist/ort-wasm-simd-threaded.jsep.mjs b/assets/dist/ort-wasm-simd-threaded.jsep.mjs index 0e8c0c7..1960118 100644 --- a/assets/dist/ort-wasm-simd-threaded.jsep.mjs +++ b/assets/dist/ort-wasm-simd-threaded.jsep.mjs @@ -7,111 +7,111 @@ async function(moduleArg = {}) { var moduleRtn; function e(){m.buffer!=q.buffer&&u();return q}function w(){m.buffer!=q.buffer&&u();return ba}function ca(){m.buffer!=q.buffer&&u();return da}function ea(){m.buffer!=q.buffer&&u();return fa}function z(){m.buffer!=q.buffer&&u();return ha}function A(){m.buffer!=q.buffer&&u();return ia}function ja(){m.buffer!=q.buffer&&u();return ka}function la(){m.buffer!=q.buffer&&u();return ma} -var B=Object.assign({},moduleArg),na,oa,pa=new Promise((a,b)=>{na=a;oa=b}),qa="object"==typeof window,C="function"==typeof importScripts,D="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,E=C&&"em-pthread"==self.name;if(D){const {createRequire:a}=await import("module");var require=a(import.meta.url),ra=require("worker_threads");global.Worker=ra.Worker;E=(C=!ra.ic)&&"em-pthread"==ra.workerData}"use strict"; -B.mountExternalData=(a,b)=>{(B.Cb||(B.Cb=new Map)).set(a,b)};B.unmountExternalData=()=>{delete B.Cb};var SharedArrayBuffer=globalThis.SharedArrayBuffer??(new WebAssembly.Memory({initial:0,maximum:0,shared:!0})).buffer.constructor;"use strict"; -let ta=()=>{const a=(c,d,f)=>(...g)=>{const k=F,l=d?.();g=c(...g);const p=d?.();l!==p&&(c=p,f(l),d=f=null);return F!=k?sa():g},b=c=>async(...d)=>{try{if(B.Bb)throw Error("Session already started");const f=B.Bb={Zb:d[0],errors:[]},g=await c(...d);if(B.Bb!==f)throw Error("Session mismatch");B.Jb?.flush();const k=f.errors;if(0p);if(0B._OrtCreateSession, +var B=Object.assign({},moduleArg),na,oa,pa=new Promise((a,b)=>{na=a;oa=b}),qa="object"==typeof window,C="function"==typeof importScripts,D="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,E=C&&"em-pthread"==self.name;if(D){const {createRequire:a}=await import("module");var require=a(import.meta.url),ra=require("worker_threads");global.Worker=ra.Worker;E=(C=!ra.lc)&&"em-pthread"==ra.workerData}"use strict"; +B.mountExternalData=(a,b)=>{(B.Fb||(B.Fb=new Map)).set(a,b)};B.unmountExternalData=()=>{delete B.Fb};var SharedArrayBuffer=globalThis.SharedArrayBuffer??(new WebAssembly.Memory({initial:0,maximum:0,shared:!0})).buffer.constructor;"use strict"; +let ta=()=>{const a=(c,d,f)=>(...g)=>{const k=F,l=d?.();g=c(...g);const p=d?.();l!==p&&(c=p,f(l),d=f=null);return F!=k?sa():g},b=c=>async(...d)=>{try{if(B.Eb)throw Error("Session already started");const f=B.Eb={bc:d[0],errors:[]},g=await c(...d);if(B.Eb!==f)throw Error("Session mismatch");B.Mb?.flush();const k=f.errors;if(0p);if(0B._OrtCreateSession, c=>B._OrtCreateSession=c);B._OrtRun=b(a(B._OrtRun,()=>B._OrtRun,c=>B._OrtRun=c));B._OrtRunWithBinding=b(a(B._OrtRunWithBinding,()=>B._OrtRunWithBinding,c=>B._OrtRunWithBinding=c));B._OrtBindInput=a(B._OrtBindInput,()=>B._OrtBindInput,c=>B._OrtBindInput=c);ta=void 0}; -B.jsepInit=(a,b)=>{ta?.();if("webgpu"===a){[B.Jb,B.Qb,B.Ub,B.Kb,B.Tb,B.gb,B.Vb,B.Xb,B.Rb,B.Sb,B.Wb]=b;const c=B.Jb;B.jsepRegisterBuffer=(d,f,g,k)=>c.registerBuffer(d,f,g,k);B.jsepGetBuffer=d=>c.getBuffer(d);B.jsepCreateDownloader=(d,f,g)=>c.createDownloader(d,f,g);B.jsepOnReleaseSession=d=>{c.onReleaseSession(d)};B.jsepOnRunStart=d=>c.onRunStart(d)}};var ua=Object.assign({},B),va="./this.program",wa=(a,b)=>{throw b;},G="",xa,ya,za; +B.jsepInit=(a,b)=>{ta?.();if("webgpu"===a){[B.Mb,B.Tb,B.Xb,B.Nb,B.Wb,B.jb,B.Yb,B.$b,B.Ub,B.Vb,B.Zb]=b;const c=B.Mb;B.jsepRegisterBuffer=(d,f,g,k)=>c.registerBuffer(d,f,g,k);B.jsepGetBuffer=d=>c.getBuffer(d);B.jsepCreateDownloader=(d,f,g)=>c.createDownloader(d,f,g);B.jsepOnReleaseSession=d=>{c.onReleaseSession(d)};B.jsepOnRunStart=d=>c.onRunStart(d)}};var ua=Object.assign({},B),va="./this.program",wa=(a,b)=>{throw b;},G="",xa,ya,za; if(D){var fs=require("fs"),Aa=require("path");G=require("url").fileURLToPath(new URL("./",import.meta.url));xa=(a,b)=>{a=Ba(a)?new URL(a):Aa.normalize(a);return fs.readFileSync(a,b?void 0:"utf8")};za=a=>{a=xa(a,!0);a.buffer||(a=new Uint8Array(a));return a};ya=(a,b,c,d=!0)=>{a=Ba(a)?new URL(a):Aa.normalize(a);fs.readFile(a,d?void 0:"utf8",(f,g)=>{f?c(f):b(d?g.buffer:g)})};!B.thisProgram&&1{process.exitCode= a;throw b;}}else if(qa||C)C?G=self.location.href:"undefined"!=typeof document&&document.currentScript&&(G=document.currentScript.src),_scriptName&&(G=_scriptName),G.startsWith("blob:")?G="":G=G.substr(0,G.replace(/[?#].*/,"").lastIndexOf("/")+1),D||(xa=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);return b.responseText},C&&(za=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}),ya=(a,b,c)=>{var d=new XMLHttpRequest; d.open("GET",a,!0);d.responseType="arraybuffer";d.onload=()=>{200==d.status||0==d.status&&d.response?b(d.response):c()};d.onerror=c;d.send(null)});D&&"undefined"==typeof performance&&(global.performance=require("perf_hooks").performance);var Ca=console.log.bind(console),Da=console.error.bind(console);D&&(Ca=(...a)=>fs.writeSync(1,a.join(" ")+"\n"),Da=(...a)=>fs.writeSync(2,a.join(" ")+"\n"));var Ea=Ca,H=Da;Object.assign(B,ua);ua=null; -if(E){var Fa;if(D){var Ga=ra.parentPort;Ga.on("message",b=>onmessage({data:b}));Object.assign(globalThis,{self:global,importScripts:()=>{},postMessage:b=>Ga.postMessage(b),performance:global.performance||{now:Date.now}})}var Ha=!1;H=function(...b){b=b.join(" ");D?fs.writeSync(2,b+"\n"):console.error(b)};self.alert=function(...b){postMessage({Ib:"alert",text:b.join(" "),jc:Ia()})};B.instantiateWasm=(b,c)=>new Promise(d=>{Fa=f=>{f=new WebAssembly.Instance(f,Ja());c(f);d()}});self.onunhandledrejection= -b=>{throw b.reason||b;};function a(b){try{var c=b.data,d=c.cmd;if("load"===d){let f=[];self.onmessage=g=>f.push(g);self.startWorker=()=>{postMessage({cmd:"loaded"});for(let g of f)a(g);self.onmessage=a};for(const g of c.handlers)if(!B[g]||B[g].proxy)B[g]=(...k)=>{postMessage({Ib:"callHandler",hc:g,args:k})},"print"==g&&(Ea=B[g]),"printErr"==g&&(H=B[g]);m=c.wasmMemory;u();Fa(c.wasmModule)}else if("run"===d){Ka(c.pthread_ptr,0,0,1,0,0);La(c.pthread_ptr);Ma();Na();Ha||(Oa(),Ha=!0);try{Pa(c.start_routine, +if(E){var Fa;if(D){var Ga=ra.parentPort;Ga.on("message",b=>onmessage({data:b}));Object.assign(globalThis,{self:global,importScripts:()=>{},postMessage:b=>Ga.postMessage(b),performance:global.performance||{now:Date.now}})}var Ha=!1;H=function(...b){b=b.join(" ");D?fs.writeSync(2,b+"\n"):console.error(b)};self.alert=function(...b){postMessage({Lb:"alert",text:b.join(" "),mc:Ia()})};B.instantiateWasm=(b,c)=>new Promise(d=>{Fa=f=>{f=new WebAssembly.Instance(f,Ja());c(f);d()}});self.onunhandledrejection= +b=>{throw b.reason||b;};function a(b){try{var c=b.data,d=c.cmd;if("load"===d){let f=[];self.onmessage=g=>f.push(g);self.startWorker=()=>{postMessage({cmd:"loaded"});for(let g of f)a(g);self.onmessage=a};for(const g of c.handlers)if(!B[g]||B[g].proxy)B[g]=(...k)=>{postMessage({Lb:"callHandler",kc:g,args:k})},"print"==g&&(Ea=B[g]),"printErr"==g&&(H=B[g]);m=c.wasmMemory;u();Fa(c.wasmModule)}else if("run"===d){Ka(c.pthread_ptr,0,0,1,0,0);La(c.pthread_ptr);Ma();Na();Ha||(Oa(),Ha=!0);try{Pa(c.start_routine, c.arg)}catch(f){if("unwind"!=f)throw f;}}else"cancel"===d?Ia()&&Qa(-1):"setimmediate"!==c.target&&("checkMailbox"===d?Ha&&Ra():d&&(H(`worker: received unknown command ${d}`),H(c)))}catch(f){throw Sa(),f;}}self.onmessage=a}var m,Ta,I=!1,Ua,q,ba,da,fa,ha,ia,ka,J,Va,ma; function u(){var a=m.buffer;B.HEAP8=q=new Int8Array(a);B.HEAP16=da=new Int16Array(a);B.HEAPU8=ba=new Uint8Array(a);B.HEAPU16=fa=new Uint16Array(a);B.HEAP32=ha=new Int32Array(a);B.HEAPU32=ia=new Uint32Array(a);B.HEAPF32=ka=new Float32Array(a);B.HEAPF64=ma=new Float64Array(a);B.HEAP64=J=new BigInt64Array(a);B.HEAPU64=Va=new BigUint64Array(a)} if(!E){if(B.wasmMemory)m=B.wasmMemory;else if(m=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0}),!(m.buffer instanceof SharedArrayBuffer))throw H("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),D&&H("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and/or recent version)"),Error("bad memory"); u()}var Wa=[],Xa=[],Ya=[],Za=0,$a=null,ab=null;function bb(){Za--;if(0==Za&&(null!==$a&&(clearInterval($a),$a=null),ab)){var a=ab;ab=null;a()}}function cb(a){a="Aborted("+a+")";H(a);I=!0;Ua=1;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");oa(a);throw a;}var db=a=>a.startsWith("data:application/octet-stream;base64,"),Ba=a=>a.startsWith("file://"),eb;function fb(a){if(za)return za(a);throw"both async and sync fetching of the wasm failed";} function gb(a){if(qa||C){if("function"==typeof fetch&&!Ba(a))return fetch(a,{credentials:"same-origin"}).then(b=>{if(!b.ok)throw`failed to load wasm binary file at '${a}'`;return b.arrayBuffer()}).catch(()=>fb(a));if(ya)return new Promise((b,c)=>{ya(a,d=>b(new Uint8Array(d)),c)})}return Promise.resolve().then(()=>fb(a))}function hb(a,b,c){return gb(a).then(d=>WebAssembly.instantiate(d,b)).then(c,d=>{H(`failed to asynchronously prepare wasm: ${d}`);cb(d)})} function ib(a,b){var c=eb;return"function"!=typeof WebAssembly.instantiateStreaming||db(c)||Ba(c)||D||"function"!=typeof fetch?hb(c,a,b):fetch(c,{credentials:"same-origin"}).then(d=>WebAssembly.instantiateStreaming(d,a).then(b,function(f){H(`wasm streaming compile failed: ${f}`);H("falling back to ArrayBuffer instantiation");return hb(c,a,b)}))} -function Ja(){jb={wa:kb,b:lb,Y:mb,y:nb,ma:ob,U:pb,W:qb,na:rb,ka:sb,da:tb,ja:ub,I:vb,V:wb,S:xb,la:yb,T:zb,sa:Ab,C:Bb,M:Cb,L:Db,B:Eb,s:Fb,p:Gb,D:Hb,x:Ib,N:Jb,ra:Kb,ga:Lb,Q:Mb,Z:Nb,E:Ob,fa:La,pa:Pb,u:Qb,A:Rb,o:Sb,k:Tb,c:Ub,n:Vb,j:Wb,xa:Xb,r:Yb,d:Zb,v:$b,m:ac,g:bc,l:cc,i:dc,h:ec,e:fc,aa:gc,ba:hc,ca:ic,_:jc,$:kc,P:lc,f:mc,K:nc,F:oc,J:pc,ta:qc,oa:rc,R:sc,t:tc,w:uc,O:vc,va:wc,ua:xc,ha:yc,ia:zc,X:Ac,z:Bc,H:Cc,ea:Dc,G:Ec,a:m,qa:Fc,q:Gc};return{a:jb}} -var Hc={1336340:(a,b,c,d)=>{if("undefined"==typeof B||!B.Cb)return 1;a=K(a>>>0);a.startsWith("./")&&(a=a.substring(2));a=B.Cb.get(a);if(!a)return 2;b>>>=0;c>>>=0;d>>>=0;if(b+c>a.byteLength)return 3;try{return w().set(a.subarray(b,b+c),d>>>0),0}catch{return 4}},1336841:()=>{B.Rb()},1336872:()=>{B.Sb()},1336901:()=>{B.Wb()},1336926:a=>B.Qb(a),1336959:a=>B.Ub(a),1336991:(a,b,c)=>{B.Kb(a,b,c,!0)},1337030:(a,b,c)=>{B.Kb(a,b,c)},1337063:()=>"undefined"!==typeof wasmOffsetConverter,1337120:a=>{B.gb("Abs", -a,void 0)},1337171:a=>{B.gb("Neg",a,void 0)},1337222:a=>{B.gb("Floor",a,void 0)},1337275:a=>{B.gb("Ceil",a,void 0)},1337327:a=>{B.gb("Reciprocal",a,void 0)},1337385:a=>{B.gb("Sqrt",a,void 0)},1337437:a=>{B.gb("Exp",a,void 0)},1337488:a=>{B.gb("Erf",a,void 0)},1337539:a=>{B.gb("Sigmoid",a,void 0)},1337594:(a,b,c)=>{B.gb("HardSigmoid",a,{alpha:b,beta:c})},1337673:a=>{B.gb("Log",a,void 0)},1337724:a=>{B.gb("Sin",a,void 0)},1337775:a=>{B.gb("Cos",a,void 0)},1337826:a=>{B.gb("Tan",a,void 0)},1337877:a=> -{B.gb("Asin",a,void 0)},1337929:a=>{B.gb("Acos",a,void 0)},1337981:a=>{B.gb("Atan",a,void 0)},1338033:a=>{B.gb("Sinh",a,void 0)},1338085:a=>{B.gb("Cosh",a,void 0)},1338137:a=>{B.gb("Asinh",a,void 0)},1338190:a=>{B.gb("Acosh",a,void 0)},1338243:a=>{B.gb("Atanh",a,void 0)},1338296:a=>{B.gb("Tanh",a,void 0)},1338348:a=>{B.gb("Not",a,void 0)},1338399:(a,b,c)=>{B.gb("Clip",a,{min:b,max:c})},1338468:a=>{B.gb("Clip",a,void 0)},1338520:(a,b)=>{B.gb("Elu",a,{alpha:b})},1338578:a=>{B.gb("Relu",a,void 0)},1338630:(a, -b)=>{B.gb("LeakyRelu",a,{alpha:b})},1338694:(a,b)=>{B.gb("ThresholdedRelu",a,{alpha:b})},1338764:(a,b)=>{B.gb("Cast",a,{to:b})},1338822:a=>{B.gb("Add",a,void 0)},1338873:a=>{B.gb("Sub",a,void 0)},1338924:a=>{B.gb("Mul",a,void 0)},1338975:a=>{B.gb("Div",a,void 0)},1339026:a=>{B.gb("Pow",a,void 0)},1339077:a=>{B.gb("Equal",a,void 0)},1339130:a=>{B.gb("Greater",a,void 0)},1339185:a=>{B.gb("GreaterOrEqual",a,void 0)},1339247:a=>{B.gb("Less",a,void 0)},1339299:a=>{B.gb("LessOrEqual",a,void 0)},1339358:(a, -b,c,d,f)=>{B.gb("ReduceMean",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1339517:(a,b,c,d,f)=>{B.gb("ReduceMax",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1339675:(a,b,c,d,f)=>{B.gb("ReduceMin",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1339833:(a,b,c,d,f)=>{B.gb("ReduceProd",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})}, -1339992:(a,b,c,d,f)=>{B.gb("ReduceSum",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1340150:(a,b,c,d,f)=>{B.gb("ReduceL1",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1340307:(a,b,c,d,f)=>{B.gb("ReduceL2",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1340464:(a,b,c,d,f)=>{B.gb("ReduceLogSum",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>> -0)):[]})},1340625:(a,b,c,d,f)=>{B.gb("ReduceSumSquare",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1340789:(a,b,c,d,f)=>{B.gb("ReduceLogSumExp",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1340953:a=>{B.gb("Where",a,void 0)},1341006:(a,b,c)=>{B.gb("Transpose",a,{perm:b?Array.from(z().subarray(b>>>0,c>>>0)):[]})},1341114:(a,b,c,d)=>{B.gb("DepthToSpace",a,{blocksize:b,mode:K(c),format:d?"NHWC":"NCHW"})},1341247:(a, -b,c,d)=>{B.gb("DepthToSpace",a,{blocksize:b,mode:K(c),format:d?"NHWC":"NCHW"})},1341380:(a,b,c,d,f,g,k,l,p,n,r,x,y,h,t)=>{B.gb("ConvTranspose",a,{format:p?"NHWC":"NCHW",autoPad:b,dilations:[c],group:d,kernelShape:[f],pads:[g,k],strides:[l],wIsConst:()=>!!e()[n>>>0],outputPadding:r?Array.from(z().subarray(r>>>0,x>>>0)):[],outputShape:y?Array.from(z().subarray(y>>>0,h>>>0)):[],activation:K(t)})},1341781:(a,b,c,d,f,g,k,l,p,n,r,x,y,h)=>{B.gb("ConvTranspose",a,{format:l?"NHWC":"NCHW",autoPad:b,dilations:Array.from(z().subarray(c>>> -0,(c>>>0)+2>>>0)),group:d,kernelShape:Array.from(z().subarray(f>>>0,(f>>>0)+2>>>0)),pads:Array.from(z().subarray(g>>>0,(g>>>0)+4>>>0)),strides:Array.from(z().subarray(k>>>0,(k>>>0)+2>>>0)),wIsConst:()=>!!e()[p>>>0],outputPadding:n?Array.from(z().subarray(n>>>0,r>>>0)):[],outputShape:x?Array.from(z().subarray(x>>>0,y>>>0)):[],activation:K(h)})},1342346:(a,b,c,d,f,g,k,l,p,n,r,x,y,h,t)=>{B.gb("ConvTranspose",a,{format:p?"NHWC":"NCHW",autoPad:b,dilations:[c],group:d,kernelShape:[f],pads:[g,k],strides:[l], -wIsConst:()=>!!e()[n>>>0],outputPadding:r?Array.from(z().subarray(r>>>0,x>>>0)):[],outputShape:y?Array.from(z().subarray(y>>>0,h>>>0)):[],activation:K(t)})},1342747:(a,b,c,d,f,g,k,l,p,n,r,x,y,h)=>{B.gb("ConvTranspose",a,{format:l?"NHWC":"NCHW",autoPad:b,dilations:Array.from(z().subarray(c>>>0,(c>>>0)+2>>>0)),group:d,kernelShape:Array.from(z().subarray(f>>>0,(f>>>0)+2>>>0)),pads:Array.from(z().subarray(g>>>0,(g>>>0)+4>>>0)),strides:Array.from(z().subarray(k>>>0,(k>>>0)+2>>>0)),wIsConst:()=>!!e()[p>>> -0],outputPadding:n?Array.from(z().subarray(n>>>0,r>>>0)):[],outputShape:x?Array.from(z().subarray(x>>>0,y>>>0)):[],activation:K(h)})},1343312:(a,b)=>{B.gb("GlobalAveragePool",a,{format:b?"NHWC":"NCHW"})},1343403:(a,b,c,d,f,g,k,l,p,n,r,x,y,h,t,v)=>{B.gb("AveragePool",a,{format:v?"NHWC":"NCHW",auto_pad:b,ceil_mode:c,count_include_pad:d,storage_order:f,dilations:[g,k],kernel_shape:[l,p],pads:[n,r,x,y],strides:[h,t]})},1343687:(a,b)=>{B.gb("GlobalAveragePool",a,{format:b?"NHWC":"NCHW"})},1343778:(a,b, -c,d,f,g,k,l,p,n,r,x,y,h,t,v)=>{B.gb("AveragePool",a,{format:v?"NHWC":"NCHW",auto_pad:b,ceil_mode:c,count_include_pad:d,storage_order:f,dilations:[g,k],kernel_shape:[l,p],pads:[n,r,x,y],strides:[h,t]})},1344062:(a,b)=>{B.gb("GlobalMaxPool",a,{format:b?"NHWC":"NCHW"})},1344149:(a,b,c,d,f,g,k,l,p,n,r,x,y,h,t,v)=>{B.gb("MaxPool",a,{format:v?"NHWC":"NCHW",auto_pad:b,ceil_mode:c,count_include_pad:d,storage_order:f,dilations:[g,k],kernel_shape:[l,p],pads:[n,r,x,y],strides:[h,t]})},1344429:(a,b)=>{B.gb("GlobalMaxPool", -a,{format:b?"NHWC":"NCHW"})},1344516:(a,b,c,d,f,g,k,l,p,n,r,x,y,h,t,v)=>{B.gb("MaxPool",a,{format:v?"NHWC":"NCHW",auto_pad:b,ceil_mode:c,count_include_pad:d,storage_order:f,dilations:[g,k],kernel_shape:[l,p],pads:[n,r,x,y],strides:[h,t]})},1344796:(a,b,c,d,f)=>{B.gb("Gemm",a,{alpha:b,beta:c,transA:d,transB:f})},1344900:a=>{B.gb("MatMul",a,void 0)},1344954:(a,b,c,d)=>{B.gb("ArgMax",a,{keepDims:!!b,selectLastIndex:!!c,axis:d})},1345062:(a,b,c,d)=>{B.gb("ArgMin",a,{keepDims:!!b,selectLastIndex:!!c,axis:d})}, -1345170:(a,b)=>{B.gb("Softmax",a,{axis:b})},1345233:(a,b)=>{B.gb("Concat",a,{axis:b})},1345293:(a,b,c,d,f)=>{B.gb("Split",a,{axis:b,numOutputs:c,splitSizes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1345433:a=>{B.gb("Expand",a,void 0)},1345487:(a,b)=>{B.gb("Gather",a,{axis:Number(b)})},1345558:(a,b)=>{B.gb("GatherElements",a,{axis:Number(b)})},1345637:(a,b,c,d,f,g,k,l,p,n,r)=>{B.gb("Resize",a,{antialias:b,axes:c?Array.from(z().subarray(c>>>0,d>>>0)):[],coordinateTransformMode:K(f),cubicCoeffA:g, -excludeOutside:k,extrapolationValue:l,keepAspectRatioPolicy:K(p),mode:K(n),nearestMode:K(r)})},1345983:(a,b,c,d,f,g,k)=>{B.gb("Slice",a,{starts:b?Array.from(z().subarray(b>>>0,c>>>0)):[],ends:d?Array.from(z().subarray(d>>>0,f>>>0)):[],axes:g?Array.from(z().subarray(g>>>0,k>>>0)):[]})},1346199:a=>{B.gb("Tile",a,void 0)},1346251:(a,b,c)=>{B.gb("InstanceNormalization",a,{epsilon:b,format:c?"NHWC":"NCHW"})},1346365:(a,b,c)=>{B.gb("InstanceNormalization",a,{epsilon:b,format:c?"NHWC":"NCHW"})},1346479:a=> -{B.gb("Range",a,void 0)},1346532:(a,b)=>{B.gb("Einsum",a,{equation:K(b)})},1346613:(a,b,c,d,f)=>{B.gb("Pad",a,{mode:b,value:c,pads:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1346740:(a,b,c,d,f,g)=>{B.gb("BatchNormalization",a,{epsilon:b,momentum:c,spatial:!!f,trainingMode:!!d,format:g?"NHWC":"NCHW"})},1346909:(a,b,c,d,f,g)=>{B.gb("BatchNormalization",a,{epsilon:b,momentum:c,spatial:!!f,trainingMode:!!d,format:g?"NHWC":"NCHW"})},1347078:(a,b,c)=>{B.gb("CumSum",a,{exclusive:Number(b),reverse:Number(c)})}, -1347175:(a,b,c,d,f,g,k,l,p)=>{B.gb("Attention",a,{numHeads:b,isUnidirectional:c,maskFilterValue:d,scale:f,doRotary:g,qkvHiddenSizes:k?Array.from(z().subarray(Number(l)>>>0,Number(l)+k>>>0)):[],pastPresentShareBuffer:!!p})},1347447:a=>{B.gb("BiasAdd",a,void 0)},1347502:a=>{B.gb("BiasSplitGelu",a,void 0)},1347563:a=>{B.gb("FastGelu",a,void 0)},1347619:(a,b,c,d,f,g,k,l,p,n,r,x,y,h,t,v)=>{B.gb("Conv",a,{format:x?"NHWC":"NCHW",auto_pad:b,dilations:c?Array.from(z().subarray(c>>>0,d>>>0)):[],group:f,kernel_shape:g? -Array.from(z().subarray(g>>>0,k>>>0)):[],pads:l?Array.from(z().subarray(l>>>0,p>>>0)):[],strides:n?Array.from(z().subarray(n>>>0,r>>>0)):[],w_is_const:()=>!!e()[y>>>0],activation:K(h),activation_params:t?Array.from(ja().subarray(t>>>0,v>>>0)):[]})},1348115:a=>{B.gb("Gelu",a,void 0)},1348167:(a,b,c,d)=>{B.gb("GroupQueryAttention",a,{numHeads:b,kvNumHeads:c,scale:d})},1348280:(a,b,c,d)=>{B.gb("LayerNormalization",a,{axis:b,epsilon:c,simplified:!!d})},1348391:(a,b,c,d)=>{B.gb("LayerNormalization",a, -{axis:b,epsilon:c,simplified:!!d})},1348502:(a,b,c,d,f,g)=>{B.gb("MatMulNBits",a,{k:b,n:c,accuracyLevel:d,bits:f,blockSize:g})},1348629:(a,b,c,d,f,g)=>{B.gb("MultiHeadAttention",a,{numHeads:b,isUnidirectional:c,maskFilterValue:d,scale:f,doRotary:g})},1348788:(a,b)=>{B.gb("QuickGelu",a,{alpha:b})},1348852:(a,b,c,d,f)=>{B.gb("RotaryEmbedding",a,{interleaved:!!b,numHeads:c,rotaryEmbeddingDim:d,scale:f})},1348991:(a,b,c)=>{B.gb("SkipLayerNormalization",a,{epsilon:b,simplified:!!c})},1349093:a=>{B.Vb(a)}, -1349127:(a,b)=>B.Xb(a,b,B.Bb.Zb,B.Bb.errors),1349239:(a,b,c)=>{B.gb("SkipLayerNormalization",a,{epsilon:b,simplified:!!c})}};function kb(a,b,c){return Ic(async()=>{await B.Tb(a,b,c)})}function Jc(a){this.name="ExitStatus";this.message=`Program terminated with exit(${a})`;this.status=a} -var Kc=a=>{a.terminate();a.onmessage=()=>{}},Nc=a=>{0==L.length&&(Lc(),Mc(L[0]));var b=L.pop();if(!b)return 6;M.push(b);N[a.xb]=b;b.xb=a.xb;var c={cmd:"run",start_routine:a.$b,arg:a.Mb,pthread_ptr:a.xb};D&&b.unref();b.postMessage(c,a.ec);return 0},O=0,P=(a,b,...c)=>{for(var d=2*c.length,f=Oc(),g=Pc(8*d),k=g>>>3,l=0;l>>0]=p)}a=Qc(a,0,d,g,b);Rc(f);return a}; -function Sc(a){if(E)return P(0,1,a);Ua=a;if(!(0{Ua=a;if(E)throw Uc(a),"unwind";Sc(a)},L=[],M=[],Vc=[],N={};function Wc(){for(var a=B.numThreads-1;a--;)Lc();Wa.unshift(()=>{Za++;Xc(()=>bb())})}var Zc=a=>{var b=a.xb;delete N[b];L.push(a);M.splice(M.indexOf(a),1);a.xb=0;Yc(b)};function Na(){Vc.forEach(a=>a())} -var Mc=a=>new Promise(b=>{a.onmessage=g=>{g=g.data;var k=g.cmd;if(g.targetThread&&g.targetThread!=Ia()){var l=N[g.targetThread];l?l.postMessage(g,g.transferList):H(`Internal error! Worker sent a message "${k}" to target pthread ${g.targetThread}, but that thread no longer exists!`)}else if("checkMailbox"===k)Ra();else if("spawnThread"===k)Nc(g);else if("cleanupThread"===k)Zc(N[g.thread]);else if("killThread"===k)g=g.thread,k=N[g],delete N[g],Kc(k),Yc(g),M.splice(M.indexOf(k),1),k.xb=0;else if("cancelThread"=== -k)N[g.thread].postMessage({cmd:"cancel"});else if("loaded"===k)a.loaded=!0,D&&!a.xb&&a.unref(),b(a);else if("alert"===k)alert(`Thread ${g.threadId}: ${g.text}`);else if("setimmediate"===g.target)a.postMessage(g);else if("callHandler"===k)B[g.handler](...g.args);else k&&H(`worker sent an unknown command ${k}`)};a.onerror=g=>{H(`${"worker sent an error!"} ${g.filename}:${g.lineno}: ${g.message}`);throw g;};D&&(a.on("message",g=>a.onmessage({data:g})),a.on("error",g=>a.onerror(g)));var c=[],d=["onExit"], -f;for(f of d)B.hasOwnProperty(f)&&c.push(f);a.postMessage({cmd:"load",handlers:c,wasmMemory:m,wasmModule:Ta})});function Xc(a){E?a():Promise.all(L.map(Mc)).then(a)}function Lc(){var a=new Worker(new URL(import.meta.url),{type:"module",workerData:"em-pthread",name:"em-pthread"});L.push(a)}var $c=a=>{for(;0{var a=Ia(),b=A()[a+52>>>2>>>0];a=A()[a+56>>>2>>>0];ad(b,b-a);Rc(b)},Pa=(a,b)=>{O=0;a=bd(a,b);0>>=0;var d=new cd(a);b>>>=0;c>>>=0;A()[d.Fb+16>>>2>>>0]=0;A()[d.Fb+4>>>2>>>0]=b;A()[d.Fb+8>>>2>>>0]=c;dd=a;ed++;throw dd;}function fd(a,b,c,d){return E?P(2,1,a,b,c,d):mb(a,b,c,d)} -function mb(a,b,c,d){a>>>=0;b>>>=0;c>>>=0;d>>>=0;if("undefined"==typeof SharedArrayBuffer)return H("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;var f=[];if(E&&0===f.length)return fd(a,b,c,d);a={$b:c,xb:a,Mb:d,ec:f};return E?(a.Ib="spawnThread",postMessage(a,f),0):Nc(a)} -var gd="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0,hd=(a,b,c)=>{b>>>=0;var d=b+c;for(c=b;a[c]&&!(c>=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},K=(a,b)=>(a>>>=0)?hd(w(),a,b):"";function nb(a,b,c){return E?P(3,1,a,b,c):0}function ob(a,b){if(E)return P(4,1,a,b)} -var jd=a=>{for(var b=0,c=0;c=d?b++:2047>=d?b+=2:55296<=d&&57343>=d?(b+=4,++c):b+=3}return b},kd=(a,b,c,d)=>{c>>>=0;if(!(0=k){var l=a.charCodeAt(++g);k=65536+((k&1023)<<10)|l&1023}if(127>=k){if(c>=d)break;b[c++>>>0]=k}else{if(2047>=k){if(c+1>=d)break;b[c++>>>0]=192|k>>6}else{if(65535>=k){if(c+2>=d)break;b[c++>>>0]=224|k>>12}else{if(c+3>=d)break;b[c++>>>0]=240|k>> -18;b[c++>>>0]=128|k>>12&63}b[c++>>>0]=128|k>>6&63}b[c++>>>0]=128|k&63}}b[c>>>0]=0;return c-f},ld=(a,b,c)=>kd(a,w(),b,c);function pb(a,b){if(E)return P(5,1,a,b)}function qb(a,b,c){if(E)return P(6,1,a,b,c)}function rb(a,b,c){return E?P(7,1,a,b,c):0}function sb(a,b){if(E)return P(8,1,a,b)}function tb(a,b,c){if(E)return P(9,1,a,b,c)}function ub(a,b,c,d){if(E)return P(10,1,a,b,c,d)}function vb(a,b,c,d){if(E)return P(11,1,a,b,c,d)}function wb(a,b,c,d){if(E)return P(12,1,a,b,c,d)} -function xb(a){if(E)return P(13,1,a)}function yb(a,b){if(E)return P(14,1,a,b)}function zb(a,b,c){if(E)return P(15,1,a,b,c)}var Ab=()=>{cb("")},md,Q=a=>{for(var b="";w()[a>>>0];)b+=md[w()[a++>>>0]];return b},nd={},od={},pd={},R; -function qd(a,b,c={}){var d=b.name;if(!a)throw new R(`type "${d}" must have a positive integer typeid pointer`);if(od.hasOwnProperty(a)){if(c.Ob)return;throw new R(`Cannot register type '${d}' twice`);}od[a]=b;delete pd[a];nd.hasOwnProperty(a)&&(b=nd[a],delete nd[a],b.forEach(f=>f()))}function S(a,b,c={}){if(!("argPackAdvance"in b))throw new TypeError("registerType registeredInstance requires argPackAdvance");return qd(a,b,c)} -var rd=(a,b,c)=>{switch(b){case 1:return c?d=>e()[d>>>0]:d=>w()[d>>>0];case 2:return c?d=>ca()[d>>>1>>>0]:d=>ea()[d>>>1>>>0];case 4:return c?d=>z()[d>>>2>>>0]:d=>A()[d>>>2>>>0];case 8:return c?d=>J[d>>>3]:d=>Va[d>>>3];default:throw new TypeError(`invalid integer width (${b}): ${a}`);}}; -function Bb(a,b,c){a>>>=0;c>>>=0;b=Q(b>>>0);S(a,{name:b,fromWireType:d=>d,toWireType:function(d,f){if("bigint"!=typeof f&&"number"!=typeof f)throw null===f?f="null":(d=typeof f,f="object"===d||"array"===d||"function"===d?f.toString():""+f),new TypeError(`Cannot convert "${f}" to ${this.name}`);"number"==typeof f&&(f=BigInt(f));return f},argPackAdvance:T,readValueFromPointer:rd(b,c,-1==b.indexOf("u")),Ab:null})}var T=8; -function Cb(a,b,c,d){a>>>=0;b=Q(b>>>0);S(a,{name:b,fromWireType:function(f){return!!f},toWireType:function(f,g){return g?c:d},argPackAdvance:T,readValueFromPointer:function(f){return this.fromWireType(w()[f>>>0])},Ab:null})}var sd=[],U=[];function Ub(a){a>>>=0;9{if(!a)throw new R("Cannot use deleted val. handle = "+a);return U[a]},W=a=>{switch(a){case void 0:return 2;case null:return 4;case !0:return 6;case !1:return 8;default:const b=sd.pop()||U.length;U[b]=a;U[b+1]=1;return b}};function td(a){return this.fromWireType(A()[a>>>2>>>0])}var ud={name:"emscripten::val",fromWireType:a=>{var b=V(a);Ub(a);return b},toWireType:(a,b)=>W(b),argPackAdvance:T,readValueFromPointer:td,Ab:null};function Db(a){return S(a>>>0,ud)} -var vd=(a,b)=>{switch(b){case 4:return function(c){return this.fromWireType(ja()[c>>>2>>>0])};case 8:return function(c){return this.fromWireType(la()[c>>>3>>>0])};default:throw new TypeError(`invalid float width (${b}): ${a}`);}};function Eb(a,b,c){a>>>=0;c>>>=0;b=Q(b>>>0);S(a,{name:b,fromWireType:d=>d,toWireType:(d,f)=>f,argPackAdvance:T,readValueFromPointer:vd(b,c),Ab:null})} -function Fb(a,b,c,d,f){a>>>=0;c>>>=0;b=Q(b>>>0);-1===f&&(f=4294967295);f=l=>l;if(0===d){var g=32-8*c;f=l=>l<>>g}var k=b.includes("unsigned")?function(l,p){return p>>>0}:function(l,p){return p};S(a,{name:b,fromWireType:f,toWireType:k,argPackAdvance:T,readValueFromPointer:rd(b,c,0!==d),Ab:null})} -function Gb(a,b,c){function d(g){var k=A()[g>>>2>>>0];g=A()[g+4>>>2>>>0];return new f(e().buffer,g,k)}a>>>=0;var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][b];c=Q(c>>>0);S(a,{name:c,fromWireType:d,argPackAdvance:T,readValueFromPointer:d},{Ob:!0})} -function Hb(a,b){a>>>=0;b=Q(b>>>0);var c="std::string"===b;S(a,{name:b,fromWireType:function(d){var f=A()[d>>>2>>>0],g=d+4;if(c)for(var k=g,l=0;l<=f;++l){var p=g+l;if(l==f||0==w()[p>>>0]){k=K(k,p-k);if(void 0===n)var n=k;else n+=String.fromCharCode(0),n+=k;k=p+1}}else{n=Array(f);for(l=0;l>>0]);n=n.join("")}X(d);return n},toWireType:function(d,f){f instanceof ArrayBuffer&&(f=new Uint8Array(f));var g="string"==typeof f;if(!(g||f instanceof Uint8Array||f instanceof -Uint8ClampedArray||f instanceof Int8Array))throw new R("Cannot pass non-string to std::string");var k=c&&g?jd(f):f.length;var l=wd(4+k+1),p=l+4;A()[l>>>2>>>0]=k;if(c&&g)ld(f,p,k+1);else if(g)for(g=0;g>>0]=n}else for(g=0;g>>0]=f[g];null!==d&&d.push(X,l);return l},argPackAdvance:T,readValueFromPointer:td,Ab(d){X(d)}})} -var xd="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0,yd=(a,b)=>{var c=a>>1;for(var d=c+b/2;!(c>=d)&&ea()[c>>>0];)++c;c<<=1;if(32=b/2);++d){var f=ca()[a+2*d>>>1>>>0];if(0==f)break;c+=String.fromCharCode(f)}return c},zd=(a,b,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>>>0]=g;b+=2}ca()[b>>>1>>>0]=0;return b-d},Ad=a=>2*a.length,Bd=(a,b)=> -{for(var c=0,d="";!(c>=b/4);){var f=z()[a+4*c>>>2>>>0];if(0==f)break;++c;65536<=f?(f-=65536,d+=String.fromCharCode(55296|f>>10,56320|f&1023)):d+=String.fromCharCode(f)}return d},Cd=(a,b,c)=>{b>>>=0;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}z()[b>>>2>>>0]=g;b+=4;if(b+4>c)break}z()[b>>>2>>>0]=0;return b-d},Dd=a=>{for(var b=0,c=0;c{if("undefined"==typeof B||!B.Fb)return 1;a=K(a>>>0);a.startsWith("./")&&(a=a.substring(2));a=B.Fb.get(a);if(!a)return 2;b>>>=0;c>>>=0;d>>>=0;if(b+c>a.byteLength)return 3;try{return w().set(a.subarray(b,b+c),d>>>0),0}catch{return 4}},1338217:()=>{B.Ub()},1338248:()=>{B.Vb()},1338277:()=>{B.Zb()},1338302:a=>B.Tb(a),1338335:a=>B.Xb(a),1338367:(a,b,c)=>{B.Nb(a,b,c,!0)},1338406:(a,b,c)=>{B.Nb(a,b,c)},1338439:()=>"undefined"!==typeof wasmOffsetConverter,1338496:a=>{B.jb("Abs", +a,void 0)},1338547:a=>{B.jb("Neg",a,void 0)},1338598:a=>{B.jb("Floor",a,void 0)},1338651:a=>{B.jb("Ceil",a,void 0)},1338703:a=>{B.jb("Reciprocal",a,void 0)},1338761:a=>{B.jb("Sqrt",a,void 0)},1338813:a=>{B.jb("Exp",a,void 0)},1338864:a=>{B.jb("Erf",a,void 0)},1338915:a=>{B.jb("Sigmoid",a,void 0)},1338970:(a,b,c)=>{B.jb("HardSigmoid",a,{alpha:b,beta:c})},1339049:a=>{B.jb("Log",a,void 0)},1339100:a=>{B.jb("Sin",a,void 0)},1339151:a=>{B.jb("Cos",a,void 0)},1339202:a=>{B.jb("Tan",a,void 0)},1339253:a=> +{B.jb("Asin",a,void 0)},1339305:a=>{B.jb("Acos",a,void 0)},1339357:a=>{B.jb("Atan",a,void 0)},1339409:a=>{B.jb("Sinh",a,void 0)},1339461:a=>{B.jb("Cosh",a,void 0)},1339513:a=>{B.jb("Asinh",a,void 0)},1339566:a=>{B.jb("Acosh",a,void 0)},1339619:a=>{B.jb("Atanh",a,void 0)},1339672:a=>{B.jb("Tanh",a,void 0)},1339724:a=>{B.jb("Not",a,void 0)},1339775:(a,b,c)=>{B.jb("Clip",a,{min:b,max:c})},1339844:a=>{B.jb("Clip",a,void 0)},1339896:(a,b)=>{B.jb("Elu",a,{alpha:b})},1339954:a=>{B.jb("Relu",a,void 0)},1340006:(a, +b)=>{B.jb("LeakyRelu",a,{alpha:b})},1340070:(a,b)=>{B.jb("ThresholdedRelu",a,{alpha:b})},1340140:(a,b)=>{B.jb("Cast",a,{to:b})},1340198:a=>{B.jb("Add",a,void 0)},1340249:a=>{B.jb("Sub",a,void 0)},1340300:a=>{B.jb("Mul",a,void 0)},1340351:a=>{B.jb("Div",a,void 0)},1340402:a=>{B.jb("Pow",a,void 0)},1340453:a=>{B.jb("Equal",a,void 0)},1340506:a=>{B.jb("Greater",a,void 0)},1340561:a=>{B.jb("GreaterOrEqual",a,void 0)},1340623:a=>{B.jb("Less",a,void 0)},1340675:a=>{B.jb("LessOrEqual",a,void 0)},1340734:(a, +b,c,d,f)=>{B.jb("ReduceMean",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1340893:(a,b,c,d,f)=>{B.jb("ReduceMax",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1341051:(a,b,c,d,f)=>{B.jb("ReduceMin",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1341209:(a,b,c,d,f)=>{B.jb("ReduceProd",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})}, +1341368:(a,b,c,d,f)=>{B.jb("ReduceSum",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1341526:(a,b,c,d,f)=>{B.jb("ReduceL1",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1341683:(a,b,c,d,f)=>{B.jb("ReduceL2",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1341840:(a,b,c,d,f)=>{B.jb("ReduceLogSum",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>> +0)):[]})},1342001:(a,b,c,d,f)=>{B.jb("ReduceSumSquare",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1342165:(a,b,c,d,f)=>{B.jb("ReduceLogSumExp",a,{keepDims:!!b,noopWithEmptyAxes:!!c,axes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1342329:a=>{B.jb("Where",a,void 0)},1342382:(a,b,c)=>{B.jb("Transpose",a,{perm:b?Array.from(z().subarray(b>>>0,c>>>0)):[]})},1342490:(a,b,c,d)=>{B.jb("DepthToSpace",a,{blocksize:b,mode:K(c),format:d?"NHWC":"NCHW"})},1342623:(a, +b,c,d)=>{B.jb("DepthToSpace",a,{blocksize:b,mode:K(c),format:d?"NHWC":"NCHW"})},1342756:(a,b,c,d,f,g,k,l,p,n,r,x,y,h,t)=>{B.jb("ConvTranspose",a,{format:p?"NHWC":"NCHW",autoPad:b,dilations:[c],group:d,kernelShape:[f],pads:[g,k],strides:[l],wIsConst:()=>!!e()[n>>>0],outputPadding:r?Array.from(z().subarray(r>>>0,x>>>0)):[],outputShape:y?Array.from(z().subarray(y>>>0,h>>>0)):[],activation:K(t)})},1343157:(a,b,c,d,f,g,k,l,p,n,r,x,y,h)=>{B.jb("ConvTranspose",a,{format:l?"NHWC":"NCHW",autoPad:b,dilations:Array.from(z().subarray(c>>> +0,(c>>>0)+2>>>0)),group:d,kernelShape:Array.from(z().subarray(f>>>0,(f>>>0)+2>>>0)),pads:Array.from(z().subarray(g>>>0,(g>>>0)+4>>>0)),strides:Array.from(z().subarray(k>>>0,(k>>>0)+2>>>0)),wIsConst:()=>!!e()[p>>>0],outputPadding:n?Array.from(z().subarray(n>>>0,r>>>0)):[],outputShape:x?Array.from(z().subarray(x>>>0,y>>>0)):[],activation:K(h)})},1343722:(a,b,c,d,f,g,k,l,p,n,r,x,y,h,t)=>{B.jb("ConvTranspose",a,{format:p?"NHWC":"NCHW",autoPad:b,dilations:[c],group:d,kernelShape:[f],pads:[g,k],strides:[l], +wIsConst:()=>!!e()[n>>>0],outputPadding:r?Array.from(z().subarray(r>>>0,x>>>0)):[],outputShape:y?Array.from(z().subarray(y>>>0,h>>>0)):[],activation:K(t)})},1344123:(a,b,c,d,f,g,k,l,p,n,r,x,y,h)=>{B.jb("ConvTranspose",a,{format:l?"NHWC":"NCHW",autoPad:b,dilations:Array.from(z().subarray(c>>>0,(c>>>0)+2>>>0)),group:d,kernelShape:Array.from(z().subarray(f>>>0,(f>>>0)+2>>>0)),pads:Array.from(z().subarray(g>>>0,(g>>>0)+4>>>0)),strides:Array.from(z().subarray(k>>>0,(k>>>0)+2>>>0)),wIsConst:()=>!!e()[p>>> +0],outputPadding:n?Array.from(z().subarray(n>>>0,r>>>0)):[],outputShape:x?Array.from(z().subarray(x>>>0,y>>>0)):[],activation:K(h)})},1344688:(a,b)=>{B.jb("GlobalAveragePool",a,{format:b?"NHWC":"NCHW"})},1344779:(a,b,c,d,f,g,k,l,p,n,r,x,y,h,t,v)=>{B.jb("AveragePool",a,{format:v?"NHWC":"NCHW",auto_pad:b,ceil_mode:c,count_include_pad:d,storage_order:f,dilations:[g,k],kernel_shape:[l,p],pads:[n,r,x,y],strides:[h,t]})},1345063:(a,b)=>{B.jb("GlobalAveragePool",a,{format:b?"NHWC":"NCHW"})},1345154:(a,b, +c,d,f,g,k,l,p,n,r,x,y,h,t,v)=>{B.jb("AveragePool",a,{format:v?"NHWC":"NCHW",auto_pad:b,ceil_mode:c,count_include_pad:d,storage_order:f,dilations:[g,k],kernel_shape:[l,p],pads:[n,r,x,y],strides:[h,t]})},1345438:(a,b)=>{B.jb("GlobalMaxPool",a,{format:b?"NHWC":"NCHW"})},1345525:(a,b,c,d,f,g,k,l,p,n,r,x,y,h,t,v)=>{B.jb("MaxPool",a,{format:v?"NHWC":"NCHW",auto_pad:b,ceil_mode:c,count_include_pad:d,storage_order:f,dilations:[g,k],kernel_shape:[l,p],pads:[n,r,x,y],strides:[h,t]})},1345805:(a,b)=>{B.jb("GlobalMaxPool", +a,{format:b?"NHWC":"NCHW"})},1345892:(a,b,c,d,f,g,k,l,p,n,r,x,y,h,t,v)=>{B.jb("MaxPool",a,{format:v?"NHWC":"NCHW",auto_pad:b,ceil_mode:c,count_include_pad:d,storage_order:f,dilations:[g,k],kernel_shape:[l,p],pads:[n,r,x,y],strides:[h,t]})},1346172:(a,b,c,d,f)=>{B.jb("Gemm",a,{alpha:b,beta:c,transA:d,transB:f})},1346276:a=>{B.jb("MatMul",a,void 0)},1346330:(a,b,c,d)=>{B.jb("ArgMax",a,{keepDims:!!b,selectLastIndex:!!c,axis:d})},1346438:(a,b,c,d)=>{B.jb("ArgMin",a,{keepDims:!!b,selectLastIndex:!!c,axis:d})}, +1346546:(a,b)=>{B.jb("Softmax",a,{axis:b})},1346609:(a,b)=>{B.jb("Concat",a,{axis:b})},1346669:(a,b,c,d,f)=>{B.jb("Split",a,{axis:b,numOutputs:c,splitSizes:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1346809:a=>{B.jb("Expand",a,void 0)},1346863:(a,b)=>{B.jb("Gather",a,{axis:Number(b)})},1346934:(a,b)=>{B.jb("GatherElements",a,{axis:Number(b)})},1347013:(a,b,c,d,f,g,k,l,p,n,r)=>{B.jb("Resize",a,{antialias:b,axes:c?Array.from(z().subarray(c>>>0,d>>>0)):[],coordinateTransformMode:K(f),cubicCoeffA:g, +excludeOutside:k,extrapolationValue:l,keepAspectRatioPolicy:K(p),mode:K(n),nearestMode:K(r)})},1347359:(a,b,c,d,f,g,k)=>{B.jb("Slice",a,{starts:b?Array.from(z().subarray(b>>>0,c>>>0)):[],ends:d?Array.from(z().subarray(d>>>0,f>>>0)):[],axes:g?Array.from(z().subarray(g>>>0,k>>>0)):[]})},1347575:a=>{B.jb("Tile",a,void 0)},1347627:(a,b,c)=>{B.jb("InstanceNormalization",a,{epsilon:b,format:c?"NHWC":"NCHW"})},1347741:(a,b,c)=>{B.jb("InstanceNormalization",a,{epsilon:b,format:c?"NHWC":"NCHW"})},1347855:a=> +{B.jb("Range",a,void 0)},1347908:(a,b)=>{B.jb("Einsum",a,{equation:K(b)})},1347989:(a,b,c,d,f)=>{B.jb("Pad",a,{mode:b,value:c,pads:d?Array.from(z().subarray(d>>>0,f>>>0)):[]})},1348116:(a,b,c,d,f,g)=>{B.jb("BatchNormalization",a,{epsilon:b,momentum:c,spatial:!!f,trainingMode:!!d,format:g?"NHWC":"NCHW"})},1348285:(a,b,c,d,f,g)=>{B.jb("BatchNormalization",a,{epsilon:b,momentum:c,spatial:!!f,trainingMode:!!d,format:g?"NHWC":"NCHW"})},1348454:(a,b,c)=>{B.jb("CumSum",a,{exclusive:Number(b),reverse:Number(c)})}, +1348551:(a,b,c,d,f,g,k,l,p)=>{B.jb("Attention",a,{numHeads:b,isUnidirectional:c,maskFilterValue:d,scale:f,doRotary:g,qkvHiddenSizes:k?Array.from(z().subarray(Number(l)>>>0,Number(l)+k>>>0)):[],pastPresentShareBuffer:!!p})},1348823:a=>{B.jb("BiasAdd",a,void 0)},1348878:a=>{B.jb("BiasSplitGelu",a,void 0)},1348939:a=>{B.jb("FastGelu",a,void 0)},1348995:(a,b,c,d,f,g,k,l,p,n,r,x,y,h,t,v)=>{B.jb("Conv",a,{format:x?"NHWC":"NCHW",auto_pad:b,dilations:c?Array.from(z().subarray(c>>>0,d>>>0)):[],group:f,kernel_shape:g? +Array.from(z().subarray(g>>>0,k>>>0)):[],pads:l?Array.from(z().subarray(l>>>0,p>>>0)):[],strides:n?Array.from(z().subarray(n>>>0,r>>>0)):[],w_is_const:()=>!!e()[y>>>0],activation:K(h),activation_params:t?Array.from(ja().subarray(t>>>0,v>>>0)):[]})},1349491:a=>{B.jb("Gelu",a,void 0)},1349543:(a,b,c,d)=>{B.jb("GroupQueryAttention",a,{numHeads:b,kvNumHeads:c,scale:d})},1349656:(a,b,c,d)=>{B.jb("LayerNormalization",a,{axis:b,epsilon:c,simplified:!!d})},1349767:(a,b,c,d)=>{B.jb("LayerNormalization",a, +{axis:b,epsilon:c,simplified:!!d})},1349878:(a,b,c,d,f,g)=>{B.jb("MatMulNBits",a,{k:b,n:c,accuracyLevel:d,bits:f,blockSize:g})},1350005:(a,b,c,d,f,g)=>{B.jb("MultiHeadAttention",a,{numHeads:b,isUnidirectional:c,maskFilterValue:d,scale:f,doRotary:g})},1350164:(a,b)=>{B.jb("QuickGelu",a,{alpha:b})},1350228:(a,b,c,d,f)=>{B.jb("RotaryEmbedding",a,{interleaved:!!b,numHeads:c,rotaryEmbeddingDim:d,scale:f})},1350367:(a,b,c)=>{B.jb("SkipLayerNormalization",a,{epsilon:b,simplified:!!c})},1350469:a=>{B.Yb(a)}, +1350503:(a,b)=>B.$b(a,b,B.Eb.bc,B.Eb.errors),1350615:(a,b,c)=>{B.jb("SkipLayerNormalization",a,{epsilon:b,simplified:!!c})}};function lb(a,b,c){return Lc(async()=>{await B.Wb(a,b,c)})}function kb(){return"undefined"!==typeof wasmOffsetConverter}function Mc(a){this.name="ExitStatus";this.message=`Program terminated with exit(${a})`;this.status=a} +var Nc=a=>{a.terminate();a.onmessage=()=>{}},Qc=a=>{0==L.length&&(Oc(),Pc(L[0]));var b=L.pop();if(!b)return 6;M.push(b);N[a.Ab]=b;b.Ab=a.Ab;var c={cmd:"run",start_routine:a.cc,arg:a.Pb,pthread_ptr:a.Ab};D&&b.unref();b.postMessage(c,a.ic);return 0},O=0,P=(a,b,...c)=>{for(var d=2*c.length,f=Rc(),g=Sc(8*d),k=g>>>3,l=0;l>>0]=p)}a=Uc(a,0,d,g,b);Vc(f);return a}; +function Hc(a){if(E)return P(0,1,a);Ua=a;if(!(0{Ua=a;if(E)throw Wc(a),"unwind";Hc(a)},L=[],M=[],Xc=[],N={};function Yc(){for(var a=B.numThreads-1;a--;)Oc();Wa.unshift(()=>{Za++;Zc(()=>bb())})}var ad=a=>{var b=a.Ab;delete N[b];L.push(a);M.splice(M.indexOf(a),1);a.Ab=0;$c(b)};function Na(){Xc.forEach(a=>a())} +var Pc=a=>new Promise(b=>{a.onmessage=g=>{g=g.data;var k=g.cmd;if(g.targetThread&&g.targetThread!=Ia()){var l=N[g.targetThread];l?l.postMessage(g,g.transferList):H(`Internal error! Worker sent a message "${k}" to target pthread ${g.targetThread}, but that thread no longer exists!`)}else if("checkMailbox"===k)Ra();else if("spawnThread"===k)Qc(g);else if("cleanupThread"===k)ad(N[g.thread]);else if("killThread"===k)g=g.thread,k=N[g],delete N[g],Nc(k),$c(g),M.splice(M.indexOf(k),1),k.Ab=0;else if("cancelThread"=== +k)N[g.thread].postMessage({cmd:"cancel"});else if("loaded"===k)a.loaded=!0,D&&!a.Ab&&a.unref(),b(a);else if("alert"===k)alert(`Thread ${g.threadId}: ${g.text}`);else if("setimmediate"===g.target)a.postMessage(g);else if("callHandler"===k)B[g.handler](...g.args);else k&&H(`worker sent an unknown command ${k}`)};a.onerror=g=>{H(`${"worker sent an error!"} ${g.filename}:${g.lineno}: ${g.message}`);throw g;};D&&(a.on("message",g=>a.onmessage({data:g})),a.on("error",g=>a.onerror(g)));var c=[],d=["onExit"], +f;for(f of d)B.hasOwnProperty(f)&&c.push(f);a.postMessage({cmd:"load",handlers:c,wasmMemory:m,wasmModule:Ta})});function Zc(a){E?a():Promise.all(L.map(Pc)).then(a)}function Oc(){var a=new Worker(new URL(import.meta.url),{type:"module",workerData:"em-pthread",name:"em-pthread"});L.push(a)}var bd=a=>{for(;0{var a=Ia(),b=A()[a+52>>>2>>>0];a=A()[a+56>>>2>>>0];cd(b,b-a);Vc(b)},Pa=(a,b)=>{O=0;a=dd(a,b);0>>=0;var d=new ed(a);b>>>=0;c>>>=0;A()[d.Ib+16>>>2>>>0]=0;A()[d.Ib+4>>>2>>>0]=b;A()[d.Ib+8>>>2>>>0]=c;fd=a;gd++;throw fd;}function hd(a,b,c,d){return E?P(2,1,a,b,c,d):nb(a,b,c,d)} +function nb(a,b,c,d){a>>>=0;b>>>=0;c>>>=0;d>>>=0;if("undefined"==typeof SharedArrayBuffer)return H("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;var f=[];if(E&&0===f.length)return hd(a,b,c,d);a={cc:c,Ab:a,Pb:d,ic:f};return E?(a.Lb="spawnThread",postMessage(a,f),0):Qc(a)} +var jd="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0,kd=(a,b,c)=>{b>>>=0;var d=b+c;for(c=b;a[c]&&!(c>=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},K=(a,b)=>(a>>>=0)?kd(w(),a,b):"";function ob(a,b,c){return E?P(3,1,a,b,c):0}function pb(a,b){if(E)return P(4,1,a,b)} +var ld=a=>{for(var b=0,c=0;c=d?b++:2047>=d?b+=2:55296<=d&&57343>=d?(b+=4,++c):b+=3}return b},md=(a,b,c,d)=>{c>>>=0;if(!(0=k){var l=a.charCodeAt(++g);k=65536+((k&1023)<<10)|l&1023}if(127>=k){if(c>=d)break;b[c++>>>0]=k}else{if(2047>=k){if(c+1>=d)break;b[c++>>>0]=192|k>>6}else{if(65535>=k){if(c+2>=d)break;b[c++>>>0]=224|k>>12}else{if(c+3>=d)break;b[c++>>>0]=240|k>> +18;b[c++>>>0]=128|k>>12&63}b[c++>>>0]=128|k>>6&63}b[c++>>>0]=128|k&63}}b[c>>>0]=0;return c-f},nd=(a,b,c)=>md(a,w(),b,c);function qb(a,b){if(E)return P(5,1,a,b)}function rb(a,b,c){if(E)return P(6,1,a,b,c)}function sb(a,b,c){return E?P(7,1,a,b,c):0}function tb(a,b){if(E)return P(8,1,a,b)}function ub(a,b,c){if(E)return P(9,1,a,b,c)}function vb(a,b,c,d){if(E)return P(10,1,a,b,c,d)}function wb(a,b,c,d){if(E)return P(11,1,a,b,c,d)}function xb(a,b,c,d){if(E)return P(12,1,a,b,c,d)} +function yb(a){if(E)return P(13,1,a)}function zb(a,b){if(E)return P(14,1,a,b)}function Ab(a,b,c){if(E)return P(15,1,a,b,c)}var Bb=()=>{cb("")},od,Q=a=>{for(var b="";w()[a>>>0];)b+=od[w()[a++>>>0]];return b},pd={},qd={},rd={},R; +function sd(a,b,c={}){var d=b.name;if(!a)throw new R(`type "${d}" must have a positive integer typeid pointer`);if(qd.hasOwnProperty(a)){if(c.Rb)return;throw new R(`Cannot register type '${d}' twice`);}qd[a]=b;delete rd[a];pd.hasOwnProperty(a)&&(b=pd[a],delete pd[a],b.forEach(f=>f()))}function S(a,b,c={}){if(!("argPackAdvance"in b))throw new TypeError("registerType registeredInstance requires argPackAdvance");return sd(a,b,c)} +var td=(a,b,c)=>{switch(b){case 1:return c?d=>e()[d>>>0]:d=>w()[d>>>0];case 2:return c?d=>ca()[d>>>1>>>0]:d=>ea()[d>>>1>>>0];case 4:return c?d=>z()[d>>>2>>>0]:d=>A()[d>>>2>>>0];case 8:return c?d=>J[d>>>3]:d=>Va[d>>>3];default:throw new TypeError(`invalid integer width (${b}): ${a}`);}}; +function Cb(a,b,c){a>>>=0;c>>>=0;b=Q(b>>>0);S(a,{name:b,fromWireType:d=>d,toWireType:function(d,f){if("bigint"!=typeof f&&"number"!=typeof f)throw null===f?f="null":(d=typeof f,f="object"===d||"array"===d||"function"===d?f.toString():""+f),new TypeError(`Cannot convert "${f}" to ${this.name}`);"number"==typeof f&&(f=BigInt(f));return f},argPackAdvance:T,readValueFromPointer:td(b,c,-1==b.indexOf("u")),Db:null})}var T=8; +function Db(a,b,c,d){a>>>=0;b=Q(b>>>0);S(a,{name:b,fromWireType:function(f){return!!f},toWireType:function(f,g){return g?c:d},argPackAdvance:T,readValueFromPointer:function(f){return this.fromWireType(w()[f>>>0])},Db:null})}var ud=[],U=[];function Vb(a){a>>>=0;9{if(!a)throw new R("Cannot use deleted val. handle = "+a);return U[a]},W=a=>{switch(a){case void 0:return 2;case null:return 4;case !0:return 6;case !1:return 8;default:const b=ud.pop()||U.length;U[b]=a;U[b+1]=1;return b}};function vd(a){return this.fromWireType(A()[a>>>2>>>0])}var wd={name:"emscripten::val",fromWireType:a=>{var b=V(a);Vb(a);return b},toWireType:(a,b)=>W(b),argPackAdvance:T,readValueFromPointer:vd,Db:null};function Eb(a){return S(a>>>0,wd)} +var xd=(a,b)=>{switch(b){case 4:return function(c){return this.fromWireType(ja()[c>>>2>>>0])};case 8:return function(c){return this.fromWireType(la()[c>>>3>>>0])};default:throw new TypeError(`invalid float width (${b}): ${a}`);}};function Fb(a,b,c){a>>>=0;c>>>=0;b=Q(b>>>0);S(a,{name:b,fromWireType:d=>d,toWireType:(d,f)=>f,argPackAdvance:T,readValueFromPointer:xd(b,c),Db:null})} +function Gb(a,b,c,d,f){a>>>=0;c>>>=0;b=Q(b>>>0);-1===f&&(f=4294967295);f=l=>l;if(0===d){var g=32-8*c;f=l=>l<>>g}var k=b.includes("unsigned")?function(l,p){return p>>>0}:function(l,p){return p};S(a,{name:b,fromWireType:f,toWireType:k,argPackAdvance:T,readValueFromPointer:td(b,c,0!==d),Db:null})} +function Hb(a,b,c){function d(g){var k=A()[g>>>2>>>0];g=A()[g+4>>>2>>>0];return new f(e().buffer,g,k)}a>>>=0;var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][b];c=Q(c>>>0);S(a,{name:c,fromWireType:d,argPackAdvance:T,readValueFromPointer:d},{Rb:!0})} +function Ib(a,b){a>>>=0;b=Q(b>>>0);var c="std::string"===b;S(a,{name:b,fromWireType:function(d){var f=A()[d>>>2>>>0],g=d+4;if(c)for(var k=g,l=0;l<=f;++l){var p=g+l;if(l==f||0==w()[p>>>0]){k=K(k,p-k);if(void 0===n)var n=k;else n+=String.fromCharCode(0),n+=k;k=p+1}}else{n=Array(f);for(l=0;l>>0]);n=n.join("")}X(d);return n},toWireType:function(d,f){f instanceof ArrayBuffer&&(f=new Uint8Array(f));var g="string"==typeof f;if(!(g||f instanceof Uint8Array||f instanceof +Uint8ClampedArray||f instanceof Int8Array))throw new R("Cannot pass non-string to std::string");var k=c&&g?ld(f):f.length;var l=yd(4+k+1),p=l+4;A()[l>>>2>>>0]=k;if(c&&g)nd(f,p,k+1);else if(g)for(g=0;g>>0]=n}else for(g=0;g>>0]=f[g];null!==d&&d.push(X,l);return l},argPackAdvance:T,readValueFromPointer:vd,Db(d){X(d)}})} +var zd="undefined"!=typeof TextDecoder?new TextDecoder("utf-16le"):void 0,Ad=(a,b)=>{var c=a>>1;for(var d=c+b/2;!(c>=d)&&ea()[c>>>0];)++c;c<<=1;if(32=b/2);++d){var f=ca()[a+2*d>>>1>>>0];if(0==f)break;c+=String.fromCharCode(f)}return c},Bd=(a,b,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>>>0]=g;b+=2}ca()[b>>>1>>>0]=0;return b-d},Cd=a=>2*a.length,Dd=(a,b)=> +{for(var c=0,d="";!(c>=b/4);){var f=z()[a+4*c>>>2>>>0];if(0==f)break;++c;65536<=f?(f-=65536,d+=String.fromCharCode(55296|f>>10,56320|f&1023)):d+=String.fromCharCode(f)}return d},Ed=(a,b,c)=>{b>>>=0;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}z()[b>>>2>>>0]=g;b+=4;if(b+4>c)break}z()[b>>>2>>>0]=0;return b-d},Fd=a=>{for(var b=0,c=0;c=d&&++c;b+=4}return b}; -function Ib(a,b,c){a>>>=0;b>>>=0;c>>>=0;c=Q(c);if(2===b){var d=yd;var f=zd;var g=Ad;var k=l=>ea()[l>>>1>>>0]}else 4===b&&(d=Bd,f=Cd,g=Dd,k=l=>A()[l>>>2>>>0]);S(a,{name:c,fromWireType:l=>{for(var p=A()[l>>>2>>>0],n,r=l+4,x=0;x<=p;++x){var y=l+4+x*b;if(x==p||0==k(y))r=d(r,y-r),void 0===n?n=r:(n+=String.fromCharCode(0),n+=r),r=y+b}X(l);return n},toWireType:(l,p)=>{if("string"!=typeof p)throw new R(`Cannot pass non-string to C++ string type ${c}`);var n=g(p),r=wd(4+n+b);A()[r>>>2>>>0]=n/b;f(p,r+4,n+b); -null!==l&&l.push(X,r);return r},argPackAdvance:T,readValueFromPointer:td,Ab(l){X(l)}})}function Jb(a,b){a>>>=0;b=Q(b>>>0);S(a,{Pb:!0,name:b,argPackAdvance:0,fromWireType:()=>{},toWireType:()=>{}})}var Kb=()=>1;function Lb(a){Ka(a>>>0,!C,1,!qa,131072,!1);Na()}var Ed=a=>{if(!I)try{if(a(),!(0>>=0;"function"===typeof Atomics.fc&&(Atomics.fc(z(),a>>>2,a).value.then(Ra),a+=128,Atomics.store(z(),a>>>2,1))}var Ra=()=>{var a=Ia();a&&(La(a),Ed(Fd))};function Mb(a,b){a>>>=0;a==b>>>0?setTimeout(Ra):E?postMessage({targetThread:a,cmd:"checkMailbox"}):(a=N[a])&&a.postMessage({cmd:"checkMailbox"})}var Gd=[];function Nb(a,b,c,d,f){b>>>=0;d/=2;Gd.length=d;c=f>>>0>>>3;for(f=0;f>>0];return(b?Hc[b]:Hd[a])(...Gd)} -function Ob(a){a>>>=0;E?postMessage({cmd:"cleanupThread",thread:a}):Zc(N[a])}function Pb(a){D&&N[a>>>0].ref()}var Jd=(a,b)=>{var c=od[a];if(void 0===c)throw a=Id(a),c=Q(a),X(a),new R(`${b} has unknown type ${c}`);return c},Kd=(a,b,c)=>{var d=[];a=a.toWireType(d,c);d.length&&(A()[b>>>2>>>0]=W(d));return a};function Qb(a,b,c){b>>>=0;c>>>=0;a=V(a>>>0);b=Jd(b,"emval::as");return Kd(b,c,a)}var Ld=a=>{try{a()}catch(b){cb(b)}}; -function Md(){var a=Y,b={};for(let [c,d]of Object.entries(a))b[c]="function"==typeof d?(...f)=>{Nd.push(c);try{return d(...f)}finally{I||(Nd.pop(),F&&1===Z&&0===Nd.length&&(Z=0,O+=1,Ld(Od),"undefined"!=typeof Fibers&&Fibers.lc()))}}:d;return b}var Z=0,F=null,Pd=0,Nd=[],Qd={},Rd={},Sd=0,Td=null,Ud=[];function sa(){return new Promise((a,b)=>{Td={resolve:a,reject:b}})} -function Vd(){var a=wd(65548),b=a+12;A()[a>>>2>>>0]=b;A()[a+4>>>2>>>0]=b+65536;b=Nd[0];var c=Qd[b];void 0===c&&(c=Sd++,Qd[b]=c,Rd[c]=b);b=c;z()[a+8>>>2>>>0]=b;return a}function Wd(){var a=z()[F+8>>>2>>>0];a=Y[Rd[a]];--O;return a()} -function Xd(a){if(!I){if(0===Z){var b=!1,c=!1;a((d=0)=>{if(!I&&(Pd=d,b=!0,c)){Z=2;Ld(()=>Yd(F));"undefined"!=typeof Browser&&Browser.Gb.Nb&&Browser.Gb.resume();d=!1;try{var f=Wd()}catch(l){f=l,d=!0}var g=!1;if(!F){var k=Td;k&&(Td=null,(d?k.reject:k.resolve)(f),g=!0)}if(d&&!g)throw f;}});c=!0;b||(Z=1,F=Vd(),"undefined"!=typeof Browser&&Browser.Gb.Nb&&Browser.Gb.pause(),Ld(()=>Zd(F)))}else 2===Z?(Z=0,Ld($d),X(F),F=null,Ud.forEach(Ed)):cb(`invalid state: ${Z}`);return Pd}} -function Ic(a){return Xd(b=>{a().then(b)})}function Rb(a){a>>>=0;return Ic(()=>{a=V(a);return a.then(W)})}var ae=[];function Sb(a,b,c,d){c>>>=0;d>>>=0;a=ae[a>>>0];b=V(b>>>0);return a(null,b,c,d)}var be={},ce=a=>{var b=be[a];return void 0===b?Q(a):b};function Tb(a,b,c,d,f){c>>>=0;d>>>=0;f>>>=0;a=ae[a>>>0];b=V(b>>>0);c=ce(c);return a(b,b[c],d,f)}var de=()=>"object"==typeof globalThis?globalThis:Function("return this")();function Vb(a){a>>>=0;if(0===a)return W(de());a=ce(a);return W(de()[a])} -var ee=a=>{var b=ae.length;ae.push(a);return b},fe=(a,b)=>{for(var c=Array(a),d=0;d>>2>>>0],"parameter "+d);return c},ge=(a,b)=>Object.defineProperty(b,"name",{value:a});function he(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=ge(b.name||"unknownFunctionName",function(){});c.prototype=b.prototype;c=new c;a=b.apply(c,a);return a instanceof Object?a:c} -function Wb(a,b,c){b=fe(a,b>>>0);var d=b.shift();a--;var f="return function (obj, func, destructorsRef, args) {\n",g=0,k=[];0===c&&k.push("obj");for(var l=["retType"],p=[d],n=0;nr.name).join(", ")}) => ${d.name}>`;return ee(ge(c,a))}function Xb(a){a=ce(a>>>0);return W(B[a])}function Yb(a,b){b>>>=0;a=V(a>>>0);b=V(b);return W(a[b])}function Zb(a){a>>>=0;9>>0);for(var b=Array(a.length),c=0;c>>0))}function cc(){return W({})} -function dc(a){a>>>=0;for(var b=V(a);b.length;){var c=b.pop();b.pop()(c)}Ub(a)}function ec(a,b,c){b>>>=0;c>>>=0;a=V(a>>>0);b=V(b);c=V(c);a[b]=c}function fc(a,b){b>>>=0;a=Jd(a>>>0,"_emval_take_value");a=a.readValueFromPointer(b);return W(a)} -function gc(a,b){a=-9007199254740992>a||9007199254740992>>=0;a=new Date(1E3*a);z()[b>>>2>>>0]=a.getUTCSeconds();z()[b+4>>>2>>>0]=a.getUTCMinutes();z()[b+8>>>2>>>0]=a.getUTCHours();z()[b+12>>>2>>>0]=a.getUTCDate();z()[b+16>>>2>>>0]=a.getUTCMonth();z()[b+20>>>2>>>0]=a.getUTCFullYear()-1900;z()[b+24>>>2>>>0]=a.getUTCDay();a=(a.getTime()-Date.UTC(a.getUTCFullYear(),0,1,0,0,0,0))/864E5|0;z()[b+28>>>2>>>0]=a} -var ie=a=>0===a%4&&(0!==a%100||0===a%400),je=[0,31,60,91,121,152,182,213,244,274,305,335],ke=[0,31,59,90,120,151,181,212,243,273,304,334]; -function hc(a,b){a=-9007199254740992>a||9007199254740992>>=0;a=new Date(1E3*a);z()[b>>>2>>>0]=a.getSeconds();z()[b+4>>>2>>>0]=a.getMinutes();z()[b+8>>>2>>>0]=a.getHours();z()[b+12>>>2>>>0]=a.getDate();z()[b+16>>>2>>>0]=a.getMonth();z()[b+20>>>2>>>0]=a.getFullYear()-1900;z()[b+24>>>2>>>0]=a.getDay();var c=(ie(a.getFullYear())?je:ke)[a.getMonth()]+a.getDate()-1|0;z()[b+28>>>2>>>0]=c;z()[b+36>>>2>>>0]=-(60*a.getTimezoneOffset());c=(new Date(a.getFullYear(),6,1)).getTimezoneOffset(); +function Jb(a,b,c){a>>>=0;b>>>=0;c>>>=0;c=Q(c);if(2===b){var d=Ad;var f=Bd;var g=Cd;var k=l=>ea()[l>>>1>>>0]}else 4===b&&(d=Dd,f=Ed,g=Fd,k=l=>A()[l>>>2>>>0]);S(a,{name:c,fromWireType:l=>{for(var p=A()[l>>>2>>>0],n,r=l+4,x=0;x<=p;++x){var y=l+4+x*b;if(x==p||0==k(y))r=d(r,y-r),void 0===n?n=r:(n+=String.fromCharCode(0),n+=r),r=y+b}X(l);return n},toWireType:(l,p)=>{if("string"!=typeof p)throw new R(`Cannot pass non-string to C++ string type ${c}`);var n=g(p),r=yd(4+n+b);A()[r>>>2>>>0]=n/b;f(p,r+4,n+b); +null!==l&&l.push(X,r);return r},argPackAdvance:T,readValueFromPointer:vd,Db(l){X(l)}})}function Kb(a,b){a>>>=0;b=Q(b>>>0);S(a,{Sb:!0,name:b,argPackAdvance:0,fromWireType:()=>{},toWireType:()=>{}})}var Lb=()=>1;function Mb(a){Ka(a>>>0,!C,1,!qa,131072,!1);Na()}var Gd=a=>{if(!I)try{if(a(),!(0>>=0;"function"===typeof Atomics.jc&&(Atomics.jc(z(),a>>>2,a).value.then(Ra),a+=128,Atomics.store(z(),a>>>2,1))}var Ra=()=>{var a=Ia();a&&(La(a),Gd(Hd))};function Nb(a,b){a>>>=0;a==b>>>0?setTimeout(Ra):E?postMessage({targetThread:a,cmd:"checkMailbox"}):(a=N[a])&&a.postMessage({cmd:"checkMailbox"})}var Id=[];function Ob(a,b,c,d,f){b>>>=0;d/=2;Id.length=d;c=f>>>0>>>3;for(f=0;f>>0];return(b?Kc[b]:Jd[a])(...Id)} +function Pb(a){a>>>=0;E?postMessage({cmd:"cleanupThread",thread:a}):ad(N[a])}function Qb(a){D&&N[a>>>0].ref()}var Ld=(a,b)=>{var c=qd[a];if(void 0===c)throw a=Kd(a),c=Q(a),X(a),new R(`${b} has unknown type ${c}`);return c},Md=(a,b,c)=>{var d=[];a=a.toWireType(d,c);d.length&&(A()[b>>>2>>>0]=W(d));return a};function Rb(a,b,c){b>>>=0;c>>>=0;a=V(a>>>0);b=Ld(b,"emval::as");return Md(b,c,a)}var Nd=a=>{try{a()}catch(b){cb(b)}}; +function Od(){var a=Y,b={};for(let [c,d]of Object.entries(a))b[c]="function"==typeof d?(...f)=>{Pd.push(c);try{return d(...f)}finally{I||(Pd.pop(),F&&1===Z&&0===Pd.length&&(Z=0,O+=1,Nd(Qd),"undefined"!=typeof Fibers&&Fibers.oc()))}}:d;return b}var Z=0,F=null,Rd=0,Pd=[],Sd={},Td={},Ud=0,Vd=null,Wd=[];function sa(){return new Promise((a,b)=>{Vd={resolve:a,reject:b}})} +function Xd(){var a=yd(65548),b=a+12;A()[a>>>2>>>0]=b;A()[a+4>>>2>>>0]=b+65536;b=Pd[0];var c=Sd[b];void 0===c&&(c=Ud++,Sd[b]=c,Td[c]=b);b=c;z()[a+8>>>2>>>0]=b;return a}function Yd(){var a=z()[F+8>>>2>>>0];a=Y[Td[a]];--O;return a()} +function Zd(a){if(!I){if(0===Z){var b=!1,c=!1;a((d=0)=>{if(!I&&(Rd=d,b=!0,c)){Z=2;Nd(()=>$d(F));"undefined"!=typeof Browser&&Browser.Jb.Qb&&Browser.Jb.resume();d=!1;try{var f=Yd()}catch(l){f=l,d=!0}var g=!1;if(!F){var k=Vd;k&&(Vd=null,(d?k.reject:k.resolve)(f),g=!0)}if(d&&!g)throw f;}});c=!0;b||(Z=1,F=Xd(),"undefined"!=typeof Browser&&Browser.Jb.Qb&&Browser.Jb.pause(),Nd(()=>ae(F)))}else 2===Z?(Z=0,Nd(be),X(F),F=null,Wd.forEach(Gd)):cb(`invalid state: ${Z}`);return Rd}} +function Lc(a){return Zd(b=>{a().then(b)})}function Sb(a){a>>>=0;return Lc(()=>{a=V(a);return a.then(W)})}var ce=[];function Tb(a,b,c,d){c>>>=0;d>>>=0;a=ce[a>>>0];b=V(b>>>0);return a(null,b,c,d)}var de={},ee=a=>{var b=de[a];return void 0===b?Q(a):b};function Ub(a,b,c,d,f){c>>>=0;d>>>=0;f>>>=0;a=ce[a>>>0];b=V(b>>>0);c=ee(c);return a(b,b[c],d,f)}var fe=()=>"object"==typeof globalThis?globalThis:Function("return this")();function Wb(a){a>>>=0;if(0===a)return W(fe());a=ee(a);return W(fe()[a])} +var ge=a=>{var b=ce.length;ce.push(a);return b},he=(a,b)=>{for(var c=Array(a),d=0;d>>2>>>0],"parameter "+d);return c},ie=(a,b)=>Object.defineProperty(b,"name",{value:a});function je(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=ie(b.name||"unknownFunctionName",function(){});c.prototype=b.prototype;c=new c;a=b.apply(c,a);return a instanceof Object?a:c} +function Xb(a,b,c){b=he(a,b>>>0);var d=b.shift();a--;var f="return function (obj, func, destructorsRef, args) {\n",g=0,k=[];0===c&&k.push("obj");for(var l=["retType"],p=[d],n=0;nr.name).join(", ")}) => ${d.name}>`;return ge(ie(c,a))}function Yb(a){a=ee(a>>>0);return W(B[a])}function Zb(a,b){b>>>=0;a=V(a>>>0);b=V(b);return W(a[b])}function $b(a){a>>>=0;9>>0);for(var b=Array(a.length),c=0;c>>0))}function dc(){return W({})} +function ec(a){a>>>=0;for(var b=V(a);b.length;){var c=b.pop();b.pop()(c)}Vb(a)}function fc(a,b,c){b>>>=0;c>>>=0;a=V(a>>>0);b=V(b);c=V(c);a[b]=c}function gc(a,b){b>>>=0;a=Ld(a>>>0,"_emval_take_value");a=a.readValueFromPointer(b);return W(a)} +function hc(a,b){a=-9007199254740992>a||9007199254740992>>=0;a=new Date(1E3*a);z()[b>>>2>>>0]=a.getUTCSeconds();z()[b+4>>>2>>>0]=a.getUTCMinutes();z()[b+8>>>2>>>0]=a.getUTCHours();z()[b+12>>>2>>>0]=a.getUTCDate();z()[b+16>>>2>>>0]=a.getUTCMonth();z()[b+20>>>2>>>0]=a.getUTCFullYear()-1900;z()[b+24>>>2>>>0]=a.getUTCDay();a=(a.getTime()-Date.UTC(a.getUTCFullYear(),0,1,0,0,0,0))/864E5|0;z()[b+28>>>2>>>0]=a} +var ke=a=>0===a%4&&(0!==a%100||0===a%400),le=[0,31,60,91,121,152,182,213,244,274,305,335],me=[0,31,59,90,120,151,181,212,243,273,304,334]; +function ic(a,b){a=-9007199254740992>a||9007199254740992>>=0;a=new Date(1E3*a);z()[b>>>2>>>0]=a.getSeconds();z()[b+4>>>2>>>0]=a.getMinutes();z()[b+8>>>2>>>0]=a.getHours();z()[b+12>>>2>>>0]=a.getDate();z()[b+16>>>2>>>0]=a.getMonth();z()[b+20>>>2>>>0]=a.getFullYear()-1900;z()[b+24>>>2>>>0]=a.getDay();var c=(ke(a.getFullYear())?le:me)[a.getMonth()]+a.getDate()-1|0;z()[b+28>>>2>>>0]=c;z()[b+36>>>2>>>0]=-(60*a.getTimezoneOffset());c=(new Date(a.getFullYear(),6,1)).getTimezoneOffset(); var d=(new Date(a.getFullYear(),0,1)).getTimezoneOffset();a=(c!=d&&a.getTimezoneOffset()==Math.min(d,c))|0;z()[b+32>>>2>>>0]=a} -function ic(a){a>>>=0;var b=new Date(z()[a+20>>>2>>>0]+1900,z()[a+16>>>2>>>0],z()[a+12>>>2>>>0],z()[a+8>>>2>>>0],z()[a+4>>>2>>>0],z()[a>>>2>>>0],0),c=z()[a+32>>>2>>>0],d=b.getTimezoneOffset(),f=(new Date(b.getFullYear(),6,1)).getTimezoneOffset(),g=(new Date(b.getFullYear(),0,1)).getTimezoneOffset(),k=Math.min(g,f);0>c?z()[a+32>>>2>>>0]=Number(f!=g&&k==d):0>>2>>>0]=b.getDay();c=(ie(b.getFullYear())?je:ke)[b.getMonth()]+ -b.getDate()-1|0;z()[a+28>>>2>>>0]=c;z()[a>>>2>>>0]=b.getSeconds();z()[a+4>>>2>>>0]=b.getMinutes();z()[a+8>>>2>>>0]=b.getHours();z()[a+12>>>2>>>0]=b.getDate();z()[a+16>>>2>>>0]=b.getMonth();z()[a+20>>>2>>>0]=b.getYear();a=b.getTime();return BigInt(isNaN(a)?-1:a/1E3)}function jc(a,b,c,d,f,g,k){return E?P(16,1,a,b,c,d,f,g,k):-52}function kc(a,b,c,d,f,g){if(E)return P(17,1,a,b,c,d,f,g)} -function lc(a,b,c,d){a>>>=0;b>>>=0;c>>>=0;d>>>=0;var f=(new Date).getFullYear(),g=new Date(f,0,1),k=new Date(f,6,1);f=g.getTimezoneOffset();var l=k.getTimezoneOffset(),p=Math.max(f,l);A()[a>>>2>>>0]=60*p;z()[b>>>2>>>0]=Number(f!=l);a=n=>n.toLocaleTimeString(void 0,{hour12:!1,timeZoneName:"short"}).split(" ")[1];g=a(g);k=a(k);l{le.length=0;for(var c;c=w()[a++>>>0];){var d=105!=c;d&=112!=c;b+=d&&b%8?4:0;le.push(112==c?A()[b>>>2>>>0]:106==c?J[b>>>3]:105==c?z()[b>>>2>>>0]:la()[b>>>3>>>0]);b+=d?8:4}return le};function mc(a,b,c){a>>>=0;b=me(b>>>0,c>>>0);return Hc[a](...b)}function nc(a,b,c){a>>>=0;b=me(b>>>0,c>>>0);return Hc[a](...b)}var oc=()=>{},pc=()=>Date.now();function qc(a,b){return H(K(a>>>0,b>>>0))}var rc=()=>{O+=1;throw"unwind";};function sc(){return 4294901760}var tc; -tc=()=>performance.timeOrigin+performance.now();var uc=()=>D?require("os").cpus().length:navigator.hardwareConcurrency;function vc(a){a>>>=0;var b=w().length;if(a<=b||4294901760=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);var f=Math;d=Math.max(a,d);a:{f=(f.min.call(f,4294901760,d+(65536-d%65536)%65536)-m.buffer.byteLength+65535)/65536;try{m.grow(f);u();var g=1;break a}catch(k){}g=void 0}if(g)return!0}return!1} -var ne=()=>{cb("Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER");return 0},oe={},pe=a=>{a.forEach(b=>{var c=ne();c&&(oe[c]=b)})};function wc(){var a=Error().stack.toString().split("\n");"Error"==a[0]&&a.shift();pe(a);oe.Lb=ne();oe.Yb=a;return oe.Lb} -function xc(a,b,c){a>>>=0;b>>>=0;if(oe.Lb==a)var d=oe.Yb;else d=Error().stack.toString().split("\n"),"Error"==d[0]&&d.shift(),pe(d);for(var f=3;d[f]&&ne()!=a;)++f;for(a=0;a>>2>>>0]=ne();return a} -var qe={},se=()=>{if(!re){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:va||"./this.program"},b;for(b in qe)void 0===qe[b]?delete a[b]:a[b]=qe[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);re=c}return re},re; -function yc(a,b){if(E)return P(18,1,a,b);a>>>=0;b>>>=0;var c=0;se().forEach((d,f)=>{var g=b+c;f=A()[a+4*f>>>2>>>0]=g;for(g=0;g>>0]=d.charCodeAt(g);e()[f>>>0]=0;c+=d.length+1});return 0}function zc(a,b){if(E)return P(19,1,a,b);a>>>=0;b>>>=0;var c=se();A()[a>>>2>>>0]=c.length;var d=0;c.forEach(f=>d+=f.length+1);A()[b>>>2>>>0]=d;return 0}function Bc(a){return E?P(20,1,a):52}function Cc(a,b,c,d){return E?P(21,1,a,b,c,d):52}function Dc(a,b,c,d){return E?P(22,1,a,b,c,d):70} -var te=[null,[],[]];function Ec(a,b,c,d){if(E)return P(23,1,a,b,c,d);b>>>=0;c>>>=0;d>>>=0;for(var f=0,g=0;g>>2>>>0],l=A()[b+4>>>2>>>0];b+=8;for(var p=0;p>>0],r=te[a];0===n||10===n?((1===a?Ea:H)(hd(r,0)),r.length=0):r.push(n)}f+=l}A()[d>>>2>>>0]=f;return 0}var ue=[31,29,31,30,31,30,31,31,30,31,30,31],ve=[31,28,31,30,31,30,31,31,30,31,30,31];function we(a){var b=Array(jd(a)+1);kd(a,b,0,b.length);return b}var xe=(a,b)=>{e().set(a,b>>>0)}; -function Fc(a,b,c,d){function f(h,t,v){for(h="number"==typeof h?h.toString():h||"";h.lengthTc?-1:0aa-h.getDate())t-=aa-h.getDate()+1,h.setDate(1),11>v?h.setMonth(v+1):(h.setMonth(0),h.setFullYear(h.getFullYear()+1));else{h.setDate(h.getDate()+t);break}}v=new Date(h.getFullYear()+1,0,4);t=l(new Date(h.getFullYear(), -0,4));v=l(v);return 0>=k(t,h)?0>=k(v,h)?h.getFullYear()+1:h.getFullYear():h.getFullYear()-1}a>>>=0;b>>>=0;c>>>=0;d>>>=0;var n=A()[d+40>>>2>>>0];d={cc:z()[d>>>2>>>0],bc:z()[d+4>>>2>>>0],Db:z()[d+8>>>2>>>0],Hb:z()[d+12>>>2>>>0],Eb:z()[d+16>>>2>>>0],zb:z()[d+20>>>2>>>0],rb:z()[d+24>>>2>>>0],yb:z()[d+28>>>2>>>0],kc:z()[d+32>>>2>>>0],ac:z()[d+36>>>2>>>0],dc:n?K(n):""};c=K(c);n={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y", -"%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var r in n)c=c.replace(new RegExp(r,"g"),n[r]);var x="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),y="January February March April May June July August September October November December".split(" ");n={"%a":h=>x[h.rb].substring(0,3),"%A":h=> -x[h.rb],"%b":h=>y[h.Eb].substring(0,3),"%B":h=>y[h.Eb],"%C":h=>g((h.zb+1900)/100|0,2),"%d":h=>g(h.Hb,2),"%e":h=>f(h.Hb,2," "),"%g":h=>p(h).toString().substring(2),"%G":p,"%H":h=>g(h.Db,2),"%I":h=>{h=h.Db;0==h?h=12:12{for(var t=0,v=0;v<=h.Eb-1;t+=(ie(h.zb+1900)?ue:ve)[v++]);return g(h.Hb+t,3)},"%m":h=>g(h.Eb+1,2),"%M":h=>g(h.bc,2),"%n":()=>"\n","%p":h=>0<=h.Db&&12>h.Db?"AM":"PM","%S":h=>g(h.cc,2),"%t":()=>"\t","%u":h=>h.rb||7,"%U":h=>g(Math.floor((h.yb+7-h.rb)/7), -2),"%V":h=>{var t=Math.floor((h.yb+7-(h.rb+6)%7)/7);2>=(h.rb+371-h.yb-2)%7&&t++;if(t)53==t&&(v=(h.rb+371-h.yb)%7,4==v||3==v&&ie(h.zb)||(t=1));else{t=52;var v=(h.rb+7-h.yb-1)%7;(4==v||5==v&&ie(h.zb%400-1))&&t++}return g(t,2)},"%w":h=>h.rb,"%W":h=>g(Math.floor((h.yb+7-(h.rb+6)%7)/7),2),"%y":h=>(h.zb+1900).toString().substring(2),"%Y":h=>h.zb+1900,"%z":h=>{h=h.ac;var t=0<=h;h=Math.abs(h)/60;return(t?"+":"-")+String("0000"+(h/60*100+h%60)).slice(-4)},"%Z":h=>h.dc,"%%":()=>"%"};c=c.replace(/%%/g,"\x00\x00"); -for(r in n)c.includes(r)&&(c=c.replace(new RegExp(r,"g"),n[r](d)));c=c.replace(/\0\0/g,"%");r=we(c);if(r.length>b)return 0;xe(r,a);return r.length-1}function Gc(a,b,c,d){return Fc(a>>>0,b>>>0,c>>>0,d>>>0)}E||Wc();for(var ye=Array(256),ze=0;256>ze;++ze)ye[ze]=String.fromCharCode(ze);md=ye;R=B.BindingError=class extends Error{constructor(a){super(a);this.name="BindingError"}};B.InternalError=class extends Error{constructor(a){super(a);this.name="InternalError"}};U.push(0,1,void 0,1,null,1,!0,1,!1,1); -B.count_emval_handles=()=>U.length/2-5-sd.length; -var Hd=[Sc,Uc,fd,nb,ob,pb,qb,rb,sb,tb,ub,vb,wb,xb,yb,zb,jc,kc,yc,zc,Bc,Cc,Dc,Ec],jb,Y=function(){function a(c,d){Y=c.exports;Y=Md();Y=Ae();Vc.push(Y.fb);Xa.unshift(Y.ya);Ta=d;bb();return Y}var b=Ja();Za++;if(B.instantiateWasm)try{return B.instantiateWasm(b,a)}catch(c){H(`Module.instantiateWasm callback failed with error: ${c}`),oa(c)}eb||=B.locateFile?db("ort-wasm-simd-threaded.jsep.wasm")?"ort-wasm-simd-threaded.jsep.wasm":B.locateFile?B.locateFile("ort-wasm-simd-threaded.jsep.wasm",G):G+"ort-wasm-simd-threaded.jsep.wasm": -(new URL("ort-wasm-simd-threaded.jsep.wasm",import.meta.url)).href;ib(b,function(c){a(c.instance,c.module)}).catch(oa);return{}}(),Id=a=>(Id=Y.za)(a),Oa=()=>(Oa=Y.Aa)();B._OrtInit=(a,b)=>(B._OrtInit=Y.Ba)(a,b);B._OrtGetLastError=(a,b)=>(B._OrtGetLastError=Y.Ca)(a,b);B._OrtCreateSessionOptions=(a,b,c,d,f,g,k,l,p,n)=>(B._OrtCreateSessionOptions=Y.Da)(a,b,c,d,f,g,k,l,p,n);B._OrtAppendExecutionProvider=(a,b)=>(B._OrtAppendExecutionProvider=Y.Ea)(a,b); -B._OrtAddFreeDimensionOverride=(a,b,c)=>(B._OrtAddFreeDimensionOverride=Y.Fa)(a,b,c);B._OrtAddSessionConfigEntry=(a,b,c)=>(B._OrtAddSessionConfigEntry=Y.Ga)(a,b,c);B._OrtReleaseSessionOptions=a=>(B._OrtReleaseSessionOptions=Y.Ha)(a);B._OrtCreateSession=(a,b,c)=>(B._OrtCreateSession=Y.Ia)(a,b,c);B._OrtReleaseSession=a=>(B._OrtReleaseSession=Y.Ja)(a);B._OrtGetInputOutputCount=(a,b,c)=>(B._OrtGetInputOutputCount=Y.Ka)(a,b,c);B._OrtGetInputName=(a,b)=>(B._OrtGetInputName=Y.La)(a,b); -B._OrtGetOutputName=(a,b)=>(B._OrtGetOutputName=Y.Ma)(a,b);B._OrtFree=a=>(B._OrtFree=Y.Na)(a);B._OrtCreateTensor=(a,b,c,d,f,g)=>(B._OrtCreateTensor=Y.Oa)(a,b,c,d,f,g);B._OrtGetTensorData=(a,b,c,d,f)=>(B._OrtGetTensorData=Y.Pa)(a,b,c,d,f);B._OrtReleaseTensor=a=>(B._OrtReleaseTensor=Y.Qa)(a);B._OrtCreateRunOptions=(a,b,c,d)=>(B._OrtCreateRunOptions=Y.Ra)(a,b,c,d);B._OrtAddRunConfigEntry=(a,b,c)=>(B._OrtAddRunConfigEntry=Y.Sa)(a,b,c);B._OrtReleaseRunOptions=a=>(B._OrtReleaseRunOptions=Y.Ta)(a); -B._OrtCreateBinding=a=>(B._OrtCreateBinding=Y.Ua)(a);B._OrtBindInput=(a,b,c)=>(B._OrtBindInput=Y.Va)(a,b,c);B._OrtBindOutput=(a,b,c,d)=>(B._OrtBindOutput=Y.Wa)(a,b,c,d);B._OrtClearBoundOutputs=a=>(B._OrtClearBoundOutputs=Y.Xa)(a);B._OrtReleaseBinding=a=>(B._OrtReleaseBinding=Y.Ya)(a);B._OrtRunWithBinding=(a,b,c,d,f)=>(B._OrtRunWithBinding=Y.Za)(a,b,c,d,f);B._OrtRun=(a,b,c,d,f,g,k,l)=>(B._OrtRun=Y._a)(a,b,c,d,f,g,k,l);B._OrtEndProfiling=a=>(B._OrtEndProfiling=Y.$a)(a); -B._JsepOutput=(a,b,c)=>(B._JsepOutput=Y.ab)(a,b,c);B._JsepGetNodeName=a=>(B._JsepGetNodeName=Y.bb)(a); -var Ia=()=>(Ia=Y.cb)(),wd=B._malloc=a=>(wd=B._malloc=Y.db)(a),X=B._free=a=>(X=B._free=Y.eb)(a),Ka=(a,b,c,d,f,g)=>(Ka=Y.hb)(a,b,c,d,f,g),Sa=()=>(Sa=Y.ib)(),Qc=(a,b,c,d,f)=>(Qc=Y.jb)(a,b,c,d,f),Yc=a=>(Yc=Y.kb)(a),Qa=a=>(Qa=Y.lb)(a),Fd=()=>(Fd=Y.mb)(),ad=(a,b)=>(ad=Y.nb)(a,b),Rc=a=>(Rc=Y.ob)(a),Pc=a=>(Pc=Y.pb)(a),Oc=()=>(Oc=Y.qb)(),bd=B.dynCall_ii=(a,b)=>(bd=B.dynCall_ii=Y.sb)(a,b),Zd=a=>(Zd=Y.tb)(a),Od=()=>(Od=Y.ub)(),Yd=a=>(Yd=Y.vb)(a),$d=()=>($d=Y.wb)();B.___start_em_js=1349341;B.___stop_em_js=1349502; -function Ae(){var a=Y;a=Object.assign({},a);var b=d=>f=>d(f)>>>0,c=d=>()=>d()>>>0;a.za=b(a.za);a.cb=c(a.cb);a.db=b(a.db);a.emscripten_main_runtime_thread_id=c(a.emscripten_main_runtime_thread_id);a.pb=b(a.pb);a.qb=c(a.qb);return a}B.stackSave=()=>Oc();B.stackRestore=a=>Rc(a);B.stackAlloc=a=>Pc(a);B.UTF8ToString=K;B.stringToUTF8=ld;B.lengthBytesUTF8=jd;var Be;ab=function Ce(){Be||De();Be||(ab=Ce)}; -function De(){if(!(0>>=0;var b=new Date(z()[a+20>>>2>>>0]+1900,z()[a+16>>>2>>>0],z()[a+12>>>2>>>0],z()[a+8>>>2>>>0],z()[a+4>>>2>>>0],z()[a>>>2>>>0],0),c=z()[a+32>>>2>>>0],d=b.getTimezoneOffset(),f=(new Date(b.getFullYear(),6,1)).getTimezoneOffset(),g=(new Date(b.getFullYear(),0,1)).getTimezoneOffset(),k=Math.min(g,f);0>c?z()[a+32>>>2>>>0]=Number(f!=g&&k==d):0>>2>>>0]=b.getDay();c=(ke(b.getFullYear())?le:me)[b.getMonth()]+ +b.getDate()-1|0;z()[a+28>>>2>>>0]=c;z()[a>>>2>>>0]=b.getSeconds();z()[a+4>>>2>>>0]=b.getMinutes();z()[a+8>>>2>>>0]=b.getHours();z()[a+12>>>2>>>0]=b.getDate();z()[a+16>>>2>>>0]=b.getMonth();z()[a+20>>>2>>>0]=b.getYear();a=b.getTime();return BigInt(isNaN(a)?-1:a/1E3)}function kc(a,b,c,d,f,g,k){return E?P(16,1,a,b,c,d,f,g,k):-52}function lc(a,b,c,d,f,g){if(E)return P(17,1,a,b,c,d,f,g)} +function mc(a,b,c,d){a>>>=0;b>>>=0;c>>>=0;d>>>=0;var f=(new Date).getFullYear(),g=new Date(f,0,1),k=new Date(f,6,1);f=g.getTimezoneOffset();var l=k.getTimezoneOffset(),p=Math.max(f,l);A()[a>>>2>>>0]=60*p;z()[b>>>2>>>0]=Number(f!=l);a=n=>n.toLocaleTimeString(void 0,{hour12:!1,timeZoneName:"short"}).split(" ")[1];g=a(g);k=a(k);l{ne.length=0;for(var c;c=w()[a++>>>0];){var d=105!=c;d&=112!=c;b+=d&&b%8?4:0;ne.push(112==c?A()[b>>>2>>>0]:106==c?J[b>>>3]:105==c?z()[b>>>2>>>0]:la()[b>>>3>>>0]);b+=d?8:4}return ne};function nc(a,b,c){a>>>=0;b=oe(b>>>0,c>>>0);return Kc[a](...b)}function oc(a,b,c){a>>>=0;b=oe(b>>>0,c>>>0);return Kc[a](...b)}var pc=()=>{},qc=()=>Date.now();function rc(a,b){return H(K(a>>>0,b>>>0))}var sc=()=>{O+=1;throw"unwind";};function tc(){return 4294901760}var uc; +uc=()=>performance.timeOrigin+performance.now();var vc=()=>D?require("os").cpus().length:navigator.hardwareConcurrency;function wc(){cb("Cannot use emscripten_pc_get_function without -sUSE_OFFSET_CONVERTER");return 0} +function xc(a){a>>>=0;var b=w().length;if(a<=b||4294901760=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);var f=Math;d=Math.max(a,d);a:{f=(f.min.call(f,4294901760,d+(65536-d%65536)%65536)-m.buffer.byteLength+65535)/65536;try{m.grow(f);u();var g=1;break a}catch(k){}g=void 0}if(g)return!0}return!1}var pe=()=>{cb("Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER");return 0},qe={},re=a=>{a.forEach(b=>{var c=pe();c&&(qe[c]=b)})}; +function yc(){var a=Error().stack.toString().split("\n");"Error"==a[0]&&a.shift();re(a);qe.Ob=pe();qe.ac=a;return qe.Ob}function zc(a,b,c){a>>>=0;b>>>=0;if(qe.Ob==a)var d=qe.ac;else d=Error().stack.toString().split("\n"),"Error"==d[0]&&d.shift(),re(d);for(var f=3;d[f]&&pe()!=a;)++f;for(a=0;a>>2>>>0]=pe();return a} +var se={},ue=()=>{if(!te){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:va||"./this.program"},b;for(b in se)void 0===se[b]?delete a[b]:a[b]=se[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);te=c}return te},te; +function Ac(a,b){if(E)return P(18,1,a,b);a>>>=0;b>>>=0;var c=0;ue().forEach((d,f)=>{var g=b+c;f=A()[a+4*f>>>2>>>0]=g;for(g=0;g>>0]=d.charCodeAt(g);e()[f>>>0]=0;c+=d.length+1});return 0}function Bc(a,b){if(E)return P(19,1,a,b);a>>>=0;b>>>=0;var c=ue();A()[a>>>2>>>0]=c.length;var d=0;c.forEach(f=>d+=f.length+1);A()[b>>>2>>>0]=d;return 0}function Dc(a){return E?P(20,1,a):52}function Ec(a,b,c,d){return E?P(21,1,a,b,c,d):52}function Fc(a,b,c,d){return E?P(22,1,a,b,c,d):70} +var ve=[null,[],[]];function Gc(a,b,c,d){if(E)return P(23,1,a,b,c,d);b>>>=0;c>>>=0;d>>>=0;for(var f=0,g=0;g>>2>>>0],l=A()[b+4>>>2>>>0];b+=8;for(var p=0;p>>0],r=ve[a];0===n||10===n?((1===a?Ea:H)(kd(r,0)),r.length=0):r.push(n)}f+=l}A()[d>>>2>>>0]=f;return 0}var we=[31,29,31,30,31,30,31,31,30,31,30,31],xe=[31,28,31,30,31,30,31,31,30,31,30,31];function ye(a){var b=Array(ld(a)+1);md(a,b,0,b.length);return b}var ze=(a,b)=>{e().set(a,b>>>0)}; +function Ic(a,b,c,d){function f(h,t,v){for(h="number"==typeof h?h.toString():h||"";h.lengthTc?-1:0aa-h.getDate())t-=aa-h.getDate()+1,h.setDate(1),11>v?h.setMonth(v+1):(h.setMonth(0),h.setFullYear(h.getFullYear()+1));else{h.setDate(h.getDate()+t);break}}v=new Date(h.getFullYear()+1,0,4);t=l(new Date(h.getFullYear(), +0,4));v=l(v);return 0>=k(t,h)?0>=k(v,h)?h.getFullYear()+1:h.getFullYear():h.getFullYear()-1}a>>>=0;b>>>=0;c>>>=0;d>>>=0;var n=A()[d+40>>>2>>>0];d={fc:z()[d>>>2>>>0],ec:z()[d+4>>>2>>>0],Gb:z()[d+8>>>2>>>0],Kb:z()[d+12>>>2>>>0],Hb:z()[d+16>>>2>>>0],Cb:z()[d+20>>>2>>>0],ub:z()[d+24>>>2>>>0],Bb:z()[d+28>>>2>>>0],nc:z()[d+32>>>2>>>0],dc:z()[d+36>>>2>>>0],hc:n?K(n):""};c=K(c);n={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y", +"%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var r in n)c=c.replace(new RegExp(r,"g"),n[r]);var x="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),y="January February March April May June July August September October November December".split(" ");n={"%a":h=>x[h.ub].substring(0,3),"%A":h=> +x[h.ub],"%b":h=>y[h.Hb].substring(0,3),"%B":h=>y[h.Hb],"%C":h=>g((h.Cb+1900)/100|0,2),"%d":h=>g(h.Kb,2),"%e":h=>f(h.Kb,2," "),"%g":h=>p(h).toString().substring(2),"%G":p,"%H":h=>g(h.Gb,2),"%I":h=>{h=h.Gb;0==h?h=12:12{for(var t=0,v=0;v<=h.Hb-1;t+=(ke(h.Cb+1900)?we:xe)[v++]);return g(h.Kb+t,3)},"%m":h=>g(h.Hb+1,2),"%M":h=>g(h.ec,2),"%n":()=>"\n","%p":h=>0<=h.Gb&&12>h.Gb?"AM":"PM","%S":h=>g(h.fc,2),"%t":()=>"\t","%u":h=>h.ub||7,"%U":h=>g(Math.floor((h.Bb+7-h.ub)/7), +2),"%V":h=>{var t=Math.floor((h.Bb+7-(h.ub+6)%7)/7);2>=(h.ub+371-h.Bb-2)%7&&t++;if(t)53==t&&(v=(h.ub+371-h.Bb)%7,4==v||3==v&&ke(h.Cb)||(t=1));else{t=52;var v=(h.ub+7-h.Bb-1)%7;(4==v||5==v&&ke(h.Cb%400-1))&&t++}return g(t,2)},"%w":h=>h.ub,"%W":h=>g(Math.floor((h.Bb+7-(h.ub+6)%7)/7),2),"%y":h=>(h.Cb+1900).toString().substring(2),"%Y":h=>h.Cb+1900,"%z":h=>{h=h.dc;var t=0<=h;h=Math.abs(h)/60;return(t?"+":"-")+String("0000"+(h/60*100+h%60)).slice(-4)},"%Z":h=>h.hc,"%%":()=>"%"};c=c.replace(/%%/g,"\x00\x00"); +for(r in n)c.includes(r)&&(c=c.replace(new RegExp(r,"g"),n[r](d)));c=c.replace(/\0\0/g,"%");r=ye(c);if(r.length>b)return 0;ze(r,a);return r.length-1}function Jc(a,b,c,d){return Ic(a>>>0,b>>>0,c>>>0,d>>>0)}E||Yc();for(var Ae=Array(256),Be=0;256>Be;++Be)Ae[Be]=String.fromCharCode(Be);od=Ae;R=B.BindingError=class extends Error{constructor(a){super(a);this.name="BindingError"}};B.InternalError=class extends Error{constructor(a){super(a);this.name="InternalError"}};U.push(0,1,void 0,1,null,1,!0,1,!1,1); +B.count_emval_handles=()=>U.length/2-5-ud.length; +var Jd=[Hc,Wc,hd,ob,pb,qb,rb,sb,tb,ub,vb,wb,xb,yb,zb,Ab,kc,lc,Ac,Bc,Dc,Ec,Fc,Gc],jb,Y=function(){function a(c,d){Y=c.exports;Y=Od();Y=Ce();Xc.push(Y.ib);Xa.unshift(Y.Ba);Ta=d;bb();return Y}var b=Ja();Za++;if(B.instantiateWasm)try{return B.instantiateWasm(b,a)}catch(c){H(`Module.instantiateWasm callback failed with error: ${c}`),oa(c)}eb||=B.locateFile?db("ort-wasm-simd-threaded.jsep.wasm")?"ort-wasm-simd-threaded.jsep.wasm":B.locateFile?B.locateFile("ort-wasm-simd-threaded.jsep.wasm",G):G+"ort-wasm-simd-threaded.jsep.wasm": +(new URL("ort-wasm-simd-threaded.jsep.wasm",import.meta.url)).href;ib(b,function(c){a(c.instance,c.module)}).catch(oa);return{}}(),Kd=a=>(Kd=Y.Ca)(a),Oa=()=>(Oa=Y.Da)();B._OrtInit=(a,b)=>(B._OrtInit=Y.Ea)(a,b);B._OrtGetLastError=(a,b)=>(B._OrtGetLastError=Y.Fa)(a,b);B._OrtCreateSessionOptions=(a,b,c,d,f,g,k,l,p,n)=>(B._OrtCreateSessionOptions=Y.Ga)(a,b,c,d,f,g,k,l,p,n);B._OrtAppendExecutionProvider=(a,b)=>(B._OrtAppendExecutionProvider=Y.Ha)(a,b); +B._OrtAddFreeDimensionOverride=(a,b,c)=>(B._OrtAddFreeDimensionOverride=Y.Ia)(a,b,c);B._OrtAddSessionConfigEntry=(a,b,c)=>(B._OrtAddSessionConfigEntry=Y.Ja)(a,b,c);B._OrtReleaseSessionOptions=a=>(B._OrtReleaseSessionOptions=Y.Ka)(a);B._OrtCreateSession=(a,b,c)=>(B._OrtCreateSession=Y.La)(a,b,c);B._OrtReleaseSession=a=>(B._OrtReleaseSession=Y.Ma)(a);B._OrtGetInputOutputCount=(a,b,c)=>(B._OrtGetInputOutputCount=Y.Na)(a,b,c);B._OrtGetInputName=(a,b)=>(B._OrtGetInputName=Y.Oa)(a,b); +B._OrtGetOutputName=(a,b)=>(B._OrtGetOutputName=Y.Pa)(a,b);B._OrtFree=a=>(B._OrtFree=Y.Qa)(a);B._OrtCreateTensor=(a,b,c,d,f,g)=>(B._OrtCreateTensor=Y.Ra)(a,b,c,d,f,g);B._OrtGetTensorData=(a,b,c,d,f)=>(B._OrtGetTensorData=Y.Sa)(a,b,c,d,f);B._OrtReleaseTensor=a=>(B._OrtReleaseTensor=Y.Ta)(a);B._OrtCreateRunOptions=(a,b,c,d)=>(B._OrtCreateRunOptions=Y.Ua)(a,b,c,d);B._OrtAddRunConfigEntry=(a,b,c)=>(B._OrtAddRunConfigEntry=Y.Va)(a,b,c);B._OrtReleaseRunOptions=a=>(B._OrtReleaseRunOptions=Y.Wa)(a); +B._OrtCreateBinding=a=>(B._OrtCreateBinding=Y.Xa)(a);B._OrtBindInput=(a,b,c)=>(B._OrtBindInput=Y.Ya)(a,b,c);B._OrtBindOutput=(a,b,c,d)=>(B._OrtBindOutput=Y.Za)(a,b,c,d);B._OrtClearBoundOutputs=a=>(B._OrtClearBoundOutputs=Y._a)(a);B._OrtReleaseBinding=a=>(B._OrtReleaseBinding=Y.$a)(a);B._OrtRunWithBinding=(a,b,c,d,f)=>(B._OrtRunWithBinding=Y.ab)(a,b,c,d,f);B._OrtRun=(a,b,c,d,f,g,k,l)=>(B._OrtRun=Y.bb)(a,b,c,d,f,g,k,l);B._OrtEndProfiling=a=>(B._OrtEndProfiling=Y.cb)(a); +B._JsepOutput=(a,b,c)=>(B._JsepOutput=Y.db)(a,b,c);B._JsepGetNodeName=a=>(B._JsepGetNodeName=Y.eb)(a); +var Ia=()=>(Ia=Y.fb)(),yd=B._malloc=a=>(yd=B._malloc=Y.gb)(a),X=B._free=a=>(X=B._free=Y.hb)(a),Ka=(a,b,c,d,f,g)=>(Ka=Y.kb)(a,b,c,d,f,g),Sa=()=>(Sa=Y.lb)(),Uc=(a,b,c,d,f)=>(Uc=Y.mb)(a,b,c,d,f),$c=a=>($c=Y.nb)(a),Qa=a=>(Qa=Y.ob)(a),Hd=()=>(Hd=Y.pb)(),cd=(a,b)=>(cd=Y.qb)(a,b),Vc=a=>(Vc=Y.rb)(a),Sc=a=>(Sc=Y.sb)(a),Rc=()=>(Rc=Y.tb)(),dd=B.dynCall_ii=(a,b)=>(dd=B.dynCall_ii=Y.vb)(a,b),ae=a=>(ae=Y.wb)(a),Qd=()=>(Qd=Y.xb)(),$d=a=>($d=Y.yb)(a),be=()=>(be=Y.zb)();B.___start_em_js=1350717;B.___stop_em_js=1350939; +function Ce(){var a=Y;a=Object.assign({},a);var b=d=>f=>d(f)>>>0,c=d=>()=>d()>>>0;a.Ca=b(a.Ca);a.fb=c(a.fb);a.gb=b(a.gb);a.emscripten_main_runtime_thread_id=c(a.emscripten_main_runtime_thread_id);a.sb=b(a.sb);a.tb=c(a.tb);return a}B.stackSave=()=>Rc();B.stackRestore=a=>Vc(a);B.stackAlloc=a=>Sc(a);B.UTF8ToString=K;B.stringToUTF8=nd;B.lengthBytesUTF8=ld;var De;ab=function Ee(){De||Fe();De||(ab=Ee)}; +function Fe(){if(!(0~o~o@2jZ-3$Wj{)TfSg@|=8{cr*6CvpD*#}w^kKPbA# z_6ZdI@(bu2+pM*Od6T^jo*8h^`(iu(E+ zSy54zf0&yC{wJmj;-6{GA&dm+IEF{V%n0P$C6&~NEFBX^9{-+3x&I(Qe-|GAAw2$5VDn#Tr2pK13&sB@jWnG5hfwZEftDfAei91& zEMysyMmoyHrI9|mkrHKbSy^Jyoh){I7R#_=1PLP#@R!6$Sf&#j!1)JotXwVgJDxNF2b5q#`l%J66p3ha;yLMFK=DJlD$~Y0<|( zN+c3i5?0EgK2Gc}<+^bkD;0|vX+Arepk*Jj5;TJekcdUBOcvl4Gw7Ee zBL*jQO~!VRa14jW2LOStO2lj@E}$zaX9GWG#bc1@zyzTmXpKnZ2T6z|V8KXaGB%Ry zg4#qfMj{c3As)DI#ZpcrK^C-KB#Pn0kz&jn3F~Aze@-kDNuYmX394q%d(y1m_={y6 zBbI#pI~E<0iA7>o@{WiNmvUl`lOZKVK28Ri`5`fYROZic5)lOVu}CVFatwpMOQnzo z3yCsl2pZ4>WAdF0Bq@4`rpY+u3_!N3o?i;e0FJ}wLXhH4}m@ELgBJLIl z{S$SQOk^1`BjEzVqyZcwVd&7K#Q{>TkS$_G?@U6Q#L&F}7xO!ggFX?Jg%m{GU;ZMI zbc0M-f3#MHp%ICp)gp-`u#=yk7+M2GDrQSq|H&*95Fq;NUqzz7i8W9NKTawa$^FrP ziIjo*aDM0|R5OqfNjZ$I)DMDYeh(KQlCh$|cNiuJ^`Y|+2a$|lCvguE6kF7(Q-=;L zMu!p0p_bCFVutzmQWir-^aPAC0i;B%fn7w$b7E0tjQ#l1L8612x(q?C|>lT2ZQe)vj;i538j`}^MmI5ON` z$H<`Tm6*ugU_TgChXMAJh0D4zvaVw8dyKgBV>jAMoCtM@AOVO#!b~OY2zv*EE+Nf< zE(?389{o$lANa!DWRRtpiWsv@d^z;Ap^OH_v zCDS1Zu)-V zL{dKyF#!?@nk11!Nfio_^y_L?G>e6H!7_=NcVI=xjKb6ud1j0p3NCsFjTK2aIp^Pj z6ZPXHZcZ-t!_doS6T<-`0+qoOmte$*z9E8OAp}ftXkZ`}Es>+gK^*9gNTh?FhW z2V#jo#s*6f>@lPbRV4;VDj`;1JcpG@0Q-qBDPhWpS%7dcb483O^&K)%eJ+5N>(G7d zFQ5`+B(Ze(!@kPgj3`hRi0V2A`eF7nOdt#)nKvvOi_#)CN-F*gV+7MskFZc#s>_5Ck27R!~di9%^(@X;?L(p1{$nl8212o09iPwW7q{O zIKiQQlF`$S|Ng^5b`dM{lZmPNu;`zp8<7Dc>y7SuMnX=X7;G|p-r=E7zew~KL%*1n zilA(MK^&w9i?syC;=kNd7y>D`6zg7O7lDOT#Qi1`R*1oX$wY(D6&M1JtTHl&3?fW# zZwx{QqU9H)V4lAzZ?ff)6Vv3OztuykN#{jk*h33CZ6GqG5(_tatVq>LYC5*z52 z1O{`#WG#o0`8Q~ih$u*)WFRArVZ<_jjCe3<7AM7k5{Hr)N1CK+hzZ9?mqFN=s8|GH zV*J2_I@lm03z%D&D`XIV&Mjx-!3xvD>)hxN9Ht27lL!+*E`yPJ2lDY3MaVG!87b^o z0L%G_Bz~k&kPIUZRfC?%R$w6`${NfD_XdHoO(2;PXp#+}06}olgn)orHh>QZh$g0j z%uMpc_+!LB4+s$BNg6E)sAHiP#7P54%RG)^0;F97WGjia`SQyz{l1j;k_%|qMCypS z6jP}{Y<>{BOhr};kJJCrkNJmQ_D4S{NlE|lpZY)6v+f4g?_(^QQjshW>o+vx$Id?n zu7ZsYX1P9rtJ|rPUk6baDOQ&?(0R!J3j|UZv_`xZRv<7?9J7vPGO#8P2Md5vgV-^x zMC;jL=nZPYAQ1;O#b$@3+$8ciI>4CjjaVAAtfYwz4B)z8IU<$}3W$NkIAQt{LCd&6 z@CxEMEwR6-365c6F=x0AeqFF^OZ;RqOgBs#tiJwYXfnhgK`E#teh8v4l)?UoWxGM} zOgHFb2et!rlnk&Oc9U=>i=sh>AK4fJW*K7LiH<_Ks1^F%22_uc6k)d`CTlFVKjFO>5eViKf5*ag7y$t2J&?3}<$7Wk9+XACW| znlec+^W8>P5hv*lB|+b?wqP94LYM^qDjtwxvNq>Vurh>$n5EcE6l>H5CfMAi48%b8$ zMHCnqoMbXf+Xqw+ji4Hi8O2J2B{e+bT25!Ni`US$=vqisuzpESCE&9VBWfl~|R7cOm;yzfP z0zc?QdMXa|gNc>~bjAdMh%rsY&A@h+`2`{EkLiW2?pAgi+qrY_c48~ZeuLS;et@Bc z>WE~1oL^UwsH@)~@rP*oXFFLdrnU4NE6e&>C4N@Xw=I}yWPitscfmBH(~LAeARrLK z?%zIOF8WC{0uGkKOX}PiWrfWR*;964GBX(*$4TwzJ;s`0u<>N7{!*-DL)}PugoZW< zQX(q`krsr7Ip7sPHDm%BF*P(ON>mEH;^eIKcN9x(EQVT)Ejp~97Vs!k8If7`h-XXULlaK6$;UE(tMR8zfu~;sa z1Y&pH0X7JlPezmMxy9sE2Ia=E(A6}M7!I;s!$6{c;y{s1CJl~bq&?uoZjYq={A7Mo zV%_}qlCvcaw^%+%$FO-LhcAKx= zZ5@ULDn=lJf*3hYfki_AkFZ<@QvQ^T1P)SgIJG0MlpOIfCsVPlB#w+Y!hlG+$dT%? z>`R1E!L0NnoKd_eE-b9b6ef4$hy=CMp)~d-VsVG=9iSm8DM#7hV{8~+a~x++uqSZ} zlZ#Jb=7r%!1v$iYMhE1gU^JTAbjj!5t_MiTc>;ap$Wb2^!rBunLp$AB9EcqN-jzV` z=&|bG{c(08YJ3`6FFnJarMrqaGWYz+-d800ies>Sl|#C6R*vC;-l3fzVBTWU_Qyzx z{K>L{LC2O8f``Rp0y|^*!rL1nM+TefARMO1!3Ir0A*w-veu2S(!DP?jX1Je;*x(=) z{1{1R4i*Mx8*44;3Cnes1j15aeZ!Q*@fBS{HV8m)XeG|kqzcr)iasJ~I)CT{#Yy86 zY$sufpgma6Sy5*a^&!zGh}C@ARD&Td&BNzezR76=ZC4(US{#QMXa01Jiy$g3Dy7a9vtjCZG`ap)2e6(bJB z1H((1v~dEFvcl$ta)e3|#)K_Q4Vr~2NkpsgG=U<)*wZzz#AfDg5aUlMSRvk|3kVc} zBDYoXR?1U3vIr^RwH;{@44bE29va$AnUP-5HzTM5dsoapPs@mM2-UWe0PQ4Y4oP}t zC3IeBJ1K$iHt-t8mj$!UTL4MCyLuxVnYTg~`mRKPJU9^A$Za^7U0Q@h?UG(T?J~CI zLkjyAv75mj+0&qQE%RV}jrO!iXt)n6G_yT>FXn&A;%g~Q2;<*|`?Zvh*;_=clzy;j zz8<`u)7zM~VjhgVO$;9WBjfj0w*M8=mYdE1Pu_OePHl~$TGfu!M!_YIPkb1TH@f1> zhlR+iGv553uC#IWBHqTdWAi2#s{bC9@nvh{KvKl2c`EfZm4aTRPai!9+6!VS1*<|! zQv2da!VlM9RUd^GMu>~1eB|$@O(M31*j!(S zs0k!kwGc_3pKX($< zjdeT5LXsTPg^CcjrQ1?88##XZs5Md_vCwxJJZ2S9SpKJ?P23%OsnwK>FvTB0`q}H)UUg^ zq7Qrb3&Nxm9N9&PivHF+jGjfw(2=)Yo?>J$1rI&)w5Y9JWP=VQof+8Ll69LnG>JZu z!fw#JqY}{IEBxqW@&Xtu25TS9g6hDA#%ln5eF$&jfTr?pr@9mt+DKzxL=}Q$_mv_fK@;1`3uXX$Jgf!&9wwwD`Y-hsdo9_n zgm=SAm{UH?`^5Dn&f8>K`I|~F)b6PbTzqYQ|9#qDbi0etcf4sQYD8p@k!6eC>C+Rt zV$p}BERB5Xg)&510y7#DkOUI__P4)9j7E_z^-^A5Ops6miU#@0;HcuMILKG2rvOgT9tU~&>cEwdhYdMob7WTpnkOO&9H=Nn z4))Z^VhOb zD&BRHr_T{Cc;_LA$Mp%DxoznasVkz`2w)r_QmLcm)+G}o(&-mG}_fpO?YBq+G9FypWx5P>j!LhH!u zE6)xU2~UfKO$y0Ls6s?zVOBG^JOci;@%QDUCEhI84yN^y7hVEG-(pUN23TTD@!|#@ zgFNY55rIJMzvlozUVp%o`TyDi@&-uWW{}qZlZd_;`lnP%An#cINof$Ef23{D4x%^Y zWjb!^yqg?hokEvLPaquc;)WyupR|58DdZ)r@v;%xM7WT4AOVLYQAix&sK#Mu{8{+> z-t^>m{+jY})zlXQSy|PSJ4&`gQEqrqk*Sy8Z{p~tyi0p|a=icS z{3lY6u>0#m$t1%2daon=1u{O%p(*l}1dv3u*o1o~uRl!@EZK|;SRq9i5wU$xG&C~U z4IV;Kypi_Jdn5!TP;VmJ*m?MRi@%=H$JL9*mueofg3C5H4O&6koT3KPdG6qYLQ{F2%@;Zg^b9kraN|){<&SQF6CN zdV@s23m)I&ln?kDka9X^Z;@Lb>F zrj1@g%lya}2d_DDhu7wc7RJ0=v?Rv=U2=EQh9*!^c1&kC-b|2}Ys6ugX?-|-!fK;t zbV$tN8c-_7=LFQQU?QNCEF+gdbnyQE{@4V=!T|voJrol7rVGXhNhDtc_+cq0 z4);m8DU@^|*M;c0*J03b1&8fVpbRz;L{tw)B2sY&1A_}FM$F9jp<~^KzNLOpdRe$W!D`6QZL1(Vx1-0wDL7At6L^ z9R58@gYgvOyHVU-(`zH5M@V6Q<06v^L@Xzl)4*Xi_>+4{ay5y7sX>3Z_9DH3Zj-4= zjWPW!j@(DmdoWPN;-aR{JL6)qgShC<=OKk(1h|3qBb9a_rTuZIMIEkDp)I)N#6=d- z4eIcv7P-gtN)&W5<8X}zoYWte=(xJZWjt~IxUUmQV#%fl*`*?kI6jC(11J>{x$Y!| z-Ix%VP=N$RGWs00m_lZsHVPykNM|O6peICA=**xui{x?<{K*#p;0>-I(G(KcEB}FJQz_ZiljaFAlEQlzx)!yQb-O0{ID0v~h42#I zeEKrd1eg(AD3^#FHS?g!G)w6(K=+3xcC}U4%|Ed2_z@ zY@_(lzJ!PK|7W<3C*)67e_s>+UpUg--aSw>foMe0!rDV zO%m-}*rp1?F#1>{A-ohInD#>~vD-yvCIRzZQ{V zujAh|6Fw@wJ$gO22l8_88G$#ly#|sk;Tz?sxoL;=RpLtsM4$XANQmCxE$rh>w@Jdz z*)vSP+ADAQ|Jzfj2peu++ux|0Fz~hJHNe-jHyhxs^X+23BJFA;xL=k3TWs1&wH-K_uB(t}PjJ&NbQL-xFn?_o^vVQ#WPys4iZ{{z>HAKDZUNd; zgmjx#!iT~V{3RPXU?X;SMT#D_$#xd|q_>KCUa4UFg0F!7{d2~Q@H#?BAlUJ8Z$Ils1_zaR0y;9FNAg+K2C05Rc-Zx_j5 zz4((qg^`jEJ%pVePK4xAKM>nxvhl@Ieo7oj_ZV^sjwga6M-Tk%BPVyuaZ*Hz zMELR#A24!Yi}NZz#6?7TK`^AV z4-7=z$#-O&xGO!MizV0~lHDZMKYAb}A5@6sw0HRHJM8o-h|nkRDh2jnK+hB8c)BPb(!b232^LQ3${WK#$N#1umUH7rFRvkPlN*PX1sv#61+_z zSm9eYQsOl%WkI4gQ$@8Ss5AZhI4Bn#0rG|kf2KfY8RUR-Dq=bc@H6~+abh{w%1 z(E(v=LiB``k=n>R9Is40M1bU59dAzrHuNkGEcv1rM?DmmkxO-aTP*fx|AXCML4ML` ze7qXh*jV&~Ug3^UV@7_=DbtuyUva85Cg&?ooyLrb;52DWYb2*lW6Bhq4tbQ^pfqNp zhD%6et|&Qu8nge8oFR=lqTmwKnAv?fV;ZxfAD5KI6hv{RG-i4vXHH{IMsb!jruGZY zn#LTD;F8mr$A92#Y0Ug+&Ys5XP;tCFjk(*GbEGj3qB&<8Gb^5Rr7;`hxYRUea}4)U z8nZW?OG{^(f6t|-GxPtz{cAcixj*-(bSC#J?%Q-G?TB-r>CDTox&KIKp1Hr~{u4kl z_h0GEdMo$e>C6cW_dm#L;r@}%jQxuHF`XIl6_)|bSKLqOO!imY&*@CoSKJUVa>+y| zvsnL{5=_51R=%%-ZGEreqiVLA&Ce{=kJGOi^!V$0>eK`Ar{XWi-;G}wdvoB1f%#(M zv%VCbZsGB3@ro}BWup-ueqJa$j8KnIitxC9q3j64!lR zfG-cr?wr-x8*bRo+mG5Ohn0kpu-;y0pA=RUHigC$!^*>61-}S>9{eo$&F9nLC&7<{ z9|gbpd>H&7_aaVCvUL`$GdXn@o>0Z+9 zq#H?BlP)D)NIIKzD(QIAk)(r3`-;XV`MIk@t3x*?H72b}T9LFUX@1h2q*+NblB$xX zB$XwVBo!qUB#lct6HNS!&>5lA;Kz1cWn5`oVO(llWE|Zww`2QoIGFeY)K3o}ej4@d z)6eC5f=S2=%?*9-_9Utdm4*sKsiDL$$xvu0FuV$S8Pq;J(LdE6?S8cTA^7`pufMLp zqHopj?!LSG-5}zN^)20Z!Z!pr1Yb{R2)-NC(tSh1%HX=-+TisG%Y&B%FAbiQusC>8 z@WSA0gVuFl+ugmUd()t6L05yW1ic+!4!RW78uWI2G3Y|j`JlJsb3tc=&IFwf`e)C= zfYG{qU7jviH!`EMBpeLdq~4%zQa7p(B7HDuT)+zTa`iIxQuWw?0`&y-c=b5-n1CCq>#A$2 ztE$lf+f-Xs&8jV`aRFlk#srKG@IDU&O;uH@rl=}Z`-7e-pDLdyA1m8v`@vVpe;|ma z-LxWZucE|0CYl+(#wy}nZB^{aveUl7|6MEu2W7rSK#6Q4!>%YpSl_3j`< zK_|MM=(aLQ@JG8{A9!ux-fla)ZS8inoABJ!ZBw_6@EhQp;2YuB!>@y13%>?_HT)|0 zdiV=5=VQ*ryz+1JFa4WhUiy1|Ww*+12i_&#z3<(9?^eg`eRt2hyWede7spJD86Pty zCNHL=cdHsnmm>5x+) z1iMq-1`(KGb|T&-zYucKlYfVNyZmIxiIC$VM?(&W91J-SvOk32+R_Bt?nbmjej?-~ z&A2aQU&wCwnf-T#Yz!fx34R^?>W~H+E=668x)60f>RiR)nifW2l7qvR7K59kO(x^pI&pHTxYRJ@(+Z_a78d4gP+izq)_p8X4kU0H z7lzk_&j_yypAw!IK0N$Y-{*aw^nKX(Uf(l)_x0V>cV*v&eVg8IdVdN0Ecgoe!uKc8 zkl$xypR1pq_;lx|J3ih1si0vSKYjSg{ZGz+vi}qJrcdU6Qu9f{C;6WY|Kxe^E4?4T z_xQbYy-)W(*84#3&AsovckjLW-i7b3=v~u$cJEoex4tv8_l({*-n;SM^xo5YSM{FS zyR!F`-sQc^dYAT|+`FXrhL6{OyyoN8A8*fMo3q%>S?q=^c3l>`B8#oaVoS5w(OK+s z_igu8_ht75_jCDkx%+_o?66bAjttv8tZ~@dVYS1S4XYehF|2IZ#9`xyjT$yF?0M$> z%sZJkG8=*}W$t_TNUy`aNI02!Fta6dQ|9W-Ea#FTtB0-{+Ay?!=>9&thO`X1``c=E zmw$`@o{SZKJ2JLsY|Gf1u_a@1#>$UsKbroRg&7Nwnx8Q*V{XQrj2d^w?2PJ+nHe)O zre`esXxT?q8B;SVGp1xzWRz#rel+DTC!KZQ)_%L<+g&|(^;`fy7k&l(z4TDee>d*XWu;e=Fv9~zM0x{YR^00-1_Eu7vise z<9^nK_$fW7^gRE~rcQ!?(uMfP)IaJ%{6p$Db`t!CPJ(~Xh4`|bWj*h8A-=R{X-~oW z-t9vC9qOAp34TYQ*KZH>`t|Nk>#4uph4^)y1i!YE;Ma5#{OV4EZ|EfWTV04R?pfS( z5`0n5i8K`SoY0em@jb`VP}gZir}kk?&-|XtJ1y(fKDY^TX(z$w_RQ^hwF~iAsK4BW z_$8eLza@2JYE$a^)U~OjdXDOOsSEKrJ#%`__j}vdq_%b;eqkrU5AQj=XLirB)XAyE zsYR*HfnGn~-Dy7c^EwHBZYRON{P5+6&r+VGJW6?xaxdjh%B_^_p4U^Zrd&>GO}UVA zF6B&0SxQMtamu2U(v(RlMJa_T6H_Lnj7=GnGCCzcB`+mAB`alRU~bCv4@ad;`!FYE zWXgz?7hga9`pMTzzAhe|I%e>M4;Hao^sC+aqeF6rZT$IM#wb^o>y>k1=G@Hrne#H| zWY%QP&YYE5ojEgeM&`84s?5sFDVY_S^{)A@S*~i=bLSK1E$1cY3Fjf_0p~vFUgyz_ zBN^qr4rk2lenoyT<3Ps#jO_Fm-|lg4cdl_Rb53{O9CAf|c}RJ$Ry=2Pzc}Q=kaI)M z4so9ta&pKHb9Zr4by6d{;y5KtRI_KKyIx}R0>-3OQ zL)Mztx`!?|&oxgomzc+yH>PYzX-XMxzGXU?ejt5+dQsQZlj((-yHj?hw504z*^#m; zeS1p2xRu+Nz9)Tm`mXfU3Ca~2jVUKg4W`PWQ-)RyEgxDov~=jyp(UBcnJwu%(|4qA zPfslwT0C@iuek`5hhBqp7Ma!zoo3pWzBRo$J=J|{NV#cJ*GXNA;8zZvo;hb|&CuCH zXAM0+q6_DwhE5tfF|*7y##PPo*@4%LJf5o)mnEk1`+^rF&PoJ$Ht`Sz zcO-5iV2&}{NT`nzuM=>J{#in6LMwMXVNb&5gmnoE6UHW-9<+4OZ10+~LU$_YmUf?Zowl0I6HgU`!!&IP06sM}OVY}#cd0!>V6}3cWi^WK6Yhni{I*?{McjS=K~)MB&2%Bw$Sv< zf!8^A*}(A>IQ2!IxW#Y8z{g*rmeRfjeN*{SeV_mF&L11Z3xgWO3lQcb%tNR_n1N7* zFcqN^VG2SyLJ2}K!X$(ughGUg2n7f`-fa+Xd-oXl9Rt5(;CD>yo`Gx zgeeH+2qg%`2$K+s5DF0{A`}D_`4!0;znJ?4c@}@MAecO}zqs}}d7k@xCw*@Gd?9_# z{CpgJj`;jWe@gG)(!U;!sCT2HdNiOO4X8)u^=L#rT3C(P*UG@u?Wtw+!6(U5vH zq#g~aM?>n-ka{$v9zCl^&x-t}g{+L46-AyCqMr1-&Q*q7=cXW3AXEV^!*eo13Bp8# zf)Mw0ZY&a`5MI20oqLY(4B;NaZG@W$*AcEETtR4vxXvv=C`A~J@G$&3cLU)(!f}K> z2x}1*Ae14DM7Y!UI(G_T8$unz9E2K#S$#3m?h?NpU$%1m$}jn8U-DzVr)vGIK=cW>KLiE3>3St@!cKTSE_tFAP00bpO!xl0wn8 zp{w3=*NW?g&L5iFt6|8BA5x0WtrgE4QZ}SOI$_9*pYQ%$6Hq9+^792? zkN&*t=TrWp-hcARtxrb2Unm;>e)jvd;;i>yy?3bBhRnLm<(bEN6^fQ+9_>{to|-u+ zvp{@q*sft4hZUi^>S5>nYsI%ScVVCLALIb z>QBl(*~}G+#(#1inMZzdzIU^<{Ii_Tp7y!jr%=?|rxE?w*QdG94E978yEBX3l*KLr z?`2tR1A0C+i!I7x7qa|^&s_bYV$lKZUtn0t?VvwO=sBYt^2?8dOGXyKJ!^T6m* zuM6&8bLG{)l>IXPmox7bicY_G>b+X=$@h-DS0jJ)%Z*%_m!?%ML#iob3B zmsx+U_$%18e7_Ow>c5}yeJQx{FaC7tyHx(}pDz9B)Smz@`?luWRDSBWMc?Lq3-HXh z2LZNxyXo82?r-@~-(@53^Kb8bd-Yp>;dciB%=oVSyNTbe>NNSAJL#?IXVZ_S?@iy5 ze(vjIU+??6Jw({-x`MYepccdhqkXsr-|{4+h^J z3~=J$0)XQN=MT;s%vTSd3ZP{0q`^gl`2&M@4Ni6Qn+C5M+%TBW9Xtx8;e(%j_2?@U zTc5HnC6#YTS(36ar3G?1(-Fu!uG_9#uA8nKuIsL=t}Cv~u1hYy)pgND)}wu{y{=S# zk88JUmy18_It1XL>ws&&i$CEy4&a#UsOyM}KkGUJ;I!+M>!hnCW2ZZ#Ib(UoqKsJ? zTU~oPHoN%Bz!E=xlZ)Tz;#avET&rE{UF*oQx4<tEPxN2NyIxciA>9NvP=c;wB za4mN&buDo%b}e$1yZD)|8LsKBX|5{QtR7QcD>_%Yrno9xrLM`Y5?8TnlB>3Jk*m;E zKsZitjd!8{t-l%P8tWSE%6H|ta$V0Qf(LzKmx3=k3vySkC8oYJ8wEk=~rRff@XET=)B-O z?>y%`>pbH;?L6f~;cL#TPIoGQ#d+D;>b&lJ8rJkLH=Iwx*7w-Zqp3$@kK@i;VaJ@Q zbsd}ik0M#(cf@(vnVKh_-SwbzX6LhERnDo-O6L?OKifIWnaWo?XF6v%XS>S9bGnv` zFNT$Mp5v@>mWyZoOV0PFJKg>c70z|;k`;I67daOq{{rWH=RBvooGk7Q&U#>0I_sRZ zq+u(Z%Km1{Dj&}0-&O9fd>l{Tg z<%xazp#xa_#(nAWkXW2@V7 z(Q(1S?{@4$i5ACB#|{U7z_A~|KF40i9>Q(AV;jJ&j%LRe$7aVS$3{m^j|~pK$%ba8pmqKDo2B(-qG|gV*=|OD;=kTmW9bIb)W$5G>$O)8$|r~;VRd8(t*fo)&8gGXFJ<0*(I zIf_7D99HO<=-|s7r2r;7N*u)wevD%@rQ|#E9DIRe0)X+3agMQ$9LGqZNG23W4mTMX**)uZ)>qN+Sb_`Y%6TD zZPRS!wqn~T+whkb(M9gb(VFCwKREra!&Fy z>m6%>^@wG+Wuv9Rvd}WmGTTyZ$+EmKS6QZ5HYGJBtxl>QTx>nsmU5jpuu1;5@TdbR= z8>^eDy`g%4QC%lKFE_v5d}Ux+^uzcqeI{EYZD z@mcZrDVj-41gHa0JIWbBK9j|L7m-Wzyh z;Jkr%zpVfA#elm5S_d2-uzSF!0rdkG4wx~ZWWbmKuVO|fU5wcivms_#%;K1umG|WmFSDnccX7bUynW)eLDI? zba|3{a?+%viAm#=c0_NEUK?E!JwCcHx*&Q|^jXCn#T7+%^bqW07%w;=IJU zi8YC%4f%#qNyER){_@p;mjm`HrWnc%W%}%-9g1y=X2oVjk-bncNl~Dv?Z2}BqW*LG z*Yuy&zq)@_{|Wsk#BPdx8TBmcanzlt%TcZT*{IX*s1s4gqQ;mGFv>k>C4j*8tDeOtdI=5XxR*zvL1u}=ry z8Mrm7Df)TTWc`uon+ebK_x0OiHb-rUS|7D0sv)X2YH`%EsQFQa#)-z`{nnc5OiN7j zV#oK(@0ZulJ=sufC^Aemyo`Pt{V4igbZhka=-bgZqOV4ui9Q*R#xc>rUxT>Q3m^>(=Sk>dJJJb)~uz-A?r?^$zt|4E?tN7}~nTazJrzf5>XIs{p3XBtsBV#7TPPa_6Y_K=kixkC*iHf@Z_5E+@ zPwHpKG)HcUbZ?H_6qyr0B7S&$cKpcrqj87hj>JuiEss4EJIb769%&w7&NeSF&o|FA z&oOT^Z#6fYH=A2+7i|}8=WJVT&9*JJ&9+6hg|-E@`L+qR@wRccv9`en-Y&i z9gaE_buj9-{g(Zv{erzI@~rKQ?X>NbZIf-IZG)}JHqSQKHpfu8wSsTp!yUQyX*D9d#vYW#szkll}H74k-334k->Q z4lBmmbCR}3H=DMYHk&q?&X`V{PMJ=cN+Js)%Oa;l7DbMW937b-xmvMG(V(bTJk~wZ zJ=7i19o8MvHR$SfD|Hif6LbZ-@w#%&WKEf-R8yiU)@)U;R5z;+DEBJ&EB7h)D0eGI zDRY#+8?M|LzaxHo{I>WT36CS@nr543nyO4wOr@q`Q=w^sX{;&VG|Du>lx2F6^t9;q z-#&EDi9OM8UG%Gg4UzScMX@FNO`&FjX1u0Zxl6fS z*`nO3+@{>B93MG9a$e-Uh*J?|F{Lq+V@hInx+4l>Cd7=5$&YywwLYRgVtK@|*!eMQ zV=H5~L{E+_jJ>IUJn%*0t$`b3mdDJFU8-2FSg2U6n6H?ts8P&P%v4NQR4Fchk*ApR z#m+BAeR28o?Vs0tKJxQ3{VO{ziC7phH)3|g%!p|bl@a9;B@smt1rg&S@*;8~hDW># ze;QsHo*(WW5uO$PqVLnbkNV#4d$#ZXzMK2j_g&O?Zr?M1nEd-gpN;P`uFvQ`kHYVU z-wMALem4Ac_=)h#;TOZt{-N~uhd-OpXKbG_eOkgB!w-gU3qKsbIs9n&>hS&HE5jFs z&k3IvJ~Mn-IRA`)%9C~f3ICWs%;m5bu~OgVtHbW_GsALN_dT+YxXs@}o}2s){yNV$ z^6LStoU{9c|v z#vcW6gg?w5;`!73DF7$=6Z~a()@VlvaD#eh9RK_5=3)l(yGCk6#clm(upwcZ0Ue-eTWr zcat`4wQsjC2-s#P{cN^x0dcc^lYJvCxXwPCujn|77F=sz1KMhPgT0>8YV8Zq&-s+L z!oD1|W%i}^C6uXTL`)g>)UTAH*ZDK9WLa8%&vr2M43q*un5#uvsM zcDyx*eQwTSD=azehNK*JJwgM*a)c~|e7jI8hrMeX9hM*F&Vv%(w%xMbv|YF5uvcwY zY?p19kUC*IZaZc>iqv7-A=^RQ0i^cX_SkmYb|JOXw!^mFwhgKEwozd@VI#q1t!<5M zwQUt}^|qC^I$JGL%WcbSOKpphs(LiR%xq1s?1jEwoSH`AUVlaXq#v& zu#w>yVau^Ki$>bWa16I)+fw-~+pFXk$%OVK`B`$a=xH*cJx+dT9XB}yO4Yy)N{#alig=1`9$(5kWbR0$CHnNcqI97 z@*zswmwW)U{hp$GllOqSE4d|kC#7yp-VW+E54AaY3#gltHzseO)OE>?psx2&*Cek7 zbyadhay_N4NUn2(T~D#(EC4vy^t)dJ43Y))Us_ zly=y96tp9hcF1}Vv;)@t)_s(=({0@aVhbhiuxM5vHQdN?T-I0@`9qTWFmR+C1xA>l{j(VXd|<2$)G})2-92 zII&k*r&=p1vD8`tVmT#Fww9n^v2~KQh|&&O#=u4#wh+l2v>dR&+FJHn_E?D2c3O5> z76i0V+78Qh(6(8cEn6t9(Xzo((Xolr)?3zsw#KsBvWn8`EcI>>S5jiFWjTn;EK4m* zFn8x8)F8~Vc<1X33z@HEx>f@J5_9~F`Ly|z`6N=u%}32g%!iTMZ{BC#Yu=4ii+QJc zhj}|v8_gTcP3A_V)|uCsSDRNMRcEd>uP`q&yK~qj=Edek=7m7cHqSCwn`a_5-CSj! zYOX}8!dz}HGnXP&Y@TE;G8ZCMV4h$eZyt-(6VqeUBhy1u4tw8p&ve&x2dSH;8>Z`~ zYe-!&T{c}ZwIX%Fbl!B%bQY;&rlY1Kro%`bG#xPQcboPhxyQ8Iw9C|j)DF{j(>Bvq zq?!=cBdj*9GS!<_BDKP_+_cQJ6sd)#1*Z9?c}Ufmc7$#Z-4+T1W7-88!0 zn?g4tRcYD~+7#M|RGBYdi7#If^0|eK1-^{qz;rZ1F2YEJY=oCEoX-#*BRoi27rHid z4OreyS{2$5T94GNq?Ms{p|wa|Pg)VWJaidSSA6+eefiG&@}2SKbF(LtmWD0~U5p~f zk`{$73|)ZK;iUPY^Frq$bs(uGbav=0r1tvq?egW@;mfzxmv0Lixe#F&k0vc9s6w2rV2x8_<$S#zwT zt@+kG>p1IJ>lo`LbF2BH`KtMf`Lg+@`MUX<`HtIs+kDG>-+a$}*Zj!*(EPys%>2~+ z#5~H9V;O15x8zxJE#oX>ETb(2mI;>emLf}`Wum3TQf!%IDYukaN-bNB&BiUp9meg( zZN^>37UNFiUgI9)ZsP&te&aslVdEj=LE|ywQR5NgN#hCQapM`|Y2zv5dE+_bS!1iw zebIQqc*S_xc*%Ifc-?r_c-wf(c++^#c-MHx_|W*kc;EQM_}KW!_}uu+_|(WhwLQUl z^w{>u_Rz+^vb_ZG!uH(u%*KzjkHA_z+@5XEvh#WNTmUbFN7-}i{3hc@+}>?4HW?d@ z{CeX$0H=c28rK-hLQCDD4Oq38lVoTeQcDmP8Y_(D#xi4d*vv4#)HoUWi$Y6`#YTRb zv5Epyjg>}zym1_WvBojR(I}K}%rd@89D&rvL`)ong$Q#HW+Mzo$VND4$YIYSoIyB^ zaLSEny@Ah79EJPFoWzldBNF+siDLkaPRvitOXMde766!#I6iS)B43hN3}8}XQDR{t zUy)c2pe(U8adIL*EwKu~)WpifDT(|gL#rW`zi7B%IB(#u8?FJkYPe#!Y~b%0ZUeYw zxM{dy;2#zu&MAz+S^1!)^nA#BdnEA;Uq#0Rw;1a00+_!!g5A z13$}94Pd5WhGDvapXWBr1vJM{W0-B=7aJA{)iV&EGL^#E2H z>I}68ew|@0fHj8IhEID|0>cl9~!HH6Cu7ZEP#`Sbd7`c(d`{*3;#evYh0c8tcy zX*@~K=jn6x=>I5vj(((`AFm&a%wzPU_4#_fNM8tGqP{>sf#yCz<5vm%y@b07sr;RU z+X=T4_{Ry406a{1kZ?bNf0^(C!1IKs2~QG8W!Dn;(+Q`5I+<`H;aCEHA>llLa|ve? z&Lr?x6RrTboN&pVa4~_OrmsS6Q}vbl3OzqdUkzZUeujR!o}Z_m3t*1EMn7B6FV-&t zuu#81KVQ$U&@TtDOutmWM9(+q>jA9P*Xe8Z{CfR50BiMY^sDszCjCYL8}v>3Mm@h> zzYV}veY1YEp5LwC1;E{+->KiB=MU)j1KOwGtKXyNkLr&AIIKUUKd9fHuq|P0LUY2F zgiQ%M6Luu*P1v2VE1@NUKa_9~T{w`iKVe@2R*Qst@5MMN? za1bOps9?|pAjS>i#||0;ME;<>LAgM=&T#9rMV-7X+@>i8YH?LchP zZPhgcv02A&(rpA{gRV)}2t=)pU!hyB!;Qr<-BR5WU>524g}MdEGG8}WHwTE>I)0X} z8i<*?8M^5}RO$Gsx=J9X=qhyOK#bAx*R|KQm|fZ{+RIx0uJ#Uq+uEDj8(RL6_91`= z+WXpj+WLf*33Umz38Ve<{Z}L`Pgs_KUCcA>Q!VPR@BT#ln0yS7rF(?}FSReU&$aw0 zT@ET5sT;1#Mn$b!eyg?_)GgZ0+D%%%MY|Kg4()dBHZ8wjyBEM7?QZQZ?f8Uo31bpQ z(~9yF@)B}MMTfPAkfE;oLG1xj&k5~ufXB2)wMVqP`>gg1pwrq@+LKxgnwGED&IDqH zcDlAo%g@!$0Z^lzt(~Ri7ikv)SfHJ+ou^$js9{k3pp}D2kLm{14q7n?oR?{rBEyRA zOSFqgMJu&+0Bf}?w9B>p8trNTtF#T;del>?4&JH>==oG1FoOUcSEbBf-JDOBfsGSI~Ks!M@Udxwi zCj%(fPSO^kqB|OXm!<_3?bPhhY}fGnHTwYU)$Gyi*6>F(huweSS2Euu{W*KrE4O*&M zLcn^>N`Q5mTFnX#zfrRRK$E6XvmOB`e@A^A zz%BJn^$m5lCQI{5{ZcJ-=!N>Z8jK&RA0Wfgp!@2(1bpUJKLz|m{aF1-&5zRLprVnQ z5t`ws=&YJQp*{}kG4)aP5p^SXNX_q6?*U@BdY8Hdh|Ow#y?PxGYt?JitAVIh^OMyj zKoqMdsf*P76mh^+@#yH9uB82Eb@_zB&&aZ>spcsy!&TTeVB&Zc*`vR0jbaQ0-Uk zQ}M@D#{e8v9Z?-t@uyX%0IcYKQguSbUr?O~a87krbwYE>&#%T@ep)hYnXx;LomReYmry&KRv)mqgW z6~9@v3BX3x22~SSR-r?xY#_2!uaqy9e6DH~fE?9G)d&?oRy78|XjQ%{PsJCgCIDE} zeY|R%iZ5180#KwXR83Uz<*G6OrK-uQ5^#L3iB&FM-smyr{gOLg7b+J3n6I3toU7!QDVG9RqFk(8q~zp3zZXrC{T`9jsxOe zJbx$tc0BYx{$~7*_(twpJbyL*3J{m#TjMVRaX$Y45Ov={ZKc_w=!?@cJw4rRU*oxt zrh9Ikx@CDxln}-kXd5toRj&%q@%%Zfs_UF11d>2P0wj?{+9KziF*)ZPOwKvyoO8}O zy(RTI_m*l&`mOctZ-3g_Y;A2x8(8_cjESX>iy!APG5Zl_K2BqTnEE*RapI%o#jEop zG=FTuT;s=vkM$p+<6}Fb?PKf57M!B?BUF4W$3)r3(vKw{q2^;X;_Jt%kCj+0`Up86 zvoVqNG4o^EM=1PQfXM%t_c0f%DIej>$5>3ne2o4W^%0UkCLt0(CVY%1upIUg0zUd< z#_yx=N1u-n`Y{9%{4wZbAXXm@;M(BI0M~hg3xjh5crds}+!@>&+!)|vH-LSEJxuHx z>=z;>h68-~g-Z2C!f-kBK>hS%Vn^STk5ftQagAEE+)Er`S*U{KtHX{uK2I zl0GHk%Xz}5_)lLxWq!)|l>RC0)8W&Dr>UP(J|%yGyid7U&iR!6DeDuId@4p1eJcEv z{|V|p)gfv>)qJY{1jmL)_)>mocwo412p5Luh%>`e!xO`M!#l%U!y7|Mm)C|@hL?um z`bjLAf7G8I4Id1_>ysyT=4%dKaQxxu1MYtwemMBB_u>ARwGXQwaFZNj5R6j?83Y;x7p+TIU6AG$xl=!X%+@Q0xf16XaxX!%h4q2@!iq>GXd#aJx*Q1~JL15|#f zK$L$d`%wBpvYMx1+Z2qb4|~7t{zB~hg1gU1?+@-D7JqTWfS%9Y_+FyxbLZ!d&oK0P z5Haw%|8w7G82>zm82vo*dH6HTex5;0f1dh0`5BfzFCrE`&wrl#3>%-<5o@1UKd*d- z-OoFS?ay1EH$TJi=Oe`7=Y!AtpW)*3`De-dkI$!{Pd>xl=UXh@e7^pC^;t5`TYXQN z3w_DG6aC7kaoG$gQ=u74eWBQ|*7||crAHu}gFOq=`{Q@!i(U^|XkJOLQheZ7ZM7;hN z{WyI{*H1;H=qKwZ=|hfwHX=(uQ$Ir=F7+<-aQkzvccyo$2lsk+s9U`oy=y&i(|5&o zV*N+G2R-o7_eOZ>d+K}WL!f>D!e8G{-&Y^P^}`UM`XTzk(k0aUOTxE1(j_#nH>WqN zH=}p=r`tabe>bf+r3Wi|%Q%B2y+yqRJ=oOSK&xZarFC?J{igrCtT1T(3;8R1duMybzvx9(wM25U3Y`@YD0v^U;Ga zy--AmUa($}9z^R!AtLo6^uqNZUhfMcPA^t3hR}mly%bcEUZP%tUXgyGet~|zex81r zez|_Beu;iDu7-E`%}L!0U0h<%&vnmq;a2wsvGM#`_e$4O=2#c@baybZ`g~h=OBarG z4-sq64|Mmjx~>aLx{H`te!iePuM2CstB957E4s^Aogs8#Om`GBi_b@Nhjn3EcM7re zd{TED%LBU5t=ol(_2-?s9lFr3+lSbA-mBY#)mB|-(5=VB>hn6?T3u+-ZAPp;Z_;hV zYLzaO>Xu+)`FXK!kuFr~Rv=cMm+O{cHD4F9bTf5n1kN}^H(eL@jO8{9;=bM5TYB5iPh&px`Db7p&O1^dmg46idA1-@X&R~ z#PV}DT~}T3(e*~GJonP|#OlL)xPE{2Uh;r1-k-lG;Qsv`YU%my`>D;rCPTC*NoM0t4^+G1d3J_kGX% z+V?f@tKWZ>v}}Cegz1L&_3!K6d&-nx6u!@WpYuK&@1?!>BxF+XP7+1}MmRVv4*jXvG8v8-ORh`cbo4wa9F;-^t|hP*Z&Sj zGXH)KM^gC9?E4wXz?R=HA&J6Y7T+(thtYQJD7YofvEar{N32Qws)=X zTHd++Qu(gp-O*x>7&-ed5?%!koedc?~SDa%0J^J4Vf8G80@aMSidVY=j zt_!0BqYbAi#VE!o#K_0U#mL4WGVv-MBNZbVBN4;Ct)4`n@ogJNR9XQcBMjYuJ z>Ky36rOpN7T<1*ZR0r;KZV@*+*E&}^;QFihR~kI(Jm}o(c*<<*z_88`RtI$kbozB* zLT4N?rZcKDq64!!Gl*%ODMDvb2bOh~P>VYAI&(N-uMQOI6ksA>Cr>9=2g-Cx5hXgs zIz>8Aqf?Fes#B#?sRNBV4TyT3I-Ob_XxC{&wCc3zH0wZ*PB)@Ur&Ff`d(6^-03Cl! z`0DuRc3C{%<_xK5Z3#Or)P#OcK9#OOeZPBJ1%Cs8Ls2Qqas z5a~K;I;q&Drw$xw?`z{nY}z~8+uCrdeS$dFKGHtah6n9?#GUr7_Kh}p=(yu_ZaQL} zM{Qgx+AyR&h}8k@e(hduAjY-FP@~!-+QZtgq`in((4Nq2_@m zTxwn*&Na_8Pc`9Q^A2&Vd82uy32tv)ah&3}kD3pf;PciS;q}(@t@~RDd>er9f9v0(NpB(NZ8jq7 zZRXo_9Q%wW9*ThfOG$BJX9TRDqshTO8kgS=ANYISe{Gtirnqi1g%@ECCO^DHqMnq{w zYDVC6ei&YwguAAjrmLn{6JJk8-`u~!nYI`(_4t@MQYUl!Qxf7Lf~Y=HJXo zxc+7hx%y`1&9a0$Z?>h4x87_@c<^Rl%Dp$c5}v#{mh$M$p@frfu8|XO#@~z)Z?>Ln zJ{gc+_ermNq}N?<@Er|C14bQ2%^N6wQ-o6$zA1Q<{{|}Flq1UCl)fp!YW5pQeUprd zq&JCg65c@8n@mK;oAftnSdGJo#)!ZOedF^7e09Tn{un-Q@bfpg*SOQb^+)4I<5~mU z-ninV;x~^P4;tY8#tY&3#^a6qn+uI|jWZ2=-Pc&xSkqY5SkYK~vhZYCV@YFC<4EIB z<3M9yn%UFX)!4yya~h)>BO1dRL(=S^#(+k@#*D_a#+1gSG&7+wt}&)T_&)b}-m3xa z8f`d+R*e>oW)0}k=tgvDbZT^H)M?ae)L?h@8kHIq8s!?2_9f^-j9iQ?jC70?j6{qt z8g9?m-@cYicJ+E$eo_AP z_1Wtc`BnKl*<0D8*YolV@^kXD@-y;#uYEU?bp-tQ}UDY8?Pti$K_XEU&~&~ zUdWEfkI7%jp2?od&c7a#AC{N29FYHgiUIkfr@`O--&Vi(7yR9XJTWdm@Otodzr19| zJviIm*OCc4UU$Bhbk+R26+3HrEg4E34yEC>WX4}#=l^T9G*|Yz;&r)nilW!WuY2Vs zv&ea!_c~WPb^7bf*BR1k3f3h3CgMZrk^k~K?zQ)8uh*WhasSWt_4t#qClBh9>s#sd zmGt^t{p$}^KOCvUj`}wKd~V?{Tk4zYu%W(=SW{nBUr~oc^#jDd`kwl(wDF=kOsP*| zYC?TneM}wZ)#nhi>ND!o()zGE^s4t@s!P37y+a*_)CURFfO@}rpR_@%I@GJzVX9WW zM!i}cTGX2nP3n#64eIUk73$@ZA9)464t$L-ldt_>`@M$n*I|gz*CDTiUqj66XhhWO z$k!3Cp-jCLr!7%0RxeV|SI<+=Rp0va=AT=hG(TyQPgk#%Pg93=wKYNwH@&i}YAb56 zt+s_&k=<0=P=kH7J;b8yuG)?ooTwcmj?@m-4%Fa6?HsWtd!}}(2DfTAh;`X(wM#V+ zQy&ozYWHe)YT!xrpyKNc)s5;({qGqU$uFwq%P*)wJmm`ozv3esML|5{8cH?gE9JjuoGu?lNs*7FL{P#hp_C8`JgPpZ;-*gao>0A01$VL=8TWx?UCClH zc$2*lOR}D14>AOh{Skg-U$PGwLde00G1(w;AQ>Xa;fQhBFmfmvV#zUxXmS)ek_?ID z1VlXf3ptJqspJ&Ih-@-Bi42+K48*8xIysFDx#S!Ku_~KQ<q*xe!%A&L`)Qp^RLL z7?Uj_7n7liT!|Q$tss|^p^jXOs3BLAzmlPu+=OT(H<0Ve&_QlTw2@oMEoA5=_aM5- zUF1$O43Y;B8?yc6J~E7vM-e0BVe$|erpZ$TYLYxb9w);Bc^)xGo+ZzaVU@gsSSBx# z7s;?i-b8GW*U4*S*eCBHcF8;BZ8DsYj}b@YL-GL`F39JIP1!T@DH(3bH;8NU75S13 zV#*`pfqYNCBZDW!1D_ywiW|k10)!vM7v)3org%{xm=c5tqy$j>DKM)#BYlphRi{*8 zNp%4+Dm$+_rwVJTtB6I}71d=`*jC*_Y^rXkuB*bn>KPp5aY6kst2lY zp?Z!uQ$1BZQH5L88^pEhl`3(m`rj)_ocy?IwEURrsOpI7udl`VoPOHWnBdhRQ3^rvU@7KDsZZDf*6uLRykCGE0s&ch03|gnF>6p+#~K(ZdI;T zz+Kf1AGWKiSoKi_d{uoAgtw}fs)s5Bss^AoWc^kBR3S_?6cM5ttQw>W(W+61NYx0{ za8*c9jYoV@ja7|Ng;doPM6zmHwl&wNJHI6~a}*@Zt5#hN^_9K(tB}Vn8-hB|-(hsKg-_Wn)!hR3KR;36ZFh zpc1bF=_+Z6LD^K56cr${RkBb+vY9FwDo~)3kH}NWRmo9-Qk4=!u}YCjp^9W336&3# zuaQqxPf<@+2VbfWZr+wx67P^$Qi!sHvzFYBDv63fa^wL?$(Znofm$Y93-)HkX=1g<@(E zVnw!)T0n(zY8hfxwv<{zg=*?oL>0A?T0w<+Y8_%tww78$g=T6KVqLb8+CYU4YCEEh z+DdJqLNB$4O5kRK+C}Z8!Vq;3O9Rw?Y9AFQsN;w+>Iik13NzGc#D?q?b&?8;)CI&m zb&fhqg*ECbVuiX)U82G^bqldc-Jq^h;efi2*rV=Jcc^eiJw=>QkEn-KxTanqE~yvP zb1FO%)Cbf(^_F@=1$T8fe979BbyXMR5?1#?c&mG=d#FQ@dLSY|-Cx~L9U|1j5n<|~ z>cQ#|ryh%lR*zDTREH$>L_~smy!sdEtDWR2%afm1n^T)rgCv)gVMI7!jlvs1~3GQECy0aJ4YCP&N3X7Keyci&2YKgA}zSM50=PTD%%$su3Be zbhR|KR5i#~%SGgOhnR{N?3&1y}E zMzsdDdNt@!Ye%%HwW_tKL9bd5qFb#?ty2w#)CLg)YW-?`YA~)gh8R^FQ5#kxU`A~k zHKjJGHlgOD;;rJPlJGw~Rd$ur ztu>`{rFNw;rCg;@rEDd4B|oKm#T~^p#Vtj#*5lhv#U;gA#c{!711xKcItAu}R@;6FXO5mz2 z#s-f{4@&n+;HB(|@KAPFc2fp_Wj}?L^N;v`%t{kQustjM0 z;}EgRG0M@(kgS}D@RmO-_ zhDzlMM7eUAa;Y-ZDc2yXmA@)iDMPbz6QWVMLAhS}K*>{nUkN`CI#oKs;g>%-RytCG zEu~Exy#X|-9YNeOC{s-^g< zRHXzBO7+sFbxO5Ll6PShN>Hv;CaEhCB}&CgP^46dDp1N-%2UDvV@eT9;Ywjj5T_J_ z>1d@WrAQ@6Qc6T5D8(y%QGyJmG(@UWic&I85Udoa6rkjf_k5JRmAsTZ@t&)aSm{ym zLGf1cM)6wlO7T*$`-eR|O+fb#yLkQkZw4UGfXKxU8*>b@4YCZN*q{heXi#8~Z*cL` zvf{ephN9bw;ZFxYMJgWt)U1&6WLLrWyVajU6+;xWpX^ERM<|9XW<7aONPqIEkoF{4u}wBi z5qq9gm{7odJ%uraQ3d3j!Ypz|VOn8I!Zn3e$XV6%G{k35hQiF3{%+ zX9}kh-YeW9ZxpT-t|atObjQ)TDY`0(C3Ess^g((ndMSEJ7^E183{dn}^i!PusX?J$ zp+=!hp;W==yTm6I3grq_3YF6P)e2uFosItlSqd=s6W&c$NK(M{KT#n;;fn%fD5T>| z(-cw_QY7tCfB5gq?hn6T;-36|Df+(X`|hXRPsM-4X5k7Dp#YHz5TyXo3J{|Ju?i5U zF!58$4?zm<3R7a4NwLg?SY})-GbWbV_?JL#2ar=w! z3;t3imZ`*ErN5_vda+EMSemXC%hZTv@Mt0SmM@mclVo$nGC5+IY|NC1Wr`)4B0Oma zo~A?6Fb>nHI7Uf2SuB$zmPwGLqcNQ&mdTW)GsH6KVwp6|gotH=rSlKMhb@)~z*Ll2 zCQ{NULM#&|mI)Qh+`jS=%Xo`ryu>n(!~-FDQeDL|Vtjz#`23+&HdG-@!CfrlhGWNy zr&z`Vd&kpPDD>fT*{jf_&@Fi`M-+yULkfcm0}|#d=%#%yvkT@Xr@j%xeQD;zVP-9SS@cXm-)u74%(;FD8MEU2k&n2IW zKNo!-B}RyOVv$%N0)%eDYr%ow_vYP#MnTp;GXIhBkMw^?GHL%v{YT0_=7?EhnwTPf zZ!<|u5Pd{1(L+Et(SxQw0#b<-L^6>?BodHKWFaz%bRvy_0wN!gN8}PY1e6h_h!UcRC?w!3QH7`^ zDu{9d8i;yC9Z^G66VOVuAexCLqLF|bmunZ?cYbw6xLmlvgUdatO7_m>)&<-MS8TWb zN=!VufEVG3*m&hZxD((<_#&!geF$#?f`~xG)~f)*pMXV|1?*t))x67`3#_`VNPAm$ zS#p6bmrcads|}ZR7ua*zMJ&JCaoKi(W0xZYQ6+oma^M2zE@!BfSEnu~F3{%EidcQs z;?nE_-7Z~-O4&}A4j1Tm=|il)>UHUHff1Ks#Kx;ZmjM@;a2c028*>?TfmxSn#MY}R zmq{1Mb;&_2zRGsVa)CmZ0%@~+mpm6Jb15ZIORq{?id~?}r4q6Hs=}q*1?pUCrR}O+ zzPdn@OCw_CRf9{t3uL-vAkth?T~b^i*(C{)=#t45!W~&bSPZosXOko#EQ~5=$4(=gw!&@Zfxp zxO2XBzHtT*7dM=VtBcs>(HVSQd=TC)UM`+45bP3&2ypRt@pFL)mvBUwOQ=hT3&gp^ zAfjEOTq1E`OU^LwJcm6lyqa~Mah7~Nd(s(toqHtn?{@BT?sSG>=OJt`=-ltz=L{3h z?5stIDdsIsFc>+o!zkJ>MVACbdpRL_RnJc z31gA87W&VSf8uA2{|x$P;6L#LY$v#Jx^}`}P&i#WT{ua8|B6?KPJ2$fPCHJLF9hxU zvf;Guw1!#9WzGp^oo2B8w9}N+Bqqn4VAN>@6T?nJPJ@`}b%GwJZcKDJbvkumqSXnS zotiMw=+xj;kBJ&5sCN2_i7KZGr*bFQ*4Vgh8+ROY#Di6i!;V9akB$$Hm9P3Z&74Zk+OsrHvK%(Jcf7*}w~jZC z*N$-Fc#Jr5JaF81giXf{#Jc0Eo@m$6QA!cPvAcI+i#VOXeNs7>W#W40a5140H@|B>W{= zKSy88`Z#(!dO6-Yz>NdkIpDc_p#HbI-U9efy zUvwZk6CH|(eB^oQH!D_(Xwb&v?f{?ZHP8STcRD&t|;Wk{y&BM z`1@t-Z{wl~(UfRXG$tAqjfh}aG$g{ma#6piPt+l57ZGiuW>J%9%pv-f$3G;C9LHDe zROD3X)bpyu33^36*t}cRCF&GOp5YSS2&qxjAgUMDiM*avh-yUDqB7A}QI)7zR4Z!v zR{Y17Z~yP5==(|$p7-U45NS3A>t8TB|0W5XPqaw#`{M#pKF-4ZNuDTI1lgi2DKbSF zB1jS?N|7Ln7eSCHP>KMNzo_a@J%9ES`HFl*-XbrNr>I2K^JfnX$;D0NDiVtx?CQV;WBF>;HCa ze`J4V50Wx$+3(oHru~Nfn!VQ(Si$PD{gOS1e_E9^5dYEBN&LqdQPUsh?HBA9?VJ8E zV?S#ze$w=ZN&6}LY4o`Lgw!MUW76BIzYYJ_?V$Y-)`@=m0coP!zR$h~6P17KwC}>( ziodnncSvtr>|61+(Z1Qf32$%Z>g^k(x3%_l(%WkL8oaHv|7u@_w`KMf_T_k6Y+q_$ zg0}_sMfQb~`rq>H^YHvrec$BTLymp6J#GW#vh0aW`(*nhJWpDNeX4zmeY$;`z2tfB z`zF!8@0$dSc#JRh5N97Nog&6Q8WU0W5%%FYQKV#<6*&~*pGbj2zC)fv-#1}c4#fz; z2*L=&2*B{i@Wb%M@WJr3KYHqI??vEU5Bsnm0)FWG#vSjwVu&#w?fSlXz__l5L2_}y1HgMEOcC&Ufb_aI&E_csv7t1?# z+jd)auw=K0Sg@P7o3n#WyA8y;-J0F19iFiWAA+9~4BJ7eZHX;zh5l!;ZILY|D{U)~ zqu-RwA!{v(QMmf3!SzdQncH)*+Q>vj}+auUA8b} zJ1E6~ZJ#ZS*^WvvVoMC$!nEzAR1>!2wlHryC&jGoj4dqNE=jRyyI>3Jwrf(X+OF8b zw(XV_o3X!{@m@y)&M zoh`WAx#1!i{l?W!YzN+UUQ&44dDwx!ou3rGc0P6xVizn$kX?WsMA(H(5oQ-^2eEe1 zQbgHB+Cha~sT3u4#dc6__f?82yGlE#x2uz))~?15n(dnGaQ|cUn?}0^J7~9Sla^ZT zTI_J?7upu!`0{OYZF6iP+cpc4X`5l2W(%pdDTrj-B-=z=NU)7Ze6fwSjj@Gj+bBfF z%ShV@TL`laMWnwBu?@C`AlpDh+RFf2KU?s%^+9;sdf9r~65wI$j&idV+dkUBgU!7S z?swVT+T7T{wapdc!sguO%mz+vP7ud7M>dBxaA32K*tOZQ*|vc#n@vRO%MF`#8(6bh zm15au$p#i}77+6`b2hU!Fk>@~7?PW^nY4ikn{mX!k7I<*s11zR3`9&C`n@&XX%MP1%8)&m>MYPy7+ceogqfG;1K(5}V&IW32YNV*P`Dz1IHkDFT z*p%BqnN2C8#HQG$$OZ~+3K01=c{aH=kYkgLAhK*SZ8B^i-6jo{YLjAO_)un4Xju%TjSod^`iBHHEddMAl9wdtXHjJ&w3ZJ zW4&#?WevyHM~Fk~1M7WjIJZ7S#J@bXKCy;t>nlR4OX~}3c(A@l+*#jR-&lj2jjLn` zFU2;G*5GC1iAa0tVdHKC{x*IHUmG7AZyN})2}T6j1lk1Hz`XSwb}(x_V?Aw+YtWSS zB(g_t!g|~q#;ivXBi6&#L)I{8J%EUN*>BxPSVOOM4=VO$w{@2_bXs>H+O6BHTdkqR zx*1XVvdOy98XBzY5p~wJ)-~2pZT%Gy^Rmji(i$qP%Mn9zW!9zEP-0z-D6%fJF0h7t z>pVoRb&hqmHDp<5BBEYqSf^Vjc!0T)g!cYlyRsMRdu} z!d=9Ua9g+~gcad3VoA6tTo4AlZ1~?WA{@rVkZ@2qAcTHlAEH;-BkUGJm#`DjA#4}6 z387Wkf@l^t2^)pbAgo8!y{r?~5<;jER-^o0eic>;p;A~OMY*s{2%*9d#H?JfFh~f2 zLVrm`=qvOQLaDF>Q7kMH77C$2n2%_e%M<1bAxD^v$P#7>GlY;XOhcp!Q-sMvND?L@ z5`^)>FG7eD#vzE)eH}Gr_3<0!S64Ad&@1f@8kFWSHm8DH-DTz#vkR6NHfFyA^spATKLV_bJ)u!ej^_m`1OcR zxjKF=A8Pp3QheoC@u8AmfjIxMoL|O=Qho`dm|w&%KeGnHUZ@w2FJoz4cT>sqpZhTihi209JI8@Su)x8zm zS=}OTtgfxDtl-k>0^#<?<-XOP73^B=NSke2ZCSyl z)du2>v~IO#1*=voQY>37S;3;!g0$JZ)tnW~S`jm-X{#x#Nh=t!8b+-CIAk?w1rt`| zh^9Y}S&dpjk5#v{(q+|Y1p`+7(n_CIuNAadH6t42nyebFpu?&iaYAadYPEuDtFO{Z zrB#I$G+5Om>a1$5YOJ8#stmFEW2se%6#>OoMW|y^p;dtug95+a;zZRDhqK$ z%CyR`f^@4iDN?OctRUX%3u2!XXBBG&$yP~-LsFtuf)zwqg-a`8R-sl9V-+o}L|H{z zL5Ni_V(VFuRiG6FSotG%Nq&TtuNC-Md82knURIt~;9=#CaI>J0a>o+3Ew`lDwA`?S zHOo~gRxFn-Vaak4K@|UK!E)Xb<}7EWr5VdG$ZE$b|y(z1d;m0OlsmRdrIWieubRAgCb2?dtQ%}BF-|_GR6|3Eh7=jKSo%FTSAy+s1zZV!IltY87M`7 zrN1S9|Hjf6HBIud^tJ>qOHafU$=%Y;5?n3Ch)L3;#e)UhTijVl)|p$2YYVutxI|o7 zoLih(z^TOvBH`t+#gPRZS{xwuE%q#SEnvrD8&N2?X|Z7e>lSNLtXiyCz_P^>V$ov3 zf|#>_S&JFew8fOgqy%BFh3YEiw=jq;!ik3rMv{K}?d8Es`uC!6F_}FZabF&H^GW!V!6L zVHTkl5Ni>G$d`+@h_ZkH3x8?F*TTmFLM(!%l^}~i3vjn^Lu@^BwRq%#w}qDl?*He? zd0Kc_zzy%3Cn;U=E_v|4yGP{8-SKXDxGQ(eJ3=1v4tV=KxZs^5&UmN16W$(gm$$>) z=56sdc^kZS-Wm^9c`I06<}L9Sc`(D9My&og#hc{80&gDC^yfL=EDuI_!-xh#ZiqL? zg9+X^>V!1L8|A?OuOCq_*T?JSK?koLktf&2Yvn-?uN#ps*Tw7PK?AQIvGuHuSIdJI zUNa(Bu8G&kg9=_bVwY6LE9F5AuNv`{SH-L3K{2lgQOGOc;SMry7 z$-UshJ@*dL^ygdd4HwS2XNU#TDffg6$J`@CsoWv=fD8NFJ;WSom%GD-ZSEEV*Ldy* z7uLCJh*jg*omlVum}-og%m}$(=xrbH})&To~aFBZjzx+yO51 zbNdj>KlXBaxX{h*lA@E_!G(5i8)Aag%5C97Gq(vbO={#eaG{=Chp6S&aI3lSm0N|V zK(9Bwu@iwh~-WW>pj zN!&y(Byi&qHQ&Z@W4RE+jYgdQ7{!g`LIgKlS_$KZa3Po*gt&Va$PM6vKi3c8%k|-U zbHR)2DQ)J#b?1T`*OiN}zct^AxsT@XV192d>HF6F#vHEAuMn3%UYcK+!@2nxqMvkX zeqs*C=0}Kw9}mqB%wgYr53y^$W4>(;TjraH4fA#LHFH=sUqSScmd%&UVbOd6(M_5+ zpEHM9^BIJz?6momIZT=p6R3+H$IZvgVbpvCarWb|`H(pbnhzjqzU?#bHHRMaZbX-P zr+J4tw41jf4t{JkZ!w2v^Cl@8%^S?2-nE>zXspgPko{V^SmSmo24hiP*l8RiM zd8|3am`5Yp{v2ffYd*Ix2;Er>PsQLDWbIpM(&L!gZ+Y8P)2hKRBh!f5+ z=ZFJ`oCCz9+&*WI1G}6ZM5^32XNv=yoDGEkx9glW4yyTo2(!!COV zvCZCMZ?a*5J&%}U&$4IOFwLHlHk)Kmuwk4%h8Sg!u!q?#cz|NaKp{cPxC_hRYz z#~yY!8@kw?hz@o;yNwOi?5~L1XI1Pe&bH-kR29%-eUFzYgdPO}bFyIi|jn;Ep4wMa|NW{qah zU{)`!)S19QaB&nDcnB|*6o>?xUh?HZNZ3bCp znTQOtbh9)wNHt4AB%39fC7MBkSv-RHViso>YX&i9QK(3>2(xfA2r~;sgqQ`J1(`vh znLonM%-77v47|;}5T0fpX6|O-W+p~Fnm(A`o5G#xttq}`GQBpvGKEdy1|Bt77p@6c z@yLqlIaUfuXQrp7aAJClI5Isn-8Y3j(_I2JA-7|?Z34kbHLWoPqS~|yRcTsbT5bwurlp7y(_+&iQz$geN9392 zn&y~7wrLh3(=@|0-4xPHQxM6fNv4UWkYE~*_+lDo8fyyCrcsD2Qlx2wDTJGbAwo?< zOoL4!$TScUVCrw`XNr4t7r&kVhJXKmB+h<2{S9t@yO!$ex69wa*VG4FdYgKgdYFQ{ zshhMzS5vVmJhC2G_-=@G$GT;~4eJ_l#kyo&u;83^hB#%Nu#Q=WtOHg$DUGzx+GF*; z+GXvqwpm-O4c0m<|1WE-Rn`h?nYF}PWG%4fS#tzymNmngW=*jsSre>r)+lR)HOv}f z4YCGU{j5G#FRO>u&FW%xvN~AptTt9FtA*9fYGO6A8d&wLI#w;KhLuLDW_@KPk*Zjg ztn2S9SmmsRXJr`I-zSnvStYDu*8H;sQX;8{Rmh4beIZF=?pYiumNff}$Y=fc-8@z< zD~FZM%3@`*GFa)XG*${LhLp@oVkNQ?Ska_-*37dntXNhIE1EU^?CN_-M6n`S5v*`l z7%PMo%nD)!vI1ECEI*bn%ZKI7@?>3p?|~637e$J}h$Kxtb7#4+#H`sLBS_(-N9F^; z3?qe-LP)`+TjmY(nmP4s_D8%tyJB84FPP`dSh>sZFTX!yo-$9EK{)CoW*}(>XMD&! zVD2*mNdBZfW;AIRYks6{<`#34xxrj#t}$1cE6io4LhB?igVoowA zm}AVzXTBsKybzS4nLYn!Ky%N!nGvJ_QXr1Bi|J45Wd1(14yHHB zo8(1mXG(?^E7!{OBzclrn9a->xfr=7W+T&s)PPaXtYf;9YA~vqUzt_RGNv1;gjvj7 z{kDi%$Sh#yGxM0a1T%-3&CJAP29~FvO+9lZC6UCWbY>be6|*VKnPAU1lj*^9XSy+6@o~;P6Ehzf z4~#p;EhFz~*3;CdiBFTB7Ceo6n(#F0DUts){%OS1$fvna!=Hvd4SgE&wD)=U^DjTg z{v7>t=+99Aad@;eecrniK!&PXEasB-$ zV}vox7-9@E1{nQ}K1MI2htbXGVstV(810NUMk}L*(agvoU4MV|qKVPSXkgSc>KL_* z$!9f;YQ|Sa6{C_-!6;{xF^Ez|38R=%#E>lbLPh~2pOMGNW#lljvGMA+SKntbE?;Ca zG8pNMG)5{Tg^|oiVk9yW81alRj5tOtBZd*ph+;%CA{gO}Fh(dNgb~aLVw}D>eG$kA zVE8lq7`}}8XFd#Xh8M$=;lXfcxG`KAV#cG%#ft}%W8%f}i+hthlUtJ;lWUVJlS`8e zlXH{n@6Sw5O-@XXO^!?sO%6=fRq=jc4 zChaC|CV!ZJ=0ys>=u!Qpz$D)!&m`9*$0XY%%Oukz!zA4#%_P+%#U%Xy>;2b1Y`@rk z5zgpUB(A={H@-8zHNG*vHoh{xH1;K37+-&XZhU5ZYJ6gRWPE6RV7za3t>n#=yoOC7(m57$+M;rg4Tb?)n?28K)Wpk!zfT68|yVILjD{jf)V4#s$Xt#+S;G z%6Z0ta+d%X(y#s$eIH~TXq;r6V4P@t_s4kSFUE1kyFX9-5NjM`4AI6>IHmiONaF}& z2saKxgc^q!2OERGv7fQ8G58pJ8-tgzr?H1IxEr^;a5Dz6@gtoGFop;EJ^hY;ONSf! zHT{ZyNrwwMoYUcq4yW`J`Y|19UL4U6>2N^br|;2WmkvAhZTc1+Ht8GmbvmrkSLrKs zSf(%07wND-pQq2!XX*L>TKhj?hCWS)hyQ1aK1rXD^fOK$qr)hDgg#6kq7Tx67@+sl zp^x56@1b|oyXcwUK_|WCMTcafc6u8fTIntHCOS0I8ziZEdL6ymcDBcA z`jSTtJ>h?RrB~9^=}GiNdICM3{)HY#kEO@Zqv=ufNO}Z4oE}CGrH9ai=|S`WxbYQe^v}d$yv~9Fyv}v?q zv~IL!v|u!EG-otxG-EVvG-WhtG+{JuG-fnvG-5PtG-NbrG+@+k)MwOd)MM0b)MeCZ z)M3L&RBKdkRB2T8i&3>viBYjpkx`*hfl-A~xlx%>sgaM7 zuaSRv>cHQKIHOpj7^5hoNTUd&aHBAzP@@o|V51+Z2 zMZ2M0)9z_Uv@_ZnCV^v|d^dt((?G>!h{OT4+tQ23j4hmR3Wn zrhTPV(JE;bv|?Hjt&mngE1~7n@@ToV99lLlgO*N9qovZ4X-Tw1S^_Pe_JtNli=jo) zB4}Z>U|J9@kQPAmr}@%+Xx=n8nk!9Ad;Cu?nkUVJ=1zO~&-?%Ef7SPjsGyhA%jl)_ z5_&Pch+aq!`=)@t@h|yw{N6cT(xCk($fM`d@c;)so1R67|DU+;fRC!$`klSc^hud8 zGwJ2bBtYl^>HUDBB0_?|C^Hihu8Ial!nL;~iinC7BPid_r3RfVsiF5yRW_W+H0?tck>tId*|m*;BV*8%b$zq|LkAU zzgCA;WbX-lU0#jhh+&obTcrM*pO^C{@bP)i#W!R)LHAS6N*qc+_4wOdocH#+!MA9^2=kq#bdn3>@VI~ zYOaV>$X%W*{Lh!^DIC*`+Y*O#tC z=?f@%9zQ3ICj;LGP6Unzjsrc-!@9U{j#zlfcIf)mA4ia=q=^f&!lh zJ`02!xt6xxe=zMW|7`y(|3`ttY4iMZ{bl|S0?)ZV^MC69#Q(9s%74sQ>EGzz;J@lT zp7x%9v44?&p})j+Ds7cN=>N#S(*L1at-2c9RnZK&hS^pXTY5%Dr|F`@* z|4IKV^2_pM*Q>5cu6_Q!{#WHm@)7%&rdM41{a^WC#v8!o-Q}ugNB`^VOY)1M+!v5r$bZoPjsJlEYrmTRLSTI0`M`65l0b3bTmK3FasM&@QGcz!#(yGhseg(8V%pDX zKc)Sc_CwnDY4vG`qw3Nwq@7PYmv%PoOxmTib^f(~Sz^5FYV(kMDBsOJpR3;r@+vEkD=6q=}i!{`0g_lwVa#^>GR+wI%stM={m?eKY*`n=10 z-uHdpWpwGL?=bfA8UG4L(@p(V? zdDr^9>wMnzKJNyfccaf+>GM|kyz|q%pZL7zou{L{n|$7DK5wz#`>F4o(|g*tB+Yxp z_kNo9c|Tq+`@C0u-V#5`jTgT}jUxQ^9`)7wYJ5k0hkb{9-eW%RaZwqqVrXyryt90e zJ6txr<(uvE&cSee-g(-W`M$S(-gkW71^AM-*tf{H(D$y-`<~Cc#OM9Y=RM`~ZuWV% zXl1whz7VCp^lkHbx1&(nx4skNG3q!80djpf~hXUUP4hGHyP6ti}Q0`^F_f_8% zU#TyG`K()Lg9ZLNFHlbL83*N+m~6Clr7ePv*Q{|<&HCXMv#h%*k}0omDDAL6%{X(z zE}i}B(&769$=|KnrOV{HTO*mQlUadV$9s!^vZS0{Q@VS9hG{ z{q^m9;`-7vUniIjikyRMN^J*TNv_kH>8J0lh@>oaxggqH;g9m%~$fo^}BQh9z8~n^0Hp$Xi(;u zWq4pi4n7sx(5nu;mL5D9pHaLP)!d91DVVY%J^HXm%ugMgM_+goy2fnd4?WUYZQpI; zMF5B>%pdmX)wa>2hp8no`wtFn$hstEA$}o8VWZJtk*rI?aBP71E?p~~PT_?D{wmO5(D5_WVg>H$e51xuO zE635AeX)xaOLJ#w$?+9D$f(dfAfa^7i8IEZxLZ!g`gkiFHh*wR5KU**5) zDSyKBcpCi}vzHpbi;mr-4OccRhJNF)+E)8Dt{5n9MPFBG@9(NvHo5Qg^(@UkRm{ef zR-d|!<&>tJevFNy_mWwAn?+%2EpE@Ds$1gXO3$30#m<(#c*esPmQ`4J^8?th8FjzJmCirkhGm!TKA&OQJ}+Hi_F*)ycxzk&w~upMwGk;MbzVl9 z10uspTVF^sjb9S0*pMD_Aw68J^w|ryvtg9Be2dFvR%{w5l+)8QM4K3ujjBd{<1Dq- zW!h>sq$?5X#|WBtEZ`{3t{cLJl`g1DGlj~RZmsLdo+!1}_Xg10mW*MzeyShFux0~(xSi$D@%`Z*H@70$)teRqy znm9@?Tsp-UGE&}(k1ehHMF3C!^<^m=h%)f?p|SK+pU4MGvwmC1#+UB@Z8RH7JHBfY zSL(amJaXS^gA${xnvpD2!ntDg)fxuiD9b)|P|uaE>@=obYUK1Un4M)$ z|AyTpkd-kdIa{%4=%7zj_abPnHH4xYHVKcNoZW^;vczt~ z)S_v7K8vMdiQRyYVm-+ITRS^_C9xECfqs%$Q+%Jgx3P=b=~;7p3g}r=RCH2_#e%b< zu&TsAH4I7w(cBVZiJ7}!Ul0okom=$FcsN#El zEZGltZc2GA1~;djQ*Ml>jz+c=d+(SLBh8^UCiYLf%{Q^0cspuhv)EC3*3523gP)nz zF7tWA$+UB_rE%02GAes@O2rFYHrnr` zu~;P9X=N@}Mp;uVZeH;*J#!0d#pukDj(&j7XwA5v+|N$IU^}=FRHhprlB44@OlI$qr!}BcjBl%8Dx+ zqvwyKSe`~?I$C}wG426Tar8tqdmOb2kJ%lxa}g$fp(@$VUZKKl?x31MPq(3(36bW= z@f&e;?0GLk9ENkLw!oQ6*{|PdG~l!S4yw|pC3l%EihQ?36j66QRzj?cGFOxtqA(4K zxQ0adK2ekxm8fKLWGA+ZVqW8YsQ82NR$5_a{WvzFe5bD$b&X-e_{6K!tJ;?!?X@MA zD(7NpQw;O512k=_)j_=->}kwyy+d8bw$Jl8lAX+tPtQ16Pk_jvFsgW{tAlns*|WwU zQt^RPzPq1;3S11^kKS~tXmilTnrZ7Q2<=d^Z?u_c>N0C2y%5U|vzO`aIFuVl?}|rG z@VhwHh2iN*V3A@YWhJrz9+MMUC-x9!Egc*i147K~<2+osbnV(T)1XL3N0J7`l9U9j z&mngb`y7u`NvwnorqRhjJoO|H_;)Iq%`whpZj)jyV;kBq2hB}U$GS6x6{DA&RA5gw z6{V^puS!)v_DNGe&O3SDK}C%x7-(V|i_tG+N(>d&NO6?4Leq57t*FFzDb zwfhdm5xyB{a3;$|Mnxu@h>oJD>WKmuy*1ouq2bNgjmRl$#wKDona$aBJT^3Eud@ks zM+^2c9*0}7#`>+LdiPuNcG<{AIEpE+T#5CKsVIc1`xD9&>O>A$& zve-v-tqm*0TVWPx$^=Sn3nDmymb7J{`oZmO*=(lA)`=%~&FwDAI}oL(tlN6%sdeXL zMw)g5nmK!|Pf#KN7q28TRU_}O1-Pa|K>bf$4BaO*D5ahw$jTzaEBS|oIjMJFb~`48sU`#$_QjS`a~);%R}IL$dLxL$eCmG_ z>&EubgqzqC?DHA@*n2o5;%NInPsY-oZ|X+S)Dzz)QIDJ1+|TJnW$z~8y9^(fEE4c17peUY?O9jI7t44_ocaqhTG|hf!Odv zsn&QoQC<~hE|-23PE|IfrUt92V$a&H)N>FU6XG&K?gW=fs|PVR*v$N-^INCB7&NV#=-e!G!GT5}9o2#= zMFTkIU1{;D-2P;uqSpY!64jGOAL70Z_Q!)PhfQJpyY*D@*nM%48gI;%(huDBSLvg{ zOg4Nn*@5IYgIP;9h0J%T{7LsaR8moL2Z-SgT6G7T3j8oq{XOlR!4X5)ql^;oV$ZTq zsO=IEt-QX@WHJn6H}TccDwjoh!&oEnBG@dNI1EdJ!G6>M3!EFDFw*Tp+1bxBeNHNR7xd)uBi7Y+RJ7Y{w4eW<-_ zXo%-|U;7YqS;5#m+(6gH**cK%E};L(Svf_u?>%uS0--4YB3*EY775_==A86EO7lOxoP%=+j$NoJr$%@WEUV!EAf z46sl5wvAL@vN&Z%>R^L$o8TPoptiZJDPOmd3eRlGFs=)IJ9ssvt+GhG9MyM{bV|8M zPO~E^8`P&c9am}HXb;c8Z5!;dxxijdyK-3*&Z`5LSxesvz} z04%tW$C|JwDK;Oc?c-E?Ux@_xD3L}O#G#!zw3I19-|oziLUJ9DC_ z@*m9DaE;Wf8+`XaaIj&6cjyw{;Mur{V}p-n17fMg-OOqj1t>F$>G_yT?C+er*>@m# z0`SZ=7rewhYz>afho&*lZo`~-M!)@oBeT;?_-&Kt&#HEw~C`9P2)}6zL2s@ zqHwXfk8S7UzoG2=G0p?BN(PL{9;QsKplNH5_Mr`#x5v`hM&Cl%g(6rb_wn1DRQ7@2 zjLolNAvncsk_)iH*;FVpeFY51TyRVQv*7|~q?~$VEKM8DdWaWy4em4Fj%FKTCSKjH zi2yRW{<;n~@A8eJ+y`;ss`nBl>e?QIa)>D(1S4=!RIeln&X+d0JMsa*@bTqxM}7+u zFI7sKp@|RUf;8x1mdL88;9(RxOdB7@QISox53`}c z7ZA9On9or_d6 z#_mj1D-H?EGRzJ4js+K~>g(rR!B$VQHhMOb0?)Ec{dflP!Zh#NIGXz`vjAlI%eTal zb;eVk#7OOsRdzjRRZi-a4;QC`D%=TqL?qR|4DxR;VrDj$4p~hJ7N(qD+X&3TaLRtu zsNUo%*1a;6mK3pyxTP-$ISeF#%1kwd`?^v$eg{=7_hyE+QsnrCG6#{9)5771LlIOn zs|TAgBp@=_M^VM1u?b>h;qK5BoWqFjhGc9c_vgdnA$Wmo6?e^HRMFkw#(^61S-wO5 zL)$9GFwwu7G6*7*Q{inzQy$fuu^j9J&x6=h$O>>PE_6 z+dVnLBqUABRE;86*jvZb*ymZJ`|r8#uBQ@HWfF=g`5^zcF~`dF)4)Gvh*j0=1gJ-UY|K_d@;zJp6U}LflgO zOUD!%aZjgPgD2|pBN)|9WHTFB6;&WcBRmO$RViue2vf4&I4wZQil<33xRiO*fcbz< z+ZU3ODf?1N6m@?YY{4*M0|%!9@bbXH0@Ba!ib;(d=axc4)HpLPGg*Q>tm58rE}EO^ zhyW!rT+gbA`(Xnm3JaxrL;8shD+Uf0G{5)0lW}^W)RSP59AYu%*^N(7@8R(-dR*!E zB+Z`0lEYkT_8Yvhy3e;TW&Vx`l}oMOB(-KlN~)yoX8!wbrutO=3{70sK9lM`c`y^L zlit?Q)S!nf5>j$WTk1NqI-7+QAl-Z)7Is-;X}-l4_6p>*Zt z?GQ%Vf0D6eZXUsGIKQ4Agd=u_kTQ#0r5N-ILVTUFi;eLZ@cRJ|AB`Gn?r4QS;?_%I zm+*)2C3tQM%Qx`i--6lG!FMq~ZEVypmJZEe1sK3B1StTgm_Si1W#2J7iL#sBF0i-l za}f|n{hZu_QfIQ4*j+TQdna69KCyMDUuLq6;9A}~7D%97Z$Mx*m@0Pqo!GCcs4FD- z42!yq*OBI&McC|>Z?XiyDf{VdxEnoNWuWB;W+c(*KF?VrFTG|~T*~qK6hR(HS(opm z=wDJSlEFTfDz`kBWGbGo(b6Nkr>UeN|E&=U;HBuI+c@qQaf_opOne7=!Usq zy5~~fT#OXbkXiot8L|DWB$vHmq5}_f?MjE|vMAi*IaMsgqIY|+tBXcFXBDh}&Ljv0 zJI`ay471(`zgL#CE`ude$vn2-72bqgm4oZlEx4K3)5GJbeDYJb(vG(w%gLc$mWU?7 zGoPmQ62MZPbT*-`3&7$%MDrqzJ!tj<_O&Xa??K+qnNcYJ&rMv22TyL|LOfHl^(H5E z{S-=D5=bP$Trz~TNioVIp`h7_%`c7HK(r~CPU&b`NHGyhW zFJlSu2Uk}^OJvvSw6!-XW|f0pNOi{UvD7;*qd(0(GC)tg@A@TD!|ST%s@UXH6viIGaOZShoA&dmCQ?|q@89j7b%r)?JsXP|-um+hx>C>~hL-=+;OBe(X4CEzn|9G!b#e#)bkjBo zvR^g&-N2$vUK9C$&Y}@mv`O^dYKY3m1y`?z98@q=<=%tIQ9`LBPV5j%rL6r+ma6OZ zEEQ&<>&7&}t|fG0|B=BmUC&@$xc_Ze@X%UT!kyzUHtEP0F(^KvZ2b^VW&A}Nw*lh2 z)wFv9`>yi^J-+SN6#(zlWak1|-%Pqi{KB0A*D&!b&pta^JUgRo@6ot6*;fUB*a%vK zRV=E4(0tD?^k$WMYd;ct{k4j%Lm$D9ac*Q&>rb$`$7{@bc3w2r{+|Y!4t&BEiDM56 zNxHhXRSfOC*JY(a6OY)VHcl}r-$p3M)6M5sC!o0!Uqjhfs( z=CK%+q<4MkNCEBmluct3DgQIpo$Uw$18&qxSn|>OIXvx8nmYYq%=~9(K@!o1qcOri!e8_Moh~$q96RGaJAbP`53( zpG;08?-tgq@q&m5$p&Hv&9433h&Q1)6)*M$Na7R@eWwLm*eAwmddTf`q?Eqwr2BfB zlIX23SUYrpv%*Cuv~kh%7NF%`W=22^A==oxpXuOTUwDD41i!g7NB4zS6LS21!w*%)f=Z`h!a$fYyX(%|;n z<59VsvJWzM^2fjfZPZ3hbY=_PFs$~^>D7afb$mtdA7t(L3r0G6koAL{yV)T&224}U zy*pgA?2r)c2XUSzNMSko#}IklP|K$4h1{IxMUQdNky?lYa@fer@P}Lk6->Q#$zh%9#2vIcq z1WTjM-(uR?!3*C)n2qT_{~fCl4cvWNRYTUF#+4Fib%qJi$ctxGIm-Go>}H5lV?$G? z;$OzZQpQ=)4&8PZOvzAs{48tHWY=ty{U1t#R!j;*C{eo*VsjmEVp54zU$n!ahwf`3 z)tqIq(nuwVs)ixs&1i;FAOZ8v8~5hgLBV;xxfwEe(=F=wDN*F!@SA2 z#!Es1pl!T5RX{k%Y*Bf*QxNE=JluvlX5&Dr2#3@4jLYG*ssF&EzCP&ismsmps`4AE! zJ=s5RuS$ptT`}$G{g@cDZO?L9aY4H;W>s6?-a)tj%*?jKFQq9)^{bKEDh3Dr8WR&| zT*^?)q!x3itOzbtv$o4h2eqVGE4k%o7AK@fwLh~~?Hhza|7pnTjo8$1H`a^GSe7TI z6+Lv3nQzWkKvb|xA{&KRD}xfDB81-lB!&{9WyU1Rl3TA{1`UcPK``4NM}A}|pV(y( zyZ!Y!t1>|5TjroP8|K-xPaH`Eg_G-UZacV7LHX*_1pRC^>gb)VB6&lSbO8FH> zFTf+#E;?5Gtb~@2p7@oenO>TZrkHRAF8h_WW=m=NuS~Z6zCH;wZ{!FEMf|3%PsVTR z`Xv4Jkp9#9Sd!HN7_o`g{-%mA_Wj1v3<$v}4)c^`B;!-#IL z(jg;%+N6%I5(ZadPS*`@G}W27MgNRar6ai>7pTeCSSI;9Uoy9{A7RSJp(81}VS|05 z)8-2nv6L&Hgz}?kqr_d-O`%M1=&zc2J8XbTGtc9MLWP_kf+ez8g-f7*TWq}q^E1L?eJR5Jt zUrVJaHsIn=s<816ruvC#0QEXLXX8-$lRbiW5c7a|c>1qK`z6YbP`?-7K0BUnkL2Kv zBDlr$x+sBK%aLmor^tTrm`9=YM-dDC5W$_%S|i_HL?Z^}YaP{gYvQ10k=&-9ItM7< z6zdelQ%vuNhEN#EJ!(?FBT4wLKJq-tQWnKOt<%e_Y$cp_Q^v45rf$w7;Z^$mbUH%we!JqN^--97=yaklqc|)8=xP-AnBM*w+yU0JX|%eY z$NpwS|7ks&9&cDr<#?!#@V(xkoX|3H`p}VREaBtC?7W={|C50KR!N0Fjzn{9+<|eS-0?A$#7gLiTiM3}AHs^N}F|veY()JBteXY_R_>OC0;$k&%wwe!AZwscs$^GB?fRU4(b&%;M$~- z3fH>78P9)$tF^uXu2j{CCqv$S7!Up9iOLUD*d!*6QXJf7EEP2NM^Zeov3&D;l=IMi z`I;ArkmGLec2cWPyF}8Vevt`=@v2DY&QH6f z8imet_EMU67vw-MyZGbA7lSZojR#@a*@imB^6A)eswG*2I2UT0pQhRVJ8`Ztp5MkR zD@pP7O`);z++eJPfCUWLSMe#H%_cX4ox{YIJPbJ*KWvlp-fgLsVV4OJxtRrPeLOdxn5j} zFd9*0;tRWJX#($BHoa9kODh}uWCrUV4`Zp22>p8L-TTp0v90J9+WBN{97WfpK1opf z|EbXXg{sK^3QFua6^_Ers9fLT23lTc_5Zhm&&nkJ7lO|NR68#sm3n{26K7?$XNffR zt1js?VAxB=FC5X+qJNBSp|Sn#gE=xU7T1)vy)QZJ0EjbW=d4{CBkmj9+WI?xPpv#$ z+#AC@{fVR>qHuGwL40m52m#EfiaRBHHRYxAk%E#>cq)$C42E8`_x*?TbmIl9<2nOU zA=8M-;OVd+o!so1G&Y=S^P9!t76T>U*bLrPT&2p+*+z;nD#IJ6Q{xM^rkZrLFQgc@ z{`75A*!%pK^5V*7{{d`DbN;jR{!9~X^Ic4d(5rJ0I+M?0$vtDBBc!Vl`fy=Z@_Y*} zte0Vm5Z2XbnsWNQ1(#{hU6y#5hJwVnj~-2?w3hsewv!qJYda=H{Z9pJss+X7zY%F} z5+cn#ngzwqKND#N4O#qFq0Jc7mM>s$(ob!9Tc|0f-47$Zp6$4e4K0g4AVZ6NVN4?f z*+%V*qKDh@xa-zWsBmYt?$liI-Mz`Z;EFv}{h!O0656!=^H}$=NuZ9%x$_Q zZVM;rAqekzv4z^c@nV9s2Npm*hdcUG-TJ-|ojsAPr-x2oilnGcd^Vb@>Jc3`qg9&_ z{-w-s^so3=vAM`ek)3%oCQ;?OC&7gAsYcAzD^pZ)TF#eNrvGYslM$r@Cf%!jcTl2nb@%*Ei71U3hxPjf7To;hp*ZHFT~E@1CZ5 zS9kmZ7CR`3mvO@5P6Txv%QQ7l`)}y>W9vxhH$`&qHo0I(V9ddteGStm>d5h5Nb( zTD&C9FNLXYIwq9SJ?t@ryiw>Ug$JX}Lp9;M0|YUQRu3A@smFi^t-6gjqp5wl$ylj^it>*_V^rRkn`410e^m3K zoy}`#dtdIhPlX?h+C1Q@S0-+tYkh(6z@(HLc}7~ueaH!Nk;|_4y+rDqfmsS$dQ|PR+jJsQk{X&h@u}S)ZUuZMi4x*-2*m1=iWLE- z3lRU*k2mMvfyCd;T}8qxO!cR-DLQohq1w6_bGb+f+)>?~lp>M3jKYeB3~IOQP)7CX zl6r#-NWyDMr3F}bjXDVDFuY6>1VVN3LNSIhEAq{eP-Y)rldMiAQ#evR4lpVvzYI7G=||D&&NcMg&AfH0=5mIzl3Et?SBDt#Kcky(;mz8IDyXZ7{)OzGD`D?9 zfZ+Ej3#wQE`6Gbx&Mmw($8*muJgc9&C7AMuVd+PEOacb#2)L|=Kbkr@85CYcbzm8lq5JzY>1=%o$$wqa5UfDE+;vU@~xZbe8qyVpaLpxRwYIW{{{AyJi z_KJpuvO%n_fQ0~ggBzfzs1i-JqDq{EUm(pMz=wss{OFefd|k-R53(WE%@1oM0DPUB zAML%Jzw;m90qrdO`>uyaA_WI>UkE5VL2DX-BIvE~@e2c`!yvvoBz+NMfX4AD6wRp5?C`-X8hwcgdl%%?K4e>N(Px}N`8 zrVhh!D}7hor3^H028_ff-~$9ktB3J^Z0ZazFVJ!!vh8GaP^;2=qUciKwrHB`l_nx>KcTnDadJ#E zym^vfAgeI9Q%>q5Ph9AUmw{e-#aZA%6*>O4Bu|V|%wSz3$1HOvf{fYm0nV{@IkBkE zwQIUz?pQgok7=SiQH}-0LN_27PC+Z}=ptTrqVOPnk({&;^}2S|>Ew90g}M`vAr-pg zQC>90d*fYyYoty*Mx$hRwMT_NDySibE?ip*J+WY6+>K=Cl^C~lCBmPj)9Kpdr!#)K z}C5c^$ zvxq0Z5(mTHD@oFoIGb#y+DDqXilCitC>#+g92qJc6)GHkWiXn%Q>SCH3!jkC$u7`9 zEzOaR2&E;Y?V+?DX=f;HKsr8@HX@xIN}KM*iyV3}Bb^aSTaeBSrL9P}45e*IXNA%c zNVgBABaw#wTpe5#(%nPpXn@afC5fsh!xC6t6ody*&ySpzY)^!kw``@D>CGL6Y)@nu zf{y9UW13}qqOJqWU%^mRFUs~rUswEZp{Ucw#6m-4+A9yea_vXz^)=Kz+Q6iN&)r;#C`tWl`&1TJ^vNzQqF?aE&%<13v~t1F{1GJ z1<>&tp1S}#Uck6Pp|6W%B9k1cK0_b@C1JLmvuKaJf&TKUAXqm(OKJF&SVmXk!(Z6B2jbeT+cj?_WK}pn;=H-?K6C5UGmzTmXS#}dtLUJx zLY%O68G{pqprLIr=D^86=CW|EVB4`&f6V3KT-;>E`GZ_BmT=QjI2(36ID_S)m?Rvi zamaUqIWUWFqlMJ3Bah&{```)(X55psP-70{IGjZGZ7zLpOwlfyjT7<=Y;bXMHxeJj zW^Yt5dZ{}R9DqYW`esZF4}c$!XA9ji+BsW*g~BQnF}aa|<1#Q2*L2U1$1yJ25V>3| zV?(BCVncpnpD4j@#K;bHjbkC*5S!VdHi?D&m-b*DESMtv(wHJ$15*Tcsi=V~(y3e# zrqoO_cS2Fsu2^+$r#1O}q{z;H%;_{?j~JAl z7pcog?q{#VXu;y5B_p}Q@$LLbH1|49Yjo8?SxpXirkX27F_g8rgPzLw@W|l8fACbs zkEWEBEcL*?;G4VoGi(msbq`uPN*~?B-@se;z5E>81P2+u3U3!j@mJZV;0yQhRzl{x z;(o{qk-MdU_rfK?GMYaqjZ~~uQJ)JB+tJ(z8SvD%JG*Gfo zc!0NnWll7um9>ba+{q{S1K6Bori2+j8chaAI&qi6BJdz@6aD8mdZ?d~^I_Kl5_DQ{X+`1MY_JBsSZ z@T!oU_(oY$<-{8wf_@TFE-qNYa$=DKn|?MHu3)3w*q2nRbav=fzX$hSO_FKbjMr>* z_gEgwg7nl_E}W7omcT!?W-M=yA>^Dq8P`S@zGZ)9!7qh;iEf0T3S#Kmnh2SmDg;2` zlvT)uL&Z|@cs%%dAup6nB631gyVYjM}-mW|0^a%{a30GYFv2&kr$ep4YZ{M zx=T19#%{iYZhsEQI*v{}r=jC10_A*gA>rYw{Mwg*heowxm zC4(DZz-296%bxphod~s4sB3!UMX2t6pi?gbhp&)hA}{Htc3TYDh%ynPkbfQicrh=n z<>KFymqqcN7lS({@;4hg{vDlX$Eie*V#_ zsTqP7^rsOQi%j&utNall2m1zU>Ji&}Me^m5G*8)-V4t}*?9e+NDQt)OHM`nT-emsH zzu^*;kKbJWdtZ{ODL|N~>8`0fCGI&KKn!OI&qRCTH|&3z{b_o2DsRf4v(raY`AX2s z2d43t@c4NeFR;FiC_o=CcH7_P6xpkBT&l7NUt}HL6T|LAVZpwAf`uv)cnA1#Pb;p? zBzyGDy(n)w@62+hpMwW``E=ey7~HZs8IItY>F5J+EIyX$q?d?0LBB-c6)Im8tEW}O zPtcy%_y+9y(o%@S5nCsx0>KdG@Qzmc{ONX4^g}5OXo3{;x|WN&F1qt|K9@FrYQ*2i zy;1siMI<10V%mSFh@|DmQhj{<-&m0s3oG(Vt5hrUNq=TV9^5tyLK0!vi(Ocjcf1K` zf8A^@%w)qxy@*ou7HCh%z;M=E5Wa*QWsbeYXCYlQN6jw0-{GKTbAWEyl>c*b$nda! z4)25y%4LU(dX}km3(NS;D!RfbH;&r(H#veQ%CN08Ti@VA^Y~0v%v6o&0IBnF0AizBXrpswXX6z(v)N9oe55;X$_l2V<0h$#Xy2>7xUpp#C(~woWF)gS~-7$l?C4@ z2TJj}zfmHd6-vaV+M-|jGbJLe`GDWc_LF-B?}5jN75r=LrY;`}t8uFSkUOAJl;1aJ zk!vMi%+ArqmHa8y440L`fLd6GZj=gtcNGcyJYDa@a^xc@T(hZaLal=a)}%yG^uobr zHj?Tu8C*1#^nGEO+*VJiTOV`<-wN_`96i6XhQp(RdadQ@=*f|7@u@XlGdlpMX|%&A*uD292W`n4;-GKW^V4i( zuzCX~#-;~PY~)LY2KBWnek;9Zce|*rinoe7J>RN)sZ)-9p_%Qs_?UZ~uU}0A&kXtQ zH(wxu7<079_L%$V z?gGPa);<(_EPaa4zCJ(VS=s#bLLs~}(A@)KZpbyrwmv;xlr7I7^cNIG5PX~Qu)xn< zJRped34MVCag`W>P|8Wl(i1MBM39u%HZ{WdR85uU94aYq*O`e8WL0I%Di_S7wj}-Q}KdzA^9DB3S29D`WS-erzw2=ukrF3L`QFnYVepUFY&K1hW zvy((}wn*x_>Sn6Xj(mt#c>o@BA-FVX!_b^nz>w)+?Aj36EJRDxP9b)c`V`~8v7PvL zXe$#fD-ok1$wy1GSwVrP$ROmdCHir=9vWn*PB2#-Xb8m=N@CKuhvj#oUetcXD%>zDPBCyeie)saMi6tfC8*$Cg5PSE}JPG_xjOMwdMxX&yyxDB{7 zr8D@4qrIi*D_!znWfvLHlUU-G;BBGr5^D&E4i*nE=1?e#*nSY+uS&d~vR*P_;dHha zWgbDS`LGlk)8c$4$%S$hEvq!fSex-IH<-?5yffvT=-&)3iY6=NnM{avllP0hNWJPI z4q`k;p}PfUD?+WIp{xW5>09YQ9r~%}ELb!dqRDhi60js}WQM8VEpz4958<<(2gaE< z<9VLQPEsbu&LJkXS2A(W)48Q|38GbxS)^^s+*fw%t~S!?sOh$cW9=GRif{HipgeJ4IFLB)%1g?dcI(>)PD(`~JPi0=!|a8CpnTOpFhS|RKn2I)rp z5m8w6WX5M^-{cPCn&w!6eP_X)G~xkh-pVS>DJ+4~D9cs^C9!JSYPJ8Xn+P3%8Tq~L?&Y4a}ieJ_=>^L#^hv6!#)gYjMXU*2}ep1_JhD! zlh`^F*zHu}TkPm1Dr#6S#>rYj$*CKNaezBjZ6iAJ`$SrZ9RT(`)!#_K*Z}a?=n5!$ zu_3ky=!E$r`jd8UYtt7}05F20lmHiEfeCPhoE1PA04}3eK4jP^=#&ge2Ub?_k68DX zI_UT@b=@r>qs2$`#*%h@B)^MGLvW9)#3i>>E^3j{RUqp->qy zi+HtEyox+rMISXEmyZS%(1I62ykMUtQC)UkTr;k~LP0dQ@$|nmXIH0*g^&a`a+-4Q z;sk2*85xSg2o-Wtzy{nWQq31v{fOz23ulCoid+`p?45&uC z>auNkLVkf2KqV-Q*iEWM2to{mbW1=RRj;Hk5>gPg5L(9k@i`k05GKethM<|L7j_y0T{pu6^+<3^(d&+jRz^?K!ecxUN+tx8KMam zb<0L7OW>!HBuCjlL`d$jscYdDdMmev;?$QJOn0p_DBl)9Rz8pK_oza z%}Ka#3Rx!rIuJWWg*LK9EdU$+L2#-ZMRH^GG1|Y+?6SynRCi7@4 zk|dDDEJqYz1aJ*21bTr|<9hR+TQPv5Sro&daQ7CRQfeI;Hi;loVlWNFNiXAkLMR;^ z>(VVCofd`N=9YMGBn6Q1Yp1Tj{)zi0j~N{x_)bpm1Yssn zSTyyxS|8gV4eT${T8I<`K*Gt;$2b_czy=p;?cAre17eWLpY}+%xvdx@(lE!sOsoyl z&}N|xUo9(3x1&QqPJqrT;H2)VEOqk;c&T#7L2i&fb>oSts}xE-@Kix0wt*_7^ca8} zXeGQoQBvKWs*F-Cfvqg63An47-9;~04{UR+rHCJ*wkoy_$ins8G!pBNGZaDk#9^Ar z?-U3p5<|deut(Ly6OC!Uw)j%$F<_K=qRvdFmK6u82+71%d#ez#Yq35xhUa56)*)Tg4Khb_ZI)`je!x^J%XbWDT6&jOCbD? zwE+99*j!}a;sj_xgQhf!WP*Zi|1{BU5H$g2^%p8xMMA4&MWyTNAj1ZveP>U6D;@SK zNBZqO@ojYKwgFY_igvY{;5(66JS$xsUceW@R56+8gS1FlnFC*1m)=Ro z>9Sd(9go(eSh3mduQD(vkyPKI-U0R1_JrQC4*+QD`L5xI7JET334guP*vx;i)*)71 ziBc&VVpC%nSY(7v{Bfuw-V?$yflsj*dJC_7 z@eU7D$D-B|aU(-v5=@FioxGTpvZ!*q&OV7N4ywH{)X}IbX8p%WQF+pLPAY%1i$yg| z#VV*%(P99Z6wP}N6je+mZ?e~@?T8K3Wu^5H%NoHLB>&4+LX9Hg7ARaVG;-h zrUPfxS6B1m9f=SQhOG_JwrCD3g-aahlSZE6RYXAalL%;kZ-~>Qks+iQMkLVOnupD} z;3R|!h^WD;B-Z-k+a9k;3Az1(aZA)D9TG_avy;>+dSv}Ba#Ar%Wdp>9#XxYFDN|X& z@1fEaX1|T9ZXFV!&7T-uiQsFpaKn!7#5<>3)2*n3NC&89dxxem_$rM3Tz-HCTHC>2 z{By`O-=SYWM<^1Bx@_is_;Mo^u8fGM>6^KSEvHqR`5Jgl84$Ek@xz+x%0JCAy|;y1 z8+}x3hU1m;eT5q510_slti7H&EE->GLa>^`ZDwd=u2t!6+xAF^G(8-pETSEk8d&-Z zzLih?_^)Ht2zL)<(t1^3IrHN`i&ZmdREweXRFJ(y+qQ*mv@|X75 z6dH?D+o4$amF5M9w=&5(`$QldvGzw@(U30T#aN(#c-vpKQ}x%2yNZZ-Q4PwpDB89I z((~&h92VWwEF7f8t-1BQz9Af`g#y+5kHHPqo0{;n7r_lTRr5<|YyB=RLP}Q5Gc=*Z z-8>JnM^1+wd5B;1wxLt-i`@{Qf;;(t5iRGwef$s6a)K56VDS$Gy80Er!H^G{i|~4# zUyG$L@8^vucR%c&5%ykb|Fjb!__&Sb)9n557g;Wn{04&U=$^(2F zq;Z44;V1FvdXS&ie+6D(dQO6idK}{2APUqg5!7~frHfuW#MAk@3JM;A5dT@KPA_)M zILwRCO7UUd7Y{Xn@mGgcZIt;4PK0dguRSJdk9kXnIq2*LX9i;CYu?Br43)hGT9vz~ zdh9K6lwAYK@=&V#;fsWbb?3LL`wyh|Jmok0(ob0(VobDero|P!RKu?bsbyuBNk}b6 z->8Gn#biqK+hO*!%OW!{kJ;OhL?Tt=UKI_%|!&|+GU z#DVePpYOdsNFt7Fp@y8gXsie=77pQ7@`%1M)x}FDAZ*P~P$;Nz+*(7v84lo9eTq9` z|21M^Z=CGVG9qGOI_+FMR%l8?VcTjGq(6jhi|PmBD&xW^93J)`r5{i89e<|h*{~aS zRB$Z$yO?3YD`)w1Yp|D5+RON-oTgpr7*DOu(*3;DKsif3g=5v#jt21sQ8vcn4}9!2 zORou^w>VEwf0?>47wR zL=YB$gBkK3j*xo5oB4wX>3O&%Tj-S+Oer)pQc6Nwg^|)&6ge6xWr-%)%*9T6Z)W!- zxX*_|_}P!pz$ocH(RdUoT_kVWj-E1$2~NAn4_X^^tPa{LNsZ`8*IFaZ;!-cp;lccr z4224p?qZz!OVVf&t=ULbeGfTknFGsgOaUuKVKw0nSuCAn-Q@)IUr? z7Y))alpZa;AMysHoq73sinx1hO0cP2x?iYGro~8O(Nai?5|+(}f{cPoQAS5~ayTp?%R$2u*uqjp& zbRZlh%}B{{k{!D-KgW0@T{s$Lq{rfjg-evAy&x;hD@5?MjB=)#Oa6tWm!@RMP^CO zft@8|Va+foOA6>kURnM{J+vQV|Dm_ib`;=K5lsB4rig;vR?3Be$U|+V8xhMV=N^4; z`mwFl0iTZCqrZUy?WB19+f9JvC3owc^lCdPSM3X?7;0ZPps9CaXkN7wPSH0=QU=8#s+uUUpc4up zEW&z-)BuBhouo%lZa`=020s1^D(Q@`>*>wT(tN}l=-EYjfI7zVC+WM%;j?u?nYcd$m{-C<6R&O*VlU0^nhUyJT_AyiyYieP*rY7q} z^5c)iS9cte^&3SpM$hR_*LdkCbAq!Jxry zN87j1v;e3Z*_L z>S=GOlq=rK@s@_@Nq;1DT#?0YRMb@%LSHqJDq#`NDkeF~%3bNKBb8tJ>V~rHA6qk9 zFfCJpsnMG_FyTTCoeL}({GKVw^~S<0CNP~APeDx*+O#SSdA$w zhU4wmT?}MzDK(2canh_LE6a{(aUuJ)lv*@>^?RfJAK`E>nj5`PwWxGV;K7AWFbskc za_(>U#aV?*t`>6-rU?kAzoVsOjS!7a_*GJ}?8U6C_DVX7#T`;-A4=C+BF2o!%~HD* zZlbrhl3MZ47@c4LQXJ$PxGmu#H5~NcMTPq{roN=UGeS|m*scl9d!z-Jr`?vmH1M8$ zBbmBNeR-Kl_;SXU&G{*vSqvDUy(T!et5hV8fVytdG@xBczr=V;NN{5xNhO=xr3q)@ z&Fvo7zasN!s;n@lQr4rqW7*Um84M9GGxUSI)j(ilgcL}-=nJ_JJS9ZDZuNt>@c%&| zB<^n(aT?(=Syt9U&*C~mVy|AT#7(t8yF{|`TK5&z$CqxoXA(Ds}0#x8nD_w;8-KeZy4#zBn#WN~z{t6vMxk#1c zx*86(r}^M(6ZqV&>QQy#7A&c^;7&%Njoc(E?U)KFcBM#FURPZ;NeEq{mqaV4=Yazh z^H(Z*;YPVJ$<$Fau&1Gcog%gKx&~Ay^iTuuM=Mw6h8ig8-pLXCU%Y*Hd=%CCcV_0C z*-hWD*=!P0b`whIgf2xh^dgWTNKqgGse&Yk9WDvdr6jaR6bT>-B2|$E0Rbt3)Bs8m zBoRcq1od7Ng!g;S>~284zw3S9&+q*wnVp$)=G5mr_4_QY%o-`mMLM0rHsD`D752M2 zXFKIrWi`bAZB^M%;{W<;tfmTR#|zb1K|{|~bod#3W!yoiGc$1k^{v0VQnl{=+;^tg zSaug4Kj#}eo9KotK3=r)-T{=)6<4_rv{$Mty%j8Zpn@POY0=BsNH;E@#W2qi#fml~ zEH__VmoICQ}qKo&##Jyo8HEIHJ9X zQHU^wWyPn0fid_DvD&O>=ouvmQk@7jRcznU(Aw+?0RK zurY*MpoGA#!r~1OrQ3+oWpx|H52`TGi(BW=ol&@$`#y|f*|@m*zoNVD7VdcUs0e6~cf zOLwr6({PdYtiQNam3cq^QQ7Bd9f}v);uM8ZK^49GT zlx};6)Ou_SJ-O4dn9ekVNCjA{K~C_SkAl%0K{?&__NUX&2R@~q`40|AC$~e1v&bWr zI2ZoX0cm(nwQf)dWG%TqAZbCdDP(IV0?6(SD0~g~VBKZ05Ig?@JDNjihteTu`{gtd zffzHdr8e(RVky)?cV_=hZtzGeQ~-Fz`7@$uOlz$@JSN??Ab?tR3fJk?;i`>pwbn#B z4VjE%!Og0+!nFHU6)Ux9qjkgW`E4`-7MR+Q*{P;T9~RpdVk%zGe9loAJi4Z0qws&# z38n6BrPL);8m(-j;Y@A|8V~V%N}AVqH|^yPRXjb~X-);+p4siSN0gsDE81&Ib#>_; zO3%=o>Xtn;Bty#)zt3c7hwTh3OyCP5Y;!c`~2Wb}7nU zs@OxT7xjU|CmI5k(^O(BwvT8;53QnJ^j@;geK1rbOs6i}uJj&sb4V9P$NFdv^({ALod0Jc*_u~Mq1wB$ zBPesh1V)>eUw9;Vt+2Pi-(WnJd)QeQ2mlF9~>!5>Z>V{rel9UJ!wBc{Cy7+=;$s3@n z49aXPxo$U%qOH@||{`Y*`21ZZp_Z%13l!2CED&`TH|i^K$5~bVP|2eq3#3m!Fu)GAn)rgG;htRYIL| zE}>8km#m<$(`(3#iCV*{<~$@0yD^hB3KK*J`3g3hREp~5}6zYXgvSL*_DTt+LK?KMjT# z38E{-aqhD*#LMYZK#E(;Wi4Xoz~IvwUN4eRTZ{xBpKseki{`TG>JRyJXf7)sAuJsa zFlk0&VU|ZxqG6{N91}P2UfewIdk^qphKo|$j*AX4E}g*u)x(QZkI}GsELK){%D)p- z16a0+Gh>1$oW*-B&G$Cry>Rj2$$qv&rIP5ZC>tzk++=Ek*$bP-m3cSE~s6k31*F14uUl zsVHMuH1uyuYk?G_+ztl{R3>EKUgX1F&OL+FC}+DvuJZ3J*>^`K52n57vw z0GDTh(&BFUesGJt_8DdL(<0SryJ=8Atx;gH05ec*ze20Cf1h34-r7&A??`{pS4xst z12tIsYqh#wLkZYt+-2!$4g4^~ZDDc>Fs|aNdH{a31#J`c3u}(>@h~p<-Vruv@tS$N z7+5v^wMxn|&$|9lr$L3TgvKDP%mD2jaUvEo(>C(GV(i?6AYBZJF|(B$c^!&c?stX= z<*p%8wfu$WDqMA^d$I>`w8?R2yLEq zLm=*&$FLtb>B!0dSA&da@G$L^P_(}tUVk8>?R*gfxSUE~)Y92Ip@^LlD2Kr~8O(i;#`S+mYpvb`I&!ycr>{*bzoh*yp-t~l z=}WRr&0f}8hXVc6&*gL4{sNBVH}})Bm$f%^plgEYP)_}u(Ukk57Fqs}EtB?kvt=~) z73_oM$cBhEZGknKjBVxZk-FEGi~;i*l7V_E5M|R}#mFrZT0jS7KzYX^jokh8_N#Kx zcDyPZ82XylGIT{S-ibDkFU@RV@jiOtHLU{kgn|gy`Xb(-Z(q}b*m4z6$pSo(6fEDmGe4IPJmwz9NN4=|O8E|9Pom z>rZ_mM>?tcA*-NydGD5!;8>-Wn3j}Xp>CM^nS~0@S4w<4cbpPJi(YI9z4&&`LP4Et zBZcaU%n%Blpmo*ZQUcWvxv$l6(my6>eZjSSJ3(u!?-lo9!02)rDL*G_A|I;pd~Z9A zo2WJ8cQ3^tJKnB|$RYDF{WKAL;$C`mk|tvJavnp*4p1 zw@~}Z+9yi4c~jtmwrP>o*sB}!KZK-;u63TGCAnYU7a`p8ftl<}UG3Yz468N()|y#U zv}%@_v*1?+WtflF=PewSHt(huMhj~@EOhqQV2h{8RIT^_L^CIDz-RtTnn{Jzwa*`r zovf5QLu=|2pjIMIFQnh@oBN)Ka$x3TV zeEyd<nyZNnvN?0LjgG&i!9)5g8u+HHC?m0pGg!EBT>e;AMu$?m#3cH(vtCyps0Ag@Beb#j znw9e2ZdpIdbQx7;3pbWkTy4IrxWjy{yk+f1v(n-7&B&8lLr&MB{L`uBJO}1O$10ZM z+gh&jf#=-Y+S@8Sj9385IoHZTvll|1_!bFIdR;(R)k3W`1U)#W)8dum?Vg&2pjJ>( zb1HHtIB3*jt+mz@w#x#Bqy|NcwPIz4=c6T%Q)MA*VMd;+*gYlhY9aVyVPfwTCCbCz z)3RWb^bCAo;|iN0Ql%AX4(w0snIEQc8w1fldu568R}l7Q4+0fLcEeOEv|J_3hS zR%T)(EnK06_XljO-ty`gT4+)7LHqz(qZvV6=<3nw{3aTPwnDo`!6wG=4 zYA-SQTr<939xJWY=T>WpJbz0x=%lh+a|VkbhA-bKCpGBBr-nrfJVa008f~76KEiE_ zih9hC@|3QFWQ;bJG)C@^iXTJr?nmx>d!uOB$66q^xi3hNdkQ{=(OH>Ghu6dExtCm@ zXiEgZYF6dMWDXSxpj80@8$)SdX%T={Ehve1#{4^E)nZzg-8_+sOX79C7zZ56<~({Y zhFlx9V6uG|ud8$6gb~)<86%%|^$Gd@5H{n0S;Nh+=DL2sTf>DJ(R5_97D8|g)?wr8 z`?VGwD<5|CIhmJLF!^&T_*$!=Pc~s)-Mo2KWJxKS92y-fZ*?`m*a%^?tjNmkqDTVW zL-qPfv&(ts!)hEQ3mHXLj>!N5B``K)3feoLVL+7T1M#sooeow%% zVjIn3wWfyZ`bKZDi_;?KZP0Ag7dMeKFm00-9V4H0^)W7G<(Hb}^EYX_zSJzA;Vy(B zbCVXO{EKQAgha>6`(1rHxw5i%yM2+{SsW><~a=2g|xNFHawyvTc9ePU!;L1ac1 zGy9koea$yNdgP7Js!**{)}ml%ti0FNmzt!k9I$rtF2+|dA$5`KbTiDl-^03OZ|;mW zVRjAIALnB&rqJHJg1*)}g|kDdDmO@pYaSgdZ*?`2|5)U>*{^xeM(X-;vs=Z1n2L`n ze>!Gf-s);p`eU(6X0edUlB8WS3uY_{uBuK@$rj(-smps^DSRs&5HiSC_*>LiW5HJt zsH7aUR9*p+NFv?2;CzBAgp3+s2#i$Wb`KS!#0IX8D-$Ic@jQlzcx|9oz?BGtY@oVu zHAmh)GH=Gx)BJF3sZQX!$3A1o)C7W^*Tf{fYVvNQjOY#{Z1~ z$`7|gWQF8cyhHOwG(P&dW=1sb3^3kBM5EwgvW7uLHS=>Vq%5p)(*t3RYd+Wh9M%{V zs2L)#QDpM`>%hjEwDy z)(E6m3ZHwvctH3h2%nQ_{9bLLGM|$7Y2yGD@%}#TNzB0S`!t{$7w*`S3~!2xiaS2R zrvWmNX3oRc(RRxALesU!z*LOL2ZYU;Td*Fo3E;q zAvCT~A`8=k7?`L;VS$0Zx%)6Xbt}@saV8lVx|8n1KNDvXd}%}!YE!bcx&+p@NIMVD zksU`t&6n;$p0oGq>QSw$dSn|J$6!Xs|K7*I67Hebk7>`U$G6eVV_KWY<05S__5yGz zMOw~)drslt^g@d?vi%ekL;06Ggd(rE_V|A|<6{5a83&5CZhDBHqW$4~18o!Mn~%16 z{hP|@q3^7b2b}k;$$992qXD6BM9_$@HLLI7@di?rRpLE()_jcb8e12=iJ_d z=ize>8WhufXM^`&?ceT4wK9Gl@53{{E3cs9^U*Pr?g$cN(j5_0{AY~w+vA~l3~k<+ z)}PQ;iS^R|BqU$_KXg)S7rf+_)u>?HpJ%Z>Q<%HGqT*z_vHDGFc1jxw&%?E+v=V=>L)V`_ zrxoHAd$INuURivr6MU3^oQ4d{BPhM#Jfgpo>$QiX_8kWepK&));3UlmEnHWtf>N8( zsv*6>;fd4jv@&^mb#he}s+STCxGHq0M1vv>Mkx2XJCSd@swoz_x%nQap5JLH^tmM} z2D#?%b1M7}q`4av_P!fM@pXUw_ZcXRy1%-p=6OwIM)D@5H}ghe6N>8tfq*L!l1q(b*kzfY}5Hvo)VyCzZ;O19Sy$hNv z`1Pr7xQK{{&{v3uBk@pVLYjI3grOU)y`cU3R6(*YLEp>1c+(nTiK?8eIPALvGWv)>XB{^HFMRPsHfhLvQy2(R<=$b}+uJT$zh)kMlB zuZ6+~0rJPO6yyx5XEU2efXgaYFj6*E3&v`c%@Daz3btR0)~v{rapj^GE3!N|=(9{# zK9m_|<|3g4o=vrX0O>@Yhm!O_gYrkrvd}wIrkA588G&J*^*=!Ir93_FGUPD$yj;dX z0os{+3I2JvE^EK2Ti`8NZBR6MLLMJNL$7M1rNCjOG)q_{-M^}xLa9^Nv?fqII<9M- zYx;9Z`TRRA-ds|eaK<#5G2ikrHd4mrO7XPjI((Zp7D?G*>vb(IY$>jd1#eaq6n%LS zm4qBftSjSr4EdIyFZYMq;4M>qEn-D5a+&zIw1^(Lp;d=?CLv^cQ+CsGRyue?J7L)q zYWv6u6bIKU$x1Zs{1KX?g;aV6uDwU*W>%!)m*G0pFNt-rezU@j5!{KbSUe(Jpv);XLc4+R3be<;vU&@U`DbGwWZ72J+I{eKaMRRj|IkUoa*pX8ckoQm+jX3+2Y) zWaf@_z$FnjeFXafpBb?#Qd=jc*-1*fYCS{>$6y*>frU}hP3T6Km4!Q4NrO{x z2fMkAGTyvgA@C-SIolHui3``k(g&-vXuX-hmE%8aqn7m7k(NPWhW-%TcG%SQ~f$ zgNjq|smAs#(!f6cFQX*FzDMTM{{_!-Pylag@c&28a+=%Y>?5?cr`nWG{!2>$Ns$uz zj+$`XjWcl~#jnzrxlH*6UX& z95cxEo7Nh?2K}b3fjR&zqJuI&Xp&B&?`T~>FAm?)&ZtE}R5+(j6z#mL)u{3_>?*Lw zXb-k+%OzVs>2+Nj&-R$)boI`ks z!uc>;V6pV1)JL2Sr1#KI3|1C*nb zG5RI|Wa`Ea;nb%dw;mnDxY4m!kpCu;>R}s=Wn{Kf@Zrle+WX zTTV(Iz-pKt*3(Vr>JIE7ziMxhyn(EtY)+Ynbve2=5Y<26W?h}KM`p)Sw7W_Sy*h|x zz@~Cw5G$_&n(y);)<>NKBjWXC;A%!?hrx66E`SL%0}sOwTdLEd!Dz@FIy9J76$O49 z%z6nw?Qkj@%-q)T0CkY><_%%JL`5Yp&Ot>(*dy2iRfi%Zcs)Hn6kY`|XX2MWBNQYp zk}`&}Sh_qEo?01H?OD8ak2*ffp2Eq)4JWPJ8)s*#vGhagbHq}UZas?@Tqf5rHc{AP zVklzqNIPvE#_GxUV+)IZb}9B?GoB4=!?vCxhqIoj`nln<0r|t(YI-?ei)Zsdmp$$f zwm?Pfg>>OvajQ;{=bJDVtKbfdc6JhX2zP9rWE+DH?HpxAuqQ?Qg-kr2?g=i($|=fO z%G&U&ol@;=G`_Uj&R$YJph}VGQaTNeWCQUJ0U~z#E|LkYVuXXeh7`xs9jq^YU3cJv zh&$*s#7^a-NWuhqk@%&WN!y=O8ClA+y~;o7NO?I{>t6oJQ8;=sLTM8b zA}#qI;bG+ky(v4_uAQNRF6|R2p;~uczjj6vLZn=YrqAj(4+>*mz!3SME2Xz7c9u7e zi?{Z2pETj)!;B+lRUs0}1HWWlJ37KLYa3I|s%|+$B?&CXbpQ_xAne?Q`> z3afxq3BW**=D;vr{}TEDn^k~z2zZe<0V^T^3g&nk)kjg3?bLt?pf-T+XQU+2^agO) z@;cM)ZGevAfO!%OmZhP*h8vxT2olb7G@&7DjO%raM>*&#^YM;BfCJ6UX@Ng?sxqq4 zh}rN)#NbL!>edKeQ}Dyf&vbZZHDVWp{P$90)>3|Y$EANnd5+_k0(((RQ??WT&NgL_ z*tUOaHJ0hd_{H4z43u=x@z|%>S)i1uo3U)j)T^7Z=kYJ;QT7aKob)IT)h=Xvj6GT= zI|oYHdG(WZV!8x-MP9JUfR6G85QO+7pujRYIuJ2^0#0!-;IXjCb0v0D*&QJ--Rne9a2m4(Unq(&DnL-vA*i_*t+3N0Y3z~8;&+fK2EfHv z_qw$P`#cGZeT9JZhmbTsjdg?s{zDq8%3nm8P|A9uJrXM#=rwXE1HB(37f$EG!s}D{ z=1im(x6yM}xJNzOTuhZ`aC70vo#9#Bf>jsue5fVssrAF@0>h1i9%}`n2F6RoRrVFv z{mdB4vABkL$LY^+oIz`UMxyF9lfx~ZyRFz$8irQ{jIqfvfQ+g=sT|Z`ORaV)%p78& zZ)>%2Q-`J222?%fk(KfWF ziPDi7Ku$7NdNB;}en*+nXsvm}P}`xSnz7#d9K=F+VrzzYE}e{oF*RTnU`~XIl}aV$GcE4V8ZcT^T809ffRDm1#$spObdkdxFeiQk3jSsP*Li7 za~j&9Y<(t(w+ji@yfX&htq{y)0M;kw(Ir}HHeK|`D&a|RuME#hHEwPUGz#HyFQ_Ww z@~>BPJQ->F{@+~(077`D2#_>@5W$uV`Di;Ba9Mp5#fBJ|G!x|m(IQ|9ary&C&h$01 zc`e5zlKM5L| z1m_duegJ5NaAfp$-4!@g1eRmye7yiU@DUl5fU0-Y(BNQT@=5XsnL_RaxU`N{Z6IM{ znPIAQS=!trVtBAi#6!%ypui7c#(A}hpc;qVzGUh_zB5^`5fCj=s>Jf})hsB9)N?V^ zCS6m_CnNl{TJui6Nvj1eq1h;rTn~qT6NUMDi_rk#Hs?}|E{HTBY074>jreKK47v~? zNc6*l{t$_-iw&cgl-W0UNr9Mx=dl}oWE%TPl4-DHIY|sz6$F`%Lm-;VB-O}FmXj1B z23e446=r)$q^WjSrX#Bj_6>IGP>D$i03%b!A*Rk1;-}CU6EB4hl%wq@4<;%Q7LPdS zye{fk``#H7 zvH*tkb=4Q>ZwfqWoXI$LkiG^;P2RqO_Ukxnkc$aGKOIDc!Bp$kqs~}3&b31z zpRd&>$dJHtEJs-bGVOGy8w+l3YM=w~Ma-++Bq5q0!#)~o0{RG1&5P#a)A_o%8GJRb zQAtNi&-to`7Caw8nRpjvqPcOGQJCd0`Ib0uBt$zs{(3JedWUq6fJs$Nii zz*g0`7sT6c)TEmr`v7X>~y^)*CRyz&%gcmG|}W`z-Q$HfCvarUlDMT z`qqF*x|ey^QV}!84C(I6060|M9e^!~D!oW3f;Iw~iAo1RANojN)|XuU23wU&l&%bN zQ0<&wnXD!0-_+tX6$hdga`k1oD7d&UtLXak_k0=(`90{8UaT8K_xrLq*lWCD7Ct=z zDCGDF!a50pYMdD_t^z=7eD)e9>@`_?>(!vqnam2;YyIN2zXAy16O)Fj8{o zwui&_ri~I7S~u?g5Mz=+c)JQ85goXmbae!)r>r7ZHX93{?9>#fJ8dr>8bE0yv6~<~ zj%1sZgYcAPPw7jy!ubBRXUX$WD@B-ASON5cjK%1um1Z2O8?XF57?`@wk#39Zvd#J zyZNiU3Bl0pAF^DW3BfSN{1tCPFl;q{C72Klzni}jO$df&V`Vv)3BfQ1zW~AD_8lqm zxWWcYlA1L+cU?V8$FfO6e^Nb|Wy&FlnX>bo*J8fSr%Iy${ zkk^sOc5ZzOI-^6B@D{e?b;?VI2DHOltP|CGCE_WOLOL%!I7Z!anR4G`?|3a0anwm| z6OJ!#Z+ET>6}B6lN@?qwR#Z27s1((x`HAw0r_bB0gQD&_Lmw_+4K2IQ2-{~c<)moN z4eziv3fBVM76ZQ6uR98VtXEy(RQsP@te)o%43JzN=MqHl;b)U~ z**0C4nmXWWK%A4ZMIf=S&~LaUde zRg37irL5Gk_dMQm$+ui!&1>V0GvCj9pJiffv)*S*)HB}`U&cD&XV+!ynEBlh`CU)i za_Gt!xJ!6Qy#1PkMmMQrrD3a?)${HL>@ne}Yk~Skc?O{-``54$G~`3J1+EO0RjtPj6{PAN}fI#)U z^(Z`<_OFMD2n*^HHb%+ttocOf_|xh04QNer`8LL*M=wuX-IO>`^$dn^o zK}J1!+6a~stPz~XEk-@cSkuNHUxvlu_4W=j>Wg=6h{voCEk8ml-a)ngex3b{IbZ^? z7!9aohSN?#+gMH6w@=FY)_NQImM{Aj8`{YGW#j_0A@XS(JB7|XyB$@cpYSto41HS@ z;k@k#4lOzn022uQ;BKLq*g!WafZKu9_SVdhldS?KoO&S(WSMSw|pl1&-Tlrl9 zvVHKi!~El?dk$!?>p~_vI=| zlrUn9{Q|t}Xgc_XY=*H{He=jgSZ>k*U&!w2Vo`n>Kslq^AQ{d+HU(WGbg2o={*rxx zZauYMs+Zr|FO|)^_OnV@p@#}HO5zmzyaUXs^)n9Bj{JW{QSAeOwMAE^VOVE(txU^%3^x7^^6S8mg1$01Lq)4Ahpv3PadSMt@3U&&W*ekOd~#s z9vo!z7ctuwn)8jE=wshVBbVb0cDA&(C1Gb-aY|?W+QCk*o)J3>JA7iY@$(^JFY7@Y z&0vmbEs7QAGriLLm<&&%(J|yEtoN@_;|=8NljarJz!5zn7_MDQm>0Gi;!3 zR}*7Bxuvk3V`Yf!Zyxn0wotH2i+{%4J%>E<7 zJXiiH?1M$~ZnKe~E$$g5cA9uwIId8SU!~_t$*)kf%abrrrUL@L#$EPcz@s>k2i(P( z(VyntMf-Xcrhf!~GZDK(NA5C*@Onvor3Ah!Tp1 z<500B(7O@P3$bP4(Vapu8gjIZ4^hI#Qbbr(yM@0cDxIkIiE)fhYdiz{uR7yX;qa?a z#`fVron(AHK9R?HO$Ahe^SYR&3!GO$0Nx|WrT{D|$XT&&HZR^CXN z?s?bBJu1)JX0g3XeS>);zT}LG%LU?c!)=DkQ{r;lJaHKng3FEa@(FRdL0;yI%ili| z#SV(gpXFsxC@zsu3U}Lt@($IG3Jpu3dH%a#nm1K*Q2&YrVI69m#jB(MaL2ZZwubVW z{K9%2Wp9dVzLA$T!f;t6FNcQl4)BoL5XKXO_u`JPU~w1<9zPy|g7$FvO5bq2vLAPR zuS^NYEAzh+?b>3#Vzu$a=wBCFe6LvD0PuiH9I2PE>fNC{Ce+jG#2}Li`aJYg*!XeejUrt34ygGRPdl7th&==>u-;1X3P#zD+Q63d^ z$=8S&dfa<6EYw8N4lp*{6ywm`j!~PmO^oGOJFg$P)dc_6z4{)EzU?CIwet#S(RI6Q zQD`Ku7KRpK7=+S>8F!ac>qy?GtgH`TLzLYZ$!jaO=yD{lgDT=2vWlh-UMF5w0m}u# zyL~lX`alxSkhowvR}KT~_AceKwCeOmp8=a3VB&A3d8;55-dP5+!bg?IJ!SI zibwHxcg3Px??v%s+l?j6SOQExZd?Trh>hrE6zrxS(XUbbQ4De;CpvhIdOLY#K3mp0 z#mOtd4{)uMBLks=gge4kC`Mx|-E{JvWqqw`HW4SuMd}^RD}?RF;S9SmCiSM6)S1zk z&7-s#|022-3nK)N% zw`gvRTpT-MxI@39qQkW)B8ErPV_mp~?!@pU6ikRk+pkcoSlPGnv8bkymdC!>0TM!xr(mD$u364 z^JKHZkI>?NeE|X;%LD1Dcv;IU@v?6l<9UN9IjRrWlDoQy4iCk!#3k^q$_mO!;DaDz zol3yKZYEbEZyqX#;xUupgu}-XFHcJ39vadaZs4O6?u(nAA~eeN27kIeUXp|7l5ZSwy(#R%>E+U z5jSg#MpMq}C!%O{yKjR+0*w8ifZ_}Kam3$>=%{J;Y`$`ch?K1svKv013?@9_leJf#ucdX2<5#C0+=`V|M&R6CY#hm|C89c}es+_{BiN%xH7u60) z;Zb5OmyOrEG(Cm89`k<6pL}a8vb+Ykh48#bY-B;g0PTrH1^D5`P121MzD{4EYbn@R zyW!Txot?4ot-=P25lVa3ST;qTrgC-3j>xr@WEHDR__THKEvH69jWuQOmMte*R)tqZ zM~+sJl=EH{-WI{NZK`ra7A&Rgsyy1Ez!J6&mbZQj3<_@>Y89@(6{@5%0Z+vA1{4Zsz7?AZUEHkrOYvhQ6D zkx=NNaCXHF6pB`GRZ-JuW-70s?){e>vak@Z=j+~o$wA9+zuy@LrzZ5lSb$s2Wmv#+ z|J7P5<*&vz-fG?m2r!o7O5{!S4ULJNDr@sc^854K8SnkeGq4U$OejXC)a5zXZgh!mP8J;w*G+)1dy2nP3@#H>OOmw1!XW5rF2a04vIW0-D?6Lr4j2n`jBd zYBek|PAZNb3!tHKk$_xk%&lRCMci1Z8GF~5@WrY9^CM}@L`yLL@g6XYY5GJY9s`XFB8Qh2ibp$?&3}F|CiX;Q# z+z&7|UZI3EJ{H2rgN<^sAj4XnM(;K4Y5svA5V+`|}yH>%^K zxPq~fOfuAi*N%ui8v=8`P=e`RS2FN);sCKwd~gTl%HRttF0c*k2&7OvkdnJs}*)4cQ(NmZ*MNj2%@IZ~l*J)h~-q6Qw z-fO|FsKwHfHxo3qbxWQaw}SaxK*FR03VPs$%Ld0fyCtvTTz~OMfbYC~SxyzqGdROe zw3LHay7{#zifF|nQFEnMX3Yay@l;THYQ@`|%>}4o=ii~_X~iD_&9B!QG=J|6>fM?< z&6$Mn#gp7l(_8a4W`QUwSbo<|*IV-{kI4REU4){479m&o2Y=;{=HQ3;2H$I9HwWKI z8F%a1sb3q6otNL9S#z4nZ*OR0w)B@avZa;V@>US{hqvXOz^83#%R9v4d=!fX?v;Ul z*Si2?x8VKV?PPBov@`2?p&b_L3R>6>DuY{eupO^&cFJwCIB_j_D5bRLHuG+hc{igy zZ)A2gnRa~r9zZi&;JEv+J>;kxw7)%%iM>#2b}rD@ISKiPt#O6!wdeKKTPn@C0X(F~ zJNRmbF+upc_`l!q1tmg)nn)sb6N(g7^R6>>Zd=JggeeVk_q&f?~esO|m7(YGIH z^W%J+vYj67h^@6E1S`23UF(RIJgy^uM%hL`bmYhd;*}|Cbi%u(w6+t5VJ)5N#H*lE zt+V9b(mV6+?wyGk$TyL-(4^nGQOjJ|Mx0G@Qnk!>f72NyZxByMO2!4R7g0(&uO2n! zcR!QYLoU9Pa`EMyt_Xkk-n^oBX6I(#(5(Ts<)W#z$<>F~3`>nd z*74p0*Js1ZuVbEIRx0Sh9l>?It%|fAr9K%rK;ERh4DN{9dehJGrpqP(M;YrMO|a9p z3^)s1p^^*`54q#(o73C43wMTYWdnG8j9uRA1 zKE=zGKduZlPQT;l!`sSF?G>LgdDFm#X8Ry5rai&Cn2VUh=m1MPc)=Q>W`^|QSXFlBwZ^5*6k3Mp<|S93|<>k8?91=Z??8Tjf= z{|w*|7X6Xpa!xniP%MFhUWiB9+KmU9{ckFEawL^>iQw#)%8*Ek zdlIip>7W@ER7Uy7p2Ycll!iUY8#j{M9nOqm$#QeMBj>K*tk+I9^{-NAl2YcPhRngf zs>2@h4w5McnvIFzzEch${8qRb#R6c6yCpz(vLRAQWHbY8cuBLg@;c*n?LyC8FKHiV$>Q zKOP8)D8Lom5MvNvN<;z1?Wtm|)OGx@+CLpa#$({kA6SgR5#9#x@iq7gjqJ&rTV%Vx z@Jd~WdU7We3Kx5VM-#g^tsbD9d+{KLUrn^vTO2Nm7wNHHypcFCUg^bM(1T!3g!$I& z$Fg3$I>T1_lBQrKhwS&3L(Ij|c~40Wzui-U!+*oS(xaj#zU}WqBiV&U{zYE6?Y5>^ zu#;tb5772L80Vf(a2u&lqs@CL_Gw<(aq%brQWlaQlaimgAZU>%#*Pn;zSTKPCq9sXkJqo7u&xr;j=W;LVUcw4 zq*t)iGI=G@ifWm%6@4>hE8fWDm8-v*2-i=G91AQ}0SUYmoqXrCpIsAzB{PuK*-Mnd z&iE#L-n$C4a`#ag-0e&ygnU8RpdZ zn-gIC;@jr)`k|&z5l>~Dd!XAX{dkjRkg1Bjd(NM`QFLS)I`Z>pQfX|eIY1oeD6p^L zKN8&w9gOWbE$YW(#gRZmG94cJ0U77p=SP3 z-8k=ixCJ&GB(*)qDn7i7!!;XZS!(w>1TD}OK#qwfYlAo!l{58#!Y2g{~i92gc;Db$MO_c{;6_hj*FrXFPEKxm@o z)1rZVFqGGUgLq%mGh`4r!1-d&+!Xq<1UfN@$5$}N(oA9OS1gwLM(vVlQ>kcEbLur1 z9HP{B;n4FovMTgln+M~3`hl(u28H>a>JQ;9K}%m9!rP0%-ZKO(SwTM!fz4zG)gQ{+ ziDP#tZ)_@>q%h!TA#dMYc4#OUjyZ>)<$aX%RC5?_trh`F?yFkOXnU84%5-`d@1>r1 z3BRgHYBKAWK&II6vmo!H6Vbc84L$jB1t_@kEKMo>z;FxAeU5e1@^~y2%sGn)>*rW| z`eZo&mr_(%a;1vmnD<0jZ=Wr%?g%byc|4mV3Y}ofi}VzCg<={8JrS^0bm?b1&3rQK zkM_LDBN5cqpEi!-4y-;|1&}?oF$42{~mr7ZQHHCN~>SOVgm^CM!4AclT@LW zt>a_?og2dkNt~ci=M5)i{)0b&6J&yr&c;2srxqRTVGrFRO~;GC(Fmhp zM%SD&XrRKwwUPi)1Rd3 zj0kO$9~MhD44EEY%;VLyeu!@@DAop3=s5m^a248mGu&&Y72Y^N9}N@H7~=XQ^&J>4 z?6lOoH2eVd8;?~AJ|;7R7qfLyZ|uvqpCCtaNZ!amhX8LwB0ro@>L3HN%s&4jq8 zzM)aUp(+k})3iAiMfc4#T z7R;#QL1uwvM=7)UFgW~ifqC>u3LueYgA#V3b(7M--&z~#RC5j=iJBJAk&4AFbNI9P zl`}XkK3tJaePRi7Z1wTk5Y%eHjs)dh6Wd|-Bv*fqx*CDUwSA_`#tDyZ5JAT zgTIJFMrjF%8C!${=BMTH36$pP<)$OI^k8cKCRU4w7Q6|;{uA2%CMITCAZ1=hJYQN3 zKzRT5CfJIJRBJx}8cr9fv%ia@5z(ryPg^IFRl^ZK5-6{4ajU*zc7*MQ1(}7aM#USG z@l?X1$+HuI9fCtQWSOp1@D{goypV#p!QHWqC}|;Ip&ke%*9>3>ez%bK13+D?LOudR z^hqIXL+O;czG9rmwulcA8y{I;<7nPu45&=~IuR?{%=+p<*4M@2jfj_#X)km7KCWI` zL7_|eYBi4ua1u9tyA-Cf@teJAW@B-1uAs#|!zxnRd%Ps!2vm*@)CCH}4)YQ`g6|R# z5=xJHkC5v_NNbbd=Lh|XWsyqYI5HUlCD)koHodkCYkU!9E>Z-9V|MIM$YIi`RuH)g z=UeF7GTs*S0~xcHwT_~W%OUs!Y(d0Mj$aOQ<=d+{at5wl&PB3RCF(bx5Bq(F-JkVmT?prw46VD~)wA@8qPzDFDt z;yG#YyH00_@&0)^3e0%_2im_9WN;;wuEZ>5(4*T{M$^611LP=hs=Eq`moD_mDwvVe z3rhkkC^hKRDjb$sRJ5A+K!5M&{s8wHB+)EfTu+5ZtLyW-%+q@fig`-j;)v3L=j#GU z)_4`LhgIN5le#=a!6PVTu1uu_(y5fM{pUK zOxr)=Q`lq-ikTKN>tjAxf|h8MBY;vad<;d=Y|8%9l15Li2OAH>6`5^v)q4Iss&aqA zr;2;2BeQ{(^9dhnBBD5{)dpUltr3Zy^F+GII|nRPY0C!gLqw64hk1BCbqzOjPM$hw zsYMe#e7qtPPgbSGwx4opyb<~onS!z^t=kC4l{uts;-i%Vl)H)7Qn#<5b(?q&gnlZh z_!eA>KIJbd%ROs9^60{Nk@G_+-W3tRU-iz8el>m3QKV%%Uzk!RrBKawngm%%!wlTqG%)w+qjDdfQ_+CRT<;7T8#bkT{f({#7)5fn*Rbm4TYBz&G$KFH8~$iW_tTOg<6yWye_du` z#sP-t|G92=Y?2x8k5fkskI(Z(9;?uaD7H70Sh@MRh5-LqN^R!0)2-X#)ybA*DR1J9 zxxe9s;g{Y=tO~4K61&9KkkWTO5@Qo9-sC6*2s6;CZhr&UmpN4MuV)-o?F^qSvZADZ za|S%ux7x0{XpLjJ6m(4{9!pSP#q0{GP4)cuto|lS~H|GaFNvxgB7F8(e z5`PD$@ZwP2LD^X?I#Kdv{sJEQI5C~Vk6OsfhBf8~wt6|RD%#%F6=~hkxLCTlLTT?Q ze--EQ|B$a|Z9y=${ePFQN0~}Rvn>n#*&<9p*LB?*3d^ZGoB5nK(?DJzr={Av!p3IR zgOF1`wN51yYg2ei*N$luNRR!L)dUilyFzFJNJCnMP?0sFV6H{{a(}LiUs-{A2mH%u z3c8zpwQp$ER}9^hvHSs?3O;12p?$8#Y0{UI)@|q}LN<21WEK9KsVBptHIW%&N8QJB zDHB?AN+(Mgoxj0fg?d97-77jm>~AYj156u$Z4)AX-|W?ePW{M#f=4&-`Q0_3=)G_g z=9)qpRLb8GcU9^;%Hr_E-{R1M^rqyWcyFc9llK$1r>u9&IRjyIfO1$Et@E@%X|zu5@907cbHdir?^Ct6|J{Vb*T3Y@ zf0azcg9J>y6h%cSP335M<~OihDjoifrwg|O_Z?nA_qrQ&xWf}1{}+A+7GPrvQN`et&+O*E+G!QI;==je&;9Q zJ)IdCJ<@ah9{*NRf6?Zy*W2UY21T!?ru+gkKish3YJ(VAoBU-P>JlIga6AP{k9>ej z&l8${KybV+uJ;i8?iF2cjSZRFs*3=xYASEtnWx?Jkxmr~?9dte#5lsc*dNQv6aWo7Yd^_7LnIFX-}L>>i&dwAi}Pq^#@IMeLrmuZ8rW!#O{-iXEN^9wb(A z3fGTK5&HA$6-GtvhR0Ida=HLD%q^$C#tubdOXPLLVN}kp|4W@}p`2S4os<-*H^wWy zBlTAje?lm~Pg5d=TB{*p+R$Fr_B#xzTc31LkV9{efNO8iJ|f_~Z~8*=(<$4bSHl)t z;LsD*Q{lAe)6tO*aF}K`E5tY*j=)w1TLW+8DL>ocL~cTtSdol6>r6UaovbDlFn}CR zQH3boWm#<&p$<`cyodx%e@l;1k9#QWoG&$n>Bz17=Qj@c$XTTAdKzqWW81SLy0bUw1oJMZ+XOnFkwiqdk`}VG%o07 zo=l0P&nxIH;r3;zsIS0BjkCRw&|+zcm43W_yD8;=Ti!wfOp%f+q0d0R&Dz{FF2o{z zz)bvGT4$>nP1&z2<(iz*|C$E{VlIrIf0VI7=1l@~DFDdm8G~mys9|M2QoX7cE*@7w ziHb9dQ4B0dSvM?(>G}jnTma`*!ifD5Gj|){ay@{{9VRyX?^X0sQm1Kr+BcFWSJjVz zmr|+s6GP(Z>1)PWFS=jpp)fImG7OJ z`kz(4LLR;UHy4VON56gHujSFx@BK~nv%8LdNiypk%(|^EhG05nc0iC<+q!x@IQCRa zhMiuitG}Q^0lz5i`vf|8+Y(DhhB@M>(u6na6{eq0#xc90)*H!`KDVz8Zg&z=O6^D) zvwAt2;#d_JSpuC*V6)(~P}5vWn5qU~gIPf8y{-^J=CU-->!FI?UVvdHF zO8Zb>WIO!8Ho(#u>JE2_4F+7saCNLpHF8y;VY`6u6lr?1YC~%TRDU^G;B845Ja{aM z0=6VgdTJulOuQ=;eh?MF_&kmn^j*%eLT+ezbSVJt*IJDL zmvqTReT@TLW_@uep&+&$ILFxeNx&Ae!f6-RNQTwFUgI$IZwmnjk#27^2iT?HwkE-dpnDZM0@RMr%K_JD z-I9?IlGZ)V`sscTEx_Ahz(ubkJ0bdXELvwR54<6>zhIyi=LTxG7(2IJ^fE*`(rPC85GZs3V+Aaf>>2m1CKpHbVZaOo zLYE83YXUk?t|Zx@I8>cyF$4sKqE}(t^bc-49Ymv5YMO z^UvZEjX_i7Q^Y;^=ih|o6F#+XYa;g4Wa6x4$bCUxpG!^9(jb}HZ7gQU#cKrMXwQK& zldD{L%mRL6bBMvj6~{*i2%w(CYGubBr!V(|}YuIU! zRh9$@vV}!OWRpbkx&cWLWD5`k@*;}?LD?YzWdIQZiXv+w$i5_kxUnQEvcvzW>X`(% zc<=q)|MxrJIp6ul|80~)4zn%1=SeWPB-A<}5n!fZ6 z0UTx82%rqq?RKLRJ=;;5E8Y|GH0-);&YK-2QIImL;Smt}vsu8#qO-JIoCmP5a{E&DdL>n=4A z=iR1vx=Xzv@fCHKI(cU6m!lCuf19c$Nr|zp8vs%0x&{eHn}=-7Gnr+>FSZ7;5~n6f z^I5-wjLBNz?99anSUo|@#K@At$kfISfbMkml!66l!HRoHi8|JKAVsD~3HY6yA`KM= z)6&;YR;7=IO8(;RKq`IJCq}Wz9&J55GFwsUTT(XT%h>G++Zqij^`d55Lt4|))y=Fz z85OiYhh4*fChe(CZ;4s>69x)4Dyso*nrXeIbS^z7U3=L^0ned6Q0Vjz=tF7wL4MBs z=cE+^g52|#N+C3+uhav-t;?iZc!gK{N}4yrOjzitJ$Nq!yTU$H+5~%zq<)gcwDKIF zQD|^KjO`T4>gUS3qB3hyKPl35QQf*+`mM7La%KL2aQ5b?Gme>#+(7 zD(-?3)is|10?*|7kQCQ^CTZ(~GSX-jW|$wvy+_moUiian(l z+f%aNC-a2!Q9?LfO_jQ^-Dk6bQU}i!`anY5%7WW8YoNp!tXm9{`nOuZ1`G(=wR_xi zK!_4GNUm)91kkF;9}j4qf=P3gfSks$m>)5-8PN{si9u3zLEKTCmvG!BBr06aW}5Q! zKWhf&jaeHeRHc#~!HgT}Q3i)gL%`Og4+2ovZIorF;RWe=wzb{e0_5n0@{n5I_X^F3 ziqvLI)uWE05`7pKs+Q;zD&O7_#$()p`OdovjJknTeW=vid48xgiz#kK50eVn-j>Jx zw;3+g!+r}xss+U#ebMgRKU}I|5OV2{QPPWzb9-t+2QLq8QZ6^XV)oWD@e|OC4|TRJ9pO!C%CG;1^{Jy%QtLDnl$LfsWpda|zLf>kBNu1l)Wkj;Y& zwjv}jt?Vv+_=+?JUY6ctq)4T325Q3}YB)yfCVWei#z=L1?%h2A90)eSL(w<&9udlD~4IF!#W~E6{3a&dCGA#`hy~F%nW*r^EQb(Dl%V|O%Ps(9YlRw{M?tKy4T2b=Dd#G zuDGl!Wu6CA_qBgW1B{0t#Q+JgZ$Ia%H!##NXoj>-v(xxdao+UTo6?)mQMfP&np5Fh zQZ!wBTi3e$57>JbF!!1HhW=DKPTC`ErxoL+0XPT~q>u?USXRg18NM#xZ`F%Qgowe}t%3-TV!VsN~eNo6Mt?8a$S_l?4=rEgnfOYRXxGK-c2C$#+}i|@ z`)(K(ObusAHHDN#!U1&8{C-jpO`9dzyctM-rl>hrhvNnGp$)U}wkIEy-8a+EP%Xo zr0U_fgb;VMPKA-P(l(eL-!Xt*%8^2Z6V9w0)?<}M7n4}Dn%2*eD&1cuyf1~CKHcsz zzC_TD_oY0RDRr(?%}ejic@UM*u{3+GbX?r#MRS7T=h*scPMou-Wz~5i2InH5hHStcOnv`i3CROcd!pF5w*yUjT6< zg)a1jd4A~vDcZQl2e$TPhp)enD*#Iiu(Af3X<2Lzyt;b&M8m5z;sa?EZzuN5O}|Ct zo_9z~u@C|0c`(S8O)4?c-4CP~F)xC4r>X%IzqhxSg+uQ`rWMi3?hEx+mYVK$r`G#k zbU05hljdA-y(t@j`~TGCSBkGlrRt49qkZ3nTd10 z0p%N97qlgAVcJIczs1^VX=)8w2Rm07u* zvzzDocXG~TPj?0XM$UPc7x(va&WwtJ9+7iSbBXL}a!%&DXMn%ELh@n~ORW`BbzQcR z@%2Ksaq+H8(3cNe!S&_yOA$Hv^9oEKskHiIX)6xTe`VOl6N;aABZ}Iuls>EQ zMvGVldWMr*-QH-_dzBO1@6sZplc_=tdsp=b3eNAsq`9~7e13xA?^#4CW5~Jq~)Js zb7!3;_sMu92~Vx zdO-lDjZ=Dwe%mI!4NKuN>4raLju1@F3EL%qK{x;VQ=jIczH}twriniPTx#qI3M&_u z7aR^WubaVS+aWba)B;6adNz>1ZVoDLkJArrS>GJ=7`el71BTN797X1_rHsuuBpuEPOJc)U@sC;A7uP34tM zP?@o>w8Yavc^zW|@#4~tjbirlqK>gF@VKaf-(tG{<9VHhCwaSRi@8+Y<{;Eg!Q8 z1O&b&)#wP_7o33)Nj5V!bPD!nvK99pmRe(o&+ZgqqlQPIAOJ5-|346edIaXu z<<65w@O}8QRjR$NImeC#ix&M>Bz3}V4T~j4#fv!Z;lCk7xEP`je3>TIx0@Jdyn)IK zf*MfLchXVheK2r{&8TQw^QqNQDZGk48^S+VafyEL&vpNV+`@iR#!)z7zJ^wI(AfQhS*H&G3khKj7pA4*|;5o;Y;{@k9{xQ zMC)3~*}6L_{d62&TPc)(0>k(e6`hbA%I5{T$(D)+v=25))=V{T>3g-nEe0EG{7H=M z6zX_Vij=;YVzX}an!j{buyo8>?12s_IBjiBMLjDpA|XsoM~hQ{lhw>~l&Q$Kq~$ zdsOd8;b){R=pDd%*zz(T#sXTQ?2J^+d+IKecHKjpcAQz(`;d>I_nh>+2#;7s*(ifzn(axb$@5|Z@;ooqzyw(Oml{Z&&r5AUF9rwn z-uFW(v&T>qZ9Fekm2#LS!9dB~Z`q9j+SJ2z<2-hTJ1F#mR2935))(M zQg{9E>Kup|hsUc94R-Ni5a9B#7 z7tu6OAJnRR{b=Ts8Jh$XoI)l_0Ot>7@ly>YpPKpmRy8YFs61 zaH(>sN}EvYT2bC~&V0kmS#SxPcQ{PAv^*|24~%}@@rbSO<@^2uc=XS|8>#7KIBZp#Yj&hG{y5lFPwAR_T3Za!>VTLVM+8&VVDxbyN2X|$l{X-2beN-2hu zMp*oNJ_p=}o0yr8Q{pYDI}THCN%M?b?3lF@>=Od0#V~6qb-yir4voj0;f5fv%{G^4 z>n*80jlLs=v7Fd>G_wYf*G#iYJ6^W>(T+RPCV0~?y9t7c_|orQqwZ-96~tj71Vgwd zh1vDly^MuR=|8XNKS9cAeHK!LB#CpOI%jmqi|=6tI#1{BVZpgh_WO9HaGGmt52n8N zA!mF~Y4@d8o=eIAtGrj#>RU4b^w|4M2s*TUq*e1`7wT)5e%4*jT8*;S!7`itfNMN` zTa2*rpt?M*Np(m!*3njPr}z*<4{sg%A=_uk@@5g$F>RhR*dTiuFy+m8&M}Croe{?O z;5kQgC#Yk+nH%E;SzcrqfKDrwu|=Gt$O&Mzo`2*nL{mi$Lf;iU9~VJZ6}k-|Y!0aj zZR7FpOf>$hK`J#>hqlL}%nJUM~2e-3JIrM`n z*D$@mJ;J(&e9UqTay2r`(Z!H$JPnl^pqUJ(WNb-`4kvrO3Zj3`_%K&?Y%Lvfm+x1AHB5yc1 z-it8o6Yo9Bn{cm!HzAB5)C8J7za46Qg?0zYv8J!?u%G4ZXU+rmGs=da@7`xWliAP9 zJZ~2JSSr`^&XW`8;p&TgKX^Lw9*$4gB%*2K&ir6TY~`esbD`9R8Ej zCj4}hrE=PYqI>Kor%jm6t2h*G2sfAMTnRpifSVI6w}yqumy;yW=qd(Af#Am(5@>^d z=C9KuT*nzY=T;R%YaE(XHMGLvE&Z?!2i#}ZDG=hT@lt>al$F?!()61Po-1wuZ~K!FgcuLXzG1k4` zv4vPPRshV7Q1R&&O6@DX#AA<@7@)CpcZs@Wz>};!p*$0*PLsvXnM=42=A6gcY}MF#MWGy>h$rzjLqGQX zAV**By=a9uFJ2n6)}UK8RvIf_M;J1;)>wcsx@5&;#ryE{isE%=N0x;b?@0-o$)D=H zFvu%~3qjVKn5*4)A6v`E{Jc&2lN}ey`U2;jvdR}ycv7@VbX{>lRHi))E zFaF?T#d~V(yrOsxO3Rbb=9$&e=4pbP{0be+%V34Nx!bf$dZB+lR;Wc|=M{x=*^MXh zHV5c%OyMwWJ+IgWY3vaTW5>9^%F|4NS*ZoJ39qLU+&+@`p z>29|RZK+;*{$r&p8auBjouldUBs4j_CYpTB=q67>&+;-@p>Ad??NhzbuO2HD>)3g zs_BKI?=@BiE7Yy}(iZ52u6nFcQDf&7g~sqgSrUJM7=YBb3<4bB_ey=ER-HF}o~%{Z zYeDbB{KJX`-55x#Q5)>4HCQfe&3b7y$hW)IpElN(tHIo0&}!15;e#S9`*R%(I?hA; zYajhJe2~LOhbxBD4%8Vk5W*7bKsr25sdeNKan&z0dc>gTooDLEmzdF}Fkaq_!^ln% zQHB5*ZJ@k)hihSq1Ag|WX*aQmV{D;mju-ugxzh8c&+7gu+hh6GW~MsgFj z6MnIgj1Z0e#n8u4!kd8YTh>U1;TO~>0iJd`+enUsAne&#j#ZC=rS8`o5*QR(HdW?+@7##c#u+inE?}-**t1~ctg{dj2{(A9Q#+haNW(B{Y%!=~|+! z$mgd;Y7&AM?kCE15&c}diR`c(1go?ijC72cKxiTd(dZ^}0OKFnC! z*4Hq$jk4S5_2%%e{_Y&~F-ylcG}5$57c5pdwZb8d!8OBw1d;}Q*<9`m4Wsq#WdX{) z!fIMetA__AH}P!(6;qIf#<#$(Vve(WOL+&ghRhk7R@E8bT7Hk66ppfV%)@+){Gm`6fz(9~Lh-ss&_qFz1ZFR>B(n|Qn{+uZSZ;riAau#&D#IFzJJ zbBcGOom}Ni>V=+VJ`n}`GO!mac$S;H1AU^7)3=5xpR?GI!mAf+1;!Ese?&H}k$&LH^}|56tQyDMk{bj%OQ zcd&dBd+p+radn+lhR9vm&OGgT`BS#%ey3+GTKZs}7Y%qpHuLQ^1c`S~dg)sAJJ#TU zX*=O@+68mKq~V3bTo9 z5EtC5`6d;-EN=to(a7O)n1$mkfKip( zr$-uwo0xL=AZa6^7brT(seY)S+Iske%=I#H4yuvzDq*^_#whtsw&E;%MSjkZ8jYK+ zb!{s5Qqinfc|ylvB)&%%#>lg9cqL87TH}O&0F-FCRBZ1Lll+@En$qFTL(N7H>u--k zFyXWkg6Ybu@@WJ$)=nH8OeL?$@8I`MmnS22*6T8{RD{Njm8(!@ zTHjFTuz$#K;JHe(-;gz^|BK&{yP<;}Z}QJ)_M80kS@Wjc6K~*wem3NGUv1Q$KwB`-5ueKJRZLkWVlu@~lmDUqxs%I-nY-XwB-^FTU0mp6lVI*=Rh1^} zGMn5yw0rnf=~H3Q_0Jm5-^;C^sE}y?+zHcg)xPx3biDAnq|Lx8fvI&w(;(-S88VO2 zY&TQRHm){62^#<7_Hb3zy;WdSE@m-puqpq=0#=vRwuB>i{;bIzwHiNL{;#4|-3@j{ zt-1`zkTYFcl#g%HoElU8o%?6Yh!M-B#&hH*2p~?MgSh3-C})mr6R!imb68Ffx;sZ+ z<{nh}@5=|ok3nhF=|WE`nk(m3*oyTS>LUp;|78rdsjA9+%{>sq^J;Xyg7Iyg@d^=VM-k#2v|ZvM(UF%9|Uk-^0=}@N?Y8#1{KYMHF59; zgPArhm0txoGNe<1hOGNAfLbn-{Y2QkdMuMCGr4?V`UiHp_w!2u^hIW4g%(GYDirvU z+?@&YLz>+Qri_nd3p+{v=?)x^27(TG)kkueUZ#nPTR!w>#m#wkXaM~E6m9W3y8V$H z!{qs><#J2--3?xjN%njCbU9XlRg|zo?u;*d+zQtgAP2ld8Hml4)3CxveJsc0Vvmnq z7Z=@U`-7;l*nTYhShnC&iCT_{_+#1UZ+8VHAIr6(UUDmZDqhtS;xykD7}zdC`$YEV z%xPB6E5-$DMo#VH0^-ovMkSC%EPo$uEn zTx4H~mFR7nwo;BXy@}Tp#9HA`d+*=(RXGj^^HihLE9JkZ6UP%fV!7sonZ3akXV-K`=9-^cLj8V=W5;!VgI_q zzw3so;e0|sH@NjAt{Dv$BAu4VfEe$ct7S%Vb$&G;8$N5~I{)h3J7RUoT<-~&-s0~z zRlFyjU{~j=3UuQzyo_i7I~#?$@wCSHqygf+@ijqUD_3?9rWN^ zzN&1?2h{Sln2518e0weLwwV85%lEX=!}Sf&2mrut9UnclaWG=HSCj4bBCNXJ08*=U zF0)GUSw!tpibAudj-c*F2 z@Q1@ZojmMygv@S`L&c9(%Kx@uAbqz%w!tX+>jt^5W%m2P8{Hj<-OX%DE`2$WT92Ek z1|kkfyL!~D?Y?WpFL*t{k$o^_U1fF+KNADUB27{PyH}oo{ag}i(2eCgcS)vK;liFo8+BBvh%|k%I`L9lRMz(xhGf+P%Frb(`D@2zC3|l_aum zmossgvt6!(!>;X+hLcG695%Y!)Z}yd6-II#MZRO;gkAVKcH-A4WCvEqRV!)w4v5Up z=M}9rV4=CbLsmia8AGM>6K&-81*CDHVSOQgCL}qZ*(rlEIr~wQUUr2^FTwP`#DT68 zpO-UZo=$wujd?op`IX&rxH(fd&{<%h^WVb_bchlH*SO0JYQePQ&8f&;PP}F$_;5CI zi|&7|BEib7aTa|sP>|ru4RV$Wr3>tQ17V@F=(t%Da`2)4a`4#JY3%9KoZ_qr)#7tJ16^ zvLxcJ+#~WJBYZM_sQ6`LF!>c>l}RS8b^8FBX=}CYH8ikDeig8L#YJ+JN4@W#fIK?3 z!>wW=>rvTToVVWTI4Zx$#LLOYu(=;Vt-hBx;qd$S_})_}?zpUZUvsKjk%xACs=k4m za2!_bD{BG~Bevlw74sqdYqE0A%so4c03?2{~4QLscY5|M<9fY+K&B*Dg*a2giXC;y+a&|j$(j^ z=MfBhQIMf8=E~Bx>jN2`s0Au(1s{&~4>K%xXXWT1-Rnru*uxyDY(l@&c$hU??Rc2! zr{z$~)a}fdoK@z_Z+;p*xNZkydJ8H!Eo)vgZkRNOc43X~gL7}0yD`vn$F&1oB=OKzU8DPFWIMlTgE#I){z$d> zdpTYCC_~T6v9a$L8o_(*vO(!qEkG`~7#blITwmg*M`nJ#7oSRh9$KN7q2JEB-r6sf z^)x+)F8g>l>Y)+m@cutu;>F*8_BlB?^q)wyxdDhPd8qK5t1$T0xd)Tac?^Nb;Z8<*pscq%Lj$Zt(^RD90Ru=Dl0d4(tCu?iV z3ux;M{qbq=1%0f(b3y))_iJ@V7Hy}v-=>7x%`Pj5K3FbQmNvWurET5CO8cM$gJq)r zq8mF96y@93g%-5)FX*X}W zQz|bIi~bc?SksGgZ!zcTIh^Ge<$8i(psGJYd>BIAf5b<+pEms{PXr8Q!^`r0Oepn# zlD`y2(aoRamXI4{^8E`@H(h?l{7_B>Kg)+;e98DlevT;(igzuHuyKpK4pP-Ksv^i- zrSxmE|9=B}<>kT|aw!m8pF7Nwl?sHYvH*YQ;$Pvm#9F}+aj57wS#hf_&j0q`sV=;9 zphGv{mdhXUv6>6AyZAfbydneZ>$-)sR$T*VTA2)7-D`3!caM1TkKENG^wPEewlTWd z+SLs~`b2_{`SEVpa$SB+fFv}wtn!su^>3Ho$zDk)75xfjfls+C{figk`6%BRC6&to zA+EYzd!|Q`$B4ax-0QO9{Gc477v!{`f0t`v_Kjj--C(Qyc1)b}xj*D_B0$FI`x_XO zIM(?~9_s^mF$od#aOdXmVwC?E(D-n%(@l8;zlbZ)0RUD2fMe1vd5%DrVwDBrr{^f) zj{G*p>$*E~SMl59)Ul2-O|#_mpS~zXf#gZcXipCwR12bLQOOaK zots64TXLEjm1dsb{0ys5qNk@tqo15vM&(5zxL}zHeH~q~x6-${9@Y|iU{W>){scxC zPc9+3x3CP5e2=7bR#v{}%L;2izD<-`)KXT=!DlA(q=vfNlS$)m6dINi8X_xI|LHQf z?Bnvc^r5UoiDxF$ZdnHSSWz%ZFa3p$GuT0sT$x~t~Qwq!YUDYa64qwjTNmVP8GWGtb zQknAb6web~nX*OikEqI&qT@V|qcY{k?|DjOWyZl}R_|@=Rfs zDZkF)DWR1qw`TJc_qUH%c4Qh)39iiZ`4n1VR-*BizcDLUTw_`M;Q|#~6e#|kX`ad? zW=$@ zNU>VNein&J31eJTd^hU#W*Xc6M;JH`u1cTDA&WBYkQF zdTB=`j7Hj&2FSJ4hT9f*#BE>Ol;%h{*U@!bqFukOxqchA_?>XubUVLom)-sFt!P=T zFMw0uNeLydV8wzWf`gIKr?V2wyDK?Zsg1-5NEAwFQLv)1T5zU!-dsy2?DG}((!*Bp$UUTsDW1b);2+6!WHu2<#D=(Xnr^q9(d~~=FXau$BDeBTqsmZ3$ zFZB@@LMo|t zpK;yol7>y1n>fhIhx%EBgT){iwW=b~w4Qj)5mk8$YgKi(@O(v%O|Vle?4`88A-S5; zR{F#zDp0#XQ7K9da|v&g^?9v?b{`9{qmR~~p)o1SNh*v{Y~VyX8KWE#e{kq_jC<9U zTlj3E{OUqwH9jncaty7Q&+UWh7wjB{+CbLh)g1KB9u;`?)*e0-7g%35LePeJ&G(EA zz&6;CBf5BK-*%LlC-{(BOGyzk*U;cvN_`ZxtnF-Wd!H?IpucJ<*T65c;5K&P7wNEm zNUp8Kx>r`Qq#CWiBX_ZVdprW(Kv6K=upz(=w5aGJS?|j2rHgE4FwwHRGBjXy6o32j z;}I34O~~%T^g{NBY~&=-Wzyt1VRp^EcEPo*2k1X^L)2X{;>r5U?vXe%yA%xa~Cgz_=zGBwzrSkWP1 zL|Jt2B7KI3=njcS41fsvsPTQLA#h6fwXX|ANR${=?zapo0G7iVfvcRwsB z&D$zwVXL!4TSbQA%h~-I$Q)>4VLN3syD6@{VsC`fYU@t}zk7XdtK(YTc&qEUFS-pR z6>>-veb`>(1jUz{MnLc|r%J71m9NKp~j$9tJ6Zit4~c`>2jehJ2dBG5pSiuo?6ztPUi3!6Kxa1@~3<9%pi;A0) zJLyjVNhpf4JLx^tQm>;TyPFV`_Yj1tU?twOP+z(ALBOOc)M@PucRRHD|3*-1jJ_%E ztkh#O*OyctqEw~WXZbqb_*pJ1r9WFCD{YsUi1c-(h!k)BMsF6h+_a>NLXjwCpG$1O zh;hBZZ}m)U?(W%DNkNUPyDDKaf4l=8OlS`u1R%YH6BR-a7mKQ+ z_ySzS>pI+1Iq;Yq1aI6FboD0`mI6r{enTnf>h))w5Pq@*DALP&V`14y@h8T_Q2tw< z3XObDnJ3K4?W4TKwBT7YQUK)MM@eM_QQ1~InffZh%$V=!tMGtTfb)D4uF?3uikZdK zrcDUzNQG-JRB`^?`*HW~IumCzz`R$7^*n<1v9*~|ywGXsEp(s{#cxl~Nk^3ffqoP-<1Dfj^l~0A8s3@cU zj3*p_{`bfeeBV&&3Nt9Had7ni^BwB1e}oBnURUr8)NRHEPOc6Q&#iFaBtK_@Fze+0_p22 zLj%by0^zC{KU<9wkM5!I9fdm3 z{btQp!{qfx!XSwEqr)A6DgZFPU9;7(^vfh=ETbD3G+C(vx`82EZu>iPCj&7S4+4Ti zJ6&1T3``gel%ul>?r8(=*eQj{v~&(==ro zww3AAl@1Y8K|?TtLCXTr5yYic83-(!kr7Y#q0xg%6OA3H%oq_(t!5|##XL9yAI#`O zH)r5m+)Zy}V{>tk7Gx_8#U*e#{1G<2%h?e2lj!iF(RKs#aEh9#+!u~gsctw4k~PKig>0Y$cGN%^6s`k@J_?%09sW%QU5j-3EtVU)7f! zUR^wCWM8$Rn6rv}8di^iSG(>}##Vz7)a`vG();(XjGD6)CN%?h4=AkGE7E)7e1o0_ z7%{jEBwN5Mx$AwU5jt{A>>arOi`u-?eB~d)K&qRo%n~QTT>05$nBTt*=tiyk-u8CJky4FGTqz5nWkK%u zKTta1-m@Q||B@(nq0(KPX`^uq6~>HKzHfA}bJs#;EW4w@V&ypjIBeNVl-|gCafwo$ zEgP#m1Ih8B@{rB_QF##GaLmcWV1k?0!{KRK@DU-}=p`^zM|exD5ZK>U0=jh^1uVs; zH1b~HN-~Smn!c7I@0Ld>LJOaCl$q@039Ul&uBB<+e{0 zJMH`!Un`FQw^0|nHHLgXQQk&E#)l&FpaXLK*JDB`qv%BwH4m{`7<-OFr#`{biKza+ z0FCGP%K_)$V5>}x)&P#DZs#fz-5q7|a#mldJkLJ%@=FhcoCqA?@c`a>JODxll4#Ky z#f)aU0tnp>N(R@KmnjW)uTfq=4p#t2We(j%faPetmglJS7UN=%L35)k;6q6VPW@-; zmSlO&t1MFY7+^&%WAs+Z>y-AW*`^CJZuf74?kvC+8gnK(DuWFSE;ldH zieLj_J^xgr)?@B^mAo388V03m9vw`YU~$2>8d!9P^>b(B1_jYU$u#JSHNv@gqXHr| z9vyF^RyIEi-7gHT&fJ)CaQUA0ATl5$mEWyjJPeZWOb|n_0)}PYf072*%xm}_udpovTNkrR~uZ)uf%|^*{ zF1$)bhvQ^A`8no@{HNO<3AV=$PVX<2F`_E~g4XR)7Cf<U;sSj zp76F){B9*kTnBo@$Ec9_YQFCOel=&PPT)YA1uPj3ACY;l#!zbgQHYVoe5pvjtKK^T zgFU#*8G;plDOC5}Ug6-W8Pc#xCA*W60axX$N(=JAAm;li30{06bBBLrLZFBcudLUN zwW#J-idDXU#i}WAVBB5%rvN|5{yc~rlh5{jzM2K;MYXHj0Mnq@q!|pQ)=1?7UezG6 ziz2^^ES|_xJpN@HefO0T&OG`OqI*Ho_HGQogztPcxHr=>@5VN&vsd8`f2Hx&1F7F$ z#Vqgo)v7Vi$%M6Vxy{%M?t!;}Owpkd1}ybS&~tzo>zm%86#rRgBiZ+1hvxhlDA{GyYYD1^sSQZ zdbVfu(LvAdhxGQ?v#~1}88i1oUa5Sx;?#51=-Pfoj(9anMh@^sD12IWOBKisxwvKS9jD8rh7jNJ5T2Ht`9)O|-E_D+HdtLoG|DFxZ{hZI>O}U@5 zF!mjVIv-@;e_q`>MzBVsv)-n(g9`WQRLN@Ug0<~>&lJkcZtP8#L!badWK+NmKyFMl z=rrPi+VvG|=Ile|hp;`!&S!290|UUNQ2Q{{N+9l9?#E?IAkaKRX;tfcdo$#8w$38} z>{aVmlz$j%qXLz2$vTS;E1rV5%bQA-W!7(Llxx-N=6kA%{nsL zTopysWN!X#98*_-#fU0RWkIcv|y7n^Hrp5v7O|SR)*01cOnI?1SndtNmj= zBHJ?O{dU$cVH^Y6G9wbi;DL4*ftf+A>LIpf|B*8TyalYuxc&Cz4be}z9Ss8pR=SSd z&*J6!0%>1p(+ZDlVMRZl;_zai{AMkKMLL?bO#FLO2Y7Z^!2efo)8!X=n}3 z4wiRvkdAI%mfj9VFvPQojL?;C~zYybEtI4|oj zHe)h=yL;0TpdsN7QBylbJCIsceusczmpx#VTQ-=pjpZAw?e8ouRLUj7RQ4Qv`J2BPq$D4l^DO z12h!r9w~@E$Cm>C=YRJ}A{Li_QEev4QG)(u@UH_OnBCjxVH89I@DTt`kOAt;8e&*9 z8(R2sLf4_)21}bQxD7+L%|S>Sc#bwpCAe(-M>VtXcKus!AlCl(Gk{H>Lg3!7-(}|e zR?A-S15`(JWfuoxjo)uoE%$|2qjDQq%;Z@N%~T%EE>`xk2tf!iVAphx`i{As>?7X; z7emSWnDT>|e~!whr-YNw_lil%KgZ+9@~&F!6mfREnVNsEDBZpda&J~#IL&ToUY`9) zA}|coY!t(M&rR*3jBaih%s57XzE3?z?|-j+hk1PHaitEhp5`7`V&r)X9B>ED0Z5cm zL;B&TU_dv~#`Qw5(O^BMP)`5G99KGfE5)2p1|d2z>yOEZj5(p~76H{AwKwq*sBSkO zX{LaAR*(4|$A8hnlh|C&qr#Ke22L}um{J?HKZUL2UeY2Ac1ghZItN5N@vl8YIfoTL zx^xPA)ymLflel6f{o}M!i8|fkj1p?PRS9#Obq4lQWIB0939F^oJ=o!nHy%*&t53zR zUi_Cc;;ixpQ*RXHsUgn%^UAi0jYd`pb`WE9`q9i06OwZa!Qhs8^Q@6t&v?e{j4Orm zPDplU{D4IpYcU7nUz-xO5r=gdkWY5bzVZf;BMR#u~O~t8JXXC$=mj$TFm)=wwh!+uP z*LaUV{c=y0dOBUeVa%isslz$~XV50uG>ZjXNmb#pRx zpK`}W&p%Y=gdGwej}64kt)oBLt;zF!)WzanPij4Lc*y*3)X$p$Y0f1+iI~%|Hn9bS z>9Ag9@E@W>tSKsxR3JEsjQL39Gn~W2vKs-M-u}5qn!HU`QGFY82ZK+g%RA3F?Cu?p zpfSk$qbBX6i@HmB`ts2>Di_triYk z)eYK$smu)55v4veJjM&kb^G%z_t%*#hnA_H{-#`O^&M8R@!= zmP6+W5NI1kDk}S~x+^O43MmT?!fswc=VBfi{0j8#*E?JDT0g7>2v=gh zc7^XJM)JnpR=B@+N3bhYQQuGVrz%N6m0pPm4oeX2n%wPel0DUJ7;)g+(YOvLQ`F{= zuEQC!HZp*679^^&K|A%6i!0$Vrd0yv>rl{y@7y7 z(UlTc3;%*^`c_5Yg`sHuqg>N#eO0p{PBPP+#l=B%$WMJ1RS$d-cnIO3IL^xp$n z6mYi5c#9AHRmG(<2Tf)iO-PQF=+f9_fi&=&Pz${ppdJu!h*b6qFms*@RMP|8Kosun zqG){x4R@zfu!dGYVWb&f2DhTtOZNqUw^iMQZha7>4n>4}c}m2xTOOfqM6AlPNc9)t1kG@$RiVqxhbWEviydlP90H^Gp|5^eq9022L$zprZ8&Jq zkaKOcng}oEP%3}0%tjxsdrp##oPHsUqTXouL_9`p6<$|T6;_usy^4BY5XVK6w*Q3y zGS>>S$bzOL!0(@)5<#COD?#8PtS9) z5J>zH;?na}8et4}-8na;vrVixLDOL@uXg~`xFAk*TG@>j;I@8i%kL9Js%HJ&si zFUH?FApx_txEpihmg{!fP)}ui93l1j+}N#MKu@drKXfncywHBiIFGd@(d z_k@kwG(h((r?(qm>N-ZN8>qESlNLLyAJORsYBWqq_Zxs4Z{r^IX1s$alWHKNA04dD2ADUZmCx{%4R1VbCun}_SZ4r^XZzGg- z`u70*oPeK*qReZg)<#1P;^1n?{YJc6N8^fyv}?>$US=tJLuMj{H6*`rMMI7?R_j(j zYC`Qb^kHUVjyyVYv!vDJ`btsLn@CX|_8~AeQRV7K7Qvg9sQS~GL{%|Oo)L-GjY~vb zyUVTkxhzqQW?D+4R!7e^dU}p*(LO#Gr9W(4o|@Z4HS4+J__>$vP~)L(%Vg!nH9`NZ znvS2We-iY9Mm13tbMA6ir`6N%bNS6^m;bWkz7KI9dTCb^yxIHY(^PGa&g#;%qO-;~ zx4)l+_EDSBslHPbsQzF9?Q^=hWpjpd!?@_Ye57^n|j-aTRGxf*LcC~Et36J*mC{Ni&h_{AwL)LJpPc)&GfU_Bmav^%iPpLA+>SI7k81y_FiwLT?4Su&}f_t!f4KSb$g8SzQJ8iK14j(f9*H z7sVZsha+v&#X_ocR9m&X2%*G4nbpIeqomSn{#2vAdP%rJ z#UHgTfLD|ngKswflmQ44%iE3(VAw@alXF} zBYjQqzE(#ukP541rk(nV!vgZW&Q=i=nQ20dz6MI{q9$=uW=l`IH%N314kM#vHEJ+# z=66vO*}X#&X2I52yN!`LZoX9wT67&7iJ>ag>#9D1LkFFISJjhQMQ3!yd<=P~tNQoA z3#9?R;F0O3nt?arLUa9>NCS_-(3xDobqsSMt((gA?F@Hrlej6LNnDN{{o0P8>H*v6B2ODtNB`KRCm?PMtH%!V*xay zJBo3^(9x3aYF&2aV0V?F&$+^~{;v7ZMllxwH~Jig^>&Jn_N`M@kBeqe&o1+)+X!iL z!O|I_%ASyV6rb9;T}CZtdmV{G2-Zaqo&AE}x2e!U*dA9d<_WkEm?{3k@4$8Y2PA zX;>W~5$BnkL`xdiPxWS#7aWe}Ds|}derhwmpo5R|ssVTz$OoT^RLohv@4+1+?wRc} zbCj43c{Fl>>UfH4L>!G90BIe<a$Zt1vD@|? zrsfIRR4`1f?^$%lq~#tkXtfx;{`Fz_NK;_Xzh%p<6KBdxEvXGGio};ye_xibmUd_# zi&gFe5!8?u0noy5dh2COrC$RZzjs4B<-Lr}Og~Dmo9g1mbMARrZ6aXezc(Dam%WrR zLY-*bYk+F$;c)DZ2W<}YrsgBnjx5cfrxlD;d$Uuce%fVfm^ZZ_UXhBsVl^5#T8%L76*W1pxVHt~Zozp2JSlIq8pG%%hWIS-cb*=NmkT`oIej01 z`eKZF$q0lzGigl>&*dFy=@5LKgVNN)BAlk`zQ*@6X|Jh!#XtXzR*+%WYR3w>R`A|a zwSor*#^#G9|E3rQx2xUS#f$m*sl{XrMllEfO)(5>SX-bMbL^?b)PEkuZ2dRIFhFE& z$4=gw!lxGV(+jaF&NXkVg;3-=M~+8-;iKMtrZMP3ruj1HyQQV=gFx)?jEbH2!!wOT zol=H6$O3PTm!_*n;k#GXyTtBo(tbLIxT7$bNoOsBn|ihyK@(=EUXaoTFBO>XEiL2^ z1PCX_A%rLI1AyzzP&)$BMWlk2D1K0RPbO+4XR8e?x6Zf<`s63d$;M^?(rPxwGTZ?h z#6?%!-JDv@R6W@qGB!1c;>NT&jxKuf7Rw(G*h)RxP`~v{H}RucP9Ofo8Pp@ z-TcayJ?7@;gqvTqz%V#=-1Z5z>w0ofHiK< zQP)Uwn4~VUU^IX5JgWV$UAN6uUlu;4%(?1xJ|BbqvpqkCtb1R#$uhY}exk z2D9qxA3%q4)xq#V24&4*aiKuIy(ZY`w~*=~6t_SPHGar2H8Km%2RNT!p!y5qN)rbF zg=QkDk%ei>IR2-wP%SdCtqRfch1gbaM-y7Z4^~|S>Fqs}v+W{vp#d}R`43gbNjWnQ z+6itTcn7bl&QkR-CbHdwePd~`KOl_X1E#U<8J1z~UOUZ_ZPkP%XHtUiivWAeD^0Hk z&2aY%%{*z=3iVG6zw#TS$5OmK$U(MG)SsCWSy&12zJwB1s%_cq2?-Viax2w$*tPPq zpg>c!Pn$>5{V1ukr2%EEQjf_CHZk8`?0dU-+nukjR!>wCuPI#PI%C^d=5(>UL$ykc ztHLy{1s}F&8rNm-TDcHd(Cx>n)VgCei3WKmGGM&&y2B#iQDKc6#+cL6tNUT#xAvBh zbitg6q+FjwJ8fBqeRn>^`6M!ywPXvsK!tI`>LM{p>=+FW0qQ5>mJ3!XzvU0$^1b%d5OW?ibzn;0pMJ-O=6|Zb zgD3F)jH?=If2J+SD14VX4TqJx)Q-4Vwo3&GnzL@9Iu;|59BDoQPUjx=IE&>}p((-VxNzFQXp4`F z*_+uPioW6x^4nJ`LvgCVm#;jp?^Tmg-Zy*kLHBSr|60`ysAa;p5Ut)L@BM0fTuj-| zDx)Fu@Ax}E*{@y%otJa^L6yfT`_Z!EX@Sm|!)iUo^40fE*LD;!;{YF@W* zDq5sA^HT9>BDzovO?fdrC{`1&ipPJa20!U$?xXSeJL?$dknb>&!!6OZ zH+Bo52A5M7)YEzCn`;UVN;{_3W~;Ea1~CYH2YdCH`jPNH<$RBK=_E(@8d?8`xNm{3 z>3I9jKG$USPIBTTIVbm%h#(>o_iNbdQul<=y3^8DDWZBq38mCEY4M;mwA!j$lU93_ zAZe9oDeCU8Bxq4eQnaYc_nX=KoP@XSdf#uo-}=_d%9*|Q%sjJaX3sqHTz-#x-ci2+ zd@uR+I3!SbuYcW3K0b-biiJ?}4-2L2;l>qwy)HGW0{9p4D~>F|i50Jnj^wF^46$~#aeN(!KP z=P;$dpf=})oOS4VF#~eHg#Ib_yq{|L!kkxJSRJIp8_5U+n4WjK7}5eGHwP7}hWMXF zCaO3I)ZUh7PhrS#Fw;+_o?-BuJ9(+t9#ODf|JiRI`nCNpe%!`*!7unoF?(`aI?Wc8 zRu-#rBMQGDm~)Q`A&K%|Z5W0V{XPUex_~W7i&-eph3`u0jfyaI=HCS^d|%fGJQU07 z&PBg`!&F3mPKUZZFJJOCEL`pW;ga8Ou9?U<-puLVc-gOjUkv#TOez3ze?$K~rOEAE z=ZxoadjY$ezqHX~v?Cg-lm%D8p+P6!dUI$9jlAX;Qe9iX3JtLF(~_Gjlbf_8eQ?dM zD}+UjlHE2X;_QBPfSE8}6$s!ZwuvuWFw z&}Q!cl>0p?>8;5BFQk9Os;W1L`uy(qA}qMS``u4O(yr)(70&lMmQaM!4w{s}LuvbH zp|s;@$aRd17EhZdU&pBc@7(2vUxZEw?K0@Ei*|XEXcteq-@4(~+z@>orY@R5QnzX_ z>E9`r?A+tg^cqUP)7QH9*d7j^c&00@ zY~cu?9(VkH1fLN1mtSkc#}1mZzMq38{N?vDHnxht{OsY7TN@BWQApgFZZ8gtf7=Q~ zCY}3iNNSwPHZIPvA=YM?4AU?K#p!|Ll|h~Ai(hQtkY90cZ%uy1Q^#rS?dwr==AK_Q z7FX@f>D+(?yZnl~ercQwsJM%$;@9u`txEpCtkubDxqYunZ9VS$&BfcCx{uz(7V^Mv ztfjo9m_vtS3_jv~`4`WZ$iAYwPz3$Nrp?p(wFu9^w zZOc6qTEr0T6EXb!Ycm_Ibp2(g)-w=8Ij8^YW@`PUDTcO2F~-AU^3Zb?;jC_ejwOJ- z?P~xFP*Ma-prmNVrD6b%yY3qd>q#{A5Il%HO>O6gE8a?fAIgto)p@`C7R{C#_a3)+ zGwJVxTb}ocqi`2XMn83Op`X@Lj*HddMYp*yB@WPlSQZawsj0DSBChUfSD$W-cK}Nc z4cL5^+QhNp*3D;)o(jc)9EoGy#8?EA6m!PTJ82Ltsm`Jy1$S46RY*GBuFl$kZ1Z@K zT}e~pS!V-X(`ut@|E0F}ej1>z8IrU78tfg@O`94{TdHG5yq>_gMe~~ptPO@BQd@eh z6x(5F1I#E55!VMcU;#DRn|%LcpEziJO*R=#sZ)!o=u#K0s@~I%&{nLvHw?w=w6PZJ zz{8tbfLfa|2H_$weElpR@f+1ieFJ=Lc5SvBH9nrmzA)UqNDmTOBo?2@I_w7O4oYHe z5SBE7av$#i3zBq39W5n`qbf-BeYyHMh(&gU=!l?>eA5q6YXTJ$0Bi+Oc{-? zL@BNTAFBr9qFXaoS9+HwHe;R59N^uN7dylkqRG-`XlFY4H)rA2sS9G&AmmMMF7gg& zuIG)&t3c0%(u=3y)l(E(Vaf|!8!uTQgw}AlxC8lBUcs+9u{@9t1-1|sv}&PO5JOW9 zvl0BI1=fdj+TViJs`Hu}`^Z~z6Q_ehn^EO`#jCkSHFr_lmMmllV!3FgJmG4sss{Y* zYnyYDWL7=83qa=aJl;dH%5xFqg=4|vc?~KnPZzdxnUGjv?`%FkirTee zTqZKO6>A01L^DD}sRJyJSVm0!wsUVBB{L#v$?n-o?ZOrnP5N#Fh2w&$PY6#w$3vdO;b#h@(y0AEk(YYJq;#N(Kp$5 zux+?>ll5W8=N$5ZBbC|qGj;ldZIOmk@tI-pDk+7;W?mO|TA#=(A#D>A`L(Vr9uryT zUNsCNOk|5L*%0|Kk;g6`<-jb`_G+$eEA7gJprs;nY!t=hjIvR!Zp>yq@KvnZ6!WTe zH`c)G*Ya97R@X5u)~tW#nr$P#B($;*ZR>`3>E}1OR1+@FS1lIZ{h?x-B+*mssqU;E zrlzkpPrU7}oSIeMK$x^)YF4K+-I*PSYCo-%j-QD2Op91$fSN6!2iB2SDY*wewhWR+ zzz%QFoqEAEvj=OBndYA-ove$)R+c5eoomF?e;#omFF$vM}Kdh<_HxCX)_{mkueul;8 zy|pq?3XrBzRtBqy9oAPxc!k1cU^ZU*lhM`;HW&>Hp^C^(POV9rgClR!gr1^F4)7u{ zIlr{B_GkYOg77q{Ufb@qwmux#vavv7!ty191t9q4B z_W9c?V-yW^RjZgj?Zet=HTvr{{?!MKo*qasPp~!80C&j~teGUn=DtC_P;SK7`1i$z z@d~B(Wp+gj$9Y7LQwu97y)Ub8nkHe}Uf>rPPAmI@oy?$hec78Bf;tpi(ju51?}vR5 z!i0WeFYlODHi4v~=7_j0m>o?i^`pMgPg+$0 zqGB7aHq)lNH&*9dxqQ!$)YtvD?+6pGtz^j@(o>ijU@vtVjH zn61M~d3i9~fwS$pA?z`afN8-Dn^<)34q-LqzUtTd;sgfuW$^HwhB8?>VpqS>Z!@ZR znGK_zL)p7x6yd0@ePJV?Vl^;|xlgg+Dx)~R0`a6-1AI8v?D6O_utY2aH7rZC1z_*<;G(7@tuB98EC929r1|~pM1@(^GVP5-#!Ou4 zt1}(!%@RV+YSfv^%X(LZ=SSij)+j^=ovTv57l!j39eAEa{2ejq!_QaAoJrM2v9^k+ z*|Rzf83jK2ZJIHP&rWyh3t(FxUL0N=4c6}!^^#}$37%MNnU5|N@$}PZ7Rbl%SCU@% zGlJwXOt$a^{4yro8p3KihK&VZyK)R0f-aZF;xLg;(PLQ?bn-PHeVxXlQ4hD5k7d*F z6O$!|=Y=dWa0OXnw%wq5<5_i5#-aW%3?Oim3Tn0p&b#$~n50lEetRaL=zowj0*Sv`VoYaQZUK5kP*;Mp(;f%;l#)Qik-%5e3L{;u9|y#Ky}{8gpKO!cqI!rnDR zxb)OAJm=;8?rKH&Y6M-ejnFZbt;OeyT zRR(MaDtnc+$Dq%aDtF`I{&TeA{9}fdQBE%gtnJsBAC{lF)Mf(KP;AdUAVt~)@mbD? zs3Z0H(8a@m-O!h<=-djh@T>HBfqJFo9F9BgQAcjvbJw z)9WnS%Ckri+K!QtM%?3Ala$YP%=SL|S z7f`fF_BVyyd~se-PjU^u7(m};v+24$v;&68LQP)CxA^(*(o0kEwRtt}0pJcWY42`C;H$ih!gx&Fl4-1(q3C-$ zHH|r?P41i1*bW0Xtk`~2jxfMStYzJePNUIw#C>%Jt0{3QXWHQ*o9O$Q?0NItT?r6p z7KEM(c6Xn}0>snO@BCvzg#gwn1hBD2ZbHb@$Eh&ynGvXAQJJ{~{Wj6^0(~?a(ment zEi(3}x^vhbr2m}5mVt{j09Ybx$Fsq-b}s9Ro=&})8ccb2EHZ`8W3S+CR!wiZ7b_k&T^TeCBIXwbA@WIoKsZIS!HQin2L$HC78@k{>!L;KQqdD(VS`1V% z+zGv4=wc_WO?Z}3 z#M?~aUNae`A4mJDA6|ETLbI@Gk7?jqVGn?*1hYaRSrBb z^zd_0W*=A@K_R?rsNLm>GAo)UPR7uNP3I^J$Ry7E1y9tW=oy)Onq-Y0;WPqwfNZCJ z;u_+?Gcrd~`EP3jsq`I|!?n{3S)sREU~!@c>;=z^_ind{)k2TNF793#q!&RZ@T6c= z(8E0fPffv=7;s)ox&DX4Bo0EcXU`_ktwn5?w2gKwW)UzO`VW2#KcYJ-;KUI~EF$Ep z6o)`$O&}10$s!MI3Rj^UAGapPMa3ePBEsH9(by$yK*)b!kInUeFt#$Vs!Aq zyfW(}jW)uPO?sy%;+*aY?o2B~ zX9v)R?g1_;T*Y29+`-4%{G7wx{e2e6b;mk_C$u#rZM}%Q@P`l3*jyt#Nn>q-K{se| zuGItLogtswLlfPQn5R>r_H$4BN!u)LPT9;_M5Olc)E1VM z_Fv-68MHWasu+(<6$s5(cX()f{iQTHfC+LtNsS@txsZ@nS9X6V)<&!=&U4Psq9es27RS__+jMv< zYg?UnC9fG)gnG){ADc_T!-MQO0hekIOz#{x9d1G?qo|b z)&D7GeAq7RLt@MC3?IRmv?dmMWw^C7>`}dukGn07aKQ0>{PS`CdI;o{)=grlZGI;K9`}c1`{c^ec8$Qoeaumf6WHS=fE;EjQ=1~>-98p$*t?GtartX*uQ0yH z#sP4*A6OmhqFaDc0i#&DXPU;eNwGs{-w*7Zgbi*#7^F#bVn0hXWCLjP$0iPnJb(k* zI_hKQ-K>@oR;+}g1 z%2s5)bd=?zie<;3t(;F;$Dy&hNuM8w4hKgkBXn@;zGlJnWO!UCb(w1B8+phHmWbV` z%?ZfD#?X)x(025u9{28t*{TLd`W{+!DmZCt^G^1~Ai8^k{rnFAat$f}KP)(8zre7- ztX++r$%`O&;yhky2b>I?~;RVY=ZBH-$l|{%WKM+B=P@O+zEj40g|H|F!SDY6xGA8T@*#+Q6 z$6jWa(apt&(eGogpm)Z7is>_k~;Iv z|B*CbST50Xj1ZowIJc%)er9w|1FU*{;w$Jnwp$KY%TX&*P>x?S71H zFlEw-YDF%et;isr_-yswUCD33y8t}EJ5UyKA5m)$jxxjThJ2s5eMYtiEH(l);tXV3 zrdMFHUAD~S#Y`aC^#QcaSLmGwtWhX#$NKQBlBZoeR@yGp=?9SaURh+28--l9crthz zh760k%JF!fC0Ca|TeL`ybzSk~0wLtb+en-?k{~Lfz)^WI#sZ9T2u+jZI!KE#DwbsL z7+DQ6*RjDgNw~(>mbTMNXn|q7k@hWoj5D02&)#oIDFdY-3O34bdrt&r?}@-HP6WmA znNB)ll=(qvYE66Pu>heYa4cAbTMs!+dDJ*KDAB51qfq0d&WMPl^zSl#eR*6~gqsFp zRxNvoxN`Bck<`7XBaFwP_S0pF8rU14Ld4^-U&En9srjr-Pj>IA9j$;6iev3KTF_nQ zX0&SI&|qq6mi^%<^(eNNS@j&CM3V(;@W=tGw3fYY6=U*G%`ktSK;PlV@G3&Z?H&fV z{Mz123DjSLJr zIREJ-Q{pAFvnm;J;UOa~Zmg_20>W=fEz!uV1(_uNHaw$7M#s|7$Y5*)P=>mflaOp* z(@m5RQ}0U(V{%Leu}Uz4f2>)?Zq+esSTcUtE-bK$0xmJuR2@mh)#?%{u(5x8^I}nlDzZ zSzLH(78iHX^2(Z*dTQp+w3>CCR&UKWyfv3styx@nY8DsgSCgbvwpo#5rtse8&$OC# zXjgB|w|IS$ZBgaa6`@VkTUxJzDba&}BOpp_ss&lsSs-3ol zm351FCu;WRV!rN2>%?clGip^tJThPNc@<(Vtmi4uTo4zY_ZAnY9{PTTfrola|9<^F zU!Rvu)FWgzd&z97N=96G$cT#r>#KeiBBZzq&^P||?e~!38MU{Gd4x=nmrP+*GUCER zMqI4kSe1-RC?RKQWO@X6K5{P^-6X}^?}H8M3G>9pfsGKZ^@5f>gZ z+LIks$s`CeMf%%#$ncCBnVOG~DfN;$Rh5jm@Q@J~vx=&csU^si=x<}w--c(@$kcv> z%tbGm^Hs@+3lAA_arYrIA^^L3Kz|z#8JFn*KICqedq65i+y9WTx|!XR#3%9x~$MZb?-#A}EYn zuD=b)2xft2)W|e=gv?xCIlP!ESH*^+KbB}UB--^Fcs{L$Mvv66M62QL${HGr8dhpG z%s>q<@KvAZ(`sn)NDXUv4Psqg%~PIN6&L!e>KukOZ}t4Hc6^0uY0YFosGXVAsP%I~VuNfUH#X=J*E$T3gx4(Ay)GOZsWQ{pAF zvnm;J;UOa~mV958j241N%|_+eVtxpbV^vOv=hWyF`#eHuJ@##}F@xdOhwy7npPbKk z^i1_@%Iz>G%{@9){z)GO7o)GE`UV6yG}<8 z(XlE?j$T|#wpcWC4$AtyhLZwA8!$?)CHsyT?l~>ODp%uZ{>_rZsA)kp%d$)lIHPXR zi}B#r8e+gbb{s|>uo1>#d9~!`fxG51^}%6_x<3ry6ILH?xb0kATW%%Yp|skVj(US_ z+L2DTKrulLb+FajVbtbqjWnsfs zD^YIl=V|6)8kvZhRq{J6N|fvJZrzzEPxrKv4rE;P_G`dXD;+fCcxRdRuV3SvKHP)c z^51Nqh-%^KSKWyGq4r&^qqWbPRHc0dMV6yib4M zM(@>?lT3vn&@SaZ=d$OqS;-Qk%XMW%%#Gi-S=3Eo+%OQKVO|agyj-&E@b?VI8UBP? zB+D_DuQ)PSG##vUJ;V04M1M|^>(t3VgwRu} z&ME702LKYncUZn?s4M4bAv`#2+0fg`Ts}@&yAs-PVRs1SyBbuZuTtfK$}KPS;bu1t zcUDU^lm{*z4_w%d_2t%e4l%q%HqU0ix(0lj>30Fj$6J4FL&;S%;{eA)uFa zA>09Na}AW!VNPq>)x2hwVY)>C74YAT#&Q^Xiz5}dKW{95!3{;=krzhOn#vzRH+JQ8 z=UMo95R~kKb9CA5#x>pB&UEf6xx2QI6S-nWfQQa)DRZmDgQb6HnrI^(=ouPC!L8(4 zxSiU>1YCz!as$f>35NgXyrI2@?X95U}_76NIhSe#+Bij{G=u`M3~j*IMQ#x>;L7>{N3`YAgr@ioxR^ z!BaJ6bd6ZwtcL%X!fWM$AH>4PVk;zXWI9+aAITJ2L5+%*K8$rk7 z@5RvA(m)3Mz3Wd#~o*Y@%t?oY?#Iw63i+**2laR(H?2P~OSQynz8gFKi& z&#DVxzR{Iz!O;H$6YPpg-59F3!!>JH(3bP51w>JQc74yQ*CEsLrYz-&QQ>oV>Ix! z$f`Tu`tgS@9`PhL-rr$_oE>o))% zz^c!5VY-B%Sib^S_EL8tcGsQQJUU%n6Jz6wYTL=`)jAtxyd-ZrYg7KdP|S^#^-uR~zi+*9@s`t1-?i~q90 zZ5(Dz$UTJP;X)3NXMwveS-sDEY%eS>zwMxDJ>>}L7QNRK2>J_u_gDce`JHm#ZkkND zddksQhgSTB>7CpQ%7UJ>w3pl-x6bs!%rDplBo?_D>;SuD${q3Pg8h1Xs-4zk$|D)f zV6>e=q0$dx9h&WiCl)kcVA}PTRR_E_wOqQF307T$I(Hc@?=5$QUDJ?RO~a`C!3!p` z^pRiUIAAuiS!;&UqCWC+^ms-Al<%#nDWe`w$T#8#V)HVzG4Mzm!5tA80}y@qhY|F7 zJVIT*zyx#ff%NQ?a(nBygrGIJ`20zPEjUU?o|Mz2t(4GLJ_741vzn)#=C}*X$1Bxn zSf0k=K3Y8`_rg!^ zQ!@7+DR@dghL!)Vr)7@35jITbs58J8<}e@2hsn=zQ?1yNRD|IEp`$;&w<*(~>OU)A z(%5$qgfW?HX#rMxZ$pg`n)sZ2iU&tCLw&5iGdq}`OS7ulkMAV8!^g%` zN*ilDzg^v(JrYY8Xcdi;*Gd>PB?Z24CFHUrh_f$&C$&OSXF)Iv9J|r7li4fT~aPmp?sT zp2GY0C5-o8I`k68@;s%yEDuBIxkWEy)YHlQ3JymY^%)4X)cqBx?b2!3EAl+QldX*Y zQ_PcLL6F`wCc+)^DmFrCwL9}Q%q{5rKb#;p_y6flU)7~<+#Bw)!Jy>I1UboEQN)2e zq9)1_){>*ZVuM*n>xpt$!Xx3x?D{cdrw{OqgFMF!Bjrz!Yli41A}X)GhPV1H6Xm3| zu~kqx_+o0;!5}&R^vRz=oF1yvwN5az3i4P7VZDL5LHs22l~myFKUw|~hPC4C6iM~6 zWna(Xsa3X|2)#Xj-wo4OQS6bu;dAMLd-j#G>rW~)g zmW;FH)&tfb`q2j;UlD%pSM$L#odp>JU<~=~YGSvutGa|5w`{#IHVN7aDf0>~S`WD_ z?L{$Oo4Pkoc#7m7qKe!lVQKsxbnSXqu7;Nw=xxSNB|XRw_-zlpnxfnIEvSHR&XQdL zyp+0piKutYL0T1+=5(t3rYy&rwOJ(O+pcQ1On0xhRYp`3 zq3R>LX}+9@L!>S?{coMn?5ZY0)kn0U)|FLHXq3D_J4AL|;GI}BbAde4v^_{|LaENl z!cogc;W@HWSDSc7^_mYqkLf~BttE(ZtMv?bDC58>Us2B-xiwbI=9K?}A%s53k*njX z1yu~MA42DI?NppAzk|N({kGiMjO8bFa6<>V339i6q`qi!Qo$0ry%!V> z8qLci>{M;3T+Y$Z$`s(!MJ|);OYc#SW%514&fOGrD>}}ybGI1LVp9yn1V@ZP(p_5h zuIvmK_cJ|GGYDVxxpI6r70grOEyuNTS!wsf$hFxhlkIGj1!tU<0d1Y(;-Oc}QCawW z3FRI&MpJn}TZ`pMkhqnphI@%px4+PtE337&TCz1-2j=)EO1A-L2tlB@ zm8n+hIrXvMM7akXQB*!6*w?aYj~Knwt;R&e4IXT7>+}`3xc_O3gbR_h{D7kx9hmFy zYbnvP#=fH@8m_@q@cCdzn7Ehe5foIu$y|*@kI1&ZmbqHFQa^P4@4l2f&)*Ry?qzzG zyUKDaMY#Y;)z+z%TG5R6Gm2l7lq{xJ~+ zK(X*}sA~Q(F$@5KbkOYV6uG8F^Hi{X<@5;1(Mf#G@kWQ@B{C_y$=A*(AKPvNbo9D- zSmHW*aRx)hE057nt8w^Re$0JqH7tRo-4yi^Sft*R_K_SX=l$%`+MWMBjr>SXHmx)u zkcjl7UnI5uf%#g@fRjCHpdV`W3^S~`|s>+w$dxlHn6$o&;C^VCq)@KBTWZ=rcJG&J1ou4QVgIye{_TV7q(5m$E^kqo@5= zSat*m1Ibm-Z4IRbXZ&Qt=jObOAEHq~{u#eOK*1KB0Yv!wRC>nmHN)OO8d_w4yEp;D zE9HKZ26WObzbYB2*Jf~fLuuw_IRjTGHlvS*(w)taYkf@7U&(i2hRMY!L4A@@af2=L zcy1kN+Ya}TqAfDV;JC0wUS%8rW6XVnFG&1YM4nIvyiZB;>(*5dEm{QfO z)}6myhC@_g5gbXtl*5Mcwmp<4{V3;vPR5ZI2=r2f;IpXRCO&4TL~Y z9_DQ8?v*$2nfRZ5IJJY=A3w>DpAV7b&GP|^SaDR7992j=wHqi3J8gu3@0!$HT;SEb^d zKSHTxJ=NF5j~039^<&^`v%^-u+M<*Y-++bN&FWW(KCl(xqHtod72geB)GtJq#!}EC zTZDDXHbh;t^;>)r%L#<9>2CywxKmEbEhOKa{_3~>ww%~^QqMTtv;PCx7!J&(6M8zR z@F$$@Gidacb545mqwqjVIW50x+G1A?l(x7V!i-JoV>a5hT5$5M7lSXYtk-h52=uMj z&E4gU499{DvaYe!aL+20H}SKth`^R{4(!hu5w#7tS|SX+l}??*dAg{GrtXAEZ+58F zY$+-dOKQPazrl5PaK|8NJQuu%MyTS!->^ib#k_Phwcb14Vks>arKbiv9E-Qu{H?;! z(6)$*Kesu<#lyehi}s2d;w^i%!nyn5gP!t>Y@_`uWkV zq+`5g7Qm3fn**Xhj?#XSeWkA`V^j}kxVZl}tkHV$($N(Ch0S7Fuf4Q@>KBx|<1U^3 z))p2n9{ml6bVGmb=nGJi-OyTI@P#cAsA+>=09|qGZ@8q*dbv+u=wY#J*2`VMqIQ}p zcA=BRt-s-rR_oYb%AQx~;@>N6b^4KoZh z|FZ0`hr%0u6RSaICu^|bmxgu2y zscdv6XP+eXipb|eYN5CniPRdAaw2tJq=J!JF7m;*MZG2NDM%HH6ileq10rQY7*937 zhz{6$j z&m?h25G>qlA>zs_f5^#}!zYcleNZhNua`_G{*WhP{m1FfiO#XD2~_h>(2Dnawx=zB zVtdMPkd(Ny-AJkPK;m=0!I z?DWQ6c^U+gmV1zw4Wxv7@{9Occ26FSAHVzZ1^iUpm*?Q;^#?fo16lon+*sQBMNMUl z(YoWr0J~suKwAm~yRwg<6}GA=n~Tnv?`^L>7t- z{Vtr&nG^@EtdzSJj{HGprH?3wu+(py3#M$d(i=sNnw7V(2@kO-dD6heR^@qki;T1? zEd^s$vFcVh)lLoVP6w6&^c9R{fV-)$V&PkVYd>YUm^KrF6Bifwnh4syNNwu0qU9fg zDR^DR6ohNgdx|o`QfT0&DOCK&8N1u%uhft*mDGaP&|*F5G*MoQKwn=WowLG?t9Vss zJ7otbi2+}h`Kl{0W7l){|0ij4fKtc2{1YfP^D@$ask=B(vBG1>3MLU{gbFkEy=fty zn*0D#9$=?lfqG5vYc+9X;W>dyj3tk^Nv4dC9CrF9P^o5^39qq0CCOA_0Q*&1vu~sW zNXuNn!|iRtaSUbrDdc#DMb<@0#WY%)Cfwhrrd|aEM?6$IjFr|3B!CD zY*$pFpj{HKZdexu6OSip$L*F5`gXo0RNk>nu>L;kw#D>|U8#xBB_LR-V?77xL+}RF zCRh>7LH}T7wB;=$7<0t9uRA=L&IK#Y0N@!FqPz)L|GYqJO$k8Wn5~$E#UaXLhAW8F zRdNR)#Gy*OR7|Zyl^7i!ycP}^Vr_va4d9-kN-VT=?}REHxQZ-m**pjR9;&p5LrYVK z(hA?g%MPWUVY!jE{bqE~c85|c>K0J9b>~tqV4tQz0bv+4|B zU%>!^#TY=}I+dG-ZzZa5n4yvkQ&{Y`5~7@Oy|L{R@R}}z=ySBv1Q#21zmM%(x)Y{w zPx8=krK1tKDQjb|FnTRqnS$-&cDORgveg$0E)+WJ>mx!@gz^MrASDsXv*yoWdh-D_ zj8qaV<-y2eqO3k3`(mWh9MF^-Bb7916a5ycL`j7tM=9+LGmMlGrG$dmb5TkQL9F=p zi+~(_yPu!cw$=}I_~vCyuZe@pPf<#>0N!?P%;ck9M?---9fc<;O^jxS19L5d3E{fm zBUiK%!p^*5wtZkkc|R&M!WyAxv{DN}tR_Y)4W&JlAFV|3Ug6WH0dNPoS{+hO+cuL5 zIV6&R@&he@Ex?vl_279*w$Ci66DSpSe>)|`h&p@opU-G=jKXDG1u;qj2px~Xtl3S~ zTuM8{$#}x0yu)Ai3L-#Tezu|tI|AMr?Nm1weX`X(Dpq+~f)wpQ9A@%wG_^XGvzX~+ zsZ>5=2sGQ_&BCaAb>(;Ifm@AN90vHu_f1ev8_E$Y?_T>T8dByPPD9$;tu(oFW;@Ea zOBRai{F9Zcf7mF5m$PHiZ`{g0~}tItCy(4h4+rT4{8gncJ2@ zvxP7%@Jm&5hKzb1U$%1;p5tykw6Hj^lbt%NXPKsT15~%Do@?F8UTYluxNoeL*XfMo z^~Y-ULpq?bCa|oq@a7_e0^2+*H^BnkQM@Vm=-_2+?Z|_zBTzl{PgJVYls!v)?VcCW z9G?~iDxGOUZCeM*|80SluCZP<>B%}+s}FME>!)et&BQFjX59t?zg27?sBK+k z5x(2lLE{l%tS*LfCDlt-KEM`pC|SwGPpx{&0{m>Qr_{#J*?LL}vS;-8-br;*@X3GR z9+9G$CFw&#G>a}&9?~>?@vUJBj`3xwm_J4u^Z4)&@l#x1T=nQQJnG%kPRWm4JDVhM zHGb-#;c@(T)$L(P_z!$&LC(l!rUm}9o1xkZ%z zxKaauAd;uFBrR>K)I)HPJx!Gn_-W8g85i=)X-i!nz?5=uRC9A52Y$|;rY+4dE|;iP zX+k||14T5)Zn}b6HdlC{f$7b$R~(`B&9P9!W~Ii4V7H}(^1Wm+a*YKbexCNj8g#iO zPM+w|>{oV$(i3TrQp|Y<4s_S9MmYFLO*s@zGGkE@tKjr|iIt?3x zk=mpw-Sy03OcAgxoPJ2d4sN8BZQwBYNCmW3oQCD=Y2);Sc$10uYkF&?1@@=8t-)m+ zp|h>AOs}DfGZIqh?KVnU$dy?}@y0_i3VzLfp5}uwi+*l{p)yjisyu@co2V);;pHk+ z^cUg-v{mZJJaEO-{TAC4V5<%t0nr(aYKwKdH_gUVfmyzP9>*---d5pArdhKRqRG}? zF_HgciWBkW*Uw5w4OqF^Sjz`v(*{I8*i6G8QyPHi(#JT_#qE?yDEN9iw7xfe)lR3m zM$m-)!_owp?#xb5c&(ABux@)L0$de*n)5QI8h~*)q`eXruyVGQQ}FS{KrWe0Gutao zL7}LK(FAw5Yb$A$PlC*z&00 z?S!WEbT=hfn}l`p%0}}Z$?1mi0{~n%rK@$?9B5x*I$-avT&uqGu1#f#q=mIVG&aQL zhz;fDVh$t&)vvT?RHKK|L#wW?=-^hakgjgPoaOlzmC*AC& z456%M#kqsZ3>{g%>LJ(Hh>fx6;^> zg&SW32rtcuZd}z{SrJmc!74r*m-g9I$IrzL)T<8`3L{PLgZTxNfj(HWfUNrjCTKcc zc|uud6|<$pCoi>(56G5=O1uK>1Yy7qhU;}Ids69&&P?vByk-RywHX03^U4ANU7XkI z125fl1$ zK!1h%HcQ7_+9_&P0=Gp7QXt0N-yh2%EbaPZ3)?{91C&NM2&NBEA`q%DuXKh{dd>aI z00r{J^*5@>u-4xYvY>-ItdTThkP`C$Dqx`&kFcVlJ;}U5geKftY)vx5a0U=9B4FXN zw|Kz9=5fX(b7?uhJCY~e-}B^ho;)s!{q%ZJlKIMZo;P4Jl4ZMihSoee<7ya^V|nsi zG0(7yCzp%6t)5bn%-ci_qj~ask<5EaiDE0!16Wl;f&8-TDSXrEWPMuvJdPh6`ogK@ zl%U3PgkXAt!HPuC>->g>?rg`6NZQVCXb|Yta3hKy@Eh8K6@(jDsIqZGpt8VLBOT_m zQ*pyjTZ00@Nd*oUG}E=8T>OA^brG3S)@)*B6pI(Z8D)XW4AZrAU@~uwH#U-mjvr3p z+%oobcGE_(kjEe>U^+}=qY;-;))eek+^8i2HOgAxULGl>wusdzYlg69+(;DR8f6Xf zoTHHeMr#`C5N=yIuBEF~l>bRS7_&`Cf_HmFXV)oRTF4tzI1DwHQOp zXIPUB?J)_Gpq5KnFwD!|U-anX+^N3=)4fU0`3J(`Tg|y2Bn;6Ewil>4>4L)y-P+6& z8vDF*L<{LSH8~RC3e{_VL#|QEcNoXZqp*y_0_h~+o?G7@Sw}{YK2M8j$_olNZY@Z8 zu@$A1&kv*Oqj7xiORkN+DfHE7Wtd^^9~3i2c^R2fGaA^b&Y}+xuWXFM&5*fyY~IFW zE~x{}e}0mTp)x}2AT{9UfB^UGv5I0e3~W!Mo;@2$n_g77xTDE<(5r-N^QE`?So~?@ zc%`{vsYDy?I3G(dDeI&R_lB3SJ%GqhFDq@am>j(Mg2PYI>~)|rKx7|bhV|s)`|Uz# z`q9!LI`oS2Iw)kks$2nsk@lL>#qf@W5O1Rf<-ewM$Gr!*ht*)}*s%!|Iy{o!Dw=?E z-A4#fH?d|7sxwh!t5`6S-@wu9Q%V_!yjLbd2(pmoP67|Gko;a3KW}P3#>vW9(?YJ6 zskb|-war(T3*cL_t$}McZM{^QNn=w(L)`VIC@l<9F4_J#D3~pO0gEz8G6DwKjG$qM!1oEkkjY2SV!dV`bV>muBXr@<-rYXYos`$H$ zz|m`cpT`y=>8&;$s7=WIAa}brls!VKG7I}zZ%Um3xx>6eW_6FG{;~#O7`7+#hW^CO zJY$wATnDjoh7w_&u@Q$X$Qcf9G&@Y(Xo(O~DHu`)TW=8rG7zWEsyZ=%b}BzHUWXYWAIVqzv??+MB>$V z2rH1U=-@2>e^qq|yAxprqN_T%6$sF2)17UdVgIP&(Av7v3F8r6!@&(f@X?%k%ikIH zj~WiGSUs41coZDD57~m8rZ!(0onil|>CnmxQxHwjK~+sbQgW4l)pLkf6{aA%nuD8y z7*0x5ZpFC#ql!Z#+S(WIs%bb7#nL~~a2O#FSIUlmRc`ze74Ok&aDx!T&k_P4!no#N z6dSqrw(%BCr$O8@1gZ=v6816wqRQa!wRmK(SChdFL!imXnTL`87fl8)raYv{5N09J zWN@>Pa7~lpaUiL*DB1ZnsZnU-PEB8Pm4Vn2DqD!Y7q>Fiq(}8N$Kf5xiHQwVJ+2k( zehJn_WTsUzh>3fdYNd;^eww+Wm85dHt%Y3?1!E1cek(X)bdgJeUDRSTNxw!p!o|Z( zwf>{Dv%dk5r4rAwzu_M=3OCRSXa5>yX|c$x>Q-&KF^Hr#;#;OFa%ZZQF2X|8B&nK5 zaET8v*ouFRa!&D@$!yZhWJ-Lzb~5EcmD3LECyx!wPn$4d5vi6)@d&Mr4NZ~qD1_iU zs4Ij3=^~yc;i*R<Gb#9*q#NGlhPK8`O9-LNG$qHA09?t80X?nCluL z#4Ob`LMV|h^5Ivrr*Z#C|G3<)+x@@0vYX$b_d=C*xLQ$EzA>Zj3N1r<@Z1&UE0a&FYT$ zP&p4WUw*6v^1@R)ggX&FA&dvQO^vqiOTgARJ>kk>p$nFS#_yr)`nv*g`R(d(zDingfiCVqAnp_Cz2w`^{Fz#bO$b^AO-Zqm7gkm@dm3t z&uT>n9&`wDZ_QUOOELMSn*V{hJ!Gmnt|6wJw6R>Mo8)=jVQN8<4Kpqg?9#|X`x$b%`+ZxEAduNN!?ufE$1N+WIs><)^%<8%U{O zwP3@>Q~o@4g{J~|>LO1C@>Diz)SRQwU#8M6kb4LknRI81^0Z<46&k!%3D@rR;xXW& zpZedTrqdOR5@L&rB}=FMV5_1UO8(3XS{o)s(~v?KK9)fI2wrB${Mn93llI!naZ7vc zHQrP{RhTD)H{Yh+@WFWlDb=Tiq!>*>7}%?SmFB5){iG|!cVJj#OxdTjhKBE zC4U458|q0A#09GhF}mDYK0wVWrNU0hnzKBV0xD{QvwQ@N=$srN=V)`~bL7{i+qIoa zU9ZQysZ*RWBF?0F%%j||os*l?;2!h33%u}{7rGTp#OYd9*f5Zyj57GHZ66vWS2~SX zI?SW030;z_r|3m=hk5U~Eg2&y0 zT}o((_pZz8agfKOQ@e1ULIwM~CP#yoH$CU>uzNT&$Ds2Qtxl_Sa}{e z$cK}EiQ=#5m5A5oUhU7WP&jlQRN5PE22jPh3(!?9oGAPGY95TRxyzUuAWqDU-8&8{Hon`fnl>?%jz5bN z=a9b=;Yj(T5`?=r)N|>N2wVH?At7WFK!IztwD5N=9{^?PZ->w)$T(!QKoJa}$+sOc zwK|N-Ay8N~K7@`mF~tD>*Xorv6h8|w`H-x~bc$QGyg|<;IH-41Q`F)kkU!&K%l%+o zM5NaSvQlIJ;mfRB9w`st^6xYTes z&0*;K(Ny0|{Zw6H4eRKhd{P;xGdt0={8L|>o1Ib`^C1Gu)4{{-T#K1*rSdL=t5L{l zCD&gI3)cpl>cTholl#vo9-W+nFe-&2L>hmB@LAcpz}F4DWbidw;UDVyHNFby;;kq@ zido*?LjBJuiJq8Qc|otlK^U;|3?$^^Xv-N$i~G>AGfD#DXldRUFfkD$%5|;=IF4oj zZ;|ShD)F-WVz_Ft^?@~ldGXSIVKnecqRlxjR?|ycD&0dNJ?j%rxmgA$pzN)HvX6bK zsXf#a+Rf~ZZI19ZTd1rQ9A7$}DS{?$0!1BrmLu1vZW}t24wosjLwEmftmlK>$c05e zJGg}uhu$hZ^AU- zyK|7~LvS(K~(`Ry}#r&dFSH{JG;ePPo0boQ8lQhC{^7`O9RtYnz%{}h^T-U)w<;QuTPH@)ziGRy1xZ1nm*8#N%&1ppFl z*`*~160NxAR|zC)6hNX`^D^y59)h6YYJI!(EEQj_FQ&0HCo_?r^pCe$xzZ&BbFrdJ zOQ#c9p_*&7S>u7Y`3t1LaB=S1G8Q19I&P)MDHw`=k2kU)C-%rnZ)6jngsJ^*)uB1p z`1-WCygr|Z1=kcl5zD^}#V3AE*)J7PemT?(1&63OJPHsU@0?4dfC}Y~;o@2O0lz8`ba-Rt0z#S(3& zRyRa?!--EsYlenBPDO2N*y!{PB?m_MV{R&gku~;RhZ7o_bo%wC(#dkGJk<7qAGf4~ zB7OQ9I(Q-@-ZK4+U;~F9YT}G*57svu*MfZ&O|a0OCEtQ=f+pys?{7hF@iAqcv)S{~kJf8M=>9T-p5?%L+Rc1MD#;7X|yblRjM3 z*FOR2Z2z(NU*XRmH6dANR((>J;ItRlKEK8!oVELpc(8 zt3!Jghr66w5F>n^Q@c7>CMSn83zMClTLOP}7y#Qu90tHPk<(|)QwqAYUM;tItPn*Y zAVr*0kRIHUVy*SfXAKEj>gChYm2*@w3s%6%K8>xy<+~uktnz8I)c4b<;_dl&)B0#FQQhF6nul7&)5&Np zm|O;v6=uGR8(VB^6~w>N(wwQ8RQVCIRGUGLn1`W1pFcK#A zXaFSpe+Noqw>DE|$RmBEX(?CM0?`by+?Ajmm+K-hg&~n5nH1z*YpOA$8PRPf)@?&% zB!DWPDl$?N>cPJwgzeBLZ`!erg`6Fu0{Hd*oAz^2QBmi7@cmGXSKg$20UB+f2|~LD zb42;tfNP0*4lJ4SQ!j}9>!+q)_*oInQV7%fd* zyNQ;?Xzf8vE5z_(9BZUe{+UI!jmnPII9xW-lo`!#{V#bZNmkAZm%WIEWbqwp^?Ixp zaGOMpQR%Z-tr6mP&c;)#B$( zap*(TC0KW*Z!)_ywk;-{~YmRx+=aya>$pO)s{NY4hSc>Zu?1dZ2XF&oyz zYuRGi6L#q(!>)QupP&{ATBg;H0X`Nc$Sz!!pe;sEj!)F;!kw`sQESrl$A{g<@oJ~B zG@1j6EzD7C-m@Fh_A8Zh;E{$veYz~3`Xp;XN>9?HZ8 zXd6;!dAfF+y5nQ&d^RavshQh;_>J^hhE}FlucG`tk7xMg&bk^C98^a+!?4`ujx2Gx zq_3s_OInhtB|GKa{#0}@AAZt@pcF^LY*g}IMjV~b)V%6zX%sxNF)`iXUA$CFU?(Y; z5i9!@ZcwKzESvf8pGIs??jz4SXmXY&)Mt*;6It5jDjwLJrDfQE@I&ricn2b&Yys_g zzWmPs7~%(7AJ9I*#=GX5o=KE9)fS31v*jZ6;YSDjWsUQ{BC|~QC*!Es-tlhDbW*k( zyVhW7BPFDzxek3Kb+L06%rq&7jT&V?Fea8Lq?Ok0zRXm{O9!;&-4{dm)b75Vy!*yPY~Zl@PQYfj7hzr*J7Q0J2)J7RMM;GIlJPPuh8MyoHGDeOM#LJhL`xCNfC8ZfV z`I!xH@HGceMCv!T%YqoQ(B&|TS-5p`24FV#QdOosC9nk-W!eW@tvGJM;BV*0`%CCA zPn3UiBB+JJDxQ5HGum9=jAL^Ud{dfbLM=PR3O z3ANZp4#qYb`39hw?rx@O34g*i!ron_s_AeCTii_Z{t@4Z)-}`GBQ*a)GnhN(S=dGx z11G3SbL~zH*M-fshhZXU&;s&sK8t&5-mU!0QTNC((I4w z;fgHr-A-CP=Nc8e8AN){d>MjrC+%*$=AvOA`;!oH;pSBX>1*=uP0xan3%TB*1UYo9 z573M>Ki$a>g7)hQQGC(Au7wY^HK2jhOu-Jiu%;Z@rGn0HGG zTyb-|YEOp)S7^_2b3g2?u`9BYtDQy{U>MTE!yV%&#?WquJUh+M+Jew_s_Ixj&KvRX zc~v0;NI>CgLwiJ_c8iorwg7awG4~|J(}*WGA{|WEMx++oY2@olkoI-cQXC(xtml84 zlz${OOoai%h7dSDKt*MoHI=^@qrcGQ-L*~Fd%;Jj3-#=wb-)VvNDqzkYh_=pjo_?X zCD&-ZFbazcVv}fDIRb#(J+&ll^#^Vv-PrzJD)uXbk>fEjsSaSX#)Z_nY;*ec-53t; zSBCkaO>Gxu+oX?7D+V!D=M_U5E?1?U}(#ffH zkY?qoUfPQw78cYbs&06};*I#;S~K(#LhAs&`epm};n}^ldMZn1Ri9~@)?{Z&W>nQz zN~YE<2P?#Xy{n0sh-3-k`Cw01p<9S-}^^C(x*V*zv0La6eh^`}<=m zQ0asI+7FPwUmBoIz#(p+_NMbmjtB#fKifTyz8a_j9K(qV3FZawAgvPwLzj_A`ETKY zVS}{Bmnec+Q#NOiRtGxZ<%6^=8JCtKpEMn-P7T7`aUC2if#nlV;>J&%$UDb7IoZcj zx;KU8el&Bi#;{Q7=1TUr5MMopbjXZ|+ZIO2MOzJ1O^RT*S|XUo%BhFW4_>EraGI2( zk!D|8)qiU0O9Gg970+cX<1CSOU^kmtJn#TA<5d43ORYo8dmr z?xqnpX#K$Dg?o=C(dHYp6tQ@gDe5C3GO*<6#0`-7CR54~ZLs=1wsF4>t5190y_Ssv zOBeg&C_F@)pdzRa3aq5L!!Tj>8LIsQJyy`xpZxwXZ3`;$J(Jb8_!1IfNwV`-?*M5~lmwWXBYtTk=$^$dn)^#OedG!m8Etkg_aIEk&yNWOf`=o_o{yI3KZp=5|hH8 z-lBC-|AU^{!98RAxl?u!IwdVUd%U(;`FA~2KIea;XCkHikM&HX!2fp7L<;(E_Y9$D zT7@0AYwz3DX?EaDLhmquDi>W3MVYI=pGq5N`6=^m%`5#y=PJfyZvd?YJkN*~B%apT zT{QJ+Y?h{00bKMVWJUR8EeR#TEcSck6e{jLB{%H9NBh$D_dfW=q5pvo!sAwprMw5U zyD;}eWC#b#Ir|^b-mDcP-g!_PSI{qm+fNhSO#sMqB)$)c3s@E%zooRK^G8AKCrs1 zo>BHrJwrEE^Zi%;fJTG`;ayxeln#*l&HcaJiy5-Ce}S=~Ljzy-4v@4OHB?WR(c{w_ zwSep2^68B->YXmD#|EQ76r*_pyYZcR<6xMY+#OhJvQ_x8>>K)RdZU!O`(h$OfvM(2 zHMrfnk8$Ip;D~_QQo9+A28Cx##bypO2~^lL^4Q{p-vQ>(57V$R%s{$nxx)dnYC7q2 z@6SlI0vio>M+SSXdQAH4(&~Es6X@8(niuSK?wQP5_M*y92U-&!5UKmnv`4g?{=Z}H z|98x_lCD`2@9h7Z9dk|8k^c1NlNzJ08F!us>e|_zFek84(3ti)pBb0cdXxU=zM=oI zYiQQL^$ne3`Gzi=sjdH;lX}I*|EWnm{Qc9~c9-%#g`d-gDV3BsU+V(zjFK_7q-d9A zvXL5605&I)ckcb61k*&L7#Go<*cWH%=-U&ha=s>%8|Thzlwo84o}5A<_iH1cZ+K() z$>+6Ko$Bl|${Y7W2zX<~c}oJ2O0E3tHQ&0r)83ab)z4o;+pFv;=sI>h%KDSz(LA^t z8_#?!{gz%@LuDhIBqC_hc))fI;_R00w+E@?D^RvR_Foh;jf;7=ToyC?UlkKR{;D>Y z)1p4INE?pB_lvMQKTM-u*E)efaB4*s_wBx`5K}!-gq?3dWLADQpZ(c<_UFHP_D$`G zVtZCG0MD2U?M=&@T@+iUHMGCLDnliHCR};Sw9Az};it=32eXG3EXAIC4~=_U9@@Mk z56Zh*H%JJ5|Ir)Z?eA)h#nvqjW0#7Uk~HaXMek}&Tr;KwpaA=xHohyB*u}p4t=Zr4 zp7w$rb?{NJvUh@6i8b$Ojkyxh)OqdDL~^~a6{>ser1+sufAW3QXaHS4#QA%9BwYQz z_MoCX@!ZlKPqD(SzE$wlIPm9(*gfTy_C4KPNwUii^!-R$1E2i}B0B3< zL~TJHI`|P3EKkt&E3{iP^CFvy2(q)&+Ep;7Kn&%71S?3pnnnO3lzVyy7%cj8|$je0DIswNh(>rFqXvYzMyHoeqWZ_4qip5JQ~OWjSk;I)v_6 zrG?d>kTQL>c37S3rID@M$60FgJeV)oX{kfGRyQy@g1Z<|%;Ki$!NiY2hhCucO7@tV zXU-d2TCPbodj3sHJqV+4^}u7vV}mX!7ezciU^|i?ANiH9W=0z;f6O#o@JnKhkE&<8 zAYS`pttD&TcixJ00-MJ8e6PJ4M9eWi0i*|KX(GMzvDOYx#!fakCK(e9)bjm* z0}RVrNYVG0c8bf_YB^AbiPC1PSfl6PKQxy{)IS@b?TZQp{k#?(3e6OB-8y8=Nc0tK z0LQ{J*J1v{qysPb4Dznmet{o_x+S>&M@>+GKf|jwqS_6tp zazgoWe-NBtx#HDwg6k4bFmOWNwA4iMpG{|LO4*o1$p$4|>!(weGT1{?Mg&|iob>MA zggw@#oK0uLiSn^C>!LNKprydpW=i)Y2&3sWe!ioOOJqAs^^WmDbn)-}&@O)6WBH*4 zsI*6u1Q4}w=Xf@(Z12&8eSoq@1?EuO?U?>QSEVlt?b)uaSEoAZr3$Slx}~~8dkTp7 z4}GQ?c=^JesR^#Au9|8odFn<`zkNHTddKn^_?zk-)8b&M@PH%z$Am+FQty~X2dH;m z*a7v<=S$qij-B-N4($tHC6w}J0V!0l7s`>Zc51!sud^3{@$LNy)cJGmF`&e3_*}ai zi*4=~S|Q(zrWj91-n@%)cfpMN3H95h-EBu{0!wi-sN28P`cRAAnwKBfsl3jL1p4Yr z?JnA|8;@_IJ-cOr{l3&D@DqT+ZHxl(#A85;yYVY|bI(`i*PxPbG{^edo;`SdEgjn< zpBTN@d?J~G|EL3f>0a$I`x>tSB&=NgbneyqX;L$Ri4{|ZzmjV9nJ=UvrIFQuI5V8t z9ssZ`hB-z8g4^xi$nqzDV^%M-wC1)9AWX;>+*^q%tfMC?wY!;o79?E^lP`<5ey3eQ z0%bM*^ILf_^?+Hq2DGr3klDIyikaxN8n^5RJh7EF{~({}@}v1gE6UFwoj{v@#0R!ezr*t8=ELUAHl^hS zjWKua{ZhMwHXOnGn`zGx`AEN`<|FN?{Lq7V;;8nBeN!fYylYMX9^t`bT3z2>hhb$M zbkg=}ts@;e2II#NYI9tBfZKLCRoEzjwj9@{0v4%nwbmNbWoHu!e10{ILVIalwe}43 ze&wY604vhO8tqo~bsH(E4<_?#1E|{xSQ|Icq!ZHau$HRsyEf4W;00FTJB{a`q^&2k z=JpR%V;u#1&xae|Q2}(KlhFRk{Z+--OgVKfPmIQVBHx1obqg(Qkq39%PX@zX_~F}K zrZ3hK_A_BMr-ao#bzBqC{64T7cM^oBew$Qn_snem7gf9%m%wFau^5Lkkr z_(hAyK&Ni@BvHF8ty- zn62@^^7AnHLC!mW0So6p=d=}FoMFzLrBKN@fBc+hM1AK!ozl8k{MGaEUIj2uFrIk) zU(NYiRALkdufR%C_FmmKwEFReu~a>w*g-u819~v`j(Xmrz_^eHk3&^`S%{4~wmZg# zT+m{KAa4}{q(<$I03)@C6O~B22TtUV0CedX%qqWtB#KeZqOy@50B()}CFr%~2E0K| zW#TH-TxxCr&@*;`FuCzR9KIM2N*+RvW<^nU)|NP$!HS8e9P$THp#nDiGf9>RKr%Oq zvfmZ*%Gx<1wd<-O%^nb4QFwRFC11x!xG4FPOL17G;5G<$hg@Cpc%tszMO6gaLpI+k&N2n$=ZYMFzS6 zd1o|xs>um95S%%|4O#*nr%{7wjDsv>DGSg&nzV@Q)}c1pOJ-%WxOo zZm74jxgr`haUka;q6L`8PzpCI}P4B zn(^vn_rLC))zcH`MMyvAX>f4@Sr zeyf{wt;dLCw^NU?zsk-aWuAb?!c^lD++!n%Y7y5_I}p__(F>Y=XZb#wy+;+J6555wisWJ-Vom#OJ~tTl}=s z_$tcS^JE(KUW3t44^7uaK$j^i@qx!qWx|l;l>na!MpV#)Yu{G8WSj(7U{5s}Li7_e zr%5^}x8m9()99Z!J=eAKy$p3kiHrFDLcYMI*uWSQlmN zJD$SzphtAkwE2OP{A~*b(v)E(Fd?|X!6>r}UURU+hB^Z0FTO^Vx?u3Du6}&;xsx)K z1Kr{>h$)x< zG}mlaFI;nWi0X$!&0N_WwFl0(MvX;oS)6P>VWKASbAVUl=hmN~Z83sj`>SI_*BEYK zJLB`25jw|8I%_g<4xV1Ybf!tMA|$q!sj^x8fr>JEF;={x%%Z+=;(%-2b5PbS_=Gyd zi#EJ>h!+MVgG376(k+fQ#0!ozNiu(V6XY+5uzart<4q`X|PY722uZtm2CyM3nd1qL8h&@|L zl1NZzPo+`9p-Z0yDZKR`yLAn9&=5H(ny9o0*l$Da<+!GfL_X*GXiGd zUIjiH5!=BZ{;ILKip$DsDhhCz-4v73l<~F!oa^?AK1R2_6Y~;@tA#7*!o$d1Ip=?oF z8;$0wjYf0HXtee@qG8W}rHzV&iMeXia=I=_%PC*x5iP0bwj?zVbe5MYt3*@G-7+gD zAn=fFvnEF*yKoxtAwbRFQlucx(xkuJ3f1vK55YHcTVi=$3~jeat&PQWM*yK9*>WuA z0`r+|zkkMxzzsO~nYpb*u;aZEP0uB|wm-M-Vh|i_z$)aVwVPdfF`x{@mQv~be;ehu0nocMgd22JS1)Ob|7MZCK-(4#qW%I1#QXQzx8V|~c(0;lu^ zi=9RrW7RjTg&NE-yz%rz{|1^myB_BWfyd_;(N)81Uq4I4rHW=MZj!!W{5(ULng$O(bgVUntdiqsY?%BE+5N( z+1MOuUaPfj} ztWz(3*f0I+{q0!&JMo%&FNT9xVh^G2^iWL8N%1ta3uMSVda#QWCsvz>lCy!haKcp} z8UzVDEsdR&Tsmch8zB@0T_xS_?<&H$1<>Z`)VR{;Kg&SAjIrH>3@!$cSvn{k< zqBY4$C6|lll+j&2%^Or!Vh&9&+!Di^nq)$0Dh8l1n%;= zSN}Yiw%^w;HoU5jNLLU?zcg_#f{jO<6&|Ib>W5MV(51dS(ZNxO-8fR>aUk>1JaL)* zb07!;V_G)QvXSIIC|`Ms7P+4Ww$%nf6@s_ z@M2(L&LFIF(}3}PFQPz(4-#%RaNc_@)~FFWmZC|H03917CSh6Pv<_b0ZA0)fUV5W6 zI5hnyqWE(QB@bDWSz5!V}0IR3mW%DtzzYBFS?*w(bhvXYZgN z)z>vD9~hrbi>?P1S5f(#PMOqfi0DhLZV-*F3v-7GA3b`5c=VD7u8X`Gerbp}tEkf) zG;81Zgt?Ra9H7=`5;#mEiv!rV!-N>>K3ojOg$2V!2OKKiJsQt(#Wll4B(8YD#i&p# zR+OqI`I~|Y!Vf*|$PwZu5E+i)7TT+S`)@{e zUg3rz(@KeIIj~|Wm6^KOum-z9`+NMoJ=W&TpEvimfxs8Qjd%)nIf-!6d;Ik&`(`P} zW8S^T-+;Dnt8{qGm@qbA)?A0UuFCHhNy5ZXpL_lOL>at?{$}c2Fk8TT-BmY(I?L(U z%_3bk05(vH8Ex*xs_yltd077DjFq2L-e}R9Blba zO{Cd3)pOe}6;Wzu*CekLV zD|nf|rJeR&u4A^JAlw>1*VwqQ&m6sXOc2e~PZY{Na5Rw~EX{P;*mF4B-#?xTmezA1 zHY@z~1gIA*pFLycRmcgj$5~H0t|u7BUoum|#XQhCo^C4;KF1SfcK?lYkDgDUS@X_A zuP6O#@|ro4N~c_CqB!{F3|gFjt@{$!cXk#yQh){TM)DV8MZD-#1OL6N!m|s-b^i`$ zf_B3%97Pzjx&{@ZimNs!MMF;tsdOHDiCj-rPnc0=z$Q&F_YY5otM3p?c_$-1Ho|vF z5oOO^qJGvAWFE2Xqn3DTw-8Bqj&M@dHun`&d9Fy1zoSFYeRqo`>W0eF{KZKM+!aXx zFbmj3(30feBW_o>SB49p6p4yjSs5;voBV}B!)FU;>$MDDv>pGj7MM3tu=p|`8uH!# z5nqQ|*hHwA*H+T8`^5l&b5Zg5q;#Q~dRoJR=bAWKWG4JIE?4xWxLh>lIT4>~A#qt* zDlf)Nzx)f$E)n}|b)knScuF)^7ym^5DapO&J}=@tJy@^pHC{SP)sH5JX!e6xHRb_3 zTFk;aol_(hV@CeE2runE!!IS#{nN#r%7auhUEB+X95+K;bgcpK%rTlh1CrIWa9*)! zru;un$HzAQZ_x4GPyZ7-66iRE>Ob+n!IN441y9nn+2XqYQ{0EdVkYk$nNJIz5<^rl z-1(<44@q82p$Gnv98X&x6xYz|=P^r5)~iGNo)(Wp_;21qdgd8%pUHYi^ie8C{~P}M ze~oUoou^vR!l%Ry|1sfgQ_i#?m|^ezk0>{4f#@k7Tg{W23AXmcYWi@2h&VX@8CmU_ z)e>1ved$&znNW=2=QX{fOS1;mQ5sVA+JYDwG5=wEc+*0NjJ)2J4DT6FNo!Jobk;e! zfyYz|up+ka#;jzlSlDUqyB;R#MzOBa$C@`+VrlJ*A_03O8)cO?3DUV2#Y7i$`#_x< zN|Rm^A=mm7$P|Vj^IsCFE-2+8V+^GgFQFBi-!_4wn!@RQ{o9oIvdFVste1w|WL z@G>?Id9>(dFxP01Fluuai7t5f%SEDH`itvL z14K58MaGg=IKUi{gTr&{soCq|D&G@IL@km?%6gGWi#Lc4RN1T>e{kRHSkUw6^y^Z* z&woQ)8_nOf>?bf16u|N3>*`Z}+WCg4lMu0|4Wa$uzax z49#cBGfB1S$d^65gJNz;NE4RqV&DR=X=h z@U4bpEex=T+^q%@_`d&KtPyL0!`2jqTAQx8Ifd1h%OTbdL*U*CGw?uQ95{KX$ARbCvvXkGIA5oHDh=dtw0MgRKC&T8am3O`|@f!nQR@G%FL4tIOWQ z!kR}L-xG}`gJscgt3*0|Sa`o*{QRX;#xm=${~i32TD}j-_(yv1eK8h(romcrSp*H4 z^uZXhhedysd0kjEO*PGYA+@8jjC0d5BH9Oh0+U~97&`&%g2N)a<2OrO(uA3aPkm{f zv)OUu5|@QL1Cuf{awguj%%zGO=dfKiT_*af#Ws3inaIUwS1uF9u07Q*&e=lUmW#Ts zC(hZ8So|nlE>drJW{s17gj6jNE(tJ3LJ5gd?EE+`Ca~NAV|*D`vP^|7KcJ?;@@hBY zkpc!ja_|qZ?z2ZhRF9B74aQNh2R`uqa)|J!F92sBKeP`-Blu6X{XjH}=3abTF@8So z^xs4UA7ESd<~*A5fw&!3kngSI{ApI5$Xe%{Daw>Kx z5=IY71eH}v!Rz3_*k^?Zy4LOq8m+MxxoZWsLLa`JW$5@ZA9vIl3a#XeZ|-**b#d{) z3aA$DB7G$^3VB2;1t)l@S}Ba^ya+aR3i1b4w8j4a`c+c5bn_~4rMiV^(JE}u^68gV zBHRDo61F#o?3|EDHI^))wyQ-JZVp=gJ7cWM#@IQlMW1v`G3`x4CCCP25O%2L!V9Y< zJLHywvw3`VqT*L?ilZajL>fI`F5H4U1<7_^+-?r7cgnHs7f@xnKv3cLrhdT*Z!Wwg zy@)eD77a9h2fb*_R(SW5_c3%V1L(GoMK@X6Y_l}pW|V&{+BA+lUBXWrYb+0v*hpR1 zN~bGx=Mq?Bl~HoBj62qdddNWY36*UBB>|jetiR-iRck~i`O)VtHo>!2GL&>FbEE<6Wudr z;D>p= zrR3HhElQg3SRnS{i`BuW4^#1d$KrW3)s=m#^xMB83w!v3)bBIU?~_*ppx;A$3YiV3@9=5$UZ(1|d{XF zPy7J#U(-J!9QqtHW~~;@MEJ>H?f%aZe*7>nRJ2KfJNn#R*g2QM74nbZKFRdJE@%5EA&xG&?yTy}=`m93R^%3x2{R+JP0?qykI`}?_d#oy|}b{zw1;(EW~W zj>1f`^ecZZt-h;e49(sn_9+W#!d|HL;nBVfTG7*c1uO11?SlxUhWmXjrbA^7MAgQd z5gh;OwXAf{X`hq;8&==pG^tW77(l-Z)MfDQUor!I<5!hO>9x9erDbJjJ`e~MXkVh@(Ja$Rz1QGeJ469z7M`}7>$e% zs(5|h_`Rr;b$3LyV#4ZUb#)tC7uIP5j~}-&|9SEq6xsHvKtm)2e!7~8jUJCl3f`L3 z^dx+4E7e4#BRVLCz({GQ@-c_6r4EOL7owM?HL@@#U>Cn=*2?eP5E)|+i2#f;7Oua8 zCbUd#PMh&ACYjrYY)GOBF8xM8;>#Vzbw9|}x?&g-msMX0V41IekPpWEqd^=!uy{i} zMgJ%-B>gBxDR0nyKSD|N2JQS&lpqi7=)+>XeX$!#aqWmmq2q@^n8oBh0?(qwWE>HX zNy=PqQD)~6Q73SBL~u5d(0)&u-=OP`K8PUac1ML^`XtcEHBD1}9?O9R6rzboMKJ`X znxkSE8kBcTq+%*fAtk>j0GW?r-@w_yaz@s)##?57Fjk0G9TQVQ6bq}uL#usyJCB(h zjMtBnTP{nWg83stc*)EV#xGSL$7n_7!D`V9OVmUpy;1VRZ&!;##Wu z+|x>mP~7~~^CA^AyUdia;O^wrLp0*NkU;9XDMtk$>whJN?j~=@qhRQZTXp-Y*&LEwe(8>H*1iLRXY-AHYzN889 zb3W1i_R~%{;Txw0F^62iUxFN-Kj(tZ3{tG<3^`k+=)8oVS9JEy|G0E@8KbK1)AYJD zLDfCDb&sk~!{MB&_r&39o6al$!tbClUtrTicxk;1E)4In>3tPhXJqI$$9fxwUJsSt zXf2k&KmIe}e_KS89eOKeDwR3(Mou2$o1>_5F498t7@zCZhoZK_ocaiSc9m04x935| zDvjw=Pl=;Xy?UZ|n6@#ytJcNw}!RTtMe}4S+Asi*egGO)GKM5K)hSvwsgji0J>n@NwXX{Xp=yl^qIDn2njEbUmX%);seEO$to*nCj{N0MVQc8n z(`t8VQs2cJz&3^5GAD(CRsI#^_hdPrMWP zME@As%v1mF6Z3x8%#|^+nOkGz*J@(q*M5;-^PaxQ6-BZ7G*sgZE%WKQ-e1idJRRo6 z>0NN+w?Fp8$~fHzYMjLuAO)!S`{VR%S=DzVRn3f-)HrWd^pi9h*4#5XDn=V;vdy3dm@uBauU; z7u!3Sg71!DTXuL;LtO=yvibJDH4bB&!+7^uGapdoZJ%S_5%wdN1?*ZKTU$WA-`jk# za!0{e9_}MKpdSL)j6BmH`i~qJ+oNe zZh|}8o9lPk4!vnTKIO*F{P?UJJ5OW^Jz1SZXItov1(WFqB(SYE(Lnm#)VYac#X$xj zdhn*sX|AsUmdYe9JhaFP2Va=2FGP6d(3?9Suzvx?CXKkca|0Sby7PVfGmgqn4M2rP zcb-T0x6*%9^24Jq(?4V<9EGk~lb1?Yw2@1dN}cOZ3KF%^o1psIPM&EvM zqw{upx2?`erOPkJs=nGavWW&P(NCj{RT~uSi3d}#9r(v$gl9go5-7fxVWPglF)RFZ zJFJlKl{nd6AK}>Zw(5VA26xcMI=|=Kx+)cRJDEWHI_P)6LG0R&n82+>6Y#wB;o6}sy z+oi6BDy*8FPq?`mzGTF;NC|JbLWfW^fWGalH*xI!ihZ$V`cb`Sl?QQ@Z~z5OjpI2J`q(nt7$pDL!Mm=*@8G+(o|(gWLupR~$=;qZwWFfmn9;chR$< zLyfx%OZ$s-<5l|Om|>1yrH{fPudCk0xzB}nV2#}k^ui@w^**u;I331m@f6=p?~XDm z?!FeGeckjn@}7rE_Q9&ZqMP1R{`S(sd4PWobjQ3jiUKpYCDD`Jbx!G(ceq_zcxiY2 z9&Td5n|c|1*$&ajt1+(~q7ixeWy%^_=}k>{KFxt^c8YoAYR1Xh@OoIeMjr$WcdA)` zG>*pi)F&zLQDskkJb1`essQgHj#~7Sopf6-y}kWo9T6EdJ{7gb1<@K7FWkpUVr^cb+t~xI|e4v*S&QPzu2~Cb26prshv^dVB+*7n%qZ^M%vOM zJv9|cjH$|TwlC#wxG6yKef9m3mN@@jO9(AFLLcPo<1THDT7$Uwp8B}|ygB3lswJ4z z`|E5b`uokP8lW$W=6K{;0wKv>?CiF`0m*UsKrF3yQ~n$4;-ck_t{1ed8!Nmt<%_P+ zGz`R7rjpU3kd<1>ci$wF_^PW$g9qu?qlru3`WEJ+n-CMVc@SpxJUTi^XAl3X#JX|x zW%1Zp>OWY&0T;>!%O%@QF*Ot7sNll-5P8)McD;j3A785WWgy9TP9Ym@@|sj7(KnyZ za?tea^t#~Vx2^*Z<%O%R)2~uw6TVT6c|Y6Hgq$1nf3-PvnVZvI(DPJnqe(aD+3CDF zH5V=`Go0oB%Mv!Nxwg5ASfL-z^KlwwnaEM;Wok!=tfsa$}r=b*| zJA%lMg)P6&n7FykF0YG=7hQJCrw?pEhc|ZRU26HvF-fJRA4bEEBXgKu*ZxH&=h$iF zYsfH;HMT*SG;^3<3#ZTicZHuV%A}8m>29E*Yi70oR=~R3kdYb@Ji?1{Le|oPxb&^< z+DpvIX2W$eK7HQLblY%!3UcBe8?M(uJ7Y;)SCon5M$)K+XOkKBZ*k2M@Cs&xw*fs?lb8bNT} zC7cciFSPyWMA-Cy0o$KI>j6^b3pU=T|@HXA;{Kze5 zTg8R68&$XIb@*}T1bwXX85K^@n}}lyLLznceuN3*x$x@~^dzOh!@$I-6_>D=(#%*) zEA0ndn`Eg-Rq&oCj((eHmKrF~lakjdT~PtkBND#YrWaw9{|)L}fCXS3Jy4+6_q|>V zDF9>dU`Il<#eZPx&y=~%dd1VX1$ssTs)qb)ZB!sXn>9o(pZSzfsQ-$}E0eEJcEjxl z)#Wg48R`?$ql$-i9f26%D=<@EA*}iyvnO`#uOZD{1b1`WWTZ z`}gY$_!|o+;~T5xH?~Z^_>C41=pzyTT=Ib4O+~NmF4D^(2tPYTU*d$-6fW>o{^mez z&Wm+8{?fE!l)RWeE!M|y7&V3i703Zv7ctpb083*``-#}!_#n@PR1r-8+j79ho-;Y#)U%(w?EWLP< zX9s-9RNE!{!+@yP`^cuBfNU`MvMxy0TaXrhdWL?RsvHO_Gxc7I@*VY=rC*6d$t-=o zV@(e=R0O--YZ;~6n>U2l^@8aQQfT!gpNsSzgIsh!?XE*3?kaGAYjQkrHCRHsQ%ZB& z+7wsT;9zn90o_A_DSQ|aOy$E(!8AVH8cZigiQbpqd)6kS)jjr*2V0nzO7u_y8);Zr#mxY>~Pd_HjWDA&wsh zN_mXraX}r2^l?Dv@fgwLLUA0Hq~IK&$q9V!EnV2Nxsn)2=O2u;;T>n#@9cpr=&BJF zwilq>%A zf*`lp6>v3D3)tRjnTz<099=&@#5csf#+ zc^yeQ1Lj2p##=mvP3hQ>W?gn8+RG~A;y3+?vZqwTHcqHf3Vb!}=(M26P=c}C7JEZA9^vIU_=B+!e2idWNDsKX%RaP& zO0oRcBQ2yDQN2Pc8y|w$&ETWxgLv7MA(e@a9>Zu2c=()2#VZ4bE@i)=N00WhP=yx( zL4h`-r-NR08_@zW-N1B_2@=_#_!3_0hNmLTXvQGNqZ)4ir##VF5Jv#Ias(sFSG*R2 zy8UTA(Uus9rWJ4K^|PFkCJI^}QqXpr!^fU0w%%w14>nR3>sNY!iovlmN*^lh-z|~a zRK0}gai1k+Bkl?EM)6`jnc^9YvVPcyPq>yWNNZ}O$Qw7iSyk65{UyY}g zoHlrt1eU#38+4UhPN%?G0icGVUXA3qsAULvAyJ0fy>vlIl9EtlM)o=VpQ;9G0fmuf z`h?ft2cRYn#IJr*bYzMFuZ>LBPpARlx@6C1;~3e_PJ!6=;Cm zUQytAS0g;lmvDM6%3i>iEwY#a?2^P*0<1*I56s(C**N4#R6=-6LM0w zGQDnFPDqXsgb9!bLxfclF+jj|!7MrLf>AQKYoo6Ysyuea1r=IYrYDXCE5Y3=03xH% zK&rX)VBkxH6uX?RLQY<>L-qM1Dtik~QTm4bn%6*z%L_nM2{^}vq7B=fs3Ji31AefP ziYish447%bX!wE!0vK%Nw!%2t_GpZ=9o|!_JC-+NELg%3 z@MAdoC7}XTq7RE}Q6H~yO^SH(#caoZUmI^wCm1qlnKKpNHpP z2B}G4udk>;oVhk<1pKl#WBHoX-0qmms|gw4#7MOQl45FCIP={Iy)$`I3dRIH!T3Nd zRy7@|DJ|APXh0`kA&|wy>LZk`F*1dmV5ER;t>$KslOhMmY_~Z;VzF5%`0KSCqZh?U z^p-!ZD6_2@6}(adP&-8Bm~D%tL4* zy4u9-O0X6R*=_EiC)&m0P-&-;aY|h~i7z ztd3#9H3ZBQhDowU4kiaH5DYI^DcnE^>jli8-BIHt3=fYlki@*?#+h{&>vjLAkY+B} zrpUnz!3%b*wJ1m9$O|?4EIOd|VaXpNlB5@AO$BA!(KM{LG2lmQ(eTij_w@RThXU{G zSw+zS{f}!QE=ATt5HqEXI@#O_Ou-}uPL!L2d(2A(ffP()Sf>KfJ+Pu;WCjCZy|hr! z>N|)`X79zoKx|eZr0{xR8;8zTbLqE@2YeW(B38Bi;lC(M_cEYVgP=HXchQTL)? z!b>Ppxbwk|QG(f94f;_%mZ~FCr%b7XDN;aa@cV0=5mb!0+65A<-Wbyve*}O{5D)ny zV_B|57ozSEx6BrB`JvLK6H=9=>*da9gh`6QCMohjtF$)i5L|>r4XSY6Ygeii$u)AS z#i&6&QcSireGJi0*c)M=h&edt&J#&pmdZWmw3I;=tzVAo1qa64X)rTY`}sh5iV`ph6gzq4 zJg^W}3S78VRz60(mD36_5t7IH!3ZNRMyq+kN$`3GDE*%6>>5LF<_ zs8O{%SoD`X2&lBNm{3esOo8k#ccc*2c+-p;-osLaJS)Hm#f3X2v5=5eh!r)G(7Hzl05_P;hp@srj2h&2_y}TF}@nl5jR{Y{N#U2j6yF~1%$B$TIPrV37 zu-Jo0O#Cs|gs7_29@irAUy41lMObUNMVE>_?pm?O{nuhoET&nm&7Z}d`jV|!?5S^7 z%JL0H_gEqmdUuLas|jczpI3P9X%OjB@O+U}XrUu`wZk?xjkQG>{@gAUg^O6ru+o98 zz(Ty|v*vKg<#H;1Z92TLM_LA#MCrPwNTIP`68$ zYc3R@;<{hD3vDC`VfTN=Iui@HRmxehR-5q(p^Gtz8G?Ozb-TI2@gjqOlFq{(3lS)^Ma2 zOZ(L^$DB8yT{`BPqe+o5*F3`BzaMjT{^gjH)mF`Fs{vVUIp$ad2i9gRkGVAL_xZeb z)L}ub-E7EV8iP^C^^v2_vaRqq_Zcm$&d!VY8(tKW(XpUXWZ;0v%;s`LMPE9iaPejy zQkHHkGNdftvy`(^FAIGe$ZN-hCH14WZqPvo;K~3oUkRw)pvd7~!6@$pfi$AqHnO>f z{!vD@%y?)p56jIM%X!fH^7FY@V{-tR43HW;9oFRyLRyF?dQ68n#dyRgcp~-$R4TuJ zXzJxaxx=7N9~)vVv@cM%tNAdVs=Grjn9>Q;;^$VSF$0@J#Szt3fwDHT*q91>UO6$00&)T6(WJzq zvF9(?#$x`rO#tQ8JD^lEKXjR_l}9dVmQ&~N^y}DS^S&KAa=G0$6sXO4{xVf|ezdDK zmta+^HRX1k6n_Pj`KT7OW4s0e+mzQp^cPnP;G(>);}@!B)uD|n;p_!n)}jp=&p#Ch zMKmgFstmA9^RRRpcw~G4i(E9HN%H|KSfP=F7F7;xU9wLITV}Z}LK9`5nF}pU7QFf6 za>v7-1I;WXXWnhAfv9mXBbfwgD+ywU@hrd*jFxu1tpwi4KoQ_AORI&px4We6?WnLr zleo;^bq3GfJfYQg2%I$&l5Um)f)oOo4{Bw%)gnK0aQ7Bc>2@Xzq#n^F#`g?#ti^X7GS!8So(CA9?AgJ*z zyP=+vMgJ@YGMADn^&8b!fHjn{E{U?1{OY3@aKrvFw8S)}K}I*4QmP1Ge-(B-7&rI% zCiURq-U+x~jehmg;n_An1;&F;xi5I@PN$WuuhN@%fCFb#EJ*Yh zk!Qc2X8Iwi6w~p^1or$f_UrZ4S(!9uKfDwM&^!C}9Ca_!clg#N(%JpGRtsnsRSReb zH^FJ!DDbV`7{Q8`tpzIfj#F}sQEZ5If@D#z1qyu`-CIdk^R`y_P1GFTF8*Qz0P?M?Qj;XqBBU&{=J^? zm(+Y=V*g}%>U%vFB(-#6wSY1Iilj*(De7y&0y@mFWr+5-P%s*hZVTEraHt#y3K~oh?_FZ)%{lz}^ZRNWxMMSvX>o|0(0yGVHuIgqBb zJdsYBS;9-okNStUuU$sz$h#WB4dSyO;W&{;KmQ1a$mgi(VV$ufZ$1o1sBfs${I&bA z9<*25*llnr&{_RQ^iZ%i9>I^ooM}$pGqiM6dIgo!t4m%aZBkBYLbdnigiK z#c6*YDlISVSJg0$H#Yw*@Sm_ofr~L)ZPsXujHJd?@NC` z`fJ)zy*Y>czH?L$wyzxt@Miv(qgM8tgNM01oj#DCF~EE+XyD1M+_r}b|caP6ZrdIWF{C~H8) zfQNJ&717>&O2^OWx7i-E8I)sS^|<|4y`k*~#VD=#yczho3_sP!Y^7zMWOy|m`&GYR zc`Q8kH@F?)DvfB77$5eW(}9bDUnMoM@q}N#@Z|IQ5Cso@c|pIEk9`&YWDsu^Eu3?C zCS4eR(CIM~Ktn1i9ljr8YiXcCbHz)|Zac`nd2H^(eEhe3^CJE=zt0D4L9Ia~fp1=+ z%@2*!DtZn_AAF&B_r}okH2d{@_(bpO@1P%T{

HA9foTqK(-EBRxb4C$ORHN{V_tRm$K&z^hyMy;hTJb;4L^t6mybLd zH~03IZl5{QSkxa)g-(B*X2#sh2N82$;sk*BEhy4gIsycVmje&!qSC3ze=?eWa{BA` zKeh6+D2&r7$bNi2HY$p-{%zJ20q;gBc=A1eKNMqGBHgTvsvXS#i@EOrucBJl&dlzq zYi6gDvJ*lQLIMd$uR{@(mS8|ZsUj#y33e1oJfI*g5#*yMC<;dr2r3(pk|;_Q2%yrF zPz040ML=o)yVlI!q3Aj1-uplI|Mhv;lbJQE&$qt%ejRvujaS2+YmnV|(>^LV@t)Hz zUdsm7SjNq6@$`|6@ibB=ZHx!(2in<0#CI7VARLt!PKu?4hY}g>vNI>hT7{i)FGH2I znWLTb+8@W_{j9o^BL9W*4w>5yWBTc;svPkat43cXa);57UgD34!!d^CoIx{uLJ>NeB6{ zlRTC*XLtjI>#Z7KrUCwp2b2~}8`qpx9m!W_zmccX1%LK|w4P=Ku!Zt;g&G91uKf3n zKvolM+J}McRjjErO>t7gAl4JtQ-atS#4ed=VEtE}lJO*mu6=Y^} zU2&PIe*`Z&J5m5M)`(<)m!#$L%YeXvJ@r1>xtO2&cY5XO>1!UgV zaOrK8#)734^hg?Og@}i|{{4qgMXi7k3aHC=$+?L%uz#+TF4RSBUr^(EY_R-BA~C;d z!SvoDY~3yOSRz8nf2qfsNw+C6oef7bRaZ6#(}(Gdr~a|fs!vR!e%1 z)CR1h^q#v<1CS2+49E>D1D2x5-w4a@ko!KUl3Zg&%ZW5ejgf0cWsaLgXpi8XV4`#wa0 z{Tvgaq!Wt{w`-f`SVV#eu0-UpGjO=k*31Ea%W9cV+rgU^G-ZwGc4Njp=(QWp5Q=WX zfLD(^^B9T05HEDM@JFa`6UGzWJG`HTE))Oj{)=P5<5+HRV0ZRkV54(?&Aa3heyUw+ z!kSt20a1EW79aZ7-22CJTZ|=y#x-ROKBd!}G7bDj@uoUB%vf*_GsQMxs%JR9LJAR` zp`x6`(Ak$&GhZ4Nt74G<|8P|Vcjg(D!JpkZDk^No#H!Tja>uItNd3C7XbNx6x_i3h zuj3`@n}t@5L2d}XS9%FUID5)t2LBJcC9L6|ZW#vgySf$7Lhn{$i|V-@(t_n-@z1uv z&W7~f5}qNuj!=)5%q^`X-&U+C?k;NkM=14a#eC%(M`=ha_PH66pRU59!Li_)8nk9H z;1!vvOLavCr}N*|w~uc$^|0I|7?P8EMkyRM4)rqQD#Nj3&}V6SSutbI7@s zbhw?U{)6_cop?W8Jf7Wwjh4?<(wGkHQ`DaLAX{ZSk!tcE4`C-GH!7;|Qere{z=fuy7cWG`Hmda^vF!42^+g%vXT@u0%`UDGTxrgS8PhbCtL36vZ6i}z? zZ}~r=xxz2QLk5gYC3lg5(y+#YI$i1tGGNSqdN-CVK9m};>?1%SryC0o{CaJ5;@i*H z5_Mw@L1n+~##exXy0ZrU`rB5m9C$g@f6nj_uF?@Uehp|tG_pI(!5bCb1q&@0p(NTI zf5SqVnamR4dAmX&Ne#>d`>~GlGTGyzUKr(Zm_b%Ko5^^*mci?I(%xfQjnFfzHf1@b zWU+JvojslfN4`n)S{Cbw=}o4*7#syfFZPP3>sgEghZu%FV?xkd-E0SUD~jvEa)La4 zIxP@@QYmio5WKMw58>@uigcyG1_gl$i6))*~izI!d4V*BV6F{Kat7LTs=VIAK)fvh(ocuNPez4&=&5W9h&8BenI z()aEIPXf%#Q*gpl>`BwNR*kYAc@#0dPl1sWuSHPLA&|7hHQ2Qw>>ttvk}gMwQOlw1 z7??fe1PA8*$`)2?{4^VEzJQFlq%{Ysbig!U2W@y7G6Pf`JX>vg<-X?-!_?4jwrG&} zr5o0$a9zy5#N%i5%X9iAWesCl@=QP{bKvF$H>_>s`TlhLhSf!p!!h$`O%!p{nutX# zZ5JLvy>D7W5ydw8rnR;I!b^7TtFL9P0Y*nzy^e5L=c?gM3*ZkLXcuP(BFgzO^8ijm9a`^PV@v)lEHLWa-K4{XFUfL;dE#Dfd(jSZj1CfGP(es{!f-7=8?`njM@(j+a|iJxv>n7N4X|V?k&8P=5Thi2D)jg`XF!#xXjAeVh5gHR;_~*h@Pp*?lx)SmNws}Op1*24;K)JUVizNOZAtiJp$K)Du-fhf{7 z9!Goxv(xLV9z%A4J+Z?a4&Yi0&Q!4JKD+~2+DP3DlK z{dDLp)(E?QaTIb5ou7o{6v8PP%EhZc*tIRlHD3sJ7N0`@N!YWaDMN|i2vR0((pxqh z$9-t=Bv5pGl2Tv#K|30@Odf{FyKs`<~Smj&vXTZif!rqE*S-^5STyf*zxh(^zcM#ajT{@@!!PQr~0j zzn&q0y0r3LMLT{|=KqU| zj~@T8SL|*#m%YOQbH1Mk)le3-ozJ>KXH_sC@j=t*v-zOPCb$0rmL`LY`ymm_=s%*R zPjl!G05+e)Ml|DrUMr1`!H>nUy}R1 z#cVtW;fQ~qA;nduyZI8<_QEYu)%3=pRJIa)9KeWHu_Y*&U5qq2gOG?R zDU5EPx7*R#tXHCdq4B|94wX{2JTD^h+FD@ zir%VYwJs6w6_#zOgY;OVw&Dc3N+U+1Rq-I(BfwU_eM8K0jK40c-q7bd^V#p?spQFy zcIhzXxY4$_pRE~Q_|i1R|@9kO3tiG$ndvPXcy~=*_bJ1UF8G%plQ#~SfT^^m@jR|5`9Y3)}di>E8FA7Tix(kW3rNj0C84-Q5(`R zMV=_r^k4kKtm0laef*1GBX=EKS`g7_OxoLHFUXu#qK(Y}=@3UFPQ@Vm1*8qwUy88Jk#Vj(u#Uf%!2FspzF2 zlkmc^O~O=Vr##csP72t}QlV9F(7>i0L#fARoB+LP?@$D*my8O@pv*1(CKRsPoB$hL z_Y!tPo`7u63(7+2$x_ytlgU!{Fs&|;sm^UHN`V%q=({Bi{ag4BX#n4Kc(9xzM=#VnY@S6O{S95 z*vkf)Gy-(1_aw-qpmYYAtfq9&)1J?mmqOl0=|CYxcLk+0$mHFWj?>B?(Xv4+jiAr! zmc6u+6FP%d3PQI|Cv*mZG}Q9d?|BHMAaouA$qC&oozNKs((oRte$PW71) zxK8K{GHGb)s^2!qq(SI(I!V=p?ke5hiZ9N>1r? zQc0ZB$rsEteI2%kK_ZQah3cmNEvbvtNu5WHSN-M|ojUsqb)L3GkY~EJgQYZ>W6|n( zNih_taIXe9`ekDE^rn^GtekI%=Oj-j`r%m`W zvv+CJE*5ST53}j$E>=UF0gb$8K*;z@=nRkPlC-1ZstvBTiK`a4`b=Ck!BzD!p&t(X zn9vUgeoW|x13xD8!+{?Y`r*Kj3H@;3$Ao@3@MA(h9D>tush2tifBMFoHXLY4qr3kIsP6+TMEq6IFSU_-#R1mb1bVMc@(*2e zkTvI`g$KAWC2&fyRhuJgbKgK{HUx}2kqdWjKiKn)lD^x`S(uYg-xx zl{02LcraFrgcDvtqoKjntegel6zxSJUl*Zn zfGPf&JuZI=PoEKQbae0ena$wRX8&`L`|&oU&3Ni^fh9s<;i!9DH zMDx+t)9brx^QPss@eIM46Cy*2-H7tVn%8wbGs2ut`TjQM#hnS5+zyIZIIJ~pr;Ik2V1#lQc0R%%Omq&(j z-{OMak4DjvSNl3@iST)ejX^jv0?>!W1#sH$0$7O9^B{%_(a1>Nc||DW_FNG&aq$WZ zfqD;=jtZ7yw?|!NVa-=bxM6%|Ql!i730dZdSU`G03&K?nRqM85cQ*?~94!}4H*;_;qFlJ>uRY$*EBY6oOi6*jzxb*WrfUPT-_1$k{B~J@3SBCG zZ?G77&Q_|r!6M~ZcH~-4>FCbB$-gG#a~Oq$&bPixQ)usy5MSy(shkNM*i({r>k=T# zFvJm)$`k0(+pMmN zS!u~X-N7cMvxEa`m05WRj(~rfm0|M2L>gjIVg)Z?rJPbIE38Vkc^=%QsidtxprmbzZ^X78WgvXOKM*_9>eYy^rdBq^h3@pX zDXF3%xL6(rNNixBVxy03%2>3PXjfd~S&$AOySFULM$5j7N~EcFB^w1Q?MfUh7$$%O zXRWhAQR-0A0%w;x_^Ed3<7n6f9;03krH?b7DkQm3?;hz`K3i#&*OGh{rnCphnC||`6 zG9E!y6OzM3reNskU{q12jSiz?U*$dP23}naS~cqrq+j(@n#uDM>7RZI_c_cMT@gaJ z{FGX_PViUWz|T^Dg(r>v-CyBy5SQflg6reQ2y(0k%$43QU41Cl;<#kNO zv_QozpFuXkiu#SIA}qm1<+EWa*l;4NCha{?5JcO9lvx;QKc>`4JAjykZ$2}#@gBrE zBUzD7KY$)5P8fLAquVll9IV88J?nvlDxyqylobyysSH+JHVPsNc=(6_0xD?|LHC0>Di$yzI@K>ZHdjX;h>t_BIgH z^#jVl5P@o6xAB*I{CIjQZqb9erm+{<>s(y|LpY2ozLxt~Oc9$?Ur{zv15sLr)PUS(Vh$4fPsaTh|r8h!pW3W;k_VX7r&BJ~S>Gbc0MtqWM z+!@PYG5r29$>^QRd*?KZA!DkW`5Ci}M}XE=6sOa`h|%7iC<0gTAXuOAUqd`I9wJIo zOej|AlL;;@8LN~Qs)#s;Cqfk-@nd+8{9QNyZUqtyNDf%j3@nc7MbI%eum}_wro`ev zt{bL2CC~bVk|LGfbRkUfMb`R1!ay0as9U%ahs=+o!w zQA#b|Vz(&K;xkcb@k7dwLW_Gpp>)uoIL^_}!lwDL5D zT2J4)ezdq_Pbh(7Fw|ST&2&;?m74TMjM5gR3{lc3#e3)w(j=@_x5z(Mc~zf@2An3t z2_{ybiIuUUUpr#auccHKtE40KqDgC{H)*E#(e8US;znTh1 z9nY(&q}g-zSGQ756nrgrp%9*Yk0;{Oeh*K_YugL6zLKP1cy{j)JrNO8brY0?e@)jX zCn$dLLy&JpA0yNie^1!M@1{As^bzw#sZ3BJy_CIPEydxb?5%4lasD5zh(*E{LE3jy zRZ;{{lxr#BJY;HaEu~(=R{#R@ubcmy#Ysyl)BC^yEF7>l7e1)cxTmHDQgV_q3fRGOl9V{pX=@}^PX9fWGJD)I zo7iF3?9Er|(%w;5T<)Y~r6ZThs^0U5LbgNX2I`aob_-J0gNPv;#NC%-xs9tskN&jx z0#j+4zrrbbF5d7DI|GoK12 z|Hk0kGAaFdP%w8>)R9SjwD&Liqq;0S^wxB0dKgV_tkePVT;EvfB5K(F79wq%DD_Z7 z$)L^vg4T?7Ge-Xunj(+a_Fac8&xH=34go%q+Q&DT3t>s-cpuHLGj4zr2V(JrWwf%1 zQUi9_olU?ZiYnmttz?_FNs)zn-;0-mXZLFiMT+x!1hrv}18H+p6j!;8_}8iV?gl3FW2 zKxGwo`)W8H>GJ@KP1C?5^Z%J>698`hJXW5=5%_3G4<56kPdA#?25LcaNmUc=9>pm$?;?|f`rA~@(uS9ap zaT8_!xF$WhMhg)25JZy2nF|a%4P`@X7hvEx}d+hO6?%f@fZIZkPA-0{Ar)PIk z2H=C{m)2q?+s0c+TB_Ed0S=3O_O@scmY0FVYYdLD4HVM}^{U8w11eg}5J7A$tSQ@SXf zBxwRY*HsyVpC7v_b1ZFr*m;1gcT+O`(U2~E=TF*C$GR!C1Na?LtHy6RyMyT9cVKrV z?w&_8x+@(X6z_8!HhzG3?CBV_bW4+SCp`kF2;;buve?lf7n$MizZUW%o9;G zDqOZ&i}YmRO5flJ3$T%3n-Mw+-7Et)?Sb*MYHErd#_P&QlyKdiolSXDdItOIntOjk zuMy)f#5DXR+zT$1g~hj*b;{44_o$6@=V}lPp&`=CW_!GqjAIv}XGjYz6!r|h7rZ|) z{=$Dr_r!RFcJ~X8Pcp)~;eO*0hO4I%?9lc9!P;di9^E!tH6pj+)F2EV zTpNLp96Uu&MU9>1MYr`Qo?HU$NKhOAg;7v z5Feq7!W{Y!(}Fpu3$Kn!dnr!4SZp|HQ2E3Lk+gPyXcD>l1GS^xqsoB#XMr!1V{TIu z2kR*a1Av~a$>9aeTE&?i=nX@v3D5zlna^2)LDNV+MWv4_l?a@E|1k(3zad*tUHB1I zJf_r^r-zbXZ{-1Oz^Yy#4n2D-Jau8&XGo>fw@Y#;o$D?51L1NR-$&t5b<_JOJYAcu zaIZ;{q8x^x&d$4U_fa;R!0K%7r>w@$uvZ{X05XnqJQ1|AzcL6xrBY$#v_Q#8NduI* zI{PzG=X{z40eniZ_#96b_$)Lq*y^PDulD2~+TepSXtc`A?%M;EhWB$sLG;AyJx_bt zqOnDRwCgG5Ac*hES&PHn8;2;pxth1q{#2+t?P+B@YM}fFr?jS8JwHmO^i>bIfYkYf zjixRP4z>$NRi0mvQ*`Tchin~hqRK`cYtY_dF#~4LGn;AE-b4p&84mJ})KC2ehEWT^ zb9lM$dmujM4@;L~3LknpMe>LDrZ&#>SAYfgXj1g4;QV&n)?Q&|$w2x@A=e0nd7%lk zub+;BIY(PNF-{AE7?kENrQEvY&2K56%I6U*6o+{hkYq9N8#zO`c@u|px1Mh2yBivkDd$T zY3{QSatcI|ojFQ>>|P7C>GW&}wH>2GrhZj|WJu*m!z|)M3_nhTWEdG&L^g8>AU3L6 zvD``X#waO){Iy?^#N+n}xTQQs`^KP8-^_jvUm0Kyo)d}bsKs*%x9Y7rWeTOhRp+g= zc^Kl*#y_WoiP!%`8o;X&LOH(VIWXj-sjB;}Fh8C}{F6f%JL@AXT0%1(@VwGSGEukZ zm0J>!yB1bxOoQ|0MM*1LqUXVz_M#FmPyHtqzo?|i z=aEymVgw>8XITB{){Bb2?e=Cs)&ZC0A#mYCB%f-bEc7(jJj0jHD;!1heP2-8`2 z8Rg9}KS&o|QGSsx{mM<_hO5k_U&WzTw%Hazt$H{VTc}pHsRmM|m4@2tSZ<5UDt`Ip zm;7#A7%r2XDJ|he%U&_3S{8`sRS!5*EuVz_%@ z#*3d<^`8y;&rSWORjzn8UjHf4f22I64TyXU{aMr0$WI4r^@rpgOU)BZ4gFkV0sU~p zMX&N3dXziIijJc%_>Fi`!hsv{bUe37Lq9#J-HsbIDJBm$5=063W@!o3kKfRv*|~gQ zix%-4iJ}DHQM5!l&Tk0EH*B~}Es0{@zztmyXTptS>W3RiI+i0M06dN%_#%zD(H%m> z2FZ5EO;8$2iC8!-i1iKNyfgM77EcS{*>@zK)4-%*i4ncl*ZtZ=P>H`;rBqZdzxXePZzr8g15-r5#qp+-}bhovlc-V_Bc!7$!V zQ%2&r8h98UYnN(1@GxC^vqcb2)Ho@Uu1!;R;r#r1y7C!*#?FBDVU7FC8Oj)*$gg36 zQZKS(C+sjjHLwYM;w*rOG9}AJ5<(eDcDi3LP|irw9vU(eM}4kLGiHLod`25*Dyh;x zkWl%faFS<1z4@U#VV1H-hTwL2HsrDbiXkN#VI&<%X=H!z7eG+6GZJ+hIws5p2@iMG7qNP=_q0FnRJ?z{;{*XxH^WjIdUtB)dN*xM@`iHs|NT&=O|X` z54t#NL{lo61KN(Tm?x~^W()fc4sB-WimuO5{N%TAG+j@IW?`<-EL6QTBHI1zT#!U8 zK}J8ceku93g(mm1G79b*kcRnJR{LQZ4>fJ7dor|~uk4U_ISTWZLv=vW3zQB>+W6!G zr5i|7;I+YFwEoxM7#&)mL@h5Pq>+ zrau!-%NJo0X3`=4)05Kwyd6f-g^-4MCq6K17mZHz!ad8})uG(RRS2DHAG+;p6GXAJ zP|1f%d13olsWz2#ZfvEo4M!w$C3D%J(Y0t#5oYhy4)@U_<*+R0St!b#25-R3lPOfRMCph8ShtrbJU>?H2hcMk0hSro84+}7{!npB zl@$J=Qr}z&C|F`WYK?b)`=K(#F0U=4@omOM`TKIVNn2Yc=x^VZN=)DqTx$#FaFeUH ztPBaSTSeCfP#)hFdO2_QQp0n~W9!zSCv)#viQN^%>)=Rwuu$9BT8LB+L?Zj!DyR#x z=#gS9>@PI8SUD-bWv0xO++ccVwXnUdU9BXb#Ie;_gJ&u6Q>9MKKY~2A9$oQ?#`GP^ zaW?!Y^2p=B*EWct#TbF_|bJrU1{LV*sGxww;qXgbo`z6(AjbLoo?%ugbqVI zBE8qO#%eep@M6mZ^b{~i+wyb}qZ`Xpbt|sTaFXQ)C7wMgYfpVR`oM%%Huw2j^xJwR z#5QSitN@Y=`U1v^UWMr!xH59o7mA?z~9=u@Q7fK@lfUW%kw$5I(sLgNK*&7t3 zU8L?Cl-en;c&6UlGuh~m4|=A%|Fp-6g;u2{bKtPCt%HTOZcrF1NPD(@cug>e=$rxe zW3JAD;EB*PLt~cnY_kwQn~}nhb8ZFCHVdYCD}iq2Dx3>kl8s7N@Nhwtb3P`NzT60< zFF*%KE9e{IG=t`&Cm3iWc^1F==^zDe0xc+_R-3?+a<7oWyw*01d-Nuy52|re@lpiD zG#}9{Bmj8oI<3P_3Z}B#TWh+LH!GWPWVp|iD#aWc$3%Po%t9`!6Lt7`QTF=?t}zz+ z0XUVkqmtR7fFk@_`9Qt_rR~x4VRY+jPd2Zm!CB+9()&mpk(C<5x6#?H%aU2dCFs3t6eAP~+KLT;tF4)Px zr{rDW9>1sTUCJE9@Sfj=W9NHX|E;oKUiKYH&?s1!eJ4I=@N+5hKV@nOzOIS5m+jeW z)lQEKzW3lQEy0y86&K-sq5jntd`DCJ26GUJQDtFap+zVn(s^k7HT`PI_msOw33G~P zmOHdKXGL$K0l+J0$638oP+V}I-P?PV@ZRFq{rU;5!e}2BYfn#xYw`=2Ro)1CX4rg< z&_TU3{JfKKY^{RAk*Y>64sn?DXfPn&WHb#6p*>$eTbC}qcqLr+dy^KspKwy{b+rLi z{G9TzS1WB1-{rXZ9eBiEUXs)4uWxgpZ*o7N+yWDKa$8&gZWp^gV`7acc*jILD0V>y z?hv)NnaUlay6@BNTCeX@V!Tc`HhmrhQH0wL6%RqUVNtTvAK#hR>xUB)C}`l0sYA}8 zSx*P7{5vb|)}tZ5t~TGFf$U|4?3Ga)DoAe9TFk6(!Lvrm!{eOGwL{4DagBJuoQm_B zhioF;5|dDVKoH5CqISXD@l1=J%pK3}3o82HyZ>HAP)9f^|9V&(_rpIZ?Ifr=ryo>u z0Vo=DNO>DS^A6!Szf35Ie4;{f~&JAy-W zH#I(@G~qs%+!b`M{e+b!A5rp}R;+0_EW?N6^4ee2Zc90uaicAJ6Zh`C5&q@`++m(l z)b6Mf?|Ge_X9Mc&~G3Fz&rxHKJX(1^&`3 zn+mqS?UcUMy}^p`%e}$2Y$xf7cH!~|X5AYs@;C07^*6zi2PEy!^8b2FBRzXX$(EP> zn^7&{qq^~n7}YB8sP0i83m3Q3RCHDGhCLbXKh^Yosxd_V%ZIq??jh2%*U+2Xf76>A z+t8a?Ka1W>^7cko&L((bp~M^`#-;3H?eGY$sm=B{BUSfiO9^Gg)CuQac)T-{{;D(Q zw*Bh`Kg&B)@{{PyWnAkEj<^!B;GU2YzTgPDNY~BlJ<=8PBvx#eF-f}m{r)98g^-_bYKJ2Tu6DI7LaQ%2Lxp~7geT(ZzR5udT7f0SyLs0BRZkY&)sy>I zYYy+pr5{C4mUw%zTs7v#2=KYDN3%+4;OXkQS@Kssn)GjaG=cYMf!?Eh zZ;#gA(IY)-NnfqwMvshurTcoc%-BHumv5l_zv|NEt#^K5_fOI#?q9p@w3wtDUjN$s zJGx|qBZ)12Kx}C}kTaW#kJRR2yu!&g*XYEJt$*=dRovBy`}fRI-igbnL?_OAJAsfY z@tNz~MG#rAKsRV86>6MS%UD{X<|lrI*@6xwWL=U0b!|2Nd4+ zy3!QNYa9^|uG`T5du<@qT(?KMMan$Eb+75kx$e@J?A#AN<6t00**MKwZfQw(vS@iRyl;uC9KpTF0_+aRfN*sun-!m2Fw78#A<> zZ*z+qLV7Zu45@=G0yQA*#HzEPeYN`zt4|-g)FfQ*cBxC`E(E}i4@^3j#rVso=2-y?y+}qH&0L}$k;+9iK>QWj%(d5 zgu;^46zjD>f!30>r3aCHwd^@|4y4N5CQb@X zR=Waw))4+YnkuO8gj#|txX_=?L!2~zd#r_?t)s@?fdyEati}fx=?HIfGSuGhucfMF zwX?hoyz8LO!E`xQ?dZ_KMxdOhHlu$G(vD%3ba4g&6+9WAsjO>IP7Q&fL> zkBRaEr$BR*q7E|8bRY<;O>M09uPJJKbp9SSo7qsa@phokxU=)zj~-w-!L+Q7+6it$ zRdv)+I4B0Ds!<{5Ch3@a=@V5W@_gk}_7IxRuQO@<54Cvgm8qWE z6T_;Z)41x!^jv=2LJ>s+(^R3ct9Dzox?0hC9S-J7I(B;LQWJLi zCttJ<3*wfcwSRJHqYvIoAmwVfh@Ge^tJ{%2%23O^G*ox2>-J3O|Io2ckMgpNLB22> z#T7<`!odw;UF+*`dOBl0VzYWt8y@5}zX6Y@f%bn|i?A4x*0?%W2?0&|X4Yess0c62 zen2n(-;M(l=tSJPpRh+bN0sxBOHfH=4OlgFM4jv#&uX_s5OYktXlV{9jb= zESKniUAdFrLjB29W!4Jg-mM24_^g)dlX4XZ*}<=nG@z9_M1DgqjO$zzn{h8P!BBoH z^&-~^0I0wp`G18DPLSB~Zy-Q!eQPx(u%OUa``JhPerY5K!()7Lf*T>5m`;CuwPUlO z%DDTK#8VyWi0?;tF;bCZKf-PfZKn>dmT@LHhxTlH-bOpys2|nS_1$ftnuWd_P6f#8 zqqP~1JUoDeAExIablHUG22Upbw`YF-;97QQxrS14SHJsC{nWNX=@yp|z?E%!GEk3t zT%_2-w&iTV-)iE(71W^JZB>__`)s6Ug)fB##v^U!+Xzl>r-p`m!su+q%-{&aci1aZ zsNsLJPW zT0FRx)5pUDEL!fYxJGgmbbxE-)2mA@sZm9;CvH<$$%8%74KrMEUKSZ1POg_+uxKr{ zbU;>sJ2petWfqPNE^Uj6q_;W(cy@{n%Vs8RFK|XmJE|f24GU!qwmU;D+O)|=%kNCV zML4=}`)#sx!cjPnv`(rBe99aUudC?KEw!{Ta@k;Fz%=xL+6(IX2+CZB*o&K;RBmu& zmjDtL^N`vZn{x3rs3P;p`~(#qsUPV6=^<2%1GC-&ODbh`#<>7yt22)4L6oc+uWnNsH$ZChKD#y7vWP+^Y)wk+)KKu{*t`m8(Q5BpT>r7++p2S zlH?`d(5g(eIey*eGu3o)BesXymp^#DhZ@cw%;}*HkmPL^S}dCY6q2n*hW^v*Yw0zA z_^{Q~GFy$4X4Amt;hB`XyuHi4CmX|)PPh;DRKJkTeLKWk>E$o8qv+Ge)VINJwCb(K zU}*iz(n9IE-fBO1tnBNpK8>Flqu^(l*+-oQSE}QE)G7EG_PCmAF5{_>;t&Mn{^W6W zqJ)ylF<&P=*jKF!gXjx=)uEW4V|~Su7uyeO0Y`y;Y6tvO_U`GVnf=rra2nbBUT6qi z@2C1n#co@FwHWj3UN=BJ&&?VL^K(7oEKF}+OR`Y^4?0BC@h4S|u4RGyN;j-(}vZ~cadxFIT!Mz1?my(1-sesGN)s`7AiBXmj6G=n4D6Chj!iy{{V zN`|Uj6JI$L%|S0-&>=C3a+|_{Rqtul*Z$`!nq>lPRmC^A!OB4Az8>Il>4@WTFSHKdx< zb%gq>bb{K9#Mgo#xYvdPe08K+JAf~2nD*yfJ)$>pl*%#uluOncw(amV04GA)dJhg= z%b$JQP|?>WKiWM?U5yQ&H(E`XryikCM?qg4b~0hE6^Jl-1T;2Xpr zc_v2~eUbyd7zApJs$n`TR2c$~rN_ny{s{@2M}5y7vD9Gs+7G~4$A?fr12_7qRI@K6+X8>;-2{z$OTPZP`hd5+ zb+4;wHD0+R@dvm38;PNX)1fq89fvs?KVEH`?)`kdp8DWY8|@5+&#LNl}6^OL6+_7ZLEOa z$i+#LN%lNWw%zUW)b^5mC|<|6Dttp-C+ES&kzmQr=g=!IU}QUW@ihCL87N8skfs zCN(t|1}>}%uD8xq^-1KXnlV*vE3Kw|Q`IJx&o0GaghA8P2jr<{3JQgP&J)wriSn)w z=;So@RcR~rpRU&Cxd2N0O-b<8vo(OlvlcGCoCwh6%=R^Xsp6rjJiUia-=;c9F&tk0 zReB8A9tBfvr1vl|w(zQM#N}Bq>dt_ugWrxb)MnQ2KCx>%F49{w)b+ma?e%2^5;_4F zmI5_`2Is3!S+2}9VIaHnK^6-@BZtijrpNPD2R&S%PQWPk6sV~IdL<_9Ee8j=w!Nb^ zH-F=+vBF~bi#e(HJ8G!6$RttZRbFIAFk+4?$3eLN_RbQMMTv_jAswJPGu6}}PxWu} zCt3&vjh`PvV`r)f(iSR20dM6~#H&BdMCD)kYT+bhApEuVtUH>YDoS*og%V%-YLSI; zVaPR3g|pOPZza=2kIFR{TpIvX5Z0vfv9K3Y;zUXDWc~A)Mq5kvkXuMF=)3C506zS4v#XL1y+D5zPL8MwWEl#VA zBg~>TrksYCoa8$nEH^Z>HRp>nDQiBClSz~_U+suM-sT3&W4M2swHAgh>~nxjXf5=Q zWn`zWNI1GceH|Y~?gI5O*?pD{FHqa^FFt0W+S9sKM&Z)JxEKb}VA?{piIMj#pEHl# z@oN7ftg)K^);V7J=CxN-Y4k~wXOOKTx^2eNwo{rda18y+wSdG zwcphpJ*;-TT2csoV}O(7OPwx zp0!xW00Z5PobJNKYIgw&6Z|{eOy7VE)#jOFW{Q4ab>0EI%QeC|o1Y1xsZ*Y@+sxYK zB@*;o1K-CE=tFt$ihR7Z~Dha{P#R_Dt}4go;gyt9$bCp z>ehp+ul{#bINVquymPL9s7|*`zF}s&DZg`QU;1S!nEB6P6bOA(Ug1wUzkeKxq-3Ff z@+ba0IysEqUIvxHPRh6nHZ}K?8dmp;W%zb*I&XU60ia%e1ep=eK95778uzj4lqZx^ zmFZDn+kdQDtrN<*4_M*AVA9kj=9vAX`yk1Dn@GbB&^wL*`ye z(##&Av}$g{Zd8%pCD6TQx%#Pu5YS;O)Z|ovR!jOf>NT5~wdDehWHkJ2bX<~jTp<#j zHmy+WNJ9$q>Om>hScf6ug^(B*svs2d_%yENz&U#8dK2+sc+@vMlBT!?bO>$U8!uA2 zR&7*M=#`Z!v+e#d7D>E&QT|G36natI-Z{Z^X{G9CJG`kTXNIZyphshEzpQt`RUGlZ zgC6CjGA4{e?2OI8;I?Q6n}=Wz2UT@l>5P`W-=@vL8?oS9<|-jzj!@%kfm|GD}PP~HzeSNlk7Nm`?h z#cp|RjmiO@2k4xPLPLewV-pNsuP)18aj%XwHOsx(_UNNi**TslQ2Vkk>bf*)%&g35g+m^Bn>~EB?p)s!%N&yXw&+XQP|IBanHaR{rHk?%x)5pfb?G zRv^04#m!LWj3wU^Az-DHh#l}~iP!;i^`9dpY6j%vSU?2a4y9V9>THm68x#x}yOZ{p z3X0JGOSKs%29^5)V*Eu!hh|WNMaNdb#Yv;^z{j2$*s| zG*jePph4HD)>mq6X{o#WS88i1o@1TyFD1z3lj`G#xJ8Z*fQ;+HHPeRq7(=VJsE-6q zH^rNfe;tP#a=Wm;q<#&qZH&9y*Xm3O(G4fQfgrz^l&xwwP_I(9V%vR2BetsCDf_Lh z>M-MdWDLXmX4ZGjHt5ap?3wNAKnxq&KPsq=qvphRXbhK9UI30gwk7j1z$dCRIm)>J zXRP~3EgMx#e#b&D?*x&YwTY(fRBKx2AkQc}L=R8u8BYgyLZsQYo@(t<2ZXH+LTIMT zu3cI$TumPo%BNH7X~8bFe)1{Y)ZJeBW1ghmM=yQu&e9d@>B=tkO@Drq;~x8HxHIWn z^s^yJ?n5xU41ZSM2&M@oT_&u}QC{lkdir#?x;tuZ5Hi4Hk7~2f zV;HeC8BwH~=zbY3+yjLMM%s6C>u@@-2ZlA6o__}`p1v1C-O*!I8DoxM=Z>L1xR2l9 zEohhYyO9%)dpv)0aaH|%>T&*7`0OpGt@Koxnj{|%qJdvFMh>7dEFZwI#y=Arw($?M zNKFW!2qTx7q<#K}nU0tDsu7?EieXzI5c@D?>{B!G8hlIm6b>?fkkTtcemxDI$ zQ<=PJ9qri%^YdYn_JfN6W3gW-n9KJU7{x|>ud=}Mb=KNGK8=x=%SYR@j;4ICB6MQE z>Tf7e`%8-?%z0HyAL>Ik@mNf14H2jR)Qd@vQB>Xquy z={aX_N;mBP*8`&shkM!m?x={^)MLRk<4~`<2|6)HH6GoGhtA7}Z#y4(`Hq--M!xbp zHSMmh1?gS8`JMUz^e{$Z!|J;9+=U#GWWdMe|9X1Te5-p(n~(MiBUGB|aC+IfycEnq z$#=av!7*2x3V^xXg(o{xX4}M;bSW><9t1_J(1LO8s|Z*4AKMfI>Gx+sd4Br4&4~XS z=o~zu$=&E2@{b9WYww7#^dHm$d3!8vJb4}2R1c~MklsLb52+8~XnXmP8q01Rh-CtM z!v*uE8R$$)55bP`GaW>kfPE5Tjm-K%7Dxk+t4=oS$UWt=4vX?{92Rx%I*dB!AHAo{ zb-hgL5mDyFBPg@_hkMF=a75Jey!Ao>W+F!ln5a#U@_0XbwC2egUTomB6bY5;N|;N2e|jseIq;Ux7t1_5w2 zO+ThKxBc^QEHuG8Y40(dIjgOdKP4Lx$j8+O^vV>Cg=+ z9CIe)H0*Q0oEdoxG{D5k2^tl!X&QsQ=jCEkN8=6Z8@_3oEb1V;PVB2!-Z8s&__BjY4(cD!54+o)txU zHWPD)cr#EXXVXh()MVbF#b>~aZKKjNV8T8k(^<8F{58z8y!X0B)`xve*=NDI?4!lG z*FtFdS*X}A(D}1!LwWgPO87~QGjENBO$KIONOwP}rG8`3fBP`Z=vyH`@>Rb@aM>R} ztBF?Ren&<@9)%rFEq_sKSWP~_$C0QkR1UUdA>w_s{9;(5PK3Jie^HqvA!GeHXvH_v z*XN*j{*Bt5S6`+6*VKF@WWIC_7NQgMz#r-y6YQjLrW+m_WYtk$yl6Ck?0dpR!GD4a z+fME9Bd-AL-puKtGCSd(@~1jiLYP~v8>nv%t+}BBYZqDI0fFJ?7Y9A5h*M!@6m=8F z`#KtN6N=+g^xI9fDT=4vQeTvamfV7x_Z02C1qZM>j0S$|4;L+V$V6@I^^n#1Hg@AF zdi%E8Mm}UJoUu9qQKBbrt6S)&*`YzfpIFcYV#qo*^I2hmfCy-ePspD_qcOY`3XO#2 zssn|-^!ZX}E!n;4yjsXjoc%7U!Q5R72=~9KO=-m?^%1a&9GF7e9^<5lDmBLZMH~#Q z0^+S(6(n##U6daO&L|#9XDGi)1ptNnnO{*4c#+qCQ%8sj?4)!H3MTVqIQ(T%+GQw~ zVdRdxlPW!{W46Aq9~;Ium_xOzbmSfR}p&^w&hWU8E>V5KV7vf)J*fPVy9-( zhO6rP=6{Au0kczB4a$6KoJEq5u&;4#%KZldj7L9h_ovA(JR3+~wW?KKtkZ z?t#g&e>|WOFP{l1T=kVnveX7Ik2(NfZ1*z|ja*<%%`VF@#Bl}n~pH%XX zy5U1)j&#g1EY9LrS7rqYHx4VL*Bv1cNemU1jSE(fd>pWrgW8$V z2F|HW^f42c=yI~09nXeSPVF|q6ni?!GX5YR2Xh4sZzLZTL#izwv^O>}bb*PUB+Fgm zU}{K~J9+w}yG9`Mh_A~}0pDxrExho8W|x>RG;Y)x)ChI*>C)@Qr7_B6Ip)5~bspEK zoRowf;Yf2AJ}uAGV>bE3%fnrku7w411P&S3=_K=bY#f{bV)FIk=nA*~vgK4m2X^xF3#%S8k@bMbCz0VW=*PG5_KP%s;Bl_D7H|hAFxHAFS!9!9(x$ zX|sr}hfD^;<1s+bB-k;J_#->sGMuCz5)nw}odU~!Q_zMN?Ggu1S?<;(W};J^MV#7! zhU=RJQ()!2H2gg8p91?|PeBt@+GLnM^w=(*%JuNyK(8wjsz>DzvZjW&#t`ks_{D&X z@q0Fv4DT%oQ_?j60yW=tb}fIyZl7VPxU^_K-KgM?*d<&5bWsZ#>Ul7=8&DIicTXmH&CIjG01JnuMPm%(KK#{Ek z7#UwcN0e7QA?M&i{9jbY%k{i#BoIaMe>p57xrZ^;zyi#Qkkf~eis7MT zYb8QAFigHq-z1-a7&A7*=LKScOnO zi*C~$P!&dRjQ72{M9WEj7z+b4aUX&I0vM0*l^-U6f0B}uGZ%YNV)K?eAV3ouo$=i&H?49En5<$DlWi4#{Kxr`t zz4z&bHnDyL2su{#PR-VGbGotq+|xJKGpul|Q!cZZ!)6PTK9mh+-N!?m(>|O!j7lJ&Hl= zALenUE-2}^Pq%T5E4z1`tsNK`~krNCU-^@KrsW4Kb(l>FX$@g-;&I^B8 zOOsJ?vS+>f%W|hHvSSJ1%bgb-{4aaCh7PgqMBDir5Tx$iP~s68&r5f*72C5^dsir3 zVa8KD)13>+!RFbJm{=C@W|I)Mo#f(Y=ij7bfMVWs zBGR!TMExiMWlo)dWn=0DzGE9X5qxYfQS+LFN{ST-p4ydlpD_$0jHrmnvJ+tF(Tk}S+kvn5hIsCkq4AT+jvQMWaC>G zwb!#HTKyJ?p3OP#(s9q;9fKyh z@O3-QSb(s@Lg3GOtrv-H#Z#a+JzK2Mz(gjkXN4mi8zTVfmxYpRnw|4MY`3?X|JP>s z|4X}B`!G4!)X-rQYUhSfGv;h=u-^ML5Mx^+C1;1Q8gR{NNLpT|x!R@>N_{9Uu_*VD zQ;>7MbQpqO@y`)o*Le*GJ~~unjInzwve!&PJ52JulgrL4ayS9dIB7ymcuRw?Cb(p0 zct_`?1u>Z4D1re zvN5!?jX}nOj}#7o1IS3++nD1FUx0jV*h&?m2_s#hcwxwPg&;jE3Sha zc#WF)Pqw0=>38qmwPeSr0CaZMamu&tF2n7BCz5@9e462}75*^Yd|bY_1Dtrq;t$45 zxb#7s-|YY!o-+PI@E5`2{BH-~;bX*~FaFpM7fvJKs3p`eB1QqLp8fo{_23`&8`+Wu z&cSfIB^`UAfx}>S0>tJYD?{k`3k{_D7WN`WydCay+X2g|+u_1(2hN|j!^PVUfA%!o zc3=;s$`=|aIXEoUBnB_W69bWfC&on;PaJ%^4~qMTkB{I~5QTt`Q{iG578Vg^>=p|f z5Vm>3MucTg*n}{^7kC;o!V#XZZ{A<#}z^UwboK@Y7P8nVrt?)0^2(|LM)^umAMswc@9-HgACb)0;O?|H<=) zV&H@H-`>oO>;d#npMs_}FLH4|-Rx+~JOx!o0T4}GJhV{C3HvUVpQ~Kwt6%hTu zHFX)$(IRjA8PW06+jmBE{PZ>-sP)dk+P-t)No`(6^uPy*j?~`FjOanNnHkaX(_1kk zI(~X9W<dp$bRW_ z{h+qeUQd7d@0JUySlrlwJ?uYUEB?1+slBa%=bXt z1H~&jseC$c$YrzxjbjTzP1!hbVNTxvR`9-M$1x1m{clC@TVPJIEd_5`Tf9XZysx3} zj6K+yV-LrM>cD#$9I7vi8wnYU6(?;mwIdi%+>XSAFVL9-rvp2YZKq;PMHg+XSO=5S z;sa+pcO4eNKK43{YYYPiATdfa{u2+79}jSic72~6fq}v(I+qt#!+xO*_7+?t z3h=(XhieRDTw@rx6N!(p%DF~t-MmN)q&JI)3$^M@5jZ2A`vT^OhcgGelvBeM`EafX zU20%}>wrlU*lCw@Q-VuEcRBOMI#`n%#Hq>bHuFb8&8al<6h7SbX?Uh|)epcVA4d&JcU*+#< zyjgl!+$VC+jZ|)ym>CX?z@c#QL|;E)Wu(N33-(NlwU5L@|R8nG_By;Fc`(O3%AoHtJDq= z)oJx5>J%VNU@z<3k!W{-^b(-(7%aF%PXtQO7%vInxrDm#AaXcRBJ*Ts_h+K&=GCx0 z3X+=RC|MdLO~UQbBf(MxFdv={mIeUrvNTwF2uP@cO==5|&h2f|Tjrw%WVIIMt%EHK z9kNOFkW8>6(*}yNOHE)plx~-_pejjIqD^m3bU@MbmzIsyASWAY z$QroasGX{F_IMyV@7g7WnFe0$1)RmC3bQ+7qmW2&1vnfn>1l8Hroo1|d=-7!j6kVwQHZGSjJKW)mZ& zPB6-}KSbInmI^fZvCJsSHvx%qb*L01?)0V9Zr4MoGE{2bKFxa!gozJ7Au`Nt;9%mI z3;~CJt>GT0X?T_OIxnYE4HC?Fm2UXifNa2=K zn_$xkgDi$`YQju~9_@<}Qa;M`iTcdq{W~L$QtAe9-(-4M20Mn2lW*Wl62WZGs!OyZZgQ|o7M3b|} z`evD{R&DpO{XoU)5h!R}X&p@MI)xo0OPusJrogl~si8P~N#UrLb?IoF6k_}iYdICa z@>Db(dhscLim4|>8&!pYg0xU}GtI;)NnLrVCWEJuFcppFl^k^EtK*f>ymr)f%Bo6-S55MVagB3T6n8YrISJ#YggtS{Qkw z*3sa<>{mms@dZ(>Xshu%2z9W3-MI&br%uiA3~qe?@c2r)Dp*Y)(G7_TRz^y}IxwoJ zdHPEgjoD}wm2YZ@E5X!cjN|6-RBoo&CmAa&6rqzPss4S0{+l`L(XpWFss^D&%SShc z@$tcAd~|RW@%5dMD8N~Uc^wXV;HXWS?r)F*Tsl*v1nf9@vu@P76@XK)P%2xL9ppZm zBBco8kxTc0${)GJG~fxK@)4BLR8mZ{awCAo&LQQic#uQNZ+U~oa!C0pJjfyCzv2mW zNclXL0Fd&DrV~5?$CO{hgB(+S2T#B;<>%aGfbSer{u&Q*O!+#vfzztEcSgC{OuMCZbmS10c(!S zM~l)oJ`sMvT+w_-6Lq_1tqc^$Iu(U=JF>OJOic&tk0Sk1p+8)0_`9L{<1_tnLVv`y zl~S=Y#gpHY0WIj$wi5IE-GClpzmDm@5~y8{y#+bj@pldBHT<$B@@Xz%UrwYAEFy_V z)ImfN-DMGtc!V7hjVLu25si6-4H1ngk3}T&h+ss(QRDD{7Jex_A_)8R^7g#RRr({P z1DGRNUg(cv{ZXwyQXbOZ=?|cmvXs^OBPCUTr$35Qr4Tcpq#5o#snTj8;7qZoOug?{WRH5BF*c9Uc?&v=o-x=D`+U%Q8Qll%m69#G$BG;K{) z-)A}LhleG}Z1lmg>mZencr1$Md@uV$1t&6&svdt$p~BOui}JTO33QKnL@E?u<7n<7 zwa24#53rb%Xk!m>w`p{whcsOL6tGGKpFT!azF~G+&=VWvmn3wC_Ic)+^axt>RvCh5@aL}u z(FkJ*oCWpyJzaELV8s6_gY2k$=G6}F5xt}WLCmYC1L@0YV2JxrZkqHQc=HQsQb&9v zhN6@~^##SD0I7}mxr5S2!Jz2dy-IjdaErQvznG>K zmA)b1sIYc`#QdWCH~`DZzJnGpkd1Tw!$ja(yB?Rq#D!<5{o_)G`H(}j<%ndL@4{yP z*sw6lKievVPCPEX62UapZQF2s)@MkK<&lqVc0f_q-FP8HVXDsTYV)%Ggka6b_Nsf~ zKG6+@)ZI;TBVLXa+g?UJ;!M`^$iX|n%2f)$boqlRkF4UrOTo^)R$ z!Cs#P(WmIhH*rv`>zWDH{~dZcQ*uTg!5bVZ81jeSMO0guRo+$aI-!-=ERFbjuO^!kM?a9OMw+UcY8ahBAoRx|u89nF#= z%$&ks(cLVZ>VBkpL#0IXxs6e_c|e<7R3Ou+p^{acQ;&peDm2C)`@l>yhe|TD;w)`@ zQ>JxzZGs;n+dSGiRC2PEce4gK$n>P-09M-E8N(GwZ9Uq?qW0(SD4Db;r5G6Z4tr8^ znhMXdn0FBbbo=5br9?F1XFO8As&=9gpuflCGBzEL!)Mq)JTT@Mah&I>r+_Vs+Lq{R z(I&38*mhyyF1)MKs9`YfLVG6){vr5^XUcf<^}W0*rz*F)t|3L zxa&V9r3=CD-1OCgwbEIFZ5U3`II9e8CK)Z-vJdFfrzM7z68wzBkW%K1Q$Wv_mjdXs zXQa+hCuAr+#qY<#O8yy%VWwn1EBysCW&N`f!%Vr)n-Qjl*H(0nfS`_g70cZ z7)>$Yrj(9ePt;xv6+4X@0p9(OW6_!&EbN;jq+a!zM@^4IZbO*U?70#4_1MS>+L;9| z?rY%nA;%pQJQBlBRDY!8v~1kxWjy~G5ps*$4J9K$iri>BmfkEnM?+7csEUl1|a8H zDdE}STBQCddeMLWODq6i9Ti3|A;ZfedEnzPRo~jkzutK9nHth@s2IE`3YZx#B+{|5 zkUqR~lP-*vve4G_Y~I#U*%Cu|sY|Xt6~id^(Rz*C4aP|prdFErJOq6>0RBAeO}hHL z)C^P-VY)d3rnlqq0RhqO?aX?Vd0<$Od+vB?>I6g8JNqcFMTN^B0Wii;iiOc&yBwt{ zERIeiifOK338@L4^@jLz2n`rEZ#146Ft0Dd>U7PWHYt%TD^rW{)mR1=@`EiA_z_l= z+jtHFDM)KxzaTXc=27tl364*W)4>ap)40%z7U%VhlBv&?ohtnj`Go~zi{;kLcC$Hb z@9177?Z8+m)zS#`D7RW-c%fk%RHQUHA1D42RbyM%&Ss3E$<8ke%q1gK-zspV$eyhtI{q!3Njiw zD5s721YYZa9Wl zy&r4jqR3`=mDZ;%dxZw7wDA`23|gtuwA(z)8bbr`uy9cxxB;2Yw?MAZcd@jHRC$+m zYu0l4UDHG%Op~eF6%qk2bKLus?JdgwXA_lDv)cBeErPtmylPMT7Gf(Bh8i92Wuoj9 zpsKycAUB1>UxQI@j7L+W+#8W^8s)(O-`Tx3Fp#=vEe1=4Cb_3@l`2)(Bn&mlosC!F zm6A%#a4}YjpU7u6%L9!kL>O3 z$Z>c{7WptZ3hr)bvag(QkBK=GIhOj$b>R-^q^}%pV(4^ryy$dpr=R?&AkIGF9_=p& z3gSLrF7BZjR=K|6BT=Ii^B9SCTG3epowLFeV=vhP^0)lN^*I%bj2e z0PvJ7U^B!i{4r6HCkfw^O_iTS1dGtzfD zFu+eznnPxm`C}cjZkb=+D3zXzvjw>iI%EL08Au706ND^E4V5P_YX#=4y2CeEr}u@* zp@=^hD(^$8(l9v*zb=Hy?*dEzrEs|y9^1m@6o7l)43~4oCp4=3dA>w5BIG$ppByQ} zX$}pEMC}VHCsIyFQ_CY|EokjWzVITho!=GCWy{VeIVrwkZ#&zM4zDS3Fc*z@Wi4FT zeB~328)TzBxBsc5&E`kRT~XrCQJxav!hw~@9Q)OamRn+=21m;gmR~;B^W{bB-JcyT zH$>~UMdKUDqFd3tbrDYa3BBtfR2+wqpXbDc$fAu-{`#0x9;m+#XRlq9<-**|qPJag zw0WTbibayGo*YSAT^K(DS!3ixylxdEw==zhx6WB}*GM!qMvfFN(Bc?*m0nm3^sMA) zKixT-Xv?Dfx^f5M71~o*Zf3r~ijCtLBVy(05GWhqiLIc%1@dh%0& zd;%otn`R&tj9sq!>1S>M4g92@+zt&qR8MY#o&?sHzs3lZ)|a(F)`IAoAq|cPk;hWo zcsbm%Y!6dNdz=Qv%b{UMR%75rXq@QWxk+ozwj{5et@3VxsJ{c_2%mm}j(|698J$$Z$2nVba>OvYa@SX_IfjlNYbI zJ!J>ohS56Y^(zwO5I$BNV9pc`-M0ief!Ei_+XvJK@52(VaT+z0>oqKQKzX_5xB!75 zW__s#tOHV*_i8FBg?jk9XeHt=z59-*=Kd~eMMJq0AB)!B?iD7&eNZXyR1zrmc%qzS zIdPr0oTg(UIsa1LmfG^r)-6=}LNl4oxrV&pcHV+XPLk_d-&hK-O;9V+u3e>$Npgy* z%mGseoN%+F)F1S2Fj}47?wy4{P?klNquAxf15;spZM_tI>vjmM6V|Lv=2^(rNVfB3 z<52Cg(YO(+zk0z_{p`gwsFB>z@5J7A7&2d2cNR2~ldP*|@yUmN?4r4CIx2jODjUh6 zX7)Yp_Mu9@&=8svGA}$7mtCIr^3Um5ZB0EIgJ$bKiN-90m!!sWRKPd0Ia)P}DEA?4 zhe5wLX$RDI|S80bVxfL#6!cbDp;Z7)WE zIeXu^gq}>6+rYWkr^)Ed!d2eR{6xiH6{-wp<$SWI(*0CC6;AvBy4|o2o8Pxy52pd$tX@C9B@KR3_79r2&!j;}FmE+<5U^UiS_LaK1uw8-dR(#!+S2cU z7>iZ2d}SoxwbR~|Gu@ALk}ryXS5(=x|7KCty&JZOHI&m$9w;97qpFAHhGcmd{6ZmJ zcvw!P5B@QxCcLpGexP`;o}P9>ccd-hY2Ev}%iV1_9h8dA9PVb1%j4L=2GIF3tsRJ3 z;A?H5{Jy(c=D%qChXh5n{|+6fQJG_?xXR-uZI$kkjJZhz%1%4jUAE#;f8!->>d#)R zg!d6*`pQ1q3a@W6ZOQ#!((;i+2Z>t53MyL-K)UBBN;+I786%uAa1ePCf3 zyw~ukzwwfGdO!2_2LEdOK(C#KYcyPUz*l?fO4TZKM{O~1;pPeX{EGrP{=x$V zQszE~6CX_8KF1TndbmC~l0X&h?eUbE5oM)wFUZ}w^RlgRF-7OELfD8|^ZLY1?2FC) zr+kIIn>*j1oq_YHR|q-pEUHfxS5iU*aQMUIL1O+6vR{viG3W2#Br7%I#ya&UgI!oe z<)2**3FGm9GYeM0tIxE6So4aVJYRN)JE7!U1dX7g-M5htdHP}y1o0JwrXn(+x$50~M~iM`D54q1g+(9 z8D8Yy+I*XKQp(eEta+1OSAh+6y=ojm!g4QBIYePq&IMKY~eZBWGz>j3*Lz!An@ zWIQ07195kHa_1HVn9V!&+*%mg{6!tAvY?+lE<+1@kUkYV;9#R;thqwZQ#K_qLHxW9 zWzDfV!gySUR}fU&)U!J&?^I;0`K;d0l(mKgv7ioRN~nj&WoXU^>&e|k1rqAX-Nnbi zH8UVVoKc60N63ya9+#ojeK5~_y;FrFWwUv{-o6Sy^l2effTv*`cwB~7@4N@OlG-^0pP-RCD-;s{7J9fln4pM5_@o9Fhh*D~f0# zHbdO|Jd})36*}KSOho7i55*%?#^1sQLR-f}PJ~YIPy|BPc_;*-Z+H$Fp|hBhEkt0t zG}X58NX8LP5;evl}Bj z%=~Qzl^5=oAW7iMSne3v?Ej;;S8aGMT7k%>7wldfN6=Mo2|p8QJavZF?!lIP;Gq;h zA!#3Y%WTifv~=Jtxk4SrVrk?rGqi^uECLE0yj9c3$`=2(yd{)Sbznyql_0XkONKgn;tAz$AQ#%`V62#KG@nS zPr050Q1dlUb3%# zQnLL)W5&s0;rwlewxhNZPbv9joSK0<_1f~w_-C+Z9FESv(=C>jM`hp~RMS3B)^B!0 zGA+mXf8*`b9=%UxyeQjSb+oeDJbItX^;&q244jJ|EOMKNT6^_$+q@;?w8Ta?XuNFc zc-OA&tIepF`{O<7GqfLTU$drSCHP5y-wG0EQTvIsLW7c{twQPgQa7K6*ix5^{_9KK zSB>` zw$$bGV%SngH^$2m4H*Z;tg>*Y7{uJ$?)UV>bNmvtpLs`cHp6wm3vzF|GeJIvW!-tF zp2L0RMTk7X3286OkAR_`8)$|Z;3|6zY2hLWb8f)#`!(aQ)(-!Ca3%-5If&cu_;l}wTg&|V2-q43{$<^r0l(%_jvJMX$ zO>KK+)N%KHN9K6auTGTTM%uD?K*~p+4G*F6#pV<+lIS+{5vQi~rCpQcnaxixj?*Q$ z7!b&FVf%yYiuuAVs}GavUSs2gOEYh9wjQKe@51_TCr*At;9hChyYizrv$MOr@@bDi z|97(7C}_`VlXlrhoAn;U$NLA3LY%OcKAtSU0f}eS6nO%gQrV-SM2n`#%+q=4pb!V0 zoFYGsTg0AI<+146hN&{+WAjGe0Rrn(2nBJ|GYz1z%-eZEt9}wa(ztmn9A~M z&Hn>AAO((?0U6)p^jzT{N913GFBbj!K$jtnogsG#Wi+^3Q!NOjdcJ2$pDu?|`zpNLV>WDh!PXuXmCcg7@M(jQVihqVY~O#{lH)N_9>7qKqdhNPsJCb)nl%Bft8%FB zdFT4jAV9ws%H44vYSMycRkxOC$xKraMUy-L2yb6bu(A0S@ggTz%NK3^@oR?utJHp3 zqV+G@k`Zg1iG3;a;Z?X>;02 zv~ZCufw%_JrX6bu-zpUmZu?@{=!<0PS6J85smoWG$wO&QW!Dh*p0DJFBB=l8H*$SE z>aK)Lr7!hb397Hj^VPP9*xpFUZMks`Nzn_W_U zW$nZaDSi_dn5no8lnN?V%P08EhVI0eHn_@IBQFs~6;%$bCxjG3bwXk$H z?*?OsweoZnH)5T9#P~BDH&M}yhgx~u=dpcq%6hpIdgn{^@*iq#)zJkQc%vVU$bYCM z_1GXY#Y2Bu!hTKHe_81~`&Fj@3ZUeIhg$m8;676LMmZi$&uWJ2xPcoXlj#1erIXR(h5%#ZEm=D;f+ToEp68qOAzJCdxb#14Bc&uv)n`P!iZ^CBW z2!cK6f0iwl#rd}-vTQ+ZY1CqioGiXyLCEaf73?4(b$^%&J`mOR* zF(1~uNjFu>+J^h6zLc{~?i_S-jh{AC)J}gB$w#+*8^6D~y$$y_tB*xMmGNfppz*VW<&s?0l=2%?i7PIXAecqjcY2-$1?Kl z>+rSJZD(D|J^W~Mf>8NNB3LRmj5q115~nw#}0#pBYuBqhj5+jn6*-9l}5 z%j40>6}z!HuA^Uf<5D_}lK03{F*%%D%Va9wgG=m>fFCWl5Vsg9_wxlRjVa?xbY+>$ zoSJCm*f?=J>`&V59GTuNhh+C7no};%KvN*0;-0M9({lp{HK52>LZaQ<_sUlUymS4w z-$@le%EJ+^?wqC+4)$wD&IalA-5Y+A|6l`r=TO^FYTc|=0PXo%UJh-roC8>`-XZHj zta9np>mcsh(%e%I%FnQG%e5^9e8%o>f%NG&8G%%mJNgVby7CPoZ$YENu(Z15d}FlJ z{oYYIpA}#Cn0yGO-8qJ9;CE3mXc&VJKPxj@@w4h+OE!;p`I3Kx7z3<2w2{8)Z#;=_eD_Y1Rv>6^7wZ?ZL8tgP z-slu&!IGsBxLSp2$|*TC`hlw(t4A!!F73c6__4iSqK{Agf5<vk zs-OX3+$cghEA=82Bi^pYX0egVtL2e+w7)2iWH0^om)~EM)7ej}{9@C|HqXI_>O ztXXeiR}+PY;KUD`7dU%`k`Gz?yMqN~zlb}=QwD`?8+N0j@v=SuxbRt>m(DaQY}?2+ zD&f{mxprp|*dHTwIDN)ctUgK!TB0|?|e04zE;kGXEsz7qk0fzfYNNzKB}#9&YD+cx?|!r z@HZ>rmc8qE6>RbR8+JNa2Zh(atW2|q3?J8)x7^Ihu!j}3+*4GwSqTk!;L8fuxZMao zTeisZmFIbj@*cj5zjG_RMdWUUO(yNc)FjFZtHYKozRDJ@ZuHW>&2;Np;(tHW?BoA~ zOzU>vpXoiDk|JI)&}N&m?B6zX$)Se-{buHt{tq%8S@1u|v}*eOnQn$EQR3A_6c(oR z7Gm5Z!jvJ5^W7e_wUCM<}}9U+GID6nZ{FsUw!Gp@|VnPvENm6rpUyV^*Xx z3hALYDw7(ebOo6PMJfHkOZj7k$%;~-@f4+ug#Denb+l3{7^e$hi^`$gLy}8*L6}bO zx=`~kbjGDzL_tSll)<7EZ{>kU9$~XAgtG@noQ@pYYRle3hc~h9~77~=E0)94c zsJw&6x`xUJ$kI1aVMZ0R5>eL}65QdcKQNghxtMSORU|4gSP1-aVkl2S=faYdq`)ax zOqx?Wwpe#`nvtaRg&1>jk`iHAdWOY4PP>wnP`{dwh|;6_WxF#QDUm|Vp+$hShtd~5 zLZfY=6z+jc5_Oe+a6LDusIl@A_~yLgeKI8_D^X}&)+^7-?#yK6Yiz`Bxry>6c5rt| zGvzA*ZRRZVlorYalL2c5Y!gPRlo|V>k)qov4UM0|oTJEfUIH5G@ODZP`xKuwKs9f9 zJEMDPJ7ua3OJtj#O0;RmTISnpa8Cu^X;!&k?y0;W<5kLFWc+BT5~FyGRr#q)(Jstq z8}UDA#f3I9AU6O!#!lNNZR!f6?a9J(ca#9=UGmL|>(Jy3Y|M+fSG$g7FCVHf?KjZ&gAu(bC8Jb^WX7`U8;pYwNCX&-Et|)-N4q z!{7bDPO;|M@MVvC%;Mt-3F2~JntKgbpgbTI2gP zr~I#QPgxQbWT6#@Qf$<9H_VuGjlcl-H}u}b=so`;r*~Nmy?1WW>AiDHExnid>-6Sv ze?xEhR^{|&Pe$*u2k1R>gpwhi-tu1${|Qv6y>*y3rwU*BsJMrq6#?|)z8y3PM9H4qHn>Z+7iIUKN^DltC^wBQu;^H5G`qr3eIV~PN_5hFlufI0qG)#N$`9ztF-Q#zf zi!MILtsL_fZP6%wV2b)6!xEsMDZsEmn4!4KmVm~b0e|X?NJ?F%nEZ4G92_21R?kwx zyTtee0#L4o@&1olaIayHhXwc8@!!jW)7*uL5}jP8{9&9D%y`U<%24;Y<;p|>A8B#B zv5I?gu@cLE6pXb1X^i4jQlxCq^`&Azv%~#L0n0r5g-5k+z>0QP+L` zYXySrndDrlJZ(HCfKk<28~PXR>EIOX?n^6`7(x6vf?OvcTyE&b)^?Qoxs{ffVJR(* z3Vr6rrk+OCZiTDB)7(d&b5f&KN*p3fpN2s9*;PtUF44#{JcBKLm68ZQ_8yxJk0An9 z91oicNe4c4Rz!={yol`m9Tdu5t&Bzy0aQNk=?3J#22FxIZF3iV5o;7C8_Zs#Xn5p3 z*A*_OF5HNv-`DW(BPH)?7^oCqkCBJ+~@D#gc!sIb$LH zbuRI&&Ly?0voM}7&SoB!F)KSkf>sw_j#qe=<86F7mVF@+1()Pql%M!PSs+}YfNKBV zK)z3M+v80u81g;kZC9L#sa)0y03g-=dBRe%O%UQ}$PT5uR0#}cwxU=(L+%UD16qPO zg}Uxk3P9ciJC%>2k34>tass~w>{i}|sN?u_$Lr6jh_8Ui55SpN0ag79SEnA za#)Z}-KR9MdCKLsO(=II8Ta!{aqQ8Ty6#sx1r?V1Y0Cv|#?44Bk*EFGz@DV7`<3Ws zkE5L~{U!xyuY!vUFxdUfg9^AtErzp=zRE8F7g0*AUW)nt zQWl=s0h^;5jc%hB$4kMmAWIyje$-i}{(F=ldg@0dijMuP1f$;L?)h3jGY>xC>D1)fPAxy6G&Io`6>U0p0Bga!*ol~sUpT09Snyrljb0xY9!+l? zRK^Bu+g=WyBs>OcZ@52nXN7}S&=GXdp2K~-JhiAzT@ULwt+FzbGlm!99*z=iHCmXW zRy-fjZm6Slq%NpWtM{-BU>4gfIJ1V+Y`Stt*$sRh*S9!3U6?e^LWwgkx2CWoN&wCg z^^YjbB+%;|*N;|=+SZ($k41%&coat<&vnM?#b)iik5;k)S6E<9z1JE3tRd_!!;*Je zchl{;&2V@71*c`q8f|gpNYnI3h436Ik3Nz?nZLbmrCdiBi@SHF@|qwnmZ`K`oa6`e zLcwXZ!D06Azw$4k;c;ax^Ob%2xH3qb97WwufN4sn^(U0A5L>@}Qc*;4+jg4$oAN1a z1lpcf26xe22>l4uY>y}H**ZdefM=PCaz+B!!sB;0#0zZUtF7a1k$FCtF8*>_fg{es zGZ-*npA`2x89^=2z|Fw5ucNfKFj5?HMrq63fX+Una5tb8XYiG5rKZ0teIm!X0#SJh z;4uC97ZKpOJN1XC=L*gH9X&24=O0SEiF@Fno_{FK;$X}GP!fIKMlc@+JTGQ{FtfZ3 zh9{1FKHW%|-$rt;{zK`(m_GA4 zi09W;%1l(;ty(#UQEh%vi7_LGGk7GOufh)c!bRozdzzs8rkBu!KQH3!zCeK6xH)gX zEeE1`F8=B9b6?serAtuWWec>twMAF-W#O|+SjNUu*(C_yR_-;hofPDWrSy73x$rIU zG8evCw783*bJngfK$FG>ug4v(V2SNZ1Fm=)x>>J-U6?Jo0%m**9lin@K2Eo;=pVRt z@-YPx?M7rfd{}{#na3;`d+h><%N#}ay{bfq&oZM!9u=-&Hs0JN5srG8R5PwB-I#CL z16P$k%(tus&T*?PZ_3p9n$p#>0v^hnqL_kfN~pu@3N}FF3R+Gp^fs6$*wSlCt>5zB zt|^TgzT{QN(k+%SvkW!v!S9*<3d8zIy{@!um!`GUr=!gSMiroO9WAE;SGH7d(6a_gwHYW zhQeIiTVUK$`u1ShuXsPogEy2Yi^s7&-MOJeCwctYBW(x0g@KH^L7p%1Azo*Y_GcA$ zbWe}mR2nlg?U!#VuEt)s_LdsOt^4xo%3B!7li#~Ec-W=wHz678N7A3*RbQgce<~f( z<%xePNj1*yy@bsKvC-u1e=04IM7X6ezqvW%8wd*f7<3&gX9Vb$dP`}C6tCS<#v9YL z?LKs@;8lhEZ!7JwK0nMJ-_kp`6?V0D`nEE`<7e2r+R^AcO8uCpYP6(q#sCk4q4u`p zp5-l+_S{kY%#5ged?@|-Zud|XOPxJJ_mLF<^(js>gLZU76f>*i<}x7YB)cvl^&1?`Nf}F6#+QV=FIhKQC?8 z`)U&;+j>v33rIHgd^8XdSfw!UsO}=;HbiZS`koe$@Yml$d3`h3kMB1{fyL@aZbAJA z64*r572x%^YSDi2DXM4}4t~3js7BN@^aW8(j(G`ZPJOEA^umZ#>Y7^2HrRq6lrp5B zOh@as@TZfanq};x{pv$wU#*4^&7j6&4L(lUrXiAJA>TuQb6>lgaEGkL2DCYi&KOjT zJDH8D3od%&jcP;F4{Ml2?H@*!c{)99RN3IinbZVffIH2k2Ev4*DEi0xkgvU9QIn&V z!l3fLmU@M1xT?3!q#<3iLZBM4Z806Qs7%{p_L0^h26p?*uc(Lns!c`Q(0=5rKFTor zs@&sbDm$>JGv&V__)<4N)sER!-US#VV;658MRTr2`q$uK{SAa!{C|jEX7-?$SpeDP z{5_WMs3~uU*7*+IwrRR{YfOX4!3Ex(?K;;v8AtxX)E z%m=71|B`_z$Y&)m|6oGZk8l8!DfmXD)v~6N&r-l=JnNv1lLZUbNPQ{;eSqg-Zd(k< zlYS#I(ofL7_)VX*W3yXDLL0*ZH@n(aU^IBqr8p)VGS%ig|zOafIEsxm{Sg3RX>>KUd!FARpst;!CC zm0@s`g=1i1h(h*omC2=(!_`EXR16ANTj3W!_J0|!_Jpj!qi*Dt6&P#$6T_t?+4jdd zDPnNj5b717GA)aO?{_#DLz{2rS`O}M5pexJXvyR~Fck@~Sham0z{LQ(LTHoDgd$+F zYIAq`BVe>@`MX%aVAU4#7`Qh5gU1LA-5fwHMgWiM$m^C^rVR-{Q;9zCh({q&YJHf9 zr$(t!(h2`?xJ1d#b&dmwpiw)?-otXRrw~IMqttl+d$LtWsVTsos2iXwQu07As)|_c*f%SEuKz1-FOCQ?{1{lPBl^oA6iCP z7bi*@po;b}BbgW@)5?GcIe2Y=ih46Ef1zuu>tIC|kEsO2@6HhrM;hQxMzDp_3a9#r zINL@=pQWo*$EAh~-?gFbo=&&Q;>iA8}&>IwmrR#$Cmcgcl;l?Ux}e3@icj5u}>WekwfbO?2u_H8}i~k2CcwAF^da7r0F^?k0m#Zw%wHfs5%7VoT^9F{^GI# zX5kC(m_1ahxD?(KpEWpW@-$5zY{9wtwG~7(f7S#FBqz#w4%z%jlsu_ zi3;|mcZUXt1C_v)uJ*!ef}2|?$2}SRknutkw4mBGezqCC{$w!QaI+U3k!bdl!3EOyvs-PD+$a01yO~&`^h8bw?HmA0?9+eJ zi2>?#X!Sk+xLN^^=@|pDsx5H8I#7LvaY7}@map*`**&T*^3CWT^$J>^JrF=YJu=l# zz{NbW*`J|Q@7e4h1A%9XB|U_8Wo87sS7)iG7`XPFC)HJW3>cU)rm z6o;+{l=Cy{qaaiDpJ0tk-h%yQ>X~0#e7ZOsf(QRKkGG+K(dts5_^lbO)|DpV5aBdq zOU5!Y0%eObfy*^g$C05*_-DA}d5x-B5RZoIqyR+4Xv}wHBNm}9u9tbtVH5B)+X3JG5 z>;(+M21Ij5&1H4Hw(`ADdLbR?&TT#weagC{}>u5jGww(G*P~QPu%)tp@C(o1XMR;2M z)cw$lswlt(ZpW9@&f)?;fSlzihz$CrJ7bOYfy6+h*ODr|kLJ9T(h&0ye=@2cIz)d5Aza})4UUwT&sMkGZ~ zR+|RQGXZX%xt{}P2~@3PJ;}DoYID!aQJ)e_-!La@loobDp_n|(i4Unq9$1M}^mLy3 z8Gc#cPj>6RZbxje%QH`#06M41KUj6gO+2(xEr`9Ml+Ym;Eg@*&i2k`jOI1$w~cU zX!Khu(`rwD>~+BK#b2<~*|*esSOc(3w(8fM9(h}3_iceRH)flIo_kvjLE?#TtD_=5 zG{JO%{5I{q-esZ$jEj=I?Rp+9tTvX6C9AlP#lY5zOwlU_hHT6T1Y*Qf9uIz<#@@ z<*TKFIB6fHy{EdIo8fCquhi=?PMbQ3v+RI!$VIAx_tY5pj{fF7wI9TX)|qO(VEsKi z3Rtv!BuSkK&ifPh(3vVAxZW>uk9}W#RcJbCm8Av1u`Js5o#6Nx%Asw9ep3R?8eP@X zpe?_FB4q92b{KKl+@z)1!x~$()yt8UIdlB!2Ky-aIojm8o6_^lv+z6?n_J`<_A^WV z=tL!jn5d`d?gTl*ZJVkZ*cvZSQ-2l5Xf)ReK!_Ei$C{|lboB|$gfY|AZ?KEby%s1H zej&7h05sS{8*+_FY01DK#sLJ!mS!xB}Dv>4GXtAhUfE#>ZH+{fmEE zEcAx6c9{HYA)`FkR(@Oy%7l5{X!Gb0Kms#|Va#V?z$osC6v7uEXTb#-xdQh~k74rF zAm?*Os90IediC)C=#h?L3t$#_a7FnrbE}7=mve+i-2mv9x|~7V^0B{G?PL2@AZUil z1F*mwG^lXHv`Bknfs3EuoQ4KsJaZ+>iU=8DD`8JGhoxEI#y5*oo+pisr?Kg2I5qS$ zVEhOwR=P>z#|Fy280W~qU96rTXqWfqXTH{$SML~6uO&!NwfFv7Fo(gHux4<&d#WhX zeuo60?#BSO^j=k(!kk9WEb`uQ``C^Pl-knbfMY`L>6B60Wnv)udI&W4>A?nv6CYkt zb@zHs?y?kiNpKv^j;OvGTz=iP03raG;ubgsL*xiJ1A|jIM8SV3!kCRHmrqDP-O;RV zjCVydP=ar=4F_h3k&v(ztB*<+0!a7zsqj`*^;^CAlwb6Ekh}LHwWmQyFB%eG7fW)) zGPMqES)$g%Y|VPq8bYR}YHRoid}t{)n?p2lsoEKjol8|GbhFPbRUJq-H|0(UMJ|J^ zF8$-EU*J4@l@5&kIlONgBF7Mnzp`22yI`k_Ay>FLVY@`?X8Y9Hn-AAZ>&&n2-oS=VzecVJ}FkA z?Bl*r43A~zJBUuQf$?7+Mbr9-U(cv_JtJkQO)=R#CnF`Z$voZV1Iov+QTf@{^icG2vdPwG8zXlRm zPqU!8;mzb}3sax-w2;QEgTU(&9bc!DF=de`k?$qHAZol`4G=-gv{&C?wDbWj`>$6M zO`ib!(3i$s@_U%d)?;jsP{9l4C`yfw>`rrn4Q9HwQSHIdi|q$(m^=R{0XKs?f@yY% zic0uUmz97^PowZswFe&D(a0;M>T$6;h`WXPpN)zeqq1HEcfD-0`ZgZTwy2L8nI&Ig z02G3Xw&2T2b8p$AUSlSZ8@8#LOpg@j9gj=-*4wcw;FQoQ#NmE`WEj{KSbir zJK^5X_k$Zu(+$`b(1SEGD@2B3wQWMYtKhVRBnC97fm{arO=K_**YEE9lf}EOF zDDnS_n!L65QL|$2|06X6SbKG9UcO0l<1p3!6*1i)W{3bcV5Xwt${2{i_Z(7NVEr~9 zRwtVmZgSbC!P4(|f`gVG#?rftZX5=Omqv+4*qr*fY!Pzg9#It>V_hq)D&_9~M{~+O z(8%gOdjt~(1tpvN?||K__Pj9!I$-^~nCGuA2YeX~vGngi!;ayz&Zcrp|1kRMnEEX& zx*Goy{3uR;=Y9K6q;{3+!Ek+5#F7k$;~eq{p@@-?I+rY`3;3F`n9j{mOJIF+K08o{-Q&sWAnpI^vO9~DP5&Q=dkPjOflzG*mqIh zl)k(#Mp|ES%R)KlF;ju_VY`COPAYoTs%dT-14XP)#^p_k9$htN5|d#A}SW=Y@z2bsjkQb=86cN8KEV! z<6urOB=3yFzVk3kQhZ6>gI4EVR&Svl>BW&Mof{P4XJE+JS)E#j(vrRPYHy<8_Ur9E z{2K%&%v*ctp_9!*=;9T%4iKq5hS=Ui0w%Ke76(d1NLxJ0{-8S<&NE~GdYZEKwFF)# zu4!Gr{+d9}(RN>&eO2|f{Jz|&skkpH-iU>9<5ksaIkhTUGa;t@D%O}4h1XQ4W!>+( zf0Fvw)Fe3Asll%HvY7Wbgg2i%l;I(MNqG0idP#n|x+L?|wBec>77Yg_D1ZSh>0JUR ztlQz6Z7+sl=}POL7fI`bTl$(rTwKj0*L9UUD`|gS4Z+$LM0;L-I*j&A?O2~OTR$D^ zUVmL3#$`0e`h>gN-&7X~NM)e1o45tI`=>q)u8ej7)DU4@3|%*+Q|@?N=HyQAYNWdh zqk?G8Ewxfyhx5Ut%rN&Sx3Lk6-&m+}TyO^(aaVmke&4nz9N>I#&hc@H+Ft%kaEXvD zKq|xB%NfCFi?%_tY>rFGyO!vQMV-tWW!$j$t}GTIP}zwGz9Yfx_#C_4|MOj$lfJV$KE)@P72xQB z$vb!EuM(98IGA)UG|-WP$D@Ic1d!KARWtTEXhxu8pQL}`A^5J*B7p5_6<<=+$?z8R zWst+=c?)bJ_BH^I|Bt!%4y>Z+`p2_-Yx)g0$(FQxlMn(SB%w=Rsz^%^5RocXKui=B zm6A{d=@H05DM=`bf)v|DECjJo1QINCNEDDFC5V91zMq-h8v>#}&-*;@@BQ%yH@iFK z%$b=pGiT2E9DF?%Bn@Ko{``rE*247s@@?_Be7QZy5BrRh5$5}5`7BsUxVt7+B+4i_ zi87W^6Nj`P7U+xm+<@|?UWoJ>XvMW3_GvTcSQeeyEhJKK6{#)W@~Cd|0 zX>Ap0oLIVrlATg}@#EVxp-E(nWz*Y`oV3^})fDDXag#{4dC7Id(OqsD=@6&+QjMmO z$&?-{*;$qWO(WeFdXr_rg-}%J;cx@!%{aWGyUmpL*0oUjrfH;#5=%olFO_DI!#ppB zN#oe)?cZw~E-;rrVx=mQ)Dnuh&0EsKXt*SuiRy!6h|hz3sJRey9NRFQCNXvxvMvIB z$gn1kFG31t?nxmLQmBAG@*~$pf+<}h zCFYN`;YRf_v?)rO1cT{j(UJzLiPAjWRgzhAIQq143(RQWgq0I#LntdAjL?3>rywxNQbWoJ;Wmjv z1PgU7V;WD}O+#x)@ky)B?e&4N;Ty1lD5!Zme96>%|LY|A8A?m8W$oDY&N8 zG>}mOtt*U)SyaRPB&j~lsVUhTrhC!$D$0X78NxndPlp_keXPk93P^1~dnss>FVdcx zl4_lNk?-2l2J{J~K8*(3$v;{0AH))QxpbKQ&AD`(|7CFL@&&v$b_v?W$`8L(ekf&m zDsf5o2;y9FogNZSbCV@iJhhM3B!g8fr@^WN$(&Wj+Eo!~P`kkj=XzXTGW+iis}7%M ztZLxYaT*y>UWWP6;bbuEn_7~+5q91BI;NM(_1j*SF?N7uto{D}ZWy>QU}1fkGhy=` zl!BS^J~c>@(!{ZCC^zO+Cv_>_WreLquww&FOOaX$ztA@+QgciijBZ2^vLlk)vf+w& z3dhYr*$N@OUhw?A7Ot#MHhctW%$_7Xx)l3d(HGC*AsQjv}W4OprAT}INl}H zV`qbwkR>bXN=_!b)^*th!`^z*8vH%BzBJ1+@!Jpx!=MJziy$A-?I^pxO zF8$F+ijhj;wO4sh0!>-_~DTLtTG~i(0Fenq7P-f$X zHkz?e457GY(k&{RdCN(4nY0g@*FySMd`+OTwr3@ps7V@x-4~iP zUCgmjdP^w8GkG@9C4 zVm2+`w?>zyQ+ONcas0f{hOcu)ZKNcyD6QLdiP9&Upbz=BL!@l?8l-4No9x=hqIPzs z?uyZ*t(0VWx4a7MyEk7?jIb50=60miWps$)jgk9Wes4YYXTi_$ZK+E;>4rB%QeaCX zL{hH@rS9GkNr5dZA|4ezC_NHt1VRch(!ypR_6Q*ZyE~~_dnqNP;&Vl=@$ID^$w%zC z#9?8D?1^GchyLW3D4JvOs?xLmm4t_+dJNqiD{uaWBNnK;x;`Y;(cf6|%i20IsFpq? z)z{xx^V8l7L7Iz5Bbt1uMc-pGHSHiJvvqG|2gqLhE;W9OJ4h+)S?DNrfiXiyNAy6U z=f#eaRS;iJpsbU(VGq+uO1Dm8Eeoa%P0xptxw8}@Od?ljtX>PKe`n0Z1vIO(G(b2@ z7ueHTitHjij2ocLE|6a<%rxiHTasCD;IEw4GbNMNu>!d9Qj&SHpedAF%Iw%qULNWh zo-XweLf87fW2)Y$OyOR}V0+gQRDCCv9VAA0{f^`R$ZnDme+`~bLB zsJ>wYh6rNx@o?!w_{VG*+B%%3jga=^?*SvFXtAJ#az;w=)`Akg2Cg0{MF!2p-`Yar z`-8b9RK9IoRFKVZ4d&^(Xv3v&z}NxwKc|;9 zlwN#N@&^FT%TGeEkEEhaI0}EvUVZBM`bikYfxv*Lq;DYB)6c^3=fYD`07s7sqycVt znH4=|wNTT8CSSUoDTRjx8QTBX%k6N>-L^=_k?WX=;h0G;WJ(dXgID?F&yQ&mBisjI z!KULP=*}X0GNo4cV4lTfNeq%IJqwExB41>|$PsSMxepc&r1M!4!x&)O(!9}-Xhjq~rnk;G?vh!qurLkQa>%e@?w!ml=6W-C z9L?vDg^woB?9oy?L7WBuy1qECTzFRMPnRYFedA(Es6F5HU@aj+f{7JpE-ta}0_hSi zU4y&0(f_#Qyu3nypzYu0mWmxQdb|S8WBtjuLPf)Wlh%jL=$zMeVGyk`SD(QU*T(?R zdf`rTyeQQc_rbJ*VQ-cG=*z<8!eF7G6~|fcJXWeNX2W^=t4(mH;hvAc^=e<*fLyBu z2i1H@swivCj{m4EVWCGDC*`sQa^84pEN~JW6Ql(~hUbk5*zODIo(9J9LYg>D+JdLnuSloS>9wZg zwkMs|PM10(<<03*PjNDQqGm{Sgf%o{1~yDM6VBiZXziKUcBRvE`p>4B5Za&7A2X$f z_^C5XYAH?$rRQhy*qHTK5tTl9G1F%@oo=S#CH zxXYug=p1<%dFpY`1j_#8t$-dJUDz?$>&K$k1oq9`jOAnh8ty^LdRY5p75keX5&bkB zZP*wQhDQss8r_4A&sZRFOMu}E?hJsp7f8*qw{Ar4R{&Iadx2z!^Iu~U#uv&Inn*}uD0DD{6#=x1Wmm#cF7&)ROK;Jr2yb0DkU78+SD ze_9plKH)W~dX#>+2}O_Ve_>@{7*V(()+Vo`^lr9JH2*beV^G1Dreq%ryY^4{R9f8%8@`#|{bCi;JMmz%|KiR~Th1!V(9R`$bX{oJ(+TOYQ{3 zg|8k^$!W8v(C>?+ZYZhqVrdw1gk;W=n68dlrtXQGqtLm<(gV2OBKJejIjQjy=?U{p z0Z2v}i={q>x)XQw6tq;*F-N_5?9_27SN)8~7fwQ;PQph^LBg9Cyvv|TqYJcesnm@X z8^nvHnfW-M!AkDYQL+h?(E5BS1Ae(iOh>~G1edcsRyAMbq6(zcpc4nIoI?(@>-z)r zSOMB~hSnGGcFkEkiZQ2dAzs3&{p97)u*oZJJbgSkYH8$?grDq{^lqWl)qFtFvk`i;l;x5`+*?3N%aP(7WiOXHVgyD}&P(rv z=gWKJg@pKMzFsnm1|uZ0*L2>h$3tdZr<4_3K4-3wk}>6%u8>kA4^K05I+@<_yJ>9k zj`eSV9fV2yVj7)Uf%;}r^OdZX`RM>Qlr2~y;cUly;^<200nkyEGM;?PNy%?uo6?;+ zy&-9VzZO`vcx~rT`k83a8&VRS?R04rXzW0&nl6ldFc#OoTg7nWt4<+TWiAKGOKNqe z(!&qhJpJF4TC>n2sT(DYM;%#>_&4wAyR8WuQE4XSZ^Ulv$HFS`Z-blbM!r$P9cid2PBzoJmxhGV z?sZa}xF6cbozM<;r>w)$J$S?%NU^kPpqWZ{N!n5}mb*nM&rrBU()?J!lp9dz zuSFEOv+ID9w?_&>^^VU`{ab5wV7j!6R=&wAd^NAD=g7BG#JvqaS^ht3_~tYJ=M8`N zmw&b4`C!St4gWY-$8r0+9v}LZH0s_SUoqXlfBT0XC-iuXr*NCpO%!L??{qtE?NWD2 z3<>UUdfkIwk2kS=_v!F?GXY}puXMN`5oVPU5oQ&FpWr5(MT8OG5~(S?z8ms)_X!4a z1E}0O_}}DxSmd~Nu)rHUMO%D#NSJIS(M>N|HvO;3Mo1X`&B9hlV-Y-ccSx91I#Dbn z4D@8T_k_qQfAzl{5~kE>3vivhtui9GFoL15GHwbCOc9MY4Cg)^1pnQTF!vUyhlIJi zKqDlK2Y{Q;-#bn}+WSA7pzrSdKcApWcKwSJl!lc_nc7whyC-0mc7Benu$zNf8?5bc zFvPVqgnH@-{cY-S+_2c#Cjs89{H1P9y_NR-EOqh>`B7?Ysr9D7$X-;+`H0_E znA3`yFv2ZT&X1DQ)9RGe$%1n@Ne-HH1uCU{b zDucedic?-!>U|BW2f)H#ldd3TS$q}50>6%B0~S)gH9}bcp$xM*p5{FAGuya?v|q>e z8Uy;zZ{&9dL9DPKPae;Rf*qJa zZzVgg@}F$&Xp?Z?6x8`)+9S$Wz?**vMt@5XDe(6;k#zPCi$Be^$UX7mv_-CKAfv_` zps3X0x+VI5f`;nVDj85rh93J)@bi^d^Go_w7s5TKu3M@IsQmg32+GSlD9tWc6Ia}z z-Zw2Zacq9&re#0uE&BV)w{W8O^z)a$WQrw35|gO8RK=g#1Da8&;8K2T*BKWErD zvVb3kR5t$};Ixs~Lb{39w*Ngfm$!qOX*xC871aFlxlYY5pWmS-57Y=%WD9%MjRuT8 z;P^ifP|64>IM3Pf3;x!v4)=2cs`APV+&g*Q8WJ^ zsF};CIdz6pv$%qq{}9No?6FpVqGppKZx+9`QTe1g;gs6rcdnty*`66qx4V^Et%ic8 zM3rm6FyFvv!&&5?H6GsiXB@|k`B&lc%%YP!lte)aWaoHY!@=Uwb7ufYv>Z(1&yEZ5 z+jI=tiZZMA6jM~j(lPG$P}PUTM6bt7&D^EfDvk{eld(kU%kZX^~f z`6X=<07=kdUU#!WTr|zS_E80g3qqWs`HrE2V5ZO7#s^RlzD*dcIrM71R!)Db0P*Ud z4T|qR0z-N7CzY7ZI2Bj!fhu~1B3x_SG;?Qf00d1)52VL_|0u|4k!MPbEDPeAnUwF6 zAA#WHanUb!UF=V?TOI@1$ZSG*5WT2Z*t+4`zl$w#7u<3JLP`tsy5d^8_OK>&abdI> z4qrkby$~xyKS~+3+ad@`Ddjc+Xdpb=`?j4c-uQ%yYskZJY%Odm_d_v4Gns2HYMu-u z*Yj;z1!dPpAU@{vZ3D?w6=`OYHmNOc_mbombgXGxw#pVxYAc(VsTJJSp~|6bGUp45;6hRg+qar%$iewuA6!e%jPzfdvOG!`r~~ z9$&4Vws4vePN79xfTk{BKu~FkZE;udX%%cqaC&XfmY)F2pK05ajuNu4fjen!D_vx%u${x}-PVa5jW9VbnW4TYaWj#D#DC;rG z9p9F9Sn<%ddWS`7Z{r4y!TA(6lD!>P+`CeT2~&87dC+0QnF{|t{e&y#JvHPf{Z4S`#E5|yQTal{EH?WeNdIY(VY?4vI7$) z{jQ6}b69`$!3m~2lv-~%f-krasqufUFxtU~V%D~5Nd3EFTfEjYt*e~L_RHL# zCAD{VUz*#}REvUJs5Z)8JR^uEtZ${z)4TeFQ$c1}9iU2_Z%NrRl58e`_2p|9Vql06 z*nC=A~b^rzGTQI zrg;|bEE-Ge1KJ|!+^4#_lq~@#KBc5b$+muhum57#61Ck|g1NkjeiZU%<6(wg$mPwI zvw8%Rl4ku3OA-wJ!PNh&R=uf3FZnCXfc`HbJa)umvOip%LSSP9lf}vKc5C&RJVji1 zgLXV7M~T_L)9J_LW^LA7OXFST!Xd^Cgp-Q`OljkJ%rO?wr6-PpP$TumPbqw|yb)cz zVaR?l!jO&ZEf2zldP#4-)TZ^3nWElI8AVSzY3N`%-dBg>v4fYh`^dFHBf^ZO25l@A z`7Hs$(rX(^>2@EPtLR}XJP22@Bl^k@f`_@1TVI3s^wrnke)8i`_FLhkQQlN@(vyQ^ zUz*=fb_C^3H5pgdX6==!^lm@77aX_(`}1sF`eXgipp<1(Bt6UY{>YMTWC;QVmtLk- z{pG&qgH>Q};^;5erxpWb>;m%7n`;Ts#XF#jx57R3POXy%poo>r^jcXXmM)`Z1LTLz ztIW(xgEb=XalQ7(IZF`RrLQbg)qQbQDDQDO49#2fxcnfj3lNixwme?jNdW`p8dY|F z;m05_uk1!FBu7ttl&HiG<@#d-W!b-UyAdWnZ#6&w-y-Lj)I7Dv7niK17PFzKErX6KQmc7uNxQgan7$Qf=drV$1&x%7jM(e8E6gyO| z4#$R$L*+51;}dJs*F#}@a)nL}l_v>vY2+}uE>`%$VX_v)=v!7nA6*X+4d&+>!b$acUNi1*GXsb z*gsP)#iOV0_9QD)cQoFSG?9sKD8-y~>=`*2nys>(Nik4(WN%NCd=02gm}a=YNm@+@ zN6Vj>zPp$@uHlI+gtdrGm9`7MBfRWv`ySrO6jLtMFs?L>*Z~wT&0mSNzN3D zOFdb$g2Dx{wA7QCCm$5*eSxo9G5+&jE(hqqW*X1dtC9NF?nrbxOt6_RoxZOE3F;1_FN#?V`@21Qc;IkE#>&6*=G z(YYE&N9F}NS-1`>6E+UcV}zr6U4HU@jP`)hNkT+rL|&%TP835EMMo@j+dHVut8y*j zTN?eU+(g(*8(u{>;@W7z6^WMgGr8#FBffq?SNGYq?*;A0wK`aD2oS~njaU~DbD2Ov z4T!KE`-NST_oBjS4*fdt!!)O7`8-(x4E?`8D*qjJnO0p)fwhV};J?N%HZVs~|3&gu zp*QthEcX>|lV`D9%kq+2)I=)T3`dSzi{+LOb=nf_PjO0yTbO%<5T2CScM zEeDaL`QNb(!w#(cR5%MHqQm%kEyLc)5+z@@ALYhjR5WM6T+H)ct7fn14ouKE;znKkv3?KTERa)$ ziBzjlX4VKGlyaLNkERiY*cEl9orM^b>10_Zx5Vbio}W{jd1AO8_EYHK8o8sd9`KKu znC)C9vs(fLcY6_`oE$Iu#Zt%RGPC6NXRlOxX1Ofk3CNmB?Xi(vF2Bc@q(I7esx&n4 z?$~}Wt&rou^86L@H;~ICSIWyRylLNin-;NJj&nWlwR{Ni;(;1XgHN}tZ&ksbocH zQNuvGwO(e1mC+mY6&^8NA7qj9VyVIN(P5sA8{`BQg5uZ*l_V~rtDPtFhcaQ*mi@6> z3J5R`m)rzu^M`j;#lngPde93{@pyPu86Lf=vX>SNryo4>2Ph`xSv<3r5KZIzTr20zh8jMmrav0t+WWc6qUQ z^E=P?wL@0ofarLdKKV?Jv@qOO*nqY`Z(jUN=BS=o)vCzkXc1%;o(9rq!!V&oUU0)& z!VF3YZWx1i8UE}Y6>f%@T|^ll#Dvqy%~(QvP;?PLGUQBg$ngE}15Rhgt#-~oVePiY zx(kwW3fjg|agkgFY*>G*oeJR9TSXY(V?4?hxj?YJy3hunaez>Lj$Z3SrTiyvtE||* zdsDZebg_q*H`@SH+lN|g<;mPR9pY%xR=JgJIzHI&VRlZ3Xtn}0Yao$*RkVY47LE3! zqd6TML0>GkYdA|UITywEYH3wwga_$3lOhgbqIT;B!Y3kk2{oVCAqAr}XL%JayK>4K zcBahr;USdxrCi1Q(O{EJSEhrg0*I&KvCX`hPP`pFi@An@9U zw(Mx>#9D(r%4kT+wF~K;ujG-K&Fa_kbNI>qS{?%N1wA|ogX+t9$7NVmZIcK2b@f7l zIH+Xcj}rCVTMF;de)TOh{+JwK;0*7FcL5(4-)@r=;BITt&j%H#%~k{VmZ!rgDLW=B zfqdbGc{W2Dwo>k*7A!6?I;iBJoJ^Cq%MRPFl_pJrJME(Fa+2jaB(w8mbaXp5$v_?5 zAv655*LLv3)*<~TY9|K61{$(co^OWRRuGk}{3@KrHLh)=h;QV+*1QOm1FpT^4u~1w z$n(Ikgk5s|YK&or?l8>IY;&Avjw}mr7S1-;et9UJ*(EbC{Hwb-??&x5co*j7T@y;) zBi94(jF8iucPfoKCP&`OvGsd6$E1IOW8^57?Huh|zJqoRZq*Cc&wnOu(%~3Q0>j1> z%dyhahFyfOAzm%qE*|d6#d3^o<>nCB1NWeP#c<;Trta_TW%)rDY|na7ObM3cHHbGV zyKEOf3E}UC>F=hO$TfLaxETpf+Fc?)jXu!!azP)LAJVxh*0+Mad{Kxu9*6%dhx>B# zSZr*dSov1&#ozI-^#53f3f6SzJ%JeYE<%NOF$5REB6MMlfUEZO?689 zrBxVB_)hLD=0?z-@8rjdb;2Txwd$77Jc`FTr2XNprzYlexZiMFT-X|yV z5wcs*P9xSCn^JZ3yg>{_{N54r3~UGL(xD^rFuJv$4;B9d#u%wjn~%!l0=e}mY$N<3 zue#%OTlrJGd|u(yIscJ!DL|raE`iPs+pnoAG6u*%>yYuTRR& z{dLrIT$O0esjy6L;8$c|f}@uU56i8>(<>0u!DB;ZSWrZN9G102Hsea}@bhy680)?a z9ZEZn$bsmP{YS7@>q;3%am$lIn~utJ@bu6zxyAkX7x1-C4rd@09g{-?^~I`^9E#-= zYFobhDO~TfC5ug{(CtP$w26mZ2HUptBmk5tl@;rH##XDV=Nlb5F8jw0 z(Y~*!#W=X$Z_EY#VDO3y@*nPIB#k{G``YGw7z4+I9yId=_CptF{RuhN_Swl8s6cwq zffI5H-ua%y;ed(wLwA_?476~$pRoNhn8!e(9Y1rP9o2aTsS<;i(|?xX7vYIICG(IX zUCuzJXV6b)WaiB<`z+2F>7J6aat#q_Z=Az%I-Q!FhvITK6`q$zh_fRo=z`qSw%dft zPh*`#7y-(;Ah)rtu;a}c{zjtX7vw10a`xt|Pk#QuWGI@WFG91lgPLEITif`ma?VFz zo|arhZ3~vu_KVo6oTFKVf-dk9`0*xnz9h$+zY(=7 z`Kfzr384YL+Erc-Lf2oV{$I`wr!|*k=GtV_u2K2AcJTNrm*c{J*LzW{ayo}b(*noI4f;JOTG8qkTT$XFq$kcL-y9cNzb^c7$ z!%DIv-ooz~b_8=Km?-4upro*fKUFx1CkGoQQC9u#;b6>U{moO_WXg(XoJMJLYlqUz{fXw+K5tpIyTi70QZ|-{npCaYuK290U5oAF^Uve>{maspCs*gJYu&F&$OP z3|B_8#0xV4u6?5-1r;%Wli7?@vwXhW|BcdIl>qXq-ivj^nuysB~e(2P#_7M+J6m zkEm@W9u+2kz!4VPu7#iCZ<%t^$u8AHlnC36(;-}^S+dq*+?hbD83tbDG{KgS4 z;xwC4TyaHlls0f~C@sNv%h#8}P}r9M(OYQ!C$FiP6ZqO1^Jsx&<( z{nMoQWa0nXq|g*42aDLf_Li`wgt>YPq0LN)2^RO09MOs|y9ssM!OVwc)larZ!#^nf%m@M1k4JgoK$9b1+7U!E7lvwP8jPCGX%y(R*iEHRSt0 zELw>6{#V@B3+M`V8sNXvX{fUVs50kdXNObzhN>2u_wKSqZ~{NXmLKidG|$rJRoduQ zUN`g#Ec`FiEA)$1+(z^eL$AQT;KZ1nYvOu^T-;A!lct9WxfbP1F^k*SpdBbXTO$&x z0K^H2#*?daSEegKXheygPIOA*dO&y$c{+>=5}g4xUhtkzb#D}$?1YMlM;7Cx%1$Pz zXG7<%^}vr7Km05Kp2+bcrB!!ARX~Lf>$BvER}?+6?_~rS^hWl*j97)ZHD{51g?u`< zKTWpsR~3PMkAHQaz`h4=-W}LiFVP6>YZS=?`{w&q0AT9tpjlUYYDOhIurG^j`(Fs` zdm}-ag4>6Q)szt!0SHzi(czk*D#au!j!IfJD;ByYi3*F?mvzAI^~R-~Pzhf6EEsdl z&K`|uX=y|?kG;C$6wE82hsaNRC{}QKYS&PL1r9HmU$Tq2R6d%dJP-X&Ns`hEKVdbM z>Y=-TcCu?Mv$k$Fuud7i@#NLiwWiWR_=A?#RG8WoaJBjUf5di&madBkq@y*JUf2X% zsVt>OIAtVbP+?G898TI;M@ay_iDJjz+fMEk2r0TFSz%-TYO=y&@ubvJ4)Fs0jRNCR zl!2gRY6?CtqRlBvtZ~#p*cCG$v=>s8s!)0uLE60Thxn);Hh4M=;hPtZ%G4=Uu|q%B ze_#;f4Mtd2s?yZ9t|VNmiOui_sY;9ut<-|?a41!Y!&ttZ3gOs;!qSu&|H-S}Y}1V9 zIv12b5E|g}bpbH#!3dzeK2817c*19q&~|N$9>!`>8k$b@X_}IPKwpNEp@KrOV%S%r zl~X0GSm>e#wUuyiq;qYBDaoFw4RJ7rUcnFNPXr042N?X`U7PbeQiqb(>TrJN4y_wT zW9o3`Uc3+#Mw{?A*bbb5xhtJ?qmJUjlZ(m+*AAl&O?voJ)4Ix2=C@3mn}njR;gq@K zAv^7^3nCt+4eh(ZGJdx0Au7#+yJ7!&iXwbRh5b!{8O{u7w4fM)l8fsp4^_w$T_2TE zWM}fkooV*!DcQtEXQVm1p#rcMbm5O`uC@ zLuSh;%AQ%nZY|wXVTTRCjDo9h*Ws`3V}xA1MK{W3zsxFp4Z@07j$d8eNclv#PO}gueDOg@%1HFN9lR zGOt!^BcBNTY@A1LHCLE1=FR2`ThN-@Wh4L_S%Jj=?p>*@*M!XCfnvzGh*6mL=Yf4wRhz9D~9>by+-N*qTm~{vxw^UMt z-dzyF;TM=a$m#_&qNUP-`JDz+*0z(Ow7aG9APO<;a}6(J6cWM}DvZ?HtvIPUt++U2 zK<8;Km6}0c&AU_V=6Q6mm0oNpH5>4AJt`X4HipKvR_rL-z%sv6wjQyS-NF>M=4D@O ztvtwfzcI<-R9dTDnkT!B(iy7~c)~j>n@!?T#2vm}0{{(OlxD(F zs+F$PM^@cyVL;=~v@KnEQd~4y_Y2v?JxP3LZ%?D_y#WcHpsq^30IdU@Qk?X}r%#8{ z_YW)G@q)RuQ1fm|H~hU}4W#k*kDrdBFS;oic)>B{s&`k$;co<*cG9Nq$_z*vcB2Mf z;BKi0jyPRuZx7`aAmaCa1Wzwh$s@`f{0!)+R5e4HWT%qQQ%=v4p2`T((x(kT$SC*o z0DuHPrpz_7XDSRH<@EQ}_`Mr*w54w!LwQ}PWa=Qm!t_?&MQL$;lwACL&__vNh5F}f zv23ln)JF*stV<$65-#B$Q9>!IA7tWUYT8eE&h$8R&0b4_p5*SYyeV!hp^RT$aTef` zU`G)0LWk&}75H0QypT<1ZB+>sMm39~qG4%v>qeHS8vyWK%t&WT&7T3bSeTv|z%l@~ z4o*vmD^MNGa+OG<JeGmVbP=d3a|bI~ z!U__HC|nT^|5c_w%{;xvOsO53n#nUn>0>?P@3v!^%z0!He0YZ{znM3RaKX-+3kTW8 z!<3%pw<2&MS$blPOzVbWf!|2ShAA##W!@7QQQN7@6L{E3nNKKN4iugF>No5t95Ijn8MIGN94jB{c+t^3OUCiOl;oQ6oHd)#?o5LyR?I!TT zAEmJ1Pa{Stjj_#$rQBhzQ2KNfpX70O5#{pJ;(1g3F%jKQDa=H!DogLQv(YI6(SSo- zI5274ox-U%J>w*Ut^B!pq#Z}?wV7)vq7gPTt& z9N-{4Q)y(~T4dK&AEO?b3UhMK&cv~py;_Cn#g`(W&FM*dGL?GfBW5j`g58}|@xmJv zpT%aK2&<^HzFCp(iJtBPro& zzO0cT0hK zBwYi|0c5VUU_dv}2lSfJ$|=;a;8|q@YH0VI(#-s00K;zB*4RmbuUGL?{Pb9(91_D@ z%O|WB`s_Inxs#4Q$4B_>=adN;+7q5vTE-oKx?gMVCBkK|7-@#?TLj+F@#i5gGbmz= z(#(2XK>E+AaEuZfuvJ&GA^3^oDoq%JEyh$@JVuEHd7H;5gTb7tFJSL9lG?qX97F-J zFDjey?Z+3DuGS0`v%@EUi%G#QxARMiJ$c%NaI9#tVk4haEN0ivhu`$^@wtiMDtJ0o z@x%au_Mg`WuI#7n)YWb*f~6e~dOQ3mt5t+V1=10J2QEoXA0=Dc}B>=-MV4Tt_XggW8%RbuAyO`}i7H*CYX@}{oa1s@?9vP_s2u+F@T;J&pA3{yi(1)&a53m1d~Uw#Tc(N!AJW9 z{;|dcr8*mZNA-^*Cnya9z2o6~J|5OhP~w8UulDhQSW0ELnuRYYZXV<@XDjtYG0#B& z(~F{>6G8cVG<72OM|pH`qLOAhj+ign*S1zv9A^#jJU&UeW=8j>jrv`N2xQ?paD}g* zaps@%OrE9;7sOAl(ZyGky1=D2QR?qsL{Q7=3JcQ&n2%7JHeDHpfJx=k75LNus&vEe z)nQ=TtN~*8L3}rBFpR=yDZPy^PS4a?XeORKZ_ifD%tG((h~6L0Ric^wUQDjipZ#XP zikcv(Ow>OrI*hi@Q;P6*`h2A>%e#4j@*UP?5$ne6`AWEFZJy%b?+G)0%}zQ<%3dUY zXCc^+jmf>Jk?_7{;YKuIF#YuY zo0=1#y?0CHf+)9n!?0jqeFp{uu2r9!p`=^CSc&jwrc(h>1B-0qHKuW-vs9%T@cByUt+!p~b9^*(Y@NkLyHo!W?LhdwfWr1w#*{<{4~N;D%Uj^@;T2FTDK zDFHO+BkX#9x=w{3DJ|Kzs+4o}hD5hMQhqgG+gId6v(GP*O#4NZ(mg{Y9w1noBebK; zkCi?FcQF1odZ^LZs0i_5aNg+PN2$vv*l4~=TRu^$iLVAwMty$;lQ_4%^FiwPsWO=c zjVcSFx#|8kig~Yrg^IuY$?Pfr6q+Rnvk9FOqUlWgeh$yd%}PBs`R}+&-z-v?t8~_R z$CI?Q&g39Z!4`}I;d9StpDRug1KR|%ma-2KN96Pu%KNZaSo)<>kJ9>Rq4e{Y%A?GH z;VXzeoNFFWVT#O>&qOE-!e$Jo?D%Uz@17VdxT)-GB?)!{uI%;-9T+y- zpVGEroR(7OZOTO9St{9vRVa%>wkx|pZ&W4s4rqo<^ym(yrulP*$ku=K z5!@f_P)6Zxz)oBWn5gYer6ZGcLGKTZWxpGDVuN6!3p;Tn>rM^7QIh<>1DgDq->i-a z8Z7!w4vnbVY;2!E9j9W#a2QJDvvbRT86?0Tj}#Zx{^JdAkv9+266u(`~PET?n3SiZ$^lwyq#Z z;y%>(JLLet>l%I!8QYyMd;>rD-~$rO0KZr4fm3!^G)4Pjr;Zf#<@eBc;hyY!+}#|V z5y=sG0N-QW-6Z^=yorK#|DbHc5A9RhSeEWIId)OmK4rOi;{cO`HXOn&T=ApVn=aiF zk1eFD=P-E9zGJIF>wPVL)Z&2BHu{G>er&UsC`QKGBN+BO{!EMw0_?C&qheZdKygL> zx(5MxUD)mm!?CwxDISasfRfmz%`B$U14{k+AO0yt&)7ho;`X1u42limUuG10Iv&J; z7P@*yA5t2LI7_WNg7t1AF6uGTHqzB2$^!h%I;uQ|pVLQ`Z2SyAhM(Dy^&h}q|CrD*!`2z0gJakm7PB#)8=|3qG0!>!zQz> zTJPgZy@2kRJcdfcLE4vt<%)RTVnq}ML=&962SI;BFhh?k0e3W<4zCG{SP{Gc=Om=f zXlT1Tih@-O=0k`@QP566PC@y#rCg~^vri~?+ksczS{xLeOHSZi&;v;JP+Xo^=3-&p zDfFb$308t8&6%HZ5uuZU^#dc|q7e5R;o)hTH$j-5fXcyF5GYbti<9T z7*Q-}b!bS;-*fWCQ=F5Ar%i=1&;2-QV(ibU)4&N8Wyz^Z%!@u5g1=;tZpOtJR8=p*uvLLt zl^UxP4W`pt1H(c%t|7C`!WBMaW-XpAIK{|z9MOWJ zFanixoRO)2PxN0g(pSepWV*)n=eUA>=Q+-_b-U^UNc@Z1zT|&isRH&zpZ^E;C0jL) zjtJ~q0fu7rbb@eBqDzf+8{xrCsOma4}dnQp4pKCTc2LT>SzcYcF2F za4Nax(jLIOf(uF~HhC{_W;Fi$y8nV1^|1IfsbHfq-I`WRw}OkDF+~^oXu7$l?mvvC z4&_Q9te1+611q5T|C$kelFcnwLNUqK71vb_3DwxBV1_2396ew!>xj z<%XfO^H(LjVglV8<|Ym33&}h5qc{sEJ_K3A1ahO&I30nWARO9k+50xic z5bEJqMf!W{iz`#_HEr{1x$aAS)ZNsV=mmg!aIFMEU2XNkDmNjdVy&5Wg%8&suAn<_ zTn*RigWy|NFutCq=&QJC>Ou9cVwLVreXc4ge^2$k%2e+&c+O)nXg0@oDVyo*J064=DM{6E{zVrZ0xOkTw7YzMEdBO5(t{VzJ}&}^o5Pf zr3=>#{vW0Rws0ra`Ws74#uGVeHMeATi~M02y!#6Li2;bp7l3%;kbhwWw2Ft>-vGJBv4CjL;s9?oA2 z(^P!f_6MJB$Nz!4znX2;P8dAIl6B%vFBwwir2dgDTG`hXw`B~P@iT7*m%*N`*Oi6> zAI+!!)zN%fFH)b2r;Qr_b~N8J7teTU8cIuxYFEs~yjx0$Z5C!BV~Tu>kK-Y?z^HAX z*|bEwn|(_e!R5wzAIf_2rjx4NR#I%(@?wZ>qz7*+sr>6jr~_gUL=a!&tCZ_?G1p=2 zU3tQa?vofN%|bFecHxW~?Azm7 zAv!TGRe4E&(15G3x-g0A-^!FE4Cm{2I$M|j_Y;Hn4Cfmatj9RGao;IiiZCUs z@+o=Kn36FjwGn1xFO%x_-|(JWGx4vtsbC=*|GG(4*fsL|CY8yT!zT3~AM1IbGu$!me+M4S46&0|5|A!eV}Pz)2ZSI`8TnqYcCn~g%Bb;cNS zkcWNaB7@68{uh_Mv){d)>^DcRiyfCj>?&KNYvD&6qtb>yM&tU&t}0eu&8rmhVUtjs zkCwe6LEAzZ@k3kZXYY#>no~+U$wf_l)gRdg*iWsGXtD#^2dCkue|m6ToV`EuQzNbO z1lUfQDdgq$%=u;8+X%i9{0sf$ud+}S()(zeSk(m~h*(I85DwP*~JgQfmYLJ6BR`31w6y zsnx}g1mG5ghth3HeF!N++7FNk;0m&Ef?krUl>+?VP^kY9va)lZM%V0L_nyV3Vw38mK*%+S4|cLaF21b?mfARsHlVVYIf+Eg(FoY7$y} zPE{YW-ZG;oiQKpLK}Dpffz&rb4KSawLTy-DRSl(y5o#5byC4Fl&-*+dMyMSHcoUnV z)Wn)47A^8m8#{en&%_kd*Y#BVgp`Tr-}HuBwCHJ zo!#W(7EN1`5>h54Mvd`5vmjp6k5}<}w$3rgHvheFtva&xiBa7+#V7o!z50fvGWmDr zFSlH3oT?_%F_hIL-Fsh(OJ}1w{7Mw(oEOmv#*L^QcM3*KZwp7IhAPN0hT>dmO@vuU zcc~iiE|PRQd?~kSP_0mlR?|3jrfW65U%KE6`MXsH02A&;JIiR0n~#y%ZuI3|TIW{d z%}WD-c8`vZ_T?ZDE-QxTEqp-gxLBULQ>;Fs>QQ;bBcU`WmXC*Jv1(fkq0_M#LO0nE zYDnd`W;v;2oEna@2gad@r8F&$7x6B8Dx-b+lMt^L*bHHe0-e+{UUg!C^@vxivSC+5 z>l4&4nyV|?4Am|3HgrA_Ns-kte!U~TWp%X+#&7>EZNsZrv~Tr|fT(%L z`ljkwio9d}N2IOJvs+9!EJ_g`+kfg;lAxUMSIkw^lceO`-sB@pxaB|gDS$wc# zlok2A)6=ykdJjGDLb6&T84{<=puvkN2nq35BBwZ6t=V;m_T!&({CU#;oy_^k*pl)i z#ZS0VuJMfbFvlfNxZ}8Y~4*j?$O-&FdA0v0}tmr_)S7`Dv zZas55O^tG8<8O`zZV122oNF3S(hWE5v}IPEhyaWBo6b!i$2A&QTWu|*dsfxPY!%-> zO782HD1VNC^8Qg?@Xb0ZLNy(wvS_o?Zav;#50pcM7AP_0&}Jhs?-{l?g{_wL|64zu_}-CDd1&SAP9eefHW@ zP+xsXfH714V?RX&^FWp`?^{s>ShURo3!Q}yX$XmBqLg2+$bM$#;%)}~*|%8oqrzy^ z=Z^)@=7wqq;Uf7zfa#xOQ7I+9EW*?N0rg>a*_HN;lU>}j*f(erJ>FQYgL#On*m-lD z)MB)g86{7c(m#Rv?;jN8321^%k?!7n6SC6}KCdr7 zT#cHxQ1`K9pI!`(3FoCT&#FU$JBXFX{@zdhh6MA7e0|D;ujBeCE7Lx}I)5z-?+iG( z!w4b$+XKO#Cao|$v8^m$77+DjHhc_FO-@@Zg^yG26DEcUl+mVZKPo=&s6w-R2M2mu zv{Q$RLIJIAufB+%goo6T$Ug5O^|H9|7`@T~YuibBuLD+wbUNBW9g2mdZAY~Q(oF5B z9yGtsuHG^-h9H2=nKd@b>4c?bDZSlEZHI)HI)UNo)V4DwTRJ`48GW*xwscmL7`$r9 zSF@u70@;#o*k6&{MXk|fu-Bs73;gl7c&c{&szWcK8;$RxhDTJwP}R-R04K()f$`P4 zE@~s|*K6(Ct{-4!sh+_$IP-i?jO46Dhuha{Hy40A+sCDzcHM3creLA^zQe2J{Rh&* z?iAY1Ybk2j@o=bDnvkJ#Q?P{@cc|K*q3(eJ&Z@5JO8j(wSoPq?+D#?=EbXRF1|#FT ztIP59b$4~TaDck@P;<=r0t~!&bXP}E%SW&V9iV=Xs1uOp*dsj6@SbW6UQX|+zRr@y z!{7$;y2+#JGkClHQMHlzxDCc{B_;|ZQ!h0WIY;+Wr{UwxUTTzeg$X>VP8n}qbyA(j z)EcJ8wHj2|rL*Ll#F_}>pCp9(!z16J0TQGpWtEyFU#{}!kXuEMsrNX)&ANJVAkDF7 z*gRc&Vh#Av}4 zT{#`g9?KRXmeuUCBj+1~)EF@ja3tR(b)n)HBF*&FnQMVmZLpe$ex8?hOrjqKtE=H} zFmZ^Qt*qH=cI=7Kj2(d2+TVc!${+38j2<1TKCOJW%Jz3@Vuz`-u&k^frY2b5(^r!% z$0x|NbEI02sy_iC35U-oRTXJMme*}bn|x3JIO_ETP_dIfPiXJx5B!9F_cX-w&t5n~Wjx`ebLzOtw8GngXW z<_IBL9~l)&g`?FqNYnXQl>RaudKP+!5(L^ZZ(ZVWW-*S^ zXv73HiY?I7C#a3;v*J8}Z_BP_z+c{4qgo z9KiB2>>&7*Y$7ci=fT}>O`vsu*nqN;t!7#F+6BJ}6cQBPi(Jojw^3;qlbM?N$tiW> zd}1w{YecLKa5bo3j`ib_WI)4&XWW4rj&%N}7KX+F6}xelN<|aZt%5I2o`h|$FTF8I zO$zl-1k|XgnMOk{AXzLByt3$m)>BD#`370dqRE1YvWRGk2-?QUiNo&dkkaBWKIN* zytgcE0xL@|1luu2dneRnaf<<#y9l_qdT+gfj1Y4cLbJ2HNTt)|eX`Q~FRQWiW8Pzr z()z(6k@QacD^)ztOjVnjgg-nRrsIHbJ!)b6p$)$*0LJ4CwWshlHJpiA3(fpY^=0cH zu)Bjs6Q4t={T!$k!e^;_^h_4YII_k`w`Qph_>=_C#_IkyWzXh$-YC%0iFoi4z`ef#-YEM0- zgB@^fr3ChVj1`?1sH)z0g%uG>3At)>+Oh!4>J~b%KurUg{&`R;=~P8h;dL7%6!eLD zt|)k*WH@OOsjCBzx!oqO{P8{2poeJsNZe73x<*3?-NN7?H3Q0nlyIsnai=XJD|^Pnm%`6gGP%dcajy@duW z!sW#l&*DYuD{QNt`E{Qr^!O5p^YpxJeHh$Q*0w%9ut042pq`V~ANsjV5T80CJ09ZL zHk8WxT#4-Lf;jmFqK}PJ4D4yo$BJy20ioeHyqozv+kF6T7}9JS{&t+;!++ZIm}E@U zCn5zykxs+|%%bBd_p+i)VEYIJOSid%cTjr#aKMOt>1O+j>Lz;wv8GFGDY$&mmhYQ#>nAW`)-mL-kiki25VhR~L-z7Bf39c2Y_d7Ykaz2+UMe!Tjlf@1glP#4kkJ z((F_^;=ZrH*(N$ay_HMo>$$!ZI|AKtwf~4(FgM#=fZfb;+Po#L2gNDz&8VPItq05@ z*cC@pW_B;Q1WzvW^T!Ar0Vym%=SbzfdWV`?xJ>lqGBsub?B;A}A9@{x;n=H*?IYmn z>Erf68Wv&+!UVJ>`v|cB^lImZIBOG#bohdel~21sAO8Rww^s{|<@-D)KYa9*Xbw*5 zU--1katlTx2MYjR>2vjp?^d=e^pfF|B3KzEdd<8vs=Hi`M>&vVW+s~TL%Ed?1VQ`w zs!coY1JTSwR6dN(H*0Z>-Dd690xp^1oM%X8=0U4VW-LS8ZdV2lS_`xW3k&)Knod5* zth!zS-Dh%a#XkFdgj@%m$3r;*lUr`&(;Or>AMUonsEhTdF4jRfI~A}HR7}^b()rtw z;f+wnhrX&8)v=OdtHlUbuTi0y=MLxqqB%9ECLJbhgL7GTOFd!gO6zMH~sIMZB zAW9K12;@Op5{iJ-h_EV1lU{=q=_G(ODT#t~`0tss8xVcp|NFk{|F2wE_LP}3GtabV zo^n6Uqgzqt(c5A0z0B}Stw1^L?$oE4uUzeLVBNCs&nO!AmFsQrRv7_OXx3uaX*>qp zUnGrKaMcg7uDAJ<8MM*DqOU-nB448ur%oKo~~5s>^c`)n##K3B{SSy`tesru!j9aTGS;}-hRs>+MKhlL4KDa;W8ZQ*zsA+lI6oAQ ze;f*%UjEi)w_N{;gRgX@xyuhkz33)l)okJ{EFc>*zjZYgC6y~F>D;%j`p-)GdDXL$ zs;-5sVHpis3!(J}ZwWbTT~U!Q0L@r+#{|clbZ9LY`4u|wgKIcXm07{uhBDXVpy?g)nb*s5#Qv-; zF7IfMrgP4TQRM!!?Caj)T}Ijg8_2RQdCq)l|0A?3DW0_7%W9J4;q^nMv~BY#{Ukoc~2hI76gdEQ`tNE$GZ|C}>yie<e7VmuGuKLT7`N}Ptp!oror$=bFV+@h27X?-=M*JAY1vALia+<_$ht9*Hv0N ziU`qt!gKf{uV2m~ zDYl}MZXIxGyy*vBv*gV`c=jK3r9*`1X?Mu=g)B{=!o!&EX;kM3&Su&4(-AC9+bQIz zD-keNuN-wXMAivMQKdPw;;5^s1b?KX`gl6#8Yx|-&yR`h7mv9qM++_{fG0CPa^3!&o6-MBA z8AkojyJA`kkrf8`{)h1H@yV=oYgPFC=+4c2sU7#T@Ha$8FV-UPqfGjjyEfqSrrPbR;#t;EJ*dLth;~)^XC+G?1s;QId{&p2XnVN9iYB z)%-X7>Yc7@?vejRmzz$UbOjo7WY_{Xyy%J!SM^;4?MPpby$P;K{y?!Eb`b|ozz5Yn zX1*moKtgG0vdG8@Kk|D+df^u9q=jv{rV8AEhDD4h( z(OnB%N$5Z-K)*hq$U^k?e(GB28VGwzuj(|!tNXNT!if~?B2L*}R03V2*Gye+APv$@* zai*h_Ojp5aUZ)OMU9~Vp$6bXc_R3eV^>$UV>(jpsGUeZ;;;X3fbPBoV8jQ)CehnKy zvS-0HSEzxz!UH($`e4Ku8}2gEksFZYyg@x~Vi8RNdxiPkfu7zJqMPNnT-?JxsmN6p zi_@D$I3-lzo%4xJ`)M&pm-W|ndSzk3ywYYbGi2i+v)hVY1MsQpzq}_h`@^tk=o(=N)W4$<*vmu1L-9wTBzw%>I+pl{Wqf?cNr; z^QWs~#CC_~vj>HByf|oU;}1}+yRLr5vHmdiEWC%=yXG#Krjb%6o=y|l^?T>pao%XzAN&(+XYqGLTrHy%LQH;tkmVlBB&ogU)Ql0uUn;=nqG zHa-N0c8?5?TyfZtu2SK5K@rsGk*k6j0Xfe`z%_4|IQ}*QraTfO;Qk{F!Vc8;v5Vt& z=06sl-u=mc?DShYDfCXiRZ_yg@AN2o^2Ft*_QjAaDoKtZDMpbvg+4bLT$U4OVl+EC zyw_7#C-?{WYroIv$>2fs)a7T*_%0US(Rf+-)D>(0W@D_j19wPso2Lo)>P#hV;qh1) znu|Ag_?sE8FhA=hd>GoWPBXf(SnHmHA>vCjK4BP1GuALZkQz$t75q$)7}v<}ml(%` zG02SXomFI(Xna$9Qi|edd<0lQnFXMyC(2Ck>Cg3^<{aZ`nN>4Q{+?sh1sPZ@pcWGh z%*EHWwgxtebKLt4tTA7a0*!1U#@d%g)+!cb?Gvwj%jdgc*FM!P-uxgCpGLBYaUP(7 z3DruWG!t|3Z%s5Y6=PzFiSaRU!^HTocbFORmrKp88y{_x$YEqIDs5psQQlY!YbBkd z{T3F3A$G&URvKr=X_=HJeH2RHSXo7WJ5|5^-OAFi&h++UN`Ea zDG_x0;6UdnQi53nc?%TG>rwuoU={>Yqh##JLv;sDoK0G36gTEB$ydt7e(FEg1Gh z9tsFy(WO8CRtLoN*A{!L11Rek_@Z_ptS`v0E`+s^ZqwrsF&4E@wpU8=1cZV9pj=Wo zt4JZg0>~w&Gc-}7!r5B9trfwbj83M$PIg=}c$!3l%2J2y!r%CUI4+9S!uK{r@$Y51 z*e;8q6zac5$}XO$;{AtBdk0dHi`6uag=jiE;S!J9)sQhi1Y=oCO}f=!)SIznPJv)E zT=nODQ(z8?ciSq+wc-E*=hz~}nJMjLR9FZeIr#IizdU!6s<1NX=B5g(jF~e;VJ%&J z^(24MT{=7A@scHw@>J&Z-@H;Va?z4XdF9y4urJw*NY-VChtjlIK)h#`WmRqa^fVl=yGMC3r9LW;=>o)J zDZB8f4gGkcJo@<;3alXJUFQlS(YqDI!nUOXyD52SbwySQtn#UfEZUNPT!G}JYgQ$F zg;FYEDtDy@xb^eR0XS~dd|jjLO6;U@{L3=paV4~BO9hXhCe1(igN;sAX77PbODU5W zN^e(T-1X6~D%)s0EJGr{q8<<|zKiV@LZdtRnW%f(B{My(%D6qAtr}YaosJc9>42*2 zL#k7qHQ|{||CniIb&=`&>a3rgE9mFR+QMICgafG>&q_=0Q%XDw^%oI9+CWV6<~4`J-fK7$ zuD=Oj-vkzoT{e)?er}EcAT<~VOADec;jr2pcITa7DynwVNI}h6vY)Ub05y|oa}CCw zJ%cIl@u1q|fBz;A7!tzoFk>6mGf}^q%!$I%YqI~6u6l0QWSb??sztt5ZLZCDkQ49e zNeAe`UTM~YobV=2JItFHS6h$kfhh>I3X@}u*}n9t;{hs|_9eO-@fQnKfIJq8?#FX(Z7>`WWU-GGfSPM6^1o|}Y`QLzz= z@$-2o!hoa!e$)T;iN)?lsf)1=e8I4#h z^-sc>KTPwIc!^Yy#Q3@PVG;huqN1DkIEbihgbYy^j#DE)Pz;%MJ4j0!m%8(DD*}>Dvs(I zPDvUYAShCw(hLhjX`{x5qp~%dvIHbT0N$s7@cXDK)5P%E?HfM3n~LGnNMDsoT+W^w zKEH?=5=T{EVu41Cn#MpPea%H(USj@c-UGlLc;odVI2p&YPIUGq765W@p)EYfO=iOh zK&#r*s=nQ#ZS|R{VdgXwYt4XWSV%E$GQdo{-;$LN*j|zZzIl}KMMilFY|gr(`a7t4 zE7p`&G{-K(m&q-y!04rSE-qu=^(@aW{~0rI^IEgY4fzr`Mb`3W2%ufOJ?3p2PTJO3KQFh< zH{O$ci-dgMF)&UNV(u&7llc`?`2^K^1@pTj^?rrD)QEpD^Z5^+@P5$$|N6m;2V%(b z3X2Im>1~qG{hy$aHmoZ?Ke!Eh={ej{&I13~2J6CGbgPYEe}miVn@iQUtd_Ye+Hww# zNC6kPZv~j*QEl0)mV6nH3*c#lRh)in%lzdGneMe^3t_B0w;iiuTnyL+cu%*Buvy?Q z##bjtm+Z_%isa;)Xx(27;lhI2qYrsgF)lQ059yLeYtP0=z>JXIYX->rWY);Otk8th zs&=5rfbAnTg+<9Y6DOrGj?gdDyw_M?8nm$o4<({Sv_>eLWhnvl>9!sfulEU6{iQObS7uj;7n|RSecX zK3vKY*C8Lqtw@LCa$$B)-~_yib*C@Iq}CK>{sLfk*s(Lg|9zRU+_w;QLEQ9@ zVOr5Bm8pKWH~tLml$O4U_C9LovZVu#%<(GH_)&cR(#Q(3#uGFxRTnDvN4R=sjB4>p z;YE&A+Lg+>;S}C&cF#&UYbSSP<1mH;sLhz7a#@{NY1{RW-eY1P&qe18j~A(Y}9Pd%%u7Wf!A88nM-`Rt27lk(wNhyBPqB1mZry!A{lc+$yQ|aqY z%uV0F&R#WMF+h(TThKP#Q??sxD;D|<3C?f_)x4V~DU^2bXS>M_af4;wPDuZMIzm_vWXgQ@u@>sdAz z%2uc*n?p$J<|~8H(LqS!HV9?YrBkwFKMqHaTPSqoO*TMI-%3s1Vr!(2s35&gikJ|k zsMuwLn^8s`s9AgC)ciTE%&60evjlIm*C6=^^q4v?*!uzO9x=YhOGf(f ze7ztl--j(UWSoP#qfKlCUF-uUBA4#;VddpNKd0!vtaaqo!@-)#@dnI~O&YEpCa!wb zwoah*zN}%5A}Djyj7>^IU3uLQYk-|nX>OGwYni+EKr`#GLYEJNiTb6A@au-D^mV$` zmko_vSrp9UMB%GO4cCA9Y8=h%$Jqb!(_N`?e-;{;z8!Wi5IoztzI+$;?9V!5aDU&Q zRgtf3qRaiUVE;nS0c<6@e8&LR1+8`u#Q7N8%Rm+nc`PuMsaI@^PzpNWHqoX5mO$Dt zkU0aVuJY3|4BGZz_2^ZF16hpaQ>JeYH+%cl z?PwD|ZS!w0(dMj(aN4}TW*AuqvoSF6(44X%OL^&_u zIY)8G8!GrN=@&FhwL#(-Kc$YDDh*?{`T%3mi}bfYUoUBdPuU>|}o0AJ{w~29c3)n^K32DnPOzNNL z+%N{?@B4Ir7;759Tgmg6(x#^$ro!V9Vf+sl@8RiQI}PS zUzrmP|EA1$*suQs7B8ryZkOQ09R_?O zrCoaJq=Ff3%~a6fcL$9g$pX;=0N>TNDb#j$TMls!aG$AfgabVheLIT|aU^Xtn#+@}TD6_Bw)AJ5?Z8zDjKPVcnZM=mpAisg!Pq(RUbs!*LFqEE zQSZDRLGj~nm!{<@9jqch;$8Ui+tOK#X~sm3%U3NOVju`6zZ@r)f}U@tHKX+Ag}`V} zXJPW>a4K8@R=mmhmk`Z8WQB#AX0RD>s5qX%QX%xHI)>HppO^)P;NXXDr^dF*W3HxAM)=p|nOJ>{_3$@9>Gj*c^plsumK$*K))r_jjp;DDB7QTBMqj#6l4>!T5LWjw2H&S9u$7)hlMf?t@x!UdJWDVKYwcb~wl z@*|>t6IcWBJOU;RfLB{T0pH&ICGD8N>dIp!>J?Mf=>T^kmN0HefltB?xoh=u)Mg?! zh!b@_}vLED5a%_G(_l*UeC2c;BG>SUbJLAVK1AlH18$Cq{b*)(C#gUHi| z?hF=28TSCX;@FnlnexX}4)lEXIomHw6RFD=tZ`icU+VSr$=FIFW#g>oH3ss5q+yff z6~nB7odu7Y@%>T^=Rdy?!tuP^;o($m8k>gNq-Dc3`{*=CkgzIb;=CO=o%N18YezsJ zn_ilkN0JlTGqCSE5;^vo?35=}Bp0om&dNip>)k1yl`eJ)Xh0Ekdpc_lX`eR=fp4cV zc@em9dc@Mue%<(2G~H;DT8=)PEe--PdI;DxvxTh8O&N(7BI){U zR*0`0m?NfD@jLi%)w!%P=;Z}te%6sX7&CgyGkh)%JotWDO0QirB75}BN|J*X%@d`R zqtBztM^FSy3#Qel15I>y9&>=W<@KJzDj^22Nz)yQ{XpCb)H4PAV}oqg1s|uj8kFVgXBc1V)x>l}6m)y&Cd$@nSGh4upA?28eWq|1D^54o@eE@aWvVgW0QyIMLK zG8V9XNY`#5YmSGB`opCQ*%I8yPHd5^S&4$sr73?Y2f^#cbe5H)_v0OSPK#_}ohaz11%;k0T z$r?5UUkm!{Q1yDAfk}s2;#*N(@QW!zd_6?z-wIxK>$hUdx%n-NcP%>+BdE%Glm#bZ zz@z9K%Cr-dxK^j)z_lz2`vz78Jv7MNwX6>)>C~fwfRa&uUI{TOkr4I=WLR^0nzM(l zRV0VM)r+sk#cuDcW2u;J-rWL+YBAfa-tB@*%ou5#Shz*s6n`g zDaZPxG7Y={WK6DxvWJT-zsg$ee`)Yz05i0k<3f$g~BGB+YoAaY7;-{y#%Q=2}C zM-X9Suz?)$fpLfum|{*$_NYIAfdc2*Xg!-{=mzumChO6)x7M>n(~Pf8j;Rzd$5I+d zsBD>ZhEC71lqL6%%qX8R(xLsGL;Zg$La@^+7`PiRQL`Ueyu1SAwqj!itrjuM5gjpw zM$NUv(WW2S8=#q$w)Fok)qA?&B*|UgnnTBfyG-m9O3OEj7B*YjXBKotzyk|S z>2X)3ecSq4`J|)ZEi4TV7&Q9z>cIb>{KO6V55rt+-2=?*44E{KqxUY1y!+VU>1z{#ww6=d} zf+6Fq_Lfe95b)fz=+h2ck~pONN6$_8t?)VNbt?6(A>Q2#&*4XUXfK#e{9fD3bP)eT zo2k-1R)$w8WB0IV8nTa>Z6XT5s~|jJ$dw*p*`qs_$4P5g0-_?%!~6bk`#6jLX0@L4 zmQD4st8-}5u*EZaDY(YH(_Iv9&Zw(LrAdeAJGB9|X`^<{)^v(w>i1}LU zXO@oaYky|1V*?I8%(8H|s3#Wok0HzZ2nuSsS47XC7tkk)+@#`o9Y{ zp*G=EbfR8sT5}9rAWHlNBHod7DAgQ8n{9@`?21ziQn1bE8gx#g(U()A5ZK5uP4;n- z&rD@u12pA0t04o{ck6N10p>VHa<%AHo*JFN0+yMbCdXj>e(+L92Q`Tb4g*@by$UHDH4&TmT`qdXn`wy$g{Of}gCxq{=?YYMIh-??+nj zK4=oouridB`oKt`ry!k~NJ*#II6w+F-ugx)oj!$aKaGM;v$yf)-P6#hbfjgcnGP?U z_Zf#5K6jci9jVAcxs7^+%fKmeo?-8ZLW3!-3mC+(p%0>HQl|$F1nPxUl@}jEDfQuY za^nnpS)M4-lo(*G2TpmEM44whLR8J5oq`agDK`Bv-7VOcIgO@{)?=g{KP;hA4B9-P)Wv#y?);& zI>U>QaK%3kxn-~`7DZiS8)=K`I*Wmps5{1tXT6SIqVmBB&wX>Xf}k}omiKW5n& zY-nK)W_6+SGe!-1y^B3D0a~kIKHKMM`E9041=)rZ=>^sKqVT35n+3V)gh2 zTlmG*2;i==+I$QC=NxYpVIx4&jHQ=h?2qLq!Sg7RFFzZKAf8%7M~h%$g7>{X`b~dd zrIu)1MK`)FfTYDZXS)A@5!bs^_YW2;ZOMaq9f8rQ6pW5C9XE&dQ++}40M0;9+O~dGK zLtCaAoRP`;T_S$OTep5+M!XHEpx-ItZT9Z^rKK_y-{hf*lzVIhYBTd5IP)|*b`J$l zq?Y$t66W>T`>cvT2X9}H69u&Q(v&hcJ)H9IGb@DdGE^)%Z}wH`!F^^E5bqOq8L3wS>{Ohb*ghxR9|9Ph`PlyD{`EPKvP zgJch>CB_KW4Yw4GRa3_4b*l2PI?)prf(5fS#h!i2X!US|iOwy00x%ZSgAiaM_<)Bq z>DCiA!u*wloOK1p0ok>CLG;B_#^kMlE*x+s+yvzqD!ThAjyWsnPyCoy@bnGnP?t-g zeo3MRcBGga@-W&O;1DkxlCYIE z_?>+)NUA_1>pA>n$4|7utZ0}yPs~ag^9BidgSa3O;qB%=Nu^ASV#Of&(xULWzuuyV zK@u{%aVh-tE9ahJDT499?*L*r)RT89*S$;~4 zJ{A55##AU8o{dAcpTeOJgOs5vTq^l&`dYjkhO~GdynlIE7{2H=Aks>LE6~9!L6Ma2 zhxjGaaEgnY9|dm4Q|zZS=Ld+GBjvG3xARxZ%U_itzw<#1qozlTUXd^$0MoO|UwIAW z?-^1zQUu4ysNE8VXx50Dd|w%0S6-2)OH|~62*kbhQ8Nk(P;!D7W(8|o9y&Cr0{Ne# zClyb;5*>!?`7>U814q9w%AA=P5VUUEbMG93v)oDzd9sO`jLnUp>~e~qee)l>4oK3r z{XrRlN*jnTGEVfw4&zd|#eH%RS_C;T!ys?_X`-XjqMf1Q%+5na&Da_GoK)nKk~=OH zxwC_cf|UBOe=LX-Nho`n;l2ncgT31Hd=28x+n+M64-Q`GB+JWt3m(%>;$Yez`P67&Rq=AA!kK zWBklm8p4Ar%HZ?3v#KA0oJQABI-_0h*H9*!HXMy{d`-F8iEYg1FGo2hOWE1iE295~ z)>K|KNRIQ=GbfQxmw;LdNBv2vrD&+I86M0dBdGtrvoVyMo5(HkHscL`3L})t+hzFqd}#Fy6L;!o|2YN|+6?+O2M{1X8m3RSPYxpa2wrp5Qfps#O$o zXIMo=ku#Ujl!{o2;CVSd@e4`z45_5NB?Zi!Xwgo67N&70?0$ku)FULz7O3TXXVA{y z3&jggr{bUcIi0{bdFT-906%_U9SFtG>W36Pzh4>uJ6A2*&T$bC6BSagf_{-Sx{9d7 z)bN1f9A4?42O)^|}y^ zO{{E8(q>J7NQ)mVx06fY5ojwm;Yk@hDdPhpDG_e*0^B%DY8O|BI{K3&XFE->IJ>@$ z8pS47q7f7NHlv7YN?%Z9R5hiw zh+eIYvFlsXJy_DmN^%Ysoo#ReOo!o#IR|SI0=XXAWKrlzT_xPKbt{8$$(9I9WmEAc zep$>fkBg_VPF!x;%%7(4OHdG(8T=Ad#but;QpJREhRb^O6xGJ(Fok5{^M?-MC#Q`rA7^u+w#IKR5jG8*&bs1hFEX5NHdZX$Z0~MkWe|^3H)#0nC>qs7>4pVNrd#Yl zI0dy){3+Qw$WDHml4#_{k(3gijIi;V@*dcpd`)TW)$kYiH2lN-2D#|O`rmm3Bd_UC zNt6bknqMS_nm?nh5=A4MDpp~vXQq^)1v+GUZd0Y9<@9-3s|=s8Uz;kGq1X?8N#VX+ zTLu(_(#n^VM6p;-O&%CZPp93Aqv&P|H&*l~Jc`KfGOM}-yG8w(ou+<`x$;gkWfTCx zi<>Fq1w|^BPz0fb8()OzuCe0hrAW^RJ(LoL2&9X!^UygHL<_eJsz)Onx609o77Dij zaZp0h@1d04LP@~}P~1Y{{*_z&cZAY`;RDTdRa46S6N#!mgB2(RCrfX@ULW=$cxm0o z@-LLC(h6*SU&{SBO&E=WNVQ$uahsbl-ofG;BTPoUY`zUxl}ezlO04Gl8FL)~B3wTP06gXJrpJT}^sj`9!E3 z!F{>wh0%&>CL3LR9W041WFyBEOG_%KfbA%=n{pi*fst=0T_D*ne6Y+(H{TG4$c%sa zIRi^+8*c8!VhK^Kw&W&7cUOLvPJ4>G<5T|wi?kJ3M=eXE#LCBHmWoL4*#&@9czV84BNz-bUw5qrA73 z;o`YDJ2#v^Z`envDlc?`mmF4>u8***w6YIoN*WdRQC=}Vi2y5?(c2hC&H5_cMMj%9 z;}3n2@hd0g9tuOy)3qiON&S>=$k@FfGLExCNGCFG>8JD*83VmF`PyuA(98YNldCAL zzp|Tq*f{9(kL=~??E%WGa2WZ1fHIPwgWXqd0uX7e9)Du7nkif%;7fn#E+XXpC0sHlo;^aKsYxHs-C%eC%pqXAqsMB$cortHGwWzgvH zLzEikxe}CFAj9H7DJ=W)ylPUJa==s*6VwVhmsiQ=vx0%yx_HH{bfSmiWSmUBhYG&6 zco*z|)(=%U*lyafM&SsGtweC$S?-L6(Uf22irK8|&ZzM)rPAoPeabE$Cij0--=v(GbN@$4&iNpU8wYZsJ5%pL<_tt`+u_qBJQ5A1zyxyFIoS&1v=L3 z^DXeM|Dpxi4bNI6D;NVsG3&LbG4Ck#<#eZK<2yuk3}mCwIKVN!CFQ7p?x6;t2eHu2n0Pw4Ww&G0_5>?=-h`&6wdsy?}b78J3?Xd!Lp={G=$0<4rQm@1Ph0;ln3*lY{w0^#3c`T z>#kxI^PC%@tl$e^%H$ew&KoI&61^7Qj)bftnTnz!;>bQq;r3ziqd2GM88%8WVBw_f z>9FcKxch;LGDj;7v9bk!;~$==Y#y>d5VdZg3 zMLLLEdAlKd%SHnp9GJ2^S{V`d|!_T5A$||Xwr{m{}KiAFn%2et|GiYWeM18kB-)AZ8{>JN&|3`WcI)7=2ht?^?pH}|?C)s5*_6I!8@+|s62{72#%RXlg zql?n^v<~wN(1hb7h6Oi#vN<;&XFzX(JdYP%6^ z_kqJ^jJ~vu3iJQv8<*P#^b}Y>QoqlE4dmo@rH;a)Q7$)Q8g9k-H0n_`$4vJ>7Y4 za{f}Sb5fHX`qs1M8&fEa*#Til8Xc+<=%k1b?SbUpsg#p51E{#S5=yV{ zRQ`oc1XZKFT?%woJCy`^9E@dmDW4(Nid|T+aEnbWlmd1uABeP8J?+CjVEC8shAq8ymEp+OYY+0xDW~sYTlPSlm`1tvag=GlSE*}U7>wZ|lIQGI-WQ*Qt2Zyc z#y)JOV)qK85&M+?!iIEfpQ3UZZs2~U3*Wn@#vR6{yI+a$*Hxv!ox^;H-JkBHZ};Qe zfgKG#w!a$@!2TWoYLs&_D1?>`kr7n5QGkPbA5czU+BQ0finFZuHTN^TwmOWdC^MTGFiNf|#Y;kZ8g1%#$6e^x%` zKSQ@nI_MYvfIC28Y+Y#M-(Rt$c|rA z0TX%l5yf9*3FLu9!f4YGB~080QO00pxE{m(y74-WjE~DyuO1zi&xo;1jv_6_eq7D zM8Y_ID9j*M|9Qs*P$s23EXTa|yT0vT)~$cRxN}Rs*LJ+t&r|i3@~#}4R}S71TB#rb zKB?Ipv;CjHw>yr|PiK@|06)Kd7Hrivnt4`9taT9^|KYhvOT% za#q<~5=7q0p={{0?}x`qeP~O|vY~eU)BxyJ4F}G=c`e-H1mzGXD8w8oLrq$hHB*nk z#5(YaE3Vcz8nFo-)%%9yF0Fh>BsrP{n(^qIEm1s@S|w1mLQt?1#Roy=_YS4_i#O?o zkWhD`+%xB4Z&0WNNFM;5zh!8|k{=EUKG*6!(E+KJ+p=fmwBX*f8J{>@h)$8H zd1&jh3#i-$<%a;z6<4gETWTI_(>zz`#s#IRyl)XDTvU?foicKDf|6=(NFXh}sPwn* zTT~WaN8FFc&rb1AB2-FhggqSrRU*whWvm1+gE&|N9=N|Mb-k2I20b{Xw*9J;;>9y<`w~hv8*@^MyL$3FF{h% z356mkz-25)`z|R~%f)TcS~!mKr!Fb4h?n4$`O8L^@$%wVGxXXJ@PV6ZP#{0^O!C8yq)q6VlDjPGPW9Y9DnKk5MGM4C)B`I7ztOr^}$r* zMRvb}B5AxL;w25fqExN)f#$W%ENQ-sM*p?fk}=rOYtq7*&|+GGOyrKPYo=RQFgug! z!4<3vA7&RntstAyEgKQw|`-%>od4t`^F1Vt7pYjM3LxdHs;ij;40-SbZ+!n3Ma ziIlj50L-R3QqIx_4yyKtGTgl3=Y}{}(QoF)rL%4+Hahx;QqlL_DlN>Nspv?90Q&GY zHY{%mqqq1YYIiNw1+cZ4SXx>6U?h#Is0PphcVrN4dKem%^)S@#tHbg;${L7PQ3pgN zd%k$j?Yl|^!9kU)$vrm4Po~8C%1vn$o%0N@N>3j}`q9Be?BG?t8(xv-K2V0i0xb6~ z@D_?X|LzrBxsz))reQTg{7YuEMU2xew;Zt;r{3kshXM~fG~e{L@Nt?v))hgHN9dHk zw7P$UnB!BMms2Q4>g-49J>3?}*S0My^VysJ2pr*OByBbGXr!@Q&3t+ftAQ;wKfR?B zZDRc^&_z zdj?H^qU^L6<=Ql??nk*Oj`}{u#_>LV_Eb@wUW5xH@Hk+++6q35`$_>=l~z|75l%;* zqN{h(ji(AnQ9wKv+BEBK6!kQyoo9?xxkGc_sta&o=?%}p%;V*N>mQ%Sg<+7^)EH5l z+Uj>^IL%GLDfR=Ko9s_-G>1(!Y(Q{&qv)dk>ZWxiWa0?y~xdXv|z+W7f)QY4`g+!^RSvSECQu!l-T7ZlEe=HI||bY9KuI zi~hJAX@My&8WdR4px%%a1yM?IaugL9RF2RA8(K61)(c)tX>3KBQ5}OfA%Cs7zn>1& z$&G0PO)5VZB%4$Yrw~qQlWIoLER*_@sC166(pOC?N8|8%QT$V-&tId;W;I?OgNO-j ze~Um!5K-Z%k_vaG>t>bvh`UN^9YOm(@5Cv~bovjlsJu6n7wLb?BFL-0&L~85tQkt#wk028LXf9N=#LR=Y}wpKH#TjV1y;x)Ou({IbUy- zFR9Evn>q%x&Rz5ly4s6@fVLont2RW2^8 zoE_Z1I@qQ1cD0#^~Rv6lASTEI`*+CcGZrN<&7HtPn|UGfSHf1C~Dtegqcp* zRR@OGHM{CI0|>&RRnOM;SC%$vR362}FGv12wsSyBC*Ahj2m-X>qG z&B^_0G^VXX-7OhNnwwNf>P2&cCPvcWU{%4RUizaghJEGeR4^t9n6yRn+;s5BOq;0} zlqn|q@Tb{u%v~`OKt=PCY&O8ra=Q|a<}0RFr?#pK=qwh#^HlIJdIuAlRRcb!1hlLwl3@uB`YrVdKRCcJvE98PEE zCxyt5ycHPf)GGiKodrn>jclE1#d2%ZqNw$Pq+UTTF(!NkySUGQx8P@}I&iJh3od?Z zKsf!lI0=>;E0co!y~v~}SfzdolU|d5&ea>;HcBruT5q(N;$n?4BCt+8UnNBa z=+0WaeSVIISxhaDgGb<}^CCIfyP&6Wfc24@ikNEs_a0iDz!jdAON|w=&{d?fi!rJO zLi=XSHDDzOSc2PGirP}1|D_;DfY)|TbnXpus4B;JG9s>!AVsn&DpK`XMY5trJ*vIf z{^}*|ul`&;+9NdvWW3(^q0wqN@%04i6+ADTRz<6pIzR0;3&Wk-VE8tAuelM=%H8JY zjCkgi+;JnGDZ45C>m+A@STwwySAz=Iyn(Rc1z$L*W{esJ`qiYV{oFWh#;C38!Qbq~ zD%TcOhKG_55Y=np4kEE!@y0jF;$1^Z_R& zuSkmWtLGyE<+|0XQZ5~Is~_Wd#piZF1O26!(iyS(Vrc~QkhVJ-b`Jal4NE?7I##VE zuO+>c8vP|}<2cnVji;V*YJJdlGl0}o91r8L2A`)bacWJ|s!ax*Pw&U6u}H>Bs|~PO zyjEK6CjX&-FVG7lq|dAybfL5w#}{rRaD?(kH-n2R>SEvd%%g25FC&7wmQib%j_l%x z->GHPSUn4r0KP1?JtbM_RvEQ{{L><;QWk`GNL|aSaj4A5vT6f(!T~5q49qiSRew#zbRj=XM}k%7-dyhg;r%${nA!RFs&by5&L=$08^-oL=C z&HmLhyu3PG@^Sl5E2t%>i2W7CwKzpI>`?9Ptja3fF~muN9=22~((3!6jM~3iEtU@G zuVSmH`;lU5YPAR&-L*k8`YjbNlR{d$XxO9B0P=smK@6>~im@kCkB&&x_H`u6ei9l> ziPiYWvoj#mf`ddg^i+p9r4nqOVr>8o~n{IhDe zOL$gorG~iXhaW0B8`Dg$ZTp&{A+dkr*tGE+o~pc>YAx|pRDRQ=P;cdjy;`lsU#dL$ zFC;O-F4LOQKiDC_;67j)g$9j)npk=&o|Z;^+ zJgtu3?Vwe2vTQFPFTsAPG?14ZTb+!Cy_03+PX0w^;YyYJMOFve&`8}QKl+`u6|G z^$Isq&$jo1UhpM#uRCW0_9Dj{0TROQ2)K|qGoVh4Ogp^Zh;Zg_(Cf|ASzuNEY^J`7 zd1IyAe)XJIVGzqZxmR*8U>BG=nCR2y>Q#C3Oix-1b%;UEoZ%^aSyd%@lL4`EA4XD- zckZ;L9D#nw1L#1HzYDt*#LEywc)`=xsG zzLKo2kS|%O@W|s(Pe6)VB!kYdCup>?~1%jW_Sj6Rj)}UZOrbb9_8)Hu%!o&)zYnJLmSGh!@a*%Q%64VC2a@b~SjZZrbn#2d&_?x$8p?96KY)T2_0$JifzgOxgNfO-m&#wP>R zsEW_)Z1?gITBSenwxvQSy*f~>^a7nH4pggS82>O(jWKmaa6$Mp zAtn2pawtF(x->q1a&Jv=LMtHHK_C+3->%^F5Aa52918xAgCb>p*`@*&bSu-G;$Qm6 zNY@yAt%fFb4EH=8q*f2I-}_FN=D>u@L-jvWnOqcr$x(t=O z9G*^B>-&8?&kRg^Ba9M?hqMf%%^4Fdp86T;3`rUUNCmYkc3x}tmXIi%=wA9*&6Fn7 zk&m&(O{TjatFK^gzBE?t2UX1Sv1)r0dh^i)wX$jEE&$I{m5C}#g4{UFr}_kLT-bAn z{!6Z+rzKxc2k3|i2%OA$0Day1c%s@Ya2(*NugKcBlK?jbCE(GCYGupn(>$0!2pnbQ zP`?Oo55gGWRI^A=gU{5yk~D%AOj0XB)pTHzS`T;D$>Of&WN|lGzneK(t%Y~{C#$W| zpvWnrT@Cb~?o)X4JYP>yT|D~f_Dt|V8}8BNO!X1uP8X-DOQo-9$`@)pa&G!Uj?F89z;Zj|Z}QI$d2S<#^W3P?=OZ1w`@U@|!qO1P(r=qwt&IesQo& zen_{o5E^n6T_AM{X4s^e>P7sdeW_l+MC&+9eH(V}w0^ewB9NZ{9JRXPEsh~D;Wn79 zIbb|GQnxvOTbI6`gQ~wpr{;ji>PnC1sA9!$d@9M~IWSlKFO%S30S{1jr_-~_1HOe; zex+`Q(lR9v;=Cz~Re?s@C@hjTF2;GhBPA@@_X0py?#b3IsrC}JgJ=2I>L6}9617~d zYtp~LZOqaeA;QtW&Dmg^+Ly*HQSZYTA!DgJ6hFmF)pq)ccaXGwMp295bn_b(o&^w) zn4e#Gd90a~K~NzTNiBlVO6gt@z*c%1tY~WR`@zD>W&avAjni;T!yso?)#{-X)1a^O zxkbf{Z{+P79p(U=tow!f7Vx~aY79PfXsw``=lWV~$S;r!p~wHHl=6JCLEY#jQfDL0 z*{YuTZ&JzwN`*<%RZ8Bj<|7_R><%@7iHH-=2@v!q@E99Ysql3uiPLweJ&?HIpArj@ z6^urnxXMnoopA{V*-bC6zD$|b)et(d6Z`UaG<+8%0N>G)T@ZYrH}Wb7kALeeQGG?s$NcucqHPiZ&6>8Gmd=>c2-dINM5344+a!3tx+?#KJ zpFy0tPALoKQ1N`q8GDZzA|X;pYuG=Mk`Jp!YVk7?p4n)C1~$&j(P0hR{*5%?XLKn* zc`EsmeT8K5(;sOAUWmRGVI&dJkr#FkF9Qpg8pL^y2Ln8{lw60gtEEs(zn7dmQB?gS z$Mo}_lb7JV=B533%y-`7+DNE=V}yvu3qS)M1ZsO00V@j*saD!}7`5HudA?bjJiJ-q ze!7b~l4l)J;{(TR(raVFHy>}LMn_atRNKO%UwW(kuOq1THyfWNT(Oa6At9)P&ws~dOZ=`!i1ZjFqnBt`BN7bkrKb26K2RB8yeD!8?g|QN&@Uq4BqR)+d0tQGaQkcH&(l8r)ph=A zjrSXY0P|i{NL7xDTy2iy)g14uAa{T^xeyU_u` zq{=N1dz@68;3p#wV`i-sfGj5Dq7Dk(+zXK(lL-xrg~$yn7p!ME-Q-hC8}=e zSDKPfiJWfV!!-Wz3p~X4mz+|$3r`#zx4>8YTD!3``_>-V6G059OOm*#t;%U3X&<8h ztUit9A&(xPR+|NEH24sFpje}!|JA>PC+7_IRqVQl_8s7|&z!Xo-90_4zHG_>mj6_0 zdrs|Ye!!g~;8ea6!7DeP!_xJDZl6W!dX_PN7bWx!D`U>r^GtO#tt8*EQo)1(r%OCbeNOx76*)}b zMZpsT%9y8n^IVz~mbK2{pdJ$g%!ox%XhucFyHww7cvjvLZ$&e|H<-;!^be%OW{1)0 z?+p>~5!QZHBVFQos!#3mEc5l9I$hJJ+Rf(cde3MsQ0D=qgfxu|7LQVWNHxeuZ6AV| zIU!9g=5)QR{Lca^N%!H4<{ud)9;IrkcWjr$Q2Umq<~vm?>K|q`f4f`sUc!1qC4|)L z5!y7;Djuam(%PWhWrgPCJ3}acQh?RGOHUd*&0a~q1%sIZVa_P=EY+tydDfCidJ*lF zrdIPLJzs$zNdLQ)rcMrUMu}&szOYfx^5uwpfs!6SO3Tr+rp))RB=5x7RGT`Z#Isbb z;)|_1truBfLy@QTd^c@PE7jOh5;zLQa3DCz8zD+0O4X{o_@N^GLrt!#R&$a5p>|in zmv5&W|E7^q;!&zEK-9CUkEPh*f2wrTzp2$Wb`Pg&tPD|W-ci6=y6sKP(zdK?YGjmn zm8#WvvDBG*_IB4)t8Jz)drdui`Zd+u;3t2d%(SE(LS(9m)TutHskcICrI4Cx!b@+< zHPt!#`cas9a$5}Twz$G87;ot|$m3CB9l05-k#D2LbpVnHGzM|S@h|p?t3+I7iYs_X zYL779>d5i9`c6FK-b)L`RRvrXVesnyOQ*$^+g&O}n<=s=cs*8J0dYgyEUpkLRa-8u zxQovfab?HV5piY3)h_WF?i=*2xIz&}sZl`F26W*!^|6#oh1b<_2xr#+hPqrj=83q8 zJqx#A-BPRI_V6wBb6HOmM(_WwzKdv*H-1->kfPEbYGeEi_(RQ-u90+GU4fN$YJUUV zAy*}tY42^dkMSA+fk%EEHui~IhfmAC5~U|z`(Q?Fbi7;)ldJz*(k1^U zY53P)dB6Je0$lJatj>$jtMK>lo?rB073N(1dlfR5_=n8c6MYD*PWBD|D9>6cI+aU) z+^gjXavP#+A*yDtQ@uyi5kvHtu)lxv-!|*-N&lf)o+jpKaWI4D2uV>-;m%`;_8=ya z#~RH;6E*RRb|Vs6FTd!@{Dhy^{7RT7*FU-*ui+_s^leMlV+U->-k@Uv(bXDGeBi*y zfUHt82Kj4t4ZfnI?>Wa$tE3_YO;QiCELO$2FDzTY`Bn*`+X z@%4Sb>-*>9y28xP%(+iL=RSA&-7*f>u3_Qw0F!i%PDRSsr1^9pN?rz&yN{yfR_6II z9i-kda1lHmEq{ckFUROlVK^9D4>62m%T#xai|>Zr=+Oy?x>`x0Qe z9hv+Avfsz#HoQGH!?uGCfHRW6GA!Qpx78P@i$`S@-jdP$MprVsM4!c5G(WZd2y^PWE!~}Cw6i5 zt|))cm#wOmCsVp~Y^n=s@ZX!6uR5w+4wnBvpDbpSNk@>HWY>zym>y_o|rlXg$ zl2(LC(LR0x@cigyvEjF@B6q5>0Qahoi2!r07iFSCLa~ zB8APdm^xLJN13jgD84~xsOw5qdAL+_mB&4}&sImtJRP`)iW)y`#t#z8#o^cfsj(@ChfKs4a8*^o%uiL#X!?avbipc$vFX zXgzT5MabeLvl$?E@iMo|N%(4a81@ISRWhG`+seK~=NECmF5KtZwZPx?5l7z9z~3GlQr}1DOXVwZO2s zqybc%0~^TI>+HW^(SVIH>!dGtUcgHO7gD%S7)3S=5zX4veF}svF51;Vj<$Y_2uoZy zaJ7LxfNc%s=U_J0uAw{(Ic{wz`Z3r10KkO}<<@xAsF8TorIDPBsT|0Ss$gu^NN$3| zB|DxGgcv%q24fWCgbDqj-eSfPllSaLjpZtq!_cLL(u(>;k>vGU;H%U-qly)w?Ex6y zxQU$2JL6Q7(#|M`R@LZ?D`mGA^qPqv;zE{@upIG&n?ChWXIOY=^nFV1iq6<~vRWh^ zTYgUQ(j`Jzq7B!Q5;&# zVe7Neb)dO?)`VHHHQxF)E(2PjU6N=@D=fbqX=ry~aLTRaOzdi{x7$;3*}vWHgsvvR zibZ;F@6P_Nb;+SUCHkqYJjXN$ruSa+dNQl1gDTaax=He2YViV=cOVIbdi6oDu#zrv z&#a`DwQ!{Foe<<1QmP_ZvBs?|xv++cI?BN18wd=`;wG+ytAL3 z!n;qKB0Ud1tvmwv=`AKUrFu#7H@HuGLH^$qjR))bACqt$e^H+8k6!9^#Uaz&RW=9N zPxv&Wv;E{7yr?IAFfqacYl8_I`m19&{idW^sklwAKw8ybp8Qbwc8gfs5Wby~2FPiq z1>ew_0T`fI>hed1QP4oluGHUkaU%~Eaj%3L4Fsz-iKYyc`ysDV@1&qXG8{0o0%}); zs`kA>atOBL>?ZXEIARkj8YC~o*DSMrkg*5wC2rJ;p1f&Geuf8TmBI3RkNJYycXHJm zA~)kUx|?rS4RfUpl`osH7D=?_vJ~RV7%tmQs3*ApFs}ezWyRgImiUBFVsHN>a*Syo zLi_U(9C=0emvJ1;@%E#E@5+NrSAM3Zcf+Ek!pw%fUZw6M@aXmr`lHj7-4oGL94*gy z(U7Ew=UuJelYim@^qL>Y^Z1T8ss+L<_DGDdL5`lV#78)&F7bKJmH3f-j+eClNVx+h zbgy=p-1A4uaegbaY+6YLZR!Ty{XwmCY7ZtI7nKJ6-ht(GG~5x*cscp&Nx2 zE0q)jt9sG|xkezb$t+3Kgl|5c*c4a^%t=m7kb_Ovey8jBNIFGqB3K2$wNKPH8r3Vf ziz{!U{G$mVymQi!c@p9)Js;t1M2hm%z!_vT2@l3|?RtBa3eum8MQ0^?QLp~bKT~)Ir)FF>@ihT*Z)?8_N3v?bwr z&TO3C5Y9*2kLhxITo%|pQ0M{ANAe2atJIwQYd=4dat;UkQMIXq3&H^CLQ_q0{AXyeRoXt{)8ZX5GF>J2}k;YZ`6QMqt?exDe97t9~ z?e@py>@YG7_^@&mLPyEm0;4qNb9>s;Y43_EuWlV+SJt;u`qM% zaItJzmT)?0woq<|4J@;7%^d*kdj#9Xop#iLn##RDWZ;$NA&c%!a;!w57eD zA5B=yhph`emGJof+1h)IF=93MXxTd5yWBY4`c-LOX9CCYlTPVq;o~&rZm3GWOZn(@ zVRAShpUZz5nB}wjX9M%&6=ELpq36QT3wnHh|0lJ&x2h~Fj3#vQ;|BQuMOLm6UyCtB z7(+3x#jD}HuMZ@EWq%{rEjOAfKXxF!xJE849Y|x68bwfdmmIB+rdXQek}H-QQbBad z1y0f!SLgxZ?fgF+S0!uZF<6$9xL1&)O>>L4I>5=J`#}m-M1?!s@-;hmojk*IYXP-f zFGojT-K2Y-^2OPUhqi=CQlko9xcst-Qr64Q`Amebqb^MK0F2^|Az)D(hBu?g4dPTd zX_F&dz>5Pt58+R?I4aWBO%84aYoSpd{ep-#$hDgt0MwI*<7F-t0mdVOYH1z}eplMq z-_7plCh;84;1?^N0Y=wT%UUS$ALO}FZUUMJjx+VS2&c7n{X-a{c)l zY`hPN-)>d?CO?2va^UOj+S_$`?#l6#1zk-Ti zU(Pd^syiiZe(5hACCYF;5Dpvjzn2>$JTz+q+yXkCFME3#8!FChQa&VSNfe(oG3;rP zDTHg<59t9S(@@+OhFP~S*Mr@1iVXx(4#^MiLaxP! z`W z*F$V{rE+7hS8m~BJ(A;z(!1-p(|ox4qL|tn{*2#= z`4eD>vqX-a#p&I3@dvq)*_S`LABd?Z4Q0^H%09u-A}y8x52HRlz zkJRV5TIyJ^yPN=T05VNa5Vd$mvm!a4`P(dA?gZQOSB)t+4ydB08HPC3bOp#V}(=pWY_ zR%zMiWJZ3!$T_B4+y0)+^=%+?Yo{QS@)$COrnCQrLJ_C1NT&cuy~h-!vPwMNW*q6j3Ho6~oVNbR3_=N#k17pv{YBR;6kso&2fy zRoM?K$>6JULlb=7l1`gpZm{*L9Ai2JIIpTu2`mWzz(S52-d4JQ6;gM>=RG_fDY@F- z9<-oSSY6ulE84r@zf^M%uVz8MXsDx)t!DL0au-Vf+_$@F+joE8=v%)7t^Dr+%d-wp|wzvtEsXl>5}U6hBJ+Lw?z`_7F)kZp2y+iFFFb z6VZN)aIY=-3{c~^9HP26Yc*Pm@j>Rq{wX~7}g5@SI*Vv{(r z{Dp#8`XOq26U4;(#}J!Tp4d2p*tl}Ut{()kv)O{!t%LOHEf5p$A4BZ=!LpLUrnxZo zg%~RO1||u`AmZpmqN*o2!Bm}K(Ls9uHVBIMk0E%XJi(*o2p%m*a2qGMWPvDQ{z1yP z1A^lHV+d|5PY_bX(h_bhM{orvxF<^x%t3+$i7`}AMe&N@-#musit;+7IbEmes(()&W5(1QI^#wd&Fkgi4An)!5Vx$e zX|v7RvD?7Kz=|3$+9$*tJfb+odjP(yrb&si-a2g;TP(nXBBCCF0)k^>nK^OE!CGOY z9`Sb4Mw4Rm;l$?}#3^^f#V~(25U7WCaeFYA`n-EP%)0{C{WF*JEQahH`Ucm(}oQ~Wtx_zjy< zSz1RiUdl*pDD%9O1rSs{ZC5_PWxZW-NolTO-ipGdXH$Lfa|N~bRXAXxALaQB3-)a8 zi+H&J-QvdW{(8td!>5UM`YPPG-Jzc-+yNT@)`!Vocj$2&w+ECaMGRpVYBV4)59i^B1Z{q6s>tPYg;f48X(RwOG6ZB=YD?q8pYf~JcB%|*- z1}b%N$#x)y)SN&i1ftd4Ky(YjA_gjZDf17xjg)T8{5umKnx%ISV3w}XXDOn_Iwvz@-$Du93+Y*2 z+7t7{nsVU)wLP<2FRiEes570ZrvyoQ0rkD2$RJWwj>sNPWRgy#-~c7H?P^q6eDs*b zZcllN`GR7sr5wT4oZ!Z}qEu@S(A6ne>8^$=zLEL-qsI_jU7lc$QN)~b6z6h^SLO(c z3l7kg2&Iyzc;A^a-fQEoqU(bwDe=@OMj4N{aQ6zM-sAT z>Gi`pix!}*%>>-$RBlyZPZJ$UY+L3pJQZN6u=7&66$G_Q-@X!8`_F^_5UD~RO|p2`(h zl~<`=?f+b*c-mY0e?5{=uZBW1cojDL#4()kWp0;yhDY_XXvsPU2K&k|-w7tV{AgGN_7=9z%7K(Xq`ND6J*u z_q#o`tGj_=fNdv=0YJ04>d(*EI1-vP1iXhebZ$eXk>{+X2Z+TQk>4Y zN6gxdtszLttm0_puOF>MQbeIg(z~}>R-yMBDNmH!E(Jg4-sVT$Zs{E9Z-nXX<5t_BzM3btO?t1fQp0oO61(<8j%#^iWwO=d6&Orq zm}>#M>RIJ^Dan=jtm4T71kQU-nG7S~xaLYfY)7y)oS=ocmN!?9df=nfR+u9|I^5A( zd0E11gh}BMj~cgCxDxc6wn|MHB^X?Z8`#WXLDV4ZfcM)fRpGZ9L?v$l7W?UTVEDRF z>vpgqEM1d@3SnkDh1)IVw^Nil-578R^{wB;w|*gF5xw^aYwK^|7n&ViD60J<`+=)j zdnEu>ppHq(`?%~)Qa;3`bw}kDSf8!zs62s7QAedET->U4Qbxc4&b6?M0+6Ld*Y2)L zeZB;Hy!cQ-y}7RAMTPqczx|@3M0aC;ZcHBVD1HwW)Rpt1@)cLbzS<4DJ!qzOR~GR+ zs`XT&`R^9JlyC`Z*^-i_VO}AI&*e+h?1Y*B6rK-Ip*s4cgn5VP;berJSYGc(>PZ`a zXNQ0SNh`W`gpkVqj>PrJIc%a!P<8?JAKo2^j#&(WEyR! z_uf}Nz}0o*eI*+Op_v~l+%W6Zhn#tL-TqMN#hu#i00{p7>N5A{Dqk`&8)$Kh>?2 zFkZP#m&Pg0@xz55`#6lUOPa{X$|u~4JVk=H4#$eio2*mDY5mO;H$53%#Z&s&&yArUfF| zm?=scoA$WLboGG z(VTi#YA{W4AVsTbVkMI)dnl|~3#Vc6G)*y)nr1^_$mvQ$(bZQyv}uRz=;|kCC>*iN zP#&Q`;McV1c8zpkkqmQ}p3w&Vw-ci}%K z;3B>0%rzh^gv`WBzSQ;BOywPuDD&^`GOMj$3MQ{Pia$`h41nj-=mO;mK6(|^pQ9v1 zkCxnC&H7h>Gt?cI`LVlX==0(9>%^{h`h1S)r~o=syK5*#&&6STLQbbB)oEu20J3KmMAh1xVMhsx8cb8COxm+Da+vej-hIvj~wo->l(B zJ$CfqmJ@mNlp-uYqs*{QbokbTMnkOv2Z`N#{ap33lwygW4v*HZ0b1#G&xX0YK3ANQVF(mW?M=`7<4uhfj%RSe;SN#f zzYx6wjARXuO1k1Co&IN7GkR+YHb|I`EC+`T?IW{=aP1?41$`wQr@Z@hgH30z0<%A` zFN&10Lg`PgW&bh3DLuj3E9DaW#Hn3WxyRO zYPs*EE-j~+w$-M95E@2}BZeTfY*yWJ7^8?0N$2(B@&Q*JwN z;fGK-Yj_QhVazLY_V923Np_{)Gn?0v=FpUx&D#MFFyLKV7;RiFWHi67R$`)t8LoC# zO>jFLC>ZiCzGQh)%S(#tt;408U^6<0lD<(mk*sg9wPQ%k86KXwMlr)lA?bcO$WTvX zWql6A7K>=^nl7>QpjW=VVz~+9=0V)HqPjB7=6Ih*u2F;o13>*QEALU!x3)l6RTtJQ zuu9LaReqAd^T2>Gwr^OLBP&+&f@v&A&1LtG05NO566c#+WYHYjZzlnT4yIz}dc|p) zgIJd9A$vMaKjRDQoKFI|3GAGJdQ!LtY^*4L0~m%bne$E~7|BIMsC;iD*6QIKlrTXo zR1mXqVjCd#S^Wha+MrZ6|H;kdhkg?oO_3WFAM5eafyl7ioR1qAM3bg(4KZ`;DN5d` zJR>N{f)cmu$l0jWuq-O%a=zkD4M3V(lUhgBp^vV_`HbMs= zv}nBPs);PDu

Bg0i%W5^VXt+M)z`>i}l3ymEX`TQ(~dtNt44j?Jep!WfTw*bWmE zD(kle^7z{z5{h`ao&vzyxkafW@(v>@F-YVc7r^tZT`tdX?m{WDi~)9J!4^FuLqMkQ z-pELYF5?+}a}cmDA|r%*-|fLOay_|K>ByN(u34k|hik?O?OCy;Ej z*X8X>Q_d}E?*~_=MvJA25R@Ti>r*s$F`jzlE0?87b8-)2-7@V|+Tu}%or0gz4Unq^ zTB*wyJwj;KP9+d8SL{^g!EUYfE~Ov%ej@~pJF2~Vc5=zrzFkTSe4pFnd@xnpt#DhT z_|tH(hSjizdhJ#!`L3Alsa4e0{G=NiX6#ntEOUS6cvE@1G1N|90US6g35PsmOu%Hg z2i53%E1ZVyQNBU-0)YK(*0@C|4Dq6A_tWAD?ah6ur4$v6a=&jTPqUUVTu% zsr#{6B+|+K$_Mz+rmqxbALVU$LW4NEosMT>|Hk6!d z`xM1Yo(Nd&sx5$x;$Jz5d=5e;K8#i##CS=fygfH!Ddv#UGyH5$Z62Ws7}VnAj2LNL zLgn~^M)_iRIexLU20Sj9<%6{90OC-c?@_~Ho{a-J6>Nrr-v8wqIHJ(dmus}*5J~%E z2SXF`1B87C==2@C({%j`CHJgR6IWMy&l;f;4LPcm!dkWe5t4WVaX0#yxEE+#m-Kr9 zYqj>ccrL)K0E1&+|l>o;oC{o_STY+dLAh8M>#5if|8R#+qdL^)}fQE(KUIMh%SH_!ef&u*zX&`?wCTVeI2Ha`te({eL-oIN!Me?a6oURTgh} zqNp~w7s;Ed#>`SfQFF$;VR_6fE(Y5-UkZ_PwW3;G0+*RM(#4ovJ<9C3z`_A68v zT`AG0X)PW_X{1k6xs>aHL`SIm++2@0xE?{`fKK8PNR&3MuMr={-L&d&U{G_Y!*3#+ z!M}-YKJ;x`%RI+~17G2WH~=aBrqsvb5k7r7U58&&t{!VstV9FA+c*l8;zGmn!vOI1 zDdnO3I1iOkEL1X^{hCHbzYj<{eNi;98hj0iVSmR6*S%upZAsckZ~d;!z{TsD($sSw zjN;HVXKvmIqU3AJC;9`p1G?%1QstUb#k3FbT}N((Qj_b-0IZ?4Rv?h^=IctF-`%Zt zZHz@*Iwnf2oHws4O6(A~Y@>A7*Td#;RpyDEoa^d_*hM#V&Z_etO8da?Euz0lV}xVv zUj2s>kDRt1d>yVYy~n5&eM7N}?8cR4$9hfzK#r%TGlv#!|BnD>qLL;@qOA8^g4?1| zv7LoZGmjgmF3I>=rJ~Wd{3zh2@)fTYce|wcc^Axd@}{y$uQ;H&-g`ZWzP_bYK?@zf zrF@D@@@?$p`zZT1Cce=C)z9rgD3d!%SR!wQYi8~Ar%~7qV3_@9r8jobcBqAd?6IuWV%Yd-lPtoB-RTVMP|f%QL; zaS$(jgL~DPwNSr!&q0+ zqybFQ4!NI5-rn9GI-UPa<6@LrF<4LGl(^Xdj0Eq?rb8LTqScVFj7~bFgjtve@{(X; zuMOcr|pu7g%TY1^>4qw#-25S}dga0~uu1|WXrD5fLW>^&*bz{^a zmA4@Rm?Iapdsrr@ZN+n~!u>FmV8Padlo00~N=5Br&E$|(?sWB(tVY&JbhGeS$5AmL zX__tkbHfS~Ed~-TP209~1h?trUAAotO_bGownK|z9R)C;HW+VN4XcE&oWPe8--*TE zWFP_ZB5I3v6jpFdfP~{>^AM`7s4rP&ECvb6ebu9b9-iu=qH-0&-%q51YjF<^?|~In zZ)q!ysHjGJ9GZBLsG=&H()`I)QRSzYzbCe2{KLfl(X5=A`Y#fVdrE{iHeKkcEmc)& zoOxai1*C;zXB1UBud0;OQvDb!MtKj|j8^K~c(i4fwI=mSz8?tRN9ki#s^(GQ8K`uI zhWr^!eOs%a;FB{I1HoaoR^xFmWV-pSR#h@AYO&%%h_S*ELZ7w~i&Ek(1iKxSFR9+f z+95yz(r?*YQlqviRByzd2@f+1H$lVY1VUe#_6F2W3k8gHsW*wfN`r5_OG5)|cVNeF zA;o~CZc@Sl1cq(_{$BA)tBt(6tHFMoH|egm5Xxw4H&I-7wKGhoQ@X2M>YXuv za<~Ui#OnEl(;wYc0BTRL!XKet1;8F_cgIsy5Apqw9{l^PY^Wv?B`jg6g?9H)*O?9h ziv0T!xA}I}znE_q?7-^0;Ha?OJ%M{2XQ+sBhdcwbfJxPDo<(`WZX);R>eUhVZNbfe z@JR8fvpalNnOSW?9u@iqhMD;Fu0uAR*g++C9l0O9m7-3B-C>hLYB7_q9`=!pTE z#qqMU0%GZzfN#Qk1Wg^~te|bXD{xV`1s?a^G3h=%6|{B6bEJ{@(+V*2=jogPk3dR< ze|PX+rXMRs$WoVS3Gk!$uN+a`k9$wR8}s_*7>M>>r1)z$f~kAu2ye??7Z-{33?9a< zFijd4i@}#7%m0{a2ymaeWN$_bw!;`rP5s*7 zx~E)&j@KJhJbFxnZZsN{UwMPBer$t2(M!!L#V*pr4z+(H^#3I6kYyP2QLV(XB0@cU zpi3CCK8}YDo3cKRpQw}jhw@)W45BlWn}o@n{c%c&g{8Zb*bEE>_lY^C#KBYiZ(|dM zdw3&S6^~Bjl^)??AL;qA^kLSS%h6I4HA!qt3dT(3&5Q(Re`hz|y zk7xvUZ0hiunoNK8QF$mGPhDfG_J#6DxE3|>&VD%mTJ%j{)e(Kd?3Qa9XK1^ooB4A6 z-kH8C4^Uz+B^KsgPI01Z8W+Bn4g4&g#%n9HDmzFCE% z!z8tV*AbM{%Z zeVJBmrQ}F~_O)nUFbz4EX{NybY8}Mn45Fg`h$)fQU-hSf{Z+g9SQNCA?q^Zv#XKA! ze#TNkf7M4?Oeg!RPe|XAV}SZTq*)UOp#8U`F~>4mHb8v=ArVXiRSpu-dZ5Y!Cq?sU z)*&=)p!y0-i*F26+k4+G*AX2Csk|4{1{uAmkoNYQ!SrPxwI1CZq{gE4Rm%OM1@MLX zsy1r;rWyvKj8-k#5aVUnoI>^rKfzX=LtN=^s^j<(u;=Sxh~f3LhmBIwJepuf7}_QO zRXQ?6J&E#uGgN&Bms>;CYQbYK1l2Ru!H)35GK{Nu+@vn2y2I4xO?Uh#r&k?AO}(YN zzmsaEUb9h4ZD<(%I81$(Ypr|uhtq@?d)uk$TcS`nk9rS=+vxS@V<_z{m20Uz`6I-d ze@l(lM%4?~<=+yG>`Kc}X3V zephVpof63oZc@ZaOx0d4o}%*smgn5C}*=i9S<8=GQUJC z-cva;+38QzSgxhkaSgHpsz4D(@u}*2rlL8tJXMVjxwqEL_j6NK93xZKiTet1bZV?x zha8`(4uIRSPgM@HAw7*w-~cwWGb(Y&kTcN}gUEA?8tV7USW7913uCGJ7_}qnpncLJ zjCyqqw^6fCv52=Cr#7OKV^prC$^N8;PD&c9a$QT?u^3%R@cmcg{cf(b3a?5F8sztt zv~R51*&FH}Fjd@q1{Sr}-3SR`P~^(`N#oEHiS)%dwG}QUs}!=XR;VeP;!RD1RCQtO|Y;-&$p{e1JYEVkUw)wVwlDQXUp2C zLStO+=g_1yF`0$$6o%<~{+nhJCLxyP&~cnHnUP@}Aej_a!X ztr_ZH+;^6x zvjW1ZN&SVX1>K&eb~fGpFI?^|&gGsxDY)EJ;CkxEhW{fjHx+S`?m8k(?gPW0Gt}AG zPqlGAp{^B~=rqjmf~q)(T_!b2k`}t2nx(!eAwu_x+28?+==yAR0)k_VoTE-NrFqe& zd1|yPey%!E0vzMUc`6RmgEh)vH$rG~7Pe&&%ToJ!91PMZ`!vCXcY#_7I8(zHsO_XA z*S8DQcRB4w3)SYJow87!1UnSp&(yUNCqCqJ5dV3RPJHm^{0iKuwEdwJutco~c*T}W zaJJ2$x0k5(O;ey}?EG;UZC|3kVVVpcWvTk2c~UeFF!VdXL!Mu%)~14`YM^;yG~jkb zoVP!hs&><-W5~KpjaN@Wd#sOa!_>nt>l2~7Y~ZQ#zU&G-o1B_c(Pj+wB2W;#PMkj zo&iq(m*uJob+!$gA%VA*2ChconC2IqyNyGe8HiRPy@ zP(q+MP(plP*zuhCU`7p>_N5A=l^!JdMubvIACGyMA*={`eeOYhNYcKZCNT40klCEU zgSzm!-C@A2#qP`9sJZpWnMt}Eb@r6z9KovOmSr;C_^|#kQWwHHa^+XxKLk`(xNF`= z^_`OI&e!TXFFbm^K&@G0JUry|PAaF>+f%d~JG>heK=>aD>x!)f>LibG8>>-=LbU){ z33Ih0Thx})BA2>V-C^}xG9y5&a}`nNMKkF7_v(vS=aSdlh6FfYQxkovD zy!;O<-AXR^(AsI#d8gV9gjVeotFHepv4tmvZ$O;Y zUFc!M7;@w;HOz135j(&s8dcy$n0|y7?ZQ%fiSF+bDYIs^4)@@A>dAlh7HKPc>4z1V z783jAw;#L-F%u4`%OLza z{lduz4=rUiB^^}Tnik!qtb=NTG?NMss-NTah(l^qDK)F0a)cD=I&cUh&pg@Rk?nfr zD8`;?vcId&F*VxDv~D(a{8_DRS+quROs4GnMWHlNs$%!Nch1u>8O8>q&IQxG5Bqsr zMqiTgfp(`ToKF9&#v%ugvlx;2lz3L0#T-NZ!fj}VlPXVFGUozfK%50P49!~Mmhd35 z{-QR(*Uf$rUnh4v25-Y(uo>sm(OKo!rcldaHQaQOp`nu_2wj$|l368Z|aEvBTU&I*HE2ti#U5GfTMiB+aTnXn591PCS0N@B@5T~sraW?fLf zM{kz18a180MFE%8LFl4~O+~p$scGEbyr^-_kw+XD^?Je{?(vv( zO?B$djGbW9)kgMvoX6wVehD_W$78`YH3}8Ut8qSzl1!(n z(A_)gM`nm-O;mL4Oo*>8B~=~VB3+_0FCgOXSAVL*u$5K1s}8^=mOtJ5Ge({a^*?vd6Vf653-wCOMdNaW*s6@ftaGDoBBUf zLA6x#SYrAJH|A$5I8te&nZ-(}RAgphxZJ`o{o?|uKmS5ca6v)>d|b!kew|bPb-wX> zh=o-S(X+y9k7xYHAh}7TTy9}?^j9fT|7U;>8vEJO1D`P(f9N9Yr;dW=@z=R`Y1-w4+!*+1RswJYW9y84J(Q^`sYD z#Vsl!&PJ5Z(H_85+763tGjlVcIlq5zN!^6V>)-Dq?yj`m<}OKxqbZByDf{|5XMG z)eK;#k&AC2TaVe1AIRpQeq2RBBZ5%1S9Ekrn}JR_m`Ws=`xW23X?2-{*$B?leiXvg zM%yT~6kiBo$x43#7*bnQ`b*~|3@bpv{#i7VP8|=X9t)W_H9G#?l~G;qEJ= zK#ux{vzL%|TR7u*xRDX!TR&ac);5B*6kDc0ooNKirxg*by5HzjoA$e;UHe=&MNRM7 zD7Y3t!}LhXHrUD-M;=2AYSlgL1vj>GlNAPP-Kb*PGnsH#g+%bqQE+7-)<+rT#UNm!vLc!rTXHKL* z(#fk`B?c_a5K1Unr2{g2m8FlZGs)GAtOaDk)>U;8YBUDDwVLu{ShQ_f5JGC3z`rL9 z^#{IbCzG$MuFL`?V6UHkzhgJbR@gi#$<$xlUdbUN49d-kvB ztakMh>3knn2B7C0as672jWVGSLu#fgJsY@*uX4)prDOf56XSJW| zA$il}TFi!(bX0c76bh})rb|iKVZ!L!+AP9v-WP6doQF2!3%XdF#hX{*2tf0H@^Mnr zcouBRN5ELVpAL*?FY_PRa)Rk}JnM>i2AtO|eIbx|(921K5*QcXT1ff|TGPo143-)~ zp%=t)#LZNgz=BM-j?lRTRtrbU)58KoJW_uI1WQXmBs6%vR zI$*-H`rih*F4bc&c3Muq)o07~ab~8xtHA94x&e!WnEiAE)(@G{nNT={^=QaK`H$o{ z*ke{7mFI1@>2`2DG-lF!(P4CIaRI~|uh7uIxx_=XkbS-*Pafa%nud->@LTIxob9yrRZX~tGtek<{Cd`W{f zqUOhBl-3b8IFCK(?y~KxwzwQcJalx{FcLRvV9aQqIMw8Mp;#0TO~bhtd$6ryZ(* zgeNNNen!W_A;E}v-T{4HVZ8|5G#LO0dA3k)Wy@`n%XEYAI^q#cM%9mSLf&s!PnJ6$ zyRBZ`_Qyte6L=1BAdpCTQv=(-R;>f zJj?9B5+R5z>ulqUVT3-!_%bE3-@HrxJiH=Fd%bcH`6pqIM#zI$<5b-=PEWPMCm*3+jQSw-v7^<3S&o^m>}xu&A^K+0xqP2)Dv+)gaQdV;?^v7R<| zV(-hv_<_TbYH0z*I{%@|?9TFU&aS7GomoUP?TY@<^S%g7$6xTBM?4gFh&y6@pi|*L zbSmOwWDhE>%9kmG0=uxS&T*R#7^ZO|p=wq=_?G4Yld^JUjG=(8tY>^_84$^cXCUEI zgg}wB2U0t6=o&E;A!R|3nM@;j-Ltx4slnCNl?{&-S>a7HQ!_!Ep9irasvg6g)}h>{ z;KX`Y`xki6uG2@)x`#*4gBP)j0xZhbHo|x91~;Poq78+VduT%=SI$ce{@X`sPdD}i z#9$A)vEks40PaUa?gMpcQg`+=md@SXSz|k*RO?gSkJxKdf_!}qT{t#F&61V;h6hZ2 zn)hIpO$W!)pdQ%#ODMAktB6Unp$BUQDtCLZ34*vyC!X~(dlPH1Ur(`MJ=If;l%f3B zQd-ax?D=*|?8Vxlbn|<$jv!Fdi**$Q9CW4)c9~wiSw-lt0%+)xJ(0AaH@K2STHad_ zIMy2reJ)i`#^gCfKPI!CQj+VlS6Bfb;lp3UKJf+Ryaq=46)Jp))#xqIZAn*9mH_1NVyYQhtPn2>~rK2 z_y$|g?P>N75Ua8>5Oo+#g9frZ=@+U!h{-t6CeHgJ)EChWYjV}A4u&;!5KeRZ5#lK) zM7z3y10cRgTL)n$8bVhFF`!-@;ck`P$nQ-ikXWj{$(+10Z3m;_HdD%AH1ao;$1j^* zrXlP@DQv~3`!VAA>0ze0!=X+qPTfzrt6r#zg)zBq!yw<((r-@SO;TJ?P#8WzGMkv< zp1PqA&X91)Trxx~mARjEj;FynFW9YzR;gMD^q;xOnc?BElJGLp=$Kq5uWPDVd#Ip%B4Y~aCB-7Z zb-78oFVv)gZ-KW-%&Jw>3!9AXOH@TXsw|AyxLlNgsPw&Ed2%dDeXJ`m-Cf--iQIt z(Mw5YuqZ(6Pkuoj?B$Lg&qN>SOjiR(Hb-0}Qc2Nk7(b zZWj@b20*sFawL1fhmX;_KH4RLQ{YI!X#8>}h7^mW4=1vAzPei_dIzJmBW0zqx3P4D z=t~Dww_{lwdSeuGh*p3r<@KIHaHnUl)2&g=2Zb%!z8}GbEB5lFX5&~T1N&eJ=cc)q zKWQ}M*at@FPB*+5Uh3Ef;yY~c0bj9jS~Z&41OP$=oq5Gi;2-3+|0SA+OlJ}PJVp|? zhdZ(n02&y3VV|(-mUqxGQN*_Q2&a_s>{YL5(L(&Jx$6_gF#uvHZ~w1#sa>jAY7$Q7 zL*k#x)Zo%+o@J2#)la13osWj4ExjRxW>FG(=@ZFl<6uc^!v2ycc;z+IKUg?usV zrW$UfG^gIEWqERB7id1KhySX--7`c&4WVRot~b|nmnej zq9|<~v!lb}jIG0c)_Por`PLA*RB&+6iW-zXWbwm&7Q`1z-e8`b)>L)MH98AW}aew&P`hjp)XP*c-1X0sOD3DqiLM7K{fMs$;ME%KB|&09p8 zB3k5W(IQ?=4XOZ2n8NB{M0pkXYmJA7E}6m-{8miS%{urBG@0R=Fx z(8r;>aodq~D)U7XhD>Ge;xc(E>+8u^(C;gh4#eSjK580k`nVRRi_@65v#++(D2dJMv()EolDSe@%Svcjfi$kK z?PzK2d0bes^$so1WU9F%#J-fb{B|(?oXG-^(IMj}V3`6<1xrXpoNDCMgcviezD&J{ z)x=hXbLBy9T$h_LTBekl%<5?%H%^|(YIN!Y;7xrL`Wx-^Ulyd}`p_^ysE(H<=35BH z3|1bWSuC8})K#9vnt1W02RjF3e*%61XR$wVs+>2QRSN&yq7@kwqRP4nfwYdz zW|84KMDuhHtoHhCx_;~OnZu$@rh=PPeIASS)!%L9Hj;RhG!Iha?KF2D7^w`(pU0fR zkyTBLBo+T-x2T|fIMi9ekw^FEvHCtcCfT*jC~f+6GhkV?`K(g)ceS%dfnv%EByd@L zK>zpIYCY2mF4p{sTqaabD9)Bc6*37-r4=-`~d1@irjHKO0L zm=|`Gi&XqMd(VDJf6uqtj~B3Z=*`O&$g!N&w_hnuNseq*7fG(tf<-KXlC#+}qQsxM zOS~!@o8!CMZ+}zb8-;c{wS+k-Y$5Y^0+yxtp^q`wOY{x}`+zxCLdEmhyR>DYn1Op2 zvZpYDy+30dVkzk}mWtB+K`9H^Grl)Ui>ckvOHMr(i2>hl5&9XkVG&y>io4id+_sBZ zCE(uNd8hsv5ykE8P1$h-WOt~0#;|hB38}klhQZZC&Y$*5=xzxu!aGAbbMhH z9&N+rK8qQkYnL!zRO3@a1^2jdGGA09HghTSmqwFgDT~Iuthtnp!z3ODpZ0|;!FPOF zrsEMV@-xSuGC? z`u$&uLI3BMtbufx>a1c;Ge-StdhqgVKt@=_!m9EreH*1+h0x_SRB5VFhiEvx>X>$- zJ9PGrpVibH_BJk=IjkRQ@F0gx!mmlWtZAhsWB8fD&8OjZh`~dWUg{9l*U^`Xb6K$O zUsyF3!*~3d966u$(#gL6#&A8FVE2~9=%vsH*0{2z0X>Gn?Uhajk+c&HRAZ!;J zlp_DxLim}er<*nVtSoWqLiiWnY>}Qs;PF)mkSd@N78&WtvW8Xn;@yM3(ekLl8dfXn zu!Ju@H@=AAePlF~wvtAzVNY^gvNdaPs6I)RT&y-~+Qr3cS1# z$6Cme+nJXG}+Wr_bXKgdmF}ur*BMpc zFcDU=)My=~yoYH4p1R8%kW((lPH2=I>b;h+=DFfAtip54%AjvUlepL3(G|LZ7r)=Q zgx?!u^s92@I#cp`78G5Mm3Ei;Yj>F`eLZ$E-Z{L42k7v6@YMY0;VAw@Or>vV$aWUo ze2qwhvyc@oNbhQEjB>F@Hj_hqx7v9Xy9r^sXU+v_{l94~fJ&L&oe zj(^A6W2#i&Civk!yrK;#XPekV_Lf$=CO)~pjlCjD{jJy{{#t5%JuKoJ z3eK&3Y1BPP%vzyd5MMaX_r(vL+bTC8^yN{c#7Xw*cIJeX+OdO0mNKI)cVPAJN|`$t zvw|1lxP7#l|G0>iF%&<}?GP(tz3=(61FDG8-Sc~_ggG?&d*-wrUBWbfe7F32mH=_g zN&c+xrpgahBSVW*&qN z6Gj7v*g#y;4&kJjL=lHs8|zQ8DBL}09X1_@5!_*9eTtSGM%Ib6`>^01E*xf0MxXfI z#Et1H@BsFQem5C1BYrB|_B+-80m(k3hyr}I_ z46yQY9NK?WFnuSFvUj~ZYGVv<#AscDv+PHxg_CIGkAeeeb?otHubShH&;;UmJKi8s zj_D-dp=5kDR#v}ilWG$Su9QbiTOz{XIgKB(^o&S*Y(Eiq3 zzpy1Hi*V2cjBZjCgSqneD`}`KAO<9b9 ztcfJ zz0Tf4M?U`tdl4PE;1BkKb?0q|#-pj-|AX~McfN6hNn8#*;HDT?t8PNhkwm9%vIP0g zSROK)OKMeQacQiFA*tna@Yq6+ZLk@L)^>;xE_JV!@tAU693|pp_Frnd1HUsct@XW?5Cep+FuxFcY3N2 z(;PB8O{HRe$bm$IBVwsZ$n`7!iT&l+SPz)~cBQs|G9}!t0WfRdJ^bk>e?l$MmA3uK zY6J3h`=cc*+epgF==P9ONx3xEn_Asv-p?g!JB*|V-C;0q-|IO^j`y){v&=@55XuiPqf50QhDd_jcw3AcnWpa|N1FeD zZNsUq&_sF9JP|}wMmsGtK6X}>5@&qje5>lLYc_4PRoi>pA=t=+Mt#CLw=c9SI275r zoVIm{Gm?5p&Tb&-lAI%Plss&r#-UD?x|y8KQN9Hx=M=n*_i#2d1Y<=K(((~9GRzrG zvpt+#Fm|*w3uCO=jbS3b#yI)j!|C+oC$t|;l>Ks5A(UlfKp-~U89|NBPA}WVV^&C` z_$V+tYkG1q>~TO>g*$_&#hX>aX_?vC9edyjBd2JDSc!?DnieN_Pwi-N@S% zBimW~xh!$%(nHMZ6f&&FR%a7W-bZ_H(??ckcT5L3hp7t& zy@-ESn2Qe;=3-gm(!%`Z9C=AkQvMuy$w)_Eyj<0fzTED#Qteh9JgL~`^mmuv;^q8S z>Ph)tPKJiRSuR0k~Yz2cIWKql(fo@eUNz>l-b>o|8%Dw$-h%3a$=`Wc^+o-ay$f~8U^JidF)$nsVO_LZU`Z-_o?1?dR z6Jv%;RQCEgy{aZ^w+t$fs2EfIwx}qVv1+$Vvk0&|bptBmvaxKugnwM~CkSO8qAm?SgbOk#H z`0(DIWz0ybg;~ehB+Nc8blwu;9Dz%NP$!p%WQU3gmk{>Y30DPkZMvJ818iX zY?&3txqo~)1$Ja+r$Tas(@O}i(_YuR)U+HY~fq^8v_ zA%B=-q@(jCFf+XRT&yE#u3mkJiPZp&vlr(-r^PYOcp?}Pz zEN3(x%;d2{`If-BfZt|Ptc>MdYyxrgppvsHWyu(j9ciQN+<~_FL=jW&d&Lm`t1KM_7!)9pRAgXXEojsP4WzN*x&^1F8^&X`R;rS9KqQIXs+0@TstWtQA3GKROB$#vj zN4y6Y$}h_j{L#Y8^@-@YKH`cv&s={xdIc>+gQs~!$9Xal&HcPW8Dr7m-=jVAeV8^e z=X;4gI`Fixmb)xaB);ylfKGFkX(=exU{Ay$&^94JEG$e3KtGFJ=~!9lKcTg6yr(eoSCI$9e1`+%`h`*UXr~mQkRxw>tmAK z2uNY`JT3@96k=X+bG1-@IqXW-ijP|3qa&gCH9nOzvb3zEYrW3%Upz0@hhq~n*Gv4* zTF?8d*7G!-PbFO^u}~tPO8Qf2_IPlTi3?Tm^lU&G_5}X%m;cl+!^+6&yFt5B|1zwI z&w{2{cB3U_(Cv+&OJ$^jD`l`(VX=N0*qA)Ji&eKH-8Qpd7vB{+wB0ys{J5? zRkS^%3T0Wceb5eSP*x1^=*zM~EO#g*`HhyAWlwQczXHusVREdgOXu4??4;y!Ozb6T zQBF!Tr5vk-%9dXURlN=?hlY>=1U0C9dD$aAUS3jtU!IAjo0a9+YDo7@1@wtEa?`s>#OsoMx_C$p6_;o%i9<#60gM_EZ_lucjL7v(-F}bxy|P z7;ZV$Y&giwm9v;D6jpymeFW?95vY& z*ci~ICKCrcchqE`JJ32VvomxLMcqmCVlDP2;&F3oq383bL$%;C@ z-Jiq|s~bIhlC_o*tMie1=TW=btVHlaF$j9-kFyFG+N`dPsYw4LY35cj75Sw$OLyem zPc?J#AFw)6h1W4(i8ayrG^OWE4D`OFkHlvT4KR`CY1(A6FX6~f)M4c?H*8yni3=cd z>R>jNMGxw*ry?v}T$j3d;VDdDmQ(wuSmodmg9BWB{Oe}t4a~5`)WQvcgXI6X@6pe^ z*iZh(bzS1WP5s4xnBpUh;b*!&WMP=XE44(_jYx!A?mxv^LjjLkqCaf&B#VgbtG3zt zp}~%b@~2@>3q{edPqU40B46xZYKHFC9Vs%E|FED4yCXE*9Vs@*M!FrzEK+2P_%0A_ zK*ZJp`413njt~!GwCVROi%u2-#=qq{=A+vrzD1mUtQx>pxW zk3S2d~m{TVMv z>+gL*T0gykwElYye5~KgDQd#f2GaTm8n6uQ)xmWml2P!OhSICsHIxOJ*iaVyNJBO| zcozkWTf%7Yi}2|r3d@ohHL}<%+5v*=!Y`8D!B8cl7rFtmrN@EmqAb=_(QwLW#3GbI zCQ$7xRwVoIX9>1YYT1az1Lf;RY)P=TFjZ=dDk!t!w5_p4Hc^le?BOH!@-Ut;Bg?{7*spM?ILO>lf?KVAdMz&};RKXb39$t!c3i+_IkJ>9I1l%C?B zpO&UcozEBl96FdT|Jf`4>AEmpGI)f4Q2)|jX6b=Axi&WdyKcY3MP@IvNQm3!WtN6d zpO+zD677Fk>M6Xb)MWjpY$5`+=bFMdn^B8bSQbzgz9LbMy&}D))~hTJX^&oIV`MaE zq%IdcVY)bkDI4DKb`r4=|0BVr&6-hgn}QuPKC z%TBB4Q5{x=n!m}yJ&p7v;Zf#lJh#S*gssuF9gXyuH`yD~;ip-au{V>JDcy{f3psf) z*4!eRx)#k?Iu}uwb$W}o3>R60*Yy^^F*KzaYZQ24aG>jBy4#GE4eYxq8b34MV$ZO} zVdh3nts=HqrQM_`?dG-_(XLB0>@8U(4!_03zNVi8Xm!<>s?wXype<#1;^B+wK^1v{p;7Yedc0~ONMCVgaEx;1uH;}1<(vPP77DH8|VU!HlEn*8C7O65a}9c zo+;#ka`L$OCZ2W-!QkG{3~9scRqTnPS%h<*m6UPrShpB++FcKze2bhezHzgBWfqJ+ z)-7(wWWjEG8+<*gKBrafwnzE-nddYeBIVS6*mKEE!T!8uj4b?Ai?m4AO)^T>#_%(L zM!DUw;9D1cyWNUXU67PGX&)=cPHVe}!{(^o7iiT7tf}*&VvG&aBI}Ek-iB34x?}+r zjR-&gF584l)UFMSkH4&VVh1Li=dzY3njQ?q9+x$3Sg_9wMsCUctqm)Vk=NZetc2r= z=8Zw|6)O87%Pw+NLBu2w0Sk-}u%+F#rnq^PPJYO0uwG;H{G_(57UY`3$4+(#jj81| zs`C+R8+ToSW8oG_?kJc5!~W~^(?_gC(hZs9(LvW<{x~`;lyHLr+OkR!Hx(%^Q4Tb3 z($j5ODVp^$3-`p{kI2H`3ZM#0a13QkTUImTwhzf|I?|?E81kk%8SRE_a&KYy3M>Fke$9N1vehe z*n&-B4-`8zLgoXi_6d8&`A|V(@pi*XZa$>`pJ2|U_7}wln2%(tH+KCffG(#_ReQlZ zc9KtdB9zfdzmwyU<=;aYoeMny+SyC&nIU*W8P;BxE{eoASlq=HNSy~y!tvt`%$e3z zBA~hn2VOBY%p89*$Q&OE%Ln_JT?1)iwN`O-q#f%V*G*x@3b#PO%HOq|o89P(_N5FA>0h(vuD%*gwnUB1 zzBK4-_P(oMVQ4>!`kcKH*>>8jFY^YD6uEyp7y8jKUrI&6d zSW7oqU$Eq|11(IkZG50t3$oos>`ATjNg6ERn4MT+^L=a*9*= zpv%FuY7h&F9W2nq68oMrcCkkUCL4@<4Ov>`5Q~8rXbcey@VMBQ?EToGDnZnQp<0x9 z%4>Q!fy$3<5kiAr<}P~it)`)P9&VV$12JRT*@0Da4EI8Y3rH-r?Uo+z7~utvps`=E z21Q6iq)R^V8iEQNVx&gXhCpyx7-Cdm=qO=`y42ts79TlUB}GbWj271T&NW8Cgdrkf zh%x_ch_M!?FvQsZWQcKE7HNoa|7eKu8qMr|$t5=RKk1dIO2A-S;!^msz~JC+eOQKZ1c=yK&6!bD}?Nt(bV>^sTFzLQmguolIxCPe-@>rHSsxZnuXRMloUM{==q=;HYBsIu$Z9>K7Tv9i2|3=^Ba=A_J;)sm zr=8{0q8n+SgqZj_8hL4{2L;}_B92kzKVW~HHDfxG0uT{&@5a|eA zypE8grHT`dAV-7$;0Sf2mMIpN4=h9P^$2@lqPwx@T+3COFxgFd8?9$Y0JY3y@lz#VCEX`k(9$F#ZZ5Q*OWa010p2lIVpznz2f4p{- zwHCFqbgts>CoP>zM|!Xhv3Uw6ES;yZi-=9uX*8fGOLnZYNV3dz^kYvn?d!de^>n8v zEA9Bn3;Bu4_hLgbH)x2o@c^%lH|QLq3Ria2@`L?Z>%@(kOtUV#pH3R>l-`!$iispWcN5+4#W8_vXjI7yP z#lYk5`rWu~0!{S07y87TKdDLLHoDXo9q)FFgJ_ty3l4Y!svmpb@r#xQ7Wst+3}$s4 zJ1kTjJ0kZGAYLBK3`f2foG-u$^l{oX@m%XpZ^BOcwm-|v{8dAwK?ZpZ@~fw?g<47xtDr6xmAH4b|r zhpFih_Fm=@1reJaj#%pS?1U)rq8C`D7Mm^NDPSmbJC1sjk5Yx9Y_#K;f{5CCOo*01 zmnNsX=)q8y9C6%>eH<-bWUUyA82TM66JVb3rkwbT3@25h5bz{*AI6?=obsZdq8-Dq zQlO?kF#+ajndF`RoR*5G2_u-J;~z2&lYu|1qWrhXz!@K&P0TZ1Vr71uJ^Rb-=d2>} zoeZ4C>_^VTY7=wTJ0}r*<^*E)GeOUO&gm@F>`bk2i%@~0!Nkw)L?n49$G+l9BM|)Z zl>UN`q+%9y!Kd^WWg1F<(OUpHj{hIa*q3~GHZd=GiT}CumlcU`=`Z`1KJ|)3_*3a8 z>e64Kw#3rJ<}AD+o$9=*aBb*8mT`m*RuZdNF?Yo;7znvAAPd2L7D5u}=bFM4`bo#E z(&kP;Z)C@Th#ZbkLfS~S$Z=gWgD+jDLjrO`L2wl(Vg_SIu@4+K6-1n&yGgFmY)0%Y zFV!tw{us~x>R7rxn*9)a+so&+#)+jeyU=aT9D^3~j+f~jx;2K?fAX$|_{0fL%V@-1 zO|DLmMp(g-dkP;L14R(x9{n(uWo6#iOw99(5xg_+Yf|MnP{{*LWZLEa2OI*+%El&` z+bz%(JXC3-sy?LW#<423A87~-W3514k|I6Qe52Hs3w8TWfZ0hr0*SUuiG(d`Ysax# z0n=%2)oJF&pW@8kYLL>^mx<*b-4vot4mP^^VpuBf zu4Qr|V%(i>WV07)^w1!T?bpScJv5clgBUHlP89RR7<*degMwh8p44Fio9pbQfp}wO zF>cABY7<$VsNM>Qi#EVvLV($u`c7m|I{H`)a2SvFOk|(X>r+@n01*08-egQTKAyzh zjOwSbg5|snY5nNHB=%ZNe+3qu84MyM=uh<~vk#&M{0V=6;Pt%y{5Fc5!d{3P_^0H7 zIGo7di5#TBesX|1hz?F+9byJ67{Uft7K7=-sce#Sh(?B%vTc~O7oEl?MGe*1CQcK( zez%!JX~#5Hyz(%OYX-UBtONbwP#=I0r#je`_L7<`%N$(gK4%t(s|E^Wgb3#V{52~C^H%GvMtr#&-SPvhzdpe zyQZX>3q~wwWxe6og%ZI#{#Y0!cJJx%>mr$mE_jjl`2TojVX+U>Cgx%<@jrLLOB9K3 z7rcZXE=M%-N13Ag-Y&T9e&Iel1X9t+AG6JkNx0we)fMdVqDw8z0IQ}h)mcX;W#=z1 zV#5pBs~KJ>TgeifISLtf@re47BlMj>E%Mm2G-4&=QOk6)<$ud)%SzUr#;w7|PT(*1 z!C$?KaVobKdn~XVBN~nsbY&Im?p#?Yhn0mXV(8Xt=89TnWfP`IS5e{`kghI7y86$g zscS*H#v*kn(lzwtT2?D&tpfX*k(LtH(!jN>n=@A>h$Si%AlJk54H}jUc6mD4#7-ws zh&=i+mvwin^P!@N>)G41V;y2ZEAv3I-Xei}36k}6Fb~52QAWj zn-v&0kEu$(nOgsZ-3UJ`uxNCDrtv>{cFRSi-w#vEoxtE+~a{qR#PEp`*2 z69qUd$x24;P<&*I;F_0!`EdP>p7j`3>yMicv6vt~Nn^?HL00+s29xDn% z?^a9;df-@wDBf-#L$}%^6J67z%spB_&yxRMAG#*yUT?A<%kNX^_q&7d=0J0wMu@Sr zGZGnMK@=Crb?!SaF4CN!{!jNe$M*P*I&Nma*nX#mKeGgUTK~+RcJ7x9(WeH9<YV8MLm(W&w@f%3dyYRP#hFJgQ~EnF+1NW10ks$0%_dM*YXV zkmJ;F8>=3B!V5W}86;8*RzHI_Z)0^GCsneTAf2Ql+gY91Q(l5o9)i5O$>k8~Iqgk5 zO|!Qn!#})`Kj`Ro^aW=WBo@Z7yXGd~Zj!iPJhNE%)LEJCZ9LAR8EaNj_o3%xA}Y)| zD{IRo{(VL7ybn`sa`Y1abA`E}NPH{I1&Y{#KJ=nY(KSW534FxtYEw1kBE7hSjSiNs zy9hD=ux(;q@e==Y@vbTo-{M^@ z)E-=u2!Co1y6N`dnr;s=cd`oh{1x=hPS!i>x}u1c#|mKC>-1o!$FeB=4Ie2*;csX; z6I5e(QzoPEH!b*oEBq}VwoS}iUgCc){B1?zTlm{3e1%0g9xEHeI}+hfh3}~gerQAWL zt-4=jcaXSaHQJqA7gJxldl1{aKHI|%*dEY}ds&fE4|K_xm>bJkfG0NeP%*bl<_~G` zUWCaWDOdt(?jt&|msN=Er0?k!_KA}FjXDKW+CEmq*;%D1`p&^Q_4ct$+f!XEd=X2D z0aX!qd{l(kr_@E?YMt(xrh7!`s)%BwC|xP)Ft(TO{GF9_bW;f;;Lr_E8{&Y-Xc$5Qvscr4O*@lY8nc zAZ`&r{jl(0R|5B>K?lIImoLv=wCn(TBDS}J2|e}J#S(`>F%#-kb7D}f0JD$96)I3_ z>to@G;>!SoCr;DXH;2ACZ4a^_TR7x}pf)M!4~MXoupjL>1dI0jXEpX$e3V7{3pGCB z7+~?v!m7Q{U~-IZ=m)A4=)@hPL>#D;ILMdHAfZIuDtefW`#Tl(J^~dEwm2yjilry5 z!of;~Lo6XgFExY`3Lw}}1rsV9Dg>)gW0=LpqqAZEth3?1EQb?x#_3W4YaKO0C5Qzr z83`Cct&buSKmyzmi{?TEqT6Rdt*vd|t<65PpvfzGcXL`gl#nme1Z zWU&nz$9dfe&%=NFon*<_OgiHv%W#fSLaBkk7~BfKC_N_U=1KOrzw{(g6a7F^{S14S zTT6vwmC(4d7vUK@ijGR5Tz@QGxxab_h1|9DDW!OR$Lw8$k*Pg?l@^ zf=%@G2pQ}1G$NBMk%U<$1yiTlc%-5Bc~;6XS*3(R*va(8dAQmXD+82V$vH(cPV=@- zR?uXsFXO3HaGrIy7xbg|E?`$}LH=|iO zEiSQlZOOAO4yf-U9Oo5pwi0iSFV!5ccn&Igg{8*MRmoyeWv-QVp*C-xl>wYdi8#-~ z`>TlaeKVU+5HU7q=N0T=OsB7vi>d9UfB#j=vbsugoulT zS5}BwY%zu|e%u!mU$wTklK0KIfOa*p&}c9Sy*a=F9h3Kyb1Y zErA{daBoZZlf_O+CB`P&ct25_K%Nx2!I$j@O7q8cD6;~2amPlLAVk}!MB8NX@`$#H z(t^NavoDX$R4<4RqTe2{$+n;AyI@`fpTQ5IfGxggTWEDKf5NfVo6FYW4^jSY-b{1@ zwT(=)G?CkVski5R{D}G6a7tWe@Qcb|hcC(wl|jBYgM696&c9@UhoeLWzxq=DN^QgV zbF};*j-la>rGehM(ZkNYb>laSnNY8YLVMKvn^NyCg`n!jE}`Bh9J>`vXm+>K>>i7a zSk{wc%{@x9dwt3G3e8rc-~fI>4U&{E3WI0iM)s^gsCu8u_IE|6D#GtRR^9K-d%w#2 zfR(q$ss~iw2Yq=Q%n^CpaE+Z*_#vh6!@ekomBNpBb2uUuUf|6@TeLta{HQPWQEky< zDuZJxgX6v^$5jR=ycwL38Jzq}1}9Ypr+leT35)iOI;~(Lv@b_VrztR;FDUYd0E^{0 z(L?=VRedx}WSe}&O&7!Y_i%xa9Q+f<8O6Z~^PQp74qnW0Rzbu_=`1Bi@cA+46vWSs z+w3teI^i_W(f$ZtJ?6Yh5ZATnm8bJmB9hl}T+kHYae=;w5CX%*?F@N*-cs&!#hOXvd9o)6v5eBR5un`+*V*Q(nJ=w>DO4^q0$`-H$dUu zu`=-#|E`sVHu+sVG{qN0-V8HAbSx za?jGjWM19b&0^#yblZ*YCi8*L?uBT()5xNHK|&7;Q(B>ihhc6E|GZL94~4QuPo3;7 zXfKOgTcZ~RrSeLS-U=)f-<#^Davt7CLa_AJCuD>2H)TuQ3yCf0OM#yG2Y)vg?JD(EzX;F zoYPxef4IPgaO+6<^I81D`+#!Ubeo@do5)B-jd3mZa*fosv;xbZnR6iD!$|%FqdJ}N z*RCq=Xw%KlC@q3(wP?Ubg>b4|f)|e&t-wyqJ7Zm|MAB$#TY^81*Mp{);OQ}ARJz!l zVt36kkUoYEl;90(ja3OasfMKpTmu6qkU{6MTE18@p0tL9<18+AdE4hWYF(1QS$@0) z#T3xh*c`7Zy{CzEWcs{VzL+$Eu9V~zYh?Qnp`u2(Ci$D$o;-D7Cn%&?&n^IzqI8CGhn3^$u|Fy}7Kx8yzoSU_F@!n~!!Fr_<#At zAXjr1;>gi#;5|9is62dRna&W9Wi-4zC)aX~BMOWvv7BmFKy$T1LDiC79u6PThZXqa zX)C?tE4_*ln!ybUU0k%j0t&TCBbl?O_)FPW(d`O6J$khTzjr)J!dFw7OkOc=jfRT~ zFIId+Y1YuEnS4N{wKB%6YDV$WA@2(|wlHvv6U zk-z55Q;gLhJP*&oh!emge{T^S&-+IMFy`Hh&!vxhPOsNWc^28%Ky(_tCcO@R}{7Dgr z9%D=>malJC;#D0REG}8*270_QH^Mhch|tDHdcQI+iBr>qD|1$Mlg4!0q&i$nLd;E` zTy>8AV(U5X69LJ}WAQZTTy#cMfVtVClxHtDQ>DlFFWY*#>x2+@!igdnHwPPIUuZ~G-qyBbL^aHe zc2H6^DVMA4@px)bjhA!gYZA52nNNMH@ltqmXh}6*)wxrp*<7og$Z99ut;Q>+DpMnP z>9xPGpnAd!PcYtjuE-lG%}1VXZogVwvdmv~$-N_?-&A6lye08BkD=fmmILil7?HA7 z-4#N4cX83u&c}ID_->gZjzI3Fn~(D<9rx&*%$b9N@D7LBe`>Jo6!&Pp(V|lf7EXXV zvsWRbmdQ?WuLs9+5`BAR2b2_d6QXv&y>Yw07$ErLV7~XP@IJ*U)Ij5ddkg={NF93< zjBx60M|Ga){9Q{bH+%n%+PK~stB$?BR=g;cs=;e?+^NiU(5!-od}aJEZa40e(1zMXPJ_w0Hc>5$97i^TWPGe&M2_ z#QAKorvw+@3AG-v7}#9j;2$1}hq@xHQ%)K@;LE80=kIVg^{&Yy$`mLD zVmobtCdXh)8||n{RF`TVrM#LvHu9K)sc!d}ggK8(m|ht_9zt2gZ^lxyN$Fu^)Z$HD zCo~&~kDHy%6V#^`ui!YTpd#m!w6PYi7IDf8IfbXWBCf_z>J$7u$7wJ8G!1@&*LM7& zAR^ZH2cePx92{3n~YjWU^HFXVCv9ldxck;+eOn}R}J@upm%Ad|O!uP#oFW&- zy-8E+aCb$qa*M^6lJ=+5akY!s25vPlw=}-omoJFi;ZZ?;m~Y>zgP!NMPK8=-Q}w5K zM&uopsakBgL!UpzKXTnwSmNxXIMjESE@pX7{q{ewo5%6?ve?n{NY5@a>+;ORPWr`R4Dsz|&tDQofS)~R+ zo8jUjr_Q0Yw=OU4QAih=?sbMPp+5KLb(M)wNY_x+dZ=N}|8$0KK1`dK-MqyAtdQ=C z#8)BRseOIS8=;P1I{OTFruL9HQYUt)ll#!gqd<4C&`A$UsK9U z75lkgtjAxjQjmvxA}YhL;mmyB>cczPE(~ z*TQ;Lpjb`s9ZCgV$0Sm#XL)l+A1xp}v=8lgmZwzct06E=usLQL9t{)5>8qK`^NF5Y ze1u?Bv_7vL*Y9sK>L;|(vTT2E7X3Y3tTuUoO0>Irg(H^%q4Ja}W()l`3chZt@*H=^ z4b({R2(hI~mSUh_{z|;vGm#kN&1MkodyYTl9IPSmKtDg6_%8iCFJEtn7j1}-G+^u} z`eo4>;l>Zq84a~C~n8K@g`< zJ8Bq63!2^xAlH`k;-yA-F-K@j??{Kdc@Rx}fv1bwATH319w}42wP9o^9k`nAZaGTA zQ4vOYvemBq?^~Bf`|!iPqh4Y~E!LzR>A~U&tmbA`BK2>;U1?*qbXFs17xTR_9#U#i ztr4Et?q!5iiLdyN0|+I@%Zry5?hG>cxu~_Hz<|uWtFX2 zd3*c`URD$6ctc)0b)tfZj%uPt$M`~PrVp7f@>u62ot-*qGKpHf$jfF<_7YCkg!;sk z)j&=uL^g%iy~w|EO|{6TM!~!y6>kH^(2OizB=XJ~ajSb( zKZMH6YiDQ&u;V*;#-7tHmST^4WFubAmP@r7aWiv}3sX=V{^P2zeegYQn{x< zYQDe_Cm}a=4#YEh>R`DiJ9i+iw+V+_`Km?GTb>tKY{ePL1$49t@8DRdV8WFb(g!c| zI`hrr_g?0u9ZS5BC6w8eSBUyiLtqVuYkhHCkNRm-{(^I< z2Q1pMrL?^%FB_R7f$$(Ph(lbW2}X`ZU*RbY791%q?z+LvBtvn1ou!p!iie2)i$KUS zpW=FOmMa{aIeSGK@CNxKj?v>4-o4ZcEr2xo3QZa>8bhb9J>qf|C$1)~{3`G3T&YCU z1I(55%d5O<@+yn@n888jF1y)zQc*p$Tt)8Jc)Dw~La>|NMkU~c*=lO^8vhW>Myp@r z%Ux?M31n4Tg9;<|X^wuKmvgMujA4YewCis+Vu#;6I75ryLr009l^L1iTbuf5DYknvqwN_fd@9njAGww12zl z?GN~|QhPk~<{m3g&rEW!Cr5KHwQYkX>3v?vzMPyk{0pJOvTgZ%e8dYWk-tj>yec6S z_&fQ3%-?YBS41|9`idgw{W%|h%&|?Q2Tk~d55foUrzvOcxPFN5iouKTm#1z>Ai7E1duXuIGDKF%d z>|mUE>h&MnGEs|`U!|wM#+HWD8ckYAR?*X}oEJLq z!Tyog1jt%zy+-Fc@`cXp3Qg@%xGqQav9z`m&v4vODMF?jIk!6Tt~T3@obS5utv2UP zm1J|tR`e#l+>O_B+)}_e;NPMd-8c)oEg@JtyiL2h@wXj!yd3XPo$kDm^R9y6%59;H zyELggH=Oq@pr7k-F`OIT-JLgd+*d#`=DJVid+<8W2O8o|5VQ}dQx9I$`OpFu5ws6! zb`M@A;*muQH+n?Jd+>6U+KY=9Bs+ysYES-3Z09h!?kmdLIZVy@a2D*V8|5kmm|eVS zU92=uCGM&cg;-s6V!UisM)cyTj&9!6ZdAG#DnfTJq&t1wi!YAsAtAc`?m^{y^Yj;b zDlD7Xqmzo+_td=QGK@7=?4@~`yReVnH8Rxf<-xMX+2)*mG`2S{AKBYCm)`U{U>*Oy zgYTobVkRj&_&%DaJl$*!0{U9=d3uSy9yDuG*3Xh|o;Yw;5M=h#DAxPAxO>LT-<#`) zJ5=#PyYByo(AYja#o1pGN2}3uf7;xKZ?NUjfWAD#zNdgz_2os92IvfAh2Cj52WbAW zN!cyGvf0Ghj)58l))`3Uhw*qa`|->ogA`aTUE)#bE@#!!<(|go5S?`#wVZ(dVQzn3A#$ifiIZ*hP`Wgnf9D#eVB)%B zF~A*0-;UtcbxC8z%7+T`wi3#~@BFZwkc^3^41XhXwSp>ZucrND z(6p{mFw5F&r~#ToT6?cy7>ymlll7f+f78gWRfNj!Ydu1G1XN3BzKv{Tt|C!(&!xz5 zGBQBvh1=LXf#qxVJQ_5Pr$w&Ql1j6$6TTWpp_8$uv))R`!UVCyWUT4@q#(lTI7K}k z+oX&b}nN~z&-^vvM&WU86XBQiH>R?;j3y=K|uDKX3v z=P5PJ@@+Qyz|D%xGRtOVmY)^WGRx1xEM=(M1ax~_RFXq>ds~EUiqjtx_{*-XD#0?) zR$-uj>HD@RbY+%p9w9vf{?#mD+Z74SLYF7;M0mKk7*HD}D()AR9A=K$oo2daOZrO~ zHM)nz+{7iXIB3D5^bq=L5|6LGLt!fC7cKJ+PyRlQV7|Z-(Vyu*2I-bLUs-skqF0y1 z?ewwmuT}yUqLqbzQxIX{-;{-Sd2x1mEF52Rw->zIBaI$4$>$78+Cx0;^B#qaeG?+k zvxh#Nf*|K!Z&rIX2OMq|3Pqd0&&z%v{V|1qR{VD_;drGDFnJZ4Dnqe~K6m6e{$iQipqJ5n%&E|0l@P|Jv zf^qv(vGGwbCx#D=I+RInxSm<&e65m z{0GN*1ryGHp1z;MpLSfZu*ClB?Q<}Vz37Epq?oyw&0X?BE`?DZU!6$r%;n{yE^9bU zK1!@MU8c!%d2h@b%Fg4Zg13c;9WI||x8GLU7DMgkA*^&o5rn(O3G^#8X&x_I>Z%3I zGOuc#d*|KPRHE30e2s3;%=c}p2%=zfYZYVV2kYYvn1{GPr zTe@y4sBlQNPTXe!Zx(q=LBnMWdW&u>fCt`IFekcWanI^)>bme>J@AggR~~prm&01c zL`C^;9(Y%AQ66~L!^QGIs=bH@inq6A8!J4}bx%>mm^Ws*%@Dk5@cd%#E(?qF6)L{} z7Z&ie2a3ec?6f{jzR|sTF;5To`sqWuzlfW49w{_$oBZhSm~{$=|A~6xb=yv;c47xe zJY~(s7-jfkUhJLD3eC%`vxOvLq1Gt3i^Xirp>$mby8InpR|{|SLAMz#>q^&fN?F3| zJljnri7g4a@n$zojhh$n3!C)BbVN>Q7Wm`mF!}SgRsXvy+C(=l%cVw3d2D56HHoX* zjoVo5wc3r_)-&oo6rH*swFg~V;xjtoKk}BbJq1EXtS3)Jxzx^{o;31D{%mwFMG7Z_ z$wZy+MOT01FIDTU;39hcjoI6y15Y9TPB6TUv4Xx|%F8$Cqp4AA`V`gx%->ff+T~=U zuZOjd8Tu)VL^;{$M|YNTvwD98b9&~l{r`?~fX>)FcDjh(Jv4wm&*3$~2I>?%lyP|( z22tB{cznbl1@w2V!8?0&Ifti44z}>Vgfa$G(Pg|t><|SLt=15oYm(2c-dmR;0y@;9 z6Q_%>F2lfWm=`jPsw~H{&2TSdIDNF7zgTL7m-7fud8{6qyy!$Hmh*QrM_LfbJ5u9g zIT62%@s)g7)M%Y26fa^Tqr<6D_|tJTVHHlHMy$ey`!R(P#&{8WMvYZz;=(r(Bp<8O z8m#7}@ubMtt9hm~$((?L%2pK^N6S|8VzzN~cr}0AFQzT!>h+E#>~ylE3??iybIsfijQhrn}O>Y*gqb)tvV$Ll63WE9i1q4q8m?boDmd4b<6lXaRo z;ZD4nE-T7pUmlkDQxu-Mzi)~!hBZ={sznm__f4hwYk6wvX%=X9adVocQ6V$bmgy>y zxu%9--S*a6UO9S(#y2Pb6d)sZGpJTBW^pqWybKo9FbaagM}(R)Ju*;w|8}W}kj=7k z%Q9!tvRvLIYPN!ivy(w$v*~O~$>UEu=SZ;L&o(DqZQ1FT#~ZrlS_I-yMq_OCK9)L|X3&~kx>yQ8Iz@Dc^&?qo9;Xb!kw5@Lmz z1%)n=T4-^D#uj=p)xdUeA^^b`Lkdg-6xOKI>=+;HVcxVdWzcjaRbc{oKaPKqlMU@lYm zu#I^yzbKUVI(%$dc=o~|e_NdU;BxGnvsi2gy8Avc_^R7;I3`j;Z)DeAY)yl`rHCM+R*odUdO zt_!EZ1^zKZbI;YJg4bUvJ)%upJaO{y+o+s9n|Nz~>{Q7vKRm%!)D>D69lW(uCB*cj zyl$0Z==-farslh*cxDG(z5Tyj!lEDKQLLKKwyit~FE*au$}5&1&^4;OpI;5XMC{D% z(KSlES?d&U)&`q5yF}?{%>D46Uvq#JF)*?$t9!;69tUL2g3C~g-zLUitR|8 zQ3bL8Abf?8TTk=%Z4+}2{l>#>i3+7#Ad*fLv^6(S5(xP(tm5I%`@o2d7g%5E8+sLiRS9L3%mqc$+BdNemTCF+a^NMLFTGM zPgcQgI6>|p>{!)~R8BgQ+trBXU%)AlLsP_q!&Uv_O;>s#W_)|~|1SLAG=&~r;E&-H z$zvB~OYqG_-T|WCyvW~#s7VhaMJw^~CCL9NeLwzHPH!!Zj*ECqI-FPv4>2F3i9;vH zP_<-RBt5#s-<3A3BD^AoI$Y+-Nq2YKaS>K^bP_n8y<6?IbK&=~-L&vBFM$WDJKy6K zDD(;%>BjW@72e2}l{4-NciJ33-*F*0f_*Wzh)`N_pQnU9F3VPcgYR_YDlcL`F_9kL z$86PgjfcpbtE=|siD{!;WM1R3VA=E=3}uJKU;qitp_$~^y6996i^YuLuqN7s3Z zee+)Gdz~{Vd){@lfg^?mLSp7$9c??7mWR>B>*!F9Qpydfqn0;#&j>Xgtp*cdHcB^c za3j67xgJ~BM8E3L{i-mKJZ>ZKu%1@^CQrA$M{nNbNg^DubAMt{8g`Q>22Z_`hK22> zwD>0f3KEyO#b35HrOvl7!9TDwN(2a?>CLq8#?e^HyTwyVUtja9Uphho*ed@p8siXK zdlsN?*a^iBJE=&<_<3x)XN4Deo-O}xWg+VIqwdSi?>dRc#CSC5~-4kN2aw#B0SC9PMIGj zMc-2GyHLm1^!8oe9H_tj1$CD~#psug+?8E=hZn;2{4tcr+bO^(j<&{T|x6 zEPD1nuUm3t=O~0H1~}nPHb*dy>y)(5u;ZRF*v8%lkDHj<-{{BtJR?Oo_dbt73pJz4 z>qO;DeZZeUF3leBQmC88BDxB&K1Q|?SMloIBc2d6Jph2?w6H{t*nl9+*D3!IdH@^|d&E{lsEKhk>PEPQuh0&hmSOB*(ML)V~i0mSNl| z53{}LZ#))+!FmXyjuZVW#L{ekLp-H?#orK{%pwDfwYD?Zs}LBIo%_Dq_AO1gl@gXP zr@J@RciwCZd}M=O9uh0+aw0kcG%r6qokNHZB-z zB<{0D5m8+;yC)Z=tSwC&mtgN}qlHmM9F=chEi8D=&LA@l$&K!$#Nr*d8v&FR zY{c98(kJb!r3PXE?fQnyO|4?wg@hJ$7|oNCT8y$GVnNB6GL*fkRTz{rYg4Nv`?pE- zW^6p1R6Us< zWKMx2iD$X&roSj{jR>WN5OHS@baOPqNDDqbG{Gz;oTfsFI4T-xIR4KXz{yoO_3O9G zga?}Ht`E`DK9TuB5-QT%NFxbtGZfI6@<*O7N6$KqY>y`XT(cfJjsIG+f_2RbLCtFK z`g6@%>he*GS-C@OG#uMf%OW^|fg+=RaoiYJF_4m@qyxyBRxmaqBm!HN&|ii_cLA7Q zo-NkIp#B;s%18@;l&d<^05h0&HvT?_E=C!Z;X&=%SBs-+(S`%P-T$m5O zXl-7!AuC&_T5S^i!&PN#L0Oynm7ui^BO`OZi7`@a=r0P!mrSNbu|`IWnzXqP&W2+; z@X4J|S7MEJ_WWD)PMlHS_C3vwGoDF1Vl#1GQ;aGCb!!@=6@po%YbZs>qXajpUc8ZI z-)p0kI7b34h&SYO(eXwp+uO9T^ww0n>l3;XR5OlhCm03xKW5RYJI>@pB?D%^*kC57 zlOxqndO6Yf6i)@G8`olT4kQ{Q{jsq&w?gn@d_Jt7n(ki#6NgXBejOP424T_&^_7;8= zRk+s(Fy-6DAbyY57|OTPj~y#b?QRwc!bx%E$bsfAbRBVUPQayI~b0^ccwBarj zCA(d*nWnWFr367V&Wh9*YS3l3Q_;8E2{5B2xwyi>Zbn<=D2MFTQ4U#mZNJ^F=v3hg z+O*Uj}Zb#4TA-DHDs!XM@a&f6BL# zOcX1Vxcj0!#+^gy0Wtq zsq?YWINFwJ7)ZO4X|O=0&cur7cVDKO6){RbOCMDcs$9vqh5jO=vXK-t;zF3Kzm3f64HIa4-Vq16Gh(o(s4|SSnKFO-05hD* zQ0;NrRoUnQqRwaP#!#EbjQ;k~HfmYyP%{0{ASr~3R)HAfsdg2k4jQ)f{rNFe^_jjg zG_#8FnSD?$rB*fE@q==I5!d3_TnB9F0Su4&W{Y8HW>b_ETrX(VH@Zgx%MamB}stQ4GY{N9&cYiUti3T4(p{|+I$)-sNY-gu1jv3dAh`NW@NSP|9sXac=h$JmCRckPjq zq641zlp#9c!R>-ms9|uUu$%z}C10^oow~-$cm<|SQd~MMuWQVUTa;?**_t(QHpd>O z&Of(HrAJK)f`Y~#mQjT7x4xN3Yo0Np5zpHBjFFfo;Z00`Ra>xZPc-8K_waczj6w1&ivf8pcwEjH7)qW zzcGerhw2&SXy7Xak-!}Pip0c$t`|xq(79I%963Yk8_9M%-i2!UGUCq7K8$9RGPSwr z<1RmsijYO&FBsE>$D|cBNT97R807=T;~^q4!_wj@wt>-Jq%G{+C!RXl8VAtC21Yq} zQ+@-u!xe0Jd-8)=ay5jQji_2fL&RnB-i8~lZ)m(~Yn)T`MWdZf;HBR>8%J3zC^%)rD=UY7%$^uNsm$2!)oKG4X!8Y4G`syX)g7Dm` z>tg6pv#L+zENx=g?8tCgQ)3Vk>c3+2u;o+!D{z#~V(t^wC<0aaRbzQjzCAq@YbKe0 z+=`*AuNtLAdNAd^W>locuNfcOJKJgPYsM4-4i(_aH0E{VIRQTXy0P2#8?AoBFpx@uk$CQc zo^NG@0V{%5Am|YuDY3*VY$RQ5YcQJE%7{eJVs$G-L~u5|(GTe3rH-rxw{X*?Dn=Y# zE?zvLW0)xiHaH=!2Q~lc>WDBkp3zHh)__KDK*z#}&yEB&eho9_utsf2kf#H}%@_zm zi{CXeqJ(*18*?j;Gl(k@5K9~eNBz2^;h?D2#(OS-utVDq8jmCM3nPZcv^E^>ugrK= zAkTGrK876dYcREM3B856gWde3meN8IljJy4&EWTz*jBet{pJHw<0 z?-?OQv&jIKz^D%krBUYB zM%8e)$3kuah@lJhiw4ucuMKBtx|Ku)9~e`lkM6O2bWj`Vqg+YxZ$4_MjJ-Z;czrZH z%q%97#iBoDd?*WBoNSpDV`hGML}cWzrb(qGors00n3Z!05gX&?JIYXvE< zzUCy{tYDD~XMHuy%oNFR)=Ul8L&1N&=OoOO!zjyH^)SlUS?S`(Xf&|?8~lk;JxFnVH=SD4QwBXb6!DuM0*G}_`%5N_^v0sZnY`@!@qu4g^@g( zn7>;>dWIf<(;V(sB;IRd@M4puqY@pB(v}y#($T0ays%#v1YXm#%tIPUz5Nt{OP8@m z8;0n-bjG)7eODtr;1lzRA1&CG;q}V4)UF$b#IMnWZbnx)< z&1RF$ZhEr2?3|^O&^sBV2?z;Nln#${5n}gINGM8&L?AbPK~X?zY)erf3QAERSWqcR zlqwyix9@jmW&`;6y#MF@zVE%h>-t~0uFTHNnN#m`pS#}_J*oy|-EaCLp--^LziQRO zNl=Rv0G?Eo_nxGGya{?Yo2I_$Yk@^N9!4JLrFcr;)2=b4z2&oD=BvG>tW-N(F!!gz zsGtzYd(2zDz6!iw4?)bSw-ksuQ_)lfXIcUM+QCbmCjmc?r+$-sRg@$4EX{n=mq?k0 zQUi4w;d?4NB(_&iTlt)_q)yuQy03-*yfPPHi(rDRwG}d4ijXg;FF9h%pR9n^uE~nz z-Zn+qDVMb`VjtQmSJZF#PAQ+_dklm8BaB9U-87MQcgT&T&Qq0X=rtAcu6HSaDks|2 zqc`%J@}+k6(y6Jw>dgnq*R>`>8D0NBfa}IXb#$fdX+B5t-@wyNwG?nz-ZWp+n9zxO zLpxD#sjCwFZJO^r4o*{M`Hpa;Hn_l-rXMKZ4FkrCqooBt6M*L)bRCaPhz)Kl@O2UN zPs{hiD657(j;hc04a4B`5TUO-G^=Z7`%(cJduM~^ymo?4%~k-#HpkZj2&&T@Uw_oU zevSeg->8=}b3poMlXWh>C@Q7ObCoYT&sDydHCOrK(p=?>$U=SzRxO02P`DiIO1Ona zC5P*HU}rZE#N8QseLlYnZki8h0oS*Cfv>HNk9@U7Uix_w2->G8bs=cy(e%VZUyAAA z4?NIBPx!i^eOMgKSm>*Ty)cgkyfVT;2N(Kc3=@%-RZz^k=-xs|UAvKGkydHJgG&1^ zQYxLb$d^)S-Fl@`?4iY)SkBD%kit}lOdIwu^0{zyETNqG-JIO)-z0y!ne>Z&8L6d6 zwyJ%nN?EX(mnyP81vfsq*!Lo4bJt?X5F2Wv`5JMMlUg)VdUvoIT)c8~NiVgB&eyEL37{&@%xX!T%r%_&oJ{VhkTt z7-0Qn43C(yMaZkwYW4PRbRpnNw0?GBuOfayaJ~z4KR>=YjU9Zjb)bHDDzxvf)#+sm zE?Ww*o62_;P)=J{eS_%M+pm!Pm@9?uHg>sV&#gh~x@64FytVkjO}ECqPZ>>InZh#4 zsN>@7&V`z;9De%Mg2*@9JPY+!YnOq(Z|eFe)a3rw zuGHY_X0AR0)qCHU6ndOe6+HockDe5~?`sz7gfY|!1Ri^zR#kOn>X(_I4-)=}OhjNd zR|Gng5OZ z628_~M_eFM-sd00QMa{V{uWRUp5gKyF8T$c97RR7>N)8$Uh-SmB(zU?_E0vKmbov2EnMfbSrk568Gw^!_V_80YOlxMLem*9O^c_| zd)k|W&#i|L1{)kZ3$k$aoevFn?x1`X;ACDM}$5lbVxKS<_^}msCGbylXKSJ_{ zzW8+IZP$>h;(<8e0KP(S9Qk|oisRx9*e$3PrxsSW7(?}XZa_%&)rY~h|A zs=3V8g!+8!8yY^jR56#BQ%dWnnBt9da0|UUp9M&JjvS@gL0@S^AFly-VG!)l zfJ^;jDSxA{AiUxs%{bjYL6;2np=i_jc>SZ)(I_fM5%j zuu&oOv=BdyYYGkaFGTgLvK_u(AizcXZ_3=^ zOQT~uedY-5LjjV4oE^R-vV7%>Fe?>^KweAuqqR3~namhT0k4bNe&u^txJPHd0&>1b zsbBj#h!=HK{LDcIjs4m;039m(`k@ZR?5gNc3;Z;Wn~=;ql$&@XP7S7sn2K2oj0w8$ zgC$gK{j3e;A4{r7-rc_MfK0FL_N5y?wL&)_kf%{)2esJa>jkb@q?}Pn4%)EC*Bzxi zt-f;v6ZiTiav5J>pO0(YMqLH1xgE&`slOqctK9zF56!}tlybng5-U8#n9b#VHfY+c zs)9*?6r}`8_rb^lHm0m{bnq!t_8@_79rPXg-w z^NBxVsch$oRLcCcOCrU8b)qU|wn&Mj(tZsrbmkXdCUW0YJ?wiUR*}YX&E;W16>)M| z?6`K}^|-wD@?nU~aFv@UrUg44fs6&{z35Jr;naEe38yfNN?PkuX~Qe6;_3d6zPI&U zgiqyD5iqvr&pxk9K}gV~eq9DJh9G};BLzVJ6qO(HRWtnfyAEhC`X^2BucOOdcg0fs zpL|tpyAc=l&oKGax5-cdJVoPv@>LfDA{8~b9Y>j+1{r8Cz7j9nsl|_j<19LCz)Q;% zD|9Moe={xxd;C!gbc3u0?^K9^(Yq(b@!nOn@m_uRpjU7I?5kGwtACbD^3O$>D?`b%1WO}q&%wUp|b9Cs#5=B zzEa^FWtRFT0_t2Q>TD*V6XY^ay!|Pu@8@RU!6f{0bUlG;R9Tmt=Z(hf3^~oWv@) z-yWogt;Hs~_N%Wg>Tmv=Z>U%-1cV==A>IA#HxQS{>F3{+`tSbc8*W@DqGOTd8Fo9C z#vO+MU?UYCM=v(g*5kfcVHBoG(L$5!glmJsc0iJPU+&PEI!vjZN8cpL!X@V#VUh4QK@2ZhfuQ8XgOY$ ze5f*Uw^>e5q!7EH9=0i@WuJSv>}pYdgD#)I5Ii5m}YJ%e+9uws^ERm}zY8<-2`73f?Pbw)J9 z7Ui#INHYB-T7Fw0=1HFQ)M^BFX|MNUG)NTj^X%0+Rd+Z%Aramt|~@j5H4V=~Tx zBNGmi=l=D0I^46aJuOa#DI))~Ul6=FGPq>}=8UIGh7a^CN?q5p6CFJ7%M&+ig7Fa- zd{2reOqBg>d>kFR07S8c;xGCZI71b{Ow|pOd|tuFf6&(#eZ^=oI-?+-mR<5C@?sz> zc{?}^c{_r<{1zR!5ZEJLy?LXmv^SqH+{>a zNvI;i${wc*^zonz29_f|`FwGjIEvqsc(= zXO)E5xoMJ_e!mS8@1Q^>>kRRfddHU_EA1N8v0}))`TRS7(>x-d%X81@L(TIU1nH>_ z%u5UI_$+*Mg8ne94_~fpj%lihH;l3>TMx7UF3yeOXYG6C@h3X8@Xgkd#BLaYeEoPZM>@VKg_<`iYBZy&Nu}8={=uA*hwev`D*Jw&;vOQ zXc?VoGs>C{0L}=QhfeJSan$QR_U#24a~}%$$@gg9eP62nqco8GazP&_?Z59cxeAw7 ztOAzVBk+L(zRumpbe=`QuLkk8uEM9*GkaAmZI5iE=WA`8J5;jT9)`2L`?PPkAz|)9 zX^`+O3B6s;;07W4j6i$-@LhU@R^a-;*;jp>P>8zb`{WS{folY_d+&2l-gVzSh^ewy zTAh^tock%7WzMcyC`fyR^R!oxp0a(;H{AByEuTf|K>Jn1(3J+ep7#P-S2!JV;~I=6 zn@XzOiVN-#B}s@{x(P8nVLL4wUVL6&x`}S+q#99W3m$q{wt(vDCAaM$T)f*_tej#G zvmc~^dMO}oxE9nIq!LrEEkbe@c}jB`+==)VpEo z-E{Tt1NH7(_3o^CXR|5aRktbMbyn|2s(1P7-8%KIM7_I+yR?l$$Q?t4Mj%yHj}a!{ z46|>f^eDAZnhLV2y$cGt)iX!_ofpc{3VGB*niRt%d$mG8^Fkj+feYFwQ0HU2;`J~O z+(<^dGAj-3QV&r$MENn&x8O1RI;7pk`+N>{>Kw{2Sitk)u_(QO7R5?kh5Il^liJ{} zp_4xh4tGjD1ofi`q$Kmi(qWgxS>Ed|DMi14Z=gV|R4w>eoRlZx@s0$kMj9S-{S!8# zDu%Pb=r#?c^29bPJB z_gdhf5lNC2PhZ7TTndu_2@7bGdUr^@yQSX6CoAuoB&**ux_`jtv}np8EY1RYLwi-3 za!Ok}>BD4f?gbQ|A|><*3D+p zBOS6O&r0RKA#akqWrT?eXV!fIsGw}x`S_rBR$Wnmx=qv8M^so6s;XBmrp?T+%Y{9G z{JLDevN^wQU3`2ozwYDWrbKF7P}djLC1idUo@kNraAZNU$eX>oMmal0kgs1m%;H)%*)wfTWU?Z1kiZIl)C z9nv>x`dfU;*Yxj{qeeNB1I$CpQJ{B#6m5FDZgnH4ac?Z5vv1e!h4Jru`Z+H1vQx9N zlr*!dyPXJu>?bGT!#%t1aQf8tdbT(b`nI8Oq@jHI&^MY3mjeY2DnY?{U~YejGV9j& zQ1{@>N|g61yjRNI(&ymW0v@Rn&WtZTQdL~~Z|Rvpk?Vgo=@Ez?x|O5WSYlp@!3yCC zuSA7u(psSQb!pOcT$;EgcZ31K{lhHpA}KR1Gj&O#yeiT<<8~wyvTq}JfY&g5r2M>C z3CK^Rg;k{vG|DHDprhBTNgk>!NyCjgNFl%@_pdG`lbK0&+93f@b=0dmO5lM9CLT+w zOGE9D3%GT|-3AB=yy5oAc5>8^29e1x^+f6KYM}H4zx1TAH+aY|JtZ2phk8-ncth>c zgKm_nJ(%`T8m=@H`pmB80-*Nx!Pq{{C={LDbk!5C+ed&pRlq znY1t?WT2=Rh-#u*%|a14$U0mLcc;VQiNF%}>Gr_-g=vD5GMYc^yoI5XR}lD;s!ZI^{8DrnI=K5mT@Ke^L6Ps@&f=HXtQeWQWyx9shv zKCOY+HU__JEu{(K96LpKkS2(mtn|%K&!*5v9i(EzahU9WPnYu&TTIf+QgKl?3Q@p@x8uxuoY_F1|9VmU%i=8U?D6_&xWxv#z^HIfZB}WAxW#)WT(ULZ9 z*xxUkU{~z#i#na~QD!?S3O;RF?J)1%X>dD<+k58tW8%r4X*1$YX+%T*CP!$OK{d;h zlkqz}s$nYLWLuOsdF9F6%VXJ5`0$jKCr83`yvWt|0S{%a;GvYXS>u+r;XKs1H|?B< z%CI+#*G0lkd{lc0!Rw!p7K%UX0&=7v#KGZ1u)j~QcajE*E5d2q-qx}7M<>Z|e9r@c z7ldjPn3L*tmRf<9`)6nA9pPt6$pXYKq5)Y_A|AexC3Otn6j@)a415ePvn(lH_p>gs zuth4sBOB-ZB9gOldX-SWY^j#<$TaNR>NF=?>LMHup30VL3gT)H6*r5Dqnb}jF~UbA zKPmb6vy5Ih<7n)Yl2P}L!9vB6u3D7--80eD>qm<{c<4zfUoh@AfRqlS67v{maC|pu zkeIt(6b-q;SQ)}gxHIPoJ-LX{W7cK5bujTp7Dt`i-17eYu>Ww`1V%MS$~z_om4e zMTC~N$)M|XZev^CX%lkoDW7=^dGEg8kQ(nPX}ypg-2Rl5$HiiDPpQ2CqyAp8gQ-PJqls?zlvatl zFe;tkcG2cu00kZW&`TP~Q7(ARfbfKXvni{$l%qb;1(rEQV2s1PrRFG_*hhL=ePIYJ zOG$%`U_l=#Lw#bT0X-7n3D8HXFQ^8Km-{Ct2J#Dif|Z)|lg^9B46u3y2QT-Rj+_3x zu@^>=(C-b-i3>h9Kx!cZ^ePtw^jvS>`V0rbZu^aalTHvam=7oW-jB zJRDlVuk!35(BZ;2T0wka@~XuV@;TA|D_7(|cbaXFtt)%DF3TvteZ|RjS@46cBE~n+ zaSqeSagbo&u3AQM8k93EVfNoJXWe3BxXX2@H7uF^7ai?;ZbkxKA0$QRMp$&J6d#ak zkpJWkXaGYo6EFhK%PW)tX7je zf|x62@;}~)85N*%lT9av38+Q@l7}2Z&PB5Zc^uN3zM6wkCt*WDBJ;de;Co8IqY=uJ ziUM8}csvUlF`xo0g)-%uuL2k}11gTNzXwlTsy9TcMd1z0ThaEfL?^wzCNU;>V2D%* z&z9iPkNU(4AemsA{6|b8**@vh83bhCPx=hU%jf#_F>&{ol27|&;eJV-LWgYc1Ro$%iP}98|@CO z5hi$X;DOuqB7R_vFwq;Hgz3%kM21vA?nod58x~x7!6AdUf#VTw#r)c~uL2_;oT4ZO z+}_4(dfv-()?wAWHjbJKu@L1vDD%v$!IZQpwO8Cjaew`C5bh0TTm#BYpf#WOE>q1dBPv*wO&3dw8b+w zr|#8l5{@3;et+sZBaIF;jipAfN>+0?pQ%Wg1uvjUeSHOVkUa9PC1qKRdmBl53pr{WH z>u*+^uD&Kco(r@LgSwCk;UZRdzd9K#~t6YwG}h2Y9YK=i)h9#(KrJbWdIZ?+u`2n|kBbLuKuD^5;0c zyp|_;$1SKVbA-lYS!LA@T#%1^86jV_a=O6`L9%@E9S7{OQ|gNyQT)hS%wRj-jVfY0 zpeyCD(`W{(CRi5izky?_7_ovxfObvz93T5Y8d$8x&_rM@a$0-AE1@P^8-yCr^F73BmhIJT0?WQNWOA3!EdocvuF zKLb1_K!l*22BI8|zFW|Dtg!Y=g%a&+^pk%LD+CO)y@zLH1vP;>Gq_M)LwKt8Qjq6p zu!6^Y18YIGPmnlQmvXJ2Ix1XqNu;lB(PLvZzN?To`|E;6VZlTleUgdPWgE(p^a~; z*!apAFdO&B$a!ON&C@>)3%=o@-EUELzw))$@?iTbz6}_=(hE%|i}~hrjP;Df@_0qw zaxNx{!=c(Rf2RNwP(1u1RRF{kg3NgY06}bH;yF2D;sA)RP+Gb2H4c5Leh1J4N!=bW zhsy{oiK5QY7CTy9ZBYX~8s~{{2$3{9Ps;9L)qF#B_G@qxRVVU+!=)R@JH3IfvI?63 z@zDIMZlZ#Hf-xk>uJ}j=&?6J0>{RcLG)W-RT3Ikjj*Pz!EoVuLn?j~998NB3Dv>o0P~1;{<;aMVK?FjTVsXf$W`64bt;sa-PS8V6$sW z!uc4C2&XuvORsQENyFQ6WFX)R0~elfP6|tmQU*7KA)Noj{0?_pAj{EnM#tc`VLteC zRKp*JDv#g^1i|M-QOWgR`_R&GApx>YcWhu^YJyP3=xl&VG*fiLX$~9)!2^>eGfbY5 z;YWH7mv&R7{rbz0lhD#>QUcYTCJhxY!@cfh3xd&1gF1fGG^vH~3*DS1)eP<8=nedlwWy;+aLK3#1oNPM*+4DaS)4Et}9rEmHQjQl#c=Dam$XlA)sd)03#j zYzPadlTcs%ESe6?mbeS*Vme=@Hk`!NFlDQrL%LO zW1LQzbETmunEa|e9SXv_ff!>GStsW_aX4a7Ll@2^S*#Z_Ls+ z`~QDFOU-ES5~-?b&T>o@LR@01ZqxOE^eUz+EDYTx>Kew_3vZp45bC~p)oq$R1x1BHM z?WWG_rC}Tlbgj9U)Bs&;t~wN|pL7P&vnvbLaTD#-JLq;=LK|TrtjTAH)~Xo>Bh_8#=f~<# zn)#lz5rb;`zVsg0gupEV#N{pSkkFLJ1Cg;c^_hJ|sEbnaP+ zIb1@~%Tr;NvPxP4kJ=5Zq&^sPQSVc+nb?XvsLPu7p^!&JeVlYKjan+)v2cl}+N^behNh)P_RNHQ2*{(3CY&70X>Aq>t6ny({7I6kg{K zYw{LDh<#BbzCwV>iFBUfZZX|m1F_p;s=8LHfwHE%I~yi>)efVVAyezT2S49X9u|HiRT2-tuJs5^nVWqCeFB_0xgl2WN77{RI~c8R zJma9`kD;^33ikh468NSbaK_E!sgCPO?-8Y*k z12>qvWmh`6sH|q&3@XiRQ<-ej-3ZM4-Ek*X+Xe{Drpr@LW9v>v*v_S=6QLQ*n0ESI zTD%>YA@pvlmx|K+LH8C^U!E?OKETOVK1GMKGk=#9#Zk+$T@ptv%L-tj`Ry+06~5a2 zzLb1%@8VEa2N*KE$N0{Dgb)RopmkqLR?~{<=5{Y(dfIt3QtqXmx*ZzP}TpgbV{5e z1xi?ofXHr#Ye!JlUZZJoo>vH`ZU>~c;+j*m_0-qU#kRboJ9qn z!pCNKiBuhLbn2T;>YI!PdiVt64N7?qN^Nl|TK1xo#vW7(o7BSJ9#pFFbWU-S`8(xJ zxca8YcgmaSJF0$f92kOFRfbH7fd{c`P+PBCWt(b$a~S+9}j>z|%40I4VuTqZ$YT zk8^s%QRRU49PHwxO2?#G^z{BbOFV?QMoql0mlel&;Ik|_ok|Bk=cM0{Nlj2g1__a| zvDCCwx}LnzF4wITG$NUe=Do>S2kqFT)JyzoDGpp=}vkhk}0_UhbgdiNSv;RNi}nt z&YeJ=AD^Tnk*phLCuv6wen389W87E&uY5_MZ@W|>hW6Q*Bl5_noIBa@k;0w8RJN6i z^ij-d*gnnyccKTZ36G=ucdQ9jwX-SJRhpRx+*a5E3{Ue`gwh1^3yvU+s*QtvjB?mh z*^A*3l-C8$N9&In6A|ZGy7hMqfZZvveWtN zapClhi>=|1V<>ddtT;9a6Qo#)XZ4TDCi`2REVSJ#*@A`f9MBff)dcp94pFtqGkS!J zeo18YIa8FxG7!@Eu_Wd}c<(_;tTKWa%}iqT5M_Xy9(v}~aOeg3oj<5FiE-!l106fX z)6q)xqv+DyCyZ1rnMJ{Ty(H;`gE}QM2Rd8Q1EIq1KNDf0{7-A>X>u~_BxQwo9ZeJs zwnp^?;OJY^*O*B5)=i+;6jlkfG)!R)jgvN+?B5EMb+%yw%}N2ykrg=bju&iRX8Rdt z`sL}!Y)VXJQ^j3&8h5`c@&MT>yS^m>pBFstXctURW1F$lf@eK!FW+j#ha03|!j_h| z!Gsmq!(o(j|8Rq(pxwvDh~k$Hx;&wdE0DFvC+O)?)EjmlwLti+Nvc)#?baeb*b6xLi}r@aceuo@}9AR)Q79bc08P zTCkGf(aEr%Ig22bVRqp6H{nURW?Oj1pk2*P14By zT-}aj7qQ_sjIG~MoCO!qEAU0mr&1%u<<_qOnT4loN-`~te3%6uu%=f?Xi;;rj=p3}FhN8L>!O~Nfg8=mx-F%T85Sd4(aeR*S`P0-xo@JiteWg7 zAgX39)>_={rLkZ3h^HB~n1pS^E&rBHZiQfcwOD2TGJES(=pDR9GgV*JuPNmP5CNcf zI!mv;l3TgyGx_8!=Qa__Da}7 zu&JrW>VTB@RA-a)0Rc_h{UW?mssmvJs6`Fnl}mJaGB4f&%o9n z45XlcV2i1Qz|U}WbDKdSPi+>f`+UaBt_5Nje+}ALmXOjf@2!tDCU7tcQs~Sem&QiJ!?44 z4a;czn94A~YsM^OpMJ+k0+U4VbSa8&P&bM6UO&>Q;65lInKe`iWk2S zDEqm3aZy;1w|L0&{?H9@N5rJ&%;z2)LaM5$2y*z)wDDrFrtR09ackPV<_|62=#O^U zXlHX~HlGIlZ*ymrC~CgEPjrCUh?ddbZMxoE%l$8si%UL0R69N zXG`Yii*-S}#y!SfH{LSBl2V|Yq45sbL4%YyO+qU+A!1C0MNeR~TM+6{wY%BjqP>*9 zX~k0XvqcqfFX_X8{2Dgh#hlCcMI!MAMR(G|ORL3=`h1HFFz=pk?6RHnWs0 z^#!e25}S@EN^C*50ci@2vZm2ix}~aI&1$eg9+m~~?NCi1x<`KIamWPPvepVnjLVI2 z(Ym&bbAbEWvMM5?Pao-W-$yC!SY7PCF74Qp!VmO*JN8dF6nGwI_0^Sgkuc#m5J8W# zZbs}sqZ}95KTLq7>u-;2Fo-z|>X#79KY`1UMLD5VAMK_$$ljqO=Y_atLT zv!;rpFd$7AW?w5L!gr{6Mx8jyZ|@2ZvJR}3AeL!l1g;O05!X7h$smD)xt&xp0?r?C z)FLj%LL(8V8AL?R1^alKzBD^VxJo6%pL7KBMtX&D|8<6gVjtr4|C!BrMEd{JGzVt0 zj1c|y=RL538{N>w9&lKhp4-3bP^qQ-MFlnF+jqGle7eteYub9+-W$?mta| z@cNksJPc@7SL}57Nt|gAZ;Y_Nng}=gar0}Bpry@r`zfg#`$9Z$mP)&^-okcj+MPAC z-25n94wo+%=n=otW~>{pWJ(TnXT!uUFlsdY>40Mb>p(+$Fe@NY#2I)omE!xdrs3+z zk8H@)H)nnv&39dhp||?7C!^G<;2Gkr_AbELV|OF^Y5(z%afSC|Nj4P&FXuvkjuF;B z#heHTt=YU)m>Pr<(JJMD5^|}uiYC$=H7%hoeZ+TfOLn7TesGw#u_ z`e|0x@G{m6c2Bz@0U6z&4b{Tdb8TDSo~#2z5f(&mWDeTalW_@}mEToC-iTXVxb5!6 z>Nz1MwS{nuMvj7t^%TrVwJWXUdK)==GdB+=*q}G#8pNf&Sz>IKtl3ahw6%0Q?d#2IM)8%6 zQdbtU;iRJLO&oeF{74$ihM0%I?L4g3u%R=uB1GNEJ{-|JtcG za^I{PZ3#JdbMalyW+$YKCAIZ5Y&aW;@4guhBo2x72*zc*(NuIrk91SV8v1GU1!HpH zSZa!33H)+3O|S*F9jt~}4_TkbN7Bg=>|60`WT}X2gs{fXvXLNk^7n0y4R#ob*%OY^ zi04=X?@^=#cvz6gjUFm!GBr5Fj^`8-LH{qsR3PflKiEv>Q3_3#zbjQm1xl)#{-ao` zb=k+!2(zf5ZCEp8Jnf*xqgdT)9F3bob-MK$28OAX#=snT*DXgYUzzFRiJC5o8I45+ z;q9suOT9)ji>YK+D%|zE)5y_)x$abUvJ}~Y`HSoCxp@K(Djm(T@FG2jrCGGXXw*iR zYYcMG$Q)MJ&pV+J08qT>VNJv(Atsdo0BNxuxzTwOyK)qIM8gFkW)lTM^hhXNMSpBA zAVT-EjosAZd9V&}A9&dvuha3IF3)4)U!~&5rX#ATNmerpg2R@BP=jB zzGW2r<6lrvVZ3_x#S4t58@lvjz!@3xD2Dy5eP>X3kyR7LQ_2yaOts4EMev)9s~O>t-doSbool9*v=2@2H`v(7c~edD;c2n5Nfzuwd5~*Y z4f()bhy3deha2`|dThod&2}2xrUF)iymTXsp7BW-J}DS?GA>Rhe|+1{bBGFDTMq4~ z1D6fA>4P!MXSsUDB!4~0g^rbze5)*;Xi8rR$!au_(W(V%& zqklelA7&p3ce^2R^>y-sDM{S5LMQK}L{+uFb{n3k1dkT+2M~#xF+iPse1pS24BBiz zd;>?rqpMRcvxs*tQLkL~ogfBl<$;OkE1ef(jHA)xL3iUus4@uVKbLPu)8_F^$v<6k zWpDy@dTnqxSdjoMp~2FnOkmHUaG=F2X}DWHLH!gv-$h3!um+rGQNF4*kyU&ZPhBQ5 ze?6Gh!Qfck^*X-c6rTnhwv+eq>?=s-!T-g>^8pD9;PHTM0?K;bMDzvx<&P6t6A;(q zf^gfe@+NBz3VZ0AEEg2^={MPP&U2GtEf34|{`e}qao9g_IX;<2yoFOpM+@F!gK>@u zlh{kx60b~x+_f96n8d0nS)j)4H`;S$TVTL2<+|W!L~ricJz{=il8(XD8#N(^1+KrKz{3Fz!S&rj<1nuC5^8yHSg& zT6-&%_7L1@K6BF4sgO3U#nnMlfAaIgdzNplXSXlF!i)?MJW?D3zrScUnT|C#7@?g5X z#)l`|3$WQk7pJp$;iI5=28cUF?&G1$p24VR#-12zF;k&+R?dV-VJ%&m2^KUv*lrdJ z3WBb%0PJ)&4K0AwA&agRuuP?Y(AcAYbadlBlU3>6w@UA-sH4Br(Q2icZ!<5Zpy+MZ z5#zk~Hsfm2HnUkr)A(u8vccYm=FesqO*`(`k&~tm&6)#=`X=pW^&HljI|=G}-i?>K z#*%IKGbT!!%b0GAT$9F5zu~55<}#l#pL^}qqVo5)$I?4<*+4FqfVz$3Y7k4L6tY}nL^iu`7F2W;1bvS{5&|jkYq?FkLM|qSvMr^p@B~;Xqa-t!> z>^~3Fwv|TAV+?O?Pg<*hVdoa5R6LKh0}w>a2Uzh8DZgI@&{6aG*gu%{0rT05N5JJ6lQMz3!l>Bxbu4YEYprB8 zYgrs&qBDldpR)R?tk(TRJXZ5HLfMc{8pXTlLO&F- z7J+^**An<`1eJt0suu|0mUF0{6BnJ7_aX2^-z23tq7c2l)T`t5R3jUvXVY!&03chZ0-ZBV20;q^~d`s-4MXZt6Hhfns0 zH);^*gd0A%=!izi5Ou>rAvx`JZU&K{4zAT|R!N5vDQjv4)l5*Eg1RgjTZv$KrMmC&UUY1JZ8In-L9_G)bl#;K|v$<7%IjC zYgs*Xz(d0G!yU?)EMA2s;o+-cx}*(jB+67$MnwJADMR)t>qUWej1NE}&!?0hBzrZs0@KSsB~gp|RciP+6;b|9)(5-ZVZ~E9(1^ zI=K33RNtAY4R}5e7(`It8euw`t9z~LDis{lK2IN`0C~1E_Lrz+sMKZ zQGOR(P(cS*WbreE5WHw#D9F31{9bd|Fl}T_jUV&s_CPp{h>F`cqL&}j#f@P5?^3f( zpnl$?S2wZY;y4Q(-=qw|v6{t5N?9B1t$ z`se4Yn%cR;6m6^vH|)>BO_$QS&)GjvL)KQ-6qgxW*(e+qcek>~9*RH=+g^HN8+14S zpcl3=kFh6)_-h#Dbc}N7l^BXe+gNoPe6U+8-QLE+E%OfY2)!uu8_uRR`(gv7%O$}O zB~Qe2dC@``)rQHF57NwD)wtU2xN!zPugB{UO@6oi(uWkKBlJ3zwlV zM2OQDvsw?H#VF6@Vm3N5G-sRmoYCjSED59jxmX$eonqDuFm{ec>ubhR))&lziR}G_ z@-7z_(; zR|Y)4P0N;n!kx1dQqXR+ekW`7(25{xd*N4%Mp9z^&|flOp7_52TW-BjYI0B+8`Zo4jFg zlKbA;PL%#Fdp}wgmhm7Q5OhLTW~Q0@>ZCwWJ)mBr2TDRc7iZ+Jgc@ZC6|Eet=m*EW zq?hOtGP3F*VWt614e>fIRQ7z`J%zsB$Lfk}aNspHcpxJ#IU_!Zz@o2+z@j93U8e6? zi4Lq99fOq-#tU3BT%MqdS90TS_-X*Ojnf<0#M71l^0^5OC@*1ri^2tZJ#9DuFh`uU zgwLIHtVo3T*MyWAVj^;FT|@xH^9O+rp+?;o@gU`{5?YAXi zeWSi-N}SOp-?JJ>EU3wPLV3nu4)d?!k`P>1Ny8ilW*VZL``@#Apj9*p@`DJuijWvY z@INW*2bQRZXg`LQMm0#I89$&ypf?eBj&go7Dmezrv%-f4lYeBff`aLf3i5ALxP(7r z0+iZWhZOp;{~?y>R8HqN0HGJAx$BFs;>VFZ56wEnI*3zzR51Cd3uc)R89@yjPqv>F zxiO3g>Q;dn^G}L~vOMatBXECSEx|`0>}t(P1|xZ*9S+*-Z||hkpV?CYzRQ7QKoN)X z?6lx#g*q?(nQ@E2aJsZU+eJyguq50?(B(n3oz&?UFc~Gm#lHY~0(zSDhQMI`r6~p^ z9_e7C^M_gdLz|kT*_b1&mggU#DXR!ztIimoR5LG`OV}8Tg1tgDFllSOveAuK9o zy__eHafh$QVRn$rhQ?uWxcqvItYu(<&LEB&t0k^QYP4^=$3}uVQfX?PeX&sZeM%g? zkJp%)AIl&O`vJi)lZH8{Yp&i;n^$!QNfK;Tj`tY85`8}N3!Rbje`V4`BS+-sfIL}; zOnIfhG9$2B&d-Sbai9P0Nr)}arB^}EZ_FiBWZtc?#wuG)?T@qm2+vk>rC~gMd7M?j z@BSORyQ+qQUzouv80=>e{^4P=2eBnoS(F(W6lbN=}!VxoDEhv$#eqP(;BB(enA*i)+<<`Wh-<(9G>mz6yXeAC8FAH=XMYoze~}vFU0$kQ!Dqff z%SNnpXcZz>&lzS6)mU`21B7bx?nTg&Gt8W}+a+rPX{}pGw#=z9S#6AVo?$HF&m+pI z8)iR8SI@Bel-K_qAS7sjIhYJe{Y6r@KBsN zOrE|GMtd+-IHhY!mj(*@!fh|wg08cm-atP>*hk~)^?^A1CX1&R&ar{cAJ(KQVjI}o z@DK^`N|%3HL%*K`n|hjD=OL%q#hq7SM^jrug!l8Tfs)N~25mkMvD7X~zraRd-x;WQ zv&lidYIXHSnkz!$@{L>+^MZ@6T~KzXDNqz!3&&xVi!ir<%&pf&$b)#d%rvg;D)2}b zS-^y3nb>QmsQV>WU4ISIlfX=8Er7$~O8|!~+Iflb$XD(Q8*2H<2iMrh|j_T~WC5(N1hI z;~&f;Az$qyp3iQxnlBFg)lsBL{eVx8BT&{f34R#^|9~~&ozn@}@eBV@CdNsg<*j2W zIf3ktfh+T?3AC>&cX7X&Se8k8Ar-E&T)(ghsJor&0G6h4{7@4GL9L%90 zo{+4-C)a+BmR?nGVFGW=LGvy#UwC2#rSH4O(lKL6v|*$e3v;g{w4uk5uit;G_Y@9{4COiUuWhBWm5Q89$NNIa|bzYu;Hk2><#8oGO{W)R-%l4-I0;? z1`Hy1(H}S1+sa%?%Ireie3NB6_f@Q_0xJHJCBWwbbdBZ?AXRry5bH7DZo=cN(?*c=>}r22=WIe+;?zeruzq zciFFq6`OVsvdA1-mOM0$rr%?u%}UA=M0KI`n>%7@eS`K!O1;k-VHQLLBP+k*h4t8| z`>eH|7bH2YUOXMR&k}?=^!t4d!gH(pn+Yq(^NGbZH_v|}dU;{=Lvni&a(n0;kf5{a z{D@cx^52>J*VoW5#M0e2hDJtxI{U#p5hDHK>ZcH8Pu?|S7cA+mKfr4pdiilRlVd5W zlK)FuuJgZXy$fI96T3YyLzo4PO7jLdbPF09lGHhZg`F}-f_&__Uc%K7$zZ;xAsMT1yST@v5NA&(!an*6UqW9MZYbP1}uZepQ zo$>pj@wCz4=PKM&20!1@B^?_(kZ64twJ`d>6-0_O`Jq##FHQb)wof-I5^I>|gvp!W zf>q1!vdrJAm-m)Afl`r$ETbTS`feD^C?(v_&cgMB zEs@7|8s#OoVAQCnQ=kxX(zHqSA|h`gYvST1@iO9NLCsPW?oW&SbYFyAy4;~X%1+0l z2}|_ymep~JYGo)_t)w}^8CH~aE3oI63Yp#066N>SSWZ(jxUL`A|z`B_Z38( z+m%#gQ5MI&cJLwU9_imM{urx*Pc56DQ#j>UARm0u=I6?cWj4P%@_{aj&r5dMid1l< za?yuMKUB!U2nOsN8rKG#FV{Kw(2}B#a)*Y3Y!vEH5NTeHAFkn6P+=OBa;=mo>ou(u z7!W?9JHOM*QT}gvCYIv3#Mt1|c7G?q^8Eq~{AfIgomsT(UYUz(RrlK;>Lgc~DLbow zb$_%a)OoHbi}rz<&I6g)MCn}hQ0FR#I>-C%!y%w(d5s$7q)s=t-Bnd)2deuMEE~T1 znlp&t*%3fg@F&uW82<*|(Spk{u~aJhpP$b3zCU)O`m1-vucs=0bya@RF_h=u-F5oCx&Qfh+ygfYH7s8NVZ<}|aW0Iz`0fhh zF212=cOW-`)`RU2et!1g=f(#=KgLg5;__F4oIbk<;@@K~|71NxI3jJB2rGiIasJ1F z9e2g~;XFw%#QQ(df2#wvGWrsfBXWYjwNdq2rs)a(R}4A8+a_9eaEybJ68%9DZp(@Z z{nU-QSyUY?j&oqM5?t+OYsNwF!Wb~*|?~8s=qGkDMt3co(Jjy|hBXB_Q zygTIa`hR?Yzk|Tvt%d(SHazf$JI)T8>QU5JTnqT@FIcYv8$OEq6m0k?>f_k(Ur?W> zZccOP^G|a`xP*rqa|1&tMqJ7D6G-lP%_Vh$$ z|F!?ykbt9n<@moI<-u)L{hd{G_RVfMh5x@pXC6!b%02%vIwPR7fmFlnAOHUVjA1*0 zP$TJnr)5nMY$E2uEFrXJJ*%h|HJ3{ zq({J+6J5%=zNe1=Fk-ICl#>i$U#F+TyNCezsCuB_kg4imbR2Da+gu$6{EBcuc7uz{ zujfw?H-ZqGZEj9)^bEJDNNd1sa}CP06g&Fs_%Y8v zOM8dw!|%2?MV*thcepAxQKOpqV|YW$u1C9oC!l~54%TTGJkbnOhtb8i@c#&&=VA+g zZ@7^wuwci6HQ4?gH;QtgOQN_^jcRV+}4|P5_;*V+L&w$xot2TbOd*!h- z`KQ@#x0vKHDpXgvYWIeSN{F?M!V}y0pG4uG+W6BAkji3xm#f3QsbK{+m7S@1s0+ zlguA~_&BCNn~py2pCcTh=iB?aoyq3*{=_7BgsY5bg_uiHjv1cl{bGB6Cdw6bdD=;> zJ1B(n^Bpjo3#ef0h?Z(~4?n7fTtD49`5yy3RHx|6sAF9xh3h)n$zK`#=eXAOk$tJN->e%5J~-pV z6C>z=wV{pP>Fj^|zY!CKUdZxGpx!cGL2|+T7y3f0kcDB*30}_f!ya@!MR)N(Z9Q^H z$;gOFFS|r9ck!=)dr|6>{)YP7X33Qtp?9M;^hq~=3iA4V*Udj0mm%H#jS)_x zU*$>=Ep6%!=*bF}b@#6mFl%|g!NF(>iB?#agYg?h^5S?GZCL5j2M<2w?;^mv)4k4| zPThL?C!?`rJ^eG`+BCA4e}I5QT>E?b+gQJvW=48j`QQRBGWYcHSE~Gqti|C)9udVi z5%MENbY2-hHZStj7hB=S|6=Y<;G?LPfAQ&_nIx0UBoi{(x0zw-g?*8IYq+c;B#Mg2 z7I3=(g&-~{nt;eI1X+qr0O&#evrZrn9j1w=yXh+iv>z8+As)+XVY8bHxSRedysN3`qXoZDE&kyUJG|(;t%^1KT+xZn zS#vz$$QJ7eA1km$YzH(bP>M0-6DaWPE$Q@efx_nndujH&@PqD!fIFlU}=L z)})bxl^mEfMc=!;E)^R~i)0@+mHz9ES|dua<2#N4Iaihj1dTj>G2lVwkH z)5-fAHAso6o+!ec=kAQS`BGs$I)Asq%U0Aq%F##%e!mBXje+#q-<6g)VmVlr_=p{Z zU2*vZr;IJem_nt#=-$3?_l!cNX7C}Swpnwv{d#l9u|xtfa%{zkcGp+G(q<8f4zlD@gwHI zf&k7Vz^~A7sM5Dk)ChdB;f+MYjc4^nC;=QN(tCu`pzheP-7Nxal`nHRo(-0xPhY0rHM$4E;f#j@LyTJ$`v(1?+ON?XxBYL!YeM=EjP zE{jGgOC-c!wkT3MIPwu)SXNoWuA8%ppbaA1(yy;%(16iO0{CaqL1gVHJu@6J-lLUC zpkh9Bmxes`u~S~RnpVw@DyCESD-GrG4l02CnL3YAGM)Q3)b`FHX<=#(t$#YIjK3T> zC#rT$Q#)TGK~*zv7gXKOHE(IwoTxtZ_5;dPdHoLh+k;AfP;c3TiYi~inSZI%SZ_SH zICSViS5Xc+a%@Vw6~spqNE&2lW|Ii$hesnfCSL#t!JtBWaSpfe&Z%9GuX3|!;349!#Skp z6r}|lL5B3}?4warFfa4zn<>hDXs+?psXiJoRk<7YJBIv_MCFUH`CR(SglO72tZfXy zE4t~?o-|}eiw1PZG-V@7u4#QRmD)^KW`Ta-pk20n6(0t1a5}#XJvRg5C+d=BDtw02 zpp*ctx-*qoc$76u$;Mh3O|usi;ee2-w?@Hb5NQ>k8kJhM>UqBuLmg)-Q8a#*!ePr! zpg?kCFJi+iWf4l>Rw|^c@uf<8{3_>Puy%~SQREyOOx}OqSc6V_Ysb?wE4s#Gy5yJq zjBt#slwq`bSQa+iM~+H`odM@$P?5h?3hf@NG?p)=P~)#h)~5QotumrDuWUpRhl{YtFnUM9O(A#_zho}(npmsFk)8@2Q6&R zX%$670w}GIL+RC&KTg@q=9rlI&Fl(wd`!v1dOrIxyET=T%)!K#aYCsw97r$t1u8;^xeABh6!iZ#DfIYU2+epuz7D49wt0}z^62+@ z;9z#@K40m{B)4YY86T~fujI>9QtAABAPdK?lhOv45hNB2j!s=O7yD{UNf`~2NnD_m zfNTgSF2p)40y( zlmk*;DEK_c6Hj}-poHAe_bmSfIisx7*8n@s`isi#$-I5hT%N**)3}<;bNTv@Bedv6 zg-}tGmlXDUU-%Lj#v9aeg^)9S=CZkPh0sE<#^)pcV8;rj7VCtFb>6BZQ~Wx0xNI1h+AmO#wlqvEPG1O|c zVlbTJRzn4Smrk!%4gtmk@t~V8p@!FEkzYU?Q=35Z% z?R4W?N>?CY;akvCWcvCorE&DZogiTdRtX_kU}b6*g3M*7sUh)UMF>m2OwsEUEgB#j zE_~QxowCU4_!b5n9p7(t{D*Z|e$ervx3T;Tq^)lYg#Gq5R6#rSct`1uwx51Sxr>qV z$2-aecy)ekxd&#NX_+CiSdQKaSoD4CQIDNQu4gDhFRlk@sNw8;$^=}-ZcuK=%P%*G zm+p<`%K_!ebJEcHn_x4B#JmY=o=i(Op#ToWeP4Xp?|lU)0_D+*{{+n=x6WqeY1g;_ zY}fT{i=z>7l%7uCZ-(fOqm(x*CAd8Lfzk?>H$T9z3d;Zhl_mqabM z02EC6pAjGb(iY`?+!ubV^m0IbIKoclI2H9{r3EAM6XiZ0m7mIXBxOU`pYaKx9!R@C z0i%#9=2N9>x`pPTvr8bB^Zq-H@Ce=gsnVVcAEo=YDw(wTQ!u_f+WV>CSoODxAsxO| zX#ui733oNjrg!iQ9sgykQsj6d#`uK>Z%4ripDDx8+7F*8Epf@+hN*_l)NP_WXSOLT z@oV{Z7$)Y@&h0QO%al>UtS$6Zg#v%{+l)&#%BzoHz)yE5u4L@=;WQ01Wj|*ycOq8$ zi_nidAU^=PhrUo=L3O1&m75)T#&~$m@N6vpN~uY?Un(v@I)PsO3L#3ym(W}>QeO&~ zzW!3cw5i5`BpUaX*gsnN70my6bnDj&M-~xcUv%Fus$RHXj6&B+fsNuy zF(tQGiihJ4D1Eq+Ra{95eSbh`U9Zxs`|vC4ppwcjU*ngEMn0%ya<30U?t5i9zRdXnT?a3_=?A4TL-G#2d>AzM+z*23ze`6B zD=p~a4~h#VqYsPzbv$eqdEl@>?@Nb;jP%1{L6F)JMUNiHN!g`1s{dhHE+s5(9!14R zuy)&N{SnM_nWBDFp5~GN5$r;yGe3%I>;HrbkhSC|v8+D-lYnye`k_g5;U~zDd35K` zg67`;S(%JqJ&!6spm5`3N>BV6cMMh^nT{P3^|v@Ks(R$O!1WF~c?^?l^>HCFe0N;w z&KUbbqGk4%kty#4Y+`xz>It(`2Tv&d7$5CUiV9yniESvE4xLnfjtkFpoQwg_Ma55l zoDxJ3^NW&ij>=xCY|RI$;1em8N}bq!=H@%cuRr&T+30?Wq+s(TvSYL()K~Mgpy%GF zG5Pao(rLjTzC5jr=J7a0fgeD7gU%@42wgvLMyV}NhP-q}`9{k#4qH|Z93^XQSspQ4 z##x=l5$mNVgDQW8+3?L@VL*|o{aMl2gJ+e7+{!UB&VoWVo>kbFe(zbOEl-22-?043 zH2OD8m9Rcv_8SapcB=eMa2n;D(j?N4A?HjII!#kfD_OMW9K{cuhh&+0*p@hce# z!+kXVccr8AKyBkJcKQ}SicrzAN293ncW5OtNq=BJ&Q3%BV9rkq|A2&Gr;g{9mMmdC za$cFqt5xg;ST6I7i)AP8&6ZN!$RpNV-Wr9K4d2YVpe#j^1{am)+^-T!bilAQ?xNC; z2ld^H!1QRJgs_Rqk`VL%kJX%%cu=6@e!X7^kLqfUf!T67aj+p*qnredJI} zq{GzRDHywIt#@er8{;ve3F_St72dUc5c$Mikvb0cSs|*$Vn)1?pk9x9 zE+?qpAg@{FJO^gYQLoBt1|_N-necI<3Yj33R73q98t_r7%yFdm+I$p#^*Ax^0`ft@ zKa>wwmyObw%56xiY&iy5$B!Co@hNZd;iY#LRz1_45_ak}mb^rReQHXv_1O~ZGi$m; zK3j2R-Imjg9Il;TbM01FBgNKoF*yQ~`Uy=JlSnv9eyzp6PaD@V9Fe$C}9 zuf|BRtyeW?I#fiOoY4WP~@`X zJd+aB)DbXjKc1#e!^M>j%k~bcJnQno&q3{uBAed0J0-L%UA@IF59~ri+9hOAjcoNg z%+BuF>I*1yJX?JdmoYhNO~($&zyWpL&cU>wqwWXk&&pNLNzwr7=o*zmO9Sdm+#9Q4 zPUsv|pOQAyj-aYa^F#5kwpuTT-m0yZJCW|JVbUm7qR_Is>UlfTY^{E$mFjp#hSt06 zy;d*Ky^YjT>?B-jgp$W;U)rb@w7oGNt)U@J@Mt+18KdS>c2jjJazDJ9IZBmh!5sBc zOCKH0992wXo2d^&GxC+Uss|@$qr8<7|NY?@W43I(zBn8ET>YrDyj8BU^+J?)m~llO z1h{b4u=F&^*!gjmpMAT%kDN9n@*LtN`@6Ri8l2?0!9C(R-EvoD6kNQ=H!+R z@;6sC(bUtCrpmloI!q!@ZE6+gobd%3q-Qp@%8b7FrdjvKO|8;1cE1hRT-j^0&Ihx+ zII;h9GgUNK)4l7Dn<=)jGmkr<-{_yzk%lBqile*UZ`F>*w@?o`^MxH}{I>U#=&_dS za2d%u1B(Y_EWUjqM4W_H>JAJvJnfg_Qqmgh#D)FTZ_a2%UhpD))>>^WACk(9fpsKb zS>6UW;zQHgsK}B_fv20ow9rOvA+MFF&%zs0DP>K$m->AyCs27CHAa33F2!TvkFfWJ z3WTX3zj>F~R(x1;PPSVi;Nst2V7)T|u_?-Tl<9eCwJN@%a%hRfgEtBvHRQ)zK~ zwTpC!D%-0g(O`ZD6}GHUX$SQS7WMBi)J>qnI-S6P^WW;M)@3EB-rv-*@=$|jkDZqs zTK_iyD&>a`bWw!@)~K7xHoUTKY7=2ttK{r&UNaSkmu+hWLvoWSy1SZ;r3JwnZ7%R3 z$u(Ni!tS8;fz+Xg`YLVCxGu45)cr_9LhhbwJ+{K$yrnmlbg7IF&FiUNl28`I(8_)T z4LKi$EF8Vm74rN#p~W|-F_OFi=DaUmk4W#4zmIxWp6%hJl|HJMhnXjw1(RvuqRM!h z*>ZmzJ)Wns+p-+VY3-zu?|8E7z==yxBDQ6#r8N;t6pjWIuUKYF$QMg({-krL^sQTh zG&5g~MJttKuvC?MCiD*dk*~t|G-J{ibV@~TqYF=(H^ys|aFS#U4*fBf@Ll;k+h8=X z8PDTKr+@B!^NFu#?sKQcwb5{V>Moyso&Rf$)~XF zl}y0@Vm{^5W?cL+R`^=;1UhHk^K(?^5uK4u?@z7}i6Pb0>(@srEawVmURB|YpUeuQ zP{}0g-l{O(s!*)o20IFjf7rz)>WUv}XUnpDSJ}k>B-NWuJZdGSsc*plsS!4aMpW4I%rUq6rriyU#C?}Zd z$($FE)c>hb?ps7A8gC@UsP{jE?OG{DQM3xSrMIaf4Ql8%^*;ISHKgSur zWk;y)?GOML;!HU@b@b6BdgONX2k^^+0cvN@<@aKY>x}I`Wy5US4~KlH*ExUL>G$48 zKM#N;_#xFDsMdlcnKw|?q^a|zHo$26{sBn zb(5j$`vC9Pp=y^J4BiK}Fnp*MyK^;A?ciZ*j!OWFXE`+cz3-A};V`U8AJY571jL7j z35XN#P_u$xJ}n@|r$JM$OV98-O#u)_4Y8u26TBN)b_Z72B~<%PF`Mtbli6LU+g+#; z@Q%1!ZR3E|M@5uUJp_v0t-75zqf!JoFI=2N4-ZglrR#ztNCpGmrW)KjH68@Gw+v8I zJatX3Vf_AT0EoWj9)alj_Xx1xy+_s5t#WuP%_j&1b~DR;9eYGm-l)OoN4pKV-Q>)x zmaQl=+dD#iv2L~fyEVq`!m!YczpK}|zCMF7Mitm$D*;%0{w`1#RVZMnTc~Os0D~0_ zofL+lxqut4H^$emI4l^f&9vkTsn+mVhk0HQloi1#})~FOC7B)i{fSb6B|{W8lB<+x<55z zZ{6Tsr$(#aLV4M0o4@&+6ngwV)kVkeSJ^lhGe*4yG&6XNIz=q|+iBB|$9?l30AtDz zJ@5di8XrCPp!xxde{L%)*prL3p!gx6I=^h-owAgUEUjvaee?HqNO~h7!|wAQ2>teu zx|fT6HCFu!vAC-qQ4OT=JMoCxRazQq{-}CFa{Lbb)2SW^OKkg?>W=;eC;ugR7f_$a z)LNW5?t#b9^ANrJm^v7j%*WLw(IL*2`kk$;aiuIJg?2oyj&-7mqM>)eR4`G^0eA>V zF5=*tcD;PfYM82G0oCekMZ<%$cHQ$4%Sq@W+Wcb(V{!aBYL8 zU~GmOzfs`T7#~Eb&Qv}>1=}>Y%}$u_yww+qnyPl@?c$!(Kw|l{beg&cRA9G4ihVK? z{m!4R=80#JiU&E9LYJniFq~o^>M237J!V3y9Z8K=-k8hsTOg)U8f}}Y@&|Iby_s@dpHkxiNRokK}4iGz*CH13|rK%==OSEy(Z?&oOY_&VK$Dw$?)HQ{kpRFdN zop)xd3Ria166F3m@pwKB$>T#(7t`#LO1NrFNr}VRfT=mJNsU#IgW#crt7?tvB z9?w7$wDZxlI-yp5s#y4~gGP<25uZEv6yl@SAh6>qoqYzLV-K2&zv+iGh;!6bpt1WL z%%^;sHb-56OU=1zJ$dy(%Ac!pzV=ab)j*Bsz7SrmcHX+-m_5t23*5bab9Acd?Um$7_QK%wz!iIxQH*dTVQV-$|Drn}v1%JQ}Z{op=&h_^-~fCxy83sw9S@X?;Q88Hr6xA4|r|7~$wRvz~3WmozKE}mKz)TrA+B$%fYw5d4HR2-M zjjjwTIvbmm!y!Gu=G;>Po3`-DpMD!~IrkLpSfsXg3S5$RvD&0IzQcLWwyr^&b^IfO zenlW3K8_%f?q00cbwE(aq*D`Na9gtS);RDb2h!-y{^yJ|nzghfla4P|W8?pLI@UO4 zGoF}YvZbgcYTf9cK1ZH9$TZ8}?wUl`FHy~+xwJz)4fXaxB*zowXD+eI&z6i=j+o-x zi(LM*bpezQQ04t~lHDR5j4|&8CI+fZE5I>2&!{mm<^ybg&c5|s=+8?}I;rh5s!QZc zs6_?8HxSD$l3+d=dSbacJ4OC|4yCM9b>z}8)~W3A2169hen%~!)pz*W&#h70eQ7Wn zAd&aQbx=q143Zv2itFsR)p+T3s`s|qQxtNRoob&YB?tCRwE+tx$>JVxi&Tivf=cK^}$R8E?U-IjON`Y!WyBc`_U_tfsrUsgJ?!gw~o-a3Wq zZxFWLJ2yZyUqEZ|OWv}Kj%^UtW^80bt^~AZP~#)NCDBbA#e~SDz*3~GnYK}_rN7U$ z8P=(!kuGPOY}i2jAtFsh71>mN^YyS8Z&cY~5Sik*@4<331Sz2$?LH&g_0x)S)r~&A zSsrdY5Gm=qB9oA)q4p-Q!KX!+dTkP28nH=Ww>B9YGn3+CjXDgA_co&rt*M-zP5w}3 z3{~9biKQvcoOgw8dtaRvCG8Cz+M*Wlwd;2ED>>72Q)>w+Je>CuXO)SJ-0+?9XVjsA zpR4RGX)C+5-Y#X7ZC{)#;Y@*#`a9q-wrorPWP0{4&`#LL!0s0ZumoT zV{S}dQ$tvvI{Mt{X;+EbmdiHGEykJ-NJG3aGm3WZf?{}#3ci7uhv#of_tMF|2{l5l zZ`BP*5Jrm=u6q@iQzPvGN4W&~GV$KZRO-{IR&9FOd!5H2<8(#Z)^~8G7V!&{tNg;k zx9|%K-O@?YcdiwLWpVbX=xpj8ogW*TxnFH7W5d_D%auZfPyLZX zza3E7=d_S|GMk1wZD+aSH~Qe9+KYXG?9}k1Y$MKE;6YU@LIsD^yCnHt7*qyd?+fku zUTrU;n(BfmHsHZ<)hOrG+x z9aP-$F?f+3Q=_7m?GSPP7mlep@iTC5EFh5)r*sF7n0+ie-fe05;=8^iJp~C^&(J({ z|8X@dflJ`*Tn@PQc-LWHMr!V(*N;Q)-$~ggAfmlTMJHg)T1NRl*5S&8kYZSkjym}- z8x=Vn%q1 zcd$ot#TiVWn**^}8!r)MpqccMnQM_CH}&Hx*XTd9`!=l~|!c=fQ2t=<)LqN#3Ik=V61e zx=EGiO&dhx!@dFJ-Pg4S6<$DR?UZv7t5pH@xTp@tuQxBM4FUxLIc&j;!Fp?jY&tDL z*6v+Fj!Wu|;2cG1=TqsvORDa9V_}RDFs6N$=|?6Gdf}28Jz8m5s+cy9Dnf+M7}_oNWKi%Z!Wu6;$){IE?ZUSimIbg^>df8IDA3hT}I#b zE*2HgrOTpk^U}4tl6_tmttpb;j@5Fd74sHq!|>#y)(JiADB;ngG(^(!0Qwq9GX&Jh zqH4~Za#=$8QB>aOk5t5PO2(_(aZot4rW<7KPYlgz%1dBq1-bQcVr7ksF%DrzST0-j zrbX)ARE7ghqwHF3@S1vdEi3xz-w{NNiYumj(){T36~=U@d7gk6WS}OCmXAh;Okg63 zmi_pTXj*I6yaI4Ng6NJF~X11^_HnOC%|vrk_AJoO%z+FUNd67%6Z zIc&d0%5EI3)nk7P8Wp9zB|Sw-w6+WgJvRAZ8tsqPv}##dSc6Q7(P}~uZ5^ZKLTX}S zZ#==D{O1Kia2eq96sL_^7NeC%?J8>rt0uwKIE(g8Zd+sVRz%Lyi*F%S0Dd-mD^@$h zI%4DYaR>tl$}MRBO|qBzxV3@uvW20duG#n5xUzI7^qpeQ<_07~gEn5Wt);FS(i84O|Zbl+uu2sJ^Ow5A#O;S$8%y(zKYU@-M_1&|cGW z;#cC{*jgsmfYo2nre%5Av_C8SQC~WqrFC)hM_|EVMczZyAzKR~hnP#({87kU77ZSl ze}A_mTAU3kg()Lj+XkkSIN(Go^{%VMVR%o>xgLie=V*1W8eV^@4@vLpYFQZLZ|h=) z^`}v(K4I=WwW9&TOZqgeL&tJ8o%)SUjZoc`ZU29%E;J-bYj^e7oyDPKz_U4Q@>%Sj zr)VAipBXoK-44osyjG4|2))KSbM+P@_dKuOOBRTcTd@P-EA6e36CYV4#~=OQ9J$bj zdRm#3vg4Syxr`|FXyeog+#xD0n&rX!8)$#adL<@oRIvEG#}Yv}UDg*3vx4n=(Zgpc! z67f-A+R#{Q?dFgC@qRB>u|wo&A|{E_MDru#UH2y1E%GEB1J*=qD?gbrD~3_;E1BQm7slfTf7Ew!5ROYkG| z{fg+1mf9@)0I0LeL%t+x+Dh9ge;rK~+DRk@YOOT@GK~9?k!f&itr6}^TWjoqT=eE5 zn6k{*VsBP!BR=idMl&5b{fkspSIKB7B#=U_))h#hU`)5)n2<^dW9CW*RGTH)3)~7Baj?= zbU?#j(DV*sR9AM;I6m`I2Mp@E{ZwIqQQg&1i~-P+YkM4Xu{Ea}O76i88KES_wo~M?-qvAJ8ReD_`paU z41D;yXcUQm+0)gN?%e;575}1AaaS$IKI7%uwC3}ybb79fWWnn-Fk6bGO!p;m&(fYeg&bF=jtg<;DrAbUa_% ziaxx1qjncsxI9U#gE%lO$XjT{OzKm8L* z7BIS|zjiBj+eQ_Efcn$yqCX3hiPmQS(6am+RVme#XrA7Mt%Js~U!~ITMPdbBdb?(b zx=ZY$ZWdXO-462o0LM0px`zzV#AvOaqpik%r1qKg%YQ~It*KFg=8%5*ZxYNeCc%9C z-y)cyPWzZb?=RJe=Hvgjh~_JkXukTlM6+drX@B`|5DnM;*F>X-*59v@)Q4mh$4D7m#O)^uKk>N5N9_8jbeU^n@i zTyWeq8Q?Ja5Dvb)M>}BhJ(G;jFd6rN2h#s>wny^XZ)i>93E5Op;&Dc;{YFSoBJXDD zE04$1vP)zke|;91$KqG}2g&=e!LQPOfEoxQN>NhW$;fbgmHG zQo*jvLo|4rrpo8upsCZe2J(`1^!79@yY{&^Y8OH#@!Pt2*fSN)4iDOlaow=3V6fp2 zKi2J|^V78ST6+@1W(zZq0BYth65`^JN(v5ZV*oC-oUT1DuiK57!ThwSbs}RRZF1yh z-OQiD*TxPP8r<=&mI=IMiL(6OJFE7ey1H&3clA=b)mJ2JVjGhos_x5Y2G^s~nb=KU zIYZlGEhi1=xmnt*>T8M@`Q*TX<{!kiU75lt=;~wmYDI+{`a^A*KKhN zKXsa;HU85&6T&((RhGV|)z4$<7cbIs>E8L;v#_6f2~r&l%j+`J>KN5!ICch%2%q5u zDZ*}oGmlcK;f*W(so@P%$*7V{7?4U&EhIOG9Xi@!9Udl1Sp+{fT zVqFnPNc!ekxT(F86Gi2(=R`n(VR=%v9Tu0!NlB+()SjRw&uGs{zy4=yaC_<3|Ka6V zdQL+U2r)c|t6_jer+?RP<6reQ)_LZ63EMR2E6aw~nNT706en3)V&SjmD!=u=waVWG zELDkxTmR4V$F`yG)|zOY_Ler1ZhT!^3EW!kING)Xnd6JLnrdb zxVoz4ud)7*wSbv94)iigD!{xK%obLG8MrqcL$}cEiqvc*gx6!DwtOsBz%>VTowlFQ z(lf+^zTuUoY7txaG41fwNR|0|!J8w`s32)T=QQ|^=l`U4C;tapU-{(re-F;l?Eq(W zsQ~93?kzvnYT&G`2F@U-o}M8dTmzivEpTwn|EzN^j0x4D$^1zB1tb-}MJtj5%cYA+ z{-le!k{5TdALCXQw=&<_y~}CY$J$;{-uMcwM`+6@+6oywr06s4D%ENJXIeYQi;#z? zU;z>}{`?v2q+e0TZP4$&3Ju?;rTm9YA#AS#wouXD7`bFAwfS7jiL<kjQ+`NH%3LY2;j?)V(hzgRt89CV)C8_qpDp`a~2?KGaY8@sl; zg|pSVomyRGRQNz0%YYSYol|VXM!?Pxdu8=UEeTwUxls}LQmD|azl2uC6`rfAaO#&@ zQ2uTjt@=`{C%r@8ehIN=BD?_BoJpaKuV7X9ispQ!-3@iN<8DW4S;81yigud2Iyqne zNh2TeHE=Nuv7SQ5d+%#g$1^_d*&2bL+AH$zD`=|DpGbTc)6~vcf~F3IX^Qs$nv-i1 z__-}r1YVE=iV_d5K~YDxm;}yOCh$X7lGNbc+MHfTUPe28A*W$>^}}VituTlnA>(<8 z^J3bqd3TccD9kB%wCeVV>1^W+yK7URQ(9_SADl$tr2cy}U;NAa?ZP!X3Vw&r@27El zp!{y7ZF__z$=K6BiE8cz$J*+Hb+P;iWRj=a=iES-_rjiptoyO~X?AuvSY8*gS*`YQ zq4~jE(wuk(TfwROZ^5D7`!r5$6H~Ul0Rju?_&#kYO6Ko}DGyGq`!$iAe)+QqIX`LS z#L(LPS`sEg!D}BQr`mo^ud)4z)4+*kv*yI}HW>U^5cAq8C%bI=3$-LyjPdlgTv+)+ z)T0ucK=1D|11jb5OkmbWfZ6pC15?}i zQG~wa^MK{I#MG!={0y7K&wQ4I!`21c+=45&zy8Yh&wsBimyf(md)wyZ)H6xu-%?Lh zgnAHHge(v3a?)#5(Tx*y!!$%A+U4Y#w39*KzVbt^O9<^?AuwVxAypiPedjZJuzk*b zIDf+O+p9Wh)?_)LocSGcIF-W1DY{8qMIGQMC5{2R+wl|JZm6^ad_GV9sNI66Cwq4> zkE43NW6mJ_-t?0otQ;e!CSCpsdr)~a!^mM;d&$UYB;z22Q&C9Q2U^PnnGJbmpCGd& zYThX)HQu7N^9S63x*y%%DW`69n82Rulv71un}X9hqyRQAkXUaz=|KX8y+^gCr7+d?lrn8+Eo$-~&dBv6EoGad4#EsPVcVeX!&j*;6^G)|$6|WL(YmSGJ<^qJ{%#$ehlu z|BrRxFk&Q_vFmf?8GnI@DU66iGXx^$Mi4RALd4u^h&TsC{GRwPC)~s>wA@)Y4K_`I zhq+haL8_olZ(i4z?w-?`y9i7$IU#Gb0ltJ|5@Ppc(G7Du$E1Fd7M4K5A$X8#w(h6I z6{29{twZ<(EhpSZW4h3Z)7tp|t=f3cxAc5!M|%BN?IUSD66Mc*Fe6R2NP7Lkn1MvBi8>^fxs7yq4}LE#GDfb;wGUx&Ad5w5{^FZPmr7KQqTO z+b~vB%&{tojMWNjtX5PTtKUq9lp&s7gF7y;sFtrxwIx@K7J+IRvCAdhz(tVhY1dzo z>FTo1oHg;^7OJAlLx0iN{oL1;(*<1~#l0yqmRNl)sn*xut-gw9*XZj>!HLtDA#+!c zZo5Ka6bnJcUjVa}fvK1#fY}uR=BQW*YDFEbwi5gSV5AypVsYq81>=rH7J}WP{aoz1 zR2Nu9^Xso@{?F3<cr^V*n(5k@E$A|jW57E)TR3|u7*qZ$(V`x4o8qWHpyWIR$Mp^tSVII(vgYjKP*(% zI7N}t%(KQD`RC`->Nx#r)D>7bGlj;@?FkF%oa2b6b?Z&BL|FmW$S5avOOXIecsg;; zxN^775gy{)b)0&hN~N_k>(W4v&XDb$)Yv*A@$=e28l3zkV&jkH@f!r>RqMy!O8J>I zwW9@5$z%P4p?l-?Z#d|2qF&UiF%nNulS1*e4a;e z*Ay{=t0N;gquL10s2V|PdJy`UcyNvJyI@USzVi63zHS3WC6~S z2soQ9dfr@(o-bIFOFX*o_&JSs+N`mpqw++g^d1)aYZwmyqI*Qsp6mRKDC1NTyS%dSe>dt)tUDQ3~Yp(A(4c~s5njs()5vz4< zkfx{WSvB4M;7dh;I2^!d_s8K#5SZ`;jmDUURd~jIOrNCd^_%ZTuy7!nljvY8{Rn>4 zbY%vj&CPv(G!7LH#`>Mzf^h(i9U@}kjt=0deul2}I)@ILk&;s;hwtV_?k3{S;1?Vw zS;{~79seldAL5R2bIA}jF3Zq4jsf`xumT~A=eHSpe4-0DGXDwe_+9jShTcJZhU0~Y zHo=mWso$>zu?`nEmmA^2Fg2I?Bn0zL^$P>DAJ*s~{gkOcDs`v3vh-U6XKcu~VBsX3 znqc;)vBry%_kigj*fCpA&R=#e*L%(pU|&kaYrqGiBpK;BN|FmPet-$F;HF$ELn2&k z2l!UV1)Lb=5n1Fk?cF{ZOTG&h7o4^B&h4;55g`opi+PP~BQ z-q8;rJTr)==e*P?px4JWG&rCKrQ&mN$1|kiAZetB!niS|;navuo)-4*?x;9X*i~p2 zh2h0M92v*CPJ=1JREI66PrP+{e~JyC2j;TkVf_vj1%eU+RWNISATG(%2J1l=KRiaQ zeEr@t0b0Iv6w=|=)RQwOf@G2ak(;54v!**&g%0$psr%>Oy*`#6tf@aN#fMJR)YBwg zbkt=?h%-i?u7uA_XK2Cap~kiK%$j2Y(cJT{NLa+jy_GnMICqi9@2YQ;j1JxSo<`Ny z?~X|Y5>yN=?W?UT8Tcg|ZMy}X9?6{yj#1xcH`;c^PXJy=&vY`t9_m;}&qa=aA$9bc zeZUNm8%!D=KvWOFGgF13-8hc~mL?fP`iKwgJ@5o4Oc|s4fGC{^RWA|`>wCOx{mf*DSCEiQHx(59l(Jq0g0Qtx(W}%3yh9E zJcu(0NbG2h%8c@aB2k|NIFRU2H(VuBP-2|q(m_RU+7dq7K#}C(8FuNitq57qV&mYj zEENSM^dQ#ojuwv$Dd54c6ZpjKzz5V@)l=g5QOsz!oga+EgMR#=+&0=IJddcSO8^6c zNho<_93&oRRV0m$gA24RE&w&s<8V7o@gbbvI898ic+=M^2sT2A&lcuTo~}FRYkJM% z>WnKv2pk++@tY%@D=`=j&+;=2#rKakdx;JSVnfC>^Z}MTlj=Eqi>b>W+Z=m!Hg{?` zwo3w~a=$?qAaj%bGSz6np&yC&z^M#38+I{;{I20VpJLpJ)xI1kC3qgvDqX+RBNB2LW-B!) zx31pfPc@roZCf=bndq(gZ)^TXT|L{3n&FyhyQ-%l(}RAU7=r3Ro6%ra)s~YyhQUJG zHGnqc;qLhGu%}eRkQF5s;MGI$A|5vGN{}QGwmqFZIBdvfBV}z?{I$SzTZM9xOZPtY@=fVY2lWeAR6H z3eKG?h&Id(?O3>qfDTkXoEZYB(eDg1b8^%)XO9_4XOdV3z12`}qhgT^xG+BFyj9{rrWh7*MyyaS@96**J!IEu zq&IDwCEiHh&){KhlAm7;m!}38R@Ewk{7WoWn4weF)XruOpB%*FoT^H4%t~@1W3I|$ zXk8;cP>j_HVkM&(s}rva_DWV}zE*ZPGV0@xIwhUtzKgEM7 z;Rh$J2S0=#OgUwK@nZPFGCT-6xzKUz5$;>=epTX@WMds(Bi{ms2k;EH$OKF}OlxLW zbHm7{p$&CTbntpZyr!l&hjiZ}<+ZLIk$(Rx>SjXQ7FARi z9%`9m1Wz>3SuHx=M9=nO3?N29Kniy9PYKq1iPmJd^hrT#)Kq^Nb%3`R3M_h0~HM--wStfU-_ z8;A82Gu(#N0257$3np~I%tg;9Ci7})H-7*Pc5@=4mMQ6Ci8cX74=_IkJ2p{T9Anfr zF=U*#F^X!NW0@TxWRqyaa~-6lub1O^(Tj8!0`m_@sqcda(jShk`W3$i>9R*qD<^ggII(VI3-O z4(mre9cr$3Z{T5BNAf2yTlM)ps_ZlDV+^paa8WY@Kf?Y%;tKU|p*N|8uiSvwgU^EA zZjO%jj{Z0mVTthi8B^$&HQ5`)WN4wcDNY2&0*QVJvqAEE;W#7+Cy|30M0RQxX952d^}2PeM(#-tL{9b5p8a* zkDzg<-{r8>#?+>bu1X1XM;pB%Rs~Qk>k~ZD&w0_uSXnH4V}edoTSyQSBCZR>baa3@ z4%7y|=Lr$v-(cn8DkL1rgZXid*?|B&F{W!+ z%qk8-YG#!dtOm>Jb>bBh(sfkOUT+_7rjdy@38p!%YOm+^fnM$k$X5urJX<;av<<{w zZMw6@?r^&;zQowoz^LCWl)r#H`oN-D8RYH~5a(xMtlT9|OAMXU&> zfHH=LchH-9T2}kACC%R2Cz;AS=ylpyYfBJ>T3sr$G)M_)orOIGa|qSNf)_aJ+i(OQ z!~(>ichqw{5iyPl1gAkkO7GowYE&_3+KBaj%l3^{CS+M*3Dr^Tm#}6shmJER4eB=6 zg$R2Fe*#R7(NHI#mqKt$;H#sE4Ig6Bg@pqVk5?$gK`5dSEsQ-_^ITqDtcto6bt&5v zuS=9@0PL(FrLso=^qbD?4jFth(1S$>c zyLj2&O=Oz@XZL`!V?MZ`05Lb_G_2jl8W6`z4u*;~o?g~WZY^j=W;w34iHwLGm&$7; zgj==-gtIk(3gXDoS#J~v?&xB&4Ly8C0Wk~U$x(q2E z2pQ4^ya^eSAK|{vRWc;RY;f!d53+*?2^zihHwZLs1zw;WVSSBe>9DOiE~et>5!NW4 zKx||aHYy>oW1Lw4SoWs-~uGUVaU38ZN z2#cdsFz8NCmEA5|1jk{1|7FB2nY!bQ^#D_+DF<QP$%0pm zV5lH)i_o3DgDyy8#TNa7X`7M?rU8Qltw>O_)m8`5mLTH};THH6)De?GShEL)PU`_w zP+tT+jyZ?cMePXvrjRzZm9 zm_8Ve>h`o4OZcm+77Hjd z7;_%8aDyL*%Yqr0Wy5D6SPRXy6jAF?1WOZb{fX6D>c5iKEm_?i9VQ#@GsIXg6&)Lt zTnl6`8#skWY)Xu=uxn*BGnMO4aazc4i+sY=(u4J?ur+zB2|hZ-gs?TzZHqjGWIl$s zGR(>JS#?x?M$>!hJu|twFgCVX*f6WxMkjmfDJ>uug$=IZjzm@ONCcSe)ob5Q?XTBw zyGH;Eq6)WAaRtB?7Qo4jIcwSEnfvD^x$? z*qm@Rl%V~LLC$aZaoT#Zj!%1f=}lp&O}qgDEGFR9vfECpYN1u^q#ifuP3zz@H?*BN z)+*dsgoR!a%X)<@^a_df3L({Xl8_d%ot``hMT7a$6==<`?R%Q(n>Us1o_dI#^<<`b7G{C#bsQ;nM>6=P*;ZIfW<4U?Ivs~JLD z2Dj4WhfT3BCQNv{!u0^vyR2rBD-nw^B4{&V)3^qc`^Ewl3k_)do2mio6efggQVN50 zjoQAoYGV@l)+SB|NVtm3=;c0oEn4l_5QS92VsO4AscRGLeS$Kt_dHV2JHiS!n^CY-fETp~toGsFnRaZm3X2Mskl~Pbio4+# z_arP56|b5Y2-?vA|MO#40DoO`)1lBwvR>VaIdWIL+tS|A^(^ z*#F=MVn2rWKX|*KkNK#cO*S?b_p}O(yn(AW>;Zc*gdX=8qh!Cm2pVVDG49YjMAj(DS`1RE_7>$z${1$JRN0;W+h>_87c8ot7yK$%u$|JP!LZ|}}vW5qdKFu#f+z8_vw1Q>co(UQN+J%J}l+-;K z3$)uA?Xl=P_AjAOFn$Hv?TmJ}cn-9C@ExO_9|&EC(e4&#_wb`I+WCiM0PP-ucIb4B zYqvkPIE;N0?P!ouAOY>@j;KH&o`3M(6v_eLC>I$4l&eBL7YFJA`*1N#=(>|pe+6hg zf*yf-bUChO0+el@LV^hx%O+D`>zFKG40JYriU(iVyf;BE-3#~1_D#}hU%nnw>|{d| z%erYmFYxU(f5iaHP9v=_2yMrQL5YnhT(QPcm_In=E9l0a7Y2##WU%$vjkFO)$-HgQ zEg(qPg7MHTq9Mp)0OI{HmauLS&-OiZiFJ#QBp80^t{e3P@?Cx+yBLLH@J=2Bg8`Nf zYo@i^qg<8?il58K*dK-GH}#-U2f{YT^NRjM!quGd7OzdfYwS<6eK!2O^b)dwk%pd+fWi$FYW^5FAYH2HFQ6Oag@~i63_RI$2j)77ucR z;FV&XIcT+oW7uxc>(%B0zMy0p7ZIN(<`3wm&~J(XU=(u4vdd$0q_na-&SXi6#ctEO z2rEY++LQbq^EbE)Tkyb?grf$VwQ(1N^#B)lb!#Jj$=mLt)Uu!mZQr zgY@Cdvjj7ZB@DzT7K>uvi(=*s>}z~qRS?yJG!b0DMKJa-dSJWPF9)JAp<rkx%aP49N4`VED|OTvGs;& zB2a~9h65B>*xcCXz$GT&22fxULX^Xe^dLa8kMX+;gYh6=zrDMd?93f8!BN`jcf;Vr z^oCu8hxLN3(U`zIEa1rhrY&K9{SVr@R#U}RTf8+PmUv80lm5_8UZt>R zC4?7n(~HIduFa5Lty-G-g7E_KB+Dm1Si=bU#GLRBSf+*GWh$6rD}oKF2||^|c7YAs z`qsDXfq)^Bu{464Vd$zajj>irP97J=4E|ul66_!9idh~^*IFhaCtk5kx~hGF=8CI* z@8A#FlqkGgs#Gr2ZV#)+Ec2KKhiaQJF~(tw?oA(;!&c9c+!ayFGxc7$3RN7nzB1U$>zL)`b<{@QgwwuS2KEf#YGr(~FNgITjI#!%6+1_M43`5;z*{cS zPq*tCh>LL!(EB7D3%AKO>0>rBMjTJNp3Upn)3_WxJP3Q?6yD8)Y)cvH;=Tjs=X97C|7zb9mAMiid+}q@Jx9sv_vQ zyYOujHYvP=NDOqbx0^7-VXWCmU!#Q`!U~#Gi5M*G`2;Jr9|2uOLGn zQ^toV0W)+2)?ccM{BmUx(Bx_JrJX$kPgixrBKkApt>tfb#(EvaRvs{3Yu}m)-0~Rs z)oRHvM=@G{g~w^R?)SnL1#e5!AA|L_@xPfB zIR(-EMtK=0eAI7L0#p!aXWdM~UI zF%XNLm>u>aSd}wb){J;io(s44Id3qWv(erH9quy`u_9anYYQ@@d&(H9`#bz@_Jx-p zj3xBTGtnshdjyL>lQ0~i8j}J1VHPlz-9PB$b*B)mHdG&%blz;AH!fZNSntt*ah?iZ zxIKv)4%2JJT@Y`*$e4V=%qH($;df+XW%ozM82j?3cq2M+(MEHI>22v#}_1Y1!^n!;>GQUv8Y@Jl~1+~5-CYH+XfnVslz@j3PZ+TqK1C|4ToNbw64>)t z*w(~$;yC*B?|OaDRP#$X0vl5i&ih`pFJT;O9vHWA=I5jr>TRN@fF(lEr_~RoFxH;k6s(D*NiPm2Tph|34T1o^%kvXa2>_y9?zK>){w*sWimM~ zkjzLBGC(p23Prg_Zx9m5IUn6H0{(?hnJ}0P_$jM=91ptKC=zAiihjXYZTS z>`&n72JdiyS+#xRg{8#rL`*Pj5Y{-%6b<3TtC?0KA`+Xj3N<$}e()}tmwfl?wNt`| z`dQT>n?-r|>b~OA>d#88ik#I+bawSGW>^0r%>v}<>R&uv{fk5kTX0-~tqki9dY=ti zW1E7oZYVb9df-2X6iDIiRP&vXS-|tKo)iY)kL07-hnggHp29=L-c!7{T3sxfV?rSL z(_tp@d4CERb1X1;s>;P;%+Q3(PmLSICKtO!#hHG&njOW5)?vnGwGQCnW<=1>RQ50` zb=0?wVb5Y`W+A*g1r1?Onk|SK%&*XufE~J+9VMX{7>$^r+F9v>lOqU@m2Z}{GsGLi zRvgIkCo{it_#vj5y-!6Qo`_K=*`Eq^FPO@@8m|?OKoT1+prT`EnoVpb6{7Nf&^P!a z*5UwqG=LNqDl7Oxd?%xT-yR=rlN=7aBPObt<3+Gc0L`p}^LAvEAI4U2LLMhi6h8O( z)53$nHQR3xTkz3-Wa72(BXnEnQ0_Rki}BDo9^`H3F+sbqM#aG*8-RNx?+)AiIsO`0 zDTD0yC>M7fje7|9{+urSoB4@3L^e1Excs@jgEc&H8Gu4EyzF!81YEeJfJH)?ph>wYmn}n*(O{Mc~5r~5MDidaSw`;C7CGd^iB*?iILGqzt)ULB8Z^F0uQ{v+qX?AY5BO_{?lY$i)-W0s;b1(W>=zka*ftoX4kkDTs#3VTLLs_w4Q>k znJ{osOwfM2Fh;l-3>Q>u3}uu*Q#1;CLLaI?N0<>tPJr&J20Ek};Q`|E$6XDx(_f=I z(=X;AV8x+$MZscW|3@#Qt;t|F#AE=E0Hb32upJWuY`72quqK2cebbuyZze=sTx7$^ zV1mx_;NXx9e-hvW56Ut@pi%eh$t~@OU#K?m99BCP7yQ=~kKVgq_ZQn4;|!v3{o)yG z0w}DOaW`NR*)U(@7+t8!4{H=0G%%PzL$n`;WPa=6x8^x8$U$2O9t56b@||b~*})Dg z{3#exVIb9FD;O91@Ww%Vylj(THez#A&~CVxB#;ip@cUs2w2uxX@h~P?ukn+nkAZgz z0~#&HkXhQlV=XYAL{^aM@M7AE9Xu0aUPw&?(a~zLJTb;RYgI7bqZnhO-4w^?N!0W% z-PhNsfp95aPnIu*4$G69W$r2IE$l5ZX&pvOQy?^%Ms$(+$rW>aet6Nbo55rAk?3{L z%SkP<6K5(EkO|3}^*F@G>InFJPf%3Y>IzE}L=jjR{V8Yz;oah^-z_oUA=kOFM7*op)ngqZ5@S4L zzRbqUXRauSY0j%Ejh~j9p7L-YERZg(s%$A0J*@kj=X?f~h#e2>si_yLydlb}zAF>o z$tCHu?O{D5ZDM+)vSn2tEyIcD58?ozq_KL>vS;^6$W}tVZ_1_8v3iWQ-29H^)a4eC zNQh^3{aN!RXFYkAHjUMjx7vzK=f=e=$J)$?tWferiPaGG5t@$XwALJ#~jI9}q`2d-d8h@eRCYSt0tnG!* z5No^4jJ2H-iM3sC1+uTN7RY`Uv9_*%ooQmF75K|n4*W&3@#>M}QIF{yvtRI#FC5;? znHI*c9K^{aP92QyMmdL{zm*0)hM=!Me+Dd5>O_4qZ7tU8yPv~ta=1IL4GIXq& z^k`bDac3N5lPP0i}l)>r$XJ?O3_p7`Wo=0G1|u6 zR=n2*P9VnE+=K3IFw}AbOtzJq8oE`*BW)u+KgQNx_>pFh;XvR#g>^k#rvxzo?le@& zjPc|FKyhusm`I@kH1JboLbQb>L}tqV)W%%WC;HV0$xeG9f(=@F+87an=+fFwrS7`# zsan)AXS85ZE8E?V((5fl=mx?`nYLZl{O&6ny_^EyJvmzQ+ zfh~-z88&Zke6l!8QN0XXJ0#o-bmpbW8Mbv=LKH7dI~UtvL2}q;pm(O&p7@hbUr(`h zK-5rWs_h9jm{V=B9XiGay1c!El@J)qXCHP`w?B0pX-EVm=wYq0A_Q*D>xA8B!(a^>(z@+o%n17zj#U%XD7I))%#5cxq~?x7OOC zwCbJNZe-aKX>69Q(L>n^vtaefu`JIv>9IKy>B@}10Vt8Ce#VEp9IeXgOQg0l{}!}g zWO;SdpaUR#s|OuI0NpDk6aLH#iqT$6>aE`bVV zgLyU!T`PiqLjFA40d4A3uP}Auz*~r9QwIpKg<9Uslm)g}+CAUaAI-!VIj2DMF4xp? zwgB0NN)>XjwI2yI7~txE1~`#gE_4l-6Y!$lw&;gC6o3=Sdy(ywmKv)~UF-nWDJakO z{-deQ=xm;=2g~y|qrQt>U0$Ag2>mu;iLF%#?>Dx}gts2;y5F_F(prf|p-F$asAX!p z%=W6*S6Tc7cXNIOVLi z)h)*X+m&uu*&K9SUTtgqPdBWYS||S5UX{BZjxPJIvpxGzwmo8)ih&VOt&QvlDY}Y>~}e`M$KW$QDGs z4%ot3#!LTrOPcYy?E`JZ{$fk2M*Vl$`u^j6i5IIz&3C)T=Px!VXWq~~wr{kqE8kzL zlWni<(??TlQQAJ7#$Nkey;@#?e;WEH1={boO>%W@(1D5z{*hhF)v?zeUEz<}x~kF4 zgSKH>pZ?|6HRzD-jE3YRn}Lx&DsWB8il4A+Qj9+lfa}|BKCu zZKu^}>`~i=KgY>~78lxPYbbD*T~U*`KO)+31d9A33CIx_oux{NrSJH8knK|3~l8blpV+FsCY zm`L;RH2;!mVA3$5F<8SlGO4ItMkIxQZF^dmuBWbF+Y)gvn)$V@L#-qEIu#m@V7z;R zJ;ZqD&Eg>Igwt5YZ81flumKA5Jt*XqEzY#>Cxn*9kHk~9YRuhO%5Dm#cF7q{XyYl{ z(}r|C90S^uGU|D2&VUTKz!_;sQbri9{~FZ)pwqT!(=@<9jWqSNt)ai!O7y z*dhcWa3E5G`Xc3CZWKV`8C#fr%nB2`?YY4iNKIQ|f}_nipZac0@BxN1SUBpU5qj_| z8@jRP&Kp5*p0RahEj@aMx72dh#v-&sVjKQn%mFTTq?2>z;Y|V{vuDLPgYfiTjG1}k=Hk_wb zvgmH_)ULej$rjy-hZh}p-nQW(Z2ssCa4o|oOT%VI88$a*)sSbLzP)emEWdV7b7I8P zD#7T&PDk zEvp2f$&W#3JVWTxJ&sUT8A1gW5GtsE(5D(gJgE|dwm1=DPlixdB?#R;RFO;a$056Y z2nbEq5E@yA(1r>KZ74@bcg{IvJgpLp@|+m4C&OrDMU1}o%^P(ToGGSqI&IWZ>J=9j zEA*lCngIbmTBv3AC2td@Wk9K?FXd+F!*m6kDB+WcNJ_dLGW*cF@AcH67oi@=Ju{Ez6F@%9>_NGimfU>YN9sm z+nk5Rb!YHV-I5YW4cxtbZST9dBxU|yg|a}N=2sY(`4z_H zmUCQqS|#H$Z6~FCSH6@=4^?Dm(XH#Cso-jI>hmEqr_}Zu-j|!shLZIL*jsP_yUY?m zinnJq8h3+vu*~*99f7U9$NEljbeN}5ne*H94_Y^*{9pXSsO3+#RADCh|7NSHn^}d< zUof+y)%u;8aUO+Zbz0KspKZfIjPM+@s!+l&34zq?rtNin&%bGF#d4oK%yLh@?bQ&z zK5s=(|6gox2(z^!v#U^YJ?}7lN5q$wWPX79=4hYhIH7HQV5`l*RH!uj4zguy*|IBv zkfVLdc?^VHEn99S5aw#1<~|0(JT2S2N+8VFKF$Ag2z)m_@t7%8$fi*7?|cfKDVsu* zD@>uudZkr_>9eW|)?=`l#<0oKu*oUI=7bZQ6BV#oBT&)x+M!`AsS;#%BT8*F z+*>Jk~oVe^L$3=Kcb0^P}I!sTs1+Z#a5RQCj z_2VC|p3jofgB1^E0B`o?wNtitm9X$-f6@=Lc2I^p zG|kZ+Ed0j7ihG=}*^%HSt`j)1i@?jbdj`@2Z*ipV0@TV{_YR=M9Z$N`Y#)&Yz9i2h{iA^Op&1OwOREJe<;fU$K#yb#kiOH8{q&>?bZ4GHHfI zv_s^Q+7{BBVvA_wsP1u7KhBJT3BXGf>Mz#yI5i;_@}Dn_Bsd8 zo>a-~&f2BTFZN_hZHqRpx&;PGxnOJIkOReS9%x`mt`DL?KGXjNgIYT3IHlJsj`hL| zGmyh&h*mWo9#jX0i4k-kr>lye2*N_zT}^xfo7ycrbfl$I3=83) zfs)fp0v)TWi){?ZbHBFOUzkU)*~BE4bx3WWK*v!VIu}lSJScWdL5!y-M~MZx^Ka5W zBnXr($s&BJk>hiqUNjK7qRy{AiCL}u|T8ogTt*4UuVl2(G ziwQyw4Q(U7ij{-lqj8wEJ>x~ye5Al#y{uPHY=fswOxWe|VjEqWnQ~tcBfNiD9*G6l z756MpDtXz=qpzQPL3~9&SoO*-no%8*?Yp%VJrU+U=Vml+VeP)I<3ZLJM2J5VL<H={el!c3E!i6Irj!kW;&SxH#1uTVjf$fCHr ztBB(q`y2<6QWwh*!Hi?ZhL|6g*-`#B?}juiSxlj)oe zf&Mpr?JE1fRbL-`Y+wJ4$$jlp^M9+uU7-I>hr7!D@6zG7nv2MR}M{3!P%~WJ~K&VUZ-jX43vLUzM<^Y=AUaaOd z#+3*qJ(hS5iN;Kx2tO%%0x9xE(eA!_L={U0CA}y8Fb2O8%pKsS%hbr4yE883?e zzH<;+I*PT0HPo=981A*?H)jPtWfeT<$(@9&flw#f(UDhVE~}`ir{+4E@hW12qC%mo zlSChN!gNcbA^1)CokZFF)N*&U<(p38RwN6JETOcavlxwc|BD9#Xt+7PIU#yh6-w-K z$4u>B5@+I2O1@#VQGE29CW`DLS}GiAh|Wb%bpbj23aJhJ!eC#Z5v?pzy6((IM^+ax zN6=**%eGGs5h8s&cu=XVV;Y(GvUg}8bHfP}8KkJQW^x(Bm}4}tn^@h*b9JDN-Nd@W zXu8%-?C8U?G20zbvlpmccaZb<>7(wVRhUR~x{I~Iq0i3nh!z6qbaycrbVhFD`ax57 zTu!Fq>b{2TobA;G3r#wx>!usIml9IS$lRDe1O-dm3w*{L)h?gilYg$R6Q!y|vn{gg-u~ds^@;6TE>)0%_jM8VPycr`z((nDm zIl3*o|9Yr4>;^h__i=P~@2+g9X7@*{@*V?bJ_D1dfyu8FjNjYt9cl7H-)_2TkAXFr z!8);*qcp2hSOqh6PFQJ=fpr%oznZ4O8dE8(O{-n7uI&2juDZlvmG0(v-P~1KR}D-> zSDkzem=g@lEDcO?rC{9Sfl}r#(XDltPLR+!rKCr;4Lo6kN)^WVm9l#}^XFUSVhcqLNr-;HMS2##s3D?CB|x1-~X zg=IBF`LYVeYZdG`LDJi(fPb!}f-PDFj+O6-u|{3#C`y?6O(d;s+`?$oE~~V&iC;*4 zx8`wff9tYpe)zIlQZFVzhud#-lNRHIdyXYdTGSILX1F*KoY+^Jwy5toJzQKZAPiqS zwZ#N1m9uJ#r`hKIMirR5KGR}7RU09$(1GuhzS{zcO|Z$`=wkkCyc$Mny;}H#0|d5f zaD=L{fc_X-yclAe-Ii$Bl)hy&I>jsLfgvH8n=HO29&5!iop!FVgoZl>EzX!J<)cu* zAyhLuMIjkSpA5vA=WU^*yDdiHQ`+&JcWAg%DB?UX%L_yHRn)shHKSAZmHNS^IC}bf zZx3N3B@bv9>XLtz^Iq6afa^ZEO&sm$brz$MvzT6_qOXk3n%g3kzS(0b<32efG?dqS z)7k9ki{3_~OU$*-VncB5UIS6DQ_AHGYEWKogR|Vqf$fY&m#pQYw++$AZ|p@UIYlkZ zu1Mn*Iq{wEESED{G#WKoKz7k?5$}3=;Q^jRssnX9nX%!I);-x-cf0-QD~*YqojToyy01G>_X$e<0VAZblGUh3 zOG6`o_jJyGFzcOa0qUos4Qc_yH=tIhT7dP@a!}pn<&JK!7`-(8-B`UEOGQ6;Tj>E3 zg=;kYNAFN0|JH&0$AX|qCUy1iA=$kru=piy$BJIVb08FDF@gkjJb#1vu9^l$cs*S; zyj=lvv7XL~w`n{L7k@R6zcFjJ3;Zn*Z?kwlX0vvir!iUk7XHSR1Pb{ZlVIobd^mWx zb+osiHx(bYG^Fo)B)kXQQhu<;;F11=b)s(859Hso#XwLa>DR2^RQULE!X)9+pL}Bl z?_P9$EXt4RPk|ZY29!RWAy#9G5gCm`nPNoB(wIm}RC^hy))es_UH~A|&>{lL?)8%@@B{>s7JRX}0iYJMpril`V zY0_Y(OasjIr01#xuntsL5{;QAb})<=z}ZTkD)yiz(?yRzh5&-cBu@7-*eTOF>}Au% zcr@hfbTO=3*2RQ-ZhF`+>*3^99aHuTL?66$IPGG=pVeq!X7dj(zuJ64XeKSNfMz!5 zsTN<@?N(dwR-c0^ygkYqH(y)ht{!w#H;;`5Ir|a~?`99C%aX~*`lOtGHsM-NI!yd6N6Nk;Dg1f$Zr5bhCvKFOjNbfr|KN3c5zAT;UVS>jOLPft+M z?I#my@`t6dWF7Fki4x~{Ri#o-vyUFVMx$nn&#+jq2WN{B4YXLWIRcyCJec>a^4Bc( z`u#a0*EKoAez-Su`<6YwIY&`*#HVrQbe|)pV2xJPwCu3Q9)E{-$mf)b)_bYG$!Ipi^QjdFKEglu`c3e8xSWXHBZF7a*?R; zrtNZ5=kC>-7M_P?b@D5N}41r-H0Qq4Z#x7#p0x7mQA2GiydU_%X}Gx^-OB@G~yDc|z+;Urlra zzx1pm7u^7)(@8zTW-Sw+AnS6`gZI{F|zaT0vBm*GTBS2!WeDu*y-MFkvYa|n$z2(UHOAaKvx8V*-o z5N4M{NL(q_E$h}f3<9OCbarb~N^Rp8Ky8+ZHA0-uqP2dVQ(pf1O0iy9`D|W3As@WA zj?^|^Y{C01yFB;2e6gP0)n_>zU*?LLQAL{XA2eC>!R#7`J#Gj+K3PM85?6_y9Ar*8 z$j+-OAdt%un6XNXG_rZI-;GrNf&eQiVAE7Hh4aTMlG*tl{esfKQD(AD@*-3ruaEg~7V;2k@ z<03ao7&0N0uCIZ3k9E}i^5QkuLaefvx~vuBAWbl+CnzOjYp{4`W09Mxv$(;onNz_q z^?k@94SsX^Bw|KsJJ*VndZ4~4Fg8$31f&csC zMnHU+^&1k8Pw<vNz*Am`O)Ai!Zo$f>Ev~ z-6(~M4a(Q1?ps8U7GUye6Wc{XxIz+wzOlToVyqrwa+j+mxtPk$KnJ;)%17-#yHnv7 z(E{8`w&3{ufbO!#dybH;;#vfgbrft9y>AW0A@iKn)9uiuNpN_f*L?gqe(LwQJ0pM@^x;=o- zzZvQWxFv_g7-2A_9Y_fA^wIj$(!~*5Aa)mMieC%(_c$yjgZ6S>>0SI&Sc&sJ-3|1{ z{lj8215W!C9$5S8-38&0-MvIrkBV{L z$Im$lt-FgU=_pR|97;PXir&BNG+7N?z-KBGJ03nN4gl_{KhzGO7YfDh*c6yl(%;=H zAbSI<38XIyoz>ukcUALqp%`B#(Lk(J%;@+cu_|V?bFeWJv=s_!k4q2|LB?T5$G=o3 z*c;Q8w^Fe5rR4Ft5QD%*KlYn%taP+U3^!do7p(?kCYKh8tuf==RWqeuj0^~H1`t#~ zIT*wA=kURgk}pOE(g(+Ia6)jQCO#MCt5Y+VT2(Xu?yr46ehhrhW%T1Q(GE4aa(Y)o zQCFrWSB@;lNSL2xrI;T_BNF9t(F46ScK<~-AKR)m7!UeAT6tWQytCK9iv;i05OT>p z{Y}S%F#PETJD*O^Q_fq@)pX1_A=VOLfLSu-+YtKt3-L9>2AwL9bW)6Pqs|)Ot#8CP*lOwj9R&T!RQjE`9Rmt3Zn}3(utdk@mi;9lJ|ILJT(x-xs&ZoQumF)FW4Pj(B>!U0e;=sEH$Phzu+dem)a%BbA*d@EkW*YfZnkOJf+J4 zH24X5vT!D|jx6Ia@FM^IwIOP|Exv`q?fOb1;Q%tRu53jgrPP&UvG7)Im%@CuAm*^f zm(9CIS68*1Muq*PHjehciKCc-ZKKa68^-rYf9ZXnEqPvQv4=XN#Ax{sUH)9E8uPBp zbUY#+#jL(xjN5S&St! z#oGOXXv-jJ9iV&dlZtV0_ZgE#EKoHaeCDsy{EKRXQm~$e<#f^n&|@ zDWyPSM}sF&Qu-A-nZnj zceXp=*wP{watIyNurlgM+dI^e+bQ);DMW|o4ujOt$hve!Nv6A03*51BhoqJWlHK?% z$*Q|AP|vrdp7fKu)XuQNtj5p~b9Ja4y)A`$y1^0{mj=rUQs0(_({D!UOX0qw$b^y7 zZP`vo<0TtieOHPWh!4- zkF*m?q1NM47qBIaAoh2D)h^JW&QDLE`$MHKuprE4DG_tCompCl5!~{T6sBiihkPN8 zVoRv^FwCJWN5(Lzo`BrFzmmR1mCMrj2w%p7Ua2B2WF1zNF1<)S1EgTAkVYR%?SRC% zkEK}lX~oCVJQ^1$`Cu{j93g$carvBb;c#ECmX0J#m^7Wnj+Fd_Vf5KZsgSLzJ(Lk5 zAqekT=@=?ZpBfuLt;R~#X#6P26A6VOQXX2?bhPvV(C&F&3fG+(!vM_(jF@7n5XhDm zOFtm%kO;I8YP=Dc`uAz}H&Q2tCPGn1N*3Un6Dd6pTvv^g;_%rVCCvnuL&i(*MX?@p zMKJJZ9=&+bYb-N&b;EdS8ZAxK4^zLUlG|{Lv3P>C8C7P-@G9F);#E$bBz;2dVkI*$ z?HMaEj@RtTz;ym(R(d!!$ly(GnIRSGbZ%618EyyUDHxU{YEq3sa15&^y(R#=71KC& z=~tvZR9FKYnNMeHNZkPN!E`BHpEfOlA~U5cz`&EFXE2^^NLqrg3AIsO+BABhwltd! z=at%+Kv|Axo79*MXY6MjUGJG3-8R}|!c3`F@QPhV_0VjvtYo(<%#UdjCg8X0X!$HD zj;_v>e1#kI`%K_8hN5Rljev01SyGcqOO0``Qg#$Li^9T~%-K>S>>Lj$rQPsg$3z8< zLBIR|Dh)zhNolt(?Fw5%t+0H~XG@W2``v6Q3Crh&94XQ`+lVn4Nf{?E1k%<7X{71C zfP_!r#?k9~fTPB3I@ANAXD(9l0;#n- znbb)F`6v4Z&`0&99^k2*t}kT(@qrDb&Op4$1F4s8|1FB`voP9M^J}H<2Ls9SA|*d1 z#RSd5J9ojT=9RtW(+&3z!hN=C32tuc{99m;NI?<2UVTPcZMoDI=VA`U&y*vn+X`tgM&Zy3sSf7qgB4Pop$o2SwCYCB z5Nf;E6J<}w3}_D93jau{ROEBtLk`L7?xs_X(ye;uU1LYXZUy_NlJ9D zc}{;X!1~0!7{P)!bPHZ}{8blQ7uHX8S%Thjj#_uZZhDT!c9MF7lCs9gG3b=U7>!t9 zzd-oKaGGIIXDQ55k!CpL#t64>FV%A#?kwG6_;4ENLeW2>fe19vcBsR9#Siv-i?k{g(vITU&g#99HaBUdBy1p!6fV{$#^;@ z_rz=$t~yG4OTz^4kvTPWR->l&Y1Gu&3e?m-jhebrDK&Mr5^Cz~KcS`^pr(%fUqb4C zfRH-Q2`T8K^mt2J_%I1oO<3Uo>C{osjn+Bhk4UvEr<)LmiP25hD$q@R|BEEkaZWM; zB@%q3)%5;Qeri8LIqB83FX-M-P<)jUPC9(__mf8d9lGfPx~4E)>JK%2PAnbg#1ayh ze=OzykxYUs*^}|)A0|!v=XBC%6hE3brUJ2~-*AS5oA+1L66=gP-$<_mM@}Ri=R^`q z^^1}wGN=Ym$W^fA8!Q^h6#W+@)3oAvN{p5!Jf3En`Y^eqPrJZN4*PrbQUifLoCYfA zxJERMrlM(5(ZlqTZrLS@$ds;P6#qyr>6cxKr?$1FS^qoIO9Xl;pA2)P?!stC${gtl z7r9eLFCEwDrE8VaOETr>NS#fib>&18foSSTN9UALUJnya$B7e82PzOwy&j^O8q(o; zQsAEwPAR~1(tO+o{*+w0O1TR`E*)p&QfrET0DAD+|KT*#K81DKHtSSPRHzQ_rIJdJCD zRB%mJYLq}blFm!DXy9qdvjXeHpyn_8UqKUa=n1$wFfNLIR{rA&0}L71C(Dv#0zJ2w9X zZLnkW|1W5Rtq$;0KpPa0#!Jc4cqw@rZSa#u8)QGsOL5W$TPrYBD$oWRBqwc0V zG}_>>MjODWe4g~rXamfB2ly#%1zp}$jhB-35HF=GB0)h4mFq!g>PwShdRa~){Pce^ ziSWKabM$g+oRHwHw4^5t@+)}f#KMigK`dnduVAcXKg3u8>Ci}^S>AGkKcgQU=|1w~ zc`rMCenx4iJ_>=4GT4!7mEYH4i@ATQQ5Zc{w}B5?s>=I>QFOAZ zJPwcKGmRS1tZK3sR(npD5ZBy5FJgFJusWOgWv1g zdtqPjAN^F>3sP%D&7{&Xje;KHK{}eM@^T#{b61~5>ryDRnLPAi$y|0bxq@U4(K9qT zj*m++=ffm(CC%h`!^epCKx)h2NKdY)$W4_RHkZ?369v<$&|z@p^34%L<|T7OvOFil z@d!mcCo_3nz2{^muj~Ju%mi{?lris_0P@`$XmwIzYdMsRt>t*9Ft1T-`5Pw8yP@wKZK){CL+%ht9SOzF{DF(T zhI6fJOPOqshh1Sh=zk^K^Qcs|=hVeTStbjFU1BX=zp}tL+|3mKU={oY1Se26O>Vl< zMz%SHe-!zG%%p$KUyxhkUOVvxuveWM(+*Xc)5MXdyxuJ2!Vt4hx zVp^#s9d0Yf#m)N4p#Hie$m$-U%{6$OkLAh;0jf^b;q=NN|8{a0VKSBU4~(kfp{X4@ zg`7Ysjt;%0hEd`sz57cZYE@PgJyTVi!ibyAr_W=0rWz}yf$X4GD=X?O3u&h%N#;_| z+DT{xlX`xc?|3aq-fF;VsEN2jF9uNKj&gG$+3|5l%rxP5n$Stk5PqYW&hlzZ6p{ST zPYI$QI?ItllEe6t+|M0(2ltR)5QOfItvzMjD>3bQ%LDPq?k&rB9PZ60>!seZ2*!UM zil6>rAlXu6A1vbfDGx1T<}2cp6q(t3uS=1cy|+oN4+(lbX7BANO_7rXVT40{1xt?K z5YorXwTb>CM@NEQcuH%pQ?1iOZOD7y&oY#X{sa8(P|T}xxDmvTNo`CSZ>#X^Jwf)O ztDcgX`oAhaB8FZ5D)y3hspwTXz?;j`2Otb2B(K+Bm6_x#!%YL$y^kD^ z)=uanLz$O~`k;qq(zQMiHVmcCedSo=2$p*foqtyjBkC(J0CTHJKe-#oVUxPgslXQy zZZ%cdstVHLX?;JLaTzDPCNptf;cGGz=MC*IhwItbto||=&stvxT3L?vughGXH)(+U z1BUAu#lIs%Pjw(VEQvM^l)uNE&K)EV5WXVwU^yA6^&Sj?!U+0!u*|rPb%w}k9HH{i z>p+MHkb<~VP_stHQ_&EaaSPv0m6@xD{yQzNX1L*a49tMwWxe}P{6MMLDuJ8~=y_)zvl(y!F@T{)UEKg0x| zLtY=r!yptkA@-3r=O7d|RS*gnOk&`NTeR4GaJI#nqn2S*cbLp&+P~9{;TV_5;WCqH zUmwmo%@Lm_L&Q6jK1=5#vL#(+H+->Umqs)&H7Z1qmyG~CiMM&j2vg=3t$TEoQcN7;Ul0m|5UC_{OhAa{EPBT z{JWp!97C5sl^Yq7)J%b5$Erb&rem=qV0E_{Cu7A3^fo10xToAJV2xlusARupl2;&f|b&FWgfjGilx^%x~USCH2*SGHT6 z+19Y{ZZ_8v~t%|+*L^$yCMFPjpa1^ctGXwVnXDzNJK zZ)p5H^xK02Z!llB=~*p@KkpnuAI_J}`epbvVZL0yu`53hGo&J!tEusjQE*ghb&u6E zXQgGitX`>z@(yRdENkWh`6&*!@d7y_#F>W$P{JQmcJt)54_Y9n@Lb0h$Vw%-ym+pV zg>nsFCkSVs4FB9StcJI$cdmMC^wt~$el(SHlcuhwa$|2#bEgB-c zSz5p@9mji-{4~#}E|RNyuu)a<9}QT9ZG_+48aqxe0-5NOHOr{Z)vHJM8K8=1U(5-9 z=kh2c_}w*vzYUayX0M~v#d5svV}Xvmc{bR8?84HUcZS{S|XX{SIMutfI4 zq2o?PJwrn&X=QB3gXx>4au^_Z zQS6)nK@_k|?!a+f=)(2QWgJ%@t;5RH1}otD%y;)&+LLP-8*pIL(jC86IX)l?m}t|R4Y?g%5!)_9Il2$LZ+4v#41EO%9o!KzNDr3e95UFRSBda{=E%! zE?@48;fSF0;Z=g6{?#c2TE&rkiZN``R`I)56y<-~sk~h+sqt#uA#wVx<|C4^n&(1{ zM7c>w_T(;h0lNCD`2fX|n$aVWBG$;gcuTgqS~6-4Z;6xON7N+kzUZ$0WlO%#Wi6>q z?rUXB^1!<4XA{s_agaxEXGn&f|DPypRuE3>FM;yT>%l4!*`J~X!M zoypaN`re|e)vCx-0_g69PE{~uQrQQIiXQB%>X^D-o-V*Xa#df?AbNU({33wG&V;u# z7DQ+H1`wLK4P@O9rl5^-4fDahI&K~(Sq)T(vk^ycQsyRpS%}z#r3U)1 zn`bcnXOsLJt_r<2nz_ai|#kp!lo;8%co(UaO`|F3<{ZDsj%;J z&Imi$sz6xWrIrpQrI#a43z3Jpfk<8m~rcL52Lto;oy= zMr;M2D~YyjMT>KT`BSPque!C%%M)<6jR6VS=x~q zY$AEPyb^dIpb>oSlzHh+y&JR0pbC};w9~pgP?vRpdWTo(gV~<33sa(5aK) z<%@Z)p1e!88OG_MFqB#+v^`mNYdnSByyuJi91Wr&O+({oAkwjfjTGA#Zu=(emgQC~flEi9P@TZIMkPOnWN*LWiRcUj92|Zl2hxagC z0+u_69=4|ENT-9p(|hH^@N?!yCDR*(Qle}$(7t`RG$qsdqqjrAfsG~?H9I7SqVx2W{C(dbdh3u}O?P1oeRfEeteapn zQ*qw~&@#Rcn27GAjtGt>YxWEi16-Zr3*@St6~uQW4*ksnITZ6U#_ktF^9tk_b;}RY z?E<;FaGs(M%gmaY8Pnu0xKZOD^4xQtzJ+B)gHG04gZCx#OHQHBz? zctH|;=Q~mICI44CK7`Uqj;bZQsq)PP;J3C44- zKm^?0K52Jgh_*+ydlQRe&N(c_@o<gGe*eo@?}KHo32$ZdkU;fxXcMZ(Qv zVZJ)`SA<<-J`oLUNj%+)yAC{GjOBS@jh)(j-~0)hWCQJySc2UJJ_okrT+f+Wx4+|j z3GSbMpG@&k8>=^qVQc}1m#~HO`!;}{|5o;~zU!KEkCIQY40l(@d`s_qE5}7@Z=x&Zot(S&@d_HF^f@Pi9{mri{xAb_$i z$O_+?L0r|QiS7eUwDPLl(z)F-A67TA&%p_(r=oakU19`z1#UMeE;{s`lTZY)6++j) zu1k=6?4WT!$Ybyb{1FVEWZL?p z{E1<)UagXy^mzVDMLApmLRwF`3uoR_L7w znwW9zNng)$;!TaD!i;Odv|~$4f0T=IQ8A7k*W_1Oi))n1vkg0#m4~`^1cI2C%2P4* zhTM>!HM2(j?4}-EiaQ(*sGT<;;^|12T%RTgWuKnvw-6_w?MFfae7;R)_>eD?y6Nizl2jmfT@t+Xd6ItZll7ZbpEy+8Mpig_K{T> zul22OxYeTqhY=R-QFm|%bfkKBoXv!b1!prIqwj!2gej5wJ4iGv#{GBY)qH$U2+r{x zb&rp4y@~_J>2E&1Ik@kt7nab0dm!gNrn~p}+2o-%ApfgXtJ2f=LGrbyIrn8|2+)uU zf4u%A2Br}o80PUJ@&TtyvmbD(`tk!=6_TdQ3WOf(Qj~rSvx9>2uHc=d?sRhEEO3r1 zBZiP(5ph+UqF3eu?I#TiBjW}c6sAHw(V(z{F5jR$<VZFI)Ql5(Mp!4NEs2Msw7cSM?2Dl|i2FWPJ)9|T zqSRIKHR$Y|coS@ll!h>&m5oX)<2ZvX?1a1plwec>X`oT@G;QAyqe?Je{K%+Oh1FrM zQHk?D@mq`<&2t{*IeiMbr7~EK;g)>5hAgJM#a4tF=|mwWbVEKRnUr`qVN5qEfgvs@ zj4n6+z?T~+9tm4ur2>-@g3u->oQ-pyk64zPF*G*S4@mGpXTC>O@c@_7L;Xr?8uj#0 z`WV{7YDU|_&Uq+|IVgB4&B5|J<;Jds6?QJK(@vx@<^`S#yVRy9^n<|kqnkB-&uZV; z4e>09JGN{2e)YP=?5UnB|8kDfr2&DI=cU*&mCkFwu6glV{k@e2?kn=#aU`_$R-$~) z9@RV7#5Zn~e5bW@5l-}0LSaAdp?(YF-pn^1miN)lx|?5d#QP{ZrdwYL8IQ>ImYrr= zwYz#!1OLGR#U0lVYy2D7zsrzH;vQF?c-iSFA!2mE5UU)3NpZ^X&!4i~wbj zfK@AtN>zs#q&zL?=6cYo!tQ}IJXl$+8xi5C6Qa}0-UZHrpRA&y1KqSmfB7R?ZpId4;DUTbD-9-G%%3u943kzhtXd|qqjT{OFCYehE> z43Va-qst7%y)_cj>M|4;=C=-|%bVWvBHzWWeS~ooKfg6|Mw&FgH8Vv|e!r`N#I*Oj zvc!y<3QH_VY|ZV{J(+zvT)`}8T_33lOIo+Y?8;csIuZuEPX0%km(+3taxbTKaWhDL zuu2m?=vtM2S6f#>S@ScknXRt>Qas*s#MD-Nb;3~x#toJct|6N*X+!pstiUjLsv})d z_6fR^3+VZHJ{(`*q5Bxdxe3Z!2E$w!##3okCE7DU^Q3Npam!O7LDZ$tyOyI#J!P5@ znl|6g+>l48c(Hga{1vYMRGs8JlZms!W&}p6E$h5SdB+n ziZ0WyK_I=`5craT3g2lMNS`&tjx=h$2_LC&q$QBHBLQc@p@xcrD7n8iR3eQhJiuv% z-S(}}AmeyA+g62a^>U2Ri-t6Mxhgds(9KHYcQtr|yc;VZ$!}4{m->C(GN(WGf2>t}eKx*&^jPQJ&Os zY8P(NnV;y9Ka-HC^bv+R`XwsQ7|^(q?ad$2KSz^`=cx!sbaN$Kr<+ww4O=J? zx~yW#+39l;EaIjum9=;@+2s?9*1?O^E}x+|xo+(L6``DK>wN0#0@b|YV~ptw_VD~- z+R{oH;{~2?EP|n{fae$C9YL=>ub92(BO56BHONo?KR#cLuJ87dLtN}(L#sG_1Pl4p z4(v;m`|)|Desw1PaT1Y6CTZgCcJVz+1BDv_-YB_bE_6>){Jn$9IHBcyVu1RfwNf?S zS;Wa4cK#}34nO=GQ>>T{w^l^f5x=!oYUpx`>Gi!n^(tM>W?2bHB-O{sB^ zd4mazPiOY};NAmGlr~Cquro^q9J3j>HI#drtN)%`v; zmbb92Qq9DM3WJ%s0WOIn+9?4b9$*L$yLR7teP~HLr5M|9>YadKYSFn-GaB+7oaB|B zXyi-FIyZWbw%v^M!FT^2!-HvXvf{w|&ZI`c)TBLs@BM3JFm1mZ(2Ux>sJw}fvA+V) zgnLMc>cA5+Iw*&c-m4>fWT*FFE)zcgHs(1R_#hybR$h;Mj;?i5SREw~P&BkOvKd|P z*eI4hxQVx!^`m^4EotIXk02Vp)7wV*b)&+mus9}`TGcx0O+&tFWXZf9=|w|o9rdH_ zzX$lyYYn0pxP;C?^Uzm~R65cisw&w}Hi}>wv%7fN1V4DW#mWHST)9esV@MbD3XYLX z`;?B9meR=VxYSjdAPDUp?{rr-3sGaV-j4HW9&7T}C32P~JdBup-PDoAjp#8lSE7W|v zRHxrWEDf)RC|idi1;?oWtTG(pJWwwN_r;f$2ZkQaeGSyPmy$rEUr|zp9*#S&C?3F^ zbgwGY@yL2r$;Y|fst=CF_VjfhWfvZ^`zq^k1a#=9G-jtrKZPA8r}`9vJWS*Oh2=R7PuXQgU8bMBi!K+*L^} z{6Pz0aq@N0g})bbR~TzS0K6Q2zs^ zhhe-PvJZ8v5=6^CP@q=oxch-ppfh~x1zjkf+$>!Qr8^%fTVSEMewgw$|7I@xwhPG~ zA1kt;8{_4uKSFs$5ON(eM=DV)fi``jY{l>QMkyy@M&U>v!w%o8^z>L95?38Rk5v+M ztXz!=%0iz1$V6ogOBgW;|-zW7rpw)r3gOZhfTpj zzVZNLd#;?KM3@%sk7P6}6-`k%^Yh9Sgnq#e1)0|C#doULu!*mWP zVY(9GeQXN{1gzn!uedR1;|!XvFrR3?&?@qOu4y1;Pgi8#9dHolf^iBkY7SAIZpEDP zD}R-{6=O!q>dG>}^%#@@ALbU&)dO@kQ;DY!GZjzFuu++~n&{|QrqT?*LP%*RBsuz$ z;-`aRQzP@&&a%|DK&Bqq+>IArlu5oFgS#M znyD~fe!jDm7U8TXck0wnHuzhD`8%rYgZnfWe8==Qlh*Ue8T4iGVUV( zSxO-H73V0Lr34vK?TsEu@aQ%d;57puhkc&XPj8w6Z7CM9bIw9shDk#moCCXsKb{+U@F)NfXs=HK4#z#`S!xvlp3dMuw zE>&JfDf2RAAj@YY|7FORwM^;Cewwsme#@0N*iR4b=bYurM<^4y0(U8-dTFV0oA)BY<99r7RP=WUf{uq*<7tBAi;S#-@--sjHQ~ zNUWl%q?WGcbokxX&Z7_mcK51w6t-TY#F*&16_)D`N?pT`%&BV>HIf~f-x}4DYdl}9 zpIYYZ*6K&;@3sxp{dkRxYjJcGQT4To0_{3KC>$o=5xI8V;I+8>ReHD0(|u;*7h89C zHEpXxDdAOEOd3r_wNZKhv4ys*`4@%O=KPC7rJ4Vt(6R~tqR{*if4k6L9q&E8JD54K zO|5Rc)FsyeE*d89%L(2b9V38p#Xh>mNix4olB5zpOgJ;>8a#P>wigZye_og2U&8Qcq}B2* z3k%bt3aLzP3z8EaDDdlz`z>{a+uI}TnzuK&g<$eU#4!aL?kA3I=tj1oTlVTzx=}4E zfM$H5BK?+EF;q_QIMz$7irw_kWLUj&- z1zZcI6<;cOx|7@KrLUA)$tSnB$Ju|y$ z7gKetK9__HV2i#|!h?XYQxB*@=FF2ypbrCwGY6uA(VhD%mrIoOh=AA}o zuBM{X%FDuDN8K~Z9f3Kx*jeyvD782Ta&IKOW9^TpyT#YMsC41|Cn@PmZ|}^6H@)c7 z^GZ!WRS<@QUFBvu6CCGed4qnF+thL7pU27M^9v>h#z$v0S>`#Km4HnYzJDB7J&J>S zdz_=pwh4XLQn!EHi?sb41;JLNgBEP?8`~jQ&aKNiDxuBC$j7OvnpyeE2<%3;dXKQE7ok zqKCbMCr)tqu|jZQn(bkiz$zSaNg0m1N-yDD(j@j!E&Ty^qn9bc>&p;o_k-evr6PQ> z;}JGW?y2WHI;8Gxd>9HPKZ3(~kP>bw4XEK|r9A?b`@b89D{SE{C03XJJ4N}}YofMQ ze)dr6;bR|+T`|3J{b=aBxFNb*?zgXn(26Tc)e0saEIi-2D+<#NPc85Wp<%vu#ERyD z;54!)w^tk7Cs%_lxQo@DI)B&8RCo=N0B~%h_JmR4SG$AsIky$42ksHIx<7VSi&%81 zH6hjf$2PU4oV$vZGD<=HH+HOK4_Kh_F5b$znE9RBVYGLl5dlrBkl|-#KN1fA?CRle zy0t%6=vtXdt!=Ed^^y`nreBnhf7{b-9e01h-5Z$jp5DrOdhElUJpbZ$jF<>pHB8wi}!&SaLrQTQG^lIF3na7xtm+3554+Qr=s`w4BiKWQaWj)es5lQ6?B1pacdRP&(3&pT+vB7> zA=qugJCyX}=s*h4*;BEf_-PP5DdnXnVyN_qQVVU>*#p>~qO&vWA%Cd*)d-+kdV4f} zA)foQ2=~}sZ?_`LM|%4c2pO0Qubm;8vOR>(>FojLnHfg)gicML%Wfbq(F46*avwQ^ zsY1mY>`WCZ$zTurBP&3&`FYs^7nU#<8A?ZP;2Jf;xsV)KNcGtcRdM~~efi&5KZNzu z1&;LWn}CG>E!-9AsI;u{dzl&A3F=5)NEX zh1)F*tVIJ`J;JW(%w~t#ThZ(YJBtTVMH>w`Gv~K#4>f@A9tKECcShKs0PcaLh69*) zq&-A;R8Q$Il?GH%6JJ+Lmz%hnC3xKGrRCHr5_`jV^1I$Ah`tE1KjX>m@<2%@(cMVi zf{-ZQTV0~;qTiJ<`m(|o#^~w!NPAUUA7!tHKEC?@u=k#UQB>dmFtgc`o=xw`CWIse z!W25vMrl$LgwRAlDT)XID@sWOM5zf%4$_h+N)-rg0VxShP#{D^MJWkQL`p)D4$tS_ zncal)<>!m%<^R>}&fI$Lx#ygF?kSPtVDuYK7-t9#j}o(CbP>(r7)jn?Vxn7=bBvv% z0hMBeEfZ6smjV%>PKY&oX=Kt>wQ=XyzAr|Uyr)eu^5h#PDElW* zAxkWWM(@K8okT}Fn3Eom-$W-9#1Jrn2WC`HC9;obfd`&S~NY72_93_N$us&wm{n)BeNlg*)OE=M_nqnwq z>;;3+RCy4xUpw(Gc(0}b)DZ8N$~Jo@iODAWET%D@k|ai2GBiA+l}TEYsaDUInO{r- zm3ubwraraAW!O{PVtcDgdzQ3jz!|p?ZgQVln-hW_3p&B{F6R#q#`Kfie*4C(#;A+e zMNspt*P8$^y*H6qHf&@h)Z76DM#>-PDSd zP_osB6a<^b`dq$(Eysu%{^Z?Q97Ol(i_8bxjm9+=TTqsG+0666_%2IpNQcDB%)>jo zfruFTxvL9B*unnMKumPMJS&JL<1{nZ?N(`_RHLETf=}hHV=CzlMP_TKi+WF+#q7VZ zZuP`)I@nP3hC$ZxhN5OH>`P@ir(tE@NPH6$@FT|ra0Y9{#|n21H*WQL30^ zKu*Sms+efFzMJ-{;y7fNw6}X+94jz0gpxfoqC7Q!Xw3|PDqawyo)Kg9f0`b^R*$nO z-SnV_M%gQ`)?s>3boApu`}9^~U%`-vNa3x;CM;}2VjB@5lc`r5u>$k&(3Wqi>1{=r zui1;*iV;>J)owGHdos(q(PncSTrbP5yXw)?TT#pHuSih*^ta>`Og2(Ki`koM^%je; zgNo0`2h-eF17ian2$1svC16pk(MtV}lzS?On5~P@FqH(CEIRr(vEu zwXiM;;zemiU(wx&QV3$8mkM`znc1=9U(PFHIBOa@H|?K~S7iBjkZH#RHn=hU#C^glDl0iAQ^va9-jx1fM4jBRFUJb5wDvU-mwVbB ze8@m?B(yXmPg`42>HSjgoR2g8?3V|Mr`d7h=fRN5QtiSJ(VK;!u)YBjv^mpN-D6N! z7i)UGes2KJ(rNq~VhqkM`EO|4Xv-U7eJsz_H^ewRf`>vVfEon0Ik|_BH?;x%Iocx8 z=Ak(Kx9%_ALl@5vz^Mwz53km1ufvt=RWt{W_|upDtv;FvXVFNS^;If(6{W4? z-TzH7m5p>j%k&T$J4|F6cHcD~%t@gs6^=H?(y?~_BcZSoMv4iBz5XouU?^J7e$l@j z<=##j36D$u2`Oo-eo7euupkLNYTGe^(oq`wK{c}p|$Gd4nnwf0cem}sP&bsB^&fev1F~Zkm zXAYc{xqED|eey&x-xFVJW{WLdkmr%)2|~DExUTNg5wjezI2V9cGEW3{abW z^969rP9tWEf5K;`Lk_m)O&XsgJ};cH@5mAN81VPAFU2f;44Vs7OQARBimmZjr9E!U z73<+&(mXJi?o^TAJ~*VBdJ9HUOfy-+}l9MpO!rR)Ujg%;XEtDCg8*xl!g zr-B8${nA=7%Nq@i+kt~ccUrzf3=R4p&Dah=*1xg?qqtA?cZxj?NOUuEr^wdq&`vfQ zyJ?rW&}3QY!A@I3ZZ2%%LhL*Ci7o@uU$q^Cypp6$bY5cX2WB|1r}_xDTu`WJNfxpMKv}^O1XsPE%Y~)67-2 zdEgg|eclPN1QW2oRVoG;jK|H`&lRQcWL%J4&z%;X5?dH2_<$^CR)=-R zy;EWyM!w**xLqivzGuW-_<-L(BOZmL_-|*SK{-da&Wc-%xY&jbe$=EuI&co$eWCr~ zIh;=r5G3ln_zDI+_Pp5IJ3H51eJH3!7sFxe(vuFI$HJu3{qvBNzhBEzvGk_szct#_ z$+~+J3E@FYY(`y&?#x_7w{6}kS!$q-n^K^$XewcQ6a8m>M z*@RjCUWBzcdH|N_miS>$Sc}^(iL21*p-a5eu*+h$LCCVNC>P%saKg|tEkr`0A|i^z zRVZjvsK-@)GM;i3`i?BS?V9*5Bao4lIrVew@teTs!s}efh|*r2xGqMb+P&+%{Hz-& zkH4-rc`MIpkKs4@N8>H=4fb*PZT>M|d;D@+L};B1QN!xk?26Z$}A4)|R#ZWhHssQMulW-pg zjx`kyP)Vd3PwU6H=J&;Gpy zzD}#Pbz+}lAM#HxKGZ)I3u@`t>{!>6=4+pJR{8Yhr%;?&d(IA$(BAB3l7>U5bL_f1 z|B%H$*egG5&CnWi7o^5mwC378kqgHl#n5m;VvF{^Ak~4XHj8fJJtmO02@+eAV}is8 zp07a?@lXv?eXQiJT;GULX!fTYB&Ivut^b{dhUiCw_BY-sccBvhe>7ka0I`uPd;`5rbDGlX%)OK$Sbj$UOS z&3-MnUvjw6i0YW65=N4wwy{+*h^p5+&w%y}Nuhr-OYhyei%w>`f-FB14BK-CH?$T}GuYIJav=UFUc}vXredN6Z z{&pmm_hB?N_06ad`+~6zanG~QDpfaQuU`t1+y%qOCb}IgHN?}dgrHq;GPf}4O;GiB z!=wgiWGHaOq`G?zQ23v^T<~23QzZQX3x$usF?>MDXg@k zu~&lBipyPjg8GMU>C`VliZ$H%j5>CdV!Rxr$OvW5W_v+`q#BLjWF{Pfr5QA_w)7F3 zwUDfhtx2-98e_BnQ-{rdp?!xWea1*jC}qyd^rywm|MjMpb7IZ8E$hS!-X4A`4+Moh zoI*1cX$WBQuOgkrU&WX}?jw|Iq|4t+ox0iz5qBTVix|r5bV%C928gg*NP{q~w0DEjBseuVY z?$u1X!1!;g783ZceMAc>mV^ECmfFCONtlCW&?n zmKO$6NE?YMEc3@BL0Hc=Qa4QLyEf9Fn9FBv`II`flm39|U*d~=N`qgNTHqh1RGMw%+b8b?0rl(zt>#A-tJD?kWo2%tjgHY$`NOVroV`J)U+&2I8hUOf!wroX;Iv zD@3o;6=EN!NpJA>J!wD>#3N)N2;`}O_4dP^?Kkbghg$IUm~fACvm8zNuzFm#_Dv6I zJK|dn>M2RKwJxfj&D%K+o(~v}u2~UdU6$+pTNLiF5A?)-T1(bmQkdz-pM9;%NbDs! zuHWDZ=*q9(KI$dafD=i6FUj9a^P%FO;6qi^OR|}UV10t9VrT-tP%G$sHiANXBXi+D z%VN|>+<>+04FZ}*(|Svtk>Cw^peU=i6ht?AgI=XkQXi>~GFlDSwyoo05ocqEAC#+p zy@x)Tca|o;8);;?cPM?`M+$^OK0>RkyXFGsnjfKy^~2nXG*JkU@JiEvdssif2y_}@ zbQ=fnRms8Y^cz~?Mv2YSWG_2!W zp_Kl&iy5wRTr&Y42H{^T6Q7$u#8n8%$&LypTUTFJCV^8Vb~fww3U4Qo@_)w7;die{ zQz14t?k5$R_7@m%)PB%UV(G1GX*1L{92l-{=7|iyMjf1Jr0LhIbo}_7Ft!Fyvni-o zqZ4Sd^V{=I${n3FqSSAL{mJ&4RGW`8(AjRU*Z4TIPoEFB1=4BK+f)K!L~{*?da)ORfb!w_4@y3!tBazWT6s6pn-0GrokW4PL#2^;6yGsLP|e$|k&5ab^?g&S zVT2*E0pfIPmGY*3WTuu`79&l8`j!qgc+pIGuD_Y-pEn_xOoS)ie0cQq5*tzZkAniq zb9Y-mdTW@(l3P_x=f3Fcs>ePWK3qD4Q&@`;Qd5@#gG%y|2L6;iLh58KzTl=VMXb1N zcC8O30J{(JH@dQGeN(!Wj?M92y7V^Glg8ZKH8voyFjDG-&bo}0KE+!zHQRACm?}m} zHS{Zelb0Q%q!`Qn6MFXJ7lzw0lHs#^~UxDQlcRzh;#m1MU?drGQVrx%td@lLC7EB022;y1?Ek^frykR z)iomBa2N@PkWzNp2ht5kPdJ1v^$DSLwX22pjFytjT7UHKXsHK`QagVry@2*+eJIst z;XG4^jfC1a#E79DQn+Z1LDdc0{IRqWdrPECVbiQ4=^nHAC|2J;))V zIQ;4VkFcPcH63rNo8x{3RXHI<2m(e3RU5yAr4^BKC|NV5px!ek_=?r4Jy$IR?D3Nc zzPLP%jcr(s-N^p?v9BX&1pXlm3{v8$=Us-zxZ!z77>Y;>&LFJAG-oyJHSPieW`dQ= z$mFM-{h88x`d0nafU3;;Cgo!(9$VF{F&Jm|L$l78c{yy=^v)RO>W?K?E)d}M-ZDXR zr!M&;B!bF6#+EH#U{f1n%Z5ylqAeJ*8iqg3@hAD{Z!xML>}f0x@rj3T)U4PY35GG} z$uVjjRGBgXVs#pwoFLVK*R=OU(9N!tF%d!xyS4TqdHeIo1N^cC=h%r-UwjLn#Lq@4 zlcX1FJMZril~kuXZcbsN%A~j}`1VOs1F&B`i>zJ)kPG0P3IYcCej-J~+gkoadNF}v z{sM!#c#;bzmq8AQ+4LZoAaG_zJM%x0-p8myCreEGku_Nw%mK4P z4)tLI(|E{NtGAgsQJwplRLk@pN=LEM{&f5^X%q-+$`pSxO|E)z#FpG$!Tz^T#a(wknIJY}>oU#6~9JVSa9z=@}tUr5#I&6yZTDt$Lo znhrodmnF5(L3JLdRgS!G%$6c*)znrCn#I8m9~?*YUKGS?zYpilB-iieMy*gKd zaX9we7V0z)6VZN-ohPMokS~RO2g5A-V;;0n0Qq-Ua1sohFZDvpBj!Um>PqM5ORuB5 z)CCfAEG%0fwbb#b)DcxeTqv=q5)RcBayx1QOO+@Mh&sumN`$)W`YeV&^A@7hDlsKO zT)zO`K!8Z2`wMZhevfM9LV1uv>vORbNQ;;U_MSp*^CWi1H8u~rgj8CVC&hR#oaDl- zWsuferAc%&4^*!&b;y@$;_+_2RNHOICX4le06R>|n=}c2$N7>cf+tv50EmLYsz061 zmm*?UpNwa&z9x0j=SGhhgU)b%*EDcOoLh!d%vYe*H?BwHPZqt1KXR!V0U|VN7VMZg z49tHktfscGR@3agK^66o5io?Z&-+R`z+~n(7V-Ifw@B(Le3kPJ|I_Ll!2TF5{6?B+ zdAP#`hpxVqy;c%w__3eN^vbtTq@~gu-%53Be>};kV+q5Vs}mjn7|xt>{$n`v^F-SF zE!e@Qbn{#2ZBi&~F`#>l+AWrvn7;5(&sL+A>!jBL&S?{MQQ2+`R*&oisip^uHOx@g zORv$`C6X7AVCoW3ysq?MiNwtF-dM^pYx9|+AqI>6!` z0DB6m#3J?xiXvX*2M`>$Z|V&tIOURCI+{RO^Ia*ixFNUE%J&GQGIFI<&x64fhKC%c zt5-UA+iN7Q;xKKtiojH!Jt*MoSis3cp?H$C>7czH$(#Y(e9*E$$?rTTw9>J zPD4VB_zR3+IVk^g8zm2hj%_z`bbNOs2cEEr121)x)Cz%r9BFA2NH~fr&DTmkH2?ii z-GG~OE63y<)H;rvv3`22Xg8!^b+JN6IZvSS6;g!z{L1)#%{EJ8uqiih=KLW1d(ICU zea|(c-&vX+-UQ+d7$_=$O5%mYW6szux;bO|JK>HbDmEE-+Qsvq#qZ|7C(Z!$<`&> z$3S(Bj>Jc{X{6xxHYu44XUkZP0BW%vXYdqtIn4m_dTN2FF{2c91)W$UHKyi;SmG3F zSIBwFxI(F)W%G9k7psxo=e@Nk)F7g>KVev1uSkjk9Zf3&?@ggEia0LsDB`$$zevYr zSv|bk!f|<>KGV1-fXvD1%^i}LM^{9g)`(IKD%vOYp`klDj6c{Z4fSF&yWROY|3~S) zkd2RmdZYd|0VXF>gU2CWw2MQ0lXD!;fVlf+C&VdocO}YOzjpxp^gWv@fjhsqTLbpo z-8!(hYFoT?xAZn}e4E}|B5luwI5Bn)F7#4p(H>4c{@%kO9sL7{`ssU&^2SonA28$1 zH24SbYwX@1I3j!P<%m3dFGu95dpRPP?3FrmQd(bwF(vJ*LQ0qJQ4d<|5ggg*(D94;Ga0;_v<5#=fHag_d1|~K;vEq^jg)Q!Mz~pR6?`( zr%GtnDRw|J>ufYTJaJhI_HGQ7TeyK9gnn(CN8y?~FTy})dGw@ewCid_}z4^HR3zIHY zo$)2TR?IVJe7SPQU4E-F<13CCugUgR>tV)Ae&aL#^*27_3cc|f&TSYOa8+xH5x}eZ z=U7^~N0RB%@0<|c{GCH0`KZ()k@4kyIwXLlH}nd&Cx{v27#mRb`d=-72pwz^x7}|9b6YWX?rBXUb=x0>=H?AF*mqLG=N|#Id zmL6C3%q=}lo3KVIr#X9b_VgsHr>IlKPR!UjZ4pgVSPw@&Y_tP z==?dUt{2-#IA^QB3d~_T;V&u4lJ~t?wSqAB{7Y(T`km9`FaL7T<2=gDn!qJy4?6i5 zr^mPd;`BJ-ywt=KN4Br^aYfRM#ZnYaJukK8gsZHYTJSw$ztV~G8sXw{M&G|V;d=9L zPPk6|%?a0w7o?e3;w6+(CN+Ns>swlNJ(pI({6x3^5?}9sFL9CL?aNYsTnDb#tAOh2n{wx);T*>^D6IRRmEipDUKMa2WA7PTT#g$D z1*l`buZ#4@so)-{C})Hx^l@Q(6yE2UV|~C+v!%}QJ5RIjWm;jtnWjE~p;LEy^&xCd zKFM%_`fTF&204%b*2lj;rZGFq8?wHto;A?wUup-0gPWe?@8DYF!P5UZuw(&QkWvCBlZl;3zmwkQ?IP z20^Zgf2D$)gd!dWnWX`F*&s(7GJd472Dt%0O?iM}scWTxgF>nc0cyoFV6R+yT1f?m&YndiJE z-~}PWuv-;Mc9Y$>0&k)Vhf@_TJ1$jXJqm9{>6coQD8)k#K#pwL&2qlj7hExo3f*Lh zX;LcODb-UBB*k5>WBKBa6;6|BG{jv_u*{k2iz9m)&1QdY+(tM% z{MpI=tazXmt8hoB=Xd$)ola*h1yg+wIS{w|9X#-H-A;bz#>5KB@WRKL9&!_NQ9NE` z@gW9eYiK=?JfR6~W25ZL~!!nZ*MQ3TVY37O9{IG|2N1Z%n3B8Q-L@(d|?5hUx zscvUModilM;R}I8G1TVQOHx5ElI0mUi7#`qr!n{l@>lEyK$UOz zW#k{Dn5O~C>MaLrn!Wj2)t26<`ZJ0#+oKe34ak|^sC(~wUp0=`&DHAeV0Bk8tzaIn z8<6i9*YrXMpz^h%5k8J?zS6qs=!0&G&<$ILmwhn%LYnR)$68kF?>69_xsZYOTV5l_ ziVEAe`l_L*V71D!2FxW|bA9mD<0q`0Ho2u5;6Aa+L4fK4E1;SSNQd*$FV{Yn;iJ~Z z3f_kGJICk`1M&RPON_7loaI1%b=81BulaH)Zt#_3EO*w$@OLM)ce0<{h(jN7Iskp^ zTGkM|*o$zNghXMj*kzZzR((bJX z1js>2$L?y`WfE;h^_RN_{ThfV@ps)d=n8(O#9w!p@&n`qVGQjH;M@55K)DBc`aZW{ zYa|HD>Oi@UVN(H>2Fjg6zVuYLJh@GA!Pq)T9t@+)6+!Zc0a=9y5f8`aZvB&c$FpC* zQjMEh6P){t|te ztZV4KNSS4eUlJ+TjaV>W8%Hp{<;<@-j!)*(%}B>M*xh+{lw6Ei4TzRogi` zKQ8LwjoPK`ejU`-Cn#>hiJ&)2V85F)rBRMEy<|Z@0cnd~XpYq?@dK%zX zL@(5k6U<{U7{hoPFab$+y01UcQ?ki=itfvGemr zc1t~n|GdR+$IB-c(^h;=8LXagPSpvSiIsJZO=Q(s9Y>gx43kzLuQMFX`J{$C2FRC9 z6J>r4$>Fr>IoX#cCCU*YqnxH7rFvPe3s0j>iJ%g>=R;LQyr;56xrXKPU!kfi{&>{{ zhOM9$H9_hQ&S&u((&+V?Ab+Fj%bMW#DRj1`{0;}=Um6hKPXZ8sykgc(R}AWoD-56x zAg;MWOOrSEOPOt2CoFrV2@5S#9|PT%BBUp-nHy)#=4#kiV`pKUsdAODR`eG;0g7jywqO z%NxfAQnS{wCvB+nq`^i14(Rb_9oZi^TcNMaGc7LMuU5joi&zEr3`c2>DEnFnT772! zvRag7CI_4nIeJRCwCSe_kgqLAc4kz|u)4}7@AKOpg9@*p3C z4Y=*-E`?r|<#yP7%Vk-Pn7`JAL)`|{ownA+Noo!1y)|@824Ncmw@SG6Wz>)xQ=TGM z2Pk$ad}sL8l?P%V@7I+lGD9=wyzBRXcT<@l`GE_S|A`=<+m^TWq)zo@OY=eM!^hzB ze;7h#a3dt$+Kgt^lUYVIYki2WOQ>so`3B}X(MSs&XPe zpNS3S7&Egbo?@icGVo)2Lx3-ZPB)Yr1OAbXK!UGqtRx-h`ELi-|GtriHF}bC^aB1* zr*X}J|F*{R8ccqMF}Gqc^Su1KF-Q2&CY*}QZ6ddR1{Jy0L>8M2Rh4%b%A$P|^Op{0gUaD~%doMnou$)-`*9^W6>FLu|#_@0?bg{U)}4lKsBdnzP@P zl|#@pT~A@Znx<=&vn0@<&P%o0$iA*L!55i^u=cImaB?=P4JT*!+Hi8V7AZ9u zIqTn+%ZxMHa<03ptz13!X?W@5+?5>T+}iP7xuJ4xbhNW;fOEsH?AK0aD#^@ta#KKT zTRU0h5L@Sfn8%A6#2~e>b7CGIU=mx5w7q;N@+8K{9<)7KhNFCYxh21u-0J9!eCx0y zWP5oK4wl>Ww|E&scuy-HR|VQ`ARoJdt>>GtSs)6xl_Nk#jB~ zM+85z{OD{I_`~HBW(#S}wl;J*4=Dz+3yf8f9A`uq(1lf$-$jn}ynEMbbF;q4Tt7$A zk6mOIDb77b-oj5R2Pmcsw$#ZK9I6g%WWsM6T}c7wOQA-oPnd-8%KMkfMbX(pWttJk9>9FLXlWbPq&oF|Ne%!*IPz#cP`qC?pc;UBGhgDU zSMZYj3Pxe=Cbu)bsvb2`W|zys9)Iw1n#UX z+`1SE0x;#pBZGa;R1O0*&rts!Sg;?{ZwHt#@+%ktWX@b5mbqZcM9s$censsg;eM?IG83y?zsy!0H7fl|6?*dUblr znnBz@MlC#&SgWpyiqqui;EUR14JuofrIoGB=qcAR*;y-8)D!wGW=?n6NZV@F4WYu` za!l}*sued?R&3l06^}n)q4$RM!n}^=YV*qKh20I8))l>EEn)Um8rd6gInhfNy)N8y zRb$kvM>N;)u-8`bxe@cc;hR&P1X_5@h|eFQB3QfeQxc(11%AAHj>yeg3a z8OU#;Z9OtztvUlIza>2Uc6A=Pdi zfn<=zDJB-3X&>{0OqXjmbmn7mcpK;$G_k>v-dZ!#@zO7i%z8v+3)Bw})1kKoaUCi5 zba<+`@__oZYNR}y_2RC%`1Tnk*M!MDb}aG(c_ADc-@9g&C&lD`ae1R;7U0i|MxJaP zM2APoqSL3wo4Kk5Q1sjKBG#l8?j1;tMSr}_+tghe9bRx|Rr6_N&co5~$jm#h$vd(Q zz9TJ<8G~tisL>UU|JFen!E_S8&AJbXZ_;1L7c;}c(*Pp?W3OxH+ z$TpmX5q&h*H?0m-SY1DmXJBc{K9DCf^Vo{PCj)5ghq9Z?tAHQ!6NJ)NAIghRqU}d= z3m24_JWlS66uMTbn3#xMIOAk@-k$I5ipKurGhU8&*}E>DN*4SWX74&4k~0gDEHupz zptTu@wT9SCEJ__G5XFV;RH9cY1m-H5=;ZN-IB>oeoDQ zK9=jlL(l||0i5;!S52TKt$sNJg^_*jHKIOQIJTGjVd^x?ep6qARBk0O! zGK-oua&sUKSA3uH8$JGm-QS@*+cv{+XznvU z-um)?eC*qHrtrVMu~zrad3r^mdpnrHKK&aX&YWj`EX;XE&GWMz9~l)j+^|v6$$>~d zzoFee4d-xEx zLLS53ja+&xfL5%KhqFIL`7ipz)>{7BunAZ` zJ?jQJoh6xC(N-XH@0gfVr)*SQQp=qN706c07q?Jp{T87#VpKQm=QT15rjq~eM@Si%o132?1p1g%9s(IBk`K^h2z+{b zz<~_VvE-jZ;x}YwDnq#^lI57R=oK2wGuG-bUswtA;7s3xfK?WX|#Qv2Jg%30Pk;(^E;kg-`=r^S6FL3 z_~X>v)m`I2QG2hKJv=_$?W-no2**-E)A9Z^VZF>UJj`1!#{$4{8Y(yk_@4pnra5e} zyYa{ka#-|-VQPHUwxD6t+}{E0Fg1ZvqPj%}BRDB1xo(IqxpKQ7139LgNSW(+CKSrw z0Dk!!)wFYM{af0jKzrQK9*sBhZ)3Gb(MD(xQ|vCA7$b3#UoHVYvf1f}t&a(%(dOkca85 z+JE29#DY}nUxYK{*R;Jz-eLcE7nCGIs(s^bIYdC1r;_T`*@r{#2+G(ev(Sa|(2oKsZ%@zq_6z&K(vdmZRxFPYmfEw5WyI=R zj_9Ecj|6%m$_A%3^9^t>5K5rkoD=}=4-qIC$vU4ak>d?FO-PD^Yp0B~CMFtFg0nhw z2_+ovS4-q(!ZwnAh7xZZ4ft8UO^ppoQ;Kr+XTB*_gV!bgg3Gg18tK|GlxF=R$GFV- z7Fh}Q-fCvQ_KOTB>QoZvo5JiVzshFDseAke1>dWb{e}yR%$L7cX$IeUUo)NhP2OPG zzlSO^mqzA9bv2py@8QyR`QNEY!b%u>$|2gTZj`;Dejwb|x9p+(8>!JS*C@J?s(S4s zvszcp*a$CU9El1qq(*`l%qQXDqGBjKka3dHVvo1;Ae@`{5c_wuSnrBg>Dh{|tn=bvqlAym5 zFiHzHauD%gk@k%;zxLBY6cpEQMOmGYMd;gO@>>SMKmjM^rGUq_lc2K~uhP+z@~bS- zU->uvf~i|6##LaSS_*FD6rjyas178rQ}Ua-U5$??6%SxBn|bna|rm09PsD!y7rznqi%IZ8MFOKz?^d=H4P zAM9=O()?sKfsgY4l8@2nLj$`R=Io(@9|A)$vDA0m+SDvu#STSaF^7g^Fo~Yd?8=vg40P!hDpHAo4&ze{9QLkb^#DACdfh5{JoG$ zy!?UjuW*0jn`@ElLR-a*e%)|m1bvJJcIOXh}Cw+F@jBlj_!KSY`T$h8gUf3~mshwa3@wD+Ps+Wdw~yHM%UvTdqG~5pA+)&}F$c3~y##mJ<=d==;lZlJPIxrBTZ- z5s>KqWf>7Nf1$E+xufA&Bpn*}T`;w&kl$vFN;A$O9B2g;!rkeQ3bcHIT(8Qtjaf+f zPBEfSAa%Mb?+q_CtGfHKGn1~vVUI?BKm7x0nRm&XHe8e6#45yIm(Loq11R%hQV>Po zkgYf+OE+Mk1KC=7y8)Hnkmnf=AmZ`yVS)Bp|H?ZAoI%V8{VqQrib!g=aQFK)Jy`Zi zHbq`21$C(J*Vpg`Z!RAGPiP4_5t=3V8P@u+)e17=psYu_9D7GT$*$nl=3znf&Ruy3 zMw6ND7i_b@?KnKzoH{~W8*k0QdOjF$zt$}QKTxDr-SA7SM44}JK#m&Wn z7)wQggTgJv*IW>H76~MhO}rgp1P-(HJd|*7q!bUO1s+)*iU?v+s6EO(l%|FaI53_> z)|l3w$`y~(n`{jXp5Ub?r&0?qCBd-9hhpAum0ksD7U+OoPzA8S%g2_Bg;q5z)QYla z)!3?cd=wUJl22`wRiD~Ks4y=)IyDafh)-;GQ3S}pb7J;ZzKV^7#4gx$DVWCiDG@P` zddybSkBGY6JWzQ!l`icaKnMI357*4^qwyxog+?BA4T)4&LWgX{R@ARVox+p=-&qRu zS26%L@dToMtn^oSJP;G5G!6=*hyKc8B%?eWpp*q5DQY#fnhyepsB zmEkN+Yr|mW03N0gB@bD-z70{j>pL@b)MbCV7^ZkrOsFywyQ&~mvDL~u!h%LLtd@+% zK0o3J8DYb}3C@33{JZvxFBMKo3+9c%2yi0~GUM6>`H<~?xvQ6U*X)9F^5~jrC z{0nvTxgmirF3{Cyhbb@cnkI4#V~Y9VO{_k`5jTO_VrIDFX_{t_w_c*Wa77DuZ6Vcn zX#mYgyX;G6!j*Qo2nBUcZWlzYBa|3)fH1_3j|93H&_QN|!jvn*=tIGDEJ7J66jA3$ zrEauS>%2EYL+rbBs3bT41 z5v8z@Hr`ZZ!%e$nU;X=*jjhBNwEV}NB-T0hHyc)t?R#OKG5%j%HiSfw3WaajNX4OBpB!T7WzGG9K!@Wv_ z7$w?cDdc@vw_*5!`q#H(6qZVTIlfxHDl>8$vyvDk32uUBcAg2l;-A~3Ryf*;k5&3q zMg{ev)tY8!XiB6A3Kj6SJf33*Y1<*NM@&$7Ns18RVl zAd+$orK6ByKT$)ODmd9hW`fdH_=(b+Hw>YR3Cd^e1DHXKeNLj%k{822I84-3?xKm9 zhCBS}Vc&*soJZtr+h?J_?lktMlv>#5W%iM^l-GnBYhl!?ol!Ka4ruhW{Vk|#^AHw| z#dsGeBW_s``6MeH^lhL?zJZS}09v@{4e=u1f%C>*5+5@P_{DRWP+TpGuDPg5sJgWQ5am5O z&K~pZ_Zuj41mTE1r;$=ifQElZW94@U$n%;gdyNnd6RD{BR&ciGlp(?e`_ z8-vuk8uSAHi%Eb*tykGXH?^L#sxFs0gYmqs-KGQKc%(EIisx=~eI@3frRQ2G4Ydh0 zB;i&UfUJdbPQSU`E8wuq)Hvf?Dl8^Q6Ri`N#b}rL?z-}Zmjm6|(^83v7y?-6Sv>p@ zBj`~px|mO5BdF!WFn6k{D#4a(`7xZ3v{ki*eM7}sj;1-P5)bOTT?PBUxuBlzbY^NtYw==0V}p!JbeM1YQ5-%&Qf z-?eqD(aQ~ciSH~#fKn`GEpQXvZ>`jRX%MowXz=p?Z|ix8$05+|l+;6&m7Oa}W7;So zY%AroQJV6tga!P)4PZB?kdMOmu-3*Let^Mb4^w^{C6HRQRs5U(XhDXksw)VTI8vp2 zH~e#c<}wJ&xW>epo#Mm37r&^SgFv*Qz0%s70ei1W{q>Tj z`FHD}AZZFU?4U$iPT92^&ORL!e#7~G2c;{n56tRWD(njV=64;HxL`f}22!A-pZH`P%>9*xHnAg2niA!);dd9D1bbtg<)n5}0wSMC zC1X)5c;gW4Hc^MpkjU2|*p(7z{L)RmM&+gBf@o!Du&Z@+qBGdQFcP|eY`#njyC@5h zbm1oDb-^NcOHm|U{rWmWZn1rvox2)yhE% z%o|k}8J}9R}jbkXhAOQAnnhvn($fVF- ziw43WmeNB>#f-n|0ZHaPD(<0727k`V&3~8#4QYB$r5^s`LiIYrVvDDTny9d+l89Hc z*sD-7_Tp?kx|i}!R96JV&~_t6q3_1on))mNyRo2`@-EDZa)eyzWG!Za(;JA9La+7a zGSkxD$_!yWHR_|BMmA6J9I^qpThxWTy7krERJ;hz-S%z_vS}Pl@bIBwFDu@hSpDlGQckXQKQ#48Fj*lycTVcs}L`Y8^_m<)r?W2*O8m^IT9ebx}L zA7wJUAYebNKV~|FX7*aaSXFA#>iJv=8>5=1`bdn>RjLUb2X%0%s{lm2Y%J6A%$+N z0r_$<8W2n^k_G>0eF+s|N%R>=&%*(VC4p6ZzFI@b3it4fIWcKRIg7elTR7GvF5;74 z1w%`t8LxsOG3j}Y*7^Idl_Pv>Xcr4zeO2iW!_2h;rSvTipnk6@_3(F{KpkChl0%@$ zMEqSZP?n2N5P2c?p8Ez}n1o;*F;HQ_WXB9tm^c0!OhS;zMC@!zJ;5MFE5IBf^(J3B~Wt`dz0D|IY;bGY3S z4IivA2f#lZuyF zIfBnWNETqN$iAs|Bi><*(OGV?OJ)s{Oqx98vvc>Nx9UZFLn0J+-`s=KBl~#_| z8J{RM$>lvI4%p~V!W87XmVTIHGV2=L+;NH?SJOW7J+S8|06H&7y?yfk0rW9|rj7f* z0ZIU9hMguWmkiM7e<3+v6X6bJziWoU#|&i?=)kg> z%EvI^NX}B4;|5?@7No&k%ErUAR|ta=tYUb6AQfjRt}w6^KJOZon=!Md@N(`?AH)e> z_8!@af#ubaUDDfA#$RzZ8ars3H~sv%vL8+7e!=Atgq7Nv5<~50D+##n!mU>@HCGH4 zgS8i>w(gort1r#;Bk9j`frd<1E%>x8N0}I`c@(vTdR22MVxA1lpQtFVTOxwDXD0aj zducY-tPC88C?BtaHMa*>&Of2!V21^y^czAWt#SNjUuHo#Qhw~_YF00-vO)LOB7R7S z1wUb$o0emX2#Qkw{?6ArO7jhX9j~SwgwxJSS?Ud{E*Nf(aXw3td_>;&3ZCtfxU$&j~JY{ zBLgV!of}3}kZvMo}h~op3a%KMeG@Ju-F1`=PybxO})W0k$;JzZT{GFwi{` zgjN&n^lKzcN{iv|YW*;bTCCa^?BZ_yfJ%QDIGiqisq7N^+6(3?N0>S`@lxYU_#1S& z@ovGeGJuX>X$(m>fNo!DT#Wbo${SB*#kyZ@+yqL9EBVT~(88ZekbE~>Gm5sES%hKu zU&A)*H(=MtdtiieBm=UDhiET1bs}_`Y7&(JADx}Uo7RdiOQBidsEInu9zL9 zMqvRSE>e_j$VA8n;fs$ex zq3|afuviHZ=Gs4840#k8q!unwj^Q-=(Nd+(e^`gorF=4ap5SM$1D{L`z{w|rG?_ot ztDKA$Ww>%O*~|E3jxU1__#kX-m^-iwaxciL$)C1-r+8Vl1j4XIwL-1tf^?63r4HP= zG`03Pe*u#eGDiU8^K|**Gn+ z*lw-r6uT+Bn!*Z`&$(LKVa&bCNJZ+|r(Ob~sz2UlwpqNpNN@z+vt32MgKC>E*!@D-`(n}$eaQhLzUa{X%;eymF=0LJbsi(-FJ zMAnK-FHl@P7Jm&BFaB2HZ^P>94B_&vKpr~I#i4lh(snCXtm?b99PMKI);0eLEgR?% zU}&iaQ1*04>Q7s&$Iw#CPJzY33>s3&4&mHmN(;M(Gr$5vAUPjUUjmUILqP zV{IFFhS^+njjvg4qR+H=eF%5gpR<;)>7KPZ7B;2q%}NNBu2=k?wYWO*@34+zVKc2G zBq#sh`|U9-Y|h8QurP0372N?quA)opunBOpTw=1G?G~&Ne%u$SVo?Y?aL;tZF zr7j-nPuuPPY3N=X`OtsThwi-id)m-By-(Sw1i*y~cYZLT_;Lule$+PpbN-d^c7&RC zBN<5Kt;dvh5I5gVn8%FM0cryfh{l`vJPuWZ+gd~*Wo}Y}p@Jx>mYW^KY|dA2f_A5r zLN_a;uvw;URvJ0c2}y~#SGg_@kxGL@Xvw#=`V8j($75|7w z*F#fVgZi^69wFJo5TMO4-%vk^zWiSCb;=Y4-{USXjf`7x=UK_oekZj!B7jR;q>lSCFK8{tv>|h zLtB*qr+{2JwZ~Acv=Y@KwrQxwCKYMYrP(s=yGgBF$Fgcv(aHxN$=@r-6w6RlIJ3OZ#>u#JrmEs54Zu4XUvg+kwCZh0$CW&}BO`xhp7xJw{W(cHG5u zr_$|;=$zjF5)7Hw`rkToI#m--L(a!0d!cf&3k$34tBZvgmP5e0SIGBO`=Uoy@Df!d zVn$Pn_zHeqghiSGUW=$Ow7*CZAt{zq(fi%}$#(}=s@C42)Z$z3YBefz3k{$LYn7n? zb7HQvZ3o9vN62fZIq=hF$G4uaQ{Q^mkwvkli>7^H)FR-9W9jsnVHs{v`Veyf)v4p} zNvjtr5e@#;%IKRACH~dH3LEB1x~_-NhF*NFACFabVW%QC7_B-K{TSubi8DW!@M9bQ z#i>Gv1#5DG>Sip8SBt7S%*H`rAKTDR8^fW0ht%>ktM_#XL5(?XH&^k`!@~qC-iH8Y zi|)a6c(>xK^_D@t8=3}Ks;Rs`=-r02qQbYo^`_F2_M!IlJxX6@=UM)oOJ|DM3u}%P z%4`!B;-*_{zyct1FIYP__dH@azl^rr_6ZNs>;qv(;V>0MnjrR*mhZ!*Fd`?#lm*ho zeaar6Pm6J?VnhvkMQc`!z34}!kszF>f}mp|^wWMNm}>5aWPgz=`g9MV!tf9?4cV`B zFq{`?zzYq7Xy&vx%yekK(!h98fcsR5VH)ns4k#stV+*PLfU*$doq3R7?;9w;!*Cnz zKZxdZhZR$?(#G(cK)E;ehtTc%NaFrhFRLd_Du#w0HVyrULq+-83(<72nCmRL`-(X5 z1#dcW69e044~%xRaF)!Hh&^|RcY}O}teX!G@owa-{(&%!W5yBmKr7&(74Ym;C&UwW ztD3hJGv#QR33nvh5zlB3oO?8h18)b+AB8MLN|ZO*ZYTNTlYR)oCx?GaEi|4v9F9Nz zV+|&HILf0w&HO12C%m7P@rFaWRPi%tcM9c-QOw$*-(h~Y!7OcQ^I@e8thI$-KpJ4Z z*3cM8!w0?)?EyDk=KweuzGJg~rL2YrjX$E)a^opEah^}1@?ZF@Ei~Y;Vx#0EeAcN) zlmYP8(a(quZylrNA_2LUX-Ikba;-df@%g7qC?^^sIgFK{aVUr}wU(57U-6=h zeoalZ^;czyVK;2kayrAf@fhwiHrr<&Qw|t}-PHG_k_h9-Pfo&o?FjBurZ+_p&XbC- zVY54}I=(81E}m4P7|xif;P@(kyZ9%{8_t>k|7eWR*f?Q2<&^>t&-_Slmnp-9Z>h9Q z=^Z%bqB|05H{qFqOiijqLpA-$Me1@&c@HXL1Nr8r`O}}L6gLAl%ehmy_d87WPjeHW z_y0fI-UB?U;)@&3-Jac)O)rFGH?%+!NHX`*ggMtPW z1d$RH4Jsvo1(lKrQiUXdG-;uC-rvlkENyX);>L! zCiBmdV`)PTpGb4BFN&ZWWoa$`x#^m8?08xR+PBiIk4yj3ev1g3hQJ7IbVI0d^XAX-)@ZU^=fKL}lZqhlFU(hz9kul|kww;zkn; zvD=Jr3OSu7TvrlKrzOj;dU8Gg(?|pX7LpzDO=wrAe||p^_E~x=R_u>Wr*R%b8kPQz zE5afiDI#cLV1udwR^5}u4EF0C>BBE;Nf9O=b=z{veec;GHx(>FiS43!d0#k~j95gxF`f?R-V-v+_gL zk%aBCW_>KJ?B9WgWnBJ{Zav?<7JYLCc67oF85Vv8>eaLtBvA9OuEAg~gZ5oZdzTaS zT{R-}#+|PtIqBW&PzC8n->&O|UCADh?xUkMhGPOlt;*Q5Cvin`SZd zhvAg#>l;Gz?!aVvAML-B=EBG$^VH96P;&;{y z+D1q2r?o|3&zdX+X~nZxa<#8RJwDqS>kHAoc8L1m7=1@_^Mfe+_~tOfw&im+vKmlI zl~VK)jS8TPH3I@D@rNM+1y4&1X7_K>dIOt`kG4iuO+w1v0lpyx zV~s3_>!vQ6*{Aq;-@>?Ovx93+$21P5-4@1^r8cm#6{vXJ%BJIEq>WWK6>|=XXCN(D zWn;}H*gl^3Wo-;stu)TBc?5N|Gj24w!p`_2S}7ZRQApGZXH#4IJzg z$i2&t#UU_Mx*v;?-l0BzEE+Q_c-4<>khmG>hKqr5;UeZA_h&pLxdZ%+4ulsm0Q36| z2z-v0=~EuKo#qYRjaC(aqdbKz{(zRd~XTJQa9TjJ7oEBjRD{Fvi9d=4o96M4N z;6HN4-U?ZSvz@d&guTuU7qh=@8bhvo*DM}Gw_yp-M9|Ps7Shz4ozP=}{;yV}@cH5= zpKj|$>fzp@R=+_A`~cgw{h`cd5yk*W2HH5I3PptpJU~i#Do=hUglexu&e5mBSf`jS z9@NzH^5U-H~C ztn+kk!`m+(cuqJIcCM4dS!2tD$#!+$1o}Cg^|4&s5y`dXv&`E=^9J2=Np@-#7msARDH>-iTazBmWzVn&ZktpyD7 z1sWE`Zem|O7tQL#&;Nv*3BY?vcN8*nKU~RkHRWy5(kd*Kwnec(x*E+!q2ll=EZXw6 z1C6pf{_uSdhsrz(3Kfg$2F zis?z#Y}SGTaQ2-(uFCqNgj*}2g9IckUT4JMQ5wtQ`H~3q=@-j9=rgyhRp{I+!6sVR z9yhHScmbT(U06LirT+tigxjhI=Zj-m6gTBO8_QDoXKWlBh>_KLaAca-Dj)lzIF`&y z7R9kXn0;NBAZLj*CM>H8Jy$!VDa|}mC79BC-3*{DE;d%WNvfMQFief3QEv96;jodM zo9{#xTywKx$@C5n+A-t3t5L{os)b;|P1m`R%B!(j(oBk~&YqEW6pX75@@!bJEYCe5 zUP?*uUW=dbe(UM|*3J73H@pNWl|yQR#NR9UuqLZ&z`3wKfyJ2S27#-|UC<9!1_|t0 zX$SSJ&EDf_YY|m%@?+uTsKe5v52;xl)&P1Et7_2$@Vt`5Vky54vjy;-wM0@sn5u>L z`JoO=GS4gz10kE4bSsn`iOdi5R4uxItjj%9ZNzJa3mvLx%JHxNSy z7lB1z;}~9*$hhCzH;Jr;=xKFDVS5q^&)9&T;JKl0s)BeGNz5TeiF5xHa#&8Q!>WaA zJiXS{mld^FB(X%VbG%VlXC6;t+)-Qi=I~0EurGuKWI8q(EP7HC{KDyxWM+r{4n7@J z_Gm3lrUYgfM$Q|KJHza{Q@cUUzvSY|QWOlylQ!1FiT`af<5J8$$;@Tlg||Gi{q1B{ zkK55F)@5~5UsWSCobwKVry10|+AD^_Ib`jbnbr(n8a2P;I>|w+>N0yexC^ZT4~t?~ zqr`SHIY(h2QJ&UadR#8p`)O_<;5zX>n$IYN9Q7D?*Q`;Gxg7bkYH~j=e|6z>%BaUC zNI%f-daMI($F3BX=C?D@lV9C{`^l9dF*GWL?ZaW)C6%due2Mo;>Y)i{7=q@dVwb_< z>YG$HSn85Dt2cL0X_UrzDA{+@*wf%ItkBn`zcnP3f*9iokE&7T%GMF|0b`z&((5D$ z!?-zZ5o6)de(Ss5E9msZ^AhE-Vpf@HsWEGi``zRalel1sxTyVQ7G?Y8^Eh=KS0Co0 zTy2puPT%!b9{N_qz5|T-#vcdy(v-y^>TVvE?Pr;38B=SEX31Y+JQej=g|!E1OoY{5 z>kukYSQ36EX}{d{SuBdA*Jq7Q--RMgd*-&N2%1x$F+l65`mC8Wn`{l(BdC$0Iq3Fj zz^X%NHK74(36E%ZF9c9oG1%Zs#~ZK|0W3yk*>8nXazhrWmY=gG`1sUEeqc#0J7?8{ ze+r>kW1mo$&1Hz^*@3tD@GR$>CATIYv1^_Sf*!xw5JTBa-!x>gqIHGxlbF_ez+YRZ zh(=7ta62?&JZaeEMy!Deh|rMAF5AKg!?w}UMr3(d z#3IX^vEhK!7AhUvEvz7|IqS{2)oH5WRvWZnZV~nsTB+jFj-g~XKj}~7TCnZtp+ieH z8y_VtSuHb|)$brn1qm#OZN)?onnzo+b>^Z#?wT+QN#QBF4TkB7~N-W#pr&?%PflllBc#~3CIT4yB!uXgFbA>GNrzBu^n?m zzU6UD@SJ~kcpG>RzeBAi~HL%ZeO~e zHg{lditGRoW~c`+ffKlVbnU=8p&w61PtQqg_vG*7$JwS1>`_$tU9S??k?{-C(2kSus`r-T7E`ktPa0YEQ`oR&d3*%9O z&3U^zL?U44)UGU6cZgXm!33C7f^}UPcf`}JF+Ch4UTUOUlmjKW*Ol?)@^RhJHzW+R zTGx!BqOIQs(ZFuZXcTVCHpantvYbTCb`Q z63ds77wPzg&i*#9=qUq%p9*7#xM_F~#=R_qsC*d8XMBZ{27M? zS%87L7cjpEW%a5AyD`0(h#Irz<<}sZ@5LNe55#`O8|c2I-Yg{Ca|l)hPO0!ih&%I^ z!(mh10v24H+`l(2iV&A=el|D4V&-v2s)@KG^i^->1nyeY>XbUc6&CqG#44NDAu(fX zFhYg(59~$x9~}#zVUH#vg!bbs7tC1MpwOy*=1QsIX|pLVid^fAzOBrfNuBfm=>oPW zpjL!Q<#wQJo?t2R<||IXG=`d0t$#P`pxIK4C;YLCV~@O)8Y20@Gpwlu5{bKAtd z&FC^w&h~1d6mjR-8i?kjiR8IQ{)9ekE;f1g^~Ip^eX(D=)1rU|5!AOYt0NF3Ry{SJ zyOZ~%Iel5Y1L@p3BjBT6d6TyEWof?qr`5!Tv&Ch#|C2erDBan> zzhG5A(00Q~JE?EgilF-0tO?kP5!no}ehdD{#uS-(_o!M>G?+OhdqG)|4{nyxxJwKl z)gznQKhHK8CRnI$4r`Bfb(ee^PBU|G1uCP!5sb%>QAe;bhAnoIw#C9+VHgYJKQ_Nv z7DD$%uu$Aiau;>!MKfPwwP@Jz|EaMbDmR87|5uHTGV_eEe;wVAl^ev5hc&nzj7@PN zi17&nOu13X>!==$msI4SAJ4 z0U6&%hf^hS$z7K~>7!ExOk4Gs@-wlS=ZsU#N1i`v8) zN|QpPgPq>!ia?PBCnnQ>(8@4cJ_gssvq&#OYHi5o4v%4BrZS}P_Wtzs)g++YS+2@h z*4R)ION&M%h0&0)EJ*sA#*SstrjxNSLM-ocF~(QBi}*Ni(B`qM1s~tV=fWsz9OQc$ z;OK9|s<)xPjcRv2UYEv?gD~zc;qo` z&mcWArYcHxgD`vZG**@RzQJs!8?bAmvD*+oV`j_qfi&|C#s$}#6M}I^eFKLSsOY6r z@Imi^h}f>*k2Iq6wN0xS9J8qS9qWhQi>7vOS<}6NpfSTu6(_4j+$}@8h0}1G#g5}O zHLa##Qp80iC8{knX_vEkKmd1j|5${6NU!c6hF`PhSotsa77PCs^s=og?Z^dHT|v1G zqT=hk>fwpJnwP)FJx&Lo1a4@}SKYZM@8*|nT-TDiKOjNf#=i=zsZs+R;K`~lP*cW(sOUKgydof8a>xfP51>0quH^K zm+)0n=JAU*G(oiSZI;wwfG3oO_d4uR9f=xH7w@wA;dIlxBhy!1fg z%dW*;n8cbmcAkjimX-Xxp}xWPa9TMDw5bOb5BN4T822PyC9fXbsO8fs?a&~Uq9%hq z`STl>VEPg#gTBFnJ!EnyP2n%j%&9Ioy^PQXVYGVSx4wRAX?eI>L-YcX#$<-jrjwan zdDY|V|L@a!Kr0wEh4CfoJOzk7iUv)AX#5qLJcT7mMN}|_L6tzNsVYoerwWX0GF9w# zsfja!-ki!_mENB_jkOI&D6uf_Drn09jHg9&9*K2^b69Ek-xYv?rEybdsOw=nMHn9I zJB2n)W3~7eLEwo^17HC-4MWN(s56}j8;slx(2<2>6cdfDhB!-;XRsd)r(&s~n<0)y z%w*lU5r)$-ErLpCf>eCyhhs$0nxI*@kDWqzpy46Zc@}#dY05o{L=V{bz=dcqe_k7l zXLn1cLr@T&Z)T4B+YZ;YC7yA+XKUlO(&`t6hEwe)O9CN((^T19*%DsDyQHZN9E3QSYiXOoqnYXno62i&@dSl zJeVxR7rgSCIV=Qj{ML${;1Np*V;*c>K_l+WVX;;nr@_DAV%>v=%>|q7!QVOjhX-}< z4|_aFivPUgR1iy!GI3J^o|WHn0~X4QMT_5%U4DqW%DdF(L-xHmK#&l{FQ(E4p-y=$ zHukSah)oOOs3RC+IF_c>4yT2AED+%}^7B{=@TPHkkYn3I7RCE_QF#@FpKP>{1xsHS zbXdq*OQv0+kb@OZ>lH%F7J;0SZAF|lL3C!5lQXx zrnRdrS^qYz#EP=rAl=#&kt?QU^-a=O?FPNOSSZJ;TL_E7heN~6(2aA+qqMw9k$qY*aa9w4)d(fDb`;$Sa~s!Z80UJRi#pD;fY zEYTHm54VSq|58qysPR(P1yG%~R2x=9T61oWfL{W2>Nd$@G&^t86U!<_=O=8pwH~|D z!ewAL#+OjxG8SsnxrHY1J8GiCq^TDshEG{M@BNXyGHVo28r@f?exHhqd^4I=r!(R# zeJUXI?WgP&j(vr+Iq^}1k6F&b&84w0-6LsfjnINo%eipsS6cEJK8va7GZv;>Jq*WH zz(Z~{2cbKkv809-rqy2GZI6*8ui>FLhD!8CtKEME3l+lc?USepNvxlbP| zv}jyPTyc<=8?$2l_X`Q02VXk1P@-u3`cKWS2RKd}WOS7`)&a_l{WJ#RnuD4Ikn_nG z)-WEY;1H<^+rkT)eh#q=@Sy(}tPW?W4(r44D0=_>6ms`GqBYDt&X9EM@0I_D6A8Rk zL&00w)Do>V9@HvjEkrJr4x?}yyO#NSk!Jc@aU%V`mbo4Ji3A`XrP8$!Fvom}k{;|y z`jT}NDL;;jm!W@XeHc_7l~C;u?Tt6M$gwMt!UD^xo)B-+Pil2=+jYLGp8Q{C`S+tM znL2;PxVcHMuW&++qL;oBI5h7oNIHsW+gGeLR^=>}O&%I5POt!*dQR(>vkvF97ta=e z7-y*Gv5SZG2q{=l0HX=Ricd)Tn#ESr%v&d#TqfAG@<^EDE56>rt({xCw)h%!`(0Wy z5OUlxU$c$4PdELBeP!BV1e;Xsjt!%kL$jn7)-&-mm*BzV6Y!7VIiyb0oJmW(-dseZ`P* zU*HevjV)|Q>}APgjHvA!NNaVSB&1z;DR3)@>@U=KD{LP=;NhzLsQe=C$uDeWDOhxW zl0L`9@0+cxE_B4YEr7>))F#yZ_0WDZNa@C*khjcsDxIPkWKHFhEY~J zeYOpEh09d3jn&4Ddsgs0kiL0YLwUb5=VgWK{T{CXduhd2eO(HEnwK@-+vVSe#Zf>X zEWP!9*3-V43#!41kUGDx1da+Oa?Q`G>d*z0*t@?_tL+f1d;mw{GjS1AcXn27hjuN4 z$^!B~u?*YhXVr9QJUf4Cqnq=yVgh_YR-vzRV)@JnC0H~&D~_7&U^epykW<;I^Mb5N zv}XsK=QSNPd2J$1f@hE0_;e)A-wFBF0LoSxRoFzDgiT~-;y*Z3n?VcLEE_H^??Jm* z4ePbCSQrx`wqa9qn4gMYa8l+TVg@QRVpH3Ls{7HHT~H78Kv-^bsD=AL!SA|o7vop@ z+}6*8(Vx4RA6Rf*F6zC@o4i((VoU%qKN3Awlp?WR=9(;iWt^2`;8(`cMYv!=7>-09 zQyUB;SFd?7RHGPXUi2%?p^w7H%m7y;ggd3cM7F|JuFK&-cKhVP9pW6$Igu)}-CM$Lyt783Nua;RSeIJX8dqDhe)lGGH zR4I%$kR*G1gkamp>ICyv-_=?*!UPO9I^?$3z;%8fOH9}r?lBwCEP^0W(XTDwv~C}; z0uOtmN-(W?DuPLw4fG|1K6gIQ=>(iR!9RQW? zXR^Pig$29?avi{R?u+%AVbu8mOBQfgP*Gv>0Wc1|Xw?CL@dqk70C9Hjxd)-c!Eo+f zm=+1}rQ}bIm>barrcMW04gbAgo7Et7-CQ2!t0zr3hT)i)4m-H)E=gnP*pqYI31Mn%$NkaxDNpx zi>|#LM&o0SCFNyYsVfDL@i6-cXWS=;*^kn08hS)XHS&+JHGbl)`TG&pf}StI zY+j~WB`n0Tb5XVWh6I=my|af_mw=Q^z!^vGiS1%E2LpIhWzH>Sxlke^TS&~Kk#kQ4 zGM%+fWsjf*M_D9}332;J829B9Aj-PGdUL-MDALThS2lJ*bbQX zH#yGoa9=%ioOKD&PBJH^g?-JV=$0aW(jU;9yhvaC0ZwEi{q_g@3ZR;LLV&8vZxU0{`*+^d9RB ztv@iQ!s^Opc76maa+c=L3y(i!Q1|h|bpKD57|0)Ck<}}rel03&;fEO4XIT%-b@5rY z0JBriu~6>WkaZ4B$8K72POMw$IT)aQ#G#r*Wz!)acAaP41P~A_Swoxg=LHbzdTEX3 zGphrEhIp0g`>qL_| z7swcQiM5fwq5+rK^8#2UlDgv{-(w}01h8}mW3Pj5C19O9NbbuxxhBwKm%%E%&0*hM zgZ+)ZLu&+BV6)+!a3M*}t{@@YWtI$%828%LFD8Xh;k^I|39dj!kwIgwFrH_8D+OJ} zrJ(=I$UZRR%%nK`ciu)Q@G4VK`+Fa5p9aa%RrVxAgoRfjWj;jGHCETj(FfxP2g%WI z8_Yja0mIB|EK(pF$1G@~fov~cV_9Otw>{Xg{~D{|dRg`O^?EO%m1g{%jvfuJvp_S@ z1NT_((S<#vcca#}+<*9EcJ$#3#Noku1$t8IamhkyiM4UfSGd~9{JsATYwb3;f` zvI~%g>YE$bju|w*P0R2KGK9XgxRM;hX!uRstF)UdLU>POHSM}LE`KSmuwl2D3sBul zscou+Q>RrGu-X`Dm-Qit zd;gJ%cHP1C0B&%18PA7Y3e%cztU!}Gmo#MX*FA1IqQlcxyj=Lj1vAyT%7Xlkdb_~Y zvTQqiajM*d7VH$gc8{f-4~447fp+8I3HRGQ7A7bSW~rVQsDiMSet6@5pG9~v<&MCV zl>00)f-5=Wc?4EtdmexeO9x)-^GVe2J_|P#Zljm)vqsWFT5}&9bS53T&t3vmIGtDi zWIZX0A2>h(-M^Njz#08c>aqE;AhM-rr_3pmdEV=@loN9^6x&$4RXUMr@f>ZQc`b}m z%w2*CI!f|LD9;Nv8)OH!0NP=cCmDWl(wfre!)d5VcEeySbD3W&O5fBsnHGLH$e#kt z@_p0@uxK@e=SW?v{37^)#a8)E7;6Q6FcIvXO z$cg4t7lXlz4Z&;c?FCv0(M2Ck`de&hgmdEnaSo&0-5^%!k6!CXo4$*7Q2zPY7}HNF zhVTy%1S^(?ANVeTGOC@A=2;xD+djEcgKqfAdoY_F{_<8#WLAJIBFlXmD5pbVdnQnB z3o}s|?9;5RQzNO9Q?4Zjy11IU_i|Oi?Y!=klMv^$c#)zd?s&71`xGE?N9T`_CaPAh znR89&oN|`di;JEKl9!+>N3dLl!>m?_=<3-JxfRc3GPX^u$vI4g254kh1f2+x*I0fx zU<7_5#Si6&%9*g0%ADOhjApz)(@Zg8@>=j?#bI&_F|uE@k%93fcetGF)hB8;3y+7( z+;G*Yoi!Q<%5CqxhN~X49Ug^T6S5m|N!b)Gi%W_y;1Ri;OcAovabsf;4={?+1=Fku zIODy2GSH8jMacYuGB83$2-0mqA~XE72ss1KiX%S=4F|(2bVt||htNQPXds-_pJGF( zN~9dYWqd4B=0R7oBjtx#^9aQpa<96m-<}``MyhFwvCpY6Qs%dpLy>ZvndfV&qO}_( z-Geu4ljz^9({Uh$_EbFr=NL8WntA+ zy^5TS$f~-Ps<%&WOsre*R`f0cQ|*je;-UprsltqVay4X9SR@zuUv8(&54mS43pyMWQ?5X*B3AAXzf{P(M|-x2OUb( zbrJ2V%3Zj#%z~=2OLM5^yJBmBh@bAKvtSVioiY8G|jg^lX`m{#0*D0x#6(^^f zuiUBux0-2jpeJ1@xA`+66z-B^FgE6r8-kwIos$XA+}B;ey2;3}=91raOo~%ev=N!< zVvHQ^o2t{mzSQ51>EY;e%M0)kdvi>rnJ282>B8?NRblM&oL{002z()s>$KD6Ne1W9g^CFW@UXF;VY!} z&R#0Qu#_76beq75}0pdEB3@-wW1iRGKW$8%Gi>ovQh$&cX3g zbsy;6k)+4R`Mm_4G5nyg_icmlNOEp~cp0#P-WWeicnMV+={ERD@E$`sAN3l4#towW zUd6{#MZB)moT;@76)LyKPhjVu>bQ(LHgz!69w$-BSMSG=-_Ji)*d~M&T&OEQCE;Z5 znj*i+osJKs$lL}kA{EnINMEPQBps*BG&wqAgxeF=!{dTsz)fW#O-RF19;bpd`E39u zoyn6C$p04xXys9yERV*=0$HAdA_;qUdu!(I*KR}c&C z*9P)pJbbyKywY(%@}$N?iqz`cA-U}l9Yv2fl6&w4fWc{fIgEa8B#%J1k2IF6qWa^F zWr%_cqMP6sFuP$>xvOE@&or&69Ao+;6pHvYrPq-*C=)7+Jx%2~=xNX+^71(J6s>JI zT*!3Zvx>IoTz2PTV$EbXceg3Kbi$+S)PtyxZzk92_Kb&gdZNSptBZ|A6@k4xPFk^A z$2!vsl<{%fxuxR0W;h=38PQyBY~kGd7Y8Y;xh%3IaH9lT*j)Cw{m`0~u(c>`E{DTm zEZ*DTe>;p>)M|X1p0QN(R^>pzbM!yv&I~b*=IQ!4-q?>w`?A8}`c=AIjl;Djt;xWp z?P9u|50EZW<>gqC4lO{c4$zPmpmvLCQVTiO145^!HPwUpnxHq$ZoUn+mOEzIpRlMx za|%n*ByBLB3)X+YRD|{N%p=)bRiB3r)6A9{Ob4~p=Q8OaEpI7T=K~WkJ>OEc*uCRQ zp`Znukc(y55kHD;C3A1QRBy}w3ve~vt!S^C=hBP$Q~)=-_%#9CX{{=NyQ7sHud^~4 zE^IFTX*4-DiT!;4C(`k&|Kmq~}QRUgav{nfvL-ZU%@5)K(&%`RF!s7*1V1UxG&zX;C$Ou7p!} zWgBto?r0+?2^-XARQy&ZEMBU;=cHk^o13X-Te&qD|K@qp!DJZoEo{=r#JPVeYzsCS z@p{_=NiyhkTfyRQ;dinSe~3l43hv+eBrd-*O?AWV7D)a$!h-$n*A7hN30mAvPBtDG zUz7HfYP9+lSt7ZV?oKg7q+kI7s3%b(!F3Zk*3z5E7$*#XodkIr-u zlr$vVRx*23;4=&oFr(htMAvZ-=(V6mCe7u(_ALiBed8_5rMB)AV z?FYsrIuX*;pe`QBP>k%r+;PRWS*JR61^Ql2qH^)4&KzYdmufa&DlUgSgDzOFnL=pL-(E z#KG=zHC{V=IZ|x?@aQiA;6qMPjUI9*!>62s%)mFy|6dlFjBu>a-88Ze5)q-g;L4l zXfy5T8*QUS`fK5{e564GUrgj89q%O%qt1P0p5-vLpR5M_w$i5F_EQ%w)9y&)`{6Qo z`VLQUnBNbVxi7!x0(Uqpha$2ePpUxY`pJ=oC2x|ozno5cv}&jMxP)?bL26V~7ndg8kzZfDutIyHi8tYKvtI4>lxXh1#8 ztbex5BVd<(cO#TiIyW}a>}+(i_%kZZ2FgyNl5B9I?^5?C-=#`9IF3T~C8#a@fyYik#WEuXFl!)$0~z%FK=4w? zA}^t?z2#vrY;fPd9!ZCK%h6$CuNZ{KfoIFCc%Ncd_3rd2cs?Js&ck=rMD1GT<4EL% zAU?0W^$ZQT1B0izqUDtMJOm#|t@=S(XOf1>v$V+c`BloA(Z!pk7D|7=%!2o2L**Fr zZ@&gPiPm&2Ljn+U8M6BglPz%S$}W92k{%fba%rIQ)JM#yoA_sy{Q2T!e;>GPzunu)*j8<;)1U=n9?d$@0UeS};a&UY(E$V&nX zPZaqKg7*R5n$*oFD0`&bHAp;+H}J=1oQHV){YZJ0;d{8rHyaT}(_fG+)y^ZYX@a2x z&$9y!n#)kz*e>4M03HMewc#N3%10n#RPX`_%nH9bIoMcdUyx@==V|nd5QSW#4KK>g zFz3!ymW5H!OLA4dx^Um(%YlJ#f`}Y>OQ_{bav$jrTJ#e5u1ioBUHTOby(Bl}6xCH9 z_u9rUgF`q^{aywmu>KQHK;1O|WjQG3Q@?mLqZ$2HIJulLK+|d_=?yF5YND#;R~}{v zF*1hT2q)Joa&ovBhmm8McN{C07Spal=16+&6?tc4TvR}d4e6SyKmu^#03+@%@woWl z#~%F$vQlU(C}KMMI4@CI&>+yJZJ8#T|Ee5>m0S6$oWQ3dnGta3!mF|+_++_-pEO1+ z9&St^@+ZkUN*+SZM&kh8K^sPc$ep9yY8F_sjh6e>*}zYZi)+RWaY=)m*FqgtfaCz( zai5{_K2Gs+f%a|#jT{4zZ=lb|$aU-+Y)B}Gg3fDnVvL+@zZRq4ORULC(>Up;Tr<2NqL5FKBj{IPN`gi5!MldFxp6c}$5kl=V>be^&XIv_PL z05i}bf9ZmY0w#!G<$>|y-shvj;{v~VSxm_6t%x5M=dDnOcx>W$CTgLeBSuUW2|ZjQ zuLlQ&)EM5bIIV8b>T&XPjHlUnZ9Ha-2h2nppek=2n`)34nV*>t4X^Z}8QO^TKr@5+tbw2gl2bBo!1mC&(e3#x9&Bcc)ih2U#&v*NO58X>LK|Hvo{T zr{3oV@_-mjWc5fTl0Z*`bEAy{n%9UjObEk8=DSErZ(bw4pyyj$=vzQ&xSYmJlH(;~ z0UA%`om4d35JB3fLS}J@tkWPtI7khr$=QYl^J)GxY)dp;_-IKNB*x9{bhtf@|9qm| zwqmw64k`>e0n4y=Wu7;vJbYW%g8ak12TKN{4_)Z=CeoHi^$I9xQPTSbF4`_A?Ol`K zZjY4pPBFY5M$V(X>p`5FezZ4_6xjc0?^PI8;IZC)3=<(Isq;$&B~8lWg6Y&okQh6^ z%jlOkJR%;bM zC+5noAiRRC19khl4>`{C%VXA~UIllSu+A|;>5HLQi7 z!;OBElo!;=1zWWHi{vP4>5N^1D^{1v36}9+@b@%qsoaU?eVsLm{xhXRvcR1$`>dGkk$qSe-{lhU4(y zyYFoYVg?Y6#fLG+sfX#nr#J~df{Rg4cQcCmOn$un#6v}5s~XhB)AdcOE(ApQ_63We zeG>+d8_BgVWYji0vr1knzc&qO6OL{J^YS~K@36lqJz|V zC8&e9?6{Q`Wlyh^d-yMYiw~|T%FcXi7iFx(u$wcHjQ!{OEPXv0YtJbp)Wxv_XP;hP>{AwGgww)t0p_8AxD4hs*babL-+4d41z zE?O|X01|v@#$Q@)^flBnqbe6e;AK2|a&0=aMvi&tTl?p7Oh?V$BgtjpIjgE;#YL8M=*M_7J++Svd}!s`Y2|RlYULVw zzH}2sXyoVeDhN5_zmSJNv`Y-A#Y12G|1g%P*5Y=0jh3vHAC>k|esN7`F#DP;WdBkK z=TpCwYk{g4Uws}q*}jBgaTt}~FvBS5S*axzemu{86CM%D6$ ze=kXO5cl6`rK;Pj8ynq7HFlr3^Ue2z8Xam|6ucB#9Kgh?R2f_*e@JTl}7TzLP zq1Yd=JkW0b0PdqZ_4z^m=OhHBORTO$afiiZxvjY#kl+&PdLxubGx3g9qU; zdZg$EHKg->z)(?r^Z`1|WYCfYd|k{L^3rAce1-_@)8!7hoBbzxSocY8u#T zduCJ#Y{G{L7PYU?ufIU>+nsLwA}3kDI>N1NPg3G`Il=tN$ynzW>WQz?cFNrj-7Zg8 zfV34n<;U0CWw-g{@=)hKD#0tM``jJ>fz{M|hs?9?=(b(|drl3r*ZON9t=>_A&~#^q zY;#m#vrM@=fsu-!G?4RtAW)T3cm4&T>x)t}bSH3r)-Q1G$C|iIhERkk)D6ER4>Du6 z4K>jD)2w1S($Pq38m#K8RE)m7*^)edK}e+ZH>^(f)$&(ZL3SGN5*qpLyM#vG2$iY3 zC`JSy_oX?z1iCKUB`5m6@rG5!;9v^>`z{V#y1VN?pqs2)jA=xpP!|+?^i4S2JW+fr z5|{iXioF?@W!mh3#jA^C;giD22Hh=^eXZ~4*y~>`b04NY#j@MF{d%}s572v~Sgr>j zr0@Tu&wtqT$@U+#jyZf>ze3DEiY~a#Vg6W;ZQ2`bZtC}|Ec3n~g)r zxm_=-dZ4sqw}8^s-GI{Jqv2{Ipj35_fRe|C&7-w?aAh6_rQAJoeeCFUdjxQP+XIQ& zD|CGi)Enl(!9OEy{&iSoLdasbF1`^72$Mrulzc$iv#w_FXQ9L zKG--RH^zRs(ZA8uNZNP-N{&1G1^himaN!>KKa8Y40RKak;eSY9!0^ApU(nh256D5* zKQ@c3IrRAfsFI<_I*57AUV{J(fPL~o$N{0_>WhbtLt7BPK^$SFlzI@FphXA4Bd?%> zgL1re?&2^}qx7JBTadeBG;_bK{10>O@Vl7naqm$1`6R9`o}E{5d^|8$-BSw(HgN3^ zZvzkFnwaaE-z&}4a9GT>`(eyAKR*^mls#z7VQsFf@UYTc&uDWkKP={IJyJ2(r71^n zL!U;eB~WAap`sG`IeauO6}-yuQn`uw=32M&6Ur}z8PZ8QQVJ}bLbppHz?ecwWpWKK za2`yO@@$!$i0$V|IuYer{s%HCh}0+#5Th&F^79OPrDYm1LjI66s(Tc~=-!c7&TCM! zqvF_{dK5EVcp_F1 zbWCj3(Z>Kn9C#uO!Qx|bO5<0N8d@X%|1@r~RV)18xDk>NN5j}8yr!SolLmsvRZ2fD zwr-!}V(X4O4k3Pbx^-NxNRsv-V}g+E9Co?7vwWlnb`RS+RsTx5Cg{AjK&J`FuN(AD zsIU_AFeO3OBX7G!cC4@y0)kJS!0gZMh~p5XDcZ9GC*%}R^|$_G01u;A-7Odonf2g86M~8CV89pU^~eEWUT}z`)f}Mkzlh^a*8?c=U9kgN1hUh`ROUS zx)<>tM*RJz>#cAunw+QQimWviN8n!)@|e{bS`}?0&Y++_Wj!GeC-Y%5^|vZ~kyMAE zATuROJq8Xs`2>)yWKcIV9XpN7Sr4+G0YvZp5-Ui5+8F`LcPc=kk%kA3p@)GITye7f zU9Dq&K<+#v5a~}ek2ApkPuSFTr*3}&I+J&B=uG+(=-izS{P|zddA~Ar($D@c(3xKu zI`c_AUl}^i1rI=n&YTrHtMNHNV)^!1#K!4CPo5Ky$kQPa>cQ&&6%q?8AaU=UfJBw^ z0uqm$*V%)Q^`?=H<4-xtxmX_+__BiA7BH(z&&%=R09*n$swWY^^(Y#!7U&0{{Q`8e zAMyi`8ef1A7nijQa+(*<9^9n3J&2Po1UvOpy<_j4=V3eb0V=oL3sH)_s8KnwN1wh} ziO7$>D2V*7i!vO+r?~X9Yb7v`XEO{emm@8RzKM*?R9X(|mR=6(_RZoTag1e@%c5`UoOcAbGPJN;l;+=Q{nR>N)gt zF3Vj6iT|41R{(_HF9QfVu;}b%?L@441rz&uZm0+z+xm)N$2=*z|7mDqPd;$LN{J6j zw(E(!E!dN#R|F>BMf2E`aaZLu;7u2N{3qVn=-aD;YuKVg$eR=KVaW3UgtqESDIl~J znuRk_dV(~8L%pt5!l9gNI()t-_jL}RYaB^{Oo%E#XRqn-xeg4|F$Z|D4NA;fa3Sb( zU5?Ul=qIi6jO(bZ;}7Lsms2^`6r-{iYi?eLXsSE8Z~Pa6ym3Py$WDFw|9U4BnKX)S z$UMk`QQbwZqL^^*I1h|y;^qEY-V~cKk{A42laMw#~h#@ z)LZs?ojnXK9-t|QJbe$O^S3L}6fTUQrgyM(o=wx?jyU|^zXPz$dNU3;h#s`%js~mC z{Ncn;%pz@GmAe8~W&bgnhn-(w1$dB&qZMG*L3GSB%u%%at^m>1yRs}O^B*8c2bY9U z%ujMfYO@DP@34DJ07bV}9gZy-Wp)?{c ziR6x8E)_vOF+()+T5?~t?iD?mCYRN+_V zbKcG$ep&bjh$h?5Yf}J6FlV)b8}pp)3TV%q^9tW~;gXW#D?~G)>Lm#S3<#sAC8cNh z=y+)1b@*QvEeJaPtE5!0QV;U*{sx8fp;z>gdNJ`~JiOSU!wpJkRSwy!-YS5s$VUyx z!oBeu0w>?ZQ3fUo_Z1YpMj3Yi!`lW$0q2xzRNU4{H^Wqapkpti!kN&U-llXoJ<$6D za1x!YerG@;oi-{CFrl~f`k*iR^lxhbGzhWcZEy3Qk%9@msJu_#FbvtLIloZhB5@44{cp~;07 zeiOC&LXboG7Uf}l>jQiK4Xp~7_};N7UeQh1oBDJ0;w+b%B7prSEQ&U#h0uoGax_h~ zDpdgTWmbUP6FauZsvte-T$>X5ze%_3leJDbcRJX{k&)iEDQ-BNAmzbatAga--=*1U zyG;p(e!Rq{R56TSO!>Lp;;4$R;;@RGd()95irEI!rOf{&q3OG5Fva`Q{iXBP+Kmeak&R#aQN2?)&4z zVzq>P-UNVHSkj>hQAq(w4s9Z_4kbaWH;*>&GKHJ9Jbvm^HxX-a(hD+8Kb03uaehi* z!7HIkTa#gyn>I%(a=~UlEvv`FWNg-OYgOuG&9oOxFHOjj42KZSOqx_kmeA z|L%gB$Y3Z@108B1eyTqABA`m%rj3$UVatOD@NCKf1BCG$EiGjB+C5 zeMFfAq*Ytf1vk*bX>_rzQmw71$lJlq?6OtWZ`t1L6Iy33pL^{v7*4Rno;9Th>Yrk8 z_=BL}%3;ITNaLE}h$zT-REd%dYkUg^Kc*NY!yoqf>bp`Tz13bxf|he_dqp*@pH^_a zy|UC`IAA2{(A@|s=!CWV&<#ykG5yg=X$rI5_|8gQKsmFs@}%j0mJ$8{Uu;1JhAPT_ z!~VmR>EESlAXg%*`w#Pgm~aEtql-@-pW+Dc)wEpN%WmXuuq6bpL`sn1#!s{?Mqxaa zPuX-^1YL&5GX~!^n$ECC|As(SGl{EbJh&N$=72n#uqvpI9xW`eTciA{5Ow?l^|cxLtCE zz>aX64-ZFU)>W{};2ffVU0m^XVa3-4+E-ds3y0cz+FDDIWAej1`5iRDsmoW--)3~~ zrH}-r9W;<@{9yQT#_)U~jZaXnO3Ue`+8Ea~I$T>B0=PU@M@ckHb<@jrl;`lXtd6o4 zke!>T#5JFA%vB#gLm1bD-9hyY>y7yK>$X@tc{M3`YX@W5_t*_&MF zo{n!k`tg-Sg?kd}8C$%fUCHZ7$fJi+f1@wlk&_fH1%`{<2U}=znbg`t>(B>y0Z$sc zIG}uWm68p{UYsr4n56LV-_B$u4m&s{S>Yj0+9WGlz^Cdku2#YkM?2ogBc|vrXb}S} zXo1H~v8o9E%0niUB`YFw*e$e${ye3%4C{JnN~x>Vg%?1A#@Ko%RN;JAF*R}63g5eW zM+ch8nK;zuTU%%nc+lyMb%Ele=s;bCyC7QO$$?pikh7i=i$DqW>M4%`vywHJ{^|8N z8W*gtr}UNliVFe$WgPt5S5Q={(kN!3L9ORyw7F8*w<4@S!O&FTuasGED^2OfO`kf; z%J2A@q==sdx%CwXe?6@MI3&FOvZ0cV#gAyDG(rCjc@)49dbW|`FFa6w^^f%vsvgZ< zq$@3Iq||}svhEb&;er0ua@kjH!hzs%IMH1rbnhWN|6BGVU(H*Bd(;fy(JqPlH&z1d z+z)uuD(Ge+NveV9cCksHS{%NrNJI{&hh`8_bq>RW=DaU>$~H$_5u`@l(^zSN4bksd zSQsTWQ54Ho17KfBGylN0f31n)i2au9dme!17ER{LwN8thD390uWpgal?I$HTS!gA- zi39GQzyj*z^|8)rJbJ-*NJkum+?MH0m1nHm_!ER0$a%kQIBjXFG&FBq8iByg_nRt% zV7+ctf27=LDsG|G>N}990=v8mt$sx5kA-nI6FgQjKCm#qP}!|&VU*oW>0y4;ji3R# zcSun)CD^l4{(1lb%_)Zhn=46OpYaC7^Puj3td$mIz_VDDbTk^j$rojMbL<;@E^Dqd zwP@=?XPPTK(dcvO%1DsG!|6%}=v7@+>FOPv7F584N8{cb5=Qx1JxsJZrnZ^JpUSrO z-YcLEcc#5Mls%5f|1so!qMm2S`zk6|3^}=lHsrP~Duz6%g)$j&5Bg872jhe$ElkMN z)>3g8GSob2U#Jw4m;PNn$s&>@`1vBMh1kg4O>}xoD9vF{rc4sT) zQLJI_R?5@(*wjj_VHsU)t+?raE2Spl5*$Uw_(B|aOL>N}OvhSeJ?T1Fo%t+3-YTRmabTPmVGah3|J!Vh5p|^MEnh!;^S| z1FFmL;$E;1IHDZrbkr5R(R}`=kpC&gA7`R^!}A?XlX}JTmjB?@Rq0-okB>v0$qN@F ziPdASSX$Cm*$9IEbT?&4)b=Up!)fq=IW(tkKAg{RE^~v!$X}5g7Km;=C7f-YZK!O2 zy;w@@t}Mn0UDREvWBI|?4HH}{A38RKLV73-q>re552d>0)Kql1ieBuY)USUQ-@)U# zeA=Kn{)1ceV^E^ZB`Y_$>;HfQ4fk3o>jCB}qu_QA1xb28vIrivplMGf-)LOzR`W8q z@$ip^C%_Y|rm!cJ>hj+AV(P;f%cTCcIl8{Vg)go_ZXYo(o1Qe!sGcsgtLKgCrJrGI z>?|-)s(EfW^>5`iDe4+tKNQudRE7i~arAAaelUi~Y$2Ipy z+PNT@PmTlArbV;XD(W>bToDH9UO10?xP-mOIx^jSUKgihG7b~c~@Z-Uxnie z7#|#B(ujBy7~11+b>(H^&H6puE|^K)fO9oT{gkjrxZj1RLDi6RPvv!>_Ebx)gCIg* z<91u|;~E9Q=b*7qJicF{pn5(&O(djSrR<-7jB2G7#+(f=48mdqerloBWghIt>CWNk zixC;IAcJ%p8oSpx%cB1Ak;&!j+-9WMscj<0nN**4@xDlf0L!b+@fPvLJP581RZ z3%0g!YVb1XXp{&0;64dhQN9MSR9B5Js8ALj4gplwDf?XSF0&?Q4@DaCBJx!}fOiuZx5v}nl60SPq9z;+q0Hi)KQ zGL=S#1&EuLgRp8TBaIH~{j@T`m_MZ}r95&tJV?#gw_CgcOQsfWqccw{!{Elf@b^BE zfo2#J8nL@khX0}5XOvEeyIb^(k{tN^ww*q1u3+bG)Tg$Q-vFh$XqOF8YK5&p73aDT zzUzI|!xGkyce!~1{1Em{Xy~H4o32^u(*a6d3L1<<`X}l(Sb4;-4vhV#x8i8w)=)Q< zt~SO{dduNy1p@~v%Z>EwICzB=HLE&?hFl1-(Yb6Tz;M`1^~!$@D+qoP(T=2vRMvF? z9P}Q$+zr&WYTP)-T%*A@P8zEs2&3?6iMPTIz~HjBuM%%k$4i~LkZYye&zSBq;{lRr zm|cD??%(%8z8-wBzU}sNS&%yeyT~vIxkSL}TKIxv<=ew5nKx!06mRM*z9V}E3K<-# z4@|m^{N*_Q*0(ckTyYQdarrFeSa8E9M>UM#me5#YJQfH9IB7pI2wXOSa2N?fd}tlE z#W2xtj@yQhu{mx##w%Jh!-QPD?~|kLEMzWit6E>s+U6aObMW`pm-HeAKJbbnCNcrXXiwFUF87`4m7M~(dfBg;E>&)i~Rg#sMM z)PSTe!(eP`2QOxI`F3{X`;t1>j!Wf+_Hehi$5`#P4Uw23%EAoy!qbe-jVQ5_-w>s0 z;I=ccABSVdbZ&Nnd^F>qz8)H;o;c&=T$j;vOd*}Bk+O#>0%QLH=hs$(cfb|rv;OQaP_bO3|jy0yTU2-dBtg&eVSJ#>CCy%aQ#5?SYi68 z=L;>o@P_BZ@`e{wLyUwG&ns1FVWS!5&PbLfwhjb+%l+#cB00`+Ur+-GPrS5J1Wk5M z#B2@P_tM{_iEgXd!k&!0R&^Upk1e>hti}EI;L30-kU;{bQQ52gl3=KUwd1BO9HEnZ z9PvJ!NJ&+IxOi%!d(T4v2Hiz=?sRy(`!_P>wfhvjj;}X5J!KA6BJ$$0Ow#}3aCxXq zo&;j?HTd3W!_67>&0mMxf^)|juf_!psp*w4~sSH`FJ>i z1F*EzCAvJsg-n#|7PY1igQKj`wg!N?k!O!}RkK&K^KDk0W1?dtttlE9OGT6XnjlGY znt!~B`vT$+;a*1gXp0SONarUPH(G%O5mJ=HuD;`e0!R;%;iTO6-&TKdY02F=|!x( z`~l720KgwpTOJw9(~2Ko5%{#VU?un=U6e0QK7=n_=c_I^ zI*)<_{KFK%z;V?#AP1E?|0=#jf9<)^xc=|YxRm$9qV-G{+mfZ$gm-B2#n%U9cNm*l+62nf&;uh^f67YsFEbBW? zDU^0n+<1Is7L<+$2MG@URxTLc%!02cXg_zquFSIR40ChWLifFW2-Q3hhba$HTWlN{ zPTx#adPz^_Wp+uBB77aH*l_UdPqpt2r^nt(de8AncGM2M~EWUyzF+>aCT1G=*}^VMSr%EArSBqEETHbaYv-ER5;Y1YnwZ!~1T`9!B&Hi7(L{|3#K;&MU^g}} zMvN6K(OAJA6@_Rlv4IsEe$P2~7qH}g^ZkEcNq)()d+$AW&YW}R%*>g220GYrI`$!y zBDgP$p&8r9z_9}7`WSc{dsAUAyFV=$W0S#D*D0l|bFlRwjql7D=serW`jIVI>%e!- zR4l8bFsoSJd+Bd8jm)_K5Lt$zRa74-_h}#58gWQg=!C2lhN-#-zsb`)%^q8<&D5_ey+eBAt*VQ5KM4D^%%S+C%S(V;# zSj$zu2&g5B+V?`~z)ag0ps?GII9dX%+c1^C&P`qzrNFv(0u z=He7@KLyXT)l=?QX6EEG*U4M+;Mk0#__<@vG;N-(iyAM|XN2tbr`O571;sS`B7n;J zTnWnSo5@^{hbSS-)>d(hbt0U0X7Pthvfzn6L|wCOuY>-~;)-y{mJQi(?(V0;Y<@Oy zCEH1%nZ)@pzd4z#Ay8^WHzH4@RF z)aF3~uF8Tn_jg#`FW7H1PQl8w7p6Etu;Q4U6@ELj*k-Z=>=}wiINy+s;n<*5kOU)P zQ_EH?wrzGSkTz%p5|X7hBXAwc4f9nMc)#o$SYK%mS5@29I>*+<2D$W8!PvzOW;6C& zb2xhmR7JMOL*HkU1*Etzg~`l*WSg&cI1(`N@)3+4XbjlRwVi`tK`AV5^ve=kZ5sFc zOgCS7o6uDYd(6il8+vx7&l7XTWu4m(8D3R`XbowTNd z(f@SCUf9?2R7VDb!%26X#;t&pt=Niu&*bUaSj99dE!DxL=ZQRW%BkH)LnSv#G`>+d z#E{%ywlam!q3%)2N}F#B9yRVFmAVX!MD{& zg_OP~%uvCg6S(Q`i3dEL9vhf;@_<9Dg>qpnQ5$LUgwH+HOsyd6#oa*Lu>>B<-uL?yS?#w~jjH;Fx$Dy_dt6NmYVw-oYH39-e+WlZ&&f zIGV7=_BK8)t+6qn+?Rglawz|2TPOS&;^zq%&Np?gRC}$h6Ne?jY&wN1K`Cpo!2zXX zt!)fjD{dq`fHpGm$my0eXltxFBR@zxJ3j+fdHyf9A<93jRQ@%9ciXOm1MClqT?c8x z2hEO;@;;EQXV>wuix$-wM~?C?A;o$u-ZOaMyq>jT z`Ag3Z2o;B#ccIu(O_LO7`5pKe`m0TP`UY&zt6PL(oZsnZrQ|7-Yg0~f6HlXMc({9n zJX7RV>ta|(zizNuYGc;B!zyE%90WEyPLYQR|#H z*@tE4hSjB}k(+Jx+yD;ff@!3txtncW$Kjistg-VIE1Ru4=ak2agm22n6;1+7|^h>Te);)5{S7H(N~RA8Y-A2QT;uf)pl1vZhZ&= zs${-4W>PTwfpr!L1~4h{P9wYG@bBszh5BHCT9iI27wb4zXDtEv30&p7@KW{|rq3eTg`8QyEm6R{DFaS;nKrpz+QJ$}|0S+}A2jT5^^bc;rrWJdSC-{L6%qlL* ze^M|}4mJWfg$r^|kJUL$Z`PK(Y+rMA0Uj*1D`q)sQ&K~2vUz|n zW)InS%J_q#vMhg=H3=rai#LU1Un{VMHdRPw>{A#|W4IP~@}Y%8?L+KtfON!uXL#3x zIp!Eg6&65W71;cZoN3%jG=tl6vowDbv=Wa@XIwB` zTib?kIw7Y~8s~6PvG>4j!iJ4;3N$!J%AL|$p6f$tiTy0BUZs~m99FL?R1Vk%B|GwF zGY8)A56+qzF(xpdFob;&djq!S21++LOj+xOJRM%a;U!%>9-$cQw%{mA_Vm){*|yuf z6cDpe5UKPv*X`f3tm}xJ_^FvRRZnk+9zSfj>>(WvdN6SjSFN zOmuLUjU`NHR{-#$u))DLR5JHvJ&C(*tCgqysA%(XbH?ws#vl&BBmUHHkIkRv&f`13 z%?CjG>A%}T6o1m{-$8U7Q#{Soe~+!J`W`EaIeLA7KW*D%8_YU_P>y?#0Cc+7=EuH5 zOZ}`{cfi~E>+{y`wV9O4Qf~_DdmxZ5>_^x}Zz>&p&!5H))`Vw%IU-Eq#&J;AAUys! zL+X8liVt8Xd507S@&3Lf<+jJ6#2aQcg_i#5re>BCB{k^}gr1=~4JA+X3^F^tY6^)V zs=$bHwv>JlNAl-WwSXaO7d^~O`wxO6Kx%e-&4EHze$WOKXeyt4$%>PZ@!^ykHPD|9 zmJFCn(~4|A;8JuHq|Ck&N^fH};;VGKhlQe=t{S1%Nb7gd)kDy3r%+Pi00s+kcB7f$ z%i`qIs}mrnl>!S@i76Uj(XO6_TCycOsQVFH1o|}Sah;Cj-L&)PboIw(7K%HHFqVIQ zl}00_ZQkob`!rD>$}htiboY^38ohIJSXHSU;GZ40N!pu)H?7}H%Z}T6>kNTc_w4Tx{F8A44?$HM2 zHGb14xSkvJ0f2VyL=WKub?JKEP+1!}A$a!X+i@Jv1zUMS_;JhtanS7jL|H6=e zM`Ql7^;5*<9r_E-0UY?M$md-Ye{6iw_9K=(E5lW8D+li0MVnclHCbEV#YJ#o{;-*o z$@P-$b;VNZf64X+^8Gbc0)g)>ZjK#}839F?xW43j8G2w`-pI?)?_lU_P|+wo_PQBq zHMV*|b8}p!VCl%|K$s?P;F?3kx&>M^RNk|%AI;gZ(GBS4O|IC2v~)p+V2{0G;}-nz zD+niw%d=dyZNxBV7Iq0%nDcI5vzZjCw}FwTI4uUyn>TDIlX%0{&h%i1nxEOd0h1=# z*jn)>K5y=z`8RC+l_@Z5%lH9!w=!D-V{Vx(kTb$a=?|~NC9-~+nl6>ujQa0qsNlNg zSWePcGswLh2k$@8sB+%d+;UrU{+K_NK0>YN%5s~(K0R02z{N#$!6Az@C6{X7wDnO= zLG*s7Ax28Q$(KdrMx$iVz>HhAu8P>aZntnQru}+3=3vfoD!2_>JeK~vjgiAnafg32 zl0V|^*j~agSma@-F6?FH>c6)kHZSK69C~ay-$)GxU?dh&{PM8xT%|dfFx2#9(?))yY5Mhxou+30RHkE5hETgB7+p?7^tcW=gwS#}jfVqacup9kdWiXZB17E?=B;BkdDYWZv6anCUAti4Qw4wt(kLxtSD~h%U zhQTud*>jQJeQf*mzmj-HCh`2dr$`)5KRvNcmq~n~RP@tGQ}77egf$jdwk6{jdKKw6 zn$60;S5f_q=2!lQxa_#eY_B1mJ|xeww0bn+(10|?hRc>Pe3V8B)07kEP*SvD)E>Ny z&gRUa0{6O*L6p*1NK*ccSria~4Mh zu=qx4)LXvvmR1;yD4nF-;YK>564en3_iFdA7ADO;>0=??71fjjHK$xG-! z*(^r~^3VZAja#jUuBIwx%6D$Ph&wMK2A6mB**iH`E|Gle6n1Ocf4w!$aqAx!aO-;d zZ>_G+kXv2MZY{~E$!j`n7WOIg_fmF%Faq#Y`amHSp#%)toXSETx>8=Cz_8A*1_~n; z>*%c@VX1PRf<~9wQ7}7LXrsKW$Y>vGq~XEBG6ue>l{A??z0HaMY91maC>OvnIO?8> zazX?i4aEv*dUBoE8EPCgtOB7VL~S3hp$BtRF{(LQg@5c99mzpMVO>oIKD148 zXDtoDWz3mKS&09uU^F)wlG{0F9Jt(71Uw(>=qAZ%+?X@_>sQYiuLc4(9D1XH&<-Ee zKzGY$BtG$Sd!KQ!aQTOJhBQ0SpJOd}c!62_|q`DDNEOAlV1Wc6@hf53{fQNh&a z@Wub#S(oP>DcEX=4G4o&#dLYqt~rlYdt~}QEO4Kh7g81J@|`=*;m(EMKefI`HWR{> z-&!fPnXnotmF=5zA!%*j146Z5Zyn_~7dlg~PC||@4IwaAy_9vIJUR=tP3$WSD3t+~ zBJ>O~k^Oyw{?l0)#)?F&?ksfnTzH>j+gf$f%=@J5BCK}rk3(?S$cWpaq9NWkD(fNy zdC$ac@W>!x<=P$>6p{#hSqL;bp2g}=fB3Eyp-$}0U0xP$sDF=87${rY3j#Xwdee*^ zT0OnfLYV8xA{u9Dq`BF_s9@!36IjhNM_PkbV>8M6OL=YO`8<2`K3E?V>uN&vZHC4EgM+f0$ z(u)EEN%9v37DN~?^1;y&LK<%PwYAU`PhD;;#PI%SJNs{I zBd{uYecNC><7i78;bTWdlr(q{c*OThZ3R{l#R1M#1(U9IM11r65b`~#tzbb7dX41g zR81`!D?i)Ay5u?e=^g6^)0la+3{>7$XpN}u#_fbKR+^6?5#T|8if$+PdYicl3|G(MO;o_G~YBXtVEzNrAW!-(Fw^XV$dGfPG4( z?FCSQ=d#ViB(dEY_qv?YcQc5SlG z$6&XR1g2B|kNq*y__01^wILG~b_@!mGadM_HlVcW zDgK#n&T5KkhK85;Zw)E^&L}@>_7ZfGxV(!m2@TmO*XoGnkBUkiLDv!#`V=gxQGg|~ z_9}UwOr3-_ie$>2GZkgA+J#7z|AB{=ybr(bO4CHo+Ibth3O^~7eI+WGe$zki%kIJ> z1w?o0xBE;qx~Jeu89jvUFhP)xbjNI>_j^JT^`+dN!hPk}CQ5nIurB+I6FeA#cKXY{ zUGjuDhyXRylqmP==cvm0Du`P^n_d-Kdgf;9q*E@^%?qq5oZ>aXqFgnT4)zxY(&M=1 zp4dQAUlYb)t*B^g*}HzU`W>My_3bSfxMWwOZZ$TK#sh^RG|;D&hOYO9-0tP{dZ5VA zV8P~?me>b1d|FC<__TBwLRCr48ppKc_hDLwt-fudxqYxV4gujP?l`HjFQCVrRj9Mh z)rQw)kYF@0=Nx=n(v|7H(l!@NCAZgwhOQssA%y1OAv&EP4AnVG0AmZ?_`1*y!|OrU zO=UJ}_XZzD&&;y5A=tD=husRHWc&u+efI`ra2y5o75af&pY#>ZV}Sd=DG%_(w*+=p zJ-#2LYAm(rFTBTDS?*-z%KlZX91bqF9w4yNIk^Lb!JKm@+Iq%prYl2*x4r!Nx&byb zjskm8_CTTC3s@EuDK9St4k!{Ov%FNRQn6peJa0EgnI)E=j*?4Mw6g=RcT{xJ986CB z1#8C_*OCIjwx0)~XCKj-LBhA_QDQvjQV2>)SZ#=Vks-`jY)>eqr&>{lEbLYoMZV2B zCA=;4GO(F+$I*Sf4{>4>1|V2sh@f*$DU)nuac{1nmt=Kxf*ubM2GMu#2%eZ{;WYYy zna?xWL-hC^VKUe@aqx?ILN^8r46e&jN~tO}`$g=as07Dcs!Qp!V_rCyyqOZi=F-s$ zlN14-%t~-frTY9CHkC$$IjNiYi^P-hPb4T)7(O#ZkPLl%SXA=j%c}l{Z87X*Z*!swK zVI6&bff%XvC_$&a{>V>ifEm$kl+Z}Sgv&O5KW9u5vIMpx$!@qHIqO-nZpV%mSWenb zin6>40|{KAeWL{r-25AWt%eK!c{fMHlu*Rw)p=itWV=S(2g0Z7w*eo^27}`f?8wwf#uY z!M#&RMQNLT^ZI=xELWldw@(Fj^ccS$dUe{RvufJ)slY2Pd@B5mhE-JfAkIWR|BQ6Q zE(Z8c2FhH1=e=>XwTB+s*yqAQJYBHwZUA-vLU==&s-oPN_Zk7LoZw1Zzkr1;hftt0 zq#Oy)-M%RcYT+=`JPy?!=Ou^uIbw{Yr;8Df91Df#9g6F73Xvd~3pf&Cl_w;vv+_jz zJAHdm%so%NYK<$v`wwl${A;fCU^PTurxHXmFgP)l;R`BB7UH-z0B#4mqZnX{Fc2`X zt5O73Zq||z^g5`_eYaCUkTrMa4puw zZ~{TLls&n&N$1Mlh78QRKpkcdmao5L2esJ~4gM6<1KjnVAQ)So+|GS- z07!RX2Zy!rv1hybv5Sk#V-FX$fN*w#7)LG-q=_I4AoNhw@Vi!^-WuZGO^(=SBmMZ5A#4UHkUDM=}OZCvxd{~8s!J!v;i|Dj;yX7Fv`2n$fJxi zHykX1r`!aRM|ssWAsC}f`=$wX5JMI{SunG&o~c5I+Kd<+P$3q$#POG^6VDxXoH4V} zNlL|Ydx=toudwY&-qWC5r3sVh&UeDM|DAh3Jg&jLA09u?Jzqsl&J{9t$(&nwQS&_K zCZdJ^bI$SiKhL?sk*+axMT7s8BMMB_?- zzvzm_Q|lqkJMn^NToHIHttxxL6*VGgrSGmkcO}BR;M{XRh8dNxrKOeEUT}rQwn#^d zpSu!FAAK*hVn%n#9e`y7P8VjvLz*;0^;TZW z4}v$_WYT8{#mvJniiEEr;+074E5#vW?^{7!;5R<>Mj*X3Qy5|7hCkF%w9i^+f1RNC z(+_Nnf(J9<^TVgqE-)Gv@f0!NoEMmY|7^m#UlCe2F!|IzMm;zatxW_@rgj zm{;H9i`uJe^k6Eq9nze0Vo4<-;4s=8@0L znorGgK1H6(FeC5?Fz?xn=z*`85mx@loSKi!t9oRf1a=WF61*#8IlopByj+mlp~$VQo#uRVuwt&i!1)v^MWjc|R}uMF`O~aSZWxI=w>P*YB>tzRqZpcc-O}zto+=Rml0Pv9G_i zlJDy&EBU^zUL_=8z?$&^+u@w+Y}WqfTu7cyYYkZD%{l8mS~w>=yvbPm0p!0Lf(zGe z{JO(9WAl34YVPiIMWx*G4MH$&SS=U~+qSY(>2Q_cf+$mI<5oJk8Vcr0da|0&Z7D|x z@>`wl%Eyu|JDn^@mSj^>4i>>mO3mRn7UjUJx01qg`M3C7A%@Y=PNtFP`12IU_LLc6 z_oMv%f=AR={%V#ZtB_!r$feh_pKwJ5w_(c%uy)`ggVxLvSy9z?WYCMW~BC^UGg^z@Ul8{?**8tJ$u?gxyc^n*<|MC`XlI%MsVX zt%on83xvA#D>rEMrR8J551_C;rtqhq#wI=ht@X zw+UVv=UC6)RLyJ8bI!q481~ZjO~QC^`aI_}ZQLyA!egrdnydMFL8i*gCEtZAPPo#O z&4N+Cm(-jSUJwmi2qA2Og|iH}28{gOfBZZ0y)RXf&*tl;r{~MVEj9Y^cg;TZ*eZ;N zy)$Ub9V3nVQ)od!`MeufpPLrfYIfsVjcyFg$I2k0G5HSCugj!wI{EKNcfV0ZIvEOT zaK2|j71hyfftAY>JYXB2;5TKqkJ`p%)h#X(L?r!5OE1fcM2)$!@G_shY-4mx6&XRA z*_PneZJFQ|r~W0ucd7|)x4j0zW4BikT-WnnO*R*9=ToIZrg`oTPV;?Eb8|-X@y%MU zq1B-I@MgYi)S&r+JOa!f_WA2ea|m|#)BlcQ?}t?sv)S?R>DjS-XAQC+*Ce}gCnvj7 zCVTI1oNPD?uq|-1SA6{(tCxQLEUS~{xHv|(Wf#QXqkl;>rR{QxzZA+oQbYXyv8$S3 zvh0?{-`5m<6ykS0e;eFaviQy2&Bd?vNpD|T9btE+ftLl3`kP7_k+Pb!mH!=%s4+RK zPAPp;O>mFjL2ya&|K@V`?}B5i`1Wa9wR>vN+GCGQ>m-?02a>gu*0Xy!t$=`jSLk_1= zQOT(qa@afhTUq+RqawkNLya~HK_2N278)kONZluNfGY64{Pw9o30l)asJ2{JsbTbF zW$-=QYr6B%W1iAT8;H0BYVb%0IyO`yXX;xsho(DAZ+*&ypK=z*IA~ ze0R{%_?)W71AMN3>7RYqv6bS(a+3y&xYRx^5 zd$!Z?!$PQ+1HjtFFwrC}l;7U^5EtN!9LMw3`_N+k1{^Ukk+-<2%ev4R$@u4M{5MWS zFu#kGyrX(cy0skubV5Bf+Fv3Qy0n^5ufq;Pm(?Itc0xJ{h5r$R^5=h&>Dzypb7wi{ z4rO^1c{I9kMV5ZdYPobpi^&xZ*QyM3qm)+2bjzZ81$&bzXvLrZdr30O!F{EZ+U+#w zNDWba>PYpn^jz(@3GSA?)Z{3ac{x1UaXYn^n((*9!(F8)&0ijF*v!*KZdzMAm@ZWZQjUT~ixkAszH zWSz{)smHkrm-ifTG6FVN;Z_&j;VPW0czNenR4@3A74m{7?-Md@zsj_2sHUy|2?uQ( zYtT0P1ZXR+aCXxTv>mNLYLpP{zRCG0s&UbQ)g$YSGS-eqJTnJaMz-f`(>;YIS5MIzn3`{;HL>qSfU9-1a|7N|d!&=`Zvut-24HS9W!Lr|F zmJK>B1n6hYlG)A-!0EH-+tc#Xd*rA0RzF>STIdPFq+-sz{hV6UdWUPIrcWm45;C}i zP~3Y^zW1QqvmV#6LHu}%O&pfiRAo)3pJMm>c@;X}1>$is#desvXE@8@27>~H>B`ur@W7+!fqe&tqtg;n(XSqHC< z)!^0sa@jUuy!x%2>XgX5Ixh3-gp-0;N-Ys;>u*ouA>Z8Nac>gkmk0q|fBu8DXbQ^u z>)#0qZwIori-FsFCu?rvFIAa(Crjo1`!wIbssEo`6D{VV!t+cOWw2xTW<6~i#$wHO z*{N4UwOh5FuK($v^Q=tg_zVA%&JyQaIGr$ZYAQwr=c=We_n(eCnN(9rf663(cb=1c zPA2)hv$0rMF^uGlzd-Q`Vj{Se3!~WKS2{uz{Fj5`zhsIp{Y#47FF0SaopR7dm0@+` zFPT`w1%a#gmt+cmy}&8FEX!Z-i+pbWT}55cO&mvRrv~kr$fEJA`@J3@!zr7 z{c1JAXD-$tIOI|_cRd{#+t{+OXNU&o>sduZ{d;2$5ul%XO zFZ)d?(_Cde-K$CSJqLULCC%OyRWvhOq~hrr{Q1=ygg>ZB_<^gO@P{(tv#)W&A2GsZ ztx|vPi0u1hzOD;L=-4%ED|^DF$Fjs}dYwN|$$LsnN}5WK$o|tBQu2=@8ZPK)9ByY% zKar(QvNLfN+x2xJ*gy9Ydz5J@tin1RcFZHO>{7-J!JkW?6e>D(*Az7V>c1PuI$t^4 z=d1cF2V{t{$_)#5t1_v5ApM@%Eyb@*6;pS~yCiFq9!vtluvzT(qaPk^Q zXUmua>R*rrgC>+>%LTV!PSUskK+=chf>b3Qi^~NMSIC-4)pP_<&`qH=h?%S;!|_^y z)X%iD32;31TAH`Ajvoy&>eMvw;W0fG-V_=ecpxk=V=K60*Q!M&&ND{&*bQbfJ9cAd zc*u}oE^Y7sJPIMdZ6)T6?Ppvm>6XwG$77jUS0fY+sASe%YYF=0#1eyNhd22d4vGrC&CZP9~6{yzMGLQKS8X-4>MxKWtxj@ zooGnm*$ps?3el!WqBD~aP2N)>z8#8I+^QV$%n$D-1K}XkUV}O{2NhyIfYQ^H;w$Vi zrT8gc^oB|dMt1xdl{kfW6v!U!fh-WD7GFm4c!F9?mfz`3xubvrp>P$WT$4b9AtPw2 zk-EBy1JTG&u41ry8<1EsH@OFI@#jI|lA+ttoi7?utWyohp)QEma zUo86NtckwYh)wi7px7c+%tr1p5*H6>#75fUa~x5Y6k4%?YiXVpNGrbY%K4L7FwqT3B;jtNjnf)LxvB2HG|ElpQSdW7lIw;t z_~dPL!%bx1-i>r(mf~;PuM@lR7A$fLQSRb!z_-qE7o!2+dca+bLd@qAchL%TKC6dV z2Wm`b4{-*d39P5P0YdAo#eFkosnwKISXV;>JjKs}Yk$&HWc57?t~5i;vzO>q1@ZrE z-3n*PAU6+LAV9jHJXQ4i%f4RE*NJcqiIy+vC{RR*=wFm-~LDGZ+l&RZ0rKoUHw zJ37}}Y=kiU-Pu=+0Hn7glGceAi;Hrc z8@mmGwBPxP7R3-!4A}^ui?7IsBf7!8hBWd*u*L`H%KThODP2dkC4Y>7V(L^s3NebF z$a;+No$N>Lj2M6mxXMcJ#u`N{8-VwXVq>6hd&&b)^=>8J$P3KXphCfdb`=X}TByAi zNI8~J(M{(izZCwDCq|J)a0mK{41HTIc~f*7gD*9lHrOL`|Hn-gEH?(gEmV*(BY<+= z=;lqMM!p|Tzxau@;r8|+seuRJNc==r#G+K)%dBFMR7I;Lh=PM1g8YYFq?Kl?49Ne1@X#|Fxs9~M~M`DKAmcix9Qf_^uRj?ST*hNi)v1WErY_J&k%$oZ+n6J6Uau=NiA!^KazUDUKdBm-& zB|xb5@HXHmMZ5c;g;!iok$+ndA~Kx& z=FhzG->ozjgA*OfS6J5f6-F8qDtho`CNRR}Wk%CNMR}Epl)X79G}F?rzCufBeqtTE z7|NHKoumx|AwKT5i_ulb^}ZX1hOx@R#ArA*TC?mYKROTw-C!)KEn-(7ef6}6pKC5D zzzLiXk8bHp>zd5bhid`E!O-3(9>7p&fIY$fhvDdqQ88LQ@H_ch#VEFPffnDu!$ip+ zy6dTXEy>OJ)HFE2r$Ig?1>ZN(9IL2n_bYo>f#ci=5d?ty!6Zabx4WzSIvs<$P+9O{ z#*pKcja`s5p9Fwa_S$n+u@#`TLc>LymvgxtVlSbA;TWM`DJ5J)v5*K_9xm2a+{rr_ zj$K=!BF_j&??pUqGQ&`**2^0wf>%+YZmp8yKSwY~{_BMjllrZgm zI*tAHff-pA*z2NiR9YytF1CS9bjIKAA99|p8y8efcVO|T9C)9In}GUKSXVr%obAXz z!Do&96N;`cc2izGL|@hy>jT9+CjhyAC4re`10od0jGhT$K;iKToL$&a(Vm7k5Z?t4 zjx`Wl;KQS#I8r%h1%2L7yrURHNs&-sk|;M)T!+)bp^d~rkt`Yq@tyrUdbtDwm&I$i z#ZzLjHdViQN-T(meWhEC#1AlCGt*j_Rc_cMzG^JKf$ygpi@ni!bQ9iqQWJ4ALJXQV z#d!9nK~2Tl|EMM%2zbp*YnqC+kb&SOuTH2FT--xg{|`+`Bk8#aUg8GKRFg=Gm-01`6Ox4^o5#}S~~U_UY0bk!OQaI zVwgv2nMG>ERZt|UoO|d?OK2%S&1#z0+ zLq}j0^K8Qb=8cbgg+^W_FYT<0ijE+|+B58IM}WIWqVltJOZ!!}?S27)mVn(8Zq!<7KL61{#F^rQ9&m(0~8|sTCaLnGstXl0^F)4AKqz}Ju+QEgVtXRU>01D&fG9i z{Mg($dv6nkhXz=Sh8wUh5D7>dI-_Btlbyvbn5mgXJ0cb4%mdd|iXeKui&zWB8sfoT zjt`=5yNHc7X^6f?>TAmTi~Z(r-wL+5t8n@&!1je^?=EdKYNG=UB^I`@6T8Bvp~jMj zt!1Qvxexl$yk3|jlWAEmaU_4A2`XryFExEtY|iiX&&UNZ)|an}fcVM0k-}hjk$;xg z{xvZ{;ZV(EAZeL7oZA}~54XLwk8h7ju(aq{s=e|V+bT**0 zN!w=KgB5);j_a|;3fxS}6{spZLmP@K)@>SA#VTH>VViDTn{!4QePy5*)NzN=U9~T< z>RGbk>r69a>OBnK+;zQeU}(X|Zp_S$KA|_O+_51PH19r*M!q3_=bRuVNeKe%SbJbb z#b72|N~1kn;$u{oghlu$XvV+wd^sUx_8GH6N0uEh_8^0!2PAOaF#G=CM)*EEK0pyh zgEmxf2gK?D2_ZDfNQKDEDnah zG$cWcK+QP#OGEMoCOCG7B)^A7I+ZBy0rDw!G!}stITY?h=KiJfLBWBUX&Dhn^!{L| zcuo80uY4dEC}>srAxy_%VwQ52f=WGa;mes7S~@swwJW{!E^LB%c|+cXuMQkPJY0-~ z_L?yQ_V*ZSJ^~^w2_+E3pV5Iir(2p;4D?BwjS>KJRt?cpulK}`s+EdBD*X^@u~)se zG}`x}iGJ_mYapMI;u^G=8?f1rlK*-fMp?rv+%iUq?pXYa*|}kmP&xYtyHev((6G}o zZUXCVvvbhtZAe@o2ko(Vi(+z{-Maq=~aFxvh3_tW7v$#`+W>p z&uCS+LUE5W*=xGLcn<$4(FYQ=g7qq@slJ-v z@M?m?-5ALzz)^!_6(jlQPdLfx9}MxI{p&zQ2w6YHbcm(bK7ERK6(fH9r(#dMgIjf1 zJ{1Sxw%mRfjWpmhQR^{h1&S5|f&*zTROHz=fF^w=uEp52`&?{`5gFAr0Z#4DVaiOV zOP`BFvH!$<0TmCcB5ru7IdAS*$Y5Bg>GuW)(ztPOohUI48!S8}NmcM)n|)`0s+_e|z$koRvxER-J&dvV%= zL^o^)9T&Y&%{YwjHe0?1 z$Inp3*Raf2lWn}n(u(?z7aM}GiQ_>S+pN~?4}~RM3yy<%z8GKb^5%alz7B#Oe9NU^(b{XiRDU8S=FgOU&kOPF`|EyG zWpS#dnGee7`YwwBeNc(rsISK=aleV|R%9>|$lg>ZOAH3Ox_@=#imj%DE((;6Y9=9qMNRZ((NQ2|1cdGGqZM} zYz(k%xw1ZX-2FfbnFa+zMeV1Fv20PKPZJ~9XWlf?j-Sh>LG<*d?1za+oK6+}o>~Cb zd8n#4K9w(k1*zP*aYFv^O2grdiYBFrnF`8lkS_YOH7k8DrlCiNzQ=-IN%g1mDgE|z zu{D02Hy!p5ZmGcOoB9VaUS3Q_DxWSQeEJ8Gp;oT?K}^Md)^3Ivr(O1y8rUoSDPxA% zpvgDm)i_A$-x1Ke3S>B#xI?A5_NeI?jqc$ycDpzb) zUKwINwo-)*zEam^I96%^CG~Ojr9cwjMdEoN#nn#qr+FkYS+Im0OK#&0HI`g3#aVoO zsf@4}^`?io$XDA}y8^J+tl4^qcj;xVK*2hSEeqM^5Ei#>fd?!tkdbZ`ykF`tFGv~9Nd znR4lVYBvYxdUt8)9PvHnjzab|%p;Po8bA*k?&c}xidPg6CD-POU*ThPrU;nNyvj`R zFw;Q}Ws48+j{Wn+PFU;41>!*93Oc;BevWh`jU;F7Fy^H$5C`G0vIX3FF)S3ND4DcX zyQ@gkN}_DW$gn70UXB%JXH*%+Q_4ayoC}(kl)e-;#KwhUV3o9Zwo>=#oe81jzDV?h z8^uu;v+EKwG(brc_3sSH_km~R|+sk*xE{3JFf<`PB!>b%oGZu@i z?))}~5BHx)=5m0GMTZ3nUAt$F*w}r$96Qcxn@26d5%XvC$`Y*GPiWKTf|rS}vN^F# zyu_y=pcsa_8Z%3NtgTSzjrmFZi%pTYR){AN*>}Lv6=(f*jU?Cd#NLIYs+I6~q6qCu z%*9x`v{Gycw1z`ekapKZk*naXXZy-wk~$cDGeYib$xt4k`R_xXwo3F0Pn3>SCr`*e z$rp`zi0syrE9`0{xfCeq8iJP|bpgn5I!DA{BX5wafWqIvHc%YlQkT`DReO7xRceAS zqgRW)U?Xj3zd7r)Us=tE^5p-Z1S~gleS8nUHjyT#vcv9hR8`t2*rH|Qxcxicgx>T zXh>%sRB+>c&;Zovc)S*lqTbZ_7qJodW^ivjr8Ros?}38lUhE z)G5n^1ZH(Bq3rNVBqb9QBB<<1h1=}a1+d|otmpQ3(S(GNxH;w<$IX5(yt&7({O0m+ z_|1d9b=-`?zpTc|GcAwYz;E`Mm@on@e>pLsE7a8JjZl>)Q{zbqfvEkNvk}K^^Qj0Q zn)!&T!I5Rrqy%5R#i6?J-z@w$9Y39T#cEW(1a|U$wUWKUKaC zObmO0@`YbtpnNTz1pVzf=Q3^AeFIg~FGO*w{RrB5mMxAlZ{x_)o#GSU^`(Bl zL9!2%GkpLaE|S9Xhe_Z)PhFjPu5Ad z{k%B5m*eOT#{fT9hS4i~5h=kY?%j*bwdV8lP&15Gc1#yj`p6lOGMEg%qWsd>>uv$F zz5C+aHhiDB9${st_K98OL4hs5=`EE0*pJ1gq5=EiIKr9Q@Xr$?=%@YSQjq!T0r5?I zq_{uwr=16ITM}J3AdUvfuOCD|R?@M9aGUlfw?c=yHurCT!?=u1llCoPxs$dvR$e6Q!mb zP@pOA$tiJ|3VUf4o^SG5SnuCZREanV9~(;G?vJArX7bTxa=$IE%Bu-&P#`Yf)>syN9jIY{Q199!%qmJaL>vIuhd1^7yT^`qW;3FILUnqVQ2L%Ue&@h93anck2o-3Oy$3 zeNw;CNjVitX$vc~p>;tNPSTX-CVKT4G@d^x^OzXz<-Dap!H&bD4xoU*tz#IW?f*ZD z%^AC1WV7N|r`R-8ci5rI90kdSYx?RJ8Ls%XT6R8Txb9oQo_N-9#jpP_8?J?yaa#QZ zIidajKXD4cTjO*J;Lj?jz>Y;eFW8sxtCPVz8c*i!s%7lnXPpB0^+mk>e|BF=`wE`R zWAA7NkmWi*GAd|`s)hO5_=fuBdv!ohlkPc+Q&{cZVZg_i?A}4z!V-5tE}}r*FCh#c zKkxo^SZGdtkVck45CV#+Ol<3SbColvL?Z(uXe7X)mzF`rRFQYNnCK3~7+F;4s9;P* z06p0G(9@|ZT6-m+cEguA^7x~iA0xR^b}RUvS9KS)l-vuTUizEd3)}oAY}>`O`li@H zeioQ7j|cmb`z`S$$i5!8#4*f;zw;KH17oPqZLzy2)9hd*vgCOWN>52N(VjjJP{;YU z_`b669v!$RT4}@`(D?(+x`Vje-ekP%5aQ=9_+nS-a#u`bHhs=raY>z6$y;u#mcxKW zxGmSkAi^Za37Zdis?8~!L6y#rtN-Vfn&TS;F$6dS{S3Z#PWbNpr8Z0^?E_t4SliA82~I_{6Qg4VzS1q@O8aGa>bY3#9i>Pnmx zDEd*@Y^{l2dLoWj^+PpXEBjXRL=;?S{N!p#pAlp~fGzX%9BoJ=XZa~aZW*wBIttr3 zcPQ+dHMh^^3VW1tC2HX`Xdg^hTfM@<%iva`Yqmv`=-v*0{I(P@RJ7>HMnl`(#dG<3{FDwB*pvC;8dB~S{^!i zBV@mmB~$CC)5$S5hQ686-!_ICm$THQrbLzf7-ehhXRx4>wf5!M!>yy>ylU@eZvn+2 z>AK-P8r8j4ExP4qU+FkuY=fPjoiMJ{+1UwWLFYQo6GnCgCydv1b{1os{k4G~F6Q?5 zD;T(O->IpqyFCV0ae0#=>^RZTbO<|6OsaPik1CE&FE7`?=8mXi-*o&$2rp~@5=aHi`;MV?*Xfz=MNmwaIvN_Nw+sKS zdrjcxY3gkcd#Yz<>bdbl6Rud5D3ARQonpn&`aJZu7 zz_;m)kG(gRjx_H{kkW9C;%eF3!x?Sed=6ldF{)Ro&}a|ES;q{kHIP=s-mgtJN-H%u zkQ+;Fejgk{F`v|}2lb!Q*9T!6=}-|&tNrXlBQD@xJru2oZbFt~?&6=T0|F zc4q%n#pzM#tM|hx=G_E0xOE&MdLh(i(rY>tu7jd4y95dptDqJ8+g)L%RtMze`r8}* zQ!E}Fyj)CI#o~3N*muA6$SjNufnz(ZmYoI6l}6M;Ju6@PK>RJ~8XD<t1N!OIdrQs-S;Cdcv7(YLe*>0uxp8O{x(9RCWDE_kw?*HbV4i=`M zP-Tp%Kq=u36*{`{ePt+RCEsUWURsd&^l^~2ska}s+F0SvB)wOVotb2YzKCV)xiC>j z9|zgHW2AQkLHgaMs|yqBYLQ=$tc%+euqZK9xk*8zf*$%)?4m?h8W(IIzznTmJ995Q zS(Mn5J_)gh!*oenoEV7exCy~j6k@j{xIhW5HhZ?scecF%|etmN@^z>XEYw>;o~9| z->z{H5~%#pP=Aw)G;0zL&>JE0XeR{<%KG?YvTQbK2Lf3G?j*`0}SJfftiPV`$sCA z(MuDNKgxcc`P8p-=Z2kYD2YVxtPJ|7}r{5hVzcKEqx zFCUisA*+Q?5r8C(xQpn=z6QJ>9Qm((B>FMygb&A+sWA{4GCOL?_zM%sbFvu_W+H(!9yvFE>sM(FP4eboz9pH$V2?1;-{89Yeb4QEie#rQMH3?8k zCVA#%MM5LsD1rWDIon4abhub%2g~h5wk4ZTdy9P-0Emj>Bkd+X8KV8^#>{eKU!LV1 z3UF%EsaEkr|)BPw}j=eCw)a_7VJR6HD zvm_-L+tk?R_W96pEiLR)tsmrTtg5E+XViF^Sxg_au&1+FDb!diMp&1Ul>Z})nZA8wQWgE&N7mCa8>6;n5 zH&Wr@7b``}_al&$*?;H=Ufe;jM@BgwdY2=(I-9Vl_;>X)-`((?<_dOzx!?sEy>Uu* zMz9-{X~k3~*zIi{ZQ($hm4XGtHtymvXbh!I;|2GY)dkgGt6Ig;cTzaN8Mjh`Xm6#& z3$jIfu*pdlp5!<|$QoiVKP=kcX7`A8d(#)(gEW(3`oeB+;OThY$~V_syWIjFII#Lr zjHQ|f7wq<~qLXgKim(#4j9SzR*I=3hVp?V@+osu{7B|)*CI6cqx%LjAFQYuz(+=VqTJ^AR#0l@(J!s+^}Ob=R@k;YRSopWq+UIJ=}{{v zO~80>{JtLS#Q1<<&^8sg!VwO%C^KK8}$F8Dn? z<$^z=qSih%IN-xnGCZCNFr4(u`ou7gJC^~0a?c++Tq){Qmze3^`a~9Hn(h~7_Et!L zZBt1%zhbXp&BdL!nBgv|tEP8cp@Ys8N@G zO>7OhrG$xDD%oLCuek)Y?+uA+{o1WTOmG7X)0OE|aqa9Texr^g*YC|#q8+F9-a~=> z9u^(}1&ngmwfDn{TD2iDT%R>beqMv|nKg;dY)GufpZ9>{w39D|Y)sVEySOEYK^7=j zDM*cUc8mOk4F0Belq6%K@0E>-mO95AmtA4*6g_jR?BH#KThrUyYeRisw=uB+K1$>d z_f7m;3;AQfro@1tDi@3+%LhTXToP(v8>h#>&Wv;9fb83p=#7?6%g<^y^OmAECrTKd zB+1Td0!-PQ$UYWtP88AmGn*4_ni(s7p?Olkmc(|-EJbF1NJGTQjo!k?G;2#@GH$nS zO>B&iT_3d)@$!SWCbFU!>06<`UquGcOZI~b;4SATKFIs5qrI_0nSYvE`UFNOH=U+~ zo$QB@2tU8GJrf@ty1+z_rJgI6vsAO_6L-7h#l37tj7%&I>uMhho&RE2`#Yd3{(%i4 z#og>#iv1bg?QdxoZZ2{$9LtOEZr_8rx7oRe6-NEi8S;Md8p7xn&Y&JWu-Xw1SQO_0 zjU&!pPbWv{vjP`IJ?xQwo2FOa4-N7yJhpy1`Si3mVvj{HK)f`2jK=n~vjekldfJ`~3g)smHu`*K_Y#?m6e4BggRSIYD}Ln;v%_y+T7Wxr;2(+;rK2hLTUi z?UFb2+3c!@w$H9=$U(LY9L6x1kO#7OYYeM!t0I(M$dE^}4>|c2a9U2xH&gG;aM{~8 z>N##P+i>@1I2JxGE9@la_0hyh&P}~r{%)lmUFAnu?c_JVN7`Ukv9Qx00hGP+wwb+l zO_&xznUBl&`K+^Z;G#@;%%Vi0u%-?)E`iA%r@>cx z-~^dNpY@Oj;T+fa3As7WYXhE;8*mlh@*?;eK}A^7xH*muPsnSy<9Rd*1-C+N?6z&L zgxt}NZ8WZ@oPhc(ddlO`Xi_iP<+qJ_w#UzVT6WrWBQ<=R9XMYVN=@tv>d4ST9^0A;~;}}ThZ&)r)5_V2L@7_Fvn04X*B7X$j~C==N$Ir z1;!#Id_f!y?2XgGi?p;i^jO=dw70AZztZo$F~6yl+edDMZ|nQ;ZwLFxZu3+@OVMX! z>nlg{88ks=EgUUc^_5%0>uF41`DH%QW*mBC%Y?YNjUqDn0lGt`JOC}O%j7K{$V8Q2 zDX5>^leeVmE#>y(Ep6*3XTy}#_!;>@JYIN4ei}#bgU>*%wv4VlBiCVzANee_ig-?6 ze>#D(pOr1_himoe+O*_Zd14^Du25=tg!ohTr?(@iLw`A%cUDG@cI(1vY<~zfQ|Wkr z^a(fB0kZA_G-VfD)2Pz``F#xc-T>%|a;VL7@(2`t?>V^*2)h{pfX`f;8&0-?P%N#b zegkpTPp4N0%F%x7*q+!!Wm$4qz+T+}#p+l`9}kp^(Olm_axDwrHv4_p3R2M^+2#w# z9`GqldBhDV?vp_>vlX{}-dpexFK9okx25l}8P5ZVTdCxEIVBDo&FkF5Gr+e4QgP26 zq%Lx-o0o-k#0^IM(MNww*B@K6z~$G`Y5gG%2J&^MmV@O+)f`fW4Tk=4HccNaGshXv z+k@pF1QFyTo8{tg)coB{L0ixJ(+5N4ILpy3AhNT~RPy?mE|ht#wv*Zn^D5qA{FpP! z$A0s+|5Bea-?$q}H;2iyE8Q!6D}7sixo>OwPVU>9pBP%@+v>}G(~9xxAAMV;i?zAR zHDzLS45jbx7DU$1`a3Ee)P%>nf-Csdw%I<~6tBTK6-#BJ(k=bMX!@;KyIqgvZ$$(S zm$w@Yr96sHO0|2=~}BVoqo7jSQC!V`3su#r{TZFN_1+3{9+}5|9pq6cfD@hc{ut? z6@Uc};A} zH?YOh)#E39{kC4`q2dp1w?t9vuKxa%K1vSoUA#RSnN0eQlI#1fgZ|lJPpF!Bw4~8TkOa(ZN3!#CXzQ1|b9CfCDj-Jl{aL@n(a4 zX~QefB6p?8(ef-j-We@3=@ib^g(-0mlf(~>kT?dE52xWV^6RjS_);S)NXES}avsX( zjg?vIVpk@J#+-sgT*TB6;^n8Yz&Kna83#3LI$fLgLntjBCx^kiqWG2*x5_hvGZ0P0 z*G5BYn}evytMWW??RCok)Pd+F5f)#+wfBQH#1f$G*ukJx7GbIHdyT{N8vFAEe+!t_ z_bn@B1v1#5I?(gkpE}S>oR$U#yi+0vHE6&W2!|j8k_ac|qSg|6D z^FVyl>7@RM$>+bG)*p-Y$4UJW^P2ume=L4Yj?`z;&9nJ6>_7X_g(mIBok&o`8MxWn zx}}ruj+eu2GiI5zi)G>LHF9*qPrbziIm&Y37%xcu$_Is0_J^(f!{f6zi|~LwF#h@(~$(F$v~I~-jD-rm=`<93EHOscu-6u zYCjRQHG|!?%*X1&58V~xqJY;ylryN|>vD3vm7j<5BS$iJ=-kgkjf_qbeod_W#gs)i zKckA^m{@Wq#l-p*F;`n;A-!1`N{=SRG{%<3-HAmAzkl`VPC*Dv^SFi9B*n1YmUr

jNQ8%U&HcaMZ>`Re`)r&b#C#J}=|DOk<&p!asr#cXY_X_(> zjK?LYiPd2^;s3`lteCs&?_fBnK%R@0Jrj1*Iq$@izEpFj9421-nUZJX%(IgE%#<71 zs_j#@{Se~@h3wU~slcvqg~35ZcRqr$?aw=t0X3z<4;fW=6$kuzdosv|q_1|;!?WaQ z^Lu7cyW+04Fd92c_P6I5I~3sx5W9R9q-GrOX36;=Hkq^Kb|6k{V-@%FMGUJZw|!~H zY&opj9`(6zkNVuVM}4qI=gpB-eRl@vyL0lYn{@)cv6h%p&&D#ZhSK~w@?a2KBbtz% zTosprPaSSqYUqK2;LPm}vEWa4-@4g|2G5lPoXFk%C!G@1BA+g!X>;YS*vHmOOs z=gO}LVqwWkwLvv+jXGU}E;UTF(V8B%K-w@*9s@L(`O#45HAue2_xtx-5Pld$qwvfW z6Hc{H&6mUPUygq7#N!70d^s@WegeUkVf}pB6j)|(a690u- zG@ug;=-!I~OeF(l(Of@5?W zJm#*c!Hqx7cw#QMKYWkkn#AS;ibA*jNwgV zy2BqWvq)y)o&uZ2u)8j;n#E|Gi!rFe8N$41?0$s#k6~c+(caIPsxq!2*~qC zxs@(u-L)b<%{#v^ogBVQ-?Jp*crL<&bGzp%SY9Wbr_QV7eb{p~SIZl*-q&6NK5tlYrUf&C*C@)z z*T`YE4PWi|$wCefZS`*IwMI^fddJ^ok_5O5%Bm6?{f?aAS9-+9 zv0b3jo^>K=+dGgJph`LO#CoSc*Y`rBTS6hr5eRI?hzvV9oWmu0U@Z`+gqE+Bo0>mB zN0k3)9DJF5y+vnt`N2+mQo7YBEPo(YFc+2wI&meT(K`7_fMd!!C=*I(!#cUHcpjk} zvj#Z*`F*dy>uLYynpV1XEhdN_Uk~Z=FC%$-JyZuJo-^w~PVx0}{m!wp?QD{tzpu8! znAd>|36WH|L7!L2u3V=-(meX`!4_UKJB79sR{~W-2`wv;o0#$u-s5h}t|(7MiToYY z=gs^O`j{WzmyhD_v>xSQboc`(ZV=NX?*{~sU`n}?;*sGbZ+YDYsCg&Co||p)Q-{MWD5(!S;+p3Xaw;zRAmyV=KsT zIi+odmqt1jZAI_to-JGDKz1qci;v}D$V4q~0}wN4>o&;!%RM!=%c1OJLa96iA7_`! z6G3!vpN~qn;TY4dOsorhi_wpU8*AGZA_=aXhQv%RhJ&K~2l+iRt3nx5%|qj&>jXmDyM(!1+Ye|IDlUb1Z*J zeRe|UJcr%D45Rrw<>$qcMwHRP2_@o)@&=Tqq}!={m*zWf#T5(n{tS*E2k70;xi$iEE&N=b3jeh_yJRNUj@~8DL6Dc=FXRs5Ykt)83n8H8&=Erib4D?d#)cgr=*r2!DZ`8#QkoG6r1$31daR(2#7LDP}#ZdVnxvP15faau`rqT%Nd{|CkKO+k> zo@@v)Xv$&8rTZxU2*jklG~$Tf>h2@F)tX0ntDhd_t;UizwUN6aWHG@xk z!Eta?Jl7nT+xq?TgTJ<N)}Myk1m% zHQzT%*7vGUY5tPU@xtYW=43HT$ZB+5sCOVUjdY-+34&QInDc( z@U;eYz6w@&oeo}w3GioXRsnm)&osP3ZpkcBx1tEr1YlLrzB^ih(y^HGEC<%)KF> zW71B_#%72}`wJ|r7}z?TZMOd+*9&9=3(_tx)W`M9FLM1_+1^+~#w}N?H%~Q))7fP; zFag|PSSPR%Qr}-emY$(&eytD_w^p-9sA!{Lp>KYL1JL_-(esCwW0jG5O=m9_dyaIWPksB2;~)2m}&GaIY<0xAzi)&sYImM+t^RL3h&(%gb0VR zYrx)juXW*sMuolaM9`Ysa_gjm?RA)t?ef_&2#} zytlM(s?eI3UYt9`4GB8SDAeyaIab(3xxWGEGpIC338$lSj@xF@bSFOC1pokdhLh=c zY-(7opYji-=D$PHx{H?lF2|blp=YF$G0%n4q2J}RB0NTBKIo4WrhT#@VU2K@1I5}n zcQKUnVZ#i8>=B?D{TRa7QJLNpg1=o~3H3xCV0BjC=ls6+?p5uA(Qhr&I|bFN&D zqBN7j?&upX^}0z1=L^w@Gdg{!!b*)SiWOoN?v#-5W4};(%%bD~ZlxBb_20pzp~Wy2 z3pf=&r`6CIK;?~tzX4BVpx0q=AbJVa1GK|(Q3 z=cF)yWf+4?GGrvrE4$%A*u9p6w)iWdczeKKVakM%0EGokY!{$31Ev)`J*+3?O~6I! zivh|=@v5^SH;;#cl?i@%b-3>E%qU!YIvcEvrtAC@S}z7U3)TIwlE}W^L@G zz2QncI=&RHB>7GH$l};1P~I0QIPL1R(t*_DS!2TI_3>{-1*f7dG%G?`D_o-D6Nqcp z)rk#|LF1fCEnzVgJC!ukEukib%yl?S(7YwzX>=kvD3k*4 zrq-jPtB$bBNOTsC)!N}9E(B&bY|)hlKZ}9TEHWJMIekLS2y)zsVPWYuJRiZ4dS<(X z7>XBq21&@}!EFb)QWwA%!D_^h#0Quw5pZF1{b=el*Ahs{M~1MABmJ@>s>Q6!ZUXm` zgLxgCuvW)hbFhmS!r%yYrKIA>5N4lqy(m}RAgLOfKQr~6DYr{h*s*>%fSPl32)jFS zuw(s5lO2Y+gUxEZNOzx*EQRAHM1yJ+bxH`L2agR|1(taC@x=NBPcCqu#$nb%sbeE( zUeccb)=aU>YuFHfVTd)TXssXgnA*8h0v50*!VB&RqiNj|1I2+4 zi^U0W`a1eY1n&6h=1fN~y7o{y+XXoAPt3H?!J0~$9_=mf(Gg+vd%LU;sCSH#;kGPrl<3Mu?&2cLYMWplSH+~c#jheJD3%z>f3AcFUMAzpBMf)kZkf#H0k zB;_f;kC|-?w)X@e-m)ZREW5H+S9uk^EM<>(D7Kz53okd+Q}ToiPfC4dqyW{1g=U&@ zY`u5cYDGjMcz_c%?9;b|M;V zxOJC>wl4{=(WFMoy~+c^(#FcOOnlS6h4S|5+YXB-HbqGn#Cu5D^9ltfuiHd zrpn7$k;0U+7!d9SV{>YFZZ}mP7IEHru!YhZ4ZPL@qgX<_@xVPtBglbqYa1#>T@+>a z9Id!&-XxYfx5TzUzf;zP7OrzO7I1mLrNX?314wue7khTMEcs7@~o-`#$cx_&EY%D?v@L1BgtC~Sq(v;UA zHsxpvix7BF<9PIwrZ62>U2?5x2T7roQrq8f6@z%(udR}YkM(KEgE6&88hJG)(5f|H z8V2Y@m>>Gg^ueKYZ}wF;I^voKNL(-vKd7+4{*5Rnvx}3qJgC$KW;Ld=E|0;O{-EM# zdWLBc%1us+dkDXV!&xll{Gur`qf&!bcToCx-+1t*reN7nQOYB5hI|nfO5-lR;ZILJ ztbFb*#H!WxJo||9q5u^Cs*_R|;5T(vasi@#zr=t*weK5>TXy{13Ql0i0}pxv9#ysq z!fyKfG2r7l3htsL3-c+h3mV!@A9hh*wVg9*M$BbDD(#{;sYg244jf|B86tbmrz?Zu zz`B{bc7?2R9C0w%J-Y>6m2<*+&#R9skpdP=NDB=0yxmPn6tF`@#Qq=Vq@TJgMJO_@ z2jnOeS^flgOjplqJ(Z0Dpbr1ih7VvRpX6v=^h68~d`rRuXQ3S#_k>L4Pbwc_6xVtP zp`LY5DNv#JrkTCbLvQ*B56fyU2Wc#l6wc+nm3V5KIuQO%eH52#!|8-9NEg1^#Mx$> z;h5=H6`vZu9VK1k!a{L$Uq=z$gVUlVPow{}#o~Z+r(?W*l%mC#xrs`ikP+5*%I}ZXFpP|A* zkbR#at)vZ3cReG`RG1oU5go%>H1tsVc@P54G8ZRJF(LTe{@8H(II?{W&xGd{w;)bI z*i3r@f_-KwZP<##nDZ`bQ(1VbzFiTL&Y~>+tGuzcQf@Wv)ja8DZbl|;& zvIHYxAyRltTq(p&0v0XRqIu4cJ4a!WV+Q6Z%(ZA$j`A>mUCU9@#F@LO=?LXHvEmvn z8Ucdy{(1U+gtFG}LLH16PIe6kgi+ZGIC+4EBtYI5M`EjplrU0h!2lFX*S=dDMk7aJ z`jBMaYZwZzHAQ8i8_ZCF=VT|q4f{n@7peF~$Z#T^z-JT<9i?>SW3EkQUm?ES3!@a7 z4QAaaWjxe!DK9DQ0h~mr?7*zve2K&V-ItU@Xd(Y)4vCbN=fLt`Rt}?FW4+w_uP77H zcK*g5ShLYsm~_e;jk%`N?$P}GA2CK@uJk*`D5J1n@;9Fgr!;5nRwTXgP(6xOp9}Kr z7z+@webAUiIj;Gt5{Dj@SCzgPEXV^;rCF$F!>h_pW+oezr*y;T;)RiLXwKtQ%9hVX z8}5VFJ0F}dou=d~N$Bm`z&>4R*i*ghQp4Ajo2XrDJa!OVjm9grEJSA9x9Uyv$AhDZ z^y_$j!md9-X^VoxCZJ7`)=j`1Omuq!))E=HCo0qNYwtv*EB3HQdL7V(70{4K3{^B% zKbZ44B>V7;n5482L3`Fr!AM0qK81tPK2>RgUu~u;%z|Q~lx`3NrcPB@l;KaODlaiu z6xUC}y|&p(5cPcnBf`yuHEe%d=w4l9t=lk7sl%F`rZlx687zySNsj4I z)U3Hc^``^HMS5yF&I?TY0iTy}7o>;jI4WR!?wYQwMsqoD;^2uXP?;TP5&H}!fS^DL zq3_;g;w3ekq4dDxjTy@8C>2V=DEN^l7NCdsE>YV8uu+kA7buUi&F2eSP=3ej5!CKY zrIx=QF@u>;`_2U466xKUT+4Cr8Cc*eCY1Y;JWB!lX7!>AU32XaSf|cXSjf%KXDJ=n z5FN9X5>(tV8?tY2N|?jvzi*Dx882(jRfgc@q`AtgV!Bp%rg;GB*PN%=fMoFxUw0N} zHVpttY&#D_MN_@!DQ-MH`SX;gASijhCCE6K{-yc)abV*T)LsC|T%>jjly-Q$u|R3B zk1m;=CPL}r0)@GKL@ngAd48dC48PheV)Z>wE>iLZMmWA*tXvk4nh~QOdDqI9D7DQ; z5c8>UxGxKQAGcKTXNBr6Rqim;Vq&5440|$_e56+;4}HB5%oY9)=;EPc-(9F|_ch{E z6)R!1tVoFt^_)4#PY%!mw-B?zFtOkVi$qjg3;1tybUxfggLGc2e})$}V)A z_T?uL^zo`#s|ejl#%k=~0x~!9ba)3ijl)lxfA$JIv~^%KpVA?B67u$Vg4QcztwIGg z4$V$NsM@0XNz(*R+9qYV$U?twR+7w1SV)7SkCl~_zeOn!cGBHs)VxBcBePf2cU$qQ zgfg4pRWWHbv*%OqyGavQnAij}G{K{(^AXOj3)ay1c8Ym0cOPrKXoDHs5JS&><};Q=%<@Y}DJ{ zUZzCVJo(WfFinS#4>yEi40=d6Gonf#Y>^b@sD8*~DTzpXGBk}cLlMsLxgAQ8ILSn( z9)Q6l{u9N|JQG@TO1XA8lv;fP_2YU<|3pbQpAG?X<<~op=pwgwH>P2?pR;)SeWvsj z*tTKerx6u4iV8kG=cP=&I+N>4z~N;Bu@I0Lxv zk8X#1U>}yKbhA~v1)rW9vD~yWZ6BnQY&!JW#0WdLr=HkR16O9Ar2YFq5MZ)Mc_JuW znBcj$Pa#3v>rbu^b~vqAH^(G)?ssiMV9DJFlu&U!;sJb)i&eiI0OMFd+Cin4-vXu_ zz)&|rkP;=_re=qf;h4#aLrQCqQGa@D zPWPI0?~sy1MV|l_GpNiQ4{!JKRfVqC+=7eJKgAIPmmgfsTsSuFR1$oPKB|KNd_8w6 zt;OySkICp5E;;8*-?(-ca8#iA*^Ni z;i^QzNGmL2{WAQ3eY*l5p@UZ(7K&bJ4-45N3MSYCv0E8^aco7VkNVBR>GUy0%N>6S zSvefN1AXlln}%4VD71eP1Sq^R+x@(+zFTQQzNp@TCcCfq)lIwtn++7%{a3x>WmH6H zXoP|`d0*{1_o)wKU+n@#o5l&Cwqm!4Ap~MkaArU-I7MrA7A!l6S7fF5APg>!L~6V# z1e3P45ClF8Xe>p?SPJ`6`5l<}IA zB(N+7$zLgTgO*GV(B>eX!&my2$`5mf(U`9k8%$%y5y3ExS&UHR4DHKrvbbYUQck1Z z5z!p&@54^RdW4wDCC{27sNySS0QAcxqfaB++K(A=v~GOYAbK~ekuMGXMtL6@B3vh7 z_(|6&CmNSv)d79N3QPOD!Pv4-Dh{k~{z=Zikk^4}wUE^z)U*2}1?1_!y01in+3M8YS{@dwSE zKJHH>tf;i^B94RqP;seVap|8bdQdThXL|a$A~@cgp;>ewLvxUxp;<(R=DyDb zKhM+zy{`rDrK2}M@Oncww?5-LjVTnkme-Sa6Us#3tT$JJTOj3@vc>P9|GKu!9{q?d zh9Yh&Tf}(@bmX=&(65wN_N4u$1c^eCr^_8>pa{?jq|MHT1Mgjk>~iU1drbOD6&Y ziwUD*V`6`upvm`?=4?#c?IN3fQj2&blpKez`q5R}PAi=kRkp!?5mn~F z)ykx9@)Y~3Ap$O^z3-={_>R99?wCnG`l;tJ{sR_u5gvoBYMPMlS!-2KG2)XlWeO6y z?0&>b?*yppL4Q&Ljyoy#KsrAs_VbVIOOCsv8_|-<{e$R+NqrXqhYODRj}dqJk*iBm z9);W06=*hP81B^l{>e9C^u1kOgX?Gof$9kHLmL(J8wt@ONS%q!)&;4@SlOQsJ3R}7 z)qQLLgF;kxenXVZP+X%@BQS)LdV6qXcvV+M0%5PtfP%)E$nq&{7pGza9`he9{sH>W zdXEiLCyGnpixsi!ar!k(eV0KDOVY@5JY0QFFdspvS4znp5lW9c)k4^qt~=Einf^25 z)!K1(-MK+mfYPhs$X${CdwM|60Nthq$D}{08UEEVDL_XWuL{&K*%}vtaKwj;OHh>R z^sfxINtrYMaMI<6Y6V3b$|uk!n47hwXRVqi5Ao|+z)iaLLO61Kp9)6EsHewv_moGe zBTd2@Pxn|gOTe=Jimb0bEF7h0>Z_@c&z9C#lZ8(`2kNWMO@WJS zpxlxLy#zUqQb=R9Nz`d8h%$fWaInw%-!<_0>BefKK=xU$5r$XPSZ#0h2BFU%%i-yD#JP()k3X>5kAmDZH1SkTkvnITi_ewhqq9B;+xvC zatI8>F=*8#dr=X^%?K=@HZyw?aL{Z8g0Rbv zt54uQixKbgPwh1Arq)3M_g>x9?=Y4Jx~tn!F-or((L?Qym#%eIFpcbRUz*TEy)3SE z>b|>pR`=cg;|cXTAa|{&%A8kRZ61Ttv6mX@WpmSd0RfiNhFI6Tf4rLneSD#W}!u{-Do>DuAa}%h|(<=7}EsMHP+v{k^qCUde z1G$4+owieO%?r%vWLyRGdb<28#l^w8x+|oipGDP5Z$k?1t#YGNQg2oD+i=mUeR`Y* z^;Tu`+yv&G%kl?14z)sznC(M>26ILkHGXVo)Gu3*0lVofM z>+GGWGXDx8d~ql($posWd-i5xPe7X9@QnJIc~$}hkeP#|s#NFKOi#qohIeXII(|Y4 zg3xf*Fls%1kDV%>RsG=oX@sstR2m~N4?;z2C)UVYm{@?DeW}4SKahfbihej)V0EB}A%D$2x z@2Ix!k8>^ZAqgR@;WXMPm`aT$*FWgEXo z-nOh)Gv<}T`6TbxlV&Ptf4d%T{;S^@o=jaB2y7qas7M#Hh-;qjhCvR3kUJk~O zisx143>K25a@$A9aL}ssEY(?=D0mpYIIDa|bYg4)mxS-gyq|`KMLWg%IeT&n4>7}9SA$VFmJWQ4U4Br{U z)H;B#5uwbOGOZg9F4cn;x66#T>|a)k)ui}rb(m%GWPK1Nii9HmJh}s*_U<@SSr&KsL~Hyt7@LTbo(5FjR?B#J-`lCr6E|T#kwy z)fNAWH~N}BX8^YrC#*0jqgpMU2oC)*CV(Crp*{uR)~1qXbt7o_tdSPl*DtX~Gj4*0 z6|gcETcyu8Znt>NWYqx4Ar$-qU)cm5*}O+atCq-B^Zr=b%oq5|=DnbH#UdVgK}~{o zsU8*QK!=`87Kz4;1Y5eG=SM4_XG2)iHt|9W%4;1|lLB8M@OlT`u2cE)=d4wS}?J^O-$o1V!ptG5J1 zCC?wNHfH=R@99Y~w12c}H9S1%o-^_7g+&Fa<_Ei8b%=Cpo@Js8~3HGYk7G7%M-6D1)%ro=v9rh}YHq2}M z%ynxxZFyCF22?gKSG|HqV4j+uc;KSHwj)$qzRB$9@3MJAl?T+6Y_4FPGa#%Myj3UU zL1O7jckpvv!t@_(|H61&u(*zLaMax~Bc;rk_UE&)8&7Ppvhv)D1 z3F;)^QHO~*BEl*;QPmh$O;nlJs^xWcNK6L$s#UG8DuTB2Et>Hz_*$D3-? z+UZ(qWw)$f$*#5HBoj6U_-6089RaP+z&F*n=xP#|ciTL`*8q?zdQ*MF{BeTTMqkLl z_tYrFMAX-c#>`OtZH5?ZgHI;hFKdUnatt&p|4$#UBF~mFd|3OD~@Q6iT`D#a1 z<;tb26tMJ!8g@<3)}~8XB9pLec%@IAnir_`Dwh``eSzA=_w7H}ytfvpZ$kalX{H)0 zR_v#&nV|TGXxdCQ1`E1oraBhOn=ng#z?`mq;X~T!k^JA2WpUa z(+1nMJ=I43I7Q7?8({W(je-0p;nJ?{tJX$0{L*J(Bz@z$p})+2zg~rFi;UUt_s;&) z*=oHS-p&0bd~sM_mIFRi5>zKN(5@ZiRUO0e2VClEhTHAhA-%OEkXmhy+B9b6J3952 zK)vU_V=;n>IPh!YJ5(^oOUsk#`#I_(fLO|0m8B-_=fr_^@mzJ5kl|@OPyL!H@B-$m z4+rg?#FCMI3K3GGfcUVSSx?QYxv*5MlA0kq>We^T{`MSL5d3tA=>c*REiG3p| zSNpC3IhI2oR{cfZa;Txo>CAHValCK7LaiI{F24wm{c)2jRzNW|c7@7p!+|T+1Gv!o z?MiHok16ggwWSj?4WcFUBz%&Hq*%Bzn*xyY{;Q zUx-%c-csv``FypL;vlr#G0KN|7xNE&F`4v|v5GJMp;c`8J+Z5?wd~X1mRg8wEm**- zrzv+0)Oed|%No90POO2htt<6-o9~uoZ>zh3PD9^O{h5mYrFCi-^Kfl49GkyWopffM zTGtnjUsHra*Vb5QsuI?#VfKxcjUO&$jW=jGRnO_`F9k`#QlMjVf;QFgsMK%OV)wnl zi*P^D!u5OvvG4K`JpZnGp+UMcpjgXqUlJAG=3%;)% z32{uPaUVj;+(qRds!sxUQ#~rXtF+FePR66fCY3n{PuRq9Y1bxoC_*E&_(-iS;MDol zW_1KU?%#}=!3MNheF9M2@E0hS=um`n5@l|I6mXd~Zh?4m9-ilF1Fvik*7SkCqB@_Z z*YR=a0BvJcbN^fKVb?ya)cL>&fKlKr26+V`TX zpQtMQ7V3Qp7=J_^K2=rIvV0Rw_!JA0LA&rfWOlx(lH>VnoXPC2`KS%E-)5;4qX+luzt>0G-4M_0qHb+ z7ymVFm&&p+f3r(XiN_ESz02LCrB6K61AiSr{V!1SeVXuv%C6wQoM zZKL4*YJ0rwv0pt0oJu_ajL4vM2XL}LjH?6cT_M9$eo)O|@H@kE!n?=)#_3s$#!W8lWvVYe(Po#Vr8GaU5tMt~Wid4gj(( zIIa%I!~aVzu4jL#PQ$N1zEs=Psk}^CgB{O6W(FBd;GPbFI#MkM(xsnJ!#e5OogzW1 zVQ4A_Nj2Ic`$b-MOK@PLTAm*Nw-(ah+O#|)LtqpWT{u>NSXvojEIpw%i5%h5lQY}3 ze7%+n_LD%6mw>NSm*tn=;}8g>2Q~Q$E4G$;e5JZAi#EG7mP$RB6_}S7uetGK)mN}q zZJ@8d0@EBtmao+*0N2c~Ie9t#wfZ2IWGbEc8cU*l!n*z1l34zAaY+aa3Ml01^4bbnykcWbRMRD&VM`+_Px}qv<*bS+ePdXAC*+ z>{*Gnm!5ObD`!-jW&C-GAEn+n19)AfkMV$lamk;XXO7{zyLMGa0$Vd-#e9k4FHW+d zx21Y-%q24YERc9K4L!@*&y2Hb(^}V#$G|iDN$h~)%GR+1xb_=6fIE<#KMMm}I&R%_ z(v`6vidv3?wC+3gF~1d`Au8%r63(d)`OjU6*MjzzNXc`@h6MpTSMlB*z3>N} zc@RNqC!SM7TC)CD8~xeXj;r3^eV!|JZ4Gb1h<$Jl>%y?-w2$`2 zDF4v!)kyZ7^u5|Myt$9I!5E;|P~bRAH@;VE#r(|)v_u~xDmVQ>9V}k=P|*)i6a3_% zkAJ`j=F#0B)VH9$S$RS2%USltFkO2?jvv7UN=W`uZDd`7EbyQB08NJdh=GlwH`rql zt^QH1Z!U3aTMA43BjH*j?S0%qzyGKPRmu)Og)!M7{34e1BWih3)y%!LZE&=lkQ9!y z)AnirTzXM$AH+nCO_5s3k~myo?nysiRBM^uoZzC!pTL4PKRF?U_-ibiM1icU)`f5#Q&*v2&pRgr%`&r$IN6qW% z5t#a}T*ovnQiB`d7E5UO4K-DKKZJxEAUmZu)F6C1a03$h63V;@ZkJB)-sFtrRNIjW zh__-xS84U4!=1M_d2w&;hu*&~e0XTy%*gum>T`$NP~n3k!#ulxQ3qN~6|Wzm{1)Y| z0Q}+OUZCmArHw_fD3wWgost??5EC0IW{mYoEE}rnp-KgZ{>!Gyyu9_0dsy6iT zaalE1f&Jx=Bu6ZoCz|qD@2Q_L`TKy7+6%LPk(D_bF=tm2pt+#x29*KJ@rGgFoCqK_E-u! zX7%%%fGaAF$H~=aWK8a@pAP%9^=XOicCzxX8~97JGy7l#`zw(Bb&35I#QwU#{t9M) z<)IyRxCQvxJN6e}KX|w5Dk|1bH}Ac$O0ze2eKdCnWDQVqjnr?=tDZN-Q%GnkT-Fzu z?9?i~U2UX4=q6F)XJZp;))muS36g)3*wIykJvzHWCI7l&x+}3T*%l+TA}Sw_i*EtF z1H$vngWVQA;6pQah;|SE;BswBzr*2;VcwIlWg;}819OPcDoj~Mc%8s@{H~lfb5DRa z*Vl1Yz^;N`>BV88xfVA0J0=vLxZc%5yoJ9cOICZ1QobdNDS*WL_{i%k9f1Ymr2~fOZQ&)RldK#$_@VCT}AG>v_%2 zCQ9no$&Nvw3J2uMZ~p|yB;IzCF$knT;l*bEbr2FSDCq?yBsOCJyl)7)$+L0@mA+pR z)$7(N;NJ#;2*GG8(inuz7{vB_e}RO97jz(tiw+4E(5Ko+bYU~F%2ibd26rW+I^8-2 zKY(m2-qtVPw;T-4R^GZb3s$I7Z&SMSj1SuZaM=6qPE@4JDOrHCrV10=X~`~(DM@_D zZ6{AuYFw_pp^xAW$Hsv?W0Hb8-~@=h&)kBU8&!ZNIdB>cd&O~yPT|jo0z8m3!h+J7<8h4 zG0=h#c+Q9M@WDRQQ{MzLH_2$1NlcSMfEp-<7COW4%f$MLkOEwy2}1{YcZW$V2b~)i zu126|HqbJk!5VN{tNE}Sk@fJGcYZc_Ut;vGTv0+g8I}ym)G5%%#v(JBqyWhYe`c#q zvLmz;y1=8e%Ulb1i?j+X0}OKBT{U4iaigFf@#~o55}6_%Cjzm3G=q!eWPm_33=kn& z>?nW{vHr~MTpw}yC zS#aXgx4W5B*+ApQqaCifKf1h^%&W9BSgww4JG+|5JR1a8FkH%ky4Z6U7#Rb$pJPv< zE{vXuElnp3+IG&wHX?FPSR}kHV1t{l0Ip&9qX17h_-j{z_Q7b| z=j||B7HS~Ro=x|mW=qp#)~y9vHv@;kp*SH~aTAH(?e zv|ctdf7*T1VoQM6?-J>*e^y31t71v(Dm8`=eqKc;$BMlMR_v;d6{QAN z?BZC_Yc=EUK#L+KL97;atSG{>3M&{bL>E$^aX(SV3UK@?tT3F&5OLTay9w{D?Wp9V z3~cZJf**QvMjbz<`sw0|k-eLP+FrT&{t;K^i%5b4ycX}rmFKm;L6!o&Y=K^uBa2l> z7Ar#*YZbBp>vd$YgJSBGijM`L2;s&}EBuQ%u7p&g^FK-jlSLh!y+iyL1j*Bj<{3pf zGyF4-=r_jL063259-W2XgE$5Kn^l`8u&9Gv*>@S=vEo}Hrx_jqW=D2BdsIIpP0 z4L`;~Kl=G2=qs-t>F0RUC+sWzK<|I$7Yj zCh^js%be-xxYiy`F( z^99B;y=CL|vaF|g%J_a@c&=YNw<*vMx0Q?zA&eVxE|bWEv^)uNvm~~|`5b7E7a46Ju1Tx=8BMmy3&}2Ml<-stpt^T(@_)xm@V@pYrKJov9xD5BztRUUb*L@n7zZ3La*6`C-4RHa;1=%KeDK~!VtJrd9Q|D+_$U4{+hq-*}ljVxXGi|U-!Xqrp<-)^} z<#OWz09Z%3YT++DYV&cqYD(-THPi&SzYZ7%xEx|G1BAb1#q_e+6vdH9fQ&h~YiMn9 zkO~+R4v}g?WGS_4xi3g2(0m^N-lQe7`NrZ@?HDygVk!-^Y;y&mH9IsDsOHd;*`o#= z{BqoNqyV%xf;H!04VwWrz1>{iFw`mL9385m8WzEfg0-buQrw*YA66v~>J*mH00RW@ z!ZmXjG~oCn#8vMPyXfQNW5R!C{O61RTuB(9*_5V9QqmvMJ|q7K(f<-g{t+YSe~S21 z)c>@Y@V7~-NBurpvA%EdLvJ%^gq> z0Ut0-43Oziq9r?ERwoe53<;dUN5nLsgxHZU0S8|d@X{IdYWzO|y?+26+scxS15d6F zylU@TRR^AQACLf419Q~p#u;4I4|&k2W)R)JbX0wLD0b=7y}Ul5Vevi zIn`xl_{(-XHAqfP8paV()OVZ65YYsDVrb{U6KH3bg#Q=+nLmuq@045cJAlYbSlhj7JHl_*!PY9L*+$OYPNL7YrkL&fAzRW9$ z>UTnPsr9-cL>ZYGaP`JtFNb;iXj|w$5!Oi8z(iQXEuCL-p$3hE16%>?B*(h8((4mk ziCmQlOOe6tLNJYpP9rFP;?gjBy=iLqTreG`!%dJ9rG!<{;Nv0!DT5wEi6OLyei{5o zz!$fzLk@U}uFlp4C3~PCCAO6&uX2TOhUB*E`gNO>fVb|1RatI!tv4hKYs@ZH2Y?dq z^2q|P4uxvlT?6b<^39b@AlhzQv>SG`+9+cM_(4_Lj~L+&SA8T#Q1RBT`ncHxrF}Y# zP<>ozOOQgjOdX9U>f^ML1j+;E3@IBAPN?nL9hkc;IW8+GTM*v^7!|keNwz=iK0dUo zNzahS(J6ZuiQWy$h#@l~hnpe@ysmSeYE9@3FnWm5fe>;uX47PKFpMNAgxWMu4bQc* zYuea&m1lB(R{&_90g0!sE@AOwxL50j*u5>pWK0#(Tm$TMaD65|*kRJm%M%}ChJdIs*o1@Ko554` z{Q^|8yX>fl5qDurlqAM**fOXOb_KD;Yv>c{-9-2d;w%L@euV9Vv3y{gZr2b2@}N%G zeJD~JicnV4m0JTVY{p?H9RIgv4R*X~azoM!1H7>Ac%un}8~FHu%>kXvXwk$1fU^Ze z+dlXgg?N`is0sU>#H3j<8sld)0#IT!0=aLPS`+20l_tIhTx_nvDwrKdTv*ozloQ-N z)XreRWlhYNa$BZ0jSDnFjUu-b+=+NuBhd*{L(#A?g0n712N7e8V3diOqkuConCe&) z&4oN>6%C;pa%xgwpq>T=&9Shh56h`_@TxH%5_{E{#_6w;D_|usI?9zOGq;PDX90S_6dnMM88)F!!sS_@u3fFn{1y*gJnI&>ui>##p+TbcQ( zKeic)a5o(t4_g|w)3ug*-6|^r~v(G=ME49eL=jz=@Q75 zn(BPgfvyr=2@I10Bu6K92C_*Gx2V%_cVw13NGIHhtE7M|cf_MQ)wXg2m)Gtp>wwfQ z?+DQLnshz8Ol9YO4Sm3>#o{1^!DuJfVH3bu1|5D~JlWY0ffn!qHe6;QHVBQPx5f5= zLgnYzhUbPbz5^?54)7zOLk=c@H;{fiumtrW{Jucthz@~%XbQeEDVkt&!M3Kefkzn| zUY6qtJ@au64LBLW8rpn0=#$>VrKC z%cn4sZChV-5tAi_MuX@2N)gen2r*aUr$Z2V6rjy*Qfp&V@rzCp-19+b9?&-i-&En= zO(li55GM;bsrX1{jxr1_($P8|tON!y9wiD6L`3u-pb{$ICf%%r0ScvrOClg%Q)k@%}luq zlmmUnAoM~S_EsgeDb=rAFv7vNN2yP>uDn~QOfMv|?O*0YX;<2W$D;;20ORx?0Pcoa zPZr#eFPR7pJhf5d2XSh*b%LrAETthR00v$;ed+(8?!BX{D!Tr0&dp8lq=$5RNdu*w z#!)%~34~rG*g%Sb2St<;klrJZ4N^i7q?f30k(wY?S^`!O35WtpRjRb#XJ*d5HwZrR zuJ>K*x4!@6=FH5VvS((unc3ULR{{zmF$~;JNU%0VF$p&uu$R2s;(yp57)N3MFnqG` zjZq1H%3q3z@t>F8ofGODkOeFiE3$BZvpqY?prtcbMfn1ZmiC z&`#`vA|DO*IjacOFx7{Tn=wetuz{T#%rdJnVuMXeN1MnYQNGY2`CbUdrev7KwuIPH z5|8xUrgDV@h@Ci=HKdko^#Csb9g9)$I++Xv-wtw9Ik^sNfDu#Nk7dMkkGYyrtBWxz zuBuT^Z1z3o(&zHcLNwsxYwYD^A$aViqFH~02crqBbF5OPdvVG>RiZ0RWkcqTi>A?o zvEWx0&O_Kr_JM4~7BmY*+Keq?Z#!oA&Y(A%$wm)eHNQE7=Wau=0-(Biv&9jJp@%Y# zhp%#C(0(urd2{{Gg=v3Jl*KA^l*O$WY)5Nzxndx1f)gbyISfCP>NS^RUuHTaGaNwy zWLgB+k_4M&IZQ@*w9o!PAVNG$_|$2}3qh51j(}kVoFtAtbSNVd>=RgK@57CE-V7Rr zwzHs};RpIaQ*03XwqWujwuyZQBm@}l?=Vfse~{f^1`-Y_z7g~8kT8DkCDRVP}=iK)JL-0EoSfY}zF&vW_@LckEh zEL)%gSsX1?zolH)+kuBADCa2EX%eqicI z%gfnZQ>v2J>V+t&d|ubhVUi!h*?6z7Liy8Nq7gPQ8u78($n7Kqu(=xqKPzoz8~zXM zF)EZi)A;{IX)=qv-0K!%fGNKa}C*HlUI^j>G)rP8yp zq4aZSUb47hbSM>ck!{Q`dlUt>4G5x9U3pgK5;z7dPK<6wOMZ!sr}|0JP3cZI*@u;k z6D2Ej7k~-kvt`TZ>a^i*Pz6ftAv6EX`90)=taueFN>2)=dXtoDB7a{`Ig4df6M$`A zmOo>kHN|u_EvZgkf=8RWkngI51$9grgQKrDs)#f9}3=L$95`1t9Jo5?v|t^S2P~tgp-- zC5~F~a)_<*n{q7+YPJpTFRy{0e=l3yKzWcQ4sDnow8WEsv>`63S&R#)ZWR?|$?aTu z&Ezo%x8vb^V~~6aeyX|+mX}HSHt9cdk(*^^1>5dn@-Yk2X}Fw+pL!$Y5h%QIgxs19 z#5_QE3`87wOU4z}2``0AZ2t4Q_*t1PGk;j$XUhc^>9TF|2l6l$2&g)H93Mmx;O?a9lQKf?OSs38mWe;Ew&m3s#>%GmI(^D|&Q-+{AD84p(En#W=7S1R5_x5+=%3 z@M56FL}%8yEi8C=XId~(PQ|v*lr| zus{0@qo#A@PSQ@>qB-(-ci=ZI=jRYAhTA6Fl!dY+S+*UsOz?Qf~V<7gbO z>*@x%ru05lD8SEVy8g9Cba`KcUl|jqY!50DN{u$k!NEMly73g`r}!HD+Ls;q=2b68 zAZh4p7al6;DdUVdtawPj7l1+oP0}_whTi%V^J`-1{ZBcT%u7oC_KR@;&9RcN!LJqB z{h^pN5ui_E$!-PWbQ0(zzt2o8U7kd3K9iY8rlFt7m&EFD1Mg?H;LSAXbI`~SXwT|) zmtB)~Y;&U*!}gAC&NcaP8;~d#94Xsn5Bmmhx&7%I94~N$yB)E?DSx{h9B^*5%2!o3 zbZO(q(JJlP?p#*^+yEmw%2u&XSr0#qfi+8*O5oM7&=fhJaWe|*iGAcnPT+rDXr`+k z?s-OHes_H6)(*K2-f%ZFf1!N_#z+2Je*b+DVgr@eM1KnZKRfLiw`D z^5g3=5bH9hNY=3~ONv0Jms9m!asd|P$z3vY9?zF#L zoLVw6Q2r#(cFxyH;6zN=k30tx_M;Q$T>JVL>UpY6jkqQ21pem<`$>S5ov_dY&IxOK zK)%9;`4y%ljkrs?*Sc1W(({x#!wvj@-Q=gAl5QAPsn z>+O;g*wKADdPwF^hc6zI6+5-Bd04K7ceq#Ku;_QVU}_sZ$io#24Dm6B9hMvW9UwR3 zWI1Er5hgozrh|vU4fE*oVJwpElyXF74^KxO;UijbL_PvBtlv?&S(&%(3~J|5xwig_ z!|{vIhC#GUr!O%3!N7$F(OBB|%zopJl}|j^)?g>#&%0BKWfqpZWwG4s@4d<^=DjK^ zmS3=LhpCD(D+UHrg%a7vtpn}K z6W7`DPRa9`LxK4HsX?}sBh6eScyTD%Vd3Fo(&^sDj5yo(rSevbbt@jNQDC)rghKLG zT;bM6zGdAOXyAe2qW&Sa!gF#{$>m^}LDKtkf+*@&d9$?D_RX)dtA&YHodDTjCIs)r1c_44IY)4ec(zk+_4|yoN{6ld>V?YpGTMdh{U$PeAswiFmqe=*Q zTa}vD?FNUPrl(wgl$i#(pW+RUf~L+f2*x;g!tVbsl3g;wJ7CHFDPFtt0+_O z^L$n1Pw5C%uco|#8gr^Cu?X2xP)+G#alvru%wL@m`mClBC>2rdnu?5{f#PRXO(l+D z#7f52E)ll#HI;BTsY`BcRsqG;R)(SIN41sb@N-oBSnCLgK#KQj985|br55niw~k_U zl@8Ou`br9Z^6D!sAoyRz534vh$qJ?X8L`N3B=$JDj>Aj0E)_Kyet zIkbkZv{q6q^L;6PXycv~;3m1#%oX0{DP~Wz_kA1ytF8eTzO@mw*@G3#LdZ|$!_cq) zbW1LWV|1Ky8QHD8wLt0bXG=+JG&phYJ9AhS>E9v;j zSu`!&B>*17&P-F{XluF>;Fq)6t$Mj~^~$-yWItsy{gAF?NK+}Poze&8Pfb@MA-=d% zO1ct7#qE^3tdh?Lib_h}`x$Y(mko*V+qTQ@jMZX%zKeRb=am#MAHpihoXIQkp`9I+ z7`pb!km|H>1>y_AanjFc!>sV@kJv^lhQv{ifE?_RsWdW& zcWUR#A#6z7JMbaZT7|E4xB|w2T6RXq}ukjC#KY2}c{v<_LQVrNHQ zMZa0ROQE7mf2~B9j?Uuv+OT>^xJx*Cw4sxd;x}opTeWg7-;>r%Lc| zpV|&Yf5#d=inbYj!(EwWx&rlDJ){{0bWuENA};S^91{H7#kh3%$+Q0q6Z$Z^NB&^ES~D)Ubzg5DUVCW_As%O36JHrW~iv>=i<< z^;G)d|B{{{e~_3z9@3IZ{Q~_&Q1tAVl|ArQ*tD1O4s4d0n-TS@xR+9b|CeMc6X71H zW^ZMs#P}k@zkua+q5L~xoRfE^4V$l(r?+2KiY)gb!F+K!+?Mtl)}dv#b22BWPThxrubrb+{m}Iiitn!sWoA^rJR>0iv#`Fu zavY-={yun-#pXXyS#5#esPtPt(S8A@MWFCFH^Q7Asl@oL!T-jgJZ^;9aGZ)3r$tlp zAjQLt7s?=YkfQmpLXe|akoj|zJqjb*NUH_`(-Yu2TVXNuJO?YinFSFJwOh9cqmiQ( z7A0=Re-ycl$jRI(6_3V5ze3U&Ftx4}KSqfN|63@y01>?zLPpy!%ZJ+D8ltTKKS8AB z7UJc-iQWoKO1G%nFoi`ies)B{m__-uyrUeLG|gEYlTWdz2uzx)F2^J*^#2nk379OP z@)MLEmTQM?gC-~ztL0E>-t~7YN|ijhuYY!c!}dv6xuv87Cos8r^*w1qV>i z)kD%jYfa;s!%54(&{};qM@HIgr4PK+nePnENJ(JO;_)9lB#bOWeWT|n9w2=c==8Wc zk&jbeKg(@*N-qqEMX0{uc*^~cR$l>q@eZAEjGN|M_J92Ud9 zOL}3aV0x6Rgvadvssu_SyK}+L_w6zdEVKc$ED-jS_eJZzuELPZbhCgJw$Y>@#Lfr` zNWUFR*D~DvyS_Cz>^_r(VX91llM>DUi0WX*jI@5*H3!+19 zhvq{vmRv|$sMK)HWG)&g$8S+2=@sUB(EEYWUaszOE`ctTiG27}EOI$ig-)_$-1 zyw&UDUkjp{ufyfF{ITK%8K>#T3X3cePDOoxH(T^u%3Cy-FwV5hWl(krXZC#)I_q-9 zO2z9Gf9e4cH2eBes7S~1sc0#0?8;Jeh|y(+`2I3J#F#Qe{Arou0ZhgU;l??{IQs!M z%}DD9mz8XQiJ$Nt6VFth5NiF25^LGNfChe|RJPuej075;uSEGeBRyCV>A`_sfAPqT zT}X2eU;!T-SoRd}(OB@NY0J47SH*!;7TNB{tmwb>wbAa$k@-rII_e1KL!7xsNtVF46Pi?(wCm=|eLV$f=(q2>NETDuw(eUDD8R^r@n zX~k;PCF4L$5T&hEBB<6HK2`PTr{zk#pSV2A5RmU;)Fch_ei_7lEv4>)YQ{+V)DvUD*hwW1p8WAYtgF^$iNHpNGj+Ui1y8e+h z!ZI_K3R|3RC;e>mvnc~5DbqG$GZ+R$-hwZbCVsajdm0O{eU3(Q9gUiM2c&yeoMTfT0 ze;Wk*begtJNwC~6rGjlrRmLvY zfYvZdD^cP)a@P|$gfIh$Jd+VWM1&Tx_tWHU4zJ*>J6XFF9#(DAE@!t6?1GF{KmlJu zQTv)Ee5q{kVI4j$q0cUG-TUHhrDEJrJLd|p-$e^Dj^tOwqX^tiH&$Mv@w=7U(ir+; zw^EgDlHJO9klqApbo2cX8ns7h23l*r{thykZHW0En-Q?HdlY8o3g4@+GoUIIIH^)~ zny^=4E}GBm<(hHLeF{6z9Iy{7IL(&7Pg&}Mc!y07D%n>2?mG(Go^@xSp^B&&_QM`N z|5}N2{$DClY9J1Tc{lnQ@hT4S?1;6Wj)275jwvDj_VN=g@PlgXCaG47 zVBZk)Vk!vu9uYJGN#g#gASwyRl_!p2h8zb=$fMlj$_tk5E|lD~LI_iWc+3h1Vula=sC`FH@*k*qVsft|)lO_xdvK4%%e1pRY+k_uLudHJc@|n{~@;|Bg`q+<0f{iof zau-Ik(-E6~QfX{~qxP|Z&cx_(5V#xFR2z~0Gt$$j<FiTZ3OMY;$u zxR7bzqO}~Lj3e{z(X}gr_IX})_NK*EWs~&vrfbS>3tMgVDRUXvb*)NC)yOX>Hj3gF zCN;6W`X{yv&br6nfGw@?IAd&4emEQB8{D)~?Y#RBR;q0`omQ%^ZaS@05NBYe>h%}5 zQq{Yq#91atdD6NVM2g6|rBudryHUV*t_f6l1UI*K-csg4gB&z0DkQh3XI;8>PkD~M zzYS5s>=sNuk9Es5`S5Q2&E#{&=TI!|xT%=eoHB@a%QX4?@4MwbJKYj6%4H-KKEJhs zt?7N3Wg&R1e;@>ppC3Z-csRuqw{49{$A#cg_t8HH9-&VWJRpqNh0eH;#|4j%A1POv z;E`Uhanzg*s)s3j%-NwnRrc@;eN6VC5J^>pu;CBq3lZ=gxtU&;R3>cXNh%XI3MDnc z=YA=B9E$hPc$!CT&;JtTVnFWjwWzHjcXYF;8ys>+`A~ydxX&|Zt6_O)(d@10HIiS zm9fYFiP#bPuVTmFm}96g6mgOf$1kdc7$zx#oAi))+V8Gbaty#mhjuB|DaJ#M6jDko z9Sv0jsE>z=;HtI_9_j`sksIlSX*VUksa`6R^h_5x&&26N&G?DDh77yF@?ZFTsE}cp zXcgEM4?yww69mUPB0ORe@%nJi^KXm`Xv3KlG6swFO%$x>H*R3=Ns z`(o8iq!)Zub}}&4S7q|g5npvIBDI+}xI!phyBbOF_^Iq#U=p421A{o+1g~5|%{Q`) zL7etenT;j|QL}1=*lPHzlbGoAd3kk&)$eNy)}>vd382FAY61m?sxdSwOg-xgfr>rO ziE0r-{v}GFebxAfLb%}M&&2f?;VO%+WmgEFNvsaF%PA(d_nJb+e-W%ho!TJ`)aKIJ zXTnjgm+D8Fx9T5jf3E>GshnZo2_Kqr*8Xw`b5%ZsHb$sDn4EQ{vriD69^2fNMh)@u zCpl8}^|iwgleH)#5}W4>dM8pXz^qoQpr+%>3zKyaqsuqcFe85PTQ7MP)F;HP>lFZ= zM?q04zh6>9sZA>cQU55F30&_*sZU%;IU2u_eZ+%W;?0_D!sMkx5ZI<5g&VV=1YkTE*Rzo~TD(4Xvp5W|Gs1$|{$f zLaVBMnQE9_O*Q=foaAX-DQ7G@C1jL z;S!GD;}kljy84X|tNX59rV6Z~K24_bwaZk#Or~mILoFjyc?XIplH7#3riNNpuxg1N zGNmRcMH+olQ)M#MiJE-d*k!6vYF0~SS_K5FR)3SJ0w0&D*p@LRsrM4q2~Hvto9rYq ziOHPE{7)pQ!2hWv73h?t3X?%(7y_pi<))}ikZPEsHgvb|OTWOfVo-ZpT#r+8lUO{H zAZ5QUZ*Iz@Ck3g$QS(4SXv$D?KO3_ z*~-qDEsJ3tHy%u;v$|T>a>EUQX6Hvxueu(M*dN@lzaa(CoJMLGnE2X8YVCjr91gzO z%i&3tadR?VZKOs7-*6L=fa6S45pFi5QIw&Muv|Mv^PyT=ZXBR#J=NX;F5DpE3D?K2 zfjHH~neV%5WjgqRs$1^lQ_4`#&wlTysgylbwbIKkstN4u(^ZsO^&(20TS+hVQY(;K zW3?O0a~FA&8zXP#N7SRD7DE>st6f;0r^xHqMAcpPFI6b{sv1pSHBmdUOmC6dvMDkz z>`QG3!AI) zmYH*?u(|p!gDy|;ZPXA-uA+HR_e|A;GFzxiSVpiTBYU;)`NcZ^6eMz0izAA{!UFK)B_#E3>od;?b(?%WZVx8mx z>vOlMY8AfLS;+UYDg*BO*C73%8aIktp&?tD%0t6vxzz1ecGqMWrt$z#hw|{ZHSZ?e zT$EY!?j}d3`R&viZuv93j4fyAU^_KIT4}q|PVFj5{cSBW)QaqPKnJxGerZof^;;~+ z1)bCs=_DQQq<$uypwXSxS0xwvwKI5sCb@S}>*K3Y7j>2OLpMWXhzX%rv(&ECqpMoQ z8)>E`qXAvdQY+b!Lyvx+<8Bv(PIpz=g;2Zs;Tci#^uV8GkwQJYsr*9dyWLd9?f7O_ zTJA&aVFv0WJe(efn44^(YfY(ETCUuVnfEj7U{ z6EL?B0K-QMqW6)2^hIx}YuK{8BhZRvH(L6Te$7&Ooa%gR!tx?Cqg}&s$0c2aUQy$^ zio3bkhxQw}&xnotk72_eyYVq>6b%yCI626<>Y@kpRrlUtzUpodR=<$^kCo*O-%O^R zL)7P_8+2ocdI__A=54VOH^gau11E|bZ!8ESr{@zXemEA!<#$wrEkV$8PBJHp(y6qrq88~l{jnA(YZzL;u!EAWs&59) zd@Qe=F;mnu;yu&^f?fEYpu``Fhp|6 zOc{lp2o|w^lse26Z7h@oS#t7-cG>D8^yqpv_RNpeXEb&nj%U>^YHzwbTJ>ceTSCQS zfZ~)feD56|BX;B`B6Y_HV(+aGpJT_Wix|u*@%hp?@wrBP29Fn?>%`}e;|1&n{%Kn> zLH*o{ecNejnSHxM*ltYaW!+T1Z+Dtkv!9VZ7M7_a1KyK`$nzL|Oq?cGYO`t1eLHCy z_U&@px@qblwqN6BsEDT5-_~fRnt@-MlLIN-g&yT#17=dfhiXH7_4rU7fZclVL*VKX z^_iun*eOup(K5Ygj~#rJisz{Dql$SlwqLQ?FZtPsQAwHVGK>-@u!9&q!3mEE5T~Kr z9d9`L&Q??1ZX&cCIKtxD>eoK`2n1->)_`&*c8N7dP}$C;4$V<(b$ZSC*4gC0Ke}); zzI&{{-#LNJ{=z>V)6LuFiizl(i-|D1wK`WFEbXHhQm^3D+jp*7SNg=(c&_Rt1bq-U z8aPjNFwyttaSgZBY(jZ9e4cr%e`lP)|BTPGPvY~e2}j?}frdMBw(1}BGcSb$Ii}&7 zBkK5(x*85?^h;deJ%--s35Aks42>uU2w%W9VQuS2nm_3!H-+uz>G?-^_Nj zXB*t_j}7j3C$M91bZLP=yxT$t;%&_rs<=nrUsFs;Z;IKd|z)lx1MIpmb9|QD;dOTikN>p(NF%*p=!@N68OdSV^~4 z>g!f1%{E}2T3t#=Gv=6a_e_ETl_OUiHHQTJ;EDgKWRe=R{NQ?3VkCB+_(l{z^#!V2 zfGWPXwPimD__s*p*=BsI#z5<*b)TsUl9!kueJ(;Fi1}RgMB2w@n)bQM!mz&fx!M}n zZk9dKl}|)hyrBLRf38O1x!2{-)twmU+Ko=G>9<;xGPx$r+=M*AEn_Isre?B^ueFf$ zGUWbcHt@{dYdO!1qqdc`0E*ZQb0yeG?ae~4>$q7Rh9-(Pt9u#brxq%B71Is@uLqcj z-xe^D?};%HCc>@VB7`*?ZP)@fvS6#=0bhvESGRGlB5fC3WxGiIV>{uGo1Hd!%=UwV z)O~l*LFy>t5O~ZUntF)ynD-B>b$veZH7+=M+IFtmg4~X%o9z6&{BLC%V+j8ZJ9ds5 zM}9|DcNkcIH$k6~onI0x@yq#d4FfZg>!Fw>Kln(s} zqG;`6u4QBua~70atX^bA#HehWj;Vf<>+fO4T??hogDw5RQZ*|4F9GdjwRV2x|25}VL%vqq#4PhQ z?weH#;Q%E40SClM-#se*8b*NrB!2^@HHSuj!(g* z&C|fp+!#Zv!=|Lo303vCPbKGNP+(9lf?6$8gKT?FpeG=+f1c!gZNiU&uZ{od3BESq zwBT!B{|s&fp7QVe&Ao5e&rCh((_=-u(hrc zxiv5Hvy8Rk3*3uwsu>qm1wV%_LY+^e$luf`@T~$90rkxbC2q#2!Y=0>u#_@>Q-5M? z`4)Q@?~v!Mfh0OJ?R~Gqd95zo~m^ep~GJKdvv* z>C51JPw0H*w>?%0!Hdlbf4_p(gz`6(^#V^uco&aeMY>SQr$~pU_b$L=ZvedXOM-I8i+yDlOT39< z#Rn+srkchW^sbvi-~06@XVATF3I2JMj61>rV;Wo1Z*yZy-fism!nt(hHs{pZ9l@!; zX2q*e;$6Y1zZIW1?+R`0d-1vTFOhpfe133GeEujtTiv&tWO!A94>*@!_dwmpMt|0Y zO2(*_ZFvvXO0JBPUvqh!llxgUcW$zx2#$v>0?_3SFIyc69>C#TwVOoU1KIh+ixCP z1Idk|Qmc!(X?-%D#C60#}YUkj$4UK)Enf6q&M1){*q-dX}Q z%`x6uf2f#Oy|q?uF696{jz-r&;S3+`P29iV>7yk%D7de$=I-Ud;{;Y~Jn2XT8Yh~k z^UsLJN&IG^T{N2H1pa3a01oypMvUT zK^oIS(}Oi=p|+vHnkO!Dxf_e=a2S?JT%S)IYG^@-R@u3Z^7-IKE#Xx{v|Qrs;j;|y z8mhJ^A(fkhPd|Z@HIGG>jh2q?Qo5A z{*`8XU`6OGIR7dWGvNGZ!nN+;{91&@)YY*O8dF#IL}*N1&4|?6u-70TSJ0BV1@==b zAyRlKU8#U=xqne~QbTD#G1K z1|5#p8Vj!;fz06_!t!jU*cjfCburo;iSg*|{{Kd#X4T-S z{xvmzRPX~&&8?+DSEPltMA1{C=+s1Q5o187(a|knKp9Ee77I*{{;8VdsG$4>F%x8`>)IL14YQ*I>S-a6TtBF%wR4|i!Mxn!89{Wl9_J@D z>vMiGqdw;+pVsI6B({Op3d_4+1MLHFk*f{La1pg(S#JEmi4Grn3t1p=51qq$77Fm_ zF`PVd0{=4w$aekPC0%%2G%q;N&4yYHJEg8HYhQyz|0O#o)b|4cD<+iE6^&hh8EZld zI`FU4IIc_`8OAs#u-Rq7Jf5%)jDND*;{i+e6)nl$>$z zeW#Uay?t&YjU5tBclO~~a6Y3<6&c11C$IzOG^&x{eDfMPIp4`foJUMBIFDFsfJZQ; zWb+Hyye8`lq%u`AO_->lr4~skFKT}1=Uit~&(hC%Wh%=s<~f0#{mgk$^mFx#j(*xM zzlb$&Js)N)pe-+edtC|B{KFTDx|lZjI8SKZg!6=TO+eF^(Ss%$w_Yx$f+kuB-3`}d z8qiepbY;?7J{wFh&1kA6Voz;v%6Y=WrkoT{YbJQYkIl7YybwghSvu1kHB@c^QE&yd zY@xN~b*vJ}pS92?fH%l3oxFh-w}e<@UIAU(Qj6t8|8XaFvA%1?ILvpyZmpi=4V_!D z4$=8m+9O;HI{%W^#E+4U-IB2vaZlMh>4vSfB-fHd(3PHT-_ zGNQGuHRg3^UuzR|j}tVq4M1mJ3jt{BHUPbN7LLFHI;f2Roz{kfE^lLk9&m#G#Xv=? ziEROT&TKWktpFX+mV-`cYl42|1U=E#(W-A6KugV5Q_}=!>ogAfMw$tF$O*b74WPxJ zu{Twh8R(Zkiw*~-3(&-L(7_JWH{ArCU~!;nTRK2zb2ME|*P<&P5go?d9x#_;Qe>R_ z<9DT!+wq>XXlGV8(OKPsc8)P9O`3x)*6c=>yF5Z?_ff$ zb!NTOfkWllvkIJ9H$+x+M`v4We-Pam+>t}gw`ZX(d)76P717DrmOX1=Ck{pSEVO0M zx`Zt5Uh*szb;d?a?5rj7wf%<^%Y8Zn%h$5QFyHe#gFAMm?VZI;|Ik^Rl<=Jk@cpZa zZ-f+ZHy=j08Rz-N3fM?vyJ*dYyd^;dVO}dY(}^xx6ePOaT~Ol(6wwtsKaIL})f&P) ze+f>Ow#Nt2>aJQxZoR#1ubztD)xy25@QN`przxcyh{Q$PsBR#g;7pUcYwTcSM|X`K zY$!dnnhtsO5kIK-PY>;Niz96sJCdMZUe;RqKs3MOXyy7+wOaVyC+XV)euVLUFO45| ze3z-Q!;XHvHGbIf=BwICN6mYA$@JH>lNJ!A#6H^l80^YE+UxiU=&QxMuVAX_WH*wo z<8el-zFJMlQ$zbQ(b%@VueMfl)O4Bm@tuBPT<~ew59s=Wj`q`-8wcP1TCxSH>OgG( zI8luYP??OuIPaEF_8#qlrzl%Bj%~pGu=E~-@{(F2* z2fWAU^!N9)n*Mfv!{-z-`J*vV6{hsis@gK&*DC#eese}>tr%PVX@sUaK>1YSRyaT- zD7TjuWa}^ztphV3jN;Q8mW^q()-7jzMft;V7o^r0ZI5G8#PmKGgXwkW8{n85WuARM zh8~QAL83o(7|&;V+jtCi1^qN$YmAC3PT&mBkFnKk zjA{<$%;voN*lfSJ3^X|L#Owh;9mCTwEH}*7M{{hbQdB# zT6`9HW>T3tGHB2|?I}-b-Hgei6h!{T^E9RWaehO~%@}W9gr4F~#+HN-ihH=-l{`Mu zwzJ0*>})tPw3jalK)-vyx}Q<(x8AW*Bpvzz*5)2?0FUj#&FGbax}ygriD% z&>IA*DI-to?FtGz*PW!)+QD=*PveiP`PHd;W!hy!nO9~gT|eTPFoS&L?9a0dW`3DU zGmQC8V8>u6XR#^hE{33McJ%UM?K*bq>3qnN7TX(3v@;fe`*OL<7zk|lFQfD1m#_KQ z-d(2Q1wk5FR%%-f&xX^sd_C)kK!X(<$S_y(*X z%X;l~ZVWAQ&nxPeh?iWi%+@M-?Gh!VfDdT>dcIq)t>?RS)CRU&_tD-0zFRkb%6IFf zPs{GsLuC-!o+^LN)x5*bUOdaB94S*rhH=CR?3k1%R@hMiQr60O)P%#4ykmvsZq$CZ z?^@py0b@S74%h^_|0z$d{oRaXWeR3c-%U^M)-N`hyY*{#il0|8g!U}ZV#%^un};pC zV6*l-Kal#?oz6^Y6ikN~YMuPPkndZf1eLuF(0F3&Zm0*Y!_rTDNtq8w5NDQVct2BdJ?*%{n-ZpeEHYCK%`=CaT z-Vdf_YqU4vA5{AcyX?$<&IV%+@NGDn;utXBhSLvd?CQuE4;tRSYa|W0Ji0QSIG}mU zX~qX0f@zuVudx}&dhmCA=TXyb3Lxxn~%asB{0_n_7+h&^cj zrkqhQj`5<-0G;ANgT^K!0L4L&t~?rdP~-2Hr+HBNuXv(cdQkK6-nBKBIUuweCEMxt zLC9+lsrDf)(dVy22+zhlFazE1lo}HCMEf(H?bCuo&`cih09`+%C8OE+!y5C0`|4pR z`uD%ELeZFe7>ebwUxZ@0?XXZczCWy0PC7UN`9`jZ81eWR2q!0Ej-2CQ7#(@gwaqKJ z_gKJ2QO_eVJ8b>U9S!t9f(EXC!<{(L%p;ja}?PW00Ch`j73wWPq@R+X)krnZ4= zyRN=owtmGhZA;h4_#&M7!aLJvxJHr3v>ukJAKHc;(?0Wbxc&0xF4r-0%!$;Xj8iIQ zt+Z62jX!ED*u(MbAJhq^|D4h)T8dZF+*4Xi`QqEh@Ft`f7ZeQf?;#58xGXr#V%YBl z2P4b9VYyiR;AZfjr?mDESDXE$WkUEf5Ap3TdfW_gEC;7C2Htt3^$VgNrCKF=@DmPd z(#Y+!RvYq5bcjzlrJvTq{lwD}_OQf-JuDe|n%8~sw3dm|iKQCz3yF2p_f1|;EhJ7Z z)vAWrU$T_x8Q!z(E#=UWXE^lmGaMQYn%Fz=HD@$H=SdS7qq}qlgk`3cNzk8Z{GNyn=cf(zu0v;KM%UWF8Thtt5OZlQGTYuT3qZbiYN}lmziOZ2e}uIOr6K3FK~US^ z7#MK|nx9f=l<(p4)bfHh43oI~f|gWklD}bI0xaX5^-$?S_UP9XImC64YVaddSR6N% zR$bHvx=ozI9L`X3_K4n67u)FHw0i7ZM;bOQjuy5!=;7iXkV(cjdEs>bcTA28MO@OD zf3NuPqv6#35>Fb2BpCc$*h8VSUj@@Pk^F-wc|;o>PEnVkXS$Gj*(~Wv*IzgpOxc%N z1$k);sz`CP{W6TanR!OPDpEL=3IOQ}Z>`o9CX!L6_?mh})9`ih3iQ8Bx_d?I0S8Pj z?8Q&ejnGC7%QXbGJvrYMUQ-h+a=H5WIzFE}%ki&=z>bpf<$TvNUYI^}e8Fa8d^{g+ zU2#^OP9;}0=7lMkIo}GViq|x_*(Bq$zap{KLIsO3y$HbJmv}V9c6u0Hf30>1eQ^yo zob+7Js9-AI(bTmLf;!ei^#}Je$509ANHV^*?Jw&NYK`NIb!5SQ<_;>1Mzoyif!?&a z4kKMVTAZYZ(&Fn{^Ln5ufA53{Y{MLrnyyIAC{gHNG-q$jV@d2ES|_(pU4X9`D)AT* z8jR-_%#U0wSMIPjkOTKSJDP@6MxQI9C*x)@U#|(4x*$7}aqB~O6M3wczkW!ie=v0A z{>iZwPw8Ezhf~#Sn&O$j+hp%}=l`iOpH&q_hn>But7-YiKz#hc#M@`NONt zy>r0TF%Q$rUy?q&4a(4tvhHX-u|SXB;iR@M*=vkKW%cOH#*Sh1{9UcFW%e9;|1OR% zE>r$pv)8!TZuYu0CHm2PZRiG1&A zvgPD#R(*u8>EjCsvI0R__ptpZQqDcCKDtv#B@M8Q&)(A#TsKZ&A#gnJYw^rSnG5`U zrF&foqryi(MYsE!CyIYbXC6X>8*v}f#w}jFz)^gUv$&7&9>bI}#4qF^l^$)}mNto`g%5FF!TWv4S(TR=8jdZi(+{-<*11;W2&F%OsGIyqOR$`oN9`YhbX}&= z>~kVq=6ha=pq&_`k3B#edQrlAk(Y)gZKb~+Y0=)7veAuNyc=^8^!n1FIo)&)U*vTq zoOV3a!se{g8OFZmpmU1#O7P|Q4do}N!TIFFwQVRM$;FHAZ9nWs(|6tXrdWUY>zyp= zABL3W6Ru5IKn2DnQZ4$-T1&?Zk7PW?B^rnLQ4v2N4zc)ouvt804afi4U(jWX-pcwL z0xXg-uVoZ}JpJme$Ak?wU5mmK5hu_7P>n6{lwQF{XKvw*E3qLc zn&zV?S*A!d3aJ$aJ0dFyYa_d(;S$g>-W$GP(ig+2KyAm6V`t4zugbH95 zrnsxI;gsU5hoWHHtFf_Y>#eK2t>M0Ul6AfXPlijj)(oPruEy4LWtIDg$^-m#=1#WN zwb&?lsP_{Tyo?OAVoM2=fq(_!6u&VX9>Je`&b3&E^&NhCWYl|+MnG9Ogty?nPT~Rr z-lYfEV&~FSe|;X<@b$?TLMS_;Df7;0+-MU;3ophcVG-yX+$R1Zn}Sp#{SeUfdA6W8 z#J*_@DzER7Ec?AF@IN1kYZc73TWqlIaQKlJtTTrnru=UA&-7ot8u^RKv0p$luj2vK zp|bzYGUG2?(y&KGg~575w;%uVG=ABf8=?<_^?PuLo&$$G)=<3-&UV^|VmH1|BSZD3 z(qFVERDTy5B;>US*T>=OXt+LIO1Jfl(B0Ts#A}gyK2qH)=tC`&Aly~Z z4V2wgLH_~RS`Y<_l}_J8>02#_rqPGd`b>OQjM00s&v7w&GW*>Wqpy|HmcJUSGk4dK z+*1V&kHb#vKojG1!;kg*L^h14YN{5s`mW zZ~aXf$BG~?X~<95c7+SaI1gWe{|uLaatKw+q#=JJjxGIw-gM@A<1kNuBi{T>OZg+r z+uz`lO+atBiOcL28-o0bJpU~gjUtqe^seARo(X!i^*cA_$Mnu05ZM#-aA2rQg8l)1 zP9^Xa>t9i?imPVzD(WvvHmwS_CouAIRXt8#y5FUY^txcb3lkaxh4eagze^eE_5MEl z7Zb-W?So7ARZ1`&sj7QHB0;=2dh0CQeP$==Ub)ruUXhaRYo+U4zwO7k> z8IfIP{tPFk=lwi$Ynp@fb+p!+vTEu+7-hEFI>Xz~;E~>#NI*ZXIx<;j+IKXi7b9$G>ty{o z*PUO*V9k$D)?=Cc;R}&{YBRltH($401d0>LyP2$Sa$R}Bg2Ee8^jHXC#VI;-%2tt5 ze(e-Ov8j5z<%jL`LaJUF&SLwd>fBkZuThx-o9Z<@xd6@)Sd^-Fa-Fo5ZMEpyye73a zuc^Awc&66YQ)}#+hkV17qD^CupCN?ka)!lVb}ZiCnxel#j%KT`mgsM49lfR_>W9QR zTHiW)#kkk)o`dY<5v$!Eio&$B;K%<`1zb+QRdsL$?NZq^WkIWWN5M|Z{Kb}b0b@?QyH2VFup;TN~S8LezxM31B zhbqHJnxDY~y@A%1nFO8Bv5)W)$ybdjntxDFXM*#ZdU}1!xkdDAJ)McG!S!`6IQv2* zAKh55>19SNXWMH~eZ7tA@*9Cz9lPu6T$o2ZaZ$_+j?Ie2H9)aH*D#s?KMm}~4v1n- z37n2L&=t$Y-Q?R)uOe-s=Nj4@J|v2kk+5?b>MvSOKB8|MqL25;D%*=56-CY9$*l2A zS#Rb#|0vrFYh|4|7d|TM4J3qDQ1oc21*2PEo6ZM(BIA7HT?I3Ra(wY#pmCubkK~S^ z#0|^!;cUVWwpq5Gm>LGyZ|ty?t?8BgzvX#x?f}0~4hIWMRJ|JP(cf_|PQi3m)jOyR z?0XXoF2u?<`PoOV=#8_<4714}98J;?P1isxKGXDS*w7~tfwf@>{i*4VqFKE^n)P}; zUhkoKl%`|*rc;*A!Po1&U#H7a=`Zm4eofcYIeh8U;ZOZWJsWZOk&Sc>#QiK4=z28$ z*hpvQ_Mgpa9yZdGTo?Y1g-EFe$8~!{XV>><;LCD z;f-|`lk^XvX&%91bvv~jW^skC*V9A%{uFZqDHT%0JxXX|UoQR=5ODMZ3FTJiQx;~Lgn)2S^2g9t_T2VWCAWYA0>No4A{Zjzz+?U(>(S+wdOO>DmGs>b>8Cdqz6rc~3Q|WFbDeY@|x>#ZU+v&)$ikzgVQ4AuswH?Auq)!*=qgq4M zb0NPsAxCCXgEw_%yBjFJ=Dn#8bLkGzT^ay%rS#K#L1N75rw>JHI6Ho!$^%I|u47p;@1|bQX7@ z(OWu;J22@j2w9o5>MgyZw49E-rQgKb8!h{^}@DqW21I~ z!=HldJws^5+qyTda#;`pZ1lZ)LDapAUdi|5R!>7S&X4g0y6ClBZ_j4baz__P zx1UX^fb_0Z+6Al)#_9BT^l)B9GQ|&g7)(7-h!(!1d-$<>3d=bv>d_Sy%_?OlHPgGI zqV;1Uc|{w#ii+ZgnibVSOx`yJkhZofSP`74109dX&^16`dX}dX&~(R8;h?*&~?>Cf*3A#ohH-KB~RW zIu3V79T#UY^gLvBoS7`p6W2r3ku%J!L#LAJ{s^GZLyzNi?043&s0ZlO#h+L|N_yzg z-ZMl$FfF?ei##E8&%7{Ic_4KqwT%*7&@Qm?}u2XC5a>O4z#zPLJgAq`&ee4 zXSubIQJm!ej%D$0qHy*rIx9Tm75yy?F@M@Mh^fi`HT+I}3ATsV8CONn>Ncgu_l=Q!^SZep zeqvsscO@ybF^NGeYTzO zR~Q{0t#`u(!s=td8o#s+7^D9vNjB;=U`+G8xeF>u9W7J8#AW#GWU$E0p~1m84ySah zl^I4yuj$Ej@asRjH?!>=r@Kom@X*YrQ*?5lpm($se(~>c^r&-uHA>m=Ty@J&o>bIl zcq}SpXYjUPChD6RX<0N`uVV%%D)?kkC|#PYH?p`e_g*2vK5&|7H+W=H>c@wI1CYYs z-#}1zg9@~q3ct71paoO(V-O7rs!y&=v#089EOU?1=+}qD_;7oNG4~iJ>weSp7{9Uj z-&io8M~9erjHY+18Cy+UsNtnD4D%9gSMYGBc4(EK?%J`JJ` zY{jcO22thdu&;He&!_9>aaVW23@(e5il3qwoSxU436Up_vVTIjoe?v+kdc4>N)TMdRNkCSQr9CT|WmCn)g zker>Xr@QQ*C{zEB^qSJhO{Cwom$vMFMC<0jBJ+6R-DB*9b4kBrn>k-UB8@^;>nxIYx7B(TNJ?G^ z{#ue45)yi6v(UoJ8EZD#|GTisRnYH>SV30>n z-iio&I&=vY?C{oU#=%P7w63`|0ODiL9b=@Fo@ZQ*1;RE|HT>CTi1!Ey23j&#$Hvg< zu*ng*?ML9K!>furjq3EG>T+RRLppQU2(#W{3nYDF({O|z9p8`&jzvY#XB(jXtftX_ z8TFwc83lTZ&x%tX#*Wi2MiRRkKdQPBiCzZWGYnsrkz{;2&5z5HDZ~Ch_Pzuzs_F}v zHv_{C!@ejmfGgsH`#$f^8@0>@bgVQ@$V}5pE!$1Oz!eorIaV%^=29-;HmIn$o1$V_ zT5eG83xb&|>38nE@68OOe}n4#{{Qdyt6w#b`|jE9_Rc-$-gCsp!XC)EaUp2o_z&s} zu6QqC!uulABP&k#=mfK3aND3=tFJ%{l^QdE`E-6axRJZgmE8GKP5r+@YX@iitKv&) zjBJCZQfgLkl%vVh+%yj^Qz4*WdB?Y%!Xq#h?a?23 zCZ-^KJ}5tH@p;RS&|^KShm-{;$kD%DyU`xARZb7G&0JMZKJhViDFUEZW7ylZ>rULp zt2m*%;E%0UtMe6rW;(4{k6Py%`Lz=oVpeX2hzC{9bEId1WsQFaA|2)Xtaj zd4q7|o#5CYT>zOUSMkQ@85RZl@H z$o&U8f3$i=*}Y+o1f3t+9ae7Ehv351YyZ$7wJ-i%%KyHPKece1X$RMU*)_efUef}7 z2$F1QSAhkcMb}8YVw~j;GMvENIO~C+XO0I1g*j7OtQ~M;hTR>jHz*A7xIw? z3o3r1!4>O0EYNpw%nQb23<+E3`a_>BXkgoF9=%0BfqtS(-DdcM<2HRAr&Y_Gw3#5> zuM+@j7JlEYZ&EuOb2jqEMi&BIP+fWA zE_Sj*zX!c@eIRcSvj|<;qu1dl%o&%fgtxl+fm4w_DuBCRFqCDv3#mzKTVgvT- zqdabvvOLrdGbNA z?AOK6+|IIt+Ew=M;9<$qa9qcp#ag&BeDxYS$M>T}=vjDfKN|O!?g$~&fBn&ZePgu9 z%UQ5^b0e23i$&hbuRz%n7SGi|#O2BE@Nhpns^E5j+2QLRV0L(CjIlmu9QMONEOwss zn}%(NKRUoo4@oT>1!4Q;;-7WxRV#~|(Uq`lS^P{w*#Wt!BQ4$75qsF((v3U5g;$Hv z5sn>*eo=pq+Ci>7AUo^8JGra_u?cEf&d{DK(htDNDjt-*N84VAtu^Nl(-25JQ05QU z527014}=qcU}UC4dQa7APsky=LbR0|EgBI%p$D;I(|64wai+@4eC&`uL4`o2DI)Qj z@x2rIO-1t8yR-R_@LDjYwTv;)LmArxhSqXkxr3j_@OjsVjj5CcV-wBSCW=)tY{JWp z<{DstXC{dwRp}42eq@fk(mI$Cp?n~rX|H|0$Mn|XWN|b;=S>#r6}T~L4F2jB$!#G! zc~X5?y~aRqX2i8|Yzc+OSf{d_*CogB3xF^=W6>dYoIaa{sUlty{5Wg6sKXPsk<-N% zsCLc&SwB#P_MIbpW`@J+{8Wubw(lftF#IL^j=c9EvVBLs`Y$IMv)Fe6&1D-5NrF%T z@%aWk?`d9eO8+_ivtpJw5Py1Qh+QdLY=go#7cyUk8RC=p^02i#K~jm{KUC&K_R$7g z4iuoJDQ8)%pZU;cg9|17O{u=QYTa*erc~cvwYUt%lc;XW=Ziols$Z@w^^`OzeUqpNVvD^1>zkQ2g0`2{$kOpzM;~=r!x66WO6A znRC3^xDqex^_Uhm`7(aG2SCncKEVnuGn1UK$G`y!H~>8paOMj!)@klOKQvWo=ZX19 z+vlqOWy^N_}-=J4neE zMOnH!(6k&aWpkl(IqqsyaJpPyCX~Rz3fy0;0R2J3+lYoN5}&~z;gDerl6|;HtRvw4 zh1YK4*%2hab&1#mDNi_JScD*}mx`OQ?wRilbf@h7y&)Pk`fba^DZ&QGxTAj_*~wWh z{((OWzZSczb0@Wf#2*a(C_C5JigjT1J;u(~dwA#q6Aa(i=V8^(#|)DC=G1neT`6{u zId6_kC$AKd>7}|=BJG*T)r`&3p9~!krs9FVyDEPMbb6@oA%lcK@y~`(gxmH|zX-9< zI$>BLi~_A7Myg-JOPJd~y%7w$J9>BUULy`ghPMdf3yA8-8u2~+*?P+GjH>81oKcCG z)RFPq0+EeWi(er!A4hRLRvL4=MF^BQignZ(_uJBzZVLL9qKC{u9nftMy%DI{29a`5 zTO;nEt)&s~V@sZJ7EL&`nz@M6@vj0Gu@nAv&qeH}Oaqv4*5Itn&Np1eh$mQItImSt zO=3VTc^3Src=YV20pK*ynH#x@nAxEMUT_zO(1GqQHd7sa02S_H3o6Cw0x=E+$m{!@ zAB^-6k6_E4g1Ae)0>N{u=!)Cu!JcAW9Q1h?4PEWhXJ%{_o2!SA(uH{g)VOo(eF@jC ze$d!Uw6i}?xMT>&NwMIPfkiFAiwgtIm%YSgYUiC(eTcJm5G3pr{UUBB`w+Eu5X~nh zM7nqg?nI5Acon(%KugQv;T-Z7boLYLI?wrC%fJ?7kznVFKeWUHUz1&8lIprE=m66n zY}qC1g#>fLO@lujN?vo(AKi10h}IIbZm;+vEt{|pyDR}l24n9W!Hk|{B$|*$-8Edm zEl((FALR>3Fhm>>U&cyBp`sB%d}@g^g-MWIOH9R|xJpA~gdALH=#N!a*2eBlfU66L z1Wm%kEy7{AwvarJCov6@PzK^*@q(}##^m6E=9v-VAbh@t&t^BB_$JK@Gky^jz|VHN-hd z3sBl(C#jZzT$V1w!xs#c{`v&vcUT-Ltq5gMf1s=mactUJ1 ztT)Fu66aA`Wvd8btmRv2by`iDqWR+W)r2m0GglM(?KCHz#;+P;JaR@{f%wOlh`IRF zv{V%FXLPAZom4(+3H=e{*upx~N9u-uoxwtMOErShwP=HH>MK#t)r-DTBib^}#V(Be zSJsv}(i|7<(eR+TSj+iP9=ovwx)$6_5Wk*KH%OwN#KD$W!3LjYU?qN1E$4M>_#KK> zXE~TpOOb-_%*do2fxyCAZelM^V>cps}C@xGYm!Wd&Q%j)5I)hhUfF_OEEine=SWz|JUOxmK{u z0z#=37LYLKvT2;j!|fSZ))qo}^r`O7;FE9on)|l z3s_b->$Rrg2sK}ZdMHDU3YP+fmta;QiNuduULmQ2f^P3DXkt;5@t>m^>h@El7 z-;m!tu)bNnljtBUTEc^UMD!HCg^Had4zYL{;rwY zq(k`=qb2$^zt6u(GbPaj!E$#K&etLiMg_Shq296=dha1rkU>V?0CB&Iv=uXqVnZxF zyoYz>%->Px84cRKIHDc`&B8SRBD!#h_`L*;I9khoC_z4zmnW^eKMjJ6k^BPs+mgFD_K&Xmm#O7WP zw>aWyPHGHw#7_#u^$`7n@smu;gtLx1HBq;BxK4lXCi}pcLnIK!$4a6qMGb|qIKC6$ zP!Ghy&9Kx6>xf2JI1?`hLbJwFg77soc_4;jwalJajoV&1v4dOTNKbK?a0+!iRwJ>A z)Liv&3y2R{X?ZVJsyjlOds&UEj%Zwk#3T6Wn$}xvfate1l_>f{y~XCWt@cz$*`BI2 zI9gQWzC)lF;t}W+WHe(y3*(U|Zdv85Z!=TYhp8s2vsAdk;PHz%skxWcl!{jhw!)a^ zQXq_0kpx5(aTHD3co(5LR9jO@=t5M+&_F-aVt5FPYMWr@WN3@|riJH(F8GTue z!XK~(H=NRYj#%T%tRIo(7!#9oa7)JW8z!;2_o6F~%*?I9TJx_sLedfZd>(2k4USDw zD;Js25054rv?1W$qmUYJ+dJ&TBSpluy~6?eJGBsc_7h)4`lB>VhSRN3hMTfY6+=vr z>$0dN8Yb$jx5M%)(MG~`~LAR$hqC9^WKOZO(y(gMmGo1S3b>Ook-(1?Lzdkx(#PTT{72a3<) zEPulj#f^s}15vHqfJrBb0ps`icoBb9;U*Y0NK6ryK*b<&vQTV}!wZvi3HorbI6;Uv z-ybZh=${V~#T>+tog}`6KRSbi+4!>j2+gX8#~z1b*nq;bq%poqN*Raw7Y!0kcRc1C zYHgUD?;M$kKamZd_5*zxj+ojni}XUyJ`UKa2Oc3x#3HN{cWSgBeDpG!7m(ZeU*U=7 zZ@zGXHv&j4BzJ)+ZFtymjOf4MT3x{xIu8{+5Ya(a1hX!XFoc^hlqt`7!^;EV=b>Ua z7UczE=OAxpT)swKB+c3IxC)d|(wVA2u`G1(VwhK#2qTC?yehCU~R5zb6T_v7FzjPU5E*_(t= z_D0)d3;LC>GP=6%?2S;1;ro^2%kIwb6?d0X5v@?0wP;*zl8PiR;PF4H4m9f_(dN9! z0pfcwfaD%**&P+ekX_;Lnq6n$iPstJh;a65#C@HxOpjC9bGuof(Vr?*Z{PQzA$| zrVW`B-WGiX;m%)jlrDRK_ZsiA)s1>dVL=1pu13|T!-=?fo-@8Ia6rx(mVABsx^Jm;Bo#})57jl)Sf4NqT)!-Xm4 z_dgPcIbu86T1*f9Rs(zIV=bnKf3E=sW-(RgUu_M-kL=V zy;0R>dV||cZ~PZ*rZz(r-L|5JmQxDwB+Kay z8_Vgp+;Y0=KU+>!bITz)TO<}s-eU}>rQC43>Q4=)a|9>#*b&+r+<5veH=eGlsqysW zZ*8h+JXK}i2Je+(N16HR*iO}F@3n!>5B1N;F#mw@RDI_xjuMrqSbLvfJrxRILbe!J zJ=^JK=#!5oqZ?HWs5kyw22?-;>UH>TGvmm{h^kJ$+6KZe7@E@t{nv{6KW9bVURfh6 zs#5(4R@5K=DJ!Z%>%U}0Rmj)SimHIs(2A;n)y#^jK-JKSs({tdimHIs(2A;n)zFHn zfYs27s({tdimHIs%!;Z&)zFHnfYs27s({tdiYkNsEi0;p^k1@~Qs^34Q5ABJT2YlZ z)v=-~bsu9zRbJK5ib}!$wW9uOMg7-`>iDk}Rk5Nj`qzs3uNC!QD=J1+`>$G2kKFxh zR#XM9dRA1WcJ-{NO6~tQR#er|D^PM5oeun}2{WRq@~=YVJu+BWTod!@=I#9M;GdaK z&3Msdwtz>09O)&K10jCUA(p(QnpGEaW6?Oi6vq6j#eg|a-x>^mjA-R!9@&^|6jc53 zqDaQAKX@}t_-JDRF#LGr6dC{}>Gt?}Y_MgxN@ zxU|MYg{Pa5K=aJj1QQ_G*n077>%2KNU_n@5&S^_9VIuR3*9L7T^goZEpXQ@@$ZJ_V zBNmuZhU%13>fHZ1mQ74fz^o~|aF%2dp0JB4CHr|oq5yQT~x zXB+w>ivt&>jl`&xJ{(R7tLr3(n{~un4&y}<&7}6@Qg0PW;A0%{ftay9jk>Z|FHQ?( z^#geQ^NZ60Wp{iatR~C{EEt$aBjqcU#Lg$b{j0R0wNa8_TS+jyNC@+n(z{PdU}zrt zsEeNWJ$KM!rcH?v%9I!(pQT91&Ox8B6bVgKD`74N@uJ0Ctm`NM@}X$cfmX9vpSZn677*D2_u&iz36dO2&_%H?v? zM)RgU)D^p;s;eKK`#NnXdc?PUEmy6}tIq0%Rjc~@A^4lLF+u3*uV>2;^Yl+DgzRt9 z{8bOOLBdmHAol92r&vQaS&`Pv%X)dr5id^x_87)NTanfqs}--1$;NQ9&MVXWy{z}M z9Pxe@uit59S`Vy0ZDkrg_aJsB&Aj(t;SPR!8e!KJ6_jS-q`AE^tqY3NX;s=hVHNzm zDy=iRF`L4eqLONYxL?g8U{3uzVie0LQ`k%;niu>1uW#I(I^%zdCli@ z)2L(Frzi7Iw&nnba?_e%l{WmZl|69+<8hq4G`e%_je7BRm%leAG z%38qBbdfg9lmm8=zesDiR9qY$98r{Y;Dyn{C8gGn-*@n85HWWmH(%;tK989t zKlji%V`O;^ISZrD;;k%wL0Y)QpL~IVy;_h)J-w0rWl!$~3mBXzNVEEd@j^2a3EPs! zz0a30!uf>5esHb7?0vpyg`2g-2JRArJA!aXrEE(YKW})+TKn_>JT$Nev@eh-rvb?7 zb;$HR6UYLfye$p{?Y6W`D9kmCR4+SNBOfQdRa?V*A%OQnhMNZrCTVy%1WFR|knS1~ zl1K~BZ|Ef@IfSD(Buy9NAA3_|OA>j~jg0>o3FPrNMSN`!reh=!%)h$9(9%5fB|NVz z+=RVD2)!;sUM6_l_$HhlitE))=NH=~st`X^nT2uFD5X>7+qNsnTa5%0;bIsR=plXT^diKLAS3Zh=}fc` zx6Kd+;a_~HF>f0|zNB)z^cr~^>l}ZL=y4|bEF6u23<99(>tqxj`C0fn>CYhjD5M`~ z-#|qcgI&Erx~mp{2bpOYM(?LL2=l*QO2hLwZATG$t)ts0Lhn&r8b#@_}@rV-AU;Pg08gUUr`s*Bs zFe1vKTa?Pv!QI1MjuVQB7*_lQVHXTR(CA$fF8kY};PrQDo0!MFOZo}wQK;$W{n|bV zuDnM&v!<;tXQ?6YliyfD1IUew3x+MrMJ>FQiXWkj56HXNj4mINR_a}+STnMVG}wZ5 zV9AHX%Wjsd!@H@Dwr*j*cUv9M8F82<N2DPJ z-<$Rkc6@x+ctS7P^cYV*z`?zDJRT?!4w^4dAYV|4C#8_?cm)Wz zMo&g9w&-kY%XJ$jU(gidP30@Zfb|9bRK9dUWj-*4IMNYbJeAOlUE$LRz11*q8hJ*Q zaS@hJBkc0c?P;Wi6TLSLB-#kjuTe}ho_U(xI|7!CtdyM`i*y!=@Vo+h>vpJTP23ldQyk!n;`Au%C|6pInH@AgysO z{RBrwV4jMR8N^N9AJ3U3_+Q5~U!Okh1ob^dFWi<8XU9|w?hi>rFr@Xi3>>8xk|BfG z-=B%hWE4%A?2F+{&On@(7#Lv}5Y~m1@L+lv1p@^xft;bw26|Sxt_i&ZyS!j-@(Gz+ z^D8xT|Kn|%?tmH0f^c1k05Spx!89Nr3-M;WOXEfNeqo>C*u^_>^ye|xXlBBdF9^MD z)omV0#vi;wQy;F+!)d_o(Ik7jV)8N!%rJ5cDy)v$Nsu!i^`uEqZvn0emRmKe7SQpx z6mQiC{6fta{4PyX$j`=oFuPFmp|IMFcWE;0uhBgCf(M1NUZbfCv5U!DSRL=uyl#Ju zMyYOf0M~_rCFE6pmnHx@EG1J>4!ls)8~m4%A`Eejmuh|z63m;IOh;)dWMCBtUE)S%n1fLQNF>kw<3Y z^FMg2Mq#9e{$K^HhW=m$tY-dT1*(SrUuhuB9(J4$G zf1yUHfv#X3%-KZ|RJm27yhneq4i4|cP2s8EM9&)Bub~KJ&v0F+zlYTS2QJx|@sbS@ zR4IutzN^?9N;Z5SY`(XT_{uiL$KSPKmc+kt%_anf@5hJ^6Az$Dk5d7~6h9Qlb zxQp2pmnYu0(L;;xNrUQLx@icvurBidOnbfcTl^nn; zIicpcC+PHEW#du)@PG754(f1cNIl$vH9BK|FDDFg&XAY+<(yg&S%TVOG2jiITIMAs zL`7Gx<)s9#=>T5SsRzA(At$j2uj+(C*I&tGEdTeu&cF9{;D7hNPS$6bk@GLy*HPfA z=V?}ISI^U|)ULj#8SuW&K*(MaffrnF$CyY_<5o$x5luDvX*=XS@45D>YYj?3-qp%xK0&wMMgyBS?r`=nuIY)q%ooAm_q@Ls_|r1la>$-OJlGInzU< zxypNngktO5g9Kkgun#LTkx&a9^t_LaneB@KW0EC7&{SNgm)P{M*LB3F&?&+f0$E!wu z>Jg*5?gDuu{DVSRnMt`-Y;D4HPNH{hgNr7e!=%n%g9%1la>Kr3iDCt2c#B+EHmnVTV|`EGa8$kGBdPMttl z>K4K(nUsiuRz#@~Irdfz1O6>%30oSNie2%1pz14h=R$-l@^ z_JpC-DX2bdFpLCgx#hf_Zy+Nsb^F&GP(rC~uKg|z%JiUGRfM;jv0(HW-E zlx%0PRh0wP9078?a3N-IAEO-69JxGgwD6 zWd|eA^n;CXWQu2SC@Xr5ez2mDe>s_cu!4(B^#kD(h!4g^n-x7qJ-Eqv%??Jj;wI;n zst6bo?aWlq;1E{y7!4txgEd8kK$9E_cY_NoTaD`zPr$-eA^muxQAw5>~ z7=7XR4j^I3;&Bc_bp-*SbT&3UD|(D(a8;(of(nzX9FXb;sw^kSamV&xWsgw~l6T4) zv%5j#mb{aW>#Ev;YK{{Km&1ah*vmiF4}vFHmZ8~?s0Zc97*`KYvL~t@>|;+H+Dxj6G8I;4FKh>cKo#k*WuG zSQ%9h3fL1>4~p3nRS$AmJqMB@uUEGs3_Vr(MOpH-+TW2_fYxKfv?&0R&BMq2W0?&C3s2dH#q7C&i zhC|YcmtQwmMjOW1AGH1KXbs{KJT{`iCqLEz100Vre4v_l3`)ZtL)xx5hVmsRCs(Se zV&_ce;oq%Qc&>>YT~nvE$^{cEI1`rhZ4A-y$~6+&#Rfdrr?DW}O)E3s_w6T$Xz*|E4Jun$6C9E8`< zP2LvK6=P}mSY`JoXG9bTk0#GQA5a=tho%-x7-?t_$>PRiI%7wj$_I(bxg#vZ z!#P_>U$p%?T*SeLd5wBDF~qb?QxQ)KQoc9faokxY%lE>T;&Dz<&d#X_E1%G{P?Q&G z4<5x`UZumEBFUcxWy5I^lI8Ct^0F-ldA22am66o>u>jK+A^q%xl$ZBjAKtPo@7IxF ztD}OF>eE7yW%?xYdLL+M0REl8R!!ax+nXEe>w>CMl=rI^A?2?a`w+=rvBG9Z@is=s zvLNNH8p^hF@+VE+zuJm8Tc%j6D#coMGV<@PM{R~p`S8Z!!hISF;xKi#{JoWr@!Aqt zCKF&Mn5=^|!j1sfU9>tzfGaOJNOf$GI`dSzQ(;DPBqb{^auj@9QU#1u3xAvg(RS#$ zaz#IJZd|uQKW5b~=A6UE76uQBQ;wf+=>@LBXjvG2 z!gUzL+JLj%kP4!m4NY4j%d$3OO>t`J@Ut?FX)O&NbfIWu$2Zr=!aexLS=P&%%uNY~ z#5M*GXZAhRZp>;~cF^bG z2qhsa9r701mPGmvHgF-fH76kl@3N4fY6%*yv^-1~S5A;dOGcw^E7n+Lj--`^c|Lku zv*ExM7bt9P@K z6FP+LOnat-9U;_Wm_!{JB-dq-P)A0nLnm6Q1t-$Uj!0{8T47spy^j z1eRre+bKg^I#1T2e0b_sB5P4<{02~}F1s1Lb`DguGlXim8U;S>4FRfhS(x7K4W5D6 zhI{QX&z7~bjP__qo6WQ{nBN}HBF};S?G2$WtjI+6Glntxu`t2V02*}Q*bdlZTgI{Z z6me;nacvLt1u#Bi_$fE-Y)tB6-#&+IAWV3ao3;wJv$kk zRWrO`%j8=j8uroz3GFNVRX8Fj^IpfQFb~^1VZWc1`902sKFj$PI%Bi%gC?DkM^9KXjxS%v_pO2ByKax~Bxk>z<2$LaU(VUD;OwV+kqUeEZ`eSXFxxI$i;6h8 zsNdL2YtR2?Pqv(kag!q{=VFvghFH}!F9`8ur=**Sp}FIt3%?qlyTPyK;dZ+M`~qckgpU?KVj1h7*##H9<}{lqOe}=1ey(&18GbM`dYrPvIBhD8mblpTbeQ6$U(oqm~t! z$TZIIF0B2Op(Xv+Ot;5$QRXq7^LSC=F`e-kGlTQE#h1*mZ=0Dm5GFE{lR7T9%`EoP zI$~$p)2-xmJu^6#N-o2hr%{Fi@aT>*up$%rgd@HxH_3?Zyh%Q_N0_mPkJ#B9Va6VL z#Lnhje5yNk@n&B#$6kyqoBAe_#i=FlVZ#a2C{x8m5d#vQ!R}wo33<-tfQuO+$b1GT z+e|!3{R~bvR%Rj?Gm(y$*&G?v?!j6A!k+bfju8g+z_FRHFg}knJ_`$@?|PB>_KYv! z^jUoqS-@#63X}X%^XIF4+SWJq>l;N)(if`B3_bqrB}!zOol(31@;qn8*??O0i66X)jJ_sXd{a zvIxsK^i74{GEQ$fr?=3JEVrlkwGD)ce9h^dmFXq-Hh6mCRQbk24?YNvs0W3;(UUg? zJxRD*Khzt0JH;C+dt-02G80+F(cF>I^pEFkuePA!+Z!^EdsTgMITQ03M$}ewIoo-h z?bR-LEy7MqUSk7cB5OFk^u27TMz3Wrm7(fD*4op}<#avQaV)u9lH>%Oara-1~4r%=QRnC%8{ON66jaC`djN1jhHlfqTmZubkV7vB{>siEQH3R$v|( zT)?9@+ljH+o+_R&pgRno0*-|rG(f5ajH=5PR;;ar!F_Sy^5X_Dp)U^Hb+SBL`too0 zHhavnlen_4!PSjBiP;{4eIc5eP?#GoWV^jEJ2)G%0~t-zbjDY5VWM{03A59lWHxgW z`w3(hN0W`-P&CETO#~(DvYShThbsD^H0-Sj;`*U985lj1e(*;19{{&!NlD8zIcm(?asJIA9*Wcyfrw;dAsXE z4%#=$AsYx>HZ-F!Jz2RtP7kwp)^U2+LQb9^@{tA4Vva;Uv@q&9Wc@bGdk))ypI3nG z4Qe6YxxB66-gCSmzPHDR$0yi;Im+?zQxqu1Q9evxe;#}Gjtlw0UWgxU>YHdxXWFx= zoSN6MDpEk{^Y~6ahT?gg1Ih_FgV@e8 zY%%9Jw%=UHIeQ__bNcf6oAbQEF3LpO43swy79#S{S*J{=iyWMvCP9K1Il)VuV1*00 zWKZz24FugjupU}0PcrQwF4YwaLD(L2!H*wC={?BcsvJgnaS(R)b(lT~J6k@Bf|0Um zXXnePE+Hzq%ernsCG*aYn&47U&N<;{O_29;&U*#teUCe-u;=}T4FuggFoH##VAOBy zrFFjjW>1(ORPh$bO^!xBtfC!^qU?rFgHaUuXv!^)xkMJ_i@{u!+x8gwi4_#(4#&t( zt)M7(m?+?th(mXmJGpBw$UU3-boYRQ_~VTNI&`D%+sSd?o+>}^f>bLx7WvSNnp85X zE`P9M?M}F!h$6}7ULJ6frtIgdY0o4s(nEXXEBI-e^d$T?tl+0<)Fc@ahEV%b5{k11 zcMtNNW$W&NXXj=0>Fy!t4IBvbIH{8CjP!R;*nK zIWOU4WN%Hd{Uw}?xw145U*ghCwnu%GOVfD>j@+XRE%Y3M-Ms)l7=mrXisS4&VKpJ$bKbf|KZEX{?`yY6xnA*bmPFVUX>eT+EBjAerk^`;{ads zW^hcc%H~*#6sp;LQ0A~=?Gnfsj)RiDH9_uh9FzsJG-boN zG>hypmmC0}SLwb%LAjU@qpvv1uYAc@_M$A|OfU$#Z(yPn%Y^p6$_XvCCv;O5VHtOcKWDXpB4FzFEbO*r@XLH2R=yfiL*&ZPtUuN1y zK1aAq5hR}p0t;TpAw1icY_u0+lTCfPgJ9Iw$zp7_6JxVI)#EbN0*>XlLbZTVb=ks- zwV%R-H*g5EwYK<8F3m|Wb$0Nez(F*pEN5p_+lE=fHIWDGYv9k9oQ$JANh7jZ6@ zDSQ|4L41(&jd@ZI+Vg$L27bURnq7VSBm-oUUgv$5Oy$nDr*ga2*QX zL>X8S^+hnmD>z~ZeTz5A_x1>jWkHT|gvE*=M|ro;cniDzS}^&+UW^}Y>eKxNqgKeN zc^#`F1_)#E`*Bw0{5S_Z%Q+`w4H4nT@!8QcmX%;%9s8Qra$|wa8U0ux-3wcs*=9 z$a}}o?a?;7hyWya5^J-Y_{`f3{cMr%8tQ7egAIDTYlv-)UbVBMUSIVv5{(av1*X%K7bBsP^9Ah@a zh(oE2Pmh)FVsA~5I1ZQYB3YUR zK9NJG9+v0ZM954<_2gq#ti9($K9(UZV>i_X!bEVNL+Ra=>BW!d^wR9<&E@nw zCvoVxj29J`jyP8q z&u8|SD>-I3G!Z9crGoc!hBxbD z6y}N#`NCe9d7KSa-9&JAMEm5bEX;g6VdmSD%qZrAc>%|gQ7jMU1zebgT$syH`Y{T_ z-kLy2MPZVQ`6$z;a$$1pF)!wrAvqOQsl^O0%t*z){uVZ+Vqdc&6Tw{&Wq5WmRHSlM z>MMIp`7)17IFI=Xk4qSjF-tj*`+~_*`?gtT17RY#0ivXqan7TcvzONKy4;>_5vS|< zHOErKWzbJT8TP_!lTZd$WFjj#;sUuz_D|wXveF)5i7dz}j<7@#WEB$xI!(qd-Wg0* z+l!HFQ{P0lK~#)lPR%Q?iWrbL8Qh7VFVEAh&)EgfmkNzVT>1S}zM_(WExm)W2TJ=7grOv(fl5-%Q&DRjEq5#w+0Us4A5-&Cu=9HoHUHY*`j-vsA>!+pLfq zc&<%DYn#RFwS~9WwpIrBPFopX?Mh#a8^=vcmS)?=NpgD_*=Bt$HyawqUYw5V75=_A z9n~vJ)wYqgGkD%eDzaUMw|t^@aP&-ax>;jG?T$Ruc3NPmdIb^bhFBV8YZs*GeFNa- zbVFfH;}T=i-Mc;gB8zY>^O2CH#kVg;^xfr*vc)ecNNcU4US6RS!xVPW#52C#aKfu)LW z~ zNo?+wvHf7rH6oPtrE zGVbV~M?P|vi+|8tgkOu@Rd`)x@DBzSK==Auu@0=hr>DV|x8Bp!V9Sa3^)%RW=VJy* zU9j64MHd;bR^rv;A`Zy-BL;uAl=F0$X;8dR)p9ZsG|K z9R3)vw*&OtBjW5c>-LH-(y|Hr#K%VMy@0``Lvf2zz5p|`L>v%b#(|HKdyNR|KD;Vyxa;f^g}dO53W?dThX6GY0G(O(Vb^ zIU}yX=E7LLx%l%BhUrzv*Dy@40#?H?y$V>(!t^RoH4M|MfYmTeuL4%XFue*`4a4** zU^NWWtAN!oOs@h~voO61R1L%QDquAX)2o2hFifuu_P4_HT1fw;FufGIMqzpta*w8M zRo+x5ZL3oEF=<vh?kyS`_t7}KwDid#c=a%?w@4$l)+7$E9$tt?pi_|X#9+L`suzcsW(<3B2wp12 zlcVpl$iRJB0~P*&8MLZq#LD`S=pn|$~WSD;JKhl53os%yrmx-7^pM%2wg-Rj?9y8i~# z{T~jdoBH!#OWUfzRWF#XQoDM=bd}oG52kCzV7flSUyPxrov3yZ27u4I zJ|Q$!Tk=UwAQT;Qe-4fxl1!?j#gL+j@y8V?VXSM{M_sJN)Wy1QHgmC_#AohemBWK3 zr^mQx_)Q7SOcfKO+UX8Cw|#;_<@*t``%`5x1maDJBc8rND*9Wg4Og8k24SESj0aQ_ zF2_7&4t-H7qkH!;7o3_x+eC?4u`&~-Z!ud@j;AKTJUU4V7gX^C#xx!72N~D92f?P7 zB$jXIdyfG4rdFUg9G)b)gU1lb2k~TXXcYjx?=|;=@ppsVA$M3kjk}6)H>-eoLo1%e zd}VJAk*E?)xDwdx9T~{(ARoP#&vt z_G0H1HC^z+Fiq^aka!A05Y&G~3TeFeHx2t>I%8JU!rwFv9UR&?IN-BGdj~WmkYknF zrVb7rgpT<9eI>m9iZp;~ZQs5k^>zNfQcE;wTZtYfb@DV%W(JsAk!aO%fs`|iL*R5b zlMBooCQ*xa;WGo+nq902=AXkk1ibf$D-o*zo50`6#F-Ijo zJXOQS?M?ip<91(_aSOWL4Na;Qf5OBv%EZ-A7!&I(OqBCLzsQ8E6T802C(>?tBFT5B z9+^mZi;6KsedVwKVfJ#Whj|5lx<;%-y{RpDsseP)+!jW7^ik{2xZcw1Yfhx zY`ieW7^1(Fq3o&*nMX^X;=m}agC`jh$4H~_IdYVfA9x(Y+-i5nNIEQFv$g4)Y<{ts zsr$hr5@x+A(d@=#V3@y3nO9EiUOk;xam!V~P~I+~2^8LRivsB_={wa=p3vw-oj7=E ztdywAD1^@4-23>kfz`NE-7b-bYUJJN8hV$Oa?@)lIZn;`F9=_rNC zyW21b7Q81tqnhUmNxjDf!ThT)JA>={(u?#p=^Pqpp76dDD9Dxl;Oh^h->6h=cKE@= zL2Ww2^$(>Zf*MavqHswN>AWfsW{scj3geGVdrEi>O2<#fbk#?u1*vAKaQYkya?;?) zKLwXE(%Znnk8m?5(}9fdrd>fXNX4<)_FH3iZ0wj1P5l%B&%8C|FA;YyBl z4g)77RZjB*F;&`y<+(qp{b9=@34=VPNge$&3J>9ugG<>7ff|MB({V_7%C!~cvf@M? zKbW;xYACZD0Y5F44rEQ1dLyD{-Cb$+Sn_-G1llCdP&Qe*kL{xMogSDq6<3}li1VEu z3vH%K9k5xFK1dIMDO05o+AO8MlY*RFbsFt2ux+X|#;8xpWEHMFddgCB+r`at(nzqs?=E$wQS}HF$8~n=(i<31KS^$ z!)%ESLlQQXCU?!-aEUH^nYz+;P?D$df)Sb6HPwN{0ghj=`#~c3e#$_`+-yjRmEK@K zY%Y|)-WfoEq+E%5b!m<9)Dv*ovB*aMl5rgQ#2Qa-mXX*)nC;L|ELu}vJz z9jC1a!{7r z9Qs3G)%-^qS$iLQ{LE1wx{mx=AAR+M&vW3GA;n-_+b(_r4%S88fzqlf{gaC6tcQM`p^Q?yeo-&=UKe#M!QbY`0Ujq33MLC8#7=S&aob z6ec=raHaHFCea}pSCklv5KfR6e@bJ6ZoLu8^V5H_um zTF_V5*GN$wDX94I!+t_2kg|F~FzS9iU+B743J?yM2ddt<-5|{nR+)d>fb$Y-)X$e5(25(S;Tm2M zj_eE#@^Y3#jLKz+f7A^zf45PZM)&-BSC0_$JDa6++9MBK`v$?_o$;Pfe~Z+Z^>M+H z7bD@lE%-qk1$nQk1F|MN4utaceVn0W;vG+_MP6N)*(MqnlF>qK52)`uDrDjK;Ap`a z#v~4I02$NzVXULiUw3pD8mL;5hxm^$2F3(m2#jg$5J-e>D5r`n6Gq6FWtj4bMw!e5 zZsap(?Jq(ks$EdAYK31@j4aw(g-Jw7+Nwy5-l{{uhN|E;YArUDifBh@3k4k#X%L0~ zbBI(!+^f!kZ5RaoROlRQS%IP)+NfO^7>0rsv}RYX_+p4t8Y{<1`zutu&<~TfFLQE+ z(}j}rQ!0X2jj{!#iIB_WUsMN?aPWvIr`D>)g3iI9o3d09gYa7tSQE8INAxi|5eMy- zpoM3CL6tg6)c}zZ-={tCeFKDz6l4ah+XA1@PWi*CoYyrFxu|P>=o&eymf!>lHx~!N z`ZsU&QsG@4mZn6$tCP3*R$bL>XP}YDL*NJ@hgXsp0-0Y=;W=&TO2mLO|o8FX&-z7z&yAox9qzV0T?#!Lx8a^FE>?Tjd z|0cA-E^#7<&nepjC$jGx%GQ|dThUG|(i|{}=ExGs@d6)_2ya}aJeQQJ!bpZG4~&X~snr%4c zK+})t$rvpW)zV<3&a~2^gSPukIR7b%j?o`kZ}Py8Ty~6r&3aP~?)Zr8G|Zz#n%qB; zW(Aez>c>o)e2X+lmPw1|bTop@za0Df5&mgJObh?>{)GRzl>cPT|6&XOG~)ORQeA~AWgn^1&fr1FO;9@j zpoM=V$oOAemH$55>b{~5#`E13(=J9jI%sG5LSD1MA?l0ytstf8;2ew~JGBS40nZ9# zBj8+FKsg@zBLc3o6>!R*2$)I*oIR0sP=-Z7jC#sCNRGnJHbF?14L6zWBf|~JvhJe4 zbQhFSMO<^l57JnbFwi{vnDne5l)#na(wq46;!hIb&#j-NL<}7G+|SZ*{HyS1X*T}! zJHZM!oRF?XTys%U5BXTW^tj%3iSqPxB^lcwC)T|-oIWYJXfn33v2gXI6!Yp(B8QsB zB=vZQ5bX=;_?8@BfibxqNGg3USVo`OI_OJS_-RDP_IX%_E3>CHzdfywG#jXf%L}J3 z@nF}yQn$f`Q&M})q8Tpaz!mehQ_?~~7zoJ?jQ;S}8EKk&Am)%yIwSdme~B~$|MKB~ z<(EiPupTMJpR=&PRO*jEb$&ss&U)zfi=-1K!|-2N;SOGSju&cv#Wq|AgMO7-sUAwW z=sa$Z&qA9EOwh~=*yrou#sz7Ia0u34l@_x$-n}MuR>zap3nMQ?3xViHqNBm1jg?GaxO_HZqQi^fD{wz1kYX;c}VuHSJh7nVYpUS|)Shbt$ILP$CB}cB>v^g*+Cf zJev#UxRwZPVGTN#OTlz}K3gtzlxHu@Eyw=t56SI~(e?XbFYb~7RiQdBe)F2fH6*qv z+M!2<6oMw{S1QodXf;V|(U_N8fxGe{Fua2?GHd{1+b3fas$x62(Hwb0`d%>KyD4qM zWfC^smad}ZZRs897hDO$490e_^RCnmpEC@`Fc^OytqGC$q_;ICLS#>(hCl9O;_@r^ zBoACg@7!anXwrQt3+vyxPghZM|4OMnMLhd~v;covJjA`+Ksff0{x#BeTa85 z^3@vGqYNjMcQVZBWvrtP!)2+U7mma`PR6&fE#A;D>Gx@jFQK4~oQ(%?THSUwcEg#k zcQH0ngwaOZ2!p*G4ci@!x@YUqQk?m9_=KvaSaq$qOr)*_)H-Ulu6$K$=xUYXRafKd z$lEbjBVCok-HghDU&qa|)Hh^Y!GcSY#=2Bilc~oom9}kdSt>Q|R;IeT8|hM+>u!7( ze;Rlg>2fsAgN>mH{fxC?qlYmH*Q90;cU8iObn++4!)EQnJQmLyVyeFNg@b$CCI&6W!0dvFCxZko$6+CBM zrS?C^2C=*bdRC89z8cD$wpVCAhEu**^CcZ*PGQjVa!Vh$0`s3YM!_j>W3q4%Uep?= z_DJ*lxwaG366d_{B96`M>C6<1KnarZTT&`F{3mng#yU*o>^ zG74lzTa|Cb+2e`Qz%D;ybUTFw6w}jQOe}c>X(|>n!Oc2u(6gg$Z1jQce5AC?nOh{i2Oj(;gdb9D#qGi8fMAdu$z6_(L7zwTQC+q-lHq2Tj|( z9vk-muQcri^{m4lHSM})b$#PFS>2{zwupwtMNGwxY-sd{pBmz)jj7oF@J@_zEH3I- zVo=z#(4!Ii&W&osmZOYDtgwO?`p2@uRIfYHsZ2h$De( z+zUS_Z6Z*Wdtvs77@@Y8FJb9OxYE}bers<0zo2`+-hzMSCbh82v8RP`By!ihrLimJ zt_dV*y!|1gC2Mic92B;+uE>X4vL^p$HE&CkbHBAOX|6PRQY$N~IjxLCkyYo``0YCk z6I!FjG#QS!X5;E^YhzVa9LI`fC-Y$&#`FIrC0rRM7A4%Pt(9j~!gpD|Y_|G$=XS>b ztNQoRc1BzMyE#17-q^;fgnQa5;hz6#;iXErQ@==0vKxHnHSvea_QqHnZJb_kYSqE0 zXyZ-;uqNgQ#+r`kAjhzM`=V)o%ka{*22bs^4@4Ma`S8pbaFP zFgszYWTdtV)Uw0C+lakf0+WsOjrpR{*qN%@^}8AAg0!cbk*eAwo??HwK23FP_~dCe z`DA4~usa(UsBDLUsk>3a3Uj-&IiCR3vR-zI72Q_ZC5_O;}Q6MVYzi;Sa zd|IG0<9}Dz=6iqCw&_ZQx;9;j;(N2k$fG~&z&GBw9jDCEcvQ2?sG1!FbNrLpj-Rfn z9=5tRyp_P#o_|=wzLvn(9!(!(dk^|qp8AC&Ms(Eq!6;W_D7?}K*Zae;t`92PWmMU& zy6SsWSsmm1GW}JyO#DOYwq*@c=5wr7fA!}2Yb@6#eVG1QyN@wAm}Pg;d822*fha;P zr$Y5`M_s&&$=C&jnrfrQ)fjW4T8mix44mEnI(500(%ot_k;mX?>-U<>kW(|P%ha3G>`_{v(;kac_ zhcU%32En!+U7m)FM#1#B&+3hJ>A{MWSB)n8$$Y7!KU{v*IMFd3Q#LM)Q#TQ!;n0pQ z?cq$PuC#jkCx>bEiV;Q$r>H9&84w!?Jx3bDyzX)D7-pXo$RFq6y^+ReC=xe_T!QmG zqxeO~g}tW72%Vs$F~ijOH6z9J)N4i)V)BHNPmCcDv%8C@Gs~r@?GH&U8wWy3lWuX4 zJ)!IS3%9v95kf%wezF&=ecgB+KXSLvyP4qj8^&guHRxSLe{tcF0DmB(jDZ-b_xVxA zI3WwBjWRaFeb44mM&h~cpc4rp-xqqYlW(r0jV)r+Ch73J+m9Ne;R~1?p9Vv#&?OG< zWTIylYY#y5&LDnnM7sfgy(f$|2H|~k7;V(kLojYX20__qqdU^^nTI|8*(J9aM$FSf ztoV{!Bd1xPCP)ygyK;=Yz)W0Qc z1hNW2<@9`yfYRiA)VJ9?c9UO^PX&0SiB#dkIiVJLM;O?b$B0g*m3QUDSc``pn zE5bUc{P_Q{cinMOT-%?St+22xb(g*%Rz$$wbqrHBMZxxBo<>PeG%876Okxrtv0#Tp zIapWJ*bAs})mR|Why?+A7ZPKM4Ps)C{?5HKyP!dnyqCO}-{+Hm*kQ`O=hjp1Ip34m zj>(7CBT+0$fzcxqyP#0FVD^Xj)SL(X^y3qiIP;N6RHyYxWJ6MD<@%lEZgQB6T&H zm5~_4Ubn-#44kpaa55vYy{bEEwp>F)0Bji^-2sM-O(b5x?~SD;cPr~|QL*S?nKw2u z1~-t*HZPfB=esKd!F^n!*|-C=+*vnn+n!Jwo7ZGqVq>kH#ZGGi3A@4r;9ujgnrkp) zTw%{jsYD;W&}{0L7;wv)Q=?EeLF_&Wg?=YUBem?y6$l z(0e)>uQhGmV(t5mogdqLT9^yr>^t*Zt`OiHZl zHFA}P^Wf4}htV#~pM+Hng~@4YfsmA6SEIXrLhiQC-t}m=Rh@jYL$-$h1kO*Ut<7(X z@Nbz@6Fu+euc1&fHSs-+FIw?g;t-j$Mi8p8XQt)UM{-YL!|*4)g%}K`sIg&Cx_}P+ zu?0B6Fbcqq6Bk{pAh8Kjp8Rg8!t1_RnE0EjewQu!?9Zs%aXtq*8FJUo?n47%b8ccB zyNZF!xp>~vb9!P2!tXTMW_V^U<#$XFYlf0z-J`%hH&LHZbxFh3<;LU~35P}Qrk2+W zo@OzTEVUV_m7!B{lp8{-eP$r0{emis;cud3HP{#Z-sUEH2k7Ze!E&VjM$Y=-{dtKInkCyp(40AEUSf!DU!j)NK$tWc z>4hieB@*wjM-A}1?2Y+^{E>E)hBEMCy(qYc-$jK!U zuw_o-xtfE8VhN5_&)+gkx6e~S=zlg$O8tM#FfIBshUpW?%=GYw&VEeWsilK;Ff`#? z4OB+-i3L;3AP=uaqf5|ZuCrCkO&MJR`Mp|2GA}{oP_>`u#tmi4lSLaK!LMf^4ApBr zn3o};DQ+^mH$d4@ODMz#iSE$pYKjJOmf(yW&txAmV%pV0eIQ;#)>K_M^9DqIsSRLy zLyEih3H(WJ|E)g^z0lvQ(YsEO)#Z%JaEoZQZb*=m03C;w<*)740=JsNVftX^JxDlg zw5U8x??7R*C*QT_ZHZ=#)HMyIGS`%pb6Cq$a;!WhmCV(@;0>6!nh2iEI{Gyfq)FmqGR)6WC6JOr(D2fnfa&mTs(L2v?oOxN_OC* z3oycgOmgmQDtQBQQD%~x9Jv2Zf|MO-0_+9GW6H+?u8;d2Lj~e_m~;#`kT15OYbI_W zdB^0BE7m0jpv!2*F*GIJf#RKsKM{I1B<^O8K<4hmj!1IJ?!>WZd)jjnO&dvYEeX2qNo;^vQPD6PUO;u`XIE)m%MDUlSAHd7mG_Q>DlW z7sBNVwEcY#KHp&PlpdBFxTREXVE)GOeUZ~A4saO0{SyZ0>zOh@%fB^1&X51X1Ei2x z%K$lv|BDY$<)_Afe+4-|{tFL~LSiigHdHwqXKdQFCEK|Q$gNsF z&%;=6;tap60CM+DsQD$NO-T$2UiOghW-8ToVtAJdYYGpdVF5K%Sk=Yd%^`VZ-Ir0L zV^lmbCe+YA?eWPC7{aot(s?@~C<1%r7fNTmny>3)->BhCTA8Js?hc+U5ul&`8Kwx-gcE#% z%mxzqyDdX!bwlYUH^W2~Va6Eb52YC>HCQe-TvG$#zk-Sv>Gsc@yqN0 zz6J9Mv<%>f<1noX;7Lg2jR2kqND+a2P~eSqL^3CbQp?slug;p@7q%N7S zhUWZf?1X={;ES~m2I+A}6GA_K=-ZP2662mCTJc@5fzOej74TUrz8!W|MJsIJC!lZ5 zPr;kBT4Tp0!Nu0J@lD&%pLg2uE%D~cHhgy!2z8the6Cvp9@ZTRZTW*N?m$V&d=9f3 z?K1pS{Lgzhp9sS{^3P(3+0l;tN9-{*G0OPC`X2lXY<*&F7k&VPm8Cq!XR@n(?I~O9 zp!-s{r};Q&naKCTswX7!A2G+ko9Ca#V)FXXVk-OaT~M;tLV7R08CV6L7>;5DS~iVR z&70PugX8iuyf0BJn7;ftY}bUodWKZYO1*=V6dY}D{H&c@eA zWQ4RG31)W>d79(#M8a#sG4}PxHB{m3B$wiR6_o8;u%Ot;k%O)7qvYht_c$ceV?M!VChq|4HX?N;n4Uwz7@7E zv@1^{6%m?1h3F1XcIC;IR`?wMHvUxNGyE}hLqhvNzV=q2BdHsIkBkVN3~QW|VMKR+ zE?OS{JM&;ojd?HZC<+Ipp|FzMNWq-{6|2+JkJBOd{1%{XZi+jQ6HReDZ zd_Cw7-3vbd@9zbJGjNIhzn%<^8k6C_w--2^^Wan(|3~fxj{p8%uz%|Rue|_$r}&)^ zc*!FV=1$~ipec^=3JQd@7gYo!DY9J68Sm}aV484lg58VCnA~JO5*c1u;x4l%TKO?; zc1{Rp2z&-ACa9+i(S3-GkJ8mr!jbkCmtmPO@m>J0;O za6gy~_OI{dXZhQ1lCY&_0}K)hqVlI&iOlkq3NmA%b{$6wY{y zSc-EmL|9Y?(>o4sIv>Zl%-tGl?*3o~j_ga2Uf-|U+^r$)Ov^&OQ zP)NEF<_-}vc^w+GOWXQ}VgtMF^|3(TnW(blG4SDDpYR$jl!azz3-e!kBLLL8%+xy(i`Wf8P_{V2Pjw@+Iiv*pzKByaYgxo=j{0->ScV<1vNushGl9_YGrlt{ z%jHR@rJQ!Rs8o0&$xN~aL#Ks&gh7sU$J1R-W&f}>iyt(a%dc*8Z?%>~Anqs~hKOS9 zKc0Qr=Q8vT>%|hNZD z*|Rki97~T{T=s0(H(##M!&RXap2Xn{B~h%^715AYoTo{gCq&NYTN%7uM0vrTMSO7f z0@R8~T}HXC<_oZ{P5EltI6SW79Qn|Dfn1ljtFF%O)Qtd5UrF#m?-+}Q)ZjyFfM*x- zdX#Q`N%0m)U&uG4<@;54p7$5?bgs@@J5LA6^Z5D*u@)_?%!I33IihgFXrQePc4^=4Meh!DAy*u-mx4q7NfW_9!@T%CWVemXkj68VWFGCd}JKe3EY#oOJM^Bs-yK@~zfsOi$3v7E1qOSf=2@8=~S6wybx zb}N>XJ<2{*3}?*fsEo@u`2{8v`agHo3`r|^kGRi2kHDxAQ*RtF#S2y!Y}Lw6(m1bZ zG#TpF1(zeZVtft8uHYkdCAWP!U;Jm~3ciu%ZTz%8ludlx4~ps|u3V>f^EBYKlJAMC za|3z$U@EFKO)%ta?j7o-k-h)v6lw?+>XUvj>rmGyyx)j+n;Q;%Bl-T7dlPl=^I;D! zd`Kh6(9)2^#gI<+gI0M|muf8kHyr=NCA%b#k3nr%i{2EGL%sZ9!1fXil&<2@$2y%1n^*`OeH77@MyYkN{aj%Pr7vGUxhmRZRom+kI^|c`BJ8swu%pmc;MJu!?hp{mEqj9Tnnfg zQQ`-e^7tsYw2IdoXJl!){VbP0mz>-@4XV|AW8KJUX4CUrD~KHXV}PzT`P}qe_Q}g; zcy%>zLSJ+(*9LO;8>!n_LZ*Lb7~Hp)4vw$p?Z2`e?w)Ypb_ng)@^jEB`NUdO8kfP1 zwftkmSs?3)0SJ)g;0I!4j0y^U1qAt6$GgKZ2hQka;JuE|z$Y5|#DP!lFu1)E?HW#9 z((BZm+SCgww(vpsA6KPsd%Q1n{eoZ5&SK%@T0Tgr5l_4yRiSnniyTo6ReiL6ki3Z> z>Z;mBR3H?u<8_X^oA`p?MM)40FF=_BJqT*?zD(;h(QLmms|kX{l>aNOJtUw1BtWZ2 zhMP74ZWUsGB}3Y41zjsKXUH<^UY}3JootHjmST{Y&I6=(f3hM*wX4 zk|&@&K3`D{z42FkGXD1={)fw+@chC}<1onaE8b+>Rin7Aw78yxIp~QmroZg|Ibkbh zT0?>+Ab(WjHk!AUmd9>Gi;}GPQ{PL+sBQdo#i@) zfr8mfuXu%!1*?Jda75af^LFnjSW?7$;I6BM{2`P4;ADg0{t(B6p(p0&^)&E(5lTu( z_|x9?pd@&B5SF4C8nF~Tm^5K6@Rn?GB?Y@f`LNz~;ld7T8%m0)Fgv_i#Lz&LSCN&9=qwyO-Invh1<=)f=`z0M$=si9Ka{qYzD2n2%uDq z%*MAEw-ps|#q{x@V*25PV*YVfvk*bAnD@soHGB97&2aqC8@L^aCf9xspN7)( zrak;D{P|}I|GJ6v_yITWvkKhu@kL+Y4&pX;p@jFuuJ@C>-swt+JVxny6*vAgj5vs! zL+euBX#EJ;S54%^GAUK!6G5G#Y=vWwkt~uN&oQHL*+p}$vaTyN9e|-H+4sj zml7+XS@I|!WRTe&=}R-DzVL(}%sj+LyVKZeve&|ZGX5hRt{^;<=Q|l>H#-Cm;oG5*dWsK#4SV^Pw9yBv8y!X)9YaARP~6obywET%yk>*Y zN4G}X7btBXun#BMM=)d`T^nl7T3b8e-ag(Fee)u#8weftQ`sS^x^*x@zEuZy9pc|H zM7x+yG;Jh2d4PUVx4MNeNxoH&+-hj3@A{&?+|X|h@ZIQoI;u1jIvnKdFvB1P2iV{m z$8*cbIFcolcTj0YOfAjmi!EqeqXi!xqV&YNT0m@jI}V}6Gzp$O%-gWT<7?1ba+toJ zAk#`?%P7}uD$`o$2;YVd%CYJ}X(rFa5l47W>o8~Fa&0ql@umPsJIF`E?jv+KjvZ0j z(Xy6yB*DO=bU0eM8WV}Mwsy56+CZ@%D0OYVJ)aMFuR-&(h`S}VmIJ6CtB=j%fs=Iqq3Yg z(4tzpiqco`v5khJFj$idU>B4sN8{~HE{|lEs4Od3rHud4kAfZl&Ku-;~ zm)@Z=Kz;=ue7_8kd-QP;!oT4U5jn-PUZ4im;cCq-WoZPenp^$r&MuB&++paq{7d*= z-bu*?86!-uEo$;jr{ClibJsndLK{Au|e-x2$+V%o$|`>AHc zj=thMUhi}18oDEMJ9k$f=LMHVL_pjt$8=im>L_14%!`~jF+{igga`G(O`SfGnm6Ll zpsap+96WIbX^~Gk?54qWnaAzVGzw!35PFseRmSM%@RUx7$Lc9=>z%WFPlko$b9^!W zaK~C8Fz{_Z4V37GkMW(2=lOc(AJ9Ww?sG&UQ98l%LxZpg`|#dHKHiv> z?^HR}+=P7Sa0#iL01dr_SFo-+)L<%{|&l~98mFU&D&PDnWOwNAHlLCF9K7= zM}?feu-7dT-PF8flZFQcV;*^t9%^^2;-kaLoiE5vqaHG79jCl9qKdalH}I7%Zmkem z>A36aN4(-ZQF-Pn$rVEBp(_-*GLoxvi!1fxw9X%z0G_5DXqp-W`vYG4N;HvYBMZw!8dm=!Y>iUg(4;j#dBke;kquueF$ZMVO7d(!YU1 zU%Wc(O~(pWn5kAROaH5EGlY^qW19ioW@dn|w}9z43DOm%^Q^?i%4kcXHSL;Zx4jOT_^$kZ5aR&FS& zK9TFS{xCQ|@J5+I0i~-=|Jjih2!prt5wI~pFtHyo_EX441Jy+AwsZaJA;U+v3^gi5 zFQfRTh15&oXhjbcBAKM@#l6wkiMkKsUnurlQgZzRXvSuNv&!P_F3QLylYH$^sq49Cexo)t1xMTeR}StAQ^p21KK;ylB2q(Klgbi+DKAi`+H zje%%s876pvwJyFh0l1F^v@XS1Iy-|5b3Ya=Dx#BCHMVf1jr9bpaaxg8kUi{^PD8Xa@$&*EWEUD4HnLfqAc8jEF2~2S~qt#Z^{3J^v_Pq3+q22ee2@? z3F))u{O7%Xc+vla^xI4RbJEW({GX7%Y2trAVQwt=pOC(K^nXrz!Ds&y(pTM(S;Bv? zOc6(*q><&--^SwqxV>@Xz28JR;NE!9@xv(L7Gtm%SX;7<(QaG(Gh81dbYzZ0@KuZx z#f>vVAPxjWE`^6c(jtu-zR3`R*(A=Md`gXm#DYuV8VDLI1dzlZSq<*tiJfIQdct2b z=%CwJ!Hm0hLaOnBGu)Jh#V=z@mz#|ihK&z!}e<(W4=lE1%0!G4yr3XE?J3 z=|Yz=Lf85ULTmMLgxs(XeX%hU>Z6yvVytL$Lu?45w>d)=I!qKAVX3*ZEM_P;xK{%o zZ1yt3Cldv;C#j@Zt^^&`tInbO!9*cgbG=N5N?_NQ-!Q}7iD)apvc}w_I^clkQbkC6 z%M##7nmdEVy=_{ae;v_>G`%4hcSJ}&~PZv6tqqt zT!bnB&S$Z|eaPb$gf%c`2?PqH+9BuH(YbX>+`9q=qQq7_0%Job8x9B*$cQYVt(LTW zRxWJG5!YK~08D5eS^J@BQa;j|9KhaemZ_r?jd1I8!!dQ?UH|!0&aOzijr~ z0(n!a+f+G4n4q4{;2~vX`BMQfr0I(~m^oEwpq|a(5oOZlSJ0(kst`jg@9MY!hc#Om zLa(YqG*lTp?Qa7} zkwFXYA3Xf@VGUJ+Wys)ln^xV>$n5 z{NVU>)bms`(!CJ|!!$#93`ex*40%MksdfEf!VDooeI^Lg1SI#FgxQ>o9eoHg3~8?? z#awY>Z89?jf`+V&>~CyvZ6o{020KR<(U2)3jLLattqHcOBBA_EyB?BKKQKbUOu^_Q z&*o5W2@ar-&JEA7hpr1U!?l@on0*?ZMWf#<%wzE0EaAM%Wl>N4o`%jw3mf`9iFK=8 z7WKqsF@Lr|T^2vaz$X$f-}Sp_DF4``M{mVoyAZ1BjR7+(By=|VLFHzPnO(*}YJFcs z_vviZ;yb52T4RWQws-3$=#moW-8usAB^$^+VCD!Uh(Euxk^Gl?;v38iR}t#PJm8S2 zcR4S55T~p3IcSqa=#Wt+8nAC_P2DhI$m4YWG=wSrz@LrCpMvD$~Qmb1v-mxX>(xz0^up^_d!m7OxXr%byrY} zh<5>=PeHEFIe#>AdVtkFO$RS66eMIQD;EkR2qk%N3yb64Lg7t@y%+?!)5h0_0nK0Y zfn|$@4be0U9{PVOS@6i!VP?4}W9UMkFuWJ$mMUxh8ajh55fH4gfFueuJ9aL?0mia1 zH(D};kM3b~Jh4om0YA?!7h(|=e8O@eGHgmksT-Pqtp;w9od7tHtHW8!6;!op=*OC- z!KvkF0yq!eD}?aKo9I9!?`~@6qF;uK4tJ<1meapxWgz{e#UGMdh#Gi#g)oXa3YYLZ z-y;zuhabZ1y+$x`@XR*iixS&Pt(CLYCEqiXuB}VyYxlj`hJE23;S>=kBH> zuy3XCG7fywQ13u{>47?o7AEHlURGz55CTGJ62r}0A~%WQE@r{Td?DK9;dvSI^8`tE zb8iGf7oE+{7n*2SB41dGQJ-($_DA0~G;bHOPG?TJ$vEtC`VmhYTe8!1$`k6=TJJ_z zy%Rnm^)}XC*5Mb3GzF(DuqRKb<4Y0VkhibcPbpx~`7<)kI{=ba34t0)3JhE&L^Fku zxeArSWLUaNsKefkuontwJ16vZNFs8Tnocj(@N&7rj^8>ziWo#&jt6^wRPu@bDZ6oQB1GsA)HzUlj4fx0{zy= zl!VlrEl4hP@#F|4_g39A!)t4VMlrQjQa+<*(P7kegf(4;Eo+4CF?-b5jf(dR-5O=& zFEvNgsbF_5ERDd0lBwb%Xm{4ta@N(hwU%Ew&sly!NzL-> zQF_nGSiIp=w_N~jl#HyS@c6lP5q}obl4ymHETch zF^z+y4MMbuW^}=Y&YBK;;6TIyQ`poGmaY?w%@3hl0d6DQH)n&aI^1_m2Rtyr5N-@i zV>f+UH@yKLyT8UcaBHK_qco-iaA}=TH=5is-DI2zVH8&tHAmAPSaqg@9$W(GzYto& zp!F#K?tx+J1*>j7?hQDVVD@^~V)=5t5KXp)77xtrmUM7J>9)|)+1M$hv1=aQ*e1+j z7_mX9SN|6cTjq{nQJm-fZCM7pHwYH3+!pwL1FqMDp!ottn>}Fr0_nY0Ceu6g3#4~7 zUEEW?paZe~3n7Hg>yC7u)VgJ*ZFUZ9Wg*3n|>{g>Q?ShcaXcIdK9XAWjGhyE`Y`E{ND9g!=AQ2&Z$COvK&r)FvU? zyI8)jQSQU51wsSYw|gL;d|RTtgTp|3q@=n>>T7qAw27r)-Hh(VVTFRb8fS7DIxPte zyc8dz0=akkBiE>d6L+8Ds^r>{_S53g{fW-q{ZM9P{U6?O83oRcEBFe|Y!e1~9&nO} z3l{o)DfGbEnE#~^<*`eijVkUCq}1_2q47&W)AGI8OBV+tG-62xe>-tgzuL!ArYFi~Vv0_G}lz$n#6vQBgPq z?nU^#!B)X5oIXG5>I)RH^|CU8+O+(BusTX_Is~a(QD#~L_N_uZa{@}Y3hkM1z-t?w zeDT|a7-jMe*hVMcm~C|O-7_LSMCoS1v)0LX$JK|6wvs*^hTFiiU(=3T^>xjTJN<`r zTz%&P>$6=5y}z?a%XVx>rRcscij{lk>~HHGtMMEeml0&kM(Jz~%qgN>RaQj1%D97e zRl*KeSEcNrU6rvz2-6T&dznr-4Wc5NK83G#ptsgdxU@q!qrDq}Pb=wDHSVKFplYY^ zAv=01r0&8oxe4}Nf`z?O4C{9Z_3__|T|yUjUN(6eRqv`iS1@BJS#4L9rZ|;1wDg=t z?1RJb`fmE^)ZIc0_RL(^y&LtXn{Z>d5JCP8DyC1lVibaJL25BRTne*_QLo$u8;X(8 zTX0&wY1%_?#_pjv|FK7i316z_?z(zV5tHu8RB3Vlnj^ou6JM=^ucj-0pf&kFCL;XUQmtOsBHr25sb zMBY8*2YU_(^~gL^8rJ+EZP+UZv0*r)l!mQ7C?x3UCNmxNBJIn5aQC3#6P%5C4;6}M z$Ye04^Z+b;hCG}d4&iWaT<09lN=MD%oT-eHJe;o|66%HHhCb`T;hZhMM&#`LLqeoy zO%WSiY=!W4w<9?FeP7WH_|AG-8E(Zn8*5fOM=o!XTy3kvboD-a7%c*1_0FXe0QP(? z=YCcrY?HIBIXj(KmAh(| zx==3lhFq#0OO3*ATXY{;ID;0;uc7RVty=smb>+x4U|((AU9+wwav^E?R3hncR34(G z57xDezGn5qeIWfPa;|*%?5JQv#(Cwa5EbTPoGX;?TzP#>*(?;ks_F-GPQ4fe<%SmZ z;E6jQ7#)X?32!kfGy%%4&jX^TsbS^^Iz6PGz|v>K)DyS{DQ0OPoIfF;gQp|+r0^We z;^fRd-p>s7@0aPIPKD3_U+(mFC^}#5zoLPcDsUzDfjJe_IgFcS33Obn5dJ|96l+3C zXUuF`JEU}~$G*wzjE6j=Xw>JXKk8}DBcB#cbA3zw)=Do5)71}A9({rxeuc#vPOZ`Yas!v%sKYo_d#D=P98j8coQ zW0kH{?&+FFZxysFYzPw=wS3ZuZkRx+ozXEk#SCXo1u|Ww6dcS8F+jTf5!l$=+3aKR>44T zu|B(8O+ZASh4DG8FQ`r83+%ERj@L}$7Yut{gE4*W1EGVj7|qTw0yf?c-u4x#>-byf z+`B=(F576qZP!;ML5>L>4Son=O0O&W^zu`oo4CE|ojOc3T>e5Ne&RlNIP}Onwzw;N z{E=zppJg;fNYh%4rWW{kq$!Zed%$v9I?~hxZ$`3G)W2;leII(Mr225)EatjeC4;pl z7wCUKSgQ#wxn(VbFnYZjs1;4Y_XD+J;JyVuIAkO(N^cbu^&bJX1~U|<_5E2-#bK~O zLF*tRbP5sYQTF2oSq)Wwa4SUYg08|os}Ntj@<^LDkolCCi7heP%QSIJCJabE;f_<( ziA|(|q%g52Zg*;!I7Kz`dIA^+@O2<2T#UuS(M)Xj(KTT#@UL*u-#BNSP6_>1b2;Mx z!o?n#_VGfvh>jZeid5oM-Z?@XgZGLe==y1C6`#R*m1U)?V3}2HiVMyiBD)d$NRgluB}LH^2S$mV z@xNtJ;viB~>gaK1*!|uNcW7Hj+=KzW2)zas&!M&6J6deywSOc=9CMjPGXA#^EfW0i zviBzk;dxeBA;n$8FZ{?CGzR8WvDJc>^dViY;OUXGfM{0%fpx{0n7t(d7-1VIn?hvS z8r3HyJ`Mx=v!;2W{p1-e*9`d`F4J-`7Q`RgU+d})bLxuT$X)X4it(O=x^veM1>cm$ zz_U*t2y~Z2eG#VKo*Ng3l5coDu_0}QiPE4(PraV?#MpXYGhC=lfMR~va*D+eW8&PD z>cgO_bvUWsUNE;lW1*cB4hgLU3k`4ag)dSU8o*Rv)LRH8QO;%}+%loI5G0qi$4C-pH?(_ z?)_O*uley$E4uvZ?=Kp#uctVMwH1R|wsJHieELl&tZXl8wUwh$zUu*n9lXu0Fd@2| z7sH*yTO8BY4WnsXR~MaEROB}*5hCmttj^^u?OZ#48bO)3xOhu`0Yzo}$*c7D~LR&-|N zpH}q7E5E;Jc}_jiOPoYx)kp6S=Pv)7<-@tYVhto!BC)cim%!&)WK0T_>iK8Io+QUk z`c_jIMqTJMT4$o2^_PMmt-t8QVz!;+mWIF(?qTV6FwG8r9uA#$zopeGxpvb1&F1V4 zCNCYuY%zTYg{w`jtUC&DjZ2^55c(8Lh}Ke|(;kpjf>D0)XACAN*=o`8l~XJw{RNd)QN_Hp0rUIM6}hBqY5cT7ngL`>+S=MwD9GS#w^%t&>92 z_5f~dOd|yA9I*~-RnTg!4}P~>skLOCN$Vkl@uO-U31#OER=9^Z*|7|yeUHPW!1C95 zu!Kx!3E$%|DS*V4J4}tx*=6E-tXTmhuJ_<~^X2b6Y1lfa;2?7^iH+FnEKIt9H7Y>J z4IljSN99Y3%fczyW$x}YHEK460Ik5yAE%y=TR%N}T#FSrj|D$Iv z(VZ<<*F6N%8rBWWeqAhMN23qm9NbLGV+|TLO|V|2`bRhz2jk?Y4p2RyqMKI~v>z-I zCpZO3*BNvFNQW`K?62ZXG^K>z;it;DlU(X}?ACyNB~m^WS9}DCAJy`~Vq5KZ8{CN# z+@--{KTQg{^PtwS`3FCEZiv{28RXbFL>$5pA1FewiH6K6K2Z3o7er2p^@G8wq910m zSJGqsMyhK|k5!XuC`%R1EE4&BYBiCK-VpmaiGdX-cDbAh(QOV=;(GhT%Fu=gRP=`E zg#;;H4^9LBuXLmA6QQ`H1<1>%rgs*c8WU)Cr>W_QGZu6XYlu0|3V%>T=RRIuU{Abi zboS-wH^rHZ%2DSnF^56@F4WE~A(_Va{!8qJrvy=Ni*abZ?*6t&vUN>*TYS^mB>Uy> zVi?zqh#e*pr@APa6c49=%>*1!?(ni`bkCvQfZWDKY2TCiHy$?Tq_++5C z9b_^T40H8!_B-O!bS~6`$fI5SA@v>6pZ;H8{(ts6VkdOuJ^7B<3?W;5-xbd>DURFk zibjUH4j#i%G#1v>T7UWPIT0XuJDQ}()tpoobR}R_;fB0HXZS(OBxv*2&Oxs zB=QA;F{x!(PC?c$%T<)@ZV$@;G2uNuf~W2(5WpxLkuGGyJD|bxXC~|-noBhIRi$x z2Kw9Mzr`K%X?NL;%Jd@VDG!&NaT4Eu)Qnfcc%9pym+Mp4j0Yz4MY@sb$KnLf2M_LG z1xRDX>xh=zd7NltE4M)I8;inCzLdC1nk62Azaf+3T{Zm@H__!f&Vb)Fzz z)m~HKTfw-sGzx&O6U8_-2f_RaZ4?`b%Rz2u>VdC>P}+LB%kERAojRwzL*9Jx(2v?X zkpCh4lApX>gTIe@f`~>GwP}q359V6Kbux@QK(!)rX6P$nNC>!TMoq zwSDNv;f#l4@~0x6D5&7<6f7$R^i#zV7<`^FReZ*i4B$AH+d$Bt;PO<7hsNE8h3Jb)l^A&TQT^c0<$ zLv83@_JqAn(E7J4NA&1)jKxY7?q~?M>LRuBxBY+AMyi!3GQy)4!@y@x6ZhbHdwsgtm$u9oQm2a+ID`MQnD-!YhS-?= zzA*y@MEspSL(C<=+)TWGdM6B-Db~Y8rr9&akFa}#W{K0#1$^}^u?g!q2;bswXc_BN z8~o){RXs;Rtw_8+#LgB!zz$qGTO_9uCufUO$ppr^2uW=R`@=*#5_bst&JlmcY4J?1 zs3Jr9>|8OK6rVpAtzl(wYA()%WVkgKx0UYj@;qA9^m*cVT%GmiBV#!P-k*tIhmvtq zq+t{3LJF{fN0cmgbQe^8hOmsuU|Jxy$3mW3fV)4!04zYm{vpU-Af8~79d9iZLx}@y z)*`Xon-tbeo}QSOTW9xK!7x^svsnBA-}rQi*b56gzeF5{g{3T&x399VCxv^qsY^rX4PyEmIaW(bbR)`iNv%R`PY)`4*PytIcnYaWsj`}yLC-{6rw*|DH@EV6Fz3Skw4&SMguRbL_>UL zB^sGw$4W6wm+`F!;oxv-r5GIa079gm+eNEEkOym?7)|Ag-H^WR1Apk3C)TA!XI2-T zdcBz$j!nDnX_$MQX4rM(zFYvC^Td{#IquvZH)x`|7HZKWvJ>eDbTMSPpH6ErGKa_y zCHAy;8Zv5DNGETfngj zMW{K!+##h@4J51)8$$inbU8k=8rMz|3|mdNz!Llqr{OWEc&~e)eM@m8#BnsN!Bsp5 z>a7u9!WSp5q3kB~-V4^poFw)M+9*#zR3flL0FCN0{KH zjpD~_>0-FBQ4EhPy-pP1<78sVmxmQcW{NgMSV3yXR*1E@NenVhUMZsv>rjf#SP8Fe z5__l@Y4PwjsmSUNJNDNNgwnP14H%$S5@t}#*g&{|lI*dI>o67-wjO+@o$!MXm;R)K zqNmUJLdlV{8kk(%R||tTqu`tb?`{^GAX`ykpcXRv$Fs04H|+gy*PR=s9ZskPtucC?H!Y9^t;}V}|zl4<04uomK^cG4GNV z9xD{XU~++|4o|%yHJd&Kh$Z3Q*;7^k#sGeuPbDoK!qY;>S3*XfTIiQ z4A!8J>VxnlipZa<5cq9~zk~Zqe46!~c`HIr;9-Q6dL-TvHU!y<& zu*9Ko@@Mnws6+XuBYU<-`N-(Qvp< zY-fx>=ot#lqhsUnM)L7?UDQOZw5LBy)XUA$h~E}lH47We;X?1KUA!}?9oGit|^U|}RE)(mjH?X)o((6d$?r+ft>bF5K-3yM=tM7bCg_H+1E@)CU9aaH zW1-&xaX7QiapZt_lfgDCMpi}CMi4$30~F!79hVP@s~B~f2g*nJ;~o!y^+!Y?|As^Q z=WPSv)uZV5u;v(yKPq0L{SaZ#Jz>UiJ#<=(gMwpXw)TiG4uBQzzB519U~*h(QeHv6==8Oz*qT0Dk1K4*L<)>Ejf1BTn} z4N&zRN|#A6{){N8M>1SX$oj_@X1IJt)S?E^%APVWhx`h}WubvhAG3=K=LeV*t zL^m2?SJqoW2-7#`bR355{e1LAgB&&0?z~8%rV67PqITXbRRc56ixJorDyV2z&(B@4 zb0P0f{_W49Y|(kH}q@ONCi zB!&>gEBzHbzyBICui%R83+76Zq*lrw{}|5OO0hd$AFV{)cN_RsAzx5IZWYy7zN`{k zpbnGe{^H+77IyPk^Ff?Ae`A^X@y^g7g!{mE*QFK(YRrF*}IT@w?^g( zXP{%E)fwnm2TBVpzW7PrUF53o!QBFjMdgKg8iEQf@56KV#Dgval-%I)>)-mlQJhn+ zNcRPChK)3t*}U5Pksy_kNS@_*@75%4Q;FjI4}6h`(Fx-=-*=!V(sqVTGeEdTdYSxI z9sbJfn5~g|YmkrslM`AJ3O-=YBNDYS+K21*UtHT!`Jl)97Osew{QhK2os(!cQM zakG?6?#?nxb5zf9(U7HX5@7I^Qv#TV;9i~l6Gr6^vqY^lVT!Pbn0r;&@avld^!2B$z}P* zE{l~bq`eC3f~9C5!VUMW)^Sr=Irz8&B11ntdF;#A_sazA5)=Qk`kfinlUs&i)P=c_})2VTGnVAwW=#K1}ej( zd?v{;H(Wy5ED0J~C1Um(VwD=27^ZULgl&?FDR@hk@)9(&s+_4WYw3ZG6-8%zo8U|w4`-JO>am;Nsmr($%{M_ z!PL~>2g;*b8y&|QN(O3gYa~&7TZ}XpdD+q!`d{Z^b7#1rL)h_Lu7yMyqtmKY8rw5-#xfUpim0ATjwqvd25RX<*=-7~Eg^(r^haQFf znn<#B&jYqhza9ihn|!<>C{~JsubW79a48uef1wZvY#gb>o>xGGiH<+Nq=im#lDGfF zH9jO-Ld$)%%qmy1E(4y6lWdrea#@^Gv=J&&#vs~$ob(LR-6mebaBW9wyp+wT$Eh(r zW|Gf~{t(ernv2yjaJU(ISYBu zl|y^`1y$ofr={GJiptJqUff(FCqW9pg&Yp@E6ZHL$dpUy$tivk_~|c20a?d%m-7LT zlb``DBw4)89|Ln*NEHM}!hopK{Q_Y|OWYM_!=9GXF7;@C6u-F*{r%x$*ky_fL2Ue< zbQg9~ex()NpuC-HN~!%(h9-ATma~-&%H;a=;grkJ4AmQy-l^STFt8p`)_1*cfXuOd zydbZ&eaN{h)WM77w&3Oja;3QVRJR*+xjy7AZ}$ z$W2RZi}N@cCbgBa7>o;ShchtQaiSgWAGq4CwwF5Kj*!p+*ToP>?jU`vKJCdxfGK=2 zj%)|1f%>`zm5!7b2bdwQBYuN`WWtmF9(c$QMK)Iyuq!MnfshxzSPLUMN@hF*gpN2( zl3-^?DGh&~=p@DBLV33n+5N`BN=}N$pK?xGhzlX3i&P&MLS7e1MEe}cN0NLt6qU)x zq=sIkISH7Y7ttoPl0 z+Km+yC(;Uj!vCPf#DoW3pmH!ha19rzLS9Nj!6f(Wx830W)YG!V)Hdha_lFM9hZ%*B zcv!IU5f5)T9`P`5^&=jhTk(*G{lv+rawtu!h1kQN)&8*Xbk1ZHLmvKN(ahQ(=5HG@ z83m>qo#}Y}S*b6>ZZ$&HfX4ogQ~jmk460J`bETd5b9=7z5?fRbBRYQ&3M1x8dTmiT zb-NmJT6&u;EqBB}F9kAedAZ}>chYgD#a4XEmEs@gVYf+6jl$8-dOEEQuETDtk=t4h zO%_V^aOy`sX0x(~Z^E#J(jw+VsCdkVVRA1^XONCl=cQ0+wOH~&W}4d~)B+P;k%r>^ zpI?za!=FwUBr{B2B6V@mdSyv9tv@gMt+dM9qC%@;sBpO#$h6L0L20dgU81y}T|sHh zTq)f_oSKPw(jXKjZ{~?DPH0{9vww|`9P=OuN(-zFkg4aKn4x(n2u6NI|wEpTT?uM zi+mSXBEpYsKmn>dl)fuHin4a^2ytZFC-Fl61ow$FFd*# zE|K&V-ts|P!A2d{hOdO}NFRK*vo|6Q%-Q--H6sJ;$s~RA_fh+#)S!n9reI zq4Ye~Z!eU-XQsipFQp&x%Mo8;0V&xbwj}%~ImFf&i%Hljb*4?rFepv?U@L7}?p8@@ zS|x5b+{LqyS|UY*_ehCkRp}gRtB)Fm4tLAQ`nJc=7sb{I8+s+wMjFa|Es=(XeoY%{ z53`YU%7vpOl7A#7=QuNFs-y ziUeNji*0nv3PB`uNNF%Xx3-?IR`jA(% zmCnT%3*FFRPV$4ydNwbd)yXB2zdWmH&(1qXhQ1k&dg&yoA@*oV3GLDJ$q8Zb-_)Q|k}*QW<&HUa2*4+51FlM5Gkjzt(+{&S^c0-6xSFzEXt_=j?do@ub#y zGNp8GS@p-&y}N9mM34BYK9Slxdsn|-dWBhq4kc0xFS*0D+;ju+#JLw^i)7Y2A{*N@ zjQYGUcgS8=6pQELl?QMh4dD)hPwx?E_&z8-%}jH=dQdvalDCdRRdiUOV@13zmPMqY z$;TveLVp~5j$;R$I!3h_@8d-Mg0va9LG^K@9hZ6&>t19R%R+Rq8gWtzHt#Oq<>D16 ze$#2w0MAe`?a2ss_eDrJCB228md%!m84RSU9MCvG;ZfUV9<}{{z@yd_|B^>-e+ZA- zF7v4E|0^DawASQN7ym3CwNK$uJO1WTfAgrndDP!L%H>4Z6FHVF0U(3>LwMAc-^8Qv zt^0V?l|O|?P1&OGC`dilBGq9oM`4Z4)yvw{_zKjmnIgieLZQL8Xqqg7qu)xey3~|k zSE(X?MWupUXQc*&sS@QWCl_X2kzRw9=TPdQ8q{s95tXOd8hVo+V!uaGpolQ0AXxdm zG#Rf^gFsMb#vks#!=7s!9IPtx`J2R6*-1sw;g~^*eN> zDOX@i51SB{^Ke~hk-~?HWjvwKQeW(;iO#H^04*fkK{U){jDK3t` z$qU@5D8`ByryRq(6k}>sx-TTasGw7#?QdYah{n+QmSm)|-N8Iq+AgAz=ZW=cfxC^Uc>W%?SUf$i##1GW8MR{Sdy9u zG&k7d>ORj|?$eBoTo9Ghi60eO-O-}tg;_fzx<*hpkg}OgdP8>Ch*r?p(>C;PHTiEf z`END(Z#DT37D2B5CJ_YRx=#eT`lpB>IXN{&5SZy{+radLe|Xv2FdH#(8fx+b!mI+6 zdI$MHNh@1ROVQ3UJctO1!ter16rvM1U`>d3i9Y9Ht!-Sa@-$LK9{7`IZupFTA@AQ- z4RLj}s?hLp3dXm#r7(NpQfphYIOkiB_)@WH%HMWtW2?{fnp$$(43pZ}8X2!2(sRoh z?$`nu>%w{z9jk`U4|cDsHVt(iT`FJ^8kv34W8qU5wd7a<@>|`us0i?L?pk!CYuVP; zfn~3vzbUb6%aYiR8j{$KKT{G@rQM8!*;k}j?-Rv#JVX@RQ9~5l@n?!+PO@g+CyU+q zeX5k0B!sZt2 zm;PGw8-i5=o$J5(Q~+Lr9V(p^88!;_*?w=Tm1N2{P=^#k2}9f{J^*F6F=_!8RCbk=yDv4 zXlZ*B6+dDEf#xG@7tjQ1O|x~zW4e?y+erNHOqz|H{rRWc+9AMPQo3!Bda;V+SZMu1 z031lSwP)so??LppCx*f`vf; zP_-h)53Vd9r-6H;ZS`qc9bIKL8)J)!`SG+rdc7%HvTQp*lBq8W6>sLx@ufPh8bebH zjoal=hkvE}tI;jd3_h!aNf@uqopy}{a+mGFlN&78XZ%m-62hHYf`H^0p`k_%IlYPA z4?1PwxRgLzhAq^v{Cu!dbO`y77QH#cb`cLq5%nLk)_-k=v`t@WVAojNQq3T|84f;O zz5QU)I9nIA2$YSpku1Jp3UC zcq)u=fggFIv+*Qb01{F$L1hN(Awv{IOt$I0E>6*Mq1?O@8nFUC@x}ny{PhN%9^uAL z9oOP;CP#E9UVI4Sb}^KC@n!zARiFkf6ev=r9oGiHlF7C*G-{=sw?^O(aVJsbT#9o- zXi_Xo^(T0U#tz{i+5ZYAEdJEi4*ODtj%K-yRDO;(KgFfN>~r*=YV&1rz%U&+R3&16 zjs;s|pM%+2O!B+-Q#sj*ich@Zs z7RuW;@Q>EwXujlhvXGtpsAJ^D4Q0w_=vh512dz9WW8GQ`i>qcy%z5ND2$5BiV+%Lz z$%x?mOug~B&YmCA0K3+6nvKM9H^ z8}Y0zn}$vcy&+<{jW|`mGTqh?r8C9N%tal-j8N)`Ym}2tN|JR@TPvh}`k29>m%Yt! z9%EAF>FA2^9;9cbBe25^n*sfR!rxkHhR0^uf^}cb_Qi0dXP|ufZGRnYIS$>38Mp&Y z0`*K=0&Y=NaWezpiJ7(zNKw*lJpGOTvFr|9KS$-j41E`y4y$wjK;_fnm9}Uic_?ibjt9nv{!98R&tKYrBg-DZ~6J zglMu_P3C&~vS*32Le;lA(edIuTL{anbfkY~3vqX1p8X$r{{dcAvGtGR+57Z!Qcg%Y z={X6#B}8e`!lsDq0to^lA`mPHhy=Uz&^tsWiyk7VsI*`?2nfVNZ&5^1S`?*2f)u6x zJ~MltBp~;__y2zHect;#fA4cS*?Z5PS+i#L%$ij`D=>}6q#2-Refng3sD8^7TZ4ZN zd6ss6$g}B(I_A)at2_3$9f!M@S8PmaL8qeW?Vmb6;(KFFM_B|8+ShA4PD}t<06>eQ z{>2@W@ptQ^1Hyfai#ul7?n_$!l60>SN$H0=+W((uJ9QUXK9Kb$qp0SQjxXJpq6;@V z?iIvaS83C&j&df06nGbB{bcct&x!rL9 zR)f?#m<02-k$k5k3v(WDr(+A0w^CY$Ld%Z0->yJ{oJ$R znuIJ22v(J*ZMWVE2ne|43SgK#H@5k&ytq1Be&xp1&*fL#{~2j|9Nc&gV&@EzS=&zD zc2JPS0UcP|EF>O@YUZ4g`|!pCDJ?ubJXzXsDF*SfH=O}oq1r5B-l56!~~T zW>MQkf?Pw$@SPImH-v~czhVLL%>uk|vT-yEsEVJdU(u^3ISsgoh5a27^o2>5!KSPe zjwn+AzTKR9smyieu|-;SpB+l)H;sRB8wC(mF$hDg7tI4s710EY%@!Ta>B4A zcY0@jtnEN)96#SDT4cV%<}7|Wnr1f@Yvt7*n+Ov_OfW6C$joOj?W06sb(EtAWm@Gg zv2qsOZWJz_*h+n4s-)%h*xd-LK(0;xL%6Y^@H;GT$38o4N3dt(4!%=%`C;aukm{5V zuoc54zlOkp5iU7S+_IkLyX0QNdvwhu&$oO3zSXw0q>+9{7YnVXVgfMxLFw<8xT%I7{GBmbE7;TJ@$KhVcw*FdcKw4hW+Y(efZX%7~FSp#H#EnV}{WKQbtcUW=7$BGNHG zR*u8ZM*NtMTH)zcT&q*OBSN1LAUf@%vp|~O+M@@xp73I@Z)6;r0^hF1%h&L8F+rY( zjwapS9!(9#OtaAYi86y=%Gp)jxN$sDZYSoEHmG>M#(a~!t$t_ht?#^4)=*12D+LoG!AfM+c=OzJCfx@%xNn&&Erqa z0$fy8IUEzVdR4ji--8^@m4Y1etI8~3-$p}^wU4B4tIE}_r(;l$ozg}D@6}yReimfB zR*jSKPBpn9u71$3#OnO2Np=3LpMFL9)tA-fjKJL0PU$OPd#@7!gON}}t{VB8-+B`2 z_XIP+6O10KA-9Nw|Cfx>(A;M@oNOxCXPIDQ;A--s&4s0YpL@R5` z3=G3VeNyCMj`DCuDthWh7~N?kH=t3qc!_8#nzt;BwmcwLqb>R^L~GAm7De&(?6b?qDNG(zRdgro7Xo; zuUkPn?XNEfVip~#&uIn(3V7{E(QQx6+?B#H1{7xf_2k+nxe+RcbC|6H@tsK$fzCFD5p)o9V8p+|2av;01N+*oG8q|KVhpYtibn^K#}i9SzLxd*d}W!o)lifemQeKH-lUm7R*`>3!oCC-0>8<5`Sb%#;au-~! zmiX1^Hdx~d=+`!KFUT=*h^A)A z@(s@GlL1r~_+c0=Re0&aD&JgxS3&y+^qeLquMG&!bMv(qFt;f7r=i6)%_j%9IBL>!O}nx~{*%gJ}YQa|d2r zH{PTEkIHqdZ0EUroaj+`sc?##ca`G}dc(}ptxD}NoT^)#AGGFtXXj{^`i8L#0AKzb zIRBEzuNis7*n9q7+^HCef82{Pdd`hXy`Y-iuGh2kR?z(mU4eQ zfzw-8IcW4aUJ+;>XXM@Zmpp0Bl96V|aKRW~@$x^WdBWdlmL||+-Q_e+HJq4dc9-i` zP(4X6&Rbx-oxI+p?sE9xXQatSi~o|th*_Fasj{xP(l?6xx{UZI%2YqOH2N{Q zg`dWv$7BVw8UUI@tsBE=L~ps8a|SQTx8lqma(g_UX*^!p1B*can@u#Rr|dvC-!v%w7iZF2m8$G2y;bq@KOU90%ez_9Q*IHe z&wi^kPe51}g2(1iXmV^Mt$P&Peg7xqKKLZIJyHHigqS6&)a0WS+Dm3`*>jDS|Ha8P zuTmXd(X>7~ce%XH?j>`#><@bxV}VcfT(9z3P7R){SWD8MRZ|CPYkcJ|PM!CPaNqfOq(1I6c=xuI^mQyQhn4z2&CZbeHA55BwUb zkK6=h-^IAUg}F4VkIY_u&$#U0L#`2|=kZ~$BAibzhB@V+z8@n8NQ1tz3$v?5UnCgk z8|Vl6Co(t-`|I;mtDig>yKrGY`5QPSz4ny+fWWt?RYHDJ+bC@LJ0>0v^6h_Gwh7k7 zc1*z4`s-!S$hEOj$36=YeI8{zi!CXGK7Ceh48lLAHB;s4RO=ZzgicJA-Sj|z?9O-S z)BbWZ6fW)03wL`?Zj5(|M_dl03@<|7KG}CXhQ4@?kxM(ClY1b7;B$k)e)JTxw7#58 zzVrbg0mq>M1LghbNwYyRi(=S3NdD5)OWI6DgJci&og^pG#^+@gzP@rW&R#a&i6S_$ zeSr=5!V9>SL6JjvFO(siur)(?FTTkSrD$kP?hKJvgZS0iocJ@@yiDhza$^@{8-u<; zs4C>z;X8HWm?mIn`IDK`$A7of8Szk)8U9w|RdHD8h2V!Q^ug8dR*TktCSfsoX%UXvM!)B%4p zQvKIumvtTx_oVOXVz%5p@L+kPz`n{HD#y{@AsDM&ugeY$-w#Mf(~I{zfn0CMx#;|& zH{@nEUc(_IG}#@Dd}~udieng;xLXdB8)HuXj7N1k11fO39Pd0_-UJm6le5tGBYut; z(I95&Xn7f5gW>2q#)`B>(Sgnpry@9|N3FQ<&wds#S!_wsjtg?cYzb7YrJ ztytP^;uyd~)rr4KVY9C*6o_Gx_y!(b=SUpc(f)5iKceHKW_&tC|mV`F8ej;}k8 z5B_u4ptmqlOgzJXGEL$G z+F=qTA3g`J8Xur<#$=qIFt!V)$gNT7ktuRRy_dgr`RLC~tH z@-__PtJCDB_yAW=ll!73_jEpNcLXXH2%aXUSe%&7iavrD0S! zOOAyxV$UqOT`=32kkxS03IH&`T9r5(TWL0Rnk~n>=5Ms&UQf1#Qt>P~+|11mGiS>Q z2(W*XimcYiDrV^|Jwk>f@>y|3Wu@*gIx}0Y`M0`rdEMEkuSB~URvD{5fY*;yWCaKG zTrp|0!#hyOqj5Ih;ao6>&55_+8;mVF&h3hU#|YeI?B3ZRA=Atv?kvi`CRa=-^A2_faU^pebQgQQDL6^ znCZMp%Fo;$g>nhRr}jXCCMkm^5cYu#T1WB=;(2I%W&%yE#avz@WT!XEV#5k&rAZ{$ zqCIo@S=UAd{VoElZ!S(;=c&~^KEv|o@!HnUlUW9;f;o@kus9Frwr*7RO??k#&zI}C zrmtc~nfWJRD5KP^CnIUYeA#6=3S`r#@>@5pDMUL2Y42uTL0OU#Wu%@jIlUera0VrS;{PokE9pgl>_(>rsG=;*0@~u|m!njDInL~7m|8k4 z@9mmqn#ry+==gFzPj4)j8EVPUwLtrR@&ow|^E4C0lG3+o0<_};nVHzel!Y;6rj;@` z0~o*mhghsL=_{~H%7-e|BEZ@kOj=(`qL@1B&iR#*0W9pSxb z&1Jg{x##7@p}GOIHP#5-0BWbAO-VkE1(dw$WzszMCCcPuar z4re^SFhEDle7alUaK=oW7g+fzg`w~qfbZIY=c1_or*c()4OH+!Za9^$wppp?xjJD{ zFD6;o=>@eI9}U-rc8|$Vsc#lMR($_9U`-W9R>GPxSArx5=>=vLSW_QlJ89pvCJga1 zqiYRj2rW3>Bu0EahH}=}!YF(9kmqUdXIx!lSgBdWzqsLUBlYIb*-_4vU(&OdP{)!5 zJO+Vge++cM#0~i5O!?9ixG!Yo=Wb$2)Fy7=Dy)VZF)k2+x_u$fM)SXaA-Bhe#-JRK z2Q`e^Zj$eHIj}G#x(Mizw>HVGszE>FsB9+zGzI_u!3kYEgWZYt&k5JpKA(HD>}Jg+ zZDGy%)^5RE#^tdh-g@?z(0KKuvQJ|o15ptNBY_IZO+|^bJaqC)`Dc{<>MOYj;^~C1 z<;Owr@u$Z`QPjy+!R!T|M}V8-Lcft&$O3}&J(O`=bYe;uB~JAO->tI(9heBydF7DR&cR#*y$tBn%y2Rk6}+InqY2@5E888|CiAhrJHa z*E2+E&Gitzv>)FoC)WM`BMbah3>O;%tH4#s#m2Wg4#6NjlN?eo75z|~JC#Vgo*2O-U6`VJn%x&t(218AoLo&k{{UI4F*=Z**e%D3h1eJw0PpnOa%XWFKG4Irqv*Mn>m#kDjVyAvD}{|ZC?LyQufK+%{zlJ|D=2hqjme_(e?w&s=D_J7=+Ln*-?3~G;mSB{c;WK zvaQ7d?x~dZPmggUx<^6M8@6_O(Z4XNYi z7AIhfrD>COsUxdMiEvqU3ndn4NY%xVKmOXN%OBar`ff5bA+Zx>Y<<9s^ass?=%uE8 zhKLiAbb#0Oc@On@N;s@%lIXh-#}s$>)oz;IBho^zbQY>o-#H?ZKa^nlWm3`ZtC2y{ z3Lu>zNGnOeUsPNodn1sU_1>AW<~Uh@k*hW^3J;W6z`OrdufVU(_gvdqg^&Lt*EO@Z zDEA!)WVT=AVDXdVwCWc*#cfmuVNiT|poF{UevzAtc&XJ1IVQ^LuWld@A!7|<>%r6P z6LLJg{;M1u=qH^~LWND6MpFHEEcR5Uq%n?G6_Au`Km(^b(8L2cftYGyqu?GwEVpnJ zKAm!Uyw;(J7chtlI)Q_jPE=f^QKS+{7K5ab=64;Ujk1Rgj;Gd*qiT_Nq}}Q36q3@9 zE%}A+lsJt9-y628U9W;^dgr<0bOJDL=wn0uZOK^>5fH z;u+-(Ez;5+iFL%*TpcgA_6k9~+vk6me?_E3@k#k({7g6{SA_=34mY#Hf7O&VjNQd-tm7_jikMVQ90s#!Q%{wEvWIXKMDJ3!%8J6_+ z*%V@bdIdJNBAWq@vvN8sD4&(9RbkCnq7{WG>6y?7nsZhjL;WtuPuu6NNoB7FP|2B# zaHp7e%jFPxTnF>ADyfETVyoQ|Lf(s5j5BDZ?Fewq%j$$tZwKb$7Z+uAD$MbxJ+Ts2*91W*?0Yq6UE;8@+W-?u3c( z%Q;A}6KTMC$R@=kJ&UEQuhU_nWnGY-_4D&`4RI#-573q8ugNJmL%8*; zHMqi<9J?mB!ObfA&7DmiN)ECbai2_^7^dHU<4>6xh{N@(4f<7tesxQ~iqx;t|KcS* z`qle4rGLrc&1d{><&19vKG>QCJcysq*730b(xF-U zT>m?uuKqY3KX6b=#n05=Dg8Rmr5KS9#(PNHaM?klugmV>cPCiD@FoF}>!l?VXwh}K zGgxx|I%jO$4JZ(=!B3F;AS9Gi%X*nuP9-~JMc%~vbcQzHl%IpYiIENp1`k8(=NX^4 zyxH~^Kg8wUl4qNz3-D`*Zc>m)?QX;K2*As?xfJl;ZSFT!c3X}OF4$z|L*D?Mn74^y z?#Mmaxvw@QS(Qe#@{U{+?HOrYD%z{7Z<35{cVsC(qY?m-ZbiWoD0*$!D91VGbW$F& zEtz0pN5VNXm3XXy79bH7?o^`YY*)g?>j&o?RakBui!^r|n=3c+F^_crwq+%)hFglc~2^QOx5l z@NwXb8xoQkPj}1;Tg99fg`JvP=mXl!qObw&Z&9l8KDXkWpcZB&Jmj};^y$aG)T7^6 zsgGHyO4(0MG1DcBQWtJ-308%vE=OAxmVNIp7V z9ZGC8Yr*4h0c7knjJdY_+>O!RC z`v?B6-EhC?ybI5pwnX5I~{ffpO7R=|`h2D1R=1RXQ}{k6=}^y7yt#p-QaU z9B4FC-`^Pu2~z4?4sBpLSEL{%K5*w2J#4@t9fmuHo<*B-f|O`JwT_S!tiXeMez>1M z82TzPM|FzySysbeHyCx4Bx|3r{DqhRE(!`(T$psx!5EdCH9UlXS_UgI%2lDjHz!f~*ecGB^~p69VE7jJUa6_P$ey37tCZpAr+Ug;(2xgHR^P;k zz?jOx8@ctB_Q7v&vPi2%X~z;5|6Wei$0F5@TqzZgPOR5IrQRugu1!x-Vr}nE(C6B! z6ot8*`gWu!-Oa*VK6I!P>x&P4Y4H!b;X^l;n9#+eEtOQ^RDRZ-1Z3LqzN2)ZFIFF~ zLX%oy?EH@WPL6`U>3xNvpqIR__;pweVSM@eyyXf5K~Gu^Dxd>OtC3OH7wIz8RQ|X~VVRNw@B9YK6qbW7W0}H&D>L8d$Gi$wumUUN z3@YfL^n^5cvxD*?t1azUn8wCEqU<+AW;WBFBf)X>Qb%QgAo`AU1WoZ9#TY;KuHpF| zs5?_*#tf%$MR^9E`NI@tAk#7z{ONg?jxR`!quyUNji%1ej|}$BQWXS!e7uG7G|bUs zRHT6rWT(=Up*TAT_QbBVx)a}O)^|dK8Tmz5s$oi;>4b4ah-qhKaQMwr(JV_VQUsmG zA5HPc@+~yEv(nEzJq-F>>5<5o5T~v@nhuvgq{;g}Es9o%(Lq8cu_3c8D`{ z8%C}S%qCsg#w4jb84Anmk(Q}+7SYPsOzf^(sVGw?I#Xee?!lBc>)kH2x{FSB7rsNf zNkAdG-9=$?y6sVXF9p=-QDrzLd*P!>ta$!i+WRQB&l_~(QOw-Q6xS8AD1*9oRnEA| zyNEVBc2hFoOESM3FSVhY!m#$Dxpz7_yDP2=e(<*pe$?&`evFSr@;%{?pqNOfq-We? z?v4&ARu?$T`Gr;L3Z8s#uUdkQj&xU;-YZUrK;Ck-RVy0ynBs(dVz{vy3LNl<=hovQ z+LFhVG?0@>Qtp!xbo#OXft*CD*+Xf|X!25K^btl=65nEVnv!&yO!v}Mol1Hr4DULb zq}nbVTO*pZOmpgaLAjrVkrdRQ)xjz04zWzuu4eQT(IoY|DhZD2T-3vm`wAadkdO}n zAxyt>(VE^BUs&cTcs2L5rBBBF&|b>ZxK)(VJd%3b(|6;Rl(0RV(jDmx)>FC}7G{!m zAI~p)y{b@+W^dqGfs$%;38&qT^ax?R&)r)YEg1F*TG~fpp(;rWJW(bl)r9v|%B>Tx z_ElbkG<2b_!lYrtJs#hdAr0#(X4p$FW+^f%Dc%Td{R3Hww_M!Kz@7+kSL~-eiIu8v zKZRv3+R~3tLm0G~d84!+7u4dPQW|qXEl^iPFPZU>1u~fu9$X=$#f-bHc1K z_-`!!Ke~yiLIF@APm4^RPU;VuJ`{15;xujS&p+93`YR21mtZeoN_#)A%oO>Y;toFa zt;kPTcGOq=Ej4^jc@zwr{G8GU{tv&q?EL4I?)WKtUa5wk$id1W{EQupB?%KfuPBVZ8jPI} z*0QoqVU#y%YKW7ciF7F~;RU5l(5V89i8QA;9)ed78vFtT_-vZ@0(So`zv#RF@wpfO zX0^0RspT>>UG&%EDX*v15MIx~A*g5NCtL)h(1!~=am=27SD>l?NCa~tZ62aTSO15m zM61-WqRm@F4B8XQ+f=g^mMzP01~>LF7@YN$0bIZFC5sGXz}ro@D0r_a)+#lvXkc%) z(LhRh1Mx$7r#cQ*VqJ&Mh8lG>=OEsHud78xUHLN!yh7dt6&=~URm8n@4Tpdg}g!~Q%r)#EMR$}Bzr_Sc2}eZkE7Be3>_NufoE1VX*26?#~z5kk0Up!-_FaC0PtnkTj zAFv}w>i}l(n!b*LUsn!^jT({3S69 zkW|Y43SxhqV}Av+zfQ5gLfBtpP>-%}KEduWMKE83Ve#XG#M|jgoqJ!4v@=DvN!osm z%BFUUs{+L`FR>lz?%aXnFZxYpBdJEGF;^{YF55v<&L0 zVM@52SI|{5<)FFFk-@%K zM=NH*_9g&9tgxl$jDdvxBo*jCMPrm`+ky8jk`s?g*u})nFbLs7$l>LZa+GInSOmFI zerAr6fce4m2HKY=xM|mxmz{Jp2TStT3+)noM?O2JuTp7MrbPx<4UpV}lErFF@B7_N z@{YyZ#gsl4rw!Q6msZh(qt zI+M)jqhPTX9u9%e1bc;y9g8}^JR21nAEb&f!veGWEMaaI`h z$%8Zp%-%eF!9QN5U3tn=wslvVBi?5eH6mpPSbc|-u0mipr0z1L0V@d$loXmVPq9a{ zPEHi1pMT+|9F(!@dkq4V7b;N>-DD1B1MQoK1>=hDDMe-T^aUeuz7mBqZ7@zQxh0`t z6tqA|rrz_7dM8z`*Ra}I^m_HUNLKHX`B>Oi8y;A}h<9TZ={`6|P&*iQb-p5TIwx1I z&k!PzE|Jm6bJgLq&ZeOYl-T4;XZ36~!IF_4!yMxcu7rSx(BxGMc;(v`C=ws(Ddm+@ z zpFv+QR8ArZ?}|liEACiy)mpuG`!uFHsV) z@0j$q5#Oxi0qScZqmK<$5Z`yq_uVV}Ac)*A(!e9vf2vvyUpQCWfF&$z{o&@9E+|MqYlMT?i?2#Q2o|Em*r6pdP@MB?oI ze|5~BN_*bJ$6iSR@&3O_?eMR2CW_9k$5Iyb0S>9t{;q}iFX55-T8t@zLc^Me(~^`I zI#QpJ9;ff%BxR3?6{{R-)J0>aVZ}N!6)OufKCd)Mhqme98aBVx*F{CMu@dN>p=>2c zoQCN-eupkkO4Ib|+G`qLv24&rWUlTIM$@M$b$FF`U8?gjiF-hJ9XMu9p02zn?4{HhiY(5IrQtIm*zcu% zGn6jYy(}4cU|zH5!>Rd9r5!XKV`eH%g{AcQOl7|QG(=CuK6sYm5qAdX@4p!f&FcJF z*vIzL`dP{fEWYqg$j?D)Wu&T|t<(u-?Ac?I-d@bvL!Zs&@~N>#>BtZGICUo+woa@p z?@a`+hWm^p<|;Rs$|iD7W^@Fluj*o_?1PC`pY)~z&mh2iWOwo~)+I;kQLCa<$t8e+ z!4$m3rPlpb6LeS)<_y5HP+xpYABM8x6y%)l{9q!DeOu`#ei23ck6RG5`jr;wyYrFK zh^urOuT<*B9V-WM(DOQZ11muTv}*oD6!luIXhFuX0~x{W?vkIRR0TiA6e@9)u!w6}%zxciJ>@O%t3RfwwiQ9sycia<^cCPVp!SyF+B{V)C ztX5borG4spvC*gHfC`mjNG(qiZx}wRBdcbRU-L z$MaI(jL6?_2Yy4|g+Yin@F{05uaqhd)=k_;o7n*Yo>X zSK}gS{SSLQRwUqcQn?B6bm zg1=INm}Nb;MHD+Naa(q$uapl>Tb86!#^7mQT0HM~G#!3%eiW%+D`gJ#`qmcLD@M%q?BWx8)QY-d(xJByaCt4&XjKy@r1}hcVTY2Ax;8g3d-9tfs3%0bVRv%kYp<#Af_os!IrQS~X)4*k)Z14;tj`cAP&%__7=5z_oGbtEL%oplM*PMg0+ zx$`^s*`cawbpTtdUscoh0AJJdTSnFvn7lqqy$GlX7&ck0HF$+ll`1r>(>7kAgPW$g z;2!cl>Rj`izE7lmukRBo8s&60BEjjWGyi+V9>nO3^;b)ue9!lr2aS3jqO!-W@Ct=-l1krwxJv$zL)*a!RZDtHkR@-W>~N{Q$wjADW*{ zg$L0}gT9Y$;u5u(7+@q%FD~ zknPRi-t_Bxw&<2gX5}mTL5W6)w}mC(fo(C2w1Z03NW;c0NQ^H{%iE~;W4UFr_m6j3 zCcmz*OfLS>V9qzpG8q|ISsCU#@}puB#B125z6yr}&lk#kaj%JTva5K=v=Ra%kyI>wq+v+E!eDtL(W;V8A1^% zDEnz;6oqer?9+{aG^4v4dXam5zLU!{`_0mZN&2~G;TFg~*#Lq1UKcEWEj6>)1UkA! z`J2Ab?*__`IOT4P-Y5uN`Vz{emctd5!;z6yo>PRGxb#*iuh{RtSZ0gvKpEGkM$?!^ zU2Sj&9~w;CZX~jdUw-HtLpwI~X5w;jzKsgM?&7f^5@l-&WyMr^#;^SH9#)osQALN9 z=ULy^T*Mx~<TpDP5Kf)Lk0=fCe9aLhO`IPKsI&GF^yd*Jkrgg@=~-lzI;u$Q zq9nY36iqv-q>I~wDMN6>O`iKcK2kq^ z3%vh}Ez*9&k+bBdJm$!$bH@e|x~#u7p>1Gs8LDCvFbC?5yg-cDi^r7_|Frvm zesFj9Km7%!!P1pf`&T6sdvng_n}D?YRq4URO$5C@I6RDQ{R)$89(hkFHN`wLc?Uw~ zeewkKMR^oDuPF?QCop^R^0Ou+Ldg4wU(l8lFk|M?Y5nI;Px#wizvgr~xW6%^`aEj> zn^Mc1X9hM?){$0WH0(EC;SAixd%}K1UhMb{CfYnYrr)yv&Yz^|KRxxIar(~+{U>P} zKEG4H^S5s6w`!i`Z)KcR7<7tn`c8Rl?O z_IurvXweyEmZ@}QHOe{=5lxSrRYqI4e8(Ixsc8POX!`xEQqRSN^mu9NK_@VA;?H3; zSIwoS=aiRV#9VPsc?FWKNUvU2lBoT8m|-$$(s^a7vx^`8*+DlOJr_fbE-10Vx($7q z0DpdV&hLFesh(7he&=`U#zQ?SgqK5D$g&F%A^X$J*Fv~Hc|GMm{#YE{yr3l6&i$Oo z!0o8oMI{*)bt~6r_|H*h1b!ekgr2;pB)X>l?3Eq_44xgLb5eG67|p+^L|LZ^xPhU) zsDy?1XZMaPUMUtKC7rq?!k$rDUM!FoBX6lR4VyeGz&CQ_7TV%!BJ?3Il!dP;qaFtm$dpE!6jtQWLkL^joE42U_y_ybw>D zFDXtBWN3Z!(9=_!M|;f{X$jJ1Tv8^v*aU8KjhC$c{41AZlDLR2lreHH4enqK%?~t#;Jq&rGPQX7L^2=BFkcYew z&D|*YfU8$A;N!0)N)9moWn3_h!21V^AUaanM>Z!Z=2BG~09T;QUwg74V2keO7gBJb;J7+fS_zN5U);Vkk>Ioh-pv=FN zu=u}Om7Ees9MbJviPurxf?TU~K$LRcVNy*Gdf~cK&oX|V2Yy2N*RfRhq|MirXuIDy zMa5rR8q$)zsa2`T4P^tfNL;?5H1=C08r=L3StML{>*?3rgtDRZEbX|d^l<9dkR&HU zV^VJ`F{A$z77@d7M$#=J{^iE7Sp!NE2q(hOBvFFpg}%O}Wce9V_qLMo$iIsq%Dt_G zCmJLe0WOtD*n;*?ou#5XN+kVsTWLSKoH2&C2Xd@9lSH;`fnu?JvIt|%zl*lY<|CKx zO;Xj*Ekmyk4Y1L+pIhfRwFiVReGRsLRVKjQQ7wZcP&oQljH?nP5S27o(Ome8(!Q@1 zMh%KiJs)k7mI#BA&9HGGmXAZ7X5cTj%%=z{^OdR;@5i2CVb2y+wy@_4D*wtepBAc9 zv7koSzC7n*r2uL=${ULvTs~+IO zAce7Vh{Y0A*gHhkZu_V>lrIUzBcJoo1X1;{1tcxGYdFmcZsM}7+#V_gqS1ojCLa39 zcwCq|A{+>%hMSH_nvFtLP-uUn*^!hn$zrAlOlmmWM?~x+ysh3Qw1q^il7MnaKfM=4 z6HIEnaDlg$r19@HXng6d-pZRi}>UI|7(ZKpxl&@c)`hXy; zqs-Ga;)4O@#|@C{in%GYWNSR4fok`+hDghBM_M?yIx}!CFUA?O6%->CWxG=0>|5b= zc_~(aM}Q!dIW`&bVUO@V-D)IXvctE+487XWE+->sP_TN0@hrU-B)t%|CX#1N2vIxZ z)}1zIJZ6}7;Y}R^zCvl}R?83wn4dbw1CwBCsA_fU;ea?10jDhbP8f9wRl^bwS^bJ( z!#H9!tg5_pR~pmgOOHi56~L4Np=vvEX;^;2*lI$gNjkn6K`xk6_#Iu-8b_Vi$FP*J zu!nf)i<(xq`1X0)SJT>zNO#6Rona$xQRT0clBxFZH6?k9fWGQH(lP zT;m{^d82}Ygb-t$a082=?C~zG=)rJxnYb4y5`JotGJMmYQP2Jl#QvH0pCZx@Kl(C#c0BAJ-d+3*Hvq=G>WrF66&Je_hZdG*!05YPS18jg)v=9q-m1`q9Jr`%GgyL$}6Z&ruVN5zenLq$w|B+14}w2pGT=0D19Jh~kg zF>mY%=wu!dyrkehL46yji9!O6X`sH~=PZi2j#GiJ7hpFx+sFSqlBT%fw%hUn6<)x3 zKLkf%$FxVX-RJJ4DOnDy0@nYVGo#G$Wi?c*3xQWm*cAi34xEXW`rd4$_7Jg(1Wi!S z!4z>`@@NtLYZ`6qIw!Xne zxIpRIcTu1_!5S14W&e*9G^^~N!z8-qg6x2zd^oZIFWA4pUS#WdN zEBt499-jzj^3;a7x#Cr|89z!5eNBZWj#OQZjH@te{hG=g`i8v5->WfK{ThD%smuxz zmN!pbY<@4qgw%%ze+#Du8SMjoV>)AF!@P5kP{&|y<&IFj){g`LcNoYZ#}=s1V(O)h zRHLZ(LiJ&Ukj@?nV#jw;pAdTaj(5SlK7(ASco?Am`VCCRjLRw^X~rq)1ng(0a?^kiV_5cDypMUw;r-lpK!0Ula) zE~V-{?nFn=rKG}>Xy|UcheidZa!;a`0}XJ8f@lT+VxqpSzCQXeLeFAN=WJS_BO|2p{ zraKxIB+S@O>HzEU>Da1P(X38tWb6t2jb**DSWRModM!*8iq5u`r$*uP=XpB*i(mbR*F~!PhWZrNfzT(zqayAL#7l)Ie@&+wZ>TPD%VDw)QwLchLtO6q zzSoDTRKA3+)tAtn_gzAJ>#OGoET~vGC10me>IeVR>N$S$|9bT#_ry*Sv}mlFDt`Iz z{K}T=U)dM*+Y}tE?-oBk{y+T6*8Z1#WrhEJUzzLc^C`Ocak!NBzX`$e{6F}}5Z?43 z6+US9ShbFjM5{|vA}Da28tz*>Pn}r)?JU>7oiFbD?c6PXY+cC25B3!`_dU5teek|t z(Jb*#q!P_noBuDQk4oRq=6~n+Gn~Geg0s&!3S0iSUCQ@=`2BqLU-JEY`d|3{tUF|U zKl=~s-_NCg@cr!i4}U+St1``Cz$50?RZWt;u^1&5<)I|0z%Bp|H+JHif;@42^0aw;uV@e1%sfCCMJ8J03?kJGkZn! znz}OmxYzVXvUQ?YXoEn-sC8=SXnPy)TIBc&3p{#=b5jcU-?M6W}y#>A>&^oS!sPo-*DB`Cxc)T2hi{Vqvp z6OhFF3WQOwX-qP*o8du4N4?fIqbE!rpX|WN-Nd?w8vfpAl0H|Hw7WXy`WHLq(0h-L z+0Zf83>a$kD`oV(^z+hAMn6h(`d#?jj5of$4$l4Y-3tBN15JWCy$PgHRR|A7b!v^n?)@@s%hvT4Wa^lI?BMCn52%dE7|G zQ?F@UvaRdNkx97ICVe6XP?$U(?6$TMCStJDabaZxHWFhWlpHJxgOY;S$WBI6!9hqH z$O!e%GlNhU8wbo_ua!-~0I!|(0r{5JtEZsiirJvnLspy2-8G`9&jy?^X3>}pYH#ra z6XlLnBk0NowFS-{4{TI3f>>Al0TFndy*ixYvlrP-f;)>=ZB%;;&qE&uOML%ZW~%-L zG%lY|=P$4V>!4Y5JZd!HIv0OXLS!I8ZrdS|$4Zb6;9{9hXFfKmY9f^7iU3djn8ckNJ_nP*j4C<=6? zj9=de43p){X_e;fl=SnTNFn5YvVF1;BmfhOYlGPgiIu*`lRy^pQzf-2R34eTpeucx zq_EUo^yohImXPVo+^@dEf{vskf#LLXF)SWKsO*XGOzKp&dt@<90;L^oJrtJDo zgc843S%7xgw)0`s{Cm|K zJog7D2a&0Uwe;;DXu$XCBhC@R^-PuO#tq;I|IM#l=FLOIsI@YZPka@pLEoyzb=(D z?qk$nuTuRn<@HZK%ImMM*I#aeGZHv~KgY}IPvNOZnP*wqQS~5=dnRI-xMmxb<$MsI zm(ayxU9*iVcuP-b))B9}=)#X_9{nEBJ^_Mewo6O4QNfkWM6A0-S2Crb9fbH^Y3(O& zM8Wl-EoU;rEl{KCRVGkM{|KwUPIp{%oy6;|@-l5BU!!T*~IvF0g1b;I% zph-IM3GF|WR*QD^j|c|f#G1J1INRzoJl>3M^^f2#a+_xXsO?UzE{$mR+Qewul7Nuf zH9w`fecO(y`z$qB#GHYCBitP|c9-kr#^2N=6Sl0Qr*Oc@BFAaO_j#tb}J0` z8&1*bv+4upEAS}*ATbni!GEasAnrcJ;~uQ=eQ#B!4h+&g0wE~?U9<~rK8LLj382pN zH3)DOm(;pO1RgWg4mpoQ`~q5k9*W%sBwSGIMNT>u)>wq6rdc}pVNzpp4f|{SN7VL$ z+R1!97^_iv>vSReF{=p>4z&IPPH|mGy2u+_a*?lL8!n>rSY9ux4D>yUk~TaNMslg@ z#Z@#(Q*i_wTdLNLym=$Mu{fD^^6W{k(e#8L>8nySINgCIq`W~r?;7haH7iqx!3Qpm ziq5HBtLZWJSb_a`6(I(Qg5AKYV0}%!q&7m+z^h_QE_z_KWBEac2 zm(+(@)86u?-PrUJ|KLp~^Cqbj>_@o2fk08wp1wq&J*gUJwo3<|U^lAkEoWU;A2R>x zLUy*K?Fgmny}m}M88dh`Wnaii^wi|jnZu{DL@_n>k1~Xo>^$rlZI}280Zi6f#(n-3 z;O*&v*_D1=QH^O>S*9Rq<8t;lH#yp++7*>{^{0C?NXEOYJk+$c#OIPs#tVFH(J@&~ zdg3I8otA$hIZ<#^d?-M!H)Y1y<8@zk6Jo;yq{aI!$fabJPC~?E*<|Vha;9wrr9RWp zLT9e1vta2Oc2!l(`%F^(ImfjKI(k*rz}9-#)aM1@H(rCwK%Q^MHC2T44TkT=~&@MGWeUTJ$N1cgA7T?hud5ASKN7Qg{ zPOhd1`{o?cPQct^1%laTtCmD31#OLR#Wz>fer1UuM_9B>OpkObywoF%ezj-^LEL() zwigMVtfGZgrVtiyVe(1>+NVHgE~4i7ICoFq2=Ny^Cd)sKIYU$ z;P23-*icV8H3r5XvWr?39=p8j*rr8ULPp?%efHK8s&D&-{J=wc=&=72N${=qRLi>4g3Y zPsSzaU&aaJJ?ilMg&;crbi?2XyYw3`2RV{`8V1j-k=i13@OPahpGRt4kc1%6gP}K3 zdym#Z7)~=hS~L7?XIJCM9ff(j)z>RZ`&xj`E-40+&-`tybRj=$Ry_#5@5X|S-w?%V zL#@LxNlOtYQ2lb4FDYI-DVQH;iQhucc8+k`rAzwk7(%%p?(&4da<8X+litm>xc4BV zx0Y<>f5ONUKQt=Hj#O@Z$>83WixagD!R+(iCrC4IGMCvN^hctWQYTxwX7pY6DMh`1 z>iuTgh_VejvYHh)DRap2@c4V7J?#FZZoHWhUZWYGAZ`0mZ>HF*J%o+Pm82zzn`ctp zB&{aHhPw&4s@_B6qU=VNHg-IfZhp+OT7wU_XlM^fPYsgay0!-fzx7F&c!-)y0$)X6 z-DK@`wzw2-$2aP$%D>AqRrz<>pqkbeNpL0!6k70N7)`CFG2E2Z)wFsLj;+!ZFj%@f z>VmlY4xsmgea~0dZVKY}ejjiud2U22+Fnz8T0A$CQfg@$e1u9yAnfhUTH01r3oKXw ziPqK{;BNrHLIbD&T~b@CAzniGy$<`TBMliLj4Z?n(62z5z5PK)T2V)1N4m19ry{6% zU5)uZ-2?bByROy-&F5#oS4*fWUJa%-M<0pGUx}-J^in-73&$>o^WjUcuk9BiHit0< z5JnHXF<{fZjH6qqTB??eBVvbCtySd`P+HiH67y5Fx+t+VRjV(|_gzlasta+Gue4xJ zECEu~K%fdU8Qu?^%et1=$&YBuV%RF>=%zzyyiaKtXT_PNTG;Dx+60v6G!HN3}n-lgqgr z)qbH9I0!(s=l3e1+EadGO%o3oZycz2gXC{Bqpkc#rQ*I>O|(IRxZo4I*;K1zS}#hJ zq%HJN>xZ;p3~T3yG=`E^^pM8nId3yfKgbqs>W;iy%`_mSO`VW!DsbQV==l>7 zUD(n5RQbv+M~V<7w;zWA6{wa}V~f4L}h_OGDyWUz}m zWnZ(SN5L(5kH)m*Jv!Es_Xw#8{1rPw*%HKXz9_TpA4px_N^2y3{Rs_grPUMHi?pO3 z!bY=SyTm5_zE-?0DV^7~B%Rk4sn@kXopFbf`j|cRVOuRu{J>z20j0|{TVPJ-)>vDZ zTRmh`#+O;Gu{m`?qk{D5c<-5~_WJ3v2G&`#4)8cd02OsP#< zB<(5JA1f-DlF~+Jih5@{j%IB%8w&}xLpIHP>Um^iX`>;8gf_$YF8=W`1+~@c3G1mD z22?MGs1l=?$E8E&GAO&MRPu*CQXl`rYuWfSgt;r_Z&j~&%VC^N!P-vkw3)8&{($sb zF*bh16CF8pE5D^3>3 zJ@AT$b-?4|{`wrItv;hHg2q3rB{_X-(NqgejTW@OtriuepECV3^Z;tn`S1O7WNA4 z2O;w<`YLJn24Q`iPsd8N7?c>=NsGcWuNBK8wCND3-ShLF)}kpfOY7?k?X0yETjFtm zWFH7}9?qf9ZQLQRu>Y*F3ZqN7ac~ny@o};nMRKQ!;o6=igUB$*TNK5ebeO&7&Vz&h^ zQfOo^+)jK_n@vYnzeIgY#?w=NW-#F%;5U zbI`+@)`(8`(RPO{xQl}ebPg`iIk@014lZCE^nruR#Flt+U*_@qe`DU?>!}Wk8S{MU zPixDB&|mN2+pjv`PUw7FK;YX%n$%xwPBXh|;XZeN?Nzhqm;17jvmnd|Hewbn^gZ|j z|JB*EkoIP4r(=JQmEh1@c?1}~JsahPzHf&@_y}28&XizGtA#pK7V1n{co$O^Qs%3e z15cYexqZ1WY2(C}cz!o)f{eQFo>zcykR*m9DwCCL=xKBY5e zA!AG|b-W7vhj(7rtQODj_vOh#-{z4ZO<3e>JBG1ik`9XuJI>z2j^Yh_?(Fwgw9+KNgEvp`zgdf{jRW7)nmMeE{52EnL(D!t2g@U1 zX6I{-gzMBi53BLxloUA?$)i@cFe7=A$((#WP8j{X2m%uH;qS~xCc2;XpnimQ zbM0uO#oCzg*=A83C63_d0$3W^3bNQ2m9I?~p>N?^z+!z1xb-m>h6@GS1~?@1EnqR* z0$Kx&N^?^1QZ1K0U95Gc{H5C9kj3SnH*)p47wez*V*T@8eAnl_n3Br07QT7Qv_Y)F z)X%X+FNR2=MWB+(yX|6<-bbGovqip%Z}I!u%R=a-dp_Sw6l(8ORk*Bwyo)L2sy2x3 zY|vtTr5|W3&7QLRe!RSYVZLpvv|*xmAM4JDPtN{rSA3gpNMsyZM>+0IQw%Hec`Uy`_0?^L^;;M?&bedpdee@93X; zNAr0{edy?Rv*+r4`^dWxM(AULFQiD@VhS%l??xyPB&@QF_#+#CZ2tead++$Ditlfn zyV>3JWJ7x2gx(1V2-2>CsJM6TML;?PDT;Ipb`n6OlPGZLNfeY$BFNGSNUsUKcch3A zkY40@&)mD4gpcj>_3P{RJimW(v-eIp=giERGiOe@LgzMO-p!|~n;`RO^ztSLcS%l4 zZ4pd)n}n{aV0Pzl3fSzJWaiQ|rLU(DTD{q^1kS4cw>aL1It`*vM#83WSkFG$;^3im z;2)e(-4}U^%gR3;_dvw`M?NLE3ISOuUM_m}5Sni8JKUKe8co4Oht=k-=a0hWwuE}n zc&Bf5lm%z;gU1Pl(w?o3YJm31R>yECoQ7|6G?Bii9oxWiPt${K;7{8rdOIHTss47y zN)v45&+PS&vjq$7hi)tm=z>XdDk0J0B2)fjv-v+X8}~M%+8So#Mktg*B^%7x)60(t zb*|lksSP*}?sV)CWQh4d+3nCw8_!dzXwd=4)xgMcu%w(m$BX>5+m^HAxB-)`HQ^J3p{>! zJV~3@BH8&KtYq&ajtE+v=jg@#X%a}&dLY15z5`juXj;CbnrYS}N;>K&AE=)}V7(x7 zpO(o^kG+m|lAD&|tYMh`gO+6}>D#uEVgEBS>e_LGjD~L9xQKv|~G%0^);GZog*XwB!tCSZ@kE z3%#61{aW}(cz`QV$Fo8r`sA#mzSJTk<5+3P8+m6PfoSOTSw}C^@ECgaoZ~t3=P`)N zo|Qi`jQVeX#f#>i!%;}3UFQTfJ$X=oOG6R2|GcAU9!97%0YDHnK6CN;;tZHs)-|$5x@{g088vZY!d-}TcP_p^g?o5G%{7jF+Ljq{|1;;~a zj7VonTYhrz5KUrNw_;b9PqYiBn(tpO>#e)va>IcE7abxgj+wq~99JtNB`REs_qGUS z31T>99A8^a(nW%NM`@%Ez655+8$vAby_YcGT4e;BFAL(?E;}lgQND$b(SD9aqCM zQl3j3p=@jPGAvXgsXbWMVEK#l6!c%K#s+E*RF;EKn?Wx`VH+{E%qVM*ZPKY%% zE#Z%UccT~32RlbU(Awl%9EBWA_jS`d>Oy>{Lumq(JcK_80%6oiwE6K%$XA>2^yYc*^NtfjQ44np)QA$z3y6urvxs*~Bt+p?vw18r4Q7NSk-vCQeuQEzS zvcI+wB}ywoS_q*8e#g7Gw9*#Rf_E83NDKAKD3!6p^(>?8hhbAB-FPP=)W=u1973?Z zjLe!GJ}<^S=a8MFKE56!Inzc)0H`S$;R zJT?eLPex+p)XVm9rdeANhIDTqC<9Wj+0Q=pasL+A$NX$uM0KsCl*1hzQZ09Ei)dSw zpGTU)%1SHg3_Yl(v#1eCS?XsTTdA zD<6+xbA|||;@rXwWENLfhCylM!&4a}|4tHk6ATfilnV|A#Cl|jLM)KaWF_TzgxP6j zk`ju7c}WUSM)Y%%5|3m=zBQEg7_^=>#Oj|^L%AVo&Ji`00Fy^otbVyejWFlpT1vVk z9VNMr(gBZ|b--{6=wKb?B|PGvRYI#2NC^?RE{v!POJ6U0V6ViIaHh8veTzhUy%N2| zTW9jK$^^+YGRAqguF_1B@|=yHQ$!T{7WEZ=B|E6Tl8DFD`U>|ZEx0{Lh*do(W9QkD zPPKtjPl6sG?`R-6?Y;if6 zq$-sx`|~1jBblr!(Vjny(SAg-p=RwL&2?;C+_KUxCmutxQH_O_`gAvDc}B&CylG>-zLg`J87I) zS#8{lYWdzGR7s(F$x5gm?@x{avl8p-@PU7WM7g8%jCTKnb>*u1Uy|sv9{<(4qG`R9 zo~EhTI&~iyo7EB`l8RE70Yac(v9AdL#RPtrLNAS zf@yUVrM$16n1Nrj2D(`pKRV`{ss+=|wo0IWBX4VqgK`!_RPpNb$6CSC&K$kT1Jok; zFJ(1VYDMWr>5{yBu|)=F8+%ktQhZ0^jHXIFo#>}{87%HfKPB4NU~wpb8~dzRg!%G~ z_fk2VYuvw(%^B^``2KD-x2}H?Hitmxf9sQ27Nz$BW-cgby@N`6N?$$V%%D<;{r43=zvF4*w%#QFdMu2x1}Wv} z%KJ(HoMZ04kG>E|>h84=Vtbl+=|H_U$N;LIyRALPcIa*Sy4zZrPML$i^~TeoL5c=9 z2X{6OS2{A|Xbplj`2f^`5y~a>({I@+E2VvaO{pEZ4$sLm$}7}(Yqxl3(uWE*jSeLF zMD7il*;M;eW!fJ#ykC;frTT-)ZRo#hI3O2cb5B<^DU@wGVRkl5Q5-y; z$e2`Rt2v)XKuBl|gRQrRK*E6`*F6|)opfCHr%OYWjd-zes4@bAYwcl*S+a0*JTFS> z=7nT&aJ}-z#k@D3rf3*Mj0mLepDU$!nnWIf!rKTF2kj67W`)wa&y{PY^LJ?RaOE2` zD^k-bmG%q;#n-3S4tNS#+9%BOEB6_aDf43^#lm4DjlDI zGX!Fcj8)#H>YAq~4W6iE;r*Xjot5hs_d5MHQ3#b!7bE30-);UD@4*(_f_Z#O0}kiL zQtoPyAh+#SPueh5Nl*9~N>oDy3O@m_gg~Ki^)=Xxr)>?rJ56Z>gU_YYlv*Z_5|nqx z7Vb1n$H~UGKzbZvk9nLR*$SxZ45hwQ;LMnzB%Am#C=&~a_K$ht5Y3+qK^WQn=Dv_Z z?@Uo@W5^N9=xc97mG( z(j|kb|JTZSX_2$lHxTlr7S8^&lo#C)$ue$?*_KXAmnb!*9J;hbY2&x&ink1RrXgd^2z~qNQZRKyK<&9y;rC3( zmMZV#RAVM}KlZ_Qe^8nT{k(p=QgJMn(wK)9_6d2e}E$l(GncYUoW| zw$b>gN4*v0=B&&(bv6bH2v;my$<~t|F9QHL9pxX5h{>pT4xg#HQ}OW{zbOG3pK-41 z=)`u!!^8UUyP9CcQBin!*r4SK4-f07yFHwK4>pgB->4CbwhcWf_-Mv*rDkb&jz!}- z2#GC>jabHgihS&T80d3nxzf>d%UClmz&cX970SzkN{?MsTD(H1()JaCN)1qfsPHD0IiOs|f0Vy4*jnQ~~Q@(e}g zDmF1)65P|JBsE>7w4nvLqRxuk|0Irey&#U^=kb>l$L0RfllrZHnm7@=_$>#7;hm9{#9wmo#VcM!q0B(yC2ZteP`(GtO!#yLJmsuX9M-sw7!w zdtw6Dpc@yz38raV6$keJn))_?=^!|nk8VJRO<5)LHl=|W0i;~hm#Jf$66v#OvS)46 z2bee59M>wHY0ox6)#KZg_kCK(b@cZ9Y3)kIL36h&+^1&cb}=ho+VP)+pSVL1-U#fE zOFm(f|A(_u5Bbk$59Bc=WC0+oj;M^rI3@Lj0|A`k8osiEfpDnoK|CW0W!}YOlhBSk>99q++J7*sDAjrpmjG-NPU_ zt}`=p$!DKZy~2=Oi@Xa_{wD1xVe5u*+GCXT=lhJOn=aszZ|qYBqQ!&z1Rr$lSKhSp z%k{k_icI*^`;|A$E#T=vFE3N#sQUpW{%L0Ui>8I~ z`MbvmYz zBVW_;^#xXf-G^XGZaU;isqe!Uyx!}LO4Eq~g_~7fDiEBZ@(uCm ze?yUxrO2J(uzs6HRguKSeUwIPiD+#^8#GYqrs9LLu7efjqAc~nOSCGRV{!L%6Ux`N zlyy@{z-iDV2UB`&(^Gfy@|(k3QG;I`c#fO%z zzyj`Y+45;H)s40|YP9oRtM&AHQ9CsxJbcnho4==7oO&kG`X#oADDknSD>qzW3p+&% zrL8;l%ISM*Aq?VAzBbyk(PouKQtk!ch$!)~rAxP7Sb4+-%J0&wv~|P=(er?hRwh!z zpM1UGA)@tW5mDlOOBu`(Qony;y#)ekxUcMicWtk&g5y^FpTadmfNGl(Q! zwR9zBD(r8TQ7`k0N>=MEQ7BD z1g+HG2NNmx4WvpxN&}qeTfA>6M?DR5n$b7g3R>4{sAGTT z(_;+k)HaoeK|l)nM&LsHcNHkqHrest1n~~B0^~X3zX<$yUi=q=|E7y_!t_?W^TWH< z;y-S3nHEE@vMIw@Z)xD_ZeWk4B@ySq}7&_fo8kOTmsb78M9qBkq zVFNZIby&IFAi@HRt1QS33!f-&QI!WmT&wp$2oE_AlpcUCfGZ`dJruIE6+z=!14CH2 z$)oY#Kfw3-&(u3L;^^^ zj&?j!qO2+0C-pV@`H>P=mVeT7DL=x0g&CSX^$`20gR(8D+GC{?WV>;X4cX35^g}B> zST8!>tF_RUJP&f7tWi*s`h>A)Up@UEci#!1gjr34Y3zp1+#@aTH>D=F0~;mG>>Wzc zPn2>#vmf9n#@%#+Fn|{j-ySaoiSHMZ*sw79T@v%8EpUu|pu9P8EW;UP;#9^-EJ=)? z%*IR1b!sh2TYhRa*4Q7CwUmkJWR3VevQ}}Eb#IB^N|q=gO9PPcK%_r_MW@K|r<3nB zpcYBjLHhE4Ol}e7!yq?&^OGJcD)sUJI<0At2h&f&F>b041SPAO8PEF>=O%Ay$~H58 zzKf^S6P=?dty_V=zo%^H3|#mN*>$3uEv&q5dARtIh=*dxLf+Bmc!x@ZH*7Cc)z@GXs zPIr4fW&#Jg^=1HGe*#NJ}sr=e^ zT%hx|m0h<6o$^AYB)LR_4}viv#er=<-S%hC2jX?2#UD17c) zu!s#srlCl&dL{AlYyhiZn-|VY@<35&Ed+0)16k8zMZ@s2Um&X?ZKSUQS#4>f^GF~| z_mGy*+rg}%H~^;l>db|H2xg`1gIr+=ip*5xWZ+jDolJfy zEQ&JQ`fv|EHH4*NeIRN;#Ao2hXLp+^_i?5A-g?LqZs492%DA9XB_rrS1VpOjP{wn_ zq=YgqfK@ZbYf>b8hZ=^7=~bPonOP%mk?2Jz`qRUhj23DXPCI%O#<=*^B@z)e@}~B- zQbIU;*ZiFXGtHo06_6V*oW%-Ehq*9463$A+50Y!UCy0J7^_Jb3o<2a)5v;m2gkFtc z+<&f51Z#$V>l%=6k6@MYvmT5}c`8`HNY)P^d=e>^Nqy=Pax#KWM>2k__ljctSiio` zJ>+wXVs-(_2p1@yM6uG+Aj*njA-?Y3XCI*4D3*lYZ$`01-I;C!**=X7p{mh;-r-ZZr-P#vBJP*d*j^T(eH2+-TMsqY@s&(h%fxP7Hem6@QIkm84b9_*hm;5|Au# zLDD4-;O5YXI9Anj@x^$Vr)gRfhpE$=3gTFT=S2#apT)a~c$R>SK=t@z8g+Xx%J~K$2;ow~Hi*v0vuf^m@Ysf7m|?fG(%_7)Uv2&!+n+DS;tmSOW8QrxB@=z!H3~ zT(ik>A}!QG9Q076PXa3^svOd*EaX*=&b7-49A{o-P;X=Wmev3!J1PKZu?PU@e0 zkZNPz0aF@bF?Mi1#u>>=crk+PKU#L+B%k2mSMg)n_fYN#MeH9yHFVxjS@doe%(f46jGMOiP^B+H5(e1Wo5urTu0&} z<~Q!yzUUC2?TIwIEDOYx|Dh~P^c1eNI1UT5>CYorxsU=KGJdsL;DVagVvSOVa?CqH zMWh5bE(US*hzWcxNb*e@5OY76rj!$FqM#g$GEJXDe&ty$dmbX%*EV$k3)TN?YpyGeU&3`{fxoSBa^>mO_7!UxAImqf?QsTtHR1~jd}g5 z3|YVEyQ(O)lnz#9+{)w;q*ost9jdV^Xs=T>v7*OUV?0X8vTAHA7VY5bY`e6NUP)qH zg*7gTtrS|Ip%P^so)t`0o`Ep5qXv7)ybqDU$dSbAkW!Oz?N*zbY_%vmys+%|XzKJc zqVEyZt|qHYEo!kT=;mrI(T%gV=;mQ{ZdwSX`QI`W1=ao@F2S zO+fqzNhh>F#n)uj$Wd4H`+8mWNEA<#GV(ifw}d|Rn3r#MdRe}AnB~lIaExO^5hTR? z9Gi!{tBapwtt|sE`M;tw!Qa4gwLY7Mcw92bd$XFpb6IqOB;xp zL`LsOU*OUvikZ{_>bYt8biV;O))1=Pki`gSrXUK0-#Lhc?O6czYsflcGV2Ojpuj7N~jkVx~3LdMU-DNrIbW)T>>OzKxKFqCo{v(6a( zAeoK8W2%g?%cu1+`%=I>%LQ}i=LO8)7%&&nfVyFxaFD}Xinct@0u!;N&MHQjC9mE#7CoeuvIC=fI|{7O-9*W%Sed1$M`#td-EUFQlAm7@!?Z z*=%Un2E54LG=FK57g0`RD|iFE$SQy?i!*{K5|xsgVS!zx5&WUjsb;K!^c}^%gw>En zXL^OiQkR#Qw^bMVsNYMh@@w7Yr3T7+lsjlm|6IuXK_`e2?&gQW%7%zIY#m*DiHUGG zUN5uy)*&!f-*$vvd71qPo3Vgb0NDWQ{t8=yX%^WWJ9b-n6=m52LusaUAlw?8LnzTG zqd8Xe6FSwLO);m&%j>9r3l>VPYTH5#OhS-5wg@C#^3H|D;|b3YYN#^5cI(AQh_LGo z2>+%GyP-&SVhVxWT%4TrwQzMLQ1Cc#YMtU`g+nGPGPD zaKxh;3*uZ?WBk&fZwuB1Yh+Ig7K3GXSR!d)uV9++0t@p$B0v!bsUs4l#$owxe}R>z z4zCGb+v7FCt$u!uIZ*RBO3cKy+lX$+#5n%v-WGbhB@4ob6XFB($1PbrexAft^H0ck zx~(O1V81+7oF?Ejrwe;MEm2#K+p#qF&L{-vXvMhp{tV@mMnHkDDItd%-Lt!%}<4s@N6w)xspxcni#&R{Uo8W69bQLP~a&!@GmSuKB8x!t@RJ!uU&as?&4 z4o;y_=hs<+>E2};@;W;blDl#@Hs)c_QgF4wCpdtdKTZAGu-@28kGEk}ZLXH~iynW0 z{nbtG4&9bjlNM2@wna)D5hbo8EuZ~*C`>yAP%BZQir&fjSj50ZC&%$bFS+RVF#i|N zOZ;g^UW zMLUw&1a5ng+!Zq4ej48u(!EMsx{B?3l!?+jp!z8L21DRjr~C$HIF`hsZj6U)8B0m^ z3&QBPZmgnZg{M5ul#$hvXJT&LU5KM^bY~6ROYe-B=4q6k{BE#6R&=@!wTEp5?e5No za4mNa(eub2SZ9D|K@ZG`t$DPi2dj%qXQ?L(GhvZM_GIz=bG@Fdj~Sg#MCcvdxvlMq zwF+Ooo)9)xQOuhHfJSe!x4ew|s40}XBsGjOztVguAD>;FQ}k^{3RMgIYi-=k~Owk6Nlev?xZc$L}^esx|ndiQ1Ivv{HYfW^rmQ zyvRRXt*Uc=oEpzF_VFLm9%tlx>^!$&O_(t!q%5>k9`dXqe0^ge`HI(btHJJHOq>Wv zSyq`x2n(fG2Qe>G!Debbh&_j;$?wFo_6NY-b`bOSAI6)2otvCFG`ECv?I8An$u#{W zCG_|<&Zb*iO+U$1pQvV`GZSHD_uJ*S{JeC#t~uV66!$mxEG9*CE& zAM3nyJ(_&U)3%pRe8d()9v}TNgmlfh=VP{q-*sku#`s<5%YzvYJ2+%8Q&C2n!Jeal z6y_!1^{1@+xVEdB!p36?u1#T+d|?-=?}R0zGR|DACWVB$PLei(zgggKBV295iXfG7 z`xmH6r+tk0s;SUO45XwX91MDI2>TX|#tdb<0o2b!Sp|M68u~fo(Y#xH&bmpnoX*b~ z?o&Hb{0O$tj1bZuut!=Ij3cnFu$*Ip+3@ud>@D!QwjG+R;|p}p0Z(a5$x*Ku&j{x zE|F{k{^xWO6$L-MzL)_z{6Mk34mnoy_T%B+o^k{J*|vkKPGu1~mM!VkslS6jxgd)% zjT?z+?15qaekvObglbF!IguA~8hZx_Z6Iy-cEtXk%))$r)Q|UO+Zbv%oi*U7eL9`- zFq=P4XSF=K%9|-Y?`{MI&tT8^OdoHymxxY8{#rico8X{lmAAs2jnDQ)GjOt1>7|)$ z90+n~CVK-S=5rZLWW3)=nUlAN(EJSc8a_VBfbxDJ^~hvx!28x^vU;ZD59lGD#!?D2 zlvq4@sudb7cMsj1ce7XvKDQSqmnuztXR*)q2|l0}9GiS*Gd}?nj5eg|ui&IVo9)AV zHh;^$#Dl&SDud16vQH(`Vu=Qvj|ic*bFctZ8a)Tgc_D3_!zvq+F$K&m+^1vbihcU9 zq3Y1b_b(4jM+9wMYVjk5mED^nO`ogp)63>!J}=9nTXWg3pwOjx>@&Y*SzhvJFL_Ib zC#0Hz^H~{>LGo#`FJZAsLXz3<0hi(vcVHqj%#8n1*LupM-~x(EiWj5h`QMu`RJD=v z0iWPfnZJ_N&*&X%lDw(P0$e#Pr+N#75T^TwR|i3a?@nozYx;@3r5{{yS%V`#PbA$Ra1 zRvR+X4GpE;i&$NOV44fT;Kc&LpZ`Y)-gqbwq)m%iC{R1L*g)+Ufm(pe3jWHfm*6m|(TOE&I7a1xJ}M6jm2nRXp{J8e#qs3QQZ^iO zx!(_rrxafI18WK_pYU>({89?f7%8MhejY|Gm$6Fp`1M|Bw(ms7%4x5 z4!L02--W%VlXZ$)?kNv5WKuW#{aoMXg?F8k4fky!4>yWLQ2r`b(eH~w_`V={ALd*1 zY6fSpZUapeQ774cD@F#jHZC2%R0QT`N}0RC;U6f6or) z>g<5}uVbNRAT^Erwz62C>4m6duM@Lw2Cd%8TG6;%0n_AM7J~_uLG`w=%08KH6zG>+ z))Y8qxpB-tjGLtF^MdgL4EhU@g$TS$+LJVB3rZh~=o(5Ly#8-|bjjki&5S{!g= zEFW-_a9u7d?RT*7%fUiM>vyQ|^&wil92wlpT=?l<$PG`8Ze!|SO?Vz}G_$foPL?Ko<1ZC@_Lo8C@IK+ixnL`4{OGc9=UH2kI zaa<>GdjoHH8@Svi+eSU|to}*>HEi{YCuR7nUV(QEB%tB3$q<3%W9&mPuT{qc z4?BE}Wx!JPgX2O2GW9s9(}_+Wha#jC#hhU8S$kn}{3cPC<~2fT!3p*im|^3SOv9n} z%ag2~bc}vE$(o~Z-BWl8LH`s^cqZ~W&3c*A=Ft16arxehW}aprSrB0A3ln8M+bxs= zYuvCn>zrX--A9eJ=h)C9M~yb;jibg06D6F$@#oX?tUFA@N17<}&5@z>@I0G&BLC&PWQOeP6kldUUN{~0&XFux$W5q&e9djE{e zu^jq}Kh|f+4XfbTyz6HcBBj&WpP~O+5+_fk&R4O18(l^JOQ^$DHp*q-Jl#a8a|6Ta z$-6L(3;2aqa%q$r;eTVE;UZ?HuER5IiLCfd$* zYl)01EI8(Ot_!mCQn=Qrehtdao3}jWk^5-iH7H_^(~s9MLFSV8b(|%aQIqRzfVy5v z^!DecpgF_$KzDT76aT^t0{_kt4getGx1veA-5zi2fgkz-Jfv_z8>aibCJZAi1yHc{ z!~lHou3s?ouVbkq$Y1k^H7hvhOrZWXF;aL2u9hOL~$@_+Q*Y*b9 zow=#MOTEF8Ors@Q!e5@7VTW~6YdUs=wLs;nH(7$;?kRR*5@D6IO@{WP?@gQk3%54+63r43TH)T=2rB<8^YhI`e(7~wjj~j4DTJn4 z)WCorbo4!BAG?2$2lf9IYb}RvObQI6>lU>t9sCui;sWxx#S%@a7Akj(m6ATB=C@e1 zn9M6(jiube74lp=MXW=GL-Za9D#CEO`N%Pi6gg(8^!V`PQ zYyYEyVVEKcVgQ!iW{IWw0IYMDv|AJWb#7$$hlPqBq@x-oRPqm_l6RQhJuG$a;HJ4X zeQ^iGat+JkJ7QR#;GM5AENFb=q(g|w*sSE0fW=(o>60mUL*Hjks5jTSd!l1E&)K)eUMp< zq<2Oh#Yhohp7L%Th7$5D_lWMM%=-ZM)BDg;dC;```Vf}ujDSmTNBPmI`%J+QR(-${ zV^S>uc5hMAl{6SRyk>eoVD-xLHMP5hynmPlwy#!spHVg>3S{;+$ZU~e{JQ&rxGib) zka6Fc?;pbGLZjG6!YFh8Bi6XAzUJ=n!PeJYu1oKGSjVA?y_Bs71wCdV{`x8tWiiM# z9viFdNZ~3Q@R&8m%=`W^dlh5&TC#)$1 zywfI{F~Wq zb4@Cr{&!7k;q;I9P&udS=b;vz{snZytcK8H57n6eHz*4)Y&V~t|2I5Teg6L{3Qz~L z>g`*|v~KC`3^S{OWz8_7m&HTP!Z6GVw;0|ioj@JWy)b@*xfuOoR>hi$v#7;*SdgcD zU+>&(OngeQsI@WOofeR?kYly87Vs(lNVM(y*Z|lD*45XlmWusQ{;e1tLFFf+jL43) z$f|yhjXcF;;uMPZRZZwI;u3NyGgD7lHcws@$+4-RRHd z4Eq$f=q?3z5I=Qg28&c}zk68}5KJZtCI(M1B+8F~C7Jz|5vZeqv z8ISn^DmN~>9so9=l3$?8Ee%@-s@?Ed6)3(v2^8OAY~ouFoB9e`$+4;6AoReday86% z6cDH;P`x0Po3AAYsjXm7GnY~uAy&ukAoWd%d38#vmnF@a5Ud`SP-78kNkPFB7^>pN z-{}ZdpXawYX<=$*$z>Z}@`oZg^0EEFgXE!MAsN-rm6m+SFGBUk-S9F4^}lHn;w;i; zOW9di*-bb1@xgTux7;Q__ycFXS`@}gc@k&wg_LR)5Zw(0B$Q* za{`3ns%wpC!PZY+Luah;7fK^@)n!qtVw$w^_x&9ZbB%Zc9O7d5G&-Lo@5D@JP~KQW}2f7oPF)s&L7dcGgwB>UWoob0J)jgkj;Iu0kX8ka4HNL%fD~ zmhOe{H&}F)>Zx|V_#E}rEeQy8po{TtHw0WjU%ZLSlFIn!&LZ5oH&Dw``{&dEcop}0 zPUT)rRvv3|_O(d*`Z={L1e*M4xT@G|w)P@>eU)3xCvz{C7WGv-mXkLUg878fsQPMa z6g^X44e@oiKlS9K25POCOq0u_O+l={rgII?F<@u33^)uy-^C`ki;i9=?YqfLFNK_fLBP~Nz7 zDwtB5w)CWajW8rX(AY+5AH09qNabDtVKhxvThf@<>+_Vng$^>D{D9C%?E}4FT4Obl zkD+#KWSpOVcWeye$;N6$obL=5G?#JlUyPg{Ufa+jL{m<`alzKoh~ny9)_|T=v zYEQsan7-D4NzY%)0}cg0uU7FFY6bXS1i=d`K0~VLfun7g=T+`docX*8TMnqt5VCji ztTWzJ@qq0GvX4$O)9HRuo;2<1O@E8;5sMU@k@{XK$?m+?Ol@fTiZwt0Fj%jWmoP z4?dGz1(8LjYGUYfvfc#)*B}F|B~uIa-NIy2h$@%WWYm;D`afM=AyI1p53<0drhvM57S=yW{34S<`mbELa=3at(? z&p4Tg)_uDF-oEJXsc#*djfbsi&=vb1#MfMn*ua1I@$ln6`FQWqpM0GB2Ok9<5C5d% z;RmjdBHrhMLFyUF6Swjrw#kGK!L&Nk-48JrJ5s_&kU2DJ`H|Y+uZ4@pLee4GIUv+| z;Ul$-hx7^gex|-?GU2-1D?XIo{7i*XY#n7)_Kl%}&r~lL&;IQ*wc=adT^!Ywt^7}y zyDRpQvD_^>Gd8AhaXV0b(?@nwV`wm49jt~* zE1jkkRiwf!;{J)qxcLLs-x*;ZLUr{m7uB8`e*SR*vReGn5W`~3cE!$H736k~Qd^WX z&DlrVul7XioPEOJB4+?gTZ%-%=qGtr{>{yQ!5vPE0$Ni%QRi!8eQuad?~*ZzQbUGeP~ z*Edc)X*LBdg9xP2fU{~D?sOj%poQRP@)31v(B<;nE)0>rYMXFHFYmuX`2kva7_O$C zQ(GeYksPb>_)Rx_G|o437O31nMVo_@dRt1eY1RFHPPNMSe?#8o61Eh&F?V)^S>(k$ zGY2~>|8}s1{LLbp@V`&;)2hH5LW|Puh?;<4>%!Mw4$`*%8H`g(PQO?j$T64x1t2#M z5Bx_!?mu4~$c-2N1t1S*{xeFBIa?gaM`!;9ARqr4@E4SHE?T0_;0GfptxeCv{PlEb z8S0Wb$3l760<69sM$iXt<&jhUo#xc#p;nHTtpv-}X!lH?aOdJx>Jk&`dr+HiJ0;Q= zYt=^hWu}BG&p@TI7U%bVbmMlPK9u*-Yo5;G>(pR=;F_ANE`%8!z4W8{1|AE3R25$C zo&~`sHmV=|`6SFeRh)F$r~d`geKq;7#+RyYQ%_63Qs8!V7G&6^+tp{R%RC@Inw0fVR{%Lu*kU0Wub+c=E`;JeD8D?ooMc zNGpVzgc~*(+U`*+mgL*Og%a|N@zH!V@zIykAHpJg{2sNu@4YUciSLl0uMFQerL)z3})ak+KMJKWj&5cCy)j>ghM z#nD)B_+LQdo0NaXQ!ni=4kUu@{_pQjL+1Pyt^b^o)Atq!a?HMe0muuF|Iw@s%G*;M z$Xv=f31Rhrb(?=Y{htwX*skI*-rDsq5OQw8UlEdyUsqRp{#wdzE^k5{fUjhD zVubqI8V7TT8)`CC9Tx0UL5ZD%osl=yvEa*eCh$fut^8Hp=l5eS+(k_Ctqa`lbbVA< zC@s3B2EduvhydyGSc7w^u;v)UGe2+IOab@QQuG8xVeSxcTWBmShzZr@Y*n~m1spD0 zl7?3sP> zVyWU)1a*2?@Dzf#c|>sk4XyLEwlAE`WkV4FwkbhtQ39l}DL*^+jM+hAnuF1-Yg zez!}PfFl7IW(=IU1t{}Vz^4cbr~#Qi`1 z3v@h?{f~B@py|2AfgD450owoa?s#j&KcVB4lJ`~@hw;*ye}RxQul+M1_pc}p#G+^`N$$nq=*KURL2~gG5Bu0RMtqI$ggI!;rDRm zE`M0sTWE4c!87kdzN_l%U7AMM6+Pvzj^LI8c(F@=k<`#Pc+yb6I@I`$RUu}%gzujy z3a6CJoLiiXY4iRCGLBvRCuBt8iNDemKAK$|$gAJ}3qTGz@XsdX;jfDWx%HcW0mv;= z|IwCMGA*+>kSSUJ0+5$4{?%|h2Wi?^vuXFI83mn6W9itgKdeG&pA^K-qa7t~fl`&#RPR6Z)h~l*r?-0eyxL9#VIdIvaiE^+A zOWyWN7}?rsK8PL3v##WSp#_^wB8V3^4lB5GEht=%XK2;aBqH?ERM;tUL#)&#ND-Re zPHO<`us!Xxiikee*>NwN%0KrF{Yyp%^nC|yt>@UQal#rl-TOi~jq9k{5;BLE>&0DhO}2qLiQv^=Qukp+ z@*PjqUeE5udC3niMe?>XQqsBZFrc#*5UeN6G0Bhi2FWN0976<-RK1fH&h048IC!mZ z3X_q}ois1cM`(dZ66@PZtKxghT_;?xvjTOvwPt=NE#B8CiUuO}ujnt#_o};2l>YYl z&gdtb_Y*Dp35*ed10tiV)XwPY0;=)2W@b57ueQ@&ElvmTQD@DoNT2cUJ_D$F7eIa! z&G`cIMqRWjo_jCH$=>+!P8UtZ;AFgZFV4?J9rRJENaes}EdWL0lC^Y9uk2*)4Lm}+ zYA;K-sZ&?&J&aRE`*X22tE`8~x43NUq&Ku@xSzHe(FQvX)S^)^cc|8croEvx2zv}@ zfFLZ|vZVny%|$2r;Wu4-L#u1TvqCqG8{)6&rX9m{n9^NK^gsi?8sF7S{XW$E z=yG@Mjo^(Y{Z<<;+k$XDwkOoNht?b5?d+jdwGw8_q^py9YOm{7us*_`In*lG5XHUR zHn3&{CrtlPgNIdL&5LID)IxOVYwB;+{+buJ5xi!8o?_qBz z_CuQ0t62NO>)RfH_OJKSVyw4KAan!D@1a%je6%z{zPB_1Q6aR}Pa!RGP{S?LW%z5B z8x}$O!rNL1&yO7!*9 z#W)N`(R!hx0BocI!?h4jb#8gwps&VFF@bm*a4zUutc$IBZH{z{G^M+zv6MxM>4Pj@*bd19g6i)m}SE=nVEy;JE(F5iy zDeq_#VI6NqCIDLBO{+{DKG#}NuXi;b*Y6>s%ah5ilK@S^>n*ZV*9 zk?8-?NACWq>&FJszQjT+O0+L^qJ>{{5ls|;1A>LKoQsq-Oe;%eKGEI~RJ>G_ih-XB zDqbm0#g(5H!|AGnI5^ zS}Fz8tu~sC)bUs$%SQq87L?TYRxlkIrB!}f>`C>4n!4<0EjY1KeTzY7UVf^O}Jbe$ebLlRYpQ0vpk+sM}viodNC=I>W|Ud zfHD)uXbyN1q{E+l&owBMpLC9;=&>3P%K0UNNpQ_;gRvS9{M2!*)>4qdbD!_T^XfC|1Q?SX#(ph2G(vh{O@5+ zozgTOxYaBpJ7RLsOyQ(di1d;)AU)^1aN#SoBTcIe2MV)1T_Sl~Trk)A6*^6ZTDS9px2c0-={1zF{9buU6AYsI&; zzQKu?DebjqD$%%?&A)5YZk)tjVV}2 zJt(D{Bu|Qdql%cgS4}7s<2Cua=^`x&3{p_d5w*IDJ>GVwS?;JOg)uw09Ds%pXL- z>@;Xhoj0la<;#K2Zqv2#Jk_NMImLonTn={n&eWFj%N+Rx(jD*5&}u>5pM0!aXUh99 z#?#q9Q!CB+R!&#nFz5U%j4q1a|5}?ZY0ivqv_AZ&|7?w$Bjm3&!5m?nXMN|w+1j%v zOSCCyFya@UYZ8-T>s(r@OZ~@;vJsow!9rn6wBzw75wfi)mJkdLw@!OW+t^qNTB?;d z;hAv0d5DwYha}CT4}O3QFpua53{I;IDTxd9c|T|s15W&Cky9-4lEpmbUmNmTrtLI+ z3)9@y1B2=EGVNXdV|`gz0St74m48c@oe(#_rB9dRNHUKOEf>w+S&lh3k6Nz4S!5o4 zvO>EL=Zg1N;@e!BxKbN|N8Bp$tHCOiY)k1m$ZwLf3i!{Rv|4F=;Fhk|>X^pF(l4vE%KRC<20GieA{~1ewO^wJx~HO^7JJYdtrXH?M;E0Q zqGP!dO7s6PFITS7cv@@=@^~eA*9j3xrbS-tV;^@6K#niX=KCFHXf%!#791&pR>NLG zS*xF3daTvrJ-6Nq6P|=))@oIfK9ucGb;l>aJ_QRq_Hp|xA=gWEKqPsr(?aX0a)Msh zNELyRO*91ckD}znqV3{SDe=hzft1-gt)l0hZ}c?EDeE+0h!MXX2_n0+PANUf^145g zifIm0ZYT}7cCmU!L*(!apzkJF8_^qcv{29ew_#rQ#FKLCCxm&)kBnd0?{vbiS$Fhr z$={U3ubsxPaTPwrucf#2Z$Y1w#joSWFRk^laL-|`Cbtar^(TAinr3*^9w3=V!KU!LS@_&lwG359azX?DLWpCdkjpPY7uU)-LU z2a;pUsjo#xQOWrlH&TCVzQ!{Fo|vz71J^JkS8Z|#d?VT|(E4MCwo&}Xf=G(8VlLfZ zpxKN~DAT2J2wx~P4o0pN7p_o8=p0p)!_+;K(Iw2+b$;i2?q>@DiEGd8fAEAKtzW2> zE|Rh0+Ct5pu_9oR7FX?$QYctuaol&MPzcdU=Sc}3ESlzd+A8~pg0zE?A|0lLV9Sda zX%)qG9!6PfqJlFM{Q4zm>vBsmVMa*OoQY`>34BdtD^4emd)To}V zC2|_K%+|Qs;nZv`DiI0x^v+@XE{w9RvdFS0-_j=|)}&m)H%Y zjda9t+$sV4rkuW~BBP#4`DE3TF(BnsX-Yrs@e=h{>U(C4f07`1Qn?CRyag)O6<#FQ zY&OyZQTHgRdNbs>-=~R0Na^(>xJ{;fOBqMM?bE#LFP-0rTV}#Bky~cM1$hB}d)ZCp zP38mvN4*ji0M6t?K2=JTs8@n#f3egnQ4Nm?hp1hTV~9JvUn^&tg#@c-_aevXevKyx z5jm7j?AOYG>&iJeRDII(SU{wwkuDXu$wlosC2Dj4GDj;?>YPF1;My&&6@833RrSM4H1R!#VZNkNI(Ht^k zDP`7CuacKW37w-wH%7I{heuQPW(aD!5io68^Hk~?quTTl#jA}OS*%*>7Hyy@`w+LS zj-~4dk6WzShlKrbYQL~B>T)kFz)NhHwiOZ7pkoMBO8j$6l6U8ZM8Q`*24)9(nDh|* zhZi`RUq!z>B4^R)@__!ROByNf=|E(P5Y}UGiWC=GWzfF0|UwPF8ONpdIT7>oVW`TCj ztUF~)cLON>Ol-LRt|iaETA9+uVToqcb~sEsjT$?P)L7)B*AVZD)G+=1DP8c3fYv>w z&tJpu|7)i7R|o&jls;uzZV+dA5#ro8$SK|xAr7@Vrlp0t)~FXI4%TQO9$2FR=d@>~ zS(JTPu)3gqeu&0>PV0(S(s}Vpey1bimLJh<+%q8mh*sL=6p*~HPQ;{D6MZQ21YB0T zyQbXV@(zHbRna}r5Ri*{2V^vQ+b)IkeJ|*wR?m89Bl5LwcJ4l^g-idxz(hOw-(nJj zP0cK?I;eBnBBSU$=u^G~ID(mWorC)Q|FV(WxJiuMnKN3%|Jx(ytz%-6Ya*esHjJ)b z(0-sV1Dhejza!2_wk? zb@n9nnsyexA6bqwz36nzJ6<&Ks#af`NsF&ya<-zJ;U9-n?!mowTKL-npMcAw5p~ca zZ&{B03?QAcwurZUzuttrh(QI`NF1?uuZV$q9@*@ZD}=+{4<71Wx(;Ygna_p$dqb4* z=F&n5XVvQ(?2tQB%>r!=9ybcK5Ak^W2F_v~Y2poR_#J7(4Q&P1EVUszPVeIP1|IXYO^LXOa$`HHxdhGKjTVo_UwyQH$DzW>;hAEb0c)xVWpg>J&yR?qyZ?V{g?K zfB#IYep!Bxi)sP)xu}+QpWh3e?eAwHj(8a@evsA1JnuMnaHX3MvR*;njT}h}%|(`k z&o9T!oG10-hSBoWF5%S3Aca!0ATj4qBjx4PfcK+8GLs}oED*NrgJ)qp6{L>ndXFHn z7}#byiG>iI49g9sfjX&O4a87tk~~bPT#`4sd{9|kJ3N3M!_SPgjq!ED=r5h*FdsM? zhugtfiqcE3L`kBb*2G;J$SCrvcs#;)zFuPWZwr?tGk1!K7RoS4c0g*?VtoN=488>- zWfF3Hml`A%zgljPm?s8mbak&AV&>N!gotMxHH1={Q5voLz)I74svU4GPKYA2m-M5M z<=o*VWiz6zZIPVjKajOELFWr+(_6uQUgCn&F-&;GA7{zON2(dMRPU~3sHHuCzCjDN zXP(5Je57H3c#Dt3@)g|n;ixx?rjo2e9qiu8zS44G1s(O3x?|>E+RSkg)NZbERpJaR z0FFfr`$^T@>E+=AJhQS9io0KFVxZU-pPOl}pX3D>(}y?T|L$Vytu2cC((GCn&(M!% ziO?#Ad%Gg7Awc;1ON~vl-t`up$EcIP)D{u7u9~y1_kjYf=qy|EfRgp~Y6#KT+&nWk z%JOC(ve;=zJ;|)YN^Jb*3|EZxLG^ISpGF2qDgVLjbRQrC*2OHAo8zCkUGbX#18#@J zUW)>xsk-r~NigghlD5Eept3BqF3r~;3(|e=L%Cf~kEV=5ix*uBlHSwZHCmKZ85+aFAOZ4$eIW&PSDg#HW|8Oo$ORuxcFZ@Ls5RNg2d3?z2K(#@=S{Xoaz zil=wq`~Nli(|whDJo@v|<)YoelHHpJavw6}*Txa2{#6u}l`=2vsA`rj98yu=@` zP|XmjK1;qGA`L~1&(9%Jj&OnMhDz}WZtof@#Tmy7(1VpYMwmdQ(?aJ?6IBA;LrKGC4?#i#)MF|Ql&FuhzkK(kSBG|cCBHXVk@Pn_Y zZE1GNwCiz#zeziFXs%V-#*Wsob*RD{C?)XIY(4YEqy#9KdGc8Q2$u4QBbBwiVT)4zE@*CR+ z)kNku*J)F_wN5kV@CYe}?fuaYj@F`{d#ZQ61xhDf_FIMzTgpR&d)r_r`JDJpbQuvn!X^r<5<6~Y`DPPbz1FK2V0*jU|E1Vcgt*c9i1Z4laZi7SH zth0WUQA6@V)fCDb9u-pD+q)@EJ06LeCpDxXL`Id3Ku(5fBVSIS`9mhy$y(JXk@lWw zZKAWaq^{tpEfOVJxAp|hNR$S%>BEfNRozQllz^qITzHH9tiFvd`nWK@$SDH zrb?dy#AB&aJ9edi>xE!ynkGGuIlPx9%@oRKo(6a$&2GbbzItE*HRBbxvr+1 zpl)dd<-VC}!s()aBB*aF13bbh>Kt-{TJ%3BsKENta2=vwC)JmjjbGnDnre0x%b?01 z8;8-1hEk%xmKqAhzqIP@=Nm}13^Q>c(mp+fz$;Q}=dQ3}K%{WXFq+v=N_XMUxwD}Z z%ECvXe;iaNm~J(an&O)m74=NBIomguJ`mjK%Dm7p)E}2OKYr=uI4o|8HOi#C)d*|v z)l{m7zY7Pqh7v#hZV=_3(;F$%k#7jJa*@QKokd_rDCJq$-$pCn&^0b@?OnqU60jK( zaDpzu=cI+omqp^_$;BOh{)x-gDfdL{5L8gg^`|w>r1$lc^kPX?b3w2of+#IbIR)`oqP^~o-T`2bSudQ{*~TJg0$?+YK5KQvW|3M+6dI9%xw*x zt{Li*HMKJPMYB~v@x|FdZUfy6cN~ev?99+Ir`JKzbZD93J{LukzJJz2!EGSw-J;Ys zQZ3B2dmAaq>q{g+M9O776&)KGY=CyZ4E23Z@id3NH0MH45Up?qdeO-?QdcwDBJ+Tb znzscbE~ELkk4Mw4WevT&y~L%gpFd2rY-^OAmb8_;@%vNyLF`uWuO@oX7W4X-M*W@# z2`r^K&qJITPCK5L+QaBBjyi0oly*{T5<;IeVasKN0fYNbBVq>}UqC?Iz{YX3sGSr7 ztgmk;Md(IEl+0gUQ?Q%7t*{>kkk!~B)alnAOMzp+(Lws#W1-SK3;V=}Gh=CCP1{3b zDNlS^P^4$Z($XURLw$bc&1ipWI#H+(c!f@2viTI(31fGm+#f>h)Y)9khq`r=e057< zH0_59e)AJ-zOae9t`BYnUNZpL)VI`Pes@!MG#LQOD)rq{AXAa7o&)ij(k zdW3~Imvokj*bz9tYgAYa%hcw|?xv-sfqg=gZ+Sw1(fKcjQtc}i2QAK$EdFE1d5Mb! zarM=37F|r1g2?FV25YVxI!_OpLo++KOaIo+?estHAc*Sdcg|QzTEU2Yk1Vz1adkpT z`L!C*Vb)Tl8hDjCp_4o8{?xXc^bY#j*-dK1O})rz9jQmz#_qV{WKsR@kc_fuPi0#VRvP zS3?2&0)(e5+VO(aj6c;;Nj9!pReMTR`FA}X%a+3E#h%g@OdvgLw2hkg!fj_Wt?eZ( z;7v@F)$Z3&8r56Mz~lA3rE;{K-$!C)a}M>9Mx*;~*-}eA(tBEj|N6c|98~{RsRO#=*Yu3N21s)OMvFK{ z18Oo*+K=aHg;Fr}b~qe>SqyDwqoh%im0lTyZZ=Vc!;ygA%0@A6M*Bud@6mzb(mqm$ zU`cqNFT$Non&Ix#f28D1n{uV?PwBWC-OU4b{;^}jP-zcv1I<6}`wBAsm7x;uxYY7> z=>^>;R6opl-A>=WE@@^xJ+1tqS1=t+@vA{A-kxNn-fu`%`K3AU#&03?(Hk75ls6%A zAtyk|Aj=m{f0}OlL;@i$NOk#C$nh(R}S)!%Gq!$>W`nv8&X6;0S z0wjI7#?psN2qxuozwyYlpN7hwPfpeeERJ<`(1NCqk>Hv@jS8geXo$67r=I7evJ^(PG6x zn)`{=ir#()xY$b8anjEq7x8^2b7xY)IRhLT-{ajDP2kI0HUZ0f=)M2F)=sn@rvuEn zwH>v|TqJ!2{a0y`L^ORe=yMZQPL@QrZY!&!c6LUXuMf>lh5=|CJ539mN2f^l84{j& z`>%g_(TNv_3Q%O>@==OoHH0S5kUC+>;@*!6c2>-g;#h})#nMlJtDw<9`H^HkF=pADPPd5{?MRd_FvI zkVqM&lATeML4#p(3fx}CQDLcc=gIYQV!g@*#EOsk42$^_-T4fxC(C(wv4lcznZ-+S zaE_zYrI=`6s?@iF|La1`2ir4ohn;fS-$*mj$PT{I@RdC0gN0JDtFz%S&HmqZ7rG2r zD?M}{C61Y?*q#~7rM&<(aD~*Df$*w6gtEVA0=~CG`UYaa%2y(yY3WMI+vPr7n7J&3 z;?|ut({C%KFy_IVH83m;Y8+Ob3NlLIr*&O2%8qm;sASp~X2@kL-xLha4rRERV2{Mz zM^y1|UrN0N$yx6!X(glLGhajTl}S_IFo)98LB4*}^&614%eMzufbhO{EQC$pyCLNJ zt+Y@#4e|K5YW3C4@ur;4BVlTFN;$5F2-5CnK57=;X*q4f?kdg}QFa|0qU>(1VPse> z9TZN|vDH#jEZVf%{&q@VBSkn?o~XgR`iT~BefBJH*bWV57OedB{+Ucux(s_{f-1Sl~ z_N=IVwv9GSwHV0uz4ScWq~*TX?DWR>U`$zb^LuFlK1w!7%`yGs8>A@HF*7!unaaBk z4t54_lziAeiTgofaS+N6KsYkB_wQ|oK8c66L!VUMYE~bb)~{z>O8rs#LO07vhkuk< zZMT?BU^Q73*e}mc>Lw{XWZeUOttwR-RPl%40qc4wK2|)ScQ#20#&_Q}Tgz$XCTRY! zuYUqNnHEf`4Xkz=@RJm3S};>@EjN`+{jwUUao$h3(QTr$KS|w?4K-u4^cg=&yigno zw!OQXIp6QFMQROSCj+vtlqOBH(c&#ql+PneNc*-xtQ$-P&i=u4XN%-xW(#M+z1wfA z6l=$Vxiq03Z%h>KJV4KGmC`^QuWyAAzKP~-#Szb8qmx^uIxaA&Y=JqLYHyP=3@4(I z&`{VZMbqSMk_B(f+J@`#G^*Gp)wgV4#U=$1QSP{@6)qG%NkPY!E4JE74M-*ow)SKUU#!2bZ#fu&pPtng>KeT$6eSEn`q)L zF4h=C2Z!2MT(pOm<`%?@yXfLB=~G?BHY(Z;{*~q2uv;<%32jFwOME^CZeJqcY+<`=r=pmpeDteLM;kgU^d!BcX@qo6iL8^`3nI zbr@CbgVqD|`m;0;`35Kd3_{7I(uI)IJAL+fELrwTmdH#o{mIJ*q{&^FL=`G(`fP%? z7Ks6klQVn2q%d~mn2t;nnSN#??fXUA#5YmU3!tfALEt!En+Jz^n>4W;vIFjcsx#v^ zsfX+Q${vt{^XtYR@d4z2C)SsCAHdz|Q>r{5MS>eS{SQh3f^P3>iajJPfdXd7A&J2H z^G;h4=rqM#kEZUZ7DO8kOS1)3&3d+WsIS58i)ft*!-TjA*Z3poQl<2%-geq^1d4!3 ze|d?2>cunTW4Q9+Xlrz9eRuP+`I5%_SD* za5>H2+!VDFroxEkdl%U|C!RA?_fygtV07cv0Mz{M?C(uIPeaoKj`u|mdvS6q!d;s5 z51^B$B`-dSdnWPSUr{+1x0&mw*^T#O2P7V+i5wkwqte6glF@u*zn-Zcix2y7&7UH{mVm0@6(NI8#y9kLp7tc1`aulX&s-Xw0Y^ z1zmxfH_(SKL4V;a02Tkm z<;1+dq_1IUtMRvV0W%G{F6jkbK|I-SU}GGjfj7XfzjE%nA@$d3)kMZD2RG|@Tbd3; zl;4)%2uu1qlE~Ncl3BdFAcjv?x`X>zE{(o}$mY>Lzu*P{ok@WRl>3Ot|(%ReZVF08gy@%TxcBuBT@t!21 zNu1WC)_o}n-yGVv*R*f(+P5Y5!QV6K*ZX|&OCN9}+u8@XVPwwK%L@hl%q4Pf!#Dw) ztn6S{yLTdEMAq(NVu|o6(-~|S82v0oTL$?%D+HM-kDM8Lc`ZwmcF!m?gI$i|hmq_jzrgfkS(CgYDDGA>Bkl2%*Xf+) zG{s*|BHiBn@strD=c0XCfczd3v={En7iqXv{z^DZ$$@eNP5U`NoU#MuPDtasB2eyt z6ZCGNTwVBx2JFvIqk;t4i+TjfzD#$%KR+VeY+Y({8zr zPXWhH`z4@$&vh?9C)8(exjK{(Mu>NLXN6; zFj`E}jw?^W5r#gd^H`+=CO7DiF50D4O~uP&U>`V0Uq;9btK|_g!|LFp`4J@*x1)q; z>KO^}z|M~5GdzD0$tQXu60=$igNj^VI6%{mDG3$qj{H={EcJ3pI(B z7n(~;0s-GvIvHL}$b28t{3_p7?gpVlsWPSoo?g;8>5s&|(V)+`@ij`~XKr0*4Wmq0g=6i!+@?rt( zCc1DkpLwsQm-CO5IGG(sE6UN!lsI{q2Sz^!T2H3t4!M~DFm9njGXh&8V{Cr^6~Z(C zXXU{8$IGoj(DP2`CwQPacA7&oFP=lQCthaIl)YpLrKGBIDt6~C%KjZ57?aEMy~t`C zYV~sk>{WqAZ+8{S`DU|?zNjkuz;FNl@A=Jy{nYf2{AVcndD%*1{>V3TiqEJf4*}V& ztR~knEDaF%mx!OR3hlS5$t;idkTVc$npBq?VHd7Hlkc#=7aQyz`{6ev!;))IT#{_{ zKcK~Cfu=B-S(JP>KPrN6OLzHKa8quv*7jvY4LJsAZd8L$?6n$vVk>LN&tgtTpO_O3 zI0r1iQeRVUN8g{z2Y;w3w*h31^MLG9O%7S^c|<|u{=*=n&IufqC(gTpIPHqF@Ouo1 zoe6S`>7Wjq<##H-m>);hTCxwjSpPxROZkl~XS6vntKgD9`PRMiXFjWPjwGg+@*x;p z$oB!~Xn!F;g5xnZQO*Wf1&MMy7w6cM2!{C)Wn9cp*Vsl{lI({?Zk{B^gn?&W`A4|c zUCd|5IeIal(V*X@e3tO~DlPjnzadS&l+P;1UZcuC^J~+{+A_n;o=f?$NDY7GQhp@E zjfu9@mTiVF0#GTW^7+6}3JsQ{$eN6yS5r(fpsU!g1791I%%MAe*$v%p)?^kPP1c~h zMSeSc3`v!vKxC6r z<#l}Dn6bAr)A+tAOp}|Tc71^u?^VxMVfZ?c z&LOha;lxyOjic=YD!qmca_3sU1Mp1}sPrwe(VunXen4&3Gjb2M-cu-W=|CI#{EdzM zC!PV^DSzib;|g30@k8d!x-t{OSJagc2|v?>dcf!9>!8HUroi@3_2fRjtM#6$q`{P4 zT@I&=c5);wyOHmQjkD&)Bjh=|J_o%4a_{lZsCP(w6o16&N-Q=^G zL#2)7hScm9-w^j3aDFuAR(@+?3XN(gKLZ4pHI%a%Fr|XVDIWskLlbZ3hr1}VPb0qe zdvE90qLq#05G;GZoqP_@=k7NjTXyfpe8=Y9$xmY_TSyyj<~O3_cQ_;^jrq>~qPU@4 z+jp@mhzTrcF%{mz`8DQlzCsh5$jxzPZEGSAqA~Y0+|>~F(FXht;yrQ?#JjAi>_nU8 z_wjc@Gx;OXYeaLoDL&>u$d5Ae!;LmR$X8rP+P>!UV6@L@0Zi_V7Qb;p?kV-dFgbJQ zP*BIr3q#pviV}u078;(xkE~wWM`;GfeGfitXAr92H@d+lupz5v}C;9#9>vIjA3-HBkL% zmwBk!$U^s4;db`O*8E3st!?B0aJslQoU~VZ4fVig*~jQ%3>fo4y5lvJQ_s&NcES#M z&_=EW$o5lSTNzcu+5+)l6m9uxRCo^+g&lOht=x;IT82hY_VaR2(D%CMxp)@Uj*Eq_ zw&P@6)Q%79@Eyu2*j+-?T|!Sgb0XVw3U1sU^V~!O+H*Eh)}B*BbHAbNXix3{4!)MA zu#eSrr2`+MX-Byx6aUUoW~N+|rgQ`&n?*}HLYiJoaREa^*eYD^$UFDz#5-@^NoEDK zF2L((!cBy@w(*arwViMb!@tDJMk?+M>Y756tRO2NT5kneP3x>3YJo#>sCAZ~ac$JW zfkWBB=F1sh$4u;@Su`n=k1YggV{^eJIcO-OfXkU2fY>ZPyX8Sc*@=3SA-Fch+0X>n z=`7hn?QKA5lq9!iyyA{)-R+#>rKWvtzo7{w9;39prjmo*d4p_1)TzTSq(cmw^_>_Xoqzq)q+h z`TD+a`^?Ekm4%V7$V}m5Ejn$dK`-?6_|%kM?PT}%6K(uv+?O`~x`;a(b}PRBTpaa0 z)YYGcqzv{iDR@thN=&0(m2-7pe?wPZm6=A+@fzPFg-d(0yK?1eXu)#74-KciugQx{ zx7G(+S=4&7fY6e8e^(W}Y3=}djgaN+K2Wa3mZB)hWTWCiawJ>LzX#c=q)7l2R1fdh zeW;-Ipg`(6SbmX(K^;s@p%Fvm1{600Yw_?wU-#cWx$wN(hk zEU4#Y#(n6V9^Q&8>rM;xWnOgR(mN4c`&m8-z8}EDw2?T$m^SwEDBO?P{=7XJTNxc! zE`;ir`}a>RkS%^Y7FxtuarbIuzXI@%4o#!c`I zPodnNZCi}c!g--khF$n?+V{z`wvrahqXd>CL%zj+PixV@?)+q&oXAKyaEB$!8S@_4 z7j82dlo=4G`__kGpKsB}AIhmA zJe_g^oV7Pka@5x?HQ=wWC((%yp%L3isncf9f z_8Bts9ye2Z4p`Qp8FCx|m@mHUECZ|3 zh?&sMK>a^cW{N~#R=3DrJf(|2S&C(rm>6l6uX(}WzF1atbAF?DisdxJB|-ErUeP21 zU~nI5?)ZMRSbmcS6g#%U&G<^&&}KFK#Xzp9VYhi#1ThK(ay^W{%juR~PInO`e`Knj zC1(QJ79{gJS&XeB7Tuuq+#8V?g+=&g@KL7E0(X^Y?<`1BnUwkw*AuqG2S5#{<7<&@ zdDKVpe&Kh@nl0BbtY8_sa!dhGv(J_TJ#}urpDlap-0YeyvpP2}{g+lS5ra)a9<2Dda=9~4-YSvOVDJ*65d;frE)30U0y1;L(RcPFtWT8 zLYd2CFZ~d)F_oQeY^SN;;0`f*8JNTYIG ze(!|DkG}S-;-}D(?>M$Pua*V*$2lSxZU*V@STZYwqJ$Cm6dVM_xu5>P6kJUw&zke^60LO=@Vv`(7b2i9`;-Kt} z49CSk@L_)Yfe$+DNB*tTCXW8goA^{uRw3(=BO$*2Vma69Sciz^RI~whgx!53O|)yB z>`m|dB=^=JIaQ^k@>x4Xr8_@yP+~W8m2J*u9CWA*x0#dO%FXgLU7-)P+yWl6k6zmX zx;sP5w#bVOvjy=_%K9@bltv$4YNlaZAv4UQPqxaVJX@&QHrZ2Jv%@yIHcCWZcIjK( z*OvdXhqPo%?oH%YCE?|#@1hDmcfP;05|I|M!Zj$}*d`~sH&)HZN#GT2Mw<#o;=5OxSjWXWN_oq=&?LsJdpM2L; z`HaqQ3@Q>J!3;IcY*h^o9ZH;Y>d*32c4vtFRYvq(rnAKX`IG=B{rE%ja|Y&!LVY5; zC(wt7+G^c2pjw8@GW4yKzi@m&6h?rS!@?fn1x?)h>w7wV499O4S&l=8 zKjRWTb6oyWhsQUM%j<=^PUi{Srl51Vc@l<_fwZh#ejAI0Opo784t0vBa24bB&Ke$j zr;*m3ll^JjY1tmcq_7KuIKdgo#4uPl5ukrwfuGB1Io$WySO^;s^TbPI9rVX(xtY&V zgP5Q}?o(2}DqgVHuEh^;9elBuE#kFx&_^v-lP4{tl>56J#(_yBaotHoe*F$Xn}Kjq z1A&F#9Q<8Qs+lX+*80%YvOtDr&S4T~;p!+BeuHt6SucQm5lF7_ z2acTXVyY%=Pr)~4VN9bULrMs(_(NvZguKOcN5#L%Rvz?cLnH_OxXP5 z*SsW*SgR`r_eWrWNZipbk2YM8FS^{y zpL4nPe|Hf)=z`AnY`UAM$cUM^FAG9H*g>JeZ7t~Hc#ChDAuudp<$P>n?I(7 zm#}BMuvA-i^1aNjy~0=l@lN8eXc&lweJ+DNb-|Spu27kW`}@I@zAUtjE!3Ur$enHL zIn7a?XWQD4^tKn0zVJjoT!hY4YDAzqd+GTGVFn8v=BaR{8UD~ay?RqYJ(N`4`$e8V zoxdV~rrY{}rdHtEu^L6ggb3{1z)>v_V0RT$49KEs*#3l297_c{?u_Y$$ZD73;;w1kF&7yWy^S zl=8Ri#c3l={BB7kBU}o6%PY7(ZhYJu4p)ZtznHBrx?R{^fotq!txlz)5uXl~%sr z#ZEEzT#RLzApZDa3@(!0sLMU@^p9!UJ-N2=^c@3p2)qXs!+jF&%TYeNK48gSdmu#F ziz-%q!RPLnH#XRSr=L^T`?93_66MUh;HtF#K6t81RtNMnm+!j<`s(38H6HMRvLAQ` zDtf>N+V=nhed-wqYM*oOuz_Xg?w9s92{wOFtx!(a@H%y-Oe&^a>pQ zCs@S&Rm6!OXs$@L^h%O$p@GsXaE*LTulVV9>ImtqkV;Xn7|nYRYVio7IozeQ_BHk9tr^ue+hBZOJ(H ze6s>9!q*6?-ONg&Hygmg2B6Z_Gi?;=rC5y@Z=+l4dEPh7f=+J!taTD=Y!@E+gjxg3 z_K-0ZdI8{#6-Kd|xOI)dx59?qdxCudFwd|BP;zPGj@U@^p|chaSD?4zrmhUK4)Y77 zQQk@+c5dF$OJQWUD4h_4*w3Q$f>6MHzzEuJ3pmBm`H&sdA8yO!ZTFhue|Bvo0*U(SxA&VK#7Ozp-bfRxE{L0WLPsW(VR2C zBRAtqf)~&8El}G1>o_tIKT{Z>G*15dYKRzQWuAnt*cctlMy`1Ux);z(oKzVn27r&A z3s4*^4Ys%pJ3hv$_?Ty1jT7zoCC#chgbzvzuudUCz_Ux=CeFc|A^3eCdt;InM2gpE zTa{$6;H_4WeI|JaDhVD={1A8^<8$#=)i~PwVTGT!r~DI*3REJZkYVm&;1d&PScx^CI;-UscU;_Nqf}eDiADu0ZSd>HpjVNX_v?NZpP#qJh)7BX4U&l} zJFc)%>#D*2WDQY#g%7Ck{r++0olAKO3YuUi?iYe{B91<{6?i zMc?Z}lvtlz`(s3wSzIsrcz*OEU8vF!ErhnOqM}nMR`8bt4lPqf< zVvmY(duVsKl8Cj+8`jz8H_p@MD1Ip$7-)+`6OV(dK?_!gC8s~|fsoDbTWFiWaq3ic zdM8486*##Rf%W?Qn1g4fADnf>PKl99?YhI=HU!TOgRg1Y5DT$7L?mQDu8~UGS$_vSZ>9Lvm zQr2g$@)WO_Xd>N+Qmp1bSHy{-*pmLyAd=;`V#O3rB(O~A=D;lgDvnX+>yE%X|6S#M+7Jth+^~ZZ_g#B%pT ztfc;*$ix0PdAQJ);ueWPAMq)4vGFhin0bbH=U0jlLL@&HlTuoW*AyA`d_Zj)_+gMFWa0P>Ub|2K@*nOpl z4}A>1CYPJF7Zc^J)gFlv-LCl4@aiB+H&UlnSHkW24sU)1c6ov`3oQ707urxA8}#_H zK#u1#)fFBJyEX?q=~lFl&$t!*2WI*y2~5`GyvePhJcFgkx)mL(_p%Nrak}0X=ia&; z)+Y!UDMMG&$pl*xy?wp`^X`MpABI;oso%t;elXL*kLvWI&X>;yQRXK#{At5VnuWWT$&jdmp{VTR&RmWpF=DPk!Sl#aRui0eAu7HJ<76hF$XrC1C<2oT>Z zU+&(D3Q7=CwXc@)h6mwDp6FtCe1}o5M2_&B$jcAuS>On-Tvz9Dgd1H5*IWCSr2kr7 zKtL)cR;sI)NK>1uRv#C(v88mhuQ`0FGhc7$WxjtKyAx>c^Lj%Ej^};nbq}${2jbW= zc*u@-8gQyVTmbxZ>VuIDkgiRw@u_JtSEP5BL(YtGhaZ9(XD0 zIR%dY$x081S;iD4*Kg-|#;{pf_p0%GXl#m-1O}*o^!^DE${>E`X*LbbcBg=$_NU7! z5a2LJ9^_p;Rf#ivjC&7N9L=&*cB)bn8W9r(Uaw}Oxv5GhK>9jWVZqRAhUi= z)-)wTU$!6jRVg1gEsMcI9n+LN9_}q5-210A2xet;DNRW*u{RLry|MvB@6>c0)I1dH zIVwoU8oB*8D)M(67)Nd{zR52d0(F`Y{a z4pbFdAi&-3Luq|x_|f`$%4eQnZcWlDQyV;0(t$D3%VYss-LdnJ2|G=&rySM%n0IzY zH9r>7T{P3ozBzs{v2VC`hS8n|N>#S^nj)$>_d=h4&vyM#n&7i6`&MN%wec-4c4Vd> z1ZiRG(Z**w6i{|iO$0%Z*`Hc8QVxQ29KBx;bEY*`?g?09947s}gs|cwm>T1xK$DM` z>x#lmNV!dw$HU&rn_@*>VQ;zCSuav{P-8!u(o9*UJ2;8jHplVw5h{!JX^(vG&6Q?8 zxBoDT4aN0NlAp;_3ChhA8;%t8=CB+O~8ILx8i^G>Z4=KbR6W3bb>R!T0^9wwAD zt!xI9g@0@17ycckO!dAty4_m&5JN_kh+ZZbEk0?3I~hD0+9P)z)Ro*9@BT*#Q}e?TrY)XV8k^on zT8VWBXw36Uny}Eh@_A(#Gji2xuWaN5i)h%Xw&IQ)fyo_}EKFuhM@-E{mJb7e5Qb2b zI(AZ4O9_@d)6FGrb0##co9F)ySJ7^m3-v%nM|d zQcou5r8zH13Jh9VbZ=XYXlIzBcpG(_y-JwXI_2WBf2Y%foweq%b^V3 z+g*vrFW1-yf>yP#_R^*ec&L3-%Dg=hna6|r`_TLzie&EPC-{gfPtdI%N`DNS^MVo$ zD8{^?+|=oN#Ty`X)T>3G_Ez5E-#S?9#p-=ohOsZ|*{N?IWf6+C`eZBb<6}lP?p*sQ z$2%sP0ybML&ZF5%vCc3r28Zm87nSO$IHYug&FQZfmCtc=p8XQG^JMzrCFM8hc|Lj> zIGs(KUsjrijEvX&X|=43u2jOoR+a4ilsfPNYS&MRs=CwTDWthiLyFhrvnt@SP9x5B zFPe7vxe#5!XEeW`l8$kH?gxCS00c1dVHV~!`Q*JGpM22(rC!rax61&~#zk7A$h`uvK}TR5Lk?0nrVk79&v@EqtI7>C2*TtPb(BPAJtFq-3$X z*6=|}cWj>hgRps46c5J#lby+f6@w5vGTz4zOeR4WjLqZ>2*1rHYIA^phZZLB#I=UsX6rn9F++$CpD1n)KtYoGb+?KN8;FbS{F>G+7x#z< zhhxO%Shpd${C2P=7i&3xMm1jXpqzcVJk!CnB4o}}+Sg=@pY}+nZXS`YUE9Uar#N^u zwc&Y?9JxTz)6$b7{sDpRbdjqY*_ z0oT#0i?J)m{CvJkHsmWUbhBe9U6&qAAwwaxPNo(^l_X&$4H&9?2)=iJDE850N`GDH zfQ29Z`oC-^&X2SLV;Vnds*V4&T}_N1J+Y^nX{3iemHfuTJ!R7hkUh$aP=E|9hvvTl zX5wN*wBijV&ez3!fcy;z6lQHMzoB@W|N0afFktrn8;Zkx`DTb1fiE@QR8s2=7k_kV zIiCjT)7X#2RhNwMpN(%SQIIE(zX^G3Sn*rXbEs7BEhX9f=WMo3wwCPMnheQe%Luj&YfTWU1|_a;b{ z;JjyP-3TShh?0Pa&O1Ir8I7bWz1~)yhdikBEvFnAQ!+7|W>HD5aJwU&eq@N`14Q)d@RRg;#d) zX0OI0^{6Yw*0c*jwaGMEN%Ccb2-XUAw4b1juQd$zKdHG=uo0|=?V!)WD2V8I=1^$-iL;%7|r(r1jq0%-q$B>GG+eLqI2jc;ctXN*#n0t=LC z_;yzNtwRC7lFTkpqVVv%*5oLfU?ibXNfDfsR;WZWsiR||Qo{i;<)RD!E`^#=yreBO zPzFJT?$g=`)_i55l4#J|@&u@L3J!M3uf}MLXJCGdhJb=3nxsv165q9-20I zq!)h4r?M4Y!>GwSiq&PE_2_vFnyixagr3K(b}(7{7u#>z4O*J6ca+9vmw>|6<6%~} ze#e!7%cI}PI=K+FJl&!RE1ksJYB8BE!HrA0tnR1d7wFeEY=70q!zprpc_rEi%`_A} zWt(#zsxCONoT?vcDmi3XWnGgf=3N|@NVhlmRi?HWLDr+k*nPUsySS3?qLc3`f9bYv zr{CUFO2Gk!jemr<>OI)v{GB#VRpOE!(L9Q-NP$Np%iOvrxGX?VmN!|kJ$Bl`2;=6h zOf{piW($&yI*hKp%5}@a2TGj?t?1N4cB^x1N-R`3zFx5T?lpuk0#9GOk2A}S(mm`8 z5`=Jt|KIG3o6SZ};Bt;DbMMnY=2$d&b+DKNVYS#pQ znq8WJt*=spiT{Ggyop>`aAghg$Xt4lsQgs)xx`)w3p#fuU&vNEjf5a9aP0!n*Es0g z=?=ye(avS#@FJmhwJ>`51K1S0(6kSLo3gJQA}eI~?FX9T_Ky!Zj$E!gPlJo&h^t6l zoD^EA%ZF|zdvkXlD84gk@}LtV$T0=iJ^v|>9N5uQa6xb%*g7NyU`=ei zqz$<5;WDf-M2Fm*CwX7rHPfmx~oDmlZ2v&AEdW4iO`)n+;sEb>Bvwpo6F3(7PcAgGrPIc+t$taFB>^Y6TtaK7F`0kyEw`}BJhb_?GeB+yJl25>AcP0IT!vz4A-F! zaG);MMki(hM_Y@LfEz6B@=WlPhiKdYO{9V>?!}P8-Dqr9{D>6(a`9tQ_|u?$8pf2F%*SEXPLd0QWog}~sSSVDfpJ|<`z#BG|m z#4N!&c>0wO3)Tc}MuZ{TT|Yj;6t~0bxS}3XG|vKZzQw7^EK&1kL2ddFe>+`mPO>&` z1XiGp=X?$Oh$GM~se25nPXPQh1lDv(^B_8LuWQm+1TKIZAkuS+WNdNoM@p0qzG>+z z;6pQbLOnBi%~pb#AgF^+x>&47eQYiXQc=PEmngGKl)rP?Y-Oj;<#ATot52wN##{x- zFA<5?7!{~C&x7I;SvK!)4W(mupYw)hQk)B?@0E)}jm|nHN|~TLx0u%63WyBT%1}X( zj09gdSf+2(nrDAfSgDc^FJVWuYc}V+Qe~mu8;U?b_(VJ4fcv8b>4jv}2YKyt1LsO2?zCCDDNe%5>ci2xFrY zAyl|fDT3zEwumbb=PXj2Ll+L5gUI?pUpeqs90eYI}e>F33Y-KIer7N=`j zr2%SZ=~(ToyNi{0?}iPA_IMGKZFt#v10xgGaRmIRJH+L z-!f%9(|aBYZb&=JAdx~JdMFquJw-O0}pJF>YzpWkvRNS;GbEIto|~ zCb*UoS1UPy?fx(`vzX#`w;FZ?m^D5t*GqGwFug7`MokmIOe?jy)umHu;2JWS%#02RlP$4 zd^8wD)T)D@Da@!rs*PUwQRxRW1+qqdIxU0_{iqZJt+|_&Y4{L+f=(!lI{u^}2-P|H zCuM>Tmo77XU-4RqGi583$G}{dZOTJ6){{2x&$e;N)FtM6bP-060P)ZO{us~pahc_- zfa$>LyhN-F6Kn`jF`2ZWtz!pL|f51qHpUs663MK}VH$@nF_bWe3{5bWH1P=5hE;Z7dN!i$)mH z>EqZRS8nsQjd|0#A#|wWkSm;wYXTI>nz(IITTR)S&p~cZCJnPWuDQ zMaZP>XE>-c&T51GbWWLSSRBHf*C!$fV$gY|IpUO-o>vwlFtO{O$|OPO{QXbHprzuA zuzO_Df{V%lXjMjEVuMl2W#t6E`Cn1G8OQDqgw|!i6=k$(D_f2xl=TzNdAg+3pjs6e z53$%4$}>Pvvy#ew(NKPUS^-2OI;=ve<~0(998I;WOee?Mzz7PhRBZSqu~IpVl`vj~ z1`-vjt}6AI69ahfH6?+TUkBNKewCY54qk;RXCxI~gEC_?Ex3lo{eg~NQ?e0%+3YXn zc_>jfyH2to4_$51PBO;vKKn~)4fV@b=y7hNDyHslCDsT7_qHmOHWMjGoBgevM)!{E z9FC6HH8^(Aof{e)t#k`w5X%}KLY5m`OA0_jY%VPuVshdv@NnB4099M&b)_abf32{47sS^b>1>4H{4W^$;@fK1?m&@wCOg?dt02%?kF;2 zCPjB4!&y+V*5zg8<<52g zz5wm_qgq5C@yJ8r#v5O>-DhRHj~_>nkoev%>-0w)t@KhYwCo;;unV2N2U&$qXdX-f z_m$3g*5^K+jhpNMgY81&wPy$Jb1|me(=)>edi^Ijxdn`K7Cz=li<(^Xlm;Ih;>1&~ zK9I-6h1S#V#UDXa9{_Q~sO*9A9MF0F0sN64+oxl7>UdqRRusE+4f5maRUZ(3ZM`}M z!ogC#IuIY>26Z8L{zilP0X{k!)l^}hbCgkij}-$mnAO2po}p$n|KHao%1dSIa>)g& zJ8116=lgH#a{1A9c^CqRb>Z4Aw`#(@E|KOxHfr{{pS@HCYf;l1#j}3>Igq<1cJ@}; z`joI|*x@2`9^2xrrZeZVTkK)U2eD!-9y%;)I#R017B${{`*W0A!n2VUmFd%O{_o7_ z;R%uaoFcyUg zSS-{iKeYirdfy?@PYtGBeyX^N*?8|~ZLD`P2dfRRzgq;WoLx>2Q62tUbU@U67bg5@!(HW}CgLA>XA-t& zsk`<6Dck(SwIEzP`^3}R)7j>VP?fRG^P$*n$4K+14Yc!ZnPUg58BRrZHQ3{8_>g%& zTs;p{v@CqMdUx%7^}@sW>NN>d!TzWqOsxs*i`!pB{)9}ckv4^?F<6JwVd`XfKjek0 zP4R7cxcWs{uU7FoKfRlwF6SL{>+FySP62ZxGzwTLP`33}2px;SK(pyVgt`hsz*kiG z`6t1&I}&X(>24%oK^mzj6(<~JN2xP}&*|?dwX<3> zMU41eNg##eKD0bqeN#9~)nnAILLQBZQ9p%akt0@p6{RXah*duXwZ+77dgvd=>0x}F z`Z9jI6bGtBrcQ@i)pTDEa`>?%y&@3~oxL0?lf7*5D$+D$Qp>8C`9&I2Rjmd5d{I>$ zY#1eOL5RaiWJ61>2IhBya;ov33#+M1!1$A^tA+SjQC*#7K6Ts#T}UtLR6}jXOy84h zsLj#a&Kl~oh}^Q)RGSDtQHPp9brB7ysiqoMTg2T|77h;ZWlc5AfS5&inun_p32TCV zY^R0^YLsr=cIuL#zG!p?i@11-Q$G!%{R!9>$Pk{OHh19heiwadCS$~<{-UkF1&87< zcxA+=p){zL8j4rO)dCPs+E7bn=Ai?W7V)W_uGdl%P&XwyKs%>PNc0C3GxF-G(_VtgRl$>G@tV zI{%C|B?A|k-4@D~lws9bD6r@fe27weMcyjxdW(WLqqa0m^lj{#MhULSqYCeyw8>Ir~&tN{lxvLOetPeXMGGF9zqsCEO-Nob_bgtWZAkvcx)+HJs<)vpa!JufHOlULSHoi!oLNp<-$adcTiJ?kRLpaZY6{Ri^2Ps0 zcV3rAKU6%Axbu4L9&1CfG#vT=5B+&>wNT&DZ3!q5&ey_r{4hi9g*{x6p|&`%8A)X~eVI z8|$A{i#0cDWGZ0^eg-`UraF<#(d-_Tw0_v^kJehVJx5UdA*GFK)h$KNxHe!=qi9weG`~+L+F&d^ z)wNZd@?YDko$%|_wwUF817;aS8!v%oF1N+oeDn_BSskBOhii}rQ|TXfk)GsvP!6s} zaDjZeds|lWEr>F@qZ0Rv?bHJ76@)VspSl@V++Gd#tGH@ng_^5CtI3SO9n>&Cjdfe0 z+kgs*ggcQoI@VqdNBUsQEWi+UVh zt(-kNsuwgj!O5$2@$_1zI+d#g#WlKE!v;aq1}4(;S!xz|08<3g@+>u4_>p#Isf*0- z2@VtD>u9PeD}rW9>PwLQZ%gXqNLW*F6u(lULC?=g_4|KEVvz~c2zBgtpT9(likz=dbulh!(JWbyjTxuf4ZuE>^Fn< zTZ3-uSnXw__Og$=RFn>h-Hvrrha29Bh4Lxz%qdWLcZd_Ew2*ydI?KDOZ3JOH)p|jF zTaPRoloxf2x#-_B(E1l}GR~vQ7t}=E)<Z^$4SBH)|Paaco#U=ir`dKc?LLwU_#w zOF*;2<_Q6fg+4++tKD0DZj7ezeC!97&w>>`Y=Fv8ynR#cqb@$Q=C!q-tMPu&JW6ZO zP5a37v}>!iW2V*(E6}c?`wzw4gs$|4RG_DRebj0CQKBAx(G!BnFI!E+Y27>0(8$WG*J>`UZPA08D-8-|1!C^<*%fgaw^0bkKmMGj6tJ*D;qx4lS1`>H+h zZEs(koCqg-5f8Uh=8NhY_U$F!vi(bHV?2ECC3U_Dz9L4^R#JA%h~;hZG9=dR)c0kz ziSFnpRPwU=s_Fe2XaK#kbu8ll`#~Z?-8c5JkY4DgMwosx;ODRs$7&1s;naR=7sEy& z-hy;pT@mxqPYu@w2&cdop`1+Vul5BeDe8~;oS=jK`CPB}SKk2zj(A0luw=SD0+B6h z@ZZqAuU4XH?<*?vP&o1m_|E~B^*WB16rm=ss$rlOfRde>w5uPTqg{e1MbILDfV@BG+NAi9d|!Cvc&ymqn)pVa^bJ-a0EMTZ>XQ@A%=b5JMc?%w#f?o=Gz4A(<2)K!Ai^14pGwNr1D@L26V~P$XbM zk&+-C1cJaqT8Ky$AyN4bQWF#f5lHA#6B{5kG${i2v-deO3FYh0_r34)+_g;JNRX=N_ypC({0|F-CBgGQh+}}qJjxb_NvRa#0w3S|ab zO^$~d0gXVMfCxl_&-?^4V(@iICq%j@$y$7qti~W@%Y%k(<=^9$tjlfFxoqyr@sT+$v}f~ zn=ep!feYRyuVDriZW>~uB~#@Z?u+(?S##*esd6v z7MSh*fsJa;l*7F*?nKLW(K2$ zZov3*yf8~{WN_a-H3Y*lCkL8MI&H~;0RJuhkt5r2Fe2@k()XtZQS@xt(|G&*%9^uf zgDK051RkjcYMr$CST>2VbW@^zM4qt|K_~NLxfURX^dOdhHH02oF0B(_NVn|kuC=Fy z_j_oj{7UdbNGjLtY)GB9#L~r#NeC4WKIKRC=E#12gQ(ve z`E5fM73Dt@P1bsSJ5tsp`F*1Uvj6%o!n|Nlld8bGF=rc9oh;Wd&))`EnV+fCWVswD zFD<9Y{o^+Jd*ej)7#wTBT?eWF8D26DYwHUUliync@@d$m0j;UjFTjrmWM4-KT0oIn zQr$ww8a^c`=E`f`?}Q-tBDXva<-C0W%DBZ4>xXdE;?-oI zCs(bmodR>UizVAdia%ROq!%i=i>|V^4oL_CtSv>|jAg2sEaIy;AuJueFF(0sWu0uC(Njjn(L z+$Rd{X!o6<%k!bpZYAp{*y^`XH~#S*&G4AUWT`2yYyhzSLnVB7naNO*qT8pv!=TQ5_a%aE}&RHyv z;t5|%CxS+Z%Q`bF5yvHrTD6!Ft~>8|n`{q@pa)1+Uu@}iF7B{FK3 z0roUkzT^$8I;{a~1m$*Z97g6mc}|dC%m)@otzbup^&x$cCpU%{-3(tydc!2-B^Ad=zwOlk5Sn}{C)J+)2TDyl&lnwA$3u@e=TaZXjNs5ZW+_Irq@ltr|5UD? z#GBi2-zXi8;kY$+jWW#x23lf;geU+>%m_qJkGO*H)MauVLB&yx3XZ|ib{X`%@9FJj zSn2#V2~;%tiVi-Lzf7KDo^8Uf)p!F)p1T3*X^sIHMN2=2 zH)qIlIT0#oBEmniLuvhTxu;KeC-x9118#XFD$T5rTbd3UrCR)%rnGd0%yXt{Q%MRA z{B0}b7qnL*QA@EuQfE*cuU55q7t zqzo?%11P9PZP&=%La!}$f0BaBi|O+<8U>9iDDc+e$U%YBn6g&MRsFQc7mM9yJ#3Vk z(C4ev|=E*M7I=QWw z)1nH_nzK%>Q!5jp+?7`*c%n!%!E(MDx5CL+h(Imqb1gXPG58J-X@|Jm3J=c?Dw=gG z#24k=#ZMCFDr&u6ZZBTExzdZ*gPAgO)4E0*!u|PcChl^+=6f2p?_`Mm(YIhm9^Wlu z^I>N>OHK3TIQRE3v6<(%WCc4zZ0wzk=L03&r%{ zVE8|gQ)xx!WUKm}qhL?`r>x2hPczSV{y&^hIm7X}LpE`oRw~#i_lNuw@C~F0T-Nyp zHl$)|`;FX;i-cL<$YCKuf;3~RKVgUsc*i*er*-n%liuJ_xE7Z;{`0&ziw;nXOyp^M-zu zKDnKZ{I=mtNu!8uGRO8bQU2QOVCuXLf-!XBy)4u*YMb242*c2kLg<1h4^sp)5dtVa z^1$LRl7kGRa-*@GN7AJt%kx<5WMi8I67 z86{xiT@x6nm~R2~6SEt8$TWIoHyG?LeZO0th!Bksx_S_v&!IoUU6)QLe}op3?#SLF z?=%DzZrX=2PS#Y(M6N+@qF#IDXtx)Us#O#-Gn8`nY6Ed#FEpxrYP1h3KEG+7%urJ> zf1g|~WHOSv|v#yQt1qeSjbgNtP!(;j~*Hn(7;4^EonC9=&L zryU$f>8xV?(O-(A2PN{r_89PZ(Htm@f2>niAM1)p^Wt66!(3hOy&>M)5A_BLON0V^ zuS9;`cZ1o9t$gLLc^2QdVr)}R)*CJ6%2~w}n*i&5JeFibMkCZ0dGMz5qSC#bHc#cQPE2c?sd6 zM_HmPS4UIY~uLSorq%zZKK10<8n>D&wY7Z zz5~u%dxD#+p^Kc9$Kz5u1(rn%lTYJO0JWc%7eVFEI3vdaWe_LS$JfGW$r;%7)9BkX z@Is8AS1K<@<10$B!C((4liR?Opp?lR7IRsdEJ{`68rlay>UdBl|A~9f|AON-ox1-j zPr_B!TPQ4e`B#XTONsp^KabD{pjhS%bqAdOZ}3*9QH|f_*4X5Vb4z}Ug3>tpcdTQe zYyK{O4C9FOhrC!*@DXySEBO4|F%;SY2$KIX_w`DxViHcnP==TxFV+U^c8tHuF|i{@?Uv2=j#d@=O*{xc=_p9Vs{1^OG@ZjI95YG`UGe6>pLp~AiZ^e+EAzCe2ig-c_v970dPsl%Dc7gF_b?l2l=Zhf z96Xb4$SpgTfN}M_FR#GQ`S;~-@GQKr*dWhjHny?&@h`C zm{=F+C)p;p9(Sa;v;O$Vac8x$w70r5yLWyL>@GfbKWXU_4F3xeCo|sfsW^WSVuq{8;-(q+Gc%A6Rr0FeG|#wm+^qerM|4X3A`PqkLD>~ zwg9T_dw!yg@BP>a<5XX2?av~O<9w-)KYJUJREa;!fF#wxiXlmJIfZCc^$j zDXn1vsus&O;hEA{{>;2M@knHx=ulsA<#;cSJ!dekT|u!sn?}ZIoI73%r{SruPL z3Eri9@hl55)}s=@RJ}M_C@SnEuu;Z?MoQUu9=6?TjH{lAll4%L;B-1N!I4^>bus|N z*>59D2W<0zjjRz2o3Z!Y6U<9X#3od@k;VApt2Ccr>_Zx536<{}T{TpP29(5YJ)Nm% zfSuhcI4Cq0|3H4 zqBa}k^FyhJl;wCwfG_dDm+6}VU{7P=bh9=K zGu$S>B*rmJknTnq_1G|4lEi!JywrSCNXXb08zX;Pu*mefVy#Fu1d}|Lf}#| z8|1BFK!8gC|4`QOdMxd)!??kDf4?xqSEt~SdUZuBUR2UAEC{vJn9bV-Rfs^|oHdAU z&#ucFi(Y-{?A5n*8Ao3^TbEV!c9Fk)Kl#^V^`mZ^oyluDv@lA-2?5Lo_t)j7&BEyN zH0DKP>tQW-r!)0fGjt=s)eU~o^iF2u@ll%0_>OARhy%Sm5jD6HsUf^whzV&NIEa(F zA%#6BNQFyIn*jIvf>fSxRzd2|x2S!6mS`A9nf3KCju2x!uYnliNNtEy8;HS)a?zGR zS=vuksc$kH>8*hw@bN{krar#W)UBa-EXGB4g16m8sNF?AkBNw-jLh&LU$dkM&ISa? zmD1&gSi^m2b|dz_=!?VIm(a#6K5>NP%HYxkSe=D9FC9Gwg-OMitH<}eQSqko{%aI#` zDWVzcD0=ygvzJ4gvG|Y?&eW_*DPsHbXjL<8cH`)HGkw;8Z2cttbYVd=PqU!Cfs6K7 zys}{>nsu~mkX7DX(A>BZ&6=@^(_GksNqDj;<;Cp^rO1{n3|GxG(w}e1QU&QK&!sWj z+?Im$7TSorjJ$k;XkSZC`n*;;<*lgb))}Nh%w*ntDTtA8j@6y2Ar$e^rk`4g^&In` z>cL{5$uE_mI#_PW4rD@7QYubP?Ek5ZOT0U~H0 z%q?yW6yDY>6gzBQYqkj6SKeQ!oOo5e)_}5_nE->6)}S@kM4-3JGGr0BqD5D%u@zXY zPMr+;k`qSL!a+vU#z&x3`QK3-dMkfWh(I*UX%xMi$#6!n_HexI0>8wlZ`=JcS>wez!#xu-^2aR4m z_yz}ji+!hQ1tfL_Wu81up{&%$PPrXw2V=m79eRV~aus)|jZA4r^0Q1axbNQr?+{IY zj=o?|_6u%@+T?aaTyF)z92=8QBzYFpoy`N505tu3p~9XWZ8mPcDF zJ92QVB{yX$zcr~H3rcgjbez2Wk6tm$Q(ZbP&jLI*G_xHGEZt7GIxy7RbJXp~Y8Z^AH7UK&3e>eOa&yYE)d+K|X+&MT(_L!P)il zRyL=zl9o1|;sPc^9wx=ksRKDDRcF#gEOPp6E_yzri68O+C zj5AFnT#w>3)ZL*dBMq`+e zMu4x^CmHo77z=TZlU2Z4=}ukng0E|!_*UQ-FW^l79+4lysi3kbAO40L7XA{*whL7uT5VTZTu%*# zI^TeHfI|%lpYwOVfiEO8)aHuu)?frc0K(*T52H&ecH$_CW^kS)zc@IIy7Xck``ZG+ z4^lApG;HU?da*i9d^qV%Ibd8;m1pBje5O75Oyk#<_!Zx^97YdG6BGFy15At#_hK;? zNUb9A;2ti#&;KDppz)3{GAu`x;ifOJkWOd-`xLertubxW^N=)90$%&ih){Wp)5{5q zxJBO>JtPgAz$l$RU>8{n^Iu>wZobxh+VldmTaK-Y6>#KbFR<7|1lC)eX4^;F&}2)a zwDrSqsS(Jo)tl9={UjQ}lbF^RJ%Ole_-wwN_8%B*rq#WnfTz)>-YlZpNW3mq<3aH{ z=Q_{?P~cSJ|8X>IRD0wR^c!BaenP^oO*wCt)}Vd;7)Oju;@loe*ZQ$Y zvo9tm*E2V#W3(aEjfdUU>Cf7Y^-aZOV!PJ@YK{CHLR>BQU*mp$Qgn#qdScP>5WZNP zf6|QuB~_&3S=H@kt0~UtXQ~316Wm9zW8rQecW-Ij=eAe_-*8uM;a{-jF54f7Jq8U| ztPGP7rEc|S)es1vV-+|>0^F#HQk8k%H(3lD$HKOt{7XuIreWuS`)T2;M3F)2$0MRzZatyGguvPl#b!$qQvk7 zN;+r~*x2?rn#WV&*1?{@CDk0Xm{BUvfc`&{d|qTRa6(!jD?=t1+~Z4WFJkfX1F;#W z-bSb58wb$17g+}|P;)98bfKrGR_BE)54B!m+zr-JJ6>OSNpMIjG7KLaL^HH2NXOhB zIdV+TIM5)9xd<`$%1bN>Aq24BQ;J_38*RFFJ(Qk*nFafaJ<%dfJgrrJc=KfjrzBL zwFlF!K7FXzUZX12e}$dZ>wr?st8B2?Fjp9)dk4L+VU}dF_zJvL*MOTf6F_J1z=OL+ z%1lN?`kB|E7sQN=^l@{yj-!Bi-I2lnN<$x1yt?cGp)~n5#*@YJUt_#Pp#LDvqBcm# z`X1W&tsl;~D!p`&P^B~8V%(HJY_L$lQr=8L-r4s_Hk$GK6>i>%eVfe{v`#ilr>}6s z#l+VIt@@ec3`PQpLf_}KZeDJ3(Hd?qV`cvDb+dIU5nU^c(U z;`On1+<%j)h9?Go`TvIoe!~AJ2c9tS<7o4H>^s9X%6gxTcfa+S37S;QD3%OUY}zQ6 zD*57!^O2ak)viE9dmI{@sUKh62Sqsl)3#7lhuv)MJ*67OY zyx1HM?<@NoMJayHTNO;1?|c$QGrF>#0iuQ;FE56(g4fV9132BsMwV_Y98bq~6E?(F z-Pki==&Ww6IX*UbgZkNvvJZx$q9>VTTI$~2kB@OKEgJhThl08m9)t?DX6MT^Et@^> zoP(3uteuybA)f94eI=U()41iKLDX{`TWDB7SI4pTrX>imgbNGhsJeg1QoOXX#)b%( zA(0BudESqCIsZ!;>w}`Y~m=#8a6Idt?2X`nTd0tIybaevLO3e;ygqn13M%3p!Q;Ufh zjkMfsa}Ah0-kZn*O#6{qN~eR7ptZh>r-e?IP4j?nv+QX204nqh3#4k3*zdwDv(G3k z-pu#1kjX+&Z9ds)uB?K1jz9L%i<32TroU!T0`=SkX00F`)xlh)Yq56S0Ehf*O9Z@5XT3mBUQ#O?<!sjqcD7L-@7)Yl;&i@w$nef8AjXU<;tKNi-&nw2`4HAmc9 z%USl=>ZyU!a*-?NW@@Og3dS6t;YU~Jz~0y^xA0H`9E4Wi#+|72WCsfkSQ#2f?>4;a zM`P!*t$fAT9oFD^%u?)`)giQW9vcJnfB)ePI3G*H8;mx7=Y=qxXt2-F2EqKIXkr<{ z28K7VVV!2@b?-&9-fd8Wmd$71qY+V}YPC-jKwUhS2Ju-rC*w0Nr^KyuhJA($G$X)M5SbW-}R+Q-@5ol zw$XLPQ-)T#t~7_X(@eqb>j2@VlpFnmXzM3kLj3huZJxLwHM4dHXlF~DF;o8Xq^QM$ z4Qnih0}CmUiCBYBA|O0F!3I$UYzaGsP0l};@lZ*Y%UW6X?=ebdm;e^!LgM;?PUf;s-gEv!?eLah z-vy^BWhunyrKk@GkLP5{UMhSzL6lLuW3Z>2ba^o%O!4%IrK|y-_RnJ-AAj0jOEUyO zvw(W-W?gD@S_51`xfKPmzsO_5Kw!+L;x(bU1-5!%(9BQSQXE+U%UDxbV>>N_@$fVa zU&i{2iH#(~`3zeEH>g#|$dvySEv7RX-+%ony3$E>@F(*7jD?AZqNrfT@@TS0RrmGR z_Yd4(9ZnFy@T+s89&z~OebWy06F*~K;!#8#@2_ub#NQXh-*GuwpFe+G9lGp%qjO$_ zLx|6dNQiMBfBtlJZWlAzm&3r^o$4(Y&N{|FPCG^~XX^|?Mqg);W`4~LFilnp8C^Fv zJ}#p})s?P5*pB?1#nQr+%+EBA+xybPPr=^z!Y)oW))AGbcZ;R@pR=yMCQV7le7J)> zlbeS0q^Om<_(or_O33c%tI`0GxR!-^3UfEtyymSI=0XoD7>aTzrxQ_H+rBm)=kwmH zooLHyv2UUBL-y?uDrToWsNSLhNH37%t<Rh3Fa!N4Fqa@$_dO{EBYGz)V}upLi80m1plS4z7{D| z3^1CKLdoi0wGsW9FqjW7^cqx?ulYeBMXnQjb@;-7xd^Fiy$%5mD1#QkGe;0IwT=m6 zETr3L9}zz9%pBRej`8~LdcdGlvHVB-D~wK@8mIkLFAa}JHEZ>g_E(Dr{m%UlY3p_S z>&&ld)_V4W#c44tUk{7T18SGghT`Kt{G&TnFF>%w8A>Z)!!hg$H0#2(u-rDotD=K9 z3WQ;*B)UNmg?-7oV=P|(k~NEmVaRpD3Ja1&(oICdbaB`pb|R^!w~bEwr3P}lD<2Z8 z2Iek|r9HsfHK}MFvyT-Bl-7Zg4&MGR2S*%{&cUgz5%Z6OBix)~)U>MI9(v3MZTX7T z5>6Tn*2S-MlR%-9pI`i%#Wx$_vf*~_~1LIM4*&CRIQ?$V&{eZ_uvj@3Z z7t-ksY!FV}Ml{SaxE{^AH^{@Y!ooB4KVtbW{|{V-Qz+#y63a^)LTTtaV|EJd-OQ$Y zAKB<3HIvH!;JebxTZFV-vV52Bap%T@HEU?a7M2{vw;ERn^&1Q{Ra_zs?FvL-vA!j{cq1WmA zSB&D+6?6-|UhSzeqvVeLt(rlY=(iT>t7i2Tx?jZlo7T8V=DF#BczS0Ci{f+@g`Z2% zNh0a{?x-x<(dtc^)^i@IE+3+kMgDPd>veyf{OhUhSWUlWExFt9-EUca{<-E`mgpP~ z9})H8+)qmXIK%f7y+q}|d}SrK2kMu)Ci%bZCx{Xe8xRP|`L1GQO1?u-PZ~w-#BtsW zVS0ZAQ{iq~FOs(x1<+f&kf~gFs9#@7Tasv@ZyeZeD#!mcv`o40g#RylK3A9dD&=7}Qkl88Fc#j7&|F`lR>&5g8W;cgrrJpcQQ;gmJK zi61T7!#*)?JWXZMrts>!P9sz*D=X`7cxn;(Bz<>)rx3I-aM3c$*1~{{2x-d!8vPRl zlDm)rQE6vsjix5Le>gD7Q)K)LV{G=?exW9bC+o-V2o9zE66Q&@_cE*BkuQx9iW*lz zbhxzdOX|3n)id68r+|-Z*l20Zrb)DEuQ>Koej1=RfFy`yzu5~cLU!YocRyM{(fhQ= zN{+D*@;}FtDx?uwuurIu$!7+^{&Jal(AEQiR<|Dxn5g(bU;_EyNvmo{gZOYhu${-T?7-3I-$vZnlMv zcL+#=N5=i{|3IiZ!y>K1OAjSN(BTe+zT`M-<5{7}k0}wh0FLueUdEFA$B%Opqh|&+ z53=1T=@%A9cT2Q^KvFm#h?yr?5<*4%FI^j?Xty>{%8` zxd*gIgZZPWbm@SYvVu#{o_!87KmUWd6%QTG)gQWliCI8^7`pU>LPf=D;V=67AZrF@ zx{Mz&70nOn#79!zfxsv}oPJw>(K^6~bK@^mexAi!qr`x@1_7|%=*GM&=tb935i^rr zFer%f4|2{sj7h#r0}hL~BE0Wt;0xq&guQGm*4VyU>0@la_^=U*VDl=R3*0p>_~bAR z`-9c=D#op%8?z}rp{YdnqoVhDV`2HrPiblizH~6)@n_E;q@~AM6tz6dJSsQP^{k-C zO&f>4^_yBKzk1U^x_W{62Wqmon^ftAXSzet^*zTLi^Gr)Ubr79TyQKvEYeCmJMWnG z##!ecePi)4G03sUi*;%j9(#gX(x2UbFwo*x>GekFvPJt@8=84u7wWH`W8uLwFF(=3 zw9DGt2OJ9Y@U5WVh^*DhJg==ME>{Z*Z7fWiyrs39)}jZe1=k0xY;2>dXP71U;3;k1_(9>Rt(ZNh=+qe&6|A|!A8iXj z{e0IMb4Cn$9-0Z+bx5P8@=;TGh&S=bm}b|(z+6rO4V_B`4bFA$LBmT~@*`Z5aTw>r zx23G1J>1C|;BfJo+k?vowX|3u; zJ!+FHbh<^b;sqk%NgRTg%GjXFd@${N7mYO z(!}+Q1D;VqaOeoSxcs-_Tb?KiM{yU=5Pk~5R~)m4jW;d|rko#*RcZa{u|8CM+0&iw z|IQj3&*|sN?SFr+oco7!g`cW^e{9vVxA|UkZY$Z(VqH{v=#jG|f*%Y2vmh2#)Oxd~0}eyelcT*uJbT>9uDOL$}mo+jgoC;cbh7V@|_z^2?b z(u|9me20U-a(ADQ^df_&FMfhACNJiE@d#J?Ulu1|@5{PS7p_U9XRjMw5^33WqmW2l z=S1ZfYv%;Sx`tqhNKK=xU@KN{?Le*8bm0oo|J~73EuiwOGvuUY&tk$Cfw^<-O^-y1EMs&ai7(G#Z__BRSwFe!%_1G zG&pKJ;Dn>z2-}$sN8MD|96j{%nm$59O@ffzhUg5{oiiP3X_*+NZ=4A2&XVi5_s`4sHyOP7{+(X9A0{0$5 zQW!ZmM2Ue_AiLY|L32AQ;fCV5FDX3hp&I2??HDw7lfv_Es%sa2D?F;Gra`ICnFP5Z zX$TV@Zcu^@-_S(-iWKv23`%p;`DkQ;aONj(qvCBGe@1Y>RX39&2h`dF1CT`B?zu-q zW#L-H(&+;)ga&CmzpE!@w;mWYPf>h)oPxq_H>qxJKnX8)xXGyaxS!n~VqHdijLI`0 zGg%ABjdxR4a{^PiojAx3aUVwKf&nSzZc2iuXr2?1n`iMgAZ(8#5Is&w1F`mWO7aJX zh0)U71{P1va9YKBo3e(++8i@Y%2J+voorV20LxZ-%LMIqyVBPD+18RO)+5y4q6|Zp zWr;;8hR3SjY5(U9OB|Oylmt0`lXV!PIDcqiAI55jbqil*d*f-S=tXWL2`zbuJvV6o4gk}3F zTrdov^zE;}Tpi4L*OB6{H2?qGxPMa~0yie3{|CpNFzz$RGeqH-s@Z8@AmUS%)3a%ZrD$k zBb5<`cXCJLj0>gFQDCZJ^i`Cyvl=SWYh3A!UbaZO=?~(9&afVov+mWZw5h6KwZE$> zJNO32olum&bd}jl-&!~lSJ}K@ZT2U37K_vRE%vzFf^D@8Vry}y)-j3~l0Q4eD8Cqg zI?a6*dMMjZn#fS_&82Xf^`q6()2xA)Sx->5T?sRb|M#Sv|1=7Ad~H`68;n~{)5TaN zk=u7e;*^U>aCVDVzKZILsQ)TjxH3NMT8U9!6IsIhIGP4sj#oUi_IgmshN?m2pP&R9 zPefDlZ@({M3_j`XeWIWG#hz4fgFF!c)r&)>?yndB1#knN^(n zz$ob6DVm~dD`w|ghNV6TC;LV>Q~k&Ge3OnBtL^!cNn-|=zQFIM^j&>JX;y6op}4tc zlH)OT1+^8P%^Hv-IO2;P2g4A!3y{eqCEk40Uu=Z2EkB8)Z<4TA{Z2cR6a^cTHwBa@ zgi^O1=bMtfwvQha-nv%D^g2qm0hqjg^_1E=4r&^5S8#%N#s_dvJJ-WTwuIiVhj*sY zqL6w#Y}$>i)w1D6ZU`yVmaLpId`j1nmHv>N-L)<_3m$mrnk^5W8Iqy^^BV`^Gm0~Z zP3K)Ngs!EJQ^Ox09%p=uK0G>DAu3B~GLaab*y+6h!@g!TFKdxdAM30;r4)P=MD~Rl z?xZfNX3O;-7-8^65Q?_4I3=g+V?$4)JN3mxKG#4Q%dzadAcmF&Rl`YtvVqbYyL;1y zN&&nf|0xGqhIKoU4c5$4=jc^3mazp*mKYqT>o z&2!!WIh3AhqEv^MdQcOkCa|(TZlcrx5cg*MXuT8-GIZ_3g7kb!S)B}fWk9rvJew+U zrq4V9T$eI-co03)RHR0W-N-r zi(g7r8e#wRg4;Z|jS@m%r79dQFtRmv;T?{qtreRAzTYlw6b=`$u#NI1$m=R8Re5>Y zA(9ehI)pOKlwpR$cB!PqVh7tHDfP{_ISxV!`J^ea6#0x&z}1XlM;8YBp@5nO^bgfW zW55LG(u{moiH?3;5EBxYE)pVcV00CDZbc48dz+bM%g7}eBVgBpc^)CTR9B7S>o3h3bzlzY-I z%HWL>dD{94EEHHFS|55~SPH99%(F^F)yKQ4ATxbGbP>Jp)xev7BRp}58E=Nm8s^}}}&vc~@uvU&buj_VK>R_QAqe7qI2<_~y9OvqL z)&ubRz#b5C=TJcpr4jBpK_!C$0{pOtlE~NgNy=Ml4x-eaN`LoXZ<(z7=+mCqgNo^g zo=P0hsQ&D!yl&V{Ojf3G7{xNmi0o#gJ2F%%gvBytu;?7XUVXI!LC((QGp%zatfF(j zaZDnBHbTW9A4T!xv-EovDr-?ai0UXfIi^uFMM*YHa|~9LCR`i-R8?x#h4OG-N2YN` zEnpMSw1+I7_Nb{3NG289@m*D^)9e-L&nF+z^at^Xra<5krvkByH^i0e0lgF(67syH z3smGkJXj>;<@8cox^#v^y_7B}?C#~NJ0w6&ocgU^OUO-fs>YpOP-0!`#PAouFpLWM zZ%z&P9KX0hc2N|_+FRkNP6K)?vEKPN%~B+i@VulOl&UDm&;J^S-`d__FGfdtEAfrr z2Q-j&`c)d3r}VO-u8B}G>h)20sURna5E2yiqeKT0GN4rDhkdZiy+_OYD0RUMhx#ZS zp5z{7#AEjB_7%MLw{|tWFIEOX+WRVidde;QrXD2D(!L50$9_msA_`MR^uzi}bF}EE zyvj9`!RrE_su7x88sXyxk8SG$Ya3q4&8`=32x{Wg0{@MXLq|f`k(x=Z<|W27L=p&Q(T1&K3lfEveWF{<|x8l846MDm8(V(0+>>Y$etU+9c_ zWQj{>e40_`vFVH{2(06&x&C;Kq0*Ox?wFCc2svIa3*9mDWhKc}><&$_upqFpw@6>- zt`s=Y4POQ}@z(JI@k0>*0pRFOq7(Fz*tjjXJR}aLGWs$w+p%n*^1hJ^ruG?t;;jFg zkY`F)bqaIi@!9iVgQWl%L4%Y{roAXlked@y*APrTgO#?Pnz4Y_63FX-fVd%pl?WQ&T--g*(F*+rJN_X26AW`X>HfYMa5pB?3 z+F=N`-*nnBMA^V!>Z^$(v))wNTJ(2PO53hMbmdLuCA_i6P^AQNdbLbQ8%tN*fiwJL#8OlFNJ+W&2!pX2s0c(@Ii>`G2( z-?%C;?eIu4WZeso4aZADA&r|ugK5e;${MUPlsiqn98Ax@tN2;^wgs+)-HoJ_8Nm<< zAvTNu&3ISg*btw+tHk^L`ddX5$nU?=;dhng_}2#`l!lN0YwHLlBBF0BVr3GI4RyQ< zi!NUC*)AWU)Hbd(P>MA@*wNrUrL6%te(%4pJj2DH^SFh|@ zQaE%jqH?){+vx)(&A1P7DosNWbozld4?@c2z$z(UI7xq*QQ#i1khknMbsGxbZ z8^d4?p@}+=QoOiOVWG|EOM6oOyX7|8F-id#nPbps#l+FN0uCYt>WkjZS~#|hQJR5d!YlspsuGjEc@k-L&xUbWG+NlFTE|MkE(i-!CE>|~`jZWuaQ>5S2bLcXqN5S2_; z;&5fA;=4%W^_!xYf%{ib3w2DAra+MzN-52d@Pt^ePP8;+s)^=LQPyw(sbM=CM8|8= z$aJJ)>r(FIim&6fuQXvQWOkh5uc8oh;Z$WhjLTi7VeO!e(Q}nZXB*tit2H;d;_GPYlc$Ocpo#|9Vh_%W++4W>t@YYLi9#{q;xWp47fNcF$K9x?cALHR5&JuQX|a@&;a)mjn6pK2=?))Pm^IVWDC-FXlBBFz`j# zZR*X2aDaH?*$M|l{%avrn#B~o2=?2>eAVS!f@r`Zz-Rrnvu!vH+1uYr(?3?`{%?SRE4=nfPo9{pO5#;x(ms*10lX$f{)jIaU3d?{=+FiY^YJYuO5rO{xAi!8B%1}Cy0-sb$ewBoB? z51W2ks>mVxJ?+5u7uzk0Sm@jBbxPSYArzPs$m76L0K6bVuiimPiozeNhB-FnDOr3Q zAMnC1RJ2&8bO09p_M#Mtwtr~$q2HG&@4$0VKG_hIn;#r+XiWLHk2XLZ@N}nlhu8en z#x_p*X}nrQl2e-E0sGb4(&=PN!CLl9w6Kfp9f5DGL*6!^|Vm&>S2Dy z^}#f3q8G9_KU2yK-%$qHoxu9TIqZ=R)7;hAHom2w zS1YX$Khbp*fQsv`QR?{d_=$^dQvOHLB7S1&C`f6e*C=7`g{R%DFVTWEN~HJVBPb97 z=zS9eq>RgJgON|4TiP-PLQ&ytI|paJx<+|Uv~)>piNonX^SL4=ejDN}v#i6#x$-0s zd2#P&)RYp?K`x1D-!!8R!?{t|6`auhrjkx#B$;Yn6Dn zUQ#3lJj@HFC2OHr0lO7eo3f=|L6muFx;yRrLJ6S5Yn9N)68`V3#g6(C)%rq-0ph<& zilMyJ{(_8wUntd+oMhbKWH{Y&uoY_ZNUShgin0PGK)vNm>lnsglqkmGMg@JQby&*Z zQ^R!%FDn4(W6HQwSG=TP%e0rM->m%>I*xnjxi2B{XnNg~%OYmm%VD%|Ujys^y|qz` zX6?!dBF9%sJeWOY_&nr=euc&IV6I&X<+AwKLcsq&x(Y@WH{e)YejAi)27qlE915>` z`;kLwhm9j`CXB5Y97=U#nnXp_`vf_vZ&X&JN{*v=6E+V>4$|VV5J#UaN;h7d{vUjB zsT5vVVUB*a@Nsjrqr3=b8HAK7f1=8~Gl=a@nY?4#$r1A@6>(KO_iWd}0-NonBCsFWDY@r+% z#YnA#58LU`P7FJC^0)d1l(ToP{<3@HGv=7on;U>rZeK<^vH!XDa+PqN5ykez=o5;Saf^v*V=KAxX zavLv1C7N6cqUT!-4LDW(0dbcT$;%k3AmE29nj9qUgkTR1%J8)dMx^`)x6V8qiY^%sTLcG~m{9A6WuxmB%0bAMG{ z!S{VuHNsoV&9m9f))GhTZ;HEt=Xk*5jl9OG6I}paUN~?rc&YZW8uzS6q+wB!$%+fZTaEIjJnY1CQe70j*|!r+r1C}H&QEX3sQ^u{?Q^*IfA zhnG6gA*lxFMjTDMkFkdXf+|q64mshtaIXf#BOU_;)#Y;-@>j|KyuuSQa<`q0Kt`b@ zSPk&k!gk}Ozy64plCdwoavth3qpjza81H+3xk*igVJd`*&MQIwJpOhp7SW$4f~9cW z?D;1I_;;z{pV;UCGWjRA)HL$BAXZJ<1%+oNOt_$MkmHbx%E$Ova}nou3GKb8tTcZ1 zIlX&HX~;jTCZ6%I%VG$%I-rZ3CUttoW4 z90RbQVy{7&;>^muQCbX$p3Uba)d4QHVrL=-1lfFbwRzK$h2cV&z8w)H$JQobYY|K) zZCS;?>oZc~sFdzZT(wqrX{M2?o{b)~tPkLQG=)bYCVmKfW!&avHfU5u@s zM)%aQJygQSwmvXQQ*S6W1Zy^;vdhZbboz$E(R&+L8q^Ay(M~so7pN(nzM|CjY$i?x z?yy>TQ?SIDn+nH_Z$T%nDw1bQ@o(;4Tz5;j8?W9HW16asX^X#LzUO_o;G}!{UocpY zpn|`YsP;M>mC>~-ZX5JL(hJ^1igi(>pI?RlxkI96WLUMeuFHhOKb#n*42=DNY+z&}t$*{lZBm>bFf>we7- zVX?bozwM5S%5c&I^Ci;}$9=I*QiUtBM86$#m(mOtp37I1Nb>tz@r0-1Kozl;yfhz( zSZf)f5T{?es=VfPNPCb^`mhb~v0bZ$NYPWL(*HJ1n zw?QEMeVhVmj}kR$SPR2g8E9) zdo(Q453wIZqr82vx?NLDzHab7j-*;{s>ZpOG|qk5O^q=l8yH%W_QPT~wLTcV*iCJV z5(!ryog@UBY84y+1G*4^2^!mUHmTjAS(fc-7v%WTq~0+Y+-R*?MQ{oIYF1ytM<P(EhflDMHV#;(qW*7n(P!jeD77_jvh4BLrv;2&{a&q+57)t57#O!I8$2hyJpZC zcmO`S?4gG7#8wYawWXI+q?lfdx_YW3!TY;C)o#MYolOD$SlKCFYF}iA&Gb^WwEz(* z;6q_U*4F|??!(;j*F#~Tf9RzKVO5ORCHQ|y^Mp#R^^_)5JpAOUaPGnrwMWp4vEFLS zKxZ#z)Y2e5C&9jQt$MKI7jIQDy7z4hcQEDbfFZfNpE}>fuPM*}%^>i{WUZkvoaes& z>S!E2Q*u+z^CBNh{nbx2!I4WAkQu8PN*p(=YBNJ3e_c*3m*6$cMKRWir@pT`#jvV0 zJW%as>Ml(;>Qwx9rXlxq(%@?K{T7?db#VxPsnCrUOCz$Q84iAx2X}22x$?PZ4l0Q+-zd7s$xZE2V)WH z!WpgR7fyk!Bv?&?K=vS5{Rk^$dI%P98XXT&dD&QdDEK{%lu)%Df;*Rls)^w5A41jd zF?ut?R6dAt;c7g@vv%QXZyuPjEL?3{Q`2iY)DJ1Vswx={QtzsQzPzgHVxKMRJ*3&F z*dm0$PSKdt5tJFNMurFgfs0%UE<6eV7a;-eJ3)ETYTM}5p3+Kvlmj%Qg@?3CyjDQQ zm||3pel;;hZ2{?H4VBrkYI^6W)#*Wu3LtXwu&WdCG1IPg!^auB%GJGf+I=lzRXa|k z^#)4!elD2aj#Xbo)XULWwT=4;8vs2hW9Ri?v&q+p#U>=a@GrGDyF|V(oupCrH6{Fo zuf)G0`+ep7U6A}g3V&Z$YPP5Jb;ZN3MM!0F+QxA&PHk!CBYF8KwTf4(yEZUKr8aud zta!13ZPc5x{yRFpsnkYK>6?m&E9me~(CDa{ptf}BM4!@|32Ge#Oe{(OAEwj61hqbA zGD|hJjvl6wU=IS5QJZS&Odjr7QcVrvpXaM#P4A@m>S`^h?Om&@??mnTv80OKAJI%e z$K^&U52=uo1>MB@1D&a^&N8GsGHa+uD(x+iG_4Fl5~FIVA5?5G#08*Cz@$mvKot< zzDQP^gI)H3FE)H1JTFDHaL3t|Z<~jbJw@%$@61k7V|`FpN*_6Iq=&ToC7gapQBR7+ zu|GGjRW$_ZY^ksQ%HOcGp_-4D(;KOKaTU{8TopG~kKk%$6Mp4Tn`*>NXeR#IxVd`H zm>oj)7OG1T@%_2dy!D`WTc}(-I<6BD^6%#UM5Q)*N+&8FcFnyGu3jM?ozxz|LEzsK zT&W!dsGq1_Z!H`N0A=;zwwbRD_S!CYf{(t}d~L)(wQUDNuk-6#?JIrQO05fL(wD8& z?=Tc2Qq?_t+bN|0No_`BTZ^SVrM0?IjOs7+L8>~Qer%&Yi!H}b;&bWfDXEJMLQI?C zCSBudI^BOptrj~%`a|zqf<7>Kx!8dgx#8R2KhvV;)dYI=S=ApZ(uillACqapv+DCG z7kgfR66I4nsP(=66#W-saME+?MBH#ezaf#b6}6@9qU#3fqU+HTMXgV*+lnr9Y%BKd zthVYfbn{wUbq_kQt(^+2dAik3?IY;_*hzoC_JaQFdQ%7##NMeO_KyCa1QNt9?I?&{(@_vx)=~WcqDtRRDubB*btkp1 zFIVL-#L`@0>b~4bCw!rkaQ3_)JWIzdiF+F1KMBGcV9bl3SK}-~C>&?ZP0oykh2FO_ zmTMZd?kwn^&{^#1K3&vq*vu!A)ES%pDMhXBGfA^na;0LD_VdOrVvnDUfb33c7~SZi z4zQf!QH4{SZ4d3LJ}=m4DiwD_LkGL6kxjpS$Q|r)0WE;E1{~RkPH;1`^!dXIa5J;C z&~;_SebXLN^=@iI_!@h66O`t4!@ibIKXp?xP&%q^8aBV|7}}nu)^Uwlt{Ai1Y5JHg zbB@`7bTMWh>th!Cv@x4_Ok>s`)5T;TPZyJYKV3|A$L@lJncc-?&)3@lXdgI}`t(pe z!LOe#24$Om+`x=} z=uwT#+Dwqyf(bJFF+t`UCdjovL5NHV=&R1hjIZen0d_Av*H7FswVygv4BKWW zf$seUf#2xuM?Z}~hfd(o{(``<{na=>u`D(_pPJWMZREA3Vt6k17gTR`c3V*GwN1N$ z>)@LQh$RDS5|mW2WV{M19#79u8)NW`jFjK5RwylKtNK%MAJvOC;~(hTwG8zuto#)( zs_D48{h~S<8$k9;>Sz};7YSzedRcAD<&yN5)oM<#piwWYNvIsZTPH0_@9_ViQT-^0 zb81vSRy_RQ52ZcYBiz1gH}R4mUeX@@IjS*Gt>rwXl!5B|KK#fk1aOr&9!?HatHq6w z_Eo$^v(i*P9qQsb65EYBa z`%wkGnp2-wA&sQbYp+5PhUxTGvBz(HRZQ4n{gqWUHp_ZVu-Vkt1e+ayP4JL?kop{s zwSj}wcZ^)fG1II&XM*Ya>*`GHGIrPIU|RTw>M1s}EI`}dP&rCf{1A05grDLe zY7RbLd{gLCli!4XU`Tg#%fz_}nm!(;CbSd>cNH9jIJZsqYEK;72t#q6)mar^M~NRD z*N3U|oUszCo;cKbu!w%t)7rPxp*Y{8-d1bFt=r*kH3rq`UV9s3vzR8l4Viv1S>91U zm747-ov(QKzw_Cj+9Q?u z>`z+xuA1Uxu+#6VuL%a*=VY+%BgCS=q&FY>*rLzk^2c`@X#NP5AA>)QP-|i*xivyC z(^VstjZU>u^s8zcuX6EjgbW}l;XT1m_uf;R_@+tMD=4Q-rXq;oeZflazpwIYWe?sL zN@M4dm~cdUj#PP`+V>;XEJM1Z{Re6YxWLhGl)8+Irp7Vqe@sKAzp)t{O0rS$7}d%# zjK_eH(i}6!s&5(HvqPkZMnbfHIA86t<0@8r=W$}SXX`;%$i4VC9-DC*=9O*)A6N14 zf1ia9wMQz?!iV~E^w+qG)n4O6wS`Mnno#LIJ!s~KLRFer@w$IQ>!eC;^pqx5JnW*C z{KjjlQsVeZs?r7;GF}}e_~Jjh6@zY$7kn{IZv?hjZR62BB42Zl$g)+GJyne&Wr7+C z<`_CbFvlkoaB6lZ`$TmBW-@!C;Dsd<)h3XOawugoHu;Map_!q8_awmqxsz1x@IW0+ z{=XiJVnQiwGA15K$&=Ma*!<@q`C(S`U>ZGHZICe0j3tJQERh1~&Felo>y^wG-RGjO z!2lx&#a-k+*{oE=4Vri=Zw*>u6nqo-rdAgyY;`jsH%q*AG7 zGh&9?6~>$I@jsUp_As9;f#Ao^gY z8ixPQnW-kD+Qk=-Q^2jmkGcs4z;yulv@0`J9t6Hlf1o0LYQ1xMM$)shK<|4r5Fe;o z>m?P4cLEw>7EEB>$umb-PQIe06TuL$obZUPX*oh>+@QB>&8-(53#a0PtBRRYXQL-+ zxdj~}V5fU$wwN{te>#ln) zt^}OQ{*TpE6dCuMqZab3Ioj1+^&9uB7-<{QCwLi`(z&Vt(&T<(-|eD#-3UrC^TZM^ z)am_~4uPUdZS<6iDju#_!b|39OL*hFN=x_<-Jhqb#!+oax|9||LrC3VNO#1~SDW%v zw9h9vr-xGBCm5ze+WCq4BJad5H(p8vvFi&ebz*lV0(#Kc1)>u_>U22$z5j!Rw5L)V zJ*7Pr4_9>J!2+!lVGApD;uQ5=sMd7987u938fp70HQR$uFBGH|SG4|bw#br7ZS<5% zDju#Nt?wd@v=NIckyhr|vPgC3figRms9*kHw7my-6xG*1o|!GFn{1LzPsr}l0wi># zV+N2akO1=CJ43gipg_P5l2D}+5I87hK~Q?L5CnvvfHZ*!(mP0#Djg~R&%HC71k3y7 zeSgnipNGlJ-hR(H_ndQ2!IHk?^=uNbyWix!(I^IX8f|BTZ$N=Tb9jNgDxZ5A^4GWL zdJaf%KAh+2h_4IhdCJNX!2->bW0_h)IcB2#S4tt3(T81W!51YvA}aw znnEuxgxHlqix%pV(n601g!&v3AY>y)O1DLxOuU{qUUw|=+=t+D!8Z(2+Pz+p9xWEc zGH{8f9UAJi#B&_0Rd1%G8(#SqEnsSu~R3OfLg0P8@{=2?4b$sn9AHmm@8*r>dyd<7_>>hyWtt2Tb@71q8ugIV~+rRa^ zh^fV_;*2(RTqO>c*{eKNzy>{ny?dJ3K^Iqf?3VeG^4LU!7ly^;Mdf)IH-9Pkv`Z{~ z{2kcqP87GsAhl0G__nokQ2RAl_O`TOjprb^@4;)K!W=;n>!9H($WzvVPK5BWt(FWq zr0@5F9T;l(^%k-N!Md92p^T6vD}JL@-+Ss=K8NofLQe&T#X|%cE^M%bUOZ{N(2IN5 zbH-rm22Ub(b|fMl_Un$sRvW-=XHdHhV(&iPAOvq`z7RJ0=8KQ3@`X%$CEvrdY4_NO zg~_0AHhS6sv?dzkvU#g~nj}Tr^)qym5wQs@Y4smO8z27Q8ChbrU72i@*F%BexSdjH zDwgN`(G$vvW~EJ@W72A}Z59kn`OT2)GwAKjp1OtS#d&dFtlf;m3~7)ydn$5ut8I%= z%vRb07Uw7Gw8fKZ>JCofMslztZ}t{Xf-L_edlef`bGc`$r=xs9qCF{rG4#SV&)d>R zv}PNC_ykGYJxTH>GH%+F9C_8Zdj@e*QY9}dhPLnU%&>0N6Om+DEwIem>FE~&MWn%I zo8oE0&nHuDK}N8D?$=@RX1Q(Xu=&rP5}3rw+($UyfA+MOmeHP{Js;uGdY5N`G?4D@ z!sTRJ>bx6g_)Y0AA$5WbwrmVF_Y>JP|o4eN&&gZ!3qn4?3;te@~ zF75+2lfQ;6zhYtWtnn*WVGe!stEVoS$$DJTL1SNfJs4pRz^G(U%6{ldx>LdJw_>R8 zx7E38#KujQsJxv0p3xEvfrAfXFx#o$LC@{DF}9|0hXO?2o6eu7ey1A;ac#Sm z8XxkMf-2{YL!K9v)hl3k$5|T)im%{t!H-*jj}&2ieCB=+i+m9775#b3@Ikn92=~dC z-H0xYOfWUtAnEjBP_=pUsrF${iHf?md87$V>wn^=$@eFOFW;X)F#abEKMd$vNAnNk zN_sIJKI|EaphTUI2#))=Bc8^VVae!->}%&asNqr1Vr=Hsqd1q&Q2a44+il5v%(K}1 znFQmo8|9`%QT<0?kJ9hKoMZfPPYC>$rXR;DgEc>amB`3@>x4(b-F04{li($}yXuBh zkk2mD?NgrTu~{`vW1nYGkJC8n?$M&tVuN>__6)~?mw5*Kh+d;?n4bO5?uUq!C(xUxJvC_DSx*33ntE2Wly}xM3N0zW@q50!N526Bk!QB)d4Y)& z&kI`k>v`xlGbrc+ZX!&y_JT))kus9%ffOPsSW3T7Gr-|DW?k0x5{AcLI zh>ac^?+kDWn<<#jh%k3;FX0q3iV;?vqQJo> z{fZ|Naj6XpF8#{#zuf-?Dk6!VPs>$VUkz0Kx5F+_slr!?TZOH=;;AF9;fAa?!&URi z6h~$#ety zN?eHF@a)D7#9MzrznVeI{{SRjrpJE(4mVQuo4|w3)Z->@>@L%so1S!3IDOMo+FwA` zMn9VK$y`Koy9E@uN3CvwL}XCkTaZ%^&}X+iHO<2$Wixf%oEuG@#{Lli11mo}2cIo| z-i@X>P)z%6PbC2*qf!c?q}6TU;7;mu+f&~$_Y*{w=dlnc-*@tmrhdwaiaWFIGC zA%69C3roUfN6w$n4Q{2?f8q>2L)ZQk1n1p{o~4|Y9HLVXJn>Zdp2tp^kN8;V-A7R1 zz?bR~_BVrGe2l9&zOKjo$kk|hB+Yq@Wi{|};Rzitk3aVOh+%yG#8ciP`lo^?u!-3^ z#m%ZoXQp&u&?-zh#=hh|o+W!9YcxF`O#am77dRp;lvr7GTOcvsZCjaT;!rwI_3wKU zXrs*Dl!qo$B@>#ML#s@zKFZuOF@F2r*vz=G!e}#Vjx%Z>e`HVz3*!pWx)#Pg_J&$m zIY91G3+p3g<|SEK8OZ|tyNNB>STD+I)$ignZEZ`~ZarnOGv1$Zi=ErX7Cw{4DG;vL z0+9@jlg|;mC{zeA%of0e#ZK7(reAoUUT9Y4)0+W|Q{F!U*i~S|sX(ScLJ3g*^rIW+ z=Q^lf5R2nC;A=0&moK~lM~Kn8G%koaah5L&VmT8U;lgS4?;xi2{vErLt%}>Tc2TL+=6eI zMD>DMJpE{6y)DZn82r$-U{;1YhO&NON_U5{QFyR0R@qV@DI?Iow+uii4BK&>!tJaX zl(wp!m5?6gePCxHlK)W|Qy48#!7DIl_lC2Y*x3W&VrN|uVrLsfu;%D_JlK%_&qva% z2*y0(EqLV6V;$_cRp9Dz}fe%dk6PPwC)Eqa=Mw<;mOwx7ZeLQbxa(R~N2 zC=Ussa#5^0e|CvtsbCPtMlptY&%lcD1XB;ASVg?Tt1f&FLbxc=%mIqmA)3{$IN^zm z^V4f|sQY+<)Xmnr<0t5!%M*pyQvg2F;HmwD&(5gs<&~Ta7B!UKH(!E5+`IquZjPoyVB>_$|XnYdegA=Mt3D!vl zXmWQ2TAt&N6kn9pZUB;djX>nWz8gA+=5Z6p5gj0Fku8Q685Be zq7|f?@EpLKpfo`C7S#6Mp9B)R$d(3TS_TI79|MI@1?RV*}5|X{l-GDvLcOZSr!%i>15*w z|CMN2S;iA|9V^Q!h?CnNCwEv1$R-@<=1d*%64E#|cIJ6gukaj8FX?Dek zLp{IbDqIk9(bEckMR0cNn2>-cfAvi%Z{s<|OA@KDszl4J41pkvNmuCgmT_I>% zp8BbZSX&jCBJV=J^bcN(rVlExi}Jh>D(Ep4j;X1vUD!sr&^z2n#+>RlDS+?G6V-ZCjdH^_FP@*gr}Wz@DEb*7{T$o6K9B_!&;+(G~x>#cJ3(XC=`{ z=SrfH+)AvW`yLlUA!=j7HZxxUU%q5L;5%nCZdGDqArB6&%rebK9oR}`6U^5yRb~ow z8>v-TD~^)`ssL0j)5T-d7Ms@ZoZ_iW%48vurSwpnvTlcdX6oY zGV^vm$4c@BuGeJsA*`45hJR?1VggHX9JBX5U zsm-e4tVp3b{gJa{U2XI=kgnFo+76_!Iyh@qQfeL6A%3^y4t&9lfVR%C6nT@(|J^DB zD50?Jb`+CZUWWyt?3y~Pi=1Pngt{OjNGeyCam(XTby-j8G~KGp(jd6>*|I!_YS&|_ zp_{h{B2bSq?qm|YJw4RF9-#Knv1BxRp1!EZQY^E7ci4ZRU+^dR)j#X8ME~UlCRp67 zRH8nMOa2QxYGkL@d0;bKE+p@jSn6G$m5ty%ohs}JYhM%2%LsnCwmwV14cvkHK!~06 zpgwxob5Ia>%IdgLpiQ@#DNQN&c!Ixo!xmr-<hNXfm+@HhW#<-<=?m7&@T{!$Iv9?1Ln5ee$U{UE zZ^YJs9MwOyCWa1Fv_;d=|J)Cvp^ZW6+tS*`ECJx+ugD~wN{lp{l$)#a{%FjCCGOuh zwFz?whrgI6Y%)qOX~JrwvvW;YrqqjSHDzyeBW*C{1C~b9hVone>FR_lR@&Q?J&|PE z+l-Av$K9H=~4?;HT2j~kuL%HUrox-N2z>Efc0#8y`|u1zG}&a zV7xV6WIRe!Bu%Wj>^GnPx)rM|?_NPGS^=L<)8$rdBv#~|)~ufOv_BRw4gvo^LWs!LECqeV>wWE6nr5M{ zSx=Ivd>eo;hSCP0+a1oRNXNZ1+7SYA97)q?>umu182Zc*CRmsrF?u!}hKN$bK491NH0y6>Dd^g>cHLxkXkQ3iT{IN{t z-~)dplU28FhdYf@QvY>jCVK;w656urQ2k`I#UX^`oozvVkO%uuwyR3zL=Hk2%fq(5>#Qf@RV@{VjxIjtqp?#aT!(+@s z3DWIlHaai1J*#VxC%Wh*##&`>S_}Di@CJW-Ib|pRbJabhQ$~L06lEWO-7uBE=42~R z{OsY%QT}Q5Q=iU?O5&3rb^wJg^DmFSg7y;`mW)G&%1-`bR+fvG3wW`YRdVz34Vf8cgxf=v)%wdS zv=geF%rD6H!}4AgKaJcd8rn0B|FnX?n3QYcKOeT6~A;eI$9&%jE+uEFV<1Mc)7>h4p6+}W%iGF2~-}5 zI$QaRRXHr$zRq9#mEUHef#B72BPYHgm~)$%(mMj*Gsxx98junP@hf95grf9USPB2j zUt^gbArIJhR}x^2#F8Rsm=R`{M?FOj75oEeoRPQU73P(~HthAY7nr~TOa)2@@9;{$ zl$P4ZI1w9FcaW4ts`Q<_*ddq6!dZxp6E8Nm&yd=Iv+#2K6gI?XMNc7d($=`^Lt z0rua?{5mVkPZ&6tC!eZEyGv&l8-mlr7L@*{i$o8 zIT2LtP4*2UzaPKW1!|Btq1f=!@VD3jJUaDevt+MC*{#|~Q~h`Sk=nZt`wTzi_hFx! zy-3bPUEcP`LEM*pQ!!Nte;i~a{=faIqFkZ1b%cJ;?-zU?o|1zqQpf;S z(-eXeO&X}W;wnB}*Qm5 zgrkyEQK3ikb$V+UwfabXiJJBT>mz!KqaD3iWSCy1rWo0ZAx0(__-`l_HU`e z+pI-izkVQh_;#^B|CWbuKTA>i?4Igq#gaVRyI=pchoFm38x-GT5` zEZy?OF_)bv|2>?lYv>fd1f#HVk7p+7>uyn0D*Q|YC8nJUAnkpK!m#Xp^g|>KeV;{J zKHnFM+OysVi?k+horL z`MVR;@*`-U_Ru>Y3AVG!5QL=ZeXEy$puZk)*A9RCOlu3cw@vaV#~@a2y6KWsow|L< zs>us1)a|VyP4hYrX00p;|GH!Zj^@wl{0P<-%tf7#*_(LG|Co*DhfEdf8b!@UvIge) zA-Ji4Zdv$oaIG@!8OaJg-~$wkPpNF1I*M7LST-cdXH+Z;`O>FY_SbRae^e}sEbv^h z+-DTi70W9R%F1f`Y82!50=-9LWwFx}$1oRn?*3*BQ*qFRjb*|aL8!$=IugClcF+yk zrfxeGi%fnjG~-ppNQ(PR?kItJ&N<)c!}QUkYN1-3j*n%+C;IN#VuM{zb;d!B@)PwK z#~RD|J80=R0MmThHI7xlCABwvQJhpFMEJ%VqomT~S$T}kVA!55lC^49#0fVQSjct zNUApp47`^LCb31*AsYCJPU}ihl_{(jU5!xfw$fal18Zi5iP#~UGZ~_(mnu$Sqf!35 zDJ;o4kKaV4c%`=7jOf}Fwhqv>WGXmuK-X4+X!jF6Al3pMzc7uZ%5yGJ|7mO}8o4_S zDkCp#{glnXT*e^aR;w zU_wN7X0R&UXn_N5h@M12*CkTcpJ~z5wSQ2ECs5Bni`B2Lx9Gc!|1XNf8pTycH43X1 zL2md=9dgUhEC#t7>8+UpazC3Xgq1@x*#uChH)gT7A%z^D#o8we=O{~pA^ry{x}!a2 z2k-7s`)`!#1#5~)t@zK;#E3wpe$hBMF4pH)G>+^S+!mWpf7yVS!2BBMgA98X`;0*4 z`J#5)E6*2JEu3GWN=#Q%ASAf1XcuZysyv(37Cvln4CphPwFn-@-Ts`;P-V-fv}rbU z&$DGX?bF7^_Z`&vN@zfk5k=Sm$tigb`^elDf-@;=S^J>PqG6{$6d;f1utW$;Tj~=qwh4V6gFSwDM186HCiITr$g$6~bUovj| zQg}7=Y>TU39r@^9LD7xI-)Y7s2i@7; zS;6Uo73MKx^e}1EtuRB4s3)Q(%rKu{#&~dt0OfdLN!$zz^HdNXVI4VW8EX*m)nS*i z(GM1wo0c(`|H41)iWM)Hm*H6MK+i8{uHc`p+j)pJG$4{Wn~) zgH!83rTu=)L|5RtvV7=ZqS-+~zZZa{jyyv1SD5{bU7m zS>H#`7yPKMO^v4~^;%iOF6x^JV8<^P{V2->1B2Ov<_3}fO2)mHyRBqh(e&>|)4*Ay z>C3*R;pw`PHG)C-m7?zH)VD}F(eNwqXtQb9SL`J`4u6Gx{EjMpjkoV;_}38sVO{ez z)4(YOC^zZ(?^s9r^c!aL|IUgJxBN)T{sXZqzk&7w{F1tgB~jS7%m$_@>06L4=<2>@ z9kADPzGZKrsjyY7xlyn@$_!s6%6zp7BqA%9sD!eP$oI?wzcrhjH)n$8VOOTE zg;uC7HCW5KV#40F;+AWj{y4-xg5O&QYBG?1TE|j_Ir0gM0$hU&;*)i(G<#1OW8B#I z%;A6yy2rVv5HFm@o{rV;a#Eb}K#Q?|ucsR)^LoIFkG=;E_aN{0jJuf=Fd&f*e2<$| zM6F#9aE39q0OzLs#fJ=i*5h`z1CoszB^~750PR-?I<$dRs_{YLEm+|c|Bfo~%qxs_5}NAQhN`5;MN_+c+&g4Y z&wQ3>{SZL+spNHS;aq|@p9KnRL8#%(rfMYpyn@+i7rtV}59YIBI2OPYxMEx={Akrp zC1|F;cHB>5{YJ4(M>azLjmWV-Fzx~I(hm^k;Jf|<COOX z;C{r7=xl1gi4DY~U=zE@kB9lRdkcG$uAgUis~e~6lG5$DLxE#e$uKVc&d(SV=W zbY6Z5FJF@CZ)JS}+sn4H5BS$*v~nwpqV#R7lQfTJZG#}}r3TwY13R{h=GyEKZ%22C z<{s~Wj`}QB*@+9-d6cme^=8wuo$QkkwC3~mPDYwn_KFx=sP51WKFo|;yF;}5XEu}< zU1NZeDEfBjT78)~x5i7I+$B1bceBdqrP^*b48vNzn~ilIl9UZbRo#ILnxBJE)!ZUyH?!UB~abQChUtTF|RyD9%@G??^khvTMVZM0W56;;;H ziQ-XQe7whIy$ZP84F%Aza%a^ehme%+l z?4jFzMf9~&_KCH6c^{j=7j~yH9;DMa#@-J7*;m*u7B=TsDB0)H>|a?^;SD$qN2G94 zxcMt9jfhx#jM@oBho11BNCa}<+E2Ci>h4sa`g95x$4>6ve`3N093?^v6Ayyhgnsex>jXI{Un6Xj!4vCFA zZjA1kT=xQ%6UEwSk2n3`MCE_qsFQjXY}CZVMH{vEu)a~JY1C2QMxF63tiDn5QGqNY zjtXRnJSO&}#xa%)z}<3;jdcNVFBC1VL0K;vjR?r?f1JH6W#%0?&P)={rXwfB*;M}| z%o7ggl%brH>_as6=Sgum(JA&L2aIbp=d6zm96l|`z=hK~%-qm_;xI$MpAkRZKO@GK za2D4HUYd1Q47S2=0w!Ai#wy{C|E@H3XoD#FiA{)Yo`sC?iob%1RB)ZPJBn&d< zT!JW{Ne?fvL)_|T7_AsLJesck4k9p%oR=YrouOWr*{2-LKQ`=NaW8Qccc3+{2sU}r z6@5gbsO2@Ria?jqx~H0tw9LIK2DSOBSb}EP#7us@CdP658tV@#{Kj=w1uKy&)5enD zN72{US!2PBOr)GrNY!V*!QQYyYcdH+qmLTk66OY5hJ8!_gT-^^Rl5mY3}n3An~+wC z*51@b)2TH54pZsJ+YHIeL9|23H!dB3PT$gpKCQ4EU&5QW#b~4Mh|x~FBSu^LE-to( zFffzyZ$i-Md{>-T@7!foqG#un=?RIzqU4?0<0r(kfomrU|_#WSTj$ad@R2U`o*E`VhHfbLF1E?x6cn28xrZ!N*8yVTgGktY7F&8Tk6~ zeU{qbRpm=#lN`@RSmzgOqdncY&mt4Kv}Q!a^3l=-dMTi&^Fa}cc7FhYJ%c7cfL6$- zVTo8=tU)e(E|&SJ?V$SOS%|ts{0O;oi7`qaoA6%*>!rmSZLcgXs$57_sN0_qfib}B zKQTaVYqRnoZTu5zMn>2FWE%i1D;{EBG2UMu2}vjUF(jQCm#EoeK`;(IW;=mqUp`^e zxe&8TrfY50D4GzjI;RX!Kjz=^WEz#JmZvI``WA|MC3Q3Z{GBM;i{5OZ+C$ffk&2_2 zt3dvc)uFu1TBFQwCN&8lW-{xazc)VLF^kU*i&_!CHnON`cw|}BA-wKJqtMG%QE0GL z6k1``f8AvK`nkXOHQ!%vd5iJ+>j3e&AVB}T)%d(AP)!O2dGtAELry__EM$+`V^x#M z9i%qmJ#QDK2ZZX*)tFSQ(Cgd`(i_`pG;KF{`d$aFv|b+OX=nhMyo$?=`CWq_F=2Gy9%`nSDi-3t^@Z z%zd)xuX>f@R$V?HZR&BSq#;l5*SGj-dHM(~2vxZ}{brc@5{I%M>}n%is#?Ru=#IC-K=4Dpy8?M5@AA7kDg5R(r^+zoaOq+DRBo-p1aZg9Ysv zr`k?3<(+Vm3-({pNDPO8n>E)shx4F)A)}AOR3y}^)U@}tCi_NDb;2* z`GLATp$%>|J}5_+dpT|P%)Bb4F?iJQmJ!YUUPd%mp{!`GeOc8jiF4&+3a zw#I=v8_AQaRE-P}%0HYPy3ToOHMLM%Wvixg6WY&>Av}}&Tc9$xn1Nk;yy<)%Di>lG zr^r!(^Yn5c%!{h2^@NAp#)EXZnz{wM`*n3yXnuFsP~XJ_nmnhfkZk5Wr_O~v;R`hZ z&7J78nrcrxEVa}McvPvS)oB^mSPoA;^%dv^^48Z=6>Qwp24d@9Y#=su zYy*|sGXy9rDOpj|^3F9-v-$46mM%c*8)}ULbTnO!(n0E5n%Dp!wW}jnw29D2c4IDqXh_GT_NRKkqkMYy+Om!xQ*aOCnhjLweU3#OfI+)iu$ZLoJ z^JDJ)c4Bmo+lkSQX)i{%xV^d_!|M5xPPE2%PBtEQ$-08Rt}DpN@NErH^fiixo#MfdZrMOfyy7nnrx3Z9m7%i?~)o2aeel>YTOu% zGSkLouoK(+I?y?T9=?uo!Cc}E@o4gfIKAJ}ACuou%S+w!HoT$6TD*5|^UM?(Z?Lwe z0R8$uk-87?UCK*!{QO}qF!}Z#ar2+ozpt9f{k3kqe;ausqiUJycowjmQTSKEQByxQ zzeHUNI@+ktAeNf+`(D|OOaZcAO;Z3j!-(boB*IiYpr?Hw4IKn~@QYM78y4xX3g5FB zR{8H_<05sqiB4T<;h^2wtO8bBhrLhv@2YDHBi;say*`b6547erIyJv# zWQeYzOm_xx4du4?aQgKi*MgQjS~^uEd!jjz40mWb)+(mkbv4Zlj8 z6NX~Y!tZ*%CI3;+(-*8?%0u%c!SuER?Rg*M6X_u4wJZVZmNBm-&xDfs0eIvkl=A@q zsvk`(TakZUrGNbG10dc9l=--6WVA29LXdIIkd9C+7+#eRamwJj`-_&bB|_{U#w#H@ z@Eex)!HT%-#?9ONH1k7sCC&ZhxPx*Z#5AH-584ILgB%v*GeB?*mLw^=q@UvK<(5mq z6a+?Y%joysfZN}H4}#T#tq;bygwpz`mOGOvf+s8faGAAm7#g{%Up0%uUJo9`?5WJzJ|3LoMFM zw!+}zR3G@lzOB|N0pkqABHrYq2MAyt(386=qw)b%wyu#}CYW`uYf5CL(Gt9r{ zyDB%|nSJLZVov;O526PX4?=*g0FN551HH8V6`o*o|g<(dpK4ki(|-Y zB=_K;c#g^rQAvf+&1X-G)HsSVK8O)CSzXNP6d9H0>XvI?4(oA7ecZ zPBd20Whp$ZF|Rv*Jbdg>wXtORMiw#&9(u zYW&E;DT)11?7a1?!=xZ|^^yzR_wXRAAjKYCPbs)yf2%yThlr};wZ~Z+C-yx<% z!qU0_2(=_9gVRQ+Ris6Fs!{Qqk@yfcq)KW}xAiY8w`?S6%`dcTq}o)vO3|ah``vm% z&yP||OJCEgqtr?@FZ>LeWB`KV=aR&}aA1(R37^=Hr`zON7E9uO@Nh(Qh%m#(&vrX@ zXJz>(vEkx)Q6B6p!5f9e?{|68qrvjqH%o34Z;D zJoqZo&Mp}P`g4_bjZtCmewHqdQ7iDJy7pD0sJsee)rpdAvxMtkWUcIpwY*B(#;KJs z&%qf>VaUEwHdDlSwGuZ?L)J2Gc!!yA!#hctF(t3Vc-107Ug|hOE$i3}1HJwrlff=- zmbVilLw35#FIA7D6%*9Dz=g{bfP<^4bS{wQ{6rAYBBZhCNK-KBW%zQ=D`%$bXCp#r zXfDRQCV;xlt`$Sy=Bg#*fU|}pl8+HXSDX1F+{jhq0bwB%)pC65uJ-V7YCTbhZ^;?V z;Tsy-snlm81nXbuq$@F&(k7{)QOlFvCT=pRb7pAnN8VhS)V;DePoUnUcLL21=wwSjeQ zvdgU4yxC{Vf<1_s0wVv5gfF3bx~f)F)OfwNFf=sjhKBHdoJIqusMXQ_$|=6~pDwZK zQ@S@ry^0d9CwJqfk{T>~lPO%Q-qd?&d`U1wD~_Dcr0+^Rr!sf&Qy?Ok zEghAfZW5zU<@n%-*!O@r@u%qd@15$rwxy7U^G>k`hI&ipPC~K(1d9JmJ?uhFaMIBXb;A2WNoT{7U!u7ucBNOWI8FrPWNea_Lq4i$0tbw1M#B z`oye?@Vi69lKofu97Qd#J?E#NUimKn0>g8BNu4E{dvTUpxeQml``SxKd&o2IYfsoV z`r4ZXI7C~sFdYmHHLcTb@tRc8D?YXHqWNt%`DlmfU%ud9&OPK`4(nh32slptNFRQ zOfMESr9tU{08UF?GSdGl!~cw=5_46@Q`Iiq;nlVqHOM(n4dOT{D-qtz+A=Vw@jT!8 zXmoTC(YVo31Aia2fCn2wtM^nc-z-F$98UL5N{%E5zgx2D_W)MKmu+|vZJ4LJ6E{mX zYluZOgfO^z-XWZ2GWvIT3rg?+EcP$dh%$g^qyvE2lrqia<9DpSB)baiocV~Oyjc?W z@6^6fqxc*#2AxQ6y+?z-P-7~5CU#1PnUVSkN9rSl&zGN4nGbJOSr zY80>Hr=MPaJ`3*2*Y{BCkJR=QxDdLTKWO4Y%=8yJu~2*F{NMzfB&^mn&pYEO5TBuklJi9 zc(^%5TpMR)telmZ-FiqYLMwf>+8^s(ZVB{u*J;oaFrMqEV2S!br|YqFcBxuIFv-Gq z3zfwwP&l2PE2zXWb(KNl>B=(IUqAB_V0C{FI-56ReincCSOUN^lsrQN+ zamnZ5cJ`EXCK=KrT=bAboKE?duSsFYYWqW8b%fHJE7ae?J$qJyhxD~KcBLA_+v9nU z^S)aNl$PfQ(#HB>F?7A<2`l(dn`9pmNP~Cws09O2Ybd?&HIx$iX+6fQ7DT!w?%$*&HigX~Csr1xCD?cQWKcPj+O1Z{!&>+B zYPG#-S%^YaO4g62Hs7g1^3o8Yf5_|m9To{`JJ-AwT{7k>-07WG95^_t-gZL%@kb|D zt#sq9=xA!V7Rr>X)O9Vy0>rb-501nguG$bc&=Y${4dz`eRmGkbD@>e$Tm-aL<#GZ<*%AinhuUEYdj}HmA9}C5{raL9{ z0?S%78}g=-e{8p3&%gYltRMc@!pfTc^wI{kv5e>R4QidHYxalRM}sNmQERTj zB=SWmBaiR)b0IoWnxCXpY+{3J98%rFQE4x~rgh8abS#D$%sKe<(Uh34CdzpdUB8$a z8;Ze!6mySgS;?P3UGr6UoL&uvx1t4(gTk9`dLM^wc9pvj9DeNaO(mN#Y^6AM4!Sei1;01S( zcPnlMcF^FT#6#JxE|L%a@XST?f21qh(dud0Xf(mhNogkl`_$_L8_<@WpkzoUvE>)hZl9lVp|^vS2Pb2x=3dA~I}k5S zt!~}Hk3=&S^qz*aID6H~yh?cGPzRmc3q?6z685R(&6kpqU_0j%|8&Y}ezHW~{j6vh z$!*-E4gk7@y&WAx?Kk6gq7yB}-_dO)nJc2~x+01@Vq*V}Q1d-%mEgk`K#093wppUw z_Zq(w^2Jp<7Xi!)OkpYf{l=xF*;8wG$)xm7r{ZW;=zvUla1?EPeIR!q7W1lEfa|LD zROR)%2A2F|~P0&H065Q$?kMy=pT& z;`gZ){xV0JzfT<}U-hSMC1pfg`&F%)_<2DxCUPF4n|==HS#EVdF&Z2c8AaoMDqWUx zTAfOsdaSJ(2{zSVaPPAFLYWvkxgTQYEGTQ=FjYf3odF5d;ea}kw|~lUJ7(%ZwQ|z^ zJ^$W(Fe&dhZbCUN>P7f_yUNko2rrklIxvBfH(f~y2y`N9K%xsN&|}J{db{>ZkV<;5 zZ%aVNq2Z-s(hy_4wVC!DyA>ZTf~3K-@gbzR1+tvY?aMcrXiO*!{$vCOY8Z{Z0D+Me zsh3mE;#h4T0RX`l?(vQ%GEvJt4Gn34pz7Skw}6z_0wcW_92KSL>>M87%;+Q+So{Kt z%jvqAHE4|@yCAUvT z75>ccNg-MasRz9j0&(RXQLB;bYh{8 zYSeO99U%onAVXg7mhRvLx2cs|)>k11tKbW_>9g}P*%8wQnoq}t$T9(Lte6DKYBFYy zm0oRf3yc1BXpqy;jS|fnUL~?F5BmVd6>EcqgMfl_QsM3EdT6K`1>*=;Wt^^(eK^!= zI{cYo+R%4FP;4mL&M|R5Hbs6YyJ_OxmT~3Lj&HXxEzs}6=EU6z)|)qILUZ1Y>rGOm z+uYNQ&1%Yr5$t2x(coC4;gKf2;V%E)upW1@s9~S_0jgVl_kn%?+{rYflgUOW+P`Oz}1FHRnu{% z;g{#+6uko9Sc?t0-tm$9{P5kvaQ%g>YXoNjz#xuII4lRO&`i6&U*w>W&tI|8phij2 zWl?K2C{c(mJpmO&5og28fNb;7}ZV8?s~n!05Q>Cw4N_CM^6zYR`dd`A!iz}O<+-iSoM=sd{j zukTHuK2T_0tU5Mxiid8&`WPTvtjA*O15$w@*re=2Ofhrjf(MV}Q3DVz5}Uk4a$5jz zKH}vBHNe2m`t@{i)BkBwPggjeC-EMEXRV$tehO~IYw%x)hJaKM4X*fe+dwvqMnP+W z*47M)ceq0_Hh%Hz%StTb=U5TOC$oBLB&}V(+g=+B;wvK(5kp4c#%m{>%GH|*V9XIy zRzVv)089{H4t@$?JP2u;^-Z_P3fR~S$-e8U!ceRF^%Tx>W%^!z4yb6vCOUQSxB>9# zE{u?el?|mAuXRnJ`>oyzrrG!_8|uFld4}xvFSbk|zmm<56X7=$siixJ=P@^Y zL-YR5pe(1s;TEf;XU2btDO9 zF=~j@pI>Ik$QZ(DUVxil27z+&7o2E(am|Hr9VWWt>SPItXbp#6BWOLg+009aJSR7H znp6D}z+jefDCTmqowqKaD7LV56twHDI|^I3i`ID{Cf>RcE6GOTHLk}5pnM|erI|7h zmsQQm;oPA)?+G#+B3Z?&p9PWv=|#E27eX40`2(& z$Wrm;Yo)!F7Dd7ctbFKO!QPf#!z3Hk&;P?e&DWBi$6EqG24YM`CU3)E3$03Ey>Z}8 z2VNXN>p|H@+fiZ-Bb3$0N+{8A?tyO3*8@n7 zm=%U?!A9dKv84Jzo1yqMbIS>?K>js^pNmes`6!w2k><0DLVR5zqML1l8Eb<6DCqlzwY5B`llSoUu76cQ+1nM0S z7MmzRg(ra7H(udcjrn9Ki4@+)8ucGpkvLNMeiuH~*a=R(FBTzHl0E=r(XbZgpe}}B zfUEy^1S|0rf|c+sVj)odzad!iQwV0HZ-va+`e7o2*T;WKO>!{Hb;^mMdRN+493qHg{Pp~~vZC=jYF zAOF80REkkBLrKwF3@bt?;9EKIGe;;RrgI2g?_arMcf@ZltY}1XE)25DsXb)L)?6BU z8q+Ei)~VndK2GdxV<+5TJMT%53qaf-;(oYAB(A5nC0nyw^Nn}fjB^Qp@pB0W7{4?P z>B(bQasuXp0KnB+J|Qtx?+na_3{st{cZflXO6bzio|=_gQgKq0hH6-9uwSc8fabK4 zf!Ulz<7jSi1_lSaz{2V*Qs8qKt`8N_HT+RI$7;+b1x%?s#2MH`EJFxLgb+-DEF#Rb z(+^%s>jRaF`nY@dZV>n~cO>U|LFLR&|1?PT5M%QNWlsR>Yk~OBk1D@rSXV&_ZIFV3F@Y4Q4hLqr zIk)Bl*~d1zO(^C;~uu82-s&0$Q4(F12FN7}R3=Wr*!kv*l6>~4~0s2dP z;hI$30m*2raKRP6+$f~T@3=WknS1fSq+Wc*UgSb#p-jQ6@J4#-3^OFm7jW|WcDEUr zVBTtFArAt003nqG=vwUeBtW1Mc|44tGx}{^fF55QE{GY55nLQB2<7}%CN3K*B!&p~ zl}p?PYb>?Kh-AJ=d~BL_x>2#Jr7=9|#a%H1Dd$!el5_b-XD$8Mul^>Ph2%D--hc zA|ShlE+0sM_y5ZhaIpg71{S9}mJLqlcnWzMtAJH2T%5u(*?%u&kOcrWknFOotEH~X zZd()J(m =u;TV(S?(k6uHztVyGQ0qXrPvp3t;3K*`T(f59E(!%$pE@tJcB_2Em9 zz|h_tM0^+u4v>QfBy9+U!Jw=ErBhBu^iG3;qr6XO5Q6^!M}rI;h4##cqYy=laP%)7 z18Xf#n~tZ(Pmm<}lG~syL;E=KobtmUKR?{eU@I&D>F4C@J|Kncib#b1&Okm7u3Gb* zFjzgIlH!;Vr^}>hhl4v;Lg~sT=ycsfZ4ib&C$T)1U ziClwIL~`^tQ{>knBLQsQ#GbkWgK7A>HjZqrtqK&=c5%HD*V`Bqs4lRJGarUp$%v7o zYahhA`_xK-VqtYO_-|?@|6*z-z~8f~l`JqT5W~|4TYRNOG#+#g8AV^|!iYSe72^EI zV6jrqpjHYNYNcp_pN83w5z5sLFZnRUvQ0*a+L}CyZ7emK-Y=Xw?`je3_={%QZQ{CR zX>H9&=!Q7Z>2$mnUr;?HtW~K+1>+FLlk0}Ei|K}Hi$&LUL!Y{e>4s|S6waU1ze3%R z;8dWE=BGp*Q4?Uo6-9M?rH!uZiXU-CDQgQAMRk2;=+L+p!FB#YVI)N>PEe21ndyB#ox;L(h zstMw9`^Uiq0k86QwV?^K zWB`01t~_vA(93Co>Pcw2_?2wDpd}V)x5Qt4gWVx?B)wWf4HM__czI4a(V|f4o88d$ z1mXv7-C@dVqN}f<(FOb21QMfAUu8dC6a`zMPBvF#K!*iJD1_I;v#8!bYp}!(g_uCj z|7HS`K7*RiGy^W?aur@p^mIjX0?Us3x~hK@rNf;ehD?CJxJ-b8LRWlh0^8z^)fKsHZ>K2huq^kmdJ(;KBY;+b5T%1r*{Mr4iPWVLj3TlR zb+N$WV#3HbqvG^9TDU6UqI13x+$R7yPfxzTo`6zZDfI#fzA;ll`UBjMJ;Y4;>E#kv z5oQp0oi1$Dg9ag5wop=SG#U+}YXfS(u zQQ-m5@ra#_5bCHO5#Q+L2~pe^q);2x%NW@vyGQ>U`Ql(iAp z^d~AW4B*-+J6-Z*1>3gi1-U@I&5yb|j@M`$pltW`oPj^}+Qk5~m@qBi+IP6<>2EOY z3}pwc{P81)d4UPkt4g|mWcEB0*WbbAg)8w*AYUPZ;)Qa87~-_RXaj#BJ8@s!QDW&} z5wENAL2~#-5Eq5GTA$-CZ^I?nOYBT>Qiz*NApwFE+Oq_+7GgCBi5b)o*BIAMMfr%K zQ5em&5ej|$0b+<_&7{}F6`+p|N667 zFkB3Qgk!|IeG8h?naCIT*#HqqZ<2QvD7q4IYas6|kare{&fGS1hd=rPYcUUK3BcxY z0y&RgSvLq2!Wow?bVd!kgmZ+yib5-3Ya@h@6}}tmokei96KR5wOClR71<*U1TnDfa z+i%lXQHP3uT1d{H@>?&yn7TO3r3QWq>ob&b`swQlMF3w<@R=}5MmM5q-mn|oS{7Jb z+|+?V!$eVm|IydQchy)pU^3tf^*I~+FZKV2>QG%^DfqVP4PjbbFy(728kG2e5EN0I z)O<`hu8q4az@0uM4uG7kk}xFS+GFnGQcGWH-ZmdJpolNLzv$E{)_)UU|L0)H!3Tf~ z3;jn2S_Ag##sj7XXv-|vHTYL@cI{^$jS$kUFEy25?|i$stB4SIH)ch^Ag%e#TXEeZ z`AB?dzq_c+?m~(t*jMziNB1PoEJdnEQ<4i0Rz>c60>F zf-eGp#5X1f8-@6iH`hhM7bU|x+gVA9mS;cR)c&HT_CM8>_nWFEr4qD43ki@GlhBQ(>$7)z)oUM;}pp z$pw}hD=ZD@X?9Xb66Wy<6JUNC9(4BsNzag!!s zM)#kS>=>4)d+s(&5=WT4-TEg>N!0OCuYWyvJpAWlxA z&+n_(19P2DsX46Xkf8Dbd_N~R^ENzyJ*Yg*Nv^4_BTew(LRLCNnm9sj9>O&8FunRv z?H2Ky6YB;F4?}aV+q930qT>g(8hN%ya4Cv81n(Gpf}T7-07sTM0j>5Kv?@faMDrda zw1bJlo~Rom4&j*QW$b#HaD<3I{e(w{Fim-^eIl9iCP^CdV~(`bExYyu%`<7oEGuA_ zyMd-fXiZ@ycQQh&g-5~t*b)>Ut%XywNMI^7vWDZjnJNcpZt7#vLQrgcq?RP_x6sl^ zEzWvcMuK$M14U_ZQ?8~3(3MCnh0X~UmKt2gwV$q8wRmn6nG~gYtXuWT4Tutx zTj{UW;!dy;G`QB81U|ncOrln_m~s~0_*`R{87Jglro820 zS|dqXkayFr&6fUO_a2#Dmqcpu+|2f`TR-am*KJ-*Qj``CE8oN@O*LlmtecEMPly(k z7e#B!pLuureExlR0UZCfyF2op#9+TrICJIjkiFi^%G#rwwB_^R^ z!xX|m*$_RO55|R|uV{dwcSJeN>H|CyQ9Sl38W3XGBA_^}Ox70gO>^ofX{>r-yE;w< z0VN+jkBKfqF}`!gg?nK!r!GZf0O-v5m(KKiao*Vzr?yhMmABHRMN3FXu+^=VGk<1M z%F>CW^P(uIB=+?dwJxb0$B${Hv~oxb`kzwT8EJi9-O}1Y3BfEJWwk0&J~b(;^~2kD zWwqz3=LaaD^}RsQ!R<$bT)WI*d?W0KEHK-`pS}34gBdq@Q2T(@vhkm&WQtZ9?X*wP z%Am^uDOiN{RH~d-2OqnX(>xgE>T;Tu$FbN@Ui%7ylG~>;qw3^r!{~IFD|85Z#~ho&%^(rL1W|wJ3i=yDC(-rZ!OiB1#|-0fB<( zSWRt1z=M2#WNdQ6M>#kqZ*47YkR*Fy4IZymF@-2wsZSkkn*pTt>k6#tS65)v;<`HY z7%s#HxZ4b`Ng2>{MlT;*PfL^+BOi8T?-&#Ro>5PL-+g@NCxUSj6*i!sM7$vItU8B0 zBWpup3Ehqh^qC)ZPota7KsR1}R(n>op{5O&sX+s+7VpOK z6b#!8w?Oa#yql+y&t@PW?`C-e{X{ivh7A0$8Ad`-c7bq6&kMql_`J5D7!fQisvmJt zdQVTIqfOD#k@p026leF-m}oQ1S;Tr!n{?4r&vb3OatM->qBik4MWO+#&Xu9ZMyv~!CP@wpy9z}2a2A$5Z zN=ll2Le$hjrzarZNSb{TC402TQopRSOV*^wKncS)S+b4R7s4*2B@A zw04sGu|4lZXU+4z{&NJ73LtBG-H?mMK zs;AaZZyCzR^?x{MRzEF(7WUL0Njvi9_W}f3@_nOBwcgW5Tr^BgAL007gG;5jKE82v z`j;VXyR!3eQLdr*`Nc!juFgS9%=t1|S~R^96HtHIg|X-eM9Lo`K3dtVIGCgM?ZxHbfjHN&-c@TfdO zDj>N((_k@x3vYfO4R*j8)6mZujR_5-N29bdVS~9x zWU3#+HA22dFI7iteO;ni!&>(ro24H|L+-mu{~4nX=DjgmX+FkTW3)_szCK2C^4Ey5 z+C1qX<&D*9*uP7t1w#wmQ-wHVKpYp*!?9WxqFeMHrwv1uo8z>`*r{6MwGR-a{HyWW z>-a5Uf|&A{3EF%3Xv)<_pycRWzMy%D6aPQz-a9_3YWoA7bEam}CS=k>I5VMRAfN~W zN=~E~Ni4{9_7SjOKq07Dt}+3UCSU+zA)pCZK&9FS#S*M2O0ir~K`BA7AYesBc;B`6 znIxe1{(kTCe*Zl0C1=h)yYIDE+iS0dZ@Aw!YhEM=kH_Z$moATOn}>qN=WZZih`n)3 zGMDnEV1Bh6<^W9C`TDj~3w#!5r$idQ#q`cokwqBvRjVQ! zv;~y68c1mYU9dWmr@xv)Rh#z*V`K3mQT?nnAaE$+UKhCx{strKA`|q50UG%v_{D?k zK*OG)9_u6hoqIr^syf$YQT6)BK79{-sgxz=#FjoC8KLR-VqWJLWKqVmk-?r1jSx(W zDD9<4G3B&*JdqxG7PuE#hQHq>o6dSJa+qK8o{!AsTC__>X48$YM6zRFJRg~(>Cd>y zT)R4(rfvYCUW_mpksiP%-|*uBYV`s}ygc^c3m7DBoe$g?X<7P=o10VY1tJ3@9J`cz zV6Y~c3|HU-?oa)VG-P1)v8frpJl5~K0?X-{jbOe%rlgl5YtgmX%P&Qoa!jwi9GUCc z<418XneQG?kBxaH@{^`7@c?o#+B<5&h`tqjx)z&4uQT|fWHwB9IFgUUe0B~U*#x{_-ZlIMCh zDe*ZPd03>@&|fWto?hDRXS~W=D<*W^GWKtBa-9%I5Bs=c{r2aNYf(p z-j2v1+BEZ|@)%b=b~Z=n?YjK;6k7H4w4U06>W+I0HIcUY7U$;*0oASh?gt&cA)L0yA!C_wn!O=dS19K(mA{C z-5ua!@>10ag2Z*wU`2{ARQvA_5MX?`Gb?4)+ivqS-JG+gDeUuxv3@v6sRQ>Wc%A0Y zF<0Pfn!ROtR-yxRV8zFL%kc{M#F!#u7>~HBqJ*{=deStLDvHEs`r;7n{pimeI9o4p z(Wv$!N3TO5z|m=)>BaWq2dF|;cMx^@QyJ88_~6{Ez;VOW_+~#~&^HQy0=TRPcL;A3 zi>V-Y13QX)@YvQ-WO9*7YX;}|P=s%+AeLn>VNmN%;y3tN2%jwmXurm8JX=iB+8<%h zW4PPp!kLK=)_SnTl}Uk75OzJB?&k!z0WS<_t667Js2z!2*jYIB)Zc(BaYiOfYk}YB zzWyQ%myW;Fon6EOVD(eGicD=D&FLxf&RLZqJ7Q)H!p_8@5nr{%90ewYm^I*El_Acd z^UlR95>CXfqhobu3bnKmX@(9rpOR7sA%h9^h+N*L}R2Ls_qvgg9e+m`@Q97>w92~>* zRP}k}dPJWFzsjMblXpS8aWP%73%ZU?l)O8V@7=Pgz-Weu;>Eiox$fOB6a;3|klm5V zp3NFuxq3+ZAp$47`@ppJtBbTHeeBaut0M86$lg``~R13a-kuN8I$%7m=&c zfbk_nfHI1H3CXmK7UO~2ElK46D$daeKhM`Zn$>fTsQ+PFX%Zl;w4sZ$HP~J+?RA-6r+j?e4CW-?r_G z+y%wSp#71d?q@b}?iKrGO7l9TynUPp60M7Hq|EQ?B2zI_@T+rpL6Bw~i1f?HB^^cO z?3)8df~~yvaD;>da&W${p!g}Hf$A|wJ$9%^@Syy5xq2)<2xUqcZ95q0?B2u|L8;>V zaT&3KLy=2$_({0=o5Ir8va4k8z497|jN{$wTkwDv)9P;_Pfw-D zcaaD1IQm_LV~uw>9O;SK8hbcWuH(7s2&8Q97ta+KL9B4%F%ZW^FJTh2>cMwr!xcd3 zvB*`JoyU$vE_Q$R4A0JqW0AYn(ic(reu#cceu#ATuYAHlA;3d>TD3pYlz#mIa>r)6 z>_^PuvvO9~{U~R(=qIGqF3&+t(|-bmpH6#!iuA{z+x;wO;wJT2uO2_CN0(pZw>#D2 zW%*e6t4zD_S2<<3{~BrP9BW=cX`|Y}nf$Mi-pa^-JW>j0$F(pfNJ~$rtB*(6JAKu0 z99opoG56$5`u=!?ofYT*7U`3*>YEnl>b1C61)HIB^*TNfU-b>$_FJTrzVi@0^;@K) zj`uHq!-PBuj~J1CnoiCCh(uje5W$bigGYk2@sCI#vufqL^1#h2aTl9fXPZ?kY40Bq z4k{Zs5vj#8>^On9lh6MN)*mZ%?@5R~&(pe-5sp^A>9@jkDmoP@!|#cwpzzp4@1Ft> zy!qV)-9{vlfP;~sHt)~b8?q^uv>S|oq@@ayQ5Z40)Grh~78^T&GVR3eeroKjz4 z*Ay;_0;M>?s~p!wui`PIFj7_Q`h@s7c|qX%>LV#lwH$eaXm0P8`7~Y=+1?{HX)<)( zTul_}_i6N;CI)y<9LkaLyga(#cy|BLMTz%-jYDd5k?($P0|U|~UGT=cz$u2gw@R$C z#3`mJ(E6MPrHXv&UBb1aYhOJ7xOC zSnna;d&eNb&3^}C4#^Bowg^6vDzUjNfOiG2xN1T=%;;2Y009Q zHlI2siw;E(zfu6VM>wYc)gFtAWq}zyu4Yg(U*d)0wvKaH!XSO7gF$;gS(IQ=Qc|#z zugc9nIz>!WEBOc2II)t6saVO$FY~(hO%)T7`>j-QnT-gHfEXp|#3@?l7R_i)KwN{c zX$Y>jV>a4on{5?do9D6A(`alK=43U^$`Us-6lmF^13x=ui;MUl1E>G6_aUN>@lM3?11djyn zhiPy6BSBh|FV07!-{s3jJ2w?~dmd+aT&6z1*Hq+i^ULX2NMz8-rXuTq)94EYve8cq zP-_i^o5`U(*bK|_8ok#{E>FH8IwZ~9o(3N{FqwiYX}a7HJ>08trCD3JwtFu2<`Z%y zOb(v(iXrXNZgEKD1AtZmuJ8U8kpe^5;$?IsB(CK?4h@UJuAjo@ zn(DcWb2Nw+VUYnH#=pa0aHr89VbR9(36FF=efiacS=9#y6lksKpM@e3d*f+)Z@_tm z6tok}XBq%=UZH5EeL^o5ijJu7yFyuCT60l`zQ7gNUe_1tbbE8r0exB7TyO}&@0yFg z`1qpzaX<^falkfe)#FwC*v2krcJZR>H;x7HD zmjYb@dT^I}e@~ICPYK1k_Y&|ubWeyPy+waKV~_V1leG3nStR1yKP(}P#;Kn-Ad?_) zu){c{CvXCv2D-sFU)C1_$5FbdOk~FH?<)?&O-@M4MN($rH=5NSgl$?Vw!Xi>8Q>b) zFhG3mUL!ejZ7?|U84Vn{#vHlM9QiT&XrP#@9i!_8iOTF_URL_C=x67Ee2FuXHFR>2 z$kS(pVtIpw0o#!foqrKf$MjHa+C@O@?T_(baDR;lgOd{;j7)-ey86K&K@H{@wJpP7 zj>RyTJUuW|jRU1|g&A*Z9QTFj;fqBUecx6fXvu;kcP@>ozAi_vs-->eCO6Bhs@)13 zK`016*I@q%;f{arq?f9%`zP`&*z4|2hyUe)?e|%tQnMBoiP8S;FG@W?;(abiC}~Zp za_GUN*q)0;Skv^F^HR~rsqK#qxLnN8^f@8=c$j#HpEdswJ@o2d=!<`dIj-55LfWz9 zUm3A`uMn?l`nun#j}SlNl(U;9{+S;;l*@NQQ_NHN&kN;glKM3yFYqJ1YKfb)pQ-(o zU=9}0j4Q=JynTEncJTr#7>-`-Cv!O7ex{kjk>zeWFdQP{>=4~KLhMHBu#teH{dC(% zQH-~hBT?dK+M*J_k%_UqtHk-bem_n$u0dPR&^y;-xKR|y?};uf9%s60GDVXG73|+pLUHBuj5fOTHLMI{1R(6M*OTJJ7ta) z%W(wp!dTHAkDtei-gtB$C(gs;R{4mn9mg`^_Y|uTlUUsjNt{NW1wGBhMrpGVprWFlJvAyySBo0IbX)ZRTtf?*+tO_;v&?tb%I!k z$F;YKSx_B+N=bKP4Zf#u?iTG-p#)W^<3udg_wX$*YEfoz zRAgZmu8oRjLB_oB?cv0=;5N=|BhP3W*hq__qEnW{$t9yXy^Q}1vp?>Qiknf_WtHMS z)U~%#WNS+h0YO{^#icb#^hM%hlkm2Le3L~_y!D$5q`Z=8(OTO`iT8-%C^Y&WaaQVnUtkII{M)fXlc8{V{2n0M`LyL8(WdV@9E?Ka zh@EfrtH6B{xF`(F!H$Me<|w1U$mcGz=+VZxSr5puRN(_&*U7{Ux{(VJd?R(AB688K zp;JWjj_4M+b>I|atCZQMt87)NoODzR%W82OJ-5_>^Nw}&)D#ic=Y?q76b$YN{X7Lk zZzW~i3&gQ9cHX_>EQYV^rh*cDPYb642Ynw)ng+a$*DI%s@tCq5(*>Ut-8DnB!IV8d zLv(3%1h-C1V-(N~2IPWf%W$=E!aGYFXIK7X@SoO!mE@W!I+V!F@czk(Blyn^rO{H} z*r!gtdg_#ehwg%RWd2gde};2;JYzI^mS}dKtdv0^k!#%fdE**u zxC;_G@OLxZ#YmvQ-wl8idVQ9-Rj=6<>o!|lrt3#Pr@8lwad~njj=Dz~IR>viPs@SD zu{k_7lwSpEvyslP60LG&S87#0u6R3WO&jMYx6}nz+I2|*v1>_viaa^meAemZQ*>;F<9N4 z>)I}B+=)|53HG1Q$EMjxzswh*Tx=S29*ra0I++ay^XO=xiaI_ZF3;zc08q)li{Q#u z{kH)#hfV+J1EMVsd$&CxdSM&IG8Tw^n)WPhZW_w>y^sfMBORt(9V=3M(4I^5g$ZqB#e?D&=qR;b&H^es87QT)oTOxWuls|3`uQml)E5P+%Y&`p zMATRXnn3jWDsi6cM=!Abv8OLgXYTPYS zh1f%<7TDnoX<%ejEsDyG>bghZASfk|DQG znam!vx9Q#>{j>o%H%8enfbS@y@>vPl)t9;vN+5RY3s8#aALY{C)p-ba89jRvRn}Cv zXx2vIL#&_$8wCP9#I|k}MH_0eMw1o&6ORPo{$SBQ4Y^%hduHJ5FK~Y*S(=5sTH|N9WYlT zd0HKT_EcUg`eiKi$3yerPKWHLSyM}EYDL$;XQ#a84-WIkk38`A<%VLpw!=|)tXZ>& zk~fJ8){FJHIi2Qh5+m??$E(}Ysr&9gGNr#JI2NzlOsFn@u?X6kv9HP8dtVb5q^LWB zj{*bB08mA*gYaEPn-2Yv-bvj8l%G_br7`TR8vj8N_Fep>Ai_7kfB%KuI%{es}{bHG!JG z32japJ@zJ8Uu@1dg$YqAlPazmh$tmfLO~L533eQnMWIKrEO)&H>|aJ5gFgmo{aYg2 zeHl6eg?8e=Y&w6BD}{b~OJt=ind>n>(#=WB^Ra=4QO?`qEccWLvv5K-;BAnFE9i@p zv$FEfyn78EP};2FGEP%k_vzWe*!s6cQ_XvH77TWP7k0er&CD?Qt6HGC2)Z^xwxYn3EjR+bsDT~V-gm^9*ntNj6nej2QviYFAZbfPE>wmYP$n5m zz<`xg+H{`n{qpOaGC{Q-JScQo~2SXRM91nMYk-4j%E`*vs4skDAh*| z>?Bwvvy`7uejHy4uI+AW`jF`7sp7SSe_SjC)yzH*_~{{Ww&!g)jWvBLb=yP0>AzFj z!{SD0)}jwX9eFomK?O!qkn*arxxb`A)uO3uzK(;8O@}6CHFfm~Ct_nd&4s%Q&egl} zkA()`sBxMP#b{ZzIM-Mlhy#!c!2&i<0uL(|B-o66XejKW*5>&sqefhVal?Vw@}ZeD zuLfA9jGnKN^8Ob!!qAtlTDVMX(r%^KmWe^oHKi^WuR~u@??6p$U$1Ss=)$QAVCUHr z1_d4guL!NgIgg0${H%CHj9{hDhmVMfp>6gZOQ-phW0VcyUXy*MK@h+aO{4LTfJ>8U))jWvmi1ZNkXQ+vT}Icg6m8nw5qC{hKWH7U@Ra`7Y2Qf3u%rV#?NMB6`E;e! zMjl-W-sMh8d;;6dO{RpySJ~_+QL6C zHG5LNcCcTE;T2uF>q$V!YI^iZxjH+Z6sw#sIANLg!Rr9@d%WojH#a>y_Qbm)O^4}6 zwVABpBOM?YBtkVABeH8x3FVr{mcOwsctwn&1j zRhGGuYd!?-%Up$D%tdGe^RQh_hq+rjY3iu2{^Flox+rf{GS=rK@sZwX-deCi&B6G5 z_97ft8u($vnW1F1%L0x5x)w41H1mgdogkGlT=|=xlo`9~6R|-%N0tu8O9$`+m&z0? zm8@8)zbRk7zG-Icnoq?;deN7EB3crkz;9jJ1Ra;OBw6uucEJZ!!)|W4;`_jGTG#vH zCRDvk+!nnTH=Nijd!-K3-R2Ik7FyV4KI&$HC)r`X0mkQK69*=x0yku#raD)D6f8qv zF!nK6=0R|J0oHL)o{8dYSPkxKKwelk9RrvrKqlXK&Txxzg9FwacZb0r;*#5=xDxF& z{gA)l^j%Nk&L?*ys##i0TEzHeDGGQJv`OgHQnZBzESKuNeVgiu?bKsCF?mu*)a z$lyUc&3SLs4_aQq!;qIB^_ppNs+~OI9XmS|%^&xrhmN)@YeL_D0Umbxhjjm!qD|iP zOE9qB@*XHy6~ikR>y7E4W@||s-Z}mHTKvXLz<4RnbiuQa$*F97SIc*90VrI8f!Ne5 z05NY&zXYZYI-JY>^+PVEx)yWgYK~A#Gwf2kaSL7R3_f9x$nwp&ga?Zd9_2UO7fh?q z#QQ@x_kd;IBPyKOACwl(%cS;uh1XZVIkq3hvBJ>3q6>D&oW0l~-)+JUamyXzHji(j zclUywoN)<`%SG!bnlClr<<#86zbY%IR95Qzx>LPYRReRnGj-(bfD34RPrcc$)L>v+Lqi zm1{b3)z@lo$D`=|_I=QRswHfF&gL`MP=#NS9Sy8ah+n^h(Y?)$*3I~k`tKK4>v*o& zF9vZ7!(Y%M0tLsGPAW}kDaCl#GO6wT;WmTQ{I0s)E79L&6 z#dUcfPbe)ufU|{H>HPzsvZ&|S0nw(j-Bma&kek%2ZcWs8)pl8KAAj)%;!iZ>E78e~ zh5~QU)UQNUqQn=sU^9M(K&A&pUfLPBg&CSB5Ig3YgQ8gqe|y1YzJlm3z&kYeplH!{ z?M^>qDOT#(c*bi=AJ{g!c+MHeQ?%!x$WMBi(c2Vev9}*5-yxBo%C&B<&!tnxR~Bb_ z(P5YQEY^J-tUxipzX=Q9ialSM}1zvV zuAqV6h)a3>mwkhyB(;e9z7efD;3wZd*X3@Le-XN5LqC5D=3^ZteJ3`hJp*w( z$=ra=DVuDBjXaWCCv3Q{F-}6{mv?|wbS?p76LAMqYseaZN3DU7m|8dc9=K?hEG2P~ zZZ3LzG(@u)Fa}U4)x9Ui#r$6o|muiTxjAX3lf&YZPraw!woZO>kY31Xb2s^ zmeax685=QQd#e_wu*N7lNNYrRC;PDUM)6qz3($z1e`I(K2Z6xS`t zyqEGI*x4r-O?%X+TCN?0@tlg@*wb-h<-nd~(#d?MkH=Lz?UFtWc8TT`8^l7o69i3G z&{nEG(wHF1a=!Xsf2o14)KhR}(&jR_xcLCimIAXt?9c4oW_-n(pmT57zZ|2(h?;e) z^ee!Fg+Q?p#!&3KhWQvU8hI4Dvqg3k+_GK7)gL}o;=^*w?r}+M7YxmX;1~cba2kA? z#z96ZT|;mc02k>&YEA7{`1^1V3_0bwl9N5Lz)=@A$q8tsy+gvTJk*U=eFiXaUYNra z$g2~Dbj7@!6iV(t#yds@UH3@h5`{5iIcl>{N<6uS6B^P){>Q83>#ZuNfWlBhrR0DN z962I>soiJxUV;>MaVLAP1KGoEymAIl9hc-Zy~2-y1xAP1!-&(=C-Bgms>itFh~nWS zcpEfvL&u32*N`BQ;u{T9OW)`}9lGOB+$%*Q8ig{J-OJ#jqznFF018P|`Cv{4HOtEL zMA0aJjIRtpN6xqb7ZM;oyfm2HB^!Ze(#@EF z>v1FpFwzDue}VZ#P}lJ3T|@R7epGNFM=#t7!Z6P{V#P_A{>@7)z609SXCBk!!`m zAD~!zng;y#2rCSZwdY-=TY&O`+dKw&#JbIfZ)u4qk1xwlM2>CYw|ga@rj#jjA^#XBL{j zA1sh`3;WTBEu(^RfNzt!26!=n4rm)!c;DMixbR`SaM|h`pz-=c^le=hS2)%qL~Q&- z9E_VEf1QJ?LERi2vEsw8sp=0H*B#wRYyN;vr<^8z*9A84Q&uNZ>It0TZl<{>paGer z(~l>_D=_4H`cF}=<0g1nyS-VIe^LyFT)m?u$~60R7c@mDF;5?m>y-FXdpK5i3U7!P zcdcf%BRlLV{RJmgxSF&D=AI~UwQhY8_}PhbAsjgw zV0>Xu^azzZt;@72w8CkXXphh#r&XSSFETLfJ5=JbrshxKB2_4YT5GhhgP$uIhjQ_K zE^CO&!DnRnQfcRy9?vn@ZFNEem2N8=4LsTK#xZj!hn#MSYU2qsY)D*_wvOtI5`%c)XlqMO?rch^=>RrwqC! z#|p&ERO@os3($iB3w8pr!ZgdtudSL`b$BGDTNal{Tu=_YG&$Y+0g1N;W!6(c%f(q; znU+Awk(pKkzmCqbrsMUeEX&WYr?M>=y*te6&}1((8Fyw{AzGMYy@gL!uI$`_T<}r`G2i+bmA7hY&BEhZ^)L(M+tvbWCQnhvlH<_OHnYlI&-8Yt zA@ujX0Joc4BsEEFr#nJeF?oB79|3B4ZHHFwHhOEQbNAlfEeP+3zuexfJ)Qk)Y9SeZ z%YStheELFYlyRsWFNcGrj!QrU9g9QRW>LroLwd6v$BYhTvlClHPzGB9@!dcgLe=n3 zzW(MiaTv-Ds9>Dm&9RPo>-E~GL|DXR8`)P;$CnYMVvoz`iQ@VnQ01yq0r_u#9nd5; z5^DWTtAMDGhf2MD^0=n#2YUfO;=iNOtC%XoCmwEuLSRPSKys@zR4tngypw^>LH=I{ zovW(OZ=OVTzR`$qgChMx9(|&bZFUaqkNU#d@oF!;+KB&lIIat)@a2T;^=P`(kr)b^ zKoEu}42Tt*meu7-O#)S=Kj&oH<~``|}vc!1eCr`u%1&Ds#OSAn@%nT1R< zS7Ms^dJ;=LhUZ+phM$;z=%dl+i>PAFB{^_F7rbM|XcJfqR}?jbwt!<@jv3_K%(;VI zoVEM}Ro;%LxfUEdOGfy4NQcP4D~aDrHT*ur$PPUZ>#Nn_=D#%@5}>JX9HUJ41T%4r z>Axx7b^D|aVHJacmtdu%NN7B+hly!`mn|kSnDhkm)Wm^swr6+jIG)_GqxKW>B=@(q z*%^+vL#YgJAdXeAYjQ)uBRdyPVCdlZa`=HuMGP;nr@~rBO&yE?JU@d?t;pkLVHatb z3qXY*Rl!X%mJjM&n*-EKbTB;LjtqoTVgJrhGLH_a>cDZx>nvhm*o^qlPP_P=^ENu&`|ES%nK4 z073o=tq$Bw_m_T(!9T(aJKXW)f#p!s2lwgRDM*m;CX3!9$SI$jd89`;9Qv4skpk@r zs!oyhVF4kQ!9ok11mbt$;exY#<}Lito?U}q5aLJR0kkn9jD_fjHD*_}>Nv_)0HQMZ zgHHo$wApfH@Qa3FS0;~d%}Kr?A^Krqvmne(*UqfVh+=r$SPJT^^!;s9CHRC0*UE%E z*(TM}?>x6;v&C@su0~$pQY9`iX{d7`PbuJv$HL)N>U|+&4zv?z$w^RCirHp&sR&S@ zmfx;XdYHrnnx`o3vfg0jYU&(G2bk7G8h_>Q-REv3apQiVZ(Q1qUbNvZ^i297Ban zk_&}mUK=W)fNng}VvMwSRQ-NeVe%ka7%4nbw|%#z(NIwyp^^X<)jNL7)-nscW-*pb z^#Rx`Ni~h##W3QhA+zhUqJX~EXa^Pm@fnq@Ik%!_)aK3WK>{GAnqiP|N|0cs7(fC8 zVUUoVzr+v4hEp{zXEQzlHXtw_=^eTNQ7EGJE|X$B;~9lZc=v)WWXHP@K#|OQoE6n_ z{~{p?Ck4e<)HS1tm)CiFvRlbG%rmzY#)uowrh)H9Jg8r?9Y&AQfs<#`OWWqwW%RNE zMS~5e*`5JKW5OW;g}1asehpXH0Z!-Y0{htYr^99ZndlmaHrCU=Idv^A2EM-(Z+l?L zXJhjkh0Rl$^#eAqUsn}tPg7|8%s6|n0u+ET#$jYm8Xo+wkO@DlamY;gA0RV9EevGX zGa*wZ0X#6Q{|K4c7+H1$WGV?J0r}+~O!yxmGv_}-CJmTfm(M_HpQR|z@yWKYG&Eo& z@N(JS(*EB8rHuiwFaHKCC74MZ;47pRYm-x=d{`RC0dXuK_YPuKK?yPtBn{r4u|4v_ zX&}DR2uDFOsLN<@9}+QmBw~OQS`L-KL>Z{TX&Q!CEdZ#ITmZOU1;M~?CYX4*LYGTb zhvBht!x_*FeFrWW%8S{(;U-pjivujH>A@CbEmI@ZAh*Ad2?ljsQb}=lkT&SCK_oK>-(BlRIZcF)|zB$k{t%&$}7+ zaeTt_;EyvWF5YRMF>mxa6LCC0QyU$pRD7#7Xe6wj8p?2j?&9X~@g3J||jV0isEVc-+SfSc<56mnXn8$;Ps=4Df zm?x^At<1m77CHq#Tqxt@nF22d$GT=Q&!oK$dI>=6R*sCs9BASwUIV0gn4jc{WjGG` zc<#zrT?a~qu}2-Heio6P*gTLIy2hu5Q8!Xxdx{pJ5*;1(@LZsT;~&Wys?AUgFROE+ zSQ5h*(wrqomxGY}zt?O(IweVS*8k_g(t^mM%Snzzi~;mv^x0v~ivUQ>@ni3VH8>9m zd(BCx_x1{t50^Pgjm}kj<%+f+O+6OW6-K?P66W&26)=;aMyP=kE*TZ}fe}VjoKaX# z9Jn%KWLWZHKoW=`7U6eSdxjAA74eJ8_<{NHf$VUx`k4W7;(^z{!vr@R4RQqm1{nBR zVEgHykuh{NgZC(26v^PqFGjpUHI2Q|3TOuanVU-lmu+|yNOSuv+B9kk6)+tw9v}9e zUa6z~->i!Rb-7Ppnejj?SRIXKFRVKU9NTLP>&8ZXU?{^LOb|GAW(*Muffu0|j<=aX zwCO$Y0hnl13Am`yc>U#xvJ}XC71Bd8FE+>`gcI#t#IV5=L{|z$5J&6q4kZ#FlI-D6 zi1TfYH>8_;9t-Cy!ScQ^U=K0V}E;;*FW@K!6${mFrHp(6y4$Pz>UyXj=QOIdVqbau?4#B=JKIJl~m8(SVdO2}8XmBuQ1F0K` z-2-DI79HK@U2tL>e?!LUx?BdV4m#e=!N3bG0W|%PM^RL&?_EYKl~Zm<$Yrqe_b5cl zi-iTouz3z({y@r;T<0kJ8n-ff?na0fv|}T8larUn`Sk%NUCXsE!|o zo89-@B><1;yzIL4-#>~4A4Ece&;!9g>}0bLBqZR910W5kSOGBHH)5A4*aq^Gu3$$}$ip$i<794pJB#4J6@-SATbCP&8=AH`5*Q(a7{B=i3ftR^&qs`^mR5`mni z#EF81sbQ5%T#J(kYyqtX5a?yt`IB!4{?hTdC{NNh{s|rgf3e^}{_GpQdU`0sbTDI~ zGrrPMR-4L5`7)kzU=>aV`p@Gc_yo)vEbTdc1(-|28|4E96@tP{9qgKD; zlJE%{3cd$K!+}i?IF(03tEY#9_kbhuA>B24_0(_{)5uICYiKwL;Z-E;2Ku_9rKyH* zbvSdXk#UcaIei5*4sbhBfjp9!fe>60g~BcgvcFr&4{Q|J9LGN@K%+s( zVD^JaNkp%s_qt2rWu=1vFh9K(D$m66ObM#lKv*L2-tR=tXge8BYV z)~lQ22h1$?Ohy?niU(d0@=T54G7c&XYvxgXl<6GLv{rI9KXUz?<{FRr;thw{cgQf& z`~XBLlGbDT3e^T`<88+H91ms=T~m257c2NT+nGgxBF9DO>3Xbt)Z7m1o%+s0`zA3S zRIN8-Y0);T-=KjVANB=aLeN=2km?Y0M5ogv_TeuHkuxw}QKvXbs*)-_CP`hK)0wY@ zat}RoG4tD9(xd4}V6?7{#xg^H3TRX3W%bT5fkRl-buxLfU7fjTgzrd3)WaT9HAObC z)6`xApx6lB&BQ>_gELgVjp>0ip4}J4UJaI^cs;6l>IMB(WrEhq0~? z^MkWg)lg-<4#}f*NSIXCA;p;_9(exWNb4YNfLY{(^T)O6G^eJ{BbA6=#sg5-(a41t zXO;7E%dRsM!MY*Y^|(^8@#Ks{2AsDcFa?$a{a5a0u_%cDhW^`5o?R4}P?sG9=>U?K z%ZhCzm7Iyy>xVeC#)}UrUg{0)<;OVLiXjo}4jpS=m}ex;#Q=c7B_NVLia?d#8g|`UtoeDb({Zd87F}qoEP_2CY~9RH^{sXhuz?ZQLHe zVA9YKgMwEo6?_sDAkgtt^){L`*ksU+KP^lcSbV1PMB~X|{iEMV>BHayPEBnqXeQBu zRB0(?E`G{|gCbYL$&MR;g8B2H8{LhDCYK=`9~PfT*pOrIq+uB0PK+>)vQ@}(951L5 z+7ZjooJuT`gUJ-H72|Cv2qidzW#n~g$<%}QDXvz6Ml~#yGTaBfmWoOW4R>V~N!cfQI`LRtc2waQL{U;|DJjlFP>s*51T*hxU}meO z63}&U3Gpd81IhG5=lLKb4rMCrx)&v++OFQgIkg+(N>JFwBSEbEnI~*)V}lsqL#*Gj zXS7m+Z#ct<>jrb|s|~QE;mvBtZHGmRf&m-Zcu*b0)J71-<6vl!odwME_&s#Vin{Cs z&}t_XRnVu-O**?}HatKZfG<7`0M6x&0p$n$@X!}`cw1%$yXdWvfCVka1M7JX9!d1> z;ci8A>1X~l*Q_j@zVE3#=lbf)FU;5SY24>Huc>6}6uahumq{*rBpQ5SZA zV*s`n9?brMaIqbVBb;D%>=%Z$N;30`U>OYG5EwqmQ@4;0?5hmC>Xm1*d{YhpkYd8F z1B#&{7!Ku{u;{?>aITEsu;gGil7E9c3}u3prI-#J$Qm#y0{%$@5l-P_4)@>?GfECv z`GldR2U>z{_F!3i6B8MKEmo3h_1|Fqb@x$>>nM*)DI3N8mIvghC;x+pszR^bX+7Y zut30}WROj=z7}ge}jR zJ!VL9O8S5&vj>p26OE`o1QaxmyHYU%w~XbA8WTr{0F6u@BvWii^5C%56h`0~ zW*2tc-Zn_Xzx&z)>j|DM7D#!v`5>1k3V>kGoSL#Yl2)4YBt^=BPXGZt1pC0Y-uw$g zsGlA5lUra8Ek#XEu+d^PbH-7qio~5{Dq|{CZ0NikxQ?1t3hg3Joc#_Svm6!h|LG%c zB1a5~Jw9R<-v4&Q7yj=?Y~$ScfL%7uRRgAui#|y2{kLNTI%ELAjgJO^>k7!g5pH~h z>R{6zA&u)2$j){c2;X53P!7T#AniT)WQOdqTF2A&5DZ3vIs0Ra7BX{%_>NeI1{T}q zvD7A_G*Ooxwb?2@@!+|!Cy{^GL$Uv~)wjVx0YNc_f%Dn;l&Eu4H()@Xg4yS$XTpHw zs8GfL_ezU{R!UT_Kc$7z@=P#^b6S7dM6J;{4s8_;OtOzN(X;|U9K`YgP(2N_0g(Bt zIG3dYs2PrOIZJ93*!Mt~iV0x(w9%xX!yrZh$zD0)`wDdctdcpOS`YjL&9weiS5RH` zgjaLJAOYW8U~TRF1RARL6KlVCP--d-jK*k~N_8YEaWZcw`%tveR5Hh>mdV~uEONuL zhHHcqsCrN7>^*5N5m{ zb%8LjsuYYpDt7=y$hq?wmq1Ylb7(a@?DP8J;gpmQw`{}9B>R+<>6?$|?X;LuXw_*j zk^t3}$AJBhW>NA@b-sZRd+VpOVZG{c_h}9K&>$4-@vW=Q9oaNivR;X#RqhEEa1#t@ z{C6Nu@!2|n{S{$~dK>BV>a}$lP2~YJ+jH|gf*wj64L)09L5ySJ4Wq!+i!x~2=3Bhg z*I(BbUQ%a$H7=3%%sMAUPkfU?7bK_CxWSjf6~l!CThP%@y5v($Ugs3jLqCS7>Vb{P zQP|u``mKYfVpSTn>dZVr<^l7>4&_175jq@*)zk*S_8z7PHeHi4J^BT`6R0@0CHJy1 z#!)yaoWN8YHaMr31X(r`a2CmB!7z?yg2=0+0Rj>XKMQt#J5VRq{|w3vE;7FUHswwN zOyg`F%YPPrVX0cei__jVDlV_QlK{F6Lpol32hGo1*aYel2wswKb42wx;no@v zZeVD8FUiGlfn!jF`!CJedr1k&(05B3fad-a-9}$8;?@}!`0qf(>SS0@bQ^t8Qf&kJ zWjKs~mgEXtS0i4@k05~JwhRiK-!)FCA&#J8H8ql8pEf`C_K0^_?o6yd;FD*l;kJY7 zklF|F_B8_Q4s}ALC&hJ`SYO*VN@gw1l3R z89o33qXF1|DIicGQZWx&BP3uqWg`KJXcW5u(qaPvwqyekoVF#^EeFOlieF%hu52a+ zjgY5A0&EMQ%!H^a*YX#^n5iBP8rrO%+tXTf(7KuDW#IOM-0oRPV1jvxl}Ugy1_Jv? z8?LR(ZxZJY8}@nij#bU!%e?08-EA|0?TQQig?^wr^BkU1Wjq<L8+?31%(71x=k1 zJ-F5qe6Mx(<)7=ELn;{6amIMDO!<~H!Q3N@@!O4DOZtM zN1awjmV9e60gk7*Y5CTuiuxuR>U1SStk7_B6UIcGeK~yiu_kTM_`3Eq_D|vM1WHDUWpW3KYCBS>cE`wWboA7(2|DhLgi&dRQtvc#n{@?ZZ6b~T zca5_t(V#vX)HSE!GG5HTlxg6@Wz`7I`9M~%>6smnH;S<6vI8{m!7uZpN~nzU0AO1R zHRu`OOsmKNSY(WiA)I5|)c_iGnNS>dtPUfz`07$)>J%&xEKMo{mqH&PZE7^YB^URz zZX(&xWG?7Nv1B-h!(s+9QWMo3zNmDiVCI7p0nPy@Vq!k|ew7pG9P8`C=GT~O8E;mC zQFN=jR$;9VoEw3i<%0O-kn{@xq^>5(>wPQj>wOJ;w7rjXQ|soaamzbmt&;!;@SX%1 z#adD2ISBGn+qR$kFEgjC{o*q>cTubK>Z5-YXc^6PzE*|W8r>VqfXxjijz?fp`J~*; zvv7+MUB(%)X3CG;VeSojEblrsx+;c!)%`>%?U~vngPz_svVC-oM|VzyOo7_4sd0?T zvy9GSTPLgzxtt~Vg3Vlxl}b>m5$JYSaQqsrrk84W zfz$Tj1dIV1GYq>s=n47C7ZXt^K|!P(hQn}1OTG7mrO63iN}bc$+(a*R4^4LHXqo?q z*1%<^xHaA7f>oX2L9a@|$m5@r6<|)8NA=KiMh|`eLl1psw7!ctB>@_achK%0Y$kCi zZ9?CR(Rf)us858Zz=K)JHM|`$2|P^9y?WJ3eNzp6icHkwiF#?EKG7LZbe3kzMBs3~ zIcS%60p8=~5v^WT>Mm_vpXiAvdPU)&07)XES`b#CLnw;Nf4CeNA6ER zrsUIHOs-K7bLM1uLuc)xy%@jiAorD~%YH+bLQJ8HmLqU=~nyoZ$vm zrsGt~#(8=P-yLE^)6EfJw#8NC2&j0RfHkgJN}Kl8PN^o;P=~o19tvE6&CZZ++C(3W zi4GcLqZuw0fLBcuJ$WOSN@wPTsQrkx9vXeukAB?d8_AKAx;#HJmzK}WY31SU&?1zd zJ0vp;+&x>2+RMq_k4ILgF5m zJRS!M)#1+4F%;+mcwjo9&I|0r6pIB~20)+$wgAFj<=y3wt}Nh`4s~P7R+!FPaL8E! z;{YWXL^+-5A&>=tMRtLOOzF}EYps?7B$3Htf4)Qt9N@q|yqYd~j*g(GA&(O+atrXP z2!;c;d4{{M>AgiZ!s%X4heg7f=~4N?`PUCJUAjrGuLwuOpg_QHiZ77U(x_2(MO>d( zjtTu&1?0E@Q4+G$Ak|JyL@c3YCoDh0?1!_-_#-i+T3lX;+jhhIv@4{tU*Kb5O9ssyJ}?-& z?-#`C!KFxT{>8m$-QvWK)m0q|;3K|xz@;g4tiAQKz70{Den^EsrHt!6)!SyY)ZFAL zw)%4Vx+C3!v8#(M#Hsv%CUvydW^Dd*3*bTVsM4JPoE2HUs_a-#gvgyZ=71DRR;ZNV09%~cE zjYSM{?vcI)nKlCS^J-}+M@5!Kw3%bC;+5ju;er{;R~dK{vrDWu>F|}82dTKMH*VAq8I(!6 zms*{vXQw7^+MV%b7HtWQ?m(5k9{y-CR6IbKz-+voncL_ME}4nF5=EfVV7xIJcdqa; zDGbd{J?G0;T*AKIP|wA4v#qY9$dMF=q|&z`9f%jGh`-!`bo>H84ht4XI2jHvTI<)~ z=U`6dbT(&ZWf1U!sSQfj*$|C6w$}PEu%T!Yx43Qr)51AZO)nU*(V;Zi;rdRaxwI6w z?f{bl=jW-WYl5vu4oIAi(L#U0XVgHezQ7LJewmfs8JerU$xf~V#gkD=n_wPiCkz$r zG9~QireH*#ii$N&bAWmz8-8j!6t|R<=-i>!04;$g4YhK-32c>taD>Z-TAfuILVpjn zauc}A=u5Z>rCe^E(-yC;P?IEIoQk+vWainBvjc31-#F8RGX)xRxm6fV;e;Ui2<93& zc?uy1aRGTdt6_3k+Yp9r13!}chf^`LNk(#Cn91QtMqZ#B%)eP)prNYmZ3Ms&@Y$Q+Jp7v9 z+^+}r!T!gzrC`{zdekx@N22LxomZl{bB)2eAik*13PD_4L?Yz%q(H5PR5_*I3YNPQ z&3s!?97RKFm*d1dumlE8ahX@PA#d@^Hl$uH(OmT~C|W}s;6PBBZxmXPjC;VA7QKP} z*kwvWgQbs6`~M2F18Cb7Rya8URlv80+B9_X3agc;n5F9`EM1qROP3+olv7s1W|yTGKa*SAwF>n=QI zzi8cw$LecvXTCi4@U<3hE5d>0z1Iin)$4Haer$EeX+?;=aQHfFrTdjMEhS2!vfg>L zXKPU|ZM)v;N+q`)^HTfVjb6&`Gv<6MOYfQB!$t;nNp4Pi2VR&lpafp@fnyj1amoZ_ zAPp&CE@T?xaeEZ(_Vg8@bi=g*2lY;K6Ars{Gq-;z&D27CsYGET4|toD*x?&2#1Ko1 zT|dgY6;Ikd+PVjU0!NOqT6lvvs&EHtY4#W^N2N8VEn}=?{Qh)|H9a9!qJSoW?KJ8} zYi$a)xdcfaUQ>J~8Nap)Qumvz!K!GG9=gfuUI=`Fkk%58p*-mg++ZtKBpm;!0gh=> z^B=P=!aXhq+hp^71-8jXvJJLe1DHert&PJJ&?eUdEh<$fq2SsWW__lU%qAn!yP}+` zbH;-bOyhMjBbdxE2BnSyR3JKgEC5s&Z5(G6YQI^dKvy4b#O3g7k`~j{~B)@fRv@<;mx3oej9IbpeplbxOo^$J6?eU#i|r<4_bHl zenbB;K%2h2CP+p~=0GwgT;`$sY#@7Du|5Q+2@&b!aL)k=0jRg*yH-)e=UY*)boF{4GClk{t>V*)xr!>#R} z4THkhc?)`tz5@aCX&4JmEUBTiw5}WwcJg&Q9s=wtCBo#wU71}5cy~2WWE3tyLxiz` zw^%j-VOi2DmXsApqsC!C_S_;G;?C)cs#UN5IRv?(`2;H$3f;O1)_MJb<1=8FiCnO; zl6qGpK=#MIA1xX97QbwMo8>5MqtogPJCPA1h3Xq7<(#rW|A7eGPfm?kXsF;1G?x-D(cbdFt&} zL1*BUBr|$**i(UeJhGcO`GX{euGJS;`;YkxIZ_v;jrC*{@{stH@btWKs{omo((bS_ zT0rN7j;p=GfTVUx7!ZQJf^IVN;G=7@>cL7p$Y<)Ik5s!H%lb1 z2@_Yc_Y8r7qqP4v;f|pcLIx;NeS+#xBtTMYsUR#rgXpNoWRIK)M380 z#1D@dfqm7LxM`j}z;C8A^WZmUKOADEh~Mzrihr&_G66`Flg}6%85%AILlaL0e+9~9q@br$=%fJ9ILyw8`?|xcc~C7bK?P=UH=+=h%7H zIe4_}CLfV*mf?axhB(gmBdpo{Zq`}a?pSR%3qh5((2W;>quW9cUtsmuKB7Z-upHKN zKz>$iKu_ydAA-5p_O&i#$*na_>bgINjDFTK7lIGArH%&%kEgQNyQWa@{?_@ySxzW1 z88t~n0vEn>ugBHV=44rJNV$qYTlW~UDP9m zcI{8hA#09xOmotZ`>iW=r=z-JKq1P$bw4PklMdc*jqo_3_5jJ=asIpvx~j^mPzk^Q z-Dd~sa23{dIbARpQ@A`}da6TDc7Vy`qPbSS%IBpDk2^?P=UQD*J*E7-D+`tZH@c~C zp4CxhNuZ8B5L|par`|jd%jKl%7w^iT?Z38nsnplzStVS0QkR2Sls8}Yt;c-p8suCy z-Ot#DJg!^}J&Kd6 z7F#3mIJVfj50AT-K)zm12bWmwcx3Fef7!R);roB7b*@VAs)Re2T3uCwkIekxL3(eg z)mbGZ(B7*s8F>$3!#HX6L)IibIy`LMhR2GBtsC*ks0LIyDNqA2f#pw)^$;F^)L56` zu|2y*4wYnI>!q>FtQZnnEw|ppMMmY1G*)EcGoWm9Ot+#nS_W(`saIaKb0V|~<=Ox2HpM|aYy$K>*+ zJ#NiVdGb}EXCIf{)mFsYC{T@FSD((LE{XZA0^ygBkJk#HlYF-b9sB#v~EOdeKZLY=U>TP7#^aO zFcD|y98AY-1`DwgLOqXU^klb?lAQ>G7Bd+S%kXyi1&c9Gfc-KqQQm4ksf{tgAG1{w z#G1Z&eIy@AbEmq3p2Wc8kgO?GbWSkZs2*_WTmjBZ>bb)wwVNPH@oTM5|h!KQoBIN1ZOUVOy*%EN1k0TLvr=_?i|Hk)6mD8=+2ir zvqA_ohie`M)*~A-2~#j|+ju~NF{5-WIWHr~y))DqDVQ7sSsjDO>-0N@DVguoB>J{Oi>Vwp7bl_ z#01wjWxL3MUZK2QLKe=&IH#Nl9H!WPmKDPDcO%!QU~ysFFi4t$!*?Xka19SnHiRVD zyyFw*3XsW7F%zf69ozteDvHyPqGlX?9@ZwFt92J0{)ja&@>m~Cs>~Fh;s83t3|>M5 zFNS+0k{BbhEvAOWK3+aFDP_MPGn^7O00Imf_zi6rFP4Jkkj|2bS{IZ}Qp*rj3@h>_ zL9|k?B=<*;y_}och9}F^`(tge{%9+#%Uh0i4eG>MhquxM z>iLG1-yRYq&gXbL$v(jbpwV{1X2SCKg~gxjHY{6aykQkk^qoc6c6N>Os2LnoS=>fa zTFNq4MmyfH;72Pyz}`we;thyPsn`%6-VhMf<#uB*l+*3ip~1y=le@zscLxj(f?;;7 zjUPCfQU&-lSwc|l;bsuT zGOE~Y&Eu1SV$ZeBV{P8C+UW@6a#QPTvtu`I0jq=v-_zf-S|e@!d)6jI?b>_Wk1*T% zDD7M-e%RxR0-Hk=!HFefd7d3OE>rsfh|o8RP3-_>qj1lZkJymIfgH{WI1l99CXA~j z8XAp#iMuGAh#Dub${nT}Q-0gRC2Uk6!xn&){B(Q^DrHL+Mq=t;WkGwUjT?)l7GpiQEV{&ohHO#62`dhNpGv#I8lED!zh zxz(`=Y|W2s0ez^~N_pvmT~;qA4qvIFMM91qc#CRwSxx=Lr$q=c=-@6ZKbx-zz_woP zSIDlCWb1)xEo<2bCzt2w+$%TBD}CL8NWp;(Jby(v2q7+kAGem&j4w9 zDZ1P05de^@`c3G~0^fqK8?q&fzWnAjHyzw<s@mZ2euv!GaJH#|VKWyrb_(vC|9N3RE zsIEMe;50K9d>eyfOR;_Gr@3|I&aN0}_k(P+Gzb47igIi04Lg+jLfwJGyF<*iaw+67 z>of%gNaDOF4avqACc5AnT32o#!D2lgp8`9zwlKR#s9YROeEx$vMD{;}B5j=aKnhMf zY$^$`C%?G_U^ox)PKp+6%S6EB!L}=6n?;}_g$hi&O)rPYoeExP0&oggGODPy_~_RI z<;m1P_KKc#tal)_=K3$Cbbskr<=+Ycer>$3=CQBKJ6dD!*{WFE(fp6T_S3_^jP=v= z3C$cCi0+C*4>}Y-RQ4#+!0n*Of_!kria~+u0O+TOg0FvRqlJN9!}5^Qv%qp=2-Y?Q zmYYMFTuch(a4{v6jkKSZJ3<|4b!CeHop|l8U}YnIvqT9s=5o0bYQp78CDfG5rCYx$`0JhW-KiPErr7^HWx*TT&?NaQPKoUEOD~xm{Z;0y&89(6vpK23u@E z6XcMyVAZ){wv2~CQLWkIwyvpBV|2!?;bclHgPPGhxRTcq&@+J7K*3Rr) zVnM1`m%8LEPi!&&xfqrslD~??>;ymJ-5766xC6H`5X~n}| z_><0xFzmQAoW-QL8Z|x&QH6`$z7!-EznGF5+9H)r-lZ zF7sA0AE)>T2(m^@cBMJl*q=ra6`3>f z7ziQK$;mVcZkh8ATP?=>Q3|l#jJafGJd4Co@CstgRX*e@W)u@tY2c7?A{bIU=~uxj zPQi{6%RU9_O%M+%`>EWAdDJ2*bqA=Sghq8Fgi1C8| z&jyPtaCs&In(>1w;G(#SY>kmOdzyZtJgc8yfFjHLX-G8#Eky1cHfSaIGr(Q6Dw{#O zFgiDv#-?tK;m}%q{!`+B#h%8b z?gV{yvOK*@RD~);0#1*`#?k=cXvs-Run#<-e>R-vyf#2X8Jrtw7y&a|Y2n1V6eJZibxpROQd^QYa#PEc=mUGR#6bMuJ0jUU zBc~BC9s96Z%yJH(B6cV(Ix6r%$%ey%lq?rMlSwRB#JUQqxCYP} zL@Q#`QfTAADzg*g1d3$CIs&Xza1R{kB~3vos6V8=~S~+EiEi=-VH^teGytp*gU_r`;Ru7^7TE8b&cT|*NmrgPZ-T;mzPzao@OzrNo-e;C(Fs6B z4qCAMRCB)k>VX2hz1YfPx;U#KLSl)99KP6huOgcOyVFGgi}BjK3o{F$&1F1CZ9rEU zM8yl8e){``@)Yzw??QRDJJ-ZA=9_Z~a&4cDr$Dx1P};V%(4(CI3?_67L33J zlruko*x}HHWjViyMjC+Bsa}2I*=N=_$zf3RX@^d0Ui*=L71$yN8l61LzT`64rn3y{ z;zD3z=nYGO31go#u!GKpk7+^0xp1A9Esu$ne0(F(As^^0XOhP`h{a+Hs0E-QP6gl` zh^IKT4&soAU`$91PT0$b!lzm^4aIF1Z7AnT;EcuWPZ<-+LIBw+I0{2OA$Js(T&3ez9rYDq#YNRH z%bkElC=jZTSDPqeq*c_^ss&qz-HIU!Bm{szdiX zaSV~L*+xOV_XYLdM^697_1-tG_a1BnV%kHPqy%$?t&SqnWI00_*ug+@kYGNDTf5aJ z^;&2mTZrcoF#Ci9AvHFb3wO_|D$8IY;AcW}&Zz||n~Lw^1>e!MUeA%WEUedVVZHYa z&6zc;_kFW^?;G%YTQ@93E)#Vh@1sU2kY^*0Mb?-AuQ@&H(sXB@`JT?Ww9!R*yoT7b z!PI`jL0U8vj6o|9=tx9?S}c(%ODd*uPn^~@P$Y)I8QC0a(Z%W0CvjSCv&)#4=AteV zhpWwHO{6+u|9W{FrH1j^KqXAK#%rsaHw-2*>V;X{7LMr;Q#2Sn2OB^LD@k{6=oxS) zS2!w3Oc2fk3EB#4V?;GRKBN*^nRk8~-zpJ;tAv}Qcjgx89OttbXbahW0P6%-@_7D_ zSF>^T+UGc_^ObI`s}iKeZmkK5EpF}l_+l}1sQT4nYVFZ_bZRLcc<`WQq%q6|Q49Ho zBl0j{#O5p*tgsiB;Pha$FM70b4Wvxa8ic4)7OO}>FXG>;r#KS zVK_Xk-7o+)0Sp(6hyJ7BV*0uyJm#&=J|uvBh@BLbU`#Nds<)lYE{W|UT@`W21X+1t z4MGISmv(_EvAvMzFhaIl3s~_%-*}ngGlNV1tOB6VLKZ7+|Z>=;D$A|Qw91>siPigtn+F<+Gw@4k@Q zHqxBg6ke+EdQT)J2d2N(Nt&Y@?}6U+u^)3z2sYxUJflC}90@?e$gVh)gk8~2^eq>v zo$NFPbD&PiT3Y+dc13$pmv=?`$dcCE6>_9lDZY`+N!B`GhipsMR)Bnt^J&de8Uo9) zcs9Y$#0(UyOaofw)2=|pQ$FoAR9x%V(owwQ*9x6YgX|9-ZVHdBo^yh*Kc&Q`B5%6TD}!a zSQXO7__uH!Xc^G#mPie57XDUQ+Krjm1@SOvkmk!)abO{bXOf`v{%qh)Q4oFsnc*U; zcymyI^lU9Lf2-^^S&*ZxW}`XiHa3_HdX&t-2^P_c4-WX~sceBpTeG!-9LM-j2t+5; zFYING2^XcXm(y)HK!3dbDK1CL1mUt`j+YTGj8G6RE4Bk$X?nTJ?+I4|ldXhcydYfh zOt|7r!u9tYExQjeHy$L7<9Me21?IjX0ml3Cjp*D2?lK^NyPxN13#i9G7KGaPE?tf{ z>o3Qf=C_#wF7beiI0%Bx>B9H8O!0#I-@3RqZ$+x}+T_qpL2Whlyy-+5%{%oE7qts% ziRs(wH^0rSpTVoGZ+S$ncEZ~iTYQ_o4QVV!$_i`6N&&5S&=a8R!di~AfDec9;r8@U zSj$%&^g>v>CJwHtu^}(G2S-hA1MO$U7YcSN4d-X#%5DjEoXJ+|9jIYL4I*8pwy<6A z&ceMC8ro26$ zTl2N9;tzWxEk_Aa!$#UwD5@H1H$d0upzj-L;kbe;%w=mwsRi1E`0ZkfI7GHXE!*QB zKmDUXd%uv$cbGXArr6-S^MaYIy9Xl=OhYPGyukyAsN#c-XnA8Tl>UwcReOQOtaRiZ z$p;SYYpgX**dbr@ReuLk7iv>H??zzDEYG{7#G>z~nrJ!A-;*!+oO{n~$7gbZ5X$&q z;tVjLfRE4=$OdapG|{|D!cO@WvlctaTc~9=-X))8;>j+von+JI(5>#4FN1iwn}!u? zTEhDm8+e~K6l(dEAIK-noP6-R2KLC84e)YLbhcuvy44TmyM}o8;pOi>lJA%u|LF2} zAIos+*}2;}QiZnP3+?7WVjn$3E}HjTwL zm7=L)ifyhnLo2PCYyax!WKKm9#3MGC#KePHB#6QNnc#{_zT)wtX)&q zRwgxSi>r&N7)Nj*2;P`-fqb#tvrc|#RpZn+Zm`ZACtM6RrTNkv7&8NiFo~s+Q72o{?w3#bQs51Z zdjf#Q+$Y4?ywh?kzAI-1be=|R+a(AnTqVrP^(ScVJQ)ziyZHW7udNcfnF0|FY zDR6@L$3e^N4BNx-5P+T;<~O~=+3pw|xflnt!psPhr@eLq;PJQi+DK<>5r;S2nkp{* z7NEoJwWR!S<%}dl_pLc2w^+nk4&W$$u=b!k7Hhq6`%Da=RaKh@P~TU zl0{$JHC|oVQ~(NZ@d%L!*rmdmKOJ;{C&0hBPETf^i!admaDX(ww<(U z6d!lef{l*IZWNq4z(DWekb1=IEt20;P_CMs&YD$e2e5L6a`r=Fhp})1T*fAc*drpo zqXK*m;ti|VfarLm!kTZ&WT<4EHKV#{M{QVyemyi+M*Px4o0hW5haDp?6Q%^uM5my*?FvG()=X+{H&{$b7tvQMry|ky( z&?dizz#c0Du`oy;YND>%TboyK)Xj>Oh}Q6^n7Uf!72EfyIc*kH(XYL=`DpT?K3e-! zA%zXcfPVo-q;b1II+Sf-L7=KIx_&;{_7;SnKw&fSj_Kc-LeYJH7$0cAn@%eG` z_tToVf4cbOClJ!z&-jvIk`cXdL#Ec)T1%7qX;;{V7;XvG_R})25RyhFh`5U|LHt=Z zqj*0_$-obZLG`rXwU%*^|5?pA7H;TLnWF|$oS@KZNN#uKD$VKLk%f+Ygp~#>3$eE! z1!zqg3V7GSwuDu*K@`wv=2bsm5Qe{fO^05?T4iyfPe(9=14BB3h%<3B3f!kBp~!|- z7e&XmmOD`7LJYys%oY*s%#`wfsSBfHn_m^CL%eCBiK|JVmN|@A_cA^*orw9YISjgBuGyl8=$SX;ip21vBOt$^FXbQVwr(x2scglQ_Udl zTG*CfINU2htp;lYpbM`Wtc_4gYd#(f_B3JFnRjBwF%M_)P9}eu*40)PvO?Bc0N0W6 zW!kKZ73`>Rp-fZJnmR;VrEIId@Qb3Pkaeim60H`Or=>xIc;=-LOq^)<>ev8H7z$DJ zHhOrd)>wIpiVvrz(wdZq1}z%0*h5W*Y17cs+NQq-XyY(#0{-SG5~L2-df@MShimuQ zPO&l1Ti@iCXl*T?R?R@Lhv&v--*5v4yGcAkSi9P zzE-4yidWBFu*#``R!K)}Tl@ky9k_Q`HeK-lr+M|HrEK)oDdj&Q>NcgJtLEH|+6@-V z@;B-F@!D4iiE_owVEI6b~Pppat#w;Hj!wXnxm& zzMA(ZXjfU4hpAbGmTx&2qTv-~Oh4bMjRZ#ZpQ3#M&$+VYjnb^l<@CNytG4{= zVULUfiv~G7bmdsBI;T`M2_LK*M6Yq+<)xJjyX614)s<7z>S}BtpltayS}$Opm5Q5n z_EB8ZoxfOTWS0apdh1Y*9|ywXVS47wEJsP?$CVkHDvWIQs}PRacGs( zv$tcJ%4v11FP*~w)D9?RHQsKcQZ1D6q?VzarZ!K47L?M6C$(!(ta}n0*mMCu*6zkK znz#P$WSW$4HpOwes|9I-r_=nRTdt?U2U5~%p1Vg&Q>!Oml-}nkfw}i;O@>_;u_Kd=HFm*lyjAzE%EN@!nf&+qr}=NW$f__;l`RZY z!K?FKD(d#j$2h*BrT1z93(8mS)jHVUoE@iD-%ls+#gsQupZm17${eb^Pir3k)UyzO z72>>Ky?|c352Ci^bbyO8a^0`pVI2Zv{7_s^KTUr?>*kUM^@0JuA22GVv-gAUlv0;j zK&(wPX_l59zwh4{8(cg~E3z%OsBSv;<3}m<#Vjom4IiB)8cvixm}s~!@WC`3!j;gR zq)c3cOErD@0C!T8_n?+&v6X}Sqc0xQ8qig?Pu0SdY1LbC85>M~b*ODU_d&x1M-Z8n*&^{}A!EssK+P)=_@str~SQu+d| zr}Cetv;`XDu)a`C_3sO@$4hDRLamMUY8Vf!Jr2QG;v&syov3Egfrae?RJ=%gh7s4H z!U3%jBIq2;F9;ZJ0HLY7J z!Jb2NU2rf@P=%IQ^}{eTX_;1mMGeyNtbS>WzV&p-Pf(@Gl)0sl#3f{uH5VbOhop1M zu*9X*yc*}tLAtFPb6HJ0sr_*rCJd#Zi~1iBUntTdh;M4rObUW;f$R^jkVya3ii=49%?hmr zs6px3`~WrohvtOE1#NnHDFO_;OD2%E1tEz({)g7T=8>ng3dQ@Dywt}E_cBl;+W45G z8P$#|O{OQhIyMx=am3e4B;|SqyY(=hfdC^)QH;8y zj?}jhX9ST%RtZE>tuBPO+KgsStuc4L#H25pzTVFY4s}L(UXGKYuMJi&ocalWb0P$!>c3c`ZBT?1y$- zC_2OhagB0yh-rZ0#D}!+d9A-Pn<{o`KAJF~SCJs$U58htP~{q}VakJt>;*BHEzG}F zqy^-U<{UzBm0o$|-8;ZWU5{;#r9-G`n++S6>f+`_N;Zud*lQ3*|LnkCOgIj7Nz0+a zt9!M@-&uotvFj_Y5!M@hG+;id--V03tDT(p(g>+t-Fa{(1zp1G1Nv8KNyi$ z8oa3au(WIKXHuzjaIft(L!QCT1xIDa$yeMRA+uKh8$0@+bpGGkeA_bt#BV+DUB?`{ zd0I81vmC2-)J%Ixb1T>oF|?w=5MRymm$hMn#^4n2jmRSZtJ;Iuq}8wDC@7=aSE2nL zLhAZ6k_GdNMF837 zQ)=#h9c|$!9Cgtn-4zG+>&*>X3eTg-I{_D>naE266}JxnNw=0>NxSZD>Y>$Nz{Pg@ zMr|K2Wrwd)X=1IGV8Qb4etSUu<(=$W{)t3MJ8it}P#z83q;-+2nNt1GsUl>hd3KZ5 z4KSSjx|c!e*sSr&ERVDLQ?Q&+|ET9)wTTsGw5WQGDmQCGY~L$5kCk7Gl&tC}S~N$H z<>j{@;$86B2GPpEEg%ADWsBC?v3L!ZY}+SvaEq2F58_m+otRQwQ@WM;0>lFRE|`nr zK#P)xEqmXlisBN#<5V?1s@hJQ;_@fqqZ!RgDyY$0VuvV?UeN_@Cw-6rhZy(WxwLHm zH*t7SvAoB{4G3x2r5n(CaRX*Qz&N$`mG5}I6KlU4P42g~4JkY1-W9}7IFzadppi2s zB?su#+u9wLC3RG>9n9K~uoY`x>9cIxMyt1L|H8;OZ0H}L@$YE2SdVHv2E1vUBOC>dl%q<54k9+*CVoA8tr&jOTui+?#v3fTrzP1 zoO6=2{$*79WqAs%zWX=y`YV3<9@XgooXBYeC1!$1%M1Z_t1}ZFrfCa}9e@ zV)H(C(SY~0HE6c}D%EX~tMuz*_-58tbCqhaO3LL6TD6X=rq~yv=F{sgS=i)$rq8szF8_pe*=1Mk7nB=;;~+n(dxfTdA@FhRKJ7TBcl^O`At;>{rnN0}1RAK*mQs`b z|NZy^e>lEbFVo7;0NZ7A(dC+#c@(P@$1nV=_T@huz=LuCH5kBK49exLR-`V9*Awfl z@20?mnRMh!VC3?(^q+V=4}k>g;`JtJXSUj!$Ha70X0Z;x%HL6WkpK8;EA9MB8*7LMS_@ii8-p8(I(sdBeh62M*;Mk47*NvN{dq^e{*Aci$9;u%hH9Mir!SgVcJqO{( z@=QJ7^Ync?LDqI5;IX>kzMVAZoR-y8+IYbO%zM4sK<<#J@vBW;zixNr3+%q-d3w4_ z8ht6=8>r$JE#0zX9VMOD+9XQ5Dn&i@N)X{ZN6@Zcw4;Dt?MZE+?Foz8i1uI5IweW_ zC^s&ZigyI&SU|-V-M6rl-q~zYbp1%RuEf@_~#pGz-chtR+@1dq;D-9 zZ>0C6L#ILgkCFFRT#RSLqNyU$6g^&`2N8?oh&`57T+OLlP|tR=F-|vh`8U*S!S(W~ zsyflO=)zGO?f6w24w6<($AY>VFYRpj)0R{`ak7sFhx9xb8^ZASrL^XZrl!EKL_!Ld z;=ID(7nj$P{Wq<70!1#Edg9W|FhclVlTC$ z;uG35x3tkmRILe&~ADw4eCP6{8=|Y0lUiF!hccts});vd;1UdO4^j ziDl?S%d>Pa0q3<3#V|TkXnKL4$}eblDNoQR7r?=dAfrI{FKn;3QA!t1)LY91%JpxO zVoZy=QY;k$>#Cb*#gtYEm6@x17yhQZWf+Og;-L$!+8mB+p1Fz>6}=FvxJ1#zmKm{B ztLUn&RDCl>EL)tZsK&Zcp+&zRZ??hDAIs!670$d)Z-YCFEEILJ>Mm4+j#fO&X`-hl zm>O5E`wn$$qPL}&t@=vGZ!?*WuO-8#H|zjyt0{;u;}C)XnTpqReD|*TQd$h-ovC|G zWuD%qX99nAQgu^3ld|`J;jkv+u_ac|$K&1fV^h5YeY$g;3nXP?tX_=6aYd{i!o6<~ zZJKv7l|GHt6Jm!0ZXc5B>F-};*PDBum~U72SkxK+V5)K@b++q8u`?eFc(0*Jc0HtA zRb6_oRY|kOsQX`|lFRi(?aNUUTX#5PajWY5#&X{~hfQC+L^a{tWsq zK`+B({_p_sTzUY|I=4Pj68x5QY{Y+ZU4kLSq%Noa%RRbD{ig~PjIXKs7Lr_-bbo?r zQ_X{3J=Pjtc?Pt#b`9=CHZRnb92Aq~=?>M+dsLhkYkfMC^`k!ER#{D!Ul(M3a0*T@ ztVj~=JgN<+W2w4Rbd*fR$FzS?bwGECRq)Y)V_N$Z>42lClH@=6vn2Vy1@yuOlP>jH zLEkc;XADlI$T?7P>S64FT0J)7cZY%S0D%@Zz}NnOOSo1*te-}^kAoc)XF+kA^iZ&f z?(3Zi>6e@dwm+Nwj^}nhmg&^Qlqsa11z{=h$peATZh0N7)8FVwfjAAen5TiT3=`+Gy0!jkaK5oP4c@qT8X#gT zb!no1=6LxW$jGiWO#QQ{OH-YxbKj}P<+qvq14dOnJ+viPB? z-V48q3-w~_DD^!WdrhgImM1K+(X>L{0Ybl168fcuCZXRIA@unH)4oPgFQfPu3iYC< zg5s<1o8ytXK~Njh-iFBy6b|02fVv-Wi>a2#Y4BV#eLl1QxRr#gG2SDzriGqidFgp7 ze(2kO(nre<-4uDLL|*P$EniM7))ye;n|d@CCaRtex|^>KrqBmh!z`-&U;vEK?C;#t z?C^6^Gyrw62%e!nvPBAj5UY~~KplC29b(#}cyJ3H@1PF^v);9%t^-)r9d$74)dwmX zf=IpFQRjQ4a%_7V1zYRsDLc=4#Z`obLRKjh+I^M=wbqC5J!DZQ{c7MEf|0S%!_!&M z_u&K8>MaLCTGSH{Ch_0Yr?Z}u0PZzGt^O5@y zbgZ);4<^6j@i_s?Ezz60&#ktres$Ghr1r!4+rNw6H1?AjKAgXIbVjJ*mn^(30{QqvT%UY`%> zOgp>kkI|HN`ULBT_d!W?Hjt_8UesPc^UmnL<7g;r?CdBp8G#vgEa^K*J}{@ z^uJky8mvJ&?-__gVE%Zxq21|#%+t;?&lTGmvSeiJv$=@Ruj*4+s_=@c7un}!VJ#7y zWR%MXY02SdN$IZNs2r~u*Ij=>iC=w+(QXx36$iy{K9mjAD}6lPPosJQ_eat3Z4=UI z()^slMXNIIprf0z+|;~9$$ajpo?IPAX?=9fzHI}PKcCQnKDw{6 zcHR4IFT)p-J@}KO7(i%@zq%t%2Lzw|SJiShp0e@p1^86dfoK`&E3sQq-_lK8jOW1b zH6iE^5U>G1U>-A0om8Rj{r89ej=dGN;#JY_Za8Ph!1@D$)Dq)E)USO;cFnxLx==h< z4$9A|`M#gtgD=zSX9)r78c1#qy;sE%?-V+kJJUhO`s@F=Y`%3%9`l{G^si(? zE1!^6=YNN)JD#WynwsgQ`axES)V6TEh+=%doRF;+TqMoymva}6*^1FW`>g7!C+WRm zdS-)Nr{2fZVbEYv<)3hOj{Lbm{z(bLb%J#EiZ|kBqS*OHTv*vn#g4Kxde<11So7N0 zR86VbJyN%_%otv8bYSEyKALk|f&Z0J`fV0Vc`thYU-9q}9j(vBh_c3jEj>(w#|U0^ z&KSM5eTfy{S*fDUF(2(419tc{#g^lEEUlh@a}$^vbS&4QtFQU799#@Q8qmSeUQJ_l zJr_Woq3dguJ*3`sxCga(0K&i}cO5RIQmxn{aXOtU$Lp?oav&k++cmFe3PjNlq|l(L zhr6fP)tL)Sac_jCFaDS+MjTGFEclo#t#eGb-f-Yt3x6&v~oEo-;D z9}~i{jN*K93=Drb$gfZQhC3~@`8HOihzH)G!v0}Xhb3t=XsqrTJjWA}@TDM2IX8t5 z*eq0D(D%r;4_?xCvdX_BZA-H)@d(<~XUFPIhHgua=tTW!l-uA&y^%&&$wt>-(rA*( zzoU)X#Jz+ci6PtQ=8s#aQMaox#XC1vrkOxCjof%D*KRuz;z`&2YO=@5#Z=lY?D;$zVMy|BkjRRKDU720Ql}y~*G=l2v@qI%mLC z9|Qa1Y1C5^gO{vB;pToA=0H0rz-jc!d=-Lg@DQnbO1#z#haRzhI*C5A-}zmN>Mu_J-J z*JAMU+6MqPYK7f$gz+J(4Di$|i1)auab0uZw~jUCS6^5Q(p zqXs0D0DRFVcM|dCR+q?5R$bBwGQ;p=lZL2i0!sV{tNZ!&Sl!y>i041RE!yBlqnhM3 zveDX08nvtZJKCrS1|S}Zk!R3+14d*MZ_twmZ%mH(?E~B@H^!|;yolAUvh_Wev>vPS z?`Z2nf-D|k$h&R;mTyRoc)|m~q77~|>W;rxHu~))joMWH9c@&2#EVC0bot?vFe+T! z+c{PS>##{pzxVZIHCMtLFjl!)?k8fXs2-O6oV}zUtIEHl{R9QP`H=ukkT!ikEsZ|E z5m>oCIbtXPV2j4M^+;SCwdzeY6Qj;UaS`VsKIF%d)f5s0@kq2Drd>z6q#}{VhfXTL zNq08=PjW=C4TytV;WlB136~Lc1yQ&ZXj{C)AX!Kn?Df&}g^nb8=_cI|j(+3L=Thm5 zoAiYEEsKJ}JzG7wjZWUA7umjds`*scXjGQlrb@qH4m|%6m5sw)>*?=k!Z`hE>hXv^ z?=lYO*j&lBEdCP5~i%x1vFbWdQzoe{rb9(ieX`^AzPz)_Yi6vH3^webiYOp{e)9tQnVFTOnRvpS^ntydCAC0_KXBEAjl1}FNXusCTPt706 z9ZctM73a8XiqHX#Otf1cP#p#_-*W9LGtIVQpx9RtzDE*s0OZkpI`J4VSin+Jz z&!gyihj_T{4*fw}U5@I55zEMwn(=q)BNU~AHvb)0%ty(4mwpfGF1Sm-#xip|{d$+4 zWjm7sd0X)?x8K2T(J=d<8E;R@NsyGlw4c(Z>PpsF@%kFSmCU=_Nb30Pt%)t_}x=+>I*+*3z_e~ zr|Iq7Qe(sB>8!9hI!$j7ygsrWBlH6=rJ9DTK}*x(%2ug~4pnSAv~&Zy36i?&pwDK( zU4TMgei@{lyPL+*;_15AQFm`p&4a$?`RRI*9^E;x5Uog~ zMwNO2Gy$cRdaeU8_~7L_g8o*iH*0cd#AiM_Cfg3@B6E&>+h9Sk9~@&2k-r>st0Gvs;_g^*?(DewpsN7uKLoyZ@wS(&9sN5wTO4R2=#QHCO&wO<{ep(yaO-SKTq=Pa5T_ zShd~v=qb)BuKDf3t(4TPWFl?_!cb$z0{sYE04~(;uz$vPq8NE6QWoj?;%=o>CygkA z+^Fj!eY)}MJcDmPKxb6y)A`zHjfOQ~+9&Q^iP`seXgDtq~1vRnXY>hyYL+C8kpC_ay*X8y26IbJ18%fKH&Fd)z8glmdW=N1Z_j;)~BEi z+JfZgC$|M^)<2~WQTUtCsqa&$G;DWJ;WPU6q`s)%adCqv!~4#){t6vh(%9mgF~i+! za>voGXZ20WVtQni-VVh(s{p6P6#JaM#P+5am)33{*!=X`b6AfzsoiQ(r((4Zo7kGo ztM%;+t~qP;sY+Q*+*+KgmS@9=TmO-dTD_q6viv&?*>Z2(m0y5V^=eviI*?Mm%b5dn zv|}$o({w)-?|>OpBr_5cLJqdts7qX0tD4cTLdK7Q-}suo62-E&a?+^bI-GPc3cIr; zwPyG_J&TtUa^^E-sV;cxGF8DM?fzv#06&GDFqY}~FB7Ivi@z^VrYp7_@=%}k`Zi0Q zL!^eJhOg^A6P`T~3k{+A-Z3kV-s1BKeh$-YRiT@o_qskAV76|+9e;>gUGY{3h&g8i zrd~#$Z_ppayPG!ZT}=J$a=6n8Qr_*Bf z?4XReDq$v!{p6zZ9@*)QRDLgFuBvBQ62#P+&n-}2c~cV~45O?~`WR6CJ2&Y~gq|dU zHDrETze%46Ko@QnY7q}@TIcXlZIhqE^!#SAZ4%|9otv>=VBWh~zsk#S#Eutm#6Xfn zmI7bAmHX}_0XlPwJ{~|jwne`Un;J%K8}zH(QX9u9#bV(&U$=dupH6N7;`Vz(XtGjh z{6@XgAHw+cHw28$&~AST<3(>mO~!ii0OxHGdh#fkeatB!wW3-*BTY>ekWQm%oAeyF z)YQcY+k*5cWNx4hS7kC|ltD$Cb(OTYgzhS{9+Z~7C7_fQg;E|pJX(B{P3Jemiov~2 ze@K~I^Vl~17T!S4?fTtD^ybtlfZ6}-i|?1d5$yKB^5eG-si z`(FK46iWI1Ao{yN6Uu1*E^vZFsBmBXy#X>O|s9|uuxbX(b(Puj2# zvb7uNi+xgGd3@NUdv%7dr{uFRg8Ta~eJWrtYKrKG3fMXb*f~Zl};nSoqAj;0eb& z&Dfc+s-|7%p@PxYWG1?VGy$#~rPQK*`v9%mqo)EayZ7j$(Ms{>Fz4v;p?)*|Uh|=_ zvhvf4zO8&z_o3bt54~ULZS42I=J37?ccDqJzS2Gdg0fP2ex21vRbS}W(SeWtWUb

h^w7fQ*CsGRtn{MBZ~Ql~TXf*V?9rV|r1=dS|L# z6&OH+D=LOlr$hP~%UmlhT@2r~!Qbek`G@f%f_0}06|vEb1L_((<%_ zWCrZgdjv|lOKHr&Z}sM&F-cSNGh>B@k~W-8FGTR9R>?|`S!D?AbIWjgKiH@HiMa%ApCG=7C(Rn~y@NKj8c;>X{6?PY z}T0qpt1`W-E6VPA>}(+v=4YQ4-j*Z@v&D)K;lxg9647oj2`l0babTDCz&9EtTb z>PP*w@&*k#B1mDV>mb~E#|(E-ZL5+#lz$YO#k)f_`9Hxh%W@zVk<};q-AEM5Ng@(( zf7*mZng(w26L)s-(u$w;5%7;OEny?B8F8l1J_03>?*uqacq5$9uf$nnhsAxUM;b`< z`zOHgl~KYk`V3_*0-oz_m`fJf_$aaE@mP2c=)1)iPO929DYa(DNyrP((#NOt{v4S( z@3h`Qd5QGXI!vBxVt>_pnAYc?(Hg<{*5h2v1{ z-L!Bniqo4HzJ#J`^TJP1EZ?&5yph+SYV&R+98l*eK5V?SKl;5?4Qhz4gPRSh=?Y!0ebZ_osbQHe$V z(PC`HqP}1?>HxJzZALo=p3NASQyLLoKtL>5%{Ws|;f4$#NNaywh)h$vJ0%MTx9NE~ z3BsP$bo`;tHy;U9&+E`cvD5O2>5dUX@(0HsGp=C-5B}2eCr%aCMG?mz)8rMOUX<7b z?S_!pw6_}_T+8OW)SnPnkQoE6!85LMa1puypQeKhjy`Og54Zg;uI}B!( zu5uU!PI=J6z$od(j1;PN7<|+gO1H0#@>esOZ!3aZo5P3~lA$6hn^@&ug9o3f3gfxB>YO%X)l~L(4Cm zid)t>h&ZAfk3xEQh(13G%27?t$FzRURt;}mntz+azo@)*6&}tgZ~ct@p#+Pi(neLc zHq4^g<#}=Bo-j3m>O95~WjpOmG@1itE+iUb@oTKtV8d`Yz>I0(bHqU0%o01(7fdSD zq|6Sn5pA?-^@yCx$Yt)jh)OLgy#FitU4l$b5y1wN z@dD{v6pqfwk?Uzs>%K`e@%a&Me?lawgvzq7Ute;n`+uN?NyhEA?OxR-a;-H?HUgM! z=VUS4>SQt71S9y)Wtkx7+)qr^U^ zvn8Q2uDbUAhDsKVZs1#;XLGV~s=Hh;x*~Znz^_a>QG4hlE2l!z742+wFq!-Dk7K z2{p|$T$NsRX4FH(tDb#8c!&hr#>61QJeCF=OTDE@luMKBof^Vhz!QfJW1|3%m=3m> zx4_amoY*Uz0-aQlL4gs*@zYK~t3-}lCmp;!Ec}^(VaWlTc`g!pzyj=elYkg)UXjKI zGaiS)0^*2*lD^(VO@+ND@*Pkn838?EU}FUgxo{#pn|EA%d?=Z|$TgZ(%G7UOET&0b zqVCn`E@6B)Nkxb_FS3Tk^%6w_C+H4zuPozV<_LsuIvY0w)Mla#0cxL#M;vxFoY-CA zK_mhfFq1yv6cO15AV*9aZ!npQWYM-5s;D6xgnbxpNQTctTHz?_acD&-=D{Tbr;-rM z>7sV=BF12QsarmO?L|j#;EWl-#v@(NU`Wa1&4`!{AWW@WD(wJji~7XBQ>jZ)*DSx3 zH8DGeyc)94c)F#iYo0e=jD_uQ-iYxIQRCUscu1wkR2s39v6&Jh!pV9h!Gt!cG-3i^ zp6ozZq06YyZe>vrL=WXIpHioe4G*%KJqJrdawAxBUmiR?ZgdlHa6kz*UP zIY516$H>(bH~*%@tQcpBd9pkx?Lb=l%92tb*dRVJCu38REy z5&)kpmzU!tiR}x-5*xsJ8>l_+gHUQT`By4$NMtTXcn@rhxacplQOU&1H8Im}h%t&z zQ8}r5CGrb7xz%x@IBW=nQuB!o5yu+=LAtm|thXPyg4hp9a$<}EQRo8;qzsaYvYC;? zi71 zR3{9A7aNhpQdg(zC#T-%G`C%sK^pIa6kqkab3k5+M z@Ig#CyL;sjbeR>*%?wv&bXR7fn~Y%Ev~YSb zE$9bkhhsCrU8M!nQ6rSY!MeGbVAgcBVwuiW`k`?f28n7YVz^3LFl!p#|Go>+LpFNI zo)*ptX4mT>JD7vGhnewsoH2D8Mv0G+4<*Prh%sT#PRv4RujCxti#2nwVrjc7uYu31CdhtZ-mjI5QZi*GV9liP!OXnl?3@F1`!} zfStiWTPyGJ%Ivn*b~shM<5llq#M|aAj1L%Jz;cX7W(cIN=b7RF;-I0DDGl0W%;{ut zG>C|8Kqp|Scn`XyYLDJZ7LlTWcwbjJDRkC^F?Nb9j>2k^V47%(+&v--ClW>q;fh zH&)CSFT4o*2Dd{^lt&Pup%>&?TqL>^J`!rv?$iC@h|$rb|p1RihJ@fA_`Y zIXrKWCx1ENhF?@AcK|q;=~F<)zz?w%kmP&tHd%%vwhe^9L&Q~75&a2U7cWlZw_`A} z!M`s z5`Z=MObKcDR(Nrbj4J0ms!WCgCqrn@0QKeOvc|UeX+_w^F#*t0| zFi*l$3qljqs4GIz|MDK`ky4t-Ju)b#XtGv+bWQfiKrr>L$!=liW#fa3CVkT>W2i?J z;v0xn`I^jPmJ|0{5eF98oEkX+z}pzW;>qAX#gma@FkFG~ z&gT8rsusxEm~t|Y4Az4Pm8FqzJ<&HJAWvId&q`G@9FKe@@0&7SKfuAq67CuxpL{IF ziF`%j1X^}Yqx4F|nq*ok?tl?iKqkK6j1g|NsT@p{cgNn0!yLe!MJQ?l?>*c?81UkZ z7RO(JPlhz}D8{ME=Q!>P@toxXYpW`^hFmzb2jgj^+d{#C#E8bl=>ULukwyU3y&J=- znPLO>pqEoCnP`KFRWsUM3|@LbTxWk|dnbETkpV;Q#G#l{5$*4gn}dBVvRz5Y~wSnu@#ArS_HbAOm8fhUI@HFY6Zgyy8q)0Y!k87Ky=$-ry}^- zdKz756ja8crTY9lcrsfUsh}7K6MEwyh#ZZvykkwCo)2g6hvRW_fTGwV6otbIf}%tY zkJbWH->KY(v@b84hd>A zIfs)kwvlNI5dS|2>2`8yO-N^|W^Rr@05vS%4FCTjfDg|4GXTr@5e#56$43;v;%X7b zR*1oEL(n$C+NXhc#xG|m&7}CkyH^bgsu>M30Z54@#KPNx=`tH87(qU|zz8D0s*U+w zX+z{uMJ^6gieP5raQqdpW5K#!#AhB3i^0szYX1W~mKi*vc-+a11b;~%qdDon=<>D|^G)p&mM+^Rz$tT;}*a_2oM>zPPy0peHo%&~}{ru|fK!*hsQ$e4U&vjfUhaZt0_LEe(5CWZ%`s zn53o@>5*lRPP)3K(K>U5MQ|6rU>pr%!3>8*-og)WqqQxK0=F6FgHa03*y>j+edHTZ zo}A!OMK+Lb!Vsmn6#CSYEe&s+O#gu(2V1E4yFsaO9_XLAZx|FQb;AQ?K@UWF{6MvN zhl2)1QeMEF&>a#81RR64?GfpX2D@hbrCOsQbv%d>B0fL#sRbr1>YG&DpmS=HN0lK% zgtiOKzC}q(iu{#=bhnVa9;*Th#$kF4Ia8_Qfv8eI<}yPDv=DIy7s7sAE%>`E$U-wi zkjyi~V>*Y!1Zbt=y#_xeT&2|j-Xm{B66P7a=&kKmw~JxfMD&i`ON#EhDUs8fyQR3? zjXi{=b_WsqvL}jUw&i!@!etqNBE79;7z!UJY;$ARSqv0@j^pgcEzEK=3Z$r-f+7{E zv{B@=wM=ag*8t(PV^jnyoE>MdFMsu}iH&IVD;5{6iZ@QRO8!RGnoL)UC5XNnzo2DfzuhD_qe}=jL(GLB|d)nos1zS!g(?8pQ?7s+q z*e-}B{8<}=z3o+36F+U&PsLYHbL1)QY2HA$m#!-@hP0e@(G+54JyQsqdhElfwpo}$ z%rZ?OX40mSN!L;L4#sepkS*?Dw1$Jm+RAeo@%7Mza5zFW$>j0`X3%VZ{EpfgZND7q%;9*Fq)s za~GotELL*58oBXjPFmGwrupW?-bSv=CD0K@g*2(F@c_VhrmMlG2k}(#4C4P+^)d2j zS~tUqH^rl15K`O6$fu3+!M1Kjsl5s*bX8Av(l94D$YRyF0`|pIRb!;Gi1w()>O=-g z7YP(pOroSth6pvarn>+P?8p4nvWH;+I*;}+t_NVw^bmkaF#%KE^Y?)H0M7sz)7J8@ z0h8!7g>;A+f)NBr`EIP=%H}i-o$7Ww^OPi-*~{=cAKjabcsnr8S<(xjy89aRI!3 zk8Lc57W1wAEXqknFy|KAm3Z3O)))g7dSN?bC+pP}3N>r(CtrJm73&My8>^MQwBnR| z9 zab;U~jb)&5jW9t{zsU2`U4x8x=TvZWxJ7j%WyaMYB3*xW(zAmEL}BEfW_7^e=$AnT zTfxmg8$=?!!A4fxd&q@?i!SokQgQryJ{NQ&g}Bpg+fI)UHm~DsTc8y82ReP_OUivJ*0|<8abAO+o^1*QGy*dYbdtq z8}z|YV;n}3MDuSwmP#Xr86l;t=8j=Tb2gZIdN?cx@M-M`<4QKF%@~O$U=Y+{q|vn3 zw(Z~uESX_|EDfAmM9pBsF*^&9z4>C~XX`Sg7q&EuL9)#XP7VyFLcRN+!4gXW{-}L` z{yoxYoAsP6;>u~>&z&;JkqG>IZlo~8?>mhOiFH zBIQaWT^efrXB76u5K6nsXpi1=s4M|48oWYor<8H=3aPo2R6W91oek)v^U4e$&uGIL z2V*07P9q?Bm!la}zHWS0bZ;|SjvZ~NXcp1)=J)l{wDmKD0ZlRt4oA4l0JXUq*Zvt#RRlcZ z(l5CkJA&Qqo^u6^10VFq(z%Asvs1+7{&&`yca8-xuAyfT_(YicAh8WT%V2Hj5YeY=heQ)cLvaon?p&Y+!O0hx}|{ zsUwAk)Llz!PB=X^&t7l*OM$D8QZw=)6mx1u_69sl=avWPhnkW3mQs~A<&W{ze95-npG2w{fcw(uP}>=@$RL06O9zhl9^Qe=$Bbk`(COeb|wN9 z4y8$I$WPrqJny1z>#VT|_ix0-eznK$y=BoP0}*8SFG{*QAq&3l_y8QP#rrmmoFs6~ zMimn?5oLIi!R`{rYf=JXbqO~+EJC*6+$-)bNO^1W&IlMgx@~F>8kz+YJr)m$z@G}$s5L;+=g^|WTpR6#tH{fw_MR*vRf5rC3EkKFL6VMXH zPsVreQ1N8rZY)ncWz8$eso68xuwD+4T~$$t*zLQj{sbf*MS=qvfTQ5pipu{pI7E~G z6*%VA{qMlRu8G#7GRW z?-hTVC^8$L{Le5E4gYsA0bl*UK@lE@gvmVfum27vHB;^~Zc{9GTc~d2XK6LoX~sB? zOK3*7nekolVcU`;m%5qNbiW5!1@tez)t5oWOoM|$cl-F-4%9z1!bQiHmUJfPyC;_S2w;^ZY|fi+W7CA*|bUZzU?_g>PkPs~Oh0%L$>UM-Eh-}oB7ft_a= z)9j1i_`g_t@4zUEH*TE0j}-i&9jS1Oh0E-s~RIyP{HrAY$l5AP+Sm zNK+6J+95TeiS*E<1R)AiLs6=<_cOD5mx$%-@Atm{+}`fa%+5SB^R#&i$3v8tX3GZB z6>*_InqYeqJ&pSgVi3?yFg=+7RIE_)as-WrJKsw*aiXm(Js1PtygQ|)+7hJ+B>!Lw zHJ4P5}mwQQA<%pajgk zKeyGQt&_pOU!%CB$AM&P;+@i@oEv0aOrI5~0E&N}*jVDqexM$n8wgAR&lChlbYxl5 z&J9J36%;C_rBeX^VmhQEdPLbkMt_G;lhg3y$ez^I+OE-8K#X zUro2QMO(fkH*$N01~qBuPFYWD`#Ell>wt)@M0Mm zw)pUioRKOM8CQm%CW7Jx@iR+_^PmM8wo1I%9~rg*K8t?y0PU6U9Wa9j{eWy%E?Q;~ zCbc8wA8!;yIb9>GQOnt&R2^XudwxZ749%PkDwa%J-4GAy_G}wZprFf|85jF{QI-2Q zeWQ@l*ygmUFv^+__(E>f&b^yhr^rYe@sovzW_(cuHI}$Iq24Ac%Cd#gxz)G1=U_pz z+d}wE{5&#>2AwWoirck2*H8|GnS zC6WJp8xN)Ehonb-^-A0YTW*L9%~iK!)q324uFt1>`qqOxMUr zK)QH=jXQ_2Oq*S>3&^7MSx6wA%d`!~;|^K2QqGs9K*${f;cb$iWefCmIfgl*#vQ}9 zh2H!dfca}CA!X#dNbqchRLU0GVm&TxwnEc`yPsMng;Lf+TU{Rx6I~>Ar&^sOLp?QN zlneFG7ur4t52_y(dr*FtpO8;tzO9_6cDBpCx(c!dR}e#SFa3^qLG$XHsqP}I+$3tf z2zyVVS`jys$-h&SnQYn1%yfDY*8cS@_B;kk8r#8&l_|#*;!e%JviW4avaf=Kq~&#g z@$y;h(1-v~LJFl{EwXx>gl#Lgiz@>$B_!H{SM52{;0GSrv9H*Ws^o?g*d5J6+J7IiBZ&17*|eI9oxXS{g>G z8;A7iiA#g2=_Fv-^NS(;{6GmyY*wrcBQjlm8j^LZK@c1eGy_W5^ug5`QHiscK(SPf z@|W0#qe9cAq5?9*%@`C&*N@$aCvWP{y|z8+{Ca?O<5F9L*joI%)!^OGmz&0Fcn(We zQ~L3NJ&^;gl?_qx2JJl5V3D-(M{!J<_lJNPB{qqvNTZhtF<|glAG`|V^?(4nw9NK3 zb~IwnhdCCEY7j5c4`17E7=DCT^U&Wb(NEvl&H)ZvR@my`a(jg>ElBXq?m)3;B~G9C zzf)P#PjON`(59@0_|p`B9MZS8zMA*)ouOUA2rJJ_Q&)*45b(4@5UpKhOBAqLIO3%a zRIA7x0o4}GHPga-wUOWXet?-WJJvF1t-eqRvQJW-@_saCwe7TFu0(_T)(NITIkpCH zDo>v>stM(sogR=eHnpt7lnZfON_KQvW82ITt30%O5LH}f3&eusPSZ4KeO;jyOc|xp zh2n&$@ITy<)~g(Xz~Pt+0rSdOVXtX*v!sX6=$%lcAQ8?^+bmq(+a)gdw9BO3w$pgn zV~_3K@QX$c1x_b@IGqgZ1Chn2FK?l6k1ZnjY&^%prC!IIEEmc9dtj38WdGilhf9UM zwyU^+5=T%K(Bc0^jy*w+C;b2wAScIPpnlpu+e*Vm6W#d?@vHamJy!(~;A=i>)GO7n z=wlZzDeH8W;>$68Lp^M@+A)4)eUuRBDeR#!m-?a~^?G~|+19o)lJ$U?w8R6#&fkdK z93HLd^g7#D_~fYdpkSwH^?G#rD1EzDczUDs?V|hj z@@yS(mzHO1hk6BhPyuzPdigen3+0P<*Ya&V4#Sr_u(G<-&pT{#+k$vt0-nMh-{$y4k(8Xtm`Ep4aY4%-In1uE0?r-{Ba_lT|7eLI3U zX8C_r0s7uW1t2h56P4-a4ZA-*E`WkOiJnF64WsCqMQtgk#zN4n1#SE&A)x z+hQcsm{o$0%nd0FqBqjK{2ia407f=lJ`-YDB~kX}Upml}leYWj1NR{b{0=Uu${(S~ zabr`YRavRyIo7tW*zG~nPeHG-ii%I!YL;~r9RYwMjWYk^9dASq!WyRmROA&oZ9B-R z+ZkI8SA)q_JrVZr3|3G_s(scr5xBvN(p$kR|L9rUUW8(pR|rgn&E5JZTP?o1hn=@o z!M%^R^n6YoB|_H!Sk1@8E3*_e6ghJfK3Ly9jtt>w@5K=3W4D z>PV&{L3Q0_gwfu6K8QXmvT=v)yG1Uli*%2A$b+A4A>dg`jAu0~3um+gQ4T!IM?c$m zRAT6#DEG!JO(h)n7F41~ezt|1znp88BS2?w|7?4mds6>mi#7i-FIbMjGy5+>mplCz z+ZPymL{|Q<LfiO*yyN0Q+>IYX=rJA`zbbS`b8$Cp zO${h0_305pAKpO0jWZd7!jT^NmSW%r~GcWt$Kj4UIPZ!I9H zN9M^haV|E<$oxFSgA@q0+yRj07+E38? zdHNjf@9mPmH%k6q(f*R%i^WM>XuKC2C0!?XZ`O>Ta=hftUNSx7;g8&@sMRGTuJmS^ znC#|0>^yj+2#T^pI<2J3AcHtxTb4i5xq^w4;%*Rp^S%skDa~*VR1v* zt6H0}t~Pnt@h`$yCFvxs4r7TRx?msQ|t1a689XVJ#&4OXZ`n}uV&UnUmL zsu;gqZ?){8Y4|IxrSHNq+RJnacjbP*9B$cRa9UC7!Ql}dO_OP`ILCNWVgw7XFnhBz z4%;~VlO>lCg-I5+k(O~1Jd=6Y4;<*dM0pt@2o3dCx_^eTYZxt9-p1GQX%q{Re8Hv* zJ{(qW;J>q?S#az{K$!FEu!w{)8rb&oeJywqGm0A4@Ev0hNhXXXCFl}m5Ov-fI>?;%n(Y)c^_ z#CurF^3Rp-g5|~UH}&SdhTJK7U8@}Hi7(79$Cl#KqCD$|%gXZX9b7ysuzXzhR}dX6 zUy=1eC#F?o@8fd6BCF?Bh~rjlvoHoZcY_Y zDbWWY)+D0~wfI0B?Go7p-s;iXEHV5Pr_DSR8Ptt%a^gP_s5~u4DXI?R^2BQG(yA_l zctEG?GA>rUS&wnCqCtH&4wo(U85b*hHeg(=xZZ#j;c~DcyNJu0Mxx#;jhT=u_;)Z9 z&~EmPH(@3qMu@M1v+o0gy#W3IQUws}1lrLUD|!O`+L(QghWa&OT&~#I1lzhh`88!+ zuISa2ak*k=Q}z`uJ)1EuS8Qqq96W*CnzR168{Awhnq$qyyNWFsmn#mnU|g<b zNH*iGjX45O2$ac>@1VGak-D5FJ@JORR7dIm8Z4Yg6Q5pMn~Hjt8_3P}U2%{fI;c?) zgJmqxUGB%wnthmludbGSb9m6b9?~3&d;Y*i{as5<8)h?H0ohD#fxMp0dK&3+YZgGSz3~9ax!YnFkD_vI zSsTMbH+r}5{ZJa)mPPPJGuyIvQE!$%B#4l9tclksr<WqJx* z9UPMm#iPlfsc8Dvclg_9)~uC&xSk(&$QE%C&wxK%ll2R z0?&PUKQv?viimvSqMG(^+({a9I3P4oyfcDY={P_Jn0TjX>xcKvCIOgEWV_-8)}{js zJ{zP;92+M>Gq9h2$p!2ZYQ&_hT_HFfOZQiXrSGNe;Q~n;GYKC!jsgpBjcb={qbRl zEa%~k6>4;t5W4>HdK`TVvuRxUaJjRQR=6~6^WAbm~MIeWefWic*>ypvF6vY>d;4^D=l$L9dnW2w8sIPk^%%k=W5E7~{Z z6nt|g^-E!4UBsglr>}F#tX^<^vrzvhiCINpY7H>D#kZRtMnZG}R2l;}S#s!13ga0> zpQo@GOmWN8UZL@BI)}d(^|AAGui=uZ-g1&}pYoKW;H0Y7P@6jqI$pyxh(+Y&J)jF=m_i(xahI&wJ8!#)Vl!YEqeMci!j~I$8!(5`5tRZ zZ@tHc1IRqNtYPvVy7nFz9h`19a1W%7Hueer=Pw!^=xEJYxMYCVT!a_PO-=q z@Zeo~y9dxdD8rvi2bPo;2V!L+y{{l}i>W6q?8)jG9<8R#UM!4m^<-w_s@yos6nfkf z{LD0}+>3E_HXG3!p{07U>Uz;Qudj1Ziifmv%jm^oJw>n=}Z=@V| zvW`1;wvhsA-3+FE16W_lK=lWLImvb$9LSnU(rSnIU{+589hHZGk;$grLs&m9hbP}f zJl1wYSvqgPj|QJ_4eI}XxS9SK$_7fu9eqAv$kU!pKYR$DB#FumV}l`3A<+H#*+H~o z7^{zm1xxz`(!%VrUi5qzWROda+>h8qp7g^5x`TkjmjWG~K4ITUhF^^&FNz7J3L{u8 z#K-9}g4Hq1b*I=1uS3l^g7tP!gG!bH)W>~N3xF$ zM>f%ok*p@dz($Q?t+;a1Hi}K>kF#b%STTRfBBdfK_bKZF7!LoGSq%$UIp%-L7Zd`? zu+2@QvbOvjDS4PQmq02S&3GIcJ#>Q8^6Fpxg!JgPPCp?%y8^0evQ=q6AdOFvH_1cO15Tf#dWz zHr9ZMc$mTOA0PpXh?Gu2UzNa%2m=$vU;|a{BOX`0vJzyf_!5uVr zqA0z7q9}cGB5N&HV|n1$d5Ez)iADOYC=}jNWjw&ZepN{COkxp#+v0>ttZLK_gay?m zOY;r|U#~eS8Z6(_kxAk!cP4?sOQr^sS+~D!Xz^sxwIh>(5WhD7)(Ke!v%;l7PcCzg z#$^6TK2unu7I`-Uw5-EmJhZIC{0}sEh?@~_ZQwSB-~J20#!V65$(bTRuzw1x41nF8 z!cx$=SEl|$=Qd2$MyWfzX&F~AN)bg1efyrCP8Fk!nZ~#+aIa~=ImkCZ4M+tlIqkw$ zv<;+$=`0=?qJd_9Sb1o0ytkLEx&3gxz_jV8F_LyqXB8WbwIH#9TTAXUwiwp8l?}@! z9KMVc-j=wVX^b}@(3RDMcy9){Y#|83Y$FPcwK&SBvp`AOObx$eGT;Br7qb?QO~ z#ygD`yvQ_%Sq{g@sFMZNw5nIn#1BeHXVqSFY+V!Ik+=#S!tGIag#p>NCXK3 z=b)!aG<+`O(GB;`Wjv~%&pgJX81ARkvi?Ez<~%mW9TD&jWEE_Pg{JC@uUKsz*p=z^ z`RpzI<{m9rz+N`xZ4{?Hmlv?H?h5pZ6mY#mu&)&gYRx=Z#+plRihP=qgKh;=t$N5S(dBC>Taswa*8m{` z9eyJ&Z)%sKH%AB3wr{YmkoNK$)*4VcPj_0kf(~#63kGq1Zv~i>w;ZV}*m()@HrcnJ zHbZE{x2y#)k2~mK`WZx#9l4%)QQ^02EZ)7hihbmD72%d(<8SB_Pw8)XhS2?0?3?a4 zez(AKtBRpa12-!yNX_tnw`?`EMyMb|OK!p}<3L$N4lv{0kurVc>m?P!M1?R>0f!Nq z$nBxa*KU??JSncdAN*8uKu3>Cl)GYgAkEKV*5I2`yus?nBWYpBaYSv9=PyE}bJn8U zwUXv7qIpY6e_rTK-9GZwlF}Zcw8x8`(T;^hXQtPy6iTVNEVxGg60>vAWq36{VhjK$ z=kob7mfbKS#$b1q>4W<+maViam%U@YRvZi5w4W-if%trl-dMwygYkK=25Z_tt=Hn= zZR)pHEcAzK!3JHX`s-LFT;A0#FJI~K}y7>A1*CeXR>Se&jhsTAupvOi8=#m0>BAS}8El zcbuzCA>L%;Q7DR_nuj+{;sICM)^-&Mo%Fh@L`F6B7W_K%7Ins_Vx1Iy8V1!10KXS`p2FT(#MX( ztx(%x`t!rKhEe}*EX?oh0yoatfQ>RZ4($nnhIYI>vp_x zD}yZ;6GXTB40cC|c2*s_pgG$)_L9K7`vuXX?a*H)(Pw##ABLK|9(n`=tk#FXSuO9`WEgKx*RZyEfzyBV03eVQGDSAFuHTU zrNnLztJ0)fJ^*9J?b;lQxwm`(MVN7fAZGn7pRQEv?61L8c^6A}4b0s&F!;Uk4zKRY z*BYzWsANnyxxky`s{gRoj96>A%Lj=8=6;3&rtOBDf{}dRCCmVe0b8mRjN9C%#yANY z&OI#9>Rb|{bnf?vVJ1{SeJq)9ZUHBNx9 zAFjjqfo>Ys$BV2F=;K^uY!`-j%qxe;ff#Sis~4qa5A$LEFr!?$+D>v465L z_WP5Kac^Fx`yKzsTwguNgBefluK?>}VHGmwUL${M`clMs@;c16nlB;LGom0+L0OLw zoTD%OC5D^g;?HHebC^{ytaO8Mp~TZR#m##sEF+|i7g@9BnCa~!IOgL9rMb%xYJd9? z7KL6XPxcIT{C)(-M2002#jV>BYUWC7cgtjIdX&X*`{H+lhJ<=ZvH`%uUCVLVA)_~P zGe7N&aJg>rx0qiqtbht*HvVyy+kE{E92=d5!IcXg+!M)J7)P9!f0f6tTIn49(Mo>3u!3qIgG4lyx*vm*VX8ZwKam~k#RtI;7I4pg z?iu3Fz09e|yEpPp9b@5s^Y$4;)IEL{kg<=9$AOmIsNQkL-TShY^e{6IeB=h}7}h@^ zkk|2y5iu&qjuDaj;BP8tW*P;e!&#P`kx9}C(MIA4(Z=Evfb&i|bb>W7?v&6HS(<+o zL@_5JH0-1nCvnuXlRiGl${V&wbiobzSz0a{ZKQLt554H#DfSxq{K!0{59!^Sfe6rk znpN=@;p{;2CCgy4{m4|qL{v{3!M6q-HeVf+xa!l=kFAA0!HP~8ls^vHoY1<_k*>poFJs*0jh ztR2;hd+1LwrYocc_QAWf6x)49SK40{yg{ z@Lt-pSn-Vdon;;-QOK%2n1Tn=BFZ=mK7A4G)GoKROLQTW1dAl_s||way+W2M9i-eN zJwG;LWm}d|`UAU_7J59ZN`s1@MNpRf3~}inJa@-j7bW^sr5479e)wOjrk^-P$qs24 z&shU$eGeI~FxTXz$8|D-Sc-H;S=LH5Brl5oaIQyE4_S}d>CAcYuSy*R0urK% zXfeg9kVaKqQbg{ub5~fXrz;lltlV)}$U_>tXXW9WzO?DXxqjwN^S$I>#<)>~tE`dt zk|kCip2#F$Dy9)vSq=Av1{e>poz)_!{h$Y4kPVD5>Cc_IBqq!HPG!kVkFT;A=lXyz-;k# zb_>sgsl&T7qdh$}hecTZi~JTz7YrgJ6FcfDTsUC7J2=$rXjRO%g2TzU#g0SabK({o zkIOr^8Bgw8^r(I`+|3%i;<$91t&m>GR*>7d!T--}1x=(b89(}kQLTKWU|7iwEZitH z-y@KA{0>fbr9{lr^cpDk|EpvKUY3$%1ZGMiv!8kMRLMO77|FIFI><5g9!oMvZjSR0 zaB!^|CxbHS#>xEODZ2Uy+F%ei>mRH+zuNv_4?*DGddyz;5p)aa-^2;mn#T}BSJI8g zP{wf^Bp8p+g_>KszEq4WOI8@-SSg{3vb65I7lkuKW$-(?vOv)5oGEGW5F$ixe z>Qxv>&rC{1Dald6tPJD+f%83;D0jX&lM$%iqQxWCcc)nn1YsJ18CW|tk!U;IS9^jL2~nx|{fHd2O_TFMgJM%PNDg!z)m#v2!5JD61TE!C!)~9z$eHplS#9<3|tFSC{ysq}>iXM!~H8i)s*&QZgCa(6( z3s-n(kQx!nP*A33S?OmYpbb2@)!mDBMqnVx@$zRDd~K z40@kL@v#bbqwX22GzNSY#VQqzx#i@8WwLUkcGkw_SVbnN438TVtN`N14 zHP21{@)-6y@X_OPN^SU|*C?+<`z)U9Ttz2DwLs0*c|dt39ITjGK1l@^M+DKr@=6WS z%%+lN3d<|yG{%D;#m+4zuL?>nSeG=Zpj0={-c*+36dG7TiQxH%CRI?vO}xP~&`i7! zEWNdY-r|aq79Zgm4xTDkRHDt(PH6{E?JH^x^s1=r01T>D0x3v#bgZO=aF_Dll>zAS zbg#1V3f4!9DoP8`htXA(;hawVQ5EBKPm+HwL)mdN1L>veN;?C`(0O{}e{!>nZi59NJP3z0IMk^%N^?J0DPbo*d%m zB|p?u;o4HERi6We2Gv*iNy^Z!XzyMeL+5GvbH`IuX=O=_fE1V28gu`&Q5M$R`@ z;t?-pEDhcjj0Bgy_1`0Z3XO8iXrh=5sC?_fz+hV4Oc`qUDv075>sagLq*8)6}04ZY2@sGY)X?kc^abOt^d z^$H+8p02*4e1Xg0R~2r>jR@pf@|`ej%)_q&uO&Hd;W=Mb^JVk-@DGE9237GI4e5-dvY(I~42cm+>z`)DfAtAr~d%b`XQ^uvZ~-jwu? za@#Qe2S=;!O0XM@gx|C&;{mesHY~nN^aWF5H0Je)!CICxuenUA9ktTUX>q0{iv(*V z){lsM@|-E7_*5y_(#Wi*C^AwS>1iGG<8YMMd}_Vn8EK}1MxY+$Re*W5V~VP{O90N7 zb^)B@cBNM2%FPw)8^&mP9-xwR&J0H8Ljj++52V^Xl*p*uOfx?vEn~HM$l00Zr)A2N zdFoxpg1hug>fJ-B1oV*J1G}grdA+Z6LEqT>%3PSHK6ziMV_0{R5_>9>4SAbrdr#$C zejU&YFz84jy+OnFrg4q~+8K+yF6}TWy_IV4)6oO}JL3c6<;62coaK(3q1C;?Id7#S zy@9{BP*5MGnY4>K_EFlxE_QAoCD-`*=Vr?mO6sdr)&Gv^t27dSi)dS4AhvT<)E7iL znZo*EX(v;|eoC#-t-sAld?w%ZkiQ6$$2{kW5B&!yB1dJy0EPP>XAa<0l7a^+?_(?@2P#v* zK9ncxY!*u81}V-cVo-)z1gp>$&j98>9kh$yYD}Fd2Tmb#kP-(CcHST*+b1eZ9Z7U-Fjy>DqYn|wj15uhfMwDn&gwy%u}Vdt zS-BRlK+X^adCCsb(IHBA458LgCDJh4L9Y*0y6B5zi<`bUa)&B4&}%)&tafl-3dW+` zkuw<|pwn9^{sX0@?-nn>mdA)i=x2Yj_ECc9!6YTd6BER24p%@`^k`V`L5g- zDF3{R^N?>+=47RYaYu0sJnjl6E79I_w`shkr+k5uCM!YlCA7k6UhBdU`ue4sQ^43= zrZ!X1`HvmFrznwH#z#9nuFoTapP!`rOcO1L}5_}zSkOGAbQf=Oz%KpBfFcWCo`1<|e+ zV1Xo&UnXeC2Kp#d`2j{qa+Z?jzTaQIN6DKyh0xM0C4?SjDZWUaW?l#y)tNqDsI(QJ z`OIHF`9PzqXBGnAE~9{KrMz^2>Srr4<|FV^GvqnV4qjb>57BCsU$$o7@ETksWnHIE_}gU`*U*A_!e z$)Yif#b91tqEs(Q-mIa=&zC3_AxVwbQ)W4pCYUK#um%g4dJirUo9xySCF0Nc@!)F3 zkLoT3Ww}QwOO=t}oC}s>>ETS;vYnnU1ti?4{xT)bE%z9f=G+cAT{0$l)9_^q3n^M+ zmG>{PS_9-9X)shHk?{ezr#s7(#s*xgFIPSX`dPbNxr3Qm^0iXV12wDxedFCI_t?@9 zI$!Y@6W#b)85*S1A#AI3&FVkY@|=c#19ZKTvc6FgaU@spjS>{<%q?1Ke7;=ZJrusg zN>MA6P^`O|Ixxaq>u#3Trmtl=!k)&g_O)D@(9VvFD zVnffztW@~f(SnrxN)JAtW{er<}K?#%v%^uUafeVdZK>|_5OMC1L;yk4wG0N^Y?hQQqy$eLady7 zfokO_T``wwIj*_fkR#@@I0q{sm;7^;@j>-<5< zq%73{=z~eQm#efl-7}!*vWy%hiqtjAXcN{(+xQS_+(?b^U#^w)kQZxfC}6GlZo9SG z8p;}+7X{KZX00+DVHh8;RhpHW{FNo&X}?aXTK^OI+y4O}4uxJgWYOVawNxuZ6t^WH zl&=OquT@%uZooK&>oAMM>Crlj|6__=uhcN{InOOM=UwT$^@=YTk~I{!Qt3=F8$csK zZ8j)TnD}*+wNk0(v)l1vpG%4x23gZE|>MQv0( zoktR$$T7YSq^RW<#fOqMDrOj&epj+$HS@E7*LiLdJ#Z>LHltYh(iiD zu5|O1H|zE23CkLCR60R zlFI+w@%+DbJf9kEQW8y^p56VP25rJ#OQx?k3E(>b{2Dlb)&P%D>@M|5K8oGWQ3N*c zA@3>a!GG!g_odoGRG2MFU{tBhmrhXcb@rI@wm=dDV4rO%0jxjNYo(g$MCn_VYMpw> z2mZfxWUpoebXAwtDdGCJC(ZhbdeH6jdp^G znMa@Q1ft$RIXki8*U;siN;W2D!Y*Yy%&=bBE!1k$b}P5>sWE#5|8{5((Cl@p^S$yV zx9j$lf5Geo(fRMe@QkG2zE^mtB2W2}n6p89m90{;qs9-)RfyLVc0eHIdIywFQj%i= zzl%$fZ|IN!%cb)i#R5{mX3+S+oW?Ugn9d$l7NDh14q=OeUfkB}M7!$T(dr;~3=Jya z?bEITu(_S7$x)?^;1=fk%j2GEjMTKFKq!MK_b3!}KV-Ti6Brk`?@Ki1L%T3mymM6P z#5E~xjzRskfQ}whu7LmBd|VM{M60K$6)En7(v~Yy@`tHWG`*wUmu8$$o_p`w1VswZ zE&NELBW5+kvGydyJKom$AC*+J#ZDkuZnl*;Tnr7}Z> z^(c98G>tif)qyY0J)<<$?6U8i0qAd@Q3|1J*?(5);4Mz9%2)%r%>PD$8c%Ht75^9r z{*QHl#XI%fPqfv@1H^t%sC)*>`LK|)(Ny=GlHkiX>g|i}a*;n*llD1>nd(emoYNs$ z^Y^Xn^6p!yoyDf|?m~_26f&dP$;+7x|)c?7gUzbu+>_Ac3%}9W#m*cjwUN-xfoQxT6g% z?KjBk7}|HgD_I!YTXz+U7}{(@R(dg4syoN#K{FmG-(rCBLovYohst<&EP{4VvEN40 z=%>m_1S;zCOv%?*K{ZF~=ZaA>7V>2@tAn~P@>iq0Nbj=MDU`U?Gn8qit-UbgGK7)2 zO39LHb+$oSlKQ*plxD{}+n|n=7C3_4R2a@0sIR+v0ZX~PQGJ;g7fX4gQ5CTRv6QPK z%79vG6)!hX(V6jZ+c2Y*WZG|5M{oy|Z)kwK8bUS?wUgoDd0OwGev0X<>#4$LH`%ex zOKr))^W0lKsP{>15kGq9qke?p5As#x(b^1ORW?k&Kqr0GcW_(BPfY_4zr{~If<~tJ zi$)xWENZCaTJ8xHSXRBKfroqp)rD|vSQUs8R~>r-RZq!V8#Uj6Tc~DzHJEM%sUM>8 z9>HpyVfh7m9;UXX!@=rseB#v*?Guwi)z{H)Ivu8#H{^*j`FNclj@Mu!cF~kjY^92k zDpvz`id11Z?^qD2E|v_b619p}Tfu_;^JukQ>9P9IgJ|_P{v>^bTGJ5`tCp3FcloS3 z60K+mpL;h>U4sS#;#Ge3(ls6(yl|d(FpR#8SC^p&jmv3(98q2!ifwVLyxJy$Z;Nk` zY*s^M80QgvbwpB9MK#Q;KwI<%%ODzDL5(iAufQoJ9(5Mv`=|8Er`!r^TeSbEg4#@= z%4u5rfsi?0uBcX*2gxV&x|*~Cp8sUY-by{_{K83BsTaSnrlLC3bcXA*PGw!FRTbQ1 zi%Mz(jutpY?NaN#}=;J)#dRiVD$T3Hp?7ppXc0;{MOe4zOaK_Xde z3ex9MzDcc2l@ipb7m;8h51w? zz-?k}l`{f`+NDMvwYvLT@)ZLDZB`3H@=p1xHcx?2D(|7Ob<}v+<$KE43@%caUq>Ar zDs;7)p|6*GU8@pgxk9hhRqujJXkJe(Z_4#R#bUmxnrbY>j(S-6^T=3VEf47=p}zVh z?zU=oKi9`5UO;ObsMTNAPJlm#*rJ^Px75k}@7j0btmSb8{JReMnob<&uZzRH9;D&& z4b`|PWd6~r1dYrK;#Owb!cl?eK@p;`r!)$)dFO_L_=(z%8zm#peFQk_z=+DPS6 z^4vzMkdjLzoEjO8)mHvoLiUll#Qz=m26qH^IUjP9vMBT*Aq0qSnANJ=g@uwj;gTROO=Vil!(6 z*N&ztVr^tJ1C}_lg~~Nk|8TO*)TFsuN>&+9v8~iN8rWRra>^HO8d0pJ!}VVcr@Z7e z?LS zgWaE8>XV$^pRD!Yx20x0Mt%W8;^KhH(7#el^K=-+OsK68$Md|IiVP7lP$R%$f>eMZT5|4XN5{;AV5 zODg|!r)N1k4bN{~IGm-|<3Ja};cu-}VPYrb*_AJq^m6k{qL*_@KJ;IDIrmS!oLf@) zpL;p)uf3e-?B)9}s|iBJxwMfoURELFP}|n(FCarz+vs@qq9i}Nt*K{5x4{mcPd~N+ zL7YcnZ3W6{)>eJfISr9s@>iug$QROA`ll*U_IFBnx5eT$B;du)=l^X>EGgA&ioB$x zvTNKVw^N1O_I5i}liQA5ax7@4PM3fJYrLwqkNRx+3`YXm ztAoHhjBT$z!Mo9~gA#6_+}G8{xV!PXnuU6k-@u43)4?~u5R9Y`JE&Ip{$_Ll!*Z4` zc2H|0u3c!7TGPUp?NOu?--xUc82fr^*n-e`NxMzY7gj1Hc-)fYPpPL zm76CzDA}eWi$}8BQiyFEX_F1asW4epfPh+bR9m#sus3X%o#^{xK5kH!O#&{~a@H82 z?@c;b>b{7+MMdE6T^-f9c#gj}yGjCo3mk$|7H%b?DaZ0JUy7voPHKobd#P3S!!bgO zPAaz)nbt{-Gk?F>D#ziOqm!C~XFe%vocHaGadNb!3!2VD;9oU}+NY?V<`w5da01kY z-bn$oHH;>tfHh5`z|H_1ju1PmFM+Y!O{sP@obo!W5qNmEv-&ka{CO7v;-y^#i0^h0 zAgIjTRNN%xk~9?hKB<4RK1Fv{8+-kz^_*++7QU@=V~~q)tNhp} z;vID@miVD})W)W{L72I-e7S~EMXXuS=_cK==10=V?r3`secfHm#DnhYFi`9P@8X>s zt$tT+Dy^d%?}A|FQRI7SO>q=9-A&s8)a5PRpp_iZ}UYOgxosGI*;Oei>E2Q z)lMk7yf>O#M?dw(LfJrxebk01(x;Ew$meU5JYIJ;LJ%%PeOLka!CpwBr+omlc@*1M zC26F?(HHZI+Zz4VS(uw${ncXaX+HV+_GzIHD09Oat^(vC_!Zt3B-TFvf zAR!dPluy*Hyh{7ws<5J&Jse}1O9jJKq302ja?25F2VNgCT~)n4<&RWvA%a=%D7Dxy zW;-qXRGq->5UP$=-^1#iG+JE=D$sC@TF$U#m!ta_HO!^!1kIW!!bmu+J3Vo)v1=7H znl)d%2F;r9eE#2P)`C*arpOCQDwoi#xUm||YBE+88qZJ0s+pyTX?Cd=I5Ew3wjnw; zdXckZi=5B@TgSdC)ohCVRY_%6$6U6jPX2PSR;4t5xtOkerfTZs%sUi2POZve+kRXr z*g|Q$tkk!lwEbM=O55cnpZqUO&)22eNRhuTsqE@6S;lLCOc<{Lve)=O0rJ~YEpR}7 z>uf^<JdJ z`<~XOK}<#r&NQ{YVe$`DX@dGL-ydI0Q2X-;AL}S_BG9L0q8bgoQjLk&Ee7g25vm;M zUMFfYdx=S#ArMF?)OODTDp`V_mY z!*mG1<0N^DJAL|ed?+dDkb;vOZ+{7FhVM?8q3*|}^GtOZQ0ESK@d9=JJQGx989kT@ zNo_X8&%%Z1b$-d9k7udeR~h)D$bc=yllYx@K@I;gEn@ zBiN^eeXE@oy-OwBb$=2I?O;i@|FX~y{b@cAl~i`kC*2@zp_yj8xJ+s{TWthFFm|?1 z2uiWc$7Tzbx#}D>)_gWE3eo+#QSuy(2=t$$hNIdSbM$H@dR96$2ZJ9(=DDC9Tx-f{ zN7cFN-yETz*19aL0Q4yd%g3$Y?gl0m`Ar_?yM&etLGK$6#MnrHG`ARy9g0U*Kw$sxiP zXn-8GKyGu$ureU6Cl zi@}V3ARYq&KPc(Ze;LlhQq85v4@)Zl^Kc$%RZ36ABbvBaP2?wzTNkTyob(sHeNw7< z-rFZyZ=X7Q`?TbP|E0IjN;Q`vKP##H&%J&A*WNy-N=tQe@!2KEyGx;Zl#(4e%fJEx zU;esWZ3=7f&y2{TJ0h5xe62Fz)Nz!ZqXs(Gd=26ZYO?$z} zSf#?;IN331HTD|X%F0nU;__y$kk^*xs(d{x^aJ9$#V8AkG?`$ zTLRhouTwPxs0&7U-x3Yk+SdWuZrg4G+fVC&sB*XSC`I`m(&UvAG|3h(_TdIu|Ik%*;Yk9zYM5Eu`wt#+fmyzOo zG=B@Uy2*5Wi&`gY`WBNgg+}NXIcu7Wv_3Dz{aIDRkDIZ^|PBVXv)f7Yt(i zR`oCjIBgpakdo-cHb_^=WZAApxNRI?iK=f09bHe!+f@~h*W=D@_jw> zK(?0ZI7c*F^{)E}{QJArH+#SeMV|V| z0GrhTJ24Ru)Y)S-hL-PCyJ1{zyHsxPJ#v@YOW6DDG-@``Pj}(;up@oATWzTe>~Q4w z5jMv@mF!V;ez)okseShgJw*{sMp`y+z=8-`uah3Ok9T zddU*Ix??51$lEX0jp+c;_(*#5fchrBo_j!z{`1$*91vgkJt&UQ5)P`Vn1huE)%sBQ zoYLDzwAPKm<=~*8hQOlZwDYOUI^&G?RX94!XN+_t0Tvza98xQr-MCfLS;RZM2A(hz zwIxRD52@Y68aXa$K5Z0vSdH*rHQQX@00oVYY@ozzYBlP2SZ#)$d~+E31Dxp{0V9@7 zlaHv=a2Hjewrs0u)SOEMdbtZ)6eX~WT6ZFGa{fMUG?Ck7?fiGkg|-x^p73jfy$g=k z)F60qm0mDjp9LMs(l?FB42Y$5kF#rkIYL zzo_4$ZC34!P- zwL7VH<%==Fd(PM_4yBg21G2XV#6q#xA^l5yjtN>H4vKcz~Najv`kz?hYv0rzLe zq0>0j;>Ap7L9l_w8x(?4@%^4B$!AV#rn-|0L8+ck35`h@=z0NCskXeH zV1OH8Co`=`?S~j+MSX&zv3H*dSUFjO%0H{saM<*`Wa0i7rfQ7H-=(#YB9GC%WlFm; zySQ;7et;!N)vCb8EB|M;X;}^$;6d2ASS5bgG}c4`=f4bcl>0^fL>LWaUQ}~9KryKD z2483KbOSfb8FLw=(lwy*r8?7zc3&1e&KG*0G(pL|<^LdJX{Fjok<&^lyNK9d1~kDr zARdBP<8dbF^=Qx)9Pwy)0*Ib049(BJa_V&DM z>M;1`P1PF=p~Dq`n+H5m{ph9Z5EheZ)OE4neQ*5heoq&jw1$iQo?bF6jqmu|{r>F@ z)iav!_b*+=|0G5JdG|lMf!$9#W99nT{gz_2jtS8ZJmr~G>lQX=_hJx};uEnvy*u?U zhN9#gEiDGR?LyCaS=|)(&cmO>DCwr^qg!&bo8pXm_DvuIVf`CIM{a^Z-lnRzAZMl; zslzRm`w`5&B{uu6TVk^(-4^^#=53Yxuw~Q2+vvg{w{fbGM3HyYdDxbYJNmYKT(T{F ze#5qWcEt_bvc+%MmOqaR(6{AM9Rg)v+?F)@H&_uJ+2q*$n;I!u_)LGLPbUVyj4apG z5S_L+pcZ$bP3lM^?use>`fsMR+&wX+-S3GhExz}!Q@T={(u&q-pzxKhInr6lzn#)4 z_w_0L)>Zspru6iEOzDr$HH3cqKGe5}R2K9AZ0RrzE{FEsQtQ*m2g3T|&;#K6B#L<` zK)zN3`S6FT75H@>lCD*m6-;X%swvpX96i;e=8wR+jil^49fBP3f53dHG6&v@65u)X zE{1WK3$g{hlMg?}1EVwqa6JB4kiFNQ2(q`~iGW#~r~eAGEu~?$#r1`MhFLt$Hf}$C zfjRODTOuRIfEZ_YE2y}U)?P_iIQA z&SO@99VQU7+Sy|@r|Vh$?9)r|*l+{(%Ryp(7p?94T}R=Wehk0wdKo*y|+ZJkjDb zRe(^lLj31`e^%Vhdtz|;IF^woJ)s#WkEOs)##N=?4E8pd+eU8oLs(88?sm@Czu|8G z5UxbK-0ca{WV+>U=Z1LwjP|N9!<}uk*Tm_|UL!uej{Y#(YxpeR6$4IB?xzQd>J5Ba-X!^3r-p&2A502k1nDMlm+1?CCInm!yXRb%*h^@*<{-3Vece; zMWLSdFMzKh(%R`>V>^7FC};Aq{;{wAo!NiX|A z+_mwxS2OHNqYu384fyq2Z~Mz}utL15PfSHFk|6Z1gq$6f4VB}(t-&&imG!ZMh|**q z`%uZS!Ph?7V7RcIruy3pk!7c^1)&c!X{N=_V+NeI*z36lI9}poj^L{kA&dg-bsEn6 zU7OB&n80b`Kc7yd-jtvJ=A2GGxwl+*Jc|1H-)KvKy&k;Xe+#h3<14{sF{;xvpsc+M zz`VPxy@}wBoM7fUp0b#R_&|Gzt25I@XI>6O14wKX2!LLs&4Kp%t^&`*bUY2jLP)0S zLH5po_-8@(A%OV(AbTz8JE|0HpN$dc1&a}14HhG=5n^wEckhSTn@g){Nr=5JRODwu zumhJ+-%xv$@$N6NmTzcss9nVXZim{r-(}M9CZEOs)+uDMSxiMo; z!_o0%su*EMEa75Gim)Hz6KRdKR}{+>ixOfSrYt$q9w~i6{UZgmr$^eOaQCftcO=rz z^C){o*%OUvH)Aa6)H2FmU6&CqaIr!&PFwDj5f*8_&N0>q5ST@Jhh5HEP68upLZn<5 zWseu^!dI@6r4YANA}shv+vCks4#$ds7Y(EB+_WJr8gVPhlSy{IlFg3`FVqLh>xC?5r7#o8MJj;CS)+~IVO zxAQTDTI~!EKe6Ir5@lHJCqoWPaT4E+8zqFJ#T6QSU(0D48)sjr<9KQrZ+96^b%?j~ z)42_LPn@#Y|G@7KZN$2@nxmw$3%}E$c)Kvoxe{-0s`H|bgmU&&jp80Ip}1T0+Jeh5 zXbre1u24<9PR%RWeSx3bSFm&a#O@0AURakkD%!coxvir8@3az?ppeLSHSKEluL=no zP|2=woI6~_v4l#_ElP8o@#dQk3?dBl=}LC4n=n_lbNiO`%3`0Mt8C}i7I9U8eUhka z6+1T({kn>HSX{*(ix?EX3HA!$1nVT&H398m2`8AAU@zzW=sT;H0%F+%+K>QTagA;! z*sJ?|bt1~jV;OnMhs_jF_#iOoueS5DCX`U$s&-FrJ#ZAX7Fu~acUgsRN>w|zPAt%e z>eK=LkNH0Or};iwQrR`%f00j)X;n(o^J98Fs!+|I;FM1~SF?8mkaDVVSUC*;hq^D1 ztD<`UckT+@3tYIsW#@vsxPYd(rA&LSkV{!^=*+oRZd6ukDVBRKkjkT?;*w?MS{7EC zTb5` z)!xf>WJjxg%GhJ#Av9#is^;?`(&O=JgLapXS9SjPk2!Jw$DAN*6D8TJPHfji$;Vfm zY{EBUL0J>v2IzGW-D#rKFX)~O?3H%VfTqey=@11r6J)Y!Gv#l|SWxF7r7c`P3I;Y; zB6xJ~+bN10iui&>EtM|ZCFDvgo^SJ6!(q!iBcBRoVt~-RiMiqkKu1s{h7(o>iPyo~6X3 zBPUk%pK34S)BdMw+Wup&i-%a%>s1qYkX5}=ZP4!WjjGQ7KKq;A*;k3sH>vdDs#Q&D zr)(ZVN@-MlNFh-Va6lC0(6ibQ`Q>h=F#Vmfe$Dv zIQy6q#Bbkt9Na+>z4!!J$Re8agmMr!UwTrxX4tTZdOrosFDuA-N^$6;Px2uteNs4W zd0LqarsC-iO2gRoHRUOKM#f6pz*HX*iNo_(&g!5v1wZDfO{Vj_%4toORS) z;hyOw-IZuaxQl)AGs}2liNqeDH)+(X2iodKz~UZNXZ)HTV)>To^ACP7a`3@jK>MJo zb0yHIaZhdep6aQe@%a3yJ(U-L*5`U+C4Z;R&q8?8rUaA6$JK`98~-4(eqhAd zPsC$v{ZG92A8e+dRvWgv{ApF^%9-A`yeqXX)t7fAJ@p*6J{KzS8DpPQQUUiZ&tZRj zFq0~tQ?7bJYk$59v{BCs@pzs7&IjBXpWQX#&#F5A`-DHgf5M;Z{Wv~qe&^3u?j9Jj zzpVBW4(u<*4jNk^ZUe{#Rj+-JJ+z_PaNXq%Rh|ER&R^X>=dY-K?c&f2~q9KHbFZ(O;B3ZyTWbR!LGbi}$Ek{~MlOsd1S+*`W z%iBMq_zVbJJ*i6uWQA3z6&?gx;q?q5KYY*cT`UTdBXI9e-tKjZ8lZ5^|3?GRB8_ei z5UPZS2Xc)Iy*3bX=9JJypR(&Q~k9 zIH>ggYHQLBo~2@&AJD%#=)pG6!D?f4mk(BTu3T3d#kL5|%uw_{bEE9Z9K#y);O&K=kLRioP{M60{$ z_VPhW7g+vJB0Kx#t|4T55lov#xxliVsx}k8nNInTys0o2i9id*6YQr#{WT9*{;H_j zh~4F)s?PuZZKt&^)rc0Ie^F`X#VZV4uN%wgR z+Dt>LVJykHOCxF6ut{cW^fLI8gVg?I#9qU3w&%-`&fcRVFDtDLKkuZF!OERVOZ~-a zv+YLhh6qf%q)*x_od1{Ayj*RJ?(*fT&Xr$Gn}%qZc6f-!4}=a?L?n&y7Pwlie>XZg zRLtR8)i4i2#fqzq0Uo!ibJZOB4AbWD#xP(z=V-T{ps$80+()|Wa7-(EH%%X|`~w;8 zolNC1k!P;dCa*Xbi8KB=I+&?6u1xDJ32GGhic$*+u1fTmY3Xqx>%*B+#9r{fK#cku zQNHG-R}`C2XOvd9hAetl%GKohLmSY>SCk+t9g3A3fbtxCMd85$bzcQFTDCJt_Qk!f zuL=s4&+mQtd5~OpR2!4WQMEKG$5VmzENQNR*>&#aD{2~$7n(P zecuwNNY}TZ6GW!Vx0EOGQ}&iP5!$~kn)H5KC?Hn6En5Ehw$gyRWi9h1o+c4)Odp8P zbqvEFl+iyfl)8^mf<#E_a#S?x-qG3MUUdRi@teHZ&<58ZwjO6koMHePuL2lc%1%G>o^@4gRR(mkh5|tR?SMh-#xgso3>3?LQ~UZK!NAM^QMZlYY87wA9EDm zrB`G`fkdmGxWTSfZiOo8O+5FfB~5EP$=x6467{^ZH@8_k5N0l~F1mDbX9nmm(QC^06#6`u)jo`eHqdd;D0Ef(0c=hd#v!MV%LF3uV7)+sPZWPLa&QTU3iKu_B z!jq`y6oWs@#p}%oFKAg>VzeKfx^pL*3=;UK&mpkmV4am znoz5jYN1j~978|+L$54U`r%XdFI2t& zQcqr_3`REF`r3ZB=PN!YB*kk$#jl3Ds7bzJF%FXxDd;s^b;T8SRsNQPwU8tOiEoEc z-|a1H((QbxH1^WgFPfu>$2Ur^u(D!HqZ&w&=>y)#%u7qwkZ%@SC}X4Iv_H;M-ohUo z?l9X(e$VQpwf?uPG^5|m7@H9|$RG0xg|cshkZ6qIi_SmiTJIfiXD;>M2vukWWo?Ao z1eI(*dnAMwCV%ZiCpRjoC{(9>CYeDKEHcFx4G*Q^TaTLx97~nDC~Kc%l0zLxKVU>% zGlTp=wtk5+XLgg#?L>Tl+lkt438=lMRk#zB0!@FIE(+f9if9tAuEU!q7)4|G&uJ!D z1^UqJWgx8SbbOi8OFB(0K2VBH-_%6Sj&*5~&VqK!Fu(ElDEK2N?Uqr;kCa5~mOUuM1HaI>KT;xmD~~@~`;ih(1s^HF z90`{+v_%KoWWQ=i2q^f`*2h0_QoARc+Mct?HvSOoroQhVNSL?jSzvX2y-pR-wGu07 z*a}6Y{-3-;(Nh1zp?l{FC@N3VyVXHStHVPm;bWx~K#KlExrDuF{Zx4$Kl49T zcpR&Rr{OiFIq9!YVL3`Gh+3(1<~#Dm)i}726!@1l$^gF8lRgtW{m5rxrwX2*^}VX^YWpLko1SXgAu(M;lZLE>?I92^u*YcHgPfpO0%8Wcv; ze)ZUKdaV0zHMztbMNO{uTc8oVr%W65o6x-%WxpfUh2nAF<3=Y9|76GD|C=@Kcy*jm zd?0Gtp-_*dmd$qa-8jze#-k22ZTThx_0Rmm?9^qmVzHpYodZQqs><2z{vb%Uptrmc zsd7>B&c)ARQPZwTW=lWommh17(@SHJ0sgh?CQ7r`;vgKB*)rB#1GN)JlKg{GRn^SQ z>!opvA6WJK3*F`aprAqrLLh4=YyB5W@c#E=x})NKtoHY)tS$wX_6Z+LzQfl*aT7w7{EJnTFC&PGV|7-Jg|Od|I^Cj++g>@ zMi+dEmn?zdD>%6yhE^c>(1Xe<90Y*&(pV>@Eer{w@{Cuo2M@u7rB$IS*l`F)9xjq! zb@H=4^{`TaE(Vfj&4gX*H7C#HG?lQO8ymFM8S8z!TN_M?zM(6avNhE z)b<#FJd84qDPw8#DP_C21RV;s;nN-K!G%z<6djkF+|MtszfG!3&)4s2r~YG09n|&a zEjtc^*dlP)Mk=1>anZGNw;EAatjCYXQ)jff1*=LCppT2>ZBZ!sRlnRPFKxaQz-195 z*1ouWdI&|IhER-*z^9eOYSp^3PJ^w-(kwd-i#~=w4W%mrX3i+RarMO+IL;JO?X%DY zrqMHJ;W@EjW$xgVnv{PQv&lq^=ZE1`d{$`#Ltvxdp>SD2Ykr3aev>MGM}v*j>Kw3q z8x1VoWd)@At zTk3pIIDK&*V`b9W^U4RnfhiXN@k}~+0Sd|<)c>NAXycVbPtG+u#vQ9w#*qyc5miqd?$(x`<`1kmlP z)7nzuG379K+auCnbeCUsb+^t4{J8`$Gb* zY%*1Hx4&=JF~ctutE?ez1oh8KvGI%a^T6U|e}Mxs zQec}~F3LWVfntV#!HkR|snV&AAr$bp;&0e(prY?eQ0`)C9}{YunJnR0qXjGTCcTN#W`jsFK&WTdozl!y4pLFbI2l=qKf zH|;jaLF6v3-<%5nQT(vYgXvo1=&qF7=~TGUHanKm!~9}$^UT=znQAmGE-A6n!#6>m zMWMaX7}LK58^K6Vmna`&=)A(dk}GdvI7Ae8sSn3-r?J_5+s%wS?Y^Op52twQ4PtPnIc)}&0C7t+XfWhT;i$k zOsXO4rF;|o_z_S;mOA+x&<6(w%A|+z|M3Gu92Z8kr9HPm*tU~T8Tiue^h6ot{iQ@@ z0RK|jPzE1{?c}@-w~y`g^lj|3r8N7tc=p9@<$Fx*tvgB^PFxIf2(1e*L-_V%CC$W| zjw->L>Yq~lirSERmn-%t(NwR|<%0whUVjw+S^ak25{JXWavTUo+E=bTfy2i|={@g6 z(Y5F@GqtV&8f8?_1Z1aGPZ>>W1TQ-_|vv@bmkoIdN*D zWSrAcoq>RsDBAk@Ro9%q)hw)RH2wVaH4x3`n#RzllFHegFC}#ps7kUyjYlr{ZU(i5 zG?k_r)OT?+z^L-Fk_I_};&Uf~do-#q4{L^IzsB< zRAMlm3o4QG4W83tlNyI!TfDsr&W55_eNJ1PfhN5~7AIK-2){uNkgSe5-F^K89XjzB z+R{^ImD8Cec@=`rj5DimQ;+MAK{9B#9FMILS!SZp8_H|QMiKOxEi`wMsWGj+9%!Y5 zHxv|vHLFRSDkNFd%jRG05=M;wI|w+}&)~}2`?%DAx<)u_(%R(}c6w=LiA%$8H>F;> z9Yf@&rt@u6@ynTT8fmyyo1Y!^ZR!_Ndci51I+Xi~nDXWNPS|k=`U8kYYP1r&f7934 zEn6P4htY0-H5hzPk-z$wB^zbDp+Q=b2Z6m^fI3k6kh;F6hSS#pYAslhP6epEipaQe zsPggh9JAeK(dESfvW>>YzvZ%uav+XjH12>al(NTMdXkbxgMk@tzl}P6)?3k(_Gs)3 z`q-+*;%r{`_=S*y<5tzg&*mZ@b)#W|4~;vQl1h#}epYJdP?vzv6*|b+LtU$iZrg(L(XyPoOGo1+WTbM%o9J?a z8pRa|QM6=GE0@!akN+bLtp`N= zjh5C^yV?2ol-H2YeQtvBT&l0Sc@Rj=`s#}qWl_}MkyP=P*^k!MSG(ed)IjAaqq(FL z)Flwy&F}A->754ZV9U$OdO?~F20D8bGl@EM$rGYLV}3mm5y-XmW1)|mzri9xJf((e16a-7H+H({ z(S|Co#c0bS=6DaYB$Z7a9m3V$Ar=FrXW*`pe|QeB5hNbX6kEk&&WD%>biHK z9rfeRn|?eVj=#qxS+rMB`9tbAe7K0p;c7V|#q=;as4o`rV#$MBsr8WOQyqs_tZN}& z5v}2H^;g*WE9@fV4zEa}*HYAr)xIRA@=KP1D#f)@pEfL#Ncsl)+P7P&KXE3+1g1TC z;5ewjTC1t>NnO$!Yu1a3!ZX4s$@~n;O1D+I>8yJZe zhPGI8VA!8+1cp7=R^?TTa-QjhfiL`JqJ>}oyNhNi1 zydRx-_Spz1vk+N=?mb`0YlE+Wr$}#S}e!rSb%n6FdM0)!P z!8f8>y337$Mn!rLK5Zndu{h|U1AP-}-nGD2N2Kv_D$Jc8O!c2s=V@$JN4gf;GBUSB z;UYeYa&r-X*i-6q{A_J1uDU+0daH9s>wuNQi#nY>(mfMm)3Sx-{5jV z(&FWXq~B6YPR%1zBBGbP+;YXX@Vq!phonrI4=X>@I6W{hv~~pfxP5 z639X_gXGduGUjEDms~>h^2#V_>1us6AC<251Us}ZUG0FY>0?r4GlL3ZhqThWtZx~V>v4><$um!ICsfUViCo65CgZx&*}op{L?`YJwm9cO&up7sufh`BFhZ45F*Q+rO>8O+H3hC z^y{-~1eWL;9vNn#C_#&Q5nRgw>7y&{&AEW2($A?K4PUzQi(A!%IJ@}9+{nD7hw#_% zH_bBg3>uOT{{CVX<@Hk=^6|DbEl1&^eqc9H+OfZyk16iyuX174t_iD2 ziW=|hFP4HA1M8Eaj^-oMx{SD!WOHcuVUEnC z)dL`BOr?;4YICethku%bFey^ z3ZGNw7(R!wr)|8;$1J~dAjmNtR-6^XU9_r~`Y;~lk84sBWT2v#+RCsKkJ_3;D0OP0 zg|^sCvGmIGDp$hhKd&~$aSnZc=ny9jSuvy*{bJhzlUM$dhq&0X_sE{dXz}aMyXlcH z%hF8#j&)&F^h#hmvSq59wH?=$#%AC4QbCem5u2^(W<@<3zPzLkKVFuEwX8-4b4Qej z!@x@f`@Sl+(d1V_vyBvFzU9tKm8DplCe(83XQlXcWg&U)L@48g2B+VFa<{KW9gWx- z5c0*&FhFz^!vCuDQXjhfnmSaY{x(W~9_3Km=afOZ__f>zMl61o<&NM4fl^=RGtSEy z0M6@|31xw_^mVl!pLTLzH9R1}>~GUdbApfB}^L)`1PPsqje&?^9uO2P5I(;4G ze8=Qx95YG^b$m;0Qt;>yaH3dqi2_+tdny^K9>6F+4^vmsuj^8F3tPf)lQZ!B?V3hn zGB370bvsn6*qczOt-ax*xX)8~@K)yMDN{5Mqo{8|O2|A1Y&dJjK|KOmHtxPNumPRC zRT98AT>rkA;dEzx3b!CM`XZ%awSAM_@RrLCfQNW(Q55qo^fucm?OjMX+v(O9DM^Nj zHfs1~N^4wJysOqST(Z-2?Xv%PahbpGcr7UmmQNYFODL7GAYgFDLmV1G?g_g3EtsS- zNNa_Y)mn6|qQoa}%~mO#8gEG9lxW`sXrD$<>O{S9=znb7C6jiz9KFQv8Lq;Qq#KKxjg^20oi_DxZp0d7IftqyU| zE$;coi+cf%rS$U@NGMC`iuMyQ6fT{oo&;=1oQ)|I~Al!6N6Z>f{vUqG2V`#cQtXb7aPW7RnN;5~JV_psg4 z@=iJydt8Slp|sa+GE=`-Qi3RMRS74NLDTO>0kD~ols{c<02IhQY73`p)4*b$pAJb7 z6dZ(x4m-P z567mj#@1c?29>DGXJ8M*${7DD3b?hOsb)YIxMZgK2xhgmL50SJK>_YGivyd&vcaJ3 zK^{-_x9|!-Il#-EYN`>p6>RqbO3hJUrzwEzo4wpXVUGANTKDuJmcb~Eu7bHJ>({cHl)d*h{+g%8lYN%=M0Ms% zV{3y9H=c#VV8oooM*x6cP)0sAUyY*Ov(y-Iq=x1%*#UH?dGl2y*qW`5!SbK~CcXLG=Y;rYztKWUSv-E&k9)5vP17nWNwd9FNn z=c=Ot(gnHdJHX{QQqw``GD+|mhY6E4k~~+9XD_)Vn z`HO0x@vEt`G=NUBYpg4;VOyy+2TXm9`>9pQWz?ioxoT~CdzKpPD;&kZo{XSI^TlMw z&Igvl#+oPKP>pJ@zT~Qz2!1DiC_vr_g+&P{ya~ zlW5H)p|--1!bx0$I9e)ADOJ3q4Q7{kU%`!g1wTk1ZePcq0%avQ8vZWn7iq7 z%JBYUSO`VEj_tB{73A)>;k_7tvcgSetJHd$v=Bh)hWbuwyIO39MXS|+_$XOLP$Pf3 zMtv6MN^Y?lR|c^yaxIvS&*|y4YP4k*CqqtgKL$tOCqLDYp%$v4m2!o+6(Uv(I8N~` z-gf2{wvqe@ThL0I*QyEHn?q^INKXirtyKpAXZo%ahvTVrVwsXZQwN%0u#ceFeK6Ur z{Y;I;0!32S*~260@@MLdg7gJy7`KHFTBs%^-MQ$840I_q%m{)m(f_W2zhSuX7vS>O znLh{WaN2Oj4PFS!U${^WX*lhY*42XM6ZOCKt|Cvq+g}z1RAe`NJl%`bWW(Nz)NK)@ zkiC~_@gg-MbPEzZwJ@xJB#cmZ<6`{Ehz!`hNbRRTx`tE_{Luyc@<)&4!@PmtIr(Y< zzM%7BHMyoXh}|vmaCs9>sEr3|YrZoW+l_0qU$Pj=&UCUb0l?1Fuq6V8EtE6D3W~Qx z?IRfq%9ntDlhO+km#HtAfM2;EsYhvlYI%kk@pcGy%(;og7mIz$Ytm@BJPDX5P`SOi zrJor*DY&0|(HX>@s z{CD0)m|(cNeB6)2W9`*K7`oB0_YClp-lRHTRAt?%-0&c(a%*)j!|q;947zIPLG=tR zT4DyPrk&w7g5KZ4Ht^{#UwOu2TJWtp$pG@Oq_8OrVs`&X*m~m|P~q}H{`BEyEFj9) z7QxHp@@8yOak9X2)9wu?HQb_(z#cZxzNw`lbh0+XcG{vg;s-`tk>aBI+tnAS|5h9! zP*h}mJT8RBY*nB3;e>_zZ&JpLawnX_xlm{($X|)n{yXf0h7h`>%-n@=-N7;9PtR=w zmV-pUw+-U`+w}c5uq2BqXuB#5qx;U?2%*jM)Cl@!yV@OO-tnE9E)E=9r3}}cDtg}b z<>;QZi#C3zHs+k|AK$^AG?nZ-)cQaYBS?|0S!rCQV$UGY6)LeB&~(FJjE3(}8$he6 zAG(!VO+%&T%)m8gl-|X?}K^lcY(G5;RzXuGa{|Op#$hh%hV&mUieXU@f>2@ zuO;V^5NDvqgG%z>*Da#B`urc&#t)5@6SPmLRD#~~2_SS_FXHtT6iU#Xm%As{G0EE5 z?*m7A-LYKXbeK^sF(ar(sq;^2r0LB_*v7x@Z;A>w$-+9$4TGQ{m|PvoJYoseon~aZ z_LDjXUY{95-g%OK*`;pKPy4*2ccpH+-mdF+;)sXdt{!cE0VdzI8Jag#HPN*JjmqJz zs?>PggMxx~3$C*JZdHZB$be7{VbtHZTYcIEK30Q7m4(72w3vG!>8I2DJ*om?TCqnx zhO1+HVH!-Mm-eaSaP`MNbqC@CKHCr7W>5NUztBtj98kMjm!F6iIjs5~fWW+#W*t!5 zqQ%|=IM&xv(}QZ;$`&IIs!!wI=7SL2kksuUjLto%<{|J8=PCV=TF>-#2+rNqd38eR z{X-B{;pcitje*WSiq;kPb@^(>y zs$VxNJ$(eUeP_YgBkFz$@d&@{Pl=|XM^(EUDJpdzyh{3Dk+)w%QmKZJPQN{e@}n?8 zt)g8=AxEWC#(|VfdTuYX8_lq76&*-v0xP+m9Sd5`C3{&YB^^vjsI;BKlP~wnwgDI(e3@S9ZF4}P#rKc>k3r32mbdkJF6Z^qPv^x zR8RLTG^O$*WS?b$Ff;#l0!PWri8xA1DB`4=Wm;pBgYtv+HG*1a?MXG*v^fl3MN9U> zCFs~mHPT;eYLKUk*f1#ezBiTDG1@6(!HN*NR@kOdZi92-w5QhlR*G`5RoDmF3}JQd zYjE)B_lw6u7hP-tX9{JtHgrXnP!r{cvjl#p@Zs}e6kS{vL}Nz6hh*A{GNJSs`(}9r z>59_4CK<5xZhjNaf{Ry!2|Sfj=7UomyassHEqy|)Fai4Ljz?a(y=X(dTCHj4S-jG7w7Izaw76vepwksi&G?As*o*?|K#Xj(~V zphecyqTqDg2JkxTq8Zn#I%rxHOAXK>a)c%m@T8+rY^V^&Fy7`ECd1KGie)c`{`9>; z_^-h;oqJ@|#n1QO)7V&+iWzT-WdpF?O>$Vie3eURZQ?Mmw1SCoj3H48U5RJe_?R&X z>=o>};sn+X6}6ITvRIg@<$~d{Jl>)QW!7Y`g?zX!7DMk?8;j$RM*yv}$~7t79fZiE zTKME1oAt-k$JG|VNUY>79^za&xBBHAg)e(z9mXAJX4YXz&^vCa z!y2Q{)jFb2Qe~fpzR7|do1uOiS68gXow|%C0$Eazac_=|_1Jr0Gq~mK{UGodqbn! z2+#d7#E05X^Y~Nm)zA3SV~K1WXP!(lg5`ItLDlC(mY`vfNu$0Na&xtAgN97#_2A(u z90t7_T@&RtWHQI{uAgOuab5;2QO@wvFwV=^8?g@B=tzQk#sW2NBR~X-(?;xB0On>R z#@!QB8?yxN@#jZ!t3#nQx-n}Ee6vvz-HxKx<8R0N3i<)!m`%lv1-OPZVY9$fNlDlN znbakTO&06tpw8JPF`<>ZgK8{w5M>OHK#_`Mffb3#Of#xzJaoTg_PW@p8`p@PhN6j8 zAK}-OkzwymTGo_xmS$6NQ^wOWjcz7ZDz_QyBwig(LEW>RbgLOlGOfbNke~6Q5v1kO zhuAcH;@*dt5a+#sF*Rp{fSf~`vj+dl+pNYzaCW+x-s-i9-op+E&aP>7j>aO#2!t^T z>vfE_idMuB-&IFzA1$(Q)rAES4|ymEkR!I*D0+c6dHs~? z;UgN$W8`;5_{cXcSmPGpcHj{3ANqdyclEv+BV?3uSM-fbVS=CRlEPf^XV;4v3i;Hc zvp6truJ=x@CT(s31H^(9CfLVyDXdYOk+L4>_HR%VOq6dW6U9STM6EhEcPICYpkdb{ z%#_lSIbh(cqs<>~Li!x)3h-LNOKqw9JExcR#0@{hJ(@r>mLviX=C@?eqp$94fNAJ` zHOB%T(CBEzp5$k_36XT;)+dI>+^Ze1$PLA~5)gkD&1?k>;-1WW&!_HG0_fWfi$W=; zHG9}_bqI7l4MM2Nh_3d6i>K5;W8>` zB(_Zeq?_V(qn-5CCAG1Lc{^;Cr%W~g3!bCvm(+%dC+3AZ2FiijhuFm)a0hxLM!}e$ z-zhxqFp@)zge2Ywbsl(GMIcAD7Zx1341JRM;0HAwdnxvc+R5_4_xox%rqb{$YJbFl z@4Eu`)Gz4H6_^uBY1NytEKK>hen{+DsTb+)F zQ~pugKdz-Tzh=ZjXz2eu)=RIU#7nX?=VBgySJ>l{k`D}<(f zaE1Cr00-_eqrA5~Mj*wO3Vg+Ix>}*e)cgy1>)>sP>2K399aJvB>&}dm==fK2ny@gi zO)ji)&O)X%a(&1Rec!`YSmrpx=Yq-tW|J((X2ZaU(%7?{}I(tqn ztc>SPKcWw5eh{`iQ2wpj7~OHDZCG^H;B&vyCs01Bbpgx1$I9ATzCY?C7yV8_KCF$Y zEJi+_zphSW?3h1d{;UjObq2~Os=cQh0C$2~TUq?rlj62Rl}}c^`M*mOf%2(p!*$2i z15CTnJ8h(PlXz5hfLusV`Lbm17mW2~8%=-4$fxs*2Q<0o3qk_rGu2+nzu-&_N^bIS z?ASp0toI|%>hrKX80>$qHez@A_o~kS4*PTWeFQbPv1Z;+7;0m4vB|A=)&$AGF4oAG zhBScK)Y;A=z?NR3eXZJu(O5fs1~h&@8iB?e{DEORDa)Uwa=Nh1pQ&C7TmX`fqHozE zaOSB%_5u*{gFtr1N04KLJyN!*aTuM9b^Fm82dnF=(PjgR8|(}0?+gUN|4W;%AQOlp zVY4y2+#tL-jieVDIQAfL>}m3KIGXfMf_GOii}TkI%7n^dJlRK^U{=rcMT~rt){Tt_ zq0zz2hRn8;f>~oT?v`>XYdey$2eamwoyEzTMgCS~5x&?iP?G&cymm_p{IYAv+lr{0 zlcmPyqPl?&YfY@iJa3D6!fhdq);ZZDnBG55_7K#0^+T}v(`ZHrgM^%)(@g?6zYSsa zaqj}Zx17wOEK%xJkQ~Y;N{0FHVyRbzNCC+=fR1OfE;wtT>}*TN9P{UF&$tOubK++bH|ZIstU`6;1RUw=7uLq-s;ztIP)?U~+1SGdH2skJi2h z;r6uw24~*oILQxEp)3`Jb^api+m^H*&j(Zpq!!vZ}VaDr637QuXphY`-H4=7NFA@RA&Tree#s+BG z4v-T)8}$Pvyb91F3A91GdzDw{`fuAXK-To_B0+;7C3fKfNoU%zhL-JHkb3_*g|=tC z!AR=jygr&cKzC^5h&H`F``nOaqeoKN_tK#PUzv^I7N4Kf%O zT^ujh0rz2-;f2=$EWFf#CDi5D5#ABq-rUgvvZmy%A+JNPhG1tpbYQJSBvN$AKz+opL%ALQTT>j=nek`7d< zm}y+Kmutq10NE`LZv&#VU+u`6H-8?@;;S{Qo|EUUs)Yf1iV#r`>_kU>33fpl{h77| zbvm(z?S^|L!4Q1D#fY`yFVw{!aQ-?3!7>WYIJ*;jnXmMnPOLfK4jJFH zMPN>6=Ho4Q-?uYs0E16GZN?hM4aM636#D`8k$Cy5i1E z7N|bqD{9#VH1Z-X?84wouT3pDKyFkub~k)kBO0E@+&vrfyV#(O|5x*DQZ-h0xk+W$ z%6TGdC=<%VH@j9%Yjanon7#^=o6_Pg8VwOZ>zh^uw83ctXb)A6_}_Vt0J(Yf$uzI* zS~;1@bS_??wGbTuw2HK<**%fYcvZcMbjC9`J^2haa2ie2es(;=lA&j_%MVl93$Snp zc4Gq(6x2?8m!4&ZV@73A5a$R30_65pQ|m?>y0OG|D(u#k-5%uYwrVG~rl>_4DCUgj zbPl;u>KO*<8G|_E?)|2;?%)A+n)iNp_9DLGc6WYQ7DV)5br9}SklK?)aM!C{lw&hE zDeDH(OTGCl8xQ8=&agZ}q?o;4F+zn8AQ0G0K!=b^zvR>xMw zoCo%XLGdr9wlA>CwB;RNV7x4am+^-2;XyuEW6Ql;z{`(US}yMAe*@%0-f#CZl6KtE zU`#h&U=6&`sMA|OBfGbN#;V=|8nm^;CTGF|iaITx$A+%uhK=zSj9&eY=fxixFlX`ZST$@7R6xmv~8KFEq( z)4;1+3a(XkzJG&xDR=SxD^l!TktYV}EAqz%dVLUk8c^Rd2-(|OpN=bm& zlxEr0kovDS`cwac8z%UHf<*zRnRW6hWX3p!{XBeZsqjBWE{rfLe-q~!Tuk@<#UiN7 zNX8>G^4$g#3~$3nvN-US*&~_ooc&}ZYsteXOtP-vMi_-jQ+)#ep!dBq5}G!+Lr08a zb+{5+9>rRN>21u-EVD+jw%AyEN3ply%0lvOCsfKe+$OIJ^~tPLo;d~cn8YslC zzstIqW=nABThbDthrP$Mp;+!+<5{F1VmUQR=AdiE6%ph!fxW;7S0}JrXw!e9P@a#T z$R5MhmWiw`elGBz0pys(;_cj>N)LfEQ_dt7?iAsdz+3KlxpYl1OgZ5quLQk4335#j znmCCi+WEs96XM+#$5vn3JHQi)U@~Fe7Y3ti13V!#e-aDKoy>fM3uhJ|h=L{qL3&W~ zWE~zi*8(1S<-t<8AI=GG73Z#`)$FZ(sBALx7-rO@oHKReXv=2gr4kM*Yo|cC74Ab# zcn}5hSKL%A^lpjj|o4yhm{Jr zPaE!XpUzO=lJ?$;GCN1~v}vpX{~h+hofz6R3(ncAr!hN5_+}dGiJ#!nGe2IJ1Qjc1ByX*0#M zNi*3v-1N<6JPzLo8*1{=<%kK-W*&4okj);0V%I2#P{x%*A(WKEA}TE$Ql;;T$aO?A zF*jx9Fh7_%^n?Unl?PVZ8~P;)2bSVZO*IFWtvO&NxUYsTcUU6bMlFdII2n<{a38Uz zfi8Zuz^uVhf`_Xmzt7@)u562!f2@J4Et{{z`pECxaLX=Sjd@?QH>^S%+r`7eLjW&; zA^&~mbZWu`;!4pPBjG_bEt!i*TE{Hrvb-nZMvQ1l?PoC`tKOfw%wmn;&7n&O|Mp$? z7$U^{*UVzgu>;-O4)WR#OnMd+q+iUP4TOD@+_OPu5$`dZ)%>49{ON1~VqJ&qJ%|1y zh+Wk!NhYssfgr#+n)t?HOP%N7JH3GIJ%`05f43`MZZ2R`SDUq&uZk$S0_PLWK4Oqp zA8~V4Gyn!G$;vP%ZJq;m8$LgWF-9fe?#vN@OY{z;oqPAr_Fn+k$X7F(SRoj1&FLPA zf;MY%1+@0$a%kmJHH+JSz(;OzOVZx#bx64P&By}K)On8&k!H^|2p^(k=%8lk={y0h z){S*Y;j^21N3I5(W;&wY0tokT+-x-$z|fJ6`pwl)a|UkOzB=vZMcFV=3o7c0V`A4_ z=Bl@rV_?dE7`dfBvKJ%$<_W;I@;3cn0=BgnjstedJdp2Ew2}Y3Nr&e_an*y2^I2kI zWdx5`$be={oF67lrr<6GnwwF3l3NM~mV)8)Sv?-dpK}=T1S|8{qyL7?c_$_z#2|J7 z_H3h-_i~a4=?R0qtE>2JbGosfzR> zb!l-{DfhmhW$?bJLJGKdiP)QOO8huC@aHn{(QudTg`^~1KY;B7c`QDFp6Va^;{(j@ zABtGcVtMkQVNvh{OJTj{Ho?gg&V;En}(wM*#3t%J~T3UrH-KVu@P3h%@inv+zcVifhU1 zm1oA!3!&H*(4*$mqQP-3d7hVkD>N%CoUWc1$r9+y3YHbL=(Q3km$+#X+5_#sT&tmLq73O)sQtDLulQnu_2UI zr>;3<{uIRY@+_)5D6$2dplish;Pv$3Ag4d3fGZfs*E$_9(mLO|asG3sTIHR8x@1(M zcMPKRB;2}<5`c@h8ueRS*FaUiVUtC^c+IKb%6S)jQdhsaHvhAejq-v&L-hMay!T=V zf2T{lO_M)m5uxkL93n)MPsP%@h7CV!%c$R{EY5!YqE-H3QW&&SMF=N(>3tXVS1!E=~C|BQ_hSaa+>z9tf|CbJzh^8JEy{Q_h@ z)xCGTt6#i-kjqs=_O8EOTYsmv{;^93)w1#R-*(dl5>!MPg-9qmwqZ0k+T?`Bg$GLV z-D{t*V~~qFuV-%ig|puQhkkH@`<_WTTV4#Knd_PTo`sgM&5*|@1obtTe_-|fB4NKs zhJ0684OwiKhM1AqEcNgQHp|RqgCfOdK`KIhvmoVEZzCkE0sjk~uL%y31aR6}yyN8-^ z=v?@UwJ~#tTOTTtTO#A)XBW(r`ZY5Jtlu0ZEL~Rc(g0O@yOv?1p)bki_Yn+Y9cv2w zi6TWCGc^2wE3N&qeJG^O)nBuOfW=d^{ua39&7VRizh-qse;Z{^d%{UE-!R|0=f91D zWi3H!fn?AY`P8>s53S~*Nlz$@5ESbC4RhE2Rex+o+Vp+*G!^mPa$7XbY2UIYlzU%( z10xagMrl8O8^zT_+E3q&EFvmRc2=IJT&)3DLUFcRz}DoXwyZ6s=R2Ys;1KwEBMZbx z$F;teO=6^^P4I9;NT1x2hu=@z1WiU7eYlCG;OkFrV$CgcRyl!C6!9%LI_d1=LCJdPp#S48uDgbSnNGDPg96+LLtcDAIUH#N0CkKSCMC#J>)*Sm7w zORn)$l)N9gtwWHM`sMFf>XPDBeWO`Dfyk`7bKFD%jjuoUSvU`mm5g2uK7pHLcMC<&mVRZ&O>xhJAFC7o^@Nl6Fb zoob}n2UutS1uGFa6@u-D&kU!1ooy~MA7l%`Gc7yF+C#E8Ab>`M_})6m)&NI8ImCF5 zE)z}uwjyrPQ#B!Su1F{9|{GnDL0yBkX=4ueUpYwlZ z{*`=vjY>U04H3h#{a4}Xcu$ZKpzP)EVY))-%DTZp&b#<~vleND8tu7ahIwt7QC&yS~X!UmR&#tL8zjO@qsvy7P40*7q-Emx{Q{Uq( zDPZPQt04J^xs<0&r3J_FQiQV~XT#7?J|T#_5vNIViUqo`6D%U&pQ%>iJ^{KSUztiD zoe({apMZ@oo#d0OFFGzh$uhZrFpqM|xOuA{wLc|vSe;HWkzeHAbh?prz6uZR|frilIMG1E&Yj7B=5S0cV6Sam1OsmZ$R> z7RCKKxthouNrRLd3SB${L-_l&?pZ*n@aM!)w0GW7AL_H4t+)SB=p$#D5wL+%YtaY1Ktn*QCXh>Hgn>Ku34tpkr3Eq#y&o4$cS_Tu z{jIWA^aRxwAdWiBG0my-TTxtC4f+HT9#`v+4yK{67xI*>NEV1Rnbc-Ka~S?`P;#Ff z_|@-+7P^?E@d|R@hGB7v63`*CzB2pqGAUieX|c zEip#GIaUCk>-%$FuXF_QO-jeO=UGk7E8VCa-zcS3T=p23MKdol?vO5&{o%CcBJ-oz z3qq6L`~qvq#mr$B*sFXKBxm#qp+2oupWKUp3nJ_rO-JVH;xc6T_z%Ol(PHmKfwbmJ zUI%qvuYuZK0`egUe{x9}4ZXxf%I2I)tUWgx9Q}vYa+u}CJB%Xy!2wj7yMrv3;iZci zY~K4^7`uTM)Cpsc>KHEKUh-@ z5;{fl$&F;SXdrF_x_G(}GBS_M=>I2cXVVfhL4g3tc-$4n6WN@HQ}h*E7*F zl!|8Kqqh7BGt5*9yvkm}({>G!F*xTcYc86ES2i)znXBwmylCb%aT-KY`ipNvk9UpL z!a;EMnm7oY#q4n$1igx(5nfJPivjHAR9MUg@vUw`;#LtVk?|Lc*FHoKRzm^aVkDOO za`$$No2Hk&znytt~108?S)2{BN;7MSpASQH&}C6CQM$Z1Jo5Nfn`EC6@cC1=go@gFdfKEL>4DneM8WPuWslOC?}`#hsl}_ z#B>v`H#e!tP57K{q!(`r$j!Y8SZ$<&n=Anb>d~7l(z1$sh^J6a{O&MvlrUZ(q)rJ4 zPNh&-_0rW^HjkJ%g0<3hY6lNIU;kVzyU8~T3%BugnUqv|D~z&k!$)f>9k`8P3M7xe z!+PUq%pKMe0OyfmBEQk@JFFWTC6vS3ww?Nw!vMFP=9dG>F4N|6ShGja)gWx%rz^mE zXBHq0#6U@!I_Gy!J?L`+Bo9yM(M0=6lRUL78#y_4(R)4~H_ewkew^a#DLi$G?;}Tu z1K0qHzeVzl#h0cUJlrDlmcf&zL#5VT0I?Z893YL19zkV1Mo&`!WWLd(r3abFSDW@2 zJ&);-Xh^cj6N9PuGojCe;(<~YZ0d%*R%8%nXirkn;cd`{N0G;br zPa=NeeejJ-sgDmJw~;3Lc$#p~=zc7fy@jU=dat5=KAzV#oB>LPdJumwBgGlwBWtQ= zNXa~6jGyN%HI(|)*CSBsN1I1P4PCXti0bt7#A}1JqC~r=Ij7N?ex6vA7tZ$ctOiWm z+dMq^-bkBA7{jXd<{pA|?4H&E!nB2QJSLd7z?9}REDEvvz)6L#qRf*J%&>c!MIN85 zrBM%u=yPzgNw6>u{QcczDvtw}|6}*WXj9ori|3j{DAC{Z9LU>ve?WXW75IA^nwCrQ zclldCb0J5_9e>Y50fKYhiBM+FI{!@ZCZxlEHo!9zt8hNRlPd7|ds^2UqooFV`d~E| z1$t6|8ovg58f$s+1tIv6GHM1nDZ$}s;*X?7Ubk{{Bqe9TzjB1b!?PjHaCnk=D47FD zy^)F>o?5Y3q20Q9U$ap_)ZU}p^|3}ZgRsIq=-D7o<7!l5Mi2lzi&h1BqV(9_uC(~m zkE{jmU=LFAA*I3b@;Dmf^h6^_cieG^ttUb~ji6{t5#~m4ViB}DT%>N&^1~;Fcp?F! z;_0Xc*(=1;i?g7Gb5FUbZ-~c_4uyEy^E+ETbwVjI)YG4n9VBgYQDiL8=BrSTu-zBG zUKYk*l)`t|{oG#nFb}t7I{KEnC?eJqMn}Rt+{U?;-}v`#oz{DN==S&}2y{EeELP-n z5P^)@E>CNYYd^a@+(sT4u3dHv_qd^=Fd~8^zWgvxkXve|$>E+5!~VszDBROrLy#ct z=^x>q4q&=g?LUM9KoOpfK$iIt9vJ{X9^uhq%EnzVVCOp`0Ta-`mm@uEMJ~56D!#tN zNzJ0LJelN)^6=C}yP`Zit(+9?(V`Tmhyx^&M=6FT^8Y? zk%trSTQez=wnuyF^3+$zvEQ~%2(_DCY9s#`j|(_cJI2%41e`(Uqs1tL_fm|9yX@u_ zErmLK_|03WYZA*Bo!Z7~yY2pEsDkIwSdU!;M{RDw3(1Z1@GMkGahQJPiNwPwaSG%u z%9Dhee^Q*MfdFtljk?>PALQF`UKaitkN?J|82FC7f2Sq{aDQv>UVTV=Et1dh1b7|Y zo@e1?(7?+K&hYm{1e@hVLBng{FqRzHwuwmTHw+;JZja1YqDj2xvzjBY&<(Y2s9k5& zJ<-g<&2TKz`AUv&$&?_7aAJa3n~Vf~U5oe;M{^Q9?K!0X4}0$cT~*bs4RdOGa*~si zUQR-&2@sIpw}_%3CKLE9U%mHz?{~-leIsM!tljrsYpylhGv{oG5)1ywahY=^fG#GBo(`$53Prd& zW(MS+>S{e^-xj5bREr9#t1igRO{x7$`yd%d-RT4EPy}}hctS~aHMM4WCpMQa=?USt zDJ?u72Mw`dit5Sb_b7eRcm$vYufE|=?Pem!YAMaV7=*;ohrfF2ugfZJNa?|asB&vL z%ROnL91+dMu1cD=T_%P>CMOi4a-;}NTV%t{*w(|>&Y};TY3*vNQS25*rk(rq-EpWe z_3;@8yl65NkEiSl(m0-R@F{d~Ds26WYRVEy8}J)H|3DJX_Yoe$@`_a03kXe>l1rt7 z9C*O4A2>Kr`kC!UCU>lkKe)lIkdXEkMVNg5P7x+w&Ujl=+nGvSgel$&!S)P@k^dfD z;wj9806;Fx^dyxGnBbz_wbhYWACXEXhDMA)20amPJGPE0iZvi2pXQFa1M#+XR1qVd zkWoX#h~GpRxwgM7EWg{;;M;^4YoL}al~GHO({5f|;+MKAr%tMus%luOlHNoL#6_uK zM;4A7XB|EwP32@Yle%B6Oa0npLnTgw$ntv1?01nB%f~IE4^5P{Y^z7O>_mA7W3A+_ z^HVSi45^q%e(%PLhU=% zuv5R_=1pOGDXk9<^&~kOs4i>`tA)S?NBdwqb{+C>j$Qd7&FdrcNQ02(iP)DJ!24)@ z15CL>N-}p!=GtTtca>MR^z|0OMR*>vhtIjQ33?#+RR{a78#*YK*04SM_j{ z+4uTz4A+4+Wip!%40FOyx5)Q;ke$u{YwR~#;ZFKqXDghq-}PGfN%yQ2oy)tosqGQ4fe?v<2-tXH*EJjYHiqPeQ0AWS=$&|`v0uT6jTX3Z%Uob;BN{_s zLg>ZP(yt=v&oHdwgX{G0w>Yj_3O1~@V8uS!SRDjO!}Qy!C>q*CZ7jqMWT3P_hg;o5 z%>YjcYN~Rj45VD;;ONi=5#dyL>Xen%G*LTJt7a-^=)1F-`UcL~(+u2f7`b0-5lO?J zxRgRAO;juOYA)8l+~z9h6W!2UO|8Mo&Bwnp?8?Zw;LWTolLcVS#j+II!n-UzLH)y8 z2GODxYB%%uX4;^=l!)Fxti9Bh&bLx~G0*$)Pq>wKwF@%m+G(z`DLVAno{hqeR!!N9 z76;Cie)d%(>Oawp`1{Ru5Ejx}9b=wnXOC1Q=Lv6FZ4yd8IG!xXZJTK73fui2{9>VK z3z=y_L1tQYZ1m4P7mR4W4f`5arx7jHr}1RI9FgGRwgPvj`iSjMY^6p9efz0RaVcl! z!*YgjhhgjVIA3@N#ur*0k3gh(GLl|t1#a9+rUG?em~BV+P{T)DsWiJJww85Ix+Q?J zvc^M~d~#1c6q#uiOm*9-Z()M1ZKt*kId#r1e555-SOk7KM*;2C=FHKsuog5-;Ecn6 zDry}+kwXiM9U_I=t25*YmWn4>1ry*ChAV30kUv+7dJ*RD`L;QqQjr3lBW`OezlzIP zG`JmtekKjNU2POR;Zs>;0_ouu!0tb|UFBMQU*E1awtwh@H}W$sb$3wX*dX4vgPKrX zTEXAu=g4MWd2_sM(ufY|_qS8@M0#p>Y~q{16uF&$e>zAr?|?>=No(&=o5lTV_mqZ}_E#)5G7p6n9TD15?GF6t zz>exD^KmO>Wps`7^HYkab5YDC_sx04zTvC9tZB0fBvR&-JmxhD-=nfK*o^gX})=}uTb zj#In4q5mGIb$6>VKJONR&!8Ji?iS-{x<_^Uug}H1@r%?HJxXowfldKBc^C%`I+^K% zcaU^4wY>SZY|`v|p!vQ{yYErk2fjZ$mLI@9QCsu`)$fdXHjA2dR@2%oeh*%Xsdn59 z3&Tvi+Yb#8*-UV|+P(+$R=)JnA4Ir4+ zqs;Zl<6F>0WuM%RE^1BtH~g6mjMD<{1$k#sn|sw-@<2o5z{~Q$GVg)gj00!nfuyb~ zXYU!<6%*|nn$Q(piJB)})dqEU7Z_b>NPE^8x7|p?;A;qc7Ucq;L_YU{EPlKkgJ#-& zYHjbl*>4Q{&&IG1y3ZK)R%9CWGt%qdr`FX(Lt=PE%fTpP<>s8S1F& zpxJg+PLw(|)ZJe|v=-39z6?kVv*=I!_)p$we8A_FkqOvHn@rWuCSSO7CXWC5xp91x zJU$M`eMGNrM#$x;pPjTcQ%$Lrp?qOzwB^U@wAE4Y1!bQQm`_(O`4WiI(fqOz-cthI1(8Py^)J-YR z(`NB{_$<=H_WCXQk+8&SXbO^TT3HWaO@V!vl88-QB0-!5tI+x-2^F*pnRU_1dxdtfd*6W=`f*(| zhYfip9pfnDh&wVtd2>5o<9Uv!MlSYZ(E_OWAvFmYUjql|&Dds9JdR88ja7Vu0)*JG z*QI*YJ|KmYh1aiVHARB!!7-TkR1%A&BLY&o(NO1Ab~l;Y!I4z5V_CybO45@ z*TZH0MwN`A{iMMaAVcp1LSUT{>y-)id``fb)L$BJ`t(2gBEA z3DfQ4S<<3WArGC=0saGIR^)!m@u3qwjdcV`habnqaCdYaAi87N0JSdU#hC*P3&5PR za998kSitcD2q%#Co{eHJq6l08fP(XD3Vj~&1gO!{uPh`~=F^c`1Z95v=N?gw=DwJk=ctwQ4-wEq^rpn8(|wIRBUMX!a<2@D0t;0--j>Pss=L z@j!L3G`OIi*b|psl(TBGRiyn7@;Amo+SK|zb`ztKCpQ#)ijT>D&OLU*^;AxPF~ z0J1~a2h(-KP8C7J?zczLv$}fI>msO7S7SkDJ9PCvaPqipwJR3xXpwb$M(=4z-!?8A zdKE0b+4xFUo#ve9K$FZ4r=cJ0sAr{!L25skq$*X)EEt5Id79oIq}CHk9Vi1hayl~z zM#iz!>TwL?yVQ$+R@3v3gFZi}nUBMW_-_7Su`hA3nj8;1pBI7eL0+>bYy=>fOQ`Q) znCs?IPD+`ppyWg{^35OfjSE7}2N{pcS=H7JRufbCmCy1kE2)*OP;iOK;m7TSk2}rl z<3@>9g-Sj__|*$T)bZsIJ{#a^bIVF1s6kq-n?d-5mfb(C){PLp&=j+TytcX-iVq;z z6cB4ldD<#Z9$kjPS`-hmZ%_?U5LT;@fi;s$!(f9k*SePu z4QTC4zuw^=T$DZx1m#(8xzb{Or-3zR6!tNBQWl78z($&OWCE^D!B44`YBiK6I@l(Y zxlevd6~Skm^fHvwcM2zhRr(No$)trv+8I6x>-4FoR1P;&hWv({k;7FEH+yNg`Vy-7 zULLMy@T4>YXE8bMY6HsXHqaM!7^TOalSof~S``JXU+FgtWow>RMFDF8o^H4Ll8w%m zUGk$Bo>2#b%#J;yvj5i%g3-GO29a&P7ek z!NKrWOZ^KP6Ot(Hc}~q0$m}qAcJ}iSiiXjw=hgL?9(`X>893x3rAM@;H*J#fmZ*l9j?YwWZ@JKl($X0+qK7d!pN+a5TzK<_ek`s-2;B(^ekdhb=w zelK>q93A?1u+!h3L-vt>4|e+Gl8qIy(**4Fccu?$!(v2TpfmzfJ$LI}oBH=i2%wdy z+X=8?Qa;q>Jg^~TkI!v~Oc=G2Qb0v@VjxI^DiV?ueQ_hPug z@cpSc`ck-6nK^4Cb@}+QLA34-Rpn)V*phnyguKIfFU=}*Mido{RS)qBKVrN(4164Q z+}YinI^ia=jJJq8MgM%AD`{{7aE?@$86urNNu0?Z-X;Hu-~m{_8%>1lISkd2pj3ZD zpHGD7zL45af|uSxt0$?d@Pq|WuQ$~+>X8Tka0Y#t2TN^Fx}K*>EXCEl2sX5mV=^k~ zcAgBLT|h5RR+|KaLKzAK+-5c9ot3nf4_WB+WX#A+y8lgeLLe$-OOB0ng=89sl%(dj zpb+#V_gluzzY#Y_@dLj3<8P_8;|q|g+k26rQAwK@gRqys1)ujE1I*_O>1pa%I){CD zaP7BM&f{tUIL?&*ij(HO4POH)$Gxq#!4qpwF`hVkGJj4il_G5e*p-N<6cX~wo-^hx zLneE;GEx3Digrv<-@(m?=8HjjKfl7Dcxp>wP@d>O{U_R+2J&VgfntB;ko60 zv=qubJH|!75pq&vc>W;atZhEkc)5co`O!6HcYJxEb5M{>?`X)}G<&Mb*>7u8+>Zb! znWw2pxI}5wRHK?$UCR6v+WMh~takcxn)(!YXY1+0?*7JfmEl%rreg-71p5p%Dn^v9 zFmVlV{PPyBFfrH9n4xA1FL48EI1M(AMNQEYCuXQ|LKIA=(zgJ?Nt~%NMr+7Sb(A=_ zk@P70&4QnDSW&xK(6JFWYM?ieAI2C<3EyB->8RPN4p!Wha%c8)7QB3S8jRnL0yP+e zmRKN+TbTv0Q7xh8d8;RVPyjFscjf4OE{im5)txR3U~67$cmVU~7@fG{R~$x`5oKMh z)6cH7Vr8LJRw1DASF2>f-wo1*;gN>Ifsxk zza*fEKMk3yF7(SY67;|o&?PyVn$J_YUhCnMFc)RbgCLVZyXOff{NzuXAS?AdaE`#s z_01bjTJ{dqhYWaLtxoE4{&ET>&c};nQ08lwkbQf;u<;!p4x3N^WV1r+=c}uw$Y-R; zEqE8QJ<5Qsu5OB^#5B|o>>F0o?(0>>Mm*d=R6V;9xgfNkkKa?nFegzhEs_qsr$z@~ z+b*+-AskP+u$}A+fO}yL_^HRDsOJI@ZU()&K<(+0mZmX`HpfI40CebMXBMcgR`O7P zd89XfN7++TL|KqNZLZR9)9u{s%Z%m5pXD{Ju<qM}gwy4v>h0nNi3O!Is>A$o|1wop3v!dG z3+^~>nYsW|&B*Hnpp-Gyk_8*)sn)d+%hzfeQ>fNwNR<(LZ5Z9{BCvV{>`Y7Ot3rXq zDk}s<&ZE@j;^)ET>Jf&|aJ9Iimp+6(0%DmxC;@3C=B|LYhaB1~Q~{9={s{hKfM*(g zq&95=<-n>K2wCAEHqujqS;0YU=amQl#LAP5WB`t2JFh*nJ~A+B^L$ds=VNs?y5YT# zRSAJa3FmXGopkkM^&yOH&riVIdeY=i47kcWbD}YLzSRC)l#BL%BH${&cn-etCE)7d z$%50Q7hygR24f$fZ!n z5|s?N8^&-ZU0J0zOD*(Os&zrm0h8NbR2wSv<&7jOf>U5YK3gptN6fdQ#EoMi^#`6Edi}c7>^Md5uLr~GNg1zSmyprdx4W?V zCQe(3*gxU2o%8y2fh0lg(C*~!huWcYH>jJy)vfSZ-`BZ0ivE2LO3tK`?`p$c+qt=& zR*iYruW0}0>TW|x7AvNmc5DKP0Gsvu&s;XbC`cDXe5KZBbi@+3Y9NH0<1>`rFqsFbDEtPO}JVu??uikPj!@ z?Pdp%Jpr7kJ%N@vYuc&hm$>=U^kOQU_e;N2?eaQAE2Nc$&zLmF6hLjasbO?|8KheF*^{u-;dgjigVEM9qPkuz0CR?zV&twl+~iqJ7GWO5~FuJJJIhu z)vU^g-`b_tX3H(?!Y?A54=lI-bZ{3CuEH)IMHz>)kOXMA!24xJG`~e@k>cILZ&7>- zC6~j?nB1u0%$LK1**_pU1&q|Oi~8?TcX}*3sOyAU!(4lKmQv<#SkOfQVib5{()$;M zOxC~2g>lOZnPi;3CSp+5eTAjlLMUk#MFnhSA9^0iUtVkn!?rXkCw+~j8phc*es>~J zq0Ipwn2W_r3Ssz(uML>Rr0L8M4c2VHEI_K_Yvi0=_qBvsz+&8;>hD$G@aA zjx~#n-+qRZxXXYl54y{yU@tIH_tS=T&7!Ewv1SqGLcoVMYd~u)T*PQCo53qR&J^s0 z73qHRlnRf)a*HbA5j6f=3_d_TUt~Gm9*4@!>VS(EMIG>Z)NcKw99Mp5eKW@R#D53I z{v7ptwZ}u0Hxi<5!FTG4|1(`xydv}_U4^~3>ZkZtc%{Aybme{>;OG#a>vd+j$)S;Dyetpo^=D8ReIIZfaYYF zedvi2wXL_StL9nhQ&#{Fvtmz|Q)PLUpGv?(o8baMF@u7J-_$TgiP}s^;Zc_+we9H; zaB5D3XpK4PP0b;08uF9)M#r$= zD2oNYxaDU8qbzn{`rJ=9A4I?Y1kYG`EQO5{k6^*t@Uz;H0pey-S~(Eid_=v6#WpA% zE_&sN`j|A=0QMDTrtb6P5P6Qj^@p zPx=MG?IU7W*x)PfaN-xC;l}=o_1df9(tW?G)r0pM0HaQjHFlh%oL{AW5po)JF?anc z^b6CT(@x)xNp`?v!8W6h0s+>O-Z^TBa@*cTIa80(;q+1UQTgs6G6;0gF*vM*?b$(d z)jCd^gB|#QHOJI0_E!VY|6%1HNwtov4VVqDpWiDQ0a|J!c}loEWzBKPm-iiqrTb}e z{f2M=uw%0VzYF(M26hC36B;NRUjq<7;w*~nO#cnGv8U;*_nK(Bd_qm6kP+7%bYj|c zf4GV=PpCP-`I;3YH7pXfn+=?=RahV3GY6|&OXp9hZTUe)URckAdY;6(v6_aS6ui6O zq~P5J`*vGQ)v4wwHN?IGMjs`K?)yD9l_va9gP%F<6fE^CXz3|@(nUIcN^QZM+U!Zh z>RXVx&ti%SmbJDRQwc_0Q-muq(I64?X|=Q8k)3wO5L^T^>>-%s_n#I*-=)*Ss?z?9 zn#$75;4^9q`39-9KGp&?=8T%ef&;SUokdSr&myEjykR}>@n}DhFBKnsk@}ofTg&4O z%8%2Iv#KxOBwgO*;#oX;1vyLAuG~RJ-l70860tOd0D2eF59d^_)Mg}7z13@qMaI{=$cQ)C^9RfzBE2dWa%2)XkA8lECY*(BTv$j;D4WC_iQtv+i;~9fxwk;U<^=1?pZawnpIUYRP`FLd ze+JH(IH)QxwfWNALtGK>AeLj#^R6GnO-7671s%do&UkL(FK-ec zL_NMqze7OaqFmA;bsD`l4AHBFd&ah;J*Ds3X!TE-)v54uh##H4q<#(k%n^WqxF0UV z=$KK|?h533^93^s8PA0U?y5Q>;;>cPC_Fi_?2hZqGffX1M&`gDQhf^AJYU_^g!+$f z<|-O^4cy$k7By3679%fzOU*BE{&|tRH`y1iZ0aAUwZ{|Z#%Z|-HEy`OhLfV(_79>d zWk64jKTk;`Po&t#;|d2<%6&+t(f`${esrZwjj*k{9P1cDtK+p)+omhrJjunSvzj-6wRTcd4c!N<>s18 z+)Op0nJ1dPxq0*=@14NSJ=eIomYb8r)6Q^nsW`!HM)T|Qd_pESe-sa{lZ0lTc*F|c zdrds}2%2dN_-3F)Ba=C7G3F$HA@>3k%EPPVpnI^cMWAL%Ym3H}0!H8m6cb0e7R^cD zSu~^xp*_i(i(;%=Jse4pNBYPupgQ@yIdaP_w|>SJt_rn@TP4e#x=rlNO2Mrbqm5gk z3^ZSSMsC%RTit8i7e$HHEjGH(t~qd<{&tONxRyLzWY^NLRaB3EA`Guy57?d1<-xPgNOQx2R9Ih3r<{# zGbP_|RnnzGhwI8S^cj6B^6x2v}Nt=yT*BNyd8UA!o`x7!^+4 z{j};J=x6=3VU}*nZFHzHTw7*;Ey6tWJS}fHGQrVU4BAXV(-_yrbhu2dMNjx^zP2ej zaiEKr{6VH?Mblje-~D`Tl&Rgt$G;fK$1`~6S%1xC8z;7Ncsnrw+aHRH3VFLLZ%@qS z^GkU9!yPAt;Eu&&3MbXa_B!64FSdW=Q!k4d8{|OqsF>32xVb>Q?J#bBDNcBYn`gw7 z{)U_9#4GrOqPbW+tOYkGi8~D9=BJ`LD^yGL&*QmkQ@GyI7ol2jOp5(9tbtY|-Kb6@ z$fO5q)!aykHia){B1E*zd3qsC>j1)A8>T&lm9&vld(b-1ih453J0&66Lb?`4A3L>B z*oC(^HFkD{s)OLom>(EKJ;SvS>=+oX4aW12P*Ni;B~Vs^5mW0I%4~!g9_7+pmI2DI zG`B%UIOR3c){;3wTVc-oopLuh;wdM>$7av_T`bkb>wKcAZ8yJAAAe=$IwqP85k9H5 zC8Al%O(c85-lRx00m(r#lbeTuza2uk+0^qt={ryru^A2f8s{UWAbO_$mUVto}szKK* z8e3<;(wNT~+ziaA2Hjg-+}2=e;88UwPwq1K8W>d#Kch?_o&^5pqDt(_H$b{x_?ZUV zd)lt0_*EA?gWnG9kC~al`M|zXXn%@$tik@k!%`@rhImJCKCHgHqd#`wGJ^+#o23NE z%o5DM3|R80RA6T7f0xWmFj8f` zplw``PD((&J5=Vd4NwF>!|sNZ0JH5eHfVXDEyzynha9tQT8YVa^{zBGe}f$4#r32t;7Hzf}n$W6(^!0#exNvfBJ zf$2q{B&wH(UFB0H5384krsQGZd>$SKrsv^d8@VZY*adD%9tM6FL2c@Jc^H^p1UP(m`8zYPmig(LADEbb zy7m+Z?gwh@)H>4UbS;#5**-5XtInH0(l)1-<-gyPt^i6_Lyeu^%Nq&?m)J;b-PcH~ z3$|4v*j5qPRv!~GUnt{z07yGL!pb^{f517Q~zEv6yCl+zfW z*NqM|)^1O{Zt^%rr4JTjVTtz!N6t~(CJ@3=EvktS0c|w+4v2t(O|`hhaaIq&-+Sd* z<4UV?{v6%aR9rc>srCdOR+<*&q@ZS6YyMh4I@|>K(yV4$GI;ptW*Vat&NdSwcpx4A z1o+m*%{9(@JGQyTAxObgxHvb$&sRD=0il@t>~Umx8V>Jj&cr*zsAS}&;G(P++CY=} zD|l8soXweMypUaa+i3X}%Zc3GH88@ZMc8Hr&WeaJ8rc~M5 zwZY_*D%((QN|kLcH>Jw<6*r~IW@*b!A$&FFrc~Jma#N~o`P`H$+ZJw0mF*HYrOH;P z9XQw~rf)M6DQ%^Uc7oNo3N~b>0O_%?o#^=pWAlXEj5Iduw--mFjLl(kGuqhvNN&a$ zn-|*)6{qyB9!_eeXq+J|&N%dm_kg9zS?XaO7MZnO5u@3|V}Uf{ zs)RO#XgX*_+)q4@&B~XuMH|khN6~j3P@X4~E_cwle(9h)vM4d^Z+-d^7A@3B`+xArc`;3cEmtRZ71qZ zG^L_*H#en@^8z=edh-D{rDn6An^LI>x(iLI&$Q*H)MuXHrqpNVa8v3t#iA*Afw>d* zN?vdqHzhB4l$%nOnZiw}#eBg{$pJ2MQ*waXcVqdLT1>CIwfcq@Gl83u1FYw!HcR6;Ol2U}`Yk}2`2}s#1iQWyOkL@hX z34P_yT={cE{?zIsj%CZACGzL2{JHI3aqJoS^Qru~CV$#>6~{)(pUv{e_dc<+v;3JT ze~RT#c!oIkfc%**e-315oIW)%Q~YGfpLgWXFZjXSI6}+2X$T|irqwfNCI z=q8xLvTj-joN`p261Q$Jg1EbD5!iK1?h=!t51-Iz#Uw?t}79j}51_J+=GsrlqW?IjQdb8e@(+-mf8ku4w4}+C3&)QMw7x zjNIcBQvj&fT}VUaSDl7#?OUDNKB)D@l+5ZB3YOGMiw>T&%*Hs-Y78bDvy6UxP;11V zZxJ3;{UMDr!QKCmHXGL@H4QednNi`Ix5YIz>7iblOvCfB9!WJH(rWqH#d3uD)J02s zfuF&{lh9im39!lB-rAj}Lv*aS7H@is?0vLi#$No;N6SFH`?`I#j>sE1w6AtIem?7~ zJ!2f~OBAkuAVfOe~!`00a|VR93G(6^k2Uv6fqwr zM_vMjKB9>#FOP_m`aL2}8uN&j;B`}0O-t(jIV6g{c|;3CO$eimM`Srt&f}3T&rMp% zBVjY@0Q$irVe!OVM{>p)kq!lGz90M7MY>Y=;80&0@u=qO!%jUHOzIOK)e`GX+Y$;J z1DAV9mi;C!m$8U8MQS!y<=~P~k-&7{qZ%hLtvOIj^clTO?&~s8yBGVW57f96i4hod zt8WnY`SKK|;`NLarc&eKs^twI1L3|vT^`f8WPwGgOQF#K^^JN=i^T{OJch-5^vVdw z5!(Hj=Ek10yyu4^-s4uq9!15TrDD%8>_I|3i^pPz+)J7k)q*vS_D~i^@kw@%^9hxR zV9g7X$z*JbD4W5+30!`g?4B@jImKQ4)3;{H3URH0g$fFswU`Tg(m1@zXl@uB|fw3+(Ly*bz`fXAbGFN#?=%tTqF z?K;+mo^(dn8s3`HZflm%z-DAGbNhi{AH#|{#2Enw4WWC#psYcV7mEjJ zE!8i`&DtV3-8zUy*2CAk{nBjJRX;kQ7aN!$u_AN!0$r^k3$f7jy625 zHT4llVYq!51)2!I&bDgkA4j!n(x+ilcFM~b0fpp9gEf)ktm|N{v7PB-S2a?8N^#PR z!CJgy;-^WVts@_C&5t+i@D;gdKMp6yU@a2M^PYm@EGHzjr33zC>stH}t$hGOvOR2s zlKLKtr}fS-EA@Y=p0yw&$z-wz+E6S|kSrI+Di{Ka;)g=%x;;FcejcKwG@8FX5zj1q z&yBCfGd*Sgpic-cZd1NBZUC%?_|$Jbpy(o`j%{NyTt|t9m+GUTkPs));h`FPsg^Hx zxTx+hO{7@M4Udc}nm`6@4OyV^Cl>U_VFm@@s)`xpj2Nas%X+y?{BK}3j zh@z*!j+WC;Pic+K*Q!%y=`t798?FW59xaAzN%oCqe3zXLPw(KQr-p0KnP-_O_w>Z@ zAb3|L+REzq2D^NFL{g2XHBOeGys-!=$DY=>9^8zlwH*57d2Jx0!iq0H7F}>=y~Sjw zE-ivHnSEu>_%)hVwg^t-jigH<5pKM2Zx&>Pya1T54``f zQF@>}K(Y8`E!wkiQRSG0Y$3WXl%8A#s0eFM1uR}P~~|e z5b=UY=L|Cu*PK2A3v6SY1J_CSlz`SkHr#@QP*h`Xop^FVimk*z;I=NtRI< z_3|_oGS8Ge*zA{*-(+nJ04Z-y);QVHp~+ewzD3(N;X8tSbpM;$R2)6?CIq};)bcGT z?qg}rTUrybMAW6ZSzw;0-qM_2)=(820jyLMHF#SHA*qrhAhhS!e*H>?seFxaU0Ika zO@QRB@SlH1KtiO4`pV+Eh(h(q9mn2=^e`K~d9 z(eGs{%=e5#GfG+u;s_zU-bHFlT8#ZW9-kIuat1jI1|Kw;ng@8RRVghC3b7}S_7F@Q z;>1>@Y_~WI&R};3KM~CWzVRKknX26j9?+&>5`x1T2Z$&Zphq*5wgr2z$4w`v!o)Sq<5Q7-2xyaDf%o6ztUYS*yho)?P~ENn zbnPM6H!FRr76&R`NxP@pig#H+|O$=rKi^l z04&4FPFrA;JeIr(6MAFv*6$5_~ zM5kwKyO^TZ7C>e=$v78ehFx-JIBjb`Gl*Jsi1df>5;{kaZO1u)l7M!aIU$unQ%2R)@_7K;e`cKpz;?cc%?I9kJ|6=W-BUg>uLxkEx`)I_wTGh&8|I4G}D+eF{ z^O))&jzTUvyr&v32?&0=S#hgit{KJWK&ayh|JT*6#vJfORm%HP?bKB zCy%}343%xFZ);H#HtYN6Hw3ybn$ zn3H}f)M|=VDvS=lkP{cYXq&lCwQ9|(aW0to+o(wyDY{3W-T1Xpj=9u3)5 zXcnQ~ZzE_-DK4Z2o3t8%A1(7yCY^}_Nn(14ESAr1(vkzVedn)C+#ZeHNJn0x#naGF zwCI2%g+9t_TlwTkTzd^Qt^Xv`W-Z+O_Ma5FSxX4miUMN4?B>f3Q~S-Ze!#@IS!?W= zan6FC1mU7D;mJKm?{3y=1uWrmW1FHODIKQF!+6N~&018z(I4!}#)%Q)(FodbQQ8-< z>CD(-Q9j*?umnMzkK`c>U2wD?IQb{@EXsoMp8Of^Z;wRMj4w35;5iG0K@(A|X62oQ zl(kZ;<1;#!Z*Z6Y9Mf>0}hR!aU$j9>LLa$pND~`xx%66D**KN^)1oe6!DySEAIi`0A zr*m7hWb0REu6*4s00le01VYl|g0sQ}N2Q+%grxGt!0;)FHT)^#Gwl&*-?pvV9q8rd zM^SCbu}X`s`|Z4NL5U5}(Oc$)|5>eCwLg*E5L-pwEgpmg^JxB7=vH&6WUCe0-#pWqKSiZrFwthmY2jr7iTtvzN2>VLfYD-6=Tb>D*YJN-;H)GLzZ z5)fkP7({tlm*Wufr&+}$i=nK@r7rW8?fGkkNk5j_9R*=Lv=-uOc0ndW$D-)W4s9}K zNbXK8hbPiH*xWKGeV6bHB&`>hCDY+`u#|7zCH-DQsNX#`R}VGKNp+x*KXh z2EDwSCmT)O4ZGa{+OS(2L1#8-lmEBQyEhK}ubp?ljs1V~j%VS&VctR4-gA{QwrSh` zEz^#CcW8m8TgSUs5i|c30)VMMZk7|?$}|AK zV0DvA3|9B<*s4=5jxM4msfXYBdih=AVT0ej|GAgnHL1$#ZpM>DlpV7=D%`7CLvQ3s z;CSJ*#w5h88@bZ@UAqzG@Dp^&8@W=Jm)%8rw8YA+DS$%TK8uPD-)PmDH3dr6wEw3Y zSkq5}HJQHEa{aq`BJOPknH~I0HRz|GwFoe%!@pR-ppN`A2G#wD))GZ8so{<#kr8HD zc@;(x$)n=X0FPRIYvcEShJdZLR%u#dF7;`&YS+w1_q7YXjjHxjevH^<*bD&fAFLh$|ayH zC=@_XxM=)1JuqbXho*9059~SaIeH_3w?pw&xRc>fX=z9 zy@x9%|Gdyiy{<`g<~bp#EAQ!yy6+yC1` za{fS9>m&ECPv;VGas{F@{Z7UC>8|)>4^Cj}66_LPa+#Yrcb>96Gmur8Do4 zXWnDhV}e*a=QB_6nKaC-M>iFBYc0;fZJVRfJlk88O4{tL{3hbMiN+HG#S>D^(r(`v z7d0-wNSg0~P20~GnUp^c@Wa@m7HRg@qG#g)Op>?Z2PVlhi=N_OljP?}XbA%kd((nR z+5foHCCj_OD+yQnq(#w&)irA_(l*Yt=mDW@^Yx}V#bpk08O=KXs84Vet7wTuPYh-A z?T2MX-c6j3#NFsts&0iHb;oq8GHYHG-e3~Hfm0lUTsUSSJ!aK~8PHWQtO=Vg9<=Gv zSoO~A(xVHO9jj^bq4-8KB50vaXE3=k2JWX5HvKMPylCgrQ$jrU3V#RN_M(MtkJ5H% zeum9rSk?nBb53zV!`nk4^{ue$EZ~*c_1lGEFOG_r^a5_*M;~X(m{AsnJQP+(UpnHW zpZ0ydh-(ZcTj}ua`oqkH){fK{8}sT*6OujwxykeDdv5W($_mv7Rxu-&o0lsalCkg! z^D_6^?<2#F-aowlh>O~X>CzunKGE1L=CLIQg?=?Uw8FGutCs+Dv=6{_*WU1{VlCSc zrq>AY-U=&gX_y}EF*KPxh9(mW@d-|lG84U7@g!M38~`@5VLkQ7Az_08t5qhJgo^oq z5GJse4s!u5{m<6%L1Z1CAXWSvGXxpV9fDht=!;!qoxUf;sf z#}Jp!*2zgOJSC@??hMx1{;GtnlJ?i#uOn6H@?ag}`;<8ok$oyySFL?xKwC;299MU* z(0bBmA^J=IfuSmQNd2>+;^pR6L&e8#HB@}8(oiuI{C5wPW&Wj2)Gko}`k##zv#*LH zb#5gsONGCpW9v*8edp4{Dvp^cLQlQ!(m$G;Y0(Iz{XC1707CCFPSOWR;jixzV~ih}WxwS3G%tO=piH-$HWHb0k=P>hX?QRP6UfF5juh&+bE>H?kXs7`kI2^N05jMBtkf6(J1)F@Z-Zo3(gr4!a2%a}TKnuRJtIP<3IBo=TsmixE_Oq6LFesPHAdCZ@Ql z>3`v!FU_EtFW{Z0AwadlJ0EI}cRqAU+Cka7`s1zNIqYWd4CZ>hvFDwUB=9BOLD^0I zjW52pOmsGITZeBGN~GxPzyIFNz+?VZPlvU<zekb4HX7!*rsO;&^KU2j(|5r(ErsiJ6iTiwqmZy|e}eMy;zo1JT`uVU_=Ii!h@!~*H- zb~-!EvwH1wlDoa`8~jO`19EN4YG!=;M`hHsz1|kn*T2H_rD^ST_D8(eUa+$>Tfbtu z2MztyUeHizmmPAdwot@WJ+v($l3r58R6U~T7kJ_N@pd^?+jjUHLUW}Npv*xDQ8e)m zJ<&S=>;T{J0J^)F_j*Qw_nIDramUe7uO8$b1njN=y>M1jW?yiWn|*}V>XE|yLo1_v zh0yh}9_8{_xs6d^0R#f_?v7X>c@)?aD@Fk-2SB#(&PB@PJ9S@k-a?ALQ{P>20Bq!b zNB5ziyLc1|vMwi?!d>Wm3!v5I17YWZ77u(k30cfLJWq8J!!xw_o=Eznll~~n&d}ow+4(M-Gx~=JnsT@P zh7d*W(RJ2x#@(YYGuGBIz}@4^$FPG3&K|k8Zogme5qBY9u0^mlvAX#Le(+JqgsYV1 z)27b4boU%B3TID0rV2(hLRm1%A_%WHP6Imq5&XO}ijuoPLCIO_qwJX|oI^a&2=wZr zM+IC$Dx1yvb z-CnJkxw$ulSQv*V-Ye{Yj#gJ9XwrBcSzhne2f`Sb*;Vf-v`oJ#rma!5qN^U>^15LF zY=W73#b~Fa{aYntAjfy@^X}nUy=^X;?$cYbpG8>w*7wql0tvOzO#%+U>pqBZ(0zu% zfr;>)6}%KY3_|#5CM~&77yif~I(*L8MR^%Q4{P5Wdf5J105q`iKU_9j1YBkeU2WOr?ym+Wrl5ELq2rw3sx zy9LD|yut^J1GX(*^KT%!B@cRt&K+3E5doWXJjFbOqsaW_CAeM>c?d3=et1Yvt3Y+h zz5X`UF)Zq4REIFHUXVE|lAf&0rqJV8c>fABanEHfknFt$Gr9#$Hlf+Qb%ubH6J|Wv5XjIKXjCSWOW*b0ph#FzWBPb0l7{s0 zkYp5v{I2=Xnm+m~9^$;OuOQAfeJc=We!q&ec{{cwZL$e`c|Q+XvI!jI_#l<6Jmsdr z{iRr*R4ln$@e_YT5FNdOP7Xx}e;GkZAAKHyOy^vFBfTH0!9AnJUXcZO$xg@-*mdRr~bnhQ0-nw6%AhdMAA+IfdZ zg|u|&>&cOH?MYoV_l=>_i%4cVXNbOo7yN(p4TVMW8{ST-@(mGK_X9y#2Mncvy%XP5 z`HD6^6M`u95uNKch)*$NarpmGJ78XFOCeaoByUkS-)5gN`BQr5rh@I=&0RGSo4okpJ6&XjH=KT3*P@= zD0V)1>!J9^RAssJ+GaX6RIf={svZlH_D+hw_wG_byT#i>GHUs3`J9;WtXLjy?D>r6 z{wHr_IXQAO&3XZv=N}a` zFyoE>jv~tzs++&gf!uP<>K_@yd(iiz^y-1AWv+ZMm9b}#%e@A1$mNq)R&d8c$`$^= zH~{-$eam^*r-IDR$Aob_XEco5?BJ>F;`LZu10c^=b@Bpi?UCoJic(ibd$lT$!5cvA zX!F}^*`i&OMlVCcn+31xI{Rc_!>XK#@CKBr%qi6DVJ^I9&L+8Z2cdm#BR%t);BF!| za^q{lOW{xKr7%Q!gy>-5gL??J$=AgiE@XJn#&fS%R;*z8W*dl*++p=rkZ(j!vBNb{ zQGoABC&%c*8N2f>UBKQCyrJI+dw;BopIoR{>EoaY?!M*_F+6vGs~2CR8B-t)F-&Xu z#c%{Q9cD?~MI}@8svdPQ6l=%9w&WcKD6?nR0k(a1oF2S7Nw(B3BP(n>~B9oPyY)?I?K*CbEG@TK2=IF{qs&nqDboZZ*8H@Q}wMF zy!8|Hrb1>4pv?KKFiz5af=8|NVI($WVzY9!h+dc`md8Gmgg-rKIxM>EPj5S2$iSKB zA7vdFQgDqtAv-&$-&J6NUdj^#mA>LqB(2NS--PhuYnz46) zp)O_R>+Zm+F8TkNp+)?_{EKwYRDIijb!6G0QF&Y;OTI9@;8kXVyW-(?14?Xw>_#a(MV7TNz6)P8H@X8?ApImaZAct;*aBY!=x8Fh3S9Q6qX# z7d<>&+Sf(RW99r+4%GOIcp>JWmEwiKUA;P~;Jg*%g_yrqJ}TmcHXXHA@H^v{Fn(2x z7h3pMmE+`%7rMdl3BDJe|2bd=CS|vATaSY-D*`FO)A^WL`Ovtf=NKHtk%=a0EA4`@ z5Vq1zXb1xdvoRP*PAv9X>0rJogn9sm3DhcENYk*f2j;<1YJ z=T@_T&KBKr{>1+!)ziHzAy4CZVy;X$8_Dn_%oX#V2{dV?M2MKC-6s4Je)Q_627NpK zioUmgs<#kQRNrNK93_3Gx51W6ka>Uvft!_Jh-rDB2{CQ?XLuYmza5_m!%)yF;d#$k zrN4Ep$+dN;{(j$r`Oy>r0!0B z>mXrue8pis?K^nvMQ0@ z%!%ZoPZ9HZgNEc;;e&3XA$ivKpwOSN-rhi+i6}LE9E)wG1C{90w~DKT-B+IV-5<-i z=e8a)G*G+Z@@HtJzw;RRv7kP{WnL8#@c zE==_sJ@%jx)Aaa)kbyC%7I)t!A;*Uv-Rh*ln{+Oho6{8)C*jD6gS7eUCfzOWiF8ZL zk!}ejn!H)an^B}R0b_rDvyeAIsZq3Mv;OQ2a;~4 z#Rk2dTcj4)=u7=y;Xk|6y;~&#kJ~C&UBul-)2^+0Ou#R%+mx&4M3AS5FQuSu@Ns&i z6rsh7+%uiG>D4O{ZBEC5?wh*XJg`n6ODhpAs~Q5-X%?W(a^m9y6+xXAFL{+?MLnR- z0B2Rw<*PkW18fnf=yhd1raWo@q0^Nqmk)d6ODmDCxX=?_8d8yT`G_aBG{9AvW^qiA z_42PYmjvCVfSQD~!XY$}RwnN-Y!K!2nYnH+>zYTV($_mAg(gL1M;c)>TXupDGU<96 zB6-|JGdV`uRDnEAEEM?e(p&gL5tV6W%mwSSeUL&Qg0BEi z*(MC(QNc=O&{pw?4N+9*dp(d6zSeyMJaPJ5WxV0nV*a3y7>*)@p#ZqA3olDZ7OD#= zi!M{n*FuF~`L$5tf!RVTp&D?cdSqpeX`TBstS=Al)dMjdt%{Gh9ScJ_d&NgH3Psw_ zPwW-ygn*&Iey-5N-w0d>uqeQ;4ACE;Q{PBC-Q*JK3^@4XzjOvXYQA(X{{W`?Wwz2G zFWvz?ywZmPpc5}01OP0-X9}q=0EANhp=RSllgTjySvU3{5O#&#--}NMJVyd6;TvFJ zB|cV+DDW!HXx9(o)TDiT*m)mC=6&J=(+}ydux}u<>@MLOcz~=w{^Rd@*#CC_W&%;S zFmwVgwO?3j>Ji9nfq3dq1YW#fNQye`B0# z9l6Cg)%it##W|-`X8W}&^Np6RVEJ2Vn6t&d2pR}|E)wR(KFxe7_*Xp}X`)SZt*Mqo zGk?|VaCpbQzOMY&t#?u0@y-rvbX5NcbaQBw8zn!E>I0JxMIfWF$yi8Y+;*edjgMj$ zX=nVQ2aG-jS?fpId`x#ky0TLG-S@l6_qfh>z2V38HvYS3TAP~pTLP3kI-DIIAM7K+ zVM^XQQJ&(=m8d8xJFbVd9;o=pCwWRuDdTa9^8Mlzq`Of@b9?ndZj0=CK1PvEaT}!4 z@Bgcl`uzqFN;lf_8#wSn3OS*dV#PC^)bGYm=aaCp!9t%m*hMd%)H%4^)Z>Jc)|}KQ zTBn2Hrqg=ewgWw@?caR$@bWwK zfQ_*0Z+a|^KCSn`%l~v*zstTb6#X7SrLX@SK^@QN-{NKC&gyrgmadmC?DalbyIbvkp zwcJI+mUfS(v~zl_pIcB5gX%i}u5&)>HNWdkI3v4}5!F+A4SColc~?`;o$z5isWj;cztv z68_eZz2tpv`SpJ8z)IKGtayDOl6s2k<7(dg2FVugrI*j^HNbD|C^u0&;hu0>bsiX_ zMOR~mdoBorfMp)}vXq%u>DYNa&OE1->=*P`@vY-8z~z`p>n`Z&6)r$UYQDgiFR=ch zcWdT(U5jF@2M9I6gYk{1$o+V-)m;q`o@!!=aQkvge7~9I>_M%V**#+$8s#j2d_?Nk zE+fw-koBS-S3N^9a?=^5yFnQIC~*&Sd%OVNw8KUHUgtzhvbkfjC5U5;ii+%Tbo8Nj zF6x_adf>%NAoL9S;S%C1=9f~_%X$tri!SRKyy~o=P*X=o(J5 zT@^^wCRee*0MaS9im&PkSj^5|g%0-wIj-r6F@j`!C{3!8f1xC7M^iD5h4>mrcZ^I^ zYBv|3Q91~uvE#+?SjU*n| z^#Def&A>URQ@Hgy03z9R3a2H!%IRUfABhBlNc;D>Ogn0F^qrEP{T>SOZ8FX)+nCHHZIh1M3uFm7|j4it+#$lE%I|Xq>$owjwwa=CvWPa5~$8FiMroIJ}?=V5` zj^Fv>jZZeGS{>q(-JwZ_a`1+G9TNAF z{nNe!Z-;_Sby)rwaG%q5M>S zvGMTHP;-2g9L%#mmS@_xI4vVE%{j^k^q6_DM>beyII zWV`Y6SwQwnK2YtI5G*Kd0<$CSFhM!am{CW~5=Bo2X5XEH9YECdNv;+IZBEt&b^Cjh z0dkcqoSwA?9P!f~SA+9|vYocC5BfXGilTxr@*|42$0&ig+{~AU1h~0&0_PTwML9VH z@gc=P9~|+;5fdTFiq|UFab|F({mEu=SGH5|$ADWw&JPJl z_dF0-u}-lZ_-8!PU4B1#=yM#xE$Mu4c2aMskbE9j!SkHxc>rfU!Xajd$XZ!`7gH=7 z&bg~PCgF9Hu~Y|nvRPUM6uO#H%DqLyLb98QLSSc#mV{)7npzlN*)hl$onXA8+%O)- z8%D>;mo<8hE;_Q~vy3k87{tEY@;*cj=#T&fxraTM;th>{>lkGB?Bx3;vh z-dFU=)1lePKE~J4?9l8OAGij@k#(Wj@fP$J?h9bwx*MG!I|9#%=fnN?CPeO^gwv_?WRjKJsgCYL94>EYk{SM z4v-XTcsN}R&yE$_ex%H8fvT>q>?UFxKB4x($gAqg-eTWx#svX#$HNiX9MagZ&t$+P zBeGc>-5DXC9ukQM{Yc#+#n$AV!cQ(zY$D^`iW4-#lQA*xV5i+Hl zMe=!3*&Od6EKnsmPc$a?7JpY!`{?ZECgdf3J_dK$MVn)?(@Z<*_n7Qa*!fIs_GhNd zqK0wV514T28}Zq*OsnYo)a(T6n2_DUe11EPO~74=wkKpC4fyH*3kex zVC9~6vX_zUaIzNw08h;?KmDQ=cQ2c`*vk+<{3(CO?Qq)fVwD5dPB{$I^$WsH^}H#E z=@IhalRrT1X5OYdTn}yA)}v;*wOc7UiA7TXc;3ZXVtSQg%`t-_kMejGq( zX064Lec~hs9prStrMwZupwwgg69DG245m(iTX{J7(5xgD==;w1F8EICj?TMiK=Yqr zxsb#f18RRHm4jMbRo1nNC}VKla)9Mo>hWM-O>i!%%Bp*gMB&Q$nf;S3A@qG!HXH!! zSd9rmjH*e*K2?ngH|PG<+3Uc+Y1LULg>X}G$1f|H)kCr{nf0o;&s|GZQ1y`*0p_KK z9J~dr_abtnu&1q;-N|{fBSNvKu-djo7JNG0z`E@zOt9Xbh;MfBZa=Kk6c!PEDpwt% z!AGoiG*{X12=A%8ay=+DmDL0#7?8@&Sk6+D8cbX^u7mK%h*8zCaf5i;Rzo60U6pmV z1``&}_0&_vH2G9tJVj8_d#(yJe1CgS+A-=KFK@*oileicX>2x@bH#Ml8OwQCI%@@w z(;uX>TArJ%QCbtqoH!wv{!YjG%%JKunFyKHj9f1vn(FYH%nm2mJ1M#|g#tlBIyWcJQOZg2=-ah$RExkImn zUngm1>V;Uk)+8#zI(sKQtj!vWRBIX)SKPA>`$P}}SF=vRl-8%4H_dM0o{EbiQFh8* zI>Sz^9{T|Vvfp3?mU1+8Po!mUxeEq7r`w+A$hQI86|i){{@gUDPYdDM({YwgH((t> zdXgGq>Mv2BhHO;S!pBMohs0Jj+a6@O|7RF^HUdX zl|N^8WlMN0!hCEw>V^ei1|6^)p)0>|b957z&@|cTcV&%cHDPgus^)(o%%NS<+gNA4PPRXl8I?GHKAN=f0d0mR)0Zv5BLer%w`A+Y%jvCH z6_0xfP*`n#U=OA7xlw+_-?d`?77qb3%I!EJr1;O)tfIxX;mciah>%nib{49XH+%wV z^0!&DXnbsgmK4&Koy2m!)s}S;z0leLasH+u?O0sU9x+^x=y;DLYXmr9xOZRJ4m;ym zy4;RE1qb)lpJv;E-PfLGFNQDNQ^9cJC`4*V-#9VW*6g7d+q2r>6qdJ_oWj}mf>T(~ zfwf4uZ*h5dhkjl+ey8F0>5tt@ zy-~t~p!7)`kZt{#CU;_UK=#5rOR^Ve^zh}*OkC=47>~uBC1twYnJsdM;w(Q1=L=!9 zAcNKOSZ;y+TTlt&7+lU^BjiYMh2I!SkI=KH?Xp(}5dHAc%cto~CaV^E&8mf}g|Ad- z;NjKT#2zuG_%1BX`ru=FrVA+NS^BYy>|cb@p%z`i$!Ab@SEl(Rim5?A5QPKVDn-zD zUD-=Q!xv53wEk~ui zgI;Wc`y{KDziWa8Sk}Hb>jt)BMQ<=5xZuzXp&`TjNTITAAJ!6C1HLH;rhJu^^YCCW zT~fb8`ij@`>RK@IzOu?vnMXzUHV0FcS6Py`@@OLBo=S$cUO!oENIxb{+ym%v7=w=Y zRTk%~&UR4{j9bCrPNC%9pLM`ipV6On^(*|rTl>pRyS2&_Y~|+uimg1_U$T{rvzUmb zT$sfMVW^=4*c*6SK7chfxJU#&L6k&rk=F;XM9T{}R;?QBuNX)93XEggK(OwEDRZFW zgK~OyPocusnOC4NkP!^bl!IYf68OQwfml-`>C8Yj4c(8T!``W`{QfIySYrIWG!+;Z zL6d+_172kHyj4_Ov9FgrC&wELkLX#k)MXHx0+!~~AT~;l>}v7U&usWvsIV z)f^L4$-Eq>HgGxWGz1f4&y!P^Pw6z^1=h=71(#Als;Ph!FjN+(^}m56qrYR#3LqIF zrT!a8GQt#!52iyy{|Tjv!vLlHqY(%L1Sq8rlTdnerE5544`U;MNA=5r3V39w41q@t zBpw-|EredJAzkb`E{t}jmBaz2jf|PWsvXW;VHc0v{X!P^Eqsx zb&{1H<*;FR95#ZDwsgrq`nez{4@a;b9-uC}=xAV87!7-gYLH~K5N#wA?qhQ86T)cONG77E z?o}l(si%EZQd~KNs=g}U?N?93@q}9WuQG80a!_Ud@v7Vws=Nk{ejoLE&7d$#Oyt_~ z8gmK36%;0z?!3l&pmS|Uu~(3MHj2FfGLtx(O~;TkEfE-U^T9vcY2Rp;_|FCR*JxHb z{)N);PtcXCI4)0GXVmv~=4~5{rTm>6rCr7F!++?E}sk%?ZBM(FMZHzd41a+CSbFqBX+zcTJIXFCh_i|HMHkk09q%78bC`3cZ9- zNcuwmv4~ntWxZv4yUq6An=0EoHWlsV&bMn7(Vo{EEXFl5N_%7|conI{AyBTxpiuZq zF5PIRHw8-OnVE1X_=ZH;2{h*oEVR3CFk#nSWg1px2KAaIwE%BTlSQV`oGyp37N@bg zn3SpNsnK*=012c2!_kJCkMlj4cyii)QiKl>HX-QKewIvJIDF zyk_$RDt?PKx4vtkjQbo8d1o=^`3l0pU2W{OWpDL3TjA&S`|+E=`*dm^b7FEsDCjrbRSlfaYT+qV2@RuLR7s#Q z^O?9SGkHE61^V)6K6@*4?fWunf}0^XctUR2@II|v06F9u9bUj1K+>?o``g8K7^{<5 zWYqOrK~mCyWxRIT_$_3dC{B9Ernt(-O{Arj5(lZunBk$p;VhJAIJPYFALW zc-#v0*VT6u>skw~WEoNc*i(Q_?8xs_s{qF*^QdnD8vuB^(@`t*#>Wd-xD>)XsN}n0 zA>^?F8qSM2i0=;@rWGt6Q?`2rYbJ}>sc6Oh5Q<(2#^&m~)GRH$nxFcpu(QM$^p#M2 z%%e9~vcZ_fUsg&zc<3tjG$t!+6>ACO1V4qK=COjeCY=^);&SbdRjj6C#%`f(i}$bR z7Kk<_yQf~=RZnl-SZtp#E>a<|Aw_quMYq{;8}kdM~E_3$glVtYhgyM2#b9t9)!7 zt7%&%Gzti@o7p*-Dz2C8PN(%~2MX);Oc3?N)3 z|3Y>Ny)G$~%7naA3&N;&5%}8^+f`(-R*G$1Vu;ARh{aitZKv74VDbx!SdtYY^1dQQ zfme>(Bw;!sq~S})Df@laA+YGG;*viRo>tafrTy=-wt?FVmA&9B4`gmFr1%e57l|WY zy_==_kq1%@g2Beq0v(m7qSph^8$a+=dVmXdhMksiVH=wm4_rxi=yEs&0U zi9t>;R$3PdI*o1fV6i+SdWa%`TJuk2N$6U{yG5VKcYBbDcYa%Bl7R%2AY3%ofDUgF zL^XfTPthPoH@3(F{YX`tf5j@RaEelJ%i1dIMbm|^Q1AR!=7m;362*r$onSU<@-=fB z_dtZ8m;9;xTv0wK-;S?YWnV=Wg@7EVYUQ3pt;3(PBsAn)aFjLhRwAvatsTD*O0)K$ z2l0}L5P7-VWDhEd9)wWLUY1CYw#jZJP^Z1Dfv>dT5uF9)M86_w<6d-0TIR?h%-${= zs6x(t7((D@vTl;DO?rKcqLkXzk@|vw-?fb9c-v`t3*#BlocuuRd%hq0E%!J zfwf;GXFo=F$l3jCmXVg#>#oRTM~B+1HS; zF;lf^-zS)iCSS_Bbtqs9CQ=&V$ce10D&>DEG5OG!vZeY!mJqtV1qjgbD_O6BDh8Al z2d0a^lBjnM3A)%=y)$uCU|SPP{S;kPAs+>5t^ZmUZKjHvi0Sm(shD?xQafqIVSLqp z8%8>Oj}#bosVtzWJhBycd^?|F-gIUUtBSAerlUt$L%%P|+W10MIClz&KX@-TX87CQ z%Y>UeNWG%$3YR6fy^{2J;#(ws$_0n2OJ5WyB_@SVh&=vGLzy_6) zwnC8!tT}i9TYe@*9As|-Ki)aWmUsed4!Ti5(~>aieF$P<7us})4Z?5_t6>NdL!A#p zTMB~T72wkkOJ+X*ums9Cs+2i%P9MYYMhtIPgOXrsdPEk_IU;ofLDr$c3jlgQBfPSh zweJ*g#H{(9C{S6h&%L@7boUrhp)~dbd zp`ah;u5{8$v-h*1bn-ZJBwSi6ueB=*W9~{|8>J3tvoWuJ-?AJlrgHqZP{w7_vTxa& zkl}xDqerXHg;I;}*hDd8TSe6Z86G>5K^l%@sBNUrtDs z%unhGdx4FbpOh=)sw$54CKgcPNeQ*0WDeJdNp;Y@UtEDo2QyCMGfr1~OW!JzB6?~6sGD)Ip=Wt;DDGfdctC3IX z-E*vKkW{i*waF7b9D~s2eK%S$cU3SQzQeqQs-<5A9!Rj?Wxag=;!!p56c>JA^)V$AC`d49H7-fsWukbh<};~G7cln{6jF=m z(j^Fri^z4E^|S+H5reodRu@7Wo2dzd{Er^e>rL!D)=7aaSdr-p;>xK)@;X8mkXFFxNtz!gxKH z-Akgl_!`vV8Fb_tYm2c*US}<&p6>m!u@hYkUKK*)uRlKYmUQ*HM3RLT>b#><1Z_Ug zI#RzIGH;QEvJXYzy5tqsWd7aGUOtOe-vtI8yCEUd@8%OBBlMX|4RHAX7dXiG7W0l3 zXtb=fI8HmIX$aUUsoVs3n%ckJs-QCRmW0ZxTWlHzoN}9q*vu8@%=MwOw{b|9LBHOHUiljJzGL9Vr)BU#`0^(&F{*!;`2#cFr4_%i7ig1u zT9beDIe{l}7g*bXwWVOeIM!0SKM$csC2WM)$4dSUpFc~azIVMb;K2WcPw$_lzSm28 z52BN~%<_H)MDh;1w1&WwuYP99FqiStHd4kPY>eNgQUGY1$`)4*pUo;C+fjZd7kxi> zPwp&%zewC^{R^w^G}%5OJi*6ed#BBm_v#}D6d&SK4^Xjdzp(bc8QKTt5DDa=dBS3t4RS4F-k|2Me^KPeB~E#-l`MFIE54IJS7 z@w-$euV~&CYM_fO`AG|uhTmttz{O9^j{X;{eYTm98%&?wFI$=v_y_a0&-lWn#Q@xK ze@F!E@P}NMJIX=WZ)Yil!3COhEP?txFt|WuMN{!L7U=W2`K1h6{s5Lsi|Ez^mLN=z zyu@iobF9?rf3o(HfE_49(l4Kcq&xqV+iTE63A?Y$!Omw-DeUO>LwUHnmkLW*lP7^H zWuMV|sbSyue*)Nka~OkRI8+8Ocxp0e+0W1=*8|Yz{4Ig@+20aqhspts-h3pXbGRJ9 zj;O37A}gAHeK=LwW7Jl{Lb7rY+Z>G)5{C{s~61A<`u2)l+2&a z>sSjG%>SAvSbv{3{}z9-;xE(WxfQgr_f1Qur82MUxo{+lV zvhr*!i3k*Y72b5P zadCF_J*9hrMszs^cJQ1D!wfoV+_~j+3}z2^OiZN!Ia|9<$;daI%%9g_qJc18m=`3s=ejU z6*;`4XvHyqF3!DL2k`bt<^=GTAY4C}c2+x?8?4skJ+t);@(tu^Sd)zdc|E&alfO#h zi#Wr9yuAd-4<m& zyqVngZdJ$HhUksQ-KQxsCh7d!6x(sldY7u4tnq%!F&Yf zb&6q67eu*!yv{!<2PRSM^;3;P|H=B$`4F!5`Zr38KVh%05wvR%&IKq6B=7eFH$W4Eyx=$!{>9fMPV1>R6;~C(SX2D%h*K~yA3+Ht(@3V~$ z2h!gWyuQzzvTB>cu@*AuVmKG3K!FjwlE*+01%y7Hji^--ST8;4$mDY&^kM`TK}gm{ zNPPN5CCwvc?Uy2D?G=$+n5KRk$@`+8ODQjk2j_3A8e{Px@1cGbXiyXvde`w$vWfjs zvhLqeTxi1EMa#_jD!CXf--X1;cl~4Jz~7+(F+7-d#&B^E_Ir#hQY}^%c_mg>-=z}& zit=6ain2d1SLB6qhBsP;Dky}S#&HqhdJ~m=3$A!ZoGi5?4w#rhKgIE6Sc(==&P;?j zZ~whVCKYy$4lSPTFjm57bcG;G^}^uG|Hkxd+~;<{6hejln;PYu4{ z?hH*TK9|C)i^IvdwKM=WK059tVrHJq^*$e7c6jHebL27eSk7!Q@>Zr-cm~ zVR;}(dLusE@_^1a!rFg8X^oB6qsUSbJoDkkd=y%5*F?5Hvx#i|qb5A1%2{``S5av_ zJ;jAy)BM9c%=%VbJBuS%w_1pa*OYr%r$UI>d^nt%H045)9@>;g*`|s@@jyaxkFhwiyov7G-~OC=Q-iW+Sn}*>ip~(7`_lU@dF60Z`;XX6e&Vq5JuA}Rr_r63JlcxW0KZnene~@x)Ug$w-(Enh6(1Qf z8|_Ksyf@rctsNdnH{7H9t$5=ow4a1ip8%Y6C_)}6?###|s!pxB%P~hfW{M9I(Pjg* zyxlauHSdUtI@p@e0Cn#96kjBGkzbzTFXFLZ8!pW7cD0cc7;;+S^ETU&|H#lH!qgg?$)GayF@ zb;R&Y{v2)Zz=cg&7&-g$A^zc@;1J)O?$FM5A*~}9mpS}#4PsXpK9;I>l4T>QV^?l6 zqlkI$C$$gX_v5&S(TV%uE{9=@S!(CuXPBPJ!can-@5&?nl|>z_s_=nmI(nh8xXzJ3 zC&7jL9QB{!k<_>|_wwDh$U}?7uIi7&hzmV&4PzK`AvgJJIH9eQ2E&5>oO#Rp%JMd} zB|{S1IGU3IV*6dX6hn+Fh?w7mcaMx}`%V|888Imxpze<4t~SyeXyQ&2HHsLRys3nQmO%Xi23e12|&D zbmuQvCneI*?!2?akfJgSNqZbaIz204kS-w-sPz5@hTwXI01Tz|z?=v~sihEQYY$na z_Wwqdw4M@CjC;EO1)E5JbzGnjrS6ju?@h@*uMNV;L!rCJrIpYefcar&FaUS8w^`{ ztf~_KLg|g({{$E{>(7O;nZLN=`|ouX`jx5ZEBMha@CyaMa#M@zkfnP7H_i$@u%>%cu-m0n}c{G%S=joUNT>K=|h5P%JV!OBlzTb-U`WI zDrxb8e446~11bp`EHk^SWQj^HAOW^qp-0d2P-;9xGL&qHEV)@Fzo?|ai}>g+n)D(B zt$p<6i@c8{M7vEwl)|{QF!P6=`=ZXBjyp=DYt?SP?I}nhO=nU}*&vc7bcpd064?%x zA=}Sj)_6$hJyp{JdoOIR4w$X^Yxh*6znG2wa@_;FS$A5;xl7WRU#Spv{eM#h+#JgO zjDa3|>%6UXVj^|bc{lk*1SU6kmHYCGbU^2U5UbAWJk`GZnp%)SLyeaIlr2;Hq1;L!s4rL~jno9)Ft-4>jn~$+ET|$+p7`CG=yX$+b{##^W4@*%_QHDU_zE z!?;T#@&pSNF&^wc(G(N$<%wWnuvuLn##>wdqO{?>xtszBhjKVHW;m~6m(ZH5+7Fsy z2yfc$X%ScqfY<5aauObjWC>Nwh7kT2ZvpAK*b41!<1fF3>F?s}VD!aSTqRqJ-1e5tMMyRbT z@HO5yz|d3UawWFIF4W~EE(}}uyac8lPTpD7`QFgkeO`tkF`|_19LE z7I*rq2(B2p1&1YNjFtnf^12*o(d%-ck6xED#=B%01HrfF z7)cwZBC$?Lq>sn&Nf=e5vAl^jFOf!%#WKjC?PGa82(lY2bU0~RDEW`$EhSKXHu0*@ zI1{fn8B4&>6C)@rg6oQnaLYJj2^1Pjps3suC=yE`jKao)>OG{k<3W8N((Lj4d7(J* z*FLl;@*kMXlWiNmku+G#<%y7r2IumsX4ZmSp6YpNR~)G9-dx_rbM-zeeme6Y44$Re z^3Z4oY;oo2x6$_ZV13xUO+Xwqo**}ewiB@aGU%-d5&^!Mz>_=|e(8<|9!=nh!me%? z?U;zelKvB=+Uv!MDDdqmv6n2Eh^}m+;ph;Y}%%Y={c#(ag z9b?&RjAiL$NYy9k@MK=AVurTgm|yIq(h@#UliJVb&M?PLa!%nL(6gaaq*T5|C7x5I zR9=6oR8$O`%9A~MYTrOLG~tVIAEl0T4AdY}!Zfw`*i?SVB6xyb_iKev@igc%!5Dl$ zjpr0kT*BV8!XL6@IV+&x>M)6P1cioD!Q0KkDXqw2r{5ceSE8)5zTUKJI?si_gcdU( zMfas)GlUGd;Lds1ktxX|LLCCdA3HboavW5ZX42SNAs7v|~1X zHj|GLcA_@Tn!h484wPW>Y@R`@-hzJP75eNg-W4{ePJMVdRh`Ahp^>$-FqO0E?kwm@ z-=(3m`2>`^JDX>E=AaR8N^b!(s-AOrdqJq)ox_KUG`wZyB%3c>;ecqhd>iXxI%TWm zNacE=VH<7-NjLOaFt5!GX=E9QboFi8^ER($y=bM2Uk`#!>|8F46|2qV;zs_Exlr#d zrA2eGMDEksx!j2zH;68V!pXz=1>BRu=kZizRZv;I=i!^MkGlek$R+cz60gyz&1fjr@kHaduqM2Bi-ykU;@;Wc^SQVV9B#C`04f%7HC%pp z8J_T!yyE#Vx1GoB^xZ-hi+dhXCJT;>M6w`kN8@p=!<2e(>R0Q}5PD`2a|U{;5J*mo z)2)TgafarQ6jF{6WJqZmD6ap%w-D$rE~7aqZ&A&#;@b=PNQ>XW?>)7AZ*AEmu@Pi1 z1`UN^_x55gC}mC&R65~Hurqa`BMT0M(99)JN@UW7B~muc>!C-|??_u$aR;W_TMNoxu|6Cq{`(SMfxdc= z*Pu$P(F@4tt4oEq3l@w{9HGCvS`OXtp;*dg|9j|>-pcQSxD*ul&f_2mqG#XX4*MUM z?OJ8PVc0uTAn}HbEpC2LyWu5~wC^3>(+4PJY^^lxIaoWid6!p~n02&Y1iS>|k_Uad zRcfRP-xUzcKe9XmiZR<79t0g9Oqge8hf&%Zkfp2i+#0@LLTRfBrG{%kB#S6(El+;> z#3j2H4Nl+N^crA`a(cTwCFS!q#AAy?+&giq9?AFWti@Mz8MqAA$wjUUxN(1dEw3WK zw%z<%>^k|img{)3eIYO)3?m=84vMXjv_K?F=;L*~4n|i+#3{o~%k{jnY+;qzLhbdX zvkIDjo`uojl|0D5s`|LoCRGx<)^p)bqFR3Xl|W4DTT8e<^>`0#Hq2Sx<1_FonT9Rp z;mfBvK}kog=5YptQ#!>XH^?bYQRDm%?2hzKHO4)d&TshV6j#}ZDW35I^kEoi(~ZUy zr;+QK_Qn)1-YBOyU46)|rZ{|)oZ_0wo;>@}*YUo-S}l`SQ0^wVGCtoVb;N&c;?;1` zzpk_sH*Y%x6c69bpI0k?g17eIp#v-bLZRZ3+>7{7wep2C4!P(b6v;*3@qM}IPrYA? z^e|&qNMHGb|6K2~9N4^}AN+g4_u0aO=)?yA#rF>#=Bmf-&JTH*TKd(f)rY({2qe~j zJ0w{8$u#SR?n%)faR)NWh(L2-@rsZ5UWpac&5@1#SdDDa$8u!$VjOyPp)tjh`@2*u z2Q~bYe-CQgC*@Z%{N}04S>{SEH>gO8*#h;2xSSP2IlGdKyIGQ;VSFz8r)u%gq%D%5 z6>gEtUBj(nK=~`W)quCBBVDr8S_OhfQhEx!G>B__^cR*dvZ84Ca6Oi)e99YIzNLYm z@~(1_v&}*7`cy8SpFYLn+4y0&l=7ms$;HzUiIA3@wBr5BVf4~A9^?7`O(ECL+XlJz zB%RsDcL0t{w)0Hc=mMirT<8oTzt4COXh6l!(C|GBL(rql&t$_nB3VLnKI2UtVi#Ft z)B_l*lB+_e;J|7UEroTFlpe{lgD1!Tih0J`jxt@uDab;?Ojf0Fyw!OJ_=qLMc1Tus z;||^l{d>5BSA!PV;Tj%lVsdElsGZPz$Xft>d*N|ENUw( zfVq<*cgvODZ@1LG-P~O|?H5cfWP>ltt6t+Hz0zj*vKqj%6U)uQf_1)eJK(7(U)?iYF}}2k;RX8g+eJl{VU!K zXR-Uf!pnkMgnpDzJb*I0hl)Y5V>Sh`07hKvYoF=f40ENw@cLuNVOh zW8d?Na{4}I%TorLDsU0geZQo3zTl#o9^+%Z<%NBzeDymZm6738(3rv~`v4bqvJo_U zZk}V`Kqm}5>0_vag`-J+l+Oe->rSnmgqL%umlLErMPu%1qS%X8$)*>8fY+jo+Py#5{5`nLycQggiNJGs^m ziDU`g{tgGu8I*JaS_-k`zcQ=7d_q=Te1a!?%|*X=3bn+c6SD4Yku0HrlTce-E$(>| zR9jX)WmbOWl&rku6u!Io5RBJF-BYTrNKp4QuZVrDF_lb83iS@qnh0n+hEww;sgd-; zX~4Ve!r-s58f;i3*ZrOy_k!Qqz8S$QQ#o0#Yd1$4+6dL1N7tVO*3O7<0kJIrp zd~8j_mx8#YQy%p!nqfB#FF(5-N=wi2uHsmyf!1TwpWMk_{>TsF+LuvAj(Q2vE#B?$xOM{Tk zu{py00yM*NTdap=mz9Z!^vl(MAo_CiGWWHASfG@be_xh%9=>p%xZ*NIf=SQ+5J`Q0 z#5rF^e$l>24CvY_R~QxEzwMygKk^W)nG@v9_6ecB7aZ}_=n5AXcTXBwSEMdw#uXf^ zU8UPsFeV%>|HL)hRZk4|top=fKZ({U=S81js&*AjOa^thDkb}cD!HtZv};nphl9Cb z8hH(S*g%?d4eCg-RIV7wmSJa`mdZ-23iz{+^ueyXLy;dxHxTmB}}tOI?a}RTT|wy@BqJq_ZMf zLVw@jZDgHa%sQDjWt~wsQOErFrkgwlb@q#730=L(MLbC7Ey-a%E0f~4ZgFp`bn22* zBM45Ui|+8+5IL{h;R`L9#pCbt^H$X9e~+(+JbLlNOR#7Cg*QftUcc~4Fb!DIxL)Yo zoj1DCg~*0Jba#0JJ3Z{*ze2I^uiVdKosvk0+eSjU@f+V{?V_ps!1sRRlZ7FcmFCp% z9!#@-#~i`^#U2=a{P{ap7b@YJ>}-7Y;(fW{R{ujL7x&HxrZ@hOTe0JT%<83*)epEZ zD)ps9_Z-RO{F6Te`Ol86dEf8ht!Vq7{5kP~hg{xv2_V^pSX-KJMjU%36|Rqox+Ubn6i}iiNZ}0(nmmv^~oNZBGc=l-Dr^*SRdZ4>%Th z(I#zp?_duvVYj`aMNCS#bT|hl%?_eA9xQ$FYJ^krcn#D(5uu@E-h{6c%m9 z-OjVZJx_{sG;<$-Op1OJ|MpE)J50?1y0l4qKc$|(t?X`NL3lhUH zqw$n%*JFg@X1$*rdbqzFdP4c37y8Sg|LU&`ex@=ddh6y9eCgni1jxY~2hOE3&l3lq z8fXkY>9N7n)IcCZcUl-INBl*g9C0UyE=;$Q#QO-i{jo8q!KWR_#D z6{Hu&zf%I6WcWmN(=09@xEKTOzl}pZd6#lD9u_Yk&kB0)#8Nwq*N_SKaBk8lsfd0HRmclW22DO?$e@lB{xp$QMxqi^orJpf<5`d zjg~(f9YKCIbzfQ%UV0R8SEnQd@Y~Xk#k#f`C!x#jSa<8bTfJmiR z)MsG$+bhbIm7a`?>S=GjQ`zT`xlzK6WSoTEoH#wx3V!c$oIXk11!hh?3nXE`Qy-7f zws+|TVm`m2^k&^d$UR;cL^>;8yv$!wqcRA|y?9-^u=!T)yN*QYB3LDTIm(rAxW|e~ z(1i+RdV(&Eflrne+l1U5iMlWZK23SaxWd;uLa+SzbuszXM+tXrlvP<5!p~XNk%G#S z_8qCL3rpd1Dl@r?E-Z!5t0#d50r1SMMl5chT~J^7K2ont=c?%5D0@+r{kw{u8Uf4U zvPm)28=is{Zk42`3DAs8(kB8m50dopK>Oo@ zpz-f?vr)4YJqYD9Q{=F3mv-JpAOHGn1scC4&6D=2GG|jHjyqBT{e3hpRWFpg!@DM` zH>{xxZfIZ)J=Ja^57p2GH?#$bP?7vbbF^lmf$q(nfzDtj{QJ2%!yTVO5d+mrTpGxy z{9TbIr0Gr6?`H9ftgYjN{6UpGP$^78>{z7N)_v`7e(bKLU`dUut*785->y9(S8ZTv?%DpH z)TttV#f^e1qsz7Ru9%Y&XAZo>)zKS*+~irvwYqgMZR~qDfp*r>y^)7=^Stl-hf&iO z9&z}5>G6361=Q8+dLCaa4(i&~)st)#?(%VZkT$9UVi?xd!_fGex(22C!~~hGo}9ka zdYHcAt3g^dbo9A;a{4ACu`aRX=l_rjyxCb#uju*lO40hIdYH45lvE$PJ-jp5*J~Ls zZr7JDYBkVb!Habb^bFg#9vJW(+Lf0QLctC7R5@XL%&&KBD8K#+Uf35y4d%qx*Ef`3 zKOho_#trpGXscQyU6WNmGpoMZNLI~ngsQ9Fsh}mJ>hVUh>TgIqfp<$Sbo8g*q4`5T zim`+PR?EzD)(m>4vC-acv%M9KWqW%YqrE>L1j+XPZYPOePz zo9NHTJ{>gM__c{_BetoYTJ?_~ip%Vs`<5|dAK=l zs`r!4o-~_{Y9^a)(M(U(j)RHBfk71RFDVU@!cVZ78%kS@!tZ~)+-MGc349IeLeRL@ zOtKD}1=rscz$r9K;LNPKr1l4!3qrC$(}f*%drjt%N-k;Q6@|5snFCd_NhJ?j$ag6% z_1Xa$r8k8{OagLc!SruNWPAmx_K6-428UdwAH`4AWyHOV#kteLmby5;d(cvT;i*=# z%~7rN>d;s0lt;P3Kg-jU+o2?~xMFMlk+62I*hY`DpjOki`W5i}UJzo&wb#Rno3+zD zMSkn2^=Cj}7C)_@N9ob+Rq4eY^pmo*O_iS65v4)X?X5IlnW{E6`VKnW@paKR<6Gmq>d~SHOP&GaFpvh+P6_w+ z)1+G!=vy-L0z#?zi=CgQjz?_1#m{uZ-YZeyjz!z?hdacbncWo+zPYhb}xb;uO*J#R#2%l4}n3&=dbdu94-0TvPq|hy)d-%LXe@FU_W= z#$7m0wHZ5_P2NwP934a1-+doMV|wZi`_ez$wOFjfxjl8^u<^5=`ecl`RWCV*5NPh6WsIct*Pjj4xu!zKl7!Iz4Zt=^q@rp)Jb$vvf)jz6oP?(jYSo4b~X(>yO6SQI{|SEMo7ZwZ@NFKA?g zhUun8)&u&(ra&vgdR!`^>|3X%(~KIlY<$RV4)~ zf`m}DG6=Qtm!3ax(y2Uuoa>{HrrCpaKPC!lMBGbD{%$jIbL76MJ5wgeqs7cSDAtX z!#5f~d2MR=B5y3EuSa zb?7J+{8*A&A28~(Mycgh@=P`)klDI}PK?6#^#*t=ajtlKlrGHrMKF=07di%0`e>=7 zTRmDT>28mfL?`Wasg+Cb*(umv++`X4y1pjTxDShCj!!U7r%zqCd!h$dw^PG0`jo^{ zm(mA>;}0BsOcb7fOb@b!9(cHNoPHdmPYW`<8C9=mT`RKTM{E38y;9)4V&!n;vZ#2c zn2N^g&jgyc%y$~ju0qCPo-!$GoRo3yj?<;HtC`~^>+r{TfLWMlmGtO@7Ajjg~FDjb<8I|Mh(@Mt|rs&J$SW{%(JoJ&>Jvwad^x}{uI zAy^t+m?XbbNww8rviwehDm+#_C90=gc*1w?PL>s_sLXa#WCiRHF8~E+O@U@`A6=ZH ztK*&%20~NgscKyVhs9C&;i*!k{L~w|Fy-C&hD6pz)BcUD<7VkG)yslqyr9)k)UEVH z^NDDirU)$1wq)AlXd4kIXucq76AC<~v3SOG19NNU=e<@H-0AB+uqE3tUGIsp+Gfao zw6;0~KGHfm4(4#C3uO^hqx3kK_RkO;N%40xAb7yQ@$WbFB)O)ql&$G{l)V<>?#;Qn zm(Y*`7SGWqGj%^0eAPFGMLF~I0aW8HxlJ~HOM++BTM|6!vz`bZv6dUF+VBDPxZB?H zYnjf?lDwE5E~N%Mn=W}Vb1^&ZlU8|Z4X}=%nr%R%nJ82Sj7*cZiztnM&DO=~#4egM z2a@>V;5)*BZy8z7&wEfEaLlR|ZIhNGc)8n@_%rC(9K8zMo_;}@A$LNlqHl(cBHq@8 zsloQQ^-A>m+aMM4cVCqxP_wyuWE-K&@J7rCI4E?68@dhiIqo0NA^&(*x)6kuLQn{8 z8Mch~=jtJfV>a>go4I;?>74YOr~3m*2hY>Rg%)_Y5*J$9&6lJh{rhYM4o`K@$xWazff_=y~doDh?oNcZUS2mVk#3Ke=obLN@hXB<26{B3VK!7U@ZX&CEF+8NA?w zP)`b+s{2sJGCe%faB<}(c}=*?H#fc$l)Fq1ahy~=kScQkvWT?BdaCcFFRbzgon1Rc z0~P`K-de1CLu^{OSm^`KkaM{nW*6~09Gk6FIO_#CUt6rVmn(6CrSv0bm_mo3=vusE=72Iz96K*BTF}N@DD#-i%c3i}faBG?`;np@^4eYKO z*yeK!>@+=JkFkku7iy~w`FckjjXucNQ_YJ`sRht3%_LT!$6Hp>%mTf!eU}YT`wdRM z`$JECxd3J1hRUw}PA@LkYg306dXVhw+_KKzSDiInNBKb3R%TgqR-m(2mbeSU3$*Y+ zb@to}+1aZrl#U86qvpK*as*XgsW*U&gshc%9f_cbk0FsrC>4c%b?-_&)oa6t?iz;D zogS@}i0N9TMw~}^&cI+OXS>^||0?X9*J#x$y=Rb+eDcdWid)iof?_yVOH4^y4OQ3X zb2jN6`}x(f#i>Yy%66)1amQ+$q+}L9Tn*k12oU_PzQz-r34podUFcDlljj;e-UMdK z8oh=mT%6(UfHm^%nsRRsJIg(_#`xsI_kaw7 z=B=Qt^?HbZsm~?M#7fFrkG}upvM~;*b^J1 z1~z7+)V!?R2-U382%p}lC;31l?C-QCyM2lvC^1>EhkD-6i&8e};)-B{O?oQ{oNr9v zOxq-ZQ?yBsx1WZTE}V{^-XwwZP$alrwHbR|2KC#lE4!tGX4UnZO}g+txe7trZfpiw z{R54pqLDv0%SK`gWh2cB!B$_RX@$nQ^9i$&9}4C7eTwk?uOPLF8@IKJWYumWSwgQC z=^b%p#8e%Ek20`gyMnNvV`uRXMf&T)!9u?e_2(=J8QKm5gVe1le-ERE@->8eB0F&_ z<%6hj-(9i^$8c>IGFVk0>&N;6383p{2X}ldJNVPbz@7rg4#J`&rdSt79Sx8O74%o| zFyy=wOhbzyHV)Lj#$)GB;ie-Y^pBPl>y=GNuTS-v!bD_e?a=Vzm7nQL zEU*eGxcF2=ard22C{cs2^cfK{NR@RBLQul0tG?6P!uiIUcz2x8oc&5~;3XC&j0pQu z?ALk;c!$6}dd+~Jjs?ksViBh8#4+lOJim)p&D7yW<>&2o#~J48J$gNlW5Sr^$X>m! zue-s@3cnVX5pZBzYp>+OEy-7KI@>rph^Fkto-mIN?v*lD;68n>9F3h;+-L+{>puO2 zXwFMC7fu`Y1O6Fwe81iS2;@4T4;AhxW*@*3nM&IZfYIzjPalNnI+Z>%zy$j>Ee2rQj(vd|ogY|M{@)azPX-&!+n;<9w*}#9$mf zq1wARzkWEiKZ1!^LqTav!{^@p!-L*G0z`lxg}CYA0SJ^{-jhP%XTE(XuD~ z!>nLyckA^!6rz;V9nKmgJ{tkyHCgu=(+7T8++R@|$8fj<4xO+mpY@D>-QgO{qPa3 zH~|pcqN2gxxPsI6qBmt{Mz*m|v{7c#MMQ|ZmMOf+=@r~PojB*}6p`Gbk{ga$dAxf9 zhNAh^we~@B)(zp*Hnwn1Xh_l}0M@ZX2K3!pTsl7Gu^ya94_g1D4(k2o>)}8*9A-B>%DUm9R#}TvXsLWR==`o@ z5zm)(!KYj|&>Ubc!CbB-Pot$f#Zz-Z1j-M{xP)Yla*7!dP{bjqJEo6e@;s?1+?q@i zPh%fHy5QFkIx;x%J@+eao#ED{N~FyVm$M zLLc4lqrMC;hxPAk$H@*I{kX4if3;Lk6hR2m2lS1zWE5u(=v!AD`wShHm@L>6$JV}M zkj&iLcQlfXgZkdZ%jM7a^%F1iCJzpw9WV3^w+zoupDLWd-+H0%T1zp_dBs+doWp8& zpy3C->{RiL9tHgkX=n5h>qmA;D);_dqxwBPx#Jtwe z$GUqsvg!P{D^zU6z273%wWAkl_Q-Gqra?r*5_@DDN*nuP1&`~I)<8slvB%QgXZzQf ze`J`QvePdG=ihuf*;0|RMrJ3`&Xy?wl|3*Ys&}xp#cEgHQoLk@VT3)@+#Cy`n1em- z=3wu5n>d|!;I`L*mSG{i+z>m>6@+S-RhOTydvik|uVZy{RdCwsSiM|0&etpr-7;`2 zAB;8XtT3sbh;~%R>Y+;bnI-y^D`9(~pp;XKnkV!XGOpo3-#meb*)Z#PZ2ahv!a%mD=UVLFR1ok))0P0d>0fpC*CJIK2Y0psib~8fXfQJ z#s+{XrG9Vs@}}n7TY8KSa0a3;CNPcph96JiVM*;4xTxjn@;4TSKgg?PWV|ox7=5<> zyU!j~ty!win1mss#~uQ!hB!T1U@Tc^!rB>M6uqJMYCh+OPKX(DqPGEvUavGECJYf08trEN5pZHUT(Orj}JPC;|gLr=5?=zF7^{%*d$Vn8|Z zcJ$cnq<6Va;AihCph075! zt(K?!5!o2iq``kdG=g%Pv`k`ydw%Bn2#|_q+go}r+397mg?MR-yo&lBs=l52ZEqP> zJ+Llmu3&kWoOb4AmrE@KRyWu~%LU{4S!q(<9l9Yi^z5-9eKv~g?nF!lCt9-LvM|uxs@6B~-G(`_s#OjYZ0MFOFtMRqf?DjrOJ{|8 z?h$xOV=nAy%JE9PHQ5bIs;%f4l`PE;9}irW^>mfAmC;nuBN1*Di@4O+l`xPMDkc$y zwTos~P%Rs>hgjE%_1wDQyJEFR$c@}Xj0)zjSRPJ`Sncjvs(X?`AeNdIj1?zWHRuO+ z9IR_gG;~Ts!WvqE&tkcI05)O?#RCu^CYXg%VuIfWF)?Pz1!Wzs%%rER3LT$S535Md z*${E1!An?AVgd(YU~(Q!CthC0z^ve(yO`mEN)IVKQrvU^-k8`j>V$v;f;y>u&?s{Z zr8Fu4$eI)H8y)X2i4;^76~ZXDnwRHzJEDkyEU9hC%Lr~N4lO-3Zv|FKmi&xw`iaFo z5?r955OVYeS^D?r1H|Yt+rSgG3k1k1Q#8v2M*T8aWVr$qNPNV%VEyc4z#;%4(Yt6q z#?k>^1CZYND?WF(grWPApkZWofma}C_=vkn&U`@5{IFw*&Z1T+Im2&*Qs9?C&P1M~ z6Bb3zEQ*|o`UW|Z)g(E?FEp0$*LXo3WgC*5$u=Z8la(6-0+O6rBss(V0Uq%N-p3y;eE_hUIu^&cN1jQRciVA9unO z5x|usjEV|-gi?pD$9%}vcWwnL=>NMX)zExxp226NP>v%V;^5(T7BXEXb7-irC0r>+`6D%S5 zv^x<>b4Lpgk9=2Vf+Z$@^XeKFZyMJ++u7JlnY}<4iJ+q`TEUkU-I*TgZPC748-uF7 zC_5)yMwwo*;B^GOCc87=w_2(tD1XM_WD6`)9=zp2f4|r*zSTt~Cj* zU%4KFqg{9WN@6Ytl5Oq`Bg2oA_~C6dr?_HoEHQ^O&;boLE^1vE2j7+7WqU^Ysf}3+ z0k!fk+nO;{$Kte*!9K}um%vVRLhIg|7sgadh#XjT7-3cGN%#0zL74H7WWC@X?@;LN zt;ng!gtx^&k)CvSIgCE3-CXski{?Q^x8{e?_F<7t$NQ<>+UX5EHKZLsL&4;ysU6xE zuZ$fU7qLvR7(K-a4`_t^mOV;=)1_nagDd9XgtPO_2K`q_a^XBRL$OSdNN5S z$t0O%CVN6AVG9r-5dqn06huW#5O-1VaY3X{1MZ3j6hsywK}ewj1A+>OEQ&?}B@qx8 z1fnRY$RZ*r0?C65DCqaEbGl~+!RJ2rz2E!0_kF+b$B%SRcb~1QPMxYcb*cdCL_YxQ z=K`opadqxcT%c|cAA5^@czAjSN_c{uR@{oeiC5p`K}_h6CLCNdWN@o4#i#Hc%}bc* zD@W}zU76pqe)+c9D7tf7eDrckp2; zD@gIwY9Ir9J!3NRAU{@thrN#D^zw7e9E)?Qx$|*o?pSQ>jJczDmOXc@7#Qc8J70d0 zcdofpaOT{R%nrDblGe1+Hm1F$hnmy_`Ggp|VmW}`H>`_59xdM1D{IAX)PEHMmgGw?~Fa8U&N1eIm z4rPYTp0qP&kBV1=ZvtB}zfwD%d+w;{HC$7+>Xo82%wo_CsAg0^yBlX`&%Gd6QEn7j zZwrxij$KvQlAw-t+hm<@ zU}%ue{mGuiu}A_RPU$iRD027DR+1TuhaS|ocpMtf@pW=sL7>g!SaXf`r z3@n)CNqkgAgLV?zIwGPV)gO-wmx)FN8pI!7h*=6tVtGCZ+5+r^yw*e%B=OwDvHDo- zLs`q23ajG{EoUuk!oe)Gm$P(?M;lgQE-Su`OsXaf1KkJj<`qdj}D1VQj%_S@vWUwoH!s|_OrhL% zLQ4d9Tjos!d=h1Ab`fR8P=9Rm6LFi--7@bmXmN$NQk%28*?3tR@bRI zWCEEH9UV_9Wzem+QS;OT_tylyjood4Pd33c3Qzqy`%1-bpAPN ziz_U543tAnu^^s5<*tkWoxM5Hga)fWfUSEgH(lFP64?*sCTfNu;3qS5eXBY ziU?=p9vTp%xUEhfjxSCvkB3K5u;a>qo4IL6RiCxips@=iL-u$c0!%HRz7P`dUIlMX z@;rd|o$St7^OmPx*cr!v=!^Kgqc2e2#Kb*9&OSf705VsX!^$ zaPF+-82*=qQ5E`&(xlwOxex-K{I80AGBk=5`?{$f{}&cRmH(1E)ctQ4Lm3H0>YhE+ zH?U}*YcaIE)VZ=6+P8UHT6vrwLGjOEh|tMxGObk}Rf-{g9%6{KmijN1rX-6xEicGe zEL^PrzZ?9g0jFDkc2$aEWmSsT z?F3J^ncYt1rs0OQ#}cTR*=-2c0;01Q1ZO-SOv-PLUh(-UQ7AB0z?m|i)iKeKm_ z-xK6tiOj$7)L8&KiXXr1fmnW?AqHmqdY;knNA@Vz{*uS;E*Ql};SEc}5oSKbs0@F3 ziX}(!y5eCtOX-RkCw|!tORrG2D%fzgeL}5<(S5n3GZTas&9JoGL_Hv-2l2xKw{4aR zvO#HwlFKHjN>atT@x}h3K=!G~VDr{NcAh_5teUX?S~R=WrZ(n)b|9ZK0AjhEdL<9s z7VHW$K^pu>XJ4jrKDD%!y08zVVm=gv$Y!5^W!75Z2s3NF={Sd3Yn21?FNOs}ku6qy zV)Y!*ON6-{8C_dlk}B<5L)>;yARhClR*x*T1i;;HkGT}L3bcP=vWgE$+g6xq>NATp zV7@6ieT~=2Q%tere4cbcfLlpox$)1f`eOsvu4}0kxWH(n87rW@?#HIviv1&;XPdE# zY~)xzx2&J+uqv|jE)bw)$fBFZcg|}OX0Nh5ak=%KcI!dwR}yIt56?_TCql+6D=#ey zP(z09ZJH!Ex!8K8ac@J`t1pA&M-+k@_oy_Q`sk?SNWEem%`b}2@w#=DzZMVJp9ci> z747MCQ7TP6+BFWwMwQ0aa~p0H)NL_PpMnDV&ZSMTitFR}e(fT@w`lZh*{-T}p#F8J zuwv4(1p3KVWLsj~t%`76el1yx$WMsVcUuKrG~!^_EYN}NF|1=_N{Y`f{O*AJrQeYp z6TvCfem2vh)7gz3C(QfhrLwus3X!1fbw8zHh|5v+|^HUXv%2yGUp|M-2Q4vrDHd3LoQ*}omQ+q@Ky*odLDj6`;g zfGt@n8*Iba9wC<(Y12rJMz~(X#%KCU3()orlE;#u4uqV_$wkM11tFfJ=!WmJO5 z^kYBNAsTv;j*Vam2Z>WwVY5IilHC09HN1i*S(3^<1=;B4pV~-2p4eTr{O+^3t8!UB zBzt*zp9BdyDbc}i@YJD9UHWsz`ZF)a4suX~vb^)WL&#|Q z7?=}WK?8j(Ds=f%THFG=iQMPG5BBZBbdVeHtd&9kXO%5D^A4-txgc`HV;MXg9F*+7 zq#t~b4bUl2NQxq|t(IxupLeD9PH6#Gs8CB8;Vt=8OQCh*$1_{{(Qb)!M?q#H8u1s% z{^kH0G=K0dzJdPOy9&~Ex1oQ&`Zv<1Og; z4vyLK>Q5h5kW3@>oYeB1?#Hp~|Pu3kt$9tJyH_6by0>mM5h;uE}OjiZycBzLM0Rs;Sa$hC zjDqBH6{gLtH&__dmmkZMF}V})NU>;MCNR~&et2(5Ze!YbP>aT3jOh?_A7(m|`$(Q6 zxsPN`%x&1T1nvS+O)?u^HQ-oR4g@GJl!+^IC%Z%c43QK|$Lan|W4gi0ODM zSK2zl46+}WVm}dgqDp%y8H#(XBqlCuApx({zu#3}`*KWvq7EOsDp~6isMxpPN-q2;rylH6RO5g!zaS)E3qMDogZ@P z3$|wJ4%x7se%=C*MRNh|Xrz|OmXU!$B>ZOe8f^GCt9BfqwBQ8bn53E6unjP+*bQ3w z>s=`GdsrDjO)fi(2BrwW6s;y-*GRp&HJRCa6Ec!DbKQPxVEbRKWf`>kA+Xqu&(CI*SV; zJKAosHZs__mAZ%QFHu%_0BfxBXyp}gY{+H8 zs+08+tVVy?U`O>~8|*2(60)Gfpnpu&#tO@0XZKJpS$#1azl&nc?8H{6$rBu%6&s32 z_xRamY3zxanSnjOXKGPC8=B)(Yg}TS3?8K^I`J}8yKVQP~Nvi^u2LsD`x<1AV9v0+@l>eXQ&zbUXZSm!cQJXSSyb-?AVBp=it1ro z7+>Zs#}?o)rKe&XQ&k%&5jtDJ^G%GCdLaMO{ydw1dzfItkvKEWLD}!kI zw+UQ=8Hkv!dc#|DlE9}2s|qJ@sAGR2a1>Akp8T%~ylXgtTRGfZiooq8ZlNU}{h6Wq z!vsD9rw{8EdqLtbUZZ(Q;%zbELL@%Zf+fDTkH>~cRg$sR z|Bk@n?i%Fk|1o`&>X@Q$vKl#?zKawmhaaIooVttu!pDmh8|Tl!#oK`lVIcYo4=?{u z5H@F7+4GIoMN%}|nyh8P<^Z!Su!3X9dcJq)v#bFqhge|g8ToPbxup_sEQTi{%k3 zW+a!Gb9M<9EvYunk;a7}SK95&4Yf1(T&32~kdwpHxe#WgUC25y&P@f*RR}qJ(bAPD zR2VE{9VO>7^Uf**J1Bo?i)+yk*R(>%Jb7|rp_7$&K1ver8BHUPjz}$!=EXUdKiQ5H zbU*=?aW;ZNi2D(ZB5dUdQil%~vxOrR{!6*7ggM$MzQ z4Gjxbjqu~g0hB2AW?ra~-Zw2P+pWJK-&vbJF9h3yt+~#T=8IB1xpw@u*_U8y*!w$D zIl=x8rW||a<6H@!0$~VYe+R8gTCw**U$n==Z4W?*Q7XxJ6bTEz+2X7^l-L>j308nn zIL+f$k$PxjYmrqPFBe%aLsmQ4Jyw|D;%_x;Z#FDe<+#$tR=G3O%yz5@M8x~4<-LuQ zvLvP2MVEw%F43rR0YadCeeuy;oC?ra$MjBfBcQ3An|v(bWvlKuB-Ob+rzKpFamFZ2 zL&B+@kcMQ%J!K7PDQ&AP%cSDb*||w>Js9(}6t`3<_NE8wx3tv~6W#iM%MPbF>lAJhco)07S6;?eV6C4cZYhA}G#f0woUWy>w?4GAmZC>A!fg0ofU=cihWNq#QO_entr_~018FabyIjd@}783(T%tQkp;f$JJp$^J5ZUR4-y z;2^+f4*k_2sBF<3K6LEZcQF`|C#-JfVX&}0gGs`yiP-{kDxR3UeuF*O^Yb;k0Wa2y zSkIDX`fH&^ln}Z~eG-i+>|mX2Rp5OflH$rD?QA_O-K(zGTC200f`s#X{V4LR;@aa zC{YGItU6eg&Bem>uxON(dKkRyxxcK3ohhaQEX-wm{^;H^hfj1T7E^8by=jeBiK%Y} zn*vj{KY2@ig2ji*nm*@EWcidC04l~(LSu6u^D++@5nQcS2Mg${wSZolqj}50GWr)t zw1%&1YeHYH2?5z2rXC0<09$ZlnjHR&(mc|~pg|TRzC?s+L z6`dpOjr#I+s!}E5*}+NVrp+0Z!mzAFJWIm67C42xmO#$w(3EWhEv7o<8V;YpKq2M6L8N?GoGh;>-R zZ3)kVLcCToY}w+?7=c{C;+#uuM`D87=ur_@&SPjZejp~K;XtY-)zzF6x)ADc_KeD& zOY^e%^Pb>7Ppu*sUIS{+CKuR-l_x@D6dD*T^lqroyP-mX>ZdZaHu>vAFV}}&+5{N% zZD0{DJ2p-S%v*$s$7zbIH#kfR> zah2=(q|v;LE1czNmKevFI8%&+{v_EZ?=}D%NH>ZVf>)w!)WgWKI`y8_DT$XveTE=Yt77mZ^>g)GEj3A%v2qQR_iI6W3V%61{{RiXVW z#K?L6+U#YM>Or&=@b-oTyiHaQq*2h;l-^e#gW0iwca{Er@FS~5>u3Tdr#_JdJl?4Z zr&V5{!l?5Dt8pv@SR`4zLx7&(DFn!PAIc9b8SlejYgp>{eYeYZ3wR-OHcW+Rrv1?B z$lI7$Tv|8^`K%i53LV9AXAv?VrlBqK6|qVbPFo+@1LW=u&_6=%@FO!bsCj+&Tv|3G zI~O9K6&8q$JWa;<)Y%<0`^t2Pd{gi39(N}b^i#Fq8G7@gli zUmVjCEj7q4y){&N>)E9X9a93@!dxvi4zdhd1--=6*!v37ynKScC?bNZ#%Ogn@}&oA z+vLL4KeV;GP1Vg)ew$Ty$R#rx9{rAsd0Al+1G|F=i58}4p<`^4+f~@gL|v%1y0d#) z6fqe`&@fKgwD{WOBGfcS3zF$4p+SCfc2P>c@y^V^6^Q8}_%l^h<5{c&pq_GwdY=VL zTXO@`7Mr;2O5rJphwR9{kjU?c4P~i@sG2bmxB;7ee{R>z0d6Belc@OfP{sDFQx;Z5 zB8_8l;`7mt4RIF$f>3;IGT9M=;EuCuNbJpLFZk@lumTuSSKpeGg+<6YtVx6wkjSm? zl;shMX(yE}N=Zv_>tCoRx8R17@5xAy|5818NrQ9N$PKAJDr(ZEkP^LlIpm+yrZ@?V zsu*D?u%U21E*`q+c-K67bWWSRY&Zbih)0>ct|$0$M0+SM*&Q6iG1H5^qkN9jNmP69 zRe9v`8l9@EYvL*$h?qKgwWBjVzCP|j-1k`H$amIoDEj;jaebVT*o&aMHpG=69OuXz zjw5>T(idsVz?-uzGd#BQZTW9j=oYCG?Wc(8gE#|y5O&9wxTAo)NM_zq_z3nBr=urp zOuhn+u+h6962u|nnnYqI#OR|(7I0jMD1QuV4^n&G8Vj=P#J7E9TnV)vx&vOHCX*n{ma_Eygu zf7Jt;w(+k~cb3K(9nXli;V=o2dcE_}|{e;+=F#=4DH5MHot zf-wo9Syv|*3xJNB5{==}&uIBh&}s4}WUt?!Xk-TK(>KXR zRwAE8{}Mq%r)J?a{IwL9VzkmmP>zR_0q9|UmmND;V&Ii_zQ@g2l={_Xt2-dn}=wOc*)Ul z4ymaaCj*Yna6rK2pxyfXPG0)bXWS0Z=&8nRnMayAyg$RZhCeD3?bGRChOwAmWEz}{F8_NZq1%_K zpw_ITmzri79OT(e`%-~}yRr<9)ckCg!MV8-)x+cJ;gAk)FSXB>MJqo>^t=agkFS!| zSL?E6(WBW$F9dQf$uag|Iwt2D*K3Dpc&^c%vr)z%fSZgCygnDWK7D|8=NcJ~lLzQT zu8|9X&u@2yk6Jb|O0}};hZ`9mYIxSiZ(N6;^Zdru99-|$0)xY&UeMSm#AQfh;}T8} zlK+Ma$D!9XHrn&AOKxrP{&93&99L4-ezA^l|dEFvc{oLXP{`Ivb-Skf)@a z(dxq;8m=ImRV|Eu*&)K&sTNQbsg4PUvRfJt1GjS@YDlMLEse2^^paKvXDyl2%6JG7 z-kmh>p@vjyTVxEd$R?e7v@xP6P$X%mTWf>Uyv3-`K5cEtl&+F+@YyS<=tvt$I1TSd zd8u1liT%L~5V8C5wi4g3wlz4p;VTfWUZE_6p9) z4=pjWKq-%x7(+4Be=ISw?|6EZqcwYC=3xAApJ}YXk&DZ;RSpTE4Bj_hp~0gb*HsXD zVQv@=r3Vr9)c5bd9V7k!GVtibw^aalTVg)ls2_Da!_UUf%Zmg4WssUG&)^~K=z)s2;{@n zdh&64D3lwp06!$<#Oh0r^R{=Fh%vAv@nBo|V|k|?hs5-XDw@{OIN!18IBo1`^g+-z z_XWoNKx+p5*~v(y=PoeH8T&b%j5~qRCpsCNmh&`zImbEl9IA^XMx=QCe3}I&!LXl_(bKvZAZe1Gud3YJ8T495ZSxMFkO_ zan0lp&vN>zn=z1+s+4p`e6~`$vAc0eT&ZrQX>^f4{jLu2@w$~q1XhlEe1Pvd_mCua zR}Z5%ey!{QxRuhL9`ap_p0W<>99|?9Pa4K`sPl7}@$`02E?j-Ir-4bjhDP=>u8bUA zfIf^b^3hkljLV#5`H?!!8xoaT-Qz;zZjN2|+C_%IrJ%R*1d1%~jT#Qom%WV=1oIqH z7JV&^Xj7g_o_-_ZX>dws56$Rf%#Yr-dJAF)(Z~xCXS4ssMzU5xgD*CEJ1S~u&xOO9 z&_@>=;~m>p(}2E4bLX!JD^AOQivi5XWVx&7_BGDq$a-~`7(E=?I!f**=g^S39kNLD zGdSv|zw_l8ksNb>Wj~_~zw=rn;oR5nl=`Uk<%S;}gLUj?8qqZ+h8{i9C8m1K<;ItB zj+&3E=~@H9ezwwpV6L@LNT>cNs<6o8-CG=%l?^?HOe3a6nABQ5Y?>N~*aR zto1WmE{qPY=MTdo;W?;L>8Hu*R593y*7i}|9TN5W#Knl!ZW{fNTAFG<%F9GNy z)M%oeq+_O}pLIhp$3LU~BhbqUWR5T{M(-Q$H)c}5k;a<8=~(Um(2hAKKvKEY$fCd~ zqtX97xHkglb#*a2$f}C5v(>EEH_%D3D z@J;_OeBCg+r+ncX%94Rhn_Rr*;slzzYG49w8)JNrnNjzS13_=d*`_M1v@!V~GuAma z?x%f^8D2;2eyX2tG>r=EiSsO>!E~w;(1*qh=y|R*}#z4E0k+Y35t|TI;I`AG(s1gMK2|-KWNrounZ{Qpk=6e{GyShJ)BihwYg5SorIc$A@4tsF{0|ia z{@CndMdFm! z8;!aCK^#&K`x0^+FacXB2)p@Yy-Gn4txu_^!yAo>@hXBpTVIjK<+^6xjF{dsI&>79 z{-f}jEP#TvaKea^7%95-ejET4d5-dj0)sFjT@Urv+AjAlaU%T126O$^<-=^ zu7n|_c9T)%8-$HWeW6t!U-fzQbl3YvpBSqT)Rt|T+unzYcwKeF`%oermC023S?ojF zW8}Z0a4g+-;N~*t=z@seG;*yAnT#jA732Ast{6EohiX1D);Jczdb#~{8a=()_@`rn zMq3XxOQ*RX8*L%cZuuA*XlbA%tvT{)`)982MTPGg&pT$M%N86zH>G@T;+L()wOUzV z$lZBb0j=9&yb=77)VxzNE#7Lp5dI{E9^Yn+kJ$TqyURt`ZdqF~^<@v-;SPu1~>a(T=^zbJ}Tuv}x zwiTKgTMo*;&sKo>pRh3`F!+n6T3?tk+a*?a`_%Z{5m~c(OJGk)V>nn9eQsnsCv#>J z{dmhhRQb74qcR8WqHA^-mnN-SCsQxDdRdtqR_rkPBprTf{FoYeF7_>=Z*IuY42CkFjTVhm%cRoYolk2s!FGx>OsO3 z(6BU)m0~BQAfk0dF*dld^9^$uOiXNJ`|NAuMz*oF+ikRrnLW*ko#H`s>uzPeePXwK z8K^zhNb}K&-Nr_yk%p^X8MI@M)Q-m1#Cs`ouQ5}bL(BJKid{!zTX*;eb=e1vXWUoD zWLQN!yNm~dbs&y$RMOE2>qvp4BkjG? z;i1xf##~s}M#lf#zq;Eu#zQdpR2>`Al)m0?R70cv?AVYeaJjL5NP$*I`%ZSqrJHZ- zcuDmO2aNk1c#(6+;1~Msu|B%;5DZjn=-orGfsH2j_r^x&`lgu1$=!a*pd;TKw`l9B z^alf(u-`ar_#7@dTQpdL8*XctLFXSa)L|jfZ@c5Bw7|3mzZOj~4Mr>2?y&6$1wJ8?8hzI!EpYOWJS~Sr zgMnm*R5GX%qyOagfz^8(jDK)aiQ?#M(gTCXHRD6377#cl|%Om^8v^X#Q;1VOWX>>!Z zSOKiYQ1bjyUYa^&Rx<5v90&fiqq&nh#|aNMEGYld`+%EwX2v6*jNC3mM=Ku~b32u` z$naO6j1%27?KE|Ci?-U!)pxkX6i3t`b{D3~cil)&nvX``v?%zPV;6j$b}Al8N-QTk?6=yt*l)FOvERzKRN)a)hm@QB^KcwPE&HSSb$0Lda|g%rB8}zqSaO3l>(5YhS#Pd0!Mj{ zQ@vN@V2lYq@u0SgCinzrLD}IG#h#_pcqgVHsso(&o%-x)l%6UEVTAXliVDZGT3|&@ zTclcQlqNbLm)ccn0#=Z~iUUPjD!q~>`Z+&tswa_tV`n&6tRro0mqui28%P#$y6-Z(jA;XT4_Efucx+p_j5j{skaL7~| z`wFr&EzJN~AW30{$O56I)7C^Ym(nstGd%2;DVl?I*8jXHHL%Uq2q4{i^JqVHU36Px zO3V^HwYRIU$ikOVDreS^Iag=2PQf}bZxL_V6gav7=9*ryD8@QIp}d)y$8Z`ZANIS} zWs5FA#@7>nZHCq(sq$wtl{)2!_qDQWN3JMl?$NH1c*Z$49jvYPon6>fZp2fl`nf#O zlHb1P7gb2+HYi_olii4;lAmt!2CjrlXcnK*lfI!v_8C3f3&8RXjghn$tE(W(F(43} zV4@}k;x_FBO)3z6G%#{%r&Ovb5U{3I|5P9@R-=X6Lf$ZM^_5LPaOk;*8v2Y)qXSLF zJ?^*WxZwAz&zYa&xs`5fCK_w^)5K&-w1F2Lz58s@LJsL_>I;#6a5|UrUiQ5 z&`9H4R}P#)bZ~UHC?pYzrUH_;*i5MO3$X+M+$wB94(-vg%})lHJ;^2pt&H+-dGUn z8AU5wh*bF^SH7U#EksQAC?v~aj)1_m>bME~HQYGR9fd%)L*8BEC2vcS9=((SlqZWd zLVW|dzFe>9zxz)sM6hE(bQm zkUCL&I}f7LoMJH&Tr#OdjMA3VV2r54Dr;joeoJ1a$DNdS#*x(+5E+E%IhL#fz79Cd)Lr0 zn8Fiv6~fvL>C)Fte5{pKf74AAGFOZ5A^PGnu!pF_(`G%vhw-z&E?P!ig}U;P&APR> z*_oN~KH}uF)_H5xEhmBJ7Tr$`t(~dyiF!WI3OvZC;+dn<>4=U6e={ZZ5;-=o-7<8t zy|!J`OSCM#O>d%RJ=_D;`t+{?Y9;D2oT?p9>#vcIv4l}wFOlxR^@m;|;I_O_G`0HB zB+iQP6@&Q1OhAF$<{4T%&ACvxfO;#OFB~)fozBSkxOQi(*to$cXW#^^Dh&ATG|im z9;$i$wr(`$S!X6SyBw^eETAUXl-H z<_MIC0zA2WplF3=R=(9JofZ#-$bb6#I7?%7>LB*}^nq%8xns=4xbL0{80Ab;>pSBrFb6YLx2%T0_{Su*SyH~(rWO=aeRu^aY1%DSgTKbrH!LTa$3Cob^6PlTrDUkl4yauWW=<#r4;S?C5PT#_8Yx zK@VRe+By~a-GP^g=nQZ2j@x2G^17K z8cdA+9`d}?I-PQ^7oXzu`s;;`%gwD*Qfc;%-USKKy2^RLYj9dXYZ(c`ns|eV(zJ0j z?MCr>4&3=56}b}N*$W>a$jlm!0^pBln5T*c4-zwCe)^IT89`%~dYaRbOP0r=fqhNT zK#!Zmi@4W*!gTk1ax9AG{qwRs%Dq{{VG1~C-6OY^&arkEM&4MjOPO5yqkrxTi zeaX~!u;lKQgE5yemG<4E`5bHO0wtfPYn>=>h;X4;-P#P8A7Q~+fpdA@E9Kb0nC zeB`28wX|}7QZ_wyr)VC#@IxGdDb!EZ(AW<~G@@;His-mgH8NgfEXJ?jEBsZ%M0DPl znw=8H@`#O58DUTo9}lGDqHEyS`(q8wzE@mC<->$8x&p4}(1JgnAv%YFBfr@IK=eN0 zq~pVcj&(T}BFV^^q9{>meXR3otn=xQiFBHDmoS{q#v<2>xu*bZWv~!=u}bo1*j8SN z9J!Yd7Z=ES+*Dg7ipcYTXiQ%W7k9z;DuL!dAZ|=h8B-vnBNPc-H5)-w^o$m5d`S{Q z4&<-`v&Xx!NYz9`9uys@n-DHg0J7#bhzxGFIesPcFR1h*MU!|dyApt#qMmNU(^!=r zguCW8MV9Q9FW4(T-EWE{`7o6qW>h^PlDs%Ca+XDIqY1Tn043kDCzVc56_+HaL>~44 z=8q6pI?>k*)z>y7WnVLcea)j0>QPp(!$s(RcCe$YjGP`RZbvFvfNMkZ<8AfLDQn27LLBLN8fQV(he2#uV zd+!(T06&2T#4r$98zfU5no4hu0P$V^AnZG1U3BwcQ=RwIxN`iQ360btHbG7FM z@zI0^JtSPPH(MduL)ef})@7Sx9}+i%Q|x;PYu;ZBxOopta;bP&cBf-lce;;O-6IHdq_{CwMFD5TzVnEb6}ktB;w6w&4@nGe zD<*dw2314rri(l2opKS2_qDWdlDNQa#nt9Pzspa2H05d0B+iPE&9#?~5ji%Y%zjrA zN`eY~tuSSpSgeWkBe&O0DW_WWGIPNKxTVF7LOBGMPWj2 ziBL1LW}Jvct6L)&u9AJ^C0K!z83x$KXUJI~84R-$nlfHO@Dpn24Q#zU zUUZCRX8CD^%{qL4C4+(|#7OjUyVXZ4KC#_LZG!6K=c5u=u1?$5A=_2L@@=48i`*$uq_E;H|@Fijs4%1VNcq5=A9d;zE$~pAm9B zh*PojBy(O{B}zOiPD-=2qeBF;tLlqS(&;Ku4s?yxB-5Z>BogrRG30jU^#XV*qBgTc zGOriGUYU+cVoi`mdoPFm4VtH@-(l*;=^fHq$y2b0KnsP9ZaPR_(5|dUw+!^ z^xJd9MUuV2i}{?w;9MaY^UQ#N9H=;IoE6ZCdmJASedIhNs;LsW{>re^=tV%rYbTL= z7S?SXL&vWLC+X>cM9nOTn#%*%RyWlWXv92`gk^oqJjE%W#jZTdf}Z&j5zmEi-; zF!|3`_+g>YZN<*v$8*$U$;x-30?^G|O)*F-><#z(isvQn=7n(Qr{|v+PXPKY7Kpb{ z=y{2+Y|<8rf%v&VBjX;?kt!C-DiMKY`8^_yT1B=^cE?y@SeW%zZ(Ar1Lmi))pN}2) zQDdCfBY(U8#Ta#b0cpbZx-lwRk_Y#-Veyfqw!umVv<>zbURzho`V{UED?u4uY?omt zie^EeKJO)n$A37oXvl(;^k!j+rj>yN0vq(S&JljpvG5~RTNI7m)U+Ly_Sag_&o7B* zQx{gr7fN50r?L=rfJW{*l1^(DiA>L~k0k~X2#Y(s`D6Na5iI^?^mU6vnMK>5<-*(@ zoZxri@?&^y%J`r=amWkF$^$D~wAE4_+lgLWEV?8vJq%vZYvG5FjoGGoo~C1q1s~ke zMx}U3ED<+qyXm7PqNDZ-MZPRLHPb?K(P+bCPucE0POXcj2dIeir)2Zt#;ttenY0)-c zwY6wj?<=z2d8d9!rL1M*Jht=nUnXU|Y0IRX1`XpC*mO28lQy0DWkOHKR*_oXaQa8t z;xHE$R#o?1j)DMX{+vZV+SVo6N%L2T3{T}2$ZlMoWNQkevGcD6=LmVe# z7~-+|xToocm7>74@5qEPH4Z>>{7TUp5}kr;JSEphr*)S&h_<&8p{z!$I541)c>UDV ziZrmocE<5zm~(#rRGl{(!$1D`l#*T*?J&z>fuYLZc_mvRqUh#VML96GuWV{Y45Jv< z6*~4Nq^`8r#6x&d`5JZr%4q3pux0J0_N#>7v0Iz_LKFB<7^}bochmi=L|f-8QNYF0 zx5PmDW0jPN6BVM@?%b10-Cq}R(3PyLmo`G8tTeq$@E#hvT6CjzUsgs(GJ=LMW)9A3 zo=1C87Kl!fh^~4=ZYZ>VgXtmAkjBQY@;4+wER)X&n8LBH-PrcatcClIT#xQrI+7jBF=tDNw29Ph#6&8@MC!X{NU+L@h3y<^NK$ahp^>%G zso9%nhJPSW>d6pq(R!`|Qua$Is*IIG0b3y|4S4x+O^XZ4Rf+wJrMl6JvHd2RWJb2!g6Q$-0?E7EdwNn8- z^|pw^Oej8kCcHVldfD6JUfwH2Ku?;x9yHW*ok+|3X^fl*u^l3KU;RhPHw%(GVp>G$ zyWnzi?>el*Wwd*pIM1`B@@vRGQ7o8@54JxS83OJIkHph#RC##*iZc&g341H;JZ*pA8o*3 zwm(ZpHo&K2(GQfoQTXI%Df}6%aT`Spzwf(I6r?ZuLE7vjjmB7;IlR?8cB5=!{zl=? zfAiH3K1Fdnc$~`CPy9gNY?M~x#P{Ipu^YZ};yhfOo5TfxTDMISYSKp1 zF;=A*WvK1hB%zkApf+voMG9&-j>k|d`c5>CS7%olmbrA}ccK%$^S)#djlv-Nr+Sn} zf9@8YV%1(I1F+u*lKI^60k$8RtO{uB29f6Kq9MK(!;n#(c|wgIR=?jSscK}gb9 z9-=)Th)#|Z6DjLM(be(FA-eWM(J|@!?a`2BI!9D-9D;+}X)ZssPq`ujRkZ%~cKY^1 z2obyKu8**;?51bbWs|!6{E;}1>8iP+tJ2Mqu7+%eeW8?UHwzuC&f0mgr&NrttRW1A zRti>wK9;moQ};?LJ^Zm~g-PC;zS<=^#jDxJpSF=8s@ej);IQHrIp0Sfu0UR%uSMfn zmG+Low9SFJU<9?Zm+!pw@MMm_58V2>QEi2-)}5M zgP7^jZNfF6)XwG>TKS^&7fyTR$rHrwj%E+~V|<;j=5JI72NHP5XhJ`zlj1Qd`J0{t zcI(nRk+J2P))ZAI(d(~MwBD;u6l9-C%QAnPjG5xnyHMSB;Z2a)*>snzrz@2?%^c@u z&^C=N8{>MLvjJ?`Y8+Z zfvsINjrHx?2#F%w?81P1m*#&5i-u)!VOY)IgLCakdqfK=+Ad|u4G|%*#aYR~_`}iL zMQ+kt7O*5#)|{qA+rf{^X!CaIfpip?Fl$5{dllw>CbA&XyI^~%+5o;#_L+EJ{{8?K zjGshK@`tnJVSG2s7xDV)Suu3y zgluZPROTAVQFC|5e)Yh`yVqtMHmjKO3nlCqdYm%i@B&Kj>=2K^TBPq31sSt`3};3v zBbHS19^NVPZ6zh5TmT7s8jc zah;mua{4~;Hm(0ch@|!F)Pd<4OmySkrk-D7XKgpl{1R*JZrb=IcExtnA@wWcD{($g z-yKxw;!jP}!%e|@u<}lllf51arig&Xc7M0as<)z`@ zfvT48meqf&2+vBP!?m2+Eqa5)*qLsuDT&kJcJ>*3bMqd-(E%RD1@!!V#LQhLls?R7 zx0QYc73n|FquWJx((B=*S$&#ZdnIWW?Uf|ZAD6$9<|BJ8(mbL_bJ5S@WRfz5$XI7C zHi!HNG}?uFegloKK8#Rl#5eGbVUj;a^`DEh>@%nnc{(f)Dtu5+`8xpgt>1`PIVT!q zduf@xFvROWott7Wm39A2o>;r>n{?l*;HEP;&W>%Nm%4tyug6sPHr z-J&x!Iw)-jg$HH%KZ96m0SX#JBk#uMLExZpCA}Svp>?O}jf0}G95yT?%o5{N%zrt_ zP8~cOU#$+wy%d-JIPF^pu-$Y>Y?iPXM>Ri*+<(bQW=}ddCsASdC9^pFy`+@9A4I<6 z$=Be33-N3FFU)|a0*v)PC@?-rCDCRF`sx#r=eFX*GY6i?dj17*RuFdvXWe0u0{~2> zkqx3dwfRxmS>F5EOEsU0W(k&^g$ej67z7|M#93j{d2-bLD5uyos{Bo4QA6Rfj}oDhII)XRdK)FjpVt9uvI^-v1l8s9@a^ zE@O|0d|B-bDs^K1tve>%jujSwew6ZQH+uOG;h|3TP?2}j$a)2;st~B+tdQ6M6(u%^ z3o-HSu+kyfLdBIvXq{3r8>C$brWYxIZEcX$cd9``Wj0;*o5-@(^?yn#og>LC-HOYg zow1f962q#0T9gLc3nZ`9+wl61G>K`N}(zEf#Bk!UC}TGge#+tfejR86Ejals7&l+veq6Eov&*a|}#8k~2&} zFRG{g48|vczTiK?<*8r9br%2WE9;~ozgqlfA!$Ego=p2yTAy9|3tShy@vBI2Y_RaR z=m-<|<&+d}rcu8WqE!@@6hzf!RU_33rHfM~*cL^aYY*7SON`XEbl`;aY+R&_VZ|rq z%5vRFN%BkR@Smc4Tqv$B)tnT)z;u>MLeHeU-$V;AlS_V+%w*bc5N^t7D{z|e?HPDc zL1867(0&Iz74%v6h=QmO;o`jC!Q;2l)xV2DF%~dseq?NVav@9_u>GAvh#%fpJvEuW z!KV_SuZE@!H9mzYzm0mI3YPCD%TvuMk>o(Bx>KU5oO!Dh;hf3KRbW(0tb1JnyXR>O z*l#dXO1D_~&etrhB~17jm4<@W?o_z0XOSHxberS5S45|oVnISk(pnZ7lD_(t7h5a2Bmq(S%y>dQeu9g zfiBfd76yf8vO9VOE@3NfEaPjPW@gCIZiJ=tB{<>MYi0*U=kGCX=A4sfSuV&pYEzs+ zV|F;5G&<6}q4`f1>x%k|aHzs3N*j|)-=y$%ri7?sCQ9bk(kVOJ4;SyERSHQ61<2yJ zrb9vmk}j1!{t(AhKF6;Aey4dG7Tims%mPRK5k^XHdNs=I$w=9(<_+aUo5@f%+eDi~ z0Pc!tllh$;2r$I&tVn*$?;4^_-k(IUFy?naN#g`7ydE2oKMBK4b1RM>KeyxPg=8ly zVjhA6(!Ln;qQ<4cn0KLXQ~*0m!uebwf^Kjji_Y@H>OfEe#{T?a8s{?e<=A&vAHCx; zV_VpkCAdg+jAS$Vn`g{f6_ZZR*?N~*5=H@X#PDG zXppn%Sd_}*&CbBdlz54gqwx|ad##!+rz;4b`y>;VYtR*LiIZD-v?;-C83XHGS5$hx$8%(HINYH-JRNso=Gy}{iXVmvxadr zI1K$LZAmoq=|Ga%3^ltwCJXlURJmof*RlP3y3=D8;27f+k9l$8)+H|ed58YT9(G>5 zmiBqfHf^RKNcQ|gKW?>PxjM$^KdA=T@v7kf_H*Ft2-kVUx~m$M>e}^I9lYT^2tBeP z>U>1zDU6}|dHrK(cCtCt@lIZ#eqTOZnu|+&yQx`p15++H&??$uARF;Meqgl8SK z^_pWq0xP`csKm_^wgSQM(gRK>Y^7qKSyXVl9;qyM0EMClr@k=sT?M{-)Mw^tchFp) zndyK_c-gHu5%rnR%y&K)3sc&Z!xPV^HmN3CDm$f`to7u;`e9jHxK*z29v zd4nm89zJl;GTUsLf4l869rm5djwZjuiGvZ@fWsYBnH`3m_p{AD+SQblW9G%+z=e*q z;?GS@(Q{I4b){g>MWvn6(yCu+V&2J4!7I1n zqztubX0qFEzh>qD$CxEFubG*F8Uvepr(x@kSFY{RUdQa&bf_6vQyIlKH`!{6D0DR9 z0yCpgBJlEVb&PZbMm7|Et#u!P?I~23-^TRP1IC!Ww^)>L=xs*FBpX*H3m2Ahll zeDoggw6g6gN?&uX!O{h-WZOM%zbZY0o3^$U!00+@5cfeA2&S?a^zfLlfCD*_CRN43c`qP2wX z#@1H*`D*CtX!6zfRP#x=UvQ40v(K&G#>`AB)f=DH!YSFpJ@L}NkptEOlgHYa1Di4l z2VEHbF;$z>1|ZNoZDoI~Qx;)3*fvk1KVGpI z)t}+Ta_qIml9}x*HvL((TNQ2de$`uB)%e3ePHjpgvb&VXX4;-L?Ah~WGqk(JjB`$Q z=*0@l>E}r-cRx?IbkligsbX%Zr6=c}-O|hF$+>%ecoV>C`{3MdAO1#S^;@g)8``PH zJE+EIw3CgmX=kCh6GJyAYtI(dC@Ya)TKC~YEj(X#pmTUL=zz50%Q@C1{Eh6u(&yD2 zlSX}obcfzm^&+{w?8OD`tzPs{gyu!-4HnRu(7xGv4u(Q6wKo%T2k12+k2GGGT(Iri z;Gnwprq3~Dfdc;x9Uve8{O?An#;ZD*Eil1rI+*#Ahi;^?UCd0$L#J<3U|=3P#kvm% zLvcql0fgSYqnVAxYg1rk9Rjv$svY*!=+?ri#nMtn)5u`7AzAs(Ugm& zHPh-seOzIYJNNPBvq?Yk6E#+zX$hEVrJc=eY#o0ZY{HU2;clY3<=Gwv90xmM%FdN^ zk*K(#i_|zD!6mDzE;JRU)}1{SKI$S-@I@Ed;umMPxatK3i1MyxJb2pVuI9DS*kah# zQop1*A`y2ra~+FbR3A<2CO>+vo5a>n-7IYFm5?a#V|b^x*)+&p|48sxI9UwsE-|+6 zjLraK%Ii|jk8jR+CowkbCDn(V9tvaoEudV}Ljq-N534iZ$<9zs57U`*^ke0w#C_TQ zvE8$(1&o;#U`FdH;iOW)pRu~`mCd)LHW!*LX+lrfDJIj)J08pKwMc zW0r)>f-YoDmvapA4`?QoL>-#6nuAvAbN2iA(HgOOhY?5V8y3;6x-^J9sY{G6!NoHs zti7PvKu2|n=To}uzn#20SXrcAv6zLE#*(&eM@y)~p+!XbT1urpM*k-*)6GnzfB6qM z%*tM-ACu3{TOAyjm9v^BpUPF;Cn2maiq%M1Uan299(|!%$46QE_ck8^R5$lFuZfz3 zjd;udwM!qfOCd5H+3uOaMy$-un*Q7$PR|lPX8BtL?He+|N3ZrVyT;Xwb$XuSr@vE4 zV$W1cxY)eCNog<%GZr`t3o4H?(s{`R^t7zQ>%@WJI$Cxylzm9)ea)89e>hOrpInzO z9*68Xj=iSWtj1|PGtFfk7V=ZcG2NE{Vpcw#uy~dRDzD^2PAmJG&u9+1>=LsIhxWd? z#Jt{DQL_d9anL}%(%g~p@@^-UUTU`INV5|zH80?6?WN`+glJfDnK{(G_N$r*&j&oF z$Kh|dxx1H2`k6POgBAVEnW(kd<>vE_$qshzM2@h_&5;nQujp@HhD*MAyO);rHzzs) z+DXz3SKa>#b1=g5;C%1VGB2$!HTU4dUr_ zUleUST~SD5Cbx>_j_-F+-P=1dXwe|^Mr}XU{bRuGxD3C^9J-YuAUt6t;j`j5wRj<6>yu*RODJySJ$2s9OQOUI2A0I=PZBL7(n#%^@oa=|s zo6>JJccRhyTcMglp<0sLfhzuVCejtRnVH(VwDOv03~kh2H?CZ#++9?=pv>wDx|Z^gyZK59K&!I24XD@((x5ahW&VT#ffP7-n;bY^j%42s1VE795P0;mX&I@1IYBJ6wqrXPOsP z553L2$>C^dsz!bM4)Z+6KKY}0b^oCdgB;()(%7M7xx7Ts?)!R6!o%{wt_C(b)1_fPUx_kRHF z*zr_4J@_E(R;5(^pvfMKzdQ)-@fO01;$pa=dnc%E!T+ z?iptqD8oN)a@03e?-^$zaDA|EaKn4TTyaJRIatl#_HAGADC)N9h}x1q$?W2Y#Lj8| zpEGFqBs1HA1BUtEUWViOlgt~qYrjo0@8|2?lO=Ydr%3SC7N+>9d`9!A>YJvRKWfZJ zrkW$rjkQx@Mu?>D)6DZVNA=y)pciXp)s+>X5`b@ICAb58*QQJL`r7GcQ(zj7UE@II z+sqwNPT(L;A-;OL`M6g0QkSPeOb+Tg14O}2rOT?YUpHe0IuS{q&H!hcm`-ss&CBu4 zwKGljA)GnWydE#>XTqEfYWG!{*YVY?GH2tlo6NE9{o9`yQy<~a_Q!el(=)_fr7a|l zM$TF0m-w}3miZ50;=*UlMX2(}XUvE2@Q!EASqQB39BjFfRQ;TJ9iAo6HcQ+{35NA_ z5T{;?r~JvuUb=IcnLuK;*$bbnoGoiUINR)pa_7%62jDVcj=2x!nL;HbdV=RkTgV04 z37f&Vxn_@44xrV+@nj?xY#a!g!PouUY3E$Yx<>`fRyfr^H(=fvHK-saL8E=UNBPJ* z&upp@b(#muiGzmDGui3-*gWtA2Q8V8aYa(%^DxFaNIY*gMWiK5`|wmPFnzT0c{2l$ z?m+sq1*x>}d9a02y(8s+0OsyqfXP@&trwWDyT1SoVZqFTHn^XTE|4&6ywGfque;K^ zg=RM0x6p*oC?DzV9@v-ER`Ufi??{H3r}zcvT@LE@f;qq%-(CmCg{)IQ@^$ecTKIxl z;dtCd9bPo=!Ca2g*Hg(e`M&D)FPdIu>)Aj(Dc?uOUNR>~9cZd=gkg3`^HiF#$Q%I^ z^d`_S_cwd7G+&k7-N8#YEQV#LlxVRz0gdM^F^ikoXwwil*^RTe!MM?zm6!x`nrA{f z-Mhq`=DdZ^Jn1){mtLLsvKgr*U<<<%kdSSY8fL>n(`zX#QADpVHK(GXi(WAg;!?Cs zn!hhuX1?42j;?-6*(3!h;pO#8{pZ3SlJ1fi+5KQ#9GE%Aj7q~U=U2;Q5$Jk;j{opfX4jpibI}it+8b^B< zce#ivHpItMaq8eWn)0go0p{q{ubH!*$cl#(3GHCyi(O@2iKl~BnUfGy;?OFv$ues8 zI@TP-l34S7Rw$N4B*&7N_B!VB3|js=c8yL@>Kl?II=q3N!w>uoEW2g2eIxA%^V;(Gr_on6=kma@pg(pgXu6$>URcE=KVHnKP$9=c(_9 z8$VpF);c3N4d}Pd*&CDUi_JW*|9dt%x6aA^i#o1%x`5^GyTRFB+C@D!INyf0ckKqJ zj3SS;OM{K#*T{|7PdDg?jiRA{ZPXfCVUx48p+3B!Z*LL}{d|*XXwfFoP{U^DW;CX7 zGgcD5d~A!xj1)Lu10{;0qBC{uG`PTNLh6oa3Vf}Pou(8B?HLs~YlM%vZ{$%+aF>M- z_dTOf*l`u(bp-wtIOm}oqYIsT0s7Q#tDtZ>Tb(@Ix*P@GFCRoVw}JwsQoWy@_Yf9U zW1BP8W3D8})6A{TI<#>cs!5^k+nkf7C6u-ubQw-0Q@5iJ!)X=2%mRPnOfro&W9+KX z?HYY-6utxO_!Vlj1DsVMt=<7eCT4Jlvp>q@eE=r!-JR$zY&*Ne+1PTI7{D*J%idki z${t9g^qK}7;lJDIW$Xq=M9u-Y5_dzt>9=?s*RXS)I9G%h&q|Gz-lOzdb%T60-M7$| zucxfV3RivSFII$MBJ*Ppa0j7Av!qh*2A+}7fXD9a97>sc(b~?G-@r3g`iu_!ZU_o_ zRfWyP445|ZJl-lt2bU;i(ROLH#MSunKCli$(Z_U^GA7mWr?dN<52aMs@%0fIh_N#)4ac{( z;x7<-pfwl}B1a?6IF%sn$@{p2q;enOvhwGgv(7K^wFzgPZTRUe_p4ybUA@i-@I3We zEgL!2Bv0}==j1p+?8n(bRPCIzoChEgOeD{{V5jzX?we@JG%qh2cFq}Z_+b^zKj)n1 zS)Aixy+tk0W9D&GpLe#z(zQ_1xm24g-~xDY)OhQnV4|uP!DMKpAw|w=`~Y51Bo5%> zB5?p$y99b-q|ukO1Ngg3+5s$G2Ge6Cy6nuuhw5IzDQ%$XSDZW`>*N(^?{KhOb=EVC z2LRnwXC;sEcEldk__a$gExRfhS#LQoH*cvOv;4iirZPWTNBoq>A)CQjlRzd4WK*9X_c8NdIUIO9M0-MKb|0^MQb zCAq};*P8!72^Xze#^$U-zVEe{vR<5^jms z_qv5&MB{IXLf~nJO=S1F!+s-B)zgNJ{F7DPkh?0vz`V7>q7=r*W zhGJ*EFfn+ENcRcDZZf>8FmybdB>H-}*!eLZx$b{C2cxmO{}O~O@QxV3H}8lhjJ)Ig z7Tqd$SDgA??>fhDwlVYTg+X-tu5%8GO}U5GAuRHqV7j{BcV5P?Mt_U5@a?~y1NDRd zAkSfij-TaMbo|WU&K%zHArG(~deW{3qQKP$AX^5i_z;U83-h7)bbg2&M0Xwv4Wzex zh_au5Xrn5RURoIF+^Y*?&?9i%=-zc)@iBIAfQ^Pf26cpx`WWOhg-$&dog4YYSsT5| zmA~UCP`jTv7vdG?Q)hgPd+Nb9=mNVQ`CA65X~8f2@RW00uKLfwz~Xybp7Tz)&OUd( z#<6medcj_FJK?#fE772MNT4-IMuk)F*t2b-K`&w{%iAB8&pPqta;6w9^uuvybx$VJ zUgS4GCa#SqoId1v0*2jHRO5v6BP3BRSlijo@4t>)#V4HGP3JiJr3VFGHigpBlhCE! z*hh|TUZIA~o|Ki=%SNH6oIMTaknHWf4LIOVL4A5-9}*B5BJ@OlI*<$0z6R@NPsn1` zcSgw;4f+FiVC!NEJnj6D<{Oor(l*xs59JL>x=s0>%5LL#Mmd+|aRoz`N%;(UUwq8U z0K*0YWw(Eb#ByeZC$bXwKUur{TIP)HZgp9_6p-*9)Wlo)78iL%-38J%Iuw_XAmzCH zSJvHVa1HiT3OrFo^&lldBGq`ZIj#|QC7I`=dsYJl|8!jl zidTtqt!{BFPM85w2XYfatRQ3Pu;M03s>o%mq z+R8y}m#^w5Z}RPOCRy3*f$d_T^T|p)9jvSL$6zMcQ<%pFU|G?YFO0!u9q!ziFcx#s z(5h`7WPwYdi)#bp$@#|vcoVpqGzJSMrMl9aC|;cE$mf8jI#O0DV%24@jj+=uS*h$_ zu-;2P?J56pISR|QE2ZyPA51zx@z-6&M`sQtB&BBbwJxZ~dBk6uXOMkl3RQcYJ5uaOpx(aB@ z@@C3#91NA3E1h7bAJtspx}43;m1Y2sGqh0ZNzbWa3uPc~E@`3gz(SF|aO(L0PrBap z0)Pq6N0@WB?1+>6bANdlEBVvY0kv$d58qIru{uYCTPoc_iFdbDmUF?CGlCC>mzBz4_E~wtI8rt6v z+bF?c=_r2$6h_@BuR)z)N}188s|#tqK%zEKpRpDj^=zvwl2Tos?UW9D0=u?X`fx?g z2S%ty+GA3k95uQ(&HE7;KQ)HU3wFJeqQpv&3dW`?X}FwBMTeh~cL$|$MLy3{B>C_+ zMr&V)&$?%kCx_JX;b#`q`6hYgOmcQmc*?d@9Tbi!c zc^MxDQ{wwRcA95{1JY#e?#wPqTjM)W{&C4?TETU|;8gJQcXjWod?jI(-R!1(in8f_ zy+d6ix+?|=TdJ^O0OSL6y0)dZ8su4%!i9%fY;r)fNzN=Ti|r&Q2Sk|jmqg+m=}w1! zjN-XJT{U_r{{Q_2Z20RhePK=M7YdfW^aa8fhEo4t$~Gi8OYE&A8IXCccW&tXx2);^pTbC^C8?55Q48 zoVpEAUgI5_GC-+ffKegi{F`<gkr13KHC*Wmj)@547;GDDSW>orL34|r(W+WA8VlNuhYRk=^ifM zzRFl^I#+f-Whvi$1s__ViCVskdiPfg+YjV8AD7C7!~eJ~XMafUZ(%lk?tqykKO z_Y2?#mc3k$YTOF)q=Neil{rK4?IJ4N9$AkjN7pS!ZJk)mj7IeP$WBftzB z-T0G3C+BHTe98cBM=O@|k@hV1{FmaH4-G|8UTXYDN*XVfJ$sdSV)fP#Ou>~B`_cm_ zk(YfvXu|=sFID>(YlFYKy#)sEx~U7rD7S(1Xd_VS!e2cQ}!oHRgn5EpMdUMoE_^3ghSZlPn2-e#J@sdrK8@nd)jIH zXG#rv=Tn9I_hx>I)!%`3e5&+<-d4v8*Au9N$Z3G#0vKkf!l5Tk8ho@mR3RK1KA$NO zxWs>^q?_};b|A<0Z#3mICET-UlN}l1R(z)PMjd{`lrg9ydziujs4eu=cStQd=n|Os zkA^94*ns<{t*w%L?{bzKyiq{GxxpJpeXdmQ($5{&kGBQU{~y6=OnAjT8Q_ zz*|k4O~&0Co7U};wD2$DrMmGQgE<8d4;(s_WUweji6fNCrib5q%TM-Ej}eeDdXh8} zyR9cx8L8A4r<|PvhrxGnybSKB}arBF0)DX!JCkV&BY$ zDteSs767#oCG+!dMqC3e(81Srr>~L`=g_aI8Hxa?9gv~aGaWtUC9m5-OEZ*sy*2b_ zhT`Q0sRaaeZc>o}T+-@AJw2&Ow*=%p%~VW{`nkP8v0VR6tAvZFd*oy3*Re_rjmcC# z#|nL(sZ8T@?>9~frRAfs;ql|A(KtU-)WGQq< z+He}>O7Igmmw_HRy-KTKFQi6>YDq5Xm+*Nj-8{8kU9n9?%sYBl`+qggbxMb;BlR4w za8>-X@ybL#&J(}X=+%lZ#W+9yQmJHG#}V7>YY6ELCqN#VK9jmmP%2sOOL7CPW^elQ z?fcbf!vvgIYrm$DiI|@I)MTRam0{alIyzCQBHhoKq%87xcf2Y*o8_&!g=_3UVA(TC zY3c#x`p;B&)D}v+JKaHM?8%A+)~Rh}a*K}nNI_m@TErn|r#?0|6RcRJz2G|rR;|>k zw}I7xojhuXc!+^mhD4ko z2?LO?6eI`-rtX3UP84n%>nZLl{z-c4D`f}>aKTp)e&8cAO@Zo+8ckDbVcbr@|7Iyf z#!1tZe$cF(qV#uDYytdRr?s&eE6Jy+FbnuJbD|>6wCURiKCXt-p`tPrBGhT;hrw1K zj=zMELVn^Kc;extzK#%Y+&Fo=EI;*Q1OBwr_<0rmVJ=qcpgoIn#ED#mKqC;-bbku~ zwa4E!)2JloM~^^pUavkt96K(wtT0ANY0$NN|L<)=U%2Kih4e2K(3xdQvhS=rUH~PN z&p)*y&Ld_y_BVvxddr~z>p;twDmu}NnD)EqRb@zKW3xkK6bSvJ2beq{W(oS1eLZi|jGJ}~|XHV|A#Z6jGBdb!` zRZ22)Oc>#kQ@F5Bkd@1w(S+}nl_*vB2W2f5@LxZGsLrA$KPuBaW=mj(4t@Q3Fx~hO%AdIu_Y)p= zBIPHgssGp6ARPudbAF_dlM8-Qs(6l_Wrvu2`zIv^@}||L{FlDTOFL<*rLftdhA3wYYJ3^$b5IS+F1+ zzD>TD#hb)~OX73os~kcNGVeQUm8m=nK;Ddo(Y_iVp&iB)wNBxAA9S~L^S@)M{t5ga zMgN-yYbFJghDyUZz}4%(`SJC9{wdvF2YuHps=gky=@j)}uhjJT#x7USl|0K~!XDS{ z7eEE;6$@V3w;mj83f)}~GBBPFY)}T^X1$F{XEP8e5y{b$Xd?tixbp>`o>ZA0Zd86L z+38xEm7|*!o@Pb&S%;H@;2berZp&|Jnw6@X_4QthVmH?e=CNtWvQn8wY*wt6GgqQz zlZbPwO@Uh!WHQ>U)CE=eZ8P*Y3w8y{-dOg2Ta*;s>$OFRvHY<)5KhT_lhmWwdtpIA znwPpk)>_UV)E5r|G}m;4Jn2ca{5rmJa0`}OXNoSsSDqY3S`6`(M&f0w1}$Tde|T({ zH}kNnfdxu+gjKoy&`Ww~D2b~o?W+gh!P2)g9dz*B00gcTV32|LQJ_S64nupkA`f^? zo4<}hW3dj!y`O<$?g=!DocBHH^o{wJU=8#avOF9w9A=(W$0%>3dFgm*QX%#uEJcM% zDlUOraq8`+YFk0Bpt90_ZQ2SQ4Gy?H+5y)nZk36=euiY4LKS~j3O)C>kb*~1cCD%r zbgj#jtdhs%c<6=Fr*;D#-wx#m5QIrP6_>}Pco+!s3mXKR41Nd! z+)|2^?&g85tooSU z`l|op9`)W0{!MFLNkR@2^f9twYA|hiqr8QbUw$)TOX|T%|4N!bN|;h+tD`%5=^v#D zcjH7L6W@}J_LMemVRZ^`~@iztWgz zB&zj`QZ?o?cd90>0btoQM6t3kvwK+2Q|2#_|A1k!dev8UU|A`(qH)aXf~!8WD5F8` z&4m9lWgLL+@DzP}KskY78h%hYkEQ+gAs8!wzjR1>3zyx8ls1VaaYrTV!x37t5nmXD zAifiu99C*U38N>2DXmvXoQ@#GHfA5jIWd&-4=Z)SDpsWY;$C(iLB_4vLB^;O8CzRK~VARu6M_oPvtss0jPeNr1Z_ATlErB+75=vY!?5D)# z-BU^<&k6CMt+~?asyLd?`!_1<9=kv-(5H0pfS!L5TDs`diW%AKw(1hfzZ^4-=4v17 zDF0kq_`i=EDF5dX zaFWK^qy>EShHspflX$j$sP0TR)c-<2+W2^JmpEAL&RSE1}Uh>HPn{d}qV5kC{w zpRU<;vjhL5bd9k47Y`Bra759P5i3ziX@`ino?Aq$JxR-Vqo0drk?-cM$llO9G%x2z zdye?|2lBoX_{!-W#A;2)nqc ztkimM(X!Otya}Uhx7=b|oD|{%aaRCgTE|k8*O9Vj@K1>*8u+L3w&6c9wChhLULPh{ zf^I3MQte^@$&tNnxuZH&lsqZpTDqAU;W^G-T~++ASYbGEy*OmLOU3`d3VZ9CWvsdt zw{)_%*F`sP!DI=cg;rYp!fDZ=R$a-_x0Z$aWLNahomaEEd*m_RXC* z$N`_#&2`_7cI_&Lt{tP7a7Vf0F%^taZmc~P`>*C*Wesj$y{jzJIHUCKcY;k`8fV0l zZCXXXP&eJOz+84?Liy;fe!5}4pF59C;J*aPn22w)nF>FG$WXfJQ1&YKUHezT+?EBXzN^)!aIWOty<=o7>5m9lOCt-9(la0 zaZREaxTXiJSd!Pr1<$C@Ao$K;tZ6AnQ`SAHj<6Dr=7k3OfTNjl zfz@eH!qDgi&_|7-@v#m=ic~#+9a8pL^h8L0LWmvZh_Mc(4ie*`NTVgT9E-TRfh9^m zQ4a&_2_n4S!1ytK%)mP1l4xW+q3Jy%!=$B9uqS(8T1F#1**@HDW76&pG_!%Yd&10y z8g^wP^(TurOpK?`yzqED&GKR#9-+vKRrHu2$YTYDB?eQhH&d|+rhBskH~{+kFb84_ z>S~KJm=1-%8$&C6823rt?8Bm9aEJc2S$8|#^IOo*qhf$a4F z_a{$?Pwt~Y?=eX49LUN`sjg#ztgpnU{})QKp_yqxjGy%rg4hBu1l4SebN|C_Y#D#& zu=b7|%xZJC*&S{hjP;>yPKPnp2W$7nWSSAoWx^NG?Q|+uTXBkfB zrnd|O$(m$mI05OTopEqfq$$aZoemtHP&O`p2s(9EKSXVO$!OVS{bb!&(Tqd(oL*p0 zD7#tG%U?w=FY*e5=wuk?>k|DQ#_EIZs1VLL+tD(d^}yxZaF&2R?hj{`Jh2Fn9Ym}G zYXqx`r;Q@S)BX{xk~ANnDC|>w$2*d#o*5>Dp>kmq{z)JCSi=DVq^YRg+!mj{=e!lP zDH0W~qYIJjb&qZwx)Qk};p7>`d_2|%0E<$dKR<-pM=@_KrrXqKdsc{_AF_7v0|s0? zpeF;bw-5I5leJJ%o``zsUb_YR>W=mfQkLpBwD?fGQ4|GVONa>fxL-jqMMPt50_`|j z^ycGe(VN_8mJdcIHHO6@isMl!qm(NRuO>wR9tdHH^J18-ev16K^r=p_o@neGPXzZw ze+V93f2f6i3fPoeF=8O29E@{Kzc|FgFLtmdU=lNR@FF*p=!e`Jyw`#~Y9A}s@Q1OY z{Onl9Ro8{FXu8O<5k${o+1L2w>^K&OWiwvNmE$;EdsMPDNU&nQezJ}O$$8FaapH3k z<-{eq9OL{x1L~t|MmhG7dqhpGz{cZ}-M*s|IvZJi9nk4Qt#2L}hhTb#X#ku}W&;z2 zO_h4OYE)!_T>pKsDyu`*fQl9UO zBOgN){}Oygcv`jFmM9xdNn+e_B&A9bAZe3WfMJE5r%ga!f+ThaL@ae+bf|02h&pi+ zJ$sGaF-(i6JFl}_aM|M-9laa|4hDvO)2o3EkwE)>j0Wpb3apLe20OAg<6$O7+Pth! zC@rYX!f-QbB%D7E)@E;*4tlR>npNP6tiu{fhJy9fBbg-{k9xyZ<^l!L++^lJVH2f) zFd&GI;u#7{br}y1^&;t07_Q!`ivs9QPSmatimG1JgwDVFv@*gWOl9d7d*JVisE4&C z{YI_oqjWBPQlE`AbdZsJp5iFF0sF+T(nQ6hJKJb!1N1!CPWcz^0wlHpbMjeu1P9s9 z4Ouq+zSfYf#DyBMtymb{8?$6IW?ExG<}Ng5Sz^i`xU)-t-b73}Gg*VQeAax*uU(3U zY6X9+c}hE)um+J!kWyPag>>aFQVR$k)CT=Tw9Ljr_3uYT)jNk!;)J4`uRPg? zHMj7sTTPyL8V-t7@hvfp`2n_|Ql~=A?DFATjAL)<9#thyg>JLUJZ_!=f0x>kh5Bje z{*tvnq;x;Zd}FGniT+PSBq_(w1yV#?R=XnChWTr&0q&3{-5iDNh@!Cuo{*gD%xGv^ z7Gu6PKb9+zX>MEA6k%3HZP{C37^}4t1{l z)E3^5sjOLui1`PxM$CU~AdmXzf1gCGJ^MgJ`?v83p_d%vLHW=F@Is=959uc5F+>A6Slr1n5oY24P`N$ zqU*ZM3M6-82x;oXyv(OBM9YbopoX2Wf;v-rCrsLsOVM&5?tRgTwGq>;TWVgKZVfuf zAYVHXD;x3hLtgUB)3GpSLn7$RV!T#fv*8rPuQxg~4!@?S;`m?8vxW9|W<2*{wG!$h zPI)gaWit->VMs76RzP4ETo4=5g>mg$eiz0u*j{tbGpD_;Q*72kAQUXxg+x1DS$Ev3 zMHf?8Je{)ySm}?hd|A=6u1vyo!Oup zt@>1FGjV@~1{B-jVqdZz^g~*antz$e>uvU}G&MJ4ayh9F5DKJxWRIv(cx@o9 z9_iy*)>vM%=X(mndKqg0!W#}eKu%?k2PP`$0b2AM{m}zd{5LAslXc`F5YwjEX=+ba z*?;FnFL{Ykp7^DK2U_Hwdk_aR`uUzL*6?UANxjh0n^dhAt72aDz$!e_`}AUA5wCcp zBRECS@@-`h0x`W8ll@OE^pW!o@&gLT2zRB+y;$WE(^eT_%MI_1)$$%?f84(`ju8P9 z>#0W9*FpeYCq!oy?oT6oGZE1kd+Cyc4jiiDNt=7KXf6z%>x~7o_n29Z#S$_0!SVMQ zCG}yY5sk<%CE)p*z+?uMb@x8vq|WLiHvY0cV%iZ~f&|umz~pu(DIHb8@Tk8x^DK6Hyqh7K>nciDo3z6a7-u;GV&eDoat!XM6I za+q-r{b{A5*3W`++s{dmEJ2=nGGdN!c=lJ5Hn@x56ZQ9bhbg4=WtoPIy>zE9E0Q)+ z)owvCbhjTGv5>6qfr|i&$9tHcPBa`B&m*VIFyjUej}JFmj~nRX{?2w!jOXurDPU-u zH|XNukv2-$I%vLO9b8V2c@Hz}j^}Jz1~uu=CgCH2J#BV6aHd0Cu*Sq<@_zP~gXHg4 zL;-xKE8VK_W{l_BJJF~_dJtf@z$H|kGM;yKJP)-_&K>{r(2i#}^wJDzJHYyDvxU4Eb4Kr>Q{O-=o_ddo#+nZ;>#G7e^yr3J2PgPBnxb?RvJsQvKj zz>Vkh6mh3B6FQAVUH`(mBhy5H5Fv3f=v02k+a$IHCgaW@ z9Cd};gpko~J-Nw;H5fUeMc)yIb0(UHGvGyUN?*Se!h9y7tI zZ-qpTmxS|-2;M+f1pg`oEgz7dsL?FOcg6~bd=)Mv_@JLwX6(ylG^UmdXS__{lcm8l zbu{xaU-~Ufa6I!yvuc$;b1QR8`dA7xTH4!El+oTt11%O^rwfXSR2*YiIBeqZ2d3E3 zIHvoIVP2j?@jHm5u6=?i1JBJz??*ViuzB;wXf$u*7*+*Zt7~JROi6LI9m}qAb>eH| z*iI~=$K%*nxJ>ziwb7ZR*i9I&;x8bQr?|q$vyZtWRMrGGM3TNIk4db(X=MN^jLgmZ zB@~K(=OlIlhic2o*aaO(oec7IiSj2i9^LGqRNwF*@}B~2O9xsqMZ9u!3TtH8<3s)< zZ-r9gRKWnhJ(V@b`kXhFy>FW2fv?At6m!8waamAA?WCSr;^01)g(>`r%4V}U!5!S5 zqNV15wa2*iA=+1S3SE0lWdHp$n^lh4YjX1!n%x0YtXUYvOC71sSIiN(90j-+m04b` z{Y6QK1_slJufUtTuF>gl$~HCZTS(`>Vja+=q-iV#@%N*rv1Ve}l1QpoJIHlz8tAr^ z>hhVvLM7>{KyIvU%!8K(S{eef) zJVK^5K8|%Lb4yVWeMXEc<&!C+)@vcTqyDTcdC|eIlM#zPQ^?Z6GliU5k21gMjbth_ zq0(^D)R{O77tyMjjJx!h?>X!PjO*?>P}Zi< z!#S)5-q{B?&w@dqdvnEIWiI2nSOEZd#O*+B7K({RjtpOH{P_#n2x%ZWzGHO_CI%S4%z*ADkeKJ2zAI$rB;9 zytKFjOfUV!-NtnBPP1(}ykw23!Wl2$IE8%4!fh;=*CD*ddM{?8`QfDjsVsjw=LU3(n{K5;g~OQL6ND{j`joF>r~iQEN*G#Wbp8qE#!|TZX+}l<5o! zp`cY@$)Lr_S%vM*->cEMj@>2Y<4`xG$Xae%TGsHK#oI?q3yMfl_NTQq-TJ&4d}h}` zCj|172Q0NFH?ykKJm1$V(CUElbxKY;P2g^vZR8jqnH7Udd1E1BXJi{W#z$T@_$?f1 zNnET>c@X6f#G~CE;wuK2wOWx_!xslZXOh}=hz9*}wCfNY&>7+AdJG~`V|q}HkNN_Z z_mg^Fl=Yrk7DY844cRtD(fs#Rc%UW(`QkXzZK@^tR!ff~w|LzI4!~$oe!C7_71reV zZ+7S$AzCF>3JNv)z%-I)HGP)b=i@kNX1`s-R(dWB#H`aHe}jz%e$TmbSKjxmvBYE2 zq_wQ3%l0FS6p{Kas9zS)7cOoC5zpQ*EQAvNh;K0UTFY7(md8_*`n_%RxlfS4Yv)>q z(6O&cU5_)sK#SHh?)+=pz`B5O`fvkI5d(d_fh7kZ$qM}2I9`*%BCo!YTYZKd#;9i- zn3rkw4RIv+Ze$e=({E}|{C#wGb^1;5u=hp?AQ?BQDB2^;nuUArtRQ9N2l=#kBa0f9 zfxC`KN2GO*hudLQ(|o~%m$9axOeMs&Mha2XN5_u_Jm3pubT+4?%=lNzXo{Ve%jjXB zyi9!_Un*z4QpnBsyjYQLu`H=*<{BEciG{q>0o{IC^3J?hzN;ZnzucIY)O~2n;#bP( z?9)q~)>TZU9a#NJAx*vXaz%PHR!QTK_^|!vS300;n@Zj(c;&mA=IQ0{>iJkp%Itcj zj8$hMUmQ%`3SZiRgRd0QbdoPuq}$(1DmuA_Vz#`}fwCp)3(bOj@s;n2@Gg+X7aOA! z)spXCd!>v3+rPHK6X1hIr}zfwq}y)RXiyZP&A$sR8DMn^fMq@|iBO8(}C*e7k4 zV`G)>lkxNQJ>c+{y$0yUR3F`-3|<2-ySI;SSaxfD1xcK_oecto zHtk>ydC?X-*hGFkyo0@Km};jwJ3($!U6Xf0*NUV@4fQKnMF9(;^zN%jaE$m~6=8W>XeC6}umLj8BMNP4=5ar8N#y{OGd zefA1n?xMYngZWAO*qiuP>wQp;r@Er{gJ`341IkOrdG+ouu<53{%m={u;-$I=*>Ir3 z6@bC}K0KIyIS4DHQ!b?R?!F;(8^7=nkkv&qlI^sL0gox{5DNq+Zh>cTliuZR)a($r zwNx5$i1mw}Vn?t~$>P;|ss;QwkmV@nFf=bI6nU66L?gQ&W=(MU`Y@}&$9n5wmd3{` zFkcOF&euVcxVX#a*hgxpW_&lIhPRV5djyv6m2=dyiL2X zOsr}2%L&vtn;xHF;o7Z^6mb#?z**GsB+K?adIJ19l0kaQO8{Ve5!?%4-w`PPvC>YNOB>iMzFNFEJmFKR z{drbjC|cx72`k^pI&6W4H+gnd68A+epTiomJq1BpZUloE<2fjb+LE#)ijU) zOQ#**|FhH1sv;($NOu)6EtcTB(d2cBl@l(RiIzxzU(MvD`w~%?ORREAN%Zi)avk#h z$LQggT!#)_(pvGyCA}4Jpsaiu3|K1lxy)+%KbWWG59LYOugyceH;e|ubBmXjm!fjL zHkC&}Qt@Th0@6jDEAU`R$+^m!VRCeuAE2AieKj)9VWX+{Rebf2xt<9evX6iD^jyll z%D+n6udWn0}OI z7qhoLH~tx8{e>PCgD!2Q#J^aA=c6BDty`(vU#x}smwCWNv(Bf5f3Z}LnFas{ayKOk zxWj%lOtI3AJ8ZDWMF#*PrPvDL)Zs21Vo(Hnu=zCXE_)A9j74`L+3lrj_n@=fOYOCb zqFu7@v1CgQ^3+uGAywf683uTk+OghELTR(k_N^Z%5w#- z8(PpHRPx*J3k935jVS4?p+v#P&1&TJH*-YxkM(i;HV1?|e6*w!7(AhAW5I!rD%RSD z1`h88R2}DGRbwrv4TQ@ij$>av>w*cM2^NScQ~!pVq!2o47H3y=R=`&l;iOQVdq7Rq znZh2h*rdQQ_@ouOQkQLvSGM*JcGENN)w;4ApwP4 zQ5|PaFeJtyi}4=vdyZDzpk~jp!c%F?bM_jd!(7jy@_Il|o^!{O88PZaY1NEnYG+Tx zk{lBLJ3$mCsZpGU(d?X2d(w8E%zZUOFCnae%wR3l@e z3CQR*eW=K&ra=eg1Ekp8)H)Sl;ce@ocGaiP$fwWDr|$<3wKk^jx`!%b`l@=WeEQNo zRX%;+d8(K`+U=>1gJW=tNv#bo#%Jhue9)6k-N!+3Z@`%t4fgxSO9^9jp6J8S*k0499^S|gZRGoj?KD(?)s@bm_+th+u}0SU*$?PWd4;t2@mo{ zq&2Xav8pH!#~t|xsNQa0`KSOf@oqn@5{YHf7KjWdmzM{cnuvs!H!kLX>qJCz;&Lxj zw;vY@mn>8ICP16`p8`rJ{y~7sVXU9ip}LJjsGU{J4YR5(rBv5CtLkCI{7Gk?hBZZ& zqA-w^2ipxo_X>Xx`Sx}#m7x`XU)*je$?@RPRDxrWJ6Rx<^oKaNhP2D{&}IgJ9{`d% z(Cap}B2Ks-HZ=k%eoAyPT5F-#+n7g_ZE6qGwAT$GqdY0KX7!eop+twd+6SvZjWbeV zh)H4h^TOoI;TXSy!H|;RR(mtavg7*5pZlO)1Qv3xySa+YUhKZ#;H(dP%Xl#Qb zRKgDNj8s>mV?RWyU&0HuQIy(>do+I;g+-i02cqzfk@`og4S6)}chPEV?6l%&wF@TI zss-5ficwAOA@R4o={5`)ph*%~1ReP8#Z_71gVFy3{jdGHDJj8z@53g}|5jRKRcG2ACG1e}&G z=h}2m%OY!nEq7eXh*i0V@z=3x6^uj##ZG`L_xV`$U61kH5EFYO3}Q!*IQ3&FE^~{g z+NH{_r*UeiB>hSu<<(|fo%wcob+G$sCAwQ)y=6MNb`P>k(C-!0Z(*LD60f#+CA{}y zyqf4K!h0#Oq8edwNAjBFI4bPW+7<@%szV64w3gBF5-oB$PE>$5(6^#G2K~KOQFWl< z-U(`>Iw>#kT4I}9v_w|it|jYmBRXkEDsvG`22)xJjYMI5V^e}U8B$K0O6oiAek8a~ zRN}o{O1CSk{Y;a2d|;wx2OC^P<<8jKtAN^Wr$<%P-uTr$Q7y-VFh(V+H3YF-ci%%U z_Ta>FL!vqXbD#rv=!6E%5GWlEJBBH}svxwBs;UXnSUOl09qZ;QuBx{80a1~Y)f(1k zyMuMAVTJzs&)t-ntTr)g4u*Ybe?8Ss7n0RBhUxK?SXUj7VgNm|)4sZDnE$gq!FqZ+ zNq(@0?$lKqd2rYV9zbK`uXtCUgY?81WAP7$Y3P9Eae9$p{GF-)%_}b6O~dP{t+^-S zu6pVqxChs+uYQKwR@X-(bH$r+_B!C$4f51Ibi2O#2IOXrM3?PY2oKc;XpZ~ao_Hs7 z4}IJ~&6XgWH&lVFxRO#DsoWF&=SJ#cDcAL3V-;?y@DG>Os=jM3IBFYiBh#yV={L%i z)#@IOS6J z+8$P5XREDtI^A3a(i!=-P{T{Cv{hTERcn3b-iswT1f^bQMx7U($DKRe%&0N33?Uoe z^Kif-s@zd%6TS%tw397V?tu271x^PiIo`mpMbzXCbu6Ep9dD@p@M>a9mE&2(P+mx6 z9m;5_a*s0y{{`RCmMT2@au2pl0M~lBrCJH-^-o%Y3rL}wZ{i?cM;UL5Uq8L6#_?~S zepBs%yLDQLyMtP(vf-CJTHQ*m8asYsK^g041ZQf*O3$iemMaN{kPGV1TB##2GnF;{ z!1UH?Eb95GHHdJEOKPL8mrUH5E!K~u>Bb1nu?_2kJGS|0>1+&eYLql~s- zJ4V$l{}WYjr*d?zlzQcRdrm*z7@H|SZXkx6v04_b3Fm^m?k#gnl$wjEsKr;R71<6!~Z%-ldD~fqHZ14P#@uNC$;dC!l|&@ z#c-O@Q4I&daOHPY&+%nCwKEpwM%vODBL$^T7xCfjz5#G=IUnHd8remKo#7{{)J=U) zT0>dg)EI7^$nT~)`8BS)T8pFVb?Xl9YaM;jUEPR}HGf;JC;jLe^)?n1e&+YUp$=Xt z8qQ?3d#XGf&n$e!l%8N3e{}uW6NT~KJi?uf+fvjs8+f!r(rr&1O@zY<)OZieQiYF_8jQVkekN3K&iIb;0baVH z$y{n^iv8c%n2Ij?R*Co0xDDYRtaBMU(jWBM!Wm7NpW61v4imvYrrP zB#(8`$grAO?shOWu|;`WEH7x#nhjPtIH-Y=LPsM1#HC+6a<2K;i?`??FWiw@XF1)G z4v3x;+&y<0sSdb$ES7Yqy3S)d;^HW8s2ZGm^=K#z^(_@On6FMs9kw{c-`CH?ovZel zfJ3K?os_GnC6HY!6qQ4B=vp;5ar_@cI4zpa&COrw)~0{NnbYJ=i>_`%JYo~3)(brF zhqt`_0?ftmGvK&azEsc@2Eutv9cjOH6$%hBh}jckq4wm%`Ns_-J@`zmPJLC?CatE= zR2%Wt{NS{5%q0BhdxOS^7oRz<4Pwn(%=0?r$5E+S#Hc-eGr&jFzo}W$_KpR z-2ZfqrZb-14HLP4M@{V(Udfc5GWx%2%$MDdY>Yw4<+(%tL zQzwM{(_Ej-r@ub~MO{q|hKX73IZUmCB)XPw*P5oT0?tgNo$P6g?VtP-{ zqOiJ0DppQ|$7uR+Dh5rQK<@m#UEc3$WK6sQVY{2CQX(W^YDRLY47qqNC(kfbCQaw6}IF z$nYygbsiKBc$EiFcv6oq)J`<_OSLa* zHkH&|o*GP0xo5ua=}=m|aBV;k08A1S)Ed#7p1M00jXGC7b!Y74-OPPTD<_n6Q`Ff! zK=X3&fftNq?EueC)E`eDPE-d=XXwmCRm-U29)R-HW0Lv;V6ff{tX#AF%~bk)5_+_W z@+N^9OQi#oP}gbtdy+baXH+bBhSW(}lhr18bZ9cx(VGN@H=lcdw)|26eJ1z?!??5}V z)Xg|y#$~HA<}1prR&mc)wBXLmi}{KsIRF85kFvqKogmMz)KR?VuT-9aMVhA8L<3%* z207r#Md~_Dt!S9}9c4~~%wV8p)6{UW!YWX4YI~%LvS~-pI9_q{Tt3pxii!% z@Eh}j2%T+p2GIh;{UEwGL$&)){oYHyf@HN`sNvT9r$sadgOqlbf*zH z8rduQe8#)<{LQxh)bQePz)z6+t>Nwg+D2-U;fpBxo79?h!QGa~AbeRuADsc9>t|L& z8MxX{(#_!>Eue9MQG-8sAQuQ8&^t46-rzcYrrM#|cHWtWQI;~v{U#k^O&m)nU6Ha)yY&KW3uT^f|b)|nJt~6?n+SIV?ApJZ?g;m)l z%|&T!5*uaCQDfrm(!Q1ETPX+= z(vNm{-oE7kJ&;&wW87z|AO`$&A0uuA38 zNIQsCe;)y-Nl)PKunMP7itErS>|#9HLvlKzSe)-janvARG;pu@fU8$Ngd{10vL$0s z&YWF9v1!@wb-Hl;ve~K>Nu+f&Xc(16&@S_jnEY#=ciW4CFyY>6L6WcVV){ob%WrV#D(0gxcviFOJ7a zv%avEg|bAG-O9)dmTFOd7k7`gQ{oS*9VDp9RR?l$c2SDoRz&m5@l*!*& zPFs%j52lqrs22153l4Gk7yN*w2XXY#b5VijK~_dSanm8&Q8=?)N5t0th{8mDe^le~ z>T@4+D5czWG|JgF(M-zGYF2viqxuc@^^Bh&i?5}-KdH4n)=D@=pMT&TM!8Wj-jw1} z{qU%l3(LMUNvEx$E^kXhPU#HHNW>dxp z)VgN9xOHW{I*x-C;P5q4Fpb$D?*6zzoyYH*w7Y{hio5eRs;lsoluZ!#XH#~!XF;w? zo7DgTh~T4vA3e(?Gj-jfR>phmq)!liQK&{x{ucEsoGr}@)T{ifK(qY*RtUhQ$waLR z#k(IBstd3*L$|7Pv4X4=zEzE;6I*cS&xL<9}9X`*bMv-yK<~zDB*bsokXm zuJzks4Z_CO5WxN1Vy8(DeBwr>xE<;eUb$WC(v=;eOCdX~HQ)wWrj<^>nAINO(SYx7y4!hm+T+TxoN4ys&3C2n392yM<;eb`MN)-%!^*Xz1J8Y#R?fnbog$Ysz@57s^ z9z-kika`z9L)E}E?g?86R5a*}*3*N-7@WcMBrq+;4BuO5GG@`hBVfR1(&{5>q6QwF;Q`o<66Z!gYk03m4ija*~dl21;<6j z8-hi}PlH9p!%wKo09bM%BrTk7o>G%(*hw|aROkV%Yk8`6Obw$oC)Kjxl7`#$!MJ!5 zYWw9Bb4vXl1t)}R1!wc7o(9QZPs75}!hKd>h_)`}V9`~m$p;Al**vY*_x$d+Xn^+D zKZA)|M(N>c;bA80$tZW6XV6Q7cJ2($Tkv6LMB9tP(<11-haZ-uMm5t+)bp&$@lXbz z6;k|a?Xo07^yorFS`AnZtdVK8!A)hIQWAjM+(0-m?4sYJ(yB?5DgA<4A9P~Q1+|&|*YhS}SM zA%4Ado*b9eiWGfO^@k~=>P0a%m15E=8Zi9@Noh!|aZ&X~cUTM>w~ek}6xzw8B5|qa zNaH$;RYmH&lB)e;@#17^6r0u%Rd2tfHvgZhu8ms#vRAsKHh2ghFakJ}r!v_zbB+`>%r4Dx}r?MvP^Mi9&x>gFKc8$VYPJ`8>ho z-D_%$zviUC!DAr}t|#ZOAoGK1^RH?}k6A|fI0eR~#gn5-nimD!LR(^f1AU%JRew{X zL$SBqJ_aQik79F$$EQVOVC%+<-VKNsy;~ih#!cjBU+EYPyoRBGYQAFHn_^=ZTvPjC z#m4?F8lwCTCS?}2Pe@A=4e-CDANf3D%sP`U{H`_RvM&6&6=hffnC5*6Y0;*WJe3S0 z-fyT5vQ|p7cx;p4HDJA|*7f;S`xs}mmi-}i;;lb~xPFZe-BbaIa2>qE3Tks5yhS0! zRK`eVUI!<(o-!(90iD0D*3#*~fy!yIAV3-&XmSH&VkR}Jk`@_mvSOHS{bTDk-GFNM zB%Qqh4rm+s-Bep(eEy;pe_+c`z6qxUxDZhBA8H~EPfX)ubl@g-Mj;j7RBL)H36Sqo zajU=(YWOGQj`h_4Pqnq@?IQ*dr9o9iV=RIwo&Qrb=4@4WW8CfmC1G)5sNTLM8k1B_ z%-OPAViy$O60Qf&IUWwqJFyyls;6;CjzPBtW9qD)7A~f35^mG&Y{iqRh77UM=IUud z6kea{}3 z_`hg-54fm~HGJ3wma@RYS`ZZ!j3#y^H^tab?oHEZEa@7{y*JG?&7NJOH;G{Hf>Fi} zL}M=y%i4jcu`AdM2$t9j*bB<{%)E1U+2d~T`+wix-%rk-nRniIX3m^B&w0)}?>zdx zts$3XJrcK7{-f`6Ah7H)e0J8c|CD~;3WwCv@1u<3fyJ^*zkgRgrgGbK>&E9(>dPrV zS%VFWr;N5XjLeBvR>_(>1E=wxoU+@Bkuv47mEU1e1}mRttF`OK-_bsyLs~o0kH^~K z2|S9>}Aou);Pl+_KvUhHRJAR1xt(L24ZQ?GGFT` z=MZo02Rq~0w|-XsfLP*Zb&YP1&!$F3YZ#wpw=#-D+0`kd7~Sj-qHiD&MKO6`E?(R z2?y{X&?-jBex`K7U@U#3TYXgU0PFu|x5}*To9N)q?7KHbuNMVb6|lw^-|Y4;_T69K zhqKmibqf&VIMHOaVWez)3mWk7dJRM3(_kxydSA8|qt_%Rx1{!EZ!UA5Tyzh2NB(e# z4Z+aBO_nc*26*o>H(8AiVoQt= zxewb=?0?k<``C#G$;a<@tA?~;J~HCVn0LF?1dTf!OWg52E>!ai@l!_78hbv&hDBKa z6eHOePn5g}E5F@BtBR4_p=z1i&BMdwIku~+H4IOb6IDekj=kTlw(}0_9x3`N>H|^f zjvt7NGy%2!FZK)k`guU0eIIlSLT$0zsz|&3K{wC>%<>_iwpz{lx)IZ2lGc*ZA9kyT zPM*ZF2d05s`mkFhmbvDB*zFm7-e^0APJ|E?;G0^~fAF}sqT5J2B8Wzh2)wI^Zbx)~jZ5VJfjWdtf!da(U)}wf(^yMu2#-z%QwlUU!a9@Inwg7}T{3axnCD*ocH;mj( zK6pvw`;8Y4im1l^^^Ell-gevhcB|@WTgUncBpxezIW~gD`{Vm??`N$IwK6ed4tHg< zK7Kcx`95d;31t$Vv&KY?p2gkjYx}gouJv%lnMDhKIfGq1lWlws4Mmjh=EkZlwZ1hn zl!lEFx!i5=)G4C-tlW)khTg3y+{GT&w&ow4Q`Vl+fDc@KSKp z7oYWG%j;R6!TWxny7_oJt7mNllf}oEMz&Gl=hz12Hx1*fG+wUo5`M3dznkIrf?-vq z$5IT=raI5Kol(PBKhzki!dpIwNNKjbp25P>>*Ln$%Hn3nS7Be@c^rr+X?y@!4ptjFT6`Dg);q}VGI5(Jcy>c0YSR@Y9YPQj-;KSn4mG zUsF=g@>=%(q8D}=v`#kT+qr8ZA>#Y*++eY&SFr!mQB!{6FY5%W^G%d7PUMFq)fQS8veuDomVgE_bJW*|9tb5>`On@WbtDMa|cr0wxWOgO<&S<+Bbda4&eN{ zBHVewy}NuS{iG9s%V*M8i<|3LJ;pbdb$`KHN7mLc`~_=8LqOI8zCOMJi)&f)SvL5m z27$PCY5$zay&#o|hBsKh_0=jTPc8hXzX!SEi0$2&`DN=b0Ye_)yArkn%xo1~)lV!& ziu=d;NOt07>t`6nuQnHB!7?qsvSUJX>vHag+opweI}QOYtuJ8cv}$SPK{2qyD|n+n zDzns{3uR&NGd&e4uvpert+v4n{ z&eo4np`^~@nRlc!CWrS}t%%pEMci9MD=8`{OIB;YF05vqB3|pu!dTTP$J#E|9>InK zj)+gJV~lW#O8d99uVFt6`40e6XV&RIxHCFChX2R99o2Sp`qnxYNY-(Dg|$uGOX~s< zX*Dp$)Y5>D()d~z*wo+?zAm7p!3U=S{M4_uNhDwi2;3TwfH!?dr@yT42Gm7i6pabw zh54sGldG@^g>mW!*=<*>0mcY-*&r$FI9qJp=3`jrSaQp1GWr&cIKbkD8fx^YFQZu@ z0c(X~L$nW+rs^>vw15TQn*3j@?T^n*7a*e;T2!c@oOS-XqWuz|G3qPyIa6qR7c{iB zLo_di#{rfha#{W>01IOciqPVi`oKEP2iN%dN7juv6g{$DFsx+99$VYvO4TW~cEOpw z)cUs1s;aE;u{DzAm14d<#EMI;GYl)Ij92lcWlEmP-xz8eRKAw-D}(wH<~=jBG`m*C zvDTm-^u_g^U{t+bU<HnqY8L3s%1};ImXpQE`0(cZ*Le zU9YRwFk-+3H&lIm45yg6vDyH+uQXO0iLaN4;r>&#N|9Ku?|FR3>}guXv8b{7F9Rs^ z>rK>ufa-gusX833UD#CR?jR;sTvx4>+)Ryyx!TRtaR%_3xqU$%^xpGq-5JeZfNNpm zkyoBcejzxB#Sbs=V+;O+ZKaY}c-}X(;Vr|4x6$m27@ri@zHhLJ<%IhhSy7<69u-Zp z_||8Kg4EWa&!z9Zulzg@A6(~mu~Vv{vJY)*+r&hlP7L9Eds}rf9{MJgqw}~n!D4sY zzN~9z-Oqgan!MsM7h?Sk;S(ydjAp&6`NliivV^9+(%7u5vH}&H0#jF$fa6~;s6oEi zPaOM-Bj#ku9SaL?(=Ukq?`8F8zRURdpIWkJS;_TT&*th3Olc3Aqu2Yey054&;Oyg9 z#M$sy)Sf;C<5=^SY7AT2{7j(H2-tR&WoFz!Y*^N~g~~SwOKG9<_n0Fs)LuU8rgPy& zQCAJ_Pau4u7oYmYoE_g%$ zgDSCwiz~uoqr_AJ{2>QGZ;P8XfaYDHa84_=6)KW#Xpa@VtyJ!?+hz0{(JUs@63EQC zef-12==(d~F8KvPs1If7xqq_s+hM_u#MUaF6b{y|t-2M5>Ni`!AHSWt7LLv*+NrJm za6g2yrng$uW^EKT3aQ-{wK)dYWJP@jH^mx7O+;ev+bx>1{FF|CEdEusDk`x2b_;%6 zpL|t)7Q>iFzi-!|MwP0b2XSt4Qe;E+^Jn|pI#T|r{>V{I(v+8?*( z*6Zpoa9gA}CbwV5fWc@sys0(|^e-_WU`U0Oq<~t6$|=oe*T<|=+F7k|@Yv*6ZFQx65HL*i=wQlNZyqz|ETb;+6eXOSVj0QbK?zlp_8s zl>fTIf0_BO3;b6Y{}s=j2RQOj&hj+=OAH@u{4KDUu=DPd4h-BTFpuA0pLUK7J=HP% zl4LZzU)9g3+&aqs-CJGgGq;3=_CedHvfKkPmD#&}Amzgf`lxLU!%}jdt!Ak1c;(+} zbzh%hGH6LipokGCn}+SEYySKHM$<6omuVV%^r>3kC;ken_nGsod!`vAgE~Uo~Qu&(+Fw8Q*0MKUeGUI&}G5h1Y~*;OCg7F|L<>q1MAQ zi^ZMDtIFD)G#c5>FZeToHTY6(k7rB5oQl=F-7ze8Kxix0+v*P|;V&z1SlD7C? zA6I7w`{E|Wr~0q{Unp|y|B4Uk>+tBs;}H1N2LbqsepJWf+IQKFPxni{#a)NRAyuj) z{^GadVTh>FeB-!}epaU$frY}aGfO{p4TRDMtNi^bXRtaN`5(s%vD}gWt>R$us+kX` ztnYEdGY!A6Mnlzx2wJ7~hTNK=Di3$-i;W?Y^1~}Rt`AjTA~$8x&Oi)71&JPcq>MyvfCYXc;==zH*?i3Jr#-j!wYOXrfB3_H zI#LtW0K+qPo_!5Y{xRH9Pf!zhD~%D;4x&EgAL1@v=h@CAl|R0}E9e-_a$1=}n0XSg zC!U|R>m&I3JN=F9yGa;YpjsxW6HqS@EdOD>JNtw>Cj6qF_Q9sh{gYMxiZm-DB8n|b z#&AR^%BZfNFomfj4PBbM@K%O5k}uXW$t4c| zLcO?8YSoLiYGZXnY(GCOjuy{>7wU2L8jquu(J@%W(aN2sHo{Vc$J6jAen0t$ITFEj z15GTfWyKKg+LAOSpeEL(`$~vFPV-n%f_A^p22WR;AmY@r>3HrSaO9<09B?l;21gq4 zQWHK9i&)-p#iR9?>w>s5EO&fe{oXUIwAXeM`{{Bm{_>hV1D!aCrCqMYmn|sMUyEnG zKYZEDhR?*jki`tMV9OVK(gK(EVM%LhRA!@RslkW}#}EUxDqA`Wx9fZC)HqBrz4M#K zR5fbOCrb8=KqXqq*-OrOmS$#7z!8x2Q`ToL2>zfP|akhBpVHXzXwyT2S^jKRZk zElZfKZuBjh(c1C-$W{hFpWTHi#Xme_s1rm%pZF)p{&UpZ5eIMjH?2^iC0yivmH5gn z4RFO*cHd+@JGbg!7&jy107$G}^VE*4^Y~W0seR4{@ps@RU0QX)A!+vbNZ)Wk(^KPH zH8XGcBS3_UK)`)v-o3#LgzBB7}<}_aaIXuo@pf(Gi z{D<&uHSw4wKFSCLU0$ei6+b753S=(CmBJFP_gclU2Mfi_-e?is0h7>z(SQ2OfEPZ> z{jKcU2WY{v_eBdb-xmtL`bD&$=VH-<^u?lV`Ug;Vd9fO9UQt8}5Z+E%QpAFm!1yKB zbBU<`JMVrO8NxlnvVBhveQM+G{^upf?pzQ z)}>WV_GyOtJp5%FxH*!-OHphi&o!bIh{Z8qjbaBf)X#W@8&QQDi&rdOVHtAVRbdem zlq&qY`Yt+L`Yo32@by=;g#^BQxd`uY#}(FU1v-2jo47*#0-p=y&hakAVsm(|Sb3gT zKZ?bzRGT++Mh7jc|H_^x@3pgg*yNRJN563f#3_&KiXAE%wd)+n(m!gY1c?pbMV&jW z5*_psANn=fh*c`zVd7<0F#I3YSqEd+e>$qJR!tlTv_7>Ck&xpjvDOYX&G0iTaHv=P zzYpJED;Qh8j5ET?FgL#gYqnPHL zy4WtW4r}*jU4Pcg++2j1Z}K@`Fc#kQbG~4#|8o`L@!HPpkE8-qb0op%wh6odn}#*7 zg|sfgJdNcHgQML$>(vP4#QMBh8xg?WW?ao-za7F>Va82JeVsp75{8HKc{VP*IiF|0 zYhQP+BYT4i_ptX^@kUh%U3e`}X^rIvA?ULYSz47(YZ?0C%lfA^0#;r&AsjY7GOUUg z9~rvrF;(`#tDpE@kW+u(E2}frIZ_Wk++?ZMrLukbps%4Uws}|;>~bk7{_uV*VZ@aP zcwgW(RIfWV;9Ym!$(gFzk)5qhHW-#W-ruaYHXzc&S`HQ|jBOY<L35Rm4cB(@w-!wB3$C%)yc<3EzT=2&zg=y@ zG7hv($GYV>INDr+@9E0FE`XqTB49cqC+jMNX_otG6FCA(XX=nTa}(+Q9WDMVDU#E;$tLbMS#P(X6~)ARCm%TBZC|Tx;DIc;6uph|3SsK^Q^Nb!K?IHYEOxhA*EpXOnk=Dm z)vC$s!u{D7yVa`3xk&q*<^H=$<-xGC;5TR(%p04^f2HFOKbgu;*5nETShV4v%T8-9QVswMA*c~3TmtM!9M7GpUR!M^>YdkAZrqt<3a_o($>OhG+{oyZZD zI?7LO9WQfIG?uEH!*lZF$-xwMYL8kan5S{W;bX#?VXqqbJa1EK4uTe3z_0LQF&gbe zRl#$PXs7rz$gSZbGg*hdYPE1)Zqz=MOPwdmv3)DUs}5f9E0T+ZSQTv(9Ia6b&qTYF zkgxdPES&Yl4;e-RY?XNF&Y6Q=F@(>oqV2)rEY92GD$dXPD!f|Qd`DA_K;=UBf?rv2 zu39z1-6B8ZMc~t_Mj3gv&$2%I)M}sOCk=!g{;Lpw_~qWtPqcxsfS)9er=HE@CuIl1 z5+tB%e>)Hs%)_TRHL?ywwW}^8b!si-}eM~ouAB|Ks6C3ljX?*o)a%m zmZY-G99(do#w*V+c<*oCsoMPlue`Y8Q~5n|6b|Z6%)noEunB~?5C{1c=fdGLs%Q~J zoP&a5grq_N4T2n@ign3Vs}1HufamaXG7yN?LZ!rQ2u#Mcb{hgB;HEN{-xvm7TzXSG zi}Mz`h5$e7tMGdAA)u)aq#;luhCn2*jjIHg>5H8bWEq;u$VD3y2deB0=?RlES8V$j zo^R1&lsIR(tb6en)NIRu1n^s+|s@@*#`ZS@hz{Ga&!U@OZx04kO9Ak~@SjxVCnAH>VUoD#m`?Bxnr z%C5{TVJ{vOoJiP5hpV!$ksrQch*k$Kv1$mL0tuldinQ#8)O+Xheegn5JD{alkasxW z6)i|G&U__9=5G{jPsQ)6^Nr&D2@k&X0=0^m%&9^4O+W*7DU+m2ddgfMmxW zRr#Jh4e4wTogwfG*AsS3SX~_Rl$4(cs6%7l`{T*1gBf+GaayjZ~^$e?63tBS#2=` z`thf8uvh~rmQQj8d>N(q2tv5jfDw9yqBXx&!oP7qYl$xxtPtxL?AuNQm01h3@W`l8 zA3&uMy1^L�Sy$M6U-x4Jz3PlhQ=C@h`Qd<<`7xfd;V7vN9@mb{-2lhflP8<~`0b z##O5ns*EaybdD>G|2 zpE^r3S(6KDHPJr>OsO4FwMmN#p+M0)S#=@Axw)<4x461eb0M{a6KP2opfYtdsr1Jz zFnu)3(o~)jL#e7#D5}RVaGvwm*&-Hr5ks{rtA7zUd{_1!4vo7iXZ1r|6b^7*oxkYX z^JQI2FRC>#ba&u@o9nz=N!(l)oY#>VE~%04T`A^$%Byip{8AzTNN|d)S9o>{50#Hb z`iA2)2d9rJ_~PpMVlw5zTu!$BqEjtK)kV?7!OA_S?)V$r%2Vnt(R3@fP)xaYa_wS& zUcpj+=EogA?(tt7@G4twX^-ob`1L5Hg6khEs_AE{eb6be8^4qt%S2oAoT+DTiOHgN zi8JLEm&;fp!nzYY?V_Ct ziTEYkz<-V7MOm!Do}PS74HEa>B^Fl?+rt&LvIT{w-xsJ)JX8aeh4)#@Yicz_2KD6u zIkT(SqQXaC(Ez6rbki^d=DcQ)WV5fSp?+Pl!7}R-F(8WVqSLDg;`ym9I_z56L5tm$ zEo}xwHIVa}fkVe2rObRLNBVVVA=c?S?(=P8{^QcYieoeDvfUnODH1aHN)aTcv?7E- zziy8*)6UFD4(7=$=eqg`6VTowJlu|qa5XSQ$r-^)i$D*u!_uKi(-T56yZga zezbpOdf@DnXU z<&kJaa#OV7u}eWd6qt80>WR>paAgx?A-Cjkz^bFTpV5X@&U}lqfU)8vTO|ADmN15> zF$rtYhUqv(PbD}kQMMvO7;PXeA8V~njnzm^6!Cj$zIO{XR2bUoMO&H;lop={b$hxOp%*x98dn|i{Ez&Yl$Y6w2 z#_H;>%18t2a@O`Tt9efi5|?O{ff;hqy!?B7xbXL|D#{_0J&WdjcTY5LG}a*v`QcO3 z7?-*0_h4?+P@{Ny`Nu>kLx!@N_hpaaBb#MERNfz=@}LFM54LM0YN^$Eq; zT7pwF5eq4Kqf$fd!C@1eRxp4jz#;NQ^x7X~AaJCzK2y6hwTHz-XCc<~0jjoI$a7p* zO*fDjmUxc3z_DhnwCApeRpZIOTLDZzZq-N2Sl>F4@J8t6NBCJit zva>pvq-s18r_<2sR@?Zn>0|>#3_U#Ez;fS4Gp`Nd?;&_lqt9w8=f$Nf3r1!*3o-L! z^l-Ag_{Nx8O43klaezr`rq-;QqK9X~{9}xRSz2-}J_K3fV|AtI;n@b3@vJSXUc7S- zicubp(0Wh1v?(sb6G~zDhLCul;82-@Wn+m``Y;2 zKNt5y19WRkoMQ0)Cazv`!vVoz^PF`>&(6cF&~-pmz3J2Gt_+B&qx>R%m+ja2&LV7s zuPxR*#wlG_89JR6kGDsf7ibNsgBS>1nZ?i62zD0=yN;|?_6`O%+i0Wvc@eChM5pH* zpxDO7m}iw;2bglh_96@M7Zt_=Yus(g)$KOZ5|{O5{;((5b(p->2Gpun){a+X@3qeamiR`DPnmfVz@p)ai(?ROjtYS;H_J zUjnnr!1}ef*Eg-E&Z!5W`c;^%213m^)#p@c@`AI8hzec%BzdwnJ5mNdxEsA z*Gq07$=cAeL7%sg@?xQ-X}HkR0SDA2Q!klCk~N_vOP`lbdC}04LR!|7md$#}EhJeT zTDIu(wo+a-XbH23x-`TAb=jtu+)k1a(6U{hw}bMkK+9m#GJ~}2(o60p$%@djTc5Xw z^7y_U*GWroMNyZ1ddVD;tPd?Y`aH3!uU$+SwDdx8T%-SymIHdpgQNvJyeJ3td50)3 z7+Us`mdiLa>#Q8nOCBZ30BAYtmdC$oU?7u zp&1fLPk<7@^%Us!6uRjNQ9^jJK~6oPm@bi!QrVV^`Lcf%TWk|OTGmg}XM{!$2r==U zVTQ{SDzkno0JA-UXvQ@z~7x8dvV=HD2Bjv<-2?=fSG}7Z{n!L5A z(Pd{t+0T)fFg@UB^A)Wb*hdD<$c?l$!i)FgNZFcenCWiVqn>pK%{1?7X0E%;d{+%- zJOF4*k!Hp$9(qN1x&ug?i?!r1@vyjF%{D-E;tjMf(H0f^B$U2M#<&LsUJlSr@7bfA zc)Fmv=&oBBpTN^Bq=q=X4RCaBV074>vPJLU(eu7Ns-8QN)&tzT&LV7l4K&RIuD0CM z+7K@A(LKV~=KET*g(o}0qHGThqHPaQX@Ki+J-BAAYRUof5WTa&{*t*wQ&AC7i{O}E zQ#?u^iHDT{)$B@5IUpY6IxWPL)B~z!t!s&HC?zy)iWd$5;(cghEwsr4n6@O4lYjyE zIs{`r0iV_Zs@dByHhMW70;1X$UC$jmhRP-O z-&j^{*_C79cmOONuE)~sVQqPR5PvVBJzly!qvxK_2)*Orq|gBnV=SGH$M#jz@X|ej zI)%nBR?GG&QKK5@fwO)XPIMMx<~ry}4=~!2sC8MCcN@(G*nw18P)IxdHgEvkVY zC+p|^8O}niNdr{N18TO+)Viy-82B?W@PVGqv$W)Acrr_GAjjium01_#tW%0g@b-@`V*yhvst3_&1zxYvueuK~0d`v_zm zx`M3%j7y%C#qgfdCvh)U3*EOGSkZf+hyn_ ze<#U0(DJ)JZw2K&11&vK9N2CUX<4P0TuqWO(6U;e=b*e=(6X1bTp}%N^^)sIG74JO z>GRf8UJYnz(_GZ$V;q2-H|ixfkz^#aY|`gtQeIVPSw>oRl9p_}^hP!rveJk4wc3RN1$60QrcZscTS|0vBA#6(g zeFC?$cLMwC)?z};^C1Fz8lC3j(Fy|FbdnTtHY>NaEw)_ly1*qL)dtg>2LNs^qz;kX zHS6C-;NjVAY>z}cPqPg6I+ma2<8?s~zS*9(HlmWxpuV4Dj`sk#S%Y?>NoUc6oUs0Y zPXEI0qt(!)bI!hD6WgJR?zo$6Y9}q6$HUnhSzSXB7B1lF%E{_C>GUF8964Ei$<+ya z6$|x6oVLF5x?;jSLz{d0dKT*$2Wz_5?p^yTMwesN4Wm`?a^V6 zofgpjj|oqgOIepX3$aIUqFSCP>v$0j0^~hW*73eXStn@8L|G4h%a(x`^|_9R4}0QP>8qyAqP?KQ&JJ4c<@MfB%n>@UYT>Y%QIjh(`Zzq3_gy?t## zres%rm9D6-JJ4qRx@xZyP~into2P2+Ax65Ot7y+OVa1W?H{dM;`}$qkp6O_hH%9vS zyP|qCsCqeH*sZ3SuIl~x9;)XKui4`FWc6lYO{zCaI^=!P3A1s(a7y|WoPv^0k<|;Z zO*V$6l9??6PP5YPprrY4K}omnAt>oz(aoTwEpw=`K+!P`0ng|75;eW}6Tw5z^<_%R zpjSgkh=b?fdDCz+!!YB~$S?EV#bFb}GQx-tBIA0Hg=+v9wZKbs~Frkf0H%PDrZka4Uk#y3RHBzt%3_3UxeBgx)lPCb(BeT;;Ug&s-v?$hhZannQSQ_0aw z<+@2pNQ!XP9Fm&$i%dapwf!$18hSL!`u$hllm{?pc!i$kgJeX~zUa zkD~I4;1jMsdHZurQyy@sIZtaZ5y2^+i}vO-WftIWyZ z<2c2<`j==Bcd7_GSGM#yO#HyEdd~`_uN*ArF@t*ns^$w?I|KvF())^bT=XTN%JzLN z8*&LX1W0YFXMXkLdVM3BgYBa@TxH{MisoFU@z^=X9u#)1Y_V&& zM&1bF;BSSh>%Ib~nu?s|*eBoOQh6eTi?t>aAzX}31zZig;VcRSasxG81WMfh3$h4qdXcb%qD+q)Q5 zi=os5lx2(ii4M9)5SAUqDf;?8M?mw~g#Pk!KJXPpag*|3>_ak3qx2z*Z*PnC3}soP z?}gnGg0So(oWkxSy2k0x01rKO>S9UX17nuQ9GAM}^C0gD)tckwUTiUfIc9NI@ygrN zDw*OT*a`qlanthP>`P#EbQvuk2&0}zc&l5osW()4-1QXU9ptaKGx8sPvfbM=zHkt7^5l;8Au^C%C5GK(iIGfB$=z2riY zgky%XP@lJm@<1rFBGM8vQq*OMUUDf(!ZAZxs?S?Sc_5ToZxjbq|Bm@Tt5{?;4 zhCc6i$^)Uya!AV+(y~%7xr!v=n4zrF=dGqZ5X!9GC{dRlIG}ge=q1;ZBpfr8wfeku zlm|kYrIVK3q-BF%awAE?F+EY~A$~frJqjQ!sPGY-#eqN!tIfq)W@xg7! z3v8F`M-CaiC&P(Yk}^L$JKzhqOxYzU`_U zVqKE(0O?$9K#=LMQziRkqAj+eJ7MhZsBy$83-d?tg!aZDUz{k+AH~BI46@~zW?pz{ zD98MWNj^^Mcn8l+BqljCQFiGGXfFfCEqR&>Vv_SP;c_N9UrQz?`JE(*=uYC{Qa+Ph z;H&`JgD{6)0D4`(i$W*_iEKHg85CX_$|*m>=%&+7Rjl1)3>G~^XZ_c;nz?afvQs z+#MP8nHy}ngc<^eH~xDZewkV)5$fMuyh4lIi36_PI0GQr8})(4||a5no|{v zXXrdV4rdumcHVVV*9+)27iqm9_+u6`RorRCxHsXRVY)#!_+TrY3LARR&6-V%`wtQvo zv)yz$+UQXHY@Zmy#yCyjGLM0fH=cOG9HD0{s&>*o6451PkBmbZ_+T`4CyDhw7~{*D z8E^E?8y}x5%uIk8&Kn2(CQc_B9T`8_79gPaB3pp}65tCsG4EMqdnttfCXAe96h0T0 zNx~H0)0X>OD3j3nppebKP_m?unPG`70WQpw(R0AarYV#Q?wI8+vAqbSl`O+$IGrsR ziNM)HVfwtOl*ftWwo3&@>W%}nOxH`!AW1k|C^PhVGbxX=%gag2F48hvFPTD;aJEoV z^m(b2$0_Gp%S2sT;()sRs+XKYl5n-19V-J~S_{Yi$VT+-hg^u;#1 z6_Xwr8}(9~+@vHYz8lJeMV%zFE=Ix&B0>F+;8ra;f3EASZ6 zqixn^h5XLBnWZfs{db2=B5I zbF>Hd3pRD7n8mgm1@mp$q18Yv8B}%{1?)EMbTu+}l`Xa$)V<3ojfs1g(L3tywOSb8 zjjjYTX5;8|52i)9W`yl6t7b0}L4p4*+}>BVz&^Cd8{F>fu!X|ux~D_*Z>~|m>#+S) z9NmR#??=nQfqPh6c)%&f+N}W!*VY#PZ;fcoK}_46{$4<*hm67(+H}}est~30w0GEA z`Mf-W2ap%qoAp~Os{Qj?QSD4cH!?#3HL_49BoINkj* zo#vzZ@X81~S+>YYTno=sH%I;jxZv={2rDdGq!2~CAZzm}Aqdh=P~9wkqpiOf=BH6J zz-qlqM(ifpRcCM;cyY-vpVf3m2!H0pO`^;G!j*4@y}W!rKdL&Gzs z=FPtVcz~6ImWx^qgd2u(5tg{ubB`=(`Vx8;UeD$FWLzfG{3g!G!u;ad2l_#lxO!L6 zCEN%4xomNI)hK+RP1jsHdSye09$>S?Y}u#RF@(IJX>*a*BBHHJvqhg4<0`=!gKhXj zHtYtBKFylJn^Y-|zb%__M|g63{&2Hs$1U{uW9~Af)j+HjRBpo(P&R9`MVh{2d>WUG zyDq~?TVU9OO9nf-MPT21*qz%JZMm=66>9~R`x1Mb9=J3O-iChFLvNP8P4??UjDIf+ z2hAm#b|S57Z5RFeh=4Zxdb@1gW1!jcR}7ZAs+74Mjq^ZQTjJ%e0$6g$J&NP~1^zZC zXvu=Ob|^b+U(y1KArSC}y~B2ijv9(6Fknc8kH#>eM?4WTcA*OH@S7Fxl6^AV-z(NO zkI?Eu6!km1#arV@Va1UsDC$vUrcfYmA7vD_O6C;xXewz`cm~1m(f$H{v#a~XXd2^B ziwQqIAWp~nlgCEk0l`I&^CxP$$w6^C-k+%H38a=&)88Hx;A#vGfUb%DI%+zJBsn#m zq|ci~d7PR)Nm?F|mdSd_DJ03M=_&fWWXj{zbf-h2E`4!8U8d?Kr;#M5rl;xirc)lL zrZ=Pjc=PEB7UEvBQk8kIXM>28t$)kOkS*NcDfBr}~sN{mX83u$AcWdK-_AereD zB*cjX$xN?sGXX5V(oK(KrY}16NM_o646s}1k<9dJy&i{~9_dr!&`Ygxlah4xPf%_a z$|ZhYi<=VoIc%MfmUP5A|EHs@*E^CQ%?+NO9_6a#@W%_%iu30JB%kn2Ll16#Ld^X~+^0kCb;KD3$%^yf8 z--TqetBDEum_K&RnVyk!flRHW80@>c3XfL2NcYGdSAiHrFG?$^P&AT-ng05yo1>zaF z$6tVF*1Axt+KVSq`HKkmQ5*QxOe{p#d00fqjueWElLLjErq0#u6HT4#FKO!iE>-3; z7#L5`)NRkm79BuuaGLs{rip0kgSaM~raq)46HUGEjJzg?aZNm9=}6Y@tib!7&Psav zC}cf@XbwCPk6Wx6eCIFOS;tW$;OBB^=@ZmKqNPvxdxO;6LLL-?kq*z-+9KRSlzh68 z1T%fosf~3yhyHqknI3#j_E!N$g=Z8U$qLVjhF?1;M!_lEa-5MqO}hDI-E$tgpJ1dP zpO?DN;Hr9Oq|a*ACr0|a3j$mGMXeBw^o9$v3(uj&PqSX|ysK)Kix_d9e3?JIC`Q}` zv>Rl!<)T&#u})CA2us|j`4Va3sJQVZH1Y{ny5}X?$ji8eym@?NUJ|yhz!q>byF#Z| z0g*T>ea&TK`DN5r$4Z~PEG=9|oxHHptnC$Hp~zqOc6?1|#r~3%&buZ%@CL5L(<~Ld z>8euPbyUg2QbG2^bz$-r#yOmq!*6RHD3%B!0+B$V!io8gOItqIrX#0Aiev-tLX{UM zX6zjF2r&6tF#L_^eRMwfJW;WrzExqXHB31twAfzS1w3B(KsT=#j86 zNnhX>D!>=@DG)*BKcT}wDv+!%z^DLUzn4Lhd+2bH3QX4*m_Y^jQoY#6!a{30e1roU zJzHNOg$nRhc}XO>lny(nz_0oObEp7cfM+Nb7NY6!3J$O^PhVg@72s>_`a=Z%5)0f! z07@r65Nqvx=00E>AQC*8qf@!g?i3Q@M1o{>7rB)N-ds!uj8KDOgi5D0v`aOFKc{rI zOD&SVU8>iz%uNen(kat5ErdR&WZG-IAgoC8HeIhJ!%d3>pBWh49DM#RG9~!@JwSlZ zCmGxjA3KHrS%E!Ly*eje}wwlc035E${HFm9g z8Wz{#EW~R0+C8$kmNnE!EdbmaY)i`nz^&DiDF9rWubl^gOYyUN2mqJkXQ#Dv>rsDi zZW4`+qKVjzO%S#p)9FS`3Y@UrL^UNSu?dL)oB9QH*+yw56Ls{AEhAV>e_s7@RaWSQ)I1>J6R zKj&!c1&a~3hejB8NjB|u3HJ_013avrWAjlATK3^O^Hp=#gJp$saK${sOF+>OQ6?AN zH{^%Uf?QUzLSV(+@qt|rk==9vL);5Piw#BXf`bpW^Key%s0|!Lvc;jYLWctcJ6rBz zxg*Z%B%4tiPY%X!m__}M1`s)WOq2lSOyuk_7y`l!J5Gw|{ydH`@iYYO31=ZTI1G1| zXM%Qnn5aM=dISV*c)nHvit(0D%@-cWCtdm)heO{JWNpuI*}VlAL0-sOmKiSW6$X&& z!xcI`g*%D|c{@!u=uSNi6!0{J?HOkwR$xItdmwBrXSH@wkhili4*+WZOG~C8Z+$A- zDahM7Ou6N+p*!y~+^Z4{dmwBr7c>hLWd#wUU$5Xs;4A1ts)}3iDqTMgKEtj#Yl}(#8fJm=N!#nrB5ZtBG|&@i zTckCGNZTSP1}-%hYso~~hDF*XX?p_#p7H35EWetl^-Zd^AZ>5CsxY`Zs-PonmsOX2 za~m_Cw}o|KHALUs!A-^;BwFDVxAt9OMUuAn$jkx>K<^O%Wldx4L4iDxgHP5j*3N^z zJ-}t)LEq}t7J2}oAK2_{S#3KH@K%Bgz&(gdaO&F`F8gT@Z4FG1sW&)F+v*uRr~XRy zcpzTv(Hz6Wy~WE-&Yb`?f%15`w?q^N8eBqJhUz7Ukt7fIHcX#4obo{3Cf5;4qHsV} zM(PDeksy!uHcFp2n(}zGw|=B$9BCP=mmEiuJlfkhecpJ=MPK897X6}^oJ^8D+S_D(-W1B?(cZF1OCD)qddaCI33mu(sy=TT z8drKuP8*sq-zZAV>DoJv8h*Y;cfaEm< zk~?kZC|BoHoJQr05ON}CCCyC(fby?yQj*X8<~e(f4@5D^=g!d=o9k9gI!VmcOa101 zB}v{qC=V9Or9XtB9vUtZB%eE9uV;aq9?9o+Krzxokec z)~C6hBEKC+eLO~fYxIh29BvqFWub*0=x;iR% zNegMA0L}MC<%YHt777CemD_^OP6f)yZ>OCW0B29*ay$*4d&XIam9|E;JkYt8vs!mi z_zqDkE{Fcy0&U@!zy8Os*=beU8+w)NAjoxk9Ry6tov~qg)3p%|RNWRCW zOHMtkupJuUVWFPovQ|^EP*1sx0ngo!^AvgeUV-lN>D{X?OHE&eB@gtj<(g)RLcm>v zB_0Cqx|U2K;4)sdBLv)T39XATLbyLfF$ozJodQfne%5p9@v%SD!CvX4`yRVmgK$7rzP#);>9#S4Bc$;<* zS~}nWEsyk)k4cipcYCbQE2TWn`lgVU^`s>sNXI}A5xe=t@c3>+^m#)mk5j>6Z;QG# z!~t~~u9qA^l03fK2z}m2%H#a-VA3*!w2anEjv+}N-))ROZ!G0;()c=Q3GOKBGF~q^ zfh2i+w+Z^ZiIm5g!niMq@*YDcqo5CD3@e(s=ip7TQNySrv=f% zy_C*&itY9*>%Vg+A?R{ryUh_AC4)UD=ArOOTM%tdGLIC|gLxhj zpN5;B?<~ZwcERN3!Nb_HfZD8a(+h%#n_j3T6F2=`SHVqx(+#*ozow7P?j}j&#i+YC zZu((2(Yz(-P4LRB-n-&-X%NMETShe%IP6{2)P30=oA|D@upHI%MoV8ImFYo5OILeO zSjY$>TKacaU!=U}k(OTJlE{OE({s4$`$Ex5Ts_WBuhM#kxan0v#7(bumHzR4w7@;+ z8(aLoeAGLFymQkb9|%ipf{2@bg-+K75jP#S&S?Tq&vodDr{Sm9Qz7276Fw6B^afl4 z@Y9x!T0Zp%?xK;| z=uRHt?GKl^3Eg2%M^PPgL9^9XN$IxV2v{tS9L z(t4Y-5Zl`W)$+hvTefSxKoQ=y2T_E#9a=I)cPEd}2k*mx@bz3d6Xb83Ik(=pWtsDXS)F71uJ^~6*k)Y?Hz^+8zXO!XlxnV9OP zeI!$TIOu7Z>LV`0jsFe9o|x*RngwF2j|K^*`k0nVO!e}AgQ*s6K8}0UW5Bn!Kb8G@ z0{4P9x_arSqF?iHFL1j0IGyHWAYl<-*hyz~F>p`95CFE`Swi_tnkj$|FKF6asMVe# zzNLRA-kVPa5t?SLzmT`>Y1r^aN-zFGRP_w%1{iHR>#Q5=_$9hhM@awprL5LpnC`q0 z()nKsmFJ+66Vj%>;`DqFt=J2_KqlfJiZy#V-`QUZnT@*gzs?j_jVrX&GfxMaM$&ipoj`^Lb^zw zS4?@FknV}%&@za$+|*0nB1uk2-_qyZraTbRY%giKL|X3ZCGU|WXQc1x^X^j~XQbO$ zMO{9|0r>c#Ub2KFIU`-7&wE69oRMBeT6U6_QoUrnN$fAl8R>YF4#y`@9%rO$s-i9} za6ny#>LrJfBxj_D>GOtD9%rN{kd{THWu#tm6iISMdXzqIH05zd`Y~y#ZWDDGtCt){ zlAMtqr_UQtd7P2{7R7O;$KU`)dZJ!3kt8`Io#>Va2%Y$l+%{4lvSMC55yM$qp_k+) z48%N%6d6$pQj&abX$SHa334%BZzPZ&$um#Z>zU%FNAk>zoO&eByw9me^2|)HXR4bX z$un0Qpw&n6%xwnP`NkvRKj6Xj#9BM$2RSRuF#Qb@w#+0;8lgPXM1=AzEtv@Af*<6g zZMI3E;c~;xrHJx!OScr0caC|+Krs=enuufGj#JDvX)JCeo^~+}?RjCpk}5pGFf;#Z zdK#{Ij2ijZKi3Vl^&>H>x=g#X(OyFnl@HyoM^l zQBRX0Xod%>*|Jt^28ESdi$3K0j9eZf&8-qfiK*I{cVskb=t{6H|r^E_d9ijxC#rc6i{d%_p?-6kIMQ z(N5cypbry+Zm= z6WD4z9TwsMa{HnliCm%re3{-Ul6*vmYH&YAfvfrg*Qfwrk=F$xKyTmBVKfye))%-z z1^D8-Y?92U!+k1nTVLP~72xaa;${d79qI5T4ye+7eSrs5fG?>_Bgu_)I7S5?=?grj z0(|wHWu~yum=15@01F8Sm*(cqJtSBFbiPn7fh1?qVJ#IHt}ifx3h*^?#UvRzOHje1 z+$4cxw@4g&@FDB}#lT9HsGt$)PCUzgLfH>Qf~17UxM=~v9qU$1I#Z0*OO11rl05Mh zC=V9OC7!j+1`HMnk`kVv*E7*gkEDdVqZsLtcs3phW}!#2ze&L?`^$lUvTsxDf#O*) zDOk86m&^SABJ4@#_ZMjK?wK5%DyGTF!NmMF$0?@lDJ*R%9#V;2?183aQpPEveyKp# zPb`2-OO=md7VH(*nx|41XtCSE(*#JG7A$-x!lsw4@N^`WAHQuz*&;JgeQ)INj$cI! zX9f%M*D_11h;W`zW(5-oJlm;`HJO9?OGg5KGDniYDZ$=J;B|9^rPN>|fzQ)vS}>8o zzmf&skKfD%#fvp>iF0Mo&4Jc3IMy;(t0aYJn~O^bJZt_V zL36Cw1W;=YallLYm?Mm9TIMQK0vn!qVDoaVI7Mpfvd~VE+R|}Fz45W z{_Zlz`q0P@ zm;6k~d!m2MYqZ8wfVSer;`OQK5v3JZqE^cWO*3)38_;yl z?QYbPiQ7$Cs)2K~8}PNK$* zsoe!Q6*yenU}72EUZ*NnxDsPbw+t?9m2BQVsPF(i`^OKg7OJ(5h~1x8i8s|;G4SP9 z9>EUT!u@EWH*$BNL)7j7-7(zbIP9RacDMouQ5N{KoKS6t$`(0<$;}(_yLgT0o5R6G z{2s+A`sRqNw%Fq1DCxQ&ASj!?$^KFZ|4pd#7@i~WkYFEV3O&bh8TeiwC#W|x2KYp< zK%pUdlxzUx%wtKLgJ~=3(0oefNHjlKAW^nA%N_)l@}wR+6p$#qDUcmTI}(lV2@oYPC5CrKW_?Yutk0_E`lZbhUe z58!rFpLdJ$cmTI{n?+rE;DFw}qnEr(lJKTb?&|aIQ6BhVmQGrBla>d1$%iD#1GqiZ z=ao<%58xKFMbxDg4jtj~qL(ZsNqAEzrTV=15CO|MKO7%Y7P13Z-;=m{R0+$3>bQF@ zJgp?S2?IV4Aw`Ib%%vnh9JCdHRwPJ%xCs(I5DAhW9;Vkb+)a=4yBMyQ8sR1-N#j{i z{;^OlN#l|FVx!!ONxzFxda2QFQWANO4xtEcV??HKLO%JYCssLZo17@ehWri6Hjg7C zTJ*N~ZQ@BVK7^vT?b#-$$q7h!n$1flQnlz|Ix)l>>gMb~Vu&D;ElFApD0*8`2m$X& z&IV$porJ{lf%h+Ei~JJe9e6j}NfhQz(by>=#3Ya1DI1%Ngz}hV=CsA~cH%MRiAkQS zwTzhLrn`i>X(0l2hfOC9)K$~bK+loeW;n%|Wp^3>i??@+S$-z2E+>=+(&?-a^1GPr zDwTm!dcTXp-EwfGgm?wp=2Wfv#2&x1M^ry8M6L<^cAxC7UvVKp9hbXd$sDQ^k#%!W zX!^jHS?NA|2nNGk3~RnRuwjm9)o*A9kKi`1Y>|1mEZ$h{APRM@Uj9bSGBsXu- zv{NLvq7$NDw_*^%+k&;ula2cm1EBmxf!kbFO3cG;;bBoAJCY{`%XZXh!NBNn%{-CA zJ3^#0^G=thA5TJ)2V$5No)q)=wUd$%-i7k(+H>+Zmr7xCUStpq&&5>6VfdzVqM7^AOuitn;dya-AcWxe zL1_+v=OD|yIak2%=2#*MrBE+cd^R7`IXP*m5%R|yqq?arvNglhcSf6);@;D{^&Sg=TuW&%`-qK6nCP^NFl6;B0Pm9)BZOR}b%!f}&muwM>3&Fv6A6-^ ze&}WcFucS~kL0Jy1=PN^3#v?dP?2&NPfEhRjodfpYDVNv#5_m$qAw4o!s)8 z^iCea(yI)JE_Z3)&`|ywB2abWHO#12Q~`MHawJeoE|}1 z@Ze-^u0zWcy!3b1<%Bdc)FVR9T?Z0F(;cK##8&qwuZ#I;bSN$9D=m`K@)#tPkBrAU z+XVw(_N|x?qGO4vBEF> zu58f^^au~nHdE6?;n`+lbo20Rv$SLi&z5>u0?XOBSYCj#IYlc&+;pvblABIN8E@S5 zqI;rUX&4#Y?;_^D?73f2J@{Re6RT|wHCMuZ+#=rmmDk-DX68aG=c~`t>2D~pbzsdP zrxsT00Xj`jRkO|yWT(x?(C~tg%?q^F6FHsvKn#h6xC?o#wnb!v-?y_L!p0Ls^}dJF z#$sGzuSB(ZiDrdjwY4h|R+feeG|a}A$nIN)hCU5Jz1&$Xj{h;pJtJfe7}L>q9;Yos zs{zGn%YY@$QU6YwI7j{X5gPaeN8R+XY~Tu*@c@XEc9fZzh@zhTShQ{xTF2M+t#+A+ zFU5VLTidt1R2p!gN*;i(Wmg#kf}EaGa{yn?x;9jD(@T8@P$-&pxCT$dO|N&>2;H|H z!`w3v7C;{(9JI7$qt<;CrEOym|>SBqyZL==07}9w(&D6-8Yd;DEZE(@UNwNlr+g*XLcJJWfdeOj@Rs zmP>lc%OuGO>C5`OE0o6x>1(9LRA~Swq_62EuahJvq_6AqiYSj0(nW50fQLB*pnVEU z*m$V^AjgH3m0~wx49Xj%$cR!-LK=y>p?lL!O0v`?P#!FbNdO&Nc|eUgkst}_+j>2B z-1JC7`YRM8JrY1CBH;z0M{>{i^m^{Q>5-`VKA~#U1Cc3E@{%e8Ja{zcSCKQ}L(GI# zY*A0*XysIyc|Jf12Ey$WAtw4q1ftoD2sxuYM#9r9>no*N@uzoD1ZHOs%lg>MRmH3s zZ)SZ?1LK;-M+ZX;G0zERfvrtLM6zgJzeqIiiIsh6kpn2|+)%SeByBi5uqrE!9Keaq zVP;y{*RYzf{QofaTtNguZL=6-Y@0NjCNEu*Cedj6ZPO$s#W3lXR6fzW5)eH=)Ch_UuLA96hmB&oU;mT z%m#+KB*5b(xlM6t&iSQiJt>C41K^x14e=Q6bDK(uj-xzuBk(|oX}%rJmPVrQw7)Oa zFW9;XI&ZVTPsKOkCJIlT_Vwj8(VZEE=jVW(U87kqej*CX+$1KhE8-whVqn6E>Bx)G z{u%3X#K^93mO7!7TgCD_GagTujtKc7R`)2)Rki(m>Hbj{#G*?!`}tIOQyz7Oi&C{YQMmHmrrPvGI27!1rALHJ64Ug$c4&sT%x*s);g8Ai1~_H+6w9t8pPS+m zZh5L-%{@|6fm?3XT)TA|ri=}8PASGpWa$=aIjuQ+bp~D`qLx4Sg&x{W*sMyC|W9YCcS51frGunK;TZw+cQdO8NFP+{e`}+0)nk**MB7w+1--Q;FtKTTui~d96!0 z<#pl-;*@LumSNiCxFAe+gUi4p8%2`#@O2T%ALTMy8f-BeY?TJIU9UhSFUh6mb8KOU z*`Pog(9S#$L;%P?l#5py>^2+hkp{F0FIyzH%H^Ci*l#vCAPs20UF`F0p^aSL!v%vb zG#eb22DG&$sG+f`Q0 zXzrsnSjy}u-EcLn4Zlj)@YX$?;0K1n>t4qv=#y`wLT-pE`eZ%Q7OE=nx^3F(W#A^3 z^|ts&lpO|5Ys;o?;d6v^$7-|O-WKqww!W;F#XBgdJXhOY|L9^~!MbF#f6iSd&aDiSC}D(VyH$ci(T;?SWaF=m&RVs7BY4t1U5<0jVp=DwbSr zDV{jV)z%}_$LK!!YFq?ov zi+U^=eww?b`m!$C_NZF@4kNJPbKU(cdy=iKUnql8SAVNmvbAOZE{?Oc&G`eSL3e?ft=_j@+#}`bVBQLqa9UVWh|($dUg#%Zz|t1H{5T*^Excp1UaaFud{^_Pzcu6J<=MUWN8~2Dp}f6 z{hBU8Q$_kV`cK+V3iH5$zE$1-#I{C-N`S*`xg8xU^z9h2L67u{H(;XzeLMaQZDTB+ zq%D10twBOWZEFO=-n!o8SvEdY*xL`@)E-R3fUB}QF5Ta&tT*99o858h=9@gO3=E_p zRv)VaLf%e*AtG-liXwX4Ti(L(Dv-D3Z|UJp3biF~-TS~le$7hVQVE*`dl472rQ%Z|7jP(BaRSenmgL14Tw)@vL|B*yiG0abj;D z`7;~JLf?tKeO_*}Lv_r;Jim$T|APsem<9KImH|kW1Z?xsJ0fuB{6+g^0d#}FeJmJZ zn&&?+^jS*%D-7A}X;ZKLmHWB~%VTVSQ-r?F3Dxv%%TAzgM*&^X(He^}4T!#7B7Lmk zp$egIm%z7_er>6)(&^W#eHceu+m?kg1PxiP2M2sp@?l&%K+hGS3_X9DD>Zk_cz;tTO9XOC5OI)XuD=F)mQD))ZVPf|QkQomsbD z>L@GQH=<>rXxV5=ZW2k#%C^a@+bngIm90p$l!=zDrsOt}q^xY)%)0GTM_JiAe9R;I z0vC*^z?9r6l9ZKgr&+g4>L@E)o@gl)EqhGKy&_3j+4h=s`=k!Et$Ml(_vI~I(3b*mHOxaT zfYr^Gk}#ZQKfzLE1Bu-w zGC(WaS_!^ibP`CZRV>-oUinuXodnYM-}v}d;AFr4x8`K8qVG-{?za4!hj$IGL%K9| zTW+rda^WP9kQ>rd##8@6PmPUsAOA;NxQXtexgF?LEB?b4ZsGe#?CW{Cy$uxf!*`#D z-0}P3n@{8H4gtCAmzVD&kJcEyqZ*wQ@ngA@}@^+kJ)s1S4Se z!)JO9+z)joU=M%B14s-L0ygAxwwsibG%T*9T4;|jj*kJv0&U$RtZE!=PiaJc?fhlj z>l{Ag9tjF){g-U3cbF=DE+M+6U+n&u=)DaC>+Z`k_;^Z&wZ37(#18&Se?0qzIWn>8 z=vQp5f0*pB8{jwB`D>Un*x12eYiA{gIkK^;_-j@fit6L5{#6+W=NrHieZP8OA6%G}WgHLr;Z!fRrmzv*rKQK314XHq@-UoB-?p zV|$~*WY=A?+>VA$fa1_GVhD2!hQ`2pRruMlzDBCs|KMXAe%3wC8kl5S8wc~i%dYWO zF%z|^-^R(2AZcM$;b+tRcJF-)yEgo+JHs*{iPkd0IMLb!t5g!LC4LvD6Rl0edkPd? zk)Vz8YTr)6D`7*>wtg@!Ty^uZZztoGpxt=0gz6iI~9g1PYy9Hu*o#2 zbpXDGW`i(XO!{R+;>Ot7fgnK0)>&HnHM_j(q(N!09YpG_70BfJ_6oK?FYwIk+) z*;2Dz9)cq>e`J-JP>EOvbx3aKh6zZnoh2rgGfY+!dd5BbF#XM(?9rag$Xvk$8eQ*+abU%l9X(1xmmYD>WIBf7cI*~%Sux+Pb4YXTAo>#FLgxehW6#Y zw7>;@S#3(L5lKq6w#KYmD|N*4b{8#UMaz0qa)U@xvb7Cn-A1V+^0!#D)au85*=$N~ z5lKq6w#BU5Ds{vNcSduN)ZdGi?WW`okwol*XNOr=Aaz6&Zx<~WM9VHya<@oQvbEi2 z-5#kU?)c^Y+?NkXh@JAqZq5iq+?ig7C`+erWt0B6@Jt5}kUTftU=Iu6jaU}U+@i5 zT^@{O(}p>AU9^TFnb$l+gsU8)M{^l#US<2_iv4De4uKgvrntm1BTR7#zU=_du2QR5 znBvYuHB)>A6UmNf>UkZ(aTLW5nmtzw~&yAK0}%z0Gq2&S&cBhMb8C&*oRhj`>N zONH>rp(B~5EXQyV&Y(Jt)RW;Jo{>W=u$nWHJ#t@AbV#Dx7yN#IB*tUIC%cna#tLWf zB)NrGUY@Fdg!WLabHTj_gXtQNKkz`)Cx83E1K9QZ2dp4H{f0sn4B61i?p~H5$;8&n z%@Etw+bWh!Y$-}l#XfF_Ol%jG{$E00)pccDlpUT{?MAU5`niQxPLSLFP)U&uPmk8F z9N=agU6EJ*e6)Tx$!-T;IjI>y#Ol^7JG0AAj^iPYfDK}o z-;>*s&uRdoHhsmLHoa9lP43(8r&Qtsr zwoQfw8_wB1)v_RY)TZK%0-knFvx+5;T8Ald$fH)oXu7&*I%Wrv&ND=)hKDMIbe`cB z(s`z?(xmhDSxh?5atrA^TWbd}%AL)m^BlL3&Y4m}q;sa*0M&D)j!5T^<}jQ}zy)A6 z+mxIql0-VsGwbF{9i0WTO|+aBEelP_MIuS8^CGh@N9u@mZkx${c^?<_Wr-=dR3wRY zUTW4YlR9FZGeyfL(Xzsn%oRyuopa5)l~PBnbM##9%L}-mFZrhADv>1Cd6ikWTIz^( z9xPgBik7veMg)A0S$` znv&Z@l33?$X5DtFBi8u{nj=_aN011xb%|!36Yr_Vvw??8{4iRzN5Q*XpjqdgL9Ovs z+$9ETK#h-eMxilncLzynDtd)axu&A`n9cSEHPgWwdrhf*K~kEZesZ2Q6pgJrqQJ$S z)Kv5Vyrx7&x1F!Qln1f4*GI}yGu83W3?Oib?P;KW2y34s&{l=>dATce3o~7F0pA|R zx0E6?j))?nt~?8X@Xg2!^S}Q`eezgzkK#k`0J&X7;t?x3+_43WvX0^V*7n;guE6de zM;TCeMP|CqBF!70K;NC1=`o9VJSX8vVy4&2?J2h~)2Drg)cr+RdJSg!sT^(L3_i_H z%ye=NTR4l)DlyZG<@TIgnCbIAhp4uT!8;=bT$jcAOMC%Z1Aw&qqU94w0e2D4jZ(l} zvWg`ITFSn&`i4YFG5~$}2 zdR~<%;j7Y!80wbGIZF5%9t52Ra@`t~WP-a62uRVwH~bB@F2@70m*f^6u0zzYnzMojc^j^!Y;bq{=33^$Trj*=opSY)x{KGrX?NXa8oKe>t>+^>!h)$hq|f9Ry>jRDeYnqt*fW0Yp}hWQ&Q*(Z+&k_@vpyYVQX!!^(v zjBLl7u$q6PZ(FUI>A`iXl9OUcptT|BvIFvV4YjOE;<(tgadZ%RiYi?h*C6NP7r%R> zy2@IwC-^Wt8(VJr!g}q_;dPw3>9;npJ4e(JZrY1mSQ@FioQ|unI8$7zuhS}f1E!x5 z&{4EOTTxKq0IFT1tnmmB{q{y4&uF%yQ^gf-(&HI}@i=kPZ*1o7jg{_kslbnv+qWd_$jx#y^!xr{L8eSbDr)S_6o=Dey`Zzibc z>|}y^B76;k+C51|Y^8&nR7Z&F$lXj-Pgd^b({(DiDI$p-cb+MA7*MNpNC7|1*v;Xs z)9M)DWV*DVO?Jm10?Bf@MC{=Pv&;swr2*}y>j)7v_);$YrNLaYL6$V2t#kPzc~~yD zrNMl&!2)SOyX0E$Wee@(@+mF|(akX%ES3heA#Q?5u8_+CX|T*}uv{9@-Z%F?w$M^8 zf5HV8R+EHK~fr|7Sxf%X*;=+UVM%)(uBM>e?+vti)*@5An*eM;3sR%m1sX(hli`V=ultRY{()3I-&=B1O=55!$*BK)tn<(y={nLSCM6oiQ&|v0=_X!1XHN7N42%%7^6KOd_ru9 zLr=h40WelY6|oaf;wcj!{D$0~sv~^x>A#Q{f z$)Xl>j0bV9j^5Gs@(DeP^XMM1YNc7!E=b3OM7w}bHOOGK{REHYBIY>lZ7ahqJ`tB> zGSb-`p_c=jUB>fqB89&{$*PJm3jkL`N__3q){}TlcBF8rHAFd|qZA$mY7M>OYl?|@ z1wEZv>9NpPeNEKiQ?O>o3}3UX2{U{RiUDX{*R5h)Ql@rmA~q^y9pPd4z3nm7>|ZVpgW;UCcAvxMb#!$DL)v zWrAYWM%==1xjf{oX5ZEfx#v@+s+|MKG&jSUQ2M@49%H_b3Fr`n;YzHlQM_!Bn{bXN zaZ+8vwu4pY^Kp^|zDM1vh$mao^>6;t-5ob$Jk4CtrH)m9=*U0=v`NJT$C`w z6{w_7-KxOczJX2pqW2CkS0!9zOa1CH!8}dw`q$OF;|BQDsMun-+1wpx(j3V?dAK>b zt|R7k4P-(5cSUy0mFW33xNcQ;%?e^j_Iy;hixYb@r=9O18$vgu3fq*MXmORpD0j?TZ*AW!E zQY|yGo38XKyGrTa5-4_$5?#|76j%3*!sH~Ld9<`dbf-qh)jgwOXl+8g8hVHKY$H;G zV>!z1uxG~BWr$pRoHhwmHLfn7+o5*cibztt!Z6%`Rk#g?KbW?JMNK($W8D`x~ zsiT~2AEP+{`VXRIwkbJBBq?Xx9J4M{>L_R14$*Q^v}Bo**&<0f+p^8Nc~VC?+g`cH zed&Y?yt}}ZTqu&1vu&YSw@B(JXIqwN*&cBUvp`v9rE})k4f+T_37Yk~CYy;tNBWxpIwA6r*56X{h93NSW z?*+7v^u$ND=6k{Hp4CAX0QJ`dX%QelGTG81kbPv9rA0Hy>r5@{gR}^YA9=^pq6y?C z)#4*v+!>9{H`Wyb`H|}JlG|q!mU9rumF8>P%;p%(cc~ulw7G9)^?1s;vjyJ`ifZ16 zTYNaT%CbsOJ!G5cA^te@LFh60WA(~|@sitTdtFCZ?%E-Px5(nT55`mGqJp{-pRwa- zdT={YP&p>wXP6LtKb8a%q)@FBS0usv2M$hYr!_Ne@a;&FCGL|n~~y*`y{ zYmNAyPTsc9CkylY@QHTfmEZe0o8OPGDR^b~0n5B3Z#z&|@=hESbpmq^!T|v6L^8K} zNc;5=Oa!2FccG<6NajK;xI{7^wu*&hUinbGY+5{muS?}5^U=Uw9L1t<1KPVh98YNn zil7kuviq22P?ESEtE-c^9rvkHSs|D)6*m4I3(+Gx0nbnpx09A8N#b@A&x?|{owAB0 ziCfoNdPJx35puxjt}|8}N#a&gD_#y5Ig2(SCYr= zf{a-I@Tlv|G$+?)OBbP)nC8W}mOOFOR^-E{!st`f@& zlFV(Wi(j`=yr7iK?TXl-SNiKv*f42jl@Y3KT*aeyMBT1ymKE6!=njh~#`C%?9)!Bp zM`8NKzJU=}C866*U)S(%-NeLqfZgg&7<=*-oIodzJnH7#+n70p34?2j7GjjQyD>nM zQBJL+$9LBmV7tn!(FuF}bshF$IiM142fXJu(XnoPh3$Zeb+v{27`OwJb|u!+KOKZI zF0RWKlIrRGfZZBs=k=(^Y;mPvx+m+iemm521kiw?0X`FW$^#(e#2tq>Vm-;| z8tnwkYNS0f5N#?)%!2~W465gdnAIDRY-TXb5RDusw?pdbjet+b#y|A)EsT{_o7nhg zAECb`3?rqUq;4C=rebR7)NRAyd`jImT#BvKZC#tjCn3Ih1U!eM?LtOMEm&mbX%WF7<(ww!thzqo& znUd)uNqO7S&AJS!Bl3BOXqhEiCYq9yM3VBhO)~2yOC2%N_eD$OFSsvLP048@NqO6* znRU~pj%ezy(HwqB7A-SP$yp*vdD~{0b+e_8xa*^$<*sPSG$rSXBtkJfbIrOesUt%B z?O$?VKF0;#oo7nU7fH(7Hs7pUAa%rYuM{nZa6#U-MW$qqNFo%&lVjE`mO7%o7YEe= zL>Fr6`{F(I(WCK^?-u&;vS&$Cu=wA1^h6HbPc$B}3>RAIE2; z0w13FxLylav4dF`r-+_sI5amRkjVTmu}JLJO2qR&^Fr! z)x#}#McYu1X>j*Os|S+KZDT!2=eEf|K+lu$u`SK5gT&VOV^cT#q_JvmuICK9w?E0o zx4?~n#;Qziw_;5M6&|`RP|Y?JR+iswdtig@7?Bg+&TAQ88wn$}wPgPm)DwKYQ<@9D z-ieU|UpH3DB>Z;y#8lQ(@&4_F7oOt5?8Xx&Et8eKKZ*wq);qK)ut^b`IG}3RF&4Dqp;gJR8}^bW`V7E6o$hQiN&%Mb4& zJVIxOD7n2v3Iy z&8qAlyefSnBP@OE3n?vOivO~q~CR+GY3F>SS9?_%~l z>>qTMS=xoK9@3WmS}qt{6}Huby9Xd!d4{+9{w}q88H2Oos@;k8^^Xb3@RnGgp|>l^ zDwYgy*)PZI3~xOk-~_w7d)QGumFImBBowj{(u?)*w=niqbivq4*x^;}liu|mVYaJ} z)fXYASH8->7yGi6oS{ri_Y*TE47RI#`qdX=y1%qU0H_an_pi^$TYdN^o=pSl3o*S( zZj_&$-;%P_W!1_W;r^)T0`a((%7PUl5A9;h(*&SSf&W6@Ez)Xrr5-FWx)(w+7 zBBk5E$yz?c1zJX!k|RZuNa>MgU8>X(DV-}?4vLmhrsQamBvN{`SvN-Nh?IWnE$+)3 zxS%iNOv&*gNu>06vo1~Qh?GtfElWj9hABBgB#D%sVAf5PIwGZA?YJ*b;DWwPHYKNs zB$3in%(|&kN2GK&(K1G~OgANGh$NBHGt9b~Qb(lpWziDSp8GP}l$;}yL`u&w>oTQ| zNa>Hz9KS3QaH-$HlNBThJe_!74iXu9zalA}Em~?o$VW=6^H5Za3v?(+=-VKaxj@s> z^Mh;vhA#-xqvM_5Lo?B%LrJ=!;9b_EiRneAo}3^(I=&>wlv*4lrRnNRQ0`*o8agk* zTM6hKx|F3g6|uB_)hO#_zDBB5N36W|`RL+1@(aJbK2z3VE2Ll6K_e?<&0^|0SMM9Pd~4xq{}4<6jAhhj zYoU9MH6lq$w+1dH#JkoiX7*Zj{XflyuEWY#8H8T%GYjax9wV`V(C)v)(;+7t>I+-F z(K07&^~U-VTC(FWdc2!3Ud>dO|3$lTGc*S<)vhg;4#`UQ@n88PxV1iGXEo=qTGcju ziYnhzxLwA8r-QL5zs6bH9eNPW) z7o0%^^=?a(5Y)TzNQj``V-*WQ{qpo zTK5S&Rc9{xq}6@lqK|&W*y5Cog1P7?J8Ku7#)zx3gYb;MYe}6k<7{>istuia#+}8u z>2Q&ARxcz!-8opI2*VQx6$P9=xs1uR_*_;Efk|q4urIt`**fbQlDcx3gxb}zUHIf`b0bM3Z6t&HV$6( zcWJ^W=#tIGL3Q>MHhB&692*A1u3HY21a;Tt`EgA14ZpT_|AIDym;T{jdVn{f$|0s% z9sUqj5ol0cL|_X+Zk|3q__tlf%0VYlkz@Hsa(3%VMCcK$JtpPV@iGdnW1K6th+_64A8h_^b^l0jK zj;SXzNROs&L*lIdXzI2V3Vy?uGd6k$qw!}pW;o%`d0eUS=e!1tKP&RLKg8=b zV}665;BVE@cwRLYG>{;PN4)%AE>uZ_@#~n7X6Pa@hp!kGjYSQr#^dJr8mS>(tN}JW zu6wZz(n|lfxB-Ju*AlB((!aSA;wk-G==b=xm>jNp<@?PgaO!Wt5Xeoa0j>JIn#E!&OLO8cHoKGK+OD;1V_;Z7Gz+Y@zGiQ~PEY=CuPctMYoXnr%H9cI}al6L?gSy>u`3HmF*fw|)MRe$xxx zvDrGOa(eMd_cst$_5e2l)hw*+0ayaI3_U2CfUD(;Q<$)1^gt`B#h z5H0~T8+O?0faH2REaT_E<0F23MZ zl}gW9XZ(h@_lIE{s@8qhvLLzM&Nkp&Z|AI1$@SK8K>X*`F>6;0gkLMrw3i2J zzh1!fcc5w2+k@Dz7qNN(eySgE%Ka`5U@d_o-5xzquLGSUSE}2$8_yAe;0~}q6-FH8=azk za~T?JY60SVPZS0zFl_im&-F74j~-EEP{j zbKJpWpfqr!MzJ1%=dSVJsp!%1bTUVoYJK{e&I0#^6qPIYf8(DBxhEbWj&}BFrtI#U zNFcExBV9@Ym)OvNr%6%=;x=^* zi6rHK>u1*WmpaM;S0q}>L`$+MIZz}i2i!ojZjjVb4!90uc|>2}f)NcdC5MV6<$xP% z)}=@t<$%i*Erp_GxG6b8Bq;~n2(xaa)KLz&r^j($-ogcaQKsZ5kwhGXXOvktTIwhV zT!v^_E?UN#lH){@a=?u<>&8nR<$wzt&wY6k7iswO{pnCQkvm?D-GD0 zm1{8F6$P!iK$E%COg+^X;qXKU%;uiW;U!Efjf)U@;`~n)3GMo61eW! zV%$m$H@hLjYS$dASQ5h}WoR-jv!O#`xWWv*h|O*2%-*({z>8Q`Lt$?}liTcu!rp!{ zQG=6tD5#vho$nvt%86K2?bzD|)-Z&b2+l5xKu(vNy(xY3{u=4$YIexQQlVH|n zKcIWDrC$=oEpEsN+qJ|hmPBz+PmY%(MV4Z`n!VjTS-Wu=d=$Xms+cK^>7JUxm=47H zB>HFIkHB=_Ptk76ZCDlNcBS;6IKFLD(0?21)}3c{RIFgQ72AB80AIG@MR^8Jt3cqcn5CVz9rMD8z>S{G26r@M(5>E-+XCn$ zu)R|Z3E18V?*eRBWOHAdqYdrC19oI{Rr(w@wHvQK1wL$%+dT~>AKczRQ+qM~s<65H ze2vuGnQ*BMo9o`sGWZ=K`QY}$8DMo?2drXdbyY!Tyd;D>i2m3ngc~2qQ%2K9R+@hoO_`+#}Lmnq!x;(A{82tr}-*3r8`0Cp!1XY*ty+km=l+a(Aqu z&INbeX8|+gI37n;DBTmjM(XPY=#~wo>pp3@OLD=T#47-7?K))@OD?$51$qTM4bzq9 zf;;0gjNYDsN+*hU)I^7;NOE91YwZ~WSM%;yftV?OtA9`m_3OlWXZ+7h4JDxY!G zo45ee-8Lofh$P}3Ja^2xyHZCaZ@Oq%CR)l($$KJ6$=~job@!!?nBUM<+?N)(pf5?` z2F&jf&OZSV_u%Pa*7cM+qJz7Oma(Fxw<+02Bq{k@AG5Bn)DcHqELv)<=DzedB?pKk zC4U=W)+I|F5yzd;99;JIqGgaNIankq`P*Q#Ziv(oo4j4LTo5fOrsOb@q~veI%(~%H zM-=nRYq&2T-~#WCG$m6-5^)cnRI^S=9r4a{(Hy+M{n^jjAW^Qg_$HH>y?U z$Iq(CT3}T!(7f}QpwPZXIqk|#ROsVuB zDNRO~L-}u5xhA7C%w`jUnrSk6Lb&YR3tg`lj)~!nqbp7RHi@-q_IgtIPjS<8*7I^V zIb68ugK|41T#hA~DvIQzJQamii7%e!YotEhfQ8GBm!2-;wRq|2;lfMLu!@D3KDvQ< z>BAfGTc83j?b@UX<5}pt6EFSwCLZ2wc#?SOQF1#cT#~3SxZ9-3t(<9pkgrCyGQ0hZdm!WxYvfLnplPy)DIe}l9gcqleZwR@%2R1(0g#0((Dx@CcW zQS$JBofzwG1w6=n_>>aBt@4|@R{(Pcd);!U_SxjwU`5x z0B)Vn0-o@?@T#%c>wS$>+g<3E4U6sGV0l3jz-I1CwqvgMTNZ@5-XG4)^#Q9?nCm77z+Cf~58_?5 z%>=jnkoM~#ybDhBbyOkywGi(D(bsRt?O{wLI;G@@ue+GIM_>pr+YFn?F4Sg@LWcvU zb`@E@msD^uhb4q3Trf3~6zSLYIBYnP)R9NIt0&MmI-2C9uWxF_QMl3|s4pJX-8zNk z&WWIISHvn$LnRT^337WTTpvwxR!n3h?m}FIdgXNdvk%kX%t?1U&7Aak_?9xiU627< zncpsiOZ4!?GaNm95w5|0z1o*V3j6gum%=6M+c#(9DeGIpSq4tUCM+nC7Q{@Kn02L6 zN5_+FLvv_3FIujelGj9%sOf8F-F2xWYP#(?*780s0C6`>$y*{x)buU0?zYqsHJvG1 zHi?$Irev8&5;a|B)|E>gQPa`qxi2r^g1+20B@-hUt`jw#7-2y9B&j26da!7jDO!4( zlD$NdsOes2U2mx)YWkjNX>@`6($|#iCz3=>_cQDIOC3?uU!ggk(E!nsY)TFkNus6) znstMuj;QG)qU8=QzXD}%N)8oCqNaxi)d59k0X~;LRx`YP9wxELO{Yl18YJb*S(g%| z0#JHbkd)@8XI%u8=4LvkV+RUabAhIzN0@p>2IbfZg_9!*2Pi~`Z4X=r8Y85N{Q z)6o5WdNd84c`2UGCrP}FZ&`&cc-fcrLNPYtCt$LBoLI6r=W!9jIghuBg>!zpSby!( zA{Z)Hnk+e;+v|j@=@HH}bgdFzsxl&khJFsW_+Q!tHK80Iz?c@_6^2d}Rrsi3v7Q)F z6*_v7uZbE|iZ#@Rj&@D9Mks0Nib{Fuo)RHx=~`aVEB90sAgJRfPqv=sH`nb7%-PV; zuIZLJrlD2A6*e~`g3$CA>dUL~k_~Gn#s~V@22RfsBl3%77TgsGr!QY+FV4oJroDKP z*Z6i$guv*`z^0iIRmplWH?Yav2uEb?%Cg2Ksp?9v#nYi&(bp|HdLDXeOGm$XQ_s)& z5wamK<0iA}nKzkLU#L13gH@*x4|VsZei)1JFr299w{G#6b1;F4ie4-OASje}3(v%c zigqut`Yt)>a1bVk6n}7An_G&WRZdAS^IOWi4NEqZw0pT_N%GGvhhpGq*9xmx^3Oee zN55sccwubm=;S-vX)7^LoapF_ci0no5kf~t+~wPR=%gKa+wbbpt-|a8YOXZf+-e!0 zOuW^YJ%EcVVoB|Guhs={LL z@-^)You-Gdf^h%bUy)a!li@nch7>oQqsI)=cU4G`J zEIa$55CnGE0n4Byojbq_hE6(n(5FsC{~Y76A+ueFtoD+0Zs^awaqy4m1{G@#9R6GU=_Tn!SKc1Me^Jzo7mN zyp*eHq;fa+Hc;Cdc-=tQMGd^co8&?~n^r4#L$Bm_Q;irD2k^l)Jvpn@`wdxRVnZ*b zbQ|4>A}i{vwGF+eco<_Ese%PBhqta3Q_B;`0oU^E=o6e@Vr<|b#zN1_--g$z9rK9C zk82;HELnHO)U@9aweHY%keoUyxA8Q=y$*qugVw#LvaL2SpLjL+AB*Hw?mHJgS3tpT7FFt~!ru}%co@dW3^_v*}c4aprh*@9# zH^%!OI=CeUO8vZSeNT^`>TZno<@`pH4#JNo8+fkvP`{65qo2icCl^X5Gh?}v`LW*E zR)H}L4L!?NK4cuAlj9pOKD9Y;8IWcG3mfj4yHdT_l#O(0$`5aFQ!kyg@k%qi1%cbp zB0N`DtFFy-f0s3q(1t)(wUOuWYPGx>D?8qdm4!CfGa(m`^o?)Be_bag(i0f_8|g_} zZ9b%xfpcLc90U9qfCn3UMy^uxo3oh%&3P{5>(?#%7v3cFJ>wVXd*JS}D9@Q5s^Ay8 z@2l}Hz7y310BNPyJmxhsuvL03vl!BP>VK!8%S?uyh=Aiy`GWuR!eW=dWc zNeTqGZr0t9I^rjbL`#`yxn)Y;7D);OxNX+mkva+l=CtfRiI=SYXgK#a3R-f1G@R=nq~~X^ z#5~|Ry{kGv+_Miv;_uzLD)l9AyM`yY48X2>I7%OQ;ejT&Y{^x3Uh@9_$;sq_yrtV7 zc((cjo^iN&^?~13w@!*3!2RN4&x2vh)MstHk3UR8F%N{DP-EM8ldJt`D!r|@k%(4NR z@kWfDvb>sG)p*7GE+jsD#rtuscRa)OIIF7`qsyNPt?n5i{;Gy4G9nVMS;yb1mpood z!ZI>4{i~Zzs{K|a%6)2NdKTT+R{ka`QbpCO`3&@o@)wSZRGm?%-gwnp3yaZTU-j-3 zXc<|xaEh_wDxo>XM*aj(tXBMve{_zElyHjkayvd!!YR^3kzlnn6jmjiBHh8?6lK^U)1v`QCuX>$z&&Cs^Xo@+OcO;r(PNb%R165>3+D22f z_>=zb&y95CeAU1|vAHa$plFIEa+@7V(G(@sT!Cihp{G>|rkF2{$iuF;ytL(S0Ukxt zcTr*1SR|HWA;vp-%LgtiE!kuF^l~{@#JbsF$Xw%Ls3BwoT={m(y z3~t9mTmp|$EX7j4Iahm_^JDe~gxTA)*IrwOsqYj^k=CA7F2@9*Sc=VZy8;t{VkvTc z7Vvy?BdZomvC`K_wSODkvWun2v%Da&6nT*nOObCCODx5Xx4jZeu?h~ZN-V`{F^xA~ zZS8>9E)exc66&YpN8D>HD-uhw2JWF)inUg;#8PzZsDBcygKunODQ0)H;56owQ!GX8 zci6!jA|;mM1>9o!-l$4{k6-d1zvGoyicOJKi>25s1Ed+*^3U+C|7SrH`dL8d=()F8 zq)Pe#3MA4~FexDRx*EB$i@FB*#(|Sfvt6 z(dsW=9ZRtjZ>nu9#g=!qUw7eMaEhg9`8W3KZoCT=OYy$k?!iQ&Sc<*A?qcHZg&~_* ziu}K6Gy9;!hS@D0^j$=4tMd{{@$`HA%jiI)4y9P}zJ6;D!h};OMT-x(r-#rr3Z*FY zbxm#k0G{;!q<9oRDOA}9x>tv>);WbzeAtOq9)U^i6li*^b4xP z?~mpB_ec9Jn8RiyMSp2ngQTqAAD;d}DlnV@K~nlh$ujh%7B|z86h$a#%>_D=VxXyK zP>>$|qvVNCEj>Dt;%yX&9vw+B#MCo1NRR$eGTNs{M^fZ|>ZM4Ep`YPP7Dy>S1WH-u zf2P-o;f;R+A-hM2B`cC*L}Q7h7-FWhM;s4S8q-EVI2S1{-2qC<&`rc@cO49lEEQXKn=%}r>`amnh3 zueG^}7@vJ4#UwEzKUOBeU4c;g-q-BK$#~QhNzvjPzMaxoAoSG0rc)bNC6Z!VV3TQ$ z9Z|Jwx-~9|q^Q=F=+d00x_b4-zM1H$Z6w79|4+})S&b=@;0TtPB zBIRiN{9A2q9y(ZgK*fB&rQB~}$xnbcBm%tP6f7;UEJ;Ac0w|_{iiK9O1XR58oqpLC z;k^OPU2%Wk*zdIOaxh(-0xHVBV^1t@ECCgd$MNkF=$!rCR8jG7+Yh0CpiuHj_*27y40Tt?lAK3ba#)PL;Ke^l3Scg<>3RJTR53VX96`OsH zRJ-nQy4}XWEiB^;sn~+|hC(W~TE!AlvAw&V&D&tQ@{o${KEnX!+o941cy~?Ye@pFv z!iD$|YT1*BiUM9SbVS8YpEmVW4-CW4>i<%+`p>v_S?wjFBBO_nsMrnll}A+U@mu(@ zCoI@SRP41ZNJPb6ypa@9vCk@&h>H6?DWal?F?n^*eoRq{s5l@(H9S-y5fuj-OGL#t z1NgBY#A-;1I1bD0p~ezXQK+>8F%`m%1k(>o5yAAsjU}Suh!jyoMQJjl!P*1)@;EN| z*Z(mSnH-k}6j9MdB!864XlZcDY;al{P(($6NM4dl%|UG8oY~;KG@ytI4@3a}Ka`7C z8eB3PT$TnDQIRc@Tjg?28kCw1u1EulsE8fR7TU<=JzOy8>t=%+(tsi=Qbcl&TsBIB z+h&71(tsi=stsWaQF3`67g#7a8{Cry6j9MtBnRO_YG+7NoflHi=hCwtX!kr6cn`P0*it-_4EzW zqbc}9K0ShVQ&SL7!D=i9K1z1qT}siPYiP&s9u65S%7{QJ83x#0AqR2naQ$f>66FMXBWjBStkd&`4reTw62(a@ zLWc$RcNhvQKS6JJV3XnKy%S;lr;$9s5%A?Eu#{Fm$i;{ri4xv8)u&Bmj>M8?@WzKn zYTj5yIrGLZq_Uw=QNkPlTW&{3G29IqBNoVumr^+vLxm~rx3SO~0BzmltWL`Dc;oN@ z0dZa9tztPIFGK0COj=Y`;BC6E1Nh3MM>)b<_5LUxM+USKY1~(CCq&5>ypV}LJt}34 z5w=msCTwGp$P*kb9K(e1WIPJ&z6+aTjYk;cDKzI8_lCH9ZP3@Lct#G;*EP*jA!p?k zjMV`i)6vF>G43>u$2S9B1?CN%8E9)J9v*P7NgLN1ZvpoxXWICS@vL_?R1j@E8n<|p z=E$fx3vs5;lqwi+1b~Fw1c1!-$-@nE@me_GURRdo201LRYZ?b|q@{5*NQZR1w1Lqe zjVKxF-1p zAIe~-F2>-2Zq>sR_;v}*P*&olqK4*H)&z_)Fm5E8;zo{5(4$-i8}>-nzck4yc^xM5 z(zGIqvsi@Y`b^*%_3<<;e*OrP<`iKv zWSSn`dZ@60rr?CbRSDGMU#j<}@lV)|Jn03Hs^l4ZXqzxJCqnr44DQxud0Qv}T<8{G zx8V6LXbWUo$pO<_1DkBc8s|h7x0uCF*%l>a@!xQZcXhk&Hf1EPy+d@30OSB+9G&fb z_7VD9@Mr;+Fr=wa`?9&=PF2wKKlN1BGjV@%@8Wipw<4wmzA(F@1e@-bV*01@ZupU~ z=^iN}Y`P~(DCG9@y*0s0?ltklJ`qJq3(r2YZokygA$mjSGw_;?3$z?GB@c-t9in&0 ztSgi{@XDzRSV?1CpyY@tcvJ-G485afU6It$8G7G{mVu(>xG8x;BsiQOW zibPA9XgO_4o)JkpL+^}PcUJ1?480Buc|>2}f)SlJB`=61ouPNZth*?6bcSA@Xekse zmrcoHkwiudPqA57B6XmZ)zgc(FK^+3zFaXSuZkp{p?B4+yC!vXhF*qfS&mEl4xSsP z)EXr|3i)=BI56}bQH6ZUB&8|j z{y9L$T%alBOccD!1)4%GGxd}Q=@C%vDL19=1xaaMIcl*t@_kmWdFA_Nv&3lq`+%hc zX?qf*1Ak%=xgR8@@pn=*z0*?3}f%3ke_dT{e#6A9%i-M2SC(5drb)&`uXY~TX+?bKy>6YRmc->GuM-Z$IWsVgvn5U`1l} z`g;_%9jlK&5d0Su2+lD5-R(S4@}O`b;?MHA3FvI$k@KVV>DH@!s_;oz1z{)H{&4~8 zTa6wgjw5tUV7oPFN5S4kFh}d1+AnLd3fkjyzhC5-y^Njgm-W#S%i-Q2W)?FvukP7^ zsX)B(Mj1^F4^;?G--s2CaC+MV+|NyT6vP|PlH1MEg3Y%`L&D};u(AW2tL_Im+GA_9 zaK_t2f;i)q2N}Q}!UX_shY2JKM3Ro#D=_PJN*xi&tq!r4H*tZM-KOLokwheiXOCI8 zSL%peP8Ti9M9Y3t@_Blyk)&hxE}3CrUy3r8(I zn#S&o0@0&s>>H+@n?ZUsjXlGsM+a?eLxGF?qjB_Y!O?12kzUa5V6Cnn*Z2uDg2PVbmFfpgC$^kYO5^F5o`0_SQcy>yCQuO=Mf z?C#A?utp1G-Ma~c=g>ZZn);xyG63B-utDD@jsRLce2Uk~eodIicK5gJ%PD&On+T8| zAnF9248Y)ZF6JYrv@erkB7oF(4Yc&gNqU~sjK;n?tK7L1uqG&{s+RUJEx zZ=8RZp__IY@?q4Eo#Flug+lPx?i9llYv>JL&k7PJJK}YC~ zur$dLdL!_FfSz3=tztPsFXp@+Q7Rsa19EmLtBvs1>E|_XJqm3cP_ugC0*`BS6N%Nx zxS(g=7<8|4)I3&(tA7VHaYW7Pg^O%v9JCUR{cpJ)kH?Pa=a4j?8kK$#UJKmANZ?uR zxTw9Bjyd6glwBFt@P)5_`4YcV6Phqm4w)!6=zWd83>y`=>$fj!88=2CCL9wb`tlc*i1FZ^WJuL5a3w?q$b7OdFdVv1;1VWqqrMVIoZ=3rEmb2-zeJM{`)4}+&}bww+l zi>}xJ-<17OJoE}HPP@X2vzuswy5)84uX*r!RS4?&zOKMu^D(b&FmU#DLHL-`PXzc& zPR?7{gkf;VBA+7l)C~+O7zL{jZ|FhgK#LPSoqK~P^SHC30lm$|iz<)zSOj zhe8T9{>{U~C;Xew>an|?Dg^)LV~qm-b+6J@`nbGRcpSjNuGLa(9hVnVEg=cJoYugR zz`!AEr560ODyf$6%<~;Q>zWv}*?JKnUV6P*w?XQNm;R`F0^zX)T%cu>DY;oBiI?7N z)@_kG@X~6VXgM!hwwaRKMUsf=?PlE$sUu>#?StHx_i;gAcAApAM3RWGvM3RW<6K35>sUu?gD>TQG9)Jso>C>j<8IdGn z`ixn3R_chDJ{wdAz;w|frpxe$>*ooL-bIOph&|_m#DRCuiz*}*Cn+5Qa^94>5G1A9 z>K}fd5Lt_xX_!0#1+BS26VsPWJ(q*@Xkz+;PmhMlVGkul{)Y8v4!XqDQyQd4W9L%5 z!8i`kb%iT6a=fBie}!~CPq&HtS;Z*m4AG>W2 zCs5Lh>p%pbd>f@AYbMB^s~ae&%HF`6(l7d0e^WETc5k4{shL3Ok8a^}Rt(nRwv4kH z(rM6E!P`w3N{8I>jZl?@B-rc^jIEU*Nigo(180hHR^4i`tujH+YL?uVW5J_i0Pp#1 zV4=T=z?3AIs&o ze~f0Gmxt+DF(9UDy9AS^PlR#Y?gZK;I50-IX0Mwq4MOMt7#CgBFPH5`-)(jWs$0@x zNQ~?Xe5H==%g`7{tn5l*z4*~240C#&gs#{%;I0c3#*V;O>T354k8#Art`U|xVUp+8 z<#%Qz9xgDkDyyq|lp0gD-GItJ>W=l$C7a!VYE(V;)2J9Glij1O9?1ECqhX0i$;;pUa|_i0jo7gpxj;K;EgwdKPgK>6kD!K-pbR5Vj$&K+z4^n-lQn5S4tWp&rsi7^})DfRm&%G}oREhc|8Z z|Eaie_U2@~c?ec^PqBt2T=EoHA};yE2yJ?5OjY*(P4gShihyC8{eS9a1RI_nLvhOP z8J1lklV`+eGI^$7Q(9yAvjUmCy|MP^EKGVEAl>@GxN!A!6#KJn6#H`yW)88)$x(Vx znRvM?XOZXnyK*E7gR)_f-C5Q!f>1U!&kBFhnyJA8ZQ>ri9IQxqq=7?9y(C7 zN_;e-=EGD-h*_mPnm}6tm%`0N6nh`z-YtufJ%INgOQ19W%VUHjZudCfu80wmI9J9` zB=Mlf83xV31);BbF$QeT7fIUgcT6P9bEz`}mB!2xMN8}5=sa=cuYNP|MN!C`4Yd+SO?vUW>0^f)dcUyFho z09Fp|snd95;Q5>6>oL(*gQP5|sYXLnEiTaHYc2}j4S;9pWzi)F=`sodJ}WY{E1uTx ze=$CQZSl_~n^Y7kx-}at!KVjsQ@ts-rC9shep{;A{YtNgS5Q#-fq7T`W6by!79^W} zb?$4{kmSI;Yk)cg6R%sv%-pJ&UnfYS%^O%;fIELOQ}Io|*_2t_@0Ql7Y$&taBT zAZkB)PLHN%EEBb^URG<_SC{`>0%f+l{G9fGpIAp?R&{=!=T6^P*-O`tHSrA3ejY=x z*-NKxNt6Du!pna3f_BmX^ai|aCFkTN`z_?Z01GyI=+wh6a;FADAt+h*AZvJXPTrtc zp=JmBHGTOa{8WLOO?y%MX-KRiHLLE6t)a0J#PH-xY&s>D@n+~Su_15iuvo^N75Uky zHrmi|JWeNmHe4mP;qUa|Hay8j#tJcesEzhtDu!E?&2q}uC-rn&c+h6EoQiA9!x)8u zBaGNR+VY?jv3rW;Md53wV9HRQiK#wK@ZwaMx5+cn;tzU+)1b?Vv>o^d zHa8tAh_qcIw=-giwEd`BO`jRn`ZaXeW}lmTmeoT!25%O6NVILs*R^wILp5mI$AVF& znZj<4-%{f1uw=8}O|5^O`0|Jc-cF!=ck^Qzj)pAIR)BZD>5$M4$aG;WL(yL@k{Uo!&!SiZ zeC9|UI9nCgk>SykxPX6LVoEL*NyIC7mYQ|Tq>hr}C5o1DqGg3CnJbc%6ff7TTPbyv z6t6_IJn|0rCEt`>C6bgBZCr^&F}#u>VpYjs_2O|nmQiv=0=C7wdT~2} z#m$+39sDjY87BcXfQ!{Kxjhvtc=$B;L1&XVjl!ysv1fdZRNKE{rLsZC?z1vD>)gAu z_=o`|yUtm~lBg~3ZwZvBE%!YDi3*9@ir>>j>;?4QY2V#j@AL33!fgP<$}6{*fW0EV zjSg76v)@NYgCl=c(fis!F?#33xVHI#4V2&;nS*_5pUG`0(9jRxeI9bf?~0NS5@Ky) ze6RW?T6PK`TmRFE^-yn` zZ0Q!hLWopQ1LXF0tgx=GJ3bTmklst_qC7N zSULJndD-sy1-pNY{@XCG?)xkQ7FF`H-4{@-TwU}Vkl56bfmNNmu(_nBjEX~gG_?X> z)X^?5XRxrYziW5(Z0g9us;~dfDtk4R$b@ln+q)^l-_Slj3-DH-rd4BN`}!KGCjUUU zY?xSgKbCK+~!*vB_eZejTO#6K`1sCYJKDsWboN zF%N`W5ZUVogfL? zQkzzVpjCdu-Tni^HUzDElx0B@w2f*?aN0H6DrKT}(WePIKiin5jHW9RwBtY5z8#Bq z!ik{0_c=Rr9Nr1qir3-`z8#MVMYuW5*IW2D4TdVu9FZQ_BpqrUptLK)8js{`tM(=R zBF=g0ON*hM2y;#hZP{1c%}MAcF|?C?HdWf!aB47iR$IT;j+oNanW25^8&)|LDk)dn z2XZ^Dsi5TA)5XLF#>p!7yM$*SroWk>?fe}Rv@_vmB4}TWV@WHX5B)mBPzFvm$kfz3qVf16`=TW>f%~%3l*|)JO462R*5ykbF~MJ>IsB3=T2`BqYebTgw5>7g)=C}G!$(ES zUD2}Ml-wYa2wL!LFzYr-9dX8Qf6smS92aST7PD@v)De-qQnVbx1xebr zo02<3l7bd?1l0i*@7Jif{aJ#wMrdz=G^{~V7E<;U1gQWr-WepNDd&Md02y;L4VAM| z(3%T0yS&@fvnNQ8W|!~!^k}FY^P{Cl6UqBbJ^O?7Xd?MDG?V^lB6-M<36!L*OSgpB zN)L)Y#2R&6!y&x4j)2)+D8{Y4ZG}x4IJ*v8#gez}>F%25JA!YfEs31mT`y5bffAfZ z~oCXdf! zoc2lDE{HLq1TVl{0erIB-jm&S5zm$O%azIPB|s!#=+Mi7O)ujUR5_}#Ta?1iD( zamppu7=%+UfnvaGSE*Gjobvr%;FNz(IOYmEjjePQiRCBz>WOj{-a!Pg>zbuPh~*)D z`59fuZ~&=QVPE}>Zr~X?ME<~IlHQ6@KYCYxsu<}nV05h9xp$n7BLTpc&VCA}5MKDe1}0*lQ6l5@8J%QD}^3cgPf0F{O*nFp~C`A4Z~xp3h_ML*GNSVhc|7AXZHxp zZM;v;Gol#-XxB)qSkkU#4A=8A6{af(&&p>QYk-1E2k@-kAHf431+BzG_m$hx%_Mj@ zWQNJ(tzunD*sO~Sfd+1?I1pO0NxeJ=@rv8cYFx_bt0!5&EO#w!h1wc zzb3bbn=#l9IpXt;>OKSOt-(%b&d?T);+yQmPS={r7K-peC3gBbxjoiQ*y-awFR0v^ z;GPkaacrjk2A_b|01WLuX*oi&!JWjjqHJ)dtYXOq*L9Zu_?^Zl1vt9pPse7Q@pS-? z;Y>4Uj=IHc9>-Z|C64-Ua(k|saMYpa1NEFo&jF+>C8;k+BLcm1GMS{lhz9|Z+I`6y zl%#~a1n@^>^<{s9c60GS?8xe3tErIH#d!L3h)CgF{bH2h;W}-tYnjD^EQM?75Rof> zb91s_&LFD`v-Fd?idSGK9)%5*R&BCbMu1qkutK2GG zw=88x4s0&0^liBv)SOu9=m1ByUWPemY`*(=nKm#4tsU^QYp690A)mJ|<6)#U7yPU` ztOA9{GgMYh)+f-ZA&;-;AlUTg2I$C;7PO153q&CKqg+NygGpwC$&2+8gJA2rPUk7q2v!Wj2^C4QLx&wn%Q3%Q_)cG zMlSE+g2>4F(<4>gwvM z>gqa*Q@7WCRQ2c!#i^TvFBlxfsk^H-oL_3dQJlJa9dHzvw;i>S?QbJTyugDy>^It9CGMM-(Ja{f8||+O zml|G6^SZ+zFlM=fw8N`u2Bv5>aq%?K1jIj_QfB-vas=v>1{MH8${nAj1CQS++G`laRu7R${z0`g{7Ea?owwk9no6Pc(~7h9 zFYF$jwQ(;}DxFmP+d)MzpTP;O74?vDh7#~Gk{5lph9~weS)jwhGm1j_lqr<4&nuM9 zo}M{-ns*j^sukvN;4EdX%CmI2jEGUR$D9gfxr~gV+GA4fOJ_uDb#^i;#;#El4LRn8 z>Lhobj%joZiw_<{n;;okeDIhU7UwXwI;64KIl5}=)zm9%c0I0ogK-G_1&Zb!*7bM< zhdx^G3HGj8VzUV`im!H}0~D;fINa=0(^t#mh@t50&}8tsMEUL;M47}qOma3Wx`Y(2 z74uMjNm-neV_v9f*1b&WG6kU#C3E0q3Vdpe67G=4pzmT@X37oJGRgl`%N%rL_*fJs z(~#gZhc<+IH;2E3f}-C|nyBGBqyxMH4m5h^eJU0;_^fR{?65&17Xn z#hibODo-2n2VI7odAuA&aZh95Pr5FAn zb$_f~b1kb$5;d%?UG@_zBU} zDtr3jzhHQ*bED!idabyS5nGEf@Q&aMjM%UaC4sYWeDKi+%?6=vE@@x)f(i&XkT z@x*Sa4QFc&IEsE;@2(w=;&jcx7cWsbiYmOlHk{%ba1>RzIEJXg0iA?jPnNj|wu(~x z7`9Q3B-vGh&n{1cU0mFS!tFTBeV*iN*guhf$#=1hQzO~KN_-Q?(@$lSf3dRd+1=qo zIjD0-oeJe=a^gr(MHeYpReC86${K7uNdH;baN`Ot!@4jkf!knz(Eu+4uiRn2cRS79 z4?m|Zs0RutPvUsBkasJsL#TT)J_$FjQ7CmGBV=VSJ80$QK^6I@259941-%Vg1d4|} z&Wv>xp1KIXU(y=igWw>s4)+z9yTti=lq{^%nD1m#3rGJ50`C+t7`_Y=1JolqfrrfC zGa=T9FOoSumuY>nC7H`XiI&ndpqupxeVJiBy)~H&QDq2PFt@$yYdttKnTx>H*Sb-% zzqR$YWG)fQT%l<26kqG=FO#{!IQod8$=s`0$9qNhCRQsx=pJj)vGv}t7G~~Ffg7|g}B#oYmXm0R|}3Ye0wW|j=}md*7a8zM{?Gp zuadb~O{Q5V7_A&)JJ=ezBboES15s}fHum*{?GMshLvlb9SM2&5EDAw%ioNgoTAwXO zJgiT?PUc*36n>D^Kx|@dHHc_rmuM)^yjkk|_|1KQ0>MJ4C zYF>fFb$5*Q&)wE~E0ei+NH&Q^ZV|LLiFN5X!`V3Dcaunli5dMI!%R1et`Ql6lFmdM z;!a42X^51&geWHPvZj3^17I>%M}#qK8;1^u*b~Nc;&jrHTXSVbjXIDKFSdfdt7A$1 zXi5OEu8t*BTNcsK*V-CK5nxTXu{kPjyf`{>)_EB2vDl9h9IiF}B z{YiX9MjuBHC`halu5Pb9KZ^6P?MBF!SuQ!8B-%RCMc~dRvXg&J=O|r(hO%bB2F}M2M#A3TDm~${`~^()adCW_D0-qy5);J;r%YNg zA9LHJhyk!E5hd2Ia4u1d(vIh_)gGv5B)0I_>q2y0lM8b0UMNZto9g#D-auZG7^a@X z3Hw2a+Y8PFlX3@8CGA6L4k76<)0-=i3#h zEl3spoD*~YnvP72*?5}OQlagD4prkws7key=?uls{j3ueYta~PJh zLPED~4aBCJ-Pd^I33%KwR<8U%(G+bq6TH#oM z4)CNNB-vB8pzOFVYeaF~&`88Z1*aQ{xTdUw z*Clhfs9<1Y5!aNp6d!|OL1WPiS5{$TWn~pOX;Z~$ho|ys_rnP=;!8qB!9pTV@|L6+6&b`oW3G zpA3`IrlP0$E8&qs*B9;J<4UxYu^_S;j%y?&H?z;y-wd0_j=qJ*44Ws8H&EV;t@x)_ z^K_y_1T_~2dGFa*=3-KXMycZXAhVk=z64sNi|yd|=As*&p!N0%s%$RCAbPpnKZ}Fk zMl!yK9xVuZ*8LlC_-+oWS#RMpk-?+DyS>;H3~3^s7+9rE4kC?#%sFQQpmUn2|0l#& zVIxYwjZOlNh0Hc6Bu}ML0*?C^7)~0cU>M($60liI%0j(c(!F6K!>ha{!3(anWaOH} zkTRwJ6H>2Jd^S7rnauE6nNIPU@-Of?JX*o$?{tcfdn<}h{Zdu(=h( z>063ZkZT;D7^M(Qrn7c5v>K!p|!9YS_=tUL9nW= z=u;CdEk(oZe>?F3tmia3qGi@oaqXff;1r;5FZJ%}#lX+}2FH>BM^@KOX z*7!5>4RI~^CKSc2@`H?TJvC9AZ|x`68`@h1_@AIMqRB^fVa(i3Skc(imfcnSgn*^k zd2|=gaFgL$cd^3+A;o*xu_Yx|27lsv)mIUWu!ZE$3}{4!_@v zU*Qf#2Xfwml#}DU_{Ybg^T%SK>h!TRFu%E?8`_cCuAPGE^TM{fTGv1MoC$jLBr!of z(F9FEV)6Lr9d~zPkd|W)3XIH4k3x8SESfzr&HCY+b-12rEEeOh$vWh63}*}|Kgqri zm8(>%7?XL%_$+coIeJ-XLZtY<3$r#S=fIgqIF&OC> z+`R2$fUqw_Vv+kWSUtX=u!>t>4Robfl(oc?RWJ`WjH*VMyE_PB+CkkfMI)h(KZ6|L zfV}Wa3OSHLKK&(y>@`#jK~7rzRzpf_H+XHRX!QPJ2MvjFZ{lJ=bm#5R!NR~l17Sk< zGiX)!lYxxHz9v{j{bf2ygEGkgUvi z7loi&$H`*Xpwg|+fw;FBL4e?{_J{HWzB3$>#Zjv7HaeOwoO~dJ+en&cKwOUa4u87D zHh7#kfzxg-O+.(33Mpw|c#rrTh|2+@QbqlJn?uAQKA1gqXUDq#V`*1~W3lbgQU#aN z!~Y2`Se@bGtX>nB(!>85F05X4T>9DmoFb|?-Cq;cg3kDk_4B_HxdiTnbw2*4q6jI) z-}AcrSc)zR>xRD*xkUbi8wjoI`C0$Qr!W)+8Wh_VcVjtUYx3hnZXJ9+O>By8vX#@s z$;epwf#x6$VP-dLen5TBA3pgOjruoW^0%~jn|TU)AgrsOl78QWtnZN3mQ2wLH(i8N zBO)lP6@Dj1Y6@@p8~a;3Jxk<5bw>}XOj=_vt9Q7G3sMQlZQj$xAZ%USq(dNVe_Lw` z(h0tF)p7y>_Q(OuT7?i4Xz+CJvp_1$_cMU7ZMqmtn741#%plF1IIsYWEZ6$Z2z)~W zUNgiP9|CLwXU7aH1VX-e%GWc9cBU0759*Bl=bcUBBDr4ko+fbwnr-0>l*Yy#9D~dyna-I#!m}Pro7TJL_;mK^VGk^LRygo-v z(_4=ZgM3cL&DC40J`Kl-sBaa|awXuoKwQs% zuZP0h#{+F=7l?yZ{Q5FjnCKqngBPnvhr;@@!!E|Ih?5r{JfrmJ^1Y}vEWww;+?g@N zL0o_h!qdYIUV_otpc|Af5xdZO)Hv3e+>GlWX{mUYU*PD#ht^+U@4%;82a`w#Gl6!H zR|ZvkCD01LONbpz>DnstS{^x^Qx3G#TG$^8e-n^1m`ubjBITZbFcwDJeyQ zjot<=3&cPkf4dim&9x<`@bct5+l&J78x93cBrGfteWA$;aUVY6y(97z_=ETvK1IVe zVO5Y?kFf2NKwbDw^kW<}(m?q#QI`{|j3Abw;q{-5pf066B}zA;uA`}A1c!-(KaL+@ z=9D4F(FTMRCiHl@AUnj-R`BIYF+n@K%2hac4VJD%`KIs>5Qaoip_w8lBD$ei_^BOuIKzZPA(CzEoV*<{Dy*zEl4 znN4v*?Ixr+nmXtL^9$L`+6r-Im0>?D6kBmqp-B}inaU^ z7w8Ze_#WM(%l{src8sX`z72a5jhQJp1cCBbe(Pj`@ zLdD%nzHnfzSl>WE{q7>nDhVT?!1X6FQfuY0QY*;5iIrOaB*v?^sD$lM>CXFkdI`nU z;~-FEru-zfqY#|P;I~jkGiL>Uo!Ex7+Xbl|LjB>Lbz(1W9IRg_*4K^W5d3Zz$glAB zo$<4H2zQFopTz{!`S(F_-h%+_WPi0zOg6Ed=kX01!CP2ABa9L>+lD$ye^_D@&AkXI zOB8|1lkwAKO8lbF6ZVkeEkV8L(!wyL4QYI+x-_od7|eItc8A-Orlmm1{g-vHay?om z6OLQ+xFoKJwRCebDlnA+obQa7hHCg^gLuyiw^E`8^OYJ@*q=;U&zV9;zza z#KYjO{XD_==NUCz+9(E~1b@6yY+!ss8%23Gc5%hii2D;EeUljMhpk-cL~50tL4$hu z$D73AeC1L2W0N?Yzqi+#7n_7y{`Ae_n?$&)pmnhr1HN0tR{Wm}q1zVmOY&O7Uf&_F zFD{3MTg9Q|wT`_$ycJ*nv<7^)iC>Y|ZtV5iZTR}Tjc{+9_&Is)&R*wjM-p7w3Wv6f zpK?63EEeDA^LE0LVzG1h7#+H%y%-|~g_v{gF4gy;o7 z?hs$&w!@PhVj}8jP;aL=h*a@~tX*P^^&^iYE&xvM6vtpseRhdENm(E*gV%l$XOhQY zD4IORAErKSX|%cT7XRke<6TjxR>p!=<({oq-t z=mEJ{lJUNv#1V%4CjwL}R1?eH1m)Znn>qzWx;%$&0k`*}pdhNl#tK{VKD1%EPhjAF zv6Nqb$T~GOiQ5W)9T1nPPX!7I+x}{h#2GlaRUx*7$`a9oQ^AuGRG6|L;t;A;D(G=Y zT&$j^CDLw}=x=q8O5(iX!wX^?_@ERu%xN&WRIKk9@~yTnRU2}OW5_-@+Eg}8|KVsG zR2Pd498I00%_?JJad;Wo@N634cm-@M6MMNAsf0!fN5GIv;(MNrsZdgrZQFR+mUmdZ z!Bu1AqvD%5*Vm7VA5sQB#uzvqZXHFwzH>}r;NxNsevA$#9T!7*RBMs5f}!}hm_-<( z7+PPzBa^ff;ycJ$vrmXgsBsg{dKc=Q6g^3mU91Y>8F=?3njSnxn~A@YqCM4$?)*lI zZ26}|D~E3A)YD>uowVNU^uxX_>x5EBy(pSt)oD@p>HChOkl_D}m)JRpU7t9tNF!|Q zpl_}1SSuW1;t^F0^BFPC&R_k{i0OpC7M&H#YVg+>SYM6~lizHo%f;RtGE%ei=!eXL z-sh1aRRHJF#WW3CUO@e68kAi?ClXOW$g(kA!~++$Y#`~PnAr7w;j9zEf4`+_1$NY7 zAD#WQqx$GzJAX+m<~-j-`Eo_+-5>I=hz$aj za|fpCui%7>w+Umt1&{s^lQd;Z1C0Hl-W4&t&drNjy6ftM>vjM{Le-G=A72rJaRVQ7 zMSPi>A?U)lgFAHv!R1w=83GFk!wvCElzn}#iOID8LMM>9*Bt$qToc1R%31%|>LG1K&2GbW zibULX1&JS>?d9v(zI3e$@n3Tt+wZ(U@yGUmyUcjtPn+MqE)Laxg0CLCKvt(zKghX( zTFZ1;c>|S)b#U_r>S0H1!*3#!a0@YZO6-q6pWQ}LMl^b47SA!%gb|oR4}&YkNUEaO z(&N3f!q{pRyTP7H@inI|uQq8=>oZk}p`3c5S{QH5)P&$RaMMGIgfH%hGc@>e0tfl? z_W8m_Psv|Dkpc5VSBP*|l+nE0c2}(D$@oYsY~YQ#obAC~@iWfO)jm^L6UTNig#(XS z>8AEm>3h@~rz!@R-+#7(^Qyt?2G8z`fnh{duAxI~g?v^E8NI;+Wb}iJwLOU37dniLebtRXB;-_L7mtlMQ6tztvvX)r0 zixN4%>HDRxxdqUUlj1q6Z4f8DL>!}nZ>X>BXI?TB%VQO-iQyP3DF(~@)zWMD(@!mh z1z{E;WyBtKv4gud3eL`vQU}{9wbY&?lGd!12BQxoUn_l}A)I1^{HaNPVAM%T+$c!b zNrX{ybP{0{4_9d(VU!ha5@8gBUUD!BJk?7&y<+$2P_v{^hD>`!>m|Iv@I!_vW~5V$ zzxUjw=NM+QyA;R~-q^`O>W#MkgkjbZ2HM5wLwF?uZ)D<;JJN7p8-IBFuGk%3HAv*^ zGCd4ZZH}2@kenO?CZpt(gGMQ_$NR!Qg<}7a$)y$cSLYFYV!I+XR;0X(*`1hw8V`d)rK!j^PeUo&#DyW-Ag5f0>`=)MHt^ENa5h|8i?6QI zS5~oa5*Mz&M#n+|58zM)<)V;C%0)MnVQK8cLM}q*8*s!s#LBWnS?&AcvHu!>PloY5#OGPI< z;2?{N;yOiFOQXC z)u#gm9#WfO-H5t4d8NytXT#9dv>^fHOz<6#TlqX8FkT?sIFPrd(+jaRY zzkNGo&b%6}-M*c8ZlHMB9|_zS=%kkp(%Wys%mW-Yc&*gn3y# zF*pi@3CsN;B}J-(E>0d#JBnIZgJ4LCq&6(yN20HrxDW$x$v((zE}=ArY|oF-6nsmL zg^6DG^t6!&J)ExlMpS2Jxgu$FtNzdP? z0PdyB3HmMi#=HlbulW3Xszd^MAEru2`CEaI?S8)tgf+wkp9xhHulPf5a0gfQW)8=c z-@h~n!#kwz0ppJn$1)KsCY?aNhC-Y%(x6`${I<2+CQgJCvkRes+__Yx9QwrL0Fa^RtZvbX#M0>e_K&IsXl5w%2o&F-0b-wXcm*fnpUoQuAhrP5X@<#xy$W66^&gP!Y^k%sZJxY=>hN)wetX2 ze`7c4>{|`b1$q0Vk;&qLDVf!{$clhB(oE|EN>O5>YnNm+qwQE%x_;r@>pi4O^ zUfnpJGy0DiLvDLF!6Q_9QXGgs4@N_AXWXbWA+yQU5FXnR>WA;y_*}17ekQ%HAfq#$ zn-F1}*G-zr^D}?66NrXm&-{@A2pPTYIRJ%Q2!My+Jx%93!fp><4soo)DA zQWR$_-$*0{+U=;;svGla$nGV*!GG^wgGOVQ&%gt468s&)Z={`d0ZPkd4!SvMxy12~ z(9(a;&gYP-EVkWvTl$#e=WeqPgwFIfWgP4GKG$UYuVfrM8Trd+xVu~Rg9EvCgr^O* zjeU^*eECj0FpB3+2F(BD!RLT|cfiJFNoJle-CL~*#8Z7f~{hDtT$8m(0@t8IZ*W?gB6Y~@%P5aGmJnpxrL&t zLyr<+_h1Rn8KG*h0#Xa6g5(t)TDOz`!olt^z9EPlK z$(DkV$4+FUGQ0@%pGi^t=t`*nnKYCya0lc0Y=1aoNcSbio;iPV1l;;ea=5{?f&sS6 ziGEQ3cvBCE_*~L{^uFC?i9`7J{tS(B$fX>e7;B849{$ua`_OAmooA@pPySqLu3b1) zFYI3n2S1l4c#!||FhX~&8m}e1`-M~|;48t8K{P7J;0}%0az zq?eIQ>0e4jzsvm+)x9||=S!(21&G1L4B*8tC30av2{Eu+DHI^R^q>b zLnQ;k?=h6Z|9U8ezkR4g0>UFevXDFhVHtu#)ca30H&KWS; z{VUoe3f6SY34wm!yy6LIUrQtqyAE^_y864h3d&(KeE78#fwMUFYn;W4u;FWIg1W$6 zs0(G2d-}myL%J7yG)(gJV&qZ_bBOIL#8D_PYnU{>CQrONTneV#84nY`mP{~ixMa{S z@<%vFyb0$|;il2sW=Ils1qVyc`R^%7AJOSrWuLARNvae1mC%rNZKyu~%5+Ux4@Ox^ z!HE)N$wb1SwL&9w0Cw?(;j)yBRBjAejTZaDHW`)o47ednAtVC4sns+viK|ZhI145I z%ND7D_F^D{X$}?1_x$x-WBxIoC<%FYV7^5fN@gStvb0{xjI_v+JR8_&~KEvuvJ zsijJ%Mo6a|;bPoCP)rB&mKDA*DMy-*mUg{dDGzbmoGXQ)Il99IhE#q=;{tq)8eu0p zp5gH5&(-(__>PeB<1>U`6px*oL&of8^@xz!trWV3KxyAa0iGJ+SLPd~=TnseG+{VXx8{?}89*StHov=W*{Pfd=H9PKz%gb8xv|c|sgD4QVU_X$@NajE# zz@8Hb`r|ObSV8}9C(NYLQn+qf355xnqnV-m>1YMo5f`Y+Ipho0(NaB118@R4Iog33 z#?^=GPAEX?W01Y6)^VgpU_tiu#1FAN0p4rcU=-091?*BM*mYwZVE;g{?l&FdJq6h% zrvt*C1I^;>*N3^VvCTgUbz z)Sw-94ZB*2{|g7KG|Zv!2ox{K2!})Y*cGjWK@``d7POMd%@l}t3_P%_;OkOHemV~y zT$e_1z2Vw*^iyTQJ2#|A{x%2l4QUM5+vfe96h`7sOt+*^cy&51y*J_1Er}i0D#yLV zPo8)i6gCc8dBsoEc!J&+>9dLgjJOsHY>O?6;6zP1~)iU;2aky$9;UJlv|Y zP~^%Nvrv>9JI7_L*3BN`qX;!*LFAK(E2VmD>bt@w0_R2i5xH}WgFo^YNOcG=G+8Aj zGd^)Qd6@LXg$`e=k}k&65E*pephVRg*Ykpw4GnuG0?$og(Vtr5Cop0)PQVsexLO*e z$wH@^8)T18_JfvdP$$>|eby+WLVm|jA|kMLFma7kkNWI9Fs3rq7Y?qG5`qc0+}8@z zPE&3{IG(IW9b_$$g53;sXW)%PplC7L(W9@jUA@5h>keHCP-}Ywgas{p;puY84Tcv`T}uU3@AqsE zxmL~qrwY(x|38S1yTZgTK?(kgu1w_ft*@b~lvG(GY6_C~2Q z$A71uZ;QdJ%Fmufal;{Zd0%fhzgarUW!Wa}m3|~)lCAbjGVYLD_Dd0DGtOx(hZ*#O zit7E!W~@8#55hL%fMYYZR%FL;e*DTKka1FK#H6hOIf+AQyB=%@&`i#P@&j}mo^cR` z=_g>qA0nQGgVIdgs!tu1-nM1!kb3aANp9FB9ma?!17!7!^oN`>JY{$j*8GA>BoU$I zF2dNORD{mhO(jv%ZrpEAJ!FR(U3N>sp|x}=JrjIPmFjy~f%DJ-2MP~UK-{kgXzuqq zx^br*cB312`mc0vG@g^%){3<1caH9j`R8yzy`bnE+vqFA>DkclsMHuX?!hhp#k9ti zT7%ZgilwxE(Tb(CW-C^q^^!71Yr1A%NNY~4MrvH*tq^dLQ#Ij*1m+94>J;AcU#9Si zY3@XC{BKiOf%893Vamp~&&#E2-2a+MfGeYhNuaC@Y7)F?Wl)nq*~_R&Ko>+!lK`3j z{p-@`nic^kDh2_dL2v?2-Nb`@Y7}fhVe{X!2bTWIVq5?JZV%Yd9_US#oRNP@@hm>Q zD-`|tVk;otu0XM6Xtx4%ifhB2o!8;{>yZ?TyUh4UR97!} zBt>{DH8`w+;nFI+$TDIY_$#bzaAz96-M$U_>&0jp-35Bt%Wj;w!ia4ZzA*YPDcp{N zCyBGijc(0f=x_W4_Weasxb_#C2L(3wzop|GtI3=2svEj**2C?`w5I+Et(ouy!$Q#f zdLjvQhufqPuKmsK6KS7HiRlhS9%BcHZQ@={kzcN8;Hca)WnU9wa;s?x4tXm1<96x? z-03F4n5zsK9W$BCsuyH?_7o!&G*_FeymDaSBa9k4)M%53ZN8g)%D&*6`c^aG%s%$p z8QKt&4-2No7*@W06z|EsC_KgBTf?w}NA7ZWMhYVuO1voqN%4+{{5tvte(;b@JQDAK zK}K84cEcd!J&r6uw_YT=C2dCe7HgTy9@I;+!}X#)o4~D-?vw7^7~x8ZPf5u7}l;HER+d0cWB$%_g~Z9duT(8wj4R zlwUkGlxuv2c&gV?Kf`E~T*Ki(U>s*K9v}?j@JNJ|%RT&UUCiCP1q793diHbHRT5exUM>-KL6aRs0j2zjc7fwM7#-!-3@TtM1HKP1| zg*4_RMWfH|>F^QKSX1<4)NBft7@2rFd<4bgiq47ZHEMV|%(;ov2#~WQ0#UEYwhi6+?(o-MW zi=OtPM6PacASdL!FCd5DQdJlRJud(1E{Lb#;e^o5es2|djj$QEeJ;Ka(`(TN&O0(5 z4&O(J$-@l2hs3)=;@TFjkT*S03povCgEvw2f4jyD)6j?Ot#d(ZAp2ZxYa}P)&%Q?TCFIz`#xiljcwk_B(Hr0S!i}bKod9+v zjS~p?wfL3pU2LmPY=SL^K+h(!^BRhW5JDRI*ET0Sg-|*ix{%g1k=xY1=JBiv;%J4) zrgA#*4>gs;Xv`G}6dKV~4i2hio_Mk}OGb3P_(Wn{PE*Q?$C}D*YH?w7GrE}GY$iu) zdf~XDp>li+>T}6!CU54~_`rzl&VDm?1t&u8$WJjUCv~nGwomvV4pPRb^wWQnN0YPC z9wUQoUvY9fj+0?CFL%)9ahMO1hr}@NATX(9f9-xAU#KAU)Ka|DrjlRAilCA^a6iLY zmE3^a58i6IpI)}#iq^v?U#WuO+|s8Zuv#tawNKU9-W968ZQ={zI@ti{)UpRQyP=i` z^QAm&UvkXP+oToT2^oozhyprS1;t0gf~=OE(VUNU)xc=Z6@JplN!X2YF&a1C3tGIG zppoOr{q@M%uLePcPWFT@S_-|lR?b39w`%1M`~nrU3fdn?dJp0EV-Wk?4nfwET?iWb z>*U5*ZMF^v^aLt&asyJK>~m`%930WAF}&+4$7rXM5#Uw8k*xx)+jmEEdRXl$hhqrD z0atl7zeqbHeQZ}SX5Z1k_s!)K7}9BJA-k!FI|r?faQA9^CKRRPGJb){VZ^J9l#T4_ z4lI17A=0arOq`18t>gx5!}CI=!QEs;4ad?-?!a^!FO!eSX!0apOErvWCHukER&pH_ zJD#nP^R_@zYdOJQleG3G+K&#*<*)mxP>&%Ux3_)&aM~HOp zj$5}NPzKKxjmXwg(^ttA}7P-&ax}@n&R=ycTcE7gmsk9uBafViyXv~ z+av!BfkU0;P@SRtcI=>V@>(k7_LNDO;t0bxEPyaVznsPlYDvtXcb`8J z;5OF4a5byPlq4<`RT@taR$b`~{pMdWkzlpQ`OgKr6z1FJ^^%wH{7oLphrbaBz21?h zb2p*#9r--}cq$C(E5}+3A)X^S7>jj#LU4z|cLVq$Hz-=x!f(d+oI7~+mg3-9k*f|; z#@~;#Rz9nPHIWPy`!iW`CiL!)GM$Ht{;Z1UdvZJ})xn@g?StTr_vHTkXpBl37UmBb{k$+?M8E}a zsQ<$N&&XHT_jh*}sB&TKiGiV+_k;Ybs~d-)AYU<1 zK7g#2It)oSSiqq=%#+xoGLen}N%e~Rd2LH6_sLGaV3xa%R~E_xP> z5jV0QzBdOQiiHHf{RVvR6_#Uy1MzOII<+wirM70q!4g0CW{@0)g$09<$Ftz{ARLtn zk{@g^L1mYXdVKZPU>vs!rjl2y2Fv8t`oZ!y{9l-6B;DN)Cb?N$;ZL!#Hy-)33qKxA ziBa?>>kyfQLm1eCW+yEFMsLz8*T$6q8Ra^ll5COcO)#WS^FU9hnxw)jfyLKQym#(x z@q&KYvWNH4y>574PAeS6%REFa@}8a<><`nj^WG z>}g{3MWa?_)-fFMN;?K);0KOo&hRW;ksJYEoGG5AnvdDS9 zwmDxRK$Hi?2L@pn^4D@8?gp;I+Rozh#<^3Jl8tPp$ zzRiEjL)NDwUxx2qdKHZ%Z~uPklNeFW&hRi{1L9zI_4h;86Yg~mgUa6;Au*Su5^Ktl z`=QJjkt4TP;h>=Ca9A+pe*BRJa()=#KcnME!Qh`OODGgDRntItoGVWyqVrG@LrTd_8#ucOd8m}Fe|?SwE8(mPovv;jBd~PIfraO z#fx&tC7$9v3w*7G0~5IjpPvrzcfkF zMKhD3OXoEt4NTF#oY%41vwb<$HysTItXoHni{n~i74z8%zF_(z$IF@$M^em99z%B- z$V{D(pf7NSt(Oh91VZ8232CrkXfG3_kF7EC%-<(C_TBsq)5*}e@v>vz&7VKH*4Wc@ zc~8k1?AwsJd}(8U%+_L8SM25((i5Y(98fb$mJz6#iJ1enBx~W+33VXvNPz*GflQLsV76gQ<~t(D#}nY!}Lx@ix(E*$0_8^|W(obUrN;CeG|=p<*Fx zMM0W7p@!P{HnzizY3>o2ocOdH`Jy%Qcsofd5&)8<7vVC4W$$J`Lf>q*0;119F4bQG=bqXQw*+D%Q&5svgpSSPQYf6Ywc(p!hS}!`# zh}r{15yz(QVV>50E2?UNoY3G4y8@xucPbWP51b*ZK=P$)?oYg|z+(g4L;h2cvyd zIVud+{8V62UeZ-rHe{R$)+~`puyP`d$j^y&M@yFaZd{C?!_6gfB$m_%!H_=`hP;=p zwoOf@lnUsLBG4f-5hOhm zDNCqmj2(Us;3tY}k^|RRH|Fg?G@$S&c_gBj4D*ZRR_;tyCg`O&u#a|2W#F*(wsmqt ztlfa&uK!u?Ns-31dyM3Rf2K&k#8&f*kY4)?m1H@E$GrblVG&$_ngoqmE8B&l^1pqp z+~2E7b=>h-V@{!*>PB-75wgK{o7@&LXa=E0^4DNlFB46uImOHu%AZepaQXaS5D2LH&+Qlw2 znt$R435D{zh8-;E*G}~d8)d4DZbAzv13uh@?g5N;--NbR1~lD_c04Moaj*Kq)Xj1f z2AS`{KOPFqiLcKy5J?Q2oAFoZ6D~jpNDfW$ zirLN;cA5i&x67~4Q7*7|v2(jj5T|K@uon8PmCcY)Oo!RL7_rWT9>wx_ zT$ts>lG+L9p}{@az`Y2g^ShuSP&Xn9e2t}_~T6Q%~iO|dSJmr zNdCJ@A9%#9Gt*O5Tnd`@QJNPXf5+N0@`dlk)0T1Y?q2zA9~zUO#+Y@D@gn(N!2|mu zxv*CbKri}Vd*zlWL;i${15*PaV;}lR3c#`t{TjV(FYQP79{Ml(9Fp4_emSclp>S6L z!|c!tvF4C$PMUfJ^DGKa99U9=i+taO^1cfy7)y_-OkU{L)(KCcYR$_5!L`n!T!m+} zvazQvu@rS|?i{o#lYhXy;(D30VYxXPL30n|-Xp^P!{`MRZ7q+;zj4|lWISV8 z#)_0%@NX?|HSpH1mo>txsKLiGo8b3tYKVGj#b5nV1D*HHIaiIT>CqyTU846nMw0 z6t^U^X6*SY70mIJf!Znp$%T+RB`4T!-T147U7z_3;z#vB z%!=SNha#Q$LEmGXHjtoaa`dJU&29~KIWKF~#BzpQ)uUh-aw5+Ya_}7*&XvdV0z+7; z2>W@ObE@qu(&{)`QwobzoJUpoD0p0ugV?KXkZ?hi#3U zanuYYXg!BfR0p11lwGM!h3;L=w6K3Nj3V8bRYShQ=jEB-5RB@j8ZdeO;ig}LHWH>^ zA~sT1#>`+y?sUaKUnZxL>H|bYr&>R|k94~%k%=Cd4m#OWP3}yVJM6{h0 z*D%^nIhX04-^!3L2K+hkxpSxT32D~M*0J3C+)B(3WAW!Nj)Q(zFo+0UrI^HkAD0Fr z8jtL0d*!Mein-$O=wejE5XiYE`;cvR#NHth@T^-oP9kPp!bBmZZn$30U6Wn$;DTpd z!y?LXcmG$8f1MH$t{hw__nIAvY)~_>8iV6F>iN&Oj-LM!cggk-dDqdLQ^A4jasu9) zAt%ranpnah<@{W|mySi%VYW$(i1Wq+-y2FLH(1aJE48{QyL!^YB&>n~Usxs2Ud0{C z&AEQot$B6vYzd*M;oJ?`PpfjlK0GicM-I16O*U~Fa5g2jiZnXsDDhz>=iDc;l2*6u;QUz0)I;U0#Of#sU>(up64H_F*)6#TNk7-4 zQoe&fuT|k3ega#nFiNKY+TFpmRRDv@j|j8xAWMj_@eUfsBHX-#hw362?$Vd_@8Zh> z$hwQ0*C<$f7q`w)@W);GJo3lBd)Ry>+`lKA`8^M*2IHe+YfspN`F4z5kveg}`7iJd zQ&g6@__~ct6U>xV;P|f)sx-qxnr~q*Tri0i{wKJ!;OtpbSP&V7*v)=6?$o)KK7`vJ zE%Jx6_vL-TD={!q;08wFy{MN_M{;rZ;N4LUAQKlqkel*L9>d=c(2|@9i4WzQxIR^A z5So4O;Xy-Ni`Hvg0dpIZt3MBy>0rc)G(ULfPdq&&HB%t}jL{cz{*FCw_v6N4Pg-K(j{}xljOKKO(^vwpowRFhbqy%wO`mSlIe+ z^iX8L(7*8%wkM3(wH&>;{@?V44c*o5VD-F}0Ixijf5tV4$MNWVxDVzha)@d)S&Yej z7s9zG)PHGy`aShuW`1IE_}(kdPyGjvzTItE5jZW49%QJ{iMytwg&bs5WMVFGJn-mb z3G*STFTUByKCVi#VLaYp&FCJ>rDHWbY4-&^XNktT3qQ-PE*FVk9r_KjkZS0^^|h9- zj^&zTy{y+Q)ekhN>o)uD!A6iV*g{UxxwmthLmqFT>0P`#TN3n(sk4arg$7%`fV9p> zG5o5R*q*xroYX4_3ghkz!CFiUJ@PqmHfe-ioUNwfOm**R3&^^HDkSE$$J{SGKB7G9 z9q`@Q=h|KzZEw4ZiNXUT?V^w-@HjA%$wGkNKE?DwYKxmAhe-0=X#5P*=pPu>v`Dq5 zE3B{M%Z|1(onMaI+?j2?~Ey9qc9o++<@-Bu86keBgklVoG>Ph1RaZO=zER=`kdJFMtxw~7)Np@>@ z`t-58g?P1=u%|<;OzlC-l09hI0DSTw@>n^6R)f(a2m5lj=wOqFh2&PUk<^71m0_i}VX_eCUtnfkkjL zF?A4y#5|)V1f2+qcUTc_xcO7BFvj(g+~hPE@tV=n4Nap~-j+@j^=Jp`n$*_V!Da_i z1mTsAClfx+bvzM-Cn*R+WN0{1RaEG@BiKS+9}CICmn}3yYcRmlI=ZeMO?z^3=iPs% zXlZc-YkVw3%cWtO3EfKO|b9BP@SwdpgLJkJDv!Z z2Y``vh963YOzXm19C~-c{Va7+1SdgikfmER^YM{yrYM;roaoVH5V#$pL(k7b^0?uF zI0@;j^0Rb9EK?blpZHs15X-VJp9B&f(4;oRj&C^lAQ_*|%&Ly!LB|t8amy@*q8pX@ z^ls==e@hD_VZYfvbf#Zzl3`E0>%@)a-bLK(H=Lcb&Rl~y>u@N*@-ZUXlp&fGXo;aS z)vVgAH$W6N&hjCrpXwHrO;GsHcbw) z^uY<85=1#u33PVi$g)Zh&P-=C{T=55IWr~LLe8x%!Io6Md@2+LTN2S%b~e}&MTC2Z z$G)EO8{6`T$8q7>jXIjyuk2xDVd{)mT$vMuNRF4We4g(@Bsam#M zfHl&Bsk7iwBu-ow#F{MWOx-;NB_>ORm-4+vR6~(Ozq>%;caQwQux^iL0Fw0Eq?KWFTdSot&KGl!1G-iEXWUZ_@-B_z> zQB?Gov3gG(^{&u*di%E#QR9BM4uv?c4u!a{4(*MLX7Ho!@Ncnpw<%4i4nGac2>z_* z1NM{@L)-O=p=J5(X=@Da;Sqa^jiqJp#L}7**;8?>g&a;jjJ1^LPN=< zSJ%=BHTJ|f%UkHQ8WU%EAD^zrAx{^8As!o{8Xs>Ng{u0VcuRfm2t16pBx^;4Fcx!i zj{3qES|wNlbm$^e5sw&sGdRIQbo;yn+F)CPg(&=Y*ps;)axKOh)T3p&#{`-w|+2wA8_$q(u5MgZzxLeV%CXi4BNkk8LrY^;ywp+ry|eh+hL&_zyv$Loe1eX&e&%Ss+)=#3*}DHrl$GYcM44y* zOZKi-IV!JqR!(k2*TA4gwDO!r_R2+$%0D_QKVy~C8`H`kH?~(^=cxR%v+|+FmgZ~_ zHdYMvnpoVCftxg;G#k`}b%{@`+9n5-%}yxK9K~B4#ao@l{hQibZ&Nzi)RcDeD;D6& zd)kzAVyoB8f>AG@z_-mUkML)53!L==C~QI3#^n~49AxJY(vY1?V0s#5?qAr`y);WR zEUVv=mc7%GE`vPww5=trd7C{&kncp7K<9J>jah=y5p)SGOUGqU0{hv^TjXby&ASyY z1AdjKRd_9yi`3&cz6VC($%JtgWVE(W`?zZ2n_)1uwZ%=#jANMJ+7jvi&lYjoKUu^Y zOeRcax?&QaQu6%Pu!-XY%c-DM)y!eV7}g2IZV72)>Bt>`587C!&_#9*gNpu@85{sD z+9Kj)J(hDUn6gh>OSJk8p#oC@5kq)(Tg$7c!Jb!ev0K6#;R2giVhVHZEX1oG(azEu zC#r8dx=Kg3v$Q9xbWeM_N|QR!ReBW`eqMs9v^rQYL5MA{gXI!Q9#F&l{f^jf|F6v7 zAQkzV8ydhSgWdQg66fz)#_xzu|KrB5evva;3GLqoB+V&C@O^Gu-`QeuMk-s&@5W)w z-|!4e6ZcJ{^n#h3eqk`c<_rr-H0Sh~(I{I~mFU;nH{;b8VJE<|3=28QOwCkOAq`Zm z4Dg4ipIJUey>-YZi6QW3rllQDR=(-wAPsT)xAYb_O4NC+{Q8!o^g&(p``NBe? zLrdPUkbr>9u9l8ih8bu+8rTT>eQ6=_bmzKaSNI9RZkC0_a2aa3&ds-3-?TL3xXsY_ zYs(~V3iRt?c@-nHRe~?1ZjSVY*N36iL`D@WoWDb_OU;?;jUUP~yoI*n76^UI5~f>U z?1Lv-y&(N948Ov3K;EZ1`D>QuYm5is*|7h^-g|&YRdsE{oN4LFg!F`j8A|9S^d@is z1py&ZiXbgu!9s~37G%yjLm+e#ge>|b2na}vB7@XKKsqGSdxEH-lte-4{P*7H%p@V` z>+`-o@Be()_iN0Uv(bb*!U+zP9b) z7>E0E{e<5uwjoRo<2e>mU$MCX3ZW1u=DUncW;TXRsOi03#@fHsV45_)A5HGkPIeku zXtvEKAn8>XAow!Z>t}0WV%>*Eb3{Me^M;KAye#6U1tW8h4Xke?J?h69VU7)Q7_|8P zIhWeeAG`Y_XMTTdiNal{|3KSeX3IK12n42cR!+3N&x#8MW9Z{)K(ej6ez4e(6zj)0 zNGID&O!M@{Jh<&AuIonTx_WQtgdyOQx=jx$`&FF7p%$uAK8Ut0u+_)kfk%CVsOxLs zpz&~aF^5pm zhqk|ob-I}f-?V*%kw`k*cnDbvLOm$eVOxY(xpED53a(spn<$`MJ4T6_Hn)jFbC>1H zHP}_2rd(61?RP2HDC7O3hJakPA>};4VD{ZHI4sTU3UPFE7$+aDW6SS*HpDSK zX!Ct_?v(mZ>f5|COR=1qTA8WboM1gg|Mzj7pC@DIG{5}+xXxd5od{|qfxeCsV?DYQ zowJ}nn1FDXzwzE^C1wC}%C2|0>tp zpHW$h<_TPqwZKdF{|web-IkV6Bn?+3Rl_Xv}A}17PMX;6t}6mc$rqFy%@OZIr*p zY@nGFvHd@A?C28>0Gi^{i5Fp$m#Nm#gc`c=+qrCFgykd(}LiD_+#*n}dBkhYhRa`C@;+L^PdzbsT^*896 zu_ZHql!e)jyoj2J9$`T#EYpPb%<{1GsZyAu?V7rRCtUB#c*SEE&x*6hP+_07Zf^tS z_XTV#w@#Y#mkufXy^CM0Dd~{HJhd$cR=b>090^f11=hSj_eP0yY{xU6u7DRuYGHL~ zwY}Hce4v-qAqqUR<K2ZW;k6^jH1uXxKP+8cY`gA*Ppq3_7ah;91mO@Sro@H@#kEtnCreV0on-cL< z?}f}tXB+w$MAct~xuFV=ZO?ljrk8x^CcxB}FZ*R!aqH$@eSU zXTBFES8Sq_1-R18*aB~0TLs_sS0kF}uK43hem4E|m2J4;k1!l{l*)x6>5XQ1c&V|P zP^gn_qiqb#6R`bi=@0kb1f9npv||%LxEXO^QbMf3j*$Z(8&duFF1}>`+V%pz4p)KFU*}Po zJWJ5FuemJ*@$pVuEg#io0IkAOfpH|5s%+*bwQo1u#)t0TVAY1<>?VXj=Ce#73)a)X zEl@^f(EKenj(lwdY(;`+mmpfc-4;bRw(yxm%%wFZnEbZdT0XU!&B#T%!&aN7Y_<8L zu6bKsbw!hPcfVj-zQYzt*SGSzVn~qQ4kz1WxO4$4$;LO&{d43 z4%xQe@I_phZCj2~u{ z)7?0qCDPlwZ5wncQSiRCH3TUd0Vf`JYd{dKX}P5pt@zef9q07CZ*lb1+-`ii>$v8( zOM$TfCv`-<=KZpVnywahgXXILjmx3>FHf%?qG}(~POn-*Tg`aIPp_1^$Hq;`EBD~A z`Y^*=EV%8wy2thsG;+>o_ThMn-_iSVfW$$2?EzSBSI|!fY?VA#uswEHIY)w`gG+Md zgSL-g;Mz@@OAZ9lmj`Vb9^=^q-1ct`(6o15)jM@&ci!V@>Tw9JMUOc3kJY1gH0P$CK`OIW^n5>0!f+#%C_5!q5 zuH>_Djps^i)1I)B{_uyT|6+ zw~X<|<$V8N%)--+H(K-5c@U1;xWjSOQCll*9;p9O+l#^?T7T5m)d0wv(^T|)U?_zi zv*qIIPseOckpr&cag6LDntB{sfF3TT8At_(L4T7^+J*|t$$ItOATpk^ z=i)~P{mcW!kY5LvA`a~sUN{lzQpFPP}di?*e#f=L>L#yawQTPslOZ;reNwJ-%czvskzi?VuvFFyR<)&X;UTU!<` zO(k=T=7w&@pff)|5KN;k+d>UM8u)_}hr|a{hVMdy_Z|KW&<5`C4R&w^Fo5N*L7GWFrMsnFtt2)hd9+R<@{ZrgkYZ9Ou73qk-QN2X? zFcSc&e$+x1c3DRDgQse-?5DU_*(HRZOgsV3$X zErA-Ubm%K3{iraXsr5f9%#1!Fbw2uXda+jt2U6}b#Y8X~_>;mktogs&+A%FLLg{K! zw?DYl<*4~gbdcaQ$@zddojaW&9(AL3GX1=F;HV5@t$YwM5 z;FNF=pl^}NJIIf<+yxj5B6z9o7 zA0*FGpbtEhmJ@uwr^G^HgGoFxp?L{k@r9+2Ufyci6-ryl$1VHgY{^bv+R>54(&l1eHLn)-`pD_XinIXaQe(gs)y^=h6|(US0AZ7cc+8%^o`c=!}66Z zxHsbV*Q%GDk@C_HRifJ~{BfAn&YyjMmQH+JpeFS09xhd^w)`=3$5zE0MPdwB}2@XQDaBCzp z&^fH9DnSN||HRM8%yjF+B?gZ+ppFLzxvAxU<4dFXqac2hj3^w)MK`NFiuN#ydATfG zc-rK}Q6BeCo4BEGU<4RAYDk;s=t-7q%|e`)BP2L@aO@@v&73pcn=ekd4A7wv8W$zi z#XSz-AWk_p2V%pSTdS5A4Q~F-trdVyOerwDwW8g2dA;iS?Gftj`4yzvM&@7R zNd@!ULt{|^ys{s?94+ukF;l}@5tHf!9_1%{TIk^s^=1LL+ z`_yOy9tzwX{ge^FTvg-B)I+U}_&fcc5m61HE0Om*MY+Xef z%+OXct4c^);;0YlG??<=IqXUKRi&!oC%#6SIdM}u%MS1|s&!Ea6~;>8aXgX;4%N4o z3ZR~vZrO-Yk5R0}>9ibgA;SXHBdCbOLt)*I!|U8gUYnsh1<|0%hmGuuNKzClc|J); zKg3G4YH=!Zxy5QYQCf;LPNIyo)X&s&BSisNwj&LSeNdUUR+IXL?7CmZF@D26XPxTO zXuWXVxull#9Rmo?%n3u}-DE&Qtga(H70R~D`+i;~wb%4h9qc*9P_`iGw`f{jshw`? z9m=gMF~u_Tu-A$q^!qgV*^pC@$~0u}L+62d(t4f#I$&9g2G8=KG5Up%` za1`y3VxHP6uSSwTPGLXStQf6l&IB%WT{LM3ZEPe})g8M}=Ns`RDGQ**zVCdqvGg*M zb#nkcj*@qy2`J-t3TrCagk(qF;i^z;WLLlP9HowF=;L_Y-6HsrM>A=OX{!#|ub?&< zkL1*iUmsWAdAu3Ej)j!4!WZ^)GIVsdZ6V#^94%mqg;G1uV%zY-fGOehaVx2wPG63) zH}#67J+1gYY!LO1i)U*=)1O^+R!N?wXFTm0iEYXTnBEI6K|4IXe6&9edIlfFhV8nC zo!NhJB(;f}>q*(_y(6xBUeKg3(yDevMIp~Js;<{sYRIehq0DBpLTOxUsWIDMkx!D+ zn$L=+N9~O!y&fCzh1L=egfc)G%I|b*iZZ*?x{d3OncrFPf+TpNvy0nE6AbslM8rT< zIS;aHEAj9M=9=Lf#HpOK!I#Ltwof<(gf{dhM_b7g&KX)T=idr1Gl?ZI>UxMFDixLt zFMEQenlu=0IA@qe?8nZ@aJnv_cu|^yE#Ryuwew|{RtTCGPK|aF^TN^C-jn$Q%VD2P zO)pR9J4xZ?Rn52_ptK&?<^awSMV6uyNJ6r&lZThe*qBmzOFKz{S~r>!XZ8tp)E!t) zXzQio(=dI-!uAq#v#3Z3kCz0|Go7VSAB)OLpyRTzM1 zNDRcIGR;W4(b&%PzJh`Fb&&$RR3Uhqj59D}p>IdIDaXRVHq6;bTkNgFHpw5T3S^E*ilzC;5m zeKIvB8>`)4)45JkH3J5xE)`za2FFiL^@zd2H|tT_hY3M+&hxepb$ebKh@q-a){w$* zs=vQeD-GF$HQleX#8mIqJ4+1UqahnGZD<;~dXB74d}yp)r04PI+g&6PKWn;R=Yz7O z3%Y(7o?+4)^oF`h+rX`QzJSsp`sD@b4JHEc)yf^@UE83o8{Y;sOQEgg-B|i2URr|QzLtP-NuYHJ()TQ^e)fwHN)ssdC20sN zPJKy=W53&9lGbCqM)Z&_A%y-AiA$D*d#jpP^I+&*2klM`M@qfJCL@YR$~m$^n5u3~ zPbtQ5(j?}RwMB;@1`U?SyM$-*D6y|^sJ98KS2k17P6hOm8pAjG*?1`z zp`@GKM~cJtu%!4ZR7xa;?WRHdVY zE6;{fpMlaOT+eAA?skYmq@Y2a4ZWse)`>>>tesNbmiN-@>QYSG^0X?U_SfUfO5O$z=V?Cp109fOxyrF+QwvGkrCP9s2(k!r}nE zVCEQ$(f*y7kkUj~A3s-aYUcNDgQbOI)51Os(=TtrAj(PK&fXhWv-i|X?M+8vu zpiRtA^Q8Eh60^2OQJi5GhT6{zMe=?(vz zE#aKmM8`lok70EeHOmXun;!s>ZeiXT47moWn6(>g{3eOtO2b%HOc7Q;gD-oID~e@b z@GDTQHQgu&7ClBugRZ&V1xq4}LgV^(kVP5dXL#UxV7M_{YY&ENjYNgtQ`~-uc{=_Z za7DK+m3TBRgR`VUtxy_N)Y)^0^t)i#Wq^E}d8=-y^R?HcBth8WJo&n0(Fs?bcZNzn z0#E=AZ$WjDL_OY;-VqKsbKa5$>V)lN9R}fG4z(L5RYB>EVbWsLECYmPFDf!2TXD>A zsfjTOWp65qYY;^542R<90A&xCNXP}QvQ$MU>&Z3(=&Sc>-w3HaKIk_Rb0U08W0SA} zT&0~!(j%0Uk$MYL=$ZG?@~gD!eQbrf^uh<~w?};-4P|)-a%SE@o&hh-H3IGfI9{P? zx(~6N-lr}fvZm3@52X>XoIUzwy5Y8IymT2qzl_K6Wf8rVEGY;KxRwlI=YZ2PLAoMf zV!Tq&@SV;VQlxf*bJ#LT4>EElt&|44h{n12nABfz4qPi8X9pTaVT_Jm54d%sn2@gB za1qj@CkcsRlj`Q)_)|)P$$(RmW)b3)ge=C4k~HtQl9U8v(|;r-dC%iqjAO&by||*5 z7cZ(ztQ1DC6RhfUfd*}nfCs!n0>A!D3Z#+WNG50PEs~ec#kau31_(g=lA1dQeuJ&o zbshX{&{M8EVy{#YUeTrLRfJ`aEKJa}5)+i{o}ewh{y|3+4~v^1+*_-|x& z-gAp5NO#Yy9=K zYb9TH?PYpvwd76aW70s^#DfeQaGE?R#f8g1we$&Qnl8gzP)tuX=f~S(V9-RS>biIy!BV@DLEO7PubjmYRmo6Y7jE^kc#D$`Q^GG&ZQY&& zB>f_V>vkTXdB4EAHH}1%`jKR=G&!1Lu1U;(Z9NVg^H$d&H%+61*Pt|rrxT5KZts4IzajNxzn|TZs_QNTNc{$C`I_3^ zgeaI#qi#y?nWi(BTVKuVNGO#0;q*SB5GVVuD5Fq{gyO=8wAVS~szVqklv=<+#;*uW zw2+1uLA_T8R47=35wB_zb)(<1L_D;XgX_gJze)}L3Wbdikt8nkp;f@8alc}p z>`B@9@!xb85qIUpuf9;T>zRL(Save;Hz~>|_f!QKWSH|ukR!{a7Z^~#BfnKe9D}oG zSy;wxqX@IvV1FcfsnXF%=YEx9B2-hJUYvT{C|bmetGLw!4?=PXv0`w3liCPJ=$Ttm z1&=jXq5XzZbI>i-a1!WoG}sfcWUStB%6jHTNYzr9b>&388Ib9kAxBl?^Ndq@x1?wN zSVx+P2TrMGn##AO+O_6=!Yn|V@k&*^L0iLhR!}eN#068}6U{qVff9Vi@yYzY$6)8( z-yybOSr!D@&*`x3B>l3_Eny4KPG?@c%n8NieV_%x6(6lY(uogG6nh_B+sC{QtTX1g zMTxZS9P&PHNGkFRgxJlcT@VWFhibTi|IJs{1^WVE$cr7~MTQTSefUU)^w>oP$BiQf zxOLyYCpAM~6pw0%=+0aiLcQ)w0gN{S$DD@KIL{I$VUC%T8^`@W0vd4t59@L$cp?jZ?C`TT&0u0)aj3%Fa0*tsq55h{Oz{RE+)C|lNxYq)ZB2|<{^&- z%{KRxx4=4c+fz;iY4`S$=Yv##^^!Y6Th+o_wm^scinq+PlViQnz(P9VEwcq@@R8qQ z^ji_Rzq~m8T2=a0d}KHM;u53Z93QzuBuKiM?g4bNmgo-U_`kv(8J3tOxL?s%4p;Br zDtX^CTf3j&E4LT+JLmYyL)c2a>nDHiQVUXU6`&bvI_zA3nHk44W8mM^3aYsbN*e?J zQYZMNG0@;b;qi~O7_3yGN2(Xs3Z^Gj@HH_i-}0mL(*QXKO?SQ)D1X4ZaG|`sS-4E| zg5*kIm|KG|&M9<0NN$U@9TO}M6o3#OEZ5@p&-=y-{wDPVTsMUUe%!se6dbE#yN(JE2?@npsdxO8%di((FVKW->`>pZ8=QLR1{S_`f(LNYwEil7SV?A}Sa;RZ zj!H5E#p>UL-wWt0!<^TAix~ic%;8`gE=MzD3C%x|CmZtCmNqbE&=p5zxxQ|q2jx|k z$3O$Wrm1YvJrd|hQ<=fU9;qVN)n%Wi$5pU|ZS+i4c_Nl)hOGg7Je$ib+Z9VD$ddn* z@<(+9R;dQTWKgX9oF(~WnUUFW!abM|j=2Ui$+K&O{=qS5c;`=PMWU&7BI_Opt**OZ&;@R94! z$Te6u!&}Sy(1Xl7VIh>gFSs*hgii6GPHp6M_`<&@_O^aI*$}XNhYI<}FxoP9cswQc zHh#?Xe{1aRoZ=%Vhr3hDTq#ggUmjyQmRn|?9vpGc)273v=4sPmK2L3|(~gyS>)Lnj zb$>axc-?bY&)olvb&uZgb)TZG`=fl_gOwa^D!=Ah_Lp=2C(C}t;W7hr>X3Ul3lEeU z&cXwKd)cQR_}j}KAK}X$z5K72J;c?2HZJr(WZBOyz3i!L2bn9G`IrKG8p~6stef zQMQ5AckRSk{o+BK)mxtD?A)5jS-q^5ltj+zHz&GSJ=+E%2lLX1&ayQudpC~FI5k2F z@O-P1R})=0{@R;L;|9wu8SmRXSUv$3pEd+i$s;<~MSg=jMV6<)H{J-QeqCjR1?-{D zuY#%CX!5I^)tg_Ft>ENwKj|Y%ad=W*kZtlk!z>Jg%b$f~A z*K-UNcb6Hh%e&koykVz%ga~d&1lD3-~$pqWq$IGB-K$ zmKuam@_R>agxVlO(t%>!>-K+%NV32FD;zHN`C5^uI$fSH3PyF&I@&F)1E@hhqMb{pWv~ zVp@35D!sdCWtXL86n!~b{+zL|H#&qGA#aybc5;RmLUNnwVUC-N>Ixo||DN2Z-lx#| zsplfq*BN;@JjKHKY-}}+nck%Yf__a;fky8jtb!knB#)7U{nN5^K$2}*4k`S^X<4*n zjNHR8jb+s>ny3IA@qL-8yav55GexI~3NAkzK?~pP;7N<$mmAI*HwR4P1twfQIPIMOhRX zqI1Z!42@nr-PVu24(IdZWTXT;??9ECmlLUtDf?wxLKq?wE5s$OpQV9KJEL6o}~yZ#U=S`3|4UkY@{+{gXGaQ{de zr^w@U3m4PK47m~2x67|!60#<)juiN%4?~idlT>$el9%dr(^gR1bUB1px7*Je&EMpg z`dU}7*4`|(uO0l{y)Khi@pTz46j09UD6E%M`8{2lft0#Ngf*{ILOs?mjb*ksTK_>< z6ao1Ccot61y8GZM_gz%p*`h(R1ikZ#!l{o25?gxs^)8a_1ZFRzp_SK z;}=V<@r(b}8oyX_jid0_Yy6_R#xMReYkceKQfplG{pQy`G%a1<(&vPU#LT#gG{{x} zto+_^ifcGmZmxSEK>oZQMib`Bc?`Ei59k)5&e~w-$a%6agDqM7JJ6!jlL8Ht@p>yi z$18}3sX#mC%e@1+S+tljTwdpVlpz-gx~*$Vk&W6CeodpBrC*d8@%$`xp>9?e>SlGJ zZdMoSX1-8$8`it%CW#5uyu|6Ioo<6aDM{TpE{&Dyeu|^OE~jy+>}iDGh5t&qy>6$0 zgqKH0&^s&T9F{G9;f69zIQOOVt+nz#jnFoHQJT>BC;7F$AqzK_dHK{=YWugS?cbud ze~a4wExi2^t2aEI&}KP`evA<+(o0$LXu6cPueVBHeB4%V-~<*qdsCTD9&<7>neQ~u zlD+iQVY7_vi5pANnOXzC*4vrAMLxr90t>eBL)Ew2`0?w$T8iDyORsF__a>^PEo$k< z?ecIqD0|ZRY`FrB+9AJ&l9yWgV~0EtC2zI#UN#gA@Z`>h=3Y+~b9iN)bL6uix!7;y zk6};v^c%T0esaH&n*j03V<(dyS|%}y~PCv03a9uz_@Rx%-oqZmp-ee>&C9n z0T@T(58y9~$7Lkh+a>!0gt65wxf)c~a4}cK3;6cztc@gr$K{vl!Y-`j7wMN>GQ;BT zyjy06r`LANEL+5a-Dm;u6?e;a?|4@RpsJL0Qf{Vs;4##K)!)j@d-=w5v@Crsv3EK5F+4^9iYUgqQjr;iZ{sX|r0osg@#h`SdiR!0#|U zpXKuDX{?rNsjsV#pxKXJZx!RsDIv zt-=Dis$m2Y%~9eQ#F+X&x6(voF3Z)Z?iVO6 z4^ ze}nqRMs;t=5Akm8+j1AY`@wB_2HPk-e`oJHyZnwN%wJ9+=`LO#{f9h6hrR9eAM9mk zwL9#r^8?kp%ikV*S6-&WmSYJ~8dL9ktg+5F?#cDp5}$itp2IendJp(#$32k88ut~& znA7Ot1G$@^b9Q|QEg$A`?<3CFd>?btoTp(KBX~7Zsp>sn1u|w<@~Mwu4vcs1ek?Cz z>*8%eVe8^`ox;{dW4*%G#Rqz&0yc;_dZiK)3vSXYecbE9PX!HkneJK}6_$%~nfAG$ zzqcGzWO22Q9^&%im)*;Owiy);4Rg|{v~o>#gh^pjooiCqRCn@F2veQ!fs4A!3)ob@ zA=uKrmG=yN#I*v&*D-`qs<+ZqH#OY3&s*8S=h{~pWMZ=lIPvwLLtNGWibE0(D)D|w zJA+O9LLjlQO%Sd0Q}*!*+&~|j6>au$Fv<6aZv$pOK;g4*R`~3jl^N`K;Tee0!|Vqt zUh3>`p>e@@na@6s5Sabe6cVHa_}Ij)TBidj?hcMfLxPljh97hy{E2^ryT!A2ga$Mv)wNy-NTEYhA3C?(6mrx4wLt>Oj?_Fs#3F!edZdD7Lto>^ z_{l7m7~+peCE9lr++|+G6)r-KbjUULnrkqm?fiQTy4ZaW6HiX9)9B z<5o!NXjgw)v>d@aa#2|x`U!0R8s2Tr)FiPwQiN3GFBp;k5pL+HXUZB zZa+$zvKMhoxPV>Zo61TnSUVqAR$AbvMHQu1*p+mM((u{Gi5S)ZKV}Vp|NbZBsHRk; z1yz*tI;cC>RZ)(@Jqo~#hPolNBf%~v5J|0dAiR1W$$WAJtAN^UtVP5I72M-V{s8>RM;Nkn3v8lA=OA-jx)qu&a&TI^S|J7=H;Er zb$=ZDk-MI$Wv*}imt4>E`SV*+VYf9e(E20DLzchfo`F8zD31nsT+v4Pd8YgGn?0W$ z9=XfM<+-KIwU_6r=33_;jg`eFgQJ<=pOOOFA}nv5qY)M6rv#GRI?O-)8O4shk2!b1 zZzJQYW%Z4EixF-aY3dbg_z^(9i}TG!BflK|DPSWWi5ES96mI4)5n6Uf6Xjfpj-qE? z>FSB-@kBb@T47Ef9&HrWln7Xp=TC%DntO%k z%%@g6O|%qmHe!wJ-I4F_Z96IPLV`1`6GRKsT2C~(Iw@X=m;Um3rG;)%INf|+i8D$l@Q}BaYno)j(8ljZoXlMi+OLHC+>S<1) zTiq2)RJ_T{!mW{sZe@Lz~g&LeCqIv+NX9E zf6DrjQn$|9v+Pr@qp;i8cz^MyF8uEL)P73z2n|-HqK|j^GXTD|FKPAeF0NPTfqE~U zWc9irA`LD%NJEHZYU|DJdJj`(i*_N=Wu>4aC3-NUhxVm?>X%ri^nxBrbH5c6k07A1 zEjH%a6OT}}o=O$#>j-XE=T#NJusox?xfPqK{>u$Rfib8?JY%PRgJ$%EICpR} zSub6((2nfOW;)YT@$o#K9*D^{_oC}PmHN7=0>$)Ff4ghHGJb^*DXW(f9J+#kf<=b7 zJ|>8$Qdm0ILKS~b@vC-99aiX%#8X-eF*KTtcv`(Fm_MR=y>Z6*fV%cp>Uyxf-vDoO zrMD6pRc4aU@t4efAl$`OekPO-_Evnjm)dy}D}|O8_B1awK>SpuF)u4^BahA1G>FBD z_SCs-6SzP{a%4NopXdh_Z~w*~^jc#jL5E~Esn1PqLpLX68+BLGOKlO5KA0n08_S(J zW$H|x!|LQNCg6sei%D9W`H{jWs`-5GCuQDQI?Mge-qe5~4?rjzqJ-!U6ZL-; zph_PMfna)F5CdJ@TX05(1!}lwFefrL!6FsbpY6cSUq#u?gT45v0xbc=aa~V%uMbwD zDEd{!Gmw3)p6hFPAXpXFpMMowQab-)Z38|QLUr}OSD=-zD!v|94yYfQj;VU-?Iab9yFggU>bbSS@d8dr0}Q-?X1nAoP6@fzp|o8ot`DF@5k#~!o(b=-&8 zcDf^pj<*5N;E%+4%63e? z%lPZ3XYmLw^RKV}!Lu$4v`*Y}mRWT}Y2gMBPmDKPm=OEo;AL!u-EIqizoE73MHPD)>~bb zo|L$Bc?jKp7a|JG_oMi;twt#WKpqQ5DJu4tKRHGzVf6hdr3T2tZ#3xPD775Tsbdr? zVUrlG^yI89h_Yf~>+^q4sZ*Y<*^A}GvzPexiTw~1@+xi)dQS<`El;OOW0Xo^YHW`I zKrr6s&A@>#NiFpGtBSV=BNWDDd4Z^V9blhf>oqN*MoY zLCLR%!wu>r1eh`S>T&+nx(0kHLM4?4)%y7QFjB!M(8Nee@_(o*BMk2=JsGh8)LSDK zZ~FLsNLQG#BOfTCI#9~~_f<-H@V=7gz77h(^%ydK$mK<6#D_|xpqmurZ2XZjN(Z?m zxAogw{($|*s*#;cv?fP6i=Vq6qf(!j7_P*8>ymbmC{`B&8#0~f6@S3 z)K68ssq5ax5mdkH$O?{`y96MMxCoAC;Xjf+ci&Yf$5`xml`!=Q2o{8R+Kd>N}QTd7)WvKk} zbT^f6o#vwQEa_pSZkpy}do5XEuH}Ir=2QTN5VO+X>V^QU(~Yardf(U>lE3}VgBG_K z=ud?S(}QU7J2O3W=N?hpiC9qyba?pm3UuL}nI%1KjPSHcA2zcG;tFp}REDB!+lS3$ zJw8-1Rsu_I18^>T4oxsn# z2WxooL#?CR0+#S3{@n#;Zyvl*4xE7>e50x2$VDdC!8e?`%urZzZBME=6Fc?J8Blol zqv)B+7^ZGs>IflADjb5cW-5K~l#lvU^;C!*dg__VnXR0vykTB8(ObM;PQ`}8r~Ju! zI|5ne(-dD=Rki%#E*wFe9=KJtEB=60wQ(9m9XnlYTf|m`lBO`ktny@Cg1qKYvlJ_4 z{+U_)>?O@on9)?@u)dVg`er0m{X}6=h&Y6`qR{lTUe@&XMJ&p6#wQBHiV7!X7KPC1 zPe3FIG<-IcPlxEQF9Lr-HLhLwrqQjpC!;bW%irHUro- zR^L#MdglldimI;moeK#?Q&&^nxk|*7g1$+tQ(W1I7ywQ6w{ zxTu9NX|SXwQ3Lk^`5~JoX}q!6{bWN5?O34vBqTULTc|W-yW+qvu~Y_Q zvqp}^XBz0d^bB6!(f>hcHFjvbaR4Voc6?ibzr^C8U8BfxO+`<0Pew5(>77X4PX;J5rvKH(*7qhk*V~)`iyd8MuchFCTRGf?>}N_PXP-Q58Ay! zsjA;Q0S-sc+a;`fcAC+lSTxXHjn;pqw2$06wQPr`FlN8n>9pwE=>QR4iIX620@YcmL`JGDaN8KXi~B^0E0u~y-XpSZ!!a1W$y^C( zZ7`)N;i1kE+Y}$cd0`b~Jq%&(Y^5@O;HDLTfkROd4sx@kh$o+Y<* zdToS0t<3B~jiAhS*4m_eX!y5G@m5A3|LWxKva6GuJEj2fW&aINJd)n}m`M(agJw5R z*ZYJ}7Y0vHE6^0QiXUZ`5>RwTxo>aN0?D{T*o!%ssz#m!LZqpdsF{6Rxy+ zy1EngphT*&OR*V_dcX-7D7r`ywrOM_a~(*qRf#ckSUAl>j598>VmE#r`uyqFeI##@ z;}Zi$*rYOfRV!#{`}RNe}E+MnVRV+3w)tmknE}mDJ(It^N3rV0>uJUwr6CfxezQlp z3ct(Md$ENscZ&PK4eo}lz7%;}49Z^`uSZkBsVa~!MN_hiZQ1r)?483kf zI4wJ=)MdZNPeRl2kgA?i7V4&l)6P>|iwZ!qFCZI6p2ij%Pn}Nli_sK#x*L*eorb~# z@fxRFkf#`O~J~wo(boa4t}hc5#m;d4^9p*(~@(L zRz}j1bJzu)CmFU=Un)AMFqMU)ZH+LT$T>`K?0In5v()-Lgqoh@_uSpcP;gb1W3S%m z`s>QZJW}#?gMsH&wLF<09Dr9!9~dme3(9`bpoTEUaCh`~9=4#s#JG3RPL44)J71Z} z$dskw*ra83*p%~KIrB@zvpQTL;g_r7CVr`OR)-Zi|3VrLRLxU6XjQY+4!R3EDhQny z=Bm47Cbkth|4Jeb7s4G+!nQh_HQtf5p+u6m(kVEQ=Izf?aD;O`2ePeIpxiS{3;}CS z1#(Y&4{Y|!PX&@N2D?nzBpgVZg*>ZKwEni1>nw!+xqKWgyih3&?~P&$8A>1EuuNr%hLepX(G4#M%XGQ{$wNi?dI ztAff}JXL0ZbBE&>vw0O&`bFvIefwv#c{rej%&Ecj`8DMQ*f^NtPka%M?~f|a^QNfl*gRh(^RzypH0-|8R!wrolZY+4u0+Dq zO+zEs00__;jy7QN#gRFH)~_BLLNOnAG6A$z83?`?e?zILJGP&aZYWi}kL_oZjxUy{ zgb!eBzZNX}(6$?jr**Nn7^HSGP*uo#iadXc$X{VOd;%v|2{L$!yY|yVRHY7|GxnxZ z1(sW9mm(-6gzsqZZ{V`S0!Ct#C3~&PQ z^(Dz@Z%z~MD51u0Zn1gKyrWcsoL+?jf9W1f=kDO-@+HOGRU(b*R6lc9>1X6qO^ffs zZ|69f?kU|(d)dU-pn_%DK{WiH(!$86n%3M?SjdzCh~kND;Gw`LxXFFRf*!)Ib$w1S zo8nG@DAka7eYK;5r-ohNjiW=}eH^yq>Dqmqf?>yefa$!#r!yw30pBdHxF%JDAMmC8 zU^xt09S$&HUP$L3DB%_PQ$55+>ey%>f;tO;zdX1 zeX|foJ|1?KO z+S6Ve`X_^UkP_3jl{ThOnx`GuT^nePr@e{sq6u0uO3J<(N{>A4fj;Yg_GY;i@akcP zgv;|!Wo?~`{0bWv`4_8|J)En&?9~J`o094cMFQ@dox|v%x1AXtkqA75+WOfm(&BSJ zF{Rj_Dw%qc+1Gx!WF-cNZzYCrh^qW3%+C(bDR+HLnWa_bDEgqXz%h2AZK7;HdlB3H zzK+!NL9x2hgLrixZ40muMg&jNntefzuL699ST8kW1X9K^9a5Nq1DTF9+w1$E zU8L6%bYlD$(H66Pu+9#>bfCR0(2J4^qQG@1RW4q*AI_oo^utkU#o z8d%=$8MkqVmsm@jy_0+MAbt!@6@};gU>`DCby~Z5QVDEoML&hWT2R#LWQ3ni+??tH zk@6$4pNVTV#oCkKqWo_>!B~UrOj2OJEWkw)2F#77!j`F?CYATX96!A#efwreAZ7nD z-qTZKuW$=ow6ZRZtUBG(q|!54fs&+K=uJru(i8I@8vq&0iNqa_>cTy(boL!Q3fDExVjjYU0^}!`Cvb z*pU+sG08Bo2_R$JcAow!b&TM{#z9>3k@NlRSI2RhpQrm9u zKX6gcMHiM?Xgjc}W9=*#SW<2KK>Xy@w!25iyXgiM7^t4eax-hpfwXJT)s5nGm z|5hS%+T?KW3B^jp%#Ecm4s)v8N70;^;=Uu36Ysm0D2?}hGzpW&xsz*^>^qWc0e160 zy6?%weP?L4-fEdI3Eufjm5V$7A2sn28dJ>3Ky z1x}N|q}jC|R5Fv^DO_T}je@up$^E8D#hLVqGn`oh^6l!<^2c-E*`b=)oz|GlyACkk z%9EPKnlw4oZphhD+PEoYn6z+Y0)yKU-b{JkTj66}oGbcBBRfa` zK(1)Umy3=}V0<~j>R^01$?Eu^3KVQx|7i9kp6RvQ&7f%HaljjXYvzgr<^gZNk=(@I z-y+}FUMg0%p1R9kYR+te2mhd?)pjVpHrU_5l>nBp+fs_VR z-(lymw`X=o3jEUhkt?Q`c~PFmUi{gq46^TJ9{+`V?9FJ+xRhFe+)MazLRaz*PZo8n zeJF1)b|~aGeLt|Yc9pWilbI87)~pn}JgAUTe@U!UM9jG(yDnaHujF8EYTX2M3?gp_Jbp>ll!2U3}r@6}JR*7ONZ?|>YCuOR+lEyyGmuCLVW>iox0h)PlQg#LhJJyFlaHnj~j*&F> ztg$kglMOyJs+;|JEqFJa;$Lfp;P!ZXEn4$hE4X#0*v!E#vPZ)XkbvYW=t{nA>l3ipOWqn3fSJ>herB7@Syb# zVX~S%pG~@qmBMiccqtZMSt;!txjSkI21{m{g)L{WCBrwD+(o6xL65SdXj2uTf5oL` z`giVA_ewjJS!$*6sZ=j*%f8A<_~2?z z!YnBuBYZt8Gnz6k{j!v<N1aj1T}kmnW;axwHdsT zk{6>vN4h3=)h|RxG&mK`7&r4pqu-m;jI7;0#a?@1VT$F1e0|tE;~bL zG5QsEeMNRNXH2)`QG#wf&~Db-o9gTaXU4`9A3<0~X;ba}@#&jW?Tel&M`&|bkXQpr z&A(0wD=}kCn4l3aCNuby)EARWN)u_XOq{7(y1mpAD|j6^Sn4HCd=GY&Sz+gPx{2=; zQn!@gzmS(9+J#KoS7!XS?xFsv_O<9kmebxGKZ)B?UIztcHk+6LZs;CNPQ$zTV1{fx zSf-kV2b@`-*x}^(3nlbP{sQ$3pM&LbjS_!NX%8_)=w5^Ix~#s*Pb_YTDMP6HZz(bQ zx%)~}E-N$24J|xUrl+}wn>h+<)ew3Jdq`%!4CV6n6kun6JIw10Nq?f>+htTp>>0je`77&Y43{`79Fh%rR9i;HGSMb zHx@l*ZMh0%>EPrTVTdE4b!8zuJ;2w91n(r^9E410CV0dre7%;`rOzu9eK1!uSKxQOelv(lao4@wWZ zxys%K{34^^xzO|zDa;`u|HX-1q`f^Xj2tZkyfL0R_g*T!V2YWA2X$U;ud3T{)WtD4 zJL4slV;~9r4nxS9GHZ42>5?qNLNBbf*VbP-;a=*T^PJ#IJ#_YkGDC3d+~48{Rq5+5 zpmKlO;o^V56bjFjVhZ9%2O@#~&dz|GDeNsM)7%yLZl_Oo5|gp~!i{)@x-ty6~4~ z&H??B?SG&CouL0i3~}+_PW!sKS4+(sCo}CDr~bm5W%`qQqcrtX{OE}CG8EZ<5xw-cGObGfl`W^grg1nz*$>d>BlbY@S_PFX{!01>DPAsgQM}5ncu^zy z4BNzB`qenIX2=tnYcqEzjz4N=))?z?u8uC)kj%8w#m>XXME}#$06O<&a?ii_Dsvi! z0VJ%gbJSPKZ|Q{bbis*jd<8vrLiGQf>Y69@)9w9(^1huBL+dsrn@oHE;NA^eHYLY| zEX3dK$~D!&{muQ?dKl(Difpk>y-=>4xD}bSpNbaV zJdoUuJ^lZ&_a0zTT;2b;GYbm{!XhkHVNvW2%xiCqJywVsqp=Z9u|zQ@@l8yWvNN-@ zL4ia$SP)1|Y(&7eMo}S}1Qiui)Fc+LqM`yyG_n28y|cUQvTD>A^Zx(eJP*&aOu7Bs z&pr3f`J5AD9~TTG3$?D8Br=#J0j7~|2Ns#vNOu{Vy{@s2oI}K1jRm|~a!`xLdB(24 z+eBv;2DhSz3WIgGYu@3^-L8?(QGG3kAG>`zj(2i%Q_JgRj!cSKr8d06MOFjp4}8c!3k{=CLDcIyA4ygchnIdz+6WiiM7%ha!z;l zhPfSeGjLq5bkyOoiD7VwmY(v5pTdD%_6Z%>F~%_s2A|V(l$xB@rrYCu%c}(up*mkE z?xIV#8$3?!i(B=3+!4?7uIdO;s>(2IcfPm+9=dl_t zmD;v!Q7YsKah*xOP2h1P5(enpP$bg^==?}m=UvnGkpZDA9DHA=g#OpHQ?W(s2I-~} zRM6bOrUy|}XjP30_^$~S@Lxm)!;lDF4*~^}Nxqjj@SVbIzehR)<$Kz7$SbZI$4H-bnK zI%B#rlWzwuFX}$P91`xLB*lM@DE1cL#hgQndvXq?wIF;J-wQq%DJQ;I3og&X#EF_X z2@NI6!2Ooi3%-0ww;#JHhT(fz)O;4+n#}TM1gUe`qU(pjNtS<@5ItlFuUONd30BZrv{NN;)pXiA7?&>qV7#dyrlJn%!#^O z?ARGDe0zF?gB{xj@-#dJ9y&fwb$B{He;9jrLLGhtLUH!1h{45%<*%X8k^JYY_;)e? zyKm^oBt8@x_a@dT&z)~fFsNh-0s+=6+LK4aGDDFk-;*B2xX#e+!ncol^Td#|wh!M3 zH!2}Md~@`~<-kc8P2*iY1QLCCC)b4Q_T1MBu6VH?PpR^-EXr;l>wMXUI0GwLd>l5uHutupXrN^K{LmjV+r+<_W}f zja!aw%&5n2!uKQI(e+kr+<;OSZXtDl)aTvoP;Qf9=y1L_^3&q5TMQZR>ToND?(_nA z(hq+G^4-t{k^{Glfyh&HJRn@dKc^_&+!2a~@dM2gT=rkNST1fE7Mm8tXQHw^r~yC7 zVv;t+kk5A;U=NLefH}JE77?gPqh~b4FJTiQsCQfg{93Yej*j^9F_bjqI}()iYs3?j z?AC}UC^_vz9Ysm1q?9+}%|Lah(L<%&dZi4XTMd;JedEkfX+Wq%kikv=JY5+6RLs+f z*!j^-c?y;R&H34QHz5|0#>PLs6$MgPVH|*$84jIBBL)oyD$#5HJn<3 zq%McFx(IgJR!dN9iZds%6_0WmVQAKdAIri#NvFhjGp6uChIOI*`$hzOm|g^kfX^8c z-{eux$^hA+JMWD<3) zQRqSvbwub6ChCaL#dqRy(Ztgdqr+*wCg2 z|GE)ldgH0nu`tY52kwh?XuSeMIc#nO9OC#N@h5GGu01_$s);G2vEjXV(t^vq_)7d} zQQVvFgV_Y8QaxsQAAT^}$)P)`yx&7S;dZKy%-(T*`KAO*qSJI)SOY^yhOP^XiKcy~ z+m2<24&p-*33~vc`1pK#+Az){?G6s79(Jf>g-+*1kz@W{#{~)}@Y_@>6yPI_m z&a@@N5QSq{NV=qb*e2{DD|xJJ4`}R`Sfi8o0LzsecL%bn2;tFjw{Ucf80Z?w6AWDN zm8>u#1~z~p+jJxF4Fp0z*s%@a3DM9!S7+8+yXNX1HhxVWtTl?36@{E!9mQsPSR(SX3X^ocQ%90h1*P&f=qj3aP( zcLs&S83hQ3<-b(JAzg^O%%l@w;7p!i;>DSCAx?h_F>%F-8kpF1mONKx(YaExPxm!W zvZaub5a$JL#>6>7;oJN-ph}J-;BErR3ph~W$#DcEDQbtmOYt%O-D-Ti{IQIWMF%K8 zGPA2y4b!8+v(5MzJ)7cVkN=wSu^k+H4{LS_%HE?OsrjCQ2$JOR z%?cz#Ki~;SPWXT}>COiTl8d1HLkg0u4^xm_H8ka42}@ZuVf%=GHoj& zWWM3KF$>pA5$*e4<9=hQ+zzM zit0xdIyx+AC8!@2mes((0eV?)+|EMyaMa2*YpH^C^^~k2-TsKye?UAoDgqMYiAq*p z0|f`nrz1OhKJA99XLSSx3s@N1fTu7R48`Yk8XQ&TJnlm(fIF`nZpOmx3Dt_t-h_uL z6%U#8doAY@x7Rr7{VgZGjD@ATaI!9%Q1AlonyF|-D#$sm1@>v+%0)WI?q0+ly#)dy zEq-I11Hxcr8HK^jGMWeOt;WLCMLapBpMKd&@grE6zlbV+WtXXt)=%d9n)G4qGB?Ub znwe}C(q&h4#IShh6`lMRY60Xe;uz2$_@1~Dj|0>c(K!$BelhpTCGD@bzNzx>oMN!dS~=Xf%%o|THELU?1ftRkaFEHxt%B?C9w{0AqBSuT2L*f z+HC6zU0(}rmJq07Ds*k_CUU2dMAW6Rhl?Y3MlSgk?hIs<^!0%&6}Y=ehM*;U1G-f> z$KuDxIO`yGFl7lJK-yACm0?J&)CDL<<0?>!rf)ZVs0DO{%4H06UCQramK!oUaxaqY zLH5nCdZ6ltRJysTyu0dN39+?p;NPKE9dw0OSpsRPd_R`AgVI#&F+4RnKH3AiFXx-$ zwo1t?Zr3zE(P9^^l<_lxHaIHyd_r#tgbx{|tIhL6})(5|arSr8R zJ+Y^|YJ<5}SUlo=!|Rt|R1i<%pSGHvH!a$!x@b48IRjGk zb-4F?7}5c{$wklW#`Q#qbcUqQdSXE33|@^jnE7$fwyyWKo1%W$aaXsaP8H_ib0gZF zSiCdYb{Ykz=v-?X`TafG9kyqn<`JWS?CzW|X3*wSzOC!cPh}%_2Q0M$qdt7fzus~U zYog=Jp1+Xnpy0M%VO!P0@4-5fn^WgnACcenS0HF%&r#@xVa#XzRAiVK{Qx12pPIJY zbFwQSVqHHsjB7}n?IAaNM;PbjdVEK>2`B&>xDOW;N~F+pCRT+feS>1ATEQ zb{QqXk-YyYj9kONiZ1-NuQ9&bNPab;AHMq8CD}xPbam<_@L9{F4_$@HGl7NB2zijc zmiJ`uBKNgFHwH&+U4PnB zJ5DI{>Jr)53&PWTHp8nBd3r@<@%8X3lsxl*Zi6_&PdS)HS79cbCocW|Bft4lHeVl~ zxeunZv%Q?)KsMhRU+ExUeL0vTA6vK_JRU-IY6yqa5r`bZwZ&I3U@|Gebv;ecRnGJB z5RT*-wVo%hbeCV*BEQl@e&zOhJ^-Jgi7+9|g|FxtfC<7kVEb@Wg_Xl+yXdpz&&i|Y zjr2)LIH$!I%1=)9gp(V2e|+mZIfsxhdXmWO(VKX3rkuTrzMk{~ZPY&bm7$wyk;pi)hb#Km4PO&7)FyHlAmQ6X!7sn9^^Dt#^w}?RrbS#=V`LZxjac0G>Yp-7g+QrVN3?U z=JM^$Zu=}l;c}?tE+CN%Ju$=OQCu6EuCzK`!gh;v7ihXem<~(1vYnSpxlsM~ ziP2mr^DU@e<{H=&&&*dLsqRTi|B84gYz(M&@~2qvL6>A75DRQ#8^SC#O#e-{jzRr3 z=2YA&w)lI99wQ(Xbk?o=}6EJGa*OUnL;4ujQ{)k=RnGQAC4JoHP zph*L@lPxZWn08vU>Q>Ihvps5*jh{2|)>utusWD--WuW#vNl5t#H_t#sl$H`P>aZu8 z02dHMLn3vC#P?SB2GzD+_DFq>i(>L1;rF;?<~B6`BkmpiIiQ>CYuNNh99k3RLH@0{ z&y*Mm3LW7<(w(^aX~(!=W@K7%pJ22?uYD&j1`}vLn(GJiZpS$q*4>FiN5J%T$Fv-O z4dVqr+>MKs?>Nyro`xCs;=&l_{Gx1a5gMS!FxsKS5d9FVoy4$ts3b3(e4*w8@ejBrh?F;`<*y1L!^V&o>Arzt8I1K5KJBbdPnVCIhhxE z$JfxrNn78Tkq^zt*D$d*e&16rB=*;SX@~j-GX{W>1)-4VsU;JRnsXR?l32wAm0z;y z^MZ?{fNZfOT_e?@r5m{LKmOFoaC;H4|K8RIQiIuHg+a|V>|+AyZllE%VDqq&Rq zsQVi4jSVWiW|P;7N>T-CZJbh$MV9bpYh!Xv?2`f$Z`jnlw8|_k#~??eZ3a;dw67W~ z&lqn-Pmdj{{_zi+#F@VvlGNnWvL%_N#DdJS?kQXFE7EV6dzXY@W$}`9t~%weP36jO z8&v+#fsj4Tp?m9_DCwFuuR5Z|<$w#u)5xqBCQ+m@T zFhRVef?1}wsa=6&IM&)$FezJO4^*=?vYs|u zBTqC*X~xuF{N+w1Tn*w}^7;asVauFPhJda>xAj(7lBFDa6iF1D%bvXl;Rb4Kh27}N+Yg(@u> z8*JGktIE@fBHtSuv@F#otJ_OS1*o*%Tx<=bd)Z9GpaT2sX&8#)baR(uwf&fMDC(en#dD=ijZ?lbyxCjZj-V@2 zFVaouO6eDSo-+Lc0~8t2)fnBBDm6rMA=_1J=egEq3~#Q6HiNWjCsE)`|(Rd{UO@7AH=K}1tF2m>@e%UgI-az)>d?k_vnOKwce(>x*YR_(Po)P zkAe_h(h0M1vrP|`ZtMW#5@T07;Hucb3D-qRw5YTsTCiKzTXh?yXwq9_y-L5b$+2Kd z2gA5>5v?7KY>UdrXIt#vY@Tq0*U91~nQ!W4+ijYCdz)eG7;W4m*i}!#v3jdQJtT@{1y)m^^2Fp@bmm__U{mEE_nT*a(LU>OCD(N7NB>~cR~rxA zf9hM%DOl}6tG=V_HoZ00YvW;?92fp{|Ed2toQlLB%u}E6{#m@FQ@`|Qn|2o*eT=F9 z4CxfR4_l2OWv0uw=)7Nc+@>YBf2}d^)BdJ;fAeQ+`5@PH-WL_yR4V)ABhLH#GAf=P z3S=I)KmlJ?zO-ai9L0^&6EZ3uDQPvM;*(@Ns6bx$q!jH^hAB#3q77C?lXC_%k!jh$ z)6jj1_6?RPLT|L%U^ZF-`(A^1DOIae9w!MAD+_-0fi}yv zUNWuR5h8ZEdBXVR+TO}kAAG~fe8UCyEXNZP9r&hcb7eX?1`>(f>S?%|roD$ma>LaO zZ5;-An0G!!tMHjH@H6c@SX%yP+BJA{+6uG<-v{X{v{6_^_s>mr_W<|zqdW~mKi8r! zxE(NgC9*{pfqo^D$ag^2O0;<|1#T71FkzMU9d;j^cHFHE;{yS!>9g$BB;T~Mb{eJ; zQfkngz6eIFG38z#B2!=VOeunh0>Pzi7d^+Jv?S9+?wqB<-*zH$vjnJi< z-V5%n!%kbV{ZK8{VR$}EI~z03&(gjl4^dMi^FBOV`#!dBU$(Xvv&-O?gF7&5rcClb z&y=aOX3A8`Oqt4mgeg-=nKEqoWq5g~mKw)D5>aLniz+3dPgMS`beZVN_K!)IVey>f z%06u`Vn_T?w#;`Be?Z$9l}1a-Oy#qq%yed;=n&b(*5u8wH*dn)@3kFB3+_vssg!9m zdt};7)`Mv?ES|$)Uv&6W)(jd`5Y|lApR#5U7As}G%pRF9ll7#0nS$sJWMm(UFGEgW z9-A+dCw6!gzD)8n<;zrB^JOY!zD(u+24AL9=F8w|5ceAYBz&1yDLAMIIQ)&Q8Ery` zzs8zjw|opI-{QNPDF=^Dnpp{>88q9%Bh#A9naY2hIn$3!)%%iW$WhtyQG5t#_k%ez zl@^?tJ&(hgVQ(%b-5T=fl$nx8r_3xg9YImr%$~nOn^~XpK-vs>^ysvi%v36fk4l?i zi__s`xP{m~IctW+GqZ!k_(5g~ekP=uw>CuBIGZbRXlo{#4lo@vSW*bPU$(Tu(88gx&GiFvZ5b``}vXM3;Jt1v|z4;Xx zhx$)}HN$3Zw}yttB+amRq-KQ&f6AGulsPk%|1f6;?Zhi(J8>#`wrm-4N^P-b{S9Q9 zeL7FhSp$T6iG9)%o3-g=tk7^(bUa?HQvn19JJ|B_>5&d>k<$uXb( zOOE-M9Pe~?`;gzcNdvW=;IHVt=c>RcB@-O@bVxybAqM0YmThgon3_Hf_*iuIbf@Y1=h74)VC}~t_ z#(uc9hhUhwFo5_=uUHx24Q*b?)Oa{>3PKu27vE-|&cOWqDTZQO8=!z{kZrehbLHjjv|#A-xBRp?%v-kR+fU22o?=sA+GMnsiH z=g?cnSwcdY&t^YmGk>=5jH#1JPZ%%dUiR93$)Xec$mV;1hR(#aCCNbrx)EPUKn*Fa3p~OXa3lq|*A;QcTg|V9A1;#Yhw3OWW zBn_pdZ2SmAT$@=b)cZBLGuv<3$2Q4sCX!?s;NE(s2ZVVrofj2NcYvtS)AmpvII0yy zmGcg4?oD{FobSObfUnB=M&z=%obRn%Kw@zyAm-=u7-pk_4 z-CPCCT-&KLge-4nXZY|p{te5i9}EFEc>{Xtz^D*y;JeS8HGzb=VjVdCoIsq9*aAS_ z1i=abV9poKYFm2VH_!dN^%ir#q^@8+_ba|=76)k_f<0Tl093CCG*S|w4K3(QP5RW? z$u?tJywH$;i$^x!b=ZHKI?B7P7KX5yADhOPN;6)P0S+o#Y?DDj3K=O%ipWdGa%6TH z34p=kCFMk{O0^kZ?J~1i++J)c7L-6j?#x!7Nw-OsmuATBCzxnu=p;@dG?QmErSNoN zbDs9J-jYgsvVK|##sGPlxdZMmH0cj-CD0f+lzNgX_pMj@3Y*&A{pk@b1Wqq;)&cbPV!Z&Y{s+r3oS;qFT|I2FSVg+BoFcXD<;4*v2#Hc*S{kdTN7-7_^q{L&*;?cLShm5YJBo4)>pTSo znIG%b!t+=?IzQ60OkG3BhG+#vr$^CdoAlY6%+n)tgL!($izQyu`Jvrv(=}(dn0vH% zvt^HBNG+3uIaJDLrU2lFJU@h``_uSa0<8 z)B(loI&|tNypF9P@nzVueWszMt0G>KY45-62b-L3A0lI0We-6+MU2B7@8tq@Vwx>w z&cN!JW?x{o;jzu0XIJ}xCSUCAR9lXbj4`&7CMyE$I6Kt?LeIn~ZXTo{;s*_ee1Hzc zX>=e>TG`cLMy39Jjh!(xGQ*)yC=XQJFRn>D^mZWA7rHA_jbYo6kc)Xx21U_fn~}`^ z$xtvEXC09|tDrRLQ-#4;{VP)iV^EqY*ov?>g+q|qODKCLK`AnSu#`wT1oYNywe}aA zhMYNiA5~!uM7%A`VdI}Nd5SGQOy!O_3Nyo5gv-t!a?98FGxqROccBH*GWqU8e^e|F zbQkm%@<_m(J=_@%bT0`Vb1@S5Cch5!`POPyC@BilDmTHu`qHjTiES8$xn z3}1L_^al}aDr4!$2JB~1Z3&UoU&g}gXKb4KD;_(BR=%jY<1CZHjT)xx({Zp z`kOE-^O{Le2$Cu?ugQ|4*8X8ruQNAm0+9iMD4ThDAjB5`hW%vLx(F~bCu4-wBtnj)Mc`czYqSE1kaI#S+&@CjYrOCjBjf~H`a{JCIX*DY z0ps%)|JtLDp|v2W$qLY06r$`Rf}A)A^_=8sC=`ime;rQN7Dp>QRo9`bvsfKIgM`j8 zh0kcIe`r;$z0%(&Y>uTvcoH_p3&K7X>XXNy_D8WjMts}N&@n|Tijz~EG`|F4S zZZ7mJ(*@5B8T6x?Vt6ZFpuscd&lgD8nWW=F2pl{hxPkuyVHz%Vx&^`o(xSH#g$?ra z2$-ED_@jFNNs>Tf~0_rUi+L7~-5-;p0G=p^;Ec(K{Aki6iE~2j=SR`cN>ru%<9usZ| z1p#^M*P+l?^nn*rg!Xcky1}<882k;Ly`>18$!F`S1Q+Tlw%cN%rO{{W^u;JfBOqb1 z(3`%6o?_STl8s?X77LB>k>e8MBlH(f9--e>!{{YKFXEAV`BEx`JC{-+ytY&p!iZ%; zuxU`|EPLpnJ|sd@bLyAU=!Ltv?3}BKrTkGR+ylNB0-=4Xa09!b^>WlVuEUJwI0zAj z-&mja1Q(0ZM49jh6AMrepX{jvlS@sduQ6IrvN_>v*#Zgekzjg+@@0DTYqnqt?ctgutVAVpbB=)91A}Tk?v=4o z{u=}mdZ2uR(4O60Mk?0^Ms5`9k_kf_rQax!018Vs3MBkMhfP8y#>Hs9S?GgHLeyq~ zgi$Kpj2nhaq^&|Ii!X1>#g#Z5-rFva&?RfP3-fV; zciJJ0rk(UF1a1)WVee`@H~wfR)-3{(cM1d9n^#FkQ!{p2ozZy$4X$#$7PL7fw1CBV z!VIjJQ$A|V5wJ5~=&i){4c#OHlP6$Q+OLHmQ&T)n(a16y7fl@mCK0tif%UV8@_DoP&#-g`Ty~%da!&JNK2{0tvB{z8h;){2N@}jk|wS2aW!QcF>e> zNCz1lzQye?4qe~xgx<_b_~<(vwRrgMJA@OA_3|AaQ;mXv0$~EaGOs}3@F%|jn`aE{ z!BtoUzaev}!W_ZqaVFD4+;dl26fm5tG-qF9a#6%LFnfibq%pns361b)%0A%@3vsLm zfrWxIi^^lmLV@yy#uW-^du>=yD0ncY7b)O(R*1D7Z_=VwTDZ1fAW;jtAHZ&?UKaj? zB5Ze1s2RFo=t11?Ofzx5i}CRjcmfpxFP_A?p#A1PFz8oICq(mN>S-_Lem_BM`z&y zdNm|AgGpzFx+pob&sO8&z8x|y?mA0xvCQ-canbas<2f@fPCX~Abe_Sb8#}QPqEvVYYKP zx5ivbMyf6lrk4r9cz3PwZUYE22&3Uf8Ga=~h`uZXX{Rd`NCAN~->|Y=h$7m!Po=OO zQ)U@cHi5{FaRG3*QXo-u9IsJuO}<9<`G$&X0z;tw+I1YU%pa`r)KEq1{9P3ttk-@M zHc>d<0udK*5V~gywIS?=pivedzCWnK&Kop?gEuJrO}mK@iZz(|J6#fX{!Vf8&hJ?A z!e6X$)9{B}@*l!77xZfTwXr3^5ZVLdP&EBk7!N}}LEZC@Tf!<71O(J}aP&5&Sq-JP zDXIqFp{V-u9g3=R?pUH~z};$8ty5qzU4}u%-6x%Pdo1!9&h0VQ`2Om$Vcb0mo{KU> zT*?=HBU-NHM(D(2MGNTEz!65owbpQ+5pD64gnJpJ5D9RCLbL?V=FW%YdhM=-r-@_j z#F`Mg$_|4VPc-~$Ck7A*{li`)5L#a;5(pip6e)z#kf23M(F~!-mEsdZ=uxX~I%@2u z`j+TKwmb&h^7JN5Re0miwGK$1L(523gKeTF2uS`3&cd z8|&D>vX0d|pJ^^)IaY*jdhk=3#ij=}IK!D*# z%vJV8Mdx&Fkg5K~D=itvQPq8<41 z5&}gv+-f04;c!iBDUQJ!?`bLC!k=$i;cyjiCc`y>D1~H0s#+iyD65(ZRSIOZreoHp zjd9FA#@MVIU-1Ob5HXm1L)-Cu%}weTA#}_(hmd9(#)OJW1{(&ZfGTpsQmPx4(^e!p z>eaSbor3LP7$j1y8M`c4wZv2%7Byc6tCRm6?Y!6jBi_TtzurzX$8m(Bb`}`W?n&oY z8ZD7C?mE*l?M_D#O&F@R zMmOl+S)5@vgZrF?m|k(7aImx3vksXRUl_}D2TeUufE8WD_py5dyNXBf=SEkt4V#yI zf9Z0D#oa_2s&F-Q8zAo4(cKH#c%kZ^bkoj-#TF^IN|Vem`FB1 zN5f>X`kf=7#d;*1nRS&X;iO$6I#X`CofbVd+{5Bgd*0mHdZ;)OQ zUDa-KNEJu!Ct9dV%iw?DzQNBMwvP~NQ@}jTLWX*X2NaJGTi1xt}O z^PnmV=?#ziwYXzn9je8#s#<7|*U+ht#vD@U74DcE z*yleZMH1L&{78`m_Hp7)un;tSpoeQMF89j5TDTF`U^wq9uxg}8V);06Ct0}Kv6Z^9 zO~%DCM%2P@iM0^D$-BiYyo3ujn`vdBZKtn`pS5!&7f&evY?~LT zx;JSLMZf9PhUKG04E~G3mY*!BLB1T%Kv^Bnz#lG*MR}z`4SGQ05e$qpY@E0hi};J- z4fahC8=Ar!+?(&BQR3S56vG>wCfavskF;a#zqZ4F(Rdrb%$Is|j^CvfEYsyn?k`*o^$*7p_UIH--QA;Urr6q75`cSi23@ zM#cUIJI=yGKO4Q=s@8Z(Yn}JGO)kq;km9MRF8mZK(naE+pU$jLAtpl{uerU-rpiZG znp;}*xm8PPAIbM-du_?INx5)sCu{HgR2nV4^KX3GA{oEhs#9s~0eUOa>w1<=1&h{o zGN47Tl|)kS{Dl_Y`8U=yADS-TCqS-))SR|4gvVo4~_6D0l+qj+#07X)5 zwrQlP0be#5=y8Dtn}#KBHji2SMyoNSJwk8I)|}aDlW_M}Bq5d0JcCtN5)*I?n1Ui3 zsV?7PQ^^(EA#yn$fmB&}(o$(krjfrrPQI zIvJ+-Mu(9Ipy-Q#1p!d%hriH}&`*1jVYPNJG%mIyegF)8J3|diRu)Wul!@NgulZf|55aqYk}fab)dIqYqF2n zR66mnd7i}oXf=j(g3()%Ub(;8^i%oIorpXBFR>NW5r37HBmTT2re0(IbI_l5nY#Rh zO(sRh4P(niC$j_os>gP~&ldh_HOugl;Ja}FqO?W!#J%8Y8=&jkB+t+OBf2`6x`;V4ejWUG|dMmQN?xsz*<^Dzz7J0KSP_fjhK9ska*A&W& z#cbv~Lq>`CDmg=NI4%Cb2=MD^aX$V`K7;3w5s-Zb&waxUSI&s&emopTo)=3nbfbb( zqTPtf1Hwzi=B_u6IC7~hxALAJp8mcBx>B)WomIj?JRSg1VJ9x)okHb2s(9213UB1sMHQzZTbew z6`s*>?Nu-0d$rM=#LEK`E{NXDRakjJY~B1l&ZS0iEVqglM~2^2FvDTq%!(8Z1YQ)? z*utov2lyx$)%y^BQ4CDW^l!>I!}}M-CJxct&`}K1RR-U@Oc}DfE{a2OMGM(*(;J#! zGIqlfxf{smiB~R(E$n|g>VWLpfT;(4ofvNG_X=|Km6nmxgz>f`r*ClZ5*9iGl6EGc zmCUUV8^WkEQ3H{Qv1_Vv+A?ZF{B@J0Q@Fn_BX#aAn*m?;$9<9dG2$h#DL1W<8ZQY_ zw3T)GI6JF+1zTbu-G z(E^DxToPOt`C323HpBmeeu^bgWlJ_{$xqJa3x4>Mq$%kHs`D${;MfN3h(}6UZH7Ce zj&2Gu!#!cZ&;xUlw`kkqN9ooo^!<${GxVc$))uYVv~}AS?NhYE^|tsNWx!9;6N%cK zQCAnmL>RocY17H&mR#)^{86cO*2cEA>8Gt>82Hu^^4976)Q@W0cprn?dKUE{2Di@< zTiYruwZl$r1I5jcJHeQpTKX02k=*ZNe^&jSj`vwS)=2EE!!>G;HjI4o%()ob7C$*n zXrM#$+vJ8iV)y94`9e-YhzA_lrww3sLr93OBWQwkE+oN2eeYk!hFiMbuX=WF_ow5C z*Yvorh+f_aGQZchCl$Z1%l#_Z<$j^;a)0APT<+t^N@$3#zqt$2LUhD#d0hzUI2aPD zyMo7Z)Z6~XKlQf1h;d+PkcBGQ=YFB=bARI#`rK#nv<3%ttZ_Vp!RNG=)UC;BZMr?$ z=j7Fbh)|s`6nD|3AOOxiqwS`MU)|}kUGB35nXs;hZWt-Yu@s|+q(IkFE!r~}ic3it z(KuLrQQLr-1N$%H?sP50ILA@@l*mikMkZV6_)FS{nWk9V5*PQgwkli)T4?Y~B8$kr=Y%RDllWzwuFY54%IV9Z0sJ?lSK1mmvyi!I7n#W_i+ux6) zXya+W>L2&C@4{oS{nahvvY9Fl|s(`xLFZ?TR_H#a$O*J#3bi|0L z$cLA$+tE~$JbGj|`z)UFp$OK86n~!15ZczVS!9MlOxHMKiJDQ5Cq@$y@926fO26p@ z#o>GxbGJOXn|;NyJ)NLv7(dXQ*E8|6KL@%u;t4=b`w&6fWL{j}h&LPX-D$)>I!cDm ztwza;zHw%hG$2YMyx_?V@v~oL?PtGA_OoC0Z2jz4Q9t{NqCzV?tl?;XEDQ4_of2#O zEWGV2juv%-oDTd5A_EV0w~yz6I2S{#aPC1a_lXunz3o>$y0?AtGkG@UFQT)lqFeQB zGCg{bw|xpQW^elo9^!2u&jT$0rKY3(EwZEi1&{1#KMRG+=wpAu6Z+U!M4zO+kNmll zy6V~AY9*ch-B#+B+u^!%8p?a|gCI=eLt)G+T{|?Lbl}c1kW{Mkgyl&(XV@OjYZMz# z)j)>F^s=ugJzE0~{?yHWmF#A}>K}Hqk8Y>&kQUueSIKUtso>c<+gIcrv0Aa(Fe#fy z^RC2V3U!a3P&6lw*eZ|Npd+@*>t5!KS-g(;9yNxqX`H-m3{Q-cuZ-b2qWp!7aO?Rp5wBi7PxjEglIUwI5Pcy)hPO24FG&>_xp;Cv7N0oqDS<v|$kh;7?Rj4jf87fB zo|)_YUspbg>wWUp({#Omrs)5ZuJ_Z%M7Lrh*lkuus?1Wu^xt&r7$)~gtx=mo)bF}< z*(4SFMdPA61I%uooPvh!=Fefqf6)dt;Et}j$p)1__&0eG_5tahZXj;AgWmoPLlSLL zD3y78sYPVYir*T+mbBk|{pgM1oN-NL&1+)zUdX@Rs}nT)=A+@{bNr|(-9$L|N$-J7 zrbTv{)!8A(=+I}s`6%hF;SfGJaxfHq*J~i$nfY5YW*Cqn*BFH4MPYyUxwIse3X^OU3XJ)?jb&$ZEj zruP@MnMf#hl1@8sIOfQ;;kK42Rg>UAZK)wM8{E%FdN?1*XxN^ercrR$c7n=T3SnY_ zbC&$@ELh3erQ3)+FZf{1i;nnSdL3yH^9Nk6Beh{tp}wos%}P0I|QY#@q|0BwA8U~k}sQxmP31@0#qKWj`t+d91H zNgkM7el;nLC^=hD;{up(tlKSz3Ep|20we(;z%!VErEAb(reh#V=9S!X}O`2%9*dB z)LrVwT!WCh5-7j+!At_7$9u=saH_5}P5nb1P9qoWY^rn0C8*Gks0Z^rBu8b+B|72f zdq^W4i!WkD>{Lgf%tH#0p9}|;r!-W4;;i}{UiXyd+g)Zc%yPb3@&ISG6hU@VjpfT( zYH2OjE6_{w!y#%$ZyJVrNe&G2gJGn%)Rtj?KL{WBNUfQzu+_&X4XuH5U+oDCx}0%` zyFSuj#S2^;h-}s03-%T6@r4h4C1Ta7^OaiQo*}VK1@ic-ID07al^WMzRVe&W&L+YH z-`~~nyr1NZU%r*xe;~h#^MSr66Fh6z%*xXD?6 zPb&LL*_Ab?QbkawycwBV4`}&yA79r6m29(GwK~)yQC!4I_&7+KXt##t?4USUY7cE1 zNMtI9{Wr?n(U@3?rUICFN(0H)^|MQMG_evBr(S}j2GT4xMghu((mIDlRVvOwH5Rrt zlmZ|*c)?i^gQXG3pgu0Y5itzC zUbbx{byRjZm{``A&w8~XC-I;Mk_IKha@ySpM==7fG?GGGuUufM3qBH& z5cEHzW?u3*7!n~yh}TLDKJOZ~APnkLd4 z^};!KIbm&iy~UJuX-XDTu4p2Wt@PC<(s8uY+uu}b(}JMGk0%wJmnxd!yyT=xQ<)S- zIKl?Tk?;nl_COCf8Qjkvx;MiKM3Q=OtA9X0J!k_lvzgQgCz<=i&nwQ!zeR z43ss)=}WTohmy`MJn-yKYC&`JG3WMTbLqJzrbND^ZuRB5DNJ<>pa4mk%2~~&o;1C$ zIsM({Qe#?#20}aZ^&u5@gYXuTH+|2KzDIQ2w_D&;iGqw4lE3q!gnBrQMq|AiLS#^1 zItfp-kQx&)Z7FGRdfFp+abuL^iGjmg#FQrg%)DbPvO*$$m4cNV_zg{eW~ zi<1gGa^68rf}4Ch9^VZ5T571;{yUMf2FfnA>LHhQ)9*0hfZiWwe2tKY_SPYi#x*lR zcJ8RciHMH#D^8@KeGdekkUH1?ovzz<9FkxnLZ!BZ43pn9c9stshb3m(un!8?fU2!j z!h8>rs^po96|2m=1!Ba+;wADHMj3{+ljbq30>AHl<)?xZYlxj?3!A z4pKZb2Fg1~iDccZP>c+K^p29UwsG0CM`Y#z;U%C#Q5z0)lpH6&$|>bxf238@k#nFz zLGv5VIhd20S4|@|;tkoI5O#|rO@Pa3k4{o&<+^AmvQ*CNgsb8b_^y-G4%L=Bout0X z^$ZTaOIrSgR*VPi?;<(C#Lm*E=)gwVMOuffxlLW9KiJa(0S391bCoC@+k zZ0ZS`Zqg{`g|v#YCX5#(c9Z%CgmZP}>fzc-Vb77HIs^f7R3GxUI(UFncPRiDLr-uI zxuS+1-LV({fOXxa5Adf&52*qBg#u!t5lmm{ADee!xRZX$X=|d-RsxU^c<3-V(2Pg$n@pOGDMpj$9z=2-OT!0Jt%2z2WsfQZ&9* z+DFQ;JEY`-(3$BZHGJAv+KoBA-cOo@l$XMO(m*=Lf*~X7a}Q|K-)dDQ_F=E|m)^!V zkMx&@;ZKX_C6U=|*zmlRYloLnL$E@dVdoGj7#GSG5K-mh4R?k}t5MEY4wa_beP4%b z1#5;%!O%GzTWkC@p|bK4WzV%v%edZ{@$&tPZlR2LX&1(Qena+E)+j={Lh8_#)S-of zTd@lIydcqI;pi7oTS$SN7o_Xh&+Q>75!=6Q7~*m`uK)Dv5BUn$fAXx;aH&4dy^+IF zvRFtPE*+;m*9|H<2B;fZssj6JaS98TX7_5C8!}x&{bh-#eOm6R){F~;^_T3SbOd6W zIpzZ;%e%aY+R{Wk1D1l&m38Eck{{v~WF*f)3pQ|YF#P41?yPM0bJzFKZI<01trRXW^EdQHQa*Bg5QMwN20?no02es*l0=-Z zAu6Ei;96>@uuu!~z4i5A$gY8PVM2RHN0_i{U_=>D&;RrT=Q@fTDY0EsrU};w@LQNev&K@-XA0N!n8Za5al3wEKd3eXfsv{ zajVu*7}QZ%IJs{i60^rjLx`s04EbZE_Rg|4W zwoq6YqOdF+C%t7Cqu^Xg9v)DCyrgYu)LZ<67#GHwv*Q#RyQVC0o98k`6!AGP1nl0Ph-fJ@+B$eSQ>DBZ~5 zeh%f?J5utbHTIBe+$$1mT&>A4M3b2kiRuw1jHC(G#)Pk+RuusQU%~PFHC0~Z+%!&H zVJecNrBSTb9?rwz(naqG-k<|h`X+EU?$NGfNzZmg>f@NvU|b`!&glMg8Z%8>s&f$iEP4$2BB6 zMz9RYE+!qLk$LjbrJq@Z0afZvlRTHd){?PGpf;tU((u6)CR;G#g zgrY`EC@CLDGjW5EX{gxjIC((nCTG;b{JL_g)S^k0$%&qmsZDKYsl=$W>H;bbRNrX> zK?9PgzB6O0q{d|-1ad0I;a7{PlA~e<7Ya#st<{h_RjN(PZwooyuGHATluea<=)>or zVw4hz>*rS6lV;Kydi#==6rdR_b`drOd-FeXSKEU-CUk0N9Ka}unTDF!&adhkYt|kj zoafM*?U-gPpabOh#n4`+yxqJyTJ+-{a~aU&P1=z|-jsT}lH&JPKU)4KZV01b@0(cG zJ#$%IDHs#1beN91?6=TrI;wc10dbdF0Z*QeM-)*of4Wr9;rD#ncaS|@Mpx7Zr=Uyr z5o#DXL&`!~;|latEu492k6A5b`phS4At4L`#Jlb|hA%^cda@S+em<0J+ZSvqE@zXf0Yn`>=ZM7>y|m27 zk5*&2Y41|qxY9hx35^YKp?esvRBj^ow$z;ES(q{Pu(y)l8xBQXdPOLZ>_gRq-Z2wS-#a%(zTs-55fRl5j zcBDG4ITDgIfJu=?+0A!EZb0Y;T=ZJ+m&US*OCe%CreQ&K0JZA*(0YT^&PYNC$7PF< z5TZ6n!OUxL=z!$mBAfq{C&)V}KY%5_4(c>iIhdWyXxOS=+A#@{Z zP1%reP|`T86YFwHy!ZY_sTK1cWXDRxdndP4`VbEt!!}8sTA*?+&n~m}sBthe5A2N0 zgK(4|EUUN(w-e#;%O+f!-iOdbQXunRh&Uv@i^{Jru}3p~ELi)w1J#ix;Q#iW zYrT#?cp4FjKhd8<%#YZgYgni_^}Q$LiBw?<`bqLs|FBO!=pd<-a;k&-z;!F?{c9lW zC#pMC{3Lybt7xPoHDE@hB_%dy>Os0BHFG_5$C3M{7I$xn{O#f3HmRk3$rlRM#N=Gb z-(h|d-DN|@r!uN`%auqZqsXj1-e}&p$DZWj4m*!XJ~X56zrK&ZVYQEM4r7w!!+FzYenqm) z^gp%;Dw3pOaQ#}ZL6B7BZTx&wzK1RZ^jpd|^0yQ}dhb48aEfJ(-+^*zvlp7cgNFQB zD1*nU6dUj;1{nH@)JL%~*$f_pE5PFAqk~8CpMeKf=ON&+G5KHccrbVz`{aKGJTkwo zLv`uD3?3w-X9pgr=1}l3YE|?cP=d&exn_mR@*EJ=5vy~+e+EM!ZMBRUco5jU_HWf6 z^azH)g!l67Jd>Udv2dgDF{=N4JvG@A^iekV!Sp2)Tuw@-jYkonD#nw` zNIWP(BmGl*J>j`x2?=eGRxDNF&!Q6i6c&zV1d&m`Y6p9A!lQZxO56_nK*TAj9&+}B z97B9TJS82*x5u59^6)q#@Qg%E_Qsu&{FHGFX6?Kv#|h1T&PY*sn!%pMFCIxS?yMAp zSH)-XsOSR-J0}gXulT_SclV#1!!Pz|jB^f;C`Up5rgLgg?GAs*5Otmyyx`|sZ#~)3 z{VWbb8U0}V;_vROe*?3LxJXaCr(L99_lte?&R{RwGKHNhAx5n z7WV1C5MK&!j!f}){#Iu?rS>v^m3RMT5IHl*57cw6B=v5zaxx}YY4qf1x2s0)?{H=l zJw^t%rlaTqE*{cOgku_gYxu8|o>&CZ4L=?+R^0ru5p~}<4CvC!qnV4s+d)2WwBGk0 zt+DU7{&vsI-J@|msjoga{6!BL_4jtgj+xnUhbKhO-9zl}{`$WETJ^p^^0(^m_uzO# zI)qX`(@ozTkKUHK>2*Y!JR-cIt4co$J>F-l^m>dc*u`Cc4xi*S)9*rI9(s!k^MYF_ zM{yWCTdz}$L8G~_ZT_Bc(nH?|4KNqnrlPF6BP~RKJgZvj2Pvs2qsQ<~_*u`jm3}nN zAy=pqbt%BfNw!u|;mq+uK^|q`y!7L1%5^FKe?qQ*LPhc~$h9f?f|KE`C_``AxvnNDuQ}RcV z@a-nh{%d;5KP24q8d(T;MGfH&X{@Y?0oY6;U_Z#FB0Ro(R$P`EXztGt|@I63}@0xbi%)Kz}4zlVMX zKI|4ob(S~6^xfFqS#bFUy{4(1{4rU>;$G@9!`aCn+t5abxUhGUgSK;?sJ31W(@#O; zZzbIAr}u)lIK2<5Ss!uw6{y{W^wgt6Ac*LRsz{t+W>5WO49*6>_NB!s`{{d-;`;T| zx2%Un7|m|YMNqR_T0}xW{WSdUce|gSgiUVKpXU8zf6O}>s>n~A!RvW_4y(8wr-8i# z^)2dcWla{fDpQSRi&|1+_dztfxr0b{hMYnAgZ5afm=|cRGGCBug`Ln6ZD0I`>B(34 zcEf0rPlxH-qOKK4touCS(lGr3Y~=gHu?DMPDfx*rVejp=^hLBDX&VC;ak5C1j4(yJ8Ku zjny~Dy_6CS_JX#cUHsj#`bOsQYH2-QE#>ht+S533t;l2AnQxBMPr=SSI!+&gr8$kK zow;s2R(?GkBtLP6^6~mKVy45LD)F^<;7G4xV_Km3|1Yo522{O5^O!J^+&S+VfW1UiUL(&(wFKpIuLdWAoqAJLAxB*M}f0;)g*>D9`HA5Qfgu4^$kBYY(Zj z^wZgo6p%kh8IAhYb{=r-ZT$?@Vl+rs zsK(Z@bJjR%*!C>+Soggz%-uXssUWrohXx0ufy0&gjbTFY|0C}`;G#IY_F-l#EN!Vv zXBX^>f{MoOL=$5NOQOa`5)(BRNHI+XG!}LWkf=wEx?qg4izd1z8U+)316zz0jJ<;0 z*uHb$Gg|;n$P?fH^XC1YU!I@L?zEk`PrJ@_&dCh4)b3FWPubU!i2suKD)p1L2FSdF zg#1mz_k|iX_9l8Ke^s+SthhU z8@ZJ;J~GF6&AX{)7c=bI%hJ&;J~BrsMSLlPKQdQS6)CVYjABu4fK3}t1;jLZXe9F8eodg*J6@zQdh zH~VCE9p(#Y`fs(&uf=zigwyCk zV)WcQ@OUgPO8nkpu`|Od9Ysl);ROXkxSK?wA>_&Iapp?oaAw~mLJnt!P3fq+PPMq2 zki%(_m$Xfbyb^;ZM1iG=h44(u_DyQYybp;cOC)Zkm@NL#wv*rr5vk_>5})*Yr&P}O zPFUZy1Bms}51xYcEs(H2#qWMl<~!0KvQo|KQ14{>%q1ahUdfyw;M2@8iaGOPeHua? zSK(3`<^CZ55!f9O{t%vS?u(jD1*;m@4us5fvkC8SRl0d8`uGDTm=|dNU`#4j3kAO^ z{2*i^D%HFk4{fQm_vZ@$>tu2 zeI!pdhY;E~KiM2Z>XL91X+J8~2a@_C0CHurxi@OL7pG8@@!=FaTVH59~?;pQORlI#^-@$W&qjXC{S3 z&pyTy7g&?&srbpqQlxIcOauLnSJkj`(VD9IRG+Mc$R1Ia9Q)8gHXeLEos83}GYp{qAR)un(d7?R)l>6v2%`0?v z+AKEQi_Snn%QUOp?POV3cZiFO3xfP%?cF^!tcI$8th+(yg84ENOMJ4ZvL2LWuI;t; z8m---RJa}2U`Cd?vpdh&o1aQI_{Yk7Iy5(KkQ?0tnc&%GQV!KE8*kD{e`iSq-``&8T?4G`rG6gYAc&{nA`tv6X>i8$E-e{xq|O z*1TY0p;Yq%l;v2g(*(nTX$}DGxyE8cw-~+GoKnhlUdU;66u%&X_I!$8t~tEa>?>RA z!nj#xJ8n!8SHI*|N+>PM0iW6Cdf37b$^N~U^ujk-V0je6%!9ny=C-x2EU0wE!LLc; zDv?o+Gct7)E>S9u*B^$UugvXS-3j~lV6Od4t2*8b!KNqVOaaptRXWqdg;0O4xu){r z0{amuu3dr^4;PR_T1lnQCATANrO?o(mKYp-Z#(jNo}ykaK<>SW=2rDQRGp|+5h*l+ zXZsjeCGp3pcKyg=ZmM2W5P&$fcU>V6c38~cVa3U~9P=FfCnVSWDHiig&ov)Jbvk@L zBG9wpz#fP#XX?Z3gz8CLEa1QKzxXd!N{wg!D`#@Un! zP;U`k?Hv~3rwc(`gg%J?KQ1!IY6Jx;I)BLiB+(C)i_Of=1~c!E-{Z{&cU@M zxCm#%_@(B~s(B0>Y$+QV&S3HCQas~Qc(fFysV^ifGZUZa{blACz1BQ&Wgok+-wW;( zlKXj?nGmW~Y=niqUL6a2x=-q;hRkK=h(KBngKtSb;=vjz3T(a{!6788Eq9!3b()0l zt-`P9$)cca1s1hkUv92jL95qXLA83H73N43EETDQ_1YE?S!sY)4eB<~vO5*}=eZBC z7U<*USlo4Tg<0=IZmAVJFHJ#y1D>TO#J!pB2fi!KzV3NNK7^s`!hTr<4OSwwe;iU) zn(MmX{8@t$6uD+?oYCg(Cv_y=xDxUFbMR!Pc@bKvMR_#32v}wQSv8x%${W^Za9*;$ofJYI7shXR(&t`gQQ3?Ocuecd7NzYV%5k<{YuC4S}s|@PoN) z%&GW#!q-Z#r!f-vIt4)bT62_UDcLPvy73Kb%^#pCjk8h*=3T3~6)6jT0dkAb>c&n9 zbX6PG?2XT%&`NFWW23v60$Kq;byvHlkQk98RmHK2)% zCngaifL6fcauAdMDZ*IaAQ3abhX_I+0sW@?kr1t`_U_0Mzc9>2TF`fQ8jlIeQe#$qKdF%ym zyyORp0@N-z!KA=kJMbCCJh{N!SE`A@vl~Dkl@ac)Wu?*>QswHgnZ9Q=>j?!vVU19S z&G>^I6(cHAF*0Pc`3=d(yqXmYdq%$zpsJR!B+n-F`@d=(dY3V~YY1oAS}(iBbw@`FS3f82{@D0-vY zi!M!-u80SIpHAZlH=`PuZ}x?N?y%Y5TC@X`^ZJ?CnRHO&Kq<-Hx~rD~yyCcEuLTFC zmIB1aSa71sVRHxO8tgc1?uM20YRPio37uRaX997cjoktOk7WoB5h<>Vzix9mKeL zK(?W=AEX{NcOeh7aST@OA2kP|-Sz^H;+P;$t=v%ntL9j53sXmlro8PKQ3E+)e03Ob z3`57>FnH-HnU!x0=feZ#P6F({3wVPJn{iJf>84*do516^S*JdIIRNwa2`PqPHwAk$ zPr{T6qBwa30@}(qXEgKlf*r@rCHPv?A92SOD1bgkIeTdkov4@ral0njMbBplvPu)d z)SRoQK+bGR4Nj7NCE_BvH8=yAhFLHWPa)Ii3U*!yg2Gc~Uo4$U8NdfgpJUVJV${uu zLOsFrAcwB#7#F3LtAKzR$P>neX&`U(Dm6=W^8{MCV1|NXGfCj5dvV13De>Z-g0N(l zpqGF#K})U@vf@*lBgjhnS)SEhaY!IVR-|nzfn^`@)p57%Jv_0Z=_k1t5L?MUhj)e8 z#X0_C*!8>l8{)8^L3A_;RxL_4fVhu$g%fo-B4$aS@&Vv|7LkH$YAErYY*1@){OAd& zwUTQA%jqS9bLPc1A=9to-h`Rw&A0I8sgTvHm1f5?_YB0LN!??)p0NFp z*|V~^<)@Vww@)sb4N(tK+&od-Y*D&O0>fM#T|K}dekCV-XrxD0{P7b|dJ%oVBT(nk z)5OoU>f*Qmk|a4){2If6%Vu3=@x!Vj>Sq(y%hSZK;Ibsc&f-`1ibMQ1HR7g_XX~vtD#UF`dhiEL|WN z@8ME#n7c&D($&Y}IejWuOM&(+4!BQLE0p>&SOHuJOuTPyt(LZnxPyHqQ>gFNgPpfNxvmDg$5gVFDPcX zUj8;Ss*}v9j^&@kLwe&}BMen=K~bycDzP6Y@2;;(Fqk{8yGN%kNr^O1c zgXWr#DFU(B6;rrCXs6^FRW__L$VLt8z6Md~DnB{PsbPf@&*(6$3^A;QO0FSxol~l~ z^0c+=z((>>^gbMx6ie@lVV;VUEvZJuHF0;RkRGYO$AWwk0CrS!pX2l0tLC;V2D}7M zdU7v7p@yrY&PhXIh9?^C0}PNq&~ok3nU9-7dVuWKawNrgR?7{;f4aMJF(}18k{z9K ziq}{?Pt?QO!hLN9VO{N-(>lnB;sT)5m2<~;YuSs@o_>6Rdd3NS2{qg}gO_YlC*PNV zhR$xBO_C9elO!2ywPDm1&Yo834;$Cbi=J`nR2cNsaYt>!jGi#N*J9(dQCXe@%;k$g zwo+MVSw@GovMm2=%;_bEESGt6G~N7{X0)3RSAa6C_vMHgjq~N+u^G=5zW8j>cn;Xc zg(^;Kz?ddtYq4!yJT&m*5>VA!)BU&%1|f|+u3aS53E*lWC{nxw->WCzE*z2%76uRz zZe|Fu<^`ZpmL%5?j2+z2i`vCCfxZUrD`GQRcXAJe{14h`Vb*SLE$j&5`r;}wwZVz+ zvHg3yLDq}P`rzF*LRnOl5x;h2k353zBe|DgS19M_T8u*PRnBQfA&>Ps zw^k!J(PG%*wa_|@3-YoY)RO*HidWEv&p!wQHGDXvhjHP|uV4wIVp&cYD>*we}ql4+*B~$UT6~wu8KUWRH&T}40jXodpBRJBS!b1|} zPY-Y&5FN>-k;lv&W_3x_59 zJ9l-{+f)NwH*qm|)8SDZvCqB^$)52c7Y%7qTw4@mbZuFi=yC@n(bY%WMYrvjMu+H@ z-rPyEIK&Bt;%NFpo|pASnWxrQj(+XdmqfqmH_i4cd1v#BqW}Ni{6bc3juQN+`+Jef zZ&hsX-*IDB%pNl0jey2Xi*t7dj^M>E3>6QaF=B|5U9^Rn^&lyZ3&mJ-TpZU8*V*9F0do2(`D_gXJSM@Z z!}igjvU)?wifKqZ*ckE}awP9{VxwN}cc&r)q=NV`*tC|@JIRbKn5+)X8gcbWMCs-f zQCb?&)3B$T;fTKwUIksRm?sh8A%3kD{aO!3z3vf_p3(8#+gPja0ZaejA|YnOSXVWA zu!zrPT{DNkb>l*fQjH$14}aMYa(buLg&|F-kRTPn5k!W0gYHs2O)sZFe?XB$R>%V-#Ep63Os7q~o|S$qyY z?!Uz@!l+hGLUy6bLiV>D+_k~P!R-d$wncS^ZtY=D$oqj0hSIhib#o7U{!KR*JJ8Q> z=VxiNB8>5dtcg95O7kMu%jWhj_@-TLsM{V*uI&5Hp2)?)rS@D6{GfsZynsotqTBl_ zim@eSZhZz@JrqNB%OH|>rTwOa@D8rf;uS94ZUx;XE9lPVJ%D|$aLu%`*9+bqxu~ue zmQ-(|sD>arnz>r|Prcz$*hYa}z&ylMo{BBJOWL92Gxk3>IR0G6$d5s34>sd&bqa&o z9l1cSB{JZnL7-tlF>LI}_4e4Uw$a>lAyAgc#X|Q^97);t>BOaCXS5@oxMXypWm1dW zt_r(O&`x%wdmOygnIlobhRz&GBS)@(B>=8;=IWyrbB9$o`k;%^g(EqD&$`eZW^_T9 z`Vj2s!o^VF+Z$Hx>>LDsT{(Zfq=7II;X=wr(Eo1Qm8*yT_gh`5jb7LlAAch3>B_}M zm$%Ub$chSX>OwM|*l)rUAI*g&VC=?)M*aEI!X1sU&vQ^9yx)zhgKZn;b>sTe#zOu; z`!8*Hm8%g*yW`@ii5j`(!d^;~5_;XbbM=|^Fs?hg^H_wFz>UGX`y_!IiO=nP0+)han!tAqy1K?_J&W%2@no#nFmmlP{&s9sOt0mnfeQtN`&kavk3*r=m z{IFRZXHxy>j#s5|4!d0_%NbgVSmV)cb=P1{74)>`G1u>V55c(Qgj5ndy zYaB^(sxgm9nni_FNOEdf+Qm=*23sG>9_Je1`qmR_Qpkhs7B%+pr7fPw69|lTy5%SK zTehq^Sq}kNbsvnvet?KRxKt9LV;^o9zS~C9yG4G@2V4l|lp51Bc%fvJ^x?)6IHfPw z-sZJ^{)dj{f>-zD>PgUvrIWTc6Y5Uvi_{&fnZ54F*pCa=ZayNle#*W1goa`?C1V-f z(#S-^g?`*%=unL##YNP&`{%*fIvH45CpBtvxOOLH*N%Qs9^72?UqM#RJEF1Nq$);Z zkKf>as(`3qNQS}jr+k8hsMJ%c^fIP`F&UbiMo{z?*Ixow;)dX(o(%;1ctrc@GI-P z@1paEmWRELDT4Ankdu~1hC#F2sBwND!S%HpAA1P)@IDE_`q+)nijiCmtsIKMv5}~* z6Cu`uU`tLRLL*fO#`=xonqwR`OT#yX-J__ZcTB_gh1k*b?-rvuiLd4gKHa?i2<+nQ zbyAI=I2D7fb)z{iRX)yZhJoj}#_(7=ytJE*a#ef|^91|O;nC&I0AQ%*4`Y(K2y(QC zboB0IdU4akcl{vkJm(I#lesihm19!4EvPD6zQ?_(&U!#p<%0K6gZF^Y_ql%f&zSdV zu(srV?mc|u;U92hrfk;_xM8TXvBl~XJ{rlh9O;i0P%c_~6Ga|_F9~shv=6!JHuv*( zAr0Bk{S1QSU%7B^4I50Ag+g*aX&Iqi6R5DEDq-E(`UZ`%==lunfjbn_c24hlY=c!Hkmkc> z-5*}(xt_S?17#-8gcp$Vl!UVHgxko7Y`DOY%qAi?O@lPjm<8Ft!i?sHg_0wQ7>)^c z3!E*Z$$IP}Q{82sfM^pMbLI}}(%U*xL?rR~$v?6wDU>5q;_dbxDe)A^p`VvG_j&&f zBu97FVeToIBW+g&%=tTUCf2BDe}s5@-dp%aBJZ1Dwr5njmb2`Xru&~HQ))x)Deb(V zS$l`vVp=5*PJZ4F#{eeA5{$(uzSL}(x9kS+e>dJYSX?Nwk%Z_Y*HFk3>!yIhEflKo_b9i2tw{TnVo&XfL$WCKcefHi#~rfi;{c>iniq-X5n zZAn+uWa_$A*}#7c%a?Oiqbkf*RG=!5jJg$B3LR}UAS;5i@r>d(PpEsWS{!`5n(Irz zNm~Nt4w24XxPOPPpXs}XbS5AARTXDw>&8h+qDvy+1StxJ9& z`0cGbMCLI2Q3FbTxFG>Y?tsT$r(>46ieF!&{00gQV| z60(h!uS&@456f^zNZ8M*h~v6jOJ&p3mCF2|MY|2{fo>D%e}DqFwm??}V-Ii>iGstt zWE7)IBT`AYdR|auM1siRKR69^J;c3=Om=VRWa8?=zVUHnh?E|lTtd)*WGI1m=Shf5 zecfp6p-lr`UxXX343*??S_$7M?&ODNuK{wgnOLgaw}k6 zHnOaZJ)}T`=#$FTB$Hie+*_>#@%G)2Si*JF?+&VZv^(H5S37`kL&v^YboAaCkMU8; z7mZVm%1Pfs(Vli)m@^WS;EWTK;FiQBpdURY5XOn)gh^l<+L*e9dsDSDK#36aa)fx& z22}Ha{L`ptkVE-mkU^y(yc;>^;()!p&v3&O_inQQ zrYwW;XPs^9GXvHdh*mK-sz52YgFDI*YFm^pnM^?AQtmuz-aXLu0vAuTVo9SRK``e6 zmm_ZkT6;UIRu=_rZgU@125CRP2|I4%@|Ahz;C83-@=d&h&Ypu?t|DZ(%sUi* z*>=Zy<;LAD=M}0*j&1Z^uAv8#$7Q;>Dg+`o53GlY49Zu<8c(~E_=Ftoh{mucrWjh? z!)WXVB;RxP3b)x%8>WqQG!x-d$?)7sR(v@SVHo`gLz#fz$38?cyMc@Y9=Z_**wz`Pa#^M=DD#7}X1l zHPYSqYq~QxoE+BZgpqny#OwO|e%1NCf5WdT zTrWgpACkT*NbbisE0;)o4kGZcaj}qZ$va45r~Za2pA*1eMj@zTxzO>_^1(hS7qSb( z7X}mt8|?Py!F~iZ3F1Q$d#hr^?-k6Gg&q@37kbqL{^Qbd_-pFCGNRlu z-ha!k+_Csa59994AWV`98vf7Y{rk(FPrOf@lm1}5)&2#za@@Sp7CAhJb^Wi2{C7t? zmi3Hk(%*lj*EM3G!aG$BY42ALgTb|Cn4tASB>&}?idtAzoqrpj<5TDAId$L2Kg5TU zf;lhf^)25Bw$|WHcI;UzasIK@>GgQ<8vK$8!fNskA!uIHNeH^npwVwi%WDScw}=mR zg1uA(fX=VU_r&t!hckFmC)FQt?*z!K#S?nt$y)pfEZo;G;d|phxwZLUa7;kmrT9x` z*WrEafK?4RR0kFGhEl4a$;8dXbOoYX#dUd7#uihLkM$rvap@HwwmE5SVLFai=?!gP z#cHU*%lSH<|DvW$Khh$c{~{|7Mmv>h2t5!S-i1=5{okCp_Ar4uIQ;0YOS5eru!ZJL+7oO)oGxCATF7yfZqV2EP7l6z-Kf6j(YobVzb6==4-+FU7D%*=e~hX`h5Vn-dBCy|%;;|H&bvyIYH#+3^>b84$Jpa4BAH0j zaAVW1qGXz2_+h@O-IFX!a0;trBZ`t4+qgV|ORB7q3A0|b9$hM|>4kr5o4X8>>TBjE zqUat&W-xUgFa64s;umd2q3w5sZ>_pYdUs^C=KUcLH)R=)fwz0|Gnso><;K6{930(K zPrF7$@ZH}0Cn$Yqd(&tr_|<2a+*lFqOiC3YhRhOmAc3|>*HT=P{uRRt(y~Yy`D(M7NlB4q@GACgVC~orJ_+v)H0VwN7zUn-Jtum^S+QUzeW(~Po{^#r~UZn>B0Ulh|H=cXu4x|bixu>@Hex< z1Cn^BtgwydiJ6W!a49?bM7U#{Pu_zd;k1gKG>cdW*NR+1L&=t8OpXuHoxA()f7`!+vJ$zO?w?nOo;OniqAvg6wG-{EVx z%H%8sB<=B#yH8-s*Z|B>bf6swAuS84H59$$OE7*YHOnW5QnP%2DBlB@X_sN>K<|Vf zhG9&%6C#FVoO>U1@A5hL&(e4K-b9iWBlvX5l^zt@w~x*CYC5FS-POq z$4l<;;4_-9QPbJ3+A4UEXC@s@D|n>lbpuB8tPk0_h113Tq2N_?G`5W9L(1FwOZW-> z4S_iA^cr?~Oy+CTqnkS&ZNLEzV*_DiGVg}2gXwk$TB+;h=_(UDkp+&u6A{wE!K2AM z;r0;0ml|KB4iAb3O$s%OBU+M`eZC8cu^)ZBe z!v7h`8#`B!viYn}`C80r_~BDtWOCq@&(M*f%x+ezFnS{AY91KJ@-I5P?Mhs39pt<< z&J!$S(O^r2Za_kJC)MLXg%_k8(1t_gY%Lo3v85(3j(C8v-RATFj7$yDlDWS(jwiD1 zIUap9bjVGv0c6u=>_cJXbW}1^$Maq7(KD%-r|itqOENoCm&!M>yW|~GpKAESU}-Av zUsdb>mSp`$OVswJbPdi(b9Mnvr}4d2pR3XEXQ!j#@1AZq{QmHDI=>pr zV_u!Wzs~#)t0(Z2(9XXwkspZvz(i{9sk41*A|GZKV&Z4B-u6y7M2Iykwf2$_qwg(6 z(#_el{dRA=Ley=!JC8448(Z?t!_I2@AEtOBV>8gn z!AGrSyC!MtdI!ag(VU{d_Xt0R5#9=>7pJ;XRYF${+zErcnPo%mGd0SP5#BBTiH6&)+^M4)^yI>Qtf6g`e zw}iF2BTh0_IOfK6a}8Mk``PrWxvkJ;trIYmCU5)|Fa%Xch3!NwEKsVY z&>w-7KOiD}L|Ju2c(DT!E>kwf>Kja6{uw6xMrF|H;CTumZ^8a8FL>jWPb@-3d?lb$W)JCP1i zvHSTBQgf(=5c7DZCv5ztkVK`Faou+D%uZn8+r>k_gM5VHsWeUZ3y^t`zlQIUk{RSN zGqzy#DadoqIS2A=^IHFF$n#Fpi>4y-yhZVQ(2QQlYbpJWy0})PXathllbeC|a=X|6a`v;IN- zyAb-(Q?SnCay4toHbyJ7>fBuKiz4?u;n=>k7kGd(|4pUr&b(}eMdW*2!MMYdwb+*AHA z_#&TzElKje5r*Jsf)_6FlW}X)CH^a%3;gGyA6;fG*< z{@qvTR@`D?CC=_ESuA9b{`}acg|yRuJa?8BmR;j(kqHQT7{8+!dud$bJEE@9Xa8=1 zgzFRy%e~PJ)0NkG9U`boWNM}y(UhMaWAUk06L0C^b-tzgShUh3)xw-7BM}lx`JJeQ zaJ&lz#d5b-w|CLGzBWN4rK%}1HlvL1s@#57E@9N%;9sZhWE4=={swkFyv1uHGSl#X z6Y&43O)++0*gJET_CX)l=R(d6#IZ5ceD?;ews_$tN&Q=xxLQa#y>^Rtix4XuUp|2b zIXC%UDo%-mT1MXH;~{@&=WytBizmHb<#su4_NiVJJtU1?Ao&)}q^-WiSEDzqv){0x zV%j|5HU{lH48KhQ`kl9V(k{jmQubrZ`#)||G_K|y{zGOm%)P_&_)p7we2BY*vwI^+ zqzJm-#kDdSmfuB?lYU)|DT1VX{7B}gb>BUH9D$a*{=x6VFT)@3S@_S22biBKvL1NA zk7mew_qP-z*TL2&{U7lS(ZXat;v3_;{^b$hfWqY$%$O-7M3={pC|s__)&?mrW1?+V zKaDRGvdLQL^qAMvbelh$Qy>lVdgn3bqqjoFV~Tob?pq%mTA^W!8yiM|Hwl?L`B=vM z0_hpZc-wkUuv2j|ba}#uYBNj2&`@Ht$|w9&&OR`Z2nqu1e!Yd_&v)r(+q(_JCZK+LHc94$nCULsGEp_%r zfi&cZdo!z^N4Xa8#kU1VdwQRoIR*u}{@v;J>!*DBV;$0(uWa~idt-Wx7;t!!XSo}o z)5g47XW6HX75%F5htfB*^w1hVRb((wl;0sx%gWt#vwz+dq;$m?A}MzcHVn7S@tQGz zoVNVU(f;&>t+QP1t*;Zfao81cNR}FwYJ?z^0VP%!m3*3pgON0XD!|bVTY=rMrP0EhaKy~;kv6p2#q*<3@gMH2=nH= zlSR&9fFcE7-%aYO@1lPnlC0B7BkgqSbbNk4E`JLixCv)bvzO?E`q&0k?=B2iub=6U zDmc|$U`dsZyU;||_7B~K8aVM#$zoS|ZM;8>^%2~ly@wE|%lq9AwLN}=qoF(mKls7} zSHx$q+(URDb*afy$f_{{zm*5cX+w-klY&Nu8dmB-tI$ic&Qjq`=2 z)>#TYj$lz@+MKE9=V!$Wf6u6AJ<#CqKkF~VAq_75#3FyF8z97ZExGK<-gaTHUtnmX zq_+bEBIpCV95T>3Mqd>wjczFHX0YBs8G*);ZA8B0NHoOP9?Mm6^zg~Okm0A5p1y^Dl~D^Qhi6NIeeBJ z_Jh(eTxDeNh%4k?Zs7;@!-Zh)y$2oF+=wCilL#RI-VGO8D=skvLiUGE;X)_8zAgf9 z6a@j9Se6}2eVH0CFoKH4I}t)3{Gs^~#WAe%*kWR=*nxt&YIzHq)t)0#jWJx-xLkDCJUPOC` z9EgcqQ^qZtlMjZtG3C$8zsLF8Vl`;x=+U7U^&g;iT({G|1VuEyF6WHQ01C?Qlk zH(Q!ZkQF7+WKRD4n&_=qX#au7%6Az@N zhO=GSqYspjJ8{no_&w9+Q28+hR0R*-YYum#ss~5OVcUE2o~NtgeKqOg$)3G36bU$U z>+23wP{h(URm3m3Z)Az3xu(Cgr2Bf z3+o8YW$lV1#)w91QddaD>0)c^3OM@}eyuA^Kt@UpXUoD^@SK~a6=)C?A@d> zo?`}#YAoQ~ckA`WLND@Z`=>~V&Rq9<_q-iMbY!p#o`o7leRss-DD|hbrfa#IhS`{7tm_0e8 z3oIXrqn(zu5n3r`o`K74s4}&6#nnJmTfyJ!_EcL8pk}X4h4yWQ-h^OUtmXq%nEgwD zHEo5>^p4b!*nCHjhbT1x1prQgvRdJ z9f}^M!M9nIGtv(Z51NT~q^(#F(o%B>2?xj4`a#y6d3u}IsA=JXT^5PgNL7}^*(E9~ zvF5x=Dy!_|%tlbSaUPkn=?8JAW(Gsfz!~*mR7XKaLVoHx?stUzsImOu(Zao+uow5h zgZzPglv)d7@6B;V73R}$2ey;zg!W0AYHP)*w%E~635lJBI*P(j$iKBb2+UIiU--5& zy0m{lQD@XzJ7M1+{S8*PF2aipyf#pngO4R;at3)iJ|CWM1f?JhN7_XUN2OrzC}A=o zXd;#RR7^Z1m&}iZ!Lz8=-8eFnSmMIb0_g|hlPrXyp)8q&dg9t4veX|-O_PBUs3&F; z(54+YFWIz|+0>>%n_dDf;+!pfLQu!0mvJK8myL(RfZhVB4=_DmcwCXU4H8F;ucpb9 z@S~E`nROI@xC1kFoI(1m7i7<)H=Edbe6S*C8xE4M?0v)>ix*d- zDO<1)<4H0stb^;XZ1Fet^_TkwnS>0c;a>zR3JZYoKM-#ZM$$eM$jIH49D3oR76*)8 zmu^WKf^^9}b8E&JflT8`oH~biEoEmj?PiXy8QZ+$P>7u*=*C#`_p!-WWn)2Qflc~FiJ;s`XS2KFL$gYPy1<4s(> zixN=ZjS#jIB)1D>7aGE$c#Tq{$#G1{R%~;J?2>Rp2>t9SU~ZN)C>s*H37;r7+=JcS zQ1gi3-Cc+vn+>`P)$#62;yeOicz3~FBPvV^)Hmt70s@sR?l4W-A^ZJz0$?BRpb&9X z-ks@zTBFjFAv@gfE||OyY*C=`FWtD`#i;aggQBbGythg~#BZB}%D?!+r@Z+8EB0+~c{Qh#wrTiAm%tThg2xp1Xs?*)W*sp@h<&OHbm7GF zS`fEZKOY6LPF@h}oEF4=SwYax$}fmTRa_8AFQjHd9)(B!pbW_YmT`J#KM1Gb{r9be zZg+(RA#FPrMD6qZ9$XMrPlT>0_W92ep>yv>{%=WyLdKJ+oe?2*xM#e>J%iJ)bHT3k z15$n6_rtoK)zghiZ(HKDw75l#z1F}Fr^*Y-BrtH0yKMCZq(`i6APJUoE~>AFI>DxrzHN{Y|1%tZxp zs|5peU5UYKB9^1$p=Wm3rqnX*i5)O!B?7=#p=_lf)ezGCyX4XR2jt=Y74oZJ- z!Sy@}5y!0(Y9nB+!l@!jc|zDz>x^fu!XtRNx{4mrV6`wEGn!jg3t!+reZIpGwFt(2 zCnVw4sqg5A?|n}{gzqtVcNCOsgr~6cdL7xT%Wp5kg5#bxx$rm%&clY=Kq0-(^cy=(Yy!3+sKL`eT zL!tJ4(tn`%-tr$16j-xLnpCmx2MH9o^aI-J1Zef6&>H_4`=d|`v5#8zs)xF8_D6ic zTOn>e!WsR*J7blB(FqDMC+Isg$+si9v}9(p9NO zt(rV){Zo^y*%RNv&V`F{Sis(mg3bvZmj)P`yybj8OK>TIPONG$7NeXBc~{HkUH@6$ z)wE$|5R~2+@9`IT*ZhVPunz^Firfl{ra8|9$DFIiQ_0E$hw)eIA-x6X=SC~m=@95u zBQ79eqp#rR_4Q*13c_r;h1abaflux(XK#=Mv zp9(~`Oou0hRm4D;eUswdrDUKIwM76V*5=yic2PT^ra%Z`oJ-r(4*b1@Yp$ZUzXxW& zqPBt}B zw8XNfoO!Ti3!*|Z;o%mVWz&#odc-x%k!=+SUyR!-G{cpw1)tHH064xCAC?k=w_$)j z7hc;YjKhHD&^DS^xU)@2#iW3TB;&piyH99fU9lb2lID)PNrSnA7KemBo)XBZU|o!Q z{U5MmCp~uGPLgnd?z=Eox&u_Zg)8_^*>2$oUTo(cdNJ3%^kS3u;sHzH+r2`nvOj8} z#9cxQ7=Kvsv3|HuSVc-!Y8DA~r7H%*ilagw$SV>&@HT%cqDP)AqL&)DA1{>)eh2VU zxibz5N4zHftiham3&tNG%cP&-+(A@|P{0=NWDh!MIgTZH5PdeNy#Hf)IfUax|wMq*8IcR*0K9u?} zct1XrvSY#qe1R*DllxhF0#Arr)lbs9`{<-_o!ng`V1JAXfYejc-8HtoJKNn2#@`iN zjBe?7FuYg@(Vd!T)Gr}7(iB)lra#Ot7G6e;b+K5Oh$kOef;uz-rj-a};?wpLstUEI zg}P`lG;Av<7>A{y-A@ZOe80)Za(+x4=1L=%G;C{VGr%*hNa_+c=69hMYIw`< zLVMd+(-%u$mEl+PvRfdf56blNGeWdsYlX{B*(G-yJ0o9qn+vc^upimGp6!gc<(*{&1(VN{P98s)=uBYbccvs^ei<18kk z?)>PB#S#7RH|~aP-&27|%YnG_{{5lzIe`@ID zMgDQPa$cwtux}~FXK}b1!|s>jYgtEm5LqB7W9&ArgMl_tGl#$&hdfQ)YL6lQKtYRtJghpV6$F za0%0fy)8wCYK+`Dh@SH?p3`^UO*MPdg%!`*(&HYM)OArz5X4>}5m-b0GOLE>jL}T^0sK;8<{Jv11BLE-0`kQqX#&3>xMKb!JzuCYca?3E0E?ituI! z$naq``T;LRsXQ4Ejk}SlrErNtchRT{W#{2{YW)EGO6`sVD>YKar)Zwz`D3ezM)(>I z&V$#lqQAhyimUXYcYh-&h;}hWdlIU+)! z_EfO<*7%}JNJf@P^s>lGNx^D%R}goqCXo-w`2(dXZ3>pW?FkGEm!w>z?uHQMzQp#9 zKhGfV*a)xPz=U`XynO@TcRxrtR4hALWRBQ7mb^{Xumx20n-s05+%?26X~I#)FG<2t zf%xUB%M%SD5`I~kaexRvC9lZ{KOwIv5aCa;%rR(e2)`41jmJbl69sWr5dEykUJF9l zGxydU+dyf;UBhG~rLM`z$bUdxL&ufOHS1-|(>u~g=(?4x-({!Fty-gx!fw~+TnXY@ z)CYfujJT#e93O;zz7yd|J!KGNZJh5Jj*Ge;{+1(8Nn>KxffC@1_mEX0yJFDbo28e)1viRvT zW`nz$l?uzz1WnHogUeeWWQuizPv^cI4zY~*3tqwjLGykWj?q?*TBBN8$2l9d;JrS` zpqRN4_9(>8SWTGtffxYwm10kPN^M`eLYvc#yAlZ-lp;yVTvm$dBvm^6vjE87;Xl~& zIH@M%12n`exlh`(i%NhGh5^%mop1nc|WVhV#% zj}rOu*(daV)`xo0oeW~<`-|<#FYk}5Z3GPdHOU`Z55TX^L8k$tQR${%3KxCF-NfMx zgd!y%mGsgw4IJ_l$&mNQe&VONVzK*AbJ3`!Qi$Y`(%XwVLGfhdE4HpFMnkm#k<9){ zx@aUh|MZJSQTfZ!c<@Pz8-WX}C@*q2By@MICRA``_mqiOoq6rj(nG$4Q*oc&d2D>`rBQR~wD4#O7 z(JVq?^yUn*d~#zmp0<2ik%LcWG}mo+ESi+n*w)ZHOr$-E>5AdP#2ZgpG5)v?OmWVO zr9EtN7fqEGOL}{;A&m79J3+VCkQF*QQqv_=Hvs#1(_Yq5W<+T4PpxC$cu)ft*3&#}(E_ z@o&#w8wep&O(R3dba7-Lt9!hId@eCF=-NOC`G3vY*ydOpRG~=Q4uw+l#b+#!MHQCE zkf*H-S&ejdXpk|_eD_f>sE=5;`~vvu8F~Zo-E%OxpLoVuci{VX`!n6~ll<;soKxmW*dmd_T)@*#Qy2WE?uh(j08 zC%vAbG(Lma+BNI&)w7i zibL^Bg_qyuZKs#N<89)CT1xuWV$cVL;&;Rbq$TfAaWIKuhN25`0=^t7jzP_>Mx-Zw z?`A(R4HI`T=i%}&aY@LzAloDjxd)w_G)My-xRt}jX}DYacg6YW2%djeT!%V3XM|{G z7DL^U7!QcZU=}aYGkaTnUaikyE6q{j*LdMxqw&J0Va#ZeuSZ6ooYl z{gTBx%qEzWjJwW++9~2xW;8;uVFouhmd12=?Q~TGtaA~yeW1;IBB}GHwJ7=@>)L8j zBA|F!S^y+#V!a??gFXV5zb`gc6d#7)-$y@%C-DqnK*kLSBL4604@5F+c2zySUm%|Tq_fu$qcq?$TgXznv)3UN*;dldcG zf`M}!?9s&VSs_q*ab6f+ROVJ?uXa?(WxLLznHs`*ww=y&bG)54dL-Y%uCKv3c%!DH z3k?t(Iwuk-J2JfQz!K1%qNQ}DeOK5^>C*3fMGN|-Itu!HzMme1)5h_R-$iEXh5}2< z26BmY=aAS;2(LT7K~O7f4hgf%I?W7Hl3BTNV@0F)fvr-Rjus#E?ycDCk;gvkrFXv~ zu6O$F@wjNlVhAcB2(eIaoJe~}juR_+*(51rd9twc!9K@&1%<3y>= zR->=phneHWRp=qbO+t2U5`35{)>q9^VIDfJY<~c3NEO@S8ci%)8Q`g9rMTV|tGDh# zWSY2Mb0G-hBMqb+LJag~nmB^F0E5%T2%Hs=*rOIAt~eK62gwHuytw!0P+-jLBNJxiRaQd|9&L$mI;#MD&8Hfi-rBP3y)RONcY6<zDfflxar1 z9So;vlhzGRORU%n8#;6FZJB0#VmlD`yR!5xY=Dgq#@;m|%%`ulxv zYy32^BPN?H*&cP60GKvi+=jdMpCNWqY-eEZSMdheGy}m4dUz0cfcPpt7WOL|+m+o@ zCqm(x9xbiGGes?)#cG-*1~IsE^V!k~x|_X&VBTy5LF5x$nqBDxgU235q~R;^OYdce z;t`>jDlQfripS#SB7ddc5(e3GijF!&BSm*0Q-NR0fCBT)(To{4G6<`LqEpWWPe`x1 zljzuz_qQ6oPaKo98o{6r9aBJV*haE8;%aUsb|<^$);KT@%yx&I`3NfgC29cOzm}Fo z+@s|cqk|a>%6TybXD-^T%Bt>&C#ReAo?)lX0b+Ck;3MkX>A>X>6kNYVt^GQKO>rl zGCH6ZI#mfvVq9Ux&mw`2-68heYk}6YKZ_qR_(KP5!RMpceiw?iiq&-6?-J#RH{$`> zZO-`5c%z}pz_4@hQ_`Xi3)$>{y_lKS zOS{C!YWYSZ^inHi`|aW=#dXJn1OKx-rBl~f`A+4!Z;}>85|iUjt$3%cG-L@m-CPX1 zsNH@OFXBSUZM?Jm62$o`H#)$Aqasm5&jABB70x6Wc;ZL9>|%N0gxCf@N{RltJzj(H z-{&lGT2if(UNn;kT*1Db&2^g`vPR)0X`7mt#8cv!fZe-gfpE3U*yp?9_$l!S7Iyl? zWe35YV(}HtP6l}~3>5tS07)bzBBwZksfkaT_`|*u@m;)Di_^G9PgpZfiyIhRZfaPT zJ3GQ%!_q19G((%!V1D4JTk zE3`f18Vv2vifM`?NVmU^pcUr}d#;NHc(+mJ&*Z5bdlXE*(?1Yn$aifX;CES#GuJAQ z?2JcmbzTtc+cs4V`azi<(BKip_;cIQDl#^c=>QFaPrmvmyOsrRe>JjjZ>1+Ub#MI3 zq3)aARc@(RR~)$qh5n+rRk50Zl-5myA?1?DVST`(OX6b1arya0HqUf}EtkbN@F8-| zGee=>6|o_6+&bn8hFIiDT2eblGZEks*vu7O?cPw()h)0lK9*-bO0CnQOur@u2R{8# zLf$p;n&S9w>G@%cSbTnC;WV2$)b{-FJNo?aJA8h>Dv$53@}qn9uK4JBY6|=nUa3ff z_IbG*7|+(y&tT8S!O2pL*06}izf6oK<4xY_ zz8iIeem4!j!;7uKE%NE{8<+tR!E{q>uTi>StgN%7=LMi*9e+~{Fxl^>6xBG@emc2F z1@`nbYJ8ON{Y`qhLpQ}y*p(;2vo^9FUcV)7QoeziJRboEFg3m{UH_HaXca`rzAcU; z7uMfFpIiy8?$F~0-Vvia*spfbaW$$9aZ)(F8o56|N#DAWP6E=19i2QFRjbEZCZu6P zLF8~hICe*DCjBBLvHijOLCjq-fLyr!UGxL-KJJQNsZj3+flutUfCg?XN}>nO>hKtD z(qfsD{1$dQ?nKVA%D?-Ad!mulPLX~CNx?(>VZ}Xh1upLa_i<$_AnU#uL@u`EzIfWo zJrZk>VnL*~1$vWyE~G1kQlEszh_S5PXTsp>>SKI4i7@WvOk=&Q3qGVpilT)J32D+U z_&joPae0JoHE^r+ylqR5TgB&L&=Zlgn9#6FOI!|v?`_;GfqKY#(oqB7K0)i!1E*+u z`+>gUA~#PrIq1XwMyR}U1J?&bTAx`uyd|o^u(FoHYA)q;9}G*9rnk&AGBef;$ehif zEx*TPwqvZ&QjwXA4BX|4%r~($k&iNS4}+hcQe}RoI;z0rTAm`aF3j`Itm`RJQt*8E zLyuYu)S12t#%evN%{;~EaDJj}G~wF7%=&QIEmMad%5PQ&v4b*eK}}s|OT=*A(q+Di zI(NM;GnyevuGl@Z1^vASOG%SDjK7ja4cOEpb0YE))_Y`rfv=#OXJ%tOU8wCE>BCUt zeCwI%hngk~%3e+nv>x!xtWAE_Bd^R?G**1aY$O)#4fcmY-kGoA543vI9~i37Jo5js z_uX+(9bNz2Wnp1yi}b#W*boI`@7x$`jDn)ED@inoF;SB|F^L+%iuJaIgRuZs>|k4? zpb&e-7JGrjSP~m18oR$UGk14UlRPHx^ZY(VM-y?0`{lLRX zz-^z&wXB0MyoxXgDRR7ua8%7utx|@QzQP-XK-FQB7ZNDhPiTaRr~3(!gea>6gwHkD z?wY~EtN8Olut0o=tPBC?9tRJ*~KB@sBYR9D%7D=h=sJO7tr2l zKlp|T=}3dQVUz}O;gkmT)Wrgn22;W*4eCSLE4BO~>};9~6om_Jw4er1;^^+%lE+Kh zt#D>tR{|+3+z9_)QvZ|Lcw7mrG#hu?p2%$6pg=@~KwJem^9>>Q)a@u37=bl*MVq^U zE5@MGs;?PMeJAZJWJUUd_=%Iw zQf$O&i)+aHi;__0Y=Fk&xOJ*QHOP0b9uBEHkLX}t(*d4vD+%55%o{4`94FvT$xliP z!hCr5Iuyv z7*SKOE6CE8Eh4N}d_ReFr{wyQst|X1tc&N9EjnUS>OiEtyIX*3zcn5VSC$af760uL z!jr{&JUH>>K;nghVuL(`b4jqd7FG{s7+6t|Z zh-5c@{jcoCbZ?Ff$GzIhyE#(c4W-uScWAeEf^X%`8Jf2fh|>xCzO03~?=qZWXgk4^ zBYUzDR<7|T>~RV#Zb$a!jDA9((x+Itb|1s*}(M6YlFI3?&H-EMb>71V^$tb?YKDa>Vkd zb+zu4=oW)m*=Khb{NZQ^p)oY=Cb(k(?Yap=+^_(Dw&%FPjE+LE<#;zCU)>P{Y#DK@ z1g9RXz9875$8$HinP8&G;w$KcB&^p<wzluR__S0*qCAO2=#I9#DU@M z-Dq|+K=6Rw?+CARW#BsqyI*E`Z;&uT<2;>ozaCTsW5BfA?+Q`0`}HBMt>CA5w1aR_ z5s>trFc8^@HSY-`61WlTx^s5oTn^cef$s|eSWn|@!+nf>mHD>d26NsQyzx~NNEtNH zAIf^(*TbRrksNG0ulxIA+2P7AgYB#N?c>1}}QM=F?4NJYg6#U?=FN9aMrH;HS zb8%brh0vK>2<~6v1TTewUkY!NwC*hJS}^Vw?)ge9$2L@Ms~#ZIZ0T_r$*zx_`T| zf?E1tIAA1(>9>}>iPq&ab~{1qF+wd`PL!>jFUDXwzm}77mW{!34%x~ydXVkRhfsW=idiE% zeUYIt{MN68?YQ!Zhp-CEyFQlLV^QRxFTxfD?@tiYorYo!QQ%#WkY-cy8X_*h4M?1Yb)_TwouQ7j}(#p^!%rwAmh;{$w&KP{)ypK()h3m{iQ>(Mx> ziU_jJe37UMMGOJazD?jwC*)pUWF1bZKK$NQV?|A?H{z9cFbA2x-YlNW5bN=`T> zV|kOzA{Q?>zBnQohO(qDSwuw-l;OpP0SWMyAS}dPv(rM<{DH*xC5sMfsmTg zHUe7IrFs8h7N+5_a~VP;uB;m}x+F`;5USPre!Mg9#g98pT|c1i#haDtXm=~AM)Jj@ z`Qh2GXW`)q-r<-nTCeAz6I$jXIJ>NQ1a4@>vQdi_Bz#bc;eCy5BZE{ws6462yHZ7d zkajuL2j0jOT)5%cVY67lD^!nhPH4QJVrom5m$&YyFO=P0s>PW_+$>jYYUrCiFt0AB zg+pJp4fA7aBn_>>$65nC$P|eG)M|2*A*+oria5kCp z@9j1v4-JT7eLz*bryR+l(%6ED5C^Hta|mCR)OstC`+nDo z{3_MOb2&$vxjwrg=nJ2f{QNf-sj`UuxJxW-ke!rJog2hm1e5buewx%x&m2FoM|QU5 zpIY)l{*zm+`M+oRcNbann>;53bM#5gzI*!%*>kp8v;V-di|90u9j)=((EBNUVuxRr z7P+`uh~75;UIMCMT~u8j;mKQVtQG(Z=c63u2(=f`Ew0A`y2VXnPa75pjq%$}d_up$ zcoqPrje-eUEfien37QL(mn;i}cNPi;`s~V{rG;45C@5Trt7$njU4$#54Eik+056ex z0JjObaF4~p0^B?c77P9Ta|(ZG~XQr%fw_*&1;xRJ{6TxO+I|@5HUtIw5VP5IuGfAHi0x7d_s? zv#9C#l|Q*63Xenh3FLoa9{Eqf!i8tv!D$J}ywR4Ge8s#ZJ=K}NXVR(}sM~P*!Kn4- z9FW{5mWy6Mh3Hj6ZRc%IT>0`lmOiTlwC7ENL92ytu#*w_0=Wm@KVOLA##_ec3m)X7 zR3PlakGyA65{P?wBrkm&tqbx*FgsGSU8LIUbp*c~1JM+yT)*^(tHm7*Y;Y|mElnOwZX0iHx%2!go8*WKaVW|UjH zLajm+LlR+Xp%98&`)-IccJqazLLma5_GEJ>>Y^<4YoX8%$E10YV8R2Z{zXDJXCh`F za3BlE$FjFba3n)_aEp+QMSZkYD8i?hVj&ZswiOGXF!CIMoDw12|EPLrmTKjXIxy;@ z4+|@Gr=3-M$A@`87qZ+*mP5NxYm4Py+fC^^eUDH?>Ho6>q#hdX4}4mTphUSH2!r+s=+6X!!tu>;?_2aE&yWHuzeR}T z3m*FgUxbVbbyV=Eovr&n$Bf&R3QOj1+cT@VE1?Fb4$&_x3;AN?7;OBa=7XI5LcA3+ zPV5)lINI4e4ltrW`o?;6K$wqnG5es9fPF4IC{))`%ZK|8w#9T8X%%ot*n`Q+4+#lw ziTq==Y*)N#hs&_lVZoKzOFV(Z;G4eC@wBiGeSYl_o}+7O4y5$z;seF!gjbQ_ovU`!%JI7J^H{|sx`^>Swsaq) zoTvE<&(r+5AazC83OCLRet0{5KDvXf;t!!01b6BxU;&q1K8Yw{J`6^WTfHv`zTVUB zIPpgQ!m?l@s$yRjLh8Q0zMxzX5^9%f_(f_9(BhRit#RQOvjz~saOG8!iCoWLjMp^B z8U3D*?BT*MVWURXGG)SZ7yr=$q^~8vOsGl7Pi-5^@R9-X8>?P2ptg;_d&z*BHsU1% zYT8IR(LZw=i~Q~1@E*GB9-c=be`|Le8|X;f1f%0v6eNBWv|iFS#^#c9tF&#}>=83+ za1CJK2S9}OBmjlvTi(kiRnG4KSjf3_CQS=XI!SbAxb0c4W*Il3zgF7 zcdv?48WA7w#I^4K78*rdx6??!$u1WVGFc8?N1EdX8+Vgx;FE3&m&pc8jh7z_VK8jr zKxZB9ulU9h`aBk*VEQdoJ3GRxTU3E`;FeI|`I?g{6h+hrkA)ggw}O6dRzcZq;?uj| z6U;S}y`F7-t%sr~LPzkujhxsuOaI%*=26v!hb4>?y&R#*Z$c8rSDN-4GGiEK={KPt zcMn?K6KXk6CfW>dNO2N<)MzIzhRHDXp716C(cFv{;qJ_oOJ#gL?hDcH58_oTtl*c~ z#H@j@RmN8hqJUX#z-eQA*%qb-!bZjya_$RFofph-;V=CRW%q^18nnHE47h`c_Qjfo zNu=0#(xD&-)rrkqnSzNx)rSwL&Smujp$6-6C>+*_5wQQ@Vi)!TU0OZD?JM*lq5+;E z?!v3my&qB?OzK0SDeg4J%+`^|ikF>T? z?d6|s^Qg|Z3m3_JRa;gYg<#AhA%JWxnU7S0Y$}K2k8n60A?7jVmEU|!<+SOK=}amn zPuJkiV=AuIeL|D;dP0-TWKZ8bLB8yoCFv>77H+5|h!fv&#M$wcRwR?;m{#nk{VkBM zpIs1YLKTbND7v{epzOC3&XB%NqLG^nW1K|$L}_I2M7K<5kqAgCga4BAq=~(NWWEWb z!k^BQrZj_{)6w!xt+d0b0n2?vSJ--A@Pd|aZF0BHqodAZBsTr7GwnfuPHc|@K2Rs} zILNJ_;DHdPr!H^CBKl5-eLAr&n<047!e8_yGsLL>mN746YPE0?n_~fA;t%ql+Z|q* zCLXGspspa!Rg6LIW2eeC1-;x7+Vu<{xXYf|K1EVpMaq4A?J72>eZ?tq)>W*Hsv#G> z*v^wIqkUTb)Nd@`B3Czgil4a~fOd3oY)=ccntW1-;l1=a;{m*Z`%4PHtjD zPl`>4Z0Wftc%YZ>CVF79Ep8$aDt^Xf4D*gcMW7h2KgLMqgi=KpcX1ZZxU25sb~58u zd5QzbjPtA_zKK7BtB3>9+tRKo*yPFZOBFgw{yt()+j=uz9Hnzs$vE4GlJUHq691f? zcIGcUL&gjC%yu%axHu}%qwv2m^)B3W6RUwZtc6a8zPXJ~XlIug zL<<@dB+g>n+n9eL3?JSSp0-fhLuZxOdGriBYVTlQ_ur6@8%0B)a0v_{k)8!ZA=ZS5?s!b5G|m)`eKtV}>m^ zkA6#P`-^q;Gi|RRja!Z4SxTgfeP&e=SZi%G60miTP*|Ng?7TZXsVeFa!$p-$FFDnu zN<}8~l0CC+s=ct?%PdRfMJKEIU_z7_ZAG(nQ54O}qEs|HVMntD)kNZ5tbaB2(`oys zwbjIiE)ypikwu^23KiAF1P^jtGE1$Y3gp)kUxDG(Mf6QbI1NYsw`J_yY;tv4Xnu9I z(0lezPBrMKx;4~KkL{nvvrj9mpRmA9`#p(t16)m!xJ=XXxg6e)EJO!u)kRale07W{ zpkN)=)MKrw7vT7wdQDBeuySgw)|&b;rl#jWiy(f>UUUIcON_O4NK9k(kE*5CzXU^U zP3qtSh1Nt^tu@hoYoeu?s11e#X%#I-(~__@Yod|SwEsELYX7m5r2^5%_k=s_Q+RDV z)vTXBsZDduv3|k=t)D7ti^OAF0gQ+W!P|~8qPyn204-z0x)^fk!x-@ubSRY*BL1HYHGAFA%TL_Dyun_{Xi0J!bG~cJDo`)IA4b~DR)4p&X)Fd#eWb{((b*d z9t@xUS}#|wDcYdvcyR-K5+{-iuH|tEc+6K1avj?2)mLkx_nFjqkvMyFQqKSlUtQ~( zT^dw_^C8xGs`DOHRn2G8>l`FA)G`1*+5D3{Tjpoi99ab{5|x%PqRyQK-XX^@C9r`a_c_nSaE3YqjE=Bhe)LB+yBYU*S?6l$Xe746Cyc`5E5}01#-a}%91|C$ypvqn1u4DQksEoY zo`;sN?1Z#D@=QZ8dR%ser;SBwRY>FYeq)y*|8;Ii2REhDgF0EmdGQy6y5Ve~F4j~n z2#pV#!Qz9m832{zgFZ9H&wE&-!%O3Xs{THRk2Toy?LOP^;EnGf#u^j!78K%+cqaMG@L03)hwZm3GeWLJ)N8EXPVe<{cfjVGw| zK~ypqT8Wj-NUc|U>R})#I)l)f|1ie=q=P>_fek+KiU!5%10DJ7-kDT!W16K#{8U4L z4u4l{jIo;%wXwc1j2GQ-5(Wadd(LN;UwGumkm-tUjj~J%yxv-j&}4FOVb0(H7~dLm zIYMD;k({JlW>3b~L~?GY#dEvFS$ljfZ@(r6a_(f?o9M{z`&nyv2PU@>s~SgIqi}hs z{3Ras9L%lSP=hA_{3DDoRHvgD3D??)o?3JYsE3l}_kE%Nbx&u1Cw8@h+;PKd)WP)t zsiQay=C&2xQHgJu-pe0~+luW`!Khw5vmVwv;ecN6P$0X(L#R%k5xenqv+TY36 z{{GZKtQs+r4`9>Ks+OhQ<1{Dw4<+>o0z|Ve>7YVf&Hz&u~hBw4|SXw09dWuNh`wf&pk}PB2 z5SNe>xEfu=c6bkYSQko^>e*aHRm^^{3w|AH`7BY~$f5QpwyPLQSY=d9hPy}G1@CS! zva1-43XIx}ATM>c>BKWzKgvfYTixVhRvXU;6SCgeeA4upfnyM%A4OwaKv>_hsxYmhh`VSIK6lZ=T#$XNYjq9Ya zyXZn0sO66Q#?w^M4M)0*-LTvyP?Edd2b%Q|P59K5S%qEr4v#Xw=plZhy&H%ppElxX zt;BJs=b+YujqF#ENxKo$$h}7k(gT!iTG)E~&xK+qzGY=XwX|im5einn$;NK?n_@G{ zi{se2_7q1Gi43(OEgJYfJ9ZvSJz{O&p`KJ^-KI*NR!I5N({kdvpmMXe+cVqS)uk5` zS>NxaN?O>i<-MrJ2hhPOkW z3~%9MT~^+QDs`b7&WS_7eOuiZt_L;pfGyR-bf^Y8to94ARh~U~(elUfkd%b`%j{gN zKMCa(8PoxCY=1G33NfeftQDhkK5KFIQGd}N`S{b+^D@lsFSeJes z6Py~nsS2FxFZ$6nvBggRNBvbv&4oy6O$Uf3Wcp`*(3mp)y}M=xYqm&W9w63mIGcZMDVMdG6QKP(Vl2_y{ozm^3`JeXqu-@(W| z{3Y&3Z=u{S_4z^>AWsZxPU2YpO$La654Sqxa;Cg55(C_#_eG-hzD<4{p~eug9%Xj4 zQ1ZU$56y!(FXEA!IgN2LTmx|kO}N9FP{$H}UgHCrkOf{K3G0496Tba{S|V~hq{O1P zOkPm@f#`<5>G!iF+)y=%2TRgrs2I#WunZY0MrrW;SNKSLQ@eq~BbUQdMgPoU;s|Pe zS_N{0T=0V9V$lExMvC3gw}$C+RIBYqHxJ?`conMPbFn@Y3>TZwWsF{+z7QM2Niwpf$P8*MtmU#!2yt5X<|PpsDXl4{ug36%o!oF9MdZ2@Q3oXsFZy4 zg;?EkYlL`EgP^(fQ=*f!Jor@H&CZg7!L$q`jwG5r(MN{t7)*SM%r)-HvGN@ zf!hQnpNes=Gd&JU)=!_xAGH!r_Q^iSi z2;yFyr*Nh2M(AK+DfF#AaG- zH(tubQE_WXTZp5A*DA3iQI>RB%x4{GZ0kq@w*e%xIF&ZO>B}@8re%t3o;PEQqBK)& z7%qyf3JY+c<(sqdpbQeS7L-M6Ved{b<$=_J#3^Ra*pl?9t7Q#{x5*T1MLWX|h!W@= zEB{(N!l9Lsmj4#_Lv@MN&zy^gA{)SSt~j0cWjo{qxgbxmSp1WD25#A+o^GvZO-5FD zh%E?$I>BJGb%N~#zDNvqQ_qFy)ReNt*Q{&Ao^Usmtrfdjn&ybd$-4GlK#r>{oflxM z5syrZ#9r9WQH#XUw4DcErk!r3j18f+3LFMd6PJiJtV?*s6Q(^KUQy@|i3m7uhbtw& zu|#~0rbH^MDJ=g0aCu&s_sT*JCFxgXLfNe3-9sU4yqzH?zB%6^^@h}onj3~T!X(rK{D=g z`Fq6b*y>-AZ8e~w;LSaFwzLmI_lixOQ2hT z@BBTLeYUBL@2i7~!+)A(!xp3QTW-q%exc8WOmOBO(9~>#MeGyXdLRD=ZTb0)nItk* zPt5r+yBPUhUzoZNS%9};(LT{c8P&&-A{7xv)$+qW5$`=FLB-T7csg;(0}A2>1Uc?r z*8tLD2joJVgH|PPIg~j{z8X;jB|pD{!JklPnj7O54r00JY*n0=54;i$mt)U(L+a%- zF4masFQ|G^y;kw&l_+P`|1wqemR&yMkE2&|2swN8zV(Ge*ytDZx%SXc$WEd@H_}M% ze4#2A6`^X}b`IrRX2Famb*Ovfe!!tuZG}*`8wtgSMVBU@T2(`;U6&)fN`V>BzB>6i zH;1Tl`(UVTqEh*RJeE{fa>w%g03Nf2D=sxQ2jfcajmhl#g-d z%us#|yG6ex^I^6&s^Vw*x3pWTt$g~o)K+?f1^s_R>yI~H!^~he?KN#b6x`; zKa2?ortgyZ>d*HIi$mklFT8%9< zEFzi~@mg)tZ^IPMs$sJcgz3=O`m^fL)IxCu&^S|kP2^fNd>yEGGA$5Joe&Lu*^-Px z%$kFwXs9vbzdY=3Lk->+;;+$nvs~5Y^d}Qygj5=`VA-?qIoZg(3X;z6$G)Ju6V-e(@a8K-R)Wkst4=a z*vR@MZio*YNX)8&@0n>5*^lv-?6Bk2+#Gou#|efrVq>RIkZ_HlV&NE!j&z2$w=wXZ z(r2*Xk(lb!Qh%alYjjc5s5k&BmZL(btjbMn8aazw*n7klfLu z?yc*hN%QO4j4sk(?R1XUK>5iOyz_QLBw+|6IEmaQdvZfeMj|<7mziQYzwG^!>TtE7 zl#_Cx-mU+w$c|u&V4$Ap5R2VEMRwdGR4|2s=Mf4iUZV5QxnrWa3_Q5JVuMgMT$Fv0 zSt0aL5*~Ll2!;5SxWAOH$aCS2W$L8BU==RayFvE6DqKRMPI7iu(Nda+;P9IUBWL9W z1k-oPylSgx&xqiND?7@Wfg|+mb0r!vam0^yOjKgmUxQAI#~D8)$%f%%&I$WoshW6*_B5IGHHckLLcIufv#V8y_=-|QGzkuxT` z-g%An{t+f-gJhz$sGw-Fji3tbDk!>B(HglA3hYl^rD#ru8^771FzWe?DilJ?d)Ne( z<>;TEN4&cf=p`GsQL4uUlZ5W4#F&3Cpb@SCI^Rb?vqnf7aGwI&*!yBA#J!rTg_c)E za*=S#RkTh^M5)_~X(nu-@Zb-yjCnI4SXP%|*?PO83y*n2VfDH^Pw@KLrtJ!WW|zj` zQBHQn-r8IZM5{O}u;FQ~idOLyt=uS-5?Pafr4nGhV{&WNx^dA}idqgY30OJ*0j%d) z(fTjYIG=Io|$qrS+)i@mM>(ml7#(SsAM!4<`Adu!tgB%{lHg%!qagSZXUzX_ViD{1==m6t0F+ zPw89Y6?p7mDFW7bNe%GA<`pj~Ho{R{)c{6(J2w_mw`8UfFR30+#8=UyOyU! z3aXsOUrob4f7C##TIsW&tqAscSpzBLna|JWKHosv=4j4ufPoC=)`G-tE8Zef@{Ik# z8tc1((^qtat&ODncp%Fy-jB9u*W8+v9jCfJ2(Le^nZc*;l`c+0FTI@>MBc%^m`aT1z45 zJiMf}w2;%l;Mb(@@H7&G{6fj#O@Z)Xdnr8FpEB$mU$9hp6Zyl4g%f;W zK^rMvgO1hS&yqsi@*Xl1Wa3OEclaV|Q=D5p%~xyag}2q>GVmU5tG3v~?rPhr(8DO6XiFeUflSrQEuTyUmSAZ>31n#M^!@LqeV zsz24Yp@N6BcbUDoz3rqJr=5Fss4#!nP72ZedWNXc|f-`fZsxYdf6iQqd zIH8s-%?}L-^E)D;lHjYkY?f4gUD}RAdgXPzJv)Kp<6%T=jC4Ny`fFPB9w=2sIJntK zYEG$#;o18-KWpD&NqR%Vt13y^Bj%EbNe4SiZdi7~H{qe#H`D5H&QSc_bZurAX{4rb zC4A9E>gahVlU~y0nj;-5GU0F+sW+Df-d_#I%NU6gF=G5EQA)0PFki##FnG1j!{^?G8gC^+sI?=0(Rv829_9L@83Y>o&%|!3UotDGH%YOTv2kL6;A`9mfiP&~RyU3F&6gEhe5u2NH-S{*FuDn(%v>Xfw%aN#lN50cF#Gh_w^ z@je^v8=JmLSJT0vAsVl1`P5Z9bfz2W-pIiLpU}fDQ5!B9&-^Tr&Mg=ZZM#XmNdsIV z?ziIskev_|R^6G`(}hB0V?9$3SZ|X%tG1$8FT}ltt{k6qm0Te_Su#}eUaRHrJ%#4U z5^-NEB_r|C0amgUjAoOnqF*;}QC)OCUBA2307>D+B6yGOE;ZII7>~5T9&hO`8EdCb zrSxlqz6CgUtsAc~A$bXviE#{4*{H#Q&0Dm*9y7T1kcb7Tfd&44y@xayO`57e`I$yY zWZhI2Y263Po1#I)wH{Km_tNFge0_eW-h9qspSgg46)YJSnF}rE&tYb7Nz1o;7<@^7UmQlO6esKZRqHFIVUc zd#ivUYIjILFb9*B}N4zyZSi|0pfZ-j^X?<6|P~OEA zaD1G!2g@Uox*$4UYKw&;d(_d=VS<#d!Amj7Bl&t%L4JlXL}ADaiSWxLXin6gv7G#yWs9e%`WQ(@Xl=dMlkSiL51f&enx}^{yN*@xAW~PXIYnElZ zC{0lrqKTLX*&tub6$Lji%-P{p+=C4n=s;U#h&C>V2^mrW$=)baiebD^0F26%rsD4D z4AP;>4AH}^7a5|{`OG5C#t^m4l4|`uhKO+<$OEZmT6v(Mvn2jyd7#j*rP`FYK;Fk% zO!u!}miGw-(nbHMN<1GjLe_FrM(CZ{68~Rhgji3J{jnDP#+<*x{v@E&waSc-6EvPH zwZSo^+z(EPC3B^%IDYTWleSmle%fVAHU1gnb2wY-N|h~tKV1BOJGk>+L|Mas;ssux zZ-+bT2%bG#BlCO$YZlXupyHTxR+D~$Z3O8j=otwKQ>$6y23-1>0B8Cx8Tk8`jP9xU z9o@Y}a{Qy?P%tMe79AC=Bys2xHf4lDPQR?0aOm8nVBL%-%*$cLxk~|>yyKAMcsa^B z?>H?ycc~Pux#|KHyE6jVyJX1UEE(N%@H;Df&T+`?pVbJ6YbgxA|M*GeWh zH1%+Zs~1@iJUQkS9amMp17&liPx+|BCsFVhS0D#YcG3aYD{mRYPfKC2^|VB69KFFi z7ca}qOv&q^O) zdkdtk(g;iNZ~xC9t_m4!rNjv62!evd{Nd5#3unaA@#fY2X9AAj{doKkN42?XY%X(=%?m@Z9rM_@^ zJ?;uPt=?RPecO2mVmC71k_l)qb7vO5UYYuoJ5v85;NgnXTB6)h}%y;28l{@nr(MyK6&H?YXr8Il= zDkOBe5C|hTN+Na<*ZDc_I8@wQSUDmdxG=@Q59r9ZN~SCNn7|l#h6k{)SW3{Wz(BRF8~MYd zVkwe5r1=H}z-sAdCum+GUB$joY`AiqMfp|Hlt2RxB87%4)(+rV&)nApRRvx<@K*x zKVnw<`kyy!HNA;Abg$IZnJsr%u~+JD+`acODyu?jY68)Gh1^ASLnYSk@(5x{<;*X+ z3#NStc@@xkpG2Zn5pP^08lV~{b)VE5Z-Sz$+t?od@XJ0_X`-gOrYQiT_ag&-*AcwV zhWNwk{Zd2Ct*vnOpcLuO>=|#Nk48f`DDGZ65b7L|s&JC6XgPw-ZP256HeXzXliS$1eS7_`AgzeU0C}o5ew%bySLQO5LJC zNxW30sE1;BuUth!+M z2{}x>0pX^bPGjb+rK*hAP z|Nop>g#5lU3tVJqvPAu8+*pc+Wva=NbRG{Vra;1|se!@tRkBr=X}7jQj*#XPM@@CM zvW4-t&mfC6YN|`bTCS2&Gg-4*)uvhH7E>+|{Z{7asWHaw)Mk^YSD9_+3s#v2e?Aik zWfvqp^{Pl5X;fU0y5Jb_Wzy&5Cp$YH@=GtdqLTtZ` z868q;eOa*lS*1?kxJbxum`!Iv=|sXPCYiDc%8f8(`$9s;87>e$c4}X^^1XB&f&cgq z^f-sRD3NP;4KGS>;o;7#i_*uab#VU?b>5lK>_=%dp3Q9hQA%*SRpD)rERTPb9&2#T zKD;9Fp4sDE_&W~#&t=S4S;wnVJ?g@z3b`0M@v0ON+S_EX60}ON(ZJ$NB2dtSh2pCc z@ji-f2a51!!1b#r-*kujSJi^g*b8p|lT`cFML*)I6b{6`H8t1 zHCR3M8=kMwvi>J&sV~+s;HmUnXtzbj!fRSqJe5KT=>5-_;nphvVO5C$Ii-&XjSJOH7BYI{u%$V+#-6cF4{rs@aj?C#6PIBcrZF9W>^PFS? zbyDO}bhRapZKz*rpWW2$3VUWUJel4r+g&9BXcb74#@2)~e8O4I@0m|#dCH#om1lW% zolNw;|3-(g&#A*x0u~chOB5=sSU3#=xN9i%FQh7d+=6L~%D3 z*@V`l##ruJC^@~@CbTAPT1*Tv(Pd7M1_f5sC)a_*gvBm4b4hN`A|kM+1ugD~KjjIF ztAc0kgPw+c7q>gmvm!i9;CEl#4l%V4#>3+#i^%|{g~&uoO>DZj@@P>N!H8cDG=OX$ znv6TLsHr}W4ir_nQ$MtiJY>q27Q`R?1orv;yGj3?%AJz_cUA6`^i1XczlHQmo+Eu{ zzds;7Iqe{Bl2u#Ee~}B||HHE$hK4dy(xU|35tCp{S~z?)pV^ z{?k2ylK!J8`7AOpBfO@f^0FgtC@Cb(ieTUn)0h?s8T?F93iN)+!$*qX(q>WXDkD1$pxJ2y$dLBVHl1wXqhMn zJExXWfwF(19Ihju_*)mCe{I>HeMp9EOk}CqQjQ~6f!zklBnsxOI&x68Ka5dsb;eBZ z`Wh1M2Vi&~Ioh-0x)a`a<`2zc*Y&-5xwg}3Gch9Jc{xOPe=0N5D6Nb82wHl?4VL}5 zUK?WNCWH<8&(8VMJ7-D*nHaCU)Xur^S@_no=l|k#p7DQaI+y&+uCBk_bk2;GmqE){ z|HF~|HD>UyOz8#BO=G2-7_+XFJQi{wh{m5UZ>Fi(tAu>#x8x&g*}`=D~73H+pm$>h@$8LNygJhZkCF>jb zWG?31z^m`*n((y1#nW==6S*k|F(c(+SPqFt4;x0x$$shP7YfNzpw(ycZOuZ-T5b7Y ztX87cb{Rw?23*@h4{k6dAhxfJJE3K>rj#zDgBpRRL{I0C_~T;6s*)`A z%rY9_U58c~^zG;jlq9=Deun(2C+QSkEHK{+LF2`qnVE7`kGx5x=-A;kyi{+VR0?sK za+GnfRn2FOV}>6KHyu`!Y=bd6Gg?T z8zcC-h8|FnDaUg8U;^3bmbcW1#?w78ivf}zO!t8SAP3^d&+((~ah8$y#thjYH{@o+ zage(>k)*!B&5_Xee3l%C9Uhh?*NXnadPrz%p97yq+viZJrCJ^vbnSjsBa9lMaf9nw zRDJs>G&Z=}msqZPtKOA_$hC&kWD$S#hR^YP5UJM>I?a*;-7HrPMrVu)=7hd^O&uk_ z;O9K|xUkUDhPTkOiT99N{;+PAd<$7SCv?@Dy8cV3C7usNpO9hoUWOyg^}5EBTO3&6+Juq!1iqXiYIZ|@@_nq9GDmy zuEijPu~5>bbASiEK#ulCOt|mCOS*(e7T(?x^*78NFIVe z-!GCs#}4#aEKkL!ON-?UuB&DA5*Y)z;o51a$@eh28eRE(k0Fs zR?1&-p-Cop>vZu5HoBX1>|`3<@89|b>a4~Eodlg$<6`RyQ&!8>k(~Lf+>A9IxTmL+>K_aszznSU_JI*~_^FvISpuUn3vZEGmMP>*Xluv{rTxeaKly zp9RY>>ea|j=nWe_T`P~#cjZ+V2^cDRgB%Qg>u^yeqDhwgE|!?N4izLxaA+NEp2vEb zSWMM|xOFndQCu&lXzmq~+Tyr}aDF|C7fEn`y*!4{euLZ$i&?ut#-O&~WkIb=-dv2c zN_*SELW`SZA-%P%v=E3(f|DENT+H(2H}YY8>a+@Amrxlnk!P!8cfhOvdHHtGQxg$SJau(wc-2>6%{ zC{mUNe?rr44%b$X%p&;}=M@}|eKRO6l>I}{veIBr%i_kWY2p1Mids2EcskVsZWYPx zvFlB?$fm%LO$K`Wr$<`@V&{Oi2At7=K=<($q%lH*K{jZjpwFYCJEDd-#;NO(x-BFK?6cG;=0_v>g?M4`JJO z%#jY4w#zNhO&U5-;=fzy2hDfLpK*s^?G8B+vuJn97@pVCdne9vF3BS9lD85M;)#3Y ziTHSYkGz~bj@u`HjgMjbae-rX=?7?a5eMa2`1H*|*_6B^TZc~bBQefJV_axO+4QPV zqec#K__Q)x_t?R~;jx>85ufJTo(%Xj!}i2bUC%Sedc=J^TA(03y28*>xh6Iuqf{nl z2AfOeBUtOqL$nRm4pW{W@vz*^bKZFueyWDwKQ9!0W%PtahvmBba18y*kUE5&>*~?V z9UWNW-hWn^9+URQNpsnj3K4@g#d?(NdjuC)BFIPNgFZ7IBe^z_E*>1_oqsHlcf_kg zpB$AF!U*PERg3U@7IaR14Tp}(#AVX0qo~vEie9;BcX}R^qk~pVB-{CJf`?i3Z#wyV zYeFf^J|@?zIv4}avex@p7mq7H!Jg+VCagFn`vzeSEJt)z=PnCRi$+%OLil%bFxl&+ zUT=m%kMD4M?+%l`Q>nGsPOUTF$#pSwyZ*QwrkgA}5wbwt<8rX+xy@70v+%M;FO>p4 z;QizBN4Shm9+#7F@<*RQT{Q;WJ0Ul!`fO9Nh1TxT#v18@*mVMx+KHJb>3Rq|N!LTG zlk$A0!^FcL@S7t2;NeLe>?DhPN*+(9qyHKCJSDj`^lShjISmAeqsH-9FM;=2O7i%# zl;p$D%KPwUZu4{U7~JRG`7}tmAp2_;UxMT3Xu7-S~YGT#bo@mG=Ih^@Md^-C?qt1L{Nxk3p zWS#43NLdmp!JSWs2j}D%^b2Oi9X{I7m7hYI6aXP*ax87qRMMoN&W*9Wqd!>dio>UE zKUnJ`HLtZjk(w9So~$)bqqWc=4etCjTC?YLd(Dl}UiVfRF8-M?r(B+nG_Uo&oQ_>y z^F8hslVQRS6pWVqfWlECeE)+y9EYddMcJ1O&wD>23tI?tew4q#ryiGNVrZ0kNiM_u zBQN7Vl>}=q%PqBC`L8)xo%M?!%(cim{cN>*H24m=f-@=!rd}bOk>#f=ay>_^H2fN^ zl)ol-;wHe%YdGDKpzNCb6w{PlM<~Z?;%?&3{K#_UCN=@ThE~WwaHleFBiA$;>fEOJ z6K^BfCPMmc%JjMOE5TTSMhF?d$R7}fOYYL-F}lj$?seDWF7e(avzZuOD=yv`|tNq-i%L&AJYDNKf;%Z(B=^y{h)85M~v}! zB)>%rpHurzM&Cn^Wml^OWUI$Ai4nL}jcN2!0S|D?VuPxhJ{Q|FGY*Kv)7I%%R*MNkgz8x{Tpq$?&0%65+m=O*@UT zrr|CKoN^!e$tfCTC;lWlDxbJ(@Q_PwOH~-?ruf4RKg9*EJ1TErl4e@v3oRx&2E1PJ zfuUZC8(i?m@8`A3Cr)mXi_4f3xR4=&sD6Se*EYLc0{Yl(B16KE?AFb|y zAFb{+e_GuZe^MRv2~bA5-!U7R2*R89!TA8C8D4A)4peHPXIpoEiUx9jR(zpfpz^L; zS7avG<{OH^WBgx-;2_1#l*mt0--a`rSL6bxYba!s=rq$c*(qTpTxzc%#e@reRFHC) zOalS!(YKEZgDt)|H)aPbowRp3UIIQ;NrL7f$~2Njshp-FMCpVgP0LUPy*4L-Uxd;M zf4WB~4-u1-j7lmu({jY9)Fmj#MJf-tS@0-QX@!j5d=2ExPWOZ4s>&p6!I`QG2}Eg% zQr2P8<59|8%z2=iGMvMcjg~c(T>L4kp&Y`Wf|}&X(yf-VlGMq?D2K7wqcIAiXJ#EG z5`(?3QafJ@Mzm0B=~uI!W0V@pz&eUMY0QUpX|7hWBo_>gRS4HA#4034>i$?|1GgH+ z$0)#n_~U+Gy6nTJm=Xb zT|G6|1ADH%^=Ph%)=xQ{t-#aul)6q6z9;6s9`&(h-SLvBS^(N-TC1H{A5)c`(PFBN z^_3OasX+~t49z4hJZhlKB)`)eDz~udV;U)o$z!#~%3ItcNN=pH;j)%AYoZWBG;gX% zWJ4)!svv`7acQPFlU>5Axq`dJDF|pm3G`YEN}zXJD9w?)M^y5fveUi}$5~X;LK#VC z=25(=m4g72)KVEkYCP0Zxuadp@!vseBc(IsBq%ZPppg;`{Sp)}lHj8RWit8wEkPOO z{78$F`y|Y0tW<-!yprym<%}=T*1U;w8^T&Eu9USn4GB$^aj>$r;-;Of<n`4k~`Dx`ghK+?RALV|p@?L!Co{XVq7MSYZipfz7eU*$E-I^%V4OF+ho? z>csUL{?Jagxbg-l)sT-mh(AswZ3aY)QSh*zH=6=79hr=TvYQKk+@7byK&25@nl_MD zx^N(C^FU=K_9rU^5i1dXOraDBe~UJ+&08d;<-NC*AV;z*EQZqPNW2O$ILL)z;qpNY z3-ci9UBtppgOzC{-LmJ?aqm(*?EEgn!)ik)9u68p@i65Biih8S!0^!fLyCv)A5lE~ z#t{l;O!R|yKB9Q|^GCGN@x$n(xipO8;kn@q4?BNM@$lBi6c0;2p?LWArwk9hM^a?_ zVI-aPhR-P=?ocnMRAYd+QzaY%;_%NIAddNhX6y1L%{KZ=O1kVXDIlKxk^-VKiUMM@ z(G(Dmji!JYGR6*wGt)gOAPyfxp>3A+69OXnL;&#y`xNk%9T2U#hJHnJWmrEUAX-2D z^py<|!^UFExe@2{0 znZf|EYzhNJjOjA&89@AS8Uw_yrZGU&O}7H#O_)0#0deJYD z5fF=JGC;fyFxU|rCQtP52n+J#mUof^Mc+s>xOJ=@fPY>5J6Ls@x> z(AQ8=d^p_IJDQb)_!yLdNQjR$GL@x>fQK^~0^ZD`2smOEML@@|DFSZ&nj&D+*>p1B zoJ|q%&>V_@lhnIU5jF&zOs_^6Jq>FhZZ1-J4Rj+vdo7>MWeE6q9z($CIc%gNaw%Z- z$)yN*D3>DOXY=W3j$FXf=oixU-g+TLzy^z~2nZnUKm_cxm?B`0#dK7^SWF9CzZenF z47Ha~1RTDEBH+3ubYVVVKM8sCX%hR{&wi>br7wH3pLt6u#Ozo~i@w61yq3|YSC**= zxKsdec6tIoAVh4ZpBN!h=F|z z7(ZC@VoL8d6b1XQVJO&OJw?HPtfweAVgp6N+Zz}Pnl@4t4E=_p;315GRJF(tKK+KG z;KOfd!}(2g;@sUtQSka^hJyWz2<~NWp&)p83kAVXwlWYjeXAVS%_8i>X)T1cP{Q)M#f!TrDAwL>2gL~)=q3q~FLgJCx24uk2#Vwr0mUcmQ;j`# zP_*V6y@%#nWc`GoX#MnHj|~*-?8O%1J+i%aP_(96wATiTC-+iNoVbsHV(5MbiYxY0 zP@H>!fnuA36cqCgQc&zuN|#aJLu?t{JVZgU=3#~?u}2u9G&)KN_0CaB*r!^EABhy2 zdsL~8++wN|lTU(Fa4bKnj6^P^*D=Yx$@MJJSW9pw@yJ3&gRQUNVaDXx?iO~)69lr%VSN^v9n?demr6%-%`SJ0&}rGgf?qXGd^fo8WUK&IZN0J;4( zU9rtckBSU zV=h}+yYEndyn#OyAh$s)AG69LZns{jR9Qr8p7-xkfXuy1tJ!{+wfQ#$NCh_jMgh|4 z9;Hajd$f6j?va$1^m{5m9>b|}t+gKvzq&#Taj&<~GDdOVLk5z^VZ>tu$)S%JNS^%t z)TYN2C_j2kfik0w8KvipiDn`^r*UQ?JZm&&Dm=$Knu+inqcs!Z`LYw!I8V@;iSX>^ zWG2FMl9QPT&(6+fB0N8KHdEpGBNsCfo(-;MB0QJ7k|)b}y_pKn@g8OsCo7zwPCCx| z+l*iYC*wTLM40|Xoq%DCLHO0SEG(j@nF`Z$z05=eA7(HUVS0|iOoZvJ1~Y-n`%V~B zb)pYc@ir5SjJ>n^1kJ2yYZ3CW=00B2<54{e*ByJ`uR| z^rfE~`Kq~4sJ7;s&OWWTenPmke$xAytwMDRKWt%l80e=KfI_u3)q0YO3DsBp%tWZp z@HbPTIwrtOh3dipGZCs+2AZi*-95-mgzAk!W+GI75Nsy0+0YO(6{??xm>Z+aDMOc1 z6ekix%{RCtORF$56|LKaQ*wP8PRRw~W+GaHGXqOM6)Y>l%>*ppkD!gnG@7YA{WatV znk&oGGfZYGPtP-%sXSdH(yYqUbD=26Tn!FHnpJsv9t;mQ--b7$%uJrnhT$RRad0lm zOy%hu;6lxH+;f>%KB6qjC9MyD=GDyCvGvi_S?gb^L0dnd2Av~|tj%U~WHHN4!V7P$ zVJ6abkD6w}ME0m<_90y3kZ3buBAe7UQzo)qjF~Wz6)|QiMtjAYi5M-#nu!=)HO@@L z=nHXXB1ZR)r<2_46*Cc|Z@pqBV)Qz-`T!e7u4gUqG>n48dS+AAQOF8xP*eHaj=oSU zX0dj3yv1A(R}+_L329)a685r&Y!q8GG7|~=i$-Q5Vc%$ECK9%}F&*iQCM-?O|Hs~Y zhgEfSeZ!tcIkbZ`K}4{N3f9=L?5HuZf}$~YVl*+a#`Hu5P3#Tbd#`OpjJ-l)JSMSW z?41~U0TO%1-u-?vv(Gso$^Cdg&vjql^S;;n*Eze)%$l`Vn>B0JY9O-}c2Wa5--r3= zw&`Pqp{y&E+RBFVLU>aW;_$7<(kJXEo+wUkh)=#te>IfWbiIgY7X;59Z7Q?1`cwS)u(kS0eP#h_?-@0zwx0O1v(wvH&4DZlZqo+1KUTKwGZ2WmZl331zkdU?*G4)o}GxTt&2zt3i4`bE72hwgL2R8+ilL29<6rvod88e$4Mk zquePozh@AA-B$Lh$nZT{PeJ3(2;8+jT=38gt!gWmFyzpVwsKWxn3e~RgLu(aE+5rT z`cCge1O{QJ(!&`D;lTnS3{P7IQ@3`qSE=_gt({!j`+imw z;uH|0e+E%BJ^*>kmr z*T@7)NsE_Re8Yx#p!Ewn8!y+2TfBqSMPr-o)1BQH!e)`3<{6?tgDr>JCdgI1j!ubs z&FGDT^Vw-MIzet=u+ydlxmwxV+j-Ik^sMMTTMBH|5N>4hzt zVy-@SkvkcA8Oy8DDPpu(rIr)aUx~a$VXWACLOept&1GN z0uQ>#JOPuE5E?`SyU3AvX-XIQ9h{%I)J10bmjm9BcN!Axr{0kVv5m}D-MEIy>n4X9 zkI$i}-Ovrru+M%TLN&WX5_F*KM)BD6>JHTtPg!pu6Hjt2q`;lkUEYoxy?e-E;5&ax zf3p@UBlQ5IA<@;!&M3dsQw{{v+4?3&7;S^eKl&ofJ)1U^a=q#VQT1N(d!{YPb?Ef^ zmXQ>B^t7j87G?F4B{Y{jqXUimaw)-VE=N<}zQ_(2`@gk@6n?!YQ_o{0;AObsza#?};W!_bPjYsizi|q2BMw zHK8PRKM(RA^L2!$B-Xu5#hWSh*Bb$}Wbc47UY>g4VV02h)_Za}INdE0#L(Q%foW+W zEX(Wj-_Co`TYcpT=2-^GoowY(g6LXbi2f<|;{D_=42GLD@qIY~YW~do@?-${(FgKk zOucx2S>wG~N$TPrKwJCEb8tJMsIvwT?}%979erz{)F zyq%@E{pa_QT*b2SFE?y_H2Fv_>7IO(lQSiK1PTBbY>rwTWd7BSWoer{B!pIe1j!9Z z)BHbl$7Y3Xfb3_ON09^M!~TerF}5gU_OT$>Paxv6dXRab{0$&Z83=ui7^gw1qMAda&FRFZm3Cak`FP8zQp`TjPg- zT_DYdz&e;^&mST$XXc@_X4Oe^RaSM7XX41+u*zBO4|&R>4LHahlvW}X`87~7PXBDK z1RgkxGPK?5a?T=DV-$AkK5B~MEJCGgB3BdS3Q7GzaTZg|`~-Y7o>KO>(uC+$5nWAC zN(sP~GqWN}bgP|bDCJrv`%v$YnQpZCjme>+oMR%Td@8d5zog*A5XyBs;zgT2m93GY z#v9CaXKoO9=XvcmGw$Iydd4^<%FkDK-)B8R_=l}qT7JpO$hcnpGuQ-(9%b1SZh6eI z(ZtVWU%#c7d4B3*to_2vW*RbHsV*`sfF=;l@R`hx?pMFLyU5Y~j8vtLC(kc}L6GIa zV`NFX_5SKeIuLTj*Q#I(*IN{Glcp=tsu)36rv8wr_#%YTG&%T3Un?RGsU@e(I zW5@E&!^g=T8KC0?pyL4OT-rNM06Ja(I$i)eK?ihV0YE3pi@?(!2ue15D+kkzNwCrZ z@njuhz1UY79pcFX;>iNyDFWgt0^+Fx;%OYJbJMU+1gNP3)ae4$83NQ90@N7*bt>Z2 z1*ozBRTiKsI;biKb*(CI<50$uVJd@?1e6*VZyr*Ov~2g1kPQR-C_&Uq6F_PL$e9Aj znF7dJ0?63{$k_tOIr3A$I({y{88J`p=wm7dlr(hg%O~t?8|Y<~M0BUgmPB*s0rVrZ ze;x;2O5>m>r^z!w4uSJ=1s9fwlvRv_6-WcpVH0u6*p6|AFW}=8|6Z=ZU)xqJE#XL* z6Z%ndNlN)1;`b08{+?^2poQ`swDVjf&%>u#x=3D!t6qzFFLxJX<%QyhOXTPHnY$FK zG@fcNlLz|pDI9PF98$t$ko~FOrhA%xf^=n22|6&B4pM2m`~Y2stj99`I_+7{C*<`r z^j0qY@UvXbu!4^LEcbw9uk(vs%P@iZ|AJT6*_Zz!mu1X*;8%G(Ce&qvd>aUCy%FCq zo+fORS*ZEFjq(6Ae0LL+;X3=RO|sb#(W8tvJ3J=xEZjUw_CcKf0%>2 zf#5^*!5&Ur%lF7rG1UfpLDBK_;a>SYVC>*tjU;YDE zza4;ljHhk~;m{f^jYp}BFZ+bhPY30{@NniKc{frI^vP!5o)%{V)sN|7HW>0TRs3D9 zji2tng987gDZk5g&1Z~ou_PS^;h*~*%O+gT5SP^tgXqrKdmfhe7?`nw&ExxHg6Z`m za!tcL`=>|13C2-Id$nV-&4_^-pTGp;sjv8%bOOphp1e=;nZ=!yD;wrezmqWNVIQ)q zc-nhX?(g>40A8I>`F?8xsog2LB!K(y6bE(rDGqARDGsXtY56q<+ak(44N&`?maDSM z#o{s(mjLzbX?$@Ql26XatpQ@ov!EdJC?j^7V~@#E_MdpI8=| z{=~P#IhH>;q-lQww%N4%Pq_|GU%dDepQ00$`%7-=<2p3KB9FiL3s~qwEB=xz8Ml2$ zNB)vyBhH$owR!|sm?IMTClU6>LY>Q;lRpJ@Xy>?SJbq4o1ZRf_l8_2XSCY~@DQ{85 z3vy>L(TEG2i8f!5XM-fVUF0N@d=abZb(D7zj=uz|bP43L&OZ5)YylJ5XIz$lX0vO1 z6{gfWT6q;@x6UqIlMk{5ga1uV%NaN2bzJW4Fpyyugn8vn`B2C=We=Kn3mh6xPjAVO z@c#XLxhsAWZbRvPPr0|{?Y!9@14;J$U>Y9OwKz4tDO>5x9p0?rUAY3E&OUuQ5lm^- zr1^K{c+h+PT}&sQYTg6;$5X$1oY42)gI z?rLOIzv+eS!>E3rL19#XNBo2t6-M>5j0)rDJw~OnVIkc$Dvau5O}L7ucTCC$0As63 zVbI(+DGatcW`5P*tZ>-on3Xz=x^Gc$ivoMgtV9ATe~Z!@MBc-q|3G^j(y}T6hVShitO}zM>f)uW0CAbU6{d1pcq=nOTshtf zlh9@#h0#qPABDx-{^X;)4f65vRcf$?P5hKJbe`jo^^(?{PyHf%POhDirUN}U{LIGJk zT?qv~;wd6bNdkb$VI06kVHg~VMM^4+PORaIhEJ~OtF=(|AuPXr;k@gwN-2bAk-V- z)j6d-tIjE{aSeruv6D6UhkQ|kQ(DiOoYFFCa!T{41%M3+_PE-32j4!aj`Af)?Nl93 zYW-dlq}H-NC$$UpIjPNUz)7fPLr!Wjah%k~$GJ$YdLvE`XB+YNhBfA-HmflwwaQI6 zseRalliIu{3e&x&rX0dbO%*1RRyO6Nrbr6Yy)myVOe9&FDNH2IZKiOM^kZ{QKVP*_ zn6};6LSbt5Sqn}$ac}UCFyswU@D4Tm)6IZ)mAB<)rldE%9-zZ8#~_5If4FFDU8F{JgIKZ{raqx$Ut0nC?_$S(N8nU&=voqAby~0K0eIq4!H4h?) zPYZ!~KC{QhD~Or~@r+1NJehnN*HK~W_7VA;D+SO*Po)o4NmQ6~x=tdORZl440%XQ8r7K-RK(k${1wKi{!)s*(udo^ zM`<29N(ADVBl|^~Z0iitDE%>5+ee9^Q*SFJxV9Rt-w&iLA236iE!OTk`!l}mh4 zrqSj$V7os36n2CuuOFw;_3twprT7m(je}|02MSwaP43SrHSt4Esq`VI)MFp=PaXUb z|M0Co!l&L&-+ZKSyKoW34}hF-kZ8E~Vm&S@GTe5C3G?(BQ#4&n6Z zK9v8&4CVB=dMKyIvqOR4dF1i2(f}l}hT^|a;1B;;@khIXA1fcYbJ3P*O3N~Z0&6!v zR>Hte)?pmTw}x>bhY#aGt{J9q1-{Ni{)63u=*2LlJmVp|e$6S8i8$}|4yZ#QiHClo zoZ#fy<}<~>z-{*hmu+8u!DZW%FF2f4zEmn(<`$PWnJD>|f)MvFl@Qp2Q@?~Cs1xju zEf{2YXaMc|QmI>oNsfV<~L7%jv;9)Vpw~K!pxpk+LDYNN z)Gq$77prTsVJpMX(BOfeyD#X>>sm!Rm8?i8*p=|flpv~^qOhHZ8a+xdKW*l;X92V# zMPcqcL-6AOx}E~HcWMVcO;JjC9^1hyju|~@LoOOXC(hgBSXU2Gx#x!Wch?2le<4}y|dcQ;mpi@`UiJrj#EmATZ!bq77Ua? zgID#}9gMbViZxm|6Hz5ZI*#s{3(qKB@hNm#(yT; ze0Lvr<3&W+%iE9B;PFa*Jnvm`Zb`NCtY8|H3W<(dkz>~UonH~>VAHbpRWKBED9VK$ zidJ#WQ;XzH;CwoNI{0H4#hYUTX|OcS3sg~p4%JHejE+q#_~nHQ7F5jq!+J4$<{zdJ zzke4R#&7(Md-%Wc;kW1?UeA-sKl~?@7d$g0jNkg34=+AmIWx=i`jUGX&gjg3W1Y_E zBHw*|!SB8v?HR4%yBp8qEYsIhLfrVhfBNuCxfhvzctHZ}!)N@>ho8fJ%zyvkCwH1< z^Sii|ods^d9m;<#b!QG`wuApa`0_IfefgTKNWp*g#qA%>P>>qngctdLnH6D{47L+A zO;&27q6`xE<1|J6>7~>x&CSHThPPzpE#sDb)KF2XhUcJWi&%B*JA7_p-$oosuJV2e zjR>miM)MUV5i9oWulfa2gS)#*dg@zrFq?*U^9-TpsuFAbZa;mhDpid+2;95-d$5`J zAq7lu_3@^UsE%lgv|yVAn{=eq1+v~JrHygVe)@?7MEbXOLL~NanCIXbDa_$FSW{S@ z2tP`ZP^ctJgHl|o&Qz))Pd=r3o)4xLxIjSLu$c-wNNSb>DCy6=fi!Zl;t{drW&}I6 z>dQ{8nk2dz;XJi!lE&VoyqQV~-X@Sz>P`-zU*bNoQPeCYuw(~EbpU70Pf-+=Z2=EW zse#f$3zYY1?<`nD1L(uqN@?Rp109@DA(+x#lqpogJX|@-_5uY+jgyus9|HJ&%am|LbYvBy zL5q}9N(zhzwil!9u?Yc9P&%do zj&BTA`E#VeLxG-c`*Ioc6GIEY7G7pQR*{ z_e$8@18Ct&CCad#cC1u(VoP=(B?R6KqAkOoS!nqxh3#rSTct36W2WbgFf%saq_ouU zi^HUuwOXlc-fNK#k$=L2AUeHTsf%srY~4K%p`d^0-$iNzaG$-#8f6%B&gizz|I>JX zW9s~y8qZ7LO+~t0f65H{Jdh5l!_9PHEnkVj@PW;Kf1Zt|cADkuTUZH_^pjEoUnBM* zD(eoS;T{Fj-Mb;(J&pTGsSnaYt*sm_ik1!S?@jqXae-l5rxY}h+@v{Esqs3{8}im% zNGVD64zG$N`#L3ap@6J-Q)96`=PxcW6Gvj6)L7H?XFQ1s|+-v2JvroMzVas5hID}i)> zho07cIaT4MCzP{KIfRX;%#qK+yl(8p5{)G@T#6{nT^pLv-VO`AjM`(0IsiW^mRF6> zlr?FOYo|#w%NgD*sl6!DVaD^?$bI-2hdLe>52R_^1_mJmc`0v-ACqjhzkX2p#K1y) zD9^2FFdaMuQ8$lF*~;5#32(;W5K~4qlclg9A*F3{Q`(ZPbTH;VEd)jG)7q3e?@@~- z=MKX%H>KS=S;Y`Z!zZHdqdRQysFGSFRX+mFZlV@PlsH6sj5@;IS+?)OU`|n(#dPN{ z6AjWjhSAB7M=(Bba#V>!+7`Do!^vt0pPJvWzM0gc3OiPN>ZlSH9xv(j|B!l4SCO9F zzF>hZ{>PY;%|7B7oDH62-(>QF=X8@(<0)=UGG*|iDm~n^N=P6wbBWP)!q8Kl)r6zyE3-$ziqKYVjR)*sut;v}x z1`8dEvs&rJ71+Pq|5Tdb+mubKo>RpTN|AqIp9*sHFNGCpFHZ?yEiGY2!II6Ct~849 zuE1uAE3R=i|D{AD??^>~9UndQ(Z4MF=q6Qi^^ho4ayDh39X+$uBD`XnBk72nRGBw$ z-pidz@iKSxB0GPHE05po&1%jdO};i+_g#9Q5E= zowyA9xbxhw|KdD%ji#N)H&{XE&SM`Wjb6I|9h^%^7x>3aXFs`=cY%M*_b>8~>34~L z%r`G7$ztIIqdfzQwY*D8bFVa$R8OBA<>o2_jpy!D+GYM(A6`~w=%2MLWn59b@ohI= z(Z6k+nB~nY*lX)R30DDOJWal;)F~Y=HF02zvldI21q8Q1**sp)k9}2oaaD09lkvW$ zu#`4gy3y+WYF||(SQCVih;(Z&jmc8l^z7D%r?gpgO^I`Sri<5-C_~=zh;jkFB!{`l(xs6QkKUBdb>#lEc+qXl}4cAom4}r6G+>xb4RA% z4J90SsEQw~JN6W#s2U#zt9`8&x)of@Ods7)P+RXY{d805O3!X6eqbJ-o62G)5OJ?R zE=%81Shl^)4{in1pSQ3mKvZ5wu>H&-Q@o2~0h%q=7A#H^Y?)1l;fY89n6Je6GCCY% zkmfuTg|Wuqp5?ct7DR0RoUfE}e|!kl6%n_5CSM5)eaRv0CLQ73+TJ1CZ6(U|u5^^L zrri&wR<{)|obNJA$0#XvV{l=4{>^PAls`O9dGCx2q@3K!7W(nF5?#PI&CU*8xy^mk zrS4!hU8%_(g~v^&_iEG0o^c1OQ;40RyC$7Ma27Ae%MD2sw?oZM7?*~tmrJg_0ij;w6 zzPtynxXqz+>x59Ge9gODT?#5)kC_MTGiX(0L3Rj4V?5fW!%sG ziX4G3O;hF`45TUPYXZ|k8&xobQ1#qY4~kjN3s_}5#J*PoJ%0#We%T(DwySP2_4<;}w)Aid0~S~MhdrWM2! z`4|o?*#Eq;)fAU4JM`d$QgmpX#)2(T&KJ({u4)AS5ALeggK=B^2{ZmF{)xhj+oaz; zgD83a!S2lT827k{rEu*bQfnzM43I~L=a4z;Xr5WEK_{Pce|rs!%8q_z|5PeOtri{cH80v`a8pCjL&}XQFO^V}8qaE{ z%vSr_&fTxgQztV~gXEKD%HH3sjS;SL!`n$^EzBDZhv&lkrC(&6wg#Gu+gkri?qaN$RwN(3 zN||hMeBB=~G!NhXmjxfWL3r=HO!3|-OEEOrTkYjwq!{WIINgdGh`f{^U+YwT zM=iLT<`u}I#?EA`Y4A`jn(sc|mvVemzB1(8H2HtZP3k+F%z@cOsOsrKGE`9Wu!EUo zQ->P2>?cEc^<(xStFH(%?5ETawMWpxBSqRJ{~_8v67B9nIq2<>oZOHt+MPRIq}`Td zqTNH*Zh&DlrFbS*qKvwhCRk-Zq?qDr$%6Hiy>Q6jqvC3`5znZ&S_)QqN~`o>+FM+; zx=k^{2V$aUed9vt=UK@ODR*7J5>~00S7~+#X6+FtNbfEPgTQA~L9ElvaP^+y0SDV~ zmkbf=Fg9D3QXT(85zaK?jli6uaGw=$-xu>;d%95Pr^S4=b4A)^{3+Vq)A5w!Y{&4F zBibFmSft(B3!>d!(QfHEN4wM}v%+vNl1(O1yIQ2(UA2PxCwP*7%}W;@tqil~g&8jD zqunUdYVCC~+HHNbtB!Vjw5$5;ZWn2H_m*gvua9@b(T==`OTF%>*u>$pr zQTyZg^_MZ~9@xvxW5Gj9$sVh|VX)hu$Et%3;IKh8)b}br_K`w_`6!a9`iRoWZjx|@ z8EwnV7`p`Btgj|g+nTD?j25Ak&_J!qxN~F!HO>~s7h}dqGxlosnUP<7Zv*uWd&yd= z&0u&$RcixDk0`aa8tKD3(_{3pZSscNmb~hq&qqE|X^O3_Mw?8?=0Bo=+Q=ueV5jzJ zb=0~B!$aEj8ajJO)#|E|Fp%2SRr{D9`e5O-_cb*d3nwrcgNRDkQ@suQ>{aWbmHB}W zwj_quP~WCa^;Ii)ZFha%`bvGZ53brZP-DS)>5|%rer>?p?P|bAyRXJ!u=~_Ej=w%8 z4zJ&*D{*S95&XtyF4BWLXI_(TNNNmuo@g6PD;lZn04G-WrY*sAFGg+dRfkW>J<`jz zf|44mAF~ySMS6{DG+z`z*BYxaZgzIsr>?jWTwV3EzurV`ZZO~Tk?PU)IJFE7uc>;_ zmN(UEUVP60a;2E<9$jn7A@q>|;XN8E0m8dE0uyH?KBKFW`i{YT*GFp1P*sLLY^FBB zq?b2SqkzYK&D6dYJj7-Jf7%e=#0VbexSZcy^#LwdHwTeh?)b3%0wA*t+1^l_g0mCe zP|LXU@4BOypppY`s9x;Fo#I8cB{~D^^UmIEsrpzzBfBtC1E8u$J+%bQZ>i>6Zu_t` zL!n95V>kDr*QRQab)WF!gCHsVEr5$h`(5t?+^b@QTW@i2pT7lgQI)(wYqcMK(p$q0 zTSnVjt9@}5-A1i$ymUh}(AuyDw788r6Wi;Vdsq}r#s}lw=$*DID_%ROty(aMpIL01 z+p6&h;*%mAaW+%cD+Nq&fXj!CF#mN7wA%P}o*z!YF#XfEYhX4^gdM$ zFD;oyBmgPw>E&W%@T?z5W811_g0G0rYIw;ezMP=4n4a(spihYG4k}+ab!ESq+v&3o zYDGl0&Fi36wY>P#gk|2r4r&>mivK31+h5}!L8>~wJN4eU&z**LR8KOc`rlh<{oia0 z;!xSC1vbxr&l0pw;>I5@iOq~b^64rp!~fp8ijulMz`jzD(~DP$xKq& zmd4EvtKf#QZua#}p6JiRC|LFHhZ7LJr?U8&tgn{Tpxg=BUS#X3df;34F1MqB0;eWJ^vHI&c-sCxRU5WJYYXbIc!$Sl8#Z3tzTU&S|s z{)ezur|Q?1TB!Sh1y*`e3DxIc4Pfg84x?+kL0ogk`F|c})g#S9@$W+>z7n(veCKUo zdKGH_f$GjK{t-k1TEC#&gdOI5_1!jFGe@<)_TEY5GrMX-Q$g zmgrboRTQw5_G9DJv;Wagw!APf%XMHfiUPC7eszZ0?mr65s=~mm;=qKh|FO20xtP@8 z<;|+KKQM@PnC;cSSI7NFzgR|LxH5Dktt*P8pX_JXGLR~-QNR6LgmE}!MI_Fu!#FDHG-PNNr&8+aq&$xCygSFLv^nUFND#6J!)ylAvgv@U#`TY zXG-7^$xKca_B`{Q#6useA*NkF7l!g@4y9@R=Gyf2CUp$+QTRNc_Bvb^@z1B#W0%RB z)mFwSDAFA38$dam)#3DJfC`LmvRB^s|JNio6rRKef$BfD7D4s4EPLoN;0_|L(s8wl z`=(z*k$1#ENmbqoqQS@2l6WwYJ-D@wJuszZ2F79~+~zEQa)UkjJ(E2_GPC+ekZDpp zNI0QZv0Pb<2b6L`O*0&&sFScVmtLkuC%NY}dC{}rO7O)NR6Bc%NhVvdVq*K$Eb(AP zVTDT@jv)r5#7G=d85LNH_MKEcUeZQ+Cz&=8%_q zC9mx&f|W}5=2vkX}!r@lAz{zAP z9$3^xY~GtMsI&2E_G$}`Xt{-!2^ERxURtTZ^b)az%^()YGn3hAjQw{u`t4Ge2EiY_R5sMb)5VHd?;Rl8$atF8hA-*HYs0Ro1ByH_~| zY}bH+ix~_9O|M}Q)`^DUj{6IS6C60Ge&OvP`sJFs1Hl0)*VUHhdGK(h9c)tqdpm=# zs=@T=I(#Qbsm2Y#L~U>IxiGeP*>vNM{1GR;;aa|-Ry94{Rd`Cf*p%Y!-SXiigP--_ zZTL74lzdzLiA5`WAX+)fPNk^y(JmgipM6JV#oz<)svg2RG z`B`r6C{Q11_BWAs7d|xhmOC}=Or`1cUDemTja8yY)woKm>POTQON32$>csXtUiPHy z_b75CXLeg($tv7tj{1H7awFbd@?u}xv15zvcggUEj~;(fcq3kfr@BktyaC^cH~Aab zghjM7eb$%Cll8vp?KT>_o_BL8{Jz>B9zzerWkhwMK$>@7^+1fR2lmbKJSl)S;o1#R zt{&JjLl8$l+H9!mX0qB+so?{4jHx>ddj6HF(9H*U?*e--kg}60##aPcSZ! z;SMGLY^qmWcn;m*IrOr@_vHcKVei3IhuS>`FWK$g9;=~T2#<6x9 zdX&mi!xsRam8T=b+Jt+S|yfHvDC2Xfe&no(~ z;_0-3SbC_cG(V0idsTDXm#R_v=Tz4##(5)#QYwS|CmD%tk;amgMwK0uOSwjJvpNa4 zIwxGRnaHhwU#W(Z`2Op{!@5@@KIa^Kds> z2rkcZBbJ!!nj0~mk9DV7oSU0a(q0Ot`3XAH`|8!|9BjYVoyxc|wuhgS^ZgTd@?(6z zH7$Rh%@Cm8Q-d8S^#4t`)|^QE4T&l#YUDP48|=SLciX)p|8FnQT_QrPUjdVPz(qk3 zu!B52sh)%J-|(cNZjAAF!#fAgx9;JCL|T!`{FEmlhdDj>q)**bjd*7t=KMhYlx|wd z$K0LyPC3(8@gh%m&h!Tm_6@GL9dvZU+5RAkjWNDYbG~;7?n^MfuZYF~>$-t?XHk1^ zddmW4$N3z_?Y@UaH-g;{QY-O1Yq=-?&ykd76j>BvZo+8xP)X#jTKef=pMvH4Z}DHf6N-TXl; z4mPA&#mUD49*5hNF}dFv-UHi!LAPfx>7!uBxBy_K1M{~shPMhoD-OcO(~1CM@hrK( z*LbSzohQb}6A8y{_Du~oBMM%ZCXE8cNPiZil!g>e9|aOi4(-7_t(@s|@B&6TSB!JL z^}Mq$Y8QkF;G9@EgmFe3g<5qVD}x|Ch?)U{OXw9GZ@ny9S@6U!n5sGnR(MkNXfX_W zg%d1I4kq`3eWj}|ihC8dzb25xsXtM==4$-UjDKA;0q4UMXy)MjRw2~ZxND){{Ocj$ zw-M4!;F7U^`x4X*vMZnbgTc02zM}Tl+b)!ZhjPTc;X3M|*K@*YDD-tgDJmm) z;9G-G=#z1r!+izgitmt<1RC8sMij+jI^8FNm|h%9HEL2-tEi0`S<2O_AEVJ&%= z1|~SePoUhINKJLJG>8%kd?NXmDH+TacyYbxol}EP!Z=`RzsX`8!PJutT#3`ANb(V! zJjKA(x9?Q(8q@0*o88_dikcV^nm4j6*i)r7WoZH=&~$@P-80LPPdTXW8G3>er|y`DF<=;U@^RXojHfw zz%rsTu{;EMpWH>_x+a7bXJra>hy$O6Vr-$m$Pmp57uALxmglPw?&1P{Bua~2ja`JB z94!cURx~y9X9nrq^l<6CG1A-L9pTp`^>2j$>AnzCyOszUFs2ImLHjSG8ciskE>)p! zm_y_jcLOPMH+7^HRXJu>>SK90jjdH;;t+eNP3XUJKmZ}4x;{l#BbFB-x*8W2YYajp zd{&J<1$SSoMpZf2XBz018`Y%v80a1o^^Bo9++z5VYP^oc!Ip_LaZ1G8OhTb&v@Oo1<|>!tus5^_^ulR%f%1}9Jr$he=WdJTsuumzKXDd3wW-eJ1b z6S_3ECe;Z2?fT@fZxc!G*z^26D^oHIaQMuu{B^Vq4rsJBqkwtiZ_IW z*eN80?=EpuxASRgZHMaLZO~P}cU_0--(wJ}zj0lM>fdYNs^5Q~3tXsvX`hfEzWc>( z6YLPP4Hf3=L6bhj#xi8h&-Tgn3Yr4@>I(&Z$RJFCY~EBi1+s;Npg|3|lKx#t2J2zH zdobLY2As(LfX@l0fc1#$N%e*l<}^44Hw2MAq2Ud6(Q^!=!Q}TnF5cHg50#Fi-k{v% zIIj8U#&N-NO0YTkG$NL4`!pq2rU>g9(UPfrsga8UX>ucS_i|dOX9fMyX52-fc#eyJ zUWM0l`4|pMKiAdR$?Fd4(@#*kBiWN~>;I0L^NZ9=Oc+s-3JRvO{VAF}{1h`BPur(IJD2NEti*`4KHzod`gk_?w!*vV~5 z3x#*!3guU$2*0c187u)X=v7?`T$Z>Lcpy<7=>BT2Qvzhd$k%n2zp1nQj@QNF;1)HF zbuF!Y^2MZexfLB71!BO->KoiHX#9r5E_g2N z0`Hc>E_mUx3;dHs796KtkgRs20oD}#F4oOwT2d<(#o{52qF#gPHQ&+VnZpzq`lc`i zGFx#|Ag>iofUz=$=6_5*Xm4wLmoz%jn!?4b#=%t$oloIy9J3m4EUfSSCy4%aeQ%H^ zkY5rs??ir^Yu>qSx#pcj8A;H*1KN=%%2iI*BfDHmeu`rf@e(}bjKLA0!BsD+R2EeB zNA0pToePjubyw){|d6S5Bc=xPp#l%I-taK8g-86q#ZaN?mo{ zq6`!j#=AuR?=zdYfJXP%#5hiV*XYoDSdq@;x1nxk>T`NUbu+6#cZt$0S7Rp;7Ge0= zqDjFO>1;ZNERMxr*8Fpfl#TVjan~xr@asEp%YQB~%Pjw}j@) z^Ez?UzeHzl`Zw%MwV>GtcXr8D{}p1MPE4=hn5OHU`BG}73stYe?5hfNmME=qHU4Kj zuNFo;RssreKI?x3?!dLohjY7TuB=F==?@8}C z)cZPo9H!p)zk?=Rz1!gf#wy>sUNm9)-KQ%pvS3;8Gicf2*rS_W!J+f$Sy%dkJF|YJ zyp~kocY|o=(C=B@=uLRD- zn5ljDIN;&lI$HCtuDtgeh4S7fo;#FxLLcf4Wwc+1+GW5W(BFglI@pJ+^n-%QsmXg> znjC`Ez%t%DTfE5VI=e8lr@u$#9VM^#y+^Fr^kEm(yb8(v!TWaT@;_XS|C!{Dh$aPD z`-t9-KJQC49BO=ZU#7-0I9J<_i8=UlC#Tsqf|B~tD%doB@58?d)8>6)+PqJ1L*$;; zyK}Mj85au9=o~D4;8@EeI}2OO`{jt2ga*$s3Ol}Je|%*VRqoF=RFM>NOgo=e;a)=pMB#&&|u*0 zI|X@r9B#7RoV#47-*ccnf&2zjD>&@B4yHGSYJXt&!)n3k|4_WcIEH)e9#Z?B6y^6w z+=i2$+aWZvCw)QFKE@a8PV+wI{yMK=Q1N`4PjwaFZWt!Mo=yDOODdk|695JW-gBYa zU-0g^YCrf1SGUQiWr{^S&HI$A+ohj!bvufBkB7P)EmD~=<$|;qg%o*%&x9iX7E%20 z*ZF=YGJy%t;CJLV0rKQD-hoCRgKT2Z=+?2$-l+BGT(*oeaaX-{yz9xl&$+{H0=i|K zK2bbjoIa77rctzGjb40`7|^L_CYi(*(`0@hDt)q^Z0{9S`ji6wB}!9Vjh$3kM5Rv^ zO$ze;RPy{%cQV6u-||bw@IMMQe&tKPcuz&?`b* zHdei4F0*k(v>V499jo-y zBe(`{HxjeSprQD2&tfFM1cV7&T}=l4rjj+8^Y=2K0Q_xT&PU)byuHcPNGR+TFs_)w zUg>(+B!w0+Ki(=zQJ|Aoizm9NPO+ot3+@P8gFJlLdJD)9&vl*6pva(9m0qKm(co0O zJ#Mtn-rs!3wfD;JxYKSe3d~}^t;$cLwNrinq|e!@zSoHtd~F$&H3mJP+SZtY>bv?l zjPisUkJI%m>Jewd5%2qp18nY}qug;^k4xjZCh0kzYt)T}`Pg@p0~n#Z^I*FpM$u~m z7Y@if$T+uRmi`jBFiQv4rM0)}qk>Eg6N#P0{*C5;PW61Yxms-#>`b#K@}>FqLagi~ zN*wFncX~dNE0vut3VIdt(=!oragZqOay5369}S-*lnPDK?Lu&9?j**c>o|uN-zxxi zs$^-elUEzj`N`bdCQYFsFkTMm1Gp6OLD87`84gb2O8Zcece0)DNU-p^1Af?4htmEX zc^sj%({4 zD!cdzKB#MN>sd5H5x%)g;1~Gjtd~V|_~uAbxlW&? zI&}I~yEGa)ojhlfm)LQ?Mk(J>6g8X)A0XG{*D3Qm`oi~y=*6)EcW5Tp=#6GUqx0F` zGKocd@+^QgmTf)en+h-5Y4>cQ(QlJ94vTeBJDO{Bq`YSf=)1Z`KQxDH^pkVAPPs2M z`U3#~)94QhO9C1&S7`Kyx<-G*U)3FakAz0|oyRr$V_l;^arQ>T=Wz}7RM+UwTu%gw&r`T&+mS(>+`8* zq0d_^LR}Qk^eoUDFPk36jfY}|CzT{(WD@6 zt9m;+wn$(6U`Nh(G1uS8i?Q@Rz&Lvr>Y^gzX2W8T`g3+;HmWtV4Y@f26>LK;ZVC6h z&86PIVnc48c)(WJ&z5ks zg#$`HsTKCDEDCb%v8@zO9eZp;*62EX704Yr+<&!r?$~2nZ6;=(S6rhv1K+OEp>Vn1 zGW0fJsc9Kp17}jwHYhuNbG`Tvg$6Z9KbVF0?MHr}3y(&b+|##~;-Dh!>3R&q;%xSdH-6?k;|#R%`9+MbuO+Mh z$kqO@`jD^4eoa46(j$gEn+w3Ln`nK9mvsjLgv~%4) z*{*Z@Zk^lD+UYeRA@)$pLNH3qdMJ}5@X21Y*jMYmUMT#1E(yRw?~3m)fRm1Rf4`8V zBMhQ%K$Hd@^^E=^a%l&aDsOeIwsBUm5 zc2t$;F*kZuc}L7m#s;C_QCgmFzUigq#pc@?U0`HvWa5D~ZFFq9<(TzNw}x9Bn{K&g zvFSE&3r6J1KF=&R-ToAC>Dr!Eqi6QN?_c7!ZvWHZEZFBaX;KzMk77r9x&rYxPqqr3 ze8DU>-7fN`x=y|*L)nG8y|-~~bOj{EHr=kep7h#QVAE~hHZjUI zAr@%gHe&ULJtQQ+&%`>u>2_eD1GU@E*Ar{D^Gwmb}Hoy5rAq%Tq4{S>~Fmz z-e8hhP{iaUTlkW|nj*rdnQ@S}hZ_eK_VT4b_q}{6uzD{y39|Q!NSra0o>O4g zZ7gr?SYGwq$K~ue%fA)PFup(^iPCsiV<&d$%swG!AMA6v-J9;$*?cl)!s2W9?gx`x zVJqe-77>thgWb8x?o71^{Xb32mg)aN2l#S66}jZta(=pa!VG}egWLcZco1TfoB1*_ zfgvKN;UUm6R`RG1;dH$hS4BJL)|-lvm{CvqeHiuL+0;q|;@}Vpi=*|ODIPj@-{xlv z6Cw97HxX=qa1&vUMVJVW{{V}mk;f5O@_c&pP(_|?zqLN%m|mKtkR@N8#nsKnffvNp zS=0GgToLa(%B}bX7Owbd_A#!Bzt=JDQu+%Wu*XXafgZN!b_4H16EDK-3Iy0t-Q$A2 z7h8nZU*Z~U@NqsE&QtO|x5g*Ti2iSN*>ttrsF{d^hNwNCt!em}v7^J+fw_2*5{?VisoC zGDqKB-)s?je@YIIriK$d0|Kn>IRSpwB9w(|Qx^;Q?QUIo>^73eRKl5+ok^|VdA zh1JuvTo==y$kmyCr(k;PF8&&H`zacf2T8S(Qu7>3_&t~ui>KKu-f?WWP5aZKMY67%035KWjgi2F+{08pCP$@LU*4s;Kv{2{^ZH2a*c*0RZ#4KLsC zqP=71?bbPml0OUy@L2uMzU@3^7(`I*A2_~?7?ApCYKJ^b?I>WCYKI3#nj?&@yPpS zw>X~ibrEoz55OG(5&8Vd9bE)`m``5{oqku>>G#CDOsD(brq}c!T=9@Tx~<##54flZ zr5U%W8e~D%ZLa9g-4=@eF;nz7H*!bBE~e}r65;ct0A4!M&^uh)KXsw!Rk;6Ifj$zY zXRgLh+|sQ(LeN_8{>={E3odAbC=RD*=$pInld(wq6gOc5oV^Q<;D-GuH{skH?ZzWF z87F()Wi1E37Gd5Bha8uE~Dvj6;$8X5(EPjM6cUGfPSO{MZrXbc>R z)7+SL4@ONt>Im%~`V^LWD!uj;7Qh92zo)vTUiJl*EiQ{GK$0Ui7Mfjl6PjJ&_c>3W zc}AbYKc~78mh^#&m)5i*iB^n*Nw4wZ((szzB@{~bbMCxHJ!gkz$DrJTnB^vv`fS%Y zBVO=v=D0DX&c=BQJIHhO?p;gydCu;oc_=;+MiE>O?baz3>pub<%G9DK%g(@2OBgN?ftzz>?>|7y z28~C1dl)rmpnQT+1K;kV`9`e|LgUOPjfKW7)1hqpHF?rulhz)7`{jCWt$QM_dx_fp~vas96oXNas6$Gx;o5L$WG$$_-O8=noHi;*i)KJ2u&)(yko ziVrA3@jlvH2so00!ceK*NBbD1>&p3RJ&fZ5Xtb}^8A+y2`f9Jkol?qAYlfdBKdlN5 zR))qBZlnyoS%cUrfAeI1R=+n|mEGQq79Y3vh;^kJwRg#7_&pKoi<)NLV33@lykep^5i2K<*t#@MhF*w@5>?L9?zX0>7DCL zaC(}j&1VTt^S58?=|1r(D)1ni=ujgvp4|%4SjDZ>gLMMQ7OZ*u9s1Fo*HmH&Yq$J} zgta#=u+)XwpC<>g=;N*r!QjL!cwMMiYH=v8m^T$ETuA~w3Zf@ zlNKjcJD39Kczvxxut?rrOkzzAAP3qDK{^{tX;m#Ne*)>yjZ#`k_iH~Ck1U2G$+ifM zpEj=&q4k2%H!(sR32b_m)&^sMuS;vokuab_r1lzANRLQu4X%8mv}u5AOR0V#V#EMJ zdVIvgt`YO2w5qQsZ(zh4D2Ub9aSl@)B{kv${dO&sfq^*$Io?5HX`c9*WlIM6Qm-;v z2|i22>aon*Q_E;E93ksWl6`grN66kX0Br?*T~=$1lO?~D)du0Gayc#4aMu27Ic+YJ zGw)Q;?iu3k?JH^thM=?SBVIGcN8*gn&-nAuh=2Q5(odBjb@NSWBRe5ql_*3MQCV9A zPtmr@8qzwe(V$`zO^epvgQmV0t;HBJsazF}l~tWzMH_EeW{<9_ePCcA9ZZ9Gi~QNT z0@+kei^hq|XfaX$S4r;dF7dOV!p2OLsyLf6t}lF2*uVvWyCjljV*!&8qcw12RFHSi zo*JXc3dhD)igHqJcO%&OA(-wMDPd#wyO zz*G-p9#8e^Y2o1y+@!{04t@?=Xu_$--!|4hq@HFqU_)tZn&DUs(ymRbuUSz7<~Nqy zEZD~#XDr#PBC*1j`dZ6?-Q*@+EGBI~5YD6{Xb81xkjXlLsx{Dp-P4S?v!fX0udWh6 zJsM~gtK4@(7CJFJj0U0Ac8SAbj22fN4A*H9`RKBIcLs&OBs|@5w9*AaZUe1gQEQe7 zu69GMrl}7$*>8Cn0}=ACv1)~8cG!}Y&=K6SUkq4GDpd85&NkFoCHU9kv3%k0>2qSq_N%W34Jj;Rzt3aj&2%|Cn~e zT{?~J(rMSVy5^>r=Mcy2bU>iB_SQd-{lXu}7X9xLVudWN_DT#Ha@ z`CE$^)U|2O5{_k7wFOXYbFKHkuG<(vejhcrQd|p-MS&MC-e^bhMigrY*X^2c+PGy4 z4ZXU%oSR-m&(LCWwBZv<2udpv%2Gc6O{Km$a2Y*2TF!0GR<4DkuI-LCoEIe;`K?4r zw*Xx!p;2}(DfxOiH&%8Jire-v=BbDhjr`W%RO&QmJnr%G#tXD#3?wrS&aH!H9F z*bx~ykoaKFgh;x9n@D<{7r(lMo2Uv&`K>f0El+#?TNOjq+M<+WAOwNPU(W1@IlQ(X zszm7Z{#c&5NkAC#YU5wV7Mi?wLKIDIt$8?e)S*~out|cA!yxhInhsYSVL7ceZs}B? zIV;42-%CWIge2QV9CmrU)YJR4ZtxhT+#@vb(S=x~WfsX346sb5w9z_8>ZT8773!FL zq$!GLX$2bt+pMUiH&3L1D?VyWTP?cQbc0k(-D|Gcfn%3YYGNXqs%B57VbE$F3W@a?oR?!SNQ z4|&~xDS=8KSc#IpsaMUE(Rq{E&;FyRKH$y}4D)U1r>knw({>umYfzR9-LF-o zLzga8rLOIv9pYI|h7zk|DDv&SR!YMyK7M)1-k4f289dKno%HS8I^+}2d#XU$$5SI| z+RD^Y-WF*Lj5-`nm9FJcQoI(+($lT!c&#L@isxfgq~1TGTJiWg6NQ$xGWLAcg!e%9GawQvU>v71pdm`QN#hcIPVD_HNpiKguBm(V@x*UBS+8>5)*{11wH70{4A&W@HF?|?1@M7n_-aiA^?Vy2 zY}{W)7^MT>hEck3PH~uX$dmK)MQ)V(pKQZSKNGklt5K;Egib5@7S{T+bE;!9Rl8_G zZczAO3#xI?5<qRy4f}T1kI0ygm8NPH{&$bDZ{{`>wVPM0&8&?r66D z_HS@Bf_fcE^PtGeyL|<77}F9)S1^>K!3%r4nLOZ-ywL~i^Oe-SospRzR$cm+DW>o zU-HuWzDQnOrs@9o)L3xnEEF&)Tw}o;-~&u5H{JAlB?f8QP58UK)rMA-#?rNFTEc=# zhSF3$ZelDItYQ*F$=Qpnv~esJJ_+Xa-gn1E zd2E0C>@K@>mfm5p3pVUgqdsby8ilBd8l#fj6cde-qQ(lb7g{2oeaf<6MMcHB#tOEm z7zN9Xv4XvzLSpRYJu~y{E{I7?ZtlIw@4kQVS)O)g=FH5QGv9OOoQKsDLSc~W1hNcy zjxfH4)9fE3j6MA5G@H#?=h-y!AMUaDj4-}xC|C13#v845BSr(DQ9lqh;u%~GOcYbl z*4Y!xuV1eT6Gj?qV!Q+=SlO(eAH16F;0QZL(m8lyq*1^sj~Hbfgv;3Xqv#y;{K7a| zwbaY3FGL`X#H7*V##33v7;cMrCJl3pkEX(oFL3Vv0Is8PzbZnb(Z)E$64FMadVL#~ zkEZL}p3%se-k4S1*ty~YL^ge~V~q95RL$q!_kpj+7^BEk&A*Wp=w@4Fa9s+9*gMzg z9D8&liNvT)i|*(T4aOQ9RG6fM-1}pVjd7Bul_dqbkSU656n-8K(Jk2&Jv7$XOZzQZ z>LMVf*{A-{V!Y7Y+aKdO>bhMCHa8I~#rZL2we8tPgS_DnVE`qGkb^+~q za?{mI$%Dpk!Yd?Ph(C71Ui8{Vn0afHSCDYqSxA_C#g{U|c|~Au9*%^`O;=AV;aPZv zgfsESPS}%P+Xyo!De?*u-b@ISuXrQS8mAUP`R;K@nA~*LTM3^#ND1G;A3I?^Pp)l* znURs)Lc;BmkTCg*KVhPTFCBz#B?U;B+;sJ@5Lc-*xtGktODPAGr1T4)?*qvV62-Ae@^cE8Ckc@=MSNuMa5-uwO zQ*UP^Om4cmSqV=?mY!_xotP~02*Pc!hV5Mqnit$$c|waXWyNJ4gdr)$z>ee| z7N%@**RaxdS1QegC)c*pSS(j^iFp zLJ2qX_+xL5GrhJIz#>7CS7-q)5K$Q7p*1P6lm2!XeO`W3Z>mO;<;20ka7u6`x(H z07rUlD}Wl5=q>E&lpWatNE`z+;V1k9M%;J^hNl?=KOpy9bynIrjCNin+B%+G+i0@{ zyyOFQuD;RIe`31#?WFTsIc+e)A+KfOgu z&_l$QCO$)7aC6|v*Zia`T0k-W|Ik%ity(n>|2&o7hb|~i$!o3}Ymqnc3X7a}xMGnS zdTlF`Wpf~}&>}JDr>;3EQp1z4`E#tuJC%w=QBRAeMUvNC)z%_sAt5X>vr>_2dTlGx zi}I1YLW}gmxYkZ|(x`dzIlp@@ZD#6W=yp2{#~iuosPsPTN*IZm8@PzgYsE%5*$@YTm*~Spf8V8JPT5>JS z7f#Mbt*#?L`phTpGzrWu;`Z{MqLt!er3jVRKr%bKI;ShYmFuQ{*~W^h0HM; zM|y9PXl_9C4`Tr4{cqliU(`t%Bj1*evx_i(>`z;D`6q`aTK0Tbh% z^Fxx%i-Xg@4{5UwVD|WZ8z9l6S0qgEEpUWu{qO4>dEB{SBEZ)%Vd!N}sd71J zeD|IY^q6OK(IITYSI5V3^NbO7b2watmEgw?L@rx1hS7x$$LYSDF!T&~9hS^9Hi-N} z30v%Dt0XQiw35{-RF@-_;^yOy3(tw~GX!y?A?C_d!VfB;ao~@F;a8^m=#gbiqLM@U z1nAGdGEUhxJ}T=O1sCQULvh>a35gTD{9s^tPaPy*3)5rzS}LL_dTaLlP=}aF?*+yN z)ql_-6(!-chBQV;r?6HL6gupf`3sCi6lnFOQVo(8qJ4M>G+ksQxv&GE`~q4oN0(f4 z@j*dAvSdhrUJkDn^K4l%?%k=vOe`*sT*g8OuNg<09gNNT9VT+W-ajZG0(DxX-3 z3#|Ez#y2gCtgP>g$bWqA6>q_e#l~e%>;;SEN_)Y)r4%os#w)}+sqsoNlMv(8Zv#dv zWn&`<+q;4wCmlAV`@?WQ^u`Wmkm1~fu!>Epcdj6N^a%G`={& z(S5~96?L&8=CDO4p=hP?Ief#%Zi+!3G0PWmsfk%-tm0BbZ816da|!(GXSc<`{Z&S1 zVtzq0OdV*rnqgbi78Ap#k`-paYGXA1WSz{WiF*B9lu4$K!P!OZFiy&Hi#T#Zwt43AJ()A&_!Y6x@wsWt;mL-D zV&~Ij&deqUB$+eXMPpZ{+3aw6!M*%7=zJFo=4}Ni;_(Dl(WZ zpfGQ909`>NHW>{bNf{0l$0Ye;r{aN+xLLEB!j|vmlC?i^GERxiO~$V12eUdY8bUW4 zy-726HO%xnPBz8}Ov2YpL-XtULL4Lht}9y%pqT&Fx^dxx@ePdr*PKhOAq!=@q~{_B}< ztj&#qR{6$$b?$L!*|$0TqIVGkF6=AeMDhaq?e>Yqh&%b{%Cgepwaqx5!{XDn8+rUW z#D08tpkrSw4BTP-34eO-G$!M-GdmS0EO*F?O7#YQmod^UGX;a%^QV@&B7D~eM(r|2 z)fjFCAeFPWRx=vW3#~4DWjnve?m`^CWS7wwU0=MQd{SMM6yF-P=tI_cZC5{NH=>E7 z3jID>ev2^ScksctMgxiFufbUq-xrn8tZ$9ONdtBpCzA#k_s|9$V?QB#jYse%*RPHD zoTwIV7Ow(hg9?}(*ZbuZ1VAfVx`sC>BEvcV+yv@l5PN*O&Bq|^n{?u1z)c(H&)g1r zL0U!kd56%=ats_egx!W`E)S#E)(|*$7zYZb6+U9Dt-@2K1I|vz42VY% z!%gvqp+}5?gtrJXK*>7ft@(&CNQ-BnQQ?8CNVN|f!Z)}_aP5e309M#@z+Ft!jeE>n z@cuuI@95UwYJ)LI$KxqzV-jllxxo+oq2CWRgCO;Lqu#A#trHHB!c%# zatM?S*6QHuQS^+nLACkka4D|b?GDH3>P)*mH6LiVr!ub(+Um3@2Lv_=$Vk;T!R-wqVfTMg=HdAg#_W z>YC{S_1`EUhR3YN(<_bzYR<<5eq<~}oSNR+`H_7rko0|EI?Yy&{JLL$3PHuj?TYqI zOcbsESqB=I;ItS5Sx3y6`Da6+3r34Czisq`2A_SPBT=gN!kQ9eA`TPtib6lk6NB~v zwyi;jBB6OF(1&O1;HR@yl$<=F((KXy(>{C9d4{r4ah{=UOlNFl&NG!}Pocs_t2Uv` zp16aVWM5Mrmlf@Pd4rDHZ;2<$`3+E%x`gCDR3=Y;Ze~@6U8W2xI-1$q`JtU*D}4?` zLBvf&-SrQyN2_j62IEtz%H;2I4Wn1R!&8f8}H(?KTpK`X-s-xXA&J% zkA7yOib|L52a6vW&2~Of*Mr$MMp4&;ibD!rxag2lT)60vI?sj_bK$Bqq-Je< zszCnJxOKlWx18BEHAhf}UGTPRMySJh9-C?N?II>()M26vCfjrv&v&O1ff3tve4q;T zm&6YRwv-SxC^l4R;Tu!cKMmcV(pII{)H25>Grzhv*C|NRp%t9i?kmQ0Xj>H`?$au) zd~d3)3UN*Xm04jz{mNcUiL)kD*AW3nyqLHEp$E>p*Z?8geZ>_G)r-lLTzUnv!UZxV z%iC>0Q=QLOddNL+!3m0;1+r%`7=$V_G-9eiL|WQ~40MnfKcfX?x(L*|OA@O(-=hqs z3?*9A99MxTO`g*PqBO-v2*hV1EkYOt6*-MOp`2zs0m5k*e{gajV-kAWSKzap_dm*K z=ev}(HmkaF{X1EW5}vYJk??d-r?Ww=Ncf7(MhXAFIjEiQJi%;s{S3^$6J(bl=+(xg8eg>VgkBtrG7s!;oRF$2qFih<}xh zNC|-PZwU2Kgr(FF3}I8}5N)oycgt!9lzO+*H4hPQf9O(;xRqT@hwo|#0r={Gc%cm< zaT;^hapD81U%UsCt<|IgEI(doip7kpi9d0$vZhdq?`PB!@^C2~SX-EgTG-=$!sn_) zcj#9~c#PnihIfOK1?bn7++Wy-kK5N1MsTr~h9iYQ4i8%uMhdNvMB*r+J^tj65~gDq zsT%`Pn8(2ND0~NF(S9MkhR@!tFLbB${DF`1_l7}Hf*b6wFSNjC5phDIYJMQ3x!3YX z7qS@G5=TGX)PVkUA0vE$WyLh4FFzhb%W6MXn2BW#dxw_waU=5PoN+>PB)6rJ@DlzE zH>dkSNMrhT|HeWhHy=(lrf=OMeIB44hX<%me2|`DA@?;OkZ??Fh|5P6cPY@b%yP$i5V8G;(!x98) zFKGC_;7iC{0HY+_OH*iB~P1ci+|T#%l>!GwQVUbf972KU(?xs z_e}fwiJ8W(e|x6EyKRI|Nb2Js+6W{Qa!6a@We#I+-wVOhIQ@G&LuyBLb107V@cR3% zf6JdXCzt)fIhph8b8`99=H#;9H79faU32noqWhmYC;#`9``&8_s%uv zpDM3_aAGQ(d%p?{Sx!vD9S82U2FwtMga7my!fLJcm}q;4C2?56TqH5{Nz65%MpM_k-N`0v(`k z5^jHn!0;sDYc2&e$-Bmu6$LOCdBJw@w(xGaa{SDe!T+@CJ7scBSJ^Yp3N#y5OVKtgW?X ztys7qZbrciPYw+X{}U;(;ISnwIkNJ;ouMZ)(t0K=^*zVOH-;K_Vwm?89KjQZv36lMrsA;_{u zj4jozB{rr`d8C&fWeA_67r&DExjJ~32z8yB&&14;;lK7gRJGVe8}im^9>lXaeJHseX@nVu4y6sZsmY_ zAgzHbJF{wJd z#Bp?enGk~G$YnXLOQ+?+O@#Sdt-zf={*KBOl7C@{%irQan(!44q#mnT*~gT!ZC!WV zUUtH298j;p{nbJnj0c4IigV3^za@5!5XZTZSUbhaw?V+~6&k{|wSp5J_lG%t;w@)7 z?ltRhi1mgB>x53$DY5oP_GtV%p#@>~IfY7qwe?DFV#4f$>u3X=Ep!S$v; z1^q9y52tW*&}Mlhr5lAYWR8BY*;E}xeFX1*}eq+VY>wqmv-E4%9(F=GtM;Mt8fN;am#cU+KW^6QqFAN zOKW&+FRh_h0dghH8wPdjKgeD&r@1!lYmM_S~8&y9H!%;%Mn`Ylq1+`I+zzL-}tb> z-1d9>V4k^v3GtraQ#Q=_p4M>D_q2wmzeia*2cv`vk*+&*{0fDP7bHqTJ18y?8e5JZ z6*9PA7p3)TU>B}Zz74c?;cAwwku5!|F)QfRGv4t0LZKP7KQ2UJ-+gqPwqnt797)sx@c8=Pa2Q)I)F$y%ROT$t zdYljJ*A=`R62n(c=Ynmt$E6PYQ6TPJgMJhOJQ9p*>P|rlxPxh_>c0^X1hrGc^q@c5 zO#|)AFs|!{AB9@z7hn9NK#s?E_(>q)UGUsFeh+!!f#DEVzL(f!O+N`a=)UE`+_(0Z z?{&iUEk3c#2V#18Xw1u7)!`z{$!WDYN4L~v=m^G}cZAYCROXAlec-@N!3BMRB2LWm zb4BlA6+it465yyGG)}%i!TbEf`+Xc(9Hi)<1)kFIveB6EGg^X&gZXD6SeLJSng26` z{n;^b$UCd`htS(Xb!d1?a10=I@Uec6))gfb7iLqbo#^lK)4g!A1*pcGro!-BsE4kH z%v(Z~%g=X-0i1-*@u#tQ$ocUV`wc8sR{#{9JLn7Hw}rZtyl(~a*7FgJ{EYi{@`<<6 zRjfIhSsc8|NP>#TfdpJ23z}`2R^Xko57A@9_W5{#TKtb!=F|DuV&!tS95{Cq+Zf zW}rb$!^DelWoR`kAE;;PO!LBu=y?KU@fz6O!!i zeBBPljQQe{0SlwY^N9aDjC)A^2XY@0{{c(kLqSI-DfPzrV=hankC^9I?BWGa_0m8~ zQbbyk&G903|03f1QNDPA&G91Z?KHBLiu)vm`hLXMO=)g(w@6&FfcTR|zm-NDq4KXS zssW7)c6mUCqe#5S_-%`#p?ylBixWG{MS~T(WmoaE;2UKVPm7h^#MY3j7O9g3@$qrK zW@i=kT8Yz$|Dprr-;E#6rIZEKv68wyJ#bR^b2@p1Z|Ur2Ei#_u;@TLHNNO?EdQ9~kh%{k`c4~4p3 zdN4mm7h(YeAoc(Og$Ira*7xH+H0*f9MsyW)Hg5p`(540q@f81#fcq>c?|>HwMO z*vtQkNTa~F6MH~PsQ8KcL|QY5-)5?Z@$fSoA@Adieq@~W7#mpWNf!tY7jGgY5{;l(g~f9w2(K`>-rj2ATTD8`{c zgO1`*bSQV|BpS4|j~kNbKtNR~gj#>Z3_d8PDa@rUt1hJivnv9sXUz*0cYogJ8l-e`^W-JBM^fvanOJ9R4aB+I;^0&%pGmn2ZCJ zU$Kn(>66fHP`qiG)*2A7#qBb88;L7dQ&OB)P#Le?hCdj=`K}P4EvQ z&oE?Rm56{l=(iY5u|10ir8gG&L!+(_?>3rF~9MD5Z?cbp9*Mh{f33c6S(+XlVGOTlL$gi8^ z?ZPm767jDNaJyw5az{0Dhdc~BF=vV?1ibr*yHG*kOl=M3#)dkaGlufh@OW_ct;`Up z)mJ30;UD)ECC%nQ3<-*9TQCVgKQWTq1l{|I%{3cUyw<#Ov?~_`S^dNpxy^8?pZG3$ z`le{Wm`cOm6dQ7LEE#W#-8sCx)*mmy67rV#DyPL{9K%Pt#Mhz63gJppD92!{4 z2Z$fzyMqRbQ}F8IKrxNG3||Zq$Dyyj7aWKa{V<8P7>%#+apFt_HNT4!y)>vW6u&Fh z!Ml#{iS@bD(EL5IAGZ-w-xC|*v%L4j2Ux&rI20g~K}jHoAl> z13G^6hDdHTBtE|(fZgf^v7Q_0W+T6=4|JG2!GVljJS}J6aTI-N!X1Y>_k4Y>1`J zJyeV(!;>3{M_85*Wn;CfMK7^z4{`O*D%&#(mVYdcMpk3kwIVRgyyyUrhlw5-(lq)= zEiM2IpCo87)*m9#2Q_p?VMsOpb`d;3TqGx~^6Otz-tocv_I;+B>@y>VB!)nvFD^N_ zYWR!x9f4=}@xd@?W}@Sqcv?S;bG+!F;_^WMsTf60HkTZ93v;FDmU6Ng+HK9L-p7f> z3BqH|7<++4u19s1#jyUh*uzfjNW3-luma^Mnl4H$40B!bspzl5-=eKK^&vCH&D}Zg zDszpzk1>T`)`vj9&%~~pt%2lpN*lcoWK8SpWvwXO_)OGlmH6C+y^i5F!~KFYgnlkM z#=Ofr{;ry`z%PGFgnOGn@}&j8RT2JMm1+lVg1O2hiB7&=9a!s-iC#6_gxzkg8IgYnZ*SU&5>hU?Qs zdfM1Fs3CL)n{_y<2f*YRRI`k&FP%_5Q2fmwu$7Ven;&D&{q$DllN6Dh)eqv zksvvWq1~?Apr0b8PSqpjfJs`$xau(BHPMm#3OeL13$UIu+1mF=0Hy$sjZoo9RgNF) ztCCqu8o;1b(NTBp1S@M;sz~r1REpTKb;|-4&r{P)|YtF;lAy9ZXUE^*SdGvH? zR`ugeA>k{L#1#&MlIq7>U~J&?RQB1AhOleu*i_zB`V>ZdO$P~elE$Nw^iTpl7uk~@ zw&4!5K|*g;9wZ6M2@tYi{o1i6q)Nw!LY0n>!%WL&RINd<>^;N!y(a5ljGavmHys0d zxJemO6%RL+;+SSAJE>B|!%b;`!WGLe*;r7Mo%ZYr-T!$Z5?fW+N46aRjekJLXH3$B zKoydphs_g=*sInNlwzbKNXY|Xucvhc>60f|gCm&rA(31py!>*u?Tiw)St7$fAsNZb zbaifk$1p1lnymsIG)vffo}&064xz?dq`Kx@>};|gl1?`~ZGaHaFhU{&1BOXr#pT&P zBnl-uBn-eGnEV{*HJFaj;C9i;`J8QNm=jfXxQYM+S+∈gNW1g6OtHrF5!pRVg7) zMpz*Rie+((Z{f5mD8#gBmfF;Q{8m}{-mq7#r-+Sn}aS{ z;`6FW?vNVynGcwJXWcUY2zGPF08%u?gI@x59HC}=H(KLM?U%|%7-9q2w6Ytau< z-)!lJHk&6i#V8mt9x{%8&fgbO-F0oDY_9mJ`ot8pb+(m;A;%bUhSvpcrM|w0XH;p) ztQnR;^Ti|;ch_=#p*V>n)%`3R6$PwmR<^iSl@$ynu0Q!%K3*)&<5XX|!}U(mcTl`k zY@zwm9Z~Z9)i?YsjdM^9)yxXU6+Hg*3%>CAGVw>v_gY>D+=w7=%lPHuPxQDcsV5%K zjfJJJNZ+W6r$P8C(HF*akw|JDtZNWA&4RZkaOm@EUX5FuvQv=JO{&M;f}%qPA2`uX z+KP|lS0(yr_p9_#_*yYRHHm|SJ<Zkjp6{jny^uvrcENLMm12lNeqPAo5cR8 z>QCGxzJzHy3O0!!aEGATW)xBVVaH~%IbPk{jFSa>b&D8*S3S3gZ*V(d=@zjEesF(_ z*b4K$G}|h^ttr=_ddnRq9$Z_+aMh$zRI$XG+DWB!Yj}UF820j=s|Txftk#mmCA0l^ z6aV8~N$AHi@}C>|uax}fPX4<@{_`OJB_JIh#SVrby9#l6qE8T|+{^0grKI&jCGXr- zOG=)&N{ySVjyuG$*h5=)h&4#(o!fz(cnd9)-tOK|W2ZO+ah@G`%8tjs2 z7=1ttgOCp;SLk$1T!9&^(qT^H6XFY~i8Uj7nXi)@-<-$^ z4Ds;E37p?pr)cPKph%n#WJ#U?_!vQ#hto7ULCM-TJzF0vBkf0Pzi$#+A;=N)qLQ9O-+p1MG*M10v`!RdQ){`1{ zOLU3YM8&D0@i$8hXq^1U86obJvtkz#09eZ-A36piLVZ^B#ruxu#BKO$!8zR6#=)&~ zBJnJYI!~`&KToe_o<|)MLGttB9NdOFL&{Y#1U|bUzJ*sV?5ga7*olnWi}>at_~4?L zio^HrMeI*ZlXXdaA&|_tqH6r*nbZpeYoP@9Mcvj}3hcr{`&Q%k?(oO#LyGgD;=-X* zVm}dWHR%T})mAYc6w_z}gACfr*@yVcxc60qe3>@k+sm{G57J)m5$}k(CDyhkc!7i)_U+278zM<3qy+C}t;5;!YuhPnXkTTMQp?(C zYh0l!QKED_#X-nEE4&PMErjnF6>4Ca*jaPO1ydnZtew6d8Mw->5BsDZq}~t>6C&ww zw&gu~#)>{I?-72g>=~a@QET3#gD77~!Wk`JpEeKVaxv0c@qOjua_#|)`4It@C9v&B z+-PLLhd&`Ua{yNVgi}8Q`rV{g^KRm^U6!stiyX(@hgWZj^{l<1Z&A6OEm%8SD(zGp zC7-dK)Q!@*zissl9r7G4+#a?|%Rk53`NC~`J3qfIuEp~$QFp|0T>3)qihB`!x^x$< zO)*gKp4c7_1P;C@PQV$5Q7ImXm{Oy_9dkV07r(|^7**f_B11dwi!%@s>hVDICcCkB z9*RHV!=2=zHw<}%GZd}ak8t~{B)jrrsg&&fk6Dz+0O-dYFmdO4m<|6 z)kz`FEE^I!;M|82PU_C>vouyon8#`ze5R(KEmKRMhlyJLNM&zG9sf_}DX7uk!~}~{ zT^t^RHBu-_s;L?zkPQVIsWaxp&^t)eG^oNIha#<1*ZYL>6?&pNc~a4N0$g=c1JG#k zbrD|Cvg(~;)jMr1?6lu^LE77s2yM{? zX)jc0Z*h@=s;1le$xa(?x+pc>WvBLvD^mM9PlwdTx+1l;nbi3RGF_!0;*PS(RSHD! zB`tp&(}1}y@rLWJQX^WWPd&fXP(mY+#XovDZQ>r3I=B{sUx==UiHF<-@*tl zDO!~<9~OH_O>w(-(hFO8a#@&uF6h0bnp)6cP0}FFTk?VK-jb8U0s5>zK0~WYqPJAt zdCEGSey$2%n@wMHPG_i~qrNv3cuS4AD{$Xi3ez5T#8&_eCwusy=iIFI(9%bGj$3Sr z_mPHhT(aequk<1jK(+j(#$2rBb$VkA0^sXlDNJMJ_zVbHBz1y2!O|eq(E5g8J12o0A_*uXTZBqI&{u07lxItRkP#|5 zp|e7EsMJU`*&Tiem8v842cc2~+4oosVUiz*!n0+#B;&?zF=l7O_O}Ud>I`o!mFi%Fp`oQVhQf<823h}F?R?wl2L{bYOuDuG2E?6bibl36uY@86=1X}UPgX}s| zBYbTeySiQn+kvq{>PoH9ZF~p1tqw!Qa!_5VKHg2jA395RaS;8b;R!^)xUMpXzU6>l zggedJ$2)sL@*2rKP{;39%H=mCI`X^F;B+7up_V?-tsV-Q;V`D2R0DUI=6Y;8;tr?3 z#XnN&!l||eLjDJ1$tJkugR$)(KT1kLKL3BD?Z1n(b%G8}q&hfkDBM;D^zp`qu(gRq zK#X9B_W7z2Ebk|~xUtk>=v#$oUI;||b8;069E|`tyea)M6ry()v~oUcLrZ{$vtidZ zAkCny#^0P+1wqJ}*zCn%mn$wRH^}sz6=oUQLK^<7z{qP9WcUwbA_-qs#ze?9!9;@Y zOs>+R+{vUxdw}b#M*aEvZC{A#-n=ms$NYeM_%?!$oKHU83`JBjRBtY|BA5M}OE0UE zRlo(Ryy2VX(g@4*&r8!0RRKg*UIlYT4+l$N2dNotdJkT*;wvfO(ow2y1z7+=mLSVJ z9i{06X|W*EqUIRNQvPD1pT*?`sg{DWlz;S*A9Q(9Dz~F7fGA5J%aWHQ)Q1&F$PTqk znp6pDDe>AF#7+8lLM;<-vB--5GSsr9hvcND8}n)yqi&u*9C%Hdhf?X&o>CixSyuFv zdf}C(7xF9#l6#?C?hm@&5&>6w^p@V&?&ompjLDu}mk?U$Esem(FTO4jm}TtiQVU#H zoS~%CGGEyHy5x*EkGw7sw57otsBb30*f*q>s4lK~LsHO|=+aIYk8Z1IAZSZ$AE~A@ zLtC&6JuRb$`i1Ih%q#P!0WT$eq$hzFH`^|&_^QRDue6c?FZunYF}R>T|CU67m$%=d z(AccEq-hAb_zsX_IEHxy!lS`b7)&21^~8njxVKEQhA*;A$`ah&d2lBKQcn;J066nJfjt-U#2z}fg zEFD402R@X73FW$0%9jZM5(ROC!hPXY^FJIBSg8-?p9c8r8qodOFo=0j8&QJFa{l|r9DNlZgg>39eB55-}{J=!Tm;%?fe8au{gNbyrekz4P-Oq66 zu^)zfhOg|0%+Dl(m_&ar5yWKu=h6#Q=_QECO-yEq3$)7!slEe+N1*KpDOjf($AR7aHM@tHJ;^|b~*Mitd2;uwXF_br_N089c#H?c33I<0NX~ePf(t z!%ASBq+lhvpZB3i4yje;%+S%}rAVxek{S9LYx6XOq*84P!!ggB9Vl?XiI7&mIz~;J zBzbtz*?`*$;>xR_I+_U*0Y_F(Kz(}&+?yZ~aAaOABky|(T}hcihc}D zVd%%oR07xv`HIhvnHKoU!SuhCS1A|4ygeP(y^B7;7U4eR*gAyBP`6J&005yHtX~piix-b z#Y8>^>7^htC$`z-B?^vGrT)IK(kKPCyv7Qv##5k#zh-@EZQXVDob22c`~+!SuLd5b z8orKJ5Czh9rh21v9o%e5Gm4e%lauICDu>7O86;5O2$i4sH+tzao`_SgZP}e)C{&ok^<4f z=DeD#%+TbtHO?5zHY{DAdSCWh@!Y*-{VG z#cyOw5eQj$E@qHL$Hh{0RA?P|lQ||)g|YU=FUDOMZb%4tq2nNR2|^URAae;tFfuD6 z7;T8QmBsGmE|sovDoaKVVj1N2A{%~zw*eszf7rTQD#KS0=5VC1Fo?ram@CB*rEIMY zzX-;Z8|!Qs1q@pyy@1axHVlJ673*!lMNNELIVDRDG4QJ?YO#TXtWCSTA$7G>9YKtZ zb`T>1uB@h@$Rt>#JchAd;j<%Wq*{ zP#DtzuOOmjpbv~)BSpDCfo-f^L$Qr>Yor>OG~NLLm!jh1G-*6vfBHL?scTU-s=lj? zZ$w%szVZK^L@*n~U&cwK6Xd=>HC%BJ(&0cukCB16#HVhNI^zsdp%2h6K^soY<4sLQ z=T?b2Z4yiawrrKCgE4XcP<))p2%eBOfyC&I_}Uc@5$4gMS{<_Lnn!TAEL-y=Ja3|g zuG^`uKVm!8o|n=qbK!S&(T(%^cIh>IgWo}Q+|PGN38*w{A#xXrA)lR+C$7kkww(@u zc01{}pYEjZE!v4|V1KB)OKL>6sTwq{4qv(72jX{0pAgfcE3CYRF*I{STTpk%#682q zAU8AHrYjSVV$ag_FgTT&?T9Lzl6;LFwEhiUS;sQZoVAzZ8XDgIg0)$v!%kqX(@_ij&bZ){~_vQFMCc z;A_QtLiir0)3@4VuhytNQi|$rz%U`IbPXG>Zv%d3tX)~_m6OT&G$)c^n zgw%9%DIo zRa&G{A5CZm$=7k}{OAA?bGm!0_7y{{Mnmiki8%vEDBkk3x|g8q4e9k?eHXg-f}UlF zyWv^C8!1ZQfVidMGx6Lh77-ETRb4d`^Fr@<4O6SP+gBeFj(2U2T2Wd~_=iwyWU|ey zfL@Hh&o}eg9e9!SFF0sgGh`?Zyb&Lwdu>Ag@A2TZdPq_aUgl$Kj$ea;?X8Zrm3?>7 zskXB3F1Kd^CXf%2iK(T$i;+3iMvqN4xPL!|oh#SjR4AMR`NcDuLD_B8|n{LPQoVNe4uCSzA^uC;T?6No>% zwjutI;xF5}2R&A4_b5)ve-r=ee@pLhk0pb9!c>+d#Q}Tg{!@A<;W4f=|5EQ1+j=KG zUv5Iqoe+QKMIUf70o3^Ag#^e{BaoSPX0H$AsN_a?`-Dnvz{Qz6+$4HQO3O?~nCUX! z8J7+v!U3_$+3898UsrR)ow}Uib(${?7k?#H z8afaD_Tds8&+?}!i@zUlzR08W$Q^gg!Q znae^DAhm*xYCL0AB!7tc;ii;2nGK=%2-PShy&zkUeseXa8A`3IxuV(Nr?%C+iW%h;E0_k1Y!fr{h*es?296x zjjLRnI}UHV%5`y(2nWx{S^myUQ=!nna#xvmCmhME#;0FotL{TrxxT~KX=G_^=q3m2 z9)HP}#uzs_@X3Q9in2l76R{s_0{^2h!Y6oj64$97=Yf%kUPqwnvT103sd?s&dOK1S9OlArB&F9|e>z+c^6 zA7v7C*H;c?5O;m}WKDt1o4%s6zSWz)lC%DxzA`z2QMhkLfQ}uq@P({4GXuQPUxt5* zTvD)qvV-D$WwL{c^Oe~SD&QA)P%vvt0Wm8F5~uo?oKM??5j74&il1!XNLe%bp~w82 zGTBHK&UEtu7k`;JLWIzb)c=9C1XsX6;jGS6*L%96%>B{6qL_ZHy59fmE6S76)r!}pynC3UW?8rJHB%O|C+KFapaDwDc5tkg`u0+enkzr0UHBg$qQW#&^q7I z1qxg23x)~r&2)D{Pj{-@PJ)u2GAigzUwIMAUKpdZG^-`|$!VxQ8j~8aCN7;s(=U`KW#s_)RE6{8{m2!xifJSZ&p|S6b+Htb>+{{$r{Sdr@SG$ zo=nV;>PUG8r?MnR%KjX2#9kC7uO&#BJMc3aD(1+<`f`0VM=q}~6LaLG2B>J^1eo7Y zehWPSRgL89sEd|2!n>2ev$1SIiNt*$;_u|b2he5=gG3GbS$7!RBX&-S=xg43$e(Kt z?=3syZqY}}CbAMAsJq7i`*1SWEo5Swe5D2bZalkM%&tzgpj5nC%HxqrT1&Yt zQrX{9Z> zU5CxBX&sdVk-pDXM+zQU>ln_OhoAm(9of2zb&P3auVZQ(c^WS2foPN$CY>t4uCokaSv6fUeC(}3p(<=JQR1IYIMy`D{ba$>EBL{CZRWz+smEZ zNYh*Jm|K$`VmaMjj&it1oj^T0;97npovr239b{@C?$!a-hTiaQ2j$CFwlCLpkfR39 zpM+Wf-<4N^f+bWU7WA$ey6IEn0kJVqLRR1(zRTXjInL{_le${*n$nSy4 z%?WYn(NT5`B$V^3SxIA+6=SA5f(Y4O4aJv*)BM z?@qV2D<7>mLm&EtR6RlR*ROX%+(#IT&7+>q0m|~z9p}6#>n6O57z%5P%d<_#Z&~G(ZNRtokAHbWDu!Ph ziiZ5NMjeKWM;8PKIH0q;GBAmSorx7KUkV8uZeW(#7v;eyLR-Bg4?$gY!Amlxm9^Y> zNuGnTf?>)lvPD%q3)**)Nl2IdUE~kRW$UhTBl7!ES2-V7m*wl+$5fd& zJF@K{q-q+HJBO@{JOr^mH~gF(_`~eZFevUOKaW6A*sJnvB(?fgRP|%v*sHj`<91kCSRo2X z$@UDgDN6i&HaUu1)aH=Ep)(%>7mM3AkWPuN+@Y)o&ntx@^Dj8Eau=N;Cp zsQ+PaZaaDvEUx8Hfm`Vcw`N!6)}+4-w~pJmWsc6rGuhB%uuRiJ|C`wLw15ul6+C!7 z24W&HpU6-%DkKX zm*L$H6?m6CD+-2<_>Ye}L=b*YAd$bys5@GLbHs@LXzYJ{)csxy&R>Of-#@{+fqaH)ep6H{wL)O4PuMYeIk`>ibe5nCVdM37nu_c z^-^$G{)`+tQkg>#lFG);e~3LOtmxQL41RR%9Ajfg2~ner9TxTIKR0xs(HzDII&KbA zF8wFR&3~LRzi-$asyu9**|nWP1Lsqz^9O_fVMI|H{7;D}N`wEMr$I=yETSk>4E{HZ zM!zK4)``Tb68sNiZ_?m@2~3Hl!T-{M|I%cOy;(8%U+z1}T5j9ZV*f$f_5x-&kIRw` z?v?d^h@EI^OO)nJ4BUJ=OYVkN*_9XSbJbz^)=Uq0Yc89Sbuy~REDZfeVvrB2V|vB; zAmu8JGDV~R4V=fuAa0_F=SBH}$;9sA*<_Co7`i06;H~%wGoq7|P5t37#BmImN;$5? zN~Ij1!#K_Yq*e;IX!tqfzsK>S${crQ*K{2J&6tkSZ7I{0z_yg>z?jYg+g4&ajd8jA zzctPaD{~zVto&P!^BoGyl_12F=o(NL*cM>kBZPIbB zXq%Mj7zdBUa#gg=isGD(a~6!wu5z+iuKxjfzTeJtD$m>J{Vm5i>LQfoijqcIj-e?D z%M~T93d>8M8b0?w!1C`Zv)q|oKche&=)2~4(wsJn9v_#<0*cyxNj|30_Q;d?Gm{4dow!it^Stv|u!{uy z-!?_U>l%|Do~vgHv~)WxcUP-6ovqXcLQJ_g)OXUADzr*3SvDP&L)EI%3#VX2EU}7Og3h549Se>2H3gDB?QmY+fN3=D zpO>#upIkj;Z4ScV<;OwqZUyf%6~T#cd z3ONv5D!XGnB1`3K_`Ji6R|3>LvK=e&Ib>gx-JQoby~A~Lw(D3 zRhfpRJ1y59$bD3*gdLRx6BP&S-eAY#0$OM@D0DRWt$oLInNufxYn!rE43TRhhJvRZ zs8UARcSH;&>)^&6xq+ph#`KWRmKBVtIO^U_Feydl`7;Mv3R(I7fpXhL3<&u(re(oc3!InFsL%NEP?rbnC` zG9lU}g47{lqpdYe=5GA6CDKn!BBlSDM8dxO1&M^6^t&X|`W1grB4KCzqC`TD{|OQ) zVdJw&qz9(IrSkLNhJBt%47~!&-(cd0YCn5_m-gdZIJ?U9+VQpJULVszm8vkU(qyKS ziQW4!6sKEb7i~5EFjV<|-yF;J{-!P}=mJVsuuuu}@ay4*BZp?5UHvgd8nbTyMshviBQ zN|aE{&|5=&XV0thZNgm3`1egZwQ3R`;jgg6q_MZ~)*jQ~&_;v@^RugbYg|b7Vv9a9 z88~dq?jhKg`SWaTDR~bC`@BC}D&1sKY0j@nCG5UmkV@E3ze_5egFh&huoHe!Dj}!; z1gSKC-m^)iGueMjsr27QMxRY8Iq!J_EMnKsx-APYokDj=4WHbWotR7(|4kTU-*nAV zd#dS(N_B1`nV(_MK`;?#Pa-Ke`zdAM>Ap(!U<#v=*QEGu zLPNJZh-0_RdQ&~_Rdw-AoW2C0DX1uR=oYH%CrfZDZsk?RA1et8DlqY0$z%CLpQI{f zr_QqU{mS&MRyA!#rTRzfQ99UfvHF94SiUAKmGY#)lRU{wAw1au4G)@TSSvmQ2_BT;mSF(5&J7&ZPI!7D^q9#&k2*l^gaUVbyrSuT za!66bt06`})7aH46lrR3ol8-ql4GU-=rPw6!yuwQsI>L)$fyA!^GwdFDeh2ro~aqa zcyG-!O+<93WF9hU3~=*JCy~Xc=OgTaUH4IrX+C5uKs9hY9{b>SZb5g|R@Sgj;VM5Yw2YAb1@`kIWCT}ambYwc)_qkrPK}>D0nZhxIiUtFd;fFM6Pu3dK z4Fmwv)|xQYoF#v)X%ykzUt!aS{-YEMSNul_6i)m{%Rdxt{-af}aC9PlN-DWOh=o6c zWZQ%rE^Gd{lbfD-+ZX!aPLn5RZRzbMIBQXns&Bco*;J@j-TWC!=49C9Sp2##gE;#w zMGlm$P1N{2s6y<)Jq*1$Jz*nYacmU1hY$@Jr^4F@24=S~d ziAMW9);M$K@_L*m=1-yUJ6z;)NZa5h@1Eo_z3=-r$tJrj#MFa7rL1@%G zcHEjXrqNUq>QE9kKT9Q{+c_%B8lJOBLbdUMy{chM9uBwFDz1WLR2M$B*Qh}y`530w z>2H8tLe_v8mrNZM*%uDiE}7arDJ#ov5?R>^vM-zJFoBs}QC51v!Yih(;fSd}tfsE^ z&_%81^$}Vk9u1C4(hL$PL4Os+E|QA6N@eAotJqDyEh~$@d`4M`XYj9?O6&qN>-t|u zV9r(qCUqC@2~=RB3ponR0P0mOer9p$yXH(4$+D@$ za^#lj0~KtD%7|AbIaNfmbkdg=k#6pec62uCaiz#s>E8 z|4g~NEU3YJiQo78@_(K@k-c}ynfIP~=ggTiGv1*z*XN<8lQ;}^2{RG1(z3)9h4(<1 zmO!6OlQ&cjFxB>An^>D6LoLa~toVJEHbuaP5hh~pM#GLkQ(IUUVVXzVhv!ng=#RHf z;8*k?ZW_QE7{An{@$xpP@KO`9^x1N$sh_(JsdhpntvWN(^d@0V?5UystP#=Rl%y{LU<*HHgtWA=@(qe z^dDnttJs+vi*$5-A!&?BS<1{9gSfv1S!1xJxRjZ-X6(CD8v8~=gnP+W3DQ3N-f(~s>`q0N*Hv4 z00q@e2RUVKc3~Y#na)QFW$r9h)XW|Bmcq)#BTm#G8u z(`_q0VaDL~^qQtMzH>+J#GC1icmd0#kvrkdI8z0~zeK(-lwEp@+nBZDnpJr`+1yny zBMvqG127DFjUFbpZ53p+d!{;se(I^${#IxZL-nsgSS?emYODbF2OC4Zw4zThocrMM z{%_SXl@|uW=e10Yk)kqdVL{^|ua>Dj4(tWcHYj8+t;nrdm2M(dVCd7t0Pof|1-CL5 zyQ`SnAoMz7ytn5oyj_LgM(pmm-3)CMb{U~c|0TZHK}Orx0%2=yQ+w>{8ayd5V|2YB zs1a{^TX@G@6jT8Z`!UCxULZZScgB^ zShufK?yGyrST|p#8okFw-{>gkd_?uFHBsRzM1>0vmMW<5fE`D>5G-iF%RslE4RjGV zkCx7In9N9S*b}s-K*4^zjj5Nrd-5TN=xofx-*n7t(&6tI^M!7#)FB`qb^FZqa45r+1KE8{UiLNbo3w&z&srDqq02wcM|`kL-dL)r z^bPh~A0RKNR^S#0Hb0<|F7%f&KS=($RKB}ELi%)5jvYnVCaBUky3{Uiyd8nFG3xNa z2@9(|?B=FYrQG}l`3n;E_X&m`DOzvPFRa&4m7WR4-lht8!a#~~kpZbY1zvm^UN@QE zu~+SHnuWFftneeLNcA)0$C%L%O8Hij?-AchzDngj1Qp|#S><7xWI7F(J~4H7PrvP0 zv!e3ew&#CpdXu<~x7$q2FN}xR`Jox!GAY>;TJ4!le8zEX27r@-Q0Oh4C*Z0@ZbAd8-s0V8nm@3gZfjA214|f-onm@Q7z{y4DU^K1!prH+|2Gg25 z4>rwLvQ>nbAvlb)X$PA{Pyxa~X!uL8>cDlFHH4Ds%*CeTIE5IpM43qpC(RtA@F=Pc zHZIp?woud2Ja4cK!>fsi6Iq!&;FrhA!!&FfP89}V$yrNXCJL=a;pb|<%tYNW#byh{ zb-jKW6{-3UI9B7F0+YV?uqi^3{ewUcHE~cM9Yr%7TW{fgp@WgQ z3kBzM&S#t>M}J?cgsEBff=Qgo8FF=bseCt=)q$?wt3R+OO*P?} zS5v=tHO$CwYE)ibSt@Jc3Omy4IF)L+-9>1+KJR?QWj?>AQ~~E#+g~=B+_8XF3R#l8 zs#TmU&)h0SmiadbSsr(ir5(w#gWz6BRtK5ihXh`#@F%q=cUq}E`PZ}MZpM}#I{hdW z7{4@qMZ6xabh)H7Q{tz5Ql`Z3`EN0$YU=mI*lhD>i4wCXEG|uyc67P;5r+{qHcY7_82#t|h#?7;EFqAUA(Id~EeJxn4y+i{2qo)|!n z%b|~4&*8xRw~sh3C(NC!gXEns8B_p}lt<6LvE)$$=`T7W2jYHa0}j1ca)V>QvE!L9 zD$)(XAm zxM1+E5sqVIi-R>Y`+pRyY*(=0quo@|T#>?QEJcb>W2s^t1>xM;Fb$u@7RL%Fu>X^a z1?vwM>xAnc(FxJdO|jyBZi>|nh81^n7sm=c-2anU>DIaG75`nj6XJkI;o|!*DO`sj zVe1IT{>$QU;nvIlMYvj%m==2U*@IIL>3%pVq8RaQ!4#uC3?sfRxHv|*Blv$2qb9mF zB~*(2rbY!l`b>X?S`9fTh8$KQwe=ip!AMASGoq z)8^bE;RtU-fN?H4u%{pqO^HMhRAxG)Cuq&&IJ=y3zXn45bzBF)voIR1O8`p|uDIe3 z&-gK=PQEBQI+dJ!5gV|zDfGB(qUW>aKn9 z9n%Cpy21D^DSqo?1xNj)U~~P9>VrEq_G;y)Su*`8+VWS|XL;TUe9R0EJhDgK;8DgK8T{(KL6ar}`(|91RghcA;o zsMkY2)zukcLrA%PD0kdMujPd3MF|>Bb1gE zJ*}pX%b`LkX+tV#$6W}(=!Ul;AfD6mB!&yo_&B zOK~1vk3%?5_;A#7x*wceoe^$UPD?GeJ1;R7YcksLj2|tHJ0Z7K;I2bD&hfK#D4J8$ zkaccYm>SPP!t+Zxnkn%Zn)wexbD0xOI-_B~DVw>To%Q3Z->sD_`O z<5bdc6&{@PkI~YlC2(cGABiiVwtflGH%%+ZqWyuJCK1>0BW{^mk)K^|nWAu|<*QpX zwqeFCQ*-k45PNzPpOSC^ov4PEcTJHVUL-1_#ck6|SVG2aQxEpi3ntt%Md=JaRaHK* z0!b2mhb9?t$J7;5?!3dI53b%ZRl>T$@1n~A0~L(HZwEo=yCy$UWB0qJ+Mf1;Ts)K; z?iP6AChPw(?ad?t zSbt|r7<4^7#}nd@&-8%4?ae{tZc%<^PL!9L-rhj&%vs#tOtx8!A7YMzdL7KoF(kmp zW-broI+(-pq#=>~y`h5{FFl1^n>hrYf6m+kmzx(oXBKHp>IHYvDzm+uDZR}>pzml7 zRi9Ww?(C@9(Oh1;|7D>c!sX@Bj}Q#iwJ}=o)i0o$8l_MtrP4ZAg#O%RSI+|mALumU|;+T{`6x8^sIT!|ZGkepkAVMJnQtHAQ zCHs`(*~1_oQlk8I>?R((L1gV%yoMDDu>^0ONbdvCzbQsQR>9b4Xu8Dg2gdGZJ%;Bd zb!Y9*m}c$**%Rw{z~S!Z6KGBU%sMUYds9)y|c4q_Da`)pOyBcD65%W5sAji zbNfQ!#ShIdU`N@}A|(tqV-nc#p}8LGE%k)6q@z@UmwTB%z>c!Im-%z5O5Tt&}{^5be8c2Z1W3tmKwaDWc7Y{KdFYrhV?NUae4W}J~(3=+i zdIm0jW?rYL?muecRz}@jR6=*z??2GpXTNds`^>k4Jl#D|H19wQNk2cuTurzF zx}j8=-yUj?(J(FtDPnM-ed18_w^~%|XHuzJw@)>H@2gNb3REG4Ui*playC~4dv0oR z9S?@_QymnZ)B0X8G*2-bLg-C&JTGd#lJ_jh>(KmQs5K4u9XgnM$hj@P@ZL0YfU^(S zk-6~{KTg>Hu!(gU^?sqN-a|jj9~m|Mq(4E}sQd=ppJ8hmhku!EEcn%#D0sf24dRjYjw^BQDcMx7tjD}Q60_T~QD49^9 zl}t$GK~O+4Ikeir=hPI5cIq-Xtq|n%0GKuF*>X_mWzm5u(`;9C{2w-TFPn}-%<^KB zp#@aoA5ZM|m+koNk*ulZ{zB*ejM)cF9up1S_nJc#diN_v?+;c`+V_tfV(|78nYB)6 zzxzrv3F39fAl|$w+wpqlmFCvS^A%T_)L&jwHZWECdB8%%#w2iluu zn^=;fcS5V{fYuc;okINa5u;jX5X>jJm!&lxIX1c^-#(2P(9Qk=fYvLLBn+|)q9huRe zx34HTY}lwGhvLDafdd#VqSi5whQDvI3x7S(olVKmw-^~7DWa|mRKX}%+sLAYUYE@c zkPW5F=Jvu|ID6S_!l8cj6|)fyJ8vk8^9Y2CSIj+Ca|JNW8Gsuku9~ZIUKF?O4T8+8 z&UxB|@!r(+WbU&1{kV%{6huH?x z)vAI9mXxy)2VVS=F$OrwUXs4RUit^pmpI)c-aVY@Re;`smS>rH8wEQ9EyQu>8)PAy z{F??@+T%aNf-G;K5pX!jLR<&Pzj^47y*Vb zo&${lCC3|Kn8U>gh#7+oy99H?EUx6cv$@4bWxo(%c{8vy1rGom?zQmE?jGK7vX*71 zLcz8t4XFDcr{KJL7J3E}Rk#=HGwu5iE8H-qaKlO~oWEed)x^@390}tta@(`G+709T zI?JwhN{%N|yZ3|3u5eEr?fO5ia5SJ}PKhzU*;|iRJiC};8AOJAv5UoJm!h#{il;(y z623zo>-*;PFc>%(eW{$^gs${?&8`+@t77`BWHKv5<9!9q(8U zhu};)uZdPUZsS#CaUmGuzp`9XcMGU=0&xD5K#NM#>3)?y3#L#_H}t)`Yyt868-iv511RJ1y~W#$dg4X0Zzw0zQYwTNM6-`r$eqoPQR~vr_ z^AMGIO4?gCd395qAXA=Tzf1GP->t}H5Vuoyae|h0sl+ zXj7Xzc6#ooFyw~iUEvof@RT~k;d_>U)6`Zr=#|;jP7tIr=(KL4Q%6$nQqvTi(r+y- z{h!nDzf1aWozhbcXTM8)gWS@sctVZ;8^q7hO3vZsfmWg}bSLr$h|J`sfPcfp{u`vG z6SDLYptIi;^u%N1KY_}A(iQZ5h5Jjyztz@XdQF%HGyJ9Q>hBhp(`Uc~f9VCa{U({y;GrEtYJ7|I7qF`B*J z^i0cy*5N_$N}v?4Dh!8c_$^B9ffLk|FgH*#2zbHV;zl8GEKqtcYC}0p&)2f(nVHUO z56;hm9zoJz;UXLhlB%iF*F%x}>(P1|e=DZ1Cr4#q-T=JMU|x{9U&k;(_lBofj;t=} z-xtfVc zs_@@mf~6*!v!^`8RRwl!h~%xpb3OvYq~`cfVwjX1eNhwZ;cX!8QIR6q5#=oCORG1+ zr7)?#V6yiJmzoK<8D>_5bPbQB(O{gT*ymy(tc{VH!Kw1nvlwd`7b$hXiTdY}5;?^A zMx-sG1N2>tdu7ETWZx7BR+vc@x1e zRvM3+VQ0lkbyQ>hATL%Lt^R(un|?iXt02`Q0ofX{3M{I1H4HKc!4mUh}*hBxT;N$L1|2iNn@)5jSr)R^Kic)P4k^&4J8V5l@C261bLU_9h9=`5i zS@UWwh^#CP^hVjMvoGTViLqk?VcxxQ-mtE+GzpvW@-w^{ct-_qhA;H3BFzxafUYW{ zf(MgUl|*-=SR2L~q!@SnVpJ!5;+@~`WhkgBRUh)cm{5Fy^ba+lj%0BgP0ur^M58IuLnlB(fCGfwhr8-u{u!#@$^TGEp8lV;UH zwKw3UUA=fyRP9hvadr6u^r#(o^mNr4EZTTQZjUkd` zEk8@{CC)GuG=}^vjURj!FTM7clw9;0Ds}pu&{pt!f)uAhwF<8zMTJns^T0*zUxio| zQ9bha0eHTSlz?f>mh+W_nnE1ptn3&B*>$92sO^@z65bY^4;jtE=tMs>H4z};}vg=9Zv5%@n z6~qp%8VLFZk{8^qC+Yn*?A64%xixXqqi5~=y%14fdR0h+{`IMbdO%7WDF`;zm*Qz| zwIg@9-|2N8)FnqU?q3HD8(_w2ftsL$oK@ODnAK3K ziNCyA+4&8n=Gt|4^`cte6)H87YSr1yepC>AwcZAu!K;DF$KWBNh~@B~)Y*9VnOjpq zkAG{LxP{_BBWJ_#Mp8#@?(ayZDekbhkwi}a4QVXBTiq!7F@4r4Jct>7U+qqt+!O!y zYU0)#|2e)Itc|54)lhfPG@;qsH<6aA_F=U7pxi+4Zz{zJKSA@R($~UXSlJYNap9C^ zQiTd9HHc}jQiVay;8xA#- z#^TcMznV*ZaERF5T&jcYrfDG=2)k8nAr0pYmeqo>n_7&5gtoH-;eHFLJ%87+C1tlE zEv2s+yQvJ`oZZM@PIe1vCDkVCnA5Re3mDN#%2X3>^Mpm6`qhRHMXA2}u&IuIGgw9G zO+@gXD8&oAp;l`;+Uetd3xNqAC;EU-{BPx;N1L7=U@-W4z}VKv(?;-ZBh|)#ie7IS z2*x&2E&O{(8;NXmKGueQ{;Fo7s3P_Z|F+VB~v(M|s<1UxIXq4n<Dr?X|8Spi-5v4@O=Mep@zXyts{EV)>0Qoyd8^qe7q%vLhXeElB*imOR|#ElQFS{N@!g+9V4Svx{67Bw9|$4J4-aA(zlr#+-u!%i8c2Q)u@!-yMlqS4MnNCBeuUf-r-8Um@ctsv$CVJB{iewOMgIK1 z75TIh;AFV-&PFyF${V7$QAiDPXqa}B}8YxON;)O%t-$tZAmR5Gy7dy=0E41 z`&%_-j8k;+Bb;&Iu~KACDjWf!tvgy#pYNy(h54h@v+^qn@fuAfoRHmwBhN`q$tHhy zQGjE$^uf^S{X%_|Mnt2`$Dkp1IH)lhH^mLHo?_uT=+RLU$@{ZDQ__&`m z6NdMdK2#NjL&2VVIQI6Jyo5KQsI4&=cK+0-3Zx%O(1P*qVS^nLtA(;8yxU(2QVB0X zz$bK4m0d452>N~^%@2P`RIxFKkBK@KIj?^c5m9}N0b3L%2r zR0o58ytWqTTli_gw5T#3=^f;SB7Nemo${IVwdzbBBwjI8(45Jm)D{~d&!o!i{VR}r#ZaCQXU)^05F;6@`jE7EKbRWr9m z;;1U2kbA4A8a90?&3B(Jh-T?{Eg=NP4wUK&CP?hEBM^2C#5t`I^j}F;QQnM&F^Q0V zv^?$~Ex1_DKL0D}punIAf~kYhgfgO;jCiP1q;R-BNO~KM6cr?13&W_^Z_u8hP+&|- z<&kPw@r@K0@sjA_7^mrc3Xh{8gD-+swCSU8d)Q!U0s(t&G6lORS(-wNESTJg7O8^; zDN-dYH#Y_6MsGsmhNIzN|3)%EgQ1ciW=t*$3{_!iJ?>QwhpJWTHF6+b9rA}t7GW`@ z43l2OOMi2RN!9S5#Jy4k1Pw<|$sK4pT&kiPB|t)<22ZotBzY4{Y%k6y@R_JZ$A;fN z^2}a1Su&GN0n|10l*Y-VXXN@2zg_x+)yn~QOZ#!3Pi4+6(hu#MQ>7DL421~TGzq^U zg`$$?o)#zg91n5wpU2}V4ZdZ>gZj&EY1xE`a8bgT8ea4#9eXJx*JnsSI3W3XwgVD~ znS&g`A!#}1Ng>hW9W>uL13doR8s-yo^^@RIX9gy_>#Q}-tWU=mZ`jWa|Ru$M(=|0Z`X)|?4Ajp8k*=K!xhQk zI$XVwE2VlU{B(Jb6W}8bfZP6As(wo5QW+tpE1La&<2IAB2p!}EzqOej zRo&bgxVhtWY*i*CG?aOK7&#W<4`yP}J-?XP2OMI%PQ(7n?)~qJY&=;^!{r{h1cZ>3rc5LZkgzO6SvYAx3m-i5r@ zGP$r3w{nGtmGX$uZC(0z;L?35hOAmVkSfsa6F9H(3J(KIm>h-o%gLU81c(c64kS_@ zNHx@RE)XQL9!TZ2N3Igb)?08)yPHB0+g1)nvpv6NFrMaCSJt6~tt!ajK5H&+#kn3? zo|t>l98jr>@aklXTtGk}N9q2Rrqg3I26?+I3--I68Z+RPMa4QNo#?`8wS44pN^^KQ zi{JjUN;3t?!T2@6cGM8O+k8j34AKbj-a5wd*m;p zn&cHz6Jipw-;VjmAF9hWe(BbqRhJ!%U5?d|`~Q*7d;+KAGj826Wd63hA~ZOB(w9nNfeMzoq$P{~8x=%p`roJ^Psz&t zV+Eleu${$drTqRHV17=fr*xqI>+{$>siiJPOG_nJ=6aLm)4QYUKG@(?1+s4zYFKgZ4S6>?Dt9_tb!D;~Wxae2Q0J;!i5@vW!yYpHC+O&n+hK^DoKID+1dlxCm^Uzy!vy zh71AMGWx%I>wP@?CRYms+w}Lr>kx4zBltzRDaQ9Cz9?5A2N8euqFfn`LCcFWIRiQ8 zMLC*0Ex@NLcQ+8v|+C39XH9c*j;}idw;RH-` zKSG5+31GnoCYQ>UKG{C@75RZm*k>R6y1Yy!bcI%L$y3x_+xe=!p=&p}CTQQ5EkalO z+_&ZNg0K%7c9p-z2nzeMu5uFUPq~w7(+$Xc{cyC84{hnD8`O8!^Fuj0cqaZ$!jEtYw}6bQX>26!Ffddp)-*TbK&el$wb zpuqztuM2oyQhaZ@HB{?^sx*8YP2kNAN1_Q}P#?^ReSqd6?k$4hXp)d_}vAKf)T z=$CSq>YgX$4V1%C+=K(yJ3!5WvQ?M>xdUYq8b%)3>wblf18=0v%HFqzsA7j`;Mnr% zk#IMyUt`FQ5A%RrV}G6f@Yk|HR;Z2+!Y_o;aIv1jWZ@{{8`OeT-q#jgl*Qdl2w3O3)~JKwkI4Ab8#?d&1$ta&qORqXI;C zeOF(VsKQuKgGW`Bp#nN-MME!xP+rW!w6D7Pdp)t*DW@Q2Bvv~S zJ{u{&hbSEyDU)c!C|Us28YO$;!-k_|GU%s`!rYf6cPg|RbN?>EmQggfVKm8Y&IpJT z!rV!PmeHi$_T!`Fa%9{3wJ~yQzsbLOijpASSQCY7(r-Y!RP>ddJfKAn(PybRD!vL+ zQsvg=NUC{`RJhz<6$*-C1L0n(99d_iDc0aF4jmPs-%?Jj#sCOmeNrP-k}P!80b9q)&)}=e%Bw}rSFO`Ns9?rnCGn$I+_I z%B!W$SC_`Is%wmw>k$!>#>k&dXEo1c$Z_f; zRG2q1`Vx+rD%;#;|@Zv7quIay0TIs)c>ixMqg%_Q3X ztsG$}CDAq)iMGK)i`)=eOyrVe7nfwan^|h%&LpYifkNznMiTl|zn@4e-!u^`Pjgm& zdm>hTV->4BdeXzN-sMvHE;lG>eKHU%R>XS3Brd|n;v(#JgJV`X#%~YJh@RJE+9?lA z!m7?qU{&44s!Aij&!wt;96oQ5QW5!&Ci4%w$x#^$pDf4K+W#YJnRq}+t#sdmta?OQ zJa~?tUxpv*pc}+?$e_LG`eb>W-~5Y|yf8xBLtJzbGN#Ct-3L|hf`kv$A-*1B@+9mY zHSyi@8E|+Cb`J~qf*h$K(c8beK}yo9ATTW{uLFa5nijUskSjp>X?TL!IFNlYW@HA) zB$6c;kS)i8?^G;cEVP&^mk$~@h8O(pSp0(oP(Mh8kEY6Pqo?b|eBP7*r6~mrmmoY+ zVdqrzpS%RErpfh?SATw4NI&z$b zjH$6fQ2X66YB)As4)Pmia(D3fgIOTVkZTEpAby4%=3N4Y*tj#STu%cIv*?DmsKhh8 zZoMM&S*Og>47tDiOXBaaYL;9Ln$MKIQ1o+fX_g!g@642AHDk4i=XuDjKRXC!&6Gp6 z^uYxLc#?l$h=+J%G)HS;F|QzRneJK$7FM%hobg_mSm@@KRm+4uuC7LR!jlEG~p3 z$@0he3GX?zn190i&QDk*%WXW2;sZB_z0{P(F(*TQ>ytsGOV*^!cgWEOIAlfU+gw0s z*vE$b@AhaWRJ=`&AS+1E+vG3`&v3z9;9nbg;~SeC?w7HJ=>oB$Qn!H3Ccow}(M!aD z`AP;z(}I`a0~XQS2odxrfZALXQ?8$>)VY`@z}r??M#mKVx{V zkO&Ob_h-`#gFo3Ik^h|>Lnd~@T%7Kxe;h@^;493N6Qj{^9?NruDtea2s`AIGGUmx6 z@mq$?m)lYt&N*@DH6Q17GEAQ@M|TY$BmpNVSXthF{$Nu!0RCf{!< zPsgG@3m?Xa;H&{51KxN&S~j)e$U;ttxo#q4>#>wK;Oav88`SQP7s(o-eAjlkZ^MJ_ zveSsuSu4HJvK|#-pSW1A?SXUbjo-^t@t-bBaLNLEu#+!we z%v{SVxwTCG4qr(>$ZaFYP&LcBChhm)POH(x7qlQrmQHjYm zsJ#+rUx%UpN;%HEFuNR=G!vvf4FWOdQpCPm^vSb9@O7`SD)u`oWt9po=%VX$534Xt zaKO3El{9o0z{?=C8%K5qkPD0>*v0^nPad6D>fw?^(!G6-8$@HzZ*CJoZ;F0J)G%wu znHCqjl9De}((u4*{l{af3u7Q zMnRm33-S$ABs?GYB@~!v#=;B3mw0;f5Ht+V#jQPCQv=CzEMD~&4Sp@sH5z{COx}JB znJj!aT@NkrDIPzQm)$-@E3(@HA!Fm#FuX_r>y~DQt1`18Z;dI=pPyVRl9Oo2)qlAg zJ`6RdpR6f_Lg!Oy8aksGaCdN+yB>2ssOgUWAp1-;WWKh}!~gbGHX$L@cjYQhSU+1- z*Ng7vL~1~eS@}^Q6h^KKf!s5vYEJonD%s7JQvTamNbWSZJhaL|4?-fgC>RQ=42|?# zIDy5&=y80QIRTP}&#Dg#F%1rYAs`K()gJESFA~cve1VHHJE%96F3RAkhZUgP2AVV! zQZj~A^kt4=MJ^h|Q`+??Ii7Y{6;2d`*?Ef`nP027zIh94gF)w5@Uk zy#&^sAW^dlUUY`vf53~29p681aeX`-c9$Fi`5#UXf1D=JJLQ!Se9vhQ)dWw(G`82b zq0l332)a#WlV;P7S$- zWDoy!XW4X?d+q#6zRa3&}gn<6H)CkBO zJ=IhA1jNngpEKH%Hp}#K$DDs4;>kZ}=;4hWI0-Ei;vz)vWI9e^-}e7u|8t5?VfWZu zX4rLGDbi?JGlhry*a?XC|9@?N5`MA#DpxI|qU*M}BF=wPK7V4+0V(E7`;jAPLZZ*# z_n1tMTxfJm{uY02WxuW;!#R#S)X1mrUdxv|prHBN2BCBOxa?V>Dl+GH*EHx~s}Rx9 z&49n)n&zIHo7+8ay2W_ZHAtS{EZAEkYNY?aeM3dhe1{`Y_3?~an%$d1GVtFB~9@!RL11lMtuEvRE1yuvLD){Tp1mciY z1UNTAT}*&qCqUMv7Qry{xU9ob6YnAcp+K(T&zz;iDy*S@N%V8b(#nhZO5JcE?mzT4 z5vk>yJHymOq5#M^i}T5qK{W%w_M2SKckalYXms>9c#D%p?u3)S$(0QMQVwxoXPl$^ z*;`z*Dvu|dy9%nEz?GE`P>?_nPsxEALEMI~VSSx9A|T}ix~1+|1H?M|*I>>GIaak$ zfb9C^gW>22S*P70RTKq$bLj-mn=>K$q-^kBzdQyl!Pl_7uqo@O2SL}9atOZr^rT#? z`am&)nOY86RN`DJi(4_NhyWnirW)YVp`iZ?qE6w+^d&Su zCD%kX=ygi|1V3a96z!iK3`<@vZ0Tj7NeOt(PgB4D8>i*EIO0`+ywh(7gY~rB#XD_w zKm%1IN^su>x-)V^kHcg&B&A|uFtiGaQbYGMxEO<_pOHVuNp`^*Ty-@d1@0wJs#e5v1%%!egi2%un0+E#1fZX&?(cF%{6yRh>wpFC zilwlSWcZ1CxO;^_+V8S1l6)tA^n+J~!82CH=a4FbSwgkGl|8+ysv;}6>pzBLzsr$o z@*QeG-g^)Tf#=XP%7hx{TgJ}u1 zSqVp23D+Sa ziWg-Y?Olz{!b=f2UAlKso)ooQ!q3qRPb64Yq^BnohQ?TeHw36fR!IE@1@q75N?fr{@(p5+`;)x`FT=u3*o)f{WZ! zVB-~e9JV9zsyqjayLnZf{m0U`fqU2F(2CduhZk09!)AwP3LCN64GI#iL2$S44S#s+ zy4)FCG5@;U6s6ee1__Dp1;hR8@={;Y;BDMF;}02$ePZF*4f#Wq`MH~N59G*z6=4YN z+M9AsY~4;b2sqa{2zG=QYCwBS4#ad>A;>DVZedS356|7gnd(aT*Dbl8IxjhtILU9x zal&ZWeoL+tecoN%%d65VLNnJWD#}Xmzl{`a6!$~c#&3e*?(Dk$FrgVP*L`tYei;{# zx89cbYImL0;yk}A#MZD5fUvu=uSXa0klU0I)|$Fs6^GI?yiZw94VZo&7f4j%**!Y_ zd)Uas=v^9N4FunNvajI_@rcr9DhM*Bhlor^D8fUWwhsbES`F~lJ=tFv3cc=8Pn@TC z%nhW8)?NYmtR?|FlnQw~A3u4VwJOxUFMA=p1#XZy$=cB8I8TLL;5Zo6)`7miIiLK7 zpQnnorOydPX!LU8(zUgbj=MIAiwRwucveA2YdEZXK#M+w5fBrsasH>3g2>l9jn&t- zR`BP(OM&X}8T$E)rleZ?K>uK?FSPNrmV;%2b)0t8We+EWD^*qk;aLXZ?}{|brnp;6 zA$X1>xY*rF5IkQ71n;<834-1pR^nUs6fZIa0X(qUmqg;)B*^7@SP6243^`qq(mW$X ztF6QF4LUgqT)HcYfOtTV+S&%Smq5BLW z-v^4=)J;nCOP9=@IjAV>y{*F$ixkMOVr``x%3hFF-*g`e(lF>>)mnXuFGU%HM~D*n zjZpFvct${SZEHp7jY%k_j)bh**2{|e#KKKKD{-e~_*?rSV+nd|BkeN6$msseIAZ-8 zR_m=^KE-<+_4^jn=Uc1!PE>#~iW3p5udH#pNy?){I1*@$7ZUA$LDp|n?p?$wkln}{2dhJ@ zUJMaHhw$}^xNp0$wP*NLmQN)XhX!Gr3K@;9L4MPeW@tq>{TGlDY7O!(!9ubAEDf$B z)5Z>k+)!&I4i^_ft%I-&%|u)6q_wJUmLj1M%wbltB9e3eYg|PiV(kgt!YLkR0dl)q zTl!kKP>6>GJ%-8FhH#OkkPrb)mq2LM%o?KOK1@PHwIZyIY5%oi`pqu}LUM$axYs?= zRcS9eZT&!i!!{(Da*@{YShEyqEsuE4!NfkcZV(-1^}?rBqpV~M#7le%hFNRD=TX+4 zE_5C+kI5Bg2*)6!F1WZ&X??yT?J}4ZUAoIH5E!j@ilJR@Ay+pxus@vEr^e7OH#dfN zIrL@{TGub(5OP{y0?BdKYVeVPf|rSnA*`Oo6Crq6kmGF~sQcdW1X{&fJ7E)-V%i6C zL)|jxo7`AyeSGr+>wCK8%9})JRe|c$fC^S`l?yiqtYC>0JXTOV{8zH4Dn0FgDCj&l^hNM)3xx@YyX(Qus}lNTIBojKXiRr$i^WwJJ^FxF3&N=3j}-YT{Kt zj>3Nt8D-sdNsAxg9<7Q~);&&H_qphtvIexKef9yi7#SVcn91-oE1?EXbJFk2J#{Jc zKuY2cf_`nRozPAgibt`ak=d%MwUTa_^X-E+l(~khs6nM0p}a|ier;(-wX`is>VBhG zB90Iwv{zJgG?r2sEva+uOHlcg4pc)^`PnItgXR4W43@DjX%Ut*S}TVoO-08$zj0h% z4vYVD%!tC{NC+&0pQBVZ0b<{`4)jS^+J-h13}|C*1)V!`6UqUN&$rG*-x9>C`%ZK| znaEL^q&!Ll-%b>z7M)7)`vAWwERllJ&KDGvfT0vTl_e;__NEspRMT9V|FF&+Ta)E4 z)|aQdWJ1hl&?K}k$9J|4Le`rJ0ned*IE&>a_T(%MR-}=FVPasJoe9hgtPAWt#`!CH z69cBGG50n75$Yp1RlIjIW7yoEgIYY z-z!BC8v7n=bGKFSUt0X(Qq@Cd?eBR^6`8GyYF!epu^q0i#tPAc? z+GrGaur8?E>39S&?^6ZLrF~DAr^sl8!uP4}?V|k+di;xmznc-0-yWp^qIP>|zk{uq zg!aR|_WVTadjd4?X|=jo>F~yfvM;ItRN0m0AMaH=4nDfaoijPmeBC=7;FUC&=&V;y# zk7N$_`_QtFbG&|25-{_O@RZ+);?GVvF$;k;&!g+9m<>Nbf0CtDY=x5yz*Fog(WvJA zO9ObC19+}K1@KH60BkgX0@z^y2k>_UaIUqtKNpqbcaGub`!Q|fdBks?wUM{d9HV%F z!l%3Fcmnw!Q`_K@6Ej_*^KJi6sBKWhz|vh--rzdcC$v)rd|Hgh$A511MdF(Ixk6mm zRMf8$e4XVhG0ye=!dhAQ0y4fR?JqDu?iaMZ`Cm{s!M!i28G4(Mw(gE1hY^;1Njt+` z$bQW_5c&?JY<|x{+9V9~J|XEwaG$+<;Gk?`g0}dIo1iHeOM(my=C7QK|XT#Z%TjU5$;f=K@Ys|VEU0q@;INz(eqn_X`_1$<{x=9 z6^at^yXYku<4(OKPq6NqwbO>!>C<85eq`Q zTsO%f732)VFN-tkVb*Cb4ivaFoNCd%;ffXkUgwB5W$;v<*~JY7+eR>JiNpJ7R<4aM zTyZ2-r*0#e*9ku{I&O8dl$PNd>L@y^F(I^SoYm|cMZqz*op5t`<#+@xal&P!J+xD$u}+o7I#n7)VF5>Bp;P=N<0uM?I0}8o z(`GMbDEKbnlAsPP;Yi$PDKZ%nK3R^U(7hy$Mn75K2^@g$86ddrfInEu5J4yH7^s?2 zf?gr+TZ+muAgJhnP->-Q*#D^i%Zz4rz$V6@|t^{Em z8jIeOsIj<;LFBXA*{;=)HO|_|ca8JO8jhClWQx{Wj@CLZ9ip|4qcw}ASkKYQc9xON z(DI$a!O7uhwNM^xaG*61(zDU(+zyIM`yJRcl{!&2x-%!rk4nwUz<*jvLwfc!+HHR3 z-R5zIv~D`ZCSp2grA<^Q3=ErYC9Jd=n?Wq;W7BE7x42XHweMDEtF|Ix5*PM1=c8>% zH|WCFZC7M8!u=Uk>2_dZ^j|~YnUut?UE5Dcs5yC2D0KbTWJ;$do7`hhWGMbV~lJv>k&iWIBW& zcGA4=i1Y1EnGWGc8Ncg}DQ^;?rIilh{m~Xw8PI>lrFGcV$5~RetHtA-zkg$o$fC@H z+15xLTu(s$Fl%jiVUDYbJpkgqqdoT|>$#_tjI`&T;yw2?e_FEVo@PDw410}H-;~qh z=RUOO&SgD!F7LU&^PW48_S|#4=bq<9VO!3#o_oRhNGbCm~ISkHY3^KV;3k-Ex|x~9}hk-El_y3U`LMCv+4D((gs zgdru~;Ggo*gP{TZmQdWHmvG!}G2G@ap}5`VxZQEK@D9aIch~U*5;Ezs<~@$reJ&&7 zb)VzaEQ=!gfZ^qv?A%qF>_Od4un<#Fdn*NRP{5HAjwla?deEWr5d%Z-Wt8iNd64B5 z{cu(=nqp)*Z#b5X21CRM{Xk2TuQ!92n6dY8Rfm>a&>U|t} z#R(j*PAfQG=^U>?%7Y9CUVLcqUga1X0={J>Dbtj1J=hR2Q4wJoys*0D5b@h;Iz&w7 z@H}pa=&**u^Trwu4^ZJSY#En11E%s;@Hxs<4>n#zt);p#&4Y~>)17Ud?m@>3-3-Sg zC|pY&2{Sz)sXne6&vL#=UPt-Og!qs(PP6hR5enB)ev4gi9iqZ%iIk%llrom$@Ta`J zp`<^h{|4G_8*lgH4EDVn7}L*oNsCNBhl;_Oeh#+S-Nu>zJ1!t+`XL)B)6eyA*z%R& z;zo+hJP+ninXfbnZTuf83=2@Vh(Beajj=7C?%=N`OCdOy@`(`^bi`h!g+^!gHO3zdtY;g2Uyuf#d zRdzM}b-5I;jTA54k4oLkAThVJHS!Y&=mBQJxP+g}0MPS!6re77iuuN=>r5V{uFV{v zEzTBg;ncO&@d*0uq6lr{2yIuS#OT7^6rmj@5Q5CzREc*obo_IbvZw*a5h}ljLzd@? zP%zl`mYfO9+ecyA#bDa42(Sza_mzfe4~NOLpBZgsfa%mY;3=aAAYqj(4g?85M~ z`DR@{<$b)qit_$NkC^z ztuIAF?35Q3>+51M>x%^8O;EE?#dM_@>J`JPNT^~)@rM~$EIM}3T74MDceqT!`Idn* zQK@J?6?v9n+-_+UtsKR}wd&t?_hf zw8Rw}HTbA)Au#H`gYf+_SuSOzIsJh`d0A@af&ZQ*aAmv6-EAbeaVdx9F_a&-jO8yz zcFSCHA=&*vlMu3-Tx26rMSTSuiD$H{Sv=zr!A9Z}SE!jYXeBF=7-TEeES_<(il$hl zrbfQ+YG;bon27{6u5mtEgMbl(f35N;5&F2>NKoS}ciRx+r(chm&`%G~YivBKF&j%( z4FBL9meCawIIp3YY~ZbX!~l?>wGnr6lGa9o7zb-@B#7}RH49?=S&_&H@t!sk8uW{r z1<73Uqz&AJdngH)H}#@FH=_a}m%|YDa|?>CSn|59&a&2f*;x4EHcYQX%YZ>=WAo?j zY7)bEOL%4n%R)9S?BK0%@cK^nj_~@6J~pycy3)r+;u-T$#fUkt^|iUiGs0 zt31Vgdwh%ymr5Um+kD}RKwF83^Fcurl>&;2{x~auyC05YvBdrG8-H4IlJgq_DeeTX zmOE`ulmV=D!4#|=!5pkp3@msn#6}{~Pcx8w&nOKtif0&5y0eZ)P!M7x(dfT(UO&gh zLn7FTv@)7aV1X7Z`NVC5)@zMaJnc4j)heFF666?y_X+SICM{$SS71 zjfY_uG2ntPbBSDlgNx;9&%E--FvVSE1r%eet1h{SX-1P!(=0iXcHiq9yc;YtA*LG) zJm?cemF^}V9B(;O++rX?^Jog$Z3>{z9cO|&B|y~Ob-aU|Xx^jmG4OQvm3N8unlZLO zB|ygS0eh|>mKm!cmaJj)o~{M`**43KX%S{M3NQ@%u1VKrzIIx#U8`hO<)| zi7^{ckrMp)iZ-&oIui2Q*&4yUiWH<#8piLVS&0P3(Hh3@J1Wr>V>FE4Q=KVNF%#kU zvCc@3A*PvuI9YG|HoEgfSMDVXk@n}`kc27VmZ&Axe0@h6$ z76ZAumW{+fnt3CfF_0Fe1dN>5Fxn5SU4r)gB$h}~IU!zAIT^nTiSSz;Z!5W1BA%+7 zjaT?M(yyPu5T5Ol77?C9tK|sK(XbG|@3_Dm++zt8+_~6J65{t_9g6Eb#F|*H^PR1m zkF7&fA7bj#6bmo|F5CJpbf#E{-w>B>eHS?&EyDKU#uD9PX{s7rD7t7lWW2DiiL z2FSZz#7qqh^3P&fh$ilAP+Ake*RV;?Hw~#KE_G@9!zVpk8dAPL)R6Q24-66gaxNSn z9G62uf~^{u8_{;!88E&plop`T#lczWe6*5*qg$m2jUjK1skO42fdaLf(BjrGK>XG! zdCBm&77FUxD*CT0{%oDbo)BYumyVgPln+tODNgGtPWo)6O6n8LW(pON!=Jiv7*>_T zVDsC+>*A|Hh88y0Z6;`w#X^r3Hb1l``n8~jSy~GliFo{p!lV0H5f-~jOJN+t^6F%$hbz-`dIPJeLdL0tJk1Ypaa$GFfd)G@No)VOydpQ`*sXN429P z+8&e^S7vp49n!+icC_L97)itUXKAzcGlKR#;B5E-M$!=7o~Ag+2wHc@SyZ?7eDwMi zt0AE?>oF-s;IKWXvaP3J#|C?m2=_+-If|98JEtT_v_JnMW9yDa%GMV!8S$`RWGRS;JH{a>b-UU->edIMXr5cjNgd4V2uzjh! z#fl`}mvgV!$fly(8c6@r)=+oH`R40aZS}FaS+Clfk_}<6Qm&1D%~ppTC7SrUEl$0E zWjOA^9rn5{7JXGI{CHS4yr57+>G25k_@A8DZ4sV)XJ|Vps)9$O8iH&d7@BK)ANBD4 zHz-P`H%g*Z?@fx*NM3ZgM{l2iX>U?Sp7$p0Xg|Mc8|00FSv+GPBrV4!%zkg#$l)|! zzD4`mSS=*^UdA}ETGsbIk?xd$&v)k| z)(kBKthV)nFMH4#%1kY!t+rM5o#ntmoTY`F)u<9C$0K;qgU(RQT1c2?YpJuaH>7Xm zCQ(c!%rgx|O?bx^hE47Gj;%53&hU4r?)>nM4OIB_h4*dc@t+Uhx7Ad4#k1A~Xwl79 z8?uLEyu!`*>45Z|76 zeAE9!Y9=n#nlp!!`)AjEh+2Sgnjcb30(#kw5=;vFP)vM2vW-T&Wrdb31Jm}0=vK0_ zi1o4qU%P6+JAG*nSv%J`fj6KZ zC6)DB<~YjlM*+&lZ;nw!x*TVl`}L=W^9B$Gpy8aJkB0L`=i3MUDIz~=!Em!-F#JFE zz5^_(qwAl$3%kow+?C#U6&p>kU@teZ#u898YOr9UNz_D%No-L;jf$dz3J2>#+`D_P zib6D5V<#GW0ecq`V>DJ`Y)Op&Gjs3m0{SNSeqY}2_5Huk!}GAW%-oqXGrx1@oHOV2 zNTviColFUmn~cI7!pUB#l_IynR_+rkP~&9VG1fQ|X%_wwRgoOP*_ee=R&F~~El&8T zvcUWbg=OgfF`ZTimC$xIs_0Tart>QIp0^K>NoLBHkR_Oz`IHM2a`RO{92pQ3;nXP`s&d zL|-D0Fo}}ql0=^3Nt8TyCsifSj87?f%Bn%0>z`8cJpNQ7&-W5}u2d$^6^T6CCsXqL zAd%;)ojk5nD0wocQ1V=yLdm0_O3CxaREaz{B=X#>NS>P&$>W|v$@4G;$+PfFLY@Yx zlsw&1DS7VN$YX_L3<4pM=W!|}Pq{=M-84#`_S348=fpHho?og#o)*(7dAd%Q$n!uV z&%?^(c_@*`eFi1ZBZ)kZ?c_7sq2k87&!}dvvb!Yo$%a$;d-ODdYTyRodnxoHj9#Mx{A&ybjC%tO3#Zn zCLpc^r`0&&Th69Lo1sD^$NFX)y%5P$XB%g0D(XV;i!(6=1)@Y`8U^xMs=qclO-!T2 zo0BFHFHI!^`5du{j0EI!R3ebSK8F%-u1W;*bm=WrfTXL$z3Dvrt$8ZZ3^iZ8MR?l> zb183Ipdx!xf4KX`sv2-rQS;p}-h30E1(B-}iYPQnZGC`Gd|fYi-bNlJ3#2xJ4GqTWE79BW&sRFI=0x}`So zaK5o)WoFQ20iAzKB@+G_Gss^+Nw{r+M8f4rD=X|n*9;uGUhE3&FxjT8v{47rGwA#( z&Y*HYE;g4qi{@F|hkhBElvWtd8}&y1us#KSGFI8jv#V4h<~LqQF~843qi9Lt@KbVQ zfW@@X_#IK1q%AfExWut$sV8nQq}13?&D+1D&7!h+RF*NfiY&f;xp9DYwfLr_C1F>q zAb*fCLcPXX!A6*uU3K;9fl@DD`lc90`ne)G%mk5@uB-GeGO6|S0}?A;uc9KBdx7{> zX<9;b4&|bSNFo%kz>q^XGG9Qv$v8p1L3$UbUDOiFL^s0DC4`ACF_Oas+m}$@`IU+a zk8mm1=&QC^%bO$!q09h_uaB-(5hYawFB z;1yMAb8iKu&Gt(DeLijat)w&S-IdbJ+9^^&TU3b(Y>|ozoDgZC3+Wq?8m_yneZli& zB1LxF?quguf_!TuNT_;`?IC33Qp)VLQwGJX>^w@3m^_gltyfWc9F*uGA-#PQ_YR8R zk55WU3MUVTb@K=4RsHj>yhrwJXxAj3=vct+}X$ONMcY%`((*c|f*yNN zMC#tx7)U^<1`OeiXEB1Wian2jwbvK|g9M|qYE3=?{0k~5*lYAsUlcz{5P!Zv33o{( zoYL?)LxcPr6zGnn)oQDvq*Mhxdl@Hrl}W9wtSC{hp^B2|HP2I&j9x=&Hgyf%z%5@x zH6=f&sPv@1Y9~w2wG?4~RMD+0xaHICUsJ*D1Yozj6*Hv^&3oFDoep11dKDad@ z@a=ZPRv&vq1sG(_3-0F|Ya`A4)=4zGg-oTQaCKRIn-*eKnm#ajJtFw7&k2IBUr!Od zWId%&IhJaU(XX5e(2AD`V+yR4xrd*rvnnF{17i=bU!+D>rcRqeI=}8q^XpG`GLa9& z3M!}s9#krYNc2!_EU^k4Eu^%3B(g)d$6{e(0C+62MA-5LCE~9lJB0Qd=;d!BD};3M z@^^fhoUSPrFEKR^Wrqaf)qmLP1kFae=X-4K^7)15^g zj|@tRAveRB9@!$>Z@s0WdZpx(cn{F+GdjTqi;;w7i`!(S=uBtOe|ygZEd7k`P=L3Y zOt`+uSc|y|u3sDTot83e8osimwig(F!oA+PuZ`i3D={)V#2qmDLcv*M2d}x}cdOWE zCT^zlG9Y#Y) z9J@rKpe=8}Qn4V$T4tBRt-VHHJJ?%EIMRKY_!8lYuBeRzKxvq$_GPM39r_w0f7dvPG995p)QG~Ziwn(q_ecEw@e zN2fV#KWbE<7Dz2aSa^CA*+U|`-&x%0Cl=Ga+NZ_F!AR;0#dJ2s&XLfEw3R&V*xyg5iWQ6faLZ8yafEnWpgj38M=VQFW4T;o6?0+SiFECHIH( zkb4H919$x1(C`RybKLf;;ps`^CEWX8I)$_Hi&bP+YEB#VNWe=H0c}dz%XR|d0qyx1 zko~m9*c6tXM!7x_E}y2dkM9{ut?_3lwU(U`!Ssr=q5ScBG#F-`HM+Ut(*MCa ztw6iknBaBQHl`JVB!crfI$eLP)TC!*ND2WToTCsh<(woxU3aD%JW!vf^3zYw;;D`s zHX^e(FxMX%9o08&w;=O8-K5-dCL20R=K#0cQp<4u+;%o3dlG^#yf1909y zfTdpM2VfnO%ILl(r_9(4b2S#183Sbeb+}b# zB>5Ip>=T@^Zr^)A$alu@DmfV6_|8buETnyB)GG$yt0`*wDrTm`BnW%IGxo>Y_21Ll z+kS71!mIbcH%8K0XQ(0mtx+D(RW4{?*Z0PNnse_vu{!qhYJZGV(+?~AObsPXFsy|9 z3QotP(C&&c*fsyUKL)5IpPEI>)65VlSB&16d2u$xwDk3c^;eL&4Q11y0{~lgHcB|fJx&#JxQXxct^(wyi8p?h=eUJ|6bV{f`2ro zKIaYS*&AZ78EFFPmoU1#FVwhs-U%9pED3|s8`Mt0yqSU-qgt3W;2wU&y~Yo}iP>f3 z7}58;-|!q*X=XIEpEQ@4G|JrP)`l?y7P`ZoEhcvtN0!EdW_?lmD{4LWnc)7~26NjG zs{WA9s`pn8z76wk8ELrl@^R^P@SV)V=`rNhOLLoJ82`+x>Ev{N;nnoX#&l{eN)3^Xn@taUiT62C4kl|N9S6A&+E$^YBB8Elfdvdh;<?$k3->iRncjqC8ApsSNe_)l_)mZIW(<_pUEz$uwncfC^hh6dGY|?QH#=6y6QLw| zBAEL(NVj74-U!cj|1ErF+8^fn~aFfvC`Bx9FHP+nBlhb3$ z=Kh{sK7K&y#WltcwDRHxd(Yd5QN42+tajI0`~dHWzc$T=0xzy_z4iXAtGHd2l4mJd zH?mo!GP9F4<*yGEF6j{juX!VU^@40~jyT}efTG&lyx==;Zo0b|wEYbE1_`V`)`zRB zAI@sTn#HD5SxAi9PT#|@?VEi#Jx11d!Z`hRH(~}&4ACC{HWLUQzMNilZ%+uj%K>Aq zxAx^o@cfa!oX+LKxnLIKuwxNVNd9P*u%LyO2O!{ zTh@5)vG%C^NLQ&jVpM(-yItqck*NIb$-j6Q;?IpmvYzngn&5$WowYgEV)_c>p@&OR z+(@@tRG%Qn)XL79UXUBW`O7kPfc`h9VAtC8?Tj6iQ(X<0XWcYtVAoq&w;BMF!$o0Sp=n}*c zDW+}^*BPbt4}!Q3?gw|P*~<)TJVMxCKiC<>ML3-^dZPqi9>fK>+`porGL{n?3CU|Q zhd9b|QNajJeV}u&RQ$ZX_>y2Oo^jVp^OhmzU=-u4Mp5C5AJn7@xEajRtlY{FE)2ba zoY+PX(*Y?Z#>*#^!f4~LE(G5~O64`>f;CO-{p^henm|cYPS>|7xvLq*HWfQ=wUPb> z&0_6!C9tu!qIR0Suj72239WT9E#m-%>3Sa!I&wa+MaQ`+2%Ua94u^HzVTIfQ8`A=c zQfhg?20b@aaYBYST8cNKYH>lhy1Un+t2?C@w~ThSjrg>2ZLWZcw_K^sy-%>FR~>FQ zB7#p{ZauRe_SWUH@oG>#?jk;GU7sV~KK<)+{ZVCQ&1Z^}TbcxW#hBSdJ6c?yt4qJK z4=zS=qu`weoLevk;E)1zOJ&IN)~RA;Yh|o76``O3r&LHYaa#i}qW3TipKqH_)tQP? zj#FAkf-Tg(?TchGwhrTb$z<#s#&w`{JaNU68^-xDXrFSTG54F*_Jrf%+*-`Rm=Zyt z(y}dr8$<{c7)6QDB8n2hnp)J$MugLLA{0b%B;m{1C~h+L{j9wk;t*HuyW2Th6iGqX zp`jt|{ds$_>h%6Xg*p;22EUDT_GuLyE%v^7w5|6rEt*@woUrI(I63KLXd|v8_IX4j zE|y&8HKu*u-k2MU179ISr!??licXSz0$y*z4aIkUl0J-DE$N*bB3+2K{%8}f8Kv}1 zOpJgF4#qX*h$8D2XjMHtU`GeeNm_7qtW)7oQ!ZlaFpOVsTPD>Z#@$N9xN9$LBL&xC1bAF(|rWgvJA{pf&aUGa>Fr^ts zlypuQC?C_1qI1iV9+=g_o2vuYn{f>hvi+KKZONY4khCCz@rE(Yxin@8{Mwvrf^(%| z3vM#Lliz|1u%ffuuN8XH8}7HDl=w|*l&9q2^cPt3dxbg@*x&7ipQVJAojnnYQ2dc2 z{$Q7$SSgX)l50dMvGfs~Y02HemhWrDJ#qY2iPrM-EZ0z-Du#e{*2Gz4Z8#^!X^A^K zje$R!bM@5I=`$iNK%2JQWVEZ!V4$D{&PoXd{KQcC(n`P&e

U^@Q>O&Tp!iG86&V znlQAQR1mX?iq$5tv#gbhbCmKa+kCK6VYb-Tid2{l=5|~QYxl3V!gbS=F!{DwD=mfvB6V;vuq0@HW6U}I_!Vv-a`KF4-pv%>#l^*D zg8nL|O-*~1>w#-*q4cVKjY)y@$r}6RRjwH}E20CXZx+%w1R1cz#@w>SUP(w(-hm>G zEh%XArj!_J-%8A!%Iy}J{+Ny;(#+||y{Z-Ym4Z!^=@eR}11jb9{Tq3s`#Gn8UpsRB zut&?JN>Dc^5o)=OP%x$w*NiT#6$bWpUB(l3cH)j=7c)9@)0qw6*#${1hlyRdbmap% z&KV4yU$T6LC+NF!iOhM+l&&1$Cf4HJjWfv@fNedvmQ0-GQ4cOej@VNG`UK8HB}b{+ z5&HzG`^N;kiLvLUX$V8&DVe^olf60^w4nm26EIS}I2EKZ6UlTrUL@1wcnOdn6~e2% zD2{$r`F#W^i%1b-7uwYe*>XJO^`@8+k|0WSq~+SJ6~0OYm93ES?RouFF~B@7oNe}c ztJ4WF2EBExx7!Op3m=R$ay!Hp(1pW@@Ua8beIx`uRR(MyZkXf6nrsoB)Rt|1IE*2F z9*X;NZDl7Og60kGXY8E3A9tEL2j}~7^~l|`iClAN-Je^I2)fU37nQHxP^T}ZLedW4 z7GY^_fUR^}sQo5K(gvM*lU7lXXshA`F41)ZIg+C1kAZfo)hww(H4GciS`K-_ph27m za-U;TzpY**e}TDTXn8Bqj@t|WW1@+n=SA)#5$%Lj4(<-(!YJr$E(6_Q4pRj|>R`&3 zR}SWCq4--gnCtAm9~78SoLzDx5ZQ4*@E*eH6$T;?%lF?pb3^8Rg4Bo9t;u=zMeU+U3${37w z^@AQsTr=g4&qDC)r(kXpe&zZZDzHOA((}IZo%JiRWW7{wPrn6Jb?nj$f-#M*?e& zPcLQB5*O+pZ;1=l_ie5<9SWSr1K#HD7=O{k= zzRNZD-ap+YE07&K-MfFb2Zq1P^_O8%(4u#_1{B@Oq3H8vUa&SYy9V5S+|~(v-{VL| ztaskyhT@PPc#k88V1L0_>TA)@@yUC*JB@>o5nL@gHV-gDeY{1UZDBJXbyQ6Um5}^N4&ZaIQv#TF;9D|=d zeh_zHFn$bI8xtNcA45NA*))c8A$rB#$ppX*k zZw`i|#T^%{$Gf;9t#Q|@x#Nocg2H0p~XJ^gd2m!Zs8Te9rDZVM}r`8V?bmBr4%e335;A*s!nC+n)aZxQ^#?0 zolq>p!0FmqExaJM=V}c!8PCiTH-V%6{S&w_G+3;H)D5ZL zY9%YiLf6c|*x`sXqw%aGSDU7bH$lny2i}!U7OCI9*2hvh5$6sL?9xwBsQn6#eu^|% z240giX2Oy9;5OO4$N$PO z-mW^5?Qip8Il{{TDBIDI?B5Mqp9ahbDE&rNvzEevJu$733qnJvi>HImfpr|gVv+hX zM>c0#qfP-XdqBHT<^gfq#=)>tt9OFCrRcVia_K<`=o;Twy5n9Ojl7Pm1IF>gX^lYNXLSOW zOICIFlauShrE^+CKq^NKGgqcwAnB^(&!>f2GgW7PofU@pshQc6eZ*S{khyZ6KUTq9 z%%RDt^O7=KD@jsnVjzeYxLB{a=O*0NXU?-F+>SqDCTW(-1$34WZ-#kqW+s%9Ioo68iMw_(Wq zIiAorjjMs@`6UggllAzh@anWe0)@PyRu=v9%uF!r$7ozmNl!hwT zUNB@1ZuZfueh%l4D-X?vi^h1sojJHnFgVLxj>Ug*bGd2w@AzDwX#tqJPqQrIh_o%sOh@h@q}5~TqEp8B$PQ`@_?h{4UF!Z zjXKF?;0IhJj!9?0o0s7e;F`$N{b4O|qY)e%Ls=Fk8E=}yg)*mMKn`l=FTA_FW)za?d{0x1%yx$^Nn*f1%Xpz~*9pQ)kR? z>MZ3q?SQ|CrhMcQE)?^dwy08_v!qfcuc4xR{Ss`{J5am?)t9Iw&+Pw3ASjn|otVDR zb14@R@S$Es+JPP~t?4)+Ke(1wAc=`viSA41+T&RaoL?L`i-eJL{Ti_4JbFN5pLxYz0ZU6_6k zKL+v3xkgxQ#&Tp16Cir8qi2vc^QpaGTAD={waz*WQyAdx2alI?BY87`@KI35w+Ab6=6+Zs*{IL*} zPwAuo!*oG*s0iXmO|dcYvhNlUCZ3cx#m2-X(ICFt6w1WQd=`qLfgD8xrmg9@qQTmo zKt+SKJE^KU$;T81A?k&G3VI^}B*8#GVxgaG`A#AjGi1>&qSn-vi7DJ z_XQSNLkEXe4vr{r%(Xz0+S~#km3)E1WIV*RG(96`B;PyS6bv3FGOL+mTua!xL8P^| z=aevv`z2l!#vB=Id4D5eIv8*IGi+)SnIkoKkHMsBfub8VSpaQigZfang1YROeYn1EF$#_*>5C3_$6g1B!GnWsa{LY!WUzu`V`JY18l z2W7W{yxp@b(iCY6GDm0owm1ymf^;rRW?%L3j3_ z;q3(&m|!CMn!gch{}a~!3xn;a*DHW+fpkG+vwwjU{C5!?rE4k&OVTxwgJHZPQwu{} z7OJcwc12NG6tVvmqVS=+c5-KzSHRrK<=h2=xk>INL=t9C8tTIOAd@@Z3h8Xn!KEOR z8t>nJE5{cW;)$moBa(l`g+PyvCOk{~3s;kX zanUd63780O_fg2sgwz`5T2_&`^jam6IPAR_lZI97UrEC@v%cuBrea;F=!s%7ipMt5 z66NB?a;3%&zg=v|TN^?iqJqLM3YW{@cvci9eseD(0;|}+6oK`RM8CO~k2qU9Cq6>I zA|6&fqMipR0tZ0BWAs%T1p|NO+9OV`{FR%6Q3w4E88_>pp}g^LTz7=rl;6<4lL(%_ z6Uo<-`a2gu(6-3O><`h&PyC_e2~~Q;{z0v#RL+$>~9|zB4=A> zyO=u4UQW#a7emmC!oGT|UHwnwKk1tKOjGb*2L5Ow=8NE9su5ZD zqp2}bhRg~!wI)cfzh(-7E5TIkt`TDT_l5hWs7bKP+F$ETuh21vbUfk+X_2N6 zZ4mDnW!gj_{%}LnFO2L^&FtSy>DalrMkW$lTY~t_8%=KT^f#&KM+<( zW&8i4%|BAPzA(sdt^)GnwH@Rus#B0*QIMBpW(4_Ht&(y@1vg5{|3&u&P*uf^5%Fy1 zbPDj|wT;x42d|(48Ufp`=+;5E4kn`2uA=P@!CR>4_JWfgOu?dL?+@-BO@0L68+0_a zB>?|kM-vg{zwAh{{ilv5nS>{u=>x|_{#NyL zbZ-+e!&X#J>xO$MA@}kyFK|pi!CL~?|E}_93|TLVs@ZQ=kmEL0mg6evO#YW?jn(~s zWHO8!T7k-z%2c*6Z{aQxVUk@}9EOf5a+ZO@uBUMK7@Oh*?QTt0!HBm_uJ}Uq`ZOJ^ zI3A#qD>O-9wj`8P2f)|IPJyVLVMDoCT=L5nSf>bXcRc(Egi?0T9eCZ$yO=)e{Km> zK)(-BWT%>GUs(L1X-oyYmCS)n#uD+>5Vs@@l{^JgbGk#^o<``M5|5rScek}uL-| zbU|osj-FwvEXe*79vd&QZ7`cSYy8(DNIWq9?<|5A^uQQt(-{0cE?WNyEB=KccKOl@ z%f48;cm`ts9u>{sMeu8qLin2K(m||&vd?6qTO7TY02OV4XZ~ewaX0fS5L@@Tou64& zd~S-A1YDgVT33%DroW^qXa+18fk~=HU++%rf+*b*Q=wg~r4QX#8OX!AM$uQ!D2lbW zjG|cEh(pJ|M3~H3#oAyf=1h+N9)`f?Ds-~7xyUuf?K4H&AgF6L)wU^ygJG1})UJYX z`+sZ-tScwyBcAZ48z|~gq1Jh|RjBoaU8_xXQ8Y!#wktGVgH%t1ch{hJI|=lo(2?!R z8q-9)HFz!65+7PCYKiaWn>rGKHg-ML65m>HYDq5Z7h2`pe_BiYsL<4mxoV02!gPee za~4lG;4TLh92-r&@L#)==y!}K-bhum@-I#3pjimaAEi|e?bHX&BWE-&ck@=u z*{zQtc{;XT4tmW~FIYX@V>oSnO@YxL-C>>9*RmH9ucr(pQ(}p1OC{D z{w!8_-(MNt_g8}VysS1=Jv|PX!tn6vi+Fk{{?gOK=At4VpjWUSl8Xw4|Di|0<*bM3 z^PooeWIe<^LjCW~1NLsAS4c1(y7D5$FvJtGgacHeO#MR!zlILWZih@9DmykDqRI|5 z9fm>vfF4XUNfU-M`di)g{{KY$))(yv1Y@L&ms~=}k)$pg zhl=QF7;1W_MkCky zuQ0u8IlIYRSkY;NXq?es!y8hsA^QKj`sg*a;vKYhW~_H4!h3z|5_|}RBEyr zuzPJpf$ElNNhQ~fF!*3kD#hPGXm;BaMtt@}PmX?G<~FeLwn-y;ax{bAZ=2r4(dl=G z0y4UDM8eN^sCE}!I$|v$9)XxaV@qo@9ffnz3C`aQ1^zaCTVZWFp*Xe&+ zfcLwPZXRo((|yU!!}Gzv$j!qSE}u=;uc`g+v2On8W93R-{gu}Tpx4I?%Z}eoNj5(5a_JTRm8kWi8w2$^Dx1>d{nQ^pyteNR3U-^EFlu)B z@P!!Y^zU@4|GT*KzmobdaMn?sUxo1EwTc$*m1O?=8na!c69%2N=*IqU!#nEBkaM7! z(jWHM!dT}IYnpfAD%s*;CZ2!j;~fAiJh#&L31#Oht3>pcLr>yHxp%(=m$tR!pD{;dNX=R{uh(} z;{5fCas(LFz-;qBhFs}_3bR3BW_JQf5#eSXswjGdo8Q4{{w4W034$WbDLAI2Z z4t7SEqtPZ_9${XjPGqH|k}61wHv5rho~WQOJ6m=~nzb^;7mVHw9ncK1<}uJM+U$z8 zV3Lf+<}S|EsZ3Wxa{$&vn=_e2OPd(;4h9#^lSbxLTr^V~n|mqNkm4BDCEA=)qXykm z*Vi?`eRU!_k+q94XILIIF|T5nN3b;3oQid8#k#2n7}otYjBZBjW}2JZ%g}A>m6r51 zFY=l4auAwP{d7TJ;SoEFEg>uDl($G-Y))7hBr5kNS9a;bk-7xacEa1D*y6cg; zU$LZgH&1qAj=&%Bl$pBhB^j7-31|hdwnltQd}6rc0y60BU>NCm$JX~41}r2yDMN!c^xlExqYC&Z24{Y@B{OE*si=bzFtuN zftf6&BzZ?)RMcZcf{3eLFlsbnW!%cxdKkWN{b;kR`@QQ*8da%2206HM9rlk#5c&z& z>7Bd`uMI)_3uF&orUlKtB@MBzTV9U7auVdTJOV$kVGOAYistn7fO})ipD_Im>zmbM zNJPM-3voWM;6YC(!{x?NOikF5Z1!+FGf%;~v5)o#VGON)a6Z`_&Wtg%Z(ffHP%gL- zh}lgBKvcHM2ag0`Ot_*GM?9U_-43Y5NvYxQ0|l-3TPvIUp;VdHR@s^lNoC6l&oW+a z7*$9oW4B%uYcw43qoKOk7WJ44&3ToakF5 z50(>@56o-`8QpjnH!%c0Cd)v7Ed}PknHE?fSB8q@%1D~AqN%f(4wewNXkTssq`a{r zO1*~4R8AymM$9;KBXVdt-gjCpXEDPY37(XJw=ru*!ILFkm}x}B7jj>JeZ2?Vtv_!V zyg8nBx%|!Sa?-)OEA#8vI#`&LO{U15Uir1*=qhs;GMW?3B)r9t(EMk@Ta;hQ!B8VB zkC5;dCGTW+Rj;;-d^D8Sok=3nGQK$;5S^FrgD<9Vw1I_n@=02ck~;b0;m)V#^D?;u z44L$%CzMV$lgL^H?|J)xe2O^^0XSibd8*SSy#i@n)N!>3+?Zk>iD>f1R78{MuzIRF z9r2-AiWyz!zkr}==IQt_ZyG*40KZJ54^yWj4kN5C`iwsGnTZeAz=)aj;lr8cbByAV z3_qX&{Wko-PqWPLAg=SZPG_zLmwH#ls35C}&rF>DE zc^tN&#T@fS2J!XwT=R4+jk%Z>AqWI4F*kq>>1Hj)y8JfXoPpdzik_u`yGxK;>{w(D zvSiIOk7bz0;JkpA^@E~pEPE#l%N|*PWxs*a1?I(AHbB(8Vnjw;*^LmoC{=~`ASGJnY^3dn0ZV1k!KQ5Yi{hgMMmP|Kl<4VR;JE(ui?tlF!|&pAXe5G@=mx{!A$*ypF2a1-hoOO zl4mZ%+57^NKN@x}Jb|IoIGpCyTn2)D8R&7glU4c`E8yZT^I?=b%Ac0#vR^GCHttiq z5lerDWHZt#5j4D+=xbWC?_(XQ`R2!XGiK=giwq`sJ)c&` zX&2Q)k}!a>EGH5N(3jq_g#pwL|HdCDXSJdLo{;=@Pe|?uBnsdLF$y5PWefI0qX6!v z-UojY1u(`P{?JfXMdI-+`UCX8(0Du;`;P$DpM*WqZ!pt%4-}&oY!ESu#yfJ|Xx?sD zW@=lWst3_!Ig0Fnl2%CmypsluD7QY%SFfcj6DUN@ z{mLAVi|Hahl%p#=rkI^K1`|(jHXnQ5_!zXI^>9FUE^6cmlfU_04WDm8iOn`jsn>P$ zWs9p0Q|8sYi%5FrPHr8iZ|uXA?F9P1CSQ8XHcVxEb6>t;BGDNkVwW^LBsAj?>jjBT z^$*s}y}x_S;AkvhZd6$_MI?CUnQz44nP(~t2hdgHqoDU}<3Xcm?t9tR4GouRvV$8< zsw7@hwGLfEt4hpUtG9%HAxo$wynfu=7biciBX8Jx9F-qy;qGxNu77yK{G)yGj6G?- z^H+;9^PwMzVbjn<3 zC{@*U1n>1_2{KlX02e-?3e_K7e;(BfB&ruwp!#h`F~%&tSDEU$FC*2}#wx2sytc2B zQ+KEkPGMuYM3Cinf-pabf%WLE%JfKoDe1AQ3O&T@=hLGU0}YZG#HFGUl*S;=66ry2 zRi;OA(Mu+MP!#>#PLJfm+-Kr0KD=+A9>f;(zaNtM-$odtX&-CXt_*Gn(4dF5dz(K&p#Jasr-}9@KjkzW!0V53j*I2Y4TDpnHQyr+F+k8Nk1Nc zX7O|kvrm?ndhxt4VOH7+Q|88t>LD^!X1nt{r0pfFeC4FHza)XN#qj)&nmdqNgC{%9 zb{c*Kviyr0KGM3YDPOnN6GFB8SlrO$X!+gN?Pm5{KZ*x?pWSc9?=S8NV`kwIusH(i zh@w30Bl1!&Uv}mRl0)@R_LdaRR@ldZ!kKtY;LK9y$43woLtets)=o#x%F#RS^#Gnk z6_=yb#dOCFb~fUpWXu7}ohH1OjQQH))C^n2 ztg*PY;N>!An?>7-SICG~(FK@$Zr-4I;G%@)ZFnyn<3h!+KJa^LccNDt(}u62SIawx zvChA5!W!J-UFttZK zNQcMm`FHTOB$g-XAu!0r;P*UW#mLT~5VzrH72a|-Fky1^myVmB)eDMuPjxgDZx3gj zl{D;}razQ*%oz^FIUW39(<>Ay*nM+o8j$20`)%>FnU3>l{A@3SuOCs~C9rZ)|7(x9 zjo6a(#$3zK~jA~C^_cH$$#mSaC-Wn`vp#cc>VPQb8_=r59Pq?rC9dPfZM zReFD(-h)Qzz-uWL3Zl6diVn{4AQ@E(W2ObWiUB#K$YJb9cwp%x7(Mcok3YSYz&jcnYDmV^FJZDY#;^i^_*jV=RJAA)mG+NjZEoVnIgy{S=3k?~2 z!Wmy{5S`z<^8T1#O3vyH+Qng*6`}OuJVg`F5w#StvIwN$3s62aeX75QXepLiW5Q#_ zwLt&ldOy&l9S(zwukmCV)P~eY^BTIRnUwV%9AX{h_??+1(8|}vK;r8;=4mFo7#VVd`)6#3|mCHd%_AXty@V6F9l9gRxlOWkQJ>O+Yv zJ<3@$mN;m}g02UTRxnHZ9z32cLL~d=Q}9?#l-f8x7TZ=9Ki^lbL%VR{#hk!kKkRPa zZZTVqFaBP#+Yy1a83od`-Duq1PlCH7H{Xs?2;=x}_&c-So){Rj;IIoE-Fc1}KJuc| zo@f6fS#F3<`hPzz@ z9bw4aE^g3Xysv?zoSI%RbO^HAM9YyOJUaQtTbQA|p24JTwcp~8;N{P6@i$~R(Ju|> z8At3)=?MM=342s_%q`f}m!O0-jDP7!o}6g$6Je%W`3;>}>VINQZzzEq7PX}ysB)sk zSxh!mA-SQ-YFEX8`zk%ST6#Le{IvcxYKlqE8O+?}z>=ZcTxQuYigzSk-1I)*oWX>2 z;rAiwPLJU`W2TmnWWEz#4NvBWGFM=KGG7Z5j@?W~k$x7qeaH`YJV3Gt z>G!qrG(>(J#dy+$s2}p7)_5uhKjcXa*D#R|IK+P)qsm#dv0CX6ZYye|1Gw$FM^iBj z8q2p-i2Z?;WBD=I#2O#*wQ7AS)2rBqVnIp@CsG!(_(W6dtxPiudVj=|gOV#g;;*3z zedfn}Q>GNQe#{SHRzT1vc(nq0f5O*gOfc~i{tY_c&p5Cf7icjp*2Pcgd}qe-(tJPU zi1Yor0d(W|Mvj;&s#W&-R{k(%9Ir+URG>Uc@GSZu#MPPomgc)bhm<(zIgt;t z&Rp%D3b~AXV|({tMz%x}U%bC7Y@5g{-yg>Al~VP%Rc{3MRj4t6-DfXs8^dSj@_w-h zMj(rs#JARpqpD!PW-x2C(t$l-U`|J&bI;;Q{0Qcp<>@3oQsy`sGgg82#_OJz4paCC zGGtVT4P|?LiJX|q560IDQu&5*#$+j-!5>DaeapI;d=~~^D}lV80Y0Fa%_lL7Eg#P2 zy%{o-k3)R#H#{LXjrXt;$L&OguJne|G@fKoKPmMHa~@S^LZ7NoM}jR;k(4k=47)aX z4o@?vPng5Ewod6SbNIG6if0|5M2|TuYR={L*!FW`+s7PuO$B}C@(pnGr;>lOK$y!% z;lDF;De8r$)A=$YohQi$OQ9&^fj8u*^Dc@$IL2iT5dXNFN2~+;Xj6%lTVw54)?e4~ z7i-V5;mm#~_JH^%sPF<(vp=ljoKVzc%Ug!QkpWC|*fo#;N>Ok%1~Ya*VZR^iI?Fne zBXnfmC5`i>Ns;0m9f^-s>e@kMzfk_YvNQBv!1t|QDSZb29U@iv1D>Yyp(4H{L{kwz z4Pp*{W;<%69X5-I!_-!ZM~&i3d3&Zm{fT#d;B*d=Uf^L4F8AdSyoC3sIr~T^K<)Iy zo)9%UpX`Np9yuBa1%0r^aDt9PR2AK^?Nd7pVsy znNKafqofmT$x#%3Hs`;sKzB2p%Y8_yJ#Ql9-kV31v@Z?8qG7;N z-Va+`Ekb2iCKL=@CQ3Thpb`vR&VPeyEZqv^Xc(k@1>eK3*-r1kgx_GCt3VN>O6EPR-n8fXMG(61=;}7_C|T z{vt0Db=9>p;~KW2{|LyHtQh_gas2f>-7*u-~1j_MD|w}Sn^6FPfhDkggx#yB%7X!?UT@s1B=;@J!) zY2x{9IQe4Q87RJ#ES(&x7V$+d!_ahjldpP0@P)}WaaRd37ci%&xKoFo7beqWTvFn& zq}6lvCl8fd=xCBG=#mUyaE5t0HOrlb43wQGgU?p{c zBrV(b$*75DzRw6%NOo8KZ&PZ)&XNpO;~y9nM~P)Rx#7!1{*kjH1c~NY>m;(*gc}>$ zgdvx(3D$%;E3gS4L2CRp+ZJD%1om>MG@<2+)Q;@tfy>dGngDKfRT}dQ~mAiGDLwu}QS94t(=k7;_1df5`Cl zr?(PV->OA$i%*+5NQIx0cKAgG{M15te;sNS=&b~+2yO3PhS)td6{6V;{2&y_9(zOF z#mO2aP3fsQ0i_S{%j6kqm87g!_8N>5fubK~C=^Dq#pSt^!x}%7u{v8b#UY|OK3V!w z0;{(@l*sjqSd%N&7O=mFRXugi43jOE!JUU0KK}Gx0vlSjB&t(r@7q4YHb^>^K?QtR z2 zrskqHE>;$e9C|lZff1FAsQ4l(*(*r6SXn6kT1V{|-czVwhf8Dex z(nO^hQKS{ndqk0zPQOMJX`-6V0cNI8^?>HBU&9wDX2ipeFEEd9WeEaqeZjXz z9uT$x_Xct36k3*ZL=X8J(4G>HWN8fgQ=dKKTwUUt+0?lS=``X?9JJra#}h4%_U`mR zSih0?CKt#7b#8LDDSZpwr`e{M%zSEH@c$BVa4c3G3+2Yi9?<$rx{YoItb67sunJ&j;uU`q3gh$YIGwb4<}m`W!EzrZ%aeNvp!Le}fzsRg&aSz5qrS|c77`FkEzfBP zJ09ngJ%9VnS%Yl8*_lOIJ~Gj49}KyhP*Ep2QkI{~CytbvhpzgHw-O*`3)N&MPu%P) z$8m)6U-O&NEX@qcW-0r#h>EEAdOp!SYj2svm0Y60fPerT)y#3X7Dqi#)+}{UoZ|6TjbIhX8C3`WKG_%xFV?Q4#b6m=>o}eAA@PZBp`NsJ2_=Bhz=?}WSr@dj|slh5|dWHd8 zMPs7_MW>y zUddJGPiD6nXE!0&|6u2EY=)RrJ?|R-+{~#61({!Dg<4Ud@FP^FZ-CSTb8IM}zc+=5 zRgyckp~NqYY3wXxKhF{~oR(at6+e?aHRrTwCdoNXv5S~VWLKRbZqj@o1-+L5NwKaT zuv59t%{2pG60s}&w1i#L1VY%-b9`Urh5O>cnZfr&ed711Hi*l<$wx!!96^l-R6Hs3 zAzQoX3(ux$r(3(+D|BmD{5#)Oy|D6*MY^_c?FQeXc*-=s$=+7!NC-^4F+Z25o)0 zt39$-3LRzp4rKixe9OdJ)-Xat)Sbh5nb4OiPaGk>37*dDDi^}sf7tBIelBBAqy!T= z4^rhqxKqJxFU?y}C>H`;HXoK#VNQX9Eh!X8&cLE-S!PS%?99?bpPHd4-m-~}d|*sw zuoKjB6b7NEN~)v4(oYmH?9a=C=qHLDg{Cg|7U;y#h;vIo<0Le5{GtYWy+p|$1o}9O zN)87tV4{Zkhci-t?$IdGnFK1DXz=jtd3}H2zzWAai zl&A!Brcnt#vbhYHRYHjJ$gU8!mZmQpRtZt$=I?mZCH+7M>r9LIibYyDi$&s{g~+f8 ztYlBLwNZvGv#R^8tz}4i7-NnOLVlX%f`%zkjYbadUUC-vnThb&SqO0&Pc>-eGp2fi zKl6thv{ehP%GAp;LTiXu3v??oN-fkyIxkWS+mO!jE|ks_T!f*_Nx0x5^u=e5U4;yM zw%b)`j$`n|RWRX|(M@QAS7+UX-FUUqU1+TMiX8TA08?B9+&;MrTTt5<2D$D+Jr{Bs zbE?h>Ka68oLm17Rfu0(HrdB65S&gVNkh16C2~9&;Y#8GQDc6#eeW}6#Q>;gcnuKba zavD-ePf8OnnHVb>a)Pu-cGP~xYK4|H$nrS2!I3SJQ7e|A^b?ZCFSWivft$WpXFAN3S$rYFet5Gp8fn^tH%6yqbbtH!=i+nZHvdox>6Nv(rzz7%|f zw!NLF&{83`9j1B;EgXMvWm`hLMyP8wi@CP4*VP-`y#!+AZEdR(H+5*%O5btJfjzS} z6zxFNNX>5L$#1&lb7tGvYe-<**oxX)Gg>FMCeO>>nldk87y?#jZ=p2>tRg(MjF$gp z-hzLH)8~%l^!YAtArgS1aML%=$Whxt8yVO@|g5Dm|+!2-)X zgr31d816`mq3n;gr~nEU)M$JwA;vc^C<_6uy)4~VH&2K$ZJ>^ zx3fz_1Y+s6ga}udE0*OtVFV-lMFBC}hy&iX6b(ey66T>kVM{HcHJU3P)j~x?Hu%;S z67lB8wS~qo_3JL)u)Q{JUCzV)+QPdExr1Jb$Mctm3PG@A)2B)q=1mzGDzv}?5QoZz<3w<+C$y72nMq343%u;eYQ!NG6FuP;pSqT@p14QKs3&}YYx`+Ep)vNB z$?5G4UF!=?k>x;2eIbeb|GvJ^-j&Qivz-0uxB`vt4I2oxBga`4!7f&)Ripev|3dXL zG{RH&lilRkwgpfgC4|H327-q99JVx|eJ~Vt@qt?ngtzef@nJ$Eb(~cd;R;V13XNb# zm_Qt!{6T;A6%S%(AB|1y5iXE~cY&ZEqxOJx;X(vn1&LR8!-ZgcrA7n}XCH`;5MH4i z>t`8T_9In(KuUxV;dIXEO_*W?GR6B>6qG3{(Zef#eP<6bFvRT$!57)95`DawvTGg? z94Um;n(o-HNv16sWCz< zY1-E@LOA(wGR57ozkOB10P6K{F7 ziJ&DyO`oR1Xj$noD0t&Spu36{!LRff6|3(y6@uLl;cqs5MI8c9#m6ANd*2|9ifv9| ziN2S>Hiv*#LKKXPMR*~v6IP>h)hRTaFn$b9s8O&vRtQmGXd5Nl3U+R9?g{r|u~BhQ ztCf?%howbp;XTaEYgyG+2t^Mk*w#JK=5$Gdn!yN<$p_@dBJ z=;1h&z2qQ@c-l@v4&GheN$7wSywge0qYI9M8^&OY*1|5wx!f{zU4Fd=26M zgk|Gvf>!33=g8hRBz@8Vr}2gELJ*y1cOZ2h3R^XM2*ZMUv3IL_tmqtdvRIiTv9FRa zm~Q12JUV*AjvfN>3i;Vy>aQ7~ioI8%js(0C@e)03>@2WtPl0-c^y?|SN*VI0GD}`h z;S}Sz(w}_c3LOokzv~E*6=AB7hieS;_tmn?b;BnJ%WwjA=p*2Pk$4!|S17^B(&P=ChZ|wj z8^YIC3b@T->~ckKSlN$`%v{FS z9J@ezS906Km6$>6(qW_`HUr}Cp^M1CeuAgM0YzGA&>(t%ptL&7wHZJgywLv5>NI#! zr3Npu7q&Ne>j1IArv})j5`?@dbYy10us4O}D2U1uaXVpcQ(U6GO#>5Yo0i!7R-HC2 zt<Etui0Q> zfaBLrtbvl$!VgA?2XAi}A}mDo>Xd}A69)xJWDdcxBq5&45|16(Q`D=Y;ZQ_{bve*& zD3xe9L*e%!2nI)o3U8uZ5dId*O=K>b(Y)Vkpa-mdOBjcO4{t~s9E7j6cv}eXEN%v` zF(_%^ZV>l+1!9B3pAo{g#7$nkVM1-P$?G-@Vf^C0nrsuiId&Mzwx2-WFkvnVkMSc(v)T_A zS|Vf@K+$k?4qVYJua>KdEfgC=810VXLQ^El{o%rWig+7<87N>j$#(?-m(sd-g;(%t z`MX2{wYa}0^d^3Cn<3Rd)zdP51mRv7oqVLw1OJ^HNyXHMBZY=2++u)}*goFSZj|7R zVseoo>BkVp8$bOG{WQwSXzSJ0@J6P;OS~f}K@^2Z4KZ=6$ z%~3)Ul6()8{Xh1;1gwhc{ok3p!DSI-M}&*Jhyt2gn##E54ylz^D($0!rqB0`9p&noGG+rk30PJ!j@Fa5b@Si~asSkI#cMcg~qJ=e+NG z-t#V>cYA9e9g5x>R&Me5mNt?jQu;&M+onhiwB4%AGrESVLz~+i`WV1%vp2TUrjtP1 zE;n%$Xxo)`5c`fPg32|FbQ$pup6cRY-8-fboWPxs+Pl!#a`7EJBjDXWBd9J^D&Lhx zm?V}hJPyM~nkJBgf%hJFj0+lx3%;)wBxZFcp>oEGQS}%SD1^}^0a_COjQCOI#V);J z$9tydtKGWdDI}3$b=fvh)}QqX)Yjn6oQQGrB>}cx#sU z;7dxqTeHLkpY$~h{@Bz#WPdHrMdl@Wjq%N{RML|Z#fJ9B17KrDA8+{KV?5wt7S&kP z1@Y837R?Tb2(%}_4--&yL(}IV=tIaSCX$8yU-W7HBc@1$Y14h1B75j(R&k!l*Y{(# zr&dX5GMTOpbuTXo^m9Fq%i5ynTx+gya)G&~VGdk2fR;)a94@=Hv1CseAJ z7yv`_GPDq#xvxHW{fNO2{AvS$&YZLR?9a@c-JRwRV~wV2#~V$pOouQ$t9p$7 zPZ1&RHS$c#v0wI?MBf*kN!j%!&!ki6*Pok7^n!WGmPL*PQ&fi_^;0U(qjFs>ey)RR z(8}XZYS86lG2LprU5A(~jNvOwcYDJ4+|%`l`qZgmJ&3#VoEJ1PnO;JrdA7+^|MApG zVZ;~Z!nwZ@E}sGP3LXVU1{!o;Ygvx1q`2rgl}&NEU@|3Qba?qI2F52no6*21o(7jC zw($x8i8m!PS1d6(rh}|1>qrbFoEe*ld>a4ULNsb1I&bUogDk&@Xou2Gl{B22*Yn_; zYifs2#O0bkr%FBp*}D;wQlDo!j}Dh>dFXg}5^|SQXUxInrf+d)%3489;yzNBi3f}y!22sxsN0t(LR+)F4Q||*r=jgv=o3T)$FCHtpc|AnY=wu8 zuh6~oWcn&<6Z9|^iTZlL1$jY8F%7;Trj?Q?;J>6ZF+(+ z!rIlQrn)bLU{sg~!=)?7sZT2Zu+CSFClY^1yx1T>A3&FZV)4eVQQong;c_O0(s#^R zV{>M1Tw|)OOG9TS>8*T??BTkx#`znR?h5 zxoDHAxB9Avdjt|*9)>Uzn@t2)zsF`%B)TjVw;#fG-29h!;{S>QRv3&Jp_5x=imJH_NGJB55*t(_ticZ$V_opy?q z2gy#c(jQVI7j=c`!V$rc>#whuKJQ5nI9r4c!5nD16P<1G@bXU6hbYpH?nK#vvLd_H zl29*s8?bq&Rgky(Na#2nM^U-aN~@NM+Um0ZL!#Dk6s21>iwxj2wx-TR&5~ON^a@fg zpau=rn;`~CEw+NqyG$+F!ZmPh7g~gPXjhCj|9BW)Z2B*;$?^cAjg;TC2?>>i9e$$%MqOa=@a*P`38d~!`+ zOW_{V)5HrCvfo7TPz;c?KA?`5jti%+AR87w8%}bVeBh(~7_LIPo2lkZ(`0W*-hNY9 zqvT^MuNSQXouQizE;<$2G|;;2M?F?w7z`sGy`W&zGwOx9Al$e5CTive!nmRAY4_xm_V zMXu2>^<;R;ZKr1QZrPe;+^F1)ToZd1^f_kQgVv|;35^1vcA2R$yDS)@M%VWD!uiv3>(Ir7*#6j34SDV5;G*19=&l$D z*-yQLIT5Fno@&ybwAjkRZux<6dMkNVDiRbG+$i|sN)nGrBe)CR6!YD zZsO>;{A|6gFUQ{YU)Ex872Tc+a3hnHVU&CH+M~H+k1~7F9uv)tHKbczB)n%-b&#mV2=>HLwyQ?9+MW7m+Wci`UbTJf#}Jcq9R2# zn8x`3B;R&S1pb{j1x8*p4Z<|Xofl19fGwrh-WK!KilMk8yeGx()fU=U3T46i_~ZxB>epc`o*#JqVb0LF#S(m?djrUpR;TlCy?hJ#Wsj0AXw z@Rz(Tsf@`}n=yf|bjv~^HUj4SjN)j`ak;igxHOXu^BB(R}nI0pQF!;PbwYV3q6YOH)+Ej1P%y^dV7_v*d2Y}*qKTecoI z|2l4)zF<^-kh=c|-$k86m@v5Ub&{t=x`pmS=5m^fU(Tq~R`D&FgtQ;|$>`KcWcZfI za9VT)Rk-uMu%6*b=v6q&2h#)T;c21n4vK4kc$MWzC?U~AF>%?qI%i}JM{CSjRbQou z6*jf0zEIBcG_dh^mhZ$CY=I6ceh7|kp^9%qN9QJw?!1bQE?(_0ItPWcKY*H!PO)WF zb98sgpszGKZ;d><2#q|tcQpJ445(|SDMN3@c$wx6mRC9vw zWQM3T!8_gM2|ne{b6O%4f7}DjJoqH{GlkaK9dCg(9(-qJ7TomUNvNBaYix|^8i5!E z(Vmnl=6TX7E%oG=U=h3zYw|5{n)sUh7>pNEvXKL=G>73rs@7~i#bbzn>yuCz=Ed7= zE?O+Um0Hx#7liFc^f23tcfnJV5=x9c+}nSxk;CV#1RpK)itXi&rz90U>uIU(A0;23|IVRAAW;+z9*&zkFLo#g1)}I3!RNNAlBsH zY(m513_4s=SFb0zN2|QL>UVoRWcx{^8>^TwC%Zu6A2nFV*>WhsfgrTsvD+ z8?)PtH`Z@|T={m4L{iD;ToR}ZYyJ2~ya_QZxW;ljS%V9K8EOx4#dZDQRc}53n)>q= zoSqZ@{AKkwI<6x$_u-rC^J!ocetjJH1oAK8#ElB%dm)c(Qo^DX%0njEEI&%Z=gR~6 zkr*CS==6+&$)rL~`UVnqVR+D#AifWFXAS8?9#_^-iRmNV{T#%%!FUNR3F%|5VeO_) z!TihWC%J7kAYae>sq2$-E#Whd?GB+^{o!ITPXg6;*oRS_8833^V*o-f$#Y(b!``XQ z(?GSUwfW9g4lAwAk3)ir58+8r^E)9tMrXp8A^hjeQRq>JAC4i&YwGaxQJ?7_$`eEH z!ce}uCs~n`ESL7BY=r$ely9TkI4KMjnEenP#)sCsc929tkfe_9l#%!a8?@mxtQ-Sg zX_d9aFn%?v4-p2w1KI7~Fz}b~-Oq;e`%vMEsmnJacQB@Z~S)QRCkVq1EqybOV#-|(b zUFgJ14EIe5qJ`pF)zpA*uEZK2X~5UfE&oAJraiqO?u{5w8Pbps!j`QYDlJ#oTTX3= zE#-LUuNz`Z67Njx=Et#VNR{*-4JSuZqEWsA!#kU){q!1)qoji21$d+p--^1GrQk{iX(LyG7c&A-YVwg}P4=?uWjE%>(hf~*#NdrW;i)`A~_ zTWPq5V#S zaEf+WIRKbPc%Klm#)`Siy83hEr_kON{RrQMuJyG%82t$U0uKD>BRmN@nhOo{f z<`E+}P(DS8FV=7ww4H&)lg#wflrV5IG8md=RoiKe=UZPqpTvs!S^Bre;o?9SLgJ_h zUnpwB8*nksx8XkueUdZU-z75vZYs!w%jjlG7QrJ+9<*YtlOClqE!*C#I*j+ZLmvaU z&+UzEj0ephlV#cykMUjTMuEYD+%y$#BDhg3#_0by{b2cH{A%^lTHF%guAuBrZp$OS z9BgmP-$3#6Z97@~=pN@UP}(%f#OK+b{~G1c_Vx~PsA&g2Qys?%7;<>7vmcaoKvnuM zeA?00!{bmhmS0YVel7#~VMepcC%x zc`&mx?o=4v*O`i9&o2BRyn3w*y^3#u*n}Bf_=(6Tb-GeP{AyREgl(YZ4%gu3?;^*x zXJB1dIw-Oy_(`UB>lNE`M zs&<_{#_h0v!wzK_*5s9Y2!x_a-%w<4eD`nIDK~NahMh2|r~Ml;dh$nb>EG|gC!^53 z+KVUff#JP*64p7qH67RH&tvj8$Yl_ZK}7@3zf$Q~3)c@fca#^u$6=?dp!nk@U763|{dm3$Vv`OY zyCee5lG)?yqggT&FX+BzWVr9p2tra+;~zia>t*$Rpv#zMs~Y2fXE11$+QmuEDoJE4 z-`JHHDvaI%O_(>JY?DhZ5-zZKx0A8?Oerxo&x7(0e?j=JcXiDmJhhb|jYFsd*+#2S!@CoR?nm>brJ9-UIQsO#X!42sm486jCfH$*;5Q7G! ziaC#9wq3`oJl1K2qO1IP?5N*09`H06ACOawSK)y<2Cpq?1f07r+nVB1uS&zxwmE3q zN&g*>*-v7Ya^kY0U^t$agTaB8r1iWPA?4H!{5p&$iMhdtAuM{zcs?F3KAl7K<%E?v zt?`fdO+3iQTPm{o56ScSxA;CVcyLY@yA>^=a)J}Jr*m7;Nb1!eQa;KF^~=QncdF3_ zW2cwd{+A0Cn$f{+*UL9*AVK5*I5bYmX_+pH8;f=`fK%L9b`atvSK;F8p9i8FBl;2Bf6P0HKjOqczlDDjf84f(|DMhAgyfiS5p?BS zz8U%wu-@8=-~b&p26(-I*qlqSdbf$noYWcoqo^X(mmvX1yv;Yjs|NDb&8@rvuNp$$ z@Y#sjuzFEb*h(%PNgI=d*dBVk{oGvhbJO4kHWV&xw z@jjXr17W*(V(|L|eo4HM-wtMtndc4X-< z9xRsb&eX=D%2_G@Fn?5&sS8rk#Ea3~+1i4p5IvVNcV&J?oJQ*AP#_wqn`4avxhEqs zRtkE*Rser1L!V2xGc*`LxggwJxY>y*lQ!G9`Cx&Sn=7Uw{xbS*tUGmB{x?nyZxq_N zc`uX?=CPoRyiq5AHU(oM$c?*f)9kf>iIv$kDo7pA$ANq8du`N@!h^9<Q`TGgo7?<*Fj@p`{N3PMzEi`M z`J^H0@xh8Zj@Id_>bP?2ZhZdRzs2X96h7a$ks7e?x^ee`h)w(hp^)R+IP$rv5}(i9 zSc%VVGcS6lf!+;d_uv)az*hTL^d4bOdT+s6wrnc0EG# zC#R6_{eg1$UO5^`MuD%y;7NZogLnAZHsT2VHQSJ720!B;;;6Ag+$4G&2>NIpj^m1^%1iZS7w-P?0kv0vNJb&M=+*l z+1NSkpyWMgVd`-Sdy)RdNRWm;1xej{FrjYmMcJ2(!iJf z%^G-0ABXMw=Sti42ZnjeoY=Eusg19feQD+E)Q$^+vErzWuN$QBF~n*XSQV(L$Yf*g z#mg$~)#b0C?@YOM7w%>!{9EVj)&IG3Hm;2$e^)+dAr|GQ$m3X@3Z{E7! znJy1G_1qRGo}OrQ;?4X;HlEH{NO&^>BMoD;iw2XZ4q`%+?p?0yd}y}OCz>(an9tR_pDTqz_=nfyIqrXq?dy;YgXbN}Xz`^Ykf zF?*Sm3lhh&Zh;erUYl=Y@sbROZ99m?OY6Sf)v!9#spaL*Y`k5xpb~FW(O|ttnR~f8 zr)tdUn19Cs#!QfzyUEIXG53Sw;>LAwZoG;w8%sB*VFXrHtC*ai999tOjUt)^+6T?1Z zA9ljYpQ@-rBhz8NdCOa5gOorLnr2{D$P2Xa)bYH>1x z|7=Eb$may`@#31yi6isz%oH8ZGqB@+@m~}@(jK5nwl1*@FA`$H&;8l@B zdZFf6dMngecB(NG3uWyNseNZU^>ul=rR}kto-BK0YNZb3LmjFwqGvVj<7@3Krd8Bg$sB&4Thq(Uc7jQc0 z*Hrpp*i3UDzsz5wtD3R$f3YN<%UPpRCF?n(_jg_h*b;jw#|QCD%74!ZfZrZgYj}sDZVc8*PLi${1XJqCAXPMQz_pFlKUjZLh)-gb>Mj=rzLCtwbDEBlD_lW zO{aHe-msK6Hcw+Ld#~l3pl`N+q#L{wX?BsnG#n@TPM?_kjQL6MYG&532Y<7^lSb42 zMqlYaFWG77l9FO9({JP~W$&_fvFy}a5dN|`7-}*}gmz=R&|XMyg+SK(yJFKOnMq$eY9mxc}@@mQ}yO}$oe5imwqBgM>xty4vj>FeI#jHrV>38Dz_-B z7oB$MG~<+IhqpO{VUtc)YAZ9Ma!-~MKRGqd|IzZguQ~9J%w9UPD3&#!fz%*#3&@{g zwjFWhdmkE#3Z43!w>cU^J)?+lD9MMC7HbP9eYl`hs+bX?5TnOi8Y?c$wIFWkDLiomd-z(6d` z`x6#ZFh!v6#Y9%TRYerupOjd+)A};%vEM1b?9yJRmmS$-32Sc7 zyt|M%Sz1X*6pTVpV0udy5>Whx*`^HqUCP$Ir3BRpf3RyUrEMI!hMFn`amCoPp4(}hrOks~sD zg9RpC6AdYEGdeg>hiwe`KI8RJ_DmZMEDtq=WOX<&;>!U1*&#Mz;ywo`o!6P0`G1qiu zDF(#dbRJX)o@Vni2=RV``x|{Jy{d1_{kjR$3D`LE_oQgjj#P7K?XBBOQE96!BcouJ zww$C*FszS5SiHFlf-oklG*13U~`H?p4B?;o*TvV4i0LgKJ0Z)m^(6>K$`P}wR|7coQt8ODV zwvKV{GN&=-FSR`Oin)^tSLjZfd@Q?l33BJb^wu2&{a=1At)7Gj_u*!H5mi5EUSikxhoEu^OP<2e@2IohZL&!O9>O`lhI5Ixk@>!z!9K#kRk#DZ7B|6-b z#Xsrg@)W0DR!@$$Z2!PKO~qzRvO{4D3+Gxs88p|U5o3{(+3p1kOhU0_5~xk26vCQh}!qr4Vw1yki$tefNXilo_= z1LMpaShj3NC4q`V3ucsCR2XM`>eTjRs^zl@<^}Y8TT9kKi{@1AC5W}&qus0nr*3AZ zTVkh}Pu-E!s2+Lk(@GLk-YDq34}%LYM^!x=p7}Wn`P~RZ2bhmozL;fBW>vq|;*1Fi z5R-}^8Qzdto|0n zRCDeBQDAStTBr-}F0j9uS`C4{(cZ_M1@?p~ez%_ko_Jxm@nipc@zuc+eX!*LgD9qcL?RX@n3HIfcY+oax>7(Ma z>=vx9b`YygM=iyTI}TFay&@rHHZsk7W~#JTJez(DN>-Qy7y%4AF_1;{)AFBBA$I#p zvsSxIuJ#h&Z$|`Ug3>NK0_9tXNcC`m=25$KS-LbDTeNNOE{ zK!?P1-_Zj+^6cAyzRdpROkhR?K9d|Ov|vU;sWF4#iB}ji8Zj>{t;jPIpo9nRlbKa! zVgb3wC#PE+zWDfm{)=M(%lmjj(I*lqopz6J*B`T=>nN?u*VNAY2P+P^;)%>}kovwB z3HqH!d?3l)!yTHx?->DQ$4=;B;|6mh_E0cXOlawEjN4wHQNyL0AA1ors=S!-p-{F? zuoW=qu+dBk7%0_y)YXCJR4cW8C=k>DP9@{=Vbi-|HmT)m52S!W=|*!~?UD>Vhv0qQ z`Q{Glqgasvu?&8$10(Xyryo!{jsa3H5Y~3vQJqyiT4hz`>uRkke7%LrFHRDUu;_uX zFPGwBE`M5#VBUjxKVx7}KB@9$oqpCf{pd_j>?_vSDuE{nlQEbq4Z>%q1qRE3CsyEL zdlNKoq%KdZuT|pD^4^1b zX{+PQk$M$??3f}Uf|&+}9p=Db86cahRka;jcxk&4J5cm1schxjUc=%AWWZT?7fUq9 z<_m$ra#EWWK-@lF%-<{j)m&d|&2)WMj9{;_;MIRYK(L(Y$^}+^E2j0*w|0CIzfnnr zPg;qiod*>=@m+EzJXgDFJ52kh?G_c_S1R}z-aGMlw+0^HiC-zhV_3n8?PEM6~F zE#}S;+UO54n}i5<5}RHu1O(Gt1Gw<2FGOsem|~&6R;fQ3whQ020%BJQf$}Zf6gLaO z$e0_8g~)M**l}w%5)D8H>Hiwz|E?hkv}Wt$|4!2X8SsDe=>M=jIhREL7l{8`NB`%G z|I4Ip5vz<_M(?@f|IX2SF8IF^dJl_{bGh^$sYs7VbdB+N56z3s!E_5|u=r)aVsikC zWWf~T_!WxSRYECZeX%)EzBK?!Ep+^I3WXpRA=AA}@HCuqORk^Ur^HOKzw%3kZuqBQ zwNMw%mzX*He^jZN?AXcI&2>G^bJPfTMZm6fT;?3eyKZiS&`i<5^b))4k5G2k5Kshe zZd!zLEwlT#IG8vn-b1(Tg574aZI|yhk8(xhjJMmFwyFRMGY*&LtK2PP_n@-`;d&XT<$oWPKWA~v2 zA_1oDGq=*iWQ|uUgN?M{z2961e%NQOt2sn&g8P2+rwHzqwcp%XbMS%+@0{6>`h7ao zJYXiMJsAhgsf@`IanS6lLPSS3=K;g_bqRoehs`Sxze{xlCDe29=@Iig+T|+z*&DI~ zw*|vR7qss*I*P`D)btiEe(pF`KE%+2D8i}m_EEEeIS#XrqDAHuY&vTGLcM^&5@qoR z76+z(bxjR5Cp@Kr>Br0suts<8G4n74R`fn@7MUE#KWtX?_kLFc@P- ztFS1-uP4n-84HB}U>>DD;l|a4#FVyv@aQSjg}3}*_GeDO(I3p6@Q>k?xf6M!0i^yq z+z-Z_GDnchhDPQhg9_)mQ)n9$KBnfHz>rAa5I>z5yLf?8QTMufj5I;%UN?ic_<39AAQLWj6a&Am_Ahq0w_6W?yklrEg-MrjX>z7s_P1mpEu8@-_er320kbr>jgibHwSy{#}ee;-0E~> zX8e|*3rKx0Li-Cy%Y(6UggGd%3KXi2YeS)J2f^$Mr~$^o!3$;rjF|fIJ3e5zXl_LQ z-=>ofJbMwlii2?%%@Op?k3+(5&HXC-C9@Cp>~8VDWPY5exDR*5hr8m#UGd-E6{F$R z>*ko2uA8(Cmodn``D-Ak#L^-wBw;tH@wvLNnu`;W-``G~NiQU^TBizmL zte%&dLC)$G-<<0LJF)tf?ZBQr@)cjmdPb^=Hi6t{q&O5kVmL2kVoocXHQ%SLKuC>;LR0-`~;wV3m)T zudDa*x>^F(kb%;oT@hFjPsJe~Hth6;o3(_IcstQYXohN>(MRA=DJ%C8>a&ZrkT;`q zAcXk}?U=>zEctU3z*i_o1x>}d0u$-u11Ww2uXziv-5__~Z@%EyObmhH{#Z3U4o3S6 zA>^#>0jUNN@kjlID7;(dFLZW`vu-MyVDO$a&EH+ic~K7?1x$|%5IE2M=~`}Q4eszS zvOZ%B5F#~uep91AxFkTRtvgXd+>V2d`MsmCl*ovM(=%acw301FFD}ih zMcxN->L@4eL(2s!+DEcFDjsunFx)9xb4v%W1PMWwS8keXGUzBOAJabqvTm6Js5>x4 z#pP$R=<<68xH(<@;Lt5IaR-L?*`>fGe>zzw!zIsDQCA-08HCQ@sb0i&n!OOKo96G| zZScp6TU6m?IO0T4RXT<8iZlMO=r;8ZuK&$7*oE6ZDTH>HJ>_;~&!C#C;dTzn2THUc z)Po`cQ5@W#0pvhs-hkerf((d!cPl2fX~ElJ!YGv8F*#xAiz$O}7e8OTOuP}cRL#}$ zx(x*e!IwR=4Tc5RdIg;msphaZU|Bd7o@oB8U@{>wQfO$C_<0HGJ(0>UJ}Ja_Uf#k| z>nth3c4-Tg*Aqw~n1azuv9$U0QuIg;NhdW{ht(IH473%;GFn0IqFuy}Tl#8x5B+}o z_k};X-!X_3t#&>Toh=05qe)Aa5@T&%0|8HcmeK}-PBGK|xp78AbmtA;aI>*c?Q!n2 zkCQ?MTx?=nhre%>!}{PTFD${?s^)C&tvpJ-d~KDacOEF7e!=r!nRhhoa<2 zdcM9pT$(r|98z38^$^=BMGZej39C?|rg|?Vh}T8Y!iRX(B?iy>2{0o@=#28UI7Vp2 zo>4*ZXJZ1OP7C329QNQA!a+QFwrnYMz?0{@Erqx6&+(SR826&_hSqEbgOKWrzJ^yG z5jX=DszUih>Ueou1(iFMo>-^~4{h!+qOH&vEfY8V2y+Y8>{`l#TgOXIz{c3w|`;ZdPEg2?xKROrV%1;$5(C+fyo zrL0m6#wKQU+_lfWIW4wweGFUW!lRD~2Hj-5=Z^P=J|={-GZ;w5-BHJQ=jDp_ePdvQURv3*4;s%IqB?Lhx zC%AyVoe+qV7EUM458Ad9dgFsr+Tk7=XKDL5@>VJ)N~6 z*w|ih33(M)s)6-sgF0LzTe8vMtL0E-h0M9U0cfUMh|>WES>o+v2^B7;U8+}X>A-@)|9CS%{ZYy z5^FMtT1FhK=Y$aAImk|H9}1!Md)P{Rsj<@4m?u+0;dapzE?CY^sc>bT?msO2pylpV z;R>6|-$OhF<2nhnoLxpIp{+J=rVH^H9PA`Cp{9ZkaOt})SY@}15DpzXqcTArn8a`= z&&wLhz|KN5&CmN#jesegg*xuP8L7sA%Un0l|{9uiqO~8Hrd7zhE z*b1vzVIg8Qmbn7&$vu3ab{8S4){I{@oPj&e2NR13{#aPU$gNZn)u)RPix#K6E<&ig zaF+Z`Y&u)ywxLeNZ?&9U?uxzy+`9_hs~B5`bro8uUc_n~sctNKd9Ex$-_GzxI#|?;|e^?j}q`i{0^V!Z5PM#6BSup`p&BhcE!w?}Z*hEO~Y@{#9QI=5}Kt z-&VeGqlfSY{`zW9p@VgGYweY*E-3{*)ZAVic;-f5m_7WM``~@@{JhNVQ;IF=tK%!u za{C=R9e`IdyZeb-k}K>2^~_16$uf8{^DAf?t&t68oTO_eCi0Bh=N9wLSsm zgU0z2^*4KH@4nFQ!f8+VxUcXFzBb`QUtglt#H-Z=yq^X;wf$ljIqd#v;5n)JaKR0q&)-#S zs5xOZDMZnlI^C~ZbddNy6LKJFB8Fk+BE4EZI+#ZH=C!o-EGplseUqS=KH z7UD_#J@X+}Ay_n6)|BD{$Jd4CQ&8o?em4l-BDHPzStc)BcKCZG|od=lvEXoyE) z;^RmdH^>K?z9=k2+k4;9DCcnRDg7?KzE&xPm3RCYDW0m4<%p(wLWmyBthFSSx~tgK zCW4F|-!w3EyUBYAx0}ztpxaHwOTxR%?-1)VJpjhMEY$H_w)w z!f(|Q2g^SaKKu8@!3Sf65wbW4gxh0;l@4sK#@NCwSfxwo%g);ZVPl0LaM1kaNN2s=?Of2id=siMw$QCaY=qZn{^rP2Q?ZuU7CG4Aft;Lvfd#2C^?lrGQFg${ajq6*H#U9%JLdf# zo!{icpLYatE;aB~dusJX4sw^wu6#`i_2KL~P%qAI6pTpARKvRKS^7Um$NC+WCmU|h zm+AV?%rsiNKTt&@8{N^~UBl}<6x?d%%dY#TlD+%wg_Qd5ab&DnnTK_7Y0k80sJVD4 zImw{an~Fr@#I26O8;)lw#~}hpvE9zS_c%B{3}&2r>_hG~`#;J$O1{?eAJd9Yz zIA;vf{$C@O6()~{u{}j^*C?BEe$U8dFsyZ8_N@<@T`>nfOiy^2o`BBv2Qodu#_ZR= zK^s#wc69x>_7e-;)a7e>JY*hj>LeZRVH%P(g2TQ!KTJdVchit;eE!+)YV!G(Dts=k$niOL>O><`cG!z?Q5j$@$wrK=d8-n%$5>ZaR^P@(;&6zl+7d>^K}|=Fei>)8;Ai(1yJ$3AZLIPJ806jG?D>UauywE z7?iX*tsa!9=6iY`1iKM*FF?Wx8ZelUVT#6pK@*8fO!(5|jbbP6$nJug1H zfyO?An7Yn|sseNzO=owU!AiO758w>O!1JGHdcvU-bXo5;jqxXC$2<*T+;vh`S^qzt zyKjCJ0;@}Xo2yWteEt7B^~JulA5-)zszrT-iDBl?GSxBNH#0T0p3f=-c>Bpdi zCGO~ZuGh!6h`=>wcZ*_vwIYYC-e=6~9>vtxDw`LghSW9Q#5*p`jlOSnJ_z-={nY6dT`rqCpIjCzcA4^>o(nONbawEo%(w+Ts@6 zW_Q#UTjDkwel8;zfd%-yz5f%|k^4KG82!?7*(~gtBo-zVJn; zScC%|5hfPk*`|d-?0}Lg(IAFkhTUv~_yiTF<@MJ3fQSEd4^KJxfkuU^Fno{Oq4F_$ zt!#uL!dV`fwVuQO;` zvn24RDBbA&eM2UY-I@-iQDSd)nHsWQIUI{*UjEAAiFjyFe!NYnMovPANklr!eSDk7 zc)VqErWSmixYR93M~B36grsA*oqOwG_9Dr9(1G;s(lFRr+(xJ6eoOYjY>UJqmjJgK z1jOZF2!oB;hq%y8w&R{O@@1tl}2Z{r+fwONx_t&a8K_+x&Qot zV7Y3MGu#t`O5xb*t4YXy6}Tq^m&$u(iVa-Ky{ezjiiAYXtO^nmL3?87u@Ek2NWn{o71tiJ|@Ck90=vyh^lLDqh0iRYtc?Z8$~f@SI3ActKLe7jJa7l7B0f9@hhWHU!B^cI2l(Qv>X)C3N z*bBF>P{`BmGt@lulWfppvCXNUbWkyPUmG~~yy$|Dgh5QHISN+AQp%4RB06CnB@7YU zpv1V{6P5q9cI}9`6hPu+0ZYRFUF%xq7v%M#%75NKqWoJ*2Z}TS_93wo)V7Dj{x1`I zbK)*19<)Cuc6#8VME-HFheWP8$RA4d|A<6y4m}4{gUEa6S67zk$~8TSJrwHPLwf(u z(0jm;YSFu;3cbtM_oR0~C1w=(52L4-hl6!&lc2%ORtKpiQj|9{j8!SZzFN|L4PfqO*NGf9;h|b*C9M3MUP!>?? zc)Vfg@rD_^zZG0~i_QkqabFA!E8FIYSs!lXv#1-1d%Kd4gF?F|mu9qtq=`F;$0T)u zR2!0>UT6R>^%4yjJWjjnzp@JsYO<8Ct+Ptp`9t5Kr=Ag$b`qCILTh(li0wJ+B^PZC zZe@Oy+ghkd3htD?)Evl8VeSHAKgX>^W4w{lgwgA=Hj-)$hk$G3(huT_-qu3qa6C>8 zg1E%QU=R~UEgTsx_F`wQN9=m>HC!GpYFse09{PKJchfyOjAsk;t$oF} znG?+9lfL4#Xpr=BD}?fQF|$4?Ruu}lGq*)S{x&UQ?Ti%D&@)*XRO=MW{f;FY?hdN8 zf71PfYMoX(y#uJ$EoV?IEJ)S0+{2RbzPOuMf8YENv9l8({X=mcUNs#>t;It}iQ||# zaC{WrjJLe^5nkc4T^=nC!Dsr95hJlh(irhMjC46VM(n}x(CB0QlMRU?U!#TwVyW=x?W6{uD03$yUXW$EOe!qzG?V)@iUxIw+Uib&+8lX+-5{RzRIBdcm{?{5L>xSnry&{o#+am zO%VGrtD$1AOPyM7To5Jg)ukk?INXH`GRCY7Mu^&G6GffpV!X>`W;8(4Ah)a(vg>rH z14Ac@E?WBd0C;<%7|bp%g=rIUlCBx!!@`*`cPgW}YrAQj^6`mcsOL%iKX+sy?dHsG z=v}^}PD3}2N-6od0bGdu@rVY5U#}i#aMc)sxRbk~?oWHBBCTl!29&$1JJ;L)k#VU*V{h|l}ZG%*mOr=i0#9^RNHo?$2HVZd~8 z5cw-j7qihe8$UyQ7k@3BA-1PoHY~qiM}wlK#anxUGkM1BQ1_On~Qd04*bwponD@%P>=c5{GpA>3u$EVfX;h$uA>S6tT*e%wqy)TdB%MCKt6 zzFLS<{zX_&DAq+7P6@MhOY~F_TP4KVlcJT{bGhw^P#`ViPOz-YyYct;FkD zDn|BynLDra-?)0zdx5^+3aN3y-q=RJFsl>`uOPWDEfpWPlIz)0@gtokK$rxo*QsE1^C&f3hvydOec7#x$ z`Av)`gv#HdGcdkW>lb&cX{n&~FkO=x56n>PR81WQIODhdy~!elmq#Ae}bUr`n(F&q}d~ zSmeUZWgu^Ug%6lnsksB`)bqG=>k`YlqIUEmpbA~_tQ&JgjUD7NvqVe8Ey%gOg~FscWFGK z*-{UQ((L!15~bO+no?6M%^s^M*=Y8BO)0X&%N(zaC#-rjn?t`(p;@TtHo=FG=UZM9 zCDX}Xl8sEadP#&#J9$e>aXbFeTbhnb{eCU!SGpN3hXg+<5T^J@=LymJN~CVd^L`SM zss?|F67B2$5+T~!0TL1|YzvTnM)F!0C?&e!>NF3RWXXv%TX5T*((HtAi3nA*^(Pdn z)}NTV5~10ROxlQ-0)VS4J&%1E>q;Gb@b9r!(o-rNU8~0=LY-Zb~>DX2xiTvL}0ez$`E(K!6w53$IO}<&X9VOW9< zKf6=DqBOh9{_Km7OVNm<<-!%iP?glyzeFJ}&Wc>j%WVvFM-fuG8&eS?|B^gd?-YmN~3^8oKSGsef1Zr^OPAC(Ee%XBsWlTC3 z1PzP*K=12}59h|6q>sz4+1Z@bJ(%qJ$*lENWLr?)poh{%HCPB3&&S%0;@ z|Fr%6+g8c|buQd#JcziT@VV0f&NvKUL?`82KeG)0zUhQBIV%^x6|QxX>gZDDXecyq zNM|Y7P^B<{8+Xp$8xH*(Bn;{23%$EY4I!no7tA@MZ?{^9ZXkcS{JFcU2*=li&R%T7zgnSe*4%UpW05~d~V!j z+9Ueg>vWZ(n`eK41L1yECR8qzgbR9wK19PeDpryb38d3248*_qmY<7tkkGuV zWd~!;P*|AeHjJVe{X5`Bbe2->#b!O2>>LqRHv+(kc<< zW71x_`bT0?4C+`l#i-Wqb}R7Mh&7_ zAOxTbRfD|c|ZE9!`t#k2qD2Yja1p4)*pC7(yT3yImI=d;3;`a7& zjscAttm9%VC~m}%h{o_^(^|r!9piM+x1VGy!>M0sx0n<(9^W6bJ{W9(+x_SSP2eQm}8+YGR$TxEEAdXEO>8{AXychu$UGTh7qB%^^GVeI(yM}9@mE_!S4j88uT z$5*}LarzZ>yfh#oG3H=X$R8l-D5BlnVV9SNzbX+O@gMyhiYHAn0Nk{4v((GQ$9R3edv_xh|n z`)4H#ldN!z#E^8yVt|}^OVld8=68A+a`9AkYPw1GWr`nq{(gdeVAR`E zJ}H0N_8qAai5yGp&?W#zzau5ElYO9KnpB%0943xGRbQ_Fuaf+LtZQpR(>ER>xVlQj zk9&1=T#Zs`Pq8YfWd$Fb+D~PRhD#LaaL05h5;C@@dTM_^ry=0FZZo9%P&a`jSQvAG1w< ziGO3-T*r~M`Mw7C?N9Q-HsK>FQg`Yo(L|a+__WJ@`Utukl6X{O_`$k}L450}46JxC zN^*95ix@{op>35oItp$39wZtwZE{YnpLF^>Di6ffw2ci9yTl;(H$*Kta8TI%K< zfhsk5d3I(HaRijEThy#3EeC>8W29&vi7PAF^m>3X<%dWHi^83nsZ}9gLFy!_C(6~B zx6$tuJ$J8v%^fETYuIY)Y&{933#1m%cd|sn&3qtcS5_2cRV-4&%*hf-rp%r!IqGLF zq|P3N=gm5~j5P7X0^$q1>jf%@?clTWHPr%WCdAP56wEhkZW_ru!2%(^Fq}(q!wv$0 z*_!zQOrI)kBGS0;GzV!sds<~_Oau8!zB*&WI=6~sNQyt}f|lOSgV zah7Djf_uYeNt5yB=~>cNEdQ4HaY-P2a?GrQ;@MOP|2|v#m==z~u++>q{2_IY6i#aG zsW4TC%JHH(Qjm6s8gKZ4_r?*vaC?sQrWTDzDlR~7GC4(h0%dk_3YFPzsZt6ZYHdt0 z3h{%lQqd@N60W3D;T<$r3JJNYwIagEIN}C1M@v^C2~UCexl&?C9A~I3#?@Rnm1u+HQ84xyHg{34D56Zg%%HLRsE4WgRh~DO~C7ntr>T`WCB~;ev^L}>|PTmV7 zJ9am>fELU~uWHPlghN}D9_5}h!qcOReS!N-@}+)yPbhCRKE$B_r(G}%`}jN&3^irJ zV6H3}pkt=IArwqIAAwJK0daFf?u7F$C>NqvT=RvU6V4O4fH@n)x!rLgo#@1^GmkR+ z!21vaZ7S(!*%hCVGU3cmXKiJ|vxO=}#}ebtMM3CxJaxu{r#@XyQ&*v=EWLth>KNEf zkvo-`?$Yg21e|L-Ll1-VQfpcv;#_26$FvYdS0jPlSFtFs64;%%uvGvU=ACvkmYs~m zLB%9p zn9iTDmDda49dWuRWF<~%1V6Cjh#}(Pdfj2YvJQW4fFlFWk`g@kvtGP?z4CJ8v*`c0 zP7z@zElwc_M^=##gtJ;!Gfo4^e3RN>=v%0Vlqc)BL)_#fwPms(ZJ{MjYZz1gn_~g5 zmnEsC3JaDRv%hbS!13-YB{x_nN%6+`C&} zfm>e1`Ct|-3dW6!%ai)6F0GA%m;-P5!LVc+jEe=8hsWyaCY_oWAD4;qCB3)y#o$85DqC)R1WN@6pg)cQ4@_u zz?i79l0*|tqVToE!~}aZ76b*x4%j=_mwTQ&nk9C@7Q1Nd4Y9?FzuDa@mL%VN-*0)} z&+mQt=Xjo-nVp@T-I>|lXD4?7K7DV>ZH;9H6WZ8;@W7O7k*%kf+`RnGjOq9t!xF{k z;F%WW$b0lu%&qNe%<)z=#H=|=b8cwEIg|;7tqx4@BehcSX6}SkrLRz^>LK(O2#q;* zW}9=BuFtLpswDVMW5!(sHJqdG3a%^IJDDXnBK%uh>Lfecn9cgNv`29`qhbaj$?8SQ zXs3qK_V${2E;}j4qcu2R)({<=#nRWIoBbW+T5@S-q|{%B`g&jiJ4vR(v{F!R$sLco z9>eozn}FZLD~faJ={aW%hgn{j zT2p5GLQs>;8ZfFjHv-c()qyhip8_GTIG5&G`K37btTS>{50k9VM|-<1*F$=rP=5L# zD^c5XXES0AA;EivU$-i4t29M%8SneE<=lGszsCB%693P+@Bh3?l`7BOF$uRsm1ck9 ztHLg-M$GY|(y6&4w>|O_4nsHpfH#=$z=WTejBQ75L;Q5I39fsG_(9`*`B@E?5OMU*+%B)d79uQqa}_(8H|MNs&Jr2Z0|7}p z>-U0*Kj%LDKU4MluEpe?X$m;o>j2&c)8`uXp8f%Q1!wkiACEZ~8<_F>*Ekmkcio`Q z#lIj2t>eNX??cS}O*n+^?^Vm*Dv^>Z?IhIYx@du%L%G!bRkgfDGu4D1elrwKs(Ov? zR7C%LqcNxlXZk_em1}PD^{mZ~%Z2zekA~m6Nf(h5+^*3;SalJn5`4OtOD`9ae0DPl zh93EEX=Bp!)z(C-gB#wY9sbu_yY98t^5?(QTJrE@u9JjC6jh*fMjIdSKArm(9#l$t zuqhCR;Qu_Dl|t!_AA(`|kIq${T<{n~!Rg%D(zP;(TjCxFpPk9=E}i8Axo2_*N`DK= z%6UtQr|Xnwb0bi+v1i%#dsRsF^sYfRpUtgq->PmbCvN4Pw&$ig!a_^z8{`*?V*2CCUAphm2-n`{#DkyLB2kO87Pikk{&BGn=5cYqy zk@8in3+?NF5PR>x)XqD?me0u4`?&gr$Mv>6z~2No{vh`YTu)Oy%$+XlSBWS{8 zmyGy8KhonjJeTA&P$dKJC%BV8_7R>iIR$x-aKFPM35`%y1=Ta$Rq%bB`vh^lp5*p! za7v2r<=nfg8l;Q}4QF0wGkySF*$QucLI8J)*dQZL?N4?*$;Fev1JPZ^I=Z>BizbvU z6{jHh87|^YBkiB%Ced;)Ud|U~X}P2l%lDA5%G`N)h6>a#a(l~I?LJT>QTurMGB>xC z!sLV%`a-!(9ROYr)EK%;Rs%opO!d{XU z_t2ZE>R4H?q_V0*koD#g7${fI!)ojDYU?o&T5Sh+q?|zpyQ{}ZvAhAVwzem$wt=Tw zDZ4=>(1=Q)0YpvL$nc6obqkW~srIA@c-WV=gKwKqg5KUp@G>;>Ru91ipatIQ?vlQ6 z+FN}Kfg|Dlbagj3<`^=e)bc^#Ow!RuU9Sd~Hv`ozwLc8?(=>v~x72R1HJtH5!Womt z!_^jl1jEF_yKG=XKhDE%8B`4HnhL?viTrK#LqF_ONk4UOlwF^G_;w)~*H4}6ClR6E zDD_38(H>IAt2=>*MqM2SjYjnKFnlxuZYDEFt1+YaKvgFS(M?{+&y2QItcTbnb(kyD zKum}^cQnc)v8l!nZYOJe;Nx%9Loz+I??K|<)Ljs}80L>xch4N7cBAoJ1RgOf`d;lT z-_EJEQcNRF$Edr|dUh~Ku#8o^Arn83RfnNoULUJoNqc(Ucy%960MD8s0eCuI?dHmq za?kJaK&8Bw5tQ$9Fur^O5-lc$6V%6PjR!b@^)xVT+3oKTAdh%YRDVbTN;$wG2Lp|pPCw2nJyJ)exUDv5Fm2RO+AcuGpt ziuI5<4dt9cr-IY0jdh`5uucJsKhd~D#7~+AE>p@&MNGmr)L(FV-eN^4gXRCX-_f=iA7J5KM9c>N_ zo}=#KKG1%!*bCzQG_B#%9CdZOS~3D;+D!prh!zomPU6 zPD#qs)eovV4^-W#^19wftzgQ~b_LQ)Cxcd~J5zc&YZ<+VYw_(u61YxXSQQoeWUjg# ziQKJ1M+MX9V7$bqp++4h+e~G6A8$TWcO)qqbqfi?Jz#L%z)Oc!WI~`0iCIW{ow_eA zePk^?r)Q%sd%R05iX6o15DDXe}ocIor2&)%r@{D9DKhS!Sg8i zk2Y`@wHv8pQR4~cfe@K*gP+CWm**pV5rzNhW%zsf9R5Xt4So)X|GE(2XHvn4l8GS2{l-hxDnW(mAEz-AIW|#~D`E66b2X!F{+Ul1$sp z=i^L<4`=qW{=2dldAkhqed^&JGu-g3vUTAE)DyI=C3?KCy` z1RNKpag#5z^8wNWNGp@nJD`3p!4a^+O3OL|hLzw5$b<X0L0Gd`R> zgd>zSWhG?$X?*3YINer?bmD$kt)L@xHAJ6OTkEEizkH3O?xdqgb|FbWswNUt`JTV1 zuOP;HiV*|jkE??lPDC+nu(IS%J%`3t&tapjCN>y0LVSg~9+aF^2SUeQ8aLw!bp%tJ zlQ^^{!t|5sQ0|;;VSoeyqiMHqrB!u@_fMl(Cqm!T>QKoh^6hDLYs$HX7d}7B3SG}3 zjXkv6bc{yE`)b?`_(m;<Tn6=T>fzFQDy$kt2|A_J5@-Y@>;&%z^IaLw+Ft0mOs-bH0`@ z8hvqfhY3B`!*%4B|(8=IYU5$eH zG}8QyR(z9JeCw6w++yhR+x%rKMKP%i*X*O<<-8&M$T4e(vZ*Fa#-{QL)@HyqhY(X! zOrB1aqsnYC5o@R5N<~VpNdK-DlBp2V- z;CVc11{u>S4uFKN2#`Uhcg0rWh{2T#@0NP2FCW)Z@0Qt3Aj}6_23&1JrLe`c_f~J|H9eXq+hMDhBGc z+73!NU(G1P=?}3gWkJB2gHl77`tI#YYtL~ov-UN zbQp~a&1CU2S7;cDZ_r&IIa+g{+Uy}ojBR}q5?V-pNzyE28oZBba6Jgwr*ns_F-(p3 zQ(-VQ_JS>AQ6i72MjYTWE}<`&9v`G?)DW@^8h_@!WS&shgeYgdGfXlWtAldh;XtUB zsE&i|6YBRMH$v0OvxK+kU1c|ABgH_78;>2xh?jEW`Qwo|TaGzIJFpY+_(qdXxzCwk zgFM0^y}m_A7X9L_`pKGH7VXkHFypwU8usWh-sQj8WcU~~-`NJhaXaTVq3l<+7c`lu zxrsO@IL=82&ZzHETzg2`_nMV-sGR0%GAY?6lrvmS&Tu!)7!8=?WVZkm!ltUslyBra9t@5Rdr)gt)~xgdW4ki`n4&VXuFhyarb4t#TOZ!h zYRm{f4ZQQM!%i{XhBS?OfzzGfe7MHPYX*PYO2Nk845-M{G$i|6wayYYyx^vu_2Q3| zPSrn@el;vysLnk>d5z#@T_=&?>2c`<|6-NqCX~ao|aWLD;!5kY0 zZ0OBl9N5>L@F2FgRt_N+O#&N^k$D=r_%xRjE6B4Eo5zXCQ*6Yhk(+s%cjz#f&ta1V zjhl3u6Z|BgTf2vB68P|2z)BSh9SuX_EacR{Y(`yUK4SVGu~m-x};9{yriH3^xS&61kT_)Bo)`KY3Y1|uab?Ua-D$FEfOEoR% zFwAvgR?c1RkWJ<}jCQ4Z*b5)d8}#f zfuU7|OiR}$OcbXxJo`xJB^PX5sNs88Ese3VT(#qQ!i`MZpUhIJ9?1e7@8R8h>pdq$a7O>0tX3#~EFhn(v|Q!zj6dJRl;#wDVRwtp-6S%WS&}1 zQhc>*C}t_goaArA#48}E@DAHBXOhkSS~kp%aDI+D_<0t9)mM^`Ko0N=2RQBk7#)lZ zGt+c}Gpr8Qo}q*0Bm?z2We24laf*xeSqSpN#>{ChR_q9Of&(XonzAz#GbXc+wz@0p z?6atBvoLCCQb+5?UBz=waQm^gHC@zoh6#0$#SO5uj+Tz2D|NJV9Q{&P+XoLTHK~VX znIyKJb{*BwOHf&YrsT4nC+OJ>0W!$wX4(V~L@Vvc(CT->x9OyNCv7YGc1jQS_E-;X znCn8?j9WN@VsTit+ooPPPF zHk~Z)uWd#<<}MfJJsUTNA#?yDF~9A;9jQAcey+U%LrQg1JRfjSo8K2T2-Wp4T?lx{ z<+@@J%9SbjZ+3h+n9pfrNbq3o6k6#c-Yt*ql~VM_9Nm2=qBCuOVn=7y%gDT;+DR1s zDd+i_9UVUT1f{}4o99mO)kST0a^w>&+XJcOurD02qdr5qnn>Db+WVB)6x?FecK4d< zYz>lGQ>H@ERn*RD{3Tm!7_PlR!KX8D`3yTabQ*zm^JQaaNbuFx0Vd_~H?-|Y$q4N? z6l*5On&rS+{v~ozL<+ye{z8D+oQpYj04k9=oQt_OE-FdwQQDs=_&g4t@(Oqg2cK^P z$Gx{iZ98WKPvzC8*}kos&bt*7^r^P$ainSr6*=FrJ zKg7*(e$AT5S30Of79*8~bjYl7hQ!ete=@3Ad(@xC{HvW|bYHDCVw!M5O9THkQ~;f! z(SEcBYi(2xK&#2UK5*N&=TJRvNnY2rg8o;v zG)Ti^vlKtifp5Nw6%>^nWQ$sVuaz#$J?9-;u* zz}UrD!b`5kX}ghHziE5Z1%t%LsMrT!$77^&8LmFoCeVSfj}HWx`$X&J+*h^V8LrpS z#=w>(25+dDs_6^MzSXvZ2~V}u^Eu!QC+ljv$qzc1I`tIEWs=IL+B5!G$?57kT1m8z zjozN@s3!>$597fNVv{AK92G6L2!I5pgYtRopgO%nNA&dW@}3hR~Jhy?pY>rh#8=B;{?tz0`fA>bt{F1d_6#yOJ^Fq36ajc7i{fe^m1;Q1HkJGB*_NBO$R5}DC{i`d)om!|4W2r(MP$XdZ4g( zIBbOj)-nn!&Ld@`bW72 zyuL*&wnFg8#_qSeS+s`79QKI=HX<2Ws3h^px&zLrGsvgakMBXfrt*t8?V%@iU&Eo(>R{q=Sa+5x{9<0g5<5P`97Rbog4OY-ezal6b5*ryPAZTCWc2Rem*0PDSvDsb=ynhARm`M_^=(^C+ zvXud3-mnQGmy?yNIR?h=r0EUacnYdvpiq9>2CKEg>TIwXq-MFUCLITQUa!GXZ^}Ka z_cESe)Fsn#5PhGGgFFsra=^ttu#E!&4sOzY2|riYE1|ZFz6ELZP}|{H_%@yNudYv_7Pttn21V6phn(ofh`iWQRR<-4E+j*h`bX8M z#&2gD9{}Sb^m~z@DpEfPuMEhF)LR3FpCPG>zAd!vr1zKa;$-M1P-v9?7}kVGhFal} z-eaSm2Jc5BeG4Q;>l0)-ZlT?AXI0YynYkUU7Z3q&rD~TtjcDHh5gpt zhJ~>s#mZ{Vuu6F~ha3pGZy|$B-w#s;+km2lzK-mvOX&NmBXFxFqQ9vqLu9+;*g%XL zt*kbo&d?OkGrTTaV3gQ~k=fA($uOI6&Q2x>V%qB6IGHlLoSMMFv%2@-&IkHdp66es z721x`8s83Sv7z#-ofdww-9hi~b&(^4E12*vQlgz9_e=d0#idtBVfaY}1GPF}lhdF< z2c*bG6z=O<<;f_9NOr;I4y?0rBbQj(r zjOQO?5S}fHmD}O{p)$tS{yTQ0CJ?96(-n|&Du(&i+o&8F(D!Y9g5)VNy{%`Px40uq zx#`q}anrpE!rXwbx=>p!QH{X9n#U~(UXWT+_&RX(57qpsVQ zKKgt*J*GO~mlMza`fq6^3tvJ?cOael7~4F}I6%Lg z0%g7g1P-8k1CcTtytoZ(ryMg#kM{%Phi`*XVeW(95Cmc)7Pnn(K!DXJL)j3f8OvUx zzT81QDghDM7+pby6HX>)>uX5J;!pJ7(LTy@V8M`KHtFE5EDBbh!^z;<7nwUuuaP1A zN(a2xDtj%oGjMyBcE;wfkO&)fs|nUuSBidwE|@$SrB9;>w)lo9MRZVETXdUAzPR0!)Xo0 zFY&R>0Uwc#d{{_)HV!@%o?NnDnzV{^>`y4dRZbX*$5XmMSRtSYx0o$j* zgASq}4<9Z)MSBh(F2bXh-`p4e5EGbI>Tj?G|eb62T^ z+rY7MeE}U5a7RzitqrYUV1^0=V*%GqQs8gE4A)VUO}=!(NFdMe>AQqsy|*0o!aRS2 z8}T^O#q0{PKNx(-&`%7r zX}>;kuq%IR6Vo+_8D_AKif49AcXIY?!zU7gy0V`t-t(7GD;=m|BM_C1ix)3x>*x^% z77tB^&~!A^9lpdCUxRnQM9J(SBfm7TB{>Xnu~0spr)F%axCT?cMq*6$XMl2wA)K~= z@zI2i7YuPJ{7eV@&?JOsCTNx&-qB)z2~mzQjHk?F@Jmr=J5XRDUr5 zrU3IC0O!6#+Dz9|IBn$vwF?vuL;s$MG=D+PsZcT2;44q#^yz{8;36l_Db3u&=NjLOCF^^40&Y2Yf82zQ89`u^4_aq0?4Qv%0<7C>> z#rFE(W+sZ_2Jr&JNh&Lhi7CJ`2SBIANRW+}<&ZM zIxaQPcnU*cik|I2&sk~+b7kWw$CdkZO|uLIWaTo$Jz5_I!W3bZ1L4LBWGI7pW*H9A z<-_wiHbuvM+DwBl#I7`0SLN2Z((Rle^6g5)htz}|Ty3CxNCj)q^ScYR)*_wFBxbFl zBc(HGJ&NZp99fU8VZ&rAlo3MoG3ZdW%L*0D^>E0kWuNXpTVF~A|)WKCkInrjz ze2CKafo0`}eRT34c?VmIE5@8$as?wds{+Yol1&u`Upko=`WUGS`S}`=KRQrPfV#rK zm*N1I;$-A=U*kvAFr0*_^oL__^q$8sf#5iQ1K}=>SwIwx_uqLboc#! z#-N6_`+2LdTQ8K&RKK#evip{i?60nM+*Fcxs>wmq*BA-;{fusm{AmaIqy3Dn@sN*a ze`D=B7uEbi=Lpqh8zMbRz-}n8-Xcw6`x~p#Gk8~AL2}iogvlQp+sfF-dRIX*#^@`* z#--gtkx9;eY}`e6v93E{!!qw0W%3&wra6A1_Uvycm<$p!#@L90-g+JMwgYstDm`KTn*)LK`^Z+sdT=jd{6-WR-*rRKC$ED(b%5^O!}z_u$2fpeeQxEq(gBfm znDJYD*f^#t4O1sWktf0HBu*RiQQwqjjDs))PdSB!g*9}IcBkuFdfL_9s`+vw9T zK<0zw8Ok@6zoYt)eAU>Vj`uXq%>p|#DDE0VIpYgKm`B1%!d>G#6ci6LVQb|X4$$XM zjiES_LY^7-Rz(0jv~nZzXoYCbDMw=)|Ln`YPtaiw*ZUe>dz-gPZZJ-%se{~Yd#O6z^r`lIC7`#p&k(hv2 zL9~LjBCGt!3u;wXGmhbQ4Prfmy@tzKzSc%{Aqfs3gvojxm34i17Dz-yU2m6l4Sw2n zgSCqygRwGZWjFHP>>o@n(8@M(`E9m|2hS1IBG&0^3j+nzk?Q1fEn=bYTX~DiLy#Uj zPn*kIthVu%PHHL%`$kB^+To?OlcsAyTFB{yinuh4P?cE|MrN{R;DKb?jF0NFW*F?v z@RS>E=#L?>9-)f9upYrX7OC;0T@NV{C?|GG)?}5FVB;l&h!Nx(o#{mmd#5F`&0x)( zZHo;woz!YY8d0+OTww|v^)Bm#^)4g@oyayjf1sV;eWRizW9b_sk zFR?MDhLTCx%S<6kX`O*kZCjo{X)u}i(MF*0qjSh%J3O5S4)Zx=(>(0D3}To^^z`h_ zQ3fhMW(S3WB}kenHXbXwOahHdNec>z$BOAlJmG+xvyKUN>pJ|TnKFHfYe7pL(*itA zjN?###s+^F;`BDA&r-@0q1{4l1VkRf6^P)8+94#E;6lh1LU${d(6`)x{1lf_|k z&&@WrfO$nmAF_Ktc`pEwE-)k*av9Z$omly`DwOUq`p7SGGA;1ahq;%@$MmD-OS~zU z9Tl{H&YCjhIqB(7n{t&m<)}}dh<%vmn}-=Kpxigl>g(R93gMGX@59G$jVVAuA|7*8&7$d)d$Vu&v}3&@O4eAn!BpP)#l})&7I~3@rily@U;$WU>jr8!FvKWC>38I z-%E6Pr#+GSk1)A352H&P_3QX0DHDHrab61DK1wddhA{%OIf0v{NRf?#Igq8xODFRW z<*~yGbKRI*0`to9thyl3>R82l zrP+94YwYy<)jVG~bq8x@!x|3*uQd69VjRwjk)1RFP^%)ZHm;JlugGH?r|G;!8Fng= zbr1E0bw%c@xSnw5US0&^hTP9{p=NIp!-d3$SQ)E*F{@p^gcHMVf#nbLtn2MdK~<3# zM0|eBbEV%JE#u9XFLzX&_!x%;YxfE_`1+DD2)cLIdqUA;R_UF`d5hV%7}<{gs|JNn z^Yln9hxeairH$HsI#aE5VQ@a2(R7;#pa`jI*sf?q6J*L<%Kq)cR@1AWHnVqlvHmragr$@3^^?3YIrUOtGY|;-p18%yG^ng z#ABtYFcit|V7xX5r|qVi7;P!HV@uLW=k2C5G};QiXljQ)gD#pn;uUIpK(nBczeh9G zUPeddtoRTLFPeg0xqy*ezG(V^UV!xPyD=xe^Ra*CCK*_E&BRiD(3^pv#QN|LUYA3! zkpZV0rk7Kq#Gm@9uFQHPc$z7L=0uUq`k@AY)d$j6%zG^;rtf%`g0o*8>xMYWsjajpk2F z_|rlD^n^b}J~V~9B;eJ`ZkhWJ_`;k~c)$PThbH`73g%-G5)mGn;$5?6xTvZr20``T zOqmjZ4ZoS9UE&d|8h&WK#ux7WX8N>dZ(BZ3dmaUPZ$3?=iI;Lt*_~J$QXiRQwsd;S z9+_w^Nb7x*e<^E&tBT!3X}gQlo3A?9Yg4_H3zA=c>8h&EdIoO@k9=%uE8BCEUCufB zv8g@k!RE)NUXuOr^s%WaJ~et`dKaIPo|s0_L=%kP7f(#~OGKSifi&BM5+a|PWO#{a zkiB-6yHqt76H%&;Z>~$*OBqp_*VF&mrx~s)o*~qFwRx}|m6oFBAb-95Cb4uAE1o*| zJp0tt4RfP4cxGybKOa9cwZWhCXD0lj74|$c#Yv_?@N-iqXQKpfluUbWs#C2lb6fDc zNTp0+gp}tDvFN#}4TY&sVSJ%_rKz^Wi9}bL21}%cWsvs5R99YDMsM@S4sDo`Bly6f z7p9Qf7uAt1rTy?mO}uil7yc|>s;7P%2k!2s!Qu2RwC4E$!g1%^6HjIl}c4X z0jsY{75u-L{U0W6S;dJ%6i~>EYS@Ul*n1@sp_#%8^A{KIQko}5(ap$t=o zDX=)&M$D=w%~%I|C>tvq)8b~Y6*spQS5;P}#m!$Ue#=@Mstl#Yu+0g( z`;e_JLT`ywT?SHD;nS*{QI|1|j}p`|b!)+FR{>lGbq#Z_21VYkzRoLw(@p5_j6?Tl@E+aNALhFWL-1qzayKDKf}cLhg%q5@@5qH1*V&h4 zDp#BdTe+j+O@u-2LL2-6ccDKH&I)(o8_7vB!b7+z#asDGvl8Yv!Hbwjc_EMy)_V#4 z5LTiPLh+}LLRc)h1r~*{AD`xU3-|G9a&=*VCUC$RsTvTTyDlPFq8_^H60Yan%$b|smeJ9C!h^i^H#z|sCO<^lu z=@U>(aFaSum*7nis+BA8`;-vD9rLI;sjgOmgoeI;Eg$8T;_$A5dHgmTZU0@x|5Q#2 z%qm7Tw3^JSr`K42DEi|PGN=YNs{va>ge54c?n>b%{#xtJCMD|#TTlD2~BLg zK1ieXtRK7^CPX=d6yrwaimx!4LYSbb6^C~faRqX*4VZ_#=l${a!69{o1nh>QI;a4c z+Mtfmgt7k^S=j63_ljeMF`5v_ICugTC$IU!xB#KP|5Hv&@>*`ithz!p-b-6rR|sWU z2A+dPo9R#QrS+;O1i9W>6pRdi3{m(%U#2b2`Vf>iTl*1XJt1EzeI5iwUwlvR4L$$G z_Z{I#L*f4~KgWAbS~Mu44&o>0O$C~R7rV?-N4l?sgrxyW$lm4~3U^dRuJBf*kW4csReV&n2JDR#dPpjvsIr9*ghvS- z@nqVFC_yKk?E|%=g$g(^uF^|-e+z!HB50(OgW>rIw_rHeQWz+Gw9%I9Jt6k{K>A1% z$NOE~_{Od6M=+|R=u=-tKfcC>UNLKCkYo+Tj)O*RnWnI`I)&(u-q>yTh*?^lv3S#1 zRzP4On&v*XR4T8g$a#Luo+5{3)yaU+lni@{oV0xAL!V!}tceFti$m|xRTt7^IF5W1 z-r37o>V+hlM8WDhCw(V`!|vj}cGo%HTV$?tQ4e2G%zq%0u#`6r_qlZHa&(`w)R^oh z0ETuH=vA+(>LRdwU{*R8E! z7u0a?@qkovYzrOIRbfW*wvMp;F>4 zse(-K)MHRTy(#9^g5NxSU%gWeHTtmW?r4egC~rv}*3Xm{KRZ|Vc1lHPUiCs%pULTt7NpLAXS z%8mGP6}xiN)@kDf!Y3GA2|E2P=F?4MK_@f zHsRN90w(t+McvURqQ%6erW?urka|1W6TF`O;0_%kmo!WaMFWulAI1tj@o8l&dUy#? z5{p$#gs1$cejKuBgmrPkc!`nJjz@O@K_~QPY^>@nw8y71{^b6FKx4F+4_Mik{3)A1 z?PX7yeOOWBJ`8YZAE7zcm)=JZr89#e{zHMrUU<epJia<<{J9{6-+ukUxuGFb9!Ci~86S5+SOi%kw|t zUH;2QLR;DMY`N03i(*rN{t5 zM~^hP;QgY=s1HmVD2&ASw+9O2`THjP{SSkLk+^Kr6z&WZVxi4obi<~>kio)Kd>Kh! z_JpV*LOza%@*x6E;VK_048@->hq9+1hYBswsF;Te6ER|K$raz;6jTCdYs5-r=+Vm2 z?hoLH1c8REt?f8}Kk}2Q+BhimQMIw7+9mhe9D$xVL%>m__{1(si2Fo{lPt#-4B|rZ)LD)gwWl&K#EIa z6<-Lx#ABo|+(|Z5j$G`8b7zuk!2GX;_58&?i0OyUdi*G~z4Lq^ca+dKbe@mufYm#+ z=82Z6tQVR(D|UF|_LPkQ865pe@P)pkg;eQGIb0hpjHOhDBnma15%3V)DN7E5#fd^+ zoQNtCg~Jjl*^z{Lfof7wQ0@bsV}wRH8=cH5ebyMSweB@Wz#R6O!VF*daf}d)nG;W2 z8L=h;!F0Q4xNk{s$-XxRhwpT#JyrLXE&8c0sxtIKTGxKfPn|QC`Kd1SqdU(Y zzFFsbHk7!)iQxh!U>qyBy_P}Y;aGttuWvL?2t!X5qgBWuEt#jPYVy;E#4=83Ad$`r ze#IZ{^3DG`FCz*Mo{NG1h^w*mHCLn44}ZbcAf1whCw>wWv`xpUYA&ov7Ye0wogiyb zr62h|L-;NP%YM_dvQG>zm9;Sn8$E*`t$M?Ge6*6L{3&zIoZuS;F-gNhAnM0H&T#PA z=dRFihoB0bygHKl1r4PhVNOk}R11>@tMHW)|Mv)U305sy4Z;qg35Lg4@WqK@8m~gwgkoS<~&Eo(UoCl6ng~Z)61Eq8GNYu}QPU4iF6PXpdt&wB|&aFA~ z_613EBB5yZsd%vL77pVI5m6pS-y26o(yt1CqBtXrlE`1U&~;GE?C^V~(7pt_;CGAU z&;Jzh&e1I$rWRD}ZfS6(*~qO4q*8jn6c+8=p#~&OhMdflp>I>?sq@ zJK;){Exl6FgbhJ>14Z-&;Y0Z`30vn~pvZyL3pmjn1N{Zz1G>~JwJ!im6~{=8UjOoTK?y_T%f;SZ{r7l zfD71~!C4EWN}PCy)>77n4<4a!vxI0K2|cR$sUNm`J#w7;fOyNquFg)=@3n*T=Vy#T z6+B;kN01aBlP=5{?5BVF22S2%GSFR2lQKXQ8gY z*br0ymL696f)F4E!9;&?6#|9S5W{JCj~ZelEFV`xJc)1P0{GkS1H?wshZ0cv{Nh8= zCP=4aNcSz~(ZrwtmxPrKT%q^wOVx=kP&7->IZq50KXERl*}&rKib{AGEXE_bZZ*XV z_|v$SIGcu8E}*I}wt(BU#1k^JG_)$_EGYd9e4wnh=;tyKpK(uhq}&Ipg^2GOc0 z@e*RIlwvGKGige(R1!}<4HePhjf0FZF&Wb@`_>Ux(FJ%fC~6?qgkS22KJ-yR+3*Ev zU9pFx6nfPaCm^Ap>x$R#M^jIni%v<$`l6qNvk}1A_^JUiT?+XP7<8+K3_7$CgWlRm z#B3^NC<+%_Fjhl3tDcR;mdI+?#^TrbqiZbo!pYm!zwP3z7Zml9CEnrIK-(K~u zNYPv3P$|Y*lC}GkaPYoKj&aoct;FFN4(eNpO+t%a4hKDLOOE_Qd=?JkZLnexjRb48 z7V%mhh-)p4^@m+k{)>@>IU`1<@#)Tc*V6P`YVjGcV$#KD?6)By>TDX8TxhlRd zvA?gz-{;0mkzo?y1c+*D!|>uIFGB9|lGL{1A>3~Jw4Kv`TIgB{GlP{8tN@h zt)1ax-#c=%jacj6krcn~jrl;V>73?+f$jNym>B$<55#O&Mtge|{N8^srqu4kiR^HM zaM-J;F*|t#M~Rg75y#M(>F2EM=Zz))WblV#O^I`yYHyXS==Z`fn^oFJVjX2YU1sL+EzPK`2Un=nu=A45{jjJ0>L%U8jS;!c|qu z>Z1oku;ryJl6!RzW6F;AJ|s>1p$MgmUXAI*{{M@;lYcn6gZV?aYr?Wy&1In;&)W5; z3&~~iJDo$0cX-|1ocv1%+eU@?2$ZH)Hp)^f!zKN3ieY;L{3Y&QC?>9TG9T#xIn9NQ z)(s1j?L{-XWl=ziM~au7spGzJv^d)4(vzqpF`K#bufJU+fji@{DX$|;{^pMnV!nS9 z0kDQVX}Sl5ZhM#rF((3@an0fUh2FlHQS=eC8zy#=rr`any|?2D#$jS(dp1%RmW_1R zFtM(3xGjq+CSqojBJQ1=Sz6CH{BOMg370SWyUX|zIc}eQ4)Gr}_JtUkpNkYzeNOS} z6AqL7_Ez=b##X8_=har#P<#}MY2YDec5@%d9xlpdb7&4u7xu!7e-J2D-MC&`<%KCn zONWbrHU4IGPHnWIS+r`XdL)Es+BtRO-&)n>A#~|On;2C#8Nk^iU~{5fklrpAxAVp zOqRIU8rWB*^}JCCKLD@hjS_2E|NCfi9*6#JAzNQ~lN^see-~pfOj`FQ7bIna*wa;# z5AlyK_&}=f#759}CHkZqbktk>z^awvFxipSbrdBu6-zCD$XXch0a2^OP}kKvORFem zOJQm=2I0RZBRO{T}`l?aGe!IxW1EDD$`g=Vb?IqD)EVMw%$INS*!i zp){5nzT(;i)PaEAotsQttT|r--ao>%rVk*yklUf`3r0} zTXp+60+PB;?j7*x;2Q*&9f)`*7&HaqEkBJ^Wp#e+JAT=PpeqzxE1ng~Rf}I0E`sVsVv@AC3QDWtJ^N+Ds>@(Sk=P%1ogNj5pCJQ-ip5#@(vtUt!NhOX4}Mip~G#*Hf`Crv5?yh28V{D@`L8JU7Zx4W9_cYV{?|$ zIWw(m{hCm+O$>G4b1Fm?ik89!L-U-?)BQvCVa{mhFek;|taCcX=*$*4(|`!4|LE;# z3$mw$;<=rVpzn5!D>uWp+r`F`@o-@IM>W8_UHlu4g~%OZcl6#oAx*p;081`DtOe>F zq8wj&(N{iDvIG5Z+*aCwQH&F*yAvZrY<8zz;&I835U^WJ#h(qk#m@Nh)@~7Zyh+nN z;y3glkRQZ<7v)FH`@}607dC~!r~_h88J{rZ;%e9!o-+66w??v)o^D4 znTpMC5c$za|AmD&;-RcwH9zQGDn^kDN5z};c+&5y>+!udb!DqA4WYfiveXl|}W3G41yK9CH| zR9kA0!fO~h;E9l-cP(9TbtdK;^ShE&Ac?YsL+wiOONhEDI@3`eI>D^Mbl?+iig>Ll zWb2U1kXs^^)Lxw>3KI94{Xu<8Y=<@7yoJ#pHt;sCoemnOEwk37T6F%-s+ z{S1}>cp=+{J8tEo93=GC3%f%rQ=M)L1|1Jp+!}Q-}$Z-m!wKp^Q`9RG)iyYKH zn0MjZl)I?!0FzCYCeY)a=t&a;JFBA5jkMH)@9&9p$zw`Kb2#MQ6L;a_g)_#cIpLNX zpuA|_h?4I3K%|LlTY&dQOEjn-h@+76kcVPd6f?w4HB&h!PBo*P!MmMhBBWm2E`!lY zW&$xUEL9o7w(#OMO7O)rGx{IseLogwP~_4X47p;4c?Ob9c_My_VvmvLe~*g?qo0a* zskGJ3`R|~#E2p9$yj=35QRFI@{K1g;LxCLTpE5^4;%u|C6x9{w-W+0Yo4ru@p`9&V zp>j4>hlc@go7*D)cspqqi*KfDek8t2DmQn<F6ce5MrrzV0q%4OqfKb#Ts-OaUJ zQ-7+7qWTz0KQgo9d6n+w02Emzm|y+Y0y=oGf)0z!5jgRc`sCNbt(K@~=3u(M=N)f( z7j7>yzYD#pnYSa$%^0hQin+nKsC5JJp$2lL82XB9~bRkiT zEbmBQUv0A=sb8DUOn+nxODr~9NY@RVN-W%W^V9Eqqk`kxN%%5LnuL55X2yd>e?&38 z*hY~$gOXxnw&jS`tm3M5=1PmzqEhS7YL(5H27$66P5_xuxXNNRscon=jb3eG)>N~` zLak}zwHB*2eIGoU;H<)|DP}gNmK1MjFz%qn2+e6NXt~~k=hDDqgJm1HsdQfn&1rLp z8-X+EwHR|P=oE>Q9<#1prR%9-^@D1gEYxVCb;ZeLlf^@_Ec22$3QU_U$0YG2b+hFw zsxZ&DSZ3hrF`8K=x3F}UN8?%pVnQ)#1N4To=wEY#+pbq#=XlhH1P7h94^=XcFDnQPO{Y&EuBxt*;AqqkeW zk)pcVgzN*sJ1kZcn~KVU)-@8^Hy+~Vf-55qBU=|jW>}~xMN8WjzV5>RpJCzVwlU1_ zLCp}_Txy2V+|nPkv`rzmD+5Jy8-}9?Ep2$_OiN9hwOyq5WIi!k+YlJA%MwaQSOtT@ z?`hw$xY+=2TNofg+bg4zLc1G@ndne!BKKIva0@&E1%bvl01n2QyJP*ydo5NAOkD&t zzO_NI56xMAoOu{!?*Wn++B3K+p3TKYAT+|1X|%s>;aog3s%V7U!uNAo1JDxF*xzP^ zqw#;VzZ3&aZ&MFfOl-_TA0)L7tuW;gZSNj#aT~&f`IcVD9-3Y3r}-Aj9@^g4FuK%2 zt*yfV2fku^YjU$&4_?Gt+^x3PE6(z!?TwAI{J!l?JH!gm_SS)dG;B&D>`k-0W`L7G z+0T3xS^m$gIZS!$uNYk@9B7^VqkjsQpJbMS1?~yt=WqP--k7RS8!$n8mmRFt%z4Z7XmJRE#%Y|HB}wIi2|BQ2vcMN{ZcrbJG8gNDKE8 z|I2|E;{HjTMJ>TdXyBCJlX%WDxBugaYmpSS76ty_5Mupuz|$6Dg+MR2eCwod55YD+ zx6Yxk)yt=%8t zYxnHctDmk<{`+h9M_yjLFZl=8?&Zf{4OOhqEW&za1^=0KLHrs0n#j84aFVmlUcJip z&A-2p|Ie}g%WG`&=Qr8@mj~eg9NWhnY=`zf))?|Pn_Y3|Nv^W0DpM7Ho0rmF3 z$GzQ|`iDCRhV*~s4uTv$e1Pjl|L5cW2e%Raz{dWy8UO#W_vHamRqg-WJHs|04$3Aj z43aCdX}P8{rkTE3P-$f@X#1w9m2bHKLTRqx!b64vsf9`kW?oI0{mzU#DygX{l%**t zq?wt^?>Xnr%7Bat_`bjI%Rj@JnS18B=bmRd&+>UB2d%n_;19th&yvOtBiu8=p}oK8 zCn!^E_C%>gxi)eX;hw1`X*H4qHp|@lXgG{(Swf6OV#<6FynUU6CM;V+q6k_JqX<3> z=jx9>^t!x9(zLutg4Dr~QZP(k7DMx!#l>t9Chc{f=EqgsEFOSG7M$#M@fuQ9%|gZa z7lT%u!r=AV6}L)yyRGpEW#!_WDU6tDxq4_AX8%3Ml=O7lFT%H7>Dzv=mMMwF;Oj38 z`p0*J2U{}MLr8v-d*oycZNs#Jf%%u+U?E%5)ttvr%$9^>@&PNCfIPcZOSp}n(Yyn# zSbqFcYs@it0eXo_Lc$Ww$#O#Wpv=RR28VYfKe5_f=85sV>cJNfK48}^*VYah2|mQf zNztc)dG_x>`0&X3mT**55=eh+v8(*@C&G{2z#l_bV;gZvYxhmNg6X^i#3ilTI7}%3 zMG09Aa?u2=L!b1_bCA6FaW9A))y4-tS)WNVJZW7~p5UtsIk(>787|Bx&rs#Ydd-$X z(baYXx!J)b*>&eb7}uH28fqr3GnqA`+LbK0=fDkM;HEG4;mhb2#!!Madh-1zrPS~(TP zp^F^}Gq#sVVgIWoFG5oPVh>R(DUI!nfTY(-BH+y(B>_STMLkg-`W(8#_?;zv>WueD zU_{@NE;WKa`|Az*00w;~X1-J62bUzOW>7d48@`@Yl>Cf)9rGz@7$_Ek2b6ThhjmY} zpwGCEVllIYJi1!LKynxtjkyW?2bK7+$PMNv_h17;rFyJ`LJ>GpYPU)C-CZ(tK{p^iZ9ZVYA@nG{KRro*IZD@ZQd9TbTQdyEQG5uL;={lA=r zwym&a>YWuvT^VTjK+K}3Ve|+0e<}lw!wj^QbqoFJEbdbC`aW1u|Hl?5lh2NAYpCS2 zfB#S3o8>*=S);M?&gyUbJkHKu3Am#(I7dgzOT42sPQ=cliLmu0WdFC0Z;+SVTH~imDI^!_utb~SLDjKhSpd1TdVukOiWaj)W9KY(1b&HL`0YxeoU2Ff*S34YBK z{|m-hYkC?v;q3lI{2r@_S10YNk$o`@BD&};6+L@RX=i(F(#}2=^0(+)_W4`IHPX&} z;|3di%JKXoh| zKSc}2GtzcB_`=4tQ_wh~y7L@+;_okutKo@f!W4rn1@Du?>Y(}_^SBzG+|W~>_JyZ9 z3uI2&Qfa$U=vv1{S~tr5p*?e?sF%p=dIM!Y?f}n?0}nPulY_kp8?P$cc@wu|5E1s5Tt>5BpEq_|Dz}$et3OLd;FOq|67n z^PMGKqOz|3gf6?o;oWDgtIzpHDq>g=g*+(1k4)g~jlk0{*l>cpBpj8{BNawnLcMpB}A@V2r$guJMG33C=I zQq`nRGkUa+03*mxsD^`bE|#rkLP7_gl)lE4DDuOpr@t1ZM#JL(s561~#=!PI!g?kaTujC6I zDT_V0SKS&CKTx{D?{6yFU}jEUGtGQR_>~vK;x)QLCY~F(RyT%(O{-qfrQ*f1FLk7J zQ~o86u;wpaP2eYDCMl-isPLSw4|j5sq8B+XWpG*{ngvx$)ouujkXLQ!4~2eu38qx! zB`TJ&xVF{nRWVTYrcR3Gu*_S!shFA+ldb3r>8msnb9v;Mv(0HqP0aV|_Aq{`LSm{F zET64xZK=~wpQ>m@+UT@RQU-!%s)E2E6m3*RLR?RL6xhTgNlEG@eKXbMWlFW855%>k z3p7D$co^SO@70h`s&nW|{O3G*lR2zJqzyk+G2Vam`wD`FkWirf0P#>Xq_L`RYfWD$ z4N$p@F$ZWPgsxP7g73!vZFnA%U(ocz35s4)_k!HEc+XgU>2CAK~{%#lInOwBkqK8r^!<-rzAjA z5w3_jrC5ZI0on37SbRd4An;}v$lZ%I%9KG#A$9UXg^4$5A$9da1(q|KxUeu$=>y7Q zjSN(8V=Xgf#Ux0qP`JUQC5mbIM#?;OG~{Se2&kqi5sY=U$`7i3R){h2X31FtNq}np zoq`Y}AEqWn)ySAHL-bNbg20`mavd2n64F}0i66M|o@kZK55GM5Y{t_+02IQ3|J z3t6)jSDK~x)Wn(tAbFI*#FYdZ1{tyqTxhiGBIP6z=xzz&yfZ5jt?IRiNlQUP+p>sf#y?n!FJ5p zw6?jE%ve%`8HKTh8G}$cUbz-g6B=y!U)<{TiX-l|F<(V=K|es_;3Q(n=eTkM=i*Lq z_a}Lkd#~8BBo3*%EZkzpl4f-|0#phmk(~7~=dG106La>>0#`oK#^O9?GKx zIs)}0K{Y^Dd<#x}u8eTtJyef`_YPL*OiIzjb_9QkGFw%#A`H<8D4&%OK9j-75~~)> zIiuUkAg?JDl-G)WMU|IN6kq@hEJY42AzE+{wmeV~Bqmga-QmD*d@yYKQsplw#r{|W zuYMRmq?++@jp8{I`w{mo>O;zT=XJ|iTsP!5;;%(kGigB!m!FJrk|h+OHiKDZ)`Mi`iwbeO%MLu2_D2M!WSwj#@|w*;y4x-} zEDn6n9SV{ZN-pe(BGI)r=A(#w#h2{(42P7@iuR$w&K)>u$8GZiaB~~g%*P{fdv$(#_=)bx1EvD%m^Wi! zIdxu)oqzkfc%W81avtKNlzmVDItiBAoK;dM_k`#@HdJ%!=ki!f%If_Y{tZlVrn^8e zwf1*dPT%$v-=n;4U{WR9?FF@IOzokV4-UNtRZ}&M0`Yp^+d{%wDbJXtwcQz^@mlN7 zXrjIBWFgo#E72AH%I>6+-HzHO+Q-gO3;Tj?HuAUDjciA9V{c^VXq9ZWt}Nv{VN5qN ztz^G?L-7N=CsSI4-2KUDr}@xH^1rc?KPBc^IQ;&QlHwfLEp-#^W#`gmU{e>H-La*P z-O)rFx_*-7(MlSDoRF|N915drS>49o$o11mix>;7JArOwVN5nM$Hwe9XvE-wA3by2k)m?x-p5&xLd2`F~SCL6*@ z(w8u{%8l_|mG7g=s`_R@D~P)y>jkonj1;bW-S&gn8G(<}{tZjRm5-4klcG;%jE85# zthd@ATk5{=5gr|EiYaZ=IeTM4J)T^K)@ z9a2BZMO}5a2S-ZrSM&}Z*aoSeXsSlPtg+6*n65KP=IvB=(ZK_Cqmp=_ywP)8_KnHVgs<-&zl`kB*zzP5vl*F^lhbWSTs+hr(w}x$O$!gK-#;g zrS23U#UM-vh#aKx@N`9jJY{ZDYqZpxAjqTNcQib;QzPLHPFA*Z2+)|qq)BjQijug5 zX;^0QRORcAvC`4gs596ci0P2IKuvs@HA1D45G5M#3Q6xPZ6h*abp%Z@UP>Y|4>OP` z!Egn-ibtrQVPN2s8XS;-X^O~0Y6+QQaHbtpeyDsEmt?{o4D$?}p==J9UeQY+)>j`4 zt3Ohj+{S^h=Od*hYJ*>U+%BN%?je(4z_FHyDn2CJh$;=+c+Xav!Z!9{)%m|!d{<6| zRfiLIZbL*=soTm6Hm4{z2?3mb@Yx(?20o1NRHezGY!0h>U|99fRONiKi&|?2f-+6{ zt>9L^_pmC)be;m$Nwp7bXs2%j$qDK1f~z@qoz<#oB7y3h1YoZ8UPL7nMqF|j~Mcc>ZE+5XENf;wyTP6u^NoY&;>oUUJ+ z8SgQ;_O)`ozD1O{whRIsqFK zxx%E$>jGfEToVMbpXj8nhjktx}G6 zP@cBg4Uw=`qug!QpqSY3x*Le_C%tp>u5`rSuri%81WAe2(Y&L#b;^qfyW)y1jPiCF z0%6urO)rT4OY2Kg9D?A-p_*o}>OA(_sNyj!`wq0zEA2BL()DKjicLs|X~KkzhZ!)$ zpbT+KWpHMHp(*GrgR(7hE@LpPfM_Fb!FY%@8v4NJT1_ji+b&ESz;{;d!gmsPD~Dqs zXyuh~s;#D)p(o$`gcX2kbLE4C&PdiMu;O_?uL!B`Awe&Ki`p zM;I}$L=svrI`cl=hXGwdi1BEgxPMdcGxW{$4p%P@`cGzWOU{AXkmhEUz9> zeq9e==Uu*CBQc4z5Cxy326uSwnDSo`S%`MbvWbo3cD%ze%1QSA@uZc#C2Oq8vqE%a zddPkggL}LsN1GU7ujG685e5$>$qm@3r|3uJd$`3&Unyn}$WJN9`=2}LaLvh5?%Pw! zjtqNlzxfJgDD|5J_@-SCXu9S<}7v;2bD?Ghpv^#dGl#YZvxvs`~SL<}K z?6rds6QS-15qVV3^vh-sPaw_>KxeYIJ8}q)0483Y3xv1CmVD|e6C|Wsx zU~s_+hl{e0lZ(zmj!v}>9y_P}skV5udZ9L!%{^wG)Ax0(>^>&U8B%uIVa^*rk~#A{ zMeK~OP&HE%&uu!dydbJ=W+Bpj!YnW8Ef$}kb_X2TtD508?|U>`f@ESj{=BNEI+ESc zn#+pOi;?wG&o7W{OYERsTml64K9VuakK*j*?En=d@mA^75md1K`o6suytbh{LK! zMCbNnxAA9m9dY7?hgEZN;)B}YK!|F`dod$(QY11a5H?G@yTayYb?urR+2Jbpm2b~% zBXdPGpxI@rDCT8|d8c(Nh+3|4!)9zrAI8#T#`xu`KwKy0dsQ8zdBMfysx{0Bh`FJZ znQnUme0@aK$$ZVpc4tXnr0EICjH(@~pdvSIOPD)R(H`?&2M$6-wW$M7yQoQ76-}_q_0Zau_BP=b@`@_H$8V|9X6dz)B0iL-+JXIv=HR@}< zDd|<3sTmCqNmQfo7vvN5DR60%J^+F}4BpVrOGPry+GT0_z`wsxwtz5iRc|u!(}g(k zN1m8oRsgfSRUac0j&ujLr zzCAp}qsF~1RSm)|ll-mT{5TZOPWR!H@t!eD&kqhv)m4IZ|<*A0@f&CZ)SAyP#m@H9fj+=l9u87(1tny4F; z-w5dLx^)91oe#c$qmdmCQGY9k4*Tk;L^@wIB-G7|jinv9*;tudGZ&eQ{HH&qMEA|N#jAf zs0AW&URMUQ#vfqDb!9tO1^FVZzD}shQFVBT34*fg$^aIF+m+Xq4@nlK1WGrNLxLD4 zgg)*Ek^d;)g~#HoxjhZ(yt&^kRMWK#Gkd5=s*gRZHpof%eo5^s`OLc8W1h(mhe^Fv zv?kFZ-q7HI*?ZmY)DNCzC7XHt2gJnfPsz4VJ82?m=o_bUB8UbdgXk^*Dhh$pPlbwI zE<_WFLgz@9WLj65QZ0-fscs@s=mgdOQdtYK2ROfxy!8NGNY)LY2@UM+GT`u)I#NGE5m{8rCK&aQwfNAqwE>(c{R0$B;x^#h3W#|%V|vIAM`zx4i_7rZHnRgzaL{d|9>9QkB@P$e z*ckyccWV>j+DED^cj|AP_nrCT80o5D<~w?A+bosCwF{Nx2Y>JowZw?1_AxAF9q7*G zC{#Z&-0>t;K4bAJ_S0Zox=xp3R*9oaQF!kSNS~paXoVV{R~OW97#5QiY8{+@xf((s z^*-jS%$~wL*S~{VmC5_KSMP99F;6b461|I>(C#r$s+NMHxqny#(c^gmaZM=>7DwDSne~x+^3v9iO z=-iclhy|LrAm&5$5C~tQdX~5tEWSou$b0cMBDlKM*LaI@^fk`=?t%Im_e0!TExGF{ zYqg)6ZMb^s@%yXEasqI#)Tk zU#J|s1))XSJI0sy+Y}Anx~rnWzFgv0s)@D4mlG9Zi90Y7qNgatEN)wCq^f55;Ai_R zi5_Ox9|=o2l+OQiLG@rF&A5Q}m4l<8uv*oFxFPShe2^w~SepGdjYYSjNbSstPsZ8k zl(|-&LSYxP);Y@fwGmu5z4lKAPVZ1%tWAF9y;&eQ)}C{#y8PHL3x`F0wGCXUdz-j0CkwfiI@OX|Gu5baDBonBD*hK#IGaogXZbdVsfxFf z-v>_piRwp|>$6*hg@LuG92%CoQDjyW1d);{ve6U9jV3*TzfAQ+k)576O!Wjix2~WR zuGzgP3dBFRDhiz3At;rwrY_z(*7WKE7N1r%BjKofQ4@!$ znji}iG7;eeFy!P3AwR2H-YFyLuvKG_3ll)m7RG<6d&t>h^S*$3L(UC5he0{VaiGA%bl)Buqi%oC>7E)E;#2@h-8lSB*m!8Y~wz5Uah7% zVAoIclp8kwx6?O-Q=c8BO>?fUpHk|)NVcvn^=}H}CO=l!Ppvv*LqAXK&*qJZ5E$CY zb5qkI%Lj0tuAf%2varxgEwln8J|UGbuy@Wk&6b7gNSza=n&hT+af|#8gbQo!xDlFW z_c}}T4J*;q_g3If7u|lH8{2j4+ycX-VC#mE{6h(+%liPfu(Qj1-F|r`!kAD^v#BXWy)=@&Su!{i!3HN$+uo4Sn|eY z4)Yc-jeu=^b^pMCj_PZyG2MI_Y4*pY3zr?sbhvEqiU_W-ziuqUt?Z(n!dfi)dNa?C zEweM~X)YXn>up)pXAVYnd6vbfKbL8?#HV;X*-CUSQ!vE?7Orx*>c;00aB#5h5=@O! zZ>r4*r>1@KO7n#3oSVVyO4BJ}Yo5b=Cv&)`V$|#E#`()$Wwz&wJ}C%hR@vC|NT-lx zhCfH_d8U#}->*ByAS4&{`0OSgpH*hxM{XZ=N71om5#alg+PMrXE-y|ug3NX)91sq#QGdR2b(f8{ zmK`-i|Foz_q1>nRpKbzln>A%wcb)s!M0G{2!VaO^VnwCbx= z{L61SOjdT2%X&?Hoe`D)V|!6Bi$iivKvjx^YB`e}!F~3o`Zp)tM53x&IQ6hONl1_U zqdmba4y(t{=>&z}rVI}G*g=?IOSPz!0)h1aV zo9CMF=B;4%W7Aw^3mxXVF+YMUnWxh*T)+3!UbW6Bh>nJaYyvs<;*-w8u6XL zceNE3|4-9aiCU6}n;v)9S|HkQi|#neDD|17lWY^6_Ucy>)LBtwJ&rH~<|BxDp4!p| z-oNTs2dRGM7w%x5`c&O2qUvXhw5K8&hg3r(pLdw+$~ms}m+Ee;DEX}A8md;vm|m3r zyTe6kmE4H+>Nrcmip&7 z`+GMC9l7B-e0ronh4~$d=4)dEbeA12+WH56)1X@o-xR8M)OGR@ZLhM-N6s?r_9{AI zaOGbP6E43>s3?PK&hR)CY6HBusx9g@wXVE;T#1~y40&H`2;g|i=U8NP84f0E;%K>x zH{OJB5Fx*=?x~Joem9*&@&%QF@%sgiSwx*Lovg&>J|TNpB)pGo3iW+5%C|8Q*zl-G;#qvwy zdyOdDV$t3)qI~Z#w29z%NPXEcCO}YV%Wx}ZYdS()nYuMrmDB=7TUPuZU$tB#mV8gZ zm-b=g#&()HC-Pxjg~@5A-Du;I6b=RHha3g&L9WwJ>PLv&ar8TJ=yxh&MCk`C0$ff6 zEDovs&i&qDy5(hDpR?#_7UdqYToXTLRWOS~dMqeB=5Wp0qun?q%cIBX@CEf$=RHoM z!tX7DKkqn?C5twKzk~6FgUH=}oQPbJ3nQc)sg7BMHOUWRjtRp5%qfQp%YN(zx!(LG zD5$R6?Ib#O!ZM%l)xU$W-i|7hg+DvYx3!`h_fB*E9fte!in@2*2ZbxA%tC+4wmHGf zDI1}W#0x^7{3;dte-NP`$-w#`egl>`lM+WPajsqR7k+;ilE3;NHTt1uKvles&RA3O zlSkdik{`kDeWF$%4e@KWga!xkPqygYiGQHAiziqtu(Rrb2Zf1z!&B3sE+~6YT^C#XUQHmX^WQiH3~@o(>c9?K*u;2sj5M|P2<{G0c4t}LZ*J*5jxFa>r*-?E~ueBrhzSTVMF@DXzl*?b7Bi}Vc|J* zrK5Amg|MiThDHt#_Hv+FgyJ6Zyp`!_Ez$#86H)FQcpJ>>CQwd&cxS9WJcm-MCL-H8 zNHKUf#)j;ltz?rdHUEPB4hpYqFW0ZTW<{;18|o5E-)+`(#KIu$Ovv%ZyQe0}yEG+= zXgXK zs!+poQ2q%|FZ}m3zj`L%X~u97Nq$l9{4-ID>P;- zmg?aeip7%8yaTx^Y!pMw;!TidSx;yPq#0Jk55d4hPG}DqmRg@sYrODQCk@jKG*`iY ztRjxazqsCrkC)MZE@7mCN!a^_CxNxntFR_y(51490@^K5v(Bw<(q^ggc zZbR=67J47Z5<5w9+nF{bAG44w_&^GFIa((M?$?=`+jp=|csuKaC)UY6FWv8vf?;y9 z3f8A+BGG${hRIVf=HPc85IIMa#Fp5YC>)w7h(m^`A@0N9f2bT(6Hc&B>Q6MoQKvnsn5u)IP!K?Cg`PwuT3MGf$Jqd?VN;CB!c24>Ld2oHBif zL-S<@u}iFBFS=jmVgFer32NZ5SF0^>vaZ&elOTSHul!WG_Hp$Rmb zFtmFm0{M{cmFi4t#}L$>)UbReR4i{5=82JqW?sQEF``@`#)ZsX9!w$;2)u*OVYaub zEqqkMw}+?^8h4O_8#AI$z-nB9 z2C{DO*K#$#;se`!nePYVgSFkDYKXA~l;>%l#pj2;F+;(pwYC$;p2szMI#b^THhe)_ zWio&AW=vO8tFX4vf2i?EC_k?Dgv2!(vStYJ+6q>$(Y#OSy`RpRcE~@2p>Z%LYgZP| zSv_!iy&%b^Jck{GYYH-*qaf38`5QDDcMxOJgZ!z+*~79i;6 zUSA_NnU}^Ys_H&%&42?>Vo%T1`#WuMcrg2>)`QkEHXXOj{T#2Vt_f18zT;KwHiSou z-J^NDp`_4Vov~7DJ!8FncM_(a<5h+EWYv&PzdM{%>X$LU^MfY3*1!eLB&+<=68)hee=?>aqZV{u5YSy{QCv(VMZUtgpx)@^n1P_7OT%#}iQg%)1lfTW9hmf|_ z5<1Fw5B*rbF_Y3?)qus!CUYR2L>G8TITL0s049w7Ze zyA;2>>35AML#BwX(kP%X($z~8CugDJfX92OzNC0u;9W>{VI z_p$8qoo2M;6QNw1NZZ3EW`=naDW-SUPY+9@D2dta6gK&l*UQRRgrx-Hbw86qj!sPD^ zg4=Fd3PDYe5PjXXW~V3V)PM(vXc+FPHJT3&?@F}8On{$VGQU%ha|(if5=SfIeMZ4> zFKr1zPKyz8I`)?p2#V>g-Do~B#Quut*Cq(i!asMmh2~#ii(WGhs1M9*rhUkKl;E3b z&0wHy#jX|{&?q0R1qbwqkCu2q7c|$7Vdzf=!II|MKoI$A-!Q>_wiV%}u*g?y@q>m! z&lcJN)ce^VwzSZiz&*pDpg`XY5|1o$OrX=Qco=XK&_4S^`h}emg#0|{ zr(HssB3ly!FO{jiU0r3Yw8p8x4+_iF0huotf>1~x)~BUa@TbQuFrS#NSE)1OP>1}T z5=hZFOjy)FP6v{cI}Wn1*P4CZO9~a)7Ep6K&6#H8m4PDiY}-9`ZXluI!6~A7;Pg^6qHCI7S~vPMDK3d zO6-?SB8;1cW9!AbV{#AKrUudHdhwN7o@--pZN1b{=zzjEg~vlV zle&8rhtzd;F4N)alPfqbO?ym)N1pU~+E6_0)ZR%(bZ(i&V@A5vusF1M%tDv1cJSe( zt+KeY%2!%kPXt_xSt+=)%JUp9D$OMqQ834qux^3&YMt(^wW}?2($bo>s|9~n=}L!N zT>hEh&$^abhd+y!T?(Jp=g`7$)#cE-mMJ*20_J_`a9@RMyKyC-s47@)OqO_G^)HDkjgyuZ4>!__fHLQ@_^T087%xcQ0P8dXXi`UVDIEt-6sV2@BnwKZ{HJ zQd?gMP(MgmscQv`Pv{cR*%Un*E8cVW7E93MBtN0*39Hs?Nkf}kD^;eRYGH7yS{q>M zsfK;aPO7}PxD8swj6-+UO4@(4;*{=3?9~*a5 z$0qhPP3W?347_;RT2b2Yr!?pAm?T@Q>WwO3VN4XTkV&)luke}>16fzOaJ}|SoobF< zdj*R6=-xvITE%OKU3>-PeRbpgw_bOcDgSS7#%_EN?AE``S4^4sMKJT1aE0!s!xh_a za7*@T57n#KSlx9pM;j=7ISo@%g+6KVy_N(sruS8YbWev?r8&s-@>Gk0D^9T}BLY3l zq)=THP(07!qJp{I;B%d7HB3LOt*TSGC4X$0k3iNi9}Dvpq&Vods@vg^_nT%CTXqxF z#l~8KHMBmIeprug6P4WzhnOl&iDR^89D6gI!;id};4=#y?rGryvJhrK%+BRRxYY%S zxp$sf!BM4)Lu=tGuA-pf$n8@NcUO>@BHi_HxEB>yA0{T*bE;=_oiHHuAo{e`1Bpp^ z=zxrO4(SuM;2d?(t_7t==mbfSYJ8GF38|-q zD{{{`T(SITZgYR#0V{M^J$RIIrlJ-rACU;m?^7#(?*-EjSgWgJr3^bg}+fmmDsdcabX{tXo~H8B9RLL?czUod(Zip#aL&IJ4)T%u*YS8o@cLOCP8pK? zG=YhkDLEG|7~A;M69`a1{cx4J72ypGS4p0?$+B)dT(LW%RR$m|!@XF~i=Nj}>)Bd9 z(H%lw)V)OV(NopbaQ;y650Qi?vunr?lykB9aV8{m;BEaw5{PbJBB7-d+`$e!ZF!8& zA^Voc=q6H_8y%ys2%6=I29QF4crv z=?_uSc!#^8LaGUcm!kQJI4^SvYZRrg>s+B<3#|mIqOk+-mk={a5eS8G*qmIJp_aid zU#%OQdQC^1ErsXM#YW2@@T!F-JDVbt`G`C)^(n8~&>sr@^d$8uFHzA3F7)8#qz1Gn zn|}%7fF~6Z%v(BBQxp59##zfOkd^^(@-3a&$5cLB>Db<+I$J?;EoonohA8!nfaebx zT7Yzuj`SA(Pv~*n1|nZ5c8A3Y>7kH#8GB?jLS?)u{8@hrG7aBN`oPAx&7~U3qLD;p zx^Ngj0`s-P;DZsmPh0qr7Eji+WTQ5mdvc<>GqykYP`AAfaT&{&sm+Rp`bX4M(FB|^ zI4GK9`f&K{HT5-a)=VA4uxE7U>(u{VAI#|Jb#OaX=h@6k!?|7I1laOrmOGcM`^4G4 zT2~B?8j9k)nBJ!vYV9Eh4YB;7MMG8Xw^u7w`>BcwxbnTjRpn*jfIye4A?;%wL7A?# zWtM2`A^Qop9ujn3_Hl;^b;r2kdAj|z`ua$0LzH&JqKztA@WCt&1#PrVJyWvZq>bGE_9vK}9s-feXd9V+WhkkB7#22Igz297&9E(n7&DFKW zE~O zOsQ7%!7hK;%r6cmNDU9;i+Znyd{Ui5U*bRK$(zh!r3ExNxI`c38WC$le`*MKEbx+wHoMwTeFy(PsJa|Ee2 zIn25BYn+pdEYWpgS=C1KMN^_T1~VJ!MgFBl4j1VPxv?tUlcWMB=iq1&6XaPRP9|Hr z$wuE)?9@$S1%dh=`)zC7NN@VV?UTRtf#{5@?%-1;@`KAC&v_Az1A3ScrI~yZBzz%acC{>g53k8xqTP_Z)0!WRy(~&pa>J5>X%so5zZY-iU$n?OKAm zTnoac;#&(+TK#eJobS~pz0nW_8x=>@w@@k|;Bsq7F44XLldJF)NozI!^MdCM=>v4` zFeAyd_pm|RYo@~u)>Q^9T|g z6%JFTFDJ541u34-b%xxh{u~IWKfLVPNyf_9ZZ2MOmnT|FfAneZiZzWgmq9MQXwzKm zo$Jxu3(*ax=A;Y=VTO1NAz%k$X*?+2e>gDbEWS71o$46rSCG<-2>@Bj<)^s*XVq@Z zx9NOmto>VRCXdz&E){fFL6!q~xxgt{zSL=7UMyR%!bWwOLiSWGnLnUv=~#|~Rxqx% zsHL^p_PS(kwxE~Ru5q|(`4?P{H-86r-nkt6xz6PXdTH-h4s%^uM<~dGgF~O%>x^V2_FlR@{wttOtCQY`R9) zj`d-W61Kb-75Q*`w8hb7_y9eM@M0IMytwQ-y;UVvpAAN)+%%O`gQm z2J$2l|6?GxH->-TId|f8cI%q@PHVRh*l6AQPHPBKIsmGs(xTG_0ge05_9QkIs;TqG zIQP7oWeSoEJ73~7<{D(AOIkugOa7yPWs*=<5Vu6r$-g+|E_ab`gsPT&D`pu;{P?c! z@JEPDBs~iW)Ahlwhkur#j7^%ZZv!9r@qMuKTA?359xWlMKcB)p0~LpRwS?2gc3x2E z&wHS}m4D3#fhzfOC?qp&$s4i{^)dJoKk1P`xc!R63zE|=xx$AZ>ZgLfmBQkOy}xj( zZ(M#){E?JSyMvK7<_%uvvvQ@li;GJy7k3O1En5kBZFfJ4-FFYsdC0SuK=rAt{`ig1Q=j&gq}y9HrZM%>syok_1`%EKmK(Ugh;<{~ zz!Li#fOr1I(_&Z$>hIBHYOE5y6p`#?Ou2824K;6o8@0{hvjdgz3v>@ zlKC~(T^L)}ef~hJkZjs*@7xVQ@teZB%iqnjN#}tFzw2Wl{dq-@6I*{?jYlAit&iY= zZhdF(0xG9j_dm$q69x`Xq3JfivxG}Nsj>XR*t+}=lmnc(i;7u-&dS^NLpa3E=BYEC ztbCZ8i#&g^!|B+#kerTpdy1RSZjl5<1Ln7c@~3A;!RDm4?p*IA{uP#~f>kN}IN{|H zh?&C=68?V}^5^hUwp0YGQxJ#o8-L{NBB%RWABIz7HQ22_1;CL67^RcjVrE&-)EYZ9OaYHo0 z_-?laJTL(ApZKmIo2DcPH#ZmX1mULhLjEGMaNr`IM8Hlg;t6zj@M4|-U=}athqz@D z;7UJ??A~q(Pkx~E!0^H9U-;I5!7oo3x`b~j&SvES5PNZ;KZMNP?Fwzz=%&DLOL&so zu`->fxgCFH@TtN~tso^q-x6ke8pur9OZim%A=xs10_Jku{teMmE{@QI!1iT)KYV}6 zdA=1v?rz70FGp(e5zSkHPvze$_~yd@c?8??cit2+OY%0jA)@!>OnxY)ba0tGu*vi3 z@k=sW9xAMEGf1i2*$Fhj4{{xecNUf-ztjN{y53!-iSXHx>mfhxCSO%9#LwQjgg-VO z4_lo!to4_^Ebkyp;Vn2++~pl9bSKG?GDF)aFYy%Co6q9AAcdE*aO2`$s>(tT(NUlA z#8cWJr#4HV?Ll^^o0iL4(C3=g@?6?h|ie;ZV2#)P@iQuU4 z5P8jJXCfb7Z8wmM{gTfj^5Tblewe6=$z2hOxUaG6`L_7pxb=JlQwj^$^ONh85>;sy zDM6dt;gAZ6OPf&USUoj)B7Fw#_)CTSR($iESWhy(+PLZoMD7$<{Uf5USUKeOekA}9 zAD2K|ajUloDP9Tg`VWankU$i&G`M@{_aMhF`IZMa5aAB@2H#3Vt%}{oBOD$iY@=*{ zz*A4yULnyFwjZ#avc1|%PuMIGX3i#?fqL40j18EDrH+NBi)_f;iZ5b0T@{qO2lbZgQ+Wa46`XBTyF*|V`MEc>O zb1lTHDf{pA(^EiyZ;%0x70vOQAa^hHev;=ApNyk1jZQnukdMxr#b_L>ml6@`;EM*?{OF;KdPrC$7f2ktKFp;gm+xP_eenyD_sU%H}WCwM{~vK{n-d{8~Ijl z%OvgHrBh+@MocwCK*Wvw9Jh3I2yI}XLfwU(cK4u*9!PIYx;!TMD9}R z6^ikSle-HFN)((UyB&(w!SCgz9@qgSx=&yLsCM~{gu?Ird?X87h($A)nZC0F1PS-f zLH;U{aMedqG*p4_QNAr~EaRo-|9>b$f3E5M&yS$%ll~tA8@}h`@c+BJ?6mV&c*4qK z{2QiUlZMNhe_|OnZ;AFjKL521zY8+e4?Q z%{KIu$z}^8!rC7Wr07j)x!X_O$$pc;j1C5G!H6TZ+-S8$L)Z2Ct`=x>|IAJXKUWW# zL`sc0(hL~wI2kBE)(iCb2s^+Bm<{@epzJ5U#G4`)3U4D6na(z?73&zn~;9Ay#0ox@^Dk zF#EW%BRnm^{wz6}*c!&Gn?Zul0qwy)+*4=yFtdhOosK5oqI39|^Wo|_I&a`_7-XV0 zVXMrRnCPqe4N0QL;S^>JhbCbPF$CLH;x3g|^38<*BZQZB@Kz=7W&VG8C0`&Ih(s@- zS%~SrOK7_9{@?i(WP8M=>*Y0U!&XrKxxxpIUNkEKlYv;WK@|oAGxQR(mAG}M;I~IB z(X0wqUE;0Dzh+zT_$AzLCW0TS;v1ImYS z$xP{2{gxrwH2tb8Bntmy4ptwC{DXcU6S4Y$>Jj>VCP#t$WjXymreskV#NL^gd29?r zpwss4Wj9VhhV4822ZA=w?jxw;`twotprodwI%xQM;Exxsy?( z3I*j=N`(3~U>MZ5k*sJ@C>+2i}-MI&L#7ID9a%TIkemFstmp`{6i(#xT~{#rw#<(L;pC0CYWca&bYky))+98#gxgVp~BTZqat$$2>gpuY! z=Vto5GZtsSqa|pprq*jLa%e0rVLITl%b2dLSk_{h)bu~vjF$hs>HnZ>seiLJD{%!` zWE2E3_hu2Qss%CNoJD8|&_7D|#IIVuqnPXmh+VDePOPkks0+A%qcF8jqp&#?x6v06 zO7F8hg4G^8XBGlY>v(li7Nl5Z0fi@96{fE}xYLk_-->B^nUCST5Hj;X*MjoAIkpzl zN$-4Y4Q6&0sHLPAng;anYa3N-5b4`sG%tw|XwGv}hkJ^8vfh}Vk2Qpp>c$FBH5BoZ zTa;icjHfWR-hi!_yJ>ffbAblQP3sL5`5g#{i@o#~Pb=6`-$a|nNwRNP$)=G(VQgLZ z#&U1hzj2(rfq(380NM<)ku$dI-sHQ+8Rt9+&1Md@${NXadOOzjx4na=+d0mXF8SMT z^}}JrlQz5lf$kk=Zvmp>ZI=I9jpdI!bX4s3w}Z{P@EUh5UjGD(?o0V|dZ^PLHU4R~ zM+t%;^QT~r`i;`}v~gY{TEAo8uN74)6Iy?l%no=$posl_Vb(gm)Lg(ydw<*U6;)!{{SUhP_Y=0RfZ=)n3z(4VWW{jhL&|-I$sdH%$7+XZWGM(~n>`G;%+398O=Qj}EF2Tmi>6}6a zaR-WhAiDznkBDs8(LiFD$i!VC{bRkUONZe5LJDSe!d4wQ*-8m)?PM@D_Inxjbv7iR zTMN7USy~cb^3wMf82c%;#s|h-(*|UAHIRaFbHhIgB+t`_p+{reGtse?99=nN9s&G0a{X}(@cyc@~|`cxL122!qX7HN>Um5}3cFqUg~ zXbI7ghIjENS4SE!@|hWBAigc+`N<|Ge;B@-ktA^^T{_&&T{=v@tI%B<45}>AC$aeK zhy%;a^X9I^e(-sBL!_DUZCzF>wQyE7Grl)0zQmjRbd2a>usW~I9sKwVy^L(6%{>e+ z;?b`Od{tc`wx_|;vLkMVzNprahRJ0$2rKzbPOF062I8q~B&U^td8Rt4#whoQKJM^$ zUjz@Z6(3Dx+BhdSBv2d5*SFdEDg20@*DylnmwbOKcclYbp+L6+N z8mX%z8#Ze-=OLpjTqwIHVQ>7-tzNAUX4yOjRDY@;flIll!0VD^+b@_US;mGRgP9A0 zBzyS_J?)%ssu@Ese|IQN(zl^re%V@mAF^dgA9d_7M6xkZsF|7zQB%d#SEwayTxXSM zXr<8RLTH`@L0Y*YkVEt2DT2jn*H&Eys<(@Y5DC*EWO$wad$&e=4uvYriMdQ zlnvjC_RIDQ)P9L3)oC7{&9En$o4NH6f#0z0GqnDnnnG;z1(jKd)!J-`J-GwJ-xxK= zeRTT;gDC`Sak@8OuO!ZO>U38fr2k{hGbwP!a_6p4UVx7v4i0i?!m)%tJ zJOn1cWY|G$$QRUtbKTTyeK0O!=h13Yfb~5HE7s2-6TGCB;|qGu!|?^3=23#bJQQ!! z!BtMA&PYfcW^{-05`9HuxXbE4#yTl-{rm5r)>#38_nR&=cW@9~WCtIUG zdc;a5HbXNFYS7r=&)PZSBvsaD%?!Zw!Eq;So^|siE6?1YgS_r%?IfL-taMTzn=q#4 zL{mL(=i0POE?OzgsMMR=C)jPs27lO2lJ>imG`fhw*s_Sw6wli^QX%20m1!iElx{Pf zANZG^cQ|%lJI8hTOMkJ>%Flr9zjnpWrKr|jI?yaT3#Ek=5nzmU|o1t|2cfJK9fLDP&4sY!AyMi zpZ__u1cz2TxbA8gWiZXP!oZOsoLRH+Q6G~yId48+U2{pfmVKy@E|C~=Y&ZoWR(^P|7Gfr~+c`L_L zYepDbt%UM&2iBi=noE%zGV8PwSmQ}E>(gMJYf+C=*p1_@h3~yXtO`s11^j*OcxnX+IVtc)$^DSNMlkp z-8fvjz3TP`XWTeHyg>cXsKcAWeM6HWkBy~%<@mo1i;4Acx9%I7?bH?Y?esn%PcU$1 zzHO`%os;bQTMhOV#%A`NhM1)BaeqArRnHu3E@q|kJi+(U+kvn?))3a;`ZR+XvC!`5+`v{Qq0C7S#4pzMJJ_qB=F_$HH#L+(be=dEH(S_uR1uz` zlv3LKz+71IE#bP|Ib|5N} zK7d^hO{n(6&G|r9K>G-rEFi@GHDv+G7AZnF1OSdQ^*yW`{CC1?1F#?h)i_-*{H>^I zN>c2cn5~S4q@@~97&Bf+ashsA)na(#JH!>pgt1D4sRKn2_^d7Q zg156U0Y{}YkW?S2UZ@D-epMP?wXo{~wV^LY!m$ZOBwSG&cH{rpgkmD>8=~=mE?Pqb zDOq-vd*|d`>B#s&qSioameaN9GMoTAwFcr($=4Zp42e(TX-W@vp6CJPJT=j=^F$E5 zuE!X7KCIBw)SYd5!*C{>V+{CZCZ3Bm3WujvyU-Pw523s1mrm?fwu6M-hSvoy4TB52 z@#~aTd&9&%29j%n{2IoU>@g%0Rvoa9X5rZ}D1}%(1PS}`#Aaz5!IUb6)VmfYXn~_f z>iocadw_yJ8`6=JPf{*xCfOpHZwKai7X(j0B)Qkbap0cEkql3#-C zlmv+t3OAUvL_zXmk*A^|N2}}(s;SDhaC)`M52}7vh%xbG$yo!*fo=Ysg0Pf)n3|-& zq8g-0CnQx4LGVec9P*Vl%Y@`rA#=3{=?6+gu6$B0!90Melrfe%Q4xC!RA`cLm3veXs*?)wHYwNEBb@S z6$*0yU*u!3rijEq^QpRE=89b9rHDIZj4kP3Vy}2Y#_96eQ2N<%F;x9yXpb?&mNyI& z*{?$3z`2fru=s{yy!Y|j?(#~Je8~c_^cDE~h9OKgUCx?I=84mcU=z#t=Y{oTpTvK* z{VW6D=ota<%uPcWV}L!!UnS^=88;1cgev?X=yuBxDvFc4!G!KJTEd7&`?U9Rm%CHH zn+ul5rr$z+fk)iihGFmwk@Fbq1Q-?(Sh5BWu(Nkc&WqE z6lQR79>!l7k5B?PQ@q4}9mp8hVO+r86%JRbmPc{YXN>66-Y`DOx16)Qdl3BI!uU2b5vGhZ9>%wr6E|DI zxKTzQ^Y{9~#VVsGev)^hT_7~CHolHuo^X7eKO`S{Ar|7E>>$O^ZOr$b+vUVPCSzWQ zof6|QaXf0m9FkM-2OGVN@8e?&^)|{er`A=@K$e#=6y|vwr=h^Q;cXm>OEkEdaR}27 z<~K9;a^osWU8EUcXl8r{KMD3R#v|52Ol3d-NEf@mka=sc7z(-ZKJe4Kb7CO2=+O@B z-ld=pFh=3G^B%+2%otKw!VHB0dB#yTA5{k!M|C`tWm-sUm2VkDp*|2Jwzbg6?c|Cm zb0as>MnFWyMJwkI^q-gQaP5_q+{_>&x>0LMUZjoJ{uOBK$ZUtHfyOWo+9vKwmSuM4 zrQ5+Q4(a6O`%T~z)}87mnk4P>{BX|U>*6K$Y>C*v$OZBHHToJs2(hJILI zJLj}Lb+vOIE5gr&e$H-%xlvvvEumWdMki2p5_N#6*2b3@1uST7?BZFz@UV+?lP5mV zgxt6M+`QRX`I&`qw6*csC+J6ixXWJ&WxZL<50o*O9xzlKE3ff^duP_WJu83cExhuu zi;QhezW5N@zosw3)HcShOfOi~hCbbWZH&?QbZ@mWj`h!!$i)JWiz#jsPM)iR#J0xX zQX&uby2y7RRL3i!A~bX}ew6x&^h3i1|?(2;a9e4#o{C zl6%0x%7uQ=J;a!Z-^~d*)d~{kbPsOz3Qe}8vLyeL0|mO*K<{F4K4Da6QH%W=_veR@0{w-!w@U| zfXwL6E@0pnnK8uu_TMtOw{#RF+(NwWEG8-#9t|~yG5AKPv8(F`c$pMJ-~7i9vQxXi z>gg-wfufA^ZEyS+ilY{g(R&o0Y}2}jz&ms26J*((_QoFgi64YMcDW^t5k&>St@cJD zsB)B70>v^S;T{UZbsq_F;;6vPh$tz15M~Va`8>l-UdGB(zG#EU8ZW@=Fk?5@w9f*i zFT;T_V+b=EE`=E>OjgD5C;eFIM36m%+ZI!Py_nV9jY#7+b(&bBtn4UT%r!PE8{|cs zQFQKA&G14F6cEI(WWkgkMr;2kZvVqX0NQ#Z+QP7&#y8RSh)p&UZ$!dDBk@LL_c9Xm ztGbtwm|r1>jMV(Plw$lyfL#OM$!`9T5U^_;ImV?pVx6ibT>8Yg39T#N0mfKdz|(V$U*K;iwB9uYf34p@eBK*j%s`_F zP^0?P-~cH9euScbpEQz`RNsa4 zMK#FyFn*;iFy(_=Le4_^m6#umkKvmk^vz7!t`PjbOtwpgk4`SzHNOJ>Tc?&@2V^^9AF0 z|H4}ildZkU`95vD#;}F|n6IGycK)GP1gKIR)a=$|vzk3{S8A43-GWOOjf0S;J84Gs`Mi};GKtu%d*3G^OU!xs+p_lHSqO$2Wi5AEs!6;J#U27A}iuC$Aq zdceeN6EY@SedO@v?dA+09xT)at*Eng`AMWur=@%YvP z7$0vU9QWdQ$}N`0n`SGCB8ovH;k&ORUd2uLx@jSsz7LYjQ&+c`1*o~ zVBCd{i1e{Vw@wqXb#yT0P1Be1tsY!cC|#xva#C{5NH@wG5GVZvHJ0asv%CK7PpC!4N zjgXLB%tqM566RH+8cVBBoi7yKJ2d}iU z%b2N(-~Cu@W<7bZr|&QIUOM?Rd1*fw4(1Otj$C1qJ)E|dR#bH=3a;3uvgM9#^<>L? zTa0--OGQj5C>5k+K4O$Q95#s;kk&VcaZ^L&&~lThpR*Gs7_8<`Q~%y{Vu>LWR^(yQ`VtG^AN({1YFir9_HcHpU%&11Dzj|ejT*fKNg;XlgFIx&z$M4zf|@q}+ETckts%2pusuM8;mbKDH=LtEZ-`<7P?Z)) z7Mk=9 zHyT$lXwG3Gp+~rdiM&nn{$XKGP3%`en`?@}H^Qr#8z;20Ibjhqy%S81$8S<5A_Ugt zngS^=&=j~4-|65?t|_644>W%+}>)^Amr8C5DK3{lWnG8$B*&boygRJ+?8Bs@&9TD8t>lfB(Mnc~=Fb=9(f6@4B&!$j)^EZ83O2X|CyQ_pahr;I>~~BXv~jpM9l_?5;es#TOo9ZDH8Pu{dbra!qhJg zye2EldpM(p_e3?CF6CA|yuRb6kvV8ut$Y}x#@_k`%7^cklAQX=ZvE1#x~7^7(hreS zBRIdHeL+ixRvSfD?eErzEJOW;iIf5Rvpm{bkw@Dj@@TPp_Bz4`->TyT+iV0t^S|xLz%uK}G`x65Unlqt{htcJn zsqurAC4kBjALF~{O$!-zW|5r>i_st#RwQy^>BsARXYMgTzU{K{#*aiSN&m+F8g&Z7 zCegI`ul=^(dl@Im_o6p)#g_6+!5r)&@lF_6~MNhTsY)Z)g?b@FjSgzGap z)KOys?$)#3@cb;jBP_X&bYk97Eb)o7D*w8P`1>YwKqa`-4WwmpP&{&%cT*fdXNM+w zmMgnQN`i%|IyeMk>zjM>-*A$@Ib-E7mOF3{-nn5S)nXD)kM)Mcn}&pNv|n8_Lc5Flpi)CKkUTFcBem_THrm2T1-1vZ+m5bXZ&1Y z9`I1Hp1pjw7PYv1R-zVOZssK76zFDtj_5QPhzTqA#WYjBUxLG4hbFk-rW6SYSqn-? zr0Sf;PFnNds#;&>YL#&|8CNLdivAm!ACt=VKoX5fWr@u1oO9R-F8P}uO;3cso1P@! z`ETjT)W46OykN{|D#Es~nVHx$@~`Lkz_kvUDu{h=i3$u^=`LvSh-z+bk2gm)H@8x3 zTA87wKpIL;Q?2p&8o)ZICl|kh}u?U zKQ$s&L~Qt_pupryLm(*X37-J2bZ4;x$7%@HMo$5JkeblAgAQn_2>EiI=aPz6i~^#! zdb>hyw7HS4QH`%h*uM@-VsQTBAalztUsr~^zq=9n0*=WOI6+38y$YPPIyvoC+uF>z zlEM2|y`K8YMo$;~wm0ousTl{)&z$YAEI*~CBh6}UrgpWg@FcXW4Tg#vYx~0RxgB&6 z)5g4-z2*VMx7u|=H`uOGn08p*c-itW#u>)8HG3e&E%2M8b4If}>6&YXBA5PBm^XaY z);yKXHbakg=4SZNsCMRPw~Motw4$R*ujI;R!|HbC7m-rmX=f&?W?g&p>-gZu?eW1~ zE0nZGq$3V_`wH0J-u$fdC5BUoORj>LPCl(*;{yNSFwtj1f#_PQVW9RC*V&O1sRUwj znApKgQm5?eU~Y@W4kRn83L~3(rMH2Yj%LCrjO}QSa@jv!!ToSc&S^D?4CHp_yj5gD z(HMtilJ>vm2|>RuY6Mq1n!TgQlUnZU5*J**LBv`o4oyMgsKjhYj?#``P+mI>Z9Cy^ z9s(6wH*c}T$GA>rA6iJL5hPq+)CTf9nboeO*G9Bg8QMQjbfPdHb3DM;iRHe!twqsd zh{15JG2{3UL27!saX}d_hc~|u|tPAaJau>6|a{qSP7i4u2H_`4c(#(ROy!|kgCgr{S!KJHN z{URBWue}fawxphC$)bt!pChLix4&kbT{F*8NmcL2h0r@_#OJR4OboRzh^R`7~>Ggo2;lJs`BH`BP)_zUC;kvCT_nTL2V}H;;n+0p|CO z%zNf-j(!>DdX9}LCgRw*3z(0nV48F{^G<0JiWv`%3?FA{glBl zaKc};T6Jo+Ofu`;@^6V{WYP75+jYyH>N=t0UQbAzWPTP`F8;@Gx^j;zuqjl#T^CF? z(-3r;dT3PQUp)NsxOrqhX% zj4)E0t9LJ*Ld8?Z}c?mv~6)?&h zMkJg25a+k6n*Na3tK6-weedWNxc z*$gT$llf5T*s|HU0L*iVe@e(A%4j{e$o!&9?hG||1nEV&0#)Bh3Z59a3k0)=Gc|BK z=w;jifGgyMDX=f^XFn*X+z6e87MnxKw(Jq4gVRc$ zIAO%~f6D`kUUionG=0O+?(5#mUjoQn+yQg21TQtO!JnmSzAMOrsrlswq6+}sLX=>>QGHRDq&a68Z$ zVgW(&(Cn4wVPs>xy2h*r=T&AmW|Glwl{r;>C;$@Ljr4#6tIfdTYU4wsr#WlPqnaFJ z?et0^5)Gw9t7P1bEg@KY3CWQjICGFEv{-9?hJG^ya&v4!0Bgp`? zcE>5{*O`f%R2WRwU(+cm0YcU*!HXYARLO?m(q>Hih2C`aT-GD291Ba#>-DJIZcaHZ z;_9-m=&1*}x@ZbfDLi>+jM6CIfNTdYW{gX?mm_jrmNE!Y={)fYcfG$JqN6sBf*uE- zRKWMy<{K4RwSdO&0q0zIVwb(phD@28msV|JTE5Ur)`MxYLckPF9sz_i=^;p5*h>@oi+o4Gy${HIeC zO!SKE`Uu111I?Jhx|E!HgE^ONOy6f#lfkSgFh{!6!31Er7aU1*9Lebd6jC>VX1_Ta zf4KeTN;{%Ix*-Az^XOLy;b5`(%I3tu5v3dJeI$1y;fWeKaExXLsy{vob->aSOh4nB z2hA(Umz}=0e>q(Iay$I;lV2mr+5}U-M($}76n$;}&5q$SbATDn>md6H{uKlf^){oI zUN)XLBSAt`zsz-+9$cSlsggNi^|9RY3?CRMn7cX?wBK67`b!0KZLF^mvHn@X9D`V2 zYcbcr`a#g&Vt%6<;R_agSwi>=r}LrCDoKK#I*g3-P*Np*a_SghKNkW*y8bGWT_{`EweP`BwTt>V4Gd-7G>c0?%>0S?kUtd9i1UCkC(LiK zGuMj`-914cQlB&rC#QB^5O$suW(PpgJI9@xvhCRxNFNgMHBy3x;V$Eci4Bk9LPi|C zcNakM?qw|@F@3QD6$D475e3035Opir+mP}@3kIWC24@hrLG1-|Up%xrNV=6AkI>c|&>ADFJTT^F=;iqgQbm^C5oP(snTM zqM7)(`9RjRrM)p$Mg%-F9vS#U)eL;`xEY}k^&@>08L-sJ&78#SG7g&e!Fnf|m_Ccz zpmTY}S2=IM;iN^usNr8rI9$3<5a@KDNHR9vCm%qZ&fw!qVETYUMiKBug+-UQba*Tz=HC5xgnz(EZWQrZx*4F@M~HXR1!Y@DgptL)a|P( zfW&Ec5rD)OJWJTm$&RcDlXglwFp8%vB{Eztf&-lc^U{Nz-6^j`3=HlMheuKHB7z+% zyMGl8xwnoug8wy2v!kz}==&gWbQ`vdKsx5##eLKV>H0g83P=RhX533p2tzvpnVjTaK_#7!B4Ae)#am1~4P=+6{4oQBLGQ^#()K z@{v!Uuq7uQul2F~3vw zdgdxhnpx*UV16(2fZVBf`$5mA4$5KvO_Y$(FWBXr5AZjU5}>%#%8~HMEX3V7)*Dh@ zidTaE=zm;c#E@UxLQ$X3!sUq!YDy`6r~M8IPG4JZ2o-AxbAdM4$VpmAEiDW+7Tz}( z%j^?6w;C$npyF-8$Lsts?igD-$atTB!njk;W2MCUa^Z|WFBcL|=f6`VTqR0_2{2O4 zw--gi5w)bjmY{Xv=RZUwG@?lOqe#3ZX)w^8pU5K6GTeET;fyE^&KK`Xg5djFek6Mi!rg~zPzWb zVmT`B{2IN9n<_Oscr=*&aGm}Vp`^Cbj%vM}38uX*5)*Wk;nv-j6n6#&m32h8Ol^ww z6vqbf#IW!Ptr006rQTmHpfJ4;U=rkDo@$Y(*68o5z|_EbUM(vLG}2ltMjYj7~h<)R>1xfK&Xi>l*11l8wA44P9g{?joMdDqsV@AQaEs1 zw?#PTdO>Q7WxXK!;5a|X^-?#6+<2wh5PdO-k;9TDH{4`Cnz&^^G$;8nZgO~K<26qu zRw#AiF0O+!5&S^p%M`@SJ}E&5{UiD1xW1K<{8H4T%x}Rz;YLCeS1{bw=44DRGXNO%jh4 ziQ;<(OXDJ`OytfuA%=4wt!FXV(;pr7rWHbB6d%YKVObR4UP*^!NrqEVs0!T&_oMhu z{?iKSyfD_1LCIJ)n)@sv6an@OdH2O=q(AFmb~GP?U1Ue|9o5@)++3Uu{)g6I-ph;p z&2&bSE?rObz*g#2nzq2GpY&)eJxEuCW8MzMtkn*fW+haPt22kZh#G&%7Odo`w~59G z@iBZyW;-m7;h#ZBX3AdhhC4BQBn9WfYH+q`&9{hLa8RikVV9xBSWwjLiGi5}yyw1Z zL;#H2L<=F~Ts=g4V^(Wkhl*%pYra(ohPHZ$fR@=+nKZnIn)~oQPbfas(E}`P_)ssM z$gXl^V{NG(NgUo|%a*~1ZE#T+!lE|3KgzFYV1^{&Rr+cK9sF0-ugKf-p^fGnLQpo6 zggRXM`?sNETb#QQ658@nXd%sND{f1@6PBG%`Q(-6bv5QG+l+5@=35cI47EqT@XE7% zb7M(Y-U*$~w%Yam)ah)isPC`XUXQV|Y&Vv5=aZ^9se{{Ut6e%^kT<A{^wZ67|` zJ}o0ot35ge?Xb^?_JmDp!dSVh-usEWjPv^OGpnX_YiF$~(bvUmLv&@k>%G2vxAFNG z_?M(9w8fB7iM334eYv055+~3E5n0CG2y{h5lpr5nH=6R+97eL_j~vS0;WOCmz4a$0UKnBv8_ws+WP>>eC{OF?gUVul3wv>&eUi-LWqybns`zKf@0BR`++S~K z+53%`-{hmJWP+6i_Bqj56BHMTfobl+dM{o)V0`W^{*wpIsce7UIr%a4(h!~LP`!>; z9x{G1hTmLwDj5guQ_1^0+Ygg)lBpO`6u{tBjKE-eT?ilv+u|WFdYF%K+J}4+kq#8& zdE%ZEGoFv7RwF#D$OI9OEf0!_h_ki!lqZMZgFdy@x5>W{;6V9MJ zecu!p*a>_u`21r&0NtHee9U)2j_&NoJaN7V`GlW>KPx|>=AnvDcn(!!t|Aul2kvB| z2lW4x_eP<~%~0N`C29gES1eY5(_-EQ=6}k6h7y6x1b!XASyY3iv3(QJTy+^+b|o9FDLR>L@^-{;>Mrxgx99<6EPsTU?r~1)hT>q^&~Dx z>Iiao^Fh#QDnCXcbD-9tnBV66L*T@8HLm(MQ|qpJ)HI%iaY}kZUx@}IlB9;aY7oQ( zOkp_5fkAu<@jta6QQytI)A-ME`Fl;L%bzrzu5>eL>X3T0mmZ3eLNVRRbp9oTL38m= zAQTKd;|)<6!&RtpxT=9kpYtAgJHq~AT$v`iQ6yatR0MO8_Uq**dtub-=M;1;pvQ~T zvC!EJejWm9;|vO~K{F}5a%S?RZ1=)hJjt9lWHyD@qS^d;yqGwLUVLgU-#s9f>mYWG zQ=@uZCD)ODRi*g`md)k$%naB!mjdILxhV7D>!;`OUlQC_a(oRV1lu`@!i-0-q~-zg9vowbZ9LpZolLw ziy2P{K(p8IKJfhlzK^8djY;E)cI^-pJhjIYKHJZSs}GA^5QTZg)!m+OJdF>-&3`wI z{}7K|!a}s7#>29O{D9iW?)Qa!6AX9}r0+F)=nn9Jfxrhx;5M+-dKUMAm42GWGsv+a zE+r;u=$qn4PUq_=#oM6bncX_r`7s{|vFS)SV_`@-Pf`IaOXsKIPvb>=Km18pL@#bz z#J7{jaz`BumG1`PxjcJpz9Xm>^RwAytRWs3+XL1t<^ciTV+lV{UZUVmfOct$2V^hd zPtwD963T*9URY$2&q2`lTgsDE2J@EE{V;wR|21ChVW1Zi4Tw5yu+)I8-tUlaKu~Qk z-Zb#{83oCS@V$cwOZVmc1Qrpe9pKJ>=fo9vBkU<^K__wNq^WyB-hAHMcy2jAf`I#( zmHfvnqHTP$Dg3yScgL-8dnJngc<+nVxD^nS_FKcZcb>#ul6vs00(-m!@kVPY#IHb- z3f)Zz#9gjdL7clPUf#KukHT$n4N{i!7%#q-TE}D8;rwFZ-F5s+L9yJ=(igN8K*sKOLwwS?YQi_9&NP@Ff$w2Fy@8J-lZwj0Np0O# zy}vcLs^6sh8$venv!t1A+DK=17c{B3Z8e*aC5wfgoA{2n0e*9Uygr!bDs>Z|?zq>3 z``rO5eKDT-$y`1}NfF$A2gn_MFi@RHeE|^+@$f}1|3d9eUXe>T`4mRnn$8d1$4c-l+_;aTA3ycmTuvl@Y-zYT1DhKN7%oG_rq(LGbLof zUO%|Ag`bW4efm~@1OCKp;|C%^nz@a?M0e?Y9OC6PPnfiW4}qNRd@}CuE=Im5cJKvb zNNOE{C*}(ye}q2#W%a`(&qvFh^c;-Y$pw zA?}aG45XAiMM;qg?(E{VAM9f*Whm0eTv?AK+Umh?nIChPw0BvVIxW z2l;%4-HX`;-W=Q;5)F(SgdFDIBUcifZ}f-n5C2sPE6FD>ZoKd`4vsl{EYxlL?;7f& zg*b)V`a2{v+SL{kH)ImsJhN~;@yla83u|iRmBc`jR7|VJ6%_KF)qAUz8&oeKw(VB* z_y79*-3=T*RlfHuq>7D4&!O70EUHLUaAXA+jQ7lvcvF;qQU1pCOWe6kI9S9(lTES^ z^xQymx87NUf4h>uRpQ@nP!7!9 zFr8tXu`z>ny^rNMDOH+yv}&Qqmfynzl6TB?hjAX63aC7atP-BRV~A4F)%+OsG1_~K zAH$}gz9BU^$c4JCa49tN1jKH?5b@TVcH?1{5@Rmj{8Rn-@Dh6zbOyn$f*fa zA@(r9?t+Z3O4d#CJPIz&*ilj<3rEhGzA$Yc{B)e}thja132pljc><5@t8n-P-xrIg zYESZQ8JY3vle~gVyx+I{0;U+g`xd$S>)=|#57J$C(>v+?^=kaz=N*pyV6@&va~(b{ z!S{+`Qwe>rgtT4)_fvdlSMr%|-1a=`)(itr@sUl(*>wey+mj%zLb9%;oPcUx)1oB=7U&-edp7BQ`saefSy@_9@!tC z=2I9JoX+s)oH47HUL-1VLspAsOoTD?EPtHEmBBa!Jv_hnJIqjuTL6k$AMt^GcaS2# z1Dd;hIBfZjFU4g|`JR7@DT8C*^RKd-8Q69Y2g4g*JjZ_~V>Uz41>`+>W90=thveH0 zd0*=d5kJk)d#goQ;d;!ufey^v+4X+7DuZCST<`_OWxg|02;5~pz&Ynfa)T_FYn9vn zN`ydJ+ANhr zzdgEg1;FHQo>RdYg)kNgQh%i|3jMWubQz`ti&E%|*viml7&_S-$`hI(@hME5uY~7R zLQ{gqD)>?Ix#(LD+QQ%f(93#tbP}EFi91&}CluAut7{^vgXmlN!M?!|RLK(y;$kNu znE-lTp*QqU3&fXeGA33rjC&!RX`)TL@5lvkn^W+}QxADp$eP^-&1Pyrg@FvenLPcK zmwytyxq{7}6x;c+C0z#EyM))A1ric5(OK|U zZj=1N49)`W>8w>xyuk}X=SZ$);Nl{P9RyW%5aL2R;9RhS!#AmSJyiTccOG>t`wV7W zucj?!DC-k{Z^^Pu{k_v5K5J67Wx0mGH=6lt`FqzkhA^WJ>D@LS5IvZQA!N;g8XnAO z2Wg1YFSUW}u1#Jb@V1DesSRZDZNB`GyWfbrA00~Q&i8`m_t4T+27~VLuOb?xyMLd_*f$+5e0#jf8gyQ6wQ~j)dwn z@aou!VKn%RsAG@~FvLv_X98jD%Hax$GeCoRr6Cj|JOwv=wUejN2Icg9hgbW7dZxA! zEb^XI%EN++l>wStUO zVzOm_Od5%~3XJ*ofUR6rTGtf86%#o@o5$8^%7LdFE@s8Z81fI)k|o_W+ONL z?k!KydJ7~?-$HMp!vnq?A^Nk>FWaM_9<>5E3^7uU!D009sXL6hK7z{SQf@FRHt0HN zfl;>efGs}4cpO8duh0<_V!Yui=#`gtgm8|UfoYj1b&%;RxZw31U!n5@h6rwc6h4xR z;G;$d{qa%eKZY2L@~yo<9zIkn#BwHFqi8xd9}z|tKRb+kMHsRE!U!DfNPnS4{n3yd z98yLTk)c8x)B`pOE>i&gAX%m{y2(DZc8W?v6P%#2$CwvP2z@{B>Rzqqq)qej4i{=C&kk{dBV^qC#m5~ zpfC*O?CwEAr`EAt6Y(t^xyZO;3Q~Ilj_OH}1RP>g4mrdOY2yp~g9P16=+j>7Wen|W zD$Vdy+}};@Br-l(NGGh%AxZvR4A_vU(G3{uy0y%3LV=N-MUjhSG~4G{*jimBv)w>BjG z#4sMNZRo4+=+r9X+CWyiqX#?@CNy>=?Y2u|+!>v5a+rX+%fV3G@;z@1>q3k|ZnlTY z4@P;ob|CL_7#)C@IzYlnMICQalI*}}3l|cJS|H)`S;6>Y4+a>+rZ0v2&4d8A-*!+h z4b}&llf<2dgf-#Jv&pARuAO`u8}dI2XOMq1Si+k!ghfnh*Bj$Q&bA~e|Bz|h zXnw+=+1V8L;Oqz?9LJg$A%r4F7Jc?DAJE5aMD=ro(8Tp-qJnedPM@R{(%{>yDMMJg ztG5Ha4YAmeE6+=eU8ebn7>!rc<^Ou5@Yj;2>If~pTjD{HJ#)ns_~k&Y=q!DdKw?~| zuS!&tD^3{wDvEb#yMLUchx)5(jx9b~sP=Y=+nb6^HeespOzups9g5-SCN+-a;Ss&gwZ)C5PCiN)E;+Jpvy~3d$kghQ)?-;__K(NN>u# zzNRuSn{2{=%xszM*?k%?+Z}agE4KfQvyFk2m-o7XWzr^+2=sAKHdfC&l@oXFzYMw< zn^%%0huo(H;*#~~`Npy6KU=Qb7YUnsi+trHCJVTg6QJ-JVJY&B@AeV8OA4smK0-L< zK3T~69x?gVKEgQ6bv&%EfH?_ZeqZ4U%ye+1uMoj>oo=tROKzki6gQ0uA3_ZOUJS%iXA*=XVAwVgq8Hk303d8Qt2}BsqJty-5 z{U|5Q>Eg58ABH_As9lfU!MJMf$Ys>9p~B*$=Y+_nyB5jNy+pFiRs~;+IT48Z?c5?6 zQDPV}KaXI1{p!VyQ+AM$p9iTiAgNzsZ}?9?VbeeC*vBmVJO`bv;u^3o`lz>6p96~R z#P;LPzqmzuw)(3IY}C;xkeKLo7Zg(31ct*jn3(~4yCSl!5fd$vEX|E{XK3*<>R}#9 zt+HMgWh*jAa33U4_e82!m^(ciSeNFfol?hQpg=kbj4j(FvU@OkRp`plQve0Ch(3YuyA;W|Z z8P-@dOlXYM!FYW*`Hcmi*M+O-z@dT4Y0Y#HG(sSXMf7`u0&8~<_~iIHqKLC6&!|=| zl70R02<&16WQ-7k9f#mMp5z^!Z=JoX=BTfe1}#jLQ5oKbs1G6-mF#s?T_#*>;;p2q zGc;p?IT7IPtmddVK=*msoBe%VYbxsmc;2hmTX6ObVF&w-zi6en@aA94sw6eVfLJs? zGz{)p6ZaCz_BbchexpSwC&Zkr>x63jeYB9ppx1EbJ3?o6F;*ezGR4<;;~ill!=9j% z>FrvSq}~D{TyC69f_n9KZEQL(DFlYoAf*_P#hX8jAGQ`@+D0nK!x; z&pZcAUL^?}EUkscXnuBtkcIs{h{JT8TuuU>lc4{LVCrA^7jc`l4NWy?Cl$zfv_Yn` zIrP~y)#R@Lvib`nnJ8!_7H>>P1qn_ zv&zWLtTtb*mmG_C+Ap+*=)mlK#_1D-xm{w!K+h*2*u~WD~Ua3?iArE^!_QHA~dfWwMYRaX_VA)Afp~g zl^!^1DfY2}qZV@oNu$=*A2no7ttEystyMlSHd%0Qb zW(TWFGrAu{u)?0X0xXJL3?IPnj5(2VC=*9MQ> z$83iq{`K<)h?p-#vFLbl=3bJQJEBOIWAqBmOyVWi*1%mOHl#1{5ft^?L5%)I4>&nr zXoa3zQhHWb$)82VQDp?Oi%TFh1zFyu@Is2PL$Oqe9d&~EG_>J2P8D?Gh0c(afI+u$ zsVL9VC%Qn4>8uw_PelbnI%KCJOwu9x3$$%5H7@!>Fv?iduM|;WWlKS!HvLM(V(hsG z6kOcn>EA1q!Bklpc=ZW~4rm)(TlH5iR62g@*L9D0!NGxBiGOhpT^P|=tK#yhiwsA5 z9Dprxwa_0+LKmxkh16yE!xn`g^fqDgd-5QfNb`y%0O<}QRTMhrOt`Yjd?k%{HLTp9q;O9Ur{I5G6D z5`uMqYC1x#>C|v9tD26{yaZ(g`5bq24lBPi$P4af2qp3>ELRBSxBNWd@=_s?Sq$oB zLZ)t?hYRD3CS^<=hWafX{&Uyl!@gz0`8p+J7ZpZf;Nces1O6PdyS zc8)uo%oJv!Y5Mgn+zV&n3-M=vme3iir2UqK3Zk>1UoH^uu=wRD&n$su%Z0YGSGiKi zS}u6OPs;@jK5}ol&_}*R&7C1vG5hffp)qNm6`PA!2wHq7dxg-MTrC%`-j^QwPHc8r zDFk4@-;1rWV(XmPTCq}y!JT?+C8Eh+Ab6E98(ZsF31#wMow*;Od<}kc#cH91IRul| zAmjQgoLM9ECpRyXn|g>{D@?|vC|WDLhD*_E9nR!cczd1jHh!@JeZTOL+t`vH^x!Iy zw@mYa#Pv8a48U5C>oOP$)(dBG39>c_UGaqd3Q5o9c*6A!^t{~?TLDd%gu&2k!5JU8 zEnZ5@#+PFuH(MaiT6Z19vN`v&g;0FvoBGcrxzjvgVFp$`K-JY-_?(-_H?RHygnvN}g3xA}tk{BspIpuYs<3G)Y$y zI%i=}JK6SmyXU+F`t3_~#*&S~Mxy+QYq8`M1lrKdoC93j6dm-l3GQqT3k5AMU|=*_ zT|=h)RAqI|vf&xQc;4ALRaV!S&G;@Vk(OK}G0{Z@25wh4(-Qg>qCJCT+ae*+S#BM? z7y4y*2TCF|`mainF4fWE_$3V7c8N=F8nn4v6{0NO~#$fE)@ArM7eOqHKW@ zP5X>4!_$zsC!BfGNz4k!;Kg`dMhxio3MBlSC8b-APp=pL%@j^=2XprdB>dYKVh#x% z!PO{o*V>Ay5$cVUIi=!oWt%1M!(Jm5eI5ho{CooFCXOVo`$eE|{s4-nVN96 zf8-wy=R$-!QHxPH=hT67;=YE!`CoFNoxi?CQ3sv^S3}FK+`X6EcehrPJkd;(UgQ zS`Ey;aFmY%jx=OV{`j{0N3Tg|^}5iUQnL7>L)&;%@~}xq=DS zN|pwQ_kQ}8dZgU3-%}dSqMk*%`D_WjIi!TTtIR7A`pHlGW1V2Gy~YzJT$<=rCBuq7 zrIHMr>SzfaBUz*BSQK5lr2f6yzc* zJ8m7J%!$5S2y#1ze{-cvo1hMnyLbeiD;Jt5==}jOzFc_0h1}P>VFZy(a}JJ`qinMc zVqGj=;PxFJxfzh)V)139-b1KrLF)ar?;hBDup2Ev$BEy-3Ur^83oYQg?}V`0pDN;P zI%xX6;ELaC_q{-(r3QX4M50Py%J-;<+YH9JUJ!m{iDuk^7VGAQ%3=;5`b-6}T)Js|Bw;3}Z#TS2$%dNcIY zzIcgl=bk!z()H(qs$Lkkh&w}y3Zog8o#;lxY(!#Yn4^X#s)>$bU+5xYPbZ9JUMRmS z!vMZFe!`hSt7b<6GrF3mwRHzhBUTM=lJ#E?~u1N8_UFI9nwh&S8v?Y5Asy(f_7! zNJdEfZGj|l^tnTSp1*_Yni=rP9if$S1{uBJ0OciSPuPD)*h~d5l*9*5t|Oh%RA4>l zJcYT0hRjui{w?&bdFCFf57N;cVBS2$_f+|gwCTV1Rjqc02x!y@Wr*7HL@kGiRuLBB z5JA&FV8#Ruyfg98W2{Tmdvz^EuX2*9h+5LbHWeL+p~?6?V|js~)dct1`elaZXpWH~ z$_(*OZ!1PrvXI*83x8PpjlX!OKxQGjX7_HB^>F3jQ_|yddT}hd*zJ|)#EYnTCQojc zTZoI_CAmeynK5CfeV|9r$yCoticZ29i$A6ULro)!C5SR3CjT*1DaH8PG13E2WgX9d zB}Z+owUnDxl|6B1!9qnj$N3k942D{>)Tt+&@x@(J}+{F^?BG&q%4-J4q zXUhvNEAc74D^>+3xVNQ?MZ&!V7b4pAsp?+DyHfXvcOTGw6P4I8BHUtUOAF}iY6+{| zKSj8cT`dIRCc9e5M>e`zB2kl9;)L>t^|pB3uJ! zWYB&;Ut@8ir(VLixf)9q#v^>dR2OEMcow0d7$nqAx zX^hod&Jv6m9cF2dOsomc{Alwrq|3q?t&0+OGsW2?d~aEpg&;{&n57Pq)Hbm^97)o0 z&ol?_+z-Ot;Pr4zrcOt;ou(>Osp1OiME!wjYDuxZ%F z^Riw~rK$7Yn~&9PQ1{kses$Kor1h%^sVqNwltkibpR>f{54V3!3=~aYMN&h>?K@gi zs-aPLTpJ6Kr1PFz+y*i|3zh2Cbyn(18*!zm4Y=M)&1L5b4O=Rl8{H{VvPK#SGE0mE zp_gi}7|yL$B*;H`#a7i`F}2vH^!Q%U`3{=tg|nqJbjBFXDl(iMEtyD{@c&oI=m2Dy`cY^EvQ|U8Uxj7)W)?s zN|@=#;XKWqlPbu0$wFgb67n)@dhpQG`=FIQ*zlFj98|rO|C+t|=a!O^kF46r5Lync zK|aACZ(4}c?BjMJUAoNLOQ#mw)mZUC zt9RY>=+*nzZofagdWP!Ni@)$qon!ow?)vO{S)tC&GIkkjnfbsn>cw*{J!O|?L;$mV z#$19}NzgoLR}P!6V+%U;9lNgzMeq?PHx~LA`P8{*nM^3j@dJSdQUpC}3_ZHV1 z{^dpW;DR-5ejp$j0i%~%M&aKGmnb8<%yLr3oclw-xem2Qldye?A1hw_(0KG0l+sZU zW>!dUlK@YM}V5Y{1x-rWSH^NJgmCKv=aww*cv z1M|f2cw#Q^Ia2Qp18(Aw;|y+<;fxPtEa<1|lD?!7sb{L~;Gjpn*~}%4s_L0yHR;9n zmgsDx;6yJ+Qh?eKT^w89vP8O47e_tGOWq6%oW}lYAypO@uC)X!7Bcvh3uKwU#QF$O7@;&hacRrEX2<`-?dm!C2{hu1+4(k?;ajRO#OvF?D>HY zDl`TTLOh{t6McutwXDbPlkZ!eWG~Nv%3Rb$+)VSbexx+Z^^JCF%%DBd&pU0s)tQM) z+is0xr_F&BqotEG4JO3Ao^s7i=*L(;q$?Z=oYB&cT{(|F1JAQoHFFb&u+}Z;x9%ph zj=-PPt(K)2kEM}YJK>o7%B}0^tF0kv0Tx_yakREz52liVbaEDB{KRiea;!5Z7X{aj z8U#!ZXblWf;MhtRkncVzzsX>f-)pS36-;8RKJdH3+Jb(gBbmA`tnqF4 z=p|a>WDTkcFS+kz^{eYcufSw!q$ABVh}(rsxdle4t!?lpLv6i5g!A19WvpA|Z1t<{ zc9e9eZ-2;N=;a2(_gF^gj{e%bZW70XH;pIvSf)Lc#<7;`5Yx|^j6kQ!F2!bRsF*jU zm+tzVdi|B%Hr_74UB<*2dmgZ~Q`(Vdb_c5)+>1z7$>ey#vwxtZKs#PrhZI!uc$8j( z^7!W75P9BG(>;pNx47u0I(S#GxFLP}Oh9eS5GXTGp|q{wyyboN+^@jAVWqMj$=&`d zlwYuXqFeBLyLQ&BX5r^`rE~y^g&Pa?f ze!ItliBZx@EX5BaWbDe{?O>oeF=}a_9~rGZ`790BaGuNTBb@++0MZFpAef}A)pcP2cZ&WJbBqtB4aN9 z7od?HomP8bv>K6k?f<7{|7vQswiY$p^GB!|BDT(s)=p{8ga$o|q9Kk+P*@*L(eUt- zXZ|!r!_$s~LDC8hp<}y~8cfHIPW$)MvElID@i^quhW^?QG7T>~fwQZ%8GF?q42RJp z_(AusN%ubbVVEcA)5@NK({5Hj@(Rs$*W2Ct5sS}|hK~X>%Ac!8FIIkU^oq3ZMBja_ zwdkQpI=kGCq$#Zwo2?$ImmFVyQZ|Gcqll=T_JcChJr>vi}f#@g7p!OMEDN)SXm zT|*GO*1=krrTXX|WAVLq~^Gq9nXRSzYh$d}xJ z``xS~$lq!h+r;V&)r+mi0ruw_L0%LEEmL) z&AnQ0WcMx;Sj~DkOEc{!JD4bGrY(u1Sy@@Hy9E`sz+^-)1=pmc|7!?kT(z$QO-g-L zT!-D)>kT~nm--NTk-1HPV_|L^5gM*?jI#QJfSABk+P_bem{*eTe+1Wh;U17d!Dml; zLdMh9K-|>jFK@*BDl?8@UR)~*eI&Dj54iNUhM^=A)7u)3l8hWG$7JbXY;Q!m=z%c( zEl-%&+v<(c+Xa2BZ-Dxlzp~T2q|^WC78KW8scA*VZhftDAHHMe+Uz@qi<<0*sdSMg zmUhh6qxHJW{Kh!4KRwt+JlMW9dEo!`W?5Nm2Nq=;(Y8+*;-e?(jXD3gamV1QaWZjuD)*RDN-MRIf`XDsmKKVeB^DGEO|tb13eMawR*IXspL&;&N^$H?3~I-U zf(m-As#ILeh?D@R&`r^}+^VV;G z1%*=)aiEiLk7Lo0IXK6~Np!^|{=Up?YfW2rb&0*grpd&IJazFVe@J|JX)E= z>?XEFwYtv~l4fPtn2jXO%DCxP;!+&n-UZ9j^-X>QRG(8>ldct7`e{);$vU;LRvE;7OAYW%kQQvF# zbW_@$Ol$Z$m$U1sr(0^ewX@>PJ(}*TINh4y_zvdaa)xrvT2Gj}%KA3*s`36VYdFJL zA$X0oJ97$#uCZeEVu(v}(}Di?oc^F`B~!!QJ=SguGpbK4sYCfM!EWfGQ-0LVSuVxf z|1tcwxXuw4+YLFwLYnpX|I4=y;MOUFldG*yBUkr_w$DEq;s00rWl^2|BDNc{Uy2Gd z|JNu#K72We0ecL}hu1cXD4u!x+ZvYNzqwfagNanbMy!TvbWfeQ#kL5Av-94E{;@W9 zRr>NUOhNMhdBk7%*pq7^d*s|?S|j_v@ZoPTN!OmWHe_2)+%IlR3gLwm;#CkfK6SvV zVi?xIjEZ0)NJ6Ji4qBU|O3=H*sdW?eXg0xkcqe3GSdvjHj+RhzuCp7A?2es z&W8KX>ls)0@{sj5gLbaYh0jCjVe6+Xi^X1+2l>FbudNZ77HV0S!V)IV_(|77B%ra7 z*{!e?1v^YD=?yJry{ux!LQE%bogs04b0)#47pyI4;6M#tA|Y)S+DI+d7*Y{y{@pNd z`0d?^&X~JVM%V}K?4msmp(zDga{P0gR)1e$msNT}0kO!F`8$JRr9h2Jk5ht^LuMI8C8nM z3sDN00O3W}82lMjWF@ZMpA=cq$=Rqbw*DeR+r;ljtzoFpXaw8pBtx!7RRkGc%wfxqsI)BSly6_ zIXg0Gse{9Ygz=3T%(8df`UP4TF+rFY3_f9~)ahr&a+9}bVf8PZeSTHH)UPEWfz z$vC-Wdn|u3VM!}h}6|{HL$^g>fwjD7JmSlKUk~elK=Ji%irAB5NuZV zqd5Mgd$qhI|IddnrT==&@~gk7Lvh7+6+Q+moEwbsy{pF|EeZL3^(lyLZu4VONPZ0; z7LP*0l=EQ@Vt%tm!!XY;T%a(&gvNz!FR7>UNchD{-1iF# zOFFAlt0$=KKPdtNuZ!@?i?O{Ai?373=pQmMM0Tf^yFpRtC6Yol>oF5csXZ~Z*rt%9 zbNhVV!oj4Q?x!2e5T`=wvfI5dhfK)JCFDr`L#9kl*yAQTzs^L(cJ)N9+jdnU=f4t3 zFwZQHai6+JaA@Y>(B6S0GfvzC?=zuuNT$ z<_-R8+snvWl(ezw;Y+pcE#xnLQ`_><^=hxPtsN?0uRGhiU`%YZiw#4FA!%BM#{qlU~KlzVoY47vDaF5lCpcg zjyZC)KRvI5rIEiX7la?!MTpn*`lbH$@K+$kfIbJim~B=kdhefIN6D-lMAmw0qjoPgL2{33}CMc7nM=x zJ14G2E<72gqQ~G)k_!(;d)ZnjjCYjWuJe%Lh3mTwj(XX|+;^dnFx%t}hrMm{73WCs zabqZ7mF59sd~8IEyvWDaJaik2*QI>_DiTtyl)e{E*=3n#2AuP;gS=yMDi79uz9Rgp?XhBLuW7a z@W@mKPGXKayLwNGGRIe?Yy-%8p9!*2_1>>Rw$Any?GS7mj~iiAu+7gtE=`vj>PB3< zE;R-gt)m0$Dk={fIIwQj{SDx{RlQn0u(5h^U^DgA12gGy{bE5KVk420Z9{B?M~)X; zb3$w}=<#fp=_D|qUJ)S_cwhg*Hfz)9J z41I#qpTs9@L-Ah9fvY~49|EP4$=7s7_a|-B#1NJi5cssMDeQa7_6ma4znAS8 z9~-eTzTL;x)Rm?dk!XhuxDXp=bi9hG`&eA3z4(BFKF|Xa4~65t>0|SydmZh!4@x~U z0>%U;x&K3lsg449TS5<&lej$a!flfcsFMedlQ)L9f6RiRYkO}Ew-RX1~X zsl_-U)@Ekd#S9d=5BG+#t>08aM%vRVc;^LMD7%b-kpG9hFAs>SdjICmFf%Z~Fvuzj z%%Hd+qGYMLq&N2^1+ztSBTLOnrF~PuJvYFR2Mrx4O)OC;Yg`db&2{db8OF?9AWN}a zpv--FpL6b=xdVt|Qoro|{sZ^kIp^GSKKD7#dCqg5Wg_Nv=;GF139Sa3RK~nPriP5` zQp{Tl3CDY&#Sp1*=1EgC*X0Z=H|Wp#GJ!@c8AaP*SW#Lbj*p`BEERN1i`_Coe_(;N87Qa?W$jD#FB!-UKHq1oP{hgJ|3J;A|J9S0sd zJ!>juZW=>}n0}SXaeRjCpQ7rSWK*%}aT-5} z8g2?CgD6)98d{ngF*SdD&CXF%? zGxnm+-hsfY2J3)(+oZN5e5p`CI5i%*z$D0zr?{HG4xybm7jMdxZLn0r(n7IJZ+po* z?D8j69g0|%9jf;F{og~%Xj6ggrU&G=xDsgG`kv`g8DxzyokQ4?$08>}?e^=Y7KXUq z(TqQoyl!eqJB3&|IyFw{)HsuXj|yGqimpCMyH=s9-wR@|&c%T0^~U0-nQE#BH&5+W zGB!I#6?0|>;~l{W%D+x>^*d6nk7o`W5h4RqBRt>lxC=Z1u<%tJ%4H~h$MhzW8?iIR zyM%X5!@ZfYmMDtlnP`lo`13}H$c2~rPzGIpt+kkP5oo489LRBLhUSHLiOwF=is=a*w&($z$ zD!(fwIeK$%@CcOjlN}vONk2)HRR46f?wvW+3c1R5h528|lP02%BgMH01f?!2uM`Yv2#EnWk~}c?dWU z>l-s?nl8x%^cujrIi^=}GKPHUn2f_elqRF2zvE0HawW2>eEW1%I!#B)uAZHXi*?3n zJ8S|`ofdF=eIAwNV)EzduI~4*Y4he3Jg1sACuj&{#i0uiHwKfQNm+l!CNJgm=f@&Ruktv8g z{c$iWM#+-8v_fbC)}@$~$`#@ldk(+%(G={_B^ev&c&Px9kadQZ9BkhgNX=arA*xU1 z(d$AapTzaK;qEdvm^{-ShF4RuKlG=;_B@nQ11aK=#7%?HA)fPiQjCM0-ioSZdFqM$1u4K&~;xgccsmHg^0dHd!np7ePxE3&@T5$Q0S;E5@F; z($PDbwvwfV2HW#iN&_wvn$imSBFbn}Xa?2{%%?qcZd50xorx*v(@cTE^w+`m)Ra;i zJA@I!s5FyOy@L)An`l9sfE0Y#CPTqSIR+t&kmj6ZY3adiOUIAm2oDKOYNP20582y{ zrfsTPQR)B)U5wO0e;mxVuG+*Iu~!ooW3SHGTZj>QwHzO|Nmtl2OE|!yuC6RCJ(z7% zwaG-xn?QKh!?ah4-%_5%q*I<1m5zO(j|ST{dJ;l8LPagzU9mZ|B0|)TcIHvKd(x(< z>>(i?y`f&QLh-@uqg8v8CibQS?M<4{8*ea0c3G@qJ32}WaCedl4Q55fp4dNRkAm)w zM-N`?RcAxO?+iMJr+~?4>I`hQt*k$0PR*cKz459X!E7t*j#o$M6dY6ex?9?vkvX!6UHEnQqX zxR4sF%OG@#sS~CmD8v{NUa1)Kc8RHxlE6{q0tsW+hSpz`ETo*&Vj_vmWLMEi-bLpM z`On$H)0dh&u=aKrVEV0X3T>C72KWpnrd+f*Qawl7yu}4g(|O9+Z>cI%M}o!`F2zH~ z*Wu5lCOy{Q=>mM4q~1_C$j2YvTh`M9T9=;DK+4B-)y3446|$8|C|{l%A*IHQPbY_) z=Lh9B!gTf9G~Uv<7#tTy>UCS#8oXDmBG%bO@2zT`?q*QHRrg#q8j}b%r^N1YRO8%g zhnyIB`4Pxlj*B@)%N(2DM?G88iP6I*;ht_wG2I|;in4QwFK^dO_%^6;HvuEI|WYr5Gl(B0ClN2HeBn9GU(R zO6YZi1!%K!(V~Rg>j~#p;y7!E1FZSX>ExMH|;~SqN|_dMmi0ee_<*{0rchmANnq1RV^eu{7OOMCn*P6PaN=l3QCk_Tf(OOdoIyoF) zYfA1RPqo`#3>Oyij~V8}Ctqd(mCJk$G3KE$4J z4T0zKO&*FutBZCUyqu5ymqS)QYUA>uDBqM6z-2dLP1%hwxpN+qfD3$sa1XqPXTQWf zF8=@MOA{frreB%PB9;2DH-)=l4V}l!;WEe%d?o;Hy)Z!u&#gDT>bpZ`5AsVz2c3`h zmhs2+s9&WYS!bvyBUWUszcCq6F4J?Q+jfVJ^^?ae%CQ~%twG!^;;a!_p z`_d}6D@|#Fcp+uB)5jy9Mtq2&GKU2l$}tRpr-vIGLtcrAO>k?n*%Tc1UT~FF*Nqhd zOw`l96O1{e2lP1*0IzH|we^T)AGY@%>1=OHIK0`U#t-q!W|P(JdPyNtn2Qdw6Bd#9 zI)V`b@&{ss0Nb}vhFN#H{X{1Tat5Te+IC9^_PlL3Bz(5z9^52mN=!8Sn@VQ0Y>`Rk zIJ&}()qONY*FkKRRjpz;5v)3rQsn_juoYT=$PSR}}thqhcjBiUf^7@ ziDU!yfw)GPpFwLgDe1hSu*#aV~Y$>sEXC7d{j zHm|YZ{=Mlr!k;jusJ|)F)twlYk_`5qGy{*I?tc;rzc-O6)AnPZ+QhwAvcjH^S|JQ( z>kG5|wq^su3ZfJ?gicYWk2@gLyWNNEK z(*QZ!5PY^x@`axcnZBh%4}pq5v;Cmp2U7;IDUh?FP&7i}2a^utx*7|ahv~`9uEX@? z=G0-6o*X^MF|IP^yhqr6H1$Lq0&&-7w;@onblXN)opJh)rgSou4H;vDAomz*HM<{0 z1C=iz^Qfs0zTo6h(^}e*NIZ@B-q%pFq!ELuo{yQvAh84T*gQ*T60JR@=!tuK^f zyD1CnH2@zhZ^W*VyQ1(=dj4-kA7{={p7;pL(CdSx;#H zTZnt|89!wY%*`iKKddb?sq85ro=fzK}D-0^@?$?l?? z0sHCME~&C0^HjI9R{m{KxI#2f(D+ z52+xr-4zcQ^_vO&FMlgK-b!g*=X`7QJY!P1%4T_ke>qAeU>f-_W2+mKl^O%Ayaba)G)u34NEOd+DqFN-EskEcn%35p{ zOSRZkx?E|a`UGrF4{UpxkP0(`3!-lb2cMF3@eLLDh9D_1=imp-n>FAQ zJUxjk>k$A0T5!Zor>Gls)1lrqjSYFdq8Os8YCUH_Fm7TMP@xZMh<-Noh#q77#heMi zL}Jak?f2GPUIdBxoMqbnZ9Vn3iU#&qFuA1;TOnV%895I@Bb1aEicS`k;g;oG_d zL19&``?h>X%7$@(q|z^HVl2acGuDi&6B zr*#i^=Uzn(PEpTxXbd%Tyb_-8!9A|LO5|E^$X*lR3tM|2N16_YdZ0Y>J_PmTp3}dN zzlw*0Dk9gbiIj=0({n+cm-c-~>&dlcR>HoX+&tH_BuT4a8Pp5GTnWj&xM*yupcl6c zz4H>DAB#Wt<^q)q$R?{km}fqUy3F2OzHI(Bc&ZONKTd%U`fw*hV#So_USirce51~; z7h(-Q+uTwAHOF|$6PEYo+>o*9A@!Nff$9533VaRo*$nzI2u}9p!kofz5sp@`AJ_UX zG8henj+d*TtRHtk_VYzpH*3JBwc;DA7*Yd>(NV$>Zc>$2e8DUSKadaQLMh3M*`g@PdsC8E3N99C zt@Q;wJ`^X&H!y7|_XtVVB}b#yikl03jXZhoQO?}()9G&L8ErWP592y9<;G`*aWBaj znXzaDXJl})hE$%cO2O)sDm~Li(JucwigsBC`jRL7T`|-BEYQWH*suwni06W-Dj*!< zUivK*=Eie_ksCAu<}J)+zIjcPuDG8TGz;XwsLS)Tp$O2^G?EQ?oz*Jv)>eZ?-bi*~LI4|SKdQ-!$;hq^=9=8&ZSAW#!YHNuNm z(z+PH^Qm>ijX#a%{D}4FW?0)>-%hPey8mb`tNejyR+Snq}Yu<0e*_NkY+3^ZI#9M6U0>5R6ZWgwL3 zdMY60WiAAcjOX0ypPi;;^BH!_o)Apx^(+EnH^+di^9zF91zyXb5l-mKTm#j2XBr}< z427;QbM?cjoZr|pmyuA%*p5F`Y-;Og7?l%^+9G^kL_PAV?ar?X0DZgqzHsxE2 z37Ox|tM4UaSIr}txQAjBL1?c{1ucV5U~^_Xlx%ma2N4^Whk^FSJmP~H)5UOvnDzJ^ zp64*@$*!0}{4V4C4M8;L^2_*}m!)a^29{E|*It+*UdS>r;M+&0Y;8pWi3 zxwx?qy6H&+`xU114i*hysu|^A7@7Q-X^tRS`fJ#O4n5_^gl3~xzRzUpx`Iw{DkpmfH zV1BT$8%z=&um(d6oKE0KBBwi~L}p%^-A8?uGG0e6WbvLdUh|~c#966=n@NsFipn~Ra9H^cyf`+Q;l0&akUauWz!$aPnV3k`)Y_1h#<@ z&(5HgYqZ=06vMRgPttW)aUL>Ys+?4jZ@4!UfJ(1B|Tmnb{32^8;ffLc)8H zAQ=nu7tvLMo!nli3MGr^bM~WTU%0-A8-uUW@5de6sIezKL6ge0Z$j<6Ft=@u0v9p? zRN6DxLi$vEan}#HFn2n5QVDcv4nFhHZCK18W~*DmHVk&{$Z ztR|dfLORE4$b3#_*hLn~I$&!$ZvQ4h^6#q~c>H{x@(BbNm#3+muPbpI1Rs?Z!^r=> z+7(;q0%8j(QVR=#wlL}sY+-+yy@du4GfhXgTQ`v-5jK_~Rz<^a@^Uwntwv^WEeQ`< zn1Ni%FrRV|j4HuV%U#B`;se+Lx5GeSI-Mg}9A6DBNsBoM#QDGx)*&tz-37)r9%1qr`mclNC#>?7MFJ<8K=F~Sgw zk+|%268lJ6hH@_&1fNFnlb@C0>We6_f2>qd(-D%W;KWK56zxoX1ddJ0AT+pOHa8Mw z6D`E=N{u#5-Pwfk1nm#YiETmDko0Oc7W&ysh$Fe~>SD|Tr}|I>$L9#UIhwWpinN~vud--g?4tUb5cCAHwpZ7hG> zo!i)is<&-T3jZH6(*>b&Zzwq%^y zn-4KcqWv^dC3+|kJ*#;e-F)~Ka&MA)sPHBAN(wo*P=~}I)f2W2SPvzJ%mS_*bS|Ru zN6#Xzv$z`xflrD!e}||*EGuz0va^UAO!goe+J5@ywAOpu=^*l7=tl?91WeoM^Y6EF z?KS(;g(ZksIqpt}kZ-xcOb#$#ph`Iw_J2!jp8A$_-q?HxrzE?%);qaE{IOyu*NWK! z`dwU4q@Vhby5p!XOy0#s;axDKKCVI$YZo^Ll`svVVn#DuM^3C!xwCW!q9hvUNq7Q2 z>N~D6l~u}ISpK^Z+^9VZ`gQp6C&7SqC@m0Kh2&SCwC;9$8a>@}iY=m&nZXUq=5=C= zr==Fp3M~fbaf0lEE#l{I4Ee);C$fv-fNyh#2rrZJxQ?_pe@b;X=5bL?C)q8YQAQB- zT-4B+YMxL3Lc53!HggiEQuk0rw-UF$~v05Y~?HlF`nfY88 zk&?FNi&7F9_wjrxB^h4z7kZeum+MS>cui=5sIEqQNhPznU*hQYp0szSHDniSsAPr` z)_7R9kITVtM`PilL_{NNiotMb++bl-Rv+zQ(Vkr{a0top7zLvE8wVW%5s8e8QjmV( zVuuuzTCjjfK~mJ^h+4tawx0wQnhD&kr~>up@b|JYO=u_-UIrE19D z++CeZ5gF&+xfE?M#L=KLlOiI|otPA@+T2mKu6dLX8ETZh`M?nqP2e}Ri4>}BV$2Mx?9gu!V zV9RW;!_LMKcQ%VRKKuh0$H+6(?a{0|wmngX43B*X|79QN`azc;xzn-?HQXvVh`aB% z4hDesEXp!NzTzdxJvQ5K>z`kpU z`w;N)<~hg;kF5t?kD{i0?lo+tatS*6=4TwwCM+5_Gs2<#!aXrKgJutYh~e6UR| zd>YIX+CmH~l`tY|y%^ZokndKdbwo?-PQy_CJ^ax}%^wi@_evOjKtHy>j{li-Qr`^e zBru#05UxX^e>m?iT!+E7C|==t!(VRH$;n?WEgt40mrd2lZuq;>$FAbzMqc4KZc1dX}c==SY?0gqY_HH(Z_D&vAG#f+jXap+#My|g_3IeSZ#j{VbQc* z5Bk`{{@BMuDD6ofdy>aV&4qTo=p!#jNiU(KhCbFf9&3ch-t@7z{V_b=lkedf<>F%0 zX~|y!o)8!rVgKYopzg&73*Wts@m2)?0)ad)8XB8WZW{y&jAzgbBEU^Z`QozwsqhWKYMsMlbi=c!x2ucD% zjvD)gQrPcCaJ@P0A=?Va5FW|*!hYa&Kb2Px;y5gjukqJNKGu1pfkJOX0SD=0?>Q2e zeSGkn9C7a<`zc~psf95p{~Nn0U=BGhyci5DRfTC);?IBNEbrZovE z2sIsK;6=!Q)}$nW<0eqhAzz8M582K#j76<@a1|zD5F|V-eeZ1#^Q9`}2icwY08)U? zyOUjod6znXkAU*W>Ab`1CeX4Qop*R01rxhby1?tE;$#bO-GFlt{~|2pG3W;J3OMdm zPMB%|N?J}y%Eb@FrUrJGniA$$fEz91=4h&%G_}pCoG`lr)U=$Ml#7YQrdsuoni8f| zfF~{D>1e7j7Mn6Sl@lgZfQFXSILfJe@>+zHjs#~>tZ*Fx8+zV$>HtoiddBg+_(6oK zm^g&)r`|lFDr}(%==xBq!s`|=ybq;M+VX-v^b6B##LLxPdm})x0rv^Qn<;7GBLbNK zR|{y_SE@d|uT&i|qSf7f*zjKjjO*`M6^#4(3)6}Mzz(PcfV(>(*Z`RbaT@`frf_C})CwPlb3Zy0r;V!i41Ri^Uw}u#tf3I~6Kl1?&raVDlL{QpM|zitZj*JjLm!IXRF- zif1}KOUtpp$Bh)var!AM2Z~7X^-j;$IEt%C@j|DcHlS+qMJ&GG>DdlPaV05!$mu6O z2Ut@4XQyXJ9K{u+c)8P0W!QI8{JPV#3y$Khr1+fG5(B2KdjY8)2M%yR}lp`bqB?W7ZsOtBd8h6laRV`aU?Sn*id<( ziWLG}pa&^ci84ns>dOulLUw#=Cx^FvWxqb-oRr?%VU<;-j%@$y-Qu@xZ*ze=AE4G46Vs??8ZH-sN|qYV^Bz`E+b* z#C!Z?Cf0c5Jsx8o4}zcG=NDoW?}QKd0T>{y@B{vFJQ%2F(07!fK}OJI{vqZd^qY)b z8Uj-%^WkU}j;3@FH?hPQHcsYSQj$#aVwa={`nC&``4)=prT*H{hPaLmm_To|_+}S; zQjeM=DbXAWYYNdOJ0vjfxVZ;_BcgZG6_GkD@@-9ora#5*jxZU#?$>styB-Dc8<3BNq; z3w?#_cW3e}7Qi!tjGM?mX7Uku7XuYTx&;_Dv-lqWG?n`t&5D6A)8|2CcI9PN)8$v3 z&LGwe=0jN>)D=}oz4JVQ)c@A>a24^{G4MqOO3T!rD+anG^Td+tZk;WcI?FsZw*^F} z@WiR>@5^lD+)?Tz)A~TR-`zV3=h8%mfkD*O=V`BrF7lu0sA!LTH!#mhV5Xkg<;1g% z`lWoBN|Prpl|)OMlY$)78pL4s;I}QKVQ)5HfP9Qy%j*oSbxj#Hap)`;;fKbw_;4&q3~X>QjENd>9(Ro&J<>1E*H-8O$P# zP{Q{_{uTEwTHhaA$*Xa7HLppkk_I~IiNs#;)Muz-A@)ByVg{6STDMSE{0Wp!vb>7* z^%WUc$TuPxkm|(dTMRQmh{5~BDg{-@l6B?yDg`imvfA6JIHg|>h74YV9ltv%pOw(3 z*5Jaups*&Z%(PrP#KhUb4sJg?tXVR%2U`4JTx$olBf!X|8q^V()et+utbw=J@l6qE z!#aL1{wsRe5&(&L{1SvYIG=Cfp3QhN9y$+gHVnw;+X|?Mx}vM`?J#E_TRH%|{|G?S zhcEfhssKOZp8-BSTLOMj_Fo1bk~cU_%`=XvN&MGdhproO36>j1E^Weyu#dANzHSrB zZtuh9O?;S=dMPWwyuOPsq&GDOLf0cJ72v&@AB;4ugqSTz)3L`;W%J2qe!d<3_co(O z=7lZ%NG2P0U7!4Pw3N5|2$b-zZ{;^v!ao_C`6uZ9fD_&C z`RjBKQ+J5)fBS_K%Ms9Ty%QCxG1Vt9kkiSlc3#{m55(JYvD)0wOxE;1XlMQ zKS(wm^}UQG5axY{JL6$+`8&jX6U^Mrw+=hVgnKU5d+9uNUW>Z9xVUslBUJB+mx*1p zxq8S~m~~K6g31+v?c4!=bf~^i3HgPxvMf9F=De`+(6yY3-*v}#M6cqQg-05}ZWF3{ z#nsZ8&)mhgRQ+oeJ|o;qeCAW0VlKK~Qp`UyOPGs%1~H$8(3Z48F0$IfcXD8U(?T&% z_>B*MBrE?q0{^F#f0D_CKE-^eyRa36^eM==e4-w-j?D3g1AF*)svw;C&mfHcC$e#u=*n35DpyW zpAg780Ah|IfYV{ZF&@Jb8UHwj0NH5wX=t8MvIka{pz5bK1Uvxd zl~!9g@kBsmAb%?rQy>1Klc?H3Dn5nhIJn{Qt7K%x!81tNK(GmLS|qEW!Uz z{yTwibzpiZQ|&~(YG`%Qj<2o?^%7{29|u75OLl16!Lmz)ppCy>;y<-RYe>v&#N2U_ zJ2v`;3L0N^1~)-%O~!riKSroSZ`}i-s!vLYnqAjaqt&*Ixex($=CQLcWjNL~k;fjD zy9Yw_IzA8zFB0{=%skLetRb#uPq=29;sL|t<_HJ#T`D(|1&=acEHZ~V0iU^=yWqc* zuI9%0&qHDE;(9`@_gEb35#Z^{y7X?K(`2zO+7mEIVQ!@T(qFI8DOU?v-yTN`jgqxPnfH?D{c z;p3*}argmB8<+zixS5%->vP`b6nr#QYo4k9Q*px=_3mMe7O!*+xs=gMa*7ou*Zv6$ zo16P#Y`g>?^JDlg&&M2y|6(HPzY^gtKGOV%$dqc{6iGZOs)gBEKpfudpZqS~8>Y)0 z-{qU>a!CEgMl=nzWK2IxABL*kUa4=E)NZHio5`NDhEL?^*3dlLt{Q9den(W!9%ryU=z9&@y+nA3lG#O4xpA=`M&yNy4=I@-E4DsnP z6OgW%m4{!32_4OjY^@jtn+8Y}<6l!v{#Ov6JtasfM7yq}$lp;#ksr5uBpfX*E+zro zeERRl0~^y`jkoE7#I5#Upxo*a(3a7dyzKT>F)$^_>;by2X5uCmx2@P&kxGSCw#|OR z-tzk|MK>`&^ugw^EDeT3^nRrjb%$JKM3~=k)y#K7ct#BfQ)%ZT@cC6o^jTCapWa)V z@DB*ahW@y?q1pFeK~h~Jku24Z3HJ^#fzoXIf#yAOO`;Q`my?|ol}iHH7(AF z&VTBGLzGahcKJ*vo6yXeyPe$o6<;vW4vD%zJMyz4{~__V>i70ItIE zrS?bA4>!-mWt8r)whl*uXboH)P6Q(3yb&m$3JYOPq9sUD%<56jQjGbdn5rModHuV; z=^&mRin6r=UFx;tpJY_Ev=*FOwB-0kFFr7Q^@2+HNnh-Pyiy8mEKXhH4 z(H9Kgk5xh5MDsdiwRNsRqhGZKaPU~C7U7)KN2-7$+*5GysO$$#-p7I|13fMI81na- z#nTceCPdFEjx4Pt$c>sU(F0~Yp=&2iUm~7@Zxm0#g_I_h7SGE?cRB@U#%^z+IdDNv zPr*sAc3yzEMHs~e)7^L5M(E*g2Sh(s8M1IM4Vhmm4SDy{I}G{yk{XAM303Hj#Z)R( zTu2j#EF?{-G~}QE-XTN5bf>9%Sem-@6PGWM##^@J4&%+NdAuvc@!Au$5JQJc;&_FW zES1Ka_V*+O)7~{v#5sT@RicV#86Jp6!{onducNj0uTvlhk?aakIP;|Ir1}Hk*!vY-(nV%|+_RQb=an;3@M=Rb-bey+X z`oKAh@9=?-q*bD0?ZLlk_4R3l{_)lfL61UK-+dVn*J|56tiD!h$O(gU(Rz53nFcVX z1kI;OC$`uJI&oi(znf7 zbcb(yB(=uj*5#^uU&AFfbr5@4{Im_eueKENsnTe7r`}<-*Hda7ZJn&R_chF-gWEd_ zp|z>aFa55jD&Ms{MH*>Y${j|US@THibkV)95mRHy15P}OX!wMCiIh{EhCJs^L*9~H zO>=$^D|mO;ul#YkVfq`*N}Kq;1NYr_c-&2 z+JJhcGN@N7fx5jisDPlhf#Z)@EPol;w3>mfQxSr00qz@E_1?-93y*nNq(j7sk6E_W zOs-5GwDz)y3d}*WJUOu|6Yci~F-5mS_NB)yroW7A;er}TwoZkWx)Ru7 zduloPXJ5;=f^tx2Sl+3*WD@*DeG9R9qG#u8>svfzCh>T7UVmg3!=P)hWsuTD!ec8z zKh)0`Mm}MA6QAoF;Pad0xf@ihUE>Q~2UuPt%)(HC_Qih2Edwlz?cBn{ouv^YsrhPk zmSNW`O9$hE#R8;mz5V8=E~Tfs0bjjaBI|@N&!BkR*h04hwO|Fls!yn2ItWv_Q zE|&2kJC>zW!$~`V%f4VBUS|2Aju{sJyT7ZkNWZpJ1V>j_6SNInq#f&$+`;ug|V=sC6&p-Pcfy zq@l*#$aUt^bj0Per4g6Sb{g>uj2GtMiS~ookKH_so}(-s7}@SikUd`A(9@In?z6iu z(es~4@s?2kOuT;FrJc-$&2e1iL51SI;0{}b2QDt`3cO-nIx;RaK%^(;TyZorm}P{3 zikO0v{EE%5yaboxQT~jB&CgqOZ4=L{Xz;^!Iv4iJIpMlBUY|av5)*{$@a_l4ofhx* zoCBZH7UD4(Ioi?@Jxj-owlqOEP8F1PY~t(TDMTM-+hdsY+|ib3*^F{HI@&T4%Xfak zQlH#D`+{XG2LCF2fjFTVD*VEk08gE#5Rx5}A8v!#7cC?V=;tq5nlJ@me$f(#QBHlt z@UddfMNcs+vl646J~qa(7Rt(W)tn+~Ca5|WTNlRqu!o)1`Bcq3;@l2Mbr<^F}hWiCV-xZcf>ffK^ z&aTM9SSJ`3<9tMKe<<0A+Pg_mnkm83hxvL+!#k>2F3+0 zv4jf#$@M|A(-J59Ljg(O`uQ#YJd}xm*7=x(IK^F~f)~=Mjxu}M6#vCxsqQlENjRHs zS&qA28L--%09XN*{>l?u~3; zgMsHxso;kUOFQNw*#GC`ohuTI2D+3Ege*uSGBA{ zI~=^%TH^56__Y=i!KOlvVP?=>G#6ttBwrk$fT;_+M^IGD+}K^Kgl{r%ou#d87X!(O zi2)FsAE8k3hZ^G7!t6HQO(?>hUiTrN1fz-wpX9t$`TQPBTl6I<{l%igPjY;3s1SF= zz&_fP84KE1wHo+-uar-V9r^jpSV|o z{D?)Yj9SFXF_%=*tTQMElE^)T3z8}4^R^G2a#^auWXhGsH%E`JgCZkER_JJ}byI)v z`kpXSL)=w{34rMDEgm=pOZH5o4HOxCx=_}K|202@ho5jJeTP)LMGq%CRtri{mpSl%!T`U~m zYUwO1kb%#Tn*lKER$mP~USN3y1!FOdj6E}kZzqh*z=_n~Rhl;d&k{Dmnu=O37I2WQ;} z%eGg($0=8ryM}w8aq5j#q^g_0O7h0vo2t9(WxBG|E~Pja&Wrsb=N}s+VV5m3y$OTL zEt%RC)Dt0G(N^Y$p4oV=eY4!sN;X{qttu>&Q9j76usn}vA==+j$U(K{?-mj>%J{qG zDh5p==O3l+^@AWQ=#vKUa_COA=G<2b_9Vk@pMmohnG18l(n4Y812A$@%mqsW)wLg# zBotVB%l>{aY1xMg%)J0{X@!0=G_0m)sK+KA7W{0hABjlm;dOsnzQO5P=Qh{W-&+LO zIUv#9oW3Vr5l}Am-&T$P>aSY5GD0p$7vQg1LLhJIZZ{?#7F?r3-NkDboe-SE6;f9l z(Bu2M9JdC~yAK$RN zL)<{G|6*$noo^urj)&GKZT%tbmPLz6p|`EDHS$miM@~9VjBT^|q^-x|AZteyB0V9J zvFc#NDO;1pnN~HvBKZ{lc*fch8*au}zaR}8Ph-P3WcYJDgj#ID@J`d0>p@?OO%0F9 zt!I2vlH{%Fbt4xM#Nxaf3 zh;M7$*o|L#QmV;QTEm*oIU&=IW&;FfF6N|Dv4M1zqG8T6>*CB+a$Hfe%QjVEv~0w^o2^6wrfvX ziwQM^>>)zVS~8C1!ppF~I+`Rqv|8duA;}3wSiv%Sn%%lm2s6>W853QrV3@nLO2iMQ z3`!90>u-K`L`D=S zWc3$~l}mq0CfOXRvtDImWtvbDjg?CS7YR}KNJ2^GvCnGbtQQ}M`I>L*tfwEph&t;r zepbm@FY(O<#91#Pi-!9%ceLuf=S){neV!7(@HFJ6%v%dOVv)ExnIrLE>J%&47sS10 zb@tD5Bf%spj%8q$ljp2WNwIKi2laXh9G?MGBE@?O4*T4K%HR+c3js&8YesOY+BH*D zG7BGgRKBW=3I^7{lkPuH}0*RQ(kJ8IxfnMk%hs8HVhJVoMg{nXZoxrVdCqzDI zM5jHSLBxfNAR;FJp@_Tz%$&)A!lTNFU>d^*d&kCAxwlpZ@xf+S_k!O1&Juc1DBe(B)%Ao(e`r2v^@Zjc*5^RC zxY*CwwTty-nI_E%$@w)S`Jdo&_W-DRZDsy1-bk64B@1{hIIX5d2xnV^t;+k;!sxqOn-g_Q|L#_*cA3!K+Kxek>+yae8ikP09hE@zbk^M6 z8aeevRw?WfFzLH+xH=zyWe=@s+!jx4XOQbHIpmtk-U`8!S7>3dJ!PYqFCNuPq&&vk zZYCQi=$$amkQ>zzksov}K8%arRnqk6T=mef;{tcXg0&HhJIwEaJBFK|!KxnCw7@~E z+R-neV;Hb_+Z7np)7pwL!?d0#Wc>TB+a6PR<@f0_*mvsc@gwzOi-NaK? z1?w$reK04aH>AeCj6srnSwr!-R}1kkjrWDK!kv#HyM>YohGxC3J{Zo~m8}Op1H649 zuD7+mX0aISMvHuT=5%1qTll9gZnuL-u`s(BHp9=P`t%mSuOFV zdp0}XfmI;69o|9J@D37cDS`>!-cyp@4D%6hHNo2pn)S7M642ZBwLa=lti9FO8X4jE zme1-j1UWlHHs0|~8whCP>tSbKYip(uF7~yyWKyAVKWmi7&ClG}R_xJ5jP?b1uAemm zQ;{Z-=Zmg{vQgTn5!NtZefImpzJAsr_{}2vTc2c}M$fc8ez2gw)kAf4y`Gh6p9VvJ zYZt}{$NO9RD@e7*5bvk-g>FwE3B$8jRK~B(*R7BV10os?*ox0 zFPn_7477HTQIcqFs3^mv=*EIL>qG`yjDC_fJmpF26Y_~{8;JWeC=kBsg?fjZPg+To zHq~HS;F-bJ$CU*#>`_~&Xc*@UUk*Jb_QhS+ib{a;$*{hCh5&1Bp*t8^BjuiM9Xxg*7$-_l)PJDVn*s zv~?kInodn~>=|RGSnqYuxTXqg7w#q2?!2M?7Yku^jLH`hD$MIvY8LeXZWrqql+Ptl z=(cgfyASNPv2Kxp52iZF?0Mo1B^cZ@roo^{>o7Rpq1X>1rla6K>Dyu*YbOI55p>*6hC_iJv=eR1!ZQtPN!?;JpX&6SjRQ!K==pROnz(Mik#&<*+WXc#P)E zbqT+puh)p*gU!b70XX%l$}?8HcVGv&qf9g6KJu_kGv5ij8I`enYsy4F;C*+8LSmt{ zFO)B^hRAG~+p`28-zdbm`Jw>mD%vrM0w7ytjf{1iu?oqsQE0xC!0lS;jMbi68mo%J zI!a)r3#|=^AbNA5l~tB~q-K|wK#yeWLqynM@Q{fa=kE(C$=1hF7RlX?!cr`pOGepc z7vyIyAaUHNV(Z_(39j2Ir2ec5B?$KtCEzSdGrsf*p@cQpq*=7$TBTX^U~Piy7{ZlR zAQbKigvRVItS1=RAl4B7Yyc*#S(0lVgp&T5Tw1t;Nl8tTA$(^*G6R zqt3U!h5wTBtq^<()Uq;8txWz$#I z!T8X7y>%-#e_%ar-n`k$dbo;a1TH8}5Bl0lqJEo`%Y5OTk6&sGzkQA8ZJ1qmi!}s> zv`l)|`0_Va%x5|XHW;mw@gH`j8I0IK3o#2Z4gCijtW)s$wGGy;SdaE6Zlm>Oe3X~? zk{_5iT0g?;7dKhoz<-A~(cWZiw)chv#|zow=!4<#+YwA-54m`*h&?o7Ph^Z{|5b_H zc3gELx2pD{g;y#CxSKVm*l|2{fBBXE*078*!&Aw=t?2Bk81EJ7`-FVQB)vvfI>el` zl6=Rd2j~$`j8{&zBObO@ju?WmgL;KTf5ZY8j_wv#Md}IDb*O{}VQxQu=s3rq!A)*^ zjzP0c;W%=bVt3%+cLk9h~?-AV{1m7Dk_tpH^MuHOWS-n(Xr~7RiL5F}2=})~;{IYxJ|KV?BtYU%343}<5>u~A z4CBFOojxm5W1#R1O5|}EnBtDB2~0gJaE(&09A~cKi`yRfjdYMGw)JI3Sm!`Zkr9arK!9Ab?rYn-9pw6Ta z-5!z$bUnBSEYu%M6cQg@=sfYOvBC#?O{gU(6^dfX6KJHeSc;|MJXih$t3t{%1zIR6 zEhe$v@3J(gmqfe~-i73nuB6F@c+*HE@>y0F%8JTozZxMJ?P*v_kaJ(5^}GwDeBJZmu)X zy#?}{7VF7j$-{6f!`jiJYIOn6!Yc3x_YyqLH1k00^y&hX1(iX8s8^iW&jWXaQWuEKuY$;c z*PIY>xPDO6dt<{lijT^?%KnsCa|!S%*7`z(j>-%mnp^5n9Yz{|Ieo}tz^6*X+a~jLGJQ;aUXc?Kyj$?_>|(dGOzhg*v_aC z+Xt9=)e_XXl|fYt_Y(7Z;M7!gL1`aKps=rIx4<|}R2B08s;BAz4M_aRNg$d-p^@mL zvd@rlXIk+aGB6|+Hz4Bp7){;d#1#eYaJ?*F3_jN?C%^brq)#`KOPdCxGGta5^JRuveRt(UO*7cY}iX4P;Q z_33Z!z;7rfPTZn+ez(-ADc}6y=9En$`Mo?^+FCV6w*$rBF`6tVa5HKK_d#Mq_kwC- zWmIA9K_^bs;(Lj@9zaf1OB_aB!c~cBE5pccXu%BG%Ayv+twdXGk4iv1fPAQyK+tt5 z`6p>zQs1PoIB+nc4DBXoc0y^XJLc)AccKHdKJTl5!i&vXLdhb922OFs&6sVV<%`h` z!CS9n88DY!@P+62;+=w=y}LqUW`z|sGP4Je+^R{0wP0(`gqQEfRU@$ z5^!bZcHmNfFa8}h690A^-6jX59tnT&W7uIQFfvD+#Fsl!(-c{>i z&`k=*@h=e$F&A^p{@h3g(`Cl44GI=gF|+lm*27@0wBDqBYm`bcZFT9Mae+dQv+yZq z`N|$*3le@D4BLj-f{`v0pSMLlb{WUlRu+W5cXy8Kx3vG3rv@oW*)rd$ZV0Rdfw~@G&6O)|9@Am;z>3k4$`8< zk?Lzs^b|BLd@*k$&fF=(Y!5N7!-N-YVOT8`_%=yzLASHT>yX?1aTeva0&mcNJS+&h zoGaeStcId5GTwpM`HKVa{r@9H?f*#eIa_Opb+gs44Lz!_QW{hcafC&hgn{k?fyUjL zAdLgnwj)Z};fBVk3ASboa~N`7v;Am{4YCbY$(E_1V#`a>zy~(gz$-qsuaS;jK%cVG z7uwacEyRolyXx7#L{fj(*G8gJZ}!C*91911Z9VXxeo-4=!>EVC8CMALiu8xxezqU* zv0+JHQmC^(DP$OUIhqMnVh)5@43DUvvp)p3`eVmuFu=TUW;B$$1^dIOdL6u=<-0aL z9GhojA*(9}k@D8r=D5PXeR6X4AraVlOcwjKSb&6`C1 z?DD9szNXBnK#5pjo>-tYG!4|cvKO3+oDqwZVG+_lCFH#-^T$GotE53(riC6RzpD%} z%{-Vu&3vbyXRM-Q^r4|vXt%Ej-G+GY3}4vQ!PZE&PXQGk*Be6brtXhG@;?0beLLE+ z5!_PWX-8zZY9;)($FXWLJris5_!|cuE>-$7dm?eMB1@yv z9vZHIM)Zpror0dR{?oLc0*5D_UL-Esv;)m4BbOl~_nCem1X^d>qLCKep(N0((@3lw z!%qGPF~@BW12_Eu@z-Oz*vRP%`|4U}?=Z^Flgt@yAaMpQmb!FZ14w*knGUqBD;1#g zI^~|;RhU1_+h`Q@dnE=Ri4BjOu$D0QNiz?G;az-NPd_8y)s{;lcuslT7K!Aw`f(dc zczHYviEVm%wk;Xsxu#^>24UFGfbOwa*m^3*seU(j!tG`*n{`4h{<7qITWRTvc_OW>=Xf#hq?qh49O2fdN zZWy>TzmJVZ*WBO7)*s(izb}2;6MbzX@kP0PZ7mh=W57#4U>b40ur0^-5{41QF#Y3o ze$ZvL?J11($%eHIgya3Nc@i2k5Q=uah(67$ZO!YE5dGgeI)Xn2A;;+N3!$Ie+{8$q zBl=@sNbpV4m&E?GFNUto12Jgzl+SH}BsA$rLzP6HBm`~x(pMW{!av(dGOJJP!th_x zY289u@%c)gjHZEzY@JB6dOm|FCga}T*OO4rag+e6Q`Ten6Af8=FL5_3DEUa~aD{uv z9_fGb=l_55C(Idb8-TP_TX|DmF0Jn|C|J@A9Cu#Ym98$0Ts;0KSN{LH#c?9Bdypf~ zOLRu$NVRY;@T%L=8xw0>_@XUVCHv7XL;h$)8S)V~D1F8DF|ua;;~3>C?NwWs&R?B( z)y|b;RxTZe>(#l9$MA0$EzXniK;f$>ovHqttMJ>!6>{xd&`z)gcK&*yqIxk;p;+=t zELOF7t?=7A@*BJ`!PeR@4q~@P-{#`zD;;#OU=lWk@yM>V4??4l z_n=^sEm-zWFvRUV72t{iv@uRWlXiX>?>s{RUJ16>A^KgLPLh=YW#z$e>RsDKY=Q9dvy+EVas3GIHE2q-=8Gj?5QTd2Sv zoW{Sz~6 zZBfQX87K^;Hr@8?ZbZ`V1}U3^>%p*&RGj&DO4_hA-}di<->29&Mm z!KIb9imLMU*GhKYze2v=>gdQnB45w==j3ZbPyPRjKz&jYs7t>Tg&}ed-g@;J$7bOE zjstG98TkEIyT%ZME&ocknPf9iy96QXU!)$J+pTE<=Z!YW0gfMQc69sx&Wh@|+mN|M z)FP3XDZKrLK>fs4+pC((=j;aza<=>&n7_3(QJoO=3Hc?KmzWt)`t~2bpdJ3)Gp?)- z6J#bFIU5A}HMXe`vwN3g(Erf4x`$jN>YtqgKCHULi3O8fXan}x9(CkWDg4P60$Gov=o1fL?WH=6hWk*bu@^e; zqe_hf`)m_rU!uZ}GDz2Bt_M zY7ESY(h~ozvDhZlBq)XZZ8~FrtL=S;sx15;R<7uCggQ`1fqz$5l!#a!))oCA?S}`DFtdXEV35AZ znW7L5p3RPULJunj}^{ z@1$Yn^G?8e5Kxw(sKRk4l82>sW|*$|MXLX2L%IgG7#LJ+!}#Z{j8AfRXzP{WCXo3M zAzQ{Df8NUYlL_NTLS!Zq0Xb6vpIj&+$NR{j<0a(b?H6!Pvz{J=qXBR<_=5YjB3Ib; z=wwUqI93z{E{{)ofaLe0`^d|9n2>3d^tTxxDy#)h4?;^Jbht$AhBz#U-4MsYYBB`y zs37uN_i09Q;cso^#|232$SM54u_O8lK&x7S~Zuka3|X09<$cePz)53@y0M$Xy$HY4Y(b>vXrv%1v0JeF^f zH+OJo=RlTy8C&F#vbBgLcB`i9b;dfAQ;$LM*=l{QOYQ3gK^H23E6#0Nk#x<1`Na1lSu3bQZ zw5`-ZO?FtEhKEast0ijb@TO>9D1c-c=Vw#wKRlcnPIih+#kn#ruwlW<#&1Z-&r7c1 z4TA8B#7RTQbNZ@Spq8|jI05sp3vS;n`m(Ep71NwT?r~r9VFr-r7#0BPZBl1^>*@5> z;EG0=f6R6&6%W!hr@J>DMrrkwu%x6nA1@#^rAH+NaNMVjFQ|7;QoyT!6$LSpbk?Y5 z{L`1ttwYa!&Xzc^(>9>D1Ey<_`&{1?Pd+a1pbJtQ`d=`~%MRt|-lMxZ@u6Wo@#Hbx zOa!)YmrgCgieo+WJzzseZj6UL8=zBTUwwNyC9@PpcjDR+cE~j7eWb`HaL!lf6Nop2 zF=U9RnevV%%6G5FEyq@<<4|pD?9Un~=DijY$6wX)W_*RwB0kg65~n@zAMeYRMoY$J z80g0(YBHHeUN~C97!}?juj8$R-b%==RFw&gKi7%L1lFHxFUdq*H-vOmCesFa-+l}= zkvQPz8~iyxDHcQGr+WXUWve@hqviBv`_Ym_p7DP=T3m9Rr7n=ezv>Oi6K6Gs$W6c1 zg8{}J3dnNhx-%ov*_&awY3AX^HI^+}hG$Si2RCk`EO!k#?DVD^*O{I$;=v`N)cjn@PAjrxrv zPY$X?&W?4VXc4APx?D9=ub=8sbEd|MDN{cP=f+fnT65}iod}r{ztOct>fw!w@HpNS zexnm_^3rrZNMq<7VP)#tUVFbFQ^z&ttofBrH0FrIk=8R*Z_Of9>!WaQf+@)=k>$Aw zQ20nsyrQZ%(?UXX3M0^I)=)u1`1C`AWxZeP9sNRZEA)pT+4u^3=u)Ctv9J;t@yQ{f23pc#MrBLOfU8&(d zU?8d$H{QLBF;CEVXEQ-FW$>sK*FK<(dHVcZ2C=W<{A?{YOKEX_E`!9^xWFLG{G9ZM zy~Nq~JH)@k4Ml0nwwxH~X;VtZK9<&OW=lPQ!=JW6hClvZ<(#%X{W<0|tk^oI+4r0{ zr^(2iRtBRwp?EICS9D6l8#1LeQi+{ac}f%C6ZI+FL9KwoO#Om7o8O+np*5J_pi^g? z;ia=1USk8ZFH~aE?H{eVe=%Cu zE?hTBkYx_rcfp>c9-cRIRBY?Hfu1&{grgpwugPqZ-HnTNp$!mr!kVjOr}KY`W}F(R zNE+t6$W7;Za4%gV)qvhg&MKBPy*X=~&%xdlZua0TL4wZ8)Emo`hL?C_Rq3Zpov}>k zx>9GXs{NGX60Tc3zEt1Ltd5^@dE&ZID7$z_E;@O=5Ai!w(0=v%AzzcHvf247@!#`_ z-!FS)Rx`EPvzPdNiJrZT#j_U|8@W*Y*KCc4JKY3iSmNAEe8T4X4D*!|zwMG8M=TkM zbAC~U!)WdgC-`Q|5sTlpXGP~U^xGzG%C7aOG0fB}?6-*GO!)dM&f>l8UGYbp!>E6= zYR*Kt>5R|x!hKB{(l?O{7g>C`O$TvVS0*@VCw^pghl?4(HIXbp&E(y+e&#OuY1d-X zB_92_YII3r(!@ZoU~ylRO@8c2{GHK!84Q|Bn>xXWksNVGPRzj^`5AtC4^UmW<_jA} za>Un3vv`pP27S!c$HrQG%{|>mZtm9{aiuH!nEMy;I-w46MONt(e_~b$Bz;0#=`@Oq z!cXHz;lwuvPnp_CoZ|}nZuEw-UpIUKBZvGS!wGipP%76YN=k+#Rik3}%(5>{%H+Mu}=+_4(LC zg`R zO+<{pp^DW;rE$TeR%|H>CNAU}*feK@xzbG7r=b62G3RaSZpx~Dkh_#qz zXjqHfGt$(i1-pv`(|^FuV+9xZltz;Fb8hhUD$WysO<2WMXo>PE3|q~4LcI;xJ5NDV z^$RCq;K>B8v%A`XFt1u_>ignNT>A=yo}c{`LI*p}lx%GS1>bT_%^m#AA*ubDyCucX z;mK~!9}32DzM#5(LT>JJ1m=B4tS;p{ROsy4%wNmhv9KAA(E9M+cFxp#_BdWO z&NZkwZ#_c-^wZTB8lnH(gEd@R<`TTN7MH5AFkvmXoB0FYT*sYaVziz=aS05@H_ltn z4aQ)ld+WJzj#C)c1yYKoUqIyaz($~M>*j`0Bj?VX_%n4YSC95Rd~ZDABHbiy1Dbv@ z74gp4W#O;x3M7%*S+xnAayfzn6-u@vInzz<1JUoE>7e~Jm#fD}Hc6k+*HL@9-p}sq zHv70>TXu7TWyL70X7A^MMEX3d!zr^(KEVC?j1JfG2eDn`#GEr+y9xv@In0$?2#j*% z4W-%vtt@I670NI6D00k=V$QXCQeG}yy3EmTGtP;AMy z!_Qi#1u8;lcfV0(gG)-d$B2Q5pSJKkH<9%0QxJ0e-9paZ_{F!Es$!momyvmFaq(0Z zw1j0>xP@q>XI3A@?Wc5)$i|EsV!m1I1nHS+u2`UHn?m-b@~?8q?o(EoBgD`ovl8O2 zaT;`YoqUapa8I@=nz4!$`M}|89C4b}k@6)r>YE&(y zj=d90xmf3;s~Ql0Z&z0sP{ws|-(vGumZ{b@*Ev_mYq%i^Mug8j*X9!(`V_Dv(M&6DK9X==3)mMd&34c4D&1F-gLA1NibFV;D!jAtJrRt z%_o;lpY*&be&PmY*AcXbHlN%!H7(jLaHo}a%ch$M;S5WBAHycBhLW3{hID}kMg!mX zPJeS}2;%|`%D9%2qpRS9GVX2n`8Gc!trmM_XPMZvN^CmA=94tjC#rJVD2o0R9;b$8w>a0}atUiX)Lbc^I4x(zW6Ql!{q1v$i$_QF{kORG z7~K~Dv1K!SVA;8kIduZBeWTfNIw4p z3bfeM=jM#{xm;XnpJZRLHozU-HLSa44~y;hII@e)dmMR+gMpqlrDTr-OP^!cjJ83x zIq>%?w>fU7R&&=(6}GkoGZ#{ll~Iu3>ZX9m_fERQgkQVA3ZvhCPXUYNI%nxO;SR9r zR9H~@us#t?OJwQ1qj&t$v+5^HJ}ZIHM1Gr$L&Va`PnBU&;J?HMPe+ZKFy zMFN_Eo0>tw`V2A>OimJc*%`L`C{84GO!<{G;;>k#&u9m(QC9dN+WbI5Dm*40s9h0S z`_LS*J^^ozL z#8*9@7p|-3L{MyX31pHWr3cqj`|pmrt+gv=Yr^oJ7WErQRe6H?$NExmxv&P0&eUia!h`lcUz_#E;Kp{7JK#Or>u5UEyV zm?>+|a}r6p-#V@|xj3#y{)dh$ZC;+3Ixz(nW42s->=aXHu6*4NY`YL6Yu=qJ-7gkJ$1)%I2q4k-i z8(2~{=nQrls z>jOP)N(tSt^m(*1+6W;V{$C~8X5D-aX@(V3vY|8^p$$vZp$kQACL*g{vO)8uBAJ+X z@@;f#`*?yE%LiXM`GCh}+jxTP8pabS^Q@c}^=QL0p?=Op>$MJUt`%Hn4YeBC_wK`7 zh~;NS$RCnCiSI+oc1#g$gt*KJ{^F}Xkg|;CL1fOP1xQMBAu}$egC+4{ZG#KKdegWi zlZPscKG*|XE7Hd%pWX|y!)|N;(g+jr*{Y}4X@tp(aB_Q_T=5k0T@({D{VA`Qdbh~$u zs4It{SfT$noIj}(f_82+5iskJJpnHsG!u~8lWdC#1+kdSdy;cOP?-ICYZ$$x13GKx z45|-movS;ja&>NK9ShCX^`U`(4iGnCk2n07t6Ra`f|hx@C(NJFa<8r_BZl7A!_2gF zqc9l*U{&vR0RH=cOqGO-#9eI%g zU$}^X&D*CN7&67xoXXs^!7F3k=+3NMRq6%tbK3eisk($axJgYB#)u}}W*1>2Xu3mY z)^YFjb1NG#%8z8M2es`DHYYk4YpoJrm9^{ouqw-rvjtx$_)SFk%5OSWa`}JIY`^Xl zQ<{1}7mE8KVFz^Wm{RS>2hgC23jUyjy0^%NiX$cykLsZEf*l8Sotc=_L%KlRqYZ(S zKAv6>c}VAvnLixa&~(q{QuK6cyFb|rzCEP#bG!UMCEJLd_jd@o`hNszhjj0llG;UM zEI3JOS9(ZSACuad@*^;GXB-Wu4yL4bKIp%8Oe7a$>d?arT9 z!->MCN?34Mr*bLF_hj8wA0Q~RFzN^v z-pKG|6|}G+DfESJj_ADQSqxUy2t2pl@q+XtIwyrb%ae7%6nYzv=vpuUXYkVGzibn+ zmo3msEJ^aLcrYXlAG0z|4PjTOyTG8MI%0|c>ZmR-`1?S%nQaZ2TCX|9)LHc%WFFNu zQ%v3yjIIEfAa~|68cH3vwDCKTd^Si8xg`x%aIZ}j*1)x*^xQ?HXN(ISzC>{1xUEuf zp4s~x`X*LP1?L+^+?Ink$65tvoohffkeJFH)@eGg*s^&x)~8^9C1IJpUz<>Z$OPS9 zW0H{<_uI?JCHu`XGVi-}fu1&{L_}gK5s~ShN%heM>Z>2?GaAVaFYx@%&l@}hoeT0p zWW%=N{$$F(yxxWUZB@_|jV~l*e>!L!`4|@p4WTJER3%OGbOT4?5TS?-%MSaXTheF zQ1^6xHB^|VY^cyy2-UFqDyg<@({n7?v0_R!+`VpZufn`6mANLQ+ioQt)jq{%s(sSD z2ziyLmyrj!tNlInb<&@-+8|Ho*;6kGk311$iD@1In^HnOET!s8xi^$d?Gpk8!$U)0 z^edB8nBCyjD2VxUrYqdMr>oE8fY*K9P}dVzo!K?MY|c)(>I;}XS?}lQ$Zkx7%=^00 z=)@(#K-J;?&~nhNjxhXzE(l+t`l2501H0XCIm5a^w_IUr;;Vje=z&gy`j8Yoiwg%n z@&{$yt+%0U*^M9%lhT4tZcb{YsyDRXYY2eZf9o2!iy2`v7-ShTd*;R63IN03I#Bl&SmTc(a51|irPO_ocrUGKu#QTsbH1-RORT%i$Ek92gOLFZ` z#3`4{SFk}i%}sl#Yr>3$oQJxpD4-ta8~mZyBV8+;`duJp%KDhRCH^-!>1q>I<1^GVcYq^x zEAHi0X|C94YYfV&sWC`vm0~I5pKZdz&*z-+bi$@jNSy?XDHP~CNV3+vp zX$sfF^<>A+zOPrBfL@7*7?~|YcTGUkclLcfzm9>1rHyPDo) z${yx~I)+)f#oEzymJ^@JEN9=>wQgj1F}D8M3U+*yp1PWqN38u8QW$9{ME}wvkgWS% z;mNdlt+YKn^$L=vfe~e@90vX8uNLVi@^N8{f_mAveFG&iER2f26AGvP^H(rTbnK>Z zBt9^3ub!U883l8bj+)~Iy}b0ZncZ;4OaBi37qw%7pZHbW$40NzE^TD+k+=R+Sn#%0 ziq+l%$#Fg7@xbm!NDA9NJY`M0s*)qpU-?%}Wo@v9bb(Q~x z`dOK6g_;f~@wxI~s&#eu#lYTV1NOk{P2ur7RM-MdQCO$u;TM7%HgvbLwQ?gx!eSf_ z6n0nA&mZn0M#deYKSx;){qdl(-KGU}(jI#y{qioel1}$TZAyufj-^ydKPm&yUVK|f z$WBy%GpnbW?CSmKgN}3zRn}yxKj6{TIsWhytDlDX?V{e&e<8cDlVl+q6os!hzoidj z?!(Eq^d#0QZ=cKu&~L5-cq~qIhr6SV!Ek6sYft#Ajc)rtd00vANoZy<$#yBkyXsqt z9&!{XqPiitRjO`RN}oe@!-_@IN?-kJ4CpiUmd*2*rUunSflKOdD`)z;fkmJhx#~K@?HtD#mo=&tcgQTe5jvNr8!M<-$eSo zl=Qt^D1e0O*mjjvFFW)c1~sfW?_2$FC;(kA7(ZB_Z)a3{X_{mWD6h=2k#IzN7oRP{ z!e{=rO7!2N)gt{nGeK*&nMl8n+}MylLu)2IP2pryN=T2Tg!B+S1V=> z;%);1pyyEifU1d`jovLJV_+T>Z^y+Lg@Di&E3cBa8QIT4+YGH1Y3m{}Z^^$j6}u+X zTwj5j;VPr46_25?Q!*Cw~L}VWcT^RQ4vHe{HW_?rkwRl?}zzJ z@tnLiVLsu_8D;{Kamp_y>SvG}8|pv&*+TvP=<#P$N~r(vXDw2{igb|2MXTv!aUZe$ zA87igtq=-h^;J^%$l)5xYz_0XD6)fR=`kC&$?@W4tx0M?WEe5mMp$QschqoMB zOB~oKSk96Im0Tpzl4xl(MnfV;II$Tec@D!ha=cqv0!=3CKf}&K``W)<6YvLeT#+OG z3hq<%8c9MqL`~7xcP5o$*yDaYEBCJpzET$7kDY={7Xukn^ly_R`%bm?gTJTfo49XT z=EUk5mitkHKYRo^d*1Vfe@)f9y6igXNe)PNV6XlSgQn^mIc7;&dHU$V&6r>>XI6|5 zCKk8z7x2(t+=YotoZ}6nm(G;67q%BV;GU9$gXoU$Obuuz{QIy@;^N1ePs@yk6ZVDH zeVV=>Bj1=wG6bYH@9v!%@978`LpsP{)^z&`ljcTYW4X5L zBK=_o16Vzm=zAltf3Za0LplnNSuI)6#t)7xK~tp!?kv%FVMe9L_HNAhYI`r$W8j(u za+c|1@CQk{{;HXEEW7@Cvi)zvI$JiFS%-S=+LRL3*|MP;tYg3NNE;wrgEd#lHFLH< z$6SgPQ?8k^QNO{$HFa(hs3yB){;aoV$@SP`lC{Vufm7C3;**s>k%iMbIJ;WkPZP~Fl~U)5NocIhWx4LkkME%9c_lg`o$JPzAXDt4d@7=1y;pIx!T@p5wUY+V;6VK z@I$grMYonZunrZEDiBtPTf_|wdUqIAs6S}kCoUz&3)l?BgDcEbq@Gf?#e|FpS5$+H zl{ShsO414;C01W0DSuk{9Q(vrF(D<;C}+g8Zlav&w$L*SP&J`vi?cTLTxCyB^_I-W zE=nXx1V+C`C@Ru&ex|r#9DmMs!}wsPJsA@+&1BTLPYLw2DJ4|IQo7EpVH6&1gisOx zuab(#|9B3envkhYxvKZFEG27wORpAa*Q3mab}KEkv$u`cx}vu%)h1p1l2miLc+baZ zZm9aah86bnfKq%muYSic%fYinyjSXK2G41C@6$FlgHb?vu|7ny&_g^6fh-(od~i=} z&C}7x50Xpt!t~(TB7%*8=o815$A?N-LU(o*dvKySZpbx+;6$PC2VSMYc=HOw4 zxLU#BVUqs@%Id#{>x?3AH<%mmWX~|QZr*<(aN*%& zE0aUy6Vn3;ov%~d{)+)!EHzj++cT^qli6UfhL*joky+wwAZhZdaC%mzTlpgH(kYt- znAQ&JI%ngm!A3OZEaI1^Dxl8bvqzm77teqD^-4%TDz9+tclM==xOl?Ix9!i z`XuuVF0LNfFekunt9Z!l+q8KWK5(7?#tv(l~Ttb8gubv{I@iN_)< z9+d6GXUcZ*k%p^`NWC)=&!XP)Rt7bc1sPbF``;obaCyzpMeE$k&{g7odYQEkjxKu| zNnh3otY%j%w01>QZz(^%NoAb#5v81Gt-r_vHe6}>!WUwt!9{3L(LF`ZdPdns`u!FJ;1d$u3iXI zWvaDf>9`V~MR8uICpEng*s$RPYX>VAP#i3Jcik#eF9f%8eueH9pJ{j7P5Lj3pR1ld z*+HU$lK3#ADP#|Nih@$-tXwsaR5O`Zp>M_K%6(hw;`|vbQ9ZDs*KiwFPO-3Z9cxoB z1hX>PzN=xxC=mxT6|WgI+CZn{r_VClLGgwOQumcM6VwvR1XZVs)H6`7<_t8~9%ZHY zOt}ju-gb;OV4R_`qx;b%)`@rD67$4si&vcwmuez3rvgIaGero=h?+#wR70qv`|ZV6 zgi04b4WXAco~nlzjGSXLo@QId6JS~qgZmO2Z01|Ap?c9CwhqttdokWisz567nUc!x zIK^6@HBxQ0p!qe>g38mxS%c^lFmNHINL?vF&kZD*H9)n@hFxY^*u@^$T4(VWf>}A! z$`9bIj0dw^xXytT!m`%@>^@`dP>@Nf_Y{;?U z=xJ7tw(H}U#nIL5BYJ@VTVl@PqB0{5d8;G|G}``kRp}VX_ujy z1WLa#Y}Af8V(84c?^|S@Om{AN+GP5&M0oWkQ{`kUUFh;qd^T%64;|sPJ%&~2RB7B} z5F;S}@?lROS7HQYk6c551mhpS%r%TgbAut*FowoF=4`m_18*Af(Dadc*d?*BInOWy zKfq|lj@Cd%ISpi-zSq#;DKU(4YYd~DA|*b5B58HQU!71{n6%{hwg?F7U3 z8!X|Bi}o8@(>(lMB)z^DT-k5vh1j<}VE76ztHg`vLHacQpkWxkymZjeLB7xffervh z`JNYaIAmx{(l5x^Kq&7g_k!_<3@s7T4TlVPY%d%~!t0sp|vT`Vs zd)j6$)QVc{r)P*3JKqMMq^IKZvIJuF(1K2X*hrW}i-ggNM!o}=48e|WJJYO0+5$|N zApmXBb+5}lLv&UTF=c|4UR0up&o4ojooB1dCf7ihrN)IP=wRteyk<%u{_ax@khM1) zUIe=&~;c`9mw@l#|8h%6eg~PwCG9 zyLze?JW(30`?-JHcQ?aBPS-PyVRV!#7_#{bO`vRdsw-SBHF!y;hd_=#)(7fcH$;-N zR5Cw{^N0S|4gbL@C*@xy{!n_|@F}Fpt*hud9~0HXSoy%7P!OV`Jz&2VTpA734KCW-#+Wlli1Ej0#sM(wF_MVepWzwU0IE2I>KwI)0#lGl51-H33m$ zyzo%HAY(JU9~opMDjW0Wc`sNTWPBBsP)rNr^S}$bU3fLz1DQ744*B)wXWEttcb$I;NnTbOY zO%n0OtONG+31pE`d5!@aD^+lLgG~kfI*Gz%4 zHosr#NPfS((egV9wq!Qa_S1{CuP~14pDWcc<7ZNXhMbqVGv^g3DVaJ3At$b|Qt}*s ze(ERS@s@FjyRg7Y?9&Tui4ApXo_&VYs~%OAx2-J9zGJldSX_R`c$hd{Y96oVA?B6i zftbmVeJ$Bvf}88{lm3X1=Zc9`V;BF?g!vXUJ&yZ{ulhitCm)D^vU`jHlI&bye>J{N z6R9$)PawO;@i&m`;~yUDMlNfO^`UzYV_&?FdUPxjRN<#w;cO416aJsM)mZ5)m-t)9 z$XPCVCyec2c2AKXJ$p`QqP%70$DF9+WBla~?Cq>h6}fR=miB{Q#?4G{+3HSWUe6gD z@W#g3IXkNpM1Ex)jqOLNFd)ySn7GMiXK8a|jRA~J81+aa#%rfX-)_wK!`E-~|Hb(1 zoH%{}GY&GN9(%)tuZ=FuWbjNK=?@b+^G=ZLst<*)KjXcyiGn`H#$F~67`0m)iHf$- z33h$PlML`>pYcCnM0deZJRk4uD6FV2cslpNb@3#r3`Q%tkkqccll!$qIa}huZq|wJ zwdX$Pn=+%JXJNM>#i9QN)A+8@h26v~d!P5~3roM?UkCMvMw0sT#mUQfpK1=pYm817 z8mm6$35`2O4fAtkRd}>uNn|68E<3i|HC;8L5km-%$u0&GI(}>2s1JBWXLvZ`b zsIaC&E1P5Q*}ifPwEW5#kBr2Ae;}FD zV^)&p1bH#Dr$bpYi6aag%&QRP_-Ql42ghlgq(>sIh(^DHVfn$swdtQ`QWLDmeuD4mE}~j$tKs-sKq2>wxEL zIy`0IXoI_RN>d)@ukt|ewRwhu52{mcbHmT^=jxoNY%@Md_Vphb}S=6!B686aAVEp1^ ztic)L7fOAwuc75IBOX6`rItkf(`Is8i8Aavt57t2XY?lQSq*upylK@z=wvQFQ{|FO z=AkH0l9MXQlhPkaIN<;$JvyNg699=5j4g2$lQY2>XpLoBnPe|2^go(|VCVrmHl;*V z=zn~kP$sntZG}X^VD(i-!CYGZ9I;GTF^y$GtH=HqA^Py1cL{CFH@<=OGVm zgpddSuaZ1R?p8AjkCNx(6~^z7pX08miI$OgMLio5RvMk^?VC#RlBsb=#1WH+V$0e4 zV~3#9z^pRff7-CC75&w^ZX9jWzSBF+X~eifC%0MESu-A6XEWqV?S~v>k67>MH>DD3 zZ%@W~26`9$> z)3~sq2e>$6U*EwMu$~WCTdx#)ha?TASV`DrBsPY3_ZqWY%9uyqYWX7#qbh?ZdyQk6G8mh0j1IIMC9F@hABss3 zH5*M~u|V|>n?kC0B#IMTk(~SILtf2^0#Xm)V5Ch@wIi|W!8rTp=g_N@5=Fhb-NpYChFr zBxSWu^3CqX#k$fKsP^)>5hOZuk^gw~<@~ud(Jo8%b-47cU8-r$7_C&Bd&WvNVou9= zSczy4|AvUO#x zTrf7r%F!?$94g=NmU`Nh*3@`qf`d`Jwx&jMgu~;av6W~e*Fd-4{6Mpz{N{IED;dgz zAoO>m(rhXJ^`yn>rhzx#=apzKrz^^e=JJ$<>3zZYKHowzSpjU9fzdE}J=12{cX<3c z0%|f&2Vzcr`hI#Ymb%ru_ki}BLe!5HEW#Vtmv6x=gXF%{w#It3^n&#t zyr8BKPeGbKYhOvt7qTW?!ICCkqNZq^}2lD zo-LO^K|Y;)2v^p#DI`K^$^GgGCA+*{uCxInlqh*OjAj#PuJD3<|Z>Yb5-Aewc_6^(|r+Xb))(twCc+40er!VYx zI+i?rd(LXqqq#cB&fKOGf4IUxFP^Njs%6ys-Cmo5qmS)H+KjuE=zQ^xHtq?k8rBnu zmfW?cbHN?+>_g71sb^D42wiZeI)t`MDdkFAAcV%Bt0wg3lhvGkYzQqSHOF=2x@&tW z_@bwhy7(`9Qj?U^Z_=|pRWjgz|+lZwW79G5))DIaX4RH`=_$RUP73jEoOiC zE%fQI*UFmf1z|6?haGy<7l}aBY%+`Oyj@AUrQOz^ug~ik>+VFsZF}i9<+fS65%&@= z+hQW#rrfTMcr&k{tjCJF(u#0dbK(_1MKW*6=hIndN2>EjGL8cbMJ{ygo(#Y*FPriLvZ0T*#O{TXjspj6+9r}VUC zX;KX*9_M%JP(s=+Z>>IBQLw!m74iRUfM};YQ(>%Sy=NV3L_+Q>twheWQZ3t^KV~!3 z^riOXoKk9Dev+Z4B&B5esV~*y^3#P_9iDUL*+ZnG{i4&AIEIJWhy68-QjzwqrY>(`Hqzj&$>+&rr0EvTd&1oTd@x#Myg%jN#><>fd0+VY zQ#`_f-Z!=SFFw3tKR~uzvB*1`9Nngv$h$39UQpgSK`-K(D7r4zGqr9JdRwkMm(V+R zrUpWh%nJvdtvFDSV7Wi5@LfA-JuhC$f|4-eaO0QV&vfv^#L zNAqq;H7z;BiBZW{7!Kn{TID-D7|DNvOj5W@rNGsY_ zWBKi5u};-Azs=%%z}lJo&|r>v+rc5B(>zrsW7&%}zk#N+(8*c! zfR`Lyr_G(kFLspO$@C|uQO)It%JjEA@%HFkRDR-8llf*$95henyUX$y*TeS{lKJIm z1=ghSfS2tld^hFhbT2$G0=JwMP&k(lfQIwukmva#GKdkl~ z^!gvaK-rsh6J6!}FrI)31Go8ndki`L*L;2vGXO5m=Ud{%dja1TE9U5sthSkdn^FI)|D5 zkAeP+`FF4vRxak-FpJ^LV#I81Wz51Ucx(6L84Mz3_02#LH$?RF!ZSMTF;kf_i?Co8 zzl36zvxHYSABTuF6ziyGi&!HwViHX-+sO0*j7r08iIAmeVmt>8mr_i(EUkcP6zp8a zJ5g#if!Mz_UeIF^>Qj%FAxrm$*VE0&6Y^e5H_^2@#5BA^=^CJHL7G-A3}IWK+r?VzYBUWMuG7{E)T~|FRz4F_Z7U8Yb^FxYwETp!L}8=D>+rvo|< z3SP$-iL3c=#~6061I#UU!)ynu`6+G$)qIniZz#lW;F~G;IS>#r<#Q@bS;L3ppkK3w z|54hX-4DjKd~+DQk&lGiYxqFOT8kkL{XxH$-;AB}<2rthoYZ&70gq+Uctfk7_|I_+ zz)$?U$Ogqf@zIEqW<9zj-`)?JA*(U|Vm+^r-^NbD17F9j=bLHLmFzJSG-0$u&~y4Y zg@>h|^?`%yc}?&|Yrl%FxeE4#_|?VzAj{$#V?!0jsk3?3ki1-?*D9q zPb>K4XOy`8;qK2Asb9C4kqU%Ye?gMQ!l%C=m6jZ!RPwwmLbQaUhxEOSXNhZkprZjj zrOy1qE1GU{Vy~FM2r(mj)#j%@>{W9ylxOpP!AV#Zp1MTDxtV^~#P5?1z*}4S#*{{- z4v=R+(b6@GN1tyKCC_ig4#2NI)$;YJ{J9BJD-5PVAyW%m<||eM+YvMG{*mmos%tgj@upa zeYQw@-LHJJrVm`$yQcbr&E0X&=CeNRJ#(?x9T}Cojr2g@!7yTGGd-WTHtz4K53iGdh$84XE!e2C)k{9rYM2W(~M@qxr4 z|7afHK(;sm6&|>ghZ<=PG~0`__%G0ZFS1PxOx(+N#h3fVmv_XM0r`AOdFm;mB|%D; zRXz|hk9UR<`FvM-90Iop->O&n!ts0>RCYce$JiE#*oW)19Qbe_-Wt z)r{5R&kTF!0Vx#tHi~h&jz`97nNx7>H@^=m$yoh;9iRPt%#@ z_G#J|1B&<$nWgYc5&yMhvNtr~_)Ump5yub3M{P$PG8$6|z4a8!d3qC;hitHP@*u7c zPAIcYcpetPyKKhuumw-=H*hj|bVb7l31VUB_Km*91+ zfudcA7lQWR21FZQ?=$iZ9Y13Wkx_QN@1s<(C&gYJ1#Ucw^7|{iaWKBl^Bo$+u%}JU zxKk+Hl%}pN5@A8_!rOBEIF08U%N{K7!Q0<>zM-@qtAp~ji+$Y`cp4v-)->A3Q?QD< zq|>5E`AndqE=3SU-7f+T{&M(TKtPB{64DbVNEmNee1;GAJ45S2s|}5VaA&9K#5z7c zgUyq#&qA!%82WKjv*=3rMf~P8euJX%(HX1!D_kqezn*7Jzn_PcmhXGR+_Svp_gRm{ z-w&SU8_9N23~!%Bw(kp}=S(#%b7$9z4#zO+93O>pJM$bO!ykp;&hagpmP^>nrcM;2 zw@{I~A|gUukk@9?fK&wj3WlS!Yf7V(UN6Rg(a|uX*d#E?iG<0;qQK0;tKt?$dJrjk z%=D7F5D)qwAtF`wp&NWz!cSm|AnxuTp`ac$s2{v{69+D?Y=0C=;QAlDwjl3bwY29w79`vd=EdMX!(d(Y=Ik zg5gm~SFl0R5rkD$Y!DCKCI7j4QXal7w%F+w-=x)i30u$dwHRdQW&NlR>t!hvM<9?9e-8Brz=aH;p0@Cpni7fFfn;ZX%Z@PpJWeUU$jFr9?TWEa5+dU;^fm@|o#(%j9C3sR-wgJJ=nH&n zNs=oh>Lc)MtP5yY*$A61@XaJYg}|UsCJ#1yL7Kq%RMFm~RLB!M7LrhBEyc zqLQRv6ju{XOT6LcMc&1vaXh)mkEb3cMU{FW>$Fz$h#$;IHZu?xJ=zb_A7d4Vwftj# z#xoFSzns={flhc!vhAc9`IMi|1fmK{kFfeJw?Esh|6EblA||Ysfp7@?L|2@!5oLtQb7&SK~(xeyi#Z;Dc0Mx6v*glL!{5{ovqZ)qe7L`|hTR(7h6Phu*puBIW zx3-5HqLd!{ZVNonEW5c>=4yLbak^(jBUFsKdti&Vd2@^LTPFo#CNhfJpqy(lajqsXz|)mUx;xNzSRD&o)A#2hG(2JHynlOO3-jh8YZY_{9dWu*_Sc5`33H#>7$o*ccn8+!c5;Wt0YWRulJn*Ui3cWgUc@vy zFxAofa-|kmUeXQ-#1B9HZG)cOfUKyO%bji4a9#I@y#q?b}R9VTh<&*Ial_ zvhpFEYmWSyrgd#0-~pGL;j5Oy7kDXXDP$l*@sWa@k#8oL;F-*=h0e~wR9MMXhqZ^J zgcGK+5E$K3@P?mT2`y1vTxcasv|^X=x?sU>&g=h(T{~OsNJ@tGj00UkDOoku15LQ9 zMQt&nBCdeAs6sETo+!6KEw!#k# zo)qiVUKoOx@7oK@5cPl#f{MIt@}|%MrPI(ih2!M$jZXA&OebLs#ZmLOEI2^PiWYy7 zh}c;zMF_*w6W@J>@%jgX{sYR9wkVr65W;OxPA?qz3LayAlqS^*c zxH)XOPwE#!sMf!S(3pV3_7u7zbTfJi-!ep2+u`@_P$4wvH(D!hpGjB-vtpz%>~9vs zW#Ukwn^qemC>Ulf?1>e=#7pDe!b(K{SZ@I%kJduL`$9)%m)4_?P)r`n`qIaiADGx0 z(QjbJoc~Y=`v>y=1Lg&Gm=~Df!_5QJ3JAxq1@p9zgg^qx&;1bdUD^lzgk*-y8I>@{ zY(|0yvUJ%eWa_&QT?Qb2_hI7zVI>-ijh0R*A0{+`?01B3;QpsVfBAjFHav73Ecij` z`$7QxI8bnA_G%XlBt38+#>Qa}?A87fXYGMdw{tcK;QH|M=k17Mn|k`N#U>a-D|W=z zFN8J(mbQbj5B6#k29rL(>8oNNG)MHu4n-k`(-i-u@TCH`N701fkj}U_M-e|@m@t#+ zzvj{~fsxaaYpL-5AHbT1MVY1gr!hy#D4gpN*}q2%?;{Gm;!$#w zX%;)?bu!``j}b_pd@zR0SodJvx5Ah5dxYTk(_=Nw(O86C@-B?|x6lb$_jB$zBjxJyxKv^Z&}{vb3ZnC6Vf4%x1iO%Qw~Wd1jI2o(`iMVpe1 zh?r`s)E`hpw1k}rLJqS7zD`8t6my;>3Z2~#>~?0aIk1VUL zN~9M=P7<2Yk8WB&8a_#AfV&XMlY|KR?Hn|tA9%|Pj+wv33NKA@rxhwDqk!uRk&{hr zVKwHWNn+7@a}oY^W3C(h>ycR0aEkRWbJ2HGXoZ>PBK+&@0}=RJVo~r^>tE)gucr#c zKB!<9LF|vsyNOY0n}ogAW18S>?gI0-UreJ=%${cL z!u&~MHRr@4r|DKG%taqhH}&pv2FiQ%qdit1c276ekFYG=CU!s(eu>@o*rpP5QOpce zC1~bno!<~E@mpiEC$c7jo?a?ebOgVqNUb#?g=;i|RLhxGq|D!Tohh`EO?%>v$z&$X z6hd65tO&;KyN|I)P%SRowvHMmch3|eWH%m@k1pXyE=QM}KiU9sZ;ta0sgy)P$!-)m z-4WA0Mb8ofy=<2ZM;utG%E18=$IkJAA#HtoLw1V>p4#7M3Fx~@4VHh|q*=^~niL8J zzn~4znrkr}5@N47p}DfS%~gLHTCr4pAm*K7Otj~S8-$p0(GLbCO_V{hbenA3+nb%U8Gy_0XgTKfBfzrlr6aV<7QD2(GvtSuqU-CYDVv zSRRfNFuL1pCkUN5tABt3Q$<}m;^5-rfVMQp;Vjym8%rG7hZo^ovQSEF5XVx4VZ?la zYf#71k|Pcf-zA~9&-@dW7B5N1wL9hs1BmV&Fkg66G8s2a+WyO1J7PZ0qW@q<$T(_V zsl@ijCD~DNh4cdmkFYbpPeY|P26Dc;=VeA&jMyXzYZD(DX7ivRgDrw#5){NO<4LF{n#8^N+LUKWNM} zZ;5%*G?~MlY^R8n#xs1iG0SmTN1=0rIB&TZ0ooI?RtP=_;@%Zxd4weByGnSK%$_q> zk=YZpt56f_2bq8N^n*>S1trRx^y2{mb_;rld*xVvXun3dg#3{+w6iagv2G$$3I#=Q@z#W)nUj*>opoiL8M z3fI>O1CbGW{3MXX$O_P`!v)xcpHNYcfgL{yZK;caGbE}ed4cPC;Y;a^BaPBW1vFw> z!^ZVOCxjofxUg;)Zpc_aOuOewowYOD`G-nWqoJUG*C54~vq~K1n0Ie#*8u-Yxn4X7 zT&jK$o9ONXsyT{oknwHTMlUPoDqOUu_n#v)gMz?0#L|taG^5~fwovWxF&&j7mRMrg zl_OA_I?Z&@ZZj^2H$dKbq|n|=bS~eI>5G{g&!mj55OB+g!<(A$rhobL~sSomc71?tP@J% zoXCNG>DMQRF;3dkTX5AWnH>cszqy4hTNZ(tijHj+21rWJ0ZR7}C`fRV$xF{s)4{|o zuKqAWD}*5F<;Yoa9|m~2NQfN)KA7N3C>vgzX~LyfBPM{+`=$`VduPH*B;?bSiM8&j2kG|b_iiO*y=%C zE>;||Q+Q39{hO(`M(q@P%iF%U$`jXxszi@ZvCj|&AIRAzs3-c;5j5Dmg;mYo6Zf@D zz2|4f#;gWErT6@)8G#h2C7z4}w(n2>g8!Vj?g0b03;!Q&?->|X)wK^rNawru zK4$`m&wcy7&-?O&$!WW;z4mJRS|N0ByUWMI$2Ds%xwgCdAPgcxE7?=$LngVj;6oTB z7=oUS>xLb!CbYGfd1oK2R9^BTpPi6IQYdUE7<~%O+$qLUx-meEV+Mw>VSy_KPr4Pj z+8WXyQCKB4-bTg9{J%SOnAUJ+77*kcQtsHy|~ib>a<7 zUrjL}9cuBr7?4^ez4|u;Qu|q1?d94fpO!2>lJ>en4OnXtdtI{V@6Nf@eXpR2dfMw= zB{Wf=7Y11(MXpczyIk$4);?DY3`GVe4C9lrV42;Ai%(5sjlLEc^IN#jRnDtqW(&z# zG$fdY6uNvy?-F_y_g@7DB7eLc7XLUpqJ=PB00M8)L0SHvF5-0!O8p5CMT zU4zm51_xY`_<84mYaaS^`+&=dtB`}PR8FY@=cYyn9(t~FJ~I#ob9>&f)9Qn+pwYeL z!+KYqq0s(EzIf!h(%P3qlj7r&$tmHCTF8#c9bqaKw^3W%NA*gn;UQPDjW6nj1SQvD z1+SEkElB=AvWJ?$`t(9CsiIJ)k@Npmhg>P>)5D#12H>N1z3?qk%_U)qHt#o{pE~J)s;1c=Zui zBy?hnd=?tbq0V+PA8u%;+echse*DEfq4NH*z;uSD9dQ(f<-OGMD6I9JXy8#-MEr{a zi3s}Q8ydC_>@<*p`96mWk`LVuqFqN_JFpQKSsq0giV7%s|GoNj?wG5;;rI$_{R4#6 z6ljO#gRBJ)#QsjnBb^D9cEZJvevR%of=gIN%H4~)FP!*SUu7qU!~@UW#%je=-s8|< z8tr=|fKHus^^;PCY#mA+PPtAP=B=Q_(~yl3^q1c|)W}m^$TOwpwDz>C!*dS{UQ^rA zh#y_;4K9_3H$>5mA6;gP3w=ZYa>n405VDVK#mU;4G7=3ic<%m3sw|E?u`yC;u%A(%(G&HAikP#)) zg-lih`0Jy(OTSR}vtsQ#T`Ohh#-%SwNVAu42?^R2fTVNdNq%!Lhk_E>5csvwr7kRg z>9c~b=-5xLVz_Mz&$%MKzxpMbD>w%EtKVtC1qkS?Y3eYQCk;qG5C2{}>QdyYib3tZ z^meFO1B5-X)*MD{!hFNYzlG#Mu6|YzziGQXL3{EZm*lX3${rTEk_^jDRD5nt5Y_wH zpyK^=1o|OBmd|Qf_?13-s3Q?h`q{P7uxDwBy2i6nEY;Mt3w6(#9E)G-$CgFU zy1(FW-N&`){-oTOKAWBM|FHX$&i`+^zh$xB{p{rJiBf6a`)<@_@&&KDJU{d!?^<)W((5;wy6 z_}-Nudhd5vi%4(+Z5y=e+n|S@riNQQj{NRw3SMC*>7xicC0v3fluI?nx1xQXlX~AE z>3B~da;{AE9_^voOR(|ju-)c=BiMLofZo_rxdF$G>5Wfc-YT@PSr6UlB6bRi?-Ve@ zpdU0Zq*`>0hpZuf0@56lwemX;c~Nep{HFoiBQ^~fV6wUd)0>x}ry%uJM$O*=$$r^& zN$Ns#{&2l&`pw3%J`=s|mZrW2zRUCedI_OgG>|F{jSHE3JJ3Wqt!!S@=!(lDrI+ld zjpD!B8$D#9ZMwVbU-D^5cj?5?=0a>)f5lbDqV<4^ufUk!g^I31tLX@-eQ4wBVH9)C zmB5>9f2qknTCABSo@5uTEGLE1@z-qLly}YL0WBxEq}u;3XnDv&x_7r&KjHO{d%1gp zG{GK{m-G6wE_A={T5dc$H9kA}VuJJ`_!~cMXP6352k+Hsr7wK`65SVM@#XTskBZim zhC$_F;4sR*=^E~VWnfM))M`qpvuwe>2z%xnv;u-puny#6u?_|mL!8C#XN`%tO_9-D0{!LRK!w<(OYZbr@ZjZ0^O&37A#ZAeP*#AOnM3K_I}r77pbqmAkD4R~sAPoYKkTssUC zC30Rc1<{o8pK-;CXM37!^bWSh@E!EjWcSvSv0!2ZA|t_k-!tS*ro#_hTMQ6>GM<(X zqWKS9L#1&v^cPzQ9s7PjJY}9swo=L?*GR*jNp$QHWRetemSbP*m)+)u?)N0eoZYX| z$)*>A<}TVFJhw}7Lkn2L>WT66^oeT}J{a}X^%{NxPWr(7^Ds1q9zBIs40%|8TB(Uk zg;R@UYSg7De9kDPzwy6+sf$dGCo3ya`tT+()X|{)ZeBVm-gcCRK51r0@aj2loK)FE;o{t4 zFC|XOr*0mKmQXC?(^hqO7^L6aF&TmMqX*jhe^8<+-ycgMeU`NmG6!Y`(1mVAK~&LO zDZmV0_f{N!J1++%mMT@V6bBmEa+xB1lo*(4tT5Bauf@YFIj)5_<%BBU^xcMQo;=%z zzm4xZV5>oNJXC2whkXuW|Xky46SKHN{Fh(W=ix``k0rjG$B{- z9ABj=&S;$XRhHr>-A}1&n$K3_`+rg?r!5MA<9{PF0X{>Yn>t5yw0ERs?NcZc{Z zb@8)W`?-W4{<%NxxNtLs>f4l9JWR7`cLTDAG>k=flPGn+P4VZi29k3M%p5muN*R7> zrvT%TV5$%xN>2$;>Kf)7C@r=|sP@^G0PV97a+axqq#4?Kra;k(MuCdV3km0nbui5j zR1*0m9F+b0hmaD;TQk?L)bPqLI$p|_B}E|OHd#px_Q7HWhw?FabJoz^u9S6ao>rs> zF1!odjxwvhFRimH7I63I{~z4lB8!u;Ztfma@@dI_RHCVA+})zbuYkKp2Pt(d3vZd_ zJNeWVf17ScAsAP#YqL|MS#O%SypTJmKEf*wd{)B7)F6ekv9ek{|B8)S4K|;Uw-8f1+fyT z+1D$_NTH!3I}A>2$bX~rv`{4qOJG!}Qdh`PZhCG}vqX;4r51;$E=O^5f*wDw@0WOF z7M6w*dhZ>kIQjl#ku8+b>jOLGgef0*KXJwIC~gnA@LMX5Q5@7TT=A1~s7<&MFKnV7 zbmG!&J53K)I-xaiJtcaBNP}zEr+N{5b)cygNP8y{9#I9{@DoS9fRTdTht{=xguSp*P@j(-iKY-W_gne^d_~65l!lZ z=2<35=zxu!LwxPj(V>KTinw`R8C5wN9!dvelt}NZ?h?LWyi=9XABRJ6NRvo*C^gaM zg6#YAImbgX zQ~IUu)(%3igAl5_AO4k8=BfE6+^awri=UTqsA$;yP|uQ`lG5uWgwgdTWqc_o#n;b^ z)7X~ZO!7V)mu!KYtF{_tO*EpMGFFiZ5%9z0NEbt%^O!znoEZK zsgGo9}J7l9y-DUiEhM%m*LMa;ra>ve>vgWDSch*(Am)o6F#J-BE;~? zHFYkx<+uC;HI*dEIc>sAvg*RITviPglFZY%Z0GJoiF;PLEMs^Y$FVh1>1u7Ir(s+) z6$RbtM(gV+y*-XUiGw}DQHoNGtwJbm!>eYhQx}U0iDw!^|JDsC4RZH)_z$lZhwSeV zT<|3B??~3aKBmR>FxLjksISzA)Rf^XAriZV(wJ;eCMk1;cOX^TeZ=3m^buOv>dP)@ zaBc&o40jbe+o{bcGc(;3asQ=)Pu+_{UniOg(B4a z&wyY${*&33|M9EJ2&vu;6Kp(T{T#501;H>DYqp6y9{n7~L}LQ~uL}P!jQ{7bEd+W~ zq7eubiAI}k3sr8SRMZE?SAqR4i-b1-e`tjzFT zG2s}jk4@nFn?2zez0pO9b@XCI{Mh=Y6ufdz!GPJWhikGF76E-O;&a=$rwc zjP9;Cta^>K?Oi1%d54Ooh%a>i z@0a7b z33HE*Q~UC{ik(`;slD74$Cgx_Kr4GGKBD$A&($urR?+RJy`HPx(Hqk_X`cb%Sskbu zE}k3Wc&(DLz1@{0JXgv2-g+g8C6y#&=_dD4A}Z=*ivB14LvJeRy*akbDtn>U;eF5q zeN1U_ABdoNbfk~+Dpr!Mufh>hI`&n%*Z4$Eb{D48@jovHD_=iY7o{NZfX;9B1?zc} za?J9COB{F`d$c0Gh zRmwvDKJdiMu@~0%Q_4ZMtfO^P_j;in0y)RwY5SCJ^aHOQj$mS?Jw~Tzf2Ew5=LS^x z%R_rm1tX&#Pd9K{wqGKj_wR_dX~g27M#dFzgg z+jEB~!a0IHk*)P&>VnOGfa6aEF{*uh9Q9u6r2)T92f*O zTLB#zhGTR~=+ZDq7t^SC@pwB8`9K+Ae{>)<)@T~-Fq(N1(kIb|M+fNX2g*Wh)&X1A zh11UR`+aHGhstZxR`U5s*@63qK2p{Q1=x$E7&XW!L-?5evGN%n*@i+6(#9ys7{<@XKp31x7slvcR4DnP z8Ia&6j8&3+z5`^KMjGY_dQz=jP3q#hZZ*p=R8N~bPH%S=Ix)Saow|)vS{S~BSvfuy zTl=b{8EZZViBUuW!Q>F1rMZd)pE%ID1dDAs7VNic>Jowm>-A3@S`Qw$+ z-q|YxalaEjszK{J-wKX=(QFQq(}GJx##t&J537Whe0DCo9&NUbljPb^Yc6!5oPAJ% z&P`CBpqD>Q6y)oiB*+)RV;cE-=;UhwD=whSNrHU8o+QZEF|`{P zM~_>e+l;kSHR9b*(FJO;M7PL|5EWmS*^ZF~yy;R+8QQv%;E#l0?w;o+--P zn3AZe%9=pv4;%(YElas1l#CjQu$}wXNTsyTm2-IQ(Q3s>qdrh9)MJ)X z-tb)%S2x;_YnHMBPcvsLZ;91k3ah`=bF2TsY~_$)J4BhjBY138QQr{_sN7usO+Ivj zu9_ZHG^H{G$`12zZOGp=Pg%=*i3%Ome7RDNR?b(Jp*KQP>9YVvyY)1FfwBtkR#~X{ zNRlCYNO%H_2UVJEwNU3p%2@Y0w@~r8gkWkjp{h4o7c1pF-HRQezZXHgEfy;WP)cAn z6i5`>C`Xy@{?wNOHbm&3-pNtQxmkfDS4qU;Z<(ufb-!w(EK{Xm`p(eZi;m?gWlL%a zfP17hmgd@a7Mf996Ux<>N_7v7hQXVPhlK_Enqa}C9i|!vo4y%oarEA{^;CZ&)YxUfnNZ#~EZs|< zo0QTX(`S{n9hYQ3&i(<60yx8_o0Po>((&1>6c})MbhFZ#zg;0;sVz;R-uX%oX+Isv z$Hw$E*|&fkz9D&w(ifks+Jf!nEAseOY3Vo)&)pLn>=W4BhT;Sjq&66P;CqtZN4o9f zJL&yzm67=7=C?|u;nYs@+p0A6Ifah|RHlp8}`t>RC~Kt##`H!RxdVX?RGH1^>kpna<+tG zf!DD>4bI=WLz&5ErEP)o3ZIp6g;;Gnsq!x66s}CWmHRjw{baWi5BpQx9_2QQDgC|j zrF)I+{vK|SIi7Nowv{E-YUfLVdzBRT^S*nP#^%d>j*tuzTz&4+GMFw(ONk7nYkL(B z6Igp?at>=2O16E9#l6m|P}W=Dg?c9oX<00e{6_nf4`KPp&hjY_H_w`$jh%FLzi_2Z ztA2so+u)OIQ5Fkl<8Ln!@u^?=!f}>@h(7I?5<8Jxd31yUm%>hzIZZXwfP+e3!?LaP z<3U(lt|4|F5gE1?MV>SyHM}`>Ii&o?t(^^8dY8{1bQqQ$kZ-pW6+>wL5hcbj?HBs) z2-xLPf9gIF{?3O-;0H@}ddSA?DvuJOrhax*35i1eoWhNq!h-~bdut8{eh`J$9#z75 zK?ja<{zwVOlwmkyxbT=VM>0NH;iNMM;b!`K!}7PD0HczgP{!v)cKYiFrGfO23ZGQB z&wZ_riCUjjWZU$wJmjAdd{tzz^~82(Bzf>VK?2*X9(JR(^Jv>iI;R2yC zTYpp>)~u(|axCr@{RlB+H3H3G&i#n$olz!wrO0|L1}vjjKpn5`aeC9WGZ5NR$nUJM zv!|SefCM6G6lbS7XED7!sPOcP;Oz97iBfN>|LY}hYWS0qt=oti!6d-Dbmb@1-ph`(7sm0}S(4y<*9Mg<$t4{2(92Q}LMs}}_)wYPa+J>!HMmCOAG zI?>=wI}kEzd03BZbqMRnv2&t3PtL)da%YZEXYi((y8ikwgc_d5s_a08>v{)M_S4lK z=2D0d`-Gey*0P7VH3Bd_p&K-UkdMlXF8DYo{f3V(T|F$@nLa@rBXQRk)4Jn zED52}_aPejUlO;1v?f)&q5mFDMf(!3OEcW9;D2(%-EWta zN^N?}dgQ#n9uk6wn&D1-q8aY^CvL-C9-_!}MKn(X{`8bJLzQIf18gjC50F4s)3`{Q zcNy#GSJ>xZC!>PP%3R4vZ~cK)KAj5xz*g9u9{vI1+DKKdD2>7w7-ZdjtU)7UyVJGh z$yZ=Y=s+v+V}0~{w6NzLy8`_-|5Ak0Oat#?Ktir!BLX&NjjK?e_R(bg)PG;MfqKfC zNeRb2VGQU1eyBTa0wNrk62SsJH7_w{Zu&JFH*itdHLyJJ!)r<*Dj#xPSTH=~ggG+K zx30M^*0OqCtZe5Er72M4`t3dEAs;cy>n24DHDuEbgg3Z=Qu!|Zgg;;DgxYoG z$B)-8!bwHU?%(tgPYp=HHW-@|1Pg@J+=TS`Cbhn)yc%$QibXCfFZfBzR_!4tQ^s4M z{0%o1r}sCToZ6AM!aJniRN_rJ2DvKOOGIQdPq~^f6!AEsMaM9a(1$$aYML(Q^Iw|t z3jfsB1DFckzt0Q~_SB6|0rJj2#0;aP>QvmIuH9Q$m|)Z7d}3oUbb}PSQ>;{o{U^GT zN^D?)b!0zKDtn4}ejK<;q0er?>G>&2t}RNYHMhV|hSTO-N~Ug+{wKoj_NO3hJxJdj zKL3A0*jiXW2s=AwOqdjE^5^W$P21u22HI%KI*p^94Imi56GZK9D+SiOM%*YYmA(G^ zP)Pq3?!XcT2$efn6B{Kw+3kL^?T!*30qWnQ+e^IN!C5-_KfZ%qqyt5R%uC3>*p&svh!w$~D8=5dD`@JM4X@2D|79W0YtrUjf{ZIruM>)q|WyhPe?rhTf)$dPwp#KFrTaLE3cZqv%rkh zy^~K!pr?F7tH9e$4HWhOJKQH!?}1XG=08n5n4-z)&G}R*r-k4_vE9QJxXU6EV z{MS5<<9Z0T7|Rc0aAwRo**`GjaC-NV(g_@S$0KDKHixrR@JNZKagSlMJ566dRwhKB zHk2SpAo!JAtUQ4g&4*aFL56DkM5*R?agVks@Hi(G$10vE9r5`ePn1ZpSt;m5IF)^> zg!moS-$XJ}dG8)-@l@%^YhXG(l+>WZOz;|ZK2@sO7VohjS$C|lhKQx2J#!4KrIb3S zHLGUWJ!Q@q)?aEj=Q`7>`&m?%Ah8fz;S?(eBgb(}j^wv~3bm2g2k7o@i4B0nSH-~E zi5C7QKFKk#5I^O*L2Ph5uI1=;+GAiJVymiSWKA(Wxxr+oSw_Y!i3JO91<^SpOU8b6 znJ$=E5XG8UWnBHCUG>$ju4q?lafPp#iSb}z;7srj>X^j`*R`v3T;Y{Gvv}pEcGJfq zUMUt=*-I*!K&$;MEEI*@(%zV-z451Z#k8y2+ErPr`1+1^)la*+t6k;c3e{b(@~&kU z){O+s*Y;plQSyE5jWHhL>j&D^e(ma^cID?OzHZM#xBfWI*`<2#SF|Y7Jw%Rwv=ZLvC}KQ ztYY~Td6MpW)FZvIUs?F!WWInj2|NvdacOm`FDnOWb-gbO(xp}Y1k&mWU*@#*!D+x2wn=Ep***pJo3!$g1P zv;sSeyZw;hLwvB*pH%_3IqlDC2JjttoJl_a!~{*lL;f5U4j{Y9%9V^)Z0sY9)z|pJ z%AQSG-Wa2r0qhOT#?$~d-PBH=D`h)JBH}qa4N#F@R6meK>T1S3-e2C!K7lMgwzo{r zMn&^^T6H;CyogTc1+rMt>3I@0{P{~EnTtMq+gV%m zjq#Hk#HwQ=7E9ShyP`pa*MeAr6>(A?ay9~ChrsGtIha+gkRs-m>YYEsove7 zG^jw>xuyrR8qq0o?u%c5cYUeBK$sz-7X@RYhNGG#dNrj(FtjQ3dI;l3p_WmG!#~7Z zLyxw>Z}b)AI{d@DH6RIy2g@bO?OQw4wn8h?ph@t6go6kl<>f2uK`Xvm(26~jg-9v+ zm8h`+Dlf z4or|4dsBde*?l#QO1#FEJqL3LWfkG6-8u+Df~s1LavaR7L{(kyV9pAwImVCf!w?O2 z3+W=58-m}(B~Cd8%gPFi70NVNnQei(*-AVbTuPOxo9DS$SVRpk?KI=c4e+ z+f=R$tB{oQzyw#Ou72niZMQDLH}5%cWpazXRSqk$Xm=lVJeV7d3wqBFr5U4+TMf1z zb1Q$YDbfAt*zQ0-daEq!V!Wrm7^9(IKa0_z;c;w?_oWp=ST@OPPLMgCRX0q>`Iy?> zQh2zwm4+-hYR#V?&pJySwlewa7@T8EWCF2LzTE~pRU+dKuV#tZ4yVz!L^he5`I?t! zNiaT%u>0ZVS^1b5LGE+mdTIp(YYJIGywsiw%d=1evf!L6&tgF=kIQ2dNu`QOth3<~ z@P`otYZG>U`4UGdd4nHVp$mPO!$X`^v5hxSQ4$Mvil^;mFaaJ%@eDreEWUz+%vC_0 ztFQ>FR)KLV9vXs+HC&$iXa8pGITuSGSsjdi_?QKdBk8+WmX>@ zey=in*WEN94ZT=v8r`eR%GVihkb|^F0J@3`M>yy$`m484KR)sd*Xo59zJbQ&Rbf-G zUg{>ZpV6x5s%RCetx*m9KZOQW6OCA1jg67kQRP=y1@QOIudwz&fnNU#8z^m~nCf7x zsnoi<7|D^a)Xjy|TMlF|Xh*}QUWB`v!p^LQy|1Dpe)d7*0 z2Mi#RkA$>j@qS676IPojDv4URL{UCs}o|K-j8zBm*OUG-n5USPqRv_g!WY^HAdUUB4t4$XgF>ZvYPZesjD&Csr zgZNx%JQ$!i=`)$dYxOkL2Ii2=KE~WNew79BQGL5H>u#DHB=4rbPft+s z;R$vcS((-4(_aOZG;hgrQ01kTpu807-->mI@#07;M!YL$baB0;D`z#8h|lks*I5Tp z=TEOgK;J-RTQeC3s@|CkaH7PuQa4v#gNK)`u}2^17kVH>{G>5aCc6F;^^CuUQv6gG~p z=&T=&k*M@Htx|naUrs@#SkxEwN`XnJt?J*Od#%0v`?JS-rO(ziDvh84sjMF6Xk{u} zfMwUT9V-HX#J`~tNWJz#nHbX^@1)Sq_L%B*)bdRhX&Hd|yIG3-)37cw-o)c`wBt?I zOd3q)4y=rM#f}g_{8sG1CgZ#O4lEf`(;b{M8UV@eX$Mvwmv{BcMsKmhc**x|2;nJI z{%y7%1{K%atg+wasTMiMEYG~DWfra2k<~Cv+DApVE=K!4)_SR@2FmQnDi|_w0;D4g z*U|;GC#53`GxIz^&8VogGlGITF^;`bv6Gc14nTOBljJn1)uBFdAXA|onv*0 ztYkXJJ@;CBNbedu{io^d_C6okci4wWC1ip`ufIuyyRz4*PG=T}o_6ody8D11xyATc zYTJ#yO>teY@8}JqE?t<_qBpBw7p+-S^wLTueCi9$n)>YVOH?MBb*&3F##DN@E92*+ ze(nkufL6>z=oO^-uHD#ZOfl=mlEA;c(pV=ukMx9gGkA zUXJ+6;e);N#JgDhiz%`v=zJ0N=&3J$h}l^D!L+(33l-d8DbSO3M&80bI|0kI+O_$? zJTId`U6|8D7sDsh=w2)$R$u(f|J$^j?!{R%weBsZ<#2Do0V?%j=?0$Efgia!+6Tm- zL#3VX!z$GKKwhJls^|2wxY614JP&K1J=SR&pn`z@f=~AC&syl~dQ*Sa9LzYM8V$haW*@-H4HJ^nt3buSs%U4I+cU8MG5&L+FXZ5uf4 z?q?m-nBJb}zGyG+dG`39*TB8OVhs!$A_n`~5HZ+oheFptCJZsy4%-N;w@7=zMLT4E zc~qG>nrKO0Y;z>}pk74@Q6JJ;pl8Z(r+axOPVqzx;Ps~p`N+@2Oy784R6b}J>&iE* zVeAVGd7lp;rgGkjbS`PHfCATi09rmr*FPv3{JI|sA|LyqAo4vQ3L-zNHwXJ1?=gt{ zC(#~3I$&KOQ zQUfUD6Tt$8ej+Bf{im3-X*BLrRtsqF+dl<;tfH%*vWED)!e>z2meZ=w#LzlMu!@Gm zd&S;G{YNlQ%VACU{&WPZ@YY%{`P#D zG3eHt)OSn?(?0N2+ef#IVKK3}QSt;mFg;jE4lq%8=!reU@E6$d{V|wql@iD5Y?!C5 zX)~5ZguldwCu`@k22;k^lD&WBSkbhTV_9RnzL7sH77YM(PczW8xXf_B>Ec5iC(`(L z$~cUL_UFiPED_)tFUyW+ai)&) z=P;VWL*t93FiWe2LskwR&m!Xg0kYD)YG!LaS!t1H8@Nj))MJi*hmMVBJeW9af)LRb zOaR*gqQV5RF7hU_NQg8G(bnJJ38uaiD#ZF&J6&|G>U4G< z_xxrEex5XgRmWBL8LW=^+Bpk6XE`%il=snZwR}e=c@uR{FAO%y2t>XxgM}D-$eXFq zVhJJtnao@NBxWXy^5LIwAD2nqf+43PKvE|T%Ea)0r zj=W@l61JtYpR-+tt4CD z6l`Y_AV@e;UApF%^wIs`X4^UHL2RJmIBcmns|OL{A%U}wpc?ZSKV_F+G!Lr~kMq6f zGhfMk_(+`X07WfeBP2%i7qEu>o%0L8lO;IC7qKY@X$R$JLm5n=;%r!{c2JERwgL~; z95#t>(S5&UEqJgAFPP4K$xa|(;kdmXFkpPN!=Ug@`iN*WZy)VcA^|X#<%&W(t%e$sLiN^w9xu|)HH;sbuf3KH zwJb6^JrO=De>f=-_(hW7_G72-@^@+`he@^+P4)spxKh z1OpC?^P~~quuo0vBm_4}@AtEl?*?ouDO6_zhVD%ow1LTf({6jntL(C}GXkssZQ8zp z#d`1kLx2L6l6Pg(9~)RD?gFk%(hr`IRBI#i@g9FV63*F9=w21NQL7?f7TJvwLlIv! zVk29D*+?e8e3ndaZ^HDYAVDY_f}7RogkhSU-rWo;Ng4%UW|)`xEo&VK4sR(h3Ex(*2=(^mGSVZA@SbI&&# zp7Y~$U@Plon0}S2e8;}RFrN7i+IL6ley(fqtb!}OM9P+}FGX10{Fdf#W5v?%G;KRm z0l_g~2WDwO{+1o=Rmt?&3n53z^J<1rPywsS$yyrQC4>gdTV%p|g4zf> zTW~bfdvzC@ew6K#?$C)Z8{@3`-9&#NEwZDiFu(b6a2%B8Y}f{2^PS)Hq|8^1mFUM4 zY;wfe9WTvo<_;b`x0s5vE_J0Rxoxa8=oE7p7MMtC`g<_Ye1(hy=eEJN-h+~>{T@b# zPO%=wi)EI$7&yX`~$Obian9|AcV@Dgiom>1$^V(SUU~+>*rQE#0f6>xz&i(dtU12ue*6aCsN@i92mP$-q4zIcJ{JR%6JbGy>^~e zHY_cqPtU`)`3tQ$&-NJ8cfQy^e$D$=`rh7`%3ivcmwn$%0d3FMru4iFE7{Jnz7V`K zh6D!D^s}&KU!*V2!o<~?>iooJAj80cpI8laO zk*k4ar?C?~h(JGBBXGS;7hySVM?)_P@3u)uYuVW$6(nETA6OSS24mZ2(ck%-MR*#Jf`s@a4&_wfVi&L&}`9d%oF0@^%=E`tHID&1x-N$&eOsi09+$VR%XK>p+zJYDA z4@KW(A}VfZmGC&~c9Z#AAFDBP2;A2n-b7zJ(4m_w#;PuL$ey@Ye3P|{?|?4pCp+yC z4mUzCau0DU6ufxnzIV#;c)4FOzWiDZk*nY$vzV2K3(tbXoW(w??DRvi*tnzTo*x%P z9d8M-dgd*tq!`v)Li#fQ$$CTp5exA!jbaVHCQdsX56ewO8GmY26su8DpnGNoXo8s8 zqkl3EGuZsLprUe=`x9ni=4~OTY`ZPy?#yjOJB*<9=b>ATx&w#r7c}P%_U7|cbVp2+ z{Vrb5qDJ@;v*mKn*6_OsCsSeAsKdW z#5W*6BP$Z5}^T*ihCee<^>>`Yn79Vi}D9~k44}x}<8`VlyvCiSzam;)tgl-wtWb1h=3WIM44G*FQCbhp+r)3&? zE45kKNYJCjE2rsp?q2MGXCwT+n zw6x7c8@$vQv0SEm>CBCJsZP$^ByaUyG`g3!IuQB<%XU`aVN932)l@NQs@B6Wddo*0 zi1)ttQ5!bYq7YnAgwRC&35^9^k7+@PJ@9>$3*^qCE_g zSAFG>c{r{`{)J>e6|PHPmB;r4`>9UrG%&-mSXTA@)b@$|9k=tzw`8?o;)DZgG-3r- zss_0=dg`YR1w9V+S6ky}r@zW$tFKU@KdKA2sr-;wZJXK#Ka*@K zcM2`DsXP?z1`RP)3Ia-|mVO9|?M-BY$d{y0uVT@DTSvK=QiGuPZGJZ}iqgY7c+-FY zm4^ci4-h5I2~bnTA;sGW`t(3k0@NhG1z8sPltIow_7fflQ7cfbWFGfLC~O@4163zb zb*BenykOXnOvU}E?QOG_BJ660aninL5_U4u6B_mj2|Fz;{m@Io!j^*&7V`TAtGD?& z>K3XF0{I*bRV!kVJqlGn!OurwpwmUbic)v;6@ws52b?nIFbz%?MiVYUOb=K2DTi(0 zYJ{Li3stTGs=XPmaunls5h@Rg^Pt?2NF2<3HxLO>_#kYHP&s~7TaSxjW*`V)i$7tc zV7ecn&cn+1ytLX5iHLqHt-2&ps1Hv3HABc?l*%Q5%F(JU&7z^v>QprSakM(XvV_YQ zX3Fra26?=OY9U)0wI^MTQ9Z=>{*+Nh?Tk-Z8P!Q2JJgfnw(al5hSD)7`aFy7JJqS; zl|X(1xbHufKLBW6xvlt`$t(lH5ruzMGEiB+u`oA&syXIs}Y518| zS?$70zfxJvz~#Uy>IZn|=PK%zzV5{iS^Vjaht8;?M&M3`;85hN>?f*WlABZWhB#4DSGdheKNiD9ab^s)5Wy&~{97=w* zR13g;{9nNl=}a=!BmXxdt(2C#+)AMt)?k`aOPy()b^uCNw~^(t^C(f`z?I?@mv*xc z?QMQ1C_AlP8L5fEHXu7=dKoE#qJq^n#Bq?rkG!;6&mQKY{diq{8|0purNk%Q~1FQ`n!!OLjzy3$_sLtV8CXbvh3j_cMn2VGd1x4 zq1sfpzFNnksZI1*eN5G6+FoC+!PO#G@e(q`Hc%^BHk$#-#wODO!v+}z?yM=K`4^w?s!dYueEpO|Fufqd0lPIm;BJ+hd~tB zQk`h{Du^62u<@*GsYYW&DDOs{pt&h357T}!MGQ!CD{!~9G`f{q)v*5{9Zylq8ou$M zp_O16J3geQg)YCX_NEZO1HkE82aF_JJ43QjKE9cvT7%8NdeiTXSc+(PAsj%6mpRwZ zSlyKmbn!3N>NI3$NH{%d%{j+^_<-6p(l6AfoKaTu{BhK-w$ z{qYUGIv#JHQSwcNw(1na^8ZWSocD%$%P?P}q5Z2N6GL8_iI%ljtC<$_)I@S^V_gb; zQ(a?NXQCUuIyR?tBvGW&9n_BuOOfZqcBeDl=%5A}F50L~M|CY9%_kkzf&6!1CpE$F z>p`MU>a6%f%e~}_7WvCuBVv;gLaMPsK!iX7FOjGq!KJvNQRDPTdr0@KKf8m7ggw~0&yvwRF7C-Mrz&C@$eu`=y}Ivn&gljD6UgC?3W8@ayONSL3f}1nfN|A zuH+Quvrlb8;VmVv9~Z;Hl`v>F#H1$JsZ*ND5lyoCT@0nQX)2F%Ii04)L(6-drjEys z0hsd8W@YGF)th$uuDfc-Ed&s8`+b)SwzAZ^+D#r|9MD5eHl)auRWRI6Z}ouk(StHf zm7mMxWOxupgQO@q52)a4tS}-+wSM6kYs)0*VTk~NHZFyG>PMP-G^85g;n1DwH20@ zw7wuFkn(4J1u0+as}2K2Ba=`{nX5kT2vhe6fJQV01Od-ljQy$iRDP5$rF@roGx$@q#}B2PP{4st+h2{aq~kn2;IkX_SECd7BP|*ABmBi<1hlXK zI0WP(_S{~F{6k0Qs#`XHyPV7-NFT}E_ zTw~50pz`2<*8psiDHJ_W{G<)Urp^(Lg#;8s-Fu~l(2#>IJ?Q>GH5?uw|5esdn(74z zPI-`O_v7O~9p^VE0CEW0MOI&E#UBk)!=xcJbC6ovx?zi!w_*JtH9YEXu646^NKzI@ z-KFe|)^SoW01oR>^v_MBD5X)iFd8^mort)_JA>6)+=gFy2-F<}+twYb9->-XzzVP< zAlZfS(uOz+XsJ#zto*;knp@cC`WsfPr%~@iKKza94O64tnuS{s}!z~k|ohApe<$|quf74X|P2Ud;tHn?3A zHf(39A;9NtG7|?!rl{%CSJ@SfWx=<ANmfwbtgL)Pp@17ai-eQt9?BP%q7(1p*`P(PaNC1*(T=J8OHK>+3vkm8q9 z@(4ASCr|uY4FiO{Nu=-Kfo{boD}{4i)8|yBj&$M6>2b8_ePEAeJ_v10!$x90J5tKf zp%MA(Mye*G*Q~8pU`oT6ZlQo5SBKM}7Oid6DBjaV{%!oMo)$fQLq|&P_gOF%90+Pd zjXK`<%eRkJGYue{!U^hJiW;vDqcsy$yL2}nH##Hxqn5Pg$?1v#bi8-47qy+F+C)dr zm69Ls=O=dGrh${x>fWoK0MytA_!obDM{6dj4Gk_6t-ml35g9Wr-n3{>n2&YtY7S!7 zi2^*l273otvyKmsb9p4^+VC*rusThD;M>t$ihoX3X}AryQda zK+~tG?>&2(T?I}za9S6aKO+oI{CR;5PW>qOB%|wm9%1( zTF1EMs~4BUmanwsuy(e(0%g55M=R^u@>?=T-Ark7)p=a9K2iR4_^(MFWKiIUbv*&% zCV@Hu)pfG8olX)sodFJ7^i7Xbs=mK z23ooh&lb_sg<#UKi(jg4&#$&fEt0T59?Df?sb;p?0k6%-hULUSJHAw_VVDL9ASNWMhX?lQNU~H6y0=aNCIajD_rCoG<1qLUVp00qn zw1%WI@Rk!uu~o`es+2q0Nl1Wj7`#afSBYW|u0pZn znNt+|*D5u!%t5lFST~M_q`4XZ3oh0GujX5r2&a?}HyUlTsN2`DlkHzcMdn9sDaWU3 zIGhTFt3gQ@+K#A9dB;4gRC_55RcC3zQgv|tFJG(MB&!%8Nv6WgyTB`J;xr-N1M*Ni z$|wN*dBwGu#6oJaR&8#;SWRCG_H=>%SgS6PJ_Lf0+R{7}(x-_oD5FAX+&5}ts*$G- zibRqdO-6y+OIS33~Ga6c@AZn59EEi&R%RaEh*-PYdN@f>AXwxR}i8V-!tjZSgAreG%_6ee-%|dN{ zXS2%Fl}y@<;!jilW;I^WfeCc*+h#Q(R-*&An@XQBw~Go+729E|oUcY2KowQ;riEK| zsvv39xi_icIII>&zZ&I1r}EXF(k9A{F2@(3!0ej0MV*V91I}We8g5g4P<`sRpqI%L zVjM1dHxK6u;!b)_ZfO}-8_;QBSH3!@EDf2Q9AuRDtfB{7)hO%uC1pUh-%#{- zYEQ%L#@RQEoS2oH7wW!3H{Ya5zd zR(KD!1NrJCJU?P~|u>hFwr3M^K$z>Tc;0J=vvJ zkycXW-4MFAP{-YBfn^6j^yEd|S1%5tYJ0$lmQedWYERRKAQ*-6zE>0I*F9<*e(9@S zcKsgq`wg__do?5Y_+LD>f1v@{n(;f2{}!yH#(Uwz8A*Njsx6QceEnWE-SQO|WCG|! zbtD{Uxlbjm@SpdoEv2DUald*TWcXyi*h0e(sC^KtmT^E$qPCxR3ZPvDQ#3pf-Ivi9RSEGA$e?4iJU@e_Uz|Y=L0_9eM71Ehv+2c2t80}toL`Hq&m0=2 z=l-xnV6KHh0<<79d>~jZcZY-fSnyU1Nj3M0DNUe`hp{|6Q18P~q$Y25$^p=>rX5zx ziGIdX_n)vx4jfj4{!>4rD_UjYQ5L?`-fk%V50%)7TqP9U&e${fkh_IsRW}f-WByt<;Yl zmROAbsgp9PrNYrH7L2BO$>fm1%Pv#&!nX*Gp^T=z#5d63e6 zR4Y8kA6ERRmgf9nH=Xc@#t!~a4u=7ZXTbWdQr$D^tI`=7bq2na<#W%fRin2D0b5q< zIG~hyyuZ~A*kZA5qm;8?OlxStS@ku;@q}GMyFz+Xru3(n*Ij3%xQuBA8gR2<)F5acqLqd-e)cxI*AhNA+ zm}ry>GGq!JbBP{bbqV$K6$M6&9@I^N0r(TjQq-XGFKi~juQOD6Cy0F)U z968q^rAAVn)kondU5fGG;x%YyAv>;tTzTeEfy9q^K-~ac1-}Be!;bvy%&OLMH%$ak}oH@tj z-3d%$FJDx}Zhv4Wuga5T2zwrIRq&BsS5bGpG|Ux^2ANk&YS#Pr!>Jk_4}l}7p)9D679H+t$rCMbaI6u$ zZpXw%t%b5hlsJG{mJ7h*JwenGGy2%x#qU-vM8SY-u+V`-|H~6Rp`4qzhr-Pq#bQimPdGI0 zuJ7qnEM2Qhb4=6l?al4zusF*nHPF_C`CdQ;{6{B$i43ONQEiR1(J67((J>oLm&Z;MPW3(6H;NS zzsoKA?g@8G{$+qN6ho{ILIoS{mz>7^-=h5+!`*-0FImscNRKEB|CN+4IKX3dj{mBg z4=O&aCwv){SD0E!ip%XD+{;?~^+caaoUy$@*=k9999d@;B}+~!dL_k3hEpY<0w4WG zY)2L`FmqjO#}=$x`f< zAR-N}3T}sqJ;`s_^f9x_d|!2)fIj_^g@t3&Ol#da0aRN!z$Xk@)&nzg7n=Mjy?bmR zz2nd9VLRv%(@)V{_dVq7h57Q|vLN50|SM!l$C5EE9>tcA!EH!BDsYmd^(AhuVmH!~HCKORci z!E7P4sZ<;5gc!wRZEOU>U`d_0=Y=(dad{wN$xV7Z- zP?pREv}BeTC<2GzmIcnJ;Ob}yW8(rkyYwWo@ZTe8@w3Q%7RCl3us~2an}xC{ZpdO2!JOQOB`k$4q3}r7Ov-R~i{!Y?p#D*8fc}Kpw?Ji&b+L5s{$j(;#gvMqL5Y$Esp2WPXsdchm5DZQuY_ldTOcccy&B5#OUnl8!HR@JN5*N>6MA&divDB4lk}M=v}@_pVnoE z(2FOv+3^LBaIpCw=hkOq3`b9pvnW2%eDs7kP7V2YyErP%nqkp%F^cN0S_<8Z^;vqw z`6c{-6{6LxovX51f5qM-OE;%HK1@OcsWyMAt|PXZa5u>OWpq5(}< zb;ETF?Y%rRfE`x|C+0sLPy zXRnw_3HMd$%4dD-6x>)4<>O!z*@T+|IJoLO2`bH)>vTraiU4fRE1qOgxaIRLuP&gF zfN?MRxC(N}^%RSQ8$fYU_b?jz6yuk1KY5C81P`P%?n1{}vR4d$*S>rrV@Jfu826Y~ zteXTKcw1YRMuXDg(@d`A6W|xsxDA*NZfh=-G^bICI<38yNW0sxBvgyc#m2U*qTy~l zIR?UpTBEJ_A-%1b3V4UU*Um);lFSuxX%v0GZ1nV+Ozod${K_P7`asvOZx4(5c)>@K zACjz!4}^y5!jA550SYVkwJ4g|rMj<3Go04IXm_VS!$x5(x%WQHUN_*`r~?=hKGU}& z`w_)Domfv^oSx2b)BhxeTs`f{dq4lASOLXPmcnzd>$6rrn|^S*oNO5^(ky=OO2f}p zwHs{n>8T8sY{(0s^pCnlP*w)34brnx2{nqK-5HF#8z0HQcJ~q$n*WGEUqV2#4MniB z^I??!VsHl8CUp#>{X5=@rL~<|JKP-0_~;khxm(w+2Bjy5SECjkldV*j}j#&}-z7TvKA@1e2X89$dp0*zlWxjVZ9m)qb^#fHMW$wDo= zvsyIkITnPL3!f7${YYwGCBl9FIkt%GB~DR>kLRCakC@#=gpV+`NU+1{8Ce{L&?C@*}T&IH@xAc$wAo zSvtY{ipcwpB3|hnw(0#x-dQ!3-h74C@>w_8`%2Er6VV0~#VZG9Jn~A>beh#4uk3l> z`-<4Ocp2|>GOUfDj1)P6^6%etQj13Eji|-qXk&=6lJ3zXZrxX~$&~aeI|Mn%41O=) z!XaJoYb-n92j=Vg0j8~u@ZzJ-USmm)5gzLIn&=U8Y*A8u!*uR&F~68Dy~gTDWV|uMesDtd;Tyv2KB$%XA2}4)M5X0BZv32r zoE7Pi`-N*(Kn!cv5V7bZv=9NmU?2(K#k(RkanEZB!xgsa5|2u2aAlJ`Ff@*u4`se) zJ5%V^7#JjX1W(hEFlNz}iqfaCEQ!&s{z-g=hNm0uhK_SJ(*hJgaM zQ_yhcz!j0y;hGxv>~JvtZ|TY?W~Yh6g&4AGII9M4_GGS;+Vi$L9a2a7_`>ftNv1`= zwZ)nD8*DEAzVQb8RLuWrgR4Lg@$xrWQo;z2$-#pjKqiQxJ^sl4k$!uV)dmgMdM`$! zVWURF9p8fX)tT141$iALd-(S-8v9bDiPAsl9*27p7SB9_mFFyJ2`7;6YlP9(W5|y& z;BD3cYJ_eIw9@cyNe%Iam!RQiD(Ip1sF*5(u0h0AXvjOvDo9#HjL3e6)fHp;)iaj; z@35q*BRpojvavXP!46^bD?h3~f25cZtP!Ve-BhR3Hf(QVE^#M}hK*oZ*okbk;VqWx z?@dk4&ky@VMta6s(L2tHj~QocKP_=67dNiF%i3W8q29qI(5RKa^JN;wmuVHCz)SqD zaE1qaGmt;!!LCmr+3e)j{%=1j*CZi5;J%15+dmjUUab8a|7lenp1Rg)8Hw z8kBE~1Fv0y%<6YXvzM?8`i^141nFcOTwBC4I5tMG!TVzvg2!<7{XEQIoC|gu2X~2P zV_6cX6t5$pF!<_jgn|pU@J)qOSGX&XipH_@Kz>`kg#%Fu9KPV`_s5C_Qrw}Eo!Vy# zo-Xg4W~Z5%5OlB#Xxj_FJE{2u7EjHygf0y+he!Q*A&c>NySPbJ^%8QtPhfU`Eh81z zYW&HS19$zOvRE}SmK@Jm0>+6Yt%m~k*w-)~@4&DvbsWdiu%t7`L1W6uU4h{3wu}Zw z?+~6BWG`j1RD@#^AR)`xTKK1R%w&})8&z2GlK&Mkh*$kJ66a7svC#*^wW9-lcZBg# zRHD2Iq8IRaeJC;bIiu#EaEq8A2>jKFtOJDjuP3rQkR}QzLG@0jhLc&m@kl(f#!Eli zAt4T#%u?X9ofmS}7b?_elUX<@Adb?`{t`+@C$nflXP8l!D(LJ_REgv0guH&KK6wA% z=UatR>nSW)P@3xFnz>Z-n0;xAptS5Mg3=17Xp9ySgW6K|No;8W2NU4hsI;=s-4A~Z zr5;mRux0-J0I}coP>R$50nbx!KQJ)Xk=Z0lqneKl@2s^54meiK& zzt281EJ!5vePH1W8aR!WNEz;Dr$cEo^27&}vyG6`X$Jcms7jlOoi~F9&ty69$-O_5 z9YbWbW3yOQxYn4mnImShgjcMdO|vZZh-(63o5XjFr#{)tY@MKm81@BSg^Wg!@gW^M z`P1}l=G*;fu*X)bvq*nU*}(hIXu6i;x4OCdn#Y5SNE)pS_8D zCG+^yx<`Br`;2sxX3S@ke4d8~+JaBOBkC<+Z%XHB`2ywu>inQR^*enN{%;Fd9du=1 z$exjYr56@57c~65g{(`gZ1qgPmJ$VLZW@L^G(>57X(| z4B_U3d=?{?bP=x3ED%e2L%vwj2s^GdxscCliN(CY$Mwg4O=?P61U+&xbzH=rmhKWQ zV%-FTEXK|F!&V6Hw-yNo8Ko@=Z<-iijX{n=WV$1H)Oaz_IgSP|<_waiEXGRgOuu0)!bohY@ywk9Wqx!dV&%KVFB}2>9j57nd>@UUkxy1~CzI z`E*Si?Ow{bCb++mgoJcUSvAaba>#8 z6cq8HMiKl%#QQ5*4b#$Wp4)okN|s>a5wM!_=Jr^`M_&(1qrvO4YITX^KQ121FX%HC z6;M8uAJzSgB@3CJljI^!lCEYNE_DwMtE)L5gph7%>}RZvfMrn`bsqc-JMVTftpc%g zIKF|e#*wPR1b?ZB4W!FM92WW-zb0EMxbnyCs=z&f;Tb&;W>KEN#&s=gR|RZ50VulG zWm3+VtKC5s!+qOF`K-&_MQJ;3wMe`+{?YfoL!IZnf^nYrvIdWgHjERmJ!#kk52~+g zK^92xL8P*R*Kry4x6ZY4H+2nh?_SN!oK^i;z^36UMxR3VE(rBVA^Y6;GbAIDH^92O z^h;Pu&(q~E1>M$P zzM40TzvuoK$hqh%FF9BAY(Scd2OI`+X5i>94&Xt@Iq zWnb%b{B<5(`kEzzFhkY~`mD2-)e(&9lV5yXHw;|H9kv#XqZ>_I%UTNxxM6TjT%?J$ zC)W!8WOR#nlik4CT^i=r+0&ru&O%=O^eL+`0HIzWA#C0w%pw98ZUxj%Tx{jsA zj+0!vr=S;e!VOT!rv27o@pPtN*9qR0kmpM0_X!)U7qX=TnH#gJ(2Vu0x8P2LPMmd8 zzy?+sr9{eaO1Kc(IwpYzZVl~(#nRNbCH)Yq{8a0w;2yo+-z6gT^TY20oAtT>@(@LA@$6G|so(Cd z_8`px&SVpO4QbL)=l6tQWk%a%8nuO0)>vMB&tSbQ&tFSEjl;Of^xYOg52v>9<&2*HL{Z)H}&T1=j;ysbnil_R`-Ug8pnpg8r%(>GbzU8U2kZf;zvQ zRu}0UXxjrE=o7<|-)ZhP9Gc=%@w#oS+CMi&x@Ud^LI^1Ru^9R3`6W63V-&K<7q)x< zn*ns|TZ{;iYpBIJGtR+Rz2Qr>8r>F-#P;p;G3bVlt&J-=t?K_|E&n-|j67ts^? zZf9@9%02x0XHc;I9A&1f+gWu)cuM$z_4L0x!Pgby`go0msjY?II( zOx%$b(IF{+2M!YvJYWZyS7$1G=K#*Zcd{D#t=UWiv?G3NcIQsUZ_Qe?dGcBiJZUaP zJKUPJ?P5+OWidf@b6S%%pG;>@Bt9Ili|rE7`_ZCR6L4vFHyaLH@#fvEgXQ{q_%_##DqHl_<)^u?_ong6OH!@ zGoKAv+uGUbqrGAUhiIi^d&RlyAA8vW0RgTRggL|M^gi|_BE5aMpS3`E0R8+N1Jk)% zei2>V&)Nz^hU?QSrfx5q=genuV<=ZqQwf2*BZd*;b!^n6)e)<%NqK z`G+BPXi;8@55s7In|Fsb%`#z^p(DN6J+o4-={aj&ew|b)kmmlxDutAMXyQiqm6t61 zk+FFa_%V@<>R)ojEpV=j7Lp^_CsnUG+)L)oELh;43{NTz+{f31gzxy$kCo%WX<6I3< zY2pbs5fA^9Y@|^Q#-1N^5}N%NC$WF2?%O9ZK;Io-iBsG8nz%HkCCnYrjwjl{Mvc^2uLADNkh~mihXCTx;e=(E%0n;i)M& z_sXxtbzf)|M6i_xRI8s=8n$*kp#t+((X?J9}4yTYa>UnXeCSf{==l0&?2#L&-+VcoYLv17!*Ubd z>v%iDTETUqg00ji+670~qI2!YQ9U3iFViR?SVR7&@<`K#b$paLjb*@K!i#>M3Myy6L+)5kO@HhcZLDfjaCmqM*KnI$1vkJaK0OgmQ5!}*C4so;YR|}=xH(98(pV&=od=Nj;sT_ql%8!;!2#m&j(S6lhSn=>m zSSfeluN5}OMfX{=>pr8+Vccz)rwn;%LlPl-Hh-;W4Z3t2ctL3OA@#xn^l=vN!00(C zhSL`&ZIb@L0V`;+@U!?(D;OLciC6J9AN|1+eKsJ%PHH8209CoeGO2J-bQBfcfhUNV z)C3TegO)e<;~%Mgm;Gqk{WV9qAc2^BSPdI!(Vr~Qp!!hlTJY6-@gAHXCeg(|S*%g< z0e9PWWKb0KiHoR3>>l{wqpuoaK$IwLv5YV%f1*RA9eVuB4tndpAgVv_KZdC0_LSo_ z#M$RglN~xqar_4B7uCTrAr=4)&I>zXDYwghb4%r_I+5{)L7HbLXRW*;xg^=8lbD#N z`H~!H-oV4QnyIj}96{S9IXOlnHjtDV9-kV`d5De72DygzhJ|X~!d~9V04Pgoh(T_| zS%IIR89HYWtN4aNz88mD{W62civSigbg0pb%_t|DFk`@2)_0M1`eO2Th;M6@kN!uh za2N8G|Myg(=J7TUQpF;(oWnt_Km{>!Gb+7}6Z{tQWV1$eu{s@l`ZZJh(0XPNML+f$ zF6Z50Mv^UZtROxw=Zf%^>+mj(+UPmE;zbk9930(SBlLH>%6;f1KRFhk*|tFLMEm^Y zS@^q;Rc=}~wV^f~EDH_6JGX^9#%gm*CD!tj8%hCo*(wCX4OH9TJF!9UW0_3%mjlE) za9yv1fIt57ZOI2NKJq>7@e26|$(b6ZBY?!Ze_4$w;F6S+h1e<2_LiL-dIRP31Xu4= z4-EM8-f{q6y*XjnH`9Yf8K%Wap0&kTg#)2hrO%mKQPo5A@b^O zVuGZqh6)XQY>4Z|W7XOQ+74M;Ct9$qdHB)V16^P8S=1W&>WzE{CR#)@9B~Pu6$waT zUV-T&#imlLigHiGB$Kv)*Hn}%h9Pybr;7?&7kHZrZ%wfW;u{W~8YSFM>(K~N73_k` z0IPA-&@RXG+0ODou&AMS*`yOlMpN+i8Fo2{|Jd()xH*4ims9vxPuk^VgW{97sGb3W zNITQBttfk(RD~vl3Y>?e<;0L93~kUBc74QN4wIMi!jRu3@Zgb?<5Nn6a3e#f%gn>Sfkvni&MU1L9a8ouU7VAr;TCrN! zj>t2(kgoS#cy+a%E-$a-NB8Y@T4;;1B=)hRa-TB)^{DQ|{ne^XuvuulW7jD z1eN>;ndZWStS-(0n&KPmsy>mvf}VY_7DE!{m=sNP!d7fs4zDy#G4al`7Q94^ma-jk z5fG8#l!-)NzLY`S2Y0}zXaSFr*CCVuY=vu$P?(JIlMbRdS zz4~Vh1U$k8j+Ke>hu9j^^6T3JJu*pdfulU`;OZ@#y@a(eNscjc5~ad@XH^n$g%o{=8+Vh$SvIwP3b9eF6QJ+ zik!|r(5R|h-I$vITx9zm33X~jFC`k_tL3zCH5`0Nn{PxwvQ0M8*xsoTw7!}g7@*BG zcML)`_WlSfa$tBi)Js+6DDz|!_H;OLVNb_zwt=q2hav%Nt!i?V0qRNFz51bt5tizm`d62qLcZxv)#bW;e8r#rE7}L> zb1$kc!>PWM3Tp_#`g{!`SU0LE_6RkuS_nm)Ra28EOf>YZUd`xk zO(9RbxC9zPTrIhV<%An#rnBon53JZfAmj|MCAZRe0`~Vj2ITAc0 zt5Y08#Ki3|Q(UTioG;hm%@BcU|4PWL5w*nz&4$Yfl#nJT25L(NnhzI=g)$T5C8dc6 zIQ1^6t&@^h8YrpFc~fqhCh*#Z2Sr*WO%0(d6@kc!Y1qfb0B8-qA?Wa}Ik^3uCUYes zrjDk0a4?I8*6Trs>c|7N#hgHW>dLyxg%ur3pZCPzR=YzWGL4q4I<$O&b7;5K1y2Xd zPrI@@3j4cuEsdY?%?^r*lfUWcwD849I0>&vNK1zgSI!2gZKj1eT4XB zD6v>fx|fjTYQiO%ZFSp+(&v?Bq#IZr)|4OC8_7{s38KCYv2=g>h%+gO{Cp#W!dIP6 zGzLIIL1<3Zn~1-Gz8ItEY*u^3Bg||kch=t4w5R`rx4&&7Pc>a#>7%g?{%!EISen@s z^Hl1S=bGXJQ%0}#yRAN4h}qv%+rh^07D@?;UHwgW zgjBHYgDRmk=t;Q+r|Fz$Z-)khh4>0-vV!X#c7Md3lRILRj%H%k^9pJqO%aW62I{QKc4gCBC+NG>w1L6;_dKClxbgwvfXe z_`#_0U9ZnCOf?X$R(uV86J6B`fLjGv_3)DeLUY^QGE!*^IodSshl;>RuuD!c<#92M zn!04JnD%waeeg)X9T!HK-H(|}8t>);ZlE?S&^gXDH{`aIe>Ke)91gP*Z870?5NMR^ zahh~1@R|CQ92CWez%4a<*sJ!4==vh<0*M;*iy6`MS6>ZlHrQmibU=<5n1{7Xj3aAs{YlWbp z3zZrV5i(lI$k=DN&|gtEqwH7#URh8jxFwZ#PBv15_Hqm+O`v|7RD~-R=vZjd)7lI6 zu(G|zbDU!;>n0Sj@mB93$BBItBH_|&T`0c;Fq(57G4uX|dB$RNZT*cmvkVnvlXlb3 zP6v(*vT`N;2`bI3jH{!a{$A(H72kQh&i8q`To*(krwgKRecmt>BC7VqXJMSeUbUkH5zJC;AKS^yq*zl-2luEmY)w5qaPUc`mo`5rnFDrd`X@_HzM zce}|$@fg%yPBm#}6M*}GItiOiB|6ic!{h$5yX+?nK0-T*>mj@FZr>iFi~T+1)TAG| zb%t+>aCaRTAha>#Scd^Yy1C$?$@0#gavibHc{fQ2#uaI7PXTv%W1oZeYL!`2n?hdi z34LqTInETY>^ZKb4c+Z|j%yMS_WrCcZ4sC?ydur)^^i6z_~U=nW~CqNHm1yLju^5% zFYf}DoU`lL-It!1>q&ZnP9M~-qY=qtCBBp)|>QGOdw!gB_x zFUi{s`>nM9Y~={|=9l@ET?b}m%5(Ws0#s|i+kY@VFe$C-UJfm&Q=Y1m(`YA*G0 zLSLid@13*Ld;R6cTvl7#U#^dFU+gcp7aD!PAM@?h>0k1`iup&)u96F8?&oib;rz8i z-hrV>QY`;MG|yW9lDqI#S&}Tvad{W6N|ZLNc_bCTCfBm$74iF%JIFRzhKJ$na|a+>AStPmV&iqE#uzS!U!JH_8T-mvUr^xa@A{I$Zk^Y^R{3xEGPZuR?{ zg+F&FI@5H}hdPU=uEXRc!{-SUvfCOO#BNp)C=`MY{5vPq52J!%FmwQyd0DARSd+u< zM);QFDURXtG)*jvpl^qJ*Xw%BOuyl z$<=k{4N;VHnrm4QKYXamIPu+Y$Kktz)p1S~PJ!d)0B#61Le0u??hCIJI}jFAp@$vj z{7TX|Ay0`R_+Y*u=$_+6*Q3VE!hBu)Iml|~c)6l3+OY9*b%~2JFHpV$#c0d~*g=<5 z!W7ul2ThbS0M3?)0-Rctyl4>MaDyLUo;XRMU|V_;8gL!U#6BHKgUnn`*M8nmNW6LZ_dQ?qdNz9 z5cLsU+MV^j>|3^Jz@!zYE%)S;O{sS2%qR+-F251`Bey3>T;bJ{1{gIH9`|}M@r$Jq zCLfU4XS8Ly9A&~XfgJ;fIBh9uhP>Jzq@1iO)zNzBXC_?_RUOE;b+Ihcpkdi&%=t*37DOcEr>I7tSFk1 zD`$bavMSq<2BO@Je*VjY5zSWfR|g|)ec=GG z<5sdia>D323Hwk%o*Zggb;JsC*_kK!xv(;u^2@Bce?zidGV>@oe!dVWY@a8%$_~18 zqu1?xc@l3a^K7@nTt5VxCftIjJMCWtJ^`caVwoR|KDSsiIw0hKTiU!>&WzVqd7`PD zVM|}x1W4 z9Gbk8yV0g1uAGwdhwj3tK(Wu5YPql7tYJog65HJb%9&prk;kql zNya=|as*B)csydt{miqliZ@ob!;AG@UK(T9+-Vc0cO-#=IY4f^!H zA7o3;8p!nriwrhtx{`-e(ind^T<~@5AY4-`9U0p&cNRFPG^F0&p37w}=j!YuYgnAi zJvp>q`EfpY$Q)>dqpZI_*JgLzNG4~um0jWUm9_tPv;oD!dG9xOuKWFwTNrn*@M|1= zt(6-53#gx8`}hX~092!@0m|#}B*NnP@+mv53{X}X4kwT^x1-%~>PH$Js61ny=$3rq z#^y<9k|lfIfyv2IfcuNp^0!<#yBMrgrVk6{<%o3Y`ciI+#~3_}8~m{Lvc8n;d7Hn*$44`5)Iiey7+iMc2^BA33FYw?bPC84-;+e znCM3fFUZf+55@SzHi;IUydPfKFU3&Xfq&{H@+idHB!0)#fg5+oRe*n&OIkI3{G>mTZDG1!#$ughy|aqcTsau==RXLwTGy3dC)ske}t@e7;i1`B73B zef+a*m$tcA|19TlC|t+Hggk!?rml%*ntF`u5!C584t6r=>~Z-rAU=8mRztL{QX<#4 zPYMe#X%^Q2mvEc4Eu*m7Q?oD#79Nl=?gWPUFxn?cvWYj zXqp1462GB@71WT5&dKpqUzMw%vX3hF!=p$QzctZ*yQBSF&$F;YW>>_E7CldqxQ|a)XTa^VkGKF3Y{}2)HXJ()r7>pJmn7c!w3>+_~%p zC$?08Gp1CY=+oJCfKn|=oVBy1xv(YP z5dz4X-StA&_pX3!+g*7gD6Q>1f$?GY1UO&a1G(@-*P+O9vF+)2WP!Vnb^Zd~zt3Tr z>r`Zb;v*@XPvuHVdn6z9b)Bpr*4rIPsR~$da4z`NGNba2R8t2)a>@FPX#U)e0GFOo z5P|3T{PCM?3OP$5MlLWbexhHsLf$r?DA>1)%nDCyThpSXV6skA>J_;mWm^U!^~S@SLTza~;EJmapPxMChDzTF{;XU&SBS34aq&!r@J+-zK*QxXz0i@!X#A zb)Bb0KDCjcF};&@Y=G;6_!ZXavmVXm?62+ID#DvUfX_df$&Wpvbqwgk#w9 z&~DweM|Z`mT;$8Bti&KE_Tb7&6D04G0~LP*u!s%qj`SUcMD@43@7fgPa>#J^tf-`L zCNR#fJZZ?1sK~BV=g$jvr3yB@&`@QLwp4Hz9J`Twd#Ga27mqK!xDSy^YTW1?;JzHD z)Z%L^K0;Z{!>eqI(z^XETI)6?2IU_pBSxu#xbI_Pl(zgM+fn4tt1-$`(i(SzSmoaa zJPYF$yJRZ*KEjqmI}?;@`k%KFl&*lZgF|@=>x%R;N-Ew1c!iPQ^jJ zoC=RZGsda3z+>)cUDrmf|4AX?|%G^ zQeRGHxcc>GWEg!>N$~{@CepTUP*e|8Qp`RtxsvkwEs2uepac6-EqPlH^4xqwBYIk> z!Qq;AT3%U6GE9KMw6fB`Fv&rEs^H6&t0?siQ$*o&!$mV~3-Al4hBcI^$YTi}X;ybJ zf;0>HZ#EUw?i)peQ#tWslswrEMVtw1SUJjs2M0CGAvB>1J*Ye$}VJczT(fq3E(5Ea8iAa#nv^td|sQ*uJJZw-) z8IE(F6}6NYgJPh5)s$#rwUj;5$p?TNlBQ%JE`ND=MHPFXD!JQAe(_ESk{Ae9PE(pX z?p_A2Ej{w4@<7#*I!ZmaqppGzuoEK`rw1qRHdNvanPEf?LAQ8*-w;%EhR)$(IFo>| zBuZ#p1>28S9#U7r%`c|}?>xkS@%Q6p{6fteDG>>O)j-0l{^JZZY^c(gb`Mefp1d6# z2$#|T*r+PlZi&DB#osr@-`uehS)jzF`uuqkY4b z>iFs(!<9C1oT1)$l%ZbdYQ|-nQCDf^?)9dE0CCS;?d2s2L3Z~aAf8L_Dl-fP3XT4^ zQjI@X{2SC#aEX^=49jr+|4i%Jl-}p5)ZCdqz9wj~dyFJSIN_MwSV>IKETBeQ$=5fQ zvOoYh!hzD?SaCiRh=^(~V<(`-$2DrW)8fN3nH%0pgo8zjp@?5Olr z-jWuL85~0kpHu>@;!V*Fv1YjHJhF)*!srM_!{N~_&yT``RJl!*K-Kwf{*0l;-@yG4nut2|g*FnF{Sb!DK+p{}e-}Dba_Ax%%sAyZZoedPxUP zFX_PDeF(U_<$=51Oo@#bSs%dhJ&s5|up)Sl{;^>^H&|&*5#|%E=%;?YgJNR^ck0M3 zC_ucc;F7ksO<-I|PuXi!XT!KK+V0l_;d0oY>;?v9i?=qFNeKrZ6Dnqtz?^U-lqR)zAzujY>v^k8#imv zf%9>2rW&JkG9N8h%i}xHfU!z@1j$VMKuI+3S%bvtU8r#BjY_dDQRwO+d9SyG>*$Zg zRQyMLL+YMc_U5|sZ;HZW-rVDP(==0QXPEw#_R;BIc|RKH%0$6+CEsYV$i^}O)LX*emOAn*L%VAHLWj$GN1pgLz(Hu zhv!U}bSNXOygW@SFA8cI>Br0CR-0_Msm~-ON)*rCHKLg5DXv+7x2f+>K9T;LcB@CIY2DUsGgygX?mFE2v52IJ+qAD}T5o4F@3LaR+=cG3E$OSMq*PvL_t4qInjV7G9L>n4BRhi;h>eI_n&5p0V zRAVvk__~a2#NUE!qO5#j-k&ev;k50)idRhHgaC_EP|FDGI$m*#x8QUWY5k6uFNiV- zC(?R=mye0Epq%5pJVWb1P|jIiaYHl!Qw>bkI$t^+R6XcMcfS2xloT|GtU?2*Qc97Kq>Ha6)f4U5V<nm&)xQNb$=VNd>>ko8gbJUkEEC-kP`7wQ= zrPfz+b{R*yTOO`b4%hs0eVN72T}kR6YBzX5c_OFm^{=$o1>gN}Q#sQ7a8ns+ioZP^ z4fU=)M*;3tYB5`h>cY!MMcMEO-!0(qWTHjcREm&SF7esN@Lm3bXDUz4_JEmWDhK6( z^1H(U@N{4jyF+CY|5FFDfUn>04tao#4A{ggPKgSGSU~|hc+Hfssa7tY5*V49%`2w=BtG*O zEOw;c07Bzlz zc+FkZP^}!~6wBwu=^Dj+mWw`ldA?TO=P9q!%2!bC!hheSQ&e<$4i3(m&nb#eZy7~t zK^T{E5_t?O<}Y|CYA$&wD$zWr97)|;TaNH=t@V%;1P=bUPE!Xs%PK7vG?o9M66Md! z(|^i3CA&$(~8(OxX|h_ybb}TXzM{J5;3+l0ZtPP=D*Nu^ObIPw1Vja z{~K+^4me^+_~F2O==$^M%6z4kVM-V|7byK{{sLvRbc~`GDw7caZSg{7Dt7A{c_{rt zU*#!J8zzU*pLxn){v4dI+(g^{i(n9(LmL(;W6`MbVx>9nZRBF*Wjx(%v9eJz9Q3Cv z#n)cuY5yW<(2ocWQka`-xJ~Y{ue&QMF&;P{i8wHaTZ0YhwB%Knfa5&h*wX zl-a3$D%HM>On@^R87=hU_}~C4`lEUP4O^xRMF4KL3~cX9kmy$OU#^URMRELcWrbm( zgVNT)WAKA@N(v2Fp&T>2B}A0fSVFL<3o`r6ZR$~u=`9Iz%5|4 zHYy4H*$Gc+Hx1pW#8{5|B;uT@ka9KxZ(praY=&F|W&Cggr~bbq6YuIN!4;|KhZAYE ze3KI59`U&nCt0q+q0kqeeJ3_6@wEO67=I^Gk1c?w*=i-+m;YM9w#<^3;f%v6=GrYv zC{0xCqX-ARr1pQE`Y)A8%Un+-j@-pok zr6ESKV2w74)Ni#>q~nQE4Eq+NxLY=gRjQJ1Z^diUUt3JN4dDh$r`rAz% zwFhwO#D{>*w>^l=OFt4RHO$MO5FgI)*DFl3XERXkU0*S7nO7**AN)JC@>1p zYkez5&`Em$pZW*{CKC~|MOpd)Itl2UK(BwVY(|ohs@s(Y+Q&WAI(@s+7kL{mY*(fM zx9|R-Bw~4f{DYFpZT}W{U^(+6>~8f3%${_ge0D0IOJ7pqP8f|Z(ePb3zA2`YyKv;7 z&>y>SsD90Wm;A_iJ2sSF*sVlKh3*l%l`sRoJ!7xZ*j#w9Lfb^FnnjHxgZzZAiNC8z zTQ|dh0iD_QVP9B6FYHsQ1y4H|l2V~U{R(c$0e*Q9iTsqcKuw4JN(nM$*F2znEX}2z z2b5X?xjb-mBp@F03S(=-(gXfM7gHh120)+M!#ky!-*xq<91|QQB&VjG+$> zDzU(3!9g#biZR?esI-K;4N%&U-aMpq0bYMNq$C>GNm%&lUCxA(bXbXe0Kat(1HZInVeYnghfLVS?p>l_{hb zF3K|dqU!GEN0r?Y!1e#-FL19DAK)GUkRL$%WF76H$CNc1+DB0H<5-#k_oFHKgc6Pu zou((0nh#FE+b5K2h?Ao2^f0X&Y*kmNvs^5~y)onWu zN-ko5^YU;cOO|HSm8_BW+)pL{+#`JvwEd}e$&{H;qG`=na=sj6-iAt>qHl8P~(jLoTV0x z&j_a{e^ahY>#6Q}r5TRE-Z-y(CH+QCjcOdVx`0!$rIck3xoro)$EaKXazMQow8Z?7W5h%ahKlqx-u7^%2ac|!ZKB3k`8oUf&d)=5T3p#V zbo_T5=lw?hR|Rb8SCuXyMQBoPv;{fZX!l(8j5d;7?^x|r;;))=uPIf`OF0UnkfcI= zo~B+?_G@2_C08K6`p$JF73B2kb)}xx5V=8k^wOUK(Yn(OFt=+o?1rM6w;0h&BDsQ9 zI}N(2Sfy+35jT~$_zdo^sKy2RYOZQJ`#_|H1C3;T?Z+6+!2Q+(7l z2+;;2Y=zX9pufrH^W{ivv`Mv4ib-vXHXx`t8fQ|gpdqL#o&GSXarhgg)rDR+i@!l% z8T5gVmp@%jMOf?iM9V zm}LIM0@q@2&U`B}U@@h0toH!Hla14pJcLKyJjs+Qh6xfCUmqMn@v_1rx50fpFQg`q zL45QS@)>uK6<@~!~6{T@aPi8@*C&QwIU}SotUz1DAu!ze}pE_NY zkXW!|yM?&LpeXfBJW(!EES`aUd0tVhNchQ_v~Z6| z=jRrvgUB%zj@V&Q>KBmc3L2|UIvu4(T7F&3PdTsB<;H5|=%XfQAOsWJz(n|Orx;=r z%^Z^bM!6F7-`76YNyC zNV)EPPBjBgkn#a&b~-@SlLSE3TdCa*S8+{uRQFJdZIJ3m`K?qx`aVhJN2phl)E59& zr%HG%qny@&^iU-M(VvynEC7?4jMv=~eg6FKkyM(D!4*=2wqRLXDZ8?OW>#Bus`-Ki zsuAMb9&2c)4pr1oac}SF(`pV)Oi|az{(9HQHBP{lXt8b6a-RzU(l*Hl3Fo6jbJNuT zN=;Q`0Z~Q=Y&5H@szLbpqGwf}At|SWit7c>sx=K0Y!q_H97?IxR1-%_O*K5Xw!lM1 z24-buZMC@+_u;hz&|J0e`FXx4cARqGGgGG;m<92@%J@{rI-XCp^nPV)9nV*$0@M5p zG@!0Ji5l0^2Zj3q|Gy4O|K9%>gMun99ZqONwx$w9{Gu~8@(xT$l&n;%f%-NuJ-7!} zMJ6})Y^CA`s>4utkhVp~MbL{MsMRQcX-GId+fc0wXX!lIuM!R`KWd0g5qA*ym6^Q_ zRSN=^F6^m>!$c0Sz6q~DTycK57CXs)f-hX2h{P0^LiM^-8#ur^T# zNEh8$uCGc}%B@rvP&tD9h-*$*s!3#OBbW!)Ycfr3qozG}(QbQS(O!IT(YB}2PYW=ya-Wg@(W*`PPYZU^ zUo6;*d^s(nXWFZ)|LJ;7?Vvgzzg|5bDZgID2cqd*cXc8~c2d`g;ryrd`o9~_e_pBo zC&O`LIODnWiRGB$G3orjS&iTD)mVvs?y1IcRV%BPIg)I>)P_FXL5(j=!oq}~TrYJW zzM9ut^_U*mY&D+F_Ew`UY}Wn?u0Li`!Ut+fd9EYPi@7Yg{##x%70m14R?j~SFj;%p+$>( zBkRd4>OchXz55DufNNBT7VoEE=lD(9A`unMMv&ZTRx^fgS*A((!=;AAlm91`Sig zy`a#C!_+rv%VOYh-Rr9QKZR)rhbir!LgEG_FxjjimIaZafNH(nyRl()0J%o{*lG0J zy<2lsn;gf?kS7^yV{?F%}BQPKPrP0jl~A#IT=y z8#~K2>Ninf<-mJlT0%xb`r1v+MyeC2;3bEV2EPMQ>3<1>VUL3{`l}Jtz7P`C{P)Dv zJPrsqfOz_UJpR4^7mRG^tU5nPl+sGBBT)X$|O#GZh3jf6F4&O~sbJw1<|N=AyU7qhMgxgDD!NP`(|o$O_S z7bXh@9EO9I)M*M;>y<_#e4mJ8C{hjfW+z&m8q#PTl1=UsLKcSIvVX z?0>=js?z3M(ckf0LEPoJUv~ocTjk+?1nxJ6Dt@T`Vj!IZN*_JMgx>fFOlUt{&hOoX z0_Q71YDrR)dV%+V9K-9n$o{1BwMvR9suAWqaAXCZXj;7 zqoLU<&rp;#s%~`bd(ob}D%v=pv5HKI4nNzwRFDnP<^wvBtwu-fSh)+=wJLZM>X==^ zT>w$@Z8>U!^b#%ly(8iYTi&-AkgqsBN6n?DHr>Frhq`wWQ=sMb8vH5;j@COFyGn+! zbmBWm$ob!@{6fmu@6^@7@P5W2gDYR22s5Our8oQ$jeYsHonpmcN=GQL5#ygxCwspfI8PK$W)KC znq90;sEFA206aiI|GF!7u>V{EI|241e>JL2 zZYW3lCI7Ez_}$|vRPd9UN~NRvTjn-D^@K%(rQC4cFPwx0km`J+?g8HJe*?Am>C>=$ z9H)#^>ZgVUdcqG;cS5UMsMR5Wea^`Lhqy0+lcTEE@2cMSp6Q-_l2msl$z+)$KU?B2WAKF1MAd4h|T#;oGpUN5%d`dvJASftXKz;C76I1n6Tu4N= zu;l-pbMLM0p6QtceZGgk*ge%%x9)Q8S-!K}t?j*Q|589%+G~CeaOY12I+q#Z??0vo zafIy7ocYAB#J0}Yb7IfWcOE4heoZ#gTi)>Ne64rtxX}hqdw8cNAhzFr(sX(Mda>CB zE_j7l@!~63H~R71|K53xxgKJjPKC=o4;}sv@1W)7!|L5P%r-c=bdxt=kb5pc@|KZ8~(Dh z=nvkR#|>h4JIdrw-o5i<^Ul1mkNR}O4Nu)@M8r{l+xZdh?0jqI4o;i%gKZh#{kTpn zd3)yuYU<6mcOGH>A}UsV>RD)t*M1n-a_l=h&o;~(Gve;W|Jfj3eHYYmo#=RP=T#%} zOo#!hX|fr9*>>~C2I6ThEcmFpD1K{+KjcSEvgaQ~eYN*?zJoS;yPg?pG;Z1c{?6ZU zlll8V^v`^NP5-j^-~&l-UGH3x8wdA{|Q6X`f%sDqHsNYBWq9XIZjyLemx>C{b=XOG@EU;S#i+c6Jhc3M?2|6Nhsx6 zG2`Q%Un1}Bo~aGummdRw=-P6`-kt46-z^vXws5xLA^ZGgIdP%k6q(-##N8)`vjVyM z6VXV`#8mEva|7_vFEgE6k%e{9q2s)DJk9T%WRf>8=#WLYB@%LK;GaWc-=WiUTPB2^ z$51#G!G+*>eNX9n@isnf>w5Tj)-C^A*NHdM&Zmsaw#>;mx0%Le z;*DD8UGvTl#m=nrf^qwn`*Y5=(W+uCI6UDDrWCJtpUE@#lJHs`1M$g$Cz~Ap~XIFvPjcdK)=e<*iw|_`J`m zv$CjXdFW7ncGXblSUmIOP-i(B95>84F#NmUH`xa6IBS?Q1wU;V<{XBf{(G2nG5+ed zoYU~vHp`jh-5AL`2jkj;ymJhCb7S5agTEf9i*Jii!I>05XENf=dZ$f%rr@kbE87ds zm(0z3#7V=Q$EmB8;gBhLU?dX3kPU~9%x!Zf(p_0OAQcstvU4&k(h9>HxKn(q%^8mu zKGNn4#p}1@8RP9OH6xtk3=_qX8PfUmIA^xFZ=^FM=mg^NKZ>sNmyZ#fPnx_$bd7S3 zG2IvnspNCw{!z{t^QOF*_~P=M_+S)lNSp`R?hFk*^$d9{04ErXw2`o#Ob3Qo3C6iHjZ}2 zsUKe(?Tk@ZlVhCr7DU_OG;EI8vyGJn**pciU-7W$9OKlPTk6D$Q&2Ja-^Mt@5e3mZ z#_4DrN&$Sf@8bqIseD*dCxEjzeVNH((weJQi1}0BM#u=AShM_?p>c7|Sf>%YkeTWm zW1Y{G&)StV9sJ9f4re#ETI+bnGQV?`IC#8sAboymyfZ5PovSGNkWS!yRNOHh)3#nb zH{NL-O4n`kW7|Zf(glS`(y;l;Ui=r%I3hm5X&K2^5G?cYLKFGYvZO&+X2#09@hrS> zOC~rY;R`r_g7cZ^gUM-TBgXZRczJ>|F}dqXyycZEC@K+?+c?oV#QZOu!Z9n^D0(J3 z2lzKfo5k`8^*Qm=iC_=UiKix_>;Ik?>)Q7sYGaZ!fspUz>pp4_r%ZB21ERljlCvmy zFJ6)pf0^JkX4!3PSG;CR@Bk-jB(B8(vG|zUOQWKBvST5rYu04vEptnPB+XdS`EgB3 zq+dNSEY6+cyh{DbFE<<8Z5*QtMI-b5JQ(eBNZrL~+PnLfM9utMTs_rkMrg?GQynXM zKM&im9}vHu>a^qBst>1vT=Ax!+g?F>{cn$rP-*NV#kZz8r^JSu>nFlDDoQRl5^{iB9->Ylc&>KBsdcy))#)_5(kq4M(@(fUg@mZXOyo zGN;4j!+`+vudbuBr+N-_W{&>J9m7z!`dIv+G6;jsR!HSrM{JqOXCi9#PVt)q9V@)| zSHtWkXy6|l2)25s7%~&rc0W4IuEVv%X7aVq;acS7>$3JQeYp6|nNG);FKI8m*FO`z zqW<~NKiyM<)O6$f-?2n+mQ#lu_6I*6W;7xh`^#e5EN7VUMbULoXHIm_a_ETN5DK~2 z7uOFJYv(vI@r9osfkNN2obf0-krEdbYwNF@jYm3#HQQNhJc7dZAXFhY zG4bX>P6OHwAM6YX+!nIygnjY>4dRf4!POrT*BHH*TC zhd7a`dmpMtWJtlB=4*tMeD|UH(LUdFUk2ZQ|4_Xup&}E&aIO^bZZ4B@)gjI-jIT*N za>F-pg4Q8U8lBj6h|^Rtq}&|m;MR=+o$RBI$c?BI%`rrA_8jMYv@=BHzjtiC98th_ z8ekj_#rdfx)rrZrGtRhOEVrGpbcXJ3|8YYz7I#CPP#LnV-W}7%AP98Zc?-hF=IJ*S zjL1u|qfej(8-5-+7k9Q{opI(MzCUm)eP@3lqL)f79%C20M`frYol!VxuEXc8E}rYy zToU4M4~lhjof!!K`PE#fRd)?FL7^(eysnKDcFk?M-g6c=8nI$To@s{8jgoKB=T7dU zbM57wYxf@YI_I6ND7~8zdo(}5l`IUZWD&AQ86h}=)Ktk0sq)#M+@Vt|2DZ)JJftREG~L92N|>N@^iwzHi+m; ze=XL1tG=lAzY>ZeelD}?+QTyc;(WgueemVqq5P+ zkX3f~<%{dmA(Y|u0|kMAqW=?9&k0#YO0Tw-w%Gm)RsmEtRwCgZj(;5Qa2`0DsiIJH z&5q13>1YR~w?}bsEQE|CJai;Nk|2;b6Hqo~X5xoD1gb>}o&K_ipFz@pi>$UuJ*SwE z$OtR2fKJ;1=>@EaoDIH2)mMWZzKCrsz<9d8G@`B;ve%;x`$gY}F(1N^GU#Do4)Chb z#zNdOH_o-zTvCY5U5)=T#{iF^3M0@R&2Gf#*|7zm1=IloKA#P@^*6}<|xoYJ%HklzYoLqdCb?1Yb2L& zL;xRNg&(G%GArLPk>-cGL>J;vlrg`^8^`fOy4NS7vDjQv6w?>u3wlQbFnDBEtdaU` z$kEJiDU=3)BdFh7BGwiU9WIu4Iyaeb1KH?wI*fnc($VF-ZlFGH*99o+y~R4(xiMgv zTOK^l!I>te`1$e9SMcYdCpb&!&$TByu%ow}b`lh0{Q1?BolEeif0?t$5Urna{Bcf)d zQzyop<(xx*M#a|SoVqPPIt%(Yntbu|+~o4Jp{E`L;HgOJ8qYo}Zh?Zy$5mtUG5v>Q z`IwaWH>^!J4N2aJ;n3>fQAWn_OCkU>6y`J97n zBLIm!xso`N)BQ87AX1hztLrkBY7iL=+-6%yO;xg^$H8x97|K*S$X z|AoUr)Ee=3_-2ZUE01cxX$q9^gpvgrq&Deet!NqZk{yOQ=9tEf;&SaZq*bIjyP%%n!!K#g z;z61}rILqA^B0hV@t6w^N41Sr_Q(Dnd+pDj@pVryKr6G13;6Btf~Vm4Zu~z_5z5{b zd@ZumJQ*N1Jva4Wp_o?$X)dGIQ7C5`biqV;ks#Hi&e0sIh zGL>@Y&=-0bx}HX6}JBV-kI8xy9>rGj|qT&U$IhH||VkD6d0?iroq{i*t!Kz|e1 zEPA|XXUyQELwODTQ9(0IC?r{nBx)wm)dpC;C36IW z!^NvF?^Lc~7*wREY76SeJgG4%p!Kh2r*4J9$oIL4n%9#VLQJ zcf;S>fgWZa4#&mT;LJ9$b?dx9J%k#HRYS(&qb(n`f@970d`dj{#IEsTSLd=AUxJAa@21NWjPjATT8_g{DxF{L8d!r@pYh#hJ&Dw~A;4M++j4l_^2jtt2i znJ6)rYRpdaDb1$RvbT~?mGxGZxFm`!Vx~2Zg4zLbcLXz~_$^?Y1#r71xZ!CZs~TVr zkGwE}en-dcwa@s@E+AO{?&4X6P&a81mT%)Fh4|cep7VWmZtk+Vd!Z)nN?#0tbz||X z2=h)rJ4#+SH?!tK-1K|g6T58g)y35htlo9e)-c`n4(TQM&qsIr_5BgPfAjXO7hSyO z%I{3P(29Q<&(FB{vgs!JhDF9=V6yDr=uWQw*$WfS2BZJI?<_lZ0cvSoa29q0IE5AN zwj-;oz zKjAnB8fMWibvg=wR}+K*&n*pix-SOiUE3W;H%a(-x-W@_6c$H`hIt@zDH&4CiS|=6 zOsOh=N(`_MzsEe1EdE#VdkrP+o8QAc8-U-VnlSHm2$uf*9?SSo@q2i7xN)*z{xN>P zupvGjC~MHd2rPU=r*KTs z?yiO& z8m`;qq-!~P0DRVKw?^bQpmH9EPRGsWe4fRB+tR_nF!Hy1&^R>Vf zCVFc(J2K4q&@?)dqne5MHq+N4KQhouKw-F#I+y7d7yig;tF7nvfoR|ec!E}?o@c*J zHhd&XX>&>IjH>P#wj1~XKg!WHh_3iybs~JXlM;U`zFIHV-@G(XtTF-qjou9S_dNp) z(87-0{tk*c=ox4%n*k1?VYtEHcLp-{C^kF>oPj>0Z|XaG91#ZE8+i21-sqcY^tmE- zu(h%ffU+9k1#eZK8E{pM+sxrJit%IOi30qzG}z{#5tAOl`NdH=B^D8dnw|=Z;5sLm z4;S+h*7KoCPi1O}B%+cmK@w1l0Psy))o}!%B+{TUUKk2QCS&Q{3k!i3Qgy*W3S?m5 zFBy;&mUuSwe2)-XOXM#eIr4;TGgmdYya$GOQ!zyR@kh>#rlGh{u~&zx7I?41q-MsY z8O<<$ylmSJ6X*R0wk-qWU>|S>OEzJN+vz%k;<$e6I>lD<;&*hNVQ*YtPpq5>xFDK; zjO)X>eXt>%&%)P-i=*gzo4UUKCh&W@zfD~JV`t_;Blx=C-lW;n2-*9X$JCP{#Un?m zTleDlKW<{AFn;2U6mx#;L_#i#pk0OJ&ZGXC6N`T0)YmffjSl|l8rAW3(eo2$me~8$ z>Tuj<2}Io(O;_vdzyijo=IOvVZhnl|J#}|heE1XR`s7&tF~XjevEqC8I4f{sskOUD0JsIX83!-& zI~5WRWHICk7{?zzANN&Iw%vGm|NvB4#dBs%$AX8)B?NjBf zU=n+uyEchAobpqrwq_b%MV-L+h|HP+=@0$+vGsK}tYSro)9H@P{UPA{>$W2^;o+|z ziSufH>a-fEUb|(8(EwFA{+gI{2Wm-VR)zAt2VXG42#cxN1KWl5m--qMBXQ=a!>~}s z4aYEDC0@JVnU)4gsh7)(-#G5Yp~HCl%7akg-sIm+n~uW50t53GJtv?(^m`YssvQnk z!w(5VCOt5hd9W6g=hG&w>5n*q)DRyRKB_+uw>3>OTk-MY&*47+9zn=NBe6?rf=_qf zDks&eGD@mRK#X|E8I=hsEz`8WkE408>&A~gy-}=s$Qia2RYjpup%t(=-GEfxz=?TP znzh=dqh8AS6O=7A0d(FOTHbN}Rmes?dMwUVe8{QA1j$@#J!|X7)#rMP({KWWxT5pp z**F~oLh<_g18c;#-aj-5Yt`e6#5r@PN1LHZ$|;nGT$%R$?}lxM^hmK{VNK&?J5TfB zv+sTddM|!{R(&__O~kTqib1FIXvp80d)p$sX^3q_Z^c(j;v$dDv* zDvd{-AyHX21r?*ks7IaQffy!SbiEL4$ok&HMd;0MH5{rQHQm-~-*5 zLtmlhBOE{mf+D@W;D=`eI+qm|Q-0yJH33Aq(&?^90RYh`T0s{lW=P=R0Fo5)Tw2v?)?ngd$uc6AWy`MFq2knv#Mw zstFfUHU4p@xiL<+nTqJ5l5A<-#PY|Td2!QUDlnc-9*81NZp+%^D* z2MG7YyK;p%G)nrGVUS#{iZmzunWs%1kpN#cXf}aPGM-19KdR~n_?Xo9m>_kGFD4%O z%A46PRJYqYEc0Ft^Kt{_+2PG(YO!3>BbJs3&OSzUQ}M_z zouPmfsfW;t{j{_hD@KF#V~}x?>0Z`Uw8E)ce<%_OVx$qjKf?d{BQ#nJ9M}cv&lo&P zy(}o0NfWR){ba#ingjHiqc0gm#TDll;!u#OA`EULQ#XvB6Wz&%=vMV3e1$%84AO6? zBY|E4KgA@QCOl2DHFF{4Qsvsx%F?7mwByzJ5aUudQ2B7yfZTK9cTYP990-`l_8(63TjCWytWk}(tpV;Q7~u!k;N1Hdec*Vzqc5%# zr#$0ijT-U7Bkzx?$BC#Q5O5LHtTKs@)X@LLy50#myV~AcH!)v}3$-8JWqj0vVp&+x zAT41aj@O0pI=DBOB#6?@`Q6yhHP0eSDwGp9RfZ+_tcd`dJDzoBGOPW=v(E5o zQCnJpV6U{r>gAG^BA1fVMuQy3X02EmpE)aMnc>y5~(XjTbFoKFP;xMVJvY8-@p?y8y0B zp?;V^o}sXkA%Qt~j^+qAFbhYe7}`NZ{gO>v2oVh9xuhZk^5sB6PV2-pC}1yS4w!mN9z_pX_V}>Eaw@6&5IpF0AL zcZS7dXo|!Nq@T$B+Q}yowcv5ZgxIw0H_OD@^Mk1bNw7As6fpQHy;uIpG8!WQt`5VM zwAlJqI46GH`v$avuXyJgGH2XV4{E|z~EJi#c7YB z$qR*3pdY+FTg15nL?S+m9>U!q#vq6>BKJFNfP7FB7GyUnG=L_g{gc z_@Eg2Dnf6c7xP}_zq(&_hBgIlvIYZ7(Ks(L?`#Y?h(dgbZ0HjAyy{HGGjF`=9FC7^ zuQ_d@2MIz=i>~H3v*P^MoQ5zhzAy84q+B>weWwlum(g~x^?4p1f6W;?gt=m^7G&7C zEF1JK>DQf>QPn#nWk}eTG6YOcbiM9OoX_nkbdli&?ZyvSG3G~V@fXmvN)1>6gMb7{ z+m!u&{B_65c4~Hwe&Zk$?)0A55!Cm*n7mz&x=|QIZ@^hchzUb*#`8jKcPvcOz1snH zcL`$$qH-S;3wAh%7W{TjdeF%qED;_lo^J?B@jQez`qQM_5exp~JyLyRX&JT&0|HTl zET78T3jfg|g6Nx(*->ZT_D7}hfk8{-4`(JzvnFgSSO|CC;P1V8{!pV~g3tcOYVQfS z0mxh|dqM(6)HW-KmNYru`~GJ}%nREJHG*Yb3Z_(DmB0~ejVfAFb`%3=>_`#naIxdt zf2|YWbDWh)#*WnWHc7x8u5(zDu_JYT1nVyX*BivGuG4XVM2nPc9Vw|OLhRquH?V_d z`V4YeVu~=c!uZ@1*%+(KKMfFL-EsQgnkN3oEqSRZBNhNWkW@=vEva;cZHY5^`cOO8 z{LSo0j-y2MHB=x9poHqIqxm$@L_HH5&OkEQ=ALn(1cuKTQ|26dtf<+$p+Q`oc`6i^ zmex42yZCHYEc}BrIw^xGB@)%qYaC%1SuB-FY!Wm|C?_J~NNWT8BXvqmyF{9p_ly@? z|KJSq`)zB>jz3T!)brw^Ny|}gvs0^HooDE4E!ts!*caC z;Z9`C)_f~`6b@lMBQpfV=(%as3DWkid!zOip2D7kr#DRY*@%}V>-rCUg%dVT73&&q z5V5;+R90;5Ipbh9r^ULzAc^C}F-9YoW*sHA{WTgE!%kj?3WuXs2Smfynx~0pkC;){ zyBtZzb)s|h2|;m_`BYp?`puo~V(s{0$+{SDS%4E1WQ31g0kL%m0=14jut98op*}d7 z9M<_p*h7S1AZRX6YC!^i9_UdCDEeeYG+DuXoK!ztveFC0hO6Jt6|wVzRvhXhzJS?L zFjLw}P@EEM2!uzYZdl%L;+YO#BPgMe#C-@dfwhcatOUaN{uo27Pk;|wqF_Jyd+2b; zJKWR;XEWWKH}P8Nv{n-yPIRx#eA8bD%>&af!gbtj8!HiDWhLhq63HNdAM`bm@S)T* zJtE%};wPX~TIqZORz8Hu6 zgyoG$(8LlHtkbbxA@n&y;i2$vH}%Ye@}__BW6%)f_y-K`o^!vf-XAltt*k3dVpZ^XJ`A}fl=%?<{WHX{xOF_$p3 zp@5Djg0w<0SPTY0zaKyc!I(aTeEP{*Z2RKUIe_^)Huj$ZM^xGtV3R-Zj0a7@e|KFyqs=l}Y{dL(24d5?`Y5g-N3 z4Hr?;FRoEN4V8q5UB_gv5qG2JO(G$Y%r0`lCaxUWB<}yxwrG)usLC$NARY8h8|&EK zlF*c~?sbiZAkB1cP?_oSd8QY@1Q@VXb#SjX)oHk^6LPqG{(z`kvnV|+W{;L*eB(*z z%cU{GNJBe-tjy9FmEn#t-mtd=#If-sCu~83^Djz9t?)ePbnMW=OQroDhV-rxUAr!; zJBn_??*KjMHck4{(@VE`N*d1@jl(t(hhrOZx01mO>1n0mkWWNt69mPI#co~Eq%*UC zfCdUsCzr_YzI+;tE{!eY!#>9k(!K^m`Re?nL2MK(N}jgGF?^Y&cn;TSXW}D3?|Ae&EC+Nn%_nDvFdmuUk0NhAP(}C zRH{}iu%Fg>wl80g8TBv9XFNHO;fUWPZmGq;2AV){pGdv|j1XS}g<32Z1Wj#kF)_|) zDiRk|$Otf|fOOc?sxs3;M>v2PO~J|rP(zeT5NM5-J2m{iEN)2AyTCXj`FgwyUjl`! zd{-9MKkWa*wO3XlE&$xRrsDPLSR;NtGfBK2fdoWQ`sH508Z+RWnAGex6mvv^CQC!V zU5C)+`QYKyFB=<)vaLZP!1D=7gtXiH6?^qp@wqy%s0HN8vIesXAO#osX@*G@5lH;T zlwwDD>6N@g@A%CK2H(BJZCZ%u`w7!>xf@0|bT2`vcpRdaKg*v4jc&@j&7;-(r3c^i zsIhPufkg!XFp0uIR0M3~V=i$UQzcp;ZJ~VkBrA3g>jIgItpZ)3v{ep~@JmVV zEAM1;XEn?Vd7FG6_Ss`MEh#l89XNv>Lly+{V z9U4)I-%6W|JVn|fD=m=Z3?_69CvsS%a2xSrgljW~)<#A-sI_U6Eh|j|EeDB@ z{!=7BS%yoLW_m=$JJ17Z_QDd>(qW{yX!=#zqSS7yP@K}y!IS)40iqi5X_+xfg7T8< zs7yp}c#!s3M6fGXV1jDprFk4o@ou^|E;X2T>QipIJzgp=PyG-Axum>M^kEDE^5x2l zw5O5w4|`f{TIvodg5{Reb_$g0$u=3vk%DG2M$V7iACfa=ums8SyJc)g5_gX+-7W7; zU}s{SI_-*SXgI$P$$;@ z@b5FKK?y_R3Q8!XX_nwMP10utq>wrBHIykj+KsfN*%+5tLd*&xtcL_H6qpM9AR_UD zWIinMgCsnF5dBA<=0PE7&{j(H`dB6t?g`LbsL z8DKPvITQhqLD+&n3u@v4tVc7p74sCB!7&5z>@H{M{1C}&q_X$mEuo%5WKmz<3B!^B z4k@_HwQVWV;9JUEEIu7@DV!*ecu+`xSk90az{mj&h>O450#~pem1BSe!J$ zZJON|5um_0i3o(GIvS~p2O!iSFi$*pL04An1t4%(La}BE2qdZj0%Sb_B;tuup&N+` zKtQ~{$~`Gs4F-TWADKTA28ay?10dhQ%2b5`pbN1sKmdZAxG>BJ2?O9-2?hvP=x9;N zy;-9mu;h5sL*o(!h-(x8=7vH6s7;^%k&?zHgRsMcpa8MHC;*S}6QKYa=8-4>H`o^i zAf2DayT2$vT%rJRTcH4YjD!Nfpsf(3gQ5VT{wP4mLjj5&3c$B%oj{@hbXz|Z0Mx5d z0PMpmC;+jS2%tvnr2w>7DROE^XTOu*c8Wg$t7uK`g6C6FK{&74?&kU%mt2@<5xEjGRi^o=5gJroo{$|cK3fdnP) zH3&%1P!19l8RJZOc1OlS&;{8YeK{EdUm#^t$^x&E%d#Dhc+q?g|C-2_2a}5Ao4_jZB~Zv=*&uBY4pI*Lt`?qs9&Dj7mK|OU) zTjUZqkO(_;^pJ-eKpBES9}qVPmEi`INUV7I;J5+5+3<_jNp918Kr0khBF#j+ix8f2 z+#m#LOb!6_m83D|7I#bhpzKNUm9Mz1m8b!7P83kz4>hRY57ZzF-KJtYQB{kjlb~1Z zhdy9ReE=V%UrBvHN)!nul(y7>U_!>qSxx=G1gLcfV%U*>MywWG`vw;V5>*5)#F5jx zzuDOxf1}-(u zh)`^v@7AB9->)@f7}tvYB(|W2JRr8fYEd6-p+B^coe`JVLflr^f>wzLTZn%WY=OwT zwj3>x*g|b}Y=L-Fru=S+Eo7=;3rYAe|K->M`BJKBO@6I4F}A=~J|PR1{|G2w3@T8# zAi|?b7BT7oY=N{USQ_*LF2i8N;z6Essg4XqY2gPM*s8GwQLJ@i#s08D2?&8Z)B{4K z<0mW~KVF@V8EJsF%^;0Q)Jl48h@z91@*j-Uz|T&~a}7OM zpiuZi_Ha_uaVxn^5IToz^C?6$PD&)rE0GLIn{ErG>7Ync3#2-!M>03#T#-PC=^a3O3&LiIv6N8@tpRkHXBe22* zc*Ie#1ih%S;wu4oaL@&^bX)T#LL34r=t9QBQt~d^^aC{Epaw$kRHW?TES-uq`8Xni zD9e|?6S_a2#8eWUw-ED};7Neg9l8|(>c}O~;TPBuT*{;yzxXKlf*Z2%zHj>Dh$_Q8 z;}>>x!~f6$E1{078DWY^F^5Ld#A7W%n^K>qDG@(9z@0orb9q1dq#<46@;nIU^7PGD zlB0o05R;Lt zyPE+Y^Xs%BKtVs1R8nC^;FW#N2osbnpH4BTN0gQFC>dri+o4)tiBKF66qUtra^nL^ z`~(XkT83D|{UH&ll7*p41e6@x(l04CU*yJ&cf__9wNyv znV&H%t(|gnpaB|?(*4ASFMvEKEYS=4N|22J)3hw?tHjB0A^|uVTPeK$(q8HRG$?@A z1kplrO;}@p+~4eQi;hnqDA|rele}`M}q+(u@e|gA@>rghCF)*hBrSxjwF9 z8J<(QLL8nmKM5Ezm`4tvgcAl@FAHypA!oeYwv!MYJ113kjpt+Yc>ew@9`ChbnCuGH zucCW+1H&ro?fF_Gawj$&;7#ggUH&UuFZ%I z=&XcE)5oBYX+0cGRxid6LqH?C0gCb%4Q-MN7o@E2KrToXY$7+Bq@8-)4dGaFZ%Pm+ zfxA`YM@gc_p(9D7qPA3vDO6-27D5V9kyP8wgz7}muc!ga2pwyae#|cBrIyr2C`bI2 zr4>5A1d}c=v;4_t!L&^%aam@-siO&QgcM9t>y?6uPrRH|uNoD| zA0PfXhWBZe z%!lGvo#CMlJ{ExT1gXT6{8sI0&G1m#LNYwgPmts;i`J;@D716!m`ZF-hn;(YIM{R? zn;5j4zrFiFz2^d?>v7a8OgCs#1PRMvCE9b;McFYW7`$Osc0yuk0jcdN08MoOEr5Wr z4Jh=B6f@*g;)Q!n6sRVE09(kUqcvL)pAtj=rvxu! zjzI8Q!YiOq4GC&jDd-4pZvqN~Iva(F2BsU55m~~MrY$WMqyi~NBd(F7Q38d5GDl-j zSNRT;gb&2UU4NPt8Zi2Z3es@2aam-Tj6MpGpHW30mDWM(PP`oxWO^kSx+S4UwOEN% zv~DIzMQy;LN;{Xpp&~^E9AXCw;|hOitM`x0*KI4Vg;0P&c^36XQK9UUd`^<@fZS>( z41Ue7B(R9pQ`|}ci%O7T-gO)k;%|T}_MSa-ywNbWY;uTKDLzGVMoLQ37}Ze3AtT)e zgda*+(Z?)F+TpsGKuyG3XWzf=alM0++^0HiDxDXk{@jfGcpOk_1?gBtVTS z-LV8m3oO6WN_>+z~M=Y6c2qz3;-NrZEB&Z2>Wv0GM<9T!P=A z{Ym&O8HbEOjLil4Ea7hCTa^D3H^rU_Q#w;bf^fAeC900_w-l%vKG#0@TZHhpBm&2< z@O2h~mK6SmPPgV0P`Gr`6Ls55MS>ov5ICfiK}*ALh$xrAuf;khNM=q`O`NaiZsRWG2WW zCZy^?xg~yCCjanaX@DqhiEQA$pazL;ZD(s8kG-R;?NvODA=1-YdIL?QK0$nwYoyY2 ztBTr@+oc?}OK44wxnm(*A-Z`H2#821F;XE!lnhalP-=05V|H;5vzu)fWoiJldEl^v zqy}UqW|syC551zsW8N}SpWwVE{9~^>?KtEKC=Y)VsfB<@J+)8^6TJ{Uz z-#27;dKqLF7${W$8DNN*BKnZ20s)yS5RjSgjNIhMiD$p0OOYqCcjDhE#O_qfq zHW+eJk%Y<8kDN`AvwR?|lu)n_Rzjgc5i4O86eSP#e4&&gAfdRDh~Ez=E>|K3Psxl( z7>Qz;00$_$YT*6Gk%6EFjtivEe$VNh7U7+SjmA*`QjZ!C(nAUw8P5twgnptiy*TnQ zYo&6j;?Een;?^nwz9z|d!o&y2|Bn%3eMyZJ*PZ8%5ZgcR z#s-G;s(APl-dcqA57H}fzfS<^vF#GlYw}M)di7Sbm6mIwLhJrdAic5`+Bc+EWw}7T zD4N0>OzQlS>Me2Cd2TW#lk`luC#L&_?APA~?t(4Ub&2(_Ya0fV4gsw+H?g886{N9IFwwO98^TPFptqhA<0;C4pw z%9J|HgXEhijo8nJ8D3H5k85|V4CE|1N|m;#9Hm+cvA>wm8iIHG zI8SAgT?w>N;c^2(dI2aP&0^B0&dnYxhY}$X!1-kahnB~AvO!rU9W{TUjC?5xwF6f| zdVXm?@Azvf+r%hdJ+vfJ)quBA1UrHS@<@QacTcV;(<>P`rXm4YoVcem>BE#Hjz={t zs^WMN56ANo-1QkMSm?$=f&$v%60k_uV{MgGI2%d*fg+=TOobY9;|R*Q@_R}piYC3f z5>-;6N*+&DaaVHMe()Z@tCqDXBAsGiQ^Aid+1+wEPcjiBGa4iu?IJZg^&mO;KUkuO0$ z{~#b=TyIZc-Ml%ma@c+N7x%2QiVfMyh@^!0%CvmRn6>efe8Cye>RD;kX zz(jun42YwzaK|6R`qyCGNJ4g{sUHxsgOi^^0fY8PvEfg%vI@2Hn9*R2h*7(_m8f0W zk%!8nf;i$8%m1?wUb3V^_lNKxB>#sYJOp78gol|{5FQ*%3c`bUWi$z%77}?BcoYEZ zX8DZozI+7o8KOg?cOI0qB2IC9B%I+m0aQV-9mj()Y)8%%&=L@#0&24&?SUg#3K@d! zsG5ow#YIxNPCD2KR-ywrpgAxPyI9}ik_yfe|w`u})Iy0neVE%7@p z^h3o$xzJA#HQiNo8OEE%Eje*cb8DfPWJC$wh6~A8XtdHAEs_Wk=97vg0JYM|!=yu$ z0!w1Jfue0Z8ykVoeN9+OZqrYb3PI0E$S4*#wff^=n4I5+JU*y71eTEw!J;69EL6lihdr{Mdhc>#g?B~%3HZ>3dUNn$DEow(A!hy>2MA|0av<~ER`zBMFj z@Dt@{BnYgD5>k`^Sc5NtLV12hv8=EIHZ=E+0<65^I!P)kQKLw?h8iG^Qe#C?C}jht zhmaOjN)MqD7C@E*g?iF^Osk&to?@x41S$oVy!pEJitt9Hzpt=@p`u#Jb^u!pt%?xN7@b*qri6*NcJ|dst4s`033n8^obl^ zR;{&n9Q9i9YE==6Vbi2o-Q(7!%Us3K8n~tdRdFh#c+BX&D4v{LlHxg$qsr5R5xh!M zERp=8U|*V7>5ACKNlEhxlETS;&$PEzn&=ZJG4qe9qadb*URElPhJZ&~f^0H>R z%KE3IMIc3Lr(sBl7z3FQwIbFTnsN}Rj9(ZpjLeC>9gV@$Yd|)@s8zBj?PcxumO40s z_sgh81(z|^(C=`2o2Y|Lgy%yoOGUQvJR@0nJ1fjlc6{%uYdiw`SoT@sS20TdRJav- zjGyob?EvpS2~lyHqpFNlx{p=KILab%|EL<&x`l3Q0AZ6$MNjfoL=|PO3RM(JlFx!m zlnN!mPb8B#RD>3fjCM52&rvNX>Yd~%QOGix1d40KYGepk)YHfQnaL8&*-xl zQGCE8P-+uNpfRlopj0IfCQ5pnisVXpOjE)*T)9a_X3;X6b9(Ksj5APfhtgeZm|}V6{kl?SDBq^H zMcI)xa!yn|5E>L~LeO+rbWvs~PNK7Nq*cJ?M|~*banjiaUZ9nu45>Gy)aY_i#0c|I z$_&NfDpEDl*$D+NFBGxs1Y6)y#9u0hCO&muD7GF7MbR(5LQ3X^LN_3#30KOUYlx+% zt1>SXffx80S^=RI;>j<$(XkfJnIJ10el?`U%K}m{C5`3r=lGG!#5IZ)y(6=JUx71t zn&wxgLG@>p6e3xcMuqufHi^&jCn?N3--^0>ygH?vol=sWSRZsxNQL&RB+vgk`|exJ zXJwxRypTF72Ql=}RTGkDlvVS=ZpR*rGS48VmE;+6?~rB3kb7vb;ywd$iFULbugJd( zse-G675CxjdB)#KCYLhsP}rZ%F@{`NjHnE}gF^dL+D8qrJmi*Alp=yk`#|IlR@$ee zVg|iXTNDDKAVAO(>f82vS_@p6*bEI5MVPgQY4@-Cb0&*EUG^vBMc~w0^}7Djew6*u zTwbkMf$6zC#x{V%hDcd04zywxuUL6hZOE4P_+TY}KJkjR;}j$A-2N2&`Cs2q(q1p= zL&KH9u7ZgnKXr@^%GybNNapT|KV0Ev{GeKyve%zrHG|*3azJG%dm&XVH^{=Pq8iXA zN!bh8(pn#&98jN>y^uQDX@HbHDhE_kimnaGGQ3bqycnEP@&E!I6z)z(Qz&(b$^jLk zX422%EGRDQbVsCFlnq?|$H#FZth7OXAyxnqj}BRd=ijG9Pa#dFy#d(=gfUS-kPt!U z_+BdigO~}DV`+MV%FL>Qhm`cyM}Tp9)+joTlOz}{agG5fNic|ciMK;=WyRTDR9}hY z?7ym?S&H)IG_n+lSu3psE%%eVIdz}?RLOdt0mI39T_fTLi;25$Y!&J4S56Y!vu;X^ zI&*Su6MUd>G%Udfu!>H6peE=s_-GW{-)+nV->SeICWtv}=C_M&Kf5Rz!I=_tTyI8f z_~GAMatt0d`F+&79 zpzK5$><|Z}4zPt_hqjT8kUJoWIDroJRUn5DK@MT@;5XbRBP^a>?KT{slUJyWTUeQh z1ScT4K^a%{4Nw97#cq4?=IQRx8LX|!qm08IdfW#!C>>KA0=6m(=`tf02M%%L^C(^s zG2tLm4j)diGaraSf)NAA4p5ntdWf&WDHWa&#PMM<&oZ8NyPc%RZJpsxk2#`4F-gSC+kaZrwvV;3UO3`sa{DUKm%=@LJjYfxy$O|KrY~`Pk(pEkhC;*3o zeXM-MtCX$tKvq7vY6rFQRh_4YsqnKj*CHxZh3h<3HTCs<($wcVPXn0xk-nxrXnd(K zUb-nOminiMieWN1ryqKQfuO-h^kkwHxT zh%HV1Fx7i1nfjt9ae7wV{LCO|TVIi3xvek5fFsJ*=a&20`d;-!>DY+u zzpcN|Xl1VubYx&#pZy&bwtl3)txq?>UPrk|f&}y)8N}8H!OJR8MD$z*ifnz7-qP0R z+GWz#N6{T^>&HpoVI3q?rYnWX)`!59wmx|%3WI@+!bulC2oSz5521lS4ozrVf5~1aHVd^I01InVpQkWIMyOC zHN4X5k9bx;r3cnYhF@;=Q*8IXGHWCDAXfiCEZ#!9mASN$L9PCOaLrKYH=^u*wPwl* zU&_+u!e{@w?W5HqY2lZaqK|OhD`YP3ciOrQI z*G822Psz1oCGReo|M6<(KZH=3`5z+lf3gwcdcOy;5aUoNWk{3$#`Q#e*j(_YVSAMf z{ytJn?E2Vgn#aCA)GT5lM({N0j};;-yf2Z3s=1p#>kcnFZK1q3R49gelj_qOuj~$h zg+w7r;uzl$=|VCU-za8tW@W+4ZlCr=%cb z=9Pzv%-5O^s(MCH1mFOdKr1J13(I3BKZ>vQNTMFQ4z!>67m?InXFZtNeg zsXrisy2G$ZRoNXFGL-5Q_JSd5aQp^xYHFZ+;Rvk`SbjM!ZW-gJ*kvjn`G#93esH?m zSkM>*DL2xcD$BoNtO|n=8*raEH|5svt1e9p!K4~$SoabR+y2ZMZfF!kwH2jlD5+f; zWO$2;c@h`Sa9hM3XP^dE>2#h_vOJ;QCJ!7dt5R90h!A~gtdh0@jKHKc0>vXE-_7z#7p3HtKwfWvD#gTVz5jI1|9l;fSL;n|!zB~fAvbVO#Lyxt5Y(96k0@Gfm+9Sz}up6pi6a=l7a zkC^=p_aIc&Hr{uJh^tq-3FBfxrD5>P=GAUV*)>5A5`vJWUWguKsTcl+Ril!lQjZ~c z2zrP~dWbId^2sW_Aoxfsydt{9T~uE2rC3@iaDPpq)xv%~l#B`-^}{pz(l^EW$^Zr# z_1phxsltm3Qf{Uw(Z2yRPAY^C43bj9Nm7@eRMtEaP6Ehjg7(wD`ecPFtj{@OUrOot zq?nlW*^Bn0q)bp-&iZs{T~cO@o%oIAGb1!%14&^W>E;#s<>yKLZzf zL2>%3gmnkq= znaHeTE&7ysp>r#cKO&VydN~#SYd}3iZJ*9WpTe@t3lA5k00V3y<%*9s^vb+I*+sup zARFs5DGp?-t5(;gYSvp{Y`Y{2*vh84Q7Mv@1+eHj4dhfSV5RA`-vLVnxsUrNf8Y!U zsUS6rd|e_NmdrRLzIdLS5384p_2;=QlO^1Ob*8fl2Pn^yR$2@EO3?ZI;<+!5$%!{V zoeG}nrNXlE0`tYwCUl==S_hru94IT#A~hMrsfA$1NQD;mzb??iwU;nktWealLJ?vW zHzMqBxNUV1yDC+~l=-eWvKi5H&@@KslbV$Gy!?r)7N=DP%Ic`l`I!)s`>d2!9nT?+-X2J90>71zec2HW{i8V0PjU6<-Flqv zL5`h*xcBpJdrHP-C{k||6Wnv^#kS{1hYrxH%HY~wIf;l>BU~#X)fgs&1Q*misZtzD zET%M#3XADq&;*vY+^!?#hDH^c0ALrXZdcvA1648^vClLJ?8A1kVeDE`?)Fj5BvDfC z`lmurxd^Ui0zgBX4zijFr6-QzY9@#9EhNCej4>Lhtg@O3-7;2=b+BqCVrx6j%p*CW zB@wJuuXqX7(lGM?^ZQ7mFpz(2Q@WL_mvF2Emow(GkxH==2v;W&#Hok{7D{|LB!QnS zmLLw`0B8clURfiUkBU^~jO(Xo=uKMM%0q}s5!41n7!Y>hB}%9?h>S>o+5Jx6%E2=0 zAz(GjtcM>`f|1zp`^#Iz+K+E-zwXXgPrvzBEjXw12dk%b6zAZedc+ox)KXP~AymOL zVTgBgjZ?qLJTzB`mB0yz8lRN`XoVZw3aY*;ewQ;`h~roM1;-^%F1(&v$Xh`Y$ps{r zaCuyFPEiJ-L}c*DO8&$*B(=%Om8m9t!ba`k1)SJ`L^Oa^5o*ke&o9)1G9a)i z!xLDPtCm1O|aNB!+-50Tco*hb(YbCZ%K+=MiV% zPRSF=O8^EELe)^QK12W-Lx7_U;eh_?00sqZ@Ijr}qViBs<_J^?2Y5-1r*cRx6h1^n zM-YO6>`n#hOq8C zHE0B6_)UPrZ^mor%fyzF6*Kz!_2^)B?bj0%THJgas_pR%4pJ&Z>Jss=En^WV)SgP$ z4h&>e<{n}EMC9a4Ocbi*9`)T6<+(@Ng0FlUDlF32ii;8Ij8Dp6W*xj-CL)QIhgFh^ zeG21-Jxn74&4O+4kWNMbrV&C80%-vAC<_3_w<3PT_^K=bb9ghvOxW&UMI(eVxw{{K zB|9}L1OKD?^e4oB@aaz!(i^3aUe6>CtI!6GX_OzB7@$O`03|{Ns$m*hS*RR*LJgjk z?ds)o)zB)?4y_D|$Io)ddZma1;>1hc@x=jiG^GX}R zQOI3`5*Z<|QA~_He5=Zg7iAE2SOrd$VIXLxRQ9&SDv)xnaO?QI`5!07`OLkWhgFowNe;f^aGT^~^(H?aoN zsuSHla1rcQBoy-ol7a}kr*3|h#Fbo335*~eggZ7PDvRDm^(h*9`=D?Z8Yw@aGwcP5 zAaACu=q>ndITnICuo~S6+cIW^iro!>g+SdX-7T?@2=4Az^fm((0PF{%BVEEm{Nkmr z<7isc7K26x#X+k**kB|P@-?jVpcVy&-XGiGoLYE=DDYNc8u&|L8u&(sV&Fq#8pHmMS-oX^CagN3pf%a4giIZ+@wT8{3QKhD9eL(Na3k~HK^nTm9Hgm14j)haDx-Q zGKeWahF=c#+mvXHDXc@~>8XPl%hU8&k>XfAnW`5rOAZ$gpH)`wT=JNS`{Xfwkck^6 zTwydposj8GNG_4=BuMNeAa-2gHh`(b#Rpfo6LOkOl>-riib~|XAUe`Opn4RbA4u$B z^HsBhr%?19uOMPYNfC&6iU2F)AY+L=#90q0m4*$m7e$_th?ywU1mMe6bI6)NjYJ+; zcio33FfyznN>~#x?S8m}YJ_nI$VDxAv48u5M*F8FAXZikyU1;Yq98$slA_QLbf}S_ zL%4r=hcqjECD=hcbe22i6APGrXn|a94HksG;177MWV9c$K;%6ry1Fj`GeirR{%Ao6 zIUie}xvlPy;dEwjKY>nILA2sH$8eR{k7`)K$fmH0=Fn(??k)_C>xSlL$Q19YRbjlf zMPQ*v#oJjt8(M{?`~O$d9D9e%y-M)qFxKm#0Zl)EAJUh0k#3r4!> z`QeHJsMSj;kUo`{5r<(FqTwscE=1CXc3iM1$>nbZhESjA`f zaN>Zjhni-41NBfn1R<>AGD-*n%4={vR1ZN24~8J@M==G&7c=iCM$MoCct7#nJQY(Q zG{NKiY@>eGSBOy{A(c}At4P3NhJlN387oFX55#~l3@~t6svHpzBnaXZ^bkW7xISZt z0||55s%4|tijmDrsl-$Tbr$%0W-uIqvPW19C>9l!Wl(W|PLD7y*m+iOdg)MOOz);k zT8x~y^1sh*68{!kUWa7(_*TR4e^mklzNx;*+_hVK*Z;W?LRmpIm!fNVUQaZ`ZhLaUIIe_ zZosg=dq>Q^DTEWjMbE+08z!4J0y$c7<4@lnI?Ze(#yQ$-obCs5Pb}0UF9;}BtqqXZ z?#@wJF>(7BV1zxtER83`MfYx)C6=EbN}0czC?4r<$O&s>7-8z8M;suw#S;OsUbx}< zDB;lKAWQKvk&YD_ZB9Xo$L@Gyyx1IFTq`~j?%l>7vFSVRb@-Tny_=6?PNqQWo3?+I zIPZG*1YCdWdiS&yCxg?arz7YDN(iNvfGDPrqSfJ>m^W}S@{!N%{3!0nk(QPZ-+lNV zp@ORv9n#2EekeGARUHU6-%Q_GR%EVkx_K)7g%Y>oy6?IpYFZ)VG4xdnh!W8-&gS^8 zdqOVqQQTZk)mJgkJs?Chl@QZ!aF6e3qqleXa_9>>G1_e97D*9VjtiL69=wU3#3QZZ z0X#B2Cm(6kk0j(H0Bp)0iDSD*M*B{i?hEoabnx&S-4R9PFOA0GRcQ%Q`9Z%F_~M6Y zm`0pQG#`Ux_s@lnhLO|xN%%8L4k&!UBu?1@>?=l-xQa=l!axRr@qVaqTy^*Dg?JxGA5;Y(Qo-yJM zz{nt}r(u61Y>c16E|Cga!EdK~tk`+Hf$hKr2rL6SMGe!WW066QcvHG~3x|3J=vB$e zS5e@QdKm^tF9Wl{%cuo9k()Z)!ij&o z*=;$2b_*?QfUd=?04*jW$gtu3^8jNqFD~h$N#dgzC4pwi-0P z8vmVp@g=3o*O*-KO0U}r^yvLwHy>=rR&N)>*1N-p?aXT&tA%Y|rw24hOEj1BJ45Q^WfLia{&a0_+dG5l!M zG9=cHS_(bl0A-*XoSsBfa{ zR<|vYRA4*C8x%XPbL+($-*an<5qrC@8$pYRA7roX{8mlr^vsG@=xHX?91 zl|kTzGu~HMLyxx&3d7wm(xT^8t#vt;UL&h+#U5sXuTF7KlM} z35fTEKcIxp)j|oyyLgGx~FC&jON{u5sPkfugggM z%ez`5-o(`giBEY~RkBh@w)Xh#?yArXBJ&x-zQb+K$U~b9+sy1CK9dz2p8rZt6z_1` zO%$@Y89}lBPS?uQ zWa|Z#7?xbX8`T2lMA!KXa&7jTyUomd0q<5B)WegmLV1GC;_l~{wba5JsAfNi6$Pg- z#MVRN^|oPe!>h>Ewb~#jJSntsja^}VcjWDQxw<7^r6H9u;7gzkvFpoMHb$^zdmzw) z;)J`9{umQqxyv1UXp}7k@cs9Fiy^d#d*D5L@CWH9kN6hi)3jgqEyQ2jeTScCg}`I6 zAEAlb<^sZd5@Px6BXh@t(7>;vnMV?3$QXL+NkWN*>D#vFH6*6YaN^-mn4vHt(+Iol9dm`vG^=xM81a5sujpO;y@LOgvpsp8Yjc49Nr%yIaD z{G5o7jCd}SXcXp;+%e)OTNZSg|Ak|?&bV-x(J6MEapA$n8^XBfZ!^T&$492b#uE=8 zBQ|}@J<)$#&=y@E9SoKK8n?~3NbEl8Q#r9~$Oj?u>1*7T#!;dx{`stU^%}R`a7E}^ zcM_U2&a2IeVL$tDo>+UW+ayNJI4LLA{^6T*>z?|!zsYlt*!YGsGVn7*AhE?`+#q)R zzqf{piRXn;d+yPt$S=`~+pc;A4rU~R zlju;k4rH%q>-hWFIsx12ZtLxOWrQ(VY@ItIBi_Hq-5sd|1G8UzZ-m(JYVmZVOYFYv z(qVzLDsBuljD``_;Eu zANhQ+ZG0L0wf9zW@_p`TUIR)H|(g$-~W1(7=6F{xbFKSfnkke?TYOo zapcn{g+%iM?mYwiv}fR-UV6~osGq7?mTMGue11k$-1U%qpT4SJ6BL&}3^nJaHMKNP zM(~*Omp}io`(WP(RKM=q>TVj~r*A#tZZkT2*Coan+3U7X9Vs3`U zh=)fUHDt@4C)^7SW3AZHof}e1QW(Aqd+o!|W2AYMClFnqJu4>;?pzuxDt}?-G@CqG z6c4H7v3(_Ow_m)o4XV0*34MRyR{GAe0F?$yO&((_cXp}IbU*j!4276Qr3acDvV1iL zz$Mn-#i38S;}Tmxj@Y-X57-YO21CqQ^<5nAi)rqi`0WOx1vPlt?<*(%Xz|FC?ik}1 z@#iPqM!9y!i2TT-vSP?nZqqQi9NxL1rq(TtjfFI=jeT%4B2aIM){4%>@rFiQFH_1} zrZ_Lqolm(h1iR43n5cQy&50YIb|a(jyeEV`T}V&I-VNI~-V;(gSx*Vqce8VuF7fo! z?kw=p=rivBXYa`aqA1&UmW5>(SQeL45EfKWM1k^7k*TyiQb@8aHR$* z6%b^EH6;YTOr$-*+YfwGOyqBzB7A(CcCC)-_L)tS$1dUeeU~- z4NYUE>>`#VQbR|inNQ%Z9md{1HtgYGTtn%7otZ#CFZRGrG`mKkwRvh6lem;m~LK?KHlC&w6dAv8P8G8vxO@_XGtaxrmD{yjb%p^lYWOnRgm*mwn<7 z(YnLII1LTo^zLf<>-E+2*FjKv_pMs+t1&7h;z8)sF=i6+Kx&OKKKF5(zD4CP9_jM5 zLiMnChYXtzw%ZMqB%06))xC{qMe5U)Q~~AxdCUtg)EL$NHWI2t z5(-eXfa*t{2!y0v#!qEuEx_$E3i$7;>fOd!3`*9_?@?By!I$3~TOrKa!H&G~p{we@ zH|k`J37dcT?1d?ZjNRmm8B`JM$Xi0-`$NXeh?QvRi2N-L9Kd;ol!Ln< z5u_hBCd-5mfvYpd`-&%Si|%6e@37`DhAQX4fy2ht%xRc&#Mp)T1HL_C)FJfDM~p1~ zlW^4dBa^<$zZSh#yzEeC97moe_56$0J@#2qBbp^oTUqy4PmB1GKCSnU^l88SNT1g6 z7=7B{WAteS$LP~?e!_3!)AUB{sCfh`9*Yi9YFL^t(~O52y!6qCb``6^M+R`lTQq0P zs`kjfUfo*Yj1~45GYsQU_0EKe90lH1&e$12`6q||^|Pyzc;owwdR1LDae5H>x@gUE zs1uAV(u)pKx8JZQrG$Z7Dn34QgiV2uei&6jZ4WNgJOfIm#e7n#ptycrFs zbSO0&Uqv=;Z9yLfcIy`gSn2)eHdE7V}fj8s? zf-4Q4Jb?|NX|Uh~#q-e<#wiHuZqP8Vz76=Usf|E{cBd9Lu78E{lN1v@prLzs2qa}L z(Li{;QH8(g2^xJ!pq#CKeK!O=5frZ0u)Qdu;|D~~KUr^#^jM33Y-q0x?Ya#=WHIV= zmW1udA&^pUb9_C6z0H0?2?>8V?%SJw5kJ8D7Bv_n2iB9jRj%2AqM`*W;05uBTClaw zAMde$e29EZzA8PpkK=Y3Fs8wn;)kz^e{YW<#9zV624hEJx+K5-V+5RSFnX(~DKZR) zs-!^ODb!N8t?^Jn!p}x;9a=Aa?Qbp~tFi^XKmAPxaXp1L0UQjx6 zav;3(v$1>MMQCZDcZK2J0Phy;Mn~|6^E671bTFMpiFYr={fXXL8l?S+a&QD>|7nbtPhr?ykREt4 z2tNAL7!cx&BQko4;t2bZ)RM`lVGq$~U=l73+MYu| zrNJQapJ&e*SznttvwZX|xFWH{m_ zu|vbPt9mlre;L^Vbn5o~76gflmk|N3_thjoVF9Z1Ko4#mg4v)x5hC|wmwgDwJ-G00 zqEeiK<4RF05{n?u@xK%7AHIyQ`YaO69~d%M48`8K(tZhA!>r^GY;?b0&fSXloi69T zVs^t&PmbtLy(jl1>YOv4+#UG0zFyo6W;<;2qJL8>xS5`7^0XQ~lqk6Wc&%X2neYaE z+6i>Ty}3mE`A~0;NY0_$6QMHAvoOV*y913@95f92zCUT^~T0YCe3_cQ4We`A=yqMQIZ zJoSNJAozcMPyrLwoNv&l7!VgxCi+K6=Eao|t)CeQ7m?X#I(h~+#s@uZ3*F6{uR7G;#h_E>w$&rvySQPgV+L^0fjN$@3W~nDK6~AGtC!3*PhcUKHMi>+=Um+5MY(qFqJpFmnRgy zSl|WgPZkb=>VsWd0^go{$nPlm<$L^AR6?3q7}|mB;kTZARAT#RP6zHAWSN{drbXdD z>@PzKWoK)lq8ry*eeMf6+IeJs0>kF5hC|)B!59cD?GqXVDc!k&2#73?euQtB1j-lz zL2@me?#_k4GYMRvV(%(+br;n^!7y$hl$TD^8d4W`W_*=iV(N)Xofe8X%qsgf1j>7V>nYxCeNX9bf%dx{>B)6uvJE9`;+Sy7PhaBtRlG~u zJ6_~22DWD$^8{#~(WoITk$V&2QJRP_P6vHHx2x!3&R16Wx)|^%f5qhORftvv;mlX~ zcxEZoePjw1KSHBmIH&WQihoA7!?^SmG&-{1F!jJY)y*~yS5%$R;By~>s_%qA&MdLwybUwQ6am>u6Xfcp-^plv zjEw(T^c{>#;d*Gy1OKDE2W$AU#}+J*zV>k-K_0(UFjxNqMHEH;PClIIVA-$&vZ#6s)Qu9&5!J-Qw!WOV8>CajavM?a=%esH|usTNj+<`g2*WJMCI(%&9MD;E<-+p!CKCf{kTz3zWyz5 z6!4>WbYwz3FxU%6f9e+wu^UIX1E1fg6MH4=_eFt0C7ZB#26JZZQP5!#LPz|kcoVd` zlgnUc!1z14G5E#gjpM{yoVt^WzLb7wGNeQ0>~kTI-H!`XFFq-97%pIE;Uqvm`fF=H zZcKzdawWy}@VsK`jl5EJe{NuWnys82Z2-~k!*`hS0rpbkYqiDy_Y_|%?*sU$KX)&R z;qG_Q*DAS-S}tGS#odE1sl1!(rrz@@@=x&*6#0xs-pVk^yEBsr6Yl1Ep?$00pbr8~ zfnp$(Jl{WP!99tL!XWgBWc-00z?I;6Dn1p6z{}#yN9@8bE!`pP(%x(Qa`EU@ zYeD~pr9IS+o9B&^_1sYU;;qv-5AP6Oo&ZRFXXQ)gY++HZaq0J}Zt1fY&peg&OlU=b#Pu z6=D7+8(B0`ge(lMH4%<1^|Q2rmG^V)@Vxrkzfg1Oy(V-4%{QDkf=vmjYfX^`&CE_r z7|i;ZQ{fMjvrW!APcC69849zJbkTvS;QK=22u?*%QD}Uq3-?oIO}{uTa`g{u<%um?+=dZ*4|elf2!EANK~SJgLKx|4 znj;@HRxB#YKm3OaRIfWHs#vl&c-1-3 z$4t|L&l4O=bPgsG|GP5+o_>NGfD&H{659&ZB{u}!6a?B6RD;yK`Ir_G$8c%*?7T7b zO?HprqSf=Zco9f5D8E_#7LYxOKJ9Gi|0Mm!yeGMlir*@bKnf4S*(bRij}ho^W@SbN z!HGRP6rLCu(%c97u^j97&N@#vh@HK?R`-p$|gx zQyjIStCVQK)1Pmc`)UZ(>iSbNx-~3(iu0y-3$fpAntIL!h!KSOK3r&3#Aka}5or9~!LCLZiEiwuhI;ci1> z8=rGMR8J6GcviH>Q2)e1(sSa)-%~=5J8! zgk_c;AR4X`BN!NWm35gI6C9jdN+{QyeE`1yrKvzs?03B0g@_BcBX`S>pwNcxMv67B!ok zm8%C)u7}0%>f61eg(1VNZDB~Rs9cf$!XR<5p!R>?u40KC@P@2Mjs$@rtJsI&K9?iK zG5TXm5K4u7JG70GN_gURYF_UiN=p>-3VEV+1LFB~(DW0+K*;-_!xySt2fiTbb=151 zuWWi(&gOsRK+-5D%mjk!4c9TV{*9)XdG9J?=7FhHr04vY76|8`eT#4s+Cw_1F1#~{ z*h4`ua~gMN%Cdc;Lcnr-YQbWX$776+RKIy-BIl<*#o8P*q6*P5y9570e~86@&_DBk z3&jS8GO9-h!EryfpB&@mxVtbJ%dXQvbkZs@v-QJk(WR>Y|#wv zUYQxc{?Uv;@STa|yBbnvay?t8*~&F-lap{lJxv%<)tZxE9|&m~{&F}xi;ITsGdb_j zpMNEa`u$B*QR7QWWe%PYS;&Pdr6NsDHbftq5sYP>XfkeIF9xoX3PjaCsDLBZ*jokE z8T_CCUC%W5vw%xfEG|R2w`U(D&Ej%U|Ko2HOZ99TGy$~N{WPrPyJaaC4A&Sb8wSEZN_pc?3Th`wh>i1<+k)C3$PAqjTFfiPKl zCG30`{bXCHvEf~z8$u@eoX{Wt$@&=sj|=8gAFH}+VKCHAD)G8xJh5Ru@q`WaGdeLO zvl2aGBDyt2g51dsrp^_+&zuZ-BPJ5(DqlSvX&i(|@LebZC}1>t#Hr$i!MC6j6OM+q zA9_&25Xf98=-`KiXfseZD%zuk<^+@{J&YBF-$U|r;eBXR!p*`zR{fNFNQO|T`pMMJ zQv^cAmfU#edB~b?38kN8K)`#s1P09EVhV%OEd4Fe_w!s81%wP^u4$j=5yQ;FB^`sa;V zZWgmggk%AM`rVDd_v9DO;JY4#m|D)OJAAo&YYVEx$-?0Gm-IwVBiMoTxES66$#q|5<{>O7!!{3YeDmQ zyHL2Wfm1UdgSwJyC9B*8@s->NCcP+PddRAGE4jxR#W#x)J;E+fY~-R*%*vr+e1R5H zHsaq#K;E~>Axfo`fqO)Z^ra5??E$F%@31gPEjg}+2fn(FsKjVrOv_JqZN-KrL|m^H zxT}&~wreZ+ugVR+4r1nA2i7q66|WMn-4!!qVcfS^0YGb}YoPX3!AIVk&684v%kS9j z?Ug5{3QKom^!zY>0ORI-6y{Ao#iCzmc)*0w<*l63?~f_Aq~R}9cEj;lK1nIg%w|wJ zWWCKtz=5sY?Npn2pf;=dZElEcnN%)N^2HJ_uVtcUtog1irpUD18zV>hZCq$8`f-LW zDrL_yuo#9Xr3SuY4I>S>4}+Wq7`N2T;r-gt<|fTFhE+M2D4^OCOLV0GeO6)b5IKtj zxp0Otm*Be=qbFiWdVVEL+s?)KNI{cm5}L2DVrufc?bKgMdchJ0UOPBF^FCCrH@EV! zEknk92%K2J2OE6q+cQ3JWCs^Vbni;N7DgL*@1oWxAp(H~|q^z22ha46NdQPbYb2Y7vQPg038tgKv&?l_}peWflkbGt@GaHAJAUVoHmh@W8*_^C;u9=?do z=&`dyFh?SILg()}P4G_?t=OD9sN6xsEM!Ptm|{$v8aXCp!^`ABG`6%p&fItWsW4xcIz3SJa^m9!I#B@RaF zUhWH|$;2E!6q7q*+m{lPJ3)rh$KpslB~R!8qxWGw0%pl~Vd+QhJ(K(?Mfx|PNKm~j zBq_zwLxcjeg63->+q%#nX3bu%g(Gjw^Ys(Uy79TlAfZrkn*oUAv}-JL!Mm;wHn6DwSbT|=Xbz43MHj$rtUM0kmHpK{ds5rtYGSKE`+&cC?aI?Uvbg*h z=QfozE``ybUQQCjHYyRd83Cx<1k$9&ron?J0Z~d3Bp^!enfLA7K<2Jl%7oJ^~ol>&l_n}&|_PfOx54~B%<7UEAcpD#;>w38G>6<;rl zfHdCZEWjuo>sv1;zH!wl(*TI97efOSL`4n|F`>or_?`U7<)rke#!yTE(O@VhTC|~J zSd>W1TDt&v9O&DI@vmmGy1Y0fSceWA8u0Cj&E{01 zI#k6Iy*#O09|4P0yu-^puEJCt24KGvLZSMNVmYK5XUY8=YX&(~ZPEuDGF!)EEOkWy zPjn#$47D)RhsUmNI2pj}oS>~B98~MWBL_jWFMlt7qoO5#!x2tZ5X+}D=HRVReVkU` z)cW%21cm|iuf@YCKc1EwriV_Bfs#LIQO`~-Pjm*Y*g4?GlW1+#C?)E#GbSy9tMnxk zmc8Y?sfNsxrm+7J!1aRSmOQabT!7vHm7bENCovES6s2owFkU$zzYOFH$O|~-&2w%Q zs$qRwL;+Gw0)MY;j~Jrx6`P&+5T9=tljv_5}j(ffR;7yU~H6t?3@6d#io zA##TOx)RoR;=3x|n=6)HF?;fh1Qis|&M1rxFDzK-t*>k}zS2h6ZwcY7E= z0EsL0bxSN%hw&sQesp0Y;&tRiwza3f(?|0x6tohFHoB)N4mL;^=^gL|(;z(;%K|fF z5M&ppzDpi6MM7RU-iYSEb0DS7|6h=IgurN5K~6(A1lp=ul=4MNzX@=+Xgm&dQ6>%K z&7Ds?U{?rTRX|M|FCu3s^vSj4n7U8y-!r99=UqA!x^?{jOZ9P(cg(DTkx3{7Ttfn= zlbxhZU+Kbq@aMpPZ{g?SLz#Xw8J&D9@2H82?9bb4qLTaY@v@~1WcE8BtYB$#Oa^2R zy{K%dq6;-MYWtv^wWX)~r0@y&h|Dyegx!(`@~z;=*Swd92U^SQ-8}X>8*(HVhM!nFII$yhVO@ex3M*7?i3*hVdldoqm^93ndpU{%XM@*3{#` zHnm@$RBG8f$E+-4ZK~r9aGz# zdx@a#JeVg%-ssM=$FwkRFy9)bx&97X$W(C$-W+QadeJf_QixwPT8ZiJq6Y(E{B1l* zAN=n_IN^3`NxBN*c-3?&Ig~__Afze8Zvwd)GL9SM9+07akVw9SmQ`;#Wc5u*Hv{RI z4EG?dn%0P%<00z4zb7~{hx4;hsMNJ>iT$$LyV^p+Kw70jnnGhpzX7JgarglFhu!o! z=7p{J8Pd~;dT zo6BrBH#EH5hG`2&Usy_f!RVRZp)hI$UyX9kxva_7QQ1s&t^S;;X$&(x)I!|Vs+Jaq z9zhp%5IzhY&lo3B??FU;-AJBvMkfEr$3eeQ)Mv{1v5}y+8SSL#wKNJlBd1bqQ8NZB zn5gind(lL!_2}Qt#MNZB3p7rp;TRR|=x2_F@elJ0@Z}txkvd39Trp0zZyT)3 z?p=uzd=18hvXUR)7vvWp<|9l37X2Uyy4+9)3Lqk5ybTf zNPi_Fr07wsalQ`%`izwd0XK}@86JYGY-qMr#(sUqlhv@oX0dJEjSNl zV?+i_KU#o(S5mh^yn%D^Ro*tS=4BQE`;u*qYF@@ZC2H-b(ICPkZt2`Uk#ON@-k!v* zyMILtbb1B>E|#cWCX-vUKi!_m)jxw4#mnQC2S7mw)?3W)W`I6NCgs?ZA1w?4-*J49 zZ=*bHr*XWPhb38$QRDao8oE^CbUQu>-XF(L@_L_4rIkZ+8!T||Jzlb%24(ZDm0~uZ zBtD-RPc1M^e73^AJ1Q3jWE1-fa=!hjM6d zar)7PTIldBpG@B)0P6mm7m5{gGN+0;YFSNtmM2*G=2gJNiV^7FYtfS8TZbM zJZYh%T?l7h`}Jv+n+a!7}G%OI?f$@^MtL&8pH_S9ES%~*jj z?p0oD5O)r@d5~~hMZAer31e?~5+qI#dFArG;b5I0vIi-S!A1k=!o}|Jj7j`T#7fDn zrGXHUOB*U2{UVO$-t1id&Q9guiMk4hc8iq-ie4?+Aj+`ZI|~1?jUosYu~?Vuz+(8l zc~Ov+$9KV_C65Xvva=$OqVhr>Px?Wzg$n{aRhX~p$9Y1xd_GXEudp@E%h?$f@IXE< zb@~Ru#(bW%OVV~<(n*p$nG*Vh$$Wdo$0bM+`@VyZC-byYcXx=`OlvqYBc9R0yRY%{ z@w`$Y^tGvhlja3njv7YiQ#4}&9l!i0jZ|g7V~T~mH)+_!rPj#aQ+e7NNsFSUI2h5b zlC}@0Q4Vnq4F202Y7p*M(xBlFUlmZ`W5=;`jQf(UGgwUc8bX}x4n?oW(LX~z6oV*N zr++3uPt_OB`IKtblH9LZ%UsJhU$Z8rnC<0iQpp+6ay6;q%wDcGO)LVD3d@qeoJ(v2 z!^W+l9$3u-Q|Dk9*w)QgF(0%2X>eu^RZp4)RB@3iGNm}}8tZkyx`6MGc99xNEK77S zrijP(07LYkM4V6bWf4!t$z3X*g;|HLQ2F3YVz&-5@B>tnDd=s6V7zoqqlst`YGKR= zi~S)nhN{bR2CAf__NBBEd^_wF9%>p1Y5jVrp}v@3gpd9I3U!}Z^CKZ~+JVc)6Pv(a z%=%ypfhyn50^ly(vzJ98@Jna}(cym_hKcW?B3uso_xMm-H=Y_NG7;NCjA1p&Q!FKU z3U4vGg@!q;+@xI4IG08%H^uosq;fNVsZ+44?tRo=X=r#`V$>Vz#F|A?zr3~%boZFL zKw&v0Br3Ek7yYHsrY#raPYHxdv7eoVNgs&%nRHvI@*06E25LX1H?2;wNI5d%xCHdG z5SPy%^uL=UVRT;$Nh@MsdpeXKpQVG7%l=*9k|NdR4GT$-^iqoMBADeNSco%_lVa(p z#9`o4lp3k){|m?}%c(Ey0<>s0g%a2Ks{pBnPxy}+4_L60PgSj0;;GRySh>K!!VcdC zgW>z-N`*p`g`dc9x|9}MX+Gu0VbS}nPx(Zq7B+m!TRfk}zj{GUUiVe57dAY1`gP0AZOJQwOchf%SeKSPajpbvkHZ}>oxb%unocjP z;vYk(rjIEIgrQscd6?_i+EIwYRn20b0O_pn`#sHLbl%2)>G-p#jL4r;f1rO(+)n?z zBLS;A68G||OQqCpO$=$RL%mgE69f8FN~l`h3NzC9A#4e`JpeK{VH!y6W`L@_nDJ@c z#-J~-CPCyr-kW-3zQ6o=DsCRNU=4~6l&sL^~ALFky{`lCh&>PzUddEC%ADnSc$ zMt~FLdlM(ujA`QFvHeuPyMUN@)t{74youk52%?Dko49%RAjX0*KKu4S5_$^Q?HdHC zev_kM;UStz%_+IVr91`OdKziwFHaG&;F-hx7^E~DxfCsLp_vi`6-f_=$>w|`HVdyl zLW2&H)`_+VM;WOR3o{H#Pb_%D$|Kr5{R!mHQsU+bNp8^$Lu0vh`3yrKte9v~JBcd~ zwj<5R ze}!+r)KjH#q__vJR^d>BQKiuVUooAhx}cAzKvV_lf*4c-7j+HUk~FCr!Jh6vqTLq) zB?5X+OQG~jl{DMv)^tHS3n6Sr|A=?wOJ3F3`_}d|@ z?ZXf73H7HOPlz^O^n@sHp&NaIzx@fGkawQ%MVmF~tj+UO!xTmcG3rmgq7#;=09)}D zBr1ha`eUr~?K(gU4=V+wQ>mg%ik*hQOr=23TJtNP2wE%EMdy`*vo4~;HOrEOWEiEQ zj#;6VXNibQNEYH$e>l|8sAQovEK4TeDe@7>?2}YRz`n7fH*lOpu8%;5qD=RpX{GAp zR1sm(F4_c)@CT(Rak9ouRHJ90zy`Hzi0Zo$-Y#Idr|Ngat{h9lC2WKBH<68Rq8k1s zT%81)V+D;<8=xzApSxV3MhxNbxktqRzlrjH56Z_Rxs7r#pm4WIb*Pput{mx)LO)-D zl-QwL(c13v9l#IJ+e-#hyg(-2mjnzBf%*{PV(qO-5J=6NJK8(3lR#Pnno-iZ)UiZ{+`sCKBF1cT^>$Vwbo*RAcY-lk`N1TXa!P@ouAZ5D^m{nHBHU_A%E8($4$n}(_c$#zPx|S2 zh$9y_{#7orNk@2USL%7nFj3Gj!_*!==qkk9i_S3*$HHx&(B?99)zR;|T~Nn4oI?+G z#aCW9T?hvX;WiPcWg@guA4fG^RAIBB*3=Dlb`xk>dQqLJ6D*ixBE5sr-7i*1I5`|g zrgf)oA}(S`fV6Fb7L)(=loxFK7~Sis>bM#t>CU%0|l;M>!XFVu(fyktqTh5bkDlrs8ut9(#PH z=^^OaM|k_{KLO)Ef{k9J5v@&H&7$DbR0q+xlgYgV_2B&0BtLr+7YAl|+2^=+2hHt* zw=*e`l&+nMoI(tQih%87AvOx8bi2ZiavI3LRKl(Q9n?m_Y;IrJaEIV1!8z%Wk641E zgW3ujKD#)Zix0u^e739?j(BOfU$ECK1|+Eip_V_GXd65u&E|D9=i%U) zQu3gM4F|ovY}03s=wm?h2$DCBpve^u+DFjnN3_ObM>>OM^bDujE|B+;p!%ypG&tZT zG~PoTwuwVAq}CF|ny+ZDGMFrjmOG~B(AUX4GSNPwrs7!P9k%zEHk~`(AFEdA5317z zFWXR>RREcEd6PK%VciKb*T0-NTSECTAq<16WT26|l&LySBWW}s zPKk4V#y>=yKi+rsiF5u&QF6}TNc)p*k~0`r#8*`phPI-gXV`|DI|Pu8D5wCHro8EG z0u;x*O%e{;$Gk~J3XUJ!r0)*FA$@UFcs#D8ZFouuZAArghHdh&<9FD%O)0Vd5tMpT z+jf=-f4355m=1dg^Lj2d*@ZC*@E!C_zM9dfePb^+1nv7kmTf~+KpZTlFp zQ4b06vS|$Xd+S4@#Uex79%bp!D5J!s$z-xv)k8v)ads%UTS56aRQ)#TUGWQUpxL1+q+V+(=9@EPKt?rXXjRyao$L3Z&040{R9$86*x_E(|`Xb^^2NCD<+O#Z7-72q0Rj0#EJ0)E7E zyppk{X#UW#rIPtmV;ftF=1+9NT)X*mQ3(Q?KV)B=H15>Eu8d{u&YH533PY`r?p}s49XR3<3=GOkE(C2W723c>hC~cb}!V?38U)0>lAbq z7ZJz1*I~C42^tuxw#8ys1D!1D?^o0ca$iP|j2Pg-%}*4Kk_MFG{yHel7Y0C|S47_s z$KJ-POm^aeS6>mxfP+xTJvT2FcDy2pgG9r`L8A5eD<*B#=~slHo3w)aqy7!FGXBBY z{t%Hb>0$S2g*ImpGJ(j+BF(r$BY-rL3-x-zUdh!`v&C1ej%66qR?6q0wujla3?l8WS_~t}(U7<8#3+A5aO}hwT0nPV)Vz;XJ?XHb zfbt+V5FvHX5>#l(zcq_)%cz-!2K_IaWu3?}PQrBcn}I2$ftjkcyD=Cu6*uDI+_b_* zF<#o+wXBc^^a2KN!_CNrLKKuwvolr%=z8&L74P7#k`IM&e60VU!Xziyw2|2$vuxuk zT!_(w@YcTqDlOr$LV<+8T>woS331aY+XN~wSTDlq(jdVwo}FB(t5($&W55z0<0v(! z4cS+BUCM1mxWmdp1s+HRGF-o6y4BXNll9;MZP5l?tU|{nNlhr4Q;mqiHew(dq{f|@ z9;RDh9EgXdy%k0WJzO|X=|Qs)-LM|TlvhfN1qVI+QhB2t9S19DpqlhA;gT*Fj;{KN zp4MLbC|%ReI>+hHBU5C(6zHfFWttA1Ae(N*i58`cRHRb0H229sxNykiW9air8zv5F ze@({Og$Cg%d@))%%Ge2L>IPBXM3w$~Ry}#FQpnT${e8OM<0D+DGGc?;ERNQQeS;5)HWcYb(@UKWQEb`MjC|fU(Q3ZPAEW+qoz~(%akDR4T z3usPo!^e%dord4*zMv|g^b>(q{pdgh;dPk5OwtA~;x3rfl~n1}EE7nFo}QaQI`s6F zv<9^Aa^ZKR+@@0hCRQ%O3X0!PC}&(A7mi-GI)}W)g6o@TkV3J4lQ{z6oiAKK0}CTp zJ9HluN*AsmA{*Xcb5m5gCaTDA>dW&3t2)|PHc8jE9`|PXA{!#AsQ#3Uutpo?n;Gtu zKm4NQ@pZhJR36sNHnoGkf;rhPq|>U+WKv+wOf&JA(OM_dX!1;EGUl(O#vBOuY(hKj zHI&@aUML*>qLMo$7Wd8U+$4}OL0K=K#)TvWJg%Fa;n*Q4j`|~of_1SL7G`V~ zsk7!zb39Z^7np&^!ivp82!1QyLI**mW>|xu&o@+nABnS&Ata?eZ~qXT)61EGx;4CS}eMx877$d;XO zARTI@3x`9J4bv}NM9OI8UQLhFrK5#{#=}G+h%Px>`x~<`9Kqoc#O-!I*o{T5dz{I& z`ijX_wa;;KhX*8n=;Q%iABuH4lLw1ux+)Z_+UqzW4I_xx^l;ATy&iPy!U5f(+g^l3 z>6w0Th#2QHO_Q6*0*kA>4kut&*-%t!S-Z-T)yq!VviS_Vq&JZ2^0^Pf3a&bdX&MQjK$Un+>F+XU1U%!jOf*D)))|MD z#cO<^cH57sQ2pCf+?=)RuxgcJk02vJP<<~<_c8`WD{w?e)%FxEtoUBYWJZGj4?>Z= zCJ3jN)~%@xgN;96#MT1Jy@C#N9||1MlQShz3+!I3%)r{>y}|&7gD>|AEOQ#p?G=VG zxT9$w^{}7bCxl^U!^aTtpAcNQv0$Ijl8g|k+vOJtJNF4*s=^HFgQ z=pv3Z(J93hhAi1Rjz80iKO1;JNKliX?Uu10zt;-qz&-#|4q(^IoAA*AVUX9^K>Thn zGz=J`1@%Fpk1u)tyE69IJu1y(aQ{J}P1H-aav5*wz}WD(qqI#o*zz~NdfcR~XA ztyW+u0sOiL`qW|B&YO@~hevu7^6St}dlQ!6l}Hu0K-mEy0?c*7e-Mu8KVpt<1ltu# z$Mg(QcB9WD6I>SlD1`YsPjG>+eiYiZw~^6aN=DtqH^Q_isdrbhJ?PKr>U#fU!X1=) z_ByC1^B6MLW+*&{FZLi*924jqnueOrBZ~U&423>F2{EuM$V4hUuerAqtu;N2$IsWA zTybZ1H`bT1Fi;f8t~T8lgkRTFVP$z7;HV}IBrV-YqU+5K71-7Id@AwUEqCoYAJHX0 z)DgF7jMx|YUcd!K&Eu@PG0tFnJNIbvt||0<(g0F>?A{hzD1XId zpWaaQ3XZ{93Uwcu?1LLF5rxTq!z4vv8jaYdLr6)p4%uPuU-^ePjMfu_P{6T`zj6o)Fq5RG3XST+zmmoyjIgW5^B% zDBPOO+VfUQDoqm#Hd0ATcaVxB&9juIdF+Ee2AXu*MpF;zE+tP$ABC%a^SWX)5aP9^ z1;;r*f%{|5++m8hNAc>PFonplHkXw2$VnZpq2bwf46adq&4M$^t*?3Eu3tv8!roGm zn$3~B1q?HV$#4!Rrtv#LSueAHp($V5yr+E}3Iwm~KPAi@UjyLPH?*?ddJSpv3atd-|I+cyA`dq6Pm6rq=La58Nx3 z4tcLPGW}`NC;d?qi6P=RssyOqAOxwlBc9|sn&-rgIJ9dHSFz~eBJ@!NY)fejp^}S#&U=*Okhz3dB{D);Py-8;YP_7vTo?f;;1;XbP_E zo(8%HQDTUd(?x?Rifu^Q`7YN9j*c-kLP`QG986D$n2CahR?OW^!2yOAtjj^>>kTpaoI^?k*=j>WnC+Zq8oj$TWH9rK5n#0@R_ zR;KpKmc+WjPL}7OG?hZWD%C_Uden6-v+YqQo;fF7+~gV8c&2D90kq4?#j%KU^WW!^u@LvPv!i=$Hf^vlxRzS3 zxJ*jSqF>6Ha2gFE4w@$Rk-qj~X97nk>k@3)DwaBOQZT9U&syq=J(#Ac&g}jC@T&;HVN6uic3KI0XQ% zaacs@K`0<8A1PqvX*n$!*I;1e{nL%M^gQ*dsrfBEF2qGtUo|0)))PhIa3L;I^%*x7 z(kESePIB5=b1Aqu@2jcEH<8WCR~8sKJlQEQve8M-EaOOyEpHtstv(2X!q+Hkr>&rl zHcreSjy4X<7z@`uhE`(07+U#hF-)OAQdxSsaSToWrVBB&B5H8BrN(U68XPM~0W4FX=ZlN>#Tw~Ef;)|Dr zg>%HUd1@&y!Tnzg=TJkb87hIyxso`+{a>mL4wiC(M5uT<`V>_=*C+ORN!VPPPDqBx zMG{%>AQ8F+ZRWdIpnm_QbaFR>>GC8(4Lcf?U-!R59dWS#L&_d5lE~U7B(ihy6_Chv zWfhXRQ7`4aI<#ofy#-0!EaHJ#OXIGW%2LqP7#NseMy)j$q4H&8sHntis$p(y8B4QT zje+CkW>$;J*zlDu$=Jgyon-79_qj+|Z~Bj{qyo}5V7y2g>Q>(2o>zoYF)ea20 zMdlQZbIPwF8n61zDH>s;Ga9dh33L_MldeE@(_sFhi8vFlT{W0^(cagf$F_9 zz3gIvd*XIc{?HQ3RSxQPwGsw)I1|9N;bVI+28(>?`MhCUjmaO)ljdSAtyY=>V8d{1 z!*JQ+`@AuxVf^kZQ0LdN*2Io*jH|>#mwnU$x=ejg#XggxjOH`<5&qx-(`2N_x3UKn=>v-3ZDLUhp(t$q3YWmh3`dT~kNlN{NWXVO+F% zK5areQ9oV*=?pvOsAtCIG{8Jr)<)c}H4G}Y;d*_r@DUYA5h+-HM>CW4Ba?%c{h z#gWpThD}y+{VLfCo+JAp5bA@9l^z-rrQF#S)njn6H|SnpE?2+yg@SfWk%??)RzX(V z<0K1T^HQD`7I3D)`2Wo3%aWn+{`G3uHmQt+?JB-rcIi#)`qs-y<#W|3(*V^<3KClR zoRhq-BSZ=&1s!J_T1=uc`H{;>RHnvIOe!B548>$!YD2}c97r*VVDRP-c_0`JIfnL3 zTWNt$X~QHD43PHpn>HwvE-wxV*6BQ1Y+-EAHeTg3RK*i;Oe)t$z#!gQHj)9UtX+(9WmM)!bxD%HT9q{8-1o)$rh~6_;I`IgU zzGNB*B{^@ZA@ihZ3BrNal;23Sr5{$74B4}`D`DU%>SVY;TXghDR%Tg8==+O{H1+VW z|C2P;6J9(`rM@dP1*u3gw5Ng)RJlX`UnxO_!Q3;{1dyzoYqoT&)DJi2RtR1+s_sof zr2neeTp+meF%NQVQZVWh_?>pAn2%kBsK-WQxw7q&<}NP->xmW3V?QvER`7 z6k+hS?22x9sZkdpa`Rir=l?85I>I`InRKUJ#uzD$!h)?8jgbLm-eyXnu43YjDRW5& z5L>qVfII;QNr(d@YS%8ePY9~Je+8LoogQQe4HIYLdDtu6rP})@lgYB)m>cijP%@}^ zeoj1=FqVbc#*zNjU@|$Gw+i(`lwnZoInxg^L*{vr8Q5+QD62TT=Pw47jbD!I-)gr@*-wB5Q`kP5jWa%4am$nSb^>fiOpu@_-q5g>#8dx7< zj#Mpos5y4_+<56)+!74pe*SF@s2rmVgZz5kD#A};4 zcKwkLsjHUN1nZy)mDs*HlxxDAv)R`~-vnyVkW|q6P=;;6w$Lnx zx@a>ogHhF>VYSJuR@d!usG|LQAUnb=4f&_>Qu`pJOZg5>7m=$zZY%<&YnwiDdl`9c zNnIH1>}zpK`rn9PavqiC5|}<}0w(eL?}5qM*8CH0BCly@PEpO-CL^23J+aL&S>G}k z5@XFiOcvZ0Yo6uh(E>l08%k3=aM0qhSaXnP7JlF1PJFZ$AK)9n1-yyHCq;D|bT& zbGXm3YPyvhZ|`SFu9GoZc?AUehay6 zr2V!<@#ch%^M44`JZc-!E%gUtC!tvSj6bO;bGn>#-~Ef z?eB#vJ}r-+E5>I>|<&gfz z=s@V5Z2p9K8crsgiT9Lri}@k4<~`C-(U>-8;$`=~E7)kqEi>3?`%fLMdP8nC(^kDFZZ-GvB9LEG z2a9htkHlA%cQKPOQUT>#v@p1fgtb^`=n<)f30=&c{Rqes?I2s#1ras-yOxM3sW;I> z?7&mldJ_>*AFQ?^ssp)EP}6no*q}(yIRYCM_4j`n0<-QcRU*DdcQyC(bF7pn^j6;0 zJY2R@2Ks3W!+oSR@(A_Lz>f41383iJRG783ZA%Cbj}Cw(-ORNp*qtiip*qvzE3@wh zC;cLHkuF`XD-L6neIkSME`_1gXU_oIgV5M3pOj@GUU~X+7Ds>4-)s%Ze%{hm@%eim z(q;|X6{3E~63HxwP7hf+;nR{{ut=k0LLp(Kh4{+Y)6pLd3JoM|Fzd7qvCgpj_s|>} zoOsOA9lu!lA`Xx_gdHGwpZbhOeIIn*BeU~$Eez>nj>Wraq0ZZq2p1l=XjDs4Y)S1O zIIlMh#tmAbrXNZLqYZt`#K^gDA8i9kIy099L&m3=Ni#wSROMPC6`>TjkF2UlG5e8@ zXem^7RRivH){X);v1UiB4i4Oj@$nK>A+7$$(K~UVTO>RP&wOa^E)L-d#c$96h)#)3 zv=?qSlWrZu#;syR1*#9cCs)7oj@T!LOHbIh-+{aDF!xra*+x@)K=tnOd&Wm;_vDH2@e&$=~t`dK!8Nq2|HRK`WFE$~Gyhqz#y(B3q$3F!?PAV4(>-(9#JRU*8m>e`_ zDAX56;_8(C*RjR{lOGXUe{_8v(DXoP%0a4g$Qx=Ng`|T8RB@n*=H;LnNIkGiDc6fS z%eDQ)}>dgrlS1_#cCQ^PZZ=`;gZz=5TgA3Bj#nw_Kwr@B^5cEiFV z@0i)GbUuu~--$FnxI)s{|A3ipIZfo8cK!I;H@y9w{?uzJx%{^`h=meFa&2z#f&q7! zZ@a3ZYmtM_@<-e0?0-;nwIrg;0ZtDDr>*YfZ%M8Rk2#U&`&USw*PUBkgvJ#JuJ@b> zYOI~0ZeYRXA}HLJTjR2w2&4203FF@O?16HC!RBUUwnp9#F18 zmMwIU87(vwuWe-Jx=c&F*PPC*fvkOpbZEfUjhT=FwfA0U)7?E_xh?IUndU@63$BoY z_P#}}G%0oTkIiu%XxSVN&utP&7zO9H_Ckl!rID?@3&kKZ9od>KU7!c^_eQpEU+Nrj zZdBxS^+&c=e#EKa=p2j|V#UB*SEiJz-lfR4r!yg?$h{2O%(8#zd@fD>VO8%mIp6tr z|0U;htq4ywugUq=m%4Yp8-!{9eB+yNNLfr{pKdU%s+b<1#%{8f*zMJSA`m2jS*0l5{19HaiM#-=?r|iz2R9^Y-OV=_38lZcP6$bens6Y)!Oxt1lEbx_3>(!P)UZMB5yv@Iv)p3x8|J9ZGdc5y%i8 zJQi*wo2L%Hb>Iw?0-eNENOCQLrqa+R3;y6QCt96VV4LAzdak-tyYJJJ0N_bKAK zD!0ElDwcG`!FjEP6t6W`t2&(?(cx)Ze-qE|f=Htra3h=-MOsHPB+ixE+_xH^S0!HG zxc19mptyO_Mk|r0H9jp&l3CoUM81LK8`S%J9SjO@i@Omtol-nA4eC#IaP+^)T7TMg z7yL~J${BwPtsA)kd6^u@4KW3kfg%!VSLYiJB;KG$b4Mb*?m!qdD%Z7gk4LYg1SVK( zUh)L!EDry0iu<^_F`Op#7lODYg*Z*+g8TLqg#i^huQ_1ww}sC2_m>=S@IW}YX-}yp zH>Pgs+Esmf{auN_IIU}5lPbT-X~pY*-D#WWacW)UH9jpY@8O>0`bP`;1Nvb19k<6z z+N_4?v?i)(`$1)*GvY$!E1TZaN;?(d^7&3B_KU5F0 z_$uq>l3IQ*HUUc1QGu}jR&y};54I%Yi}xK&OUhpyZ0X3{XPEVA91~*D;D0@##BY8} zs2*(5`jMYUu=-PCZ%6%Li>2KSAzwDDZA z#8ab(q2Ws+V67?NTOrpFJtPBWFiy2tJI2z^XV!wKZZdCd()@K6SjSj;$Yv>_F5$Gc zC}X&fQcn9u00LJ|qu>p~4KM z(vRNAOOpjrPotJw2cw_1)FEA`K0{TXY#dd6>^M>NX{qW9^c0)e8a(cg^riiDQWF~- z9cPKpeVh%ltFPuYpEny!4^DMw1{-Yusa^B!B0GB8%f>`Aw8O=l4WU18wzOx)8%l2N zjLOxU4JWtOi~wEREdwF#2OpoJTJu02$+A10=gz*k7OC#k$8VzO5%|Z zuTbKJyh0O+hF2_7H%2Mc{%|}5PEN(1IGp>Lz=y-a|61<0H~AS>Zxu)F41>}gTjNQ4 zU(N2$!Ah1k{$-$**zkZU(ywugU)5yV;#c*mQ;Q!qF$H_Dxc;dkd2%G2SSoml8-<2J z)&xsDE*Y9J!D3r71kuxRojML+`uSj}2aCI(YA0ZWU*UOi?Nj=84!L`nDOln?59~fm zzsnj7wbLz0NRhZiC`P>x6rEbM=+#1wy$5>$*cnvuq`r=dr_&@F19xRBjq0=m{$w!? zMC6LH&fS#(i}5u7kAY4`@45u?{U5!Gq+rY0G;QS_8HB3x^j5c zuk^f*CDs$>iNLtb;l)vIl_wTm1sX`Ol4f!JuZ<_#4MJRI{k|v$GT*oK#s9Z0-JzN z`1_PVqc49XFf0<$k@efO8}U5pJ*{1#d^1(J%^l^QkDS=-X9t^I4mZgkUtcyWid`W0 zpZc07ouTc8f@bn-jRlQ$#gz*hRfB^*(}}DRuPK3EhTX2atZ@|x?#dd7{9KYPDQ`Iw z^JUI1ikh8Uu93P4*i}X*VP)+qYg1$@Rr`Njw6%p43TN0QMNqn{te2Dc+1F?|gf|)P znBz^y@+N;{8K64Z1ij*QbMgn6$E-P!x#yof;>CjL@`r`8DiN1@>t<(MUWS=(jDt3k zSeHE`9Ysm_6jppAp0(M-U28(s*I1JM7a@^Kz7NBe*oicHr!^VIM}DV-yltXtx$Nl% zKfk2^x@ZVMe%+bk}xHAgmkN;;Ky zbbC76BKq>URGFPlNi>UiePf88%N>+*<)-z&xMGc~j1KhF zbYF&3U4Ly}E}}J_1ODFDYtBXf3vD`1hBo;8A_(YdC4L~~s;I^LQOEu13K2r;87Ce0 z6FqXX6j;YxTYr#n)n6Tua#?NY3N?%m5ar?JDRS;PD=lTE9Cqx+KOa))0QC1SF9)gN z#ZLXEBb@ZIHmj_!A5p&JOq9h}Oq8lR2kTM1iPtv1@Z zBFq6`4RIU`bfMzKWmGg=Kk6)Urp`H6PMt@ZP^Wl(V^HT`oY7tCR2^<|M)CTFKBJ2S z8ri`?psGVI@!fT#(b>*4T6pC&daw!p#OoUae}8dCw`uf1lQW9fH}n}@q|vlqPBgmT z4I2I6HY=HZUC~bnf+0h#WOpi#N<9pR23Y-M-*`iEpJ*+dA7J(MD}H@9DT;_;*g3dt z2lLgPp(KqORA~dP!|kc&rcgEwif}EO%P_ zDrO!R^VG@xtb=4}EY4ScQ47{V)#!IGP-wBj&G94x5mhf-R!Y?!qj-q;s1R~EN}vv+u^ z@Ryhl?}3B!Q!}h&rfg=0m298T4Y87q$9mREdTeiWAhiQ|e`}~~K!WxCMT)UQ2u@0$ z{O^M2;lVC~hb84&cF3rHa4^*WE^yY|>mqP^s=mJzgOLya27`?S-}|f|AeZI5F)a%J z33!2@p{<>>6_-@C&?$7Dgrym_crWA(w}#5*?1c>ztb-Wy|FQSpfl*akyl`eREt!-F zGwC6j389xH^iGZnC?F&V2uh1$0TGCLu^}XYN{3LgP)ZUNMWh5lP!LE26#;=LB1#L2 zfS9v)0$#)dyx-pE%p@Qe(D%IWeeZpLojGSt*?X1!>RZ)*UC&O~XH{2mcfEtrq*CqQGq-l-BKV1btS2M_n2t zJY2fBL1q&Sdf--^lT`CTZAMvrR^6(52*Dp;9>M=QT;6@{U9<(x*ZOr!T!rc ze%Q_2%wJSPVZ>{1TopC>H}(PD6}Yb&t;K%bklfGRqAw`z`9HDd19Sg2YrgnB zSo0rqZ;>_sG5&v=RsClwhvTqTNVXpQ6OPdx*;hG6lWVK?YFifG1i&<8QZ-81drOp} znTqQtm*)Y2hLNX_`TBgXIs1Z56FBz}_T@^X%U0D5LU3aOKu>%Io5vp>xW&XcuDw0%VT1 z8ToTcZn@a>A&?4wTJEO7Z+Mj_kf{-W`!LnA zl&dkmK(|TLN&VaUwF2ir=5#U+yT6gu-G)Z^{rNY@sPt*6c}t~|nmQ;-n3kiL!tg#z zF$wD9I2*scb0oHk!*a{cFK=$U@*Ozj&fMK}JV9-V#b=|eA;X>2(5*JYS%9v~rj4Ct zq4a|CAy8;fbYA!{6+aSUr8JLPm%0>G<-Ytg!W4`^gpaC}o-f}h7kyH0#v+$2tHvUC zRq=ous0JHz-h@VncW3_S7N)_8l$NuMJLgbVYD<@Oj{sH094ZN{GX`+TY1}f4Qr?y# zqvYg-BgO;8lyP`!l11+Pb`Rx#fNk>DQD))zDD6@o%3V5BWX>CoE{rzrD5k>9-1a`6 z>Dj+faJr1AcXz?TaQv&p(5V}ZGF3!KiY4y3nUp6Oj=k?fhoG!0VFY!r2-ret!a_SUmeGQv62^ zEtv-L{aa>V>eBJIP=fqfL6d6cmY~U-*&v@(!NOB~Q>1FfM@mY|Ie4|cBt2hX#m&;d zuv&oO%&h-181f3Mz%aM)Z-L?CDliC=pu2Z!tm*~?emz)7_H<^Z28>_J0E{{RZD4#} zjV3<(do;1*8esI=|M!70M+e5o0vPYlyoxgZc`mo}px20%YvIPx|G@26&s#tLTYTYt z&o%a-d-fxR}7ft`K;yRIDV1ISqfyGq_ zFX1=k`PZAXp@_z$whXua`xvHtXxe{y%EK=F)hW}`U#h8|+vNQJ*1A44Rip8b#Kg0& zo_O_y$p7Vvw@7me*>Xl}$0_vB&1XmnQT1hht0W(|wF>o8_0i7%7AUfHP|OyfSU&YC z8u-US5&Hflf1fJ8VUj=1VX|;ZrnKGK@(n&ac-z zMZfx0siptO@(ukDQ~E2W%cd%t%}m)1H*TzYYbkwcaq3MR94Sl6Z);rf(ls8Ag7`gk<*vS#G&{jj#$$qp=>&YVOWH)c4%p_IpVE(5v zS$Keec@`P0_F$TkBvR88$f z__l^LrqxZ^%YT7y{)ahfIJ@=g-@x~(W+#;&?fhl}|IZ11f0OatFcg&-`cd^*RIx7> zYT1xZ8x4+;JPZLWu+c!NCkJ^lq5Bb{j=VM z-fE`s=(bdE#ln8KY7Ua{wDX(dr+O*<|8o3fYBTsNs90Myjm)8IZk6##eKE3cRk7IL zoXU0NcJ;)Jl+zPzjt{Yhk_~?C45GpA`t04*v%e~G1HE{<31=^=nxMp!c78KFX{`P0 z`~J7i@G3msWSVQLO>>BPGe^EQy?=H!iRKhThO4*UoPsKbRpWQ7<%DjAr~g7kLZ8D` z$ha|oqopINO=Q(AO+@2w|9p7iwey;dEwb;Hp7*~hyl{&vYGpN26P2{u`AsqPkLrUm zbaJD)U4_1ztfhCZo*)ewtD*A-+OD>svY(dx;)HYJ5o2*NW&QM7lBKx#3z2nb=sdH5 z;VH@p&yR{0SNbUaTEjVGj9qV2xA-HPk#eHkDpF)PgF0o+i>ePJ~SN(9qeRN88cV zR`%43!q@grQUBD12JzBnlsr`p#EV0zaPpG+dG*VY>KS}GAaI2QxXkc2JPnG{&Lu^a zOjR4;2?yomPN;{usWxPFr>wi^qR%I(c0>BcQ7@=g5lsGn4d`QTKNwGgCaNMS@h`%g zY66TRC0YXe?JE9sV_*XfXkpkaXDt2SN$0Dp)A`DOg3gy;L+9H0Ezr3S^v1k~RJ?IW zE2@~L&NbvvX>q?u>Sf+zp@QkE%Q$Bnd2(mQ)0*4Av{>|3(q+?C(MsCr?Qf}bn;W%~ zHY@&eE$a<6bxvjVajMDNsA%Jw>Yb!><^@F3mU{LOnjJVkByho0i?U;~S=nr$%28ci zRGc%-n!j{&kikNSW~j^baV7<7L-d%?do-)X!%ixmsXB*0q}cw_SY>XTx9xR+@6rF% z{L`!i%E@68?PsZNE!tRV+${Aiv^Y(gtu{kb@cy&a6*%*sqjv0`f${0xw9y^Z4|-1yL3wVlymq{8`XYK_wyzVK66*>0rHJ4_zCQcz4M z=c_FpV(fd7Fw^9bxRPTU7pOzh4 zq_%l#2KYuotA``$^*l8T*TYHe7_$7OeGm!D4Q{J4|D}DDNosA+!%8g;rj{6e;#TFu zO{L!ZmT#iBNOhYZ!S|CWGi+(NanB~o?OZ30u8``nzxYBSJd0kKt1ObwWVPtz5j~p zwtjayS}{2K(eYQ*2IjH2wTbrTE~Dy3QJYuQ`yiO+zp9EY>5sjtitVJ`i_~TSbW`$# zIh{0ok(vO=PFPbz zCN2g!iee6bw>T&t3lc3CBHJ!O<(GR09(W7km3y^;qw>C%u$I}JU09|{Pz zMMP27>tJI4*NN_%%8~yG(H;2K)gpwBFV{r*t%~mBZ>yokiYrv{wmQj(RNumBOQM0D z)I%5Uj7DeU{g-$7*~9&SKGO(Lo1vc3q)fR?6)V(!Kvc$40d;8aw?A7$ZMb8`aetvc z`Y9_<)1-IQbYs!)lso>sxH0GP=VOe&@1oS57dz04E7ftPqThG}UVNwV0I%=6B?Cz{%*(XbZ+4G&Z52Gtp?u~&Hy*lWfH)oplWQPDAji}r8rVix>0 zW0)b1COFQA5r3|!EmVlW3E&T(Trny2!5K?8s0|Eb>5mQSi$HExZ){qz>-nZB_8`eg z3=W~&SK3EAsqEznGmV+tG(qnqjK9e9$74=%PpJr@Wo)V=Azca4n1snE|9?CvVYlB; z@pI6LpTBm}lkcl8Bz9-ygoIOi=9->V;53FCE|cK{^(AA)Wb*8JDvtJL2U{!^leH?W z57g%1y8eoR!Y;nyqRSts$;Pq@O5OzMt)lsx)X^Au*p7=){vwSwVY50Pihp)aD_0O8 zXOr^~e;nAX-X^iKCeL4a)9lEWU6f5b{2YBLWZB!1WLrJMNsoM}MoOA_)2zH)5ChuG*I3RA(0jZc&}aic(70qCQ|;Wuc60w=3X|&WT37ae2<$ z@w9b|YVqnY{=!Dd`89&Z?3xxx4F5op(bWd8teQPk zhQI9l55-}31OdVX%DAXXsT5zL4#bC^FOlLeuS8&P(TUffhIIT$4Z=U&KT=ct&rJT3 z#($*NGGyeZf1L>Oo^v6{R_oS!6FH*k5W(j*JoyfU*WT&^jW+cB1<~~@_%-1oV#6R2E!7{`B;6{%4Pt< zjzMJjM19JCjX|NJY26}d)+d05KfUvbdY7cTV`k;+$p*);yiYY|5c{b*982CrSK9m> zPK!TP`+z4@ekynZ_1mdV!P)VhYR4o^)mmtPfQPDu!3>q75722l#O-oC47J9`4dk8R z2AQ8pWy^v>>aaSEoF1Eu8OBg1|D;cd5Pc$LqT!=h(YTeHmElw_7>_9F!3h)9Acz! zMu!rmH9ANN+lu1d?61l zzEE4>zsJ5%N8#}87iwo5++V7<<1kD+EdLS&Isl#8LGTYyr8tb<71`$cRslDhZ>a5;-c35pC~m;D$=WjWY={pcaJ8)jMW8+8zXA4rZvKh`GqDH*6P z`Q|FOi&=Kx9Cunc%QFjqR07|Wx`S2JR+Oe=E7bgNwXlofy;BWvk0I@pDAl>TWWKQV z8NFnFgyA(>+vR9IN?%nFhl+Y*0}2VN89>GF<<`K0I8g?CWm0O5>5=4kZiboSPhgQk zarcL1`1A=iUhI2hq7(aU9jW5shr+4i@t6?$?Zkfoepa(HAJe1XtKk~(6KKizu!sKl z0l&u&s;Kc@^uu3=I~_fxyIY!{Y7n@r%H48{aJPmCK6Qpsk2C60faCJu%qa5z5ds$} z4_`bQN$!n{&2^pNm{m;_&BbGvM3VU>xlV<&>IwR7( zo=D9IfTdwmc3h;5Kgv~UIIA`dnO9*+_Va7!=fF57RgiL4t!o%ZnFl=$Y5rL?4eZWL zWv{`6EI+Hh4=80sZFbW8KdC9<*i}U1zha)E6v|bP z_4_=J65;5VpS%uRUr|r4MjD77=HMq|Y3Tb{#&2`UjG`)#K7;kP6k{!ZvJRB1=KVah zq(Ze}xw+VC@R+@FOS!h7G;5KeQ=rP|`KpW{xnIGU)36;=rtJ#M_!@ajsZDf}A zAt}n-ShFAW-uo!$^rK>=u+FfRRyY{loPndTvc73^JC(h!CQ$l0wH#}+sNt_s)b~7M zG5)mRJa|KwZor(^$Z#|Wum>`M$m5BVXoCeT@ z#{DKm@rK{<*t>helwdq|E8HAp}+Xz3FIUFzrn$mAMwk8JCv zb(ho#EQ?*2AitlZA1O~7IBm5_edy1!KSFfV$T4t7XEnW9DGeOrK|HC`0(X|Kf+zRp* z?*v6RCX0o&1qmw_=JApBa0?S!;)l2vR7KI-{mAj=<1V^nVQnmeTz9~nJ`c07mz4$h zXnTm2rGO^qSXnQ;qRh&KBGb^u;;cIPQcoLejXPep$vZOsxCDt}V=aQyl|8zn3Ja6Q zSedKU=bEERaD-=-&-H(OjQz&c7-gzwoMY7Yf`S88dzCPK*9NdS(C6L&<}o}&6#;A@ zMtXOk9O=S9Ru9a+B#=!tr7H*gu>Y4vg@WF`$}c?`2Loo6oi)a+Dj)j}+eF%#sKyQp zVhx}JACe9_Xqex~&taMMrJ+I0W63uHV94-IjBwGSAm%i_^ad3Lu_lH}Iv#|#9i-r3 z7He7l<8D7;EVG?`^Rt)L0jU@FGnptqm|aEzxeF zp>u=DF@yzyB-g&2=A;k9Ss%J`-?<V<72E!m?laT0p4$Q@B%_%w03@NfO9;P&UOjs zjt?^d)*6(XRS5)*I2TA251qRmnWyqP%&+R;RwSfdRgmsSJc0=sX^*@vxMLg2jn3Q# zDF^j^&Ta(wr~tXq8E(hgj@0=@CTl?)U%1T55yV#1GZ5j%4lqMZV=!mipI z#Y7Z1*5@foq;B`e3Ls~%ZL9&2I*edKv8hRgAAaJbbj$?JAaEHU}K`t*$X}_-G&OngVp3O8kj=dq`ABEpF zfiJFCMy{C>YO-{wu48JlB*S`IP?L2sm07V2avycOsJtetAwpB7pUjG<_;}_Ep{;uV zNFw!!XEwNW%o-=P=^DZfT{`+EdtR50zEbe0rd=pv|2chQI?bhH(=;ypL1`Zxfv>eo zKMVaB&q6GM_}2bRm*QDxs9}1POMep-b{W!wTk9(toWNQ~y!5geATa|ZK^=`34FHH) z`C~J!Okn7%l;?&}`-)=StWNNyc_z0=1vy|C;n+z%-K?K!y>NwPZf_JpbF$9c=o2?f z0Ww3V@)X!XkcZ^}!?Qe0IF}s6C-h06T^?}8bUKfN`P5;f<8yK+GPn8V53Kl^S*JxL z)huZf;BNxQ%a|S?9rPj7A_pijVdOb-ZXmSR?-Pvn?NoZ=Gba^{32#Q}wZM0NC(mNm zkd|)e;g%xdH{49)%$3azt7)ydG7bm(4*s~~`?mrhaFk2ug&`qq%*w_O;VsL~$#vOt z2^&P}{pSMx{T<+AAM+=%KrQ)U6KV)}Yr* zLpioe!SZzQ`&OP=XL;3pG!b;vRv8GscV$hgmz7H?DboO39lSfOiwVX-zC3hqD$B4=d*m9?QRnUF`p3s}5Q*9Bt? ztb7r83Daa#r^#h;boBdkV#ylpl_C(9{TUaBum-F%?h7Z+BRqkcymKy^R@Iqh!$0Z2 zFL2S2U0lSJ;PWo?A4HCQ(a}^q&p(*DHDsr-dQuy)dnD`fqoH%VxM)cuEUID(iYsWV+l>SS4aQ=q_lMDhPp(*SVEa>1=HWz0Fsce`Wd_8^ep-tuB zui1eaWA+XH@IlIGDhHq4R3Cf|Qo`P@8vA`9H79vq>j$s!3^|)Id4EfmVa)!BR<~pc##JBFzLqRGc+zPLIE7j8-JM3taU-5Fy(?Cg!Lgo_ zTe1Ft;gnV^1BY*0N%rrdqNIKCl+c>lERri2=tNXzBwZO^*9J@VN?@yaGuADb!kE_V zw%~&wn3XW){X8ukx~(<=d3vAGU)=*&BO2@Qqt3Ov)auAlun8v+fnQQc#;(bB7vmhgrHKu=ez}x##la4IGe(ZaH#f1fK zhOd^-~jS~M+ku_($-W6iKYKTczfC0J&9!E!l` z)i$i9B!xAy7yO&eo3px&%Ap-bB@V2p z;-T&?I;t=`GzK#`$ccm@&b-^0&9umXU_<4(I^i@o=Ddqq+{VJJ-yDF4050^qZ)1%e z0#9@G0pZa|Doqs&`8F1Uk*&OqHL~tJV^!+m8^>>hgc?h~-Nq8cYh$VCabq|&y`9Bl z(iyk2nuZ7RD_*G$q5k6S5aj8!;&!lzbUJ-IIuw0zSY2XVlDIMJ2qN&HaI<1WatXdP z@2L8oJol%JeNA2dqSkZRF}0JiY$}yE3W=gE$JEfs@|TODZ3Icf*s7StT7rKZzS{dN zk<^e5hmh^K+SKqFwL307%sDUCjiivmdRCiaR3^{0I#$!P<09)dKl4`)_*k!J`kCqb zT}9bY@*Z%w?Tf*JuHxmKqC!LT1nq5)$LK zP}+ioaQD;RJf4tixam%z{roVC{?&ywbx$;SnXYyl6a?Saz(TjDiZR`EE_J308zPrM z!R5x$H0)&K2yl?9t$`7H&Z6?)){-M~P{(fV#I z&6sVZ3*BJw%%-I7tf!B5p6$*y;ac+^tgHV3rAEHz! z%zTg%?}i~Tjz--L!XHQT#aRZG-OYyjUfi`Odj~H*-;;^BL91S@rcL8hV5KK+UxmTX zeAH@DG&N>?FIEeQ6&4UUm^1<@LwDm`or&MPiLJB`>1<5 z`0@it$_ZN+6B(EwDM|3V{H0yu4Uu&J09HF(>c!B%u6h$4ONSn|&!~7P!yV?N?ino5 z^0EORNTgH~K0YdgB?HE_C}-OVC*7ZYC6tmUX9dul+ObypA_E|W!0#F_hk=4zna{abrX_ce_y5~ z%`q#6tj>vsU}G&qA~FMJm_4Q-e_fXa^%ec(Zb?PyaFF%v2XnKO?(e6I#fG{}pVf~I z0wFZgM55_l@c49UelM%txZBA9IR2xZjJ)^Co`UD1$fhFO2VaRQ`|v7XVb{4kYX zx|dB9dTJBOsZ|k9p%?5ns^4EuyMKQswz*u^A4@8o%KNkCkTsqGu*Cb)UfWOvE(WlA z*HDZ*U}yxrGXU^*PJis)2m7kmjj z7j}III$l~~BR<4y*K5)~bSM*gusMHUk0{XMVwm#RlYCX?z0V{1AI$rNKFu_5R3__S zKf5bJiI#S|jS@zki>J|N&k4J|uun4=^%zkZL+*%56S;@8UbOcl7ve6EisMIm=l3YwlgP(| z<=6>_Pd*{XFxJxeas=HujHTftp_Kc28ARwX&8P7Ydl-+ey*R~1(;s5B9RlhnZ&}i1$vL+FrY^bsP)uUO8oc!gg$u}ZHP3{bBET0mw1f(lC){PxM!5;26*F9NoL$*V`+{lvArXx|eOvqzp_{|fA_wAQ9&rxTB{?)2u9 z%pq-zHl!G5BdKT~ymbRcvIipCYE#wLhtgJiDws+~vKH6jL$M9p>GzBHPdhK@^cc3~-W%9!+vOKB|8(?NeB6=br=fQ~xg#?pj;Nn!~Y z%esL|ipkLNXBX8RQ<+4w#j9xI)`N5-<=l0Ig5m0XLmJ%4{)Bh-~@UP7IT zYj4T| ztTTJ!!^%$meLkc6dO!;NO!IsT?;v}Y#mH!aU?rWNV*$1|S4S$_{jhY>pMzI#EWPj? zn-0hK9zV)RW*%z%JgbY-&;2xeyi@ShB%1v^3&6F#`n5IBOSl|;9_~eqYD54emvCI-qd&k^r_x?n_h&whSTi9$}A!9M$0K6$821 ztkbnfJC@BN5+7EM>G<+yia~t+$%`IEO>$U(MG*CIAYpVFOc)TgXF#2XG$DuCtuOD3 zlIBxxjzrkj9Eq^+5Q}Mk-b14%G7+ixo-+GFN^QFjvFT3(FV>*#6IleVpVY2bOq4i_ zpTvepC@l3tVd^AS7k1j(Nvz3j$Ja#y@s55m${Bs!ntA}3{-{ma=olM=-`c|R{drc0 zhhq_WCbK(0DnI#A<~<>Zg-(X4m#&oi(c00-0{C|Hxp3-rCff@40^B*1;p=%oVKRc^ zuqs@`8~lj?1*hB^$0M%xDVC&H^xe4RMGRQCxB5$aE1b$+V)sJFYW*_1(=Mcas_yKW z{<3uT=rs~SUJxkWmY$?%Cyq%!jyfc6*;D`9BEAbp4Sx~wJFkG-7`fB z87qZ-)6+>apX4I2m^)Sa)&s~hjXCM_&ap|9{S+6PO~N!LJan1U*dx|)i8hgrLGFKn zFi%cneWMP%Dtz6r_1uoP5(8Tr`@4goiNdv;F`d;9@hU+BF<@vvQ>G)93GL_5be4u! zhJDsO(j?P~%1o#R>ptTuL4x4#adOOLwIM@ny7jAtNCXO2%#bor+MyyoK-1XU*!tT5O;VSY!DBK|@WDU1g~>luAU+ z>o7wZN!R>w9Txn_A2(xxG^)2Okp8%%3s`i*pV+BXUo>-BC@?1$w2q`kc`O^gl2v)^ zPMDJy^4OzvYB>w94>!G1c2>9fM5YI9zHB6mxRI#zhY3AeG+PfuyqH)^TlPn#2-Sl{ zE3wEDsU$=y2NSftinH`AfjevWMF$A&%W7BH5}LM<^)Sx=kPatMJmL)4*4OkiJy>BL8zxqAxkR^$DT6i`X5;5@b0iJ<<_&njwaUt{vKd9B&}B z_v<2X7#X8@!kA;A?DKG!;+Wg_u#0vsX8j#`a{`ooRgnoKvtJXL5GhWT7q&TR_YyW# z+GD=Bgo8T#8%h|`5SL0vrB%xzPq^T-)T&1%V(D>Ye?n*06LfAInpll{4Ugnk%%}%x z?8s;(Q_8&o3Xi=iFcDZSFfpb8ie5i@p@1b=y>SUdDLh6*BoLpdjsJcs5K4C5+vi-= zpb*&(B0}VLvN}|Bk=2sS!SKWgRDl$N1;~&@ICXkW{w{f!MbM~UrH9`|W700vq{FYt zXTr%51P5*O>&yWe5TS)6#lJ;A<9q9CL*`Ed8+-lpTpEP&!q-1%Jvo>a(29rHsUi@R~No zUpe`sZvh}fudUxjSc_r-{7g}ABgp^`jvx_;3#TJXD?+Itx-tr0#Vn`D9g2SuN{4X; zbLp=2{M45l8xmxQt>X$7UB7yW4S56p-ogj41(_Ko7dlvogTj8V7ezyjm3F!-rm{w~ z7VN&pA%z>msItQ0q!TOPXx&Hg?;vZ#tDY(EXx@2)sd5+{xB0+je@S*q4mRjBW`b?hM4Qt5iO7we$lJ#f!)^y7Q1ZIHmvB(GMO zyg{=EGd8dhxbMRaGW98Cqx6QreNKiGXPmThqjb2$zwZM+LijT8okqMblSuR|QEyZo ze`@NlybnnvMej3_L{j>`X5vd;W%~e$NuQ|>ks?AVA0P(Vk8(ah+-2KTw_=86XN4EK z^6mjn+WG-hkAC!T@#pu5x*Fx5!P=jX?qo64V-pg8`qA)BU~Wf#@mJ#U%GsM(Lj*an zV)ApIsgFg6cuf?Y-Gmq!EaY+f;pny1bkL)lSsh%My;KF%tE#TUe@u^(-%}S8u`O z5!m`{i-cyotrFI2w(78kV|oorZC7n%Vboz86Sba8wp|zCu?=f#8ih86~nZ#!ws+&d8iQN&%Mv;&)m;FlumF{IvUQ#|5pcwF>Jpk5_xFi^9)M8`%gji$WF z=v~9>0ZR8KB?gnhRx?H*CO$y;fznWtm`*Il&ohVxIaO3G6VhCq@Yg~34&47`h8zAU-iWjOG7`E zg1)JSwm%8_YAYrxxS1Di0Dd#7c>itbF7&RRF#7pZ))JWnR;4)=?qtr;7TW!azDOuz zC-mcfv}7li#nI_n&erywkclhl(oP8OvDDx*=~!&5aV7zByXLC_$dT(PS<|30Mt4K?PL1Rep*g z(%`03yV-m&rlJAoB51U$(oJjkuvoibN=8D%fwO|I;#c}vv)M=6i^i$yMM1#>&Nb8 zq8er8UKvNK*vlqM@jv*E3Iy*fhFfU=#{+|Do1ta^cEZq-Kft$X+dfH;hW$*GCW9G0 z_E;44+7Cslkp8uwJp_t4ydN=*3<@k|Yb-y;NO7GyKFdj8l(LT4lriiJ)==at<$N|K zKEEQap23%}bgUjIDEkXm0|`rdP}l1Tx?#eS9`5xfEO`?Zu9vW6&}~F1QAEPh?_aRC z0Rj(5{!k9mHrwKGI_6I{y8lbe=~K%2lGXQ)))6IWLHo=-m{*hx5JjT_aZ_tQX}UQc zQlhVBOg9<0%zE$+JjVB^hI}!;^aCu?h~w}BtgS^GC%t_DhTNyb4^$hPWOY?Ti?2R3 z8N|cT^aSc#gsHn~vV9cyb%wU}D{W|Be^oWK$b+o2=~D-Se5q06T{Qlwz#6pei7jRq zT+C=wti$;mKS#C!b@!$IsJ>Wtko{^rja2b7uOT+@RA5+S9r@+z4;&T`Q2E!e<389J zbO_F#;I)ZZ5vCFFBsk!@?(z-mlU4zPEX$Nu3sJsulgAJQWE+rgWKt^5_*7PDvsK9S zv6i^YjtHG@wQbl)-+sg1gt?XTE!5t0`r%u-H0mFghsU+U+QX9m&ufPkN8q*t>(vg6 zw8LKQU^ps+{B^WL_oFhjSJ}3oGk?WH4Gf`ntq@@dSfNeiot18)n~8T?qvI)lpF?6s&Z?r^Mg z7=3t(^#_j&q4fICCs9SyidehPwS=HtPCOX3_^n6G|hPP>4&N0$S<8Jvi=vn&KTXu4;wnzWQ@ zTsBZXY`+#~5tp4vgU^DWXV44H&()@-XQAf7Ym}D|1s4tTVE7g-5%&JP#}aA8PoM@= zR(C=}i~V^C50R=}NTY;K!2x=&yLRkM5G zIkBSZb7mpEgy)PGX47(&H8NiOhz_bOx#^**WqrVe;JsYdfyi6gBVK5b;rBpci5@Z` zWfbA}1JsJK(Fxff8{Kw*YKNal{=$!W>$PaB3%_Ttr;iyT`Qzx{j5SNzxy34K#SFq} zx@(J7HX5$s7J>ahw*}W6B5$_`XD^bOvG6(~YvzD=I-*1kUoR7OFur~S)4^k6Izbf( zZp#O(S3h9Y9{?o057@*5Gb&hJ*M^PQX|$fPeWFNQvyDK_%ubs~U4unk!9p|x8JOtYAzvVavM;fjI19P#3+C+b8ngFbmc=$zdEQ>lQ!{4eeK2Mx z*m-n-?w5c?mC|@uRfh2ImtoZIM0rGA7*n;bKt8Xej4RA-)oUT>nJdx`vcR^@O-JnD zQVsrSfY#RmD))j$T;%KrQ$c%*STKjzmuz>=yqpLsPO0=z_C1vdGA#Imw+-K0BxA_N zMpzqG(FNSBlonBU1FwapJlep=Vv?r}Tm;C&v_zv0Mt)bV$~==|aSQ_Q5KGIQC|Ia_ zL}Gy3FIK@TMJ^G&ZRGWX1emvYZP#N)E~-)T{P{?{_HlpyFL*m$lv;5PR&*d&Xkd#9 zo1QfhD8t>zhfPMR6J261ni9y7LSW*ewju&HWLzYf?7WU1OY?!hwVlT`)G{Q{lm?Mv z-LBTE;;WgqS0O^GqOw9_mYH9Lh-f-y<~Hk@B_3(os%9=+3>__8xCQh~Fc;ks#2={< zCqe8B`sD=C8!c&i$1S^jU z`Kib%+YgCw|H&e%VdJ$?pyE$yPabtq!V3$vp#8lzF3hO{8}BTEzugP`N}Ct>LxXi= z8C`osVoG*^L_}>`yA@0^IFJiFbWk9l2|(AS{MA4IM?j0BGQG8eR|^Iq{E5y*QCT6# zU4)jU*$MiN4i!ljA_QOYxC1I7)f)f+Yzy$uE5_8fwBy zbE1nL3+6)ljtv$!&_}`iO%T=a5dJa_l_C5I5b&^2-cCYcpBD=6gi0t77Pz3nwhsO; z9Eu!VEb7QGJ`?E+tu*8X(u9v6tWE7Nv#@Jv3`;zYLTYf~YuA$n}n6)s>!f@_^17N#2ETSL6c~AMwVed1YB6!`9 zwIXZLn~Y$m)OdK%W<>A+>!;sYl~lZCafE!!R&iKFWf8oS^@IvD6kMcEB<~LmZ$czr zA>aI?_suP$bBk2cGc8rh=_&hGtM#Mxij|Cv?B#y3TAkM*N( zJc=D3|1Jv5?j%{Fd7}0G!`ijvXnE}(T$8K(E2c;lFNG;cFP2APyPn;#Jkg$yKea5QGWi$<#c{i(NWlGs zyx{oG`<}NjMZAZUINn;j<9qE(C%tzpz#ZDlPHJD;9LH;FxBie>>F`7f`yX)< zW$`t+sB%2my}y-Z7+ z@`LS}6b}fgzq<7?l#{{DT|uh;O?Rl{B)t%iIsbdENfhJbO-$ZGTjPP9v9vQ@4(V(> zkHc6hMQg`dA>Kmv&8seU|nyMEROp?tH+JG`H@ zZ&xI6JBa9y1fHnq1B+2E=)|Z6n?Q)a=&u%e5x-pf=S6*3$cq@_mSg`_jNK_pBY)HW zLl9p1jn+k+*=TuZXnQ?+=f2wl_%`ziP((++}^^=qhI5>EKm?^b`2hR2+J`apFV+Q(u9GU-H06kHgX9urKgqP8zu~!Qfy*{!g#ns^n za-qP3p%n~ut;0pZkgh*fhMAM zcFBnLu%hFdnrTd3L7jQIXvMRVA+f)peK-w{M5v@@eR-i?ef|t2Mqz#4)VOmyeN~?)7(acNaxk#Okpv=a1Mo>jV zx#&)K0-RK*5f}O1eH(F+(Qrsp0AupQzKVjlY}1&FGO1Yo^m&}(rsa+Ke58SQXab3u zK_554Ob(UMuT3zMIfWFH%tbN9y~%u#1TZv_3&)+bCz;0v94e84_$eqvu01ru6r^l; zjRI46JNPWSr0~YUua#Tf0hmphuoNjfg(nFs%R{;D)seIZF%jf`5IC-$0V!yVxc z-2)AC+Ti#Y+Bl`R;F03q4z!{b7xlxXJ=(%M)rz+_;eQ*IwB`|1w&C2}G_JK&q66|P zn`6Wy<1;OO{AWfPTVUj!As&>|2LV`~R4@`3N{$VEX*AY~38 z(IWqNMzW|7%vWAb7G?I?NS+JsB!l`v^iIRdn$)5bZ(}H<(Vch?hXBX{ZxqN3AD1Vv zwo|J>`>qogwey*)_X3?=cpuuFCZX@3LdQMm`IN?cV)->uBsePjfG?#j1k(3(<=$lc ztH9AvwtLgS;q~hKk{P^izG|?E4$x}1M0)4w+cX{A2P4{c8%C)`q(+j|?=qjm-n zwF|tR`=WMc@SMVxlby+?&WWbr{~WbLKDy9!^{5?^(^D_?OrrU>b5RcW`R!7rHKVe| z5ZK*Gjyw1hfOiZ{xQlz!(FN;`6-g5^k0KEyqZw6V;fHpX##2UT{-C75!(Iw3?yM>G zAilwr)`g2C^Sir93M}cu9|Hd}gZmWzgs!+9yGmh~C<^{Ou#b71uG?1!vM_6|ZFhS; z(9)1QQ8fGr-kwBjJ7`(>Uf9-^UeVfAdOJ@D_A)O~ELX=j`4ItirC9(EA-!;yq&@V% z^-i5G-^B%Yt50E_d8=wE>D{|=k-qqPH=ZTIaMB9~cXuwz`?_@JjjWqzT9pRS@}BLE zwLO+z!9f(!rN}13XjrrRRDyKS^@nRX+tto+ACB8k(U0AEJf#kTQ6Ad^7E~_H>H*Z{ z(x*LmBl$7r{n(WrytW03y%|x%?s$85Eox{|W*)a9ky)gLw$PTFCc)81NP6f|EF+-M z()*vU$PfiI5*mKcf9BuKTVd+0MOrBGH7EA8(NA~tG_27^J-MhkZ>uGY4(urv@n?H- z(OjcF<#@)S0d-Fxr7ynGfs}!k@T-$TD>eiVq;$I@jQaQD2Zg#)Q8pUpdpfUa7?+<} zHy*iNdpk|E(8P2;#gMVlp21%f9_HNM{4Tp#<$75j{m@&=a$T9Jma^c}Qs7dqdk;@_ zBfNN3y8w59R$3?W5+Ob;lr=foMQnP%V0z^qDH%#aV`?2Gq!i^5FcwLY8gZ(-%4~c+0_le5PRw4Z9bpOs6IH z@&*vpJMZN?ApK|d=lzA)Ki!|-o+fL%w15xFx-4E-v%lgi%tH0AaJ8Z^%jCAm!Yl-Q z&>>ha$r>?$XB*f1Q}O%bBPp*I0vOKwczt}d!+rAGWABq@d^l}==#>cCe;-UGM1Jdz zit@K$4Ya(Ucg6Ym`*}TY;5|CO6cwJ4G-v#Nv&k_UyrS^YHj!HMBgX)6iV~dKC5uqB z(2rvvz}A=eyzY@y5#cgZ`au4tQm;r?1T7i}8~H)nFc1smJ{lA0lEuZ919`sTCCVMd zHzKJo-+sO!JvEp=XZ@tof*Slm^zXs^uG_YqHK7`GQ0GLyU}KQk?zW+Q1Dw@}Ro|It zj#cKpilTh&Z$l8g*Wz!u#?UP{R;hU3ibmLjD0>JGw-%i-$&eXZa8w zRQn*lfudRY4R3XwNy(o0r5|jn)@bLTT+I2B+(R+?y_7bT*YT`2dFwrWsn#+n86r?* zSczsX_3Vbo(B&t0`PDc2weoKbWG*~OtA_GshVSSE-eFvA$`7^HHAGNCCO4b#5E7Oz zBsr;FChs3~{?!0wtDciZ`I#EeEy?5}e=)317o>EoSFP0f0X_g1N(V#xj%`tanD+zx z4q3)vC(oE*TzrrtYo0Phyl3fyyrIs3k%^@>!~Oa}urc(&9h&7Www8ZE)UVl55#{UR z@(6VtrinAz2DhwbMKsMC265(%Vl5d4qX_AU!+2GyV%S4mrYbgj2;b;O10Ld9&l41E z={-*(XzfE>#HrA}QndDI{IJv#QPiw=%1xx{4@<_36jX6Zw2`5G4@=D;icYjY4=dzh zsPIVQeuRsv%VCd5?gXhOG8?wN*s~kWdG`ML6!|FMYFQ^-2Y!?=sCIPzR(DN9P~LDp z4l2GuZ$m@F`909Oej3heIRyM?Rhg?s*?PwAFH%jKgMCB$YCnRDwxj4|k|jIONKE7` z?}<_F>T9Cun?nMq?PC~K22FSj{H=F>W_mKv(5ooeLcfKgB(L2_Zm&X!*5aqnNG@WE zy7uIYo_QrAu;VZK=Dj*nw)hdwWpG+r}(y-^2kg!;9R*&A~NAcF5qcog`K5#CA znm^7(7K-Rmnwz@R87gulg!=Yxl$<*u$#NgpaTVmlRaNI78=Zfgr^ABKoBP?w(TOEc zT7~MMaih2sXh6>&;l&Qs5xF%s$=5OiS@Dn6aZ=sUyeaMo%QrOe2T(?jhD<<5(K9TO z){I6-QVTi?3}%qyc$Y9r9>c%8x|W+N#=qvI+p^%2Tt~CAcvrhXnpb9&W$|h`DWTWo zq#P0f1PF~zl0TZ@d@4zCz*V zY@@R0cnl>!&n@_1%jbD3EQ3+c^KJN0lX1Ld9cZ4KR-#oI1Y7mwmTKa~fa=JU1>;<_ zbQ}-x3aOe}p?Ifeui3Pg)BDHq&VMRxO3Lg_X7p2!(6ZiwDbkGY25RA~LtyK<)x(_}Q%-d+tttMQWejcuX%3Lt5-eevT6@%pIiT$K{lWGDTmjL+-VH5RR7Z} zfD6qjf=7iQPx+LV{^|-AZZ%^f-2Ko3@ z{-@4$Ju}b6Qud4riy7M&z_)PA-CZtao@*4WHJ?X@0-lwfUSjQO0LJUcM6QhsZKh*H z{X~ZsR}JuPE#VJ^$VCZCB>w(jI&W-QDXga;ttm`Z)=bHW`BBtx1{X~(L#SXLmxU9t zbZmxHF+!_#go&RiIXTKJ9!HaylwTq7mNYsq>JGxlGYKKnoSD4my@xN#Sgoe5g5r?Q z<%fW+L8zmj<3Ge|p~(7+SZ?*d-u@LWspMZi64P4Ki^!zt8Y6A^HnVtiO2IU-lX9Y^ zrJvXlV&OCqr%ViPojf&Q&UTpJ_))aoBS7sqnd4Rr~#XE!bhIY5);i_2_N`S-gK_F4WhvyR5Rs&QEitzJs{B&tYJu zRiE4$OLxyh2s)jX&XZC-(dRM{KHgg5tOePl&I{i`l12uT=kvA+RrvGDEgG;7jK93HWbyiE*5sjWN|45Mwq!4evfQ#JcIwU*2KeYgUOBj<2cps}yM09Zh zZ|)E)b+%VYHKUA8c*3Yx9{2V~ln5CB$kz8E0lhCs`otReFd-}kGivUo)8?_Myaw$i zo{6U#-2y%uYP=8>j_`kDjj(Qrlz=9>>){b9Tc{fqq69kS6(Ho5;u^AfK&Mx9grr;t zA$Qtkl|HB|9efk3RMcS{XB_2j>k>f^Edmcm5#l1=QNld03g)e3J0@a_xag^LX%XB( zM|PqT5PT6;X8O61=h> z-Ma+OjiqOnaF1{*m3SjkAIXRmlo{+{_+Yw=N|*4~)~~=~U@VhkDR)_QUPKL-%9-?D zig>Z07zk;tVd=`HGD>=2DesF9HOS|lq@oL9O1SVReWFLq^gWTR%BNZc%z`-N=zMsB z7SW7+F6z-gL;bb4>tx6-d6$$&NJgW=jV-S!6fW9o$F4G2k!TCkB07rZ7Vs-JtwYm7 zgYFVqSIDQ-eH|Pz3>+~i7zt%4dLH3zv(Q;o7Z{Yu<;Z??ETjis<8>Qt#O6fI9jbZ)??8E5*OgW3Ap7r@f9Bds%i+ zu*hM*?i=;5;l=Y_=e2x5-|{-|AvJcRriy;Df=7vl@jCmq3HEIO`=%amAhaRs*!{(g zE}HxX?+i}8>ka99Gt;+k@z#{EOlE1;TgKZ8r7&YTPw>x~<4<{3N#h!Iw}_C%*K@GJaRwfgo=Iqt^5T@>8=Kg)W-;CKu(i zZ@kHy`#y^gX`h|8oCi_DTRgB?`4rJZR6x2wd>x>ET^vtN@fWhm)yjXNcN9`I%gu*6 z7-vU`5d=~8TL^v~pe=97G>SuS$xp^Eul7m2$oI)8|4R5hMy^1czE76(8pfA?q;Hq= zdZtpNur@~p#?i62cWMoF9hBSYWHhCnoF7W}zRkOVp`lhkFMZdpxmrk!CQuCi1VTC{0gj{apc(mE2qUfZ~4UV{}%S;?a%vZIAn;Gzds!UEHo%$qA=Ib_h+E9F}PSK$C(-YN-> z>{Sro@@qBe)GB!SU=**G_uamlPr!ZKR|AL{d29INqWpaH8ZLIZt3{nw@z!=N0ZBOf zlW1rRx;JfkGz!f{*C1bI9XW~+I2BysptlJ8;Uej5t*f!}YN z0g!asHv~G%vB7mwcKPf%8-+ADcPIV!+i;PBbmd*?yicK$O;$AgZ*VS=ve!w~4DDLP zrGj;s7>YgC@wTDse|JdF`wT&k*euJo9!mE(YP}xrw~HY(biK^qdV4(={m9hyh+<&l z*7tbEpAc8_9*@R z^ZmY`_x=6%@CTcjotd5c-0hU>TqnYq19tdpjXAJbp96IBQv?XJ$X1L9)+Dl@Z688U z6yr6rXjZX<>)}T4CYK%sAC{J7P5`1GL>y$4m+d)Qitmq+aZ+ z#!Ev8?Rg~0yZ=}E4l~TT7nrm_|3hAgzEhZqA^VMY#Le9Ih*u#aB;hkhIA?~m{>+i) z&Z7@RyOTe2G{gI%XxVu2Ob8wR%rRKJZw`L}V>~yrj z*f~liCF6tX>79=HQk=(_*aX~;J010yO6}rKMA`T3qI)w%T(`g&4!p_eAn zpk0ob$mw_Ct1Wkl4}L$&jsNhL5OE)6+ALbK3*M#!bY+*Lh8wK5<9N5<9uJ|o-P~n` zMI)o&8#>K?d_GO5R2M>CV&Gpmnhm@k&>3wl=#Q7-7pz-pfru5|SA zY3{C25H3>5!rP$%9*PccG82(6QNTvfp?Q}$QmO>qJC$HuKS?i_I1;4wSxR|FFN8+@ z!}io+PQ2OEi4sTTgN7$qhWpU!{TJ)dgwHXo|0C1ztZ8O~a#g0`c^hoXsfyI(|1u3@ z3#*io{Qr(=m~;R3)uq(dIWZLfyK4&N2iJ_m${JXm_BL_%rkl4u^rBUV96bPo#Zpuq zgWBb=gHv9!+|GiyF{f1`y>(c^bvD0P9u$GBg9ICV)fuCd73f|3m2VxH=x$$4Ck{Il zAMV$+rXCu5L=SIdwH8q{;E1CqHW3$!%SQ5MPer6r{wYTQ`HqrSiz|U=ufI*lDY(LP zoN<(W>*RaP>2zSqa!HqerMrlzZxDRL7-a*+iAvDdB3!5gNaa27t8Z!}n2u9-IB*z$ z@3Bf@{3$&|0C^sl0e0oMBhLGk_u`cpz#R~0qSR~@&Y5x?*b`K1I4;c>4|p6(ji0>y*z_*Uq zus}vp-U$HJFMKPVG0{3hVf1%$vj_jZDL2Z*DJ+ZwzH<~~d-&cGQpi3Xo> zw3BlD%#`E0GkP%H18!jN4@bxO>nt-?RDRPF+uhDOx`Uk8!-OSxM#g&>jB%cdu1r}K zGiCjyvrykB;NlvT`yn8~o6bU0UryW4O8CT`vvL7XJLecGUt){-5(`Jw1Y5#6-E&gW zk@e0Srn!tMRSf>s`uVzgHG^H2+yV5fAir(t%>LY_6X-i#z#Z0<|!F3z@X(vZEiyP)l0*^@m|p{fZ+1sD)NlGMSuiw~t`c1)rx;mO_^nIZ8>!-;zY3>hl{`kUO+8~TJ{on{UqH3LWhGb^!3Zy@N09;@Twg1u4SvL7= zv&r4Tr- zm(XE_@}L8q27^p`2Ko*qov%AMeLK{M#6cnq*9fDiQ1P-&UuXET`aerM zA%e<6MRVHpvs^^(Vx|S}d4f;{-%5wUp+~M!-Wa)%?x92%WXf$#RM(SI;6pnqhO#JJX zXsK5X5RwVKLa2!YwrekX!Qn`^6jQOo@kr1+yCj$ux7uA2Eb$=>Zng`@EGf}5rbOQn zQliGHWUmss{e$hQ)gRMO0tVH7N>Cj&u@2e*x60br8^L$gF%qj^DrMZ72*sTF1Dwu5 zs-wxN)tCm}cGRZvn)Ir?q&eDS1U02a>#$Yty6zaE=Qs0c11WL#?~Zhv4wvHDG`C!i zjicpK(k%8=*YNOCp)h0DTi;8|Cms^eo zJZsv}&M(s;qxewBU~zs$^yGZT|3#U0#E3-2N&=GCk5 zl6PkHT}M-$LPdfxFWq%Sx$6`vbpNg+F7@AdQ%uv%gkXMayjd6}xb%#ok@qk{`_eo2 z;2xSlC+wx<*ec*%p(&tdxp=;0*k%-}U0en~oLzcD@ZLHt#SXv^QF5MsktQYvt zx2@}T@)=rg5kcnPKUnbf-||YTZ^ii)`ZX_DaejvW_Z~j~j{djJMbwbpfq;SD9j#o1 z?2f)Jg7L!#T?F%@UN)sm_LmaF=t)=6Q4Yc@wD2$B?LT*w7dLYg|LC4q+yr;eRpSA{ z|3mj&tLUDaZg`VQ-4pJyd20fKC4H%fyGUiavwU~KGF|`t3(fWv?7BSSDe41Da>r9VD%Y4&b3*pAi5dwnD8hJIET(4WsC08( z;bptz94)hn#z+u2Y!iu=S>&(@o;KyxsOW4@6jB&FHp$CKQ{gRVs+Wj%gOC1JwL*1F zj3vZ1M7es2wtI{H{-&J>KFm6j}Sj_<1Y{lT^4jSME%!^kgG@M0PsDrVxNFjR0N@SBtxhURylosft%=q=}+loEz~=uBm~ z1q`GByiE=h3f$g%!bJPVnaawF*LU_PA`8Cg&mS+j%aneu-UGVJAbecC#6?%Na0sMF zxafs7w2}ixtt-B0;o;R=Y_V?H#Q-W zV{#~ia2dRDqPk!}^~XS9jzTf`B)J~7O%hCCIwMJN9f?mUbqW%s4kd{g9DPc{dt5Nx z$9K3SrH0_7;umX(7xAIikhl9K%fYpyu;iCGhRY?3aPTtQl${nT`K~sc-pQg~6))b| zWGn(tl21)J$r{wuCz*1n>p;5l?pTlF^)uO`= z*jH$Ijsc5%{_^nPZ)3>4j%bZb7S%<}6ih638dgWVW<459S^X~0p`P1C94)JhrTGrs z8(0p?&UzvVe_K8iPvB#IJu%pN$68ogoQNEc4IL7}uUTKT#VL}ME9*NX`q4A>MbGNf zoFHyz^wCVfu_|6LCqemnwZ3@Tes?)iV@&TLQch^vQ4|Om+d#K_ zN6s#4h;?VU;-j0+&WN{JI#ga~z-YcBcwYC;4YWk1$!h(Ws9Ict5sAN2=i3WQ-E&u~)>}^qduTqX7BAB?y8k z#kHp-fvJuoP((Sa96j2Ys~i>XT^SA)c6A9{U#2664XTn71YzE8Ec!_~BQseih(tju z3P{TdcW(koK$|ng+!rEC{Q^~gj(-j>*|sKv>pyum6$}p=(^PQjr)cQoc&2|dVW!(S z#n}$$Do`Cxf73(7xw@IqGeI!$yeI1Q7z}|{P^r2paZA;fpt)==80yNWO{v4S_@er6b>J@Q7le>oflnc zE#-wIF80@PG#GT_NWM?Q3t?MoBTPt@(|@z86G(jwKPXi92lBNlIc_A0V;fP$DL1;a zXb>P{!oaLaSQUN~^Cz@CNKO<610P--B(>w0+oC-aoTWrONwgPF(&%HL{X~fPS@~(_W^IO3Fwz6uh{6;sji?Yx0gs48I(Ed-i00_00x10g zLR5PdEHqi<*G|q=^+gEl!*;?1xI3i;A8-`iYbO{oWH=R^S*{Op{)QWj7;thyAR(35 z10=c{4$X)l_K&iB3ce0yd>O6_r4yY+tg}?e1e`*xEpXtIe;4tT;go>(Km$9-ffYfA zyTB=Nxr3}b7D;|xMQx)*2371*5y6*OM=Dqs*W zIYnNlhYmBImlpm_B?;; zIIHfsQE^uh?DzY6ozVkjjudS@o$U&%Yf_?BXY{Dw`2ZvN>J}~vZGfe)(W8O^R|6gu zZRI$1Mk?NY^daLkz}G-Dp<22HQnVEAMtQ_xng>TOy3?ER)?y^5=qZTs-FBA~ydgIe zA;ZNauSB z#=W)BPf0KAy|8kBo5{bCNs*a?vFJTB1*eR)2Ji5WFyAyDat2~mr+s@Ma9E5|0vjye zyl$Fo(l7TC)h#bj$&~ycZ)u&?f)0FmG41RHGh!Q+^%Cp>0>3k`)HfHg(- zg)X~=hW8bZ$kx?1TtmfuW$PAYs7C9U;tM|1Kl=&^v9NQ9Ig)lxUC&PAtjDFDvN1Cf z0DPZ|>B;7HpJ^tj8i97?02+k^(du9wT`}Yd=r@@(?Fqrz8KHD!pm>qm^pi~qqs&1f z-B_zYt3wO>$*Ur0p^JYcmGu)`WG<3Qek=%~nErz6kB;qcv?ax8%bxy%=>!aHX4OPJ z&e|$mN|pi8bEi}40GNAO)Ng>`3Jzcu&5Q&|FPfyo^w}Fltp*CtK*a7mMAWAIfwG5Q zA1K#?Ljwh;-}e|K2WB#LbMbFV#|FtUSyO-Mg+t-#x!B?o&+S^+p1~|tW3cGrF->1O z==s5-k?e~m#`}LfSib)Qy#5kbE{7ez|BQvSJXa+6>wtY1OnDEKh@DPJ*+SyGJrR#d zXulEcdf8IbH*hU2hl?a9@KNGhrXzvIC`sf?>XV{{w;nxVMx#pL7GIPh(${F5uRyqX zaEJI;hCLQ;4o<<+RXbPIkWDi4VEX0CCN>vqB#Sx=M8*Pj<(kN*t@JBrOC19 z&2@q#b1*!h+?!~7Wy&2n4$-AN4%7AC+%r^+$2e>_OmvowPBZ%Pm0{8;@VVh8sS0A6 zgpPb;kq2!YB|@=Mi%1N|zlOo&nMEYOiFZhogD94$GXkp)_&c-n$5ivV);S|oNG4`U;z0P+VkZin@<{l?~Ao#P@3X3j=!P31yT4X>( z8DoT5_l1>Xkgf%DVwM+@iBZ>L{TR_AwD=45Td)Z6UoHMGex!Xn-5DcVIaimou_DTi z%g2nRfn!A*%a`=lSa|m`>F2Rx0Gw_e$BFh;GM7A+%an7wI@E%3aIhSso8t`c8&^H_ zR7wpQ_(X!<@d58!gYhEGvYkeahnK7meL5cQya)4=-19^YcmwL?NpC=pJlz{GZPjxj zG&N830@BJ;`3Y#IPz>*1@R{HW#@H^>a7)h>XnXO)ra7?+X7fRP~i8+UOm*&?c+Fg-%32!nm3!9F~tL zYm(puX;fyfLyaekB=(74z{u<1^%#&Z;=$FxOeg`Z=Sd4aFC-wEw&aTn3mrpp%0Lf0qv`UVTp3~5s@O9)(!zk`cG)-Eh$9tjPP0oGPyS+3`jDoznPM2OX0DoKb zZBECg%dIAWks@ID+?v!u|1>D8IowEEK8ncxjJeHuq+N=4pPiJ=pT5C-aAG!yZT3EkdSv69^ku@zcpY8vtM|U(O4?WYEU528sA1ocA(Ro8)Rk6W z?v_k{&Jw#gW6a*YI{bLYUl%>308vjs&noyo;9O?z!>rqL08;T+18MT>s1^QI8c<(% z=ST^c`m5FdwM00~AA_~(e^0zD>xBo;gA)@q_U4HS3=-E1Hz<`&*5CgCx^2| z=uJ6<1eQ)qgd*Eg$7svqC9*9>+W5oTvZ<6#FTvd2R99^h)&b8`RMk zsiX=aE7b+t)@OuOj612W(Xby$Hq4ml4{O-<>r`u*s1pqYNQAD5>sP^Rq0{IC1wvz& zVR!3AWy?fMyiv5Xf7tsNQ_&=9^>KZ+X&rCM)h@20Pi*m~sX#gJTtTTPuyWAfAJ=C` z-R8GMS9&}CC64ezo_G=vla3dP3%)s8yD+)+P&#|FfKlQ8*}gPv z0|E|NGNKknB^yMZwUXf+%(Jk97`eTLj)tzmT-@ub!=WBzIuMqO8 zQ67(_a9Yz&plGX6o^B?SoVfXFoUz=d-U#hQ@m>2yqYRh`w7wbVjPMTm*Whk-veySK z(7}4Jz$=G&ed+RNVxh;{a+w)V6Lug1aFsUi5J?_)X3D%xy0AmEU`{4CodBusPSMA{ zZH-O2RuOY_{|~X<#`O12sW2*~C>LFCmvsNm-6hp?b(d7nU*26=J$FWMk?H@w=3YbR zE=Lpr6fC|@Z~DVxkG?wZJBK)U5IZx<&3GkWH2{KFTsJxnq~)S z6$d3NqP!m17VUE=zDHOHwb&~HFpawIHKLP7{{P&)@OB~E_~Mmd%9(q~hf-GLc(P(@ zrztZJdQ(P;)P901MR@Z|q(2mf&X~&}F+IbjK|a)2d)QMVhWoIPZx}+R)X#Ox#|-Go zxOopKB&osRSwd8oDftoM0NTh%jIZ|QQ z4W`pX#raxQ%YfJd6IIT zXzok>4v2G3=8WP;zZP*8DNi#Yp9Vh<>Wp~@buhxRgMvBG-3|$6&9Dr54bh!LA`9yJ zl|#U~^rBIRof1SrF?VTg7ax`eq+#bc2d2AWZOiMhMBhCuScrR%`55qm6X(LCsm~Gk z*CDhc#*%B(GwJspk%K7ps8k-k>BOQe&{<3ZJMWPpGNQZZs8pgX$3$<-mg2t0M3O~L zMl*^nN3FW*4dCC7>upGXG^t=qQ60q`S+pAoIyzf43IfL7?Y!9g_ojKmDBI0Gx3 zCo{@;>Q?yeGxD*~XGOh)?Z4W2C&pd%%qReuAVK+KRp#suR1UADr_aJw$rsc|0Vx=T zE6xf}?>)cR6^p#BfjsN4=YLq0-?4l#nfr;eqJd>o!8sA{{qDsCS>w?SF$(!&ZO@4? zrZIOznumPk*mIcB#v^I+In3la_v679#J}1^zvQ!X!YgKz#YtwV2P0wA$Kw3)A ziAa_z;*eZ_Yi{D-J`{hRQ7lyVJX$=2vd+W9nMu!{7m0|lwALGJrGPz-Ae#(5!qJym zyyLuh-(m#lGK|EB{EINmi|EUX;&tb4)%y}$AY175OTbbA7<5U*+drET&S~wD&8zt% zl>E^Qx^YQ_<4d>85*(#mme8=LE{nQYO5CVnM)eT-=rX+1Tj=6t`55~ZJm$zNl^?VF z70S3GAJgxOe9Y1-@-aKFh!H-ohAPJ16bM?DX}O`)u@tb)EPA6<^l?36hw5bi0hq)4 zr6P)ouhXil&^9wE@S50&1>c6PD(~WB z!F2AL;Pm!(-vd3CMaAEXKJ1wF`$0$9DL;sIogYeV>4oyUm8dOc(IZe>qC}DT(@ttj z_SL41Obnp7pF}SWy5jAukx6lydj1- zwV1;<|9)Ni@W~b2>U#O2Ven`VIM$@<6UZ58H!NLDobDD zA^-B!FXU5eMs&pe%f9ofDv>4M(Jq0t8)a^VXqd!7Bt#TAh?EfRtt|P@%LpIEw6KEm zLk}OdQAKjdv7_c!(GPxAgI21dW~lC5%joFq$4Y#M1g6^9d5O-cA}Qegn|d&yi4n9p zK>nKOsRt7DzGh>nM9OUon{zk3^^;kC2F_~!EUk0wE=t^x1q_6Qxc3)sLE{_x6iqaRV0(% zxQ!4c+#5+`DfbN}`)zLz`un!%U^+u;P)Q%u>&gBdxDUpNCNo6zL2BOOdB2O@7Vi&M z+mtxNht>B_>BBPc!%m!!k;}%8#_z7tvOlroPN%(p8s0eg8ds)ckKm?Y2u0C!2-4K88o9}VA zTD59-y{pCJ=o9CW9Y^oZrz?MpaQQftAlP;RMISqd`cwQ}5san)^!)nok?;mOE9cR` zyW(lLNr@KMsTBLXBck})T@h==GH9O}8n!e-t!XJ*s;CVxIF{zA?b<%L4jN;F%aA+Q zK@2lvY+#7WH3;L}AoyLXs#9U$vLv(mHhr9 z!&GI?<$^%91$KJh!jh~cOH&#jsB(P7PaXnT9H=r*V^^TcUt56nxlD>Ll0-FmrjawwbE9!4nUC5c?5)q@@!74|L z;zCqC%;NgMLheIH-$fTq4N+U6cibv1={??)NyhF(e*w%>KU8ICl?RoCfNOgEt!Dyg z^~b2EkbfG5FF1gNX6*=7IW5Mfmw0jV;mZ11DDuLw4R5{J-Rdy49dvT#k!wl+~d$=c+?s9|~&KWD*4L18$>Jg!i#0zYX zK;QI{1lBbw*W!Xp&&6J?n#r6a7kSBzLdxc@$c#3YN^j~CsYX^xjr8; z1Hycm=uqJdDPAfqWlw|fAIVIm+d2fh8^QkEVhPd`_zM5#S2XzjviHO*({ zdK+le49hKb0AMgTqE%Vq!=9+-&}d6bFBca~oDnf9dk+FS&H;O13|=9NI>f46I?k0W z!SloD*I3o8(RZBTDLgac;?!hNe4jY-gz0>dU%_uMDM^i>sd1=JID$%Pd1l}LEBkKH1Z6ICux=uekF$_k-|wbV|&Iu(YC1oPTSZG+(5 zfLL`T$|b1`rwt%`ZMBWTU{SfP(RKA8zrF?p>h_;ApTI1bS4jk1&}0=P;VhWP4X3gs z)zjl-LAYciyql!z1qe|eh*{M$YN%XHBb0WJLxej1IY+FKIKc?hFj>-sen}e1Vo;Lh z_Weq-+5!oEJCoIJcJ6Iw{Sp*4EKFT(fq#2+JyoWyaF_c_8e~bKiGD{YaB8ADf_!Sp zrpGv?#PRd|S}GUE%w5;fsO|DEV<5V&9vsx=68}HTCBo@h8$k<`8X2x7=g6R2k$l@m~sD&$1bb>)%)whYvLp@DVff|yLDk4-V^Wv<2r zklP1!RZbPSQ&;UFN6tBO7eu1naFpY+$$Z51NMdftX$cAzTfuk~n?k`43u)>B?NKJHp(aQ~` zkeX8Wu5dQlQq?X}B9~2x3{F+0KMF-Xs7|aS&R>URx+uHwYxVGJ#i=TLq`t!k`%YR> z!j z+CQb5*y@8f;}yLUp$YVKkBoOu@O5TTu6vb#TjugElYg$}v|cge82L0+Q~C@C^8Fw0 zJEP*B3p4n3zNcM2{*7;LUCXdZ+>g_1&8&kjP23m1=$DmVG;edm1Uk@Ejd8{UZZuW9 zql#dwW@=9l!(&DZo2kukZhteivC}KB}zrfzQl*UkJWew=KMw4^oZtITu_Fz zxf*SGnRYc-6D%*%<>qQHcb=6;C#fL5(k&IQeCB^UQ8_<+uGh7vY-B7=%c zE*zg_@u0xg>W|KvFMeri1a`Z;4Ua{D>;E-(>XZfr z`=zS(5)bizbdWsSs3~0P#V81)Uj;K;WqCuG(z0_7^G8r2euB%R~+o`dIg(z9&?!wW@ zxOBP1qs(1nJmSjL?qRep9nCGGuhQir7M@`=va!*~F&Qc+G&~6T|K%WU%s{_SN0}@|#Bl{v!#%Mh!cv4e6#L7t^V4Osh?q_4~Tg#I|Zr zo6e=e82^dwq;eK2ix(Fx>YGr|UfwW&@ifM4hwENe|3)Yob}?~|Hw|sC*1$?JyS>pM z6J&n5z3erE(*I!qnC%BBp@Z6xYb_Y{dJO=KyCRdAxYuY*2X!hI?O4ieP!>Tq+o+)w z+fgos2tejwRX?hzag?KsvurpnI{ZaspoVCCkCysVeIY&6StC|bW zOsB72*HGORooJay+@h{(CtP^8tLiM?lR~*Uac~?xsyab2piZ8RFz~8Tue)P@rjjh! zv>Qiy;e>IIs#QV4dmhCS@g#{yv0wBjdp9UWP-V01K7A;^n_AQQ9ynI|T}H9M1;@rw z)9xyBl1}L^_W>*$9|s1ZP+vq6)$bt(QL`TEXzL8rco`15v+X_9mOh({pyvWXUhWDu zkb6CJ6)?Uh)O6Ia*?JQtYI>?1WGww-6jJQ_s0z)m4YtevnbHKzePIC3W~y8!TVy&n z?!D|8WJR}4mdeG%JoTl+3AZ%Exbiw^y_*I@y<3@uR~$i^Z}x$@jwQ4tOKsz^^!pIr zPspv8+?`W<$=!KJFO`!)eJQnm8-zi7fMD4}tFe5O*BZ(QWhHECjK?PF>a>-12% z^qBgxog019Xf&4H0KNG6#NN8Lht?0K6(O*ySiwh0I;P?n)<@++YV76VGPg7-6WU*w zzH-`!ko_JYlH>cTW)5v-0YuZDzAD2y3?6r9zQ@C);7nNLohyt=m+Dp3APZ<_k3;|c zZGVVT3j!JSxS{{TWz7}PH$1LBgYlQ}gp^E_Ts?G9V7CELY!OD<3T=Ol!GbE!**g z+S_{7jZOp~3=U>bui~tZl!F6QM;g-)?wzZ&rXMVp4fJ(CHJZyJB}je6-&Hwq@1$Ok zDPGxok9_-Mlpdw}{ne3-H{g^)SZ)1Ph2hceP&&~b&|3~rmjbd-G(ep!hu`n!@T)UW zAAa2i%HdZ$P)fe;AaxiPgGGZ>j>$$3{^uxrdaxX2b@fr^G%Ow>-vp@-A{_`OgR9)A zS+f56G)7tRav5F&Zy=O{zBDykjq^5v0jx%HE-vlNRwY}SJ92{LiA&ikvx48uHhQFy zZjm(1QJ+D$tFiu8Ft)$TkE9i~vyrEtqXwa`vaVhaD#(?NhLl{nU*+Yh1EomrnIbux zi`9KI-Op9)IaQWML!g`Xr71(yxUOdC-Q5hUxw5)tay#q6HLf@ZLR)hVR{CDg?m@*l zCO9hHbuxj*Hj4G7hAokxAM>PKF_NED+hO#iQ$W!(;8J{2jfFhDz<@i%QyuEckSEsJa)c(}H2rVwN10ZMwliNgIx}1Vc9+b(;DQSNj+X z6tFm$rXRQ&Hn{HyeQ>0VP`SpFtDdO6ZnWCH;3+u^-I#_Fd2nOYjy7GVuwefx85EAx zzs}G-=07Es!;pRzmxRdW#=X_mV8HQC?rzNmRkCm}>IR}-Q&nfRPuvj*e{S9T_ zdp8dDz(kT`3z)3>p4=Iu0Cv%nI(9UrG@1UnE9q~ zb{m8Q*kwRd$w~kiDnoaKV;fNi%C&5RAtXE#+1VrDmVr?KK@IXZX$j!Mh9QRV9W!`B zXk36G&?zuI{S{E$Hqb91ryPGhPmx_ZNJ7S%2g^R}-vq{KuSWTb|0pI}1yRTe2nr78 z1T=+Y_gQuufp1h3K`X*2V5AyrP*j390jI+CSp{K@wCU9>IFoJXIH_Ai>O_?3^ z#b8KD;2B_mT{veeT9y<8CCGTSy8HA{JTit-heAI-HC|1UV*I2+jHpbp1a%u?M(bMw z%hET_=`rPO;01XqXKR2w?o=N+>e|R6uQccxxidcXjLL)+>N8Hi=!0WSSAp~~X4Kkr zZjTQeW4@+##2W+3Z6eaZ-VsxJp8hoqd)C|_T%Ke9CpCCZ+WV*xytr?5y7-*RX|tdR zcUE(=kCX1h+LeeKIc4|(cDc>t<_FP&=T#=fs%w-7+yA`EL@D*)iG-5z*Yk26t35&G zwBiPpYQ4emaHU<3h1!evPrw~W@CJ2McQu&qyd)KifiKIYZ`I4{2%h*J6V+~V;{V}d zXy(}yr6Ow>7S0joqsRo%q<9}?*K#VFDAn{66IF)WkC}fZoCg1u;zfRwR8Bn3O#&gy zv`N^*Q1^L~{K3^v_YEUQ0#b#8C#z53{Fuoqr?uyeM4n37WVs}zj;#ln)>rjhDd+uU zySKMumZ`yIb$}%5Fhy;|O2vy))N!yau1|rvQAE*G)#g60A^h!&cWa37cX9Sq?2B-n zOwCsxk&T;!diKAu#&sfJHZDM4oI}k-I-_x(cmO=ZLDSR}*3u2nnSK?@GD#CdYUzWg zsZ5o0Wtz$`b#Nq{elmzsrb}aR;B=LfaxYJp9*w%M$kvaMAH^GAfl*}1D*k$g+MeU6 zzBARHmZIW8Ght~$j&oj9@3Q7SdzKn&UB8b$oTWDMdF3bf_%OU!Gza#t&r%=FSPRfX zo?bWe9oGb#UN_TCu`07J7-)8`hK+#hS^xs#ZOyFjNO-zU*U9fLre|MQb3qBgW!G$Y zGEDh~d?9MCAtVkNQf|E*WOL7g$H;HC>gjWLv1@!FzL40^#MxNax6p#whHSqzWm`I1 ztqx)?!>{I~rZZ%_&VmO(xJh%=R2Htmrl4O2;Y#8JDcrm{Qn=-Fq;Qj{NIJem|n z8~^C$MuX?VeU(Y$=1MVZbETNu&XZ!!pC=8_t@G4=mK)?ZUrh|rtIN4oG}Dz!%XOTu zKEjfoHy^tkYKv{0uh#X^OI`UWNi69f=c`QH^5_C}6+V7hfDS|1XQ*?6+^IukbSmEY^E(;$pR)FZUjgOO)@xL$@wgIht-;qGq7myDm{X za_DqnfjY$UHkB7(3Cp5MNP580Wz?pD0_+K7P(C&a`d}H%^S5c-R;cdZFH;ZT%Jpx` zEA4No*W{JWX!D!6GG(W{GHWL$eSC?Eg0IWf^SHeG3ckE}(+a3KIQ(`c8fZMQ_bRjm zIJ{Nzf$a;`XSp zig!1_{>Y+~jp~!QV(~`xD!!bsNx%KA&GKp4AL9^-ghvfW7GnP&!D@bci#h_gdT*7t zLTsmTYsXI@8a#Kzr|LI2OeB=BsqLWcY6tut1RF`uY*)X-rCmQ$ zL-^919qL>>_T~=xSjf0o-gt&@457qba>?tmOTL-kZvCF5J?eaU)dl_WU++aN=v#Ya zFUj9X-K$QJ7hH5+&FJxx%w+! z?fEa{tKq@npaD}i;^m9J)SLaqKH0I^Uzsm22Z$@3|4LpqXTRP}9~{6=QAA!}t9|g1 z^R>Dd^ZmE4RYk6)A6k_+g%xY5a!_R=z8i+z6V1icL*FSzBiw`ezW*fR10Nhz{o&Qw zeh}_CjJ$(#fI{4gIxMI62Zu5JP@Y2nNIe2r zz=GnMo zq*&fOh2G4h)2C#UBfgPxSoMw6yI!S+r`6zs)6y~7;IzErnbT4l+G#b6rQ!9RE{)tX z(Co1qp}jG5`ixrZ|Gv>}&f*0Dn?8$GB8w8wsSYpz1fEwL)X4uF8;6H73q=`S5?$@y z37qL}>zQa{8<+E=5gyz}!_KSq{dqz3$F+Y~8=2^ZC9&wd`Zyl*=XtfR&G{J0U95)l z4u~~0k)FPwdI$1-9<{8s65aHhaqG+r>f4Zhor{L_QRY$~nJ-Wj?Qu>E4N!i*jt23~{FD>|9&G0fP5ZU`wdRgVXZlZZr4*;PAM1RPB>Dk+TU6W(y-ZeRP-r<)8YW{mU zc;Z2dj+ZbAFepI_+q7~o# zNe$qkcK(|kN8CueENwSa@i{$dy`k!tm0{9`fZ0Dsz0{7;tQ(2%>1RP zcW`*STz*Z;Ewu{|*txg+am;jM&SUnQa~}8~quRLt z@9Ja=N}&CYy$PGw?`pgcgD!b6OO4^On-){>2Rs=l=J$uX1x>U53AGm2`u?RJ!QuJ8 z^ur(TKmo?S_qX~6K2H7(J$MI2-&NPkJz)3JbS;K{y^B%wHZ{1X9>X>F?#UG!N8$AH zeVFxGOIvH$5|R@3a?enXuNF+6K3W|doz;)J=tt-DquD-MbKLN`k9^9{`iI?D9yQlL2K&mF zctbzhu76y?2cCINe@cv>#@5^S`camj7KBWtVSad*6SP48*zTv*ckQQK2dP2({$Z%T zHOAGmBdEQ6P)3M~>Ul>8dn-TdY^@9T01EaP2tew27_*SfEI0N$kDDryd_|LujyAuj^3Guy`e!gIY^7a z;qS)b<{*tT(#wLhE)0Cfh-yfRJD_@fg0&>WQeb6W8br2uU$zwH2Wx5k&WD3FS%vsU zu+~6Y3bD9Q&imvLZ4Bnuk`Qe)=CLJIYlWkU^mD#qcm~jg-h;3l)9z4yqx2 z0WZ~sFpcMUT(|~oErmpAtOiev&_1_h6}OGVG{pnvMWI1MlxcwPZ;1@?@>ZrxAens} zg3ekaezEG&TB6JPeXevfSgRg>rrOAOU7m8jBw_~ZZ~02J)(g-3Hkv0zL5wb~7&(dZ z^`rM=w4PkiX_mDTsx~}U<4n1hv04)dayDR*t40OUj9865k6UBWx_+d_Y6+&cHIGWJ zy9HCm(>=2aO5X}8+;b|-(xUiqoOZ@)G=FHPh8x2f1Tet7vlto#hOvdUv?OX>L-T_o(6xr9Bf;Dyu2$y{m|a5~i2e1% z+&9DNehn=FznhS(afH-H^@h}}<*d%ul`bc14BNQZ+fkjyxtB+yP={WDg7faZb#ktW z895Ap^I>wXP-@%GHI6=7)`{J*pVq`+*g}8SG+JYFqjj&PaiBD>mKNkAJuvds!6AlM zhcm=No2I|cb=fY}(%2=DQ(I$~gu!;Uv9`wOGB_x*0o!|^nj8;?+&UV^b;6v5toqPzY$NSIPr>r)B%OKa+CMflwg^{^3rO>66EZSnC_Jx$h0jH$1sSJ`n5 z@UKT@Et_{1UCTx)g1O^5;lH$^zBY>Y0$T&EY9!L|dOYwnTcxML>!C*?4X+1u_PGtT z7tmwJu53WS}zjr{IBPKaQ&O-5Y5F z6RT}wZ4idlipE-J?=#D6O1$9+b2Qc%WMGhLI9;K}^xzo?+by+;){uu-?h&6*WCp{% zKe>s<{0vG#TsVa^)ex6o#ql_^(Ft42 zrZlyg#&f`n)S;uBVu4Ry*AQoncF@ zzS)miFQJl0W{!V9+O+1HU-6!nSP>x7=+;_OjQ@n?1H%h9^>Vkk_GydvT44b1o8j*Q z`8TIYF${mE6L`-s{M++PP(H)(e{>#6N-IRv(4pG?e0B|-6Pn}*}&d~ zrT!_FU>QzM$k3X4{0evyr^yY<&>lkwZF7dEa}E2+3xlXUL*sPbp^C=%$xVt}SW!%T zyjKu;v_q3KDY+dM-6HDTPGbj7Y6pd@tA(xGbRcF-dJ9ntEklbGm;*1`^&QU$_# zvxD|TEf|dkX^DZMajtpj7X#CZrbSTc5WkSfDk%V-I(3PC2&YlL>|zPilP3+(>+X)& zJBJ`Cbw{if8}|KG9Rp~n_tTScp;>$H{I{AF<#q64_!J&mHE-I;aUpi4A2;en>RpXW_Y0WN|7-J z#*#>?KTz{FfZdhTJ2>)dq;xoUY%_Q%ufv+0Hyg#$N6`9#PzVsPL>fmMZv%4+721;$ z!pmZ5+%Hg7CouL0X-eUMv+Vu3u?KCsJ`%MhpVGRT%;tLrN&OJ~T+Z-i#$dU5`{<`~ z221_YmqZYrx_+?MU&`gODVOz2YJ}0wDPr zu@?pm_8~GtR6bYJqvLuWnIWwDbT=1Hl)lt#h!*E0bs0EBV}QzseC~!8FEiA0SLej0 zAd`BX1@CGwT1hmBzJ=?oR*ZQ5@s%(GqZ=uuZ;R3c+sNg(M$81yoS~$(pn{h}dN6&al>JIKoZ5^}AE1dgFFcMp4tAc|Hw;msYa1}aBitRVybS#|2XT9PbEKTr zDU9(*q=O?huG!j9$9Q0l`|yxfFuj3r#~c{01@a&sglig6d>ilq{mb}`qA{a2hOZew zCT9TtVZx(Lqm4n_q!PqKa{OT!N0a>k-lO&yjcFy_QQl4Br+SXjJe?zZ@EEPT{Ia?H zGRWXFR;HK7E1?n_(n5Y=*V&A#nFGG1{w$xdc$P81DQc|IMXjCK5m4@-Qi8!cz$*UH zv2saiqXS5Kj*~;Utpt!1WQqV=x-l9uY5q8ktD^5EWg{xXj2j1PEU3=H}Mn%g{vR%TaS|-8Uaw%mdtv)-TGtJF|1Eh#9=fPW3O5LB) zI_mCu3rh8At%Ie)jXvhyKVdPfq@SLVR+0h5uFAX1*#Ph%)P7b=b!8|v0*`+N)8Lza zo<0>YY)^%XT;2(xDea@YXypr9U%Kfw&yesJ$TV(4J20=2G<1Q^(C#B&FN~OY0pa$quAw+&OvnLd1;pw zZtD?AH795h(DIZCS{JMfb0%n=<#K(>Z0_X=vbhF2qH1$<(A*shK+p+mcsk{&--gqk zw%z@u(;8@xzRTfnYaiv!jby_^adZQA`8h4a09$kKXTPXL;ssuQ5vCLL{TF3Z!XIo3 zsFCTVmt+&LUK&kEqQ75~3m~vY+rVoa_p)qB!iK{jZGTydb5^V0%Z{D5x6u?_Am1#8 zat{OOw((`H0jwpZKTOmZc$ZLE@(wdwrcct`%!>A4 z0XV>qwY92th(EudMS~`3Ve;`nSwH0QLG;5U{9YEYF7h|VPSzg7!)wq_6SWrf_hi|W zWaFozr)c%fSIeCuU+wKF^0vEEwAFaERZ}r?0SlNa%UyZpYa^|%hSG$5Z3TWIXqv`w zlY(j5Y#b#_*CrqawQRc9pM8UV3$?bLw_2j{QqW_|ZgC=HyUW%FUG^U#Yf&(QkuJGOdN+mE-h&eWE3 zJ7#L#@bT+RZHkm#GjMgGYo@)XeeAk75ve<=H`<3#w^QisUnx^x#1UHV=9HP9R zN<%^ssX0*%1UE*yDEukD%FSssa~@QQzjx5udD66|2HCjqAVP zK&}h4TK=Yt?pYus1d&eo=Y&$`0uX!^(SQZoOH6eA?E-|r^y%pht!t^6n(4s6^sJ(_^9K8tsPzLCnpxnt3!8Ci3HqbPAi*GK{T-bfDzJb}9Mfb}~ z!)fkf2zChVS*#6>laX$J1k1eWaglaQwE7bH#Y8YZ?4O*t1Wp?; zZ!FQq1(g5l5zoxu!R)^l6$; z=FLgC?_1JVQgO2!zea{wy%cw4(-{MlhAI(Ktgc|ZVX;b3njzNLU!yI{w1WX}+;~XK zn$j0<${ox1E$vacV|{5gHt3;mLE(Qvxnkffs;1q*FmO};oI@YJg$Uhry7U&_b{1Kd zYn`;pRwGD~qp!8-)b8;*L3;BQh*)IOn=7O% zZtn`LX6GbpY1J2w5clJMn*FQ(O0A^UXxuG5y7an}Dce57ijsss@Vt-c~V=sHtrf3!P67cudABNv}SCdvx)U*8O+xV11AnPnZ?jzJtQQ%=QgWKS^>p|_D^ zfJ=O-p=xzL{J$X!X2reH_av zxbSMalCt=25Ov?6dAWb@i4$)6iSZkt)|=^>Q#arRzo()NTD+&&;lWApk(4?*D$Lcz zJ|U78fynwB57W2+XYW!(u{)&!?7?H;P`bqE%LQQkw->>W&^yXKz*Ewjuq)wLEmU%t%-o6gPN2;@ zwb#+nB_qMM+hdo;EG1r*ctdyZlD4UL1#c)~RVMc-xMN3M3H4B_CAcVC|E9>@S|=$w zXGZ$wT1drOxm{l)AwLPy+AaMoWA)BJEYs_yFp;w2@@0627H}MTl zfgzR4N1807z7+R`6lzq#hNY48$QQ5%5ybgIi%9xcS`tq^ITq_7_}`g+H2-q;Fbe$= zmQfKEe~IYkBnsK5t(m&&jLy!+OlL*<-_^Vo4<9c^AIhr17G+LZ#Wf4cbbdM?#m&c7 z>6(&j71!*$R&fo;A}tC`!61CBzgcn3=9`i)j+%X?1=KoyvEqxf7j+^zAI06rop0W^ zGy%2+{#ZGm#(kwVjXq&l48_G6d(r_m9BSR{^H^BnxWToM{keMSQh&PfmDUmSCv{q{ zAnLeZOM-a8J+`cQXj8LwQ1T={9ZSGu-{aP~>OKWe#Z@Z)Kc2VR8G!ZqCD`YGhkCkl zaGIv|cMtP}{Zn=b0n%!iEo;l@-hM68Z-c0K>SjU72eg`~bll?rR`+*y(aZx{BdW8k z%&(CVseM3`MhRi3CS4Up`}W85#{um*4oP|FEcLH`t-VU4rh!pAK0AFFiO0&_Q3`0F z8}?w$6Z#_MUAP%Xm-BPoDYi(fk2!>-2P&<7J(TM8?&VE+MbJ_=(t;vw#($>L`r}T8 zCIp>_HKAx^TY7)#7-KJ3WkUgYC)xdf$+XxHZ)!Po@tWL9E#9hvr8EC)2Y&?ADPw&G z%rJ&N6G7{f=d-4hd1t9qY8c-aRz;nmM^9?|Foy$9K^@*gJKrg58-h%7sjyfT?gq2? zq5r#O0I!_V{3-wol{N*bFgyhX5`YEoZ=}MI_6-)6EL!<)Sx07Yf+zeNjEr6s_g+~F z7I8gWk^NBtr)9+1gOox7HQakpUXPrXEsTG^OaXvL&opEJj}3XhKt6$-B#{PuD_1cu zJ{3v}-Nyvb0{s+_8%!*+`CC9VCQ;e9n6i^7J{omXdVZ&M4cC)V*!YE``x(8dk3RWPy8-4a2V4yB%w0@q)KLb&dJA$S|&uES9UnFwS*h4vEo_+s} zmJpbK-Zh>rX5^XR|9T_sU(mTTT3?tZsb{rX)*r6ZfU{b1^a-nC)E?0#2&93`c9cki zm1p5R>P6Gm*AJqa=cIYl*}0xKYHSdmM#|^D3|@*;ZwW zz5_mrYWsg@dy-AENj96F%r1e1gpyD~#|%ml5CS41qJSbQAcCUL_e28hhKnb{=B^ZEYzh3sdP<+l-02kZ{%YO>GyowIA3F>x~(o zW|*0JkfW8&HRHcg7Or{cj)UOW^b#M5Z=jh(iHHF=bwdDk^*sT)VxMK~f-t0IrO|8q zpyeD$oxY8^#V9QTr&pNqtzyAW&Z=iKrm7uwvs}l?S~?Q0PnXhxZ%vyPSg+<(u^(L5 z%*RuWR`7{AYrkbJi8B*Z-m$-yGit?i4TvJz@$#@l+NkBlL9jGIfWvR+RkTcBw56p6 zndTzpSvBW7=!>gp$9Kxjbn^vqNP+yz0WTGO4;|@62wYYylbw;q3=E~mzpq_yIb$Nt zOQ&dHl#9Fc(uDz;k(`R_(+`wY9xkHH;^X@o|4JW*Q`FFZON3)}bT_9j~n| zH2(Kal>X0h+q-R}k0$<9YtSfJd-`AO>&;J{W?xNztnKy}`?~LAaGgA^AAW=j>R+4V z?xnoBXE`_Tr;R_=Hs-U~@=i9@A5aLy%!UhoRz&E^w(%Ks>(3^cZ59sEhM#NWEX6?0 zfPuwuhW_&B+TJ+jTO6r<#R<-Nb({P=81enZtpCdqstaLAU(^$8W2G;%C3q z)~}$LN&2s~g~%X6<#{i2AUC2k=9(<>^j~Xx7Cd|yd8Gh|&O|%Wg%Tt%Ug!u>)vDah zrOZ$KT6+YlKV68e9Bf&T*P0z&pk0}ytc_zk;Si#TVIyapwso1A{3-4hc9Mn94x#nBaww9RbRzQP5m%PZeN`?_MGX2Y97$5}JvC zT$pS(`$`2IF+u;57Gda*qgwE$+t9f zm2SbF!B+Ie$&5C~MSk)n-Q*T6*)#a9t3S0ogWq%uPF&@t$Rkj_Ugi;8TpXEhxK{f8 z9s%Frnvqp45wZ4(M{r?rAMI%)BJ3#7VKVSbdI)7OXTLbSkhXgT>ki^*>Zijq7C?VS z8;~p;cc3_C<~rgN8IT(~_(VHgCi;Yd%acBFS&e#KX~t%|G*4?~@eVI#Gk7Twe`%YcIeAH`k(S~azG#RTB&LVg$v~V8It(R4* z>e)j+o7JsJ5d9c2^~uO{<_U-^To*(=^y{a!I^7)*jX0N(G2&pvv`g;6=VIj3Eu4MEXf`KKh3mJh2`QVQVS#?ZVJp>*~W{(*8p zXQv28&P!4REBEH62sYAXrV92vPix=|R3A4Le6ll;!c8;t<*0zj+Upz zR;nK@NfTTE^@TLSZfvLy#2P)gfnk}EqpdhufO!jv3-By2{gg|TQ)+sFp?rF9v|(k9 zi;*)sl~O(VAT!QPi0VX^<{jz6bndg(EsOLpmc=G!EyF_93JQyY)VhR41tv&)XhI5V z5+>etkUan=tlFMI$ngSKjue6N&>6yy97++hsmh_$J}zpCWX9$jbX~YyQlihVF zF_Q@zg);?f02?#O$)l;6q7iP+YuqZ0)@1@&FIu}J6ToE30sU~fGFzODc(9kU#p!C1 zQR&*MoVxgYi-B(gWCdKd$ziypMLBArwUSFR=#C)+;;2=wg2;d53ie?)^0&faoJ+d3 z$P>S_D)r4%5IM5+5*s4x+mModc9LtTOW8w`)5N<~LLsFuWm8g+^#H6wCa92iA!iPy zS%TiE!(j;kyl+Zu_|#$56o$LjB!KJ*4EeV?M~!rwRL z#4D$2djId6?p~@jY)WS}5`iq{{W%?_8sz=|KDo^UjYLSbiB*Ez`dGs@tmTLlq6pjv z-=0(iZfc<-*8fx0w=f5<4WXXnl2g&|fGOXBQ2&N*S6H&rMdB?%u z;H`1pXg_UydaN&52Y;labjJ5uB+l6ME2R{PKEWTBAw;N-A%faEvQj1%g}YZ<#@Ri-jeSX3^ZGIA(5bDs1oI`)$L?gH1&}@8DP|Lt8Xe z?I4=&YYG^Ir{z7f>nAg=EU8C&nG2h;raVlGUOiYs%S%K6RQ1^sQO6ifymxkpqn<6* z1Tu|-LDEWrWP_=wl<{KGT4s%!F99d8XzRhVXnUzT(vw)WEu@0SU{3mM)w?Y0PJhq!|;SCGk0rS1(Z0VO!UL~@2xSKrh%I|vzF}vK@iH)EZ?+Z{Mf`V68K`?BcIXi+1ew;Yc-3cg0I4f!qevYN*$f)jMsV80&)cYD z6^R_VblUC?EemMJ;MUBe!9f1jA&%;bqQ}2Um;YscdRkf`!?+qy9M#_kbdqW9*4JV`C`~9=RSO? zho0{$ZbxR;y0}4QzeYk>#U%K^BwTcw;1sUQa7o~OE;a7Iol|caT?3GyDg{U7o*cx0 z6wON-RXC5bly~$^>QpH@x=|Fl}gNrqs^CpHz>}oRE|UdhRDWD zVFY4>;|fEGA1JYU)tEHeV+gJ;5$q;zLX)Hg6_CW9>89k4WQv>)W$Ek_NgV8ICfsMk zK*8yPLp}$bE-q&0!o#j}^J(R$uY0|wb0O_MU6fQ^Vpt{nY`*Oe1MdBXS&qhXC#=ih z7jq}1&u4@)64?z=*HSbGRJUOou)P&riaXqzjAFH~2aT96mG6 zdMmcGZEsPI9W5qp(@T)BxApeZjNT%wT~xDVS&o*z;GbVl%(@$ zFj}$GZOqz1UHS-4$bD`fkoet^O+*ysILkdLh>C^F0`OAV;7g$qQ$3vpngIUo0VarqkH+3$43A={ehZKw4EKBDO7bAmHXU7?PZT61cr*`|shvGSbL}#$ikY8Y4;`1zh1jsE% z;o8})%gj7S9+0WmJE zSu9y2S9N-+M};-9m6Y zN(%ftdjDnvk_pxu`z8y85}kiX?vRU|$=?VQfl{u}HX-`q`7{`a3?eP?$?Z z504ebNw$wav)q(9PFxSvy^+Ski=EIJjC!cWQ{vCXO;JrS2?~F(iEgD#sMX&!uY(WQeuT!d|HPp+f)=|z zO^t$E+492gxt00rw>f&`Bs}GJ2B>UCDykQJ>={kF|0$C5$|4Efm=B4dk}ohW>MwQ% zqFV5(sAEMWNRbS0D6H5N4cWOr)*{Iqm%+b3pgtMiJUVaCRVXW+;Z2}x{v}%QL=PW5 zn(cQYrwUTbLM?tgu9yz~OL+WkB8hCpFQ%jaf?o708hSm(egWNoy%_16`Rq1F@HLGN zdk1ACqfwiPrmKOtgI7_>WYI?(P_uY%OAX1gCyN`kr8MzNc_I#pn2ZOOVa<`#uGx ziD}?F=1mhFF#gx4DL_e_E;v?f?sU;dovMov9d$uPZDGx@htHIQ5Ffvmqp4J65w3QjeUFBjACTOe-TM9pUiPN&3fuEA+y5^b6RP0~PmbB5pq zMXB`WG|`SKXDY=IVmYUa>*)TMhw&)hn5nd>@cEi9+9iaQWXXI&nDkrVMsndRs@0rZ zp#yKE8&ZGt|k;5C zD(X5%6sALoZZ0mePFsQ@Ui-%!7#Nh_CheXh%F}NP7{z9@Sgtp;YI29@pRvYil$ehY zOKS4F2(WsNX5AtF$;;%ME3R?Q3e$~q#Xt;U=UmY<`z<&aaGEzZ?(st5(tb=N$OCRQ zPYiNCbcANk6YUcom<^VM2Z&1aE)Z8cxC0c%&@EzZ@P z>o(Dt2Sl!O^=6uhtG@LmRl%84E4u|Mn z-MxY%5oX;hW->sB?}H#WU~S6%|A%v4$#WiJ&bh-P(Wwz!kvCbs$g!>5Yz7L#85xj_ zpzD?k#YFPgh(ri2FH-qCcZR7&jWYENtWg@4sWqaQm*(*rF&^udy;zhw_idz}i?M$1 z!)`5BVwz=31P4P+Jh&d>$Gzg(4(zgs)PlPa2FHgF2S$Y8;Dt->7$lS33TLEZ=eU^K z?KLxaO$%mI>4Rb!j34hjC>lFo_?&)wP;|qNbp5yJ$~$u7zeQPFq_yXuSI)O1U6FV@ z-_GjStR0E3zQVZ9;-}S@UUohQZQwQhea#b#m06T(6?0x{-it1j#TXB9S@7{CpF(=Hh;UO z?Clm>2p`_n;KRF6_+wcmw3ct~rE?zW9K55 z!&1@Ay*+BYXFj^ieDw5Eaar6u4>bzz&=3g75u+hGI;kv~&Rhn@>!DY6I)X^^cQ_M9 z)7zGT&Dc(lF9R8_LRg4NSNzCvcw0u2-}uBF+}#hOFG_t>v<`zVeQLFe>BNBZ=RYb2 z@w3mZXSNK>1mQlFWlI`4Vp6dRmHfioCQUcJ({(TYYGwaF#y}qSo1wFGI zn!X~Md!%1GDp(=XwWc&?^`1yg|IwUkaMAKHjcN6#Edt@i&au(NLPSw9mz2pDcQn5z z4frrCJHL?@$pJqBo~Hm&u^^pUja-pz{M5%pG7{*s6(Y-D$VKLnNtRBm5M^DnE1aVM zYAWi}8H5=w5j6TO(B5f?i0$TR=bVhdSa^qB$MLZh&PjL|^hfc^I~J;a;7V{->uk_VG>#y= zG7-{3Fp>17b2F8mnrGeH3 z&$v1APOH{9($PQ0>BoYr3J3f(5SFw^6K;Tkp|z7cZ*qpi;d7{e7g5S$E#0SHobROY zDsgen1Dqh)0@H+S-ET4rpbN`>q3X&Ta%uG{;ZIox)l~3ow6r{E0`%G{QE3`#Fjr5yb?bUT56R}P6L zBnI^&+P+3yO^x3fR6rx2fZH(#Hd|WyJWQ23zm}lWqfdxbtr4w%LbUco^`IUl`Gh#F zchoqFo_rId>4tMsv~X<1X*ePQS0!2m_)g=ox?gWR_L#$oBJ_~z({bC43H3~LB;b!| z57?#;0f(AZPbiND{E(DRNyVS~)zsq5l~Yq&(|J-B^?Mqq zUqqvx#^HW@n6y>!{aW(0$m=(6Rh+TkVJtodQx(?4(!%kJkrc%%##weyx1M4+g8#7N zR`YD`%d%}0V_egZQQ#TTA_2)lEC(ZNT>U2e><{pgTlTm-+F9`L44VFoD8!&1dq#AD zdC}s!k?-djaZY0xPR%(WZMZcK(|iH%P9tbODxk4zMG4l=%IJ|#HERXOxuw#?H)bL( zYpu8fPpx!G5gN5lbi?14RU@BPuM_R@w`Hoxr`mO*qzHVty?FfHM8z??E1i{kTCp=2 zP3i8g?50JE==5hr6oViAtZ3e-6ae7{K)4OpBt2owF^9{cmmYgpi zm`DAdz1NGEK6+L}!bLYmiV)KPdo&*Rj3z0dD58|-#1$#KeMUxX6ncuYn)c)!$b+e- zCgrg#EkBs4&TG?HgJsRMvZZ&Pb6#S#N@*Ir#Ln4dr(OR;<4v5I=+Djtk=_OJ zN;V@pVMbO%P}UqbTXP^&sJEPn1vR@d$WYCSHaVJ~?s;AWG8xJMVu-WW6JXe}3q%&s z3(t!xY=LEm$)}9BRv*LB@`7&5>kFXStD zSK!PMzJeRhd;wQvLuildg^C^aA}0iRXau7INI@xknFM{eMbN>`e&UL7#&nM0H+C>V zcYvVdVEV)&=(`m`=LG7{tmX6xOu8JwI7QJtilWob7sTm(tsEpexDQ;c3=J<%)@YL1c{HVA=QnH+=L2p&+#p((pn7HuG%Q-m2ZlN> z*x`i_RHhQ(Oj~Uf&60IJA^3j4u>7NP>57dCaOZ9m)mVAm>Wi{A0d)q#oV))SF{rue z6y*V~MH_q!f%9gmDMmx9&{QtHyGfy8q1iNt;x>!k=-U$Yvgv}&VlptgiTOM;hS6qj zEbgkve3U`QH;b-#)e`^0)Z;~1ojF7JRm%!fVgTRNY#ydHFN-WXc-1m5td*8rXjeV@ zF92U!heCslQma4vbmAN*i7yGuTIn?5yBY1@DjIb(vufcCfRRN}&s|=lSa&m6H#fU6 z6$gnfi*Bh()9~zQvA~#*Y)1Wy{KzSf>VK!-jLhLLiIMKDQ6!tu%HdA-@f#fGyhX%Y zQ_jyQuNx*Gy5;5Rkm{itw-*&{Rij>R5X*>~{J9J@th z6no@m_9y}D(c`a*q4doST@#Tw-<{~Rmo#OQDX7G-V-uA>gDejhY!#vEOCZ^rW6t_> z(D7ou&ITEF*=@WWThzDhwE3noDGoKZ)t=Ue7`yB?bee#frd=3O-ka$%j$3fD#Tpc7 z0Uxr~QexK1(J6=@KeD3})3MjK(z&mRZk~01&H%LIA49S!MD~~1nluOL6mIB|*V;}C1h%;f)H}8!{B_VYOXy~Qt=H_4(UxtZ z6nRv(p|kCP1pn)hyG=@zpY?jZRbnuH-FnMJ%xY7h24=ot-~V%q|7N{z2SM&O$5|ga zf4BH={eJP^@>?&O2uq#b5Q!-^sVXtSd%MGg@9}Slb37nGI~+BUj0ilwK!TXjV1k>U zwX@!Mc$zz79hbi;bO6`e_KiO`KTF=Xd_;EDz5Jhn>z&`v?;YzsYWEUK@&53pNKEC~ z-MSmbatK{ahu(G6q+F$IX}}a`9j0WxchY>`vqzxl>CpGpV{F^|_WeIMEi>VeO@}_H zdpR~O+WD5qOsbC|A0o@&OQI2FZx@Np?ae7QNB@!4L#mB+x=lx8NT2%gNmKb)^@k9e zmqlQxsk*>KKB?a6z^P@uEs7Ge@pW4#gCiHW@|Eyx@`@}w z!{Xj6>c&auRSLWll(jt$y z_T0n|vrD?_U2!Ss?RSm^A5TMphj&E53wT9RZM+Pa3JXqRN3O9bV_(% zv_Z22c9+!qebKl7d?)ldg=4JrGjYa2d%1payFF8+oYB>&uC20v5ZPt5Ms9(4WTuZ}!tk3I4u^!PVs z*N^Y{TSop%gOUG2pL|wtOVP)t*8Eoob>0sjKR{-uz2bZz>u)iHTe4S_ z#+iv?P^qtG$sM|uUNiiTrkX!i@#GlI+wpTIr2!`yc?W%^kayZw7V_Gq4`JHH-}!>CyMC)Z$zAlS|?5o^M4EWs*jbKn}EEYo{!B<0BHVo$hRiaY`=&zKQL9J zvp$J^;P1d%(7GHt>pNl108yaJzcD}Xx8SZdgZ1CrGq_o!Pd}?SgTIcwY6hSFAj(YQ zGmSd!{~J-*nn2%!_5`MDbj6-}6Zq>$tR`^9A$tP1(Cgou696I)49zf89AaPT(XB|QgNH=`NniZNZB%(} ze27A|qFL5^&w7j$W8DHUb-^KccDwbh1Uj!)G;VsaG0VQ87>UFC;V^Z$u`tX+7-#)WoojX&6YuA0H18=ST%9uO zJb(2(bCQ=B^BRl>YKcG2{d;Gkhe-8@)AHj)^<+1tpOl_vi z%!1f+7*8Cqc_GhWqqv+1C>e|JWPaWe+!e)dTGO&^dWmi83z|kpzn)s`90UtIE>%%? z4|wu{jfMU_;-Qg0iq7Q=%|75^5xgC#L97qPvabIAZF=iR(L7OgkpTW4#vsIW{3J57 z?y-Ak`*kM;Jp3dyoce7Ci86X6?Oa>UPkqHC!@yf%G#Y8dkFN{&!T5n z)ezZsc@N@wgD)Ec)nl=Ucbu~)8%92y$) zv2;SsH{lnN2MF1-up)y!4wwD{+6s@$yst8}jOxkVc7AkZZ{WsgQ8#^Nq*yP~i>KrF z3CGRdrrtDd=G?`brf4@tn(9SMqiKfkS_m|OYp;$3*f!q=t{jd?3jZvQ!1_?BGy*VN zHRW1ydSGHSFouOy)nWDYNQqve7uEH8!_D2MOr@&6?)X4aH^)GCCEg6cvO4cq(Iw@A z?hrcQt6J1eyFo9yIa);Ho_w$XvpDgq$ZlQquV~Ry!*%VLi7~kNx4Du9dK%Wma*zZ# z|2wv;eSZ^K`N)i9xF<0*S)N6_}N1z|~SaDngC%1UO@xxgL)79{fo&9=7+Kt~n<9P{A<~ zP67_tVl2B{qK_Q9@R&#lp#9SN?MF6f3O^2Rn(?Upfeik@qxE0t6MW2k2nb1WIE=?Y z_`CT+@t|NXHtf64q>&R+(!IdDOjsCq)2HdA9~T}MWZ*5?VF zauZ6RGFd%3%SS<%^warHndw%Ytyy?9qY*kQi#og4p_Q(DG#J#1ISk#YXK??S6u|#d zpR)V+m@|LsqqNR=Mxi%-SZ<9U15(c#FjFl}^Wm0Gyvn3QMDw^Q{LvjOtmSq-M9JZC;* zr$zPhbFpXXG}$8`$#~vufX!#fe%|_U0(J1p0U7HXJX{}pxWp?5WxQZNR5|wws zo0e=a9|piLY_Oix;irooDBXG%>t%Y;W}oa#!~HTGtZR|MkIK}el1*k;7Vd5OU2hCO zQTFihlQC~zgid@uA+spX*xcZ?&8K<|O04p}Z>LqiXf|~Q760>Mtf{^8ICo#Nn^fUv z?94S!Xp8@`PUtOmOYlEitfsMpHeb&KQHy5wWK&#%1xS?i+$bMaKlZvGRTExTuY*~B zS)(PFb;yW+#k_$!3kY9JO)mx*CK`*KV+!qT4sph-<|iGB=W_9ZOxMB7yN!)q^ScZn_*%YOOSu%uXAVt-}RG9gki^S6~vvx#5C` zdn8SUX?K%Xy!2AK?2S1kh1HD5hpkm_L_4Q<2!+`I5Qc|%-NM6Ea0l%POZJ^F$S@at zOonW1EjT;H@5oSV?a7o}NTG42Y=tEqk|~FyW|HOP03^1?Rl?&!7*3T@LXo)-Bf(>) z?2TykQgcb_8k%wNywClz&6cWi=5`Qy6Wl zvSs5W7UI5h8Xx?oL}0o(TQ<`s(CTcNlW@~dd~Yb;Xieqqyy=+@%clTr+VEfz`x-oY zc}4|_bE!2|s6EK`5^%;iClgD70-{T+25xcrE}CMh$j08ec|4LVOt&N$1ODkqo|!iy#px+%hAXe3=x<;>&gLf5l}o9Aj~rqD6A~ zI!&YFUAwfYE_N=~B87bCAuZCFugf%8lyF@R*D=1X*1)^t`jiG<9oKal*lk?bv(Ff= zo3uzXzHZSX&H1`ji?rbD8(O3#Uw3GcGQPf}Maud5ffi}S*H5%aYrQ3Y?A9V}_{Lr> z(w49Lv`7VCzlW^O*F##QJzo(M(t!^DG_#yO%9A~`LW<;r2*L+?7P6rC&zH%0@a#=+ znX&@2otOa}$qRHibml}0D8E34i#WCAR>+(2x~m@V%)}h-NU&N!+WHEi7j$K#wpl18 z2&T;C;Rq;rz@jhI1YowbfKooEG|zm`n24X81+rDFTYrOYt&EpmI9-|@)5sYmsGwFL zd%3(if*-S5f|WhDvxna5_LjFvoJsX{FVMzH>j2teF~U~;2quWStjP5uvJdIP`$xUZ zbg|^&RLdV@`WKucm_OS(TzqjyJOVLE_PjQr|B@yYNo5s zHj9I@zxvA+D}lXL)5Dy2dP!8~1oW%P zc~~8TuO7O-A}iI{^N0tQ+(^9f)gzwf_~E7aLYdtSIr8CQuCm4M!c|9z1-^zi3n6Bk zc#y?^HjBxSX01DhX60rc*7D;; zg=&6;MR2p{4{zhEg)&l&-_Wla(*PZL`1CaA7!WBy3$8k@Q*e#ox)0B@aQy(+B!FN% z{`1Fh8m^X;08B1`2QU(}(wu`W0Gl~Tpb-kfKip?K2tz#aMbeV(Q9<$o3l<8ZSl7(P zGFr{Qc$ePLxYHmO#?{P`5ry|cWS9q9B7a0J3TBR% z_;66J)#;21foML!Ixq%Z>E5I94hQQn)Lw*3jE7#>2~~CgN+lM_q6O)^q64{2$UOx4BH}WfsbC84uR_VX!vd zU&|Sle74(jQvHFem@|YYaK1Oxh1$WtKtmXY&}B)H%uYxnwsP^tjqcmd0sXu9+^XnxyyjnVv6RamZeh92ly_thoStpF@zXPoQ$eJvK7^o zN<@g(9KsjU>4j1mU(#UTvlRo#uUQ`2SYC4pI7Z`esVt1Q!ZSFalh>1On^KlQU7AV% zFhporytBC}kS_BSQ)am!T0YpZF0o}ygI#8fMkolHZsEmNjj51^^-}(cctlH@$$XqD zdGum48EupdtsamvC4pl^EpKIo%t4!u)!|aOl5yx@9S&I>c?0DCKfocyrmgnUj*OVh1f3X$31lqC9u@82Ag$EtcsC=`qD+I;}32 z;j_{$yjEv92pFTajdPY~HDU(xp~$qntF4l$O#4CX08q?aK&*B3#5ayzBXj-$Aqy3} zmO$iUD!&-gA$dQ!$I`4MIq}`qV)QdNcopDC8D*hVxhAQmC3^?<@L%LScr45c*_ z_&+`iqqJn#p0sMHcEH|x%>gm53qj7SSY?cLS=P+YTnY!vp8Gx={NJ*18qYXr|^ zcG(Dy1(SjlX=A|vVPJ;yTAo7C4*kN7Nzv@F5vGA0>BD*dai`H(7!Vqbt&Zlyj%7xF zCF2Pe1Q9*y9RHQ92RZ)Buj6Irx$r5B0vsG)SOii_sK=Y4LaH7b1Bp~|Mi{wb_S8I4 zSx%uqJZQh=V{c+IGbS!47{X9n+4FpB2XF#<6XUHHmBT$41wQUAZ+kxOF&dMl#8_CO zQ5PjRK#Yk3MEty;x?6Epe26{MRyOV9555ycKbDuixf`woh;d4)^CQq+2j{X3r6d#Z z0UhCFh@et7UmQ24x4z|egSy+x-ALJ7A>$$I^s10i9He6_WPcYvOA}kj@OcWF)LeYl zT+Axn=3FdK{=omwT$;6$EmEzybTn}#o)K1b$a2jX|@Y1?vbVXXh>n7 z7A@}q=8y{*%m;Jr)=9s&XZjgT+@nffb3}1ic#Yhi0Av6uFk=NQWZit#(T+gX{+pTx10m)D6rHh95iE6S9WR+4hx& z6Hvyf4sd$2eH^#hg4@OFhugb?4>Y!G1;?!0EM+U9mCtrdM?4PdCJy**h3;lyg6X)z zIF^sgT-O+=8a&1h+~#D)EPOP=m4%PCxU%q3fh!9iER3-55ivOkxLiRXi3uPfU_rE< z9-@K{;4)E4s0)gL_Ujx&&kOc2k40`{NGf>h1#H_o3w*6q(wvC7y zs8>Yy$9Qi1W}X|0<9a-|OV4Kfj9Jgk((Mr)d=EI{V;#USU|w}hw@#HEWwUtQY=CqF zRDK8%>xsoONcVJvob08I9c6B+S7G92%K;04wu;T48otcWLtbpG8{0a!v&>6T=e8ZL zp>SH;kjOb^H)U2zFYh4u!!oWN%+U8-Tf^^O!0YWNB1461ZN<&7xiA|BAV{%tn z+4yTuELKA;1E0zs^&S*2{2r^SYRY$|BiG!qu5z^YHH|tA2BiDXOo(%Lgdv|+oF>b& zyugKj>f>X(S)m^uf*Tb z=_LbE0x<;Xtf$fqm9kStvflAuY)99T`(K;LXC4Ly(!9M=4h(ql5L5+^qY2d9keRux zdqWb0bt?N1sPjXKP0?$UAb10Mg`O&0gZZ=_%v8%5HPYv3n> z1J-R=JOW(ybvyy%a7`44Yais3F?j@5n0o#0}O`_2YnhaV}2UdOuH=3 z<4!~elybUESJ<_~nup?|Do&TJ&@omEXFDIx5fB2Vnmt%mhM)0#7JKQo(`C^Bv{NU4 zu6^?Ji_r`OZ)0-tpsWE-c`_+lFcxOdg1Vq@^f89Fn$K}eC71gKrGVMDc}3g2GyT9x z<&+&}9>uSR^#ne2!>s!PFTxrI+e^ocxzYVN>Fscvx~TauU3P}dk1AD+9ecwhB$8-t z7Oaw07)K&4J3|&y%8XIr)`i^xx;E*z|mcXPfuwx$g2JwYzrwPYTn{W<6vH43B|v z(2&Mv8Bpx0D@Ne`^p760X}ll1$3uA+8BRc6bH{<_OVy#H>H&2=2lUyil%1&2$cts` zKx)ru3hyXxB-BJM325zxBaqE>VP->2EPyCRa$FJKcD%}TFLus_pogwFF`0KoR8g88{h=yo-b?Da$kz~2 zI->b5&PV`Q?#zG|^acf8IY{OpmL2YI32YYz>&{B| zpL)qwrRt;5KlMN-U~Hgj?gNH^wLP$~y7m0u4P^GYGQDX4<`fLpkIf5Qt9M))%>a43 zI+_p(I4jk-!05xj2z=`B^JE2`I9J9ennO#mXjrhfJUt6v1a8+iIOquzd3gLlVz;@k zB&IM)d}=4@$<|q;K-y)|I%K49>Tq76#eL<)3ZU(HuOI{T^7UuyrO=f_paF7nk4m7y z+9`nso!WE@w2bN2g=axWo`>&3cuB$b+axTb0SPOp6JGMLs~}-fCSlRB)c>EMaJ5&@ z=%JK4NuX+xBv5f?2U$|Ve8xtT06%JSdU8)RYb+J^aT6@ZVl%| z2$SkNOw|1f68shJP-Jwzi+755EaJt!TX5m3`^H5fZ|qp?j1_}~GZAwJ zg0`V4gJdAdA3Mx3tqhttOqNw=B*6a;D#e^=Nxh{7z$ps}B!;@<-WtwClPd;q_?Zdn zUTmGbkl|a{U<`0&gz$=3!3>_$YXJANP9uf=7UKWP2YizCC{zzOVJvLOPG|xf<6KW>c z0S%{)u^H*lt;JG6lXA9f{3n2B*dGAR0q?18riaL4!0A#vT?jV`_{{c5%z)dOG zjva$!7O?scfMoZnfn;~=oc<3$GDV94N$G!q5rB@D#+@S@B?G5t@thNlxj5Z(DWzRb zMnv()IAPAhjziW80)pyT6&z+>dJpfi6D(NfTt4zrsCckU&W0h$JomsWb0(h7tf_z% z)PfI)TC)esL3s)|90@qT0Tt6U<}S|ym%{V~@N;~yEP`i(6S9Tn&I1Ctq^-_!TWK%zK$?>tMKGZGATc3KM1jaC&@H=|L5AcZ#x`qcQ z#9)Bo5|(1N*0agbw(xyn!hu`Qz&Gj+Qaj8wm5Bwn1+j3eOp0@{lGJag>_xjCK}Al+ zG6-$!hssjSbKg)|@+aomL(x}-DsDwyF-Ija#ZaZ*q4}T~m*e0`UE`=HKV$&|}jtN=(Kxh@j?~i(hox1+rVyeXNE1 z${K@`)|5IAq~DATHm1O-3QfMIB{h@NDgHufXp;I~D09;?LVm#Yd?{&K2LV0?^ zf*<08v-#1t4jRxC_22efD4SqSP5x=WO)vbxCn;yR)CXb@n>kwJ%ydBEm}6pOvuGO5 zH~eM4_MQ1!0Oy`J2rIV_22-rM)+4cQ+*o?0YXRO4m$`mFd-g#rqBX;1MMhl^aGhWe zK&IovWf7f|*)ly;9Q)W0))?9KX@tzF`DR2WENQccC;5}(5G1U0VC)HU0207Ohfw3V zX|1Q`$oH9AYR!~uvNR7JdKURUwvCVph(tbUHTr&pYz}=x_DEUW^`UJjF&$j!j79#& z^k?zVHMlbM-$`2#YnThgCE}$iBV~(L-ewMPx&1I{Fl#Xx1;6E3E_$V)jF%S1H} zNh3!?f@+V^#TUcj3QAy;9adHUdW}J^6KUneGM7~lqq~MF zcxJALcFZd)q2MT)(5cF>qjHmDk`<7EtzM>fQs>NPHs%8Ce=_$LQZo%6B?~i93kdv* z4qcel9*it_SK8dRC@q`}8i?@}V$@(Ss?C9W>A6wz+&n+0>0}Ya1bQpb7A7J{T$A__wf|GGmYlm@=1s`j+5xoG&R2(8#TnDh?)^bEg6USr z%79`M>s!nwOd@a5Xmk3lX*FpdHP=$8?CJ4tc(+0YU?GMTg~=dt;}yW;D!R|Sth+)E zD6TSYi%pQFzJ|zpyZIFehg3dZa&q8X#w!=+0YiGH(Rbse0r%HA^*e}ZOaLyRq_p~p z_%LlcZA8niaR{1JWS!M9cUbShHfEvA@6|CN7G^{xD_rQ!E9Id6Rk7$v^MnDX6ZF7G zq`ls5EUPM+;SE|Hmg^xVEuo%V-d%kqmgvijsSI986DEK}Uu4`xOZ4Q-YBMm>4A?_C zFKdWyW~-EAI`&gpG3G*=<%4ggE!DEp1xB2Rtr@)Any8AdeA{8XbuY4SAU4%!*s+tU zQ@gnpJK4fx1?|}ZlvX+Bx{yg|;()*K=Jj#p9bprX%XIls zL)_#V1E7Xs2v;=`tgID5=|T$q(XjwZJLfIhnmz}rCpZChohY-CtWZgZvMk&~BfDH5 zs#l)!9yF=80wdkVl6_f56J=tsgCkuwcgi*{Gc*#+*W$+`Mu}>7pS9c#+F5~+h#fHf z3GDdC292zcN4N28^)I@ro92tfJvL})g*YNm1odOEhKuTd(pElM!HZ7gbquYs8k!x! zs5-OTSs{u}I1MP1$zpVN4l_$uE6^Opz1OqsEiu8ujWz$Lu_X3!3tpY5q_WJy&tnfOI0_oSZn5pk!I7SX1oR(hSX%70wHz1I~ zY0f=K4hcSDPFrcD!5BS4+Cs!f-1tv9C}nBGM@u#O{P6)uvr;S*=(>SpQOEQeSsb>b z;g(rwrB0M(WPE^Xb=MWkRGM^+>`51B9TL;x5SVA#Pa%lmYmaIaYnEwY_TI))zgedLm@SUnRx9tTZ+vuiq6J+ggr;_01h zWoeaH$3h?&+S;z=JY1Nt04}CUZh7ou%mlJTY}*Ap<=Fs*puCjoMsN~_1vjw{Z0PvN zasI5Q&5lhW>*-jxrY$$80pwV5cpx?ka-Pvh3(fhTA;${UGa<*0)3XzepBi%3**nVa zmFrBx{yWGip<~y}BtymW)rXg7>#g)D;l+yZb0~OuPNU1>$CcKBO2~@uV}P)O``|*~ z^!v5N~|zGW>M@gzB=c6 zD{_xlVhf7IbZ@KE+-jK@FhlYblDu5Ad4B;w@r`PkWJl&*gvh*!Thc=mOsp7?0NWfw zP?$k0tXWkY)iV2aYUe}*h~Bv!YPI?FqzdO5xWM?>3zy^yXJ1^9VX+FAlnUn{TvEAY zf=^GYKs3Hj4^=ov-~xZeQMhE#;SX;JWoL1&b{{8czYdq23gmJ3>A7$L)@a*~uAQn2 zD-ijDTaA&Djjv6VFOW|!LSYF0ySRcak3PL=1#FMFmQ*0}1=rFFM84qKtOAiQxHhjq ziAQrhyi}yssfQOxVA>BUR;ayHWkj@e4}jzB42Q=s6gZk zuI*Ivc%RDl$LvWHp3j0`!@fD)T=g0p4sSi%xyDZ;KWU2Mba(9=kzNTm%|eqT zdsJxSZU;i$M)seKP3wG*-)&^#&&}Vp%A&IA($}aia?Fj$G50Zt11@C_&?7VEMB}Q< zL#HEB3>Cp$aVYCKU8Z3~^PbzDR`k$XD=5-RqflmsM;7B{oSV72)(D=06;6r_o0Acb zyqX#tqmH_0_k(w5oe5yD{^q@Ru&{@StjDzAdRKR-R-BcVU6g<5>_(4sy~3$;#EBZ4 zj(1Kxism%_78wq$cPVtxvCsfVm{6NGwu@AN?aJWvC9t3NZmTU#07{^`?BMpU@BDVscef*B%uW9c2 z?NH!)bB9O<9F^*IRb+QX^FEswf_J}R23fd_Pd-WwUW~eh^D^T32n8qX3J#@ByDrV* z;tL}#nmCXuZpUS&-2_ld?q{gYVlH}1p#;RvUd?++tu0_`l!$fm5>h@T%ot!B%+ou9kt zwb@Xp{z5;_hVHJ4+RZ_v;7S@dNA^K^sdaPY=^n1W?4fz5?MajUPT!_i4A!!At;b<)`RY}&1K z_)eLJ`WBIA4u?n7>EOmeG zGEh0U^p+3}pD(Mmd+GD}vafrQhH8yFFGLCHLpP1_EEqmMujcp;O^fdq%L@PB`}c9! ztxG9Hda*X7FVZ!5f|F_W-B3FWps5c}&q#7JVF6RlI_1UBki1)7hnZZlKvrU}RxW`4 z<|BH4f&2=84d{L_lH$faLt1ZOJe)}8mM|q3*bgEg@-$RuPWz;hs z+gU(MK12?a>lezi!0;HMMK2U;IvrgIKdOP$>>fnURT&W)dFucK4BR8n#b>{`2eGc> zsrkLKF|QTk0xz7FMwj0U3&n>tQk@4rtj&HX59r|q@^di{p!fb9$ZM#Jw{kiX=9S>(BO zSAK9My?MX93`1=}#$6NAsLunk8PbZkY_Rjt+LWnPL9u4r587L^`H@_tZ&-NAJ&CmO z0eBf!(T5Mn68BQgXoa%1twWTvNM)DH zdTs-Ofu$KJA-+;h1OPvE7q6CQ0z!kd`o#m8bno7u@{nA?42s8YQx-+Gh12NCCu9i2iL5|v_TYqc5AA+J?r<+&iEP$; z_Ds)4r4e}^uyeq$2eMs!bK)1%&tLn~GqS0MLq=bRHMxq6buyfH6;c(Q8TDDB8FZoQ zuyqg?7`UGGF`-UI983_ilvd=69O?a#us;}`n(vkIHPdKRJP z+|*mMrbjYD&09SuLrF&#`QRmT!xyBYXAdiuIvPwy?JNzcoUJd)MV%kJ2hc)EYHJeT^fmwx<}fN}$} zm^x2x#eW5;{6*Q$N|FFpo%-M2I>Y4A=6&&K=7JYwX400Gio81#G0wFssmTkc8t3vC z)HsvPaen^-kF#b1crbgQg&Q!?mG!z>vXXjikR6%QrqJNcvJ-9GphlRg#+zVf38~<9Ndi8b=~|8u^e)a&gu(piWg3oS2lw$rN^9db~4^NOum?;fe2nH;i@v%}L$I{$A`= zKdtT;KP5-~{i{{}DAF$->M)=MjdPbDXBoM;Yu)=HR$0-dnXoq)zA7pEI;))1TvM>@1?ayN8gm4v|TiBZhTtJp~;2X zg|upP4%{+6l8b!yI5zM7f2@56cojw0e|B?|o1U9qNvF3&L?qM&5e0+r=hcvwqA3*!2GoU_sI;i$yjp*ER zmxj`(Wcl+A4?1?%+G4ahMjD7y$vBU84kK4=#oTc2<^jIh4yKw;@G)iPnatuRW2i_M z785b9eE%scWiSj_DPbBKCueX7;u6cR*N9^bFcA;FQF+a1Nx|i%>JiM)(TsGq7Pvio zEkJO3X-HsL)oNfFVC->ldP>s#jBo@(O?80;fKv^jEx~ab=UkrH35TAyRv-NeRF-hr z!)zj;%y`Km_~Li6Q%4BQtv^KUU6@S6jMAp$amRVG8@s7wOK^*Eho=T+QesjPnPUoG zOxQ@kI*>QXOonjD$pWSen?$B#2alnR=dJDy5*6ITvgJ1M+-~UqJxO7gY(!3Rw1?Bb zjwB6@2uo~jFCg}?%z)cP&yKjtL4qI z9LFMdGRLK=mL%CJP>eS`w=psi>SR|Vf*Et?hL+fPLo}>9ip=!{J9MtNU~QS)5vCdJ zY>y?iwpSq}K(^=@q0JoY5xN8p7G zRyg0>WcBO0&w~>;6Rg(k^LTPpSr9eM;-^Mccn_#Ds)h;xBg1L7>ZrQ#Q6Nf3lqFAsGu;xaDQbF^0Sg5n|CX0x>0pV~rQ=A@g*@7>6^mgP%A|Tu(U=g7 zaAM&11Q8{ft`+aK<-jJ+t(iHGiLs=*>;df=9x*WTq4XkawfBVhW*c-PBAs9xn3y=R zu?>4I_J%ne=iS6PCdT{cI5dZPpku&Pu3N+`v793?Z4pw?;MwpzW-wvrX?fR!sknc> zTQ&1X2#^3KEG!RP6`OYhHZ;MM6%-pl)7JX?OERrEf%x`v46gh;d(-`Zp;1)+S3g(! zC3Hbe&k#FRgb1qm_{$+7RQrO}vyQ7Gd>pVD<8b@Mw`8u0@cYFaY`I{+!tp=ieuu!( z8|MkG<^tRo8t+^umkfcMb@OQw5DpQlkbvPA!G17;xe|k(BH%8=Q{upv(PLxSVwg=9 z*mpCqL79&ob*uh7tR^NmGKb(xZ8=fgcR?L5vcYu2U=0f>3G{b0!e@hNL0R~t1YZlW zC9ee~OAI{l5#AEqu3;>2B!@FN@LK4g@or;CksNVixS?~36xa*DcPxtTMOT|Aw10CN8_6+(Lst@F&G7ea4G)46 zK1O-g5>d-b@R7tS%R=k%3vjE|PA_n)#uf!Ty|i>yV(lMe?cDjlEDv!kyMc;02QwKs ztqLk$0v*j+Y36$#U%XFQX?~Ki1U!?fgdc_~RAsngc#^TikW^_+Y<}^kE0(}yCrotZ z{7qN11zKTp2Lyv>t|Y=K0~_9i-1OfYO2HlN%T1!4K!hU(mdV)uu#<|RfFdHl?B4CnkilElUsOPz#IneaQ1_7MNK-h)mpbfEsjD-Ih|w3gof({ z7l%y92^P!^_n2w!Y4`~2ci(EJ-rKB=!{t?F?HJeqdO|7T24E7P~KFo6F2edBLyKH>}LXq&Wz;;swl|BKK zciEay%T*B`6__5y@TK6G89c}ypEM2Frm!hQ5FVyGTtjI2nS5i1 z20vqqNY}4ek3u`L`KmS1XO5K(>I+WHx%3Px{c{yoVh|xDdVCZ9T)UQ8{Y{VyWvYJ* zs)Xz^zHNu*V_Y%ZOOD|KusM8H=gwK!LocTiS z3h1YAqfc*Gn{xfi4Qo5>fnz5O4xq$wubasGrnLxHl0$=;!>W%gw>E|kM-e;~Rz8A6T@+)9unecc0!CG83U?mg>@Xz79*(dNChrfv*C-SL#Gk%x48<9OT)XMz`s|EG4uh?Dp^g5 zcSP~QcdV~ep*qITXxkkeLZ#5{JAfgTeD9+1f0wRL!|z&s7zC5N%?68^{|Q=R*UAV;5ffpt*@g>gS$AY z0^kZ)FSaVfe0J^gV8=&X$yKZwpzvo1t8cH)od#;w z?reHCV9>-K3qgWlH;iQ)2NDiYIlEz?(hwa8+^35Evd!B@ zmGX7L0Fqb>FF!p1fUzkC;LA#Df~SqqyTa=x@9>67>v#-!W6E-VAM9rFOK~*(p49{N zWO(|p8F0BMO>E06<=x{`^~ybKGL#~*_pRfhe^`3odPFi?#Y*y|>LktO#CK0CJ_-vS zSzna87M2!c1}%Xg#6;TZ>?xA6@ycx(9ZBOHubGb5k@g~A@V6Pw)Ee?dI0p_?LuL$D zd-?i0VU59Z#x8Ed`jqnjvNoXzNllt@OnrgA@1%Yxm&MT*FZU42d{J#h26+<7O-RB9+Y;Idoat<4u8-klbGECR#A1g4#3*;J zieP~WsqY_`LS`=ZGm*ut`lq~WcjWlL15zwE29QR$a)Y*j5QGIRm6wIccz$bElU=WW z?WW}C&|b6pozyjVb%O>{puG7W4RcfLnGVTVPEy0phSPdC)dSNF7Y3-c*(Z=z=kM^K zt8Qv9==i-UwdZ#**Qwhtxt5C}w#3Zr$Jh=V3KcLGu`y*L0XC*gYkb&Ujl#HAxU1}l zGB$Kz=*)LLJScPAZ4-6$P}yPla1Zqpzi|f+Ie9{B22x~Za+dq_*h3vA70@tGb(yTY zQt3y&b!n=%8cFB6>%HV_mZws1W_)Pb^RL823G!q#>IMO1WSkS%m%t|zQUX0sQfleo zUS#%BtI2KQFH7-?}eEt2p zuo~&p>$%+GPVtCRKi8th$yo`s#iAaf?ct66sA%8lS1Eg7x{1pD)DPtGCP(SQpZwL~ zlDx@Bv_C3P?Js{FPzYe!O4#GIsi3=O zlN<3$J*lVsjSr6&=l6%VU;+$L${o1t)frv4~h7fHX^la$=1 zzci3~N+WoEQYB?YtG|$cmii`Thp9aw1F!^XiM_y&(rQu1Sn)XE_(DAvdV7)A$Tz)3 zW2bpp`DB=Y^^|x@(?r4P;xR)!X4-!7_OFGhztS)9>aWsRNA=S0BG2+FNn1q{!adl# zxJ4wb6OTt#zKj=r$!CwAwBb4RGwC;~7^(K5sg2Zc<#jR}#NPD9^XfbDc*F}jsWE5J zNhh^e*a<=}8a+VoKsOqzsbEhTZk@tt^C8Wh`o5rUl%O2D7)Xgt)F77|GFC3Cs16H; zzD?A9$P1r#={nh{5q>|06O@9k!#aJG_R;#*aCQIzZ}4DH%`!N3~IB%gdp6*?zGz zxwlmZ0@SP&&j1?VR*gfZg4rHnh1=SypPJ;XC`unZrs+&)&!EByuc*gm36gc#A2`i< zKe!`p?g-|8#Q*7joX9WvP#zQYbn?5esmrB7g}}p0lI#rcJg3iu($FqydwTAEw=g=` zMXl}gC%GzDos=C1BAM9{ZQ0x;oMKW`e>qpC^d0YqGMTw|%*%M+lfB)*DT#=Nm`X~F)W^_^o_YAutH+7Tzm#3KXonKc!1@^Y2srBT&Cc$N@ zq)CgY;&t_yk;BG@x^-7S!a3~D?rOC3gPo$4!d5-7luFa-!=CDBJZ|(8*Y) z?VzT8)JSP7z0pSx7Z^uzgt~tov zLo5`Q{<%rx>q`Ojd0&8io2aka#`Jew3=X+JFbC7!zUmhMc2GYK?D~EJSVMPc2UeW8 z3ShgWtD~eXv_D<_LcknI(mQ~8d_T38uh882Dv|})?=kl}vo9G>hDjR>wRco^N$NWDJuF~r>G}86 zHZYL;{5@6iK3wLeG*Iqt3J1aUpdIh2(dM%kqi`;9m2SMJ)^aH=j0I{#2dK5AeWVOf zBR!|C;Z%Y~;0tCHb~Kz&Mh{SfFwZiA_XJV70$&=d2dJ$urOOAX3tT5MkZSVWl>ffk z7=v=*eN5hw)ZqiQPSg(BCW#vcJ06Pgya?C4mK^&21C*FTyFXB0Mvr|5f@jU8^nvOd zwYEsOQ)g4X;Z7dYkz(Zp-VPe>L}mC)#%-*AgS!Wjb)c#UP;g7}POkv!{Gr;|g<-g% zh^IFDLo5;pN&QfbW-u8J55;9n(3)^-2&ExldTx-~9xx3bq|O9e^&6}*=TXXFH63EI z;Y-gZPk1Q8TOLz9Y#PkvMAHxuCd}`KsLVF&iy=I5(-5_mn_<1vEH`~Y7_24w4OO?w zr@X{$8#_#G6h5*YPRe*c;~)wwl$b!kWMvqG6%SK)qvM`_5I`6nm?H5YEy+;pfY6R) zs2|C5oq0`#i$7Ak!>UGbv!G9~cEEykd2|RZ_yjXyV-!i9yN0a&RF#;?jr^H<2aohS z5O>`^S3BdqU}yyFg*4TL`dvI3P1&ET%)@M-xCAL2qOm7!S*li}BcEf2!49^kZy@=6 zp3-V2TE(-`fpWn@Kk* zYq)w-o)G;s|LwjXwjh?5^!C_vB#l%zOMBQFctpA+mcn~$-wS-&xM`cKSR^)ks=cI5 zG=Hd;OvT-GAIg;faiP(p)kSh%JT=YuejsIMs{Lc1lD&-E5YF5YJ+N=7!op}!7R3FL z^hXvjmP)I~sFx+@!kJ^$dJ=fxws8=HdQ#FS^MlBe3|9KpA!k>qf9|0gVK5_`*UZ<= z*)k5>if!S+)VIwPm%`y+s~sd6QeB3p+L;2!s~<{>3p2;7iIQ}N3MQzR<$|gb<@t#! z$(gQ{9svuw@~y#cR8s3gQ_9SheCX69^-KAzQPYBN)ybgUtk6i z>NH?G>GQ(@lspB5lbV})APSZh$+gdUFinrMWsWlyt$QPcPWA3bql@T27=9oNHLZ@rm1<- zI=VMajo^E2nA1WVfF|cGp~UHGqdKC!-u9Mz*x%CZZz;^M(u-0))aujv>FU04Q3zRM z04x96I~FFGfSB@TsKLhfe&Tx%R{9;=_u?69N9kvZoQV$2q;@lThX&77AIMt+8CF6} zmCS0}K#T!pz5gAQU};`)PPDolyVKxVYRS`Z;yZ&=W^h`5_&1#R&fw(VTmPVTlz;Xh zKcHNm=|{;qn6ue*_6PNZyaCBoq{gV(*m$K7Y1?cpg7@g+Z1n|c8->qNW8`cQ zUY!fDQJ(|ZYg*xkIqF%)VKUC#3Jp@S+sP26TT4QVUN=vJ=EESXDR_$!2}<*8A=*NzG;`C2Bs zlpduHd8#5`JxWvZ)aLTpqqH|qT`8TT;qx*7&e6}}adf^~AHU?E_#;s~-V%?=;;~*l z%6f^VE0g}96CUSfl~)zbHzHgd8yhS zu+%g($cDbsq=>@=H-4s9iAc?BP|Mo%GtvXKspGsD-g zO?PH8eDAVRZ_L)q7VbhyVCZb zx0Xgb+(9f?t=j#=O6&l~PiUWF;6;fYpZY09l_DaP3*I+i!;KnY9I|MY8ZECYqn)eN z_kGrsF(6-%2Vs`}aGIL0Rzu~=b@aw+wO{QSr^Pp}$6NQ4#52xe^VzzNAF;73J+gA{ zI-Osw?vYPjr{x70<5b#FfDUcl%<_otdn+3@lUkrA#CKI%2|AK&u195M)qEChBiU&; z&MK50o2mIPD%Dv&pBsJ1+gaka&EkT<8TMm3kls+jbpc$TmX&Y*DE#Lab(Cz$MluAe z7Z5!G$>aW@Nx$(0$3-ck*qDj9JpP+%wv6SFGpJw)q&z636Thj|OP;< z9uGvrj9>KIf-PYxjoJe3o%I)*zeU|5pP5VVY*k;EPtJuwEcQ?5sA4PDp>q_ojX%0< z<7gc%9;?LT{5JJ@WC`4k&20+&Ink|!YEuux#RF?8_VMdr?%PomCaK%GB78g*9Dzk@ z^Bs^DQ)s{rzOqdei5(WJu^yAeO-EMzCcYw5(q6dV-Mv^%@R;oQma&tUoFYng`dN*o zn>(>rizRyyVN@Pl}(-ZsbPF&^D-$pj%qjW;8gjtsaX#;{M+wdUo?68AsTda+?AgvA|MBMV`r(1^(s)=Iu6j0I;^+jq` ztoma1bSYM!XUp%e3=wb8*yQdJ*{KMcJA_|5MUrR>Iq-nY(xEVB=DvRuyy@kI~gsxljrbB7JQ zY@~vHpz4?-*x2S!y(3~!HW`Crzi_;nRvuCN1EIJ_+!lmqyB_Qi9gMrc4Dzjl@Qk~_ zNTH2Kjpnv9bOqI85wVyDX(5A4%IaUa3~ns+;y$pk(!<3zNHvHr?M}+ltKvMEX#y8s zrB{!s30T^P98(9fzVG6FhZf+H8by}lyzjfkBpkMUls^@tUd0CAomlLWlo2mN+dZ_gYj4y`!03UAegZ6rrgZ~=x zV*5v`IKhYfkf7AgCpkmuaneB15ivKXo>V>L?Zyb7n1>O*bW&}}dU>?U2zwoK%)VoM zlxf~yyuKxW8TFkIBYgcYTaQk1k`4UJDCv+P|1!EYvDbcOdcF2{}|LWEm`$vjC z&AWA0bZaDdOI(U_&X}tXDn8FkFe=7!bY66p3(zO4lC$NEAm)H(?^HVbF%_m6xCNIx<%Knnm;UOUNAdq(Eb|zNEB{YFN z>!jS>Mzzm#LhpPYt6VC5bsl0`&Nj9ajdK$Q09o5;74kr&yA1<>o9Ik;&tuPjj#`zd zao!-E3Oh`cc|)!1eaF$aJDi<|(xwuXAsQ!KYz6hb3FZ)0%4d@GshLFmO2ITzXizDi zLlaBY2#7Sgy$NGBS30`5rPRhY?}=IEbpiXdWz_0|V4Dy4aM1n>oNYdQdMG^pv4cwy z7df%P(-qdZnvcZ?#(W+d?K=oAlN;W1wwZfTjg8D)Qx<{AAY@9?D*D)f|SJaMZ=378fRUnJ@m@MuW zFs`=hiW-SLQ*hpfO&ob$Ro&y^XUcJ0Zw$>;(RUVR#6_7Z=N8m%C<7x=+$V&zQg zc@@Vf`7>$!RVcbs>A+P8{S(Ft>s4$%l`&&sD8})UBMZ7~TBf$(LdN%$`qT3W4^^hR zS^gfw_Y}^|x=d28j-e%GYISh#17&Ik=(F`TE_DpO#s%r`uW>POtN3;K8ef)cT<0># zj{*ys*SQQbTc+DPpgh=loohgDU*}m9Z}6=1MAk_+cvc*2aUBHcJDP6a;1r!Fa)8L0 zKr{d8k;78)lLM(=-Q?pp`=%NJzP8Xnrd@JhRF#ev$z00zTP%v(wG@lR5J%nOWS@FV zko^(?#?(`48#;fB)Be(b4ev4sB=!I1!@FDzZ_Rw85fFd=zlL~)0E@{C1%E>nU$TaY zdtC5&iBa!LPQ8Y>F!?rbd=*DT6Dr0}%8BW*P~4w_LE< zUk$R&D;H#o_88f+&Uyc4?}PH&zdE?q{*h8EII4$KaE`hTzc@kt&YN>qHu64v#=u{1 zfS-9st%V`nU<@HsCSmk8+A%}7?x4z4^0;f`K%4BdEuOx(D`4L&VD~PvmBSKISm z70Qbo+OA?!fhqiHV7I;|u#2Mw1G|wh;8Gg`2YVfuWoo^18Yh^R(@>yAnm(MOG*;%WJv(P%uT7C1j{cu!_GvK$JwQ%OFVz{$58^>+I zCT(bZ=`92|wDf7mJaMqA2TU1)O9Gg35sL6(+NW@dN$ZZ@%`|JP(8twgtvU`wj+?bc z(gyNy)0*Ifrj48SDJSwXh*|$u9DMY+X+}da?M4# zOc@ppr?=kd+#A%?TdR-j+XK9{i5QOxZ>=L9EqpY#@6Gbj8e_e`L5Xkm4yJ=X+Boz& z%~#9fQ|=b4Cyeg;YF|pJg@Y~HH*7?$ej1Ap-pXI=hQ~C2Uf+3tjoBRe1Zbb2hOq${ zz8$nYKRe_a%f@`f$KCD8ya9_fLBppEU+HBfs2kBNcWLV2oRVZ$J8tt4$Iyb`Qg zB;Ni5D!LyVRA>p+esbms4@JlJMrd861r!mfZ4lM}L*G@?;H4{4^Oe3Q?`qlz5Xi)8 zT4Vg$Tun>CFH4m6B7VIZrL6;ia(wjYT5%jnQ87-ubPYQh_s8t7OT9pQjit zl9TOtXHpOxosn%lAC|`|DU%jdV;%|VM2waw?IgEYEymPSfoqS_wkv|XP0F|2*v--( zFR-V`W=WH6Nt2z)??#s(50f&*NTR8+T7nCkBHvL?9L9~!5V{?!xmUdz&)Rd1(;Arh z&3I@RimuEIrqnnsS(;loIZk_v`6RdzuenNnFOUiG`YG#1!%Nay6!i z8>WaH0rxj^E^c!|L_(e!iOLe=H*$M$SCm__@B0=Ffiaud7|f@c&j%O9M;rsILv=vlr)ySvfxi(bW1{f1ZFtYM$WL zKw}mH$XJi^8feu}#ij<@R3N@{L+uY%qgN8I(VC=f1z{9Er!{ifSzTG+Oo>-M3L;Y@ z%%D{Iwvl#0N+}%jycWyKWH;9KgN?rR0&4n({(b?o^-y7C6D^N@{NqJVsH2*4Lfz9; zYvnvtSx$$t<_EF6Liskb%BRwCbnWC&VY%fi; zxn_rO`aArTCq0fn?m|%m<7-g!<{Hy16&RUp1_LJL7hWq)8&Z^CXlQFpwr`qi38;N} zb1j|ig4a;&KsY6;(L$RbZ7y8ZLTkg?zSB}`3oohbjQWfSKY;RgM}5B=A3dqy-rvFW zaVzi+xYcN-vAy}aR$2xgby}mo6dK%GYY%pXGxCpu5YMT#76tDRE(*?is_hSUc=OCo z@70D%-t1Oq=D@)wN_;fjuW+)WwPN_h*=?9yzMQVM(Jta=X&)_y{Y>hkwWsG_(*8o4 zPdn{5DYbBWJ1vlPA+yXBNVi_rjv#GId#x6`x^JT5`>Db1Uc%VN(jTs8n}pye_uB-| zsLF5BCzLom&!0MMyW&HeU)3rxwCg&6y?#S2I%-k!A&EBsV6G=DFBf&xrhpqY>ZG-i z?@ILd$)sTDM{u(J59Rnj3Ya$fk}EwfywjSp8&>nDN1e1O@;P5hnyf}p_^%$Vsow(_ z_G+(b%bk};DY;U9LmU*1SmNPL_X_W{qG6qzn`yN7et)XgMeFa!F7>g~E^aTt_eC5D zmH7e*_qu>x3IjY3oGZYwqEeZ^hmv+zwxDGxpnn5tw)`VfweBWnkw6(6-GW^eZZ1My zGBP5mXz$>r)V`}WPW~~DD#pV7Olenb5GGLPZrWP4fV%^SVcd zI)lUt`=?=vmzL9`*R?WvF85pzLXY3jn3A_)ca2#zcj&G$`{r!%E4$JonKG?05i@&e z%zn^j-n>ITZea)Vt#LT5$9qLUFkt34PRi~*w5BKUm>I`R@7mL(H!*Py6VZ{)o^#8s zaVZ{F3VFS-Og<>Q)JvxB^?F;J^1XPa=29}+?v25L!2%kcgnP|jbR`%087 zMa2uFg?!c<@w&wEx=_3pzVxBCNHTJk{|gXi3SxjqUV|ah+@-9+faM=rK3J<0xdFD? zRS)za(lG;VTobd*rHa8=fR<6r5U{bi^vV!0m~2z7^e7%CsaZofxW5k3Zb>jN8mjG) z&mxiqGp5-vOe>+EGPGXu$zxOy9v$y;4A0DE30JR=FPK*^R%=ohWbLJRBj%lE!MV8Y17AAe|gq%*jA;-xz0My z+wtr`M6!z}aMKddQ1BEzRatz^Wg0FT1ap98GBoLca2=Wwtv|40$NXn6j#Dt4&GD6ifpY896wR`27rHpqVzOv6TKK2611 zHN*eOD-zJph)WPWf0_-6#ts)qoFi(bVfEX%y3P@mw)|47(`cr@;x3S4hfnx6;F;_g zbJTRwfX|cn;-si*XvBjMO3c)}&D<4%Wg3-#sfC8|uW5?6y#b?-4=MH&ts1o)uDN+U z+{1bpD=R)EeWk_Fu;H3(qhC zHww?4rUX9?men8;eivP_3KA(Dq1A!Gve!t!!jsaJu%`>|69p~&4!N?A7X&cj9GIpN z3>TKg{Dv-}JLAp;cc28vZd&G42&R zI<#&tm42lqc&xJ(t}RHQ;b@S+&;B-_fOe$wOTr4zou<^aLu>SHy6BsQ-{e!K^S)su z>+w3>_@!YBuIfsS+k}MkuW7a@>kf#P7{xtz_8~IyI zj8iY=5`T?EVkLhI#oHQQ1YVVun_ycn$n2D1H&64z+hqR6_Tzc{jY;8|yeyh!onYWA zc?USLTX?u|{4yxCsTfRdYGwJ_Uoj$o+Xu55M;6bXW{Uytppc@2Vg?C&tD=K^1~nLq z!7TT)1=F@y)sk1mGo>j;+-gTv`JyTd4=JtW^Qtf`tpvdqacdFF9V#8Gg}d^vX(Wx) z0^~AL&Rc|jR>}kn$~dhatoMhE)50ToQW|{W+KJ1UBa;P6ym#=*mB}0@)TR6VAnG?< zv$*dRjgI%HhvT%c2>v}y+4Zk_jtUScJGqUUyAAN&R5}S8-^{NyvwYi+_9nLp4`<)f z5D@xlKxT;w{Pqe!X4&chM__e$f1{aSQ2p$|nC%$dUnPH(dF*r<0=P8-B`3 z2Rg*O7qLziULsBT%kkMDhwNg3ty2P;>|$ezoD!pOU;;+rx}QCCryW;ks^m{o&it$1 zH3qIkAWmhC4OeFc#3C-GWt_ia3q@(KSwvwJCDN4h|EhVnQFDoaV7IO25?-@=sldf! zKPqk2CM<$~PE%|#>>RjUSPX}mZKAzIEem~MdAy)LSYYQpD1DkZwLr^ z{xo~YG)Ju^#t7aN`ATf{-W2!{fzT}5LTON&Het2+=QP;S*;`?R0Kwz7D83se?%+VT zAvN|38m$zgHo^Tj@;Ao)m+&{n{ipLc#{Jh}6a@EQ$ln5Th7kyU(TVH?6YU(vbi|pnw5fl+>fDU0IsPIil8h#0MId*XS zP`lW{9mSj2!5J-L2Y2&0?U|xA@5xYUi@FA9DzX5Et>X42id7^QD^?NUavm7RHgqCn z2Xkd7GFRQ?tvg12zr&%?I<}4LM&Er0;@e9bzSF|1^Q1IHK@$Kwws!f(hR&p{K1TPy z)0$&@*<`BLJeh&Q@Fe0n!AF!qZwwmX6>#v4o-L3W2oD5Q-fM$4fW z5F=GZF93B2*9-6u_ARZ0cx+>VV@Mk`hF)N`p%>sFFmn0NdI63l`!3gkWfZmR1tQ#C zos>)Gs(W5^q1cep=v9P|ADZ0i32ovp~i8)M$oebKq#_4_r5(@G@yO{eWW} z=WG=a3Pr)3t-R)(4);Q4Ck~ffdCjf4FCNQf$>xK{UNsL$pzuOzHidyvHKvWw76 z!7u;akO4P=7ejRCZ!9Dk(-naYPDZmVh9npWx+e6otAQ*g7?-omET6&sg@&P$AvsM! z+LM}_n@5EvjS=ke2 z-fhtjP&Q-sHLux`5+8@SbBG3XAO8y~Ama(K~lssvaJZdz0v`SIfVX#Jd z(ld%~H;U%(p!r88KhbEBD4G8s8l7X5EZRZoHK9zc(&lDSvgkjQTy2!B+-A(pZ4Mmm z5=ARn(lfv<+s1Jul~elAz^IuxopLSTZZ9oQ@)6|0)1FbhWV=9dvC(p|qh)!DQI@AY zqim6ATApPfd6uKY@&r-Vm8Ydq&W|nuIE3evIQd7dHFI&F==yGL(tp&p(c%4VJK{2@ zy#r^ebYQYk5l=JJ&<4!ojCRLWX?G&e9vb!^5N$PzZZx{Pu}XKpGg{(lX=36T$X(-r zZH)sq*b#6_;z`fI&qChV*N(EgtCZa)%JQUVlwBtPmGXFLN}2wWt4o#Auu*0-oX3)$ zQ99cwJ=xLr2vK+5|_nGhnrDw#}Tb6$Pp{~o@22#J4`EStMh1#14Ur;*H8Rt2<&*j(g znY!8?;oX$qz6r-6TMsHoL}0xe&*gi_mSOZ(;77ud#o`UHDTNVJ(t>?F;!eiS8ZYsS z&~6Y3)|6KF{F>(L-Uwpw*@6Cr&;5?`Q5*PLu-l}_F3)MB@x$Zn5SreN4lYSfHj@V`xgO(UhHM=e!#53e`CT;z}jy^gjsLbD)(Q zq68uK9?e&_hZVvbPCbb($elWA%~cW(+h z?l_H~c3kU5W0LfDr2Aw!$q9{tox7(jLGpFBo~usMc@4huf4-k=%4EG}K7a}@oz%XU z1=hlIJnrq6c@o)MfWURbq1Cs^6&8e%lz`Ncrx+@FJU6U0?Np%OyUQRDD&re?Pq|S zQNqDh&Uyt<#ETYqKZ*Uw%hP1|bZ7K+sDv9O7}f|5Z)sLur8QehZ#&L-Vg_walmr z)3Th3uV~S(_+iO%q4bT>f#iM_77~{z;wo&5)==xK*vN0pZTM>~1W=iARqKst0jsj^ zhmd=j*4!ln&A|%hhXDc9rwry-DHL%{W8OaesMz!{hI(An8Y12v{F*%srv=ww{H(`-^ ziE?l9?rp!Ry(XHBp^8US0;%pTbnA715K9?@{|TVcx3ox~iQhy6+xt{kOQnkv2Uima zjI`;N7V11oi6_g&MiF%SZ>>7@j(_0hn$3nFfe!WkrxCsRxAvU0n5O&#ExzU zuM-ZJl8F`CV9d*T6e~FBR&W)S>|}PBfq$>0x0*9 z<|!X`2lJT1T$*e-DTmOxN7~Es!WuIaILAtU3`Uqj?>*LDm9v*n!DB52&l%1-f4r_A zhP_iQN#BmgEj(lyw|rN02&7%IKHY`s7=6fZofhC@_#RXO;Kb-_7x>`R!w>*uwzD2C zzlCGu^2Py$dz^Jw3D&iTO#18aq!e3X3Za%R`dn8CH|s7|r}B^CC!t@2-i^Au>MzMx z;U-LO6;6e&`in;PLbF+aNrK-fR1rY~-1H{44{P1@W|BO~EQ)x0*o#mf4?UYCPk1f7 zALVcYICJ+zU*}n9R2n=69j`_l>N$fdT=e&-PB%MhB586ry@3sry(0AqwD8lqh7{lF-E?2t zT;R@d){(4XI?mdT~7m1+sSMd&#*SPO#mOt?MF*bo+#J8XD@)SPOD=#0#AmYod; zzvvU9zwHJSF-h58TAeBm4sJ{-$IsQEkWk&?$kjGfziUVGH(~lC(BrCk5;yXryl{Pd zHHJxsqEKaI27AURa{CBRGf#`5jLb!B402o_h0AEB;KxbLrK;GP$O-8QY!w1qr4l2& zeV40KN|e4*Di$6IdqnH&;li<1ovuNJwPN(@h(lux|1f2jugkd0Ocu;a(%+SjJ?WkB zxdskOC|kxUp~gaP)n*&>|3nGXQqMP~){XQ5^hHAqu8oLKHnfvB)lAf_a8}Z zV^={FLz5kVZAu2!oqJwiFQ0W5WLD5v?-C$fdG*7JesdouIM1i#&U+Xzh@6#lBVK2Y z0w8vVP~8NO#j|D4Kjg`#+=AjL>?9Uf*PCHmVut)u@%tx1^q{)_7ys>?+qzmDTvFYx zp_d^rL$yKaNHd|$PVZemFSPDfq^o8H=T6(m%h?|!J_ZJA8M+LR? zgqZhix=Eq5hc9h6;df^P=Th`Q_P^`7;0tqb)moN0I4Z-y$&YkaB``uGymDu>*~qyyVz8NJKGYp z^}nE~T-p&Y0byC@)|B^#ZqA*$%^6Xksx{SM(qH#l^5OZ`LgO$OsP_8%`mp{b&;MTT-kS7cn@Vs_bPb_ig}fgrN1n&DA7w~c-nVSW_t74rkEXwKE@bgivEM7~mGp`yH(uqaJ%rq*@31{U^gr`M4T_C!CttS_xD z){X?M9nPN&tnKXN8OZeBCYa|kMrl&4R~W;3`4xQvGaBdY{vYWHMA#V!v!Sj!$j%-3 zAS=J`X1p9rTSS}~UwFN-4RxmDbtF%u6&>`JG`*w#u{27!bc^VuC&_C~%m-Qsz1vBD zh1#^&JD87>S#iN#kZJApw*rkHB8c+QqppexUtC_%lU#yu=ChZ6>7(w2tzG1Jo)- zFGgFIRQ+YhZ0TW5!)RElZUPy#URJG*@Q=MCRkzu{Q^T&hIY1zWozUWJfo(O5R?(|n z^r;U?fPHm1@LmsRmAVTi7oqQPmoWeUi#j~0(l(g!Z(>ck4_W8Seu509rtHG8Qxk?`^nU@e=#nYRFE*!)yE@5}e={0&fcZB-ze>#4*}# zq{47I=gW=(h~&!qHRmmTyfm9q6J89UCVjzO-Vh3?Z~8(cf=M}3K<(+PZT*X_$ z@-!eF6n?#*{*Js{b|fv3aSz$=3*4sM2L^AUoy#v<8(sw|4 zDOBrSy(vESe-|7MKWDzDH*nr4hf_u`1dBQKp1uf&G0^M1imj^-?=l~my=J}-QYxgR z_w}FU16&zm_^bYYVJ#_|T7RIomk;vv#*}?3$xJB^&zR`X5A+f6-`#GYeocN@jq5cE zhkdB`ljJ$a>F^+(*;73pq}Rk6i>QrMyzxi)>;6=Cp~RGqa633ye+_=kOP7Yhjqg8U zXBApeJcc=W`)4o~oD>QjqO<4~E|gk6A&A}{qQ~)i5QW$|3=6=#A-Y@is^c>ACWTNj zES%et<8p2M@?#MlU}26Mp;^nC2hz>t*F1onOG6;&ccqx2`dg@d^ibZ&k9eRF_)=$$ z>>H}T${T^kru%FbxgtlWq+xn>p6E?EeU^k#W`kB1e|N*1I`h@F)5(GeV-&l)SrBa= zkl5%x`&b|BHE$!9Y+0FCj+>&nSs9^HVD%Vx5e+Ja#b3Y!qM(qHG?SX%R6qg@-wV(DI|Tav!K0kG{4%b@I3dqUJt+G#jl?} z*V%Qe&7bSXi8ul z^Gq7V9y@8ummu(abW|j&U+Qnjd28sk;rgdQ&bHzDVvd}v26E`r5qf-`&u!+WxEq`iZq^=~+WZ`%-@o~c)_`?<2s zF#ZsZgMl7KZvP3xU4UFEOOG>ix7KW6E}aOr%v z6G^|`PGDG!piyIV<~Lyc7@a9W_Kty+3(^~lm2W3~I9AWVL^?ZGuVq?gQVvpTx9)*- z)~98F4Y8CmPB+^^PV^b4*X#DKa_A}OmH)P^xhuj_kwt@GXGMn{g&i0@Gfod>VH~t^ zdUG2_U;G-&)p+XjHRQ10Xu{XP?|52{U#`E&7~zvNY^)AP(q9A9J1OKFJyzcPn3BK2 zVsVQGeuLZ-Xv#NW5Gi!x8@)F2NaOV=X?$VKc)hl4V!Im3+A%7K`cKqbg4@lX$hqCw ziFyqX9(Gt)1_V*WB-E2iEhp(QQPZAaos$LY3=pjI;V~LHNoT%CXH4SN9GV2Ma98od zJ0axzEoYKu++HdDE+nu9c%%h9kQrNn>%zy(%M20VNWv5&5GHYEsKH`SwF#sZlk^ZD zt_y>u5quMXb5ilQ97KZ!`%LD%aNuOl3)f86f5go0GDUwI&c=V8qJQVy8&Sbir|30k z;CK31{PJVJg2-j6J_o=2#joF|>hCko5TC7YW&Gx9w%|8`xl)fvEFK9tU@lh(ptnN3 zSvjD+skDYYuF};UjL=l_{~k-?PHOwT-UW%%zSrxpNDhA6ng`L*@3D4VrQ1l8rWS@z z!`h3S?@rf;g7}V2*K081i=%>DGlJ;6PfI@=@p*}B17cQF>I}UO!kiel25ijfe;___ zr@){+!@sC;>(#^}h;VDPTJrlwU=w%Ya#Vyhk^Lkm3`GsW0zBEClJ3vY6F7yAFQ7B8a5LgcRb~YU+ZUr%D|jT4|_*>i5mh&H++eA!w4njW;1a6?{kQIB(+VU z1_B@ywa*}XH^g01cM*k5bVCx|Fv0_wc{l1!ukS`hq(|ENa)Hp7o#ZkLLdZ^fZkC?l z+!Nt`a%SNWao8-~J@=z`q9lKM>*MyWH0=jHl2**p-TWEzI}QiUKU70N+aADGV|r^> zt0?);y>xY!-oW%g0t-)iD;KtZk=TsCiR?{i%l?);jC^_j#87CgGiKlt zA?i=yRiCI@H551dQ1zIDbnORGbu#${dasO5J=7*#i;@^wptg3kPY$Vrhc zRYLSCU=v^bsMiFW$omm=nMxae)IY;|-jWJ_emR&r%!XC~ew1eG5g5)1v-Jnkn!<5& zbPt(HY1#9jEVxAlcX0HS{oeB)bY>nl^Qp10VWP;5wc;tW5l%w`a`g_V5nd-gxY5!7lA!ikQF>F3x4~K(1L-Ao#x_H}y&*GTGlja9+2&KvM^<8{1I_0GN zeu_EG==+l%FMUp9f6^NU@#UwOIm6gFIhKVxGb?K*)2^TN&ZaHFIMzwuRxcdwio051 zQPgsQ{tcv2zc=C_jg~YDZdJ=$5us7popd9vfkC1%-b&R_^2#)9x6&43x}?yj3;FsL zl$+Ec4re?E7V3k668K4t8Wc-?7jaG(LKPpwQAw-Rj5zvZk?w&ExbgV$8*o!BSM#RZ zA}NggT4=%KzgRB;SGl`baFqy33jGS+(#dXwKWy)OtPW0}re9!Sek0JqPY%XFC-vTTi_`38Lte*J#*RT3~{2Z|c zt>Nd|-`G#;u@-ydRO(U4f88(C*mX<2W3%Ak!Z>O}I-f{?IR@rT9(y0)Vk= z6Le(w>0ZQtt|-za_H)%1_LI78)sOJ`w~M@s^pL_f+aT^Bz0-DV%zM(T?fT!yJbs71 z1c`||^}42^xaC0w7n4IM<&^G4V|MCqn@>0c=KTKKnA9SbpQI@v$ z7<47Pxr@~AD4L5oj=_M_yW{#Po_tv(=bqrnwNC0C;TGj8&hXlf4WLOU^^>UT?Z5QJ zDC2R8V+Q_l^CD-5vte1{F*I(S+4Oc4X^Pmb4B9tYkCOE zeSZxcYCNJuqFtf!S`Q z63&&6vARAMu}QXQ`b9((;t$yAv0tzP#6v#fD@wo*#scvHCZO!YQOAd$aHzt|K=sFp z?i7z*BIBMwdkyh)t5W|~nomU*g!ejrPya;zDPB0zctT~xQthfSlgTOGd0J5!WR{2& zR~qzy9}nR~wjLGrOz|hnff>HslJMXI9L@gjK^2!x0W{{J&LRWN@1GtTp;WFr#0~m_D=<;Anm;JkIppz-1El9fAk=E)?(q+r0#V~U8X~m&v09xrnLHzJ`ATX zv5)l=LY-QTTCEInHOM?SuT=~rq*i~uYNql|UCg7!Nc`UvtT@K{9~7*1DOxBi%|?(! zzHB?OWgCWboVn2AqdvaW^7Rhp8K)~RvN>6hG^QFAXL`HXCT79!x56lI-z0eRLF#BQ zrvHmF*sx`?N&L@H1{<&rGLE@SHW|~{x*)JIqAnR%K0wdea^+l%M8Uq%J(Ad2?7Rea zsOwbU$qP^AQIj2_RJE4yQ|KkruA0g0pCDnr?6#1C$j=~yQd9TJhUnf0?v>0+tH8aI?H~5Jqrt2_A|vym_3%&f@Zb%$@Zb%S z2XFAUMz$STA1hxMDp$nbys;q_Cg-`y`zX%He4I;Ub`$b`;3Vb4wY@xC6YG>3hp zI8d?s$sEqS401Tr$|iPu1d4#x>Fw20ejshL5!pU=_fzd=50SQcPDCW79US6Msr40` z2k%EPOwAA1S7JOi05R1LH#6!hiEUoio$cM$Zi|*VTKlRXtlsXd&EoB6>nl8K^Ihq~ z%v$;|4`gj_X~&YBN`34~JVxY2T*Qd{e#D3o=|C9^s)MwoAACFx>c1=B@!va9?7Uli z#H0$8mxy*K@r`*e)-gV&T_kT+6V6w7oWlldKxB|f4ka9jvcimCO@^^l+CiyLn_ABf zDyaIvU_~~myqSLw!)_7akwpi21S?nMqPldabfKU-E2AjZY)vUhYGX*GqBkctqN1JM z{b_cvV#7-^dIg5jxhKba&}VoMuy>VCgp96jt4uWcaTZKhgB1tXdv&nbt1JDRgzzYM z2svirNqZv{ujqW9mismQKPv@+wT!OKWpWR5RPBdlR1~5la>!fS`X@u^k%s;;bhCSR zPx1>@xUxUD(WOumr#H!=*#2c7>vY2C`t@U)6sp8aC?POT?{>G>RQHlu(K$#pZ}YRE zCMVvod+k#WDouONN~KSZw^DSNV)I{iUcS(Vw#+?Gox_ww`9kDe>iSZx7gFb!pXBW+ zj(rLpoYyAWX<#_0 z8zhx*L8dsG^LUsNDca*VTN@kRo?Fx@Oo<~FuK3C}*=S|ADRzpE5cTtdp9=BhEr~Tj zzbIZYFG8`|6fsM2J~F9&`6~K2LLVjYT3fo==}-BBsW6(i2P>r@`4w36chzVY2m zM}f`X(AZ0aazQ3QsFI?U_@LT#fcixgM%Sm;XRn#a>aT-=p&o~^gtLS-oDT-5) zKtYbjDKUbAd|w=b{hvr#?G+@aYoK@vU@U0tk+yb9!o3%#60dGXDRMPXVo)~&7g6`! zO}uV0r!GNMq}Odl$#F)&F!j1?Kjn3gH&7x00Jz>j&=QVLeUY*oDlkYa&?yK9qMLFT z9HiJ@6|TqybxFv&`GSPxHlwoQK`E4UzC}1qUUB8m1O1>!8p{a#6Fr*H8E*sMXElVRI3rAZjeip?&>HGdk5i9?CgQlw zXd=i@4YhdZ4Xx4zUa5v|)Z=u+*i>o7NzSa0OCi+1soYLFnK(LTwx}9bi#WiI{XG5D zR1w(Rto&0TRA{T0@URs6!5XrVq*iNRUfc{{UV5#D?^tq;)-@9h%eiKvxgY_dCQdA? zy**^5XsSglg;%_`9|N$G7nM5 zni#J{VExaF7qzr~&-tUgc32u>ihL99*!*CU%BXpQ_}Hifg=4xyD5fwzn06&7j|uK7 zlyWM^+9^3viSYkbV^4W253iud5|!5A-xen-+%R-9QR!>kVx(tY+!)%_1+0#3i%}1* zB>59C03xOmH`G9l41$6fV3y|{;hP}DY8b2{{wD|uK!?x)tfiusN~lIqrpjMlkU#8f z0d{OLU21`kZ=vLtVza05%R-veQi%+b(3bzn`@);Y3G*s%9vtXxAXjm z667OOtMR7prL5M1zw6P7A#(es>jq;56XdC{~ z&ORa_5o~6hplxicWJb=1sX_K!npDtpX)*Qyg-dEDC|r6wLE&cNVihgxC|kC-oiZ8S zY?C6`-Z3fQ1BcS06eV8JG(q`jcZ#5CWhqL6uba}jO6mzFlM>o1KB&{ay^<&>-oJw4 z?Ewi44EEkDl}DVN%GC=9V&~e2cy{1a&bC)POk-S70OUf0T_xY;-9bqd-+%j6JLqC+ z2dtB~XjBI!f}{42|1wUnSdEOQ=iWgVPtQF_=_k|&=uMMS-(Pt{P(oiYXs$J{>jhU@ zSh(@^gOp*ebTxh*^b?!_pwGZ2_qn+TCK@B&~7EEGl@S5zpB>qA*Wpq_m>cl*}8wku@d)?JdNw)6r z!UDvH%DwHhpqrql9JWs-4_8^}*c8Q^&U90JImrbz4<%D7mcR^3PE~qxAYFBHzYxkz zRi5C`?yL)oL&(>qbVh;RE~TfTigI1bEBq(J(ksBV<~|)ruS{jJJ{IXW4@=Yx%6LHO z$^Af#u)`d0hD5hF1~PvzEXt!sBwLDp@M;LHPiK)dqC1|T87t3LgwnC@kkP=#jvC*T zN-M`UH6lD}#xy02Mt`OF@SF1IGMiIj-%9U-q=p7FipGu}A4e^FK$5+1kV+rKIyaGD z52Yi&?cGD+jCWBFrA@8vUypD9^LU1mAw89`D3P2oK9rXBMAy>j*PaRwC*JZQB^#Gb z4~d~GeF&V%Q1b4jZ4D(m6if5inDIgAvy5Fg#uY)aN85&YNh=Fq^v-O=IQ;iN2ERa^ zmYx8sa1|ajv*_sMfKUroC&Y)WY@o{J(teCmZ7Ke=WJ|Th_(2tAk>~(F_xY`BL#Zor zY1M%`DvSM<2e`_DD5;N91fqJpkC4x^x^RA&n1#F^hDiU#RjC^A1XbR2mEs@9xOVT0 zZH3WKZ;qlb^;Nh=(WD(KeKDvdhv=8SN&<=$-u$)^0P}p!FS%6}L@E800RD5Yevr7* z>0Ed;PPGAGEtd9EY{u#xw7Q?thI5Bz_+stu(Z*h1glQ1^UCxgw9xjLoX-d0>ZoxoT zZfF)I?j|OrW6s-;>R(sbSkYhqg17hrUG1;A9pwUw3*(BI}S-WH(wn_#rCli);ja{vT4H$u9mkupLfKWO?7L?aLF zGzlh|3k=(K(&!;dQ$J}SgrU~y5r`zg1C_?SnRd}kWV}~A5$oFFKEH%&!0HmI&bj1< zAq-*$P1;zY~AQd2`r_(Y50zdTOv}@_U12 zlN-n;R}B_T)}RtKO_pc~+2lsN$qD`^SJh0@{#AUMI6)};dt49|4pV$6`(Y)s3{hgS-1CRxG)yPwP)u~qenK{et2A<`J`c_0Jggn6_!|`uN_U1k=;%<8Cgd+2 zs?A0Ml@G&0Oc{pR_|FbqhBmow?x3N=^cN-araEZD5WJ;i>ba=KR+r=>;8UQ-RIKTw zRQK@B^5-x#Z`ZY&?Y{LI-|oDFqaPL==bDF=)_nJ#d02^uK*LkD1}@))q}Puq5pG41 z$*m|tyPyu*y#(PuCV4gVNN`DT8<|n79(juwY1YYVm~P*-^4N7MG?+LNQJE;~nlaYaxlOn)=7$y0ksUb)_C0 zA)pbWoRmd&%6L=>F)lFB%a20;v>!i5+lCe1+{}IDKYvsSHEg1zk18#ojM9P<-mmdO z8Rh9#MgeH?6(v8Wv`tOZExkS(YSSu}M<6%T&btDO0$MwnRja@LmiBRUv+VvJ=^LAu3xBlR+s}L zs>KH6j6>oWCEDVYP59&*^o=p@)u)s%W1#_OP%u+Fs zQumMbr-X4zv@sirUnEbqyRb6cP$5{dxSO}@vSc6N8CWtQfShJ}Ey2m*7MxsHC(Kb> zPB-FasKc!83$htik5_i#uqku=6GA^d2}b`yEsN2a1628>RDZ189TH5vpHjGsV!=~T zlBMNO3<36M0_Oq?CY|9HMEvdlt=nV;hGzwhpMa^{0l(wqst_ukAQ;`U2}&o<59YNS zA1rvii~*HF)bDAWdM0}2X{9IJjsejuzU?S*#v2g0>uG2sA<($ajzjSCv}y|#o;UeW zQEz6WcF!o?t*f~L4@j(a!FEbb1S^_!w8G1b89hiJJfq}cr?#62kvj`5E?;nTgK&B9g~!f_}qv|%9TdQGcVtx#d*YwMD%N}z0^Zrn+kV!ZUDFc*Cs2W zW~fO*sO-ilJAFD?8EQx?TsgEQ&|48%N;sh0TFh&BUyp&)e9JdVtrjFdhGpu=^OuHE zKtYZNMQ_OSdC#*M-ZwdJgVRGSk1zhcV|n0~Gy1`6{;j(xPX33!drtWh^NjodV@eX~0+#A{%C*vYZ zj+O<7i*hvTW#xIk*7cz37Rnw`5m@kYCxb6O7cfmp)5On)y5t#P(eZpxI@RNx{4{Ao z&FhItrZ^n#C1w(b#m`FuAq;-<3ZyVB z+{sy0kg%|5&%Xkt;UZf4f5rwQ0zAy4Q|Q!mh^krCVumuFtAR8q zpBCZHBEWjHgrd8622Q!XR60ZGokC{{y;GN&Lhoc7uZGZ(nM!Nu)Q#}Ma2>=UKQX$! z7rnbvwbPX{=xO@Rg0^x#JvmEx2A^&5q^!|Q)2_p12g)dCwp2znk;}~8il*YA@rE*L zWwua8?a3C(s2lPUnWOL|)d|Q+QW@?ef`>c#rb(pYNsH~2lcP+;Y~RRHS{l<_g@Ld5 zV!OSVqWF8s7~x}FNfbCUDa1?IB>_=Mrj=9w7)W2fswknHp;Xf2RUJ0@+JH@>e z%Q^}wDd;eM;Tz3Zaf`|~GrQ+4L9v%NAwx`L3i-@dh8WT{_bMSom%O2vDSI{yI$xD? z$&q^#d0;7RE~TQ`3QxjRBXFOZ4O6Uy2=HQDXxIVdJ^0Q%d21i;&Z z{A5T)ZcGBify#(E=*>A`qiPKNCT`&WVvf?;yf_+}fU=(-=^)?Nl?O3i>8}gfuj~bb zy)cQzfKac0UE$e`j&BdOQwtw254wQ|7SI zAV->L1a%$O{;r3=d8%ZMILoky z=t}-v$R#z%0_@fm)OD^B1r4m(dz`^@4uxf?@tOAOaIW z1oWS|N@wHZXlgT0c?`W>GEWS{aa_>VK+2n^*lBpXtcKKYzOZEuov$Q`kHZe<{p#jh zBtx!Zw+s0jg8M(;#<=X_hemXK2@avFPp5j*@+FG5bpam{BsD;B+POsW^f8cOr z^1CJ2``|b$mq3);dBX1MfQJool|~?`y>m60Y3Up;GsRQJ+on>8m5izYW4U8PJ$N1FDg7>1%Zl|=W1 z-z~LYcvDQcW+c!93uCta7gBnS9f5Z(g>oi$s3ju2_f{>G$7gTB;Q2|u6Ur(+=^dy% zG1E?ey@kUO6X&y(%i!b$C}tQXFO{9n;1Bg~q&X2LreLY!2Z6jMdjI`p2di5k7wC}F zOO>|B`P@yeNnL8-GP5RePooxZE3trwq`eI#$WWStJ7Hqja{=HE+W59GF&ueYni&3g zTWQkqW!Kl56e4r$Lae%LF^D}?(-J=E0t!gUgMu6TTHv$fmXK%W!?rt(3UIMZ4d-rZ zdEJJF&=2`app;Aw)D}2;Q6Ewo880L1NiF>^ZiW8$uQer=hsh#lXAOq;u6SpypR4(QJeDlVOfC<>XZskb9*9uF6M?7o`^_?Yff)ITw~5+i`$HsT1q!ETd%I%_9jYZe>u@4-N&;-{dN1l7V?$96plb-%adBgwc zS~FMz8UFYCwfSpsR+?z{^zQJ~yPa&NqtjKMmNam8L?}fsR6GN$x|Il=Bv*&5Tq9&F z6E_$|kmX}3R%N{YHd5IPSZ1NLj}>Ra*4sAQc2f^Om=Rrn{T9gohBKE(tdU1GK+dx{ z{1I|yd4gcjl0p9lQSryhqXowr87%&DugTe25@__Dg{)T*&a0j}pi)u~r?-~ziM#B1g7rAwrk8^bb@oOs zisec#_)eGokP=D>E0kCvI;0EcS|C;D-HDG$bwk)nnhuF2)D{2};Dzdvd;0@tqS>kFJ{IHGOv zeGzr~O5OD}7tgS@6$FFp*1!-$CBsI>Qc`;eqDrA6EO)gmpkpen@%$ zj&)K=`%1o9a{8Tf(5UB90x4#_;O7DtW!}A8oHV*`rY9Xl0c?!?Q$B9lUzpYW zHYhFlhRJF%BA6C^Smi|}%QB;VL~w2>v1ULzEQ*70SF{1EK9`E8+|Hs-8$mo)Q{s!a zoiuKv@}3aEy^yosiii`NpzO<{v`s?d|9q3OK>X?}V}Opnge_k5%56`2xft}4N7wVC zvVs24gBL3WoCds*0$sy}Du>Ogd&;|@_ynShif%s{Oa-5U9lMhpXdQHJ79-GdGgj45 zM7PWfqD7k(Z?77&T+wDFf|FzuSUlGulL!=79MV3-B7{4-wOP5z-8F(J>s$|v?cX6D zWd2NPYJSfE->ocfC>Fba1~K(tTK$>Q!+7jp`V&|4QUmZyvbcY~XT%H0j;h;=Ggv+0Yb04>x(|2ji6Ja}NQ0X?^a;#|)x@}jU z;EE)p%bSw7e{bi8V}H0#DgBKb5U=ss3y2o+tj&X3?@*>fK3%s%D3r>sSH#lwT>uqF z?NZv&lRK3bSY|*u7aor`K#JV3QbmGIenyg-2;5vIK*bGh4H?Rb(gujZ_ZnITpUgI#vYy$NegnDO#CeJgU6 z4`qL$bPqmxuI{wVJxAq7lxuQhj>pAM84G}qwgovAoO(>j6x%MR!A%D(t~NBL@Z*ZN z^BmG&%3kVDznZrP8fLN~6zA@&cN_uObMm+Z)XoEh@cJ9KqsZ@&*rQ91Lx|e$i=>-gwCp`ps{kVrp1>bRO|NwfR+5$uff#+`~R{Quxq*8ug%E+ zWW)NoH*C%dz;KTaxF{mfVb^x_&{hE%217sf@@LQacq&_iTzj~s=&2vX641D(`+e{} zOCZrppep!A%|9VlLIf^m2v2r8c14Nyafn9YC;=WK^yakt~dq%f3-R1Vsp0n|Ip^l{k8VyG~$+%&8X~O>(0vd zQ-Xup9a$LoYn&m4zAMe?M$RTxW{P^DwFm7ut$fKj)avhk3!x=vgjR0X8Ko=VxYcK1 z%B`Z%vjYDxIrMfIjXNteaZAtQfUl%;XO&kBm+A3yN-hZSwR1|(7;I`SumFGoLW^mx z6;AOjN-u>%{AZe2s&vOXDK1qy;qqrG0Aw?$O__M>tTOS|+hxieJj^+d-_Ftg^UxE& zMHkNtl^zTNHC{P)pR%)l$0_^tZ{n2Ivaq_z3+hdN7eJ)- zO&fUuI+#;u>bsg?Q9N)#Y}atN66OBtm%Gl@j4Mha9m9(|r|Ici^>7Skmq5eeke&uI zrXh(0lVjCJRU+dowyEU!T}krg)J{*Y zH>Y0RX^a(3!Xf28>jDHI34FFbU}+bX7|)`wgOTtNBlgloF=Co3^nNY47lGp==G9O% zgJX;QF9{0Q?2M{odI%$ECo z_CBN2HYLra#ck2VZXBS(;=`9xxE`oWz7;=7uQa}jzPq9`ajj}IalL57RqQ7LtW-`) zi_pzOwJbtq){1b$NkM?(zBpNz0G0k+BfS^>q|+^-9YSs{kgd4O_o!8ZXF3XC-wC~z z(1o24wX9oC;9JNyY%l?nGL$_@>?$BI>nX<*BL48N8rv<91fc3z`F59R#K^nk_6&A; zHG~y8>CHC2)N@lWui>*(P>g}p9!Ft@-@9_LHS#fbJ)^vgUa zr9KLw?cB$ITI$z?4!!V$7@t2WJrwwWo1MoGq11<_TWI>?OrL_@BMd&Ax`yotqU_%* zkwENeprt-3SG>W8848MH3~}^JIgaYw{J)ezJi>mC$qNY>{{sEpKwJM(77Mk4g$(_? z5SssQp>)XmTUiI$F2>R)gx0hh@1!ZW6uTj-uxp74!?~mF_y)A^mXZUUXH61uL8`18 zwwXue%lJo`VO;jTKA#y+LAUw6Tm^H#ue)~k9j{ph*~j!+0zq<&*XrsSQxE&;@cu@W zad}3l6H@%r!}oa2A@Q2O0OSnzj><2vgmVucI2I{N2F7X0QTXl-e@hMY)KtBP$XN-C zK90b?42EB*BiB71#(ifaDB?wEJ%m>{*Wb`VCQVXC7i3H>3n!||YkcTcd9bNUKMX}(1HqxDrxjph0;kr_mOY*uT*?Iq$*mr&r^#R9)}3~ zDR!; z#H!%tHHDt27Sj8MYUNYI{I@e$Z@?V6WOwX#O3d3wm}I1H&E>GJk{wMU6H2+VEUtp-9um)k^+4edYN^EblAX;ul+SU%4!+_Z$=aI z^!V^hEc||kQF+mf5PHzWLSzwyLPrt1elV{4IMC%KUKT4~w%o)V+~!kkVu_tz*3E?X z>yn`U0$Zw`1DXlNX)YKw&k$C)abin@g;LDShVwuJ_3Gz=#U+i3p8Pz}0-R~*fkg&0 z<1#(XG_!bcT&Yvs82b@)){+T4?Ubr8i4af@=vz`80tduKj=FrH?hagzXCUX>+t8@x zYl4xijJ=O7uyV-JP#S&9V5XZ^mVgIQ9;~M~oIfsUzpgdpp zl6(+I8BHD7y}c@fsl6ZL+QJ@wby^We=loc(tO3j}uMyzS9yXNHcz@O%5%$;mGmcvL z!Jj39do~0xm*I2j9v~h*9l)mGwPgW}D|4IMuw^-)CfzGW+E^@T$<`bjYtEx0tqWvA zgUyxjp*4w=_u9!II^)Uw=tU=V$Mz7WLGD_}H%qEXHHshk>r9pf$zem?RL7Qatq80Mgov_#aO1|i`@##3wZ4Km`E0eA?Xmw zq(@r*H;5KMlOkCxp621HKsuZ}$Qks#h3R_@sB7rW^b($W9D!j1FD~7U zo4-2U+hCFeE5;eE!ueGCi4nD>cck#Qj1M>I3Ln|908@!<2J>^X`sS7sLND|5z6RbSys zW--C9Q@N#UkQ1LruX~@3{@<%fU>~HPgueeb#^mC>SV9Cw{V?oUM7p9 zVR39Y_h%ChePBO)xOUwvn1Xt?YRYw%b*W`m-t@J8(&S8hCEW0}Y()_=nT`h&x{nME z*?fF>VME3NL5CW$nfSDkVvl28jc$agI7fMn7}p?dYy=82luk9eV+;E?W&%f8df?SC zj(shDV*FrA>RVy)U%1z;3tRVtTNfr_aC=2Ff-CmaJ@B^dp_xtGZQ_i7VEqXp;p=!t zftr)UEKd&DqYl!vrfkyxOO58~OPx3kWCk|l%@R3WrO3E?Q?YxLh_iSBrBAxs#nV;E^zDopCfkJ+nQIs?`)0Y-`FdjZc^Ki4}QfdqK zjy%_3!+Pm~Flk+T_d*r7t_8PbALCNel5w?BMN1~^vB@JdL;d3ne$Z&UF&Qh_*jO5M z_%`=_EXWAs_TRNt!Vz-g$V?c!bw*n6pIJO{uyXppc}Lqr3w zh*$(;;$dfW>xsd($DrHBby6xB0}sv^;Ga7ggR9Bx8NS|+Cquxyo{@>fmaSMr*d#t| zg;8Hdr&@sn8d_M=uO*gjL~9n{W_pcorq?K#URP^zlxSXWx?LVvDcz1^luU1Xk2{@* z;0q^tZbAHlgw5D&;pU0sty#wwnyLl_O;ehgkPXuvD@xOfxz-#E0&M|->(GXA9NEfN z2ZBMVfk7w_tKrk{(PU?QnE1Ldr?>&%I*9IGjlWB$A_Eq2or-^3c_^aUtpa4w47aAK zFzfB+7{HlrnUCj!b%CI~Xlq_uc|4Z1#hH2K{Xmx|9=hhmhfrl(c{B#KW89}nQ);<^ zOLsNvuA@#Y!R*SBNgF(A*HSG{}}7ES}%eNLPk(9Y532tR=QB)!7{ z_7?f4z{MJ*2ejEmxs%@XApeP({*;}9jdysbRJ<%dUQ6*}_ycF}PPw(WqrhoU!W~cqNX4qJ6*(u{KKIzNxC zG76GKZb~47Jt%O|WF(>K%z{vQbLU!Yj)!|~dWg08XJ^*D@3>kT0I3W0aIZ}dzBa`; zdOX0xLrhLF0);Lr}y0H+1d$d#R!Qc=Y(v1zp z0DjVq#aoX27;J;Fdo#2UqaS8gT2P+i=Oo`dq{Kgnk=R2$A7leL@#e9)1AntRXyb!8KCtlcnqaP>IQJmlzM7JH zu)ZLD(|fR1AblHquw;y8Sr67+g8G_J25TX#$nYZSMU#87fySckItL(Bhuh`Ro4dX4 z(YtRO&3}l!5p=s;X3g}343A`+0l55IPK|pp0L%*VQVkLGbT81{G;&o{IA~oj)&c!4 zOZG)dnYi0#`m+*f?X+Fh-UTCF2;(w?5__{g+{J(8TpL{cd&`r}2r0ApF%LVvru6wZiN5Y0UsdHb(kpY_e%uR&q zxz}SoLD-9*3A|h1teKXvUt%Y`DFg;2WNA+R{wY>EjkmhDOzf%Ej`|=*a?6-p=l2D> zx?n5V`$0~8nOyx?4IDsxO>EVg)i090BnPC#Q(-?SY7miX@1c+w&@T`?Z6CP_o&*eV zRYGY$jPqOM*I!aNH{7G*OMOl`KLw|-;^ypu;A>yjozrDs(qjYIs~pr=w)mf5N*h$= z0l;|002a+%i@@o95fMa_2UU4fmw`fPF8cvssE^ZFV=u{6^2iE#1KER^ko1(mAj%DD zUmr_kuMdSI;BXfYJMUGe1ZTd|f0 z5Gi14;{f-&+S9^x2))=Y9Ced(C`h1gCURPw^IKFH*;@Js(w{8>08Jaj%>41Ww!XoL zTzzlsl{ZcMsv25={K2f3P{ak$vvXkrpD>u!hF{GXEE(9GLz*KDuvgB;n)f_Hy%=op z3N`9cwvFLVBaU{61>Ez7ZV$%9?1Ap-;zCFM$P`!MvG^#1zuV1#`@BX!TlAS;P;Ai8v<>=M-O1dyg#sUA+pycpzdRa4+3U^&yES#3)oT_w zE)W!eI(;7pZ-np?kFz9yrQFH^qHqNP|5Hwr9%mxp5meUj&I_rs(yqsGoTZW1aP~BC zd{c&l!AIX31XZ6m-ETK|xoK65`46QBWzI21RC0gpxSp`!V%su@iRy`{yusL~TFq@lpWW915v;zUs1k>W_ zIsrEWKhTZ`GeFFTQEmp9t6$%Cy5jKcb3ALpg=nzO66OS6(k#pY7R|D0cAdWzhIKiN znvN0Yu;ztzzqSiXB-Fm*FJWsOxG5zb`ehMZox2{=t})_7K81^MDpH$1)*1=f?M6Qz zP46mD53x^3I#d%Wtm0FB?FzvTw|tccFa7i$i?^8a#_AZ52kzLs^Lb z2ODdMMd^BdG}3>^jI9^rZ92C80F_Tu?Y=byzgVjm6f=WcJ~JKHti{ZP)We?5J)$Ey zE9)7}l|I07-W8Vi^d~j1Tl%s7IsrHPSiH?R`(r9z3w+m_nu6C>>jm*$o??%Gw#n($ zbr(b~p6Qm#{T~Qr0cCxE@G;OJ*IvXV0)S@s{9n^`EsCI`AIR^1@qwhG@7KJcXqEn5 zK}A=If^oU4>V9|M%9>ggg?cTyehant7mD{=-s2_dX2k+9o8L8V#3N)PzVFW+8qnws zCU5e87HT<=FOIqI@hnS*240UmOvQV~IcVv#45>+ws&?R^5c*_QwT&)5%ebY9(tlcy zWan2JTWC{sRbWBdyMj_ikFRV>*=1uJa}yfKWhj-DjrHa?$$KKgeMIbq1ROof*HO#K zjOW@eKT{>6Lg|d+$CJS*P9b$NnwCXLObw=1S?nP*yfwYZFaibd0ZhTBsh0P-Fe)`;xP zM{P%r0WUFuAqLCi@CQ36)h|4*!V$`T38s(jRQM8mQlNglX!lp}sf(Ek1I$jz)EIVs z@1VKmDgFU&aF4{1)99&!Q}X2^Nk?xT|AwVg{@@=Dnsl@>mUjM7<%`r~kWx8M6H2Ks zfd|_N9*5HxBR?*Ii13%pBS)zr1g?!-e>ZPW*|(e#)Ut1d)i}FAA6*{y3poJ!?u@+k zZr#ycgJ;;CFzr>GZc3Ye`mMdC9t>|=c-FumN*W0Lf5#7C7w6tEaNr50fxE`rsQGjz zB7E&`*(4fKmeB^v7`?Ou6%B?ltaO?FaZbA^c_Mot?%1-rpPq|nI$uGRq7nrkpLZbhonIJZ(bM{p}&&C#qU zI4Iv4kMI)}7*;li4Myktzs??$>d=USi$?&fET^T5S$n>|vvwgO zbC-}RPrABTh$C&5U_(J(4ScH!;=3Jic+!j|(8&WFt3ZCZzC?%&0l89zeaEiNXj;{r z*5|UGDBO}EWWcp0EZAQcQVrGgs8BKkYB^#Ho%YP=N0Udc0#CZz+{-(YH0(fn>ioC^Q`3kU6 zbxKtXjeUzfA#g&0RQ%>Rcw@hXDcVU_-(sD4DP+arrFt)AAy^U_OIZsDUb#yJx3_jF zOftybl~^TbYdxP$4giUv$@94&e|4;%9d6!|s}{%cF;RpiR`FQBId4l2Ug%11j)AOt z?QP8E!Z-D~6l@S~`MD6hFRv~^y^u?%^V!1MaSFm}O|6Mf?MK99kX#-O@D_mziCDf7 zaM(xKS2?jWW~F%Jv>oe5Z!H6>VWMZ_F=3^4Z!;yH8&|)e@?8-VBlsQGkMlpr{~8xY z1705Ig_}aB(F_&SWZco3cldcoyWW8vZzmd{LL#XV-`FrMMq3EWKDZ4Wy^p=mV)(Sb@;-YM z^Zn!dfRg-3aUZZZ%xkz`&xSxy!@VDfm2&C>K^|g1#3^B-DIc=dyyhn#G9D4P;cC_e zFBr3$eFCEF_mLpV4}Bz8f~F$y(*poWrE@*3guIW~ARp}95V;Wi$mI|B-xeP+Uq2nK zB@{^%y#_R64-Hr&IDmN@ZasM<{Q>BlSs4;`NXMe#3<`UD!9 zy>#dk6#17rt!1wQ(y?#6a2Xp)E0BkQ$OqGFkc2yT$>3=HxT=v#40ti$i(lsLPCyKa@PXJL&* zIy)OyMAZpT?iy%zRfq7UXNH4nBrFs7rUewUllG6VP z4QXPQDOr>BmpJjqTcPcY4fU5a#UF={(ee!}w!we48=*E`+)zj4x_72T=<06cltQCF3IIy_63mjsFy;HBhbWY2EZNvcn2S<`_KkH#3C6U2q4B*9>jsdRjL!vU@a5-h0hB7aZ7+n- z@U7V3pjz*oark;pfD`T3vSan&q)samc}EvfaoRfVyg|?=;SUoGH|geu3is6 z92~AyCqi8&+X#B7gbl$+EHBaQS%^0!U6QvRDPhkVL5{lYh4N|@t=-GM1ntb+$GSm- zU^SVz(yhZ6ickKLNIJe2ADMO#CZhRt_#kTwtpviq zN($^lJ3H5M)BLvr+WQ!Bzp9;&tFi`UPGz17pD z2arEMH^${J?5)Ved+lvI^*M||hP^f8HrEt;YUXW&t7MzQ)d-t@{$a7{H5&h48(b3} zL|EDXI4lgVvEPBjOry@<34zJ%YD&kQ;5?uIj+I~@+8n{;Od&eLI{Na#)g%mmdiEeo zA;(c15%a0bQFa{D6L5?jyvJ&}dW`*rSDZNxluH&xf6t!e8mA;WdXUA^+V9zV3lF%I zOc^`AhS$LlYycL+t{)h8dTw}vjmBlp3C5%3m7I`O+fsU7FJvP9k##U{L)=x$`3U)O z1A1Sunm;liHcZ*u?L%nGkBs}aAOBHkUT*#?=ec*AGZa#&#PS&_cTTTxYVb3di8Si?GmF5m4*MC( zGj6@!O@ytRo(`e>Nv<;eslNwolZ>{izJ}FKu z(=Xc7lfUz@OC5e;(bBqmP!HKsn7++q7?EER;X&E|o;FkJf(K)$;um(zxcm*Bhzdp? zw}SRAe4{QE-ST=3?Jb?HR})(0*`ij+vDtNN<<34p6Hl|fpuNdwB=nYB5d*iTINq@V zkDQj487F`-Fz~C=S4l3aGf32`mYX3}U z?H~{ZM>`pu)bAW@Ub%>mz+U0zNW-5{m~dP^q9TDg3@HVdwU>sK;#k;AD@xg6EVc<{ z0-gF<8JmHn-TFMFs#P@hJVeV?H0QkFg|?n&3F6FK@-FApITN4%o8aN|VC^I4Z#V}& zYIqN?d@U){&ELRUo_JLsSOEfjRZhpgSL+U}l2bDso3iy<;wa1(wIYkM>()A5y`LYT zzX)%Z{1yA7Y4SsvoeCDd4E03nMc8vic#ghwGpK!djc%0N>nHWf{1BJjt$g|2z}}fr z1!qGIUgX@DB7|aK!$f2o;K33gb4e(e9upr>uqfCQQ+SBZC6A{_z(Zd|b*z5{%bck5 z70CARj>%fl)pXq4?J8?*T5kw1 zJhmzhz@*eZi##cM*8J4MY_q}OFCxqsmsgRYzRDx+%jI50<$o|&+`_8;b)0MuSBjAm zh|Pr+cT~fzs8(^iZnZD)Oy^J(@C@>60=3U%t;?)#tu=V2*Sh?#UQ4u*-~P)U2>PdP ztz)++QDFx#rg?!Y9CYkDdzdf(z;PgasW&jN$ULeJ05czN2 z-sIvL#^5)=JU;4#oLg;UTNdUHj0TMe`CFI)^-c!U%}VB~-BT;2Re^)iy4&woO?MaH zV%?0}tyDbjIVhpGXLwuHE#bV~=sA%5EXv2Kb)+oJq&GaP8UTnj|L6_pDLD-P@X31s zd30CWRJ-4`n(3;zs+SYfgLxZ@Q_sTTsrMau#M^soU_P%Wv;gcT4&R zRlh-f3j1e8LE8|DHL4s7JsKCTTqrWCpBd7(4l}9Ga_HaJX0dOJk@(ZK7GgcaGNtleIWLix}U2!S<}jrpY>Y8cJ;IDTg5$U zoy0S}Z*cY1D6BAm{v@_u(CNCLT6S9YEVp*g-uxf-Y~d;WYhomE%js57#qqk|+d|#} z>J!>oOK$|I-GjHEs9WsT4^(JZH(-wpaHw4^5UwpQT6vcV2$B`=0xHDZ?jsyoU{RV5To zJT7c3F6&l966TsDNWlD~NfY8Ya;eBr;ls67GG6mKgZs}lHGh6k^JfwN6Cs|tvZ}~1 zA=b-jrh;HK6b6tj!D@ex&nm)T_gqh&A*$1`f|`Y>5!NeJVf>8B__o?XBSX|kCw8=x%?>g3RlldLK#ZyBM`Exe}pRY zIIRJ?`J)Kc<|iF{4KQYN5ZaOmRp|d$zPt$80AILmA?HHHN>?LPVLUgSSr%G&3V!E*PQN-z>`T7#;8l-=F-NA z%I9c=yu9udl@B>Z<(fn}(w9N{1MrYe)lO6{rKPc`TuM9St)bfEIA3s;+1zbP`ARWp`qn?F)gXk;)Ae360bmXFOeX zg@BO)Z7U4LGaIS(k-Rsr5f~>O@O@v;2^ou5#FjTP={Bv$0x}wl}4*8soY7 zdYJ13*K&?*ta608ril2j$TlxcOy{|UVJqft1$4Es>J5MT1h;U(H9QzS>B?w9@?KjL zRmApbLDlt*k<_P&>MQM?E#3A`X(KxbK@>*MhmEJdyMt2VmQ%{8!{622GqdpwUA-CCBYHsdG?o;RyJG98`(Ex;M=rS2_Mk(w17S7Z*M zoEGXBp&qo6caqxGN1EMamcrzgY9?1d)hELtCs4#K)ki=%tVwD=p`b*Z#RJiHnvkRp zf$+a82|$=tbSeq-dKKMHQh8?9rpcl?kA;qmHl1H4#y ztqb4Ot+gD_bbjn4oFwJP0{;WSai6TUe_!2N*?6Yc`eKh>OYl{=71UzQp1Rd8>=xD5 zdKc!!Ha9dO8~xLXZ2kU&*um3P4>ytE8IXlHh9DB{I;cF{Z*dvG`cpe#2jM7sAjR24 zXN78&2K(bBD2wEXII#g8NR9$dpq_0HSv#s6(w)B03-RJRssY9ip||Zo!%DPV@7G-_FuwV?1cA{Kwrtct_z0y?<~i16~)G2Qj4>tB&xRxQqONhg&9@J+xU z#wG&Tz+=jZ;Byk@?M<${5kbC2IR9}cMBx=Py0aRMbv3KAD$R|@c>v79O(iYiW0<;O z5YkC@R)uOXw$Czn5$uVuQ9u`!Hz~3Ui02XN)}Hp2{JA%ks5(rHB*_rQ!gpvr|jefABf#vcOvKFnLhtF5xcO~62&cQb){>m>P{{9 z>=#CWo3Q(~@GElJ?sBQ2+E2OKPYbo5uHmOyl2^QJkhL!GtH?ZZ5`Xd3Bd4`rpv1On z%xsDFXgj}(!kh3HFT906S-I0J(gu3sZ;>Y(?cr<1>Uw9Vxmmq>aRDi&dK^l?|D*8X zYJdeUuvH*xbrb?hTo}Ow5x|2rvnHcf4Qnb;W1?E6zM#(t^hky zI!c^x0z1;2ehs(?Rp)5cB5Qc@Ag^#`>Z!IAmSJx?J}=X5m#LktA{duktUi=6rW@jE zKcsr_!>`FhXwZCm>>;%cE=wL#$AM4&&qL_kUUK$Qc~0?1da3Pk$&;6Zy;Ppp_eL-E zB^+Kn`||F7YS#b>B@l-f9zr43R~<@zeN=CLih=)4Q~OiD-fDdfPGGk2x`^+Kx<1l7 zR33cC`lwIvD&aL%+{w|WAc?8UbD3T13n^|srS(&JYLy-R#HnaRObUE8nY#6t=XnkB z=d6=X`~8t-m=KeU2d9zNEI*`K+0b8{ok!*6W`DIcN7Oc=bAw>fmif?mtbx5WV1Sy! zPj@4tQ;g`PM$wu9YA{A;*8q9C8(qz4`-+LA?GtYtQU@=O~X=MR|eJx2-K~B2lH}vAmp6+a7a=opiA$KKZB5bX=+Z?^q-w0B=iU!C_*27plX|(fU^k@}bei#G3ib5U{m!7!D?jNGq z7e*si=_Al_4W*;cIf7`%BdTvx&K$gT8O#BKK}bdsJiW%Z9FbWIcwF7LsQeMtopiY{ zt&tfBwd_aL=5eK8)up%F@l2<;AAETSy~VAdx6>a}zt$)x=&grFZ#^V2T!SZ^7_QTP zDdJa2WudDk zuJlEQI0PEziVCMG!ljenEhB2k@AM4Si>gMbw!3IBMUE7FISB6<%=^ZX>O3wHAcH|v z;ju#|Lja8%CB^x?Qn>#u9HolL-T#f&^7=^M97^3r6U%OB%kr42#GCWLE-4?&xSWu7SWjn-HT~Fb-zT;U4FU5U&A!v&|<*1{4vM*ywS%N)!IX3Cs)I&60k&l?O@Bh{^Uvhv`V(qHZVQ{$3UM9c z$Eu?QorxgBB<$RCZeR}(=r%f^et0hzW$W-kph zrsUK4+j^<~aA5DHzwNUGcsxuNFNpWimRX(fs7j(FU%I5#aLF=3Ze+C*fX{Nda>#KUE+6U{4hh0nm z(!)VxW~pm1{yy3GIO0S;kCYF$7pXxsAX{w`IGZQmF-OE%ni?bH%r3nB^=w#Y0KzWK zn;+uK_20t5*#ro*NR)9pTYUpuNz&$~;7VS}foPaT8*|hWyn6Dh;tLC2RUa1O9K36n zvM73YQ?<7c{^$J`4B_AKPHP9nzoyEFRCXGDb!?Q~>XN~;rPA?tQSj;4uo{Ig7*boD zw2G(&=@V`X7Xu&iovqr9w>IhXCrj!@ePYgwL{zdfzT;6y|UCeXBgiKYp@N3sTKF#Uhsp>V$nxDJb4s5;r zGE||))sPDKnn-QpAO8Qa_ug?;T-*Dw=Nx)HNbd*i6|iBKqba6}CZ<_Y(ZpC&Z;A@W zLKGt?vQSjOUQodjFrtDnim`xE6JsopXkrozCMM#U8F-()_Y4O-x%YR!Z~46ceDD2y za-7Yqz4y%Qvi4ffdKSgaw~THy92~?^+`)|DuxCCW4xBXfkNK7^NPMY90S4i`&<~i~ z!3!+S*{2=3fPY$Zm?6MPd-wRbp+GV%u&lzz9kS5ESkuP%2jN(|T>>RPODr09503m9 z?_*Rxv&8Z~#iwAuh|i3CiP5|{lKI8haB}|45<=hK3U;Sb_SfNbGDST*e_PH7C%rCT z@pov3O_AAUO1@L=G6>{Nq}89|EM2uzd(|8Pw39oye0SQu>C~MxYmsGbqj%9j5`lLS zz1aFLrZ4`F@8bK#urV@Pf?}QjBQGN+m5=nYRQ58m$F2gUWqu+15{=(OGKS>oC45NU zTw?iLe=1*l0?zM}&j(BN&26@iP_mT|7PeTmZ-J2F$r4or+aU~Mm#SaZYe|d%y}?TTutW&nVI`m zfxu)L*508sV3{S_BV`>+;@ATT<(rvn^JvyG92vma^YMVod>Zmm-CkXTyE(i?sQ|cq`nlFffrLnBQnsbo3tjw z!V)if(pdxf(&Y?GU$zR>42Pcu6|_-_?^(MED=bgj)w#iPTJ__{2+OIE-Kb&(x2#-V z0mT&1tTE+STwF8R)6#R9mTsb5-<*UXmf~bpCiDrD8fjcMZF21IgLJ+kicmT;cU8zbXk@a{2(4ISXOstSwcM68RGm`$gylJ za|Zr%=+B_Ayq$&pcsR9LsTqpSu{CJKO3On`rs1p9&EG_o&TzkfvC6_xi4kf(8+BWnJt-@I3fEd<@bcSH*jF!wx;vT$LpGm^|=_D0K_YNgGMjVF)UX|ihyYj~u3+t^J1a@bc^d^wO| z4sLDGx@)CjPDPn^c00OGdq_@Gy^cR*rwtozrS1!1_zsJa*^***SO%gOIWvz$ zV!gZeTx>Mnb;%CPG}bkxr(*y;wi9|-JiWcsavr0tbU0|Z#_ZyD13R+^75+KVk9O^X z32G6ghr#*VuE6pQ?vo3+zF>!=3`^HZV+t)3+3;*m`NLwzlM-cd!d)I6U15cIA+{Zb z4~u1|k)+*x(>L$2uwBNF?J^zd{=I@j_K7nzc0`^GQg zD`=lvUad(9@WyH`=C^mXt=Rc&I^g=rWlo6)rVoqy^IPVVpW8r;AM|s#T z&B)6aM2Cv_V#O2rEs|^7(12n*b36?$hNl(L%gEKolbB*<Sjrjy$xpgcU0ZdYFno&|0K{fj=PRwm>n)Nd>)}F9J&l@m z$(5qMu=Ey-r7Kk*(R-8q?|%o8=K_npm%#ID5orv5xBCmg8taOj4_K;o_&mRts7slr zx>gN2Xqm*mqEVy;t2k&G$=5QRSHY&8MatsyQ-mm0BiYc(p3Cm@z1j z7O|IK5Um~xhktXyR2UK zI#wnyX$I-Dz!`d4c_A_@%XVxOlXXZT%DaiReTBg1{DV|3%Cv!a6tSwpM$gxs3^5Mn z<+g3DUQRQoEEfDyH-oaaB+24fU9Obo%NX;|ynz=nYrPWdM+E{zA?E80lYz1R-^&ae5( zG2?4CsOb3DmSn!WdNABJRP>XU5N@Gs*j-gdDmAo9%XugEtmO9-19+%nQRzuo`P5N& zw*;otpwkvNe)Mf_9i@*^?Ux9KTZuoh@e1Atmc|a_br>1Xz?91lu0D?pS|g1(qt@h0 zsM(*co}A#ovV*UnunMO9(yk0pSF*iWjk#+W$!}FyF7QeNtmC&GrBp(PnMt!GOz9n8 zf=8ja5@xMM6nqxnBc3X|N+AqfjB$L=$(QPm);*;^pRSD#eqc@KqodQ_4BOE$4`u2I zHZ|+i%&vDc7I>MT)_7M6qRRF4&IS}(v3NI^+SZkdGHra8FVT9yxlfkx9_Ut6;g=R~ zkD5j|=B8>la>!UJ-3zn~M7}h5TsYo2Ws&xG4zgRsD~de&scrK&Q>@KzSg1+ybsCp! z4oBAhgV-sQX}wNbpozg<7R=FW5%X+Yy8nq)WXoJlgzqDBMMD|$ZKbMElh%-&q)CZ= zBuR+fO0pFzMwup-QIB+L62pvhCYyRH{Lx|#Ew4Ln0~x=r9A{EX+^K4S98PJM=7W26 zZ96-9c+qkO@`aDXCVA)WbAaMb!i=Vox_|GG#Cmo44d zQ8Vi@lyCf+`v-*={dL)rz{Fm@3RhY@)rFLUhGFpwPm+Aq^0fGLS+dq!p7H@qZ|H60 zyn5T-R^kb?XS`+6r0{BjbQUfZUi;8isu*RES|6%+&8c*653r_b=cm}m{0$z|<+^1B z_DA@b{ps3uz+P1d=YSg)Yb-GIKo$!;;s!TYC*9!I;-79s@z9kf{*E=}OWN`~0K*T+|CZ$w1nXws0=R1(9ld4AK(KCrFgI#v3kS1s z;sMsB5xlz4(nFw$&b)15Bmg^aWBootS8iL{IB*V#5SpDci8DO-;rJ7KN5x<8uw5F1 zOO(#R52t+K!Mb3eG#?H|Sl%6O9yosIKLA-c%q#dV2ePR6vVR93u?4a?G!V8j%vTGV zImtobSdxpobm=9CTkW;<U&O z#Scpc*NJ9zwS;wb5Lwt+R5W_mka7smAapqgGw0U8;A6*D5jK0^o@ViiZesDu@%+4v z&XHdE1COzVs^9<9o2rI<97S>N4_qi`vR4FsTy6OnvoGz5#RDk%sA8{|A2gcaoB*=Q zGSHC!04(F>inp6}CAfcIyOEjDsNhG-z>c>b*scS6QHFKkk(1TYKgoRGG6riM=MFgf z=W*-qwf9fkTJHa0ZF%oKt!2JEv&+@eK;L_|QrBxp`U^))08b+J9`Sbpj1-Uouv3El zNEZ^G88gO(j1M^M9*jK!+5J{wVjjk_fr$xXp8petk4CNq`Vf}3VNtC`koF3XJ`ntC zr}$>C&DQb6vDLNkv2pegMtzX^(2~FuDFb4c4(~Ghk=sub0;!{gL-)s6V9iyTKXNRV zUfd|_CTz7e7A*4@aJJ|dk8oJYG8G?omtBw+Z2NMnP^zHaZt9XX$0V_Pie8fB;}-A)LMDDGfI>geKJi<+J6k_BHty zeV6YjprAGXY4LVCe}{ke(`4>0wWnO?mwQnB#JL`{tGhJ5vCd5KJ)|DopvG9pU3Ah` z{2=2`C>bA4Fw&J+iE}OKB+gDAr0m0lg*ep1Lr?rIzO0}!u+4j(#o)SwUl#ctDHH+QP_JuLMqyXI>x@wS~ zV0;jzy(Gr!La*9M&*AuG?k#ctA3eUa#Z)q;H$cR2tXWSLvM`Dyd z7wx4;rs{eLbK8zSl0SBw4i3;cE>K8c=|kMAIPhD;9i?c<$2&?BQ8=_8FZ|w7>d*F+ zK+5YawV})XBt~K~!$}$r`LX?_8Q5IT_Lm0X=Obq+9=pmZXUU`oFr%_VOK=tskc_PB zI|oRe*zXnf*DX%kfJO@ABt~&@HxBhIqOoSYjp4M$j91Kt!us4mjG2}+bWM^k4RMp4 z@W)r&B!R;EwA>EkB-KqSL_Pi8rG8x3Z!5Aabs8kS%AOhyKq=TnMh_{72mQ6@L4S00 zkn{qJ_v_Ha(dJ<0+!FXO@$}q1oF;bAX%ESSpF1AXTC}pnlfRN(o>FV{cE;nxLO}fRZmE5U~-w}C8?n}Jq18x^^;O7 zM(@(=k^c1Nj!OpMzw)HS;)iE6=Ra$j^KKmyKi8T|U3JT|r@x}Jn(v}t3Ng`u6F(uD z!)H%8W_!M>YYW(Z!k-*w&sELas`7T*b_qOs%eru;{H{$kuC4zrq-uY&l`2M=rt--* zH7TJD-{fMUw{F^s<)aK@mtaFJ1zT9scg>^dpdW^(FncpIOBBsXlN-z|3F{`Z346?+ zPgvx$WLNnCVw$of0`!Vr;!51Vixv%`tUzg;IFmY2%yx(b1W6%cBKp(p3w1^s86;_D z^+3vXspHdobCA@=|6ZXUK($DK(*gukEf_z)7SfF%Obr8h2TQNvXIii{1Z(!8V2J@$ zTto1Q3^X7_%yTWE*okt3xg|d}gbx#=7$!9#m@F*zAOW$K?N8OgoD(XwgC+Xf#X6HC z%d5-G*kz#-r~B3QG5Uvbu$&({vSo!=R5OG>`QYCUy_>PVZCF9g!z2|@fYUAGGWH0U z+Bl2A0Y+iAC`{_$Te93nw0JpvjX#N31zdqD$^f4I!=*Sp(wuN9AcV)#Fz5sD9ry{* zaw+kC?g^I|(=ST~2B%{r)MwLeImF#wKzy~*l3F(kjgUrTa(*1aCuiZTT5l?hki6OS4;M6w z{ojG_YUxnLDI7ZrShrBO3Mk_Y%6wr4^O%VAR(U0;b)*!{jGYn7-FUYjXX*+3lb zX8KA#;`ny`dXuVf$;qFD!tYq#WKfV6H*1&Y^5$=wMwO4(WKaFqf4cT*3!U8`LeCl29#+% zti04%N{>r^_Ab3-D<*%>#g0IG3XAZe+}y0F%ptRzQ(b#$tXQW4Xy>enPBf>3u)*h* z`TNtP6Fx?o)nTGLy%Sv*LN%{r#Exv<+KKrW1^e5a5m5mY-Vuwrf#Nz!8-;cUZr&_= zzwE7UIwQ^Yx!~leMKYN>Nt}LcS|^D|!!PS3wP#w#p-vKqmfq|nF<)A??xfDgULDXX zWB<#Yr8vfMfP<>oW598sQaOtocXyUrunl_Z-ASOb>@0P#t73X)^@IS>UPNJIf0xpt zBt|J%6D7rB&u$wn9mg_I6D=`MziW*275;{_C`{@2Ge#PW-KuXFY=y&Vd>3uYz5^XF zCv`xSF3^eje$g9Wiis88_KGf2s|eWk8@538^rfXN5!e8#`WXqw+I5v&*)gEYi2!?( z3tJ3_b%m;wk0qi-c|Zsbu1#_YVhz;7oOU1{Kw76Sxu|`6o(}sW|MY(O7i~ZN&F`pB zcj-HAH)6)tCW>SB>GMcIaJ7fjoqdU&N3l=cemH?`KiSDo>ITxRSg8xXZb2;Hrf$WG zZ3_3XFUW2Qp^tk?3|#lWO5^`3jsL$XjmVT`rmDD~n^W{hlR{{Qo9sw6AB41^=XD_- zG~+4BUccpAZO-sR*SBJA&idAN&Ro1;U1hV*Yf{`~cwR`ApR<*!`o=1ic2<+(`Xesc z+T1bayscOzs=|`~h^^pqMH5@WFFy?tTW00y zCLO^gH+hzxwyh!wW!m0y^rR-nojE6&)IifoTcP`3TZM|L^clX-@@FnS!JG2CS#B$p zR8GP1(r02(3Zgl4V!KjKyGgCFii{lu6U6AOI!6{8<4K;?6Sz~j@X9lOWL#fo%>2dD zj;&Np44mH#_VT#ua7?`NEhlW>Lk-@I_R8g>nv^(l9HqQ3q=78O-GCud;GTkwDxLBH7VX6F4@S4$}hDQt32Ew24oMz+%$6))Gvpc z)RB6K>vj?UP{m%9X)RwbX(EM7rV)k}+cunmGDsCf8i2%!P<)CiU&R>}!{&$Aq}PSA zVIcPrFq53xQOgWiNh8Gm1TaycD}X^P1`0%=UlUM8LF6$~V(C;njg%e}x`cz+tc^^U z(6jwo=n|e~cqF3#yp*T@?;1}@}r5(Cz38Yk7m0H%8E{L}yd2Q@DS zGk}$imj>x8ACSWYbS{I2Pk^~-IHgXI{%uHdj%PQWF3eq1H=N;inMn60NdFX?+$1lW zgPKi)<;v=lDDm7sW%mNRcxzdUwO~tw8G!6f$iTWYQ9_bp@;0|bfbzjai3KRD!IhpG zh1?@yo{t1qg2WPJ)-W%(G;!c9%*)!b$k^~UM3AK&Vw9&(gpuiAv~(hjM8m0cqST=s zv(e1Ej+CI9*&KYI7zFNas_MpLyN%;uE{|UEv5z;@Fdlw`5*5(xMsdfp0^J3iTZJG} z!X)Wigp#)vV+#bQYHb49jngWuI>9Hdh0)uu!x$1zxvxuo;3Mh4F<$iN>o_S7r?ZiO zSjD^{_47(84@0bV#qKa*UrW~o8VhO88`X&zZ*#0?G0HGjF1#UiMP1Ph9u-dQ zCnEzFS5q7DPEVHB>Q8;H%|MRs`&_KlTMpRHz{_9I7jH`6V^4|M9_~-ur$~eK6)h+) z-QYvcQzch4re;0rI8};b3+;>}zW($MF7Rj@rb-b{rR)y^X+>E^5b_L`WuwJ(k=Lv5WM{x`4?kp#5S)yuX7UW5=gnED$liS25{M>Q!_K^67v8WdZ`h4D><&N< zYx2&+Kv&lYo?6jSwQo9@+(n&Ebk^9?+m-vukmS`3{kSp>+rz%h=~AQvZx+)Ww@{zy zc-_1Jc57BJx}m^bRN}!0ssp&A_E9Rtb^B=7bjjqBo6MdG4`4(Bh!}6WHC=LYS&cwU zUI=1q6uOJ75ccLPNhqhV8C={vLkb1+=9n2$zP_ed`>J9^FBTg?$>+A8wRWF%IWFGY zL=2Z)McA^}R_yv7t61)CO^mzAcZ)HUw%bkUigV(=Z>0-mM@r_^pmy&{ zaaLSdRiPX~rYZ-P-nH;uiDh%{^qw>m2fLj2u$0fFd+$j}tnPyE9DFI|eaVB70k~1e zcct!B@xJ7Qs@#Pwhga42M_yII11Is~2GwtloYf@_KRXW;P;LuWGo`BhToP4|&x&OZT<`dX3dhQ7m=GkG#%4v@_7lkxu))>%x*s@Wx3gbleTOUq$;&P&FQI-G7Ks|RcDT%o|ZQm|OA5DTMW*yrN?q!wsH zjSp;GvJo08@3I|h1t^2YPz9*?35Rwx<4l?x&8bQlh;$pxjH*R8*QxGRHVEoZ{}e!# zgRsyJub$?qjb(B=8kqojTj6!k2U{s?A2 zZqop%Uo=g)La9B68o5#KxJlt&A~;LOouWJbLOdXuavXhWObV2w z;WRl#5=ja!eaceEAfw5r_q|;W!b8RhsM9XhM$k3fZDpd!*%7PP`6Gob1GiK4rCP4w zHsm4J-`vsUQ{a*>78iHeeu@l~X)53O?V1>e|7;ghN4MKbC811{D&49{aXtg2N5W^1 zEZAx*b!&@NDu1&kW!_&Nq}wc{R&TbIy12EoO4U1p zkvzWIFRJL)63JaBhK|00o!yU+8pp|{!DeeLy|UWA0D6(r?Aa(Wgw;4R7$$}aAF zR-Xai_bd0jDS9PbiNk5kO7#^MWr711DpPg6_rtN0&B;E#MV{l1#9%`RO9opU(tVj@i0 z{C+j751C9B*ZcZ#?NV)B#lRb~(}Hz==!6LK7Bf5TrV&D|`Shh{vw1r&XRGaSw>vG) z78)Uo7)=Nci>TXGuluKIcFwV}-o;OoWEzQ4|PXcwRilP{?`RTmD6rRX0!gK=t& zG=hN%3ci7Nt9p&Z2u_37@;xZwqc;#-{c@c?nPm4>1Ckc3dLgG?`g*9Gpi(-WL%X|Cjg z4GSS#FJX)T3~o;)x!Bs$s5+N#`lIrse2g)db!?2$@O4r;Hl1JANpapHa5w-_yf{rD zKQ`lv=)GRzv0-}PzLV#|Z?XS4yXe=L8-UpNX>EX>fAClH%s?E&4 z7lh5>T1uiT4cLGK)*||B14iOH+PZi|4GQsn)sb%v z_iY+k+QCNIOyqs(MO*2r2Z@NCXY5di5bgc;F ziaTGgb*H79F$t~iN>3V-CWq139smX~XgK!DwSVitb!OTEd$@ttj*{Eb^ew_>&%bA< zz=@ph2U!`K&JNBz0 zbXXd=KjCnL6&m0q1p-_tE=#@yKZ(3XPFg%*#cWevUM7Ihhmg2XC zIHLadDSquWE_EF9&AY`hA1Qvj&}X}GnrDOA52yJxyQOf~tg>)(5Lnp_Sh@1jUA*bi zZi$19%53X;!hUrJ5L5<(3Mm%0;$PsVLL> zcq&Dc;x>^KA$2R&R%#2%G^wgZniP-pTqLAQQf#Ga7FwmYEYPI5D`J6=l0UJPDn^;s zR&BB-#lKjxkjh$MD|LRpRVsC!CM6C}@P;!j`ew4N*lLt%jh(Nj z&N|BG$fNbgY=GTz-LVF#Vnve@A6nsJ`Yj5X-DPig*?Q*&smYzVKjcz=Re#$`t^T_x{3w=2SLn8C1hE?>Yy(Y10e2`n4W7e0|GZy@ujU_ zN#F(u>dDV~29SDHZIlsJc}$%3m_eCl9FsVVh8vSt9D~-tE3l`bayM@}bqq=vFF=U- z9oTONzdO-L&OML?E86*?GqpJ`saS0%O5XxMYtnIUj?OtQRQ7wv1wya-X{DpPz+vl< z$B?Cjj4ziy6ji$k(KP3W&8gzOiB2vcAY+IS1MC*3x1hrXUyFUYQEd$SU3>xuZxBCy z%{8)=uWg&m+#;)w-kgShjjccYu?fyJ=A^`fUktFel?_pl%I~DqLUhHK5;ltl?Z|XW z^c}4Ruguk1-_mPaWoB~UcuE=|Ozv7%CuVYQ1YAjYUg5~Wz|#!VNb#qoCy@U&P;3WK zzMhRm;5LKT>_5#Fy{o4M1P!U3DIy>C#6-Wz*P;W z(cegd4RX&4c5GOHOO$S6rEF83dl0w-IwMN&;D;Y3s#gPOitL2ObblY}cn%d+(Aaa* zB~;tzywnrDd*{5gkM%B^hL&SI#$AwFbYKA281Y&i8omK~*o7Z^oVhKbl-JyaV|i)) z1&PN^8_ZpE%r~N-28O+@1y}-v5FP$f*EIAI)z zH=e#IPJ7M2=dO)}@1bjsqs;H6uq z>I@j}e!%L$&1z*7H^JVA=KLT{aOBSfW)Y;v3?ThwX$H*vU#bjD2w&!QetYv#!2`lP zFbT;Yd(-;M(m6*y%0MZ?lab!}9LJXYD^QbXQRx)`?9#~nsx%8`yTw=enYP07a?|XFws%!==fveIsk5-jog;Ik zpC5B~LQxt;i~`rpfAOP!*QIRs zt@UPmMmOh2_pkG%4OH@h^wbSW0T?Lzz+_!Zn)0*6;@2nsqC#w)vac?{$?ecD*xeS9 z?@dgV;q?4XDW)NJnVmUneg)Sxd7^hJ-1Rc>Q8y(<)LVA5kvGgvu#a}|_6`=gq?}Y= zk6>GZHw^uAqr6G&ypgB_?y8ykhtXaRDyxz>-ZPDP(yvmu<0r?$%-wLY0$X_zQeNW<73?{Y~oB=L561nA3vV7_-Dq&BDX}CDLCt z1JX$Jk^wNa6g+m6d^<2OXV=syojo1=O)}!!pZN_3*$?SgG=oGujDCPU0hxZ67!O(R z-_?Vy7<~a^nVA2(^syT|DXVL?BhCCpYU?U;XF77@Z`>`8k}kX@C9}92*j$LGaDMhS z>RnDVlaSRI!>b9D!-cNhmY&kr{M}?^;gXH4@Kg6~M^*~TFtR?4GPqLuw>OZT^e(>t zMoOFLj1Zq1X$u=QjJ&t(w!t?$`!ZJTziR~QEv+1>7q5KM+KW2f6T2t~xEN}l^Be|{ ze7UYUt)17)iFVzS97H`1RQ7|XcStj_(l89EErRs7d$37i;Lcv-2y^luSZ%7pkBX=x1pzjr57i?NTI`}i|h43WlO|C|3 zR!vW;)XM?Q)ts6Lm17xNA?(?xfzE$%(}|Hz|0%_J2%2B`Ay^w;6ntNr<}BPydgG?d zza_KlPUIR_H{tB~m6$d?b6UC4w7+qvA4(_xmZCj2ToaH0M+~Yp*U0$+pR4^Ja0}6b z2Qa`HXx{^A0Dk^@AhBE!-D+`56}?dl5Bg2oUW*MqzNoTRO4iw(bpYnIApav@nrwmR z<18JrK!qDlIth{oC{BWl9Dod|kqi6LM1$Fq)E;MBH4qA$2Y2hEa~iw0flu0*OJ4MD z;=L~b&FqYPs3%&N~}Fa#?-r6WoPb%skcn#Zfn)k`|q0K3&|tA+BKiO z*nz?n$)zv6!Q%b8sT+vKX#rksd=&LK>l$RTQ{%ZD)%?YJBov&W@I${Hv;cDle{afH zq)}d*3d0by@>KzI7@x`ygTpwePM8PnkRr0o;#x0d@>FEqsItea0Q}ZVli(5VPSqC@ zeVu!-I^ituL5255`_rADpL8%x7s2@ zh@z7}5|g735~c>ib*7UUe))_}ewuB|cIJMRFhAFuHX7s+l&Y6GR@u(npUy7CRN8@Q zfB?T^dO3=1ymok0QH{|ccSbb>3^LnuQw{Pgwx`=+6K@c7rOtM8GA3w&oy_*&({}Pw z{EV`fJF$Jx&Rh-~`$4}Jwy#j-|AM)nK|}4#C$t1(RBbPB)|daGEnz(V_z$*%^{3yf zr6|VgvAV`~CA)andhW@(qe=5K?H#`Ug%tl`D|P=Km--f-#$i2a?Bm{!bjafuM|#Ie zPSjsV1mS)F%mg2^s2L&?qzfKjZ{MP}UI ztz6|3ur%Fum9zEvHClhTlck3DC-VO9w*A?QGVM@#|5r_lQ&9aXq*CtKN|oQXO3k~a zNpbu2Eg^O47h9>hdp|lu%)Q5n{zRY{l+hw~Fok zsfida`Dyl6m95wolxeM9zuH6$mrP8*;U_AK#c}yZ>z#5{<2!XS4K>OGBTFya)}Mqj zt^U$WniO}ST@uxwze)*5pv7FZ-dKqoEaJ4!9~+mfBcT^B+Sb42J1$n;g62dhkyLr* zwV>?iZaSpQj#+I-J$>bA|E(#RZHW!IKAP<(b6}s&MWisU@RK>Q($H^r_=Iy@7BqPl zhm7MGej1KroZ>ppUuM4X!~Sv~R;%u1y&s*K^U#a>t^;qU1{a*O&e6)spF8@Y3%P8> ze{uq3=48zekb7WT`YAv*yWIqKTrA7>LA3LOwun(1ch!NO4U}E5zPVC_m$x@f36w)| z=2{de|ERBbp_%PL`Z7OA4r5@hjX|=r4wdc-mRbCi8W_W!{|%ci^$Wo=#}5_Fsch_b zJ~SlN!I8cXkr{^b?A`tWG$>Sl8*mE2Sli$Q9**RPmfoA8bnP+&+?|=IP-N?MUv%_VsXsrsDTjPPt!sTCZkO>jb zYdyyZ=oU+P97^snlBwutlkBd;xlBz9s%=>I=5T&4V{tg1kuvjyjE5Lx+nWGw4go8TYsgd~kUsTab?kLV?jo@9=Uw@N6 zX^m-+dqJDh+?ISn%>AnG`O;#Ki4C}L!H7*r{MI633K{jzc9iqbXixravEbgf-c1~!mZRHTJ+vi-&Ws;Gx9kTx$$I{NMp5fj)^Nk}0b6IJy`UgG! zP}=H6-%xv%mQiQcn~#0(z-754&M#wm@;Th1X09z~GKv_OM8P4AJ^6Q3S@CrspghWtDdwDvjemi!M`@%c+MhBUJW(qsV zN%-l~5!wU-ggeS+Qv+HPnS&ctMLYz{mu)a#1hlrJ9ORDvK&R51@9!`e-=KsstNd}E z!y7hql7|__VS4ifs?$5kAA=HXz{u9VMY_)N6z15jZrR+I;$tu+vBWYVkzleXLm}PYqX=VZt{4?z2}ax(MI>Ol-9Jf8y{Z((4N+-?(+Ws zQY0tFuMLKV@oLXD6m7~3r>c+#_WtI*mA0EkK?Plim0ReyoYn><8g_CcDwW0)2e6Qmc%E)GPT2kDPbXwz{KVTemu- zTvfL^u1%Z}Qdy^Mr7oVbN@bkXq&GjZ3y?#}ps2 z6}w-?#XK0jNae35`QoEOxc8PesRfr@bE!OPTT3d+w8qPiXkuKuI>Mz|ryjDEDnDqI zN-1GOvFP#u*-M8JT-f2Ef04aeKBL2|IX_Tdi+A<*AUQ>lzA%z|LHfe}b&)(Dle@cc zIv5>tYXg|@XOBRd^q3s1F~HEAcmH%O+V+?{gwX|#wCAAwFhh;cQ4Ac zmvn!>CdSp>{Y!R53-b_%$@-?qXHDAOvuS)^6S`+-Z| zkBddNVp%BD#4hgB#JJOLAD1$e?>j~}o|U86>kIXF2=L?Y76>7{^$0sgw!{8?ksfp8hY^GD|CynV;A?{(Gfq`%{3pGWn+o*J=S*~ml|Tr23bgqP# zpoYz)n7yC+WY6fWV~NoNUzVBqb;!%AW+hj!T*lF70>OUsvOEyYUwK)6LN_b>bRV6H z$^?jeRiaOJr@p#zx=q<>eRZtr$*;;oxxL$87{Q-ElE}GfJCial(Ji~QpU%nP3=lx% zYw`djVmD|uH9gfNO99!P`|AYNMDlI;1+oY9*M-1*mb~I2*Xm%M{eT9KfErr5NBitt z``<%_v*dxkdu+!_&2EYrDVIF@{r)oqgtJOCB5iF?8iC{4o%Z58;UoCa2cusjrXHmsBwCnFLMg zM((R`H*(KW2a5AmVjBT^PmkjtKYTntR;(Q_b7))i1lf;uwsO4uxbSAFwlSDz3=s}O zePChO+Kq!J$Q$sGw zi9*>&(w>(nZj#(vzqe2u7JL!GC0j)F8w!Pww!pe>Y}nQ0PF(UkGj>r-f7#nt{N&gFhd9Wz9ZiNaF4=GnPugL-B9`RyvHiD;-h=X%28TAH ztDE+^TnsB%+`<=@(&ul;6S0+tPL?mQ9nvcpQS+uxUpPtMzA2B#ABHS?fpNVX7r(Go zUuVkk8qflElA7bKA~M_m96%ly4ZW#gW4#;gm@WHjt1lw7J?Y~}C4>r66I-)=Ph--J zz%n{>j?8yWSV;mX)HTtC88@c4P=ZLAgOiSddMEM2!RjP=G+H(%;ZWd_EIZkqgAzq? zamBW?FG$x)Lb;biPGo7!fK$abH&1`dH0)tB99Yos}2ok)^?-FyQQB% zfNck#U>nDy*MD*&fbM=Gcf!u?NnnKwrrz`9cESd16h`lBskKJxe;+6IoOv>feW;qp zH}JB5t@Ni4=i{x+q@wxq5xkBM7s!l%7xda!Lg4q2@8R7aULyO_$ptt{^OxdB>6Z-N zWLzjaay>%jABb5fvvj$m7V;e>fT~I6U5W4zWOD}LLkXnnjVoX}SZr*;def6er)ak6 zAYo#jlOnUMO24IW6#%&j>1=m*Z~8jqU&31lm*hZt4%HL>XK0Zwzj)#Sw7(}IM*zyoWllIR8y)Av1F6g9nzugvU zMrjMBJ)KrdM_-=kPoZxrEnOYW4k}(?7FD|^hO*Jx4o@7{`5~A}Iz99RlOi+-(>Ul7 z#>sy>IjJa9C(6rAG?DXiIfA`620I-(Ceiy5t#Z_I`6+aB^Ky9tS8H5p==%eGsAUFI zYl_~?koD|@Gi`;u4DU~ui6i20x{@hB9=6BNY!nj@q-D%s?`RelL1CPWBe7qPBw@-- zuE+Bf5cgYLBe_AXOuq_TZD!jE*m@Ramk zDT^e({tUk0LrYf5!!XRMR>~~bT<2AC8{PDr+^(Gwg*0^)Yy{)T)Ux~)O8RrGS zeYw6x`?g$dz-9GKd0@mQ+mBnj(W*ieZ)hTgOSa}lp5J0CmWDFz#ByqrCdR>dn}p)A zWrH}Gt+(E|dYyKoIGL?uclOt1QrW)lApUEwf1b>%91gCRKM(^CsxU*QT^p>hrC;}y(w1tr$gtCGz>3R^+6+s7 zb%V@}+W!C>Yq?SWko94s=)*?Y8XD3_iowHDH^~ehX4=f}9J%?Q@9fAhVr*G9PEp_$ zItg&K=`rB(0TOFXuWpeUO%f%C`vlO^!87b>+ZNcz5xlgeQEjG8qPHAEr-H*i*eW*# zhjAFzKY+t-Z00y+AT<#_Hxd1RVP*+r&&CqV%CNZ=$bu+flHI zI&YU*FktR>S;dE~$OAlVM`3MmdOROHRtcGgDs2od#u6&Y#|gkd9y?@}9tyGKK9Mf$ z(>1sraA5zM2JVmtV5ZOAA>V}jn>#U6K{~jTYy9RH6hAt-6LSj$qAw^Sj)!BsfQqjC z27trxy96}xbrMe?lzxeP6N7s{`r zpC1>pgC`AnNeN{khJ1%Kz}?Fi1XF<0o34EbTBljN#dc%>CX9I!vU7UrI?#;wKx$RF zTkgph45Wx+tB7e2-#JI^k^ja5QT2+#jxf{r$~>ez?p37|Rqw@4ltG4layOh~dQkNb zv7ouz2V?(mdTpQjKmtqFlcy!6C+|=3r7!l$OE^-!7f|kUxVJ!c2{6pJ=Ui~U=`Fm= z;Ug3m2UnBPSd2AnS5F@*`dp6G715>7WlsHWF!!a1LtVV>JlOsiQzTRefVzO=EJ827 zEPAsD#vi<$!eYK{4-guJ?|!+n0C&OCvwa~ljqR5wV00YWFXzA!azsURS^XPo5-Eo0 zn)3y|_BuNJh1{J#!&j7)pqPBIe8ATYp94c>ZQaJGB9ArWkwI?uW`Jrn=lXL87y8V-^l~=V|dxd68LB0DOUW9E`dT2Pto(H`O&r#IRIPl z8G3fS65&-L8t3~5b4-9bL`7=h&^MS~J}6Jo-(RDxYTOjHhOcT~*VkZG3+H@WG0hst zw!9uO@@!Z`rAOpn8g155RP|s2!gU8BHfQ!a#X~GtdKDjdb+7_gmPqk3`lwj=RKg(o z2E;)j$_+i|cx!8NVjOQ#_yHSTd;C1SLB_9SMm!kz6~4((+W3_`6<6NJLZS&&MB^U&1Y$k8=UHa<2HkSuV>Ec>M(5f29-h4ct=wwNOXnYs66T zJt^~qD~O4t^v8fO9eW+JFL33YxGy?Bay1VWw4E9Rq_nY43p*@ZKvCf4`&&b2XrXSQW$L%S)LT)7t6Kck6#|DU}V7AZ{ z@kJFv$7f-~e74{I96`tEhYu|+MUYN?1?JBza;ek|FJZ#4GPRPwh_jWlprkNS;Wrn& z>CLlpUvAJsGMI6Qkw)B28~W|6oQRhm|BZO*jVy9=zk#vo0S!1Ozb1OCf^~2jXaWju zBy#E;oE)H9Kd0>gt*JUw1{E@1wf0b>&&zEw9u}U*t?`t9UT)*kfUa?%p(CCR;F`>{L+14xG{?1J2(6`Q+73~Jjb)xA*AM5cR=?4W5E8llkJ{`AD$~9o>;6_A zt-qeF&0nE?W%CIfc|O}#ElER}rbkt-Y$AqBrhbK%uCx`Cv$$9R2qhC|A*@w*Hi}G> zVw=;cL-JnePsxYnnRd)XOi9nZg_O9Zvc)~KR(re@cD3dLMdZ>i7 zwmC-`iKg?(w&|OhylEWcs^`BrpRRo`PiB)u53LF*6?|42b#@dVpV&OJc7hs-t*3&S z$a&=P_9PyO-N+0XOuj$J-b^I}E$y;UkiY#P2Z-7Lb)1X%w1548VKSWZe!#BUkS~+2 zCE-AQ`v*C=9kRsfwX-n}ReFKD!n`(^PwqDGg)0F6J`SVlWv=7Bd0BqaKVBoIb7=4* za`oWEWqC1Fj^S5i7K)gAMHZ=;+;Yx_u?$boU6s3s75HfYKM1oChYU1)EwE=;BFeog zjszuF`NrS>8l3;TsPLL>f^k@H_7bNFctNY=0B-@`6C2U_{m9>h)HFPNHMojz%&n_b zW#U*C%VhRi6&wJ&aOll=7>G%;u?o7%I7$fbln?}0>qx3ELS)An0HMZqHD3VMW+d$GvSbQ}A1WAjMC=?RYXCQ6xk z1PEh)X1Hb>iN_szJ_bd`9q61hsrrt*jDJa$H^`n$f8tB3I8MG;JlyAiFX<_mgb&~4 zI%D}=^-IoW)YK&3m1Eg1l>2zCzn!bL1u4kJM$>j2%vM%a-5=;5u+e|WPulJ9fu$Ou2EMfO4|yVVAC@xv)Ll8;OBg`Jh}*rC zEowFIL_Fuydi(e*1G7cp8oXG&vGu*5eH;ENe-f2hl5|CH-C}4 zKkDi&PO}bk`7`ao_&SbDejdK{ne8yoN13*c*Q7QP!zCB1O0^YRjWURxw9`Axv71d^ zufOw>vwp|Gdfg`j@q|$`uC*_E8?3G4OL zE_TvO7@P4VGnbrKzOq4Qq@hgv@|9AP#&LP}6J=n8WGj_~GEM5}Lrsd0mxuh>BKJPD zmAX}HmD=z?lj0AGOZG}4GalHAo%-7AYyMi!w?(3W3}EzX+DMO{B)Rn>KC=2ROoAiY(f0%8U5Y zXWbN*AH18p@{X>Uwz?~Aao+vLT~Yb!oHWCsrc(;7KE^}ojh$$Uhax=OV7dn_&$F>^ zbio5Pq*0xR@&UG;e|ahcg~F|x-<|%w!hPFQnTWMt7qQ8QUNd6T2J{Um6=M!NS`p2%#H{_4vi z)Z0r5YX~SG|-O4sx_+~+g;H@|UeAU)lc|*KemALoO zql|V&Ip(c!M+1vngezMOrV~C~=3D9QqcE#{vX8>7@`{hb@B&G`3S)sf@2ebveIh~( z0&T-a@FCX~8BjBlX6}VGdrT;-hBy5b?n0?5+vrc7{1xHOu)-pq_g6SCx&eG7$%S$+ zXU<0gg>x2_`75fO8LT7R78IbU5q)hM%tqs=Eq;k{N*eO<}b$>q6jcWOitcc zAm^kzzDgS!J03gv!4M@88cr9{tP1c0gtDvl!l-|!@+NlhZgl1Vc#%(pDlIT3Zigz2 z=+QS!=>T2D9HwZviZ>~A5&{{ogek4{xBk!;6|6-;xFgdHiwXw0+S8oj_=bmCDg!YSbgdMg&$A}At(6fHk=IoF0r30NX+E(AvJ|*AzaLISRnqO_dWj@NZ5pe65Mq)v_UxZZZEnBJb->p(f zziCp)ITxh+O&x8&*h;0LOlu4A7I{KlQR6Lm4_E(WD|PWlt5jCCCdK1gszqDHH*BTu zU$;u-|D;Lr=o3)-=R)VGwiPO=vI^b5stIuu=vC3w^{cj0St!#U3!xC|WAQi7A|sf7 zbJ$);uYX!h9&nPv`kkrOD2o#=I5lg%rKDoYEP|1NSYw^RC!s{!t3R1{S}rWZB2h=h~q|t5wIxSKl>})P}X*U(j9k<9-t)P zs&s(Tx8V*$9G0j8dM-{GfIF7NVXGOA{6R`5Ov`I=P}9C3C$pjwy9P4PAJid)!j4c8{N z-*G$6!GTIQPA0c+VFY3b%19olH5u8E$)Nin_#2T&agee~UwT#>3>-svRt%wnv$lib zW~FrqZK%+s_;|%78?SyD6}DoPXNuAvSGxR{PE=?bPhvU5FyRc({|8U%GlP|X=SkH( zq1^iO-?&cO(xWybNHN!G&@)O?*Xcjr`G4DWioEB~DVnVc5gSh{Hsl)rwg2>^=av7) ze;Um|5<|F-1&8S%svm;!{?A_1bMcDmHEjo9e1F7e>SXIPtsII;FqDkLl%G|f zX(Q4MD7MT7s*z>@*+}rC_QP!Xf768;Oz*vj6V6b&@}k20s5!%xrhZga1OBgEsNU4? zW##2Zyr(8Q^|Hb;M#F{LgTh}?7!=IvM~$S=SCt56mxD8v@pCVIRr#O#Q9bCz*OWQj z5&2&@Q$6%>q|UsAaN0p56y`{sID(%W^F~0!g&*bM2*JVf-3W!zVmuh3F!sj5Be~ME zbfog6<}@`|g!oX+NM!=ck-V$2TL4WPrM&;2T&IW)D>976+9-%Hj&cqSFyu^o*xDV- z2D3-l!S4lvj6*}*f+=^5(q1%nOn7K}-}xI^&_=Km z&Dg=mMC}sr!q?Fg3213JeVm|laVKsNcPoEgH5DZI1r zEUDgEhI6W*(+7~qX~{Un8CR7#XA``2Foup(JkgIsOX43L8< zzs?CEevB|EY?8w9CQUX|L{zqVJ}kE0v2kp@qq&X1YDB%wu^K(!2Fintx$`-|Zvz|$ zs!`uYZby#wUi$6;M?2$mL=dL$SP@8Hz0Fs*&RNO+6!eb51K~Syz(n>dD|JR1|BfcgZ|AEq7FJmhg#|Ew{;F7Dhx4yQW23t_3DXBM+ z4!n^VE}59&V)<8e&%55+&3fngW7?gZ$n2P?|L8H>`sblctG^uSHyWL0jtZ#_M{K38 zmszDY!0XVcSGeR4Q+(7`toBQ**xn;e#Bj;QNl|@a&aLG?hMYdA%=T@nb zeVP>a7VjgkPjSrJXDf7luT>~_k0!)pT=$3$rtPtns@!dr$|%&Ncr0HbmkKzw(^e`4 zWjWOy+UZ`@XSbxX*FO%&Dp>vc$DFRwL6@)9!;RRuN>T=f6xvo(TEH7WY)^%o`}kyT z(zRU?cf^AdSL&iDcjj!n?9d-|&FS?8JbXL-JD{sm7AQ}}n|5OZ<|CTexD z&fiXFT%&rnPAycJS5sc7gy`=YC}yi3p)o1S4E^Pu+GFw=ic2v%x7t2vG0L=IaDTHV z#t)yHh1A}BTdA7uR;ko&niOvgmuPHY#70}GG?Zy=RjzL$g-brBuWuG(db9P;s*T#6 zJk)Zd7-o64)!)js3gzc$Li{wJBL?((TcISBX?-fm(}ehd&f^afvgRLzPzE7zBoBSk z-;d(6oxth##4zM&OzCAu2R~D0VEOL6RC(4zDYj$Tcl58|qbKdBl%>L6YL5@B3#|8{ zGfTPNp)6I}_}xnuP=&GVUY|a?arpf;nR=%wo$ayZ+M9FER@i}>Ejf*U_QEuN(7l_c zM0+gR&zouH1U%dP{nRNPC(l1<41NajA<3FYFGk|0s@dd7P$@q$Dlc1y;zjE}&#R;I zT)Gm)Mx~<|l|jptu5K5<3gV*@{Q{r)a_|gJS%&>|4ZXWeF}aki<(V+-p?0vpxeJZM z&iofEr^CyXAYVDzfTX6qn=#{xbMIz-@N++z?krQ=)N+`tf7}%WvA)Z( zzh~vJ8WPw)D|lt$LG>nwm7lQoXlUgxK2*9~akZCOeh#W+w`E&cCXzCC+v<({w&duW z{{GF(pWpK0J!p%j?HQ=8nR)judMZQffsg3B>RmS!5b%5D z;st+Xd$~22y>>ietDJi;+QC>HlBGDglxd}{MQKA)o`uWU+kHL@y?IEwQ-dB>L-NzTH46z($*j9ddxm74_nI%)he}NaT6(Avc~)_F0vK7|7np^ zp3_R+WA(lvg0d8H`qF`V)Vh!sa3RNgTnJDh1);vN9AwF zhSG?{`Yza+AKS=J>vJ|L0o^&RB}b&&T32A-Y{=H`Xck1WV2L&Ep;H@`F8W(3nVXaj z`s*pwX%mcy@M>&Q-sZMb#G!3bI+Fcn?t^}PvoczjL&rBOy*zV^4SeIt1(M3VzL-3> zU`v3zXNxik=cuh)lx3J4UUYYx5Cm2?`&F7`6p8%NR0yOli0qq5QLf{Xgyim&5-^&)tW(ucp2*20ZC zZI2S_F|Xn6>CN(|v~mv&4F;;%gHJV-y6nZLil_9wN<0@tmiR(Iuq}I)0FOfl9ojW( z7TXM@N#^2%WZK7H`)m97mpiggSpvcM&jCKjp^cv_Y7BN1C^f;U3s5klOA9H|+`%z| z*!ZI&e!#p|1nGBaYB9{khiGZB(%KHu&D|*`9y#w$7b~s0^0R#paWv#H(mbyh_xfU# zBFD22`%l9c)v+&X`mo-|RXu^??S4s*?N?gr7r4^o{mPqY?%VyWxuV+rN}vwTwB`q} zW2~dz2e9F+qY(#SsDGDQl<+P+UZOnf{y+!%H_-(TFpeZy{EPOLDBe2UcH$t6@Q3L3 zLHOeyQ0GHR5(;-6;)Ul9DJ(E5;xISt3_c9QLOjhnthB^PKS2?_AMDn(7uYU-7w0o6I;)3^CQh2_lUyd7*YUqhH+DN8H7%HKJWps$(<+d{Z>Rei46s(Ic}OG{^T^*{;t6_ z+rHp;u= zU2$vfy1wgTMNO+!RQj!xR~{FyT2(GunNHlHo!>eGLvM>4W#QL^I+l)g5K`+{{SPb; zQ~n-~Mk~6W3a63}nTHt{^K+tOm7WdZEL>3T`qI)n)z5O2|GkHLuVOFY326i02s88Z zL#x;m32Xj#ZMg4db;H;?)t#s+dq5{}v8EFjAMmV=xQ6lKALKZAeUG}6DMlwu2d|@a zi*r!q^y{vDSanUb1I<>20HykM`=fN`r*j^ZeAsD`n{p_1ds1_!PkutaNv1<@W~HADv^aUim}W6!I2Dw*^#Q$}gKGwL6kax(iTI4mvQ@!l z*Ka-fS52#>myA~8WjGZtn{&yv*}jW4&1U^+G!x-$04(H-rTl_xtBts3bn(`Cqm@v{ z&x=;!g{O^H?l3NJW^8e+KE+#6+8Jl6X#oHPk708Wv7!tVB|xWewaZy2B5yY>JL@zl z{H_(hgE@m;HaI=WRH5 zd7Hde^R_U&t@ym_+cux0VW*vMD${9TR#pV9pK`_u+{EY%}k_zS&x-nq@7^~}dX>%MLk!b`s5xwKG; zxNediL>yF6=}SSBItn!f3MZg4?z1nJgLx0N2r7qH-A-pdMh%_9F|f2x%EY=r>Yq0~ zdBGV4f6by_z3gg9yy8ph1?O9kA!7a%rt@e1bV{FSr@LW3Za#>7<+XE7ymoG@T@fL4 z=}$-uW=gpT9}#>-dB}@zEqv*wh_ryGGyu#r$a; zvS-tVi_YeFOzA}@&+h7RNeC{hE;$>Srhi0-F5%(XAJLzeV7WF^=wCv*dHpYO)31L) zk^&~qWoJ7ahF*3q$7WrA*~!x?9=QT<&_p_SMVz&`iVy^N%&$T+NZ$0_Rqi>NNT;p| znSfn$_Qq!4`??4oJ8)fGyn5Z)+Y5q%j)53R4qpug5I$g58de4o6cC6~f(X>rJgZ(N zjHd+VmEn^n()Kb4d|Bjm!^x`wt-aywCo-bqWeEc0m_}3g8_tm)^~5yts*y`?iWZk{ zI#&qSVFTLP8?lEc<{(gh*WUF@q93^o%JC^W57aQgiifJyNqZDLWyfp1BP+VkFP1yK+_nJX-5*y<`IW8}P8%&Qhl8q+)|NYCz4m?;?MM;;l${9W zHUsH$xzpafkY|i_mNbbRC9@vcZFO|fU&GKWP&Dfzn>i|+c06-vg)`O-sL+6I975R@ z&K7N7s}_&{?Nk44a>)NKB->;PzYDMHWJ_ADrZZK^pXGZY5z9To+Yx&JQm_* zrx@*bono}tI-RXS{-sW5{pvx!A361K*q~5)NOK0pr#p`6J%GJR#%b57j?=CIQ@w9+ zkIR>vFt`JUHpDxF@j1pBN1Ia8#Sm|6RYElKJAE; zK2tLfdaOyQ@r{!gp3yiND~k4zn@G(3y$(4Jn1f^Q&-t`E&WT2xyWm^Tk>lZ@z(r9N zZsdO>%vL=c4qkn^+)M5W*1;7tz)LQw^DKFpEjL_CG%BU&;Ks{5DSJ11uV6Dr0c4ObU10psa=g zG4z>5^O7MIH>*P`L^+Z~tM-to^k+lH70#WXDK7__-OsK9SJ_WBg7JdmMkAry0yUS5 z)6K2PC zwV!)w5kQj9-`}wwYOP#BHDgFWzTP-&r$le9C1kZ!Zw;jyRmYo3un$5&1gEyaAi15& zyg_WUDb7cGAFbE|^me}wdb^!|^3hT)kjM~&-4Vr`x)lNDZBpXMZi)bnA#gPC`37!pZ63;3KXyn093QT5!nqt5zKpOXkBE$~y;*y?94*IF;J#yHRRIx*KJNXv6W5 ztzP{h$hY8I>F0yl+p!q29w8bp3Qt)({)1?LyOsiRgjc0iiy4R@gGr!n9aW?6fc~0m6J?m^KX5?i;Q> zgNvwK8cx&0wTAfR^Kk7uC>h?8Y#}6zUCB*fD_qH#8=}F|X-)8o1yR}`a)CN=R10kkSs zYmHC%IaZT(Q){nhGIm#7>X_N`cTwIwg${cP_(=#sGimX z&w09@mWEett*3Rx2vpY7M&V*weK7>t^|km&unN7vij;?7(Us*wF(k-50dpEm*XwJt zHk&N9ocGRhJ2yHZMTAC#O%;_xT>%?>>Es9Lbt&fKN~>w>_r^NlrbEic$_`ocz3U>_ zx1W|a)RxMn9ZqBS2ifT0o{XUw`JFe4*4u37YAQaw8SKK8HWO|?j&+j>yZ`{{vnXm19u zqkF2U*cg18@r{9AZzgt&WzEE9aJU%=bs}|aE-pUXTx-}IUIiWGpc)^+fH|lGMP@5k zhU)4ppH_gHd@TCzV1g z6{u)2J0h4e{~GBNXpw0;_{bW>h>8Tk(GA>P5P^frz8}>>S`shrHD+CKKb&&zXF9Q0 z*nXAoD66Hmk=NCZ+qlb4T@y8%gb}-;M8+&?HNunp@7%4YK7CRNCBL&HeKGz(#IviN zKftu_0FN?w8kkm+&aWP@DAnW-6y6s6tv5dMQY)=_EzFCUmVS0`UQ$DvdN8++)?zmY z?mQOaM9OQewZO_LZmrG1S^tN$XL0!KA#j5%x}jpTsd@-3cQy@ZBi7VQZM2r0trX>+ z3-o}HmyGd3k(n)Ru>K}eMH|5dN4!=UPL8%>fzE7;B{`9ox(Hm2M^ql z2o|%hon`~G`m&wY!h)4*C*^OSApbVvp@@v)AyIe<#Vz%;*EQAG1$nW5JL&WoY(GRXlc(}LB;XA~bQ>4e!+axhb7SFvB@jYn81&sxt-r%45IvQnvVqn2I7V86)?(n7=0H@45z&FA*DN9J72Y(4s|!gChS-4 z0FQay0d`=fv#q?FQ8#OQ&KP;@6k=3+6dXI4G#W^zFa~|v9(W@!@hLe zJ)OX*kaFg1bM3^ctzraE`I4iyV_wNp9+52ePXr`kTtmti4Z+e7om zHVo$67)?dJ4Y5vc_7Ll`RVbV*?R#oToX2PN#4>~^{xW2ETy6L(MAF}t- zp0|J_dr(}f(IK>;7kWIAKJ6v;*o(ciu~@!O_0}F2Y~M$MPwwiC!J9~TdPBU-qQj9# z07BVE;|0!__tA!kI|C^1*?EEF-4_y57A5r6GO$P&_SIVO)udyT$YLtkq-78l4>UT{ zSDSAt-eSywNK)D&>7a0n>l7UOn!5DUzU1>6uq;p=_`4EG@%^=Ce3uMJ&$3f`e@NqZ z{ORz^bM3UOKe(VqCH#gj+^B1h%uos*ptZuaUIVmdwlCa};%Osg0II#u9RO<5XgjX+ zdryyQU?jSk2^Km6SzkB;e zioJ`6KmIq;@}+?RkMS3pkh}Ozhas*0O)pHuBbO*GSzBp3vB?-$kqL<61AKk$+vGZ~ zrC-tE6m2x$&(6;K2SJRFYi`wi0ek4<8W$;IKY~nM@VFL%|IhxY1^WW%$Rauf@xlKv zop~HQ88fkBS*V=`?m%W>@~ai@khaWR>)5$IJ=%@m2UbwqXIHh+=%ru-I2AnX%0}02 z&cZb~#9+0qI@y>Ce>&Ix9w#HZ=}8?|m3x{wBRE=kJ5=_f=^GW29kpx}&Bf)zCJv9$ zfeM}gCtm%9@p|Eu|3a?+#b3C-ePfY$`_;PSc+;~9Hwr+@83GAg1Re<=XMa9|txiq} z@c`^A~HluQbh_jy$P7fuT!S17)S;>v9b9Q$p8A%~Qb156kEv1c4ezqiU_* zf2hXOw1y4U>{4>8BS;HonjTQ&B(gIP5!yw0L$xn>t^wEQsj1Zq1* zCi`hAJG$B;qMyozF?6_)RFa0H!7h4Q zp1mf|mJSzU;-=wRqOb@=3q?ObR=1KCftl}ek+FE~X@G-_(7eQLu@vABDS5;Q&Apav zl{rFe)^kTx>-*`ZW9to45djP9MdU&7dRIy*T}O`Rw84nZo?f5Mj`I`o=2lboTBE&4 z%m$n}Uyo<puuN4S&FsrhA$Lbh&nz1x|T;gj?ne(E{Dqd@88(eF}Kr6i3|`YAtLw z><@3(?!dlJj3)@I7s9LYfT+!%xOQOA$Kq-4*~qcDd<4BYN_$4==?ia1QSs4?0Lpi8 ztJK270L6OqxaLpAUd{%3UZ>c00g)0y%hRFi-DlTux1uZwh!E0(E3isYhL&JLmrFCW zCrrmy8NC(5y-Egpta9z_u@6OOz2N|NTwGx^l5+bB`Hd%5xHh{|Aeu2dqJ(C)rh=!E z+~`ng4pNgxLr{jn;#9?}axs`{76WkXqUA*(jb&+l?)zqenqWe8TF`qWSzmx8tvtuH}1+fBD$((0Qody{`wuV8BRvepN?unGBDDPv{?()%xKO_i)o+g{d2 z@EEJ8Osz3btINdRypl5HVOFMAA3SAkCRDjybShJtRe&2phWQ+~|)ao~;<>Gn7+&bFPy@Ee zmDeTzg9qJc+eA!cnZIWBou0o3pH|1qhPe6DaLaWp=XL%>6{>u>ly5C}rLx@RwEY!L zFU~TMrsh_KQsIRPuGKlliMl!olQiMFpE?Osy6=0nWg5hS9g|=lso5)lq94-U-6ob! z9a=u`TnN4NnkF`k`{B;=YkQ(+nNO3TAdqa~caXA-F7-e7TzNBF=&3;3B1bm#1yrHeZ z6u&V=>jHC-3AukI9_2yw!xU_Fv#H^m8qef>_Dx-7pUo$Va^Dmxdm*k0ulVXbo@*B@ ze7+t4-QXex2h!O4b1>!q@Ue}erfLnjH5n_l2&UWgshS<6`{q=vkzKTQsunKmQ6uWk zggV!yQ?+0O=0(uJ;R~Wb4g#G=kV9;?)~pse=s^KBE>Qh}1u%pwHWLrz5?*sSW zUs`Pqt{Fi=ix(Tc5IW;x(Tm7gi(Ok4kZ5(7;*u*{QMNZq7Nia`)uY%=K|YlF4(cd` zPS@&!Knj~xK)%bvl>`pjoDCO+!W4GB-HXs^A&Kp$biJgTX;S{Nr|L zl&OagN6^))ecpfPn76eq!G(|;FEBvHT93>m5-u#2vk7$UAg6 zt=i9+BJWr|L+Z7Fff$Z@L#Jjy%ot2JW`N*0H~6QR18aIy+Pm;rbe;*phyKKKe~t8`PMMmAr?4k|x)qP3Loqph>SRz!GcxY^`?l~U@q??#Dx zoK_R!`D;rTIOWfYyz-vwbEe}ONbqw~u4vH|>lqhFx%2*MP5%9Ed(fA2wB}fqj(1VH zq|oQC8_gSWCyED#@5+GsCEP-5*7IlVZ53 z0s!q-p#nf+a>vSI+*D#1E%+|*0E0y=r9K7}=i>K;dLZ0FW8*7rYQb?OmVD;x9xtnO zWH}pD)c*2*^P!*3r`*03`bW3At|2L6D0b7WR5V}i2H(%u!nsY(g9=`Mq&LMjt%x@5 zn{9lp5DtMOiTO8eo(*##R?j<9qILJ5QCpy_nrXC=y4y_A$otAn3{gvLtByIp(a~J3 z$^CWba%b+LRMIYRO2}>x{Jas1wJ^{ny8>6jdyDbe8)^AsZ8HDeuzm-t&JPss6@%%! zF=d|}DR4yYH<&l3>r1rWTtefe$W|=2hN#^?Kz8QT;0&7^K!pWQ8*YVdTo~UomuRho z)^(pxBz%#oc?7Rs7$9_i=vF)w4sa!oRSVUrzDj-h0{FFzic&QM#4lR|&d$ttZ z<^1>R5kIA|mox^zxP&PC0n4yi@21>kT77BItV>G0BgiRSCXBw#mJ4%y|K-?7Vf+bJ zn*}J(cu2ph0%PlM@^>eGkHqhxlK1N7daFZX#Jc;hq;B~_h)m5F64;q9Sa2|s)r1kC zj)1y-=Wib37D;JC+XQ=vN@il~eKT@wl$X5YGkyo9E*=x)iD(|7o;i?R*WgGXb&WUK z0%G;2Rm*MEw?MGgxaVbwJh0Xm=)H{$O!aMp{sdEfTaX_@H(Xcf!RdQw>k4fah^)s- z?NyLb>LUoP9KKj{Q}a(Me%wm$0rLc(lbW*DZCz+1TNrkkw+Cyn6aE=s~?#Y5tI_cJ}uOp|PtpYk=;45x}0{Jdn@cUZpkQ4ZF|% zk8JquDyY9Hs&YUHTJ(|T#$`B7_b6y-GrqsmvcQbs!$Xb+o9ry+~}rsW|jJvFs4zQ)mVYPcenH_Gw&zy5IeePsu# zas*HOG8i?u{5!0Srlp^1Utst}l2-OEBu35o41Nhrgz0WLb<0ES11b=DP@?Uug$o{M zJzyr`Q4~v(F+B(NR!XF2F#?LaN! zN}$ws2&);fS?r)MZx;IO*yK_7xCUUOkX0{1DNlZ__2p8h)m7^J>T9jJsn9|@o171c z#-4`l9flR$tHYDkmOtklgSOaa3zmB!_1L04A?L+|+YbV%Xp11kvs<)B<#oUu;=0Ag zrQZ?z?uycB&whiOP|@cbjf27Zs7E>}5mfe#mO%NZQSJ%|`6~-g9TBef^AxkFnR@2P9>_nblR?kOSqG7 zV_-MlNvYf60UErJRUmh9yA~`AVp6=luwAj*@acLOVBRR} z468@ucWK9kIRiesN`&sD?$+9hN5oK$b0lH}c55#~xy%~c9>ucuz;2IP;CtYen@_sA zjzE_~NZSMR%&oh$Vh-ad%px-9E~hR>RLP&NM0E0kAjxGYOIO>x+Y(hvpl<3m-owo* z+-b*GULNYeV8x1gGOWz*lz9suR{otJIJdpplbo8&lA5H6UgXWu_`O1hS-w~5Fgm@} zzT?NekWvd5?UOg?L{|F-)Fug{=36xPx{z_iW{GTk$R?a9Y5nVvlFy`Oc&eR4VO;uP zA3U6bO?gt*q|`8Bz0))Bc|Z_1#rf}dvGeG$Y3ue&lDhHecJG*3_Q25tfdL{L_$sKSQsqw>lDurk0@9FVMATuYVLvJb#&G=*YLGg0%+ zN|z33jZN6lij*dy)a)QQlnGl>d>Re^tchT!!CsmES1!w7a%s}HTI(6hjd9hl(zqZ{NUL* zueBnU9TJkZUP6I~gr!@i|FIi|G@k$FKPJh#T2o@wnjJLeD~*?_7Pg{41PRt#e9@Hz zPk=1J6-5TtzH_^c46Hcc>EWhxyD8_8^NEo2cU{|6Rgh9*D0UI|>UE3DjRhcV1m)uG z@w3WZpR)8$4Nu+-%x$@BgkXYF*9~*K^ORL3pYg0K`X>$v=15nZH>8PTX3QzOpKBGd_ z`Nx!IbmW<&TEvA)YdUQM&%5s^Pdzj)&n&4_L|EM8?QkAP94Cs~{DfT#EK@lINA-@) z(x6uB#^!XrB^G@0;}sTu8(#)ixr|Xil3_ zW*rPs9T;i;6nC0M$kLl#Pso8$(%`zBdIE-)kLk<_ShYaI1%C<}wg#F(wlJocYg2K@ zUnCXlj#ZtC0b*NC#ks%0O*xph{G$7nB@@5)i|{K`NxR0vu?$=16N`412MRdk>iOny z$b7mZPu_H$?(!RgN=hju6yaK#ziB%#j)^Dv2CL?rM3f#PS^}tP^K=P%*y*ki+YGU} zu84p_3my$aKXnMO=%2wb&AH{r1_dkiUTC zDoaY`pVOi}q;C}krRdD>T2IaaxmrObQd&oByNwGIxguRDG31- z!XDvCQ-7)ks4HyB!np2XCFTc%;lV#dz{}5n=+q`-?Yu5XYAcLDxifBmDYCb>H;?B+ zr~o-=gUat7aB3^AI$7+a47wpW?aB-xtoeEKwsIaP~wL2aQZznX&`m~ z6MdNoCBH7+Shof;!k-8W%E~{p+YAy!5TPfn%}Q#^J=8&BO;}^yQIWlS@!AmURQ$V= z!Y_gnc2n<*^2x~-*rR@3$0EsZCX7~}UK9}zr!PVr%A&+e+Vc=N&URgAv|fKnYi3;u z2Yn&@4&Y~k3Av}=Wz!yZ!@B`=A-H0Q9?-|ID z#ry8MNt@G_Yx+*;E`6#}XHsgd(28rCD1-&wiSuHKeGAhQx3>+yuGwStIp-k}y5G9m z4&o0>ly@yl)ar}IfC!iTMLCSees>*@va>bAxB$R`awUpHfKu97#U7436%8f zP8p3vGVUqyDx{a*IIIQw9zJvOjmDfjch;jfH)tz(Hz#i#5-CrHlm()v>0J~ z7aI|zL2i5Z5Ed+9A98#*ira^(t@9KYIyz|4xe70|JvyQym@ePZg)d=~r@Z2eVLX-t zoO!^B#Sh}lvwksVOib-Ba#fX|a3u)fai>*iGYuIZfm;FKLBcwhRt9~e*7;}=$pH+8R9e61p2ORWM0>V*JZq2%?r%Vq&^fX$@O%Lv)esS+yLXFD-vemL8NYf2uWEfgUoG z!{q-n6;&CN=1WS#IyfBeXnr1|fR&h>v=vKH>B6ab)kwdpPpJ|Hgo*i7+u=bq8{?Xv zjNuocYd?wMk6HSY>+lyI7whN!00qULj)b+P#NS(lQ<(=0JOw#3>rq)qr5|-ApObe?;=_n6eM5~!hD!B1UbO^<4ND5i#&AMR#MIcV{#B|`NwqZW> z^4)R|D!aPNjn=jDu201|qxkN}gBZar5vhH*oS%bJHm1yv$_>zJBc@O{(VrPET7g{} z7N{Vb4Vw-;qu$*s>qE7N&cPJM1K876wzbn>6YH!Tr}s@PM_EllW|oYXKnx9A^h&uK z6&%pGNlH#%9c=so2*srxW|k!FQth567<&!t1@WVywmNX1U-X8<5_;38?ks>4={2o1)C}^Yye&rpO<)gK+!<#N?jEcW z4v8M@Ia5`M@jmH1DB&;cN{@OnUiDZg6Unz?lPLCcfT+fJJ?QFPFE%7<=}F;Lh4fe7 zD3N4FiKMCM*3U}*dNl?{uD5(xunA|0h$!cybmN>`FRJwZzqO{kb#0y?|3H>bPxvy< z(eLZz@BsE4HT7flU4GiM-j5C7*hQ`_X1HF(%_C@4U3S6cr+8SvHkPrf3y_yWcbfP@LbtT}#vI+$_H zqm{v|28J+`-vJoHaX12o@JujkfjfOe#GP^dAX)z>g!%ej{o5uSCj9n4{-(D>m`Lvd zEMX`$3SkZP5+Z<;CX1bALeFWLaM4b4>@4hl*uo8V*2;9#pT@pxvXc`xa3H$SP!?TJ z%86GXm+K7~H&Hp=oWLLWxDFyKMlYNmZeEA>Oew ziWyLP|NR}K!fnQM566eI#-^>EAR(7OypHO)h6%{6)IljjB>L$1Oy_*MB(nwIPf9AJ6_)XY!q|% z{8NDa;bJ{;(WkzU?=6nsSMd*>7xjOf#i}Sdiw)!~c8X?A+?KAEFoOy6o5#q36m=!{w{#=IJx zF;PcnY^C4+ZUG|+Su(wUC z4pLqN_8%~-v+2vi%?CMJeUI#cRSDA+y*ZtEAW zw&<+*E^5N!Xa}OEDYYr%sD04wdAeZHc&LEt7v=XD&uWYTleaJ)RGnWiqp2c2mPU=V z{mmE;HOrfT_FuIf(-1wEo@)MqgPOBNytB%0c|nU3SSxfcP+G*$IX4=Tz(lpx>n$I) zQ&b|0r7siMBeGI90>r*THeuM}yIvI8f^h`;rY+bKBwpI(pc}%DUip^$HR((XHlM%m zdcA#OFe4~=2lMn2dA?8|rob&BhNk=bRaSyME|#iVGGRG6~uiNP6u2!>RZUCY|V~KT_cv@2lb;jP??KY zWRDj9DsDIAMZ40jtw9ymEdUkCU0EdzGi}(X@<%HL%;*zH2cE~i200Zo*H(m;jB3k_ z!YE->(w2$jSJ>ji)zV}L>Ebo(hmVS<>?GzHELqrMJrr~SKf;oe zpTwFf^XU5|7K_8>Bo=L&V%CZ;~GgqGsLMAbeGJch*Olx9R)ttf3Gu9gMpT8}qdLAR6#6 z$TpXzKFstYXH6-qpI;yaKEguvY0BkagAHX4KVq7?Kf>&Rat2?Jzl@YWjDCbQ<|Ps> z2KEq&Pg*2yjkJib#Y1_N!rn(%PZ-O5A7v9@ptCp z4)3PMJy;9NU*3*Z`O34=Fx+MJU^nsW$ez#=R??iFpp})hwkLZ_q@iuIpdH~}VX5rfDOa*N+1fNV9c%TNc%##KWWRp0g<) zn>fmm?s9l)MF33=sfwg-^_(IT{r*}f5ws+k`C)11{S6a$aWYhd>nqH4Jpzh#LS+w>EDD4xe-P{X8pS!(5e8}jPEK$c@5b`5jnm|wmScn z>$|dX&1ki8qtQyP=Z&&i!6w&cS86qzjshF{AWpa&j*W#6z3J8$!aL>jMa}as78*B- z=i`*$8MU;~_4%9Ei)O1HCBGGrTV6_ImknvAK)EZVnP?e(^X5vYFJ}d&bUF%LTHIO((nHphC8YrvQ9XxH82X>;_%-=xz8?{8$w-2 zLCj62d81fI9>8UBco^1GY-n|40GG76iwG*X74MIra*h(abVxdDT?>!<)pTq~$eKxK z6Tyz+GT8f`i0hQk_NJ^)oK5M^4A#t&Z$=VD+RPN#7(a2wSIZRzIym<;FE9?yJ@*C1 z!MXo=fuZIp&H4{}+>~!7<+JN{cW(Yfw*wL3nG;C9qgliQ(7EI2snO`AnX*PR4$%$g zaK7Vu1HPe*X560KVGJ9{$GqFBJt0x@d;beccaYT#x7mhGKaF7msr%fEEEk`rmrDkY z$y#T3?3LSJf>e^SDez^si;E*ajb$9EyK^SX!y6B0vMgNeo+YeC%Byz*NzGzOQH7QM z4x9h59*{N726T$R=N882>sd^uiTwCG-#6<~sy{ZTj^iM`<}39QZi5ZwzVFb>iE{RGA#x)Uaf&1KF+$YrQG zH<2Yi0GT_1dcVSi-`~PZ4R~#b75m4BEi~mzXMI}w3WS*y+V%?Lkll~HigC)Pf>(tM zTJkFE={d#GO45oi9c_TMvZEN~bvsOgF)^2hPhz~D^skf9cp|;H-zBT_6;F;4S9oc zH16mrEFPkhV+!l9+}ZTr6j+RL^}9D22jBkdO^B#>sM%D;!ME2;6&FjU;?`t}&K9y! zk8B|uP0nUb>L&woTYjZPV)qdNlhBNH-0kP^4+UHvh&Zuq=BA9zFPRexxzL%-yxjn^ z0AUB|#k}Tky&M*TZN6g;OAsD=f$~n7Ijk98eB%i$j`cYZejyL!po7pFreSAXOI@e2 zwo+<3RxLH8n*FI?lwH7|b7 zTT$wglwc~H7!XbVUza~Zxoe$vZN5X7!6ZGPqQ;Vn@cLT42bD-2Gnz zfxP}l&5wL$LgI$8{qy3C#u$s_nUDpz18wGkV8{Y7OIF(v2g6g_3T84<1G_rh1G%HM zcRZZ(j)yGx%(deOKc%a)Sf1eHrf%VC<}k%d`R@qx_r`bF^ZbW_v;BZ?GaCWfaABsc zDi7kv{<8%;%$d!Ehts(H)oh5!A5rOSkk~d--o@EqYWA+)bs46T*gPc28(tI<+$Na7 zRO1GbxkBnAg-$r^UMl8Pk0j)}K%^;9DtBh7+U&SeJ7Pap~*Oy&c zDVlv8PG{Ff1OW#uqzk?H9@vfuJ$xM`;Zr`6r)BmjANeUpT`e81*wtmBuvNuY2!xrI z6(dDyZz%4uPm4KzK!71_3yJ#+XhRV$>F}JN&O%? z`#y{3?9~Jd($V}%Au02FBXn=R+%7RwvP=bc$ZnvN`K&uO920`l5o8)fpUr2Xz89+t zARv2kHfr$*(cQX0D9t{_So;*1~^D39}ylDFcYORW|OCc1VJdk?It3kfDVf&>$t zK|)(KLBe(r3l#RDsj<+BfpQnMSlsgHVm2D>)-M+AjxJ_B!1wG+*c4n`xP<8$uBf0q z8J^uAm#`+>fDlgsY3-va`U4gek?g1^S)WAF#i&WswHI(O`hS4su$Er_0DJ#nD)>O( z@{Y{qiLH%j#n(N9JsMYQinom4tHke3WFlKPmD!*pG^HEkLs4-+#a0CU(1aQ|XLp%` zqwdGQ#2zJ#uyq8BSfPr=BGMhl5O4{u8FZgb z1#_SmA?JaYATJP&!nfwTQhn)i-Y7qB6}P$GSHU0_%&jKTZRs+jBVsAxRII?V2Rw8S zt{FWkSB++(mVzoH$S!Ecu5X1>^gTcPB_ z@*sb>BC62}IW`#WTqjnh(A9Z$%>L^k?qmVnyH6-x-jw7)pRZ>`*&IB4 zVQQ=up|tbr_OY!R3@3wPqk#}tvc0F3 zgTluB{(DoqNq6taL@kp@u;S>`CyH2%Tj|~aM*vQ=B6t+uRVd*LmH?>kFv(>8tqYiF zgtk;8?4s1e7Mk}3YYVG|F3iIgp}$sI$rb;}gha0xpz5+Oz@O$*s||8z?Y{vU#$Za{ zpc^3$-@)ifc#U-%gwbn@@zc!f{HJRhm|h`0zNVn)=*p)lamEy1nbNgt{yi%Xr()&J zV!K@YH6!%|%3E=Q1ywtrL!k!3(USO;kUtQhA4XHYg3y{Qpe3pJNklEablB-h zV}4;AkHyHZbXU7OlxTAP!rZZRvo^85ki1iVg%ir>Yt~9O@!QOv;1W;4s}ny(~U-BBdgdO6y(ortV%&Uz+-djOG+^$cVEK zca1yd;mIv&M1G}&x13xaM#h#73x7OiZh=5-CJ~swd<$GWX4<+1f;(V&wg_iE!s_K_ zkI>~ntBAs+?%%LJ{Bu@xzZ9gFPE;)9v3mgbNJ(&3GwfAAe8YCgjW(DEpFl6!QjX#T zTUle60z-I0evlg541jCMQSl(Q73u{TUS<|jJuqzkRM4lwpPt1ZPXDtv?|3Bc;NN`WFl5&ojkL zZIEn0wbeL(Btk#;A?o|Bjpi)R0EG5V_K-+^sZV+BOo8;~PS(+MG=$E6)6Ec+hqX;I z1m$5ga2IP}TIy5-x+y$=MD99HHEkZOb{lhC*=$wzZtA|9oy5mP?O|R0498z7Pag$A zj^4xC^T958<0CsQ{gyTHkbXaI6}-BKE#jkWbsz*u@eHD6-wN&J@VBgupHVmR1b-0X zGy=X8o`-JV2`lwG-?84dJN{_uCYxUVj(PaamPH^A0od+|Jt+U$jb^aZ8v zg-2VIWu&+9ujiMBPu(m3=ql9Y3#;R}a9T!Hm++UOyxGtE`1@)4Z7<}X6msrm-Aos3 zRPt<3yV>TSoPV@OL)aEx+=o!BOSEPmjP92xaX$-pJNiK+iWIMHEKmhsYydhNnF z`7=NKg@zJhg6E$6en50M{GjM?+k>zd zT%s8V+0^(;7DudP%`z|$&EkXr=IQuoQ@9wSMu$ZAd*fg&7BwqhI>a98A*yyR<`W6# zy_6pdY@_2*mgByArD2r`*VvbH`dcg@nW;U^b zx;gYZXpSxX%Q!72$t9ZngRoLf{ed|^);s0F{3B~Adh~Ev606~CeW3+R=jfy{Go{_nWqUzblKZ31k=H06$s4u_f#Wezg~Kh z^^v^<2xTgyVeKRgh{@FA6#Eo|k1f74Hg5^8%fm;JL)VvY$H<(s%Vg%{umB54c zRE)5XQ>P*8+@DNG9%q;jM~4WexQ`!273njqJ=bNi*`J1mb$~BmP+F$7N9_0+p_ylY zgex4TeM@V&1YuJ3w(?~Ifxk~B z!+W%*%(|9#)cuz*3%UQ!f=nAtRNOhv4j^xiAIue+@x$erK-^3Fur5CXHi$p&44B`@ zPA}~b@}#A|GY)Th?RVCJ@5BDvZHSjY$6WDuMYht$bF40QpaRRwFh-t3{Ner;RB=vF zUCZ;VH%5KZdDc;PqtD_S1Gw{aeuNu+?|D$wJSsbnSOa(*eg0q_;Z?L^^5Z%*4x|x( z;5k|Og)&C3BI60PRz9Nx?LoBj zBCOA|DdZA+S@a6HO8oM&OYnX2+d>!K=nzPkF0s#{73lf|^eSB|2p78+mkkU5VsD8D zL{vYZsh0$Ua1$QWoXe~j!N_`oZ_Ohl&=MZuh?d{<<`rlXTZyh99sr*cD?g{R{G71K z>GjBV70%#^6mpeu+;JWfn9|;iqUcv)YMza>Xf{;zq<((NWOsaWyBt5T-k!+;)dl#`Q?l+mYk1(qshruM&%@Nn3OaTKqvHt5oMv(9S{5k?pCerEa z`m3ACSJy9N{dwwhb6Sf|(aJJ#&WUueOgMtQZityXctgA|vHE@dE8}j0ukWJdn~)LK z(wLhN$<`9d!|t1iKv+v<{IHUu{ucJ2fq%2+4Y+z*yp=}=bdbBB4yS5!bQBW;%HyWq zzoi|g^lh^;5FwR_0*<}K?55(kjP)llR^O6lkkvC?*I(I;8Z!v+HFV>Tj;|q1F00;g zZFOZi_jaEWt#;H)@3f^^Xc5ybXxy`0YbhI4cq$O~OUmgT? z_Kplrs+FYKR0qmgG!bzE+qNL8|N8p?yc@EmYWV_&uN z+zA`SXhQ6894-!`DH?0TIcHH?n8>WK(GmHpG7i;Fn==+}Szg~^C4fl>(+DQ*L?#S; z&Mp8L=Q5VgTPII|fwXK_k`ajODn2YP3n=pxs*e!Vt>;DZQrX)&2IKZhy21RbMwL+}`7F2%=K20KYJ5 zUDcFhy2svA4UWo7UH$zV@*;Ix4`tpCvn3&)Q7mSwVd{bXR)@xi7-x#J3Lb0}Pq8`* zH^n;Q{D-Jdo0S$yq52LE9bPl)rx*!H_xDPefUNhJfR6HOl#`p$5aTGVO~8#-<19+J zbu#*3r=!!n13hGPip_r#wLF%KJj;gleUYOk(Sh8cHqBS(p#?&b)X#8)rN~H*KWkAY zm{y~Lcr8=%dy*|InEwD$eP4~WDY?o=YLQLpEl4hLM2Nc0O$k$*x+y#iFstB^AT`TP z5d`_>4*}xW$MD0AZyN-w(e8>Z(!gMX2cN??`Qfm6egJg0b|#CO zscxV;#a($qNmh@#0|sn4N4f%C7xcgFPKEt$cUJp)DAA@>dB#@=?uJvbpyyE9Sr+KA zrfL_r(Efqy9pj!(qU^9~-PA%)rEa2;rL3#d982oX4WUSyF!W+tt;kyG9?K;N1rTHc zL2YP#-)Jg(KX}v;smccG2{U-fF6s(jQ|Zib;q95y0P&r3Ef}DJX8P&hu6f z$*b=3R)k-u#2m@}LTX1JMfinY@KKubH8sEz+2r4`u0qwneB>x`L@fjGss$nuJ!r0~ zHTid_tN(_QrC#w>x`F)y{z{aoXyqf*(G-Wmi`1w&eu}78Q48>@wQV=gEA*wEw#e3A zB0DYC1ftumKI*TC^x%MD7CRkUrVZASPb~fu)ieGIJlv`hpukzKHV#lwhedraKwK;m z7fE^8VQs(g~{-Q*3SGOscA+Fft8Q(eI`kRKeRK3!Mw5)LYXfJG(G zWdtLYt2$ImomW?p4lId(6)-EEyS0kjRs^e;@fhL46nWFCR#(xjq%qZ2(i+UGlDmcq zCFl>Q+#(fHeAm@Lda^IXpH3sC3R05h{L@w+vwRTrEFIeHa!}VMirY`4@At*j1 zG5tYX+{qY1*?COXvQqOy6eANZOf3zm;mJJ0xUOoqE4@K*sdfd9N_DASF|v#wbTjZt z#L|vCSvQowIUY@RhDuVc<-&}kmi?SYys@BHgc`@G>%x>k?~jl;EIF`SIPGkPxRAg0 zBU4$rEN+A;gYd|n;o_jmLs__z*i`pk>Sa$kYAwfQLQc9RLe@h;OpzH@WNaCIBf!sa zOpj2av30y1p>G|<$NAP#mjW8c1*;_yid|S1F}xpCMgg)x1|dt(>FvjOfvMtcjf2$0 zNClyw99~CNBNQKXM5H2%Q2in9K`j$rgi2tMh|qiEZ68MP@WG)htsN8N#~lNYuZ_#~$6a)Wq;W3F7#PE^?)SK3*CYhYx1eJQ2U zzLDg=ahIFWw>bKwD0+f3z|L?DtIH2*VeUY6$N%sNiOnBS?C$hiw{j8xmGfa;Sp%1n z$ES1KdaLf`fs5i1ab8+f6{lW}QGkX(4&`i+njEi;@D%WlkY+ztBxG6%ir}gRvC1Qm z@Hwi3D1%qEa}>&^4XFxMo5f)fX3@@0ckOEbI3<;D7f09R$XBXY;uIdV>dEm)I@6Aj zu{PjP=Bl0JmDf>Dmx`J)QBRj^4?O7eo@euF2eFfYBekxm99T3roHly#n#^SN4YmhZEXE&f;aL+8`I$@t30W@PX!OHFMX{tSZ&!riQ%o!?tcMg zxRAS5ExrR9KZw#gRXt4I`<=npm1{QB)_;r{6C(IOa<#Ad$92Yz-BJr0D!)is8m@xe zDm@O5!wutw%Wv~=;@H*rp48qVZFTvus>U>Sb)|&r;4TFtnjd18uvH&jXT2x6L-lK- zG{Kj4XrgrG-@q$qsqZyWf_cP;9z&~cZ=y_9^3|?Ql|iPXHn7W3K!Lv2!Ad0)%iSsZ z*(ANrlm}&vDM$XrrW z?Jboo@P@=hgYtJDda_ccd1Sf`k(Tmk;{UrwCb5eCCqRQ3UN_w+Dh>>>P4!Z zS}8H^=Y9`xoI~MW^|@9`0z^RoobsIYe|zD76$RC6cswMkb+3;KjfNL6+)(6o&C^m{ zMR}6ivbEBjhZ~rY*_U;~#yJl16nIIc=M-O>ysW2h{!8^6DQ@b?)=D3BRiN?|Y%81x zsrDdch-tx1wd^5fx1k4$v=|U@djr93=d%JT+xhG$>{Y6NJF&m?Yv;OI{A+TGAlJNh z8FqDSlHw`I6@ZQEdr3+VCu9_NgDeh4Uz`NdPZDzwP-AiBZjv$$FP+j};i(m#GPVTS zO30c5H?e@5C{(s3A8xP?5H3EZ(}Sy~fn3vuRB`MOgHm~&rLZTf0EexXchtH1+e>($ zR^s6>yZT5cg(pp&da?@GSL&foN>A=N#6}_|u7u7CP_NY7&gjZS8a=csMG&B!ZfJ9n zy|8PPCuP4@*@B$Ujq+BDyI|U8s|UJ3!Wyi4b=BWC=L&RHwOdz(hlm?xuMi^s8ufmr zD%!NQ>>fr_CKyfRnle{LbMU&@8U&a$q|;f*C=t);}?g~#L4*1bK zP`%P!L13&J3qs_M)ky;-^XDm7>N^gED`Ei8&M`}eq57*s8IO_RWeurxB5*3!%}EDy zB>_o-azy`bky)rz{TOtpjtu-mx;C+oXL| zuK`LUYGJK>iksqmDYI-`Fsd$9hG3Z-Jq1t2_tr`u$p8BuQ{wp@0TT3bZKp~*RuGhH zDlTn?%F&%FyLugmUM=U^o#xmoGodJ4?I#okzy1meovPjY3+>^P{^H{P{z_Nnj_N)@ zc~Z$zQwJ!6`4e=8>rN%^mFdcEwb4N35gf)Ky z^dm4MR^hE~DT+kXkCPyaFM3rD<@=UimCT(|Dk7Q&2|u?k23C8zeZ4E=gv9t^K^S;T z%7xTmwaepNOHq42t}}vn_Cc6b-*{Xp!n;~Lp}(uK1XnEaL?Yy3pGp{r)l>X89?92K zy8cf+QaOmj#(FQ#35|sDwz(WFy-J$Rksu@)cmK8Own6yLwd(0X%5uD8%3v{I`Gb{) z{4?}8XDgNZRnEdZ6+Yc9NPTID!sqGrA&NjKZbLUNKw9Z?q{=g>IxQHwp>8H>D>|fJ z9-_dYs#=~@TJkzmN%!@qJ^CZ6wy6W3RA5$B-@w6y)SBdH@y6{>LKt7Ge*dKC>g6XD zgx;x9Pbsx4MszjSzG3|CCO)waH}_Qn&r*f~jC$PdC+XDEQif z%f`YN=_r@Qx{sTF*>&A7{!6e_k!Q0}_3s9f(jyKwUKFk3S6y^%wdc>8Ru}&;-X)j} zPC1i_KkqDnk_hIG!tDsCt1_I8n^@>{l#MbsMhCL8QBmkOOZB8yTT)9uD0+S3NUa z=_{xWMP~plsyap}5x$3R+C<71_j>QWsg53@z{{wv9HG1bk|f^0K?yEL9P( z-yDDn&4bjrsX|iSgcMND>QE*lOnvM*nYoG*8xy2f>?3d9mL}BC(zFNP9Ip;b1z+s) zMY)ckrRF`S2*eivSB84)+d;f1v`0F6pfU*66QtD1%^4tB%3M$>gKs#{r5g9V0`N=K z@w|LSO+b!1{&^)ub_`Xf_*a~M9%H(6je6~Qg|kLAZluy#DOHD$R2pGn%^0cZai_s@ z%!)_C4tPhsK2n)hk26qR-t^+OLuq8Pi4?P`v4{%r->xngr67z|{dE*<029^e>0+IJ zoUU~B0&|U&#E&8J#a;}TpH217P=;|f8bz(bKMYoXHo6?wbq@;%xPF26mox z>Ju+0!@w7dUI61euA2U%thZfmh%TW_%c7ZqUgjS079UHjJD0GI|3`VtwsZ|b4Nlg6Pw=wm$0%L!+!bS#OuVe_ix`i=>cAJ3=EBr3 zV&5H2=!Tam(97m%%9pE9rC0GgxGF6eBZ6X6VgmxzYcC4cSb-k}*K}UtVQQsoD-eHf zbF`>#J>aEUvc1`{`0XP?ayD}#sygc>A=|foAEB(dg97id1=}2n zf}3#J-uaT0?Ui>2CDNGiTQy?+(3h1Mx5Deuj?R$kr@pMTK#bo*|NT{>Z=Tf#UN_j7 z)w3@vZ94;QLAErar3}{U=FhFXZH>o*T4Y#-&CyPD(cOQN`uJFEf`iq!#_9w4sfd+q zFJdLtBV(b&4^~g$M`;8TdyG$}*kg8NiYaquiYa?J3uh@5JFHu%x+e?9nKf$II3*$~ z*-=~_kf6I7cNzud*QzPwlz3U@Wf#RwNX7adr@SkKgx&c&LoG^>H{ixOyXW%9cD2iR zr7_4OeY`RmG;?;mf@BrdIze1)F##W9R!2-wdRwL-A%*+3<7r;VlOf(VJrM=`Jy*Rx zL74)f`=yDHqj#xmC&H$J92AoSf-gEi|4c5kdmfQJ1aP)$c?Aq-t=i%hEWx$vuvZk3 zX<~BxK#oP`U;%(=>=co-ecu*0y59N)H#PoMZjCK9*s#D4D3#26bEzvEK6a*tdEYu^ zv=Y!3rzG<}f6BGh^i%4!Ny?Y^$d$?MDj}((gcnaLNV^_kSEJS`MoFPCb;smtUKuVk z?ArZ5+P*tJs-kI{lR1o$ zL$Ln3Wm{`Us9fn7y_T;43e>f{N285-L&a2dTB{sWGg02yV~oi;0<$QiEJyUgYura~ z^1d({*%8+%8^eZ)D7>FKOz^eQ*}b2RGJ=Lnts-`~;%MG$h;`4~F#EhbT;M`_qj)&v z4(oz0>5kh-9s!P3Yz!QMeq3$L86nK;g<^D3f))C^e)>Hk#B>)d*ZhXR_q*IQ$en9s zj>JlG!FS$%k!y0_$$m+i^Zq z5O)LSy#Z02ZR~qPyop91Fh*c%OPM%E7N_6!>(e2)g@JiwhFkc!rI6h6z!=Fb&F$Li zEQIt+=Uq7yl3Si#(ZZEbd8f2P?&!{d!T)LW749oImjEx5SUsC-xv`OR4gc^s0nm6)E;}=cApIj2m*HPN(nJRw&rs}DF*~qDkxiiGOmIZbA_MccB25Dj>%*MjVthYr3Z(Hg+ zTU4^hFHbq*0qdIGco(XRdA+Hgz9^d(pM*7UqnNg)1Akz@D7NQ*vqx1r#xL> z@7?4Qi`;t+OzV8(SkG;8Nv?G-G%&@7dfxY)8CdH-*4t)8%n}J4vTf``amFpPM19NX z5M#hBSeizMz|w^4u+CqKF}BST{V?YBviVQfHhRsL`rV7OS-;b_ByNMl;;)_#G-l?D znxS61Dl|o>zGM8wWaHdyfg8q+%sGlPvvc0QO|UdJC0``z!yU)i^nTtbngg-=qS1_` z(wId8$Eu8C^>mQLi+H*(-O;pw9*QHuVoCJ zD`c!B6>I5S45wma?_81A0JFmsuXdvrTQ#>-7c6kKfZCf|a|879Ed!&BN8T2pM)!H* zhRQ7wV0<)BI8nNlSSW-xQ8rJ=eQ|a4Ypt)Q813H?xRuVh_Z=bcJT~td^f`7=R}I29 zoH6?ysYh*nM>Mv59Rpnz+Yh3H{F-XQyP~mWejWX}&AV#_L79yRicdrYJUX7dR`9CGV zLjR(`u8tsknBK7=2x!QB5z6BsZ`O{O0KN%cUTlqBR>q$BqAAR#<)^wu8Sx9mOw=jk z{!?*Q?2$_Ng`AI)QV=!$c#Q&Hgpj>vVawF|@$Du;SLG zQSM(TPkfhSARE?jKI1xdsnWppDM|M)7D?gr&)B3R#ZV|*3(pv@Ef&qftb7jBybi*u zm)>%zj&XP~?}ad;3&m#j+H_?Qre4=9lCQfI!JJ?&?F|&K2Y(~AM5T8Aau1ig`)Q(><_c8{n(3wmBV#2j^ zsZ=3MQycCL!3AzmA^vE>RYipeFmI~DgbU?M)ZNc_Rw@L~y5RFyURMQ$g{O%)W@Wth z8CF!vE0VRZctvINXM)dHnQY|GzABZ4pel1O{q)`ojq3$ShLZtfGhBx$Rut@OVRaG! zvoK@WGO1L|StedaL&q!^Eu`8|N2v{cmP1@*8zYy42b?#qEyw1~jai?IS}^}d&?Tv}dbNm}M%^#OLzetf@0gGm_>{^q5tmz9 zeM}UtT3v(68#lxf-x%y@er9M225R{;LpvEGR*3ngr(SmLg^MoX+N;CYeG`Y{kKOA; z*|#7iy}d89V79GJF3jh@XvB9J<#9xK5)0t-h_lQ$xr{3E2s7xi@J6n{KaTthhaj8d zj4E=6J!Tj@c$rzR$3Kp}*?hB#QN=Dag9;eSJ~UEF1pJp7ca(rVO*URp@IJsY*{1hB z{B#^P_FyZ@*%Hhe))?+pq8T7l!H8A3F;1=}gh>6(C|M;LnWt3T0bZBaxlNQYqEuvs z!LnlN#b_VB@Z~3K>t&;!Y^_`|W3qu+&uVkB;?#>Ca=7&V$!&slcV_Ekz2sx~#Y?;*7|8iw@x;?tWDEUe(gC12n^yX+|(t6k* zaQRhGqbTFI^`afvWcmg%0Bn*rpa**x+cs3inD&lKdJ+*C0I*)_H40h1eJ*hXavikxzxMTA3+VgJcbcm$6!PHz+;fycgeY30n9 za7CO4E4?P`|FdsOzGU(7C7#ZxO@Hb4#MHw^CAB(+{bk0)O)zT@j@PyQnXv&5=PU7A zDCPIHVl{m4CM@*B<9Z~GV2|rY$Yz)Tij4-FMT!l3KQJeoR(|XBe)09yy4ToZZ?8y4 z3&pZm0xo=kURkVXU*7+S<F4rCu)cN}aX5dJh*b^QS6X>P;nGG%e*+os2SL5yQ}!bD*;w(JC-^{()xywcjc!WU=s#g(9lP{|5o zY}zGKD&2By-lOYVq)`-w3uT~K>X8p#jlteq@8uloSg3L9x8iol^}KH-mpb>Y6!z)6 zA(6%#3w8^yzdffaF<-uf5(k03f-^SS17+Yvqu(B^@V{uR*&|xZNpXZ;H1?M$!?hQ- zgYib+z1U4vY>e28F}B($+>0slJY&;d(b$SRHT2Uf#>FXRE?U3qv7_-c85b|#tY;hz ztgp1$%|+h6kypkQso`E+RJ~`)3XSK!6MTpW*AB+(12;qk@LjacjEDAP%|YH+!`3g{ zMpIvJ*yO2(+{n06wCbHT)7L%Cc9Z81nC5!rD$dA1AUg25^||R+V~t-Az#zZINIEDU zVf($@rnD5-J@)(kaEOtAP;dr|4~o=8?C~*2s@Wqx=NUMujtgm`+3|@w0&j87Gr|wa zWvPrqrd@T)Oum_B$EsUn?Y!7L)yO-fHr#%62uoo-bhzq|H4Yqt5cy*@Y@%G-CR?KY+##_R~Q z*vO}{V~u@>K|nY_ryp_|Nk?FtId9y1M5M;fF_SJq8}X^qFBoU;HYVbwxN0muB5(@U zC_E;jjfx{8#Qw=ykMq-+M@0fwDiV*1Byq-QcNB63Becrt-vZe_Vxpn#5U!XdAIgfT zxrLkO7R`r-6zDs;SY6ZK7j^ZD@jp3qcZJ=hX9TTnY9#-Fk7L#62e63qPRiN}kC(>M zA27JC8o&G?OXNN#QX>}5a7f+%IBt8_3T7Bt$DqYuHAWrt7W#HPUBXkq#}0Tza_H%8 z9WJBOaS`bF;SB155tQCPA=Vz`+=ahWMvTB7hd};6y?9)#)#2P_&~aJC701OijKaD5 z5EV<4?C4-zdE%oRdK@YJR11SVBOI_ zv=%)%sJ6J@8jADOrH=LSmP=+eCSI#vnpIc*rI~oeR}D!SSIl&?Mpl;$+egU3E2(nU zHD9`-Hwxk{*HpUHg4e63D|^kKu3)6G>Kcp?il8h7BPj#K+`}`vda{a9{$$0kS59Uv zetoq`6=NvRf?LXx$N1xJMqX7L_?)iQ4|GZY3mVN@tEdS4Vn^mAWdQcb3ad$h_l zb^o~Pg~>&jw+Hu+sZyBzW6X4?CR9(Ck1%h#Q{$?nJ2g(F3%EQ9>Aq1!kpEQ{j!*2% z3Duo->er^s+Suf2DK0f0y)2eME!t`opo6g{9pGMj%p`HN=uW-tN?D3qtHyx}k+t{p zmnV2XFDYb#S?Yc};}RWPl3 zva+fEWCd?}lW~t&3f?rSV|w*u6>s^I6;G?2%vwCnY}m~+knZsRrD3tAZPnDJay;hp z+~qgx6+h&JDCcNN*Rk9Y_@1}5H&3rprp?pMCfGl-dR=l6=1sSMMwN8?XQ*`Pr)E`8 zmya-Sx>Lxb3e{5|hY+7wzPLuwfdcma&lh@}lc+8J!{ATYR1PgElV$*W>(;xD)}){y zAxiYSZaoj z#?nSSHH*&lS}ribQuZe8m!By-TwsCu9$ovjg^On4;b!;D!=6wPqHQ|i3Gt{c7Y?)0 zv4;iHS^60tAy0(Bf#pmsfV!Vg7BMsg&%Nw#)e|wehH$~vG(G=; z)($;)%pr%~dG+RSeZo5Z`7(W8kwkj)`=WE!Y>i7Jl=6l4NayxUZ~3~#(P-aq%rC{*7iFqh7v$ACTH z;BXnR3v_G3p=E68&Y>YuC}_$dp_#LjaMKdz(A4xKn5QRHhFBX!R>{I>&JN9kiM0!&nYS$Nvz=e;y+bmLJp1Wyrd|6-c{p1yUY*qlt*co3XE7g0%Z)>2|pU zIk>V^&P5~S7nG-1l3rs?UU6B6~zjrWD?88t5i5KPI~lg;Zf(U_Z`jTccd=xg&P zX6@j(6r4(zi<0`>ryIIxCZfj%6tIP^CiTUGD?<6+5!&}fHZ8%~llCH%4UeYf#kXF0 zU2)Zb@lEgpd1T6-jA`|L-1to~(`kWa($ z1}E-m2N0%bs+Gj!wFh+tHV(Ly?{FRsV0TfmdhfXzc3SaOvIrytFI&rfU~XO8cmdb1 zJ#;*nenIGNxt=xUz9=eB<^i9h_q{vOMfFmIxFKLEdo6^O^y!9C^k0NLCXUm$z+7vN zR!`6BJT8iI+!*WP5G?{GiK(<1*aKA6P@j9-4e)c&>v*KT%2m^*_ZiyMMwuRg)t*f1 z3+x2U2X+;^=@>8_shZ+8_9obxBR2^-A0sVQz;_25zMHYbJr@l|K%=nPds5t?+MEJ6 z%y;9c2x0u`Z9r*&g@=UO^okkD4n5-7=5RWMnQpl57Kv#zsy3nqu6n~_i5_kpM&&;y z;y&GiBL_Rus^zgFj%w8r;%#xJfY9vJcfCCW-3Fa@k=uw0`F7BaH-~eE=#zKq&Ls$YVwQa#EJ}PS3SVYt0 zCPLg6^zMosHJsmCwFt_3s43XruL$h}2MIl!3h|w7rrfss-ntmNGY#Y1G6&~^Le^pI z;0b34X&>-*v5@LCL#;x&T+zxB?xYfYFP6TYN+j_en&w)XlM(TV<+BnImc5z{>LX*i!8k);6`iyYO!NE};KRi^a!Br5%wXS}HzTxAMX&)?q9@K5CJCG^>rn)uQTF zj(V~lybcqfnJc9@aT%b_HzNx>bFb{^$mX;S9|?Ate3Q!X)C_w#$ay1*?fCSVLyHHC zY=tM@7uV>oOCnjM&Br3;N5XHo#4NJ0ED$_W&{pJy-5qp-zhHj_1#GIHz45Gz+^v`q zWKnO42WSp(i1i+=IqtMR6HV!@1)oZx0YIk4&w$vlL^rk(;&ZWuDu8`_lzyW=_lXP_ z^#`#%4l>&g91k*kxShbn=P|8~9(ippeCob&z#d^zfa&$YN@eJjIG=E<)+y~(r?jiQ z81yHdQe|<>p|!8nDeVb{I^nWa>Ih^U>=^e(3J&`9q%u6Ij_6ROBk;r>(fO~x{%0K# z>cAdAUr%g9W{G03el_#y7`%ac$mgSjoUc%LM<{4$TMgLLvV8%)jX%j@N;w&8b6cUO z(3djOG&&DVGX1o`rXsDZM;W0OHS8orUFaj-fp<7?;wC^_hjZ|o9&ynp2)ZAyLOSCW zAI1sL*3UtkMAIOIJmGksLvR;V`c1W5bQ(diH(ay&+*|w1@bYsz`E#mto6QoeH%rha zLzSQx&@91bvjnRV#3hK=d?ncGFM*9-M|dAqj%}675l$gD2@xcqD+AkxsPDqys~xAv zjM}1ZU2j=#L73X6wcd`uYFF!6{)^E{bB9CF(}LR|2Ge$^wr3|7PiZ@9sNStqN40lL z=7O!Rl=%dbCaWQzt9%wXw69ejYS4cz>lh_BaCsiAmq?uk3lT|=-VRw#b8Z&cw%3yi zfF8%2pJ7ioNNy*dnzw#c+x2&!2X&zmfxdChJ}#;09U$2H->NbMVh#3NGaD?I$_*h7 zZMV08gDLM8d^vyz{~oh5HX-CTF^!_S2+a78(=gz4=oa5m+Q<_55M?2xH?2g7N35kXV6s?Ea1kpyhF0pb_vtqDK*KsJ z2&wi`SvtwASw&BUg_4K)+4<=D!H?YvEo!K5i4K3hKPvK7!+k)EKIr<5I<7g3n z+oSj=foAc4^%vhxFLxIL9^t71cpJ3XwkSJO*;7E1$}V#J*g083u)C)K?UE$2Sjs|3 zKM+|lFxj%&rWd)Ma%EbzcR#=!Z&?6H3LR3+_+>yptk{29<8lb|3q^A?cvh_b!k3`; zZ?6CEMD>?C-y_6LHh2QOLf!5K=b@Ddz$Hnv9{3unb|*r+;5iT2LHtHrfsMtlbP4!^ zI7tKVQw?4U94$)d)*d`4*3wfzo<R{jp2dL)#%(bUc8z4u< z!6N7eztI=K#`fPF+9W|mD}zMr|DV#16@ob8pKte`~v^Z$BSf1FKj~Vcc;jr9 zvJ2v2Loww5hoaLj0h4VQR{3iK=}TZs`&x@OU+9NE%!;Na;LyR8_&BC7b-)l72sMDcj>;U`LgjXa z2l$FGZJ{hleVU8}4MN6!!WXQ2;qKXPDn)edmKLhS{OQyEm%meGSrlRngH(ZA7RmN3 z=p8ynGhilI{s`c0VkvC^<{W zIrLs#koFq0lwRlF4(&@-L{{mF`HAwkx}e#1W?W$M`Uhtz@d zQgURh0M^G?_#Vh~vGwo1_!o3BWT2vpZB^?EbzpmCy4ddfL?yb|QJF4wD7v8i$dFab zx?sL9K<}6dWCnK%INA-pW0(I+O7HmA-*>Ai4?--anw)_<%IoC#zmkgWP@X3Lfw;D1 zYJ0r2F&+W!q~T|;S@Z)4xt&G+K5B-)ZG*q_HbEv0_%C=OWa2zv8gK`YrTrD4DToeL z5=4r!$|{MVevlV;yvR~uZGd)|2C^KAIO6?)6hueNa^P?lOnaGh5ZEx_0_%R?o3A`C z@fgXZ`+%%`%mj9F$kfLLmA`?;qhAq*jRaKpWh56Ds5=n8#K_=hhs^GjH}1MQShWiN zNfiU@C=~e$qyZAO1E#@1_$;GiH? z#1iQpq;+AmoU5Mnk4B4?=WrEB6CJ>c{4YXJf6X0Tg?rwO5it?-E|25)a%?03-&}$x z9v|ob?i*@+$P+#Ii`~^c$4VFiZUcXx7tGZDsntbqa}B0!L{d|$OR9Blq%8>QjMfPo zih2gH0q?T6wYwnbKD?Ugdv#UN+-Qr4j>e5|;V=|UnqxOl2-~$WbLa;|d@1vZgx=)p4*Gdv>aF)7N7$X*AT4BLU-VtN`Us3h4Mhg zuHfn3>g}RpyuK6Nr<>iGJQ|$@);7aJqLEd&N}fPKdm##OpEY=#qJ^1?ItufJu+bvW zXbQ!Q0j0v`XPEi)$MYko_XeP9k=e3EqUjn!ojsQEMB>84|n{kS; z<|@LX96YxPQQiVQHQ^(WRv~0KQf7>2emb9C1U753ptkm|zt7|bcy);%nze!DsI6ZE zi;WcuzP6dRBMFu%>COq>0rtK{KRbMzi$)-XD{#Q~X1+x)pME5YToW+x} zYoY4DK<7ESX%fqhEA%`t3Ee&sSX-3DNR8&ye5#uKwgd7?^J?IK@wryhcygOX#Xx>;{ub7ixUpWrpBDe9owsmI zF>TItAzpGEVEfW49Hq%T?V?-+-3X(=I$(0Gm3D2lSuXP`TBVS^PgnT8`K`a~80w@W zrZ`8B0=Wmq0l5c00CEp(0)|)|lAV5Kq3!i75LFl7hD8ItQFEs14b8+sK$fe;z?R7D zEO3TH&PlgeXh(eu>>%?ED7OJ@zJPc1$a+m&^fN;Gx=ZZZHnTG7>;)@asspft)w!1b zI|~y?+hf`ei=OpsTr91{b1U&JT?X>HSl8KTF5n7aM~wYl=Gdo5Nc89NVg!)2fI?sw z4ADL25Dg_YME9D{_n6Q7%;y>Wj10f?W{6X4;x1IbF*wIf$nbe!!+>0#IUn@%lpFAg zLuMA25QDQQ^Jb9&snb-Pq33~(5b>}XaWS5`jE8`%n;rEgXg?1LY-fU@_hjRpi-sd0 z3Ne0AF``O7M8J!fP?UJy<;4bMdfMbUrSA!BecVY07z5NwlD?|t#(sLn;6`yY;(Z8A zORm~=MhiaRAo5Qr_ev=Df+xJsvi?FCVzLguB{Xd&QJdrwn$}6^6CA)!5_#?K@m}w29&cGCGU+4|Qep>n!xE!Tl zyiACDv80USiF)<`Tsr>K)Ms42m7nWQBhW3&K`PkR;86+z9N?*AQGay!;JW3wRJpQZ z!E&6{>traD9iYnlr{v<1dCr=y;v-J)_6Can90d+_v7bg*@10K^v0X+wFhrF>d zg*6pqS&uRh5<>;}Ddu&0N$2GgtFKwPF|Q+)cepdA&N5mI3QocEh2X?Q|@i$J3nwn2K06@Nrz9Mh~y% z;RF*b5Qn5`2ava9Tm{}NH!BFaS;2zM3fD)FAX1(Wf@!Lq?mnNTi)K39X$Nz66ac$DiAAa z>(CTgmxHw`tR5sN*~cvarA<`fC$M5Saoc(4QgcLT($6%*1Zq}uMKgzvB3~b;DXNEl zVNP==P5w&Y1Y}l8@_Lis+_ORPo3TLVHxF)PeuI`8zll5LJ=y_G6V^GK6=%5x$ed*a zFq^kHox`7d*+{bmoomg(shH%?uDEFl9_#Qjq7|p5EAF>P(U3J(5k6-t#H-~RA4l5m z(nqA`s#Jt-FVGRDhq$uPejANF6kdIDSh$Ory7R@D(^#X z2W$lUkr!_&I1l7a1yci7T;7a{T9OWc?8tAVX&p?SrucWX%U`rb31JS zrZOKh?>_Qw12g$p8iZUkFf4Xa*+M_N@HH1rz+*Z%*9zcp@ji6~zxppYRS|G34wYK9 zR=Q|D%%v~Ld!`ok`;KQY%(q(Wa(v7|z;%4U2K&NZ;vt4d-=?7;#6HXNf3zDt-rLNr+ z6|IN8{fsBZWLkEO_h$Lo-5q7UR>o9Lc$A-=)@ia#v)I2QE=viC1~6@L=K ze_COa2UXxdTKj$l%|jq>1UU#~Eur2KDEyXtG|D<;gAiPU$0nA`i|8!=L|J}WM2@2v z5&^{lsGObh@DLq+N_WUC-N-ViU5(m+qdN8Fh@zM#0`I_ro$i^3mC#do3JF;JDeln{ zdY{}=u@v<^@{oE-kjyWNZbHaCYSadsL5mQCtJ3KJuyyeFZ`bAZkFcc4ht!(8AR|3~kd=e3G^!!d>yNPfG~3c_S#_>_OUvw>UzpV;E<_ z#E}*E6EC%N(aAFq+%y{R(&FD<5${i|wo2B})~?{hTM*%{m;=9fLd~n;1Jn%(S{xW# zv*TDohtQY;d{xyB7iebZL{aJqEJLBCIsk9Qk#_Sey4U(0ptz$Pn#57<8+Fv5R^Y$8 z(ZNM#QGHiwLKRZG7_j||E6-m?TgB^h8-WtzPx4mKk9N|H_|r7?XD42nXVY!0MR}8& zH{*aEj6%c=p7U+^2?XSw^TG4IDczR&|KbP}hm!3_D3u|ww0bYoA?-9I3O$B!mm`0A zJkI!hL__g}TlQ!+qy1_gH{ojhZ;OH9p~xLgMRb@__Uzhx`PO|3T+TjWBggED|LCdF z@_sNY@22GHy^c_(gnVGj;C+(LP{Vrq+(p-1VfAHuIAwd_2Drm@Toj2))e7IYlb6R@ zV^4Jr?VFv{27%4Q&-4t?4YC^t?DX%Nz<~-kgL$DfP;+cXmF=kVa6EC9^BIE+-!u!~ zlrN`s(E)^d@VRTil;Gc{n?2i1FX{SYtuW<(4ao?i52mA@qh6rePn6wv;2pq+urdmK-&TPGGFW(6bd#cIq6N zS{pu^_#TMG(?Bf=*e%XVo!28Z1Kuv`{x(@%W8s9lb5Z`s zb%ZrsN-5)8B$z<;k%MX`(zu_Yut(&6yB_{8YP5z644XFMTbhs1ww7(Rr^jA^4|0d5 z=FtJ#`)@HD(8*Rmnv%}3=9{Uz`@#O%0S~osJa6Ey%Nqm+Xy2XThSV3`N^vv?uM%5X z`Ou@en_Do|*Wjw{|0rHNSQPKB!8KGB^ltH%yWyzgDWr!GW zM-;T-HT-vX{Nk#-!Op5#mFU8ycU;EWLF^&au6?pP9w{fR#u}e0rrq4MA1M3bk>5ai zRz6yHXxCg^F2*#bs$+l+_!wY^oRH=HtS)`f{=g_b|3BNC>V+{O z4*KtT0e5&=RQCdyp6}*M_%M)0(lLyO4^lt8^&nPceMrtoyH=^|?A&!r@V<%ofy#jo ziWAiSq7Wm7<912Ysix1f0#@GMhh|)8MZQo{mM|`}_Di*4Whh@%-r=!C?U?%-u?qcv z3;ciQ^WQ>iKXrd5=tZ4f2y&hi>a4r|QY%ZOJqYLeuTbVC@HAAQKhPuA&}86e%HEFs z`x~`5di;0n^@4rmMIaB|=_YWkqf-Z za%mjx#Gkg73**S?vWVs-ov-kMKg@#PUsYy7_ci_!HVgvQ*5zn_PEL9U!Hw~H8!#A;-MNztI; z+#L-<6t&b>Tcv#fO;a-rRq>J%q*pm2c`cTINki1iZUO(AM$Z5nGuM9$f4oNJzic-; zgqTS%KwbehOhTiX`-OdtrX&zI8r>Y=YqbX4zb>0qoAxn{MDRpQ?#Cq&4vQGcbdeW` z>Y=SR1I;#SOoeEk6iN!Rh(OhBO;pu8A%u??4FW1MOq0ZuhEDNeKI{_PpE7K8T$eT-Lt2=`&qNgPE7V6W(5D;6LAR)Gk z>0N|MiZuOzR-s7BOM(g3)G7YDXHSu`5SwdE@6t1>U=`BYSd}s@ z&LZl`7}(@1Yx_Jx8pL{M9dL(ZEF(}A6n-1V@s+c_|-XfRXcI!L7 z4vnJ6@EDKE=Kya)9;<*igcqK+$hl532G63?1jiU+DD2kzYUriWms~Ur&rPwY{GC}H z{|cqKLy|&;Zs9_Z2Vsb>?}#9OpjcAQ#7Sulsv@ERBq;5 zX#o}d>7Ngx?Z}81NX|&SLgC41Ao-=Ey7p>llntKmv56O<-exc0`-YSm3*L^rf3dZf z|CWqH%*mpSdXE)U_!Vkp$w%ilfSV#u4Ro@41-T+$@s{8QmhIkG)ZLB2!8=U*;m;rx z>^orNS{TUQZMkL(!l)*Tmg2F9gjAL3DF4J`g#YhQSu%PA5pRvz7Q||+;%&!NkK3?9 zw;V5-KK1~UAboxVGQrnMMbF^*CLk}&WdnH$Xa%qtXy7Mcd)ZuPC~p9~oYoH4Fb-?E z!*O?rB8)ivpHiV_6HffUc7~p)ZNUMdELsc9#+uz(J^l9kU36C+3p|qHm=O?em`aWS zp>h|}#(HWnIk3dk9Hndnd=ooPHv#X4;i6Up3pP=fP#%zXoE8Fagx>uFFwOdyc3IDg zIul3D8d`({OH5aA^G!c&t-Kr0iCALl2fPK*7Xuria{GWCQQ5dgAaFe21?&U-2*{G; z5b$w_+;A{j=-T$9u%b0aQgFdH^rANcTqU#cI8fA5J}^?ThF;8S1aJ-GwB1yvDTW0U z^2|+LqUb3+bms}M4Qnvv`N2`N4IvGnyu%-0j8&Vzks{M9Y)R3#?Rhqi`r#o0jSi(z zAJKn86upUn^nf2{CORhxy=+U*SSmvZZ%nr|vtR?p3A!IRDB8QSAE*iw0f5T7AMctY zPFQp9(~qblkoCG=K(>Iq55yJLv=xYzSG}a~fVd!Rt$&jz8}a&qU`MPKTk@%UIw+B^ zjCSe+&jrPljKXs>;rpl!WQZ0B0pO$STY$j0&K9kPUaqxq=?>AauHI-sC{J4ErrBd{ z8m6Vx?FJMseDXeZ!Z#4|_Kkfs5rIurVoW`vzKPNUMZY>B-s8~%$D`$)mYLDd+Ter{ z8{1YWS`5U0Fk3D|=?ZGm61oUv%gr zKi?NcAvZFSW>PyKs}+1zhBjbW6b(Q?oOA0=3u_fYEQJEKuXfT~2yQCpL`(6p@9>0= z@!g|lMeDUfMV+~4WHJb^K=9MCXXq&eGoc)6cp;7o@W4gf4^-cb&`Xc}?xOJ4;2O^J zOXZD(A)Gi^JF}EpBiL*wr;3<^5YFKvU_6G}dSLVLyg62>^zd%%iE}8Rjr=CH1Tp~( z1x~iC+C-sknKG78Qy{LK5qh_uFUQgoc!C>3`UQw=Vwa;c^t{Yp;dy8za9wc>uv~AZxcdg;zOcBigGd;g7(3QNqq0E#ga*(7boUd)X9hCMp@1u#-hRXhY6*X)?+Y z=PM+w!kbVSr?vp$@0TioxCt01jZhZUDFX=iNYon$|41|is3Cj@&{x-1h)_2J8F)}X zbIrV_0>;1}(6ya8!U{e$eYMDwf_=CdKWr6qVWh1V(p#=!K1V!rITOs0@ z`{ebxIi``?YJ?3&QEvRi!TN%m6QexrV8W}H=CjQJ`e>uupm}k^;a`NtQp1O#DhH`` zIbIl9g13`=#&P{x#y~sux*ftA3=ux{bW!V?i#|p`lI4ekv;%)!7BGKWjZUU(cnp*g z1N4!5kHydd1P4*$J0O)U`N{gDF+aqz<5+qeArC=7tpvVqIbqZL-gLpm)6k4}LD1%0 zX%q`Jr3Q`g|GjMPZ5oM~SdF<8U&Jh4-?6r7Yyi7hydw0ob4J8qUd9um3cQ!oc02AO zinIs2N*di|svwcw)I{hmpqv2N;g~%0KAv*UMv$Cx+TjEshl7HZ6960BHt8dqACILK z2yGZ-dSXP4lDbRwtEVSii_#anj@u~?(iDX7G|7&0&$1m?A)o;_O!u+l*%K6Q zaDOr|isCXYSlK*5y@9XC!jcs4n|eXbgPO>eq<_&=?Xp+}JVy@z6D??<=Tj$n8z>K9 zW&-fUTd^NJ1GCBMzzMdY-Mtl$C2d>JgbMAqt~z81Q_k| zmUtOs3S#t-A81JK`1vk$2+|Dy-)a88x%_vA&1+~2 zFwZ5!&_=6}Pa;&;13)&fT?F#nI{{^gx0LUs*7!5ka$sl4X8ak$TJL=iDw3N5&{@yQyf=!5Z?FhEGlV89{3flxVF-vBO)oskvpp=!tg1mHXERe; zj1VVhRf<0iOy2UB9Z#XXSgf9-#z5XWQ7y1Cgd$j_oWti9bW6LD#O8(b<>L5E12^ z8{c0h8={=jUcs1f9`=UHZa-Xuihg2&VV>Hp0pp8!9>X4k`l#OL=zpT<9VCkj`(73e znPqC<<5qxA*STms;)Tc-{GkS=mvdt*LQqpVP>$)PJBCG52#6q-LI+}0pv^l2WrLpZ z(^Mr9Az9r&YRYTKh$%jK5aSi<2uzYiIfbGeMo~h4QU%6@&AEn#<9&h!4K@pZWP_z= zTi`^D_nq3I$B}ae3hq4PZ5!EQXKK)tV`v*^g*R9>Sp~kp!NF&}O){HC{ufOKqtnlr z$_<7znQgb?kjFW1giO6C8=>bztT@D7;j)Uz;9ulB$-A;&@KWNhCMBMUuwti88Nz$S z9gfj{^YuT=8?Qk9=dHEPVHMG#=T&LAK@3{_qGAzSfM5}H7MNgJcAUarVq5o;<0Z53 zr#nl5Qy?ZbK{f;(n9Sm`Ni~#%upq@iVAH@Ta#22l>YypEnpE-~ok|L4$aZNcvXhx!IM;T2vgd=lO-SEPj_=@zCjT) z(2CA6oSScGju9rIjr9ggLK`a-p*hE?x?*fHryhr347MmLK~@3uaSr!nCT$0LWIIow z%#mQJSZ%RsmtV7)6Kk7x{x$LpQ@pl4kS))Bfncd6Ilz0Eb8a7@Iy($GFwbocWS)B$ z&=a1w)gg0(muhYNRvN;e!OORRoZA;1Sr*|f8i^cZ6icP%uW{>UQ9Ga<{1=0@DxAYj7VX_l^*?asER{!Uqk3wmnQO35co$P!X^KxH;VZOFA(5LE6SdX=AtR}tRj@c-{3JJ zImm25TCx=ydPf;1yKj!5K{BjAhbe7}WOGH)6a;zD>P5gV?o4g2SyaF1ou{h8a(SMv zb-UL^SMcdh)Fu>6CE^`b6D$^?RPW#n6xcD`6=8tI1i!1^u}Q0VOx4bGaA*FAK&7O; zN9DOpUrA$8zy^K_3Iqi)HC5K3-dDM@c<+YjOa(6h8$*ug1HUm_Xn~~rRO$uB78-1x ziiTjKqVZ@rT;1k9*z6l`=8T z*xv$kk<=6JubP7g$94oVIiCb_MVu2+5!*f5$AZp6DUB+*7XfiRO8TSCP5ojCMq@lq z00o<8jk&;^@j3wlbg93G9+1N6Gc|OvOK%F#<*|GN9M3G?dq`N-zcP#eHyXxB^jn-T zXeN*qz-2(@?)!lW7BHoY_#>Ip};v>NTDZmD?U4J0KeC}A4fT1H)i3|U~)-3SUp zvp)<}Tx2b+Vxnvk=5|zKWZYNRli@nmwY*BY3d!q2Gyh7D3?2%j3?8$%h1dJX(*Gnx z-+K#kE5(TQol*9Y>PGc(skI$NEK@XW@_i7ZA=oFm(F=8_o4xQk{zw@c3|4Lu)E2Yd zsXxL@*}BzibTa&5+Y~J+F~Bp|vv`*X41XK#2W-SBhsQUv9b>2uLU`N52%yJVxlaPQ zPl^z%IKVE-2Vpj(Qz_UGOyM(S$CM-jcbPP^yYhez+2f^!u{d(G|GQ`>xawXN#;$Vq z;xu{mYL_!W+vn>i5Xn9{YGWjS;$kfVpZcFQf+Xw?$bn|?zbgU32ULk6LnvyFnn`5< zc_8%yn%!Dvc54u}k5y8}(XE6?a&WaIzr-)EEE|Fk^C#pGqtbjR0+@qUn3yt`*L*VR zQ6TT%84kPyxDm+Qr~(*O#XcjASivV$lQLiLG!Ls#4lHTdwUcP_f>AEohM-tE&VDpQ zt|6o$_Wv||N0Ccc;3Kf!yaOB^2kXrlvx4fBfR`2hJ4+Yq=J{+JgKk~| z8AiMYtV!w%%s-ECCg7iw$+?0pLr~1>FTxtlztGU9AU==BkAS}M*r46N)#-9&pW>I2n8byA^TG-`PSRSD?kW~-}stqtrX<5^$8zQ)ABEM2W zIu#*@XevZdIyMQ+@E;p7_5Qb2A=uV&4UxE?5biRdHAW ziTDg9l%xJViy97bJREqZ=4QEDBGtx{*r64lrbiH$iRUFC6VEJ8E5*iqRnR7}ARaY} zTH_Xlz&{v63*@II^$RqGr;`0Fi0x<15g04;Tv(~an&4}b@P;eB9O$j|N3zoO$o&Oc zm5)-}wMA5p(G*2@A}9z$WbyTtFZ6d)HsWwMO=6Ud@UhtlRPZn?la2n)s`!bj4G)H2 zkOwzPJbH|$L9KwEdezN}enzlVCFZf3!;zhp8$6I3d=dA)Y>dy$#wbHbQ+y>H11|C3 zTM=8>U_V?=g&1w|Rn3QqbPZXC{-cR-+Dc`e>H=gVVm6S6+7uuUwNHQ^lPp(O8fww1 zhf1g;hKD1sQA`S)!MWfK|yLA zW0$O5G*uudy*2z3n&rhD+hk?C)wfwA+kIVSG_SUCgu&;OKP~bNauPJg1S7 zG^Zc5NOO7|HP~noHLo)ab^XVZ$Xrd4+B@jukZQqTwlW;DP_tej=+H7VP;Oq{j?Zyt zo(6Jf*4)Gb3Z2<^i|WidK<>;fCSC^e;J9ro^6HYQ9rt&e68JFm_*hH)k9^_d48D@W03DHY(+WIMXoYt47CH6N0pl%7X0oA;&w2O^_uz#L%C4qijLr(_{8 zof~971X~BiJAP5zJ@{8uRhG3Kb}DUnFp#}xF9#-i;2Ne1;i5|}`pOP5anT&%!Mk{* z@I>^I$@)96{7ZJj3#_kIApLx;0yVK(tNiZEnI1tI+VERl1+G4yF=~T6;niC zRfXr(#*{ruL|?nUup{KcwKV$nLL9Y-F%q|BLsc(XfshYOz4$e&sTWUr2K?Lkx_7}_ z3d7fBf*2~nyD-}H9na3Jv=`V44e#8K&Ud~s&d$4ka3=xpAG$i0Gz2RV{022Y3|SgJ zMrF$HL!I}~a70jYe=IdGXJPvZLOLSHvp{LK8*iR{_#-35`9&zkzgF=kcq?{}HXcyy z@C1-YkmH~nLDU#1P4~Cqk2Jj;VKP^k#haSnD20_*vY9XW99sH&E%%N%6)H9-@y@R?D)Nh%AU97MxbVaf+~ zVUaVlN_^0-;V+f-h!Qz{fKuelt`hm*i=0kJxk=%BL*f-03go7p31sH95-26j=^uP! z@f{Lq6gOoaWBqwHJp|;o9mix$3q z=?Qilx&Hxi-F=)lF=5UE^jOxdqa6HUJyZuW2U-DCeN%vLe87P-L|C5-tkglaY8~{E zzk}Q-kPSr2A`F(g_eMEJ@ji_IVJ^cG#Yy{-8$0(r2~4|AnwWQA`~zF{b<(6zHI3oB2l zlz19_dM7;5m>=_QI}6a3tIx4ndAYYF-j$Ef)jJkIpZniIkf75BA;%bW+8Cgxp5LAt zYTD@hdU3JLMUI`Vh+H@69&Lr0o6nH8QpI6YhVu+|zPc3`V;)umJWToNs)7ID<)JX< z|A!t&G!{>Vz*ixz8da$0mw{ukMgOc4LW4{!140;;^!gd(%MF&^H(Kq zvP{ecGNbqi$VQoMjL!YD`F7>h8ttVubMx#uunsfn#sisjGk~o5JOcDh08nOg#x;qf zOIf;&vanDH6COg+P_EO!L@rmzMU+deA$)B$4b0#8`hlLqYu2E5nk{H<+zZflsTSnf z$2*AQX>{d^JX-=e!1DR0E0NcU{%`%=avBNhhTNm=_GU_H+pwJjt=i=hT2+eEJs3?J zzH-q*gbb1)d#!SHgl_m9MT#_A#>Op!x#nye4Z_*lnBaZtGj&j|;fTnJ!5JVc1_LfD z#b73|p*g=eNKOs_( zRSJMKplQxL}wm8t*NzTdm?lmbXPVtDKOW1~R)z0`W551#E{t7z1R_ zSX+SHCntdkwKKKzzHfM?#0AwjYVXYjr2tWT@b{p4)z@(ROyr`kO{pIu^H|FT@>nYX zJ_d}yTDMeIu9zRKYR3F`i{>mmPa{KayRbmjc8!5x!qgoo^^*Sh^CsG9WsuoS1;MJB zP5`-i;=p{(dE01xr12>1MF{agL3zWb&yB$qG;+HDtwgAFcMVL0t#d39whCm)wY_*r zIOA;Q_9L~VH(p-GCCx6Au>R+1;cq)$(o<`-UTUA^1iqR6ojHY-_W~f3);1v9rheyV=E@#)2T#a*0ht$#1hS=RHgJF} z*KC{axdU5?c!APIZKAALj?1Df;QzF+VTop%n?`P+&ybo(&*3rjU+dcWs)5-ZUJ){2 z8_xlme-`}?WSUNiVVcHLMhE3Z|sn}mg-{D12JLrUF z=1|5=O@6s56c5PdzAu~aK3DJ9P?n4}Le({2$gYW@`w+tGc`pDxjjms2yuP~b%C(Km3C|Xn|()zkQIxUt3V!#jq0fW zz75Dju|H4_#c}u}hhkD)?pw9iv4M(MxR6l~y{C*Q8|gHH+!33&EqGkY<@!yO1Zm=q z*sPk(4Bf26P-1xTS`Bd9gU|+D$K8+yNApQ1YA3g6HUXN!!z`IY^4nFHD zxq`>p@a3haht`Xsq9#@mA3kL*1D+ z-+_GLTHndc(3_-Nu}2<`dwSr{!|+8^1iS-2k}d;>uy;2b{B`v$oPp%=M>q9_v&^_-KJd)#pBw#1FCdE)}$Gcd~?8674!>+@+2 zWE!QRo6(~wI~U)gaV@PPgq-*d#1Re~HtlPX@OaxC0iAHR zW*`v9N2U*(Qj3=2f0}JYZQRM{X%-PpBl6%%EJ%6}z?tn#inKP7eCqKuel3&c(LnsUF-)$uUXRCBMRRGLnCv;cwhcB_G2cAP`gw+B|$#BPNsk-{=RObP`9qOa;euMWJ3wwI_)9>(gR}_9&OCPjo8hb$wmpcJA@j!a zn7?o&%6Wk@5aPz0zQEgUhn+Z#;mnJTrZsrJ6HOj*mt=8tKQL2%{6;<9(%VHP2-qb9 zTG1es@)e5gW)ZHS>!!o7%r;?xBa4iByc@~O|r?P(Z% zjqc-dG+t(q8@J{z|RFEO6t{TdC@`~t^)>YJ zie4`2fRL8rFl7T@3V0E3Hex&T>MvY#dNTLUrq;k0;d1jM;B*;b3yOQL9*XY&UIJX(+7(WU$ z?KIsZ)No2l+=ZRy+y#>#WZ|2spMCDIi+1C|gJc(hV49Tn5YuN5y(IL`IC^F@+BZfW zZ-6Dz@4U_iU!98((+#TI2CU0Y>~MvxKKHX$?2D7ikn(FmdeQ60+USSI;ipd{mrZwm z@UWdy9!2Nic(4|FG)_0#g@;pbgur*Mq3uM`N8+KUI<}0hVe5}XJ5mF}EI9tB_kH(* z%bp64-CHTL7e+82@ynh%IkvXwl4=d(aGV~+;lQX=YvnV7a6g0;qmZI8oM{#U6U9%o z1=tWn;yi~3@$I<_iesF^_2x}tqNsCk2u8fT6R2MPx{6HyA~!R1bCfL>LX`wi>8u3R$QI<+Nv0>4g6AW#}nV@8}Zkl2cxTe%#=Sx z>3tQklq`55F4^WB9Ir)I&II1TYRd0haYy28#BI!!V1YuC*UBOV`HsC$-KIOc9IsW< z^|Ak}Ab;&2i|`x>vCp1_@CHfW4zb(O6xVYH!Qtf`1T_9*LEZP+%7Quxl9w$-ZGkO) z;#u*tFnveC=6L!NuWm+^z-N?jehAnH?9r)5?(OEH?Racw%4pxWoiw~7GX4We-3y;* zNj(?HlKMMf!#|Y6vHh%KqACfrw$C<4(F%m5f|r*8t4rigc%wguHy8rPfo<^Yfxuyb z+Y^{7;9C+{DzZx2L+msWXt`$~U%R7n%Ygq>uCj~YJ0V|LqUHfvq80=Hfkf>ZR9n)L z19IVOh+3AcwX&6Dy&1@o^)+A{_~85kxK#?K21-oQAjrlM6#F7e$oC;to#+MJv)twh zC1m;b?i>hFS+RwP#lE(i=pzekv2+!WF<^QlM-PIA3GN?6H@*bZQI6bCp zbvSeBAYzTO!HIK6T?|?rN5h6*;vnh{4AwJtzleB4|gjqRI z5WRx+4zzHo?rDl61;@6r zWTXQ?MoD*4-fbr) z0vls!{ViV%8*bt-Vb331fyP5>OPT{8s2LvP^S*Jk89y+vdW?$4;^@lv7_B{X{#dUb z+a>kzY(jeskck*!y1{+=KEII_8=+P9^i5QexSB}x4CvF&QJ!wE)#D@ca*(B?f5h~) zWkFNVyv?7zLiN6|8oSU?RdCz*7{LY`!D%_@$AHiIUQLWfo`VmhMADWofv_mK5y1jG zZVXt)L(G;{SQ=7ScqaOo#dybW4t)q>dqgq|E}O-d;SON4_}|0O^`Niag3Dc(4dKLa zZ1BP{e>R3YvKc%9A1~s@;24_K9Ws#OMzD>UOD5c>q4W)b3tN{;;C2vZuBFb*bqO<< zQggMz+CUn)ok7TmWh2+(HF7;!4IK_K*d$ zMuV-!JC>rRo?h?u|26&Tb5@Q^X&YSJlBEd+TS%9Hz7E~n+xkQJetOq-a+r`?wK%bbCQKbuop8X1&2C1u`bli2|84- zt{*2_XHHP5ZJrVw?$+eGaH}WjaNQpokz|>qf*qY29Bedbx>gTN(ZNJ=2d0Q{-AXp+ z^IQ$`-fKo$BeINv749>)V3?R&xCg`sSkvsf!_|oXfnV*p4}Wtoo=WkfnGH9`V`>##Q<(o)0{x0$+M!?f zfy>73S8#bq-Uas&49T&DR%5r(z2q3&2Y3`qoM<&FK)3)`5SmS9y`Yrdg&R5xE8rut z&~6GuH?q)3X2B`4;3<9WoyJrOuW00B6I{;6Ww@M=2fvm1=nMA{l6`(EL?Gwm(`o1# z{2oG^H*dw;#Cr(yL23^T#++tt2ub}?d!QG0ezn-O(k5#i-`FP)K;mOPI*D#_b zOLpgX-Xsc82BM(7)F}fT`!-M2A3hUiclTvj2Jw9O(v^762eV$in>v5Z zC|TOnQx$*t4ND%Laj1IsZcpie+fRB9?>-V?3v(`v@NB>SRzpwP(YK?iSur=Y727p4 zjbu;FVw7oH34pF{&#^!+F9XZdmR!TrYv)4^DILDUVaoS<_@PA4*~PUHg1;I1EjF66 zrEB$Uzw51dnzO~g0gJR!mbSU{INYy|DW1F$x3RFDgbVKI97r#-l-<6^9`9*$+!5|6 zKT>J)EPo_6X6(?GMkIz#43C&f%q~O6-H)J{nDFE9FdLOSpVn zzGv32?lj_wqMji9ox3St^yYf|?L^vwoToeF&F?6e>GB*pbh{b-rz0*ks%KM1t>Mfy zsO;%xcu(NmhYyC+XRBD);*l}9ZH$#ve>KcCzI@6}z1BivQ!WU!rSl+*FF`RTSwX2cq+@hW#!EAD&G_8e~HDSYD{JH;T07^IpE_X(&U-HIy1j$ z(U5N9R|x+~d+J6bIt_X(b9egO+R(H3k=QtDwo%OVP&>Fk(~2>X65Xo3 zE5X@;+c0I5)%c2I>qf7}du|+kJ1NGYI1Pb}vtSU0FC(K7y|S4#F#zQ)e6YDoa658L zhw>MH!9hp)?S{+2lm)d0o;d~xdI=2@ytWu6Z!Z%KKN0z$Mo*y-}yjl4Id1x#UivWH(wrHzQN9_Fz!R1mQf1M~d9IFDsB zn~1iu;<~hqU9b!Ix-`6^abzE*yYq zKH4w*U!t2{`WJ(k-g>vJ@2+rVy&h*eKb&&>Z8wbpnVWGg+$I>hEM^<(XV@U=PlB=l zJ*8j|X8?QC;XV?xoM+0^h056Nun(wp$b0;8Ly~hPHL1W51sr+aJNI@|`X_!RA@-4Q z8BC>cUk6B1_p&OooF0eU3gY2ixO}(Y=Wthm{uJVEmA=x@WEok(Euk$r!>0B!i22`iTxsE4K(i3` ze#_}0RE3WgmZL)`wu;qVD?I`CpD@Lj!X1g!p8pYF&#mdYll8F8MN=Tc&58>kKH z7ZzE0wHgB}az3euYCz?emYN-b)`mES!{sSpVkhNAq*29K=TuVe~P%>FqtZZz94SaJwdpkx^YXAH&ZSL~u!k+D4BZN981o zDu_sy@3UbsO^#?$Sh!tK@;*4~!HS}fPgspyL>g0#WhP+hWwuegss{NiPRltNrGq2%@Ga+j6DUb2D5rrGebUQ_9qY$V+VT60t5LA`T|6*oD#Ty z65M#3=_kC8_Q+|ujFkZkR(sZ{Wu2OzQkoaFG|n?_U_`X%+54_1c$VCni20qDZiUlV z=h!OwmP+6bLw9|?hUbB>m=3oYy6e|)IrE$03LWM4zy88HO2K*V#@J8=x2a{YgPy`i zA4D(@E+Qz|2{#eXDAJh=Y==!G_eEZSnMm#7t^?z3xSUe@C0^9KTJkPjm|g#%!pqWQ zCESis9E>Ym(0@=C+$IPx3GVYK_<6X^VcfQ@`Wv2!y2`QRhFrKH(!b%RS^tFh)_ShV zZRC(jvh#gt%O2OMuI_qvbDb0u^)QEa7|gs9S^pYjl^C#wRJpKz()#ISH@ymCJ$SzD z^{k!9quF@;Zh@3G!2K0xqa_v~)339%>qcGRrT|iX;PP{$6X5bBm6kX>Pr;~wltw#accw(!Ay*O&&pDz1o8 zq@nBzX1tgom}u15BaTwHVs&mJydKUfis#c;_nKg-n@H zOg+He$ns4w{Rb&8stHs> zNa&p7cJEJqt0WSaFJdf0bZfF%I0!37&etjP4mWFePkGC`aT_jvB*q?F!&mY0 zjv1?YXbpV{BH-_NuE&iw<4bJDy;1TB4%~%1KGkM?z;d;1lNS>_o1eUqLTAB!cT|KJ zDEKbpvbUQFRnXyi=Yq8!rD7O-9;km8E>CPsgUh;_r{7O+C3-5~xZz+~o^G+pNeqkW z@J#sk+i{*5Pv2PAm>W|2l(cIvF{hjF{VT z)Y*!x<40cV-FTuAKc2&E$tJju+E?-T+rU%y9@x@sHmC%vs1w|W;r>gx^WZj>SJx(p z!91SMfz$)tr%O0T){n-*{WJRI9k{(g?`;QN4FAbQpuI%S2peWBawr*YZ&@5<=AZIqrdTw>OQJ-p2mfy%1m7pPU&hD;DsVxdu zgD`)#K~-%|ZLQE9skg%h>G%&Sfyr1ifrr`8? zPQ=>UC)Vb)3C#D2^0x7f<584Omba}>dGAM}v*D8j5x9ZN5BH>U9rfk!mT(_Hd-sIf zT(0kfcZG8;}~)*d!aQ)Ean1qtoRAUYZuVNQ~1*%kC zwCzQ!t|BLVU!mMM8&;unXdK)WJ7yg$<{GNPk9f5?0Y`l%(g6^fpzL?xwnJIlVT!8- z^4|;YBXGyU?ErT-+-4|GE!>Yp%GiG()zgCwxkSs|NDgZ^7EC#KvTr^VN0p#-MF!d= z$kGs8US~NA_ifNI!)^2xQSJ1Ns=bJ0mro>5(g%%XSw4oV%Ceiv@FPBYj~q9mQI_Q( za9Iw+y$2m9G7*Rt2F$2xj33zVCoU!a4ahN;9Nc3c^V`J8Sf{9(1C$N16i-9p86|7$ zpd!twBOQ{Y=)-l19)NEh#c|l^8?Rwo3MgEk^-~}}fsQP=T%X(E z3Ur+GOvtzk_Zl?@I7C#ZWK^Xf$f!=MsOlr99Mv0eQ&3|c!{wSIc4g^ns0t;+6~!PW z0T|cdwulfy50?&#oIjq%{bUvOfXjvZ1}D;R>s^!eW?gR*)6@ndXd*qP+&=8e>KN?Fc*}|- zs-Pr8f!M~bP$0tp@*7W0erlp8H|}OMy?htPfR`blL%ilVy#{mljnc!+qr>PLDE~xS zA3(2Y*7$n8B>iHndZ)&s9)IPfplKk~KJ;igVI(=k0*Iqainem<^n5tk=xR77V_ z`G2Y!8fz)*C0*}jgjmKM@=W;Z@x~7E^4qvWJHnj5BWi(>Hf!xL)*RJ+!i6B-<%iKec-LB_F{&Qfss;Eoo^pT#tUYQSR&vhmJm3d^btO z7JdA}_PrQ1M2)3)6RUGvJ+CDq_Z9OE{U0EPyP(sY%dJhJ&WJQzMjGoMDeVSdhOvXL z!R42UTiwSUq`QX}r8T6U_>r7iIv||S>scQSYlNhW2Jk^b&WIDgrVXHPz|`EfBMMJ~ z=e5EhOSeIY#O?fQOR!$JwVPs!N<7`O{Z=Nn+;a5M^eY5%IR~9(6RnB0J@zFU=9M$p zY0N0zLBrv)2AsF%DL0+KkC+E*4(To&FpAjjF+mQ{k>I}UFat0TqzAQ+TQ)_Uv8D8>QYgb)FNtV@Bl-x#@zJV%z76^QO zb6LjIaWoD;Vl1PpX$C%;SUz7u6Y}EGjR!5EjK8^!T5D0(M#}iR+laT$?Z1(hcXAp% z)8#eeXk>HT{0(7d*-a-t4g4SG?1`eplkp(Wql~*BwHIID%M#{%4-9T{J%V}oSaW-E za(m0@6?iVsJX}m|wuc)DNeQw{94k~?i@Bt#Jk0r5gi4U1DE$GOVNYCm)5&dad(^;w zWYgXuY(@!3GxsKSg8#j)%RfbkpqSyP;?@6#DpSMY8`&T~NBWxRd(L;@-AH;Ts3~6a z=n$(24u&x2J5-KPX|b^TeTlV9Y;bI)FA-7Uon$T@rH-^24ddmD6NXtm%bTAO^d9Ob z$#Sb4d%A7LQHv$a(=)$MLrQxY!!G5uvx(PPaoxG6s(E!nJU=Ibo9D0DybAw@YxD!S z_)MO&JzTN1CPQ!+d=YNgefp3U9h3geOj!1A;(7nWzc!{1z=LO?RYe=lK6Dlge5*tK zhisVb%UVzO;=@Gr@523UcyAP|na9-%TM)N_Fa{pIA7;SyfJbvrc3C7^8-xc93vKs$ zwD8PpV~vZpn4d2Zw*y)!b!G&_IIwl^BQ~Qp3D|-yRurCYLCY0|_ik@lk8hKKW_GX{ z|8WhSC)*!$HzT+aTYAjIUU767p3&}t%g!L^-6t5*T8W}rfyk^$STph@`QfvbU`m#% zEki8tdy9We)Z0f8x(>F$An{K#5c5ozQ5Rmx%J!Ao`7ld!*E)JJ{Bx)=7_ zi>c9LkoGQyyA64{v?)%Y{Q)|U?HJgUx08B+;Shtwe7=naNzcbMNZM20@NlD1d?R3F z=5=v#q7Z#nbKG_M7Ho`?Ds}}*9v18=fe3lFqeRFfl=oaXj*@?e-)^H1mB3|SRKgX& zxQP!FPLQm;~xZgoKxmU;(1r9PA~!)H*y zdr-g5JdCfPLbx4(q5W`EL~N@)W2(IDx)HztLU&00&K=`t#z92v6ht$2OptXE4`*lUWDDXwJ*%(B!PN;Vi>n zKu!_T;gAe6w|=-0;UgkgyQ6vFdK7^VhY1;RA2og!*b481N~n~T;E=W$OaL6zdk(%y zJe0hHk0%fgSJ6+{4yi(`Kxl90G37`YZJ%s2UZX$$mggzD(OkGGMi1How-X8z^PCn0 z)v_K6bCEMvQ|9JFeZ){wQVvR-A@r09Z$}snSx+e#8E*X5vTHxZbYY8QIdz814^0_U zQ=piP#jgh-)V9IR2rOpz(dZOZP!^8o$7ha3|BgN_F=&O-`gm8&z=$HBQ5~!RlxR_R zXQ>+smcT_`1LBh?GH#f64pP?#c{4SKLbXgVc1NcVys!9^^SClugcbq@mk+G|Q#|*B*ZSaq5;IA{m z|C$P3D`NNW1Mt2s+qv^io6#ughVK1=z2b(9Bt=`U=7rU=+n6x0M8CWlM!jbGinsn> zDLoBmiv-6lm639c1P)h_HbJLB&vZ=>)G{djB^JvpQd#lkp+k$*J1WL^!QpU^Pzr!A zM;6U{mxW0obHoL!2-#%*n=v%2grv+o4aTSjQWrMNvzIJFIp~iYt3|&bT}i3GN58iL zF9Y$$VW$M4L}mcoCOUX;4Ag_kc!%f9HsLqFI~i_%POdjaCMJg)QGxJp^os1|xSXCf zf&1#I%jsEB?nAloZDQw0a&QkT;O=I)Zv&Nk_?Ng%RrK(C|9~D2t)Lg&MNPVy!X@Wz__b{J=IhHaPz^n@imgXJ-(fLJnKBTR<`%YTtxUW0 zvW{{XPA2iHFExy<{*M3OIaypFR;UmmzVKlri6jUTG_;}z=inc z$oLY+mB0v^CXDu3{E5K{&<18H`!s6_o!(-}C)GZyx#~2F0^6g|2=2g@kI60aV-J{x>H`_d%Fkj2Qs)v`3qmZS zRFFeLu-^nw>s-(zt#pulD>o6%5=nyf*uQof%E-;Ge8H+h0ixf`_qwy z%_@P{z~OM8tCiCWz6oqm9Jzwy(BugJSq;RoRb^qD&O($qd|9B~St+t`JVfwvl|V~a zL=N}Zz>r8_yW;4{99{)SWKvB1?U4SdJ9P#ObD?h?2&SEqDQTBx!W4~fg}^dBg!q%J zEG^PtC*oj7KZcgpla9`ngW3;DcELmxQYm4#j#0}lJirdw)fb_YV#KtJv{@nSr2aL7 zM-jDH$S0#<)0$no-$&L7SX39+>T-4u1zP z2Fd+ukj%qxIY=J(Z}O)KY%G5c>Ou1P|3d`}OXQHOE$3lTHa$ol4iY~z5Q4=|r4~OI zL6G97N{gQ_{~_(LO1Nx?)xu>l^f>f0DTa(IH4d7OyOj1-@=u%5 z$36LLSI`W~37P4XYTY0_K)3?BOzAza;^wY-xGdyM?I@>aEINXbuN(lS*g_DZo zoZvXUKDaxck{n5=br$5Dolc79KOToNo@80$peo-YQ!W?Z1(fSFaV3kp?*_|4OHWpINm+!|&E5b!vIRJdOISYzq3s+G3swT8Gmc*gl>Q6 zr}(--Zd$w;cM847!~s*p)p44xp^p-FEm zjxK^@EdZ!>BCR&vksK*m@-QBzL`}x29~%`Qc&7UV(8-|kMQ1kU4PnLgq(~qXe)}tq z)NIZqF$6e%w7Q`PV2L3u)(U?@OMfN`Erau*J^#f!_+{doFQD#1FI+Y^=Z4AE@=Wp@O|}ph5c)7`ST;qq0c= zu5-97wN~7Qt9o_}(uf~{E2W=h%NFK^RNS6|A4|?$i?DC;q74Y`#HvUhl~1-AuhU(F zrQX&RE(^>NaHYWfN>-13zFP>)+rwNE(&xe9)!T{^qQSw--! zu+cEkGhII|mx~r&NKhHmy}F5)A9&7Jg^c-v!E_)nBsjiNU>c(_5oRtPRVTJ3n8qkD ziGfl|It-LT(j|=50p%EMG1sl;v2r$2OtN776^naRiJx^6bjK_?Oyhku0f*BUs6mc` zLxF-r1|Y!g{5sqeS3V5k)<#$pka(+X?h(oXoo`^C1vg029pJ!d`w6P;)iWEq?I)^g zd3UI8`$<7<|1JEu?I+8&$0dazv=?nZMYa9lVY2P#!sWKFfy;wu40@iJqNprYZC-OD zqOQ%?HFfw@W)@0*us|cuQ03{6%gxMk z$1fx}aJ!z6JADNQi@vjHWpCWzm?b$6xn~QWHG>VXhvxPR+0M%#?z!2YL@;eSGRt%93U zzX;tG&q{O%v!SytJVN!pmYuaV+@Q|d14QnuWwNu1y3iKLA1Y(>1D}M&@g!WStl);wg6rYO}?9RY0wptXJ3id$+`FkPNJvj6fV||J(XQ zqXEk;dWPe`3Y(tcSbs#UO59Cz#-M!0ep&|i*SIltlS)=ilHv@9#jIFu^lpOHmm`!h z7P|>72kvAKz9PWOQsIu=!6vN%PjY{;D;ln%J zRU`?~SCItKSB-BW`l>d$uxOi0JVNk1ZFz;7D+5+{D+Cn7*Wum@*|%$uzuelRghqw8 zfaWC#z!kfE*l_5X<<^#?7IQyre@t))vB7&*_NoM41&6d-bx1k%!LSp0l>gGb+_AD> zCy5}Uhh_25he-F!KtgZ`btpl;i2@A<*%ux6`mzM{>iQV|k{XHmTGLMs(8Ht(<7p0#d2?FR#QuqtvvCrY9RpbtsY^T*Ig z8UO|!drR0Aw&qb;O^#!t$a0}C6$+3*k5rbP$4?$GkL!;36$rc-uo-TSSn7iH2H?u> zmrOZRu#uM+yiNx8JNa&jnt(l}fc0at09Nf`1+1;tc>-3=e^sXlU{$98Sl93^fOYl; z)&S_=QyDrtR@j80={w||R&75^a0D#`p&`#GaGljHjctxt4e-Mtp0ESBT)}%u+D>E8 z`L6Y7Bcetn{0TT5VxiwJMkIV*C450AY!^eJ|7g606L8gFB=rkU#&?|X)uMpSEr|A# zO89wjIO6m|l^R6he_7VGWyvOK`6gV^=|g1@xD^nmIS4OjVFbLBu4*rT|eQbz7cbgvXqhry;Nl*ep0tMc`tj z-%?0-&XneGTev~vPEQb-`L-H&HsiM(ckZZassTlgJ6SjtrELQ#EL+Ty)^N5}3Cq8O zAZ>&GbbdSA2GO(ixHFKpZ_~g}YB5OMcAkzqSJK4}nL+ACbMLq_STcy^F2o_1yYL}Q z;%z^%Ko#rW=j%tR372yxU9f_mnTt)K4%T9}S0%6(Ls_6S4LL75gfixFmbQSy;oc3& z3NhrT5q=>#QgT#wAvd!z^XI3vQDa1s>0-g`7o55?-OZBNj~|d2suCU#j=Gt`It&hz zb)~mU1%PI_&Wr|4j?!v|Q$`8vbIUKG&3KZo&3t81)0D)|aC>p_tdC}aFEqn?xTVrFb0X2#WFrt9MWU00d5%&V(x-4v{= zykCUkL09<*F6$}SolXX6k3(W zGC{XAYb;yg%huj`xIP+7#!{)VOwygO4+v6YnJg+4hjBn*jiuExsj>8hD>asBvVyUd zqJO#=TJqeHvWu02$2+tP$q+-!kPHkh`S=z?OU-hg;5@Ta&er=5D&MJIGu@kgb4gI| zC|tq4V`qroF+-u~G&mgYuLDD(|IAbz>BY=3DMTEzBuCP0orN%S?N4=9Bil=T5m-%p z`*$#!0iUQC-MgeQUj|x6%;Jewb3u8$+&W9=1Z~7ftGQ^UTdi$2Mh{G~T)IJz;DaZ~ zGfK78UMO+Uzy(45eYHFW%riRQRnwPX;%Ui6x&s~oLFy-q{~LN9KnG+k<$ZRAmQo}O z?vStENG)Y6e0{W(TKwc5xK#DPr&j77xJ>oHgP_PBxIzL%S_|~ZDz#o*9N6_ryj>5? zQ{qL{$R+|+Q|~B+Wivj!sLIb2sLIa-s;1$aQ8oT_0|@byHRuQ-MRuub`Pab_T4a|= zj+B+Ua625OO680|c)QRjhvdljtve)X&Xi#a9y*5x}mm+>K zC%E2MWN%xiMfL`fPUDnsOXOP+d_=fVe9PkpmX={((u9miqhSFw*O-`%GG%PwGB;{) z^wKz3Nbb+__uyoE6pN(bH}IZ`TgGa6=)wm|P8 zc%2UHoz$TTOb@x0b)QQ3j7T`t&g%V=BlUnzIMm+i1OCvHX9_TrA}q9ogF2{&p4eqg z!?&_b*j!7~@gV?rSOTu_P2T;t6uMdi3^rTf_J&}p(%5;iTw~|Q|Aw8(U}M2l$*wY= zgtFyOFB6G+`YtSLudtj^z<>dK`oJH_IX+SM73G! z^pAdTK0~>iKiE_ z*-37Hx-8Ob99!*??@h7z`O!ljF!1qC(z{}c3W1Gn)14%>Oz|ycLK+< zEO}6iO^*-uDbphtA3_41f8GaG>zfNyt#1xgRp48o%GI?2Hb6B$fMpby-@Ye^nr!NK zla=0X?YK!l0#B6RKBy6(G!2cr0kqx5TT2guMQv7MMAeNzFt7xJ^B@@FcpH@ea@Zj0 zpE_8bLxcR|O;P?#gGC12N#-wXQA+w;$08Tdtmd5@i72dZp@?oP&*iFpoXC(~I>WhQ z-Z6!$7^3;GZHhNnrK$Z+b-ShTB9z?eS&rjh;9za4%VDie4fSNd)&j3gyvQ3l_trYq z0U_LbUQ0#bVmJ=7`Rw&(IJT_}0mq&oGWQ6ZS`*$3g2ZF4s?!=!2>U9+@ShqlS zZx!H(&?9YX1L)sCkXs8z+0+*A=pQu{zmmC@ldoT^I@Cz~T0KSLHG(~LNX$bN(g?-} zBavFa(!jW_=6)(#2q0Fp01&J3Er8hd4-Jf8Q@f)uh=rOSD5vsO;c~#?h-3BGA5h=O z7OF1~G%PIR8Ffs~QAt}n)&a)&0|3*Fd*lM=7#S?qT)EP_wGET@VyP@?tPaJ3i1%4t z9Do@;z+tS+Owu^b;HPSXVVufs?lDG_pVAHA@yfTDeZ|g!0@+Ye;%!2!d0;S|f*+4b zcOTcwriGG+?hNtY^DhpLjRG69Z(~;sVH0H{j!7bqQnzk(!fyzB9Y4jAnMT7D5O@ag z0Ne~{JGbGow$rg%k6_beeMOi*wiE-{NAMA%rVt^W~T&IZ|fprnHD@N56=u)hU$HeFT{c3_eFC@E>qE+=a+s zAje$AF1t^yQ98SYaZs ztu8Y38QfP6*ZHnhzOTVoD*C!vwd%G`apVe)6Ctp-UUH;t&<&1JG?0xd5j-;lZZ>K# zcyS|MwCarZ3&hPP&FaO?&`Z9!IjnHAS>h&*r~B4}g9pjEm-QgItqv~XVz$^u^!bA##ZMNQKWLG;3j{fU?$!``_nIC+D`XzU07~mY7UzZb29BKjWb;6W z1A_NynDuWfU>0{>!R%pt=#6_fFcU1!3%!D`j~r|dET|TnZ0Qgv9i6pBHgiTk?-mv- z;|D~fiS+F|b|WtSpoRk@@`s6XSNpqAggQ7Fh08BAWLuQxfpWhvF$0lzSRt?8EyiXj zK^RR~^YtCM=U2#)RWftW?`BPxLdoInWl9+lM? z%hTNLEpmk)hbzR+_@rYxO{50FW-+gvmg>MU8OkQMx1S%y8&*H61(IX51l-7{FeneS zBn$e*EPSLj(A{C95~C-ycq|`Dm%$+{)}NGkwB6C-@uWmY8xW#W_N?TmjOE1$+g9pb zgFNF_vXWi`3yuUV4a3vGZ)yYIL&pm!! zxIlG{MsKC1|*_8ocELCY7`+IyW($@>x-GVFK|t=S24Jzd_RG2 zeODkpuS?&Q8@inh^VkBze`uyH2zs|e!;&Xi?|>qjRW29b(xG+x>S6MhAGYLtEU+b& z##$XpV+)sBi$Sy27h7`E-R5wV%{#i@o+BA=YxoonqubyR@WFw!7ENG=@t#vYHI@+p zH+ET$yla4Ox|o?m-9TiV423JtO280H4iDaXaE%#(m4V^v@Yo=E3z-;3>4Qj|EEi`Z z28a8vh{V$>__cyL{5h35*({8X0#cwdnsDXxM~+BR?b)E)pvM3%^`Ze6v8X(h+NL6; zePTNy-=2YofK6X~cwsZGy@1WM_JBfXC-)HFpNy(BA!y}A(faByX)r3 zhAW?E;ZxtGTUigCBb4u_!k0BFU!4%|CUC5&dFpC5c+Q(IMm@nM)v7#M43+|N%iL|m z6~$2WQ>jKuHaSZY0F_ZX{y?aVl7W2oBaGIpS`Z1a(3}`X?D`zs@uhI`wZcjL4iVU! zygwH6V?fJUxEZnKId${+r8(3Xhld#i`Qgg&{09hfaQ!AUY}RlH;LAYuJc>&P9*4`T zJU!w143Z=8lc&Z?;PTX1tV?5~&<`7%Kxb_1g)6Z!Q5GCGb%o=o8V(I6;6tF}QG9sO zQS`7tN72JT$9jAVbo?<6XNhC-*I*pMKZ`iLwH>s_ox=xVBl^ZhxLiq`)SfJxH))El z(;bDl;BL7M3nfx9o1)OsGoDf9E2eO`3}wR0B=CuHjaqLpYsVX2G)`5%%SE`IQ1wMF zAk3yIpOf$j7FXXX-&8mI2BLAg^i7$evuiO&p0Nc8v%UzL>83zBlAfs|UkVO~`^xEn zkl?_n zaVrGJe3gX-It$U}p+Gi@ZOBe--+lZ6j5uy>kR~$XSQQuXDO;f(%m#U7*N&pX16E zZYM7r%|_5ncdp90myYC@tH^I~m-X_}B=7za!}+7&AX==T2-3@n0} zA*)^_A+`AOe}eF;j#v_1#XZAbc>lF(AKI^&ACoi7cwi1!*!|}hNeIf664$Y zfblJk*20h18#k!&Ew-`Ngf@n&39@fNVoj(VE^9(g3}?KJ_&&Ho6M7yWLTLRBA6}ug zzJm~2>pMVbRp46)t&wRES}s4Kh4$K}GMb*w0_f)0aIYXKS3X^YkFRLju6#a*Pq1j( zA$=2eY5;wQ&f}F`REj`%MR_F_oyG6FgVZXV(h`EALq;e$wOjf2g)a`(Zw!zRDApdy zky4>EfqB=UK3t68nc^Hpppe+B5{PcX2`mWFL-#3;j)G%Vh;FuDW#NF%LWFsISh&A& zLcM`$PgO0yB>?9#R~!nViX~Au@SbWua1M!C@W^%qjIi@J#o> zAvkpyuz#{jB`_Tv!Gpz*%J&fa2K4kJbv<3EstHGR4p7WGrG+{-<m{SUXauJ``_&TAvq}F4YXO_E#f_#E%AS%*%a-ic~N}a(D zL?J3VHIr&@FLqN_ER$+)L#Vxrm-!k?-!7v9u&@+3rPZ1%AV{_5bZE8a>APi!Gg=!y zE3+u%1{K4Xm7FTLK1z=B9;xJXhRaIM2)I%KzUZgqJl9+*Ij_Q%O3r0jZ}uIJ3I*5$ z4QAm(&CDU&rN+=pqyT1NA0P0DF32ZitIAvSZ*Wn93he6K5CM@tkT>e!}6(uXqeJ0r$(&SqwB#yy10 zOQw#<&EXWA!BbFuNCeRGnL#ZDf zxgVe+zbTSm@=drIn7}~A(Yh6PL0v34*bb6@se^UmhPk!4Zp)oy8cb~;KzE7}=d|Pk zx$cY!pX-2#7hMdmxbX>E+KRNqX#=r{RnQu3-2nL#op9AmX;u!gs}-v1Z|Ht-oCwEO z-W)qs-NqaXnQi0%`w83>*TNl}_&h)pqeB=U-Tj&&%r!& z4wt#qE=BnRJg=U{{#n;)n5Yve0Wag89&;0PSo*VxT(%I#trtpt<~&M%AX=KjSN9cYXW z)ShG9d=amY?L~7*17)ntOwu^r*gJA;=9DvTGhB7daVodD2p#3R4Bw>#tX|*o%C}hf z-hl7GuQ;rnX(>=CpAjh^-C{TMhI&unkPMnqs8bFzt4nas-*@hgo=5M>bS=&gH+Ky5 znbV_ern~Pbx^Iu1sB*Lg91izvT=3%;65VQ&N_etP*k&%mdaoZFHGUXc32$|)>+aN@ zX?&i%j)v&IRSAxVFP3G#2=1j*Rf5xWf|2GofoyaJ!82X^FbZ=P($5Zrt-JsT2V-B~#KY&19I{r(3;}4oq~0^HBeE05z=x z1c8(stLO6?C?vWuFirSuC3`Y6-lrSDn8antA$Sel51RcuIvYzjJh^Yr6V zU@egXt6q`Jg&OeTDF%GFNtPT~4Y3ip6~x(54ft@yfDcy=_$xeZ6Y=h>oaTS7lN#^g z%JCld5u{Rr{X!=>-orzV_xOl5lI7)^*Kmpmb#tvW48m%Nsf1Nk=WyfQAYoOi&{3xA zE>K>TsXor~s$u*}&BlW3r`%*Al{T9wq-!t)od@vNBmOEC^J*RB8!#;NVOXsg)@X)9 zh;!#Li#LWfl7ZfTf<@Cs_AOL;1JJNm`HmO9=o*;`EWLeBf_`Drcu(u@nsuu^W}=K=yR7h%LHh6=k0TN|P8rp-P89%Lo#sTU2qk z>f#1U)2%8ImZlBkw`n#Xu}Ysl$*GMW9&Vmor8THopk=y(MQat)-9e%iMctw5=Dw#` zu!It_J0(ZTE}aRh86;`x69mt61&h{spa+Z5-73*q_+nBbK*;V<30CL?Bg`O4OV2;e z2?mSSY^J+|L@P?VPbInq9FCAecE3vafKJ$921#0K{A*5l>&Xaz8BN`p?k+41mduA# z!sEf=aL=rpnUbnBQ?TrA{2SyUNOpG>)R_Rv0UUbc(T3%G zHdEuat+je{BZr8i0(nYH^ve2u;0~7cu+&%r{gSMwE|BF>JXsDAt^_?A}n3%0=-fidsy`fCHh|g1J5K4XIJc$sgVul zI4>H^ycUK_G0(u)NA{;Y5801oE@&n7O%UX=??tVo-U3N(;k)cR9=y^8;{l(VyJ8Qx z!2PNOh+Ou)Dyt}>|H?2iN=!zuro4-IBR;&N#E@T!QDVp{9wqYeL#VXpx?)|#b@Et* zd0;!QjYw&FO~yzAxO&Z3xPB1^DGVT_|o0tFsMnH zV&mUTaZ%QoFTB^3i6!5FwU#XPhz|E6Ko6^l>gu5^Pj_c^{9P8giEx~_<6Oj*FFr+F z(g@?b`L?4Q(byMwe3E+!ZRWa#tPjltEy=oMle$kMxxY?N?j1AC8!M#V)jvX+VU>%? z{W~?yfh!^1FW}+Nm$5~Fn!bpOQU&k_k@-4+PlbKmxc&7Hpz~&k!4V4UB_O23CaZ)S zWRul@Nvb$QZ~+QzGWrO=esO(Q{9}_5Y8Z;+DE%SMmoxSkmY0xjJ-+Nr-jNb$A z;$-nq>h(rA4$FNHiiG=cQG;s3>IhYCy-je0da~5JO)yt7@P^gSFGCjaDo-zb2(W*S z4=>pBpAultU&COZh93g#GhYb>_B@$~j(%y`scvcNAw@UPwoj*R8MFI^z(xE>u{y|KTVXbpeHma3|sfW zm3selL8sS25H}&eg%5%9q4@BkeA=%C%BQVklo#QLK>560D58)7GyYqNO09Oh$-4Y6 zh>zYwr%o27nkh?_GD}yoyq!b~RiVw$3b1Fo_+}A*`gx|u@r59oF7=H$ewg_M@b&yN zkMb;PBYZ^dTq*j*_OJQi5LcJtPDmDgPOMkQ()>3u=3{U^1J^`Lw?@f=BwG&t&mkM$MO|2%+FncO|5R)ji}&@urayT9QQp_)?ZnIggV+&tQxjNH!S*% zngI1mGAc)Kxu4I!0ZT=$aONx2kk+X;`mMUY*kW#6Ap32Z9;+^GqkiBx#dpoFk`2}d zcg@C7r#p5dl7{vPH|hzruJ%PMEd~8qbksGnqoz<(3`MDeajh@o&!00*i(V(o%9nc2 zL1@`;*Q6^f-R+2H{e5b+jIEvcH5$7M7J&4z}16n16;FpNRu|TL;+mbnTC- z;pW0K%Jn_gSTF7gN>Zc$ zuJ$IJ&~dUXW}{9vd@;g`hChlAxjj+#>dwu0puO~Oy(E89byKN<-t!-+fu7O>uY8tZ zB*-a1!W_6kNH_!{BjJof!m}S~B%D<>(-#y8g>xDTUOjXg{1^(jL|8zf2EQc~&MPPk z`B+2YqAwIK1wi3aAQUdwL81O93JPuTA)xSke0ZTy@w|XS#TJG_HGT*veDo1$QcJ<^w@kFzDt84#0 zYS$lVfz<8?m-l(hh8qN_gUp0sWniQ_1NF=RjVV}66FGtRK#}|Z2h;h{5F)(PG#W%+ zYWh4*g*;-t??l+@)ABQdiu7ytH4P0 zHpa*`{16!V+u(3K(TAmDxb0%EoX`(L8RoeY)b#Uk<9^4bnh5jYxdR%2fPV9z3Rq~=AcWlec6ppHoDaCx%&ofcDw4QV3RP4$n|VP*4T z`@=LeFLfOvd;O?LPv>T*+zrCfZ25C7>b@|;96gs-fh9wX>!W3Lhd!kg|AlPbZtMz` z4fpADwjCakv{Jy~>#Km{C+{YV&5`r&ufu%~zo)~MBlcKPtY&l`6gN+`jEfAIY8fv} zW)(Z^$14#2oPHLpnSGd2psOa7D&1-rciJFT8tq1^-Tng(M+l|5P-Z3BV)`t@glZc) zfEctPXEmp+lnUAeRg~!Az!K`@akweYF&B6*IX|<<*X)eEKz{{Uu7^zeZ_UHkdptmA z!5oFSuECX!g#C~Leb0^1o$6cFsl0OfjY$#4Jv18(QIOVC$%&?DNYg=e({WInh&%qL zMT*C_V!u?@`oNX#I^+Mlp|V5v9&CXW`JX=W=XwveKnjjS%n_oU zX8+Ia)Ol2>cEVlyBL2SYEBeV?)ex~?;?bYj>7)25L_Qpa(|n_7D%c)F6C8#6xL}|E zOYO!6(E_@GHfu%2Xh*4RVcR38>saK|z0Sbbr+bN(tG8ITNCXbXEcR=>kH13WL478; zd?c_8F3UyZYbh5~;R-dX6F!7o{0lz3W9PN*LM~q0&T?_c3ra5Lcrb?({9w&8RZETY zQA-VqR@hB`Q_#Cv1-lqUB|ay-gWj`Qp}ap5-a*gV6w4+=4j}e^`H`v997{dlN2bX5 z2F7X7yHBMm*`DwXZMBt2j+B*JhR7T3wP=fqVBd{=Ute&agpn9wr-_uhdeNZA{G&I8Z%(Yf^GK**L$E~I2e_*iUt^Gy~efW-0_lUJVv_Ho8K!{~2&N+>6G_ zE7X0p18kjSgrw}#4Qw&1zYln0gdPV=rt1f657S4hB{cgnUBF5wEMav(X7v|gMW+yf zo-fDP#aFPBF^Q!R_78{?S;>cV#`JXgFm-q7A%#3k);0PI!myS4{A7){DnFFWTxAzh zlogbzt7r+>SWWykjeD0~oNnb+rxDp(CDViw{$J_NARruhIX z|Mvn|`MVid)9^z8>&fr4`@55a8aYHKg=97)CjOi(x>aSVP8m{ zSC#TEe6hs_TVeeK8X~`-I0^;F7a=$d_(aS#qojQC=J1Z{gI+)T+>;IG;e+@-#GA=mP!#k(>(x|J!ip7M;Wn2l7myd znVf~3FfiOw0E|W})L1Cef80MN1?yLa-C_&8>bk{2k~13xln1ycP%V7LHI-3I zB>K<8W%Rc!0{Wd_uF|{E`6%YCmGnBu4D5-zFDwE<_Jv75(-*=45T5%mh1-Wdfy?{Q z3gIU4{Kay7F!1ldW#D&Ns)0XU1K+Vs0zVP11pZ7_HPj8H@DMj*|H5)a$}C-zcy~7F zjm6F@xT*R4IX3wDNygc#$%cZ%A?|TL1#^BB^_w1t1@Sj(?bx%NT!J-Xpj_Mp-5h- zv%gG6=*DKl@lzv=N9hxIMInymQRG_cgbhs~JS=SJ6{wU2E+Fz1BLeS|KC%i*1vpEh z=n4q`A;)SNv^0vIPvu&AR1wOMNcW~lx6}e#J$j|L+%yavQXyGIJ%3;e@&G8Tkep;6 zAwSok>gVGsorw8+rTn~Sjgp^T@Zr^Ti(VD-vuGd7&-M5r1BMU?b#o{i(CV3Zq>;~^ z97G~w?s5}ieZp>}6TjbWqciJ~xV2&l1|Pc}Z*(@=fcl9zYeoJx%k<-^GiYtlJNv;k zh0(s1vNy8q2zg`Ak6>c~u`P9SX5J9(e3>HM4s)6at6r#SX& zjvym`zv4KcIfCqXzCe&onS+`m=w;f2x<&fDiL3bChcu(_+q5(uku-_*e~lIw2tt-O z2zr1PmsyA;t8`4EBw?F!mV`mC(4t=W?m@=*$Ka@&y!FL6F0&9Ea|MUK=G&L!sN_gG zR+oikfm(WPJAn9}%sm&7+csaBZ zGcnyM1I+MGqmHDh{!1 zs>Tl?o9^1fvMK2C9<&=@AIR;t0vvVi=Btq5)(YlGxvE>mB5rQdx`{NOV=4fQpaHNG zsA-uM%hv_GAX^TK&kM4p%PAY2&DCBC3`EnUx_(`Qyd2)?F8z{X<=Xj$!gl&3VojVv5&31W`h>x&Rfi17XR@D9Y)Jq6gSD;ez9@Pol#PzkJuc&I81^w0|!xiT@zT^NB^cYXk0 ziny%;f*R8#LLYb0Fnm-Oe~qH1&ck zbX%&A(Rw7uLUHa9lt>KdV-!wGp&EqCU74|`FVwB-9lJnDN2N3z3s`2`p{o831UaRN z=a%bG_TR3oxc$rtevuZp|0L)rZE9jL{!WJkfl3>k`G$N-4Au=v;nr==OVhWlJyJ@1vThh>< z7)rh?PqW}xqzS}~*Z?uORS*NjU@a3H z_=`alWv*=K_;8qu5K>+R$q6 z(gd-}(*`ZNVQE5bSXfxCBP`u?W>`V_-b>+ipYN7ZKLj%Eh1^9q$nG42RWE%_o4Q9N zA$g-NFp8QUfho4*hvfZ}8#Mx#*HGqVr5J2h2uy$0j@_`CSJ1%$sx4YQ_z;BVJevYH z2vplZWKeBWpnCKwKxO9(CCj6gwf+W35>?wJq-}`0uE`Z z?^QB7<%YD>?}aOU_A7DxBc3EPvAKS3zRkFcPm+}9qEi~bG~IJRS9&NTr~564RQ=VcM!w~T)Hk`@_M{$ONw-RYXLja8!u>7U3GZOFY6Tsk48QLcL-P^Y)kE9ba$`f6JF>oyMoWv^c}y2o zUJr9j$&Z=flP!HbP=1KT^6{~}eYcx=LJE=bZS3f0y@8c#B|}QuVrFLiM!T@VUx#kT z#>#lOvVrhOl~CYD9+%_ge)tF}VOW4%y`w1qZ6PJ{Pq37jh95#oG{c7P-av64+#nS5 zZt%x(E!S;!#p8%4#w2K!y+)Pp4VxX-OwddovVUH3q+Za~5;TB->4I-d|I*2UL6ZGIaWm<8e6+BO8J8=f|G8-t zNNvy#R}~oc;`hS>4A=e}7|aN}@ff<@^=K;jmEA}s0wF~x_ILvsEfep!DQZA!Q-|T} zqfNy^dFS0o9pUmE>@c_&VUuP@$!0Et%QosExME+#9ejw^y(`+Mb*KGRwC=Q@xOI#0 zL$vO*4m%EV1>Q|CfHGq25Z?#j8+AsORScx+cTa-97TewhMT0o_s$V0Q=o>Mmw&^b;s#_#?CYK**QxB}0~ z=BPCO%)Soa>_SOEX`qPHg6C+GMic=epbQ0aVV>0APCZGfz5;OpLum<7l%V{a5jJ| zy3jaTTE}>iLD_}ghp$f;D!@ifT(0byxQBNwZ1tM;*}oAS|3fIt_WmeNhS|&@{>Y8 zs1PsT3jIJnf-7e3%LNsGduK$b8IU=;@_2tp1ZMBE#l1H*hze`c#Z)iJZtUT8op~DX zj${ex`GB-{QRl$;2%klrUE}HR;F23x7l;D>49-_`WJb3FtlRLtmyf~amANde+Jdk`6U6FF0Te%04U09E zHNm#2Smr@}n8wpFHhC}ub3>)FW+GsBybmT;HRiyTy#=NNdT2a0D6Kp#m5np-6Wt{) zox6+J>zbYc0Er3zhw(K)Tpqo54o}O7$-Y$zfrsH4xF?oTwt(yA>UX>CNWWh7EVzN$hq^#E{pd(wgGwMJQ}-aApyfU$d(cLi$IvIEk~Zl?Ssr(X)JgH`lmJI#tloy&+PGh)`OACI zK0^e0Dnp%u0W=Oc)O6pFIbwnM6f5dj7Jjp7H}kN6R}*KT1|65rm+}#){>SOAmKYKs z2fD)z(#Go^OH7NYl8wM~cvY%l=nMkMiHjd)A)QAAml!jVw9b>r1Q=;WGolNOL4YJAs^}d=mncSbQBCLnotfS1_M7DY z;e&Q>cD6h_v$M0ayR(`iG>v-H;P#jg@PXqI3dK(9^v!@U#r7b=(&08D-pdWO@9|_> zd!8oK2K?a3)PqX@7M5tI99_$b&$=Nq`(>7 zl$`FcE;K)Da!x$yum)`KV&Oe2Vu#FgCOzB|<(!u%cs42HMj;P+VO0Z59`X$n~} zx}-Vz+3%TwcR7f_Y3iRyYmeb~#SFh{0K}MZ6>VvtQv=RNz{u=K`)l1?qHc<6Jv+`8 zlXOjYOlxqc%dUO}WFhr+jXWF>CiOT(nADYscuC#Rn@Qbpfk=G~KbX|}zaMS;6F&9j zM*}~Vk8sHyhVcwt#T8*7i!1}c;M8Ln_%Qex%xYb*@NNL<%wv$UC>YUeuh+M zx;z(^cuYix1Ip0kV`?d|NaOCGpf&Ck)Fv7?p0z@@mMy>KQH#613Ocs_V{Bm?rNpnrZC#2r^Z?gV29`_%Y2vtiR(_B@l#Z z@}cUR}Bi>D}NP;m6G)87;!XVeN!5HIo6ULh+L|Nn=HULe%i|pauzE02;ECojJ z$+^#jOv%B=J$t?Z=J!lA6{0G(q8iU96D1oR-BKOMRFhulMGf%a{GO$?mobPCi@);& z!{Wul;(V3Qcx9y%aC4WbJwPH3pClZfp&kac>G*XQgdq&^34nBmWr~^v9&V+GHN+@0 zRlYoa8aGZ>lr4Wq42~mlPar}scYdyVf~nKhX#5s^WxDG5BIzp+{)pB^bUJi~KeOin z%zIli6M{BdXGtf>-qtMXqZq5t715t}A|H={8;E#EK;HX20`jiX2pESSEH+y`AFa1r z0~U2k0WOyBwp_nFG0#v>jy&Ss#S`NB z6S_@z3}c;3oY^3kymC=$a>>biyH%-km6}}qG@7WlWSWPmHa&g5$tC_f?AHDPcp6RJ z`7zPu@To|o5roU7FH|=`SP=dm5oUuShH)3W>lMwl#7LdjMD3sZ(@`cno-Ju5%2zNuQ@re)kZ4P`&MGZ zahZ76npv}^PTc_pGs-&6D2YE4URV!a@UGjh9dP-r+Zzw4zXD5ELmR>~$QmjJwBD$! z-$JQM*d&dXbLG$cT-NVB5&H4R2>hgZvI-&1lgY0dzS!WN+#vQS!w+VUH~t%EoWdNky9{{fA-i3gtPlN?dN$;Q-EN)S zjgv!;#_i#TV(It}9wGA78bS^j6v=zZMj5Y_Qd;aa2qCBN_6kPEK7$c%wzi#H6zzDajJ772o%vlT^@g)-h<*fLMoq6q`;h|ewRRb{SpvKn!HPcd^vLHcP zCiNdC_bN%w+!?Am{YrSN-pHAe0EnD95}u8YP!6!sQDGzX@~_cgmN&=b6OxZ}512*U zag~J`$ZyAaHZqXR!B!GaP?zyrCa4p7f*SH#G@ov(M@TydcM#IT`kB`ad!3Qqh_M#j zlu77ABr$tUMnoHN=5;ehoVAFJaefYmm&az>jG+?l7cd8;t6uZcaGrJgAFyOdJ7DPP?N6iLWr})A%c5BrcvHV{E*7)FgbS2T7n6+CQN`#s$qI7fm&G z>*nbo#Yhc9_H6h5wW0}mZSs(imvjaDxPlYGIe~FmVnHPf>s^k_cj8ukfzONDP%UjE1wvjlgQ`c_$*ryQvJl@Cj2CuWp1K23b}u0c({-1 zJs6f?eS&BX;IG0+*)K8JNZFrDZ*7B-veoZ}y}Kh6={Z1U{S&O|SaDmpyAUbN-766> zXOjP);qC^+Lby9mZ5u!Br7A`Qi-TFf5!@+dqa|EDYAE-H{re zvxf*q#!&rPpf7QD;N(3I*|Xi#7YJwj4-A~(tyqxW;(sO=<%1en8py1RTtx zGBWZ_6QZq&!BweGkUcx>z!<43*uWLgn4k*0V*(Y7(inFcBVU*8k1<*|VT@@)oE0*N z)GKd6mkRJ(lM9H)?tKoTz~q*Zf(IS+NGTAuutV?2{enc-O=L9JNZ~k|6iMIU)9Nq`v(^za&Aq-h;oClEf&B8=BlD1c`y$ep`@qqh2Oq)*#!uC;> zsO_U(JKPea(SRs61H$&684!~K2E=&4>EQA?gu?4n`J>E=`{`byNxXni(y>{@V`2MU z84ClE!ee0`BFSQ|ukMW@$L9L|h`k?l(X-p1@WCM$Jxk=XJTpvh2fxZNL*;%*o&0uN zsDf!T4Vrm6i%xdlLCK->z%1QiFZ|hzC4U~7ZMqYw@$MssLVfDa5sZwvrpgHK9Z+vU zY74T<9Z=FHyl}ATJY7MHzfcAA_z|tB{V_^4#w)-Gbz(eUSHHki55q1lT?Z7R6tV^~ z@iv0+;|^4n>?15RP5CRDl3M0hill!jv<>&JgJ+Sc-pm*M=E;1qNRI;V%4@N~lpO|} zB@WZKqEa|apRUdza+-F+mL%$(-@ETaQ1B++Qp0^%l0~JYKq=Z?F3(QV7Tub1_1xcN ze)t5TJRn%EvxGeweVWiQ5GrIGwR2WV&=6L<|gUSNeXC)q36=BVppH=e}dYkG2Ug2ixWaIw(BPBFimh+C7%b~zgCsVp6y-` z3`Y}o>I&jMK@SAIk+MstJryQxw`myCd_#~1=g?4_I#c}=5guy$%}{$i*9^4-enTxb>E=@3 zJDq2is!2d2W7k2IixK2eH}G3lvxmNIxV_LvPA(lb!>ulGxYg<2IRHGFyXyUhTSVVz z+Yd3^j+o)r0{}U=b~Iqtx&gRY%&?llxYDy#+plzYm?N-XX*JJ#P2q$f&=J_&etLvX zMubP`Iz%#TdW2r0?9S0gFYBc>%@><_FnD&*6PwqG%v5US^e+4qJ z(gn>*oAH}=r5Y&=wwkpXBn)&(GmshrfGlS(Yu+gZM0n?l;T^Bua|&s6R^h7Qphuwm zKMq65I|#*qc3rpFIRt_a>e%B5MYFjn{i@yrB#QPD-baKvqmXb6XXFhK&Oivx7)QTY zcJCev+3gw$cYB9M`rd!NC9Tf5Z3rXp)vU$dqF0`&p(*gr{c5mK+?H&*izcHwz~?HHLSr;AS`g{hb_nyARochEl4yDBqDRAEZLJ9PCL9y_ODK>3SiNJp*n;iqcVBCPMUULtdp0_DyxXdAMX9P65S>50K<1<+?x{&f)jDfUo#DV;Q^}+_MqcJ6;y#M4^L~- zio%;6PEe@gaO;TKy5gr*C|6+-gI-Dx>sZ1w*R;dv_GSZat`;G*|AtFv>FNNAj&&Jr z!#v!E?VB%1gp^KHNyS=(;8`UWAz71*2w9*7Lg(!c++i#zr%N`EHF02;7*Vc%2Q(5S zUl>7B2>?wKbrc3q6UmbW`%5oF0w4^z$S@=z!jOv%Lqelp3n-}=Wq|R?&U>e5RzxTh z#4>JXd*zubOW*quie$kJ9O^^W9T1)%evb%q;84Ob6GYii;Xs7oz#96+9Jpp0O%TBw z#+A}u&vHY9U=K*k^#=|AoVq@MF~LezI<*3+p}We}lA5u?6mGLFh3Mgl(}~eSR=&z2 zcvz1It8}G9ff4TxVO=z9wXS%LsTdA&LOA&#R~*90%2g6N?bUn>|Ee5hFxs-+t1aW= z4w1{}ab>+}jN#wy{F2upwS4H)k2f-KINr7$Cy9+x-~#OF)TncZdvitCZPB zH{PkI#Myv|R=iuYaLgRNg}g@#Sg#^nD_tR5$hFc@jupdX#(Wjon5{oR#LLz-!-cI8 zf~{-m7qj)kx#8G)FPDjfN%OFO5&Y!mKKWG7enXInaOvfJy%X%SUn3ka2=wsh=BvJk zKM&~6YDDp|A-1H0IyJL2+>kk>Q(r`CGVLb%ge$5(tW$H4Dvtyk4c_cq)(J*Ny=k1C z?LlTAoYB-)WQUZV61weqL|2e8pDLIb2IHv4=mLyn*VzMs_M~IF`s1ehXlvGzAnT|q zM%HY1IpEZKe`C{Ey6`hxJ-yLQ4fn@5p)p!7plQT>mMmWzBrWr#sa&21HAM*0N#Uo& zZFB@c7AS`+wb!FlCL{Wtw;lKqZ?znCc_f4E<0Av_m4_nP)LI2QZKQ)&R8*5tahywG=q85Ca-RuTd*d z?0l!5%~Hns&faqMUtdCjVjI>4Ei1w*zT<#K0^p(+0120*LuA|6wFrfJ6lk7Ino)fH?rj>iDXb0M9QLrMNdjQkmu>B$a71LROj1Bf=v)y^Ib!XqBlp zUq&`UjO+&b#UuN_mf);)s&Oh-esm?AiqYo8P0b*UNRJQeOYD|lWZX8?wpk$##Z>2| z#G?yV3Xggf98_>eS1<$^@$T_qFz#xMD#jpRV!?cl)z5Cy;d7Jq@(4F$f(ug4Wz>YV z!EiL8k7QS`0YeT{1#ds})fgifBX_FUmi#}XpKd~b(}Y;70mGdvw_Y?=$4%I(;r`?B zQ(eJ><@XO4x(NeK6B4a~OM^OGl_Gn#`?MAo-lm}!unk3>sBUou zo5P3`Y(+6fhYD)s(crRC2DYM@5JOE9T-M59G?jzw!7E*CLUGaSk(Qin9Na^#lb{2SS7a5(b?bwaWjlM93>xW(H2T&DRU-0=~BYolK3iW7}NP@A+dg(kI z0MdBpQy8rA)@kf<$$AO)QZ+i9H-yGZKRGAxcUd_$_82lDSuex90%R6)kO28CS?`iw z0f3An?N=Dx7fs{T zZTQk*)#ATh-?*5>g@|gMqz(=k%u*kHgdYHhV{X{p*U!;fSaahrkDi`+{M6^ zyS3N+h7&NRYK+5-F)IuP+(8gyc|JE)hq|+Dhi=fX)XD^Aj40{TO(wHeVo&EPhcfuy zAt*6eXdO>7bF{bE63s^Ts-@}}^3V!>>slB=c827PO*eNC3ZEbh=5{;o4V@BW5GL{NP#xg^;h%l#b&vO%u z2RQ!<%5?=#Zl)%zf{Tv;8IML{>BzF|J;pFACVy# zYc72fksks*2O&M7v<;!G;y0OEh9=lrsNp-JZ3+0Ei3o*5w@6Pq`VVBlgyLT-PvfzMT*rsBPWc&@b^I?OE(lU1#g1|9_pAksr zxgCP!*=dmM*6<^dUW*Wr)KHX?o!mDFx*X7Na3gvPNxs#xQIB^^hxiy}kEzlyO1`!$ z?@3nk;dm(BwpzWv2YfKX_Er_UDLrS41Tf zg|-Mm+cNsawC#H=+LjykM%i^P*A2&4WbdHsWR(pbb6WL=PVABZfs%I95Ww$(nJPlQ zPR^jqWY|0+5ut7&G29{4+ww8ZzV#May6X0oZ@~NRlHJjb8j4hUhHg2+XEAc`BJ@{3 z`L%kLq}u+O`}JF<13<1{?mbBaJl9en??!>kk{m+WH|vdaI)dA<^d$ zLZJ^9EVprx4kt+qg+Li6HG!T(#H%`#6$yb5fvTK{7`f3FiFiAZnE1f@o>8WCB1U|hOE_>xB}8DuOIveB8&o4p z#$LtYXVv{Ijn$F`>H|c0ei-Z2OQd1vz%;Du7O1Z0=|p4|AdyMKv@CHzmJFy++W{m! zAQ>oROnnKVKU3PQsq58;0MfKD!Kv3oCjl_qQqon4jfOiX8t%m0@CcwJLJFOFC6o_< z%nC(Lt=zV~01?8sa*Da3W>GW%aK4r^$r*GlXR>sL*i`FIk!fryun zYl?-B5rU6v=@;|y_b$;fgUcJ^LY6mEG!IQRU2n6FjE@XdI8`IE!@v2WptH>2;Axse zp1MptMCVXJWgqte<8zJCi!sKBDPy`|cuGtYnpmIR4tR}KRU&hC^2{@V&_+P{V5RI_ z&oudk(Xex^4_3}JjOJZ+%`&KFJ#~&w*{hr@RN$?JY9b=cXmbps&AVzCZLVfCSx$|t zkXw$loa$4dE&+`gt;5&CXzwBnVYEU3iP7d8MvJ><7;S;>t@eP382rMI(S89aG1@}I zXbS)kM*Gq*+Kbl>qb&|#v=YFX(aM4uZHaV-Fd7y&G$>UM+-Z-dQw#sro%W23rKV@Y z-H$kUlgJqC$2a*FJ|gN`f>rL+jy!q*l9(|1qH&Tw?xOPZ+ot9rSsZy(IQ<-^cXw6l z%3H_7b?DEmN)XTMJ-r=<{ZM?`_l>jkj_L}2COeAB23dt(CO2JlvX)$OG4WS8wafIC zx?J2qU+L7_-VY@@=>G3r%+Dyf3SkJH{V&9?mLljv{Ax}1!q*(y=h_<3GXwfUVGhb< zX||SWN7pLIKRVI8#_8u7JzaTh4!-;TG(z&XaS0*$+xRDZozqd>P3TLn^K){fv00Pd z=SX9VG>IH(B*T|5O`NYFl!+5d4dR0sYx^V-I75-d0%sxNcx}CtMc~vI5x+e zIvk!_W7JzXh?J^ci^g7X{OrbPYyRvss7o7FFF-mu`xi%A4U60aA!_f@S+^juP5eF_ zT%9qFo~_)d?lAh7MUmFT`V^yYVe^S=dffr^gqut0P8*lAPa0YT50>d^`%OC+pNX_q zUT{!uwFy}|IXB{J%4u;cMb%?*!V_;>d}VCn_Cb->w6n&;lm%F@hpG1%7T{q@6$17| zfM2P4K*IZ#sy9L<77Q2GuhbF2$T(`g!EW8v?x(y)1@$qq%h^sZ3?Fk$7rveg59d?r zxW>4{7~y9eflxp&qNS8zdMojC@QODFJ?}&`)Qb zs^{b2XWM4A1_&%*&YRg~Z-PVig#4w8`1!lQk|5+_%Rq=9nnNyXVdA_beaCB9RCh^# zu_p;4MYe#VH*s~=4TuXmIFAM zY1Cb2fuFljHYYw+xy{gG;~>cE>4&#aTMRH2iI%Qi{($EOxU_SKshiXk6ih4r;ch(d z!Bg5G)$uzHpI@~za$bj?E}MEr-2fV~^I(_Wz4&=LG6mxKAnFD9 zlDare=D?fy&0Ks>bK+t?`)7F^`f|#z5qsbJXwm_BH0dyap?65|st~ipgDt*^CB|ut z9*hz0?IJuaL}g@5Fyx4^%mYR~rYS}C@P}^j!Vov%7BGU>b`y14`wWtYM@~fYvcV@0 z3r*uVeb1=i^dd>mRKBLoIvMHDlHe94-TMuXcBL1ayoNbtW8^NX)NXivf$qsJUbAf@a#P4R8<$t<0Ejy0?jyUuFwj+o?Ka&JHWj7HIx>unn(%a_nEp5>Rfb-*YQ?je$OhCA>ehde}Lw(I#c z6gqvq=JU?b*JD*7@G{u{ub(gc4H`wfyq*P$%jxG4pV)k(A4-(G)sVKy(2iaV(Jwlv zmvMih4KG|xLujic7tmI&vcTIGC34&1yF95nEZj-g2jjQs%I+eU!?iUqS5=8>+8&*k zg7R_E!k25SnNvrfR=)$re)PNbkg&~12(yyv^m`2Cg=X7DH5));nw`Ql87iiO!hJuaykUzx(gou@s7tl432lAh3oKk#U{!W(pIH>AdU z@5T9>cTei-PnqhYtW|g1mFywe*{ zHp;;BNUX%1GfjvMbFJ=UWDkF>?!2yGJurfmm`0s;D@+&f+iC<#FbcHqX5A&pFAj|5ea6e?3yp1iL?!NDsdLEhvFFTDaZhN~T2iZUc6aj5S$LnL&TY%oj@m5}S99>iTPkt$o|v6j|Vy zwPS8dkkPx3Akf;;dRosazd?lM!9Ya3@}O*<$OD9s2Q~DI<-v+)XjTd5?!B+d?TjAv z^wW)inL5}M`O&kWMnqks-n&rq@Y_(=W=%LLH=+7VLFyo<4jTsF0R!nlRPg|d#S>Md z;_){&anwH8GPb3{fiJy^k_A{+;td$skK_@I_LE*=*xZYDtKhoZiecDC1aqAroq4zK zq|+ef>VmGe&)%=r0)bDJ4pFW*9XOI8&yei1#EvjDMO!K9IkQOT(ktxa+181lc3f~p z{SaU|T{=wV;w!#kD|IZ;h_!~Nh#s3TLb^^AiR9MXH1DT47N|7#R}`kKlkrv5nEZ%Bgzhd6Gv5#=(cs z2AWD_VMIO@v8dt-1_2}74l5Q`^kENdrE8i)paR@(V#mWF5#Fntx26Zc&Pgk{0Ggx>OYYO}Aw9oU~X`fM{a)C=^ zo&>JRr9HHL0Eh&c{B7*f_NS6>ie?YzR6q7WZ%oy_Q4TzjAk#t^yG;X5;-zM%aNJ7JB%Ee87xO;2?EKHo-b-S(gzXdq8W&I>VG{^>qe`1+^80C}>OmlM;@9eo z?%5lVaF2k^7hd|89s#RI8NpAGBtn*W?4ysW?;^soWTBQNTN6Mp^>kOPjIlWBiZCmw z=Av)XslKRk03?=KWLRb|VKKj9o%PKU<$<3`zB0oyOQaLbq=Us251?hh6P8&T#4>5> zD$?i>&N9O?&;H!7Ou3OQdjS%bsnjg9T=%wNndQMOQzZz*GCf|^ER%}}vrGvhUY2S2 zQdkBdSmql2VwS1@g~OKTEVvV4%^FMF3GC;$T7S{d|0bCeZeCiU`Dvx$2k_IVs34hh z5ZS|Qo&6FGef)Aojqe6Hi~*~nioI^L5eC^%Bxn)(5<;3ah9Z<%W4jCp$Hhf5YivLY6YnCSi0Q-ix-osU zMJzAAt;l$^99o8##GnJ#i^q?eCkxCY2D`iv+R1igM!9X%XAWBUOI|n6%U5DSFd% zI{a^}}JWW*v z46=S4L`aO-^7n=j&uK>d&mN>w_y2*|YF(b+DIQFwSn71f_o>$?HJLWJe9ILqb@1)J ztNG~{4DX?o)^v&g0GUNqCGzswUAYU@h@Y`8vr%<$inw;TsE7TTmHG+s@qcvK{(=uo z0=31If5o4|>{chQEc&4)O`hb-i`N#be*l$8chyV}+X0a2;cJ~Y?5T3U9rL(r@(tKA zS3TaMn(1}2>(UGHH#kv_?=DBGpX}f#tKx1-ZU=I=ej7pr_S4=7#eRB6<^!Fg?SJGPbOV#^9SciUP_bRJ`)Gt+a?3e~;Dy4Y$E+wHq z<2vykN`E{P_Afktr#|atgvzHVir<~5x9_?q4batUq4H2~BUJLZcLIgV1f(`~E?Q>Z zz$3Bo`7%`vuq9_J2Bzw5q4F!L^`Erx7_74TK(A5Re*eDV@?&?}K z7(kjG<{}Ic4+jAx9vhabjqE@DixCgQQ?+<_7a$Q2BMS1ze5|Fz7(hun?+Lphe--gikML7C9T`(ly=p?L>Yf>GbE#qPi-;JD{`M0Q1-kdZd3C@b5pf&g zv-jX!^Z3-D_3i{gj&+j1<_VhlMlKWP``~Yy`6eUcJxn^TT(l2_&^}7&7i%Be|L(AT zlDJ?)v^9909n%-BExY{#9p~B#CrQDhLB zSYsDD0(o4WL)r5Fx3P&De&q-wbF!}q zv{*N2G6W_|heg134J?dwZ0Q^d^exy24uX$nbS&O?rBO|;OIm*bjmhitx9mhSMwlwK z#ZBYdtY*%x>RljaB~7o0=35DL>!zSW6#_^+_j#)7aXl3)rK^O+6Z7;`UISg-hgIKmu& zV)sFQ&6X|K7#95+v@k6@0Qr#WtNg>c;WKh_-g8X{hOx1>@y4k0+M zjD9i4jrj!P&lRH5s>~e283Ah|5MsWj`#zz2< zd2ESbhn>d0*B3O0Q0s+I<}G-EpwEgg7Y1Xmqg#;5N6=3rLf1|@^plAy7okj4RZP_O z>Y4sBQN4&zCaM*hatoFVzC#v~`A`{itPt8Pi3bA0niSM96SuVN>zvqhYCj2UC zsAsj|(qIn}xIau^;#p%5f*nk((G*P1Lz@%*ui>xNDNiFMRBx`4)QokeVE7a|heBu~ApL$y5qQqrol})$7QP zBOl{~U8m#|+&!g8;Qm~^MOS=~E6%T!D>nWZTLmL?o2fWtm4Mc56C}@egCy7E%|}28 zs@EadJRSJpbtHx*`+;ks9pvsX*^mKgcJEfy4lNIHSZO)(w@NWKX>;Forx_>>layny zHV^F9Q?_Ra=#N?XA%s~OrTRHqysS0jXEo*F1*1w7 zCRm8imE)SqUm0=*kEpLS!U=;gY8XylPif(uuTKbqYCSUCz-o}xjFTpNxLu}R$Qpi^ z>69+KoC^;gVyAU#BT~b=BR!+5KWnPT`O6TeF`Y+I_2Ha1p3@Z!0S3+z=t1Z|l+J66 zD#i#m92<2LE|@07S|MXnIY(0yjA-$%;G(YJHDCnqGF{SX!@OyfQ`D2oreR3)?K1h& zuSk04Rnx2pYXK-r5A*nt;EciOF87Zi-GyHMp(S0RzDfSIAc*gZRV#@n>GDMta=AU% zOwl9)$St?ojmC?yRBU_p`j@kca^dfrSrJ-xTsIj5M1wkyCgA3O7DY!dAd+}Q}cH~Y2l>P2L}tiC<8T$ zoOhT56gls(yDy>eVdOy?54l?r;42SlX)3XZ#ww}xv+@IHNA_&j24oL}=M&tWk7Ymr92Mg#5m$VWDwa1xaRkz5AQ`QC zDsX#x30U0fH-jB!-eVJ&nU_n{caZqqM0{oISPKe3KP(E=>ww*7M`C|O?sef)IdMu~ zSuu>262OX^8Y+ ztg`;(w%z7am|1^z+tS!Yc=@wV+p8*iI*qf@xH><0Pn;PcCHkwMjEKQ`{TYS@X{fB( z%vkCprK%wp?-5pH2JOA7yiehB_rE0M#G+AmX#6|_c*HMa5z+1aKEBAxZs zIQ2{k_?*s(y@5zQ3E8;?T_223EolAY9WiRt*L>e$2B-nCIS&+f$JyK|(Gc&2mY7b`)Wk>-GX}0IF-7X;(3)RU z(VGe%44j%Ymt;}MA{F1TOfWLbO$8z60f1C4AJFWZ$f|~*{FeFzweM~tHdVjG*d-$F z2Lcmuc@Pm})vmpKMY6>Y&|gQQdt|-B&8~u1-^~-=@Iw@G$^Cz<8@h z_%PFSWty7wa14px`D7HJhmKc;()4*G5=~cYnhwWrp();_^`mJvrbXUoLCE_o2!*EW z{b|~@jUJ0dlYBI-aWGA59Hb>9&NR*6;} z(_mhz0B{Wr$ZbKij8QWe$#!Wa!mOn7KH~q{0kQsNA9WT$8m&7F^?tM%)B|9r8JhC| zkfFIt56$@9+%PK-4tUfdBzx@Mftge$MBJl^_}}>beIA(b>Fr0v(}2r1=sxb5_Uid1 zTF==ZEOHM>Kj1nT80Ua=WQ^U~9>WWw-1cdZNszgXSDdyxEOYaJ7O7>f^J}N=d6mA* zVS6Ak2iKX@4#+GWgIqLAMSYZJY)@ggP{}t32E|tk;b7bEMMj)E{AY^!rhCGG01uqY^66@4U5eObd(-fQUrI@jTEw zEi!^6V(DR$h;JcLUN<6%n5s(gTP(*XG})3G^ha?&HgNsMD))4ym~mb}C}ZiAZeI={ zeBE+>n;7or99BoMx|Y5ijBF zsPj5O#LCun4Z4(7kB>&XZ9Q7wG941e%QMP^69%TiEo6&#Uq6l|*)l)p-N3kQ7;!CO zoUXvE5`=L_Ff#6%sv@jKlLgJEMdu*=%+JMBCQP?cXb<1W^Q&L!d z(Bv_DV=Jr9yA6HplA8Z>r|nVoat*{b+qwI=^&505X}>3n)uiW~7*i9Fv2AoQ7J*iOE-^i! zx(cozceViQ!DMw7=`CI86JF37_vD`{9F+raKeXOVegg_FOdOJ?I(+EB+aC!)-m%!h zp5$W?->_Ky0hlC|^Kjdljrmmo5UUMzYvJ&~22g^wH8?(H9d~X3v`H7H-{&i00OuH;mA3oaTo3$k_rl z&RsLs!KP6!_n_~`=nky{MtrKj0wugORw@&D9HQ>3xUJ#jae*%MMWn{2T%LmEU;Wl5 zUOix(PX2(Csa2fJa|xO>UXq(maO-{1frB)LY7TUOFp1C%MK5kNc?vt1=@gCd6h zI*0HHX4oR#pW;G#$}Qg!r-`@JFSiSOC=io1u6Y2^)2qd*C$!^xRr4K&J0^i);Bq8Y zJq?g>$7CtmpF94JMBQe za9^#S1?H*?AVLd8Ge9SG9^hDXEOw*NvFSzS2{0Sn?&!%q55{>& zwmc^$_i<#XFYU8l+1`$XN_FV~R4Uihk_hYCDYw_$yF`XT#!@p3npnrC+XDACRJVhu z%6)1^L?9fa2%GaPDQ5yB-n|^B^35b+HgL-|#v#H;FW`i20Dpo3RjuW9 z!U|IyZLRi(!Y0;^l{^vn)VSx6XBEUQHdWm!q0S7#)tZHp*63nbgM)uLR3lW^kIuJU zs}bbU`6kxdVA|IR0ybGyHOgn&*CRr-U#{MdG}735+NE`e<$sH`wN)4KH%tBL2$qgv zW%4>rn5Do7CzIF9c#u3z?2ZFyh$3>VzVhK zP%49(n>EH3gApjAfw4tMWVc4|Qqjlsf_WQDiENd09I7@8?CqKuVFh+qpz$Kh2<#aE zkidpVa}wAIyEIj-IIu^nuMB&@RUJ{-UsQj$AR+y}hMZH(UfMLXQNg9jik~E0tGQ?Rt-#L|r;kxa-!}ebx;`yv5%u|iw zcH_?J)Lux1vx+eC`Mh9cG@8D*TOmSPRUvzJc+q@8*N}LDghY^32JJ4&M}ONw8Vg-y zjwO`=)332h<^uMUHeIaCTHI+@GLfAjj)O$=IYI@ou4vJ$x?e_c_Zsz|R7)$yy$6?R%&4P2$}yC&kXf4Z?C0>BnTgfavNq-#Ak;kp@ud0af+ zVlg)1=aEDfkb$aqBFyM&IDU)iX^^T0eQAw)e7bVnb=aOmZx^Tw&0{cyjgwpvxJ~w! z`WT610hxr*YXM1955F2~YoD%E;GCHSTkD%EdrK`ySg$Jl-ry!%qDi>2KcY-;&7 zU1&a;WC-;!QsdM8SDQvDovcwZr}zd}(EU9WH0A#y+bvWOO17y!vb_))!$YhcXwnlx zXgI=*q@b;pB>-BWONpk-3_}-EE!s!NFkQML^wPzx`rv1K6gVFtNwvEOMTMBFyQbJ7 zw5UNSv?!GnjF=-Wc*NX3tZA|NI<4uoglouPS~O&U7S|Bx5p(W_8?^XqY>e%h#DKjM zRRvg9V!)1xItN&G*pC0g(56!yXcOj4-a=`lF&l=6wQzdpmxhReQ_Ngc!CPND5aGeI z*bJWi@iBZK={&-$q@eAQ%!C-${gxQv_C5fl`z;j$sXF{7tKk`hG-i?^s=TyGQ_tcj z%{cENB-&IU6xvj2+Ek^Yx7FX1V#IJ*ogTE@TVX~T84g!?$#$_NlWqQ7Z8+R=l733!NQ@1>BDg5^G4(h-X2-= z9}sG-sU(n4A7VygLQO)13AN4;Y6j*bx;R#WFe^E5CnQp3Ho9ybRc2}o8@o0bdi@Xp zqSr=EuetawEBj4)QcB*;EwN}n1YL|Z1m zrTlh(qPE?kKhZ4ZcLdXRry!80yx#5@S%luT0yeuAwd07~U;}GY8*jP?$ zyX*>D+uhR?;>T~3gl+}D2v}AMY1saoB)j#n%h+Qm5RS}qkvGtcQwNCW`@8~-K?8V` zgpLNX`Q982+-u4ts@lC8-b2l3RMhQJFCapCMmx+pECdmD$M`spP;`YuMpx+MiP7r% zVIN6)0!Z^#ohC*FehV?`H8FnH!Vu%AKQYu?z{#pvj!KC7VJGdn64v*o1ur*$tL;mdaa5ne`uT;cc zi}>^q`#Y*QX;9t;N^+1X{#3d)#ZN+F3)@{)fiOEE)b<{C#&BO(^&oC(42b-hbv9jD zpE@y)8UT=`G1e6r4{2&dZWq_I22%e zyXPLmU01j{Jm4(=iMy_9?kdD@F{FNNdi4xIwBeVT9m8h!>*z5uvnSp#z1hXOf!4C6 z-RVigR$wBw-eT|RV%^lk-{&dwmgI?HgU~JA(L5ovy{);&oMgEjEIaN90$nT3M+IyO z`ZrCtVgdMmi@UlmD_9G@o36SJ!vPpiQ@!j6)`N4Jikh5}YcRselFj!8$&#Y)KpeNz(IvND{0FKW(ZHtc1~a z&jRN;5UnFjvJdlOF;8`DM_m0OAaWmgU{h87HyG~Bilmb|h&0+b8Prtox{yV;9VYR1 z4`33HruleiQ`K`-UO?8tc5P#9@7p(?Rnrh@ zV>_nSBh0jIS0@pQcp9afnE4=@VLPhsN0@of_DE|?a1~>9=QA6PHDAWrj;K#fwsFDP z#`|X*FWDZPV1V^)tO>z6K9j^I*bYWJK2yEXhb`kK3Y3hJ?EuKK)u~qy($~C;P-aG@ zn^g)(tnIK`N*IwS1s8Gloqec{H6^$yQv;fUdp1-^+%#_? z>Rn{bvK>?-5K>d-A(W>A%Ez7n~Z6h4pFx7}qs>MsATsv| zwd>RwQ_xWkf$}oc1R;zIa6&C=wDUH6S)FUk` zdsQ3jLU2?ioTHT`rkas9o;sLjZmWvft)R2O(W`6*DCC*Hhf1zAtrpBmYO&VT*_U_Q6|cSOwj z&%DUiOV=S;yx;Q~*9Rd0}B zWDJ%Dl2f>RJT(|lka`!{zvBvii*<-Dd?^>67pCx`8si*e6zL}n>7==7;4oeNa8o^= z^q3sfO7+aMP_y0rklj3pYO;^e6$}D~T%J7}^kQqi#;9ZrzFKYyk&_uCn-xrQHKZot zm?Axydd7}k#dC#sf!~rH3`U?!D)z{A|51U+$29UQoe7zqG$iEH8hLae@&S#k7}>m# zI!q&v5#;twuxdavb`tVVyYJ-KSkpoHK-7Zg=nkSuDjDR>N*sqn95v^f>SKgY6U=pM zpu;Mzju05e={V^K&v;W%Sw*z9<3g$zVZ26|U=WVwMOZs;`Vc1Qt~`wLV^fOZ7kuk& zU+QP_0bt&Rc%$?OSZUcyZ>swcx!-x^BwiuB;l!>$J=rfON%U@b^E10xGflysczyL~mNb;~)J7m>XF}}G4i-vt z1St|o9iPV%&t7(+VA7bUGgIbqf>m~5dlTo+(Y$%hRPPTV_Ef}=an2*^W{%7Gu4;*R z`=~){W1R0U?}GTFVv+0pD@Yc$$QA!2#`Y$6%z|bG^}l>KP2Fi8VTGabW zTW2g-K0x?H;(Bn`x*1Ki54UQ-;OlL7oK;w)Pdcmf3|q80&N@6bRZcyrmM;J=r7v8} zESuHTyRosjSwZhkZShPmQd>H=!B@=UmCaf^gkQ>37QksOmPjW!tV64#tu1GK7xOzUW6Z=IxZvHI zO2NojZoV4kh+9Eus`E=ESjp!AW%obNR;4Q#0*rX~>ih_v5&SW#HAWR<%$ye$QpO71 zgq5ZV(bj;Cae-*c`7$-({B3EPe+8>_1+M`k-aSQsqd&%KjWL2TJ`aO|Q~E^vjJ2i- zaeQGg;A>SKH-YYI2EZ{KYIFq;zCum-GE6V5(-=J%V@8-JtQQQ=2Ga!J#R>WrI{Pyh znX{7@`gI{e>j;{b@7H58VQtdP{y>))KJD{sgx`aV7>@AXAN7y2w)%ubcI=OEVtAWW zZR4f%Hg9U{s4Sb7BHIN+Y&P4Q73A6n;bufv*oYyFb~G!v@Y}bW6?EyC)hceMDXWXh zMY<=NWyh;(5`LuG%P+88N!-m?RyoTRRgbhsqmGt1AWSlT<`X8bApS@=Ve+cF@N<+6 zvv|U*81H_9B#s2hlK_$+`4FL8XWXyqe*qg_a+PuJbw37FX@#n%?7T5gch#mUo-%=% zoj!aaEOkLUoChJC2jMf+uYnSuK448K${~X?oKa?O4&rAp&0&q=sgtgXguWHD^`;IY zH?CTaQr8jL0)x-G|BkVJ4kGsYC5V^_A|CgWNt5U+)A8NZ7eLBljqwELjtL1+@Xi7B z5N4hRoh?e0?n<|Hc=n{p1#e9z$vbzP@}ttL)+t|&R3&bORtYszP77X@nI%p`s~rYO ztB(B-23J(>%199QHsWTM={M z-ygqoLWK22150q#4Unh!d5c-&Nc!^i%?pg~R?CryLkD;?Yl%X3F*!2%T|Rx`*_sW!O=m%fw#oRCP!G>~xZj=8~~dJFn>cY8Fu9(}=nztBldB z2H_whENTdL`v0{-NXBO;C&TqQi(kooO+MhKd`EKX127Hp98*j&wkl4f7;jOGqu96y z-pq1nHo0!T2+WO(jFDFHVsd6R6xDb-aWMy)nqq1xR@>B<`G(0%uGqaovdM!F#_ zYRxU$Np~u^sI3&^7Hy;$?3_)zfiDv2)-~0AjU8!OfO+f_Z>!f4xi7jj8iND}`-$H6 zad*`uKs(sZsqF~c@S)N>-p=U`1Ejrwl*&Y;1+Un0l=Uvis(t~;8iw>$)qp&ye%%9V zDeT<+RPq0d!SPo`zaQ;l^=~dqv?wp%f7+bZbYO32J+E4y>U8e`9cz{Fy=#ErtulN+ zK=t~N*#3c@P>x~`tpMBOQ}R^qA6RGr+BA;UBtQo?FL1r_i`3=A0lm-cJeRiRU6<0f zSiV&u&dawgzk#hcUPc6U&7dN%W}15C4X_rEjlt>y;%@a9{JqcVH#SI@9-*C&NUY0p#&`zphmpTUl0n5bTk$`GO2tp+x@TPVkzvoMGBPWNx zCNNSO`GPoz{ucg$CRIb6RCBM7DMv9Cu;vNm=y!hyu6mT&a7e0Q!#s-RrTQ|DHkl1a zUoK7$aX3X|2j#sh<5kna@kr zI|$qGrLqF)ie#^Z3necAhMBPl>!zlvuJ_oif3}M?MKX!c8 zDhgrS8qKy!@M;X(D$TZUfKA;|W!IgM)*m5mq;)CcT3TQDBUq1h`j|Jtl}1j#haV!R zr^v_61|Z&jY!Va2Co;h(Qw5=p5L{g|-jJEqtIVkm;Q8#-qn}2Qip&Ly zD4Z_E{S(RYsr&ruljIWJ98NysSDPfykmN(0yd24ah0hd1CW{s*x z!=_bzSE}hiAvWEGP}p=K*PQ&NsTuR06OuLy9NGe>2cJgx3Bn45KZaCYqNQr*_s{{* zy?%<&(}H>IRcl!YFK!fGRE0ou#BDUJSgu)d1HkUsiNuQN1l<2+33>}qp9HPc60}1v zKM6`#88J3T+ye<(OnamAeVYVxTSyhKW0q#Crk`kf_u8;yg z1OgrdxFZV#uVR1}uM~t*LU7&ndufw31htV$cFp`MC}Yu|iOHuf^bHDO(=|dVelhK3 z;27?+c^#0fmHI{?G1heo4(O^!rNeL|JX9lzm7I75iJOpUSaY2up5ep*R>EhjH!M=# zf2C^m7h#c?5DJTIl)QrgU`aL}5s_q@wItgLh)6OV8v&<08MjUI6C~Nke-%l#Jw%f2 z5DCR>@v5~WgnPDXNw!n)wi@=?soCeb_eqlFu_SvPaU;n_Ag(3Zw!axk)_|B-lD+bG zBgtyzZ>F0C=`5ggKP+AH-E5Jb~UmAO*e#gm`xda{%F>AdDb{ zFl=&2sMSv9s1W7tuo=lBx-|2sMwEs(68+giW&V={Mld(j8*V5Yuu}aIC?qfn5Vpa> zq#PkHOpf`eC9BKhhT`4ST_BOr_~Zi-8Vw>e;!X;R4NQ>$4a(DkDT*bBuPnXf*s0}4 zcc3|lz8>Aye1npu(Nos6zZ ztr6D3f$G&93@gyTFG7(9*W|;h0AOjb1rd=3H?%Z}&Nb2i$393JB;3|j!HjxaPax-j zL~8k+5UFsNku4_rtJd8R-l)}5A;-h&d##ZQIjX*p)bfAyA*oO|kjxCD5O42Q#`}0g z89xN5mpO{%szNbcRVX!A6*BvQIpU_Sw>wXgF5Xvl%qL~M5MWWpac!3%p8nj3))CfR zIPK|En=aEcvfvgjXE~27v95kQBCSOSXz~`{4WH`Nmi;O98cxe^S>Du}IzXqsK&gpE zxXIRdH&RknPry35Hysnr2_(foyOZ8g7^rhC0|p-CJnX};JKsS%j+*CTt<{-T+o~iC zgS)iTQBE=5^C+WOS&~m{9&A2NxGKUbSwdR#L!V;o+Diwk7Z4%l_$NXV4hrGD_rPi~ z%p+?ptffRa4A&*G>1jAO#I0@u{r9Z@<}(EL;wji*N*HO7@f3#YI2Fs6xKRQk$#H%F zNe-s^tJY{=MOtzk5bj7E!#S)2B065dmv^$gs|F!7vqS~rkD4Xf)?`*FwkCrM>JVpz zB5_cR?T5`-3$4MG5)0b#O?7WK&x98L1$I8uOw2YfpKqKoslwgw3N9GaC2}})8YOSW}cQXzX8-MVaCNXZ;guw zZ}l)Iz-;Z z(wdjqBvc-Suj55Dc_p^;rO;Y^t$v(!iQ0ztH^upnpNs-;B+?!&xd&^gCsS~5z&!R9E7VX# zTDoXYmJ&yOCA+=2`%8k;K6|Lz0R)nG_R(fK!~r7oD-Od0!t>$Fh{$}nob$O=UqD38 zRWroMxfQy#m=#wDXR3F`Kn`G5T&X$HXRKPq$QJYAtJbOzPCce)#npm$%<$`K&9B!` zvO8+_X**`cl(GIiyH@k;>wu;hc~}$8JX;eDo~=ckd3Im{cs7b>MRgu=u?67t5%<7@ z<7h5h1tAR#1s+))!rpeP z&p7d*w?_(X$x}a#CoY}F6Q44m@r1lDqqGdo{gGD5V5y~6YI%ri=|{En^Bci?O~=r2 z1R68D*T|UJD>d3nhO50Omc~rXM9~u3A><{*0Ur~KmT*v)hW+VYK%yl?BSI40by{@S z3kr$ukD%>&S}>!(Y8~;Fr4@k&y@c2bG)HuU=m7`u+R-E4)N(TUlUuusAd zC6z3bQS%}o;YLj^;NeHjdCkC^fRRi*8DRHol+?@%rk%3sWzdAjaoLsxY8uZO_oG9Z z9p$jJ`pIMx(8vIOim-0YA&s*)U>-YIbSNS%=>!rp+m-&p-gx(g1@zQ>wF3xk!EARC z%6jFBZtqjjEm=UnfQSg_uXVTN0P;IlM6WYM1T?u&cnI3(b6Ggv9wLu#@dsMWSFfs3 z!26zkcB866pgH(^x@*+M*r+*yee>+QJ3N46l+2s5UmyW|LZ&6BOkp5%GdzKUYx^Q%oP zrmG%65ug905t@VOIjVXaw%OuxTkvVONQ|;7AZ9q{=4@!fw`A?uP@SE#L7lw?wLGzp z7tiX`Lj323^8* z&WN$KhC0^~VHQ&b>!DRN$M(vNvw7O)=?Yq7r;nV7Zdi?wFCC(Y+(a z;wb@iAOzMB#_FJkKct1v=!Tuk?c*8?KwL9s;Q&goo@qS}tq?ZmaLNa~zX!JRYORMAa!o%?Te z&gi?+IcchGDTGL~Rk7BXfUJB{(h;%4U^ZPnfJ^uy720cSk9PqU`PBF>b zllZ<#@_ov=H^vtAFOGlvt%<4;{MJVO`b+wXz3J9u!*5eG9l;4xgx~Is?$qQn>f8HdmJntQ@z<$D}3WW)SbXUwVT`|}D zE!Ny`=!ydYT~Qm*74y8=Rn=1IiaQ9YE3%dabj1Sm6TqV9?cubg(hi7lYpHHyWI^wTKWnOVG@9RfcZ(c+jd3Yy)KD>8z9(| zBA`;0QH=I)#&3#;`zFsy+?uoxj8`8Z@<8;)IP~LcF3zp00Kz$s0a4b4$<10v$~h0* zl|Wr?6@kB*@e@kz)~!{Xs2&7F&Wzk1nhtb6Gg2c>Q^Sy$<@^lK#hxGHO~g5_)ue~5 z*S%x;CRVYX;usepWNa`9O{|c6_o^jOviSnCcP)*1xrgdXaPK)g|AodTDOME%Bi?=F zM5sM^v#xlHsW{R)IVuQEouvx+$#qjP6fV_j4M9zzv=||1SAwRRGBgx@yhWbZi6o!3mo)p`nRbcZuQ_=XxV%q%d37U3o!9vkA)5C3hE<397+3D z%3~SM){)lwm8!>-RQQ8%eiey_Quat^u(P2SDyc&(eEgn5COSJ?YZQ{brpHJj=}}{N ze4kWe2Zt*FX?DQzF^E9XLn75pK)+9V$U3^_K3(-hNDotejF4P(RMKzOPp~+lPbO|} zQ5!GZ{tP09+hGhL9yjiqh1=h2?FP5^+5jeZ4V)cm-JDKcAzW6k`*=B0Lv`#UlIl5X zK1>{@nB^@IH*q7zLYrd$*DE8eYfryvjR*wgRH#>gnyshf1nWj_Q|Q~Dgv-A5$#B`L zIXh|Ok$7RZl(Sy|>?e>IPj13c1}RP$QZ$$r6Dc+$m89?mgdY3FFI3`Y5j0&8zD$A! zA(`*05mJZSwg>?-5&nxx-T$b4TVW^&d)Vc??&KERh|zhzb89_#W60<FW4Kgu=}?ecW7iOmp-7J7a8D z*a1W9UC7I8m}kC24E!;EKj7N1H_{r9|0G)IJi{&Bcbkyvjv~ly4Y>(OY|whewVUph z7?DL~(0;~Uo#S<+`mB<&g3M7_Sb(HI#kR)Ar!lyAjdO-#yqIiwTJJpMX7EymJ^i(g z@muTUauIHI1jTp2;P0dA_tW6Ne@~3r?DifuM9%E@&rrEo zv$)NwCRJTS8aY(>RBdaZ(mFffmr+@@<|aSh!T>x?4F^Q7LgjHg3^_IcPUP5&P{=Vz zKK0+xEQRY6)$)DBxpY!&=}fW|2yF%{`HZtjjrX(biwLKlA0il;Lrve|;`3_XAy^^7 zP-)k<$@%|}weNtd>Pr6i0V2HjXi|)b6njHWvYW)j7+*GICcg~#iI;QOZ!{@`fZ_c^*o;x#VX3m^Bb7JTV zpwu<+Kco&QWoG%MJMx>4(GNB=%P|RFGs`T~)lRer z&+sRNC^sFiQbWZx-7kMK)bdB7Q;dw$Cxacgw#C3XEwX;BCdV$+db9aBcO2)pF>Jn= zuP~MG+QkZ1YF>oLdh1fa;sbZi-Ad`xLoGdMH-7g3TRm3{uN5TEWR!n^etrpKA(YM2ZIBsAzy11#Mn3&aqB{7bBaJ?o|e6V zlC@wDlrB$zb&0fuaHl<}VY|C7a4B{-wz6R4#E_cu(_z5Xv~0OIE>@U_@LXht@KUhO zO`q0U@*LC4mqMIr`woXHL*;NN%<>XkE3>@IXrhE{5$a^UiS>fZyu^+ae7iO;eI!41 zsmtE2c2{|%c_>}H7F$(tYbThG#Z)UyV_Bu2@b zjhbr8qt*VJkvE%+ynzMz1)yv}Zr1YVYy55lnnjfwNrOEkie}=&+NK|AB+WK&(ruRp zyj5!io}n^eY19NqRYVs;9$ z6Ly&|^f#L+!maiF*hiR=d?zL1_n0Sp6Jw7iM!)MqjJ=8&akO_(s3jBm9l0 z(aZq^V?~B(La*I0k_u^w6vKQ1h-l^ghA`UK7)`TK$6EP-CeJneZlhw%4<_iGDeZ59 zWt26KBl}#GqR#+lg*+Ig2oIbV!Qbst$a~(=(xVJ*{JVMsjr%N`dVhmuwia-o9r2*K za-XT3F-p#>br~h+;V~<~E#gw+v!CYb?O{iyA1#*cfOj|NNsvD0$q!S4wB2*eAf7$x zE=ODIZ((`@6UQ~WJA7b;3t_4eSFCY!#?UmhVs<{Eu^mxiuzgYlv+b06yx67fQ0w%v zwXqk;o7pZc(u#rIZIQGc?L;wPexnq_tGA8Q?Tkix&M#sub(-nE8z<&j4@|-JcFw$_ z6BXhS{`9by26l6}C!E)hhc`Vl-#Z2LYA};$Zm3c~yglr7!2u8Vu*Y9CZ}H~*i|SKj ziLD=AV_1hWA#%Mt#}{Z1J12W>1%8*jE?C7;oc>=xgwwBjaXQoNn&xqFrbks8oRc)uw?JI4DyGtaQ02zH<7rlP2@KU!2po<9Z60I0 zryeWACj+(d?1o@RTO0d*c_R;>`+E3vM@1yn2@2K2r&14}34n;tI*kgI;uDMDTfmh? zkY3lzfbCsZ&4wglPj4!J6j=D4-fCH`O6Vg`;H4;E$5(ibP(S{s_JDd1pzeTu#{lYY z-sDYQ%&qXTGJqP}2S_t^bPk|2oKF)+BGjhb2vkc}EYq@Y1XB8wR;(_qg=kB%4s_l` zpW~LtV2I_R6z}I?>WVcox238f(wa$v#UJ1-E*mRRH~}LR6oHmcM=A4(VVVx2<%jDp zFym>sH#ss)H#%ioL;Vh?s>K-XwS~gS;r-L6X6XIXFmgs9l@yymm8eB{@hz{tzG#st zEfPlR-eF?syCwKdJ1FUNRkHbIrsbm)*Te-LSO!lj4B~iNj<&Yy%NsaG*HvcmBa{Ip zo|GMi{$Y;sWnEd*i72`i>0CoRc`K4iF~T09E_ombeawv^y~ZdKHl#`TEvXE%>e4zi ziH;bn`m4qaz5=Ornd7S?0o^hyb;#gFx^ePFOef5oKqt(DX$$s8yu{x9GA=>H&S-OQ;>Sjfr`Jfi{s>vAVERj>|(xZ>Wf;7_s;?ruP zqC@p*HPhA5!1*vgu_9sKKLL+xc4S4IvYuN*25wssr_(7UsD!u7Ee9rj@b=qHuV{RXDCI`V6G_wyCqYa<-H(%N`pjT@d zzFSaNTZY{Mk|}Vm@C#3Yk<_XwZ@8U>%9h~UJk4)c@mnm*g+d6-(jE!5Jb)r^UprJ~ z)mvJZx*i2V=`sL3K$g{|tL<=`HD5CUCVkJuGxd1hhR`)7+Is-Pi!5WEH7jK#2KSCo zlh}i(P}74uxG>WLoRh(>XLC-5Ob==%gj)U{%ZHRgw1VSYgL{>h9`n&c5~+B%z$P6q zR!qVg!>|DkKC{%L8CBwT-*t%A_zo@e{ZHJ?vau^5p+J3nZEB0zU{uUH^UkT*j63BJ zmbfv^+=-_?rD9t8Xh=jNAdwgIa4^DV)ds>DlQ~v)aa6i56sNAt+YxGss=d)Xk7r87 z>(oq%+hYCAt?f!YF5br30VhinDgxwHP_%gxqBubOEh4n+Tg~&>F|`JjJh3lE>73X{ zQ)F_eN}AgqB|Et@P_mOd4<-9X%2Bd!BpjZI6w3i>jgoyMAE6Y6DAZ#x2ap=9yuXL{ zg5Ic)$3>N3rt3Id;QY{inwa}d$Neew1-R9hn8koTRDt^v^Ps%VdPu!Zom}=lWI#&z zi3+izLLem$R?tuYp8;CGrZBAN#M4>)X3O@l)(vkq1aqn_u}9>I5l7{T98v-D9o709 zCe=7JKpDj+%!uP~6Z*Unj42RcD9Qx2+x}Et`s9yR zOET>SD75;%1~}V|Qs8WA+Pqkv1CvACQ^npo|cue$&> zdtSfaWfNN*b1<27x>IJ3p~lTHT0nyfntbE%TU2|AMnA0vNJQ*K!97H*j@oELb(@Q6 zaLG-jho}gSNct7(Zh@Fj794^Dxua(o=AO;;P*U}yUId`lLR1${w&$R zf>RPz6iu5S55=*rNWPMmD85x|dZMh{KpQ6gB-GL{cK^Yx!dRnJzzhF!2E6okHO@q1 z_N?wfX=2YhJ_o{rsZ6AmwV$+ysYo4v8Y*!OD8;{uv>ACB5^64E+yKitNRC;rt{j z_@kD+UU6kr&VK*S4tkfWrJhgunr=fAwduARmCAG*miWC)w`be%h+@$H>$CfQ`^R7jvhpMkR- zRcaPciVNo~0EghHAQycIj@Vuij!?@-v72!?C1(_Ix4ov&I@HC)f2A>oO5RPw85Xc~ zr(!l%qd`j4Kx7D7`%SE)x?Vw=DmT`dW^Npf27_<88cZ{c74|WV=#c5EUE~Am@I1O* z)r7zv?3f`BtbstqwP?yov}c0GSym*`{`6;+8EflnL+(9Z#YGn6PtcUJAb0$EsLFyo zKT$7M?Ev5fP$=?6!#TNzbKV6=I494^Ic0g&8(=;MX`ygS9GwC{vR^N9a?6oW%Zv1n zmxNoE2)AVaE!6U-u%#Na(0EHV*VvaCbT1f!nA+44;_*7^*du|mTc`>hM?GG5H&;xQG7gGReaPloCEGS6$~t^4#74$~vC^F9_=Mrt zjSX}JP5GF!jfpx+=+QS|7y_^fcf#@0fF=MSMkNk>P>){=h`3p|=*P2@?!3NnYa;b% z#!eu|o1w^L#OJ$jGfX%FAX!VmvELwoIm&n^;A~1BMJbX53ozE4p}1x#E)3V;d>|G^=6oRGn%y0k zYdli$;XC$fu1P*-!z5p(UWJC5CaWG#y@q!L=KT7YuqdOx>lj+tVtw38c*%bA<-gz- zhLPMIO$Ve!!a?(De|h6N<97df;||GJ-~_{|%V`0cH45k*MPK8hZnSSUwZrBCXcNJ3c-a2tRx8Y)~ey^d8LBRLsE2Jx1h1W?*$_9hUK;=@{;ma1CC}Q&TW1 z2P~eaUt#b2n||HU_$h+ZyovRud_Bj@q@y{XFj9UHI&4N80FZgq?L_S+{aI(3M|DHV2%Cpec=W#RPE|&*KTBWlbs66^)XxcUm6}O+ zbFFj#sc4D^QkVUEW*l#>OQZ4+z?O#Vs@Uujm!9Mn1Lm44^}sV<0Ty~EX$SR`#lcPo zbn|N)2X+4> z(I2vs5Q6!H;D11p5HNh8?zD1A3{)R#^hhtXW<4?lrI2K>Afn27i9eD!Ctvl$hUj-; zqMIH?*?)$41-uMJ7h|oKS^=XM(gVQaf`=~Lj?LOs9?2Hq>wgi93`@JWWsHIi+S zzo3+E#;c#Lxo7X}XiG4)-iQbc8iLv=W7oICeD4GRbpjEgKq)Wq%1U^59+AMBGUT^D zkbOQmn!?J~Z;vK*ql~Set(#!048}#At)H8zpMjQa>i7Hvraq=(Q>nNwzoZ1e*>{Ak z{`lRH-sxcm-Si|qSNt3x;jS4@?t;ZX4PdtTX9{1%lBK7y(`E^JF+V)Q7Jn8hcz!r1 zNzD)0;_nWb`Uy%_AcXSgIN@e~lD93tK=3KqQWvO~w``tkkQ^!-uyXZnPKzy18ic}P z>-=}Kii8Wruv2m2WY~&C#jq8Lyo!_r*5yqS8~+h%aX*&af_(+;{|{4gr`)utefx_9 z8Q&oq;}`4hdU}z-o{Qyv>O6v1dM@G(@hTtZw2Elub`Sq2ob2LIzS~y?eDPEd*#elh z0UHbG6Esk>w|_x<>&+`_oRSn)ILH zx5(R7MzG`nB&1*MBz;;TZ2_2V`!$C2_5Nc>zgDD493}6CjH7&1$Wq`sO}_Ppe0u-f zdT;V=kOq9L*>nHZ)9~%) zt8IwEN!9xdbv4+eiP7aVu*V~d??&Rd%X&4Qu~Y+7U|ZM?o-iZJ`sb)_V&g39BPZ~d zmSV~Sq+Zy$^?{D^9J4#L2(V{rdM^cRWeF2(iAgqn@Us*E0&mk&D}KAHomc2Q4eteJ zd1zd4{0?)shw~E8-yvU`{kd3zJ4M^Z)(plX{;3MHc4u)MtDyJLhS%pc zuyr&CrI6*^caX)ObtDFB%6S)AzMLf)0t4LEOV1me?;Hrz)$6pn3#PIXmA=Mni6=R# zGF~s59(W8D>OM$}*Gt-X%^II~Fpe$(%2TDw#!7u{u#uWqOm98`NTenXhtVTLTc}Ud zUQ~wQ0oOdt)8HWn@1>yI0**Rw4^W8mhGJC&=9d{1p90Rm9Rd3Va9vb+vC~_)u&uWR6t_lu~?`t~Y z!J!c5ebw!4Y3?XI9K(MpN_MC8Pu6p&XGa_E9H2WAIZ!>!%%KLNCFWVq4K{7U2Fc5K z3N^)My$v6COinuI91dB> zsQe2nQaFr~n>l=Llp#xb)6Z zlbr1wlaggdYtJ^A<)Pnok{SA>`slu%7?vX~nJsgYT{Br00gq-I5%87z>PA$w47*?H z3gG zN^>{`%rcQQtCO{xW+Xr|rCRI3?biTj4Bta37)CO*hho^D+H>xskTfLG_16ooVL@;> z%=%>acxU&FBr){tTo7G{zPR#|Y;eQ%Curdt`?68BXdAXkzX>CJlQ3v3-K(@AFxxgS z6z7*9zz?NZw_6M%hX5pq-0DQ6GqB|{Dp_uB6LdDCdh-pdZa3(h0+66{rw2MK0cUjD z7Z`NnY;Q&<=6>~5c*`rOQIpc{xGdny}Zf zw8e202Z|Zlp`2aRE)Q?=$vV&jQ17VkY``8G0T>g%-@M5~hQOG>f)T#27DX?F76;Z2 z7$T@>Z|Vf_TL2%_!oz;ZJcwm?F=}O(=+|CiBbpvx1V<0gv``%X{hDN$i)k4IOfjcAje{Mzns*S>8MOpJ5ATj ztBFdL_~MiyW|6^+zgXi_xYgxL5-SDAk27mkX$Cr$@xbvW*lBgwBQyZDsle|UV~3Pn zuHkgEpTA6}P|uUYlzcOM&LvY`W(_E#ZUD&&?|DNuMBa`9l*P~mE$8VP0I~#IB7zY+ z0GGpofQR-#$y179DA{Ygi+?N8kKHsfUKTb|tBZUZ zfouZ5u3IGDFfFP%GH$vy3kcznSj~;_RXGestOk{|j&gh+tQyPUPPezXu_drg{;3!nyl#T0`bhYM#)QiU!a_b z2PUk8%NJ!AluYwpD4FJ~`M08ZZ_3*My#0`wmflNm?UTYYEfusn56^f!vT$G^q8#f5 zJyER&?CI?TsSIGrU(#2-rZ% zh6}z_ma|i+jSs-m_+4D^$jwNhPu}HC3cubWOXEXPEmUh~woeK4F=V0pYs z{WHbYWI~FbhF``5Lc>f#UmnvRkYy(XdDOS%!N?`(^rKHQcf5z%(3)Gv)Nl;l!Tw-T z0@2vUJGa1KF-Z zwx;bE1)2zTat$gy2n+7Y zl@>Aarh%gJKG%_xd4`T7_JfX`gvS*TNOJ*eY;(`*a}to}EDtF006yy>aeGS)i+7}9 zXv%SWOF>0v+@968Oto;7R6}TAr-K~9H**O+cL5_OGGA_XM(|M~>g&`}VdZ0g3T&xN zE2H@enO0;mu+DPxg^~zJa}!Xo+{mAa+vw#(nx$46mg?}eVJU1p!MHUn)nieRB`Dz5 zG#Y>gyehOBw8yGYZ8`-22lTJ;5I?URHsS~QEidtNx&b2WRp8EEqXB02T9=~c=m7{85?hL);YFlY2ym`+bWeD z@K=r-nO`40#^S6Ky@^rzJiwl`F<15$*+ZqOm502c#FNa3#^#5Rp$>pN ze1)e@q3MG$3r+HuLcuEEdqlCy^SRLY}&lQR) z623TS_~NesFkc*U=L`GS(g`spPN9jc2px83iNs=Ii6e$3{tLhpFe~y+OCpGqS0a0lmm*GN@@;EM>q^xMANLkSeq#VdQ-FPMU-Wiaxh9)JYoej0L zjdCLx8;(UrJ`|xgw5GRwDK^#N=eXKix|}xEZBZS;hgiF$3m$&PRQKTONH;-)%Cj;W z9-+ICIdyF36e1(BoA4Z^K%^vBC4DIMJP$>VML$oOX!+0Z3z`$Kuad(K)}g`6szHfD zo|sA1DGg#K%7~$75pd88;^@2N&LzWT-g4)X;j){X=_Veexa^AIvU?@qGT4=o7h$r6 z-VCIUd;`=&u#H1PFZS4z(wZid7^Fr6@B!mKww&>yC9 zM9~#~1<;gMPpurprdUC%Rd6G!1gLCtEXEHxMMM%J=O;;|A0w?+4<5Ytgos^G&>HJtmnSu@N&8F*YvBWmmK;_TRCI5 zKRJ+%)ui@Xjn+)O9VmsY19g2>%f^G`dKl+S7aKO*g^S_! z#LunMJ`KEOkdaYO`vOD0G0v+@{iTwmc%GVqM=yPc>?+|b|( zd}z>+V8>|ciQu(1_Ahl8KvU!ZbE4=G3cZcE79eVjJEH7ay1AN_rlE-_lCj?C8D~0< z9q69uX>|wafgtFBQnboMcbt&zu5d?fl)@d^y8cIS$MkE#-rPa@3lw)ed!JvzLOMsi zq_!CG5nC>qjhGh4+Dkf>EUiN8P#h{eS(7O!E2`}foky1HRH732Lar|tV?}-ChA+J3 zE6rW>DO!tJHq{Gtbc`Q_AwJC$Z#5qnwwi9(Y9v776P@XS!fSvl7c)vh;q3p9C~RdJ zLdh7;2@vzoqD+YxKi(C=G-|xT7NL$2GLPya(e5v)QvXKoVkd$c26KSq0)v%K7>t6I zTyLzbK^0>q&l4-R0G36Kg$67C7i6_?d?cY{EAtde!NSrXkA+GEAt&yn?VoDTK9o9^BM0Ww-aYUFZQ886Tehq(2RhCaV zc*L_nI+A_4VK6cd55}lUK*?t3b0}Ro-NR0p4?zYmPju}-L)Jo9Pzpm8x#Ngt)B;0s zw)}wC}s3r z{r`!Vrq?tYc=QE3u6a|WR8=dF^a7-OPYK^u9^ABAwI`K7dUH9Q1h6eca2=>2-t1lO zft*JG!I%-gcZE zjMADolkRF1VPfmPS|X0nySi2UJ=4m2|HwU|mx+k1BEX3%(GjzB>{{Ts zuZbL$o7q_;&tkR3wBjdKU|oV$bpY3 zPsPB;;HemkYvrk!)YyuZNOlU94ygerv@9VFp!6o_Li|AUb>7$=C=C(@nFjvW8++jy z^&^%XaV;vdgJ}VvRW1~tLS?KLK01+w*cnUn!;FINur6dh&rsJ~lRh_U>Wk5~`l>JxT7@AgJZ^c=K25KwL^!j=$4m-nnE6#|YR=E|Y?c+d& z+Mzt7zTS%SCxAFH!(Nn#375~Aj@$oX0=4D1>Rq1(rR(4kE;vm zFKG014cT2Ux5oyoE1r+b2;z z7O;3d)qKJ#u|o@}7_d526Up+}QJ#x_tK?bLkud9UmN?2ddDej}N<$kCz|WI54d@~O zqEi-v8Hys|`Upp|23hl5r0BSHfETc<`IgzFT@0{qT*M`21tGzuvsbV}!y^Td%%1mLl6( zRjN@3%Gd~#6o%#D+O;*PEC5q%dVLBUE!K_lC{|7NZn}wb@5uZIR}zu(r4> ztP#(N!pcJ_3TvB2y<|q*u6t}0)^=~y?=b!7M6KKVM}3t8{*RpK&gM7s^iGjT@w@c< zL7Q{?gWbnGy@{Kj;JkUeWuSjY-n^(_#~ya|i*B7d)uOd`s%_56rQxhcs%y0aww2Mf=x!fZGpCU5L2BUIbq#C(;rBL%UJf zQQaG`$5GEQ-s&Y`kPayG@QM?9U~_VoKT)rj#oRnuU#Do9rvazx>r{C~u3p|pov4Un z_u);izao?4cTh_G8C4$_JmsfKFK3}bt<|i;g>$WD<`c>Sn)w7QpnO~_3+VW(R%C7Q zQ5&H5S*>Dwyv8=-(kX$Cb(c6=OKhZbx;9(Y-aZ%LxO&)%T3N3i%DosXMDEnPC)s&N*x_=W&%*N%GIs1!AZqSvcQk2*7Ret!WJ;sGaTr zAof{0b$yQ~5sAMx6TjXR^+!OUq)nzQ`W%%!w??u|G}Z?aE&)(ddH1D9-?!q7hoAmN z=6#(}@&^)1`9MqqzTiYDRV`6fEyrmn4#@PL0b;`|hTWhBI;5t6n|K6K%l_BF@>ae4 zR8{C&;yd^_pU|}-4OF_(!~jH9=XSx|hqj}gN)J7(fzEN2+trHDsgK^p{r0n0QyeuT zZwI1Zm_guU+tMno0M;`akR>4+feWVrcnN?J4P@3~&uri}DSRKOWk*gL%J_iF15}=G z!>Y{!{ABC+6iRh6A5blBn=y(|EvW<$<*>vq?7c-5x zze3SKd@WT(ji&DS-A0}KxlD6L0U)7D6l0?VNMUv|-UFPS>(&pABwO(vqsY&CtvQOR z>?8Cy%6A@M|JdI=pdFwoKAUimdY1?B!&lTP7x(%)tJcV%v95Iv8j9=&>keb32TD<% z>kKMa0wkzhZ%}D+m{6VWGD2-(b(05Lw*amr)@JV^vBmU_ zUCh{J{39h+ovnuZ*cv-JO7DBeGq*xas6Fncfgeu*nr+i)h~MsNcYTAWgQ{ImJxkcZ z&y0o=9R^5fRberhCG3=kA(Tdt`9Ij*adNy#aUG*{tbEsnqUFS$A5T! zM(q^XBO*06;OtELGp771VK&Trj=P?WGB)D;fnc4aHNNtM4+u<5f5-nB)Bm7Tn0n0W8`%#@dzQ|J6sKT~`B~&lqB7jeOAt~26wCie z12v`3n*Bmu97_%JzdBt<)h{6vjyBNd|HuCVZUH#fK%4)^ojs&gs1rlugz8I6vi(~I zZf%rObLu;o$e>Ax7fys5CLf!~mly=FCO!eXUnagD?zY-`Jq5(zAz4vbbxe6CQ32>V-$L#wcx| z_qASEt3yv$<9)4Vm(;#ic1x8RUGYwu(G}&UTb~0Y0`9txfIEpgHh6D%2)NjEBj9do z0rw^#BH(T*5*WQP7;x4bV^InrzWvdJpniQY`SZ#hI~g$VwEwrwmt97s_xXyJzD}FW zcZuUsRQhh-xvRR|mL{N6AW_XCle{4Nfr=$zxsoD?nm_%@0uuHv3ZMd^{p}eH%54pMeTBi{FV0=PZ8f z)5>bv`ZTPj!?;#f)0F{M%O^fbFZ>v@5m+uI4!gy|}%xS1A5K>FUFCp$sxlHEeFosX=mg6AuT^VAI+-ct-9P<7;q3z0+gjC|WYe zYB|Bd`$HS*;Qi%;trm{QzlDhv_a80>bwK@>4ZY?qW2Avfuro{> z#+`AYXxtYUP8uI>t7v?YP#IcN=fW!bA)-*|>qv@j^uQ&X?j9b)6Zr zh8IOC$J_+zK>S4Wgejvyg+sxxnZ-*qQ9U7+x{Lre)M=jkZ}6tR42}?Oal`wRgNm@gUpSBe48Pmb75o-2 zS+3AVGH%EJFk5cSWSD<6a4e+1xO?+7p#uvFH_^AK?M$)b!0Hf<=_tE^x{Eb+Yhpda zkyj$Q3`1}|tAyV83JXToB^pog?RFS%tp249btbh50LhSF<~!si>-JqVVKJVs2Yv?D zWn$^E36SGz_%Cm$H&N{E5NmPJJXHJwyMHEH)yXHT8ftrP4ghS=t!_wZu=Uzl*SI=% z7j+`&v6llXpe4OJNfhdDQA*9aAHz$<*;Y$8<)Q7ri&wE_bgkDcwBcbaltIiwlg@jx z&^kaB3vK#-Ec7ljnDU=)c4r}84J<{KtOjoVADKq44s0`Wp<*_D18&*D+F*ysg?K8O zf=My(ztf##iVwIr=EwoXF&x333C@w};cmky#{m*X*;5sxw4Ex9ve$!A{tl=xN}(sC zTtfvIg&fm_Qw|tTxdH%l%0a^^hg_V}cDmt*uQjI(0fbGjan70}np5@y62yn49KwZK zjK7PEZ{qXQwpV*1AniG&Nz$H!CK-WirAcfvt(O0UZTzZ+qj2#f>}A1by-dJT!e#;1 z*9lt-SiOkdxdA+%3aH@Q3v;Oq&?ahs_Qo+mkk)E{_Hki0YC8*@;5QpDws$La)Pq}i zxHUx`os{osJCQc&aQ8sgH$(CBezkyV_icejBb_n~EgC70)JkwdfIv%CD1)@1xS@~!Nrg z81vOvHgMc+NPAzkTb`mEKzL>`8)d@?o!iecH57Lux!*}Z*S&~Wv}Ams+JD97WHMh7JOL&uGN=y%!lKq=DGEOjzPOz*%|sb%9}j=ne$QkLmlzEY;?Oum{K@L@`zUK<`_UgBY+QUVAZAFw!&p2CH)ABQ#ivSaO7 zO8dPX{PxsJ!RzowYW)Zf+O?6`@9Rq95a>V>hiPc_9I&6!h*C0R5maSg#mbHeH=>ay zTx)=2ewf*a*8M9Odu-q|`VFA%LFut5UsrrRN|P&lwbe4FJ~n7Hk|}~~Q{@=>l0e0y zV>HfpqInZ$=`7venR0ckG#4o|R+qG=x>-Cz{7UuU(vs213>DVawh;=Z@(cWR-SmBP#s04TtPiPsXu*PUn39JMUvQit~P&ZbOmZ!mOoU0E-lyPF)TF z>5(%Oos<;B+h@2j$yT&wU1QsXg)rs4#|iPkaxDD~kg*VwbExPbo{_abE;N>&*le}@ z2Ee)WXpt4p%Xx+Ycw0tSfMVz`;Fd;>=SzhJ9=7>DT(&?e1F%GsvIR_<2;R!|=B+$w z#QS@{K%-%`civnFGvIKDk{O3Xcy5YoX10b~HM6~pi(87>+HW(=_8VOFtm%E4=OWG9 zS5X^hJG3Lfac5>6q(=sYZ^wtl`J{*d-j)~!eHTq^aX#51&}6A;lA)UTJAGl9bC@7= z#1=GD$0wBHf>TN@r^!2*dDUs%;hqP3()+05Re3@wmgCAsRBq=}EiMBj%)ZJ{7il4) zb_#WWh4Kw00@k>RfEUQJ3tj|u^jd-2Sg%8!0B3XWW0aC>a=ot40x4di62Mafj(l*xK5pI*lZTx1QdsZbQBDTt-g4Ei< zRxKv7anJ9mTOn|O1%z#l)B-{+>T(Q>5x!mB;b^Vy*zP7if~W|0#5J3~A`V*)o~hOZ zrcw3^6Kt4_U&Gx_?F@8OE~n&uAdk#KcQ_@&z)VU5TuFpoE{X6MmHjTl5^mSuj&ZeH zkNW6fNQM$bC#Wr(LHKcYHJ#rt%4LtIXy^cO!228CL&-Mh7bum@IRO`J678e8CwYn1 zhA}T5#Qjp%Zta(V0dKC_YdJ7tjCjv3!_dAijiFvZitFw?*ZhWl zPBI*hQDD6r-mG_18nD($DuzQY;NBgYg^Px4#5#Uw6K`o@qRr(ktw72M_<}0%cv}E7X~1z!QG9e}CJEy7r1dWXlJqBP>z&3iXW0g?IyaXU9>h1M33LYq?d40n)?$TE!frU7NF>gM3 zL1dVvgk=~nqYp(^EP83O4O59e(lP)H(*^Y$<1-&6XA0iXEH(X^%{!qUh($oYPH7Y$_EH<+SI*>g4<5LS@+&YGdB1}B0I2Wz-93$3%; zoO8JWOx+!sJjIcJ;;+i~QWMi6qmDwxz=jaLj0bp?{ zjcQCOzp%k5A%N6$7&uVVVU&WGEd5xO|1z(*rr7>v>m#)7U$!Aa+x`V*R!erkARBcl z$Amd}rxjy#oW|W$fRb$IaOg+*lt%UTgvpv+utMRU4O+FM?zq2x+{IC@)m(G`6!VG|{0cwP;49PMifUkqDTn(l*ro3h0*!tk=;c;Zz;<=Tp(RBTq#2KblkmHQ*ud5YSCP4C- zM}qX}a&|DHnjBx@t9ff_C;A|9XaR0ZH8UGi;oq3MM~tMJxAa_ic4O)}It)7^%0g{8 zI6D3tFe>z2OOz?$M>j~Cd(IrPeFMD@AZHGl+nAzOM1nc<0C*9Ad3Z9Py7+^X9iKBjC*V5Etys$TiHq2>=OD%`%c#$F3) ziv>kIeOZ7;JQ7M#%1Bu1J`%cL)FUDBA7OeVWL~PNN5V{8b*Zz=;Cs;AAjjPq9ML5P z@iIgBvOAd6`6QXiZ%mo5;aG{<=6*R1&@I^vwYv-Byg|w^p5ZZA(k}_ zO&jw&a5}u*aVNc&T0vW(>DFW{4np^O&Om^CpYsi#Q@gTKkvS)%VyC=+v!HqZp4GCN{pYLkt!m%%d8{`CpN-r2(6}O$vfhR;Dkan>JP@Hi z3#AZqi#*s@sIUE=761)_x$PZjD=~#z8%xX-6`+aLk4Ji&yu9kc78+plGuXBZ(Q4PY z7tU&8CMBlW5NNv%jg|4YQ*iw&>n_bXP>~Y@Z3@x5-G@_zeUG#VQ0lf-kWHg|uM^!` z>9(;JIuT8IXvgaI0ZPH|0gc}k)on^?Zbd2hJ*1zc)P^P4CThd-xfv{$FCf^I%jnU! z;w-&VO^YzHP2mx;EeDmpvhA2b_fS5s3Ft0GGtS0Y2(i``%zF}g`H$i7O8weu zQ}N=bJdjK)02Y5{T#vRO_Ww(bIe$gwk?a_kl=IJ7ni zW(bR_&L{=@SVd5X`~PFI)Teh~kJzf;v^z>5+K1RIPgyUzSZppT8%Ab(*f0~thT$Ok zOYYW7ZF(!hAmy?V=U3FTM4W$)YNyH9ChV${`y5vdKE#NzM#30Wj*n{wD{REPK!Z^s z@e^eV3oV%Jm>B7mm`<=$fdx_JxsU`N>`u=r72s70^2@5EUusmF~7ONjD66~{p1 zD$YGRFbtf#y(ZpgE659SELm=0&ZSB~#Iz~9T1y!_j%XWf6@PQmTbiF~IGT8GS^36P z7NF7=eSTPVFWvsF(AfwQ|D27@3Nc_Q6|(QHyDPl;`*&!joY{9g75J?oVV1{Q-ql!y z#J#H#=-M$H;Mj3?qdCGpz_Il#t&6o;UIqE@d5j7BeR+xqp6B9>;Hh+u259om6%kn9 zeqe}#j3{Wwf+wPu5j?%A=ZiL2>)QcgYyB`vVg0`3XbH2ShU1b|#X2QtgvrdVTbDS@ z>=X%G-!(Stu&yk8=GO)Z)yeg@OPOFw()6RA$$SpQT~vB6Jj#ZO{<=l0c&3i~W_sCA zF+jSaL-wj7&M@5VOPqmCM6uFpuI618TXCVNGq{PHc@;#v>cD`vkIkrO_EQXz*HTb| zO)XXqMf)eP)E2qfH7T<=HeyoN6)iaIZ&(w(t$RBFBC&=y(G!eo0ExuPP|xM1BWwbQ zt!q=()(G@dO)Yu=AW|x`iJnx5wN)K6YL-&1P_mTz1f`JbOWo1d!*OV?`^4&d>R|UX z-Jp4?8|dZQS;11D05N;weJt8NsPvWkW1A?8)>Fws>StpD+ZA)R36$A{XH2=T;? z^)8eKI12PUmmRr#(Oew4lbTS+P~O*@P#=`kYZJ_)ddrYZ)js7)kb(?8ManG%SfpHz z!Kz5P#~K(ZH$@MH;ehZ^n21vFi+oW$6zIp|w+nsV$d~uU#+fF(pE$jVa}~~g0LaSw zbm@Q|0A)TDxQEC4QecKZ3iPB^jbY~C`%-~^j>*nInGinZhAbbmb2R$~EeFs6D$UVU zQp+axxzb4yIxU+*=wLe15v5DhSm#R{7?hNY8WuN|D8Pw<3^?Xh`GrmDhdL}T zhB?>E7Ma`GGqp$~{)?x>g|WlNX(5ys6lsJ|kH6yV5T!>7t4CV8(5x1WYkvosE!J}8 zglge$uDV28BrG-52yiSN73CFenVJfX=5yviXFwln7{$cro2T+3sJjNqSKnDX>uTdJ zH7MeAm?fn4a?^I|mr;%>hoEs~*=)HqrCQ*~cw0U?*GDR;Eg(n?{1Gcu{e@@!s4)f0iPqMF5rcgl)o8XN%)D)(o5lH z={BdTLWV0~C6*XBL9`xC5+fNy7dAVa?9d#t)6mD;Z^>KJl79*g@uSFg$@62yH^7}z zt^w^CNW)!qe5{MzJ_>9X+Ohe(;0gGqYTSRIcBfG(e#ut(eN8Cu4NM+maU#79d}j9C zgDD&^h8i%FyeOlU`6)ZvxDVp_wRoXrDqU1Ujk- zG`@`xXeLUIZ`gz~wfd0;juZHh=HZs6l>D@`Xo*r*Jx+EG}u)-Ar^7Jlf3TvN;sTJGksQ&ACYB41&? zvkmw8%H1>aHFeq8$b8#o=|+8@wOP9JEdCq@)UR!pU)s;R1`%@AszLK{JDcTg45ADA zckXlHIN;?HpjPFzDKVBr*mK5`xacH}nPyTqRI>iNWQLOHzo`I={<|#t@3&O1z0rJE zHR(PFgf-t#lrpwT1p)tq=Ij1E%yFN%_cB3zV!2^Cam}#9O|Mfz`j>wP_OIa4zSzI+ zgZ&vl)7ZbMu}|Gz0Fr>}TL#r^gM_<|;0|!)ET+k5#3~SROfI2DR(O8JvisK1qa{FM z*;V+`V>l|A9=F};A@8?0W)Ywh+C&+F#+r;B}CN zjOF~;=nqo@bQl|%*LYZP)D0|O&xreD%*k8Vt;={FOVk>{I1AVo-HM6E?p`pmY(*I$heZ`CW<{*3r*`F#XkT*jbt+ zvvr3INoISKWR7_X!jFFEMUx-AT6g>%j7D~P&21`9udsRg{otf|O=&?mzQlDjqFTGd z(THm8&N|=OlnUO3Ig7}Q`zZO#li&0B@;uY$4)g_T_{(>plrLYbzkG>)ocZ!4-e11d zJf#!mz3=tq-*Y}`YL@k?B&oF*$>oLHT9rokA~OU|ow zCqaZ&P2HB9-A+ghaqtO=?n}_4$^_6aZmEjDXfoK!7*4wyrWEz%-!tNwHl z)pv%zRk|p-2(R@QEy8!Wh}Moy0LsE(rxpee@cWney~|xV(0@NL zqI|bjmf3)avfSfC3aUgUKXk8_zkV3DzkWEjdwuK=+en1#X_-9LO=J70V7man*)ln%@tWM7JyUL( z{sTDEKm7z?jzc`In~lKlcx9!W&^q*_>bvOB-CS!zFWT5oIY$5@pu|jh=M#f@bw*>uh^;f;V(YAVZYS#8<420Egmd~W{=^ow|C{%mR)p1gp~VZ|Ux{8Y zuklc#7-<*0DfIr|HH9v^jR)%`eLti~>OaJ)x$Hg^>{q0L=*a>!5rK5oXB614NlP|q zu4!_7@_!%)1k(tVqC3j9V0z`B5KQc}y6%nr8|E?Ww8GwP86BVDY%2D~M$OhvD_bx2 zoa@N`9PFcn9M7qVn5bM_tC*bxM{&Q}?6;w=fV7R|WSl4aD+uqu zyd^^=;Tw$)AF{D4;soyWbXIYuoQVH`E2|P#&!N(HURBXl9O>3d>k|R&v4D~phL+0Q zx#OZwC=K~9JJP=$=yastRTzn-^{C)oKlhr_oR*yFG3rzCo8ND${pSA#KrH@BBg6m^ zA@;yYKKLOv0jzdhG*fQ#I7<1K`6+OaQaJ`_7Ub0gE?uLw6DpFntg)~=<;0el5`ABx*ye@ZAwgngLwO@>J>+Q={& zPK9HE7pKe$%aC?FNHPT7CIG5)Z<{3vW918!qQpm1F%aF7p6(+`{AHA)#7FsQ04FNe3YS#_r&%r~}nrVC8nRP_j>&QAHv37Na!mdEO>CN0??P^EO&?w?K z3G{D9GrcPIUo@BDJ=2rzcyQ119@cX@eL+wKM~l9J6amx%z0};P3>Lo|^>%Jhrg~cx+?C$;LVK zDQ@8)?lmaua59Z!xTvc`0WFS_U9z|NAc(>td;uG8Qwr(X_t%OOUY04h^{_?{6vcZv z!V*XD=_+vVsMN_Ux)imdjgM)uh>}3DmlXlvQQidmk6xQ81M+Q@JRq+c zEfo=G$F{)Z0E_u~jne1gtFmVq^;D|qpz}7ip)RQ633M4*=7TS&$66bfYq9{9X>>Vt z1pHm9HCqf&2TC?T(^2xeST;(PdC_2$MqEY|yo#%FVRS^U4V#$D3TVUuHr#S++b!Yr z*<9}C4ZGu;X0#iSr>x()7;85w8@eLl7e)Ych=i}a4ZgQlxZ1VH_pvvv7fKfWIVhF1 z>DUhk6w)62RJm7BvY+M+e2ggFN<}T4Rk|(&;iw@Cz&pG}>4CRENo%f5Ur7R*)|^si zgjiyO*CQy_jg6}Q=)ko8TXBk`&C8+dwnVO_lsq6JVA&3O3KybAkwnI^saO)u z_tr1s7N4sY9J0$TChHb`np5#C-az;qf_WN-_0rdLTZNRojSY#kY?O+y}3uq)g52#s| z=nD9|v>p)IV>qNab^J{%Ty%+xWk|L_DQl#|s=#2?1Chd)da6c=wi@1?3g2WGi+ng_ zup@7wYu!hNWQKm5P9NnxBxxufZIJKEraGdzI(J>I{_qIwNv|){Dsdzg9%mffOR^&w z%qabC2*RX%3`L;!3zUM|FEwhn10tv$V^FI{A8*6MehP(D8FyWm8>EgUL25A|g4FQ_ zsn4zuq`rnykUH^)BQ?lZU|w4gR80v-U@JMJ3 zusnuyB<~Gbq)8&i;P=u!i#3{+G3e4gWq7(%_w=Ox8#RrVy3>f>f*xYEu}l#pE;H4J6z1G!nDddHT19PdUf*-h zyhC0iDr$%31h#S}L$|5i49~>ITJCF)-ONChsb^*&Ja+lGRvx=?yAVgDqL$AiYB>nL zx|H2j#VGI6LV~)ZiMN@%+f?SD(iYBYg+U(Jm(LTkO$U?st@j&2_{Yqp+N4Nzb2XO%MWYlwT7Y@Z%BIKYTO+-jip%Ed6 z4D%uIxD%ipB{Uf&6QvZT5ap;L%Itk2G4fH$fIqIk?+2I&_tL~fc(g@Yl;ea4byWr) zmAz1n>BH+WtyA_S?1F2sDqNVFyH4!)lluKFmhC{^p4?z2aInkbJf&Guoo?Z@Cvbv2 z1S~AcqUOqlsdGq2Of^ybFj^crV`x8`u}h;^nl+$j51Da%TE=nY8TA4+^@ChGW6)W; zl2XqgI>LU|Flz@K{2;n-7%C#E0*{j6d`=JNe}8Rs-vy2D<|VrOnE$EVhb11^!j|BR z=JB2A0d7|*Y3dx-`%T*6!VH7_>S`F|SI02eifc6tK1q&+<$p=P1oG7<{*nrhKtB52 zA$Zxae%+%$N}Nx`CD3uj=+~>RS9m#8(dz1V43P`9134A|R> zOXBE#{QhZmc8%Xr{85YM1JX@t@Ox%FzIjT<<9jG&JXY#%|A_I}h~6y*CEvlQeBi-n zYE-I~qVJ_?(^_cnxtZmiS|DRJZBn5f!9RfxjON35m2bkVbk%|i@~|DMWp8;7Cxq_Z zLUe#@%Z0@;2ZL27q_#L_j-ei>Wy?jM7P2g1?`!(OR?{`qvLcGY;8VG>czCk3>w%J` z-5QiKRT{*dXi5J$3*7R;(O~^@XSDMWd9Wy;A?Bl?fC_MnQb0`(gy?)N$p?|eL`}2X zHIBu`@z3!)oL)MQwGQ;AGs?#UGH%iP*WnBbA7*-dbxr+9q^d;i>rvhrUWN;flEHP= z>B$SsmL|+DGeacWyM8$*_$}y6KL(%HlgB=s~BQYl_yd>t&HI!@)wY-eqDuRXt zWoei}s4eW@J$Vl_N~#g1Ud5;W8iOLogAab-pqOkv-D6PDa6CM|vC>^84c`>g(&Xzk zQ{XA`6>4yh?HX)EpyR6+lr-25iqQL<2>mI5dE41kjdGd@fOspXwU86%sQ@7H-cL7( zH|mO#OXaaM4EhIQSj5n80G2@1nJpw;@1)Ll>^A!va9*dglnKfmDA@w-gi=|cX{}?G z!2+=iB@4uM-^hSl>p9>G^h4MQ@U0nO>lo23sXGAdlKjkBu|X*C14f>g+bnXU zejluK_|7)AkZB36g=dWUe^U!RCmC;SH#H|gBpT02`13cn&}rz#$7359eSF6Zh%IJ7 zi~vXm#8%Z^*I`EDQENnHXu)sWW`@OsXQ9cc@m(`4wtEbV8G!S!C`8GUDC(XJicFRv-pI3K$?S?Vr z-k7w@u22zg;SP>c!$u>y|WpvJgJQR!h$w4jtP z?Uv}EP{)Ql^e4a@TDH;WG06 z?ABG&zoC4E>0cTueRJub7Cgd5ca}Dzh1%A07WiHUD}i=Yw_Dl)r{`LT<1;I(+o3pW z8w}?qpy%~yr%3>a&*6e}KC(o0-po}>&`_Ou!@CgfhroM$7kBW6o{KH0M>9?`_Olvx zy{qw33v$fjLrX>i)F-inGs_~~%7?tv8wrpOe zVaYa`UpULq~x{Wly^$_wAh> zZ3(8MxGy%KWG^g^WD}>67C49*uUjt z$Wc3ZsFZ$r2N#WCy``gk0R+F-LM{8(4lk*U)E@L8$N5SsLp>XC_oY6TWWnWk;pm6j z-BJm*NZ=H!y#SJ#%>%<$P$^RZWv_18YBl-UMh2UeqTw zD?RXo=&Z1{k@cu*xl2s=!PF58NqTLh`4Ig;!;VAr%}(=ws5D@9EWisq z*s)6C)P?#*W3kHZU=Chan+%xuy4rB+*#fK<TW{*u9jUddXMuU!+70czZ!D2q1^cksC*a-!SKIP3Wl+9n1@>MbxD@61QqJgkfXS8hJ04o)NG}~hS|zMcE@rW zygT*nmcNE=Ss3UTx4O0?7|RkLP>%+%F2YS(_iAW~tnLJ0aunxvzBIZHrX4D)`?6G7 zcS^`NX!YKY${YG0;8xEdP&V@)ZD^M>1XiS~V<=+dU`p_*;yDpjo+`cr_sBT{EAeJ^ zjMz}V*_S>Nq+`-A1~<_C_z+*uE0wcLYP)?|_o$z1>hMK{N~( zij@}P!pTY_!WAox2nQ?W;99ZLzEr#AKT#)l1Ut6SXo!#d#r?eDmgiyB>d|u4i6WA)U!=nr`Jh9!O+bRpW zwPLQ8hFSARvsF@^@Uqj~TZCM<6J`WiIpZ@Q=@w{pqx_?3r8Go)->3S28U3^d^?=@A zC2o(wsVvKfSmwl`J<@|5%4UCsd&mA&GzU+tse)y3)UWH>Qopx>K5nRBGhG3PLdAZK z3O-*VoX$6bmSF3YmC7CIO8<(=yvK^xh5pnKL=Kg90Ha58EGBaOL10VKw}B$#pnR%` zjN9O0t6w69ElhGZQ5#(F85L3%dxn~>T z3^jSxfb$RtFQKkdVK|UQf$O47(Z`^OWV@jyn|Dos-FfQLAuvQhLfzE*R2S$D(NqN$ zT@46+7^!jb@l#{z6zIx)eK!DQm`#Ix44c3Uw;rFlhff;x&Ez7_h76_We>MDn5t1 z?uO9A{Zsq{UDI>FGK>RK)L9i(Rg`=Qb6t`CgY1}E<5v12#D-Xdz5m#*a5;lm)%k?`3==4vXH1Iy~*L zZPN?xi-TjMdyn;SU^6eyR^j0GYc5mfGno9_4$u~)91eCI<-UN2ddxQ4iF~k!-e(Ix z&XowyT$A2@7IS(qkEf)LD2yZ1po*(0ADL23S;5s*ow9$+vwhOlirJ#|oL0q=N(VwL zA=MYS7L+QERO)Ba|CjPp3JMr$*JV$p&iES@dcb2%rtPSNmXT9*Y4CM(k=G4vm4ITh z!{4h&S@?d2R5?;`fG zg2a=nD=Ba)La+VCq0Ha&Qp76e@_Ej+C$Y)!|{1m-wsSN-jR*VH8se@v=f+V6C zGXsW#ub)X(KLqG445;C&3@bJEEuu!K%~$B(zmu_V0#Y9PijlHzcn7J{4S!kRLGXdV z%BxFfUq%VI3YXtg6^gyle-a1PUjhH$sG|pIFshlgfV>o1GO`ln%BeRPYFj{NyFk9F z!1zC!3M?=c*d8RQz?EeyFb$bpfvW;4a382rfva@|{{9uIz@A9C0#_pC3OtOofo&5x zUWGFvJFjjGC^km6O{V|wZkkOZ-GAgHqI^Dy$g7zDsLXnjqPwt)y>^5g^XOd_rAI+e zj$K(~w+?>Khq;Kkw<}(}MMgXt434NO#}E5BME%&R^H(6>={$X)idB*4kGK zbI7UW%*C^ZZBCNFxnz3{O0n~c{vp=VDf&D^Y6w~!`?f!e3ppr~&HkG&hNv*NJ17E!81G9Wl_U za~_Z?aflQq&0HFX3s&rpAZ5kA0ZPse_D7KNc@D*N_DQ_eanuy8qji+xFr2lb!oSGy zcmS!0`{Vk{WjK83uUbf+2*%qiIjw!2m-n#SaM>*$?*VklF*{dacWA&|aRTVU z$4Fg7OMJ-~Z8(>RM@OB`LHL zH&mlhAh9LF_KvYce5YzMHfx{*Hi5r_>pS1-im4T|)P6Egg=2VEhLZ17)H!!?88wzpizEV-*Asux^3QSA++7K}hxK`+z0Vxky4E=3xlYFiV9H$>>XB! zYlW!qy8}^`j~))QvM!+;Dr0X{xdF6o~R zTNk8hNX0NUq#<=$fiUH?1tf`UIh01=J?!7~-8}jZWVTKWYe-$svJmd@FJqe;-cZdL zC?(u!dz^|u7mxQ54e9kg6|s$=%?F}?KZ8`fx<*Q+gog7jjNTxt7My|$(}IPN2&kOG zaI|2Nk`Ay^uJ||9|0q5l_-b*i@_DfS1DHD5V6yqXV1XVfE=PVcAE^Q|pIYr>h6WWe>OZgA@>#otu3FS#@z3 zh-Zv>qyfO%UU($seaHZqR6qxCp#U&W0iXtb@*u)B(youBdENg-3%LeP3D^E)Ay&UB z)ELC4F>+*L!#gitb-f#ItL(^E|LtCLH8#dl;E6g3OcuY}5A7e2lh7?@vS8 zPkHctW!k#sCunO{W+nx9-pTSN>G+d%g{Pg+6R^4GfMX7}x1%rXF=_)+(h|T=`I?pX zbJ%`kKYxP~KI2K&9eN&Vs%;*nAx(Dl@e1ZNIa;n+|Qg!77RPm*;nsip`p{p5lAra3!${&-7v#?tf{Z z%Vs=QSd53$EM3a8ko*s(%+^(nHJ91Ca{ib9U$tHkt*G@m4Yh(l2n12^=c2aNc_DK^ zl4Z&q>G!dAxISGR#QT0+z0r|ze{Mr6?unxYsSyYgoM0X$V$6%BPeDnA7|21&O2q=| zI0Q-sz0yZ+{Th9yHb?3IB-x3j$%Rq?oE1ki!O$KgFO4nZce`wicdb>Z$ z7nlFF45_N-oA=LMo>U=gVhh z-QrRHAe!BCug%_^{)=YRhfx;sEEF(UmG4 z5V^7!W^GV=@}QeK*kR+%mY*W!L3blk9(12aqp_dErhw*hZ1y&nwV7t4!Ct0XLyd6W zYC7ykAhB^|08(ke?efVH;nsl&wM}j5IAATM?hfR&YdAj{liGP@4u`64@BCa;<`H4Szs%8W>Ei}yhzUsuq8Hl zd^m4Dt_!(GYtuqQTqxxI1{dXy3LR+W7__fa>%QMu)xw?#HBq==U~~)F!CUVy`az>6 z{6;zeBITU=)-1Bb)J`W_4jvvwN(CA2?^G5e1Ny^v{?cXoIDF9mTyW&mk;^PNUczlW zn@kyx>19aKoDI}<6U?nN8~=IzxfV1%UVlzQ`X@9hobWL&>v5c-vdrLc%?u6=L6X7Y zx)CN&DMiW?L)Qe|(m!MTr{U`zHb;CP{VIrrvfDc@O+-t2 zeZJX-VSK*(QqLVc)oA?{Dyp2|EC}v77425P2zuH63 zro*7{-lsuSx*DHQlQ;d$x-9WCLUBFqa;Q?|__blw;|#hPeLNYx6ZZ^O_uNmj@n5{- zhDbr9hpNvq-f=@4QR$tE@Z7>;%}kMtoG=>JLR2;uu9@p(|-=7H=zSQHKhth|@7vq2iJRs8FV(;T+W z(R{Gz>2+0Ejpv!|7rK4AO-Dguzg&iGV*ZnNaC|8o@uN(A+pNK(D_TaA7oWv^+@2hJ z<*N{D@kzgRV%G8X3!-K~AViy7F=35vq^$t$koiDGs2gJ%$^4%_0VS#&t;0Q5J_8yi z9zM2_p8ZeRiL%l2Gcl-Qsb(CS7@qxdCTS$4ft;+I6UHmFX_G)EKI*Xldn zj4!nyB(6>~;|q@_r>0R`FeT8fSf?%8lPMoi3APr5Sc+EmflO17=V$4HWSN2t1*P1A zkbgnQ6vQ?gW(*V|JFp1pAWIP@_!nUZ$ey42_=Q};aoE~I1b0MQ!=65y-owRCK)!u0WG{N#4C$ejxrYv4WY_CnSWsI;Tfkz0 zWu|mU$1M3;nOIr#&?i*GW4!|XgAMVprlf()vUpA-t)hPm0#B@B=F7mHOEF)w(E0}d z--YyjVu9Ff<~P!c`4|vb^;=*FN0H+TS>^JS1< zY{)4f@U|`N>s4?5C;q>W|4Y?#lA>XiUM3~Ok&U?2-@&@U1N6coJPj}Z15&X(!V=HL z&FT;a>*sWk9lQf6PY)5^)tP*GBn&&~OZn;^_|U9{y^Q6{&mJ2R3*@p1dJWQKz<=>y#(@pGump;z0UOI510JBe;NY3! zCjXHjnwmlSi-+T8zwzLGUb#RHj|8>yOgnFviV3^nP&0;CkfHRpG+cOR3~4Sk7^Jbg z5L}03#*m%wu)S06K^cWofcPDz>TF&gVDG?=)1&dG*zz`O?$qTU501dL6q&zE!>kbb zp>@j)`D~UeXUOmJcdQ-7?KYnj(3-&RZtAg;7nh#IZ(Nkw#L2sJ-UX$F_oxh}%mqab z#_-#wxleyp%qkegy!$h;hm+cZQo}yr9Q_d&ER-5RSzv{5I8u&XaS5roVjR*%Z-s$g zn*MN5)3ek$BF!C3%fTjYW<|Q8#gz8~I-rRFs=Be*X=x_tJY`&h)VsidZvG3pY>hJh z6({t!Z(q;DH0oDP{iMlGno&c|=^{?4R=}yvi5mcda)yk^)6!0C1sV<>KDhZzdE-R4 zD5otl@~q-khN0IsV!%jQkj;Z}^9pq_Jj_^;UhEKe{dd}O$E4#HTb(oTd1Xr z!G%dizd0|;puKPuy#~ErS??}VBeYp^))_RM?Ay@h{G+-d9^!Fz&1jVF-T%xECyqU&C6%H1X^<2Ix$ zI9%Hea&BqCF-RivJc|q^IJ)D)D>%}lmEcH^hTzD?wK6rN7h+1Qw8(KM;l?6b7-2?8sd$CrgGpotdw32sl0DVZLkcC`7VO)lucD@Z+416GjI zZ@}Ni(JPhbLu_v7l^UQ(ma#fCqtA9i{3_#p?^Hi6lGl)8c9}J#zSQXmPaX#H8j>iC zA0e}H%GG5a<@DZ&6~tv8a}Kn|=squnRh;$9Xen;eYf1goBR%5lh*J?^lU_xMyV;P5 z+5qHmjQDI>dF`L7W-|5x+4NU1>{Qd2R5g8xBQagPw#Q6jc3fiYp18?7OPW<+>>j;I zdB|q#^I+oa`>EkxG?3bJF(g%>8#PqbnRwxMLAEk!e1r=I?yyv?BJBY|gw=4V_&?Iy z`(%!~0%;%cevT?v*c_>zn8?^1nHr#}%-JuR%3`Di z^A-F^)C!bmtbCY?p@cd&!N>@YQ$Br37vX_JO%7_cVm#glAyZokAG!rHYZaNQd8$y2 zLohMof0k~pq4+P&Mfy9Vvwh8lfiF8%&oAM_Zk53P?3f_m!)oFLdhM(OXJI^b*k}|J zQ~lSB)`8A5%o3z59vT7aJj3jORJoY^?8=RwYHA^PVVJk4q!jZio*7e6wbT_9y_v22 zdM)c*GCd0wnZRC>Qlrlw75hv+QXY&M`6RE7N%`r{81tb}d=LT07J$zhRAV=5L zpYUI_uiSvTDh6E!W$Xh${TRfyJt2egvq%NeU;h$tHaJxtI2Y;?)LP`L-m>AkaH7CZ zp_KCR{7UM)7B57Bp2b0R`qpWU(xrYVWfRFVg+~u-y`iqHQ!6Ub$2O9UQ)ws!OABH= zGm@8U9CtKiW{UJpJ9|U;Cpb_-g<2399xjz<)b<1@>DE?BgI01om5lV9%Q!wrRlU zf=d9uJ)piDmYVwBVd|T`1!yqntc8w2DuCa0Z-DQ1847h7IlS9^^;~58496meapu5J zRVq2Jl!x%WK?q+2E;YT|?}zZll=i)#_Z$D3KIVt>BL?T^HRl11^O`>xoPVoJ5PeWJ zudx6g466H+HcRLB`D%S>`ACF`nIvNE?gmGR(OfPxiyUB3Zq#qsE-(m}Byz;DEQ2XyYhAA0j| zsr;XVH)dj)Ng{kG0Q)}`D!PDsE5(REk8g+2UGV%h~xM#9|Ev9!4cA? z$FvN+W0}Xak#}eZc-X4gNAcWGt-??qr8f7)v(8n79lr}mGUMx~-mDyU=2KsgS#j>) zSey4xfFS1m0gZji7n^f3;kd({`VdlSs3DY^f=~JdCOFEke+2@qLQa^$n{nqH-dIhU63Vl>r_23fbx&`s=1c#g2AID)u{bw^CNy+nMMbQ? zJgcv&tgfG{@~Ey^iKc)Y(`d5S(Sv7BUwR!q%Pj2icJVCd3xDy4p?~EF2U(kYGF^LY^5niD&ynm#(K{Fu*EtOUS1jz4JZH_bC5DLF7ki1uk0&m4!$5!cVlYfIou&X!uT=TFejygk(cZ_%p5B-yjH`_LxP;)Ma`6IEb{$>OICvd7PngAnEKhw# zO8tCOQ`%`XU*G0kTPP3)b{cipaNeuly;48EjNZ+gPfOyRetNfzEUQ$p>pNDf8>1o4 zR{yv-qr9310Bf`?bFDQ668)kh#LiPnh^_N)`h_4@{bfR|tq895KO(pa5=3yNCPHul z6q{stqK^5|m~&mo3)3+cLacLnv;s`5_1{IRwSI$`XCS@=F(g?$$nUQt%yQKGEC15s9pYbDBt-0y@d@xWQ3*3GHBCs=$= z_8a*S_W+N9!Ai+DCi{8Lb_XgX2jp8?7hu_80IlT{_iBeAUID)lq-$AgE8MPNuW&mm zgh{+OaXOH+KZ{o2xpjGebYg_%w5H$jz-6=)wEA^|ZfAFfvbVRdi}GuiW2bfgHs9VI zv^e`0xikb9yy);698KBEu@Wf{XGss4hA%e7dlw{W_@n*`$w-j7;g5+z5=$3B5KG>1 zt&oVnLC<1msvdVkd<+aKcw@_7^&e&e_H^A_PmK^cLvVJ-n%a1JP7a zo+Wmr+nh56p9z-Wqk&{u@w{OP@>ANkR;MoWF)8&sML%=O`$@u@tKgy zpmW(*Q~x`XLb;Aj&!B>}%()^m$G-n-nhdI%;QZh}HbqcYs#7_`Toth+mY(UQB6V0R zo?J?yjb*&LrpK%I@L#mz>stD_Z>U-{bKe_Y34~Sm#o%Tj-ZT=ZN)rRbTc!s4W3tnL zh9QHO-ESgg=clx$GDPJd<;^))kaB>YUQKj>p4T3MbV9~kNCl{U$a6`AwJ6gP>68p<@%C3Nm9^RiyE&iN?%~4~rz+F&7p;<<+ z0kpCWIsy(}hqB8$%)lmk`Qk?q)Qr->Dmu)dCVKf|5lHMiGPp?@_m^n;T}yZisSY?q ziYY$1{XzC5W-0f|<`q1~MZ@cE$y)e;iL?T2ZN-OVXcM(45wd2$I<0em)JjjZhBxt> zXgSh#oj?apr_{&sde@2^-^$w39JR9cG)9#XD*JxN=W>TQZ(P8#8@pLXqh{2a#KXAY znQ=Fy>}I(FDeukd)>fv*qfuvS{b7tehSwj)G*Rmh&8bT}fykRk1tQ}DAhHN_1(ET= z5XqFM$;v~f+{8}05aw`_us^CrU|n2jSII{0(bmd={z+WD6BG$fq*s!tz`nd>$5=B0v?S-CF)#-ouPlQq5VSaZ z`g(d67fMB+g}(9;>&UX4*6G)#m&{i6h9k=-gxSJfH?D+uH}qV-LSKN5H}n)D+<2cCJtX?tJI_`a5g z(<1B~=sXr*M=JPTr1Mjr#Jt-019rz=4w?_jCWXJWrx=Ng(>75Ct~v!FQDoC%`Qn5n zrh&@y>RzHh?^jPdZ4aYUc1PO8{`q;DjEkmW*GhL*h%Tig_)|kp4Y^Vm_*BbfC47bD zvgl`c@MM!WpP}{rIx*WUZ$dqDVo?<@BKu|A0-DKe?mQ&^}O~LT)0Y zdOY6W7HLZ*%?c=|1KUhSfb!fQ2F6$`13EA^f`?nPrrZx_`9xg7-{%Ua*Am}`_|3N6 ziekO4@aj&^Nb+8m_%6@OB{h2vlbCjwZPu!Q=fg2;wNxC>8*bb1FKCEaqq41O2jq>tG;Scq{+6`=&$THQW5`7%D;r>6-*$q{n987v`OdR!{Sl%Me7^y1NmWS*8{?X zUC8+ap6b#F-|A1=^|DlL3DPzwOoKo0sPrQJ7wJXy@kgYC>T&juJeu928Auz2-3mhq ziUk4m14s!%I;u&jfJOqiJ0Wd_bO@)yaze8lWfmcw)TElP%3W=dYVOlIYb0k0_Zdyv zrnxU7eav>7QahueP>{|@v0zg@Q^n|fWLuM1o%xVZOy9MY*1u6bxWRWhdk%p)8QaTAc43fTafF{lHkp>FMJxHEaC0f07 zkbc8pp;pEl?&vop{S{Mpys0D7+BM+@(lkh@4VQbISZ5dxo(FB2w3zP+%VekW5j5g& zSRlJy+Qd;$nxH+=nk$Dd8o`St}J_BOIEpUx77eyvf8bcwt|vK zI8F3@2P2GkOVzam1h>SNs;!{i3pbXZgf%;&yiTMbuao1Wbn2BGaKLwZxbh%~& zX*BSWTrT96YEZrkj;N|-(YDMVZ7~tc)mz}|Ih&tY7IDoYSIBpSL)^#zTcDTc55369 ze8r*m@|_3AFTh|E`t(0A-ND2@3~3E};TW2U3x&Z|27@y`6b!Bw3}UZ9gf(w|#TBj%o|j=ZV-pH3+nQ#uEb$sg?SI$JRA*r~U*DC(JN$<=e%z zQ^RH!ZWGuT4iQqjO#K}OgIFbYgOr6cTd86idTjKmJl136x)$@fw(CWlsSr}Y9p*j zEc(CR#}p2#9tJ%Ye784JHpt3IYmn773dgc!^@ZSrp(7P3?MY3MHk&fmZ0gJM$Wm@?%Qpvd>z@fB1dT`1-(32X2 zVVFYrT?*3@F<7g)=Pe$#G54%B2uh-I zfAgN-j8}grMQtD^mi;xryT8WUNp`KtUN$eoYk*msHLM6G6&i+THIL$Lbh|EB#s;wA zR0v89`+`!sfD1mtY5QQY)~5~;YyAkMG6G&VXgdg!2$~ySAaDfzA&8So)hAU(1GgE9 z28QUkX+Y5h1Q9p40QeW9Fc8iK3CA8#O^i>xVB8rgYeOF)ZBTJz9joUfG@-uB_E7y^ zk0?D7rsBkK9=m!y5~R}g76w~%m#pFFb=>rcxKK+o?{)QfjaxU3o;37zkL@K|oQ^f@ zn462ktv&^It_~ih`aGheyY$r$MKhJ%HCk%~9$)UEVEy#{^fp+cs`~FU5kT~RL~BJC z$3ZqY2B_EYs^5S|sCYb|HIpzNcRJF%Au9UlgQ6+%b5yIES`2(7qo;jPHF^@1x8cSx zC@T|lIV!dMsx}g0%$~cB8sUO>tG$o3hJEoy8jK4SwR0GpbXhcv zgi@p=0n+&Bb-TUi$=aP9~zCr7Wqe-+j6MsSp$uhIC3GJd3>WJZ|9mE^sUGoazV9&Qty-nCGR*bfodF%ZtJ>O1G*I3ia#KB3cR}yTHvw#i^6dbEM*A zG;Ek{5S{BqwAQw&QZHnt;JLX-+1!5@DVzIqCy2R!p+W4c69uu0{1E#<~=nKoQJ=pzZ+o2H;sZ4 ze`FFSx$5}8l0yj48oh-D;c|nihbJ@a0#$Wcfm~r&x-v^SyC3u9qr|RSc5Iu0+kAFa zbFN{&ZYjEm>`Lr5e;pS}Os!O63I{t)0c@Nz`_(o+jjQyRM6OnKXR!^Z-Beyv>S(Qb zgwmR`+*%6)t14?B(eZH_PQzy_-?()U%B*Qct(W`L*yPy-*~-)V`4%|H(z!vJg%5Vv zU?kLZwP4N{2zI<0&J2(AwKgQ`Vn_ z`AX0(x5Ox@)6;}OFldPcRNqTZ8iDe4`n}>$k97MQ!CRKI8#NzVMS$= z_KDo3ySDw-aB4DJH~$_zO0}LN6Q;dt#0fb1)y_x1jzd20McL;+B9U{hY3=>GwcX$N zS{tSKM%oB^E$n44gPXx}K$_Y^3qX*Ao4yTfBOeNARN(NNj+g6fC2y*c5Css9J6kl@8_$a0R<{y&KdZ#q1LUPhJQctiH@xcsm>rl$ifUnI8+F9L@UB3ylRdS{E zXA>;j<89W>epEEbV{1&e!OY6Wxko5wX*7gD!a}F*34rc=0O*E-DkA2B0o_IQ>BiCE zq8D`72elvE47y83zBE~6^yZR4&}~45Z0h+g0Cbmiy%@=IIT&Lm$t949iu`QuCT=+z{*9o(&ZOkxbjvJ0_L$j_c+fam)PS>;H}$hUIz1a&2PS zFTJT*;%}MHzyx6l;OPwy!X?eZ{mIc;^EOuSW-#=3fE?%Whdx~eNmi~Ir^^m7$di_P z*)+)MNswwPXDVj9{0+19@Ub1_Io^>x%1~?qY`ZmfKeMd_O>Mt9i3=4@wpTN4-@LfO zV7fQ0Jivx}!SuxMe3;Jsj#BePqV}O3$M9t|5dV3#pf4pIg0aKVubE82ls11CnPTSX zFVBR;^iBZne{sPvc!2O@tfZd#q6BS6DiOE`>o4hE0A&+O%xI*d7!NL?&G;pd{R-S^TQ~qn2SFbEN*te*XWeo;gTDl zF5eAAS|iZpW|UJ(G~LCm$+20W`-Gz0K0-hI+0}S|)c{b)r0;Vnm;l4H_z-Z*p%vWX z$G9mWrbqg-npQukSdFZk$>0F%7s8sN+$$nbC-AB;CV($ZNsJ7fbXacsQf`XBmGHK; z;AXU#wrmw}cUY?mz1jYdbCc56umSgb?6_HV^*(5X#jFvI(xu#j%t|q%2ZdY1r&sqn zLu5#aW`py;*i(~!Lw{?o$@tsT>1POJ*C=H02{eb89-fw9yVxwWFU zj19FiCstF|iaDUvuuqynn{mO`irMSTT6&hc30_l=g<;B={eG-1^uB%l#ASy=nHKgl z%V-rS`eTnRJ|q24H=Pdh;uLNx0{!>b1NyA2BNfZXgl5_dcMBw$UQd+Q0r+r@NZue) z`>SSp-ufvBV(pmJOzVT&K^g@gjjJv8^H3CKzE+HBTdzPBlwC(?e;XsF^|PIGGvb&jdv~{zU)F=op(f z!y;CGADXQJ&~*!79vdh-r6bG{j`+Fy%YkbaodNxYa&UXH^b*q#rI+N$mpT-lmF57) zpGsT(d&#zwg5q4wswA!HP=8=nb?gpzs0*wS0Jig*$t=s z)`n1cET7I0*%$`g9L=D!;N_j93pGF<+b*(kk;q1xh5s_dFE&6a1WAChL>>>I{IHO& zg3P|}OAS!EPJ*S9UM@7NM9U0Z*f{oUI*kk&7x}`#xahV+5Awrt zp$7TQ{rrS!NxTxKCGqfhO=BgC4eRInyI>xxy9=v!m6b3xCQXrposf|noA#Ce&?(Ko zQUfFt98s|>LHSNmABAI;a3riY0Kp;oTGyk1pyrJMBWnC^Zf7%}n0ip! zd5vl3#WU#*aHxTBoeYG@^v)hJdVh*E$)1rx6L7)JxcD6riYYnU0hfVXH2cHP;BY{1!=V8+mi{$~@ zgm?&aZqIW_McN*d;)M-@n-=WQ-6v`lro$0G)jB;%HDr1c8ZsN#;%8pO4S9S*+3=;u zwNyP}>eObPpAp1HHPP0|F<+LV&taXy+vlhg(_{PONpJPiAsDgzqVSQ4->BHn%i%aJ z9JS7v7gw+rEe-K5gh*#Sqe>i`ai(t9C~_Z#;nq3#LKTCfv${2DPFsi_dJg%Acm@8v z(NH@=;S}%Q3%Y8f7rHU)>c3N*VA$>D>JAzSHf5Pc%4<}YbT=*W@20OGH{G;Uo`rV4 z^fm4Hfi=Gc$mBK9?@Vjo0zq2)a$swZIAL1*d;LjbFunjfxAsk>(%M&5z9(#KZEo$% zA#T-mSLC{V>S}hfYU}J|v~>=yRa@`Cn(#|hcnS*;QP(m;tiAI@!?B%)6H)XLP`=ut zD6Dr~*X`69nPrccx}m{w)3gx|N5fei0gF{M8@HA{N%07%%C>vEnOb^?rG{tFQOa2? zr~e{DY`b@wQKw8cr+o#|TkzMo+f4gwSZC3aYI!29xw7w8r+Dg5IoYS_8Vbi-g_4pmugemGgUWP@?1f)r>v-5pX>yP2k z0TB79yuQsTZAcYN&L@JvlXJxEtmeWRMZt?Mo13C90QfjsC>|;MYd?xK&aS;Va7;zG z8&jEq&1LF?sZ18~*`9kI>0CU1NOM_5wc&iM>A{Gi8S6rOPef*1 z^rGBQYsES*Hb<#4c3#7b;RK}=@&GqDB21qhSeI>Z?$u54vB+3Tr zJk;Q-F+)y9CsVfOPe2-lgF2^{f!j2x500aodQFyDdm!bNt6@k-gly?6u4NuadYgA@ zht}a~AV#g9bTWI1+8wKGbJF1(+$0lv#;65t|G{OJG)eqy(XPx_Z;2kAAuvP%H}dh2w_*N!o)1(J6#+1`Hm3EL4|(eMxQ^3EVZX8 zw>eqAcG(ijlWSdW8M!vEIpu=uU#|K3i!tlsa1ABkkWEbsRJ+KUYRO7IuJsQ9l-fx9 z9xiwz?JT4<7%UrcA?FdXReQr-QBfCaG(q=q-(fWIhAd{t(hQ3aOuJ zSZm5aaIIwWS+RwT`LI$icm#F6Y89?>`06fOu4nPpjyxhfz_?!bm~)k;x_a+mF?1h0xy@?v(YJEb(1IM>Gg zK8L`y`>AfUOKreE9iY&pgUSlcc%+Pze58H~%|-m>P`&5$SkesrooB1>BIWhzTIlZ_ z0{9X=imqD6Sz^kMKrsG2p4?Sj%EzxdQc;Az3xM03pes+m%fWEFB99bLzbgW_Fnwyo z&ve&%iJpZ%@<7xT%t_a0s)+`D3`&crK_|nkUQ?9fLiwQ75i^z#cd~4KRU^ddL2bn{ zT8$aXh>UB(QRBL92bMT&rSLupmi||9cdeN5{xRM|ts%>4Fz9vFVkcs+0|C4#Iv=#S zX22n~>ZCxJD7!`pUzMc1ofNLUwrEJY3@ z6)Dn}Qd40V)KX+joNm^BErL9-`pff0iomlUHz^O|(y#g35#zm+#Zw~Xd^h4#V`}X2 zm>Wj>f$`i7Wh6Sp(E!SA!*5@~9OZ}#Y!1MSv__ZR1l6f*5##v^8l8n1XH}|E6Icye zd`<-|S%qGy*WG37PV4bs#oHOuf?`l@wW&)jh-IkwLtE&BYuVs%W~uQIv0EpW(i-rv zhsZF^Bc4yxAOT-n@g02saQS|Bx~d(s;+IZIPvFBs?G{%2p8dNEt_34Z^(u{J9s(yhaVq#SxRFMgw{)RPc*f84 zlj|Cvp&wjk+(mby!rG|HAooZyKaJL{7oW_n=kFOQk+#O@{O38ps=rgD2>P)tlp&{_BY2dq8=!^Cp)6sQsufD!;?{OO0}2{3Y$z$AmtN;rUF{*$wcoyh#FUZFVkA+ zZ4K!l$?RjgfC{q@z;hAEY$2P`BETi@KB$_quVH2j>Jh`JoC*?ajk7bXo1avr=z1<2 zPl-Q6%075=k@A!{M}yM0{*fz{AXDPp07TD|Ebo+fUNEBPGs9MBNrklkrdvA+WTC@?wgmj&DZVLfw-_ZLXl**KAhyD6%z_mRlxl zb?6-sL@X`W9d9@&(&j5v6|qRdVPFgOoq0wQc^aA4&Ier7l=BUc*m<`QsZ!}tBA!(? zK&s@*&k+1^YfMr3ghe@uN5Uqp(I1%D1fn~p-+?fz=ddbP6swcyU~7%sKyI+7(mIhD z)v3{9mn|k@y?O&wJOXdID&7Y92HphXYATXrqmdlLSD}6)Hz^L09N=gYa1!TFdMi>6 zZlUgvi0DW|S|j92&W5a97fwm9*i3iXt!CJ{1A1fH20HteY?BTft9B*vuCwjB2RjPo zvt>N*)*K_2+DEv<+jntp&m53>R4+x!qxz#QM9V8h%39uD>WNNShsL+W+wgxM<>Ehl z^z#7y$o=vLsGxKn4APap@$a70x)sy`bhW3EO8&P3ZAt@0EoS@-w^*u=G5$vu?GNgv z?#e9Xtr#8>hPcD}YaxgImnC8Nq1m`M*=<%K*%ySVM?j6UV|no=F3cjl&Dym`ChA2} z5IbgltVKx7KAxyAEE0xdd2#Gf^Wu_ywXM&huZIAj2x5Z)-ecdeh;neVvIreFLV0mJ zmo|5w(3PoH9;?Q}%)MDHJo46GC;sJS&}}fY7IG5!P)Wi!a?7?`EbL~C1Q)GKg`f=Y`>C>_FR}fhBACFX2y$bso?TIB)iuh7fujTnlXXDOfb>dI3uQaA1XwRy2 z9vs24;j+;uuBc~2Dzt^Yr(CJ(9_; z@G|Ufx6tPEgr@{{ceMPWp&*C`aaU^)(P=GtieZ%8w3g~r*;qT4*>+4Y|~Tpy_K^BUI&2?J{q>Cfsh>>eF%U!tdAa1%sdz2ikR z;@7{4^2ZO+p8zeoi~}ys!JXwJdZ^q^H^31UTjqcPpl_JwNO>Lz^2T%)oA+>4v-Km= z)yo0-&%jhJ4#OQ~jaQgOUsWe#*$N`5a{#(?G zcmfAU+)E(yqwR$By|?W#!seIx?!FTHthEKk)7R%}r5G9x%%CYHxn&?wwdSGkmhTNSOMRWemS zfNJ7xL7s0-wHI7XGHU*}DDhNOul?Xwa=)#6`61J!u6Ja(IV@c_79L9xIFHd75F@N( z)99bzVFTh3)4dOYAanF0DT%vSy;y1UC||L+nQ_SagYSw?f7CQ{9}vW!?J)#4{~i`PG?o7I>JPX_nPQ^LT`gW0(K=T7J2PwNMlYbNa34Q&<>wLzr&84Vlh zS3hFI^_(@2Mn{Lz9AXtrMFWu&ohvS6cdw1aX51p>R@BnZfZNz{LEngR^@4Px+0R5F zDB9dzc4aKVwqI-ZF3RX3M)Qk)T`lYHrY$Z>TSS$phbax08X{Ni4Pyf?ceYY#1+m-m z*7t+Rkj{3+bheCt=yCh|;5z?7zEdVuKj=ES7mwYpiC0Y>m7`w*I#+eqSoSX-gw3*= zx3hucn&!BqILgyBuM0=q4d1JB=c(g^l=S6!bz3O%%BARL%O72Ici%Fl<;l~nma^_n zo&Sy6f!cXHV9a*iQOtU#bw_o8So-BNExi_Z*L2?W{nQ;3Fr`TLY^5!y-9D7g+pCpQ z4Pz@;Lg!5z9HTH3f$M97Xb*UJO5Iy{>QMWS3}E_D&tXvcqx!b;PKl@+a{aW&Ed1rA zxPD|C&LhN0{FjlrKXn4-KAPLu4Hw}5{#QokfvsdR#P%GK^>=-OG)*c5_ zr)-{Wsg-%k|5$X$jYvhh4@D7qMnu&<(O4YTDrhZdxI9gC$lQ$@|g0)UYLri>=^3P^0-d&`?OwUx{#C>tbY z-n&Pi@()$)32p76ZUZp$Dfh%ZEI}v?EC+|ks$e_M49!sjj$o9`3_!^&RY;)38u%k9 znJv}8Gv6HW@XU8kAWG&c4mI;l8+4B_IfNS+CW(W+^M)<;lwF6O1Sxpl&;ztM`{-gC ziVG!_<{P0jWQfb=u+KV1V{xJM$FB{PIk=qg2&1? za;U)6WJjwY0BI||%=G#Qd?Ho~K1Iqa2YLKoX(($9yuJs?9p8Tu`~TLqwW`1>+V=-% zUk+<#SNlM*oXo!Q-Xp_D2fM}d9`{#Ay7ZCZ)6RHpF>5t!4k0u6$Z(mfB4j>8FMhrL zVoWIlj|^vDqXu9}jtM+6oawKFUe|5*3Cb$wMvcZ<$W!NpZ)&9n#b-MPSz@$%h+@`;BIY{a& zx8r#qa14%HphT9l=ISo=|JFhbPya@sN$Q^AQcl4;%(uEm!|tdA*-rC`kAn1*M}PkV zO#0&xsUH}Or7a+-lfQSj(vec4#-JU`aqDyM@&C9ztt42=XW-@_(|gUg)f#KQZ6Cg0 zg?xGeBu~8e+;6Cd{%3yM`ONR0V0lbVMA%Q+m;rd~eZHb%P*s0DVESv(I8h?LHA)1> z_41to9>HgTKQUfr00)f{F&6}x;2#1`;=^ErIxOw1Y*2@h?dQ9##c7eJ_tv!Dobe29t@y7#_{|Lih< zQs4LV%jo)%r=)Uu+=zj)(H6qu1*8(WNz{+D2)Ir=&w3fHv#qF8e>aS|=e#uPIzc2& zI#RYQT+o_`Z*BOZFpFAzQIAaZFX=}Z%fh8#4W>jG*s{=ZqMpIr<3^0G@um7LK2iPf?l&k=wAYg){>uIum7ey^`jap`C+H(F88$1zmV!4$VG z=HAvnt2cDR@Y@=_#4Rz{Z?+PD>7Vq5x+R|zZ2ldOM07W^2|D+#et2eOELhO+nWF3UZ>=K}apu6I))QI>=-wk0htjIr=Rm8v zH(>F?x}M8@(OMf~#-FFVAS*FEs!>(Hck(a0Lpx$-SFWG_oW(|7O-I8z-SE?&q2H?IRr@7IUd?QcGt=C*npuxvCHCG?)r8`f zdd1Z&gRS%5DQvw-bCJo%v?VTs+(FaNRlxBm6G8EA*^$U5f^T-yEU@sYA0?i` zqO+}WXm-|WucTSsS`A)RiT(F##jxw}zMY7&FV1~yG*&{!pIIZufT%Uv7_iP?8Z~yT z*M*0{X1x|m`NigZkqB#fG1=CNSVGJ_NUi%F8|4l$4t$DCp1Dmx8ppxCSKtD!K3VI; z4)8ou*a5QEiy2_MY518SaKmG7ff|Oy46wudF?16Q(&9Vyc=XH$8IN8@DmlA<3=5PC zLs7X7bq=h>=xr3ECs4sP2n6c9339gLevh>WRdWvB+mU;H-!T`N_s1Swy17C_TZPuP zKCO7djDI-eimW>jc9Hvh%t@QEPJ;Pt7o=P(J(0%QFD;-)&%?Ji@_=x1D3T)NuqRZ? z7UT4S?Z5ze3Y`H(IjkQJ7Me%Q?Yut%dNzc5Ib-pUmi@1GZ;5Yh(Sd>b?Na93NV&|37}x#Ee8PM*959i?W!{QZ9DPpfG7s3H%X}ud z%xBH*T;{X)ROSi$T(&>kXQk^_9G+g!t)%l-qF_ zQZ7?2Qok~ln2+j6(R-v!U64wdF6%N?->b`XCAduAo7=fe-~V6ARByj7(+{RhSAAu= z>MK(ak&QpGuEFK*%bj#i~O@V!xq|HWN&pBwtRM^j)z?8teLq;+sIk8Z6wNSR6lvP z(yiQw{TtlTUmn0#?f%rL)P>0QukS&;7hj5HcJiO=%D;RaecM$IM27FWTsh0;fTejRJ57 zR*fb*jWbL+^hSY<;F63skB3|J@gPO9TqyN`XnU2qU2@qX92+jcPN$Z|i$-fH@Y+d~ zFm!O3HHM<0JTp+lDTSTa81x5&cp3l zx*DpUHq}6;8omIDPa@Al%4*FWq|#Hq`b9W!OfvNc9FP+QV#~*5_5D?94uF^W;?pW( zxV^OstCUu?wQUfOU^zI0umn>`#}sezttnD$$5c&Xp^$}fOJu^dpz`vZbh<9-TySw; zC`2lKVU~X@(_qXOc_ujqsT6n4&n&KgYo0qF+?wvWzT%@v=Sq{(MKnG)M2;#Dq5z|$ zm8y;TRvB^aV#KY~s={Edh!OA;Mm8Icx*-*jFb`$jRmoO0QaxT)S+^tCZwOc*Z|0#q z1@eFe;>Sp(^avL3!#FknP7ef&gTcMTJcK2|lAl>6fwI!Q)K>+N1aRSGR8#sDse)w! zg<1@SYm37)Z1+ zD1N|y*)CLI;Qzr70{?8J4F4jetmWTE8ZZScw`T_wJjHgCEHd$rV)Bu z{Q*&bn`tsF^tJ`#V!L^K7a~049;+tVQD|PkQenhxuH;TM2WgUfYiXF8Yw$p@t~88_ zF+4P;=sVK%J1GGpz)RFk|KFvdFa!UkhISh$Yy(N4uqU{BDCMp^Zm+JJzu><>VV|j+ z6CgnnX1d*sgv=M*S}=U8YU-CoF?p*p&w{oe(c68|rw*F0ea-F;IM`i${SN8u_`|xw zu*AZLq?%w2vO9P#?yc($L=9gNDh5T(3X9tOsAmCv5&{owrA`&2f?yB*m+Po$7unA5 zhL5%cp+45;|7zAegJ)^8=J7US)_hp)>M66e^MrhaiYN##L45)%wXf)gd^?{_ui`?P ztxmPkzO1i?xoxd5Yd?+Z!lo_R0}@7GgZwziXM|kGaaNuz6T=ilEMe8T6H>or0uE%t z6Z{;cEHv*R<#pm5Sm}A4xTKA?Q@&CO)dxap8^8Vik>BYWgxH-41{q8c^jnGBB2YMp zV??CMfpQ(JUHy;kpPnD|(=Eo)l--OY?3>SmAt>3i^|<(c@y-k7+Xr}EHSl^4EKyZQ zto6Bvi8=flst^Gn%pRcY>iIBLX7VG;SuBdYAz#3zN(byl{Si<9CdHs_8QTe zjh~&eu`{hL>)MIz-jUW;TD}Ue8=YRE=fWJF{P+sGi~HH_sHZU1p|_$@8%nqC)mEFf zhk_*1qIcVJeF*3RIJmw0v^CrNV85)W?U!|6trP*$x2-A{3qp}PE{UJN`z_^|29Ou2u8s}eOaZx%$O>T?uK=Dt-;j<6m@D1@#<+@_* zX8BhUyUgVvLtN%2=o+DS;@wJ%{Sc{9+Pec2KRvw-z(fj8B1{7|L{rZ~Ti2;)Ku0D$#wU@p-F1)dxa_(2Lo^tL-tfvB8t5{Fz zwcUu}xw6RajjLm%=Uk2AxE#|^6|Ccd(RHX@GJ1&X^Z{Q?om_oajd|v-Ts(W&<|Gl; zkjnGgiuN977zXwav6fDW^+t7_uOC50czUJE-}OTv*g3xJ1t!~7hqJS=a&>AiuQbS> z&#z5(8) zmV)C6pI?PH;LmMvaKN87fOQ=X&hQ2bE=(1Q7 zCg4FMSqikkj$Wz0!Z`b`G(x*1m;M80b~apP1odtZ#MgIqTfGDOt%uyo`o9*BtIYeR z*6Bi_Yg_e11L%R2m)bX!k--~jxtF(7L$2RqP zUOd|NKN`FUkC6u7t{Xh2&=gE*g;rr(|E*4xgN1JC+c*mr4J!_(ard^C#7p1o`SmK& z7RvK&@G%t#fC!Y@&UJ8XU%g9XoVI}$XFt7x&f-F;f_n{+&NKp$(D?gMEhq6Y%9Z@e zI`Lp;eV}9=y^!iwE8HWH%2LxeMh!R!lBfX(45GZ7m^^SYWe1OM4X(O?Ahkgyb5i{@?35`d-B0cac7u3jNFEd%#R={I=7o;revh@FDNE?J6tpm4{ z;%07Jz4|BR9`AuqCxcOU$~?3SS&z7FNue9+Sf}M?N(X`M9$835ke)?FvKPPeoVjgn z9mK#<@1jV&k=d&u74{37ojQP2DRgTc>!R?+TnhTGOB9b_0yQH`G##B_Iqpfa?W4m; zISfH{Fo*;GW%JlqK&lkFr;c?+9_#u(;IWj=x2R>e9~Ah?L@vnZ$OUDBsid}a+y3Od zS{i1ZLR4;vy)*%|y3vE73Got~R*&%=N>(;{+YP6NKG2FQ%cvbaIMlihAb^tKDDj@} za|NpYdk7Rs-CCJ$bOYK06yXn?xRq1tJ*vMV$V33H#3o;kWQJ=fN4YYqVS zY^QhrjR%2u{`G37I#eBsgxV|0bMJOqc}@XI{6hN36Dz`@W^V+|Z4R404MQ#~&VAeY zDb8{_NWXTXEN49`y7GW_qASnFf7X=;w$onQgW4%opS#Q;iuoIVwCKu%C4=VxgWCn` z%0ncRb>+G3r5{~FD!S1y^{KJ69X3C80^U!%Y`+szW|Bo09)kdP&&mzA{GdY#zrqBZ zPjMYVJzry)_&x~bdEe18WQh30abIAquDlXE)1$veUxNeQ$aemYAT$_cVMjoFG+uR@ z2Z|@9-!hMKxPK64lRLgymKB}E3k?_jW?DAu@KX8#H?eA$kQpQr-Io#!9Nm=p?J zkCJb`uMobsk5y=H-%!sAK={g`D4Z)pDz}m{yJzTczm8|H+u-PS)MG{!+ru>S2`B^# z=415tZUn{S2Wvy5+NHnTkC z)@cNa|n8@sw>QPS@)n$UIpXGNRv3ZLfT$d*#d9-C&ho;aT6ZwWo~_H>9TatDgg0ld%83oPHa)1+ zB$ zj)G&qm?M6k{#r;}f)$I;b@c8jq&v91Y)5L;QFo*Tx+66T`H_ya1)S0|z7{ZM{Tp7* z)UlKFqlKm)DTiPh53+DCQgtHTE|k`TUOCb0)2jQAzhA43{aUYsP4}P0{{1J6e*Yo> zZyQYAktPR@465HmF7@^sIszVc_F86oOQq3p1BqO&IIKjNQ0Be_6N;aUtu4UCR(;AH zu&{RB_BSw^v`}%=9B4BY3nA#7i#${Ra@3{W%D!Grh5gUd{mQ;2kEY@|JGn;{wA0FY z_HRv(TB(uccL2b^`Mz)nz30<0@UnM(0y@v6`ubN9h}^$6>wZ!Q|BeS7TXe}WOkn$` z8b8GCcB?OAYddkfrQ3gyuC`5gy#{}j|J&7_ts)D(_s}QElHmlg>D5>&(XY3F&YIEz zZ$1LZBOeo*S70^b_2&C_xVyGH|5?`A+#V-qy;P}Sm5ru z>+V_r*KHQcHg_$Q-QVikAffjFBAuKBP&!Ef>5xzpdg#3=B|snvMd|$CGiT<@caxyt z{vV!)xtW=-oq124Gc(5;Dc(EQ2)tK<--`F%eDiL+w@dS033|9<3{yFCh;~bl8hi9h z!@6;@DC``1?k(mq2>!i3Jmw?wl~ohIPi`WKMEjg<)}e#2*?uRR$yVhD)R+GR21}wA zP>4Ece9*92N7U7}?obbuwd9oTX{TFd)PnurcP*FogSWZ2s6W>qEC#l?kx!mjr#k3JWn3D<(Cnf&X zcr0f?5l^_)hSE{RC;y#uFxB5eiiC!oVLAM75!SO{D4ZCq_(mA&g53cYe;GqP99mXi ztobRV#IB>GU{saNi(7HJ=EVv&+a>8NY3xW>|bxg z{Z%Nm7(W!3MgPOWWhG4%mz6XDmnApVT=w`s!DXHb8jiA1|DerVw!-4@y5_!{=;4Yk zX9J@BD#qD%A8Im(UHdT(yKX+8lNqi%ILvdye7<<$H=K+X5^__uDo77`*H>rUWm!fP zT|mbqXpY+Nfx17MV}4tn@5gFeZQh`i2X)28HT;IGp~3jEkB^8;rcQ|IJV=AyhuXjd zOB%|A@GpvGUM~>l*YIN6f=c$&d$rbnMnV_yGkUkyenu)P#Lwu{n%aMiJerW!Dz`>q zd?i{H#t+~JW4vE$?Oi<4)nL4TYfAWpcWK^)s`ltJ5EUHl2^*yDq-G8Vwbm}iV5wsl zV=yI*Vv9x=hK6^C_=ie+0Hw%!9KAJ!+eOyDje3<2H>`EJWS~^JB>;)ROjQ@%m%q^| zVYq%#NbL&1#65?DSR7}k!T$!aqApAdbRL$C4kM@&02oVU{;S6|Qr(js*pZYnxXd}J zMBaaHXu@dxoJ!GK`zP*E`pv|h#qnCD$sGF2dK?QC!@p3Cj7D7d1tpB<>%_Bt_CN4! z9Rl~R===;F8J%-b#`8Ae8~KMv&}VtKT@}-146VZ5WBs$%X*c(S5A1PSL=l7e5yBVyZ@+WSV{{cVG!T0UZQ*UuobK zpoT5`t9HwDL07Q1SCX>qpZG+}z1Q)>wk`%VQ*v)WGswNM_^qsqk3X#}t~dkyG$9fo zj{tx|VmSZ@(wEum7}%K_eKlt3cLhqz2|;=jS1U(&w!&K7O6C;9=g8$^Rm@Q+`+z>} z0j|RA;#>o)`V6d0)s<%#@qBnQU_)bAT*3vBE%P#>mFi?aI46VCmep*dw&OE1%F>l_ zh>rbNmAV#XKh5|Zj_u7uW3uFps$u62KV&SY^T{GOa0^e1(ON&3_nXJrnd5powf@O( zWXHSg)()QbM{ zErng^6Y0@vPUc~J>S0G#w&mU8$jY|7E7EBcE_haqmxb~fRD>$oa<%^%KD92DzY)F= zeOgG{@z2Q?Z(B5k7NA3yYlEi=&*x@{ZcLLyYx0b!ZLM_Xlk<~7$?&#avV02 zHJ`H4jhSpYcvEfC7uZL{{)*N-mUTwLUzixaDKpf^x^yf_$WXyR0DHx$Zpj^ zIjOaUZ!Mkx~%$6Je?PqR@aq1JDlys#71Yz2KQR!}S@ zjf~JIFrR3xE&YN?JjK2S4Ln0}sDI{1svR5?rS zzzQGH5&X^3+;f^CDEtdyp&}Eh`?-st~6xb%xpHpbg$>vLb_o+WMjQbRa2giOfuMIVHobDG`N&9cscd9f zh=$(*R(*1*^fU|2-=)DSK}BEmd&Gm44q|xmD~; zp#Hh!8Ol3-ADe}BG4wIvg8In1$*od;c3_~sN~UoKs<%&~y|^G8s62(TwwhTQEZ;@7 z(*Z(`+&qLI3YIT&jX7LCw}pabZVSM&0KXM1-_3}y-iw(!+EXDWI)t)kfLgVNns0&<6pgeO9F4e( zo}3zC?ZGI7e;Hx@8B(Y_N?t%Xma_609l57NtVp_n+EBHjFZRc0YKD%N*O!E&CV07c zKWy^$8~ot4g~L#`g(-dnyFMh323>F@mS)58+5JOgr*4BOOQWgJA6iEv3s=Uo) z-i&MY&6a$4@T}mnm$MJ$mZa6rbgk5Zli)T zHs?x3BE2^kBdj7_nYom5%40=`X6e^dn>MGR9bzq;mf^?qSjLwrBis(Vc-H08_9vnNp3hM60>*s30nd3gC`b7p>MzH@#nF39V8F0K z$c%R@(Lm{_kyV`;OO1(M`ysdW0^PyiF@9??X`92yZ@G+LZEvi%AeTZ9L$tcK8=}Kv z8irQvjck@TUiN^~3YJpWTqytW9c3N8I{@zoWAN?q%P}Ze59mc%U(s%t&<@%dt2>*n z!Xs!o8d-Vn7H!;!uAm}8Y2!W6nrV^PNv-3yNbG^~;fe^Wu@aE`)NP;^QKQr%N`dzQ zJvgZ@x2VPYr9u)?KT1K37a-RU(QtfoeYd@gReke5`Q~Tw&WD{}TAhx96ruRuB9!%E zw|nq`@w^(4zm$`|j+t*vM}>Ujao=yOw;JDwQEiKoM|lKF9_1{Q@jR;ce6Zi!Ymv2D zVe$4U&2N*?8d~WNtEV-;6`B#{dC|$TN1(0hsRY+QQf`OUGh#f|pnrUWXj-+ias!dfA3O^nS(=7cA8A zXyijcu4p5aPw@++GpKE@u>YM96NiKNxv}NMCmUgj;xXG%_QPe@oEn3AZW124uC>L= zLa=JX8)dKQ#qaW#=1twqi72JGfww-s`IhNt&tKfu-6Rlj`-l09ZYF|QDjeV|YhI(! zt*{Qlrmlmiy%i%z>roQw5@T1LEXxiA!qh&n$*YhT2E|G}(8X;7O|~3Of!KzXUV|2+ zv3lUV0B^5V)EW4Rp>wElRRT44?^R-rOFXYP&N*ibB+VU#4646vi?H4X^!lvwF+ltZ za7UG8+81wgB+80TOAf;zwLpFBQ=_NI_5)7>T&e0e$MhJ6cP2ZXpJMwjhT+l4)CZUU zTmaY)AHwEkV1RdG{|$5+EeCj#djLM?S|pak)>*}B>(q9M_6}S{*??PAOqEtucuB$Z zGiIB(s@|z*sQnIcw+HEN+8$kwYOz)ZuhQ1a5Fv&bq!-X0?}wv;Tsy@eZHtl(QbPGP z#Ncphk6%&r&aMcnJFqtbZ*4n2VIytAwnOM%dVW;OTT;Ea8>j?ke~(h6Gmg80!xf{a zD5j&HrS~Fkhm6~UGASspzIV*3DzaJeV`KHr?LQ zdk-+irv=T#j~`HjRC^zGe&L1h4e;Y(ER<`9lGVTj{Z+ZgssSw7sO^Za^6cjr%e&ML zr6{*F^>uMZ;J2hrXbQm%NZp_Y4TIE=q<{mE{c2a4bQ)0-fn~S-P$PSqwZAp{IawFs+Dc< zRcV;!D6UP6t!y*ic}9XYg*GgcVB!bQHxi6hW%WR~PYXnXRW=pj{@NxE+n--+*+oT= zcyCb`sKamwuZ2cx_yas*}n zmp2)lj83^Mx|V9uC0cXPNim0)8IhFLAQT?o2~__Il4QB5R-SX@3jLi`y`gT_q${+% zqEAj4O}bKzZCu%Amy6KU3=qswpoyb8pYZF%o;LPXu29^wl=H+3^Tiyw~!U*Ln9wrf;_*9#6%Uo@Ox5bpHVpTjOhSaI6_V9^lwAQWhI zgt^C*NDBS~_?=q9DPyd|IRJjAm`>m--t8fw7-w7p9DBfEhzBInOjL+u+bfcd3Q!}K z-ahrRaU9p0CG>hjWjIu6C+<+#bcVCxg9*wwI0KaRa4q>@JnXq+4HRVV8^Z<9VsC4Ka+v zxB3P&3|&HFFU|>8C$c)boG@M1qKn&J7|gMzqkP|}Q$qvoiv*&l1jkP^;UZ1}=Z-Iam zn>}bfg44bW(WPb>j+w~t92So)kd0CPiKvL9IsrI;4Q>Q&-+r>KsoojM7^d>~Oh)`EW&3iH`_4j&60>wXBYOuyel?Gi^QPXH@V;GQ-0oFTcTz47rmnD z@^<-ob5Y0g=^xZX)eV5u>c2G_r|@#!Tvb=RFvvT5Q#1ya>yD_pA!+{JtEj80>cVeT z^i6L&6|N`jj(i3$JGz6xVb@{ITg&%W4f9sA)8JZ2dw)xh;_vV@ayoTDnOJrB^o^oy<+#vvROVv&KQQ$d z;HKYdaSKS4>*W^Ml4;TvxAg?t5EfD{gZKhr16GR{q%1_GCt*($~-BC72bt+fK zVCNPNUmimxI|S!Yim*eh9#N_!dN#nV#N10Lr3HCCc%xYA*-9^j`0;}X-z#@UIXp>v zCCF_hR&r{^7pt{@IRPC)qIe?U>(vijJ%mvVO3PUR7$A#G-!)>efP{x3B89{)`ctuv&xz zZA1lcCqEIOQhMgOYHsbgOX^FJ_I|8N z^|01;FV%PEy|OUGOC3WTLxgdy$^*UZM+Tb0F_t1bmn+%%VdM(?#=$uD_f_u-=dd?M z)buh)*^46Hy~$zozoBe~50Qi*gsrBOr#JtnSt>|2ic$pQ8z=;m+&J5b<_+ zp7{iTGjFvc$l}V^EtnFbj=&0sB{r0yNop1ke~n-q>T^?i~4gt{u`@ zCE=8y%i|4qs_5>MRT5z>ZM7r4oKdjSC$>8`k6x(*;VBG{&E_FuEk>=_b-ZJX zIfr={c^+}YbAG-qI6iF28T;7RJw_=IS_HLw)y-n!;P14m;=+?J^a@n@ZS13*?nMXC zlQ*3}(p~32#zKrd4!E#+wqJ{pbo|Y>+#Hl*%N?`J`LmFQbCS9=?}txg!eQjMF9_*>KuPQ(RBuze6} zL6&zN zHxWgYf>O;A+^nF8Zt3TXBDy753ighSP%&8lrZN?o(*QrTXVE;#t~5C&3MR=^M}%bSWRP>#ZB>^l{vM)@C`uj{RJ5S^LoT77#w#(ewaA%3(dkzu;)T z+?)lHk7tSp_mzv}Ov;-KJcyI@sxB)!zMuWH@?nvFa#6@|Sf8x9VSE|q(5Gl zXDkpH8FH8&f7ETA;3=(vbo_a|UfPF97NM4p!G2UcHAvknhH`%vWCcdYK`nk)Y@#6% z`0I2r^+#tGbc1mMqng-0j0&FE#v%(bS6_Y{Bco=(hC)Xwb9I=!y_l;#(XJ9-BruYR zKbx^iMhT-er`Z#3>@9$bmq9=gNu%^@NhpL+&o=B_ZijB$g7Us}o0@_Otu@9bX%%l8 zGG2Uho3fr_cpSd$c5G)RCtr;<@VJ96q0y=6VlI`jAE#*^hlqsd9q*xKD!ZwkKB92* zGWtzRz?zS`L<$qu;iwd*o~Wzy(^5+wEjxD3z zxVnBM2QGrWE^qb>@k}PHv9p#6w$OvE+}1(R?G8$I7t_{gm++&f-PRvK@a-sN>M~sq z9MyTo$eIip1E;C`1{!(la`GCLKNn9kxkAlaPC>eanz8>LRo#@v`O;?)Cp;^II1{A| zGJFLLWE`D9%}0Jk1F7S4kX0Oy$QTigADFpG_*aZ|OHC>!{5wVqjpeP~);p0tK?rct z3^PVAwSfeS^od8Hd8TRpR5kmACeS>~G|yJeK2ZuZ&o<46RI^XO0?l(wbEub}?Gw8| z^IX&XjB54?W1u^90)N9aMsD^+Sj2Eg<~8 zqb^bQZ(&uq=4Ku4T{b*`EU&%|_d67MegB z4767$)YU5(uKA?)pGl_-T-F-li{mI0Im@al#LjMj@CZr<;Sz`umk0j+OVgt<`2YHa zge#T;xzjv|u@<0$&8EXBMV~IWfp~Eq)%hi?EZk;=kw%}QLQ*(a3Ner;Q0l=_|8{#r zVU{pOxDF2I6aEY^IflCB9js#*hYa{Ae`0Tga zan976jN6hA-Ex%Ls#RLajaX(Yx$d2elFMH1wqEl~?nfg&VrAa;9o)~IXGBq5e>V*6 zJZgtAYCsV$!o3PaI5Z#Rc+i8T8M*dAuGIrcJ`| zGOEwe>!=WGb`yCqAT_869i3JaHs5iW*OrfYZFyl{H~t-5B)X0pxy8uF>;Zp$b7dQ-0{PmiKE#|wFt>o{py|Iu0w|dsKRrm0R>6894-X>z!XuX@4KOi=JG_CwU z7#pr_j((n3j8|4b$AOC&>WCUKiMHG5xU-W6pqkOK!=R(xI0QN9EUG2BVyD5#@INrU zJG2FX(0`YpBaRNE`p>T2<}2`yCFr7X(oVGAUIV18`5vpGM%hj@!V61lk2mMI>wz`p z{q=+TmN1j3GrB4Lb^pMjHo!@!1$zSJW7begL0P{dO4R5B$K-XC z%e57laJpRggb5vEIWA}r%eev?zA<$4MFXt>5;)-X?HXzi-#H4)^QGd1R3wI-w66?v zzf0+87Flqr{AjnNcnlej;pvKF?xxq!DCt&(&XIo<{m(eZ{JlUdDOgj5+7AiEQl~b9 zIq|1tJnVPs`A50^xiz%vw#RA}USwVk26s_qU}*9ufI(@%3qF!$DC${~OhhS?rsQst zgsj)yI%T0ukTg&6Sihq#Z@8^s<$3)Vza9k?W}&R{)UoSgbOdu!wV$`7F_NlLWm^q? z-eaiB^{vXfo=4q=Asr^}qWLN|ZR+}a!@&GJ)6oRX9`6rkr_L>q_D&t}cZixWaWXd+ zMl0sNtnb3iy$U^RMN9>AtHl8UVD9wMbRM-Fv26a9F+ILpL*3uxgrA zt!@)XOc2=#tj}8V;=AM0y1S7_`OCi;WcE`xNusY%qY_Q}uPraJ2I%L@()R(>9%4C` zhEE5r*+w(6>&KvKXq9ALq+HO916YIf=hgxtJnqpx^cf}e;k7@5D^i8#;u7&ShO8Cb zgbtM#6<^~R+Lf=NDB~Jte*_%ux7{kAb~sATr>zAta>%SBN_H!Hp!5;T_xfo#5d}(J z!C=%{fkD_8X7m8mFMK|CywB&3)o`GA3_6eD=n5a5s9dWt`g5rVItrVNt%!tU`Yz+t zT?7d+RQ)~hjxy87``}?b>P1pb)Ofg#8fKDe?;9pb`(FqCK@S;Pz}Nw+kfBk!sRxaa z5v4dlAd%)nqlubEu8gt^sGzG`Wno2t1B5ZAlqUyATwR1d!%;i)E+FF~KpLADAj(}>5v$f zX>P0}OY8p_0%q9+L{4A|s+oYs1O)GWi(B{$Et&7ODdsR;YCHWM}icUmKrKeze0&03zgcUWGXEeBE&|8 zfH-=;+@~$xlx)a6%15VPKskkfVwBTL!*y?>O1LhkJe69~N;ER>BBK`|jw7Mf_ox+G zt@5SSN1qy6t<$uc^_kFWDN3PL-v3G~?P<{Bo-CR`w|v8P8_e*7?KTM8)$<0osesC0B8_O=Hlw@JST$I9sn=8`hY3OaH%@!Zp{2ywCHd`Hx z_&j}wdXY#4nl!)fr8U%c-*K-Sk{!k9&09EjEP ze%{4_SR0j(-)e1?w^e}kM|!M}8xxN=76)U&pC6=DDs@85LovQ9=5#IX+2v3+fXi%o;hh+6tL2R$sUE6nl1i0l)_%EBEZu(MdeJeQUL6*YjuW*){D4 zA_TnZ-M`l9uhXZf7Em70a489j<|%u4^MN!AtscMZ^|TT{cuTHZC~NxNJVNpP5f!xj z(gui2egqz`a>?7}z@v>=zbju%Hc-O5b{7ptH+HIyuBDX7D9q;HLWOLFatupiu47k* z(Bm=`qJx`)3Dop7%Mh51_><#(sVI4p`Y1}yEwYVK>w#5XfZlbR7M8)#i{Irl+|T$R`A=k7AT z6P+CjJjD3M6$LRx8ZmWYY5T5?l&tpi>iw`VzW{Xg>;w57R(t*~>Wb^?tLULW5?u}{ zyF8uibb3f`L!8se(m6B4gS9;kQr*_SIT@}5!Yj#xOxZRgnR1D<;V-yK%P5yN92UBJ zUb42(dAPHZH&GK*^F{{UQ0j#ZMhdP(l>qLtlheDe$9!6-O>?Ym@L~2pjWEpqoiO_w zbP!d-=U4UMJUvoG;BQch2)zDNMj>g`-9`c40P}79O+x_WRC2V}gmU?yiey}^xbznI z?{4vzI$szry=}OZ<1fFbW54uR5i|$Q%&T{VSD&F9s1TyT%%90dv~cOhYxv#Fxsb(j zE@aUWHs@j%ix;!FuXEna_|bMmCWR8#!mRN}wh5Jv_gJ0j@i9OENBw(~g+c#)Sf6!e zzD6JNe8oyiF}r)NbM$BH(SIteuj7Kg`hxUD!B#|AKivWs5pGHLSR?xTt8ZhsL>mv) zDRi9MY6u1%Kq+%L`1D)+{g^UC2d-0bOUygeE(_J2Ml)yV4p!ZxsM`^i3o0TLF~spc z_+7zIkHU2bhTt(#MDW-fxQ3NoK`%`(m`atmq}(Vhl%_P)v$Z?NZXZFb=Cbf|I5=U-~lXf6N3q*1rl@QdR| z*$)xdJivP*OTzu5WaK%_+9?|odUPyJ4?Io{oeNp^s{BOJED&$`ti=u&OkMria1FZ1JIbFGQjU@7JDLfUh2j= zhc8eg?4ITvfJe!E8WK1BJpe2!oCYzJe7f!;NzzvVOc*tKwkAkdf1Miy9)l`1Ex;p0Wv@MDEORjutEB zmegdL0Ar>ev%lkS8M9e>%nDH>V>ZV*X7sD+!Zd$CDS{dsAKeGj&@+&Mp_L9wmL8P& zZ1c6{WHg3`hT`)0d*mHDgw7#q+ST7%#y9iI^Ua`H7#0YE+bI76B!8_a98Lel7`=$U z7dk0UMW~e+#3D`W(8cn?V*k_z7ufbsOV<+pF+ADd6HRObZ9_Rkxl7A^h?@#RvP4Ql z$uWr)D1BlQKO~KE98~kgJSRk^XH_nZ;Ix29_biQ8*$*i%jj%d}^^lQ9YT9{?mP2Xt z1a50JVRP^|6Bc@)49a2a^}R*fw3%@=eW43?mgH?Kf8ludg#eX<17LPeT(8v&BeRe?N_u*V(% zq&=$0TG(EjRyf^24MI)o_%@6ZdKx01Q%>GODHuPX2Ow*BGzOsdG7JDP-Wa6_kVE%F z>2Cb#dOZx|y6Flit_ZtM3GXBKMbY@9hC05&8y|ku7t`IT<4R50;~LqG;WIH1ztPkb zvud@|tjaZJ6;0Hgztx>{@prr;`UxXRPRhH8B(ZXxk|gYugXX6+@Q0&|0ROZGe&i|u zAF`u0N{(-)pk!H+j`Ch*3H^NyhSIS(NqaIzYfj|mazsCWUqp|)P&v`57KDfc$_wzP zvSmwz;9;faI)pDuokWkAyg-g{XGbP|K@h!v!HtQ7f^}lpTy(%aBJ7gBi-?+}^+wcO zwvi4qmi-zwY_4cpe~Z6`*57Gb|1Hl5nX4M(%Cda)nt4fM*r1}EVRKz~5yR&C{jfkM zTC$WLvpDUB7a8;(XjQD z@oJ$i3jrJ%=d_9KT=#tp=dbReO}4rGLZEk@9B3^2Z7SqPSP?n7-m)Q;4(o$dr% zkzt?fFAzTKu+#9_D0|ekMv0~cXiUNlutBRD@mu&?GCM}gSieD|c8O?Pg;GW9$E`2V zR^x5#unr$DqkTWQ8l9+c55}z0NX`U3s<2y_? z?73;bVb3Y{KpFO=CI>|2P4!{TzoS-I^GgS7{({b+zL7F@r^&4}YyRq>_9IXVYtFd; z!Fr9F9mdP}O-C^CBjz`iUPB#G85&R;iWTK4ClL*(HcLL#J(SYXR7t`_3)gH-3(k-7 z9FdhNbJnYP>oar!6_QCaSG}Z(;l!Lq45!h(uTR0EsuLa@FxK{W%s3w(g_xGKnoND$ zRLqY*Ok2>vMg>k}h7L0eRb0npp-Q%@eTcf?Z^;y%MN3-pQNHnId zYk?VY7=qSuaYovsRp`KGdg|xB}f4t8OOFvP9pI z6VwSk`m3Q{riZ%Cx1c_3kbk0-L0<6_202u%QrXoQqS1Gt!&aK7BWPbrJuudf1t7?t zqlP_-wv7VDDrU#DaOdjlWK)n_d?NCw-lo)3@W2CJ^{z7GUW5u6_tpO&$9)J;<3>P! z5=tigTE{R4g!?X1q4$7*r|4yjFB5;A9{Xhc&1rH&QA$WAPe@)q09Q9Gzii0iE{SYy z7Q^vk?-^syY@p^>IWnozqFfsdRWYVn=);Q+HW?UnI4f_m*#`z&9G7IHhrnQ)hJl3J z-a988{|QO~!}hy@;m2kKL%%%}(8AA&h=<)f%y(jL6|BEQFmR8un2wysXH|$4?9`(k zfkEJ9L|&A&!Y`^Lvt=1k$yqf*95ByBqXf+N7&&?iRbuAsEk8UhsbjHFa-WYJ9gA9# zqx&6l^m(dLVoaQanyQ^p!^|}hrO@;6Pp0QLrz_C&h%Y^l+#fxQE>=d*qne&d%(;%4 zCje({FNv*~jZ%pC4T#tuFipFRI|Z^E`fUXohMmy2U{mpg4;{zjGNI#1A3D~&V(55U z(^1g*De5`&G8m;$^Ndh4Xh&7GmLa8Sw5*aYK@Yu_VZ^HeIxX1^bFaK>Iuvz@<@VZ= z@Z&jcNE|{B*{h3J5~%aD@tsA|8h>7Y9M%|kv**c9TxLSC3HbFXmUS0?MAp$}^psh} zVv%znM3k5t!##1iU&Wq7ZtFLS#HD(G{^uzQP6BRs9pBFzH?(Pr$V86Sfik#R z&tVlbrml}gLnigbOx6q35auQa<=&>%hw7^#@&1*0%7F+dld)s^?8gzQ2X`48bP0pim^J?>uc_ZF|Ta; zxo@5hT)X@{2&4MWKa20tPj{)+-@cch*GxzY&Ny(=0XL{@dSU>1<2WCWrz3-7*@Y;? ziOY^D$$iKM5EtSYZefIGRoR*q@P&(2movOOO$^2aPOLw6_O!QZ#oRhvXk>s%mx6tP zn6G{vUE*D4!&aVtPe#piZnI0PzpTuL&xHHN(eMSq@HdM1B756b-DN29CIF*2>w9Vz z;1TB~mAYXTv_3Tn^vE&MdDy~=@+9{>Y^0`_I4f2Vu2M|#xuS?;ZYzp@ zkH%&I!zcxYs5FZ|H3OBBclQN`paU#7$-8?p7_(f;E*himltg1t!@}k(lp<`#sgJwY znI{@tjYq#SfQ&bzKfxaT@>}`x=pVriDjWTYj?s5{DvZ3EjIKeQFw-2u;UV}LWdlDc zPkhI!SFhzG;lgKLdMW#nq=v%ykuo8jZe9~gU@OuPYK70fWOg_6_fEe=*HFouiD#H$ zn(Q-7-9ybVO({Q2EvX2N%(GKvn5YfrovTwKa+$QNBIEQ1O+%Fo(KJ0o!QnDQu_$GT z;GY10_dG;5!1fhGXfw_5%rf5%v7bL08ynlZeRCGcD{hZtn?;Ek%m#4R@HV;I_IYsd zr(EyefvG|&t&T6MY}LnH{S@|U8pFor_4b*0;?=maq|uA@9%+#t>+yOMR@wU~>gngf zb`5Wib0e32kB+Tn6T56Z-2M}9=TqqckM(DYi}G0i;*p-OnND2Q1?F3!r58{E1~fi= z?+V#XZ7R}7)s5!+@Iq@b>BvrUUdvpS}o5#EyK0 z&NV#}{8t@r{x;I@=}U z{K~Q!f^#dKGX!<$AYTD+eXGGm;SWQ_%H&L*-ahlB{@`Q_y6i2`^#Q$C0ZfXEHy9WEx*@WsnJ;% z?JiZkzALdAbi*1$T*mq?ycT!oQXX}05CaZAf-bIdYp|uuW&Mo!D~@NBcY2yOVWY*l z_*$S1_W-i!}hYynFa$A0f*d-ks>tU>?W+{ndV`C`@Pq@&8us*mF^@+;(C_S5(DSKG4o zlSfO;_tE~k%`($ss3h5GnO}h<4K$2%i&Mana3-$!UpD3^C|3Z)_nqi^!VsyG;X+|E^mBL22eVTJJq+{aH{NK;35smx<9&O;!Iq~djx!uub~;xQlL2+be_gWR5w&`yz(=Y0?M)S2q!4l z9t{R4$Jq#I=N;z+WzAL|Js~t+15wB*_hv+{Lnb3rku zHivozf3x$&wRi5f=+FBtc0mVr_2+0jhRxNVA)>Mv&4NnI!!YoH%H-|T{AWNh6nB;r zg~L!O(~{X5g;ecPUILT&bK^qJmz!vzx4=-$2t8Dk6MA3kE|LrIwb14MCM`eu1>_vZ zuVD|W7>`2PLXCt>ZY{T&`XUfZxs%F~2wN=g!2aZ7PzknP-AWuv_Y(V6*Fa-oknu)T%zkuIO7pQXqpRB@X1kNctBT)OAlYBN47@AHqagjdl zWx2jv*UV@rrjTF34R-As@9*8aBLSi{m6A|X(|^F}wK@el6Mw5D_#8pXgEDDKpZ;2` zyj+8noZ|uZjOp^@0n`>#rmg9m?zYOvuiC#c#^7qCoSg#qhprJyNQ|)^+T(eb&iC077(jfmDT*VD_>KQjlbt!663EMN;du$qZH$Blg1Gzu5qBh`paku zQn_jQlv@X@Na!t8g#>P`@7)TuG>A1?=B+6FKN|IFVdu6AU@Nen&3D3zdL`^8M=4?F z?V&@IN6ti->DTGeO21BzhJIa)-%7vUJ{xWQmOg8XT!Km`%eQOn<)TMuB|9lr4nm76)e9v;$`RMi$W@@#6_sQR$8y&}O69~H z5sJppe^B)(x*SzqVkifHbI7{{C3~6?uSuYyJxcz&8%iI~^RDx6f2L-?XT&inPH1=z z|5J?R4oUWV+KL8W=bxu8=o06*02{#kl>^BW@MmZsHV;0D>BqsGdXjtEjg8ADya9~5 zPH9rG$5euz|HXTs)}JQpp>y8hYbN}G@4~x-7g7qWh?vkba-}ff7Bs7E<>z8CdCRb~ zWdz2?VZwUJ@A7@#{3Fa+FlG;wuc@HydHo&7;A6#8@Si-AA9|qz=M?Lk%27*jz*?}K zS79HJyA#h`W z+q7mVe&<8sx^IEPD*qn~`7tcmK(iav550?e$ppEkDV~KI7Hs=bipaZh|3rW# zB&|_Rqxf!)E(8&!v8{6xCU)do}-t~udeeqq_l)@DU}n|+4ERmN^Mcu5??u3eI@i>yJ#zn zW}%kPjlgk(_;$15fqwoU#ghAX~wKeFzaZPmniMPlK!cJvEnl8sg* zi>2iddN>*j!i>3gj8GuhySVu~-o=H~4)rm9S%t!(Gy#8dJaKFVLdkXj<1~rrHabd% z!FU^FICx4)LFxpF$9I{a?$VgX;cwwgEcgc^6X^tM8bJfN--AZrt!rpQdE+!)6Pk|; z>W*&rs3;;b%7_NG%%}u$o2P58T(i@!GQ>f3bkRhd>_bG+98>g*Db0b7HTxz!sAtX%2k2PgHbHrhbfokDGF&^S5*mJWLF3cUJ%@S*TG($C~?wONVq?l80o@6I#4 zJ73>l@op~K9lX0hzY_Cq!heK!yQ37|UF1W$Yp7?^RsF#5?vnfA-H4_7J;1ww;nE)> z;Ws&z!!T@_eqT`z9UuW4E3<6*1~CTtT&4(6ZTxt)0H3VFGVt^9ih@aW7Tp;&IPp-? ztxOU=PA`5WZ8+=DLDR0N6*kW?Y(5uN!sa+aQ|l6&&D|f%U2v!h?$VfkjlTt#t2Hi1 zp@!K!7o}qJbrslrz5YgK^Mp_C8J-b&KJ-Nt_wI`2i*uDjlwSNyvw40cY`#Ii7_)gg zI=&5BZuFs-V6asWgTYOPYMoFeRKv~$<){|6Mcbw|mT*)jbcTk*H2>~P8jYP*W1 zRE%ogL+H5A=c=8RsAGS8F6^`SQ1WSwBT(Y7^vyIEKiD!mfg@a)j}is|4a&1Rxxtyw zF$ML!!lnSF;-UI-b3R0{ zPpec!z-g6CgvV&B?p#y}DO~tY8Ts>Os}m z0Pl@y0hoHhsl<@xS1>GyqDI&H&h8?!p?pk@9S5V5RF07%tSEJAiP-n*W#d{8$Et~f zv~|wq7rc-n7gZ+Z$?Hz2iWlNcs4Pb{s?yV_$8dlsj5lKS_lA3C+>XVjX_=^NnCQF( z`ttT`6)s<=w_m$vzrO@O!@Whf_)bknF#QXr(2MxN+h`_?#E|+O`;vZ-A1V}j3%R?+ z(eNYQ_*^1Sgpya?Sfk+Tsrk#~je6BhTU1FvA!Q?3jbM-BJgqV9H~%A=hMaLl7=7SIJ(1H1U0j}ui8P<0J~86!{YbDeu~94{&O+@|fe3XD z!S#0ubyC}L;4-D>hoYAUVa~{5jxR;xq<0v|_yS_ju2gB@R2phJ9)$mCTc<|h#9R1; zvBULqs?~+b0T(A7`kaqr%;dmI0hTU>MKTc8zmeb z{{6tRWg(Xbs%0U+!B~%?X45>Farr_&O@iTDaka#{MwfwvJcl`~GRE|T&cyL3KuS$I z?}>zS-)oYwImVKE4QnLc+u@fKkS1w1<5h1H|D2%j!|~7K=+PW+Gg0?w{WQ2W#L?jm zf&@{BOVfzMz6K&(aJGbQO221F@zwzEd3?ddGbt-kpBT*uGSWlu1OO_=MOux*rpP;S zgnWv?CWbno#Z^h1+%;8y04GjNoGghGUkX|tr8lNPXhHLIL-}~U!SiEv+_1J1HJ10* zyjUGObi>6wKabXIKn!bwr#Nmt}WpP;cHk<2DMnibCovMWQGL4q4 z_)~?%XFAd1^7jr|NpD6(V*7}~FLjUE(j%Taxg)Jst~urb7_Ho|I7M&Ym|%O8f?Z?i z94a{jzA4}&A}4dBM9Jw>REfyRDvu^Qf;LuT**-{$n{JRaPa~=2N=DK+)UQPEuQg6O zE`TlQTIhJUqcbFu?wKi(^gp2#;4Cq~nT0C$CYIVw%kCLCypwMyqS+N?kxbYvhlpft z6u-i}6ZFl=ok31KQ3)wS^VTW0Ttp}CC%Oj zz+9KP_W`Y>xYhd3J_2WT1*oktFJMD$TWJiS_A&%hynmk!>-F@@X8g_h+ikL-uKY(~ z@yJ_1ST{O_zZC}ad=Zv!?hAyi%ohDscb);$MgyiUs1h)3ssN?}v@w`A`+%w1d;_K} zK42P*dInR015A7}&vt-{h0zXO-|bOED5=fYxHno~L@9vUWdJn^RSc-vcGI4F22}G! z9&BaK(^y~adcZbn_G%c_+GmIY7;QNr#}>fy;eQZUM{sds^oVt3$2&^;!G0sI4#?#! zt`7Vd)?5emvshd$Uo7J4kU`fcOGI1^NBMZuua?FpRjKlHl?D(^X-kdhGCP6~Tj~^D zx0ldGT%;%Qj%Woo_5!tA3VViUa*z24qX6&h5`&e^%QS|Td(_V1--50#M0p|#vB9C* zz=l&tPpqH%nCcZut+$D&z-v6*7J+YuJ4=81kp@YQ)kjtjxctK|{;X92&cRJz#-^ zVg(kjh^I@SG$&!zFs}z#tvKp{73`u=Xl^B)u58rX)K%O`o@Sww*hSxMq*Z>A)&~*a zn|q32qBd(W4XjM3t8mq^x}>_=lrHwCSw%@yYaKosD@vN8Y~^N-8T>7#++;BUHVRXA z(M>GWM!SL)e#_oxk{~c_y(9?SLiKzcARcjfy&M3_5Gq;kM?(W+u+MqZJQ?5H+Az9f zprK-eUC=670?AZb%$C^2`N}Serq_dFti8;g07cIXmOF0Wy@khum)Uc(4^1dG8Do9=4tyGQCbfdIq< zMxrMh{FJ&CwDf<~`#GhYXJ@+IOIQR%hfyn<8HrNga!US7u=#%?y2a*i40I2{Ak}*ut;EuIktuSDSk#&FeBBm`g`-b-dr9%XAYz6cdcy%^m5Cs-nqGytR1LZG(T9YXG6vHoc zC)BetSkg3uK*(k-#>pM@YcwU{9wclLN1vlY*2<(Cwh)KmkzLTt=s88$;v?5o^Sxk* zuDiv;%RtGw5@%2f#HabNz|(t#1%884+OY?gVu1>?wLh?<5+&`!I7iMa!Xd-!W8~0M zeC|wx?~Z7$+%27@yTs2nFArh6a8EfW6qhSuJLm4Wq_+Ewu$?QI{LpP~sg1x)Cp2AI z(khPV0qE@a#g#!{(WW8HKbd9$p5e>b_rVn1wCW&lb0I8=6J>F7lPWoC3SpNLyam9H?E= z-iKlPsqozrUx)=B5y`tuLo95$At?m+a_SCHC5FSuP;AEG;T4-?^MBXMvX1oTQG=}< zAMDLVJzIn;?DkcHy`XR6RgTRqG$`S_^%|#Y>m1g?no9T<)`alAir-53Ubv1N)>^C0 zQvo7hzm)}X&T$r#z9-R(lwD(h8vYFfwPc2WSrCM6NML!b>GC|flpW3tQ<6HOM!|Fa zrn}n$x6w&#fjrQNZ2?cdd0UN7?`!f18|(0y2S^9@yUZd z%7JABULEAo{~?Ir#R4zrVl4%_?72FzYa4p#EY{M9syd6c_^ikJ*u!?!_qT1k>Y%~Kuyc2l zbBFNe>!FCt^f>k~T~QOgTTFZ4I?mb88y0K`!Xkl zyg#a~PnyBBld?ryuf(ko**!!D@q;6~*~Lh{2CUAbtQWrW3?IYBGl`aW(HW{$A}Brs z!$;-*e~1bed}ocYJZF%nOw|%Ji?A%Rg(b&%qv#i~J^2i;^P9-p#wRchM};Wj3r=)S zK%WvHT!xjJPXV|~MM_e`OTr}=D_E#?U6;!G(`V=>iWoa=0hcDFWgF^QSRUba_(``= zD!*t%OjQw*11OpP3kQ|TzAvqSmm5?l19)Lu|g;zY*!wSMT?${9iUgN9QRr4;D ziqJaW84(JT3O(2a6%l&P0JICblm{rR8)pXX4S5E`^ah6I!MkM8-qf!mmgY_LRF>x4 z??DMznzx+loNl64EX~{6(o|c{{4~+|=~bS%PUl$i9f7Z$JlLn6GB#B>v38`7Rf(?2 z*y-a{>kW;X<^eG!U*(ytLd zySHOOZ*LllcD5(`;Vdb(C&T)0)_#-1uKOmit9-`+oAo3G2>mK**~uSB+YxV$qfGoQ zN2S8K3FZ@Gawl;X_AhTqU}vc6r{m4x!}Js2RC$Ntv5(*pVX3;3HGC>re@g-?)uMj7 zaT`>Jv<V52k3b|t+ z1ahb2HzRjaQKa>;N@LcLrS4WFww&veO7^CPD zOX=-+SNOVpv1&AQtlWj6I+ogDKl(}+50A46grE>~J1-s{k1=_n?8vwY(nTrt;r@~T zlTweHsGsL!Y);hV6{u>zh+Yqfv?@Y%l7Z@U?13-^U3M`rNq`wo1rV)Oi2|`>y~0=e zX3G9cq*XmFKLAGQ7AgpH7!xW$jf5q! z@JpuEfY@uOWyB&4Rw4HHKq;RIJ`^QqgiqH9<^Av9rktucfe(+FVbD3#CVo3?V_0__yxnSP=nW7s6 zbcR-nTr8zgyFVvXxD>|*5A!URvHnNc2AWX3& zpH)*Vyz2Vx`fzv_s^I4FED9}+67;Rr=%XU8K(}=odEwEK zDucW=N)^vUsp6UX?;Mmq32i^%RwryU-&UD2hOEQdJ%yNMv5YB$7^hl>8N@y6YX=dGXeY{=epwf^lRX!Is>zd`<50`rbm{OUCI- zrrVdCHF|w=eWll3o3sbj3_onWJ{@P&Lz_=egkE3F=hgGl({`KLB2BIbN>^Btbxtet zA~PmX^c zB|xtj0E^BZ_YjmZgywfzXi^a>ctPLyMl^PUCT8#aeUxH7UNd-wF3v

*DJQfpHYt z0J>P^+}}_{eUql3=6C3EOJh`NW!G)a+)tuOH}$%`!`_q2CYW2IF_V7+z2WY z2PEgbf*;zMFFPob=c!+&WsNICUw_*ECsxL{(OQ0o-~m+n4AffKz%9xgXX9|-mb?2g zgQOd>Q#fKi2tAb_^ITJWFZ`InwCaUOJ7PWrwIWN0AlDK&t4%Jrfu5f#C{>yaHB7=+ zh(j|}D0G({M%JRE5}m1Aw3E`Y84!ih98TSzVt*p_uTfZ%l!w|@s2!ne)e#HSusN`$ zGO0#x(P<6sP$gpV^DTBJl}?fwr3u49pi$)g8LL^|lBPPH!&RJK8uqA|fY=U7wesFG zZ&T~XKqFv!EJ&#wlyNqNc_lP=)ecJ1c-_LrAAXlN{wC;VG5#hPD8@dHp<&~1qPfI2 z{wC=wXyFjU~$HPzgM zCmjHgS`lMzyX};h&u_c+xg1}X^@E`=P?B>wzS1pblH@BqKxv>xEe&+0m4i-odLL~K zfxqbjjI{Uo2-=0Hlq9?vTbyaAziI_;Ro>|=Gs4qR#R_r}N)a}5?sF(7LIjlG{8&OE zb7d&wGtDQ%dQ%4|>5Z!}pmZKrtC(@t-312?dDh5+Y%Me*=9znHyDH&1V^_^L;$j%8 zJayA1N2|D4tj?4gtNzBu*;P11H()a5pd0T!cn4)o|6Q~4bVf?g)_R~9`V2I^)CMmD ziZ4=w7ag%8t86{+(k!zcc$x0C*g3>>0kt9*mT0*Ux>Ppe$5z zgf|DJWE^Z3#7M?LU>fEHJU=a5#xo5%T!wdI{p*)Lk2au|K_iO!SeWWP}<9oBmhn$lmeWC1~{Lgih(o4ZaOSNA}+9j!p-ml z+R`mW4;wf6k0{*aKLXtB!*7KfPuocAbJv2*VDH!iI9v*woMfV=@(|Wh4Tn4E5gK!H zwZHG4chDBcq({PW8*qN!_4|X=td*S>fPTmIo!&)At30s25i6$Jw+2#_gI@J2%h5cc zAH$Y$)Ao^8f0!*Nwb?T4OpH~{bxL}ufWaN~_{jl-4_@VwPv_7p!UPISg^OqjY8gwZ zzZEQ<)!0#oh=doOlWBN9&*IcMs{LA|O0w*XQj#o-j5U&pDzQe+8(i6`DMe`G#O@1% z8dfQR)Z%vrT*Vq(osf<4JZ(ljTfwCoVh7L1U@P#6zX#jFFuAA=6WYoZ=ypjXt^|Mc z`tpQ7h_w1AN&($>26W3%#h}}0H(dpv)`+#@0vjsOWq+eVm-I&m==L>Ipxf67pew|0 z1-iB{Vc(0KIBx?^Ca}GxD)5@Npdm5l>f~VF20+L0Q4gZS@JCw=)qI_?*Jp_z+XgDm zkEOt>2hIoN9yM>;*u$A_{0L*PRDpi$g3DW~Nrr_7>`8`OTI@cm@-+hRl4=uzDtZr^ z+x89F>G4CJ-_}z|&&5mK))zjxeI*h-E;mEtQT|oJze<{wZMt&DzJ*vce%|v3Im7p5 z04d%te=5C$9~@k2`(~uxRtm?2|Cv8H_h&&?paeJz$H?k54sd=mhL)i(Tfn`k^kX(r zv&P0CIvVqq2%|o#7CSGgQ~&yIbw=oip^wZi;T&;(3bsr6ZXp$*`gy>l|5lay6h}!N zfHE}!KL9)O@qVa!tCV$Ukli*1QTu`H)3!SjXjOl7uzrlaKNKp;EhHGCyU0RY zLEm6;1^l8<3N?n(@xvBeg-sNO3Y!2!SMgh6DEADOmQeN1fJ3Z8lD#}Y<6$UuM0Qh8382ml_H%4NvZnE<$Ptd!jOR@Foba*uHHJ9E}}yn75^W4NTG>p zf|@m3C>-&U6NL)~l!Ao;)JQ`meli;Uz0(dc8oJ=(c)y~rXfS>-8oK?(paExU@Hhz? zsM~zRyZy$Dp#pSZ2#j_>Ae5T^6($sF$2cJnIo1gQe8kwT+MZpG?vnL0t~?r|=^7e& zx^cWtAYS^zPVb}*SM{#5({UV0FR=Q2WD&C9~k9S8Ohb*A>|KO2bkC{N;UD-LZ8G2;X z(IeDzuz#TU5PTk-n#}(oe^&675u1+qmDNLNl%n?GY8&=Oc>{Uf5+(eTjpRF)_sgx6 z@ldQ4TLX*Mepcm4zp2f=RT8Rtk6qePr2$TZvAicP(J*vwgK6PyC`0-#sepze7x?JOn+r>$7p-IMEz~-?PHl#if(LgH-DdFl~|L|7C&lxKv8Hd z>;`g2L|v8|vpBy+n`jJohy-a>hcw+G8?=BnjHSb9uF8kVoyL!?JbyEPD|NmTgHtmO zbrHBOP{53)q^<}8;WNH=0yS)*6R4DhJ|=C*$f}ZTx`=9)Rg1UkY4G;ljI3I+Ri|n0 z@r#A)_zfC3Nn_boou=8gJBSBmmxGc`^iq^;qPP5)0ceg7fCrDfxn$uUex&yS|dlHb9%pe>r~ zSa+x^$_AkoaNEL@r{A)giV@+jG2L4=ilSTS-wj547eM)iguwyc4ZdmfWK=4)x{`zU^)WRkJU%!j=5>stk^brA8%dtKHDe*=&eBo zxFGi4pdLllKeD}o0s(cCMVo3s#PG_~0nN*l_I7)O4A!%+20%=w;s)mE=8|Um=;i`c zE@iOqgjmHadOXd9Qs$6+G0F}A`EDo3BlqZ=o9M!xtvWC@@e?DB_o}yJ-3+|1Lp9@l zpOM3oDA(Xqgqf8z-fvL<9;!I`zEo&##JlwZ>Q|{7z?wT7RS5?D{*+l90`!mW8EI`+=r36lp)-|o zOG0q2?T%!a^sdXhgS>f@cyGm2x`Ucl?m?%5yuH4PF`3~fG>ki>fCbAw880z#^YCaOn#Htm_o!q;rZZC{eprW!G3i(%IXc-F6+uvnO$MK^rps;Blyc>(z*YHCvBrS%Ry~Zwihc6(3sZ(DO zwk3kQ$RLR8%(G>Q9J9_+KDzwOpS=aPAdRhfQ9lvuVR1rqn|?|;~5iEWPM(S6l!W&UWzjzjZ!NFs(r zTGe=%Yv2dFnk6VXY|)3d&tM(&&QQ^zebwK34Cx4JC9>6To0xf_{pB$d*>VqKQxoHu zwUw994A8H@I|6h^6UVq#p&SBQzLF|4#lulDZ8K4-eRsN?0n1|&gGS)TEk)H4XAM=S zg4At#k-#C`#T8p&X)wAB z-$p5XtJ;oRm0K!|ULz<0n2V*Hi7sIDMKF1FoVRy%EgwDX}=wxi^8rZTqagrq z&B4tLrx?n)u|i;5g^7=;x|ugIDa8%cey?Aee)ep~SGt?bc6_B?S{(^#1-YDRsO~GV zP(y3RMOteWKCPZ%n(H&hM_T_1+c?1Advscyw<@gve^A{C930rQ$=}@&ErvHW+n*QKa1o4@B#+-S$ zlZ$SmOKj-Dqj6>^5WMGBs*!>Zh*@G2dpnr9*J5$NJ7gewS?MS(H3K;pT|#3kj1L~a z%namm``-S_hx8dRvhWs(vHdrPI0jOtSXP*4v_qFrPw_3mfViNX>;FFL zoKpeZx%R`c;>r0CxT42#J$p=8kpLV-Q^{o)CYWBrZyxwmloDB7^Z!_T6R@a`tbN>W zP>`nCx*HTkam#All9)sjwP(Ib=9?^PCNuL*CW)HaGKn!}<~Ni1vWbcNigCe}gT{RY zHELXOM@0caMMVMQzJmJ-|M%3Xy4?+ACYkU5_&nC_Q*|%*R=su3sZ-~iG6R1UBpG-t z32-w{?Lm1|ZK1X>l<_j6j{$B)v6lz*JsPP{{^LtJEHOMOl)gA z#qJy+ZL7)IsBfWmQkQ*r26dW?yA;2Kvp=37{PIIkW25qi2Em=GSx^V%JH2Ztm2asJ z#4kamd#YOIsuJblf%L8l_SqrA5{oUI1RV48xu zm>;hu6yr8F+%#GS!%fI)9MRLk9!h1u=djAxKwHVH(F=HSwI=8nio?KY+;}JS?3DQ- zHmCEV=|3?2i-NYab>TQWV8rqmbrA3+KL|!TFYD&ADu`ZTRt4qidzh_YC#P%gi+_ zZ6_*}X|fy_+Ed53c3__Nr`Q_n1t6f(pe!9t!fRbRDApOPG9Q=os!we?sFffxA78+2 zjrE!V;W!!M|B#GqW|-wz8m$2id0FrrF4XGpi#$Ej-nGC(c*goV0n|JOEDh83Q6;0O}5i%GXqsrgm1CWIC4pC2vv(^pHp?R`&VZ~u+ zs;$i@I3IVi0~ksw~c!vg*or^z1BS06?GD5#wSBR8&IuAOJ#vPP0 z8l$8>G}v3Ki22?H-D~#r18Li__M=-H(fs7~651J#ABr z?GIpuW2qfhL~i;7zoVkQLaeUprDaaEPJx+y58H0{qLR1Ikfaoi+mZv{CabM+y3@kP zOV7w^>p9f>R$I;qe!VuKX0PR-brKY>izu%v#S6Yexb~3rQtVdrQVUG(DS=;ze&{6IFt`SqgP;&_8#^ z*d~ArL_j}b!PFfkbA=C3{uncX4^^+^XjCl-90P@_p=G+aj-!?8twjO7MHxU5zx?6= zuuTc*u}RWn&tXosK`(JW;=U-w6rK^-9qfFNS+gUWVX{d_EYltFH7FAlq`nD&R3BJJ zc;bD6QYIcwX=BKJ-^BY~-Ogi8y#L*YE~<-(w>pnTLaS*=DfsLp=eK6G!84Ev6yIcK zTUtN|Of!&K<9EXvfsAvlp(z{HfCAGo>jFFG8M=om?&|f`yGL9zHU#jcmEc;!m$Cx7 zCw9M{ahn218#8XRei7Nu+^lYsje)umhG}tz`DQlCg#>BBPM;}wTn$meW~hEnw(-j@ z0IwDvI|%Ep!=gd|?+uFb&)Nn=vGF2d5jd0DdvdD1CzI~O<{f{P_M$cKJw+CYiE;-f z)<0qp8@m&PIBY(Zp{%y~WIF^7tyIdLd6e`KxFRhDiCuIypyb`B_`@QlbMk1wb5c3*PDMSqw`C1phwd^HFi; z;?8*qdVJq zoi%rM^Vhe+kMb z_K~C6aQ;-?qbYZr*9g2I&My z0jV8>y{kbk^dqC?*7dXm&u`%rv$@k-v5|dEOF&Dom*>(wTqsZV^M*G^j^g;b8z*CI zk@k`MDC86-AC6gShw>$0@M0eIXn@f27(};uhfeTmPstN#KH9MMbP1(|UtHGR_v~pP zT}`L*Jjpd|zrBn82r4Hktq|00#LtdOPr9P{QS6x*+aXA(a+E4V>5UrjxM@wgx2VTi z{wi$4{9BuBpIVRlxTW8=^Lg-W4?BhW23$;3x1~kG9lrq|gLZy;>bO>;*Tv z3c-c_uhDRvRKjIF2ywhAJSM-I#$DT{aGPs*V>Lli@19?3FxYE)q6HZY`fUDAdCpb{dEmpbnX450M(7T0GX;UMh4=A}+ zL_ouY$Xh&TK6wy>W~DE|ofl7VlxJAf}V$2U-N%8LOg6YN#{a8L_x#Vx~6 zwkpr0GT_!txA6NJwVV7kp70e5hnMb(e4I_*`~15Kzj=@TgL`a!z{w3LIi2%7%EXn2 zBG8I$L0wP|27Lj22zoO*hu=>8UZ~qe0{X4dt}{wj#ot89syXT38&E3MyaX328aqAI zAs^+A-a-sKjydQg8f;;r5lxEa=$_SD&qK~Z+hZvuueA{-|S*(cAT;b@?T zaHX`s5WrSri}1QaUT4731q4~OuFsc^pzsZPrl@Gt z4^aFcNeL)b?O?O<~Gej#}ux3LzKpn{7B-@OM-c%vP%hyTdO< zU@|+zrC@RZrEo(8bYP_0&_ftz=95pMlp5reM~$2Mf}-5Tek3IN1)_nT10VNk)qn$i z2+GsJTk69j1qUS{mi~Jtb3=;4%oT2x0~4>>5uA=YLZ~Y${s3s~@t@;uFy+co@q~dw zYkCdH(D8M-hLJGmtw)1U(-8cZP__s^VL61AUZq@+SdWi#3jX#9t8GBvfY7QXSZ#sf zda^|Z|C>5ZLju`ty$Ba{lpgdV%8&4-`!!ch0}ExQ+5{!f>@g_W`=-b|(&v41$j3+_ z5f5oNDz23l1;n@AG25T7emlE5U!8AJ7_pOQ)AP7ZCzm`d;Kzz{{PCR-J^jKNt>nej3f$_4=fq2d}x&pZE>O z6L7#ss2smt_rz}4dE@ch zLp+Thpy8l~VZ<)f9I=bm++%~#MLow(;|88%H&DtPyR65ubsVNPE0P^>q1f*4m|}8V zWrZoWn-vDOn}=(~c0Xz0vi0*@A&A0QE;>hIh50P7-UCFXpz!RHQ%jaGK+9NIeZs(;$GS&=!w=)U1 zKNgSKr`HT7iThiiCD^wvqEB$aJ{Ua`Fh%UeOK31Ic#V*OlGg~g@@0)cDSg5r$rB*6 zUjX^GkXzCS5Ja84qt(f~8qJF1u1B?s|38ci=D0Wu3xXLOJke!)61=uAN-+s0)27E= zV3(QYHd{82EiCJ#VCsh+R<7a;O3;aAiYSK8?(W}N=x zLEcDZM;*6M`*$2cBVlvn<^BErJK`P`J_OGd_)-}Ies564R5B4g$g1GROpt;(^#l&} zRV{ZvpNu?UDml1@+TtdAWL10Q*xK>Q5 zbt{+c)2Nm3`oF!QDI5rLIC5tOwd=|U-Osnh7 zz94Yz0!qiIRX7lA{dOyKWR|)K1AxlV$g1V_SRJ$7iojb8SV5~meK?APtA>2r5HC^2 zFELwgNi4^?@6+zHKVGxoPB#9)WOpaqm2g~)zfUb%ga1bFTpZ#ZafSbyx^<48e$)rG z;cDN>w@w$g;kmj=;yeq9Ht#o6gZvis?C8D`4`>;C=39S1NqNA0^EV>e;BTmnEAux* zb6z0tFB?~-VR&7&aaGJ$FzURH+k8g_&t4|W^o4TMV`|o9xzIGr<(oB&talY-4eUq@ z*ha7i&q}ak)9V~A*i4w))} zjUD<{3=IOI0id3Sl9w{;QSwrzO8;*B1b+q4+X)v6y>H>dpf{_oLT^@G7OA*a=>7YX zF575z^!V)zMqe34bbzF<#*;S)9#RnI0#nRr0;oE00X zC6soPG$p1ZrFen|*fft3#VIL%|oDbTSY^9&-&Ln45nNGCN!B zHV~Q(f^2r@sJ{CpJ^m~-LjYtL%E2h3o^z>q&pd^t1nP<3kKi5h{jl}GBm2x)K_A3* zb)!ast`25TIXpml$`zV+mZ#i)-OQnk$opj)G8jMTtikvdE({p+LKGPDLIB26Tq`in z@8YukQ$;!H+>+D^T=bRblk0=M8lKG84jLR1YQw9Y&%wJH>p+)0r`4169ok1Th-X!} z7kyl7qRGSh=}nH9ZqXKJKLaFQ;)owyV`(HF7a9!juwrToa8}Ea#<=Z3chN>Ph@+xG zz#uo21@K~2zZrSV{5g1fhDW_hDL-*(PtOuRG}ov5p#Q6Ml#J;b=_sH5sfFoM85wa0 z-^vV9xr5hWm1X9As->gM#iJ7Jiw@HTT&NlGUCkMB_P;O{F;gp1)<{v=`e!m-PO6#U zqGbGLSF=+!W`=`qp)Op_kJHxtXbe6fEcT55{CELmo*!q;{Fns-`xPERxd_j{KqD|O zK6YF*Uk2?V65N$T6}%|fx^&rZX0UZBA9QB55g+cZ8I5yYH)wRje1*4qNX`x2B;lsj zqYH=cUqqC>rOo_%)&KaZ+V z7FLHsed6`5^#_f?Ndj3)aJvd2sQa?kLGRbZO!O-Pi%JcHdwbkA2mKXP&a(ms_y>#v z8cKUX6}FjNVAy6AXtDt^pg?bcAe^QAe>wc-XpIv^2DgF$70tVhWJ z8Ki6bcZa%(!LLBc;qpTiT}1H%)T;+~S9f|3rGzdIE1-&@urktmka)S9V^xhn6?C)M zdgsEF<6`)$8W-(wVXbz{9f}*4JHQQ-SubNFV~<|~B+)g44)=oI(gKgaZGKdNjxOh@FT*v9} z@bPCy zy6Hk@Bd=>Vf|3^_!%zw~zBbr60up26oK-a&uhAbqR^fG;@?zqOOChB7?|=~Fx)@AV z6I^gz90;OvT}=Dj@Q^M;T(;Nf{Zz1t#5v|wAgb6y(b~x8+}%|E1}_dQnuw6HoCFF|9($&0v@%vfO;Ht!&-lTna37Ri$M-;3bW{v8c#F^(hx6pJ0@qju{jgf zizgtW`%todF{41MflEN>0t4eEl+U4T)msdW(@-*#->ZLjej7{T2cTk`zveSMu9BYg z=G9S-y{iPY9$JK3;_dTiQ8q4~6Hd4~4M>f1REBl1-{W-{oa7$+y~geu!7fFui-pCt z{U1a$tu63#I$$%-It#EJF=Hw8k4D<9x7b>1(1fjRFtCL(_#05gQZ5WF1HU_}4V5fR zjV&B&5&S2YZ5&X$Sx`IiXk;*b+|Om}?c8GE0)=l2MFWs69a}Yxm(<zoR+ao4BwzTrxTcU6dRF4wu56#T@RlzpxnG2kp*m znV1;5odsh4N!(>#6-K=p-jCGwU1o(Uwa{HZcNXxu-TDF4A5E%fW6sg9%rVByirlmt zt-`EG<5L@CExE^Z?O0H%2crm|Xj zp%4DBGAQNygRDOFM@6*#@+tZX7tg`(HV3eg>*6 zU=N#aO8XdlP~-r{coEVYB`;);3c|?wAvy@Zakdk{qot{%#0)TS*9$FJ+3Jsy*R`AU z?^2X)Y*@7X72gQ@%P6^BACyYl8ifm`Z7suvg}Ia{g}Ia{U@jfk3UmAZ#!_`tsV~Y| z?c7nf{|6|!PXq?!14yS0kfxzQM8uiHIyN6wXG~QNs={J2@yyY?o5H>*M~37$b0%g1M6gw3#NLcsvd>vO{e0l z>WgMb)}cC)k$XuYH#ROC8b5n+Ww`>aoU%sgiiNbSQ7#99I0I}inBGVAp8@4^e<-&G zD{k@;ESyQB$2U;L*W_pwIiejF$7ZeqBcnBA4u3Y+0 z7+$~`uLFRY%*IOI4#yI^J=8ds@HYbCdouvOOVCK*d&|IAYk<7)z8wJHSAbQ4?;X=u z3}0rL_jJP-J`t_=3@8kckZ|MsqEHks z1e8%GnkoD$na>V;O$M9QLN!4jlsq__`a<|W8oaR{60zjt5{X#wf1+&^?M2xlJWKE7 z1$nn#rAm<4R??-v*h&T$2G~j}K^E>aq)=(79(pX9jU@#;Tq=!2ON`iFbxUZ%-7H0MA@IBT{oq2E$~Om!xS+J9f^lGM9EgTbd-EH z+u{J2P$YoC&EioGf;3AO05>Y(SwzwVn}k>XrxT>EKFdE z$NrQuBu(2$6Y+$`+5s+~Ckua}+?C%Go$*))Y%^Jj6vPIAd8*-0)B&KlI(<9tlL>hYzi=<(RY!~7DG^O_CJZ<}tC zu-&{V7I)Q#CT$XWHag4Sj}cnVetH6QUmk!>>;{P^?!dI(#X(#BQ60tuG6EMYbbC*R z-;T5Jm^B2u%n)oq4KJO_QN9lh=Lm0YO#PWNtFhQ)z9j=B2Sm;~lxi3b;esu4xrKVu zqr+6Q*O!Nz)TYNEkltkj8%l-#f*Rvc=o<&>G0kNgZ(sBk_3Rvl?dmH0tk3qg8Jj|7 z$K$c-J|pwIARLJugR?^*6$%O?2Seg*V2g zf!;E9?QH*%myNN*rbEx8Nq8);jeKFj(&UJ4l2mN{{XlTY4q7q9Dj&KOZ?&>{SDp#> z?zkmRo$Qj-FP*IeeiR_(n11;#(|B%&qvzDb=OeJxyyrEAn)W8qSc&xq#P>GXduk=` zt5xFR2~Vk~oUraL<*QPd4edJbU8!|9UL(m44f@0!zPtMjz}SwHGR7{&VY&P3v`>i+9S}^>+A`}1~qrtkW~`j z(Xq~E9)Rn`i?7z}V9(%dsE*FL?9~+yh{L6+w5~#aHt+Qn;o7@8c^7q^=d!&TadDO} zJ<}Bpqr|JGYr$jIWnwG%o>@*aRP%9T%h(dXHIqtW2B2IsP)(W-s7CJAx2im6z*Z+v zJJf}x=tg1MK34ojfZ(ulklDT0t||}K4pBGt3y90_O{0MHdOQqM&9=a0dk@QwTj*Y# zDARz(^x|w9(?M>iR?xT2)a-}g>|olDir7acZk99S9)#XHX0vtrFn(2SGUs>ky5#aE z@+^cF3;p$Fl+SR!wY&O#(?M_qxX7i>cxzHpYQpdy;dD0~Y?LmdNmvN0tM>}EqjK~j z_$lFi?-wdZDYT5O4@7* zEPp`T7uaNj-=m90fsg>a&PUl;8Ss&_Wi#VY`r{Pnv8}gkmJ`hQH0HIw{?O^#7H;KBVl5>%9dcUA8=jArCOhET6z^=zR|l4Q!f$T&sRB9mA8upyx2BXvgXCmW_z zOF9RFxRQ?CPrczc z*GbL%V6=;ZRzSA^Vch;Ylr}CBahy{?X@FbDQ`AAm>@NIf+wcVad;M|fQIQk(YXdqf z`Q~A-ea!RHPj92y%N%pgLS5wc9vE$O*fN_ zB+%!1XqY)r32sum{`OTq8CZnX5(cD*H(Jl|%86xQL&&a=9n;Q+cn2)SnbAm!l?I9& zm;B9FZX*wol3k&w5|vG&@0`T>^b2E6C1KE6g-J{|pQVk@P}p(B`x0>FqMqL}@3=Op zuJXr|-3oE>nxP*+OVA`L(%dGJYo`3^#@>G^fylN7Bcua+w7LmAel0gU#dWHP0b2ws zXcjNg-ohPWG3@=pa^~u2QH^G41l#Z3q_5CIS=r`j;Er1haR3m`6%fW!#xD?g9I@n% z$%$h3F1kbY)`^8;o`$M(zU~(mR`1d0sFtP50*%s(>!`<|`k1~2sA7OEWUR(f;(8-H z7U8XwlJq`Ee}j@#hEl;|X$@Fp_|StM$j~EKx*Z$LN0Gay z+rcZ=^B}jPzi!1`Re@L=bZ0FAg@fkHP_mUFOLO{Pe<>=8aVMDEhJ%Bdkp0J9GQky`J9vIN<> z`}=@VpFTwsISCOblc5WY82pdm(T3c+!JfouvB$8iE}(^ltQpYU+aD97JAR2}DOdQ2 zn?{55ON?S3q}2b!LIT|f;b$P^YYfqQfQCr2efxD#M1g#Bl_2wy z_7#lzOORU!jO^)iz-9Ym#6i>Fz{Np-1UZYW?u5s^M$sX^)`$F2bY(A41cuWDY=bTF zy-~8oJsG94SkCwX{N(hBYW#$H<>Q+fF~`0aF$pE+odOX9riQHW)!9mTskDv)luExB zN{%w?+k4RafDt>79sgbcIlhzT-nMZ3_kyQ9@nd;P8`_K8*dkhjvW0Wbd23~TQbWjb zO8*gAy6ge(iJ&BViz;M`Srrd{|J}MINN&x5S<%&S& zC}$A@3V@^pl)`_m$>a?24u^j{)R*6(M%lBHapBvwn;M1Wx-~fu17)!j#`?RWipp_AH)(d$>Q0-NbrYj}nEl6_=2;8Xv(~Zd{ihNSc$oDKpH76E@0jPme1vtM)u*IdPP##UdFEPLeYvL9 zmoaGR6SZY)MbzGtwl9gEG@i}mYN?*WS89nqlCRXNeJEcIg%7z|ci*?(T=XGC_guGQ z-JMjdxpSqOQnB<22oB3;?8l?4EI9B2s7mqZc&b2iUaut|2oT<*j$*y0#P$G+{!WP| zP!f_-XS-GE6B83TBp`O@<}A94W-O*VVUf|uKJqL2EiU$QsLnv@5za>wm$nVJIjLKT z(F+FYKhSkwh^>C=lA@FtN=4<OWg!E4+74%O(gnM zP|-(R0kmD;A0tfvQg7fi0H z_fOJKdGQoO-~4TX{$%O*WtcajmbpN=i z)|&FiX?8?gP%jRbi~ z7uhDZkGi6CTOJL{^Ji?a8*!XdQBhynR~8(gBOv{eA}@i9V`eWrp!|2*P&W|jt2w<$ zzhBCSAu!o|1bS?%i8D-;-eXX|ht05}^ziF;y7|RMn6psAe~L3sDJj;CHA5b5k9Xal z-CP|O0}hx}KdLa+yBKp%<QUtgACm&Dp;kEDhJ>ZyZk&#j$M8ar3#K3iVHR(EZ5EZ@AKf(PJzlHQjIEHww{>4 zD-TdcsoVCpQ=^Lyb6W+Lg81(^>QLskMTO~_Q0y8txgxWEGa~rABUDmnd7Wrt2&m*YWPomE@4J;?|D(dWMa}Y!CNv)Kqmp==IVf zVT0e3Hu^sa#=E1qySbCkRHZT6vw)o7b1G^o3%pF7wc8Vv+Va%VB2T=_c^ANd4eAE;5eTf+?Z)guf{&IlIac?_s5q(|BZ(Y$j3mOrFWf_t z_3jCf8IU*uLGh)$az6j*D^MlLP_7b0h~oIL#anA_-gUS=^fnG4rY)ymCp^F-Wx2{ zIrBzSUhT2LvqZnMoFN&yl}}(vnYWATHF4vlz~*p${~I%>GKHc?>BRwV_;8kk%mV*7 zI+2farf9ocolN>2MuKw=MW4_e6XX>*oY3=lAsWh#^vMI-EemQ%A*c+7Q+i;_chv>w z9P<%FqC=2dr$;|6_-;Urnz1`|3M&4fB+Xeplu77m9?GXs${?RtHIgnQq@ETlpP<_B z(20uA_>h&8yv}%whUT{Qe4q->XaXc zxCXkLW8A|++_u)TC@(+Ycg93L`Ymc2vJJn&u&B@4;mf0HJujsL9Yu37-(P{grp}zO zg<=#Tgp7N>W6sBNOIerp_iS4@#KR#txYlroEKyiO0kiB zK_6n1Esk@8g~u! zJWqDHZHb&_Q?CO>Qjf(6eaa7@7}epi+qWy3rHtohDf*Rek}%GE5T3wsA^a>mH-)Tz z485h~@_2MS(}gA!(Gb$)@&Ib5N%x(R5DgLvcV21qQIdwbkE$UB6wWd_2%I)-A1Gmasos3d;bm^d8^z8*n7Jca&nRj+i-0+T@95`H& zbJomI=!~P+@LSe<2;fDJ#nRId70=Uo(0>WYbOFTJa622_%IQexA_$DFIT~9|Xy%Nq zt|%E>Jy9~YX6WBpDAfY*N2&0_WnDBl5t?QU^IAL<|HM&Xp#j)BuCA7vW|8hmx`N6k zEi+np7ay!Hte40*c(cVJeu*B!q=`{5#P?{7Ny+T^9b9z43Y}0Y2f+2X@EzS`(#~X< zp-VYJbs;NHu#{XznHarB^gdWh3?+b%i1Bv03`gpiguWpW)$-3U`)MDsLSuwAmlX&7 z7!mKqe`8osBk&e6w64@+9==L{l*)zh3hGs=B4$U=I9BV2vWwSJRI#zO3MHSyx>oa% zqd4sF_td62UKM|7ogQ%KdcXHs@5fLcYP~_%aLNr_SKs>EsH^1^=8d|K*>E3E^;)gTjE<{ zP9RHuW@)VDM!eaeC*c9E=7Ts_4RKr5TTJzfsycl&)ZTk8t9q-c{sh%gHF)1PU7fhy zbPiBkI2`^k`j}ubpzX!YEn{a_r$YR#!;hs@B(!!f1lK^?)A;RFsswP4HL%4pn@M}44 z_(?2gbJaEPI<>{GjbEFEt}$>ewJ5ywrLU>k!*1JCdW*qKkrg}XpCBu_{D^S3yn`xy zBt9aiLL69_yJc6$z9Gk_Y?LSSb!>CGQ)QQ@Q$Nv z_$~Ym7GFR9HlmeV`SX{d90<4<8U8lvF@OROz-h89d}%R$Gk+^Z$^5MfCG$6LYx&&^ zrQ&Y`aG@-{<=4SQY%0a;*jIz~8aL`@6at&#+k*S5$lu%*>{M08E4yQ6#QUPQdg2g~ zs3itfrGBWYapW*0ny5OidM1H>fjV`x%XjDuwGLKFW^M9z7n+K^ zJ%P56w+-nkNSv#^Cm<$=xgd3qLX@n7cYq%IFT&PCftng&>mOdLi!o^YI97gwq|*jT ztMAiaKxQO$c|wqMPLPBx+LO`P%B~iwz89@HS;2X{FfUA~6JAbO=mo<xHb{@akFnUEJ%6ZkAiR#2yg{tzO zxNQ&7F6eZOwQGVkpQ86D0GIGI0Hzi-H*`M=>wF({HllrM)!&l(P`h`yLv1>&LzRMJ z87_RA4&jPXriAmR1Fn@GXY1&;eH_Ine(C6RM&xb%2h&mcgvz6^Y?%k{wq;ZTO6_?R z?iz%(>BJ~za8|d^+|x~(-M3I&OCAOM{rl!wQ}L|oJg`!ubwBDF!qRscWwn$Fl6o$= zNOWc9fW4k|tNpP7Map>Jo|-&|HJ4fyd_nDg!+KA7J+{%k3VLkon`_0Zh&kQqwZ@0Y zaJm|S=o4|1_A2^PJuOaljSIuj%P`VZqP}r7x&xdI?qQ3Al;`R|vb_i<3(;0sMbCG3 z%W02;i}Y!aox0!+VYus#vPQIdGKjoV8Cs+jgu@`Pb8zFXhFcCV(z;+Dkc3-~pr(K3 zRSLqNCVGSZr zJ$@spJ09pFMtJ)ca6u}np%{$U10#yTc-3RFqaWXXg08bA)lUkFh9U(*H4o;Ax``+V z6V>f%^%AIIDh3?5g71Uw>@$0HbT`WOJh!u_LB~o#ocT3b+D<;{xFs z%#l{iriwSYgK}|Scren}Orrd^881h>xv>LS39@K*lhts>$3$X~_f*tVHZvaZ?G@DR zkE}Vr`8-A&Jv2r4P`~bwB+jY&YuLa#mB#)a;wxsFp=p!Jv?6_$K&uzbP)Y`*>x z{rPs}EO}EtARO~{mcm!#M~6=j?AxKF;@3c zHjCJCPQ2)N%W&g4YKm@aLvLW}@Q2RTof-B2qOn&t4Ajn`&XbO$JNPXue!l6#q?b$= zE~vE&oeTA=u>Os_I{~;~VX@c4^cy|1J&2g2V?~7y7mWf1+8$lqqs1HUo9s z6xFxSp#N6*K~zqdRluZ6=zG2D(ES;{N+V#X4Qw{42aC)=OgdNlb?9o{p&4k{P<80H z0Udf3^hcp(HF;IEtllVD>q<2Hkl}rUrJNHQOhguN{xH2+vTn zeWU8Oj*cw-5xju1VXFNZy@XSwc)HS5{FYwXYC%PgS6^$dACx<=%J<>k7bKBKxwX&0JU_r7(Y%_0VZSqg z$v2&)X5h=9%M2_C=(0tibC<0}DKilIKf3LQ35vIA3Yfmkzyqq=T2lINaX!2~`y%!I zbu<{S77R%&5}!2r_3ZEZr;Zl zdxW~9t2$#+j8Wx#v=^nAR!;}^1uHFQ{CXjZzCaHNFF6|kjcuSaFR4JO{7Wy?P$e$v zR~Aj=;*aX0OMYFH_-F8ego;B*v(IAg`03iah(1L-#a1qBwoX(gyUJ;|i@PY}jOwB%oE5%1u;dVZ;fkSYL|rk6n);4G)K%S!fxMY2(SUJvO;59@ z{v!H9ca(ywn*q2g0-dMTX_SI1WYziM)5>wjuha71<4((&r!}uF1+@z@YTHM58eE9f zH2W9?e(8Ja^WF8b;UjQsH4d|8{i=L*2=xGX9;XYs*?s9HdiZ_AiYiV2bOT9PQB|$| z<4ite))2^QPal5Dj4lJZR0BGXTN@~chXIH5K9A@GkM#xYR7A{|hg3vNYZ?g>_u5pH z5(_iv5M{>4;t;>u+#9M%wdlXQZEx7qN8*@qH+Ctf_v7wBtkYnkkD&s_oEhXh&;dv( z8k9{H{V^rzGFpaN2j>pe&Q(Lehf1Pg8cFyEtOd@Y`U_eA97p zO7QLVA=K{^@FC|gzt+PLwaGf?xexI|D#`zF${fnNWz=8Mt;!ld;*j3jLs0Ug=)Gs0 zBmH`Gr0UUDv=HqZs=gcrvkRQV;}F4&)jGBO8?-Ogmt%BaKAxiQw?Z62sJ1{DYyAn% z+B^0??dr$5lfU{mog6pLybo_(K#M}eFLyLmVX#AjC+229c&I19fULL6*BIa2l4RD-?G|0&oTg;KCL z{XgxH2Wbod7jC;n(@@5LFYp?X^&tU$g2A9b@TKd948C;TQ4GF4*McnYZM#Mv0DIg~ zGc@9g@mml#QxF&awLC~%lp+8$*uDjEyeR$v1aVH99f+^E&kVlin*RC-B%Z5-QA&T! z|5yF>Z(NbgKE`{PkT^CS$4*!VT@EBck1UWcNLXm~Szyc~T*zo0?r#2l-Q8RVCWm^D zu3_LcO$Kf_4)z6Huz4(T0L)|Pg#joNBZsb%ocFw%N?v7G^E#e(B|)QfWSDn=G^#*r z$@ZP8XLXk^%&cBk9gxoD`c7UnVT%L(-HHyQz0B$r{=ME0B6$F2x0n4WR@IoitF0&T zu7l1XO*)jJR2*^n}oeuoR~?USWngh0~nOnOK;Ekz8V zG0Tc3#h$_zI*f+wW42jMQWxbd@WAilDRBF)pl;FgG9ABpUwko2VO`q{Qm(G1%b>FM zwq4<)5%n0x@58R9I}AQjLF%XY*G@AZI}Mll_zRSxaqO0tcjV{~MkF(hLM@RCk2i_D_4xMCy-=hdFF$0WR1)O1Zd@^Of^PLb5Aow07&kE2#A-)+IPS z$@92s|4Zba$P0ujj;gbJ^E~f*^B{g7wsSa65Nm8%AY}zgQ zcysc^*E3&ZfD?{1fHba|aAcq1p*>N}zL#TACPvOO$G-)Gfu>KSwV*Qdt3oLgdA}a@ zmm#)AJRdN_17`UTP6Sa-S+Ooq*B$_pXD~X&fs$!xja5 z@6HXj=5wh$#6x{h-6U!`+}#V(*o-}fZQNzLGcr&a#R>0yE)28>w1*v*dpkI=Z9H}! zTNh2=hJ5XH?uFGcA>t>@Ypb{pxHx&|SH>#q?g{+~q3ND?n;}$hI`zdf;#H6yx4Up( z+MPrnzRD-oEFxNl7Ai>Z^db7NO*9NiD<=S#_H{ET2N&$bn>kVMb>Q*J-|Ep+@wYk; zEmUo55C|e1FUTi`UzC>=;h2wVbO-7uIP4!{DZ9N>o05{abO6ho5Z7{fFwPzn}|KYtOeF;y@YjY`N zy4!Y~Q-$0!<6A$C$9LocYJv+LczoZ??>~XYJ5H6N8Tp-x;H1X=J+`*aD*bm^f2z`2 zWb$F{BII>Ji)=?=#X3A8e+!rzGIt}>-rqoGe}XR#tLy+^=$P%nIQR&AT8brqc~~pr zjDi26Kc~CZ5uo=`^6qDs88Xq|La9tDKXPk6VVL!n$B)(XUf=2VA|Zeh!^3FPV!UU< zaI3}O!}YuaM!UQY>pU)LF~VxGX}#UMKF8-xgL4MdGe%l1PM^Xd_j`Q1{3CUXQC5o` zg<#%j!A>T8zTYU_Vzkv_=w)~z>~-S|Hfb?hw-{r!xV*BSchPRQH%PY_qg$j{Ek>pV zd2gXbsBV!WEoj0lz|>)sLr!6l0m{>L_lJ7FIxM@fag$t0cFuB^;_{wA#@>e@bb`ER zuIRHIy3IDSd>n32TeANIi9=S#AJ)5G4d(!EF#fhi`9$0Ab!69hvA)NdeKu}xB~Hl` zi7^#Nmq1bp&u-&_bxxcRrd*dM17GSu%9rN3Rru)?yc@GA=TzM#K?0chG`Dt#V)%(M=qX@GJ%j$yCl1cm(;h&x>=O3qL;^DqrK zhDTD$6)0xZZ6W#za`APPqEO6If3giN0)=_oTB~M`ybN|$_l2sR)qlOo-xZ+iQ%hEq z^`N)(EC|s4#gl2C9{%tptaIk>76-UG0HN`9nlCL97g!JqQi&xQD%?u7qn^0GrRNj^ z1_S7T@k0FHWqHRfl}9CHSPdq@FDC7>FY#Z7 zeq6uYx_I0hgvWU@t=9ALxcgtL$5BKEaO7l{p4+4K>rfZanmgH#XR3Kc`T(>9`IXa4xd1#Xr!b3ZwRMz~=*Mnu-{>^b7<3ZA6dx%y{KO66{^=g)7eRdu1 zv}HT%_=PzMqO$bBbXv)XO2!Eumh1z|;T7j5X_2_udK4_M-@?}$I*<=hqj7&rcN+f* z^8f)1lzpC{2B@JVMc!u1_S=WS$7p;mwtOO&Tjihut}jii2{ByfV|QMl*~SJE7m zE!jA86&K1;^bF+zfGwzMt9W#rH4I3OaQ^c)Y%BpI=L{R#1%hlgo`+mJ#asX7Ac+ zEBcGsvUBBdYUZnW=+19Fwg*~YHM0ygxE3R$su2uw+k&oWr$nmPfc_9xgP9lYbwqxnuck5B%$rb3>4Ld%-SdeYG7#a8onK zQf}d@c@DuXsZY3VKCQ+v1h;jIJ64P8rx4uHI?+FN!&+}!N@*xLOVj@@Wf$91T4W@f@ln}TlDjrl+P4Pq;^95r5S2v@eI~_8){TLu8l>z8#|lMk7({snwEqu- zG0rQ2$Y0Te2XvU&6l!~!`Pya>IO$at%HGUU0aFQ9m~KG06eIy5LX&+UECQJwHVM1o zPco7^6tO@4yYxOvW?C}?(MX2`jb9ry&eE^XtZSA(8e7jcABGxSS7%*wbhRLIj=Ypc z61Y z!Frh8I}nOB>(4&+k#qw6P@7`CQ3K`!G>BCPMy)(7dCXEk>8Q+Plc!k*%uUj~DI81@ z4?K+(;D4bMn=|E*weXb8{mtrrcOySlJTFic&k|MKoab53JEV{m@EOpt6YTehHsC@f z!`p^IgA&u6)}9jkLLSOy5oc1xxvU-x(#KP&$H@>|d*=?_IXo$MDDi}h-%zDP>GjiM zkj(ZMS}{9yd!JaZtInBiTxn8IpLlaBn%tMMf48lA&M9ykl zE0I%q4*u2A=avL}?-XEPMQqRc<{PG;XE0qXs2T0P&w#1G0u$Iag5Cq;NXqemmacCO z`Q=+xx;k<+f=R|wdUrlT^rshidw4&+iLzOEP1}*CD zN~BD6+#B>>g~W$!Ldo$VC$vzZ_o2?P^T|m+fx??GS)el;DnZF?sOeSt-4$gU+Xm`~ zl6R;UGhN~Bf@O+?l4+VeUFM6Eqbp|$YZv#6o9_VlxgrlY;= zaNfWT$||}OB({p)Gys41mT;~9D4$3=GBEJGhk}9r=RIs0NCjx7-D)p!uhF572 z-RQ1Cbd`l@=;}WMnboA^Vyz~94T5ak4Zxw_Td+Q-cc8yNPaW?Grc+RIOy@v&6RMcb z&i6%g8dNOnyI%O+8kin~k}@5R%u4}&W6-NM`SkuWQ%aE zARBcr1m>&Z#b$G&jyI6)i8sXXVx>WQriWvH*_in0+O zG`0s9zD?ilCq-J1E7seDL)Vcf$Rn{L6N+`LNLVlqoU%{bKn-xg%fkC8nV0si3$sS` zYQmog5iS_XH%5!UKu|7@$%31VLHZ#1AIyNOtGeC1@GqzTPEN4qh zH*mWKQWaXJ7whGsBh;f}qGo8sMaC`y0V%`7HrPd@Jg6x!K;q< zWPvY<8oTO@#O-R=X1>M~9RsCSKs^eK3!oMlK)nVM11bxp0BVr|)I-i62&i6Y$bd>m zsQ|SB7d}AcR(RC@^b!N8(ydf4!Xx}DBMp#f5pgTQ!A>R0#i4vVMMnZuyluIxSZ_;@ zUd0MqVw6X5wdItL+pzJ1-|X_XLj8Wg`Hk);+2W}{t?2zLebDk5sajGWSf<#*y2{{- zO;xRJ?{3_Pvat<-Jr?6pjBA~S5sh@oE$cPoT7uu~T3>>a8CNArW?Ws}^1CO>@%G|L zd_;B}g?n(f$|Gy?>~{ji9On8j^6bx!^&rpwttxB>UT`G^i&D2m!y|F4A3QSlhWV`% zfFp{C^T2w*urX$JlM`W^egM6RCgJXi4Sq`urPOVg`GsID2+Abq4*5G#1+m^8#VQkd zToG~!vMkIC^JeICbAr7qBo%F9YSee{#8Kl0c(|J3**MmjbjKJqrc4Iq+C&0CBVl$JTW)BAaC5TCE zVCSXL1Mwc)5yoV0u_WSdoZwOZ=6RIa$^)-hK2N*S@?j12-q=86(S+Ry^Q8%8y&8d| zsVhMhtJprx1;Y#U=c+K!wvEsa95VMZF4&=FEJ`+tm7)9wkAwF=;P0YEi5?Xh*SN7q zoi5QGB`4gUgi_ejkz#dD#{*QlDirhQ94eS^-L@JW#cb!Z8W@xbMGgse?~DrrO61~T zh1lfcki?N6BzbJ_#_&FR`sHY^*+)NS;8ca`C_c7Gd$`ChP>HF2vMH)9XBXai?hZ-< zi=y{&A)F(aEny_0s7$|P=%mPZn+1E57tva@i;w2LmSAtRci{$UcU%TO$UAa5at&w} zazchHtvTd3>=;QXn?;OCl@wE)Cw*utbqA462d5xDjzwY>6Y85UVn(bRrhj;JjqKyp2lSS)yaUIJM6o!?t=G)0 zYtbYs%3wh@^sf7}m51tro!t20?Bvsj4LiB{eeC2n(YN#*XP<3H6plRbV=f%$_a+#` z6OW9~loZ!(fuez#hM^?k*R>4uD+<3(WYAjN@KeaRDwK^R);5LXE)i?{;G>LL#$pIO z!NwJeSKVD7^EferK0q7AJns8351h&i#=)k_r6?2qGNFfZCiI189JYq3r+(QES*Mpp z*qqKP^HES?s{A=hO!84taznjtl>jaIsMfCDd(5D8z)`JTSxL3$p^lw>zM!T(n44t9 zhGXS^1yt>jgA`xT<=u1#Z07|U+S;SSatG<=%zXY#ueT9-IQS@7JH#!GWCET#L^bo! z68u&I5~UK5D3yS0E5Cc9R7SI8TqqyOpPvi0RW|G2!JdbJTt0CFHs2y#a&Om%f`5j| zY+UbkJ{0d2-X0jN=IAVrTO+B5m)Cc{LyJI11le93rR&F_KFpPk=`d%F$9oNmxTHxK zO&MT~apD_W%t>>VZ!C*EaacgKwayNk$5(k_?=}tALS~E}5u0+-4+f7sk-c1bOaBlC)utSDW?5Azd7K+Rt;aRva;S{!eq5+=E#=gsGOlNEi63Y9#O7N} z=5f7P&f~iK8O({uigD5Gmv1ZQ({rwlqnn^U9JO{oLfCgT1nVl}W!MZE$fh%`POsxF zEDsLUgV1iK9`H{(G9aoJ_&gOPZR*!D;1A_*fPK^KWz4c3DqaD|Wm_WRW|lO6Of{d! zUU>6x^qN7yZ0kM|Q#S85zK;?+v8>BFK^<|yE2k#UdTgDPel!nV`o~ysg5e`f0J6>d z#R#0YF5+qaQ7xXzK;WYk796Dtz@(*fq5fmR%mC=E=ZxaJ$N&PFlG8zD*|bP@%FxWZ=SD zqz{cyV?C75uAPKyHP(4pR*M6Z5fPHE=4H&>mXUl;mr+`Itup}BXQGDeujd`UDAuUK zE7c#5rBYNjiQbCJZx>sYs|*uk4Yn>l{1fQ0b(gg8u0AUIYX*jm_1AgP-hp}r9_$@@ zMIEJ}_17i1NA%ZknaTO|*F&gav(6fHGVGS|N_A~OAO93f6Udk`D4%G2KGUeJO(02% zEh)otB?pIrqfsZwmBjzzwG(z@JK@4e6C|}+FVbZFQA-tFG?%_an~ztGXr@F)kKb#N(fXGjTcv|V21gR`Ax&Aoz#ypYmayNl^lJQ~ zkrDwo15?+Km`33 z6^x*Lfe5+-G9xJR-p* zS{C9*{9x9syTA-uoYFs%`gx#pe*x;_$`|RV>G)ibQURb6-SAU1=Y$}aQ1YRANv~pr zQNDvx7}j@z3~LQ4ST^nC2FenCQt=G&BMtzO(xU^x^LErJ`5K*b;uIeKDI8TKK06`% zq7GB0nKsFbV6zf=RJ{gvW6PwZU*Qe$1!v?7(oTh7Sug-Z-e)XB*%{lENxwF|bY5nA zEax?N;CGPNG!1n;hc4(YNCveb?FThU_0>hqA9R+8Ccp9Mh|tS{J@GjzxF<%TlDXM7NgnG z?|LUALi=@013O$C{)7uovT@z7C2at)r8;x;hNTJJ2Tl0d&1zl9tMFTXohLhUxBa^< zl#ZZRA4ji5z9Bkl50uM`W@RGxh=>TyySC zkL^|EpBun-=;gQYAm=umjCkunj5u%8XQ0&-d6}Rl*h|Z4FD_(Hm6yijNmBX@paFlx zlxN8i+Y=3(M%kFX6#j?g1r2vkqPK9NHV6h%^hdZsrTP!2*D=GH(|mxkS;XNb=Db&A zkXu3oBJUv#ri#9J4Bf_WmJ37FZ!8!}aqN<7=rLJ)DAfb}62EcebSR|Jh~5|t6$vm* zy(PO?-`}Z@^l{M+RH}0Tj_Gp%qTe==8YAiSk!CJvKUb zqI4vQ!)W()vB)}h^oU*UTXNj={v-7GpJm0+4`nZ~mwc3ByqIi_Op|xa$V{m@GQUG5 zkIYmvGP6N=OtG11W@Ija#3yO>`iqv>bgcTKAzgP5FB&$X*^eEtzVBf=s8e49rVct` zh8_W0k0xO;x9$dchhL7hLLg?E>Wiv+6q3OnE{nm^Tw*A`Hr0uJY8Uvkbb}_dtpUc# zhZx|%<3(ocnTM%43{Ub+%{6CbkmvXsxa3z0qkB40fELb_ydrqHt&() zamr#o&j*u%Qx!~<1Lp!ifHYO}YoUyyhDADn6C6>nU0}f`uAJ=(7VRC2tU>8cm(h#? z()|MikR=vC(m<1`yHp?A0-}o24o4r%|tgUTUQ^D7%QbH)dF)x z4Xk`)z1Cag{g5r@7pAD_$%OE{By%vs4~oo-TV)MeKy)50{Tr4J(bYooRvRoh|6icR zQVa;+>gt3w)J zmgly@^41;G`)yf=$@O=St(3QOH>ja*L@AkY-9r8ZAl9B&Ob_FNmyQu&<-7pcbj&X{ z&l|DXyemU<9Km~x-ogFHcr*+AMzb!x_qoRwX}?!WpW;G?Nf(+P2B|#;cKz%8I8m-JtPmKr-Xf@lU9@J zF?lCVlT%ic>Opy@Oq0`Alj>1wqL_krWT0Tdx}=0fjZ*>=M#WGHKO$Eyw7_B zmF*qn=2c-LNEwPv}T(I_kO#vTq zDwm_M_{stG2{1R?aM@D3scPXExEWS$$1T6V+Oh zP}fzC@Hz>IgO^l!0)pX|QMWQo_2?qh+^=J=bKeofStYWU(dW3Mg_ea5Z|S^-K*Cbc zbS&Iz_B~UXL6jHTwp1!brPwZmppBadxKy}9zRLLq(!ZgHQn3t0$5*11BQmC_*F$#D zpYUM@0U>YMu8c7J+_yr zXQNm^cil9e&xXANCMr~NwjTb3ITn5bF=-)Q_1+v3-q4Gr$ssRNkQ z;q1h`x;ST1*u(7b2D*nwutU(Z;4B>#LJ#h1%6Oy!pfs}I+e(BBWsgAMu3{w9(uG$n zEfG~Va$}k7fv{<1U0E<~jE%K*q334cg8+jJ4Fl>20%w5v45h?#FB3#z#bV`X-?AFI zWyErW7^ua|1razVdM3;cDktU&ibmHU;v1By_!BEJ6dTz~EM|?z_6Nr*GaxLDz6QfV zlhq~SzBqMzGfQH$Y)5y=T>|(>-5`kTVsr@$W;kVQym>2X`&oi_^{h4^$gEdgJXQS2bMK^L0ly3Z~n);@fHmPWTD# zRGbi=)&C!B?*SiWvHcI{*=#mtv&n`eyG!aOROz4~MUV%t<*Jkjb`bE|E=u$2y;nsD zNRt{AT~NqL00rqmr9%>m(n$mXsR_LkkSgu}Ju~w>n+;g*?|naf$eB53W}exZGiS~@ z)9xY(H602u9|>+wDS7yLq3lE3dq6!<)dnbjplaWNa%Y5{bR1~$Ox6Aa0Y0s}o)oqp zP_+w2&v#o8FHZfIpilSV-~-(RB94y@m)=p-9mj^7(_7yf!usF=^5VeoqqG{Rdr-wg zlDUm@#5KR;b%iPPcfeMBp7_WCYJlUy@f3mc!%xx~;Q4&;RX~+SoF{BO)T3JB?mOj2M6%B$RQV#1-7wR zJYZ~f$8hx>q4`r(p}`4wf(%s_oUo3%Cxn5gUj>mjDvhA-s6ZUeLR>0wBTE!J+y;st zI2$dJNHdNXp~sY{bHZcQ=Xm?~Se2*?c7NBjXBj^jBVf{Mqx;9nYN#WaXMyLL`=&{U z5{_!RZJ%JN3WBfn&rkd%k2gL9Id;ccV7k2)ykQ<87gA8&p79xt+kqCLc0XYHjo*WZ zhFJo_oz4G*()hVdk?1S;g$hT3iIBSnp7BxVerYS>ZK}98 zbzpe1!Ej_S+*9i%!{rEui=+CzD``=*6xfzviClrLPTmbtQLGCn zh0avj$1HT#QSoV9dqN+9$lIl+DOTHnxMa1j%Cp)d^vXuL>tT91hI`#U!}uBCC4CbF z5sLbzJh#z&U|BLR1C)YhmaK*1GzV-5=CmY0NuMLz%l1=>;I#kI+IX4WMRUF7<4DoXB3#Xv#agz59V0q#3dzDJQFT4_1KF)g> zQ0^vJRHBaaV$!JolVpO$A`jd=i1TUQrGWgr@Ujx|yl{8wzfDeo%S*}~>y5UrQ0>5v z3$H*D+4#_$SsJO%iAI<^Ck2r8o|b@OS?hm1p4pK;Y>&qyQVI=r!APDxVr%)Ub$H`` z8iqYY!n9C*tNGrc++B-HF@;FzgTIk6$Ck>gbmTXrg^Wl-W~ z^B3^iT`(?c8>EWdY|fS+W407mTS0hr{RL*PI7CpQ4lsA#%{oa2^#x3insPxNU=D#H zJ^2FV0?7lRSjaF;YZKTzdL39^pm`7zsk~=%n`-jWz{q90?c(!p3wHZ11d=`fKZ}v! zrr5p4POcqtJWHQ{Ey@Bx9!%b)*uD%H;o0103<%sn1EzP|{*Na}>DGQQh3l@KGu*8J zo{Uf1YqqJT-|f^p_ULmudh>w6U(A{1XH0C9|5j2LUsO~S^{&2Z>>}$cT+ZqDbBL<*q6B7+-`qRHkDVLmS4`!GQrGu zcbmnz51Eyft4~&at?;5V7Te#2fFEUq?;~*#v)mSI1v%7N9aGSmn+DJB^Tnw zryC1sHIfMCJ1S>Rtm!~M52J#EU_oIpA5;AAhq4@sUop(fvrh|4QNPs+ZDJSFo=XZ=l(6D@GqB|yRBYhbzp^4jA(z)`|= zd(NnuSbOY!L`vfRfGmk80}4s}Kb{ZmNY5ODUgWHBT>gTrWb&_OpHw_N3U3|dBWpGB zE_}cdd6<}3YY;3NbsRrC?#{#Vm!vXb916WGKjXwyeYu3X<2ZbZIaT9gWVNPazhX9b z1{I@ZJ~Mw6Gp%`MUV1&QiIy^y{(=)w`v0%%IF(OA0z$iM1(;;{?htiGK(G*&E&0CK zBzkfah;9PnZjS2c@u~!P^w1jPDL2^#G0et(sY^-C}sFI-V?Af!N>L<8~gdwk?%`3s~#%LN%6EX|5| z+J-1wu-TGtvo+rTnRLaNhpDuj8T$x*3&PV#ovXM!<*MB8ngz%f#Z<-E&ICTad<)oc zjFGTw2A_VVIQRu%SY7?6NtrI&4eOEzvGfBDzIi}#@D`*oIrw;z;Nas);NYtW3l2W} z8+Pj7^_cPu#RiGrm~4Pct8sIPv2lylIl2ygyyE%!nJOpU1T~^k#k2FXWVYqGjC?8iT+V^hKB3Fn}z3kI^^;gck%&Ose|9u?h+foilw+p zqboqP1eg3|a7mX)aEW*;XPXjK+vTs8Q|(xg#Z=2q*Jk#gRg3WJP-P&=H%xXIyi(oc z!m7dqhf7-tHo%?cf@4}&2FKWU8=Zx$`+?`3`A+N{;yn}30m?ZPsyW)SKFtJ%Wz!Oq zf+Y&k$_=Wz|u=)hAP;EteX00OzYmJEoI|+sRXaH-i0^Y@LmE8y^$NMqG z7h#)*{}|N7l9@tT3)%X4D$b>?XG`)#0FPKoMo!4p&BIY`Hi$zQwyj>+Z=&ItN{=hH?jW#L2 z{r|#2$(0tIw(4}MlKBApb%Sqin0!-F9tm>*%lg&g7VfCXH#cPq$XP5V@|G-wm3^qg ztQGyqYqO`?8zh6GYDgBFAX!XKgb~h(GKt{|o~Rl@zO)`7xNtpAO_%1B>xN$_E(*Ib>JIVs z3>`y4!BLaSb5xvV!dM~1`jS>lCCD}sNKv*0cot<8$a1CI{Vey(cENJZsa0*6Hb*g@ zBUk-ex%AW@WT`$)DbH;MK(knzTAt66>lk8f8rql_BJ*DZN{F@TirX^lN^YB>xXtm6 z*|@wIz$_V0E$T_J_7*5Sw-R{fy3Hnij-rRucWFH>yY~5VKWmv1HBa@*u6;PP z-jQ-ZtY;IEPP847`z$vmQA7jq3EQg;5fDf0`~AnI-6C&OmlmdOubqL@sW^KugSRU! z=98*ywDx}nV}n*SMD_|hL*%+sp5jxS!Dm($r)6*tgt_1eWo&^;lK8D^1vYHUpO#@) zTo+_dv@AYG?<2s=$zAVtY4^t*KPvXBrQ?;xAk=8rQJM~XRdJd|(?j&1mdh*F7piYK z7pd03E)0Bn5zzbbUPEOpl{F8FhZ%EYcd+zd1@Ti>=XO)tb1qyr*zG>aAd7K-2oMQ0 z90*>3UUE?E&4_ibxF(*+w6qAS16%TYT*>??Q~-)-Z0J@?srU)**9O2y2kbIGGvV&^ z2QdFSmX~9M3Pgyfr;62Qt!$9zl~%%O61)^vwkle?Db8V*t&UblnG4Dyw2oBoK}>TM z4o1oG_>&q4soTnRX!$ervg5YN4>q&vM}4@285g-)^>bwi;dKMNHXqv~&7y9x*lw1? z=86T2&ZkC-tCCQKM3?C7BHY3tZ^PKcA)JPaZq1#|M+Ik(QT>dOkTl|)|SutO$EvFfvNKjoBpici+TOEJaSR{iS@afVlamy!fl9PK|%uOW$0k9T9dUt>e@z$*}h^xAC) zHl6P=elm1}dEhly)NV31B3f|s5^V#LeVMpShgtD=n2b6lUOSyFu2-f4Wt)tX%7lR!A zeg?_q`6p(Svxnsh#EHPfv$+$I_`%1JSX`RJiRZ4D65*u!bkZraj`@>=_3aBnb>sP> zQz}W~X*0>b^}+hylP*(VKdpG7&p#m7qiMUi*446(*>lQvx`8j>V=uwGNvpr)b)Qmd z@OMb(n7#XA^o^6um7ueVXCkb6&e`>_ypAVQ-hUn7;JHXHEU&Ua{-MVWhrxMOfdbys zES6ECrrzSI=l&qRnRxOoI*hb@@lP6Njc#BjY;61^W-353cJ*uql(OoQ`~+*p1`kzv z50b(P*ED=S@*h0+Azw2iTf2s)c~K$!YK*B|Y*nH-%B%r;OeoLIXRq zr1STF{K<>{-ajnDyomP2M-DB8`V4g8YT=ZgxAE6qA_TKsu7nVOm4^ z!0^MV`G72Gw5O%y@d65;UZBG9XKLg-;)W&`HJEkrPl}o>%6*obDhYq3q(T1){ZYoC@c@`-q zXfxxm?tUIHJ?c}XNbr_|k8sTZ)IeT$|BMO|ilxl^xQjnPm{+6n0nL7?s1x1tqCOo^J30K8E&x6i^P<$+A&w zyX6C64P)$5sh^D$@@>)5xF|I!cMo?!gQpx!3RDMNS@A_+*$sFEfoqybX8Q%c2+TVA zhsd4ysL=E-CSp*D<}c%r=$z9W5`*t}qEa4m%+j!TjdzeQQyloQ)J?yyUWl9 zjEC-WB3tP^1#iZB7$K z;IRM@*%uk}5>Mv)t_LfZ7fvc%r^Y}&4q_$~jiFYtOILy@yL7th(i!Euvyz?S zl6R~_9yRHS6zXAt2GnG$^n><++x(;eY%sI^NJIi9t*?ocP zv^to&Q=Jv2yi}oVg#QMv<0Gifs}KmV2p1nxS6&YSf^Xnjf>{7>QkW)Upsi6=INtHhv*`SK z5UhrAC^{dr_vt0{EYR#2TW(0?KFN^Cv=rzD5DcdPzXyxvzK-UEKrR3j$LI?WRkSNs zsh)Xbw6ed~l+Q}p1FI|inUvO!IC z&OdL_Hy#m>V(?*`4Ki!uM)QYm0tc^{rql+c*r-x$GE?lp2lha*2*sqw&wOr@zk`~8 z0{w>GdJ9#wPd;VUH*UqECe+b^z$95lT_Qq27%E#0RYMvovwEWUFm)9GrdtXJ(aly- zuw07O7ul>>Zn<$y>4`wXtlZB5^YnY`GribG4DmhW%WU;8^+n_cQowR0) z?4)_XRCO?CWu9ivLf29Wa8(@4Px+s^70&q%Pfb6Z#eIcen6?FcqCDSHFA(MFyhB(@ zVqX;=#e{1k8qECt0jV;EB0Tp%F!h@5&>GSn&H=^baDZa67PMycz`K%mM9@sbw8Cr_ zbJS!^ct607M^$BJA-g9{egHTt(`M*-2D?bu4b|`{r^m7ZJo)_~gQVLn8J){rZPJ>9}bAM)qT+eE^OWC#Ek2^dBpl z&1o{I>@dG<^x{mQ<7o%b@+$o+Mqln2kLpwNen?*xcV-!rjDNe-HRH3wdv#6xFf5J> zZB^p!5f)zP+Wif+ z#(y$V>a90qXM1lNHG=8D?ykVjzNvm03{5;Wrq4bmy~^QDgjadeF^U`jLF|x9YKZJ) z(t)euV9&z#$%YNsSK!zoF*n<=6LW!U7BlsuU_F0RJhq())pOusipj2|;R)`=S133W z1|u5d0HD-222(h4hK=`KpO<*RM?3R z*TDMO;lK@SxHCUgR}N~SeV9gKRdLzlu)}n|04gH29b~8vW)-uurdq1 z{a6Y41?YxQLhK(IE@?btjmp=jjlggp?*^28Jcf$Df<(8?lus6&o3DEK!NI1k>V4KQ zOu7!aySHF3@PU`0vGL&?$}VVLHVEw6aq^RYK8^>V0KZ1D@QCzHeIm2lg&GnGc7tQ8 z2q}}4_tK)TIW4u;Pi4xa<#;}J=M5h3>7gw&UX`#l4_fU8+;)Q+48zEYDZruH+Xbd$ za{OU+qd|XABPxymELgv^HQv-VJ~PO3nH>8O)Qv@@MM0*r@VP-hAn3y`D7s-N`LM(H zC=UK59X5__@th=zFp^AAMI=o$)9l)bM*?#EI?qHS$romlPd7*CzfO)bEBb|zF#6{Tz{ge-Ew zxp$4mB8AX}at;SLZND5Lb)ory=}~6~`Nz_UK~w@HYwc4GE3G|sp+jpKHP!e9aDz-m zalfy>duaJc%rs&gO;h72@++BL`dQ9`Ue3>wI*OHc+^Ge~R(%d2KOFeYVP9T@58|jN z#tzf70a=+}0m$B!+bW(iMrrN67t7H@;}N)}#A5-jwFRpc@XJg^2n+GpZ>&pu=PpW- z2E9fu+XRl8dF98IS!zc*8eQBjWL zzn8_)MSLvPzU~N)t53y)cDSM-FWRm9O3Mxj4 zZeC8Pi4nuv+DgcA_#oUg42Z_y#1()~f>5A1vCr#}$}|!Ro3~b>`cdo`M7ZMPl&g&2 z%y;j828QKTt<^?4^Oo>6Dw##-1#2Xq*fv07VqGip^(d*`H$=eT=OT~b=OTW#sRUuc z&lzt-LDm0{532rM7oFD{zkdso+|6l-7q@vH`iq*s`$yx~iJRI@HILd)U=3jFMvH#r zawVnB4-h!M0b%dD6os1y+!JWn4YKcCmDt6Vw+ON#ymSy%pD6ckZv4ak^;Ftq z)(n~dMO83o9`#%>$W*&3Ql;KF%+d zuxW^ZxYl&m28ZDyaK39y)f+cDuxhl;DCl=qjkXz8jhu{bxr@JlyOE$ZC%DUG{$$*5 z`*4fE?fC|m0NyZgw*)SK5$-rCPEl(Q^@zW_4Br^!Grs$hz-;8feVQ0q@ zyEA`0?>o+_%yN%F0dh(A$T?GWhUd;QO%A{^Luu{?gj{Spe^_h}c#*CE#fxoiA(Nz@ zd{Jr81Pp7?bD4tSxEWBateizactT>oh9^YL{h7%^R%RwcR%RhAO{3{|pZn(nf48|G z&!C`eck&+&F-n>N6aT;>s_q0bd$ z9%BP=OneID*CjM-;^XWvQ|^+n^vQ6A#*g#S2|j;wRx%|en- zM3Pu)i+Cdp;Y>gts07IKXsL{6&oidc25Q{?PuuI}%tyZnO~=sFjnz@#5oz1eO(e04 z8Po89$mP)qvV*Y^BkMBuU5P2~>LqHGhkB~UXjj-nS zDXRAD2=5J2JE*@a0p*^$uhghuhgAag|6U5=(STAsPgnG{z3#poM|@roeOgf z7US2sgz8hmwGe92UJk)s(H%tT*x)PoHt<>;#L6uB8$4lBV=A&4**0+q*;a5ivHga# zjrm$;n{D*}9J4wLz#{91`WNWt7)j=uNs7TDbH0o*DoNr3Gs%StA6g(AqH>syMZ?ur{CH#0a4|=)9jN(I zn5tqs(6w896Iv4MR*-Z1ATcJ6+Uf%**J zv%6+A#VmuPf``E(F$}6w@^V9gSuD!Hz}SMvvq7FM$X}IWY{HB&9(vqjkoO95MRjbeL5^I*RU3X# z8azhsB7^*ZAXn7ZiVgBxf*fE5;fMWXkS7UpfJFrIHiNuLkOPb(khdG;8-g5QCxQI4 zL9VlwYaU=SfxN>YcNXLT>j~tY26>bq2N+Ty@4~`dYrdmx1<2u*Mx#;L&N796aQ^6FM7V4~MnNjC;Q1CF* zAEX=zutZvjIO}(Z{!olbkJn)(!007NHt7XHF8&(Ju3M{EYzniW&-BfKf%=1unpnqHzLuu_RbnSAyTEP~ZYgDmo8bTc=?-VKDLJKah&c zz>2Qm=0SG!yojbrFqvl%=5E#|3P6;8k=sA|{URSJYMG$&Fl4GR z3-c|2^GV-BoxEC3}G>> zvv%Em-O_>nymQ@B2ewMgc&s>^Tbsl5!N=%b;H#>u*lniP?vtG4xEi5up%Q7ga9VXA zyG^RoWqz(u){Zyj_?8 z&Ap|5HGM76>0)JZ=25AjN6wOEDWeuO5=L$A3HDR8LX=kydjs+`mk*eSc;6Bzk8nz4 z0g7#bd3TJ41^&@M=aFoLd+%2j#=viKf9WTs=r`E3`HK)x`%4QB;`3s!;7)|({?dw5 z8muGH3q21RGn$b?Ix4W*CS;_z#O?RA<;}<}w_veNDrPb8$3j)~O+od~Q*tZcB1Nrx znDfp*Y0*npR>pvkR2W>MT3rOyn5PUuxF5Zqt#HBxftDLo3fBwKu zH+^yvhy5_-@&U!!h*NS5dI5z8Uq?WA@Lxl~@Ze`fiTNap-@na4Sj;E=Ps4*>;q_{{ zxoNv<@}x7ym@@o>a!g^ljK`E*=KNDz)V)Iq0ZlA(`t`)gD88bexLM!=^~9S3=O2H( z;j!*n&KsyFb`iKhJ#n+p3Fv9j3K6`2_aDjT_hXNO< zC(aSLKs|Avzy<1w4m4yHN1&eAQs4sh#GV2ds3%SqxPTEsn}NGSPdqOB%L6^}Q=SkF zMR7PsSW|rdJoFhcG}znDrrIcAsyf)iZmNg00=O!U0Hu)5Fb*4nV=nM!1F7n50D?HAmhGJJYBu@~W-Jv$=bP%XS8bgqLULt+Lzjo36{>B=@;b;-v5qofb)XeL5KHJBE+whN^3Wt1QyzV33$A)hOtuqIMJ1 ziXNg{ikc;;0RtO(Z!2m6Q!51waZodHQ6yhbL1ls*Fxo*LXpp_vICsFn2YHY|?jXnk zG63X{405I*2Z#fZp+3uR&llv1{-GfTxkQjzNSG_;$UW2`JAdPsO5|0^+Y!zKZBV+;b{uC9xL?dxE7%#8+Q&e;mjWR0H;5z?= zijJbuC;+zrmMfs5uV~CMI$xK)yq}-|xvkxB4s8WSN*r^cKKq6ta7Iph ze4UAU0~H!2{XV=NkIfK+XfTj`%(W1Zk0Xpf7Py+{7dVgIG_>K*)X$6jT(+XrhOwbcEotb>Y!Mmf%V}IU(pS`KL``3VHGNX)NzIKDuQP^jg$elp zM&|gTTWJ??Y1(VP!bhvcMlN4ktVlDK`p$+oby0nbTZ>3~Jq@Q%+s5cOGwAnNXu#xr*Z3TP|@tWao?L!L|b*Cf1gx!GswSDw_gd0z~Jwsyvrvo;z zyR{C0!vL#UMrt$%fo4D)18fV}I1&U|i4@8M@*WxvRHUdys_%T6GnQrp;nnujX2547 z^0oy%nr^iY@J5mz0B_L zv*jc8s97a6v~50jW<%L(Q-FC5T@oJa*8W?4pG$9Co}sW`y@~jkrXTthFBv$w*PDnQ zh{I)3H7!>C)KFTDyfx8Fd3K8ymmP=SWgoN+_dJW#O_^!pLTg&W(nFkYQ$vvBk@iu* z)KHa-dLs4&uuBB?t9@zwDLQ~yeeFLK9q-nj1hq3@s{PhHud2v{@+V9L+N-@sO99)7 zUMVDPXI0F3X)flw4%7({DwHqxz&o)t2a)QbD=|2O@r~VxrQ1(_R#jDZt;(9{MxoaC z^dEvK2IW?!=YVKrdkT2~#818jsy@xgd9}X$E4o}s*Jt&q=BVOAwFoY_5+**oj zhLAGsVl?E9kRtt#sL<&{%>sXt#1r?->Ai`Hv!f&28|UI#Ca zt)jJ{c}3Nr9i9NKilzX6re3LT?HLOse&70U#QL(% zJ?^G5puG5$9$qWXvb>lw&cY@{Ja0By(0RtI)#J#*6A1w0yroZ5Vwzif#j>u51|slw z`NFIena(50Us%H(ZoEu68dyBkAd4(}Jr%yytqOJi87;9iO%sCHN4kKqZx7Ny1wu3q#kU;D1acj?`k@WXBCTJ2_+1D+ke;axn zJ<&tU@|E_8OZN5lSZubee7+3I7tH#l^X-6N0B>Jw|Rnf@$U=A;z z!C_GwT*$$rQy0Z_(k*i6DmDUsa6X;;#f!xk1p1=y}nryjUu8BTng1E!m+qT!T8{piEmEbULz zM!?O9Bkk!BFhS{>L!M~1>zeqnan1~1%!d!g`HHU83!zPQSjbML$hvN=YPmd`Xdt_4 zAkLGw<|z+tMDjEmjKrzPG!1aFb$fAPkgv3KNP=(6w->qR27Wm#A()YU4-R?JH_>w? z&X;w3OdDHPVKrv;?$@tXr_<=`Ffd*2Lt~kB^|82`Zg;-30XV>-U8mZOFgS1#a`L@y z?Ice#5xRxaGI%83$WPG1sos5VZ5I-RHg;<(v@Wz3uyN?;GA zgx&<~4oSEf5cQ?wfOX(djnHwad~-+`%l2a0k3eI3tEpQnv1H}b`3?|Zkr93l>q!4? z=GJQc^Hm*Ti(z~W374|V$nKga?40NbwK;*BmrNb zO@KnM9YcV(2Df}z_Um(in8oM|z&TLWAA7{DEwLQ`ntpo}AB-%z@)IV-PMGwIu25T` zs%zuv9l%GlW3&t~UAs#A0TX^F&)*(%!%Z}v-T?d?^2`C`JVk(yC6!wA2J-jX)d2K{ z*R<3@53bul_x+u9>(lg4z?NwL>3|KjN%RX~8x)cBIJygdpT@qlU)sddQ;4Q(-_g5( zPisZA5pbmS3r%n8(?`^cr`}KSl$%Xc0c%48-3r(b#kTe(L6*JpB#Z;J^K8I$?PuBw z*i7q?AKsQzA=%J&Zmla490i;LIrMRRGy>+z{9*)B%<)@I&4iQ$5m{%ztNJRX62<&A z3A0-0OU697+MoIN2k#o0g{67CYAw_yQAJzV9hkz)f*O`#ZX| z&-g48SD7wScv>wNwV!AF%f`Zd_(mLPdZt1K#_rTk93_G=AQ8UpHqo zcEdae-JObn_J{#I0=tC<$pL&B$a>mzs)i(0wN3OmV8i;XJdC<&(LV`xX5wOhRlf+) zrx?J$$e+C?$jKl1CCFD87ab?QQdgA!i7Y=D0^%ylYvM4iS_dIV}%hsR)-Yu}eJ?NZE(EX_fw z-WfxM-bFN;=_T|$5Z&oTWQeA#K-V!+)wc|fp=Uu|ku<{oa9X(C(pvO8rfO_0t!cTT zLDr+h23_3R2+a1&0DA$}!UrGXyuA?^3RA#1!;OKhq?|h4fT@CFySlZ%qvN^&w!2qJ zcZg@r3;Pq++2b5m*_6vOOy@S+5TtMY)#`kO_9JJ4W$py}4FP^y_|Iz|q6qy&5M|uY_Cv?+Zmlnpt_6JX5$RBw#2aSeQGt|uMSbv;=uB_AH`V!? zeoA$9xFMem^G9Tyv6LQvnSBkf(_4TE7Ufu>X^17U{a?uB&~=wm^=h!uP9XL??7xTp z!Pt{~Q}qyF-$blEu*(=5HfKkg{&Nt}hedSn0hhj=qmEZt(fK!i&_(Kla^mPIVEUpJ z*8sMKAiVs!1zh)AcMo0xef(7zufSaqxVI34ne=&|)^U`BFiZS{fVHf{Vsu<#{Tj?S zs)E09jJU24?F3?IjDABQ-eZJiNDPfd;2tX|w-jZoNIE12K3rMYZzAd77;?Vu)@EzL z`6~dMvE1>UAMtcjqFw(;D#51Y`AE5{9Hfs)(<%=bEa=Wx^}z<=uSw7$<;v}(5AkQd zQv_L6j}Mhugaoxp2|AR1{3iy!?UTbH`h_EO3z2o09)IkC4&)z^TgRS6t=@#iYzX|e zh}7x$sy;$}(cqXrw0rFO$bjmO^k+7!OPf%#hb^C@2s~ipaj^AQs`(b?v*73TG1UE7 zs^*HcLvv?6!uhg3)|cyzc176rEQuLRIY`_bQf&_)q*``Q@I#fNU3h21`2slVQ}tO( zf;S>fSY%MBf^--{ZIH5t_5<|*OxIqZ(SQlCkbI?=YChx3NqHvGH$UP-jeX{>X2yBfx{jes>RS>ASo`~&*&`D3BYL~FS9yx<)5op(v@8ni z>(<`06fLEX5V#MB#ek1lvI?lUAN(^^>utyTd+v~(p&G+HQgNoJ|@ZqTZu{Ql^q<&~QoCXm4!-0HO zJ3u9XN%n8^le|G_`EYn5Gv9qBo=wh_51^uHbEzp{Cv75)27C+p%5Q-80ACfqeHMOH zJ~zUPngtqCz5Zwp%b-+x4uOU+Oh*7d%VQgm$9UBN{6ijVP_fv&xY7npsVDHfbRZ}9RhAd?TZ3cy>#WjE7wgB5NQCULEY##-oXU1FQ;|Is|=T9jxiKeSObWbBEXA+|K9q zI=+EB8@j{mis;LFUDBqeXz%%+>70<1?;VQnvanGd4kuN;QBN8+b@p(#wpUw5AAIcA zo=Q>{iI^XwYg%fi$2}~7J>O>hx6=xZ>ie5*c zS^Uii-6oSe4H;cfpsemtk*}aYlzxCqPkBcVt5A5jKT#*DF&cu+GSESt5g39g-R`5h z4ddw=qV|OOC<$gxq}8zF;!T4gWej)4XY>$YGcKS%0z)F6(xcSpDC6~NP>X7fb!%&R zB%Md#RWXwKeSu*a9?jLjg({!XhvQh}PFh8`d)3mok(~aY-;oMIt)(5I)0`?vv|J~> zlKGn?OTptjYE{1X6DVR@()O)|LC!58J(J}Q6u!|WBgU_TIPyez<@55<6H6l5m32HonMw~x0>b;F4v{RU5Y!@kgx~l zl%0T$qGpekSNA!+Hht1qa!+z=Uuj>^3P9eDr%gr=!+TOk7U2RGU>-bvZ+XM`0joX|{RV(c*G(cii*$6GOVB=~^eJo-XHgHpw-Db6_z2=D zQ{C7FIFX6~o7ni;7w0&NoaWZPF~m+%_yeMoZ5T;=LEvULq)kh~G^*9TU!m0-L)x@5 zTUxT#gZ@;V^ao9%>INIL?*Qa&iw@Wf*sx*;M1Bp{(oWGMfNW@F0e*zUanpH`XexaG zIMk7WF=Uv^QRD@#KDC^|ax{aE0{#OjAOD7VGlPl%ha>*{O!hux&?LY#r|kFi_$EPo z+bDW|GtdvP*I}Knbko>a^3HN=PIOm8z+_aUJz!$|_4D%02rpV3w~W^SxN@EbFik6@ zF9H8$447(3LWCP8v7KdjsG77OpE59}s@YU?_Cusj8k%#nvRb5^f%M)Y4OEe?6U8j{ zXt7oy1WJ&_jh}NBu&D(%)JhxUiBI zm#nI?3&QnXpLOpUPm|}vM1eoz7xl}+3}N+0%7|UxU9PZBh)GUDX4QgsaoO&XS^Vyl zaD9);NA>f-uZD)w6_KijEf8(j_m%rrN16{Rn*;m(-~4ke#jYPHS4bzs?yNA?U%(>@ z`qJMKcpyURCAg*DN@-RPB*s*r6W|3|33xx?Wxx-unKu2fFE_^)>no{i55YBDh7mLG z+j2(CN<_HU#ulj1zt+rZ*Mw5~j;UHBv)Rnl@;g=QXAyY7(55CLQVZ<21~9GW;!Js! zk_%FFfeN!kosy|;S>P?vxU_;C-@CCf`6+4z*a)wR^aV_JW51dDa)^I^y||TTf?8GE zMq2^ndFk#b0(=8+!-Z@@;Tb94dE0BT^gg2LS}9EiyhqzfKLXZE-Kiz$zp8T8jxf7^ zQFN0x*14YI7O_8ZFtr9uhdp-Lms`I>oUgUk@im|KgBOzMItYF1WI_X|xMr8NMXcGm zu!QHuvVpaUh3{^;xRK6ZN`#Lm!Lj#T#g^EOBe=A>uR25~0OBv6RL0 zMEVr)D`rEstD{1dI;T|SjOVLp>CfTHah9jBrIl9qmu%BerSqv?4Uw#fto}~jzYNlY zS+VQzM6C|>x{#P&{-vA2%Gq}nF*Y~NgF4JlS7{b3U zgH3yXK59bmx-O&k`-#Ov)8>%6eW-4(%M{~#&20ylgtKlRvyz?F>!~r|J=*iWzBk{D z_jx~mq_1y2^^Nd#@P1?U%?yuotjuSILQlNaJ{3LDrU3F9J+TmQp3xK3XSYWSGfb&* zh4@)m6IJbRc)S15lrnVg!1hC-a$#^L4u~hU znYLk2W|8LH3l9@k%8I*Ih9sxoJX&;gfz|^{Z;|>mtw(yO^BDb#jCGuuD>m|CmN-&w z(?424^;f&K?AR_28!zD%S$lXLH7!l`VCOO_0p$ny0H?3P90IGQ1h56#BWbN$%fjHE z1K88@=~_zq0pm?OK^*`SFsFp+kyN}S5$^Y4z__ADtd-;6fvZMtuAx~#ek_tXC=X?L zDC0*ci0;Y9Qf~$Y1>Lkm99a48(ing_$7m_2f48mUUl=9Iby4a%tObiAqJ70ZB4TL- z5Q$OWY_N!z5kkBX`m_!7Es$eudo9T5l*wLL&jxh|8U@G-ToGU!z}O8k{;YyuGOXJ{ zcgev46It>rn&`JR;@SZ%GZ>M~xE9(V4qRA6_Kj?@Jw?3$d3|FlAb;bSg0(lfwQ;OM zB>FNkUW=!n5x?J>t?5ZVJ)u7Qbep+utLbUL#-W3bM!;gh{yW4vLC75i?vxb}SGml@IPqBRIhy94~|UA0YD=S{11sF1DCSm-~YSGDuB}+}gjj zU$L(O%Dr}zHUZvaSr#Jnba!y5b27yg!~1NT%>7c$msYDqEIkg4%a}T;KVo6V5=59@ z-KQU&66^b5)bnN=*@)e|%j6^9i$L{3{T|OqddMhFiVRlh_U>zbmJ@^5-HkJI{ax)oAUwZTXW$)+zxdqKlG z0&J?~Vj0;Ey0tg8v-CFL^N?|y09n>K4@uYwkfpRw!QBcbAI8tKiLU5GEf8tVHUAKS zL|JniHvh<)b7&XM21(TX5CUe+J4PCnj^;}D!;g8_*5%>!C`T~8k2>B%-lJ}9n${(M zEnt#{ALKpF3pJOIxpC{(ISM(Br8_q4UPItT4y;C?j^*$MI*-6+%$4~kU`OL8{PQH6 zq090sox<9uQBu0~Tvfd)g&}Pcy^Nx_AxD!l@CzfyLBN%vM=n@(J9aNjKMUEV&7#eK zojenEM%2aivDW68F`?GsS`ut@(8uqjX6M*OSW0~XpFkli0LNNpe@*SmARg2N0I46U zrVY#mM({fsq%V>39&LR7TEK}G%miJ3WyDST7_g=k`*msHR|!~R+5i+!t2Y2Uq3#(M z`Lj>cWWa}`cr3z!nm>i_eR__{fMkbH@+I_B=qJD7x_##h^dMrDJ$siF2Vw7IP>>jQ zVCwsrJ)JL8ACObE-joHHjwRnPy@_w&l^*ys5cR|-rr|ZcT=@yxWqhJWAHAs*6w-T% z(wcE;UZ~~ziYa`<=L;yOneTkqp*UO&yM+26TRq5E0{j#|0fP-$#r$)G&W6}9-QP?0VQd1ih^7l7pb4!wV4qF)2TA&?D}cAPE8 zH6T5WWrT$5k{ezFbOJ9Rtw(rW%amYzU_ z_o?;={FHT=^*()18yD5S$t{yjuK@Dm#uC6Mu@Ymu#e4OZ(F=e+EJR!YY+`*L{t92r zsrK=SFV4nZ_Q9iIf94Mw>UezDFCY4V#?rff+V;@+l8ox*aG3 zTXvcQjsmO>_$}b$+GM%~$Zn0tEFQ6S;8nm!u<3Po5S`ysNApBRz}gqR9|@=2Hc+d> zK-}vqh6!5;g9sDa(1rF4#f$uF4kf3*E0{)+8i7>pT*4X!;1 zJYdXT$*}uh#E*IpFbVd{=YX|?U&f974dauwfBCxgzEsawe_-Y6G&01aeVhMas0Y0O zwPAdiN6SG|HV*f|d#7wjx`9|ZeJq%~6B4yJU&}GiM^K#z(4aObL*_5JVIuEpNZ!>6 zBh`jTrDx!GPR94lHKBco2(>}1zNVnLO#`bAB5YuVOXmEG^(wa|u#=%^l&=?^>7)#- ze3akZwtk1u7H%W*cx=|^8#5bt)0C3H+O2~cWTavo^@#){K${o~_yo9n4`53c_X!RU zw&OtDw?iPk^5G4|7{rNb)=1tLS<@1S%@1<#Q{7q~twx$jw_65STJt|IRy(Zeu)NeB zsbZ8PCX#wl9_+tB$^Sy&ZEY(Z1zf8wq}kCPyvRBth7KZ7n*-5Kt_=e15D=IT5O^he z-QhKvWkKF_L+d#U>{AY9Hy&r>2<}Y53Gcsn&_TUoJldC-;vy<}v})j?27u|>4eAKE zT$`8gjD?d?!>_Lz=h5DclC9-63ZD+-a^!v`-UB@XO*0IECj0~P5vXc5O*l7=RW*&3 zw}ssRy*4Mj#|532vp#}=XoRT!)ICII%t_B30Phxdz94ZuesL(+WCC9lNOP(+_Y(FXw608UFr zi<$#gfuZ~oV7<_7d+|6fOuSDK8yzxjgT>j4s-7Lon`bT5)45nq*eD| zYoQ@z0^B1u_%X`4N6b~kKX&fQCCNbd2(p^S2$}AYi74NcBEKNgQH@@M*|8f3UXile zkgic-yg|8%FvoQtjQ=iN=vD+CtR&Lf5^Gu_^`Ivm5&G~gf6{()*-2)y=&N#Q0HbU z0qg4h%i zs=Iv|^B#@0iVZmXKudv~xB=LaTQ#E*#wQ1I5E#sX>i6OsvYoBvx<$3~o1k_^0qX#T zl&p3i<`$y>FZDw7#n3IYy|CVnQ4wMZAv3=5I!Dtvgg?~QQP0Mh2ts~Yk^tNqgnL4o zCHWe5KOal?6tnlPYZDJ%gXo|q%Oe-wJc(&%t8J-6hRvzKYrIYInR4Dq)Es^e?{^UZQA6RI5g6lT`%xAKoE6Ew=(GD+!4md1T3b;1myvahC1m& zd8qq0RoM{;h{`TT;Au>?Q4jN2%%Bc{jiQ$RDDRAA2ATOIWdS)7>oHq4oN?2=k3jDz z$EU)8>I~#RF(3Z`$o7TvQOQc37{+xlc88eWdvBPp@6>-*rr!Ta#@%`Ak;;i&y8(F) zPI?Tw6`N1-zPuCrT~v&C6PQn7fA?S&c^Fj(0AH{1Wl=abxyp^PXf}03BaDyy zs+D5QWY{XZAF122#4Y{Fk>V5wH>7avh+GLiJ?5J@>ixJ!c-<1^Q2tALbhs{0c&M2; z$;|3!v0@Y}7K%r~#(GPwCp=nfc*5TV{1@N>z*j;tP@6PgVQ^$Dz4#=g1_+x0 zTSdtoyL{cPI0Id|EfmkR*NhVr<<|V<0Y#AzJ9N7uofkWFGXX1`J9HNzmKJ)W$g4NN z=Gp@sZoZZ2P+4UdOVgQt?T@Zc!;w!Q?Fmzp}< zsP3k{h=ge``wG9G9PjJUEjq)88>5r*U+=)02E@d^3>Fs?>EBOz$}KbrbIn+2%IJvt zW1akeS!lYueP*(%*qSc}(Hm-Oq~AV+qfTs?#cRp3*CP_Vp=tCRYEjiG_s-h%`>?Mc z=j1|tc_mlkZB~bW?OB*`hM0o}<{S9vH?h7xpFC!#c6PLd-=LGu5%@R$XvUA!?`F`I z{~>;Z&h|7I(SBk(Gon>b@LGJWhJWp)H-WAdH9?qmNrp_C3M3zRISKd}l&E{3;fZk{ zwm=Q)y})jaW%M54MC6KnkqwiH^gQ6#T9@q3 zIH**y_FaK|5P1o3i4{hW1D9Zf-RZ+F9voJmM_T~LL-hUQC723s-;WjCRlK@3{YN?s zYAp!L=&oQw4AM|N*_ZJsbbx#yDp!<;M}h1t=j{}k?8R+=@tDYe`ycx-N&QZ1b;LhX$!tu2d8&D{)PCA zJ>XJIigye=LuPcD#Wk%k;QnGw?>6Ad*VI4Y%J7vsbPB^d$~I)1kpIa&z<`QfO^f9N zAo-+N0pL^SX}rpB!j%%rw^2FZ-F_3XG$bWy?&*O)y$j6-%!rla+xR5AZYoh;A1L8erHM z6Hs@`Dq;JE9P+ri3FsP?N7-1Lk@iWXao7^x0Nld!HW)V|2e%XS&@H{48|e`s8pT&E zhYkKjx$2sO1ktF|e8A>twNrpy0RR3kZt$ zy=@}%Xd}^Jb{{_23GMQFI-t z*+J+V;L+aDer94z6w(T?*d!bj&Iolj+NNdF$_(Wa?xN*yG-sRbZ+Q*S^X zNI8JbRGR$=C!s5^1Kx);4L-te4HeC}3g^Ml#Ie*5xLR)2t++%(jXdtw)j__DLoedu zG9=+4Qv&F+VQitt=msK5)-|>?D~>F{ITW#0t{B*{V$g0dxXyAT*q6&|CSwpwuPESF z0$CGf9s_KFZmBZFqje1x!fSoG&)R4T2#q{PgT-$D$Pl=Qy$LlfRrP*-u}|kHod)@o zmXW_}s7G6A(K_V&KE|*M#^P7eD0DpATGu#${c&ld*%<9bF9BA=4!6O8UhM*X1qf@! z*L_jzSh9?fcJ;l0O^~<;U^PtmS%7sBU&%1!+rm^dK^el`lq>S-v6xC>`pg03!p?i} z%OkQ-7^e5#bROS`qYT9Bq8|nT!o>FFRz{*7oCwI!aS%N0tgL~6n3XdTsEI9j-~2!3 z-a9_(V*CH+y(ycX4Jjm9%4X>;^e$yp6e|Q#K}Auo9Vy;>6%_>pD_w;ZfgBK&B2q*U z1Zj3aih_b7#R`fDVgUvDJJZ<9(S4)(2W4JLW#^h`*Pgfg z<$|a4osSu~izehduOcfuL0$2Xt;d38Ctl`HL?Zr=s~ah2oM4wg zxw4Zk3$HJ5(o&Y~vnujZNBW*$nel7QGss2eus22wo#u;m8}bv>Hmadc!hqC3C*cg8 z+F7=(umWT&LELP0KS>+XwdnM=6<${NxQX&FelivPv*NS)&M;<`W2-my#JlK+=>;gNRqWImSWKfjGFW92=1+SziZ-TcFOM_XoWg@RH#q${V?P(?k zF}R73vg!yph)TPi0&1ll1Wlziw)vSfN0(B%%SlixrKwaS2W?WDsa$JJk!CjF-H>Y~ zoArB>z`D6QI<1$JU@Nqe7B8xHvO?|yZy}iY5mnFNl>idnVl`0|+oVSj&de$c5VS1!tTvQGC+Ro{D||3j@^d-y0@)=K~LvR3p| z*FM#yG%OXMI+~ z4uN6nMvoq-Zh0-p)&iLcKEThy%bA1b&VJcTDpjX>3D}3{y(}B>tIt66E7*asEnj2Y z&v@3&RwjW)ZkKx?zQQQfU^W{2j@LI_ zjfyXepyUOXt~2lK)M&*8g*-dBPCka*oZ_Srs4~T=3%2#)aT6aQ6T=s73^SnQRepM1 zHM5Z;kKd0m-(g}?)8rp(WjjGen;(7Y{%GhLe)Q-0_)Lg5!k(nHu!sE)UvnqW2c5I! zcHHoX>yV;cD27Az)4gD40v&Jzowd#~u`k%1O-0ke`dKHJnO!N|X#bc>ePn5xlvJPr7 zY(4^B#IM@FMI+~4fuG#%C+;K@&HiVreZ|u`%_NYnh8_ev6Zls*usiAz_?QMB5-JKD zldf;up7JSB_de}WL_~g#yI-`Se=c*dgUUE`(MUId>3%TL0rUX%kGv}gOy|@A(Y=gfb82?o%Wup zY0+P*oy~<@gMMxsU3k4O*_jzl%Z_W15@#;#asop!s23;brDwyUmtN+J2BY2j_s=Ok zr!rI2Y3uWyb!a*FtVgMlM>phiWNDHFHoB_{r|CNTpq8@~{w+)I{|{ZqvlJ$JmO{VU zr=wdkvXi6_=LV9ZhxQFjlxgo{A1G%z^c%~eY;DelTeY+3-kU&q-3UuE?a_1J|98;I z3?xSy>qh(Z*hc#sHtUpng**pdX4gyn!LVP7(p6)wxJ6Coj2!j(2vE^qJD@hx%LXyb8tD>tT3!Eja6-&TciP5-2S2fjwQDZ_TSl)l zpUXJS=oQ;|ko9Rf1z!zu7kLX_g|3*$i%=up=Hh~~&BZ67cS51=u!}mjnnfaaTdCfW zq?$!v=tF|;e$R6ErC5ucE~qAch6rT5JR!>r-+ub&7bnQx@0dI%`y_+W<0=DE3V%Bc$y(dXiaJci6ECuV>Y@`Ik>{M{G@dNZhv1}y8u5Gbv@0yK= z_GmWVe#*;6N@Vp@vJPTR_8;sAHF^JDn|x2OImwR(HTn7A{Ul#+A7Z4EK9CQyh3a`e z++7yw!6KtjvHQgAvf$$F^|BZL+EtA%rT$!G6I&8w(?Wx=2~_iQx7|F%$64BL*6{HF zcSv;j0!1G7PXo8(zWYn#UcCdnP%o3H{xvJ%m7e+Y=FUnC%d_5I)Aqy_ zs)}89Q@;E_kj4RbZ)cLXw^JH@L&GBeu3+P;zdae!t)F;n#7CbDp$UZZ?dbo-lQNY+ zoz3W9St3Vt)cOs|U##)Ey|a&6(pQQ)EPo8vohhE z#_^C4ccST*8$|MLe$f~X{0g2?ehU-B+^J5;D-q`6AX6gCWZQgUvc2m;nLLdU<%KU% zg-_c+6|(jRs1t@p2gzzfZ$ZHngcSu-kf%RR(biKgi(%g4B* z%&u`=VKIBgg8(Zm5A!=+VVR}BC&LFovsT^AuCPo!%)G4w$CaA@IcqIUZ|-9b{b-zb zJ8!IA*xPx1936<~IC({6Sr@p^0#}14z$>&1H#W)>SEK-w&&){DICeV*z~5k5u8gVtQ|38wi2yw{4@QF4r8Ui<~zIT z3LiLTSADI?%3C!}ip0ro&hmsLkWtx5EHhsH%>y%M+C*3Wz)Xx0e=%Ntcf8!#R{uA~ zwwy0!KRR?vg;1@S3dC8%=)eJobEFi1-4gpc*qp-r2)4It21JRlLUOCob+ zjvq$14rSi+9F!~YIbPkn1c2g*cnUCr43 z4tIAMs*BkbhAemU?)*rPj$L)CiadKto6UCF1=dPgyE`Q?S96jp(>WrPJ+)c^lg@op zZz`abADsGB0SaQt)DH`2u~Q_TWuvnbk7@8iah@rlx4#aOt`gh|K8}&%M-4)6KK?a- zHhbI)j7jJoP>;pD2DXnW(RSmNyWcK}b=dK*?8}!moVrT7!d%IN3SDFy#@||ePl<%f zx2bUKr?ECAQ{xKkE|8^sv`w77)3l*qaOj4*n$fJqg}H3NxBIp9GCk=O4?i+A;5)v^ zqVYa+FytwSdN5=S7);%Bz#I&LDRrZf^e^0Pb0_g@K^NaFp}wI>TGLYsu+}^))4_|FF@Fzs@a>-~4O0u8{HC_m47KJj zwIQ9bhdlN3nC;zCBDOmW1vI&K(Y@Edn=7OEbwOb7u{hN@TzkWoW3mKtQ<%0NEaALq z+q42FVtYWfO1@ACf0NDi9V+~?2JZ_Ao|<0ZybyoD;YBFPE5OXQ0m4;qtyV?>Eo{4t z1S`80Gmr1<8=*YCRW{jo=g|?jn$p@CImmlR z@Syu$!tfHuivIV~^{5E=l zk3mpFZ0(8#&IG*!1}vdkGP4VqrfipM!LCT;e6TLK1FRaWu10^Wy0#jVhdJxhF^AG- z96uIklzbJ*1IJ{j65;wQ;AK=&QZ6D%Cbzi;9aBqb+hc~4$acx9tQNu91Z=?%cZ08k zQ>d#M&STQ4Qh{?X%zF(C794%m?=}^4AXv|nX&wCVsvN?pMAfthZ92u? zlwpKy93j+Rwb%W{LHz|)P&ruOh+39Dx0a>txb+lL24(GsrRD*UGea^5yd-hEcC25! z*$q@tF=zKXsCPl!3F@mNbHPrGMKIpXgLcRZQQX{rPYgySYmPLu!~x)%Z{Gv-KxXt%<2Ws0SCc2UPE&?SZdbP zI@u{#gF~>VeG0ZCE0t=gdx1p3<_YfpW4@oo>V8LU`T)Yt1=|yLKiHaSRZ$)4QH|XU z%X4aF%Oc#m?PfQ4H^cJfbqnkURJ{PIGRLpV-FSVO)T&otmZ8#Z-~P8|%PDs6wx?>j z8@OZIrfO8vh}LWlT+T<^)Us`3Niyx@B3fErea1omwkT>Sn?J6>^%Uhk3?9`f;a3d` z(3JS-(U8*UB<>+T^oaZ`U}^Q)!{Z}~+&&&oNH?cb%^MeKp@fh>h|JnZ|6N?*^i72^ z-VI$c9ad(`Ddvh66G%j#@k%5(9 zKQlk86dmwGk6byoNr7{tk4wMi@bOHhs{qw^6(;G{w7_hBnE*B-p|`+)*r*HTNGt7j z&Tm%W45F&mfRDk33z`=&K_4UUgB_i3CA|gQ$ob(_qltMDtJS}n9BIkOA+rfkh*I?i zc!P~QBvXx7Xa0A0M$0qcW#B>Zlp-m=LYmWClctJK&FHX%%Q2C*AuZCL4{F+nz}dK? zZM7TtP&R=>pkLaqz*z-7{VYV+y_{;9b{UL8oFjGhI9(r9J#L;aWM=3IOyg1F5`tlB z%vIus6GJmpwO7F|&bZR{1>DB`fXo1K%0X~2`r2(B3LMqfk~!>h1X{LqJDcuB{2jF& z43tjbn@pdYSV`vkcQbuTi8M8HlmteuP^SVc4-d!`P^10|)TnQW5H*V?UxAk;3?zwG z<&x;m^2rR6dYYPPeNKUE&u=Tm7iiu68_Ja|n!FF9-^uTwUTxjxTr|AIDRD&BK_bWM zk>7_P)nno0C9sGVx*5EXadxe2IZu1)#+_{+*9Xki;bZzGq~H!8Bb29S7)jhhx|dAr z{CE{VZxUGgoOa7$e@h-ZOo+^XPEJ8?p2i65U5}L|O)gd8=|$qj)a+xRu8wR1RoQtb zIyB*O?!Y|Xjvv>83mFG8yA(M8^zYJwF`BCUWy=(3$$>AnC2EohEq&LJ*RQw963DtN z@-3*VJayq%lftjvK_ZWQ?Trl>36U*J)uk1 zbG1_J5E{~&j$A|;D9gj(k_3i}4>@W2S~ypFTx`dS(cr^WXf`aa#}M8DEY?8*Y#QTz zYs>Ke#CuBl+P8Y}pq(>Cs|Qob48^72$`Rsej#$)!#X4Ny2P$*dxR}_rfED8dat|nA zrEYXqlzasEBCKj$LNC*7&Yw4K7Ba}LeW#+Hbx3GeL5JMs?^KLwbBU3k-j=QWGTV3f zZTXsyT11uJUAaDYN!c*{T#W1Sktdf(PXg3rBzX{gmpq(*nbms7gUZD1AbF2&{Vt#9 zp%|%k6uln26r00BPy_u0F42K`zg$1I0ovdjmn#QKGTK2H-uXbd2Crin!D>1{WlM|iXzaZ@@v!tY# zD;;ySRc|Nyf8DE`5;oYF`o$-E^ zzt{}=^wEi*yWwRTj{mUXc`8v~P)bjbV8(xxQ8(yNtT~jK_wCiDG%EHg> zHkT!da^clnnkD;{oa1hDY3L5nsv@RGoxV)R>fcb{R6Cz@D7;wkn2)33sUdE0ZCim! zYI5Y256mu?wiVcRkgSuGrxfQw)knGOw2FI7H!!JV7AcLh%-;Gt$g|*iO2l zWU+RVEw|#|~@+4RsX`Dn-H^9x29E-?>|^0!PA@uR&c%t{L5z-6UJizY}ibtYw`e zaq9ejIXIsT-`bDLNY61UJ@Ts?tJZXM-uvL zU%W`_gP{wLAIgn12wXut?lq&_3!7BrDK_?|QGeiW{9U85@i!-guvgiq*y00|9X72_ zZ_P>Nxy0HzO%wdiOYnC$!J+{q=>Kh6cBC%l?}Dou<-b)io(P)R2&UmqVAy;Cyvsy% z)QhObK%4Um!H|CzjMRt*;?ju58=NeQz%XjkHn69O;J6n-Yq+9CzZMMnKYOz%Qi%v2 z#-$NFuc$fcU~}>r?!24@zM>44fvhDVLs#Vyy88b@y_2s0#ExcC7@BBBPi}-%ixi#! z!~PdPE{fD4g~hmvNMXC8rtn6zK1pH$rMM3Ak9^S^vPA~V|B}MU_IO`z+p)6b}4F5nf~M2 z)`d<=={y!qWXK?tIlMkHUY%rvy7|d=up3zGUNuaX$U<;9(%$?&rait9zUbNuU(c3( zxNd=Z!TqZ9anZ>5v61bI*pXsgMp-S)PSGM%Up_++UqI{)DIlhtUeC3GHbtTHTq#jDy zZ|x*{OYcDXxf{sFHt-U%5gt~+Cbda&71*$j_H1cv@nEecqF5GyB6}R8U@PL;3>I38yTwL~VG7_*o7ALA}!LWhXlB?jLJN|0pr$ zE_TBh#bA_|+PxEPYSY1RsyjOJ+a)%&rR7sw>ZbN;S!x+X-O{GEtXyi14Xd8=5_wTG zV0*0BTvi=~ld>dtZ*35IabbKP6OF3!tRFbNwe z=3F)s4*afJw%mnVPt;BVdzd^-^73#Tk~ZF=XSJZOt}BYPFdEQXwxDm9FX-EDLEkAW z=oo(1DDN+NK|P}x9G}e4lKZY3+Aw&Umu@kBZrR^+%ibSSa!gMcf=kOjT~YhCjgkdB z@~W`SfxCMGq?s1eMbgkk%F^s=iuk;jRF5gPh=aj!s;etdmzzxyxniDVO@F<`&Bz|5 zXp&py2x5~bzNvJ5=nwhe#r{b;#C+(;BEQ_0==&xdJ>FL)HbZO`z%!)u!9&`Q@MvzZwG>&^elIK&EGPMpZQvb)6C+rYZ>%R zXKd2^r_-Ezl>hXzB6^y$+|>DR=H^UO=hJc%VArED((5_Swuz5_YSwNW&x7UOS&-hI z6?;5XJqxk{491VB6~4mi3!9nhq)5_B=nH8Y!A>r9Gp~6yfK;TjyRLlb>~1-D7uaAv zvpekPNs%mjNKWQKxf`GA3(Dqs7>-lTJZ}I*o#(kme9vrvubt;bhEN>p4(zb#x)KJgD%zqg(Z(!b0GZoKj zS0O&sBr^M`BrQhY4E*%C-!;=#2sMuU`ncQ#`GUZl{fTPTyRsEq^v{Vb+P``g{ni9 zi_=FDB{>`|y6c8)S&mc92>V@f4NHzJx8wn!8v9;RS9V%r^m=tvSz$w53~GGi6p4?sm70qKu6O=QOKxn*1957+)07N;>3TP_-tAwv zxoB>k!_-Nrg`mdW(vp)`*-)*l^AdFuYA~pAu2Cd(TkBo0+In{Zm3)>Z-*vm*k+U3P z9>3WF_F@K6Zw)QSw1VTF?(rC;SSzR|>v3M>bdOHo#T>BiTJ2Z6%Sce49r*>+s(WM| zCd>2f%@|%YKvg-%kJ*{V(2l3+9)r-3 z;cO|WCXTb;)ae%+1VPnQcYrOy%(n{IExAIz0(-j{mYd$DBhAtlKiVDDXmc!>kD`QC zyk>6;+(Bx;Q{bd?{ONtkr;Inr6xY2;M&rItQs319PrHQ8@*9)~B??7l0jWBid~Qo0S7rZiGfQ~JiH^fvCReZ&1yeKV!>Jyuix z#Yd;aNvdsp>sl+i<*8Zg5FUw@O6@towiPZ6aUn2kAr3h2sHAQ|>NBTUgJwIY3sm~Q zo1k_Jslrrm72#e2XjXs(+;%b-`{A`3=jF=KD|5iC&Y9lxu< z=_3nqrjybt@SgbYk>4xGeV?(%CFO)Sf2KeFSSN7ZBPT0JzunYC*_Ad~X8gKm2g5`7 z=ExteXl8rwSY){a7LjKDDSmvYFrB%t_;xpQ0W390(RtjFT}45sa@rF%2dsTza>{~t zB}VYx_W0TlQjD*6!qHO@?g8(Coi`%{yTMVo?|_A#sn;+@O})z?DhtQCPa6I=78WJy z;6L7xeYtE=F{8iouY>>4S9#3VuaM!m8X)Zp!N-w`w(#i^I5gpO4o&oU+AT8C`qWK{ z#%SW(XZ6?Cpq@p)6I4BRxr+&(TXzYldh7`Bp0xKrONi`Fi0quH)*=5FG(wfN-iMiD z$^|&P!+|N_pw#Yc=C5vUI_Esc5%q8XrS4KGkq1E?B{IIk?Ft*~?b$}yu7Ow^PR($C zoaqT$wkvEVB-+yR1PmKi&2(fKJw=WmMQJO;Oms{B@;qsL6g4mKycSqx?#aczNG+IG z_iM(CM71QnV1Je^{UHscg!@3{K*MirD;o&5KoaM25jE?5`NQ?`2|aVT*&(y^4zo1V zbB@S10{)|I>}`sT>izr?T}f`~WB4;+hsRmmqxkXbezWBIm^#py?%GdV&HV6nRis+_ zMkw{C$7LVXY~Rd@@(Uji`ld~kyASBxv_zudcsN-1+X82*b~x|yp+ed6J90vn7f9rL z?NAos)(&MKs2xh}gSMA{+4UceTm2U+9X#%0M}DpDhh5y@V%8x`ztY92iln!~jqf;a zjjt{Y)8F?8Z>OXB1iZ`$&jC+(+8{GA;nB`=6NEwF`3Q@yoh$@ZOgjB|1~C}}QN`p< zS4=AYCo%b$fT}$F1{Nm%SwL#|Co_B2Ms+pfqPoQ6pf;-PpR}i7d<0c(S}y~BSB|d0 ztqUawz-Q4VcKxiP{T%<>xGp`hY^mLUvD8suFPB;%r*O3kXhS;Y@&aMpDDAZkd5!5t zdH+{W;n;%5ZGla0%VjHiN}xO23NC;>y;C+@vTmAq{g~y~CCC2*zbZG}YD4Rl_%}zk z{x8;jNkm~Y6Zt^?fPHy?VP7!kL$7^}S{fH=X!`UIxoch3j#0mrsU4%C3{KhZCQr{C zf|<(RexS1V<8th+AqSzVz5W-lWx}>+UAxLVB$vcT2T=&)eS&@1so1evs&w5mf*@KcC+3iJjx7 zuu-BplGjhB;AoXFn>lAc*}?ZEPU+NIg)#rBR~I_%oY7OGh3r}FHudvD_F~bJF-9o% zb#al4zqr`WSBOrvRtAB(M6njU+DP3fH~UE4&$1}K5TWiASLkHIqi$fa{}q~qTFM^A zWsTRzq;Z0VTMfk+agIv~gi7)S1a6g=-@$G$>0+Y0+%Rdf$E24aDgU>F#r}6(CZ+Im zWl{r!ljTzIti&(rVPV2J956w4gT*P9OXT(;+3GLEa?~KP(5aHJb6X-oFXdZXP(B5Dy=y)Z%mGeH|T?mkubXu|_-QV8`In2tKx#xKyaaYJ?0LaskCS5AQx`1uKmB;c zNOf3$EiPrxP(@W}qfw{Bqj|Cd_qA@(tESqb_XT6+nT7*d(xS^QH$c6#asjTz(JI+U zBN;4}y#&gYuPJ(lti`Vg27IAEDC7Gy6DUubq^tL6xeQbW3KTRTDjfU-FE%A#=9PRlBo&M;U~%fkqgh&V@-#=LWvj4N$wb)TL2c0R;Kk^o zx)bu`2HfYf?l2eZ4xUsrQLpi$zB)kE)(E^n`Vw0xXQ9tbIoaTX1O`n)3*Cga5Ly%Z z1T6ARcA^XFPN*a~S%tLwujN{>1~?q-%#pkIz(F*;vnv*IWMaRJ02i3#4|&OVBt-Fb-K#nWZ4TwI1awTeF!(l-R{Tozs+l5V2yOlLDro$(%Z%RLERLz z2vl9=q>C3|x>WZBP_?yp!3It*`5ElwpQQ7hw|rJj5}okW%(K>OR#PPaZ{I(kmoG$)5?j$A-MtE7Ko#oQ|Cp=MN#ti&_f@6K>!Bd!L%d z-=sk{zd7Lkre|I6H{ZIyDXyo#A=>XukUDZp{X*wu6YW7aNQ(w;kni1CZf-~{L|;^_ zStPwn8tD)*NlHPr&A$QaHuoRE%gtQtC9fvCH7-|^eKLM>Il~HeTA;h^!&fI>y_(o+ zT?6XG>k=xp+{CM_QiEy7Tz0G8BWnql(>!(?t5&Jb8U}@O&K}C&fL7iCl;p^9uTFGE zcKpwk-67STk>UB9Y@w>FW&G~_LT4Dim#cG~U{t0yFM*9GO}%pZ0JjSDd{7(pmo65z z(B{Uote`gP$u555VzZXEk>3n9j_)6NBre*mVLYoOxLX@mF7oUpKSI*3sIV1-mw)eb z31)aX2bXq5HyNBPkAj^@=v`0~J_+i59Ao07(;zmS$(rftH1aq*EK(tljgwJ^tSci$ zXkg>aYu#{{nFe9B1IlSr=nOI4;wveU2`l1hpaRKg{Ay2cBtPP8N4*udEi`+kW`Jr$ z%xG6=^!`%tzZnsuHc@Lfi^f$qb4~B|>Cl;shy~K&ELx{gX`hiuCq}+<#`SUP=O4Qw zK9WaoJq?%62R4BtDbH2y3!Sdi-4xk(zII$|aO+IxFsL@h+8qj=IqrRn*PLxHTaeul zTPK>{cUpAI&?p}%px&4CBlwIOs$MX~%$FC=*8Y|YlR&)|>i%=+f^^2YhmYlS zrgP;KUb)-~RcJQN?Em&id?ZBmFUF-UWV@m&U@J{=*iv<2q4Q1_it5n4+=Lsu zo=^5eZ=S%S2Z~qGMcSN7y9WP`CNzmgrD7Nd|#!GK}!=bW_VH zMUtz@ZhR_h6F9*~ZRQ{~x)(Y(seO7RAD5V^&aZCjl`ihKo0wBENLAGnj--cD{16 zBM|DVMSCM3cFHw8)$M2-Qc^eZ{qFDkK}z=T+@Bb!0oxzMrEH(3sD=E_jrCIqw$~mO z7kTP=HS*nj1!2@K5xG~buTya9wRgXQItur{QrkT@1At?2-`o?~cU7x3PAJ2uR?}{z zu4D^dsn~3e#7b@VloQB~#wI)p)=2`Y%_h_f?&{s>560%=FR0Mw4U-Bmg*;_47kZRYQTEoyX&94kvTmh2q&#q(>(0=jRltI;SjJj-2A zi0Ho0LR8&%Gxz`<-fyz6x6VRux~9;1SbM^Qe6T7UZL)9%yF&2m3mf);MiKra&MLzH zxVDf}5#1$lo$Us@g4%CQP^6=KC|-UbqDt~J1l53x`q=#6r4bTNhbO!ZliGTO}q3j=BY_)En~Z)nL$Lq{fX%_$<< z52se^6j1GPwQjO1$@uu_+OwNx%VW6p^y`zZd!xDu_Z!&P|8Oms@^pMOinX#^jV{*)J!uClWAc7r;6PI1Gv?Q6qLb;Au+H{lk78cy7B zX?NOiOy*5|-Cg%|*Zqv^e$EZQTiwKy(a**+(+zh!ZXK?lcf&1IH{tfW;bytv&gyT& z&33~*t8fJ@}flqI6IpR_V9zVeqsLjMA2NH$DYD*#pddoAIG6R2Z`( z*mc!B%~c%nMdCtrgSutd4Ul64aQnCYc{74I1PK=rC>$>fo}(mH>Nz>U0@SgTQZ5eACntA&>Cg|X_cWs_@#{RApz~!@3-t#Ju=QJL$ za=2bz#H+Qe!maYUL4LqpRrceq>U_jiRJzff?FuuqGLy6Wjl~rDro`mFT6CX=pxSAFA zXej^erT$10a`yu+)h4nSf{ZrtiJPTMAT-o04d&xAPTFk&>p8#4@1VYKxjSBVOlEjZ z-xJGHWRI7XO=Q+)_tb|0izxop4$1eBp8@<4YS~rtY%-(&Q#rrV^}1 z+%SLV=;2|_^P-v4!U+bd^cLPp3D)%saj9_Cm10!zP9mkW4f-s z$TWOa`N@CSb`L{ARemxbIZaCQjPlbPqDtwvu9Q~tx`n(lwI@&QN{dF(G-WlxldGt~ z;k(!m&<@KV_mRVdY!Nu9nNn4#^i7|dG^O67wv*@y>Js`P`C+sQ>JM)2nVvU(%nIsZ z88(KxkZHKJtDFn!7O?2EUHcTuL0l!eAuRSR(ru3yI?o#xE%#Vd2xnp}(q{Z31Z~DY zNg@2WCgo?Z5=vy`NZWt@B3Tr#T>n|dqRMH%+VH$4i^Ma)T$>4h-{g$-+t{a4m> zNS(UXuUk-H;&Ca48=;KfJRYcF<~O+p;^36u-4tQW_i##WGbapVa^!y6ZH<(Z-mf^G z3BPnT_z#%}cPh(=xU;zk;TzDd3%%iS=HjtdO#cP8V4u=lP#efbgY26I`>W0h)$nblq)U9>!A3S+ypiy;4|R)zEOp;kB{oU$I@3PK8eDv z=Cwzj!aiXtXs4HreUP-ZBtNaKc&@@)kSw~1YJu5a;-k2v zp%Dy?63BKxa}sRloH5siG2PGH1lvFVOfb_wH>AfaPTKGF&o|=KK5-0q9(mplsx2;$ z{@5xl?|a#~8Zh)jF?x#Z9~kgra1#WJc{Qk-fNc zWdQ$mMQk=0TS3~T#AFV_o5izb<$}gbi&C{Ul*-Luxdo!v+(3&V>k8RNV56!t;v*|v zzT25WC^_=FWlVfvhEx|d|E-nlK%Ljj2KyQIf9#bvJk6H(La^9B(^Z9r;L^&TuBe54 zGa-7U?u1;~1)(xCbe?Q(?TxZ;d9|g+h|j!;FQD63Mh*mv(;w%A0_Q`tw|FN(rf2K$ zx*8w5XYO4YID@VzbVFOM7jj-)raNvCYK32`V=?j(#^g9cliUb51e`g1MS0WXnUNLs4)U~&4J%%t2> zedv{Hr2fdLHQQ{dT&Br2M7&34emi4jZJjNyy#woL&LlgjTATo#dlo#?WqIrcpHu{_N2DMw733lS4 z^C~PL{@?uB=|_VqZ}2fL{*kqD#UeizT4h{|4%qvRvsfVzm3VT(%Tt1!*EfDh8eE zDPznl8fGP=0_u|NNzf_`k9!8Y8x~uRJpqRO3x;JGE8SvTn&a(?T7MH0 ztt~0=3Wg$g!$+Dkhi!vSu4+!wTYzg)bT*}4K z1}Dn`u)h%=@#3hrJQl}7H;y|XCHsGT(Qj(veq0*IRD&F;18???s42By^Ng=Ey~rMe zq|(0-4Ez7U;#v*q+lk8>n3vfUQkHwgoXlAQmG2F5HP|p~&i+UAnuYj?&n_eFmr2lX zGg*GcOC@8aO{FEsIq+riW}bK*F3smKgOg}(QQ?j`aRBrVDcFzkQ(OTTWNk}q-DqP)Xd17&#C)i8@DRR`=!RD;0F zy)}}um#Jho^s|%A8VLflK^m=9Lu$u0+WDbWfH4UkgQHQhSuN4A(G9xG4I0M}V?pcV z@YYSP<6B$9?D7G&;9vulq^;vuh+ZR5Met%5Zv)%gMUEYbGMyb**|G*&VvK1*y--YCU$}9_y+s%38(veo@L|pWySzx}K+;yUv2c`16x($J= z4ME+g`2*&=1F-8rxc&m4HjH`*x)!R;LQaO?+v zo&)dxS?9n3TRW4ZJLZR@-M2Ws3?LFMB<@L3wn;14k! z7_l1ZiPcU>F|jIn^v0gD@A2lp|kh%ykf-ic)*KZVxGui$N8tUErC8s^J)0 za-M!+H|rQTqt*VqWR3dBldQ3^ADmgT#%b&-S(9nudYt7~eyS$enjhPRrbVD$sPdGQ z98j)bc|t7)Psgf5B0DT=9tO|NJCiW6%CHB|0w1FD8y{!sazpE#h0djc{cMHg@|<=K z_s*q9zIH1TnPtE$1JO>VepU=uTyz->&E{tv(U@RXi_{Bw^ z6*@x+Fx3t4CGH-&RA0(r5nZakayMJq2d%fI(=c2x)9XWx^bX}-wvwO7ksI_UoWFTyX0KzNf`@z4+d`o&pH6t#K$*sGL zd8RJZTFG9G1x3UY-QbCOoOBhDb@0E2WUF~OZoif6CZH~%z7DD_Y=tY?=WxEElC(z3 z^{il5P|N-l*z>=!zp6@e5%tj5hy0G^qeiCNeOjreqge-4*Tpiwv-?X%gQ7CI##DKs zTzJrKK$#9|H(B&O-J}M1!w7AjyZ~Va9v2?6(*2fO#|du5779tL(0K-73qqQZ|$cV-^yjKiKF7P#M-Ayl>pD^rmf!{Q#{+n@^4$ zC!lV+*zEpLrC66L`-067o@rn&v!aW-X+~m%=L0E1W@5tAM;<$Bm#99Jg?QYSvCU1$ zuIWnVPgaHof!c2-F+Bc7hRk5x@MHT++i!mC%1F)s)NcwA*;4>JWH*C(o}R$e!S`Hq z$Z)50{2fIyvX{%Qs0PEakVyXAGd$||xBw>4S5>JLPjPnGzX?5~3vyk*PD5R9nlJ|EqXb;n+eP$?Q1z1T-hsjCLXQ zDO$3B+NVCVvA-QI9RO|v)x5r6KBI(ZryQ_((s$@06im0Rek=VcT)mXl%c1W8TblG%dFd6#1&yY7HdyRGLV|jl z@*Z5ODNZstSyq5t*s}U4_?2T~c*~37%LE%kTB63VZHvjWL~vOJc9^V9){B)nFf<=GUtHB{^2t#MheO3AY7W! zXAMr4m7v~1d<<-BB3SQ5(1BdI)5I~dC?$viZX_fYvD_?A#-(w+Zje(O;CW=G7Gdq~ z@{hc@MnF>idLCHpf8=eOnSHoynJ2ns4yM{N*93Vp&@TQBz){EK?NcwlnUFNTjbL+@ z3!F4Brpazh?Vu?4I)e=_QTvcTJs}iK=ZOJqMD=28vI)jr|4;6^W$v_id-GayWU6_t zD$q+-Yic~tx(^JSYw-Ns8t4rcMBhw*F2Qu(x-xf3@$j=rrYPbwcS(8f1|}KvHg&2@ zXXML~0s13T*!^B%CqUA|z77`G{c3tbq>Zt>PEWGBX+e48&~qk}=y!KZPKGiCBghOM z*7}0|SY09f6XVbupc;pq%%Cw2H3S=AOS=l}VE10m=Js_mBCqnlk;%^QUUq(jq}eG9 zXkC89BtkcTcEzQ_Fwo#+c?#4ki#C928>)oGM^(Rt(l{sRREf6P(YT^q$7ixk#Vd;- z3qWm+pMwv8eQ4AAlUK}7I>{m2syZ!^!ThdH%2KbWJRy~>a=_6ua412RNdb{maV<>C zZ9v^?Tg)#tJNJP)g`W>v-TQNIE||(0QY~LIFzjFMS|hH(rR96j;AEKwwuNV(g6-{T zfptl;FI82jrg{l;A0Jwz1ziI@zN&TP(oVi}NS6<6^ckYo|1nN%8 z6QHVfk;))btWT4oFU{#$Aj=uKE6OWSbrb1E^#!x4kbc55Z)qRak?&@#Z2uEfzh&x| zGUnj~V-w$(6fHTQd#wI|8YEOh8*j&!&mUJ zT=|?83NnsGvEKpe7W?>ckTVBrGM=C2 zn#~45Qn{E0hST;PuA~NP_;xhOE@7qo9#cg04+!-}E zNR36cKB$(}3qakOdLO9M(YdbwJD_fNKMAV%UQpBG1Q+*#O{s<9$IyREp6)uoq_OsT(S(kum;`s8xWd97*BxYHu=%Ur>?6ajT;2b=Km*?qeV+=Rf=Zh zpO+-pLe$=F0NBd;US@-O`R`j`edmVNN5Is$)h8PVxrtrx{cRd_UL*W5upW|Hy;;!S z|EpIQRgLypnU?51A>@z5N1az6z`9tQN0EEFR}*oevAc@!x1NSfju3+>=-FlnxqkOdWZUKG=hq(nex{Az?_J*b6WE~G^d@@7F@XByarpPRa|2(08Zjb zNIig%)f)MvlA3@WG8gV2F_b6Ks(NP|9)!A@>vub}337e)3b_YtPufesT6EpJ6lIN1jEPh!B zf&P34eUx()A5BTIz^0gL9>e3l%6QbC!}ztyTm14vL)TOYCB{thK1vjf7X9{EcE>b( zyJoyTpc%>vd>v;l+w|4ZhoAWWOk9|CJXZtLYdGnxy6L|j;Y^dY@n>mMI3X*+!bH7d zguLy-5zAY>WcyOL4*3n>i4MZO!A=1}!;Nwl_Lm@g+{g)f$tp+6k}cy%ZfcRS9qLT* zgw*Ij1y(8rEXIUQfUL;G@$rElGLz8pW4jc|4v{#|^dYRb2KXpw@Q%0*PJhWkQS9({B2&M>y4R`U$+M5W#G)zQeT*U?*o*-on6IY{a0FKwsjdze>1 z@6Lk69I#c5ZSPbJypZg@?_fI&m~5YSh)3iy0|zAjT*{fSdz~)YH0HZO!t3j*@qInt z*LthsZ{g5KOMd{nAiJ$(?ZOb++9jRo-Ep^e-Q!$$8`u3IZk|>tJx}$oZgMVI!`Upi zf#>N(qKo*bpTHx^B)E_7YTV=LoFC*c$!pRKWc-irb21C#5(6{kDG0@G;J5j%L!ci( z2KVUo!v<&PXP9dR?SmQKGogkp-MSF!^yfp(!{ig8w@diys47Mu@m&+8>4b*Gdi{=j z{fv8eI(&QAUNw^xu{Q)yMm--0~_;cVZCBsu3oJ5d}0 z>Q%yX!Q0p;wAoD}F1Al-i%lXYfSKqbSQFPPvNfs~+RMa%f{pE=~ zV~XHq8}H5Iq=;)9;mzZuqG(#*Xp$Uc7`AU77objMq5hA9V@l+I4vtkz+`+LGA8k|Y;20ly#*yzCAgfC$=5WnqliH@LsO{Our17PSjofJS!Z*(c5#(#L=D( z;B&B3E+I}Ei1a*EmYc>!J%UbYPH(+@pBB(f|Mdv_O&@d;FYSYZmj`)=i^F~309Ikc zS0KA~wwfbTuVhLfqah`op<{gkdSkBD{TS58Xpe#CYDe0EpY?+940xs<`2h6V{4lF0 zlVLMdrqWC5h4=ceM>yT&FoLfRmDhtEiETPqGsTWel(8_HwfU>;bUjGI(481cZcw3J zbo#IoPR3Q_#**Zq88FlqR=JlpvPset?4;);;8(fvVK!tPsEa3PHx{17J8k z_n6IU)r`KvlLkB?K>`y#sZg{|2uBwP|)_pG4 z@E|K@6w3;{nOKx=WIs}&OSI&x+SxLVD07jDrQo?_@pmxR3d^cXF20`J7LwaU#JxNR z^p!ldw2dY}HLd^FQO;cE%3HXr)HXem=BSOQ(wD0h4t8md;zP++k-l!}94`O7f&POG zwFXsjc^o`bhCYGbRu47~M4oe`-i@knpO6-yvifE)l56#>vgWH&*U@cLR`u03wTG}} zN_d&d8Hly1+_W|B{cuL-Z1fKuvM0$6U^`d2FH1yTf?TH&ywZ+}*SEUqKewYw=&V$u zrlxRY%*t*kfFc`zlNyXwg#nu*n5RW-Wp;e$og1kr@a_waj6!vb?3h=BJLioW7g;%5zulRd z*+=Qw6#$KXiz-I;9+p9n7SVX>-J=tg?eSDcvJAVrx|18d=%&K~Sq#0A zrKd!PRo{~%<37meEt%v&%F;2-S;^RdbTZ9rj1kPLkd%%tzerobe)N4iYE1T znohc=9`=XmKy}utrVEl);|0m;qeR}VxfM+xml~ljRvSUT!B!o40#tQm71)AQe*)XM z6XUWnOZx{HcP^nXP4dPa(q#O3CXTjh$4T``(d0ShbgW7RTlWt&b+=IX~WMwVn>bYcvl_p!>G_SmJ9KSj!so^0yGHjR2 z!Hb=K@*G&5KJjg^9_}Mx{e<_8-M?t4ep}Oi3Ew&~z8^dvuDk)Nu{vRx#q(W!+{F!G zWt}9}j1FB}i`PSNtFl$`p`de<^NS1uFOKUKsT1Az#f6o0)}t0d`2%unK9|TN&-*5R z!6DuADs!BycsPDMd0x+s)J!JL7OVf!e(P)PdhNG#*|+}%*~Ukg zbo=ZHSF!42C{lMM@)iHI6G@e2rBuBPgb?A;%{0q$cYr}BNH-Od&mq)J1Zk47>_;_{ zwyKbhp7!F8l0GWv+`+(oFZf$R3Hh+iKU+qQW`311XT8q^Paycr^-{DyALZ(8yt=aR zls5+HWW>#i?u*}@9lf`I<#1|p#5Qn!qih=flj5J{;n(Pq^M>WgWn*=5s8pT+_07k? zIF=H?Qc#y<_F0T}JCu5M*Pl^aQzT?5F=(kgJ)bWAER=$!h#c z3ZKGMl{n=~Bi0w=xG2=kdjYM?Kw}M*fxvr|i6LP&WrdT~P0o8osz-~u@4X`$da!l8 z3>aS3X(x|Atp>SMsMZf&5!af^U3+?F+;}sf*9NqBQ6qq_X=sv6- z!ZkYP3g9|9Dkw#FhMdlc@749?5Aj6@=I*Jy`Xni&>sX&UktRpeTcil1{~vqgu!^i? z>`#>kp24o+e`j=jB!_p5*W#*`Vb%SZt^a3;&1jT$C!q-HxzL_`m;<6O@^NjIHxt8& zWg}He#IBccDJiprWcx7TZ{OrQ1ucd?YTJ-Dir*ix-y9@YW~Z~MAX#TI-rI2I@dsuJ z-Q>|{X|q*y*fTpKFQz3wi=&}luy83CqVhA@NEo$-d=EAPt4y|d38;3SDd2VB2^X)K zqRn@OybE>>>oP?w?$~`y8aI~;S1_v~ZKl#&Hvu?v{7HMYD zp;Xt7rzIbM?s!H*tIJzPOTa!f**ppI1ZIhB2ODQB*zVH{_bLRijzh|x7Gz&xi97-} zF4vVLYFF|m#M|gZil^I7B*%0jG7_i0n!OAhuYE^ebZZ+n!rl0s4h5y$Cru~8L!~(X z8PD2KzFaU9^Oig`gWgRE1uh{6auYh2^T6@o4sfIfsB9Cu?|GZhEKqw+w~c!}XG+90 z=unVuD4ss%c~+w5f(=-S{upedeNM@PHL6PES>*;%wb5+7u^Mf$kCGWbtH=6||2=-D zL~4|EU_Bx=Vn6*)-A+oRrrYhvX3}e$IA$Do_aBu^dJsJZbPZU@O6EOaU8mRT>EOdU zpw@no{+`Nik(}=|k;~=5(((_53teE*bKYYZ85ikCe^`f-%+2^%RdRym~;~(+sYUJqnCrudP+EbvF%`-SAxz9*}c))2|2TT$k*`coVnUE$oCAJwIb_Q zOU9BQ8(VwJ7_dEQZ3I7w@6Cl9(swDku59Cf0FST07YR82RU2?K_zDS`EbWMQYs5#5 zOk75<;ro7;yvs*r-&eEbYd&r)E5MsxXsy3%m$TZR^!=;^hCXia*htX);8(K}RC|eg z*WECd9?3M#Mb)AA`9af+uRk--M$==(M?U&Y(qE(RD;iz1Gxu20GwRZUce;QXPQd(F zZ>cUJ+^spIYq~3p>5(k;;-N=wYQn2-uv?^}t#~`{<;U43LU_ep9Lb0MK0lReU z1&}BzN)asAM)|#;nR9j*<$CY^{l2f?Kl_2uHX}U)Q^19 zr0Ti-Ws(3YGX6s-Db$qUaN+B+&>hNtS+;h)rRu=ZG=Nqsg)cF?kGbYGYBUdTL0SI< zo`S_!;*5KzSB@G~$BYQkQZ@5u@#1zL@fO6(obp%L^RPvt6jUa*b5wX0^~s;*=G#$g z@~y_f40ml-I>?#4a6-!(Ph-X=Ns{f~UNg)66WA-L*ZXgj!1u2yYc-Qd>{7W1Y{xF5 z`#{;cT4gdhu-0VK#1xrK%3mqA?vj3`+SsHUh>J~{^s0=sUR8a;_JJF}N@Ho@Yjqp3 zLEIX+4Lo5WQ^nCrjaCA_s=~tdM=Cq`3L=Gef<4bV5R_$hW3tZ{?PG%X#)5a7VBJ-( z6wd?^-WfFVy+n>W~qQ~HBtw~7)WtJ@iNYhAbi2E;-28ZR|PmiB`9 zW>Tqdia{|)H3QpmY;!2s+dqjZVYUCAe757g$%7Ww+jT#JH%iZN%^H*>Jws@1v9(0( zy(8v!cJVasKCa+@qt=do9~YlS)tZXV>fEp{PW!JUa+<7itw#YQuTRCMPEpoJ;PU2_D`NHvo2Xqc2$cUwVo$sm<4;lo^owv z>rF7dz*OLbq)3Wemj~DyA{98CzuPCxd`BiiA0XU_Yw7Di5wP6NMs9P}%C!-k!aw)Z zS?tB^P=IASgTK;fMGt_tV|q1t$IJm-4mPJv-UD_>+V-mK2H8YdlKl~s5mm=`<(==< zh2YHvdD$F(O($2za9Po}_A|Y?BG9ar~`6 zoJF9V50`^7@w5wU1BO2;wg%J8{{fD)0tcR64OvVE±;bX2-TY8)Gzq)boDAvFN#m7%E_#$W~s)c_Q~aOsdZFK zMwDqGmb5ymsav&3J8e7qbDUwHF6vkJ3r|Wcwr4i{j4s9Z)^2C`imu^I+N@NW{nl=L z0i3SJ@@KQM`?GD=xwRR~GxKK*R{ho>XWo^0xoSPHmZKQH14kqIL$-?vSED`!?*Yfv zi<)B_$ZNlFbHJfQ%daXvrwt}QkX@dNEw{gQQjWTTC&B#Jo)Kp4Wa@=+6qo;Y@cqL5 z(S}0x60f8ryY#IgqUm#|Va%i%^qE;0m%ddqn&he`Ul{sM0foNhpwQQThoNsRxIXL0 zFPYLa7x_U|t~21$({lU)*`B%bOIdOss9Jv|8^{N$hro;IzEi#~wr(Xp6ZAY3(eDKG zG1jd-tUUh`yU?^$Zz_a;jf*1vqH!cWEE4b>NpJVor_7cz?nHu?A}@&uYB|~&$|df- zs>15Jos=%{;3MVQX~9FphI1q!=^NO?hV3@sWGORv3OD`9LQ7ho>k6!jv)LT0lZ*}~G5P*8BLYVq zOh&CmDetxwIJZsJU4=i}N^n+Z=H#nk--{Jtwg9P#P65V`;!#H$jVuo3tG&buGk@D> zW<1$WX#coR<^3RLz^AG^C^PUAz>}m{6W<Wp4j95;U+blP5&lIPT&)HvwO|jp7Hpw(!B^E`J%bne`zDRXK zr3G2eaqElIGdCWT@u1%>(%qu7vPV@up1Ro-w)00lJ>aZ<_NzQ6GV7#q&Qdil&8dkj z%2Z2#V#2z`3_6Tpo^-DM5%jTEwa;&FdTMpTNyWj2L?cY=CvASSPh)%eHy0J=AqI2 zBP!B*>v<9*doJIon@PSA<%Qr5OXjkL*PIYY4>1a0Hdfy$TUaY{m}~p`Q?beR zJa#`6MbgbWWaw)~P1U}6?4ntZ=(OyF1aE36dKGZQuVxO1|Dr;M(0QyqliwWo<52W2U&x=JctxENq# zGCC_d&5~;7XfV4sNL9Og|1-?1qTC_@q{8RQC6(7SVNYVmg!K%lBgqF7YJJ-i4+axg z5p9uh6I|>^WqRtt4~z2o!uLyJN3OglSnZoY$vXH_L?sYAkXR1=)w~du0X^%(ySUB7 z>vYKI*XX1ig*C<@jo@HH;;LHfV34GVHH9WwXM>I}7?)@|Y7OUvj>1TOQ(uCRL5P~w zRM-hF9a}J;gpQB!+b>0hi)MPC+s$NVBxqaX z*hA96cdtl$(Dsdx%rI!BkF);X!H2WxKrjBdzHdcfTt=!$;7eAyv+Vf03Qk`rGZow@ zav-sTZ#hk~S3EyavXs9|f^Jdu`yPIPOr%NK{w@iRBZ)K&PVWdlV^y%fOB!ityi@+G zKc_a>B7r*v`%%uIT_A$&)so0MWO5!#Xy!~2k*296`~5ia*QN2VuSavTd)M(dD-7b4l&ZU$Z@4Zpk7~zYqw`5&f3u{TYe5K1CcJr$0N{`O3N?reB}o%-_LrCC zsj}A#tfUgHzZ0Tt)2q`+tCp7%$Ey84$M2_p)WnWH%%v1}Au-i9r)QX9_ExH5Vr^Ec zq$uu4Dthg5!1UpsMvxf|_E&0^wUDWO*_#!oc+JR5(uue%In^^hjdnp$W8YBtWEl>N zq9-9yQRX0yKlC=iKQUEBE^dScbi)rNRx)P{%@=y^h?XQ5pAWcpVXo6Rty_*~AC-n0 ziPU)0PAM#eXZ+Hrz}YzcoRnIjM~mwgIsM|vDLtxX4aEX(>JHuA1x2qudy9mCZXJc zq>)x>X40va`_mI$^FESjTU`FY>GDdB?&=p6dU?Zl*y)EnQ=Kv3!Qyyn`}v}Wq1smUt3 zSf^9-E%$N3luoVMx5_8VVuF^dE(v-Pn=av1QPxg*Y1cz$}ce^0l_<0?!!$yHjbM-N`C2pb7sh2<0sYT49kjXr4- z3qdG7dOK~NM0*_R$67!#{gE+|s!1iQJ*o~?XLsbk^5oNQzjcn*p#~CfF zc`FHu$~D|IwMqHSCUp^ecYAuw2-Jp}BtqSL^yw5(W&XJ2<{><8Bhur1%}sZGB9>aN zv47=7h|6QOz&|2bk#Q14`Kh0vIy||Rl~}^Tyio+0KmH&dDgzGZlG$u)OKiu`<0a`JJxS~!rDArRmSM(A9Xwfxw}520dQ?S#HqY%a z%=io0xB4qWkPM}sez7Q^j97eA{T-Ra$&7^btMc*zWQN%h866+6#Qe^*(y&aG$+ zq~lCQ%e*BLkv4a0g_T>YIjqOhxeTdgXkADpdFsc=0u@D9ZB=CJT1Qu04a>DgLat!K zt$trm8K2nq*Nz$?wVx58{y3|VP=Tw7aU#o+P*Wc@JykkS`NOuZlhb zfKE7sdeBo50n%(>`$W-@$lvWlhYuePAVO4oLzphr&erNEO9{Iy)f=vLwaYWZQopHo zzu~NW?^b)Q{!Z6Bp=iD9G<3b|G<3b|kGoPzUG08d?TpZ+(vkh%EdNsNP;9E*qY=Fn zrIB#7+EI`Z2Ad*U^4KNQ&}XPchJ;Z!j7zc;uy$_65=N$ZgpfJIPrfp@ORC*9R=ZtI z?M4^5;U{ZZBc%}$Lt?^#$@&suX{Ah ziWG((PsCPV1y#1XIIF}8wbHiYDyw6nciw~WlzZ@W$)95D2L9{BbTz_GZy=|z7t<0y`Z@b?)3zN>vbf(>QPQVE@tx86`*O+qC zle?zoO2$ajIGrK3*&6pV>}y-PMl%=?%QaCCj`&FHU+L>k5ks9-4p%(Tz9JsXnTqOn z1zct(d11GOe;sgNt;Kmq0taMP4b_Ewc~g~cPrTM84|zzFZhLKvBGbrFnWBA1(E1yQ zjfD~(MZ<T@Ylsytj9gLM2jcc3Noc`vL*xR z{^|X7X=44qKidE6$!6?5QTu2^I3Y#=y??e=?AnpU_Qa!g|4ei>Wxs-S|Jl)QE!O=r zUue4jZ0Qlw>HPzdf^xsx`&;l*HW^DdkQt|93A-wmklVA$v!itb^1a&)=+AU7Kq%S^ z=p=M6pp%H}1;oGYzv%`tkLdk98vjE#@K?P6b+bLu?f*SSbucm|N?r3wqT3U_{$Gak zp4M3JRXhg3dSy2YTRF9C`qir~S`A7`P}zFaO8;wVVYt743lNzpc!qgv7+eghXw{VA!RJmLU_JrJ<3g2J!pcc0$9E0W$&> z$v8=J!VEC7sMis+8Iq-i&pl99(SRONx50ohKeLcT>5+9iJOG1o_3K$tTQyRfW!}sc zna#$OIY~~MM~7S(WC`V&*jiq}$)7G}qbX}ZrkXr|7mRv!3reGb@Kw;Px=^BkT`e@E zjkNcbokW~}g`*8blp7RB(irGd#;o2tV_jZO$BeX7PF0~-ayj?6FZ=zZQ@x8#U0)ia z)i=3JjxMsup&A)a$+x1OV%-{YAsw}0rOG1NhC102FWJprfw(O`nygw8F0@Kyl6a@o zL~QQOFyS4q!sQgKQPgG`+?_s=;SG`$_nnp+Mo4i|^RAZ&oP5_!B|7%fQq#uoOTeBF z$|7$zM>VX>V@NGhS*TH3BUz@k ze@tL=PD1dry4%yj>@sF=LdW#5^)Y)BvNJf^Ec1$+S*304?GM?_Q`v_>12Vn0(X@X# zhnRNM?FX?rMCk^hB{qNPIXPipLTzR^wzs{G$mv->-Zpu{zJy3iZ*O~fR@my?+N@q~ z*Q=KZr(R=OWFfKNFE(3#=?G=V@8i;geY;rQ##iNdOMM)CKg+$>xrLYJ^iY^H^J`zc zWx{qV(mZ-tO>O7-MQoz%l^tg9(E#-dc&hAe&^uQ2ilS>@PPWcd!G>Y$EVgl62p%sl%Y!#|6iC6PpW>~-PSnn3(s9*W3nVQa{?s8T(j@bKWsjWN~uhh*-ga-rF zW8f@5PN%DN7KQ5k(l9=C2dbw*xfZ=`88pfZ&7HQpPsme`5r2&5XG9M;IixY8JGmwaC(b^WT-Ch?3s zwSy;eF-W_nVXF!p42tK+M_v5EpfljA4moNdeS293j=5beMvHOgj~oO zRZ&2keV6Ga{smMy3`$PdZ^+fx@ z8db)BlE_F=Nwie+N;~Q{bTWMR16YZDedTh%0o=Yb?8&abd zXEHktWeHZa43gU+%ubO>t-{s-{6D^*pqAWK$JQ%`*4-%YZPyU#ve(4ytGSyYB z!#EHbpq7K;-}>Y>=%C&UZ`p{UHbYv|-8%S@=@O!T7K%7MMg1ig zY-}X8ie%Y`_z6B1_7_+znu$mF`JKa7OLbh^u$3B|ywY6RlxlzK%s(_LS6#^Cj%-7G z02JSmsrFX)V^zdR?mT@?Am=Fe9M}p=2BnB(`(g( zRn}c91+rbgk z#;Ki5ZF~y$torx0vCnkGx;B&zQ@u+p<13(0UB^Fi!%3>W->tC}5g%_w!nlzcpca7Q#q?l; zGjI5ae05rPIPH2d^~6(6;GuXiJ>(LX>Xh(?L6H;SZB0Y)^MlRD7N0pNuNU zM% zMNeOT8f}dWQ`H;-;-GB4Rc_Tq_YUB^;)HrF=q5>~NEJ5YU z5GzOf7wXy<8wE!^mx9M+Y)sM)k0K#Fg=|!h@T@uiy#rPyz4n&)4LYcweWRN8<5_C` z9&zK9Y!^E9K08N^I`19*XR!|vX4 zS3(%Xm`woL*eSKVQpl_KfpRzNYOtK6f$o~OQ73$1)|cgI;6dK#&M}Ry18JyMaP4Bt zUsdb7-glkfnYUt4*x8jh_(Z2>L61gtn@^`YWQ6nMps+OtA-U*`u=Op?xBr=@`RaYw z4H)Cf1gFhnbhZDLMc?44{u=qz9XHV?=APv?j^_zP&+-0D zWQsMQ?#8pj);>=s|9t zWA_Q?s#7luTgCL)mxAY2IgZ~B(KIvkIu6731g0HilU>5e#T=vbNxRLk)Er(e%CRD} zmxM?Pn+R<8L)Gx|ur*4`0NzY%OdSzsYyCiVB}gULeGU#twwBbj8%N{tS*mXERbgwS zuw}qC!s7GQ7Et&W`aArGZ>NGufANBP{~uxNUaCNi`6pzN$rNy)vEz{m7M55 ze53o)6E}tN2v4p2G)c@Je7)Ul+TOJwH=e3{Kyh%t9el}}q2}BYw*KjxQ>h9ji+OWj z-E=U?mooWnM7*^GguJF{^) zZeL#Iukz%deEiqiSvLFhTy=;id4U->m)XBgDpNh@g{?DjkU#D&+D6igXEg$NGtwH^#EH1b}oq6pDlS*H(HH^mX#yIn zy}T${9{{85zW`PopI5)70i`FwSm{6fbLl@ajHmQ-9~1`uU6p|4D5f4@g>{Cy0PK+| z9mTha_H&F55<+LIB|L0pjaA#gMoH%)^xK?ap{!hgg1zMhRr(M*fKNw(JsQ+aPqx2G zx4(GFl23VcyR+|YTJ>iBwVQpGZr8g*5$5$}Dz$)s3aE0bz7z(JJZOHk&anm!Wd{-PRn6)5vJ->Bw<%GD?Q%B+X= zC|4sS)dlTc2~PQfUOCP`jxDT6Z(#2>gd||agckBC-W2z^#JbbTP`lTaU75t;rGaHN z_IK_}a?Z&ulRNsX;AGP0ye00c_iK06&b&9yKHKSe^Oc#-_2E8^>YiML*jT;=Pb!Nu ztA*AcXJSEp4wD+@5G(eZQ~!O_JT>NV6giRXQbqkCf4cd z{3pZK2H&Gq&iwmsFIW8*hplze7lfCDIm9U$tWE3V^!@Iluru|kafNkh%fi+TmNl>L zwx`0@TA%-5y3I&z>(CoJh?-~|X7~)9a3IZ*BJJzTN2waE*hQnYl>p|7))i5rPHmbWp_Ih&LAAu&k z@D=z3oN(&z-PW+~vDd;}Ba^)2$<+ynOUfJ4;Ve-L!Qmv5_NLg=T)F}tBiUU~psL4P zYc?lDtYU^KNfApQG$4y~y@kv4(0azp%utQhLK(EpQJ}&|LFf`^b7V(OhUugAn+rMi zT0f#;R?xV8;T@S12|B~S{8{(bPTM^rTB?z6g{=m1dC3g~$^x_Yu@*XL`h*c$&2bTzL0B(=7B}lwQ2=eX8l8b z3P$wgb)Ha`qjJ{JpZM@~a14PWvMeTb`*4ZIpqL@0O~% z=9|J+V+I6uHJdS4eRxy2{atK_m_MclW^fS+y8f8tK>A)@89)Jhz9+hKjG6|XlRQ~+ zuFyHpeP86SMzsOOfIJlp`)2J?mlNn5d9}oLw|>XC2^VK1>b*l0`W0TQ=5FO(;B9FG zqkFfVo>x>As97I~)_F*60&k;u=YA-bw)LyJ=OYo>MRhyCMwYcsrF=rZG`kjRKwUFN zpk0WUBf{r_;*sYz@Dyv2dKc{Kn`o)fr^1dJXVbS&DMTu;~VCfF;!Ye=MPU>~eA zQEksrZMQI$*MqLXbpq}73_;f%L(X-_;G<(m^&CM5WtL8FfnkfWY8`;eVtRg zv%b(7);P0-FWl_{(x+yA6}FyB=M8UVAAgc*71d6gX&sW)A^r>^Hp?#Cm!nF)7Tw3} z187r)tHGy<|7|B49c=SW*t!y2_Fii%FN22VuEt)#YV5d!Cl%Cf<%J~6clVQO+-Z%h zoct$_cFY%_6h|EM-T9b%%(w27U3!rHu}a+|gxse_f@cOkXKb9wx$w7$orvsb?3KaZ zeX0gLHQ)_^A0*b7fA@jf@kPORqQM(&R zU;N8y+{I_+s%bne<3@zVV5zl0tp}fEWPRO!nNzD#zk~e}$DpJK{8W&yF8p44o%_@x zuw5F|n8Y&FfZ@0k53pA{36~zq_k*Fv2LI)MBG(Q%p~{JQbu~XSoh(Di8R;d~jCM@U zS!~j_WgCT$2_78JpqvPDHd%t~s%B`XgR(i99hJ<5ElVmv)7JfqVTkDD^#rsdn&8iF z;1mMwL#9xli9Ukm8j7aZUwR%exIY#elvQs3s{A29uCTzi`@7oH(v0& z^f;fW8n6`2I0hUT`Gf;IW^##bZ(^+mjSm+}j9<0TLv{7McGLd_*BTh_FS74EEi^&A zx>t%bHl_;?F)1r7yOV(C<|YD~iOGkBiIg5}2QJrmliFi&PDP3JsBc@MGrfLJ!JIEj zFg+%#Aj@&RaahsH6f0AyP>Ge7Y8)`7!pdvq1sL=SC=C0?jkoog_}QTRKMxd!eFTgg;!@2 z&@7rpV0`jw*+kh*EklNKRbzgOG30uJuE_P!e-)@Zc~pQ;^~b>lu9%%<#A&q}&i2b( zwG_#dyY%Y8YS@#OTB64qgFuO2@5bMB!sJ5~IUP_ZE$yH>~urIXIt{ z&4kbzRg+UjoF7?0oo#SziO@vSa09P=w9dTvSk?o+fq~i}2xs66-n&dM`L6`H=We_NzHW3RPZV z3EkRqbrv`jNqin`!`kUiu&XuM+1RULo-^aBAN{I(k(9bd4F#()N;X|Ogl!c>(vr>~ zLDu8n%gjrEY42KXMJLz`_d4ZUzCXhW^%<0@jwvp&>dlJ67F8Ig`TAy0=W5LotEunh zq`4zYnZdk~SP_dlbHE;ST3f-3$?${{)P=l0ia@3Hvbq!O!i(#{0^j;n)#I8nmeLOs z<>Dr%$ISEd)s0O{tny&8nPHbDJ#|HC3I0_EsNq+YSrrV|Iyb1BTqbSIH#I}ekDy7! zvoyOVow1$9SZ$95df|>z`bL+vT%KF4dX;&h?n_HZP$6EWd*X!@>i1UgLU1=Ida+%l$kt?b zaOk)*|LeUuYBiB|)bPK+Zp;NVaN2&^ccil^y;GK2T2*2_mbHB0YT0wu!Pf?BcHu&G zc@ruiG-K{0aT}WMZi8Zqx5<AYSR%^XFv0c}0${!sgWHxQ?OxSwk}X>TO1HKi(8dgQxb1XwAK7C`9{s_Si*YYDxNmM&QDT3JJ3a?>We2u8lBDaN6lkFAHo8#!~#QaXi8KoeEly`@a2FCG+W&gGvLXdMD z`Gwolm8ijIBRVS726^x(D$&pe0O+jnMzZlqX!KJnb@N=%vCGvux|uj^y9KWy+KM-9imJHjXKy ziD;(a++UayG>!&fik)Zb$~phZGgDwoLqk=8jR>WhQ~9DzR<(;~$ZVIOhg^d8Qrl%2 z=8(QyODdmyqT(`+$Q0j=iRvJMp2&1}zF>k)O#qLl^d38(Tzxij z1`N0)PmSzc!Weh1QeY?U-2Mn`@#jX55A&$N zw*MP7O_Fp4s=gF@to4do2_g@3dziAd|M#gKwK1qW_%J2OD60Dj$Cs^ReA#LTNZCgB zbjvn@fRt@DNd8V}T9-UEnwFZZN@)U3D4BcIE}qY?f05l%9ItE9OzM)L+rjED)HwOX zU*#`=2z)SV!E(f6TFuWC;Oop4EuVEnJ`{80-vQ%`WT$W zOJh$i(HkIFft{_#)o)bws8nq3*fjDXs;jxjW+F zsAIoQH#mV-(GntGZL; zNZUYUY7$lb!I7kWXc!A=O3~6zU;~?Xb5yKNWvJ4=qy>TAcE+O-xJ48&1b!h1f#Gu@ zF!K|)=1kY5CX&!)RQR``*!k`HnUZgH*G`U>@JnvOueu3eF<45z%}Y3{+_bd;&{&w+EW=67{2`FBb?5Un`%IDZLY`@k4sM{6S0Ztrsn#g~@x6eum@ z04OQg2y-ljqqT+VV6+L`XsNc8tyoDDXrCVIQ*W|Ve-iBI@^>t<-nrokX=dQRd(3QK&7$yxZJ;pRNre z-T!SKscq;7yQ>L95Czd(Q;wu;9nVEZ5#^sgIGMB)b$`Zau6nA1?7lYBAU(Dtdpc;obaOoffU1yVXn#;;^y5 z^6v3+kJZyXmfAl>1~H)#V*N-v=&bf#01Kp_o~0tA=+N}orc8Cc&~U)9)Y9AJ@z{$| zjB0{BMk?=B`!N1<)jZ;I&EQ5b@2|%ZIrn=MMeFN+mtsA-$$P;2KSuEbM^Y^ITDBU? zz@}OqzDVe%{mwpu?o%OCYHm(E-PKS$S5sVMMnFu6xreW7Y{g9^Fy*g_&z@yxj9^{|(bskS8yaXPCD zFLR6kh+F&_Jdh30kH#0gEPY|DpbOnP(?g!LMbSUhxUUPXoWj`Hbhh+`j7_~!&*;lV z&Z4#Um|JTvWB9emd)#A8tkxcnC-^F#b#KBabIAG^)9x#F}m0ul9g_>3xnHExpe|^>?s!v{^z3t1X&cDPo(v#J^r$enU9E zCwf8iE?14c8Z%y9GN!~DC2j9T)$?!C$oBF;gms0J{Uh7$+l(#Ihnrqf^Cw7a8%JDP z+dMGFh#8VU)#V5>m9UO~Qk|N4gD8!U|IWOca`^WYsjyX=ppL5e zO4Hs~J8kp#<*Rv5$Xi3*hp)I~)e@JPhF8_H+W3}qG{VYqUNhC47@JRcEsln;I`JyH zdTCCtyG+^r4>V8O8|E__m6Lsd145g4tu2|pX)?|8tf#9DGp;kdXaS$AVk+{jI9_y% zJF8L5RM-zZH&wIGLeH#F5AanW7xhqp6#pLha6Nw8VZ$S?yG@XvZ%}o;yC(Um#r9f z@BV=-VF_djOCYNg?5v7SE4&v+Ls-q@&t`N?YeBieX|f+$YWPx_f4Gqc z_b^f_xVD6Qqc}AOHe)dKKG=;HKe6z=aD0wxdR>X$F#iH5|L*{wXRtJTJcA|P+iIz< zPcx;cYOXhn9uvW1IE?X`<;;Bf^gOkWc&dMlz1?zZTKexiP&B2&$BcYBR0riFLA75g+|c!jlBmETBSaD1=jZ2IB5hUy05Qq1qv#9KtU)Ddsl zyvE+=>cVVqzd9xI1pLpERFb>j%Q~ub_ggCS1(DF*p~vd1#3Y$iuO7< ziToz0aSNm#CYlLeA06`e$>!5#U~~UD_Dw!j{u0H{iv;XR=CwpFmVUGnW07O1K7;`AufUvl$fh^q6ufE24;jWV5ZbQrjc$W&1ycc@XMTc9rOQ-X$g_;%*Z z;l?zzgr|jS+wr1Lr@NEhp_;i<4GlB?f`&hqc^uz(gA4iovgA9H%FFCK)r7}HmLhkU z#ykL&;@$lhNn;9Wb~3}Gi}woOc85!1#urbuOlhtS_F?=h z6x@Fl3cN0Z4m{npchaTtZsr@0!G{RPSLkfFLTAq?;RbGc$~i|6lRMK8GdG@?G!^Bw z8p8`h&%FPU9;SKuGBrszGL>;B18wY>37|BrhtxR!EmGTw%Mdp8t`h4x8Aq=sFc%AE z*xkm0Sq$FBfxd-4$4+XQqx#)LqSh{THaME|*^6{SxoRtMX`#VcCDv1@_myB7?`;D| z6YuMkSf8WD+uU1X{fqaS+=o#L4hPSKprz_Kw0g06pSUb#C*N|*UBYe82$Fm+NVNc^Gbr~qFelaM_SZ>PTq+Q!6-x=Gy zQBXCTU19}MZ7&>!>0YZo(PVn6$#fWBRJzQbLilXyFIK3LWKpON^Pnjiz2q{h#~h&TlF4IyRh#scrN7DgR=kaxCf=LVdo1dI}1MsMS*vF$SCl0L79J807{j83yK0C zgPIlvJ|7gt{(+0ZhfTaEDBAktIBorjAxyOOBciQ8G1|H;GS3=Wk=5Djq1o-a1Yz}01VpUouR&>* zcO=HF=kl~^=K8Nh49hXg4H45_B4QdkR-_{v(N@0jij;!Ad={4SFi-^OPBo5ybJdH) zrMh>5Vkrk+L@bg}!1pAo;ggWy2D1zaK9=(r`>6I=iE283v{kqBs?4%DiO$%0*X61w zh&LyGZ=&jl-5gQB^Pn+lM^=cHUZV!Ncq=GM_+=Nr2ic;eN?$@FVk0QE>}8>C74h@v zQ%Z<6VrXZBR}fzUN*NwB?>UD9Ba>CuO8QI^?F`=o=mk=Br+HvPWaQ zx(pma{9SMh7RJ(5CD!-B8hfG3SFRh|2H(;anR3hG($>{dcQy879_v-sXCn9+zf-`p z$IXkf6gJ@%D1(UCz~<4BTY;JFDg)>>gNH>gu=zbI8m$ONjgHAgME16UvY@rp%`;Q2 z+K#EC&U=jyDf}{*N$PD;UH|y!=mt*R8L3H5&F{mK)m&Z@d*mtaqSR>Y;@R+SgI1uGC4}oGoN?)Wj3Lxwr?Pr zUZ*&X$VB@4(3__8FM4UarJu%gDgBDSD*Yy2lG4BAeSDPCAC0h=J;IC)+~zG~(yRl; zq_N<%h~28V^5?6uzEW-&s^veSYjqr5(yZ3=T$kAPkH5yLB^ylX-gOiFOyVT;4cM9% z|30ocKYc7uwcTip_yOQ)^c8c#=V)SQY%&YiyTKlG5FaJ#L%d|S;`D(^{GLLz~W-@fGoT-H42TY%+(eE;vS1sQ$U4aeuf~YMJb-}(IXUTPYlbpUM zWwNK6e}eq8HPOjhb$xTEmiD3!@lbsKgh(Vd1ZT{smxCEI>gC|B{Og&zmlM|J`gV24 z`+B^~15rIG&?-Z(&t3M#+`lJBEyaId%Iw(O(idtbh0Is4kYM+?UT=pkY9;4sM0)nB zDWF)nn?UJ1zW!suQdIvB;2bpV{C`DLO3pV%Dw1N8so!WK!b)c68>^p5KaYMT<3q#s zU7CbKHHNqh6z>J40Xz>%1NaD(2H^jQIztBcsc|2Rt{+TX?kK($lo^;!U_1W*!Tj&s z;cJtlTJdU-hd;U>)etY`?AV0tt#P?GRv+Wb&KOV3}t+*wC50Rm9A0!cghHdxgD31Cy9%^&-a_-V11KIt&1}rG#_A( z*bn;Ex3q~y84sCfOi@tdb87Qsbalez< zXJ11V;@@V(pYWSY#Mk#JwDMz0J0Pq@iRH|HVy}FOJK+6^*YY zZA7wN>Sl8raT)zCQxo|xHtzm&%kqksPGQdWESM2QCi?fL+0Uppq*SOT7$BvfDCbK+G2kBn#h{4%V1&2^l>TTID9?+L84>PN z!D}GrZNF1I9I$_R&4|WnAH_1M#rkiLHS@9G*?(w$zS>AUz)`kOobn5< zE{JOwN3%6Qb<=T;;A0NN4FPT^qAl;O>byhJ9USC=Sl-(ldqpXItL`0!VX;f^@R{G4 zSjsqO0&$Vs?N0g9$vM%%$Dhso%2-!WuV#>Rch!q*WEg!8D00JQUY+J(%vM+Hr|pQ9 zyq?!$t?kdn^HhEN!<)f};3?iKRHp(2D;DJUx9pE=SeyNZQm)P%Qq#ptOzF z{!;5gviaHXtm?I+KrO|{FH`Gznp$0B|KfHB?oB*&2fvzJWt!+$_s^uc>u8S|znOm+ z0ocD8nw^%*sv5I&`+Mvk+;Nd~uDYL3E>;JV$Of4?;AG3ysbTsL@w;@;eM$P0(Zmm# zzYoxrWM>>UiAh&-*kz3wKukz7KK%J(g6qx7?+zfI3>aQcOj32E*+^}b2bBJ6P%O8h zDTW)S_RcAsAh9CBn_fME(betl4L*FokJRJ(o5NI{sc!8zx*sm%_WwpYWYoLEA15dFZr=b z4wEFQ=|oCG=IDhFmmZ7cak6L{nN>=m@ID~L77I=Ea8qjd1iX0FAa@PeAg(_&^U9s^I{xX@m( zVf&3%1s?h33Nm~xa~)4(d;B-uJkq{^|R zD;kuVqnM9-fp5G(lN|T2iwTr-qJA5=Tv zY?YPE%f1=;>R1A;a652;Jg}yzo55oP&+O)o0G!9w5o>PMt6iWRWN4XJiqU?znhxUD zKs^Dr=Ibq>e0>;flXUyriJ{S|T|YIQDtR z|e;4(>Svcf3G?`m!&$|Gw(aE2r>^xw|VP_KLZ?D}z^_;gv{uf#3655G70BorV9v z1!^C!6mhycSOUtc?&VR@SB=x)Y+ki_rK#Lz-dSZ|n`q^yX~$9Qoe!O%rt{wkneTs= zYTskoA3MGX$K2F*9=5=5Pev)NA@IiMxY!Aut6CE)ERLRMGcIdV%v~uuF~?qfM!rff zhcjv}FQ@2qomjfh@UUgGvF2V9wq_Z(1Tq_wcR1nsJ%AJMM(JMf%xv&kL*JGcoVH)*p65(BwJPE)b+0K8)SXZvO~LcK8FbJ5 zX?@*6-PuT*@(T3|*bDbCDUDGCq6FKPyq>QH5o>^&yA+Ic-iT4&llv_a#0d|l^SNIv zPO1Izzc@XpR`Go?s%{I|S)3e34{oN_9bZ+7>vA%g)r8hBYH%fimN+Qb4R!<@SC?9^ zm2YccyAvkvQCvJWYK0#RP1dJioz;oybeK&=KjQFV;*^GJ5RulX>q+3T;Bv4FhdO@% zWm33fGoGUbQkt^% z?k5)%_jy&I|XB>+p(oq776qPTPEp$RW0GpzGan;-95db+C;1{X~OG1 z{Ic$qf2gN`Gh^5H1uAP=3dY3Hc7~fHz&^;&vtT*+A*c`OXSA0G^HpoGFL*t8n2sXd z**~c|FBoty_)b9ust!`)pKnVJjdo^^>XNH!en_(X^w~?boa-x^tqqF3ZW{Kd>W_z2jPbLX1`b$68S3}}Z7{N|_7RP)TaRG*pyqk=* z-Fu+*^)F%zntPz78(r~`II%hx#uVw~O2pTZdlKF2x%EBJrsw`_-Hv=WM{~uq$+0Y& zWARBQ$Jkj{V||*tnI*?xqdAs3tFQkq=V&?V>zYl+J(mQJ&yZqOL^IhVnb6r5^%lG1 zPLrUs`STsQPUNipNzwuCZLz3;)A?h0!+c#C{ko24^7U^0^`Qqf161b8N3~k?QC3s- z`b)oe%dW=ra*8IZX*AiHJdKg6-KE`No1B%6aC3sBW<~?cb;`v%VPOKRw z_6P321*aO5{#tMtX8EU}nB~8KjcE=gr-^WHQ73^X`hWG?T~zkwmR3$iifwLc#O+V$ zH?>&5_LTY%EcMOIS3eWzho8tKZG@tQ^lLD7?-+_hdCv42<=%4NZ&J1*S|9(RH0yRp|$F%9@C0FLu%^^0z z^7O0>PA|{o9uWG+R9DR^8Iy{e+M%(Dn@)wB`uSsxn4V8K}m^yf{i! zWAW+KQW9>9(t}R_)6$C6B|H#=>7U>(v1Kk9_kGsu>hp8tkC`g{T&d0XReP{)U^WsHL?*5vCd0h@K(U6lf-=nOG1$n$ zd7#L`M6fH#uLOHokJKFkcT4iShRBOERmxDZNq%44X%wl|ke#FY@F)`a)Xixeu~KrH z0g7zC0}d_aMqRmo(RfP`b&=|Nvh(2`eT(Wp%w&Hxcmm_0a`UdcgvZMj$VV-&zOUZp z6>%!`8(1oP)f%hC%<304aIZCY%`xb!bjD3;ja&|wqA*L8LF71|u-XRx2iTS#@IQYm>b9f@NO6z0)v^4*u zU&v$^ZKahnf9au|^i=8}&(u+x!zNhmME!MlqSDfyNHZzoWaaPao zlP9@t;;Uz^J!)pVM&vs0y49ncnxE2BR1IzPm?K-Uxf0&CpnGoDy8 zf4$F6nR`kxlL&Rhn<7%*fTFznj5EsmDo`5iy`VI+Prxdgy>%tkC365-rcT^BfK=N! z?66Rx-Fc;b@-u!&&vx4Su`j0bq(3*YYyrmy_Cbo=D=_pbqcd&?MQ3aTheAT@tBuY$ z4XnVd8UsqBbuAEblyy-Wtua9?8tn#NsgyqBCjuvF(N&o?TDmfnn8$!Pt1@6^P>q4=b7}h)4<}uT(=o4 zCHAMuj8x;LO{axtp}qN<(v~{G&d~(hUqgb8#(LKuxI=gE_Jg-6@nH8v8%O7{r@zf2umSsh84*J@4A_7!I<@Kdp9yM9b z17wOGCE-S?s8slt!wTQm9Bpgr&`9FuQEBgi+CEXZMy$LkopxYSmEdF>C zJcG^^?n>evtmGR5hzKL7_WQA=Cy2bQQD1@GNz0j+I51yzn`oY1 z0JcCHr-RMG72wI%4&}d5M$$V}Kd>0eM}V!Z3!Ko!6B??eM2eVrTMNpFFW*`5&Gtdg z*t>d{sbQBivwEn$Eqtu+>a)_oWN>9>?xmt_4RG0v@&T4Q}Tr#SoWzNerrI2nPk zvJO1x4!o-)$@cCC)v>qI6hrlUv_GX#bO0Bl<1SvfDzs?lEfY8z7keSwpO>#%-X@cU zD>zM1%57rjtNbaawSn;+VP9!h5n?CnOwaUB>bS3&dl91@~m@ zsqTwp=(v;-njiz;Wd7U1UCt??@#Ps#|5p}PsE*T1tx(lVcl{}i<#$OM6&W3T7e%46cEb^=bALfsXW>E(D z<8KZbC0>BbqU;e(^VL&CZ;s~E{a&HszPby*fV8&}_p!H3KKsZ0$QSgbJpk+TZ+xr4 z!Gr`Zc4rGMR$7;YJYf1;Y6kzdK#9H#7A1+l)`rf2MK}Qdjt7NB%XTJfUn>Q?4QKuz z*1iKes;X-{=gwp%JricqL*~wqgc=}JrC$_j3JFb6dIv$k*Dk%Qw9pQHgJ7Xauz|Em z6zL_w0!R&tAW9QOkoG_O-aA83-&g;&zO}OQoIdBCy3gMG>{C7{sCJM8?)m4*y9iU= zc3eRg9QZiPeuS`&Sc24M4Runf#awi@%&PZ{Q(lTVX_s%b9mpoN#vmd&*5AYY@VkBq zfqR(NBQ68d=p#T4X_J<4T7OSIWTb5f*f@(?Adb@x18UXrSd6iG1YW>Is(FXQP=7DV zuLK`7#i|4F^_hU#hv_VG)&Y}8B`h)4O~IO*vX^2N3DuWm)rNbW;_{$aBE++%(LP{D zq)$hpvf#Nr0c0k98RLt~T}}|*a6AgDZw$yyMM$vF3X>7(vdAK1X~Ht>Vpz*I12tuQ z2;GIFHnyR157b=^Gl@CYQ^KZgFVAd8RHj-?s!hCpNt>aDvwmh#wZeOG9e z@%BvqZAT}WeLEvwp0anp&!+o$F^ucs*(l;?qoU-U(7~~?%8e^g^yzZ!&NQKKs`ydl z(~y3txb1O!TYqLNDzmN3XicDo10btZRz=7$pSxU3R;7wf{x#)3H_yMO1k=w*z*hAt ztp=?Sb>+hN5^J2y`rxw!I*pjMSW%{}NfjTK>EaFIBMr=XTRmVKDS_8UbuD&dJ7a#Y zEIi#rrG;z3S1YyibSNIy(vHm6w_PkG78zOGq_i9~;*n6rF%%aVc)R@aAe&`>ip2XS z)tCZ@m(7Vcf};sL3NEv7b0NIWig+VQ=OF8kzzF?0qzFxEdOu9z=aMjm_}L}os0^Ab zWE}=k^ub`Z8VfEfR+V6wgv~){S@4Hm0nQc5dvhpeJ$^yK7|(zM8VbyMsz@)uQ%cz~ z%ZM&zEKs$Sc{r7-;V5Z1y^j>B<&Ba2C#y%Z4~Ow`78Xb!iS)lAeI+b8-Vcm@@@3#f zG%4tX&=eT@9x11MQOE2Q| z1)784c{s#Z{#55()5}06+O`0B_TL5GUn!o)j)s~18UU?Wc@ux;F?t%vb1-TN9I=T5 z5$j(r`WqRB0I*!_H#7WUW^fo8x**oyxSip~BGC(g)nU+PCKWf)bRgHJ2-pn%q%DTO zGqAjvN)v%>m?>pzs%Qzip+E3ZEb(iBobNJl2(a5WF!TLy(j?2ObB5y$QiO&2!%}4N zBWq*j{y0}iu+ChkVnnN$`>Cw_8XF#BoIi0v%`Ia-Op2F{`i}|K&poPnIPB~LEt9}= z!>f%oj%DZt^JE%A!}2i=Lit?U2-9LH6(D(XxbMdp^So0=FGfG`+(lG^UUr&s8mx@G z6(hOmbbry*7h%lDGhfoe(ra+l3`1+Y)f6l%WtLr5wfaLa z1$d}*4|zk-4my^oTYAvP^movU=5y50UtvLW_)gR;4?t(z_mc`z|z~XH|R}L zlPaUIS~LwIAu-%0_54*tbJwB~h;@h74z%+@q)WCh-=?<(U4>6S!g9URF?JuOF#L4s zaN|LoV8}rlN)l(7?)g}))WQGCU4 z<7FG;Sg{mwk2<-UyMjv8vmnT*sC;768=*L1sJl>!h$~;%%^v$aDA0o45#_;Myb^pa zv#U);7xQ%|(J~}sZLs~ontDs^lvz=YT*TwD3^mw|p4C_GLnZ66i!Sd$@p5>DDj^jd zLjw=52AFAvTvG4eE#p$m+U?ePB6C)j_K8X+_ubW%rP zI@b4*Ks?CHEGtFkHK>kDnh1%BG4gpWb@A$(k@FJ5lSQG7S=t|kAL35PrdGffSa|0H z*}R5L7GDdAr8DrdFs1sJT>5D4e!CpgbS31Z2&ounJ{97{10e}4&k2bP)g~XH0z}q_ zvFm%l7PdK@EmRg|)Wj>ZU!{tP`WOk5p4qsGEWXAdijv=kLaeP#on;*G>mjhRGWsSB z(jA)=IppJ{RH+tbhd^AV;8k^t&h?56tam>kVHxO>hkcU@9sEhu8_1V39I{|-ZJbi! zEo;B^J0M2%!ov>i6$3lJt>&b*u+8KxNm6XqMHNbwxZn6QN# z+}$~jVFUGIQ(}TA5A_)zrWqm=p76(M1rn79v2g%c1%k%Az?4{HxSZxbg%IgDWBxj- za)Qs@Bd8s)8NUSw>q+jA9BK@#YFmUCDnTwUJ9ODaQxH-f+^J81D!%(LaGS{S z%{>JLEP;TxPp66<2pCk%M*#%PI>TiZP!X_d@L`bzy12*C#8{Iq9wOK8IHA+UcE!;lptIknij%B$pc}$IahB)dO^W$}*Op0C83^Hm zO~%YB8!LZuwh5&{2nw@6z%FBU^l;MYvG@&{U^~&#SG*i6iV)j<_g1hh78;a2-$A?B zMqBjxIi_-m%eNFEaf+Bj8{R|5E1yGWZdND^gsy~SmX@AN6}zMGzIh3vnpjR-ht{9R zxHqK;0X+(qA|zArk04SKx)@SfXhuMC0NJcxCQBb6x;nE8&%wd0Li+`lu8yN&z{WgF z_@usU%>h`VM#v=F9)S>>>~RUNojm&!ueDog5wM|HEk*jB1o{=8vI*1ilEQyHp~ld` zMALV~VDR&*|C}nWq0@Cm3t#h#oHGS-*Dx)psmG3220%zZDBM_a3B1kN*?1~lvpBkd zfC<(3k$3ix{W2JkZdP+Er#SE!5SOAUAQ%VgpIOOk(?IEGBh?T;$zK647x^wC1aFXm zW2={=D+Z``F#O6>V-~w*gU~p%btr_p6YX~W0+sYwm z{GVV+v&uDIQCCxYV6PB=y(u5wSQ}RtDqhFnX&lZqH0lvTrx6lQ4S&U~3FkI5!bA0N zOmq&1d}UWY5k+3j?BgWQ?@SngSM*yoSas=NRs{R{BItWQhqS!OVjcXBpexXyPNZFb zfNNx(WI^U-pFZXc$9q}&skSH1czoy$jW9H8z&F&^H+0JUjtN$J?G{gC*d+%x;JpTi z1p;FSq|+$`)mPrf*0ZCBi~fL~TLd+@4e}Ph8DjA7@^(F+ArEirT}rMBbw$!Ih@HSq zQT)0EBCzRq@a3)t_7h8!$ROTLHX^DSwmNY)Rh;mTXSVnrhFhEHYPy1zAdkAk{Z`4Q z3te0RcH}V_7eDG2?frwYwCtKOIAn3YTR=#+_)9k!n&9AILbBjZ=5OqfK<(hmw5{g0 z#g(PJET>h`@CMfs1ou)t$8#&6ycthPiW|3%-lAc^OdtWqf}N8W3E zA>N8*9Lh+y&pG9(|C|e^p@`e({|@SAb&KwD-Me+;=Ds7!&1v*mIDKt%i@MR1mzZqE z1T{#zv6$R;H_W#0`hGj>mh!TfBg+{B__- z74phx%%ss`pvR`~IpO-;vT4(P2*c6)98C&yV>A`hhd|yJe+Opbq2u&$G(yITgUpXF zm?Ip$Jt3N@@En$;f&k*u^jV50jNV6Le!3_l!mU5Fz8KgSr(e87L+Y(~Ow5!>u2mbF z32bOSQFH}TL;VHNQwYrP^!2|`ZKyElWg9OP=?U>dQAU&-^S2+04Wj}J9(dt5KxJ-| zj1(HhQQ<%0waapj4oDC#V~U_sy$!*2@zDAoz>2{yA|g`H2^;RwZrpKzNk(9E4BlwD ztaNjy?Ecd4!E#-%YNaE?0}>OaF7(KQ_o9O37T3w>@Ng|gUw-+v!%&AC7Z!%g9wzI2G)} zvY1mZScZW0$MX}_FrKJkC9~sHfXFm4i+%uBhO{R($*o@r=>lXK=VBmw(N_#C_29tp zu~?yoh`zi*Us$62lxnZiZt)P$&&6=C$^T=Fv3JfYIvtvzVsEMwDQ0KO^k0|U}{MjeEvpc`z5 zgLDyC1w*cMI$FYdI}VGD3TG0%h5r-q9z(edH)yquG!W=T!l}S{`hrvSY-AiYDC>qo zZ?^1OIyIgK!o$z}OlCwgVj%E?wOiorhBT+oJP}9L%As`R2U$7B2U->0HHh+Xg<(QSFo%A_8y%bp8 z$&GN-myT;;iE_q|EhD9;)$op%2uDdJNa}~xs+%|}v&!L_s?!zSqCdBOi%M>tz5gz- zz@E3%s@bs_56Q$@AjZm3Cz~bEI(X8=X5Ux9Y21*#sG`UEJawPy7LWO+BM8Ihj?Am`T>=fOiP>2`P!XNv z(*D@aM-LKXroeO;WjbRLE8+h8M{Cuv?7E-0Z`nAP)X1XeRyr zPxyZy+_OC7@n9w$0;U6R0AEH~!|J%99Fikj<-UvhkBRa_LW3ENf`i5?C+P-MIRdZo- z%xi?H%G>=XaCBuyoW@z_Qy*Y62ZjykdT?@#rS3d!MerT#I{b<(*mfN6_r1#O>a&e` z$6H6vN8F+i_&xAPFnJF=>J~?U?>2FZZ-65o!)+ztGfmxML#8nZ>xvL?aCrnm^$G*f z%FJC02D+{(iT@ZB%y@3y40}ZLE^1_x=OXpk?wq9aGn%s{{K4js{%@sWaQTNAM08x< z&nS;~uWrpTQI+|MEZ&WUEFZpx22bNW1-HPu9^>;(Vlo00vcC~pA-rMCPw!6PS7ER^ z_`{bVyoEpWC3qUgm<$nY{Qg8*OY9B&@XlyBw7AVE9W_%lVJ0v*0H^PPE%6glbP;!` z`QvUpdb*B^fEAPpk#q+RiMr2u!mX3UQFE)mlPm`~9_lEE*6kVVYtzaN=_{VHAJiHY z6MAz$aK19bM@2W1Ven&y?@*AVEw*xt6oaHw)|=KToC@bAh>%fz{3MFOJ;g#b1&OsI zYtrySs5YM6Ti#>0dHmL|Olf+7?KJb!R6ypXr`OLs{S9gdMQr$n?C0oA| zjfbI8KvZ@gKPB`pKSO_%)&Ch`Mukd#232n37V*k>A2o%ePV|jiA^Z|0%;KsFYPhh6 z5UvP(o&Ii&qZ8JFn5jeYs)+WcjSe8kW5Jkmj)j!imZ=Mcx&Q|Q_X4W~rlV-bYpFu( zUrGa^`UrewtZ4O8cvF64B8`JT39(Cn6Y>6ZdV9B6jagm<+!f5EV!Rw?S>dGf2#6wI z2W+U|Q_)7U|SBT(UHlnYY^h$Z8*6R#pY@OX; zQ{<4V3x;IMw0NzI(aNTFjbBb_2RS$cNfJR^q|4&<$xiaY3*jG~1$M;h(V(l*N`rw- z;r|%8Mkv0X-FSbn^aPWI3C1Nom<&;4u~C=mH=l0v--H9 zU9_9V0Kcal72M(r1?FF8JoaWo>eJUPdMoeEqrGq>DxapytK+bE`~e>+<^$FbhZ@8L z6WcMzl9_EMv-Wjo3NBa{ulTjCEHlXto6FPO;t3UJsQ2daHwD2}ZlHNp!=j&hgu`F{ z;Q=MeuTAR)x&>d>;L>Z;loQG9lUcQ`ApMT5Y(-t3af?-fjmk3!LtC_$r&m4|KR2_A zmqsEWBI@|l(cXZySP6)}T^Dc&3td615^TdI;2%YObno6nG00l%>k+(ug5-3~_ z+2jbLW`o^0>rU?vVp_Rplk4}5>ZnW&lR5bgmmGboR4po;lq#&$>{&OSHQh|Nfv-jz zJD#6iC1lLt;&@s##4VO%q%|6feNLYNa13C_w{SF%817M&MoJ^>5ts{AhVkNjhjs!h zTPH+bj)`uqWBlw;s$a$UUZ9c3I6R7 z%xHr`J7iL5*@zwh3T+dRDYV~#6;nW&m=}J`p#`lv{eZ<3TZ5NMP;86g2~cdO;dy{! zD`MizFM=#&4=A?7jDCs@cN&8A?G*oYiVfEou%SNxvPrRl?v`1-#-QWt^a-YW2xh8n z{44*RYJ1>kK(*<00M%CYRfB4417xc0Wgt^+SAh>>ak1i^xT_obIjQk$82TkBw_v8+ z1|X0rx6QzcrT;>?*~|+q!Jyn^-rZlI<ejJPm~qxly=%~L_Yhbqc+wAXj$TxC1XjfGGlwip!XdL$E^E+@#eeeD zewC@f{9m!5$b;X!ZlmQ$TTUkUx1 z7-OvxEAw}|a_Dp9{F_9$8; z=*x-Y_y==jk3VYSefcKg!LshHyDqYg#~N!dzG&Bp(1!56rnfLyNErj1@z$AHb8b91d)tj^el ze1C@SrdpFh4~B0jE(~($%3^p+`dbTBKM`Cy_0kk{vVI;>aN*Bn?bz@*E9H9HIQNoqoqwQbW1EoieARZ!GH^niL=7+V~)NdGU!Uz|Q_Y zJZvBA6i`27Zrzm=A1p8-lVs74ij(Tjzz52sgT_2*fd&VZ<;y@o{(i0U!Vz1rT0bd3 zc|$*F#sfZBO-0Xx)}l9&?YiCULVeYavsfHHT9(TM^=23f#+Hczuy_{cAiXvd94@D^ z@CWpVaFz=)F7X{lbWJOG>sD$w8|x9(;#}CITLD{{rL+zV3$(J4FARyRV{|nDKF2cy zSe|?GYVQhu)44kvBiv)R`Rf?$5?}x(Xi`;hq1dBEXqOP$?8N4OmSXA1SM(6(`Gl ztEHaI-=UO}mkUxN>7fN+I4R%1Nx5(&i4CwEj2;43!T5j{s=WH0y(!g2AjrSJrpm&q z*UndY5!k$ePZP!X>P3s078_0{fQi80foj5VZ#4MVYIHfpg{vW|vz$`N8_gn;DodE* z0!KSIYO!MqheXZaWjqndC&%1fv=xCcj3~3Vj>bK}t)m@eC*G(b;HU+M{#^6(aBRj- zTXiXzLtxha0<4K85PEpBIOepA8ZBdDcrncZs-TPPRBr`-lrF&^0)GgNfdAo8LukbI zEbG37sfi+eKrV93a(|IfOsm<&MF$bk97QG~Ba@nSfJ}+L2IQ^92OI(+L6x@+YVQ?b z9cHbs?NTeA_QCfOihuMS6rWP8Xt4(6Xlgb=H&W*#g=SO0x{(G3cdNV)@JE1E}_1t&>Y7~OwQqJCRutJxuR!{ax{7MYDd*oddL(9_KP9HV13$2jT7QNTY1AfcjCz&>W|r|QVYZbIjPKGbz?Beb zmciJ08m%=7_yk&OKd>^wZv$Jv-xLjX7?pHy<4P`FV^p$Vl>e1JvwG_hJq^hk`S{bn zUuO=MMes&)BYvwlBHru3V2U$4^ClwO=xur2Y|HmP)SIkj)CuF0!c@K^_%0QoPj2X6 za?1D;%g>+qTZ@NNX=;Ekj>Km@4xFH;JY#+{1U&Z#79aKNVI*-codlw)TlE3dGUkT| ze$oOv*~8I9kJ5teyrY5V3FL-q@`ce*vw+-Cp8>g{BGDvCNudXLg?h)=7nCNU-lKB(UaMvVX2OZ#xo?iOvLNLL?Mg!HFHwEuUYQ(H4O)* z@RuxrqpW%3dJ)&u_$cTAvy+Y@ntvza8$Ma!cg`F!DiU?nsK~=Wer5YvAY`|`y5I8P z!Im?P)_(_LhfbfuSX*-3Eo$rCJ)OFr=A%%Jx;0$%CY)*XCL#|Z#|%A39KCn~=N}X~ z6Uaq&JIO_&s2)Z9E?(YQ-m`Y1@H%?ouOUfi6jX+jj4tMeJ5HYh_vt?<%^!SvDdg`T zpK*(uNVX2S_aonk@0qB^Z!a)^`(qT&?Ry%S;n$5_B(J`=FfJ@qTdcP!rfuaPm|8pCMqsl5%RyL&ngQlsCr$%a?z1=B9XB%*R>fGo_6Igf*#ai8)%*`q#eT0e)7 zv@+S+O7qPcOW8If#pEXL|rh*nT|lSj1P=5rXhq&_W>UcUVkV72jx3(m$onefmuFJk>@9#gg7Nb z&#;$oDSR(57tsRRIJZ2`TA3GFUei-%S%$WdGY*85qUSHU#a@utjV}9nGjLR6rsQ%s zyoulMDGE}RWREREK$jmRCUkPV3R9OS5nq-Q+OP0F@hNo&R$x(ASJ!ii3b+Cz55**q z520M?E5IH|)#j?1s>hjr@m2+gmAT0ST(lO!FexZ=KYTX9;&9|hcW1D9T)$xCMs2-g zoKSf8WrxOl zdEX6kfI;Fk=rU8&HCS_*68gpDLk1X5l-)8*;oioy=E1Vt4{9m7DBTuL4SqAox8}fd zels3D4u!_f?HXE7&N!KDr|f#T5JcY~!8W`NJS_aTR`lIABg3fX!+kNu`+CUW)x-L{Imb@oKnANe`k|cW!9@~^^L1g>U|DM+Kf>rSqcc+H?WAU>8^P#bFWXJ1K^d2P3 zHKIpvg~l7i`_OTPw)9^5386{K=X=QxUA>x^H1&b)#U|e@U?)Z3r3%>GET`NNa{Y`u zPO1Ra9aiS;1kAwH8x5?DdV9Vtboutd6C?ZswNivCmN0i^*rzvQsTjVvkgL*)8FNlZ zZMt}Pt|dH{o`_V%%SvuI3{F^`^eudD>%BO%@zp+^9+&FWtXS$ArHX-^qJ5njcqhbzfmtegoRTx#Z+J%~~H=jb9_^`PZd!J~>% zFws=7Js9_`;Thy>1jY>R^W@9vH^)6mOL0$crZ`8f8m8e1+oxhwaU}9w2$(G9YdXQQ zD0d_T5Dn6>PCQi#(aO0HS^RK0m;5$&WVk=Vsfzb(w^`6`rS-`wh+)U0X~OC&?@}Q* z!F{pPk8t_ZaG!9Nk4>SzD4GqS?Qv#D5{j~VjUktDryx* zdHo81P21{;tLe_W+G)%*9shsp4byr>P>s zNMlK6BT5Na&5-5-!fXGRDkaks>8cn*hwG^zvH$Tm^})3bb!qfp%Bx{~od46I{fZj+ zI^g4*2^3Eau{0Q2{oikV{p0)@cM)s0oj+FpfU=FyMh_MYc0PZa-m1Pih)?6lG&2IP+c%*WagtN+^A_F zTxrBL9gLW^MvQ+B2OD$sOT?@Pr)@%$z%2KFeTlaD3bCoiEiXAH5}VA7U!UnF^EPyg z^u72P)+tt%8r>9w_QBt<8^3-XF%LcXS$fMhY=-dQuNJ^CoNTqSW;~T^u8Jtja1V^m zd^AUuLw~f`Xb%!G^XF?|?cm&9uqj3{NSAIM?h&e7dgPqjNZ1X5oNyrUv5L^jgvtaz7;@|sMg@bDy%1X^K&cDOmXBUcqWvucz2a}yFpj;7 za0t$AvdT?g0=euemj_!Cjcg5ry}kpOXkW4-|665wDF*NN;13={k)O@cjhPK8 zPq*?|gd=jW?wOK8yb)VT6-#Mx10no%U z%5fqSGjqNGZa}sXnI*EFhUcZ=VMq-lKg-9*(eA!!I4;ktjD1->jGw_{|upZP6>FN@K#^Lh7b2W@C`M?*Hy$YQ`bON=m$-h-dJAr9jvx{&n6mQV$wUA!_g3|Kp z?#*#j@AnMYNR6wlLYHeVJptTeJIC$emOVb(jCa{@WPpd*_#u#2dNx&8rFYU0gmguY z1Hc*hrEU)g>R5)lpQ()fxxrIoBWNYUU$f1$qQo?6Jtz%aqegYGl<9?~v+_NZz7fD> zT>{Rs&Ed3VWntdEEc4OP;98!+ zw-^#U!DRNgOO3TZsAFyL5O_h zzszMb+`m6@CUSMa_%iAdnEPr7$LOHTO?p|E~Cdy2k6Rl1II;tFL%q zFG+gvLrZMueXuvjJ-8qQc4d{;Aa-76{@B0v>c%mD*Q+z`<;!Iwu5~r3MPg9mjK>V2qd3c3iZlGeKzF+NtEV;53axw!hg! zc_>(UD9E}EUQ427U73o-@9l*nQ<)bpd-TF)5YtVCR+~XH&dUF(1>HbEYUb#B`G28* zZ`{HC(ZA5Yg|{C3qQYCo7s-kj98W{zxBK9+&BTZD>Mf`rH*yM1=Klu*=;>j*D#;li zK5eCWJyaaOjnQ0{2CAThoXi-|`2_~StM3vqpns|v{ovmp^zk$3cmkH+XAxUN!EdjC zqdsWiGr(ecv9~JjK>GK59~BbtJ+vM8qS!@s`(m@O?n=j+oHrh3OJ>1e23krRfaO@X zuNV&2?R%vkW-pilHk#4ND-vY%FXwspJB?tNt&lm-q6t}vWU725>9g#X8`NFJV|iM|36d7{u8V zURK4sC0bFpc4ag{Tk7}$E$MW}yU zP2+A|q@icSO&$4~zl94X(G&1!IO9$S&KI+M<%g@Vh=i72Fj9r0W*2&FlnTYIE|drC zi^&*2T7|x44$TFQgQ88+7**#%p9iKg@7g|&DVJ<&51ffRE9ZfafS9i|9!GPKc_$k1>z$3sF6EWK(xa02zX?a%^M{l}>AdiBJMlqAP5^d-;;Pb#M!2YO2r^!4% z+R!;*!zS-dJO}~B3=4M3*}C(HqDyfjHQgqsT3$_Y^!1y0kMpy?LNw#Hk)992sO~FO z7kes*j=U>!#i?1$YL6)Rq+1W&<0>HVDc7)DD#>q#b<5bVTO+tJD&doWKgz8{w#@ zuTq#pf56iUimuI9a7{bWP@pGxynyKfU8&c%76C7c)Qt}9h*_#>-#k(~YDnx@gIIe9 zov%-TNeUJ}3nsux1bO`vAd!;a<$bvgJp;rvkjoM^+;D{lEMjW;o-r4W0vk2`?{ndl z@ry}n0w%*Lvp$AGGY+ADHygaA`(Xn(9Z0H%8-`T_#mQFQt(E1D@Ays4S4zu|>dv_&xiFM&Hc= z{;$5fUb645n=J<$r3NGa@A@t=>~|wi0+zCdAEA$wl06pVxWUn*)D&&gs#q-xT{jPj zGI3`zT)RoFF_vQK6hipcNt=(2m3=9&30mRyTqW8?x8Y;mqdO4IPLHFSpYVoq2NsdA zBx7UQ0IcrdWqpC!G${EVEkX07{$2BwiW+Um_)38xVt2HWS5>^@QwI&zjxKCaA%$1ayrWYb1?=YDl;?mb3#rJltr+{!!zMD4QCEXHnYF)s1Lb^8%`WhoFX^ViouH z)yA8rhkt0v2}Y6Jk_(aZPc0dzi>kRLe_R=>LEVx^_e4R9(R%LaNoI8%+^~}bWus+X zddm(7o9vH+L>F^_U%z@CIj5!~u{26Z#@<8fgFLe}#m<7gKA zy_x9fvAJGKbfh*_&*)zl)3#t;#ATUj=I2KIJKAk}i9*^zc3`ZF$Q)P~10<1g*Emv} zVPxT(H>!;<%!DJz$VUfJiwY)zNB7`ag$-oYR>*Vo33NedcQ^3b7qJbSjOQh7wwcjS zzG225SXQQ%f=5C^v`ts24boK?V`(DLYnzPaMw?4{pXmz)g825mq-CS|xyx`L77jGm zJV9Ffc-jkn;&Ri`V1+UcyZ(#Lwuo`a}fM0axP-&$?{lw8-BLguNB}x3;Y(C zq1XRPp#G>rdZ(APC4a5Iu{iT$YtShnCYeG;MZBsTOEdj7pFyZ_zW1=|E_p1Dmf}ak zML${t^p8h3or8~8-`byJ^|hn5G=YiTP4~UKF%??Q9cU7KoaQjFAuxVBW*Be~&=c`< zK`Ioe^dbB%mHvXqS{@>5Ai-H+bzmYw+i(V;Cp`bHL`~7tuf~(b-1uwoKfKy2+L}Lq zM<{A<5L5mI%h*TEFnOh@Mxvyb>I9R02g|gwDG`_=UZq+m=;dN#Y4@F2E7SKt+ ziC9phb{Y%z5MT;={zI7f>Efj&d(aFK_s8np%cLTxdhl4GZ4q*MXmnCU zq_)+VDlTY5jzsK4*sIzmbLXVRQp#RcG{n(4fE=E(9~?q_{th8?E3|guzM3skVZw@+5NHUYam*t( zEry5bs$J%9`X4>`hm*=~;|tAm>F)cP1M3H+VByy3s#Bqhy zzQRKwKmS2HW7$_2MAr8%nt9f3D597p z$m2q34IC_WJ_h8&i{p$cp5cfQaAYV28|ZB~(v*c4XfGV8j+=jkz(N<_G=%jC@LXhZ zm0z7!yM}X|<2&TV2)9$w-DIr4x$t+yk6i%v#x!pIy(->-|65>#M~!6?I$XNB2pqq< z>+7Wdy|W~>6qZQ@K}Z~FDD0Ln9-(K$ajx@OtlTgj!4{2&MV^Xf@<%rv@!EM@_o8ix zj<)~!Z7MEKbfB-`Yl~aQRTs5)QN16qfZ4B~@bJP$t>ANq-+EKkQn1X~aIq$LUzC&H zL~t5zY~=yfaC50ebSV<&aL%Gj2oJH}n5=45P{T~YAA_#~j*Y{B zlhDF9fozv9LFSBJUXzBOhYShcL|I_#46b0k<#t+*uy`ch3~X-c33F6z-H_I8gBif^ zQEHH;XbK*$&85sAF=s*9J_Q_y3@3rCyKxivl&1jfI~R=o*tK6_Da5qGqp8eVP_2-< zPon29@O)ZJD}dF-THg`i>mud$`F#C23`R&*GoNDKwVNunH|?>KKImLZnHu`PhwJ)J ze&orNs}?^jPp`K{(K3wV4*yrBU+us`!CUc-sN7|oB$RbldAU!grn=UG{3PnN9A#`s zN!<_n{Rr=YGi32VS7|vUL9zLnjWJzZ-X$sVA_R;tbNw>(jsD?KiC!qlrZM#f0;*5U zjk$ajJ;_JPVJJUMK5^}Oh>Y!5HI7Ia+TWgv1T}HKP#)u{(-6ld!QS-GENRVelea(+dSe9w0(kMQpqzX z0yDXq-6PhAP6R>4R(9)2N2QJ#R4T*+m8^+01n3n-GNlPlcf# zQ3``<=%q342>nK@Nsr6i?nC3{o#eN}scM)s=jvExe!Wv+qs%qc(Z|1@{ws!h zh!#>v0N66`ozpNk~Fg{ zLoqLTL13x3!GWXqZ>r)QR-zGSPx-@!|Doa?``hxsC&Lqc)>~le3R^y#qzjgwjl+|v zB65yqMH*loVf-T0g+3h~N7?r<%6*}CnSE$Pgy|7Jj;Lk^Md(3Wmv|6@Vv4Yn^b)q& zR{VlP7LRB+NnV*)FPaK19+6Zz8Om5tx?+Wzje?z91SZ^3w(9n0m8=!V9~4QgIBtlf z#OJWh?i(8 zFez3)`LK<_DJNic;5_INt+;@;AnsA?N;Y|)nlKCcUnw5mq^LY_0!Y7gz^))rqDrF- zV0j?luj&Q_xl7A{xJ^nKsUDpv=%yYBankGXR|b`&n*ROpXCmD#U|HK51;f%SJ$*WY zu5){YOUXZ>OWx>N_(H<+Pw3lTm{vxP>D@7vmgu1$Ayk{ZE*RQ9c?c+-q$g{qr5nwi z5*UqzMqwCk8TxQ5)Qh7S6+N4|olBX`rJxRF{aMlGx-B&|Tq}1!Pdn<5JauaGFJq&z zg2Bp8M}hEK`D6wr1SmFda-=1~9r`V7St*k zYsD_kyJm|eqz*-SIri5uX)3nuZ2cvfj5R}L) zyW?=Y6xPNsNhw1y&v--++UE5@SkZ>|0@(^&n3gF;GcU-w50cD}E2$ z4~k6l2sQ#|KBDXOGczOnVi`^dI^HoDzfOaZIwYkZ$~Iru_445L8>O>?8%?=LG6;N$ zyFeDkR7m%TNnzPqb))4osA``i=wKc}Fb-gJ8_46TL52qeF5XlF;^H{11J-owBY^*L zOZxuQk{eHurK|^HmR-~om`U+ z-1h7`LbniAQ<;%Z)ym_i*)bH3Z){*&$3_NI!_N2)dZ_}c89e1yx??wOg?lU)u2uAi z*Tiz#3WONU*RqlaJPEXP&rGy*{10ybpo!3yS_Z;~5SyUbM;j5#pMD&e1xv3{l`*!( zKB@$426MFqCSy6>7~dG7#&f&KoJ}*4=mqgQg;eptH(&-|-I-X;!w+-e{v2gJ z#4~a;0$kz<6#_>>Z?tuF4~Vt`dJ{MlGyXR4Tl+47&fFbDh3&Y1uh;NEAEB6P)b!}w ziC2M1e3G3DM>SZw-3`=`IlLBk*CJ{Nd=&O=#{<3irgwo&&?Faue3E>*HvjmS^g9p| zDXN01H9|c|{*(56QO5@U z+BKnJO+Dg$uvBxOK&7YyDmW1ZodCl43W?^}hN5^~T9~1&URoMNO-E{vz%s6BhH(Xp z_R%)AmJ*^`G^eeek7Mj`1-rlzsA&Ry4DT_srW;UH^Hv^+`En>9_%#-Vxvf3oDGcVTz(>$1HPK`h z{LSpe=opUx9v$0(JeY3)xfSc@7_HbHI35L`1=hx(F5QM3qYbS9GDmWZbYGtsM@n0d z=#FH)fHQD!FiaaKNMI(#QdB#TX{gE`U^lE!71|qBc@}s87tHE+z;n77z>!aSAb39I zBVdxSz7?UpK@PZM=}-lh+tM5uyyso4mIpK0U>JhUC^h>!s|LBfwPxKoCN*?}EPEIW%)}m_2Yek}UT26$u)@VeAP<2(KoE~hhVrt! zn<@Y~`bA(4aF>Zm!*FJX|0FOUNYC*^hKkC6jCB2hwKyDzE8FA)reiTW3v8+{Mtjo( zi&35DQB&-uoq_dT%V&Am;!Ci$`lh}p1#63E(^^E;!J>2?m>K@lCRoaby`3;^Gxb17 zY|@|K=?#axfN4Zr*=+p+mIg5Vw#pHACMM7nc$1)V@Gh{UPK@956XW48@=AvhGn!B# zY6fo(#=`>Oi@=zdm|u`X!-3OT+2iSPILN*Xvc=RLSQ@N`n)0dheoA$_F=DdRbc~qo zW-o&bHssHtCdsDf1j#mh4R7gdP-du&$ITbGyw$s-%dpB$so^cKbqj4dI7eIayd zSo|FQ3U~CE->2fH6eL*iaYw(QhkpE_N3$UG1Ndr${<`f@5a`*_;Gw~vY#R-x0*sb9 zUPULBaO^KkAa!C7g5XodM%xF3nBkOrw@6} zqe~WiKwfkUsQ@k)Y%XEjhQCO9UKr<$293oWc0r%bN_>x8;EFN<}0$Z8H-x{1#dEmgPP$(0Be<1F8q!}_EpKiT<8bYBl zby|CDE-YX3-l44suAuL^-}y)PjbgG+V3O_%r32T9H|Y>?q&P%56Fu0Ov*{|3+aYR_ zM??$o4^t;I1wWD20HIk$hkyg%ulKqKN^}$HAg}_${{Yrd7M<}`eS;^yp8?|v*M2V1 z-)%9Bf7Yv$+B96d=pR8B|1@F$r`#@FyHujYc2xW(NW&B!8xN>IhHIDoqlO$)u<9zl z>C_$$$+f%$#{;#zR-#O<?F>R;bPr)E z`012fSwb}l-!ZnieX6kI@Ol3NwuIaQZy z@PQCcqrXg!7$T<`kx`E9C6YInvor(f4u9u6Fd9NIt=>6Dn-Ee}tf8NPDVSa%^KeSX zl%D~tkDopOtSjE8u=!XvaVDK@{z_t?3UiEKiN=|97!q|t;=RDV`ec-f%wE$r&iBCr z$WQrGK3)it)Y?;n&D^}ND#cU8BK%IkhG{l@WidZr1`bYbqb>Z)2QSipO=E*zmc`hi zq6}l3Y-*G3rBO8m)({J*A20*Y6HWuNJ@Per_#r9=&I`sfhRa~RuFTe0nzh7(`}9j_ zpN`oSOdip;9JAA=D5mTbgjAqy)i6(VV4F2J^`U65tH?GC*lVe=ogV;VJEyM8umt{( zoqVOydd5z^GVn8jpD<{@2Y2$jC^HngfMMFIKnB#SB=<$;`uFuD`>uCXEd#rC5A55wO+@V=JBrWF^*0b)j+89;8 z0sq&i+Ea2=?fFw%#5ndDB~{bD8Lw)|7&kYNsH(V3<=27$ z4*wjZDNa9Y9H0XTiKoH%U!y#qJ`M(c*FQM1CKVdxSvCKN+k^Bx4wK%;h;y1F4!IBc zb5j8bz=W_b&5Y1T9g3uU%J>7wDm2a38N+XiiG{#1V1%~G!$O1;!YU99fDQ%gc+GAbKmcmNMC=z?664`@*z{1 z>!}7XoyGh>FKnue05*m-mVBVc(nh}@;R&DCWM2O{++TAQiFPIX69Ws{S4&zURyk{aRuXbTRmc1 zFchorD*X0i0>y3fh-@_7J@a$S3lQk<(T43{-k?UCw`ii4^aOj9Rv=G#6m|gkD9;O* z4}+Z@!{E@3u)GaNe>}+(mG6P+#kXh>@EuG8X93G7vS~iBGQxKOo3Qzz=+7{MP4h$h z_}pYL_;wji(h&U+IDD@H4}uHR;&YFfoKTdmy>3>`uZd|4kPC>eg8`Dh-54Ox1Np{8 zwlwc@$8PC zK|jFhgsn|C_Cf=`LigGx-we^#<@pxEGbm8wi17Qr(N=c9(JcXH)#621M^mTVruc^%>UJ)Tk8GzU7(_I({bB z{wCk$ANCy%laX&9H8ol@phlNG;%(dPc$6DM(`rE%m|n#%XGH7Q2h|ueFO-(}GXCS2L3$Y#c1q94 za(KWEA#dAqW02ovT*x1Bg@pjaXg%;hM%p;pV{r!;HMk1yiE({Co(kT}1UK&#f=WX{ z;|_43P)4tk-7ADZd?|IU(<|3Jcp686`LRVsaq?uH{vq_suiVlW>hT+&QxxA^V1y7k zzU9|>lffSG%kSJdJ!SFZ72{>Myh(N|9!ZAsCO=~}?uO1dmBSjQI_V5NBf-4rag(V4 z@fEM)u{8WCuLz~zRj+_5@*f`P%6>`rfOo_=d9^Fd=sIpgdZxhc)3B$nIq6mS5>emW z=EVu}u5Yegp2~l^vMkJqilys_%j4?z_^dXbaJs{UABJ3L1(&QaDkXv<@9Hu@Da!YW zmzNv&2$m?`x>2iocA9<<$2sw))ILpsUfA^*t318x>Dr5*@QQo> zYWD=W^o%n7BLXi9PdV+{>Z_r6(WKbz$>PP8$ZUGp>IDz-JWT;+f%S@)yuS^ezdqqQ#YRNL|M2?H5!#e@qR9WOY4+~WhUQsb3U@I3U z#;8?}7jxq!M6f3R>%aV$7iXOuN{hy+0Ewpn@52A4 z!wcyuRMlg=;#uYFXEX(lB9Y_kTFT49qa5n(G^%fRc|{MT8~|))ofm^f#nYwE&`?d^ z<{Uk#2r)2VOjm*BxvZ2}ug;p3K<3XD10R8oS=PR_2~^qDjm zj-JXVZ&48(yRGLf8qCdDWGsD{Oo*FR5+Y8FV{7>H2M<_RS#G<^((7?XEyI4+Dv@nBagFEDW&_w$lN`2aH4XEBL-Uz}IaSsHI?C%is2pi*2AX)j+Dz7Z)=b~cxFyEGx)%%JxU|Ezhz{Ff2kK1cNo*p&i z7|-zd(3(t3IeKa}joDHNL$>nt@n%u9x*V1;9ye>s^LJy0hgaYk0E4i=vK(+2j!CF+ zw~AiT8ug$twz4?V?S!`pMonZTuF#iM37Can?h0fj*6 zq+nCY{N_gS-X>0ZwyIYw$Jh#$xt*&zsce>4yb*~pWc6#KTIJ}WTN9xAKHr9S>)M6V zC?xrR)ctpS6jk>Jj%Q|DdN!nNdN#Y8&>^AsWJP*QXadrrqKFC!cBLc;g49HTOU+3X zq?afvDzJ%kX^8@&v;-GKPn?G{q-n}z(=9Y8MIrkJJ z{el1WFe}0u+1NEffP6l9RVz1Wq7F+ak3)Zvvgf$~Dni|6bkW;Qv0ZQ%75w;nINd`j z3JTB2X37(gsr!7eD;tHcCGMj(Eo@L!A)(@GT&%|%2DY@}6gLei-fYqhz`d<(2z`-C zqg&e`fy(p~;B3s#=iBfX%Cs1ebFVzx)+YT9*tMOyN1X+H8uz6n+oWu?{|<0E+V@DY zVXsc3{ebM#)YfT(WS&M-067@)h$mFidIRujwC~+sZC?sF0_~eWX;acEMj;2SK7?LI z(G&ACn#FGm%|2%ojoz7n z<)tLrz~w8L&;Ft{Ybj5*f;TvhJYOCzPZS3aWllLg|_}%h|Km^!e}XeWxwZ^ z1R?>Veg^)q(jGn9jYz++R;gyU*vbtn>`?6uWX9KcnB*8Vl9;2i#Y|EP5|N| zBJOOrU`j~k-AYHp0hwH{0(>2a#HQI`EQW)3z|K;d%LT~XC++WTL+*`KdZv#}5-8sS zEJFF)z6cbkbf&*Z4@Ppr+o)(4q_Q~~*mA(-i~|6Z)4d;0VFbtm1PAO2?9b1}*M_Kj zzo(jW08vM+yMGE5Lyivf(v86uq(mjIxc`ct-hK*Ozw)v$k)45L7Qdik6`p{611Hmh zXyE`GWFH+R474ExhD@^n;)YT{5@nNvYSK{~{-VdI~Mf~T}g1F18D8rh^T<%{wB=pYf` z-Q7T$!+7`*jI(kAq6VX2mk;ZOv{M(xsx#!adH6Mv(vPm@c-;sI{g5=8S&NP7yr=1? z60iwxq3~DR92r9Gp25a|@B9#OC|Xx?S=M<7^KJBg*^LuM3P6>&$XjvW=xO4$5D1<> zAOZeHJ+r5hmh$XZZkhk)~8oUGeI?7{#cpI#XT-WnKuJ2G7?e4P1 zRmV;*p#zyZEdZQ~@3M}uNh>fINL6ofokl_C*dJ#ycn^aiRHh9AnoPq06KWt^Q8W2D ztIp}uOwItUWXALALmM_XhpErI_u^<%fb#@D@0j*HPcdg#2m-|7soD*FMf#1X5ITdJ z5bqMSW#i!emq>aGY(&i=9gxl*vR#?>13wH6AZB*58T=5X6Eoct55+~Wg zKu$za5n138@|R}_m7&ZO@vXOQ(n`R%cWhAArqaiNH&I^vu1%VYa^g4}4osgB!>6@? zs9!V8lg0J`O5Ys`+nZJRu_IhdD*&0xvyHdmbZ`NE2FONZoZ_o=*ep0VO~4%Em49#V zeT#v`07MPW!n~n5_(kDk^FM@3SrJOuKV26ApOVZM;~|NAs5_(-fmj<(W1mowGO}Dx zFX3+N=Az-xFNaY+3U0z;(P0Ot)2L~|?6EYqMiAA@hVV@--Uo9g{}C?=&i&epenx2( zCv2QNm3j0uSM)R+8%qqK`X68cScY&`VDzkK9Oo$TYbFN+p!q2L%7#rx0GSL2PFEMS zK{&q|R>kq5610p)06IWuOd`kgCrh9gQhf6^Z&ckzuxC^n+k}X$qXXKIVFvFrT1scy zj8bpups37#x0cv=^w)ZH7T*xZtH~J$R(bC|gS=!VELUvOE;(CI7jV(WyXfn9^GEtP zxCIKy^+T{|xi>152EGSAh#RlPMF*>TbTHToho--OfKWf6>Z-4Doo({R}QhQO< z*z6-J4#%2B=evI+4EVZ1Mm=I1xj*;)nIOpInx!t^4`(wShP@o%DU8h4Iouf_0-3(Z zr|ihJNlwOV4v0 zeVq_YW%F$aomor+1TUCWnhzMm$39=;VuZ37WKnS26hw^|*raJN&)ovp79(2n)rK$; z`SGZ57;uZ^L`$7|Zu@OX8>3oaMI574Q%5VZGpRfxsIrH7?)_BrXQ?MeD`jQS>V$$ViH|iBPs78D-|8 zSx6ssawf9Z|1v)^4C$p+Cct?(%iH<2(fR51a0EddK!HoZD;f%mk>*cKcrH28G~-r; z6&bnnzKWN^bbL;1ebSEDo>4i+J!v)?`|2mfg4R3zb0fq%fsIl`{;u|QT(+gyu_g3k z{XAY>m*_>nCqPlw0=@)m)-bZ+$nJZZ1DFcqk}|*+XcwN3zCVJDCM&|{hF`|GUR!n(-$ucaQN+GS%pD3|4K=Y4PwGjbg zXLgkU_QfVIPQPajrPj+p2BI!pSMy|tfk2mE*C98Q&8InRI6R%D*C`WC8Ug2JfKJS2 zsq<^We7biBWxIB|w-RarZP1sgm(+YYzi%#$1e}D^y*~i&KV^YxE=^d$ zYNb^A4lvPpLWhpknnsn! z(P`9fH6#rz_Vs|klPUmfA}LJiLB!1xIomD_p!e3;q&w0o%36yFChrarnT0O}(_WMs z8P>}Ypg&2D@=l`cZdnbHnr{fCQR{g7FWpv)9W1q+b=_RGkjSufwVDS49Gdg{)$}4N zyGeUQN=zIUbga%-B)%cn66Q9bJBbM#{`(9b^$W8Z2))FN;F0x^A+hQI1=tm^-3Cl< z>P$J+&Ka~kU=pm~&w)!ooOU7?^0Ff5C>YmTPd~i=J{f*KTB_$uy)q$Lk zrKw**EL3|+7HNkX1<^j#u==+gu%^6u8F_E!U8kSOYE{c37U)-5!+bUJ4S3N~!e%yIrPZauZ zkVqMN+7ivyB&A^Q%^rxL#k-`h=3L3vZsPO^y@Egxz3?^IN`Iz5d)1e-i^fb;+5_Ez zZ{QE71nBb=g;$#d)$>&q;ZPVzuq)OwS-TzVG2HIBH!#EdMkEes9O~oirgMnJ6!;#Z z%qvF4ac9n0#i7!=1{(ei3)KBZL94KkKwm9ss_gt*1Uc<&K#ZU3*LmCNud*&xuac`m z(>!>o#39b4Wecn#_Tp3@yjeXRVkRc}TTCm&r5VIf|5gOFN~tk@qtS)xDUc2}qK6Mh zS^dz3#mzg0hdsKPOmLU)Up-&3e3_v+YoL{ zM*FnF=uk4dSk&!D(SWU#9^a*RzP~62akB=9nAG@C;hT`{EC0BdK0u2E=?ZNGtZOQ& z;H0E*hFKp28hqkw*IiU6Nl2d6u$Z;s7icx$1QEFR2b^?$hmlhr{zKKnDHD}8pRFem zL(LZhbo?CUp{5}W`VIotHGOnZd4nkU_yc}{y17up?dT_Yo0q6;2i@B+l!9Tt@ETxU zQ1yI33&$w=8W&%{{$b1xUN)H`arW;P+J(Xf5QX7G=7u4k48rs5geog)Dnf0z`A=n1 zdaCg_(FN=18k$(;BM6RVn_;2)yA&o^lzuu2fei|3c+)u4yl)NhJNUJecb5WrfHI zng;k2mgw;BZHRAqmO}P{+$qm7azg|?K?SnB&=-Iw0{8`57zO_bs}2Wvt7B-}ew%aw z#AxLKoAfK1&OE59`4SFc7uACc@a1?P7Mg&v7qZamkbWm^1$GTWMM4c;drS4sr3+)Q zpa$Sqe^HoV2%?MlHO6%J!#IroR}@eJ4qcfGNMa;%2pJcP!bJOK9W;OMr zYH^3Ap&~o`pHSNP14tcA@3gaX^*}y-CM}q$cDf%Xq&Fg9?D8YNU7zRW45zfi zm|B#Iis*XW8CU+%ISch{u^XXI7VX@_l`tx1AEyV*z7a;CnY@GHlC{X2wpJ49@xx;Bj>ltb z+=rW9#mr7V!s|PevH8;G1M)5FA& z6IVQS5GUy}>Lb(}6V)5zepYWx5`hI{gJ>v<@wl;(C=R&=og0cAb!ZP@%Y%H1DAniCsdK90Fk`tL!I#tr zp93reZ?W)KmXd~0t+UJ+ETpc0^%e4C5R$2BFy){kfLVtETy%m(z3<_^bc-0`_Lez>paYdC=IPdsi>T9qoA}5W(#RDg7nPtx9 zsA8FOC*TMO>UE9C+6{7Kpro#>3#1=}#GN>7-ECL?63k;@_qspxhf0guZ)zxLdzF1eQro8zbM@ z9~?56mUO^ajAS-oYk881w&9`!HZy$yW-;!31+clCEzxpZIB>`JfYHW+LPd;{C#fxhT!s^<|)4(z&U* zCI`zUdfEU1I0fDHkRa?T3bIQzB#_7-Atu`7Zw+F7j9;i80?kraUNYg)-%6&q5&Hub!1lh&#&WGX}ypis)Y$LG%t zsW!Oyv3G3JcJ*gHhx&jgt_;j%6m{2Z;Z4{naVmfD(jSzqtF59sD6OFLB(Y!htX9O z_F!#qjcOmletz!-{?xaQ9a6taZ~o(xR7!KdE_if} z(p-}(;?)F@^Xl6XdP6ITx%s)lA}8`ntu^f8~W?;>!z1vm>PrNp>7N z<3}I9bG{T;!yhd3W|aA?=_FuF zh4Z8%-p)@ISCo_%HKkC4!YhlOM3oB!|-na z5ol24{yr1o#!iJ8APkC%Gwp(9P=VqjE3rk?yU($5zX*DSapFmpBN2?+`4;^T&{5gAIbDAi5hXWni-EN1^=ZEwqU^hc1?l4kXwv1oc zWHptp)I~@!SS;BkqiP;%63!@`Xv{%P0q#qR$9)hg#sj_z1J_Ex4^^{KAI`dDq5K3p z0#Jnm%hVCEoy`Azy#EZ`)@+>If~-*Xx6r^+H5@FL_{UM3)ma;HMJd@OY1~_ zz0hFSL==)Gyi63-MJ(i_$#(c~E?JxRjRO|4jZ^F}is(mk0H08%=LN~RZ$S*~`3KNx zRMzu3cN6}ItiG7DkV2hyshz%r&6+a5h=>yPgMB>%Siw7QMU>SD`9cPY*|(bq=@qA{ zkI{T6@RXhaJAltg27C{AZU=0Jx84F&-+K1JTf4RgzCN3-Yf6*Czi2LM+R3wgMege_ zfDc=k=@VqqbYTYQq}NQ2Qs!yNHk=g=f9Hn2N>SgK6(8WuA;b8oWCAROYVPb|UMJGV zH4j}}>ldlJNPO2|Vh${XEvwlN#i63~HX`daSmuKzZ`VU{U|dY+qW68c*J#aR5bIl>!d( zuD>!sWc<0f1|@dK7e-CnTKrfP$OT_3NvJACaog)J(lxZ3t=qAwSRBkf0WUa_)_hKc zZWFTXW_HNxMT2@WVNlPq!LjwSOEI2jIm4?F8sB~>Hjt6_Iwk5*jL7&nxNNpK03_CSiHUfm1 z3H<{2yyc_ACO!rWZ|(tacpgddMdkM6 zu|_NIz|m;)HlrU%ReF}Ho=#V#s&@fju-#;=H4%Yt)}$hDRZKv*V#K<7#;#Z!_X2E> zZ6R7q2D1|7H-WPCS-bRc)CJiYtCAtjHqcv*S**BcpF)#H76gg7>*3*X*T?-;W~{Aa zcd6!caPTlrh8DtHNqtcG9E_T2gk7=yP6On(I+RGuv>HVYDHu;_czsJRCAJ^-k5r0& z9=t4g&Dnr#HfV%Ct@ve_2YrW%=ix_NTNM5|Ac)$%V24utdm0VMCv_VE*$j0b;1huU zBkd5DXHg44=2ZT%T;@Dt= zpOO%Vr!XDFFV!5;nyFJ*rfaZ@5TA!`Lhiqh8CN6}fdnyrR>o|;fS zTG|h_KEp>nsw(k)!Xx7-o8P zqA+|bB*c-S-Kb{<*dX2J#ScGx^Wp~&Ut93_!`bY16BamE=qFsLN}h z!182lv4|$^nvIe}k~ikk?{BhZMHc1bV4#xv78CFNWmJg^cFgQ~V!VZOiNi&6S9*}h zxMOK1hQC^)hA`JT1hoY2eeJ(LB&l~ILhIN3NiW(RAJjsm9`!+tu(w%eEJIWtJA#eE zRxoLbZ#aF05_I~V8(`3Ld|rtcGt<_3`W^imu2;^@^P`l*&9t%=(I&m~+A;|S4h^%s zqjh>dbi36@(E(N-YWg(&{4VcB2*0qjyjKFobMk`6yZqYx2c0)_ZuQO!*KwJ9&-Lnf z-~)SZc|Wf2<$E9?9$JHqvSm_XZbfh3eJk+$GMmG2?cS(G`>QwkSZQ_lGzZmh@8q#}S(~#!d$Vk~m5ok{}tVC>w-6aN|W!=Zs%;kQZUg zi5@nJZ0G4vGETy0NJ6BI&<7!Ownqn8xhSNnU|!o8-|7K+#judxVIuW*s&9W)<6O1d z!iGtuH2)S7Tg%Gmrc&BL@&nsH5Ti=qqU^Tb?=e+UF{Z94j4>QuW;d6J`v+RWZ0Vyk zUn)m!oN3uEWEP$d72?HnI2xJ^-oY?$IX6tr_74^2*(MlI%@3{N%EwRfGFFFm#LHi|9Ss2pwy{$&b21>Mi^vr5tg$OI)`>z;sXW@gCkU<#ZG^#Z*#1IWr>7}&NqSOlE-$p_C$ zOlYZcdbwSKI!l{G+RZc2zFuwBZT`zmJ?YyISo+ZH$f(A2R^qr#$Wl;ZUUA~NH1!Es zt_s7hr;?h;UQgT5V4Yaq&F(Eyy4(FluVsE-|N43go5h>i9LfSL!?|zzY`gS>TJ|aydULt=B#aMWMO+sA0G9s6i+`^r*dtGZ%E`^^~`O zrTTQ?>^;;%(n7nm8~lb2{StTYCxi?^#TdkeN?im7MP69MWuYt-d|*gYx;EQ_-~l>YsKU8o6Zv_$w{xoO z-2Z)~LTS^-&IzWg+}cojNoRgGZ#i;5ds}(C0Rsu5o7DHVo9K3%e>5SI@|W7B8_?y5 zJUg7W28!}qYb@kX>ia5J#8^bp(H|iG4%7KrjBYD-=L7lIoDNiR+^tRDow7U^#607sV0;x&9UHTK>S+jukabsy3pcCCmS*LHpN1 z@6}|iGt09F3>f7UX6>w=k>KjAKIXB`Y|kz>Pfa>ybpz`fW#@Y$40CfgZbkMZIuFPl zYr@u4`V4!&J+a;nf9=yc`W_c`rGMxKAalSiHeeGp?EXiO+b80>g<<+FzTSdse$+`o zh{zPT(JpPOGL%1oQhhxo!1^(B-u+Or7xKBq3VIPRNqMo4FxUD!m_A2EpROlvMpZHY zi2c{fqbZa;AN&&qIj6ZteO%wEYG6g_QdP;U?A%^jS_96>l=>Mf(|XemK!g()fiwRI z5{rK7;1G*0rZaI4(429)e2x{U_Nf`RTJ3^q32NBnuMCh~>yiSV3L^ha;P7!$A;H_*jxIArnhQX>#3@&%z4k8_A9UUfa1env3?Pmn^E1kLZz!r%(~!j6+bqtcDo zVT^r)sqt5sB8F`4Od;KNgir=5-jt@h&I7iVjeGBhm~&x$Hflr!wf_dfrMzAev4*Y| z%0&snh{(I$BAlH*yhKiHSg6bNEmAy7?so*9cqNQ#Zow{Z{GA66XI95g1k-TTJZ)HA zQUgO+gzE&%!MIC%VUCqGo#d_19mtoa(hyvvBYv$5@H+RA4lj|W;GpXOJ{`83V%y)L z$~NPw@8Tl__gj@O+f&3}rc9FuU*<*r#Z1MBngMp_k172k+Cqy_V#(?hAa{CkL6=~c z-*;GAd_GwDn?5YiieowG)vWqva+pTEG zYmw40$|%ZGf6&8**~d&`CktTMm+!6(7pd2*&4qQ1WTy9bahIzcCiU3Og-6@C;`gv} z3K%M9#l&aDBWOA*>x#tawJzbMD~lBsZv<$GDj9l}Txaf^7;Z*zPp;WIFqabD(=6i;JS>WmX)zkU= zeTDVLV7m1;lz~PTpRF8!*%vy2($A@=geBZ{bP=$wVzy!w1?jLws*k31{P|JYUhYSU z`x9=3(!2P@*LULFrA65V&$s%lVm_qdv!#AIUjTjysMDtK(QE=O+ z;>J4T;*JS8uq(k&zCO3VsX~snp3Va*#G}@lX&mL?f?5z^h4R0I%Aa7hWiUW@bg_` z*j%i~M>7mf&c>Q^oql46OKH%Q|n_apMBH{X- zS*BDZ3}dkc8nqU99B@|CX>F9>nq}neS&BLZh)&N zZ366}8-uJffum}}WA2K|$p(sSS9uUUh2j|40%&HLaEx9$EtamL7Cw`r)C#t!)>V}O zO$F>B>0Eh$p`eK(z0RL@F?!M!Bb}~@=0wf zEeEUz5~GK;L20eOa5DQwQ$1ZlZEa;Oga0p3NfyQbiKcaLuL1k&j8;Ei^HVpeb_fbP zTQJ20j&~3q7$f4|Y#I{ri21Hb^>c>JLac~;wWGzPBu;}xLtzbQ+sp6{kf zUOmO|p4%LHU0H2i>&$$)dR1$3w6=6|_5Pm#5vQ@^ucWBQ3aQmzMKP zDg63!I1RYY6C_uhUIkaZJQQkkoQb5(7lK6AyaIzr{_Jv7QRW{AzBKzUfAMU5%V4pw z@!8Hg=i0lJdxM38{bj?!qgqSL1w)X+>`40BDtL~zbN^NvbKS>#PGf` zUjK4yw&)oqX3zD0BH9QW@_WfX!MqFUtM-?hcax!k`dehb)6pqX{U`OLhX3&4Do#FL zcoK%cDEOdIY=Ix;Borpdz*4@2`2MVu8i=?w)C>N!DAkRtOFrb9r%n3Nxo<3+b z(2_ftjLHO=Vs!3Zp=J~)MP*aiE1B+MZkzH?arD+4YJyTN!<ed3ln(ymwUv*4|=A4_LB5N%i{ z8G5+7(hsf%fcGS64b|5^pL}4r02emHf_p}AaV}ifkw1ffLGKvL{9}WRWb zGYtdEcp(Pyqdp06NZsQPEe55)6j_b9PwtILA*M!631~3m5Uy}XZwu8mJEWHQT1{)` z{#s2jrz%xXdSmrIBN@bMn7OpZ#ek8g$hvkMBZQ!f;A8f~TnM);(M(KbZaH6vUu$DBFN&x!+t<3YQn1_N;k{sqxg_1?M;BXUP0XCM;O5)0g z(?fO89STJ)`A`VDhT)h_FjCj{wEt1n`fvz3%BpR~m#@X6>cK$gXTY)e*5uW2z%#I8 zHA2cQ>>4Eo=#s-lj_oJQIuRh5^8cP?fOzqB>K8BD@CHznG4%}gPPJ4l75*x z-nVa@ti3&2Q2~^>=p^n;P}C_%HaHs|5K&PMDIjR>Wi@8D%u&?YA+^MC`HorE* z!>Ao5S-y1HZP=#FFm}`}ipNW0a#kAZ<9JhQ<-wwU)=Gn>88D+%v4Scv9m6m|;6D{M zKeVGkl(g~oq2vS@BpA2J=twUr^)g5n z(e2qvFJ;oE;9G`Z^0G*eSUPO(J`2StzW?loU}Vn1n$WM1;KiYY#TtJ8$_VOZcR)V* zKfm>RQJyg}L_FQFuMH|s^_YQ?;S4me*L+k}dY->(f88QprDsQ}fJbYpEsQJOY7m|E3$z#;{fD1d9^ znUYHG6nvn_*C-uhVxo5&IHXt@Vo))ZBnS?LVuuG?o_78MV;a?Sn8z}(p#x&&3Q_p1 zE|fB0`#qF4pz1%q{^I}Zuix4T>&&n%KNS4M&|w*2qW*1{4^3%|UNz*-3PMj;;JT~f z)B?1i8^McXlHm*}-n%2o7o%dyV`jm%r0TNR@N8>s> zBzx?e?w#08tig*Y83{QV%e>EM8(KA#CrMB{Hwi`bPsHHULt4(vNC+Zp7l-sLSd__t zjW8>qR`(ebMEgE%#|Y@scH4dm}6I_ZO`05Tln zjJ-feao!%x(Qm@32Z|9&=bdqP-m9qM&I?sH1NX6;yYpVgMNS2MfmTV}dD&0Stm?cl z;oO)MMB%9pDEoTTyMWwz5hAd1bP#Pvkvp%lQ{NylquR2QArm0nJBC=NqWv}R>P zDNfuy@@Eu?nzGA)qk;&G2CO-jdaJNKV1jX-gyFJ^tex=ee-AbF5Vd$CU?+5qtqOOI zY}Qkh>_g5n>cmw|?kD zy!{=(Cf;W%q3C4wrA|oo*TXjjwHEbgpqnTQT$e!o`a7g;#=S?moj}^?FyZ-ae}AL% zQjWoVKxF&D`(gCe0INuB5gS6Yo^nY04bQO}UO2nd4AL7p!_(^n97-&9FuDGEL_R`s z2>Ns2KyYTja^tlA7CM3gXGkf}1jkN82Z6)(Q=MzyvKp1ViaA_oeg5Gs4835~ylJ@| za`YTQGft0g!eMRt`S&+wNFu35cl6)E|)ZlV<~Rut)fBX5S1ICH+sqNOZ|? zPm$BlZbqI$?3ozgz}5Ymi;{-QbkA+pFaicj+)1gl8<2zBX`5Wu>0u+hAV22cO!nCq zEToCXXi+gO{#B8Puy|}W4+nE9jI>J8t`n$AK}uhWZVyrfcmZ%XU?J}NQf=#{ zwVmF9CmMV~n0dr0`+^DYh~WXfq39JRKhYs*eht&L8!X_S6$NiSnItM&`oMWE;vatYK~et0 zp`p}01GcQ1M%gojAGPsjvM4w?@dZ4p;Fq0|QnJWx{Yx)ekm-PX?0V`v7T*H_@;+c4 zB^nb2yzW38m(H&`5Ys`%87Q^l3P06uQ_oJ#Lxn>QTNaCzfR%ELtqdD$I0 zhKnSavU$JhKvZ>jLI5Tst5zl8Mb{Pd+NX#kJpZOX#I<_3Lt4VV2RO2$B@L~Z>n%q( zq}hHd&!gi6spbQ8{~0V1^Rlfts6UFesV;vwzdX=L+BF99lYF6^(1FM3v|Oh@X&M+=na6c8?$&q zdJCtBLzvzdP=lbwn*cewu`qZ1E*vog(Z8f0>5!hpZ(RVD$j4)FvB)^xgxdqC9I=Ph z_`%Wi#Eaks6?DyN+~F~(7z%UlgMhQ;5?NG~Rs@HD;49((6g>HNj3_F8 zp({Q4wnOS|xQ2wm>qQ&Cqfui0D=mz!t*G_KX~d&PD)ruFt%i1_as!1akGDB7&H>N3 zf6qg39psq8`tB5zddQ8NIAuH3$L!|u}5G>jxUGx;m_53YVm<`z#)T-Yk=D!p( zcZ*2Qc@4%zuqvPeREIxom$q@6&tL&3C3qmX;&BSp>^*o+LB+%>3V*~AsGdXU7=EkE zTD^i|%LBbcOHtwzXAw_&-yiBKne31TNcsfs_n>~Lr zxoOFyWpV`-=VGylq8V%XFuAAdoCpl>6J-C<(=3lUYXQMpCikXFwfZT z6h+yxUYz=>iIEn5$b#EIk(!wqNrzBy0z0bl5oS~5wX2W4d&^aR_dQRM?$;RV+KJQS zgt=+3o}QnJ;R5mLJkKFbLV`)zx?!^-&$s(@b>b~ee*xZHd zxLmksdK>ZKBC@Pnqgr7b@wQLaP!Cjgo4@CS0C`h6om}crJSrdigrYorg1jz4BsPFc?)@)w zgG5E`VS3YkW1MP>#V+~^Syj!a`ouwZB}&g(S+bqaWjVz-424-kFezHn0h=Qn* z7QGVpBkhC6R{9;)kv<>%218|}oPk}R$b9Dlf;WA__|K52IWCZ+Qe+=NKVt}2Jd1-`vMrA4HH~U*(*E#J>G9xTmJ!;E(=yQB9 z02@y~HUL?tlc~IJZKCIDbj^lMrYaqc&Pki-7c^mK)XLRR57E$7*v62s(mE{)A*4|#Kxf6_ zCns2cZHmI@L}C3k?-XY(SaM82ld;-UUIObpWQ_w+d2tR8R}@4pU#sx>BI)k=5E_lb zQ~EDs5K8FyxF+GE&JmnbZoKB{Bj|V|f9k#tdM@3TlMhePEl5_1A39S0`r48{_`+j- zwDtns`5ZpvOc+jFw$Qhm9Pm(5KPy@+_~x1!33nWbKA?S@Kw*vcZ4or&OJ>SbX$s&Q z5`t0zo(9EJ1FOw84Hh};y!};n^Uk>{cC*;DCqhP1;WpQvdO*sIqlwxUf`^grxb_1+Bf)=FNJT^77-$U9(|!1` zW{Z+{`oO^9Bb}e#>EUx!6fT*C6Rx!t@A|OeLYx<-$C8!o;MGKnlQ#}Es!sZ?s;k$O zE9#482#e(!2e?s^=LCqPAz@)Yh+yP2Ie-4tV$P+sEg%pWkE=O%VNi%dc(s`*Jv0;X z*_&vG(taFe{sabsEL$D0HR&x%dq9Wz3JPmMybA}zOtk(sZ8n`b7ebjRynv(Hp8@&! zG{D6#&7o$1vviw|SB+KXGapCDC@N!h>D*&ub?tW^t3|Hj-7K$4i>PuB1YRjml;6Oi zYWKYmq}|5CnuiU-%AI3}(g(}pzftoq$^qUzu~LPb}qHq33-$VZk;BhM|@Ik$Qv@=i%;;|Q9v z51M8DYJ^oqocj>Eh+?e&o@s|bwkPwU$EInA$g&@O@Wk`(#5h$t620^6FPw%!X;`9M zhFSGbWZ^HPxxC+vq>>>ATmM#?j0d$dZt(`5(C&O-3Zavzu}M4f4lwgx=7}EyMB2B{ z2h&j0%z-z~6~HV|uQ3O)Cuv(-4qRQ8t!)7+6XKqCA5*w{8NaIAjnWYN+-bDq9MRGt z%y>xrBJDXTidvu)XIfqvi|nfXX*f#VApEZdj7`0JD~1y<10PK>gi``J&ZH1oqtl}3 zS4{ByodFwU_ko4d#Go}%&nyhi<9li#H44(MmGB&1OI-o2rq5g!XB28PQL5kQZD*t^ z!c~2Mp(-v{wNK%YU+T_j5QP~l!s!C;Mz*WGQf1?$NWfUbTR;dQ1r|3A5}x05_7ka3 zS9pS-8i^k#!coVnhQhsvVrT3haq5fR-i=15P5CtFp+x1_N>0%i1#9l9 zUq&JV4~pR^Iz)Ers8BkCVr!c^{_Ilao)lV7sF8a7%;#W_!&~uNG#rp~3@Hasv;n0m z*Bu!N36fg97A#yHZW%;k`*tP-Aj0o(->Idd>Q-<57bo%B{2gv?OpEiQsh$7trKH6E z;T7K#tEP%On~g#eA`=w>=Ii#Kt8$N`r{&1>5AcQNZ0AZMm*$41T) zDBCaR4mThgD{4j~U&Up>MvyG6J6Nw(LOFn1OQVqNhl1%KY9>K6P20)yGLx19vX^t< zE{E#ntb-ihU=reg6rrXjOQBfAqSSNz+w;fItV_8dnxP@fjz30KSN=jhkFxS4O$>kc zX$ysbw*QxHpevdrVCUv-0B&GHniUvKH&FN#8-VlVAcRObrm78310pYrOT^{QiV>r; zo-}HdnVdg^Kg5yZLte5NihrYs@CdIyj7Dfy9lrmF%e<*Zc`q(ttk^}=X$nM0}pAxa}{ z|5KbZs8Onqw{}2V)xSKbC3vhNL|wpz(>Q55q90tO#BwMvqIe)RKS@2iTY9P+r`6NB zY!1DSCOwSXgVDw+lAeRl35~4dNx!1{lAMKTBWFP4s=mkZ0FOSD)gz39eg29M0v(Ef zm{$Ln37qiYL4BPGRkx~`J($NMt0r(w}!kCY*4#!|$)g zDTJP%AWei{(m`-uR;jiQ3coU2D3@7)M4Guc*;nVITpttNEKvAo4KM4?3ZDE+SUptU z1Boo;?+~{G3MP8%3ZyVPav4NJ{@Nr`>hy-M6Y7vhM|77B z$vKgoG-TjIKI~Sygm&hTldJTKz!?Am91a3O00&pO0xMX@3icrXPi$b1=6F7ZN|r-) zf2qX15nve_2VFzssHqF}Ff?f8!9?l)0@l#jY#drx=e)XrhM`GKx2#7CZh~*8KTroj zmTm&>!EhB{#{{?Fv{4;mWJ9W2uShT*eghUQ(OV61@Mm|=0jqahcvYL-vuG&V#7bLf z0w8CiAV5WrRk)>%qQ|;~il-5;r1Rf6UBm(UAApe{_})kq)dSaIWCv=&QD<-I8hUuN zhRKA^dH9yDnmE4W7WF}shrgu{zTy&U_v0(R{s&(HcpI<*aHw;OaYCjVK&$!MEhXkM zI>ygxbe_9KIo;zCI#tO5xS!mK6*xA|~daO@*< zXbP(98&B{XqqX+?P{pzM3p>`r`_1K}jSx2WSUt)qQuO+&o&65d@`d-r~nJ>x*nANpd<5$tn0aPrs! zcP8ijT)K{SwXiy3jF@tv%1=e=Pwqw-u%7tQibi9&k#+Yh{Ir7`{fFkOxVceTl?~NC z4fX`XUj%I#FMr)0zW4AibOY_;@z^L69-F2-RzV9XFq+Amxsi2LTp+JytCzYfAapbo zux91a+Roq;fdwC`HEN`69q3q0twvNHgy~6(@bvJQt#==EvC+BV?t?BiI_WNzq7gH% zHvu{2cVnen!)dZ-JR)QsCm*kPB^W|KKwiiKun}hF_kg^RF9KSlrcP4nCx=z|JKOyV z58w<9cY-%J?M)p4Yhn?P2DIW)a{wdc{H;{xhoPV!QS64fAL|p3RhveW0h<_q;l%=# z`4U*1m!jq!wCL^|FTEB!ZAr1mD6qM4My(IN^H4TFlhxO1#2Mykw1RSx?gGXE#^Nn; zQJ)@sfa&~$k6=0&O{~ClJYa3pJsGdwIUQ$0H3#g_0 z$4dhh68b$!xFgtmpMn*yG&+eN@xRINQhK$_7$C2B-P3hm)0}iP-gVLHo;0{r4XuMRPhM4iG3c{r- z!bGU?Qfhvna$p?ZAQHHpJf!xU1=mLpRmXbQp+~U3h6ga#KdM;!9(H3LZoWs!f$@?J z6#U5Jm`x|A5Dt5l7t92ul1iOd3Tu3xo5KI`r-4TZDrLB5QJJjlO2-gQfg)Is+By*hTYF~aI(Jg;JxXK@eh1#M`< zfzjMUZdS$QoLPk(PslruE|7kB01xd&ZD{{+6Fxi(L#}AB<6$|Ao&_p9; zp`c?_+^%X1rJ}0m=p=rOi@K>S4z<@Rs}_pZYZ2ipCY35CG!SJUb;m;0^$v@Ta3gg?8_vH~q|`nBZ?)5`!RVS#we`T=H2={Ra177kZn~)r=|Apn z(uVXOH->E@RSa)Ej^TL?!+_h>FqECQwKd@vM+i%Q+``DdPe~vY zQNB~FAxj1L(FP2sJ&xhz9V&*@3yhOOSw46Oxf!TdY2XYExdW(C`*Nm=oQ+K^-Yap_ zJwKFgJUZ&3Ru#Qj8hW$c=wZ|;9X~R9a~?Tcje^o(J`BZO;wB_4!9gikk-ON5%PS`}krvVlZkk_jWGU z@Ll4r=I%U+7eRTG=fG5wb9QMM&OlMYFz=xb+>L6c`;~xk3cdvob=#?G-FEEJZc9ba zGEa~RSR35SVn80qWsmpN2{#^H5;Q!PKZM5=R5KnM0GT5xWf*l=dpmCqHy(YvKPEcA zy&+(2qp~Ddt4k6t#_CoD-Nl;6amnAUt;)4(Gi_C_eF&lUwc-)4FpaVSVUK@a~I>WbUDEXjcRFt-=C?(H7@BpRv zAEB?+X15wU-OIVnjg-k5h}peO!`0=kHUrnCcnM}V6#-&;@2!U35b9Q6n_M`nuSQ{~ zqM9dHAz$eiLQHHfdL#$U)JPy=&zW*R;!qQq) z*`;Gt0;q75{*AyE!b)JA3Z^#FTbbvClgp*fO)B`@P!F7Od*sEG{!QpWjx%6 z1~-dGN}!`GBmGKT6;7X`>U~He^_#~-HUXWh0@Q?>ORG9P0HXJI2WcCs zM=70hPNLjCczo@{i+BRVs?rJI39x^mGNUz=&Z{WtA=C}Q}G!!iUQo36D~3zBYDaBHa!;CqMZH10)6dGf=DEXDj=0~n>Ceu)a& z^7odb=50jze7Y4ckW(}PuqC|hHv^`ldn*v6!3s$+u{A#ld8`59S3~atcERs|!H1?~ zL=YWE8RqBY*(P4%RG~cqIZi~bR{jZ)gLOpWt(+ZhAm9@?Zdw933hI>G+E+mVrS-)f zbyDJJ(0PZ(@2o!hvG!rTl?!Q7N)xK;oTWJhu72{$31j<8_QSkPq|9hs6} z{mQ6t1}3J)%C*WFD5|#MxQo|&Hee&H_f3Gjreg;<`IfSg;c8~Ulaf=Nat0n1g}ZA4J_*&W*?6?9rLYWoc!WbWfIhbAnMP_f5tXw~`?il$R zSXIo5v;pK9v#;vW{8$C~O`p^2_%(}X%zkag_zqw?j<`*L9aP2pA%!4>&_-0T;{6QZ z2YgSdcF&}N@rcxuO1A*F0&X4@&%ssb^{1hA1iT3NG~7@-4pz7B1sc2vn22ECkwd^- z`2BMWIV_x~zgD88(aWf-Z&-X0`8FvJ*Kr69Py`t9Xbw0p=V_&X%me8!{5~5*e$vo* zX(wRkVev47-bQtXV?*a%U=S{N7kCq}10S0e&*izdVFVA)c~rh1tQ@w%1^|a`eALEQ z$H)f_8j6jby^MU**Xdw*6k}>KKf`zW;r|iL(O&_dHCXu`wG;s1?Ax9RF-A|ARD$F1g!m^F@Uw$e|UKy9R%_bv>kYIe#EEonwJfeufe>V z_Tw4>Ph6c|06QQVmME3!BjcsdFcpJejF;x{A$6Kx?-;*Ib)sp(rAzQzJ%q>nQ=2%j z=}{)mzaCI~IsdBmkiICXhYFfO5bQHN;zFw*Q@bbmHT574&y^>Sd$>oSx&4KQ@2_}M8a+`-YksYJ!?8Dwvv;%m4G8bM6JidVAlu{{Q#?JimwM;X5<;oLSDyeCIpgm79h( zmR4#UwcOV7Mz1%PHhNLDC$!L-4mZ8PtRF*x zFcin1xaiN`+w^P*k4yn|0nLky(fz~uaAe3W16h=HQWeYcaJeGIGL|s3DugW=aKkgo zRM(;m=abOG5>F#QW8njD1bV8fDv9O>gn4a@d>(!_N#Jc*fZyRPh-lZus4Q?04=f2xmx~ghXG+>#(8g)jeRtN=UnX@?C^C8$a(Y@aE zqO8)GPPMl`U8%5xqqm$YUC^g`8nKt}dB3sr66pZsAYrA11BsT<+`SC=fai%rZgL~J z=nF0EWD`c<_MpLnc?yYFu`)_-w}4%1tDZW31SP$(7~)3?$qf1B3gXLfGk;NhDYsIgNB#T4%G4%`Q zzv71wS~gO|A_Ls?FNN?j)gBH*&4kGr0y;s-1zJ_C@v7F+@(uLT~X8$-`3k?#Yfn_i`9^<(D-;hZQzIuhqZ6=2An&W7}|MXZwNpsr)h zUy{t?cG*1mjIoWShmF^F3nhJ)JoX#DXc4FXIRzcMlsOOyhD zIX2;enWWT_vh|sctl&syh-29VnrF=+BeM>J$*FA;efA_i3a}^OUcgkZ@oOw?VC4?_ zd)uX)ED} z>}f>Pz0OYoUWdz$W7DxNG^=-WX+~oy=$?Yzony51qO6Oo^)2-+*843J7e#ptvPQ^@ zT|Wd^0@NR%@D?fO?dFf;)v4eIc`|w6Jb%YUWIeSQz;83@yh!BBK4>gWQBEiwG;ozO zl2V7b^rIDY>Z`Nhjf2jqF-UZ99xNMwZ1a*Q>(A*l z%Zm@pZY&(8yapJpIF<+$ZcF)RD2YY0hXHB9T>~V97sC8X5klLePvy zS+k~Bv&dzZRT-Tc*~48`l7*6w{P|My3D_U&Ac`ehAFAUr%Uu?>*rwN^J4>!Eoc>e; zSlq4m{h05IKUw(Nc_6zS$9ZE(D}g_ADv!FqnfvC0LRJ=G4h3exB1}ioz3?c!7O*`n zKViY&`Xztvy+B!g@qjI``UV1i289r>j~c^W8fN=rB4M`hA%HEUOjbU~+`z}FKdulE zZ2r>S!TcB=AhkW!m-JsEA`qFSCThkKApdIBBm}Usybx=g&~twz?l;hSO=Lblf#qu1r2w%seh?XaP1|ODHs`cl$QA)Ps z&nyO0O0#e={{{(rI2Nc$>6CKRU`s3RZph=Qw1hY=u-^ylfYr4cFdECJ43HRGBEQk@!p?dP-3;k$+K1|tL;6MHPegL#y;yeHO%-!fmm3qvSEZUTS}g9@6O8JIo*Jj zRq4VULzWUQ)@-pc%XBw0|6myr%F49zUC6jO4I=z>0YP(mwllDVwOT#DNk2h{QKjT)<11tOj@iyQ1 z0*DRE;1=K#X*{Bn6I*0FkNpyeSyO@o;0NgKzKYyw?D(WrVB6pTh;`G4LNc!|P?sHp zLB>j1jc1yLS7~ZnIe={^%ohli<$l#zxW*k0crO;jazGmen<>5pPns8yBi2{kYO!2c zM#v}r?9$>!dcMbjfQ2I9%na#sRx$|OyMh4t!ed3VCi$_-IS=Vrndh?`)Fy7_~Ye4jn z!byhY+Sdq8Rv=r><=blbW7w?)RgF{E6Td2iFg*u4xN`TTV0XpJo~Yp1wLvNsob-a!m^BzZ z$=g?P_o9&(lt##bplIUO;p7i`Lsf8bhD?GkB~&(bNI<6M5&T;bq6}D|DAFMqxGU1}v3cL}Wybse2rg_8O+} zIaIkD5EL29n9|40(vJk{_(K~S3x_`B!TzA|AGrV#pNik+=d${d}T;>xUl4xBFNd#{Oxo;!!OV-kO{o&4saJVTW#bpIf#$g zO@}Z%#ZdIcuaODBek=hT&hvLRhK0i)S5@_|E4gl1Uktl?Y4kedJzV*M zM0Wlt>3fSG4g7_@AaxxtY@)^EwARS`mNqVIFivd7GAC;d9jrCvZ4qX6Z$@V?-h2yG zb__FhDAqDZo0kH)10``V$*2T;)38H>U-Yb`(n7p~CKktEW zmd{t9?OE^)p0W?uDb7k7OFu}zIwH=oJpMa6u##r)`8|kbKJu%cZ$ZJ^xZ0_KHoCIRvyYkJgP`#JWBzPl&Z7+- zt=pBp~y=hfp>qb|n;J%mC@<9iQPho8+ws?oOg6xoEB9 z$HR20;Z8rG9duSL~Eq~vGknK8r zEmX7ktYbZXijg!3{g|-(88ZS;I1$kU@Pel_j3s@0IuP;qF!F18 z;TAWz^Uq%}DI~a#n^l2>Ku2Wk4^mvI#vShxz&9UnEFI8Rm}Fk{Tr4hqg(uK2x@(jF zK6ZQXX{W6XD}Q2n6l*@@G%4t-N4jJi`#!1zlx^uR7 z=J9P}5a7<~0$|uFP&xsdg(QWvsD=7^0Kl4WdCBld=^@82c;bMhAAxOHk7acH$=_X( zRB23Oc*Pm)6-^=d92>qz?Dn&brT&Jm6uP-&0^9^&M9Ir=s^0e;(Hq<`9q@BWD&TSj zoreqfV!-=x*KlJc0diwj+2W#(mtAiRnoqg+<7y56K>05u`15-k+7JLU=|W?vJ1WQn zJfXDZ$qFlGcK~ zYG9Wvl{zv2TS{oc%CbJX-(O7GeO#xrfjciIE=r;FJE7z`Ok6%-EGDi5uvkJ=_YVv< zaD)!P@53f|8uT^VNKA@w8btxD*^3GFYs{d#UBzsPEI-ZR&)Z`DO#CCf(H-?%22|&- z2^>>x!7g^QiTRuEZo~Y2!R;P4%->$eOhB^)S3Zk8ZPG0r(EleUn=~`*oF394%pbn> z@IeSs?uMODGpI4m=DqxEAO_CyOhB4JBc_UGup1!FU<>8rFF`g6#XA9M=6w7Wm`D(h zwNyS5O<5!NR<7Yl1>^jA`&b*i{&<^h!rjG4B{1~iZR`KN$1 zk2e70B?yS%m0XD^PMfbS9}!6-`ikcQj>PRq zXs!SS&C%t}tgttj26s%N*A_*2koMsg@r2li&!8rT`8NFN|XGY_G@savWyf zy|E3;@JqfC@C~@0Z)3Ab2c_>E-qAK`j2`0ltY$VSg@4Bn0}jQ9f3&%c=uAEnka%Ug zl%}pAYejKj3!9Lp_g7&qK@7gcIe0NcJRDQvj^cgJ;tnWij)MKpf^-zn5t|R#M*Fo! z=EX(+;AvbyK1feD$%8C8>zlxsnqGF`=v!;5SI;S^|6Y6%^4^2Tzh~wB(gK67uU0IF z>&Z)3Ia6m=m9UI5&2!{~AbifTV*%VP-X?vnt=!s~`8_xOEu8T3`#VB4$d)f0{S05) z(kAVLH=>jwqnb#`EPn0Y5WcaM4W^5OnKgJ%Fz;}W4Z&+aY#Xgqg#8%o-?w>uj)p=AJ{-o}Oi zsPHIu)&jkJmT}fHU6ZqwOB2^p7455M z>cylk)0#-bSyBKG4xy6XPFkn>fGaCz$u|!+GL#jIHxSvQi8Py8r_T-!6-B+Bwn){l zsSL=27}L}a}!A3;oVmpz>s#-VnO{&O00%I=H5>BYE7mK&wmIgfmmwR zAvSOWr&qblYs(Q6kp}P?p9*L}2bTdhH+)V$9AOpwvcaEcj<+H1*yj?LIU%jjdH12f z1fS9cBhqnJlDX51aE=bAs?voUzkwJ+=Ad7l>%Mo|- z5EuRemdYQG_o`(3Y>zj-t|1aG!(gUMlX2V?y8zyD^BtjnYmF}6^shc{_iP;h6b91#&$%c8gB&V<8DT{#PrE^TucA-mk zvbGD@e@tq2DuBl&*#$A=7XYcjw8b_Aw?H(sNt57VU)%;{Z<+?XeEK9Qp&;%yZU~Xm zusQ1{g&9v>P=Z?%$xr_BJFc4)3@&u?3Pek(To4ThkJGboR*M>9Ts5SxjiwrS9$=Vp z=Qm0q_rwnkR0o&ujfVRs(-4ynAKpvBeAZi^9MJ%eB@Iq>;j!}LGYF3*=cfiMsI524 z%AH0==t+;IhG_N{v+|&s9R%jlnx0}S9!n)|S$Wd*U@Z);nDlsRxY>e_b8drEg9&~o z<A8|-qai6-j`fP?lDnnW!A2=R z?`q8wUr!~sVA50R?L96EJftJMe#bM2+Fqf0o zHmvAPPb2f)|Adiu=w}1l>W0Gs_=;pGs_CM&$5U{0gx|^lpQZax!ZS9fyH$hgZZ%{8 zjtt2l+_k!?WiLNVWzr2cYL!FEHJ@^#8+jwdtY}d^zZ%X5bmsCX1vIDpfRs_W)JY8+nB&8lw_L zW9}e|z$g+#QNjNJnk%>)n%leX57FG+iK2?H|0!H?`NV&VE1Wg_WnA&r%o?}?*FixP zsndWHJiP(`7NDhmGxP(|V0P({(|e-l+4`RboS6?3osx2VEd!(T=frqBKX zRPp~kS>bWM8doHJRg17Fc|G+_{zic^?4)M%#I@0{bc*ZRm|vAj*T(oA<6PH9zZWOe zyfzjO$f>?ICN-EF$|}$1h6lJJSyi*ia3jt7e739VEVsE-wP2GeoHb&TQPtK#GwDXk z<*#j0YvY#dxM|`_YAyXFh{c8FM51mlg*Q;E?!x%d5v;P`a)Xm~mvL>LVBJleUETMU zvxC88#HIH&rHPbv)WngiN)ytyg+Xj!cn;|eRy~>>tc6Vviyt{XJOcN2`Pv4>Y@2ul z7ghR@F2O%;;02qMOK`^3RK$e(%nqJ)({_6iG?5-0=i-)F*CHyo)=aaQj z@j*g!l(Eq{M?4u50;Z0bm`DEVl<;-y)$`S_a!eCm>C9DOK3M1ZD@L%qcc#+>i%kSF zLu?|I%n+MM;X3OD*O}GaL!dJL`W`~fVh^b`i#;@)l?Tps5im9PP(jhZvxiW3^&V0i z5PN7iOB^xX)qr2EJ%lFy7x&Qp#2*qHJaaTl27e3ck*d zn^Xs1SN)g`b6IBnaZ-DaQ`JXniEe34OkHdr{U)EVA6z8J%gQ~b1@ZR}*rbMr<%{(c zl)n6hUl9JmbGm_lgJMs8GOnQ-X6|O9*f2#%H5)@=59;DqXPySqb8h zorlB`$UT2R4Y)Mh0Q*1$I}-2_-6{!&3Ij_auHa=Ts4tCSxu5W0?unuhJk=Pmt+dMV z44}70OX0ebt_BD3u}5r(0o#YQSaZ6zP>>(RFLwMAe_9*F5=WEQZI6TX`8`K%l7H~Q zHG0`kUOmSdtzC^LDY2|?5T^KTJmVuhKmW((QUfhiw^`!Xud3n3v*z+Xv-1`N@FqXn zq%Sec$?urW6h}Bory~`JjHLre5>R!**p;o7f}dcSy&~Z6{X2_@19j)a2x_4z@n9Jn z&68L`N@)nzdA0B%iZ%XZX8k#RD?$;8@!23&v3gQ-3j~31yhDN$(oI_Tr7&`UmuW>l zI2Nupjzj9FNngmDBJsHH9KwyTixFLe*y>@6BHgt@{;!9`&AK%{fbYRG&ug}0sf>Eu z%pX2sgRuvM72~4eY!I0S(NllY%U_O$q|THM-6n;oQgmV=LsVRmllC(AISH|lH$Cky z-`WqMAk>;<|H)=P3_n=BoYk074Fny52t|&!NV5q#(AT=_`LR|lpchkyhl4~dW@jy2 z_Y1fOAUfDW-MB0}3f2BmbAc6OeuZ%3oYtDU$n67HfLf5&&lACHr+qlRZ_qNSEZ1f=Yl+<@(!m@ULf z`sMyCvHzS1y!CqjIqe{-j{AK!QTvI%&yI%rWb!`u0G6J&=V`}nE#e1Ka3<-Koffv| z${G)dh=(q14h_Ml^wE$oW>4i=NZ2$Nlz56d(hr|=9va&TMhaTd-ViNfb`-8S0cCF# zMYt=f&pKFQW#Gpo&o!UGA2k^;=bYn5Q4$Bc4j()z4&z^@C^bC|CExidgt|F1RlX9$ zFCz1TW$g+eZ{d*n=vPQh6lRO7ks3=WVDvZKqG71BjPC>_jIO6Jtk3uHSG(8U9o@r; z;l(-Xi{(?1r*H4gtjVo{5UDy^3b!m><7{N1tC0^V82V@OvYnLXyOQ}a!byssv29p{Nx1G;trqd+f|+zS8HSD> zj(M>3kMF9KK-q!6m_357P)ZG9=;f7>5I}p$6E!@R8mKgFfB(C@V_|^5Kd8 z(b9hP01Ic`HC=tNHj~WJ~?f1g7zXw^_@{bqN#P~geEsjHP;H<7ZE+AU!`&ZxO z@qy9OHSAMFyAPxb^4Q7Z@`bs9^+$UIxq)1LGVdD{Ee+Hjm1I`3vkjt)B1@-g@`zW> z0b>^$RcFGItXJPy$fJVsh7NCN`C2^PhOa|`SVN~z3(+($L%~$d)-U+bkZ5RhAt2VE z5l^zBIe`$;ghs>Dz~4e#TK8rXahdeaj)wr^ryps^pKlONl5g(UF2D&WbF@?fd?PR4YvFO0Xei?(^RgDv zLg(a>SS(v1s?agNZ*l|qF+4CxdYUDK?hE7ttZ%tWEIFx>3u5fu$1a(oU_ zu3|qf-0J~isbp!!9b}YWqi8AHaTCYZT$eh0L4^&mhM}6+@gh-$DSQ$j1s=EwI2~&8 zQ!hcxPipddP@EzV;C7UZmL~CTm3Tu$(KGVpEuqfMcU`bb-EylypP~Y9z!|7uKA>8G z2QT*}RpyJWEK+@b0Y9Wjr}?v&o%MKu6SKjeKXS<`J-}~Y1$oHlRaixBkw4quwBR&9 z0;n|VtHclNe8na`t=XYrjyPQ~Pq=86bo~6Qi0H+4;+Ls-r5`F%UV*3mZC^v79|iqL zksl-uv!>b++px+CS?c}QY>4}}CJ5zbmb~F>=nJEy6+TKK;sb{A4!^kG3shneu0Y90 zFsJBs9Zldl4)`W@CM)X2U_PT!L(sqv{0bp485HQ{P~KxO{3!E;_7*9U`}_v-ReZlN zB?{pT6i4&tQQTVTUAP+J+yk)&{rR`};bmxTHvgRzc{cJCz>Dnj=pD7?zX-k>yL_mB z<>zXJXd$C@*8q0(SaZ@8 zMr4lV+wSM4HPMopO>VLSUx5`i*#RvW7I*B`U}lM5u49!=b~N@rzdH$^|O_w;pV(*WPi_(Vr2xo&-z{%a%h6t?TgzV#QLy~vqbXBoM@>X^Ksij zs2J)|!CJa>kb)F5*@E@#akm{9X7A<2Pwci0czYD`L?=l`R)+X#Bz`(mM1Bg{SCZ~+KaV#YhJw1{A{CesZ5J? zZuY;iSPOUM-^Xv_kWv;W4j&%ZNj-}4Ba7cLe_lsec)h^!Egos7g;LusIa&${{v%~$ zmiTl)YsU-sW3B46=__0!MG+i_@+4E_FLnhbel6&NK$G-*NB<@vujtaV9$r8bH%DYsZfHxYHZDPdsK`b0~HKT%Tjs;Q*Ni}18LRMksV!fScEVim~H zOU$xQ40P!F;;=So(pT`IPe)6wNC)vFB$`79u>|lqR`IZ5L+*@^$}+xvv@5p^h?Xj` zbX4|$-&?1r*8g~UZETG#x#wAINzJV9`B@|gStkvj9>7{?r}x6XNqC|HSemaH7%lZC z49yXG8eiCyS^?)!ppE<$+9-e(Z8Hz#x00i!yc&zO_~hBff;-)d6>d!?=THqc9aT!qh#LSoRuvqbrS=p>#nK)VH$X+cyN%&AvPbtHoWo^tRTV{IiHH91Q-2?uZH~2C7oH5 z?uUn>C$v$$kas=E)^|Ug#4lzK06A!-)GP5ul7ktZ! z(k{{nmLGr1%oD~E0vyAJBptSL&$nplC$YV~OT!}#%kH;~AKO-_yQ_Tx+o-LExUke0 z)5+47QYx!_?y!|T+Vk+USgCto9uUMXz59?SwvC^A?`j@j7>oF+)Whd|hCwc`CvVCi zYnmt7vFGt>$6kj$U}Kk2{8*TA+XssE{4ns9NY|D)d#tqA;TF<1R{SMGqa{9#AZe8c zpYcJU#%NGzOZ`|%r?x;SuSCN_RWXMhfO*Rw+bUQ~O6>C0mS*n2uTN>l7@6GV*#tK1 zGpSwfyL3*wwr=tdi59ju^T7a?xPL$|UW8x0>mOLGZe>Ka0k*@KxjZo%>d83>B!74; zhAaEW`m@iTe4v3h4eZxju=1z}ZW>GKiv`$+RlR1C#gGrylP`>hGfND)^I#LAo3f-^ z2#VXE`E?vrgL>-668in>!#zes3%1#Rzw+g^rLA3yzM$J~TJ$M5cG3DySzOwX9lNp1 z&G*70y*Q$X$@9}9J?ru4;dXc+{^qVY-g!EB0j#t4Wa8%JuPUv%&Be-x-mh|1Ds9h) zrm4%E6n;H^tlrv%@w>&cKk`YPWnZz7w@t@Hh98t3s8=t&^Gs8|G}B8WcVN{etm)*# z7Uun0sj+%c$5#DCO80u;o&Rr8yHnEOa8PLJad!~<`c?~=LuN&{#f(>9?Ea;akTn+A=KVm z%&39-`De)O0e((;3>Hnvtmw+JV0Ni(o*T=&_iHz{N0Z})AAPT`A>^F^fl@G=fnT{T z3j_od-a7*}5ke*2Ak-&}tZ3XPW_}z6KYbc=|DE_6(xp6N8oo@yT<+ zstORsE%=Nx_vz)9a?Vd=(fuTk$foCq@y7tejFa|wpcGyN9|wnk4VynnPZkel9U_q{ znrYF2I?cy}_j^+%tz4BlEe?V{mETs^a_(Dx6NOYuVy;q40U!~D1HEG4CbtYZ!Eft~xSkds zEscYu&6`z?wFe_afUBaCX{PN+@E#I7NR_p{%^kv%xG* z*QEjPj#4*2T0`}n)!`l(#*#gE_`8evS9JAbL!+jJc^*(YiQgNrjFn9TXh9a?{a{gR z1PuHZDYXVf3R#>+EO38ky*&CObTfLGY;oRg#J$EKTgB7#6&IiNKy&@kf|Vuz+CsEI zSId#PAG>hg5e+0aLX%aM+z3t9Ns4)oD5|Z=y6z9ndjwezt#_Wjtc9fWJy)s~Hii@< z?r^D=C-t=n+MBF&iu@e93z%Q zOMV(G+;a0(K_oWu**x7K7uS=&C=ob?Rqb+%&|v-snBNHUB+m;!>@vU+U4NGGQGKyA zs*E8IvSE!{`M3qp&xi7{Q~PXw8RMh#UxRE)m-HU|rDf657GPB}eif(_VFVsI7{ofa zNjEUdJM)YT*oe?>B<^#3`EtR+Wfz}^cZ3=F*#`bSN)pIWcHFB$Jaz>lXi877_z6%l ztoH$0HG;^p{fkO2BE@sc-^`or+L~rS4d56zWxa`yPKj@^jpL zy=l-<^3+S<6N5I)c#WHRpOw*)FW-xw-LT1i00dcl9eSS_d-q5AUG|t_y(sor>=zKv zh*}#uYvu2ttSR=Gsrl4ElW<~Ds8ol})MxQ+4YXKUTMu!$9b<()0XX zK)4ljVQb8A0!uvT>B-_E_Ia?}(QsMgyNVd@F1nq}0h?dXQ^^@s;Qrxe1D*F0S-z1E z_b9-b3f|UYo5$>UP@4KLjRg0vj)vjk9Y%sQU4HVX+ZEhe(@1dDWrch7uZ#q#hWf4= zYAd-`C|HWsH4#l^a*>%zcv$865X6 z+Nou3j+nt4YnYq=fJ{ve^?%1lfeuqM#A~EmBh*~ju&MNXYF>d-ug zrUX4AUTWk4U^uUu2#pO}I$d^*LwSHsdt`2H{wd{&f6AJkGd-nQ5A7}li4`XFd3Bn( zp6kf@0d$CqWm~HmN9hrq1v>4G99Ij)#;u_mWCeqEe|fa@v*xgkRgGyC$a?5^29hki zO8Z0v^BLOJ=~akZPJk|a)#Xv>FG;`u4d;PQ-)zF)6kH9lZ;JaiN}>$lSnEI_$G_Fv?C?Gn zEp5}|I`#c|94^Aw5S;9^_J)TU)Rzh)`RRaDoZrn$@qem1)|6Vh1+z|Lc6jymCqmEk zqBFXyGsf7TIzD!j&4Tz9mB9mwLOZ$wXOL4S#|2zv$Q8gLB-$I4uf>BeMk5UUDxM73 zS{Y3+^E>dMzhebTcIrV?z=P_bm>|dOD-bM6#5Jc$Hz~oqRjxVtt}NGY@#nGEAVm1f zT=Nt>?c$oNF~HSWB2Yb2x#p6QNmXOR9sBU`FM7?59KOQaj%Xq0Z{THOp-VRf3*8Y5 zcvdHA93dLJG(qR=DK9eEC4+~nr#6=VyU`rhB?>Opg>)Bg?V0Z)A^)nS;pgQadGW2GS)G$zFm4(BOP%3V75z-!*v=fOuHHC zd2t8S2gz;P;)~!}EWOVylE~S0b6i_q2xTZQ_WWBxc4-UkdA~P54CPM-+ok$W1sHa_ zcbRk3v%T)AQS8{cQ8iqN{iTg>ysIm*S`I8sA$GB9S>pLo?f-C#^GrNursb=JDr-*5 z)G*fZsmI;4Zjc)7#ZM$Pssj83doVlH4p%UPS@MVQw-^d~T5M}AwzXtz?aw=*q#+5S zw6eD{wV=B3Y9L#YkYNxtPQxRSsBsw}LycX+?aHnu%^+ThoWVoc)kO7j>vdYLmIf#W zVpL-`JHt)<>8>{3bywq6ms*g}{QPUfItJ-9me+ zfD34OR9ft0Jl=q%805uZO2Ww`BQLnf^ zHDM`-3<0(FqrT0j7psnAt6i%{$T71Bb!u z_@R&H^bEckiOBF{I;Yf9^@HuHNGwS?kW2A)DFy0q@O~8AH-xWfiFN0xNW@7?+sIOm z!N=bwJZ06)&E%(%h_s+aH+7{dp0zy{KZ8`G6|U!nJd@?F2=ibTKG%bHN3C6;Gnn-Z z#o8`wWtSp6g>Pn|3GS)1@e>|u=)Gs7pQ3-bc!{MAKmWKL`Yf?{!GwVK34n^)p!eNc zxR)2<0n+XBsWBLS3xy=YPZ>Wsm`C123uZ9?9WWBUWWrk8rST8I4~^crO$;R2^$;8o zPh~UUUM?O`k2vvw68hLvS^RLBxSgLwO+%#uN3S+^X_^L!@^)~S?MB|=^ib9-zyBwM zGM4Soe=6tq-ESwyzm7Km@0T>A^?cO>v^GZT9T$+OBG+cey4a-`@oX2wC&#mVB;Y-O z6tDap%|UlAy>>kr8nPZ(iF(=2s@g@=UWt4KekHDwUXEeK(}$UP848-$ zxbPCcG_;$YSd{!Rz(_qgA#cX+=7ii+ZZ5Vd9BlDiJR1^tcXwdCWTai{?g;CS|9AMx z(M+7p!xQaNc=+{7p@{$mQK8${5CASdBLJ>c3N<1dkIc49dY*>IEr?l?2S_5&KlGzB zEQ!9vrPDgoI-Z7ffWAtk=OT>=a;&6VBe>drqQcH!&!CciJgKK$=!K-cm!Rr}WTK?8 z-_~fUqgwy+KxI%tpnt zEL4^)KBhXj)4dvZvdXPxLHzXrSe7cSFIjZ(5Z#jxdm5V(TTI2C#mHJ4&dt0_TjFEE zue8?UhqhRLx2AzYX`4p^RZ^4>LYY*RiX@LC+t9NHlH?||-wepHBOozOQ&*)nUJ=9=O1o_FojD|8t5*VYJ`0iv>5)Zf)=j>LUWe~541~@p^@lvSGk< z69M0mZsr0n{zwQEa0}p~H|>ac@iiYi+zwXfO#UsPjJ)wJYUl<}0EAym{xV=D%C7@< zM|EA_rb8={Pa}xd8Y#Xn&marmiVlx=?2--$R&nUr@I6{qh-U~$Sau8G2nhubjIc{~ zpw}iW|CM`#+?%>E-gNvB@@M`Mn~6t>?!qm-4*hD4zEt>GGxN$_>vn!!GsgN-myN zFN#{y&~z6kA;JvPmcxM{csOb(8u5TaJsMRNPQ6KVsy<6j>*w!ShbnP>UMbviSWH?u z;WgM=)ibU1BX@#s{B=0?2_sHJe(Qx1UV?L@TuplM^ehn8f5Hm+LobKUTc65cP;q*7 zq!g!@!|<7QX-Ck?x?Vc8@|79<7Jj{#?l<>-Ko}{T4+8udm@||WzCPWbzd6e;bw&_K zmF+b z`Ujqa!fs^z=mu-LQ)V{OY;t3lb{zL(rq039yutY9;u`XL$kZSbEs?QmhV~VIM$Piv zd1zN0^U3#i4dCmMZI7&%^5uMT?9xjlt+}Up5IYtf>i;KwH3nKL1c zmMj$*L@&Ocx4YN;uKN5D+IC7_d|}}p zrsp!OV78&b)qc`ZmJ$CBCjKYsi!J}IONET0V>9B9^USNlf-(bENFcP-xTLDEh%_M!nG{ly2#C~B%a7k30w^E_l zivXVhk8xi7wgzsJ=`-@I3!|a_W`9TGmvoT?E&9qT+*5&70+@Bu6@PbCeFXs>N`^fg z=s1L5?{wgCOWZ;0v96a-w6W1B*_p-8rE%3mcdII(<~AG;4NF;Hew! zQvcv9lk2=yG#PAlz86jR#|cy1ry)4FkD(fqPx+_LIK6Og`ze1Fg^xL^P!H2+7f*8_wKSwy}W*!YLK@}B=kb$%GljNSCQ|?dW9G03c#e5 zcjq@$?$sL^Pr*}7q|rPFknlEQ&jhi(KmO>$kDz1#*mZ6!BdvZQ+wDjF}2OIc${7iLvv+4Bnm(TR@^)$#nf;yusaD1fJ+}MsZ79mn34eDVU06%`3cxbVROWs=4E_f5ZU+=T+f+dEHL(aV zQd-Qn09s%Sdj>E^g3+@M;w_Q~@%absQV-4IN&F%bU9_p7lPt^T2Ra`Ao-Ur^$#9m@ z0&&znJ%p<(t)2=b9+XlY@jsCH0a|~()Gm#r3B7>C1JKKfKa2|~?we7p{BYZVV1p9q z5Aqic{${VVnzD!hZpg|@$-grmhVC72aD@1fU};6P@@J8sZVTa4Q9_^0#^!JPG{V=Q zN}v?y{a_VB2doy4nq)>I5L`GhZi^PgAV^+5Sazd1HBXY6y5i1YbZq^_kpH*QlR6E?JZrP^Bp%`FU~L{(8;Z7dTs%g5YH|RNhKWy;V1fa zl!X4>T4X%sBt9)Mtc1SoG2|4-KX4Om**d60S8Q8QBpy^~`D{g)>vtXFv%G z22l$mc-bktbb>ys;y4_}IjvYFoA#6kwE5kj%|CWbXVzlMv>@U3VE52z;e7nArjprb z*X3&6%q^Gsfiom|n944W&v*qNV*QXAq?x(wtX)`%WZd_-KleOGoG6$u-y0;%bdp%b z+?E!uJ+I8!KTIoTst(#R6>kv2xzqv0L7OP5O);hy^Tdnbq#K`n>!QS@XJ8;zxW+>D38{;`_#a zUp^2e?$Ote_(5$e%I&^-WQkCDgy@g9D$^7!Kf#>=)0Ai8>6%taB5uNZ6p|SzId1c3 z1#eIDWoZ?;4SB~ZtS4X!4ZP@A4NVQdQ=uq7>ToM|`}#cE$}m5gkrU4?#gLct3VKm2 zOL84%xvbJ;E*^6 zXobfJuWPs{iU;AcXUrjgehCE!b^8&Iip2+~2Jjz$!41zT+4b@eqgMo&yuo#x7Z6+G za!Bzy|DxDZ#HMn3Gf-Xe{i)beiJu6uWdYi2Z&;~2>umdq_mrV4+#9uuLJfMLk<)}b`1L6PWJ0#S)pM<10SOt zBnCOQLIfm;y@{)O+V%6!fCNWesVhjyUN}AFN=kWCs)ABJlsZExUrME;BAI0C@<}SA zlzN?397TwRddtDeS9B>0z_k*!3J)%JjbkTzu}nx!iJ1^2?%^skfrPHgtKPgAEC>HT z;VX2iX_!cTaYj!t$_>PzRlY(4wL+IPS+cs3&IKYU_D%@Gd>-<}*c{JjW5CEg%*O(@N8X{r z-vB{{^Wvm%*k-oZ#lW>yAB?YwqN@4~3YvS<{71_tt}8143}sFAx2{E)o@e2&28Vh6 z!0W4`=;kcx`UP=iZV|DNbV?iOW1vJ%?>BS3{~F4g>9<$V`xo%OarZAm#g(te4)-bR9zz(<FQ+=eAxY^zjn31}-`Lew&JzrCxOP$Lb$@(Q}oA4NLMvv`M4 zhsEpnGP#{bjNj6KidkcNj%93G62J-qro7|`c8ihf(-k7GRlYd;vpNLR*4r(1-ZWMU^@ioB zGFswEG3$qooAVByF~m>dT>yvarcxNZr}0jhry^1zZR&;m7=C;)9Mq)pwz>;&JPM41 zM-(drIo1_%)5Y|%7`k{*B!OV{gnaNYQQeI3e=S-v{a$1tI2NmKnwQqX#~?EYeY4Z0Ve-A^diW7C0Y5 zO)*jn8eb64_lp6mbRY_n@Fi>G6MRV#Tv&X`U3jE-6R`WLrwS55tV!tmd_afaeNr=| z;dupaHRRPF@W)Uy8HVHnzJj_{gi}3B0(%gzj7QZ+-56i|(XIaMHOqzO{410|=*r5g z9*j`U=y!ix3Co#fQx)G{VZ57vjN}o#XqyMLnkOF+TFv+lQA+ppEU8gfs5+X5hlvotHHQ}Rs~#xLL{rT_jl8fl_5f_;Miv!^W2!n_oY zaj5>~+0L#v6T*Ai_(SlE(m-=)!#{*j+M@1nP^{E#u2FXjrEZOL0I>>sFb&HMr26N~ zb=DszB>Gf;NBpAHAJ3}Rw!unS45JOTm1+1wnoJ!leq|)N&MJRpWM@7b zKaq*`f8qLo*qP+UF=@%dHg|I$4C>UHHLa0BrB0J}FKQwkU{y;N1}jByQ1)CFU3w8? zD?|h8v^+GX26ZYASsuhHO+0AMPcw-7>!s3=sZgSB%Jw!}D-^6REK(J$V^62KN1v-j zM;@<5N9vVJE!lkYs<4>4bfgl0EA!=PRB_c$GpsDGWkwXw3CA>{mx)tg5WjSW;!@ZI zS-#>esI{je$sne+AB#Vh9Y3dgs*!hV01WJs#g|mGNyyD)7(_#}PImG%lkT6+#T&VP zyc4(_J0oJGE!KjvPJ^0g>dk5=^aDZa!P3a$0fgk6g3yw3K^b2e86!n$kT`@y14{hj zED5uyCGC+A&kS&ujB=LbJ4=eFq(*yo^vUxs?P;xQUC~I0_8xMU404uCLLx$Yy{r>U zJ~JwXrWTwXk%vg@>EN+v>Wul!sp>K3o&3`==bco?jD#{~B$P2Dp^O;`Wz0w@V@5(5 zGZM;}kx<55-QHctjOUawBcY5L31!SkC}T!K8S|NwV$8t`-!+p-Bl`!l0{c~&wHq<1 zAHIb2VQ#1f4~Y*^aK6rmn01amL`rmwbdu&Wvk6uxC32gCTGGxs{-e z3=w$%bx`X86ED|ky`qvQ-WvnQQlaSgz`Km3;-YILVsTJjRJQVJoyxMW)T*rRXtFP> zqj{tM$RwE77riplqF}gA&JK%4=sD5I$?J6*+4_sxNa{Uz@A0Oqt{x|~oe`=*mg+Lk zx>2XD>%0dBKbb34)$Q+<>uP_AJFi)Vi{j3-C!H%qNPqEw=;)@~bt+$cOLX+?T|Vl^ zH(XsTe`$WG23e{l@XF{qOq4?zop};Ec}7#Wdk1c--K(`YmLs;WDR9n8g(xCJL&yn& z04A(Nbmf|hBV!({?@$NY?&o;(KEj*0|E6{TIe`1`5oCcK-NsLeFFKWnK~4&?>reH3-PMyq)!tW$RTm{n+WX5p$0*wSTaajPATkOUWMe`M zlx$YAfEX%i-!b_gTLUzPGg6$$EeMxWi^Cmy4PC5j^mT7|DlNRFQoC)3`W0-b2AFcSDoS z`^7-11v`5%5=|(P`~o4W&yj6_jm}GuXymjdGRjfB9G^M#Pq=Y^vb`J9Rm!=&8!FrT zE}!|!{xPsvroI%uq~i1)ZxK$9!&vm1S!eDX?i7^!V4r;mI7jR=%35z6KAmiztLz+9a^=s&WUa+ih4lXIx*mAQV673CmI_MGUe zGD!4E8Dv^A4YKI`or5ezISukGVA0*Ck_PF+wHR1joe6af)uiZQx^OmBG5_14#@C$H zcx6^=4pl|ksV~MLeB)haRT=Q6t9K5#@5|~UzK2&}%t?+lD0r~$^uAPQVng{J&;Yc2 zm2*mP8J&z}quiEN8ONA;+#pQ)pDg6s{_axnw99g@oia+l8WXCHavvVUC^4INOlyz9 zG_6;z-#N-pQBKpk2GC1b5r$r>5r%$`GAhAqH_Cf>`n$y5tiZ#~ ze17@dApc%ZzPZf{T%RYo4L>#43$7G@66prU-;XG4{E^6o68k9|iQBZN?x228yhq=* zE?R%}{Thp@{{B0@@cw$N+^@{cr(-ew+0N+jM*t&8Sgf92FUlv>9)N@WSFT_uYgE!( zK3V;;`Zg|MspG(1B@^mwBsw@RVWr5t2bpB=@iEdk$RtYvlfVXTHX%lu2}JDxT&2}t z(8v|_plkRY7)A%+{wWDMv_3e>EV>+vij z9FOt1+!)xn+{k?;0v0|wx1uC>M=XZ~N7BrKFrrseGfOZ8=y>N>Bcurp!I?d>qfWys zw^PGbYIyNhp0zXve(RGMDV0fExpi5L^sFU&Po1}}>~amYVux#}LfK8tt78p2u&>U` z1ts+IR8N+X(%sDVrnPF%3NF6p!Iyo60ZNDgcX*k|}fNjk%JJu$qc zv}4Yb!{35~@!gAXi;_07wNDP;V-%lk@gCPF6Y6k#luyQneL6uGd9Y3gDh{~Dd~%;_ z%=EFPed?GGtf=$W(&er(=Ph-OSxm2zRfc@Ol*6k|Mc}4tas>R1xZa<;=2oCShMU7gQQW+l=Mp^tL$y?_0-~)Oj2&ibc_%C0{dEX z4Dpj5@qd_g(#|K|t(d!S)VUj*Q>V$w52;Bp((Bo^N2=zXBhBM=UY?rk8tJSY*GL7k zI!7I8W(b&`w-lx)P4l`1b!u6h?;3RhJQ}JSEx!~xm|X4np@ntc+Vruj<2x7B?zoy) zR~>&Ds-wjAPFjPDNWkd4>VSjbX~LVGe3|o-;gQlq)W0i>>$Ft1$Ti9{@W8KPAi>*T zSaUv?)_L>Br>>EWUE&&<&@Nq~j7)oEVkef;e`HV1qT1MYhUZ>AzmW-cs`u6ju95B? zS9_#t-Z@3rr_|}f$;qzHS4?zuUg5%{X~Lg0>{&DFyqP}T)%l4CqoYnsya@<@syZzN zGwZySljZ8{$1_}=B?dLLpy-%z_I2m%I`6KY;+qw!zuw@cX4|!wPIp2-oHF zmsDw#tN$DE`OyEe-(2nE>xXKP6(4_MdY#oV>o&i6l0IVJBQer)Ox(?yuZD=cc=zP! zI`39y@Uo^*G?9vHN}61qdHxu6Mw6W`7M+>pJ-48~Yih;%bNw_d`_m@^i^kPyVdvOR zj$7#7QAu-U^xdiv)SL4csztx^bVtuqEahb_Jh%rml$x<3x2~aV#9@6yW*V#WQS#tR6V#r`MZ=3S=m}Ivq4caWcg{YnlYmEy0It_e zg?;KkTzFr-83T{(==qOG#HT4!4+Tcm6N*06;-*-Bfcb+A*(Uz`9M^1NSDI4a;YCX5Z>oi?m5-w!MvbgQr0=Vs5jI{Ru zq3yflqbj=obGN2vLwZQrgudAg2`C`_3J-`VBovh<#4aij8)^cfDjgzaXyFh=1*8NO zr7rM4z&Hw|Z9u`~EK)L56i)WMjB=X%;Ytd}R7Hv2i09g0C@Uki(*x&992alF5v zsyFH=b;a@5mhp?%>A$D5fPeb{hf*IiMMckr5GU``xCJXBji%l3{_;O001+kFukz~z zqn=WamTerB?XL&Xi5a~uL83h48J{I#<3GeVS0PXb8QXG4?AFMPC9$kp z>W^Vn&;jI%a450C z-_P<@&-$o8tdG}tlfB`YXx=rCIi7Fge{JiRzi85Nf&%u$#QsIX*rTiu?{`FT^5nbh zy|BhNG2zFe+59TPLBH9oI;>5b>HIDY(- zl@^O`aXfwHNX-b#o)sP=ER5eEQ+|||i28aSmH3x>1p>>4y^~Bc_$#6%K}sR7p4xPPZiUGXWxdCviAalI;r5*|PBGQaGvtW$LxwO>o_I9S9aPVO$IKAmX;PoZ zISfDnA)wy)w4&mTav^>VL)pX= zn1yxn$NGm+C43s7g`!i?LV;QMpxeu}P;onl5>GGS12m4)8yo;l_&%@&+(&h{)u}Zp zH3W8s?9(vdL&^o(40Q4a;8*-<=-HgaxUd0u;(u!cP;(+S2 z{tBEL$kQ&j*tZ7TC{Y$%FWP9d-JnIOT!;1K2KH6HrP#&}7*Cl`4*>H_c#~rnYbHGi z;|6f2BduC#4m=+EhGqei4NJ;t9sV@7fI#tDPm~{T6Yf^h9gwNvxKMscur}AQi9^}L z?uH_Cs3n2|n<5Y9i#HOXpTr9|cBt9UD(2 z%`oyj4f-P-|5pvFiHqyIJsQwlZ_u&$!wtF`_!2rgzJ)`nXW4q9&ERAsg&uL?Mcd-0 zy)5o5_@DFYaBSwi7VQZtYbMkeFND#ImX7}@-1HybBGtHs?xi-Dqr`hLhIeb8w@B`& zRt~6;z^e(1+ES>Y%fewe;uH;S?NGLx&evC4X`O3=y|6#2dm9JdEzPC3fu}Ih3~B37 zp2cO!LEvk~q3SkKd>}lAp2g6xv#v&qx}B=vNT84L>xc2N7T65Ua}MZ)JElF)!bW-w z$nNpLWQ>!gz;1X@d==Og-#e)6pGD6AlORht0XWt(Bh}KcId!F=7PZ7jq??>}8gM__ z@1>{JQvJ3`s)WSucM7Hu_3(3Cc(GEwBLJvpeCt;q+M=iqHM&44h7Uj_mAEcH;AKV60)&`5K>X^y~u;B`)wI zbf;c}FiJwWcv^uEA6mG>kNF7YkM3b6qdKEfi#rjCUPBfo8a-5qtsR?07}XP(^n|-~ z!$yn-b#*|w??*HQcvcH|LJzp^cP-$HRPm5j{zVTvlv0$h3>a&e@<)wioF!fQ(tTGe(ODmnZOY&hm0#D>I)WhF7T18V7eIS5w94MBkyv8z1$pBK!(7-eeB>UM ziHdT=PV0fd#>-=5!}cSs1~HfJ2yIj^=`9pQqfwIji&~g)75G+99MVkZ>Z_MURhQ5x z3hw1lo>0zFHc&R-6(5o1e~}A|yR&nH{8*}y;x-=$7aMAmj^ByD;U#lb{y5D1Acce|(9 zjeFHTPh%8d{{sWeJ?{^rkKv5qSBbzRp4Rh4_Kt{fVV~0}TNF{YzsRsJ3l{A=HG{>X zSrGH3c20v5?51b1s6uHhDbJyThRS2)!k>o96%o}uFIg=AS691e{ZK<+S`6=d6nQ`c zkE`M7PGZLEO#|q5ce@hg?({rUkYQ7lD0v_zibf1ZDR}W+j6ZcfYsGFj{`XGbl=cET zO{U$89)u&F*W2gu=ToJO;$L*&$ZVh)z!SjNUUDcCfVY6RxoEeC)F@h`p%}^kC;I|_ zsr}2djD3WRw0*%o{Ha8FwhZH~Q6&XuJ8HZaHXZ0$9uVC!M483T7)D%S_uVT?v zo)EUDN5Qg+<`^nM9j9Q7HmKP^5h9}Q74;IVAykQPtW)KGPn%Co`8e~8fZB$@xWH6RG3->8;EZ+eafY&@@|#?fHt$XBRaT?gKSt`8Mu zuQ!UN58zUjV>K*fYG=^@e=SEf+eK3fvGbBwvr6&bwF~{9D20$savNt#d0OHo+5eX& zDavyw`|uFI!hdR{u*@h45efHzXOcy$M>&)MQ1sJ&TJuP%Gui=zsr_jOaD*k_fcLp( zX$YCp3=0XTiTDywXPAeJDRsDD!S|EL zGZ4%tKN_IJuCH)4x5PyMg|DDLq=gEh{E?m5m|D>ZBNVw2 z(R^sX1rMW3`*(`*Q`9j_jGR6#ej5|zUrlUTRqffV%Hmq0`>UavWi&elyyH;(dvVe~ zS0|0S>kn#SoY$ypbM-3W8|F2ltnX>$`&m9$eqUURi+~hrY3jEj*#!~Bn9d^O`lJ{t zM`k}^fUbGABdm38NP*=BIMyd5i1O!0MevK}KG4dCZIxlg_w)w-JO|!!g@$;rIv|=Y zrkO;=iGRh=s7bungJoH#Elf1-IMQZLZt%j2g z=R)1HW;i!v>}=MWQt_|31L@cl2P8a>31$6x%dr|=nahy<>#n*w zgFz_&n(7cEzZqZ6U&ubtAqXwOp3UHImNlau{ZTe@F|XVl}^Bs(uFb@<*UF zBWu+8x)xnuhV5lkbfTt^BUb9m@I1EmMwzfpRE=H+!=@*8Su7K_u>u536DJe|T9s#%hA{B*+62*HaY22jIkD(8xGCh&; z;=vBF+W%gjhuGd~UDkPG_AW~;dZ$zNY)lQxELsSRmY%(6101Yr9jfyw6m^Ie#?^Dg}-qs!(t4KS(ow8@O$k=sE$U6@6s44>%m-{+llvr8t$(?C=)neJ zb;ewFHPBz>2F~L>-z$^`1jC9lfNvfiGEnJVtXY*lFjaF-Wm|C!&)*)1yGDalL{y9v{ zc;=o!X}4Ze;?EkoMk_tUph+L}5;q>GJ(6 zP*4|v8ICC@eTXwmTznaZY}%_PF!IZuF^hKNf9oWsKX{7yeL-T&(5m{BMkp?v!J_Jw zN1%W!Gdo%Id!#mp2w|@%n(>iCsTE+8D+uzl(V8uOI6eG?n9a4iZ}rr@-eOsIeFXl8 zx+l{_gbhXul#PE{wt$$C=?}}jv=tvlLyuU5NT2>e4>7cdKb|*JVId!Lp!Y_v?YX*x zxwe(??f~x?N`EjJtcU$euHpjc&I$*e7{t|y)haA16Mm~5P}@U7u)*l9_k;bkdP6^T zb-iiW`;v%Yi!ozxB;~_7TdVY5Po0rdQ)6*L0DA2NMx z22%+qjJP1pETd*>!4J&TxJ?aXM7bf-OyTI%foO(gtr_ZjG#jv9RsF4pml(96gJWR^ zT|lg+ff;H&IR}E-NZnV1)M&tm`e69?4MoQghFhwEx24F5-sfQh`vKMTvEsr-4%W!q zPO*jzmDXTK6G__;;R<+<>z6`JoN|p?F9V}PYq7(g7MlYv9wLopAw4>Q&_0@`IbZy_ zG=mN!RJv)50{zxiL;T~y<--WJN#UpJ?;@c2w^j&=wb6!I~OUoXR>hCnwCgz+Qw5b*fXHLnEH{@4@<_zdD0sNKCZ1r66cKx15KmMxmm zXfW|$_W>cGv5rz#fOUhAErj}(f0(en87ohc3n%%6f+C{BCaVYmC|6x&g>3oJ@ZQ4US z@0NTc*=@Tib|aWS!Fwck0vlJm4GQ){KE>GXz_WJgGR!`4=uY-6qz@K(;_&B z;QM|bs=9*HJe_lc2N@`tVodfB{IA#qzO;X-o-jrNeTJzTX_SeI>yL%eSvUigIdm2H z4ES%4uXR8V+E{lfaD+*#=~7Qk`)oi>Q-;Gny6hxb83+QHC4o+X1x$6;dV4d&1pYVm z8`^piXJOimc&(ro^coOW^C%LP%>_YzPobzmBiaJDAL?;LuV>&7)x}kR@K*I{|D)2M zm$-b?i#6vQ2l7OBj0#Z$2X)^po9H-KFOuB*z<-D+*W;08}t07J>vbz)C(3Wa9G& zef@>_#=(p0upC(X4$>=y&wa`tD)vI~C|!gWLy2uwRP2!zQ2TMgi!hoRP{v-_ z0%H`iqh4?LkCkzlypH4B!)P7wISMPHVF9Jlz(oJ?9pqg2h1JhcHe$xyL?O&fjm?`1ahxUrWK&BM%1lDk~fZCaJTTE z>Mhbjd>Y5pR4PZtP#}+t8I+BG;iA8BU?d&KU!Fnosp=BX*|*^S7xq!_>LtXG<|3k1 zXUdd~XpF2fhjJbC*#8@*$3j{OjI&&`U>M91S&rTjbOJuT?wl4oev7)BhO2WGS_x8& zzJoYt;3E^~ZeSet#D400x_A!#W?P_F2>oWX^-vd(>ld!~^aHZo3yIKoE&L0-_5Kl` z#-U1!sPIRJa=$-$KNWo^$@MZ21B)C7c^#NT4*{RSCBvt{mzB-#`iJhO&}V;;efOca zW$x~~yC%D6DnY#FOs5~+5fLrAR4bTHr%PphgO}Y=Un)EbIz?rc%X*RxRpS2on2w{G zZ~Cv0!I?w}pLhm559BeKeoT_&YMmsD^q_Z=8s#IT6KE*Rtm(izXI3WOhLi{YP>^swkVon&U@r7oq<~&|svHFDfEnZ~ zg$5c@ls72xq->C{H9BoT(=Q-ldP(=)No}t(Vej%b(?)z^s;vShS>`AhC3`3nBpXi7 zQ`~ab=q=#O$~O0T;9sZMRE#I?=@M_N{bK?SphCpv{@xGd>ir7jiRc?SApO7fma_mO zQd<;&JP^ODQNg-!ACy(23#c&D@*&!c8aezAdy_~7jWyHekLuNV7`(XnNB&2I%5$d; zWXVN#0l7z(1JNU*%<@7QO7D zAVaOF4m}!mNTW2&qJHS3mO$>SVZbbq>IqM{>iP7S>MZFZ0{sC>Jt-*_jK0f!u|A#d z1IAgkiS@KXHcXrG^d|he-Z{0F!i%TYv;S^tZAcw|2X*qs^H*;{B-NkO%AwCf=k!_V zyk0mt>ry3R^DJ~hpM?fqk!^BOr)B?28J?%1H4qRABl~9##X?$J`B!;s+8Q*?q%jJ} z&GR`>C*{i;DL16&8YF-cf zLhJ~hm#^Is9rN<_nk{l&%t-7VPOWcYTL;=H1aeFKDMBv~4yTvG_$Xw%Ejv9H$nzKh zwV4=*+7_gzU@&H=qYdKt(IpWDc{s@2v5_uVmZFjNSi}EhA1#-bWNHdAg9x69fpRZ8 z-awTYo`XZ*HfYBzK0ol{`L=;lLDLN>7!weWymv%?7MrN%3W(Y+2R@Vz^tfCAswvew7s`_N1HWiRN3sJa+T<*0F&;3axB zVR#MwO64Ib$~~ys2YNc8lm)s>qwY3Yw?05_f^r}qcb%cKX@&uL6n+Slvu*X!?lio3 zwq2no`L|>1j@?cRa2R;DodA?%xXK_3!z+_ynWIB=4|2lj=3t4R6% zFI)eB}$)Zz7727BrB%-jq;M)VhX38nb15O4%VH>TE#;~Pi z{7%BKSP2}YO$y~6mPQPiHT9B)t6%CZ<#}H1VgIa9@Nee^8i;UB&EWrhWe`>6BO}C& zgTt);Uu%_S5~9rrFae`vr$MYaKRa9`>~OZH0x)s>Flcw_sp}#^Aimwz%|$y9s5xr> zCy>Wd``VZn&?)IJ+ND$p zuclz=)J;GaSSRq7=sQqdM7J;+1g|D2^GsleWb87$&8W{#hdt#6!{;#We@v-R`<{r4 zF6}`7y+I5zy@W@`@bOJ4yD0hc4Zzjkt^H4SLM$Gx4HpeHtf(x%Xb_{9w+_eraYRdA z>w&RIqYYM%V&EV&`q8_}@}s9L8Pv`WGDF)PGf+OPq(soG@Yo32NlW6&PN%1UP0Z5` zYK4LFI;UVJUIU+G%!dbns*>rBOisa@b?hik7|7j)LtLzr0@3Uox~DD%n!&C$8&R4w2I}5DMY*5$HcEkh(GT7I z92kp6H1H}H51$XIL28P!!8$V#>6|x+bR(D{H{g|va=pH4(99CWp};xZ_doGr-+k?$0{NfIkAc+%}Z5DI!dh z5!`*@{+2~CQai~Bsw!VLD}2-=%hwFovi#s3iat^Z>94FbCM0YXnr4O!swQ zF>{(WfoKMRWfS`#6V@lx1~>|=n=P7K+3K$7nxYKm!aW3{*lXHqRtqTU8St3hO*2wp zZUxPbVMe7 zi*Kqn#FrVVHbzRU`<};Bz;wnew4An}<~X!r6!?K5a4#?!_!w{$7z5t}wQ+GZ3ti2% z%zPU4$8bnM<%`*){CTeShwc{!rzj`bBV$O4G6fz#0xz=1zL#Y;odt3?Szbv|K1VG! z19^N`0hZWK(sZB-G+w_X&I%r3B#ItAB{3ih^IvvlEby|_D*J;QoS*L42txm_r$w}a)@p_#G zOq6wc3&?ev1N;DWYCTETX&A5xcgQ}yL-u>?QjTv-eaVxVj#2Vbz2xCq$zw#^k%xV0 z@B2(U_e|wV%%NVuWZ-b%D4Y-e(A*%Z+S4&;xs~U?o1*kH^-&KRAq)}{MYfre92Wqm zFgYHkp)0Wgp!)@EuOsHCz>ECh2%TMnEjnEWoz|l77Vzr7)t$C5MY+ZaI~Jp=i5cpT zdMV|)jD_=+|Nr8C9diP{tu!6$O{~$$qiwhI64C5NLJge8TH{3kv%7Ifjz)Pqj zd;9^^sP8oDHVq!bKS@!3Fk&&P)a#+!jX*`JWJOqM$}m)e`*RAgCCtQr4Rp2Wo#dxp z)}vWt?S4s`z$_U5KI-2avo7;djnGCUk}8KqQHL)uM3LrmK!>r9dPR(GS1Xb}hBE*X zjehD?qbNSq=uT5R?jP}ajAA$f;prcel{7Kq-q4Ps=-^Njy*(9DM%aMt)_D z65R(Gf`s!?-$0|u?n^~6b+8qj@s!C-G1DNqX;^At?Fmr3ac}cFA|vYvjFqhCmjAcH zF2gKo!6IXmEkUe&WtuZw-FX-i>^^p1yGcHMnS01z?B8UI@|$(YpD+Ajxh~xq9Z6Li zc=vZ!WWG8rLX@^!`XJvoLo^1JpS2P544fBcdA9NZDxXj zKO9>`m!*P1c2FZwym|#hPEoM#XA=y;PlMys{aUJESa55 zCW|vESjysPet#p2vuV4O#n~kDVObo*v|v$qVpp`8y?P1k|HG6WHNg&A2aRNg!}zn226yi5t!DZzOK!YH<>TCUG-YiwL2N8WJ~# z3Be+X-%n{Dd%>XdT*%ANt?em_^PUNaAjM)XqZrK$EEcm@`^RE2D^L|SYNV*;njiP* z*6pJF_o+#gw*z}pYw-;mt7)fca77tBFSxY#Rq_QFmEjAE4W-SSUoAEiCD&SS7eH)C z6Qz+7Lo7<;FwBNz@B>SuJd#4XZ3Ax{&too4q((PrsfpAW-c_hzHf~Bi(m1;H6K_=A z{7_&5?~GJko=TmVlI&+v6WPx;k!E~_i8)pmtg`>Lz`8sSl_QkJUrKSI+3~_^+H5=7 zzJ_npSq6{A1LVw%E?EE4GSmgU>ijiPNNe%)v_L6cql;@*?y_;QG(j5MdRl~}qopWU zFWLl$6c%bwLs+P7bhWUMlyG9HCn?v&-796CxO*3B(ox*KQaXyew`i*-R1_Q1P}?;c zG_fZ$ee4Z z%X?CkALv=kv8k|w|&hrPWt zmYsQgznlc$1Y)YD9l!>-jWWTcz0#~pIGIX70EW`-lz>0Icoy|#`Ne*s)$9}`Aci~( zqY!)!_NN@gZSNQ0X(qbA)RR`AOlu50qJuZ>@mSL}s4Gz_cxvh5*%`}4+RIWjxyY^e zB}5yUyE+;kT(rHw(O5enxfv8a05@^@+M(O$3W??W}KWUq>f$a$Xkp(5$Gk({(< z$F@kfW6QF8ciORyW(&reCEGB3Qa{>karr2X!Tj;;Hp?|GvE;kC*mJbPw|_#-gLo%Y>qizv$56O0cT zKj4Eo3v^)=6+bNu7gKA+`)VOVd{vV^b`5rGsF8{|CKlXIz@h15~HU(wmRMUt10ssKH8`Fd8AGCBbBczt%9-ai3##<)j2&9B&|hS zp%dH>e8yDd*$Tur82D!7Hu4m{usV}5W3)`}Ay+vc&Zkg&Ag_4+fN!DTwS?{Qq)55| zXC0(es{)MG$iwrZ_2P~h<7tM9&-9emAqc0m2gtOwXwX+t;^Nua7Ai$`T2QN>m^;*i zvVd&nHA-Z@wKUp<$I9<28soi>N;B=(QNtHo>pVz zn&7#V|Br9OeAQTOp42tT>kFhVHidN!@4p8A%*!(Vyn#P0EgR>sCVBTdIL5OH+qS=081O^VL^8y@>jX z=Y9Ie&)qaN6wm2WF`a_qIKN z-I2q4zz6tMToWok&le2_{N{6(_lV<9x_9qu)`?VCo}wGhaK{R`-K}Ak^C@eKf>)-4DN!Pd{P1-?iX1nMuyXc zTZnJMOQ#Z%^(2%)w0ganzn>~iikA9_!nOnNJm^rj+bK$nR^l>|mA@IPAmP#YF9qHN zKYr465txkEVJ18ztmu;$$uj(FHcjp=7Oz#TnGBL=BtD+aF50IyY7?E$>8c8eReA6^dQDf<18z-()I|n<_ZID3=aYFmz zi?kP*sGM}41C9ez&7B>Jwtt>wh6$s$S#b3(O82F(Vlz(YW0?$(uK z)FV0Lr^{jUBwdeNDUx0YcY+;kq-8*ErQN_JWgeXaW+}f@w+N?_!czh(UA0M_-unE7 z=g(C9f=fww%uh|>83^-Mip57ADnbUmnH40l%sJpptomuWh11iB?C)~Sqw|1{vAa8Iu7 zR7&CQALoRcwaxCv@lM$A#fO&@oXQmc_21cT%N69(nv`HXv8LLIPNj=R9&JSCmT}=U z0v<0R!(V~*kx(tWQxnhV44i{>jsXjl40mpl6HH%tw5}sPjsT6!Wj$8c364sp`}ulK zJayC3{#qzzsP=xSCHj#*uJ43R_GvV)0V;w7rZsdb+d)}98ezbJ68DOVbs>?o8qVQN ziTgxx-Q{7_#^L0LbrcICUXS1hfJxSqT$wT-Q8e}_Ug0>M%1p3_mH>NU7Q6<8<_c=z za`O8c8Vck(t=S!esxO10f)Gi~A`Y`E6P&c^ifplL5CWCYZuntIfBk)O(Zekkx&qKPkDx@S{HSJdTkn)gA zi4mhtXIZHLVfj(^PkKQ-cZ~mqfPb!$XfMcJN_x_H#~KO$WnJ@wFs8OxgQi2%olt?p zG<~X!`ob|7i^iA0`xH>!?Iup}lQXHPsS{hk3~G9hQz^7;jzS-tqQ zgc(pxZ_qew8~0l{t%i3Oe7**J2V^$7xl?2EF9-5fYdH{%CdzHW^Js?Kc^}$9647rW z`_#B_Hxp4f&um$(oXRDQynd$y5JR*!vwZ~8h{nvtl=KH>O?TpQ=QX%rLyTX6l}P+( zTS-E5+VQ+{lGXt~2HiZ>9z74bSqo&kxeV+8Y@s@F(UC!40QqL(6mTFYWSlM;;gJUS zQ)@^(K6SsOkWE0oHT@o#h!e>KQMGhIWVoL?QHp&?8{Ff+v|{b4*8v1-dP1F~Xv!S0 z4o=nr*@n^(d`bd?aRxBi_=F0LsHYN9=Y4QnO_2GRCeoi;fnn1u7P^(1Z?6^VKV8ac zU@66w2o{g}n=b5O-W#}(OYu+RILZqJKXrx-%Ma=(1A%M4wpQ@kx)6T6o*n=uDSgGQ z!y{PJxyZBy;>liMi#T`wzj&rG%z)YUR5NRC3H>%Of<|;f{~E5=7i(7FZCh%9UtKx| zFFv?re{z3#wI(Vm>ddo6hDaTk!|SD4ta14MOVssk5-tXfwgw2>ihG(-Q74S1|L-i) zo15@b8Ho5j^< zrUX-ESFB{lao@HPr4LL_qE{bsLIivYodn*GvK!?*()MAj6Cn$Z$iv$x#con(9-*h; z+h3VX#lT^(ZmC-^^t&Ll4Y4e)4f9 zyh-T}x9#E?P01_P2V{NfjEP!gI+b*K79Z=Hn8Qi=@OWB3gj*2rCO&Dq73z+>yNZW8 zokX9|kPPV!UR`x=0on^pjWH4;>sx_PokKpqWYBDSYMHLOM9q=KBZhHinvOq1k=Sh@ z=TS@M;io;OgUm5_>8J&N3HN5>f-^!U|1-XhM8iGNQ#PE=r_)VZfGe+^W3-05fFQlm zw)%m^8$>&kXh8<{VrtEx_kjJNVc-_KgL&RNzMd_>;u*-LXfU%2vbMP<#2PQ#qhyx?g(?&1`_8)A@aQO3a{*z)WCJ zKd16Abbw$?{M<5%UWGFj!KMQ_SP}49OlxMmi^*Ox4kxkxSYSEj{rJ-vAtMLKkj;S) zqJdnpfdrf{;K@#^obX`KY(_{y|O;!L;r}^?;1Db3<{@c;E7pnsv z@dj)+hy$+O#{q}oKL^YQ%1$`u4Oqbetp_+owY8`UFofBxY8!36(yTR@RqR}RyGB#x zlTKVpy_AJ{MC-`o-ZaL-)9IXW6z_{YrZl8IG*o=6w)SZjl2?B!EhL-Ots*mHj?^T9 ztCp^jzI+}rtHnN|;)&phe?O60)opSq)h5!1p1?$^mF2XzEQ{coYQ9{;6)(g8WE^G8 z>X%fA;)jd!lgprUU#m%D{Q7CJ&v|2af+x?zZvx}3^Cw7hEPyLE>8@AUyS!yV7Q1{z zai>DrP7SnlfAgkW?7 z?b4FJDU-Kg`7l52R2%^X-`Sf%@1BpkzmQtOCtX=dFKXDA76D`JcU3{xFr)W$8BDI; z3q^>0zyr5%@b%_(d~5LTdJ92QPA@DseRVStqn3 zLigW^yrTxZ5U#j%vaWpo+f%IBnddN!ha^wnnJCYb;L!K-m`$VnI5);{c&jMP%5Ngt zeV*skq~(f<9D5lAb2 z91OI2U&cZM(QZ+;W^QBAz1wPDY1iz|W6f>1cjwh)SDRtSl}5kQ5JxR2cRMx_=44Oh zg-}|<#!9sRZjCPuiysvtGaYYYr5iTqD@57Qkx`=P*u>Ui@#}rC4XO7Pte_z6RP3QtZoo z);#F$4~zuAgI;-+&*6PUVUR_;oqKG~t&TC&@-=MW#H;;slTdY71#T-I*_+o#`LKrZ zQoD6zreSVSP2&%={B@_ML%kTf)a|614vm=qu~Zfjgf0P(HUcp9W2s49nc|)?90MF2 z2C;9+BD=WQaF;*$rIoKwkESbc@}9c4NRR(AiaNiA;Sn^W(ob!!PCqO4FetwqkD}T5 zP(Sp>jYPYzZ5+5Fa@IED{x2aM{O-P_tb%O^rpQ|enSp~x_Z%dJgU4GyW~i=ax5kV0 z6QjPYA5NFx5r+>UxiVl&AO{?(yXWif65V}WcQ+m(!}kSp`02WPgYLelyJJW42^5Ob zfLxHsJQ=<#klnBA?vHi%LERlNN`7w!!96|NsVp&U`kkhY z0rLj(8hd~Zv2dF3>Rat$3>UZR%nPB~W1V1~^`IAkgRs2r1@b1Nfykep6iv!F%ph^MI*%473WkAadGKFmgwQ*`ZIW0F&ZjEB+n*jRqp^PNoGxScJ<@ z#o{F(+@UB=36S&XHc{rW8pzktyMZ`1Et({EGaZ0GAb8?rr?MvS&(q*?Yk5>|pri2W z4jBvQ6tq$xw^B=e3m~fM%!{L3_&dR5 zS`tZ%;H+&KAB-g1al?nvH}FYUwv%a^Q+X@$gC9{*3nvcaqQbbj@|fO>~Rr02iU|gKA2YHPZxMx1C|;--Aa3Aa?y^{ zbzmH3&^7VCF_boonK?aZI*>VMWg^sXY$W{*=c9J5&8P5d&hO5k^|g1Mn%_9~Te_9{ z&UPwqBzzr=MM}0m3~4eG2)YF2Y6>n8RU*)E+y)$=e59HdsINx6JNr)NwrLKw)&D)W zCIXvf&du`#wK}&$-rTk#5a)JS=H~ysT>JPS@#Uc?7oq7yy!UvX5{|fk0jgo3*)|y{0=?lLpSd#e&{E{Ha{3q~D zSrCoXwSs6Qh=NQeo#@Zt55KSuSS%^H3vi+wv05yIJqE7~kZa>Y6xssWU6Wc#Hh4Dn zuc|IC&A`{z$aWu)c@}~1fx`^p$IB2V!Zx1z!i`mqa)GUZ>w))RinstA0V;m+eV$2X zh>F4C@nIJAnj{OIBV~d{w$VE`hl_%3hXV2}u-2rrRIht^W0EiWpDtS1dYZOh*Kb;G zcq3PHRjXN2nxqs)!=EyWroz;RRhXKn_Y$Yl)WWM|#qaKEa3m{uX};zItmT+jLq7y( z-og_b6uzaub~}Qy;nU2zkF{lwR)qRcaTwkI5jNTWVW!Oc!MzHNuBxXqG`h zb}t9+KywXUijj{&K0$07^V!qZ=*s=TA>qGM)x4a2efl^tk zkD8CSzD2Df$ow&{a0OH!m;&qpY;GVIeis(2Uv1nt>!`SAw?B|X>9(`s4moFB&^}}%uPdp@AHR6H9o{q=TAT@ zCbvN)*jquLyWfRJ2eYz`4t~KiN&)$<ZGbI-ZvdYUM5&kPjp0w(#ZDz6_ygGn zp?pNNts~odr}CV&nAe&Q6*0Q`)G+tE@ahGzLprsAmxgWBX(P`5Nb?0?7vNgp!$9LE zzAY-CcYrPhD-!TIrP!UY*{KZS1g36rLS>7aLfl{%C%B`kpPfpD4Hy@n=sjZFLNgF3 z4(bzE0+SU%rHlz%qSUpX8hDl#{Vl24HkWK$W#Fd3K`81hAUDTXK<>OtIwqj*o#B24 z$VHt6_b%c*>)7~CIy$rBaE(5|nrpNP*;_vnd8U8Jb`UYUqL#+&jrw+|j#=wUo6Of2et zPy0Y{9D!U=byx&Uh74#aiaRJVf_{aY1u0F?K=wEHi}5@85Yn4E0bS;^yZNC02L8ue z53-8>14!jsYJ_3w8HmMg?kq~Hu7!vp(fT3;qm-xMkv&k_bxs7Og;CN}b9B z*zW0qhv+bUHzLI}cn`1=LHLo|4Pe{w!Yw9E7$pNd#d%x!?2{ZU)Gxb6(NkqOYMCY* zRSP8`?KqM8b=Md%G$b>guHzF|yZvwTqK!xs8qZ5&spU6LNPpr^3s_gC0$BHA>u`lUMc=iUDwKmdz0bQ@FcK4Q86Vl)fDnv9EZYhbTO$f>9p8&Sg z(#IXEH~q2+(&P@Ozk32baR8h#(-?>+(uVIa`_N5z_@Zfaix6HC(=^1Xym}-dV4C6j zL2-O{*Sa(uu6D|D`U0q;w)@ZCi1Jl!xYaYW5+YB|eq!sMuD0OK`~5XdR-FCk`>Dr4 z&VIQ;jnuP04-aO(UIDta(nr@wgE}5^Dz@P7zmcllnITa24Lt$Ro&jL(>YPt2B}LX% zBE;*49?dA=FggMC(Pc5b4JVZtaaX4!2ue<`09)Zj$7YJ$3dyX4rG z!w=HxV$}0Dq5@cl-`1Zbhb;9NNb0W~EQ@4}YV1t(QDcoiCW;PpjidPp@2@4ERGs)5 z_#tun5m?*0@-vNDNVhrVgugJ5ENWA2$0ON>O+{6Ugot|o_WH$AldU@JxTjhTt8;e4 zk8}PNSUcdxHVZSMQR3zzE2&e&U$rAz)E3q3QBuo2$+f6XZU+1~xlO>@)|tOb>$S(= zVpf7sof8L(a(|1J23KfO4WjDGQcc;WraDlUZe#Ifh|Xq4P;?Ay!uuQHWk}9yiUf7Z zSr%S~ioK+1v!g9i#h%FDGL@NO6(25i2G*4G6cx0vQ8h;_bn(I{O>^PZ+0`2DvftX^ z5WBYRsn%SW8M={^$|~*(4T95uwSO!E*i`j4qeV#c>i zgUNXk(-npoizcs$7|xpJtTi;vX;u)@zHXp27NhbOV;-Y5hyacn-3HcVscFU#Si77k z-Li-$yg>~LT6s+&`0vuVYG&r5X`1GwTXNNgz2iWHs*>?dlvf~Wx+`4RADkKhuWVSs z5nIO>^rzFOoyq{?tb#UQ40|VMf?`=pEM_k%p3m(l`i{=2ueinN(K&W(S1qEV#P=al zIXXv%&lq!O`1^%@TuwuTPoI*r*|3x->naX<1~=?qje0sYnEq_`}u1uh+w@w z31X?X0rbjs<|`e7F)7~YWKt>cC+qL{8i=p!Z(!SPIOHeP_9@|X11=^6vudJ>-|9n1 zpz)t9q|igGcsFM%`XWCnNeZy~$+w5%#hE#Fe4aW}`|M7d#$1_Iw>Zn*B5PKT8a(D* zfAwo0_1$p^Y@tOI&B{qM7hQ!q3MuHRiCepF%PDV8CIK)W9vkC^QtHYDY%??~jv4zGu(mdT~OWjI_y)9`1u z;qoq;QQxHuiqhW~*~9Gtp$6P<%R^0^811(qk{bKD6kpn4b}8))e-zRU{CN%A&uoiJ zdDd`Z89m(41@$7o!`TnsnO64xY&C7bpWy*WP1l@wM{0e2Ikj0EXaWAbf@mSgRY<)bSBw`mHuLas|1R1?(B+ z^%M_&i7c!T{~5zyVnkMg9$W-`l@saSi7&qxz?)bV>QWl9tV-eRHVGnQS5CDt6DScB zCDX^ph_nuEtzs0uWIXMW>#D6CI{xdyReLkw5wp^@3?gdvu~oDku|Siunp4XKQA?&( zNQWL|2TO;BhP%L`TL(f+cY&ou^&`T5!mFwG3nFHF(sNX{i#(v`iMifqQn*`sCx`N>L{F1Yb{_5&1!`*(y0U#9m!t@ zwo|USTPA7^WuyysZn-Q9P2#3C(nG)x%x`nA>uxG?SAAC?NHxxr?lLS>X;II1de>8Et6{1Xs z_3Wc#?N&Ma;D*Xq#cCx-=l7T?cyzYG5PV&^PM-l?hI6Ei$)RS9DM*85?Z~M|xek}I zh&^CFLi6aDqI;C<9)V8X<0t9iJ^+u`74rlLU}0q+(bg`?pQ>xAZuZlEY4+1Tn%JJW zU78cv_l))t5|3x}8pQsyv3RydqP<{FOio#dTs;~osj=Srt?;L{XE=_4qb(1|O=&Kr z%rhLHQIzl9SDLsWFA9QNagR%x#uQpbN^_oK`(UIcu*W6cgGXcw47w6vC;o7m5Qp|v~=MVW8Q29 ze^DELa4mwh8=wFwE+S%|nDwd3Mnj@sGnF=_+X7^~IjMT=p- zbWVN9y15j;FkW4Lt zhyU@`Ge7xj5Mi6UM&gN$@urOc?ZW=0<8D1tR%`r^w{HJg zw$>oHw6t^a=XLXoNP7isg`9Rc6+D4KM2#OnRNNxn2W+pbrMG}nlml*S7Z*f&!QNl+ zAWyo5bQ@S|SX`!UO6X!&9tVrdaQ^IxG}nrBTW)NKIt3o;Tu~3FBXvfZsMDC=nN|dB^i@F{*!tkaE<%XT z5SEmCt6E!R8r9=@i=s)(ieod|1pZ5^-NUTz){}_%XS4d&8j1FzX_+ofYF)Udw$YZ+ zVtBN+?0es$7XR!v_TafvnM!SXVtcMEb`Jx-Z^ptJ-p8eUsC+;hffEAtI)TfENw8aA zq=3U_31#44IQ4tYrPOzSjsI`*gAcVoRJ19JsSMc2L_z8y?GAO8tT~WlEhttEvOToGRu~%i*-g(zUi&sUy+A~s2zqZ~gRtDz=5|iUB@o-44FP#|d zQa%P@Qa(m!J^iH>ZGyx3=+jXBCie#a=q&~A{c4gRT-A~FjfGEA5WfU#_oBYJ=z~Ai zG`Ro{jV8Z)Nz$b65SLQOG`aj0m$C#j+5J@)EE)Hq5@2dbP1;l^L50En)-Xz7ngn%C zmTouGC@BVTO+p{*i5CN)#kWAClYxyCa<2tK_#{J}LrHIernkI_y$WASB*Mklr~QEs z-kYH=&~@VAazbAX7fO{ptdeD+{;}FbBX*BCvN5T4awp}u@Pde0DNL}PXjLv}?WV)P zbQ9h|y)V?;v!er~4l^lgnKlB`#a~`Hje}o0BmqAMCRzG|B0e&R;=%_b;_l)_E|r>= zG_GmzNbH`1cL|I7osYU^JglxkJZ}&@8$-F`4B-7Kn~mzndJPoM4blo(J7%f=QYhu& zFoi?1?P_!cvjrdr-dmI(eIS_T?oCkQ+%xkq;VXt4^=k@Hi6QAfWg1p0HT@`PG|n4f z+^uQ(Gj#6O%hk=O;6#QG-y16zv=M{q=Z-WUE@>kw>gU!o{aGL8hSTpu=!6Ejcx}8) zv}ll<5L9}V^#PRPCQ>cEO8dw1L;*vo4RX_hCAY!DYY5X zi%5F5Qy2w~2cg4vf5Y752oHCI->5_CE)f78$1nuxiTHgQY4JBU;;S4|-{uV;IM=g# zhKUqMZZrgSSHo{K=rjEt-uv|y6{*p2Gz^YKgRX2aGi7bj1DY=l-5a|s&fgiNi zfa$d_vwt*(OU1g5;bfoSQcOr8YfDfRMAs*q#i5kkhFU6Zt5XSb<}&a5p>vaCf(+`W z@;FWhY#oj7!@VTM7Df3s-&)jfB2KtyAochuJ3!fS@))Z~$Q}dfMV-T&xd19VUlmCY z@2`HpTo(ERGg(#lkr)HsFPAJhd9TK$Wd>{2g3~Own11tgCqUMv)8XRWinGD=+!War zrT5N=6y+lqTg0%mTvH8sMI*~ARxLcqMR01~)&Y4}JWU!+&S>Q+f)VhJyn-HAtu{Pj?f87M-?7TYS{LbMG=EJ6E`? z-gPP2Mgw$mg*JI5oZgt@Qq~)$giurAg6Mpv`!is?k$t|M&qsA=xLJTP1n!HPX^9F9 zkuRF1Eu!>FOOz;&&NGXxW5R2Pg{WrUd4g^Zt~aZp>bf~`B6I8r*rGe|oH@-NA`QDj zFzE6U1)|BiRULiMg{YbpS4}b*0+1ky(HEv^B#}Rlo)lYyJ4c8Crzx1eT!>L?7&V*x z3S7|C10Hzy+!%JxhP!X=@&$L*x^zAp&voPVz}nPsG3rJw*eP$k0X$E%+X&@PQNCng zw0rn;rdqJkZ6n&*Y5KDXij|6IVCFS!g^row$yo92f7)?}C_hcj=TEatBC}@-OlMdk zOw{iA1QD^Ls=ThBL z8oM<8hxl7rn1mWCeR`v6(LTjEi!qi9Zjr?Sg)Ron#c=}UMC2m-O3^L6d#8)nfo>U$hIzk4y;0@w`XOI=1Al+6~XQbbS zdQ!R3!7Ni*oTjaBlcwEw$aqr-n&z2HH0mYTRkcqp5bK$qAvmYm3b5QzB>&!e${w*QZDkgZO!1 z6OGrOKv`D|N`zte_w)rk6Ex36k+p3j49df!9%SR}H1Mf(oSOx9ys8U^84`(1(ELm2pTK+-mR^c;31%mKHe;j#`bUIC63$`?-s(Q30yfMV* zSHqodp7BR4&QQPLer-5){dCKQSap?l!( zZ<)+3)KvEhS&zb6x9l*g4%;J?09TS>vO?`Wf1bdfROL;|2Zlv0)r!N{4%G$Ia@`;E zK^;2AL2zTsif>4Y^C@Xhq2)SV()9p?mcSaj-q)3Vbx!OH+n+6H@ zq440>+-9|%);A6580fPR9fyDYfF5|2qIVA!V+6#~-rZOR3bJr-5;mnKuPakQ`Qa_NNqcOVjU-M*3xeG({O`x@MbMt zSEn7Wuc}=(xIVv0)-7l{Nsl`z+szc!9bT*{c^Bow9T|i5-A_p?L(sKn;gMxNe(0%ZT6V5f6CVun=D#h4#j4K-IjK zhXu9UhOAJoEFg;(6HtYaRRyr6p?EsQZ|8mYdFl?-lm0)c4hd{7 z)57I+172+)r+yzApM_uh1KXhKj#Kd`Q5a>Pz~`j!oWp-EMevuh6mEowrl;U) z6!^t9R8&j!_BNUaFRtiupkA62dTD;~R5QKbK`Mki(wS!bVWiP8XhzFIrLyVTR&Ahsg(WtCaw`)k1gi zv1u-K12!`Jx|ZI=pLD|p0~HTR)ne?22d8?O$`B`#>VnV*m?z9+=HA=*uXpH=3e+3sT8%VV&;E5i_IU((*t~E8 zSGL_=S&=ND*8RYN=5p$-GRUI87M4f63;5VMc;8WIyH?ac%W7lq{up&A!GLoNQ{T}~&bl2=3!Xb^ zOAt;9>bL_&D1YL8K5Py1J1ySme}afzJ?tehV8F3zX0chF2onvgHaD+#1H~+F@TMaG zSjLm|Z2pn;Z)Q|$Y*qczX0kW3e!9O)fr>?)BBN-sry9%H3@JxfHC<__m2b($I^lh3!Q@ zBjQ=*C))oV^QLq@VyLw8qKg!RA__!i)(6mwco0)H6bUTSi|Mic^;3ft{#5tZN;oESS(nPPzSqBP ztyswl*KRaCl=`O+b9t9(^(#dj-06SM3-3>K6L@csC)_O#M{QAWek?EuxCRtk>j!YP ztxI_yvq}+}f9?&VKjHN%^dDs(btxAizmoMMWCb+Jz-u|9-D(ejF!E-2Ho_+T6fg-Y zg#3>2=H^9e0ZanNvoA0m>L;cETVe|O8racv!>Fzk#jAdd5@}E0Vl@WD`~ zJ$pSZ2VdJdDA^U|R~kf6NVyC&4tQ5F%Hhey@UM`?Z~{}|?x(v)Xzmwjh2|bh`+>qwY=Msw}?$@%vovh0A`CRY16aEFxUM4N+8{w6t=8va-yDlw4B4rAZ-VJt z0jZE4lkQgluRsMq{}>g<4E7md8^BY5y|99qeH_CS8pKn8nTYQrK&sd;*~|s5uKu zb48iVe9xpSb5R9VfVUu(UjXAp3x&oz>&#$W6m^y)&N8L~f{~hGfUhe&-aiygdFeGM z2>yUDZr;CurNVLq(FUGNSKe04H6H^`Qn1Kmg<2TT7?~mQ-F5+8apUQnmz>Ktu@rzhG3(ENC6bIsb}x7&rVT8gfjK`)E(ABFRxcD6(F5Z1B* zt2a>4<^tY?<>hj~7+=!FilKkLR=4j0zud~Td9x<#YP#}0on>r#yT$6kx5TsiuBR)L z&5JkVomVG@sRf(aKv??X#>Z}*hlH|I$Xfv039nwH)SNSmbexCB;eN112b>7QQ5XEp z;j+Ca3-Y3q&^wtETau4#65Fb2W7qyo>;ydfW83y#pkt@6_WAS>aV_sqvr|#=mH4m# z1Yy@R+(G?L*id%5moOa4I7)A(Q$JUHR@MF6eX6-mv$8 z(jV-3S)5R1P1jaG=Lppnom%Eo^*r9QVUE|G_!#lNDS|0W-d2vT&3eopj=S$5R9y2- z#wA&^;om%9&K57a%mOzr;t0_e7V`#>E!bWif_Gk=N`kiQi<<*jo+qLNQ=viza5ELg zWi(=HHc*JEUjUO)BmO8a+?f2Oey^iNedbGcJ3RZKq+SN3+hycFZFhXe$7YomX9a7! zI}fokr;Xyo&e36`gV`uJ0?psfW|LqkhO8N*1zlef&Whi5Vr7=TwpiMW9ITbc&9Jh; zy<%{IcPDR>tQx93)ll{PcCL_S_rb4qa;X|8^5h|w0ld_Bo+a7{zVf|hQoS6{cQ?}_ zK;0AdxYtIW)lbl}vTuoyY54f)X*74GkqSRbLvH?(_t1K&Nv<@GuGZ5?(hC1#qqCQq z%q37tQOp0XUZ}=pl0UkVjCUpZCnX6LdEIyQ&ArX)mq)mYTssRV@sGWY_p=&br~9f< zXvFzdp;9AGSB1(w&sM(YSu@@h3WfMTzbh1%kn+1i<>kQY`$@QWi97l?x+N4ZeXp*q zYVWnAvgs|MP{gyd9i56J@cd`u3_2YpIQ5x@IdYt&;u2SbmcsErc{S*cAg8#$maYb^ zY9<~0X3!_$@}kWyPX#-%0k)7;1JYUUU!>a}BHT9vQh2F!zbW0dfE&!yXR@j&`n;y^ z@Ur1*O`9DWHK`~SQxj~@=9k@&hEF@Y?o4=9G&%@>AKr36z;EN6GbjavN-ScEl~>%* z1Z@_c40##{%fiB)N{UolRnrAIq_*k}&qS!L0u}B zmDH}{u6JvkhY*h)9;Ce*m)Sg>T|u<=^s67lsqMJ-Dp2n!fbB`x$d7mz+f&{1N-U0y z+|4>h(ENBgyALp<&ExtGP!~&{YE#t}n4=^~y=HQFYS+C+HfP_0It(qL-vbd59v;wF zc{V2%`eQ7KAn(1y*hv&o3L6ifo={ANvqBVRbM_tFG3cKoES3{6~ zClEL!!D_g(eAmo^E@dPtYW7R)Bz!WIv#do6LAmliry|-wAlI}~qoFpSCP*IYfk=mG zjsd3l&RH8PqB{K(k1Bz6i=o_{WxW9%n6i%rBo>k-3pH>* zAS?oO2t`w?s{3g?dngV($s4Ds;cWm$tWwPm19tN}HdE&2y*FZIRDB(^%5k0z0wf+L z0}>BTZO-|U5Vjl6Xx|TYy3bx`7vR$o1Q|$)2=W1mAWJg+8r-pd&+U**zwnx#(rE-x zO4lS|Y`h?BCke;Fo$a@0yCj_Uwodpx0s_qEeYGy9mPfE_aCwP5cQEETn}3FsXEnj8 ztj8$SQ45+;8o{DlVicmuYUNj@F@9W$D(9-K070oxLC8x9^vBQtc82PucIMr`R6ukV zUlmCI-TV~S9&!Ss`a#}vV4*J;+wt0XYu5(98Q4PJcEE-EjW5yOV^39|#9|%#4_hef zkw}9&uKEP*jwgd~YmkZ6opa!M9;v4d#M5Zk5gMOBpLP-~5FJnED z@Wp#hr8(dxw&adx5N*rhHBc|GW?ML}dv?FY#D@Ol1ezlmqife995WC_fPDx5`Bb(S zu1YWz9~(!JMBkvZ@xoSKS!irAP;!Ix;&=ucZPLwb(+*F%BaC^ZII(Z?Wq-W6dG=@^ zxS9Zu53q+Xr4%lFgT^$H}3s0P*#EeW_rnB@I8+^v8jQ%{;iK(8HRztL1edp*K z0koCt2RCQst)0rf!Aqy}hb4UVhb15`;bA&AVEj%Ef&0mu)gg`B8onJUxpM~bihJ(Z& z@b+nb(1A;W+G#cgp8d_!aZTUZln@^4o#(oTxfEx4fX5FCmA z)Erx?GxzynEnol(Y6l6=`qLq5Y%1(gz6V``Y7Cu!;k#8ZNgAf@cOZ_dz*&m*Vtz6F ze^1)OqYhl!lg~Nuo8h0+Dz`l!;VE8mXe9Hk-S8h}zJQtQJYB~}pIOIZbMR^Ymqb3F zE$(A$B=ku)Kek44pEtHvY?|H0_oDzdCpJOJWs_c~$^Is7{XJ8fv+CcIl;5=zdz$&w z6u+6S98%2Kp40DbTBNFFGXYzgEATkaqZl7{z;(A7FW=S1-5bIlKN?3m2@kD)`wf#wCXYCiAmRMI>=o}JM}8~4Sc zR@%^#Dj(+P=EN3KT$g2E6luO8#K!g^{N~Uz^KRHK@%xK4?em<<7m7#4+%7EZ*A$2; zVwVMZXqCRphlWmn?gp}H&(8t&yD^PcX)hTaOTzBXdy zw)?=`k{LT9&G4Lk8@kQV1=DX}Zu$!~*AN!&0Rb$mFQ(%ESGzFSef{t)nioFDDq*2L zD65}d9;patsCHp`1zwRlZXbvXOzXgAFTcGD6idr;>tv57lqa>g@SCHwhUq0KHSgzR z?yJur9NO&L=K5fo(De>X8$9{m4KsTlbBQP|&p(_(s@x$K8IsYZoI=ii?o^Vrp+46!6HI(;1^SOa?WY(BOD3A;bU>1AR{#=w2^_C# zAmsm4zDYtqcIM)RA1re;+Q*Q{Q}Y&z1?ntjgZ>t|ePSQ%w0+_VAf?bsaMBkHW?$t%XuEK7ROQ%DJ;XC#b*JV-@V5@=C z&0I5^6SWMGlCfx?Cs|9N%NRBpVxV>0&8%QJ&A1i;CDB~>I(q@mXjTuWKNb&85hbc3 z2)?uo+Yhjl`MEbZ8m%sT2oD+cHbc}=%&!OnAQHeU@<0h=PPpUD%a`F%Luw0G*c3oX zxzkALw~Ncnyk+l_#8-gZRxIyporhj(&U!zH!V}Y{+D63gtqpkfl~RsiD}d{?zPO3@ z2GqkYm!ZEg()k#6Hsp=K42~B3ABTlFeFu;VVJ9FhxBnm_4z;!Nh$x8n@TXPtDQ{xJ zx6}hK!c_n(I$)2?1n(iPu;C+Jncd5`7+_FFD~Mp9A%KeMM{UES{e#($aJI7UyiA|G zZ4`L*;+u(ZCeF}u1|xv3?HUQ#o3?!%WCdFzps(2u57qkdMOusx8tuwyebqzw9(}}x z>Abm&qd?53Uj$UGA6=#7_HsXb%Yc;2U$oWb(4O}LtuIzc1_BnLd2RrtT?y9!Rr7__ zOdUhbbPbyTDC_gMv1t8Hxa;$Ttk2(pdyDnAV{|kqd#sDmlSVo=0|8VtrzFuTxVu}c zj}y^FH_@3!M16_{(OF4U0=K?D!MJTAnwP(gJ&B0yKIdF4vbYkAqH@#1U+ke+k6`+4 zF3R|?!tDs;dluA7ati6i%CRdVTr|(ihU$(3;h&VrK=Gdn@FM?LV5@dg44D^<(;S zZ>5`9PK_FEGvICjq)i96Oceea zAZ0r;?G!w^rg=|JE6plkL1R^8F~#<2eC44EqsyK==&B4)nn!0QpT zah>;D;c#s_z%6g`n-9bxK7I4S8Q|@+VoiK5Rsze%hkBy_ zKw0x6ST~-|M8r-akoZ)^(8m4E6+DQy(fi%-^P zlB}B%u(;S-2FG*67A`OYTM6vGGAP;XqSblgX$D$yW_WKfE+&*sN7zV0#>qmC9Q_24 z19jwIIr0*g@hlBjeG%r3HSPg`Z=r==2Yd$I;4@D;mD657(8f@l3gk<Bo(1>}z<;x&M|mY2QN($fD^fV7JK zfpmY*-D8+_s$eP^Fauh;d!+kuK-y|h1xQ;B)&WLifcz1#1>hyXg^2g1X(IlQ0cmSN z%cp1{{gmAW_$k5zpBCX+fD~Q@Na4Eyr(#3FozDpOG{Cmt`xC%X{(42d#}Ck@qnZ-@ zq@N>-_6`h$7wsL`sl}B(6vh_9NqYzC0BP?)^XEjWodGG=qlLR>I$&!$zxT=Wl)V}3 z0H71l?*&@H^0z+BNOp;1z zhPe&4>sZ9!HVd;_5Eaj+$d=a30sK@f{2vw@3Va;i^zthi@eFN7V0 zPb)0q+g?QzG%Vs*8W-{Js;NTo*Sbd3@Hz!svdF1a{pHgAk}eUbuPP^e zMm3K+y#RACF)v^}!rA0E(KY=2f_>g%v0&dYVzB#(uM=M7B3Ib#g)B=W>f1Ada-g~n2w`p1aUKaF9q7trU zY};$I@MY@NQ?qbF$Z<=f)%T!38Lhrw_$d;iEwvp7bNXP)#h&y=F5K(zt~K(%UWcbO za(x{hiwLwTJ|v@K1axO;a6FCXhBR8TYdnoU_)BTXb$EID=-;iw>nc>&TDg-wx6H{O zIsPx}Q2*~&%-!#5vWgW>#S(C3jnL``LK*-28kUcTHQVVAYqC0^U{~q?)SH?O*K)PPho71Nj>dg7CDIJ%xSyUH9JgoM zjZ{-zRA(x&S|zB|N!ugMaDr-J&58F&4p&~UN%+u-qgdt{fi;^y#z<@qn1RAb#R_s8 zN7jqDQGd`HC*Jvby{5%y7)}(+52HMywGE&5#tE;7@AqT1&J?AERy*Ah&Aiq*m20@^ z{dq2!@Q*$4}f90wFC#yD0FvLaRtj{Q&+Wq?!^2`qXWX$*G59b-QB z3Ofx;y7>xDt$U}1dkb}z4>W6Cw+ezJHWQIXu(@zYnJX8vRj^>2Bs%~|dckWFv6YPZ zj<4YFyZ<{}IiCrYM$Jd;N%*MB4pu`Upr{9=g{(+$(t%VYcfdkXRsa&h5ZRQ9%CVVTE3xammF2EgX#?>}ezVTpmq z6~J7SOUE5la=7vy@CkD*#5P!*=97vRYgwb0hbPJ-eW!>yM~lOme>Rz%*6U|Ujkp$e z(lqXuD7m7!rSBp={4iDpNWq^25^vo^41v3$E3D zE|(o)*JiRhkl54O(bXZM!C9v8s%WBa7$#gEm2IE?*@pa`UT9dMv^`w6Or zAwP&xs|2LHtpmKt`W`QJ%N~RYHt>v~xV^9&{Nj-`E|-c+=zt|PxJR2W&yqRt+ADGp z3Mg}M#7NrQ-+hKi{e{PYDJYOznyZ(x_h3oJck?4rQ*{GURpLr2Bo@jFkd0XL%2)X} z8y6rhr$T=xzL_Nmm1!Ptl%|hc*H(pZEysNAHP#sxCz2WsNJ-5Aq@+&Cqz=O!Y<}}K z{&f;!;(meH3y?Pg4)0~_0W+;H{6U3z9(JimJtq}h^m+-rlW`7!$W`5=3 zu6?M?^lSG2k;=?Vzi?kFFdE!jNn8qyCW;m>^{P zKzupVp)SMkt=kEGW@e*c>V>HuyIhyz1C)zRuGI!8mizCi-6B5 z02!zU%!WJSxQ_UmK)eGU;bK!2&JhvmRQM#BUkGIH!jgfk?c;C^^F2XvO=anTq%j&K z-R07~O1kR+dnv1HB7b)(D@diFU$-yS241SXZa)wzg^wDm8@$wyg}T9R&#yX7a>rfF z2`Fx4*=JH;-W5$#Kvn_IIH5II!<0uXn5eFWS4t`_XZcLV>6#6$6>-wGY&sGkZv9xR zE%~-Xu)~4d2tTcZWMwy*#O@$3b)Al{K)_eekZ85^SPgB%TB2Z@UifH;eqlXbg;KeE zFecF2*`K|7YHO5;dsxH2#E$c(cv{~(*_uCS)7K4G(y#s$`+u;HE4gZCYbYL0oO3D< znBVo)DjwYup5UWSznDv#R+XDf*&Y#?>*PJ8>f5Dg>Vth!&z*PTp2z9hxD{W8vMX?q zhNEu9R}oh1ug7bll^(cpf64`+oLB`YjyiksJxc5vJVF9~+3TL;f47%8E;^OFNKIkG zMM}Shuo-aE`;3PGNn`LQAZZNxUDCx`Ke6NK`v-pw37GekmG8gtgp@h+DYg_ychQD0 zB@a;rUv?^YLTw=in2O zarl}Yr^Mqe9Zcb9Wj|iC^UT{}-*(L|hdOG1*x(jLO94C!`~ZY|pb8UND8GU%bod_37jxKsTXZMCZLYV|^Y{=qq~qDu_<^hAt!p>PFRZ1{NQ|IUUZsF&pvn;NZU z4IUTGcEIiD_3Y(H95}g8tKD>l4iB(D;R_`f>vD~b(cneBZR3NriU*F`wDlLt6WBI* zcY)F~POFT2B3v7~=R0v81E(j}Kr$m0jfM5Rj=ssCdf8U$(eK5Mwn^}#V-oV&bk~hc za-RdT={|~)Xx!m8dQqPYdZS*8yY?2py}e+}WY^t3hku$yCmEDypLE^rGpCB*#a?jx zWPZ2L;qbY+{B9o)-0idK_Q@TPr^5xf-x`+%^`0E9<^3|t67c<6{=_V{MJno+wOoOM zM~LY1pI}zLE(yI>{>mimTf&B<@fF553O(u0pP|K*3A-+BN-(PjUMJuc_L*$F_y?Ca z&eF#Hv9rCFUosh64K!t7MJE#DCud>1*)6y!*1Ke{K>l?xvtqs0it-qyqkH6Z5rY zU>k3x2O9}X9@@wV8E8j;uonSSu#m78upMa5 z0^W-TtVD2c79@uJ(};}w7Xx^ZzA zjUT^4CR_`eR2s_aff```e!Rz%!wIWG5M?Dv@beFk zw2Sj%vLz+ENdJ9SQuM53;dUNZRvw3AkYiH?e?*;X(<1XCo+lAczO>c~7u_AgSU7!a z9~}E9HA>%F8#XC4L$RY?UjU?)o1K8JQm{KYM=rU*$u>k}D30KFS>Fh=KP5Hmx!=E`*g1PQe8`_5t&J*)W9N3eDaMK+?kd z;N`??xZ?v(8)Q0Pt>An_IE!&2Q#=MgexyDvVD3xe&=4I!pYjr`07C!hZ5I82s@x>* zrHZqtm&;iBaNR&Y+Yb~Xex>cUNPea~Tpaaw zW@RWb{x4s}aeQ^{$KpY*d*Mg37x^HWOJyN8l+%oH_bFXt5vl15*k>o)5~3Y^rZTza zD(LgD3F5!|4a91hum75eRQ~5*QfFPVWbFhjixHbXVgyt?Mp154mnmC!FF|o z>~CGkYwQZ_Nlzt1osAVX2)m z=)4P?3HYS4jQMrWz=fvwvl)QzuNj+d|Gzkk%jTLnIDnfI#n2rkux}kmf z*KEO6jOw-{IHe5z)IXh!qC;yf~cp;bqV%+@w`C> zG=C+U@v7s!JN@L4 z@H8obe*_Cq!K@kQyyJfQ$)WA8YwZ)o zkAH*VXcEXA9_oU#b~OsezAcc?)ud6utP(Wg*tq;Mpu-FATSGT@H(L*v6TYXp@1Yan z+&And)|sqbEf++5X`vuVJv-AHyRIs4L%>=Xr3=qJ{3Fqz5qR!h|8c`?8$~{tV5h z@R$ROom%BF$4rl{e_$E1Fl!99{nk~-j%Go(WY887wgm9Jd4*XU_xji{aQPiu-4i{l z=hE-!27j%f-}ZQR6+SleGP73QZg#i`>95rWtaSJ-23CsM6tAcYztfbZCo))hFXRF} zrUz7j%APsFT4~ryyyFeuEUvpSLwBK!E<#dr_lS?UZvg~eT7mz$7_H)ka?I+duJX}* z>?;HH8yNCR(LLgxG7PJIk#z!=2McD(^{R!LBoBtH`tv%viig4JOw3A>7eFNR4J!=oEn;5IyVqS5ZR&ej37TTdJ zV3ztX)8OQP1nw(nJvt>Z-&y%Yx6P>H56~Q6~Hyt_rmkuYG-xdFP`?{ z>?`;r#6GHPb;PiUuMf9LE=lNM?hVUA9M|cWp=4U7V9UQ&xG^nK^S$$o4+`>g4Wl^A zyE6m!AAy1m3);|(ut+U)Td!QGV;uYyP^AQ zP+0TiZWF>Fdq!tU&jNYvcZ(v3&*7 z00f1&?tcVpeR6Z+(KWiIgqg_lG*E=GSwkUG`HFojC@;K4mX+QmSgXBbC{c*l=18ts zau+^Z$Q5TMvJfqQ;#E&}5Xod!|&p~a#Zq=@nmH}y1b`Y(LKZUI&sY6h7t%c4;p zsjl)^f{-bw_STxZW=IHh)m?#vhTk&HmCH2Qu3e|g(|HhzMJq_eLq)t)yt!V2w-v`5 zC@bC|LgWjpf)%p1lIyvYUPz1)I-cbAyE&})zD7t;F++yx!Z}|Z#|#L^Ag7O{n3|$*)X7W z=Iy1{-Cj1Z3bdDy0R6xnByW@bQC17wkPufdc~CE*^B?gN>Zx33c@N-&$6&a=LrJKX z?{^?Tv#U8bvj!AZpw_Flmp|q;r-3sRm6tyZ)r1DGK7z}rD&U9*yIZx@nPnloL9l)B z^EKzIZ1sadsMafRjtBmnJJ7Sdix!aOw_W6iN^U!jK93C10zXQR*9Lyw3r~_(6``v| zlsh#wWosnMhqJTSZ#5nej|Q>1aJA%(;#<8@d;zaSk4N!Djj|k{QWdlS-hQs!p4sAH zYtTVPu}lQSD6g@8fbn$b$xE%%4!180XEWiGP7IH06)an|pC{hn)W43Z5tQRsSqs3P zJ{Y3xKUhHhomSboB$Q2sZvtm&kIvG2@Jdu3)mGnKi5t99%dG4Sd<AF;Z~V z4N!8mS8z2MKBOiXIvu&u)D}w`uybPW;Rf|<0JX` z22IEjfn>J7%FY5QDRPxL4g+oqj{U3ViSc*?bTkCM6myz=70Y@EvbJTRKTh?HyVH#4 zalgy9x4=OBE02TU)IxnEBmyKvDzIN!!A3<1LCGA|dHIyBL@akHtC(dB#^s=`+v@PN zLR7pp#T*f5Q=i?%y2HO8udzS$8modAYOLx>W$on7wZG$MV;Hp@Jft( zR6Qf3{i_k-@O4kg`!B!_G*3~q+-Fjnv%nH`QKI?(%b0^d+&TEekb_r%PB}PtLk`Zn zbFdLeeS$gbwy1a;6|}Fzn~FLC9a0}&)K_%opMY1Q<566-^Y4eV)p)=SXjv%nKLBNk zUpDaTBeqEK!D#3>(f0J+P;M<;gPX?V9I{Df$FTnFDm+Oh-2b_dyzoE`V<9)9*OS@ok}T!@lP0iPu-_6spa z2D!wEJS`(En+En55JYOD4MFFE+4a|{bGiDM7!pIY!Zu~utlQ(li5F~<9qnLB*$8cD zOc@a`*@!G5r{S92+M+${J4s|}Xz|^l+UZspU1DN6-jGf7MJ`8h9?w~Z%-MGM(+ok1 zjenIh>=mY*#j}jfkgP4ppG8w0Wl21LEkypbeU35`0dSR!l$P?eu5o1~0Z8FdKO%xN z9J-W*%MDyr7pBbsIx-T+v#jkFu6TEjS;dp06cV)jR%P9^AuE%Fyhs_>*vcfT%(|Gi z!7LAX3S(U-3-lyy-1N3#YzUk^yk5YN7=$759k>#BL9~$tv4?yxBBrpochHjD{n>Au z9c&>QU=-_KjzI&1VIiQX-Bek-4e+7tyM@I(HlzaSqlW5Gqg1^R3F*8W34ye3lOdXB zK&5D!lL4t7vv@sfL*Gjxfu;?sK#NRf3*QuZX{#-X>=4HKPod#`k;scSI<+i{mG1xs z&rmy&A?>B)GRjYTo}W;yHo45({gEx-!VZHXM|n+)Nh!nbZmnBNSx+v1qy|7WTKhCa z25o%`uaX>BCEz2{`nD<~M)7<*mHX~iWkOElj8^Rye0I^Y8h#05cRmF^Z5UcrPi#KX zPNtVdvTFF*0;wCw7K}nD=&Hpz%Wyy*L4IJln>Ma(S&W<6s*Rjk++2V$*PnF;Z$YSr z*jhA7Y4A|`JKGwMh_-tMpR`;4*sLjS@u22l8ohaO<;eP9 z3_OyEzSK(F;u+|Ja2m?%wao?=NFch72q^LVXGOhjqwc?>j}+2q)>i#B61Kdms5{u< z=c!xS{Vi7RSOdJheNHZICgh==f}fJ-;LA%zPTf%|yEKOrr%A_tgG__5-E8Q0r1Wxi zl<(nE2GpTmEVaO+VzDDJ+4pl%t+Vgf?omoeYodC6+`<~$Kpa9Yss@j->?&N%trg3_ zBRdJ7JkD7cSABgiILik=#MuwL$U^*5%q=lI7<3Dl8guwQ@QK6CfRaNlwsrRT(ZwN` z+(;(Uw|(p5k`<2!^NxdLA`;({QXms~I=po`$Sfa3x2gwZY zBm`|FA&BL}FOK$Uc;TUmw7poj6heI-U5^v|Cxs6&VEwPqiNs~-hx=4S!fB+FaOd+cCbo$4zq5w zsb5LX4`VZc>?8O#Ma4rNjELi-^HTWt;~ekOB?yn%g5%%*hU1wK-2}&@flVAw0;FcX z2#~(|6QY^BB{$Z3j%?<*;DH)ZXj;5k2xN^)GUx%47v=-GJLe1c_zM-)FYqGC=Jen2 zRdSIL7>6lx&?7CDk47R8dmCQSrX68lDV)QBvRQ z9PNb{adhEtIGWWUIm(+SILZf) z#z8thxA5f2M$ShQbSe7Yg=?(uwHMrqz69v%62P-VJ0PtHk|u8&)O_ATH1*cjzxq{2 zU#lu^oh2pFbzl%CsqwN&eYlx^BWMU+p4}ix-OdbOx=sIVvA88J-JwBQ0jHka^pzQ)#l_}i}0X~lKzeq z2XP{!Zn?{yPj7K`ER-)oU)OI51bL7cHFfLYM|qc;Iy>@U_mvk`qi@qScFkTRjU8pz zsIe2H{}_b*M}?ip_oqO$ORZfJ@=dzBM)_tp3S?Y+*NF|P5Eb%QQW@H?+$AJ*af!U1 z??$#V*}F@jY4_&4e7N3|v~eWHNj;p_FyroK>=k%YDM)49Iyn3C+-{S73kI8ZBDc=B zL~f;4?yuzT=ROv>Ed#3E@}&j3xPs;fBDI+@*}5uDy)`*l8#E2Ci;7CG2kM<%6Q_&e zBHLQ&2V6WJ9h*(c>P`l^+lSv3%hhD8aGgu`YsPPc<=*;Duv|YW%A_w_jPfAqb{Qb` zz+JgMvOP;(CW@e&&`*kTxgVasKw2-fQ`6w=qHCwP_!_D|;H6UA*s1r#mw-qz*%t;a zm0SKfvxT)rN6?B*ct^+;PXWq4c$4UZH@o}b&0=^>dl$oNY(CnbtBc`V)U3E9mWvl2 z7+$r*doJTjd=6(&vwr=o6|&F_*z@?;sw)uLUU)$V!mb0xxp`Z@mGjmK($0h6 zQF66Ia3#+2@v_}1xbj~i2K`+(aJAdb6(qno3>V?7FRY6lf zho@VUmJbB3Nvju{wB9d5WdvYm*fA2ew# z-g9Zvbm5F^(lS5DP;LqRSr90^#h=n!{Kue4#B}_~-^d;~{(~42Sj_uE^l$=F1r`9( zr+8FI8^7rs;p7HF_*CQ=eSpo`^|2X>HP|G?v>SNq$D7j`ouwC$7`5=#fFbS{{`@pn z3m?)pnLp$VX#3ljp#iZHI582^Mt3NS#2E7`tA$5GV=0vvgykdb+~$d$(-Rv7FH+L| z>u>Tu3re~=Bpt_UflX3sJ)r!=&WTS<>e)!HJ}-*ng1b28d@O{om4F3}WkMW*+r{jk z&>{-e^d+6IN${dVSPW>;bxvL8Ay~0X+0KktX>m=EeF{4ZOsbU-$Pe^cogMvPur_9v z1B>c$WwFWPh#>C+uFAaXr(tkIifkJwyBd(U7Ciby#ru%l%5{WS;NOSycva`I{~A$t z`judRHKtTAl?=1bfK6q$9gz4u1xT%Dsupx}Sw}4(x6B)L`NU_kQI{5za+<#I9ZvX#S71*Ei_`k0Nq!rfxf2sfr zd5->1m4963`hQRL*LEw0Z6B%nyE)#It(c50BD^I2AJhI-s)r(22}BJqmJaD8(+hHm z8fG74)B)0G_18K;v7qMe!hinqzpMo0>?Z6cY0sdnOyDKoLCpWPms7c#vfJOODO)lB zS|P0bjm{71E1~i8tV5sW7D^gv{HSpLQsZaPt2I(L{vYc4e*YShgj?&_NXth&{Ch3m ze^x*Gv;Q$wUq>rfL`o$eG4|I=K8$>WziTAmHc>wQ&#LxXuq0AIAHm05!j-bDR4AEBgvTnZ?q1->xbnfdO4z>3k1)?>qja+LLx ze)j^BW|Wp;W7whTnD(^(cZx@OD+G2`3&o>rNtOgjb^r&mvz0=Hmx-ah;73jKG2(EO(r*Dt2(D#y_MLLf;5l-0x6T08r> z)p{ylW$nmz0Ed*MO&3_LsucXVlJvY#{rMe$%+gr=bSX)1VPg^M%}W-C!G%h43cQH# zzgukGF3UNN9RoHAQkMZqkcx(gL}D;4uu>pq#Z%;`T@(ik~El&kGi_U&_Flm^*&XP%e7B<)LZ?cit1sh8#hcfhzM>n$$K?18xOg9+#C$k{4S}N-PpiW0N^3qm(-KNmA2BVJhm@_VulTUgZ_QpU z(hu_P&)-@*>(#u6R@$;{fcEhDNtZmPB&*^HYVGL@le&>pt9)lnu(t2QBtL$}z^rAN zhXiZaFHB11iT_JcFMJb)P1pmp?2D6Pam2tP(uSIoc8vR|R++X*U5>na@h6h4+TjNR z_}1ll7bktEtonHLrAg@uPr!?gKm}{7F3SXPDVLtW(aSsmsrZ$LE_`&wufwFC+KmTU zc>+FKfp1x;r`W!(vDk)CZP1^S{FK$&=szcYO69GLXd9yCT$!}Tw=!8j$Kk1UxjHFQ z>(DT%!CaZFwYxg08+J~|g*_jxy>NAs4?WHB>TTfx*vx&3A5un=OHXN)n{T^ctM~1c z{BhT7lg@YoE5lkQn!yE=`t-sWUOKD)xGkiEqnYZ#i^E6V_YK}gQ9VRqiDQ!pweV0n zC$m|L!h-;G?8zeD<+RWZ5+5J3mVKb0z~*_CeQs7(X?OaRjYNtwJ#xaeL4IZNVP2xR zRceK&-O2me{SH#vb)2?l8ZG+h_#o;gL^t z_4_r%WX_|1>L=@2;PDKluzcl)mJK!!le+PpMAf9mHTas;BiuUmEv3PRR&ca72?3P~ zh5S}W_78tcZm?NR>Y_DRe>15G6tZ5}>-`#Ro+fqimpo(|CwgNmcf8T8!G?FEw*JUn znM8Ey$6e(V!|NUmHk(O(^&k(5rJyy!e#z8e!v%5g9pWKJOcXS~o;%itH`shk>em;! zt2u?75caqR8ywRwxdYx5b_DpD)Gda9L*>Ge+FY=B}rEWot;U@LX=eg@351RS{cOb(NCiM;BXirJ)750l@ zu(?UCozBrxDCCl`+Zt?&IzehUgKPu+(5Gp+NRbfwTu*IMW3I}h(hlM?)!4_*$&kIL3Q7nH^QqwIT zU%n{P=PmA65fa&8i$fywI9eJf5q7lsc$4~#aCD-888309um)QK+OTjqC}5*2pe0I4 zI9gM{wE3I@EjJO&lLPtR!gGIE1f@6Fl29-j$3yD}(bEgK!?VGbj8-ii-|&z_!U2|3 zOzLIf_>PC{dYRKG4YpP$b+>T*$wR(+g@Z;{DgjYeWus;pHohJ4B_jm|z1P#J|9I<5} z|G&QPj;`VZZl`9LiG)6OhtvzZPlGMXq#hRzCvmXg6OQz(wZYZ~J^q<+t zkv>I}&PF5L%w5qGvR~LYBeISrb;(yeq$`CS680rZL%A&n1;5=*v{2aFG}ta|b7BMX_BMb~K$_H1M77xV8%WQIK>&ewo zuxB;cxV@RmuG`uuV3cI7h)&n2d*F1oCyVb&uc6Kv5IpN@a&3<8@hqitTdbMvj2@hHD zEw_J-WO|~_2v=KTdC_+~Bm?R9GO0U+i}y9BgdLyMt>}cl=V%>>Qv!qQBH9$77mc~MF|Q= z4h8(?BI$?GO*nS)R6hAiPbDAym~il#trvFmRt0FA*ys!{c>%s7>|GjccVJK#j^+*J zNTp&s$J&UT-HFaixaRP&``aBnD5}BM-=v-vju||pVJ8py3Pg9A)XlrNi+8aN!d{P% zyYUh1<{`P1odvbrz84|)nAEf6!uQvWf~xCy5I)HPs4C&$9n7?^c>wDDUQ~#1tmj3r zRXEZbZ1<7;fju`Ec%I_SeX{-=+bE@LiYNF#amCpvSnujwL%-_p16~C4fCJyh^>EYs0;~p*=QaW*b zZugS0r4LUm>Rwn{_`s+!qb5GywX1`5ADWGo`l{9)v9h{kU?z4N?yl*eg!$cGG`_fK zOz)DChaN6v)l)N-gqqWnGL?B5KDQQ6C>lSpphrP|&E$77m9L^>?=BoOYIxzqBKV2G zQ6tUcVWMMX;Uh(kLdS%X zhsO^qa+HjReR$D?iKB`OCxTa&u`x@T5#WlbXzT+;!)rc*=RyBwJsw6Lh9P&3F(o4$ z6Gjz3R8vuxrQ9CRGDF%Z&8v=ODIpOE${1BV5oK05CIgNkgg0bD5nJ-FEM)|%IG&|g zYfk@>rKDGRAemXwbK592(R14>AI-I+)EuLDnSvDu65iReoieH+`{u_=i-t`s8ty2Z z=onK}h+LEu7a@E^5zr@=I3682YS>5zEP~iU@st*hs%ab7UU_|pf10CvN%14Mf~gTj z<7>XJXs@h^sQKpQ_R5#%Y$*>HKU7@uXmQPgnH`jqk!+&30hceHoQSAu?1=V*Z2wz}$BZg28h$sjSu&p0 zO~}S|WD{y)fl`rXAC8!d!I2{+-ZWwSFh>nroQ)H59*(hvHJ`qlt$0M$?Ans8Y!B+t zv;a{+!%K=LfZA2@;CIw;$B6NTr6V1E5ve+UM9qtPvXxi7l(8)BaJKSL&5QNf3NxEg z{_TIxRyulQqR~vyksYSLNMvB`qyl{lJLO86CFjO>S~^V&+kfLpTaS~ z8;hzOUsPIDSo6Sd*~-Ys=83~H@pEKmcEbO}%r?WFiJ2XSI})>NzBG4KZeC+coRH^8 zOf7ZPc&+QG{Maf!H8s`IePq$Fha3+UjvDju_#(%IiG^@Y9A7xBsFMT1tZ-XLrFqSz zUpp#W0&2FN@2Cv5#Qp4LG97`T-;qFX(=V|93Ud_ZH<)8g{j;O;sL%BKLrkRzU!Ts_ zf0%=ZwvWR*Cdn_z+jJagCt!YuISF$L<}}P1n6ohd@?vVg9BfqWbETv5LbD!&LrnE{ zZxh9MKcFQD_uq9??r1{+5r~g|y_DW3fqocY^#?&hLXDqj>it znt8!&(zTAt-Q9@ar3m=Ci^VijwV00NT1+4Ju$ace9@Eug>e$U<+IW-2wBZ(u>Dikt zrv9)OA&h?ChIq5^>m8L*Y%Tt_WDD`vuQ?^LJjC0yCsc5o2N(yA;@Jj--(F5BM!}Ep z&H%5Y#3TF!;I)KFY+`)j_G{wT6z4y=qXm7}Mv?c;$|@-?er){1#S=%3Eoysn@gp~z zh`~*gsg_~hrX&z1!=%8p;+b$PI+mjZwxt|g0%9*9HI6775%oueBC(!U0}Mxbc4x*q2Ch{ zM}@m7&P_})BN1PUHxqb>mz{ky7lU9o_y?7f{{Z+?I`n%i!rRmx@$`VX8Riz4o-n;& z=(ilCG|_(!z5D5*}$|XP?T!Q^~p393_h_ zML;R%!Xr{}@fb*ZM6y%_-yKJlIsgImI|oQ*Its>BrtBo};+>;zzS+d{@GX$2@adNq zB?ule62Lx&odr=sD`M0E936kU#2?!PznJ64q&}c0GR8m@5iJraF%sdb8*s(m_RLXk z=E;0wpcpPG#u+JKA1{(|7V63L0HV%YwIrI*glHlwL{cIzvkmwS693^Q_>aiEOw<$E zZy@T`LgeL9BN0<=RKgQT+NdNj~fYKpCq&Lm`*g&KvXY@%9;>8!R8<(k(KoZ z{InRs)ss!|C(Epi))VmqqR!c4lBnEB#Kw73Rvy<01{erxB|)W;0QM=Y(kBNSmIC5( zlz>EPGH)2DQep*fQ;k$C4it&(6cQ5@4F-y7lH#dG6iD@(^oc92d6MeYCR7Ur zRoX~*&c+zXev@R2jAZOEl1Rzq9f8QzdIL#rOTiyAlEA)L76$JQ1X&1B^}?7f$(A%B zdrf9*P@tZzkp`+GlIry)RBy;^4R>d2t%0m#qTumOBN@xGQ?_`gAo#NbP3LdABzfCN z0{c>#E#5TpMI!k|W2?l8qs?|-X-s7o>&Ls~x zI(K^{{`*bvKj5i!&Y})-u>rqFDg#=K87JV|r^|CLYtM*6x`0Q!I#qex>OmrVXI{0%ju&#k2{A$5cak zOjdX#J3*wglLz~75Yw;LDI(bnqAf6A!cZhzVchH_vGnFS%1EBQRBnHW$C?3ZJ=Ql6 z<0iQ2w>3k=`W0f?2D2T8V%-5_jP(j)eTm035EOb$7TDLq&~JUFh-oJ%cfst2p_po6 zj4}O^NMhahDE@TD?cLoU@12N4kGlc!egHT9KFJbs*CDR2VZMQ(xW9!l#(g3RT(+l* zyd4yJOy>~Ga=7W|*G9pCUK{0ur+6H&hb+(1d7@AYvIH zwemr!BQSNU42Th0Q;{pLoRV~nt{mFUa)qw3DIvdL%Wfl$j}}GRewo!tO?a|nIV@f zp9VyozuzR$2_q3Z?8s5l#4w&Ly4?x`O|K4uy_1b-R7i5^d{__?U8yAnl7DEDWpx+v(CQ7P5j8tqaD4c8vq%#{^w=P%l z7Y!S@I)8g4-T6jzb)4>1{1p=FVgp59N5S7kBL(c2B!84zC{M=%Og){YlIpUNiY-aV zQF7VP!?}tj4Lt{a6JrcS_8gJa6(bSs4LqsVj0=!_6#CXcwX~DyV6Fo58q9SV>R?Rh z07M5vI+b9y9-UWWO`n#ShKSz!G?LT%nI5n&L`3xawzG&(fzu4*0Yed50Gmd*pZ8b= zpwMI5k65^p`>ZigeHd9VmDrYLk;*QRiqKy1mD5&o$O20y_g4XHBgO_ zRG3IL;w)ZLwNBH&{WM_eyzP-xm~ptNSRHWNvN7q@H!X(UkMp>|K$mxu;1N=`n+{)1 zl1$A5w4#5q08>wGxuk+z+K4JeQauE!P@dKp166c)krv6H#yU!sR6l^KIj7oVpqehJ zAS*VaN|RJQouJ}EuC^g{c-YgQpc;5)W9jk0h(}|s+>dy1A!$7q_Qel8}Q?WUj z#Fk4a8VMwwt#gt9qludUY<1*pIo*QMCIeCaErK_6$c>0Pv9m}?r$_|7kDG`oZ73@)L1mADV7Mf}XX_?FR`O(4_$-z_(sn@9Sz9lO z(8e1P-NXu!lE}(z1AcTb!4;Z9Bm5pRD=yvE?*^i2k_biUCSp&b9^13q@K;D2y?~{& z^}D1%ByI}ir5CULZoJ;B4fq3Y6>I^x@mWE;9Hj$`!rvfH5rJSmg{_j}_C^#NIK?yg zE565R28wpKi8T5cDZo=-wxm7v8<#*OCgJA{RBuSCeod%wDfs;tt}t1xQKYRv2(QqELye!4h`} z$6W&4hj_fT2Ha;Q?of$a$Z@ke>hTUmxX!~KiTi-W9ma7hUAWZ-+?2k8hv5>ph~w6| za7_r;<9$rxJ}7ZVaNM{Yorin_?pBFAQsR!{xZ_;7iw(FDXeLw+qb2S`9Cw2Y_lyB| zq{JN~amRAppiVjuc?j3}{Y2sxOWYEUTj;`_ZNLr57d(_o+;JRtHE^?eUDO+JOC|1j zi95lCo5I?6#^M^M$OV?pNv))qC@CK16lbC1ZN+**KOB_A8{Gl}NjrQCR49)~l1B|B zA7Tm-Do8FFNajhB$0W()E|OH%3F@eT6f|aP-1h@fXYGT!93-9UgDMyb1Fb z%-b+aVTgDc%sVje!Yqd&;uSFTTMycmu&;uthFJ~s9?bhNMEe2EhcF+(d<;XhpTN-X z_xn*TpTe;Q<};YJFzaAGhaut`nDsClV7`DM;*Bu$3qdEh3HHq}TVTF~*$VR&4AE|b z*$%S~d=K*j%pMpb-U~y&p& zVGh6?ggFF5wDtdsvGakiss8`?y_&H<7=~dO7V>vk%r;EaGw7g)or7;Y{m5U8o1*8^KgcXMF23-vAmyBs7A?q4Ym-Zo-EsXbR0h zoSQS1l8$pU^DUqyw1OCD4dUB|Xf*LS1_LrSHc*$3dVx? zUd{9x7zY`kk3ZKkBPAK<>zE%86JR1-4>y1~XEL1xH^O9)z*$VCOu%;v^Ebg%$cAY! z9mIDA(;S!yvp{@j%l4NNcXf!XCQ~r$NM___u&e*x1PFqC;Y&dLit zBbl$mGz_j`zAn>n$YNgf#AiD5&dWcpIal{ED@5Q{X9bD5Zf9NsiC7`?A}C@HF|RJ` zHINq|j$GQuy?sH%I9?E81^=Gb6~(*=i9j^-B2W+7F)zzRpd0g&i3ncIysdR2^OBYL z3}9Zet`8%b7e9HmWgPRez9CF9%NMvJ`7oOgA|&KF^AhAX<|U!Vu+Uj9LGE&vOLN@A zyx2-5ikx}zdC-}cL{>8|+KphXvs_x{sd0793fT@DSYeuG+XsVqhUy+A=lp2S4lyfu z*C$@y8R{O-TcL9%4V`}DjI>!Za%Y%Im*58Da3>CJ^vf-~%!21U3a8Fe7$PqLdMU(ksEk>m{uYIB37Mi7P{Xy$FL6i8 z*4CE~*>-WnG*0HUmDm;;=b5QIh0x)*m<4ND&{8irY!)mZ$`f$)4U0qd;s|zpqW&s& zT}3HDFYvTp&-9yfOw)`XIWcFDi8i6yDKc_&j=Z`$G21lkBC~1|VN5%0FbgEEY014l z0s46K(biRQu~(DPm*SvPj4=z`!>F!akZKl89LY7CN?`HVs?%^bzj;k+LWrw^dPvD< zz8}+Ey6_z7#+2fTA+EX1&x1U;*;&4e<+m_@E9Ap%FdyV-SpZT-Tp!|E$o%bahqG)E z%N8+zXQ-=#>n>&%!xFd~?g1%#F}j!eLbxx~rMiyl!#99aMsP=2$7$18;xD;DNu`?T zHJx-_$FexxF5Zqq{czLJrK||bbnIotRr)ojrbLp>xR=!fuh*+P*$`t{muy^yjn=(} z1p`6KjvGQ;OG$4T6v1*>0r!KHAnu!1GXDSsXdkCa5mc;+epjx8NjgdmlDg_e87$&M zFI}-B;!)qVo&|eYKz84;plf$|F)M0%jL)o5q3$?hD0vHBM5JxtZI5(?)m}HbEIYr%Ka#^sHZ`tci_eR>93-Jo9p= zVKaLk+ZUi5Vw~lhnSaq){t{C;B8vSMcp0Q7uYepiW%;YH6=eBqFv3|*&3n6EcUEj; zDkXdxuhugE2D}Mx!47yE-hp>vXQ=ZU-RY}%I<>9wm_F_|+~)PvY*Uq^R3m8Gwx3zw z(p^s)Bnn+A5i>$m%d6#uygev=Y?QjLxrUZg|7OTQ#2VK2)oO>P8?`K^wP&bbm$Gfd zvbR=@o?#Rxe$8MmG-|1_%y()bR!gv0*;TGAP-LDj zn7TqBRF#O$m147p3JG+CfEZ!wx3@Vy8+LMP}9U7#y; z^U<8d=%LZXRWw=9PahSlSRm!pt!S#48+kF=-MiYiW^B*+%O_2nF?UktmDBlxOyr-JU41?h?0!G3p7#-$(4WLzd3cd1IgvRKN6OQwN0(DuIeOtMR1yYI@nD0-d z;e8og4p*q0nLPbbMde)GsU!Gg=?lr)*lzC<$%SNP691AZcS;}kWOEaQ&;q_O@Cx55 zIKVdwHu0^2CVZP9gXsq>dk21p@8Bpzu~1Q-S0gSZm6KNq zLULkTtIF~?Rd$s1?N~0gIknWB;KX(-%O1n-aVUi|p=$Zfav8NjJ2q3-@u{i)qC+93 z_S~6X6r$SQ!pq|B&5qqW*bUHU*x?+C|oE{s+)Zo7mB-`Obi ztRpEEVi(l4fs22Pz_M8VxBVbF3pQGA&VrSWQZk>V>|wf%gtx;R@Fu(kJK$}22i}F9 zDw()L^nU#$J`!ya)1AxJ1Cr20S+I`DWw%74JJU2q{o z2HwahkN4*fv5`@p3srP}ANQ;MMCV)lC0-`e==+Uk!O9TVN7(L$J@7Gn0-r(!d_Jv3vanYZjDD9XbZ7$ zA+&?`&_Qpwhhn7$3E0aGvIMu==pt-nTXbZq)ID;*=y(?=HFb!;^>qVO;$~esVP;)A zGcWtGNXhapAW~hK+RZJ?yE)6_m|7j_9#*G2%caDwVHBMCo)8ZghcjH*i<#ake=%3} zy`&wEKWetd4yMsK$T+SfAh*s5*!F=$kP@V%eN^AO`?#-GKP{2E4W(9nb@$E1Ih$`& z6mbOBD?97n6M>IS(z~*kI+{f#T>3FT2nNFtNQI#=42Hu9-R6mE!o6~Q-Ot~eY8y!` z(uaX$6l80Z5@`wZQu5b^sQ<8QQ8OL?D^&p-Vv|1Vj9zQ3cVd~lRt>;tj2=~4vR2>Z z4sJXie`%S6SnBe)uJxe%`nVUUyh7fm(W4_19y1%?ZZX*c*AYy%*m$)MyQ}mSR4ndN zI+TXEMyfRK%$wJ|5xdDgmFmXwV6~GN&2?*Tz>Dfx54V9_p3M(e zGr62uIS@_ zKX}0peci6gr@8kZ$0Q`o#g{rE;`G?T`gTj%q(|Sn}>BGXB*ivL>`vEX{WkEK6vTvopj;#xy`3QEFV>X^6(JtIq=%kIzdVA!KFm^_Ka z6WdGc--LtY9>;WvGk*%PBIczOl!vG;Yh*`#9+4Mx|LUd+h9$bgwN|!nfh)_6N(Ekd z<<4MKwNXR$4`HMA?pBDYl%mZct_M_q#i7^zs-J9ERYp)VE*_30m5o^^M`@FPC~h%& z=xjABrG&o}qW&(Cv;Gc0vF7SI?3e3I_rGW|jbR$}Qh-eFLS%v&=X=RWmu(4A8y^$t z4+BU~TieIIP;Zod*q@bWN8EC>*w!shwOenxwK9zd}5<9*y4wP4Z9euAO6 zuG8(f`V}LXx|J`NsOC?~Ve1wJtwlPW7lIciEDSk~P zCqE^d=1>5+CkSTbPT}FxicM4~ZmIgfRf>$1y|0J3ej>BO@H6}ZN8l(NgX3_*C(JN5 zbyM}}z(j_fPNHY_rc`tiDs(@%uCespgDjA;eH#z%5&1P-J;&u@<8xkG{)W--a1xHF z-9+i8FAi5Cz=f$6D|&-|$@)LwPxuQ?!Qb!?oQ5i$ZCCZnGmI>5oAWfMTerT$JcUsF z-}QJ{$FkUM|FM3A`x41@HL~6%PbP)4WqF7&(`CzC8{BE5q1VYsrbVd)BgpQyidOOae z7lx0NQuM-^uLE_V9z@j9NBk%~3KOC>Z)99qx4~G9^(f3l+P7gu+FUavriHTJ4pB`v zu`AVRT1S1Xhob8}F9)R0o|Okh_wYAb_tR5|oK&ie1^x8>W$xS6RrbD?YDOwj4!@%> z0*;pP@GQ7B3)|Fj?sO-h5vgt_>PDSk6-shZs9HbA)=~5ENbeynauNwC;jF%wR8M;7M=mv4n9eO~| zI(o#cv#O$<-qhkNc?;*{>r~(viw3EB<=o@65#2)cq-^-WjG4vbe=+oe-rk$*8r{ap zn0bDBBziLq*Eo+CdgRwi67c8)iIC*&*+kunVUqTbz}WFmY@G6;@l3{}FZ6@{-kwn^ z5K(3bx4h8;tW1+rmq?O4mqwsgL_9eFVP|OX;{yxvD za@BS!5Tq}DQ$AI(D74X6Oo!2wl3Wqunm}$7)i~C*($^0$EGrK(_qm6EV83L|0QDb# zJIJdDlx?xE_i?{oM;-rwWnA9bq9S+oasQ(FeaNY`W^W#2B&gFY>C{*nd;1SOZQg2* zkb4hGw^aonN!#?tFr~iJN5k=Ltk&>1Pgf}h%agCGf}{P}1M9K4prY;oL}d#wbKRUD3xqR4ea9 z!ciWpS0?I1Q!$ECVtzpx#SFL>u7mL~0VcxraKpKyZU59aS_ZGid7{Zm6Rk5*q?8{q z(K1n;1UJHD$buMt1)W>ZrPD~|W8~fXQMh{Yl$EAE4zpNFPNiv& zd{l3P`LF;AU?JQNcbq#~#8|cd1{$p=$=OK>z+g`ZM65?rGF}KfibN32VW}0>`_<)3QAxtJO+Bpbq zjsdIJ;C0vr+u;p(6W)Ry-s$($DepzXrd*1|+nBur?}C5IC%)(92Ki#9=MifbJ~rt} z=6B-v9=s2d^ancWm^NO&RI&>*n{~n8A+BAReMp}l@PqXEPx(|~^IS%}ZaU8n7}`85 zng0y4&*2LQoTqtdz8qVdU-Ccv1{wBW!dLJ$>@)fG_4;9sD9qv;nA7qu=D)%0Ti6c= z;5+ypet?7Uqj$FT)Gt&cM(3Q1v&}jAbcpK^#y`Pf2%K~8E_}7j)3)+Dv(0@8^FQPF z3mk!?a7^dkUU!8|*6(d-l8&khaUEy<38;i$;WzjlPQoAXr*G1|ezZw%N603<1fjn$ zJ_UcnIg(bd<6T?#;SqS)lq;D32d~pm1^>c-PIG(x)=e2^F-=V7ng52k&R`}lgu0;y zTmV5(6M~^u1Lqhboui(*{gBN(9A}$(1@rt+w<`of!9VleO%mNbdrZonGt|2~7vpF1 zkNJ-`WAP1#Iw0M-ZUa@&G|}CBfa53!J~?();b;4F8GiM!kAV8n02)FhG=j#^#8zV4 zPqv4T#m%N4dxqzXm^FoF;Gcf0!wjf8m&w zXunlG0#loDkSo;H3iB9f4Q-$;#KMKp4%*v{>;23vmhRu{kgyr&A<+S|i=ZO}&NxwR z#5+Xioq&hUdk6EK@aha*K=#b8-g$@j*3Ddko!vFZx&Xd^M#xBFQKQ<{a04{+`VIT~G!7#+;ZO$`85vrpSUhD5}-qZBAbVO|au@{88 zQgIpz!ys_}<{PdD@v}+i;x`=o5ik-Y=}|iAR+r44GI_e}7`A_pz}8lvc2KBmH1=t5 z8C(umKssCrW8f;^3Pc}ca8)<_283+lc?gZg_-eQY{1cb+O%L@n-gR`JNyfvbzk~U4 zcxAw~An9Lc`b;x5?Ks;i(Pm$Qsm(sUW~ggC<`ZBdTn{%uCQO1GVY1DB(+N4m%tFi@ z(W?-$+3!Fo3*#wp6PzRap6L^(XAR}_;^{a`aI}?(2o7~k#W@?Mfpq-oP9-j}p0*lC zakRa^1jiXT>OpUpV~ zzgw}-huc6Je!gw^rMQIa+u#JuY@;8o#c=VjGK~J|wet16O_4HqU4(70s>AXY`u&HM zc#xdBmL;th6d}DFR>1wR5*~mD;UOr7he1kyZT`gsX*|N`Rp3_@*7@Gr_Dq{G&%E87 zg|DsJPDf{T1HM)8Xdofgt#zWiajyjXidmVLcVvjkVhxTep!5D1oELbU4<% z365(6Ir~>()QntHg;ad4PN}2w7#fcU)Zu-sv)W?7^h_gE+~2s zi)NA2;a)GD_)ya-PonXZ=q#WngJ3WWfmApvp|LYi5}_EJZO!r>p>>En{XZqtldn!V z8`(>z^-f3V8AR3x5>iKg=hjuf<6q`DZoqCMJPT4{!c46;@wp8ChaNW|GgFQOriE(b zFBN+Z-{;{4kdo)Gb|1hlM+{iiE)h)Nv(ftzNui$Ht zl2F%FdY>fsO(0=4?k}5M48~H!Z?W4C2ONuu`euiHhk(7F-hDZ2(6#j?g22Pn<-Etl9mr5VQ_c$=COR=L{ zDarjBNLan4^Nn=Re_pOwQACdmY`s@I3{8gOu!uP}e`qpO)mR znDG-<>I@gQ-RupJKH|pVB~_JD&iud3{s(73&h)N^dK9RQzOG$~fj!3$tRL!f^X0u7 zZ~+7X|KHmc47Gs&j^qky=-j*YCvaVJVbw#2J&KaOFeyhV6zebuhjZm^FRHXa9!@sz zWbWSU;8+*xfm~HZn7mu6UZ?q4u4`nFtO^%7$?Rilud8J0{T7Cum*zOky86g9fQAqW zji50!fhcI|Tf>@F_Ku?nXIsIs+^9FhxH&|_IVz~`!`s{}MdM*>cYyg8c(sI9AVUE$ zwsv3PVro}{nbfX;sT~=RsjZRsRBBfk8R}|{TpMT$v2Y=@gZ9t?F7mD2)BoDq#p7&i zSH*lsj5|SRI7jW|cbKbhFt+1lE4ZjpsH+Q(U7;JqL3cI&KVJ6G+if80rDm~A^FfMC zy=!FWWnEn3P*)E$dO|#0485Q?BtRcX^sbq?R^E%Gty2jSNth)=UkF?$XB-tjn|>n=gU@#1UR2T}w zyem}K43n5$Egx@NuYpnA17bY_Mnd3v_3FmKrg~e|#>rN27xSZV91Ur38C-5V<2!C! z!$QoYhS^MafE1Z}*UZk#y1b^Lt}BpAhbv(WTm@s{YPbf*`PT4(8i~%$eGJaFf`^&U z!1!9Y4$e_Q)#8FgXII;Rhpk;sGj0~~ngA2wdbq*X?j~H!t`>)x)GmT)7D$n)t&#Us z)HL~-vZaeGdpfR_hODzmeWIQ*Y zPq*2+?5>&UjOS)yXloJIBGfe>vjtE9{6vBP5)YizH$QIVJTPGZ6TdxY{ zmtkB4%fY{1=KRYqT~%+LVw`LRGg^hZR^WI)tb_;PL0iEwwQU8XF_Q{b;hN686q$Ng z%+AZY+A*Q7hmb0Uhv5-e1*_pvSOdzpf)|F^3YH;kE0~8+3C3&TG4QY8w$MaI&Nkw0 z&SS}V*xGGp{&BoY;R%qdiziL(n)MqsX|f)Fl6sY3Xs>h zS=eNAA5V01EI);W&3Zc$Wtcq&&qLs>O?O*_ta4}CG^Dwig z%MKTYy1u}4FMJ7K!Pl@4zJYIHzs*+qMO`(hu5IZ(2-%#A5jueJckn&<=WP1)hj^Pl zoq>nV`~dSm;B^pwgv;QNcT3AvyR`In4DE?9r(LM)Ckzk6&+rQzfunE?j>8F?`+|D5 zrK51OSs!4&60=|7H}KDTKYr$sSShwP-_GqrUB6?068-?$2me&d>eDjGX82c4x)bv3~}3YtPQXb#cP0$M^Vo4pLM`V3qnWV7Fa zPz=Vcp$(iP`|eZp(1AWPNwY7(%~m0zQ>d#guCZ_-NVB(ds&L7rlZ>aFYQ*s82 z;Mg9A4sa24gig>I|U=mUw61j*1B`ayr2t?4ikjT4<8J}g1V z=A4I63dRHA67bJ?27V^zcx-LXJDI;!>|qc{I}f%w|A~vqxdb!Y!V|iNx`tqy3PWKS z42Kag5=Oyj-<)%J6l#8~QGPAT=DdgbG>k8U%fUZqd4y^XDJ!wHIY)Qn(jEJBxDuqD z$EXE7HI3=(^+f3uF1DRF;BpnFW8rGxWic1ujCav_T-O2@qOS2aXL({8rbb7}G37)4 znpZE6WQP;pcYahsZ+uWy^ zpNvfwOo5wVDrCbnm<}_1Q*Y2L(H*OgDJ3}Dq_etnC64h-m<9exZ{nSqUg}Z2&3UIY z9yaAN=4a!T3v)mkeQuu6Y>e!Od_B+zR<{8_b6VHg|br z$Lx%Uk+4~pAyI(YLbx3QXKk*fa=(hEAWeLildtL;ZO`y~F|#ebq-UsW zF{Vr4Zny{Tg+jOwmclacZ0o8g5HiC7rc-YKS z;zM2c5!l+Cw>W;!WGMAM1rZ#7r(H9gUB$+YNg_N~WXnF`qvHe+`q1y~-Yez0~PbY%Ab1 zkh0y;`JB&RfWOXua%rX8rPR^bi`|#-6-bFrH1+wK&-);-Mzc#ikNo7P6eXE&F#Zk{A=d1t(I0aG$CYy@=&F6pM97+Sdu2VYTBK13sc@_K%Qc4`D|M+|c z{H3;$j_E>+91Z!2K{wQppBkhj^fl>Rz~>H`(x-ZogJK!kQ#5x#ifs|rL zsWzWOz+dSFG}>y7JZz;#q1c5%I7m6=Xw>0zUGUdv*xqXFbu{W>7XkG_%GiFUMh*Df z5d1Y}do&WTl{_M`YXpr!$`(hX37@0DU*l7cMzN#O6uV~79Hd0|H+e+!xdr%ZjK3(+ z-R2U#q2;J`$`NXbaVv-cDFu#DYd*Jua|wC&@(diLR&6nkg$qH-K}V<^pWDN^ggkrs zc1NfK#uq_Hkdm5Ws@93moguJLdwr6N#a5E(f?ZeW22x5LjW|Ac2R{wJlU%QnlO|3d z-^+O?Oy3VW+M;*T(d&U$PosC;|MQNA5lrwB-0LMcaDb^~JYp9IN>FX5^^ND%>g;>5Lb^{KXFbSkoIbt{Rc`}?&%=3RS_Bmo%I81??KuX3SQ_ZP- z&W6BZEqhh>F&w0dQpz0XX*fGSjTTBKC{m0 z*Rq$VyCmRXGv44h&&DzLJkFl(QRw9?ze+84D06U}dmd*`cR1kXobEW!!!a+Q^Ncu7 zn7X?0*xHQOIes_eb4x%!IS{n$<=N6pyqv2X=UZ{i59r*ayFE+qbNp_@ZaypkDH*Az z)&+cC2>v}}o<}1YTS@$O?CyX?AZ4qgaVMYe0)LG!JQ}MVjm6k4fxAIU^iY$>J$$|w z{55*_uyv_&Gzzi150-+Id`Dv$pNqg>;~|em2DVa{<=Cx&`$5V+M`I5GU)zj7`8e7R@6?UuPQIN9Q(OAQ01^yZ@c{K7JjS}qE z!ebz%%F%e7&!yn6Va_tVVp)Bb+2@Eofy0yV6iCS!ZYs5o&rieo#5_lYWSpdS&)~2g zHh`3^j@U*%KMUs*^PFW?J7Sw~D1+xfO7sYm+4FpU0nR7pIc!upV&yn&h8ICfz9aS$ zpSQsI#5{+Q44kBzFXQkEyb4nGIbvJ+{2H83%yU@T>WICL!#3CsQj$lSYQDkeH{pC@ zp0i9ePLkPMIP8G8LCR`J>>WP83+E79AYH?A?8$e;cH;0Jybn@NI$|I2c^CMJ`CUTx z95m}jbGav%kNX^5(MlO*YWX2LA2s3ulAoB`)LUM=_FS%az(cAirO@%-jrX2FnP}(c z`Y@d9<+s=I`xu{30{WdMsCf-|yO&?=Xp`-y_*4Y)^RGE?@>kb99Dkd8j-&M%I-dvD z8g|xjQ~ZG0Q;eE4<5(}Tt&Z3i2<;6druHXLA>9zAUVgRHOohJ0=c|Bzo%+~@sPytn zcl^G_XI~&czlMmvVhUe|kgX`WC*yA$qQueq2AyvMYxy`L zZ- zmC>JjkKhF?ENHBMOQ4Ht@l8K|u4oz_*Xr*YA5NE{U6r=KAHQGy!~h=tI6wMOjD(bZ zW3*IRibyR+YKgDZYs4^830V3{sUp0B^;hi=vrH|}hV@m>D=F^ai0o{6xkkEM;Zxuu$aX`(wz zw`?pne2cr11()lj%2^<#Vw^a0hR5$QcpOUM33w8of^{Y-?_Wx2tacObQmvhU1ln;e z`|>Lk*A7Z_chTPvKfq!st207fPowe-tOx%??@RcYi`aZ@ZJ$5Myj(eNz-MDXzp%lH z?)Lg%v&YLX_1aL^v)FHfvVeX!;Ai4>z}ChqVP4`rhtKl?{a*6K%lGm->G-{XPkBJU zdP9h(hf6BF{8Fw9b#2D}MR>`}ZwvGCt(BLV`aTDUA2Mm$H2oMre(j29x}^J-&P6W3N|UW3$#9)r!T@Y72kc=?JMPOUa*T zy5##PeE_@QL-+`G!yfq9cJZ#m65WM*KdHcd!fE!CE-Y%J4)b@E{;9_$=t&uPz1hH@ z;QuN3bwnE7x50a-PMnoFZDL;askH+dw!^Gsz5<=k;Pb$G*PkWWCw9ccY%$_7) z?~<*Uhlmu}iXtr2biR)vzg;5bl#}!q1lSuWh-xyzo@w@ZC6{`GsqB~dd==1dviRw3 z-5J}HCsYv&%+DmG>jmcGXS*ZxH6r^03hnnKQ0nCuk!ce62A^*O`gI#=6F=$YH^K4S zkI#XCehb7;?@j};wOeE7BopsDe7+Cl$JUin>Dc{%&B627Mc-)je#GXGzuf};tuhfz zbqs&P=&-+`$1c~g`x%>G&SO{N*d4*<=sE31vR^oc$1pm6PD8qoV|N0Z%D{H2{%B6# zb?tT22HJ=Y5y3+9^L!O%L6KNBj2on{k~vj!&a3iTqi$n;i0)Dyh$&r)1?Gp{(yJFV zudm0ljemjna<4}<8@!gQZfQJsX)NLP>cysKo|>%Bdq*#m^WI-n?36hubWz7I=fz<4 zEM7}=HgQ;ThDyP5g+6r#WtqKh!xbmgzg^Q6!fI* z$u@_^5F|q(48oxf)P;Hw;Tx*uRf+CwHDPLhcZ8`znBH!+QKABA6BFHi)Gaj3*oL|W z`&cd|Yr3vM##pIA6J(?OWliIjOgl?yjQm!rv_>u(y5yLwn`;wpBMB8w2r0!gb=rmFB<=R-cJS35b&c&4d+>0!V4`Y<{aD>IN)eC} zKU)iRzE*^~Ar$8?6tHJx%{ohWj933iK~+jcu2$c5ov8OlJt2^~SM~V?Ftgck^vQaR zS1&ohN+~&WO?&r2I1!Q{8Tvv$=npBr0bidGu$Qcx<7x0^jhr9A%|~5I?L1wFDtb_} z;2}t+`b(M~k}}VuvO=HfBXN~daysF0lb| zDG9ggJUdU4Jg-7=tgqtn8*G=zxy7q-U&*vxVju!iD)P0^t{X*YJVF!vg#vbo+BkYP zn&^6Wi36;Zk~?3kXJ?7}WYn_)sR!s1>ux(+-K$F!peiMzz_j!fgl~eWkPXvdI?R9^ z-+WP4wLB3 zc;5oILO$FE^I-uL_^bMNiM-oA5ju-n zZ;lcNSu7>@E-jRuBSOm%D)JW!*d^B8d6uqsmncA0O5_r)9zILdA40u2ka~bFk-GS7 zb+0ZFgQ}FWyG=_!jPN6{3Rc6Tum%*A_y+uMcEB!i7)59A>!WldnRCfjB1lQSSJxwX zj@08RWY_u2nr=~W&sj>Ib4fZHQVtZFte-~a8CVY+U?V&Wo1n~J-oJlDA>@FzUfgJtsQwC>G%*~xN-3&uyYcX?;w9nCc37swflU8?CGmon$eOtZ7OR4iR zQ=OMlc_omN8jhcNLo5PY+YI@R->dj+4d}PZ<2S*}Z>Qt;8a}TF^gDuIbNxznnU~+# zB6EMb4WI4s2D}Mx!47yE-f80X3s0eH=FN%j3(a=Gnfucc7PQlY7?~`PQo;0HJa@u- z;NKVaXY${@N2kr0kv&HL{D$1zZE?K4Z|=78<#>B@m%2RE^*(AJz^;I*SKY#^nuA0u z8e1vn(kf^DhiH5Ry8~){fL8lqqE+<&Xl1N0ZMX-WkKq&e6e{2|_#D14ZP-~==F3m5 zHBc`Pm6lI>N{36Z`FNZ`o!5&%^kG9RLf$$l$iS^h}wWvv*2%0-0!QHzzUqsOc?apC6JCOwC*cd@5Rxm(N=GzzWvJ^g zjz7aM;J@YXxXo^(RBWZ3Ya1P4{Sh>d!m)r_f1%aBqimzC|BqJT1G@R57fAD+MC=b+ zvk5G!seYNC$Un|{oWJdL*Y1qHbZu5P)+?j*rC2eGrHp;hZ1O)*`U_6M-|!EdhAQ~i zJA(Pom#3;#yK22mbfm;SWc2>S?+nO)HF84@xB!BnW|ZCyJ1diM_ku*{C&zan;>q=P z7DwrwF%C^B8<+;;Ukhr3|0a1CpSHTI7dk%Y+9YYkCeILbLLm&op$^oAdJy5sb0Obj z(5-n2Su%{cL*AY%V{u(w`wY~igg

    *L)38bTyAg2vDUqP$gWsqEWjdv)P&3mu^x zDNh7hS+{|7%P5qk?9>rd8VNKDZiQTouiSn-%!bdw(h+K>B`O?=MUP05DtwVhv`3rYx3(o8M^@F2$KTAGjCoD06<6jBBqp z+FO`X^Asw?uNxzjVuei2zwii6z|z#*wA~IzA@@q0HIE;XiFbYOPn$?zSn#S8}RCNUts#TLwlXBEiy$tWm;R;BH zD`5;=1!JwMsdE_H!EEi7I6GTAO25LRkB6rm>2*riJnn93yYc8uusWvZ?|O97uykr} z8n2uMQZh@l#8E9V8Hp?_VYXwnL^zgqJ0?`;lEY#tF>6iZO+n)(m~lnC;yepxLoUpLxiAm%tf;B;X{1ftEyCHewX3xcJKDvM znS^gf;}*CT^5Hg^4-25cYMaJ*i9T$!Q*d?~qn#euE@i<&JZ^_OU=iF2cbzrAn9oZb z?q+%q+zW+XQ>l4SskyekkL62Y85F^CSONFLO5k4~sz2|PpIMWC|6zVQyNSB*KE9!$ z{w+*&57Gy)fsgA8Z21B00ea;~eGrczh?K)j<#Edc2tEk@2k}}vg z-*myg7#&)!01hZ`aW?ew*(YuE9w88}f_fyGeM6K6yV! zl2W|SIywAYlU(@8@Zn0SH9DHSiiAjq_fSpkFjG5*cQN z4ztTit%S7J22AY;kyY){h{8ObhMTzcmz2SnM()}!MEBlMOXL+J~ zgWhm47)u%Wv}xF92(R5uU4H>jiLN0zN(S4gLB=C#6jwiA3guLZJTgM2D zrNlpLg1t_lZ2^OQ@Guv*P3?er6!tb?{w4`{hV=_naIvjpHWr?MH?2zK$MSBrjA9}+K?xolaTXPOUU_;*pLUY@Cj+Qqw9GSEcOKx>=Ocgdd^_Y zn@XRP?N}Ro8!)?E0{*oo(S4JeLcm7qPlB87lYyO2*hux~qtsOYRDT|hQc5?Q;QI*t zO`zcXT=Q}Eg(hwJ#v5OMa_%2=A_e%`L@HmDL>8<~bl;)om+(0MOQ=vt)`x&|>!?K81(f_|%O zya+QX<*%4SQ%z^*Y^G+A!fsvTqu6aI2>i-HTPrb<)(Wo=SAD*SAo) z*y&rS4{`0J+^pVg_FkN%?Am5R2Q}rgAN-H@CUg~^CiFTyZ0P7WB=n~B68hO^B=jcI zFrkCC`-EQ3Y7@ExPEs=7G@(;C`p|{{9<>(F*I*PDO&l5Ttc@ugk9yWCHI}-YXvPAbtRfxrL-PEyf`viS%lMR}R zxs<$jP0%(3Y#T7>?i2FheG|g9^zg}8JZ#Y1odo5Tm{>e7gm%y#I>1HH5jr(>UQ+q! zxkPtIwV*Q5Jwx}uGKA=V1#fWgp}MlNkxKc%zHw53vXr3rO@z)Ub%CzX4dS3X^nji= z!gVi5gnGZ(2r2J*MR@&riLhrE5%i5s1jTAR|X`KnXw9cMC_|mmr z+(J#mWSok_uZ>n4`=L=w-W{qgdRf#)S~bb4t*UI4PLKO z7N>iLNl+ay)5G0RJO^?v{PMo&i^VTHP$BCglN4Uh?w;6|7X zS+=&)FB_@Fugl-+-kDAY&Ia$O?qOx7zGsg`S<1T4O@t{Z-2_u18>Yc@m;pJy5t?k5 z2-UswAX1(P%~)w7l%p&qVXuiW6Qx-&8**U|%!PT7=Nn=4+idbRZ2h^qb#uS)1X!v! z`#>b6RDKz%LUu^cT4)7KKV9&q?WaLsYG2b&WwGt26>r&oT7`*}17C-#4~g8m#ywWe zG^wQ1SQQZHLETTE``YxIqhGP5aFTu#uhL?Y_~*=~hmLQZ+x!}o0$?WvmV zOmx4Xn==1f-5k4{oz$@kuRvexL0MMuiMgIaIrM{weTtZhD}sd_?!*(nCgP$>C5n=M&L+ z*Xl@Pb<+K9w3q>W$#wkc1d#A(Z{_Btd^2+R65nR&!tlp z5yTw#Ivmk;Gu`Q}&un)Zh_RIHW2QTONj_h}Il7bge+e0Zi|tNX$7OTz+X}eugKywl z*bfKbJNVvK)9k8WeBpcaD@BfDQ_7c#?u%6%D{Fb3n{&~Za_WSM^816pq1hI02RLEBxlGt-h5LUfNgo@V5gg zN4uk%en9@ikF50Wlq-oMCFS=}b@eyWnNC|x(eJIRK8=hHxDBSg@3FTsX5~1o)S-QX0{>uc}cS`!} z4L?*L1SfxI4}!a}p+QZro&3G+wTE$$67i4ewT;QH37n(XwlE`e`sS?i@9JI~epYT6_3bLPpB!DlJ!dNaWff*WOpI zE-Rd4pqATTAWUf4!vY9g|)uCRgjN znShX#gJ(k3zg+pXu90BXq|0?vMTA(PQ#yqyDVZ*p#!7PptUO~BD(KK}&@`=U46q8) zQXB#MC%I>+#a#16t24jQ@AcXD3AcHd>wqiFwF_5s)h6j(AC)$I;vmoKV+SylQgT6< zTF&Yg!9!`jVZJd+xRxBP7ISqtTC3+=VAM-%gt>}wtX7|@`_~56ODU)sM*phCO@O%$ z?5V9M>k$R-^E_pi44&A*k{+QVU4EkcH?l3%4K zjKeX*R%OlK(y^wIjQM}PNAdFXfmYa?KCl%5DJdaZD2|(gX2CZgl<6z-nYh-(i_;;poY&|*k$78bYM*CPSWl4CLTKlJTf;m>l9J!is zhhc6xR)=W?=|-=c6JNOT&8r)xCY=)B`PNrjq?0-@)OH|qgE6$O*|>}9gt>BXG8))iSh>#_*)%I{cvc?$S5C`m_(+LuApLB8Rdqkx^pEXlk@a=l!q}9)JhoAt;82ZM~oU*Y}pV2qDkL zuFFdATjB{QOF7ucM0fCT%wFKK8mgHWj_F!Q~w&P<=usTWZfqHR>`X)5VeV@L& zNykM>ej5|`3xe)FPvA1dP2dbXY~Y=3buH^k;IwcXxEu@mVFZEAoqq*pQmSH2ul3Z@jqx-5?u-l~@HvU3SNb1UB>RQiJR~)6}w>ROB5c+7q z@Y}j2xud;*Ixqtl8$YiD@!9*2;d&fSKqdSNzrpWt((Ve+UYx}4_fviOTRreljvOtM z)-Z`n?-W*gUwSV>UrOzcCe9z|{Rw};Dfk=yfzwds8)qJZ-k073FY?4Om)?P4MR2DU$wEyc`(U6OK-r;&S8visR%^xR&}@l3DI&1$Vl1QHOw`t zsoKiwX2A`Siwq-ZH znkBg((fdd_wo>+WH~ppsaa)4_&T0CM*MQYlTx`GD+rzYZD_mosHMD`Y5DOPVJKyRI ziT3R`kx0;Q%34UjIq;hAE!#m>O38{haoVHT0WN}$&>SCka4UIVH4n3eJ#KXnV%UAm}V?SoVN{=AKqafX8CSx=4GLGflYl3>2FonIt zT(>t>1&sPM3+{_%KYvX#>NLZ?2fqW?yuN1q9(nVbDntYyQPo>LTSdrlMuWgubTLFT?e6xB}AQN*DuI!C2q=Jk`#(=j0+M$Knq3oHeZT zKHv;QUdqmXCd}2yT?6AF1FnVZU_4Cl4bvMv?~W6MgcHVeoC+358Jl9XC!%pZ+yI#{ z32ubRkmajAu9F;a^w^W$BrE%Sv^%QnSQ+L$0HqHTnM9FtbU>JETT^uaqh`S~kk0X! zHvMO`s)bQo-8EzJDqzT|K9#yiN66BbyQf$#rSQ@)*G|SHW+FHXW;(OUh#f#9x z2tDF0)YfYZs0t5HM%}QVthd@O1f-;o2y<1j)mEXg8Xko;pr8cS!eidrom31b?OA$z z6%G&6qc)dO-F9kx?Ja8`x{Bpe_KcP;aaE$HON>jfU1IwvuP(8jq-&~c``9kA4?ihEmzgf{0!fsE zf0t;5w&@ZF)2h3K>vFvTDwAXbyo%#iTZ6hON!(JuhL_or$wcsMfEn1EE)kA^l%gxN zP(fc2dJCZ)zCt6Dt)*aIKKC-5m$ct_}@M_o+EIEsjju$Zm3Z2%o3$!CORJL*!> z#)i2rAzr-!_H ziR~dVS9|r47`9tY_1dMjha}@CC3BqVAwQDJA@J`Z3(z(_WFWTopfMpsZ;!OWvOSLB zc-+=w`Y`DsEe6>QyBaUghTY9#vthFlkWzWA7CJCQg#JM2PhX*pL@-^gGnO8q@z@)o zDi%vA7_WtL7~5zT{4YZPc?Oy7+a5z(xr#oMn-1CR^jE@u-&jX8+I20 zQqr=tP|D>Z)E=P@zCv{_vqFWFy@a;0*a&4HAmzXmEwtwf5$c9eoVSpF4~fR!lh2gF4RgIf59y9l59kT;a540P-jLuOp_59X=B9^ixXFxKn60*8jGSDKF;o$v zPc8*WONp2k=Gsb#K1d}(5+p-k=m-5F#WzGjO?z?~m~BQXszaEL5sj#n%IVTE<}s#l zlWM_zP-AuLRkmjwz=o=uYuW>3T~pmQ*7l4l9HqqOn4U3|EQW!9&yWF&wtA={2wU4T za%M{4zs9lIRMj3*b!L94f?CUSh>nvw>IhTMj%3AqSc z8?th?uIqIYGXGi$8OBRm>$#Jc0myw=dVsc%_dC3EhfxNLd*&nW;9YJOeD58%#vFr zO!FHhO#Mt7CI<^A%uv;IQj+^&9c(4WQg-H>V7C$|KVY!^_?Td&*xF!G^Cj5&ED5%j zkfu(q+q{B3J=q3}#aPPN1t!>?1iC9=uo(!pZzi1}9$Oo1T>-)99E+n>-c%W7x|E** z=;(|%HJ*~>-lJQz2p6ha$pX`&<@ia7y*gusz>Ix<1gj#U8e4jk;~)Ye^ijVGb}`;VEx9~E<9`vQo0m4&vq6Qmf|LdPE=~ zC3%_Dx^1xJ6734epMUE$}rUh8E4nogTIth51ShPLM}(Z zzkjJh{RDtWX4lz=hpl1SDpSLwcpih}Z~`jfSNIKnw>6Bp&-dUE_lT#4m#RJY_awnX z93qPKhRi@&%92N=p7q$@Zc?w^BbhX~%hoe@^;z`{QuSC_N5w2oaxXQf0NkZ)U1O?Q zMMD3=IjR|L#!_WNmf&Hl8CfFLR2jr?797-qEAbZ20ngN_`fzX(FK4USIz7Wd!PF@R z87U(klRAA$yP7(gohf0hUv0j)*Pfoo;v%KsaZ``FBvB6n*Td{gnb_JI>@C$bh*>5z zXpCbM?;4n$X$$seng!mn1V zFj=KVqY;x*xlW57SRtbA5N+SWxy$*Fk@_gLk!a2h8J6Uj_9UlJH6DBChK$8h3ZBtI z*(>EKV>e%szV};^txtQ2oM5qe{#}T(l!y&s>fZ!%a? zQoRgmDJh%e=>$K)j?^V^DGY=`Fc^kFs&5GWs6vOxeHIbkw5<*?Rd16Kh)RihPB&%7 zD%mEZQA)ELx@cpPyQf-^nxw& zn891`dex6d7`1!q>#4EGN$LEmv@YKeMDbS0hudI2EPw)7=-VA$A_X&W9Q}${cX*+c zeO)(90-924zh<;=N8=7y1b4z+uo#xW-M+P$$6nywHwJF?Yz5~rBbri*UpLzKpm8r0 z!hNt5mO&9L_tmbo&bPBvAmwzHi`DkM^2kfS%%JN~ioTQ%+rwNd(7GR1!UOOiJOst? zFg)TLr_*}54Xb{WFms!Zlk+rZD!rq`qbX(U8!~>Z%CK)1ycVIy{Dm5O4H=)rPhRw! ziBh~O>s9^c^D-oAY3-e8N*Vi>3>>Qw?7+=}pGNzcfZCq1;=(u0Sh2VEH>@?Ugy5Q02|?1*aT(p96aycTbvhGcX;)aZO__%G7vQ>k?$JS7w|5J&F~_;1Y6)` zc*Ukay)4Oo4@CF#w0A_ChsB%a(aK${HE$osAS$JFr--Yf=jHJ6rd9dxIZ@GX(`%Ij zSXZkw#yC^I>{N!gl=%0T+(K0#jRm=Fi#H_bX%KJua=Lh;3 z(pED5Kg!MrzN-2EyTD5A`)T+C+{#vzaDx^kBrP8XYAw5G?wrr-^?rZepFihw&OP_s z$e{Pod*7+oS(WzSLmfQ{xhTn9$KjMT50l%^2C;c>%Lhg(^97Ok1c^`mC8D`c`2w{e zZiqWh3$3k?PlvRSb)T{B#7X1?LQJb|>jy-I(32;WpJeUZ_lPuw!0 z*x$s>dbgQ=bnLej{|ngBZ}c}{0@^~Os>+>6v|{j?ccn)vscxk`h0&?#2R`(MyM27U#0=)dt^LjPUu zh1Xes8MlzKV$Rd;xD#RebX&Hk?$^Ds{1s`p69}BNvbuBj4sKX->&B`>Bys=F!k4*f z=58ZlPJt#?{h?_mR|l8c_$uAeTsqjiCkVN6eNwy#`MXeEGaqgY?mtVWV8ui)%JlFB*N^%oRSJCqJ@ZEQJ5XvU!y+ zbhkqLED$Ju_4%+AchsPS5i^(O@YN%6l?KfYdxs^_8hV>R66)~(=sNm&IK`G*XRA&< z?0dFO$|okA2z1&8)EfHQ5cfbmHa%5gv@% z5a0nxAQ=n=DPWk>%iX#S=2iLW-nR!`-3IaKiG_c`M}crhfRO?!@BeE|efDzUMNe(V z;Mi@D0Z+!!C^(}7@>akz57{3{S({g4@y>;l8j!bFc$Z013LU&-ydOjPv0z*vUcE*e zFga`ftT}xdz%pnK!WVNkT*wiXRx!jqsZ+(5rZQ;=j}IiSc2aJ{cxkasloi1|UQZR= zCEKh=A}1U%niJ5Q7*KN}N3G70qScDB^|e$11$H{qMQXpsb zveP$ya(34IoEd#*^zCoHIlm2!Y|Br~S4MAg2iLg&D41yJ>BoxcJ{^pREtvkbo|AGb zWlow#gwxHe(OYePN7lUi_YHBsqz_>kuvlBKW%EA0_Q`-MmR@Zn-V=#Sk(hOg1lpFw zH%8)JuLM-F=d^nQ`J9EkkV}5Br2eaW&WTgGCvZDYmvClme~HGMA4SNMq*u!mMCF^k;sCo z?Wjm>_*fKfLg8kAg%^=F3Z5UeLh1oqAq1vaQLPT5=o68+1BsQk#9yekR2T8rNF0Pg zJ*wGYg4hC8Eahh{k#bNZ?ndGse~CZPHWJH!(h~Wf+7f9{#j1YM5>0Xr4Gm~*<>^^R}AR9U_X0 zbmLVJh18;m*W*@1@+zgD0bQ&~G~*9hysLFzO8 ztvhML-HSp6cpK~k?|@41E_l!M>|QGDZ&}(k`&Ld)OIvu{m*~U){u9=j%S<+P(YqJ7 zkfT@$+G6SM5J_<6_mbd`5&Xm!{Hzs0svX}AamTBPykDwg&31*z^GHii4B;^Xvhxlt zmw}8}-02~5%AEFt$bF977k15y+Im>SKU^bM1;Zjd?wnBF0X(OLPpnQou(wXNHy+f zNvO_%4z!k{T0;Wuu6M80pKTn0D|Y0J5Z6}K>{lV5)8511_|NHsopt)k*lCX+S2Jl! zKDi+B6X0YAl?$u2`h|yJ^;D}mc$iQZ9+Nuw+B2%DZqMcH?4ozx*;cwo2wGx|LU4{& z7F5J4&(tj#UMFhNsC8;c?WR+Q^^S09SsB*xDwV-*gbyMpR@PF7xrJdH85E0f z_m0*{nvCS3jxk)*LIPxnm@#}gq4ZF_f0s}H7f`gD?$+hViOoC9q_+o(JwY7k1$u)% zARhF!J((fCpRw#5;`yy~myjX;l-ABcQ*2}#Gi3Uq(H|s$bHD&F5F~;@c6#)XS-;)m zKisFZc8(a?Z3av_(qge~b-Ghdr=JIW+#ARU}% zJCUf(gcJ--k8_FCIU&`tLu_{k({hvGPX<%K`QQR@A(#p-vRlp!=FBD@_oI4RKGI&d znHk2ixxXr6q)!_zgLyy7Vl@oWX{byG8K9vd8XFzrx|sc!fEgXtL5|vVxHHInACWuO zF+|TjyLpYKsF=J8B@@`k?)*+6YGX5xd}PAb`F7|j&ky1=+#j0q9Afo1qOa=qy10`O z%|R%)ld5F*OM1r|c8C>r*5jozR2niH!7J<>n@J*w9nO_N?%DRR?yY2>nIzVsBDSN8 zR;z0+YRgc&##T!S_qg|{Y>sSa$`QJW%8W{KH_}Po5@Soos~HsQuKs3;af=RfH-cg{ z-AsSua2pwvi|~z3;qSE0fv(aO%*0@H?mW}uzNMce_c(m9%I>B&+=Rr07AFY@HJu;{W#f`S29A4X~PjU5_KCou=wxs01+Ewr9?^p+N@E9lokJ~;Z>Nm7{V!R{JOrvWaC!c_zSV(^zX%>fUbL?-Uma_`6RzF%Krk`Jk zvU`<2_D8@Ki%4Ktsi7Qp&9T2zXF2Rvv)3MY3FnyBDS@ZKUS#kMtEYY2wi(vqBg31fkSlO}J8wY{@W_-tSQS9@Kyzz>nZ4 zs0BaSp3G{ZRZkhxz6IuPr08(9JqTGhT^X8Uc_Ylg`x%X2z%lSE_znCHj)On!^q7P7 zUvb{?W2TEW!yTirmy-QvJyD3b*t}6X;kkVzFRo}#Q=_e=WochFsZV=*Cm=l{b4OZ& z8`<4m?>6g+9E8Nu&eeijKOEt1-Ly$G>s@e$Eo#DiE&h}+Ge-M`Df`WuVk&B4@ncLb znj+Q=gn&>G2AYF#aHj1&`dBv-I&Nk7ACLzB2QXyPD`^>pHFN?82Sef4UF4Pto{OpOLavzP@9*QiaTT!fMO z%!6asCt;%Q7ze3xWKc2!L!H65R=wCUN>^bAEGvXay*W%35no$hbyCn0i%*y8bQ~uGaGNOf!vzJr1OS z@n8a&2-3lMc1>pxscEK0(1@;lh+i}1vsG-_B&pY2kJRfkIALl91qbTvxY%bgO#|hz zL9EqeQo5hD zU9FG{Oam=~y%=PJE5H)46y$&_?V27XQqw?dkRZDB6u$=>1;PdbN>$rT$hc*oDGx@$F9kgsk(vcC=eNRD+0IKVVedT z&koZ-2Vr?rE1Sbq`Eb7m%0x>n{UWKz&=FD*Dd=pV1C$A%Vj3s|qF4>DQmMjdR>2@} zrAz~v2dT@%PzlSf*1Bn?f$oNV4_E{41^0pb!CLTuUDFjrY8og88qrma^lP9Jwu-Ht zF7>)?l+^14oG_&*Xc{P*eHPO+P%#_C5;9C(Hbt}41%d0*ceJyCBH-9HIl_BJPyq!Z zgPuTOvmLf+phJXX8YqjB-qgxwZfZK$uYqbQAy##)n=^JYZaU@)rW$nfl4W3F--#{P*`jiuhQAxh-RG(0@vkLM150S z2^_m7IWu(wMU9gN+K0e9cG#wY7Q!?QR0qqOTG7YDyD&!Llg^{Wh!+bn#D5+Tq)B)m&%h~bpzGHwyU)R1z9S50{c^N5F7%Zfy1B* zd~VlN5vdtLBcZWkp5WI$yV)qVZMIbFS$1BaI*gb4@8qv(pA_~PqG_I8{4bU{$JFGz zXja4EA8MisP;Q~`MM{Ka*ChHfQQBVth0zZRa?3$Q1J7c29eZD?2u0@D! z=caqy69&lAN0u*fD2gS{HOj}LSw(~2!0+HV_yhb2{;ID$K(8pyR8?zIxc6!i(!ttS zDYBNYNeSX-B>G}Uc&$V0Z*T$x%E3vtE46@wYTHD82Zl_EyCLRGXzmg_I4?w9If)AZ zrv-PimgD98+e1Bdp2wY~7vfR#LR^h*4B=#!9WiPwebftWNB#K3sp|JN6n2?Q!i&(ym)8!`5yNY zca%^QporBi3~{xC8U@+|ReqUVJKr(aBR`CTT4<0IFJGuq_$RXYyv4><2g-KrHzLHV8_4)g-OK_3tg`gU@i?&{Y`b>bc@k18d2b4vRx zaY(x+@)~`G%AUrKB)ReG4g}@Ks{~%fs;pPf5;J=GBbor}1+Jz~rzsLdG@7#ZmQn3dl1OcH)$vYL3U4s%ApsSdUF@;$gQ>I?h$u0~RLcV=DIjm_CG=Xg z75+pEf#c@ywjQ1AI49?QrO% zTxses9E}kT>!?N4BwW`a0)}0OB8xo|=BNhQeKaq}!E;?@ypD!*Za`l18MK+^?RW4p zEM6*{F#&mt;q}zK1j^cR?yz`c;fxE&6Mr%4D1V!2cA6&8CM%;^oY2hG3CcUrc^!H>SyM4bWm z;(z4(E|0k2*#2`Y{v~i{1mv%t#Q{RsdWwU$+u~)ynHi8LP1R1FfNg4B;$TNzXQI9o z=B$R>q|Z(}u(zf1MCvliEz17xwdyk4cxlM9L+VYX6#P$;RR94xm} zNDh{{yow#SUV~SJs2^ao56UH)8=aoo=%vO@+Q;KJ7#|*9T`RPYt2&A9gcU}&6|Z9X z)@uk$Dwo=PIb9$qALZNawNovdc!1S>kNb#TkKCSXlq(?Wb=c<=u-0MyWPKAMO4t;Z zS!bYh2UrOTz@1Jhd)YHHe1t@zHv7YPn8Wm;5Wi>cIxr<3_<`|M9; zo$X;mC-wUWL)m#I+%7sLFXWk&MDuzasL$EeOI-}HZA&Un(nD@BNr}ES#I-@~MW$WQ zlem4VA-CyzIh+se6vZ}Y^(A`Ij6+K-)9hzyrlBR4 znJ=2nmWbxdXuc9ibHWw2=5A>9H2YhcS!jvn-Y%Lw$!xoz*U@|nmDVWovJw? z!O|>1ODyjW^EtP z`Sl(2DnY%@T<@ShaKhq6)8;H$JVu`yOJ@y6!|vocmfpK)y;omvMSyQ(cm?&SKPLuh^W|Iu4EYK0u5wO}G5c8!ZI!NZ7E{eJ|_G2cwv4!vWR-sfn2 z;iq?DLthE9Qt0>r!2=G#+*KxpUm|wIPtej+v##bMkDl^lDQj2k0Pnw|{MX={fV`vd zx($*pQ0CyJuMTllQ~q1<9rzy9fFHn*;3%jCKdFh!_%L;h@LR!&f4`+m#)0XcSM zu{%)u-G+V=s_X1P4QA+$p&tvyrf;$6Zm6dBR%Z4tl>uZvr(qAid)aa@F@QoVU?KZmokoa*YZ7446&-fxX~* zn;i_p_FZbRo52kE2ll71TWa6S9PFrjjqgyHVGXi}Xx|V9=cI3PL57juRQJzY6S}Ywe&J1#b&S5 z(rLGfbbq81Z0Yb@Jk~Folsu&6;@5DEU(L9Uaio&j*+S*ArOVkf(`ROhT{`M~{*E%g z=#Y)BSk-#;RZEgOM`eC0%la2^HCKlj%Rc!8#H%|_pS;wtS*(16Y3?MVN(S|h0MguN zxAU&W)V*;*-D zVvRP6CWlevQo$H77K{UFU_6-MbQ7(vzeB2QTDuMJO>1Wq`8#f{wwBv2n-1~IV>mv= zvNsvu6Y-G_&I6OcWH1Gs4=%8MOVf2zBUXCc3v@-x5b-AZD4Qqh8|9XxDOU5av{A=Z zzBXELr*zV-kCR??1Ld2l#%$@L#S$p(C)PymDUe!99onl66f`HH$0;aQQEb|A1|epG zhT3tdTosW6bqNH!9ZMh4?O4Egi42+xd!Aj%N;XBS0;0ZD$JL0Ec5B|k*0xqVPNSS@ z#~qXq3xCYyaz1jGg9RW9ECh?dVvy~0bAxs;?@^zFZxOXyO&m0B=htdcco3^C(b1>h zBhg=t>@r){4BVpo{0DA1JaTIWuIvm}AK&jkaO;p1tA0XDS2B1agH|A&YfGEf-;Phy z`f-%B8thixpO3LYZ1xtDhZ|wv1a1a-;1+NzxDDj{s}8x>9=uyNdsUOwcWfT1`&2fX zTKg%qRmTVTxJ|u6722s1s`IB#WXzKRYk5eI{%nY16pKMkF z!`p32b#@9Kl5zHY-#y3M9j zx($+I)z4|^N+r@yBmImmZFL)bTHS_{-f_O2&144F0MmuoDK`5BlapsrDg)1f=fMkL z8+Z}C>60AB0Sa&KaNT;HV)v2}x%z@RZ zAc|GJWIEMrgtZIQ?^LT_<}k0XhfnQm zwr1+~SdNNVtDPpq4-ongd;|`FkHIJ4Q*h9BQ1ybx9j7YsY>tPXR~+qePYE4CXFnQE zv0deo{mz^1!$d1hjnEOAv2=`*-YzrZ36J%}f=Y;Dm9LuYe?<^qgNCv%>s^!mwJ_}L zSN_jb?HicY;9Kw=_#V`NAHa`x)v}4wWIq_1o&C{U?Cc+8t61hPo&EHuB>TUj@S9U% zfGRBY&wkNsKD7^@w6mXuiddsJOo+cDbR7Hv{se!4I`B6*VLLF{FUPaVe%$MhE%%OQ&G*ln`kq%-F#prP!``NEmH z@8`p?v%l>vQ?)Z-HU-T<2nYpXpg9QdY^|ZC?{`qw66}uv=Hb-nMO%71 zW!`LRZcYfU&}oumY@8~6-s65x$CL_JEbSewk%kkVON~aX9g{Sed9dZOeU41;-Nt;T zC8k0ZJ65SBYF-kFK1jsd5{0O4(iMuOjJL5wBEnIx_GP0e;w2u)M7+#Me4@wE|f#0vJC4lsy_27|yIV2Ez|DU`LF zKK}!$4j<6N@qi?d42FUfFboX0Ygqn)%%AJ;l4DTqYaA|A;Vb;rb>4+2@zs7Ln-85i z$SM+HE!6h0ehh1W%6Y^ZoQt*kNP^h#s-$!b4#x&^SoFHwfh`WhRWH=cf_2J=_1sFq zv-E;>pl-Qn)WyO-)-9J!;E_S+;bxNUrsy*{VT*s0PfOHEqL`>_bP%35T;_2nW+_2WC2`!n0X6qA4MIY;@KX5=m ztm2?)l<8<>fQ!K;U6Fem58q-{UzixK#Mf2eYOoAk1Fi+vf#vmMFkb?Xf$a1G1Au~aRXQZ za>0$@CU7&zv!!KLi&9n063Wpji@)?X#R=WJkDw`bF122M?z;>_$ybNBkJ@{s>U^SF$ zP{Ha)QZ+!Ob5u*zHL3bZ`!sXe;X|ZWr)|9MJmvTj%RHttpFzBlL9gTBjfNfEK$7}v z2mBZ?huO|Z$d!Y_Uruo}OS{NIT5S1m+C@#3xOf{E`z#kbB}--UK+W9v;#)sQOFAea-5wYt9Md;~TW9!MET$@I9yjKY$&8Nd0O5tydDF;g5T81 zYWhKv^nzXRjyE=U%Z_w~YK`A1a~w3J@rTx!@vVJZPz*dtyYw^;FMBE`ZTm1ZCWgn}^89E5{2 zo$4c0`}8Dtl=cw|xt@>s8jm}uuQXOEyTwvZ4|TObrzL0w>_nf%dugoJyqe0k8!X?J zl4Qlgv6EHDdx^0P3v@mCrBpEbeLWB`fk;$u|4Rgo!~$vpae{0%}e_$~6)Fp-VJn?aY>1yq<94 z0`eY%H&nM~K4m4AEMCQ&v6QgQj%9a~P!7=Te)hN*s=QiGVf9VEb(D~aX_|FQai5<& z?yL0;*!w9jRu*jPa1L<{2owuB^S?1Oanj=X!?NbjT{K2M@Rr!tq9N8$Y!zn^8#Bm2 z^b=!TZCrzRGZ+j39*_i*W2^^;)bg~-P$iMJQ2Ery)Wn6xsWoY#M*YIsw{GVH>=!F< zYU(o-$rMn(oj-zO9>TbevUZz)_Q|yy|!{V1mw-| z@?t3Kjnm@IfRh=J_bfc~OKQsuPt9aYq&mspCVEj?qPMH?Ke%9_$Ju^|gY z8qmR9c-{0v;o>MO=A4h5PpK`lv}U0*JCIhrId9P9Su=BT<}8^o(!Ni4EgE*^OU^X& z+ngAey7wET(;X0d`U;%5Vc zVW{$r>?qYWEXiH01&U(qID4yBQwH(fs`8*g+;emZC4$reBA;Y_%4;oBVq3bJx$Of& z{1DV%v%J|n$@=NX0?OL+PHi`RLgHy5ZF30XXJ!r6TjlcL_crRpyMs9UDCLPyja4oI zKc&Mvf&z~)iSIxhYE{c5&WCFvliZi*)9k_ZJ2W36AgB@pygCB74tA z?QpO!!gi2?uvkoA?I63IIB493`{BCiC2~W}8>U{N9fQ>g2;J1nH24*!CE~qqave<_ zkGxoHf9)oo#6|{%;wJ3ByD^s~)A~6aNI&SRn>qnuvFZfvpqBQF3_1%3t^b>YSBS_s z2tmPW>PNNoF*b;m4A9c0v|MCRd!#%3H|ZN_WFuX1j#oNYNe?iwmmw@RFVVzK%khhR zw{i%g`QHWPM?q@)k>@m;K|6n#1;xwq>p2>U6ouUCCeseWn( zI~uEAyq}}9yA27kOplhz>?%?NkxFz*#jBQGlH4n`VEzz?;6OF1=TLX}hMNcRgwAwS zhwBPtp(b`P$xPIP5F8AK01rq4$zUi*u^k=mmc-`;&lACH-IqO(nVhpoPG@y4JI~eH z)od1v8EUkLp)nkc03*RDFdCc-Qk~j2Yt_7Duj=Lc>^L4Bu_|8Ws=*j|V?n^C>f3km zqD9M=Txo8npEPsP+&QD*%Jr1p@a@?;F2!h#Lnp0aEp>kPB==eR(p4)MHhVem$HSTc zCN{uMR|;;smg0G~gIhZ+RE>$FBb|0p7yZrW=$+v`=v{98CGx4m%+sgJU{v!yU2W}| z5z0~M>R8=n?FQ|I*x0mYEN7lV5g&udK z4GBr^VX8Zu&(S@sbcFF4$7}RRmCcS#+Ew02<0^qyvHjL-?dVYTRbO$nz^a0hDvVN3 z;N&Xp>UUk6rlXB=#3*XRdsCZnDi!k8>hJg@_v_lx&U39gQAR8;)w~vr2~{)ui=!Ol zXt;W^pVZ@g{w{1OBQbuAaj_dp9>uSi#tlr;+ZjVJ!&OuMCTK4e6qPT;t>snQSo4}P zE>w*_N4#8bXKpAd>U(O=uF~1s4NKZ|B(I6%bhbLH&6HoEova&YoTTw8R%5-!jSp3W z28xqgZ6`ek1aLA;^;oe4@%^$EM-(oxhxk##IcjV!N!@`13+tg$#hZz}?^; zum;=x41yE_u|a)-v0^JQhR zfd{&Af`&$!eOOwZ!W^!4vLj4Ib28jrh4Y=s#%eWNnwaOzA3%roP!U^3`JS_uiK5ul z3s6=Qk(qAE$YbNo9UliNV=>3-MagUmi`DTe?eQ|9yb`EN(j3Y?oDU(|jxsH95Q?3V z(hK!EDPx#a=XLmRIICmsNJyZJ<-4PLijw9@acxwU_w$h*6cH<%Dsr5}p|l&k1@?fw zpaQ%N_BlNa*PoA=XUQc(4(KO^=!5jt;&O_J6TkdEf`5x*DJ7i${stqvycrf+$)MR4D%qYLxGs}LKu`b^BOMCEnc#46jjjk0~(p1 zn$H~NRjU5kf74T)Msuw$sL>_5Plu;UpZ*H!*ZwCL$z$Y--Yb;N({+fsSogc^XNGbY zLgBed?#uMrG#nYRiW#O)e}hsr_!fKzz6Ukn2k>Jc4->}9QS1@In4|sFAV~ioc@s%mZ;YIhaT!@z9sDAPGqq&0T8rikHo{em05EHOI+ws;;-?W%ZS-U<3 z^Gt{A0;enJ24X>X&;#@Yab4?O;D}TU&a<;#i5!6yemKZIT18Gua;NAnzZPY&kjssS zUMTejeLy_u3;KcnAR&;4?~yX?nm*s*;lasx(Dy$?pnMMO0bn2yJI*%gu8I6V2-I)a zmQ(EM`v7I_JftlMbq%Kc5a0>Oo9pGpQP$=a@ji+2$zW(e-gYl9*THL)W#UYMGb|vl z`T0ri{$_3D;LWpm!{Ll*kk@;FEbh!P5rQ3Tg+(3-anwJMz2CB5=OD)~G!c)6cI1>_x`%6Yk(dLc(B%?^fPdtGj^ z(_oGd$bJZ(S%79bc>8%jf$|eUdO%*Ei#bsrK4NChoVkmaTr+-VcJ`blR>DgiLfMN$ zUFRV%2}}+sB;n6JM{*`JXE5dM;6t)QT~pwk4=!ksyFgdE*ug7-cOm7cf{PmD%{|9n z{-;ph_Bry3P}ej#(?Ldq+-@p)T9SLD_I%L6E{1(EtV_U*hS@yWM>?nJp3C6a-Wx4p zn8TY1F8wFI?%aldz`@UiKMUS$FsDKOSt@@zji;kegkgIxI#jvu0 zJQUyxUd1wULS0LEzZB$v`m>;@F3@_%PSGnu=Sn!DcNMQ3;2ng_7y=?aFkIh>8W#!@Y&%)Pw758NM6 z_3))!-k;!Yp=ZbwW!+2s2Qbud99^tCtxkC^*|D^ zfmg8#R2A=wz(x>QwWroArmSDpDQ`!)iT7eD*M_RXYQvycdgF9_o6U_s@W5L4DPu=$S5BX6e~2R7Uydgh!Om^D0(}-V40n23`b# z_2x`82N>z1^I$lm6xEl2)O|azVtLnxx_0pXW$+4UK-J6`y6#ahMAaGVPMD%v&Z}7B z4WX`AdH+A~8fZv0d#;_)N=wylCy8|z5Y^Xt72AU98@zuL><0B!ccN$dXdY#qb$^TU zb_?y{y;$aoP}g4GSAe%cV7;#DqIvd6I&P`jbr;orK-%dYUd3AFhPok#ih1BXHVAZ0nwT0Ma3S^Dsk3PYk4+s*qbSf7J0 z0<+^+?chG2WH;Qfz~j)K|-$!3K-+rf*@ z3w8ZO`Jcfr0eOobP3EK`eId!x-+Xbwu)Wsup8L(q7s>UfKcW9s|Kzo`Itq8FK5w5& zc}|bz#*Sg?8d$yb>2V#K#UgGsr^j_D{S8illfc!D-;n{Qfz!KLmrmr)mUe2zV!1>j z7op9yhIO}S51DKjtF>d$6pOmeXg5NmF$e-pKrlE1GzHB9Y0H)A9@g`^OSu{mq-#=y zEHx27jw=wcI1wx7H3Y#>5C-aZe3RAMY&)w(Fzl@6o7a?<(2Nv zu*~(Nd{B%w_=l}-BW3oa&=T2^0hF{!MBWJ!(Hm!$Jx zi$&cL>gq^X(V){m)K2=$8ST6Sr4G7X#Y!aTILmXSim_;PcUI9{>6k(pE5#kvK1!M& zov<#2=?h5*DI&IirKwksZmQx+|9TBqNhH}^cArYIfQr6rVpS9oTUHS2>PKAtLBhY) zaftUK!Bl8=9pmmaL7fAA02l}o!5}ag3;`ay+Rd-FF9e3yZ`4v$y>a)TWSCkwkxI3Z zi)o3t5sP1C+$D8$sib9c$<46&bg=`xjv}(r;9O9@>mEh0 zTQ|AUqs-zsZ}iB!4;|}9kLbcs)%IFE1WiOK-PAQsWwPlu)$*Do_XzzQ&RnjEh7+`!d)-9%|9ixrUK`KVkD7J&LqWX`e+ zS8(ghc&X)V7}8)V(l}T{4c6#>&cIPz2o{~9yqNz}Rr6e~#OWW!+mDvr)#t&>X8#pn z30O)W%X*+I98Q5~+43Ci4iX zCpsr{CwBJD%qZ%bPm6^@=Zl$SeLt3*8{diKTAP0WQy%0PjZQp8uADwpDftQr3G@U>-^^1xc}lA}yVA zhe$t&^h5sPUGlm&ys63?Ua^XXVCtTNg4pqmrta$ySr0Y<1&Y8%un9bTiuea!@hI4| zQOe3B_Y?Yv+-Q@L-SM!IEr$LGcoaMaO2Fgb39#8;cHimAc6(K!f~;w;sy@k9%)1d4 z%YDR%Z$acq@D$hzO2O0M8St!Ae5dYE#l;TQ^lCDpM_vJHVrw2{9Kn1JJP({B?*;x( zRcf_8K4w$a9v{bfzm5Gbf|tPdQ^rSJp*=pfQL^x6Gd>babPHzPEiL#zXs-q897nH9 z=8LnBGd|jFxJQP^OAC|T>84Z1Kc=e_eg7%rVmtg*nuZ?fFWxo zz)#Tl^gpFw>;`WNDz|u3V8+K0B*k`Z)zXy@i1Zgof9W5dV|-LU?gpc;G&z60N%BJLX>TS~Qf<%9P4Sc9Bc+OtNs2Ko=+M{pF>f}g<8;1_>c z$N0#8#u2k`d`v}DEc`hmehiUc!EfMqa2)&r{sezH#m)FgD08U##zz!tVlmH$y6Ry5 z4Nd^(_&CY`sj82%$Hy@^_W0NZ&lSreADjkGkM%!(?0_|Rnw%ToLdgt{AM!qx_uGVt z$!jB+jX@A-0>mP=nR*8E{~4euXa+(+Cz^CBea@U-pf6VUqVW@s-kG2UXbD<@vp{RmCf5GccN4d{YV8&i8|gbcoECrspBntT;lDGbRYkC^^nqXrLSnY z$`bB8))H%=ij90#OQdZUi2+CqJVinVj+V$Ox2wEyV1oS-a5{8tubFx$qA&;y219@c zB!Ofw)L&VT9jzSuKd-Wqk<(bGGz3Yp9lMNl3KGM>a4-Ul1f#%caIP&q^hvv=k3hFu zS_Y13>D`El6}_RWUBMEjopj-e4YkPt_43Pd1LwYHllThis;x=xbRBci>pG#*NpH7y z-hfzwX&=dyyeqw)7Ne}50YZx6*|V0=OxC=(3$(+QgNcpPDS|M zda3yFIl8K@K@{?0wQrjm%)`Tca5-22vcN*H2rTxmfv@*QL6)_L&W@~?Ob@AJvsm#v zMmrmgE5H)46y$&_!BybuQ?$L^x^kaSyN$PBmm(=P^CWA`62b$llIt3e9tSfUg_SdlNW)2Sj~P@!F)7s2X}y# zpa9$nR)N+3+-wVVs5J42x7qQ(R>aZ)yCG7ioxAf*7eKyxL*Byv*tV`#XJYKbjlkd{S?w${X_KiyLq4bLe%SY)9+Fd5UV{T zLacGocp5wdo&{y#Iq*Dq;S_Cezl(xQQ%DBa`{vU+wu%)WHqzUWcoDn=wu2quW$+5v z=`Zb@Pb)w3Nt+2(w{Iz$VpBiY_0QNV^?w7QH*KNAZ`tjeSEVJ2_Rzk%E6#=_miVO! zY&X2Oz#gy{RDid^KJZS%O?B~E$vg}BGqP}o`h;;|Cey?(v^VLN&zsXq?Q=d#( zJ7uM*C}WbbACg!}wF#^W-sj*8@Fh3`z5-u^Z~j{{#?psPGD^PjCS#utwG1y}`QPbK z3-(K>KO%k94z>CFcDt2*tI3sYFynF!Br#8oCZ~KT*$!N z@WpC>FjYQ|#2?^K@E529e}fa?q`$PUV@5%?61m=Sq_1PMSn*M#?cx`>-QYBEI%otM zgCNkPyS1h>Vf&`g${!utz5{+Knqmb%>H3#{D)kRTsCoAQi_nf->DX*0^;#`w7NO%| zU8K9@T4cnQ{bE85N9jz^0<;9Jz*(R*Xk&-k@he)xdF^A}&sx0vpnVFGhn$$_S0ft% zy)B3Y?LZW04?2L3{<4mWT&JL#&0|tOy7y(9tQD8JU*QvV69Oq4Z`F}gaedlx8h>9&c$yHGV z#(=TFc|JFe|IPKlUaC~Cl<2F1sW9xbx(HX8D~(d)!2~d|yZ>2T__v(Z4VE*xk73zo zb?bN^0#i(0(_x+mCV|O7EXy4xCr0bOm%L45I@RZ*>6Z`Rij^{85gyjc3_;)a7i9xeu#fEgeY%mkN$S$1w$|G?#2#}azk zY1%{8FWz%It(}3USV&`|JsXWV;4&~5%meemVx_-??>Ml$nO9N=FxgAG7|BCru` z0uS4vu5c&&o%Gcqf_BPj$$lq&2hkMEYiYEL(Rc(r3LXO`;BoK-*zB+EJLxNJ;nVi@ z+d?G8W}juGw;=H(cnWL_J&^Z0$qy-CFFgRm+dRJO659|E%ZxHLtU%*!un)WgD#5$pJ@CH2 zwy&2Kv~y_tdTAD#VksSTkXgYJ?gpc;G& zz60O;Yx_EB9U_up(e|AJ9z;^Cw6l(}DpX?p8J%DLEeRV!>?D+)T`vi%&@tB}b|5TP z*u}(t4DDaRZ{T-u9Q*~K7 zsl8dfHbQ#s<*n^ryB1$!^Lp#xv)COObT$q;+rb~Dtf~2$URtQMO|o?clmkgDDqfSL zInG7~^?=;dNp@bDNbTd5aCFO9_+oW^wN6}===4LU|G(AJcWAFegPb~R`AIvvrJmk` z`xyrZ`)dbP?Zv@h91QUf)Yk`tDT$oab-kkxRtQU@REtFYTLHvj_O39oHw)(G)wLsOw*M zw$y(TLX&Nw6`kx>j-iZnPRf{5@IT=Yh3D#K(rd z$@WL!x*r@sQ>-vq=V4u}$x2z0S0T}N#9^R*r+Zi- z0%9o>OzyX!@g#T(Yz3v@Y48kq)?eGV*qAror|ny8q#-F5o33NbpbC*eFQK!&p(L0O zDPtxEtiD-bBp@ahKFP$p1HG5QD_|!m2d{$vf!F-w^-b=H=lSAwOzu%=id9TD+Plzr z9lQbF1iQgoU=P^q)Hdg{$Dq?}I>WxD#R0^`^3T^$zTcn^j5oeIjaI4+&y)v-QM zgeo@jLM@RtOe8)*;!}SK-x@gU0VuVvVL7KS$8}3VaQ|0oCAJ@E!QxuEWq# z{;T8oX`;Gew0Ci=JAOElV%suwE_Se+6)ZZxICac=B(b?$C66B=_%?i{c(r?dIM=wq0lj5f?vCpo{bF{S8JnRfr z8_+SA7%C7JTX(f~P&88lBi-lir zVqcE-_234u0_1`l!A;<1|JZ$f)U(_dyK@DArr53|RmR~@F_=vB4ugwX5cL^Q<`Zw_;Ev$I$hX`XdaYW8&J;ZzA3#{F^j4FzEoeUpo&sAzDR>$@1D>^Wb~M|6)qLO< zt(}5P=c;)Jnqpb`M!O7+=fLye1+Wdg2wno)o!VxlxaKyWs&A5ChM3rtJB;WK$S;Fe zz)nyOUIqUHul=_q>6=G&lG1NKB}pk}siISriAOO{f$_Wx53hqaz?)zRxru-En%W5NJC1p&BC|QDx*-gS`^fd zYeeD`BtG?*@U2x2!muQqAAgi1AeMcXso+604uQ|WVNeA=2Va0M{k46w{@Ox^wr|#7 zj;7d@dvuVw*GrJ!A@qGiZDdv}Q|{Js(rvF%Pp(MjTP}MZV5T=Mf|ywRy(Zuq^nL(8 zf}@}o`~-dmzt{mE&hwxAGuCJiMYs4*{vI^Nj@)OokD>7^_znCHj)OnIpWrWlZQtY{ z4w*!2ZC@9zWvke(wMM!QiNC=Ka1yxUxI_z11EH@+ z@q@-sBlH@BAkYK^gEK%=&@9ecZkzP@jscYq_^ROOwxwu_Opd*L|oxs_k zv%j{l$JQWXHL4ptN{~Ge>KUj>Wa=HQ_N|ho$f`T+Lv&G*mNvb2 z;XTrOZ$QVoNfTkQR8=>vsc0D{*c5%p3>y-wL-oW@+>FW zxhP3|(ktP2dnN*6HCs&uXQMF(Tn6TXd0;-c94u(K!B%aOUaP-FqK|?#$dXQL&Skbe zPY;OWcoEzEv<|!CAqjg4(o5~ICq8JOsvj%W65*6Fb>0t2Z27aAoV#Ag*FwI|Np^k+ zQu2&f!to(UK76r^=d?}%lO5M%(Yg8G>gPMkXOubW*B*uQb^YccDdu@WOQ&oU={t~K z=^vu6-_3j87ouZ*oQi;0?KTmTPpY_53s!;Epb*>z?gsaqqV4T>QIKf_$)Mv>MIBqk zieEC)Ymm4X+z0LlYrzBHLGX~jwD0g=`JzwSeEgxmTU&~z*wh_HdtIDb$5+Aa?+hO< zwi`EZyXF@?LgVVi@oX4k=`V-5it+picoaAn$MW-DsY<>D-7!oq04Gq^EQr-EHeRcS zKbGu{bw8%&^13^%7l%M_8aN#^0*yfsXaa)489*#`XPAEKSyTRR1_F4k=DSjAQAsjC z)-JvyVAzZCQi~k|Gc*vJuVZ|k%r)$Hp|{sxXFC+hxI3RNuTe_A4Zi%3Kv(cYG*q^yyc_o_qU;myhJ z$yy>Fs#wWuTB7htk%&Q}i!C8hbXC`)on^*03@etrw&okLWst>UUl$Rs^7L}4YqrX< zO1@9rLsz7$`V(y(bAzb#5<+TH$8X?mV86C z#v(hvq3Zl$oC9x!sp}!M4@yLGkX^6r7v%J2A3MU-VS*i~YnMp`rH53}Uh?4B*+fmG zV4E}L1BfFO5vzJL%+*(|e474v+AyQqQK>iO$%~?DE?Q<#2)*>@rT@t0NOducw#`MU zhMi&&Z-uEJo{JY`R(XnOi4s-4LT4hr5D*agSn70gn*`6@haG2xN zV`W6+$od&7=~t!g;1@l0?9Hu=2!KCwVY-ffRHIw-z7#hE2pf>7$cr9HuN_E_p?CzcP}2~?y1yE(r)F54Aw4EAd8Dv_1x6q#bkG!o)LDlU2I#Wo)I#jMFy=vDc7sC zT^{eT1IA$8kSUbp*KsH~Tr2G2f3dQ6jRM6ZgKk41->X2`$vTQe%J@goTy=raURSi7 zy<(;BnTp>p(wclZj?qI9fmiLY5U6Ahv_kcCv zUT`0{AFTC?>g<&wVzL(x*%x=%%Xap*v0bcWzpi`QD^hobQju3lXKxD(lf8IK$}jV< zVYsez85_jPKQQraguMwo42r=c;8E}xD6zXvA&yMfiG}9tIuEivN)6ppIst@ALk9zwZh|@upC0gQCPzY(v+Koiuc6!jKW{Q=>63W2cf@k@C+>OW%Ox zO|Tv80B?b}!A?*bBFEf}oixns*g0dnCEZ7M2m1(-E&I)^ zy&t_VzyVMRz64)^uR)a^xf}@r;@W}`cb((xA`~QQTQ0ko#-X*$k zf;bS#{j#a&H^_bme}GzfRZHlbICa&#BfJB351oO9?IAzwSwKXV!gLJ$uO3SK%4F;~ zdVhiw;3W79{0;sAp1#h3sPxdedaAF0-szLGb*eJp(SE-+eBQnsa)Z-A7^n}zK?4wB z_&TaU*$A)cfhx>vdZ3*0VR{VYLMO7PN_s%W?;gP~6-kDZRpEO!w;n2GJ96hX@V?D$ zCAA{^zAV##5bIilQz6TepNp_MAA6si7Bd)WAac<6+O&Nf%( zfYR7~feYub5`9R`VP#FF{Wap5xQS>9uN+F9L{}vJd!5UzAK6@*(Rz;_r^^o3&ZUgg z&gv&d^o4q~W*w{~avoxSSzGs> z>PbI!(s?h%rAW!)rk>Hzp9#i@8)nKUW~jFOM862?uZ@+ z`JXZC)`w-1lY5n3F~WPJPQfwM*@vWlF0bQhgW^P;f?_O1B7Qb0NX2?Gm;$DPY2X}i zE;!H48lx&9xkPi%s19*oqgxjRn@AN)dG&Z2*5`vdTKA+((|1*JM{Im@M#fp8ZFMWA z(!A-IT>xePk%PaOKriI;MPMdK2eZJ%U^d7wf%Z}D_j978o*prb4K#gUkRLUS-Dgi2 zdO#!zIlvPSLqe}eJ4&fY?os1r4s@4*OF<^M49o?WgDkh3hjb=3|5`(;3WCF&uY@m! zO(f!X!#WS^`CtLa1`EL=uo&c6)~CN1;Wex&zlB)uGWmr^wGG}&^@~oQ$L?5tpWY8FW&NPzC*!!` zTaNyn|AX%?&9~qy_WGS=Uy^{GaNJFK0k{W<Lu4dBXqM^DGFvYK&%?yiiZ&YqC3WBqaL zH-IOAepS~Qt37cZ@EO-t)4>p4rz>9rPx!q@e&gFU~ z$0oR(pUyc`%w0g$dOR#PMFN0UWt6(d54ZQxp zy+I54EZy(fUf-!cFVTISffo^JqvT{8taTo^>Ps*EbS_iSwS7_U*p*=S2B_7aN_L7S zm+R2Ax!ey0 z^-QL7%H*?%tjqNDJ{<1c{o9As{f?f<7UJ5CemVF63>-9ZLh{s^lgEsns9re2cLnrT zbuU^n`m0m&1Jra^$N^B1E0Ih_p&Y%#y+P0DFJVr3zGTW zbAH)!!F=audvuyNVlCpHI^27KbrC*&d3!%>Uw{Lk5_}210$+nFGx?bd!L8Q*ESDnX ze~LZ|jD^7-1-7ZFjMP8a(@tNGEk;EoqoL394TRrgwVtWYu1P)v0Y9?2N zCymkjCv@^BnIUr$yKFv-$npp_)it)dJhidU^D||?fM3DUQ#gI9*U=H)v@?bIFBkI` z)>E()k>zh#{$9hN%Xd)z2W7{AiB_fh1N>ffHI&Wu&U85{Ho&+@pXWHLe}-sW>P^)7 zzm4!V(-}F4k@dYCqZ1gM4Eb=nLp_ha$zUov*2ziM|3dfgkQ1xl;`b5W)Af%f6{BPM z_xOD3wi8Uw^&0fkzi>K21&+&AZU35ir*=Lt=Go-(ZTk9TfM z|C1L{dDUs7<)^!Rf5}DLi&zg=*Tb?S)+4_K8P?3Fe+#nGXY$#jxmgyr@TvWnbgJh! zzB_K)NhpoI&1GlXsD(2vpuM7nDjpNy0<(B{O8<6e^C&~Q0X304K8sYe^sT8MfU}L^ zOj7C}uB@r={vP4&qH_8FfTo|?($JS+SKd;^qV%RF9@WYaSD_%Xj?W@d(LQy4Jz?(b zFt14ucz@8jS=!o=9Yi-0y@h?w;H-9uH{g9qbKVhcIAd9g9CMa4+Hv_kTsV8%Xye8Q zyy>c2SiqaPE$_4dzcs7FJ-e;(kkrQKnbuB++gTOU&|PY3M1b3$n^@niolT7~&NAB> zXTkPPLpqRdbUW2cu+Hur9+0`CL4X$$1o*#N`)b?4_*#l#VF#7!3vh~d9hSqiuS>O; zmK}|kVw6Sl_$*Qt>rjjdS_=t9mX;Tbv;~FZj*rb z3N@YoEA(%r#&k6fmUS`2#e5ct=Bn7La26N`#)Ao9A~+jNvaU@QuO^P>wA-Tx z0|J|Kz`5YOeyVavzxf) z3zcfd;L>LsrPx@m4A$e(6_Mpd=+3k@Eamra@}&~l+KVF?%4UI!)ua|OO&(|-@SfL3 zw)HIzOPZrK8?6kjHKvoaAc}Hf@B}rPCpOct%|Y)H%LZq=k#Z=L=dgKEKE`^zFk_Y7 z+vm9yi%f7Cmh2tknFQfsnb})yp<-NniMqh4$YZ$! zh>VTHhuYRMz-03g_rzkADsuB9`1tIj#{(CrJ3buK8WT@ zH4~ljTBj@JmaW3kc?g|V+GCvh70oVMbGb`1slV~N8qGq-?*+7_qdvAeW;AtfyQz6h zxsBBe)DF@a&J|nQI+o=|AQCaa=UD^STA-A#9h-1#(b+@&mZ3&xD>_B}JgP|yQ{-t+ zvS#}3DYVD5lfKJGLo>773`DXLeCp{AG6z22PoIwU;qLQL0{W>@lGnd27qVVv&)q1& zSRchQ1FH{Eh*MX`%Jqp8?E_vlKz!t)B@#9SA4K~CcoDn=wt$zxE8tbIwGNL;JhoHm z9Q)K)y&-R+k~;>x$MxV`KiGs&Fv#aQIoKV-%esMnoQhN@nsmK}lh;FuSlkI_-we_v zsoVxiLUr4vuE|Nq?hWeRbh>Rx=KwcC+VQ_dPf4C19Z9*Y7qc$DL^2)T?bz;c*|zH? zn&~d97&Ijc5n+;O-U8hsR4Q|B4|NDA8?~LF*3_;J=qrvRx&*wD z`o!}fmiAO72kTO--U08{ZLRMsJb<<-Pl~cbm zblwB+0~_yd*5&M`oZX9@-KcI|nRxWinl`~irrqBhSD`aV&IF|)@>#+ur#>EC5m}0x z4?x{+w3;U>$>;eHosYmCV8e0F`RehomU&vDUN;Uv^~H?6P|rAQPHHzg?*8j+tH&8~ zwxwcDXHy8@3;(`;&I87BOC(yw_6T^JsWsfX>!j-Q-&|!#Cn&DeW>avl-gFY65!pJz zIeCNW3vd8bf-k{W;A>D-+rt30h5#ty16oN?UESqR4{NKRwE%*+I zOb8mE2m7h`UUDF)ABU2gMz`xJYh}Qk4$4y=ZPYWAXXwd24ZCVMeg?ldTxH2{si|=R zZ&0Q4R8J_CNGh)D z%iz~EC0IE$ebiP|`m64k#_LI7IaDG!XPSI8A-JZXRzCE#xOQqSmQi|#Iu;8%2`nEY z0R;vGcp2E?c-i&_^M8fz-Hqtko@k?MS7^^Gu@R{lYdp8cYjmBSH}wyAXX-8}LRY#V zhoy+S3(6_8T~K+J>4G-!wFT`!3}_EJfQ}&6bU~aRKn>OX1b>?jxGTmr0ZVxgHFqGR zKyOHgs1;d0-ni%lRcFuzbOqf&cW^rBVSD)>%y((>b>j@VxmkOJu3D{WS3)O}GSSfX z#Jm^i4dOr_&=>Rr@ow5U-KAZ0uQyeRbniIrD1XAg9r3IZwHNDOhEK(fNdDPAPk$%} zfPtV^w=9QWhx;?~SG0Eo{g#BPJ1SF~h*c{N4?|AA&{}1%- zarrvdmr*Vv%c0l|v$iZnM0YsrNkA^y2}HK^@p;amYy=1Zk+M{uC&+p-7zsuJexF*c z=d56~`g*85__m7w8ABwJ8ED%`PU5A6&myu+!E&^VMamtd4@IrT*J14&mzmG`_wsS3TwJy zbzeMbquQmgTiJF`GLu3*eH1kGeB-AA`=!{Lb5gm4(tVpKx2~t%y>)?cw{p61b99DT zW?tk|PmC3Jml<~*m0T}5UF{tsC-Buo@{CT{Cl?w&i7eAE(w9z5dcL^GFz2uo89UP~ z*QIkvHcprq*-ntFCXJQvEVeDp*)iR4F2|%WU0;BR)78yYFD#ep$bGX6e=*7;*?bmB zpY2nF&KCY_ZTjUp$6Rx5^=7owX1lI!%vJ{`GMB0g`Tv4GU+ZMAF$D8kf&8uA^DzTw;4(F5E<`e z?Y>Km*JXGSS;=RS%^bwv4D&7ER9mZaGN?68XFOtJ@CHfDkCFq&^WhqWwDa%#Vtp@ z)}b4UZLZl9t-)q(U3Shru{LVTRNAHwvDS%^8K`c_fCEIl25(J$}AJ=1}L8ZwVG%TU#i)|gsYt@=xvfH zm&7%DCf2smM;)doVR@=fCetC&S^Xzov1r~Ei^k4coH;N=Rpz3~p54f^5sIh5GcKx4 ztjmFUF-wu$c|OmxtUm{y2R8W4tc%_Y&KQVR>(AxjR$qrm#m0tQINzt9O_NRa^}4c| za9+UsnBE5#i;-&XoJ}^viw76@)SUB$XlJ~>rV^)4qSQ+tHmz77#wwor z&iZQ|M=21=TF7|{p}rHZR$d^7v%lUf4;H)5Y*iUXpP2a+W$Dnd*__xev>ht-jn$#) z9N3MN5uS^d$Oq7V2tEQLiHptMxjlUT7<>Xg1r^{k@HyCPjs{{?1;MPmA8kmLmoQ7MoykGDj%)c9nzTGK;B7CZos{pgfb$j9BzQ%ZUS;?X z!SfS1432C3ZQ? zB75?The(*3fTq9){Gb_V4qDXq&`@ohV>25M#VLMFrIT7cOe#?kiM!r-i-NT!Xa!n> zXwU|<1?{Xi878;umMpzadyu~Cu2x+d@TTgVC&DJOY>BX{bVd!YXn~@Oo1&At5WCAX zQ6(16Ah=RftiV*HDqmAi&P6iH}?S}Vm}bXJGxc2-j<61>s0 zGY+OcpfBhL;z55f01T|{p^OmVrHDh*1~Q1Z+({swTMbLWGSjvR5KIJT zgGnG2Oa@cHR7<>V5p%gJUdZ&T`>GTYi2YXty!X^RnN|p;NZjp)dKwhxfOEllAPt-k zrh^OI)aK3c8MoDtw&qt4P2v(E6Dhqzx4HzEeCZU1*=~kAm9*Lf=Rwm6&LnOR1tJ-D zYKj?G3B_C}F1Hl@t`2zb*6lMt*;BY&Q{-PO+r|9cfOp;?rysN7&~mqFV-_^?zFx)wCTmh~GSAkq`HMj;`>*hB3+k-jnb_Lzi z>GKT`iX`5v6A+AhoKo7^m&)feQjzv@7%({wjy-xFdqnM{E|WY2w?sO&l+x*eiB z>LPk3M{W>GvrWfDV&w#Q&yY|DS5hjHeZOh-a_H^^cY(V>0k{X;3-0?bHzwW1?qVv*PfbO3hGxqcA)I z!=rA7hjmk%snmR~bnE;@pihG}TTO$jDHYkU$~1T#MC-w0;Bl}4JOQ2rPo3&O2D#fo z*+U@*=I7`(!zq$ks3Xn3MIwC;qUYU2!_?uMd@yUf6%@9-*nR7CdS4(2@}?YNFN>K{FrGxd?J;~q+lzQuYuRWHc$fI0B?fr z|K-a3vStJnU)Q?|1N;~TLQ$#~S{ z@lIj*5QdN347GcF*&{VhWUuMADx$DL4e>Pv9^(0;<8!;1}@gf4MR}zU+w_dfVe!(25*KyYvyR15B=Q+^${03)BTQh=xDxS=+Kilkae{f)^B|V?oGWdU zPrddK$L--wux&cvl(X2^Rt9*e<~>4tLkHbwlR4>0!DT9j=5F45Xx$kuyZnqzDjlvV z;aSh>>=dt-?6icql_Bn{^2ZJ1V65h`&C}I|tL&k4VXMvp zqNyX-3H2FJkN9uuzpyqZOGz)+qJHgBOC1fR$ktai_15)5JsRpW|C@RqN>M7CAvCNB zrgBDp5Smjm6Qe}SgkK7`NY-oGN7m!wVe4P8=KHl3V88E5V0q_Y{}+l<$_I+-$17fnE1x zt@w{&{;wQ~mYG;8;1nr+!%QqQ2|XRuJ+YkLR+7FBT|1?0c~jcW^ELxiE_ZyDqAlFnALSl#2&AUl;dnlGC(oD!S{Ks$t@0S`h_<^+3%Go+?@Hz7@TX@ABheNtAA6x0ZSa?(; zPB6N2Wf_j=S-+K~NZL+r?XZ3uxE)yjJ6M;id&>tn&jpPx=HAR4q3wx@(8_u>E++6< zM3zEzC%CIlDy_yVD14r~sV@Ncxb$jvZSuYh^YHs-$Cp_4c*l&ud$G9>tN{0e2f%}1 zC3xt+Hpa&4wPyp~Cv@hcOGDeqVSSx80cMe$cTKWa!L%CKWP~DXrmA_?y-i?L%4Lgl z>{Hm1hg2->mQv=h6vD9Pf3T>(o@d{$uWN5`nfKUbf>?{Gs?*$~uerBY1utViJbtwE zWe*RAHioz|ldB>K9tMwqN5ML<9y|sfKQ&k8ivoc+m{a6Ik{InHMy;8Yw&v=N+ux1-rm1W|uOxWSczWB^IsK`C9|tq0{y3 zhpyNk!hRa-BC@nMmfcIK3-0lG-h=afup5+v55R}uBd`a2Y^UJBmqYo^bL?w8{-D3~ z(h_5FR*VClBoIE&7M7o2^eLzSwNtbS`!TwaIq2FHMSSe@e1`t#U@wqH?sFPB_;vbR z--fEh!Zxc2i~VSR0SZYP3{hX*J3)+X$T6SzJl~@H9XJSThwLNQ z<8{b;u(KiOVD~-xKY$;BgnUScJg}9dC53t$tp8J==O^|ECGtG*VV*{9s!TRxC>fwb z+K9RhDGPPkdHoLUAE0(fOR(#$bCQCt4JoU_Z0*OeIS&2=C%{SY7x)|e^Iu#0<$6n4 z2VH1BInJau(QM~1i_G}UMCKXDlRltUWOlczmcJSBHr21sO2o!SxY@C2m#iMg%r;kaQ3p5jjYTqf8#Ak?7>J z$O_6Dz!?D=*3B)?Tr8MBKX=g;e5+{QoFP-QE}K24fBb08pNGAO>mV%N6IoUBlAy4? zK2IZv8-vKY9hmPVj_iNdyjhpd(V1AJcbYP+_Q7wnnFW=MlP1vY?^Z`|=v%;T)tx)I zHgtwqSIjU!zbNa8Sf>M#QirMO{|8g#;Qn^kS>&RK+h>CDLE*2fUCO-9tMS_$uZCVG zbrJ^KoP_-hUw-B}z^?}dkpXXLM7}}s`T8(9h_Xo17shQHT(wMam z;(XICX>$@k8;6y3oAI@F`<^^o=jTkx z=bR~-gPDHVnY%+Pun7h7GsWlY=^z_(9Y~c4WC%ed))h!-Iw-(ZBRwxBVPnJae?u6& zgZO9O&$!kDxzO-`-wS?&8Xkvn8f%H^3` z*@%u%n0d6hc75);FwbeMO=l^afAS#nc{EG;91Y}rq6nNt7>}?V$CA54q4M!g`2?0C zmEZY16InkSOal3hxmP5gr{<_D7Y_CIRKF8Tk3@-OIl3i%gpJMOpwBZIy(wTSm?jAK zdLD@Idb)!7tnUPBTSdSd+gpyPq>a&-iJXJ_x#08d`lBc12cPFWKBo=jnfN_i2MfQ5 zPcuy(`>5(`eZ=w0wiX}q6slLhvhMZo%@IOAtVu9TS6`wSqZQR~@s~zRDNV*Lao`vX13dXWr0pyD&!g(6k zLAJ7#RA*u<67!Q!9sfiw@?}%9(6-@y646ZEN(HZ``#9jO&?mkxA99YUAdUJ-74MU0 zPnV%IeSrAw@sr6{)?rT8VOs3PZPp#GdPXioIz1=Mte{b*S*?1KX zZD&0KE1-3}bx{WhEL^KM(LQtWC6aT*_`C-0Ye62k4qOkGfP8R++h=>V;qD-tdTOPd z?cW7$SM9A5!c)BY^i`F7_(e8U)Awrp=UmCHcbl89nY!q+fOnbZs6sjE2PZ!>DQ=-I z-^*!Mv;KNqZH7bS(9b?~C*_^$-CLWfvns{Obe;Dnel~fJV_EfcEnc5~!sQs1BALJX zR5B@SAHIqp6iHFL*b4RiJ{Y~{ad=4*6bbEpt0I_mS>2Tvhb1J(is zionC*5%6ejAJMM9jMh1cg~;(RK(!@|Nd55mMv6tUf8!zY2Ao^Mw;ntO9v`R{vQ0|9TG zj;PelwUOcu;Vb{(J2C@R%9jD}MXE0&qo}tG>>$OmL2brW0qb^ydI48O{m;LBKa^+`qkU+kTJF?**&Q0zzT3vd9`I&@bJ4$_x8o-%Z0AFV!v zDo%Y%C%0B7zUOg5RfJM29osRKL~`kZN(jFMUxBYd75D~x3%&yfZ8x`sK7G6(RZSrudiZ{5aq0w z;-fTM*Y%u`ur?Oh?J^Ql*)E%~>KVBQy#Bno-sqh*X68JuTEr z_%VZH6`!S%c`VC;NMVFuZz53%YQnGfLVIsDjw!J7w$;@f+#7<{GQQpoC(H&vEVE) z4vYsA)E#h7)!ze|kFNMgWmyD7x;FQFCZcyXm;_S6WH3efPH?$Le;M+yW4DK84EiGF z&HZW(8r@Xqlk%OJH(5{7+J$I{m!&LA9qpwp{OT<9dUnf(dm&f^7K0pc1-KGi1#-dF zY5}_A_4SI0Eeu-%%RDfV9B{DUiH-7y@({=Rp2l8J4CT43-^O|eXZ@3-CTB}2pNDNM z4N?BVo=rn*jN2u6JsqjojKRGJj5Cxx*AVcv zKqekp&r=Kj;?mv{S-;LHzn zCF|aiT%2*rs|cFcRBN5sRbJ6qqCX^HzT0Hp%mp|U|aLz8#OH(P8Zwq-L6cm z#MTDn&d{>Bn(}Aiu{viA@OqZm5AQ%^Q*+`r58>r#RqHrWIu>km4C%6ha* zC(5-R<61AQ7vfpsnG)&Mr`uvY;m;bo^6)9h^ z#k5k^Z%p=jnmXl|vMyaL<%7v$7~@ZW$R1=;Diyy>sR?5J7Ly4n_xns53t0dBL(`YC z-gC3*vO?CYzG$weybY{pKWc*B%=(^PhNpz}Z+|ns%2*F9!7<0&o(ev+XyVm_Le>*V zuWTx^9#5pQb;$ZXq}rBe@2e?47am*wHbKka68#uDST;XdUw38AdfI*y=#nZbQk@U7 zKKn_t$yKv{KI=kylJz5dO$#F065MW+i73|dX|bN@STCo`?0V!wW|NMk{3|9p>4G@c zA7ovoW?4VF!)pu@`S5Nhv-kK_1?mO8t(UBO-m4Exo?zCKKD&UW>`m;YGh4%bS_F>_m18>$kclHOiNSX3Aw$h={>$ zE~VRD>vuRhGHWh(mD|}-%I|cQ-{o4r+qGU0T4!M16Z*h&ov!u!TAu7VKcWChfA{u*SAby5-+xZYOr`ciY;sy7Xj>SiU7zQ3i`G zv}Nw7ZJCbR3EB=gcNT1!+p#Tk^EqWpJZ?g}Rk&MX%iLM8Wo{?7%*|)#3^$)GGqy`i z`fZ`x*lw0?V_W79#+JE*v1P(%5B=?!5k6aXRu48KA#)c_54lwjpz71te+yiy#g6JKt;+U2Da>=29mEOnAvgfGyYS3o4LoV< z8hD;$IgRC;Pd4zhdAb1)u%kPjZ;*`i{xAC}p8q0fa&}mVps+#BMc*l0_}#^4x%ewm z+{f=(O|XSPj>p%iZLNade#7)pEOl}`?mmrMi;kSeDV8GszUZ+2FcAAk5>#~{$m;~k zql4ZC!$*sba2;~E3wRm40$v4Mfk?#wzvltE;Wa+L4z__3 z@CJAjYzI3`3gfnIz|DMblK2Vs_j|HdHb3Qx*<0vJm%hzXnj~lJTfk1Iyp*MS2#$np zx5Na!UA_996;T6C^Gg!^o_ElA7svqErFOOtdWYy&MJ=aJ29QY9Ait-K`u7~Y_f^LZ zLGM6)PrVAgjT4Ms270^EDF+{b55Y(3Ds+467xE=hzj?gT-OTzP>OTgbfKNF~^>z>P zi0YS`OvvU?KG7lVQyA1ca4ENR;s)n&aZ!_&?i%YxfkeVj! z3u(6=cwXk5MRRJL=uzrH*M^tpvfD3qr0VBRL2f)egr83O^nI+>S34-^+wcpN4uDE^ zg3spqM+pi^V^k09#OZYQ_xZ+ccwpdadk~`D|HRU=IatYhHCR73XFM%DGyVMKXqZ>5kf}i_KV* z#M`m?wIp0EAs4OHe6-Ezi9uuEM5A5c(yl`L8>P_er&%+ov)x$X()$*@@AL>hUF&Uj z>BT11ct42V_m20oiNSb3>C(=0Y5#!sk6QcmjxuAUP-newVf_&GKY_z^_rv6$Z4FM7 zr)AU^C9Y))G-=wQKkHtOQWGdPopsV(Tu8BbTy(-2I{BunR2w>%1HXem?9OA-=|S&a-D5|gNP0{a%g|8c8K8^J1#H+vHUXY?QJ^Jg1zLk>AToBW(QU)$f9tmWm+n$Ww_R=BC7ypPZ*`PoYAe^$ zJ?7}P|NqcU8RPeKK(8Z+1+ov}u!Hk9Dmqcn8FT?%K{wDHoDO<`oQZ4Kk^bXa}JdD9CfvsJ}b1dswXQ~n^r|ZgRDG*+% zT*`9anJS*Cbez5q*O{QD;wTkKtc$E*8IQyMU;vJ6r+mg*Jk%p8}A4zsnH6Mv@I z%<@GPCrp%$w3Qmr-zrxcW%1fd&866E(a|J*EF_>S2NmzDo8auNA8{B(jvnKxEq4 ze$NcnF9a8XnIL_TD%wAkqpDo2U+UUM8=r* z7e{?4Hb-|JI`hE-kgc8%>E^n04?4OF(OCo*gBI@g0GAYc86uE}MwOE-G5iQxuxZUi@h zrE1_Xt9#6)o9^h|jLt3KRjau1cBATs2HlX$3G4MFpp!%IbZ)@VChB%#q4lVN> zj5H#wi9PG*DW)ukiY4E4j>an#w_aO}C}_;53NFMt=pOJECl8N32sHHUe9)NfGS zqwggzha%}Q9-H`vqWE4j2aQ=YD?4-aywL-@&Wty=Tc^P+Qo(X7EU$sr2dVO)?B46~ zKk71R&}OP7m>{b5e69plxg78YOZSzZH=XkBEQQ?O*x%ulzr|7{=RDK+xA`oM->H`1 zZ=l{4q)=xYztzzzb@bj*AE9SXWmdZMJZXmST}N-1YM0FD(0r9Hy;Mi9%+Y&K%|y?9 z7pg0D)^E!BCh6~^w;Pm$55R}uBd`a2Jji)Vl04OTuTJ_hD0I^0`NcD6m%go?3Ypw2 zk_l9Ues5pwwqhv$HqR*JU0_CUCR|HrY%3WZ^#0)ODeqFd z<3bL}E{O81gjpp2B4^aFl*qq^Lmh8_Dj^RK^C%u?j8&lVrM)Nz-#NwdpGM169 zU*&w#rI+LAeQy}Y31dE*9W>)uYAs`_qxqx5ct~wSZ{RE$t}9)75$VSBPmbPUmZv_H z-#>oLoUAL(ykapw`(Z8y9CF#GI`&5#`)W0ncADWAN1ctQ$kF@R(fdWMMz3Eli6_UU z_w<2qeS_?+JHqv7ShXWukBGtpsv3hS&8E#V0sra{9aU3FgK-#7UC5!M_nV{lyIPH2 zZ=I-ImtM7__lKi*Onrx5KmAhr9WK43i;dsoj^3YkcQbxGyPHAMjwn>beJo=@HtQ3p zo&@q3?q4iLiX581g+}e3AU(JdhPIj^*I|$eP#8Qs3D}c6V=|F=Sr<9!Fx2DoC^d5; zQ_(=Kj?G&9?{3=XkcrXQ*(UlhF=Bw#AFNXF-Agw!mP(tp<&I*wqu5}uDnPNbR?KoK z?r{_&9L0u%)gBbPo3ZUujL9&r8##)NRXbuf9d^v6m*MC|I(kjiY|$GknGI4W5!$>o z<|44oOH=ekb~yGv$KJ2Di@grK$gvl_$T>WZgN{69DXC~NSY^wB{H6NqA$FYW9o0d{ z?7s(PxJNeiI3V36VMReJ-PMw%NCEC-5@_YPYpw1$+iu#K)Y-&WI(pHfr?#ca9_D*A z+v^Ezvr9AVQZw_mMYA1<0qsEt&=JIfPJ^8nE|}-ZubdS0Zf+u(jK0LozxDxgsfkvX z<8HXV9_@!*q?DzE-5D~;QWv!yo!+`Pil~#Y<@p3@wp``5moK}bFOopL*mra6yQ|YD z+uc_fb+*|XSU(+|9*$m5buD`1^<#e5QYSH|x%9_M+>*5PvM@2S0CRTgCc9C@}JA?4JGA%_3YH3_hWq}YZ^Qvm09M_z(A-H zz#uRf3;~H?C>Z8;aYTJ|4h_^ER$ML~wuy(PUQK%lI+5H3hITmSN#G1H0t7%1B!iI- z?KX+Lvxzxweu%N5cZob=ruUmmp|c|2NoeDIknbk6bk^r`o645U_Z4jUv##=Iv9;xe ztVcPvm!dC^i-{aZ-;^)m5+O>hOu1(%6|J3hxgRDwZ#g>}hOsS|du3K%?wwf&^2G_e zeuj(lD@R{=_EBzwXetdzaGdpVk;=_EArb?Ts)bw?Aekv(G&oc3oo;8H66*36nastp zw0dLE8>_lpfS&Hg26JRjE8h6 zLLU0fwjQb}7CCy2@o)`H*MdB79k?DW0r}vDx;*TH%6Q0zBIF^EVLf=RH6Ft9jE5Ux zx(O@=H-lTitza3rtu7CHp)wxwp$d7JG{<`I!z>bYo$+uxOm~3g;7)KCxEmCJd+PG= zBUHvi0aPImGcU0oVqq5PdcE;*FHHA=72tmG0C*6r1P|5a;RIC1LlIOV4+}1}9^zpZ zNmyb$tb%DZCVyHqMmQZZQQV?d5lziji5ttqY>%e;O7McERu7R@$d>vuY#@M zHSjvv21>vib$J+{Wj$0w74oo+V&fqnW|5^!jfXd3+75Prx4_$ACnyE))aBuVdDepm zijarh6dMl(6pO65*?4#trd^;6ya(O~yFoelpe_%W&$k}@P=q`jpxAgQqF7|zEylx# zFnt8}fRDi^;8RcmKC8>awF|6=SSUgsj!vcP#6uDC@DIhtLkYzqJC+#_U%~V>r~==BZ^3uqAo#v6533hi4?!qG9(;?ehjNNV z_S|MX`~cIB;1Ku;90o@~HTbzM4^Kg5W{p%RLLNFUwjL@e7OA@3c=!dTU%^rE8~7dk z0gi#=b$NIdD&rv?ijaqXIo3lp#Ue-VFdqJd=>#|l{sMo4e}HEQ$3a7!`=REz!R+I9 zL1jE-LlN>2xWanyEH@s)?ld0i!E_o31NA{TXaFKW!@4}|h01uyhbrV@(v{YOA7+uL zyNriMFf|5|pb2OSe83Ny)#c$wsEmgKs6rlQUWEsJU=$0pNRPY4gW4*4_wZ=w+SI1& ztsW3AHU8?LZ7@4?2L3AQp70%{@o6Zh^#MO;Ckbb6}{0 zoB*dt+C4hRL)S=+^Z|WAKM)W4 zpUU0y+Mx4_or92sf-Ixh1eph?$g=x%kd@cTVeQaUNn~L4R#|yAKo7c56;m)p-zi@~ zft)|f1s%DVQ^@*cump_!GTies%bDOVkjCfaO3FjO%E}~<-F?`3D4$II59keNY57E7 z?1V@71kUF)O=cC-w}g9UJsR%$8UqPP0+G6ZJO6iZ?%*XG8}9e3}3OeRPM)b3VLVixKl6=aVIUcaUZ2vB)-sa&xRud z%mJ5xOF<^M49s=7*G47tCHjMKT%xI$uGZA~pGeAYzB%Z;c`pe{k)>;dTE*WgTkAr2 z7FnLV=uI{7mZ0;3^>Pddv0$~Nwu0gjdaEzMUZi5J=E;*G6Mi*3*H|7MPXYWUo;VcY zG4b?4-Mm+_ieizjMW(6OLXiiq1J{EkARpWSZgi*dM%~I>6-rom_+#%|m2hu~S|4k$*IV_{O5^=K%di}e`nim6EE zdeh9+SQmmdU@cIf2s{iPaYc8FZr>KHLvd{-XcJcsWFlK1({ZI2NL)|A@T5Dgc53n6 zHc@^wLy7XEKUhasO0h`T1{2*=aBKumgJ-}dPz;_0&z;J>4HC0u&v;yO$3G&&`22gA zIW)H)PLb3n4EOVJYz8lY7r{$l3wRm4V!6{-GV81GdxPFgoq!@poCNey>nR?phxQCO zMGBwP2?(x`1iS&!o0do>$aYFm5w0%0FX;R@+)?bHGn3rU6q^yg0UD92r%b5ZVcG%S z0&jzzpcK3V-mUGyq#+685ckmgEq67=BJocf?p<({f%m}sU^gfSAAk?t+{_e^I5WjY z%`KBBGsOdN>og?6DU$n)PD2dIYa9LlDVAa?Qo2b~WIrSn zUqbPfrI0Q$qcIwtP-nD9({#ojibbNI)f8J-3B~tN{9q}hGuTS7aJG_SS99i}Z<^B; z0+Gz;G?Bkhh<=9X7l&vqGn}(wpz4HjiEc*@HX>V|*S0g(i0yG~|FpJxvdf0k#1M%h z3}&)xg1U)e2gM?hFPO%x6&`OQj{zn+S9puiH9rTDwmB3;oJvP?H zAuZNnpgsr(4L}5F2pT!8Yn3J4f;DkfH%z9h-=O#mO_~dtNXbivv@yn!pb2OSe83Ny zf##M}H#xV+HaQC0P?K9eY)5Dr#Uc?e8|oHNM1hu|6=)5jK^xH4X2EP<+aWOnD}9UR zmPz0u9dHzEB4b}MtnILl0qsEt&=JIfPN1`!wXF(&H0Vv&oBujUh*%D5;#48UeKq$q zI7ODdYPh?=(G_$9-NEUg2j~fUxw+e^QR{5Pm5{(~4oLPNXjNTdO}#vf@R#PEWN16&@5ZA;K)<6$d7)=7LbRvNY)#so#P>x z049R7!6c9hCW9$%;^~_5Am%o(L3|foD086_$$ZmLPQ`Q@I0u{y&I4)Sd@$Wj*%Z>lNUB@BnxatOO5%RUy{r zgWkFNO=qQ;^F|c4@EQ4q*tL|$>w7Gj(21n&@~e9`%Q@U55IkxKI;xHoou}`&R-qVn zxx6ufd8^FCunyJr;4$zx*Z`gYPlBfsoj1|=xAJ{0)g7YF>NozIH~tsw(ydH=A?UqW zzX2@)PSu|JE^0r8P4w6=q)=qVdpd8iFG=2>gZ+6M;N9uTv}f9jHhUg4$zJt2avD=X zv6+pFC>B}vKHo~ielvIhya-+bTfocU74WL%_H|4q@{4dfR;M5aW1E6$yG;tVV(=Px z9c%+7;0^F5*zQh2xVm+V++N-EU9xkvrUW`d&7=4t{koI%-Kvrgef7!l4jhQAC?{gI z`(-&feizbRHoBPo1XP2c!7t#~Q@K||Vz|d*9OCY{&2k^4Sft_;lf|QO{04ppe}H4)IQSEs zu-pps^K|AiFteH4_^EDZ!5h-fddxhh4RtoblDFg(V?9<~b)Qacs&Cr*F)-b|hN?JM zclT2ENm-}VkJkcQ5duYtw3uK4cdUV zpxvnrUxkNU{j6OY#?oSS4@G^{b#HT6p$Cv>F9YaH9LA|b6h`QN&!SLd!ambCF;KS$ z9Y9AA3p#<$po@*&N3Ji>eX|F18+F(HI%)o$($-$+_jZS9E`GwCRxcz`BKgFqzn z8%1>g#|lP+V>)WR$c~L8dx$ zu6YOxC}i$4y}JTak&5s1VRqpML4Nt-$lzpef=);ul{zHZd2>`WDhZdaMPtf1IcTcl z^VtdV8sq*0W-VSkXHm|~Ig1v_cT~;S?vf7j_7vuQk!h??Vwpp5R{)U--VKQ9M%Twir&4utPe^;*TZDoxyAyQSXeN}%hzBc0PX&alIkeZn<5gi(4PID8{ z95zhYt0|Uy5pw@QZidJWl3n06@b7ZD!C~suMhFInXaAyevXO|}hHu923)XMy6C-#z zYSaC4$~v9u1f8ElKiA|Z^;aEpDk^Qmw_^L6&5zr*^*;8(IzJom70S-^04 z)vsnfC%>fPhpYPlX;lT}A}5cE6OJ6=-v&y+8{kc_9qa&a*_h3xj7^Z3sdxg$p^T+| zVNc#8ely&uzZ>qi;n)dE!8_nxunUxd_bhkNn=IEe4}`8~LIQU=#r@Rd6c5pH&wx{; z=nupFJ{-G2Irsp42tERPz{d`^*!hcklvs^2M2(9|2D6ghOvP=5l&r=S9S z20jOS!9K9xhHb8Atozb(2Qdz%B={96(Oc^=ibazC6mC`dwe)EfMBi8?&f)ko6_>FKKg6k*CB^TaeRIn=O{9f-qEC|X>AypKcDWnhr zk?ND0sPJ1MIttNmHgS3iQ8+NaPn(2dh$jX05jt@vDHa*~w@KXZQ2YUof#cv$Z~~kJ zf7uu-F~3Fcj#vKWVlDj6vQC3dr05^R`Zw190M9Uw#|!F#(?A%gKg_x0Xh!JNgLZ^g zLlWwaqZB*$yWkY5<~2w%`orO903tv`&Br1ez4pp^{bV* zJzdXmH-*Co{Gb_V4qAXH(9&|7xc`8}+^$*Sb#brwk*P#ydIFpxOHVW0t>9=4qCp$b z7PJE~p#7=bqYl|~fJ#V0aaT}m_V)#Fij;*3x5_>&qoFHA-P}YmYUxil0kLR0M16Ge z04~tzAzDF=NKCkivpY1WgC3wK=mmO%IMBz^%ZO;N799zCd2<5yO#185kyT$iF=IEI zN;Bqqz$}v6zg%91n8oI7aoTwwuKcIEdd|Kz@&6a{+lNlp^I3 zhI%j*LqH-J3WkBV zV04K4gzU*bh2$!olAMMn?mzWCj$eb`(Rz+af>UHgW8qf8-=qU4Ks3>|UvJK%j@r$+ z5(8p1sXa)sIU*>+UZg0pnVcE@%;|;UHNDl!Rv3<*Jl|?s}iOk%F?V z%XcIyc1wI*Q!pA>%l;9L;f>A_Y^Cq9{!<;cuZ>3dPM1#acZ8CjDgxz#$AmtvO1u z*|s)fFLJV_@NknEid(@la2vQC+yRz@J8g6Ycr!P9#$qN-)Awa2|HEdbql;)|Sf{lX z)-@+NVF_OW!~K>)ch{PTWT&^*q3;COXU!AIPG_ZKEwUk6w=uPz&=f+m#?r`vgxRqi zLl*`)gt%mY>^V1MByzHiY1mrq6et1@gGa!lU>#U*`OGLP#*rCC6EL=MsmZ6=z#`f@ z&1)yzYwJr~8{v7{;W4>CEiBpDmlmP#(D0N8#U}UZn2VIgG~>1c_m-j91d744;5qO- z*bH8Z5ob#<|bD2Tqab4yO4p!toN=0$v8MfLFm*@Y*S1 z?}Wn~0%Wvzg`L&FhTRoPk?f9!`gJI_ffDcrcoS>~JHT5uZ0V^O)iu=PC6GA%)knQW z@lf4sd2ou9#v1Oo;n)dE!8_nxunUxd_iWgDs?TKz&evN^6t+;yn4GIe;~ok`Vmb?{ zDrqeJwFiceZFDB7A2mvLcFEbDG=(`m$VT5>z~}*iNM;vJIS`0!?P{9&1sn%JCHNA21-=GV;2XG^3p7UpMB(z_WVG|l|f6;qL%(=|m*God&N#c!6v?@xBl zq)O2ZMNvwzi6S3UksUoWMRs$cI0?mHmLeTib21i3LkQ_J zgrqctur!2z3_}RRFoZCK5dEL;^FC+$?i-fJ|Pomas@f^rRHuf^!4Q#=*re1S@&!W9En19>aDR#)9_X2(N;5 z;Mfs#0-Zq@&=qt8-G_KNpAKU={8C8c%-82GghFW3Ij#lX5>lG(wT&Wz*|gb&QlwK{ zGw(g|s9xV8_U$%taIp6!QBOBh(|LW=HNz3_U1c^f$?Ah$N;B+iD1%E)Xls**i=%lOJJ&%Kr`=~$5{X|$;^OW zWb^hbOuppf-}G@kO^jkIbiM( zzm2wFuQ@~=y$0=4>_%HYUf^m{Y_i>G>jbCQm{^^?*HJbyKCeM3k~L6$o(J)Ka3(kl zWPt_XY;cbAS$3eev!3<&EUDrq;nzZTy(U* zlZ|&V#B|2@u!)o>YW=N( z@N#ekxDu=eSAna+HO{?u6Jy8-NE2!Cl~PaL>_> zj~gHz;Bt(emphWQC^uqoFSrlf4>o}Zz-I8^(T+!ZEAUpkg;*%8`*Tdq?M^Ztck;4( zBnLGyrQ1vX=bcE3Dc!`LQYeqW{it(NTm4*0w7r&SD`Jbc1(-T-OEG6~Q%J1n;HNNu zy0&W(OZLq8Pfl1& zF^zjY7S5afSm8}+Z?SqAt5=*ix-)nkblSMniAfQK5mOuY!8C6LC%OodIYPadH&W}O z6slLjYv6TI2HpT~g14Mwi~Gu!L8}z{PTt#>g4zR()I+lD0&VK!*mGbNDHx^fdtrGS zyaV0^`@nnPeei)}mu-wZ(>M=e4y$Zn=r&i3S4Cj7xggiWDN;0Axy#}B5PSqa1{L5F z@G1DLn%nP=b-;S^!^%#sYs`B>gHjr z{{(-5Bfyu)`XQ(Xj!U$g#@amge}J2fOzT(;OLa+P4REa^4pNca@j5-L56ST$7&HJO z-~`YRG;-v!U3HIX9osS2Evl2e%`bAt%8P?cGM*2i{~HZ;z5VdSy}>?tb3)#hkhdp} zKVRRVh~fAjc=CMyME}9C+D`1<`yu}JQc9T_S_Pq$Mq|(fGzDRx83<40Qw0&On1(0H zFmKc2)PcQ3%O;pgC?TMSH+VRksR{ZRQZ~dQxu-PqJuV-2fUG%a0a}76&AGy_z(lOk>Z7S!C5j%|Z-JZ9rSl4#a}?pabaWp8~fZI+?!m#T@Bn z4#Gn_68fY_b-n;fk#&>Ac`s(DwDBJB^z`S^Wup4TvEJz;vl~%}Y?-Wn^}_B%&>Qpt zaUdS_1^pbK-qZ7ErEvSrAvwJfML~gUdS|aft#|evs6{HLNE7$6DRy?`p&Rl~be+Aj z_9;PAOmW6x#nM9!X}1LZ|9Djdh#a1(jwix66bu8yK@vy?DIoRlQYyg_bvz4-YR8k3 zoZ}(WG=+re#_{50aeORvC;tS354G&haGZMAA-G$J1dP2gZX5AOoBNCW1*W zr9NdciVCGA=)XJN0SPY0rpqWQXGt>uOY*9ZU8kJ^v&i(*G=<49O#xHEG%y{U3Qhy3 zyA+PVt!-pC=5Xhya^aY^I}aX_oYR$W26i*S8DJL31hc^$FxTuvab%RED8N)?-AqFfO8`T0 zD3(=IoF&CH3+`#AQH2l_qLQrSpmyHJsJohcZbU7zE8j(YDj2A0to(#U>xWjR1LoR__ z8*(-=DJW^k>PG#!N)a;8P!x<4io2n>$5H5GA_awVuP?_=p9flw9Yk@&*C}@-1R^o> zwKg}xaWA+J+z&Q^2f$|VpySrs`~(s$q&1MhTE>8=jW>HdV-M3(y1^+DccyZ0fnzIp z2y6pI;9>9xc(gY6&yXm0Atcq@=hBSyKOiQ;DUx=UDS*-pDS)RSdfJ~zuZZo$wG=(Q zZ^!Xil6_Jn17ndHS?XXh_B+8dU>7I>&w}T`^N!a%b-Lj`nE>@Zg*6aU$$MZT34Qdm z5Va27vmh2(zCaS#FiD(z8M0R#ncO3^KdB@t4AO<`V?3*{5h*y^+)n0Gpi zB3VmK4^~AW&vHW3=xCa*X2>>J2j^uN(yk^Z9zK_3)+JYprb#xHh@l;Q4Te%UHZrC?PU)k zB4y{P)14sb47z}>pd088dVrq(#67$<<5O(oOv1R@>E@Zv>2lN}`_EVIUT~ZUdV@Y7 z4#b1Lpr7NG9zwg9$(X?!H-{_hBxwrfes~bANXP|R5(yah2Lr%KU?3O-27@8~q^YK1 z=nXe#xhW5!9&4_qNZ3R=T_~=4MRTQvr9hGDPr)84dA1Y30!*xXeav#Ijs)Uh5J|eo zFqO^|rm--c?3iQ?Aj&&J68fn17Azpr$G9&eejnpfIs_t_D-6+r`9d@iqDhX(OOVG^ zGahBSqmH=+3oNS%-zB)ExrOL_B^x@C+>5nRCc`)dOa;@xbZ{y-4V>;$(wlqYneOJk z9}-f?|3q5plc+lzm-FEiS+&x*9Lg|^CqW^aTTR4(&5rqq3xy2TdU+4NNFJ&$_X5mC z*5w(R*abp!HZ({%SXTrd4n7`=I#xpqQ`Zz=U^--tqFOTOkc8;*rw5m*dzz!I<& zEUV3(Pog^hh{4!7y5VeG=_|vs9cV>LE>Y@SD9#1vf%Cy~Z~?dwT;!-_;@Zkv1&Pj2 z;xHC!)G=QDbCT^NccrLB$}Uyz6>wY(R)Rc`4=w?hg3BED_1WA!y;~reZVDp_W4L92 z6XO*W%P983dua+StFNSTVu(~;W{Np`p%nAga9-ojskJqkIMr<3h^bS+D%2u}RvC)? zMM7~S6gN2v?ca;Buv0Q(LKI6(t)u#vD@E89n%T8j-wbX6w}N%xHgG$*!?CvGZrjuQ z<{fVG+R?9o1zMd=784roow=CH%+ys3)FQE0Y7*w9w-ENfxE#yE(vM!(cV{( z=zMi8B&1MsIlY_io|q=z3r>+f&0@GIT5ZDHaz{B7X@Tf~c#igR zY1uOI^eK3rc04s#Ii50|u$xENL05CFhkAEntM~lrkcrH=M*S^@Zzp&L>;fg=S@0Zq zzB(OdkgdGfT<35pB&4AGUxlc3eJ%@5k(@Qky&H}fz>DA|um}7PybNABn!A}U;+l)0 z0;*amG}BqNslpZTi>$iV6in#(QZR2q`c^gRdDXoZaUs%POIA~(4MhQ_BI~X*6fqJI z{5}*PI0~Jl&4gR$2qDB2A{073+K57A)AfcT?gF9s6pGIrg;aAlPgZvA$d;H;NImPN zv>k;=ae)?CCDxyVFTj^zKlloK4Zd-#dV%JXoL->4Ford0rF88<7rM#I9@HXxZ!qp< zUL@}Q2+>cDNN;O5VWGFRBw|9Ox3!kU?_*kc1!|E4H>#5d;rJQ+0)7RDz;EDp@Q33z zE!-=DM4g<0vCVpn7q`MS@k6LZ>aR89#5EU-ll6u%+#F_yn>9pT{D%WKnc;w5F+$h5 zX8s)pmq^sjCgX*a3u8|>8#zub!EzE)=T>83OHk{j6Q&|@w`i6_v2F~SfTkb}Gy~xv z!m;X7TouXbOldtNuxbyNo9D8e2&YKet;W65d~q)tqSlV+d*a$jC2^}uZ8b5qW5~c% zWcoToQGSU~bbz9xqtM3Nh5&86d$52gAB8S9&cjq>-ff!0PFQyaT|igR4Ri-RKu^ai zNwYrStE}$7) zg{8=vJ4^<{=)zg3gkp%J&>M3G+**Z)v4BW#%w?#%7+2OoAhK?~A&R*|h*BU*bwo9H zjZkkP>1Y=kN_?S1VJ~(RBAf0sL~&ON(O8I1t|p?7?BQKZ3Q7@0OekcP&0g#%M2a^E z1>HK<~u}brIYg)2`ryWTzDB#xRCt1PMk?bDSB6~e^HO;t6oIDM> z)BlOie@!b1tLil^A@y6+svt~cf1$~K&eg&^2j;m)Gi!^RPE6~fX8#}xBX{dGU>?@< z!I|JJkOdZiv%xt>vv&5o`m^t<_B8pVcp;SmUMR#Ok@sl%W<#_PECP!`4p;(~f@LlN zxlr_4TZK6eXIxveoF5C5NVkoqJhu=O9eg3?7di9S*SMCvmbjFjm}`qkz({1^y{5>D z8T7Kii1B64Skmt5Hzpow?tGiD!;ehjD^VH*BI)-TFG{bM$BwS~JCay}bO^iy8@v&c zq-MGxI3075jrTY67TmzSBKRhpS?hT8#n~nW$w6DpGeYOzug?gTVz!>&-d)(V_r52> zT=V{L5lWHB2Z-psdm{_D_0}KFmg}`8DAH_2XKkv*HH(0`<`xqRhsc`E&3t#_)dt{! zLU0$j8{7jnf_q&Wa{CJQTHTZ!bc5N<-v^1?kY4|wwt@RFxF2i+4}i_!L9hjE9j4E< zY*?Ed^ptr$c{j<+R{3dOGg#Yrcic>0?mbeR6qI1zm)r!aU(j6hwYAJG|9{(i^5T)a zWF&HMt7hRLT-^qWz{B7X@F>_m%y*pcF;^JdZsnPk+WS-UAfO?|t*dF!zK67&L$;Zw zw1yzwKZ0zhKaY0Jxx}RjiMie~A~6z)DN@It!EP5Q0ndWx!1G`?c){`c?@v`gWpB7p z;hNqWGjDUSpdCG4W_e!CA^`Gecw|NS&uHNPm(r%I3@-v|m$$G?GiB)$9 z?Otf#cC@lX(%l=s-d#TXu)x0pVru7=i>b(pM>X&7VEr!G2i^nkgAYJC_|UP|^xcgO zx31zIfC_HuyL))Akz|ayQ>}(sWbJlSH8C5+$x7%x|0lXAzaG(tmF>Hgv}Mb9VUvEb zkT8)=kD2WE@`U*S%-=d@>4>^`jSJ;#1oV3 zcwQ93pZ|`qfb_Ie>PCFqMJl1rNcNx>DSblA_7|9b1&6?I;CJu`I1K)DDd-SRb{@1v zC1Nb4dN-}LdRby0N|F6LjH5XO@;E8~JNfwGwH7mlrq(KC1_n}`7}%Q^3X#K4s*k~t zGyoys1keyP0->O>BiH(W781QBW@C(xGH7k%CEr7_n$9oeDdi4(TDhCR(G-M%W*{6y zfJo5XalgJXnYU%lezaXf%7;d(>t2>8YnBXRAQkCWY>J?W(CFY8nA-R==@q}0xKcmF z(cOUrj6{-lnwC>~pBQ(-xU(~swZB%fPoYEJEg0ZK%??GlC$BGS3r~kdWco9Pt%3#9 z=-^(ko#@zPX*JqwLx3H%Vga2jf~rIFFcrz!Whf4B5{d*U`a25akQYaQdQ^^u^{9_7 zTGf=z3Rpx6N(@`;1n=!K-J>*(nida3)^JAKho&+i63P9aIJx0b;adUU z#g0!_l%u`)N0NhPo6%!A26(4)_$N^7(sVxdB5PkZnT_2pM5`dW+@DC7rnRaMV^K{c zOVUbI2!Y6!R}4|yV?wkBqH7(I&dhR1!M1B+LR9dn^m;#_?reI!9jHZ0N`;88)WdN- zC;&Hr8^KLrEx6fn+tCDx>ebx~W4Lu3QU7r_jwnSfviDWv4@@(tHb^@ z;y|J6LxYDi>lxrSu__1>Iq;ggxB&(a6oR|J-QXUu5!~yT<>8H9-Y$~VsoHdm;m=Q{ z1dY0Zw{k#=eT?@Ifg&Mgn!f(2MqmtYq0bpjp-fylr&4N=L{LR1XVPDi9S;KNvG zHE+TKqD*3Hhm(e>Ncvlvw`Z{41xmoP;5qO-*bQEAthy#1UhLMyiy?tk*Lh@3To)Rr z!zq%vSGiw=<0Y^M{13bgUIC@xRe$cTUREFWgWN-C&{VU_8hI1%eCnokgc&zwLoSm0 zwkdWZ!!x>zU6> z)(=ATvm?qQt`0xahy#UQ%rV5&x~@bma^QV+?-#6p1&6?I;CJu`I1K)DtXeZgkZ8@! zz!+}3Uda7ixeuWh2`N|Zzu-6mST1c(I9 zt8@B4>G&%k9$=>Ft1))d^xYq8xwpWeC5Qs8Ks0C#VnCauTCbn1d|7r!g|2~DuqQca zqM5nJL8LSHX9?+ILi|50R`#)%fgk$7OhSd$PW?~Jv+hYSGOQ)3&i+2@r_a_B*Lhn; ze7RM1A!=994Ri-RKu^#MoOrai`suSojB7k>=Ux1YE@CBLa1D34noJic?D4z^kO^I zd0s&LOHI?9OdPJ77~<#$qkNStfVAVZUrX~P7HO$D=tQzUH-raX6T&nIM>uD6mnx0` zebB5N3)5G)m4#ePMRLE;0v?I=C@>m~0b{|*ARUbJXYJxWo$1C<`yqid{NJ%@&L}E&Q6J?h(jQCwlBix5tr2HE# z#YJ!|2035}SPGVbTyU=A)=sz(66H?E819@3$$6i*-J@gsQHxX^Q10{KI3Fwr7k~@F zMPLQExHk88NR&GhW4N`0Phgu_JNUz>MWVh_?v-%lfqZZYxD;FlR)NbMw|tgN-?q;E z*03hMOERV$I>957@xAh0f!&p0HMj~~4Xy!ez_pIAY3~$XnaqPE*gL%}IY^($DuPNs zcGlW^f*2i43|$hL0lmnKDs5NSL3ceU05^ae!A)Q-xVbtRJ`BfqFyBiKnrv2ED) zu;v3H*a*SBjzCtFgT1e?(f?+)2@5_Ykwi>={HhbCB9T97Vcv)J{a_P#0Bi;if-PXH zW7R#V4tZ-|`g3&g!a#kQhp9-`Z-(LklRbvGP<-ep zw4>=ofL^fsuz*6Qg-Vf&sYvGUra`U$OeiX$_}o!w$Jw2LDP|uRFzs8rh ziA3uErCrJ|c>8OT&l~e)a!|A2!<_x;eAjY5Z@;wtvY!}2m>X2VpEaeu4-%SxF;Q4h zO=fVMT}uWz#)anU_t2Q1#W9cTMKApzvnG-o3xg zbtxK=lH;|Id&AoY#DRFw7xV)Opuh9aE&$<(T>!$ELbeM)-&apNQHyL3HkDsR0E1kJ zhB~4=R64>>BaX{xegpMo7*U6VB#;bJKq^QBBWmZpcNKXzbC3fN=?K5c53--oZbyVLsUjtjk`UwJVFFm#g?^m#P;Z~l|0uhzmvv-O$y7@Q@twB?Czxu< z<`U&APS{SV?b={$bImn!2rE-9@u&uPRs8K?d|H2k7mK;xkLx#7pUOGPE7en>oCcI;B0UX z$Oa2t7IyvYK8>&nGw1Z4#_IGUqAmtGU3h5^=@{aNF{glGEjz_50;NG6`n;3)fGO_ z^d5TYgoc}{?rT0Qk_)5A+K6!P)x)&A;5%_MXV=^U{_eeBli`-?{QWq&2|NHcg9pJDuoXN6#!t%aH)~d3Z|sCYJZ5f|7Vq4b z64cD^3DKMursDPa&FMiBXkOLUL2f7si9|-3s#{NZbns&^KVDtNBN)dDsgC7VVL&^o zq0`A%EcPP3TB+ktK(PZn37!H^gJQ4~JmaXfhd)4?+QYAdq`HUCsh46Wb_3xQ86B?AE3b z4)dYu=-^jjd(E-Q=9rEj_YxN#-4-iCt)E?7j;TmyjJa@1j~9x!p?JqpXj>gbfL;KH zu#mRu#iQypK#b)I%!WWDu8sC;@4~SUya(O~AAoZ3A^6B~zaE@I^|#`0e{*r|fy8hJ zq3V#J%!x3H9Jb6K!%zV}0iS};KqdGbeBsZ0vf*5dSv6;rH>?4}UDNJE+Wxn8?;d=S zQSINgfBzN9z-7&V;mIEXBd8Q47!c79%{XmMiZ0qG7)udR>`@@!S;qB zzmYKf3BzBGLEkAU!a`U1XAl!lbO-Px;_JqpuY(eWbu>ilLxt%06uxheVh7gxIPmLO z=;OdEu&5@QM0|Z5I0gcdgib=lfE|tyZ~|xu8i7#I7&LL*M^2Kf>i{JBp|o|7z+E_8 zzRsx&=Swwj{!b0n(OewnY*K_pz-un>gDA!=p7*bN z6mpHZYw5pUdx7zV%j$-i4UoWniP5u{&RaNpxr_9-afD>fP04N8Klna1==c+l962Io zv!$nYt0z$g1Hm9L7z_c4U?>>o%0{}?242_ZDM8KkAB>!2hP!ESxKTz8v zkOERc8W;garq~H{EKG|`XIcq`8U3_D)l)yzV@4J$;Pcv|Y-|4ch>ptkp%e-29WI}m zC}=6y^EjBtJ5O~9VpWTjpbcgm_uPr$#??5EJZzwg5E+&nd`1vuR-WGSG@-_1CK*5Au9)3Ahwo23CQ~!4=N?K5bL%KZ-es zx$`@5fGND#Sjp|R#J|otsq>`%Samj^keg(N)`cV~uAb(dNJv-jIzBF!Xy$mM2Y6+i z=yK6^Xhq6S(!T6^mS^4Z=Ygc*KKb8p@e?cI0g#YbnTE5l-fK_ z$3o@kL_!7$y;ne3bnu;UZSd#1Rd>b)R@>`+Iuaw1w86%>tfLs;i}8KVSRM@FpVz>u z8#rsQz=ix&*=bo#d|epGfIwu`5JME!S%|hm^iXZ0*iMe96pL!2J*bta00NQqiCP(5 zgy=Dd9(P2#B%4VJI`#-9rnKZl@u&i|b_|ysc7P|rQ{ZV(40eKN9Jh{Z za!6FUV=y*XvV0t>3bo$ucAyq18K&I3;3xslg6F{VU^jRHyy&=VmXe#8PbS(o3gh6A zBv?`IVcz%CcL_^TigkmxQ{%wwrT531c0WwegyFPqE*J zC`T)DAjuT*iXKwLZ^QGB#ytt}h-9QG-fo32aM1V-p9JFvw>xg<)UpJzT!{e+||Ys@%d^|mn0j}AT&ir$W57jczh z6>*`^*?cB3^-ArAsYv2@b*vB8aUdS_1^qw*=nn=sR-IG*0g2A3HbGMDULKPool}j5 zQzUbOa-RgpKrjdl217t17z&0tZkbc%nJZ#9=CJB)YU4mWKGQ54z$TMrndb(6NY3eH zd>$Akp6tj_Pll6X5=aIqAQhy65n!bAL?06_8Ir==fy4M4>^=0jd&NH%B3qi{%`kK~ z3XzIaOjYC%pMfiM;~ibzV3)Bp;@FH0FwEMeA3!Zqf08;m0qYEK3YZ8cfyrPBnCe(- zoYZMz_QYz(61>bryfE&C!70*fvT?6?sJJ&1qB9(kxYy5E=%)f%5Q#*%jw6U}6EH;U!H z3#uEl`(I6g4cDzAxyJ3{{aqt>amCw#r>VDjc$E(>0hfZyQhkkltN3v_xWc(xQ(-N= zooO-~ly_$IgBFFS8rL&ZS$i<`p9Zx^=IN$ntBB8#7`p2m-4Wv2%b2*fTKXGio$X{} zDzavVdU-w81>gp7Be)5y1vi6R9IO6oz2PHL?APNDK;mwiucOtQ<~k@vcFa`jTcKD7 zZUeW2JHUEyC)nVq<@v`}UhYVDcZkJUstbj#x9mnCQgMc|dRP~NyTIMx9OpMN1R+Kv7XpcV1o56!%3)l)Ca;#0$Q`kN$g+zy;IkOCR z+!*I;By1wxW-IG9tc$?I;1TdB*bW{8k2}`aF}JVGV2-akh|eC&*xOvD39yNbo};W! zV7&u837!H^gJQ4~JX6hT%C-KCfjb9zOS^CzbSEj2UjG~(zC`!2XT`tMDfVPgg1o&rRv!ufh*q3|bEfg{YhJxl`SoFA+|Wj77@b0FDrF0%!;t zfl$yGG;!S8nlew7_2P`_DLevf-hI>i*>)I7sEkl{4X05Krj5=Z0g)ApO#y`w939*o z))q&zhIomvs^1mZS-MVM?CHF$VMtrFh=)vSVKsyzn{o_s;%P$M2I96y6Ki7#C8nj+ z*03Fg$lfJd2<@8ky$&ACJq#K98JtVy05b=+${OZBk1xty4+di5tIr1Ud-_e z9$DW>*jpSQ;3#1d&ppa6cVw}3da-v~HR9TeTrG}1cohfYL0`}>jXQAyKl+0K&fV`9 z$*w}&%oO|od&=?7-Q;$m9b&S*8cvao=bCKC@vYqG;Gysgb3D2AO)m?G%x~;blmod6%y6P)eB>|^`ekZ^Vau5GMTX(S4#;L zDL>!1nmt=w9S7ZbN0&!jt)VpHK%|qhSYqmy(|*)OE-(}YbA)0F6jL3A&hCn_(1CE) zazCOp;_G}T6atY>7iw;&!7&}23Qhy3gBf5ZIKy%4*q{OuVGe0KI^Uuz*NE>0W?ZmjtInAd{5YIXI8Nyfb%|^{ah;>L z5>Y$COe{t6uQUvyOJpr6m8V47c>X0jDJR7~DZC$pfFk{Xz}Dt5oHekB)W0cw*NISV zZP@voQCw|cAy@M3w>W`y6s{`bo(Ikc z4LCm@i0rp=my0o({~0&9(JD=#UJcM=Rke_{(mD90H<jGa$()Abs&!lNO(u zE4#nG`lKWt+zZ=%!p!gcIf`r=80I@bGup)Y16EgQb(=YV(CT6aX}m3*Z?(GVR`(F+ z+fv#B@I>Er#OGw z>JFKBJU?8FVy9KEvJs!*e3#WFTEY^}pS8NGL?wKV^XILu*xK&q`~|DqeS5g?MSi~o z_JIF^@$vEUPuG{8yC`?TLeIO5o~5(2gWHHJ)sxGy7>I=45$<~#n^!=ocZ9e-yGWc$ z!qawWoC4y!O89Hwb&$`#bJ-|w$&x|5TfcHuN>H3JNg!IuiF)ZKtPl6SLDVs>{6gY=#JR-(I6z-v^`CGQ3E2?ti=zpC%K2xl_)`f!2Va0M z!G7?Sy9$QlWoK{U>Xe}KyeFdzg{%iyZdCea*<| z*U)_f4uEgLci?+a1%5a>nXM*)GK{6B4ncO%GYLG>SE@OrP}!&79q#K&E`EgNCvXt_ z41NK>fV)@+pIk^iKFB&145Fh3d zwwI&Ga(degG<~P?yHBvaiBgp9t491AOxHM8iGdNwzaYVKH=Jw zpol#2Jrc{3$HRU5XYo(9{IHSy%Xti*IR8Uo5dRxx(X*k1c(I9K?~3lM1fYL?LYThc|E@G8hu?#Pf%jm6+Xt$I%5r!1 z#@&z-^oIG@_Mw}?y@x5$mR{nG3=z$}>cj^$)gq2kCmn!)opj{96X*=IPQJfIhH%9& zgqxaOjiuCyNaSW^=@P)wm2;`tZZ$0HgeCSS$8x}rWrbzw9>CIr^PZqrHOn?nSXRN( z!uXPbrSqlIvYZ&e(wp->Ag+eRw6bqtX*ot(*$&I%T3CJCx+I6wAJiPi2e9_#ydOxY z#TxC+hr5}MOR#jl6t*22ZBMM<_hR(?AQ9)$8J$C1`}@xaQ2D(9twtm z8vAJP#GCPAis^y;SX}-BkCM+qo5FCI{M$nk=Teh3`PBBXg%rZaNeauclzjSKJLVda zQWWX7ReetmU`{!TS+4$;UI*G+CsP7dmRVTVS(elQmb9Z-@~}V2*w4ep)xcqEKO(?> zBO`Oc{bWppTqP=r(b?qSuOXp3gWf_Ns ze`$~Bd;-V->dh|fwLNU~vya=RUYrtOKaul*+A`N&B7eh&N}fWn6ffpVW{`E3X;J{w zWX`96si3B1wemI!lPTRC%Oos^Ez7h3mg$_I3QntL`5t@C&t5hgLIG+j5 zsIfP_QTAKl2Qq1IhHkebLqO_+d z?+;RJeX69m$EGMOPFxG|KT6p0hc#bwVVehBYnjjQGr?IvOLy_@tQ;>8{>j)#j-s%4 z_qHtJ$-Qj>M-l&Y+;7o`KBDQJO+5d0bq?p*pr&;mA-$fbNP3kvy&&vK!Y5B`%l)$f zVEkibjpbbk$0FeJv6$aEUSPkXA&^^T<%md=+QmSqJo{Y&a%&R2pO zUvy0JJS-8W#T8f<>F=bKx$<}CQeaN!j-ngAUH#63Js-H-U&8N8!DV0-aHF6}ce)f~ zu@t{UV38KFuD#9;ALaMuSctfk+);GHP9$3Kr(a=sc|1+><*yemmDe1x=#BAcRP zlYEMdeoXUlHI~-^mxnd{z7_G;Y68|9}Gwt~}v2Bdbw7tKWZ^!m^^Jz)u@H64Qo_09s`eqC&t)`MjPDz*=*xpjhPhnUP+nXUSonrcGAgP$S%!7CCAU{(s#h| zBzOuuJ;qGlqP&9bgSf?&FojDotF*a9E;-RFd2A3Lzmb_;GjGHLOr-M)N?4u1awm8O z990mswq58;K&_RI`F+n`)-QR^GTZ2u!*kd+y8V{(*}6Hspe^#!z+dBn-&vh1#t<$LVA8vA$r>@%Lz zT)a@H{e%ZyE(T!Za6lowEWhxxpJDCy)M+nu z(ZX9uy*3^$jd&QAE-%HF<$rat5S}w{p10&>S%Y|0xJd9zNM;nF!IEnZel^OPS=ua`7eZ`Do1b)ls! zMB+|3wk}tzEYIF!<)M@v&)I%F<(B8|W96Zg9nW)qJPCU=U+>h(qpgQlSY1BR*t&eJ zu{`hA$z!h4QR5fqR$moM{do3Uo_%%k5H3B(DLWXadWRoQ32JD1j#59ar2lE&-m8nt zld8A(6>MCd)>-@a>$JbM+CI}AxiICQ|Uc)hl>>Ck==167N1|u^PC?~!mFCE$~t-EF5WVE#FBGoOU|UiqOo=P zDzH4C9}`cDktdB>I)8TV{H4`SE%hTiXvw~)lS~F!Exo@UcUuy#`LU$Grdj*4P8RL3 z(&sNT_g~3cUu<30wpgD1b@He;Pd$+m6c#TmSNpLX;0?V1v>ao(5m`&;b31K-za-`p#PrOOnVCEbtZc6R31 za1^NrgjJ5a(bWqPEz_;Ca9P;I%pu$a#YThy3SbN}$g;;T((2zd3z?@L%Bj z^_V!Ly`L$Z=7#yjI+(NG4EG&^^|xbUZtpFBn&*-Xa|)LK=5qz%zr*^+F)>Gb-@@F? zFh5fV^Ypi9lCb{yADBbDg~cgBCm8+#*#Dd7`w0IF?jy&@{~^q+4D&;EFi+o0%42z` z7aU9Tp1IR8_ZCa!pPKbP!t23$+%YnLSk3%U9n9Hpvr!N0@gNu+)!9^c8mZ5u1PwPA z;|Oe|U3cRc==D5w?qb}>Z&@E`P^Z`Cj^TYr3ObX2220m1&3K2kP8d$8lcmot9)vO; z_Qys%jN%yR;be5x9`ai}Y*;sU36EP3Gd+d$*AHXp987vwNg5p!Ngva1x5CER7xFt4 z+r|O*O*nUpc4iqx$3b4kUMA^j@gvgb#A(MR4y}MB^Bc{rZ=Vu2{SSnVlKjZZ{m9lp z76wtX0J89-yqoqc%Y7zyv#@cwi+L~H7eU;}0Q=@g*?)%pG-Ln0pZ#v^TM)NpfW7~c zrk2jK=Td^sGSy#*ja2^{%$_*I#U1B*c-K*(cojB2yAZ&0n}s?$|>2CKRr%rG2P$ z?dzg5i+(Mp4j4B(*9^afs0YSEl)Ut;aq{Gw92YDyZu<5U)&bIvbrFl7UWMGBz1=VJ zMBu41JbD~!X^uB@6!GunE6`Op$B)8&ok*ece@G?!C3a~}751T6{}X%l<9tNeM?5L> zF2|J0!{j2u`U();rC`ItXj=za7Uw z|EHsKrPHk<+}Dj1y4RJ88QwPcDoA0Nd8V<_rtr$&q~L>9QjiuBsS9EdvO%;?+)gna}7SBGThf6+X4T=t#>||&o%cBkb*Y&Dx1Q) zf0IHetggWq6CTOAh#V!glj=&%HF(?PcVj2r$w2G|jrILogEwxbj?A8&n>%0Dou!sH zVeV=<=5wVQT$c-;T{m2iJ>T61>S616R#~1Qb@J?bPYSN;HL7;Fj(^0b8Gc*`ELY-x z;L<12cl)uVeW5uUS|^LHolKm)=q$;ac+&%0m$O34GptUYJ6>n?&g`LF=4T)CWw>uR zwn=r_n@YC#Td!FeFa4UH^f$Pq>3+&l#J}lA!tI*w8h$5}MhZv;e>ba0Lx0q+VBaxk zx*Dy&DAbobUbkPfz6?Ku|2UzE%2CKifRX<~E)K@-*Mc8KynmmPHGPAPdD8>_0lzEo z)z*IWG1+(XJXmxCZ7!CMrP8vDsgvbn>^qvr1NK<^vDlmp(!n?|9!vlk;1npZWt9jerpT=S50`-*IMqU|9eXGi;Lfq@33{}uWr-*ND8jp@-54ZV`9(H$-ds(unaXffqk|q7ju-gXQ|aS ze$0}B_<43+%)}894q5L$hxnc8NB-_+k;5RHsJ)HBKI?jRT?rW1Pcq+$+JueEdd`nL z%)>j23$b4W7K0qH1S|#1K<-%cX4+6M=gZ+ir+d5KPYHT1LMC%B{-8Myfk^Ss;l7pp&I9=Zp8dLHta(7Fz1No) z4${4aAEg8>G`Ffs2;383A$w2oU5deFU=>J%%xlP#iTu6-+|BPRIf~@}67E~g@2kMo z;2N+7TnnxP*MkCZ1Go{~1ir+P{a`J>Zyw9Fc8hoV$8=V`rPM-iIl+`#62!}aNF_&k z)ah0X)`8o=?V1yP)aeB8a|qgWmtxsOWXVa!$n!E}H?7vQb{LBH>%E>8Y`>Ui-@<;a zd7GvizmFrqJBhc!n@gOztt!xYoEL(-z}?^;u+jUN@OFJo6%!}!NVxCDsSLu?f_xhv z;+?U9LB65ULB3|3uS*E>wZ5;Ouj=O@U(|hG+$X#nJn?Hzq|PD_Y28UqMdpsE@8c`1 zM*{WFRkAEicogx)Nhi+_)%a0|ydsEOM8^@Kz6<48I9MaZ9r7xOa9!S2UFsXAvH+%) z=q2SqeRNliUrv1K8J#pmFYyEQdn|t?@x@~&JC#50NMOLD)?j}?0-LNuf%*+LepNvH zn{50*{ac+i1BZ-5=AVqHPkRWE9B6>^lkcn81P%w};7yxApnjH(@B6KGjwjprwe*ty z{nn%U0S4=>LxKAJHhviK{pzeOIg$4BjPyFET;kB{5q z6MF38+hG+?+M`sBbd^tWUd&NCo2R|wzTlHnr;h!NTNOxrFUa@q4#M6F@}1PbzVD=4 z8u*gIOn(3PEnVuSAYY5`xKVNFF5mpX|uD>F$*`svEGkExFqdYfu#K!cpXU1 zhzvXu-okXZWhmbOZvx5XTVCt^RC&DIBU+L}A@*^U+=|Fiy6L^(ZQx3$^R7JX+Fg_P z=SkY#n%MlQ2#YZ7ZPjd!14N2jXy9_iIO-?^57w)dqbh6HiF>-qY4h53{Oa4P4@2)?a{X%@((;cXf)J!K zFpy&>dmhJ8it4-=)hBU&I_E_#B774$CLOZ+R<#p&tx_9lI(p+6aYdR1H0q32dFt`P zJ8HM;91P|CpsCtQjj{YGw1jusgo`+rOSFumIGXf8ZJr7n|0LU1syLT6<%?FwzV}+5 zpBmIOFN|~Hd3Px$pKGsDaY1CA>hpY;*$fq; zh$SGF|7hc$+-|Z85>a4IfP3F{-A+MyaLYUs&x`$OJcj_E#a6aMSV^{ z-Bj2JzArW5D$XN_m()(H;#FHhj<^85I6AiG>M}uvR)4YWe~LKwzZ$oU4a%#PqY`US zY&|XGoVPWqCBo{%Vzpa{v&S6)4&|VighEc%46No{9CY$%byeE(FCc=s3U04`6_r`T zjzLOP!MVALEYtdGB2`q`_}>TUeeKnOzmm0M4dZ-;)KPNR2p`q!i?jVtNgr)2&eKbK z*(yNa0cC!iw)R3>5}V?@iVIVNTI7}30B88(SWU^DR}d~m^1kibo!%F(Mfvq)&G|si z#j!+tl-ZMg6I+ED0#$yaPXyQX+gGaxPOa z(Z`MP3NI3mGsi^uX2Mu8Q5mlbXg%E~t0!j%=;P3fBX=cf4wE>4hV!Ip5qyAERvpv< zeyW_VJl~#BOP}Wpu>r@~tb}ncHybA_>}Amly(H-5cza>H^CTPoR(!1ld>QDa$V&qp z$}#EC@?-{TiVB4+W8}Tvw+K@ zjBv@wUz_2d=~y^cSi_+Ko%$i0Ku=qz)h3ymkW8b+fmqJ>a?F_<;k$z4OJlv*l~Tt^ zw(g3~(wyw(C;;*cy5NO%$FojGP?NBCNEd}o{L;}+KL5Zcu0!_)DI2vX*c z+8k%tb5urTH9``|L@$jmpQGH)2D{6M^ERBvE%K^Nkrpgg!uZ?OkT4^K=%s6FY+G{) z=R)k{9-G760s8s@msc6#lJolx)#k54Pe$^5j|3R_ax|eE0}Mi}{!qYeDh$1p$fW^1 zu{M5TfWDj6KWzAGs?--}1FrbIcBehi>VLPFR}$y`H}VVY;Lw#!KH=ifk2b#37g+uG z!?dF*HSk<+*h0|Rb`VJ@Xk*o~q)-#iIj{DZ>0^7hScl%%Zym7qQuBc0D6Fq2$v#|mC=C-Kg&`Xi#bClM;-IfqPjjTg2 zB~=yBcnkAvK*Ye>bzFpAa&kvNn<%jfoNW`R;9TDQ54%(oSYS&imh-mg*IE5@mcNj5 z`ERuOmuXexCD@Lk0>v@{iZ0hK?}~uBthiDWXl9F=s79*Li=!Pak5#jruJNz1gS8OO z{i~*}_8)n^FdMPj&=zSddjGLelr4$40HR3SMGizSMen4iZPaN2@mt%H$UuL*Z=Q?J zVw9co%nLAx3h2voZ200~T4nj1%Rs%v>Nf^VeacpQnXBaPRY3&F(RuE=y{h(bw6m?# z1oZxw)o<2;f$058hEl}MhiL#?|B_g72!a`W1aFCV=)Fv?y& zu8az7{J*S2g*KiGpBPY5MTE;R_~j_!_v>n_EYS~v*Ynky!~Fq7Vdy0%^=wDd&Bk*H zH)RD}9F9XT2|9UahhN4{Mw>wdiP*^ACa2qTXV56j7F~e;1=}HIqHhpX5$X-QA~mR! zDfGQ}MtHAnOy%i|k64!a7*v2yz^C9dFg{`SoMqYZeX|#zHEY2lUXxigJ3Bs(_f^O7 zj>_z_=EuiRSeDBRGz+ILm@n`3$kNxwJ0pC>FOb;q`uy{v`o4bjST``*pSx_{g2m@9 zpMK`Z`6JF6H9L7x&UwyvuX`lBxL({}sr-Z40{jd1Ht@GX)){=6UIhQMgzv6_FTj^z zKloeU`pz1~$IX+|XU!TvD?Yy8q}+M)moAkr4lY=9j`gn>d?AGq-U3z}`{zwdo;ZHY z_)&vnle4p9$!6?A&DpZpIrGn4ymWr76u{uYV-_vQT`)U)!G-f7>()JX!Lr!7v$M13 z&x@T+ob#71kY^!ca~H=>nw&Ob;>3p5yOXMumc_wCq#RZl;cG>%Y+ZX-U75;9;~wE} z+}W45RBa=UQb8;1`SJGH>~I5f6}|R{UNen2m$tQs^M)K7{NBLaq=Gn#Oh2f{xz>KM zJ)eDWSNiJIpc{_s^69c*-xG0>bzs+VYf^)%S~SktslC8Al>UJY_oN23(@(>q-aBJg zcNA9#fZQ=eM-?<2g!u4?fvjcyDS@Z*_%kzyjr#$ zNzgLd0XrWN^& z2LE))v?eSDv;n4v_A(x%eVSd7Lo`^^`@$uOx_gO#wxt0GYO<|aoXjOBmuy>j+X4Ud zV>x$MjQ<^?J^BuSe_x#^|Gzpue%7pIx$_pEn>**+Gsn#3X?#Q+8VI>KX)=*>dko{;O|r%=YAbilj@!+o`Aky)K>aR)3~xB z5l38U>?e_a#7O|IG(^{*^8vfEuxlMOXYyMSzLQW41YfsT@7ALm#Q9*W8^SRW3)TS67j|nXS|8W z!+{(#z$suN7z4(FlR-KV$--t5zb6ApdkV*?U>cYXPCeO6enf_qvpC5FB4IeZpUAU0 z7o#~G=Yn})J~$Jc1+sw18WLH+@3Vo#KZj#BSO^w@#XzKpcscxD0wms2j>|yq$v*Fy zM^l4N@Q%ZmxB=ys?|d8YpZG%FR=(vXp7$^mExbG^${Lrx9^tzH^@S4T%^;+8Z)tto z(J$vNE0SKOaW1mStl)StSPAk@_I7Sh4Qd;7rMDa7o`X#;L!TyzjXeSOvTYyac?A-|UIO zZ=f{5LqI1jQc^h^E@D5M`ybEjuHgV0?Y&2qT#gFVOY?av@ zR2UUcz0zP?K@1$tjyjanc+8*St zIL@9!MkxQT*Lh^n21}_JF;$|=Hv=>zTVS^WY7a;4*@pG)vU~^ZPC)J9BEAsQq)L{* z2fGW{4eSB-0{ejdK=oLhKp()u`@lgK^zFgX&qKY}CV^1HK1-0L}wH0v7-}W>fvY zVYvbL3Al(IdOQwe%^a6m-Co)=okDE)@;@fd{E~G;R+o{~1%)6|pdDc;(RsPrqs~Vj z1z1L9@@%2xWPtGt9Q+Dkx3wBQ8fuoDWP7m?&Q3x%Z5rw3pdRT)z*4f)Ev7Q5Tl*D! z;ijbzKy$+hYujK}y+6j$*{uDFox{Rlb_I@Sjv<$8AVHhgV%Tj2xbFi?iJC!uM0OA5 z`B5&uhH?sL<8T!y-L{TnYarOJa~ovb4g>*hfp$Q9AQ+$y2a)Z1pRRa(s$(2^{AX+5 zfS7WejAcsXkot^lE#>)9F7DZUjjy9XD;%Kqc3}wzXqalDHui36&IHt;CiuZpA_X-v zS(GPx?h=-}LM1{fb>m872NJjZ54iKc5m9t+jG_)vBzB^1j6fMhNvQ$L|XG1I7XIz<3}5m;g)!61jG}sr>z23clhG9JtQ} z7)c=B2atnFu#)sphUv-264Hu;fEKf(RRDjgdU>^k1 zfeauMcnEkH$O2|?wXS^X7lBKoLn-jP0OJvq&jd&(8#V`+1>^#Gz-%BNC;&WbKm6aI zE>W{&(-%Q(4l2zBNNgVLd|&~v5O@?=1S|#~1D23j*KnGW$)M5@Q1Uw~hPe<`NM&jT-Ttw6UpZQ@du ze;^g{y$EZSl)4dCE`EeL>0n1D-pf`fBOvK^zrruhST*h_|MKz@bxIN)=ds1>9F9 z|K^t$#khnCW^R0nU-v2mlP*pu1)dKuUW39KsdDpc08;54LJdC;K3zLdS_J-Da2e+} zUWy2pfrpjL1XQD|7E1M4E=Bcq(&f!B5mLeL&Ci3Yz^Od8e>E}|`uO0af(^qNO55g_ z(P@;5#aTp1U%vK}xYT}KI{3er+N=mdo%x-v(+#+FC{LR6ppgji^-|+zm)^eo(wki+ z5q^T703xp28Ee4B1@p)K=n$52G{$k#bp6aCkKqVyRv+5`1Qy2kTvAvQV3fhb8-Ti( zMtN^y{Vjk}!~OuH9LsOZ^${Ng7#pzs4v;0P81>*(VEtX71ZNlo%G-$bO+XW0m+5l4 z94;SMQ`!K-#lOmg@N-LbMNL}HUV+9!+`gy;Y4e)dZby568u13ySAR#ss#oFIyLXS< zQRs+{!qxZ|)ZGef1GWP@fSo`UKq*_+c@OKmfZc$qvxhA<;e?-C#(u!oVx-RF!EgA)@(lbH681@c2#3PD+8f^qM?NKL1-(GB7wX|G+{f+cV7mLVF}`kGIn^NZ z1K>lp*#$xNEQ$xtAgREig_=S{|3Kq2FzSG#z%k%+;5eY#`WG4h^H2y8mzPpOzV5_(A}!twotf-3(h|+k zZzsT}nZaAOHZ{^R3}-pnS!Nq zb`xi>Ee<22!0D=`b&u1G>x}2TbIs6a);o>N@n&e*WY}CYsAPv}WX?7N&tm=IOtaM? zvL3UQPrTEZG2h3W0R3z<=wHasM)}3b_{W~e{eI5V^h*%_u^ zJst?r2ny>Fj2+qnh1DB%StcMLJ)tlupoWJjAYRsDF>ogN_qBGG9 zJvZKI&?me6hYvy*e;qkB16b20T_Wq4U z;aeI1CMbybonWaLN^BHPTNKW)%ixNwKU?D(k>1|FvvAK!?~gWD-s?1l3>$@di^4g+ z?+G6sgU7V^;Sc=4BkjQ=!BlOivr+lpqVfalga__}c@Ms(aii|?Zo_#C_eYj?EA7Fy zLg6;9-~vl|FSSv)U{Uy+XafuJb32-I1&^lSH^e)J28+T^>~c$r;c+O4zY01b6|xQY zEWRP&qtHg_qOQcE{oVL^_P;|VfX5LBhH6Q@4f~SL#`0x38Y6Rawb7{3RFZ~zx8@g% z%CBtQEpEq99zihbs|adrxK}LPzq8xW6N0-!;|_@O_WKVD_n&NOBlnudEw$lZwQ&E% zM_@32LpmGvDQ5M>2miaheg9_R|C`SuF#}IYK8;(E4fmRb`yY7(`~~wcg!fu3SgO~q z*(m%Dh3kMih8pZlD4hd5g7FvU0M(kpqG8_gJI3Jx2~Y|?Y<7U#5yrlTLRTKc0I*aH zS8NoVVEbwcO=JuY;A}*+Vw#yM?CUCl&Co zz_K68G=;bk-Z9()wtg&W$(FXKE%6`}#NHqXEEU5x8--gf3jXZ5uB6Z#{VDdy%Qc1I zXzv(qvnb$wa&W~Fr9tBs*>D3a+(6C^XTL+C6(7eWuvGjFHVUmR3T@;}n1OH7x8MrZ znnLPG@Az-GCPWTVi@ zq7W+MzYYa48JmB zxDl*Vkm|kHG;Y)=Z@=9v-0pHFZ-IiC$u6*z_X-<@J1q)5q(Vqrb#~>^6oT&cj-jVT zp_f!x2?Y^Dy{1rTqtM%;(1%5LqdoI)P-w~LKmu5*6%95DeWgM_Sh_mvFJpMHorNROSO@(lrGuSjgfWTvhF?dXfX2*bu_4!o=G8NthcvOQb8S=@0ERj z3<{#}BfwIvud`8zwJ3~cokAM7LX8_0=k0xr3^c=zmf5o1)j`|__Ul%JkzE@JFf{9 z+6W~|A=QmZYC}XQazg}5HKYN{_kl49m<%KXQ-G;}Qn+7jh#ea@L`@+%-n%g=VCyFr z(`09U1_iM@4+BfZaM(uS0jV$@mNtb{IT?naTg7B3))YpJ_l_aW62pU1VPm6$6D$=& zm5oBWMFGDE$4@px@hML9=4%RJ3EnYeS`;3V{qQOjL_b{86iRFq9=0fC@fe2lDV2iy zDt_05Kw}2#(#^F;VCm-COxSEdjbn}+$Az8M?xapr$b*7)2QUk4eH?S;T)F^-mVBca z0hWs4l#N23uD~XAq06)hVd^riTw^Cp^!A^xv(cggIRg8jAZ9@zSjzt%EPKG9K9~bb zeJ~ex9-#VQz8r!6;c5hmG=+#n?-&+2-iqb&^yphC zh?zJ5EEU6X8-*t<3V)J4ITk1VLZMVsh`P@^h9@lwMSK@0PWSy#UwN;z;XY;I{#nk1 zkO(ysJeorAByaCeTNGBv9(Vx?BL4H5!g3phXDkXUNH)S%ux`TT9t@0PK{*uOhS+TDqbivJ!W-&Gk!AbRR_l?ykHawbc*5 zlG(<_jEE^ba_Z-7q&wjJ&mW#PBZ9x-x^hvX|zmCz!7xyFB+{fGE`7djujVAP>>4a-z_ zgI4z)ELQ;U0vp+sp5XC6n?A1b7D*qQG+rf^DP`S{U+06}jP)%tuUO`7#rigO6q@2) zi7CiGp2B`ZMo1c+ZFrDD0+i?{(;TqdL0U|2E+ECB4!uXX19@}sdU>L!Z(qEoG9!ID zUTn$D=VvT6TvTZIp+0HsBn`Hp7oJk_5x7Ei?q_R}F=!e&9sD+uoPT3Ex6^=L~w^uM!`{eX&=!La#n_N>YPteegvTD zSrLVX!CvjY1n*R0A!?JbJ@E9C))N4-VM%!Jj>@~?S7l%)%KRj0gNBHDljM5v6rmF$ zZL-XtN*0OcH_hwM06r>o`-X<44mb)N1K7HhyYaWR{-=gJ!kdec&cJB%>^5vnUu>-| z8vcqKna?+7Ub&HZ5}Cbt&8X>(^e+978A|jbWXAXHlbKVHoO#CDb2Be9v| z*1FyJPVWske6sXh8m!aE@Ci<`soQn=Wc_zaFnm&|VsSIRrO?(=c3(5c-G#&JCb0>F zaA@j!{z?3-pbd{)Q3{^a%n=hiS=3JUv(%&-t0w)gSIWzRm-fm%Sv}Pu_|d8`q~bdTKBZTy2Vof}~S^97B}mM7aRxMW3*vs2lF?m?i4!P1~uzR4$$Fka^_q k{O8~}9Zq}?;ku(oRTdi(i9@%4RqsIK6!1DWB5K5c0SCNf_5c6? delta 3450407 zcmb5V2|yG_zCYgGb1=gonv9yDkX?5ZHDx7jn?2rU-@f+} z6EJB64?sNe7H>sGR21(ERJ`v4?;9_??+cIrr)mz+WZ(Y&T~polJ?dNE`c~Dqs=9je zPmT`1cxPmI2PX4>{?0NC!xp`Lp6$yD3?eJ^<%GbUS<<0`Rfq*a_=)M;8jq5@VM?h) z_z73ZUH0RWkGQU~pMF9eyni9z;$1lOPNh``JWB|pk$wtpnDvYBiaBgXwdpl~Mp zCB1*ea3w0amE}qbFlKQI!cvl$lm6na-vyoMP_P+CTWyN-&`GvP=Z7&-1n zdhbQ=CgwkYF;hVn%9+YYfw9uOX;i3R`e(ZnxAAk2hzVVCsM<%H-_h0_}|MX}0?@R{9Vqv;mFT&qKE!dCcxI{3VC`Qb&;Sv$9 zaDc2wB;r_+gq4a=mPjrYi`t1qtVk;67-=C}MDVf>EGd!+mmsSwT+BeFFh-0gD-+4s z77`I7;y5Y83F2@u)FMiX*;boJqWUyEm$$*j=$cNE7aZ;%iHc^YD&`2s}*cNCUIm>X! z$VuKqi~LE(Fd``{LyMrU;HJ&-HNzCM@u(BA=P(wHDf{?i@Cb5_6GcGB;iSowj7TOD zi^ZZpi(yXGTr6V3(P&``sf+=LdL*KarD&jzu!cw+E`pBT8EH5!Xy(5dH3UNkX@p3| z$Ydh4Hq6C|#TpUV8K?wvu_7i64K2X>BD4`FQlJZRVku!3Ghh%&v?JJBKDxkULXE7r--bENXGL<)8kX(~B{z_Q`!Gvam;XyJB}(JUio zB%<&bX}AamrOhrCq|$JysDvHEa&L`=PGWSua3Axrh;%2?VPOMK^q0R#B<-YP7Ojci zgZ_Y~hU1e&vtlbRU>i6ef-2!b@57b~LXjtRvb} z;NUi3NsO%UFjgu-5gkP$hJ!wGP9q`hCYi!U{{3^ASPn}u>^I+pi%4q+FGeQfq*F17 z+o6^y49y!RiI~Y08)4$)C!fE2DihYsDDU5{jabv>2y{y1MFx^^g5}ujpQ>%?3IS4 zz(1f{{&OZPn}y*I`-y(dgo`_}tc+tK#8OTQ|Hp=fuC~8!1*Z_kg^^(or-k|`&^c8q zDc5^8T73>Wz<-P3lf-X92kM$IEa4gHNKv3`b8kUmcshkh-a^F1q52B3C=9JGD#bgk}5L`)3t9JzA#-to)M33NpFX|JCp%uY$3TQ|yNV<%a{X!}W zmr3EOVKXk07?g~CU|<^Jfu$J3FsT^oL#}5oOMD2t4tl&;B1b!5x``#@5PcFuS}Gxa zT|AGKNf?0>hjAEu@K~fuQuGoyC*}+8EixcOS2(LMB0n1jwTU<4Fc{@{5uHcI!UF!6Lpe+7Ea7SF1Vff?B}R|Ic6oPv^xhU z0|_9IoIv3rf4{jJgh4F+bO9`&$4rF_ZV1x@z3{AnAaW5d+)BE>{jR`C+K~z~vd*X) z=_=%C7a7+JI%ABA$ebZ#NL#^^b{1go7NjG?(TPNQI2+6$qR0p|ZzoKKFf}Fv^oB4@ z9$%8F3ce2k(9(2>=XfoGSaVU@j!R-(6HUUIP* zEvOs39l9I2VJtDyrLZans7wZz5e6Cbf=?lKfcu31K`V+s6;-jx$N(qNbfMRwC^$k4 z0CaB!`ibl0j!@D*gF`}+V<4eJDY5lpzWZMbYD z8!i?l3Wgq$z*6rGGL@~xfmT8 zR*;C`E8!^6-6Whe23bgN{LqWQ%Rn29VMc&T zbR8*WKi-5qV$7CUyfA1~%nooRB3U^1cMJ~>OGGim`;eE+8SuF>39T?8M ziRFv}nqt6`l@Qh}(l`kgj8d}b!Ww`~saSGhwjl}vByNTLr0>Nb8*!Ks5g_0qvk~Et zVm>6R2V7*z#>6Y`i6xjs&b`GkTuet;r4!K*qGS>91{eo2?jIe+Jz3Ip#NlvUUkn6B z8i^?#MTjLbPLN?41WB@p@5Mi$-H30LNtDc=HnXZENoUd|s2t`Cv;wrl3NB3Y{`(SQ zTP6%^4!O9?M{#kVd?*uRB#>rhJ4bigp-@W$M#0U!C8?Y4Y#sZ zt5y1I>Sa*`Z4_4eYXq!7{jQgVFF?iGa1jxmm1#D+w0T7F7(KLqV?43aNCjC=aV0n2 zi4i!NI0BO?%t;(CE>zE-Aj??jCuJi7y&~Y|Acv9WV6KGPWa>aoKV)SQ5nIuwVG#<* zZ+89BA(r~%|6ms8{_sZ`5Kx6wRV@BUjHOA$uR4;tizC9|u*0RT$)tgD;T^XD+ggT& zf(SET8`vmJxt-m?wr;%>>SL(FQ}1Gbh291q$;rY*VQo3CZJ4;1qyzR&zuV2G_r*Y$ zrn6|^{^?;{`W{vS1hR_v!dJr%jI>>Hcz6W5g1mXe=+uWvN`4g;9YxlMEtnsFL|wl} zw}RrZ4pxxNw8C&L8(lIiCXD)fQf1QaP>cjPBCAG4o*OZ*mbHF9_% zGR0w?0$vV-j;v{Mq3&c4BaUb-7AwS(2np8$o(KCP(u!p1j3GppTBM$I291DV(pbP? z#ex|%LMD?clNjlHxZn!HWMN?fUD{!SlZnH`+;E zpaV$6aVRDd6%UtiZ%Hvu@go;{7EBdfuuv4dDp`24qE?DltrUo@T9EuKN3ouFrcS4rDg*;16R^CJedabA}8WyI5DB`xEHX_zU ztkfyNnh{$n;+RNVz*Cc5KVVj=P^kNNz@m*fM=XlqRf!ac4QF~vL|(Yac5OtGu!HO& zR@M%aK5>mQksuKnnH&+CQPfw0JsdnI>3@svZiGiPnFSfp{2>MJy4wz=8@JAV`qFkJquC6=5Rz5%gO0HUYw*2c`^I z09D4qmUwJbnanHLz>!5CcIKFyh;jTEQsjjNe&j+Y#5Nz*@n1kjkhKhHdeU?8fCH1E zv$Q6&2zn8W*ADh2eW`;$7I0_>bXCCk5$lOWD#8f5_$V5#9}*%M$bYfuUyuVP((kb` zXTE?-r?g;8tK-q>aFLEr_ENMZAPB6TN1PosWev7k=QDceG4=o zeiz+I8W9$uWFwSh;Vg)Lpk~BWNz4SF(i;8?qGa&F@L_1w))M#-Y_4SJ4(RC^Amol3 z!6}f7EQUxCWaz*)*c`u4k}wS&rMSz)AHoZxTR;Mt&bij)_7S-WACfy+y~BBs8)6rT zBBSV61YkZPcVr-#NRp=cbQA%ctV;ynIYJT{8QG<^M38+H`72TiJQZ2gK}|F}%EfdA zESd#&MgkRuAW{tGelnfoCZWtoM8IrtzElXk`2}GQ;}=D`F%e7TlJ#kT5w?X);vzBI z`jP%SB+=5a$wh(|PYU;gLUXt|oiYGHas+vTB?MK2tpiE;WhxUb5MV+_BFf;_#6?tu zcBB}pKN12s0QyTt(}BU?!Y~2y;x$M>44L3*5&{BtrFHk`B^eQa4!nken{MJE>o>H2 zuqEDm`__bscvbp3p1c-1_fc-jy6*76V6fE(z0z$xRw)L`yQR=*SE5`Ntt0f5;mcl>uUaMkJCcnUqUL zUFb*LRbUhbMrUY{2mCA{W7&y2y=_`MMhE+I{%? zNT-w_5Gb7bHzBA9759JK-V_*c*vJuVR_Xl~U<2ZUD6+%| zsT8OQSel{8%ZLEngeAvr0esV>L%KDrN!goreT6hZlSU6b`~X_q-w^^2F{ye(3Ci_pcgG0D@Xby>%oA>e(ybaBa|CZj-W#{la)l5oA=XaTRX?u%|-^>0$Kt!3Q58DMit+OA`wYnXpa4 zhMXAWoxsI%Z;MLyeT2h^pd`lcjA&+gkPXk@`Y#cA{N^_(2{Usr4=K4h)I3d;!qp5# zc7*|uuA5OU9DN6xj{v`%CQ>5Fja=B2fXmMu8F;edNPlK(2tOb8_<@9fFG_{u9E3h` z#NmH3YzNvQg9Q`Q(XA9EV;`xIil_avLd&)$lMJybc3hP9Gfuqt3K0IKF!B~WaQ$Db zc&CHw4ROJRBiZNC%)h`xC?x(XmbhQi{C{a#P>XF#?C%%r*RpvzaZSXK?x9W=Dm2vb zAO_tv1aC{~I&5ZK{7;TDRbg)}(~L{DAuY8V4%XY}ySe8L~>V zJ!;637;Qmw)AvG6O-yV^*#z2@kP_^D!OrKma*&Ns@d~Gj%TNCKGJ?LN1RE~@>_g?@ z)n!mFEtR}}_75ll?B5(lY)fzLdc`2NEzg zNj3h(4aWKx6iOg3e*P`XzYyVf9VpwcHD(i{y#IYoU|s=+b|}0?51FLN=Ik#f{r)gO zqOKha9wN`LCn=2BO~n2VJ&`7;et3lx0k)7S{RzTH$t43~qVS?nTJq1B=#uK#l1@n> z&NiVGPD+Sya)+0vK*`L0tmbL%GR^89zfdi3~_Y@23X*S#D%*mcNwV*~NcRp!{?h|Nw5d5hinFjJq&6Uh;Jg;lSy6C~IJ#2Q@?e{gXR=kZ(4K zM};i%IV5C(NIDQyi68-69UAe)ASr~14r3Hl18m1Iy#=+vyHEeb6GCu)4@)@kO(*E6 z7dp>-^aKZ|5hw-4U{6O*W^kuxFHiv=rJ?|k* zH{s;dM_f2wqbJU?F!Fi9YZs|w=qkC9s4TgYD1V!rmV~f44dS?x^NH`_T*$8jMiS8m z_Qp3fty)PH41T0v;&ci}8!V&12M0Kd;>55UaWV|S5Jd1v@Cs4_)vxJ>7e5MomO~B@ zvHxf>fc%uWq)KJ07D5YL_@WS(B9G1Jrs$?%6oC}0P*4K7ae;_0JX+wBJbcWEBN}2z zat2D;ik^kyd<<1Ls57}pyW+yZE*Td%c0*4FncxVC6xYJS;CzWA$8+SR08VW2A>Az1KUig8 zHdB;zPgwF1ZGQA)(znRD66}gj!HN|!xlAFW4^B=KT!}KVi=YtuA-N1s|4o7Yd!Soj zWQsY397odh7>M)~q%eeWC`qgUxnVe^BC|0W0dgEZlJiH@ip3cg`Qen9R)TVKc)=mY z$q_E}dz`nTLgd`BG(!8LjtW?l7?fV*Jd$Y>4&=-dtPn@nm}o1Mi9UqS=5TmOQpD@vh*u8N z5j?s{vtqDo#YI|xd~pdKNCw2$e zLBH!D*1RQ2kaQ=~0t|!+6Iut72aN%R{Jjkhse5;E7Eu`AO)DZJA|ihGIX){1T=;e< z0^dWB4_DBB5}bXbJTf40!~2b3I+Oq1cF4v!lp8W;#Qz-%VV5VlQv}%4*3ZZU@tW~p6ZkrRQ&Ax? zp+unApO^opK5xSCaX|$`!a|8RncsvdW3Yu100~?ICiPG~Ly15OgVJPrIv9hzG?RZQ z5mW&5r-=6nNDAelbAX>MNF(3T2HM|G4HEoMc)kF_uVD~s{%kgCgPEI?o25fF3rVHK zrc+mvpQ4&&dYv~|Lg-0HMU&vyyG4l0&+spZ!SNp|{k6m!GJa9BUqq5w7Ru9m=+UHU zQ$?GP|Bxh_2;Kaehrp)1O{u`4Cn?i!vXH1yb>7S$fSc^^cQS#D5Y&_*BqNmg7c@fu z1s?bjy1*e*C|P0Ar+Jm z${0!nm7=eRiBOzQ`nd)AE-O${(*b=`(QN}Z^>--PFQ^j;K}$As)UTIB%Xnjy_&I_f zS&;hs2eDtDpk8Em6(||2;}9160PKwMQCC}X#}gpgmXP-Sg$!h?fHfrcLHPa&b2M4z z&_RJO&H!LZfc7T~1AGTb1cZ@4!GsaWf8n17VfZ%Hf6C>j3;!B_EMN5$}ihII1?yU>LX(HoWs!y*^c8u|GzGXKzv z9EOwi8%ibLRx9wiI9cw|eLB~kZ0025wsg~t^&u9UKwx`A?)c$vK%|n`Tf!uCuO8}Y zC>S!yZU{dt0!dpyEcR%0)r|jF(!CtVDS^g1oHQkL2YYauf_$^u=h`6IQ=BOByb3dK0r6(#J&WLnXV~`LWuzK zr!cb8CXE4^*sGvGHYSFc2Br8-ha_al@QEEMo9IhkQUnryk@Q80pAsa{&Pm?D#r`kwhk0?*(AL z-6`D6EWzeP=Vc>XlYgy|zC{g368N71UX0?Dl~@hdAn%xAE^=Z`1_EhB8t9-zD>d0s zf(+D*L7Ng1Q6<=5{yN|@OCkmZP1ckt+)GR9zmDHF& zEZJ`k7sA$apKw29GW8v~>`dl{k4wp9uKPH3CUY&8(_}KWahx`jdEA53Wipr4oIaDe zt>X-t%r*^Y%w(4Qk?WPotWa^LOs23aXU=3sf5KTZnOmQ5shLb}9B0jBYT~)HOs1p< zXUk;PcjN4t%#lBE4)7;%>6rpkuI2bl=3rOO2|@zr%47zrId>*AGllbHGIJ6+ZzfY2 z%lVN0J@*B&{egQwlX)1=Wo9uqeOy)+bIZs5M;3FsH}_>0vyA1w%3@NvKV>oZz1-JX zaLIqpVy^kPzhp7DdvkxyV(NQyf6HRd_2&LFi#gj{;QpS)oa)Ve0|7kuk1S?tI`>~$ z%vuNc&n)J=o%`=B=AMuHpDd=q$Ng^>bJfRvo5fu5ao=SzmwjBnEas9=CR&!u$}fzC zzfWNm8z-{|-g*Ap8SD)9a?T^ub@ebT#Bqp^x);fgAg(|h9$y@F;gjO1!guq3SNQJEeyhECZSvY& z?VVBOTm0Tq-=g=H_!hob>8p4zuT8EvqmEnJ=A!4aXN_kKdrA^sxE{I+ zW9}$#D}(W%YrAWMYjDh<7!qf@N?ikE@?!GnJvXK>=9cn?^1AYx^37+1@~ZNR^0M;H z=OyJuWxeu(@{OmUJg+>bJgYqOv**3&yU}-|Z%5yXz7c&r`dV~D^wsEJ!d;2J9DOPJ zVsw3UQ|f&5*=Q2aM4zVdRP@Pc5|2k8rLnN3KOBx04n`l2J{WxMN8|SBZP6r6o`;o( zlq7DA-a^ylIi%&_mV;UjY?4HYgU{;d4bkhP*F^`Pb8Ty( z+}h|Fw#l|Jw&AuS+YsA8TdwUz+Ov|~X&r>EX`9n(($=S~Nn4q=ENw~JqO_9elIVG9 zbJC`zO-w6E8<{pNttf3s+Q75{X)mpf)+g47)_c}{N)kp#kB%OJ@FH@WwbVM%I?h^R zZH#;p**tDllCYVEQQ;(vq#=+NC~#L%tt9br`$z4A&w-XaORnXm`MLR-`HA_V`A+2R z$ma2k`K)<+`|a(wAT%g~;edIsd6&7meRcbbkt8&l*0o=YFi$y8dB8MJc`h3zZaFKA!Z>rCY7$WxI&zn_de5qUiF=l5fg zM@aLMY%}DBml@_5W*cT1Udi(e z0}Q!_m-@W$0pYpffCJBck#+jR`a}AI`n{1A`UU!O{rnKmzR10iO?MKZqe21gw485x*d^gbgOl%bSr_}5gClzBj@Yp>E`OnblW3IcrKr$o2Z+h8>efO zKh!?Z-q+sKK9e8R9?sg@nX)2fSxQyP(v&4B zl_`r;7NsmqsYqFnQl2tDWnRkMl(LjLDYH{%rMyUfp4^!HEct2jljO(AkCKO^3{Dx8 zGB71SB`;+_N^Z)lDMQ*1X`oqJdibxU; zwmT@ayZbf?cW9_jS`g_EJKF7NS03pPTiYE>+MiV2Zgsom?Y6e_KbN#y(ykI=F~TB* zg$NZ03lPc?<|E8Qn2S(`up@DM;d6T(~LshoW{x?P}j9VG}}O;>NdY z-mZST`TbeK{bNBE=4fR5E5=i-H5s#buFqPsws6f>YA!SbyammbtUR@)TOA4Q5RM9stc;)%JZso zsg&^R&7#kRMn`eRU1@SA+bK{Le%*v;at>m)mFt8MXh49;@>?tDK;t&MjeQ%QS6V} z7qvHPPt@+HT~P#EqiBK%OfWULZ&DnHIvC)uR%}r0jM@>kJ!)%IZPccyjZrmG)dG+q zKtWhYs8;NV+DRF!qpG9UAry398&w%a;v$3v2=k)KXxtsYGk!<>_V{h_)1ykGCPa;i z3O-lGFOOduzc{`ketvve{H*xt@l)a_#gC6KiNDptABIK=L!;_j_`~3+!BIEj8saX- z)yJKWI~R90?sVL#xRY@w;*Q51i)(!M>AR2LefVzh`QY6L@6L|9_wLZG5*e-9~jA-fd{NA>9Uc z8_?}#>@y+uaqNTGyRo-oug6}Ft&cqudouP&?4j8GvAbh;#BPn<99t8+A$D!->e!XB zRj~_W=f}>DogOv$UAJ^y*|ofDY1h$R z7rnda-6;s85eg7qz4QDX5^r^B=(4ZN#x6^{Ea@UtcJX(y`CU$Zc;dtDAFldv{)fXq zEdKCe=i8mHc0S*EZ|6(zTzY4F=PjM9JFn@yp!2zR&b>3WbN<^CI~R8z+PSFns<#R| z7j!=H&WU%1bRN`sVCVeKd7TGze%0w^rx%@`cWUf3x6|xSGdfN0G%uH(lgrM`WvAz| zrMc{=T=uE(NVp;h$A!JZHerjfQMjwPt5_;j|G4hQPl``7o+jXB=`K>xk{clED`tnI()?NuFDb|i64|E2xQ`_JexbuS&ie{ng^% zEdI@KgkppugaU*i2!jy@Aq+&wN616C)_1^f2K?r7--~@O^gY-2Oy5&|PxL+3_ekHv zeGm41C3JYzVQ=5veH+@4u&wXaHYB|4@UlZq-({`*;Yu44F41tY4GHx$RJHPlrLFwo zLK_mEb$Hg{d>ay;c6i#s?|RR+A>j-SOIrEEh6oY_a$6q?i(C1_={6)RYUK|LTlqsp zD}Pwf${)&G`NOF;Bs}WysKY~q2OaLwc(=oy4kX_0aFfQeRo7}bHM7;M zW|1IgwDO0m9j3ysB&E7Y9 zU+;ab_l4f)dsjp>^d8aSO7GzvF899F`(p1iy-)T&(R*y~r^4qMw?A)uZvi{oJkh*7 z`(*z~KP>Ba!+Y6#$vd?F;Qj^uhx8xRe_;Ro{(1ce^v~`8D(6Mc^PI+IZr*)+*92XT!US?Ij^!`W>3wTl2e*9Ij7M{wuC2~N1VHzTeEAki~5iCZOh)7 zy#qz8%6|I6%Ip={o1B%-;m$$MM*c2;g+IjatJr_U;0c$~9{pUs!@qxm8H zgPa4|d$M1o-%mf6ek8pp{juYwi&ptFvZj-O0Y2eJiKYd(%6E z;5RCVr4CL7Se?3zf(ue-6Yxsv1q#-s?j+zV({WR+sh(SHT4X9S z3A0Q?P1ky@?=_;=z+TUc4aPIZ!^Vxq$;w5>LSuvEhT**7K;#}nrJ>X?gMB5MC?*p0 z5A=9sWITZZ>bV)Z3|!-NXBBz6C*q;)i`(a`pQKc$EKgY%S=@eC^1|e0;wj1Fl54{j zMK&bWiBBgTO(N-iNmb(YLec^X79tiP4nZ7@I0$hdVm{)Ux0i`m zzg;JuE=1NrU>yY3L0}yO)yY3L0}yO)sBOAYMakK&(eRi+CFG zB;s+zV~9r(Cv}5R#Ku_gA|6NFhqwiCJ>p`-Qp6&}$6Xt^i--ph*CEbD9FI7xtI)s| zBT>*5O+74Z{%7?ZU-}vUvM1lrli$^oU*40S*pq*r$TuYNM-us+iTsL0es&^1ERnyT zz@JXwwYOSeXMWBqNwH{JPT4z^;-NWtIhQ{eojodhWcJAqibcb- z4}MT7e)_|$9}1-xe>nKV?jOd77mI3ts0DV#53_#QEx-TH(GT~1c=w%R(d~C`LBh>< zZoIRs`j70trem?Fu>b0gP$TDdPLX)^kF$TA^y5&J_N@N_d8K%3|5^Qommi+( zvboFZE{nSqi)MG3)TL59vP(gi1MJuj^FDmsc^y|Qy4m?4m@jnR)VW&v(VUN_u~oV3tXy_-E?WlKg}Ll})ck?aAe6J`g*suk@CfzZB&-pZ2xUU4 zu>7s#Kkof;^N%~B-gcqm6o}c{v9@EW;@OY4f4unP9@J&`JG)Sq?eA=PXR>1NPqja- z{b|Wh#iFvGCjSKWej4=CB*lqN`#Npu^g8d7w?+wrg~p$#;E-Hmqd}csbbQ@LhuBq} zD?68U7D_u8i%L4L2&)ti?ws3s`Ul6p-|>Cz_iMi|7FB&e|NBbu%zY zd|UqAwC{?)8}QwVZ{elj7r#66?VWEYzd!E%G4Egf_F4GhZ)dOqU-$K{uQT|Xua|#a z{`CyD@$Xw?_rmfe{FFbJ{5gX!_;bV8XTBcxkNe*=d~@`h-QTSF=I-C`g0gh9w4$#c{^`b_0Pg#8?VmFE+Ar6Ax%^9j z1HWqgGK0VK<)trA5OC>N<-%7P{EV+Ael_AN{>)b=0POo}`&a9~;$MALhK!HDy7g84 zSMyul_@XvzL)OZyMOm}5O0yRAF6%wD_r%^My+`#P*1NFxi;RaE!@`Dzoy~yEi@ti_ z_y{D9WbDhx;CE*1$k<5mH$T7ec?N&|^J||se9k}l{4s!spFj9qxc50fHDd}mCu9_5 z3?ZBo`i$$7!H?=w)Ms#?EwX&c!InTC^BwWk`40OI`40LH`1bqu`S$ww-M(EuGXJdd zt@LH^D}2j+%Y6KL-#P$meQSKHef%chMgTRwYTpJQzsC3i(F*M)-#N4z?`uO?hvs zZ;EfSZ<24KZ-Q^UZ=7$8FW1Kx`3ijnz9GKBzR~Xu^385N(3j^M;CtnL>3!jS?tSK+ z)B36RiT5#`IK2%1ASL}S{n^_H~W7ctWtv?^yBR-yZ$b-d44wBM$f83mep$ALA_n|7h<>?+DO=7p8fq0yD*1 z>YYRso9LYYaJ+Y%cdVD6?VSZ+rgw&Sx|c}h=X>V?G1pt>o#W*fdlvy%=w09~_wviV z%K%h)mwGF`&poe1yJKE@_!k~N*Zax?vG_glJoY^DJoG&9-1pq`-1Xe?-1hLd1kX(m zf5UT~FkSOBcry6Pn5&*Ep5vZlo{SgDqn?VGBc3|XVb3AYLC*ote!_Rga~gc7JSROT zJbb<90)X?LbDpz=R_)mUaJ^@pXRT+uXPalMXN#xSv)QxBv(Z!I+2`5o+2h&m8P#%R z%UzzGo*f>6U*@Soj-{R@o=OkD+OrD4O3w<2eKXpHGXYf;F9=jj8`Iqh&0G_)W-Ot?o9rtZYx#hm;<{!Er0J!hI=f3N{=5BCb zabI>{axd<9(T#PRo2=gE3N6RQ%#5k$hJ}rbncK2hw5TIl(oMrGSI=E=pLfq~IlScw z_e<9!*Dco-*Ev_UYo)8wHODo@HO4i}b;CN{I>kE4I^H_QdfR#2dDMBpx!Jkixyo7P zoa3D3oa&tD9O@kG%ymBFZ}1oRWBgvemS4*+;pg&G_!545x=@|IEPX-x^z?D*L(>PO zzf6CSel7ic`qA`^G%J$`^Fo_6UKwaUB)%WD&qp< zWaBX77~>%0J;Ol5Zo@poHr)cr+KEns=lJGS6@~iS07aGRBuu* zRF72`s%NM#r5sP0oN_LCXY%Ic4asYg7bMS19+g~_JS15dko+v^QPSO{TS?cFE+m~w zx|(`C=}^*$q+_2=`K-R@(Vn||*7RJ~bAHdMJxBK((z7w~PU6MH2J5cG<%#nX$0v?S zEKZzepK70CA8%i0Uu$1uUuG{#9FjOFF+cHo!qtR|v`YyW63!-^OxT;SE8$qe;e-PT z+Y@RNHYU8XKDR!#J`$|=txFQh6J{nfs_v^Es~)PJs zl{zwYL~3#BZSyVjb?cR$mwR67d9mk8)d0&Y^GnlZYo%(DszOz+dg6T2<5`b~JtlQ8 z?OxJ-Soh-YMcoU#5A6OR{z20GcyeRp8 z(&eOcNk@_v#+N0WkAGoWpK!=@&V1awD6u?#Zv5={8Szu&C&!P8pAbJP{&DJ~)S6Fb z+DdI>Z6lNK$K8s%8TZ26Xnrb~ADQbD&Lx~mIG(UOVMjt;!oh@n30o32CCpRJRh6mc zsD^2aw8h$?+Ozso`ZM~|`isVT;{{`_akFugakg=mai;O5;kn_3q0z8JH%(WmyQjXZ zzN5aNKCeEjKBr!zUaelGUa6kp-eJFL-{`n(I;lUVKcPRaKdN7(FVqTywFTNC+Ckb2 zntO5A;*Ry)({p3b6+O#)PU~6Hv!LgT#Jh=?5>F&vv6iPTi(4938Mi1d-?h=U&bGp~ z#CF0~XWMVvY1^1Q-CdMgm|BoJBz3#}ihY*tVd{g_hJ>d{LmY!0b6sVwr#%{bJnAvI z`;_j7&6~_a6D#5t#FfX*kGm$MTur%>ayg|TWkbrkl=Uftl3yjQO}=5fW^1rrwOz4| zvX8Wnun)H{vM;n(*caG$Id?jDIJY|&IxCzDoaN3j&JyQn=P2hx{sDiVzsK)M-<`fI zeP{ZP^m1zd_IpKz~}O>(ubuNr>{s~o<1{uM*0)SBZqL*b;R||`P8|< zQSKP)7~`mM+)KKYRF`x%>0;`Mq>ALBpIlG6oirz5^CxA=0}^u+UnSgC-BjIH-BR6A z-HjWOeBOA@c-B~BtTt{i&M;0lPBT6;JTW{qJT?r{=jjLP^YsJtx%$Prsk%kFYRx*$ z2F-fSTFn~GZS^hn4fP5^ya^6-)S0Ps zQ`g6@i(ebRCce&f*mcOY!&Mfy&AHXN#aZi|@0{nH>nwAQbdGQia~3=A@VEI}{7rsf z@|@(G<{Rd5DW{TaldB!q&DYE?lV-+EkDC)WJGmlpQsTb&z44`S!t8`ipR7`?QLR?3 zQ>|64SKW19vo1`iur08a+veN0*lKN?ZJTV3-5z#(*)1>bNw<65Zg;!YZMtfjYN~3A z>a_8c@uYFRah-9kajJ2OvDEm;@WAlUaNqDs_gwc<_d?gGd!}2co1&}Gt=6p2tkSI1 zEY~d4TvuOHH>j7WE8D6Us~4#cnof5cVH;{Iunn>eu)R!cEcxQ^9fWOZwP_pEHl(dh zTa~svZE4!#wBgAcKbe(qF==Ytl(;8J&rLPS15|mcT-B={FMGV`@w~@n+a=pYTfOaq z?YwPP@`A*PiNlg-cAwRKM)&F6r*)s&JwLfrHCZ)DHBnWO@FHn+;(gsy-6P!--DBND z-2>f1O_ionvsAN0vskl8b6@B-GHyiNv2L5Yy-awK@I0Y0VM(_q2@ezQCfrIm6FoiNQH@j$R~4&@R0XQR zs)4FKJ#O|G-eXCR8=vm|wDQwopEh*g+I@J-vE4>@8_}(}TS2!$-SWDe|rta@Px8&vrf4^?28tf4e zt7B)xu8N%!TM|1wc2I0V?D$yzock(_bl13fVTXG=pl$B0?k#Sj%X3%0 zJI_6U=zw3N>zONqf9iVTdh8<92d=^HLGFQWLc8y}2ijfN9oKD2yXh))7r2K|+6~ur z(5|@}TvsXWvTK;TMpR5`ms}S?t9M;+op&7)AoR5BtgA+J#^o>alMv6NQgDgkXYrHyut0&S#ggy0%ZiAAnr z)MF?uu+UWi;t$)c8B$A~ zOPq_Hi;$Y_d>H*8`aY!0bk1;2cTNLtinG)?**OWR3C{7(an7+w6*&u?1%h)3k^`Oj z&OGM;q+ana`4{|iKA(NcKj9zqk9gAU8u;scjp!Orn&T>ena8_A{vuybX=nNKpq-<% zGyEygPVy)CAaCQh@>?i*BflBs zO*Cr_Uk%y@em%dA(pK_oKwBNixq@E~>N38HUrMP9`ASe12dEYN0#M8O`TRUeoyC`d zIwwG#DeyBup3YC>r&97nelp0D0^|w&cu>djWBDc{|fI6n;3Vty!JM5)ix zpQqP|8q*2+Y5J3N_?YxZ=?~M11@ENa1MM!Q-A=y++RgME>DSY#|GARh0OD0jyqtas z#Ea?m=@)3m)9GhHJ40!w(oceRBK>&!F-kj>UI*G?N;{Z-0JQz-`_lJP+LrWfplzkJ z+Vst!ZA#ymUPEc?(l>y%p3nq-ZTcDzSEsK^UrC8e(yKsRN;6ibF9vN<`oi=IN}HEn z4%&Q5o10z++MM*+>9Z)UG<_OqQz&h6`XtaMrcX#8PiZCTV?i53X`|Cefi^OIMEY>h z(Eo>|7p9kn7f|Bh^g$pFOwUixqZwa1azT6LASQj`c<#vH8y(LaPaVXh>l}BSrQz!- zZH;3!XsaA69V;kpsbiU=G`xz^DjkbKTjW^isGzhtj(LvamSvPSTX4(*ai(L2V>%^H zc1#7aloBU7CW1D>G2Sr_V|OItFvOvb;BYN)1cz%L@E0-0x7xSZYweqns~rm9NC~s-Gwn0%(~+EPpJbnCpMcaj`&j!JdkIp- z_M!G7dm&PT?St$C?fFOzu;26Ru(-cdNxuA(q=`^jGlqi-Vooe5Z`to z#JDBIxG8OV^t9-y$Wom)CAu_vGE(c(CPhz-o`BTqwDHm7qQ@e&BE(k};;RhtEe!E3 zfRdvTM<5m>79tKt%tsV*aeIMj;u+#&GF>3vMZAM})mrP=?AYYk=Gf}k;@Iif;n?oj zJ!9CsYI9k(3!9rqk}9eV`(F8faVe)~TAUi%^YLHhywQG1>Ju>FMn zxc!*@wEdL*r2U-zto@ArhW(no!G7C*%YM^-&wkf_$NtFvz<%HU)c(Z&*#6w!Xn$sZ zWq)aZVP9yiur9DxS{GXvS*xr|txK#ctjn#-tgEf7tShbStZS`ntku>H*7ep+R$-&H z#=6B?Yu#+!Zrx_xYTa$!W!-7rXWeVvV?Ag+VBK%6vmUk{vL3S@wH~paw4SgYx1O<{ zww|({x1O_}wen}3XD}n5cAj#cbn+LS^#Cq7&pXdK`3C1z09TxsotK>aP3H{&HpUx7v02Nk!W=6<+d2!-9_38y3~NF3km#u}{REntjMP}f(bin+tJIgNV`4_f z@GnxIW^R0PS{(kB`Q0}JQNxhwlc|G-V>ZQ~Mq~;^eK^%=Z z9C0Y(6$^T@C0}5-A+Z&43t}zeX2jVR{)Xkc1uHm9gXOA)ziYVz;I`$K<)(#yWO)eS zf#tsCo`r9;JOl95^2GAk!sn*G0`SuE!t&h04@w;fW%5(=QU|2+yDhsw*=gBf*>2$v zSoQ{0}$1F!J{5i{60B0)-WgdXJmNLs63%|&+5I}`xfu-ESS6P+j12^ ztg)=N@S7|f0n}Kk1+ZSMp;H$_=%PY z0LEL!S;kuUsg@}KN-dKulPvr!%S-?>EYmI1V7>ch3?Ia!i2D)uAnrumVdl4+x0y5e zt>!J}TJv<-G+DJkA2sy;%*5X^-85zJH%!+|4JQ7+=^lW)raPwFCjP1E34q6@ho%Q6 zl5-=?a?!*eGaUuth^fwW*u>^JdSOq+q)WZGz| zG4VT1J4`|bzumOWwAIA#GwlUwk7>7Qmx&)_9tb`2&3WblX1>T=2%x|`#5~x{k1!7h zFw9(R9%|;tm`ebRHjgroH1m_p699}ik28-o^V7^z0ZcKMnkSq2Ip$daW}0W1rk!dlmKMX{QjV_MBU>$RFY zfH)WNsgZwTd~D3%9~mDS9~f5)+&v?I*LVk*+s0eQo5t1Lbt8Yxcom2%#>>V_KpZ#n z$BajTIAW|b9s=Tkk>79J2gF|E9^-Bxb{hE|#_d3CGj26*0b;e0Uu9eg#0ukb<1!$Y z8u=y0N+1>+7aA*oC^z!+jq{AK|6F64aSkw(jQm971h9-Zjx&x0qQuCLHjV;fq;Z6C zI1t4~eyFhshyvpf<6s~L8u@%<9uNbJxyDz9)!bbJf6#EifQ6W0pJA_oKWaDvpw4jE zaLB-)GMof(!f@Ph%rM1NYMN}CWD;`auVfQV6HMbxSmK;BoCQZ&`!j~q_!5A>Y`6sQ zqM_b!!N6ZPTm#TxxN5k9f_54Bg@y_s78uG6^9_8JVJUzmhQ)?O27Z-cC4d!%<%VU3 z`@Qb;=K=3~RwKr~Mj(u$mOK(NF`p+OWZ}-oS4)YynVf*lgH@ zg610dLPG%%LkxorgADv|!!Q8FhM|Tc17Bho4PcaEq+x_%dar4{ruLdb3o7k3xz|Ke z(0Ic*FwAT})-Z;YGsQ3&;3UID!vq6A(=fx3A@I`;(+pElP`-h`sIS+f?<05JNnz?vxz7A z#{eJcAL{Sx`4{@<02=kr^iTDxxg&bMO1~6{CHhMJVnNTZ(ys)xLcd(UOwX^^uLH1F zzec}Wzgxdczf-?MPfRynxm~}FNZzQg0Yho~YW)TRZq;uASgYTx-=yac==THIr{AmJ zgMt?7`67KG5C!@n`oVgBgnl@HVfteIP(43JUjksXUKphxsh_2vsh^>r9w=yvrkj-*r25+jaaw-F^W3 zbbEDsbo^1>5dd|%!@5Jd%eqUti@JK9zd{#u=XEm#mOrUG0gl~~$92baDCnH-EWk6m z)4EeS{<`iOfCk-F-4)$xZmW*psH*{@TDL*B9*DI%euZv15X*E`x}`vr>-agk*+9(F z&D2c?VzQ2Zu5Hw2@XxeQwNJGC09`Jque2|j1848?;xo{9WxG0JpWb1no`jYVMGhU!h$N%rb42 zcBz(Mt6c+NwRV+urIxSJRs-0eU9VlIEO~ zT7HgpHh@{$nc5jzet~vAfO*=v+A@e7hze;gYq0m$T-4NS_#2w*0Iq2oG*>nJUCkW; zw>7skH#Pi2%>w|X?eA;uY4~TFrvRR49%~+H_*a^j0A6UGYZ^7Hx$_!c*sR$E%;@$T zH8mQ3hh{r~t(q;GS`EKfvj@O#%`VMO4S!H`fB=#EHTyLDQOywmb(+JPLmK{+<|Kd< zn&X;d5V=6Z57QI_F}nRwO_7Eltr-Piq-KO>xP~9E83$mjW{jpp!%x;s0wC;;oT!Gfdftq|Ea#0WUOEv1Dey(m*V^UG` zkJXQWc&L7$z7NDPHGfon1c*BIVf7&(_N)1Q>b*ehQSVmo0%C`n->%-OhX2{3u2pXa zW}}*~QCEXygL<8Mt(r_;6>7drJqM`S>RIZUYJP#b9Kd|_JoQ{;n6Bn0sV4$4LH+-+ zcHcpbq}hV#qo(Kf^i)^Z7Bz3_>Yj~_z0i%71Qbxf6bR_QEqXFST$Zj zEE_KwFJg7d7)FeTF)?I3XgpvHlg1N>apN)LQLOeDLz{6cCR&V}jhl?|_@i+bs?)f` zxZM~YO&&~ewVK?S+?s&*uU`0a?)j_7ukODF{~Gvfz_0$lEynFLDv3^4IG z@iT!alSnK_n1q{znn1is93s{v#w6MVvQ0i9vP?2fGE98_nrNJ09B&+F3|mHY3t(TUNqk=K(JjCzb}BPca0!9uao7o#F0s4}WVR2Y>Tm0|TWMvhUsQJPVzq>DJC z7%WB`MHxjJL9$U2BGD+pDBg&WZ0G*i*cap0aQeroA18mrx6g)NPxcMB4EuiE#DFjF zif~_|@Lj>X{C80Ct{hSNuH;?uJE(nEgQ$L2^{(SSN9G&-nApz-nG7K z!TpbSy@>92UGF;I!SK5w#NfMucm3}On0z;Z8hbbTZsZ-zy_-eMyqkVE^$wQbEg=@) zExen5CmH544r3QTg?LWqSz4kKm`Qum6XxLzg?@tYD4QmXc&9D{GV%Tih zWC-1cU5HM@4#Rds7%=Qd^cnUV_83B{VTvI>{>g?(hKYvo!7vL;nT8pLX@>C0Fc*75e0_%hMx_g%&-(uVpweW#Za z0qQOFh6>(>Uf9ON(B1Hn3IT@x2tPw#Lmxv3B@9DQ!G=MGfrcH-zEsGEol>N<6e3J27E#4dG*x=n>s>IveQdPF^>!Zq~@aX~$&o>3(OsroVI z>lx`9YN0k$o2ZS{vp=2wsq32tYCRP?sU1|w^B=X1+De5!YA?>(L+z$^QDK-mgczg_ zQ2VJcK^;eoQAepGRLG=eAkwL6)Kn_uP(LEFsUN6WR4Ab4Bl4)9sku}rp%x>)P>ZOA zRH&p@Aj+v_)KaQsG*Cya#Y7FYnp#C*=J%CW_T#Y8kkO#gfYI+`>^JH&f?#S8whW{O zQ2nV8K@CTQQA4RAREVX=z;>h68 z;J^Sb4K5Jp24@DRc)p{-ErPf)xHh;l08gq1_TWx^G`KeaKdLXnhw4rBqDC7=8AcjL z7=|0h8zvaW8O9pM;AXgD0CNVjIRE&|8G~s9STa~dOuSq$m^bixGGPG221A$_eK}|_ zU;yI=V~DYrqXr{b?J&dTS!Ym-)lvf}G$_Et_{)5QJOd~(C`L@Y{9;gq)m#I}GRVZl=*tX)bOXpS_=p&L znQia^t0@K$XAp~t;g>N6(FTxgkYqqe7My4hkL3sh2sQ}9^5Dxrg8%~vHwZ%vy$m%7 z!K$wTco?{2V*KT!{)0aF7m>7P!slTBQ2m1Snk(Yb=y9Ab3^-FpOBY%Wa{Sr(S>wnQN z(ofe<(@)h;k+l4%pM&Wv{Y?D~eLVgWizA5A57!UV55*~e3||ay3{Q;fw_Z;!FitQI zG4?QaFg7sOFqSbEFlI0&F-9?lF#0iiFgh?=-!{E%eB1E0U%wBBb@4;d+mg4XZ*e3o z`ppCmCF#c|{YJ^iI`rG6Y}0SmhpM-gZ}Iv3ZTZ`>w@~-C7V+W7nzz+&KfTR;oAdVY zhorZOZ&#kDzD;?X{x!(``gFA{VzE9;r?%Te*>Sl-Z+ofThF&1Zz1SyAj1Ex z-&^0e5dJm{5&AadZ7}f`qTfcL4t|Jy8}Swr-o_*1-p0O-!I9tm&Fje(#s$V1#tFtQ z#yZA4#yCblM*H7N|5oz1;=gr%Tl{k5f8GDv-M{rdm7L;q`)@b@R`$24ALf3D{HEw{ zk>3C}u8`K-ngGs#! z#JJv=-l!hT>CGZ$^rrQu^k7+U39+cRpf|4v8+z-AHN9266+N#feR@!#SB{A?y;8jr zJ*d^I(ZlV(TCYm4QV*K-ny}QU*PvIg2OWCth&H`ey%wDDiyp-2MPnjDFI+E74-)kf z5b=6(da-(tu9t>L(M#4#(t~Wh4~Q(iOuY;}_^kH{k*k-Z_fZdu^a>FLdii>J*kgzu z9P1wG;`7g;?t$*UE?nwfpw4yAbWe2QPWKjZqkFA;r3)Ts28B;hh6UK!l>>D&Nr+(q&uh!)4EfLN!3Pf4?qN=$2uoRJTO8SQlz_YY^4CRl1eB(4pIoXwz-gZPA53-5x}@ZkKMS zuGf@r9f4s{N6@Hnl`p3aUAoavk*PIQiSj&$Hg=NfUPbE$K# z1CKfnhQHvr+U>!<6BJ#OhhpH2@p?bhki>C}N?ogu`a z&VWw84ovEd6R0trQJoPTnA4d>%;-$(OzFUi&Jto#XF+FP2R3y!5bHW?I;%RkvFkvt zP7WqM>SXJD(1Ajo0z|&fXPr+vP^wdcDAxI+Q=|jcI#q~DopPNr9ca+0N7U)m>eT2! zn@%gDMW>0-Y1DxQ-FY1HobIgdj4m|mHX<5y>vijNVOMVlAL4DjExk=W=+)~%bnA8L zb?Qax)PEbH6Rs1cv-*dIA6EZR|80;?@K=61zB)cSH9vUic&~8&E1>ZH$^|3zBzew{DwGs13PcFF~9X@^UcN^IDB(}*nhM4X7>%g&S5NK z%)NoxH#1n6elzuE5)B(CPv;2zZt?rFGf2?D@HR$14boA8AdTiAx0iXCPpkq zE=KkneEvM3EJ`6aoUisorXx& zP9e0DwIN&k11d{9Q#(T&K5KtMcD{C=Hk4_XB1*K2wZCXXwRRPv zQoBOCTpJp+>k)O@wc0h>_{o|U1ZoFh!e84@+gBTWw7n5t+Me1T+Hj?HsfBM5wa&H9 zwBTNgxI^7)-Dq8F;R_tbuGW^;rq+hmx)#2kRB5eXxl*e_t6ah+tw!YXcMV$g5_V{{ zBU`mvw3;RC)#^cZYjtULN;s%BAZ^^Q)hFSo)`*nDT0;^}YE4K24y$im3LNYjECt!SJnN-I(;LJJbL5)koPaayrh4bcKW zEniIdXnAXSX+f}75F$`3K+7MikDB>-wl7)q1mq4ra7)T zra7uPBFzkI4rvZzyJpQQ%}UJ*&2nkBOtVz8M3ZRJY}9Pftdpi{HET4hHLqo^WWH#^ zXU$Kzq+HD$&5xQ;q*;h4(9GA&)6CFJ*G$9iGBuMmlQa{g?PJkV7~vQp7y%f*7+x6e znkO>DukK$T%N)sEORq1a*Qc*bzAYxcJ(ApfyDz=ol3uUBUU|Lzdg--fw)xisulin1 zy`FhJ_-g3YzRaG?`0Jimy|21ob-n6*HS*f;o7Hbtz8QGk@v8k*+pFH!t*=^Mb-mt} z*_7FkX?)fEYD;EaW>u!;b^WV`SCW>suYRAS_SMRBzi&2Wi2rQ%dxw7CNIEEgUGci+ zm1M!ixY&}{k{R<}=f9S8_3?Esc9!#6GL%dlO4e)1f>U27{P#3zF8+1m>jdc>(XV4( zSG|%9B>u~AZ0k4B!2T7~GSi^paZ@ln6RK9Y5{iw00v8%D8fgjCjbbZ(P-Kz9@ zNqRjmy`Is?|2FU2Nevj(7|@V>VA!wGrvbehJ&10NE{#qNn9vwUjA@K&3`rZeX+VQU zJ*H|kYBZ`fpjD#<(X7#=(I~A~5E}4BqX=__8U-5p8c?oLhA7o2(I}QS_@n`u8X1^M z*GSVy)qq@$kBDrI4;on-C9je+5+&d1I@LJAM>LdbNfb*jOD zT0de$rcbR`4Mx<45rZ;AYJ+Mpr8bEeR~u6sRf9RTS;UykjM}ssEU7I@Dl!Xd^J=iJ zwuV?$TTxq9gB`VP#FpBo+J@THpMPI&GV!WSE#XzG8hB9LDfn5K%p>`M3_cWZM7N9= z#ghVolmLW3#gF1kfiOxaB7_o538Fw0B@)pi6F~{5KpZ6&(JK=}iKaj@B?*y8Nub12 zAcK;QNTZ}uQYinq;D}eZ4F3gq6Uau0xz;B z8DBrh?&L=j_>p}PEiyi2Z!!cC~297Bd=auT9lCXt*#h758#B8{9%P9eibayH@vIg6Z0hCK3T#3yntIfo2i$VG@k zasfG?3}xg}#Dq)Vvu_p54B6{(U`K`JLfl4_zVp2sPZpc=0V zX{xD+2ALGqWL3yg%|r~zWT>XA!Y9>SM2_l5)eovrpqh_pl*v>5tO}*7C5R@OBGp1w zs8X#|#r=;8)pFG`Rj603!&0qkjcTSY>L8&sh~wH?tQ)2iB{3O%abh*6m? z)lO9yQXN3_tM;k(s=}D+D56njM0Hpdrd1~qO)?XzY^%a6RKONP1Oz6byYY}-AC-H?yByn!inlJVnXIf^-vWqRWA_ds%NUFs&KD*hqzU} zQN30LPm%|&H+Ryb>Vqoyll&0ABp;GD2|`H0h#*oRDS!l#qzFVfDU1|Kf;dtvB8C)A ziXw2Ok`hsqG6|%35~P#T5UHdTQZfm$Ngohdq)bu<2|klPA#zDMq>m&hA{8PENcp5Z z5|oij5hbKz(iak3sa&c^*4%~4xeDB=+#(ueZd9&Sz+LqbF(~t(a<2kDs@`}Xyi^HK zRS#7NQ1wSO%J`}JszQirFrrB&NHtIuB2^<0;i_S(p{fw48jFZgjaH3Pm24vq-`{_q z^U6=dSHnjG4%GJX>1|kMPiH+Eyp&pJHmI+f2 zRfib$XvBz2lzOB(B&f$DMrGpEW7Q#5Jq3}ho}`|r4w>p1h%uRT^)z+(sGf}&m-(Qc zrA|Pe`e)Q9^<4EFb@-xQgeX)mP|sI~3iWbCnR=;ui8|D(*C49ZtJEvip;5g7F(Fg0 zUZ)Oi>aB_LUgKksJE-bfO*jC??w3FFX-%y7G^?k&i`mXwpI-IGWB2Ltg z)sNKSM*SLbrGBA)t`3jt4~Tp9JM~+2@Ye9c*E~-R4-I#Gwfp@ci+|Ok)~wc~1|KOO z2z+JelF6cEQs6V?6QWxtmy$z)B1$2mfRaziqd*y@6j4GcrhK756{Qlsr$9ZW z4$&)9OR1(n3#A#+L}{cnP@t32foP|+QCca`OX)#$$#he?C@@GFKy=IWQ~D@Cj8R5W zBa~sv5Cx_wQ;12*1ZA88^OQM6kIXD(h62l!B}A{xB4vRB8v~ZOSwT@Q?4kN6!1`U$Ib4Ma!(=dDB!E+gYs7M zQu9=UV6`Abpqjs$pBhA{g(Je$Le)alAWkh75u+BR7O4iwYDtJhwFI?zHONp)N2IBx zs-@scRm(&H zm1-4g(5Tjcs8_2~t5w@q*;Cn73H>iSDnlwQDxX#6mCy7}^-lDT^^Wuo^bYkBbmDd5 zbYgX)bz*e7m1mVdD_1LrDPJgsC~qqrDXl6EDs?OME3Lm-d()@Xq12>QtCX&krIeqLiyhP+5i`UfairBnxNCP1twbZyK$H?q zuJx`Jt{FyIu4%5xu2HVxu6Hikn%6FuE{85NE+Z~|E}bszE=?|bE^97xE`u(OF7+-A zE_E)oE_p7cE}1TgF1fh(v895iC91%R%CZW+{w%31sLZRtrpg9BJFTm%sjRBNq{;+h zOl4GMLm4rMx{zc^7ge<1u9i4q|M7!%2Ws_R4I@uUnNgPa$-}i3M?xxDdUFo{i5=M zGHfWXBi58xl~R00W9fQp}ruL?w{gdsvzLR5lPAXX&?5v>xX z5~%{oDoKb0m3Wmn706IYN2IBws-&nuj><P;ON|`o2Y(!1kTW9nvQ4%5BO}uUscZt#XYrG%Ghr z+czpVVCSXEP^nyjiR|ynmCKZ&P`N;geC0f4C{Zq!HvOVpgdKlShFs+wY4xLWwlbtC zr%I8coU9C4%9+xp8OrI(gkpyJzBt2~(y7vk(y!<1qX%IMg`AIM^6sjH3}z z#*xMm#;f0VD)lJ!DxLh;rqrs`tkj@XuT+QKRx3e?QZbIINU2b%KnW_9DiGyLWlE(= zlD+EBO7KZ37gIS(*-9U9nVCurKV)DjR0lWIWh21-?-cAONh@9{PAOI?Mk!heB9$U= zj&P+grBJ2$@8`as{r*OA?)#65$=?ktdVDkV{e|MWV$ydb(&=l(E5*d`Ru$vETT_hv z?o6>v=28)Ru2Za4#7~$Ms}-vxY*uVSHYzqK)=Su<*o_?czDu!_ka$vY0zIxcrZ_6$ zyy6^kR&iQ!O2QSzW#p3LqT+&t+lpJrO~nnxbqNm?_mO*wyNWv!o+_Roj}?y;4;8z= z&r-}(OjC?kj8k;~CgQt9#RSD<#U$x;s$z+%_c-mV=#8^_DS9e;C_<28 zAR<7~U(rv}F8161yexkE`z7SN-!ExT)1KBnuX}za`J(xi0$eM=jRM>%z?}j-D8Qov zxGT1PAM@?0Ldo|V3hN4M3MKAOirt^!uj;rzDRL*C6e7RhQ`lA5QP@`a{iC-ng-wMM zg=2*yg~R{I94PE7#C%)e{v_txe92Xw%6Fsn3!m{yunnpDCQ=?VP448&q@?oT9V=SI6f ziE@8}c}Y6a{Yk>_>3H`iaqds>@CNo4=>EiClJ#?c;_Lpz2Qy*rPeLV`5cem+?oWaw z4X+4zBp&e1^*wP%+~P)dPJlNSB+WeCpLn=GamN`Ch=C=f4gsgc3F4SIA`XdJ zg$-hzSR>|$SwiyAEfDiW^;eHymC9TwTq-OPi_+{Wu|nWlFHtPU$Lfn>kz%3bv8q(8 zK$a_(DV9nYp%{(~Qw&uMkv@`&G014eD8)z#i4Mg!^uYJ6iY*ckDGng}75fx>B`i?P zN9HMhR{SJk!nfxNX9}g?!<@ntF-c4if!~c1xiTZfFfl~L<2THMz8fR@iC&@y?{YVh zVVrK9W}IsL`=gp-oNSDz7-OZ0NO%|jF793IyBOl#7ov!$CF+SfVo@+5=oPdGes7*E zh!6z-Bj_K2{|NYpB;)@Nzkm4tqnfB9Dv1i>_crB38S$C;MC1~XLuBLH`#@w7_??w5lKK2k%&kj;)yu?S`U$q zNF!2-6gUw>dXhbz4DnDlEG#xxuE} zhP2(f+nO8fy6qsk6}H{B+@RjA4$-Jk<5ukk&2CN7W{qwQZqVV@j%ZS7b!%~h9=C2p zvqG0!ryC5q^-G)ex%IlisM`plMPb;D7;=M5w+vLPLb_X;8|1iUBReL4;cvqDdjtEyN9C+@cZ9ghG^Cq#Go-#Y@}8xy8Ccs#^-8MIqTO(G9%ZJP{sl z?rx8+@ZfsyibpkEZ(Xll@sG@P>+hR?-}w9b-+$j4*8aZwcj$0!$0lvAEw0V3(CgZR z=yvUL?R14<*CE89YrkusD@?eKBgR~bQP&Yym~)*)&A3jvPP)Rf>k?wob-{Js6*gTr z5bLh1t}Cvv=emp7aou*^a)lGuW5ki`f$P32T)JK$&Rx%3PjO%ku2Ab*gNX)(D%VO^ z$-9~|SNPVyfkFMFSQ0Q8K$af|3TtB-)scQ+U*!7ER5ze0Bn(kV!(Dv8Xzoxj( z{(a`}t$&^SyX2s3f-A(k#$m%)*BIAmY#4zNiV@-p!LC7A2y_i_^>+miS9ipt%Y)0k z3;4SFAiQ0@Ts^U=AI7;0oVlF3;NFYNG2wFLf(M;lBwuLSaY@84HYP~Fpt$X_g$*`c zHeA-FwH23?|C#(hlccp}mnEz%x-7WNOKX?^8iU_YjF#3e{`LG{@%`1mp8o3zew%N~ z1twi4u<^Ldn9C?GXb7Xb&H<=#0;9CCy%mtB}fx;skI;U!1c;WwF7m^9(kaa-MXaaE3wW0YtxZpL4G>v^lpTTAZ7mo1CHA zxe8I~T;W_U>9*dv0a@o<>s%w@xbqlt)Oo~t*co~V=WbM&bEk8MGvxo4_nYL`KR!AG zHY{+?$5Nj2XXjk!9Opm<$aemKiNgPu<(%m(`OThK*$n4&X9#f)#&n=_fV00dL^?+x z!kxpMLnRA4bUJXt*EOd-r(LHVr){S#CroZSZD4ZUY0YWXiI{SNNhg?g!XM^=tlu(! z%l$3qw-u*lrzNLFrv;~Zr#Yutrx~XSr*X-gV@{(^BTiR;eEe$dmq!-hKB-ga_hn9{ zPUk<*em(p37bp1Wl#PAw{QSWw%juI-u2YT^6gd@2Qw2`>l0M>{;*haUF;3A)0#clk z(Me8;P66C#;cS>_gbt-di!`~-~a`JQXb@FlYcJgxal+5qpJSUzN z&xohRQ{qWNJRx2ZZ;8jnW8xukx41{#D;^dPhzG@^;{Knj#f{=xah165=NeRVEV(Q>E;=qa&N@b?kBMa_pB328JAo)Sm|(2ONhTL0ax`>~w^7$5zJ{$LnX%Nx9K#$#@ix#g*f9ui<9-fs^moLcIQ+`b5quqe zaAmH^dOLbK-aFhm1b^k}_~`K9;Nj>_I7%Mpwy$m-+P=EMxW>40fJ=u92gw}g4riD+ zbvSl7!nsZyaHR!11>v7api_X8zf;>+hgd$q*vHtz*u~hv*v8nz*uYrFSaDc+zUHus zQ_BuM-#$KV`)UcN7afSUuNH7(9%Bw;)*Xb%_m=Te;6pV~vDLjwIm8 z`s{iUJ$7Aoop#V+*N*V|sm-p{4qEJ*rD(Eiu!DNLIz+8qja{`JRM}M`8f44u%Iu)j zt^~3Ctk~|09TeFWA`0yC?egq^_-ywHm1~z{_t6fr?LHtpe#)}Tw1W)0bVQn6s$Gg5 zB-SPn`66_$}E>4PAyBIr&wu_P?(k{Xd!tKHkp>`p5!FCX27l;V3^SAS}17ABI zgtwiSou?gm*tsJfMGqq4UIcfdTM?daCAt<}iQrOnfjAePiB3guB05GKi4H{vB4`vf zAnHYRqFNEOiCPgYqGnN(2)adGh)z+5s9gjDqJBi5s8`e@f)UX$;$D78G$?`z(YO?2 zqEQjdie?bgglI}MDS}1O0_s72UNk3yRnZE<`=@2mk_fg$n}`k3x@b)V`=UL>u4qTJ zErJ?RHKIyXDXI|R7E~@OlTfx)R3d_6(HBIKs8CcOf_zaP;#U5%=#vO?MLCEY`H!M( z5quC4S*T1=hA3SGX`)m_{7)&OWDz8Z5)lcacu|}PVns2CYx!tVln5e45r_uaa8Z~D zLPa5nU{R1LPy_)Ye}tdNSL7oCZ;=<`O5RiCAp&>NqY&?(@LqT)gj?YaqCxgrcqJs@ zQh0%?kUbZk3E@AI+z74(R|2>cTp&th&jn`!I2D{Ajs-`8LjeKnf;H5tU`4PjfF;2KVq1P* zFeiXn!3<(rFeR82z_?%xF)A1l3=3dLFo+ls^b7g~&?D$ZbO|~I9Rg?{pr&4MNY zGzuCJ^@2J5gCGXL7D(k1u2LmL82f*0P%u2X|q^Ci~ynqQHV%ExFAdbp@I-Z zupmefD1ZQgKf+JoEASD3x4;WQcnUlO?gDt^Kk)Gnm4C;-<--mC8ga$H%z<`FniWLli#}vGpv1AI^s`ekdY@AIuNpLm)o@G5x}y@5cvU zz7Jwn-ka~mC%}{Mftrzb=RexQgYCVoq;zL{YYR8F*N9vBE89z3xUfA(B>!|~duj_O zw#SHR`6JsyTR5=YM@-4@+3woHj_tOzvSqtz3mdlUh)MZ1+f`dwv0X+i*)G~H*uuQ+ z9AZL#mav_%g=yOEHXtQlajLWy!HrqmzZKD(ow)M79XIm?6R%2Uj3stt2hzi?s+cH}yvModq z6VD24^KGHjwggrD=VIG0wvc1{5i#*B+xCMk9!DS8zZem+eX>(y!?Aq+uz_!g6qF;W~X2S;7ZPpNd@~bv0Hb5-fETI-{ z7HsBiV9sV1F=I1rGi3vlHWP?$`Ei>u8yK}2K@8gr*$mpifK5Ll_fLH`y*AKe(=A1p zO{WcX*tAR0X47f|EjGSWHc(?zEk%_LQDFncHeXPgvPCw9Hc)O; zhRBjFwJEWI0-Jn9n|z+lXB)`2`G9DZ&$7w1floHMh~huz*nG5s44ZUBnoX)riVeiu z#37pHV{Kw=AlW8K+APr~!3Lsjq7acb5jNpA5M~pKXd>i;ZGvnd&?W$tF6(dOX9K=A zK8OZ+ZyPTg@U-zj)XTfuJX*tp^}V$OchodgIvlHuMYdEq# zl;Xg8-x~I;ccs{|-m->G>kUM${JQm;HLO~%SmQC$8u?}GC2Lr;Ucge7{Jiy?HOyMi zASRwoTTfZTg!Q9zs0G4_XgcL%($|qQ|=1y2~0mtve9OvhCJw*3fF* zB1N-xlQlG2Hz4Y*>#S?7q1w6%QE6RaU2Y9!gmoz@_fI9(#n$k}x)6~rTVS1U4LQ~y z5t*{t)>+n&XZ;zGCHu)b*BUadGbGKd)2vgiA;mfwkz}1{onQ^|)^Uhf>lo{3YlyOr zMD)o=Sch9fsC5V;*gD8M&>8}){SkiFzScg3HF#Tlp(^D)tv#&4-TILySql%mdmh~J zZV-90*SsqpobpZ(39?7LLmpi6E)a>b=e#o>?C`dwl`Y-|4-R5 zMcx7r)_H4)c-d9n3J<1ulhO(?!5inn9B)=yn&D0J@U7ecuOHdR>*e+EV2n4480HP} z26^4QE?y_EgV)Y$YPF9Z+rc%M;uvY&XlJjmi@A`)aXcDWW8ZQ+QFPp+k=0PMc0?{uY&I{u~94{6T!;9uc@gS5Jf(YgX@dA0^&GSTf z@Z5QiTnOO#Bm8)TFVBYu58QjMg)`7!P&7iPHA($W-nk_#i;VMLSs5ObZ4@5&2qf4Hv4pRftM%1-G0FW!zFk3AdR0g$qSo zq7YTU&FAKE;WPIWV(eKiH-`%!x!F>D;AU|llbeC4luzfTaUqqPf~b{G<|c6=k(+>s z=f-hkxe&vRMnrKVxe;6l=Y}C_K0vootxD>$(_mR63e4y|C{Y7epd zV%KWN3bw7b5SvyTR_j)t7a=`vT8)+%Qsln zTS1*wE#k9$ja9W3R9RIbj$Tw)m0LlXRViZoS&3D#6@0NOLJ*tJ3atvPAm1tvRr2*` zt4~&tYn6leXq9dC!3wghG7-zqGOW_AAk`{Gie#%KD@e3TK*U?cS;bmGj8!xu$|}+- z!V1Ez!VtOgp;jSQ5Ns8M=#mYz3a|oyD?db$yswpy6?j{D5hzb94=Z;oc;q~A@L2JS zd(IsPZaFuINZBjSB?m4z=ZNw@pK(q(aKbr89KJZ>9CBcvvnOq~%h}<;HfIY_`Sm7e zg9GcFHECs)v%-O8&Jv>J>qX822j)3*h|L$XoEZ)f)0`=3X_7O+fpN|l;^ga5&IkvF zIYWp+&H$&M1AUxcM7wMcr<(&^oK8fzYzL>E18tmEg!k7ioMsL*aT*Z~oO(_j2WmMr zh)&sRP8A0#ITeU6|o93I~!oNr*&F0wFegX?*+7mz z2mCm`QuuJZIpD?dL?r&?!Exun1Dm*KJh zo?=h3VS+u57-NsJN7w}Pv3sTMdf44;7-kP42H6Abem1nSTM(VvLT!O0hPthWM{A;mK}rGc@fQyVnZZ50a6fu_2wE zhDc?nu#?#k!1hP@v3=P-YzSqCAcEOJ>_9env%L_@&pg>4Y;b2kTH<|>eXzW@ggeVy z1d%I$V|i@}SC*Hk3(IrMGfOzNJVAK;bZmKK35S*kh<(dF%Uw&@vD`-F%Wqk3TEd3q zI%3Uo)pErWmMxbMpXC=V7c61kat<+TIb%6(2~(Dnh^-eBmgAN%W;u!&u^hG>vV=j) z0Rq);*=N~n2|bqGh%U=c%MMFuw`@a{eBElG|N;=NVZIpmJ%%!EFs=94iP3FYZ+q+(Uy^j2+MHGFiQxv3_%2223ZDLLV%^8 zq$2NY>0=4rmR<-?OAkwTOL(++u)uvuPIg42fn6a2fOj%4?Ojtmh zuoaIxvT27WEcTXHko&v8cAFvVcm93PhPjsYQte6kB{j6j>Bn6j(sMMIPdlMXp7T z1$?x~MtrcyvdFZ642v{Gszr)LvIQhrBqGkACRoH zs6~hc1X~1QDZs+t!p{PHEqoB(7G4&f7T{swj(A|*v+h`M%erCVp)l4J>yiZ*tTTka z{3+{%1;?x-#3Ac|wahRAonO2%nD-N%iYOIqW8tE+>Kn% zi$KL@bDz1#+-2@Cx0zeaP38u3ow>%`dAfq(CwnR9i*X^>`C^&5#9U+! zJUf>=lbdJGF;C@A=jkYOggMMS z#8D4059GRW!TroWW-oJJZcnZUht`d?UAazX2eX~o#%yJ_Fq@f8%tofV1*JJeS*-JHU~C zWbVmj`ubY>dUSJqcHm6^g^mrKS-VkR=z)uO43o{&4i_?$yq#fFCYi;XlTDwfJiO)$FV3S5vPh zUQID3854|g#u#IiF~S&T3^4{6{fs_FFQbRi&FEruGCCOTj8;YqqnXjfSdv?kYh*0S zEy^`8>KO}i3v#uLdAWJH8pfR5oLn_yR&G|Vib2fC&B#?U`d?Hq${5pf%eYc@pH9h@ zGA89p7`wO$6*Kmpeqj_b3K<2Ad`2GQGvgB@myyHx$jD}VU}P~e85xXpMj9iP;VZxQ zbXqQjk<3V9Br*~h@whhP7_p2PMl>Ue5y^;Pgfqezp^OklFr)Luid+yQkP$#I{26`> zUxp7hp8b0FsW)Rv&Wqv6@L;$z9?c)j@6GSbZ_RJaug$N_FU>E^&&|)wPt8xvkIj$F z56utE_s#drcg@G-#^iR)x6QZAH_bQ9`(CV@ubHo!ub3~JFPSfzFPP7p&zVok&6gXl?ANBR6Wc_jJT;*lfsb&}_i0 z->lE9*R02^+pNp1)2zd+-3+4tN<{q?pK@DXG@8|$N&d+Y4E=l8zvIjN|ET`=l7E*Z zq}49DPPzX*(Q4LWCPlMZhg^qTlNtW+m`t+_Gko7^mS&b}=JRceS+g7ji@{F}9%678 z!=oeIJHn+STsXp+BOE)zp(7kP!l@$xCyuc1m}Hh{mS7fd7Ht+~7GoA^COO}rQZB-5 z^$+1@VP^P$&&=-svigTS1<45m3;!hf82W*JPX{kEPh6~rnY-B|9sJCE5m$foG4nQq z5VK%JkXfKvfZ4dpnXZ1^n80k zKc~YP{gf^_x8Q_+Oot=-A>x3(Pv4`%7JZYxL5Fqv8XZ>YEA(YLEYY*%7U{4+pQmrr zVU9japP^6FVTwLMAE%GeVU!LdbQq??5Pgt7K!+r`etI7rdg(p%ZaQ?)3FxGE(A(+I zMsKCJ(4m>$L~o=+1HGPJM~7N^4ZWIPMNjzedH)ww(ktk&`(MlHW%N=>MG4l6f-e8FWaer_odCkU~$Eq>|`~^jNcM zLQZ<_#*+kk99?>n2cGmo5B)E(^eDOq{m%5(^v3ks^vd+o^uqMq^vv|s^u+Yo^vLwk z^uToAbkB6xblY^xbklU*bk%g(bkTI)bk=m*bkcO(bkua%bjWnjw9&M|wBEGNwBNMX zw8ymDw9B-^wB5ALwAHl5wAr-wznRvUR-0CtR+?6rmYbHDmYSBB7Mp%CEix@MEr{X_ z{!GM~#+xRZMwv#N#+rtjhL{GM2AKw$Mw&*LhMR_&uG2PXTeJXEe^WnGUsE4bZ&NQ* zPg4(5chg7O1MQx6N4urn(5`7$v`g9r?VNT-JEfh_j%i15OFXsfgp z+9GY1Hcy+QEzrhkle7ui46UCwOwa~sW3)C}3$2OPK&zv*(wb?Fw0c@Ct&i42>!S72 zx@n!X4q7{{hE`20r&Z7@X;ri`S}CoBR!sXsE20(B3TSz>&$LgpTv`t8BQ2ZuftEo_ zqovT2XbH4&VI4_^#2*FPgkEx+Wu$flIcv^^3(rw`Ted%(86h9 zG%woPKd=3>`yU?OOR{+XC6|Nu`|rbl{J&ZI4!EYS?{V&ZF9Q-Fkc5Pp1aaX4w{`KH zwN@03T1|qhty`hh4qFARZLJfEdR%S5YTW{&#?}RnI*XvSZUuL(1FU=g&wVdJZEgGg z{{G*OE$_bj?mYM2v(L@UkjshdTFeZY5hCRtPdu7&krocH*qW%*3w~(-WU@GZSYdPETZ^hC-5IW~Gf~`k5c?+>bE(zI<`1AJ5n`s^e4?H%+LI1 z>5rO!HP6uRH*a*f9H3w1$aZ8ooS0hT*lAwu_|B1`U*TBpSmsz-S!+qiTz!UqHGW^^ zSn2Sz@w+M8zSop$e`b4XTi`fg`piDjo@NKfE!}eaGW$|{%J=pq_LK6(_V4VA?ALXN zOw;Yt>{IPu*~@jmnikp@*yr2l*}*=?KHEOao@xKuo?%b7=LMG7i|s}BpY7-A0sDUY zebYVD6WwFoBc02>!T!+nz=Xeor+BFQ!M@Rc58sfSTG!e0?Q89M_FQ|8eT{uJ_PNTw z(!K(PuIr}jrv3N>Xw$g$_Gz58+;kIP8DMXiuKWM_^{(l*`|BJJKB+%^S@#9Wxx$98(=r9M;K>FCAYvK6m7pbIg-c9G^KRI?^1e4(l`f zQ~P84Bl|=91N(jZJ*1KL+x9=~x9k=6a{EpD4Li2G(tO>1&HlUns{J?n6?=hwn|-T& zi+!_wll@2O^JV)b`$hW&`+560`yTsl`%m^=_MP?}_U-n=rkVB`_6w%-rgNq;Q>p2! z>5QqwFXgo9lHq}yue)HUu63H6}bmZU)ZHZ zo^PIKo@)jyImcXVn*54f>lyoLyY-a)B--=r$5B;aKZ=sF`3U}=G5#K(`4{$NUbcsE zW8tInzeA>9P1E)J%o`l*9c*`xovWXw-)mmy$ah%p+OXIkwme6!BggTB$y#A6xBXyx z#tXpl?Z8mFx&3edYJ#4ccvHfDR z{%Ql0^_cCb&3eLi+-5yxJ883?wpj~p*6lXyH~2%JHtTeg)oHV4*{sWK)@++~k7VvW-}>mJ)~+fTM#ww<;eHtSxSbssB?jpEQ!ZPqj!sv7RdKC?}Ywx>kQLO+YH-u+ccXs-Db_OSy$Pt2W{3hHfxSlIM0^LO6A+u z+N|qr)>)v zt>|lg-1kx6hxk4v$u)XOzyb3n$B&N3QT~OF1C9d6K}V6}X9pI%VYB|x_fFpjebvO~ zGy8|l-d9pShqNn0wUA^~t6={Tl{$0gu^9Tx+RVaZCi$_ohrBe0GcO%;ge}WC>|6Ygi zkj1jSSOJzPrqptkSth<>XRHzSMQTJWjRR_R(wLchvVP?_e>-{9{Ct3aJG@UiRrc&9 z_H1T7tBK0&B|IZta8_QzN6A6~_BYHzXo`UF5x5V=L^5EAAdBRa+vA83G>cD#;MDh9C&_x8=qFH0p8GaH`kDPMV0u1PaN;e|Se%osPhkd2?y98 zFU|LvvFAGlrJBS>BE6!#)YQ|?%*^!j*Rh2O7iubYU1u$XKv`seT`(WX;jk?{?i%u% zmzM@>^8%l2;b64>YLHU6fK6-W=^^9BEM2DW#eA|Zzwn}rkiD6^FO8EgIqcOjQtsS# zC5#v|`(0Ma)?w)%Ge=);NU0ZSmdFj6n=dQL63Cc#J_xpLYO01)E6xXkGkBmp^V#L0 zbSe)4sjH1J%tN5{qDIr~; zY-Uia%u~OmlB7(>)y^ayCOG>WG7GNu#|+Ewtw?-k|KHb=vzgj!kz_ICwcM>(rZODHzzaqdML?0*OcvIHHf>4CmT0z=Oyas`E z$?SJCs>$AkRRp48pX61%1=7KnhM0MaTv}?JaFWG`rE$Uval&#l#Yy+b{PCtq@%hpq zL51nkn^hFc9_ zMJw__=A4Q+9M#c^8sU4yIeFn+J+t!`uDSCllyqwx3{y|0sWRhk`CyICw?e``3=smQ z36K!?fVJX))ta&SX}5Y21pl!=y5M@Ox!K&1-}3fiD(~AqlK9G@V6q}4liZt3`eshK zXT}mG8v=qd3-8?~lQK8lpMihdKZqnnnL{2t<`)xzgXHcOLuSgu+Sv7~hf{FPGw4`d ze&CTDTrqQxPr`ha^Y%vP~lsp15Q}fN(e?%&gG#%#3(a zkMxIx(Zt|Q@uQcS*Yt+0VfBLP<29ga5d0cE8dguAf9y$JLQm)+;COvqX4o?=Ii4T$ z><;0&2y!S)eXNDBQ;~ko(knPA!1-!$V1o&1kKdKfim?Gi3q{weMyfc$TO0+^bb*_M zgkUirO4{Qit?gJXq=Fw0gDDw|8QDS8v~Z4+k1=iMNN0R3lO6*qWLi-0q$y^_@g$C% zgEXF0$G6z5ep-m@ui~MACp9qtHz_|rhM$i?GZ{j#ix31EV>vCP%Sdf}GqATtzMNq6 zj7%^}1;X2hgh7m)O~xh2NgZ597_GpO#KR^9c^}{EDG44b7^Nf&8y3$ zF-MT9Dz(6QnuPA&V%I#x%#9C%Ro)~351{3UsvQ)ZuGbpqP=6it^dVWed>Nxi7_|K3 zupgLJ#NbyxTP_^&67oK$X1S&(2-k6Oi(e;tG8f3VN()`J1y1F8*C96`pz&3M+RP!o zO8q9x?1k%CW@%vHy#!oIq9%*vkB@PhG-GDjwYqRrO@?zxk-U>UiX=Md<4YRjMACi9 zr#PyjYQzBX{zO704OL3_exjOqxZzJ`Vzr9X-L+79@99YLnvKqlEIsSqyycng0$1;TEiRDNH4nV56FFJ3uc+*t*Tl$ z^U&50ZfQtozn%F=T(Xu#F)CV`4{58_k@8Z^({uxi+!WUA6#KsJd-h%2;Y1n{mc=p& z0+CK64RNDAfm zN)~UC2?Ua7QZ4k;lL@30&ge-;pDqF?b;3CdyGM{J&^-v(r3(xRA~mJu4RWTIS0#35 zxuPl_i~s{ULncDGfe7lPNKUx_?AbF#S6>dc)v8|&sV}dk+z7<^mJMbj;zt-2DsI5lp=38M-`Fsc#&s2xv(t?R(1eq!BHC{V z!@`LV&Osq~LtZG+!;En9x%?Y~89vU0U=tqB+7YB4o&^<@rJmP9{vEXrK93;1F-r}_ zCIqE#Ao=VH_bp@yJ_baJkCLJRS~wj^da|q&zFO!| zg_M)N&?JhC!N;m7QVSo)qHxjUA*3o9iStIVjQv9k-&7^N@J%kgc~>L7u#NuJNIS9z zmQ*7NBn$3UBYUu3L3PqrUgZA*9Kveg29JmFHAq`h1cf!oC-|0n=avDiHAynI^HWXo zHfGg|CX=xb4QQyw06$0LvFQqL)FQLUBsg1(Ou@&n+6ez5S9)#oIpq=C^N@C_uO8ym zRTa>v9{Cc7zoi~wDE~}7?4~R9jUh4em1-P~9x5hu)WUZ$qz~pN=$dIk6HDe{qbp*` zG<-CvPa^pug1D=!PMFq}RG)l7c+LwESBbZ`9{d}U9D=*5A=%Ax!=zkiBbMvx+876m zy&h;nQc0GpOH(qLh?~O##Z5>!+-pV#vRaWa;8r_5TuXje3FBTvbe9D;UL#|09it%I zRci3A%C>~2pHLN&2i7!rS98BsdtsGh`ZtPp)owv1u@3WEl0h_!K-!{rf}vh3@-BzH zIFq;Xh*)x$X8OYBR%8hddthraf^uFE`>>`CF0@7%aL_7_49CZcI086@HUeo$NCBj_ z!M%bMu!~U(kJ}KJcuqASJYArJ18qqc95PNX*wvsNo)Yn+77{iz*1?qac+Run*Y>2j zdWS~Pc~Auev>~svO=T}iD%V8uC5)CTD=-OpF}jYH|+ltJCA|iI+1S? z;Y@ymbmrM%g)DQB4t{?_L_@E47SWIb(NMNINDJR~CX?hp`d~2%1BS$Fq4}Ex*(%6r zfaiC@o8swQ{bnT^k`7%=yQ*Q39v9EU)Vwpk@OBq6>aR4w9FGW2qya(DKiD@8a%Tto zI%}0w!DZ?evhy{L*K~*Mb1Q-^bJsBD&kKc#11mkL(#llssuIYPzxf*M>qu{WLUzD_H+&-?=51X7B<&*#25%;o4|~@^wgmf5{c;`QvpE5JQ8=I7pjM-XPOK$R!rI_$Z<$9J7(J*hcI~#Uv>G z*sl(~&jC`v*JP_URMpG?a$Qjymz4z}>rz!Ms|I9Fl|Vpwret za+B_n@@d#Jat#%uvj9=&mc~PYXNd0W7vL1Us%{M{p zRL+tUHJCKZ#HX?f@*-ZtBWV=s2#{S?4%2)CiTy}5VL_;c^K4N*#LP)z4DL0N2h`-~ zJ-h-hiU_!WX-)2}NFUswjd0r*-GyEKNEDe5SNq`+m=CJ{q)*s=?BDFu%FW=Qn8eme z5C@z9sr^ayM&i^G1chgBx|tnh?N9T<6|7#9^BOPC0~2koC?vO$N&-`~h-5vvM+1#`_q(@r)V9Fp8Lkm@4xvCF` z)K)`6K=XU5pR?bQXc7Y3M)jxynxgrE{=DE3Jb4js^n05`BHpMt)4+o_x*>!SZ)CqM z;*FUb9~pQitwBjISr|kp-}DCh4%vbG>8E!{2@=z}?~-n$2NYkzL-picqEhTT7{Fvi zNPaTZ2-OFZAo2+e*!TwWTAyjXeW~D)Q8_^YmKLkE@abUE1Y01lUotqmMN}g^92|^5 z=>m@ilQ8lDl;jN126<#i{v{a_gdrkknpTT9^4^G;AZJKx1Eey`-k%l}h5>Lhw zFbAJ+<1GHU3JG$WEm6b|-XBH+aUrNPrL_eyDEESBQaHU#r;V`?sYQXW#042XO>}St zE8^txHZ?Lh3y}M&4(Z+Rgo1TASxYY>k0mz+LBt5slD(8w1O&nRBgoc(Wq&Yz0g{Fq zlz%=V`2DeMF#J9e$-F4$2!7ummIH@D4fzuCuG28Z)LEf;9D4(qN<=9&A*8+zVx|%m_}!o*T_H)Bjoel7Fy!KMF7}l{ zxA*Wqi@uOF95a4@kGRNs`0jmTB@5v`dn|x1V~ABgUuB^J;u>S~U?>T0D3}_m z1NB(anjC;P$0E_f-M+e?0X`o~TEW2&72nDCQmo|#*?p$#pruaL7wowPSQzxiWd*6S>Z<1O3i*qcao{D9b*xT)5+InmqdmIBDEI} z{A9$Snr^5jA&~L*J{@%XkjR5h{eH*`Q6CCNS1MEGze9Fs-(d9RLWj@wu3tVR^>}_Z5q#jOi3CAw%ctHxD%QJZB0;%;?MffDIGUYa z$N(gKN(8^P&%A}pyl`_#1Y)tCko74+Q2+`)C83J78v~Ic>g_ChR!v%@!d%4d-N)no zQU@Ngy@9G$VWXHrm4lG}un2^8K1SHMw7156!hIK47JU4m2m;PF&~mI?;nu-gCxzkBtWXX$$e8v>0fkUsi#ZA8pdR`SNm4ib;ALI_PY*A= z)Q`Ar@eH|#CUqbTsRJ=SoD!G6B%2RGM3~U*p^;PK!6ieJQXw&wd`OG)VZf+2!_*3P zD1~B1I=VqwJ9%`<+b;;Cq8bwwlt>E~FBNH_DCbW8u2POgmQIAT*h1x!J(puydDOSo zphMg=Mj;($fqgK`1Be$gD{jG*FlGg|J-qDg%1a~O6q#T-?$-488tULMUe|@PMAu#e zzre@Vv{9&Ma+RfxdXE5nLFQJnY@*H&lCuLD%O=#;c~CFYB_ZlH*A8YZn@~Gg)cfU4 z8*GO7gzj+&_L&LYBMeDyX30HDGm>iDEj=JDb*Mqfi7I7Wx_U8kJ=U-^#ai|A#-dq#KyqR`q^Vxy@W z{+WS%ydDqDvi0JjnY`f@45aJ&d=v8aay0Z}LJCPfkL?LK03^!kLAnH@(I~ zUa2`8lC-hA0daSzoO}#Ioij!>-7G4JXiQO>6Al3sWFbR8A1pd`h$uc1NZ=B1 z=GmfPo=V;@LaV#fggvG$@zKHqom!0uf`rSquaaqIIP(Ikl2GtlM2-a|SvV1jRHE2; z1~|=50s)D4UY8hF+jrzFiFc)xnBHMC$XVru=C5Vw^0 z;mUPgO5R5`67i^!2yDBQ90Yj%u(nb=r$Fr-T}CqLE*(_N@H0ZrGEp=`fo(rMqpo7Wn|yC&t4afIxGXKRT= zzH@Dfm*yZ0%tsAaJQU~S62(KAVW0t$*P+Z34+qzgU-(S4(m4AcuR_ATeIynhhg-4X zU=S1^d20|Xj76?*&X1gp&ia=FkiG$jd|NsI3tx2rAm%nw**CAzuOMS1a-%PES-)@a z{hx7J(Bwzr=bhA;@@6m9JRPKss;z_c%jaK%@;xdAGxIgM*V!MGC{QqCfBI{t`?F_LEE_i* zI^}6g1;0zv!1`S@=i^23(-Kz9#I!yQAUdbTO^#=BT8`Qe!LF0^fp@{WUrWEnW63l zpX?=XhR;`v6wU0FjV996)B>i#_6k8_Ml}y3;KE)~vnm$hknctEMl=i5^U>;AbLNk&#=Wp)DkD{Ck-)Oc+sSXANP|5NRZq-jeEVZ z_vfNY@&RPgySVZWkj2a<s?HYp}6ST?GoF&n;|73SwEE6uBTVmaf{%`%b*lujk02T8BABF+9X*0X zZVKFyGA$6$EL;b*e?>HK7&`qbmaHO`O!<`<$u^janT9SxRjG?g1{1qT{RR&HiW1O0 z4irZb5hJH%(HLE*_2CHav9`xZ8)=Wd?Yer5G-uk~5^Z$@v^+s#u&`y%`&#(qX=D(j zjHoS#Z%z92E+&Wj{+H3~k`;_;ez*WnXn2I01l_K?@!V1O8IfeQLf9O(n; zr^stsNzc<1jljs7H^fK!3OIcVMX^or>=f!`w?fEi6#frG^V6h0eJX>|r%4AS_8U%< zQKYN0e7^~o_q8*m2kGjXafSqQk}^K8*iR1yWn?xAhP}>V1M#j8&!KW1Sz-PHj%N~N zULaAlh=3_K!Qd*sfR-I`XJtg8HR91lQRJ_FiFCwF6~s11i`k@0NZe3Vz9iDtKQ56t z{N@KWFA)>;yiBU$H)gtY&Ag17ckEB|8!2V9zTztO+XW{4E-LW${7yQfWy!6RR)YUK zXY^428ZlszH?E0RC-*Lu!?)j!4uZUEV$;X2iKJC_oz$|-SfJ4K7lJGI4l|;wgb;C8 zv6HwL60Vbw(79RrPKVMlSPjhxv>=o%yXAoLmYc#LsjfE< z*FNuNbRIm4#w1s_8)O3^(;%a0Ohc&GM;Fhg(nrTkyVBt;CyCDwuZNpNZvbgDnl4UZ zh#3`{uUFtM!HpL;epFo_NqtE)xB=5E#0^+7C|uM%c69mNB9WBNii3=-`c0rT9~rOG zDy7ko)LiZhIk(a3f>wG`90a8uwLILsO-5rzzdPhDM6(<3kSdh|D6JGgsVIP^C3%~{ zFOd3slNVK7nkf;zN-!MF6eu@1Blu zaD`dWqwEu~uD%{tuJ`d#eD;M&kYmnocabk!3dVcHteCUcEHuKr*7q>)6BvDu)Iqt` zM_SFl8<8ltDk|kxUKETKjq1RYdqj!w$3dbt!8g#&&C3K)m`8r#L$KUO2#*EfKAsT@ zv+t8pKH~&`sl09hx(0+ovEQ>Wl}ymM*K9g;eSjx@9Hc%#Hgz8CXK&r%@q>SXu1Y61 zfFht~APhhdR?7I#p=x*;s(N>qgJ9)Dlp5R+)doq~9*82ygJ8fTq#F^Bh*Gg;qDfF7 z1nWE!p=y6b%qlljv1BmBK0+18H;;%8!JGdG?Uo-v8CEuXGy&ph{tlwjsX$>8&*Ni6 zKp(<8k3|4}{+N7(0DStGG^7`nf|}4iF#QRV&qXlz3F?{RA?{Q|oga$Lk>coi1j8Nh ze@eQt4f>RHK(I$iVAnu;Ph`z6zSY2lV6W#Qs31qFloM(}vVv-7-=Jai)G{{KK{(7L zLapj}{8~q9%pWp>19VCpCWo1IA#HtqEj%N%iPT0tNXUJng{~Au>TxiE(hlSf?4pzn zQQ)X&i0|XavmEVUI!T0v?on25!$#sT8TT*^+VMEX`7nZ~0zzaBPaD##WpII~!*Fa} zWt4edERazP_OeArM`4-Ta@v6#C$xa-3fjW2rF+VEc^qv^Ho+=zPEOlk|5X(@xVtby zK|fWTBlx+%OB(#i8;|^WRF%7dnWCiL{5YY|3rapbidGgSjkVygx4Vr${*~k2;q}76 zZz*X_R3nCY)B1P}x_Z;7e?~GZys0X3pzxEsRn-3$ry1s10^HN^rC%}Q3uUg&kA@}uAx7*R8j`J zKaD}kFx{U{T(bxnvu9p| zv_0}F5FA85lCN1W_jqpY3ZgIRHqm@?Xol)P)@=@j*+$x#rmhFe=V*I-W~4HCDk|1A z-JAo48b~xrhCJRsC{z$LU!i_JwSm=)P>Xg=;S{PQP|b}(u@SPK)l@4)woY>vHp|sU zx%f2!BIdOkB`2Oc>Ku*Ab-j)a`$ZQhwA_rTdSHT1`t>b2=U8QD^phDHMa+rHYa#8chY0&9X+6&Ia(k0|;m{gy}q79(L-`fBMi|Z@A1!l{$Ft=jM z1HBPizZL2STmx!&VFxg?Z1o0|ISH3VE;7KV22@FUvxDsREKQGWP#;Q}c(&&(?kky3FV;eU`9?kZw0@OA?CHQ6q z{(0k8j7DY8!lo3RRzYZiY=6J3Ksg)x)H&|459oMUr$yBjvq2t;!(nLi8f{AF=D??~(H15# z{2~(7rD!z6Kn!O1LK~hkl7*dMvtN#JC2 z8p3+I*POPfEe4jz8SZ3(C1x3>)V!)Pf>c z6EO@1#ZT+xaaXCEW!o4wW2zWCzeFvjwOLHt!N{)I2c|U46JWOW9Y&h zxZH|%r+f0Cd25=_p5?7+Pd4|CadZiLzY#}+Svger?v9eC=|xj2qg9B2+AJ}Gh4b`v z8*OHxQs4@qacEsuU>UD5kurC<3QTH4UH+aq@E8=s#{EWH`c6j?NNl=NM2;B$<0axv zrnr=eAwJ@2bwX`wocM}cMmAg|SyCvF3?I<(O=f$`N@qrx-i*0~&sltud|8-hLv5s|`o&!@}r*$Kw_%tlbiDhyA;t<`zYVhmpv}Qwh1#uOzf2NtI z0-GnofWhbal+DCUhoRp90;NGGT9@K;P$wD_!J0!Dzceg3Kr=ZSpF;o{YL%)~9tdfxnPqGVaaZ#U zt}Fmige$||B0>}^iin5B3PPh^o23{$7XQUU1=#{%PcKF#ip@bbP zG@efT8_1x|9>e@zgiHu@=t^yF@OUxAQVAZ0RavN?2Ru8w(jRoM3gdHSbfb+4ed_Pp zn?Ms7QfZ~6oxM2nn}l|2Kl#>Ao}*StktVa>@?Mh%yCY z_nZxa;Ddd`T{ni%G9o#-IVIP&CG;+`acXp?s5JuFyirg*>w?j_%C|PgrOX{cH5kvZ zd;}dq7vT!1YrQuA8&YM?m^Yt9WP|X z>Ni7!^(+Gq^G4C8Bm;;-VT7xrXe*k24WdV*P?>@L5oMU!?UcTeY(J&bfJReQ>YQR z@*!&IvLWyz+7`?A`iKr!6(IjEHO@oUwiQ8s$TRqhNUc+oEaMwBxp`# zFb~2w6eqd>IgzS`vEy*yT|l$`9i7WLj&>z(!K5AH3MQC5`UF)`10nBWeUD7SzM!{N z%TGm_B>U4UD3gfJX#;|z!l1lLrV9PvKw}Zw^I`@vHFsfY10$!pxXEco?)aCOf zy-Eq^y7LuHqj>aQbkv&hmEV6ZNJH*)`Z-PwyX^sA&A{-xB(TgB6~!3D^&!4poQd8S zmGN5`f0IrV>HRFoN~aN3qz%4`IRi+^WzUm~r6iQ4BihP!gL<)t|2cI6-E_Mbrx>ehftW&T?+$e z(NWFCzEdf7GMWCh_em`5PwGAOdGawUo_@`xnoZ|d_WqZ_iM>m?uxAb(fxR~Z6qz4F zBG72Gvwj7*&huFegtPFl47CnB0AYgO1XHhJAm&^#-E=OkhPwNHb8*4v!?d}yBNiyM zKh(o-EDQI#>yi$l=b_X8Vi4xhQ@HH0BMf>NmOU6_6H(9CIz+QE*Aqvw7*ptv7E4do zhvGK({b0rXzo@-7KKRdF`i8=|g*2qm$H?L$9c2;_@;S3)k)GsS8OohE{qX}bX=u5? zb;G~tLP9hj!`_9oI=$%+w-(a%h-{aAL%+gD{cq_opE-xUge{9LnuQcHtW^yW!ZOUk zLxY`poIX9GqUH%AvB8!`uznHUO4h-c?@$<;5`7CPG%tCGZU@a4(=5<9F@6dIshqSW0#q0#*Sq*EI$5N^BXFN&Wm7#j0;{kfVK|sg zFTt)Lq(s%w+403whAPADGyX$$RowShlaxXC-aI zAhETx9>%Q{tEJsVx5w>LT4)-scloTMQy7HM2_(q1ay6a%f+tAd9BN0e4|njk$2QFg zQuH<>16s*r;&Kk{iUr+9`R4^C>m)0vmkJKfrOcz_pZrK9s_~*nM`;0E$))X4>sL1q zg$`8o_06NPOvg7pPxLNaokv5^QzKNW`d3elx}aW5m8?S0T53Wf6b{*BFNO{Jz&g1&Eii&AA)O1DFpMaOFm`nVR-MIo_Ex$%M+N8QWr4M7-jQ1C4p#QIiCQH#85+zw>m`ayPxTo34@)z($8gUUJVYQQC**I=bJLI*jQ ze5yl>-Lw_vMts?`3LZx1Zk%#gsCci57V7SyZy>E2s? z>HVMGPR~aCS8k{8xNcoSPL<38?g|2#LYphJ4Zl>502RhGG=TF8TB(*o;T8HL8u4Tp z(H3whw1H9Xz8``JbIvG*<6gq_)sh$K{@?KUjD&=Jg`uk3hdAa%inY9m&=*g^iUVc19G$Bz^*exmlbEGfAQA)${0_3p`oKhP6x#axMIWt|0$A$LjHS>0cbH<*tIev;&hW56);^6JqXDA6cRpC=;9i zb&%7iPb3M1!S`txb67xkdMLXyK?@7-Q>9pplioMqr)uhyJ1sw>rXM!VY#j)H+^2`| zC?m#$0js{%!`TOPg={FkV<6AyJvvzQkXFN)qFBTN=FdE&pW=D7J))QK(e^Q(=pv~5 zg!Uluv(w7a4ZfP5hxt!XBAB)U3ZBqLK5r)NML)RVy zW$0yv_VdxXQ-jslF70Q^F2o1NE}^SW#31MN#F|6_51M!;U!>Suji2=p6EIj ziGsolMut>@(%J)AyxNOlIw-P8VLCT`I5oY06rT8S2mizmEhyIf=Te7D?#s>gaiy5K zlRh5d20d15alKjGdP$5?2d8UsEN;C?ZH~pQe^;BEMmSeY9S$SmyTI1F-coo1yF>^s z)a72M=K>(_tRfuDCHg)tt&wvOvKf+txrzK#cJ)M8CE|DA5DuNsVOt2-0b?5EpOxzIGg&(?& z_3s1)=?XIz&QPI@9aoQ=FIg^ox?*Cup=_$%ipSK1#(i|Hy(J$wWR*ZwAES0KRQ)`1 zYR&6&j1zn^x3Ph_Lt!ArU6qy-vbMmc`dlPEOy*Rii=2m#+qVbfx{oJ3=TXEEHLQp{ z3h_zSt9Z9x8*3_Ie0@T<|xnwB(+?Z>H!}Y|!FoK!4Rf7>V=R)hjR?c4zsZF?j z|I4#5Gj52lWNXI}`e;`F&yK?=@ZIq+*fs4nZaI|{R<%04EG8h~n)2+w5wX(V;P%i} zS0MYtfJphOE23vWN;hp7%oVJN2^H}ns zShkEMmy2ZsPAY24{t(LsOl?|Qc1kQ8^MQA5*&eaL0G9k}RtUDR=Hr0cvh|Z#V`o1O zsKZ}pnVNB!S+ScX1(y6ntYwMkYRkS9leL;F!hN!E&`9U}HHGkTJjeWZ1EA$nzOgD$ z+K|hv<qxffT5pXH6%tLWTGyzHbGXOQPm?7_!b zA*)HWQp75qUVV@f{Z#skUoHI1%Xjg*2?DloDid#;B4I^ z3Vljb-{N@Dy(|!~a3OfR+N91h*ji2D2RUzX2C>^1v0G+VKl~PsYCDiVoEfds$(yo7 zKD^*pO*`oJ#xEEG-&m`GMlHE~{xc3GEYgkF&1uEGN6!-|{I+@!B*ydpFs~I7no%(R zn#>3XT65m;FrE*DYOOgVqT<%AxiR?hY)mr@DUauU;7DsOntV1VjvFf*#rS7u!aRz@ zoF0cGnS^(n@p14dj%$QZO0|BSAS^nUG;{rrXANo zK8eFoXfP_#*9d{_xuDR}f)dovgt~FFTo8eccUn=+RA}3t8&8fxVSBDY=(O!Gmy;xR zR?Y?f9k>+qK%LovYY=v2+sox7ft{6`Mj^J#P#xUr!1b4}XIkl?1+mo;7{fbqp`nZa zR8NWnVfAt$yCe4(J0b~;JBGR=47hr?j}?l4Q_8@vFV}(2!RrE2uuxuv=*R8-yol-Ik zHBlLew=s$h2ww5bRL5$gRa-PxyKmVL83?Ar2$$}*zD=5p!WSkcaf2fd9FsV1PI7g-xDpp);qm=A2@PHlf>`C1vBU|Hndw4(~u13ZK5u&0%}X6m5X$F-3$u{&ho=ooG!QZEjI z`=723qsAfzLJgS}jd#T|5{2I5o&XF{(UXcrv>^K)OAvMsBM<^W!tlu=y^eZJtr`Q7X`kGv@jw65u2a3@$i zA49MiJ+En9DU-Rj90Fs{afxb_xRc&XI2(R z^f1%OMW8&i#>okI=*yi5oX6K-P!`wFxQYe%i;g+yP*H=1F+~q2?A!u5SzObqS>jjC zALz~{=?Og)RxGnml>RtKYo`o$)~R2Gs30br^U-(lcs3Lb+g+S^1Ku$+sxo$Q7T+l(L{NH6CXf{3qw|(a_s^n{pk%&654qp#+4BQ^e!ID7zj@y%g*|fN^isS<1!r0Dks=6I??xTc{#~$XH=^kiaAG%C zOYv*Eq)PXo^#Qfo#9`>G78U8CYK7~wJxrbRO7wPqEn@Kh2ED=M{oHnm8H@ni1apg* zIKm-6bA4#V1=#U3Duw3aJ(oWt6TcO$5i25$U@zj{hOK@0aGu>m0^5qXd6kL^>5iAt zGV}%i^dRShn!Eq(q8C3t!UxpFoHt(cBE><5KC!}qDv5qMrY|?AZwOn!1T9~*? zb|2wP)kk_9Khex5v5V4Gz=(i_Gr57t0`?Z&uFL!z=tDi?rTaN-}+8L%N&c^M)OeCp0~ zAELU@HSGc?Bm7i$<5b1Pj(S*ekxR$o%`dTj@$RiFhT~^&I0tZt4X|x;guK#9?^<8MwI)dZ?%YC| zc_(CjSJoT8`2&w_DhhV&%3~=w2NFWsu-Kddfo%*Se;1mQwE;4g`9{gJkfvZz4x%F? zo$NTR~;o^C-pLOiY^*``eN>!Glqy+2_9dp=T+{btb31(lHW)97h#dL zRTYie>nFL`iS5tOTLjpX)7K55$5)TqadX*shAEPYL9# zQyZkb1klXHs{!Jn+au19a%wNiGfXZKE{G|ispP1P!ZA}@ud#Z--rVkV+c zfn6;nS@8bV|-3kER3W8lFPf-}>`XIXzds-JXJA#iz z)WZz@&W>a2k?;uV!W%Svi+X1-f!X_acnRO3y`Mvb)NRe4Am~JfzF_Y!|Ebd6Kl=#( zlDS{4V8(vg-x&J~{Q0_&b>osA#&7yUwD`xs`K$a(L58S>I5qdb&_cM%INl?LEq_4( zyD8)UQ2_ga%z;h{ej;(f0R`WSZs$O_9f&dKzedTRg_39P5QML4fNzw1wBPq%`3NNu z!l9eNV)WG!B_F9;o@JK&AI>fZ4CSti&S&l^ne#%pVz z$)KzwPQKimXV<1Z^5)y)HWz&OO)SFxsSn?oJ)h(>t8Sdcl#^aeTV*Exs1jl#5N^-{ z*Ax}6U}WrTH9wEiiD+hS$s3`)KOc!L4q=aekg-+6gwDK+%@UkBOE{ElP!DvTV$2Z! zbcqfgYj}S-Qe)05(RPN_DY7_gFX?rixk9-+shaQnJ!Wg3Ed|^v>vZqj9)OS6$xr5tgDP2-7Lk9 zqNlRx9Pc^f>^MtjoH@Tpn1ZSQ*!9B<)ogqq9p@8zel=U!uY&lY?0Gwg@1&Y|Qz=9V zn`SFC1Eilk;N=2F5Dqf%?~$&MHM*w`t{V6On10j9qhArkjI3sWeMbI$%xV?PxAK!N ztj%H}GR%>8N-$s5GSEYB?_*&fh#iC?vO1Jc z!b7M6VL+J$vO;<0x}b)#WV|=M>u1goH92#5C|w~6Ep6rC3EeqbGp#v+QRlPqW< zLcu2zvC$`x7l{WKaed8aLH`^(k8_Itf3$sfU=+pscXn@Q@6s>1yYzAip_e4|Dp`;s z5FjX`D3Aau9YT|)Ndy!S1qAXSEeT2y5D0>YN>vm^zyuIcT0)nWpdhG}_cOD5m!Q7i zpWnCqliTdh%+ActJoD7ggQer=Ib?MO=f4<^K?@Vg#D-#0<22PB$Da^3uWZuu^Q3g3;O zD&{cR+^9BPO%N1z_l3(GI`w4=s)~I*j_OoZYN;ZAJ_J^hm=HJv7sm%_^!DW6&9o!r z?O@lzs>-umfUaI$$;OgfQypX*juzURs*S>GD8B*EH?XGi0B(LI&1ygsP_>rw6Wsi2 zD=qM(Wo@M!Dgkpj!j4t1&!&4_Xm`IfkaoqK;a|=zV(0i%&`iZ<%mIg2d?Ox=OmV4>-YfC0lOC5J&E`22oTmS*ee0myxVg zhrzWl@PvcmO`Eomwq1>(?wfyB)lDFA;B_;e2jKhDhqMTy)Ag0H=6pdxEtJ;L)S0er zJL^viKQ%osZ~q@OT%60&X6tTqd%=+Y9ryj~@|d15gwFfbE<)mmdejpCFMWxi1)co= z&XuTkQ)NDOu@DyL&Qi65vi8$VJwp!{7A@b;h=XnD5F8ZU@}l{aE-!jut05{jqwKfj zx^%pmvKLEqS#yQEk0MNs;_AiNb6bF3q*7uFWg|pXp{xcnX9|^kUdJEt%t}whvrtRr zBu}FT+n|kRv{I71w?N|#i`?#yXiqC8Lfwsju_VBc#8l&tbj0ZGLM@N=ER+)lmx($k zn?{B8me_N@=wTu4F=ZIWh+u7j5MZV6A5$VKY5q7PT6o&x2viMok)i_xzy_vpD+dqW z*0T?7ytuvt?GCcp>EqVQCg~dWn;Gn&DJe<@&omi$N zMge%=YgF16N8{5pZ*E)Y>k5N9(V11f%v4^rhM7h_j*kHRFdnhQp?NcAw#LbomyDPo zI2gGy+9`85p4-j#ibH-7OO_7G5cyuLYitK)gDl^+yAnDn9c4h~6-EL3ebM0;;%HSD z<#AWZv&s@#I^mk~yaE~i1lPRVXwLIWgsZfVg2W>yD7GJXQ@Bl?S&DQabH7gZq4K(> z;MFJkDH5EM^Gd$20*%Kn>B>ZGtH&1lh0@dv?C2GAJ_8>&m8$huUc`9|pNdxlZM34l zIB#!0g%pQp`zwQBOYS^C>4$O~@2?JH2&;pep(uG`fGBAhs5IiVu45c%UC)6^c))l0 zrW#&ejlHZe_3X;0DFd-MWDu8l76>r~p&B}R|Xd-?^X6aFuF0ZnzKLoZ+kXHx$c z@!C}S_C*lnRJ!=0D3bh=(hw7$Z|M<2*Wapd!SPPXKV^gWeo67gx^R~G14iH_rM7?B z`>GbMm7RvE220{DZb1QNASCM158#G$fJ85l!rzZX3B?J6(p>k%b-@$2jwD^6w+D*} zD#8yeQ%3M~1<^uE5%8E%0fxO-TVE_zHxKBi)P`+*@jx&E`U9j$7y^cM0WY)%CQY66 zyTdWGxq4%CXozA_=jts<2j_&*={IYu^1UJfrS6=K2Y|WEzQ==f4PBnFeWJeDE}5gs zY(84UA=XbqumTh7=GY*8!}9( z<@k)bao{j1f*)`X149?SaC$r4XYC4@E(SCX*&ONJ{o;a%c0La82mgmY^~BplNBnP7Z10=RKHxupxv{K!F>a!WfsmZ)@47pn+wmZ-3A zHF)ACDvd?vKrib@U}VpSASCb%l0J^+Yk`fo(k>_3G zD+FvfM|6OlWmJ+fQQ6~^1F5WfV;pP~FV@hLjpg?-rPIb6i59C6@W3UAU(Gv{N_NGB z19e13l(^;`ld09n6#SKUCU|^=F2VmqOUTrm{957h+DLY^#bk@oAOqk(OQzd##@m3I zmaQK5EW1E{dt()5A0JT>)xL|xZuiN zHH@k{tUU^NSyy_yH+O~E8Cn=T;vz4ShCa|_G!Tck3xO7$_~97Od!ZO@>F7gxH$Jjy z=e{;UQM(KCrf+g3f;y`XKV-=0AwboW^IEKE_Yo{_wL#Kunzh zrn>z1xdEnM`EU1uFud*EO4$QV^P0T>GrquByk+gTpgE&(QSMbS|2nbIyL&dsGyiaj z(2A16df;v!_Rc&)Ida#LKZK~9OPH*%E=2mLJj|$tQ*jr%5 ztJ;FY7)1guW)z_bCoY^7bD;C;dIRSx)*zVnxxc13g1t4tojZM;Jg8B&9`~Vs(+|Qu z?nP6wbj|hPMHAdhFzeDFQ%=lrADDa%uuI@)usB~sG2v8e$k!-;km*_fYsj{Sg%2PN z$$E;^!KNowz;1BIwdAzj4jMby#08B_gH4X%`%PHzW_{ISyLs`79eBlxX0>u@NJU0l zjBN2~3~?HtrG=}oOSAb^cBT0ezNf|)TM}IH$%9F2*E+PBs=ZZ!$r^}S@9;04j*F5? zD@LcJ`fP2tR8+U+-3$qn!kTK|ZNLYA3bo$-10<|FE{ZBu7bbG!?VBsT-A-|vUk|In z{ZaS_OBw1R5xV}|q}{n<(Q0Y4uA2FVqQIf1Sh_mI6c{G3JJBM4-cY-8MLd^z+(M7I z5G1d>cNpiVDL!t8#jR}j1j}hN?&*@1r&v^8;+7Z*={|PQ_e0@xzK>cDGu2Jhi}Aw~ zs~`UWy*oari3!GX6IEm)CBI9XLCWL>( z2kX5|oT9+?;>o)f(u`PNIM4}gFL$bfFP4K66Q;*f%4i`qBi;_?SHl-YBoDm;zGw~eJ#{YJqQtHU*X3;>P6>-89?JPxi?BF(WV#I+IsaR7l^ z^~7adN;Z{ zv9iX?TWGwROcEL|BO{fcTjS+jq4DzOaUicu5*n}NlXQ)j_Iu|j`hJoUXI_6ONK1ga z4QgQF|$Ma&6EQj#gp4}+aTdYw4 zA%_ScWV3Mp1piwa{i`GQ$6L?1in5jdCd>d27m(LRAW=gBgy-@Xfhj$3u$9t_R#kz^ z?;*3~PstlcR;Q%Lf`fg$5+wz&3J)J5LU+l0N0xTkIPh>YJhL72%Cg((5=4+E<7N13 z;Tqq|fA)w61!DeiubPJS%#X=9iwUZRiY9{iX)7vPJXinJ1ULs|Z|xLE8>cJbDZBw~ z)7C>?)?%=mkE~!$iTUw6n^UCOph$WuVYA`gse%_O^dsp?i9HJ$)S>0pq@i%@l=uj{ z{AD!gNDE2Pcy5|&cq6nUym)H744$D}zoE%bV1R&8G@dgjAc?$igFhDzXxxzR^cxWr9U`*3U^d&Kn@Bx~=AGWw+#rq{_2|Uu+>_fk0?#mUZVt%friTMZiN`!~F2`W* zJzv*L^BaRz5*-HQAG}}9#8hGC1edP$%G6f~#mrDby~PLhvLZefNl73e&QKc3yAYoI zsUHGq+zF>RtV4DKWZ@|JEQr-akO!PwE;0R3UA zk(R9`3PQ=v*)m*lKS05qnGN4qKg6r_cc=EQ7^Oi7cxAV9uG$6?R`#eSI0cOsboWvp zpxjFSIbi}THRDoPRBR2@vNo2R8pZU)h5lO6R&VX57brwf*>!s`Mrov(*4*jclAgF_ zx8c4KMx-s1tdrvqH$WNvAJ}Y06p?m&BM`d;lBlo#KnKZ|w1N$>fTHCPqkfcG_n|!s zJK2-h$WXUJrd`d2A!uCDrjO2psMd!dxJMS-;F|=)Q?bKdi!UCq{M-c=B#`qJQe>Pr zc80|>;ojJw^4KAi7WQI@HzyiMh6bWhc&=4QmS;)Gf@UZlnxTmGz=a17#Q{2QwP)?Dv47IjF2Q=^^5V*0wv0*tS5ZNQ#8(JR?_oy-JVB})c zX(sDKAI+-ME`NUFC|OR3ZGvuih>Jj%s_G^#vIeLsP%WsRhVm0#$K8^2;zHK4Ofdf- zCt0$fAkLuatML&)Mj)Gjr!!g^63->FhhCr|+zHkgsMCbJBF()x^XV>EL40u2GG5Mb*Y~7T;NXHZUv3Qw&{?iclfOZjN&c-#+e>Rs~v* zki7VZcQ?mL3&=Zv6_nCkP_6WYKg1C^6p|<$0y*vWtg2KemX#Ae`kZ*X2{%7ZA0^u| zL{rH<+74K9e<9j`n^#Vz8(_`LI(2qejmHK9srL1d>HvdOD^B0ccpzzUQr$Sr*Qpb0 zWNpce59AZd3AI!~s3S0MTt4PoZAhFim^jqsqOU=v13gq4bKyDObm7vh>A_z3GMq{q z)($LZl<|(>?UjdHkGk_H{P|f)CeY&MXXxw{+(1(Y&NP;oiCH?S?P4UlJK0=Q{GzT33;f76g-FBf_KCG#{GXNz`J#B7A;L2!zmvtU^kF z`ARz4d@x_B8f_T+E467vu<|x3Wr31h%?K_Mij+8x^d=^bAJ6>l9J?IHfl4RC8pZx6 zEb&@#{oO%vo-l_0(aHxN#Q1vL%4eZXHUESM8f?cwncmIK7m#Qo#QJ3JVxW{Qt~=P* zclxRzEmj<0J~Xc_v(br#F!D{NTMLCXG9p*`&v`Lw>xUe|b#SEn>xoq8ARLVWZ`)|y+h4GdX|U92>P ziPT8^66q4NFy?eI$%9kglaFy(`BO zPWo#YVJ$s^FojxQg0J+XZrC$_i6soC3*E2{c|f62>dEd9vPRJC?vO4;K;c{X53z&| z=$$krta3nMP0?&_4^iG7S=g|0P~k>cOtLSV9hSQQurvXUf|gx2C)465mAV{iP8$U+ z@2H-Nh4OzkTP*k7h0+@|t3%GGl)4C!==zjWi^J1RdP?byf2~){QF`fVAZemWsV8Ou ztrh%uK(y8j((T%w2rS!32YSM_p)1vRT8UG0{2{p5skkRJi-VuW0oaw+;XVQr4nD0s z2df>^LMh{l*&*LrNfWM^>(S_5=)pP4@1?xX;}62~a>gYfy0FzVO2aC=xUob;I&qZ~ zbDZn?=T~7y*+>hXfzi7w-FQay#rmwWfqwWr0ZTf}uO*#HXl|x;GgzwWcXa4MHQ;#% z&19XRVk|xTJP;Vi^sGu}mMGn$%eM$P80c`%hjRxvTwK5f=PH(7qAp8e;#o;KOO-5X zRo=YL2~sU8zwKR%oU+-UI<8?^@=1k~?|8S%U8eACk-L{EpCI{N>mT7+`p$Btt+$>5 z&!oY(wSA1k_3LsN$o^u!ZIzD^{3|GkWLKwJTqqO5p%wXC#k9Dc;CQGYPwHab3aKWt z06nji*!BMq8p0dSh+uaIvx^Y+#Uh$rgs|(;>>`9+k7mzUrPQe-qS@oT-0U!HGG1{( zVj^XoZ`6t~C~#|51i62*N=bn#hnFFR zsf~tw<`eCDYJ;+v>u$<6DmS_ArnFG_)Ft1njg0Pnrkc5J(v4iyfwDI%RprHT5LSbr zKYOC675y^X)P@PQ31xKY;b^C=d1#m#PDvdghd8;Z5%vkL0KrCVH#!m~oNW%bKEz{e z9T~MR46pdv}Pd zTLpj*VEq`NHKzK$!s0R(T*I{A$#0G+GK`y6wg*-yY7Lu)cV67-2vCq7b4;g!VVOJ^ z;Yi2n75qS%?b<)rBylLr1M^HTs8DJn(j_nLvnnvPb$-Vb!qwda-Z8y`-g18tPj?@@ zW2%Dg#?LpsgbZr4<|AA@j~>o9RaaMeqX~bCTd)@JH498NgSYS*3-FX_$BxFqs)2&w;gowT~jyc z!lM_PVgoD253ekYzcX%P{6iO;+VXX=X)$6kKBli1o9fhF#7$(~u@);V0A?*#aI<=+ zD=cIbyTnwbo~V$H3KbRyGwhQUHo{6KG0jPZ<%7Z-fBzGvrXlJG^H35llH9f(vldsW z?vIr=K^(<>>7tWxbNl15aWk_@tCQ=ffy; znJJuZj|+N^=Q7~AWWni`eoG~<_HIw5&nom08Nnf~BY*kv&%FRl4@i^-J^mx8o=;op7$+{Y6u6*VWIV%I7Xba9xc_b-0rD!q*Qy&;C+rBk9G1^LBkv z6OpJTUnwo%d(LQA)Mz(Sv=EFqZUn^&LD!A&T&raTPr8YZ!Gz0-o-yIjuTV=*zbUT^<%h{>w;rT= zKPf+=ZcUBp#J*hkk?%IrWZpmp~Z4`M*c?$u2 zuC=GQ$9)cMKCSeTvp=GsGw}7wrGhiy^C!~1Gs0Lkss#MZDWv;`7-d{pXQAoN(2TGN?=I_>VOJ%RzvycoC zJrH#k#;A!j9gWpvFG5Ml}bI&DfdLT_ftmqSM4<9yfTx=9irPUDCvT-4_&`| zLE%_ZO)lzYz>C5w`w$gOd&)-3EOcM(uF>zuRkj#mo>o&ujv zFO832xn~5FcuA>O*R_&a)3w8fHAm-OoIctSy$<(Ez4tx$+vtT>kK~nx$4Yh}Z2To~ z&_~mAuz~IN(l%^{hEkM2nwJq7D~0eGi0k0SXq^<+V<ST*>bY7!ROU)ZLMlaBA{Sm| zYccn^5__GmMByQxWMUfjl8*LpHnJ00tLKN)6%(_{dxI#m+Km`GbL^csDxW*M4W$Rq zHs|(mc+*=7drj&_R>s=CfYihy?F|Ie^EiEx*U}X4jqM}uL&=T210En>1s2#?>WlqFg3guEaKZ3ti1!`;IRTct~{F(z_oeY=tWkQwUoZ0RF&mH zTHn~}yJ+$;Ghd%AN4%_`a_0nvZrbzg)WFOlaZqiS}+ z7z~S<^;_y{VM%B;%fjjftUl+X<)8C`y%|PGI|YUhKt6B_YmR1oy;+TlH^EDYzbVaI zylJ?%cvHSLB!tSwq}8D!0LupQhWs=%2~y91+vN0NEh_auR|R^b2P1s&hRL+nhw%)o z$9))=MZZZ@YaF&oVa<@229{%R+b{-ak1iUE-a!jAzX$i~j&=QkVU4#`<|xRQwj1driwD4!sseiS!6$r1LK?dYQkJu6Pwpa}tCv^11iu-4;Re+ZzGzV-Uirai-b$xkVR zS3ww-_!8O{#%6)E0+S(%O7^V)z+o4=ndXL>Ei@&ZRfeMBam@3=8BgT3C!7iYY#pM3 za`J;ysAU8j4nL3sQ=X5Yy%E4}z-e_Rf*FzY77!74Bt5@AO7=+Rj-+ovpGLB2sN6b= z4dsXN`Y853MANirR>Qqh5oA~cDLedB+7Znn*;GF%AdBYRO=tlHSsWB^TTgqF^988j zQeJ$j3Z*|+7EDuOSSohl{uqp~8}*E3-{2LoPF4?$M^`6nfUo(QlT~Y@Z#^!w=vyyL zY&{FyF!=%L=k&$aGel_5)?>!H;jTfu;nRr&qvwADuB3fD$FIMlNc(Hnaj>ktB zN8VLfQ@=M5aH6jmu;iIDt398a*0;K=s0ynovjscM)}{2IDr?H_{v_kFMKxSr`c1** z1b%sY0l(bJFK>v;U-;!UahX^hmq!YDwPE~nzqtH>UvA&d?_R9VI{P2w3UhD015V1Q z$!xwK;pqYiUQ^aWdcFp$$KL!%Me#W`Q1dl$d4ONu-OTTL*TjxHNIh$^Sl=?-aaYW$ ziHb{$gHU9%UgQBUG9P!`MQYSSk+LJaE6>#ut*owvB3qZ4Jw=LnkxjUMWYBC9!~DL*=h+ z;(g%{!|AH~p}&CvqdmCBM_yVN9o?{l&r?i2*2un1w=$}lNUrXLIS@XDFV$lS=-KRg zqG#*tvDyLX8Ek`GXRBySm(zuMtZzkKw-tcb?Ue{RUPdz#S$#C|S)yp-1pbQ>O~6wP zI4|y&X5hi%;+`&^-xVogpsY;+NUtaz8G8@(ZxY_&^gVy_PWx z{#6YY^wRDK)P6jfRk7w3DB8u{@S{ZT*7lLs1@v+a%Jvt#qr;>IYy^AUl)^BodSIG0myZo~;;iE&XLUQBKjl`Ya(}4^Cyc3!(Sr z_}Emh0Y2_Q>W!aj7&yFS_}n4zDqkP5ZXU&nQb%tH>tS63)*gNPr2(sgnM)bT97`T+ zB&ilJYZ(WXtVdD<78dB|WbPN8;V(*W$Q}+1A&W;_I~rm*m*{*$ zG2AMR(DH2R&cFgKGTboG{y;d3E2}_TTDfpCi()01y>k$-7~Un1N)0B0E zD$v@Dy(FEa3C%FEAJML6tc~7$Ydv-Nx6PR!Rcj930ljO^lK3Kr&jJ5XvNmlcWjANZ z=>O*Ctebf=pQz8hNNQ`h(Wyq5;`kPrhfCC<1?#4Yr+dl&H5N`=TZlP7*@AU23sUwK zKzw$;0$WQ-IhqZ-TF8s|+a(!?O;tehg3fhNI zhtzbqfU~-Gb2IOw7(Rd-a5IUIfeN1)5<(NVHSzV;3bugYaC%bY=|ot_(Lb#2YQT07 zo#xdz6{i%9d8=YuB5cRg?Lis~z}9_P1LG<_{bBuKp~h@{ae1h~`-|wX#^QsFUO7ec zPV|ac8&=l@T0%F=7ul?ah>X*MZ}1~tq^(>5NYFN{D*xv1v|$aDm5TN~B~N70LC17? znwwI@%a4)sLAafKVPDr@E>09o*}GJyEpxUuUJg78j4g~$NrdJV$HnWf_;JOl3_KQ) zzySXkNV$p%-(Y{<)3N53s-p%gBV)}2xbsMBH00yV$Y74G3tY7%Q z@+*ISwVq!E@T)caDv)38=2u*6p}p_E5maBF^FzvBfI7F=mw zEhODq;ipG+YN8zvWKc!C&V{QkmWo3UI*uA$*)wwXr}SD^@J)wY8@sZtk~G8hLU$Yk zz_KjcXK937Ej%N&k*Y<2u3JA+b>yXLJ=i9=Gd7qufCHZjla}Qkqe$ugtdoDKsj&dN}Rq z$^M$~AahyTzqE222@h_*G>RuY;MVLIX!*U6J=G0KkF<^AWXBQ*BlLf7<+kWn?reJF z8TL-qBg;K!Q#PE^KrRqWA#rLHZ)xtei~CF=iQt?M5L;JtE?lKP&oYbeCYU1XdV!V< zjicn#5n+_nKhQ#RpJhFCqU=S{O<5Evy;-b&1Becq*+wmU<7_@i1A4Q^I6DeVHi5#! z4->HIobv_^(vF{@9larcA`|9wf)~r#3jP0p=U9rmk)OQ^B|XPNXxDShS1yCA!4|kR zl{^QB@`DuhJZoB4P?vv$C5d+qaa-N4ARz|MpS$8yG>Emty zUGw8Jt~W6EtlogJVpYR+m^U!Ik7(e%KB9qJeOL+~8@vczp+`XnWbBFO4wTQ+Cfr!~5%p>Vp2FcVG2q?U0klZvYs{ONfkPog;7x^3?%f zbZ?JqG*H($6TW)@v*QKd570+w9|+!SCAAs|?LZj~8^{{zuY&q_AXwDheVB#z4P;jR zF06t4?(KoB0cZb4etbWa{Q83P?eqeRZ74n^cwNr(Jh~*NUD9XE+dW$e?yp44UVw54 zOLIg0JE3&-1=dubuxganW;Axei>$^YO9X4I5=&KniLzgWLgNx`c@f*Cj844B(s<9T z4bfV=moU`h)cYl9us)v$!+^owM2a=T9nSpB0PEgpTkhM2F3~qPvUKpvd@;eX1urPzepnxf( zJ;PX{|29PfJ;eycTDdm!k3ywT04bgr=M1aAc zbrg+%tq)455SkbRDWfyPS&t@y*=uU_88Od#Tnuak$eZMubsW-sbV5kB zj$%!aror1z&y8Zf`Uh{R@7t_V%wgXH?hi~DXJ0t_8CU{CFG8P0?=f zpwV|uB2H{9^LBWYL0=nOKH`T?(dn@eRnf<=am)!d2PU1XjrGOcejKaAMUeeeV+@P- z`_`z3khz1DH%@Tvm&b9gJ%@L>L5S;JPj8!w-Zm9`RmfDs$Gc^!1G?lgcf1f`KN-)e zhioYKtWz$-DTWMJdhv*j(tF-i$p2;5O3mY2`;ablb$FEp(wLXQq8+5SUS@Txi@7(B z)AAf$4P$ZB&LX#5vz|&{hRgIie$W@w&hacJVhc9p%twVm1rqE(5gFPzfqBEm_{jv; zn$OuE6F^8;QoV_+w!W6X*M~M{BC|gtl$E?j3n#MbfDzt-pOE`EJ@dqcLj|HZf1Q{o z|4Eo9ArSsRbEiUAlQfAnbDwKjcxVu9(EC@viKjB)alo605B*%oAAbQ?J^a z=>);4)C6&`PK%9`{LErjKtZ_2(EAwum&ZL!8W$H4Q&7>Jxs#y+T1v|&v)aK1$>M8O z(Nzq3mv2mVf7(-?Pa8`?4wDquo_{8SS;i%RXgimG-dSZE38i_q+rQkk4jXvbMA**sNSm( zhwuq9Uu8)lKUAzFK2L}o5_1_7Cx_6%SDByrm>mPU0IH$QLgM7tSUu#NfEM*6Y=*3( z`6E8uONRF6y)1B6@SDtn^5=&@Jh-eYfBI!XL3KY1XWuc3%VrJC-}5%F7;TQohTY{D zEzf4v9JedJET{jl$e}k>@Bl>cS~e)SsCZ4^QBD`|J3?}>DW_BG95x8qPuAqHerU?_ z8tbG^=Ub+nE5TxD{A(<_syK@^*#)C0aL94!} zH}L@PIXaa+j_njajdk)zKDs-`7iJMuIFva8?&@vx!^mP?N%N=S4BkLTr?DsafjgZw z*EL9wvgV5}t{y&}N$@)y@jB}(71P1jS$lbBEJ+s<0Xg1eTmYrN!N$nN$ePmkHUb!C zn|=8|InB?8(XQF%_VnCLc1JouMN{F+zkf_XAKg|LMk!+h4&d5CNf3x^Z8w+#6C5G;aW|qI>Djxnt6}XBM zmq150hLU$BBTM8GHX5^(oC@Un`@Q#DsZPp+$aS+j!Vb>TsOkTb%{7YmV6MI-XI)-8R`sR6@aRyt%IxloU%Ya*XQ}r%*f@N zk%5Cn$)Chi>70+2vJ?{!sK4>1nOKq)R_ zkBwgckPXBqmhy6TIpL8kZD1UdFKq)1p{X=%0|a^K@UEuWDPUe33zbdinMU7TO$(;# z8<|VKXF%@W+Q>%0rwXPNO8dC6jV5gZLF@*=;aD5}wuwzZ8zT!vi?a&ZP~QHyQy}Lp z2Kpl_GSrEwS{^tvtmW1Xs`?@rOoSL);TW=TC{&o6*%u%co<#IWk^S@UJ_7uE?h+)| zoJ)I!&0k*voUL4)?G6siAHC64woFF)N7Pwe=1KbzbH{$4%xpz8L znxb@?J9NAP8EXbg*T7yqySAykOQn9nz2Kx5lkQ6mzhyhI-OAcEiJ*Xv!NC-JfZf96 z*bhRoGjdPum=VKsPw5bIJoWGHF)uhNYh4e2ir>aQM1IGjZR};~bL#jB<8G7ELwx81 zpI|e<#pYyv8|6nQc~kzcrS+&}%&SgHiJKFYR}Ua)K{WMK_B&oLlElvY3=2#oiLFLI zea6zU6Ce~IQ!F7ZM81m*b$z5bD%}a!fumbR zj@n%;k{23zwpl!->|*D`^klV5B`EInOE4Gw($#V|i}IwQW!j2jpwj@VUpq|n>K^Qh z#S~}vce9;(R_|&#Z4taEyn8z@FtW zO0-Wj)8WtA^Qe*d1y&}!PQGB5!H#NYw(dE4?rUt4&Q7Ecf?{nKGM1w7Q zv?j{y`d~ln7Kw6J$Jkujmu!G!K8-L`_z+WCtFcU5{uj2;&_JHBF7qgI;SK@K`C z1w$f~_=sNYN`d>>Fbr+VKA4t4>sIy&bM4#5{3NL_hZ8`G`P(lrD*qbZNvTx#8?pDK zKFu*N-S071`ZrMMzz?>x*X=%xQ|&c>0otRl4zZ7vbMT3A=e7%`_r7E4@>HmMJqhk= z6+x?xJ88$q*yxjUW}w*@F`n`+pqO=5X7g`>%y_M6aWMn{q{fp{Oh^ZC!5o--m<{Bu ztD<$9au^5EIVwNQa!|SOqB(+QAHld*)2<^R9wNJ41ob$|8p^Agp4e{rQRt;bPP@tY zK{~rybo+bk;(65J7@MMQ4+1d?6v^xC`8v}D4j%4d`BFS$%U06uV=NOfY%l%5X7dm* zgh23=smK@iS!GfKZ0$=00soTJ@H2noPgu~EXcZdRSpsAm&e!~pw2C*7b@FcwY+m}` z^q|}6zcujA>VMk+Pg1t>4Es`&X=n*(NMFh=0UP)U-7aBogVCK<$~a=-Po;Qf3$u{+)$dEZVG_ChIJT>a`yk zO1I9j$EzNd-F`qGP(t15$E=-Q;IytmJb#$R{#B3=jZ3A`@)5*w^P3-G+B4-VP~mjqWf?*Rf;vo1r; znMxZjbBdFv*%5P1>56}XKiCwZZb6n^kQDLy5nVyFn}lvX2t@D^88g69*}(?wx*X?6EB!!wLiZl-)pS1`O{xw5ztsleXg+x_RZ2N z803^|*o%9q{2JrgeVSf}oD4qTI-V~*!YAR)>);Vb(YMzzz^>$fgUw=B&c@)u(i`k6 z^Uq6y5Sm|1gUjG~HH)YWepp+P{W%#=t zME;F(_N+0(c{#@|QV2D?iDLj9$W5kUa8}A#JK2^uY=58>Pe0uhA1;XIwtArvMg1Zs zZBKGp7*vwwHtKWrhMonsxYN^)+V7WwcLXK20v&-9@UdF{;oV*wn*i8YFsqCLU@8D*nCj zYPxkRjLLo$Yar$pYal+zhkvw;55yZwj5i8s!s)lf1g7@?DU?p%Lc81D?E~(l=>xS7LWT%Gdc)@yp0-y}MTb7pV0gIJCDE(DQ$=TD9~;Istku z{i+785{9^AK1Hkx>|X%fnnyS1yyT!S|6uc_vw8VJ3GmV!@h6)Miy=~BJIUuBG~y>H z`5wGhW>dF&Y_xioJG3#%G%c~yiF+ve9u*WLVeH8J>~rKv-<=g^Vu-O$N~#`4FFat6 zhl`+Yz_7SIYdCyN7LKf)uFoG}DRMr%=AUQkE=*F7sJXmxFG_EAz6*7aeqf~+B()e{ zkl!qf9%pxTlhuwA_$lF{jLgu&<2abQIU4%ALKO8D_e1qn)im0Thz1$hH<*_{ye|Yo*PpXnLrfW(KLhLJ9Rsu=*~3 zLTwnrQrA|S8qGn)j@Z>c_&3?13IROR+&q+?o$82p=>7qUcHhOcAnnM!C`9!3q_meK z?9@6`4TMOZzU^$NH^(92zE8b?{xb&*_Vo=wFx@~IZT)LgF+)!%+nrjQYjZUnKQ5&1iZ>UMT>|xd9TerwBR;_~=g=Vqp zai}P6cI^yA{9|e-%I_d4R8(@?-!;{#o{{7ng$Bl}o$%}06tC8nYvk~FH75{hpj%X} z;y>#UfTQqW>Lu_v7Y}ghGF4R%fd6(CRa2kgOVs&&h@D#1Q0w!hoOve}hjGyG9>b|T z?pZTEXf?wZpzCS?2ry(s95!>$O{aW+RrN%F>j@At8+M6v_ILA`9zX=QV|NM;3W)0& z9jfvC2N|7u2svGNy>EK9|Kl)_&kIm_KFrKddOGmm+^7!xzXC0s{}=S(n z19?#YCN_`nZN&?O@9n&W4Y=p{sQyj3=lHzn4q+yqI4tdnY9pw7p}D#%x~2;8wks9O zE5clDYpLmc3i_R~hS8b)lZY>doM>y>mdiI$^k<+sSXw}77oNt3J$hpdm8|V$354E3 zU}3=wB!KWT3(%{7ok(p(u%BsEoDXGJMO;IEop2^SnfKi(6C&5HC8||0$eirKp%#SR z!t?{s*~BE3Pe5E#G4kRfQ^m;Lst`W4T<0-Ja?&PV90aczxmjPP(j=7w?;~s48#FZ; z*!!c%USA!fo>w5pdr`sSFYQ!NUu`Ch$eTMS250*(_0@s$4&-C7+8s2!fqF;IF;m(% z5ux--L$x^@fohP5syBp&qoLYA=BDJ<&%j%R3o{l25ez0`>mQWXC&5Pj8>y-2(WXY| zN-E8())e-qMrs)N+VpA;_)s-gedYauw6U7QL3JCeK9;2if&=YQe~X|B%U3dhP?gtKM;jTYfdOBE4&70Ni*+E(gxz7msKt4I~?N^7k?FJU9b z@q}d=Z+P#9ZS+nZm8S`vQdf;bnouMK4WTnLyqn64VkmQRGY8e1={N_t&*)7} z4VNysR%#$75bO#M{%E6;!Oa!=xs9qJ{7z+uym_FNpnbMgq}0P7UrmXv<f>UPTlpCf2$7vSz8w%PoEKQA85ThyQ z?Kx_N;EOOEB-w1Uo^H%_H@kNZilOqKCZ|$&b96u!OYqXp?$&h~oOtKfl4*Cl{gaO*3d7(bsz?ysULkV%)TwCksc0#ZS zrjKtt&v~KK4{*~crbhztOB@)R*q9guCk&vJpPT9MfQ7SPauUx+nWZaGfS||e0l3QT zyM44900#tzW+2KlZnSq7(|xUwV(YsgO%kPy!}*a?x}@l(&9DgIKt6N?_&icX$A|KI zz7mX}p{9PM77RRN*`kK!P}8sfP@K5cvei z%nN??N?k8!yb8~1G}he9sW%pd8WO+=qJ(xd-lrXaU4^3#^k}K>YmSnH_JKQy*L%go zGX?mrxC7(0PxB%1py!^>d2x(9{;zi~|2bOrV_7E_%c>ic_>w)uOyl*7b2R@^nV50c^an#UIN_tvt(koPR zYF4KevyrW2wi^=}?>(A#PRkk-ui~b4d?vt!5xb5#tc1#I#v3KvR^Wet7*>edd^8e& zy_jkxukfn~Xh%kxda;3Kj{_c}tT5f;gLDOKX%@N%*gYM=%2JW#!#&z?eX)25xf!%A z9xp{J`b^@=Z%79|50nxwJF@sZ=pWy373I-cZubbY-bpi$^>VKVuXYu1l}?UUX;eo& zcsy|zJ}V!etT{)=AqOBoZ-VfH)5nG%I2YRSY>yYvK(&Y`;<6n057QeL!Y9HHo`-UZ zNk812-hAld``Ei;#KvNCBJF`Q0I0O`5Dv(1ZF%!cfI2M zG&2B7Df<~UWUw+;`w5H4AALjn?Qy|30pqBy|9n1UKKR*etXw^g&E^ckd2C?Mcsx5Q zgbep_9Okd1mj#I49*Hw%06<<(Pjc!r^Ngf!I_cbg}AP`Su%L5JJ_g$pd|EN7o+Zv> z<^V4XVVWZd$5k{1Jot*Uo5Q<;TF2|H^0PZ$&xD+XtieuTw1WO*!kFlEL}E$df6xNH zGH}K4)$t!+Nq(9#-ZLXrL|c3%0Nj*Qk}CSUJ)n_lJisc{cr2W5@qSp8AXAz&R=fAm zoC$Ci0N%!V`I!{DrCz~2fB|m+ z(F2*ZjTi%Y9`sSu@KZWyS!13P zz8-Dqs}5A>E^38cOq)u5VKa@ghtn>3LL2VJ|c!fcv$x< zzU#j>5dGDw1Pz>j{lD-kp@c!|D4(M1Le$d^T&LxO)Q0lW>vVLG`V^$8nuFCR{0``k z-6eiwP|gm0y3i;&%mQ=M^TIuab65pi0TA%$aN|mtS-c~zB~kyjYzH<>J3vM z|H^=ZE8J;?X67tJ*P^;Pc2~8b>M^A4a@`*Wu~%f9EOurA)@%goiez36y8fHDg|bJe zHF;XExVQaUQGS(8;nZ#X-~ey4S6eTy?AE^Jc|pSzsdZjSlWIV$-9FJbo_sSQ=K-B) zgbhgQKI0fQd(PiVPi3k+MQFh!Upwv3R2xHZhjKSShQF0{tU3%ouZ&e|K~d0ckE#ju zj>Uf3=Tjq~9qCEdkRDKfj8lEhSAPT^4-_i}yAVi`ggdBFF!=_Ov8B~!$n&5^Q`G0G zMKtifr-8gZLDi&aGg7Yb>a=kjc3uxE8fUx-h{oS~6bs5zV_QYW4mCwf2iz^A-ld5HVi0z=!Il-v}f?cr{cgY6}XSJ#%YW zePJ7p0ov=!YLPcb?2q%;O0HAy32LOSZ^4G;`WAn#Z{gQRNwQ@`)0zoF-$K7lP&@dY z*H;NRjpNtpiHYh4sF&|fRG$kx&Q}9cylCq$3SSrN0ARw_E9|3&7*+5{8H-#WpiK(i z>w0IBT3wQFeX}ehT54*@nlJ)nRP%O_bqZF7CvzO#?EbK$D}M_1m;Q0>F4rsSV7{l~ zvM`S)clc;$fV?x+h;DlcTCwh7^?d-kvS-JbaBoRlunmkQ)Ym*SnZl8ED5G{8*!i;5 zrzvox+Egl}l%nTrC@zcaPd7XDji&O&#Xht=)a*x_K5y&mnv|_}krZxJpu)rT?XJ@~ z>IYm8B=9SiP8CX7tf^MCyV(n2G-7B~pS+@xRV2k#f0`O$f~=qVhB`2I)|1FSFQ=?vA1TRrID3^meg2^FTyR`1F8 z6_FXl_4Qk7RY@96H|5cjITRu54fV$6DCvep}$GZWFMoY4eA7Q5FrzA#752^4i`0bBs5#5)rj8wzr z#VVF_X(&aFQv1-+tNwMlep7nodBcIs3<87wX5#yeUmvCX1*#jxBaQkkZ`_MMTBz2R zdb`dnbk2lvehb)6=)xyia)cf0iyN*e_mX;by)_SG$ys8X=| zk?u)?jgU&#UsOBcp)XwI)RPq@bR7*Z@!T@i1uGh2-za0JuDxBQfc6_dJfUR65>HIB_!Bja`J;WXq$Hw=l{6_-=QP1p1JD)Kzuq?Ic`-~W(E z`>8Zcg*nT*g;COjCmlXnxL(Z31f!UPA<NX=;p+4rS1nGYLJKsC%R7cx zk|pa0$abOgULIi|cXVhww>4ATNPrZE+X$dp1S-^b>Civm}wSujh^S*dPi zqp{7QKUZM|>$3_^;fu0L-HqLzwpwV%hpmRSs|WQPjWo!IR;#sxd7_?dS^ITmG$ywv zYI{?`Vem3BYt#_=;J4IxjT$2#l=G4Ut3bn-RPN(T*Bx_wycMnRS_JrjUU``(YDorV zTCqlL1uU!*{?nCWK2Q_og(fQZ84^lw#5aopPP`7#En9yyT@dloW}{*ip>fjy!Yyt3|YRios&5*4qj5iZ|d;Y$7(To&}j z2qc{ctr5)iBX3hc2!1Fe26L(jTHa>8q>&B;8?D7vWly)vXln%A;r9!~~QRfJUa7|G6 z9^vu5c?B?t+sWB6m&GDi@owA{GO{31P#C*umcuR4%UX`j zHo9jNr3BV*N!k5lf~oNib)@_=oH^Gt>_}ym{&B6@srtx3MF9&FK?iq(RG#`9A9K}L zdwtqp`Iwz2{yiUa+tYxDkD1P^|Ba8C?&o=v;A8gv^l$i>H!ErhK4!V7^*`}3!Mb-t z;$CQxKu{mst5(+;7$kbDL{L=_)X9521T}>2?ZqzcO*_6+x8Y~}SL$l_CV>+~vwi9@ zzBPirh6QcSM}|{l1P%Ebdl=8TXJcfPTT*gwjRemop`ZuT8j$ltHPq$(jarQ}2ih8Y zBK6ykFVmG$JA1?DV~za@aK~wFzUZ1;-zQ3k*88jb7+hU%pZRax$G$!IsBr@g%su&k z(*VSa4^I8t2Hu2m<7SciA;w$Kdwm%EyM=Jok>tbbCV65!X|7ybkN^OHq$X<;LRCVo zZ|CivkpN3(*&$F^NN|9SJF!%H4LDfQZN-zPp4h8)`5|@_(VM( zvVP-4y)b%Es)isOHK*Ovu^xMT?saQD+)KP}<@dT>w{jEprn5Nv##3^+e}#$KY`||p zMd2|~7xCh7GChYQ?`4v1Shz_U zzdAjlfqkp~Z3BGOCQrIolSa*o)TrJSHIbhjYHTQF$Hdk0zkGvfwYBLxxpJZ>cL;Xm zb`JEG0hD0~6dNu8O%DP^a_2xEs^ap#s!rmbHq)-DJMh!yx;ha*+pnuN@pJJyq?z7i zy8)-1-c)!)eGxxlW#Uw_v%7*eXI=B1pjA~mP(KRy#i`N#SO(b-?rRfacI zapD}uGc(o+Y+u;^I36}~uy9or>}b+GUjz*qCqCS^-Is9Nc3*-ea9_^V6**?ZIoS&5 z z4#8utsmvm7tuKaZ)`|pZhG?MY#p2!xg?TU8xoX~s=-1wy7HVBV#dp;R?u2mtuKKdH zwo>W^7g8@|O9<^QFqt2qH^5fW0ygeoTA7zN^B8xafWMT0Q-M#CP->YfR>{J*BlT5c zV5#K2^Mr%icVsD)H0!pN3YmGd40g1tYVI$ukoCmrK~_Bz#$jFk57Pye)^8R(+CNZcwoKWSO?K1UZU~`6Lhms2Vt~+l69h#dD5ywF z5Trw*!b6h~K&418D?L$AI)si=5~ZmKR3e>BDz8K-6?yK{FcmfYCY#b# z^zhFVV3QJ~UoAmrb$JOQ)Pnh!YC36zO^QTG88(SW3qsH|1luq>=#EX2#3kAEr;WEb z#)lWy*az7bBfb~RZQawtLs6mBJ@mDYRKmOx$gOj`za2t1S=ObV0AJ}_A+j)Tr~$3w z!k)zkmhEhbS9}~K`b)JTsH*2L^@9{E%U`M|Vspt0klNys7${A|9NrozwZcVoNZ%l_ zVD7jeI_{8cNXi*})8V=8kaC3hA9h2t06a4d-7e$e^oBy^_8d4YWv^o9w`YQ+a^h5T zW_A_C56FxeViqKd36|LMoO`sdgPI4U>k&vZSeh#!+_obWMYp4XI#|u_{FZ2W8Hm#U z0zxK}K&}aunCqRrL424bLP*QRBssB5Av{{_>$UQ$%)}Z_>K!KSdSRKwNyb0MpJw%L z^dhdM#aJ*YHC*xoVZqXr`SckJCGk%neX*$vRgaKvqqfk?)TY;CBqyzpkpgH{PkSKE zk3{26(7H(JC@$loq(5=_AX=&^obYUnmWHra;=Od?ByDg>?ewf+6y=tx;l6`g`pmp6 z6jIpS{$-tWW2G}Vujl$J!IV(^nUyBG;jvh=xD+Wa3#GKI$}qtwj&eSsfJtzbSUoEeR#0WHB{V4_SWj4SNIev_w7w?Jhc40^TwJ&uli( z9*^-!n{zFUCJ(d+!>w}hKzn`L)0?t3f3K)jwvQuMeRHsd!v<5%$e-X7iT^5VIagsY ziB7x|FO`RnPwF6e`gcayQ#;#eGW%YS7e;!Hm6Q<28iG#ooe)oSX=#&)vY0H&bFHl8 zYXXbJtyh`1q^E5~sXMdH{5nBeh)eTCsTs_((-Wl%=$4G#h&h=svzlz?cs<&`lCcA( zHwA-~D3$d4@}xzZf=%b+Xc&KXq{@|~vJjT`t|Z06O?yHmDPEfFVSi1db(N%2@{z64 z_8lSuT@*BN31K*>8qpo?7symuiZ!pc;ym_8wY)HYz{cyJ6zmY8ouu&>a!^-lv2*Olfh0F_$wW0{hTmAVVh^eD$_X;Tk^Cu zCMM3TxfVcZF6?M+9zb?;JUOle&0lK@q-`5uTRV}mOIBs}UFSAJT78uA(}sq6QcG2R z171EYP5Z^2H}ps~J8!VlAdPS9h@{!AOhJ}2_af|r$^D~L)^hniyG>@dtN&!TY3z3K zBX+xi-KOyj`RsPa1C|=_lT_Z!vj$ABQOn&$KV%trteRE4u(GwKD0Mw5jRTE803AlPHZ_2)Rshxg%3RH+TR-^2 zjUkZ6A%T4ANV=i@9`=-^KRM^Fz{4#40fBp0n5)uJ{RvS1?8&b#e=US^*i&o$2}sy0 z@ia?+3L}j@9o3)0DUCh()#L9)P!4-)tv>-Xa}|3}e~KcFJss7baGGaNe)T0817EM5 zDb&hGB$;}&Gi75dN^IT-eo-BM?Fmq&KP@IxTrsL2A%_MroqUlt*9!9opI8iS->Z)C zV8PKjJQ}ADRADSo=u4qI&87w};{_JSGnOm#xhjv{z4SIL>Dk+m^g>zG(#_oNf#d|5 zOcw_k6?Eb{gQW+V5LhrzGm8ieJNSUP*HVNC`uuZ;bLTYj0C?j4BfFO+JqGN=%A&4$#bP_$+$JS~{Gt#F;n z!8UAR#vb`PZCLGZM2HQGbJ4CkmDPGiW4r;ii*(JRW>{{)6h`#6+3+kDyt-!E`R%xsq`;c&(#t5LDz77KcLYs)3 zp!nHK6rKFpOHm(to&=gBG^tFR^@7(^3&DOk4MsH3OZ0+X&6~IsRnwud=R%@f708o7 z^bZhiKfBN>IS51<4MsG;OEi5eujvw8iiiek?75Jrjx@)T>}?@+wbHR8y+8?(JbhiZ%(Bd;TmK~~7%3ov3=ULx<$p9|}( z+g`IQsB>;3jM!b#i(rioLrU&d3zgHorvO z#-9tRb0a>U#Hl-VsHDT7-ex9ZS?YC1A9G@ix;IFz_Ki+`|4Y7%0fw>zM`?`Li*hBjVJNihm!pS=Aa&K z;CxPV~I^flC^DE+oorlXw!Zb0qcc1|48_?=xy=v&Jow?CFTYu9t$|=0sU3Ui&s} z3L^)^sFzBy^5?=*xX}_%Le*ytJQhOsN@pxop}FMOX0}Buv`(^dYK*+sR99Q1lmGf9 z@)nIf7n0|eOgstdfyHA=LFnjuKGsY=r+Uk@uDN7wKg;5^TSAv}nye7-hO4dD3(0<| z5VOXf3k!*5+aXWlJrzqi3!9>x7H9(CRt(D|^gSoWs29f2+pAMQ^%8ZH#-0nQb8{V@ zgdQ5(0)sn4(n{#vj;_`i4Mx=KPo$mGiQagLsHm~$LZb1!$}EXjIi3=i;xOjlQVJ+L zUD8VG)X~!r8#8i<{A+WwQm_Y?;+wx{Pu5CNRzAEmd$p8GK=EYKN>jo0_#pCY<5X<< z87_9bhM?vL+Rzf`oqWn`DU}sZ;B@iDcy^pPmrpa#^zP@G)=Ij zn9`ynf1%e}h}EZelpOyQ?|5#xH=@g1y%4ON-7~Dwz4HU&kC$TQQrcs|5u%66mAM=U zp$++P0NG{kwCg(Shd{y!0bYzwNOtx3#{f3T2Yyf|fLVR?ag1gKgJ#B&FradfgTCt| zg~0j$r%vFqK3f!^g#u_bwHmb4*_|XSMRt~)Wk(~oVK$C1nr4Gtv>N(QL7R6wM)Tt| z{dJndI)mnDn$lS+k08Lt=JHPsgUCAqFzb`U8PWI#a^K6ZB>{A+6l~`&SomrO$uW&nDH5K;q1l= z+Cd|`NnJ5ZlW#^i6z$565?Vb-K1tZE)TG;aC2Ul&JC4FLJVFm?CsRwcJw77Vlh;$4 z!XEa_ur;TiZ%7lVY9D}8Bq5$#PCp1^QfJvJ>FIfWrAx?|F{o28l})$#c=G$W8KInyMbo1mi1vpj%6>~?03msAK?Fy- zJST5q&*n6AV(XfeT2}cP!hzSzDOZuFMR{eF0M+KDb%c&g@6Vlq#evK1*=Hi z`oXkmq|{Kpw>aK@%mnFgV(@&2$NnB9fRG9I{p^;5vMU8T#SAlTF#Ct0A@0{5&FR?t z(lYA-5$7TJ6Ly^mM^dM)8gOrHz&f@pXK{-t%L$`%AmNO{h++CgizVpjD5-_xf)S~~ zu&)8I*da>KL?ojvA4*+>PM_xAtl+6LT6&Gin5K@AHe+_?7X-lmuGh&}r@q(;8j~c! z4?6FZuglE*pu>WJ1HH{%O?(X>+VfRdr<>y@cMV|V(2~h?YpkTB`!FR-vVaKMu-VFc zca>ALcOrNR_ohqJ?n-kz4UlNvIOzwb26pdg=b-81r8eRx3KhIPG=z3SLKQTDreN7lf5J(?cPtwC**usba^Q*MtxoInMss?hN_FPepY)NK;F*tf z-?&CsbFe;{H%VF{O!8QpdAa+$ip>b%X+>LCiZ2m&O2YpOC;`VPC+ zqp8v?TqaMGyaFtO0L$X}VVcxi5N4Cmq&sXHEz9a=j=xe|P{i{u;=bX5;l6o*`{okh zX`VL|!q!DFKc=Hi;)~P5SyFHIC{mv$U7a*zmgGmS+0w_z`PFPptVN#s>CzwpQp6P* zP#ztn-!i1u!uM436KN zvrnaN5Xvw8RC0?Lh`n>9#~9{4bEWf8|7w|u+gVVl^(0j?FT|mi(gSOTWTxiZ0Q@D* zlV;W78) zONi$c;G}!)fCjbUe;ImxvPpaJzYe`#CrjFcmLkSra~59EL6M27DsC1Q3fGwmJW)*+ z+GTENT1NQiP=gsuvyGGq_%cMcd=1pJ`i)q=LsLkHEP-`|G!E<8G4Xq2NRbzka zaRYYZuE?|ot0QM8dH!Ut45W~S-n_|Ed$|-X2vaF5y>c+6d?Ae!5Wo5hX($`JUSCNw zu;~5%6*Oya6TEt1f_lcr;S$YWA*C}Ef`IblU>urS!(uh?`~zN(#MiP? z`k%oNc&lx|5Ex=RWB!Ao2Mj^qvq=umFDs?D*|*ttwNz6)B4h^KfXh-0fOfzuaBMSX ziUhMIW{!=m21pU2{SxJ@mKe5}JGKUt96Qtqy7slSR-6+=LYETl>DM(<<}2s`0qy$y z&(Q(=sLnb`34zx<|1`Z0pYS<=qg8wAu}(^Y{lWhtVt~y+4DbLkU^3HyH2A7Yd73Tv z4D^I-X3JAo>g`h_m|Aa!l(Owy?Cy(^(}_roZx#a3xG zfW0IAYDCeo{Sk5;Q#+o65n|y<1cwhM`qQ@EjHxD;V>drjJ&%+it^iI^y`)H*;gJ}4 z4A+`6mE>BFGzg1{Ov5`452Ey69@eG7-$)FSaP_*D+|m9UiQ&b72mWKfgVH~n5J%6x z;WF#=5AOz1Tq6%HM>c1iVM z=>pj(ECm6an!Zb_gSGw0E@=$Ds+PN@mS76z>;^B*4lmy$6xvw8G1*7>1Or13OvEax zwMR-op22&J1J1X9u>(%#9;~qKXwM$0_&*(Bfcj9yRo1H}X5wl?MCCoA|M&BY#jpin z$dp5~p}qs-kMm0bo*OLmb|_5>{}^D z{`_j7_7S|csl<1@dkjyqe=6@Ex~IINdz-Nn*UsaHdQgRZFSP#B`;Vji1a0BY z80|3gZ8yW8iJxmn@8f6C&-U^Dh%Y?J=xfO|!UCr!Wq9(#X&QTN&k~b1`w+Z4*=zaDt_9Kg1Cmd`QzT#5 z5uv}JiFid@{)Us(gHnJm`)}UkPz@fO_5oDtpcL!B>AF-@g8eP(dQfU0eiux+YXY&} z9+Z51@~(3~CwS*xxlZ37l-hAiBOey;Ae5>elHLSgn0ZL*!jpmh%A#xeAC?rqf^887 zTAHBU+(z+-B|vq0t{#?Pj+jIbk4Uw!R0qJUYE=-mI4apWfxv~iZ3QPi`E;i2H(`53 zsba;d6=UJk9&e*5N2UEBkbF!h@cMD77U(QKj>WMx{d8P%`ThArxbcFd75qR-u5{3c zIhlB6y_p*p#0&1ZC!}BS;*}Hp{g{(dGhQ-`4;euAxRX+}_3#ddw)b0FdQz$nBQsEl zAYp$c2R%Ls>y9KUa|$Ll*mO=w<)s+qHnfw;e(en_-8e0^60e(Bl#XC(bw=tep39`=XQb8u%`HJ`4c~$E zRGDBg+uzpWNo!I+gvy_Bwuk`!v?J)G?ExeQK1 zy!j>UDxMXmq&%Fmhf-P|EQO9{=J}Qr!suEazKo^RHeY(k3}D_)GIwQgoe(6oH9P0l zGx^iaB(p!A`x)c^0wQQM)jw{r)0@9YwO@no%?y!m$-&~lF<1F9}w`HBmAJSl&GJebhT zThcaMy55#Hf(=EOm0J+7#om$Pv4J5jE@=hD0T_8lD&u!_v!Wd@rWJgoN64CYM=D$P z@s~mNK3*o&2uP$F08VUbZrBMAW;+Wh4(0gThWpg{!?4PNkkTL8-_UYbG~ zQF2Ofd*QKuI_`QwEnTM z1|HtZJQ!F518DZqbwNz*k$+DL6c+t&L7#P1oY~HXCm3d${enu|ymp9h&d?d)PBRtS zmZ}>6;B+&tga<|&e=KU__y<_azT0hPP7@EL2x;1UU5u0a05c0sx%t3oN(46LHcpCq zD3#{@^lK4~4iC{!XZC=GSJ|cO=Fm^x(6fRzVS%sFPe7WI+87fd=b=G9hWgI)chHIx zZ5`C+o+Od&k!0ru!IafI<4Qlm99TAm&4Cg&jJv@tA)qK5cdlf@aZc2h-2`F~ACp*e zpU}r7`;k#naZ0I(hSa?$xr22fuAs4jzfe?8sXx)6g}YdTiquFigog8Y zPhk+^scrW*fGF8420IdjL#>(usrJW7n(GIk5PG@ zxB+XcY88rz?`4NdHkT_<#!0>3vX-bCr99j(k?#{JQ(W|)f+}`+Ds>Vsto#pQ7u!9P ze#hah-g78`deNKDu?%dZ!_TD&!lXHEk_7oXn7;>zay{?_x$|!a(Ew2%AY7$G zqI^WSLi0^>X9ICD5)e+Z?3Hyyn&tml>_T5-H#Ni@29OXGwygJcF$d5V9iFXbIT(=& zGqZ|E3Q>N(x@Jd@c-WR6S^jhBJ}*X2q-3k?3^&R%)|Qvb>)Y@(hvyTk42<(%=&4lH zVie0aS#Pna@_#P&9|Jb}YWg~2RKkGifzJMwMu#i%y8?7}v(%R=!Qnf+l?br?k1L_; z(2YtM=P|4vuT)~SP42|FT+vr9gQeT8hncuHtaL@sa9??h$bc+w`^%l!wV7QW;hzSS z48$M;Vg^U9q=R;u*q^Tl$ZPqZ49HT0l5;SyEM0+eh5-Mx=S}3QxZH5?OSDriD_;GH zS~=wp&EG^}Crs;i2Z{ryTsdUoNnnQnFM_QJz~9n8AjD!S6C^hUh2cSRdGXQ-S`s7& zSuct>ZdoZeE8IaxgX9mziz3B*Q3KH`nXJPVMe1>bn<+k95pM}e!Aj~Hr zQjQSQex~S1_OItir2Mgm%J`$*RP_%#(IzM#q1us;F4R0-kuP^UarEIJ&R_+3WjFixC$~Hh*29frsqq>4oO&f=c0oFnewL>s z7Nz`fnx`ZbrR1OFDHV%S9v*;Ud<~xpMJdaELg1YC>tt!YVOnqIE?yUGU zh)!0NJ5`%{iBGa1-aV*$0$-bK+7LVHk)ZGVFq705uEfHHt9OFluu%zeS=I$cjK#v7 zl?!ubC&+bClV=HXcm!YCs_I083T+;+W1@?a`^s)xHNA8wz_w8DL^&Kwz=w%)eZ0RN zPx^9Ilg1~?G4yAmTpa09mArIo>vWy3&`s$Fx^-TlI}UH?lTD`~Pq+HZarC5$Y-5itfm{1&QNU5?Vb?nq|A?Q#$lrBs*e z;Ey%che)*RafrjoNxv~OKSM&p#yneKHWtPhG1*@ z>BU#_^jDtNm7B84Tr?`98!e(TmkP&``qq;V!Be$-ea!qdG`POp2=*K6>dRFiRLY|a z;cO`S;nI1UI!r!CKQ@p<5cBO{4di3uahI;k3T`Mr!gmS_i5ZBZH>`^QXE>>TNeo1C zBbnKnzz6Hs5-yt62;Try#pa(vtgw}bKAC}iw5N9$JnWzV(r9T8JLQpG9uQB%{xyL) z4+K;=z%(^lM;9V)HIZ-828TSakZt+4#EWc;IPoL}1<6wl*5sD>ZHYqWW2Inl7kAhd z%)*X;V+IJ!fJU81dnN#yej-fe!### zwC9w-|DlxclAFBB6mXkR^iCc2hJn3=^!Uyo`F^P|Jeh+;QW7*Js8)CvjjuVs z3%%V98olAZA1|Qj14yRrTvXB4Y?Ch+i zV_Akh$Uu`4i^0Y|Z}OEngdf<-YCfAUCfP>gIT56tG{rZT0ld;XA_yWJQ?k z!>`K?K$Gq6)CPMy9jOe${~NngfCMcATpE zzrnZPzN;EK=-?Ze30tVmKsgE(95PVf6b~Bv5IjV59?cuG7o(XsP#$E#^gR5^=3AOA z%70*TjeQeqF=q5p8ed!1{Exk`-$74I$7+L<{CqI4?aIO6X!v~2Ek=ol*Es0%V7?UE z-^Ny&N9Es^Cl^Oqr;PgOeiYajPkZ-8{_<&RTUYM*k9%%BBXQ={t@Z3nB+im>V4jmc zA0n4WcN`jm9iNjvucv=lPu}>_=39fx3_}x$stw~i@J~fMum?MEn!t7aJTQTSVu#B- zLKh;0m7uZ1AxF=k@OR`h)43m{#Cm*3;3O~YwgTGB7jf>EBMfQ6NLfSM-Wdtb zVGC^?DR;od_MY4Xm*n^43AminpTghAwAt(F@V*R-#VwTe0nc;&19`Qu$MfkZxuPKK zrtdzK*Wu51N6QUy**aRTF3#RWw@1rv%g1?U=thIafNPyf4acC^B$_xz9*=zHv7A=R zv2so8UKW-P(fvMX5KNh4!LV#0&sceuI6tjZu-lU{QSQO*ApcLtuk1bzePP6}T#@ri{K}x|a!(PfD%{v8 z`9^ssO`j=`5ZcY1C2M{MANqm;c8 z9+#kfyp2Vn=?v1aYe)*^^4ImVLL}9_dlJT%HX+3C&K#=-N%hZ@fM*LoZtV{d ze$CB=AYmQ}iy_!Kx{EGsP|5=?HK5vWA#gv3L<@ ze3%JFdX8stCQkRLE#l0E(!a9gQn?=IxSuK4gXz{%nMGyb5TMyJYPO`_%jBhi z1re9aQxVDX)|x6|^u=vg|N zrlo3}5JM@_)p~S%N|Z{YzLY~_cL}jV6Chc5QJ_r#O@VjmTR7>h7g*q=y|n2|xvIE8 zp!6T!4I$wxFb}Ye`wF`kj5jl`hf?iwKUbo*?*s(WyszXesEX1S!G5-*(e99bzp7w|&PXeFNRu7(+0 z_7WQ0vSd8<_*(X{3Fn27w-AbC4UV0APf)ovSiej(YK=UYGdD8Fz%Yy2-V<}z;@dP~c}}SUUHmwu z0xe%F4-#5`Iu63s=dYDi{4V`2akB$Edg$oyRC}FV(+8ISI>Ulbk_tWo9_z5Ak`)83 zdKed`k8z0sFbMFa^+_dLk!!tN%F-QeL7?1ts59%dF4=&x*2~qz2{7)+0^Vz%QnOk! z_XkhQ4RQ&lGtG^t9^#q2kv*7b%_bZ_VN|gRt5gy--7L4U{Tb|a21dNcV@(}?e1BH- zt-;>gle1Z#$w3b+m7Si~w_>FiPSaN&d=fzQ^~fc4uYSXFb9Y2ji57e#FM)mA9Budz zc3D5XlsGYa&X2>jutNf{kp%|42=AHY0{dMdV3LfYireMN!k?5J1!IxX+p)Z-(XQ?C zLhJW}Tg1R6`kS5f&JKBibr!Rx$FWj#J3R$EASbd+0s^0z9zR#(X~r%YXGhPRUDzhX z8NiHP*e!(0u0#;hB!}HiWwOD(mf9n~35#aK=FuvH78?oN9=qwpaTcB~TF^v%wO$On_TcB zF>bpTm4(UfUVbpP>rNP3(`}7yCPVAW%5Jcae;8TmFse@3$46<8o|M=)3SfJBQoZjv zkzk$3(C_8O@Z>18Ow&bVCQUzcGEWY}{tRYf}GRQ=S+{Wv0jkYlidgj1Gq z0Jgdf+Et~gKR`p3LbrdAtA=#biZz4fz0KdC&-`ZWo2)zvk7w|Ha5P8u40W!2lK*SV z%uR{}@8EkvzQ(KVOT)_`ypGRFIUCD_wUb!Amr@EY;^i!wa}o^B z(@+MfgZM+o>)Yt&N!bq6k*6o+u<(DYH21Q#cLIAeyq!CQnw^qMp++gEI4`vEl)RU( z0a15@2!TSAsqK9r`rbVa=I6R&c3u5y~6(+jW$YFEb_%nKO zLo+7HYhl%GQtr_JjTvP3X>&M)T3!aXIGVBo1_lKbq9JIDuG?Ac9ZE}@fpf!U*|*Gl znh{3E>*5JcZU4GlZWCcH1cdNLI4e%s?P|*O{4&m_m>EMJg~WjKfYqY0#~7M%i?O-L z_K}_jd58`FN>2^{Joz7cis9kq19A+}?a@QIoe(lKg$f3yurV%>-vonGVt|<{{Vcnr zf-8V+XWg+Krii1zY3T?}@y50EI+#FNDcRd23g=ic5;NeX0B%Li<3(wMgyNJ}uAfT7 zJe`?<(4Eka`2=RH?2NhKY5R-p<84P{@KJ2U-@F3p$V(&6{=taPxYIt`WMPJ-FSaC- z%Km;)@ncZ^EVvwt2?Dpg;fl#=LM18jDn|M<3doKD7S>g81!(YWEc~Arv{&fpRsJ#N zW|>1Ra0jrzGMl|^X^e9wx{bG`&owy^J}KELWz*Gda|x*hf-s8aB6G*Dx|* zDs!$QrW=bC8Kg~H!j?90lHZzQEW6e++m;O#l?Y1x)?~)AksoH^U`1*5m{E834cQke zm7_Nxg*dNbsh;h*bpxFwZuFzR=~->4)o*fH)Bfk}Xw+|5srOMqI`9{lZ0#LH38fC$ z>GDEz5XCg{DKYnU|I4wLeAezqp3+vCFT*_+S zIg*~cYg?^%a=DFRbbP~5x_B3D_0XNWa%fea{x`AP4<@zUx~T|jJ_MuYFmrL13G2?Gcc)mbZqnN9XX&;opSk1^0+uc6%g za&MsxB|eZ(Gq~hFB|E(Um+XzZnhIvb@Esh(@95Zol3~>AA$lx>20xUCh!af&XR{Eh zm{{3D4<5>K;G=Wi0mKbEa7{Pqc=;(79E)c?lHbQ(2y3-4@lF;40$$6U4RimL>sa;| zVVstGEO%^iCyN6EqIl*?!o$zJ=G~>e-i&>au6sE4D7@=Zc-KL{BiFk9fWz!5*gYYC z$)#~T@Murvlg1VtK?%<>f8k{V6jVxm*0W4zLL@^<|LHlH3{>`Zlj`A=-mKjvitiiA zHWr3!MZHDE0S1o;zC?sLf2B92hIS65wk_KEQ+!6FGxV!TVbO~d&B|6GY3^=k6^gVd zwb=Lhx}z4QEN`7ibGMtii&wT%S~npKB_-bqXd08giZ|Qa=XMTMpsoKVjs-Tjxs?JE z#9*M!r7aLz0#y%Z2{#QKQMMz!Cn>dI@8H=aDdSnSD=W$Z#&s{TE)Ah;igL*WX4&vJ zyPzsZ!1J!MDT`5`7CuU8G-bUz9*D53fJXH;<*RitoONr;IJhVO(WDjKIbttK`_EL5 zgr8hfyC>NfZ9^gU8@^HWdz`U`LpvGkcY_L%@po21+gYxqE^956LZ~Ud5rrEPfao`Rx`v@v;=v$rT(v?y3&WLph4|+PzQQ?c zhHl;@QdtA`i8;`&FZ~xVpraIq6WcLLnFMddpQ4m-^tN#F-B9w2R??A_8O@V2Tl5N{ z+-PNz_>B(*wC@{C4dl1X^iGVjL(Epm{aa8JrPdo1PI;SDAQBb~45B?l+ZU(x%SQ)N z%5#$sNp9s0@M$>hQKIWj2ZbbEaD{p|eL-VT;_#KdbXm6mEjUm;gig7Yn8KY=U^~j( zSf#jDh|E;j147|O?A@Hu$oydX@vAV$QlQxwe?d%^G{m0Xk=tAtCFGF@5} zHk#~Mr7boW_|3;iPuB%-#v|7e7D{c3E5TqIX8$xOh{hCGROzTE03N0Qm;Gr_D1Cu{ z#jkJ*?3?Rk0iJXexMJF6BU8qzGokbsBk>gl#wiuB-)eD65gKh#D@3+OU2av}MG=h$ z`6@=NISk*DIE=>onW+a$f~h$cr`W)R0oW6fQR9?oY(N1e6mDCI2*s^vecz`sl)ly; zKwp(m{=zKEdJ6}b*VM`(z$vL|rjzkXh!t@2EU0ku)@lwKSSz?<^uIZyn!UUNjxlCk zo0w8kVcNvpk)|Lza=WFS`b1%frx89R&PEa}_()FU9lb-}4Eg4@xOR zu;V7rU@*Z&SyKB6c8V^Ig${KbgClga(h37U2e1D^w#?LiAwbsya6;iZF|E-^2OYNv zaY!|6bJ0m!8R*TSzr0xjqJ}M^h3cObs?zZ?*rz8}P_|(c>l>dRLT%@laglF^pUMw8 zsiJoHQ~i)5M7o^7LyuG>la_kTYV7e6JJy&W7_#@b0_y=5nOTvS8|#3k4HJ~V50rhU z$T<4KiXty~N~rV?FYNceP+DBFf)H7IfTvUyMHPg*%zqO;?xkm&sby8A6+Y9R69EXn zrmFH8yo!hJw#Q;U1*{>9kIaQm2qapO#tmNubf{{|@8SUnU)=3N=~Q)PxYO&~ZUD1m z`#dC4T919s%;P=c1PdMe>ztJ$p4w_sgCFlXX;+UjOq)#FSXX(5rf#UGFw@PE^_6Hn)asJAWhf@|@J>oq>tTPCA3zzSpRNvV!a_+cmP35O}Z zGvF;3;!M7XI(JrLg+ugVXViDqEtZmrl=wpyylYrRSecrV;~1mAbQc)7mHol;UT1HQ zCR-OJ#`1U`OR3leB^;t&T@YUF>Sst{wh{oBR3OM))I|v{!H{MQQ&~>fJNmj?VlnOh zW)Wo0;eE@ETTa|Q#jP-hqPwD34pS>!jH-|6%B!B)6-Du?v!aSqT35JoUg)Z*R^Es> zJ>hv*MYiab_UXneozShY(jB@f6-x5lhFv?N*qRM6C9C27Cu(|gsP)hTA(Y)s39+!I zz>vKM%DdAI*PC8W|G!puMdkU+>(4#AE3&%eoLkRSfhXDwH8!?@ z(KM^O5~E&v60K)Q;28o9lQ-?i$0&%kHc_W`8`Lao7PJ0;(wzx1fnaENO(Ux9HtdZwJFC`Iq z{Cg{I%!0(;N+kA#*1fTw|4ie0D`hSFL~TC|)ezN|zU!?p1fPrgzrKC26YQfJeUupM z0VjIvF!dcjH`qFF$w9~QBa3zM|c_Mc4P-IMo1_BpDb5{j&dc~IY$uOva$G@eFaI&al&@Ksx(!pf!?Cul| z6)RU|2rc>7p%ckl(Wo?g*pSjO#MmOV81`B*Sbc^qLU&y6Q`qMkm!ez7tOx~Ye-g~Pjjn8MJu=01rC zp`>Aoo4uBMY?hObr~E0?><*Hf)(iu?(T=_uru-Y^7A(hJgxm^9QK}-RaAbBcWjA@| z`;TtOX(>t>cR%my{vSP%U-7}_pp@vW*Rj+?9DL#?_rVSruGF${Xf5jV$;@C{Q2tGu zg#&9*hI4Kh%^t3VFh*QZheunr%Rt8pq5RLvh7q{~d~G^6&5ZX)Q{t4Ov%~ z%;#n^7>io(U?z>G4(})oM$2%f_^0Y~iC~e(yP2`@iBi?_MyO@@Hq!6!DBOiPQ2!cr zN;oL!{#y_RlKWkSxiBZat8f?Q{9m38qTF|tjp7UgUU`NNue@h!jWUuSoOPL>r~CgM zr%?-c8s*^1;wPNi1!udKkCO&k_~TBADkti zKx6Ksy0<9vC$;PTq`Ctf^Cu0^{YiBYX68>CsQZ(8`-^#tYRr99_ZDUTq)y$RRQDET z{-i;=KdJ65%KS-#b$?QQt7QJ9A-X@QuB&1Gq(Db!{-nBIhN*<2K2$=jyyufWwLip3 z8OsZ_oC6I7XC+}^=CO+=NCaE<%Bl#)!o-w` zW*W0bE>9C%m8^}d*{w=KOmznO%Sd|Is-(vJj{$AGR&GS&Un@C?vnmP&tdk@EMuSteX>*Lu^6qJMWEPI`)zBhWMSF`5YL@!IU&n>G|Scfplu3^62H12a}Y4VbTh; zWERBZ;q6Nmou&M!`DEohSi*QV?RjR>fYK>46D?OwMUIgiIx^bscD=rYWxYhvzNY?gJ*RjD4I}L{+#r=prhP zQg1JK1jTkvl!ew!Q%d-~tpviC3Rv+3mLuo1Q6cO(Y=gQ2PN+@0E-c_NxGnFK95BAS9Dxyhte%DF~ zvlSfAPXR+=-%O>su!sC+;iR^QGH@|(j|ZR6i8h$6d}7|o43;uBUv<#0vz18pC}n1K zwc)rQnXXgMQWJ^WC3x>f1$vjOtrn+IfWIkQs8pWR>R7!7iatzG7NB4 zyRwaw`Rs4WJWm0cNB>0%%g|x9DLR?dza!(hv`7guLAHD^6TJlPATb%ZpEsW<4BbEL zO4DGv^t`dcRK3=qV0!9#DtR)pl%6)>GTr`KIcXXdD`pA{iwnVi7Hw%R4B8{H1Dzm1 zw5?O3Nm`4T_Y27F^kIU)gtf|W9E?(hmT(2T*PhvpqvNc%F_NtbdgPMW<=X@WB?9Jj}~f*I)$1U2D|8rEOF^aXk1 z)?@btfAKdqJ-3Q!k0<_vP0z%?vFVxq`QO^~?A)lVWiJ04&Q*#qVqPEskXIs(06^@P zGB-g4%L8Qv(NCL{FHP{?hxh0Z2hnD5htsJ1790?}(vmI8AnOJJtgM;RUIR93rADSe zs=QU{gP#1OiaUf>Z&gNslFOqc#-N!m9(DnV&x|q=mWXu&u>R8etq7y39taDU(-My| zA2e!xqpV?Yh&DZd_uOp?%e(?Kplf z^qkrbep}46P`^ZzkSzyBI z-KIVRhPrn~j3Z(t3nE9SS(N)w?&tHd> zvt9*d1N1agP+mTQy`mopN0lO#w9FKg0in&9qE$PJ1r&^2{#3s*R4%MWHHd}N=M0R7 z%5~kGfh??8>di>@6mU#oPfKdT!m8deu%BxLdLC4R{gvCN1pBLRShGkPJ$GOrv}b+8 zYcPF#{)3nz>91TU!&VIqrHgL=5gCO3veQ7OXm#C+WJ>qTmgZwTw~s5OM2D`DY7QL- zdZRHe>%XKjCzVBr?8XJ{?jC1gL3t8Nk#o6z@RGqW0s?QH&hmnx zxt0P)bHKNLaSGC{DRk+S62kx`o}a>z0oM|zp;G8ZyHDe*%%roYp>2AHW}Q)9gHfyr z->mzMfey0OhkE$Q8Rc_`k!5{;8-Bm&a2+j|v0MOlZG0Ja%4e1778Z0=rL>(-9W>+| z_J*PKY$jy?+s`RoAiAdnJ7PeUIj_{_8DZnGZLNdGo>!{!V*M!p#4!*$uXGYJJ?26}(apK6lmK4^4G{G;UvtvQ%aCd! zRQ4Ld;i;LY0CR34eVMPYIh^pb(wt|7HPfp50QvfvsboB!pOq0JI0P#t(xD*w{6rtw z)9R{nh*?RaeIxHWsN8j>96G`xzcAQPa0( zhEQfuODjd)z^>Vv+TOs*(Z;jy1~Q;Z(oJPHE_73Aia#&iRM^)Q`G@iVq1Zf*+X{C+ z2qbsV${^3WJD`Ap`?)~L!oL&$g(V%+;lW)+^F4o0)?&03>sYj|j@0-b&XEV^(x7`v zwD|~t-Kk(z*+}~Go)Tzbp8MdO0SgfNidl@mE_Gs-n8EXb^|ou#8+5#KQluyCK4ck~ zy}KVM%n?Z-`_mE8^ydSm9E)w9^6|qq^xi{dsW=l#1s0ZgrLP{AIQUPchu6e5|CBYD z)<0_;=*j#G0ur`%{HNXS+4IJdr_xg;Uc`Ewf55Z}4Fx8v=EGoEPXQof4$j^ThBbIj zit3Al*6{sK9d4CHfAYeu3jI{W=yoQZxty%RQmWu@J^x2P-#m)2w?vzyD>4PZU8K!LgzF=x#soODb7|FK17 z|8vdG=!WoIZEjVIvrP8));d|lE+hO1jv6zqJZsKxC4y*|Rb>&0T1jdP3^hV{1Duyu zNh;G4C3LA1YGTJ<=w)D}IK~=FE?H&vF}jAPvZ)r?liv)a%V&DqX@RURd!aANaH!ZP zg7(d=uz!k4xXVz?ywCyo&J}fo_!z8dulu1?Zi673t}KeD);BA^=5gCp#4LoGv*wjB zT0OIsk0-}RUCwObOqivKr~h=)I6rj|D%jvE6eiF8RK{9mT&>AeD;y)!HD-QGimDdl zN7qc20Q%Bj-OLOdg#E$LzuMKH;`+k8Q-oEce)~<)?PmR!R@&9q#A70DcwEUrYJdu} zP!>>{>K_c27`5R6s?#7eqbQX0l%iWB)-;Vj7+lknAE0&-jO^?GtuPi;&!__RaH#Jh z2=#G?%7ak%{Sj97eoi%9+-%9rzgJvfVW^9}7>3$r^`h?Bc`WKntaiykYD7`(M5CFg zo%a^CW4E5!L24}#~ zeWRO{#x}aPkA1=s)R-=Zqlwtww95lDI{s;X7PXn_wR?5TWte=*%kMa6VPYb$4KpIo51Xp}J9Om@ezX zdxor!-JPOw9|uO!%7#w^)!4v~C;A9B#;7cdQtL6krhW`~>c>&)5^xLuokWOHBE|*r1iedrO@}ERTcn+3Raj5u-g)eh>9+X!X z3+xaoW~SYb6Ix{2+X_O=+ypfnlMc$x0sk{RUr%Hub&MHn1rOc3z8aQ~2~@E4Sa7DR zdc2VAaaC7sB1~(tw2r`Utf^K;eehX0=;NAds5pzjMXE!jSp-~Lh%@RpRZEHwRH|D` zO~Rrzy%yHT52<2pwW$^HEUh?fZ0G?w*sR*>>*CJ>B_HjM5QZrcGWplRN4A41)^5kuzC-n!sjB&k9Twi%jn!%jhq}S5Ni?GwFYZV)6gQK(P(>9LSB|a(1civOKb&kZZWq7ixyDPOkhO1 zQS58#J(M4kq&7e()_B_48X(IfldxJppwE-Ay|$)jr|yMOVrz8@dU1PewK4vA-dY`n zi8HE=TF1P@qLs_Ey-{4KLVvX3+<+F{2?vO_YBX9@fg0TZJxY}|u64672ZV8_YH!e; zvw^TCY8&R~Ip0?O&gAqQ1d_fTR-)fd#SMgw+LNiYzJppL^7}x|@C`IpvNt=b%H|AvNcM8IrTQKpQJYBWYa@r#}z^g~Cr8f!>LHB4OiGlg}+U#&AU z0^+esHW+^v+MiCU6K^LZ+=YKh)@%+7RI* zM|D=2mynIJ4ngjAq%-G{3OcK8%{k11;jd2U$v$21>E=*s7yia~UHBVtSTNp*puE;; z%mTM|S2e~@k8hXCV(GCX?Vzq|2`F0(9YY~Luh#&U=feSaZC8~YaF2CG<8Z)*9dRUC zyQwiUee2dP1Id-j<4L+X)s3)-?Wuh?Y{8#F6sNYdw8wHDl9_f+hA8z~H?>@Bp?ib( zh$9)`xiFK#`vG{rN_YN#zwT;FoQ2nPSDWH3L(^RJmab-oGIzS01vH_c9{jCFJ@{L* zdZt6;Nwq8BK)4ormdZPbF(tKR-2?M5uhNs?jX3iWPC)gK5d}5}nJyj;aif876Vbru2 zpS2}v!w=Z=`b-P+rD?rX2GnN(LQBAJVvx^^#vzn@?c0u&?K?EmQ?s|)pFt)5&0*!x z6uGEfXZwV z-W!0Ab`oXHiVq{t0CgXd#=e2o9)R0^&`b9T^KImL{)QT55l=$DdMm(zmB>{rf_bOS zro`WUSm4>Tq3UyE8ZLoUj!(l`!_+uT!yxsCMblX17)Y^P@wGTG_&_+%t!*4#jj_nxcl) zOL1Ea@uLw%0g3?&po!sZsZSk+(SIen2Mlo5xim9~{t2Rmrt_7DV+N*B-{CkCwx{=p zs};+>_kv_YuVT?Gd!c!}-k4?8>OdagEmt=U@dk($0eLNZ#RI(2x~Za6C?Ob0jowkq zVG&AsM`h-zI3kyQ6hv*_>{MUTb(U=N(B9=Iu{ND|;`s3{U%=AeRY&*~EL64WCT-IB z0DE7cj;qC8BfRT^H~t$2GN(Vns zeXTrWGF|*Yt?t7zx%^y;%Z8W%u2HJnOO|@$^sZ-ZOG8Gf(SJuT$e3gt!a=VI7VNk5gF)Z*@E$o!7?m(McT-zHA+>W0y&E zX*`(f-zN}S5Dp{*l_^Q4XXe>W$G)jqsj1X9oR-3=DcM}axQ)^k-gr9VtR;Q`;&HEf$ zUD`0Tg_B&T>-f`!JGW&A)MCJ`9}ge-8PS^_I$jfrX{0WRhf!ME@+oa6n-(k5Z^9RZ{!z3P8Eh+A*d z50lWRsr1(*HCFhTqCZw!;S<_V!)pUQH1%VZ8Mv?iSY_eVt4>yv@ZX`#w2dN|&!~Z& z;%L`oRYBTeBkkg3HO8Ez9Vy0|5=6bHh1tk8MfG83j#Kz(^_ZgGczH2sI~5HXLH1VT zoIbC9|CQONe~Q{{yc0}qPLz}UbzBBEzc9L|VKCD2Kr|g6p|+>Drm4Q>Hh^K!J36Iu zwR&`98W%L3pQc8lR_EYc$QA~l=_>PVJWuYn5l+5Ls6TqK8sI23oj3OWbnHwJ7=`V2 z(mJ6^9F3l#+CbzYu$U`Va?s~9IFU;vY!V#45W-#NB(ylp{L3>Sr~0SW;+(!(I3z7k zf8(5YxyYl`#S}z~KTxfHd)bhmDKE$ZrdIySYGtaYsm*k21e-6SL(XU&VpDk?-ihOt8Q9y5 zqxmz~%jxNu3z_tv^Tzvm{GIz%f9LL<*{e+)d}M#4)%zcflr8E7ts!jMs5cX0dRNNZ z)gzR4&9rtxl!i-saR}?Ff18)J<}q*9%f46DNa-I~qcKKTyaWBVHNjfpyOlosfXyid zMGL}(V0v_xl{u!2pT(z}ZL|2~b9C z?rNp|%RF+I@=T3G*gUckQ^?FYP$6`u9&@XvkgJolDP+l9=rMXDRs`$_@HIa<7h10z z&+WNZ^F32Z;Cw!;@98qpeTP+>O5$nEd}|=)llSNI`DEpMKA*f#nVm78*cR~lr0oLh z1gVQUMK4ZUi>*^NH8xucf)-jI!Z=QYPuVMgd1F=yRiGghidFw++5mQ)We?Xl9}S$pN!bMBihh zu&DF3yRk`vDloIq8Y8hx0?)Jnwz(%mK}qcaBk}W0GYlWL8l*v@sJ@JS^6Lq&N9Ei?kRff=?ogMsA(VC^rRo3s3 zwyn0#!#=vft4!NivKs3fY{;}`pgo%E6@S@K^c$@i|sX3JoZ4pk()>_B=u!lxHkl`Ioi#AuGisY9Zh`vIr)ir4<{Mdf3M`j7T;JR!Ue z^{3$;#z9}O8MEN+M_dT6#~q8wz59mKz@USH*P1;^BYrM&)8AiMbFoLM{Bfdap@e%E3>2c60fV;3i;>H9eFlK4R~vX=@#Z6P_wFvMLg04T16 z*>`LF6A52gBV*4CafrRt4Eh}qqp(Pla6|odAMX}uqa;L@rS?=lF$#fkzOv57vf>T* z^=ilg0OU2yFTTkSU2bgu?fdE42J06}u?q{D4f8j?g<{&U5ieG{XZj{cnZqcv1S(S95>))%s0`2E66?zb=y*%#Ayg>n zKRQv`qizdWpe9?W|JyxkY#51{hDL^xG0w}cc_SZWD2@w!Cgc4s2=WBxB~JpN_YZ$(tL=KwaN z6R6uk?ArFgYG(`x_PloxY8w=_^atyc!dMRwY_AIbM=mip6%2pQVQYxE;4-=2g|Fh> zFwtaQaGCqQV&Q19Id=syu8>Hm$#DWGLGsNZy7?387h7a^@y8 zlH-sxS7aov7+`8;XYhCkc?S>zbHhuadYn}BcB;Q}d?r6o57tgY* zLw~YHTXXT0c!_L4;(qWG@9KlvA>?O%)>}K!&(?MrSqDX_wnii$wOVl&LQk`^$F;Li zTENbxYG+P5%FcG-Ozff-xF`GLZE4Wn7Du*YJTsiP+uNE@H=N;ZP5m?u^1+Ojws=WY zHN`jJxD+%q6>5fKcvqk_9kLTd=5v}_sN^(!8tuoec3gEIw}xp$l|k)}TO;so3fSfg zVPZ(+k`kx|5cv<2LsQXT-G{MeAbv#gzC>jY*+LX3=GiC3etf1;fIRb!0YQB; zPKG+^-JEeXXzV<&;9l-vv(RTJtR01}o*O5y;ltWj|0L8&ed+0w))l~Fm`_=q46zaO zi?uxiSY@5HvMAg!6MMN0VQe?wvsV%oZyZpErk=AVvSqR$qm>E0xZ|9a@bdp_G;TsP z?m*A09}OEMQ2uY$WqiTjb|aK}U9ffo09KC=d%@b5{j$cIx%oz z=n6X?1D4xSo*+T-rv7~aAqfGm@S5kdIvxl^LF)6z9h6^Tt;Y-czN(l@-lP}g)~O|gdWx=D5jM692{)|8kon8{z7Lq0Y@ZYpYF%&)R?y4u{uI_f~o9ZiJdC%z|fC}FEm=5)ab6Ysd)thDMHTw z3L@qByVgW;1MoQCwF{$f@A5s^Uw5J3fXVPehU4=#Qdt0=F3>8yC%i`aR;exaYCl+| zhhT{ZQ+jQbyA$;L>h_Hae=)w3q(+tn<6ICH_TF1-@T9#U(BZMo5oirVU)F`ENX$L3m%= z3i&j6n6;NL9=09R!+sH z3L>>T6*~@`a;2wY;|vuC+md_xxoAp?k^=eJo)!L0sc=}`6A%ogk6_18T{S{IN({yk z;Y;epO3fPnVx9`dJeS`F$b6#e_b9|tV~4PM9eUn$UvF1vKW)aZzH^tc2sYk)DM1{K~cjPZ-w!tyZ(@KIQ$tuKmX2gBHT+$=3 zgD!AMO+s6fNb}*?6~~8(4~M;`He^33+|l1g{=I^N zu-@v15c_(1yQb7cTyLP5xeqa**S?z43EzgmpwzmK;AY+p ziizzC_`++dVp+gcUp;`P7b3@YQ)=CCzMEPzb#N^c;${LW^L8yMjD^s2v7J)`V@y~W z2!8_f?W)Gq01gN3*Iz;q9HlPyRaa_BGRPCk9u5wn@*D9+mWSJkpqbIOxIjl?o&nl+ zSwpzA-b_;9xMkK>c;80L6;j* z(Q1D=f=bb$tt-lwGPaPzLV{<_Ew!-dyk)J1!?lCItN+o@3|=ZuOvq> zJ_5~Wq!1OTcV-0Hzo!=yrSM*?Ty`gyXjtKe#ojs>u#~q>e&Vf@pKL6sUMC+N_56pZ zvsffy3dFukiIO#omCtU6wEdOO6+qM1;BlAxDqB*$GJfK%jGr9+M`e6i)e2r2JyA!B zZNsWzH)_@BgX^niB`aL8kH@A@?;&Dcr(p z66~J==r6^N^_5}!XBoT*9{N#xhFy9QqBjn)?-`D=@^~j6VJUAX@)Pef@RQ|K{TaAl zpgQ)5uK_;)OT8D_GjLx)tpThEtrNl9qCG8p0r2LX_BEiqdIR{0w*mYlcW(6taJR#; z>Um!Sd~Tc78o*rQ1yba(d3+7aB0P|`bo2Hig8lXo` z_6{Q-0xe`0A4OJ#)_{CCI_PbDtrylIS2mH04)k2 zZvZPoYkFa@OtXjeTPSsb*-7VE?yl8r>o)p`feb?+ht%UG<9wB!PFJW9&2|R?8 znzM|3Wpo53@Ck_Br>_)Ac z=zFSJ@2h5A^=kNuw;Fy@QB=LJc{oEgXNmSS-fGy5S~aovR8!)sW@Ghg_=&d~ezNt$ z>ecYAuR2Mq=7|RS)36)0YTWl!v)xzC*6P*p6K^&AWaUTItKojtr|Vj zf$#m;=c{H{^=kNuw;Fy@xVCyV@oXcnuGgO?MSmK0qgIU`V$oO45nnY2t5?HMywzyG ztgBuPkIbl+=uhLVhTW)DQ~RDyEB94%w0brC#9IwNS^jzTY7+U=Y}cPAReu_GqgKs7 zLO0^M&-@x=()^Z#C>jt(xR}o~FWA&Bf}~@Dpz}{G|A+ z>ecW#66z8CX&UNJ!*0~7(PKsW#^#!@nyb~T;V0f|_{qTy)vMv5C)9HNX}s028?|a0 z-19U!pLu72Th*)KC*ErK$+eButKq?})bsk&G}51j-KbTQdQUZzeAP@~Deq*%PrTLe zlLecrSJRNc0u}nxpqjC4R%AD7)ik=NnyIXC!Jbn!D>mjO%;6<4*`u*HN3}((3BQL= z*{lGqXg%1LZ#?GkqQmTWV||hokGZ85YOR~zSZ^J>Q7fXEw=R9*UCxT&Gwu?W@^%70 z(K~_NiFI6qkgUXA_M5S)PIcmI3eT`$b@h(o%qQyD<-X_CaVGy*nlv;Ce@<3})<_*y z;wyZeuaU*o8_7@p*+>m*vR-c_3nG@xg)04Nd5-nP)mzDfiK)d}haGAn#ma0r*^R6% zBs7(R+xx2DSiO3F;(by0Ny(P#CG$We>NTz8-c9wA*^Rv9aVYsAU&&jmm&{MRCG(T@ zCDltV(Jb6KXerj!!%Zc(${Nk?)H<+KH=+A_a3vOTE&^dsp^xX+S|NOklc9c18JRI{ zJ+C&CjtQ~1GzKRxX}xY964P7;xanQnPor8$C#Am7vf|ZoTV;6gobD4$BU?%zKs9P^ zCDnxf7ygcvx9uedwQnUgmnR+A@0TR{xdYV+2k5<4(jN$}oPK39I;juVlWE^hqiYXQatZOYbi)U5p z259giS-jvxw3inJbsAb8*hX@Nbn((N>b&M!AsyOCHBLl;)Sqmw6m?0$?mDwPD=fc?it-qsx9mJ-6G5N`gu7j+DowL zqY$hj;X+52x04=et-uOkGq$EK8^i8bB;)XgO++J<3s<#(U z$hK}(@6EqJ{tWuQ6%UfyS!x;NZRW4x2-9F;VH&b-j|{WE87JVAH>t&!Xi;aW9_#eo zouvuhc2l?PJhNGE_FIqhX6xI=f3w+qcj)bAeP{T#TC=a{&2~`fxATK( zco#`FPISZWRut98QSfCL3=OQ!MepRrdz;(8!HzJ>=}>G1^eWH4+dyyF0WH4Zf7;*L z#!K&SJuE?0Y-Y4CJza7#G}Pd9sim29@7#^FEM2N={3t|?EGYfk3E0NnS6z$*Q`;MP z-0sRiQzfDS4sjloDn5*oHyKx%__3bK2<}aA-A%^m@{s^I*u98J8zC!PJl@g7W z4jA>;ys|Zvc6OCsQM}owL;$4;rwc1X{K3k`-%vmM7Xp=Tfu$hviMfF^yPK2_8?(Nt z&_@9`^X&n2r|{-)ZseON(RDsL&sZcGuAaBZ~k+-*%V! z$#W3XDUHzlW46oTSVi(%j^&RVW35Bo-eazD)a8*uCJa ztojdOC-iO8#<2mS{epwdnf^4crvwItp3ux*pzNM7qRb}YZ1=$}P>JRa(i$mvgP>vn zA++E!eroF>U^(+ckpRClxy!`#kS;Sc+0PI|ebhV3iS1cljp818z4~1&k35T}aYUA9 zDfRMHuGIzXBdSg!GT9Lw6RjP=Yccw2(bSOu;RD>nU^4zMIB0Wflw{elHweOO4`bmv6qFhtKxZ2Fjy{I48v+wRFG1qpBmc`niXMsa>Fg?^? z0&q!Vv)yX}UHSC>k`3NJ3;RonLNR@(9j^3;IgR^4htNX(|gH2;A8vESS2*)G>laPh#$`cFKF%5S*VW)x}8=&(uCsdJQMR{1@7XpIF({ zNy?A9?#N&KoE84Lb)S`nh#$h{3a%?!{j8LUjP`+2Pq=&y8Yn#?&NYzBjbJ=m2TI+| zAF?ms!o&4Yg=8^N<3UmgteMn#kknrbl%@sq(SH5(8OcUJ43e1R;oU(f>`#Qn+LG#| z5rZWwJ^!54i@7`Et8r@gxBKW;0PT44dQ|>ksRo?V= z;OSO6SV}Q&7T{Wl&}u#DvFD}pjBTXR3sM8|xQRA=ACN@TUy#C>jePkF(i;)~0o_P@ z{4Q*}kwh1F1VqvJA<`jp?i$88;u-Lwv`z5YRm?uSikaJ0+6 z*=Judd%r(;R`bmGqW$@o=(Vr-<4Y_a274+1SXt-7qA=LajCI1Aimg>{X>nVT5ud!* zw!&=#t^oFUSOxN`ZZ!0X`507zS)Z+z@BD z;Xky#AWoQril2~;AjbB$(&W*#tVYp}eC7F_L+IDxlHB57@o)Eg{3^2ybK2tbD3!K} zOr$r{YA^@50WV3+U#l>!MwnTG83t~~g55lj3OfoGx?J;3iEJaJ5#nNn^8gssNuSb* zxBGUaQzN9+;qwFT9RhXEjWG4*F8VlIij-~_0z9H(tAR*V`?9g39m)ki%BB!}k5h$$ zHIF3Wdx#n-DM35-S=INi*;VYs@z>AZk5NQBC>_5AuRUk+{pM%KlnC=^YI0~WjTc2Bp7p{^j+~|b3!B%czeh?j*yk7lv??nC*s zqSql~-v-%QD4O2&4e4oIE6au_?3OpAR?N1)*&gBn4fe-^c-KxF-;(-3O3-ICuhXHd zuTE@|ZSc1AJ*vF^w$xGR?NP@{HyCN~Ua=Xt0^Y$Q+m~|Rf#DhW;Px%x9{P?{f`w($ zc!_bbgiVkb(-Ani!No!uHyo*+T@$2cY?)DiiUp;|`koP#IuTd|Y+BlxLp&*yqy!!! zYrto}I6W`DFD+qUl5YD($5DAdO9Cz0Bh>Vaog%fvWzUwWcnHkkG7oFz$(b(AVt3~~ z55Qq^uGAOLrHij{edL2{RJnx87Z1d;dKPz=UaA#lV9&_|Ss}JnheV^QF(pDqQgx$2 zRRJ1jB3lzfwJ=wRebu40QD+%uS#&jjRTeH>vO2v1ufTr7n!|(|b<$>PJQHv3Wa=|h zayfl|VNfLa?$Lr`)updyN>=f21ARA>BQ}DX*n+EZxn~}F3XxF`*Q`M~uU)o#hI}B6 zWZiLWmNXV)ko_)POtNQVHQGq~XG>3u$AJ7=ghjbyMxvd1M(65@E$bW_<2LZRbnj3HLzIgY}IW6EEFC-i?`oR?m}ahiCym1(g+F%UArD z^QF3Nhk0?r=t(Ak1#6Z|CL^kqe+04mP@HbK1c)uj3t~fu1JPb{fz(tKKKAroBz+;U zorJp497XjDC4cXBqIF^Q-H+GJ;DMXAVC~(yXZM4w+A#jBpH{F&amsd|dke9vV9)v0 z7EfT2bk*c-lr30wa{*l6l{Hu{7+^x;3!K!91V3+LOD0{gSV`I70 zIrF$TV#PLExLgWv%dYt%J*ua_<>g+(!HX6!E6}X4%ieOe{Rz8-a<49zTsD?VJwKC| zd;VJzf*ubG<3&jzG1uM}Zd7p9uxEI>ufU5htf3D+mhyyso?4%?7N! z(k0_Ng4%$xj~YXyV3ljU5$r65@{SroX17YJV_Y2sQtRwq*+4mWl4^KIE<9M(^w!$Q zp${8sedtfF=trGT1gnkMut1ZctFQm9oocYEsj~H*s;4EZmkC`6tEHnc@yHWeUAJJv(9|#`jvEBoPZccr{Aw>+Q^4BBcgp0ElrvdZl1s{ zWKhQMQ-d*&N#Z4cs#q;MBlxup)rTPP&J($t$XzVQn{%~#W=wV@2^Xoz+CD6T zU&`<`!OY6>??N#YfMx>Jm5__YkxXC?PmbDrmkku_8Kc`c_9gMPS7 zL7}LOU&`>VW>uA~+(;*-_VMPGT9)!Pa*|l-Pu-?EoDuw5hS#;ZDo@Eq8aLGuZ!XdD z?7L=25-Q*_fbQm(GSn)Au|8d1-9#BqRC879hRdJHNy2%`{T(CAFJ*W!%2l;sDdi(u z{(H39JZUo@Sz(ouB%bxBqP6G?e$6)pR%P6!zY-N|WwUvgR$b#q%2>XM1UDL4uI0)28XdnuqSfnUr*@ysUG_>1IL)h3IP%kpAhq{EP)aFog zXiAWMD4?m>7|YW}o=QRL8c)?l>NHO=WkNAJu&Ef2)B>JzA$5eOz~!lK<*6{Fa(E60 zQWyC(C}`E?wfRLE$yq!Fe7HJ^|IE}OS2u8_xmvh`io)BsqE+7jSXr@?DhqR>C63Li z*vY#T)T2)7d+l+_YS#1~_N53*{fEEP%x}n`)my&~i}tf`W|lTRva`TIHhhZ)Rb2T_ zI<^&iv!gpb*R}%kCvFDc?&}A^qy|1zzE=5zv8wHNQk*oe+{GwN{M3bjYkeoxH-b*p z%ozA$Xv239hV}#a`D<#pc;uw#)OV6W2-!BBXE3Qheiw^PAyanFbCA%zbpr$vNd2xO zIOVM|gFK73L&pGo^U3d_Du8&yqKbLqc1xW_NTR|>1eRt&tnx1-vT)9~HNZ`}53;kk z7$TGMGIVxjkQ;h?g7yQCDZJxx{~$dqXei8J&+CUI5iFNSfVCCr(2tnX`oj+anr=o+ zANw~R5^RO+Au*};r?-9r*0F$!ev)qCC0X>dG}R274T!tur`E{XDm?+9YHvWSv!AJhSV*f^nXoOxIOKiym(zy#=&a_BgZJ$$ z*)x+{Qp(;YDYUR$T4I>`WeUysLwXW@Q2N}SP`dkvl*>vy6N?xQr#L9H?5Z>fKaack zFqo$Ql&0h7ykEGUN8OCwZ^~a%SNvSGxpOFe`g?3^x-t*}$8v_ftk9?B4c!6S&W$N8 zgDMb6>C=m2-4Zxoc|WqN{r|>7jD=dJjC|~OO57n1&xdEE#Z2$@$T^rQ(&@8vQab#~ zh4T=$-=p~RQXfI|ym?+~%tF$w`3)KVZ5h z%wfhQj9DhVd`XH01Eh?uXLll~A0*4-OVX$8z3P7jTX2*&rb1Gf4;4qXFRDaHo8B6# zeKSiV)EiihpxAJXN&rG*gl??=K|)hX3U7;Weo!SqNh@a$gK zhJu-ofdO-o;R(;u>*!svH;95~L3dK@3Srpxlb?W9DCa|mi(1XHTjdQKP3o7Tx_rIt z!nd9OXDG$Gao;e?x{1xi?hO{;vHKK^D2>(JMOQ!T2%)#!A$`btOFC`&T2a4I?6;}X zg}qR>1_w-@z}rw+iCs}=uni1FcL8TdnqiZTdTC>SLk) z1{OV-*~2JhT2n+*Ujp9pCTQ+=qdI-QM}}`oIz=q8*YZfBypHW;c|^j4M!6x|#Ii7k zBQE6z(Q_vG4Ke3)Dta|2&Ybf(pE--S*pq~8rko9pRQa|01e`4V0>E@Rh5|>vY&I8y z_!@F;o>@+!b$ivy#o`?L2ROWiGhK26prpKND$0sofdDuir<|xwwvsO6~FHi|crM%YusI$bKi? zUzkA|{&H9ZzkVNKXPs7Q{-BO#^E$1)?M@$xqrLvJKlGD@chbWm`1SipJ=Z?hI;!GM zy4ie9>*31T$w?rN8xVjx`K9|vKBsxUc=Ks3OXfEils{ZKAv%QUe_dSE!Ggmf?v6h@N-ljNDcpXRO^^- z5=5XA=|_e{m-cC&Rk&*z5G2%eC#i(FsW&Eg#dmQf%N@gFm&zQRe=GrzFc z9Xkj2GpR>VC-77XQsroLQ?V{myLc)QsS^HcJW?xp%7xTHo{B>1JWquowS?zzAaxY) zAu~&ZB9&j0k-Ek21Abo3<=2c*t*I63$nLQ}M(u4f<9UN4SBxhuQ0~AqCzVqI!OfUm zOQDk5q8=ywp@Q66f?%T-iDGL{zaTkUFx-s-&^;@_L3uUg49xEk3p&w=*E_`0CSa~=OQ)A_GIE;45Q-r?xZh0g+bd(zmTkAa^yXBV*mNP%ZLf>A?LhrV#B@aL=3u?*Z(U0Tai-aPyaz+5POOP4EZl?s9u`^kiyRL&~CCI&Tb6(i# zFf!DZdqJZdpvhaqYs*ZjTlO(1jBnPKC!!hS6XhWYN_II>Zq0=*ReUa@pzq&t0tEen zet7h|k44efbFs>iOMk!Wor`4%EHWu$>Qb$equ93qyH#oc%xN|fu3x^pJI&_u3{Hzlu$oGeW_$@mugpacVtF~}b9coTUz3x%9= z`wG|~o60R2=jvMlPVzLBU*Z8h9V6V!s8U^}QBy0;1!7+CpZ`a!eG|g3mnK zQvOpYrM9i)7&mwU;sm}~SR}h)kz`F}dq^W(t<=5X4WPGL$&t8wZY#MX4kug5^AH*A z&DL^%VJ-dKT7C)E$Ifl!!KQD40$MK>-Ol9wVo^OA4aI>=Awk{to*4l%OF#VCN#DoRmP{P9KqnvB zg`j62I;|!(UjSwy^GTb7cJ|mHnK*C(V(gSqs_3!7(gG2O)a&2YU}1vY*wJe*9AK&< z)?^0oFb=610HPMAt%Z49-{##FFlT4m8wS%)kI5lp*-DPS)8eni1q_KZsUHi&;}8mZ z^bnZZ@DVd>T5jghA^2*;hT?ZzZ6F}J>tk+HQIz9MF8>!*@ntk@C~GV1rU-WB z-!U={jdul5aVNPZ?afX05B659u^lioQUG1r7Y?hMJqeY?~A*2 ze)MiJHM-K=$K`CX*vvwhB(P&O=m+I@k!NEzO1U#Sj5?&tZN>S<4^rL!~6xMWt&7#u-4#kc&a_~}7) z5Ipz>jCGW9^F}gdc9(5PrzYR{2#2TB??h089#~bN*{OTuaRz7z+S@FS9ZP#)b-{5> z-5W{lIAd?KXxjAAb3x?Ve20~BQoae)-STg!v?siiC-szLaIxstUEjsVOqX)fVGN_d zUUEI48W1UC^G)!-o=q^(fL{3ar_H}JQ3#{LUigSVB;omH^;s`G-z+j{0^0zny+bjm>upG3$1LKB~qM}|y0 zX0GRlPnt3Inp*lfad`h2+4^D>exY`Kk!z`e^71=Fb7ave=MA8T&+Uu(z6%}ci*>Oq z|0yg!z~!v{)Zyv-l)O{Wv`7M}cjkvsT0cGznf>H+*5SqdWHt~8cNjsJ`^hh|-t0eq zs*^_c$Fe5Utp2|H!s&K@IY7JFNwEXuMBH33_Ko^NXf#F$T?wPMgZ&q#3LPU6Q4#LO z7WLv%dUJrBAfk7d43Jx4DJ~x%_kzx+h(GRO? z8tUKo1%3If+z9nwdY0GUbD;bta+M9llXNF#kgO5u@8$KWgCO6{p>cz-2&dD+L2`<1 z+awDs%+DVqxn&alJVw2%b9Vb zDQJ)!8_aipnBe#`?7@=(9%vtp@8OxjazYcXBh;OrtcZf4LD!&K^^Hj!0;yJwN}Q3s z>6_4B!Ya?9!H|N{*ptsgOb6HP3-V)FEK6RHd-3+g7q}1CN5GeQL*zmhoqErU@?hNE zbf`QHRB5_b57_yHnztQvYAEJ7HYgzUMYE}RnLZjSMqqv$NpEE1_1;Je zv*lDo^4Xg$zlcNWN_cbk7>V~{B)u?_-!Nq)+B=C>jfAK_lEO#vi>*e<3C2kR%wJ&7 z45mAuCIn;g1-ceA0;A+dc^|aa`r!5`**^e4A~o+Sdn0Y5WjFg0Qb%JqF_MUZ4l0CF{Acf2Nlf@~LGlOHv{u72+~KV=0v zao^emM5`YRUWglO6C_5pZc=v??A<5|A+%r&_EI0xtuc_LHdBMw<;JLQ;Oh{n0O+_g zG?*5>E<1pR*^7uNcYr7VJb@|o4!)AQJI*7VVQ(jR^w9(5wg~Pq3sG z4%GfSlJhRHt13%YZevMzx}mP=51uV+sj;qUB2Uif5sdKA->@4>Sn~Vd!jY_G$vYca z6`AkIbxq~`Y931-;n^ni46a-EEK4HdXq5}9pWDer7*PYHsO9JxOe3L?lq1H=EaE6| z?N00uMzu{7HVgJ zC9|_*+F1e*a!Sz?dA`~_!YTFB&JuZeQ(CB<)#0&CLDk6bM6hdwEv4v5{4AMAHKl&q zSzR8|losL)k>_;RI~|(?#|6!aj=x$No~@JQY$534%pf0d4FNI$YO5SN9H71*PlCWg z{Vng_U)9<`&`g^w%Yk4VP>{Kj?ou&@lo|3s z%hAgvSjpfDREB6SQ(4Te!Nb;dTi~BfH;oxKN}Piwv@a#Upgct9=g2Ee!x78@VWYC6LTTk(IaQo$ zWT8gh>$Hzd&$^OSVw!#Z301Eb-3}8nYOiKL`m|r4X98 zSaynK0^k0C|5CGQVq1m@vtDzD2sGEPi{+*a$mRYJl35pz`XP)R7(}(r;gI~XJB?Jb z&|%ipH7CQvo6(i!vemY(%%pxVsNZ~q(6Z3k6fFmuG<_v%9Y*B^VUd=?6;S}7_o1S% zWKJWLx)ipG?mXJ*KY8|xR>;qL>aUkKGcD7$wWH2 z3RZ##SY9}?L^HauolTPP8I}EM2z!vdg#$};drJm@B`~#IS^Z#B3&)k{W)_YsnMNsp zo_e5#h2u(e;|jx-Ky7xr_`${%)(1MQL^rW8SP2P#oeF=DfrW!gblVCCl^hZ@P{{*~ zD;!j!nN^5^O2mCoPnAf{2N_m4szf)ba8$_&Dvbr+v=6YTa7>A2Od*abfenRWN+L8HidyCKuBjZ<35bcyFim&X z0l+c=F?S&hjk_A1B<4bK9Ei7_U(4{4-d6!w=I9xV1KXR;bF_?kpTq1kgEoGShvSzr z)GB{*y~34RK3VesU#Vp*i37Z8x`|%0qegx$!wY(=s$KwGFR z7BL(EkYeG4nO6?rhukK_a5r8Hl%LN6<>#|N`S~nRem)D7Uxv>F1+<}Vf&#KfH$nON zOi<7$>n1251auP=l%ARi3KdsyQx%TibKH$5VZHp_zdJKe+WJ47nF%vY0096y4{hD`QN{1Th?JSR6^-wKd(f4p7{on zJFgc4-E*J|4fV5J>$QX_pu7ho;pzOMt5eC^ShVjjn1wvE5 ziKT}YWFvOnvlLmo&`K4t0TxgA_sklXPW^YtJpC1=D?ZsquMx4a$}o1z8#9rX1cZtD}GGvV3RzkUPyxqiJU8ogJ3 z0U`X3@0CwsSufouw-CjOgLG@Z9B#aLaK9g|TxqC7?GK=wzI5||%!n;lACzn2@$xzx z3!@7MAz#7rw-|_tfj`ItSj>Bo#=Z3ippEpEM8EwYH>z;L)AYj5%||0o-MJEE0-Iv8%4_lyo9All^>z*R56u zuS27N(q20(w`s(h&m0);^-&hotJ*J+IeF5>RQwR1uO6iHhvjzS#e-Dmh#YTW%~7u% zq&eUO_l!Ow+XZoLbv@?!ALWhW*7Ab9Hc^5OINMszXRn&`T`^OdEvTpsMCxfEZBOGuAbyZ+@q)D zb$H|Rev$vdSFrmR{?@0SmZRi@D2dS)*wlRo>B-ZwMq2>lY<2rVMq5xv+NagERz1jH z>v)FV+k+!riw%Vv2*}*^n)ndQ;iH*FCLL^Tw4S_+UAz+W8H9}=cFAV{jT=!Re;;3@iulU5- z(6DjCC(dXH_$CmO<5cJ308H;FH!?dyX-U0>du?YCYo2 z{g?sxu|8^Qbi29|SzLaU{nO%j%54`L>=}GP&SDny0dn(DI&l&25Wr+7!V!xgBiTeb zub6E#>=I1ndv=@DU;WhY53x80y{JKXc!Z7qOWqD z1os1Oa}{_6$P1aRf$X$4QYdy*9Kt)qNv5D~d|+YUV@={4;Ie1oIb1x_7z_GMuUW4P zoxBR0EAXN$XmZXg54i(;Rxr(1cniB$1p!s#>!6UDS#HS(0EL~H^Q+eS3&O&D8uAzR zkT+sz>R)nl;(Qp+83QQ`M>&tBVdiH}jDmf>JWpd1d$x3SJ!~sc#@K@%kQ8|xz6Lwp}+WRyY;f`a{Fp%QTDpIZa_(r z$pY>&Oyr0g+U7j#A*G{d{|zWEFjXlCE2*SKqfahGzg11a?^638KMUktbMy8s7`m~B&{gdVe# zl?11kG}Nq%1I$9nNJHJtAqaw3)G~WKq6_i3a=2=*gLt#Kp%yc}vA$Dq*a)|QkF_@_ zGO|M73`cc$$}?dmKbOV+3Z+&k!J(S*88e8_APsZTYVckQF3No&K?%@BFeppjx*5;h zSZCCHCPH}GQzR%sLgNIgVCB9FFHIXuGH+h=qYvc^p2E27^*d+zS8e zBb~#jy+L_e*h-a0riD<+of$@2Z&13Uo3lpt3Z@vN!nk}hO2Dw5sijL3`vuctqY^4^ z-$!5JTG)GXgx5grb4mt{z`lHw!h&*I=&d;|oCU?(8Xy4Tohy+pDqp)7{O&mbi4~ZX zjaWNjv1cd-2aPr>afq8oW<|xY7k=3vUfO2mG?v64EDE!|-nA$#K&7pK$2SbXNo6Ro zMw|T=1i>c%0JOC`2fjKfJwSqOE zsmTVa+%YfAqOM^x=f`YTiB=dX1ZhNC4W7lOdzhTp`IH2(1R`Yi zpmEDUP_h1ILs@tQu`88emzUF**Q%}Hta&`eE0_@xpG@U-o?&>h)DF+Hz$~xQ-fpe& zs**eDnHTd%zip$rc4bI3c%nKo)DAEWs&FSp^osz>2;&9t{|ngAi{dQ=19Xx z-Fgg+pm*7uqa^_?R7NrDaq$Sn;fV-V5M^}vRo)!_*%>rsihZ)o6w+bT&7sso!#ET2 z2M&eVRkk=3_BG`_Qzwkdi~6Ne!w@A`oD)Eq@8kPE5~6g%O{gfdVqOJdL_@TARK~@VPB{c6;;B>hgi?(Gl1s8!SBeRHM`&}Qn9>-nUtB0 ztZ@2CaVnP#BjQX2!p%6Co*IWKESzkvg4^B+Q{HFY$zlt+!tp^Yp~_?3VJXcwb)w88 zqZL{gt_;BtWo{2@5(8!I$EPBnYB;c&Tt&G6I9>;HaB97m(5C`KdyK2(_ z=GWttK+{1(1ZWm`H16Ve|E%G8z9#YuT|G16m43{*`ci_j42RjZ6*s02GmwE9jj|oI zx3-d+cC8R{Q5fEG^f(m0stfX|S}5F-V2jsfCA>f0B;Frya+a2)v_$3ckf~rS&^~ub z$MhKNl~k0dM2R;9&0TzdqLK%(dSD%8G7eYjVCvfAsgb0}%T;|(TMs1Mkv>D?`KrBC^MJ}FRmI) z=j$mBK;p85U4SvxS89e;z!-)v@1GzmIP6l^*iYlFx}&B6-JR8UvV%$n95Pbc(y18F4NT;yV*QImK0~6z>eMpIR zwt|4tW&8z40>ggAK{ot*r4j33oVk^sizzEs8gKjg`Q4TPA`#TXD``Xnbj4Ph)_{N2 zM;a(;5dL*J6wkmuRBU_k;2DokulC>p)gHXWvVlFgPFwYFK6rK7D%zByL@>&vA5#>! z#GQ#TS*sQ2$&{+N;U-&96job^_j+8Hr%eviy1d&Xzu8_K=yiuYJGt+K2h)vIr4?)K@TN)_b#18lvy&$qDvSnaSwp41czO#R zZm6_CN9w+mRbIE~$Zr}4NDH$((z2yMN82dF40|@YsBA~aNVp1@?(dsHnI}5c07arwEEcb$aWBl! z)py0%u|r6x93JeXu8q$r7Orixm(jj4d3Rmt`CZ|a~?}vSV;gALnib+!xaW?k1 zS8_w6RHie)j14HIK5t?{=3QF2js~P*)kHiK=HIj^O$ijYo&f+@X(Qsd%V|oq@rYfu z6y&uqL$pXxm4)p3wqri-(eM7(;h?e%Xt%!#OmC?xOZRvLrSda$QCSORMhcr zCstKBoqWl4!4y<0fcFqKZ`XXAF)grncH_t0u4nFL&Vj3kcV}j1JF~2g32bMU)v0?G zF;Vf8&vZasIuH)UU~7>5Wv>vN_z8NZS=BbGssg@^ z%A4JY+4e^~(~Qe{(H+AKh{He`k0lJJZfh*HDXF8vVsKvQhzDn(iv9+@#zeMNgA>5T z8e!D^QNA|gvjxE&@GH>ZnCKSat4e0=8RBhv3p8Q-X+?*M^kfoIW~j78s}<7jq8kA;?_Q{ z7ZsGyb5DQ`Ru z+hBLfZVo*9rpJ{i%eYxCXdX^dIZni#K!O9g8m6xNw2Y}B^j#NL2L2qMcMx5xh5Du?F5lxJ2jE zl@{U!8Jmui!SwOAOi6)PFaOfw%<93jl-^Z&8K2hHuFAVGM|A22Nj9BkbW>cm$}c19 z`1v*SGr8d#nI@Voz0r@-jP+r8ZYkMe( z{8zX{G~5*orxFM=%pLljuOfB8WPp0(OS1MsY1Z>6oUkgoKG^xcJ;^-*$gSl>sfheZH5mb{8!T6r}) zj-sDXtf1M^7iJ$13N#WECR5udlyrdEoRru4IVT;@8DNHSDNG}J`tAv3j9~DjJ*gaJ zTAS#n6c!%1^y!`sAZ(Rb`td1cATFp=%)t0(&NNc5rfEhh_m3R1vf~7bhIC)6IA$;m2Gj0LK9 z%|Jpw!JYrS5^kFMWi2>|370I1^vLr{ptMU<1LK3dNSV(oJFqPRis&sYODkSbSh%El2hukTE8uli?=sD%gRFk7oo?Meaiu%1tgeQr}?;bAIFNS-JIP6Sa6s zu~W0**lS}f_5=CjIu(hj%=VPs^UZK2L}XIYnnL)qX=Wx(6raY z^|pDSgs4*ocqPPtF=asPc{^L-M5V>q9qUrMFyCgrvDmEsev%GnE6hPZb)@nq4z))q z?YzyiSLdsRku(6>&<-voFmQL3yhzMYUaTz!C#yOtppLB5L? z$mkPl+_ZNPV7eWZf|N0lf-OjU4x^d}#}1v;Ru~pWlSV7CEPU3%Z+4WjGE^UsYD&aOPEPBj-@aYf4WDS{BfFWerRP$=iG}m}b4EIIHPz z*|NC)HRuvD>F8^a3z#`LoZZg1tRJ#;JBSoqRQcg?r-h?9?Y(KlphKYrh5e%ho2TM+=uo0^=d{tx zGf+b?vXbTOobi(EDr=o@e=eLBzR6UX`JE3r>GGROxb4(5O;1U?Jh3_h@luOI4YN~o`9Ms@=F@Bq& z)HR))!CWpQbCpQTfp>YlZEBONgh$@Pa~7c5sx|`Ixq4ZRd}V!^i?WtZVrBit${K$g z49J*`x^?=)8O?|#AS;MoSpmbO@htOgMOvO-S`%Mslk!kn9&g!~c_{6|1g&K!`c>*S zt;&fCi#8cJQ_tJXmlu@Rb(6~`q9tCkI(;t_plXO=CJ?W^#hZr?4X1G*bmCt_$s|m8 z??82uP#Es1n5486|2u=Smx8DLM}xALFes6pwbPWH3?K8aBeQ7c|Gkm%mi2#UWW1&Q zcSgpW_y5Ys5JskvC-DR23!`|`K;;B2t4_hub)k|ZGmvRMyiS%$E(|4O-xxMWVGz?c z>+m9-I0o8OFZ)KsJ#VE|my{W2Owp|g;r|4kx)&+kJrB=SwizB&@7go}3-xZtnhjwi zoXIin>;AzMR-nxH3LSK)K#4R>Sj(l3Ev86z(@UpXxT$fW@gHMXA@+V)R-vAzyf;4mXQ)<^mntvI&_VbfmnvJuI%Ifk z`esK?A?u`hvkt`3TZJ+H9QKSia>2VADtLe~CPV^9D$9U(aTt{hdC&J^Qrl&k4g;*? z9jS1c^5XwT0J9<0^}Qfl`Tq!DP^F&3fnuG608wo!DmoOz-Z5HMutwh6qj!R{ZS%aa*OVW&~_G4duh^8OlhbIs6L;Mf0 zs&=Qs1znu<=$B4A&HO=$u>HBiq#hR4!@ovyEY?>)D9M(^H)Ek6J3tqKB!C`zM#LX{ zToMl{i;Soq%yx4giK4TIpjMktL5G#e#zTx&qq3{rK|k$>4rTXYWb96r@^FauH=CNJ zf1#?|H}U^)_Z{F>R9oAbIW0NK*)u68y_|Dsp(pgF$*2^igJPwMf`CF$ELSu^uwVhA z!cqYP_KO8jG~R0i1q)JbAUza8sqtc`{O{U(<|IM!^WN|K%k$s+$ehgV*|XbPd+k-; zbu>~reltXQZ8}YP@uDDI*Q_;Q(6BNYh44N)Y-;4uYd`XuqdT4u~QJnG-;Ct|a zx?O(&2=7aPz*D^?FdEeq59$)6@mr;Z?Vnpg!oBIst#It+sR;tB7_5D)lLD>Q@ywsNdt4t~a()ydTUb?4dMxcc4C$;`VOuC}#0cDaE-Ml;R6_ zWA?75BaH^bdBe-j8yg3CvMD#V7tr0^M{z@m`jxBp=j-V;^5Y0ZWePVzn>^W{h{HRL;wda3z%+J{xa`Q~bxQstGlkp73vX0Ui{+}Z;EXmn(23$}Pn={hJc zY6h8e7+_O79uR)o&=q{=b}Be*vXP|kVUvv{OLlw1n7cYoX1=KT1g@W>A!jC}z{7wre*Rwp3kp-D z(dru?^Z<(5QSjBW`1hlh$ECuj#@SYx+yBh;>v&?@25i7oGtvL4!bgGp)hK-Yj+Yt~ zK7N379}m;;FkEUZbx^QPI;#TSv38pKrenFfy(ZgYQHe@XT0zR-STtb7F2okXXx3U zp&`En7HI#V)4#}@xBMEofnQ6a@>K(abm~`V%~#RAzsZNEe+!i0jgk|1V;Lo#lsE4` zsalp!g_k~?N()X0Cei(;@S)de{wY}^cv_XnqQcV2vMKjzug=aFXvFLVg4}g;Bhke#hhRk^+G7hZGY1!Spl z%R0~X2yXfk4?eV%`g`TgPrT|wO>ofcWxw``Pb9e)`>m#A9)wrPN1C`eO{M|GMgVLO z69e5$O*hP2JkUqH;yijQR`_|?np3}B9qgJejza@pp;2-2TRY=qPy6`MfVb$VU)~%Q zFK*DEaaB~c$p9xg5-;x4{z^MK&%g&Yuh@ zgrH!_tt2R#=rCw3uiTXu54G7E34{Q3=6gXgL;Hd9Ho*0L`4Lddy_p!y#q?t)TDO?; zvcyF2w}-RD&8Q_VTS)KZ)K)O`G#cTiVcBAc_Os-B6$^f-r`WLPjMs_2kMM(nWnutENXX#4>0f6Dy!_UgFu?iH>~?m+B?cJ>bbx zJ2a=Qslud7azvK)L}f{iKxNNUSuQ&MMCIaK(OkoId!D#JgM=Chiw;0VyD}`!*OpZb z-;|53sxpizdV+R_MMVG1Q_-tDSA&<-r5zg5jS(>(z!ufhi_W8deJ*iR%kK>z{cv}aUek^3%$zaUul(k%EBS)(d8bk5M?8UV#8R-sk3iLmE| z3!wroc4zcj2xWj7wmaOismk9mxil0n{T^L6g?z}g6N+gbQ($Q&T?5degk7%U5Zvo9 zt-ca$w8f#g<}vOF+lhTpQ=n2HhN-%7U+ONJv&|9z$Ugw%6pF(?H_8eDhUP;}?wcd> z)kwT-PbsSIiaaXFxf0KnL|g$M|FWx*e{vn6c)KEb2R=$S*?XV-zK7d|HpymqL-^C9 z{zOB(mKKIDIoIK-sRR33#1rv$Ek%7^uF4Z|%kFX4>UK*tg)2vGfWE?j$l9E)p#~Y! zrQKv{6XP+40I6~zO-vjv{AG-<7WOhu3igW<`~`Ged+@^E^Z0)B2HeYT4trT|<2Bz8 zcZI*UUd(hFa%FLhhZj4(!l3diUsBknf7EGML0cS3S#uQABjCp=6?^PmK83e83CDg@_mi-b2k{ zOe)@p_;8#15%L1GD^%(N+?{mVx7;^j?4wV(N~2^V-oiR!|5K&s2Q>YHlTkoVw>`oN1%<=V`0{T*=8F89ZeewI?f}g zbTK8ScTY9^w&SwPyc#+-7fl(mE67M~RntY2;ZCJWIp(r{eco?<9|K_*K;DWaBNd7} z`fX|NMVIY_b0}qt9d$}62M(8YzzsmRjgL1>Ny1pD&<&Sm=cA)3506SI#eMc1FGZD) z>~dSl^20SbSOB*QT8Oow-C(-pK~SLYa+dULg*T4e|wi43KYX zB|NF}g`uC=Oj=`+f_wb~?Xv0eheKIpENm+1%EqF%zGgEmY7FlEKCN#oGW8eUrGt${ zAL)qz#iL{$8Dixr-FC3RIq?*o*A$=agQSq7(&)~nB13$-!W*srtrhevo;#n^ZUsMH z^&4$!Dj30S$ZZe-@|xkDJx3HG6`wsnKSJG_VTTw%H#8Gn#S7(LYfFsv<9%7u31~$# z(aiVSv0Rvc5bpwb)Swjuwxd}aj`(EY1%Kk>Bb3uz3=}Kxl0DT%@SlsUe6ersnL9c(V@;fqEK`-`h$tc8a%g%g3o#PahFhZA52|JO2gcT8y;e;_TZ;N}0O7;=G!lZ%Z7DK3z44n{;w5pJ=YDe> zV`IRo6L2SS3=#p`d_uEUR)h6|I4{GemRHk}mZI#O7iX(p^};=GrteVD{CM-2!e!!ez-{Al%Z|~D1&}=8AHC`m94A|dhCw^wl*I$x!8$fwjdO0HXy!S< zy{5u<>nG=6F?+!OEuX6BnZ>#s0{-Chi>b6wyr@l~rme(Y-@aMU3T=3oQd^65(zB(! zHL^gBXe~Ie;mp>86%ZS7!LxLd&w5o}mqtZx1Rr}YX(L)fK?EaRD$Q*p5}|K-xs8ze zmML!(okQD>G|8v3`MKxQgtp>`*v*GI=Fa?#$~O6f`i38=>aLU=D&CXo@oxB0+BV8d z-cP5B+p>~;aA5p35kV)X&lOEQhrZ>XEsOB;7&ymR>c1IMR#}nodsaTie^24Rm+;@q zp3?Al@!r&?o~m#7(a|D|&HG>T&rmUbPObFeXMg^A@3(w+SO@$(eAJ7dl+T!(ep)vtaq^MIR;j+Tg}N&g;%KM1>(GV+$Vk&Nk{Epo^BBx z0+|cDwshV;O#Sz#X3^pca8UTb1viBLRjD^pL06FgnRxg#Bz)`FRlH1F&k--4F^|t2 zt2K|$9IHEzv54IM8R;73M7GrINnH1ioP+2juB-5%gfoc(#pDD&@Dk6ZoWRfI8*&2Q z*v7#~ast1U(<&$M;peytIf0L%4gZHHPpVS1-vw!{D6Ih7}+{nIM z*y1YsZfmHeR(9zwUSX%WgFOUeEXeS~ql2dc?-{uyzPaHdG6(K$K@+ai0+p{_D7r@- z!4^U_dd~3Wv6R(Q^h1r1a;aojQ_%EXbZ<{lq%XOPKJF+N(Vn6ZN7`^NoGqXZ z{XkEl8+wUkunif|JK@9ieP~}V@wZxlpk6BLE&6K;3v{m8MPnS#DJ!!i-sHxWSrYiO zJnPzaxNTi}Dt*oeqq6aH_^Pak_7R1$ukA-e`-+NaRG2Rs6$SuTM1=+W;aoO?ENGG1 zJE2*=XgW||t#qKWJQJT(7sAvi$vh6xVYM_(A-~K73T#Dl0<95j1cA0U8r-WO)u;oDm02sLb)WrLiq zXb%PRpo>M?S7&;WI~bPyKK4GMR7SjMGp%DPk>!qS5GATr(z8|9;!S7mr9VZg7kRB)NN5CEhU zE-lZX#oI^c@gMN$MRx4VpfUiqY2J>}yw)mi54aIf+T(JOie=Wn0>|R?1APT8*fE+{ z=CHSZK?bwSMZj5nKU^s;$AQ1^Rbsxr?S49P6$B_ClmN$>PL4ib&?{T|1*q>}k){$J zYbrZW>0sF_BuVCc$H;wiPHu<}4Th)#h5N-hz!vpr^^vex3EGVRwQ-UQN_%y;PEd4B z9>*56U{X&XwemvS@WT-Ca#Wux&l9wBZ5-=UwRLed`c&t5!1`2c9emX70|7P5=+F+T z(OI)cv7&VG>`|;JEjyIWethZSfWZB^^h!`Uozm^6x2t)U~?tZHp})ug8@ z4~~FPtbYIiWW+O4qmfcu(_^IEhZl|;kWBMOLYC}Zxn`tj$541~TK?*d=@q*+$7(s$ z=~}^FVqLElm3ZU@?qnO_`!7D?sW{pw7tkS2WI52Asc4j#fU+z6hzYxLq-Yo)jVy=a z^SuUx(#d=@IR}bdJM126cs~u@eN9?r@6lqemw8^!inKZ7MXYugRll)5l{S2N*=1zB zu`g-P=?0>b#jn;4|(2_hG3+$<42-RoQy zW81w9vrvh+M1KnSp{@5M)AkZELVK#Rcp}J9TSFVB!n1evjbboPmx;-qbkr@@;CEmW zGB zqY17Osp3}gAPd;uymV@|REyP*KTFFepNi0g+dvL*&OKHIf0%;5i44z)*V#{|yX1D1S92^GFtSO>v(vRPGtm84(Pn)H63)`QMPE0UEtyHu*2S6-F zl%nE}Dyt^qpw(K5fegMK7BKkZ;k`Jj&VN`sy!E>a3gFA>{kz0D+JHGzakAl${HQ*{ z(Ln>Jih}%C;vKwVM{_n5n zS-Dc6@YBNBoLoBa0Oa=P>4yhI$oJJxd8|F5g`WfFv*1AyAOFsqdD3d><(wO_*jX-r zP^6)F$%82V+};f6NCwhl4@$PY(ckNj*m8{p3~U*u?}vmR!h)S2*%20ec79|jEF{$t z7JMpOZ76_vqP`D_r@{29uL9L>2qs-lWkXj4Xxt3Z1m-{_*#lbt^GcgUw;5G7yX9CfpPT>J|Y*?r}&k;7uMYNVgmfY_)e*fvY6k6!Zrml~Pm-YL;qy;aFi1)rPMB+|JZTOcNBlj-dj#cde+T?<7<#K}|WfxZ0G z7|Rv)nhsbpM%cWIN?sCWH210h|Hf|fioY;+(?0xfj9n$huDSLDy*DpCnciB4P1s(C z2Og)Puj3>0Hg7!@TqUm<$te~dt3 zYu+O1bGHV+&zs8NV)|bN7yAOQ)CL!GFBt7grUkcslQO4uPhdp9HY~rg?0qpx)9-=8 zKQb(ZPJSRRg4ks{H#w-`wktD)734R4X0_;`Z&*b;R*Q7~<5l$YY8aQN(>b4tG3X#R3wA|Gx3dW#HcQHeT=r&t>SnEhE0h3^1bgEKSDD!w#@ep@e6U3-7|j8Zm;$Dw3+WrMg1m-vm4 z)&@}XjiQry?+LH*>v{AJ6Eja{h4WfpZZp4Z2YwGlwJRDE{Ow7Ttz-whu z$wwkw+2M1sf~WG=FR^X+rhZ?+5ui6c`V}NGKp=hvlga$eUN$Af7!a~&Y^IZ6K_=Zx z7jBZ18?G}2I5b3}le>PCV9faXn?03o}lV|Bw&665M4Df&{;HfgVVW}CPlf3@5$ z&K1fe3@jd*#fxs=E*jumvT(ad4k#0^d;}ZsitQrgxf+!>2NFw@WVdc(S!L6c&mK*r zCOd@bd+)2T)fVEuwF5_!U9aR>2L2ee1JiIj(m&(gm%F@HecW5JLp1T+h{{^Y%IKPA zND{KE^$k8s*eM2Kkgwh;E(BX@L)ANBLTcUo@Acy(;IiaiM|a8vSGY@@r_Y;3lXi*T z3B2&yt0fa8YrhE6u=+`6!L}FKycltF${UzEUgT8}3AT^1XFI{Bvkp=W1n3IYtEywm z)7h3cyh`-p1+cUVdcofGX_Z_D3A?e92T=RnHkI73Sv%J#Dk+q74-@J!v1h7*T>pUCmeB^83# zVjsi|q$_-J=adY*I&vRgeSaom?saS4d_GEFLa*$@s~^wiSF83xi8GY6Z^V5*m@=(I ztjJm4V2YPl1D61Qyz!0bp7R?1P{aUV5g_Zygz0?nxyf2Ki!%2^OVEef?iYpPr7!$Z z+w${Y&`tYAU+{vJ`>{E|Bl3XspXzf!42tx&K95oJ9EkG$FQoGnGPdz5_<}m_7dg2z zd6Q)r&(iit*{WNoUQrwXj-%F3uaNdFJ}{m7e=9%m?zi#-TfddNPP^~KNjM|5IVjq& z;&#kIaV1|rIw+cPwwxahiZUFkrp(!yOw$iRH}(}BIwZzSk|0BAU4eSyeH#bkW?j_}!`xGH`P35z!@?*T~1w zX+za}Vra$3$CIh$Q4I4#JCOemJou8Muwx$Go@c&AcOMn4wU_B1Mf0Ekx6795p#jH4qqfcx+=W$TeP<7;LNo%iJy_EkynE1jOcVBrMrnuSLufv@ zj$P3v(&1y!O}|gM)uNtv0A4#1L;YtV%zyGek(G9|_DjEj3m;On5*ptmogUl>-`Q8H zMbNkSTeY{WMkQE7rDO2ky6o(A&vYCL%RK`5QcOB z|AbhBpLg-kgPVDvU*(?=jqr0fekLC0ySnw8JxWNwSiM`Mm?u<^8TJpN6AGVq9PdFT zf}azQi$c%6)w%fj0)ArDw(w;YCH#PXUy9rZiWqzSAaW7g?X_?;ysbEu>C^mZ^_a@) zAE0QC>Xa1FOQ2_${}AZK9Nyl9a(%p!#2(JWvb(3#p`Kk*v6!Y<88vRsjP{aF>#Yoa z@}EGyu#%ktUn-~nA|ArY1pyr4hsUK-%ill|b7|;rP%3{#@BAixKp5_zZlLCSC;WYA z$(~pr4Lu>YYmd`8C&kT-L#|bnPcR|9etJ@@MYWHglA7qqX>4=QELWWmz|=uhKI?oy zvo1}9W%ax6g3i;7H`#T(#Ug)eYN;ECz0;~-TV7QeaT(WW`p0miLe@f{T`X}Mtji2v zo!o<#l(sC9`hOX z^580`SeFW1mL5Q#%&XT9-W#zNfUCFoi~?5~MrG-s@6)JXac^%xDJW9F+2CIV@I;Y8 z{bCIU^B8{UG&e_sQ-*%C*@eJUuR%6C#8E2@p!iDYNi*mTxmGRd;lrdci|meMXpk!VqqZQILi%y(36{i+lUxQswrIL85boF$H6@To^;p zmpnsGNhibLgk3in2790^F^s$XNN%TQB903EMu&J?*9#j<4y`baWI8%LD-s{)XnAp> zc+WHn@piRo^unHXZlZCX)~9kxqEVtj(Hp5)*f|83ri5f84qPiW**IVD?5_s4^CkuL zF)G=}^ZfLs7klRe$wroMX}OEh2I=KwgSCm3A151qbX1v^YNRrTON%t)Zd{h785{B0 zd(w@z`0MR-;{({9$})@;7yg``ZM>Jj->kb>AJAd zjMnEErgoHeN7!Kt-6$_F&w)5b$jhl~u|>V({G zgQ5Em8Qo+bAoeIyX&9D$=%T*rK(V3al2l|L-jsdl;y&tygLl=Bmu6zB&W$dDbz!*( z`bCVPK$6~gf0mYs1hVK(#Au5Tzh41|D{zb6c}9IYr=Ah#?rnVljLyf?l4)=~;|6qR zO+BM0?yicVbrV~q%bxh{RCVlVb5(s=(MK};ta4F(qpv2rfV|bJ3!a8XgYZpAVrP$> zlcBYCAD()FdN#zuEThtfMq@7%_@~&85^n@9ZWCiLb`@^Mj7A2#mA}{sYXeBtjSN0uRa;kq!dn=lX+gdbhwdT^R7<0n4&g71MtDIE z5a-GcUJ2@(I9e@^_AVJ_&@5@^WS=@ zS3{#7UDU)dJRs9ez!zTABQr71+AJH6a}4)%a||qIm*vv2urZK+Z6bU6H6)>BKf#{( z{Pr$1v?({2u4`&!VaIvk=SaG5WI5I8T1|HRrSSTFGHK{%4=vIji=t zJk&}K%luYySeCbv%;6{bwS=E*zW*~VHF~Eo(Or}Bi@MF}g@36#nZK$hJehfIR2t(?v& z8grs$rWa3 z721RbU|2J|7=SXXyzd-iuI9me$U3P#ItCs;Q?U})78wRzQe<4B9|YcP)1QOXYpRjJ zw@0ATf?}fx2*(qOjV5U0++w2(E}L=b(%YJC3nevz!yM&f!wDDX*bfyp5QGX+&yai3 zB3k&&;AF<;c}(6khgy%((pOW1?DPM)x;2hwS@`sz$_e8`!tC#egf&>IusT`Y?oO`k)7$8wxgLG0 zF&(|OD2LwYV+g3Bt!s;3bnSgc-fW7$EBYEYyWV_W6*3&B0VMuLpC;4tQAOi1UDO+5rG6qh0V2+IoG`#6~ z!O9VrV@qexhAWI=o~285^F?ZOr7=d|rB$rxTOR`0qAQJ?ajXwtg)PxefdC&wKR%2! z)oCIo8nYS$8yuO#ns%asNQ)+w`e5TBxw1;VX*BCnmj?+eMNX<(>xgtc7HeTMn{tf7 zg)X6u=gvu^ABPxu`f~4C#CSTKBH6gWP*C+KfPv!if1|nkz(5u6Y zrk<%^vyZS$!nxjkRVIFdEms6MLvzUp;~+G( zgRh44bp`FZ+Gvi87-_TtBRYSiaXn<WN+D~M(OP~wj!JI656A0KMo;;- zpUMXzOzh|=;}S@~I2R1LBaMcPHoW*N0eFkyw8}e28-LT_#^HwVUbtdikakWmvLK4> zrh+lxlDny830l028V578HGpE47@7LdPf_6;-b3{ESYxc#cXs&^fb*qh7SZ3vq3FxB zc$~o+p;yu}^LSm~IuLQHb&yB8G1&#m**l&=vCx%L(#15(f7PfJ*T7kX${I-T3~0YBBh)fkMGgD7_+ zCzYPK)d+(tcxYn))6zV{iUgb-91t+E@~XyWCDXKDdz#dEZApL%ZZrCzypOCmZm&b5@?ixC8GAO2uthWYnw`NS1rwD6GD4p`}u)EU# zSL9_MdWUSpiiQnwQn~{tKs4x1Db~eO;o}3_Qs)~R@!7iKPI+Y9c&Ab9UX=?HDZg_f zj;$BPCo>w~@Pui(rnFco%tSUPAt~(boL^&@**kWS1XKXTp`BD-?ZEI>__JW`SR2jF z4%QZmo74{0rs4}bN)*NurA8+&uYgaEQ>CBLDsZ4gww-@*nP%xrTP+wr&Z=mw40|?p?N()i>?8VQwo(+yT?^;Qy`vkW4dY7_r`EvEYqb#jFYW zn2pzG7`g7#2#KbG4aZaH;0)tpY>dS-ji%y&hO~7?d!0>1%Vt&HHq%Jc>Y=C|)TSKk z>{M-D+uJtAToy|ev*xAI>RCp;Rw(T~W11j|Yy@zyCJl+o-5bHE(*6}=E=V9PFeQ!J zl^a3yqgT1nF#cJ$<00sxf*U=-1lvClr>(UBR4wS0La&w^IYBfRy0CUSP>xlr-PVF~ z+FNe?s-xV(r+>`!!u)71jirsBCl*ujBgS~l&BAUc&!r=e7`w2m3?CSOIpxnbK8LF3 z#B8IX|GCd&%ztWO1QOE11>>PCngjK~vq+M$=RCT9jxm&DkB2{LC(Jh* z#w~L`N-HLgPl?l{7cg>`sL!67ZwyBy@~|h3Zo2mg{*tevphr3+=;aHH7vP(A-9qDK zd@AiJqq7&*R&GgnuF;sLJcWbd^EB@%<2v=801WXxDV2Fo8%ere7Oa>sEe}FQ%NHQb z@2p(#tZ}ohPpN%Z{|KY_tkIChH;-#b$DTFT(SpAllRU4Xy-!o-BBO)8=_|T;krDB( z%nR#?bQtzx+jM$#k&)Z?rO(#Kgn@ox@eeCqSp!!(H~EKi6UD3(uYQi8<(RIB&I$3M zM!J%@AkBu5{QD+r&8wunXr%f!eYGLRT$xAx4sK7ORxcW%A$U*1w^@7n*BbnT!DG)W z+XBsZ&E2Jf?;7 z`8rPvH|FaCE!>34FB(zkGOP_W;8i1%#39hK2XRucXZv5Zr*(=OrvfiM`Kn76E?$r6owyrQn)9HtfeGVQeIgX-LO! zb8IAoe>J7 z=+i<;2q=%lUl{Sai?J}-nvMG*rd5tZb0bM8UXQ-RDMQbE5fSq7p<+et=vUO~t$J@~sV-)iB*a%v$+sg;D@AQtF7KuGeX_eLnr7?Lj{(3Tg zsYq;Y8@vyS)oQe^RsJzKp-co{+j@QB=-V9V7=ByjEW_JQoY6|BdrJAAXF262eeIg>1fnrw$pFLC4WqGc2nJ0X@d!M13AN-#DPO&Al2=K|Rg zIogOI;`CGzu;8U_(t~k!qMmr`8Jqbdd!d{x1UKw_*3%(7EbPIv<0!09NF;*0!!cg9 z-Q@1eLYM-H!@%F52|iCMy?5fu1bXSWzDZPYWrCZ^<{0kQHfylsFA!ywi0;~9N=dLi z+oJ&F`F46QEL1IIQp*{ggW-g5y!Fcyerx&@erTOh07_`cv$5qqG~Yrf~32+CvTh1*@Bs8LQ+n#oMdM)XSNk&?~g#R>{3Wn=oS z6M1IRaRX@{Oo`%XA!7K z27z;iEd%q6DNcWseo$@LU`F~0ke(0yVh@gN_!?07EF?MGKk-i`9sRgk{t|M2Ylx3 zm_R$7m88sMo4LuPRiNo)MZC5xS{89ODDelIYeT#dO2)R~?5^0wcz4Am9WXbz^ok_Z zAzsKszuQrfTSe`t%IFRM&ghPsQ zB8H5C4ks|0kV%DuTc->x2%GkxhvZiS@@4GRY5|98Ef-l(lB8LOk$Wwj=^B@dBHpZs zsVLj5P1z>4+TT+)l02QU*@jimC1r=zrzK@OA{B48btxO@LA=*OK&!LYnl+T|bv8C{ zC?RC>X6p@^_GSxtO3D~OKKirGR{7Qf>=L`2R}D<0*1*)>Ynie!y55QqaNIK5##!}b zm%N~78>g-|J=YmXo;pd-WECM?wP+q!TelflfBy}dY@|lB7ELz# zW15sn;ILYvG?}j&{GZZfW4rs3CL61|{xVG-m>agfo?DkD@%LG1vb2UKo5-&QnBkR_sKupxxDX@i_jM@~~qSjRW=M>mdRxByd z_DqT%X8CllWO?ih1+rW+rh+%l0`=`WyCQIniY1@rXUGHb_WZy5OAGN@X-Gf;Tc4v% z@oJ%Z6>zc)T?D8(95QOj&UVtlP@;LW)ygT#YzPD``6Q%m94l~S!xA zVZG*r(pt9GYvFLFSud=F#&(eh-)`+xSo@H|DmQgjv10l_7Q_d@kE0!LBdcQH2iw=m zh@Mu2ea4SLCzMD2h0(D0I|XcBa*}i_M{N2jd-&xMYf)hm%FAzEtJH{`bg|p z%T*E)QvDYxTML8)aZkT}@i5lzK{;bS@m3u`jT6JlLjd^pJ-ytGgfcQ+-3 zW}$Ct$>oM}>BUN;*)Sg3NRnK1I4y9K!}Xw%iya$I#i07}pMn1b{=?Za>~^$!_?>|N zpwtgDqGVE^a5Db%I$9YVH5OKvVqYQr4SxR5K!Xz;t_T1K~t|wW1Ij%2ZdqP$JF#htUvY@b*98?PSuHe;DV* z8M2!Z82uJLmX=DL|7j!z;;c?lqU=Oh{L_fU#o|*MRFU1NW0hJI z9{@Xw#e#?OF%;WUgEV?!Rs?MT{s|uy^zPvlIbh(6DOms)RZ>+KyAvPkmhDg(jJ8H* zMwfM=?X+Q;0X)tBLNR%ctWN1A&r!W|V$o{xr$5t6N;ggDHCZodqwyko&erEJx+c6W z&QMJ9RAP51lHU%pehgYK$>)olCO8$K*mB#EjF0U0cCef+B+y>gdsfY%Q_k3E=DGA6{R0%*&eZ) ziN*CH%~~}uH3c>Bl7-O(Bn?7m9!j2fjQZ^{7h}NjrRq(KDo;V0W5ao&dLV94Q8*Mz zl?z&KD-n0kFaVL>!LrO_e(es0xC`zO5VBYs4{jylS>2My@^0gv6iJbvk!L8aFSw0A zgk6S39x%E|5$(cowgr96Y3^8JC>z`hG+o@Fxh)^~FU!xTNkv)$lD{MZpCniY>ABpjvkW{&c8dQ`Y%+-=xrr=Gsb(HdE zqlaYIbk#Lobq$I?bPXMaJ`q6;9~(KP{EP8|c{d5i;>yU=F`+bNnMmcnaJ76dR#}bJ z3j0{C7-mKv+wDq>iWcf^XBSEaXO4#!!3+xov-(2`VdPRmEm$A%r5IH({rFH4Z-Yj!)IAbvVbT zzpDX6tU$O?Q4Q-@^GD@uA8Y`u#7e?lTelEa46}rF>a&^yMT@nuu5Lk9ZoN|uCnk=V zM7j09D~J9`QCa7qN97y%C1xGEY{7hfOjVx5fIjSBexWbqXNonfW@F{Xgg{iT z?sTjsFtA2=W&>vgySu$=?N@9scK~c!U&PSKwx9s%2>UZ0Ga4+* zUrF@H3OI8J`uhqa4{YD~z3_uz3nl!3aYx$e$Oy|I(II?22?Pk<4!aEBF+&juT!xf- zjEgXTU}z0_4znVx(U1(y#_2?p6742M(p5`PUZ;kmVvR9Ly6cSp#XwR^hcp<0o+W{K zj4Om+u{B~S3sI0#`N9g2^p=_q!A{zPoK^d!nk)<@b{MaDz-xUOL+`$Cq&DJ88Q~gp zi%Q2xK~b?8`7Xwh>x)p~`ghVUmp$#L`rSkI8*C^PhSm@_VdKRfQTurHmHI5!8~(5J zXPqDhXgJhNhk4caqQaI9(z`;$GQ&DcS}CYWcEFMCHrcBUjN5H~0hD+IIAB;ITcp%t zMVQ)HdiO&k>q3ZXY%J!H0WpPmT=+PFb&g-yj%zJUbP-MHhbd4LuHq$d7Cs5Q7=%kS zC<``{Z8@WJU;nOiUq6Xd5;zh5SHj#D^`_#>TkL+A&WQXKz8r_hj9P4YYqSo?V+m5( zjb0`HjxS?OYgwANIb&*@vbNQ(#ZfxM@&Y~6)*Q96)-|m`6YX})u9!glnU3l7=6j(Y z57el~+l;|#!^1NS&HT$j>_RozX=Wm7IWJ zA61esuO%byQccmN8QCq3n_euU2i#bzyXbU-r-P+|GmZ4P^ZO}86!jlY;ojd(;abMY*{L@9g;^>aemP5gPdo_n)PpxsuK>c=J}9aTb+51+Orat*CN%! z&OEa@%Pp-V(Rn@`o#(pabv9BxQfr=%L?`7B=GlqEcV_TtwD5mTsz2-xSylVNIDWWWc9%hwP!Nb-ba4C!RcD6qSzm6m-=&xT|KWJ`^Se; z<*D4UIsdmPHoCd~q?%QGx_>%jx}D9{4j5#LwKvzF|C`h8#2TvUcESz+!gM>Kh;mrm z76zzhx_^yMcir(i8^!)sYq}li2uwGmLY`!16F3X;QP0MafY@g)3F9v%Z$?)JOaQGR zOhR^Sh6Mttugw?;;rKH@DoUQT2Rmf1fs@fXK=V@Ka6>q;C9J64IOK((Ak`4I8N`Hj z7-BJOAgmcT&sY};QtC=q-fj@P@HdNHxb#8-rl?0z7x)D7%`>DfuOoGxQf&>?lDbZ* zg>k+kbvYK})2b*h46l;9PS;)-j!m7n8!2_cosdcbsmaRQFE;b)B$~NJi@m~GXk~V| z7nT`ht}^z~k%E16!$ztvN9OV_uf@oxs28E+#_YvHFK%zvQ>eV^*{PqOILS`6%h#xP*j7eM=l?xeI*p5!hEi);$fiY$M@?jP z+{^B^Ylb=eX6x=~Vdg4WE8GYy4PJWCWGN#V)-9GGL~2NpHAb>~P)`cpfX*L#ZjF`f z9v+&Mt9((zSnFDbv6_{8Z%qg9t!aeaiqtS3}pjZL>7OJjm_B)eagP{y(Q>z1(j?E|VvI_pFqK#3qPAt)r&xH(GDip0)gExCsx z+xk!usxLHzw+kQ9OIR<-`OBaPthLM@bXw19#s}@s2XMfk2ZuDt&x;L3x;wTuwxJYvWKC*b2@E&T zJKNoVNH!4>1Kh-iYBkYzC#5gP)l2IR<#2*>tWO9vVaNIe3%G4DARMTTO#BtoSxbdJ z#TW~HBr9B4H=HOHR2UfPsa~TS#xaPG(uqnp3`r{ni|r3}!*J%ukPWc;Z9{F{ zuo=}2`$OiLx?z)5DUCva2F!{yQu8Er!wbreyQ$*Yf!&sHDHB@fOZjh--Avf&iRT`=n~MvBAWeA41?m zR)ig+979gL$L(i2Wy27%GTsz+##zD|ltPkb#zpo(v*QEPs6(guRGs|upVF!9k)%^L zJ3;R(m`=00sozmb#kz`GaKN}E=acP`lxoNQsRf{*6~I7xTaQ&#zup|d-%Yj`B!H2# zJ4&*oI8a{=#o;DXob5{CP@F^BJSX-z>vEhyHY&u%)eZ4Xq55bx@Hj(mq;vuYROa`K@v7AW?m4`Vj=QL3qrz$kO6T6Ymw)oF>Cg-BJ5a( zxxi0QKEA_D8%A|}hN_NqPfY?VN2HULJto58PVu3}UFrIQ%hE55v!1ZmC)#I+Nj+iD zl8;qvb>pNY_hCJ&8pFBrU2~i@SEC=+8_mr)Yo5GiujqL+?1w=qrCun|HBRSRC+3Tz z7Bs9e8NA>H#c52rr%t=ZU;(;rh_FkG`aB3_zG|f*m(hH?fijTG5wl?zRcR-sg#=>J zSZPOyjdzVHR;_)qcGI4;>+o_XqrSnap&$_sP7@&+oCbpDh6>eCCVwr(?tg`<@x*D> zt_lPx-gGp%RB#8lF)&D|O*Ga*nQ?GM;41>vV3(0D31c|MB?dFat11FxBp`qt4$tvp zyg&Ox(l3PT9EZq3{U%g{b*P78#)cj7V1XJQR>a4I;$2SE)dEdsdB{T*_>3Jffze!8 zdn6WWv=O(C|KWEn!Yv|jkSUhMF0Sg@IqaIf*KJJO$e z;Z=bJs&m6j;8X#?Rmf#JT$jRr=1R<^qaAokbs$F0?^9aE@Yh>t$>2@0LT`xuiYTyl zYfcb-3%gwqyC96f)d{#FFgeqdSBIv-Q_9s1#?z1s1j3(*_<{Rsk0$S7{NT(t*};To z0PBSfv1|>3UCS@UG@G=M(uv)q0$R4XkyOUi;jr z*F0+?Z-Q!FKCSwm1y1y|y(;bG3>Z_y9cpv#pE-j1y*4bK7R+yyNV_J<=*{A{IeIhD z_UlkZL3IPopOeu}zYH0rAW&X~OD1Pi^n|k8=_7H;qTOE@eOlsIqjvhEh=vX2w?iZ+ zu8rFvk`vb^?eqm&J%2qvM#OqXV}@zb(0k+F*QU`=&AiiancUnP*4B~rswY_-j}&hxa!Ssto}#HG-LQSlx+{mRL>1T{EV*XFcTI^AVR zkoIgddLtD@;dY}ye^;ZO^Rz+w+Qdf^54R`tAN9qY9mf5DZg^ma(KK$~qL8(7UaENq zy|=^2^3LK9Aj{0)4nfAl_-TjHP(P7Fc{_p1Hh`|%30Q$OGOF zR$?U54r7#-;+q_xW8$o^R<602|R(o|(6hw8LNu5lPh?7qkk_uFSQk5eI7*aQK>`(3)vg)mV?~b{m;$2$O&WC4zZBKeajrZb8v>3m%m(1i|qPO_EHB zGk;DY_Z}m7*5NGJV>H1?+Hpp;z**|FUXG-ThrfJ}k?gq|l?N$tajZ;(>x^Hlp`v@d zmNSmpUL!Bw9!I>AMhhFnr%=&e;I43fT%^iu8JC=_LS2v-^!|{Q04D*rl|jQN$01Mm zUL(zOJO0j;1!>n_Bi6TeUNUE8p`&|^=1AFQ2bi3#;b#oH&hw37XH>cI!R&OGZr(x* z_ZgY)NtwuLQ!spU9_`p?_|+hXkao_WinM6J6zM_BZ|;D^wBHylyt5MAv85XFTdhH+ z7|j(=uY6;yivJSEYRCXM6vxxB1Bm{AY(G$Odeh7MjkfW#5}ep)zk299ARlHQFggMl zbkG3_Gcof3fK9%prRuNm4ge8u0QtW)>YZ)+<}U086o;$6HIe{rz2fB=$${TbTdUdx z;N;xmRK}VU@(D3RQwfSeLk>w4BM&d6r&gyIE^W2fs7?0KB)O4sEC?Y#yeR*+C7Ico5J9lc?E2qgf8v zhvp#5%T~+nSAGuMWYR&SleUnS9E9ApkT&9?FZ5F3ma;UzZppQ2;_nr$js~e&qNh=1 zze4~8`8QBGev1Nf>;TQx0CF6pYgSCjr-A{^LbTzMkdG=xC1zpft7fL2t8Js&+v_3D-h8MvlRDG*2 zWzKOx&JClIQ7LJ0F0e3cw*a#WcN;Cita=^?deCkvJ8rbnkJO`O$H79k(l^JAJvwrB zE#2J8$=QWH1{@T~TyoptpLFU6fEP@4(Uj^TDKzCrV597zML!zn;9kYjw%OR+PX1`z zu1&4H?I!?P;OhFtKsE+E)jAhwDV1fv;!oT@@S8D-uR~56lQl+wvEKI9_e-RfemHb! zRMlrh?q%@n#J7i|)-_4ob*_;5}rI*Ybf%bth90{-|gj!R{=ws=$P&3Ejw$M!nIer07 zHXOrF#^bHBnyOTFIHni7C*2RItI6tWo7MS~{4cbQGJ8!5+a-VMAVllmS1K80HRYid$O2x_^Ec%*fZ zbj91vQ8zrIfk5t&mm57MAVq0SujA-ylea>g9sPKo1<}gBHoI=-Cs%=A)DT4h4H*Zcb zKZZ0_6fmdb@=3t#2GPkB<~cxE>Lbh%NbXR%)HH!sJ5GTshlaGcmW=l<_R&R2<~r>` z%1AcX=k|6G?i_qU09-i33n8cK!!ZDjNj1}`AjM3^;8w@COQS1O%mw(pa9KZ2xaX-= z>d^AoIO-KN8DJ^g=C@d zaLA^!;u9(h)6M%hdt)N47~xB)+>l{D%6|scpSNe>PxQ{rF<<7}zywAq`Xbk45Tn98 znFTP97FNY4)2PLI*LV*i{IUM9x*(va$6@t&zj_>rJ}wN&x9h3L!$W3QRQYoEU(z!G zaOni7)yUPbL(Hf3Uun$}JeG=3)6Jh;WQI-PpjIM~s;Q>$`Hluh%#~W7%1Ax4H8)tN z6<1!LOk?ZIVY<1#c{@H5o{^nQo(Ay#_5kO-{2CE*oC&K`f@W~ZakPmF= z=?Ok>d?dz#kY3WlEYaW7C~?8P>*hIzqcn1GIftS2O9lkq#2ZU+jbA=1w1M zc3!&=GLuYA*b%@gWT(-&({0R7UezfoYHLPP-=^R9XBlyS0BqdN^!wnw4sF0Tn%~y6 zus($%k2;;&F`=Q?*)H8k*t7IB5}Tr92_#Ay@(kHod;VhYR3;yL!?fWOYWI#3dzf;D zn)IkOL*LN#JE;NGFQ_FE&jE+B*YphuGI{+V2Kl z#?)g~Aybr=s6q2!$JWyuzYaDix2cQhGGvZy0WzVp7I;T_FN_e&Z$VO7~4q@d^|cM~^qURLD|3&u%3p37SEB~9vN zzRm?hs-V>we5wx(?~F};*;h2Vv-uuBt*4$2=wjw!Q*vANsc=YKay(oM+CYEkvL4$+ zk9ILvYcJ8zbFjm5kw)@M$tWU&x1jA{-J#2xwwYF)W4?}}x1VdCBa1dsjY8@uE^uHo zZ9P{OC@(VG$^y;h=V(Wf8K-afn!YVES97acs#dKoHk-?01*#alk0e8O20|JOK)_t&SGlhB$A%t)F;bcpGeOaxJR z)-v+Y-+P!@6zXc45W5SzO2Ov;Q5ItNW^On1#$k!IdvkD(-5c-_^kz=?|0kJ;Gbv+w zn2m!cA92Caq7wpYyjEPNm}Fdjc!XZ)VK!sNoV#a=<$*B3kKj4DHF05hgVqK|Z z?Lg+oU2wn}UICRI_Mbn4iu72DYuFsn2IHvBW@t*Jz2tzWF9bWc=c4E$Ghb3i77c&J zg*@mNnHl2yH(W@w)DE4}t=(_Xa~GLyv9`8dB&Q=M+KWWMx2cp0IG)8=sz$H16Depa zwA`r(mpUaWYa>4&;gf_#AlZo&k!{byB5P4zxelS$>XA z4>Xf?@Y9rwCA(aGvCU7_c1Hoaw%6)S$>)MrdxZGuK%!cOS)~adAar(Ef`^@ z(Eh>Z+xY#=5c32s3x}E)XrEPnGt?~8oYHfKn^!}H`|EHVRqU5WjKI-E{wDW!sF-Nu z$fhZCBEBpdbG7+Cu$VU*aj8^L@06D=90|E|dmK$!*g8n#>iM#1*GPQvVM@Fkkfh-0 zcd%NZ<+WyZy3z$4gX-B<3mj5ENo(NiNv~XMdiAn&D$%>7(CTZ=Vt@w6k1{(U0aLe8 zW+Tk_l-b{8(7mH@Oxj3KjxvklPacZ39$%?jt+6;lMebCN`!fg7ib-3MFCEWXTWcPH zNe3s#V-0=(i?#27kD}_@XJ%Wnn=)mSO+v~hgqDO7K$?^c3aCgRAfPBE6e&uH2r399 zNSBfbA){6j-DtzNnzIfC5TO00EVf03r&)|G9T&HweD3@Av(`A3w5pW^SK5 z=bn4Yb6D)*%%NC?y{KR)UNwSCr=PC{K~M59>7rnw=;2aVpp#Q+q&1r64VSET9i5!Z z6L4flC_@45McFIDjik53rzr+%jza2ByT_2UI$4 zs6BwHwUbgtLx8~!=oS_nU8T;`5esTtR*)2`u^zs@?Kr0HGo z1zgvG)xlof6L8({-hk^dG&Mu&25j;p8CZthD7fSaob?ZO;$h2Ws`m!kpSyFLV;PunrlBw;gc9|I9hXKL^=KS|1zIxVQP zzmCMk4xklldxn{Su$-pqg-snGsam9-$u& z*ji5=C$$g!OYn8dABQ>UPo?8P)_PIpI4L~huSor9ki!r`?HtX*st=->uSgZpgQUOx z$kSH%sI~)eaFIR1MVDWd{>1c@{8{eI9WU)Q9k_Ln4vd!)#l0bvR-7Kj0!b7Mj|#Cp z38RUf`onm;A(Rj$)Hs2Q5_q6%X>N*4F}FH8gl}l=1bm2qIUZ{Yp~*uZkr8=i61y+F z&hM9B4+ya(q0UWuo#E8$bx^&|w0wIvStdiM z%wA{KBV$$i;Nw|gI7zCHEew#l!tPLnf#}wV0xpCE(t=6SC%!OZeq4~3Q2_ISe-oOX z3GB3e{#;;(nDjO2lIbxUB8T0cEJZ?Dfe^D)vUJYuC(=vFKs)e*X}tfbv_6 zanT|?5!VQGH>7zq9+md5$sVPLcdU>6=@HH2m|o~c%-@BHw==bbHdJsE!o-JQfD#Rf z5MCkoWvD0|i2Z)b^4PmHVv5uipGw+gIgIvQ3$b}lOp$^Fp_nedAvMK!sl5TsSZhc7 zSbA=%+J1gSQLV&aF+u#L|Zq_28|vTq`f_tBj-efJIU>6 zZ$?eo>1V^KjiY@XUI}8`dMnXp|AHug(_r;8!b?YVI6> zsyA}cA0<|I7?3h`F_rcuVro>1+J!ZGWXY^qQcUgKKM}jiyHIsa62_yGG)4rzJOEWZ z#uGZ9j|Y+HJ5v82hAEzhXG=p6*^1tsgA*O({im8m0b#%3Y==;aZdS`5(nHM}5=wXO zK5Fyqo+~vGK}7G5SpOqfiT(e>i1l=Ia%v&1e@j~S_Z5D2?0;CHr{^N+Ev7&IDOY*{ zJTNT4=u)nPb#~t2pw|ie{d7WfGZqTyE0TH%q9bw;DCIoilmPx~zKBN3? z3A??=qUlNu7F43aJ5r5Sz6my{ED((ND`68{4c=9~&?qPb)1Ser#G%_IaLo=P0~TI# z)b?z6N1DuIbL2^3ti{xP>`H9D3qVbSScN1L3%4y#Yy4^QX{;L zw08eOB#2AdGCgkzs7+fwka~)@k5bMdITFy{s2uElG0+g|`zf9y@oTwO}Vx9v}1NFBpz^e`ci3f4-!#Ea{x;1xN}dJ*xppdsXRtqt&hp6Rp;K-fC`T zb{x3}b@Zdb%eTlhxkU1d;7`)L>!Ygpu8mYsBE?&G>HRI03*$(-ljQvRLPun2xX%^L{2s_adD#8h!7)oQ(| z54dtsVghJUKYz>=zm?`ysaKUd%ge=E&+0|`{|f@!Yqa(*n&P+8ynIMik*!8kckZI8 zt$MkF=Q}1qWjw-;rueNi&A@D|DtEwmDIBm-JHQJr%IT6I9H1gf42$4*(zGc3d#fsU zT%VQz&W~uv^@-`~z$!RJ?k}XU2!1O~bKhUE!g!CPzrY#3LN9lDJqCDzb}UAN{8pM5 zN3W{Eg+@m?M4q-#A7S4BG+0Ra8_*!Xm8Kb(byWpd88cI{0Vji1yj-jaqO>Bv05`ce z;_Pw;2 zQy30vt9iVGQEB}k=B+A+(J*ieK z;(2i*;5bl%_R}X+wn+*TfBc00*o0%{EGli-F(fa4e0^947rxdZoPrYiv2$DAXPkRV zOMpUb?`P7(xaGfDsugl8AUd+F!Er3x6q@TakiO7*_*k3uwpYWn>o0B2)VaN zNg!eVl%3o$lm>5+YJdu7bg3Ik?r$O*c=m0PvIQ*gg6zgB71y0_rg7U)6-eJU>0<~# zMsCM;0{z-{PQ8n^OW%oD4V-Wp>wpukLY;8g^u>`z+O0=b(9$YeWl%XztLE#p%Aj$U z`&X$!;|yA55VxrrYAZ%=eoIV-Et%^Q61ay3?W=q5uKz(gTn!RGUytkPvSL^M%n{hUc&YOfiehNfKH%v z%Ek%QVVyu3gzW(WeYVxv18P*5xOcBe7#j*VjjN^_}n zmlS5@57X$%E~z>gP?Oe_V#~{&BrQp_Q@!1iV{#!%vrq?u_BKzYAT^VxS|N3vliTJ< zRS|ccq%-2KlXOPhb&}4AyH3&>ao0&YBknp$XT)76>5RDRB;8pLNu8!M>aNptM%{Iq z&ZzrwPUm3(j9rBh_s2c;zLw&JfYewh0QGfcp~Ah1u`sY0O(eZ6;}-R3v`w zM_RcRF^cv{;SlzfzL4Z1+kPosG(m*9=&XwZPsiA3=62l|4oD&5oV~R7L%(L8k^|DiCeU@Q^$}QbML5*j7!dSk(L?p6AyH4;B?Fq$;>7q9BmX9vXd!4BxNA0)SBAey(5(Bd+; zm8|sas^`)-c$+uwkv9Lk7%c+UI}P6%g4n&sq(I?3J$p<_w2VPne=2GosM7LdTrw7X zTw+019h8-Pr5Q~e-IHm_v&W+HwnC0AeLj$yoswd$JGa34cq;Wp+VVy|a!}=oZiq>LVDk|?!oLmW z|8B9-f!Wt;kaSj>Bc2JOoTaHMJH@5XYKzlaUUG;aFmoAL+I6IMKT3li%)?}4D)kSv zq|jvhq-Vu7CQ9FK?dUmuPMXhpRK7dBx@YbMX&viQrK-4S^`8L_>i09gW*q6&<|8O2 zQFKt>=WE%?`ioTJlQZ$4CopP?Vsa+-K?dlSVa$pg3!;BH z>a*bVmygx2j}T2+?R!?mrO&+tG20qya0xupXzFrFVj`u&(=Y-bN68g|Rk9>6q)iHZ z3%s(V11vj?dd^sxEJ?Tw&TTA>I#K@(%Ip&v=J8y{sUFWyU4iH|mHJjl{Xukum#o}U zt0SdUFA1W$mC{Dv==`}9?P8@A>mJ~xXgJG0sk+QByDt&!ba#`1~@LMJ-!i_i+bMOJ>)Gbxv z6UD>aFwZH-w^%_0=VJvMT=N#R@PgFunq+fT71L>nQH&;D<1@VaniMmjDvvJ9s;b&x z289T>ADn*J&Sy6yN^tgo8?h0G#Wxv(&wsaSS{%L?)A_m-QY9HRc1zT#3q%~Sd7X5f zy)4g?>o9L(GL=f1N0znFUbQTU+TM^{0W9X}G(T<8?~tlfN^e^@O}HUNiYv_2@OPLT zt+@d*@&yTxmsN*-jV^kp^ew*|F-L#DA(e;+w$SJcA>nxWkSTVkoBdHu=7_;8L)lI% zX?wQ75^>cJ@yrq7DAL@A1xI{}ofZ;r)mdQ5xRHv9M_eZepl-<1YfV`{-5sJ{+CfSJ|_D|pM zqKzhb3R-GmHu41P5lf#gkE~C5X89@Bj6|^kh(&6*0B*4xIw@1BHXEv1i(EhG#x?{a z7PZx@qF|oagN9k;M9Y=~BEsG-v7pnvklhKH*GpV$QL=4!h{+G)q>C0g$uj#_h&(CE zDp$826p_yb(ezL?67RYE8=z77915(uE(99@jP;*x;_~OlHnJhWz(lrI%JdUU;~SyjA9H!_LFPkDq6pK z(oY@%g0$IB?u;Klf0>v-3Py@i2H-sBB3G7=%s)cTxEMlmPl33U(~Bi~u>&e?NRZe*44>$CUR1Fj;JF zMasS!9^5BKJJW8tw00MUKCo}m=XoM>&y%b_g!?^DbaExY^Q8V0 z87}Z5pwpGI*eFuWEafsYX!;7?ZF^O z|E_%|MZlKhHMi$&CEFgV=dX*w5z>IR1!4YPp`$@^47P=vL2{;PJfd_SNHz=AsX?s) z7Frf8$3qrY94yzekN1kuf~jCldN_L)>2qCKLiHti4kotEFSkSKIkz16ALlSpw?PKW z3|nenbRR}lA@2RViL9=V!|TH1)dw=pN}-hPjdacmQ>l7m@fcHy3@WAh4==Z*RDKYb;+s_d82Su=vW7yyq@KkzRL6~BVEd@)(vaG>Mc4}!07>A4@! z%-P3wJ4miUFQ{@G@$3gM5|*EF=z&-m@4bS8o$^!oRt7ocSm9Ti?v&G^KDpqOI|xP8 zAVi+PR4gVfmeD_FUFNeY0mqLy4syaKBF;?R9^~_Ya#roGgPiE z9$&?p9SCQcf>7SrjZofLn2R?y-i5|~r4pAs0nQ4o!{nM#57w=ROwj9|9EQ4=()(ek zJAW1J50i(Z?v~*)lORnGmt(EJn$YL^oUB5=6fO_N`fWfbBIN4SAwsSz+@R4BC^Vjq zMaW#MWYQW@$+_DqwXBYgo~Gs1|F#!8V!hsrvg+u?GO|U=4Y9nNN6LxjyHQ#*%6Pho zO5-DC7LM7ZHK*fY5B&q(IEBoh8wQZK&rRmPSngi1ZnoT8QeoX&PVS<^Nyo#6R?AB| zvZFvc&U_f7)#IzT73DmF5ZHU8IO#YS#Yu+&P5tk>@NY?n4pPlX$HZv4x`nOFVk-D> zlGASBO=B(6mT0*VX6kaZT+gy%y%}b&?iiWHaegF5uIK;Tr?_JUz%v!>u!YdP7}+0> z7PCi1`lGMlE$xg9vFqr*%#V#O;jx1a@DQ?0)OP2Uo^Akv>BDZ>pU?i+RMNI1RzUkZ z|C#JiKH!Su254SU9j6a7w~FfQr5r_c(#TlZ z-)}!C`96Sp)8tsJq6t(KD>q=O;8@w|a}ng5#=o0+yMb`arvAw|ITBQR7=D<`+98^& ziZQYQ`^wfVJfuw8x0G>vXee{AERB;-BD8E_4LR0y!Wu!@$9@gP83a50SDuO*axOdW zNEZU5=$9@LTd99787>f1bSo{)-(bvPLJ#92DAuSl*nhI8Z*93kgd0?s1bHof?j&F@ zPNkeip%ZXaUY;m#g+GN5;$m(USxrLOG5SD=i@8+PJ>8EocVUwqmn@&Nd{AkUW>b12Km=Z27c0#cC?hW{l-_BC^|XeH z8_7?KJB3`&;83bK{D+z9G{(%pV%*WoNzXKv9oEc?0jv;sUYMV;8%8aaG0k1{eq%XN zShFbWno2)5mRle~bW9VuBg*d?+$qctcEoy%$;IbGo#JF|=}nww*!iOx;B6zcYd7J3 zDLbPNtcZtyG44BJZJaE7SwA2Kq3^NBnuUbG3Q~_l=&dwXL{Q$+?r*8&en@VGmPgh9 zBb1~O{;jF-A$hN?ETDA2-jp3FOW7a>mRVl%lh9yPoqu}A-3N6pISU@iDja|U%?h7WyJ3pv<@ z2+dfaETD8XZSnU9_-e1_I7;$ub2JrZ$N^M5Dxwa#TY@1uNhvMmXDmPcAxR5qIlEIp z!r~`XivC`)(vg;O1dHmNlks^Nm~`glp8qCuY=NzeR78;vV}+ccwhzlk5X?HGuy+_W zXeCFm5YgDv80-)F!4xvpv^j5i`nHm53gQ*`mHg7eNlRMGGD1&(+*)p9LX>KJ=o#Ut zbUpdCksoG3wcEFm8=4W6+C*J!H6sEo#woNKtP%H8ejAww&IWXdKF-Vq^nDxoX?STg zYAe?YE5RAT6rdx>U@z5AqSd4|G`g+q#`c!e7KHi)eb^R6bUht!E4R1q72q(2qeq({ z>{}`KjRH25Y!ufQ(6AJE9G<6XDe^S6tQ3KAIn0s>*LUfJ+p&u>#wE6+vTG(YmA&|o zt%g>uBg(OG%pEh3U?G@!f(1q9iL;;3Tn%qgcVhIM)8t)(xYbRiwjaZ2*CTQvzHD#0 zt96|u+9q2l?Te1pN$Q3W6!!LVfAMxVda=D68GQR-wL22N9kD%3rph)DwUcAA<>m8QH?O4BGcqB-I5}W(r=u1+I2C% zQ-hj~6_RvcB3;jhZ`IDe)o6dic^cY{HK-uo(772=XbodHydINR(E#MOR@*YDY1*+;3F-)|=vclBoMqgO^H0eTFBI$Xvb+ z=V_i_U$Do2KS(>e$>GtgG7es2RH3^R@z)272+Dq|aRf=-fEUT;j`LPW)79yUa?hA`31;*3%+h3 zs8rEI28*xi;Kf%wOXE_t2 z{plA@yPuT@fRm}`bh+q}=O8WM>`WqA`^deKPVXawr^#D8mvNw5`)~mTIGbcoNME_d z1MJQ9zi>9ABf^5{T)KP|q%-TO6=9wu1LS9z9aHik`4lTF50TqiKk^r?lTB25BegoE zbX23rK42~M5<}%>oY{rZxqFyOcZbTV?~HvvLPp(TShxcyYbo$s9)tt94-doZusV<` z{f4>BJkkUQbhvDG`33V25AV+l=ulaINeBfGm+iJsGh;OuI12Z0nMtUVox?)t)ZxAU zkj_D{tSNZZ@TFlcnme4IJ+zka*xfu_cG&Wd#%dy-7PcG^N@YLQGSj)?vXh^}{VBQS zFf~|rwKi)rK8$8jZYb^rer~}^WX54W8S8yuADo{s`$QgmAeRmftw)6~;LT$>Rm^q8 zfI)sGLNkIb`z-zVrv?4hSi16poCFnXVcw7kgM02mfrHm7wB$uO2+Jq-;Du-!y{Dg? zccp8bV55^S%41w7;jvXmj1PngOe;SX%@_OsXsWz9tkG;nliw45S})uMakm@{c)Dh+r^F2G3-^4$a`y|z*CYhixW zdW`I+tUqYct_a$qf(X`7tO&(i!`H&1#c$uESH__0=YcKcEQ?kR$5Sw}R_&{;fOACa z$(@3^MdsBp@(qlEZ7Z(av6ur^X_=sH{XCeNNOoto6UBds4N{~{Ki*X>gZ&vS+Rj#QM|(phpBPp*9plG|AeBT(5XmfSFv)hmrha_J>@S7XV_uUIlR)r5NW z8s0Z2S!VF${O)R!W!b-2hGLf7{c|{yl`MH@E32&klz=2l8Na)Df*fUEiIIY1a7rb# zV}hI_bk2R9{Ur@Qpsrz*J~g1JE);enNDBQ+zaK%j-#0g{Xpwe}Jor`c))N zVprSst0>yRuI}nr(YdQ|kur%Fiy>{5`60^GuiTWyu8Q@mSSrC)?qr@Zj)V{KC`G@j zK^nWt)UVOdJt!mv3dFz5|;?#(yl_4rAdgOlzW&&)Ys zU2%D9uG}D^tQZ=MYLN12)nYARF`;bB7hv#TR_u9no_t<_FF;Z@w(8#n>X9wi6V}li z*&vl!RG5v^^K#G6+46o7F7BHbK=Sq`on0W;fmcxALb<8!?s;IVO6By#LL53z(i+Fe zh`jl;VDt@JymoN+UMMq_^~VcA<8sKcNRAW_n<(>8<0u=%6kukrQcl3g77jlh2m?1d zQ_dnB080TBA%!~w;XkfpCEy`cDng|Xank) zlNv`AM--USeGnQ%ALYvV*pDkmsxB(CkF`*XX9Fc_HZrgt-iLh90V}uD)mu9=k&QyLfie6kT`&oJ6G#bAe+ia??nw~rgy4BTk zMGz|l)D@;9wn6Cd@ft9ysT96eZV#K+erx43;vEw`x(;7QXPUGQniRMRtiuZ%MifEDn<;V!mFWXI=Mmqmmt!Ljo|tEQt3vy zsbL%NC^lsVmE-it@$LcM^PA5w#%kCGuxzjmcy32b7>)LTEgMMgO1QW%Rap9Y*tiyY zp5X)z3V4Z;HOKi$h!y6C}ypgYBGf^hrIH{4nre+YH$vv!sG;;yieCT)^C!%v6d z`S9CkHbKeTnL<93>n4ozPPMN?qEA0x)iusB<~&j8rv2d^EHw8sSwaQNKVxdLyyQ7G zaJty@nH&JYR?*DrPP+6NG_njp2p~3@*PImHe6LJ#n;~E8LZdg!EwJxNR662Rh>DO{ zjA_BJIPf1rG##dIH_Htomx^BXmvKn7X7B4?ngoGmg#HE~kx{`gSpKRZ0o zb9sxrooyj&w#!BA+@RTAOkB&)z!2Bs>#9Gj5mMFZ`geCDtmw?zX-8$f6yG8~4Q*X44;E-Uae?kRo== zi{a+_>27RC2PyMwc{9G1oMJ~5kU zYx$@_CwgxiscJ81B8yF2_BBBa?38&Q(Hr#1BCP^+A$&y|g@A$O)+u3=18RnOjYJc7N0SY z)o1lm$g)G9Uut4{=kkWuFqk8Z^&}qv9l(7-NYL=Z+!v|q=`*l=T=7UWZpe@Ja~e)M z%o#^_z#%x`bfgy#%31$?$=IbcyL;qsroWtu0K5^yZG0me94s@+jONctjo#C&iOTKybdKJ4Zl{L4cWqSLdVh)E0&7 z9vYrpjRBeZjnnQTScGw-oirWy?!6HYb@eKZ6zRYYXNB;~rrqL(mnnBrb`XSJww(=|8^Y`78a$?HfIoRaAPJ4zAmeX+B zW1I+<8GNvUyp{#inP;mrg$`vj(jJ_({HDtVm(R&&Op6; zhCV!lnY&_P=p=0BF4M&`nBOz>)LHp8;VasA7P5e^=-gSksdwfY|M>qka}_`Sb>{pZ zm^uHyn>l}D<~p5|L#wIV89ib&3Z~~=IBFQ3Geaw8bj~cTbQc>40DoGe3LACfsIz5(so2$^$8jIix5bdcblGmfWyh3lrdNH2RUh?aJzZ=*lYAl{tD>*892w{|^3c4c`tn6ZGmg z=K(ETH^I;Awe~=7HW{xPzub;){ohQ@;(zGRLe`&6XZY0Q`}zaV7~UVlCx*Y78T!;1 z{xA=8<~E-imxy29nf$-$%+!DAOeX8h+0(o;b9|lACF}8C$2`99=Zd|rpf@Xx zslhMr&78mKO~uy#{25-{ir!@Fy}60BzG!vjK)lzRl26TieQFFpqX#+z=PqvVh+p2B zn_C}T!pHxiGe=oxwwCj$IqU1pS;P3!@U`Jn1790X6ZpL}D!p4*#d_r(_;v%8Ov5Mi zH|_8GhxT`}_Aiw2_7C{lhZe5rV%?e+II@BL;msd2-i+ZR^uT0XF#3Yu(%FCCm-YY9 zmqON;g?eAM`uYN2Aiib|FChM64(Kn&@B(_EFU3Y*@XKG!*1wsU{D0`o+pIIir})II z@^uCdO}sO@E0a!J4(pvUe3>5T%xa@E_~o5h^*5cF^ADYw$vSiKB=5{ZUuW`-ui0=n zV>3hb!V<&1?q&~kCENIV@XNch@ULBI?5{i}-rVw^zn<&NT6nSEl}uk(GL3op-&qUG zO2U1M*VD+M#0inteFu6Sg%u(N9j4p@@zCf1WwUUd5(5CGgt z&!d7F`%L{Kf&4ImvLicI*;>GeMqxK&CC)R;1DaLw%vBB87|)!us4-Wm4rs>M<(#OF z%%mdi@meFPYmrSMDK#v}^SrFoF&q}^d$uV`W5!6sVW9)ge_l5Q8+E-C5KdoobMy(Q zaw6Zkn(B9VBm>N+e~5Aj2c**KZiv#4l2A8@*(VE;?p5N+2+~e=3O8kLXh0=(Lk5Fs zEB&JWaQefglmwmsL*i&(5P)bu{z1FLl=(pgQ)J)0yeag2xbl$StZj%PAeF-OItzdf z4X+%v(3Wr|Sy(`q!j&X6HTvQu7bQm^*fYy&mP+aA2&I9zK&0YNYr9PBg}xi1B!a<( zr=}|}Y<&_=;=e~IuAr@-!MeVh_TKvd*MhK3?w%e>O{yzy@mvIzzOs|yT);Ydje@7W zX!K*b;nnX0Ua@Mr@>Yi_TD+Jg;98&PAe{8ZJ-t?EjmC2M&&BxYq(j_Pg9S*hzI zGS3`lDl{g>dn7QCy1X|eghpk+%*hj}OoOPkb(Hc9egZRwSEo;+lv(2UW-9ulkxE^o zm5;=at;`LjDLwc3?=n3eqcj!5Jee`d!|bJ&xp$^|?6JyJ5eN+PYbflfR9Zu6EB@l3 ziAiU|C?Q@6!DObyD-DCbnrY*hWh~aij+rzmUg-|B{)6#Ke|Q}jPD@@{w%M>kVbC$D zHF>?+HI=xay*ln0f}xqT0~@KhrqT&@1k_Rnq2-KP3NsB!>$69tyjob%29`^gobwi% znV>YK$l6MPxC?UJb1?U6Q(GAT7vh52${=*W@O7=~fG)jd9f+;NJ20@0@*IRz#dVZX za072xSBVVybcT*C*AU$Swp?TUd_05F>ncy8S8MC?UOne%%mCdxQ~d;9&FBQBcl<6` z>iYC=OqtD)1dla20RqS6Bpzc7AfvReZ^ z4(B%Auon0=Flld?00h!LNlI_To(j+Af#V;oDIf_latWrchK1Yw&Q|duo zXM?3}fhioG25VopP}`@gSEsf06no&2Jr=D#Od@n-k}v9Eoy~mTgmrdmM_X4gJELX( z24-FAg&N{n4P1Yh^Qo&Ny;ff-^^q~%2}u~~{+~D@2@N^XD*H}h)avecN(iKB%uleu z557{v8!Frx2j(VJ%5Lmy-;<%^q>XYj5kN^RU~Ckp1)1qULnV}f;QX(BlsMjvCofqE z1kSiWm0J^Q32#tZO_izd%TSroW3$wNxDRVoRkr?&N97@sQTz*7L$`Dr^_)q{8-!h59|LTmkWgtGp{9 zz_9q?G^=Yybrhw-q#qFp(8=+ab zIM_nk!ZYEJ13w{!c^$cI2600j%ttJO37^6&u+Ee2bDyi)d;N^PH<8AtC`^CUZ= z!1*Z(4-#P~L9z~_;?G{M?Ri{Nz8B1|#lcRns7Zhe#(=lx#Wocqq2c+1Xi|wKiHUd( z#e*(;hE->k`aj(?+C|yZ-66F75v4tZy+!R}K^597k^Z{j1=DpUzt_h_-5*tISf|+V zLBi?$9B>=vKdOZ4H!LK)+(ZS|-pr{++jFNQ5ym<(jlO*p`^OBD+AB3w@_9mWgvb%=Q=4Qh?! z1=#KH9wh+rxu^;BNQODX874CNlerQcmrDW;b) z7luGr^VAsl6fC4>A$3@6w(`Gn@x}QRv0>vl}ZCaH+Q6s zvQTz^CB|P5M8meL%f0zd;r}ew05;NRu!jtIR_Vr!CrX>Z?&<4i6^HP#=kT*i5%Xr7 z*+;n~qQ*eVnAjB1Y0FPxmRGiS(3<`V3#DP~uYm^On!lkPHKCE(gS zOkDjrP`M{sg1+xOK1gA{(FW)$0($6suGc{|AL=qDex5%_Vf=I9AhZH*7p}08E<9s^85T(1>l?b?xn#B3uuts1p?t$u3ZkJ;e(Z@?bv#CQWikLgTbW+UcVd}=&wa_ zTW1Uu?qzAcw!-UY(}!`m&%q*~k7bT#xF1HTN`qjBzmCVs?$aC3E5rSCKW5-Nv&e5W z@#?7n3LB!-@_I5qIz%~$X|F-C-?k6S{W&#?Qim$`nw_v|XIK3Iy_zuq>g-Hh z89vnIndxd?@TKa)v()v;&M?Is+S^8v!B@u{@_5+|8PD*f4o5I7%U zBT|31(&Uj!R}46<_#2h_J=@YoKaW(HYo9WT^J!0wQtFDk4$$OLN`2GxfQV(uods3Q zF3q(BhSI3gc?cPaSLefHq4c1v$4HtLZKLAY5HkgrjIXIZ2*&7;92l!(?(3LMM(YBMf z5u6FDJ9MlPV_WdPjmOhzg^Rj3esRN0q&uoHU^;m<0Y-Opw`6wOnLyK6*{ONq+?eiT zc2V(Ns1}b}OUEiK2G!lM3bWKn8K)$K?lK|=SM{0qD07_h5GaOW4;Nri42Py0#M$A9 zTsjV`WGqlCmBskpXTJiPQApcgQCO^y=vS2&43@x{Im&%iVftTHp8}t{wW?V@RX@DS zzx`XU>fb*14R7=s=B0d7wC0Zy^m=8k&t)n4`lqcF!A|>tl9tr#M=3vq>7S^hAa_6L4>Rc04yUOr4-K@wGQ=f>N*g zI4$npp&$Tg4WIE|=>%mW=A_H(N{dFm@D^3Tu1wRd1GQC+-U8-AzXwE!Qd2k`dR+-= z)!B<~WfVp$wK)Z`!1>QlV-b1z0R-zwH~MyHb@+1|EEeM@Ds?T#H`%0l)NLYmpU!l2 zBBSUYb&~R^Aa0JM(r*UiGn%Y?Cf-8Ks^zs+PwPy!O&M0G$Fh`e?1Tv`)KJf(Zzurq z+f3`GDxJi){HgNAkuFlF;rOGHiyf)0ME$g`e(&rVFgu5rm*+7EUbvElrxP zj6fdGrRkt_s5C1Sk>t2*%ix(xeerA(B_EB6A!+68h}_yeWyG*kCJWzEzgbE<;bU4c zOKEO7buk)aIWzjPgH=(JxyoS6wzo_e!}7UGAK2{No~x`7Jd`(2Nea+Q znzR}Iu--g65B$?ca?Zc!!A$m`^L*uD^Jh*tx0VUlfs{U9aRzxy&O!za2Edb+h0yo& zm3XKv@7!C#Y*sFeS?|DDsa4o3U*S*x9(|jK6{YK9u(5ndmm)82fwlh zMU=eYo+fixlQpQzGBnvdM^R|O0!1;ev*WxQJL4IZwl27*-M3gRrxswY*4njNRMxdu z2sK`K&s;5FwbiDA7Ow-#aUtev3s6$->E9w&!S02qU~@F~+M@NpsZ@Q@JuT$23~d&% zw-K!+!Bc6Sixw_Y6yFpPYoQ)Z4sIPnUoS!no9N1-d&aYvJ#RqLm^C5PHWyRqiPjqC zm44|GLTKONR(=s?EtxMp=o&QdD_+V9CDZ7RF~%f(nTtu-7_BwR%ec-;R^}>B-|R1A zeN+e%v#rsTxdKp?DKGqNrn|4Wt*HH>2Wrn_wLe73so)LXA|(o4E+m|!KAst?)#WFt zW|Y1NVfwC+!W_>17W3Vt>0%|uI-M=_mXtQ&2bD%HRu~lT^2JJo^*tH)Tj?J_-!JL~ z(T|Ij$(HRR?&g(yf(0i{T%x3im1k+k5~UscpikC&sX9e3#mB^RmE>hTz2TQ(0$HMWBoL^S#y#Csj^kA-r_6EonW9+b-w0wVJp%zD$Y0A(Iz_ zMCdC$E6$jJiS157Zz~Ow#%a5JEqH79?Fe3G7=5m?I@+-|%tG_tR%Fa-{@XYbzmk_e z!z_dbnBlU@`@$S-PrZ#(MJffoqm03!WG@L@5h(HEA8k_Vn&D;2v*FZ;q<7cQ9Rba- z2jCCE?dC359s(nKfaHoEPI_`VmThNG#&QsOaE~SD{Stuef6hh$&jumlYd#pqDl}In zW{sV72QkI24)dqB`HB_D*8Mk~20{li0^Yhj+`=ugv+|WQK5>CAoXIG_A?$x*iDDWZ zYp2Ybu))kv3b$aho}bq3K?wn11h|CY|5jSVgza2bQ}(Vh&$9Usv$UJiM~1edbt@sX zUPH%MD!s&a5s7TdYS`($r#QqFaOz|S-cj#CZ15G8B)e3~_m8&Huo0nsJ(cf4C4u)A zJiUpF{`CP4kDaN@Dy5dV^AM#6OpOlUei+)$LtL*`uu6%HEJnI24jf=`*!$CSq_I$9 zVN^J#m(5>?m8d3Fzz7;#^-3yP+7rQBz8sTE72Em-d6s>sd@2ZElQytdouu73F6#@! z=SE@H_VA#Lqp^_nNUIHzg8MTq8rUllFRWx>FRvd7%fsTT=4@8H=oZcS=i(LDFm#Ko zgM$q}lG2`*Nb0&;iFWKh9fN?>49&t!B@ITZG-*&TX3|%(T8VM&`m6?HV)4+Lr!^CC z{H++&%g=UhgBu3b-RbTi#HsC0DZMhC)NgPvhmT#$7~IPl32`p_YV}XirpxmYOBbQj zQFPrJEIF7atx>$uSd9^Y*>4EpxbEc5B&#@rF5jvoQiHWz=+km7j^wWp$nUhD+OChe{-OXQr58} zPoCzih4Jke(rb$6&vnWr!Sd6w5Lg&pDN>dRpV6D2D7~S&J@<(+9&082Q)MNViFLj5 zoFC8T53K)^yyc;kxn3!W`XL%}U_+z_YaJVKk=*Qz!dDWN-010~mo_NlP|;5tlsTw< z+(vL&uon)3)AOELrJFP`?Bp|Tl38CWTX6Vknl$3XPZ7Y|Hy4AL|ZBa$fp<=Q&Lfp`4`r@jXQC)TK}@3hU9Px%7(qZ&mETT)AJQVKy*d{_~n*2P^~J!`~;8(ZM|g9I&oz z zcQCowAu7uMFq)R{P^@;Hm|z%jRFcxu83!{|?XN_|-#E_joIvL#?Wr$;-U>-3-Q9r? zp@QtiN?r3xL90ocytNlql(ua`pBF1dHU{H`50A!|;7b`zi%OL4!Lv+pCItM(Hi$qX zQg8aL1RUOIPvg&(1%mJ)ef2M;zPZE>8)f$;c-3Rs2k%tcRsS%+;IrLT5?|b@3^%HU^B}48+;W&WNv-Cv1yxM_as(wtuZ`cJC@W2zPB}0M8o1>>;Pygm?8e%k}m;TKtW& zujPlq4lpXBL#rAAb_3q?uc1nFi>xd>;e+-4-V3WHz;!);59SFDa4+?MP;xKMfo~rq zx&KQM!3R-)W@hGX)}mI3Xf&My!y|U$ZaW@`wD>R2_weUo^yogNp7;%7)cs*`(u{q0 z!;l{SP}AwU{F|A>2Lma=h{+{r=YBI&`l+7P$$vlef!_q@&dG67;(lHTmYgm`bAzdK z)?z3&oOgooK@N9P z*L?_Q;vI7C<(__j=~6K3QX2|5#HG4Ezg_+P!gAa<^vq_E7-IVTqZi|CW=_Tb$;}wb zf%f2h)cZ>l3U4A%)T4$o*Ba2ybys`#7SF+N%F)qD6`h|-qW(vf!Pbp2vCw5ud7Eac z=j2hv#Gp1$f3G|ah=rsdlo;vL(ik0q!ELT1nx)_9*&iUeKTmUh;CT+SJoAs-m&bC9 z=V^M3=gB;VJh?~j%d<|;Q-(YY4FQXMnf$w;y4bc2FUY zXQ-b2%HjL6n@%VVt>>BVgoAQUC}9r=xP|s{LZA)2jv4p~kPK~t>oS7#>36GXr>aSS zhG1DZ?_=@edq^1U38f7~rf75ImW$4uP$Jwq>V*zEVZb%4JZgYnz+Ku#GIB|}zzyu4 z^pO=k0jQ-JaWZRtMzKoU?jQJuGs?^QIHGj;mUd^Ar-YkCXO$XZ zH!YywZ12P7wTJ&bfUiZmNe9m=2`YaY=Z`FI{9&T9n-u(`5;BB8&@oBi2{jyG7XrX8 z0^PPcVt{ng$u<=;04K5WIUdIlm@_@w9oZjqoLSls!$)Ri$AmgSg12h!;o7_`nN5Po z;4MJjtkOmp=xvG)qv{KK2U6jWN~nn;n`Gp_1vdPRAyz-YoA_Zqqm8%o=Z{JahIA5l z4iozxbw8)n#r#e@r*LQ!lRJn(o4{pfA#FT|HFlovo>N+gCD4~2hJ#|686x@a=W(Vy zPp_U=hU+gj-l+T5dBqutPXZgcj);GBkuDE4w~sR;H28cJh+wcou zLpIRZ3*d|1BhLk;F>8tU{q6;9-T49Nd2K5F{3fs|eo_+j=IT&Rvr^(1jgj~b#|yau4dTzrUNo}i7wCL+_cZQN9F}K0 z77xsU;wH`P7Ps3ZixhYfMn>-)qKxLJ;ltkeDF;HyD`o+bwH}usx&D-1y9C+r&-B|R zWrF9E-<3Q8%2%^i&69oy#{%kmn;#BJ+l+{$d3Ti4PXJ^tg@5bC zjv)aKL)o9nwz%|)HSpwPkH53)0oZBDpUS_4R8OBfij#qK*l6^YJ`t?WG*pN1xG6&F zqF8kT{=TCks`7?yYJ%RC0LuFOP1SQ(P*o$Ss(`Pk?1~aoh1#;ELti)5u7GIbXX=Tch__?$UJQ*14kx0H znu<4k!n3?WSt1D0)ch){olU#1D&3s30F1zPF;*9bk;z2=LeTuBt zL6l}w%5@xRW|8MQ1k9)C50jD)VjuCJhB&G|?zODzLp+j2Ke@U+}d1sc)`8W8%~X&;q|3r*_59 z^*D91cr%~+*X|hs%PZBtwhoUv6%@rlO3kcFzV5sEDm6S~52XuV)(oOEHPje!zsRAA z$rZ0M^`M*5Yy>TEFwUsUryLMSXj9mg(!yrI&&3F=Uxk^&OdHP$RHx02X`)6V-== zk>r=8&cx%KBsEg_gVrXg&%o{1ub$c#p30BaQy+%W&eVG9RN)Bu*H_!%*<!`0LDDTg*Yl|(~{vVh~rw1MeQ{|hgN_Xn3ewMG^aKRSp zZifb;c91pZu;LGeW#4s9R|NALx#nseh}(i&s9F#k_SFcj;A|8&sUFm~g&I?P&q+Hhb_`=Z!^YL$ zXUDktzuMqrnTzgow!rgiAk;1n8Y(jFy&tLpkX%TZ)gYEnqT0tu}OV3`ZT{2*3{@W>Jg?j%IXvmqic7J(%(|)a?3D|`u$|Y zE%aT!5}a;bRrGZ==?hBx*zThFSAu_`)OPALLCih%yptxMTk4>O&$aiX;&IK);>Gt# zctm~JydD1Hl=bwT5bAsSc{}xcM6C;kseExccJzxw?DWxFjrqqGPM051m-^sSEIyc5 z#KDBvEALUf8C_1<%nP4lVPY@ll;gIvV?6fgX5vg9ER&1QbYN1OZrOtg83=bfpI2Qx z;PxP(`imq}cdZMFo|; z67ViypJy_x%DRISsbW9(sIPLgW5Uez{Py!GwxhZVE51}XfNiUz%8(i}XEg=6%r)Dn z;bW@RHz{6OAaiG9lcKG+han)Y>PMrTPHRnAmO>+Lz%=Qr6X#E_K!l~3m{2~|SiKLs zRUfA)F&sr0&Fmhmnt8{Q>)lQu+vBQa^Fmn`CV|Y=T|La^6x9%CKOE+@!o*YCU^l$S{7|0cj*N%bo z?W8h67ZW^YSnX=CE_f8QtHq&OeLO$VNv+Ag;~O_a8T#da{RX=}sWK?is<<)#eoQ9z z?sJ|5lQ59xw;tfS=Vkr;q$*kX%gReWpCE*WvK^eu@kGrS0lMy_oE{fdYSUS5LR0Rh zhQJnE^P=p2xjmE{J}l|1)`xh_Fw?z9Fzx;N_-f)`-+jydR%h%*P+h005#lQmwEf4Z zaE6K*LFJPL7skf`YYjdh3pSf7mf!Z``lOS4Q?C$Dd>7Dg@og}PEMVH(7r6L+a#uCk zQh1Bup>R}}H*d2fM|COxlO;K-%lkaZQC;@(ygI52&&yF=?(z&A)nzA7a#WXdJOf8{ z+42XgjH9}|#cSZGF4y^8j_PuhCpoIiG+qNob@_?sO=qYsKV4@va8#FTzp^Apb=mPd zOLA0~Pj0d#M|D}iGvqLUm%JP7?$oCM`|=CVyMZN7^1SC*@=u<@)dR^}6)f*#EP3%7 zOTNaEJ9zRVmR!h_$5?U-uOXl(lArU|TK80=?Ae%A?AOsa>J93tGMkk5^q+J3Pwig( z=1~3TL;dGx{U`Bh{_I8lXN~@IS^sJ941YFS|0%)`Sm1i}#p`lYM}58$We7Ctb0``| z1AarojRraz&FbDN!=`DdqtRT_uab2%n)=W3XN@=-%_#k%v5rQwPQPlRqtRT^uO8xP zG}PcZUaYAOM>9&lYNo@{tkbWW>u@wz^s5#ej)ofa;pJNDcr>H*tA}+wnsxeBD;eEFt%Li?(p2?09_MQ!b;Z1b4|j?Ow9_M81wd*HGqCT&5v zsNrS`#|EfuSsNgn0y^7l{@pt0J&pG!$hJhE%%lfMU z!FT4%+R;B`UbLDtoMM^jS6THT7W+F6F8a`l^J#m3^$?4%Y^CjyL;BJ6boEu7?A*Ud z(C;04wkD;#8fK@p1Jw?u17DU>$^6g|3K#@rkd6LSa<*QmN!#=VH5>$bzmd`gsfiI~ znEG6<_=BZUoC6RR(^0M@#W*c>>HIA=3K z0P^#CexkmE)hC42o(~7B{(>199eK+)#9?m%^of}Qhky%x<@E*`qDSY>*)QTL0g6-E4Gu zxT?_O`9spgwKmEaF%@St${8`Wji>JjHAfIn*JQ{vQ^1zKJW3r2w4KuZkx=1yYK>NN zh2X`xQ!~qeEYa@B;RDsAqts`N+FAD9{A1UY%mV^$ZyBS$Mk`)YR|oH11lb@oV}B{& zyZM&_9&wy{(S-MN?63s>K+Isyr4iE^^Yo6h+tK9`LANYh5)o>=l{$ZkeirMapRC%*+2pyb+ z8S71hCS!%9B6d_Q7ri|hMSz<&Sq)cK8I=kUwSO9`0{fJzXR5R9Qw2vX#CsYlUYDsR zIE;LsvJ7W4)m}JQwaQZ6QE#I>v=7YIS6^>c!NXDXwJdy5=+o9LH7tCk-V_t6vm{p! zKsLYfAYIB*A2YL>D7LW>>8G*A@Q3i&ir3VRK0CF79s&;q1A>1~?-1}0<*6~2K( z?F1@+LyfV&f1Xu?k^wj^&QmFBs%pn^rOs5%*L^PtuVKfQzg(9lZG$)MdIFDeiVs z(_J%h~!Q4tq7a0|!1KrywlTupP^ z?%M#;OcMtVKIQ_-Ju$88H#MR4HAg~OnVL$DEGK4a&j0&)&bdI=cl>_;?@wPZ?m5qS z_WV4b@&4e>pGoVd;d0xT$~wvt^?J*l6r}5-6!~;fUVqEYbes)w1h!$Fg7T?#@OZk8 zvqG_*hx^;iAb6Sb{e&e$bkU|y-#N~9`f#ik0&1?ubay7GJuAR|`JH#ebhp3l<4YdKjIHm`*BVx8tNd^wdV`o#$ov?8rF-B`@YwiupcXQ3X z7xS@^oxVz2^4%jKN-~6}KC>==pJM~GJ!OuYDQ4H9ib?RO#;qPEv(Ql-kHb83zB}&)iu)inhFpP?)mn0s zlb01i?V?gv;hDjrVvnePTIYK*Sk$_u2v3!zQE?1-l&=O#O`};_2r;1>%2KeW0Lbxh zX0yD!Uj#}o0Un4tyQF5~{6Jt6m#Z|>B?XBKj?hvUyp%4Xoi3>rqAbmu6-L1!(rygb z{+&zVWIaS;1F5a=#dsMhYG9Q2l~5@~5a5sdi7yqB4|i+;l=A3sYCYw6U4dLAOI|!@-HuYIiNc?YKkBW}E&W-0 z@I2&UJ9=BF{BBelIm4u95IZMKnkK?UPF&i0+3N|H;M&WmNYKx*U1)X$kHt$pf`Fwx z;H->>cZd$8?8us;*ZhLG$8SZ&QSjN=ZUwEPoxX~^cottKh|zKM+K49IsBaqo#Osxw z9^Hk0f22tq^?3xJhCkYbrP8YzBmG^k9AxFOl9v%RK~!AnaMK0j)kPDdC5d);qz{-G zNAYYZF*Tanz9ZdyqDch(7$-#nt>;dhl*n3F{L;@Lfj(}ONz>z{J=UqaI;4uA6En=J z_nA5vE*R;~OOTpdr-)cIh~9U+n~o<)svaQf0j|0j(Msx3R~iaE&Xskg(c)!%s&mmz z_3KGpgv&Iho;1{4$^4}6uP>=|s-C2Ym0$+!1+03z`cgOcEr7_Rr%whKWHjt8PDTgs@vndUvI#3B)(?DYWhpadNa_9Bpd?D9A zb`QidxX_ZuCrM@Exg*|Y4W&S)T$0{MYG;}wYE6&DzB}zJ;EX9jo_`_s(h?~?DDK32biN7pw`w1_~lh_=5qM39W zKN-!X$%4uIRdZ>uV18YIB1zl_9>}QbM472~OR2qitEfRVn<`;^TS`66pWA?#>3cPk zHC5^gj$ofuX)5%qze$xI#ao+Jl4cr&&9TfCuF}TWE?bzgBG?wk=3R`Ui=HxxzHBAg zYxO%*%1fSqQK6fyq;Pb;+**o-DqimVi(C~if3uqIo!wgE%+5n?q$EJMS=vf3py{u+ zm0IBKy|&WVR_I(X?JS`)=51j+NwN&ZJ22e~ZcDVcoiq`i<~z2RGVwE`J$8iUw6ndG zgSYe!(iUX(TL-C0J(dJ}7t}l^RQ?+1UcE+A)Xj2nR(WMV-l49!sL z)rsdds+06M@+$8nHA3L+PEvc}MQYm_4HycLb#*;Q(pxKq^<_0H8@7GXs-;Fn}@A+__R z%oLw>ZUf3Hx$QRd{%qb&>VOJN>?U@&#pmGbFSQXpG>2AO1ks3RG0ulYh`9nsX+)UGND$H zt%y5TJKR$W6{oF&-&LuR`6mIseRA7RkD_+HB&Y4_Dfl7*&por36drqz!~uHI{0`2R zDjLw1;_kr0dqy8AUe=xT_-U-fhP*^J2Iak^2I2>+sHzW!FtWGgWTmyI%AFBWszvKy zjD%JD>NmK!;LYv8eY8dYN!VdAuK#?OnAuy>c-xxPYFnD_2k6({&_4W#BKk-%wnKWh zl-5UzVA#zYD;6sOM&&;SYV)LKy!H)4S*_dnYK@jbubQ!K>4!e(sMEaujUnre&5#;9 z*HzaQE`G{(#qy1Re1;TmWqtCwALaJ6>75d3=uGRq(!N&y@Bmc${8X97JQEV&Sh*UQ ziB2r$cQ2DIQ%bSyP@z{%+Wx!1OvscJ+pI76Jf*RjQiSJEL$aIeJoD`niXIGZeH3~>dg1OW7RdFkbY8Q|H`*xG0DEP z7S1}>REP-1Mt5rgN0&eaE6{_0?T-3WL%*tNC>8ZHa;~h&xvHO3N6Op8vB~|kH#Xpb zISzSqH6> z%&)I=Q|79?AnNyXAhQJ@zBxLKlD9?Mv9G!wvxWs~=T7h8jA=MdJWaVBcMYT;he=JW zTkU2?wjGqsw@{%PEZx#`ZfN>nX6i+z9uo?U%eKNC^j!%E=M@&M0*3qVL-h~42^=pQ z27xd>24(P2Y*%)fvQUA2cQUzdEYN>-s3z~O?clK5&|&~K^fF*Pikf6DTC zrZrf_V0V^O@%*ILd7>i>8{(XhVu_uzR@=HLNOjk^u(Ex z*=jwaC$98Ip;JPsWV=HR=V4hsX=Y8j1yuP?ml#Uk=(JfEl<`6y4`4&gc25p(xr_~HJpcK`EUbjN|>yd(6Iz1Ox8=7^_G+*P7bA% z-+olXc^JIG=(Ji*x?OsUnqD(mt-JIV6@BDL0t|&VT?z~5L0Ot~Z?Y{snN#Lu)D}IR z5QBP7LyOi0s^L5=%O@wSDKC$-b%AxQd3uuLo195P0rky8Q9LNi=RUJ0MUh^^!aNLg zk)Evlx+zJViGeP4sCrly{6#Upi+)&ED9Ib})uq@4UZ(~aJ zbS_UPo3&I=Cu|5z67Pmk@n-Zn4}-@2z3EQsV|8J()8BehAFK44=<@|A?}kYY=V4hs zgW;MM!66-+xVWjEQ?&Ta8hPczniA8Y^+ut;BXm#(pry- zXWTlF1!s^!s@MWg2l!Jmo=VV&RIw4B7W1b>Jk3VerHTo7y2ayp@U)DF!9BCKl|O~y z=?Z_6@U)J{W9r#clX*6bw%f};GkWAWf5K*?mGX$tm}hn4OvK|<)w)xxvmu`z$3Ny1 zK6^P7U$rqty3(;=1W%lxlfD?Qg{Z`7lF+xLwt7_jFDa`ev8p~ z>@2PMy*aKjD#g8zYO8#eYN1z(n{m2+pda#4DgH4_OT9OXy}XB9t$5@2@*YC7TJap} zwq~KOYav?e>STJg+SEjcSy>%8OJKbdXk2IJ@rqFC9CY;25Ut%kiQDtUJW`g{zWSrl z(Fb`ix%gd1JLv1C4!lCGxyaIWGDI`{kyiH;_cN+T&(hNF&GS>9XJDy8cJfSV|6JUb zf1z7*rHF`6Sx{DOJ5i%Hi}f+lG^TW&AnMn1bd@ww7l@U?N(bPS4hGaLVIn)wUHivfa*yAyoT9 z&v(0TLVTfDSijl04u@#F@6A~^7S(u)tlHjAjhxGQ&a^QNTSd7(yiFJ1kPB{_T>kof z#&rl9LFh{UHLKc|v}U)t!e?5bZc?gU(HG<4j+Dor*p9S?Kd~KY7k^?q(qx{3?MT~ser!itz{A*vbcDxa8`35IWDdk*IgiM8 zBx<}sifYWL9hf9RCSxCz3I>g`(zHe<2W7t@c^Ld+@f+w1Tr?s-W7n7Tk6N~*YflLxgKJ#55jV*DNhpyx*Ep&~3gh~@GBj2oA?Q;gHQ_yRx2Bk> z2ou*k=!ZApJ!gN3WO4lPbrfe-S;6P_G5*V*Yc_=L+az6qbUrXW<{^6bJ?VQ0af>I% zz!G!3i$Md881G_Gtq@p5LH#yrRbqV=z^(e;Q3I(0rNre_KHe1>Ry~N&PV@~Td!!3F zL5;}u-E^zN4CPV*3)J8BDWy+vJ%+}>@eWlb&Vd5qlpuw6t$llSec9=IPz&%GEkS^e%ckq`;qZDnYwhy1&hIcz27T6iHV=~ zjO#V%n0)k%YXZ8i>9f4+LMZc%po{>n_6!Y-47#)d#$}jHh5f#43e1QDZv@o~kl1m} zb|ey>b2Z~VB2&sc!!ZueuHjW|5XyQ2W6Wx0f(|y+^=QVFAP=p5&Sg(r@9>e|7!`Jq zL7<`MX>vT%Y5E-?_4Z;9(^zzs6#F` z7ptCkg-6`O>$2$*U)L~Tc?l7rCH!u-(GlB~aOpXLO%P3>%Ai zo6G!Tby#oKb~zAd#rq%KKfsa|&Vm2ny&;YrExPZ9;ib|KqA+M~<+&!_F`r0}8_yqn z&NlG}sqzccW>mMbDnxUx_}ZcYuz%5lKo5jngKf(E3HCrZE1bAXin2|g7s;67lqHz? z@)aJj%fcY$1ZD>H|3VsxX_Mc)rP>E-Uv2#wfVKDaC8e>SU%aWUUn1W2Tv8e^!$}XG zw_Q?h`}z6ZcEF5M)YewN>DWU65a2W)b5RqsTWSZ%vGCOiH|$y^c;xiv?v@_(M`4G* z!X}wX_OBs0g6e#|v5{W-8sbh2M(H;alboOV29l`$_Nnc1Q9#SI4JW zAw+oU7(%4_23lpJYpico8YgZ2>QyOfCB=d#5mT^^@4n1)s4Wxn?)+9-#=7>ggVJsE z5PW=fW)>K>g5N7`wE27Kd$G`3SUfEj1|!Q4Nhd*tpvg3G7MM@PhoyD!-;{X-;t#-? zEgvh>J4d8EWY+Wt>4^DDnB!CV+_csPwjWz({f6O!Ly}(f*?nQ#=gN zgEq`dOK|8OFA*Phs665&7FvBCz%r4CuDL752l`i=8)iV1hVWJafz`|U_%SIF!b50) zKzJCyPX~=1@=NcGRfC}7SDRZ|ar)zdbBn-nU3XksE505?6;Vr76Wcl}M=t5%-ByVa z6jzxjw`p#;*L*@c0RCuU+3tGaoMuwWFS*U3g5NEOCcK|xqwmf_YTS5BgpG!sl3MuB zJD9?5k^pEsxmTg`^NsDa?UZCsTD%Mgb8BoBICk6PCw(*y=BfN(hGs9{$oC2e$3}kf zl+;HovQoE>xESv+}=8vg|92EUVklA1v>>-~w# zf9s!-9%P}fpTRJ_MZrHqj@F-YX%BXZpQXg0&%6QJT&QMkie?j!3Vwzf!&o5S?1{7; zI246_6o_~W_UMQvAEbrR;GetJrS`u-_&10ui=nw#l6QJId788ep{u`0FS1oOHbthL zm&$EsEfGruINH+zp!^TY+ETYU>}|5nL1n>!(QbNP+HRVB0N2LAh;T}KJ#0LLY8zh< zn<|tQT$G+gL)T9VOMwpFu}NVWcxya4jLo$VCx<->>2=H-VX0yn1h!QL3XORqj0tFu zz7aMI5j#!^OGb?GQ^FdHb8x0U16$IUE=w=74T162pwiNTf<6k1r@$GbZQcpLN)q-R zny7r|q2<3p{s^eqcbY-t;;NL%G)cx^$KX$fTdZ*m^RoPRsS^U1MvUu#1)p_88p)kd z9fBcA^40+n^wTZrXONo}Fy!Qk$F&NdFUV!W*-!<7HcgD{yi~J%;Kg|kv0fU%}op?@)SaeckkyTC_@Y`;SmM>^U>$u1mng-Rj z;U1Vl@v{lXH(waGnk~b)WIC$140t$Q6$ODX(^UWl>S|qAA=xJD#7_XDVu0XblkZh@ zAe+n-9k$tIUC{vsb%vq?=$(NKIXBAtq`wUG48FOOZFE0lda&iQX>7_&an%+Qw)Gl| z7H)bvWt4Z4Q~pAPFT3Og?ch*5SdO(GfjJ!Zo=tnh0J9w|$60ShAOPO~Sitwe@?df5 zIjmZ1R1j1K_^vz^YY6_eE0;AD!f57}=2qp%Ss$nSO!d>Hv)t6b?QK284=ymN&$qsA{BW^k(ZTq&_n1H2l zLRqZtK^6iM+52jo+}H#z#M%To3DXt!yii4fPSAP02eAwnfNDIW-yvo{YL%!>UD;88 zY%MaE5mdo?-{W2>XnD6?o*+z37@|}0kk<0OGH1Xe@KNVtTQi8;;v>Ply!dLmmX-T< zO}Rx2A^yIDa?uofJvq{`1WnP4@Tba;BjkG#@`JU2>LO@(Jz3)|Sy+?f#(G$zV`)D! zvz_{oXGT@^WWHrO>+@w~W;TEIAoxX3#M99Fvi|^9twq(Dpn(Rk47@WkduP2P^vg{U zR!Gb)q~6i|#L69KecCXy%C! zx4Z%O*PbVk3JwlV{L8qey_Xu*@`mtlBA+|_KZu<7kJ^z(nJs>Ba@IFRZZ77UX>y9p zFj)V2BTToxYWSa5to-l)gUIWO{~f05K$x>+LZz{oGz=Dyxwll|gyX16}25IHrE= zid@-icXnB{I*bKW6U9XUmpI$TU6_4U7Oa#oL~hKMRd9d;`TcKZ@0cNSo(ntf z?_+Vo9sRq_H3eGe(_yBz)x#c^{l4$IJY>0VW#*p_8?@ir8sAaPEYk zBo}nFbno>RZN~;P%n#xwfwF)>+^D87H<%Aw3z+f#Lw-DVsjYnog_2N zx{14X)ES(uCyjRPj6De~9zJMVu;I z9C>i?%ruk)ocKbR$oJsEhIX)1i}Dhh93zJ9Kt+hvpd_ znpe}I;!?Zr42*|m`A*Op{`9R6_3p(lcV{&FkNvylTFL-%75eR84ev6Prb&#u+@RjOs+_u?OA}cU8iaO4epB9gNL@VcD>zPIs$&gSc&y|~C?Q#Q# z*JjDx{kN}yMT8vyT>EB$^va;v*)rFU+0|L1O!hp8;^vQr^75XDrrr&+vF-hjD)0<+ z$o^~P6UtxY?KoflIs#sNLrdh&5p(Pe_aw-pdV)P6*uNy`T`|n-YeC-eCGs|tcrAz; zZIL^ObL{Ll&YQPI4wJ+OHOkI?SN3k(C0{q0nVS{LRez9Z&t5s{fpbUTR~6&ATjy$l ziuMU6JT`;iaOyNP95LTI1!JaKvx@DRhT9EJm+kx7#Jpvo1fW}u%#_2bcVHcy$?(Mi z^a19Cmpnt8z&q1E>^qEJ54mQFqB~#8)&QMY2k8PAw*z1Yaks8uRki;O!ETtIYX-q? zSiJm!V9(z#-w|&GdGpKVcLdX60Y+Svp*Vog&5eTdps`lx%CTQTz5Xz}m$@miAS!~6 zJoI1yE&E!|5D(X-tT*9ce*8Q{jyWI?5^p=9j~vyITu`f`w3z`m@A?BcyK&wf`$m4! zjQoMzb$xhGDxGcfcsGA5#|fCO-+U*hiSQYeTijftq=RxiCZ{kUTBb)1;-m*>|GVKT zvsh&A67r8V^U(Q&a$SU1UUABl_&tx4^Ehs>;~x+#H2Zs*F_JC{LYRf6vFmAm`<|!C z?fjgZ`q~Cr=*WriAUYl}GLSM4fd&Bs{t(Y8`ft%H(4mT14 zp;gQ;k1S&sga@e!Hng{2e?b5r`G?FV{`j>r!Q;!=2W zI>WfCN9E!0cRcZ^{1gk*ro*1(;!$}hd#Shrn}ElT$q!=Z1^`+V&3-#CG7J!pda>H% zk1bk>SvxXcKmA9nY^GAeaS%o~fcl@XFVePsqsVE1khk?qNLfkD!<4>nfz5mIxD3U1 zlu`NAb27F2Q69x!Ql={sZTnG95c(Hx>XrolR*yDtQ(*_zKoBczu~}Pe6bAf(bXLy9 z6QJsS<#b#b$fyms4l%4=tRn$c}j-ITN z9}`MxZwB_}*&gUaSJvSI z{9JeIA_GN_62LOhK@`jy$L-Y6DttFU1o-zFwl5S&sQfoM72*}!RnUkTlz3H+74Oug zp7=!#pSmhP7|&~HI2Q4*T|?ck2y;YtlBMoXmTPk7psPCqw2gwc=c?|nYtS{Eqr>Tk zCvT{<-Dl+>1n%u~8>$(-htNpqh+2$(%CHee`SpS&l zVC5bdj8!Atm~}5BMziYz-LVS{Lw=QmDCasT?hUlzI&Wxk_*yspcwJV(4@m?nu}ub^ zG}rUjFB;Lm8%=qurYYlomm69Zd<>USw6QczvoT@s+g0l{Nu zfWn>aR89+uqN@nAy;l;WwS#?Wj9qER;MpItD;%D^(600cm3J9G(G%hVQF9{u& zP(oZ$(_;tY2%y*wh^Ny_ab+YQbzR?6VCO8ea zBP$UoFkCU}`I%mz32S4FqBIdcrbR$?!3BA{qStW$nfqk;C~87l*?m$dCIZ)$^8{&| z(cR2To2)9aku$9r8bf0aCRq%Z8U!?Y1@o(~s&r@Y{|i*5KSTbvY0YTjvu{Xb4pX|> z&cgjmb7Yehri80LBz~vXf_FE-tvL{XZkSTz6lP_Z(xl<@K2^A2-~2aKBkk8(2{HhZ z3c{6E?K8Ai`iQ#>JZ7iXninC%--^wrAXig$G?XjJd18RS|4cYmMh1NzuC(do^BUw^ zo4VH^r=}bHM0p~xG!2b8-M$Q57hi>j;|VKMi%^)?Ae&El4mM-e9R_L$kWPHDz8#^| zcn$g}LWyl`cnv~ILw}B^4B}_1Q{y^x7#PEy5ZNOYX8qqT5^LV)Gw4zFa{Qw>jd?Vf z9;x&I*u{ZJY+uilB}(apM)rtO8dtjxs;M}y*7PVP72YvFH?*E$LS__g81|TeZG9{X z+s<=v9;dWNZXKf)Cezv+tqjCI9T1~*fLoC6G0F%8u8vV&FpTVddmS~2RqDq-QmuWa zD;(77!CISJIL(e#0^s(+1~&&Z;%~>@@WSfrJ8X0zbRt#>aV*#t!!74+@O@C^!LIYr zhjpA3@4*gpANBDlaSp@T5c2to`guSv=XsQXYOh0!Jqok1w`m9XN6E01fjgJgF*usp zmv8hhx>XDYun>+zV8D+r-|9sUj8mGSw5f6Ee4lHh61+GK&qav&Jq(-}Z}d`}(h5-% z;}O;8!>Av7@%b=%Fc+G!iWa6FMU0Op7eP*^34ql3Ges5 zgX(!`PJ*IhXxAhtaAiUNNZ@nf=LDspgS#sdQ1nk2td^N>YF1Zyp3Q=~e4?DLt0W17 zydm|JK&X`!9#2d}tx^+}~U zzM*!NG9Ty^=hUd?BE-uNHBfp(9Gh|&0+Z5n1>FjglyFE|xsA!C%}OIWKI&LHUAp76 zS3{!x1x{QT1<46611zqN53Z^Po$XIxaa2676~odh{yl-8#GCS-OrYdOk1MtvM`JV@ z3$dvgNUhTwJ?^CS4HY}q>@agotZhkU41=VnxYls5Sl%ksT!S44U`D=q`LN?~QH1$( zn;Q<>Z$I$q4s(E}YP<=S9q|l^PG@UOw=xW{UM&oMNvO*5YiGug2G_p*lo?3r1OmD|EQ-o8zgu_h>i^-T)d zfS)@_A#vtX0hf{dX3ER``uc{}fMmc*w?W?v3IpK(Fol6I{6y7g^4Sc9ff5GFq3aH; zt9e`{P-(-Eg%CFjvN{bvxh<3~IP%M7l}W9G6!kGi*rhxU_r$|bv~$w<;qY^Jt7*t7 zTw*!bru>@+hEdM001t(>QH~)l)GcMQwN)6SqS%g`^RSfep!(V>^|22cx@tZ+2_Nms zxCdsc`nj%$4zyJmE2H8$lT5+wlxNyM1jQ0VXbn=|VhoJIf5o5x&Q)Kw#)`vw)78)5 z4X-dOuRa7BU$;|Ykmu!gpeoi-YFHr#_>6&Kcx+31b9Y6pK*?ad(m;*U&4s9Bl@nCgmdryVq z!Q#+zzp&%M?9k5h2a`ja${zqxziT)9Bser?OXM-b??4@>K#h*KCHQIQciTPYMt**- zZ|P7+rGB$-?H~<2%p0?I*{?hNcz~;)BRmb|J+pQlvFwrY2*~m1A*Wcn=4lv%ILb`} zEm$kN&1p&sFv(A)DP1AIX_$_aOr?j@6{gAaO1hHOq*EZS>6$%N><3yxdoPe-CY!X) z_)Wm?7W{hf`#yf1+O*AdGhK-u>;suHSZdW!hbF*Gea)<;;>}E>1=z(*o&ptR2mfH0 zEHH$spKZSVlA$xhy@3fR(Sj?Cp4OCJ;tUtXt;|yBfTlzW?|Cn2O0Xb2T3CD*Of3rQ ztOSdzu26%{ScS`}cV{KZx&m32h*Z`pN~JlS(c zLCNr4R`L9xM%M2bywpr8?x{RZ=ejGO{=1l7#B442k{#=%v^Ae&((sD0$7E{OTd6Cp zTnz)%D2(*i>>&&f?=7Rzy_Iy+0&s0N4Z5rrbidz9u}>*Xmn`Q2Wg;ksOKS!VpbJm& ziJbKyNLR3k&h>Ls_Jc|cCbdn^KOjT7&nUXEbZ#BsfsEgp@B|&nP`>xoXj`Vz7Ht@D zpAt>2dMj$Qjhpmg8!_r-^VQ47>a}wuE^iA8oU|!{C8` ztb-SIcVB$@>o>0)lU_F)zvviR z4ltKV!3m}x?FJmvTa$v>ky`<=Iej}RIL&+{20Ykf^Pg$~2(@5#r%9fzG^bW};jZz_HDJa`VKvb6vlbDf4fSn+j(Rob8EmTSlsc4S3;)sDCJgK zeXg$S(z0*h1Lr_Q7rG?lfgRj11PlrPPsfaNF`&LE>On9)(`Bx^jTT zykoFJH{Mc0g&Yc;uGC@WOjr6de9KK&T#wPk9gA&rX}a<{XtIi1Hkqd8DS>z{$Ws<- ztIqBB8^s)1z*PqHHL}nstIl)N=C5`S($p_^eiXjwa4f zGR2%LR5n8i6Y+j{hH?sHT{cr`=)Lph;DrLspM!Y?H1WC068vnOi~Ih$nM!AOaR3NX zj1646IOE|d&UI0uPO}i{13ErS8DRd};`)kO&sH80PuZ9Q+*sN+TS=$S=PIvZDRrHv zOo8^s-g!!Q&uK=aiqGOs!nB=%um|$asq-*lYl)7ioc2&Vave^vQPW;=VKigDvJw)M zmIX=|aY+EBtjdm|+0%g#x}-qqX3h8D{t5u|D^EdwQfHX|{L%?Z;e_^eAnA-H@Jwb= z%A%KBP`?L@Qs`1_fZ2PL6et>PqtLgNUh-+&A^ubY@5Hw;K7bmVyige<=Db0fisq9IWtl2_?4xP=Lgn#$J~aS>Sfy|VvwqQ#w&b}G*qtt|s_#!~q4EVhwpJD@oucMp zi_)(rx-&SivkYY%*v_UEDepqud!k6`<5>BFzt&FMUv7s_`I49*Xdo1W#(kEC7AtL} zFBaEH6<W!!g((*J-?>?blC_}{xi^9G&!l~ulpk^Lop=e(EI)rw8G#NHsqzuGL>)IPOZ_7t z-@%oogg#iMti=R)WVMoP+I6=-&0no}_`}xKN;A_YS)=?1`nn6&C^8H6hOJS`1o75a zba<^2=h@+}87w52yy+a_yjwcrgh|Umtg$60!{-OL^A}w^C~ciG2s(cS>y&!IdL(vR z!$lwQ_N>EoXr}l4I>jl7CGUH0u2)_WS}gj&rn3qz@5VjMg}AO!ItLtRJS=4uIJgSXFt@;Ik#KV(*dw_*$B8q0xXVxp@_i@#0Cj7W#r^ak${hrV&xj z2=aUnxJ1jt&bqX5(zp=%p}ZliB)+*{wYHB7@mLyA)e$v;%00>U?l}RY<4w3P>fYF} zPhyvW4i>Jc2jMR+C{-MQM}+mm&jwst`!H+NRI!IgSjoKSb@EJIiK}xqZ936Gu7hu4 zEAgD3ewW{cSGl(6Gvj;!AQ-e^hWf%+tyuZs}bySbN$D&6-xBJ8Om|vU= zdW6Cf!y~TiiQ<5G`{=@|m%{}q8$O6q#e=LZkU@=36_4;{ zH9$}+6Dpo4_K0Ju1Q`Ed_SVN&A;Up~6M9AdA&gwnH!$CHM1Fd&dP0mmT}Ck`J#Q4l z@~*=&=dJxi=KA($WKI=UcUZQa_0}!BA1?iRiw2B}_s78bnj4^njfxNOn7gx9`v9pu zHuP&eCet(M8Q*Dw3^0CrLt!mGim@G753mVv%O9sRn!+of50*Z7DAVe()gDBfRu{c# z8x7x4aMlRx24{bFf+k?NZ5~IrK(H`a6Z_$q*Lxl>1LCctaYU8b+(yS^;=s=_?|6Ma zHNaeIW%8gho>4G>{4CVu)v;tVi8{D!QZi=tt(JG!N)*>$k9nbO(({rnb zT+w5g-MkDlmpFtPV&VWa!OSuT)oC58+{a#xuIH`5EAO=d;8}qwh0g)q>I6i_nMGrQ zoB6~;Hs~EzfN%Ek)T|F+^3^U|%4T)_Cw-8v*VCAF=n7akRZl*hO^d1Lv9fCZ!Lk)4YM5{dJwtiRH*qiQ7Om8;S0J+D|Fc;@avyWLi9OtfXqk7GzFv>xwNzkBS;W3%Z|vuc z_s5wKJMrnZeomC?go9m=6M4s3AW?)k9XgH3EYOcRd}GDoht&XnKDD;+_J(nz3%s+mh5BT~Yg!UTKll0`*1JvOP|;74>HuJqtm6?KMvT_F!bL=hEaaatUOl zwz*q;0G3!FJ0~&c^uA_{U*6ZOFGlk&4ah(X?7WHC8><`14!>;H%s5M}DkD#QP+8`z zrXa|%rLxSCHI$4{RX+S|fPM9~qQ3qt6U-Mp88ycQ_f35ajTQFv%pWToNA$RerfYuL znFwKxVTqku`a~@!yF1#10jbqO*1kCG>b$GOY<cIc;LR75%Gs(iuNCPgw7PWC%oV zhyqy_>pDHcx#|e8&}9+OBi6Rrer%?S-Pn5orY>(YYq4G&GqXnjFysTwO|%D1;OA*g z%i__B9z4w46;5$3ztXiY?+{_RidD*m}|3x7)}` zSZvS6`)l8>`DTsKmrqgvLX0t-w3|6yXoc(<)C-j@JL?V)V9Aq_i%oNm;U^ZHy8-eU zcF!MFD%n=Z!fFd(%-J3rgjFaJ6V>Q6KMx427U)+09$04#(nHtIU>o(8o6L6?Ljr;E zJ6jz%l|}qGM;WT$SVBH&C{#8K)$nSCgCL8cPQ~&9KgZK3TydBUnudA2&s;yk@OTe- zu7`rmG4?Rsh^<-&Gjt1!f_p+&$3)gwdNenSV~}xGIcqB+@ADv|1SR7x*;$C!Dbd`6qcq3 zyDf87ZX9IDmy?rbjhh|1AO$XVDTPHtqXe@PMX}SPH7koEy|{h?NF*Ej$0bkSY2sb& zRWeMljZeW&jFZBVFpmU?TRCOcbrG) z7B6BKV2w5;`MOK&hwmu#+;$|-1V2uBF6@9Q;vRW0HW4$tWVYX-bVj6{9m;T6hgI%? z?gTu4F41^|>gD7;0@u9ZMC)ArUF} zvb6<68w&EyC{=8NSm>hJb)au>sL;xo#T9izp+8Z^SuOcHB2d z+YCW`PR-*hJkUGgW2J`(f02LxRDlM&0RP5^q3Mrp%mpLp&%k_HNKv0DjYRP6;*uVb zXy|9k{S^HVjL_A1Yyt;_d9vFL`bV-hIYgM(me#kU!@1h&9_;dm3-l8xtu6uwVsWLYRgX#Rzp zo)e*TGkl*ii9YE2MJx?3SGrNe=g2CfP-_9Hf1GX~#1;|=8tv3tXtyu^eh=f&m?OX@ z06^4;&|v_GDolYv2gIZWyX=wl!{^{(p4g{+D8lx#_^?X=!{|$JiqIPl$S!~Xl8E>Lm8;^3Am+PN`rjArol~KpVUx-Kfbs@@W*$(O$J?UsfM@&r z0i_-UA)arPYl1M?8}=P$vN(oIXk>i>lB-#?nO+(`!a?sGqesI+ZR zD_Va{VfY|U>UVf}7?mGG^B_1nt%T`S&!V)`=mJ1+99P04&mG>)W&tjh?1a7TR+vG zS+`qv>Ce^uZr!T~)O7siEQN`J7=&egi0eg?H z!k+v$%BjMpa+v;Jr9_K)IC9P_ZtvMDrO+QPs;WK!&mGt#?F(J~1R;nr{{}o6*G`v> ze!rodWHWxOO{L#%Djnh7pv5g{5`QhwZ0qmvF?mZ#M7unB17QPkOK~$qxHKy;_N(kN z^|`H_5pyK&Xf08VSaW>grx!d~E(cFi57Fe(Qe4=kc!A6rCZ0}-&k(>#Pz@eFtn zEjs^n5Y4!&+_L8FDuZ9z_h+f?1+jD+?Gw~Ep+0QT)Cl(K5Y_#VSunyj_i?x+zbvY! zP?-?*JDJX#R43G}wfQ#{a+%e@YQ;i8r5Zk50jYZ9%SFZAgqT2|!VW}-u16@P?+|yO zPrndbJe;e>9S?S^y7O0^%Vu!75&uytR|3Phnr^Wekwh2Fs>^n2jYm^J_E{_{^a{Ub-p5C^mtX%**Rl)#N`fR`6k45 zKhJ+PvM~i)RsZN}h&!KFoW+2+6I^iC8MEw$YO+EanQ2uUS-J9NAV;^4y#5Z%S4;h> zOvzbniec-oj^&~6GOa-HuXL>SNopm50EK;bv3il*X*hX9ba~O zTr30|Syc_6AkWU2P`Y7PD~0#HM;s~~;jV+{v~IUM(x-vyYl$;Ii-D}kkBwcNsLkMS zLY#<86A0p-xR^6QIT1#+qk`05T~k-4RanocILn-OSSsko zg-3v)7w7h53Nbi9<>Z@!L_OGix3@P!(y6RmfbgrjH z;%84iwFEz})K?qeXGMMW0NZ+ANmO4H=fKp=Cg7_ikb++-M3TJ`aqj3OHuQMt={{Z zsdm<&q0LnS& zYM>auZ$4mIT!XvD35;RIZezG_K?>L-Qd>~KU{j&k(pt?5;TB{Uxxh^u+Nj~;$K~`z8?}y| zMaER~bLG?3HmcUFTK(7I(~Z~iSmuyJ0?>d}fc-)9wa}+o(78%_s;%0=&T0S+2ov%t zX{%}vWcXMB)%jpt8Ji7#fUW=s9obZigtP@LP|!X-`IXawDLqC3YfUND+I)N-Fy&oBF%cb^eDvfEc`lCM$UY%jN3frOW ztWc449xsvosp-$fCs=>Ba&i8J#wu&{>iPC6Q(|h`L5+-I-GnY=O?Norz)oV$p><0( z6HqxucEBRoNckPq6!E35G_hz7%-x54X|?!yf?ccW#|~;|;WX9jsHX90;i9Y^L%@^h zsD_DKifNr?bduAzuXFsm{T*>0f^X{4@|>xltIs@smFv&@1S%QTJ{+Zie z_^CiU7iGZHST~hvw%_iiG7>SlyPASa2t3rTw8h#uL)W#81V?))3%zG)Lopw=452&s zH3^~X-PIEyYlgqrTBToms1b2F2kSA_9*edu-|R57+EFon^MzmyqnZ!BKk zg2{$HOAP!GAKl}pZD4BB2cf*scZejEd*AAb?TNP$<}r5`N#5PP)OxHJt9rw_VHg@2 zGWEN@H2lCrHVPaX9YU}6QSXS$0;n{+At=NQbr0eW$yA>*bF!}ers71poT*lb1p;Mf zpH=BdUrd&*6w^}F~z%U41T&t+4 zKL#(CD*N-^YkD8vU@v-~`Url$zK@?+5d+kQ=%I}dKM0f9Us5d8uBskz69=eaK}BAF zZJVfVoTeN37a*qP#`#bf-Zl_Z%vF3qV)UK6rU?#r_U8|&i!ilP{S3lvr}~{dTkjF zr%U&%9UJ4+!AWCQT z_4$KpGW)%5{3Z=nn_7QoO>q>CXki0~;_1O^Yb>I*gRwUAy$1%XRzW;dchSZqD8^lR zNbP6MWwC=P>ybll8uG9jr3YYfvVb`cW5&#+46fuI+S6xS_zj#|b>;4itkx!_9t+Xgzt_y}W$V*U` zhSK8Yx)d};DFB(kv=-~kV4?$G1d9u=enx;#Yw;~wKT2KpFUqL;QyEo%EMw*$%fRcs zWlZy;jMoIq?70>w(k73=8rTs_+CmYC4b`l3*FR`togcA1%>K#hoiRpz$R=*V;W^Hv z6g;brg&kK}Mq?pN)fQ}Es*&uvzIUzfY3e%fl4sRkqWFng+Y2^ze?k2Kn3!7UFomQS z)q}#&!f~rSf*OEX)&uTOkAGG;qEnI(6$CsNw!a{N^BFd54p!Yv%}?8l0PSQxtcU>q z@)?bINv&(;k>Cqs!*xmA`x(9Sl3G8Q#RC%shcPI;O(ONJzguB`r-xGU%NL{!5a~MW z&W}0ptG3$#zs&*_8FrS~41+4O>nVIUPCou!KN_pCqg~s)_x(-n!gj6&FROcDmJbNT z1s=6Dg*{(2q0BiGF^melC>%)eL$v8;9LX)Fej@r{Zj! zQrHk@R4Qi9*q&IwzDh_1+lXw{74-cqGY1|HMAE&pC@{yD6#PqarPni3rCffqCRL!U z!LSGkewta6_|QyW;)6MA5{@pouAKdo?2X7(y9?qJ=x>b!NcrDh$0pF9DmoUZ)H>T5 zL4lK0mxDozg=k;rqvt69EdZ5GxKSJc0M{$a1nk5YU$vFIZ za`v9fq}XE%g2**loeuwG6Q-z1maU}~e%&bLrv#afPsSbtegy-Vrkn_yKQj>hH%JxXmn^q;phTtbs>~z{z&LK2eI%_Fl@1YHbn=aweD?x!;r}Gx|6YAXg69JG zj4znzankk%+rjNTVOI;wH+cjb*$$*Y0dag_J?cFb7o|+VCVXsq;Y}4SkE< zJu`_=+Z9sE)NS~7#05dV3a)HKi;?-7o=t#p>uP9h8e znl9jX_BR)(3_cp3vfoyrj=KOCx2<$%0kYXjX>Y4Z&`vF^SRO0HxHu+(&$qTsi>2HL zTE;wJ2lfH>Mb~4RN2juMY!&R3dpBcaT(&ZSZH%9?=c(_qXTF!&4HyGMRW+_UDf^1F zP*n|HsB%@+#D!{GYxz>Uc3=UGT&OlOA9QL76w>gzL>FG_9$H;LI=WD`+6~v=&_d(Y zBj+O3|Eb4(-i-dky4B}9y-~ONf36$986=7$4H>Fkhe=?SesxhzWp^x686I!yVzswv zjMk7Q9x8QFIFQQIY7ieyUDDz24=!B1YnQ00R(}WnN!FT zwMih0&{~^Yq=QKJK@hMLUS6VluzA|x=d^0-G!BaAT>?U29i=Z-3(Vg+wdRGw`9x4T z=a;H4RCknQ4;T!lQ(*I`gbO%622N_TYNLoF3f9fEPe!ypeM+gz1 zLgm9i!1-m1qrK^aa0CSn3#7h9YLIWVA1zYTFg4qfmTGke*mckYY=>na?l~LrkJo?4Yz!{wJr<{h4Z!s(fTDy!tUQ)66Dkc`h2!h9Nfv$vF*T2!lW58+b%1#q z129WpuhyYsYt^;^`r*$IfKqPHP}wbp`FU3du&m!YC(*9exK|)eK&>>oG@Yecv_@rS zx6o!-t;W&!Yd9ayu@*Cl+27-|4>G-&)hIY1!A_Gwv(_28!be+muDjPE*Sv#FzppJ0X(+{gM`zZd_9v;s zdUYg_q6}wjK1Qw80A*s$EL*P*NXqa5FIDTSqsL3%WtysO{SxpD{k4Yp+5Rr2ZBYB0 zPXdXFRd+~$?jC~m!p#kQD3p!7+eU9RDjHddvby(E zXx0B??mNJvsJi|$vn|d;H{!&&IhkI{(?}f4`W#Bf^PEVVn6vx^1mN&xy2~ow=OwG0_4(wFr-cUDk+b{# znu3W|yzLi4zF#;U0dsTAYE|{kVr?^5{R?Leq<7XamUXZKvyQRMRJCi%Ls$YBus{N< zkBJBmz`Ao8Qs;(moGQoo{M?|fU8$*h86KDhhS5Tg(`ET=K?t&;0E&1k>?wHfhzG_u zyqCOIe{Yge-TbNc-h{RMz1+1_-&(2sHhaYKY+KHe9}2c6mKDS*tb}N_R#qC z*uiwAn4F1!h#8QbXa_Fy_NYKl^9|0X2KM64bFgf7rQnBvsu8n$lAWT?I~Csj+k*P( z=lw-%o`t7ydIU z%>VWO3o6Vy{qItNK!p%b&D~DdgQR$GriN1UR}69G2j}ny86x8??Y+NY2m(Vydus1< zb{EArd^uN$Tg^0KJ^#pm&lY13I>Qa@&A()e(kZrolPx$wXx-1St(>X^{(9;`@K=NV zL!<$j80u`yAN>Jf=lbuxN%6nIFU|T{Tn_*G^8@g&`6#1-zOwhUU+g{XlYbBY$_tyA zCZ(^ppHzZ>{RD`sFvku6Tr1@qar)Mq0iU1y%wKu}M3tBP-++J3)j?kY*Q)>GaIFvs ztmm-XJplj8hy0(xzdl$YcOFw8tni<}zk1S&e?JSdcmHPsVb=ElF9gEPZ~r5KKv&N@ zN2=?&4>UWIwA$CheU8PEumB`!2%IPdcv5S3lhP0^Y+;WC1dZ^U%+h4CucxQ3I6HbS zUvM@v)&5-tfe*eNz;0A}vzM^mv-*m2uo*rDQMa7oj)TG6FOPQwZAoa#)ApA08H4pR zw)etnXa9`8yo+O_Pdx|j!W`sH93D=^Wz#Hko{_2x^XANuK8H0;XrnlCM*bLxmfwpGiEP6W*GvE#^BI^kP?+F+6Va5wA1yP+J2PnyPD zs4``Vxlk<-B89fJ(>bjdus|f{kn>O8rqmJ(z=d`h?9|6s8fI8JJ%)p*a$3m!spETCCW=0Gq5=-A{~$oS|*&2)$@QAR7kvD63Rb!xZcvU`nB< zf~0F0=iNSLmO>hkKn-d9P)BX@3zp8|^F^iEtC8LJrkSdQNL_JbOo&up$0Mm~)l(a@ zqlfh8OR>cXku3ia6p2N1v-M^+)&qxh%sgyGH7JsLlfglM1Inl$b z3uahi^s_kZ12s#}Us;K~Q&TrI+@Ar9TZtYpG$36%H{HMzQ&vrCYA!i!QcI3fa&>94 zc-BZ+U)w`zXLV@^`=jhpeKj)4J-}JtA?$ZS$l$+d1XLtiCJ9IpWPJ?ky|jg zXE-Ij|NKJ~eRg~ZS?Wj(>;MNkvFsK1(FUQ+6w_SF6nA_{C9k)6UYJT*ue9mM>V2gR zt4M7u!H`6GecHs(y%;>1iX?h5$XJrnhS`~t#{B7ns zJ^;0ffkv`s8>J3zlSCsE+EhUe3u1W_cVpWy!;FoR+enSF>r2c#H#MBlUV9l5xffGykOT1iH_os7}%>@J-%@1Q?ET+hxLTo|oHBc>n`N zJKJR#C=1>_377bic7qJ1bL&#mW9=B2Vwp7lX)5j_eej>vbmIO0R!s-r`)}2>gYK`X z%M(}@CuGrvCnP8G?KJ(UzAAo&OehQie8QJvJI|=zQj8#$0w|B=LjUARDHrvQy(eD#9mM3r>9MFeQaE$3L|Bph>pdtQ15 zI)2fT?;La`O^VBjIaEuC_Twm%$mjv{dtf#rY5K6=5EM38VgX{VG^sA8Ajd!t947hE z@HELDIP<8;Pgf9ytG;!Vrl(2W@u5o6I8v!PL}ClDAC;s_5{((czt(~w(m>QB43&}s z55H;PZ?nMe!Z)eqP^mYf+~yADI>FCFp=xxZ+I0ZBjt1qxf9a(IQF`s0)L@v@*Z5rs z9E3g?DmA2?!}tQ<0?ro9FBKjP!_dOHT&)Gxzh82x&Ty$)=!ZtHzEqx~0vm&^H2}T7 z7U2kSTYDhO=D?;V`hK`%$H;#k&UGI5J8-=lF+|c! zSX7yPapo7KPW)LzEa;e7#t_tyMm}?-)G!jLc8WHAE8yi_oK4sPoV~tAFu#z@3Ha{~ z{Eq|<^+ABWxfGTz^*~;*A?ecNI2h7%<0HotlLGK^(GFmcf|ib^^N-+uL23;}Y5dd+ z5{-XBN(f=2@sy7SLv~Z@lb<a^z>`2-}MWjM5l? z+$hNgvH4+z>k}ys>i$9OdlcgMKU`-)_x*Vvn4o^J0Uz5xz z>Dm9fG?B^jg*6dVICO#(1nXPL$vAkIu9|ES5mXD@F{i%{USaQvLnw~W+FwSBF?(}l zM!s+^%tG}uq>F~drT=HZ$U`aeEh(6LVwHSysY?YkG65Pnn!bHY`c#~vef04=QX|kbX^B)@EIds`3j#aPig{8DvtG^mG!W+m??Qmgp|T~COh0{!{Anvb z3xo&J4CyKC!#dBATIRe^nux5wxpSm(;EKrXO1x!K51#ZC&XfR;@qf|(rLaK!*ZWWC z|8QEFEq(M~AH%i95{s{9v^QjCCDDK-(f~&HqInXt8iM2>fX1^vDyMPrN75^QL}S)R zWKsKAilLhyNE=+0A#s@Ty}B4$U9`svD$reiSb)VcpM)IgA)wE;$ibS~mBs0(fd}^b zs{5dae6B&|Ofg_l|EUN}wtRBDB(2Nmn4ztc~%5HTT{Dj4Os z%0d$GM~3p4FmJ3pgFe=z6%{X;6ib^ro%F5b%*b|u82~z=Go4OaO`1Pn?q{HDFDh27 zT*F$}F98Tu&sn2A?LL>_cJ?y8-c}B$!Aqr=fvA3LsnpxHX|7rQmqES9a~QT;CRK@k z(VN1`>$8NFk>@f*1`74c_w@EMAh1uMb<4PdvSIrbCtWDHXr`34*L~^MGR)o1^!Rdc zUq_m~TzVKPkT0q8tu<-TTB!qdUcnWW$5%*?;)#{Y##kE!SoPpJWG#dz32r&)@LN_( z_DadgO&EC}o`62QQu>0c8Sqi-6cKj+BIBC}jr1DT%#(INRR5MIeQ4rC+vgqHCmyLv z%!{gSU<&r4spvyPbi75qwVTd*z_Jr4YK^3&XLL}}dl_)|S|$Zh-!&2gVOqaNYKoy< zU&A$oCTp=Mbfoob`EVo}kdh40$`m-l$9yeSL+5373o-9sV^Qx&Z+{Kib@Z(J8bp9= zRz%LiW--u|53Q4?qiiIpo8lcbZoTxdaDg_hmlD7{(Nqv0>0(x0Yn;LOm^JWf}ifZpED6Sz_8V+4exFM`mgSVIG0y*|l7 zIkAQwJV{vy9fzJDJY^}IT(&@gXC(p4esD676FXiDr1ULNs4IDuqP@9WK>Yr+aSLzn z$QDh@Nxn5NjgB6#6+z>_k=_@2&Pi`8Q{Ao7JhAA0Pv~0P_`b*;mQ>krhTYK2npf7> zVVf~CSM9NP`EZ%Gk73@peocKGxWMlPK$_~jWn>F%*b(YCa6_YWRu(7X6r}%S=r7qv%xNRRLw*#tS@wVM>QU1NT{(1u3R*30BiWOS$ zofHc!42FEAC%|P-kT9kAJ18tqle){V0)DE$dz4=w1fvE@!4RfwGb*iM zf4slJ0+g8Ev|B51akuoGP_l`0ZqNl3HtrM|Gj1FeK{bn@JM^Lw*~CR%{(gHaiiv0vMPC<5LB=)D;$Si> zvk~BVhsriOUnE^Ye%@n0NHy(0Z?LKxM73n1$vy!7Nj_9Gcbvl?;jt`9t64phO%Lsn zhGM3FxErk?1AdiiIW-qmKkjaioV}YS#b<)i^lbPV0}p9zl@@Amai5cYsT#G+emwR4?^)P{9GI9uBmx9+2K; z$*cn@@8mWBD?C=$lC!Cu6UWgj4@!@V_Y|`JD18P>efgu*uo|P(PZgBX&FmbEiHBul z$HM8g@`N;qUO6P$K%b(0nGSmYkn}Wu-#H{b$4{=qXxd&Wj%NHMJ%cQ_;pE&WMbXNW zQuKqAZ22>%q>gm>mz1QOpCw-oFC}T)sNcg&fu;={+J4fY-aQblI+4ByJ4{Ny10Uz8 z!;(LcxU|GxeyYOvok$u5&g(`ghoxxC`E|i?s_vGv@=i2_^s9%Z0Ml5!A3+0#z>PWg zu;gnww=V{+|J`WCVaW{$>!QO_jQ^Uo!R#JNMr$R5j^M+5Ov(``HlwKR5oszuQ_&HA zy6-y5KT}mC;I4tlpL>_3V81xt73QFrbyVu;fAKQ*m5kKeuF>hE(j&qFs#VMv-*&~) zi=gv{VyP)UbppA6>i__j5~-7TN1=Wt(v#-N42P@+h~^UE$ly$#@VHnZw!?*=kQ+Xwk&6!@S%4LKt{Pcwg!Z1}4I!Ly@28V!O|Uerp%MSpORpth#DI58S`iz==J&q zmKQ($12wfg=9MQWHUCxeHL;o5gj0-X82}SC_n&$rN@t#?<&u=<-$G+Bs5mXC*JY`tzXoK6^BuJ%C0~#lS@St` z6}pQh>ofpTI;sVFW?9f*w^Zh?rngT^YIQa@iz;ZnSugm9#2!Sw&qx7al;_Vt@k2U( zkR1~3v9mBxccw#UrIbIIhY>a%?Tpipx}1|j1Aa%cSdL4!-RC}XH3<7wABcKqe~eDI zZ+RI91)P^;^D;)b?`Xj#Y$`gOm;B63wtcUcV8pWS&}v}Lu~&RL8ngy9tU> z?F$kM9@v$W4?BgErd^N{L9X3@M6T~INVPb*_EwOq@K4DVb5VK$+*m|uXQUL`cTuVj zys#g99$?OJFLUnEx}Onh7rTU<&Q1*Meb}o~u#ST>Wl{fzv+!*8qTC+2b z-2VWL$#zNdvus-x&9b6V#3g88zf#I2Db}*~ShUJS*x*Z29o&2Wl2n`1_ooW_j)MH@ zei>f>O0@AV z^p{0+u37<@Se)H|q!FN@AlFVDre^5JA$qoZKXsxO(acUkHvPadgD^+#i9k8(7#A7| zLu?V^)yuc5e(D>%IEeEGQu6$4472&EleAky)k!$1+Zjez1-X;&=A0__9fJC%cB{WA zH#C2<4vBXr(R@*^WqKnQk7<`E$8o|=(ID=Vgs$2EVhk9-=2>QSFZ??{U`Gi(sEt9c zZQ4G^i6e$r400@wNts5eOKXM0ah%-kPN!4K&`}mjGRn6R0bk1`$B5emQZt`)(vD6s zH(>%9V3xlY4L&%?zv#@4l^+9xkGIIOIN@-1YRotkNRI80g-cM^n5Tqso&r~gW&*Yk zD`%RVw5eN+75Zz5U4FpknXzovQu%8U( z7Sx4b+qi}e3u+h!zA&-?DLoX~A9WQu^tuWw>MClN6G}m~2D2c;eHX$|TXPp``)qRr zudQT25x4SWgv##;TCZfP7cMuc+_mpSHS68~QrEt(sOwLj`m2jyL(9?{_Tm#MZ%jutciF}KU&^sN61yBEdD8Gq^c`S9ehSH;!qD7{hFSo7+2 z+|r%p?wSYylHBvDl6EVV7H(`DZcrDmqmg$~qrsS&cT&}W(m7_tCVzD^2tLL=Xh3Y& zP!pV+RT{Xs`R#2d{2jNmDv2;2YGO#-DB- zN=IYkU#G@3)!GMXFnK zxhZ62l9{0hB^4PMicm?CSplf;fZWzIfjKEmi2#Ppk*;td z9Mh`lcW(tF%~3Ze6(!%z44FbtPmC&_cs0%WOl|HAG|i*OOlqg!!Hc_2oD%XNf>1 z*L#N2#s=~jn5Y^wlpn$6m4W#)|cWMjDz zZdxhNcUUNW+F0I-+6qLwOjDZ31JQ-EP2@(nRB0;5>iZkusT#S(rdv}v4i=k0P1p0r zp5mdl!{Oy%v1$3*Q7M4u%!Rh`G~!5tDDRX0VT?zMdYU3~;-0H51Uoey5tuA|g9ng- zo#ARt@T1&Jj<#UrY7qWt*-Wki&NVZIAGT)h#E69BKoY>iS6In=OWa&<&$+*3D6bU| z8NB3=tmNhOF*xJzM)#V@ZecbKOYyzNQ0han!|65qRT>G;T$lCO${3pWkQ@%XpKdR~ z@xR^~{m315znu?ZevhW}?1Es{@t2*{JT%=OS%&zhiO}$gmNb{$pnN11*n=F@d{D2d z*)3$|U%1I06h=`k_{WN-h2Pgh%8V8=%MO&$LY@UJJGdo2Nl(iAZbn$Svw9#)x)4Y^ zUVq!4cDIxR5v7;rj{a9V(#7G~-)9`-j{y165sZ zFSmet_xH?hf-gCsZ9J1O10L(jB@8z85o90G$PNqZh@g-Nh?f2lZEM5qnikvjJ)&96T9E533uzj~@A)sPi_ z;}3kgGj*SCT)9v8xph=FJxmd&!;pAAu`M-dEw2|!=~8RV*-~oQM(%{mn{DK-xEyRF zF98$a#Hg}aKCe!ulXkV0UlI@gKyBN}Ln2DEg1IXyi)%JF^>N_>n>-RRtLL(4S39|b zW|I%2q(`A$b89^JYNhN)(Hw$sw?7gZHYxLWl}yN_z{h0fESdSWoxlAsMeT}Xe3pFO ztW|ONFQyq_39n~8lY*`5yb4Wj+E`89_{6BEN0hAQIE>qvpaA`U9dJ-tDtHJ zj1{Zj>nEMQ%x?yVEBH?RV_}M0-a!rxyqOiu(|<4zn#)=6b&}h&Sm+?iT9*a{bzzp9 z`bQN;`)PBZnJdP1l-b%!9eK}Y_?vWx9HEn(6gV@pqPn*-sbwd*J;pb!lgylg&vxQ( znmhA1dvuoDVX7c!Ryf6cuhgLfj|YT%e(NkZHE^4%PmX%Nj^OaL?Dk_LE!%!%t=D875`Lz)Iu=1Ye;I3`52i%!OBZMz1B6&O!Ps!I9lA}AeaTvYYXH*C^?JF~^dlpkfi~Gvm@f#sQ z4vOwCo9OV9qa;e`C#T}>fJ3lS^Sj%hg57>aKbf5n@(dujI}I%MIlFYuS@<2sLyrx> zGV(SR48Sroi5d=s+?Yh$2Fh_F(hX%DJm>i8Y4i~%4#S_7Kf%TM90W`!YW$o$m31d( zw1f6NC$GXwQwGUdxG2xd@xm^T`aJX;^YjROVfaLwesNI7U^&J#EkaQPaz-9u7T&K1 z%YBh;E0EwR(T7sL5dvv)n*6bNV=HC6lpJfmp=IDH5*I}Uo?yv$PR-`YcTR03A-Dtb z5D$@kwL%Clc_rC}ZUu|(6dTLG1K%^G+&O|F3`~${!pq5>g#Dh^hRQD)kOb)J2ss@q z)u53wx6T_iLvHSvWk$+OZEmE9bh(dk#Pe#p93U9;L}-KKgPKDrdO?2NnC${<+ea;v z=>x7Ea1E3q11#Tlk9X zDo7MTHp#OEZnlZ4RhSLF}{X6X4kypUUe8Ta7L+@Z%k=z;VVv0p502{g)z zxCg5iT+aeC#=a^yHGjClSN-8It$S5w(doauDyt#v)+d7c*?AXiMLp2HnzS&Y#6j)H z%2CFHM!0|Vui8-&CoiI@W1+k4q!nZ38kVEGpj*KGqGT+TZx~G$HrfyMbJ2Hxq>Pih zfH{YZ0}%()v~lub5Pk4#@@5dO=Ie3?qzl$$j@T9)8BwnHJFyaAs<3DQzyxr@a)ky z<*tyrzA#!Zy#9D-1HQy1V}aRmHXLhCtk~2i34g6W8-B;f$LEf}PYnKATK*S1uAYCE zv7Z9j9Bf~E#Ydg^Epzf?Y_k_Vdk>1;&u>BRd5i|BwIt}(XFcDrpz^ndUYA!2){dh0>sfeZ#4oI|Q3JffLsc;G>_oXRvHPdHC z6-Mf!XKFYod8*tTPe)AUPqU`V2_|sc5&h{8Q{~2iUhdilK2eX7@Kgi9@xCnw26-PG zU=NBx&3~D~J^kO79~Q+ac9zUBl-5j#9=eoDr^{WIc$j^hq&nT zcjaUhEop9alJAFuoa8?T3p$d=9_||M897H*1(pZby{@Z+wq?tmd74~y0A8EqW%`p) zPZ@#NSt?A&`?8UF9cG04!MwiS+}tyGE*RX{37yWF(9I}>dUEE0QG`yO)AP|VincE_=n5} z20OuGh=w)!^weUk!f^9?V==VGPM(w{c#M63KV`1yiWHn5VeRNj3vKtDwBaK;(Z+nf zX4%wTzX9}RUT_;MFXoTsK+})wjM%oyAHyifwyieE9^v&f$e}a#mPz`ZZJ8@p_I{LZ z@5*wAW}YntQl;)v8BEQCZGmL@1jdjpa)ZPF!rtIx%1|M~ycou8Z@@MTZaa(` z|ATEo2-!PHfu7eshg^g@Gk&RD3zua}7hKV@dkQ14{Q1)%FmPQ;jb%sn0=F|?kc%H{u;E37x{3NoM61?fO?d^ zs$M8Px=Oa|dt)Cp7Ri+m_Wp(3NIZU;ntmZqV_pWq+ClS?FJRZ&zJtP7%T*lT?ubw0 zS~@_ZkmwFsfOb%a)!45aXvJ!|hj@6N$NZ%{R}eFI(W0;91FrXW@sz7bM=@ksY{=x; zu!n`$+zzPY^LKgP^~k9vR&~}!w7h+XCuV~@La20ua3g^(ZC#Couo_{S#ULTII`q#oXPrIA0#k-g8meFKzjICTdh5f2229 zn*uh=7WM~Pji9=lEPGxTl3Zt%DFro0VhHa7S7$@1FnG6`*QX?rX z8#UBoRqsHmG9<++v|uk(>GNCU2=U#UwuJh3^Y2Y-x5??^TL3pQ*NA7= zJYx{6)BUug9ewpLc@nMZ0TG#W;y070*LG;z5CJ9M%1<*1QN{ww2Yn9>dnl=n#_3<} zz)xY7r}|FWAwm`*^*W`mMOOB1yXDn53iK@md%r@+gBwoW3+0~T{7_2yr7K{h9|dv^ zmMR8XPf0Tx;t%XkTAHDf>^RqhlG;2MM){qF2hb};@(S_XN0dMAZWZeI1GFHKQg^jR z-qRoC>cWq-<_CGA@B%g415I`~GlJrgsmGTe&G zGB6=Q*5P)yamyG23555-s;G#5teeFI&Y)`SjaBaH5^tMbxcra%8#vD z#gqM`>?a7DDEAP)&nDV`NM@1I1!20M^)UDjU zIuZTtIi8I_%eRCefUz1{17iS~ZxHsqY5NiRMsBNtM;R|I(66 z)hU*%RO#>aLe=7&p>A;ZS*BvDzfF$d38Ih?${QF`jBVOS=A7UjRj|x-C;^jwM8Yw- zwQ1Y82IO^3o!YbiJGr+4Y3(r#%;ULu4AM60iyZ(-WR}~ASYH=|E5Og{v4ISNO}zqn zZ~_~r!X4mvSrSk0pvO+g4I|#!VPz#nfM#JHu{R!%4ZsHjMEwq$&q|)!;rZ$W*kA0d z(u8jBgnBOjf@M?qlH^lzV$_#{HxOO(L4|or3p^6l+V(GLz$tkSie5hjS^p(rK7L$U3+^)0q-WhJS3hb7aQfw@`(c`7CW#0ZE zMvcI|*Gpx1Ho|uT_f8i_!DX-;UDEEQlwr5hjh-u$8El8{8)o-9@`&ZI9lT>KCV_={ z=|eIyOMizua;-|q+U}G=A9{(TOIXcEQ{zi=l5w#Bp`Q0}N*MeABUo?YRne8EU;2A8 zMOGqH*`+@uldCe4iCK>_V)kT%8bv7^>vDUtPAZ=25-jc|6AHCywWS2%I>jcmD>(?2DSw%=vutB9+dIE}8#(WcSpVKurP7%b7qpX!_F z<*RZqxaaMwe?yj9-b`?ud(;F?zLk6PJZ<2 zYCOPQbFRr<;Av}Mes0%g2i>_Q`1avF0XsZC&m%FLy?&B2Qr^DqhX>z&`^F4frh8+#i9iM@Dz zO?0yExE!N4L1F7nK0%8%*A1niH)R=9v6=TZ-HYjg{{87xe5jmK7jJS(S#NPlCEk)* zz{vPx_5WHr)iGnY&+E__EWcuJtU32R&=JmI()}D(pjE)6Rr2xr3Omwa{6tUQmi;YW z0u8$j>u@*9zb(5h`Tq*xv+vYxxlV&I>ejz$^G^of5NgLZ{Z)KdegK0246QRpoWSJX z!H#z{m7J&_ODFDNm)eyg?#gw_rS$`VN@SNB0gKVD_}2Q)OA;g89lz7t&}?qtod?j3 zIK)!q{UrI`+Y2U{V4f(8em~R;v{X0L>yfAa4DNC9X#+*K2#`fx?#T_zjE#2Uoyds} zT5wPHvwYzRQ|p0mmfyq9zAK*Yrp!l7h^4qEJO6$(a~@LsV+X2UKRvHa?Vk(->7$tj zW#q!6$cI)Y+^QHxm}U&Y3ZY9_bPV2o8P9(2pj)C+J<#jWhqF0$rko-uZvXr%;c7!Z z;=SZv85Bwr1jQnabo=R_Z=cqp3AQgkyaT1E8q6#P=ChaeMqQ|8g7OcBOts*Nj~Ih| zck|Fcz{4`&W6?-a35ClgAc@iE^>@n0)yz^d-L1x>@#CVx*3o1G-05~~wlD!lPZ*SH z;G+zKQnj4&f3)h;A%hYCsvp*wr~F*>kLFXv{mgSjqk$%Qj*wcngM%e)^G>S?P~+;X zD~V$6vFQHM@)jydoMOESb^9f=$_V+jQE}IqbR-JrVNdtajTGFeJFp%-VuT|MD__HXJE)?c(*n5^GvQX-&CoI$I6z5JCAorc_y z{XMnKN+W^u{;7Y5_h|>%9iQQ}-o1Z^`Oj!Q)0qFvgUo+c@3%Syb6BGfTrn${|D5)m z0dh0uFZ2Zy{j}bqR>vPVe3c=bt1tLaYG(k`z2>LX_J;}$Qhs7pFM`+Sbqk~K{S+rJ zR_X(UvfGGe@>8l(H1=4QpS7}-Y*mstRW4<3#bUw>EMNt$=ml1y0Qj}UsO%Oq|sU)Z%%&Zp9k5>yQxb>h` zRD7jTB-s~D3(fX@9ta6{o)4jUJ>bvqi9h zxf@c-yciT~{2~Zvfd$!!1&opuD{sz93)h%y=+LXoy0eOkh6O!F2-jp2qfkaFIHkx+Eo>c!%StbnOma+66?7(M#Btsk*ab#-Mk^>G=KerqQX5wl=l?+SQycf7 z=m_OCSO!LP1v1izdc`JM8=<^`8$sO~J3ZYal_`QyOj&2^!Y~;HU*qi*91Z?|l~PmV zBPkEX_YmXlUku#b^eWt32ZQx=Z50lt?wg=QTTXr%!+oJ@ zC-8|p4)!+*UCJjIVv*aZjo`}gcnr0>{HNmgz5)~FcSA*0VFs}7^CNS3Dq}Jr4 zV&En%YbYuvWJV2){?fQ zTu&pC&PFrw7!0$frjp1w+`SJ%fD0v?i`U!QEriiUxS4XKU9*m;Y_fCeppd;E3M#UP-G5NM?3!Z2%q?jZK z;Ua3Aq|~tR+4(Q10w4!XPf`L+m?4N4%Brb^(icg*L;p%rs^cWLGzsg>A(E24ui+q+ z&1%on$%>23hw*il#9EjS-lI@&21LZydMAW$`GoN06Jmc|rDn&0<#9ok-q7~+Bk`_x zM)+2m5&Z2+Gonx%9osE-uBWX}B~t?<=&gESYwv_uR!`}SC4Rs+ZNkG%IAgtk3V@({ zNT`otH?NOH%{v!5*5@yMP#^n@in*{~D|wig+!)Ti{m$1{s<5@Kff8En_r1TL-8Eys zFJ-lTTc$1}Uo+C+24D%SaSgOJu7SdKnd=&WleW{D1_}plX{fN6sw0%t5WSqzP>D8n zgr<(=<7lX7Q$uhYKEjDcN}}*B1vOT}bQOh7y8FdYv&Krz)Pd?TU8~Y8!w)sJr zh5g|r{>mm?5Zz_>bmCKdQ~a@Sm8M>FYN}MhX8-Iz8Oi-$fFN*cS#^b)X%~l^DiP+F z(8cpO3Nc$9)(dQO;}O9)nj)I<@6f&({|>Wo!FMR5tY-KQBM)0mbfFohNJnx$q{NHg z?4hhlt)i&ULyE=v%^v1ygIX_xJYiK?V$OWr;%VP?QGA6{QRO95anes2wZq_2<_s_a zi215UVjp`c0$sWfbwP#dL>BU-t(Ox%`sAcX znBX`yp@m`=i+`Yn?E~btrFg1hZMn@LLU|u7dU_cCUaHp-`jytPh5*e(<#qoy^7r*ZPqxH1VL452sniOnc-MsU zoW3oU=pZfn8pn>7~IFsv+o5i1!Gs6yzU5^3hZM6|%qU zVBY$L&7XaPcD9Dn1T3vKd@1VpX~TFbZSicN=cP7ET|qo&rseU|Ytn(XN{3Je3yC2M z_5%V-X3l=?rR6)_k@UpK9uo697~W2Kh+XqW_K5a;-%fdkHCX^$-t1TH&8fwTHi0zj zF{P9h$!M=chw~a)XxIV49mwirzxN_Xj%hF}=))fB^SIItujM_C`G>sgk1Oqsb1m=>3?BJm7)4i;94sYo#`3mN zc7819#h~(o%V7SUL~#DRCzO!x&v+fly%|&f()G(%J1EiWN>zh2T}D5I#BA`vZ2sm8 z5_&5fg-YqIG&O(xxv%=+KI+|DIm3EX6k(1C^i>^fh4I2EWfcyTX}t9rzwy2*_ZbH; zmJWU6H6Z^@x56r_OI5?PZs|5kG*ihV&A?~1uNux@U=Lyp3|q;MBk54^Q%X&5j~{tT z*^TpFM;~PgE^GTJ9$eDe(dck+${l_8Yd9}{LDZRoFLpiIjF z%G>zsy8+60{PoyC{@1>N(A4(P)q%=f+{}EM-*i2rG!=h>zfOzSoizLzWh5RQeFhtm zef0dZN~G`sO@3B+Sm>8iR9IbbQt`8jFPx-m&IO(Jo&tu27iT z7!VwqCI=ajO>k;`Ke7(S76iph?nQ@Z4_3^yX($d?QU*i4njD?I2{|jK3|6X$7sZ@i zHY3t37H&hJ1${eMaUu;|$zY|v`2!oO^rgJPibVC&K#ZL<>+2g5tr%S2LNBC2T{=ZG z(-c{`eY245cQHTtCo`)WaFdVyA{C@5IoRP07@|1k0s*VDz;Zd+R1q-FHXLli0&Fj! ztRc#Blu8+@L`U&b_|&Q`&3+^Zc_o2*ZG#Vo50nHHeQl^BClm;+W6f--M=@V-F;>tQ z2d1&UEY?XczGWrn*=t!aj9_>JL|5 z6Yq&E6^!Hy&-#T%`+NiCPjm6MZBdmAvpQngg2di8A|vDt3LXI>&!XfJ%5{7fEm%h# zseCSMrSl_|3DV(0qkVn!gFy)PSybAfZ%g_nU3o#u{MhmrMP|I9%)rtRxw>m41-+#B znkRhB77@ye7%WlWQA$r1qMC0H4K<@{EH!D?7b7s{)>UfetY2sl{K)m9az|T@;4@sm zyBx?DBZHdH(wAZ}60Tf}q=BQA5X*!&cl)Sw-=wjlfdjt;I_dZl>`v=-_h-vdNcMsf zv**ZYDCU*Aj%*PD9cjxeN|NDyqYnvllN(Ud zs^~;I8xas{%@+k|LI(Bcc{J)(Wx80rlZ3I#HJBo9j8%@q6Y1x1nB$XZ&};Y%yGUJS z2={#On$nZ4BKdx9xY&(Xmf`u@@yc{u+Dw3{W0z;}1ZAfnX1OVkPB2H7tYMQ{Q07Ev zQYx*Tr~sLo2X3+5860L?FdTQbQETZ5enWZ3Am(D}NEPALJ!xq(injMN(^FHG-f+A# zsucWq7W{vvf`h-u;=k0_N%naUnW)Lzie20$(uj?AiHeUT8)?wnN+kSWj1T}B0}hAM z2X8CCSkB$z`VIv*3zu7}rP^QEPGZ|DrikP9Gc3ql_DDkppMV7%>%tY>V4dd4h4`Pa z7%HJwRwGP`_pBP?ZG%I7BzCn_<PP4wIp0ihN&Sf+F;n<=RV^`PbTh$9bIK2S=u-DKLW7KUT ze&y~WfIw%K6Iy7og!V&f7R^6KRL`32WAUo)mIHH2#jBcslc-)@;bvADl+qEJ?klA! z$q2H4->ru5Qf4X}km`68$izOXCEab(J8VIR$7AxCc!Rn>DXR)6VT^vpv?_isH^$H! z-Qzgxm|pi7hG|i5&+uf`H$4`R=wq;AFvdbXsxU@1j*7*`#Af6x7U*F{vDUFx{PL%z znTj$VR5ha)s<|x+`mm`WsXiU}ZyOe*7*V^A-@eFCD7HZvq)b=E7t_@7;8Fa9>y9CY z4F=(OsLMD8L7L_5ned0UTzVU4O=}gfG-Q&u27mZ7p%PaO_{BK zX+S&cMFx5-vz6usSTBHWq0<~H^h{Na{(2N6dFPs~O@=@RTYzND*5U4QDHNG0=yX0&oewk+(Mlh+1Wt{S_m=ft#35&)@~5hGObbpIS`gU~5^8Mautv?9(K zMz%f4D)K49(*Fwu=ZFr9Y3J-kF{`b{5JOdbNv31LXI2%4z&nEqe+&%6299(gdp!9cJqfge#j}52d*oUMXa_w$s-()-a=1h}v?S5|jomYFTAk z@GB~M80H6N+n%Jquh}2qP!IcEk)xV!(jFjJjfk&~_v|oz;{wlEZ+T4=3+g9VEyyAR zA&Z2iVZjhqTto}1SN7(89u(RDa!ZrFf?DDOQ3%I-O>7&WBb8UF$zFh%YqFQtZ@v;~ zfiGhweBvnSjcmkh@UPs|XO@7@%z}{8tS5l8)LLcV3|&#%-U}ij)BJ%6V~{$1}vXxSUimsoTs#+m6_kdwv?wJ+d2go!$Yv~ zD&=`ZDJ)#2T*R%cFW@V1`yfvYsY`o)P==#m#08(ph@$DA_KTyS)k;Tk$3a@@7cbGg z8z=pv>_-%c8-3jZ0gP@Q9*qu|)e~DOXSMR2a277!O0a18@;zuR)3;HS2WxRhO7UP9 z4v^i|zA~lUjjKuTH9HqCK`7x|=pM2R8%zISyA=KmsYn92YGaJ?_ z@y?4Os(udX-IRlT=ho28waRGWERFnHImi5U`>w+`!gazr zfkWyhrD5oSrFy37{mb!#?StO>l(IL$4l$dKY=Y7ItxYVcO)s+ND{}M$fe^mh&du8< z@}>?%lnmN*(U^S29>5xo_cl!L<#0)^!*I8vZI%v-O`TW2}m zYi(9yL$9(y+Azq&UsbgJ^k${4@r(h1goS&2Bj~%$ip}!fW-a}1aWKG#d6xGZo0S!o z88g8f@2;igTW}`U(X)Gt(tv6E1CosZKeN&bc|S6Ae6yO=_2ww*vg)+i{EZfLn7$R~ zC*KB9`sLG3h2Kl{&c_Oiz2Fp?68()p1ROT1o5e$|3EsS-RdB>2};mTa#{lzoJ546NH#z!*oXdJ?_#H1cX{0?K| z{Rfp7zJGt^cZyN@jrae&au!ZpMAHkEer&egU9RNJ?O0WaoqaNlninba&}weuCQeUj zk&L+(zsi zHn`^)v2)onrTv^w3zd2jZ7=NAn0`K__+n4xkCXL+ThW*W!3YYtxnZA;B7af_ilwVO z89yl#1oJry$_TuSM>(v#Dw-!5a0lD>ubVn(*-_;oLy5sftjw!E1Z8E3t>fPTESmia`X)eI%2{+QkKu=az6!J(< zyckX+E-1f?(X;8%yF6c7$6u6(16hmf%3Guleo^9i$7B*lJn5iX7oo@AbGdx!+AoT| z9xJ`Ayfm88VH#{ojK98nv8f!X0d8`eY$)KOj0jj@axN;q)GYCd0RQVHy41LSg*IJO zVra%mCD1rmM9$5!i%Jx2IH_1I@2s^zy!N79Cl#Jb>hwwFV^LT`S*Kw++(64uD__JG z8Bx7{Fpb2Z{(9mKo2ng5n?dF`&M0M;;`}0z#zh6L%m|{hN?-8ywX^)wwm%0ZI!Qau zVaDcD;Cc9Dbfj0$LlNyrbI!x`-j%*RuM_E~@?n#FL8)Onw84THw?{81F3Zfd>~r;^ zAr}Il!O0s6?ANIg`rC8Roy` zeoEFB=F)|WSY*7!iz(&Aqh_U;-RtS6QWz}PQ(&3WPWXv>l_{UcZZd;}4K=>zB-E56 zo2t7JgM?KtDetn?^6N`b1Fl=i@3Jxl&JIm->_->?%qN#|kn$7#co}nkI$ggEh5sZq zzM|A?$YyVIt?D55b)bS8prP=<8H0=M8UeZ28r-WT&9ra}%^X^I1xoWtGGA5dV|q5b z3VY$|g*4)-l4#S!L{+BdoTDXIF;%l@+f@kBOH}_F%t0M<+)a&w3A58fsnbog)S14xsVoIY^uL8tlc@9-PR@6E!f#_6 zU}N0=rd2(&1ZjlnsXI6nM&{s`?Y30DuXwX$23MY!`U$tF=3O(WjZpeKm)mmVKp4wEJm-?D z782KDp0LEVp9!vxxZDt2?9lij(Zy1pydb(7V(xt^x)Q>_v?B`G`*AhxQ~hKMof2Ko z8?Pe}7(SCOg@zkk!{O7A-wQ5)!_2N46k&Avfm`B@t{UK$u0~f&;Z2%tbk*Uc2Ax&1 zA|ia3(G|gk&=E>shA(x_<#JF8lORzhS1_L(WaUDVO^)U!R}z4?hMQbZG6wzLTyaix*~1*k+K1b*mT-uc0B}k^S5A#0D!Z&lCc_$vbb7-sn%Fr zvDomPUNF9<5KfmZuIkkpN95`p0WzP_X<#oGKln0uoK27Tx)_%%_jNHYiSTnVE_u@r zUF)n~ppt`^k!s!Qs-Y(>@-hnzu)3VF1L0|@(Y8DS<_~y7ww7u~xZ&9GY_PhxN1e_P z!S*uknXK;pFWPE$Vg4?+?KaGIF#R(|xlHN)5YNl~U4FjH*1F-ijqaRWMSE02e#_zC|ekDEeN2D;hV~1i07=S`y%D40ZG_<#u~4Jit~t zgG6_T<7UA0Z~zGOKFzX^1?O})^Ei8LX?#j`_-L9W-C@R}IpYRUNW z4cZt2zC0Sl`LdJU#Uvrw(ShmYvAdXFP-=HIP?(tT`Z#jA2;qg(WQKpyGT0Rf7U>hr zS!7YLi{%yA8tfw0PTvsMQ;Y}Khq%Up@tZhY?c89znff*b3pU?q*|7EF3%&))!*p8Y za4i>ayQyoas|CBx4s}h2D3ZfmQ*c=n=Bf=ftSHPiQoQA+N5Wmrgfbc*?urs_dKQGc z!Ugk>BKn(6S&OSeop8FELfZLCn7VVRgXDS?kYVrX9nf`Dsm#YmFq+TvAALhASjrnxVWrXL`wI=^g z$F1u29G-H3;v>Kym$!xBJ3SuZinJV?!m|m`xCk&VQc}DZ;d)WrAmpTXhXf~gq$?aA z#{TMJ0g0kuNlK~i3Z~~GT{5rtW<|X-B3-qUf5;C8A(8j=BYh}Z91@24u{KPm8hy1& z%W~?Eo2*ht0NaT`kJi$h(#kDEBdB_m>tT#ea1O;j-DlOr#fd*aXRra8dM zl?$`99DplxLa90N|NfqHuafn9{=fh8f1Z~wyyu+n-kY)x2 z+ezQ4Bh>VKv`(eZ49cY&0W>R8u+jcHf)D1>sX9W8n#K0#gAx|BL+fE)VO!&8&+{4( zDb(~h=F02PFEld}+w@}E9w{({g1J%HaG`sIYT8bY4xqEq0@xIexpnawd&3@dMKdte zW3;ca_=?{Bww};JKSbHyZPp#sF*H}m45_O^z2t{49zWx}s7CI0`#F-j5!|tH)sH`hti$ z9ik=iLQR@oUtJ#s^@Ueq=yTXP zf`~GT;THbdMX1=<7rd!QL)5Xmaso481dh6_hQet;*$!(YL_zwP-AIryV zQ_$21S9iB!1i(E)c_VcRIXoLt01%rBjomd~G_!md-CTIxlPM-F|gYbL5Ju%Ly&v^9O~%1^bhMNC~d z&X)?4g_me#OMwA~6*U3g)AwU*S0}sveG&PpUWc(Z5Y$plTAjG$ia-)t3Bkw+4igIC zS*KeoVIX(Wv9^^^$f-?T>1yf(MQv)J)>NpIYD~5&P0c^1HT7pj@Wuu6sv_8oGdLim zSZRyl6+gP#Q>g8(A@8vkq_k115kg^8D(XH&Tt&OsAz0$ zQEh}591&<2Lu}I`m7geY;;tE^vh0dK7y{MnW93HL)mE^gMY6qOo(`1Ct+qlh+*{kU z69Di{Kehu&_caY^&qmyl-(IkA#yJcSswOF2G1(4v5X_h)KXwo%fu2t3C@8qPI<;?I z=4&RUHme78g5eaPqhPblx)RJFnGDS#x7RBVF4OsrSU^4KQAeRKn@N$-BoZ1^Rwuy? zxjD@{pXa98b25&`;=W@``eD%c$O*bHoriEmaO;u%C6_z9e1 zdDH37!KB2hor8F|Z02xEEGsmK&UY4={*8j>ktD6wXounS!gnq2G2`mtx z1>Mw%)s!rEcLz{KH{ngNFx&uq6xMBpAB}ig)0;B83$LMeOqg&4_0*$0}3rvbxHclctI!p^jQkA&sfi!=H98F83gNqR_|NW&dc? z<1XEU@_PuW*s=CHX)+hekO@k_u1Q9r$=GS3EER<1QMZ>+o8~18?x^W^G^CgCu6dsp zlX)+YQ-to=vY_|7-qM~pf--1BPmI?LI@VL@jI58sN{MY0^?Kp%(wzqN!sgOlfpT(+ z(8laE5oF6h?j@lu+g-s+np6=)b6*mI@%lqG${!CyzdbJri@B{dptn$p>wfb-LR)XP zbDX=3U&sVm-#v6 zLt(QU1k+3XLBJfQkNOMY{3Doc^cPk@k3B@Wh)x@R2-;Qyuy3rOsRM8&>Z4qyobJi6 z3e8%s_qd|A&H@7F3KcIHVx^J+f`{6LI5Ct{JOG-0C0_#!A?nQ??M}DH_vxMMrZdx? z?R`u%>1CmkJ4Iy^+xgL)fkMmLCrS*s87ud0=`3kbZ*ZQj1}NP>GYmJV{(E+&gplVT zp&vFK?kT)F^Bx9nqy}TGEEwiT_M;<>6gNa*cG^ymoo5DEE}&sG#evNWGt;c(HSiZV z0FX`@BB%hQ%E^%p=fg>@CnfdTKZqMrSKWu|sq4E5ZOz*5{yu)jp?h zUlDAK&2i-w0R~ExelH$cmD5HVXzC!L2i5Izi+KRbZdTz>w+9KG+%?7}>)x25!pG>@ zfd9B>rD1B%I?vbtvS*J+r!uE4Mwrw%-J62>!TL7<$b;Ctm?Nc&PlA~7HX>mPrV29M z7$&&kPHKcRAeM;r((4|Y3m~vy6@VkB2?`ayCa|sodyoO$qN~DbOpMxlV%7c{IMK|a zNtBBIp|^$$z4$U6B{$}R9A}0L-Fft7jm+^h7!Lj#E*frn?4AV9_ zv{EG#O-c=Q&t)5B$q3x7fPy?yh{DY`oQmR2n3+9R8Sz$&;ZzQ#;*mlY|E&|Y2ft3( zp8Qe58YsGU87;`hoxkvwgB%>NiS+Sk;Y~iz0bRw^XbO7^x5#&C>FmZSAO>#DZajdZ z<$CTkWDIV-nKX3_*aE;*&T7nz!(5O&%;Q0Fy6|_82feBA?2_tqHeFb0I)BEDt*eY? zj>V?Dgw~H0YV*71(#f$x7weYe8gjM{`saAI7{ZwMz282fy5m6__8TV%_3uMTBVFIR zCX_qw=)!bR&8o=|Yj~xw=n#{FxeY++?hW;H-#S^~`&V5HPf`wtgW)R=q8X!L3rPW#E)a_K%vBtsQ)z2O`E}VOd zcE2M`3q5_4>CszG=xipY_fidtW*Ws>4U*!scc^TdzeKGs1{#cK@2J?FIq7f&Xn$Am zHy)o0cF+iV+R{7Pcv^d|*UCHEurh9Akw`UmVRK!sY5E! z2=xijj>>U#5PGHtubjL|{U!@=FMg9I;#b(ELmDSiI0V|9CYDE8h_HFG(55D99ZOnG zIq7^dbih8%xpdE1ME~~zNBj*ndS94^ebAR$wfAo5xb?mO4_wg1`wunh57VLy%rI50 zKFxRlOQDKhy(jg`6s}{{wwfjkMVzx;A~NwaxU2e8+BKqv~AF3p!Q)>Ur3c3nOIe$BC{SbHb3>w6hF~{U-CX9&++kW;?`rbxVbG*PvL z9V_YfOu@<}E!hmUZfZUClrP2268zBVK6Gq#pAbr&C74l|g_$)0v~ZSS)6eHIBC1u) znA8Y2iaXLCAov|Q=#qad?Bsgd)2KG`dVh~Um?Br)l>NN2_5?JM!4%;JLCn#5w%}o) zKLWwNN}i2jhRfU8f}%!+BNJCt=o*I_zMsjk4=>FIiwB6SBknsT-kYy%fJVl=Mi!zh z!IuZRR?c`J)#m;9QysE>6Iz|_X9)|z4VpVgcnLPc7v~6#eJVG)DKW~vbBq?kZb=!7 zI|s0{xz$`@97ba6Twwx!(r&|uIB}l9_V?qV{jIsTp6F@aJg_)>P;j=;(n;H_aM3m~ z8_x&Rly&2Lk6)vTd?8a)j{)&*|O?Yse|vCIB`kx8YrwE-*~<{h2#ik z567P}!<#`&Sfnwl*ETr@^Q1?H7%;C%Hawrsx2XFM@q z*zA4sliEy^DGbU>G1XdA*sfSVO1hZi2A}Cz)&LA$4#%sn4cF7YPjC&JL$^K=YSbxR z!w}T5YjaTCgAkO*n{&5RZFp74Z>EosmVC*dx-Agg`1^CI&jQf9zZVx~8hhq{{_ZI%c}cy1b5mO&QNosyRcO!hfK`%xW+ zjM)a3?#5*}9H7F)usD+QM^@#p@z7WN)tV#KEfIhhG4t+YQsWLw9uWYT*(>!YJ#{k_g(kM(vH_H9|`kVXaz;=(RZi5T_P# zBZfc=U*FI|1J|h$GuEjQ_pDQU=a+RtI^spb-3R<@rme@_@&}r?UMS{ppV=VXMOZA2 zsoNd0w2cCD23Ze=6&Q~_8-?b0i(8n+`H^Lla2REu+a$Edw}x8Nnr;@p$6FIB*#x?{ zR)J6pZwYGr)B=!@-N}86@D;u_qx9FB0sVH1&>wHj)fip=C9J_qB6(~P;wfUQ@FCt> zJd43iwG7s5GI zVAVE=e@@V`Z9)a!ioR5D?97OGg3gaVGrwMgS~vs`lzb2vZf=40&t9`Zr#o-{J@ z7%R(%K1Rww3?$BS2+Z&F_msBve30X|L(p-am$vz`)oV~bDe$Fqv3>-9N>6FLJce?& z3s144%C5u&(uN&ENYvwPVT=!?f<52Z7FGr9`RubdW~_2}8#m#RLs0W-} z61~+d(|KeL`C1r)4S3JjLQ_;mZ_hVNTnN1z?&C$@AD+jKCj;et*vCp8cM7%muRf&F zJ25+XD%lCP)haVK+^~kn{i)_Ip)cArX_q=ha(4;6@pc1m$iRcPBpk<%7}3K(*9Vv- zYPlP%JXpx>h7jXj%GxcoWf>RmW+Vvt?7h3)TGJEfk`$F+vTFd|L!V&1Q$-PTv&@mXHfShN^wX z4((rl48@_X9odI|q}zo;yzPPH(p}N6dp4JW8TtGr8{MjBECVxk8weEC7K zfpm(wi@8yxQj!(jAUu6~H{G4iFCXbe@?Q0@hsW2#kHK}>tL|e{_NvVT;NJwc=j|1Y z{CXeC&OIGy&l@aq-c(pROHZYHg*&h$1%KQ|8Qr~8&`WWT9!4**By!$(&iqzLVp6^0 zZ-pA{H%EA_F+MAOE3LWT3}+^vY2RUs+7F+^uO&N9eusSzl-J#T;3xH`?EONLdFL8~ zWv+Uwp%!;8S#u9SoN<~&?*xgC9S}TiKx}tv=RY%BHz?b0z!z*?%+>7|=+OZoj$Z?3 z0WG_WnAj#W`kkqP`_9t)(I$tStfOARKhe4lSrC_xAug*YQ>j4El5SdwyV+ADud+?ry0TIDtsoZeqS8d^?T`rkL*q zfj?uReCtsWVuC0A$Y+NsmTr76ECTl|KN||t8Kz<3wCk`sN79Nb)6qe##ypCKW2e`> zc^<%Fx3jVTdA{yz9}|j8G5OpXZf51+Q{uFM7M~X_R*$5icWay>#d0+ z*lB6-ML_YuoBs61QNfGf4>!>Z0{rP%_B}TWJ$0}SmA~pAN@tD=7eS!yIR*la;e`Lf zD>oO*U;*{Em%a&C?4D2?*OY%vmQj@XdrTm-(=cK8Z4qrIXz?T;$5jtrkVYIA@;OH7 zwKoRR+F?J1(cL+yCag0WmFn|L@<>*^H4lisYv_2S8@i@t(ucf z4)F&}UhXW_Iw_3PZwdr8SAG&a<1Hs4&fP>ePYU_`6OOWf6!O?_{hx%%e5pwJ#@jep ze_~e^)g)B*RC~i^5bAwOh=NxFr&)$e8uMS;fWmG@y+t{_5^HC#U@WFW_p=Y^MX zrl&WO{ORm@VH!TA2Q`B|WQica_F!I#(36As&(bRmHmp0!^z@`u=xqFu1EuI@FZ(bY z#7|lo7@h2LRrHDp)LEG@2GTdEfIRiQFCIg(oLb8~}yTEv#YtTZWr~M_NJ_96v_ma>Px#?-%hP2vr_Y!m< z=Gb@l4F!!Eby*n70D0mY53^G92je{eqT`*5yt)h0*?W z{a+8=sotW8G99{tgMTLdaYgvZFcuLY8?4>Xj}{EOA580i6++Zhu<2&H(C2=Iuy!WZ zy$T^kPkQC5pur&DpT%I1dpI5h8L^Hn*_?gKurSUFE4Jly^eXNgV@df<=%VISo$}9u z&v)%#56!In5ZeEn5P>{z{U*%iD`CR>(cMtW_+4ipo3*+(`K%aT-=1APj&t*YsRR&p zT76{WHnyo|SweenL8s^c+t(Vw*IF9C-$dy%%hIUin&879K1t=*gusTHx*M)Ej1O#K zYO?E~N$Z9Oa5ECwyQ)FkP>WDkjX=$=gRRF?UdD+~vUr>H^!{~WlsXU8nZn(`d4h4@ zJjmN>Frc%t;PqK(z~89Jy!8ao;u~Nk;s&Mzbut85(YYJKNF;~SK^9!}rQHNUeTH&w z3NSRy8RSo)$NL%SjT?fux4KC{Nd~t}3v$cs4`Q_StBK7Prq=e=E7d#-Nx3~NfRgjU z+}!haPZPacE_C*DwNb~~m@(3~Eds6+)OZlryp2u$h{{-{IwjlFKG@Pk-`+u%_(|fr4 z*eSi{1wY#SyO2P(b|7=k-xJP*lr0vT02%9$(MmV|gtQU9z^^w2QdQ?AUE3?b z;{{en)?*=&74r0p>wyv!3Yp?=9Uf*&nh7A+5v)=Rw8*Cy(i7xq+yuKvY$;-=M=+9q z0<|2V#SeZ0q8z_DPoTUpmP(!oVUR3yl|nOpIR{=-YLC|etWqhYVFdP6;tn#FZdIyr zEKfn_VM=9>1B^wtE|0uCG!+7rZW&FlJ_V=zDD8MEyvL1Q*hoaK3;T+3+{}eD#nRcGHP5 z?01s$H!Qz0oQ@?uGSCk?aS|%oLoc>KmUHyTYbI6d#YF5r%?)B*6$<{>rNP((#~4J_ zm#IP2cE%n1^!WO%LEM79l~*E`aN9rx&NYg)uo?17ZF?rXi$H6_DE8OSI=q`No~f%)!g;5Y7CU;`?DJJsJlI$n>voR?YjWMe<~j|YKEVrp;_ zC7H$Q(4tE-i|veaSV@hkcrVNV_n5_3jGwa)O{k(JiuUn&YM@pgVl8nu=K?x*V$~ZJ z267DfkYycZc!+gT^Nsk?YTlgE_WtJQu3;5>BF31kN3zZf52B~o0H*25o}z}5S27Gh z@2#8kqa|~IFz@Fj=D>!qV&3q2RC2k}oi>fAY=G@nWVeR$5tY$Y*mf9u?(Z$GJyO$pRaTea5>&%c6zEV z1Pq*Vpra^S>1B)PiTnmf{TWQLzG4LJy6`I#>80(6@mrGJle0c^xK|}H9PS};IMN+I z2l&0I7O{@Ih8MwTT7!f z`LV^5>+cE$GUf$@w)7XxBBqZMqQvQs2scDViUO{|PDA}M|LiP7xYbDqe=W~n48)4C z+->Pk-}{Rm>ar-l?TZDF`S3odeuJV4|5Vubr~YE72XmqDJBt7YTv_A00n{=;bb|m# z2VI-=(P^;w#Jl@5Ck^ygfG9Gz3JlZTcc{$VDwJKUe4Q+T;yJL8OY1Pu5krtzoBt@B z_MG<-w8%Vh59|R9`7y6fAaH&94r8~o-9hSVieK0ckRd^019ql`S;el<4v9Yl3MIoT zUh%y#-&dJ+-vX-{j{UO?qVyle%l>%2mh)l=C)(g?Dp>ULshn3O%y@AS+O*12!|s_;gRJbPojkzL==yDJmw(##kviO(pnw%8F(E{PEt`I{Om*27PB ztjJW*%91Yo>6P+h2dHd*LNpDLuu6tdh9u4hiCi2hUZ(r9NVUpVR#&xim=PxyLM!~7 zTUlLI3IYMdOjg}3V`#?Ognl>yOV%cQZ1|%%)Ut*~uS@7=Sam7b@-gjMmoP%dS$?LN z^$Dyx6V@lhs%)5|uq#&Dy*{Bf-i&ms#gss*T%Qn$Hxs3pL5#N8kifW@sDA*Q_ap>* zJR1}A?(NoMux@(E0kUjNXiv$CXyl=_n!KSC5cL)DJ?2aXns_}DLdmO*_yg?;7w7&@ zj_WspRmQdSSJ${+`t|=duI zSm8(A8;DH4k&Q&N(V~dxNdtvME!8*k&`oNT=+8(<&_^-wne8B(T-g zgMtmnl?qFhJ(P9&mW54lc)+UnS)7$s;;>1W<0!KRDBGsPV+^}j%~}xBn6HBeOcJrF z7~+NX4}p_T*|5>i@)`tMb|&P@x=e$cia#;PoVYLF2d=OlXHizC(mE_K5z(qwg70T>~Z&9?RQ_ zl9{bu%vTdsB!b$Dt+2k_Nm;9JM04AVns7Xmy&cuwJgA7hd3R95Jc(O}wpqt3-s`M21 zXE`phy~J8hnRls6=3UWGg#L7Q(F|2SC&&Gn3WQ7Mtwx5-JE?1W5cuNS?5_snsuoF@ zOi(yWn+}D(*-4_=^sh2riG~r>(j+ljRWXCkLlV$aN|Hn-;ZC~qdo60VC|pD~8g=as z>UvoZmEbAuAu`=xC~>)s3ZTejaSAL#)+CEF)jo)P)(24DJ8;Jz-m9v1K`QM^Q3yul8bx!!Bm2ltdR8q!B><-ul0jMg)>wht_aFd@G0 zqfUr~zUqXq0hSynROdUVTj;00xW*(=U_X)BWUlBZw)%%Ih~Qqa=fA>neqI{5NY&A& z9{oi#)E_P>YHO+D2cVG~sm}nht~!q**=Imb4iK3rIEvD{H?2waUly4r zO*EzCoCkUSvdFYK>uPTWFN@4J1$Xc{-Gb=K%a~h3ASNz)ur|oM9^1b)I0++!#Y&eM zkPkPnFwn?Bw>{{Ufui8WI#yJ6e5NTne>_l(t~pAHf3|}#*{z#WUp)ud*0p?Fb=A=M z*xOcBMDoW#%y<50tj2dP205k-7S}L9gWK(!K)JGG&r@Vg6C1O=#IHJh-SX~!AQ^qr z|8&BBg37n{txn0EdwNsgE8+u~f?8fxFAAeSy=V2ph17*H0@zf`M!`z9!Nyv&<5gT7 zp^D%c-Hgg(=ZaMNephctf3JK&zG1zkBiVBZ{p*xKyMMtHp z+Ql-=RulQWDK4VrBkKCuk0gh3-j0KBg17Pipy}nrPE9keLC#f_yslHlXmKt0Gi)0S zOBW%QUgR0iXMqK~tadH(8Y3pDfxH$tYO!ZLtQYNzJ;#GPB&Ca8SyZmIE|A77@f?J2 z=hMY@{JbElH~~L$H@wq*sP$4$iC!Bk)>kuf(=r-S%j`kB$BGgBwLmKT0dXIX6$c~z z%j2-g&ZoR_;siCmrxrhMya;SY6H~QI*89`DS=OTe}5*>Qqe}dhhH@sH6P&i_$)XawC9Zu z=X|Lpz9$cL38-8`+y7GF=5({?!h&^5shmoUs%(qWCyOc$?8lSEX6D^%;GX$QJ@dA* zx!r3bU7IYXxawumG@7)Ep`q37IjEMckBSltFj(hy{vXy$-PK+7a^lGTrCw$4YxR2g zzSzvD)r*=<5u5Qh0v&Hp5p#JgF|SPVHw?s|nc`Obte+qNM3! zl=q^=Zb})aeDg7bVeCyarsLe)Hq8%;a!QaVxYg6Kru#D3qd)`J8tg$i&zJm}U(hX! zAuq6fh^xm)Dqd`YEPs`M7b-Y6UQZ>Vyf?ThkK$?9BDm%F`9tvo{=fnnJVR_Eo?cK? zO;sh+#D%;D+YA5#=EHW&3|xu|YEkB5&X2!y@Ut|DYf8I|ecAOUJ>elXh{?uqyIe1f zV_#A}Z_C)8TTYjCc9ec3s-VgFW}pELiSKBlA+tngY-BgxwHlZ)t)41=t7W5aXNgQ> z$Uy7++8U7bvB(rYj0`!fH%H%OgOKi^gcd?5C9R71~Wy80THw{*7THPJf=ZY`uA<-CNCDVx&98XC87t1ApNr-8#kAdmx7D) zn-GYac8SUh@b#j@cZ(R|jwELKx&Yj3P2V@bl1XpvK=?b3>>c8C9m2h| zaLocRz_O3JG5Dg*j#0bCSuEV5g=;+e0L#}DyBFar9Xyp2303LZ-~hXCBYFA@RfWNnv#kQWrTy_}vV*?BVMkoXV!^p5+7#01X! z@hQD}^M$3BQV9#s!?>xxO9Kx>Qt&QqJS;ZlFV&(R_aJ(CdKi=UQY}aP5zHd~VlA8& ze!+DAsL1TH$G_z_8tTEt$HX?66%k|nu2JQ2@m+rD3L4p6A4{u?!QvTBWyRWwfCB|q zEx`W-5%KZr&;asqVw2lVuWn1%1@zP*CzUR+ZPZT&$E=bxI`0pmoLmZN{yc)wka%%-hj){1lFf)f9SK{0OJT>eHgc*r@wX z<2cVD+s|SYd+qkK*iSuQm?B}uHXf}##l=$Igsvuff0nxkRsJmgsb`9wl-|f%y#0gA>Hudrj;G3km}!iVKVFy#}V%c`n4X3IQ}s_&kbBQ)tZF&`k< z(ls!)c2n{-G0wIdPKQ-QUz6oWH)njMS{T&*L91FUpjoboh0pxOyD>NxDmmgF1`mAP zQFlL27lNxBLvZ!AcC^8IOF8PUUU1<1BZ}$&GMvJ1UN}4eZy7hR504?= zWA5y2qP|l+UAZBOczzm?z(R^sYq5}oo8ad6qMS5u<~+XaUZ`K7hF(|=G_|W}GlOwa zUgvCd`zGcO*l#qPd9JnHLg!4NdIKkXPUmllJG?3`g@n1=xb|UYrQ#B;ye+ojKh2}x zZi~tMZWxaoD6!I%MYvL@m5Xn%ki+F-PxMo0g_!K@fn*fRdSG$|?i{aBeue1j0TzND zD6GI7dX>s5wCk?w{lxmaD4X(E*;Hq}Eq)h+gT{opOqevuEx@;J%#-h^-^Eaqy+~F9 z@bby;YTHZj&124YG6OZl4xuf0oe`Y+&_B@HUKIOMM5t-yH!?=67rp$4*xkV5c~ScB z*b55(5Zz49)NH8-1%t;AykB-JF*#ik!yO|i3UvJ+DE(g_h^i-|T6e^lsJC7CTbd3k z#71ycq~b_E@Bd`X6ZC&hmjWA|tJB0I!t@-Y%XNu%F;Yw#7C&Uc6Y0nu$XO@QP4)v4 z=&qQKtzqh25z5I9$6e7^&wmLWJ*jyRWthj9sPM<}4M=z>j_1n{QqDtMO>|WB+EGy0 zf&Oh4`T+g-x<{*!+&C{N9XFKRY3?IXx2l2=G@2iY+wh!uqdh!4KNi2>bdHoKAQiBw zFasbeJ#(uq6dCJ!(Zxz}BA@j=4Sf2%fFn=U)KE1Fr0#b;qH?cF3*lQN+W z6*Q6rDt#=5K`*Ejpw^t!1mP$p&=Jc^L4PmGu~sKVbJ&W&a;2Pr1ZEd-`a>$$OSibm zRAP{>;4bI;VKdZj$)IMK%U&tZR-p>COz9?xtwN>D=$eDiag^B{%q%mis}R`9b=itK z6U)}utuwK)uqm)N@ny>_UkSz(%Do93?(?&~&2+rImnTBwZdzDqkDC@Y!3r)I+3Jfg z_jKFEcBPIb~@j!$1i0kZMMa zciE4z@W5t<=X?Qq+d!xf=Glui7xDfAN26*s-hjw7vBp$9?Q81@l0z*z@6ar*3zA zbtw~EMtBWmgQJ1mF*7v?kDm<=t()J6HAQ^hlwlsvARAz6@V9Z2wSGcAa+P*r05vz^ ztbkCpaqc#a4TFIj<1dX+8@AfjuwVV9n%sEu2#_StgG*~R=DT4Mez-K$o??!xGWXnQ zV1Q(S*8QjeiK%#)z~I9Ci=d$2eh;F90a9x;5EmoXzzA1yN<`HLP70J5`z8NPD5h@y zlh(bjw1mf+RnDilpKr=}jmrNFDkp@}2e;1kvxo z_b zr%t^LT49w`R1OnZV3`LdC7^3H@87Izosue0 zuqYj3m$v5aIB5Lb+;9dChS9>uR{HJWRBwNSQz03!!m2VAvxB9=`gVa@EIy${F3Ua~ z;p1Yl1FD6^qp$1Rk>4yx2v~l{B&i|O+hBOLYT}rprCJC#<}W5Z|$lDX2L3o?5DELIP*u=l+xABKvlb+x+1ZayS5{+Qea^O%GRFKCl+O7+=(&J zm~ctJs>uqM`tyH&rgf^e@}D(PuF^zx?K6WCG%>VF6SXZsOVUHJRcT_FT2oed<gdxu({_A?p%D`J10o#=68{+87~u>hE&c2cC7Xdo7lNl}<+$JFIe7 zCU*DHb^}+*5zk6)hgQLUN$pfRT3c$MF8A{FiD5J+^|YJL&9a!{>PRE_{eX7FRH9vV zP$1?|^z#C}>beR{6(!ZefF(yswkFs18&&<4MxgsHJD=n5{NsLO6g^0xg(+VW1YKiox1 zn)yY2@|{`>+Q?B-IHo`Yd(N^N*nWg)iLn>cqS@HfWc;8j8f#s?DO#$@=P#!{n-gtb zPHatBn(HigbL&brAew~Lm6(}OQ&M|wN?pmUU#x>UR_KOAiPqMYUgaNXOOaw@Bv0;F zY96De8yF)oW8B;rsUiQ1HfiaG7UKb8Ff<~)(u&ezq`K5KR&v+F{HmIEHyl#8i3zZF zMldjr(WF?c{p=uMmXe*fbMXoLvd0Fe>I=3#7QySUGk5Y zYM9jO!Y3rFuh$U`Hic~vN2;kEV>zmQVw(cG2ly}Op8(n!FD2mGdW?$ArJ_A%K@8Y> zVB|6ndet?|OQ&f9`rX%aghW6B{$aq7#Vf8I_)P;JWu?0 z0}74#=<*X;#aKa4ck4?HjCb;lO2tJ-Yy)<cqKNB`Xs19N`IKk>`IWfBXNe+Kal1$ zl^jed$(!=aJpAb8X3{uN>&Kc&b@*w(AIpa&XWrhrNi?vzv>$2IdrIr8q3tL;#6Jwc zLTaw+g~I!{(00o@#emVC+Cm!Qs_j{PCG|EjRq*eS+XT~9yG+o!YX}*`OJU@5J+uS$ zXr%_Jb${nNg4AkHNsH}3sjtSeRBGK@wtilBZ{;s_w}tw*BU>A39BU6ulURFh;ahGP zYUdn(jkw-*AtmRbG0_rnh?t*B;5Z5HCau9yySJNE8&0vWb(040)1WCdr_7%QbeC2kh)a@c8w+%}M;qvNH%X)} zNz#5s7cdsxhKST)it8bLXDi-;v&AyN3$`(E#$01N*~?(kR3V?kf#4uE}QYq|&tJF_f|8Kx0QqMknEl?br~>0~{{3|I4q%*C27_Mz?<&1Snv+oAl06 zu(Xblz%T#nIM_2=GMDtfq@r$z=lx^dT&?_j-R8X^4dU<5aol=Cy2ham4)lh^aoa&+ zNW1u*Sac( zOMV>xz?&|Qm3FhK>-2cIa~!VX*XZgv=|?Wfv3oo#wL6`iAe{j-+a0WwgP{ve)c|F+O?k?7fKE&qk!phL(Hk&6( z0c^Q|U^~+{h)O0(Mo2Z1hb;=CClf*bj|5>>fBep-QaqH%MQ&|v`!V`z{12*=CI6U?d(snv!u3|3aZqkuCJkyW9KYM;GN057 zmFeYXNzE+lmKv2U+x1GMjrTPHB!!CI-2)tVv!n$a_Xd4DR~mrBAASeS-U0M@u9Sl# zbM8F#Xx%bT>WW49WS;aoL>sSVOFax2x-S<>(Jj{R0|2?p>J4aaj4c-EWQ$>}7?0QA zr48hP23HvBDE=ZwIAzZ z)*{Ey#W?;!mrY#?-Gi(O%3mry2J>jyXVO}Iu34!;`HOv_G_XtxHqKxT0Vu#S$rW}vrOuME;8Ds=3J(uja_=1<36SBdD55Mr;aiCAiPmb)^ZfH;tp+E zF5S{i2KAZu8LaQNel9UJ;|?p-l@`5Hx`>tLvq~Dq>^>)~mfF6sKE7Km)zhVdE>jwV zt!-YT?mdBP{<<| z$EIyk6N9Thk9N4~W2LyS!2|gBm0JC^G@Kgj#$nWx!i+c=GvqLssr!Wbz!7NMs=G5h zs8CoU_%#_JCU0~YXXwCA$M~*3s`YH5p~ErCsigu0D_V&!#xf=G0V^tB(bFG)_>0J%_k2=`V>VUMHC9OOtHTrM&#lYjz zM*T%L3QP?mx23K+H7J%=GeJt(gl~hW+{0v``^Az!UkWb-C%{XX4QFO-$fD?_6Hu<_=`Zxfej6{D32T8^xZ)O@AA` za#B+8QykaPj~pkZIQ=$G0klM+uAw9JN9hCyal!9DNnQAh92L}tJ!;QWSQfjf$!RHx zyGS!mOP}NHkNQ~}fseUAOWh#Ly@($kxD9br?udtjA~Ek$KZ zc0P~ui}Tr8Suba0H4ARmb){LTz^qa!xZ(Ysx)|1N%#$j-EWFrlzRskYEw@GGEVyf> zUPGz%KYlhkZb&{YU#o+&T!vM%d$*cDTt#Mac>QuWH7t{At6gm-ZZ#18$CpVV-o?*q zZ&D8Lq@`ufUhts&S|0v%g2l;y)(dXR(p~h>6$kiso#uckb3qckuU+HSAv3^O|ME5J zcLC>661{yvs&84oRPAbA<7z&@+W%xJeRV+{jME4dSC?uv4+U!Mr=_mB11BxY%uSDvUD1M!mk{)=GYCE*m2D-|;Sz4) zNi_VDG>_{+e_oOpJ0$V4#9WbvH6I?N^8h5-x;rh^eloW<_M@Liy&g>FUtx;?M8RLd z|9%EN2r(F?&3Gfse(cX!&fu$w(F{%;LdG~+f#^teMf<69RegK&D%SZja$H5zzH&Ui zD!t2$%axygiUR8}|C*F$J_t~EU|g^btJV6sRtmo^wSY5uOQ*qBdha?m9vr&YrO}`w zY!zAkD5J}18!fycrSj8vQqiSZH4Qseo$Hj4Hc_-HYId-3I{T19DZgj=!Jsl{jaRtw zQ!Nh81uGTY(N%|YhT@x&HAMZM;?n4SZn?f<7y16FlPSqxZ#1shr4~@;)+P#e6q|Q? zSVPoLDJ~T2=jp!MMP)lZ!i`@!llbeS_-k(DE4B#=QNN|QKRc?_e^+fumkv9lfi zZKC*_ZdAV6Gblv;mg1t(o~Oy)MPUV=;l^yOoOvJnM{zeO-`vI;qJBzo5!la@oJ28y z>cWjDwPNyidqnX7kghC1G3vJzmn-n+X|AeiWKYfO_f;(=C!-&3k#8UhQ$M9BPI<`l zgxE;SJlcdCH)u&pw|GYJ6>h+L^$!YBzooe5=<_s%J1H~EKipWTr8$0I7X?Gu)IxN( z`YA<`v}yf3$(>!45`<#zXx(t@U!GC$YMuQ%MppflqS#(cGIO^!vZcREM&r!g>d11N zyrTFkZj`?jeW89!QEI-J@UU}AlyCJk8V_p)ww~)B#s3DtvWL2$5cOM%OMUlwB};b^ z7lulfYH3pTqT|2zpv_;PF!fuC68U0bOP#f>`~rn7)oPh}2c+>1O7%g%tDjPox-X_H zaHcEpX=5}NXz6mcq4T$U(5`JLQ2myo)O#`Ew^~9^RkERctEDWgfsy`-Mq5y#`YA=J z|6;<^&V&urd(vqwq5Vq?goBiOlGUhwN}(b5BmtW}v%#&fw(*;~;Shs+#9dAKLVW`A z^P4po^ct>#2aro+z8#*vP@h`kDNlW3s0CT-Qv#ljqemO_FyB*ls!wrvy01Plqnk_W zQyn}NU`93O!|}9KeX`lAr6{M>M-d;tRiA*9pk$~?{PA={{l?5z)~Me+@w7mFa>LV1 zHI&)A-1(YijUoRh+Q6M~9DjiA9j~d6q`G*W^GKS< zBa&1p&4M@5)s<2r0xwlct?(26RLa%=jO!p34~-6>AD&7JvGW!CxCc^P%}V3K59QbR zpMi;(-yp!jb21zgmppX(TbQ>eRE4JEra4l1S!uGqOeZgdDqe_PGyy!A<27FKqNjSS*NM?!$?%`V|v`gjL91_#NFIrt%P@<@2HrPm6fudH&h z>HGtWVg^evJ6MiwapIl@QwWShMepOGcq%ZAROmxr7C~V8Tgo*p0#nFxQ)8I%@g%Z9 zD#xQ>`6JvI93P0XI|t;bIg;F)+d>y5xjwhW5h%-74d|$+HDy@bI_ieYBY0yen{Gf$ z8+s^!{uLqr48+~6+VVQ4=Y~nR>|6l#s3XVYYi1oZohT?$?u@szNO>WP<6$peS_7Cl zK2d5UB}(3i(A!ZmGjpm5Fl4;-ik6w=%0f9kdj-(4X!H}&o@lutzm_BW=qCX8t}9=L zaPp73@&cBrzkSTnSY(&6$-TP$I7t~N?0`{M$HQZwD@{b zY3cmn$f`GaW>;XTR!x&*nVm-JDxxI#u;jbh4S1>b(Ai}*`^lwxe>2si|oXu8L;niA9+_tBM%!F_GyMbC(P&3V&rp||Qb~48qDQ{FSBb7Io znOX+K87*WRNr^H;tyB_af9BOQ=Lg>!bh}v~(`&E|JRF3B0p#%UnjWnwZ-oqq*jBO^ z{gEgaApC#2yy6Ku=trJy)r|5!ec($mt>h9Q`g*mNAM#(VBzHxY>uMM|r9h)~BL19x z{&?C6houe+ZguwjSqziuO+^m&K5<^V#u#z=IeeaS6uB4oEnQZijR*6Y746|fpp87j zW0&kgeuC7=)CzE8ZR8#husR(aKSwNorjA5$ZROsG@f;Ihy^4lU;ur%%Q z^}WIDz26pS2|eMxvD}}|`*d}qda-Q;y8ii_9$r@r%Ez2??`JR7Fko;yIW+d*p-}K4 z;m!%!GQO%Nn8PvRgsQ{!^BmmafPW8>2Ec1Qxtipd9JM2cvS_I9@) ziKq)GC?*zO*j^rtmQU^;tiAhmkkjy<-a+mSF|MCIb3!=mJYvR%L(lcM4%m+16W9;R zO{_glI?A=VV#knt4{pG$liFjbd}lU z&pB;_^-EXmH!Aq@o(RB|ca?j>mb2TV$We$;k)mlm(BN)r7wqb$rt9%IvL-$1CU-%U zU5_JKR%zYkIAbx}Z?P5rvN3=*beDrMav4oZgD81Xlz}QQvKAI?l40c0Y*}O>B^K5VDj#iBvbIe6b{nd@>_!^hc8XjqBJs+C%2pN{%1u z8%QM+hOKgBrO20ftb+8Hme+JRn-tv5$Xm9nAr{gDn zT3`(vYM=L>0M3z@8#rJI8qYXJYn?L0c4KimoSQ2NAuW?-NQemut*8hR?sEobF5n zMKy~$zazhnvY7dey2g*ZBd6d!^j$d;WOvxhBLfJ4c!{9BQ30=Eo2t{Ik-lD3_^vz| z(Q+0i`LP2aZB{E#8}|4Bj#C#wdwoX=TAb9EqTMgTMc8|?&)*_L0Z#IB6ikvc7cQ9ZjjEVJZNMiN$hEcd`HR%Xj>yyq-+Q!1({ zKRGnZmYmsgT|?<*9x|VhdZB_x{$(H>sFp2yX4qoDY52agr%JAd{v~8-FE4Nh} zv4~R}!OY4sa^<@GZ?|X@e)T^y?Jyt}i1aX5wiuX^jz48C=%O~ovj0$T$0U+}<~`SX z!Z9tpN`+VRm`1*ZlQCn)|2mw?J6TOSoTwBQ5Eo2O7t8K!ri7I=Vh+Glyc)L!)_RIN zjaVYLiMfBRA-nk+Z3d?O3s9Z;jD_8t1CF_p;oqEtpA6-3j(Qpc93rjRAuC;}wMd|X zgds))2j^9@7*ig0UtfOTnhFjLVT4G0d`C7HQ=(wBvTCW^9M44u+WOPIrC1%9+VCLG zoP5`#?6O9asQklUt5eb%xgp^2#jxB%zt*%DUaJ9v#nwCJ1X{67ZUn5QdfR2IQ*!?mgq+HU7J%MCFmX_y_zU@# zYXbhT?Y}hvU8Q5<{|6H=mJ+^_?{PC7SbZ`7>#g*mufCS=Iy;sy|BQ~KJK071f4g@b z_4oW`5)LSoP0uD_APs)wuv_jc&3q}~8`(lFUvB1{jfwwuB39ok7eAYbRg;TVW~7CB ze}nZ_Wm=N{WE~52DUi*sS?L_E|6o?aA*B2Pt^Zb@fi2!QY)&9``cC!?dVE^N08sBZ zZcc@gIye|ozHQ%#^1hQ(Z3h;q`#-d&wEe#t^F+Zxe@n*{NSEy-+dkRK=kBCt`{Z_v zG>tEXVIg*VXyktDEdd!rvx;LFd?ou-+8nrWIEcQsgy-(Cu-gFket22gFUPmu10*D! zWdP%@aA7>$CMmiw9#_1t%CVxg@4WgQ-(Xg%e)GcNq}Z23+zTd7;eI(0Hw7cbF9?V* zsYYBdv@SCzIuDe+ze0=q;nfr~l*l{0lpAI7aFidAe*@mYmyKnzc=>}h{YYg16ni%p zS1y{8kI8y|Rdw<;$q)VydG8%wMe+RsXK!xqO>Wvv z@7bM&Kp>%n-jh`U6#@we2-2HMN17BNK|ne|A%~tsK#-asa!~{lrAzO<3#fDu5D?za z%8Zq`fS4WUK{qrb#DIMAU0iSCBY zcO#!e(blr}=bD9HG6oZSOZ=^xs=Fw7IycvBXsY?7@0&}Bhj5BDq4azHA=LK}mT6OX zp0^9mYG*1hxqB4(K_)D27eWUQMXM;B6gWAAybecuL@t=(CmIR{uvy}7-Vg^pehMWV z7NAFsDTN?&hoVDh=;3HDTw)P6AD+z~&hX1%!r$-=p)H4_6D*(cOPxEVH-;A0_egY* z(A;{E-@y5Zdw3+;8o%|3jqB&3R;`FezCL0zM#IOpxbTU0VCE6(e?)Yk-j1aq)T>5j zDD@qN1Pq&xL|YJj#<;e-Wu;)GL7s;502H5ImuklBnqi&`%Nu(!`={dEhNHvz=orbg1v=mh(WN66LAHhKrkl5} zAoUX$_$|7?YsZD?l2O^t0=iY2pRu@&A|4l`V>+)#5$t~G73LNGwHAMA@D78nf&b;r z|60NS^5K6i<$w9|zw-HCARyQR&cDPa@^f-zcnj?)mku}fJ^A|DxkwFLwOG z^s51m->ycta|PKhxLhv82QHXKlobh4Rw(a^cPj1tH98aDwYerFSvusVosqOflX$8gtN>|}&Sa*BLvvB_M)dPP)t#UIFY6|KVcKHa{SD>yj|;wlw{~+M3csZPk_oG|royzzhz$SBG^K@Xd zUH~S|Ci~;)!H%)_qn}BEE4~Fat^*y(8Loq=fj^$iA$ky<5_v4lsX{OeNNvUn;2tIY zwk0AxE4#3IZ zDBwJDybO+G_8-x3uDTNj=iKNx)9o;_KaZ{g(Wzl<>J+ZJ7ITZ&Y#||Zv!I2AK6)PA z0~QO{o&%fdcZx*ty_;2Ep^B2+lg8hSlBwc}2Nt&-;y8w_U8K)t{H@)ek4W(@ z+O-{YOOj(OkN9^;wYLRAqw*hNMA*>gAvX+C&ohN#-eg{RF0cwZn$zMUOH9+MSf^xIu7VFkL4r~8h z0V{h4RdK_p#P?J>5F;0kYF4r8vx-$8!>iw)BdU+zL5(bOjJx=bQIXrm$&KiC3Aquq zt~8~Ll)`NmBYm!KN0nK6mD}5?UHLLmG|DQwho^D4FTuw3?K)OQ|K!^DL5?F@?teTEH?lP`4;N7!AtJ7+4+2*roox3*2to?RBQV3o1 zvqFRDG(JeZNm1g$JmAZ8+9pm#1m6jZ_)|O*BQB1;ZN3TujJ+^^$-+w@*Etx+8@iG%{RG^3yAF z6KQ`jMDH(#=nd@26pr=9rTl{o97_ftM0g#axmWP>uVhT+*8jRODS)4&j6a!w~9Z#<1fDs>Sp3T zYt3SPjr|S6=2W&g9oKvfn#bLo%t-VL0F?t|Zu*-NAV-;U5H#rZ(ZMt}K=$YHw`T{) zrKB~KA0Uqs?4q0vx!Z+6c{qOB1<4L+k|QWsmbr7jH~6jWPkTcK9wKLfc;5(-YeXR_ zur7@=+J}21Pi$EqDTnpgR|q^FD!Uu8uc%k3%oEHQ4gshGBXe*OyOEt(TeL(_KAtc} z8^4hMEf^JF-Ce+G8}Ik0=87kn(RC!gddvlUpy#1-Ez_cPR69(rY5ClSAp{DXI;Mol zu3UmSJzV|@L#ZDj*8njLg%wq5fEB%$oW1w=)uRmR&8GlD7)`rdC;Dw)U9k#7f5W=& zUm5!QYQpx;IhY82FfSPT*Nc>ep?|ALz3-nz%AL@+Xp-i2hmCj?6e7tK7bVBS_d(&w zeS>Gn2CU+JYUht7c@O>LN#P=DKG!o5aB_2xdaRmpf%uz z2z{^qAq0FaD#*~t{9T*0vWDEqlrJz_!mSXokv=OpW@qV`&D};*Bb>9G&kMZ-vnveD zZmB89OZ2$1to<{3zxhAJEHnM>03CZP@&4Sd^}qU4kv^&Ye?8sz>ixrX>!@F9Eb67j za6g0Ne*6rvs%LGZKTOV5EegE^_cQbzLM_ifC}f+SZsj}cGXW%R8%6B+(%2dqe=~tk zx9V)uBVx&5n*=)x7|xw~nZvvGsepHFD@lHhb$FIXypX}u8X(T=AatI#7>wN<#^vb( z#{R9;X=sSir}F~FU%AoU0$@$Y^H=3JCCjayuG-99)U>`FAx)*8_2pWYe8jZ8y@Zz6 zm!t41|Hu8cH z-*Uy*dM#uP4tkEXmU24@$DuFGG!W&m&Y((uv@5M4a;Us5zk_qB@7r=Y{LFt_=Gw0H zZ_BYzZe4g==1x!M)-O;%?wZ!Dwagt9gY|P5R}t>?=BtGW?v%@fbO%N6B9mstyO`Vu z&bAv{%OM~U-e4XweBKE9YlPRl<>i|>QrgHHxM7@EJ9!v>K4~Y9z>m4T+!-co@3xmK z;b%^J8FxF!rS|fNDC%h234I3!#&(vgb9wv5E-&=n6TSEBDoAC8u7XrH?J5gW*`uor zbFC(hsP14D0HEHx@*)oK()(Zofs}+9#{(PzJ!RzeMk?T6eW8o%C3B^6wtKT+YT8To zfKoQ$WLgOI>xGLzGaBAYev!^QvU|z(%oxDAesUThckC}$;VsM@fc1+OzZxial1z6! zD0r~E32yyI2Ft(Tb^Z|fA@A7wp;-BNK0HirFN#$eA&T7_!Hdz^kK`ouOdg3*LDSu= zNr*?N9(3Fe{d4ms0geww%56o({iEdWXva|_O+F!B1dNv3@fRPAMrG-$Lr~w>`+aQ z!h@1D5G7FX+llCRGCk3sv`KPFJayN9CQXvdLVoD)v?GW7(4Tqe8w(yO&O_US3#`(= z{3zaGoh;{?O}E$3HyLsz(*g)utAqt)PRF>nJK9Z`+n9J{;DU`Uf*t!l!%}xX5uT3F z(V6lkym4&EP6Mg_ zY&q5laGeHavWW3Ee6}3JW4z6lo$;;3Cs+#?%*HC~l9lv5RE1^{{Y?A4Q6z=U0Zy7z zhdHurMF1flu#Lv@hxrbsRma0}{xJJHrq#y70sb)KrXCgU;T)ME2xHh>S+QoNGtD0b zlIF_QU~)W!zng@20eH7yF78+>>Ev9weB9t-(bdG2qF8V?4T{w z5Y(!jF^JM-(?fp>Q^EraWFGQ8io#5lqVYvUegXF%O%;U|}5 z%QeM3-*DA#@3$e|*!66ghvPD2M!HZ9_cn_j1F0?k`0YHE&yf=lj;mvitOs_&T{5X< zG<94er_#+FnJ4qfDRC>5jxLeIDE@O05ZJ$5PYEE;rE)3iW4z#&WED%^>PELd2PsLW z?2@+0;`kvCrEFjot7U3;Yh6_g3;hVC8MTD}MMU-!?|e$=at|LMhQU$2)x1o-K_6S#+CUhjmd zbov{)zUzvWi5z@I>i1NsiZ=2-NVxc7Ia5AdWj4IoTmRUDe)|rm4Lo;W@r*?H#uXON zypOGV9>;HfME=+n@t|t^H_CA)SRC+Z>z3meU<)njG1ilYA1*@!Hpz1gH;C7;%z5<6 z@XfNSbS~2C6fPn?q9!i}D%W;1r*f3r+f&b0a5XfNavgpiv~ja+b?wJI$hQ_O0=Xwd zr@8gZBetwxzMKpKc*oZt=V*akhO+X-LRgwFMdDO|%`7*EDVRvXS z9j-Mfjv5!pULu4gq7JV?<|shoA@&Z`9u!(0=GXSYPGcxt+{J@S6$YiW76eSxfyEo_j0&AB-|O9&yblR2D{*YJh>}{H`(e8n&h~MlAQng;|KX7 z4^?u0D`%;)qHmReR6Tr~9Or%ftea-nzB~y+$r-C{vTC}tjRtRneCZ_3M+xht=YHJC zmiBFv!{k3n5{)2)dUgR@0Cwkqw?iy)Vj)f4E|=ngrrfhuW|oj5 zLo9k)VPp*T&=#U07z;61&=`I#W;_HqOpHu+r&+v3&!gdN&PEAwHv`FIr>q9)@uQ(S z!g!)Zvz$@vu|tk`yS|4DE9dTzBdptJBWnc4vT=uCx=5K_mJ2HH?2um(m@HUXN%%cI``ne>+)!I+df?aZ?b##G0TxoEh-=+8S z^e(xyXeopW+QX7M;zv1NG*Y2hBanmDS&5`gKgv-${IIM$Ze@_#LL|IHR2Oi@Xkhh^ za-`?!0|@gXh7&>Q0b$%4&T->Mxfy3!p^nqlZAg^)ei5rj>&OuKV0AutWv!CaH;yZUoCtUWCl+Ya&BSDoUfMjq3;&; z2&MSr^4Fk+=^t!~Gz)`PzrKf5${PM-Khx7?@Ri5aXaYSyA$SSxq&&_v0qG7lHx8sT zCuJC^BUXy&b>maGZzdC+l7|B)FQ(=OT{BYb0w?89%N5{Uf^D#%Lr7M>HCFP#2-8o? zn$LINcxYdnv<10QpinJn|7nb5{4;;Pnv<>t!y^uy)~_(kmaqoQJP6dSa>63A?io20 z3r(ooyM=~Q`Pqsmoqx8(N~=%Ho;2-@?C#HDZz_b1vUc)(zC`xcL$JdRb1~m z`(=e{Jm0aeb1eutr+pFStO;+4^pFwO1-;CYoxVLUe`eYRLW>}>G$GtGz{;% z&@=u+o`#DbyX1WlBpANQ7v*$mCly?jRo5*)RV23KY7~`?^z;=^d%twA22YXrb5!=S zTp0Gs{U-?2jX1nV^}j_N-bGi$dmbT|KDa9W7E!DaCX1IBVXM4;mJ35}AtYAukXwj@ zB_554Rfv7XYavh-kN8#bwWtvC)uLXdiLXVeH0*|)%A@@lfvQBrtI6*nkkz#=h?BLs zK7#4ts}Z*<_ojd(;#NgHcduQ7Dn9UxpngiAjeM_< z@}8J{auwD6F?(`pUkhxVpggZP1eKC@9EDYXYxiAEURLa~BDh4di0 z;^2NUfcM{=)&AJMIP1erL&7=X2mymJh^%!6jmWCdtBe$uSUUW# zLEg^r!a5&>=G^tdclE-yCoeRo=fH9{m-Iw1O?{sThHK*!`Spg$&WtLCav9MT^t2By ziVt`u~kq3c?d2ba;D%Y0(jfG#%g=C0wJ3F^ zY{w%6W8oUTzusz=O1MT;Qo>D_A3)=wbO-l}`^=?(E_?XSzc0Jx`oAx`_UeBqd+|S% zJ@X&R9xqn52fY%ae1$~WSqCO6QXqMTDzib)7l$g}ORiZNV^k@W(!!K(rn8>pTNQ5G z&%%^FlF6|*bM#%N>#=F}_+n`LQQLag-W*VrajXQ);4Q8(N=gNOY;+8_U$I|FnCC&{M?2|~# zlPZ(4(t;@Hv5F@`9o)${gFwbNszRPLq(&@dM}>RPvN(msj9CjU%yJCO;KiK=0%>@! zxjYL2=@$Lqk{Zo>f=`xqRKb)hk@ z^J~2b%I{)@sa3CdcWPcvsp$4`HivX)-9EVGX1dkU(=fG)P+l&9andT+En|zX#Q(9z zv#-Y$+Ymh(jg)wXdT3qh+H-?csR5=F+^?9;NvI{NozIk|Q{{_sB(-f{Oo z6wbf#9}2I(_8$u8UiuG(*Ps0lh4WARhr&A!|A)f+_x*>$$9Mg^!s&^a?XAVj_Mn@| z$|C7AD(4oa@GuBk#ycUjyNU7`$4w_o*ta6l@$6e6nQGXZSaGAQVPU4jKV+sVBTyhg zZ9E-6zRi@j(g;UEMC00A3Y9z64K@VL6|SYaU=MpyO9eBHX>CDU8Y>Vr1-d$*^yow(oMXl9JDU_m)(ErZ87*mzbwo953GA+qj0bjFQ_ZrGSfsJ8-iQ9(+Fg z8jqvIcR*<;I2yg9G>7nnCs+z`tZS#NHep;mf2LztN5$I}aukumlDm>p+D+Uf_Lr(@ zr3zu~JgJtN5=wGc#h=zbOnA#QV*~ZO7UZ;IF7p>F=8O#>hu04Z8?JfyTaV_Gy^h$} zppusCbwUT<|3TTZR4z0wEL^-uby}|#8G&Z3qdVrZAtwCh+5DqT^ES|($w7hch_eF@ z8Mz_Y!?F$G+^tMQ%+P|a3Xhk@CV-{>y{i)D^V0_1s~5r*?c4@Zx+!l-(`ZmPg=<}= z56%eHT`;|;!JP2fG&B9uO$qf`KHdsXg=#MDsI+iA*}IEM-MWiPQahxbnL4YcHLGne zReFVP2Sv)HzN@q{UH|r<5pwNYAY{=Vfsp(7TSv%b10j=(5F&koq<~6jxOnvvlsx@f zM+trfO70`I{9jShqPLP&7~)6IiX-(={!3OIsiHr>?w&v5&+l!|kNET3ZL#DyxW!qp z-VeAVC(GXYEv+b&+E?L){*Q9xgd)D3o+ZaREzH$6$}*A?8t#fBul~w&&z)I}dqcTv zdv{TX0ZO^7T~EqLUT(OS97CTf^*6Gr^!WgH3wXx7!r=Z<-`|a<4pJZh8K7__lW>ix zFhGg%+?@Raw0hDpS};K2sxA+NhPhMc9E7lg6iCPiD!L<#uqx-U3~v}NK8H6rdvQTyv{9Z4Vb_`Ok!5lMh zuu=}D9$5z#%ThEw8?0DtMvhJ%f!XiP+JSUC_K}U^hbZnTU7h#Ye`V!i(pv$fx`TVSzY*h*HbKy=Ok3NoR&AReX-^MsSUpR&AwZ9|>ukNU~h@L!~N`C&D%Q zL)`PyKUBiZJ0l>F7LRK_#3``Al`@VW38v7Yim!LDVA1@QVC48(K+;g9k~uE`N>UU@ zMya7nCrDCO55+`$JAole%if_%D@6P)HB8}Q1^NtAxb`D^7`UfN6h2&O;(5Oq;s*>@ z>P5msExI`K2<2>H_6yoGTr7^n5lVI7oRR(T^(YSn2j-o!Lj|>KN>G;aTeLLL5&Mx6 z$gelZsu@l1j8y7?QcnN8QV{i<8PfWXKD!7%QzJ{&>EaTBl(gzfw+`!Xpw)9pS4|h5UQ&bR|t`gGH;QD?Dq18|8i0 z3+!UL!V@ziTLgbPn67XmUg3ac8Lf;rwt7DR=4!0Dqm`0MXQzy}P^aq*n#GGj&~t7y z=w+A8k0By}M#%3}#Yn3Du@Y@P{xndl3H?*sj}^Jhnk5Y05PYwL-35c}4OxW6$jR=E znZi@Ft)xXCD~dJqkRnv{KYk2ivyyJ$o#(nsismjr_)==+{s9y>M&V+kSH~#jixR07 z_Od9ET2X(6sy=erR*IQLN~@Lk%7yf239k{*j>B+1?GiM(7H<$HBL!FEZX+t z#JudU{AD~%+te|Jc8ya?0H8?G6il}_bwtpIPn1y1N(AL?cMGQMF~9my<4-^Yv3lA~ z)MGMGQo&_^+W(2d<8_T}7#2p6pMt$8a`#VK7!ygYKUD^ra%a%KPnF1^RSq*hf=scv zQ|0M@yTnn>WTgsK`Ao4R+3ED54MM1Wrs7LIKU27hm#q|$iuNpuNfv8{MI$&x`5B78 zPv$tcLSVDUQIi=8kKK|pLxDjRRUFyq7<7(`sl(r}#h#(taD|G{~DwA9BWPL1klF0N@L8K zZJwAxM05(L#CZ_3CDXg}lqx|7R-44Ks))c*)>p@!K|d;;|Xpwyyinsvgd$DP0Lc;eYSpL zV`11QJ((1kY3PKvP3I zYPU+Mg)o1!Rw>C)4PRNM4B=qg=Yj^ErbW5RWY{Vs0NnVH5ex7=*!|Iwyv)3ur&Ceny-D*Pb07{L=xSe4n;FPi6C|% zGLXJ^D6g3xM?im{op}#;uJwwCX>V)`S3W_>H*!!#^_u6~Q+$rQXnsfM5A4WO>P0c8HV zhm_qJ8_>YHm2TP;lQ#OcuTbmm-k`+0J^j)R6!?z~puh*W>!G&f?{o^BlWmK4bpKBI znJ3A(u+#M`e&N33r+IN_+QX8Tk%8bXl+?x=JhPw88}79IcLeJ0wA|n$RWgeeD|NQ< zgEA-FGKE^^D^oFZh}2X|a>(B+-*{khC!bZyg*^6gs_%;_XmEJ$KdS@^FLM~Sd5)|= z=lvVRQ@qzmAIjRT$fo0KDStPPT*F%F=^hZG8IJmUm2Fm^+td97y(x(s-u3Aec2s#A zD)X%KM@nE}{d`P$g`Re9#4iY|mW1#_jyn}+9ur8ca7?M=GbW>`ep&_%JqC7d0v$f4 zbbwynFqDR6nGg>;(`j;LOM!edh`JsZ^b1kd%KH3v$Oh3{Ef?OAJBMiJaiz8SGEeS& z?3nUaDP19ts12HjPE3km>MAd86=}ZUq;@seOjS$vR_;l_IRuZtG;QW62D$sQj)>M|_~LWKl8CKaC~wFKuynl9IdY@kshYmL__W< zr7Wk`$o7d6{2%)SQtpWho^FeNve+lmo$OXYGCz!&z6*-#O4IjT z2%y?`m71n4u==?BNeE53t5m?eCcO4us5=g|;|j0Bwv7m(`+Akod!Th&=v=rhls>vA z3g>?DK2p})1JT$*f84_goj_&pD~Vtwy%v;@fzoH?#^e5E|E8L!ClV-&TN}Uf=3Tl5 z(aC*fytIzq_)VFDC~;bJXKr2p_%~=2zn^B&4x6-j^L2O9Hy(gX-!U@;WTpSRfp9~P z?rcF^wN^CcflgQQO6?A&O%Igq*!+ftpw?>XG}5M|@CffOu?akWo3uU&hD~5GgFz|k z&@}1R%fE4>LsRxYecW=hSj`?3H6)?4Y5jIeACjP23?H@wrq82&{_4XPMcF;WJlwcv zSt{iXO^Coq{7fv-n-_(=&JEV1XC<26xeWAZA0|MqIV_==J>-RYY126WRXC&`w8hMx zBL?9XH^yV^CR93*<}1Y@nj{Xy$;2T#h4I$zthJEgV@f8 z&9m%BycgVMZ<~G#p%V&iQ`E`E;_zB*xpfu&Wf;R ze9Y(n&!Lkt9=Q8E8ra!Y$&_xU3jXYM{yWs4H4U4K2pL+2smCiWidz}irKXSYhxrv3 z`&_!<&r0Z@Z%aM+JH5zwUId?`0$2$I@X-QT2!2}YPao+|GXq$uARRKQy1wE&4s}hU z+Wr7mMgNp0^>_vGPkDpllOrsU9hU&>ZV-DDKXrrI{J^>VMpUtf;;jThLVMe#haDZi z8O%aaz#76{_2I1`t)%}eZXCSh?GUzF7{Fb1*L*T2TC{98ZSz;Yf-l#;ca_~{oZz-# zc@;b&tUs?6p-1ULn46$y`A6+QufJ1cVzbWgp=DCNK z1Lkrv6tQ3tc-ouHM!q(;8yk4QG-R#eW@cFv^>dsX*G0Z)0|{jv0=V=n5=>q<${RN=CqK zT0c&87hUk?u7aMKK+l?%WR*n)GhKMtGLYt$Wba_}JS@ptp<_*B7(X`;Ol}!KAH}d5 z_*?54sz?4j5W^OWnusQGwk`O)QmnPqbgtAMEX5zC7#BDvmS#L@rw{o}t{wy$&R!Q6 z3t#d(>J2}PN6nQ`t8R$S?;`2$+FeO=EYwW~Jz{}}-c%-*MR?|Ku)@}tN2f(>qNCoz z1g?85Itu1)#MMwZY$j(;>EE65z56J1``HXDd@ z6^`>s+b@Jt|2Q@r!P9TVu}EpQ!xqmvNv`==b{F~v;Rty;x>*dZ7}+d>wv}V^G2h)r zHLFf@%d(qAa&*!>bC<&k^F>^sN{60nYHz*FY<15HB zfhndL2OZ@S7{WLorjeCcFZANqN}#gMXkcYF%RCyl*sMFjq3C&R6}APhZ&YD*+#VwW zVNWVwm6Z&c>fyA&fya=p^am%ipWd&^8Uxt6s@OyMbgU}VVEtwAa8Ad3H{Ik|_)Oan z8thpRHLAwmNBOU-u{8WttIjH$HcY3U)mfw|?Kn-S&dNzWDXp3%h;~njtO_v03)Z-ef>#+C3|_I^h|4VG>K*!O2Ni>DuFH!DRycWegpjasZN z7?*cyv-|j%QU?n)p9-co3&`>s<|=u6ST!Bzqp4s{%hr?;9aoxa*JU#>d*Xz+T9<|S zoLKDCn7Bf|Nj~*hMJbyS>oLKT;P?xn>GfDUuofM^!YZ*QGH#W6Cl?`^MqP8W(%G&Z zqmUk3j{wab&I@AOL0q56__al7T<#{a5YvwRe;pPP`3EUbqQP-+s3MxoRN zt%O>}l9ju?f@F3~Nn#Gkbl6I_FVsZl%2!wm3@i5)Hq?ye=*k6xxN5)3YJ)ZFKfG!% z<$i$-o-knYB(H{7edyM!Y%xa2x||E9<*#9dG^O-lj{t{neP))t7FwKoD)80m?cWQb zY7KD49;W;T>{aPwGB;%Jp}F1-Sy}wdYRF2Xnf!)W3>_R78nQ={slW!~?=zv4cuabg zM$8QMqlRy?O!wLIgD|5PB-(VKTZp?^`{HsKShp-`cWJD_$VMPIE2%{zmdrUli7Ty= zn*3s+O^sL;x8Ik6%cD-Q?Lx`7G2=mMJ2e(WNBaSW^Kaa!R+1tjYH|&w6^SP1G^Lbp zYm}yT$?QW@jxSxX#FdhA=vgu*E}tqi5j8uN59Q>_O#L?nCW3T&`p~H+Y^@vJcC|03 zPL=$E=*y<84tRz9754(^aZ{|`*3>nHH8;=T(H|4M!l4*SVK&QrH*gTpj8?oHNcFdu zz|_9^s)amLS$Egg5N~%+VO8nNR4_IWf2K0UZT~(STDYIeO1aH?Xu_YlA9M?%D$SUm z+ssW?JWu=fQ4n=##(cpPDuWvY)7i8H3r%XqK9znT=HpL=nlIg}!@E%(261>{v@T<_ zI?XJ(vlGPOof?+nc8{IjY*yseVeeF(+dcO66}m8(esWXBjL3#uC6=RwacviTI?BUA zO|ko{(qQuITsmW*fqf{SC$+LpHZW8K4 z!Diq7rbYUc@ZUVMuSoaQCE#`H*ov(}#C_klS-k0B6lw8c!PNY1=I3{9^8rx02o=OG z6vx8SAF{HRDN;C1dz*Q`_|cVr9J$i?XmRX$8|Mnx#v85KGuI`n{q#t|SGfeROV-UY zOtLwKyaQ_Pne4=#C7h=Y0GwDXy3KNW=SUR_Tr$7ZO?Au zDYOGi!Nu4xWpon2!k{nM?_)YJ9(~AN&n>qp=?5FV){%8H!9{p^M^@50Yc<4HvsTm5 zj%=PsHXejo5o~K%5M^{?71bSi2Mwzu#Rc{)3i8}@^6v^;o_W0Pyww!ml||9>POM#Y zF5YnMxf{2H;Sahhb`dYQXf+M%%)%2_=w%vugIVM6g{2UGDgHv*38R1xgg@v&MB(h! zbf`0Xqp;g0y09a~yT}{GktSSc(4x)iY8^|_FN9c<|>=4jUk~(=K zS?lz{>E$GT{ z#sxq|J}AS?*jp26pg3=(tvTX~f~^3mA_pbheVUG7D#y$RA7Lie(-$9M(iYQI{wZN(3yGjGXs3^5N*jR>Vjqgg%E z%pj5?Muk$!$4oVyHq(z&+cXjOfu<8*Iu3u#hQY<&(R4gkB#=9D0+_@m^n3!?*rl_H zO=PvCDb#i%+l$Ovag)H*fePOZGJ^8h^u#mYPGYU}J4#joyb^``8QRn z=EC!4jr)qL{nWPAal>-a9;~qz-moBnE_{LqjdpYm^_tAMl>}GAD0RjLQr2Wv0=xN# z$*h!utB$@H^}tS;V_ntaYIm4W!#C^Ba}!iRky98KS2dm@ZbyD}d*(dEZ=C{`Z3-Ql z!dlt+qI~G3P3K`bHRjN^o2x(leN z!IkHkEL6|CgW_FC8F^Q54HqW(AjZ|tER4!eXYSUY)(45@Sa&)r>ox$rk07o8fIv!{ zj$NNjx2H3nKcZmdZG_+b6ud2u?8FWuc}j*U)k^!@o%EKGN8KrJ(_|f?MG>M9RSS9h zB7Mx7!V4JzKuEob50LeY5Z{eEvtqoN0`}d58!CDMZHE3ya7t4E z5zvDPNaVTzSI>)6grx)`7rST&p+;JO_BK-b0#He)ju)`eR>LGai`6oN*fh>!9;OI| z@;W|6HtX4}O!yWTeSK&g$McF7<`x&RG7Ax1E}MCSs$BT=+W=~k&AOVKYTI0NblY>7 zhv?dN#KbLHn6q=3H%jer`8%vfkniWrQ|+wnG;SvUhEy{DYowEvuibDNz)%+u=6 znTPf32Z35Cpndb_;0XrM_0QP^Fz$N{=r7=X^+FbCPS*Ci=!k!|ka^&7pGz^!+x9yf zgdN8sta*<81JtQ}^FZH&;uBAhjCTj&3weEUVAiTn+$HyzqA8IuC1!qlsGa}tbODFV znP)DFxs3#?imf`ESkQARRy`+zJxu&?fQqMEGBe;n|9s+9#KTR)-TTdl7)xrk%MQrf_&Jk2B6i8_{2N zv2T>r1#`Jmf87-<+V6`AFsO*ow%#?1llYPgU5Hd6#96_-%MR2o8y$=)>L6mh@L6%! zCS)qrOe@^**B6&*-3nGu&9`Yky-)$v?~0BZ9`DjkyFz_(*$|qtQtYCuE_BYp5@_E_ z<^c+EjrOl)wQN6&3S5Xr@+vk4AAX@{dF&OhUkg8Izf#5;TsJzdVI?VkwWxiazbfl} zqo~jg=$sP>>)}%PSPvnLL@uj@ za4E^TxH>nX9=U8h*7{w22)28L%~C=htB+3KC$@?Wwf&}l;5Uz_d5qg}Jt*uu4`VfT z4XcVx^2q4x={0Pk=;rLAZvJj`bK+Obn+?<+|3f!V-3p?JT&B{=ub3}7`^#4>Qf%?3 z0`We77`=fa!(wkr8EaWx^kMH>(c|Z$$29G0K{nDPdY;ELI-@_PL&3F%K{*7Jdym%R zNOB9F(c*m>+sB2ksM9)@>cyAUTw@HhX&s9}&&L`*`!8EeE1W$qlf z0rIU*v|%I2xqhOD)18g%EgUorHnBnY`EC=0iA^YGGn8~qY0YMq_~+yM`DPZ3GlUEr zL>BG7zcQ@UG@p4y@$-9DVR5i(f}z7Ae&IB?(cFAyw?eh8$v9KikM6$;oSERhWbxGyJ@=l6_T0H%J=xY^10?*$49zGt6un#`G2#Qn_?m7QE` z+7B$gc~|Xoqk-^$M}ij?gORE&EUH{cg6a7WEY!5+D+=4f>UeO>1MS+^)P4)tgab5X z3k#E$(vmF@xFf{Y=`E}e^dyb8ifhU6t*pEoNa6|!R{0e|XzNzi1v1hy+aQB8&KAFA z#d?qe3@wBEKVxl{i`O_)mK%Li|J{IA6a$y4tthHoG$3iaKA?#0#(*{;5mr8R+|Ihe zp?2GLR@T`$vhQG4XT0609Rk65MIispy^-s4 zVFQjHVx{-p$zo~@)Ych5SkYn?N5x@&IBmIxvw{=SWq&vijSF}2*HXH$k44bco!Gx~ zWX(bHeimh0ulJ6JZfd%VjR%+e4IS9eT2O@_1>acnM-~Z6x`CP=VDYx^L}?-1nfjxk zWE*ME0ak@)|R{_u}luL(E=w#|?fv7H>*er6Mr>KGs~|xvsgi}w^G_M)|FQ6hl-&o?c2{fqMH>D;Ov1$@Brh+ z?K}ApYT0%b4gbdjYz)4q925iIT{z&9wmn6K&L3p2qV`^@um_me4zc>8>&Kj3|MU=x zX**Ec|JSbXc)~?I=Q$&S>oxvds>e7oYX@}j-pB^s84voMpx8ptsg|gTYj(h4riu&4 zK_sbRL9T`OjXsAV(`!!O9cIka2q}lH2PMp5Ox)AM;D#@Qas`8Oc^v^gf;IaQl)Su0 z;R&iy@|a$7-Vp|~8VN6six>72diPwlLkpSai|PlCumqly8bQYODv?J4eD_^NTn6Kh zLg2B4QjRj!x?o3;RvtBm9%U7)57y59d2B_7?aq5AM#(MPb$P0Lyvs3H%JFXzM!z3r zftVbhW0=Ds6nBgB!4QLMeQfC_PwqY zy}6<;6JPG3L8N=XYG0jJps6Hdh&XIWYBoT2Af8Ia#s&f!!XOWn>f zZpXg#97q^OexAJwrRl>W6mnvNll@Uqm;0WF_;wYoKF`W?x_$0ETaKEOF0c*wX?PI| z-DFyOQOJrDFR@0jn4EM8Z5*Jzm(U^~PJTzxO>&H3 zZxF$yB4QT^e$lwWhmO_#lp#)qD7C3J)+imR3$uD(6->+Ut3YHEx_DKv0e!Fil?~tm zta1|!pJyS#no!uTPN+Hc5KFDN2#X?rHaLQbg~k7lBT(JXJo4v3vYONQpT!OH>z|?c zgk{4o*o(fD`O^6*O z@sv@w*(m)>LJ8sFXhNQEuBm`mvZogwkW2D3V&y;L!n!?UX~rE^DH^fzXF5?OP7y4Q zOfh`U_R-}#Y#3&z!(C_>l4< zB5d~q?6oG2n-6e!z$)s|L+BL8(4m#W)BLnU)43^Q3tI6UmxqpY4h1aS@_f08a%!ppGsD&L0^XtsE$65(3z^wcHNefB zpvEfa5sX#|1mZ9vKl6YZW3U16oN`E)KJ==zh|}i`oe`E?-*&gx@VHnSS0)pIX(D*6f`KoMXR98?CAe8hGBS^0gP~t}2Obu$B=Y zfw>gsNMpE5I{WXhh!hP+7ek zq_>V0hvWCg6a{gTWpR>^Sd-TaFn)Lu#+M#y63*FQJk$z^z`C^%gi*cd^m8%jP?9+O zsG#HVIO=OtJ%Oy@HkF@vvurAJ8-$_k;6n+dYwuU~q4PG?&pM7D#5+xtnhC*!rza4N zcx9eyqUrok)YntJC`6@PjFRpHYx?$HYAj4sKk-sqVEdl&QWK(2JGf6UpWY~7aG%3c zYV8gt!}$rorb4Yerl3&t2-|#HZkFg z{nXO9)g3pm80ut{Z3gZ{LCpWH7&XjxLZ1jO8T9i<2xya)KB#{MrD8Br@uc&EsQg!&;?z4_)~gg(JX|*F zQOJj}-juvpb*BkIYLJCb$jk?{C`f(B^t&5L!D@+O*UziP+D@U=V3l7#uNk1i{vA#H zxfqO8?dPJ(h5e`f!K%1^{t~R#arP)aMEzcRhi-+a49NEj#j?jj4plkVbISk%*#`%L zgYC9xM98_Og{rlnMBWvu&WYSVu9W?*Rl94HcV3tkZw*tH7KWvkoEgp`JECxSNT$bD zN{$c>_Ki?4;ilL;Qbk-&g@#0`UD2DcaCNYR^!D6t|sM2V*nQED|Q)A3c5x|{rmp23+0R5U^ z$(%yDrEqRtFQt0ww}q+Vg?$=VJ@f7Nab^g=dJrouc3;!d>LhHm>4?b}pq8YH*$eHo zAn~RLMZ^k9SUOfq^qtQzCI=X=i*DsJaqyi-=J z<=MuFL;l@bo>L4)sy3&na?x7u7pJe~iE&uV{Oq2(n0Cjh6+zAZh*J|HHxJMtEDKQoSKO-E-NR{aI+kmm_~AWHOUIw z1RS&9Q}^;}B@7>2O|pzJTI7WI??%747>rbHaZ%;M(f@_J`9iN!oV)qL zs7L)O7~BmolwCoMGTq-fzf+VHPrp`Bxf8OvqL|rQ6+y6zee$&}6F@OU@U4280~OWE zo)H?P^7a`a+6pY0L259qn$gvlKI)-b%}8FRt2wA$f@*aJ2XNC?Qg%(O$*AYPo-`#v z^#I4W%IIG3zr)Gu7jUw=sPbQN;?!^C7Q>08b9}i@oH&}7@Sz2^dEQj9lIrVRKlLlA z^@1Q{%Qkc6!y+>_BaG^yeHco!Dyi|NjN`Pek{Sblj_Z}wSy*XfD`Tb2->R$rxasTE ztwPTPEfZg9&$iIP%73%cVyQ_L(6gr0vx>R}vrw_BSYHFH;$S;|lCrC+HTmzUs-SkR z1SZGrVoO2WUs+P)>{b|n4>!V28_i4oyc{c6-PP$)9tpGfhtgTjx ze#{Lzb`|#Y1$w<>I}NN2HVkPvYV#f{9_ZBfbf&iYs;UzZxR=`yLSm0mzZkEBW+LmV zwP|D>mFs}V*Ad;^T}OqDS7u$Yad?5(@U2r_^;NHA?O-7g%CUbONxSQ++$`);U3DWm zn^Oq@0Xkn>ty<-bm_=Ag`3cSP)WvSvB0kD9g&owV z6aEKjI}0EnLvUHLzox?4;T191Hm|73q2R=f@?b}d3LYH$n_m&5Hoqz`^7^al2RKYF zy3&QNC8Fu{t11sqdE-@J2)*@qO&x;A^w(5=OW*gJ8pH<(2(@ijj9!A)#MKv|`qo#6 z0n{}ElxG70Dzbr^;9TU?yFqax^Gh)zGrxf#GQS#q{+C4N`U?yGdQs)V1z$*bokZq_ zUZt24Rl8x-qaq@c)Uc4qI9lLusql8Nf!_}LzbAumN22Cte{7-8 z-cTFBX7S`3n5QNrzo|}vVZzEcRqj*&_)T@77f9WDlL{lfNF{=XHB#F`dUmW4jyV&# zH&*LHi`1a8T0_FyQOV+MZZg=N(Nw01+Fgv}s*i3(Lvx#`rLC*@#R%)yyR#|>Ki7L@ z)yAKa;msi!l;;>)XEh)w%`6NaV3GVNTFckJrBS>0)G$hHs#Zlw0 zaR5T)3OLJgG%H1Y1CruT$lgP(MbW7$Hzycx zru23rN){RWBW*}|3tU(P z&3sF(Xfbi?r^!^eE3i1Nm1?K^Z>cQ2uuoBnH~dgM3l(hYhQaEXN zHuY}LSN?!n9yGNB&WZ?H+(BJybbem&h!-@g5f3 zmJ49yu;8NKR|g9vUe6RYD(Ksnth8@wehQAR4Nd^i7W7c-gWP=g7jiSXN3q2>YDiJ^*^a3edNIAXKNY5FI{q5H|SG3(saJ>(pQ@w!CWb*1QPT3Uv zU{~xic0~}SEQ*4+cyFUu`OaQN_Yu8n&v5Y=VvreucL%5=7`SRkOB z!Sq@`6}hCSLqD-f=J!*-E7}(Q1#Mc>Uo4VK{ly}w_kr52u*9+t)cKDK``b7s+R128I-!l+6N6r-v?P>gEYz+$7? z&PR1{pqSE!1Jx=LQT!mae&MKh^Y0@Eq5e9`9;Cj3MRM7km9(fF;?S4|tK|ZLjKW)o zyH-QLbWHDvkpC?Qt9H|ho%G&dar2luSj_|LZvo?PRXo6DOJMz*3{eMA&o7uAKD*k_ zVm%`AZlGZJZl@uXwih^spQ+4HwWaSb`f`Pu$IrzDW=d0ss@1}Nb-vW=@QFH%F2iQ& z>`*m0___{Kx3ar#tQ9y4S=1nshpBTme%1p;-Pb2f;67nIU&QuE$(!m;UfXZ4u6hEW&{mP3Z$8^8u0pE2an@S z`<=cVsW$L^Z1h6$v(GJ|J*HsPxVH+ zYES>%mw&c3{G%AqRPB$V%70~(os!aLdX?gm(r1#Ha{5E2-ej@rD?b+nz*F&MJ7=~{ z+j_~OE%3mETM@PzK6~%>1Z_%F{~zN1J36Y{`5%XU*L}VAuD$lU+v}@KuOiid7Y@0}P3&Ge2Up1QDRh%UK zQ12?QNQp8{@bAs;=EJkO-pxz=&&}>GNPL^!T?x$X*iS#Ej|?`h(2z1$7afnuaR_M}c-5zavza#UBfm7|wL<7&bFZ7))Kt8E>&Q^-$$)0w+6M}a8GRm^OW!avxqFy)_%nv>wJ#4TSVQ^q>mwpvszO-Iy&G;d*z;M|I zUegSD%rp^0C7Lh|W%tDQC9#{@(lP9@0(}^_&f5_=0vcghB!^q1G==n0Uw4ow;AV+{ zS?Hh5GTg-EW*Pop%rZiXVwh#bznLXwq(s$EUvTiu7MNgUAa&f4?W9qC)k?KSiE<0X z6wA6%9sv-MF~@|_CYOWzjT9De8BLacYQ@MgyaZ;)x6R0R86#{yRuVY4&BqFx=L#4f z5p!iFUYn0I2{Lfg#h+}R=Pk?gl)>h1n0vgpYD*gG)hOCL5cZ!UiWPh}U0^kZsti)=J|}i)&29-1+VT+zUy-Q-J;)se zCzxusQjT_i*EdT~6BJQ~6HN0^m{#+oX7Wuv^wr4d>4G3he*jm&p%hqVI;Cf+daW6v z#KOPv27Ja}*g?dZ0?SYLI>AhunFS}9#Y=pgU>2RrLdTyi2@EHgO|ERUlWmTGaVMBV zW3$zUwz(!&hCY|74pyUc2CJHFo)%r=qH5N#SVdJh|8!wR38#~c) zV#tRIA2awHj)j8SwDm%2KLoa3B%r3P7txU+u=TG3nqu_wUjun=MI5yns=g)Sj!;g% zz))~4Z34`lPenuj&D@Ixx-j=*kGvjP|2h;e5fsAQOQ>0n8jTpfxogV}oU~M+BVPVPa+IE2uQVVk^CnmDG;Z^0rl8$SN8~>fnR|2{CMl%Q4IkWHPn0r47OH4#fNe&2E1PoX4pPL{lu|O zl$f8(byOwyA3m4sO-w#6ua_!`{Fg3i-ymf%y5t5qd3fAPKA+5(jU1hSGVk?t>1(mF zL66)>tw*V;_Dv=yK7MX8ry>2uscmhWrC8AXW_mOZn%`m~XXslfI}bs)stwWu$-Oi# z8HfC~dP}$R(pYM}G%ghd+q?za=)!0TsuC zC`Q6P!XA4~PTU@QAG60kDHiOpPuOF>iJXB1(ZAT^fVcDjFD-97=!G1l4SDJ(>4yY_ z=TaV$4aLk?eku-o(GQzipfb<1Q7&ODUCBYX@rwy+ zV)QXD_A#@j+{jleDU~Y(=*PW<$IU{I7{#KH%UDdeCaCpnC%otgIQ& z%sb2f-PECDvKrp`q*02r_mgIW{@XnNln>YD`YA857)bx_0P1N$;ycejt>C_FzSQE& zn`UPW1fOX>U*3$9%bPQ@3b7QFXXOL*vw|iXYg;=)pz|3ZViIG=TXmDulKuH^t6b=v z^AVb-{-1kH73YmosN%f0HO2(}|Hz5C;KQ}Ke!)xp&#Jg6NPJas(N`6zmkfkIsUlCR z;u5AjYQ>na$g-Aq(){p!MgGX6$!d!IvY=A%F&V)SDX2I_tyb;oe4fzl09pucp^%<@ zMPPEZrC~LxxMT5Qvgm$};S7<3tSRbz+f~U7UUrq5Oa-JwK=?(LC1jhXermfWApE${ zHN1VUPPJY4QeCH~rmOR#Z+NM0NZmwJ^Al;QlrRHB=uIz+o78rO`a;4j3Gsd3xC${)??zYWsI%2h}$Zl!BGKv4|+6L ztsmagWRRiv45G-gA2{i~dFtDdy#zeiSV;lB7j2%WejVBSPvG9vbiVp#bRPlcpFKav zJT6L~Akr%zcG8ad>g$nx|3uZ7o?4*3Wa+<}x-L*(rX};#@Bq}&kB%)+KZxiru>Bl7 zEYP2tEmS)>2M8E~0%ipR=-5JaynUcVhO$O0SdV8dQpZOQlGr+q+B)_q`XGAdSGDw$ zSrS(da=(LX2@eJ9SyH(oF9BB1HrWL`#`vT9Y#Q^cIzM7C2Y1FPKrYf?dN*G^hV6p7 zi`90vA%emR=N>`}7OSs0hnhTaeHtDPI3A!6rGzDFWy{u{^x_h=mwlLt;Ll|qM#q<^ zhwM3z0dqJoj!rC9``byDfEUn-e*R6}U?2V%`fwVvRxL%-*CB|}b(#9LeZ*rlBgnlS z-^rxq>ihPQvczc0$RJ9?`jN&hS3hH4;#_B#KHSny-Wd|0j}o{TBHiKKXGT%w73y<9 z43&tc7mpT*7$gz30pe()73y&N7+IGv&KTaN7@D*QldF$csy|1L6~%Vg!!XlWy0KF2 zW6zafL6s}0@>Z$sBgdHp(yrquwLndY%rmPA6-LXWCI#x;i18fU8Ip6OjVIe`bsvm& za<$ryeqN;p2L{7r6X>lqYI@j2gM$MJ>_Mc=#VsBKW(*6ad27^Y=OmN4$C{I9{~A@Z zZ0ku6*Qi)~>vO!s|NPmWD@c4l+jA*= zkE*54GfL$5`b1Bw-fJK3vff? zS!(jP3BskcV7pp3^)~_b(<96V{w8&ciL@Kn=B!f7(tCw!Gy5`u$#-WU&oa^C<>~ky zhZI8o<+4~uvJV$*Ih89^d)QYzMzz9+s!9>4R+?0BB~G=HniYX+)ninve5hLN1XY1a z#TVkBDxmLns)OyT1z6f-wa{2$I&)C{B4pJB>rn!I4b9kv&b?Nk^T)1?5qT{g+@)4@ ztrK8A?5^{wf_{eI`?&Xd1Iz2)>xFx7Fu-u{4PFoZFSF8(KJ1$78@Fa>jBT<#G5>9~vfYPibA7v)_@9-r zLy-6?V+Um%SGANvqvTJ@=msC*yD){+Y)=gr+4reomT~vYp{qzR8+VUCq=rTn8Mggs zrvY|Qq`uQ@AJMsX`A{_1cX^BD1ar42Uv?K93viNBA~;Qb>_-8%2X#wR9Ent8!jFr8 zr{M+EyF2OnK6QKi9)ksDDOOB{aKAA&OCxv__Rzuo>a+H}q8Rfez6H9MDjiUtOW5}q zaG$Idu{d0$yYVX*Wj#A7fTkQ!V?Nj~G4*lxaLPi_XRh;iv_aGNOPW|dvozw4ywr! zhm2x=$_$ksqW%Zf|2Ynu)qwyZ!^0GDNPWHB5y=SM^oSGyIr>uHMst7<#$Ejvyjht(f!#R9_DPQ^6fFcv;1yf`Q5&|yUFe)mFtr_>{ePn`5Z zPSWc~R2F$kK%z0tu{cJ=;BLI z=q|^GD`ISzbX=`!$y`ADj;nnluL^=_BTF9kyhT*P^&GpE!;iFYJ9 zLKt|P)E(v4;7{Q^!|x6qIjtr{+!Y8GgV$XOJcEGQJpqeFcf3bU&!|=F+&9@^IudCl z2;P^?OY^LO!_76s17DU8g7SYmqo(79h#=*0p5@ zW2WB#Q=SZL$nUs>xlk+Tt0B%V0_^8@n$>rqW#=G$S5Y9CbfuH$)K<{Mv**?4qj2Xp zVmFr0a5UGYhk!DH#-3MSdZwGK!qA8l>l|!82#s`;Z_pb}G6r8yAg#M^J>99|1!$>< zfN?GLpidt{*0C4VklH;>{!Z{URMk`Rb$bSNkE(k4^6iyhd_fIT!XP8iC2dM{#l0uOe@{TZH?xvTymrR0&U1hU=pk#dZn zKo9~F;$jJ}lw*9QH1YsEQjRqx;$|32x%VJtu7HI?%3L~k4^oaZSwjIr%5hZjKBUa^ zCC{VR?yEg4b9>OC`$)-4p!8IhL`e_SRmyle@<5F*H{RFNA6M4|vr;a|1WJ7fK_&`V z6a<;bM~kY?NdkgvT-|;`kV!Q2Aq1K1OFo&>6{ssbghk}vdWeL}XQr5R=)s&84x212 zIOU&3n(E7QDi_H;Y&1);O%rgwTQbc%h&iX5b-+i2Y}18oGkp2X$cJo=m1ky}*j%D0 z$b?}*NHo*eT8}GfmLQ69a3#&+KINh!3oC1zEeg0uv$O~3U$O+qV__w3Xk0vnh0Lj z=C^c_FY875g@G(xN&MC1fCKMn2Op!HLdah!DVQZh9UL$~?#Y%r^5TP$E)pv5#W zm{oNyG1;I43M1pXAx^&3mwYMR31&A!`9~=N)g{oa5cZn#8@&|D;>-Q^&-PvB%VZh1 zZ#3nFvhud&q96i-ET?8M5M+gbVAwD}?<<69SNif;DF%)fR(2QmZ63yA@#oVp)`Xd3 z+bWY!gd84qtUPeUw#D?6a&4i7BDW(Y9Y=VlZ{85HRN`Je626}TKX-9Wl`gB zHbGfOS6nP!S(oDg)_Py8^^_iqN;Y^a*+4(VqRkti`T+hpanyPO~G7830d2%p8;{-h35oXmlJC#w z5-E5O(Xjae!z2fNF%Alo9P(ChNSNfXw*qPN!@?v-e94bUn;#Vw95pI9=8JJmRB+r| z!EsSR@n0$^78RWEB|pJ!-YfEV0plTiV_x(-{gA-sMx5kezB$Lo<&*SuBAbeSc07@F zu$>YVcBt$Wy`98L*-i@xp9`I){z+_(^NfJ_xp9FPW6wjlz}uhg(cM-XvQ8cm`EA= z1vwh=h>P%yi)N+%<_^w9x}L&@+b@{~!92QpiAJWf)%MFKFq8u?(`Rm$WxpbUB5Hqy ztZ8h4{i=y+;h0xxYZ@?19>Xl5&r~*_-f^?gAOq_fRb;GF)O8aJ0YV;3y^ciHi*F`S zyNWE5PBHchEl*>?A$-~h);H)mjdgnBrb!eah;II+rMFCpq&08RO%2xkgM&?L{*k|+ z6pK@Aw*_uEG=7`*m4+Sf2ne_A9SSMKhFK0Ar`$5^MaNxHB5i=n4zhnwbCRtrtAcB3 z>y%|l4F{OYzGtFh*(l}1sYz*x`=SshjZI73mpCzaZy*pmNwdnbPL2mAnqij*!Bn#x zD{wqCp@v}|29vcs8)SbZp~5ncxW1pF`f2QWDpi5ivS)@EYf0|kP-G^3Q2{hvBv8KApsyg%tFm^H{Y(P6Uxy`NRW`)d zUw|3D)Hv$N(xyXDN{bP4+ULKakwjSX=ubFBoDDBC5u2*|Q{2 zs6C5DKfy-Xvme9Erstky>+FLc0}iHyr`UM=kjKb}(3YoIs}@@y@;Lfj1<}sM#?R;R zYp#M#PyF5L=S}ArDyT7)MS|8)X+|>^%yA0~J&X$RDiw>f50e!-X7Q0{7)`0p$~tod z(2fORv|}bO$ieOCn4I6L&Pw5hj-;mJAqLijg6Kt3j|y zV1#^!OM#+2(E)tXMwnbI$U6C2A3=wnX75xPX+p7jLu7WOq(mr>cQV9HWF+_^-%}Wq zO&`}_)oP9MA;KIk+%dslALXf2_Ri4)$+)Z?KGc(+M;T2!Yp}YuF_IpRJcbf$vKqFr zUdUK#1xR$R7m{lVMUKO2McP-BHL{Hp#eAtaj>^_z4WskC1bH5U^nG!ak^eW|TQ;7S z)?ziR6Fd-PxH9LvQ0BVe5I9F2X51%4pYlb z7huIPJXW7B*^AR8aDy3Mni-ttjVESGbWHmBDjP|hGd(hK6?h^`vpl5KfLGR_E~{;y zErFPE`QaKe>RXqk$Imf=-h*3z@Z_C2w5Kj(QFCRnet9@vi-XGMlC>U7i=HRoioS0z zauRvLypY_YY~;q$EA?1%%6w7IC-uRQR&h+Q>hqSvepX+2I(98^i30jjnCaqSr1~%@+K_wfn5R_ zy~g<5?egGANA#Ch2zEk~_!WW=Uto!^?iNIRw(`Ed`>!P8tO6$yZ`eKS_HUSp|Gs=0 zj}FQZ3Y;*QN+byG_0)wXn47fwWE1#atS)lq z_x&B-eiLuynH0P^!E@{P{~g`|iRTXS6DODsP@9)nbo4<1_tOi`rpS5@QlFQYyZRxM zLUDYnAM)^&D&#jT3J1U@xAChJ92gBf_7ba9=CI_7VfL`3!~{ty>4+#)@Z{6GFR|2M z@#Q>f$YVcd6v`dsV;tq=p^1~77FJ8e{;{hhmJz|l62p*p2QvTq>R$AxV1{kfr?PVao|Nq|VJ3j21 z>vz1wqNDld_M4;3T|r`O56f%B?ozYYn3j6aDB)icgiw>$S!tdfU_2S~P)Oj> z!NU;a9$v!(@MO#*qZqn)B%AXeZ#&8iJaVN4Gb3EV*-IkAV!`^c@puA@+pL$QF^&N$ z=F*KzNCVzvZd&jLbGv%~jSRh|njXBtUar)~D?}d;LvzILD+(=+dwiAJH`F);inYRx zRlJG@u70u{?!q&ej28Cua&PFec-9g9z4i2`rf;!l>;ohOPU`1}!_;|iu`0HKUbKO9 z_$`)VA7ny|g!Vxc`ZjA@F3SYs2=!m2&K8AyY|o~VZ?o6S4fa9?`)FEB?T2`I4WYPq zSQ@;YU!WK@)F|){cSA$@wI%L0!wfjQe3<0*A9G=IeE2ojbG*dnrxlk8rv<~=>Eb)A ztc#>v<``$;t2CnW@1jA&MHz46@V_)@gd{}a2%7pXEA1XBAkmMp8Yv0!fu^+3-=oR$ z9;;Grl$Y};FM|AnkM?pNO>e!&8Z;auApEN{Mxx7;ThdagAq=lVfhsfus(1d}CC2=CFFRSv?63L_Au zZK~#^24!9hB1gAZgJ^$imK;A(AR`NQAzwD?tG8H)$5a91->WdtPbJ$2%zWN&mEyJ; zGuk&kU`dsx2~3P5n9)v?nl!VPfGFl|1`Td_&HI4Gm!2-gFeb3mJtSs$!aQx=rpAX! zbRPsUGdKZ1OnCcI03K@-$EvCPhZu8an!Na7!kH#7Dma%`g$8|yIL<7Az`b`C9sdxq z``IQ5->a?s5kf(8ypTDPMI3o9LO^(Dt`}i0P5p>fjhrVTP_WH0p|n1a&V9sQw$Jx~ z`8YG5p8c3ridbL(;TU`lwtzZ+%+fP5_m}3Eyk;v*tlO~Tuaxx(OHlgIj89lUN4}6iP6PAN5BT-nZ?b*}?Td-pvb4x00s+^D4~uoQ)|Z4*=82OrbhIsd9eXTKe#(~E zmzp&jonk57|CBvr`%N;2;<54Cj@7jW3?)Q&Oxa+7vfFzQ@Ro7%DA&J`X^ zwD2nb%&nlWKVwxBR!XKkl;p^Y)>ldmMdPvU?yRzHmC2328gu(I@Gm@TDeH%o*_N#rhQ6NpVI#gV#R;xWr`3Hlo5sXZOt&!p+_!?}jz)|#v zroq53D4Gf8{Ky!wfP@gtaPV@uh>BRnf4VFv&qC!9NQIr zQ~sf^SXITgSym6LZKl|7*qm}(1cY~>EwXvui?O$Q(YNMb`G!R*wryU}HnM%kE|uHv z<*;3Hz$;mDnBU<=-$8Y|vow0GA4|3sdclSC`S)m3k%XYf@gc2<4t&o}l-cR!z4I@; zcX^nQ`+LSH@JE(Rt-ojd1-soeuMdmKf96Nl+V?GrWt|v7vv`IgE@F>Cjw|{3z_^Eg z{F%M&*eh5nn6f27ioN-#enxf!bQ;^4W#P}%&PYCJYCe^PkRS zzgTPsyr2X51zp*zO1Xmq#Fc&UFU>jR#XrPVRfj5M8f`hu+fu`J#9MxZHg#uR!jGDe z?%_ysZrOv~u^lr(xZ0H7>B(k=A2%UDI!>-$e8p>mcy9A6y;!ZvC%ljoQZTt=iQ(F& zlX$;HS4VVK zX#wSnGe3M}@>2NAgnh8`IwR4ct22fIqR)CEXQhw{l==;Oj-KhulI-V1F%HH$uDGzu z{h}{>Bl^4ma*dxiX>y2FO~2qRxL_7|y!N8Eri-#Lo}U|!7v6ixTYQOr?#F7`E_)%D z^Vjra+5Qn%ILO@Qyh85}V)G)d3N*3lf0fVQbz6ymaS2QEzsN$*SNh~%%Vt{?`!!Ld zIE;b!8f_iI8r!Z5U<~lDQ|eHrT5lK-?Bd;^mxi+UZ8yCfZ_<*XthxP`fZ$$bu9{mE zKa6SiKTM#XV`VA*4|;hRYht@CfP4~mn@IofyOI9x!1Wv5Jy_ zqA9F_Ek{6ja(WK6nTmi#rEyHNkr$CTxP16!ng6~Ab*bLjAPcw5wZ{)7YdIo zjG)cqSlQ0v2Br@^YN;sIGE$&h-O*6XNKYI8q!vym;=2{SQSO;$cN!&lL>qb<<>BG0 zC*v_XzSTondCV0vT2SD;9Y=woC#VtiA0Ok<2MQ?uH!CX>RQ zX?VGa>wBz;N89Hid!cEee<0Nw&*E$43S7P$B7*0+CMKW$nHCyNUzUIEqf-Q# z*+-{{J~~xE%|1F+^wDVoD*EWOzx2`RqS)-C)Ble?Izym~K03oA<)57Ku|7Iekcd7y z(?eqF%CkWA^wC+Iz_*Xi5`A>G6jk2ZW%SWGCXCb;~T%SHV&x<%u^wIfV z$b8vHXH8`e=K=xuN1h>^iHB|$P~lWoA#CsHNHHjPJx4*)SbEGtSrzcO+hRM^g+1z* zr(rl=o8_9nih3(4( ziLmf8;bKsmxrb&9yvsR`uThs%z4g-BympgG$>M1j%uEt1$33K`-uT+vaQF?PdvolhrWr4gui? z-r;NDLN8{a*TBIvb^){7ioAtIv}6HGbLNA&X~&_*4$J;PY1<&57e)j>Ye&Fz)i*O9_iu z>F|9fY5&q#yJjq6Z`$^oAbttg{6*}j^MHhiafFXJ2WY~ttX29!QJ@&tp50OOt&_ze z;e%3i_Y7>o%W>rdA#u9AjOd6gP{p>QVde3_y=c(^9 zR>5|`3%NiA%h>ag7bOIS&*9UuiGM_W7sm|&v*UBiFE718cUS$ZQ{EK# z!YOZhWcwGVjJPF8gj3$)qqe-y(wH1`H|#9k@DG9M)ca3%>mi0`{Nbs>bYi&SZGp#o z<4;id?Z3mhBXRWnm8tSN+&h1VcNch(M#u2_^j#}uH^#)g_iDt)?+HfIsp(z;bBF6* z*S#-s{nudS{NQoi=U20|Cv*0vNiTo+clAFqx6F2tq~;zp(8b_kP-5_Cuoi!{wQ-hBS^%fX$#&V)JbzIN%T73kJUriy_vVH!JvahUIpL{Z2rVI7u^fAN& zuWHzi=_e5&SwDJW11lTeUqJjFi~VtFSKAFN#X7)5`ifR@+E$HlBixJ)>?7MiQNqWu zft0k7HM9;gaWg1=1J=l$HnP&TEDuo6qS+g93M|_T$)=MVS<`ZZy{ra%nqq#Ohj`J4 z&^w#hN8v+F2*eyp+c&YqP`rR}--1UV66x9|BtM*8NeP?T%lvQK%}g!hlZ{~J?hZ4U zi0xHBu^t~r^ER`gkvWn*)XM`QIbpd<=Zbi0;j=9`Izx{al22g*RolwiM-CSl{2nzP zVIOW{eBTpqdcN18d6|F>_1&ujjL_c1FtIzmX$MP= znIuXpAjbw{FwD_E6btZsJ6Ji}WV50SeKJ)oWUoa|5fFZ;GKeRZPN89i>{1)6k>}lsd6c<}{SY<(&+z#awwq~=1qNJSoy#0saU)k)ZeDG- z5)&VwFBAmOw4Spy30i3h|5_N9ThOSo5|eg+HuB>vW?U5ZTqO8(8)xuY6h?ZZ`mwZh zH&RG`6`cGW`TX^nU+K(l)~sBoi)y-W@J&43`R{~HAOB{e1%iP@5u$UQPzu`G-_mKzY0^p{2~7v!z<?_Bf8tJQO2J&579#@yUzrtKi>VO>c@~_+l0P9 z#=2S7Zlnjt*!y_At@Uv>h(GUKa-79G1xIAK@+-E!h6PcOT+CiFSlMv#)I=v`7PG_{ zArY4c7qQp!i^d;_HMbbkjWayFMwu(rxDn*9g6PA{HBPNP8U9*E+F z2UhV301oNtqYqHgZI((SPO`?5(^TY>aZcm#mvegg4(n_=JD#@PVNcVnQ_R7#F75>V zZe(TY;%A}v=T`BPj-O%~c(S+hX;wX;$f-wA`f2`^J=6}c=bA1!= zN4d{lGssXHEj40IMUZpT~WQ%WJtd4Lnk z8Fc*t>!jq-AF}dzRWmK`4Mz1c5}o!?{VAh+@g3_B{V8g57{Qp& z9y1!Q2JxbB* ziE$}hj7wNIVF;;inTg1`KD>|u12ol;t3G90F*4T=(Bd5%1_z?Cs(&qv&A5+qFtrWP zDnq3dpgn^M3n+ce`_WVqpmhuvQK=eW#t(;d2-LK+_w_Znh?9R)ZStFnQn8HWcvwX) z4Aj!_KzfM2*3YO_9{V^GmqZakT3qm`OR3npew8W(Y2U#sCIxA)E3eYMAT2F;!uCkM z;3pQWJr%kTInHT*`l31s%&e5mTv=8W3*LITHUA`RU8>i(dsP zRv@8xo6k_TLDrl$25ax*)zT2${Fol3#Zp+PR+>H!(fEtO--c)}DBsem5U8OiT?x@% z0NlutC$B7qZiZ^l zfn^=5mW0RUcKeazLf>fm(yGN8#@Rz{dLE6YaaJwy-#sxcFw4Ik9=wJ({tue_B20S~ zY*&YAjY5t;a3H+!D1z)ZE#BjoRcu;Cql*2M-r%zse|_p$`rf9c25|>GAk0H^ZCYt? z+h^0tftwPpRY~c-yFNeW6yy#+Zs))BD5;TAU+zYsMnK?LHq$=xbCNtT}!m|8%!_SwQ}XL=YCRp zR;ZYRhw7)KYT>6Bb|oR#jF0oD48F;HoPTV_8>*i+&>bz1eADrbtT;Mt*UDSA9;YaW zR#(ZQW)5u>B5TAF3_5h{q(s@bxV^h;8n0Mgg> zh@&bIS_CBrYH?IIN_z$PSy5Ue^q8wuu)A$EU5wIF!P4e5SbpX-SoU^mD-~q^lzFW_ zWmV|=3N`()Mo{e5yZjtk12^&)jbDEFm34PJ=;KRwPm0(5Ics2b6b5i|223&FlY(MpY|*a>;rz)>e^Udi=8 zYJEO2nVyK#`goM$?@@}sp%i`8YjJcT&QQv{yVacGW{v(jltM)S`E%tJtoQ_a$j$4- zl-K}-XpN(0wLDtr{7l=J$RII^$Lc6&pj)qs7Dcv2*E<}qg$3_C?B+plx*U%I;8iMG z`AOQ7-|F%L&?Vtn=4bENlWdHq+)%2R`T z)f^r@Tu9PVgLB~xcoB*sla02PI6jGq4AjM){fa&%D^@Rs(sb7+F*H0`v;9Bo!KfR0 zs1O#Yi_0YV@K{WrCRo11t?-HQu|DePKn77HlvEiO#5MQas(!*b(O23EmCBCe*=z@V=ZC@W2i00(rRnDAg- zCV#m@9RHy!g~+Z{fl^h?ivCny)e@4vOVH5-{xud33IS|}8-$7e)jEHbilGYgoMn^C zCQ@ZhtLPL9AO|9>(2@;*vZhmeP5aW4b&-x~_!Ry~{6)t&!MqYv9!its?BVTHEGAvT8z?)imi2GX>4gNMERVuW-G07zf7rwv(45r z+F;A#Ni=VNwZu44H@0E@@X4fjWWYsc487T`~tWv$Zu ztKzfMIn(u1Y*TYd@9&xNARaxLUYh<|1?o{roEashF6SwK!Bnt5?ywbZy^1 zmoBWPW$_^Bb5Cd$63(s!4?kQ}ZZl7I7~zO$$1BwD35|I?+s`w+K?irYkIH*aNvRYd z-4u0Wmrn*QJQFM&VUphgeDpBnr5(4+Ay0eFne;)LMVGM(8`el7(*`4fF;U60Bvd7L zsn@K*JMcA#fxqTFiT;0nLZpuEXj=9p<~%>qMZm%)PmeS<^DKH0t$Gr3{)$g&(I{;A zlvW7?fIPtVPeK_3q45=yL*m6bqm*xzN>uoi7ScFFm${E}qKd&uY!CU8svW z;uZ?2hk{ZhCrP>_&TYoJww9$Gd)Ef;@JMJ>G>V8QtlIM$`SYUP~a^$a>ipTCC7P}o4L zqs*dk9ScNJH|-b_9Y-(gTB+b!yh9iGQE~syPU@#?p|X+@y2hY{94a*gbEFR(SPT`uxq~HoE$Z zRu&f(Q2Gn)Vk!Mua6d?|KdW^GK|$SQJTCsMHo!s(Wj^7ErQ_eN37}z(vM%4YQIG~=l?2joPRf7prXQZyIs|Y$ z${P?6o%4cLh%aN&3tFq7sRadoj&;~ix3c^FWyQ0i;q_g zHZI5c)gN=?D5TD|Ko?$4#l^>?=~4^r3z+hqmRdc4Mzz$QfT5c2s)XkXPaH2Buv}3s zxymS}xTw`P)*u>?+{!_nuiXfw`fq5p{hR8+^j=G?GR=5Hi?A%WQ z`|((;_Cl$nKFUQACy$5cJKw|t){>!9+S__GRcsrjhK0y4IW}&obn@UMp5&3wekTct&qXJzGW=syo*I@6I$}F z5hzK2Px}n=S*iH5L}&i|_q4Ya%SkJB%s7X8*`2Me`ITF1af)S%Kh5nP6+`c~(dt;% z;28VoU&KaL6tQ> z#zZQEHh--3LH;u6$3y(oxIhe;a(N zO$@lFKu>vXwQ7{mPJ5Yy+qTp8C_AX$X9%KU-uRhT8-JF4hUi)=Dr)##Y^Y7Q^TERL zIVs=T`9F;ayQ2j)Kk{`N+oHUg-?xJnuhHpIb;20q^_a`iPyhl1h5!cb2bm=>U znwI}h3jvOm%6HO!3=?x3er;D6&FQ4or~Y4QA=V7tCcGW5)eO+8(slqr6Hc{%*2;xN z7(*%F+l-(NKWi#g`5KFfkyP(%jlU|NTQn(ENpToTGf!xT=?=Q{v*vDL%u;YZTh36- zw9|jRhQcZ)C+2RLoSn#AZFEFzSA~BABj9i8Z?sxLT=_?f=;Lp+A%-D#n1%@a)-Z%i zw9RupoR1;y?a1kYs6@MO(V$HF;afOG6UzHm>j`&{&smSN%k{p~p2seXoTkWo5U{0` zD84UHN+MTw1={f))*l(P|2rd=nM}ueYCqEKWpP3N&^G0LkL67UUHIN`!b(3FV?&!C zw26kqdrgTWe>5a!LgIgR9Y){&h*S^wk7oD}9+@u11>)P;H0wvLr?shG+B7M58m)}S zh-C!aOjfb#WzDA0?4Pu!VE1x9?vvWdXja)yT6f4ltCRKuyrrVa+VGaDKN~1De>NJ` z{%3reN76WWj>kD{RSn_9T@`fmXRUm*5A}4(L{3`&50|Ls<63@4D3KTP-Qnn2i|5d8-Eowx(3v zLu&Tm_M?N}X*I2DWbhGwbGWD0Gb{rEZD}-ekI-sZ*9in%flhOJ z8UD7O=JnE|seR=SgUQhwqj3h6>kXG{lK)k2?H4gXoiQ8mppRC{{Wap$f~mNh4s(8= zjv+=UMi);7gyJNi78D3y+u}#tn^jA&S#cMmVGizXxqY?X0ZsL7ex!d53F`MV9KBCJ zqhXW#X-`9xqy4l-Xho5%&`If?w6Cl?MJsssn9<(|egDy4<9jQ$2k41>m;L#lMXpbqyx`Gceod#-g ze2B>zsMV1}O#c3X+LPR$!UtYG5_v)X?F~VTQ^#;SanQSM-j;O8Vh2?LEVL|1gc;HpejjIZtJBDfKtT zFU-MKQzjkH(aIU$rVC^rrr}$)w=*tX$_!pPxhyHyr*7ZgJR$NjLvcS+9C%Y0z+Vk_>W<&|X5fxaLP)w$#C+dIL0# zMvu@!0lRL%5@^-_&f!!zLJI@>;Sq=yjikttm=>765_QYq>isU=@}tbb9aE^^NG-Je zhx#8<4dx4;|HmkF+lO0o{kE6b<2Qf09mlHQ5hU;=Wt7*Go*AXB=bmKE)eiHK>C89` zNv-q;^yTg{F_e<0SusF8r0k^I(fRfBu-k&+=@B(3cr}h@jn_T}MeGE$wh6sF0qd@@ zC#mfO!$k&7(CTA&*)c(D4VHHd`wlJ4{4}6`g;kXN2j$El$Kt@O8?aj)`Y`+CE)Nwp}XZw<@#*DJH8R zjj>=SJz@rWNe0!Mp_K{1ds-u?cwMTCI?sUcuTcLPTH^@LG26?rc!t5zF;hzp+ce$e zIEJ!jXguK;ESt^LTmh~0u~<+cBPk#lcMedGnOb_v!2ms1#=e5Y3fiiVGXysV?cFoA zuc6f!W?}J+Dda4z3I6Pug~5P7{ZKRu<6Z*V3ZOn)D-Tmm#=8gcu5hb9MKIx4OHlS~ zt#SB+{6IZY-<54#BSEKT<73&H;^t^+N=vFWM@vZj)83L*pCMQTfI|l$*e;&lVgwZY z^!=x)a9~_TY89}nQGU=|t+5hhEKUZ}Z%tg)11$*2U!*p#x{_(-+b(zXlxcWLED59h zF8+fj56z!QE8DsnD8q9;b@7?c+@`LMXlIp=T*ls1GZ&v-24P3m;iMHGx%jveOdZ?0 zT=dHVE#Isx`(sy1e*5=a?<(}`A}!GbAA8YNJp?mY$3?^#si^%i+=|iCRmv12$P^=p zi}Be@t_J?YgLRtM;#zD@T_2OVM=swv+C zVUj)OgLvAx6cO3Mbbcx3F@q`PH|+^th~-&qW(-pNv6dZ7Jpsj^rQ*+J{ILwSP}AOT z#!{_i21biz21Z}};YD*_oDoZVQN($LQ}(D=W5~K({4;{CKHbAb^_Qa~0yXW4v9a_& zl%axw%SG*xxm}hc$Bqt4k|>Jo|8xvRtboG|rm8Ennw&45VHo`}I`#@JLM%@QBFJ#= zMl?-Zp=lh!MO`Y#xaiB)r9<+stUw?GU8vwpNO@{?<`p~5o%l(Jk7EX*cc%4u7)@8t ze;P{ft@aOsix$KOrou&w;{)S)=j<{rssYtW2#lim0_`=+#9b6w>6c`>npq<-XyPto zQC)DdQY>BVmK{#1U1|jSJ2t0~(lt7^s!`nB3>A~BvYAvY-WRls%oQOAShHOi`=>ZGGue!4eYf-bGE< zYH>lkc@51dy?t<8-9|_V;Kd>#pb)>j2?73MT@E@fkr`sgCV~;G1sTeM=3*zx)t6p$6SgBvZmhtv4bh6E-5A z)P%C82F4+hqSdg?1gr9Rg&{(px|7%@t*^B^d_N4q+i^Q-PNp*{Hk>DP`oECoZ|Mvi zqv8en%$;;~uMG;@jCgH#s;q9DP}+ z1yb!DT4w;V%N~`0{Qy|}{U~zS$vEm*sCDE2=rYL~YvAWc6=~BgJaD&5s}Q_;x*MKU zOjmYkWdmnkb31;cq}^KCpd&*A9lu!wRh!+~K_m{~L1-%2rKM7Fq-?Q#&@)m2UklA zScO;SNFQA7Cm?-u47-~fY3wm=DvVtzq7)CQMGmbNCpsLGs{>(nYX0D046W)L9Gt)0 z+Ps58Kb_F_{l5nf$#K#XJq)~fvXl%SQrlBnu`-Avb1hCfeok8y@JgBmGl3nqqG{H7 zt$h5HBO&?@Ts(g>8BX{*%1ke$yo<<*Xus{PV0_BY`a4=99@e=}G?l-A3E?Z`7+xJ& zAPepWP?HNVQ^Ct4kf)#54N1alfoCY7|U=AMb>=*fyIR%;o8v)2z?)? zs~5DS;C{I63CYf+H@=5$ZDR^Cuga+CK&;2`HFiH48B6b7)XGP20e5)>q@0UL%381( z@*o?;f|oWfV*S(-a)(jLH|31U%_GgyICpF*MTu6rP~k7ZG34&_Ohr1p(`TW-PM_rMuq1aSIPbIqM{^Gct&hRioUGP zR8CXDWsE4N>BTGBpdcJN^T!7={mBst^lgB2xO!-&a!tokFSXJ(}sQ@@C7*zsylwXSK2!7El86E!L+ z{|6G2u4#e%>+;<-%w_Uv$*|LFW0qpK~pV| zFr2!)5bPx71~!D}QtS;#GMDP#(7s3P#vwisfnvZ+%!7uay&)c z#H2ezkD`Li7EY>sQ+pXY{OP6bemHIi~lc6}N{%kLVA0?5fhe^B3##g2`cjuVc}t@Nwm zPM3M@aG*@T zX`zXLBteiOEwl@1NkjqZQ84O_k|;_qu^>u~6_An$HtPF5XJ!MI`}f?>^WN|0`RD!Q z^U3VYoH_km=Q>yUUg|KxON)og!GRidDKory;WpQ8ElL^`X|TgGpil@N%GL80S~K~U zm8#!KUM?J^tew4K<aY_mWqI`#*){rdMc$NMYEuFH(p5$)(~^fMr82y*x>ZX34;x zvJ$WnvLL&Hy6^h(Zqg&-eQ|l7w5PaUpmd#~iakU<4a^Mfwq2TvgSe1ir>;YA(fnYk z;7`;u(TJ@QbiEgZuy=MCLg|h}x{MQlWk{eVP=1o`*)nR=hrfQ06`By%o-VvlAJ(dZ z6w9`GmQ;aCR7P?HRF2cMVTNpMQ?+EAHFwT@x#IHhV@&551dL(tYg<=d+Bx_dD zD3GJBM#&N#peCUgc|WpV3ZvABWnK85ooB6gnMvz1^c>4|XC-ADB~SP#KN|hHvVIo<%c|8kk&YTA8>_VX z#z{9_Gorpfij?1>zlU1Qu5Y4bljLK?q^*UHJ=27|c&-0Z%+Is{ucB_A7X8IwTv3db zRUX_D6&a;C`r0G~v7$n+U)6IL%~Ew?J=HWzP2x(0U;`K+tKSF0tQ!NsTf%vkW|*aB z7<$@kmLeicg*J&6V5V}e(ySY|1UL)ms#!`AN-4@B)fHZ+$1PHIKB*2Qco2h4@?q=W zX_2DDO*iPUMT$2TB&Z?$^b^ON2&;`y_pht!Ck&DgW+)&6Z&QL*iWAQwY0YQc`PT)b zV5QzxtzXn`E8OI5J=#d=2FXfmtx}NV;c+dvNuy?&qUe}a8bULi(jnm-rH4vShU{iD zzvOo7kzQehlTEcZ&tV(yWKWO6J~B2DWU~sDmzj*99-YZI_&g2@+k2RcJB3MJA*5vc ziGUF>+f_{y#;GOSX^Km#6_T^~p@%t(>1~(fb$kRT;C41UIA=h*BHOPPjtrqNMr>y9K{lh<;wLGHOyQ0-U>xE2E^5BEIb(%d?mtE5+e%bF7qz z%Tev_C+*G=$KTbA|PRP{unUh-EgQT+rQZt$Tm=3u0ew_;8L@6Y!Vq+X)= zxGB-5W|R8MjBu)%D7^&}{0oWFLGc>mi*$gw)rUz~JGTIB{>UAqC;_yLgPtm)fVdw7bX@ zo>8+D{_ZL5ZW``b8ef^80rDl?P9MtSLPT);Qz2w!^7ltrAN+Ye_y5bLVCVH%UFx+sgzYqh_|C;6~Cm z>{S11B+bXAePb-$O3HBbK}Ag8HKmFJHanfGFI_^I#{&(dB(Qf^8esALK%R!UOQ%X# zn47vZlw{!*n$%Dtizz_8A7EQgz8O{*jg7V2sH9fUYSi_^#!1wrr8L-F!eV{AM`{zP zmT4pZdAX%j9|yIBR#GRr(L^Far2DN<-K|Zf5oVl3EfA)RZ6?*E_RY|LBAr+9a(*+= z%zWD3OqwMA9zxU_H06C4VjBDOkWD`*(_SACpu;*hQxvN3T{= zR$Hl!SSixcbm?8nYA3Zumb=xat<0B@nA>B0?zkuHpEV4)%Xu;wmPc~WhJ+v_Lo;Hi#KWgdhA-p{X%%bz~4 zwh&0MgQZ~cGXoW#{v*mRIG6b#o$;A$Vm9Tb1%=a)!O~;qwSinTIyNcJO&<-GlEkIH z{G!hjU`lg;u+-Le$N-}(mBnus;1^?b(cq`0S?13S_{cz|zs2D6H3Xc|JgPNBinbs% z1X$THV`>sbLx)JU0*iwiiq*gZy+dn!~(XQWi~ z=l3Bht4;%-k-7=zi{E-isx62sefg!C$wJ(UVb}<_nm`hx-89`f!WxLV0{-2((nonQ zBRn{sw!)!(RdL2JwxlkbD7WE6SN`=Hl3*_GJVF{G8s9)fcFGLv6+<~KhWV&uV*>{{ zxAe1|0eOU=YBn_P))zO}q z^VMIHA+mmRg494@hxw54jjB=TB_GCs(Z-uob;XfwaUXVyDAnYWBZ1QOyQYu zjP!&bpQZDgdzr{P%4RegR9k1t8)^#g1;41P-95<XdGH{)nBC-#F$h4IK=WbZ8q3x3r zgJ6&}LM{01aKMN}E2k*!6KzcVi5r;kbOxprR!)#Aj7Sua)N70J8b6Fh<~TX;6nnhZ}eHrWG2oNd^!1Y$@S#rK7>euAAOj@OAUIPrO18xuo)fi_UL z&~}Lc8mko`Btr6lgHIw(v$X=mL_m57Sy_mrri9u?L3uKHEjNZTz-cVM= zlg1J4_^A6Zw~-8v9c>c>$0Y_~WQDddiB4qZW5Jf~;}S#IZv&{MKW77SHnmAK7+a|V zswzTgk0&_HA@B(upC={3i7)^Y{&#UiqMh!}ljP=V!Ow>Sd?8-@Jtvw3^}(O(X;jY& z?eNUY4Bk1|0GoU2?G5v`o7++7F7SBAZ}&CP)diBp9Kw1ih)S=AMObW%COG#~;mcB_ z63Berp*{h5=Kt;iPowqKBX9k7Heh;d+q6X2y+{MPk`gMyqS1*glDT7Cq5(vQPdA%x zp&01Aj6h+a8HL(_u8`@+9d{|%e^7B0$>ZtZa|ezw{yi{)znA-vKepF8n0et!H_|k@{4B12(Dy9 zb;GdMVz$qvC(lYbLI=iZ zfZVY*a4n8LeBJ;I5aQjy*RN-#o8rF;GwXwS$3K`#v#LRKs3%xYJQzy{=E48gSO&4N zbnvmH1tA?RCg*;D5K~5wBm94BII}H$I4yq~PK_e#!)elvUWn;!dC)0AUdP`C_Y7|m zAKW1IqCU7)0SejRIxv>{&^q*?4NY{gu?_mm*bZW2n`prLglbD0U~W3;A7I^y&crI^ zFMr zTc zBl_%^y$(g6nijxiqEp~Q=561;@VaQVdm~*0nRc=$h47xbE|(U zvUTj#Di`auvO6#87}zwxg-dADfG}KwnVYuN>uzMQ;^M->$HfZdYGym&-UzWGXr{dr z&JCz=e+He!s4Rxf)!I8}qtD4GEdL1tYKKbD>t@ff2_*)nCkC>?1Y6FTld<@vAxAgH z)@s!1RUem%031tjZJwW%nIO2^4DvhkXnwjV%gRm-GKtxbn<7e zxxEQhTnrrH{QdnI0cRoNC0s9N=3U}D&v_BA#jY`F+`gbam_C=M6K6b05{VqKkDXu2RsvGuj`z?Dj0 zDXRkeGqwE~)2n$E zx)fAEiEbbWb!3 z8~f#ysQF9qEZ#xp`$P4sdH zBY#6`1*EmXfdraIo5i|@2!@&CO4`1Fdg{l`b8t$O~$ z{)4O@+Iut+{-5@qM1RqkasIJO(lUN%@6lZcj1TWn$$F~7V7~VxKb(;UeQML(2Qa$+ z!?i_~9!{n&1Q|K8z31$!5o$c&dvq@YR^C7DJ(}AA-+Oew1OJfdbIM({6#g=U;uC@e zL#w~eBCuxqEDEAQtE41DkT;0ttdhK#Lb@M=M#if7Yp>_er%)iDMB^}Vu&3xVmmR(^ z!!fZit+b>d`C>^ZVw5B-^2 z)e>O@j%vYFm_4F({=n==p%E0uW8Z5RL)W&9v{>DZ#P$f?1EYg+{oKVm?^4UH%&rn~E9^5g>T#N87nQ4 z9-&2VNHr{HSK*XA|6p;+8`5qjBKfy{c4z@`mUAL*mThe57S>C8R z;k38ngvH3hjFAxQeHkI0_fy6$sh*HWrN)MC@g`hfYz>FPx}xmk+9Qfb?S?+ykmrIq z!`LM*>N+OVLwn029CUW;KnHbwG0;xU_DHM6-wQ}M5D}rHmF)qTq;CC*7+wCKyR@Ga z`o8oIYIEp)>22X-%KbnZ7`X3EM3g?xETam$L5Fzv1L!42)8M^Q8S}SPH$-|Uy#$q9 zO}Qmf5!?^!l}i0E_wq`m7*=*xXpmbkdp?6+*DO!xJoq_N`&s;bskB(oQ||m*)fl#* zUSV4Kku)BxD|BH- zOxs7PU}7i8!^Kw}^jpZQ;neA4h~JNqYHTx~4awnBH@&PxIoQeOr8aIlpD0g9 ziIt{~)yP@cAe@}bB5F`c4JQNLM?Vi#dd4Jbor@mzTlnTY_&JR~qjnUwVu+>P%fwi?}p64u`dCK+e<2 z7E0~tizLGVDNmce3AhM<45&vt`#f5c*4-Z9pv!$8jp7n7lX~P7T&i-bheuGKgOWqs zTuttu&O`-7(8`8Bt_kw8p)g!RWi;K7ilHq z$b?;tu>+scx^p>^V&!L4>jbWQ#Yh7_l@_7Xvp$=ENqosi!l@sk#EUzNYkdZ5fT|Zi=`Zf=AiP*lF<(fV z@iKIM;|MzQg%sksgNcCw=Uf+LL5zRn6i}@h=%iqSE`e7N0&NH4`ZHl$2$8bp{@t*h&k}NfO$T_klBlwpX^PM|aOjJL!|J zkoC6?%3Iah?bE8@#ZqBY@B1zIaLreT1F#Um?4dJGL4`J;CM5iYUqjIUU#$Lx&9v(b zs(<1hP}b&bVb$L%Shn29-Qq2Ot9dbM9wCT3kCQ$8aun>ZGle7J|8eE>>x2se2-J!L zK{0gplZaMiEtftLKAnwhqf1b(f_QpsBvR;Q{=95(TsS>`nSTK> zCCh8I_NMf*q#_$cS!NHVpLlXLxq3Ja{E4$rp@H>S4eVNipR@#_SENi7G5(6gz~w^n zD<_76Sv__IJ48C&zQXGqN~wo0c%kU#S=K2S;G(RnQWqpBy~+~+z>$@C4+)S-`0`9- z(d3$x4nths5nFd2fP_Pn3NWO3kM`BRYy7K73LPBhUU6MwCb;R>dA`6sXZg;%&I{go z9UJb?6j1>?mvkCCcUU-$c~UUZn5Gd4G`4~hoGUfMSQ`_x52t1}i>4D5k`0f%yjGPJ zyytw{`&N~_=tTZ%YNeEdbV>YXk9L#HZ|-V062EEjGfyV-n{3>mF3vXNVPp5R^oe-i z1b7EHYOcM(EhIMGkUAjG6rR{}Q`&^YJ8w$w;8`u0zYOuvj9;Xu@UTuhm{ zVw41wDP3*EtI_0!J%myd#<^@pwK0FkzApJ)YKPLA@Fa16@CozmAAA&=X`Qv{4?YUV z{*YwTJY%%_NPbx_K!q1OZo#A-q@dg?Co=}2>^_u+ohjESFJUBWXP}%6L-DZ=Ia=IV zNR@$dI+TAI2cuQN^2=qc?^A`8A<90q*kO@tgFu!4fc6g{-|}Z8ia~Ej{im51{3&yD z*(H`ajI6J&>SudRCh0A6C+3b34<)3SF?mTL9Waa;&HuU(e0gF)p&K)}AwooisLV14-a9ch; ziyRItVZ7H^p=WX7F9Y~Y*ORIjt}Mcdgr{7>QdZ>YDXFx@fGj#0FE3yjGwykEf*kTU z?)l~dO7qH$dsY`e22&m{rhhtJ_`Neofmile=ATBUpP!}>pZo+~WNiLIJB8xl%zVio z@X@h!-6u=IFYac{^pzbNGwn;1Q%rO2g~20*Gt>;z^dA}OVldPep{DK#hix94zn!tj zx{DlCMUZYVa%1MkA_2}Rj9YNgj*VgvIp2i?P5!XEvD7tLwh9ZV=x`}Kw36ka;(Ba$ z3mqOhRO4P~e#0UuZMXkxVGGoVJ-=6qh0i5Z8=W(iYC@B*n@KZ>s0z7|Ano25Ev zK$^@v-9xv#T{JySmQ1UPEzX0K*|Hl>xoI-n3$tq9ilsYg@@erMCzYF1WOgkwhD70= zZ?LO<@!-1hdjPO0j&C3zW-G4zd?N;mQTSck2#Rkc2V%vk=J1H(7LDW?qVOh_Hjz`{ zPfuA(v*PU*y(Wkortb}UYvFpla)Lqw){)ctvM;1RgjSepOKh~Y&4KhfHxaM+GvsQQN z*IXVXlv7D_`EIL~CN6_ag4xJ2lTU==6wX-&6(&I60bDS^X@wHhz=YQ;nZXe}RhBW! zJ?I(mfl-}5hweTi&jrv{QDhK=g>g;l(TN*w3w0?E_facDkckprxn~IsfTkFW$$5bW zKL#56I&FIlOJWT*Xd^Gjl&a2Q^~mn|X0K40H6;4)S{2VLS9WP!9$q0#YmP zsYvp4lv~3xyLU%97nd{IrGF=OSA3z9oGIXG>vTC!{MAhTw!-N0O1k_AWJ*j8`{!Uo+(_Tv>V3<_{c=8B&)VDSjZ(2_@GZ#=Bb6&JP5QWsYZ~ zy35HJ5q-vMqNImLge8NOZBcjGYZ?qgIpBj`NO@opc)0yR2YGtPPRs6JL{)|rVC^1q zg5~uh1ILfdo76TgP*e->j-dlj=^@ub=WpsE4;8wQ^9h-O^!K}LiKK;ddIr%2M`J5J z@r2wRFW-1VW{0yda)yqHq`ObZN=mw4W2!U0sHIW24hTRkwHY*!i57NHm!2{k!|ASz zYzzx}qNIuRub%Q87|K_kKM9A_w{1=H0WJu4$qT;gNlOcU2%?HjijltUCD+42(etFN zu%T$BUxz;_Pc>DVVfqOZ)f#TP`y@8(Z>alI@{2)J{GecFDjfWThpL7D5kltPvIi&{ z@xA3Z<9voUP-Gny9%9k8R9#`N$a;TpZ{GV=_AI*g!lJi^B}4CT?9F@M3@TTCBTLgV zWn6K_(*53YyzTpUd|Yc|h6pCBkL;pmedHk1R8$qva_qi;AK7X-zr)Mo#nGrf*zRBOp5uWz<7)bqB~3(C4}XrcvwjQzOm6 z^!Wfe3VnWUfE*{zhYa`En>eTs#MtLhGh9rYg=jUFV>GoiB}9@qC$Tp!*`I}XA` z!PG227!_Y!IauDtHdMG$BvR=R9Cfghx*Ct7Rw<&5`adJbiZ?7vL$9`>#kV#_FCBZe z26Z*WyQ?ry|B5`FHWb{3=IQx=2*)ll>}}Y#2Ufwd!^pEcS%%5XN6hn$8bXQMC&y#auBOb0lI;-mMkC*UJ3BAA~86WCMOVRxs}iKn^q zXfWM}|0yOIpr|P?BH7i#Z)9sh;5~iU_2V*PfAD)WJb>4JfN$;xbgxBghl8~Q2Yi!L z-O}N5v=Q*;aIKbY{b+H)052SvlEW!$g#4kH^BpyKR_+TAj3v*?kA!@+Gf)i#$hgs& zi8=*P<~TV#=<*6nL$NvAU@2#u{6sKkahPWS+R}vvjFg`hyQoyy2hcnBc3!j4=<#y% zK+Ql9K~^bklspI1)kr5AE{uX&yRMZ6Ops$9(}?G5OpLGDHjU&=p&#qq2}6TH4>7aa zs`AGkcKIhg`ES(T2PV@K`6L|7OTFlM^=N=O>_s*r|&2ArG<5+~DI8 zMFDPHHPp<*d*(zw$~z{4uS=&!ljKeqNG~7A{1I6OA({3}lG#Z5ss=Y63ICWRj~9P+ z(dg&o>cF6a|Jv|ak3+)~WIzXKIDEOjOo*i8Cz?1`46#s4*i9(=i4zTiyHLfWO=_h^EmB%US_)4qJ$dZ zbnAKfb^I=vBJXC8O5>r%S^B7v#!Qu&JS_9;U_b{=m6>!6qR?MN7bJGqt#uwzK_zf9oc=5CsWR=n652k~-r_)!{vIZO~vQR$0vqr_7<**+|*!~O}EeQx_W5Wm>|9zB!q?>d-` z|0sf&er|>P`1hX)4sS4J&(x+w=;^drdV8iEZ@siL6c~7*y=P|1olMLH!jhl2G+998 zomtq^Z>;mGp?KSQ7B;i)w04%9V4MGOJP(>`WUShAYq8d6VMw~K=s%x3XZXz;7Z!S1 zv;pJ@Vet=L-IV^4+?baTOog++G^~9I1?ZX4)|d3+vBR^MA+zyvCc-DPeIb4}XC-tK zyQ(%K@{!I;JZLSq&n(Ld^3w9zoRuh>>5a4)fZ1+TU0T*>ku`X=f{X=jx;0z2@f8|Q zMfVZ<<^1%sCc6IRcr#EC<$io!`$}p>QRmWY5p;AGw<;)|!wFp^6)gprY~);-1!Bp) z^}Cxo%$0+U8U!PB7i3f)m{khcM4@Dimp{p3tX&XqqL}AVUW^lCf9;<0TnKkpW|Yc1TgQZM>4I{WRZMG z=&zOC&*58RKEWWi1*#B#@lZsFF9Dj?!UbnMl(xS*B20w%JdSTKngD;Oe*9}JgI1y3 zjqwSlQ+p$v1M|yoCJ8Z?#V^JJ0j5{J@Jo`wRj-8ussm)`S8Es*u&t zSo1rFFl2=Yi@NfbOWphnZCxVA*p9x4bgFZIhs78Nl?ZV5qg=WdPWBDktS-bGbo?HkXk3!1%D@^qqjd&#>o%A387d4N>R#@ZjKR!c z$l5f3eYW)y6)lrLGh(~MDobhTE?%=-4iz!f`HL6D3kh_Lu#|CE&^-}b>wS_NvBN~? z^|vCa>q*CdWy@?TU5(=={M=T{ z&wwrNwML$Z;XAqpqu7n^u8~s$!H}w(j+&h>AlMhkO*eXGt(;;Tbnusxo>UklE8rGc`J{qCZLgY9t+%qnjC!+=LlyiMvloWw+$xQ-WkW}VC& zjLM$Ir_bffaVEBb0rO&`oIq(q>{ecdxIk`;uSAb5x5aQ}|8d!)kdN*2E=x@U@v1gz z4JXRZ#p_;^i<#$f&kZ;v1CM$GLWbqf`f9mK+-Xe;$n})k$0QZ_9UKc&G700nT)N3mQ;B%;SE6CqCy1o_X&pi~n4LX}SRDYX10uS@I@rR|` zWZ5`J07h@o=ngKrw@r>@PLxKq8TonuDnE5QR-f}hdP!wTy(NXJ`82t$GR*F*aVzYwW^kTl4NmSj3C4S{)7uT9aX0F-Tdu|D{x|0>=#0GG;L%1> z(QY}(vYF-nSpelvnh`}~r`iLN{GLDgtDhT@y#Cvq{~Gu`SvsY-*5hjH|gtI&x*gy>&LG(ef{FJz?1Nq+EgP^ikx5?CM zN)wsVp6P+;0Po0G>xL{0@+foD;k=bL9dm;nn<(_^0eCy?Q^!yTeGPC< z@W*!frzYo}0E7c;a?4Vg0kxO5J{U)xw@uX=9QROzD@xfY=T~k`6{7Pij;0FDK?|lb zdBL$4?nRo|(BeSkA6lDcn9bmdeN~N?19kiqjAiAAyzxoA@w8~iRMz%n-gY{^V=4ze zSh58e8++u){5_v(eIrx(r2!FC(fDQH*zA*A@z&=(XuZN)pQ4*9>#cuaudGP|*yPp+ zeD!`hw+~b$heAG<6+Xr_s+v3o!<+J8c=NX8X4MQ_cPSY?!7EbcipF4|E-Epu6CfwYGG>Tn`!5qsm-w1O*?E8}T{3#6O3-9*~nT zeH;A4Qq^0t^*1vg%dm#L0#IVW{@Lop5^hKtrE+XAw^3k9Gfb35RqY%cqT46%)Lj7H zUNxoZ^4T_gMIGc#Zd%pkNL#b2MmBrUbn17Ax3sy|?hCj>%Pt*~nR!MFZE!~%<|o0H z>`q&_wC*t1y=^{>-RTUSI*iqEhAc<)RlL;S0|So83|xJmPVN6`I^SKw1~i&JI0DIU z4xKzACz@YkMDr6W?~i~OVMpb7|Px@4DBqvNo^q%6aMQ@o<&=j|X_-yvYoDW_fpq9|RHqkR`5a~>5H481kZX#k zK0yd@Lu`mi{g(HXdg>Dn&zkv#oZ#4p-|EHX078Na{}VWjzZyqdzK{dWJW&R{_l4ZY za)KdQe2?Ckx(y7(NjaW>=4F5vaNc)bq&_F*R5#0tKMP~e7#P5h7=~I77Zsh9dsXvy z+q>vC)sL~RBRiRZ+QjE$kaHH*`4WRZi;dP#Bph4`=>9L|WX!)SRC!8{2-1Pnt)YC{f9-3C%o&$`htyQe-&;S_^HAf{a`;2T$0S6(PlI6@NDEH$;oEUq z8@|$=@mw}kr})t`vJ0T-^h&QDam5qP%Uc9QW%riLbH!PZ%}!hZG^%o$ffcDi9tdO0 zv2F)YoyrssUGMjzMMMCX!e}!#-F6EerB?B<5nb?&yuM1WXykI1M+%G#9;WhKy$A3x zOgTh(<#2!+Oy#FK=`lRZdYWoNE0}Y>p2rL##iZet*5MFrOGCgNd?(izHv$+{I37*| zhK;o|RpFtY4^)LlU2wxBJsLJ*5?!b{C=9hPD>O1)Q$~|pS~OB&_}Cor2V1@{BUxxf z7v2hLMO}L?K^%wCfhKbOASW?y9caxS>hgm;-Y^9xdWY?q7`pHSbRrNXR6Yx==7b+1 z`NFkh3emi1jp~tuS`^X3 z;TVu|B!Xt*)+L!m3)G!q|6K!^F)PmO8c9AT4d3fYq25a;jZN-IY7Q!ek z^HhRU^UFkdYbW?yK$cPH)A12F43~dlI5EpA4eM_1w`Igr*>a?$VDH-7~h$8-;eb1f|NHl^uVn=LeO>%dyHXra?W zoqv|68fL!lrLsfqVxXWd{j_%m4Lsj5j5^(re*mLi_a=CqmsZ3&=TZNg$hwdg-jsWY z-wIT)Wt5wKzbW?#UvQQ=1u{Q%s8yN}^jKHqgOeWUqM@BeZ79 z4PWFY!>^pLt@|rZd}Y-8S8PS;#Rb2j2sDv{mN(8eyBIRMB~Am4FliRp;M5+V_X9yV zzx1R*i1P!ahbGpIWTFDhE@v5_wrFR(patn)o zFL`gvEpZumn|)q9>$YqVaF(5WN3Ir^4@IVKOr#lz!-rK<_1K;HbnFhaL;1y*?_dFm z6=jsws9U1BqKt2xS$#y%x|1srUgN^!X0bSe3a@5(TJg6T{y7UP08Nddp21hJc2F;9 zSNN7Z5B;E*g$LzQPtMh<6=loI68&KAdO?Nnm4k;#_|c)jI)&|z&f*9^sJmWgUF?a^ z8H76d?#pt}F8szu9N_$cGVVkF+l}Vjms2bso{7h^a(eH+T+RH`2T=@PJAcDt90;i8P<1LW z`isND>5Ql}2x5T<=dp(d%Di6>fWZc(pRkYS81_SV+*f0+m6$5%3+) zYUiR_LCV5py+VTDZQQTS)2eTPlRG-`e2@~0F1i!MYa69yd)cBS2kIc4;F@!63X2& zAt&dpa44Pepo>FUf|>b^Lm3f1w`vgi%yeL8E_#D9LzL>6nJy;?t9AIhBdXaJ^F*j{dGenVY8~j*bx>lj1)a!Oc^thkZbg>1Cwy_M;-~R<#yi zimwScLY6wCJb|^@y=n#S`LR$XA?VJQ2%>QEFpo%~W&r@CGy`Mqwx6tg+W!2KC5nS{W`=0&>7`U&iB}Xv>n;2bn&4HRUQ6Er-Q zV#!+Mjds>XD0(D+5U zd3|d7>r+ju&pJh~4>O9@lx?}^tZW~@@Bv*=l+S>go-Z^@1L@xJvK>wYUk;sIys)~G z$Ts+*8cM4U6@~2Zk4*#B2I>Su6~&<*YwV7V9|x{5PuhWap;^B7t@`z3)vq4>7d1^$ z;>3zVdMZUptgog1PrhUMcSR2Paz~01UR(QeA4BufewIA=x#z*pceJ1MbBa<2huu)m zmk>a&$S~3)HI-SQiXYWf2I7)jOJNR#$7?COjUOWf4rMQf5^Zg5rHw`RRHi!fZLp!Q zjo}$h15*_Q^`O)=B^~tSg*2rUAGfTdeQeV{4z8=TF>4>wlXaEn@Y#vF{ImRe{Ijd| zls6H)qM$zRM$@(W%5(9R!oT4L*s59nOc^L0EO z2p+7s|3uVSyZr>u_BYDL-ZGLG`aplp$QtVsKf$ww3hKjzjlBcOi)`?}qHDSx7^5Xv zd;ZnNXd+hIjrS?7IhNv|X;_8#l7~h&SAs;1d<{pKa^-0ZM_Kh)54e%x9RXe+hwuiE zC>8(p(LZ(T-;MscR?2)%iEiwN`}F^}ln4Qt?tz5c(PbqChp1dpKK%!hM0X$kzcV4Z zvBX$$xGlWOfJEK9!=mPtBL0JBHsSq`HsXipFS@Cf8L1oS@{neF?;iW zV<^PlhO=HOFDtGyZF_L?bcZOt&^fMUd=+8 z+pUjM_T$PhoQ90x-9mR*V;$#y(##RqrhM!tYPQ3gY6F@bXX9B2)jG~gF8breY&(rf z2d{0QZRyG+Qy*jyOsZ^gQ}fQsBw+?(hdN-tc4t6eiZF&`i8pk^W?UaKY^DoADOuu8 z{T;4BRd1O z>xu7vpqV|<_|EiUPo<7|xdG=B3+4Vk0w>~LI5PZ9je03e5f-RNZW+}}>5h*|d-1b{ z;Yp>Za^wagp~4eky9GwVRakx;PstA;2|@k}1SV8iti+$6RK`Ol=OEz~Q#ifwl+p#I zAAL%B84sQL*HdCKImY!?WQS(%cL2byTn@bf&wPXYaj~nkM1Bi6o(@v!tGyK;q|zaM zFi#*x<_3Rl`zSuk`><+YR{Ep+fHCM!1$`8+cm3B1>h*sw97S29db#LQ zUu7(Yw0A#+nVH7qUz4iCE2yNOqTn_*KMf+S$oxn1qlM5w4PuOqSZsfVX)rCYk>Nw$ zr#~OASNbdc_+u{>#GC`mK0sk1XDv|6@?>2HfV=#Pjtx-S!3D4i<4QB62vjwID~=*D z5QoKd>NHSkg<8lII%ABBK3zM&L+=b!m_^aCffyPR)cnHnHW*xu%TyRh%Z5zlQC?mR ztvq3n(ncttc7w2F)==hPr4C&mgz@ITyC5`G(O~6K6i`zuAn0k%nKyY_sfJ@|tDX%b z0|QmAU_}t%%$^OwvpsWeDBXWr$z$Lz|0yWR@ga%?<}TwzV;5PUQ63ZX1S&Ou=PJ&8 zMzIOPR-C*o?P>Q=CDgv=doF%Mj}?4RpAJE2$RQGQ-s}0q?=UL>pCunS96Q~BOH3=4PK<&M^ zTVxQ(&)m;p)CZ%$v84%`QDA0D>u_3Btw}F>bC|Lajz#KlWhpLS3|E@MU#w26B&>pJ z?^t5;&l{=>%!5%KVRjb}8lkLW#<_(fyTROGq!Mlzslv>wo6l3+awHZe{55^0Vj6uk zN?{QWA0Lgpdl#P`tz-(qJM_p{rLFy~xmLtjRbPCCiQE^BRg$Vz*@FAL~%nZOpnVq^I0_nT;Of+_)l0Y@bDOLzlbPbA)3MVRAv;z;(#COK=RRZ~= zwUaA<(clEZv?8fX95oxSFk6X0{+#-ZS6GZySbWyH>86F_l_z-vclaCl^LXAs9bdEx zKk}gl=B)fv10O}(awjOvduq)DB^#|l6o~#mKWI%9igQv%uRVx^GErf+Dxsic9wVfebOOZX|ETx=FkhZW@pr0wvufB@*w$$#?9x zaQb-?CyA|}Q+8NZt}wz!p*Q{hoRV5~Q+u*fzv^cAWF?8W`G~*GEAb>@g5Qb9=J!8( zsLdyr(btnf1=o}Pd3_iW+GR`!uocfML(%3Kc%?1mZT4X(%Ae;uOB{TJLc%Gy@<13p zK1E@M<{PF!#)m`o6rRAFuYMhiT`6U7Y$Eh5nh=i}kocf_x#p&MQ31w_*;-Nb;KtR)rtuI0z1|9F~GnJOc&Tv}H&y1-JA;O)R%3B~lg)_EB)1g^P z2#9*+S~`Mu~H_knaxwsCWJB7Zb&AF%P8yvz1iwcWg8L z1RoX6R$@#$-<6yTscg3LK1;rMjv`glj{R!{oHVtcDlD- zH|Hw7!FB}CQ>ux#U@JI&06Ul+SXSI^o-$PsXI`Y^FDu2^8*(oWcdht2r4J1p6PrYR z*C`&H(rcw6EYBERVAMZ9&ZoV=B$UBLtJC0 zyai1XXyEFesrfrMcwvs(m8?Nj@*+a2{XAb`xMtZ4lv}t=S*ZLfbS}@e z;q{fBY2Z75gwty)l)cz;3+J-9EmKKZ zge3+2<+?i}a!FdrUKW455~?cXrmj-P^Vbmi|JKt*M^-6|@c2ZAFC1((cPw)b00W&@ zZ=8o5uh%!D)wzQ(-N zU(0P^fleZDO4qjr+E^f~8saH4STMwMp`2CmR!VqXImyf%GJ+eTs0~UiI|+&Tm2We3 zOzREG2zGDO@Aqv`YO%yEHezx(m9ZvrZiG+{krN9JmAff>7bbG&jS6!Ps=PHFU>X~t z#{<~ThT)J8j=R&iSlXl*1oZUYsFZMO@dmgyIQYB)-HS+XzoB%*8)38ZjCeDGhHnP% zi!S-(3wRrBR+91i>&<+VVLrA+b6q%DY*EIs3A9Bi!P{0_S-UBFD>Cg&o3<*CMxV+Q-#+@|b+6lDMjO?GOK z6_j($8A;FOb#_p%8{dT%C+$>%MSP7&$%Dl&PZqCu6J-ipXzyF7;Gv^lXy4AgrBr}g z9Nz_MWuS@IC#DGJ_Gp21A8fqV+ zM0o<2lO@WF$e?$rq68mZ4ue^kx%(n*-e}r;R`EDBOx*x)v{z&Y_9VJ^77S-^@_dLB zq=8z0h&==5s2?iT^Y3_b-OnPN$?|vm* z{3U`;?nh6E)aQV*3rU;@A4<~pAQXfcyMti9L@GI`v_-=$hqz#%%^{_ZW!`6)z+lB* zIK&ffJj4_Jc8Dizaad`HuO}W>s#{Q1H4q73Kdh|M8+?FO7!AIlH@L?U>`iF!`6Jky zdQ;P*N)0=D&Tj%4O+|;42zu!#6tE%{A643eFdW1BLf;HKrrd!g_CeiRGDf$JH^bJQ zGaMl}GtM}UY(+YITxrO%J))r4JH6`YCHc@sv-| zEId8*nX(>BY4qou!F%U(94-uG{{ml#wCD?-^ph_j$3{~3msks(DgR4lNgx8ydyO>% zR$D0J+l(mcehP<$bQ*R_$-(8)DNyTlO8N@J)wy`-SIQptdDqiQYh0F|X2hE^e~)w# z{W#V^NoO!f>2&Ih^0*O7)r*w1?tCP*It%iGjy|i5W(4js`R1)~(XF$nb#Ll;4rI$f zlg=q^qx4ZoG$F7HbHp&I{sH{roYI1Qdxg%NS7NB{d42$X{5+>-tIzWh|LVNb2!)4U z;1360P_m4-E$Yv7^c#FpaRE931NA6Z8soB{925yE!f$vp27RM!#a+m^O5NaDq3UhD z>%-9ZmlZb+`W6RN1I_uCQNZHc-(pRJZSsDvB!(Y`iq9ALAo__3p67>)dwq{x7QNf; zM`a80z4xQ?1Pons1#OvLy`&`3f{RKZUeQHxAQ+=dyjE>4DS1dZ`$0mc{ffQ}tw%b2 zd|6>0nn6E7*KMGjpOk0Nc|ZQ7yo-m0SCk!)TvXas!p9cRs7ua zJp`7W(tZ#F9?XwxDfTDmwTphp^Y9EmN5@a*Wz#1=E>Y$}+V(xptcU)X7fbmk z!PEv&tMfk=a&DrYnES<7>a;e#&dfZmGBhY3t?iJ6!=MO*@Zu z{^Tj4+&_Ox%*uDC@)mF}uhEKM;j02Rx9*p`R{Z95iknxGK+(VEY2egv$iMz^IWxY3L$)=}8y|=>knge<|oo6_%<@oue%y>3|Hf>M!(t*>U zWtEIGSp0Un>kOPLKoMubRP6M(v!aiu&!Wh+wCAjl!|~??=tIvzqaHvz&gET?lKJQJ z_*V7m^LgJW_L*f`UuD3|@3b-aa-E`a!_O-kw{cL>7`skYGx6x7YP}s8><+|LDP0W1 z!UuWL^opvD1T}x8P|dbRaF_kt7&mpbYd#)jpn9$(^_049*}O4T7H<;rblWly4FN$%mz+IYOLw>aBAat z9`^IhK>2fOzAzPk<`Jnm3cnVzz&}_gt4#30b$!|NSt;6+^TatMu=4$ zuNe`;%!gG{DjrUXi8Ln(n;G1WFGSmO=mW<=XAlqGT>TzBlc0^j zoyb{eQmq$S9g?I8zMCY__imDa<4lsa4BuW()>wR>PS$$yOg%+U zWCEwRC28?=dy1I*`%|=`SUoe5R~c*gSPHfor`)G-hMf(?N8e;fHaX0YkFj}}D}hZ~l`MBrHB^m1 zb2V!fS=EZVnWyS^7Pi4!-SKCxXAM5w-Nf?x-N|4i;qLe|SF=J6gsYWuwc4SLuntnf z_4qs2vtkg0>&?5MJ9z~?T#Y|-HS0EAxZ0v}s?oIMzgUA=WEH!>!Q8C8pmiC~B-}cG z=GL7Tpd1Hq19dIA$ZEaXDt19o8FS+Wt;=}R;nw*xw{AH>hhhJetJR{)I%W%3!qNk2bk9GE19YXKeF`44EyJHmmp9e2?3MGYY2R!4 z8C29%yA?+C!%elv@VKX$)(BUy6(^4JmNx^BhjUm@SjuCYYggITYkSh5fBl3YxNT}2 zRGbf?aV@RN*Pchk>sx6L=2Wn@LudMK z?U+3KHMn8mTMNU#_U4$!5eKVlJ55ubs49N5!y2`!aR;s15pf_2Cz;!NY8jOAeuo%k zT9vn}cG?cF<&qD_Xc4niY>vln9y6Wxeu!p1@1d1Oyoqb`vc_YVYcc9KjytyC# zVTVg-&*j=Nem{Ah<_ZO7AzE{&5? z&n!bIP1R?!@}*fGtH|B3?=LyHLb|O3-o9lL+#&)>r1C$uPwn6SbDv-jE4>nqb$1j zuOJ!3Jb$(|LUTWF??78So8Bt>4ca*c(A%Zeu;Sq#<7wD%ZISwOZdLRMElN>e#lX~Y z_o@{hifiS=EzBFW@#;kU@mcFca_y{1qyC-0i?ZWrfL$b$Xvd9Of576uNoauU{_%^9 z)cU|pLf&s1Z%?3%p6S_?ABpKbcN4n6!T60?xVdq23I;p!W>(KO{z?n_dD7H1@@XFX z6~YQZC2Zzy{&jpMXZ3~hhCjN$v**)Bzn7Kq}QrED;wzm3+WVnUCN)_7BT z$*o%J5G+0++GIT9Yl~BC0E4fG(895B*64AYHb^a5Ml){%1wKLhZ_{2;zuHf8Zij~Y1Z}@vI|FvM zHJUR2`9HM)Ju_Att&~#qIE^pl;@-)~`x9v7 zIBgUtamP4trBb@-PFCk=*`3%D9IDE{OKYyE)nC)F@me=PT0UNT8<5_3x7O3kkiKgR zgSzVOFsR4xhIacJ<=-Qqyy_kSWzjuaW^j=WLUts^bn?~oY8ak2<#1;E+S!}Cwb z)>3-vpJHi${!i^QEZ|rFg%$zbu6wmkZ0pgGKfGBYHNQ`D1FDYqX+7c?s!k!G(2qfd zLtr>XAc@A|G9I(SPI)B?5Gy44M_ zuyr}I3q$NV%$9NxiN6`d^!v3`K(zRNYep{%K}5gaueFWdehf2;`mGW33IOzbKmc&p z0|J0K4@dy4o8Ac_0OYN18vvNR7zqyr0M;>G!fyaj9uxqiKWI(VhT4g`?Lj~gLO}<} z|LF+`;w2zB@SuReU8Lz6P|#TpFFpjpWlZ6?83YJchEQ-B*H!6=B~vfL?jetnMMz31=x$cjdO?%T@vWghs54!(L)e+1L){O*oF?E?h`wYvqxA;DS&cd#B%-jI4FIjV+d(8(eSLByAT8cYH+agvZ^F zXjg-VHa((E7In7Rkd(`fIBb)_%y3FG8B~p8agS;5V)qs(&%*BQyT<@9BJjS%{!lHa zXvy{&dzw(mN62)L==-AT<|*19u5btgbmE`x#Hy}O zYX5SekJm_R1!R3?qrgsFJ!zh12Hlb7erdPmd+IG`Yt10bzedcBfywyvjriod)%=E( z3GI@xfj%JL3`531tuby8JIsS+g*k}|u1L(*T8Op#xMIGx6lvU{*QL+VS~!k}Q5sQ=TQ50tAo%nP*5Nb_fF(D*@dlRvq-%=gchN**0Q zHzTgZ+92^6yX13e301e2 zX)vqe3~PZ_fO8XT0~bk3%#{JU?EOJbI=Dbfhe;DxM1Oe+XDy2dN2&`IjvAj#9iP?W zpb-{6dUY~Yymx0IZGH5`B+5V0K8^N0t9|7jgOv5B&YwT;EbypgW+{eSM1EHhpaF5c z_(B)*{A4LTkl0O=PFuJa5}TDq-5%%|OO*>jR|Qn8^i8Gs=d~oEX>G|mpB0TA1TPHV zLK=HtTNonx55Jy?%i0zB z6Dwt>)-E>WJY*K*J*S)XIK)q+?@oaZQeH{DmT1i}2Yjt`?CLp*^!O5(whHL0B^n0; z{QFX^UyJbNT6nEk61lu`2TToYZ?JJVY@fIfVMA8diIuc>sg@MOaESD_b}F6w_f$$= zrX@SxE^Fl5h{Ip4W!}U}T+#H~uLvSXywIwUlvwZ=u4t}*18K=7s@Pzbc0QIw^Ok9s zDeu#+W!g1xo3m0Qc`O?WvI|R2iKSYw931I=nzCFJw6X-d!v$rMT&(F?6=I5U>5umP zV}4?i-=V1*D`guk|13sz{2Q+9qm7*-a@Zc^N}uUrRGslpkSqz>S7ABa7E)*f}<{^`75#2z-H~0l9X91 zhdOA_N-fvBYg&wX!e+id5odu|=W(xSO&y0eBRU?LuV{Yoh6tQ6E|`T&Y7f3*6^B#9 zf&Ee~TEWFPyb?h1eXnR)Q4`8Biwc~BPRxd7YuU%gBSWtm(YjX7lvwG;$dU`HB=|>R zrPPuTJrl0N!N!*$97px@+Gz-fH7{Tr2VTDaMS&W}BCQK%*wRkn7-o@%SYcplK;9xO zkO6e>BA5nn6ut7>@Sj82~XE|s6vd>B9Z`_+vb)r(6o~+I< zrHLQHB6@(9f2gse9IPI6ev>u=aR;H)AnxVAahT=ZreS}1r=RyTCA+Rqq{$n>Sze~O z8@0ZfT*q2lxGotjFP=h9E9MK2&DtcEY0f6CGupa-li0OR*rc^k4^N|4HeuIxfND00 z1%7&y#-UeXK;hufqQ`lgHFn2Cbjl&{gjlm#8Y)?Pg_kFMJ;Mmu>sycH1=CK{oVOg92iUB6R{qJMAKIM&C$?OG?tw~M*azz%GI zCy}{Bv<0FBAKIa{M1yPbN_|^2=x^f}qed`W7(y^4zg&XhA%*UzTA*>a@NwIw8LnW6 zLx5_PYx*VAjGbD*@tWxS^_`;cT|2e*Kz}Z+7$2Ds9b+~T#B_C4{zqECseD>Bc(*np z63@ynwU59}?&@DPgmi4E&=D*swz2Z)_tW9sigc*<*GmH0+W;_wTqNG&v|>R;bz z4@Y2yZX31^>9wA^If61r`r=7Hq@{S*y%UXNVRLnjTddQ4oT;`Ph8}S>9sl;WVKnH$E92>orbE3|_Z-pQw8ISX*i!p4JUT41 z2O_E!D1rq)?Zf5z!p3mMT4s;E;#4_qr=vMg>r@Orm2>582rRSKjA|X z`UyX=(9cr%2Cs;m4ohEkUfYRye7Z6+2!r9ilG{_OinX?XSLn(gVf~&?=1Mz)!u_O8 z0LQRQ(zsPEI7ZkF7#xGWa-Y8DNjOWz{*2><(!qhTr!`Hi z`sEDvo4+k8Q_WVLIu9eKTJtVd-1I;u-Js}^ku~o^NDrb>ik|J=h~MV^=_01j)^};d zzf!WiZfSWpMY%#+r|6wyxg4T-gY*$`dj*bXYT)1NSM^cKR+^&fSHixzSJiiLM}gTL zv)#hFEn65wd+fj4lL(p;>Zxsn-bp}&emKL0%eR6ajL?hG$N32TSCICv4t)>y3!g>m zH}M(ypquBUxZN`IIvgc%t9nF~ZhDW;j5I&DnU()$OX5{j5vAuKY~$7_y&HVa4RS>PeA~4lF?WRofyJ|7j>VfQ(Bxlc{6VkCEghl-ZVSakf zrKd}*Aq)br79GY~jZ6OrM%34>Uj?j{yY=H3*mRHn9tJeFK!?MtS7+O4@s2i$vwA!o zMda1>Rc2G)&lebua}@u~DltX_#ju&F-X zKyceCpFSFYHHy<)G`S(5)`~p8YF)K;Smzpc-}4FzM9_$vZce7hYEd2 zcbsl`o|*-}Ui0}48MvN!6(z*$&9%x+oqg+4LdOl^$W1bijSX^R@jRUBK{)%5pTnha z>?kM1V-SOBQ0Ih1`UFjgR&zwFPF5Nc^!7?M^+~|wJvCR<1r%;7X?hm<8Bl*jx5N~h zpP(mVSg$1LZ7|3K37Gfi$(g9%h?k=i_3n7NEDo)`ihKxk011LtgjrT|KLNO148%V9g3QOx`oR4jPu`@KT3lJw^18 z8t&o5xalc$SF)aqu#F=@Mg#ARk6W9un;W!Yc^!K9Ov}YlQLLHAQc$ zzJ)}&siRWBfbHgyY8=W6ppmn0ye{_ZCC|kSrsH1>hd`K^GDVq6V{X7UV@>~kMemRDC0+sIW z+8&ox5Dw>Pn*IW0=*)DzJYsNw({|iiiYV6^ppV*cFRcDe%+MQQuec~f&v6VzLFA=+ zsjmR?{FLk@tN{^yijzyxpq9>Nlv1W>;;^)Su+@PJ|^-pyF56UbHqx z|Eqd@dR3-hzum4@PNTSyS-mO$x~u>lzc#BI-8!Xn4*71*YDp6s>rK?x?6my)Yf{K} z8%phexE2{4TlT+%jH;Miy}1f(T$-o1#A9Th-dC+eR@-)Z+lcS6+K|6WPoqdpZ^N(6 z5~RzXrs+|1wWc>#zgKBNqhsRDEfM=v?2O6{JrPVmzZ|>t&F%Fe>OPgWZA6?QQK{>t zdLFkL&E--k(hz;FxK#f;ZfZSa=mP-3Aww@f#rS*E8vnR=QF3aGT%E2XND(o!;)k=>YQoe={AY-mNXH&xLgl{#Kv4MNNoD$ zda7FfK9w)^W_6IeHM1OaiI_F6P#Tq}biXU$mR1J8yJyf1i9eNT`%@CgEPbDpo}g_} zuaKJc)H}NQyWi{gLHg~XaXm$sGkc0ISM}7dR)5SO?-hFIh?5!csju#|HHB`z0=yp) zD6i00xz?8Y+o>Zl7bh4qZj}^wFxFthC<~E;^|pwq z*?F*jFVd7(4F&*P=$FB|Ke9xHV^TDt*5J0%ClmxyZ=;Q;seh5bV0X;qhJ^xJ0hUkULz*$$JjfEd` z8<*PeH{;68f9JvcifW^waN%^Frtesu6H9B&Q9;JS|kOoCZrqi9#>nlIEixS7IiSmuA15-eu0k$^X$s;_wHl$XL@Avzpts< z_b`&R&&49zbf5k<##2)b0eOf@|E~9eVrf30cY@%-ar$^f-E4V_-U(wl!8sxFADNuM z1M*PO(|XJWqw+rpnK>MLRUv)$B}PbPR+)!&iood|N7e_nihH$cP-p3`yk zdaHhevW|}33OLu%>l5_*QFZHW*vG8;-eE!kc)uDOFQ72zc6}(0+V)HY*$k!g6ZNzU zoiO4oBh)Y))BvJeNjdgO%B(xYcEWtYYO&ZZT4Y_f^ab5d_uZklf@A&CJ4Caa?~ogZ zL6h`d^v)R2#^FCj8-J(#Jrg68!~fd^a##|`y8nFwDZL*Aa##|`y8q_{@}4A+_ZlLQ z=gN`?%VIk=WFUBKJP7$EmM)#G9&xkL$e^J0syvV;Ep!=x9`$(WOq`lxRUy6gxG zp7d%J3@rN(c~{MbNi7;=TOH`<*}9?bh(_qRhm-3uFF~6}m^PcxQ**JQdi(zpff6{_ zW3*wOew})96O~-qD2rmxf9;4oxk+pWMBvZkKNfke7oN>#^|D;EbY-rYVis>kfu~YK zrm|4tOY=A?@)?fwvx%^rTSRjW#K%m*roVJ0J@~9gQ#UN5MbCO#!eaL6v!1MfY*>~% z3hIa7*2{ylA?|f_&}QD>%cHu4@ehBT+JRG{cpLf~>yZG!vsgH$_%_9bY#=gNCXP?| zI%%xSg)?xNo9_|>7}Y2`!$o_YUk;+P^YsDhsjakiL*LZMQ(ML81CcqI9l09ZaNrv} z8^72VSgA zQ0s=%`F3iWlMj2?p0scDDZa@IgOEtE)NMhwlLn2RKO{qeA|0M5dF82%Vb`au|eO>bBn(2pj$rBm;CScN9eBw9p4B|cTH8)CjFj> zhV0X2L&uh2^u^9~=pUWO6y znbqsTzV}ZN`~HpiZ8=fCNr8ux8b?lkQ?UH8KN$u>A8pl*)O7KxFeFE6gF2sDOD7_X z6cx`EG4a{z#`Uxwi?FKlA*Qx!i|{%QBkC*N24 za$5TZwm$Qz)saapDSN-3Ue#`ozDNb<*jsbq7A<0*ep$pUs6^ClW_%)Dvriua{cqVm z?8diOeYQ_e{*#^VsncIib?YpO`&!R-$$J|(FY+CuC-&cYAFL5n!1U_Uo~zuuD` z`dZIbH$EfF%c~KheAV`^^#~RF>u3%I{pBMGbo793c;7wYFrP&Fx_`UD&99;+2lb|T zw}p}kS%#?4A-D~P8M7VV&BCrBCKnu#h(xALG}BGDdStc zneqzt{uZ_j#1#7$0)9Iw-|4qt<69mzIGKvR)7jf`>US{v*WXX?`cCXTV-D$ln9-wg zjups1Ab#3k)@-J%a!FYW!<4mpt)%ePbx7+wNm}An1EjUcA}u@% zcl5|XtmL``KKUYGOk^}U6g2GF~aDc*l)Al3! zQ|jvH>6W87|>$*Hhwu`UcmUk(GU#m(SziT;rkAvpQ0>e6Pni|NTJ@428>S&G)bnez8Mb zwJ6(nzKNBV(n>JvrGg*y2h@}A{4s|-{thPY;AAmzXYgBc$k}To{mfnyW=*s+&q#|D zFAAyE{)_}W~dwwD!=PQ(%6AY|^RkkKg1_ zMW1YT^$`TLxleW%n(zzub89HSZ#Gj=;o^@Z6}9?RP?4`+HhUmV{}g9NUHWBn)M}AC z4N(h!)dws4ssCxH7_fvF_DmI*DQ@VWeFOep+h5cxI3vEUJp&UnF4hmo&X3&2`4EsW zau=eDEE$lU2C^z{UsIQ?jt|IA@mgf{>0UQD?Nv1Otll(CO>ds9r6$^UR$7pRzg6ko zvAFhsPH#g`#v4N^c3T`9ZxzL0i>^X@=!?u8c?VJPtx3J`jvl1(nNMN(jN^Oih0pb1 zm;*2QdQog#(;@1{i%`i1rjm+B1bOZZQ^`(?Ja^V1&vl>ZY3brc12nSUqE$QvjqI#X zBeAMc@;@C?VD98A;R-O;`QQ+$aTq+x1uyqtn>WH!^J99X(FE4Xtra~IRf&nlblLY0 zGQmt+BG577`v-f`U!4MmKV6s4ZmVjd45y-2xMl#TaGk447zQj7t>s zF}AYDKj{Xy@fKcE;0?rXno{H}P@jzEt3WuPI}}q$hdf3T>+@kc?={l6fdM7X2yS5A z*?l;oYnpNskSuD-~ORq~AOoFrzfIy_?s*C6b2Qm&(R!mvRS8rMO7)xeZ}YE2oQ zn6eyPt=(2f;aYeRD9Ra%Qx6L$mV}|Gw&W%Qq41M2@_V@!QiYR9~kUIZgk86)!~MrMaGvc$s3l3I+= zn$PsKNbv$DjKlN8_?TzmV|ExHLiauM_8&`_Q*Wc=;)!A^CWbq%u^4?#9Y+5K(nt45 zO&6~kpopy&qsLP$;)!86FfV<|BK^&ko64U4J7go}Py0TSVlxfCrqC+e;P^+=kIo3K zzaTB|lpVvQ{jW1D&XIqi+TM}qzB;iaM{dpW7#Xl`@*&~GqwzFDm#`#<3~_}WF> zQh0Jm4icn_WuJ2y^Eo7NMGp23l>gX|zN*gy1`Ia?X?mkJh;P)$SOf33#~K@xgA)~3 z5TT0v&ORAI=K#xLIz}GEVt?TDN%uH{dt7YQb-6~Fq8_}+yzb|DT{uC^>v8;+n#0Dm z)ao%T^xA2qUN=4&M>V<;mA;YRHZZemteM4g+tj2SSVHTr^_>?1WGe%*;UNLY?l2$| z!9VWkQJ3S8;|N5=#NXjJC*P3j44#6zc87uBRd3(*K79E{{T+!HwomI+)~#_+Y3|U~ zO9Qzy;xaQkpsRxd$gZTRe?eYgJgyHU@nd)(g&#Ksl4)2|qg9g}{%fKV@bh!B5(w~f zsuBqD6WO#H@pA?hO_^p;{tLIbV$w$kBO1dE?(}y00u9(JPvdy5nUUhd8|fX-ad6Dy z19WLK;|}}#c9W(%E=i{9W`;9;^?4wM|2v29P2G=deC6jaY!7yK-5<=w5vY;b$mP#{ zacsbgw0?HKcU%z8_%f}xknhVZYQ;a}_V3y~c;0|30*`49fae^m1y;+M_*LOExO7Jq7P z1mU_2S4t3)2$!7Yr=AoCS(evm>hv@q_>%Y~Xz)K1OEgF$Gga^eK} z3z-wxmg|QRIG4J$H11Puw5Fvov`B`S#7Vcvhle^9{1cZnm+1gAt#z z5;Vf5!Gm zL+o{;#0`uh_y{>fXLtz~HLJYD^m=s1#Mi!)~FB#=Z2g$6udvI{!js&(*IeL_=3LbACjfn2t zCQm{*-Icu1!Xb{ohzWW4M~7)zLxrFMaeRi@LjKuwUC%Sp%J(Tzvm`^1fg2u)q02AqtVD-iw2i!04LW z6tinD`P&2*`1(Uc0bsQ*&(PfVMqv~p;Gvb(D*e#j$h($j-|XBg=F<~s&o7rr*KXzUji@Cy4$H0J>?z+@yQ~*AT zAZ7~M0U;}+WK1)_?)4~YH;My|n+9|+vJ@|k?qH;AR&fsl)2)vOHy#3tA7@RdXjaFL z6?GN#NlQBzX7p+`s4x!G>E{kcn-sWk0i}wEm*Bbcwy_As7US}J$n0n&7P;{97+$&~ z@CpTk3I-5k{w&KyyG#YBiNTt5+v^p0OBRR<6{xn2le8^M^$cK2gC0LHobC=6QpUL; z|7@;+$M5h&xE(GR(q1xe5m~&=RIJy1ml>(F=W2u~sJ;eP7I#i`6m=P4WEAl_2(fk< z9-c3xoQMeB%nC{q4xncUitZdIM~%Nh9u@Hj>V^@DV3u;JN}BZ}-q8}(w7FBPMUC+S z4Hz>h2n#8^D4H@-{fHh2=4QItaE(Rkj~>k{Hp=a;Q*sHSEOs(Fc#_$Y#ACv8OQzh; z#x-Is+r@H|!%h*#CeR6wBPF~@tWG81pnM4`FK>FQvvIR0wNA^a)ao*$&u>~ztJ`v# zY`IaGQ#91_8f;pYOM#}>4bzzp-&n=iUWXr()@579>=JpEwV4^eYfSxHU z2UsLpY3L*q33AL?vD}qTw6u%S&MPDFTN9oI*Ki}TZAE-N)NnWP;c37mVTpSr4@L4w zbyN^>N5I)Sb_FeYylS>$6O5xGKIq`wf_8Ja?F!7-ZtfUw6kNaWg(VyTVnR!(EXW37 zhb<=UPQ%ehHCO`{B`D?!=Dc75cC$w5g9CAo2_69I=O6Nb{Fu^DFdT#s+1b_D0f`WF zFq;8#2Xf_x1VfG>*${`d3x>qW10hJj#z2aGM@VL1tu-h!vIQl8SXpLdhfwZncNll0jyO4EI z9~9c%-AKL_5)hNkn1=-9bstnQyO`Bp{7Nk{k01OHx06~5_P%=qrp@WGrJIw##aqSP zJvsEE+o+GVxm4KGSgfv2rn4wCU=4IFAt+f@Ls^I=C!|*qL_S2J%{*(nA{c`#M799t z2CGLXX2BRujR@MgsLhYxwxE+&sEh8n!bnzJH0cT>C(UK%kLKlIMh_5M8wl%lpS0{7 zbkmzx7?}`jiWzh3C=`OAqA(jGII@n=*dt!A0Lu-;*TH56w7`$CBEhiVo z5)Xk1xY0&Ebxel5P!L~~@zPYzQ5F+uo>*HJn+@ql{AXo6)~@6x7&KfQdl|`{!dMbG zf;y`MuZ&%2Rk<%hl7c5Oa+=$gg0RN+^w{v1KzlB2>1AZy#;x)+W6(;7?))B!zz7qX zqz&I7sMx3gCs_eN6l4}dRIWgQhhzh{tX0|rx#-i|$OilcosD_p7}qzb`s2)^USnz7 ztLqZz*4{=`(>U{6XKx^v+Y#~+x;_H|p(^GS8Ue!%93z`;ZzHKq-9nJ1p+Z~)dSHk^ zMbLh0Wi+F2dc*b-M=^bj-YwuE&MP~XwdX{?TT>HF`(385Rznu)KOs+9=r*U~K1S=t zDCGw1ZWIf~_loFdhlZd*_x7UdDBP%1eZeO5aUY{oOE0j8ZH&S?pFbX48yIr=y?hnZ z#hpbl2E{MrqV>C}TVEr&4c`00kc(`i=>DuD6yikkE3h&d;>3+a3@z!=zDAZeUo5H^ z-)c8t&F2M}kP+jDXBIdYt0ikxCRNrp`vf6uInghpn?1TWST}%XY>N7uaXd>Ze4@g?ey1r$Rh>=p(&&Y7MvEHn5BX2>z zF)^u8xDIN&Yteg&D5!ANOXyrbW1y?8^=5$CmWK8>Cc9)L70$cSjsj~YB+%LZ#x-=u z{iHk*@glw9;DADE+Bkd3$zG73d%kRJ_>56q|L4ajbe{Tx?oY=rL=LNanGf=jlf2f zs8OM98)WqF5MBoh4@`I+=)MA@wMP&h)O04iSXy@jwoJLS>jtAcB@Hr?uL}`W43m~1 zD6qXdvB5o`GqxxE^FV2!0v~^^C9sZGHz2T%lHVZqv{WWLiBC*mooLb^qf1d|@xmzy z%nCP?URT+|zDrUYP={@MbU<~-g*7O-qB&kRB%{9$Z{Q7mgxhHqVl1@ZO~dG@P9 zBQMJmF+q^J#XK?pSQtVxro6#Mmg?$>z*&xj6j)6mhU@8TLhlp2g9Z?z(~KAwaHHj7YzSld88H@I6T}1Y3cCibaN6tc zpM%(U+CaizK)iXe46*+j+Y{Wr)$SXU+zzvOFYJu$yg?~bo^GThgS!p6(zv0Bg|^2Z z-OQ#yDdfE;3o8dOEL22DL;OU`D!{lCFm>$*Dz}@%AOP{ewh%fm6cNm7cw5MuO}q#B z%B?V0j0sh|gC!^ORrtYmO!r-8QE`oZECwewqp0b#YTC_vxF_@+VHOvGLa|GCV>dRkqWAOIA0jC=$l2bHb=$M&?Q%F+oqlN3Sf8LUh+bjQ=?nR5E8;2b zgOJy@X)FuMw1{b%pqa6PC^8;Juqcy%2YX&qjX06n%R4-Y#LxgoRkV5r5| zxztsQc|=7Q>c#dtdNF#duNR9Kb@gKLqOM*nUTlRv9E=8{cOQkS%&++OGE6LXL#EW0 zqs8)7JB8F`JMb(vxzRxdOb|qc9blq$F**u?t>n7J@IcSW zB!q7aK;qklTTDGt=(4{UF*)yBHGSIx=KI#tf%XDj8E`E@Jd5$!N+N_P+bT97-E&?&2ci!&?=HDi-?^nmJyHwoib!H+9=>LQzM0HxRGwX#+dHiWW5ycHqr2F z4ICL=YqUt%ETLBs&mvk%ip~5rrATb2K%>%srA1%DFb5b>E5 z-jR#-b0HR8koBP<3bPJ`i-#?E7NLtX4=w>!`4icP;@g@u6n{v0B7+8orfChPfp-|- z2Wvv8|I|VSOQBEe)k2$}S#6q;zAZ`SXSDD2=M$pPiW4?d7jFF-&630!N_0y_%z!@{ z3ZQB0ORavKkW48z7)V~lk}uRL< zD|wL7?lPxTInhq7%K3Sy1?ZfgTZ565iow8W1|maI^aZ(YsyprvNR|m|=*1TG} zE7V%nT_bcHKnWRX6~Kh6Zcl>~USsuz2{&sj_(B0!>k(8GpLht9?8n26##HobzSAjf zz5D2Rqh<&Nco7@+m$E0z0`{fVmkbBV(<`}dU1I#of(=Z`=Gz)T2t!GaGOFvJp!p)X zt_9K8L4~0INb7~#P3>mll8#?B!K84+=2!Sg14CVngBqcM$)6A}IIoH^y8u%AXy2pu zpxP7XEHJLIEx`dx0Y<@?u00GK&8LA72IS*yJd^-APf`LXCN|nOH%=V54y0GDK_aGJ zy(pplLH&*iKrhCA-NWf+l+dXVjvN%T<}~u8Ow6W=f(MW6gQ6A@bFypw~Ah;KoO% z+6_vg(@ee9tayAgR60lqThIrU&V5BN3F!0TzPg)LIv-n+P!dX`(|liH8w2X|bc2Ur zkq4aEaMJWACZ-kPO%zJ1cZ~|V!3r=?JZv~Qis={dVYDF?&j^E)6*qGdw z-z(et#%c>uQzHY??2qxw0gFNQ#`e8d{Ie(x4Lb}nxLKoUDtlt0i;>_%ZCGl8*at^2 z5*W2WLf?jv&^v^L{ue=l2;o@|2?zeiNH{3hWgR3Oya*B!>mwo7jDUr})L2CZY6KGl zRk-~wXr-AKSh&8mxPZ`EzO_1vWo*Y<>@Svufm<5MBKX0^gjoFWfni2rdja!TVo;H$ zFgKdV9yJ!kHp;KCF$~*#8@5Hjd_=IwDePrVNzmAVy1)TI>e!*7f_&?hhB7y38X$)a zXR&^qk^u_t4L%Y8M3~*MOT-IzJv)b{BE29359<6bG(1R~?`%bq!^MUaBNt+f1(n7y z=wnU$V{28$L!uhiz3^E&6h=!3n_M1*6Nm-yeDKR=J}BIE&Upbk4q`y7b{+`MfS@i1 ziX4m?H_UL1pa6!Bc|ldv)*sesHU>hgz8g!K3DgUW`Q5#P@o0o&YVaCo^D~=}@IAn| z^E>eZiv_UsX8X2yhpzY>Lgh7$25Zldokbo8Uf>X!Q)lrZvJ)@F#zdL`_z>A8U#Y?> z;KII~_l>A^2mio+S3uzA4SwDIy_@&<+#K5me$yg$ATTJvZNY;Jq71QRQ2-pyaaeuD zN&)IBe59(tIsm$bV+WtLhwKA5x##Zf7(90!WaA0j6~eXw;H0pjteiM5>p`>9ZmE)8#7 zEQR=JXn6`RlA~7Jk<5Oijt3NCWNWDA={r(rQ&ehW#wQ zbUziU@bKWQy1DYGm8{V9aN??v$=vGnBGCq3Br`zW)#H!Vznb=&o2n_ zyzkP4erykc(fYg-M@2ZmVm~Non5-W2kyB;7wS#2B@T(ndZ?LD3Fp&A7F!HIIg=r8r zO}*V{6#J{_#XM*e-TX?WC%lP6M5Ao(>As(x^f&D}P@2Bt7@Z~@^Zc3w6J>1IK9 z9x8F`aS0Alos^wz(vy?JV=0!|(l~i|F)diICsBPPp39`ccOhJ;q_$8Am;@VKdDQ|d z7xIpWLM7qG_mEW-9+}qapCG=n&mK@S!TKy1O9-_St@{25?3@GUM1=!2B}QsIRvYyn zYc%yfT(^;jsqh{n(S_|_1WqUTkQ(_SjLtEWWIGOc8!3M)P30)%@sv2uNKu+lvvJ~- zrsp_gQLG2^g?VH-Zih*b&Wtmzje&ihjgwLEwHkh>k?MOS)Yyl7p74l5t>(h{_31l} z*mT~dTQgU5@xB> z6x#R0Sj3*Ryl-3nE>A7BhFh1XBFyZ9AI2smO%HvmWva-j$)Dn%41Fq5g+J_*R+Xnh z?`zrWQ`V;$p-+!}k!`uz&Okidg(niyFTzT_Gp(wE+-FkBie`!beNH+{bQ0pExW2op z*?)nPQfSm+PD-NXnBt7}V3XRBNr1dE%?ZpypYhBc$ddx$85sgytK_?&8nTh`iLq zvd-;um8eU)Kg&|ZJoB|hFS!^PK+JW66ZJ6H>KSjd!0I2VjI)$x!tb{hNeUsGm% zc0&X$yVraYrdvdGgI*W=Ly_p`OFJxl8%+{hn$ zpD{8eu*C1y?IXLx00KioBFC8lOg`FvpV260HExv)ogtad-)FS%_#C$Z2YInZpR>jk zgBf@DlU;#ii?>JklVSQrRdG@u#HO?&na132v@KdFVSu0kIV`m5yO?4U!*vsZj^w&3 zl2DF<;x!KQ;Kd8Ccz_8V&8m}#16aQULAJ5`vL^0%(GgOVJa2U(?#xr?@on6Qmcq(b zBDH_O$b}8vssT4PR!1agFNCKHpk-MlUaVW<#kwWLrUA;tqPis()h&@~weeEj5-%x@ ziiCQAK>BPNl9Yj+bpcxr?SLi=)XL^Ah$2?Tt#q^~~qn7%&%GU~?pK71jnedLfWJZ5`YsxyWsvvW*I4 zptVJ4EeFrtcn0xYh-V|er;f+C4I+OtMFRmG1>j0w=5I7|o3NqFlD z8!40hNw8l8lZ0V{O*zOU(znRSam5K0-*f^NT)CnogpR}=QzN}d^+fs=cEuMH;)zt@ zCgo2Jp`B}~1Nf94=h$9oE0`y|WAA($_O5Ohn*w-}BJSps=DUJ+VIYO8U#~y{&MNQ) ztj>>%02x6)v_#k@@e^vZ-;V=p{88w4||)-5Ft-WTi!*4*X@Mh^%&F!Fee+jrME;2X~Oz(Zz6AY0N? zq#b4~f5xchHd_Gsph}EJmn2-l+9=Q&=}!>DwlfA3%>1!tzVK`CXEU0(eYna4i3$E} zswpv&GZOrczLNY<8{Z?@okdVW9K}9lTw0V6hJ<}C#(_lxl4uJOV9Y<7iJQ3=-~KtT z^vC`t3|_Xq8=7S=6ue_V;KIV)XZtfSKdgH5C~ASv7QjOTXUAy)d=Xa?bIA2z6S+c= zB)pEfK3nqq3BASY0q{sh2*H6GSmf|w5>`5~{6P4C8H`AQ@rY>lQ2pQU7`3y*MV| z#eyw6&O;b7d}A)cmQ4o_04^u;D>%!jK$19t;HfilQll1mRht4!BGy*~tOn72g&R-2 z>Gy*dsN(|hJU8*yXZ*=VJ1j$t9IIQH51kUb6 zPmYA;t0iwj7NXs}ge!%yXkmDzTViX8T*X0u4z@2#tOXoOt;AAb`8M!g(Sp1?xKIf| z6Jrezmj@Syn88xnOpdS!Efp$$1j2;K%Y%6cyDTmbej3`|E|bL@na|9Kf*nd|w#$%G zbx3JK(sKDtF>ALi%jKu|iqNOEcCl@#u&S&Gy|3N2AfqU^mbfzXY2KWG8813oDZncd z?9qu!PZlO#;gXD7xg~lfj0@I*Frz}wvcUo$*uGF{wak|UE5n6DxQB@9i@6T(iep&! zg25Eb8Kj5PkJkLnnkctW)F26bw+59Z545+Bv|xHQ)CX%-uOfQ=?TH2?>Toa>T(xSa z4u>U0N*Ezg0M#m4LxpC#imsc)s|CkgEI4lhO^1av`-?Dp_bY5oG64#j#L(-EuS&M$ zMN3uI@T_z+QRZs-EfwEZU-<1c`HhdsU&FWNY$XX-d|iIb!pGO^RRo)2&4J<$-HId? z^Ls}oh34fAS%pXR2KGfCwn=bQB%3A36u)>_Vp;Y0SS2C_Zu}O;*3_0>BTK8R)2ZSS zBRyqJdbrfu+EQz2-y_BiWxxD21<`JH-J}JZMwxHQ&#d0RX+ep|jaCnD$&U!WW4=YL z`lctS)#)_0Nrz$N|M06=8oq9ShLT%0{hn+kg9dFH?#yb^UL6Ec1U2_BcqFw`ug3#Y zdpI7+RPv~i-ySJ&iWU6nZ--0Rcm~?x5;mT}cDRI%XQOtwgpFt8cIphJQB0#4@HLZn ziA{`a)ar{|Ltn$!&<~f0Yv>!o*U-;c0T#~G23SDQFphi?DP9%Q2w!c;iNkAX`WOUX zs(1ICwoc*DAZ6wyd5Q=CFyhg!2s2XFDoIg91el%?z371!Tdt!1j~o2qf`Xij7tx74 zj&2nDgi(n&?X*pOHi2TFG_+aMjK<2~vULNRE2$~wY^1GVW{uosFNc0jUP4DojlI;S z)M!z+YOjk`t3oy0kEzq!MXS&=ccolM`=0!t04b`L%rK@To%vK`%@uScqxoR_Oo5rk ze0B0lS~t@esXR)?EMpkrC-@I{NOdsHBkA$@9}?*GSq4XRikLP1^28LoxvVNevjHWk zkV(#twnliYsG>wNI7-hgB$_}p9~q`W#PgZ`+N>tgGDixUEi0VL5y0EeHqsFeY(+uy z6gvORC!86kaPSVK7@6+%(~{XnjOV%2(I$KlKb7g#4nK7+%Wn7GMx|OwhU>F$WZG_y z0=422uLuz4pJSvV=2--887rUUAa?%N4&GVQy&f7f$B2pJ*5X2~p-?PMPi~Cl=5vfF z<+idT2xFMyvO!Lkd@J*G7q_nwDHlTFesU=BjvhnR%5{Gn*`s0|DE`c8tQMQO2ESzl zh~ukd?5N|b*hhjmx}JJ4g0|^KN~Cy)bVT1SO;A?JcndYFWW0qn>q0>vINm~4!8|w= zA;SCh&lsEsrt}#^v)NDYK4Y9${z31~H}*A|!>Uc@*?{81uV{bJ??3y!67-)9*!YDP zfAS~VSZ3%hyzp6NXO$ZT`1@>PsKB-5#;fv0maMV$V? z{;Y8@|AN6KLBodD1hu~YFl$F)er9CRN6+E5gcw`xPy+PmLWB>QLt7Ra&65PGxJzy= z)MZuN^G1eZh(4Qy5ULjW1K3_=Gg7l9QqdcJF;dId8v(lK1!EL?!z|>wM4AYu7UQY|SPja;P3H159etwvpz18Iwv3P^zV+6vaE*2_Xv{F_f( zm;FvH#%x1vom&1o6*B3eir?+Vzrt7rsv5M;NGIQ$MjTzY((uvVErvHy5LvuGX%uKE zL}OI-nvut44oW)9twU!)m}xSZ&M+2UytP33wu8=|cqK$<7FiwK7NRq2@F>=p3M!4E z7$N4^Dz>6BL}C{d%cS^ML-S^p9lOKGu7{pblbQ6u^9YW=AK5bcTJW>yp54~n&4HN=m4SFPCq3`)FPlO!^tUt}%)KHTxH`gy)HGMPUU}4_lYK%1ca3dJamMunhgY2bB*^0x~|CqJh zxGh8!f52L%$l3k_uF{)gcZ3lC2Mnb*eYwN-YNU8oNZa;(99DEU zT8i$Xu%au%=S{sx*OR&HHNOfadq%kH4OZ71YP+U?et5u&vnJj)5NB<*rE}vcVw}wg zgTgvDo&L&r8X+2JztM=}%qhB;BWrKlkARYsAE9wy8w0#A&y3(RMx`@$4=>K7OI4d zG^%DgQmTGybm8vie=EA%`>nyLogJo2w$)|d^hEFabE*g(4C{{h);Su!Z+erm^84~| zN9J$eA-K+?b8kTQ_Yd|>zY-yUt^DF4KQzRG5=Ud$5W?_c3<0M8e#j_repg}_V_$Q~ z@HbsGSzv{&w(JB6A4wpMamPoyz#Tk-%(H7EaLx2uavnCC#e}0rA*t49{S#==VIu+Q zkK)LDu{ebuIBY~?gXln5rdH1mPoTXe#SU7te|i>GA2y;qTVKL;YjfK!nF`{g!$!M^ zW2wkf7WdIJNz^a?an9M-;)r3!alyP$K{S_4E3S)4pu>laq(m8OCc>O{AR935Jm&P_ ztbEYsqD0zy1iQDv^hKzJ%sMTkJ>81;#N0x25gdkHqaaim4V9Q){769ua&jUA$@ljx(>y-8-HFj!)~t z@eIP<{$W`D)eOe&p9L7}!(g03TZi>r$E&q=gU_uwImPc90OOzq2A%?p^MN$+;wSI3@oxK= zKnxYq>Ks3E0wt3EtWiN zz5Xba7k47pq|R+a*sZ%DgSr0)#I1ZC21D70o>90vtaqwS_qh)3Qn25_(1Tw*4vwEgylJDDp zMMYZ(M(Nrx${omm+s_&F@Oy2?DN|tOY?`M|L0r1`k?49@aZ8TPe9RHcHq&kHroG`s z*|Z3mZMYa7U1FLdrL4W_Kk)fpd(%F6jA)U{h45XgbgVK>f;o+c z(*>~C9dAtx3Y5wMrS--ks!o?*rvGl$CuM;re_Qn_`Q@qKtvW*%nDN`HGv$|=zpXk? zExrh5&%6c9?)*_;c5)cAYb?yJse{>%C1%B|1~9wC!YrNwvy;P^6*}7CxBi%)9b`Dx zoD^`J#Ba&m7rjbjoE-17OUyz`#?0aq_Kt-2KywfU%Ro*#Cn7qb3Z- z3=17I>cCMU;SjGHfMcS7BNfY8fKd|$LvU3`5{Q2NMPR9BSf)x?Hils-wqPl)0}G=6 zu-Fx^8i3_^rIa*y3Sc&dfe}+vaS=F{FdUWN3!JPD!*RG$^0UL0VOfKfBNm@{)c_p3 zEjaKLaI6l)!AMbGb5Y=sFR{v(*0h`>Ft12&IuGe<2WE&>_;^Os=E`DvBctgz?(Y{w znO_{Wn;RA1gS0FY%w#a_`2nHWYciWQ_VU+_iuuj|$KHF#M^$zGqnycA6oMTI5EbP?ghY`dEm2|7Bne$W2}OoZ0wTQxK@n*|KtM{OAV`t> z-TRzL0`jO&dEei?pWppw=Cr-`+I{sk88WJPEe)TrW{pO634@$BLhs zV1ybJkI2y@;>1v3b)YK}I4_M8YgcAiZL6exk{tv4t{$*3Fj3Noold$FCq~;2kBx^i zcOS*MM3&StH906e>cI@?aK`7GdnLzwdfg=+HC@|8UE{?F^wh&M_mm(vk2dxaAGbTW z)|b?Iw;o2`T{di{@iu+_oM+D-GHyrQ`uxE^AGbT3^fi_1UY;OYeW-18_~WKie}T<0 zhE48I9GmlH*c@`}v*=I-bS4<+@MjM}=Su?}{Bv~9d(a`E(~dq4Zqg5C)(v9G;qSCs z^O^HmG8F|hiB4LCYo29Kn^$(V)N{p^UCil=nSb+ADH`R){_3Q6{GDnHE6Xf*yfs#W zUHQOE3Wg#Kmb*j}BfNw>w{N2Oz98gLR+3mp_?EWf&-AT{vi}htOulu*r}4>)b;Re) zc(<#8*dIqp{f1()`CIUNr1^@$?pY1RZ~^KwZ)%>nH_nI073L{l^ImpDggsolSVZYl zzI>Vn4?+^j^hRQRTF^u+G<_?Ta3yk_DHJnd`dWPezvHy0W2a^PuE3%I_^qWuJo-Fko6v?KRwZ?Ti<7k^6YEk@Z! zeHx7g_5@AtEppY@;@;wOUIR2=O4kCh6x(qqNzWKi&Xz;Tct-4m#N&IP!OZ`7p$??v z88IU2f%MEsB*X`UXTlqy8Gz201KO*JU4>GLX$e4C?r2vfVAG!#hG3XdFp#hGMjjlP9? z|L^o|Jnef-O!_+=y#6D^mHLl6*aPK1?qCm~|6?8e)!*yjzcqPxj}G`R^sNWVf84ho zK>sKDcI)F}P8m06)44fY4Cm&Gt>xUDjd62*i(z{D9K6Y_oSRFz*f| z(UMC1%ULvA8H?sq#-bg#><9tro%Dk>Qh1AmD~?EE2n{-}OrcIsV*SCU=D)lC@-{%r z_8+f550w9Sj(7n5@6Hi7Hn^sOWzG>VBuh_86`T6ze~U|&7zvI`{ls8eoGMneY+?_Q zv_3F|)FXaYx{@l^vfR2Cgon}n#17S#U>@jfwI10Y!U3Iffw}#!v5rLy9x~EB`Jt0? z`iY%Ezg+GowiLRO_GS|&oo!mD1x+4slcnaE{2b>K7vm2{qAvwaXc$Sw&xuu89XPL< ztgEaJJrcfEJM5{$URFmNAAf$3IAO$+@yo3+YJPUQ9|b-qT4?3-Vic<0|Gdc3Ln$wa zkw`sa#FY2=xmq+m#Je|)T!JY5g{~p=_6wq7&0K0h@8mcRdI?V2`hvI!5F8C1;WX++ zF%}3rNyw-dNt<63Z{R#ZT3nc`#Ks3x^G&bY==@8fqr!279A%Vp_PCQGUKRs!CKYac zJpx_=IBJ-L{1n}a z>MP3VJtro>+n{Us=P6X$F)Wy-^%vuFjF%N-Tie3h~8JlAQ0Q} zPY-x8C*w#}^w6}6rl(C`uA}AYWkhS-AJa{)1M-JzQ3dX=1)9|1aPyWpJ+T(3zHp!|6B(aAy4loM{YBmJVm$!{OW;3^-%|0?sG~XX$p1 zPu9cXoS5a)gK`In$SJ+{&pWAPEr9L$iUYf|_Q6gPY(7JDIH&#s&M^k((l!p~{2$=( z&W?IhTwvPnN9k#!;xN6l(?&I;FW$QDq`~2Ktv+PddK5G>4Bl3KbHFft+wt*!<0>PY zUvb*n#L~h!GBAn*21e8Nx5U||J8S;Dp*Pn6!5v#Tf}ZP?6#t$H{xWw4h4Y}#J{`Dd z=!RFcJ%DE<)LFrt!qlpeKA#vbTHE|JLx||Z6&b=mGy=>Y#kXiXUby7`tVP=fKy0Eo zO8Ceos~vc!p4H>X;+WunBCg5AL+Ee!P~$1mMmQF5bqqp2j$$3}~@#cL*r zcJkf|O0XKDo&3#?+Cn-lHwT7BX@+cv*-+!qEAK?8KeB!7u@v~)5UbVDfn;0lwP{t% z=Rvf`YWMaiLM#s!h0cN%wd;0whUTKE_vLU(wAm{QW2SyAhI_OZM$Vh^dZ9h#^(KET zTCKVYb!ur=0=b@V>up+LqQQlZut-CRYMj*Ng&{l2D|A$~8nUCJp!@`K{NBZz36Q+) z;gN;_Dd0hjp>txDPJN-R)oSRSnxFY5f%bdby&+xB{k==LNB0!;U|Fa}IKm~rcd=Tz zG9;Nwr--$M@2QUu>NNBt&IijuZjW+Rbs2p!_1%g=`Gr2ehpKe3y(dLPdGjDWU3odkvspPiSK4X1RC`Kx*V+(jFDHzJA=Hj}5Jf1_ zc{!d`Kr>Y7$$s|QP^G)JIl?1#Rl3GpyzZMkuruX|4&LUl>V~DsbY&G9c%C*-6T>~W zrpKp=OquJYRi*giVkbGKi_Vd!py^^cq6BRZzp9C=0>~sAn5yDxDZg^z>JYyIldqlU zSK+vt$4fBBv}2GSvT(|RwuV1r@qX^`@0h+ji$7!9+Ypwo64pF)b;d~=kOw-o3&lCT!)SJ%7!fdbmF`E( z8g_FfZOaoMhrx8@9PwqSwhiLgLtT1QSy0f>>^WiwY!eseh!WuC4!-52nR%j}8q5_P z0e7c(arHTK&-rx3+of@raG&hXOO+^Aii$AJxhHX!Sv*ZckQGshRmuPX}A5HRPt_^ zH+8gktW2*g7K80mR#>!Mm9!h9W8pX1;=Pb?%EiZi6K}zL&JN0C)UV`TEH*F|dsAwH z30creeElhKiRf#a`7J!rAT>%H@55zSO_qpno6gpuVte%#lqG%;|Iy&fwULC{%R+s> z?&O0(>9$mC*<;OooJwq7V)C+yYVXhFfCAiqaib?v&K1foXO&-0W0w<;Te=k3ShaC z7O}q-Q31@OUx+HQd7HHeN>Xkx)c^R*Urjc2@VIk zjVit@ucFY6Dl$e_Miue;de9?7q6$6F3acV#rl*Po&o>WNp{@~i*MlmQ8lN3Zeb$Hy zAE3$QeKK>6C?VZ?H64Z??Gp9y{3O^0P1>&oh~dneQk_GIVb~W{Li)K%dfY60%~O`Z z^aVEcg9BhOx@5IjJ=DldqOlo~RbFBGT5LLLGr*%wA2^KMml) zx&V%+X5fv%@Fh~p(G9`8LDXWs=*_!tdO2D>*NgSaz|COb>geF~*k1t0(<^wu)g@tV zYXjU>54aiS;4B-&dNn-Q&1B%}>)`Aj?0AL+y{l6<7~M3p9KfoI0A?`&kLUmp0gUao z$WKr%>vn830L&@}@Z81<7<|G2G|>U*E|37gGYjY#Z1w>7q#QuyO%(vlW&oP$0AORK zW55IP>i`CB5+CDTI=dXemQ7*<#nT5l3_zg~`-lfNU~SN2f_pl3OC`!%V>NoU?`F}5 zL(D0M_||5zLD`O#3y8FCvlwk}tLBTA=}APC1CFg%xm}%j)~C zP>kjdL`eMltPhMW_DwWX{%SEktStI8t8#8RjE-9>z?jEiOxj|=D59Vzvz_F+DqD0I zMj&VtU#5s1WNh41w?d(?h3ae-6ZjT+h*H~HoJkL^eQaiaNE%+ji%T=&IKz<(-Fui) zy7+^VJL`;|x;HX_j%^h?n{tnn_@y`)2lcm97!rV#)f3M3rQCY;e5c;47C^PPi67yd zMta^bI=oFx!)YYYvgt`RXuwxcTOw)qrbj|(&R60fyz$cCG}+GHP|?r3 zn^B9DzEN~=yEw;?MYne8vgphmVgj=)f-G9rEsNM2-INEh3O&BO6Fknjx__gO<31^M zG)3(c9S}cDJ24-+)2YLiV{v!yaAhWp92^BUT5=$zZK~@hxNknpw&$x{TxHw zCA-B{Ol5v`nK{vYc(3?9%Q{}X+?*ivp`=n6PD>qqfJ3yjrQ zUJ}Q#S^MY}v8!obiF?u&*o0tiPPr-$V{=pU4GZ^y3p{60_~MBZdb(3e#ZnW@g^lyh zi)N<|h@n@mf#~f*$G4O~-F*$>|2|X{=o3b{*F|qIprwI06o6$HatOZ!P~@*-hG|Lw zWsexxg)Xw2k1O6##ha-WZ)Q}ynO^Z`R>hl{#?6d7;-|oB_RCTY(~)1PaI4hMbnO}y z-356!g-X7gi3RhDG*0lMk}sv^!n>5XP5RC~a-h^+07Gz~U%L?Zi9ymU0;CQjOww2Q z3w%u)DInSWE~yvAnx#&7G`qRnlopz$4tT!db!j&28L}->e*k@UkF)?Eqz#c|^g)qT znt;24z0xSu)V$OlMv1Lt9~?0ORG4H7p?CI4zBsf?-jp6twr94IPq{@OX*6?T9sUog zHU_wPk@OGytogp$DQ~Udq}7p1(lDt?+#8ygPRZzpIaW%5wsRId(GlQV`{p1G93~|S z8I&_js)3H_b5P0@x>E5$iD`UVd@V6k#HYWO>f%rKmo)qpeGPQ6fp$3?Os^c0;N(Cp z0wfIwn14>uueGtSTD@G9|p$l*(1^k(}9(gw7h4mom+%!2Uc>K>VZtD zcJlLDxZXTn)dlO6J$S3lTgaufU$X15bJ?}Qw(~5bI)oI>$TEte`UazYxso!1r7#oz zZ+|B>wzBRlI7v;8N;Sdq?Ri&fC+wonjzX|=gZ3Sj`p|Bt)D;#j$KR6@eJZ)U8Sml9 zqsURxNcuWN`o?raK*%xaC8``IZ81$)LtR@+wWo$lv1nslI68ON)G<;Q;RtmdBSl)L zSfM4ZM$03lV0yHbZI%T#t{Dst9k8Fjflo<3l+BL%DPz#f_Dc zFqA1{f!}Ca8X>hsC$AgJNA1p7)HaP$BBdA6gc0K;7sD-goV0=_L`ea{R7(9o>cz96 zCsOvznIT@+eoLgFXz4Jf?Pueq7MP(|#$)z&q5UyZgz4IEAb_MXeDR#Y44UHZKT&ER z;N!eW(hsP2vx|@M?=I;KI!ik*Jx&c1q)=v8lYljGc^0-u!oHU|3CVgibG)0R5;#<}{E+mw%Qz&|XPW0RN5z z_+#HsqLVYFiGZIri^FgB3CH{dX`cY|X0tiwugsR-r<#ep>+jB%n4~U05yh{K<;6!( z$0XkR_+06L$*U5j-h`D@i#iyO&U7q~Vd{>VgVjfq>tWP)QDHqP!3G_q6*0&u{*zac z#jc*TMwm;(=Sfe;u)rhb0iIpf3S9kx38XZTE~AH|8%ixP%zYY4i-FC71;FOOge1DW zK$^wIdHh0DG{wDfq103`dqG=7sZG$Hj*X>*7?&IR-K|e~>-sd|eVN-tsu_B?5K%^F zK`phPe5 z-4a&7-Sttas-U+WNmaAA^bK}TY$inrrUPgAf}?4l^Ic`l=TbC!DzJr=j3w8%1@5NM zJ1wM7FtXV;c_59`q%Vy^?Xg1pEa%@3Uykor&|ci>OLQEi_UhndOY|{eD0NtYd7McD zR!EKMR4d6T%%k-yq^i~#pV_n(pHWc=jjC z-X8*me4u>2tnS=3<#nezNrG(`3>_k`?`vYWmL zmtfrDIE~vRMcOL{P?#Dje~CkP5rnHX!s%qFEP_T#-Yks}Xk56QVwz&DsNr?5?Izu2 zRML|%@_TGC#>l;K_xXh};gsJ)dKr(_#mbwkFi-GDD1+lYrPqLG@)Otxy{P_^(pbUE zz3E9Qzzc=;J}u>90uSshJ<1?1eMXvvr4&ex<88r-JS!FAVPOq<2EN(YM`~fIam4Fx zu&d79IKhD{Oc7j~_@ybn9{il@u?Jq5FjZf`?t6rudqL{!)kh0qR)-+B6xo~gPACO= zAv(zKFG#TXo!T-ijG|vepAH}wyKefTV6%$;6$)&T`7dZL)7Zld-n>5}xfo9V zqSS--l!8ih>x9>So$$(}&t^z7f#ZY3mg&q9$W)|Be@$zBgs!eYW|3eOAjTpOm|Mvr3KO_|8J(U2vpV%I=)ou zZR4F_P+9~^s|R(>FC(04-$!lj*Qu=&6{xMpXxuXC2`tItWl|jvjaEi(?I%udt$rxE z6;4qrKxkK_xw`yQa;qxUUWsEh)BW;F@EZ@3TR1j2xwW5>TTj4~=KpRIYm-i5ZDJ(W z0^!*I26a_x0^OD#`fUh3u?6ylo|HYOP6*|0k#2ZMi)pj}nzV33KvUIZn(keZ3OLB9 zfZ>$9Q|c@nWTZd@jc+EuB5Y>#z#=??gk~J>xNrtG5fy|p2k)Z-4*uIzz{LIkKNax5 zPX)}^g){4!aApA_oYRT-q$c=xM~#vm7vP!VhBT&@;C1Flm6BUZwYVr|vM!35&k2Fk zIw3$05ykwM34!^#6b9Zhkirx^gc4Yl_h*#As=R-d5?IfqF#Uz~Iwde)7r?A%0+@LZ z5&~T*_9B>lLmrbc|39DxdR7#^m@X~)OF{q$LiW;ArvujObijO_4p`3wFa{kk0@yKm zi)qKwe~kp_Kn;J9L>iF8MM6yGVp^5|uMq?Dbz)%s1JahiO$=nM`ZHo6Yt{dkhymUS ze69AePXm5v;!lq^kS{=_Q*_taiuz6sLQsnoC=-@6l((QfliYY^{HoHxyJG6! zP=K9mEVma}&s7k$9I8NM9jZWN73f6PA)Ux7(21<`_Yql#?jy1e{ToD<8yYZQ6I7EE z+QkxO3j`Aa3kQYwsB5M_#k(hztu`Y5Iq3_hLGINb}b(MAV$gXk^W)8rf z!opVnE9xr813f!pJ>|`RBc$>l(Iag{yzK6nEDtk5?DbVQnJM#1yUA}mDk}3Jk26uG zIW3qbcbDzuT0LX|(RJf?k5fXAM0k*`l7%-ktQ{F}l7-o+f*h8)hX{8Sp zo`tqy_z<}&4euc{rJpb5b<=`r{96q|Xju>WDa=mao^nULu~VkCxIQhLW%0$GKgBO- z8BEXKOSVzxw|xEmJ!TuM<^Wpmofbkr^pu(AaQYK6(;NgxNILGL+?d)3xg`{L>H^9qPm_y=0GO(fO2onrRkU+GR&Y%_2Godg?c7 zI4M?cU>~U~*2@%)x;@ulC>p)BhbbBjt7epCib+_{)HJW3Yp4m9*+P zE#}EWh`V1O`4h9yXX^8qi(TALKQH?V!cX+#3pnmC(#;p-6_`^?UX-EbcAtDve%XSL z+6|C93qmjV)HHVHU;+=4)9^QRkSxPYJxNF1Q5H_V4#U&s#Ih(HB#Y1{)TO-c9YXBh zT0Ol5%*@m=_`aQl1>ksgu*|&dCk^IX$>)RlR^r|{SWXrox`=!Yy8+`?rp}gY(cstR zSdd1OUza2KSU0B3f@Z;VWTxz-!>`K;@fRw4>>dr%TW{U&5lU$gPd2S-PWnt)Ky0+x zvY}jV^@jX_a(VO{GBX-5%pY|)XqmCS48R36%{$(ZnWp*H8*)7KcF{v{Iw0oU5V;lp z77vl5p=sVeM1C2Pn#4Edcxxt`V%uo&u;EU6^-Xy(n4QqKe}i-R#i4Rb3-lB_D^c^7KZntmL*>c*+ug|DSS@@5m{@ztIRZF_WGiAu}zteWaX$&1m9CInwL=9hI`*lRu_r88TB- zcgc{MnmR61W@_q_6h!@;6!$I$urqadSLQ;}Vv@$nTrnL)%|^;?0#EbomReQ5E1%Yz z=cOIWpse>~CN8Z%NK%+mbO-*fF>(js z|LPcy|HLse`HzCB-*|M*RQh4OQG+L2Yta2Q%o@vTU;X|nfz2r}ti za(pB&hDn1>8$*c~KMnEH@Wr0?5;|gsiIl(rXO?qTxOnp8nn2t}winC0U!_jN8)8vQg zx9!+E88oKf&I3>#z!ZecdAjhwp^=dy`j<&M1 zWHvHW3~GQnyLi-~=Zf$9t1F#fUS0k}G~I4!y1x|=H}AKF@)G>bUjzy4dFu43%=Fu9K9##bh3!Uk zh*|w$AGQ$+n`(>YK{mdjuQjIE=Zob?rrBM`_1?bTNU_33-qDjTEtdDA{3av0>NiW6 za+^#`u{j`>z*6~sO*jSJe5W_|o*FjyH%sMwlh^s*4nkZnxAr=Niv!E#XN9LIr3&Jc zKb|kw@p>x3OkD>y1hJG4a-$1fs^U|Ja;pj|`B8~O4F-lLdwM~_B_IHhkIqA9OvI0IQ@w88fnSZRTkQ-EEYuM;IdGKy(GhrL$(ZftFi!u{t-ckQ0)O&*6{6Qc4(iEPEa9%@5prbC5wRabhso%~s0Q zye{G5#g%fyrkJD;A;4xHmk8w!6tfs&8F^EtL1iree(>fHpffL_{t0mMejA7*eDxX zgO{=Byi6w`QoNidt(OyMz#2IK6i51_zc6o0Z_O*GsB<*pCVaj|eo5#`g}+Y^ru>Ex z7Ruc!NBDSxfq_MS0>*TMUJbX==6+XV{B1fD$XOdJX(z9QQ0%dUDB4>fwk z-cznZgZ5mFH8QP$9ih~9NPz^i$ADi#Xw5n~8fU!k%%o$mBfh*&?#`RFz|*Ww>v^;6 z`gU1ncv+!YGxo4%F~iHv>p{45q2d_`3pHtt%MWhaJ*!aM2DvesRa6-{V+LPK_oko5 z_jCe#2j9>cd*q-XVPr6ExbSmT+Pi@x9+b1}iYioWQSwHtOBhu&JBmaNLAY-ewp)E1OWVCpFw8FXwG@d)jtwlU$|V8y>4m zvxoh(XqS${7wsr=h|87EFf%VCUn?KR9Wz`sdA%G;d$!1xCC(c$F9DdWSY1Ajt&tv6 zOdTGqnRRZ6#Uu$DR@q65*T{YRb@qoBa&)D*0=W_Jji%)v4G5;V2|W`it3YOKWeiPv zC$I*&Tz$UXZw~(`+ag^7qw4tA?tQTFBHzF`RC+ing@P{pSyypcKudL~$p9|$w z-ug|R*7w=MTW>Hu2qmmD-+$5iyR*t$pMcolSGRzIXS28(B9XS^lei)E+A1qvUA5{k zl8p&v(>R`uT>q;`8g$|3>VCRo8XNhVRG4umn4*s*#PE6RQ;TEmg-JT*OWw@dIi*8_ zgy5X6>r^3ue7Esl5%q_3{G*)lUj7S9^@XdO`ama4Oi>ZG?>(jb*wqb zgJ4ugM|aCDd~`B`Rq*-3uy8MCt3G-=$Ybt(8A6x0%QXUWx0$%#rsM*7zKs%g$UTK~ z^p72KAFxY?dp$;%br|*&E{fqs@7H$VAn6QuhSbl!VNBHW=(KhrP9wn3o#X{R9GwI1uV&;ZAyO{ zdI0urSR3&ZL#eB)t$&4rh^L-F1##7@(C6D?W66J7YeY~el6%J%MS70LvQ>*ywJ}mR z+q5qWsOmv^ka;w6BT`<%W8M4^r-)B0GX^_l@nPN*IVHQ}u)p+u`>_PP*T;~*|5|Pt zyJ1X_=H+;bofkHih19|FCz>?+&A}ei@~?3cbk4~vt%8Ag`nyg(QxD0(LeCt>w>5T z3guoo7ec@9b@)-q-QEuOV@G6*U@F*wxL$I&okhvudzQ&@l+wTBD;SAIsq`bvrUNft z@uj|tAG1-DV{$b*`W@thUFrAlBPiz>eBL^LFNg6p0$ch}dgpt&o9X&?hE+A!QL|=*pU@?N=zBdZ zA`|pku}VspOm@tA+zY2OZ!buqe8{6p$-gGatX}%Q+1ni1_ zY{hB3NQ%e#3Dko@rtPSRD7z^`lzTvFJ62KKiwsd3cu}rlpm+qggMX4;aeIHW8mZcK z(VA6{+rC2kK7puv|R$;Am1Fcqe#5tFLq z#~C~!YcdNct3+V zO7C?UyIIXi{oQLy!20@~odkiIHj_Kg*ngI*xZdz^9S_oQxghej6UEf^XHLXr{A?WP zUNpFSEhkN0SZAQJ)vTICSNv_QS*w3!X{W(41M}Nu-I^2b#Za_3Mhi2W7x0_c6z`QsmK?R-%G@3h@*63d(A9`Y4lv%(m_Z zUWzQ3$M}MzOMU-jFby*+-(W0KEXskvR{%!T!8ibhGJWpGQWvW-0F7F2RUXF*aoChr z{wsd5XfAE;LOru%Uz_p-TnN_KlxV*n&$4F>okYq?el_He5oDA2e#0Xm1bQ1?f>0qw zm$>_SD;JoZw=%O=sJpK(8j2Cg^HWyviE&6UCPp8-!d6NH9oYvbMlL*awDF(P9J^8{ z8XBpF6+Z*3`v}K@5&9)|Wi;kUBV&$C_E)N4=o=ezWQV`P;_F}cSKh_n&;W(0lO8o* zeixvy3DnHEjS5r{G{xOGPB)x5QdVL?9dwKula=P*#aAPmR;;l_Yp4AFf5~Vk_uOGw^@=@-eS_v&F!&o1_PNqh|TA=R<{WaSLUyV@O z0LbzPKA5K{^HC@i??ot8EQc3Za6r_ERAT(z-{)nlgwvEd<8(;$gTX+2v>!M~9!xqT zQh7is);03e=iEL~iixd;htTO3xSg#EAnioQ2(Lp+?xWP*hhmg3Sh3>PRuCm;JNVPG zI3))nuC6X+EK}_F@^cCMs5oKmja2QDOD@I4UA4yUsvMRr-qcF<2IL{G6CBHVUNpf9f zws4r@51xk;TFn4I>YcIOmvT4tm&jF5=~EV}z?Uz9Vy$BW+_#PSRp!s{Tjs^@%iOp3 z)l*mu-K+H!?zCMzs7^G!-LfN#PB5WmM;4txo!&8=2GmzVg|{i|ji*?of@NKQ-=;1Nl-ROdD1L^*8VW(|&E4tQ86A0u18A*Th=Z8c9TAjZ zYD1+RCeiHHsP#?KW_B!(zgv#8y)5#;vW5zaJdiuHBXie2)lgyacaz(6oHpA(LNL4O z5ha}s0miS2TWYK{V?Fw66MYctHC1W~5P(1PsIpx!Et*Z$oAZHLjz81YNXq`f5AmH^ zD1FSP8Qzq4;8HLht)uw+1ncbp(UP6jDuj-e`qgwtv{615oCjv9PzYP1G+emMQ3*J* zXSoX>Q@l*V9@^GUku1{|$2w-wukDls;X{gOuehuquqP(UZS=Ym;h%Lv7ae4QFHS0Z zKYf*ry-$sR41Q*Ng(VbT*j`bpoVI$n4I|EiuR)P8y~l2ENNK^u!D+~}^fPy02W73` zaU2Wu=5S;5`;DoI-6RUT5y4n32Dy#5r6RzT`RW#2$}e?)Am*P%l^S0Z;J-!1rC_9w-0jC z-XHAGffGzRV-E?gWwJLkIkocu34u36<7W<0uQT?szM}-ccr)ZC#}3g?XY957&ghk{ z#HUp9jlC*;{Cuj6y(0ar-D$!{W6s(eVoTY4)*fa*qJInC1=z$trMN=MB)sJkaFhu< zXRnfId~687jk_`d`2F|Z3}F9rcF}}?I%ltLI(3LPpR+e;QuZAeX`ccDOd5=2VwDoC zkbaxvd4jRBuUxkD1ejky`V9byKiV5JfCGNC$A%i8^e-24`?5-Nf3){y-)OxR^&#Kb z*f(v@+iTq4_F?DkRnc}MfLu9$hqj+;j&PigXOx%2`JLn%OuX-&WNQ(ngdt=DCUKAg_hlzbts3Y~vW>4v8n z;m%OXzY^D)To>cwY4!6;H@5Q!P+l=)?r|?DZg%U?Zx7s#Zap>L8Ba4$`$f@Um(!Qt zdQlOXV_jYrL>!&3`_%@g7T1JgUjiZIMTxC}W399y8jWooQ-vm`4bh9`Z0b{62&Byo zWAJl1&d%xx<#o8bysQKX!n^LiuPCL0(AC}TRb@TS7ubKLVHf}Mkh^x80@mXxQU)rY z;_t{n5Ch%l)<8uIm^a;9nBJM1J-+u5(C$-%u%8BbR;9g7g15d7)pX?^>Qi4+<_k}`55J~(13fzNx-tcSZ@i)8 zW4%-xf+MmkeKADYiobun2~xZ>CBCIJ#b4T6{0Lb6mZIVA=35|k`;hP^g!0Kl6>qNr z=wude#XWGSGE=baT&?E{bPQ7>s}{Y7m?98-C3qpTp2<%W5E=(*7|vLEnnFDEbAbmO z)sf{*h;Qi^O2daKqW}60OkgKW%Exa&_*nbHiV_i&igX9g*>vB#CLGK^<;5u-~`@O3vkbQM``3` z`pTA5*t{CJwUP{_A2y@znaWf6`&|F?c~_Y#%y8$vtK@l^Z!&AVA|FKfcxtpV(R9(2 zlNnGGop)z6Xn3T4t2I`cg}<-HDxJ{T!Q+%?aF;#~yRw)2$T($>i9xVa@+pK&a%Cyu zba;ZYLAdDtaH2AVzY8dPx7B>n1nMQT`$xgJ-HO0&vGU^Pu8>W=M20Nt`1=@?+1ThoV_4TE$1>P&NV7T^f*t2r%)k6>-o<^x13$a zVUvnxJ;<&GRR~H)&&@LcA&Q&_(CT@L)GW;tdrs%OfH{vnhhPnYwnc{y%ne@E@*w8q znveBAhWgD{I%0$Te7@2ecfZWXcG=n8YJn1H!t801lh?#0g!l#N##N4(bSIi+JwWUg? z1(jZFY;F zcHRmapz zV?8#xHMD=dGKmA&)4}+B*aqbt_MH!B5Bk4lN zt-uXO>mQloMM5^UIMFfEguuxhcGUF0|82qKzyIx>_y7L4 z*KSj(x9cz3wvmK7u1K$0TWeQP;r+9YFh2hBU-|gjmVW{Ap0bbKK}QuIp)B&+e>dX| znCi<&_Hkl-fG-_r<8Oy}O1^0s0qhvR3B)eHBm=;1uR_8=GwK@sTb|JlZ z5)VQBoWkUudcs>fS4sP7k$(IRK80N;jj~QDQGVAB@<3`}(QG=eifuH$-GyG1RdNcA9(~*v#JFyaRdn{CRohbu z0W0$^r-YfgI5p`u5~(1ciG_YY-6nvZI<16poc2`GCXS0mAh#Yg@-&3MTj)TSJz>85 zc!B{DD1y}Wzv)U0_l46+1HlAuu=q1dH2ZIU2E_DsNn-0I_1;8jeF zSAq2rgw0wO9%z+*55p70b{1ZZuf%B5@~4IZo~!h=9fD((!1C~g)A+N>BGa^0RR5e( zGiBPUZcs!`1E}8}rb=x<*LwMRRQEiKsy2&NnMAqL9 z?Xpgicr?&ub!euxAe21?7<3#5P;}h&cHcdRV+-k!8(dV{!>~BxBKmC!eSQ&C=yrF| zPs(qC$pn$&sScr(a9P>R#91aic=n+2J44BLXk>G8jEl8VL41gr0*hYvCFS++ZIpIJ zak=+j!D(U7WOgX%M?@o;>3*&Ra<|BWdphG^sSVCP6F0f9^m{u~!98SCELEV&rl6k{ zW&%-ow>X&I{252x49fmlX^8O8JAVefT3hJ{oOYp*^?6A zuN6jJZi2x9gL3uTFdBGMVNv2zF7*rxfO*zA9@i8Aj+`UyW^504Z0}BXpfU9p#BE7?Ze)pzH zb~QR=GyyXG z5++UTr&)DO$`mM&k8$+`FQaQJ2Dr?gxVM)CzOz{j-z5{mffj!KIuL{^rPRHnZe5GV zbxC_~SDfZT08cNEFcW-$m!V9DVUeznL0av%Dfz9jPMRUV;^((}db}3M%lJ}edl<;| zbEx4EHm9$IkT1)j`uW|u=F;r^3p*vflJBH-4wb2Gt~=D)!t3M;Qr}0A%s{j6d#R2$9Vl+&pc6qV)2pPs)&(5);=VR2xp6YiPtUEzbnY-ZN-qhgE|t{?ug**_ zzxeH7dZ)6=l*%RBGMu!cvKotpR8(2j0=7)HYKKhPtWR`Niz`@_EIXz!bEK4Dm8WwI zRwKe6h=^`6LWuU!Lx>J;JFykDh^-$%8FS3g7dX{x!q6#~G0K_7;&Ws1HRQUD2iM%q zeg7kC&W$yPt!yX>w{V_k{*wiFe)s>xf(xgRPq$4$-7s=sbyr+<5Jibkx-zj)mS3qA7Gb?FJhitW>qc~HD!p;8KIJ!oW1ZB?)h}$O z)nn6DW{U`8-8{Orw^Nt+2{+7)(_;r1JHWYw7E*p&lr|b~?BLK|+1Ke2+v68clK)^@4T?Uj_k2ycuMKiCHz3Q)yK-B4GPi8#lc3#`51hmcpy49pT{dd^MFR{Wn%qS=iCk zt5Es>R83WI9a&v{!Z!W7S@QwbL#wMVgCQ!euJ*wzt%k~?XWK}~EwZ1<7hd%C5q$N!Iz#Z& zS}Hs9`_=+FJ7{t(wRXtf)n2R(rbj>q9?-8VHKCxIYB-UohS2R=s)JPpOI=pgW3^SL zqYk2inreI6R2#=8g2(L~7j6N3nAE7X)S8HVz#oT*s#0Tzmlk5|79O<*YHIPSMoVqn z)RNJklb2F|QSHWZogl26tilAVx~lnbcSewzohe4*-4jl!%WDQxXNk9Wn52q z>L}(5v{-+;pIZ2b_AXDt4sx4p}l&i8Kotnt& zsZutgO!5CrqWY5UcT6}YS=gPZ#_~B;jZ*K`4JIK8b85?2Gfx3yfz{#0u~aij?PeN> z#MH%5Vr3<%9RTF}Bo4V|8DtAN>VWp?Opnx24?rSg(`r**yZTPLQeTY^74@S)+qc)E zF|q#`-N@p}x~hom6OukSMv4J%P3B)SLDSY%TuK9IGIRgoMxTXsRhHJmrYV%v>_RYI zuCFG9a?uzHunP8{Dv z;JOsw?44kWsIS)cX8@~~A)H(vpWL_y3t7sj4|pqzJ@_?XWjKBt>l^qrq|&kDIDWOm z8JLP!0FtIT?Ug8YMRX(2^4#pp6*>4s>Dz9FpB=K?9sg4Az$NHePR_ zieSm&8=~mu?>t4DQO4i_yy&y2f;X!<#iu1=VdtNKmzC_UeDh0 zdU798WuU(A5jDo|+m)4#q4_GOI3iAP>SGhoNR8mwZ_i1M!c%I|NEJDpL*;P((MXjo zzhp6?@RCMqjBTbqZD@ZZl?(TZN0s)V7LC<&%xaF=WjAi3GJ(0)W=OafGkz$V*9N94 zFFj$QE7MFde#l3uPgu4lZ5?1lmope=RTw!6k#{yDEFzHh**bXp|325M#cMz0>w=%G zQke9nHC27lq-K-rhf&|W&Su-u^U>S@Gidh=PS>Z3Eh8wdk*Ov;I$x39RUTD0GGor- zX2!@a6|@_-K+J(VNNldg)jGC?B|R}*ag34hHSj~=T%3B|kRkg(l@a6|5X?KxJ-NC1 zwBWU1br2QpY8xdSh0-MUIrjkMI$>e1vs!|VdY0C=RJ+@=M)@+^tzvGemwp3Q!%8bP zu-q%Y>@YOzE(ol~F&|U!R%&fm2E5|+m0LDJ%3b4O^hw%+P>MT70QVTeSy8v{vmf zWU(^4{0LgpRt@vf^Bk}dNNue$ebK2UJ&`xHf6qwj*bbX}OdFN?RrpX&JGHry=YZuZ z8r+6|UAnYqjhwv;s|ql|&q)kT#0cGPqt^7jGbxlMl(oVyKB#au3@sj0+wi8|_B1v7 zF_oEG8ARm6T6z43V0xyN8bwzhQ<=le?~kd>)d1F>_qQt*O{!ehq&Q$3OvT6gVBNRn z$CNWCDaeV9S#75>x93mLEPNA6MgB3tIT;a&@GFRIk2!;Q$@x7)=+x@BD^oHa;3FJ0 zpL>VUYwgvka5ePlfI&S-FLY2DpWCjZy2>GHYX9#C1|%fkoT6PU<1hR?l_@ zb(-lO(OJFCB<=A!8~;(VTHBPni8d#zHBDb`q6^9D2vfl(_bVytJKVw`^YgZ`4&Alf zurRP99ozD?h)_Q8nZ?$yf6Kza<9lvc7#JpfUPxes?ww)Q z?z&;et9_jv4Jk$sFgF4fe_bcopUZ1NDO^KN70~~KgfJhZ?qI?zNSku|t6Yw|zCXA$ z%kHZz;<|Z&+RQwgm2Z)zI_c^FHPEgDF$3~x2cT7LdLCWXXejt2bXDhnfamB;@Bc$(`8$}QIVDbPz%yhl-{j~>1#e%EhwLHm z*zs7(?HbaFVtx#?QN|}`GaVbGc7axhtLe4DYC1fGOOJPh@Axdx)XCG}3LBcPo?#5l z?bkr&b#d2zT@5gy!y663F1PTWP5a8E?cSw}6vqz1R86BrL)3U^to=M1Yp{}j_v_lu z4pHj^;ixy&s`zX1Cdduo&5U^7c~jjCxmNMq%7}aS{nPQ3`(c3DJ!qI3%0=q8uZ7d> zw^ioz5p+;@QD{nzHwW6N_i%Lr48c+}0n1H6?{IQC{<+|GbjnvuhrWWpL59)_Z}LZ? z!E5;&)7oH)-wq?TCN2PXBD3@mZgYKYVsI1JKs%pRG4Oo1Mu& zEA@kg^NCDOwx=rLj5aq@s<-%dgETpLeJ4FXXX}Vxh z&qGS9bJf_yzs^7!r5`C8FO@>(JhfvCD+R(fK3rRBTsdHwjHnqJ@{zg+V%Q zevDBQz%o*?cW|(~_=su|EUN^VYLXCG70L0wQz1J);!W9)&4;9HGz8m6zvnyo+3&Fc zyWvCVu?~5M{0Syc!B%6|F*Q}lq2G`3{jJ4u-W{b4^Mc)DkE?-f1{;|tc?QWtn<;5v zvXOeSzuR?6J!uxaR-aW_7|4%`FDc|Yul@st{-{aHrlsz$ohI{P=HHXNq9laYm#Xbe*8(WBQ&h*vp!3OTfC>X-P6XphHLK?;1RHJP7ma!Z>Pf&}Se3Pc9Z>pnkqMo{m zU2~?p_HXJ91}xz=#-SUHx@`bk4Mq1k9oVpH+a!#3@4ctKB|w~IWYCDA0uvX+&BV1l9Rm?nTud`%Jv2$ zFi}Vhp-bMprt98`RZTRXqI?n)g&(PtPa^ZBeaR>BO##L~K8Y<+I^H+&47$ncmpIeT zCbyA@FM=lDR_oA7zeI072FSR$Y!*wz*MqM6C9-ZaQtU-|x{asUgY*Ly(U(2lmZ(#b z5r62mKK8_4aF}=ZPfWnzyy>5)kMvD_q?uZOr+*?m4yeTQDqkNr_Nr9?f7L(0D79bE zHs&%Gum^3_U!AG&>eo?_z2H^DKwj$E!17XSOMUsP<#@$cc2f!(+Y5=~0uvS9YCxWG zS2r^d9f{1Jwi#u*5YA(mBQXYd&Goy_9EnWoSdb&!V(uF!@e)0I*YW?b_uhd~6%5V(aV{ZbW30|Dv1NE74%A1ee!*O1BDD zJS_dXSqQyh6_|cP@{m=ig;BmEU7caUWDDZYY6l4o@a(l9Aqf)SKFUr>M{Ttr z!5^^M9wa>FiG40eNH9KLY=a~dU=yN!KU$++zr2)#+_RgP!%Vda2}vWALr?f01Md%O z4i+HJ1?ya~5r^TZd2B7ea*Fro_owvsDN$511Vyvcf`uYrlOsfkE3a~!Te?3{H`8EJ zPHv+sAwXVS&9Yj8js|uxQ`S!*(IlL!!^Gl}yQv|xIaElCar-1flg)J^uA;VxqlH{# z9nv(!tfnUGOzRwpp>(6Sr_tFnOn_(IZInie5Z=`-cg~Fv{=#8!&W;q;utT9l3+?cc z+5H!rGcQ_T1lKv*+@OKZc_~(?Y|_nk1|$kTI{iHZRjMM?!>6-j72$*qJTIx5Fbu^3 za;gb+F~Xs0d~@_k!hb;3-$)XAfT|x)5)?cOtuEBXjv={jUguzE|LQ^=qyBEB^HV_x z;UnjZ>d2Qw;V~QelFUc$T$_(Pqc$ITXKg-my*e0q8+}rTk9?vIA32Chhwiia1t~nZ zOf4{2v#!vROIvxM;F|x`gu2*-?DuIzcfsNBqF*rDS-x_9Usq5J2CzMVGEtaGOB)Jr zvsK46Qs>sak+2SPbNV%5tDo&W+f?|70dR!EC$d%%24me}&4u5vfQQY6Z}CysLih>( z3-enFjX~OfY6(J;O;N3cwgB7URzhX`IIWd19Y2P*7MN@>xV6A!gVn7C=16|KHD8>A zMh{Gbn^_y7t`QS>tG#eZhXDqr3Q4&5iALlva4ty|0yro)q^Z-rnkM|9Gl5_GgW!#C zFI1xjO$1-(gA8E-oBgL9)!7%-DF~q#ItffQrmMWuMsIc!UdB2OcM^WV0#loQZ z_*wS}z4QuS$A_;7P4Nxus6!84!4{sRpssu|b-M~v@uaXTUyP+2Urgt2d@;G*_-2lN zyU<1#yYX{*r<=AzYsz=%rS90FQaB^$odD-tdGY!KVo@=~JoO?R!|`tp8(J5j#Xr7e6s%AUt+*A07 zCVx2XtbVVJ)+A0JYYrZc4YD-7^ zgu@9jOfsWVRtsM`UBj=k^Gr{{PsgP`4=PGYKo~(kAwERChk-ksGAcpJ!YQb?4659y zw@|(E2$v>AD+UU^hg(^=`=%8QyU?MO1X!zJLS5QhsL2OMfCp3PvB4>@kKh%~Mz*>} zhC0sWB};w#3E^5mA=k(C5h8srq0}z((_?-PE+yZLK0+rjL9@&7Wgu%mL72Rd=A(joys{`4VD7czJBbDlz3q z*QnIFpTLxU)f&GW>6@tzfyo5Y==a*FIv`}}5Ox3)$M*+AUrp=!3zdwkmpd#g=tzH| z8-7U|fL~@GvErAP1_&-QBBBqyxEXQI03pHA&n3;cybSPAH68MH2tD~_0C-P-dN2U9 zhkda0qkt%q2MTuc?@Jv@G{Qu>4Fq-VNXrJ|K){5jezY7U)T};EiPQk&O8#JQhfP&@ z4YxZk7$nqzSs_a8;3EItN;KbmPsJ&thKG~o;s_Mr`=gJE&I}Ql zdL}__^;m6{NEy~Dp;XYKW30co>UatnC`GBFwwm-Rr!ebY6&6Fp?l@E^@L9Z0&$Lub zQ_hk|k~mCY1tv3xLH0_a&xQ$|uw+fh(zGR*vs&($rH%9-E~J9f*P^n|i^F`%>lV}a z;X(_4hA$1>_;O@8$CvxV8Om+p_)O6wgunTQdRNS{moY*cr;>Y|MI-n)helwWquMyv zF%I)sc<=NbRnc6Z-Qcw2)@!8TWo2^-agBimzd*fz9T|-%+y;CD*h$MBi4lvn5erAE zBf^^qm%XoFKvK)sApUJ5`(?yY*|&Qkg#J=1qjU8bVFKumv*uWVX@8s_juQ^E_<_#< z1(}{mi`HXHv+9SUOxfBTbIxC-W_sNJ45W(=jm&iGzrqK`mdre!~VHgucGv5|iy|Ie-vs?2k z-p^>(yTVc34C?cq(8zNYk~rwfkb`XfdqRq3?RjtI3*;Khf(rm(qR-7n^=m{d!Ve&E zyf6yr>zP}4JshgTFUJeL@YR4EjA2kQ$4wAY@X}EegemydM2ilX!zkG&(ubllg-FdG z043nngWM{UA7rzN`)Ur zI}sdr3`IMGU_hTJyaqhoK2cx_O*om)gH>HH){ds8lOQiaD=|r6fz|I#5@L)P0NSWU zlY~BAJ98^r4(b$(=BgPzS*YW^Yip5*WwIW+)w18(AjomDFcMPOnaL0rd?`!`RVVL5 z#U~PD{nZSkYW~$Qq%uPio?#ydU2swP_5)!lyDUafhEG5!P5cmdq500QKNNg*uGdEA zSbK)inJI!~QeR48AEEDbdhH{j1%~+QBcTRM(^>kF5bvYbN5tl!VtqHLdA^(__)zjx z!RyrlidJ_0UnMa$DwP?cyQ(E>VbIS^VyadEhRun0*!2}HoGLUhFz$kRhbQhEzf2dry(Z=H4M^txuYN|A zqFCVURg;SD`G)u#HAi#aj%v*i?5-{XDb{VBa~IYZbWyZ#2Cgz6Z$ssLGcHLD~M;LIbh{d$c>N>~MEUW;Kb6H>+&9D2v}1u4W12w9__4 zkE9bUW_fhBkO;P^dE8iCoXw=MP2LWtZBw@3F!sl^%ryEx@2g?Tr9H*uFrJSMhf_^k z09(sEyHXDa?}gbytQpf&D&b3S_T~8Z4kZX*-e+GjCpwgx__As?WY>;49}6{g|B^?X^3p`J^i+b9kb z{j|L)aP7_AFfob(=L$a9AWii6+XnH**dQfbjPQ@*+{s{J8-*+hu8rz@K0Jy(Lj(G9 zuHa?c%l>8pE2}=+Ru^b&$W&^8^-PZztWSnAggd@5OsN__!r15I49~I=oPr0Z{kI6`E?WyMUV^$Lpy}gsAFTdMxPt`YF}a?RRA>Ml)3~vrZ6M;(@eNux;nQoe$NOL5suq0Y;McF^@TQehW@ zIO+EU@5XLyIJb;rL-=x`5j;maEr-NWKV*L&&yL=xi*;3EfB|R|31$e;2M4GC0V;K*$hBwEHWCN*OQFAS8eF|qKt$#o5-L&RY9UHPyAoFli1gJ0 zO9A0hKq0xPD@~lbL%bod4JjZZd^D{T&MR$OjR{pq{SfZ8`;kF`jM0%|*5G_LNu_dJu~1^ zISfd3QiDPmI~lGvKWQ2^@qH`xpn{)-a9aMg5L#o?B!h-o49`}$zcD;A^@Y|13M_%*oD2Nb>$l6wj@ z+z7BAqgOWy4U8Z9D!<{r|E|b@{>eAWJ`*uvrM!j&lWMiHl~(*;U6k@ozK< zDMOOUe~aL4KJ}BGX9kJh0s-r7bh?JjB71~bpX=&dJS}5r)D~eHmiS-`zrVHLDzwD6 z?5#qb@Dw;#sQZ=Z=B!8w@)H$r6>33A6R=IF#=-oj2W1=ve@NdZ3^1fAw>@Bm5ne`! zmEi3_NnmY|Dw^KYOS$XbV*E?J_X{u3YiNu2zWI%iYGDwKR3VBf-}A^hAcUv~v@YGa zAS4IeSNmhDI6LUQU3eX@ec(Zl4hX$`9;#1$;cC`+2M76~9YV7<{|xfSY6lK-<*_!~ z1Q&`{NP=Qy`6}3Hr4a>!Hy42>Q2JpZ*uZ%KhkF5@m=B-fuElh;0D85z>CXZonKRc( zto3^c^w(Gm@;4Q7us<#oT7u7hK)RivFx_@S50FA{?G$7$`WtFjqP*LJEntev;J;_0 z0eW!5w}Jx*oA|BJ7&LIIj+$%~9D&o+MxK^qW`J@UjV^)JqPf#Xzwn_Phl1Ec%Xo?U`J06kMjYn?(rYOot>z%+Vsw=k5WK^Ce|ZxY_M zW@|IE+w8uUG$mU{(VKzx?lGU>iDrbWDuz1)$iQYG1>Bo`g@47 zR>SnxdpN|0?a?5fLuKCqq74g$p%l4S@CIy1M~}A%EohkfbuRK>Zx!m(I(!Atx9sIq z^u}J`+**$6aa3&|7Wx&{+XuRdaDsipJ6Lw{KF)iZ?iW}R*j#nzUiwBz^wIKRGZAU= zej$}ph^i`#>HdBfvr%!G-a5d6IOPB*755KtQZeYDFbjZQilCewLgVM4?lN`#D(WuN zK>1wM^;upH$~73=Z{Ke@5N>+#rCFJ}nuh-Z=ys$ma72hr+kfHEZF`DC_ZU3g0Nr(`ICRgP;^#i(w9wD% z&V7Rt{wzc-I1NPIH;EzY;nN&ZZ=B|cTC>Sq{(l z&k9YsxV_6mg#{fw`xO49o#Xh^^Bl*YqvtsOH2jS(@W5}+#h0(Ta&&S7nd3N8v_2QS6Jg4P;x8 z(`frmPR1|X6sF+Y=vzV`n1M)}QJkA*&sE>fX!iA6LOqN&kJ4`nVbttTAt^aU`Luiu z+R2Y`tH)fzEp{n@g~-vLLVaxf(LZsaeuJ+52^u$+0&fd4Kf|~$D<^b_a8A1|B$@YY zHYpaUZYJCo8X0GD?p=6WaF}?-lRVNrd>?gGZVSxa(Q${9$Fw_~JWjnMjH=26&r(FE zZZ=t%0bz-Il26e`E_qs)s%z9}qq0;_H7`N}y?d8$>N39Ry?mCdt(fFL`Y(R^boYd2 zPYa%D_qgEsh5L=qp@#u0-CK)EuFUzvML-xMx2#ehhA3ZOv@5lMxQ6@MJ?l%%=&}$? zDfdBp*!f$Hu3`N2`L9uXVZW3$dg^*bXyLb3{fP-s2vcOoaN89jfkr;yQr0^6$&AIF zEWdo-?umbWQRV;VA8`Kv=L3#7u@AYR`q@J+s6Kqi1=WoVH-brcgex2ZnI38Pt>4PG zViV~enG{e}FHU3rN?M1?)aQ!O$nV?oE%;Ui5#NHQo+1-;cd0-1_7vI0Y`mw~RYhP; zhlKZkrwtdy7`)ZJGaQCY7ckl&GIqXKYZlGec@+vViZ6hjrx``28aQJV|Awu}CXro} z4!DPR5B>LR5{);Bs;G3(-5j%dLSe}f_mB&I*KgYyKc`({%3VW73+R>&)|7bJmjlE@fUaV zXF-wdexkSeCL|&W5ET44a`p1#P`czNG6DV!W%`Toh4UAg06*TJ1M6#l@dR{i(*wks z#zT*wMxz}8Vxlw?wOzFLg}Rt1qLQ9gkNw8iW9hB@rl+!LHG-*npcvqW{b2_C)`1mv z<2&}txQf4QXTK~96q(NOQXrp_-6AST4c*ToR)^AdrbT3>+g4e`diZwMB38pUf2){; zCiSf%E2Qy}RgBf=?Vy!bu`afv)GF50m;6H3AoN^9HG{-B{F)IY4$vK*HBBoA@R${trIo@s#;go;AG3lA=9MbYpWDMl zm%@!dg5UyUN}P$^>L$aJXwWUy+~u;O#Q9#n6~io9c>X@+M`E*2hXX6t9khZscBHG} zq5uU@Y=r3WeXzxf7+ThH3ewq%VPxCf#Y*cMyl15UMu?&2Q@1UMYV1gJBE%|wB_CRG zS7wc;;u5wtU z=*${ur9QENfJXFWXQOAgl0;KZRSd|dGp;naG z!N}$`SDnH<*A&hkva*nST8RcA;t!($%1zs>8rh$(g0fk(7-D1!&d=1LUyH`jpQ07> z;u#;!Hz7Y7J$G%gD)D?)xoXc_=xJKc99i;s*Wg927yp3nDwr0jO;cmEmn>Fa@@@=X z@)26G9hnh>m*mm*7%crRpoZTt=2FUz!QMTJ5hF}_48Y6O)h&0u&pjT4!0yOFGwaTJ)n(8sAw0^(_4Wln8cRTgV;gW+b?u06Z57@G9? zJ+*L5Rl7l%e^0MjgqUuA+C9Cdw+CBL?*B#KR~D=2-X!s}U>o_zivw}M$Ha?WKtQ&7 zQuYs72w{r{J<41|)&wy{H#k2p8 z)38Lbj{cLcXmO(0gnj;+C|-l5q^OEG%5O#Cehu`&1RXgQ{$+Dz1Rn z`M_#oM^LNH)i{ClNfM*@8oy<0jG>p3L~GRE)dp@9Ww!f*)htZeWxHRun#LvZRi!73 z0|IubF!Ql{a|O4hx_A()+pVo`MNKi$=R36tllm*y5Nr7yFHy7fDB~$(69l|bHN<58 zBi?1SETrW%L=ltysfH*=9sX3EM;M;%`LyCZoS#zFWY;{H{e5S$cm%KBU;b()HlD00 z4&=1>vZpfHscJY5YB_z7rrs@p!LZ6KxUT>JlWK|GFkW#jPLR6@oFEqnoFJ!*e<#Qb zMUffLirk}W9NT58tw5e5awJjJ#(z(x&BR~>Dw3@w7m2n~M@h7LEkzUuH=zxeL{%Ao zoHwSkOCgx=lf)iaSE3AjNumG9oH=fi#X3Odla$@ITQC`Fi*~-FKe2uhG`x)%8nw}B z;s&-b1e>qr|EoKyS8|=G91q$$t+r?}y$REpemwPMF5(k}F*aI@(y^4@Kn%^PBQhO& zKppWYUVNsG$UIIH>WUNa2?^>Zy`72iVejVsiK>x8F#K){I+PI?|INRGk8^=6b;NL* z*+6V#%3=u~E~>-cY9O*e%S%*R2ZX3eLy@8F$cADoKPEyv)X4CHk9$qYo@db;QKZOHx*TV&YzxCn$^rk-I|J{v9g0r zIo-WOeSrTYGy_dep_##gJ>1LuBbvECV1KJLJJ(ln3rmK48+k8q=K+oQ! zMcF6=^qw#VMY|QTHNbFN;isZybBJ>(^hI-VGV?KG(YBP*LNxojeV-ojNg-Ew*Ghgg z9*>#~P#!-8i2vdLG=Y06X})H(tA+S3CeXa4sF>$kvAYuuRQeyqMhjYsr$Ck_8|X+= zu^KIFB|0#*y{)*w_**NnMg0`zLoL1=Ti~W0Po4}M2%IJhJ5BhP<Vx#bvL>5fd?j=qc4!$I|dJbhsYRf4@wg!Me z*LA|AJh^^O8R|Sm8D^`#VyffNZ1)fqh`P6%yn5sO6)F=vUCx${kOKewxM5MN> zKqB61$4SJO?LZ>_)JVh+?Kp`rwHH|wONaL2>s)E~DctXN8N%t;_D>K8!xO~8pny08 zr*Ps>IICI+4NMkaps6X?kThD8BKAe3pCwhyz-}!t(4y-v+o-EmOr(XW{7S!&4!x!2FxPEl><-c8c%3c;#4}-Pt1BA`z zd0gQ2#0r6^ytRENG0y7@y!tLM&y;bUxE#2olgNC9YIYV=F#E3%HqZ?6F9?z`_q9=x zx@f3?H>e24oWKh@a|(64vsgLqNz_!2W}y3Ma-3_}MXV1M=*IFbVS56f5vMw&H(cqn zyJ!b?lLqPoU2uIwa;z?*!fF2o4S>}66_xfwJozs)Gh1DwQm;m0d`?%fEhs&rH%t2> z%hGFth-z?+L?eyqDmKG`-_VuozP4+fg6L>tF#Cbs{>~6)cjF9Uht{&fVN?}36$Kfe z0vBxh)1z(`7y@7&L22DZZ?9i3m{@#NN9xm^1AJz84)E|E9N@b!-?SSxT99ecF}@w+$o zUIBJ+$qT-qBR~n#dWjCdn-@`{f!{p#1G{5ITad{z(NfRz0;CwoF&8|CS{BfvUZR*Z zKN3{-K*d2_7kZsySH8V#L50v(EHZNxJ?JGi#U3>3EpEem{^|{i^JpUzb8%7a17?>( zL;FCJF^+Qjh;QTk1@+}()hm4gvD5THUvV>cSmat6UG zbAVWjk9z}!>mEiSR=5+LAAo5sChvh_y#B^)sx?roVmzc*N)43RXj%-tIZ*WVyL>E) zr5eRZzoIAxk`YBdBMHt~{z}Ud+CETBFm*uVb2wLs)1e0g#bo~4$p-#f7BX9J5V%wy z8afC|`D3yg8#Hs!vzBtT_C<#pjtv{J4D(OB(T?;)ZepYb(A?q{}G9a6WwDmuch^EYFg*;Z^WA7R)Kyl2sU zmK|^55HZ^C)~ButIhe4N&fr)@=_ei48*K6AhdrK+P)F= z_NxHGwIjUb5aqs#!;C1Ct*>hRZyTua^;B(2cU)7dkg$)9lr$7mQWN&|9EuI?LgR<3 zEd8%k^5 zY58>Y$GR(|jKtaPO!=>iEKf_t&=6Ei`R9iRFFxnttqcG7a25-kb-!{bMZY2T)939$ z%o3Dtd3(P1u%uIwesN5|bo`H-SOUZ}C2J4qT2+gtykQYuYNHIwe^ZRagsplib#_;$!-ogL5aO z*U%a1(sEOliX=x93aJNs2;OQ`BO$o>rgUI6l=MnG8#-2x3W1~ zc)=+0nNAgc9Yl5N??|%sGa;nodMf^~Q%b+(EO!q;ithp&hy`?u5nQDYn(MRHP zG)$ z|JaiX{72g9#-mRXY5T|GE-WlRHYvn8_Y*OM`P26O**}C@w>uX=F+SbBX4gYcW!xPhUHw@qeHgl zz)!^^OW8C z?#Iu0nD@MgduKnV=Z)-VKP+uBVHRT0|9L(IS=zSZ@mypM>mQ0JdxG}1!n37Q|V@LfPOyGQZtrrVR$G_n^m}cGs02*jX;hFsbzzR0 z({cL_v9dcAz6TE;xrU!`QPLgN+5A+Ay%{n`z%V2hfZFtT7+4j(sg-Q1*0HcOGb#7X zoLV{)EhrFu%;zpyxD8@W0fd6LsklIl^)2{~E6~u>N_`8VuZb!YBk-_Zp%`mE2jff_ z1lgX2yu*w_(UCOH70K*Q^=5W^aG)+WPlv3@-Z8tyWN%*M0kR#cTkZrIeuJv*6l0BJ z@xpL6)nK~#s_aiAcZz=I?@J62TDnl?PEn2E-YK#$SOembib?`exNN6bjRR?6IgkwB zJ_|?@l=7|UgL;2joU`7gbts>q3v5Uw`mN~2VHZthqtAyhH=uIJg%}kztEi`P>Z%2v zcpWjH7|LkpZ6n`ZVi*iP22^s*+$GuqIq`!zBJU(OTjXwE6Nfx{k%gkg*TJ2vJ$VM_ zcXt7_M`2B=3ecABLdfYB3_E@#+i^LJuRe5D>1xNns3_w}>Ntbai!!`y=Pp;_ zDlWUOuHFDm*YPV=D7$WoK%*Ym>)`x6yPtQ^#V5N>x%6Z=2#Q0UmLeBfoSJTPOZ7aw}r7h;o(tnFV7Kp=DL35~ax34Z>JT1B+$LG|qZJ{|q zh?6!S7tez+Uq23m7mJG3QQtpWhLYn1ZW!~OFP{)SS!FNfXB0sh@groO6!JU?(G`5^ zBrbcy$uVab%b%yr85Tm#j(4o%bo>Oqi|~;y#o}wadCon>VyaI6X>?Az6R@F|h<=!V z`ik4Z)V@UY*Wa>H&DO7l(d#8*qW%VwL3#}grW;!=23lXj6>(+jd~9^L1lp?a^ZxVJAwZMZd1BMElQ*cKzOkRC4ZS6KB#n zu{i_g^;Y#NIY0bOG%=1n^LO0GA+iK|$6{?|f!>X2=KNq2MVuEm>Zfm|(e*mSnWk^$ zf^D{=LlV`0m=U4=kO9}b`k}D;ZlO^RGh#s_vmRzB{x{~B6j?dFA&^&I?;F=4+A$^C zC3CvZ0qe%<`g!4qomoqxgovtC>!KK-{}E;3FI))q!!6#ZOh3=^3!!MmMU{wTKgxKU z?pzd0@v_46UP?gLRFjftRC2!#M7vI;?DUK^e)5wESFQY7-jU{u$arc%|I!E}Cqe}$ zEH67xUlvE`5!~MHn)pRjDvH5rwtl46^Km)&AkcH$WwKls`?2D5o=k2Hp=sCQld#IU z^E%Yk?$~UT`mEY55wYH7VsG~YRR5?})8;%-1_0}qnJBw-xQ)y=MHv!%!<*tVm)Lgx zCZy46WW6Q6Vb%h^sWg1LjTYY$-$L8yKg-+h`%|oDnC1=g&L`x1TkP!`#`?a5LPWR4 z>Y8NOxAV1ddiX}P*{n%$v?y;4$JqbSu(-}BmwrcVX*MI1Tva4p&6pO_Nq-U>c_AbM zD3Wo_+PYfSN_KkzOUk;!cFLk0$BrqR_Q$iUQVIUIGu^hb;%gdhO-e9+&2eP(?W82# zBg**P9$sk$`zga!k^@_>DLUt(VvivyOpniepP(3h$rdV`9un;3g%rA;mg!#b>Pu>4 zTpgtI8&BDH~P51V~N|klNa~?}9kj+;oC8N^|I;n8mgVrfC7Z?i#f$E{%HXr9T1Xj-JwQ`bL#-hLg-MC6r^7gNToqi1cu|O7uR@8XPE6de^jSXTIwSW#yGm+{$b8| zU#SbD1@HJtd1&B_@t5>E1G8gOM*Y6ANEarR;Bn^q5jHxr&D4tC36%EfKhWOzL4`N6 zS*UN!w@8~Q`&Y3M9SD+w^&g_TP5A>osvcm`iMlD}eUTKZBuHXcJ3iSKHp!Jx$3fS> zd0;}iEa^);eGn|Y!d8JvhB-%sNdB04Zj(B3fRz8#XGlxqf`F68o{YV#^B%(N)MM3=@lnXW!TCb{a70RtbZecxA|nA9sbqiIsw{nsYltCU zDh=+|%HKor2xJ*3?L(n!vk$doJO7H8MzW%yLlUJ!_^4Y&%7fkL$0|}Mpm=gsX#?!S zEY)J!$E|~9#iM~o9dy4?WaSq2Wc>e2kyW!;+VSmx`cd72p}-o_Yr1b}d<{vCb!%ssLc{I_0hD|8sYa%}4OCP^svo#>DKZr*+otL) zeE}Lj%3O8EW-u^&PpxE$xs~Q6OJiU*44@lrhKJCZq-)+(yQb8VFC|cY>Fk<#DU49H zBv+oK&s^nJQfo;pPm-p`ai>>tm002JaMSsumc(v4(C?74_zTqouBfvyit=h)^QAkr zq)^{$7cJbm%>?6Ywg4ViU62|=IX_sCV$B~wif4{kGX#m{Q98wbJ9fsv9iQ|fD8Lv> z79~~}MN1^JWj!lVY(442a+2)aS5Ioj8y;TPFPtjB z05Syv9qNsku5G5qG`xXSNB_$kxp|%9aOKS!9^pr8`iyQvJ`JV&39CI_MR-&n0=ro| zt2*WWXGnad<7Y)Y2N%#LjieL}?~CSwQvvUNXiXz24%=STNMe==p)n`g?bMG!jU@+T zAs;oCn(1|CX@65`09bOZW>Pg~3l;M_$AocJp=yXvXSk={kiy7ns}a$eD+`g_#9#aM z-xx;`{Kqv_YH|}Lz};1oH+FqRkD5tgdVGc{QUlYfB|gfp51d^TX_-#ZS|t=7_9NEpt&ZKUctsC{m| zD4}{R9ePRH%Y@FV)b}rF)7G>Fqb_!awnHB%mFl*aK7h09H|?bqbn#7*8U?T^PlMyh z4x{Bg6maO19TZ~n^!HIteu!4^$gI@i9RU2AsT%MPou!efQa#fWAMAfUDw>M|rrT4c-!)_5 zUL9)2v$Qem(2&p!YCv|>IDmJfd?u7i4Ufx z)8d=Zz6{A15$AAe}=_uXP>4r)crHR1;g zd+XmBMBwBG75h>2#hsyu^;@p@OAb)3uewP8)uUbVE7F&|U9kuC{r#LR_YT@w%G-79DiH|$<*rgIe#rJ3 zm9h(}9=%C7i2oyKcsD89{BXT$kId>OaZ}uv-9WZG(Bp1ew-e>vI&_zktL<9NN>`lM zRt+l*u-e~+PZ!j!LfWYd9=Ro7)qu`vM|WU$2io6V8}DrSc+owiWaFem7?09=fGT&O z*L!HK3Jl8cQ)9T@aCZ+$fUI@9hg8k0=zEqpW34IoGQxB!1wv{mKHkt&&`Nb5 zxu=55_Fujd?%R^xcAcGy`$?g#;9sWoDxb{zYVf5FiK0x(`|d&QCN~}ZKyBe=8H*Ml z=qNKh#YXM>OE0Q~!Kh?TF@S01^#`ON$8GD6D`Fbe93YLw$C3dOOZ4MAP@0NwIRhnE zE+Yi!srzwupp+QbPnoX0+U-u_S_N;24XHkeZ%E3Z3LEnNASna#*N=lB_Kd;oW>Ll< z3F_y;(rfS#LHdSf-+vgo5J$#~RitCNB(sqoepm!$b-fU$4|r&910*}c<({nv6Z z<11Ix#Eh0=tFRW$J?cS=vkm_#OrN8jjdc|oXV8GrQXlN^?$Hu+5;ZC7Vf`)(fYSVR zX$)XL{&k5t;)3#y!LIktfnJkkJoGawU%R)K0>?-!Fi2#11EI%Ue| z?0;=#+tih5!s52_&RTCUvx5JqOzr3Ylry!cu@dvbA2n90={tFjTB6>h6wv55n}tHK zcNUJ7eDzFjLynr_7i`Y6Z%Dn7bko`5P4IYhEb5OMNh9BqYUx)%Epy8+#JS-u=xFey z^rwtq{gkD-quM)kNidiCx^E@i?m1z}3=2)4+rolJs+C=5S?WxGm+3cF(dbU~;FR^A zV4!z%r1sno?W0iT?gKq2LE{f03jslIGc~uT`-R5{Zpl_ZY6`4oOle|E$M=d_U z<*@8|Qe*SN^T>S%Ol>@sUCDAjmEH%o_>gW`?@&q`muR6ip8|z({Yo#h(X5F#%n(nz zMpMiri6xZ9<#a#P=4;;tTGgD-^;zqtNlC_&n^`HBGt;E8n#!|mzSQ2Wezj1Mw>Qg~ zDRpppGN8oeDFg1ZlcgFJw5BOQveH*#!~9KZu0B;=N(Hr0`S}_=3rwm3oEE)#5oxTJ z&P}C0oo_`^)eoel&xU_asB)zE|A+s-g?}}gF#|Hi|K&}15TYDD`~Ppkzu$y}1^k#6(P?~7WVOgXoGwgIQy^|{?>UPoRxtLE5?Zt=ZE?uQLMGZp{wWRP;YVaB?{IoL) zD-9~{L7{230OzbcNryr&&g{ifOQs*Uj)VkQGU*VSK2yLI}7!E@3YMAED^(oy`@XDxJM zXmVwp)WGohOP)SdScsa)N3XwLmF!=4@uit3+lE77c)~z4@}&v-k^%}`4?xVK#P!k? zT#44MmukAVPVe42J>P}QQQqMgM)InzhI6A}tfimJBIu5>(QEMy%olVdyZrNW?PXx@tqA)YdBA!pfq*cDkc5T)dWFnqUG0j%kj@zL)epRP?PYp zOp)(?t*TM@{8fRZ;{1JS)HbOhk{C*U5DODFV&a*f1hc4IYPS(${y2JbqZAWaQc&b! z*GD?k*f5h4$R!)*7c$Gaej~^PYG9pkN~ieJtmNonL>BR_QtqY+!Bu;*_oKZ1#TZ1o5x zs&92=x5mM9k(}})_|*1RQPB(A+h}|FvIDE~pN-1rIDX6lYVLNaT@_ZHT}#%BI0IL8 zc9Wv!=G7^aa>AK^5c%xj=v;q?6w9%+2F?64BKCP}iJ^5nBtLANR->STV&Ly9ke)n% zt||tMh}2X8;Lm2q4-j+<22NS6dV!{nIO5~GwKRqW_M>qv>U$@`W>ZT@!DhAClU)t* zK;RE3uK-&=xj2Sj7}pj6u}>~C@W^dXXoOi`y26?~xD~>+-1iGO-qxnIlMlgZpiuJS ztFJ>DX@4O;x$xg?C#@;u2wYcPh@b1)@T{GDikQ}O?Ic!EkH!boaT8NY--&5HS{uWO zP4Ar?iC66e5`VltoGplocJdv2jNfq9V!!=2XRW%LZCJ&;#_D`grCYt`{EPWEsW9Ir zl)b;4_*ZKBB=%uJnzq@Ol%rDZN(HJCN@D_eT%hTx@I1d>i23)zP>!`LcS*It5O$KV z9`&Yg?BZSs5Afsja8YG#$-C5dsLR`>jjz^~<_fF7<7M=dc)430K;>?`J!sL*ACPr|>7&anQXETDV8mU$F(yl|7QT*+m~7?BSDdyH|49PMir=>hgo+ zQk{EKtz%MnpsE_Tvx>yypc$v^Z@{Lv?3Kcx?<#^JAoT?}L+*tt=qKv1PkJ4p9iGZD z4=ViqfsIb@lkD!*>f8be7oc+A3pF61q{e;-hyAG8e&~o?yQAZxM_)X7YE`Pfob$Em z`_)yAJ|sz&6RvG>(fmvMp_#@t{D9=Bz}QaG=qAQsdiQ`7&hk}wDnF5O0D7FY2LO~m zPdNCg+Hn9nvDI|r0F+Fhowx8f?TCYXM^95m56MQo4obE8GNDZ`y*-34(}%u3C|Upa zTD|DuLCF`|$1~cdLL;OeKAoHFmoMKFn@Y_NNx{&Sc_Jk`mBr3eZO2%4L-#&@bx7&} zjj*TkD_TTPv{B4qENIH!SWX0M9_9<`eOQX~y|68o=_kSmYg+!l6>zj5daG zP}MVQehBH0NTGa%7qG!5ltB4+Y>mbr;cL67t<9}Jc^1Mxb?`2^5f+oXFkzV(B?9xwxG3*QjSV>kX{2CL@GUs&76N!@~*JwS1GFn*7@yGzRpue*{*`& zGXc(6B-O&AVGOWNuNOioMN$}&T9s*&hsWamt)YG<1>ueYB!zo$+{qx z^n@xOgPMOFS&!7U#Xa>}^{(c=$#4?a{$WJ2&tK{wtjhL|W87SK>KHfIJvt`IrgcU@ z`T-R-Z4**kIr>>5423S&a1hw1aQIp8m~dRG+pye5q4~;zNNP3;gXN7%_+RBrsxuiL zYWbyM5umc;QVrcYiupl`H1Y``x_fX->a*Ao;LQ2~3Tj-6?{)V~rA|L`HEjO<3>H7b zufKVJR`*h!Kig8tU*jW4=;;|k?UufT9Hy~BDE)R)LZXPJlz&o+3|E~2;lSbY3q+|L z_AiWc@u76@q!gl?M3$eVUo0zjLHhT=>Y)?0JhWGWX0KZqHLUTgMCq?vgQ)Y*(kbZI zGgkQo=N|Pk=)5WY7pV>m^152UJ0bgl5mk$&cKTm+aJIc4MzwmqY9gOgyh*cD(s})t zMAc493!zBXl(?wJ#br=W)#C;Cj1*KW%0466$ym%aj66W4NwL&ge@sV@I{BaiaAb3Sl-&L>{Wc#iC!37Gn}TEfW5<^;{u`$*U@PQ9V~$j z5H{s22_dwuGJNuUOSx`Tjd`hFDzSj3Y!>x1;cLB-n*OM3MypGuxAl2*Dd|^GeS}0` zNMPP|I~vEt(UxC1G~mA*LN|X^pU4cc~=znFvPp#}(F+H_8; zPWE%qnxMX8Pv3AOgS43n8^_pb&^bOf3*aGpPTK(5F~7{4HlD-2A<5f0i3I@R4$qoa z`;9l{YVJP2!3zT6UGGXSQ^{}AcKyac%KkLfMoTY4XSC9}_p)?I54(8IHK{7xWp`YI z5v7REUxTt}C3Z)uWB6T%s!!JIU`5@oOYhO|m!y@tV#>ZO)%`!{uAd%Ei^{GF)T~zr z2U&ck3%SCZ@d%~sb3{KJP7w6m?5V2Y6AC@4YgcuU*l%;qqODw>H!rp;Nc`n_~V{-<1BR zG{p2PTM4#hZ>)`q{*-#MQ#V@53!^r-rJm|jKgzG~Z=-K+!#J`cn5_5K2IpqQB*KaQ z`fbSySzC8Us_fJ>*xpzVpf zomsJHXR<%7yQAIh^p%q6(Vve^bpH-+;n0?G_LX@YbF<%ttKrQrtV&~$`|RF#!|0{E zFvGk}{q9Q1wa2*%@l^22ePRNfLUa8P|BqX558i%Uovz)Le4Hr0<`0KQ_s}i(_I`XVa@ztrMT0cgN#Fj(CJ;9jh zNO~it+;b%Ln?UCtNZJ3myy*{dcK^SwEZ$2w!quc^Ivf=r>WeQ-q3O_r)aypxMQPzj zpkeHjUh6c)mH$iU&i|!D z{;!dGndkp1Js)qQZBuSmV@`5##J1|_mZ#iIb75v)hJ9b}G@n9^@=rSW${1x93u!gU zpWsyMDevcyP%1GXlI5^TPGF5$yrs8UX1S$?y=;tNLAJ2tG1~fxnYZ8^?1)*GO+`9{ zhMMOi8o@^6dj?eTRv8s|7`5|~8CCXHdrtAFPU)0o3%g#JjNal$t-Di{}|MH6Y`VW!^Gdb2EdkvYW#u&@3O> z8%$ku9xd;u1_3ix6QsU&R2ANP*d#QBen$A6Zy96n=Jx5sAO!WoFZ#&}I!BP>ZlCUS-cLScT(#0+ z8AhA^WrCoU5g>nO+NE=_T8VvMM`|u1Q07T-17!hpGCNRChU@o^KsgGTWKIRjmGqzv zcLM>#C6w_I3>)bW7FD4>A&E(Jq*Z{gGs_|m)WLjm+bU1RM`n;*8KGawdQY2kQ;jUe%cF_36%4HM)Lrq&m3~B@zDiOxJYF#^$GR|9pn0VHFZX*LskM$Fdo3L-M9OQZ!^A~fME7%aM6MQiHrVylu6cSS zb&TiREj+xAym0YyAGYTw#o(L-*~q4vJ-KB}&WkzjnTiQ=Qu+Xw=!&|r|J!fEsMg+d z`2sSpa$ReGbk+L8YvOdv*CRywQB1Hp>kNb_*UK{pcQfWTir@KL5@8j&r=uD6;| z=IFh^FeEt0@u8ZDAWj?hhok5#_3c^@8LC_S=uMLoc{fB_p1XjK(iF|kFQIZl66k?ZN! zQ&LsAi|^iT2$HIe9a^%DrdP#*K1E+tmH)yC`MjE(6nADZd=zwmg%$^d7&8MLx>TU4 zy-Jg0k?ct_%WkwX3AEt856v8VFASOYZxs-pZoz}ks>@UGkx)afg2WanHRS)`l*T@> z2{0?#H6bYlsUcCQm{hBXLLat~H26?pClnu-$G_j^Eu+LX&%7ZbBf|{HFSEazV=^^w-O*xc3^r^n_Bv z7uk@jXBwP>C>QB)LD0)`Rh^Tn%YfKa>L|+tO$Ry~LdWZ=Sq%hc9=(z5M`@dySI_OU zJxM20gWB?9{e{I;@XjL#J+3VW+0~0~5BELy759HH^Z!V!BQG=EGU2d7{TEW-=Dbk{ z$1R4Cmq^_hRfz?!FO@XmDr}iVw)*mWh}4)}U!KRJPm#yUKOlr!z96%hm;b&1%<4ev zUXYsyFl1W_?cj$zp-)Z&xrTA!)esORv4L!dHr|Z$RW{`#8?A0AqgG)9*(-u|S>^76 z7TR^wNNEk_h(L{dD;p;w7Y&FsOJ-y7QJso7IYbXXEu)R4p`6I4u+}{uwQMNYFfZ7Q zIUp<~f2_$yQya>@d@6xz(i-%Np`#6DuOK#+uiafSu!VGi@PK;QP!4v-!FzH?(3nPY zWkh#t?B1;qLX5T+f9}crK>Iers#&(=Aj+(&)3nbJbnWy_Be{}!)m1yUn-(_$`&dl@ zjb*!eKYnBSo*8>y3#0ap<#1d81~ryzCXI9PdH2g$0j?r0@Rq-pD}S~(mYEC_?ve{s z^z>08IC?VaH?Rq~AH@A8;O+1YY9iZxCrnLb0bKsdjSpyA6L}(h3Im$T?R8&M_olL> z+d(s%%8$V0W;BzPDhyI5bjtKhBU}s3u0w5R$xdDQ)p;JaKby(JK-c>!@(6q!QDo-D zRko}o3@kuqj$J#N%T0!f{1$SA*Nru?$|h#a-qu29VG?Ir$gy6>@@&w3 z<403VS*-v<4Cr9BVDtgeR!Ps{7g~ ztc}dF<7c#yg@EGA=BgeZby4Y7ryRaav)ah9!Qbc{s$JhlE&RK{~!D*T#INyeP9`Q{TOaQ@w*8y$JE^o18EEhS1`d79C}UIW)fi zvb;%GNKHCnDl6znCz)kt{{!FDDIh#on?hT>{d{M>(+6nLWMoSm(FL@5IpuVbTfkg$ z2%6^b3>y;Z$qjYgsm3dqZwjTp0%nR^%_{(UD&@X{+5bqEuJQ_Vp&wRw%!4v(oV8JW zPr17DVOKd+2PX2POG&M95g%7kNw$4rcexGT_7fE3q4VHo*j-M=_{H62mLc&M4~o5; z5KWOiWTr_gDt^&Muk?^J@c+slyalWpyv2F7g|(;rgOR5=%k3K(t79&pgu3kgX~Iui z>@*>;w-06YlHbs83Zv5hhqm{QucGMU#E+(gLJ0(S77!4!Dn*nMsuXFW zLgP&^WzV) zcgyVTnKN_Fobo-7^>~LC_E(|+fx5Q8QiQ1*+V40lbpw&#>0w#7@+X@ZPx${Wbc7We;j``P)vI5rwb9(co4swS9qy5ByQfs;nutc*^!cs zwhmI_jrh%_5|Sx+sQu+Z3eUzfw0e)ehl~0OEAGP*8`%Auc#{uI3FG_6h?u0b-|ew9 z?8=GINIiJgQ-Ik=D=$buok&dSP7>I8@3TrECi}nz7aS1)P1M6kVAMICfU-Q;nxhgg zNrCmlD0VO=L|5uPSV^#zq6rSao;g_IVG{-X+(!li@WH{DA1{&goY0D9Jg4wl>Y;fh zH|k0%1wOCvu+VCGrB~}p(X{uOBSDm^p9`b38?XQjcwX$Avz}M#L7J|5UeSU$ottW# zCUcy>?sW5c<$g4ldM{v8HHh+CH2H5dmhb>yV;3laI&)r71a*Kbl0rvbQ2c$p)JV3R zjv&(zA!*`zdQJw(CO8lw0H7$m@1pdMLHhtd8a3I`#v z0+fW`6_OyNjI4R+Qf(+`^$KZ2m9TJ+z^Xz)5q7GQ0f+0MyKenS@cojZ&;efsK%5e7 zemPpJPO~;QileJT6+8IXs@0&Z744nT_kln8>Px-IQ!JebNnf!gqb-eoIJ7z~Sr#5l zo70snu2F_wGsV(?*^Rwhi?rxR6CXFsQqU$1P3Zq+GgOiOXCyFmA>)QADQsFLuSnj+ zCmg!hMB~_w<3B3wM&>Sj4Lr3MDKA=VI*ggnExQj_++4?eZMgCTX7Z-tN-qAC4ExM9R#}$? z>_hEJ|9EnpYs#oX>gyM*>1sn$d?8;iEU#k;9wf}~1~L)9f)%38>*(jR)VayE2pyFu zUyhEY#jh)A^v4@YF{}xN?ZO?j^-ZO&W!VR2gl8{#rAJ(mW1M1_{0|-6>x0cuG>jsh zC-xXfbKX+c%Qr35alG;*XplDi<8VZ>Lpwf94KtKR__Bc+%3JbhNOArUp_?rxD^C6+ z^;_9N37JY5j3tNy&7#8-m2duscGlh94u1Tv?Yv>(#bEF4Q_4)3H=+UWA2s`9S>uO7pCX8y)$5RzavS6koJHB9= z(ibtXLDQkkmLY5&1B}#zjngA|S5Vt^y7D~qgYX&H>F3a^GnDhV>$#aqe`u;k;;gYV zhZ-nyW5r{QoOAfbCxYG~@P0&H2P&5y zf+u;l;zxC7D}nrm6B3fmaV8WhZU5OyGkGV%ovI-#uK?!~)?skH7BpQ`w(1L~{fBs1 z&q|6KO0fW~_y{ERu~(2~j`Aov(Qb|y?a-;SW9e*`9ZtwOV6z;`&kKe7EBn;jv?R!C z_3j$<((7Z`Q*P`U?s192mEh52`4QhWw5`P%c3}H1V#yXr^aZ^JJq{t16KstKO2C*e zyF2kKJGL$Vm9ItdUzH)%P)BJVCg(D8*{daTZ}FfeRcmh5TTm|fQ_7hKwG9I_s0m+b zbK=@Yn*3ogPJ5!(Na|c@tDT#zECD)Zel{#^d*bu7Mm3~}+#F~Zo$@kPR2SnADMe7l@@iHJdPnh> zDk$EX}V7jh{nYAvVVT@WJ?k%sL>!3XglmOeB>>46~rJUcj^g_5+6B63C5R2X`lyAQt z=6*oG?{fz|vrr6qU%zi6P4N5B>V;w#xO<^eU)oAH7YYM$D3u0b&)eba3yD-WFr7P1 z#x2 zD8WPYOgN<7{Y(+T7k+~&vyrPkdm8KG0@TIqGP8tx^ zvkL_;QKm=-D0hkSGWP(c%%2rOHS(cAyi2X};io90%zR~}GY5u?d)Wi;6K2LhOV!&u zleU7JTGq8OC$LrtDoORh z)rLai8>6RNFvFr^Bzw1$*P57facjHkHcZ;30?mBBK zxZBq-+=9EYeKGO9qrQ30`A+eKi2G>l|F|p*tn0B#-dD)h0>NOVPSe~g6v^* z+z0?FT%d}N6kjjL-}wlOd{^qQOi2hZm>qZe=}qYBIkH|aNAePFxB#7jH&L)m@rQF1 z-Q~93fBeq-X2XSL!b)O5Ie6R#z6SIwpC7H3i}}%iIb0uGY1VRu=K_{47b{cf9mvKf zHYwrMVuj+%ReKt^+Sf^aS12{)<=@hT6-r}k(bY)%d%$MGobfXy$@WB4+9;-qJK)i(rV@jpCllqabTz%If;AgXR{& zSu~MKipCUe?_u5yoJE&u$rlRH4E7VJN0hJDtg3xZ4+DoH zh_cowVfV>mU#)r7&1n?>rRYqXFO@{|?s)AH8u%nIE;7CpmaLYP^;Y{ZD)|zd;Ztp75+&B9b2R7f;-^Zh7XmXWcS_fAxiHGn`ZnokBEMhRU&2 z@Z!T}y7G+@6Iiu$Z2{~;@>^lla6Rl^KoN+;Z4+kkT(ncR^7 z`07{Kc_EW~Zh%qsO`5hrsjj}Fc~C9>@k=~91rI!fYF54h>p%yJ+z4yZtE6s(jDMMW zZp1cvD^1?0aO}+eWG_|#oU;*26M#*N^`+@f&oFwfSh>Py<3V7i1v%)&62%d>j@#F& z3{9}odfYi&1oC1ZL5D@GpfQhVcM0^m;{9~7L~;7*sv3+?dHEmJlJrF(;D{bu$X5l* z>Z`)Pyh(APV@E0ft2e_bajDXVzTc!A2OE6&E!bfj?fq798c`Mx6kPS2qI{Dv?w-9j zq?Bje|3O~SfbSHCu(O{a?bIlTS%)t8PH7%iHNa(_rfKv?N-eT%R$?%W?#*|N^Ar4s zXPn1u7UF0lKj#_ev;4=h%19BS6S74Num=<4AG_>fPh)@~dXoKh)C@S2JJ8}SVx+&` zB1Zc77AUn_Dd>BpH3*9BX)IF5j$cO^lv&>^y#DHW{nV=Ol{oymK%o{(SW(&cu(Qd3 zE}=Htl=$kpBWRKto@4zmv+D4cNt~rA+c4j;tLoSSLABf9^X`bGWo4atGeQybM(=JQ z0dQ`I($4nXXDAi62l-(U&BExj9q@~dq=NY12x_zwemXmo;SWE-8RIvgiX7WwW*@PW}=R3Gx(XmpW7I2s+NO?%) z*N5*_Ml}C(3A~wydCO%|I^s5$NVfubIYNE0p&wZypr6Wo)Mf`HEdI>4vlf8YX>|d z7)B2rRHpNXi)Z(YF$g-dirmQH^iX7y@lCg9_iS6VWPZ=~9{S(KB6l&4@meZ4th{6f z2_$Ni(=#?uS288AF9xG@Y3nfBxS;0<-ht8|m2jg2KUYz_tm@Dhk|O^j%0lnE|EqtT z{6?>7>rt4aDoH&C6Z{S8cTA}(e+{7Q+$SBh_?QwPFOaB=|0sAm&`hqyJ(B`-U7UyA z*mCFfe3%*@S9siK)8k4lj6?t95cUg5+k7glDDSvZP4Y&6nZ3bnAQ$A(r&pRpQrS;1 z1r4IgpOmWLHnRwB3q7HPiOBwv4KMJ-*z&_qMxa(S*6^%LO=?;Se~Jh0UFHcT(uPA| zFL$N96JlSNwePuzD1hR5Q(eX8*#&y?xG)M``5dB&%alN^3}bw1_$BBiu>9#E=7rC>@gM;b0*;N24(j?d+!!Y){b!i> z&QY(^P-H%(aiJ5#jQ#Ny}WIgONXUR;gd_+%d$&c+5q*ClDS1-CD${u=xj3 zVFW=@!4!JI5{4K?;Mcj2)s;AoH)1KMaM~pYicegsM$z3S2T{dY#b3N>uKp&Iy?b8j z^dtb##h!z_Eu<&UDY3S5hiuqQ^`w#KU`2=1WZF5URv?eSnN#Yo%`tiYOSL|9g zHa;r)7UvWyKgjl15lT8}`*S!ZRCn6;E5>F3-S`zDMLp4z1S&6W91cvm{Crnm#3m~w z->|?PbOk9tg_5tlatS^4yV6n4ev-z#-8Lb&UrG|$k73@-Iy=Ql_VdayGj}~w+V?9^ zIP!v0fNW$?j@OS=R z3cRC4lf6O-mNF@!La8lWn^r1+sBt`%*%%@VDwGz02eIkudtQ7( zi1-Obny(aov|-r=s5et9LTNbehHQlk$jl-s*pDSpL8aK|A;oPG_6vI}A&wBNa!KJR zGC@@NioZ%5FNvpu`7glEUQ%Ll4WplY*-5o!G*s^orH<(hEdPDC-io2gGIRThvKlaT z&Z0$sD5tH6&gS6)mFKayU2qwOjggdiMd=cz%P2d(9}}MAtQLGkQ?9@u|03PE0=3~A zioL3=6NCt-F>j0uqhGHIN-w-7D1H2z@&~p&rGF|z1i`<6Y2y$lc5J=-ZIkK8>mr=aeM1B22#QACC0**bc^3X1mcl>e8~4J>%| zFNGJytVh{z=IX|#;QFFx7JD8ag!+{AH1yi^+e$a_4uJ9MEV})+pqP>C>P_Xli$ya_ zIg2KlGbJRscK)owNv+1Uv-yckS7aY`q-X9Z8Q{-GR5%g|E2EXhEdzjZDBh0fp?NJB z4{e2JWM+VqeX5g<`d2C;0RqJkM(7S2BPpi>SQ4`;+yMfrP@F}kYr=Y%?)=zuevLhi zQD=#97HyK3KdPRjg8ofCm$arNJ@gRF>k{K`YrD*zmfoPDGHZi{uRvxa#CM;Nv=4sd zoKnZc_|!B~O&>HhZyuy!CYA(FnQLM$>ts&GRyrAXnHYy7yKQ3JeO}^2;}Sw@=h<03 z7)eK)8TS=@Z)Utq9vu0Ne4h-*cj2CSCPCrSbER5q6&atpJc!0l6+d`R7 zs}8DeWwp)Q9oqN$hBRhgHGdjzWkDgFU(kK%hW7E=R%H1l$A-}&D~t5<4P2e$sl>{9 ziZeGoqg=zrYP!a1o{UZJ{_U<|-lwlbp+<(LMTl>+9SCgh?=Qiix1b`>f0w?m;)CAu z=SQRRM(%1T`SV4pA8Z`0eAxhe%@SY67mB@S8c zhdU^4VoD+f1+xHrTe*I!VX$C;PQmO|n_z%bM(bt4ItTnrg|(Z(*%rd|RRkZS{lbU% zu@KfEn6m?4EN*djKoQ;`IqV@Ap1GSZQ9{6x>B&Sn2<`Xgqq+m4 zCW5^T2iTz>lUu5lYgsKLXSw<*e--MhjzDw58yDH3a{C z6~kg|x$_0$WL{cibtx+HKG(ew(1&_h`H#1Ta6RyJI%SXU6^s?GO|bR*6gfNth4$Lk zh^68y%^OnjBLl1F6&y23b*W7p`vCz?G4bqMe94J;CV8Ba7>Tbm^W{Qg}iFISC=4*lY#+FuJ%vcEp-C(vgcqAJyrot+`YBCb9@g0ANjHER^NJ_z&=cK^iS*x5AHo)g zvXU+ueL5rnsMdODA`f{Asl)hwrEVR}^Oxzw*jf>^=wwJRjjF=}19nX1fbYDhOe_st zyi*jFdA|;eG=hf;I8G4{2KcrP6T{t}DgYV+l6n9(ueU<6%K#>#<~@Y#ITJ z-na9RP(5Dru6}Ubp}aI|D7onOdMq5y@S3^?WrTQRdt)Gsz#$P|Ul65beemu+8dje* zuwIJ?F_I{>HZ%oGBc{;l`mD2jHJ+LzvwGG0;Gz+wjNnWj#mxhiZAPFnS9(!)rvPzm z^OIQ@p3d-lGIQxE4<_t*kn#}4Qy%!S$Onp}Rt?ZRZp>-GPRYGn)4<&`8_?2*j9GU6 zQ4@&|#~Wgq=|o*qumEh zkziTL-iHbri8X$2Ben=rZUg`)&<3Lh>1A=09#kim8iZfu+PO;Q!(ze+>7R&7pcF;i z*TlF_!SaRlQiaukR{F61CX^3;w|^Lo8n?=73IVSjRajl?H%DaqHVIKdVB8iHmXqvK-{s zm^FnJOhPhnUh2Z?NWJXan6-3%hoW@|@JW!Pbqx5AN&^n|38tWaan*_rHDPUJMDVik zj1mbVOmfSZYQE_RdXem3!25?T!hwmOCw%NBu-m-kmII{#ai5QNm7hadf(JapW0J%p z;__Y1nfZyko8v;#o?gR(l#YOG%0Gr)7e7+XNfig*Y(|;Q*t3C)kVvhQ9zk!#2mIqG zrDeRC?9HJGEF`TtYi-6YGG&hJ1yfFQtgU5qqB-j-eMm|Rmd`I*D6^Us=&CK)Bxw09Y=h4^koJ;A*Rz9FQ~v4JwFo3emUYec?$NJ&4(8)f226|8#gG+5)gCx;=Xl@1E73#i5N)+OrK1 zNa;`F7Z`l%Q>?3eZX+Fkip83La3EkMD?SS9*N~TCJV^LxjD_lSVA*)-R~^{L33zF= zJ|5T-8J``a&pVetY7bBB$lN?cZeYmx_(0utXe3?i?a1nO8|+z8JvcM}m?(sZK;E<` zbtPVZF&;JiW$0%Cnm7>d0YuqbYfmCc(dlFEJAE_ zgN2!ai~Vz1$y86^kWwm@1>~757Ft-nS!TI z003WCRt;pWuYZAOPxUWkO}?9~24WK)y_c-{U3Id4)z$cl6Nl+WS0-?21zB5myPK>j zR6caELDrGDf;1(=*ZDtoO6*=eWBri#dyG!~SDF&)ZHcb{y^nXRqH|n#mS|`~on3)K zmOs@UYVII_#xjp4#IHblXLn~jPO7lGuKx^dIyjcjb!YLm0=-TiFx?rC=TGUuYC=-? z=)sbaMPWEZz56+YB^XjU(9jM#V_AbfC7`c&^J%mh- z@5$^(M$1QlLSmpNVINNwjdPf$X33@%*K1PEUTh*?7q(DFZx%s+_Cfr}o?dJv zcyC;9with6`mjy-^HU%8K0nzPOT{8;{)||=wmicUtnUMtOWQ?h)kiyX`w1!Q>L;Gu z*pGb*t{v4MZ$5zZa~2QgE$Gj_VzIlY|W*5EtF|Ygu z)T}C+`7C=&f*=Te8*Zo6ZofQ3nSD01GYuRzzmpyn1+I( ztXl9nDG?%(S9pUT>22COl(lf?9`d%!i+!0PV}U8}PG=5zDIy@&BA4^ibY`Kh>FhE2 z7{Cv2&JU;6=}eP8FRDm~Y9i+aQs}d>5qW#J)PzRRdpN6Qz9VBxSMG>)`Wtyx_LB}O z&Wm)AeR6MK+K7APJF>|Bq?^OB2RuQx5o{DKYaTjE+C^gudPh>j7NPcpXn4FJ+#&Nt z-(?Z<>-mJ8bEsd7(2mkxDvX3dvZ6yc(18DXC!RV#he0c&S)K@_ta|6&(<|IPXW2jH5OE0w-^PuKjIjKuN zq{d^}8`35!9E*|OL>KVKyeR}FPhIE3o#AHf{GYDIa$gX${IBrF^3yo@X%h8%nYA~6 z7LV|v{)KNj0a#Su79{Eoaib-^B${VLfO|Mu|G>QlM%vAS$o0=IBS#tFSSiLgjI`5P#xcWA7jms^B#krL3|K-cX&Su`G&0 z-(cY!m%IiQudWRadjtD16U}&o_0g-$TwM0BlkU912BGCaZ?amJjn-&vWdwrJ*zMI47*xYhI z%lmsm?Q^O8jdHwjZg~*WGb?d(iq*W}Sxs%y5e9g>!86gA#Q&_CE+<`O*6O}FiHgM}HEXBG@ z!U;1rkk28`XbL3$IVzX}iGOS%U!L9c`xF)$yErfrjp`w}7Cpik7V)z(9<`8Usu@X* zrm`A(TUN^QtqC8=RF)hrdS&8krngr+7nRb;w=I#hb1K{29GfIa5II#h0ZO2?k9Jw? zof5I>!jB(}A3?IN8dzHMxGW$0MVU%|PL8DW)0iEDczYU45~Akg_()2f&aBmDS6I2Y zGGQFCQv=%6VS0Kx8%~4fuvu6--ButQWX8KW4nsl+&F=r0Z}8fwNR^ef(>d{wmEFnR z0)c~>(Kdfej!68MENytzu0~IW2rJg&Y}mqpX?-azO5S>eO0!vC`ffTKAM+J3ev)Kg zW8Y)aJ1llRrz!Pwvx8nQUzI}nGgyPVYq=n-D9jk{lG5#G904&tVx|7sXJn#}U0htG zUt3GpXRww?7Hv9{)%9QNi(+?}Y4$TTd?riwKjScdpQaCHvZns0J-^H7^i0;sRTiRO z*D^O9YUph`bHnn^;>Bgucoyp={Yu%hSoP;lg(R8;={aAT>?dp?0kBcX;7q)bUvwc5 z6ja5plOc&>lk1})2LZqNz4#!D_d)!y+JAKfh||dO7j2vjv7eyG*-+olkvf~r#*4q3 z&8lahZ3|uuMFoMTq8ZHFbkT)C3-1Fi8GVr32u|TG@?P-UWc-H?@Y{Se1ViZ0VLqc& ztLK-*f8G5M|2&)vm>U3P(zTn#7InyBVUo0_Xy7~iuS}KivF^0}T`Vp#EuG8GNOOv2 z%tN2$so4}mm?!Ii2u?po$(I~OX@vbM-0gU_l6Jqx5+%6^&o|=jR6W~NqDS9{Wnw=) z{XVwo`)JzxY@qy2HpOl3Et(tH6;i!;t+{zoX>v_TGIN77NpsSiMZYzuDf3O~g@yvQ z%P*xS2j(yW7>qp@G`=dVvWY1*nb4YTRGJ?RUsp=ahvcnMWNK8iMo1@*vleQ%hLepO z)$ConlP3m;3qTO{I~2)-jUIvj+(s`}cOQsKJtILx4SV)m<&A3A%^2*76#k#E0#NAf z?yc6np~6D+-d8xxsz(n)CIjcfK$I|&TTI;kmbds>H|oj6sdit~hHq}AB`92B=ceh6 z3k5p^W&)uLr5hIm(dwa^EkVmMS4VP9#ZDQ|`vYX6fhQkEoZVZFV}b(Cnmy)`2xCb>}`mO5NWFUcyz(N~1q!uOcMn!YUZ{S5e9* zFoL{CX{*^ts#wYXf)|`$iTw*Tq7Vw!%*O||PFSdXAUE}msNJ~xT{~<_pp`~X&8o`- ze?uE=i^j%h%)u+YXya;jJN#{@D_~e+fF{43Xw?$hV@0uQnQs^E|CAl(yOQ1OSWR2; zM@SL>O3J&F;erxrFM{pnN+GLe%Y1u}*gvEcu_RmOGI0|Ph;17|7Yp$b~m(7LZ^z(+})3BYuG`fAGNG& z?(0U>-94yd)q8nw2d4kSyCcK-GA|cn;C+VKr^E9T!QDH)K5vhg%_IJzEhpN!&Xe_g3uLON}PJy3+0qtVhsy zw|Gf}7PzZ`YxH*LaKq4 zP?WxgkBv9;wEm|vKP?Jjx6|+A>YKQ)spp`ZxP@pdTMcEQ%{Dgrfv-e|9(~}2{~!7? zWjprHztFbr>T&}lnR_Z^H^es5G+FT&4e)YX8`FxrZuIc;Y>My~3i zHoCQgRilyL_rL`2bVs8laY1IfRsze{VHelQ;HTRJZTHT-gH-*`J_U5?TWm`*sl3h4 zFk(k0^VLa=)A{e<%6s*mK^3Q7zUNejEv&P2nzWWbw+b93$>TAHuyR5Nir&cvOYaoL z?#3VF(`W60op4G~{k?3NY!l@Ms>P6&lJ3NAp<*9Pja#}AAf&;F$UzkX?yoTrm!Ks` z_B`saAD#J~^7b>HY9IOoYaBOo6CN;oY8H4DV6%X#nnr_vU>y0&O1~XqJ?YL5%(o`O zBK2)#gkjM#ppvk@dqbqc^RzW?DLgO8FG>ocP6sd}I?(e6*t6*7_5mOlD@ZcP1C982QCEN0aj{JLdSg2UxJz1zEt%{`nQv+bEmj{y6d5(Pk$ONM z5MJ8U(Gdc^g3Uho4k)PF{W(zv6HmusAIlqGvZVebROBzq)6`uf|W zt@O)L#%l$*^tanRu-E^Jh-oo0{CP2p)MGl;k&IoJii1^Onsto%2HcwA7L}7tS|U|C z06H3zZw{o5$Aqu-+%eFfrn$M(nu3pG)7=%tad0m4NHxuka}$m;j+9yZpF1X~D)QyT zk)Z05p|?QQpEwK7>m*0obQ0E~%D<#AKfS&J$5ZU~6HLin=#8IPeOu)b9?@G)tA1ih zmhw~a_OIy(4r^_eJ!KG#8WTDyi$!ZFbV;FNX7+!q)^H#8rm(sTzHd}k#rHJ6jQQF;Oh2m({{IP!1XrU&D&>^1 zurNKMOwx>s47ku(TmU*Jp8awgcIg;`J9yS+us+o+7vo`gU;nO~f5+v1B9#g8(1>p; z7eN7s%7v}{S~+yvF2D$8_54;&v}t%Z^3VI7gmIt?Wt{w%m4kjf$vA9#v0;h!__DCL z=(#3bNOI&-UNGk#G;a&y*1XF`qf<;2_vFh4Wt?Juw%IcU@6w!8jAsZH---&S-%5uB z*s?E&YYjmg+s~{aQi3-B%ZvYx9<_~<1t5sF#c0Fh#s79p`?V5B2Z*7lMRCWvh3lKVW^W2Lf$3-r;coJ&-{6V7~*@-Af?w#}1#niY{=8omBI3ldQL$0@r4e(Aj5!Qi`A z0bl_G^y%-g3%p6?zcY70?#6gy!7ihI6|l!OIL`v~k__eIQO8NoOO`Hi^2hO#lk`Oe zOQSE&vyVW9{ulm@3VSXHD*WvIBz-dnZQL_st1y_Eo(bVubWh*Skf*&3xZnpf8o7ri zp*DjQ^!7#8MNr_ZPJxPxpule{<6#Q#np?qA0C{85ei7H~M#Te3GpIqmaRXo&W>heg zH`PCT*_sN#rc9x=mGHOqMx-Dcia#4J33cc4CB!LQ{?u(>MC=ci9A9omEdyPOMTsGY z>^2G-OZEwr@duipKm~uWnqKw+Zk>T$Es{a#_dgh)#GaZ3dNW+*@zSiSIK_Q5Ginz2 zBI_G?j^2KNW`e3{L{v*d;flKS@nwX0et9%r0NHK2EM&6%3TE@slkq%$jGA5%GkhvP z_bY1u1mawQIG1}Bryw{5tU=OMmV&kMmiKMO=-k&`G3kXCXiR@NYG++#jS<=Jsg)e< z)rO2Z1in}j%keI3(oEOj6zM|aud%A?YWK}M4*DHQN3XFkP%q0!y^s8-d3T?Tn4p(~ zaf@Ej^1TB_sPY@&vxh~ER%D?pCLF-_k zT}`Ho*Tp(`{km8O!*2)*G`+#51@R?phS6*^6@;l#j+uJLBn<75E%ElB<55&OFY~oz zBmvrQqJb`ye3RAia@zw$hAVlt-iEG|&oDqIRVS!|w>!FL6jppeWxnv#nmmp%! zUkH)!LWlptGO&3Ys6|1y(Wx%<%7{rAVjoz_H z1TG3aq~D#p2sQGKAk>CCAk=9PDhb3pb4L&=?_Xa0w}e_!MW`i48%{5w^1Xzbm#1R7 z%_~uv)MegPHO2DNbt`mSQ?;R!eVcTbhu$(Qa^(@yqX*vY(}U!}edPQ2Zt{H$-@m8mA>W5^p-2_7>gSOHxh7Q?0xPM|gfxR; zCS3b@vWts6defwGF}TX4x@{BkLxpHOU{V_i$xxs_;4;%EBBH~Ga6 zP-==-tejz1Yhq0=G^;g0qJw5t_0r(}$tLPQ+5=SI{pm153dwzytto zw}91bNWPotr$!0}`JOuafulC~fd@R?v)fN?1dfvY@uWQ5 zf3-H)Wu^cBz%E>%?KWuecYCo1ZF=^2d4xs>sGd!aU=PGy1fc&OooRP~_;hz5`oABa zZWo`v4=KY|eEJNl8bl)l)c}0No4Cbx`5lKA2iE@}P_WE_f9c!buuQW5LA`@kY!q7t z3Et@w#Md8sD@bhx>Z}h^|3%zK2dkVqM~ohL^Ti&-A@_;{ zr-QH30J|W|1Up}ssmT6sWO0NFvYav6^zM`&M3(y&mb0F>@`dFr!lOO)1wHnj*mL?F zHqXStedjzcqL6%ZBxT&F;Y+te(dVw@ss^4qc}J)Kxbs&jFDqJ>5N}aUG4ynq2Qmshy_XYf`68%Lyr%sar(nm8P7n?C7PKIoJL^=r0)E}w%s(jL zRVGRCf{H(f)T?9BZg|OtLw)n&Nwc+RH$8oYc_Lg8b5pqb4OaV%2v8Vc@e%6d_){LC zKAY4*%QS%8JU(NKmSvz?K|{+jF8Wj66_oFq5Q#wnB3Cg#BZt zOvUk`ku>@!GgGe^H4LTKM#QKw^4>+%@$GI2v?4|guodvCaI=xna6Qk-uk4FaYr)fc zJw{DNTu<#-wXU?8y2J`zdB^Ch7j^4F6YM@2&ke2q?;1mZ33ee?Ot64BHP!;8*LgCf zStAnY$v8DYuTYmuXQdl%E2c6Q_U4$~ZMie{eqK)Y%qZRakBS zjn2E}%=I0Dtg^p`JRXvRu!juYM+5KnM4Gh|f%~5n6@F|w%qzoBUu9a2KM$`qxlKHK zv(we`2-=&5B)|7on}VoeZIz>07uQyKjrhZ#Svi1HdDh6tqRb@qd5JrKjK=L}DQ*`V zg((-cYC`iQ$x!i&A35T>srNe8fAt1g@wU|C@nUj-aA~0^YK@kzmXh`RmJ){FL5u^ z#a1;VXmDfoPcYasO;lc<;k70zuY$9oiJHuDOwTt_pFto8klpeMC&hs6rmpA&jESb| zS@@`)epsE&;R1o&J-x3f~1-+|$ie?hk#vnc4t^HX!R9%$>|LhTRpNqP%)1pXXup{~HS36H2V@F%#Xn#?i9Lnt)O7DioKssrH6 z{Jf?55rUX|w^BJ`QZ*V=JUxs)Zv`c4DGlraIO?AU-LlfJt*{p6Qqxq7+Cs`pRco}b z$OobfpdLl8{Z7dhhB(5lJ{(oXVz^V6BS*wITv~Owr0Q^yen>$Y*1A>HP*Yj#LZ>Hn zPB&?~{EWOglf9HOG_@UkgC%oNz$oOk-z{`fQ||zy{N$tR^VaD+(>aFRUypFovyVZ? z>OkurQ|rm6Ty*L&btryzcwAl6zms-mLM=s~sk4 z2ddW&Gv!rk(@ssWyo}GN$GoF$F z`It;uL6h6#s~1pldo@~2uoR9f=b+U)+X2FNyTe*!dQyFsrwYIDl-i94UwzX-J%*p} zbre5~E_8yzjo&vqLrmgwVi$EF=H#RG%op)+Ce7`xjz{)gSP!+EWx~=3oEhFjO&7V| z-y`AtuT}s??xEHZfw@CTXR@POEVo9>|9J=GraPcDuN z5KgQ77KQOxaZYm@^|Wg9)Cd~)v|1k#Y97cq56}Gz&G(3J^n{1s%2zj?@2WVjD@lJ|QZtPDj`>1~Ss)NQ0JbA(Y@>PfK`6>@~-9OYl@-ylt z+!cGr(G85R`msa_rk44S1Udb@2`3t&oHXN0ul7-=WAuPz_n6#4%PXzxl*00gqf#U* zr92PJ#fyD0i;NlzqrbXrrfSbXY;>Rj&xqlE>lrclD6kMlN1jo635NRpR1WG;j=FWK zn}+v;8r6Z`?Wb}~w^LMp2yg%w`>DK~L(Bf+&eQsxNNWJ;D*xzT)VHCENYF#nKLwNZ5Pg`UYVw+_qH`(gG8vJj*@~KK zo#}?&wVe(sY75hTQ#7UKW0C(vQT^h$4=%un*yHygb`sy#Sa!jIWe0LqW&;|KysZ{3 z9iXO#-qusOT#_Eh44txkPIyZwx8*bBu)NeBE-9jjjmCnH`P^ZQ8VUOQkgIxGIHfFz zGSjO=Gi%dM)2V9o_(1h3l>NvVs3y3kTaF92tNCDz#vnLVTge+O;Qtl#|H|;6JxTl1bBtlsE_<%>AN+Amx*g@? z6QE`Do41>&{Bv78ogSoafK*%htU5gEyF2@QZrf!a#Gms}Asi0=*J<{$g|C;s7JJ+~Nhq2K3nT;D!!G&7W73Bzb{VsL(~@ zUQi26P|K2sK_0zN-G`|))XKTBjS<6U*52C?t&g%R-R&vgA+&tWq-|U8uU#-{3$`Kl z+P+cNXkg#2PMR}nx`plJ&-2Wn-TV9-%XZEsRnMEmTBkn`2wTtdl(WGePD?`mV@b}w z1$Qujei#>q_0tNPk(N%B%U+ly;MG}OABOVs}tm@Zpu7+BZ}fis8R9>B$vkp zsnUn@3fsif=pa8gbw1H2k~&SQR+F;VMEGZ9`VC7o*MO(;raokezML@-hR@RrG^k}U zoJ)M5%izL`x7*3LZg$~!Bw7rkg1=DW`Q!Ev{qEv6W1*MbzED&>t!wg_+Zt~IamQMj zE!~|VL$%A4hb3BS_~4CFqBTigZb`HS`Dj0XTk2s{{u`057~ka#L2JmC8xGE?NSxBS7kh(Hr>!77#5 z(8k*gz#W+~LULUuB%heI4Rb@2dHLZ)9Dg%6w4o22?#(5a%hZ}ikLwxUMr8M)`w-Fc z*mN)<##bx0xqOGYk@?5R8OJzqrK5g^7&(+O6N;P(pOKqyM*K*riCPszM|RhIki!y$ zSZ0^CQ=(NIphlrDnwHWN{alu|iKe^O9kW1%;i)Q!ffoD$HP|#(o4anekKPf)+yMfk z|0vZNvgjJhADXnoTM^68nWW@dVDF$Ju!S7WPokuGT6`U<_PV-UK48f!JHXQ$_r9(! zkznv2^QJllS$CDGZYOolw*}C#G3xWC<#)Q!$nD3&L$&3`^i7moBhJ2JJq>?R9cB97 z1U$8179PU)Y=|QM0(bHM$n+9q%CFSrB{ezZ*81H(ZXV3Q6ZNNVpxG~}HAKs6Us7v3 zm*NrovM|2V_-Mx^FbjWac=MPHCBC8 z`id5fRUeV3`cnCeqZ6oejX{Wi-ZUbZR^2XdK%Kj_@TF?w)wqxk&+-ygRs<2l-|jN! z4i0lTwQtYb?by=D9u~&(F4GI+)dV@$Mq_vqlu7#}sIeRg zMnFoF9qejPPc*L*TNe8yFci4_ZmrbzVwTxgSA2le}Gy)QlY zj@Z5Kc}MLGG)ULGYO1uD2EMDR@(DZHx1*l<%6GBdJx6!mRTJBNDq{v1fvX&SMmKX} zn(I}8P4>5W)k*{5Pu!rhhgH+b1N2FLgP)F;GH$Ng3@B0w(5MQV)Az_X-Azg&)p zy+0)uA1=aGfmRYum9c3Knnr50fRx+^T*_h@pjQPrgQ!9j1g22M>7=jb!*=v1sXCHm zvG;o@Za(ZUo9LK^VP?L?uCuKG#~zq0aW3b6$hNpo@95< z5_xDP1@Rqe?S43^13CJhKNHAM$&j7G5P- zHwRgTu8wx$mNhmQ#xi9G(3;nt#4B7<=Jgu!z({zO=R0CyJQHN$Xjg?ZUvN>dIo_XM zU7G;7yuEAvv`Q-Z;Aq6W(f)omiJQ1M!?f8M9)gKt!0T$uP4+iwK(Anj9VbQE4~VBL zpSoe>%(2c0=Vy)eUdyd;!BCa<%gm@YoF|Q?Q7_wqloG6qZ$i!(%aIHbh5_TGFsJjt zeSB4GG^VdiKK47@`dRiRGJwKM}eEkI^as>_vrD>DZ zV(WUR+ob6}E(bk3MO_99PQX;C(^#WSxic_{n@>}h2X@3=Mp2U>%G|xjP4?;Pd8}Nw zr>i-DFw35Sy%mD}sifexlYX9|_D1$Z%G-4!`~vhf5r}Kj#Y5rr@=SHLv;*Z#P`xPg zgU%g73^SmK0|9`aNgCD55$PRfQ3RC_GejkZn8wt;?yMum6bZ%uHKwV!>;Af^;k2l; zZy+E@6({o% z7&7gvYvGy`CPmpJ!1ZB6+9j9xeAwW(Y7O4@z(?Pq!Z%+4nBZ(Rm5$oaMl{f|f*@o> zr!0_o_g0n0vv&c?F09-rMMWS76)L>GKSQLc{y7lzQgB=Z{We=g_I#IjxWOs-t?Nv zUjZ92V1<-MqelhXs4OSiS(LX#-DgJoFMbHV!A|cZbr39eNbDP*fW*BfwR}y(c^3DL zfUu%3KT_Q?ZaunOU5;B_2cTHaU!lf;6ARt$1mK(i!SHz?Z8Zy^%>S5!i@JWS+9Y`g z9=~}Rb<#f$vCwOuKrDSr#|qR$`uY=L36=4-!ao31c>WVu$alc!shRS!x|-p87`{?X zm4CBQ`JIGtdaF}+8=apUgEVPDF|&OOTy{}=!}YRcS68Zvc?;$-m5w-pQuM3fJ`#=j zQt8Cs!)W3vwWj>7lLpSuji8cMsFvIjZ}O)~&F!F|)oNR53w2+u)|R)(c`4y3NCTX^ z8p>Wr%6~W`k{)hRH-s7=RIAhV)oQr3rO5s%d>WW&iwo38pb_GOT8IYWAq+vv<3oi| zgm%!xLbWG8ATOn3bpQ$eQK&l6JjW`G5MVJiKD(#Sqd&W^&xN0%&)*q+zKEOe>$5LC z_BjG0w$Q}St2!P*-+qquPvDSHUI$);k^n%?rF;O znbDN;*F%jc)#UG=!QBXA{Ya7{@6V!#8QqW=_bnwD6)r8HI9EvvvshVlhwZ)6;{KI| zLn>fR5}G`XXrcK3U#~LXPqu28g&cX{Dr3=drGHvx9_Gu;_082p=*$1U%t+wBG4_XG zJbWV1nZdykKs%`3T*&*SCvv>ak$e*_cEE0)rf$=+2MkY#xM?vQ*Re0gBCW|!08ied zG1-D(Qh@U((b5{bUe9X!UkjJVuqR|YHp4zikIIpWyaN~n-T}9t#}Ws_0N*v?WMCp3 zOT&;Gi;fNFeTAKn`!KPp}ap5K#Q&o|8T;=7hby3jtbJ@tsMkxFIPGomPE zakp6drbt~NUzPKUC&OSzqrOm|$1m!<{Axteg)h_(CEN0f9T;8U0KbI_WFhOX*yJ5f zp3mpV>%6GG#I3VPVg^>okjI?#$sSldL%vp>{OpFNPHOhGS{=ul?{kibnU$g;VJyJ9 zFIEK~Ko?H?8kW}*D)?IMinQgd*M5kn%=$f_YUJf(Ed|CC&Ho7~F&-l8h!7<{!!%0= zXk|WHlVNTPWq+eO2Uv8lj{o9wXhs%rx6q9KzwkPty7>RS6rHxfU#s{h{@xPs5B%-R zS#urgWe0P`2qXGt+soDOueSRIEy zua&56a5C*JzgRkoW3m6VQloxYtRCKkeINWao79*2`j2&Nz>shX{8rr$y{YV5$j0^L z`yDo<1_$-~PH@n`BSF|j#np+Vi`KfF>7;I8y1n|v(w9xx&jeXgsqJQUjJ(sS7gpFw z<(pLv_g=JwaNjwvs{qiLhGXPi#vQx(9ZrfVib)KBVDpOhyB?6wguWYkK8`XU?$(g9 zi@TtRaB6&Y>bzAAbaD>$uc7b8g{L3N>1rCiRdrFwRn^+d-@DrSb4RXNB>i;`^yjNB zM?QvbZZu%n&$xy=NHYR?yp|4suO^2^Kcx*X^$rh!Y0j8Lh})i4%|V@8%o0j^`KX6t zDST}2V51hZpVx>ZmRZzd&a=N#Lqat~KhHeW^>+AQmt2({891*?ZA6w}-9<41155%Y zBa64cy2kFK>+w+UP^C{-mhQQW>vRao&=%dcYkuM`LwDzQ3EkcQZr$AvIv#a87-^Nk zuEHi$Jk@NWsBLQdKz%I>w9i9JG-{jrav1ETkpZSueXpwTlIZ$2wYD9bB_Hg4@W%`s z0n{UIR1Lt)k8f8S)WdCJeZ_W_!?EZKrJtt~HQ&a$}QA2q<*iy=9ozup~H=_I;&WPWzF~j~0Q#rp630VAWTWod31|FYn z2RWe&Kr)H@Jw4L(VIO?DITX!WcufX;cm}^wkRQ##%E!sz!#@uL!p*+;3G*%&bAqgq zu$P)WoyR>W+b&)u1S21=KsSiPY43Tjr}zjbIyXgIT>+s%{Qbd#2Qz{!oK?l$5D=Wm z5Ys?a5?yfcy#bDeEb`MrJQH6F(HYo_@&)T0ULFaefHIufbSW(Q?3-v4qWEKpi(&|3 zj6DRgaLYJ?Adt=J!|m0;#L=+=a_gL z6X=7XKpT8q=!;!yJghL0&^!PnaOeYYBtp`&1niD+b&3v~u< zOTv5-3CLZ&^XcFk-dcb@&-hTF$&v8Efb%5IN$|QrrAp+Cicd>4r$Y(S=ZGtSYn76g z!FdHJR-A*tXqx1}Js1mouZLy)wd}lnM=hx@WpC*cMSD;7wM)0iy%Z431CAYyCwq9e z;G&SdY7m!Saiu~$4K772(+&#Wr?%v3e&wTefSI*VeG1YF0+cEf-h&%%pL#(4%R>44 zxl4_{-mktU{YLBu)g^xco8{8yBWT1ALO|u<9QIUF+yG!AytDc-@;{)iLlw4?1L9@E zh=Q`IsFQS1Z7)}v2{p?jz$==?z6bi$ta1SH9#k{YJ+Xaqop`}a49E=mTbf3Pu@8_-0o>8;KM}P4i25;1rlIm)h=Gc;zLav%9!IesuF~PF zK9jY)eH_EPI~5&OtD6R3m&jodZ9)yR_n?7RX9TLpz}w!1QfBz!xCF>FnGsPT;U2>b zhrxo))YDFB-}4U2z!R1wvu!||FQ=iAewgBz2xgceN8bn(X2{}$_Qz>&AE1a;KaTxx zM;fz#tlKQvPrGU0(eEOPb{t3SJx;rwDT(r}!{k1JpgZUeL5*k2=f0t|ru~Nk)Sxt_ zZ9-l_SzXCY1BT`B2)IU#+H#rR>f!$F@uy_#V`23E!~KJ7d*;9+lf9k_AMRfRK79AQ zVJI@PBf4Qxb~$XH4}Oukcr7AE&O1}a>aW6<>RqRevVU{}IQeH0RMh-uRSSM+7TP|C zdtq!bN7H!LwoPtCiZ8I13}cY7ZeW+7i%(u;4qbE5h4&suJ>iG@Tkq}?p-XR4!M4Yu z=+Q7q~I=_T_&*I)A047{ZH^M85C zxZj|G9X9lWg4{ zud*SgH)gz{X~67*YC}=i+R*UxYKHuycuOp$oN@Z2fI3vUFxoJq)-v#e_F`~5DvJ*Y zrkWSk*W@GOPQW;sAF@kF^gDmNh{!{jP-X`<&MRn8LyDp~73#0fTZgMOVPE0+O+plE z*635ww7gQylneGy-Al+7%A!t})V?qeuDk@l9ESDcA8H|nE&sBb68!yCTau4YV;^p( z+c=d@TvmHZA5fDk>eF~*_7xGy8CoCF8^u=;J>7xMUxE7Ev8dfu=*DmxSfP2OW&a=Q z-UBMCf4f}qC4Bq}69jm93+Rfxu3AcdRQz?Nb! zNzlYbG)9dDY_SW8B_;?aynfDe@^G$O8=l47R^FN;B^2*G+b7$tx?YGj87Ts(X z@3noUK?zl69t*~*dzwz(Y!+8{h*K@4`CvG!=d$g$wwxDyKqp?j6OUT<3(CILtTBzf z)$AR7?ar-c-(f=(eRBsB0LEgtcbcOD=g$pzC?fQ_;-UsDc zOixyEc6?e@vnIgQmMUQC!YW;T7Z=F|x#5&wR?+<`IBZQpblnQ5|6X|jc>`?w&S9u! z&$9I%f6xq@{p%QUm|$8|h}BrOpXLZ6^JCp8h|%~dSAUE;epRW5=V=?A$SU9r(}|!L zMN@TRZ$<_3h9sdrL`8`SIczb%La1Y!LD_@3rv*h3tSoo2Ui8<4UTu6B=&hVU}nJ2qIi9hPPH*c4zleOIs|n2w$; zbx|(OMcszjNC4w)icLVL<>zBq+F>V+Dy1jP;#>a?+)pZSAJId=jrSBkLfgNgqYXFa z^EC|y#lVkJWzh<~Ha+kMZsFp`sCEk%D}LszAWv^G zTpTX+Dq3(Isq7zl_0|XKt9MS})xr<|>D7u{_0=;c@#-ge|Mco7+N;ait6Ovb>D8^X z)Lw6&z^lK_(q5(FHvLA>A9ck&y0Wdbp`Q4vu!myni?dK2l+{9@pXy_d=8(RDI8?t5 zUKA7&C)#LQ12GpFbwlICbltBA61!91pT@@lKNG28yf_~INNeIno(Gew? z62&RH$=UQvqS(Y^n~yVPktby)iV@T{NzBmA9Zw6A)TaR|NFM6bswA;{08iNa2~Xq7 zGWPP?o}Wyi{*A>{ma-QKtPgY!_Ha`xsVFRB;Z$SsUDs|%+UqPb))_~dmT^cMEO=gS z)MZo+B~@76ExOo5WS;neO@Vs&_qA^-CWfxlIbF-uGEit2!NdmsomoxAG1xs`&BUf? zx8OPW#+H1&z(~(G6Me8Th0i~a(6ge3G_#r5;Sr;8Su+sD46=$MPhBdCkC~m_RKIKs zswCAdsJtT}IDd>N`or{Payn-l$a3dPkq(Mta|VYb1~Io(zGispo|-k&fRaSy1;d*0 z9LJOKBNua=itGR6m+GeQ5^>IzqowWt2d`8&MNQUU+tpUh*iZf6F7u`tYdTrN5>yEc z46BR6vNzvcqE{w)Lijhipma*+(s%r*y)3fxdAKaHoRF(zu_Ks0EkVDN*>lq>$iXT_ z*5=|!)VQ0_Tx6-gnik}Yj)r06{+TI}bg#L{5^X8{AHYLt>@&uKj61P{dr{pMVzWod z&2KZ+-M)kE_FU&~|69s*a+><;fn#`e!t{TlA`nLqj>eu)Q4zD=eA;m{<_2C zI^{fhWDp&0E4CN5k~I(R#@Vw(16?@wXIISeh_Bj*Qrhu9I~jIG3zl(|8S42AMRgG8 z@j_IyjmrADp(tVYQwNb%tkZN@&KU+*%!^4vXjM+$Ca;cI@7dIGGA-S2RPcl>F(Q(1F ze|mJdyQ*$?$Bblt+fec_Yt}*L=Tq+e7vr&e`Ffe1Iv;F8GnKldVpOB$?-*!xXR))8 zT6DX!XkniF<}M;*>^620XX1E&>M0J3H)a0$gpFSBB6`!>r?3N4>B3VWtDES}u3{s! z`l73t%(1e-iIrsSG`Kvplx>N$t#Y-jd z_jazzpW_=qeN#nq=u2SoY|fV*M%57yA~uikNWWwWrRV1OT4;5u*b)I8mr})uhL{1C z_X7>Ja#C)=XsCu_n6H(QIOcHAnf}P7zMg@6A{xv6T68Krp2i7z_LLs?*=BJ z2i;-!&Q?Y!!MNv06Vq^SM4Fg@GE7=bO!X+7K`JaaX!Uq%3Q}!Z8Ho8#1IknK)3GGp zppbMBr_t0BKVTYAzYlFjjcn4ec{>vSGpL9b)Xe~axX~gS4T*o zuH8ju-F>DzpRicU=n+!0czWVVXb+Kvg49DG0kNWv(UDZpgKyGwE12)x6=lZ!%?-V2 ze-DwBJ!(M3L8&&X>>+-I)$v(Ru>o5hrB92g;Ncv-0PJE)?gei2RfIW-@PkekSG#|- z4!(fiO4((at%!Bh5>Lzm`m+$}&2kd6zYoztMSO)-ck&q}1yIj+Vv^_C%RI$xB;4yS zQ(il971$@Gz1X|;Q9N*%!H_RMzZ=#QAyVh`u>U(Z2>CP5c6g zpWBO9i>%Lx2|92($-Tki;-n}WyB7@B^WsijF9jBY7B=egf|!g4$~X@j6}}*z)uEJT zxiK!5{jSmbFjYw8OMab;EPcfYW@Apw5VM3r%Fhs+d*;n|M-n7u=Q&o)@I;2_(EXlI zxx>VM^g^cSiS7MLrpQWFoyinm=BJ4!JEJ!D+u|rMRd9xe3R;A2wEso1jkZg01{?V< z$$ni7p*_tr%&1PHyd?U0sjG=UhiW|YC6N^uGr_cHeOY9sh~c)9c_A>A!r#C#$0!3+ zN3YBELzoJ7g30Mh;6v$eh<0~X$?ReoMP4t9ld!Bb76(d!QDO`CYM(nQf0-{V6r|c6 zhSPED+^8^mE{m_ZtSsC9kknpCP7EKUVl-+A@# zF%}o7o_5^25U3K3>WmCVZAaF^VW7KO8xAQdC}9YW_S#sau|q^R)1G6#N)Yz_j3F4< zC|W;6oP+@-4;5M6(=f{TB(fQKT^YeP;l81wf*;E;u{&QN*PRPw=&ab+OssEswaET7%UJyH%%N_`AW9=Sb0w zubNnjtTXY^RTIo&)Yz)|^m>32%@<8w6@`$o*`le(zsD9$!AOpUx}!K28jvt;lpoEQ zYlx=hqeM3#CQiN8=i9(2x-^O}mz$%+)*LPOooGpZtr{);yi`5~vOV;7-DuxyZ2J^s zz8(tB;+fH6I+v&tX~g}PQ3q_aI0|TN`ug840(Q7)xeJ{PJNDFL+b57tzpi1U2|ajX z0?%{f+(D5hx)Z=tD0O^;Py2{B#7P*INN3&^6>9Y+AEZPh#vtY{d5joMW7S(SyCu<9 zTwx{bdQMlh&3jAq#4>M5C9jDCyws{cP6RmK7GLILZe2a*0bXtR z1USit<(hnRQ4 zGmfI}?}}3}(39`tpoFAqf@-Ao7%>s3`T?Pm-u}c^fTtT$3TkU7rD*LKu`AQaJQyp+ zv9l#ETYL-dJ-d)ezORioW{YNhKcolL0`g90i>I(BHs*jmK?$SxAnNU>&)*XpFe-iU zJ#_IZJ$MfcRKKFg@#0oSr+;~0{0yjrHG_of)BUJ$qR5h*>u5pfGyYUM5h6G^RI@$M z9TqPJmW3z%WzIres78U%H>vexaXT(dnofG0$P~xVCtK8gf8D5l|kYS|0gWI~%xVEvr zOe5Y31sy7WPl68p$AuwwXHMToi?5fpjb)%%l4F@bR2;Ps6@li%{q6V@30XM59x)g;^}IV)y8 zOSNS-7PMiPX~-S6K%7X_n}3oAy1|^+8hyg-r_=U;NxHrtCb??xm~;7^sv1-V5Ca=86veWgCnU z!)J-2J6Fkq4y009gZo;C-|ZCr?Q6c*L!%dElw7>jE^YW({JqxY*4ka3*Sa*ZF5$nH zCx!q(M^lt`YP2U)1MvIe#{gW*0lewvL?R`VXw!Xh4aFo~Lp{0MlJdnh9&?}Zri|J< z9S|x%yiXUnh!`^#$0wEn%+U5ilJuf)c$hq z$djLFHgGmk4QGon(0ufmExrd5>P4Z)GQ#P`Z1G)MlP^ws1ZjsVYa{JYP zX%ji7IMRMPXLKTMCz}5sK^lkS5u|08{J%vS14~8P9__FHj2IFs;b5*D{QYm9Fi&x1O4;L2X#ZT% z;B)=r<4^oq(2+9l_+w8(sqs9q1(Ps@F)u`@QV49sObUSmx(BStI!Gaf9~rq6vS7>$ z>C|t&_#R}AGannDFKS%?jS^OG=J=a-3KSN377Z^Hzh!sg7D8VL#mGV^-%{w;h2ms? zCh@>0ja9K_U9-OqQD)TLX6*CdED~F>-!;RZj-WHM{xTH>FNUfCJ@s88j>l1CC|F<) zgUngbWT;y~vQL;`L~&Tn0*Ni<|Cz`Fc})cw$La`SH00^&Za8xCa^ZWn`ZND7H0OiA z+80HCF6!9vnfY4=V>(M(XSJYHzh!i!i(iOM_;I)9TEhSuelepyECT($gvh4bbD1g+ z_X=(VN~=_?Wv)6d%1L&?=`d8MEnHAyTRC}aw@V`drV$oib^6wB+Pzeaay@~hD0!Pj z$z3HcZ0|2P9s|wvX3<1lmSH=dpyA6n70EmLia+J96uo`!=eTks3+w3tPBP_$=htCI_jMWW3+5}|?Yv8nuouJaaz5Mc*iLvgg6Ey=O{l-x{ zZ)>Tj4fmgbJ93?9^HjAYE*8M=MwuHy)t$l*bS|a7_7*n4w!2a_V`Sk#P7GPfYLD_4=O|T23qDGV+FEsAV6Ck+t$j{?t*gfG znXlnf4g7kl1-*G=U*5PGuL=hSGDXo!!m+aTssj@0S2`gG1ZtS+3`RTUEFgJqwHU^R z?yo|irom^OK%wA--)F@!)$Yddy6TvoLqHE!i*BrCfZEdTmHv!VGjoktpFIy$ zpF5?t6jYO|>G{(6nx3zmS9|v4CFU>^G!EvC-PIiV0E;RlS(}lqGk>aC^54%S$2u`U ztx=1n=gq7lIGYhQ1wI>5SoL>3y=%AK!P|zTK78ACd@tmz6Qg`~)_!HT+P%9&8{~N^ z#jDt|NJUbOr9HJa<(u-Ps9MCxnFTf1bIoEE$PRv#5g@bj#l4@|C+xM!|)hH zXuhZIRf{lfkNjE(_$0Ia3(F{@`TGh`%kCm*ftnW|LEt8(h1x~S>dn|v z1$FUvqR2pPr9N+6{k*mMyy-@q}_nW}LV1O8F*4ZI``8)CWvhr|oe@% zU24C)gXw?M!DQY6t;XAWG~TTOre&&UgaUT#O;8f}Z53nrEbb{-@LjwR5VC&Xe_N(L zd!2*iOLZ@m{se_47U75kP&@p!6}m}W48J7CQj22IL%+>c*-x2!#Mfw3vFHWf7}bY% ziXF|R&TdfkYrZe^eBX=pI6wz9fadQ1Zvc55boK|8G6(D-hv1x@d5Dl~^x zXije9&>Z2=c&Zs#_`3XA#c6dx;!;r<{7`IMY9YF-&G3ix|k{fijl zb=o;NbaYzn=#29gc#R!mXwoO&XzPg4NUS49BR|4DP9?xnY4Db*@G`nIe}@bHlXD%w>Gs;XToRKKfG{qZnVvvzZ+%6D_9 zs&

    y1gG$(oaxhGun1VTZESm{3j%ZnXfu0WfSfBiP>be4dJn;1|&}{t35lcwo%_b z;sk7mKluWrxV?OP|HT(y6S$u$$1bScL# zr3!pco!RRT^77R+~e zFC6BT`vLRLL;nu5P~x2OyAOjqprjVKD@#;x@2lWyDe>VN$robVQa zAp0HUBxwSTCQPL5y z9hS!o^$|O<eJtEd<>GfSKH*LyHfgkKtbwqRrC2{*%qn^3y$T{`& z{^os^ra--;ta+bS{Q}k``)ASJfDZE14m>}o0r&$BRWOsa4uQ4h>_;tOt7In5;Rs);c$1M{cV(9+gpVmtN-KAoJ+Zhc&Ik4iyCe3diR zgduRIb9ozfC}GLYt^GyLrWNEEYMoJ^z)?FJr+B`x?!WuC&hNauyBgg@bFVOSyVl!da^+M+2@p4*Kot8e6GQ= zG zm=a}kO$SM5`6}O1v*CTJZq$&doSS;K-C-Cy3u_%Q#EuD96;iOY1aj4 z9T(I63mnhNZ=x;WqNeAlt$ry#pMO!bdGB+!2dMkB5m%?!Poe$4iJ>-7k4L4y?~kE% zI6f0`k>jqE(s!Bt?9+AW6?;Ex*gNX{LW**ft*1!uIjWC3 zKg8!xrg#6)4)J4Z*WfNnPW?NXVBCfIxU=(3WVuv}FcC=bO&ALNB1dy zbknfQe6^nDYf|FuX0fURti`$=E@q0Bs9LPs8U9U;BRW$J^H-<;Bg|zrFt@o<3+6Fb zs$q`x{6%|-bIB!FIG6mZ3iiCK9PG0y*i1k4Q9h%)Eb&UUekeEpQI7LmZLrT(gZ;^w z{|NT^8n9ojs0H@2idtZ6DgIUFzN&(QeNhGbr%Dd??;PwV4D5;DJO=iA-#iNTAJt%! z<4-WkUzGhfcq#W!C*yhP;bY|3pEUrJ<1h6XxuPB;SDk2Ax#cx~apt~)uiFNz5r4yZ z9(LBPV;6j3xTra&bV_9nsA<;#>iY8k2x=hCX&Nyh~oTT}_HWQX*wB{D4e^qQ~!2y#Gs>;w>da`UZ zVtO)ac^jwsvM2=sy!<>GhifF|%|^ykD6E^f;{!*}v*wIPVF7+nv@uOV$$3t~T%8hS z4i9hU(pgnquq|Jm{dcTzdi0(%E_xHC-l?@oX56X4jHgzQK;0x|cMwyOLTPu!E~+F$ zYwF*yg(`E;{kKn&$35rbnS{joqx`t$C-I)BR7+T&-V;3xAc9kLl)De7_U3zHPhe%L zj#mBIi{b)?sREb@==irsH z`ZVYF8~!w>O7!;3)q3z$CS0bktGFpoejpClpET%_=|M53Z#dHdIz$XPBfvg!Rxw%XI*riUr%y*YwW|yw&Wqq^M zU&y0evou%-Q7Q6zhCf+7q>qecOc`xNSRfoEi#?>qhM~Ad6db$u_LTYwTTtRg3Wfje zG*4-(uFSQdtaBvnh%b9d&4i&e+e>;Y9G}s$`KZY^;7zZZppcl-vWb$srRf;^W^d_5 z6ts`@k+RjVqG0tbl+pRtM{0teuJ}lAM4~4x?iEhpOcC#7OA;z6Ot&7L7K`at7Jp47qbajk9he}H>=dpo8?8G=}`8~ zMkqO=y{1~Fc+)3kJbN~6vP$(0C)Y-zWY-_~v)&InMRVk<9*<`I!DjkqEpoY7of*;4^Og|}9k70yS(lfFj75hoC!V&t- zPbxH?)uYDxbK0AS__9`f;Gu#xA(6TpK?9%(F;+SujSQR1R?UMm?$u4>QQ^~0Y z@NCnnVhI1E>((FOm?e?7Y-_HBN?eAP%@j&Ep;dXaO7HZ z+AYFu`IlC>XyIysq0mkdL6Ti~XMQ_9kk>Ux@-XdLX603dGP>=t(`f#bW(G;D9I}=N z@_)g@^(V;1QC&R}fLsm2YK0d1SzRD94!uFi!BQ|>petj0I%ufT?q*;IVlIW(?HR1Q zwGi&`Sqhc>Iis#_UTlGNs9lgK`R(Shl-OZv3=MB-G}G)5$w&9w7Fre}MGKp$Bt&{m z_X|RPn!($?Z>aQ!@HQO@l{&&c9Tp~q>8G;80jV zNyAEKB?%1SQncg6ntTsz6TtD@O>-t>ufY{}Yh`Ev^$VBG@T`Pm46V7-$DezAmrwBy zrNBQ!{jJUnoI2$jRBN*X&ym41ZFC}B@8K))~?Q&p#uagFA)ncS6v*_uq}Y(ye_L9bgG`@r5T`EknWZUAo>kD z9wD)s0W8TRVD+QtMw&e+)PVsor#TBnP7U@Wi`PnDN^?k^p)$2n-q?}d=LaSVW(0=# zsyYy7V2D9cZN)5f(JxX;!pwGvlwQ^UV1d<37J7A3JTE6rKoSuW=vleoha%&_AOmeEKAnyQn;vi|2pNj%JIc9f)M{~w=E z$D=@-4n`FeM;nk$E3S?dso!ov^^2se02>u_{LDK9PUmVWN@k&Cglc@gNtxqn84DZm z8eO`dhe2^#fxn>@b);D1%{o9^I7J@0$Y&WkCu{jKUk=8JQDC- zeybBt&Cl>)iL8M>4b3Adr>jT!vj&Bmco8@hrDE9`R`M^n;B_jTxTsUzv<4T}7!?-{ zVrp3^_f4zoFK#oNT@vD@Cz! zBYfa?o4`8$EZL=p^4peD7i4ipZVAM|Me(x7{E0iB&=0Xv9CmAEtmH6mX31CM$vQ>v z=Yvhfv&cAiVe`6t7pj3xUg{z6_qz~NqeVNxoqK*=iMw+PnF)gcDj%a(Hap?O+Aq0ZkG`)KmP#UEeDAgg=r7!DCb+994?#r5= z(6$ZzeyRiWJ&$i7F(=m+h(QYmIcgvU;R^OzmUk|<0SNBfw4;I41vzQ0and`WcQfLo z1l8ZP|WTw*$q;OWr=tC9sce1NaBCqzcq89<4C=MtI!~M$iS0r@Wu5 z99~-9MdZ2`EE^~zNwSAc*ow99f`~{hU8k!?&Y4^GW=g(|zy`|@cad^Cz8FNGcJ&;g zn-ZXgpWwGv_z7KaEIp;0zLVNDk?IMvDCrMRQGYrZyxN)W!Qln_jA24#{u6hfqDD=n zLBPQ5rczV<>~AU!)m{3G+BTD}3nQtS2sUFVjTWVEuzcWY9C;o!ZzQQp9P@mE2k3Jh zyj+5jVa98)!&BK_`<|!5yjR#OR3u5Gu-4*aoFggJQI=Swe}ODLjW1l6`4^fsmo^DY z>96LPv+lHI?}Y$r(c&N2nvCe4f%JL{$rrqhm%353WUa}dzmHeo4yj#%+o-5cQ>c#^ z$x;VeLw@6K{7zQKjT|i{w`x|WQA;VppzO)H{$YqQ;0cp){7xtc zVpUfGk``*KD;O4{7XrKxkH)t?%j5n!EodeAIUX7zKgfB7ZT=T89-em2CypMp!ooz5 zUTc1USB}i{r{=9C51isUcr`7sArw`rC{9~!Q``HirwgLK?%5+g00j@h_J+RKv`T`F2qf^LsgEhZ>#1uvy-Kp zwuKd{@Xr*$@PzWg&-@CSu1NKD@MSMGoeQM>3g$nB%EsJr=oVIxqn#9}!#ge7;XqkO zZN}cIk0VJU$!r|OZ+uw}}yJ2&%!v|S~X;n8V!gS!g zE3Zg?xEtRhT6W<7^-)bMaBdL;6AO~{1LEMmudWzY)7I-x8}g1Az>7>ulUO9`=V?+? z-Qq2DDh>P-au3`}lNt)ADK=eV6)=0GOL6WDrk{Ru#ep~}9c{YP=gzz8F?k|g3T0Gi zWt}T5$_0m{e|ISf{D?2*MXk0`pYEVir%`LC8N%PPyQ7QgRM=hW%=T5rHcKEqclK5t zK&jDF%iEOLL+YZNfy|EL5o9$!dkZ=1dPq;}770|f1ryq+?<)w??ZP4+AOj8L6S`+fdHrY`z;pj-d}cY0@)Nm~jS6`fp+~6LxXMoxaF`6ZtGSn+aR# zsb{5jXrDjzf}K8lmhYn@&q`AOOGa<06ISgPy`}v)Ia7PShfKuJaV3Qwr&#HNV1GLG zoHS6FOdX$>L?C#~^HM|%qn?+~S}bFnY8g!-V$jqwtb9Z+6+aJ}2b7@=@#)ijq%Kfy=oP#AQpt@waVRGxjS*4`3Xa4Gfd0T3IX~~o< zs52Cq34K-%$_VY00BuN)62waCEl`4NxM^MS1UnESExwV$>tuaV@(XZEyEPv$acTGC zCQPL;{6&5~=7n_%bTxySPJc3XD5b42`I03SsiB&_Bu!HngoDanlF~5~iFYyJjP9P^ z_&X`?&Jz5*kXjW?je2-S;BRaEovw`jTKB8;x44IAJg3L;cN(zYS^K3h+O(v`?ag22p+WXa^ zh^bWuy7D^MpOJL?b&w)V=*pdTYV(FP7mKvfyLE*?S62)?NjTw8t!ya38u+Hv!F8z+ zjP=tGk@TJGwx-q1tO4XTz|TTIzbUQ7rYu9xFw8pQ!dGGb*RPBkyr4Nv^C1 zzW3E}(ldB(`#5P8JP&I0!kn>$E|?!?%-_|Q+V0PC6s^gYSPfhfzP%lnUwMn|jWO?W zW~N}JT@a$Nd**DJh83`^{sSu&Y`e$a$k`sEZWK0@hSp^Q-o@pHaj2r6X8x`iW9&Ow)taSpoFyL`XT4Y2`#|AYWUn-}dpRe*Mq5Q9-Li?dfX2 z`rb5glC&Lxts_h=S_t(16ln>h*2-A}8qt|^RqnKMa8(nsc!#oqRtyG>DT^D3SmyRw zoNi2&(l}vhFCoZ&{%uco5gGZQ0c~x0m%XqmexQSrr&NVg$uusco|vYc#Oj$_k{;<# z$qfgZC~Y=Wyou8#e;wRB`ZYi>Q=jReu{wHtx)kfpmxdk*JXvl`aG#6cvC+2aSfC>* zYKGJm!yPt5nu#N)ie1g8r)H{WdCsmv?JS=#6F5Iin`cU`P-5-wOwNGSnI$zqqtsba z9Ov>c?+V8`)eB^QQzCnxziQa4K#)Fp$ZXyrOGlOqMEZzI3lR0+)2Mw55JnBLKXyOD)B zLkux}s;=nXpMoA@F^~IHk{Q*>?2bCpWuHiT+WSOS%$(I*1g3HkW@F)0D_RueoTQVG zg0Pf>g$*=#HdkpBsy~NkLw|)z-gBe^VR}*J9GopUpxoz4xfssudDx~)sbU^qqYdUu ztPXAe`BExgS^ehccG@#v%0%mg0)EcDULeiFL1iqI(oJWw^+@{i9Q7@f>YFychhiGI zm{}+Vn|}NZRybU&D&(e|!-Y~^#@|&HO5?C?#x9V$f`@Vio3zG^#;pTVFPJu^XFnVdyYQBR27JcD%MJYR!y8%*nZiuEeQL? zar!QF5Q`*McgYn}bn(szMBFcuMBRKi$!)lYGEIx1hXG^rAS;k!-JTCF81|-@;N`A{ z4lyOYbusX_gJvuSH;{*gF#N2x(bVzEi=oP zH1#v-ZQaoysNi#GN$PWokBo+vtCaY;G(>l8Cwov|xLUO9bJ#=$c;Kv)>d?_IVQo81 z@=|FAXycBh(m^Km&0a3u!G}Ix0kh0EbaDmWNugFN`DT7*B`3)1S900n=t@b^V7a)x z29^e^q;UOv0yLqyelEi5I5+*~dNbH3YUTUf#uB3*{RcX~F z+Kg&7Vr*G9nJ~Pe1>$FJ2Kmw4)smaX-0k5?EWg`YT}I!pmh8sQ5xT0h;jj5&X71uBiVtDoxSk6cXJSH(k62LPrYS zT7zTb4YI9;He)nNYoQ$O2Q_U$S*rxWZvIjADrZvi^tDpMT2y~0rN7YF-_xk6kk19!(4&FlD)zmk5#dWrm65_ol)BI!6lswx6V zDHO6Es?HRexE{+bg;uYZ8X$qh0V@5dUjRO<#;5QN_h7vg{ZA`^p4}jMMZJis!;h#Q z|8DNX9-jNds&l?N`G+wD&n)H2M>gG5wE=2EZKlcctrY2bb#bJUz$f@;7b;F1>PKnc z!WP5U!BN~8bHvYbOzTnk>}(LrUq$P_<#TxaU!eORbJ);)LhVqGU7z|LpUlDd(L)b* zie~uf!sv_dBrhX0V6KRD8F6o50M~#e_3unuBW?Pkh>cQ;5DhKW%(=TOrDBq3o@af}ey7S&6z+o|JJRs|79_ z72~|QZKh)NG8dPQ+vZw1&)HFHP_)G4n#Ml)x2$(S%G17w2r#rj=_?5SwCZ~>>61y= z#wF$9+t?!#x(rT@=%{fs88Em&T><4 zIMf^ca6>4ddpn>uETFI-`A?f4VUF!i!+(_GIm@;AATwfEuVgWuP0|%0nyt_?;|;ib z=SL}&tppu1g*~JTExVGHA9jDBo7RL!$#g;$Q^n=Cd&(63|ex%YW;=2n)Lq@|J0C5Zb~fA&zQT> z%&A@N9N!~1?zuurOk``h+O|E7OvgV*-$ua^I!Y4v@{Y=o5wg$iiR$gDuSDh{&J zx-9R#yW-N-OUG0cOvuu9)JrAOljvtf3A};dp;Ito9?`_ZZZm?-@j zoj<*I5X$r!LV*<<&Q9A8N-wExeQC{!JArh`qrW#@3xyZatai7-c^(2&Huyah7Qbfr@m!KrJQgW8o$ZZ?=WalcPconF30aQJ188j-#lZpbn?nam1)>xD+Ak;z7PQ{6gPd0_MJ;OP9cap`K=d7Z#|} zzc;;k8FafFyp{%pkYBt0{zw7q%*BA{+RGA)S~rohs+S*4Y1iME8eHLas?XZ>uS+jn zk$S-8X7v@!F}y#NfqSBzjvugvQqsaE$VB<(=N>d`;2tBqKOXX0gZ_Qbx&tr(ejW{V z7rZ&}_vA(FZ$2BEPn*-@K{FgeAIhGhExbR*T~$3EKDmlh_Ue1?EO_DQRXC;`_Jrjx zXI~$GdZ9uJ_EaC~lwtuDO)Hn5veWDeX;snpC#0Ql5-gf_8Uh9OMEM!+<+k8##{deK zV%?D}N-^33ikg*4JzQb1uTJ+|_^Y%EDzdb*I07fo@w1%EPHNQ4pX%Q6kD$HJ>}8g` z^gI6kMI+8hJsESO90wDhxW1=1UAO>i?W>f&q+a_X$3=)2!uS6lQQneme<#Y~u9Na6 z=vLr#n)PWwxUy&2-wCm}>!i8NNXmuSNnf%z9~EM8_y3X*`yy@Ld&i1mu%*AcjU~rN zlE?q)lM6DdQx$+eYg7T#7h3=3o@c_S8#o{H)hK*ksEHf#^OWub=F4SAD&ki}Qq(-%S*29NfmbaX!`$A8VZBk;f zN;Z4TynFBoy2=fhD7HmJT=b>S!< z-n4tMePO0+z;ySWzsyW`%0BlRZ@S#u)AVGw$;mLz<$gRM92UD(9}i#_yX;G$?8>^| zom~|+A7!UwHaP}=Kd{N{Noht5dy*N{$xcrN@F#hh-pssLej}pByytXgZH1y_P)H~P z1xG=*U+jXxs-FMuwNhPMXaHlr9almb^WEr$(TnIOyS$>>P^k{^%wG3L2FM(FF+giz zr$+|ZfZ~I&nf}AryfeM+y3d8j2Ny^g&yNm(K{GR0j{0ANORgClUA-J?!*cqYv1|;H zhq&I}>!8xzokDb{;7bZ+HKjd!x*IJEm7m6f62jzAp^QfCuWBp&Oe59=qY~8KV`kdg zyt|#w^i8No9Tq+lLYE`uCRhoPQSwOqCCAb8hnZa~LS}X?r^lYel*HAF0T{RDjGHJh#lXXk zdX!joD~b{wplaMvPxVGnl?9pmvh1!PC=Yw*h5J<3Mb@PK4EX0U3i^iw`&{+KVKxIt%NpCo6Yzb`5`Sg6+&37oG$!IlRXB+ znh>xKPo-bUQWu+O12w8Ezr)WpPqj$#m3nf0%Jm#zbVtrp3lojJG~w&C*8mudJO>0* zhk9^!m@H6fa*98VsVDd59l!&eRXIinO}I#9sc9E6XK9w;L#=j5W*SjnW;%?9-q>jc z)Y*GL9DerKmzj1!XdsKaKkLwGZ;+>4YTa@Gr{w9o2f%Cpn+qoTwt-w|Jzr^2rrffy z31I&$eWSyKC{We^ohp+PObo&ZaCJS3(m9|eoLdiZ1Kx409HKcWX| zJY-FxQ*;h(wX3pxg`cHA<%JBg8(fsL%ePU#=AjKJq#W9d&Gx!=sW2X7%eAOHUVc;1 zeN{>ep7IK^Y%hg)k)54=&y@)qJGHwOHdask4R0}4 zZ071g(DNp8FnKkSP3EuA4%6sjnZ`U)Y*co@Hy+NbGCM_h9zCC{y}Z4VSP@ZkYDKt< zhiG;qIl6XBYoijF3@dsi6ui1828I(XlcTTLDK1fN>Q(ar#yCYb!bzEp`;gEK#6r@7 zy#dpPd1^#20~4uh7?@wrGchnjd{xO#r_^*r$$#{+(}_#H8a$NpbHwyg=%i%XL~kd_ z@wMSwog_a6pjcWx%5Ej=ZNDC}A_T65OD(jVIYik_C{p|i;4QNhd zjvJm+kN5TS?~nC$@OR#quU0X#Ht6Zc0s7`+9Q2x#ndjiMG?q=a8D)?4Hl>X9_7K8X zHj!DLZy%09bx2>AJl1eci8>@zsrc}a5KqCTVpvl?6;|F+5Sxl$4q18bmReJBT15?2 zG?m>Rnol^QvQ7pa?bW~w9zE5@cE6hLZeM(?yXzNKu>4g|vs&0;$`jt>{7PW@ax=!@UUrM3IAsk)knfefa+Grihi zAwQJ=FU0oC*J>bk?Rof`9P+~pAywuJAxvEeeNXg4CAB2k$5%Dc)&3GSD#OZKbpnWu zZ_bx+zf0ExO=^k|2g~6WNJE>;{@y2#^E3wt4n=N<`nqJ;Zq_HhzdoBD?K?{yREit^tcXI?z)|N_b1ZH1+2!X19 zZ0%t&Cs}pL{KDa3$>Ni_%h9ZsvYMc-o;o-{gDN<`_KIR4`S_}a!rEPdx#*=(-&TCp zHBd3iclh{Yk8Q07N7ZG=3+jNv*AOQilFV~}PPgJ)D_-qr*w4L8H2Q2WUp_y!hJUm6 z8>;QLobA=1zFrF%VXi9)kE}IiBWO0Fup`aLa9EIZJWTL&W5rzEl|7|&v9G5uF5jZc=F)MMFN5>?1h#>C*Pe}ZF51&$q9I9iY;d{VxDSdw#E zoCSQ~9jYnC(4mha$0ceF2l1@0&Tbs8{96CWHCW_Q8l=c|*-$@JQj2+K z&8V=Q{33ft-(GI?H}4qOJ5RQk>w9bMBUMb$h`W&iVU4Ttpw$9EiIy5XtZOfKVO>9H zF9(M($kp%iK{(vlFm(KHn&bX-5T!gJ*K^lC5~a(3B`DlYVY7(;Xz>&Bhk6o_(~+0f zN$UWnXb!#CL9S~%$)<&!_>=TXGj#${PqSaqi-B~cgKUG3fJns^$k>)~=y?;B&DDET z@>@@PQ$|PmTdysXP0FIl{)!3AQWjOdIuuS5zYXy4+WU>G^2r@P+;_qKoEE>>;W2gZ zrbSBw=Bg&7gNw{f%IPFWc>Z$1q)fbK2m5#md~w~ncG}iSW-i_3W5?MU0r;TURr&UT zv%{o6C)uIym2DogmYbA=+XK*WI;D4(qyC14%b}`pU$AtKvTt8?mRn*=RCJad-uu4| zVMHEISeUPGDf~$}0NPR=3akku#|GB-!upx{Q80f6D}?cS{BKpv(-?Q2^Y85^Ux1fAXJ_>o@D>42x71?5IPd9@1uz z6)l5q^%M0tX3p1rpMnI8bcTo@p--NYebDt6=nX#y)Sr7#$t<~Zo33(DNQx4yE+W-R zg-@sl8LP-Ova2j{M1+zx7G7n=UFC4&sW1J&4%4}=avS43MuA{j968pHTBYy>@M?;j zjlM6ZKm!JodMf`?pHw+qH+L3|NtO45O-|{Cov+I-rPtGCRD&#`x#{u&#M2M!E*Id( zr-!@@Z5KSZoT;G72hQtU6y8&|3t%Q(sImYq7_WY34x#=}%PFvEl#kx-M?XF-r!n2c z_XvfE?+YfD`$`->8uk#{pKV$QNIem+V?o_f;vWNvwR6w(_+1L9W6 z2oIF*eO|8XuF9M&wnBLIfj_P7E!%Aqa%&oa#eE)avvcWmZ#kZ|wY+T9+NutmtZk3y z!h&F5Z_TA!1Hyzk_3E}Z99{VNY)-f~^~<2jkjdYL&}c?WC{B|py__6upOHJq7S z({NHQYuJQ+biqIrP2d1)OfNpFMAwI#+6(e)d_;l4_JV>3F(~lhm~r3gr82A#E_kR~ z zXm`A?Tt7r}7u8Z+JKf1~3|UrEct4rDERVQ1J%9%F`G<+(FnOmpwCh5au553?JFrmeiowl)C~DM2%>QHFIZC*4{KqcOqpde_%Ksu-tYHt z<=GvNH7?Lhme=JVtIFNMmlayc3v-!U)PNV|tuUq4dkI>sjnw5OC_yLFh?nH?yz_8M z8U^RhVR_Xl9%$=V$|JP4OBkkDr#PpH$&MW+-d9OhAG?})(A}0c)m9NOX;IiF$5aiyGR6IzIR8fI+ z!$)HM=r$)*lx}~VgTpVYkF(YM9<5D*Ldq{Y%r#~$kDNjZ}@uNW6 zH&WUtFgH+;l)p9-rHn?&Ie6srnq0@kS4^o3pDapyP4)m_FT4f>ZJ@EQ;k4gOt6#&{ zmeStWpb=Y2_tc-b(fsN;{HR|&Mr%gP{$@3et;5FxE&XWB&{EnzT5gI_>R*==YI(l2 zd>xb+Ua{Gia)aHgBl)0+4R1@iJCkDbC-(HE)g8_?D2jLkL)YDMC6obaYr3`?gmk99 zpg5%=&XMftA$Ib7%c&;}0owqE;%g&S*0ILXs<-6Nstsa>Y6m$3_l+%h!Y`1#ZP6C! zg_U@JzdFw7KLhiI2k4A{CZa0v* z7cWqru5m9GxG!Pm?#6!h+Wuq)#Go;O$`zsOIg3sN7#N*gMLZfTvE9>_Y6OmJKhR

    gfySIcHLB8*vtb55JZ6+wZ;zG|hjmnSGN0}i`v?-?jGz=wLIG1FS5 z*wiTTwJ6%<{=;EmQGpV|>CSpb(VVX9n^Mm2a6kLjeRsfjYXz#_b#n`vV^+%{E)|^q z?4fwJppDB~(OH|Cfn}}WiMwrRq@Oxh0OFOu+6|tTMH-Cm4rw;xVqt=Wpt$36&)uYD zH2)RHSz`SnHV`B#?PW- zr+&$sl@Y4eXW@|Lzk5fR*`rKavH4pEtqfI7{9x@x<>?4q-Vv%Mim+RcXlHSV*aCNL ziQ?D9FqL^_L&uHCqGs1kG$c$76gU4uqr%khd={ca=8uHPo5+@l`8zQdecWTh)uDoT zSfnI#WSqDd$(wVYa?lQ!(?zdDs7s)r%CbbRW8Qfwb4nd~36U}?7-Nl$^t!yXAqknz zxA018f|`p<8oKm5~;+B)rjq)|?atA(++f`->pLxtw_PAyfT zk7ivDrGAlP+t#+P2=mB)70#U1>UmYeDY_XBbvGyPL+s9E>RwyT@bSe{$dL`J(I>Ul zL$HK!n#TU~j20JN&&zba{oiD>Q~cOU#qEa|GLzQ&7Un;LxUWY znS|kk)nwLfMLUNO!V{_?G040tNsaST)p1brj89e9il4%pumo@oT^gy=UtBYm zOZy3?cDCqt{*dk4!EH}B^0Pllh4>E@UbK4T2L0S?O6Pw;|F&aN3wu+rpEP+kEdiUj z;KVT^9sGfFGhRY_sw2nxiBoViyS2+HoTT`GU@~^Dba=3#%YQ#XN-)Ag)i9y1yFqg`S@0W+MGw8=gJZ{s?&n&lJw&V& z!=G0#3-3_+Bz1*AR5l4i&qY!1sTXjGAFO^XoS>zXRTed3A>mCGr;y1iQ+_shU!4sU ziBm7A?SvWRJ4JP3GiWeHji$e)sfofY${nK406>fH2kJB8@@N|Nf%+5_blX2r-w-C{ z7u1Lm;;3+$YO&}pCp3Jj8XNu(d`(*ZJzo>UV->C}Y&rHAQ7eI{e!1k%YKyI1Tn7KT zjWxq5=P@+-XBv`&jmy)LHY+MyawX>OYG{;Ex8W&hxaVQ$q3+@pYAr$h zJUV~)@+6?41gt{kr|IVODwV%Dqq6chXZ+*J{{b7go1ljchDG0STGX2&%v5~^+p?*M z4vc`fusN4fN2=+ZebrkqxQFa7mF<%C|?_w0$Fr`8ZLebfT35%Imk6Y4H6o| z9R$M-EgYZ@vK-FFTJ|xO;kD>vxW`m)Cf1bLt<%gz2L8eYihov}=XP~eCo)Pm%|~T3 zD18ARwpk0*(HP4m3)DX1LO6PFQp4zlPU>@Pd}phYJEXG;K_Q=Zj8mHd@NvZtYExl8 zP3xjg6VJ~iXIJc|Z&UBCDm(J!Oi)>l$MlnkWZyFZ42SNioBHRi^%?itZfdF^%$RjK zIRjItwUFG0=JtRjf_ywpd>!sxJ=93n)D72@+T)VtNbcfmVbTGd!`@G(O^)OSsCC+n zq%o*9@McmS)SB`RLf2h4lijv^yw2CfOV3%7TG*t~<-^Ftr&igDwoNi4{Y@|>X*;v7u)Y!xo_mFjsJ3zb*It-wT0K#%Sja9 z6*A9%eb;|@s->?}9RY_9?!nZNvYqzjezr~jqx%|iAx=@_5J$;H^F^QiXLp>_&xmFw zG!r``V;|rvy;H=x?9?Kr=Cq9>ucJA}TOJXnP<30>{UDI|ck5 z8-|bPiLVzcUetf~K-qw^8twFI>zwEmCiL(Za3F6hjEcvG<21jW;MF!8|Lk4x956mk zD_)y`FMLLiN&sAe)0{mf0q>z=ffwslS*#Z;7L`wQdh5k{v0_>KP^?h3SXL-rLWL;S zX+dk-R*Uxmfv5=0$WHKadf^XVZvey|B?^kL(wZ}$2VYhCgz*3eW_owqzQtJ!l0QGj zy-v~szQp}w0jlX1EtRUY*Sj*P^+ zK}mIUA>G=ky5gtY0A85A7kA18#1q$avdI%IO~haP5SlV*m)Zh{eyx|YHky%I-XNTu z+oO^xV7EGv+D;66Q!HCgBbs+gu#~OmI`G{1PW8o7c%=QB>Cm4+55KWRxR+G2o`&De zj6+A~+|88y%Vr@xh%{}L9X|eDDJ!8O;^=iL=6K<)kpPZOS>_nO=Z%tPmk`-~Zfu znF{a{B2&ao7IHpP0ywPJ!SE@0q?4U4r}wEr>2upzDZ6Epc#7Ghjua4wz%Cf>u4YVS|lg%PU@t0X0>sAM| zI#6O1D>3Y0Q@h0oN9QV$fF98NaEkP}UA?yOirU^g%4;(c7a87dhzG5xZ7p&X>b1o} zT;0LPu)WT7ouoKgH2~T;UcR#mHI9n%dmiKE$Lk!c2x?8JD1TZR=NPC-pn|7c@bZ(_ zG|T!Upbt5gzEQAxeyypmdaC5B_SMXFs<$xOto>O|D0Q{P7Y1c7DmRvT=&DZzrHP!bsSzKuxSx9i zpL0;gqZnm+q_N&7Q59wXc!HB-L>gCw$9f`-Md{rNa*`^tjWU!L8g^2hcl=|{uR502yZ9; zx6gi6TjSUHUsaa{8?FVO#LgCIg(CX=iaOqJ-M7Kb#H|(_yTAUK zT9&Gf#EUj^?#qdx$)&0a+!(I(|^D>ozP6Z(O8Ni+M z%eZE>uuPR1=7^ojuht2rgmN{R{S4B74k}l}!grquX(pC2*tOzM;+u&p+1>q5XlA+U zGF=J)?%42BHO7Y{j`8RR+iy_4cFfP-%{*75uc?xco->TCROP?%Wy0@wwJDn7(3{fz zcdl`c(0_gSyXwT>A}ON;D0TaOR~v*+z8Ts~oWuw}d)jHVC3_!*UPTMW`CzW{7E~fd zynj`Flern?#}_8T$RBe}?ErsfV}$L|aeAFQuR%3G_73Xg%+B72 zI(hA2yKr57g4OBN>#T%`7=E4CnNV40x{*PQ(JkNLysufo`v{w!K@7D+@y<#8+YR** z@mCvVtZp1mNjr9hGMLZe7)wmBx1`UZimV=W$UeCv{0VNV!5IUjy87em5N-cMRZLsG;D(%P z(!wbDma1Ww9Cb?_A{?WOx71|I42IC3LRn|egixc~P+_^;)$gdI*e3hoUA#SnF5Fc& z;_1?R>P-<(3j|HY(<_43!}O82)SQ(J_kU5Fiuy`Ljn@Z9UshjdFaGqjm!=3?DaoXr z;e-BBvioZB)WWQ-6wbLXn6;l-n!=sl8cTH;=c8Rh8*RSYF7qI??OR%5(;RfoS7X?S z{cPHk@E7>ZrZK26n;**8Xs(|&5F_vh^7q4=G5*@?__bC4^@YF2P=;#-Xzg%$LBFih zFE{i{>p-mq{`RVVSrMqQJPdm%yYq~2n!oVVVAic!eiLG8^y}|fE3?fM(}!j4lF?C>6Q znl}}Awx=rz`)7vw&ku0r=gN=&K3C5CnJZ_=8L6du*wH;wn-40kMQYCjjrQp%^tDKN zQCfT9bvhBHwZtVd8o$O;Ry2lbk$ZWxwpkD^x?ie}5oaojMoNycTRw5njaaP=L+^Z? zHbQva-OH)nXTeqFw2JzK1)zU^(}^B}8(o?T@|J$rTX%4p+5V#-{SF6!d*QS`LG$r3 z9$key`RMl?wrd6%EKsL3L2Dn(=J9SpntBJvdmyb@r0XP%s2@U4)zBP3vb$mM#*k9H zkrK?UWD`b2n3clFxwv9uY;9A=1Q7U?dn>@9`r z!371)4~CO(Ev+6#Qj=O>x0n0vTH5PunYmV*Pt8_!_+@Mzjb##g7ig*@YYND>RtM^O zEw8TD5Zky#dXGlDkskgak_UH(DLWJ#;NDPIy94*g2V9mZvVk^0{N`O6(?HYU2_iXz z!|CS++V`j$7^)$(p`n(7dtj)BP~@!(wfzC{&w0s!Da~|(jz^IzQS)_NGJB3em7Xge z_#Y$Z1;cv*k}BXYj)gr!=>bpK>29LN&YC0ky%I)Kk~Cl3dr&lnnxt>uO`~I1#>9Ks zF9gtnnP(&O``xZ9WYOkiEz3B2x^q&rJpv4{S&g(1_|=STq$R*iH@lJ6ChUt4rU8M9 z66ymVs3I8aSJ0(KS_8b{Xbjh{$?kTIHQ2ci|4KueXc59C$`W?`y(HCCzbS7lkm$o` zQ`sJ?Nn*!ZL=3!dmk$5>D05W-#wWvcH6yo}J;aQ`Io5}y6G|lIG}9^q3Bu3cLOQ2z zH>~*?b!!V|%5AOYa0I@OeH+k`7TPPqQrf*$jdaE~m)$n$us$XTnSY zVb{pn2J?xzR9h+YI-sTcwb59}DB$&tdO9FFtr8WSt%LA=Hyn8|K7A{zrKi(0hCqe$ zKkA`LY1$CmwOj~*esC#R^99{c)0&G{ka#FDEym`fXYJLI=+m*Hb)@2SjY*v;l7{nd zes0|u%)b2ATDVW8&tg&CUY*&_4@@q^xonJ$yd;k>EcAAv|sd)pUY}FH5 zeIKX3+=3qa6PhYs`GWd9p*6$~^ZpYW3&mabgvJ74Yfw?@pm4hLgcdCx;v;~;vOR$g z(o3tQmu4K#P+ER_ZK`e86-cm^-Bt&newtmlLc=@ovU5A|vg^^R8?h1ea|f)DGsyc% zElK?03u^HsZ^pAvda7v1t9T&yEP`{x=)jX&yzk$ZqozkOKpv&|_F4o*$eJG-SWEVN zoveRtgr$LlDU4n1Xp5}1x7}dUJ^LEN%b{q^(Zr4lZ{l$L0{M;gIN(A>OTb>)B)_14 zr0@b|s9INHx_hyzjT43Gr1gic46W-S7Lb6S`R*2!SN@wd$9H30b!(E7RichVjgBk}iYlK0>QGd5`N7ZNO3 zC5<;XbhoGC`t2JiW#s_P>2BLqn;-=3iiWZl3Y@_SY^fFPyXa6itp*$td;fv8 zc)B~byQY}Y_R>{am`+IuJ^!>8Z{@W-cOtBF72x=fpdpW`3y#R zDwSkun~<-ZlRtx#Par>v`ekW8L>XFBb7 z{OK?GFoQTB{^HA8XdmN)JLh?Akr1@^Ar|b_S+GxM!3+WmCeq=-S}Qu)T?=(*4c1;Y zfgH{ePNBh(;9=SbQJCqTFoJbHd~{gn&!o6lv~rcV9L2dJOvUi+%HOl*y(4-)Qgl*pdj2V>+|SuMawWdrD;GU%f> zuy@XMZ+$~sCIlUPhy@233*x;3?T2(G%w$Z6rn!G;e(vAj(ky0VtK{_0blb;j<3(YX zd**mX^(>w0S(H2xR3G`fRL^oZewR@_>jA1~=~U0ssh;%!)wA3`PGVH!>0eUKpZ|&K zhsw~Yp5;FLKBM}lhp7I^L-kRe>RDB&_L|D5KB7}S%k7+@MR*Bf{`TNxfvHuJKh#*} z^Er815`JyXgOmbG!G~I;_{|Y28@CgHJs)xbDG6IKcBGPTuZGeX!eW69c%J5rEur9g z)v6`fnpbl|`MQUKjco3A{3;|mF;9!YX3DbD0I?Xri({aIF4_EvjpF7*bm~Zf1Jh!d zlO+zl@P>u@3&?y6XJd^)hL8E0GiLgJ3(9X^&4KdX=l85GR{HIIB+M~N_xp>|t@Pv^ ztehPweu381bRimA8=-X{U{Np7d?3dOuLg!w`owD{n!L2NFZFvb+83*%okmQ!rc(B$ z#zEwq9Bn24e5^Z9&DECv|B-1I|8=Gvhx%S}Jqj1td?+U%g0~wP;l*T);zjMkXv6G} z6L65n$bwGIiu~Z6@`o42K`yfwRX5WY%CTt5`Er_Xz?OG?rGsA5{yTaUR`mjm&!N<2 zT2lx0E6_~V(t|qU5?~v+)7-=YEt?7!YaK&#Orkhie47j6FtM_gB+ni7kv2sX^7Of$ z#}@fW+Viz$quy@KpUM_#>xEPLa-YYR`*a$%Nb@E8Vl9_Wm|fm2gpvlF5_l6Zswh%CR;UG_?X6Q z)fiMiOpEy`9U`C+ZPRdW5cSDF6Gg|j;*fAr|I$i=unmHMUOqQTZ?J!^pWqOBOz%j2#-wVSi|c_Bc+XF*~uCA0uTa z#J=xo2)lerAMDiDi9j%1weZteyM8RtoypMvKu2Gw5gNnop8p8K@bCIl`{2|tr=v4 zE(f$;f`@Cg>!4=wtzcShgqSaay)4_;;`kStrfZ}Pe|Q7x!muggjLUrS4{7yT`pGGW zwcVUo4fIN1KB6@g_y5dz^_UHWHPla6e#q>k)uHg8v~~|LjNbT3v+?hfD0QEviI>lE zcG;4vusPLL++gDOI<3huA6E&D=ORg)K@5gf4C6Ijs#iTY655u^CA^(WVfd$CPEnNIVb89}Wpmy8b~{ zP6JcX4%hZKE?^1jlhl`177ew!Z=Z)?g>4_nH^V6EB9={K+h^!Jxii{^(2R>%nKXKS zp0h4pyr>Ois6QqE*2f~H$;8s?2*%X)G=R#^?;V-~SQSVNFyqIM{2ijB5^JVMe)4Cp zS@nU7a_yJ3N6_T-@>`DlO?P4iXN=hZxJSkaNDrTTNq^kt(gSR`J``}KT^xOLSz{1R zMpUk09W@(J7dTEzKOfS?im}Jy{sO|utap$REdF%{07G-(-f-`9yXxV(-CwVISw+<} z_*X8t3~#U`+|EQ2Y0C;-A#6eliB(Mk{$%ns>!62v9r43{hDCNxeWMOfYFtL%%E~%g zUEy`G;MG7@g&`Y(Y&}IB>)@i5vF!mCjNr6AkF*b<$WqAQv)zfMOe~tMZ}hX-MjuY+ z%e8~TWqpsI&4i&^?t8yszy;2JV56U{Z}hYEjehn68~tp)(Yqo3Ol76>?HzCY#rFOe z-_=69u)TjS1pWHZ&i<>uvtQA7_StU8JB`g~Dwl0|>qFef?lIYB4uP^HdRlZL?738H z%g<1E<2pAct{Rc zoGvGfFM;v6d`c?dQN` zhmUSgXGu@@)N?%)mXq;Z)H5`^MN$AgSKp;jV4UmX|L6PV*!TZ@zg+$Culi-?&i|-> z`3~d7NCLcSXzEn)Y9Xb*m@yRkgHm%{uzPiqtBzp)Qh*026{WQer)$Zs zuD~=-xg`a4`J|M zNUPO?Hl(^n8}YU+3<#bMja>20{+^I--QNiQ!ahcR9`+hwBi?J|VsJbN0nU3ig#$(a z$|Z(QHF7zu@2qx84G?{NzmcmJB5rFpb^&!~nU4RUHpUvUgkEgya#|-F&t~b*+>Kqy z(XV=t`wT}XKyR|mnwvF*CawuMDGA43iJ%2dTs0b0xYEJ(N;fFOzO;3Pj)qX#U=9`3 zv0H5?`89Qg!4IVZTv#_J0F9Fi1YY*nsC83UoG_A}Zt8jp-Ltl-D+!nLO>VV6LR<5wbi$Z(^ zOnDKHzzNvf88|p07(v=%T&(Q}^mtu9?7Uh;~2O+SOhVest%yaUr*eMvKy1 zEcwHaX|4oZE~mLz_+ydRU@k^I=gvuYsqDmEI@mQ+B$0}11cwnkQ%8UVgB2_ZaqQ$GC(*&9y46ow5gpdj7~n` z^2STUpK>LM=b`0z%GD8nFMG;09W6=kt1_9xI+t|4V%N*T#w)GpWaelW5ZR2N*MDz(b5#y6eBknECG_P~u-3F#m_U?~aeE z=>FzzHoM8DZL;YkVG|&9NI*bQgsUP7VXQC`OJy3Y{h8_>`!BYaNZxuNdnZz)j{C}oDo+1NqvzOBSzi-UnjyC)E2Y10y4 zVcu<_oamjAw8wEekj}lWLs| zL>q?IST)fzsdzb!z@ptK#KG1f`b;noY?lqQ+QZYOoI zg<(6-iMC8}A0DAJe^_Hb;8yJZf7@8q(aK5*c5WxfC_9js=ku}303O0fibvLmn(r%l zIGsFrU*Spr#*b4FmGW(xGG3`{`ZJK+)J{~@8YNH ze1v?MoB>gX(Yy?WTPj#-X$vWwmcHk*QpzmsNXS%~@q8HN#jBOwjWhXZjihNGD8tZ6 zz=ukC32_IKrz@?{_50JsTk{O%AjB^^I#cP)A$W%V0|=_nVuIku=q5o7gmrD+B?rl~ zl+cp>6Z)^Odx7WAQec2fnX?rK_ijm@&(?f4Y3A||TYcQk!CPvH>{H-$bycjhS#@H)P$qXG4wuOwS`26+1-o7Ab( z`@&~l8sJZA{jxz+u6;i%ZMtl=Qm>DdiI@R5KZfwOp2FuSjbH)OW{y%$~{7N~3at9VFCy>8>1+7@D z)HZ+TfF)O29+bTI7At2^<@6F!#r@|}K!&Q_mn-M-T3rEhds=#XrE-`5J^os#d%`N^ zZIk!*iDvs$vbaH{h19^UwDVv3i?4jmTV6ZKY)_@RZZK{{%v|SIcw`&z1E8GWca^yCpB0aHAc^yS86tEpifMti_;lFO3QqBmSc^bZ%B9hU$ zbxI;aXBt`xk6kf7>Y+15IUKDrHY-uSx@(bS?@H`zfP;8*slPt;A;^U?;TgZ17do=f3XTC_oVSy1SnheFauokB4i1%)y;3JQf#?#sOd zg&0J{zMGUOpx)h0N~6Eh;pNSO4u+#qpkXxsFgnEJi0K1eNq+u3amMt}AimZ&YvScY zKp&qYbbJD%5nNPH>uQtv<~jnw6OP{u)v5GUu0f?J-WVLea+Urd$>m&y2V51irBXn5ukg3p7h)c2Afv6dSq=C#Bdf(mqyfk zn_>q=hHVoR@!S4Tio{gYbDr~Pd0pi4MPnqatRF_3C|})Q$P061%l6W9B+731HpmZF z$0NQprb+xaN;#j;{|JQzH-5eJjZ)2@Pa5OiD1iFsDuaA=cOdR}cJ~`Gb6)yZ%$$ke za)v^izE#?C%~o|vjfUk@_3xnJn?xz!DcvN+z4ALuIV9)`*ol>{xPRNJ#PTz%{d*h{ zr_;Re!FxWoqQ}~llZ2bE%ik+J5$4mo#Wve!x6)9M82PyLRhYF~C-K+2#T=`-M;T&c zvJt2}fb5$Tq`lf-droF^vN@;s#lW>YT7QkPKb@U2q8Uymt{Ax@FE=&#%5 zgVUza+xg0R?~}0@D@t2YC)};&5q3KPbaZ8zox4#q0>M$dgZ$<9E## z`KuZ9pcs38fR^zxh$twYJ{0{2)e#k>8KX)8Q%dUc=BF>rSTu zj~o2jk4jR=mz#Jpb2)eF_hsxns`I`wlz)G|!))P^oLB#-3;>VIqid^ABe3)#B^6C( z9a4H&I3wI&M(2dJ4=Y{G49*ZmtT6GftN-j_rBXr{I6wRcQ`~k?H$yMOhvJA5U6K!m z(Cj1F+gj4WBT5a#0rono@Ssprjw;PzZhoW;Z3)0oWCYCjrhRpr#Rl1ABPBUM0UQ;d zBPr&ID?x!a`Ix7h6!}<|Bt=1P=yeQZ$g)Pxi-nL{cnm`335q!`6daw8D-E&R%{{KP zH<{t@i&PbTYlhM4o?YT7=@h2xt2F-<)LaUEdkTUCqZdvqdjiKuey}-&v2|tBlL=mw zTf0UWJyD>%DUG4I1xiyv#xuy7+;IV{UJ9W5OK~TjQE(5D;?6nCcgtKl|Fbd{&GkJ8 z$#)qoIH%l@6!*u!D2MnA8F)cS^GlI08FURIXOEDY6njze!^bKYl^A@y;u(9&to=lI z)`o_0QUDFS2qj_)O}Z$M+jmiEj9>O&6>izz;8&%i_tvcP_TBW!uSyH+_VxK?>|;z+ z&}w)nnJ+2fI4j%`P7nb$`KF+vy%YYRwBzOopFi{$ZK%^FkfS&9?ke%9@F!)asG+p( zk`gHHSK*m3GN4x|6);WQyA%^&4~Ths3tN`6lVf5-w-_aMg1{ef9$#; zlxkZ2sS(uZP%|5jOeUN|t_`m8mwV~d9#s@X^^ddCw3`a|pw9e$3lbdvp#&8>PiGbE zN|Z8u;qvSQRA)`0>bD>{!{RFA1qYpOGPwd`^BZw4u@#)Yr3}SX(7rmTr!Y>BPYk8k zj`(7tVx$|Cl^F2b1PKeBz~Zvy1md9mPo$bguT z7!JQRCCvNus1WGyw1mX6)_t4HavxUGTnEHqNH~0sxX>h&P9-D`_nvxI@`|JEcg}^* ztkc||hMCz_h;C`E>m&5AH>+uzbS%t1mD_Sd`t)P9Lp>SPxLkMLCXdYEa@~DzCgi#( z3*-0hUi7X%>p_277|%IwrfdG}HN()~3x*+mtZa&q>72jxjG!wFl1&vK7Hn{{^PYh9 z$$>1Untq=wA)IBAbf=$zOX$r-4M=y>d{{gZ+b{P4Fg%Jd*P5UAVYPf$!9gq@=ew2U z^kvbOT<#vIQe$5h7r;O1xk@*z+)rD6p6c)spEbyQ{eqYp%zeut?l^4#fr~_blo!Ox z(Y?-PeZU!mY-|E%WdO}hV2$XMDHSH2;DLcO@-|p`qdC2iV4-qnZWk1km1B#QqAC4} zpa4?*m~PXUD)kAcG(VQ;eL+ZvbNpDNN}RNR8l**!MyeVM7s5nzQh_@54N&_{>gCV4 zDdpS#YzQ7#{n;C0rwT*xIW{avq^H5XHeznr8Kk{OQk+ZChSc|WbdCzpbu8FD0AVD> z?_XMcQ}M4f5A_#zLl^-;`6@vyF0mBl%ZQw>!j1!(9=SG2FRM|XAl4B((e5Coi{df7 zFGQZUvjJE+`J+2IXlVkg>8E?1bK=Jp6FmnrIn97wH0dNH;?*)U3H1+H5hEkhg zR!uiMN^6}KN}Hxs5WbAb%iF}+h1a?6RjLBr1l`bV=DSh0c2-%)mT=!Q3epB`+gAUZsuTD zEx|wfAdakDCf)`i*@Tp>d#G77doBpC6TC%;8x!JV?4ggN*^{v)Uk2JgNGvX5N0CAl zDOE27FYA|ORqQh(cuA9==pqzv`l^er*#5O$n*uTK^@*+?*zYLx$aHL$iHnl`3k@rGHkFs>Bg;c4KeauVUiQi z>R@fwq%8+7J7`KBR)GQ&&|C^dB(O1f%t>H8{YP@~l%m-3V(r#0F`F>W>Ud@o+&HkP zBWXx^Hpo0*f+1G&;5vwfp2)&N>xx1qnUiCTK@O@}ft4>e$dfqRGkt({5&Bp1sec8Q zB*B2T0yBJJp5*I0l#W$kJf7)Ol;7>D1Hq&j4{F<@qJTZWqJaGwTK;67gOU;%KYumk zzhGWno|!58gTeqT1UD$6 z&T19KOO}L|VQ_U;0sPV9zN|;3024uaX>l{k|H3}>b#<{19k0%WRGqe`wv)0Fd~K9a zgYj_ruhwAkPZ%-v0pme~xJbxqr0{^`@S{#IllF-jL)v7iG61qOPMd+A{E_#a* zGxNCona!3t>2$lx0hNv$4TG&7FP<9)|30CAG~>?KUW>(B1_Q~H2Jp>lv2yVE>RF4u zj8P4)f6g-%YUxv<7K`!5RDiUev)PJsa1!%{So@PM)~b^~HItgetY#Q;oTY*Wrz2@# z66@)`;I_%$i_Rpm8omd%h1h$c!*g`HI!3;FGOGn6;n$MU?(_vA_DeJ@nF$x|*iF#U zb}8#aS)Ch{3%IDm%ukOO%h2-QYeZ7L+KlT7wc4znm>_FC6Xe6%tRfc0WdrdN_xMFi zcEbU_D3Y-rY;{-y5Ux>2ApBMx#;-R@3!lD)*Ay`I7ffHaZWfbqmOcN?&pQVvynTEN~< zf2@2O94Up)KFt#G@Oy^s5OPO4^=-_CQ{O9f?3C09Or~c;_5_^2vKorYKQ&}uV{OlU zmhHmJHyeqUiyN^Gc-gZt+hyK|C?(Xp5vx!AWDI?ZJf4;|V%6z$nSF#Z@^fsLX`dnZ?iF|)C%Z2YJ(xld2@$|=wEERdjUunv|vQ9B$JU)=9z_)^fVqannz5C+Dhg6V) z^VGnX*vDuz=w+18q_mgWWdAvfV4P}_Cmu9GAogu0rU)5{qxB@-7)p!I)nCIOU+y8L z8FtKc8rh8Tc*%2{vC*J*LUZ;sDB7{PfcMkpf|pln!BTMao{I|u^AiAPK(7kW!82dH z%QD{WYk`%81h6e22#%pQQrLJruBNa=Ge$axvNooLQB8%tD*#32K^@RliU4$;0cZ*3 zjhM?E&`}Hy+A^whYF!oZE?JfdNbA;!0%xKcwd!q$Mi1%+8d)B zw6;0x7W$<=POu=AzchNYQ*sN|!1h(~2s$-UaUm+^<8pDB^?NIg)L0}Y!XiqYH!z%5 zXsorEX^Sam={!XFcd-S~3ViEgJ)khF)si&=5&E@ceQ<4eq9tpCUpa9IPt~*)tLlyY zc!i{I$WvM|8;{PwjpstG@=5_iv5dD;%93B^X`A--Wd0*oiLVgyRvD1%A)Fp5<*hE! zswS^4u574>N<^;E1Eg8yHF^~hxuOh@T;U_Hp&qSSvgOSCHaY7sWwmD8tT!!qzgCA4 z8rL?gp@q**RnMtfBKyZ}}Sogrbeh24^DO;?Wpb zn)532^+X}@k-vpc!qPCh5?5fOz4(GqB;OfrcqE%gps}MQ8uE_f%Kv^qcY1Kz4_{4v zKzADT==@w;08O!-^PyhtS(vW}-`O;wJ=^XX3+nY+NhJ1A!CYG?U5+d8qfhV!NbLO! zAs&ImzEVi+E3W+Sk;wa3B=S5+yySHb`Jrv+tkj?b3k%k#DFzMs>-nJNXQgd2L+dxB z1B>L7T}0i&T3asP^V&yoFfwu4}j5gl0-z5#R;V*Zbm-;RaRuv%%) zRVhpDL86zXZR*>O7JpgaNwC?*of+4hPwmWj z&VUn?(HSDd`Od5yex0P?M*Tu5E>#rioeG&XMLsQ2=cYGe>C03sB^*an+37(2ux6Hb z`q_ueX9f0-0El!y>)qMxYv^zwnwO(lYhoRfk-EN9fzvS#R_7MEMf+>&c>s zbz>nyf`PI|{s9eB-)^j_d3FS%wdD8AK%Sp&EV8J;5nkY0H;Axn$ngfNSwrvQY%GF= zqKo5rqK{nkdYJ!-=Xw5g!rxoYUO|1|V7+~I9QG1tR7zcrbjP>eU;#J@TDr4DzpG0S zq)Fa6j%$tTcV`vj2g$z~L+0VBXiSX%@i_docsmX2&gx*7T;5&ml6$+e3D{`b^% z^{g}O0{6ra74HJ~O6&rTKCjF7{{reG7TSXn&1pz1rccdc8|sH}z;vNs;|c)Qi#=oE z+o0X5%CyPG@6F%x?oPPJpn9AJqGvP0}aE1GRZ!T+2p$dK3 zbbcHCbzfFP+D7O5;;58D&VE83m}sI-6@nsZL_aQ)yJz=fy(OsWt!biAqcrv$evL|F zPoc_&G}f?a85QtlltH=Qe2hqG1DGG?bmakT6iP1~AnN`!fW^oDWf395sE#va>RCG} zejs~_Ylfy%+Qzny@;W+BI14V2m1me{`uK!W z^dKRcH5dfpXdw+5Bt-I$2C+ANh5lcXKSG+O;pJd!I+)e4=obOhaxkmrQL`h^YTMts zQRj)#os4dywzlHeaaSBovc^&7m-=y$$H)V z*Dgm=lGQ&%8aH!#wa94kTJzW}6<6M2^s7#Qy>#!=PNJB@fV*c%^xCti@F}7+u|efUY*^^>W^5T2=ay`qw5j58^MxvXsw@ zzasJ1d{HA5e;pS&;&`xtwc?#W{<JX#vs}1}>~8zZbmF6GZ)58#Y4E>& z&chA<3!eXI8aR8gGeA#io7-;~JByPojqLwZgg4?Q-EKqyBUqG~hn3_}vcjm*2f7b7KkPpym z-$MIGvBfyjrjN#YZd zuhY2kEH+4wZp-a4Aj{fEQ}86V7x0{(1lbI&+omucF1P6v_PX@Gd(jluU0mWK5#TEu zVyI3Ao67HWy=Y5=)1iK{ekJgQ2|%9BU~ghmS2Ce8=?L1|XK87}a0L_U) z)(`o~&fWAwHjdxh?wi376-IHtMJ!kX%oApD%Fv!!Y$YHV`4L;gtzwb&srLe8W||GH z;m7XxXX7}CTgnq3L!SZ4%wf4wHtm@s*m2<;)(PL#PasIZBkU6vhoD(mpRiV@TRVB6 z$~b@FlPllaDcEJXxvXlrZHNY`4{C%S>)C2#s}+Sb>M@rk_!puA&Ls(OmDoxBK84zI z<6Op#R`$+i!_ier7V7|z7iO_Ej6_|^{HA3XT|LPx)F7KhTHZHfwCYj(bc9V!na{!l z>kB2a4}$X`CRQwEWD7mP58130z^{@cz<(u&#aX`K(JG&&{8<>nj2!k%5hBm<7CeaD z%Fz*Ns3Q{YK}2YU^+FoSpFRYU`oQ7yPuU3IP-z~BmqO#_v4IfEp!iL7BbIgHN#@Ow zum>61U$b3cvn}iXM^$kmQ0B7)6Hpj1pYeE;Yv*H>I?>g~<^@cq{$H}ad|fqKB-Yj5wDRHfU=d_*OqRv$ z5+>uHi`fTwOkRQ+wAa0U2^)rtY*1EQiwq@Y8D=lStuDiATtMrVvFas6wnG8|k7Q|q zffXeM*9fJ(eS7-9dRTmf$mUVvIt&|{N644Dde?J{bi~jdqH>YQMw!c5B#(Exa5*Nx z%(--7IlIo6zzR0pK69>*Jjq8MJ=Y4G6pMU{u6+$TdBjQ<;5A4-O-XJRn=B;pA8>sr zPxuXXF=G(SPM*HODlgCC?vm1rW#y5}k^Hc1JySaWboB-ece7_GY84AZz=K+=py%Z5 z<_ukPv%z*fW+iST5rGf)kv~!U4Xn0J4@)WT27*_!CRhbO)2R(?sQ)>A)Xg~8ouiTK z*bDx@=x=bClYgQ7b*zE^`QkU{`5Wv|n^;7^h2qy25Tfq0v0=1r4SP!9oKcMPMIC3S z8z+=ORMXAM{kIs;y3H}xfNY*y98fO1+55PNx*~A%zgi5(RUN#=8(1P;Su2#Ag#u68 zHN6nkqd3FBh%SH4Dq`^d5QA6YKN&n~ zvz~QKSZYQ5OPvEmdN{zJqC;-}ivj#o3?Mb%075Z(Wdm!7VY*X<5kGvL*Z{;+5Xn-E zlx{V`2UWh$i#4FajRNNfML6-~cgdUBD1pL99uzij5-5zOU58lge}+Qk&8%a2pfJWb zVHI)XvHAf_M`0{9fBAt9O4-IzDK=LiQY}{?GL8z5@~NLIPLWG<1tJqD`zU*X-rFL; zp2&+dD5-5On6fk!5%R_E;kA{?0u2m?SWl#G6}L!3w*L21D*Kkch)mnWB8uE5=2hKo z43Vd4!!{@ZQt0+J!803g$IBG@Zo8N@5#NZH9ll}pz=la8<;T~nc={2lWZD}D}D&trorZU?vtlRu&5 zd91Z+eyAJ`=@{#;=EpUtgxTiMGr_In-4FLWf= ze{Uf9rH}?OSCRii8Bs#r;y&Ld-5!L1Iapkj`Js+^U82;S=1)GO$PthxiKg8;R5_?JgY%Icl z9Ab$AiH#m4K0PF;zvIwuiJx5)dYnKQhgEBuairhp@YeU&{T zFnsTbP(~gUV8R~eh(Iy_h?qBrXn8IckD&(Ti)ZdpF|V#172l8Qysz0Y#)qTVG1gOH zg7_*rBP%#2v~(v7-s%xeu-O-HFS`~}=Tk7AXntH=5w$;VZ2PCERxoTam2IqZ;Ax$B z#@&Y`l>!Fmonhl(JQd|bxP6{|*Jt??a_DMnUbCfjVy>KodmlJS~ z^1vB=N>IG|uETG{MgP6Ha_4Ih{Gjnxja~U+@wF z?=LvVz|rX!*3*=mO})-T72cgbJkQ>hyxf5oSUMM}r~Qia+N&f)>Xb`Dq<-}hq-REl zFX7U542``kuBJn-uq1vp4UJ#w*i#Pot5=}PZOo_tBts(^5bdA=@mqclWu*21&4-y&7^VGJvb< z_^AjMwliRYy9Yd%chv$anX<+hfT5E?+gadzq2&M)VJVwrg$`bb#D}3xY6(%#nWNR4KW?E42(UO zvX3|oWS3IlW*1j3o(}#u_34m!6T0P7zggu|`PAbk)CPNK-A#;s4n4Su1JM#{@CQp% zH%bY<0bHuzafe?roJMvsZU%!tzpxrgiqCXPJDufVpZS^5WvFp_L2<+VhS!8)%$+|V zEOn*0Te@LP@Uf&=YI}=Sv3^WWxdO~n#@)h-Z%K!4!Aj+;D^8fRA=H8Xj{V8v{f=K2 z?=Yl`5Sti7I_*yuDGbCGG!{xnKxnk(cuC)bKX!fPS9t z6t*xaw_(9Blt$b}!&6q9Zy?sOMx zC5MjQML$a@@E#W6MQV1B#WvL`pW$0X`NKX2qyK(Ty6XP5}qY2{BxB~`&#RWYeztWr#9U=?*YsSW)3^4MEO9y{6_S5=EmYBYCT z+i6nax63sCX4x5^FUnpo5-ux9ILQ77To z9gE6E#^zR)Yg96=z&nL@Sk;&aPwWm)N0=D_+@|Y}Recg+z|Rx|WK6K1ba(?`#ijYE z@rc|p&_|Vl=V~9dVGW$fjT+cabq0gG$G>(0mVtcTOOdBUO%zG{s077g|l&5^I# zz_9r~Y|-gOr+n3jgf8+$qwV0oauQJxvjjj|#=J@^`&Ly1yEU3bXOC&d(#w!kiB|DoR44JJ(s|KRi==4=fqE z*`EbxdC{v0>jRC%1c=EEUgVkF!vnUc`^c3 z#ImGCf$CT|6Qz66S|2spHd1#<;ODabL2B5)Ocsz`jN_aj^~uI5@+dD|RbUJ~CiiH) zfim{D0P$$!b8yj4jS^$@5()Of6lzx+fZZ`WP+3Bw?dlVd7uMRG_t$D{HQTk!`a+R)?= ziYx0Y1=qVmC(JX}cY)T=;Mch#X5ZO+M|s_JX_+RX40l1M1c4ONA0x`_L=H&iVW zBTs~?T#O{6KUh2qPrOF}JF671vx+Mh0ZXrisX~i5Buo`r#8qKxCyYyIxLO;Bs5wX! z^1>tsbqH6vf7mDZSuNT@o5R%_SoD{}vFLF(5TU+|kJ(1qo)M~opE*X^eG#JUy$De@ zI#QIKZ?<`Ub?Zy3y(dNpY7es~+a}6t`lqS`~NmSoJx6hcGn`D}~GD+}J;4bqR9t3!T+o zRB$~lbf!~v!0c&_K^~9I(IaT|XMuhPtpY7{-6 zsCt@twwjtkyE>{L)3i!OFVR*Zef(u!Te7DDn&+#OXw(g8I!ZbaZq$bJssPB{`E~V# zMBQtuV|4%`$yoUZJ_l=ao&rM-JG)qGy98#CMFxy#or-LT*4SNL51T)u8V zB=vi-o;S^TUhRT59z3t|5HCIy{~2ucl^4`F{PLwOS#!gw>8EYOXzz3C6SVgQmAfA0 zAE@pKkc)a8cic*~o>vot^sJmb83}jao=r(jRDP3eK`YYtbsT6X`*(3elUP? zc%;_Nr<+94-6kqe%@UZEf3vFOpy(Gx??Ev4ZiK767gb-=%oEi9MYXzfrAfByJCPC6 z%v%;AI1QaO^8B6uEspxvnQfzeFRD$@PY8_+iWU9XsD4wGJ7=<{*m363xTb0!IExsb z^H|<|SU@G+g9@f)h;)Nl4BOI|RGz~oGApk^Mc5#hU0L4d#kY@vx((BOgUM z=Q_d1^(8d~yu-M=_t=a7E$i?$A}Je(`?6Wd!J(4FQUM`SFw~b`D<27~V^w$vO?+AH zUYr3C!)riZ#*BFeV&W)rTgC5C14^ zF#gRq5v}oyn-8xjKJK{j@Q<1IUz~;rdk=+G;8F5hPq%%TS|C|*lMHt7D%~0m&h{#` z9|5YqN@GVra^bv);um}gBkvI^-1yy9(!nI8cc|ZJ^+j&+1x-)4aF|DqR(o>ZE^n~J z1p4XjyB_&)-_cHy6z8aJYv(7Mg$C*M(qVKSp~dqA*)i6+VQ&Rf*ka);bKQUlUttf< zGZ|*Z<;5W&bz!y0K>BgrfWW{V88-R12PWLQb9-Box;T(&Zmb$+Ug!%3{{4mbqUdO+ z)^#a&R9rIkujy;1OJmhfA!?T}rh%!0+&{T5-*ig_&lD8D{BVkkG5$B-q}T(~pu%|Q zNQohyU-Dy5cl1=%6=FL79gTb|Il*%NJ7HpxZ~C-c0REJBd{hxCKKbx>^o~!tSjz4d z<)fED*0Oh!`Ee%L6yGS|2b4v|A>2#bPr|OYOO;4Ue>-`ZDbHv&uc+C$zzw|JTeC#F zx!=+0I8VExQ0aDg*@v`CJHnsyr%7)mM_ST%cmR$Iyu@3cHCwb?_#JhqS;c@@6e`^^ zFZ-`8D>UNW*?wKE$UW1wt7<5IrWL5O zgU?jv+EQOVFP*PE|0fDAR4aqe7W}TZLZ}P*7nR34%2_2iq|{IodW1_jzPEuARZa5$ zARUo0?wR4B1~cLOWhmyN5C7P1V z1D%w8!P}coUu$il?2W1ogBU;6zaeFpUsj%is_qQ=d$J!tS{kX{#~wFQM+*ZVL3WDW z1dgq^A8b;0!N!YrZBe`8QFAL4UA=kqHbfXZ*sdJ~t@+vNzPwcxQCy_$>SA7a>9=ZE z&;vmq_I5xFg%dG8bTFr~gI@R!l8I4!*|!5>X=fYgM+d&cLG#}&lweJp9elVnJ<^Xn zZh90>f7Bq;%-!l~=?uNKN1YEjJ7zDA!OKY73q?sD{j^v8QApEfnsyRF{F?8Z9pXN> zPxayl+`{*hL*4iDpu~bfRnpih5xzD(*sr~}h&bnO(<9F5QS3AKtFqWeel8=gomf_k z(&_zbBfooJcH6?v)t^03j3}*CE$o7M!iM;B^$4%sMCm%KG+*41eh|I_6!;^x%J5H)&O?f7| zHZ?H9{l+P%9R41Mv-?ZqaQwjI#v$kPM@^K!g)n$bUTFyLB4;{;pvTDa?>&mhe+yv9 z+C8NKMEusr%ur9w|3@SYxwNY^gvY;s+z@WP{m*Eay`waQ89N_0ghxMm6br@mMMs}P^pw3^tXrs74aY$pd{JD7KJ!x9Y2N@Dn9t$pc zL5B!h{im9WEg<4HSRUSOxTBu)p9iao4^48xPq0&@C3n^GaK1Jo{dwH>;KVEL{3r8h z5>vL(wYzF^4DS3N8a9=y2k6;*>If(VY_w&4*(mDd53Rt}dqVNxrw4oJx44NnWvmz) zOSSH+dS<5_myB#s_tiewXaY!0ZWB+Z@2iRUg@7-Xg1YqV15q+a*PC>FAn+RYKy52< znBl?U^aFu|5!l7!pHm8lF9Z(dXS}Eday%TmnnN!NPa0u}&GDGgUmGE@8HF0x*M#e# z9vVp+5A_g1TM7_#sA11G$fY*5j~Q0`nhKg;l{6mHB8uXFXo8e}r(a8;{w9rM7_Gm` zFliz-pGj+noik(R;c#!E&f*84xS&{JJ#45ryydKG{d}Q9P@A0(7$GzcP;JHO(0UyD z{#Map(Id1Nsx7%(QPrXYP?4%!SC_)oOh8a{B0_pXr>I4RURqTPpDhJHk<+a4>~?+3 z+MK`VK0ka@dgW~Y_HnPA_b)$cZJTm1f%f21vM|i-=bkgQ_HJ%7;XGMkB_6RK)Q#02acI;qe}nzgqIoAUwXXG=#esJ#GjO?D$869J2O{(hz>}<>Q9%)Um&T5cyHG zwe_O#A{xBkw*lF&`vjAHkQryxf2aTYC}jGA()1kj+2f|? zDEB{`lZ82@Aw2!*rISAv~4;H*=C6twj9dUSWzpk^`Q*jN6TkS409cFJH!8oA3#_i$K+iQanN!l=M@}*_X zkpLq6HH}Af=UFl2MtvMK;5BU^4qj$DeYJN4J$Oy4Xc&Rbg6>{~S*zVatB5db#$8BJ zSO|~hnkWYwFv)Z!oThfrY~Eebx`i@d-&Mj6EU$wW@3$NVgxreCjFbh*{SaF&sH4^p zc3LSNwW=_hOV7L&LDM>F2vy7)TYWDcT`-wfdyQj(CKVG+zwa6j-zyfn*6YjxV zQo~fOoZsf3qj+eYzTu#+$ST}fzchPFXJWT6?wv7U)7A4xIIbBd~l~FQp#x3yiE?Tr@v4kSXdW@EX zVg!gL+0(ex6^$=O6-14j`Dt_nwdkrv=r!VWSl;WZ`IP9YoZi(kytS?YgnocD{!KkuBn6 zH*K&52AoadL!35Biw@KyNP2sWaYw$PJz;^@rx^hvER_Vn_RE zFIy&=0p-&=IZxyS`%ut8%|=RJEwDtN!lT$3h(7!E)nY6=O{mk5w4PcO>mN(wKUFoa(1N7ld{}3G`r4BB{Uj zRA}+&Y}Gv`IVpzW3rOMauVt4cMYshT@P8ST?R0H|7RtvY7FNR>(=={a35sMOz*zqQ zrMfWuk~!uZ2S97Gla3GY%u#*Rsoy}&-=KE-K&_rWz~Ad#`~|K4QHOraDEr=!IO zU=NKP4v>lmVD2C-umq}mi&4!Tq%{B>cLr%gbX4`V5|pPGDOxPqgFV3H^TuO5>!jfj ztx>o>h2t z6pS#unEhl?z!?zi&3V=@6hB@|qy;0iu7afJOOkY2x*+Mr(j;v#vJ`HYblgBv6AYh& z-vMLUIZ~?z(%u+ZL|U3KO7r&3$Om@wnQ z#v3#4ZZUb50J2FFwDQJO%Paw5y6&3AXIbls+6yQ+d!oieaGso~Jz<7B&uA+629bA8 zcDZYzvRySldS;Rqgbk?0B(1ge+fVdO|BFdlCF{Z8%FABZ)qb3$^%c>w4uvc|I{ot&)kDCiR?uw@~lAncm#OM|CqO@t6Mk+wV=6G{iBXait>JxPKU^pr5_ zI903kS1Bm<{1pd%HdS-L9)7Z6ELfx}ewZxeZ;_|y*z(*q_of0SkLLh{pDDZ=LpR9iU%S!P1&CvW{%lm;;q(1hh#WS>E+lL--;2fTzwGu?j_YkdN zCU^s6$Ih7=4>J0FrZyN4`2+0@G5g`YoS6sxbnXX&QnMr)aToGp=c)fHFA7S1_@SWG zM+WRg7XuHY6rKD~^Mm_q+))*zMwI@}&ZnsH zlU}x>2*+k2dZ&GYh1i9zovh>V_rx^jd0#2B0D*bBQo-To5fJ$?uae!(s#4@!&2HVa zGhS|pDP>=6OF;esTviQ+IE4RN{ih!pL_fW~w zqT!*EKQg`-Wkd}RbpM=%?HVi2#M4^6cfsMFlB2ESH%iwWNH^DJo>muE8`tD+ooLyK zL1y>Wd64wM<_eyBD%@RT0frVuhkm9lkQ8_P=Nd9#rO>o5GzFEkMzBM$|7dx}UF%Ej zNfUG&*BYEp%9`d%kOHa4I<1v;`bC%n{ei4s`Q5^;@&@sXPOsA0s&KBvVeOzNCX8lTji+J6v^!8;6$9YMVM`!+@eJ%Amx@` z9%jeFFxVpNH+ZYW?6b8|pJ9VDsJaz|ftl@Atp?1yvbMs!YwI+N z{DVoJ^9i@~XiZnPV*l7NBLZ1Q%5Bri!NjZ4HZ3ah?vi|%P1?(p@$@C~9N0Ti|83g4 z*3D&2!6T&Mq#b*;Y*x@DlN3+=50p)$#$)2Glvnn+nT{^h4x4_okn`}3aQKcnL+p2B zD1VVw*>pF?eP@yOjAWW^%i2`662b?uC7Kl$Yi*Z+Ww~f%I&=*gOSGzfW43zB>E80* zugW@UPy1>SbbN`n);!k&9YFjth(rsQY6FmvFm9PP5sxpI;m9|a8ZOsfL1VNWLi}u6 zvs~+dN9YQ0h1vAX3hhq>IjXl3-#((&E4A@>oYa5aTd8$Gh+U+uL{=Uev!XD`)Xqm@Sn@v{1mdX_#s?>x*}WDtLMjhNRTuffXUlbR<&*}q1M^ZOL6x-8D( z-Wc`x#1|bD=++{@f-AYTa@NT=!iCRlid(Bub%=4N8c@{7zo!3gj0AUR{*yP7oV48y z(Gix_ZY?_It!O!+B!D<=mluaDFF1eM*J@R*o3cetX_D6hLilB+_Ao1y+cd5c72cn2 zqho8qfY(ym)E8u0R;}sF;`TE>EGf!AuS~B5sX`gtfWxja{#0GqHHwToQ>pPcn(s4X z<_l+VcoWt$nNcWx0e<^9O_fb%@FYn_TAnI++&EyXQ3iik#^2rz%GAQ++5y^i_h>Ag zJ)~7K%|T)>$3(b@exvbx3eI=Z!|Cb?~s zvF)kD#m13a4+c6dSUok5Xf;e*B~pjOG|L1x4VZx_08b7b*rD-Q=*9NCQ%KF%d>m^>3!NfZ8OPpR{$fmJ%B+`?ME&nN;k?6b zdwWv&9&LcB5cVrIhR0H2`jg(4!tb%ysI=v54VV>=&J3V(BcJs4vVRsy(x}h~{j)|R zU;75$zk4;SLk~S43UdW`g4^-P_=>9R#Y$NZ+ca#$o2d6*%^7(>iuRDjGlxu#<w_7V%b;Z1g`(@7!|&-lFNf>KFX}KQz4y_y1SZyTEkoYn`mO zzAh%~MT4y3olY!jdrZp+^Q>AQOgXIDAUv>YN1W20^qS)>Q_h6JFns?>tXL#)4Wppb zS{G>!T|F*Ty2&TNYIP(2IDcWO?=j&|KcQ7sU-!(_|IlbfU*LvNWJGo>ZMA=16W%#r zo!1)p-p7`7c)JN|+{@>+F?8kU|3A>Fprg~_%>RZ?4D8U&@+^ZHml)RR2W*wgfVr6I z+0#(O|DPB`+ppX7F@$fy{||#`(eZI#JkN!yd1mT70SBXJE^6;eMDB~icuHI19Vrq^ zm-|($q10csJ*Kn9nmt=$&E7|(P|ga)J7dkZ{w4Wc_?4v2YXAp`(=9BPFE)!so*D0| zDov*B%UY!VN`oB!WVn|+Ycut~2T{^R8TT|fpm2sot|K2>Wyb-pHKiuFV&iv}^{i5l z*Ce*iS!kAXK`;5#QtF=+RhepCNDed|ve2^g=fe?p8av_SUu-Z&Y)h#Zl65zP``S<% zcolqE4t6a?1mU-@VV=1tzU9COO3!%Fo1FRm%Tgn0sVy*LqD3AB?cZu_bpS*%y@})B zZ@6_DpKF5jYj2Dkdly!T9PA|jrpq%+&n;?i+G?U;uY($OJ_0l8Q&+VMpKtk1<7r&C zUe`9_k^Z~(4j#9EhtbBXRN)3V*Q=!6&_2QA>J9A;Jlfn8-_mbtJR{PUn>dIvs`ZD~ z9=`FD{(vIPmq)%qG{9eyha=`~F|DVUp!HOp*5Z|i)?*$<>-p{ywEq5Kv>x+6(%S93 zrIj<`EZz7v4sj5vmfwMd+KKXmd?P6PMl~OttAqQvn$fZW_hW>&f@!0L(x$bCoq;PV z8u5y3$a3*g=kk=45)nuf9%xBOAM^DCt*z<0V}`?3N!mB#X_xph9kc7>8Jk^o{L;^P z%fBu+%hm0}XWVy1BdsIkGTJggiKM!ct6~8EUR}=4(Q_wumt5RmWrpN(A`!h6-ma-V zlrRXV?tIAw@8wS@$;;K$`q2?#)=I;@Ts>lnt~#NY6K5-L!#Ru_m^QBHFPv&^6x;ih z52;pHMbgZ!B#hve`yU~{cv2f5+H7@&`*{oDn8&{J*0o6aW*0ZWEHt}bN58GTUEDL( zFl8<7%2!l_XKGdwR9Kxp zxa(UWcf*Y zudFyEi;#~FDhQ1UvkEg+q_xlXaZMLX&2-yA?_AS(G>5-gYu7Om|GTv|38`c{w{Afh zxvm(R>+9Nvxz@$z>dfcbHb0kJI!QzQT`_(Ir{e0FVxW|Vh3KdLm^TY(m%pF~hK_<; zjR>V@L(^g@rpCFVsEPLz$K%%LkTG!J@}=bMu28zSW`S*ludY*prEIY}<m0_@|5EcOq^z(t0RC4 z-cFC8PH$B}#_?S}{rr4OBu}krcX3mnpqceLA^N(V7kj|`RYv945kiGKf%-=R4~0j zjZ^-xn-=&XnRDTAO8P3qObbI@6HUKcvXc8jTS!WntFn1@9I~12HBF14n!BZltj<&7 zz@e9gxr9B@&$tcP8|Dh-iyw`8a$PM^0$0nYmZLf4T-;!-|NDP5q@?6Vo{cnP{X>M7!WAVp(s8j55n3{EKK!4AmTBc(FG2c~=|C&x3;O#(7YX9p^zocH=y#%Zlf}ehAq=xDr$>D^7eE z+0R2}{a?rqI%H(mu1tkKaTQ6O->Nd@zLV)kJFB{0;o-mI{ZAvhU^Q0+v1+bLrn?8| z?P{*R{7dq4iQ(@1)m-mL(n9y!HC(|aPw>BKwOr#oet*xwAZ#;R((gJbJ=rxvTDYdRE2yZIuqRw&J*{Lv;TnSmD%N$qga-Q7b#*d* z2v3w_P6wT->uP1ubB%Cj9fufAJbyQJuIHK|t)`LZ--M}U>{E3p?|P_}SV34kbv|Fw zW`b*LNCVdp9_FxtYnqRdtptO=r)4NbJmabnsK=|4WFu)wzo%VQOp|=++H+MRsA^J*v!Yv_6wA^kTrbY)B4I$)`dAcpCG2EQE$ zgRAoQEi|u@;6r(hfFL&Ilt?W4fp0D ze={(Q3V$5hfbRRuvr!Y-HQ5VuIICc!Bstu_$SxJ5Lr*^MdfcT$d;euzES0*E<6m%j(YTq5UtXj( zgU|sjY7@F10RYCfVHa2rrfn@VbGgmd|X9vpIk(tm4TjbHiIn7XsCV0si3usvj z*9$bHxrXm@j0C7Up_GV#>cl)V1QFiN@SZT0by7xDH^P<#s)H;NH;m$2>@ zn$iMbiWl!7%6`=pS54gJ1^sd(jQXay>fxeeN${}<+K>XCf=DWt+l2nhEnf?$O*tNE zHYZK2G%vu&VZjZATPUt*(_7J5n;#@f5njIb!R}ECrb0>P9Y(jA>#HJdxo$|9mJ`Bn zGv(@`#kZLv5T&zv6sMhBJxb7S`Q+|SQZz`;EoqwOii_wUZxZsnCs{r2KCyYVq*_0P z;qEe_iys1p3LTPo|2gG1aU=lW{5-GX+e^>IGf(=+mGC_zCoM~|a4mUKzE?Ej;1wiU z_@!lXUhq4l4s(UMpK1vffbV^0-HeRmsYne=%A)8tx+o&l%2I2W9C&r4kNlM+-@g(i zoOadLki+^=|JJUu)(wR*kfGbs@T>Rr{nov>HIBNNjvd-!?@%bat&3+9JBbI516=$a zIWaBN{X{#LU6OLC$t$ki(hPUVt1gNE3~ld{@mM~zJFes}&9qVazP8O~R<-+4;f^>& zqG<0LZQQnIo(OT!>;}gJX!vWcF!2&s`Q{j0yu9X$M338FbJY{Cy|PBOG)oQ&>EK${ zVn-fNDF!*lDPd}I1vbJc;5Lb~Ys7w7WcHlLqoHCtA|TSd*8{$ofN5) zpvl2buAfZEcbIxNuV z-S3J+s6tg<7p-;2LwpU$8X3*+i#NUQ+J(v!y1AZ$Tq6w$ia-`-Lzdq)56u3g^;A!(CYwha3#RHtjnt=L*O2b|f3$sfKvYN9w|7}~fu$_MvUGM4MJWpQ z*l%K26!+e1qQ-)z*h`2#D%iVV;n)Fd>@}`QERYy`0ZU@6kVIn=qhd_#`u%3^?y70e z^M2p^{ll_*=gyotGv~}XXHGHDAA@ae8E*1MD5$G!wE5_{`id*Q{D?wx&LCf=%Ws`z zdyjftjMu}_ph^h6JH}Q_(}zMm{q+M|!ru%YLu1ly^VPwdknKZ`pT7(q#rmlGKOKDT zFxx4hAGZ}$w(nzJ7{bj-sl!cKMc3EV4ZHOiXvep*Uq?8^AWb5{1ud{ z@kABkf)QZk?a4TjA(Zxvv^D2X;c^_=8wsjL+1kV1N1toFR}s>3#wgompsw3!TP;^|AMqP|EKu6mT7zP>JlBrqz_H7{h@XrNT(-)`KQpm ziM9_|=lnl{6u4WfcCA2=*>65Z%ohEMFoR@8b65;3yLXzjjb7ZPQhaDqUBR; zrvdtqsnEmGpEyGY{7kb20tTxf$^8*o!xV+g9)&bI~Au|>8;fa%@EHr8+FB{q>g zAM&L;f}odR&f}@Ww2tpk(uStt)OW6}#9nb3B=r9lAbUoh3jR+k_|&(o>Y!GXi%ia z+g`BKhN#uFhENpN8a+hr@!_kMkp>3zo+fC#+3n^>e5MGsfxLYvw|l?mrMz^_eZr@#HQ(?J1dh z4(oZ*W`qm2gcx5c|3 zIIqL&B{^+Oa7R-O66H`>0VF@$b4hXvverG}Jy4o;hC)S#4}7Uff$fIote#4*Ck9cI zLfg;S=kZ_Iy0YKehrwkd{|j3y&_{0e#Ar~L+n2WSK=9-*`4OCWfT;`A|9~xAIBTDF z03t75-~5%0g=~EH6^Oh$4QUVkV_cJXy@r{mI{n(6ik{7nrL6~TyEHepQ13%FRxK>M zLJcIpJ7hE9{|+Aa&Gh{tTZrkmr*2ism8(rI?oL)bBFj;1pH{)5+DveVtY%I0kzIF z(@dvYEAI5m5!)1gI(U%(IK;6{Kgti93rC^kgL58ZR_qrGN8OLvOhP}hMD`A(X~%2^ zzFayi*OFtlDD!!p=%bpYTyCPM$XZ0j$6$0mNt)wO3JNIUIHVB{9SuBgLvaHRD2_*e z+V&h)_PuznJrRLSiE~cbA}H(x&XoeHbi(!~rZ)D3t+wv|E;cnP>;s1z%q)O@IAN>B z&aoiM{1UMx$tP_!ywpbM*1VvsS^$#rz=Fzuqr8)t<0iUu5>T}x>nU4bI2_G91&OJE z?5D6UaM{K;pX1M1ruo4zTxdq3ka?6c*e$R0asF0@GWO-KOh}C3otUs{)52dl^Y}MGFN^X&Eq66n(Al*%2U)x#& zilhZ;ke8SFj5pEX?+n`9ac{*6x{B^<)j1GcikPhK03e7dFc`R;IQ1YVS&m9|tt)$~ z0Vrr_zxB0EW?U=j(?~OQK5sk1hV*aTC4lOF3))Yi9y=m}Y4Eq4heJbEXzPLyU;CwR zZEf*d&Zf{1>i>JRFQr}ty7Fk;MOzr-N=q+7iqT~3piP$`EJ3Hp0G9e+hGk+rm0h;o z*OcL2XTU@gJ-=e}(#!@eE!G56g{!t`uq*-MtoXGXtZ`Ru9=;a=vd)sdIqu3XsM%XoQjudKg4Os6^+53!4;>f(l=SRtzVFA?S!#eIX_SE}&Dw&Do zsCTbJak5eA2IMI*7DhzVz#ko8KGlhZ#i)Xe`@xAn+TuMnBW{A9bxxV>=bQ5Bl-v+b69 z#wV4GU(v8%Y!V(H{RMmnj}13%$1sQFvY$ficW&AaXatS@liRii0q zVS#e!hcaAcj3o12Xe>5Ly=!}&Blw<9{CGtKfK@2(F4)%qI&l};<8RZTe?fb^eHYdR z+<|%h24;&DLKRE8d0h&o{&#JW4(l^AgJY#K1Tpgtv}$xT{GP3ju!gqW!-dPzW8thL zyy!`#wMr47hu(g@XPd^BWB4BszW{#TeQ@;dboD+H`l!S>E06*nz!;>VoeylkU`lxp zZEk|5)Jm%#Vb^|5j~?M_XTH75W1F+WWZ`x=S6qB*n}-<>dWNlJqwHtUkQr#d>P7p? zNDf-bGuW^PkoR-U(O%3!qpHvO9I4fFpyoV{e{K^&Y9Vl5#!>z4b6W~7-yEr14UT(0 zA2mCx#lx7g;B|>*Qwdj_e?KbCMEfVLbYJkf~0uJ0TNb(TQA+Q`5E(O&1!*q5+eHtW*_;?&7F(ohAELq`08Zk6I*v(+H z(?GM-4MUzVOD)~cUvz_X6dKHjZ4%6fZ9mL8Y=p|L|7O?|!F<@fVSLzA!}zeRLin&V zLin(SA<_m&wgWXIne=Z#yYwmDwP)wkyjYUM8zxb7yO(|+30Wf}LK?_iaw4Sg zS_dP}GC_1sde2=9V8rre4ct7uxf2bGv44_~#^DI!3a)<2gTOi2%S z1C3F370JYa=Tx<~io_6^JtaMfiH;YjMv^2f8y8i8YreNCpPvHHw;*{u*ta&f&Y0 zz_;(S>FKN_-VG|5m5!3OGtv#<1X+nvI3V4WDD?nTzE!2x4nEMeD!Ac1YCkhQnInt# zRR!R4>3CHsQnN}&`L&M+xFGSm!{X+~0gLAl*27mhd{#PJ<-4?JdU{=2IxC&6?{7IX z(i6O1)CZ+2v(lp&Bg&brVk*Rav7h({>|g0PomQD8xJV>%d~HkuWCu@cz@Z)|amaq1 z?S$;@WDZ&1WGONj4Dzu9VP1bl*tj`-BkoV;Al^x4M3Iw~&cx>Dxx#L?9kZ%S%$+2I z%G$O!(UIyB)773c zBa!Ty5+~!qbJLTs#(s=~>2ghVjpx2ZBZ>1kXaj0-(3aQY^tyRoI;;JM;JXf92pwrs zo0CPt{Pfziur~TApsTf|&iJTTM_LG|vnam~?z?`fBSipeM87ec=v=aHf;}%hC*6~} z)RjI*^U|F3P|p9KT$eRuE&8N zR8NWzUZE46VQj8aS}!)mVixeFZi?c1d|JmB@=dXnsx^}8Qrks*d(Nyc)d94#7o|5x z`ENr5VBAiP8}JR8*T8i!{n~&Je|2$s6>8K_GGQ-9E=i9UR!|1MImk57UdE)v`+KkusE>~Y$1hV;9lp5e;OKy6&yLt*0<+@Ix?yvJx=;Z6b*S-kx z69;}>1%o)g{NIom=t*yIG^M@4SAR%;Iy-iLd4tcOT2qdubG-g$LMLOSH3I;1LYp(9o zSB{(dtJ6KPS^058nJxHwA8sMVIT^awA$4WTf!r^zPEX?Yk8d?NQ%=qSZ|%`is)Aj6 zM4+-^(9`o;0@M^LYRTdEXeH&j0NT=u160zA(@bRRzrez1#>i=Ab88O9{*Tk0U@(L= zX~PjVqzy+{<~mL;XK`Uty?Ov$UYE{Jk>~4xu}?`{pWc+-4#x`ajg|CttgYmUeU`f( z>w2p#Bs)8`N#VlK`V=mI6>i{MnV%gL)sByzv@xA;dS{7AXT7_Zgs^?>(C;}q+)hez z2PeKN(6bE4cKp0}zL9VE#_c5*iCGGx>X_Q7@~hwo@3$#E1h9VI9^2kd;i-K0k4fc_ z98HyCwK%`7)3(+)zveKKjPJmC-fJBo^{$|5Thg5rV4^NtFv>Yv(m~<}*3Yz6med2w z=NBG=34ErAzd&t2`5=INmZry0TN{8z_{dg%Li|d?dYll0x2DH|Ad79BAWv-tq9P@! z1v|X9vBOJ}YB5L@|Qo!%*l&whJF>09tUZ5TUjXH8(khBxL0O*Kd0!K%cA3b-_mn*E+ z#gFLJPClaFn|#D3Z}JgSKS^hcF#*-zSOt-iH(@hL5hrSBh)+TQ1-}Klgn+lp!3H9C z0Sg1(k~Z-z>;|@P?ZmfmxE(Y#yc4IXtWJO7{jp^1%*7*1XTFh=cc(`?sfqGB1N-M_ zeP<5W#m*cqYZv~J{3*voZWnBbf}FR}0z&-TQX-Vl?r%#Kpgg90mTqxhLBES{A$Nzq894h>E)xku)NKQ-G|b(Olp&6UdBVGa!HAw9wi z{%O(&u<@aUOK#dHRYA>5(xep4o$d5<8dSFwn%h&VhmYiU#{f?~rK&KV*p0ogve3;M zyu&_Ia!ZRU;>FSLN@3;=8fW0A%gSdE(c7kXr3r8WPJT~n!3+cKyUz@=XT2xs1^10x znBidQ`_g)+1BaKRkkqKVR}D0vw-l#k?i&c4?PsE`y`f>DzstR)wH$13iX4Hica^Oko6`?Ivf8XHTXK;l+*2+i3|gz!EO^bSEADDYfKdRmSCWa z3s;R8q3rTiCU7U41c9l-Y0b2?=yplP5b8Ei`dC-^d7yDNoN~tLf~bFIH&2QmBz>-B zSH6^dc&wS)tlM0k0tQP@@v8q2s3P5AKY`8pcGn5qT+A&pFH(i)w(!y=E=rfaXO{*3E9;uQ3>Hu>;&F{XQ0|9Pl8$BdFwUlPA40U) zKuJTTi`XdM!=&8+MRWCw_aqY)5Sd9=g|6CelDR);%LZjU!&5Q}+b zVs&pC`H@t?(;24jPgc`9u)7|WJg8HFuPRr-Cy=Q zW2CVHre9j-53l}6YXBwrMfn9dU6yi=pt_GZ{vli{sYz!&tcqGk@VcA$?7AD=OiRZB zFW2vfGBYDgF(jCgB|TJX1R6nStM6X*HD4kSG&!X!+Z0 z^nAQ@9U$b-y7Y2jLBvGK%V)zXFEL7-YY*kV&Y5c?O@8hUuM#)$!Vv~Q-j^l8UKT-I z`n4N_Ay@dlf@(Zu0S0tuqSW#QAa($N-Puk6B-=Yib41`57?0pqoga z>Sp`qnV=R}TuKU_6ri{K!YAvf#T@Aux8J-(Dh}{P7WyoyvSHp%6rT!5*u`%TX>1mF z!Z)-xOJYvvZm?w$;CtuifUTko%&`=W{8toDwFjlT9hqG!Ycc( z*^;-``x)F!^W4M}TeJuXch3Qj{*bEVNYzX{?Q>;#bQeys*4Av);=e6ZXh06Q)RrLX z&;YA$sn*y)mvX>n+R?Qf7>iK#xPB6}k_>`EnL@{iTfVN7!~}Z}O0FFmK*Ss|3Ng+^T$GvQwo)KDnliL8D-H1U)94JI~2jvi=Z`5|@{V)t}Vm2C{&Dy$DY5*SuB!J#|--ah<_Jo7Acc~N# zU;SW}Z9v`S<``d*SE_k z=XKQy+Sid6`oIplwOp#FV;kVa7OI*nMZ^BxAs5Ha7MhYP)fBeTo?OW5ljwOaPSR~u zFHhPfbfU66$TzsH&PNm2iYKp-%Az7p65o^P(gbP;sCT3QBlCs1bp)h61oN%Eob zYa~|kI%%!6679~el|IF{*&j>G;G>wZ4$L0C%vmo@WxWJ%l)lB&yBno^^imT{;xg}L z4}R>uS;|Edk1bL$zFpWN<>T8&Tcy^B@P3Vit&@;-W~=1k)?chg;)rhMoNZEX6n5yd z4YRmGtF}R~FSTFV24M{YKHDzgnlpte?36B`w`V)0l@O>3%TdPU34BC}e0E8!8tsT( ze4tRfbPnI{*!e8x?}p6VkxF+%4eu`=qC2bF2V*>Ms`4pBpdy<7DRiwHbm&u; zXOM{aK0QX&3M8{V<#UKxnBZ|LE`U+|gFVtg^!?gi4g?rs+Cv`)5H0s{Aa?AN@{viV z$YC@vlm8Z}5w$xcS!v&XsXtzhFW`WkDv;U&A7>auCIhm0o#nZLa4a+`1f>?ySA`rh z%@=^|s=dJ%Sa%NDc`7+1nQ7LS(nJ9EEsZ^lJsfvHLgWYCI>0eM`zwxucMft`E<0ce za=|hSO)nkdO+Px!!6?CHG^~6jhb1qdsg$<9-UQX_PkJCB!KYAh{EvV{i)io>4$`J0 z+!%ZN2+q(g6n2zv%tlA0EX_SHDmn^TdJjD~ik(?P^^ZyGwIql?Q|TYULG=6>@VkVP zj!R=4q!mdgj!SwceO)*%B_PP)mIGp^KJ>47)P2R<9CJn^H-@(E8a))LKYxWmYaFJiV)y~g}SRQR7a+nP&dAIzd6<}=cE*>$vZ^J z%caQjs$ELVL#-oYDp=pWa=Cjqn}rZRaV9I3be?#rq^v_EG^-Nf=PUlMPJ_4afN~>X zYP(KKOO32GTov3!1iXpmjBBaqDXF^?eLiZ6DRuIxbnBGF3ZXu9%*AQ5`VR`fmfC>2^G@TY2e*5trTU=mDRAJ3@qvx$j1-Bl zQypJB;49h=J|oq{uhSjBetri0ErrgU;XOP(BPF1A=q#QN$lm0vG+fZ%s-f{2r&Y6W z(4GdRP3ctT+j<&NoL1Z3`D@9>;`270mk_6yVn1;~`cA;T^VUnSNzdPr+vGt-oCTX7 zBF-Y}vUJXH?`yt2Zuf`k>c7O@pFcjIc_7oMK%2jZ`8q=d<733 z3$qh1L(;CS@wR%gpDf-EX>#XIRK1ca0j!0kQmp2{H7YEXzSQ97$=^x)grDurzK2qW zGh^}(xD4q-^{+{zu}(-u`TFc2`>AVCJR!W@xGst1nY8wcAg6$;XU66x{}GH6 zy4{abi1+!Y7PV5&ji(k${}G0lZ)n?(QoP~tN?sWU?W?%%Kk3CL30b+uBZmT;O^GZ|?b|w>k63zl@&~qa1MGdMsbwe_NbyejW zo{65^zyZ@ytVWr0z@fu`l04WgVG<3wq{YqFPm+OykxZg@e_UPs1Ta|G?Y(m1_#>=$ zg%htNYEF2iuKfA-Ik$kDJy!|}}OJ74};iuHDOupJ$c|1a2QHcI%#(RjPsm;pQb z7pU-G(7InFOE^PJLv<_!O?j#=Puw2@ZUO)+Ea#@=74PhMJ_D_h+FZ>50MHt{Kto@R z$v+S{YIReJ=P=H9!Dt_U6UKXtn}17+*0FI9LU>LpuExqhWofj_s@xNS-)PHl-U#xDF$g>QjHlOO2L56W;(ppv~F%OjD zd~Gn2Y%M$HFZ!e5oigwfiHck1qBO@{Sc`_?Pxpz9vpD5(P?phx{CtebjD0=)5U3nkhx+9U-flW0k^>8^gXzvaD3vMvV%Hw~yL4I5OkGX7`%tdiQQ!O0 zd3M)4eq)dq%qm<>L+og=BSu*7$*Wbtkb*$XpW)ZG?12==m8c}~?3ysXTg&{)2iC^B zYDBGvxZ$+k*uxoqrN%zsDUYsWj^^V2S%?J%4I#dcN{ed;p&U6+MU$~CHYE3szM|k` zU-wXIsqs3nTMwH8SJ16J<6&s{D$$pMn>}q#1;gt4Qjg}9{AtP)=~ryb!aCs)OWFp8 zQdY3u_%b~)_mJ$czGnC-z|g*s%ASHxl%Tu}u0a_2FwH&x$waQX7kq7ON=04X4WzH0 zNuLO}X!LUkpxqXP$Q^_Y3;M|kf-U#dsu;n%V2iBsj!lRIm>tRD02cfxzlL36732i> z`H!@?+_4FAW6jM7gaup7eh6g{?@eR5V_BTD2W1TI&wXc#1lf$czZ-&VgMp&HhK)hl z8Q;T^PU9G3hieS7Yxp2#XyzCs+D&d;`DTRZ_X-(#s-EpEP(nQF8r4YF0ZDw+JU6+C zu-jhhCO6e+$|5N9+~7c}uam1`@G_4+=G@jptAWcd(8*@s`;)xHGv&mCQ&f+j&vbIU zW`&jtqgQ~_>11!sS8#`KtTh|hV85JE10ae6LL32y9H(2abf`i*_3|a)G}}WaO7fJK zYZk7eB2W2Ka6>oviDw3cAcSH5nP`*4vMaKYE#fDOd5~jnzJCm~$D3ZV!TrmJTIlId zyyP%_$r(3z0KG|>Hy1*nU66yLrxURo76oj@UE@St|`wT zN4YQKot7P49H!4JRy*}SwwUh=!CMXnW(Ggh` zXW=RemF~%eXSTO&fQ={Bdte9{#I7H_IFQy4F22A@6S}|C$3JJGzm`IM!W*Fsl@H&d~mt!GK*!<-TM5uMx(JhiP7Dv84&+;8IEtIYCpw8vxS`IFm3K5TS z$))AxXn6cNq%fDqpEIn6H9NdzUh1tN1W%~Tq(j=v=jCNJ=aqg>95oG)jruQcnZ)v7 ziCqHZDE*Y17SRu1G6Q5QPpl1FLx3C*pe{x^ao(>M(ToIH+!BWe1{beDHp3wk3j%|{ zFr7ZGgw9O7v7Yxrae*>RXjnT?PBaX2X4%t((y2YSs?ud$8H+ErZvHudb_dEPR{+$D z8Sy}&t8FS+NPqf{4;f9eN1YTA5)BLVc4U{q_}=``)ftgzi-mLJnTj1e^5KsVAw}&? z@*K@c1EsC296?2w;LTvDh z_|Ap%W-U+rmG)zBIBo6J(@3?$^Xjxx;p3Zd9Qp&J-*hXr-av?5pz5=Q5g?~A~jVA)GQWgTxoY5LEB zdq?yrsQXB9r0Bt4^dzCjBQse;vMm6-=%Q&2#hsvSap`oyN3PzOad^}F5#Zp{YD5?2-CKlb}Lz~0oN05ov zh06^!Pa^0>xZD!-og5)oFdu)!?1{{Ub2tAF!BJw?qm$GlMz+w52<)|oLi z=0A*vOnMMtd8KoX1`Y-59VCdzw&Q<1k2h#V55DzSq4dm_iyUb=M?}d{@Mtalq>q`l zM9G2wIHe0wa-6lNbE~_E9p;{%-Te8#N~K!W z+6^{5oK9I~7U%b~RZh@kAtt1JHO6`$te_gva-ML3iZzyGN}4_sbzGlTPo~rg@=#4l z0UfF!r{X};;6TdnGz$U3F>>fXA`p8b4%;DfF_iOHfalx6jcuF47&!pa<&fA|vz8~j z#2!c@OGV)56mSGiM#&XHlecGCcwGYx46(vMICKxH$Vn^TJr9l?M@tR*J%v$Xj8R(t zx)w^|4;67Djiw&$j|Y~==2y1?u2pCG^C|_iLr|QwUM1NKJUjA^x+v>U%geEg;0gzx zIgGbM>crF5O4#cuboIL%<|y2Tg6}zaqC=$9I#{9}e6Oq$wr&$}@pjf>6?mIbd zp5mE{#>`0TKz zI>YC$Q8CUS(ilogcvnZ}DmZqWC@rWMZVnMp48oIZrZ45kwV)~jb=O8l8P=@#cT|$l zQfW&p^^z)_pQf#4=j>~b42I(yoGo;e9FLmhK5=qQ?uf3Z?4X!{Mk?CNL7E-r%oO87 zGm;lMsOZIXUTkL%ww=qWyqieN`cz^k6a@cZHxKMvCi*k(WdKqQU1@MFUofr(CSS^q zmkTv31B8k`_|l5e8yrQIh$cDF{{ zmuOI;Jk+%sf@?K6RIs}Bu8f7q7nK)#Szrr6X-BKS%Gwa*!r6`+=s$DiMaW%lY&t_u zR7bqc>&lB|823i+DE*d)$lMB~`}e*AypF5OGY%i^_=3mrQTR4QRzt@&9mNbNDOqN>zU;zdTZ8cd^jWgp$>-)1 zwwGA^_W36#$x>a82hVdvW;^rF;o$*Sv#n^>zd9tsUg$|n*_AQ_IXFDn`^)OGMVk#} zC)e;^1)(-Y)R5Wo6bqA>$Y`r+Moqc07Z38*VN3)0H@X#wtL~*jG}yi)?CDOk3JDZm3moU=AEwok z-`0KOfwz1SE`bq0d4)LthO9LV{6N^-4Jt5 zLk7p7Jjv&Ey{TFqxtnl_X4jFMXg2#%@h8m#sc2Vo9sOKK4hsTm91G<{7Y`o~t1GjG z>QEOfcR2OO2UA{?Q*in(tqYv2qT&h3@cC-x+niDZLf@eFugTl~Boz&*+4jGaie8St zcM3yIajazf>LP`~G~`pogl}2lE!ekw5&r&A+WpE0(}4Oiyug_kvlYkeD@m_k$QXP+ z*$Zm0`3&yKmGSI|7Qqn0hEj)Cl?GDkHhnBzZXlnB@|^VS!(jW#hVoN(Nzj2VqmEBw znO$J{Hjy0>Xsn1fPhQRMwhN-`MNxt%@78=giLQ${nr3@bX><=<^1d!NH01x_F4h&V zeWJs4+u+w_R&w=~V07;3%kSQn3d~REciQo~Twlnf+ph!ji0i3vJDL*Sfa=hm@+;g9 zrWJ3<%ma{REk=&1Z{GlyP9a@W8MkXB`oah{$PLQO;JI}@XpU!Z58AxAx{(T-$}Fja zCvBSt+e^`=GE`*kbUTWCo5>#d-AnyFp_$C;of@d{>>mL%uo>jN3_93MZoy|!-!Y5e z=D<1J3!2MT?-zjIze#9BcEdsVC)hJva@b9OhW%tqMy5Hrw@uVI_>Mch*1NjDr+QxpIf7D8 zjx$qqD|s-u2a-Qia%%)OY-}Z;1yVCx%j+;+XzmbS9dzO*ZJ?l~I`daF_URS9tort<>sB zEA2=##jUWt9eKa?u1c+Rxh+`1jjgET`!z+R$Vr-2@c29mjo{9~aV>D^@{VA+~ ze(4~82K}@C7el7vqnacSMqb)HNeS|EG6HYf z*%!SjS8_+&g12RMH*Dz2$){6SnYm77ca@{zF7i^OyR}Py6Is3sYXE0(jh<5bAiUyE zS%#kKb(1^lJNpQ5&N)NWO@1E(J@3X;WP3z+`GLl*bF`LbZgQ(aVo!Mj|5ksqTa=r( zv0ZM#WQ$BHYX~;ZI5kqg>>JA0jgYrLZYSI)frAB?_WOO~auUs4QsupBv z86iixj&}s`xg=*MHX1@2{H)J>Bm{)1hp;nLPL=gh-2#Jn(~#8n z1GMUK-%qY*_`Ecd70$vVAL=j?I=wGHYXoupQY7o(4}AFpy4_Fq&`-Rgs)r@FGoe@_ zZIz?-)Ya~yJ8x~|t^HJO4le3nm1niYsC9p?GdPmp{S)~7Y|_6fL?r8LC3>nk@^ql| z(*9sL!vSv~WsZ^qeE4lX1h}F2$;4+zyYRbb5Q7Z2{5EPo;3ci_&uI0ppp8s)cijB5 z@(Vphv#OK0DyaP(ieJ$b-Cfz{d(pE2sybEXuc;oOdJ72R^b3&)1!hPNp?nK+dUSkJ z)1Sr;aa&VyarS;x+Kx3R9iEygYzDEKm zVleav8&w`G$LlXGVkY4VG^fjX7zzf17u#sWV7aQt@vn8prJiC%Dy`SpL|+b;ZA=L> z50N{8UWN<-z2wqz_A$kNY>14|>ycFS0qEIAw?2^TxOV%WmGz|W{enqOm&-%cbHv#A zI=B3v^q;?K?(U8-91n=M+tOcBZ~sV#it*VukzymD+UG;A%y#+^=>K_k3{T=dj(zzl z%gRk4tJMZ&_|1?v&FUz}mQ0094&w4@sLb;7ygL*xJX;qiRzi<6hRRi;uQ_ge{s~^b zk}vc%u1G*%ON>!(g;)ZcTIvcp{5(KrYIQQET{IfT7qig% z2Xny|EkJTsFe92dQufq;z5;eGpm*s=*{XkX&m@N8%Yl({wOYf(FCB)?|0zRph8Z!A z(tVU14ypH}QL+{GhUKH6MB3=gC?@=~T~F?#@xVs0qva%zjK>hfU)BLF#6xI;JiLh5@S!R zAOK_HX-6L~vZ^|&n=y7%IELf#`!VtmJtRhKqf+WJRt|SZ1wjPDeKb}cix{-WV`UZq zigE<0VS&_T9N1n8O&cfg)i2)d&)-SOkem4|V9B*`#lv{#MP$~OO$qRI=?kqY1CJm# ziQfI#U-k_JB*R&bBX&iV1*ND(G_=TVHG}CvhV1R-D&2L7N>{@?lXn|LQ#litHyVVZ z$yTP`4XOKG5S7%B4U~GbyoFX}%JJR|0>OBLo!wVy+t9j!bURb_(BWs}LoGecgyAuT znva)j!K>gqEKG2R0Gd0Vi$5jfv9S=aGhS|mhu0hryH4P8_jNcq$`xqK1UUu|e{?+j zc>;g4?nF5p*!f9qGioA8JB4y5LN(b+Cnw5bOn&%fqFl)Wf#arQF&x%xckx$sp@2B! zR!W|vwr)2`j?-}o-sP5_{lr=>TLDDeQ#Dfb; z&M9yPa}y6Qg48%B*2^Vxuo6gaC=i-6Rc0z7FMzcE6EA~{CuAn~ji?KIGmJTUm4mvB zIa-&P#3AOJ{Dm=x-yrz!@`BEoJGMEbNOyEHJd~^_9+_d&8A^T+>U3hFY9%+r@hVh2 zT%Yuk<*`SF03Yh=@ur@9r_1kXZtSNIr_1@^7(p{$5O9 z2{;{Ypcy(@E&{({z$t!IJ-}s*4DSWwrbDarLUvHAJ3H~AS#q;-T1ZSBr7n^^{8V%b zq7&QJnK;K*-bDl=sEJuAhs*?r?Kblzscrykf@~dJ@IzH;waG_Ou^uiQe>#)PagMag z{{%6|ug)c{FvxPmC(PchUb!*0n>vdd8~V-S2ilBTax0*$-T6mBlrZC^BkIq1^PA1( zU`Nglmyq^%D69T557jzy@-jJCBlI{GK@IDWW2)WL3nAFqdro;>q2@;0PUSQf`l z?JSO+j#;oYCM-|&$T)Pkm%sRZSv}9Z?2RGurRydX1ajw*Hj`TmmD&4`jIKdwiM`+MO zj?mf*IYQrF_#Y7J5XiZ5N`(tw63Abi4zH;Es3NRRp3`tcO6#v-6~`fwJJD%$>HQi+ z@MkY#revHM`iTpWTQ((y&I=S#;!A^+9rs2A+QA88lABAUBQ z^#9!s^oAwhC23ObVlJESS*C6XO4t7zdo&exua=}td#rw@b{!aslL4l#YuGGKNn z&0HoYGPzI#XL4bu)+rYXC67^1Bv!WA+b)-nGauKGd|VM=4<~o16iB^R$kpK}i@Zau z(B{?WO_@JFlAznHX8WlX@(w|>do^u4Up*{XEqeuPH|{}hvNY1DL(l#t`zrYZM0A$E z{ab*&;c9uU8#m@56?Qavu9Ii*Z(TEjLTKwcSQ`*>AS)rXFeAvDuB?+gn%g^tCdcHk zvJi#WP@DDgK6YaU(Z9zH1hH(8vtbV0zCoUfkNO+sXw6AnxjnrA^W#rm{`N^5VIpRR z_g+_Firy>-JL+@=TQskitAjdS8dj%k$!2+=1~418zh}q_NIO~{IH>luu-wKp_x`l;4`&7;W3-9n5 zsOcvWxedo9xv- zmp>7N>vU}ou(_EA?v-Q0mqt2eQOB*aw?mE>jGJilUhun(bY!ob2FT*~;Tv?NeYiM4 zzMFmWdiQM;G;WnCtzZ2>d;9(JJV84$+PxX2_N|O)fs>8 zBOxo-d@3%KQI6yb`5OF3!@iWq3E$Y4d?}A$X6eS3?!lCBP+kz-xmmQvM{BUSK|zdm z^FeV%j(CF#pcss5Bi|o{-&T7{J0x!clKl?LS@_6148u@6x_MYe0INOWh&)XLT?}dW z(rTORCyv1&3>^M`{3YwvpD)JWI3dTq*VB1%@3Kw&-Hq~JF33S5s^Qk4mb-xR+Y8RI zj*=Ii%qf>|AZ&OoW9i7k?6^RGdO|iPIxf)h1}4j#ocJ4RG?Bp>cO@2(MT`S`s&|sh zv{O$)=F0ymN{qm7o7LZ*;J5PM&9U$!7Ve0S-e_N_5=_lb;TBV(!Kb*v>(55rznkX^ zWs5_7b7V<8Jv}9RHArzfrbCx-tdA-MYmLJ(i@=v=p^A(KHGm7+?NEB7NKTH(63{N_ zrFML_zz_Ep$u5%nWA|*m3fJv`VtG4Q*}-D4GAwB@rIsK^cfc8}emi^N8Q99OG4Gv) zwQ?j`&&g+SndB*kk#JrPvip54hp?BzDd}6;L`}Yt5v^o@`i-2#UaI;nsI{H_!MFH| zMi#O@Y>P%0Wjp)zB5!1`a#>E(XxX-;%z=SOu zVS><}a&O~eq#ZT8BYy)kPDGi!1>a7T$yf1h(_Q&3_oJu$!B4z?lgH`~uo- zwaes6boe)nok9J|p$VgmdcDn}#idg%5a*W4F)SlEOl$%GT z=aS6Ss8K)IIMv5T?#UOhLaTm$S0DctM!g?^ zZ>G@n2QdAvqQVFAGjv|?kVA3vA@AI}vQr>!cr2S49L)g2yhlzDOh$(h579UlFN+s4 zUZp+eFVSNT(SyfwE5sZ+Pi<$=p}~1-10w4FL`MEH`es{27wh~{rr+C3JFQe0>?%^^xcrb$lmo7YBa@|p1E>i*{ z7%#f$di~GLsB{{fUD|sqUes1lUIT}iEGSm}+zZ?_iZ%-hvr0b0Z-(bntl+>Bdb>)c z&#+_-H45`Y9Hvp2UANRV1mg*y<-davXS3sqjPsNXUnSA&J9YJ#L!G~y!tA5K48-|R-k^N&FRNgo&kc&9Pfr-@)cxm- zR{PtD{$(j%IwWqX6K2Ay=S#6~SeaMs8qSr0Z}dL(3U7$F!aPn7dSiu_o$}{yjJLe` z3N`Y(I;~&0Cbsfv7_yoB*Yrz2`&Y<{Fs-M#4-?07G zGZjm25Vm@X&m15kFX2CLu7AV%a~IAj&Zva4yACIQ%bPMB_sgOK(SS8W$StkFBE|EJ zN(12hvQe>mJ8+K2;{^xDjqq3Mz&*`Vgj{SyqWA&+il=KG#`yDf*y<1J`2p*Ivl=ZY zQ>MRyV$D8^fu8v*2Hjf5bEok4jZ>YVIM=8~dA>%|90tdKMZjOzDA8-W+99K^ljS*e z{ZgJUi%)>Us*^PdP!hpn2L>pWG}j`@C-Gh|Z4OY@gH?43RMLbpDbd0i zni-_j)s^Wm>BUqM2BcjHQhH#7#%4akRI?JLov9I*QAr!5%Gz&MEZ_nqW`!|Ksu{vK zCUp$?SC(n%ny=1V-9Gsa?5S7$|G=C6ZTqZnEDI;u6+&)tuW%udU&%Xnkr$)=k^iGx?nDSyE#R= z&AfAd9dC@}d!$jMQc1W*??x*15bBs0sqDrz$POV_ybumT85D&^DYPsKfFOlkl)|!h z3KnI4z}!e6!0y_>;B!IL6wd6(4O*r1)vBwIl={ zNA0c3FrkDFT9r42ffO07tQ4~8i)f{f@Es*oQ08Lu?61H#k4FsOo|R*ickyg?4E8wc zNycE3ztgoCreARR(HDiHG2>!?Gh5#VX0xi-LIg z#o9PT-6JZ}-7G=SA)_lR8*qZ0tgK|>BejaMP(SUm4h9)iwydHwWEbmI(oCU2iF($ZM+h$S+$?;$1A`hVI#sNK2JlvNIC7z%!DS%E0ovWI!^KuGWGMaxGb5V*9-6 zm@Z)d0p*qI1<}PC$_5VmHOjB6nC&ZSDsWIrq3yL4Ce`E3ukh09+DZ-f(hc>cd$qtf zs+_^SpRuko6VI2`Raf=+Yru1VGS0iM9YFm@mI$(I^sDE;w^PPuxuE!D6^gt z#(b!k*Hf-yDr4&dPuaAmK6*;YX#gQ%E)8y=yrt)|_HUs6+1T*8(<^8MFS^-4`2Zq! z_lC+8)9yu3bv;mH3|7v*(WvbbEbd-Jj~glptX$Y1WW6*x0AjH+6z-%u8!1T;Nw48U zi%8W+aE=c_wZX=UC#*D&bF)8-6M}pV;u96laySLIQuoGyvuLUPqsGcL!F724|MV($ z#uPBGVvn5X<;4aK&p-j;1hTp5t&_D{wd19bOO%)qRI=iXTTsMma zBWkFurZs@>G*w>LOe~<9&6Jh8mFxi`B$;#0on{b%rc#sUij_U@)m(WC@9$}@G}kP0 zqd|2~nJKJ=`fm3YN{;%jp8OlmK()4(N_+UaQ+C4D06$Ua8x1$l${J&|Mnq4UEqPBD zT7sKxBWo+AGP^9yZ>xmU`>m8D&3ACz>x5{Yt*yX)M$yAoX!koRR=w12a%;8Sz>rWg zONMXM9N$l+t-;Ag(Q9qc{twD%1Gw?)$~H;^{4?nQtqVN!JC`a~$EIqiY3HZWo-Jc&1gK zo$sQIS6_BlUv@?LX^fwuYLzllb0?A>zKz|MLoK^Pd_hc8Cn3PTpsP|-z!`tEn=)EM zpbZ1!E4y^ZX}yGmYIOo>O?M?o^Qj+Y&qLC??!#}mQ^u@!we}0$l_ktJJ1k9U>W~MG zxTJ+V=#3A^gD3D{oN85mK{+hmzJdBtlfA}`&hpP?VQa@5% z?OLks*xhi}dbF$S{6}^+p{$;eCN!k)rDTE17WM)SUZktNlnBVRPkTX%xlU>AQHHS5 zJ2+Bsa=(KH-D%rmJqq6)3)Rxeca+X}zskGH`}oLy7ssiFir&R(ah(F+Q{Kk6A@AXs z*U+Z-@Z%R$_MY-N`}RI>dGme9PhU`MZzWHsVI@xka?@(+v9cw-AqRayZhe&cnvF}S zNgt(;?x%`qU?TC^k^uUm4^DG8y2?K0(~~|*sCzNXhMk)>*+U4VYJHVAwR?qVFUr4* zyiUvdDj{nBA>{wtsQ^0FSLx|B%9-I^OZmN^g;dV+^r7zkln|g`WIv7q>ZeS=MhNS# zu>4Gs)Wi$bsg?ea{gBnCKX7q|zU&XhCdK}He`S@R`NNlll`~?=Tc|OCnhgSOkl$mF zGBuE;4nran!T1d#<6+dre`jf+rbaE6XRGwbm;l-{^|vbcV&66xq8vOq8r6yxU}?6e zeV`OG3$BLttPKsZw;QTd)Idi2aJW)Ka~VM>x67jf&v0cdMru4lVJ7O%BNX-`ignrD zAc=k3*?&7eW_Iznx`l%{#it%2bfk-aPf+Occw|ZYVhk#rPeejPb3Ey~`gg|vXjN>fwJ6LIzKuS9I>J?ld?w z*q5%S`G?rYP5`68&}rAbcHkp&3gi&Z9O7u}p6*o$71}Gq+g`}+P~RPEerAfY4Py`L z7&#Fi$>W2fQNbk7tAoSEdHCu9?;_9V0;N>56ICnT_!$KWaug5E+3hqeM~T&)-;Qh| zXK2ac^3n8Fj&e#^M+->l9=*=b0LJFg7d0c!qDf-8a-wEPGao_ZFC4`UOm3+UThOda zCZlGb4`t_7kD$DBmb4{<^93z6oPo|ujs_cNL)w{c!R|`>xTB{hV#X2HgXA-mFTEK~ zO`>1(aJt=tL9tyLL=hF=@}NsI6pse)IPV#p_lf`Nb?*ombENel%S>qL2X;_{nP7zY z>^@Uz89#FmDB2tM(mN+}Nef#_1Wd+#e&X{%L!$MnCz%%4Bm3y|OyzCO*#djgETyGJ zo8gDxip+)0gK7R8CDi}SN;9Sg+Hn}^wU{LfF6jPMqK^;KffryL3m=DW&QV5NQ=9?F z&WkyepyBs&9>$yA=*A~Ec|~PlX=xTDZKOy${8O+S%PnE8Tt2|=oejG7`et$v8xq`& z{Fi)>4BB%QZ|saNbD@6hphVnmv&VsO=hcT}f`1q0;Gte`@Dyfhxn{i+ zf0|H>-b$CMxAde_D=z!c$@z+}?{|~E#ECcb;x(RA391jG=AO=1KJ>iP$jv-X7_Avg zg?AFeDAgw;o(h)yP?hd1R5og^1<~!Cer9jvl-wg&ec>dv6sFrnN<<~~B$&_R68WK! zrQR=iI4&t^nK%|ti)b+pz@OLCQ3cvPIL zWFujHuRI(qd+1mm`1}mIk*Bmp)rVU7%12New&yFA9ksiz=HrmoP~Zy1!UM{-O+!o* zE7V07gj5uZ-Tl4JK4=9j0N7VL@@*?UhOYs6zw$Teee-tutu*+aB)iH)Vf$-NaE4n1+h8l@^9>XFNfhE>&Bn zu-K`}$mm&SrXyN+Kh#6RDbb$RtW$buPias!1Py~}-$un^P|HBD0OxorO@vO-W4+Q@ zH%p5#5~y^o(wLsFSGAx%wz=+W`Am zHeK4lR7tXI1g&qN)*F?#*zn1&;VT2q>aJnoQ@2U+P{*#Jj=f});>G7%(>33b=Cw=R z|2pW(rIfN+iDP)E#qr>&I?KRGo%U>2s%Xz@#5$C+QL&QO7HptX)OZUAZo(F&H$c6) zMOh(yPjj{^=kV>_Z8+~!XyZ1vD{{A{GsS*z`77@9e4A2*ui7UsHc0L5kevqPR{Jng z2=hgXo_y#2C`6`_d9B&{BcVIIN zpp$j0MR@0b>Fo0$`druA)bQ2Bs4(sQi85IQs+&$W;kYO=8L#TFu7}FOBh^2^>#%AY zHsf~k=?;YjL$%zg^wEFghBj~!DfIk4zr8so z1X@2!=kb3ZRB24BV?_Lu z7y5Ky#NPc9JGA;>br6`8{Uhl7Dxzd26N@J!TZaxZYn2o+Ws=V%dW`~Ek5Y9}O)cm^Dk15fCrL&PE)*BuxU*57X zlaxk0IgxrFgW|E3RvuHTA#0eyng7F`4gKN*9$CX~9RucUq(AQHeW}_z%e3?6aV4SA z0MX$;pdN?FG^GZ6vAseowfs~tIGqHLl=jPI8W?bAJG<~qQdPamQ0#z`$3;pc zOlKiv-DNRTjbas19~LV;k?ZN3Vrbp0QL)ldI8CC`H*(vg(vKIRbscW;Z1W;HKu|!MKm>9Wfe=waq$CtCC?!EukQxC&YN*m7^v?G^ zv%5C|d7j75_xJnb_xrqfy|}xZ-I+5pXU?2{b{vLu`ytgnl2x0R{(Ip_)*T5I6pwO+ zbsF_5&l&?>%R_Ec;Om5A&VIif2O^qmOVYp`e`^lyU-Ueh8c2LbLMj2^`qa4sW8o)QkYK=4YB|-HEJ;0HxzekTB4glUXUK z({bly7Ei0${!|vPnzN-K^G_?JnR%zO&f%R&r*X2U(e=|{kJ1s#MAQ752UGrES$$mQ zNC0;`?YIC{K)@MT$5Ulwxh>m!(Vx1XfmJ+}ww%doi>JE~-gOuC9-_`dcaNHGXS1eb zv;9tG?&Tr$;B3}MnzYaL>6*09ul7(%`mqQqK9?23N%_`uP;cTluR)_AiaMWF0+L>S zJ}Vy}zH>6W}nhHk5xkD;C2& zK)zR?O5AlB%a}?&SI`u4mkq#6zJ@oDOLR6FYVDRGo0U&@LkzpGgX z@!qAYV9ufaQWbwnzXlavD&=0wdIPPW&{}u94&zKJy?tH0w+TP^+iC4@@i(&mg}cA# z-RoJ;c%G^3;|%?B9XdL%n@|E^NpAujR#ESpS&h6l_{isVo3>P)N;kTN)7qO^y`TdK zyOlK-KZUpO@($X03nIiy>U|qRKzCYv8;8dvx^z418Q$I|HX= z-u52+4q)xSp+l^P!h`PLbc~gX?`L%YPAWc5X}_y5-HgUV+6JQTa~p*GW{53|0(Oh4jl*N|pE${LHiT=F)t z^qFrmAj`~|Y%MxMouyAMWhKFxg^fi=o+dT~KO;bQDATv1Zv_wmT4;Sp*{zYcr??( zK7x3%*TT4{7wgKF;f>v{tT*S!Ep)I|;|NbM2_nK=j)!8Zw;Qv0YiDK9-f23|(?A`ga2(8yTl$u8rk*o$$k z*fuZ5*CfE3y#XZp*qaT4wc)0>0Ir=6TL|DT`mjz&oEl6+?XXW|SXmB`uh`1CTjevp ztS0xD2`ShW77vfM(Z1|6B#@}?CmQJQ$KEkLfZMAd3p3sDq=$ZNn9D*5nU7HnQhpKU zh;W7sg#OG1j%%+!CM(tcYyf+UYsV5Z-9o4=h!L&_1mg{u9)np0`ure-eTpBSP*xM@ z-^V)5-`**diKPC+s_-FI@C$lUF8Wnng&MX;8zjSh=oGVZ>QVCi5aT_RZ&W?0Wci?|VehP5=bJYR(z$&vu(n~|8r zeRMpM&6i5;eZmrRR&~{$JN^d=2caqS;XsItq_tJTYjiII%#5|9T#p z+P>ZvDmnRT1nkv}y9loj4(F@4GLCJJevy}b)lN=JbsO|Y0x$@f;-t2qgG*Oxhakuf zgs~-*#Jg%Rer`Rg!P~c2ugTg;rrYx178wt` zV?0G^AWe-2y6;5jek+jO+N>RRoD)s;P#BLwjI)>5W}PL|AtVtv!Oyt5tThrlkEqKU znaY2rvT&C;m-3$lEh;Lz5lpWS+Gg?Ih6nP=Jm}b}$-920KJNwB&|bCCC=fitR#q?l44LsK)|vK9~K%!qDx|0C#_TQhhd2 zLSFo}4cGwB1&3YbA}9IUGAHDBNlIX`wH^6gDr1vG`I0849#Hs+gek7L*z-M&NMH@6 z%T$zrse}*rP_Gag*@D$4Ya(lfGi&s?FlcGpuuvMA$hf8fDPMREpk2u( zCTuiTU|ACZeYgYqIFAU&Oh!0H!9~5Iree~g9FxumYO93WL+GVA)VwsU?Bnm{B5S-h z0u!umvqcHwLz*Ig5=SCOe|YILKgeb%f%W_4{r}Vk$1q z?I;9nj&~ ziNF~xh>QbVhr;Iv)u#1rSSB55DNwO4ebO&Ej@qyxiE3MP)W z%$Mpny2MepftCznZ7bGEjBAZCF5lKHHfWfvM}}32r`s}{I=2Qz%%u-n>!WDs7)5^! zAlWeh9Ltp1Ms(fS0ctjSZQ_8EvvEzSbYVqf%zHCqxNKKy0ZINr#4(PdyDuVM!d7T2=ic6g48+N}$rZ6gCRbBEtdCek8W@AX&^|TP+3B zWSP|mbR|@3eh4O07Mz6q4CDNE@qvNhvY%m`T`YTsC4=+W1f|li&Tw#=80tlJpJl-~ zTtNqaEbm3-Q zYtJlroH^LWBe6?c`32-Z2fFq?6&-isxw(?AcvWW2wm9;Cy77PoWX-nGu8Y<{3^VD3 z3lGhdE?If1$H9ji%%uJu*hc5+YhY2KgpS~__Rw1$Sv&?gwBQ4g(Ya zqe;o~R11fGxIb>;FbNt1dj`inSU9LlXV$`H)go8<)HRyanekdIOFM&6Nrevw3pN$4 z)PWVrcjO|G)gQomQ{m~}DEref!`2ewIutD_t`g+s5(&$>ffHjtJR#KAzvL1 z31}Z9!ASI!k`uIK1ao!K%T4?^0zBy=41Ob21uDzZaDz?BYERdz((xrNaGQn8HA_M}GEO2{TJ-g-}i!Gm~Ef z7N39Sgf|tn%`wy5G}gGGn_R79v?xDjjzKPUn`c=2XipDQifNQae?2id)!=C|I=##P;v(O!HZa;v@B(_Mvn!umv?{^%KOIHYrhgdF z;3Fvp?lB#s@j<-l1N_M&EXEUVLwZgG!xZIa<#Zk1L7?lS@PW3d5J$$GBtk5(cebS%=W&be07_jRzX`E*=p`kDf#Rho}KT&Sqq< zNTu&Gggg-K8I6JwT|EMLayf2iwF+k-gB&5)mZFDtu#FNV%-Yu|Q)kpD{Ezg=Rm-St zSX}jt7kWw-L3Z@=9{nAFYm(xo6`c9?m8t=!Gy+IXnlK;QIkbZh4f%P3r!S{e)4n## z$1Pg@8aFt-ZVa$WNQ)6~%E1J?)UWnhv^%wXo;7cawa}*7=3W9^j&Tda9>U~cNghc< z`9=zZ=YXJyy3N-niu_rxy8r+rBaChDpM;FrSSKV|$B~Ei!tXA=fAp_Bv@@L3cXZ}% z^R$-ccM~jtCs{K*f~g?wB|l?|DdXM4j{JSd?JZ`Qa`6xZU(fsS4<}eqTw{Xu1lRv@ zf(1X!3I4@l9a^{>(|E>0NpE$4XS$o4Ycqs2y~uZ0$7l&SiTQkiqh6To*Fj(>9%Nw7 z#Q0+{i(&GeQ=!Pj-kmnRz!IFipQ%PkYZrkwaXtW-oH`U?_we<)kLfiQMT@rs6o`$`r?}SQUtML9p-tcd z^32h{7>h~*<1P}LTZ|-Zuw+;qA83g!%<{=&!XF;k6GEd8BgN%T#)9I|vWLwS56hD1 zMLUCC^@?qt=*NU!+!PjNIl0{?B32S`(ur zRLo=kbf6dWq9T>K3f>)ADKgUn3I=UYfH&|#mBmTk`Pr-mc*-~`>suGOwf1yqLsPSb zWIrpLai^-9ls6jLkAKT%k?8Ggw%8cp_@9TAmC~IFfu*|;SnAMdmt&1-(VI=&@f}p* zT*B=2D8oXBf34|77w{Y{40(|?a`DD=&2%d`G8aZ#C+?BB=|xBx-sI7PMe!rBV;GmW zH~taC(b)JW&)8g6O>_2;|{b`0-n3~N>7i%S&5fM>$8R7w)S60zVoVMU^G2R>4(p3Lg8{dA-pi+C9e z%;bf(AlNv1vSxMpeM6(mDtMMGdO)$4BU(yt3&f9#+5hqv38_W49e6ot`6Up&4U1$q zy3>=@2ZHE{+Z+Rc%l{Ke@G%qtU}i7YBn3i?);%yvCv{q~2@_&pEk?2lnA9wey{d^b zP6C6PX(AFZC=hJkm0oNp@T3I|%^Dg=(@xxK?cpl7)F>xTq|)93Sz1x_S?rjK-U3;y zIgAHlwjp^LP%%4)@$|Ce@PjN17P+M0SZI_KO1pAcEpJY1j#}i62ShOsa_++#)OcOq zsB2sGZkVi466-_N(maSdA2g*8YgeUqDK`!t z?ZX<@%5el}YStx8yl!^qJ@6D)yc)}|1%1Mzq#(Ei(6KQUS(MTuAr`p0yd+wO1G%YNM#`a~QkWCBvvRc@su8@KX zE&2X*q%Y&LsWXlCtoH)V>Bo2?M!nK3GXIES8g(zYuBNmfOUC>r4HmpX;VL+iv>nL$ z(dEHHy|eZe)&+~`%WAV3B|auB04q>aS%n6fux-q7qb)9ze{%7B8`k%dCKrKG}A9Ydu5&Ox2GqX=!D7440BzG|s9zr6~s4)x~QO2;P z@OYmxmUS?Ff!Y;AoBPwbv8<`PR?ZrNtXYey7&4CS;|_(LK4u+3!=8s#UA@z(YhM9EB#U*LW5T+Jt)PRQ#el z4*pU5T;Mp}$erelX91v6PPB6Yt4=${3)bP!@erAj1bcK0{7i!;FkiR`#!tYruk4u< zm?BxZsvC|3zpVjz0fmLBZ3cGw)``p$?B)K6hNie0Jfx0o$)BVtilEg5d`C?dr%q|jn(&yN%!YzsluZ_t5H*EA@7CA@ znRFbdSnp4uC4_O}6P79TcDr;C>Cz`c7pzzIap>)wHEPbm+`fbor?7Ziu4I_Lw6{Ph zHMI)>$4I@YGzCe(hfHGK=0*~7eIYJVYO)KG(p|%(^v;F*S}ZJb�r#(Hvd zunX0!!wi1-X#<;f7rNjc7~#FUHez|unHACOJY9_%T4gx(J{7}3UPBBAs!`2RlPi70 z97_>Li$4`338%ElY`Crh=SgWJDu+fRri*tX#RAc~>0)G2Vq|VM$6{HZOGOFW87xCA z)m~$%UY{Wjt2`i7fY8))*iUZ8AXHo|-$AQqu;)zYV)JLRP{9<(ImQr6y=Mw;xP~zX zEsYu%GMVR!$^6%%ASxP}JlxrYe)dzssAP_&eMTjZ zFs*c_q_2AhP^)ptf&3=rCsP1L1soNn*Pp(THv0w{mysr^+ML#^7U`Xi3v%(*_YV-b{hUA>+Df- z6;<0?frfm1h@`KWjV^zQG0&ohUqZb*j-uuZqmn-r&p#Q6h==*JVQfVc@687*Xs0Ff zS*ItPXn?O1zY^P*2kZF0Fe-o|n{D@{VPCP105OQ>^|~5Fd%t4QnABi8){g?o`)f82 z2hOsuSu;dco%tH7-ECz3hM|@>C5^fkTm#H=nq;)OrDq6V&^ACxg0ZCw z-!e}W)X;-(ji>}ny&xh`ILHq+1=5-&ESd(k+~V$n#Q)Y@l-rqfC7inM>A>L}vWW4d z9#NPU+7sa2v+dYrJ`&%hVkCJ>#YnC!6~djr#+}=i3E^(&`5FE+sdsu!U0=h8 zF?yL8M$i+((9RnELPn8L9|&H(hL=TGpK$sbN`02P2BP#*iZhiLu~>6Sq+Fef`&t7i zte6Q6XHqeXGeUR}2S7u*)efMYtC%N^DrQ{$7H&w}TsDG^@;?{O5aw4y{ieH0KGoi$ zDY7hD&U>zYyHu>(TS}HwgXOHd#ZaP6T@EACbvn5mYLV;o!V3JP)20=yHrzult$)k2AuRgOg{MS{C(xXCw{Msyd^s3 z<=e%%|nkxpy*7+AMHl4xw+aDK;cunTMxHxu|de~XEX;xH0M)%rM2<@~p zi_16(8#0NcJ+A(A*$#~)k2Mf7VTWg4iF4CbCmfObtY+2CpGk0$l!w7XZ4kxQLfhzKvz{-#MNXvmLnhe{{#)==#HD9&1Ez9x++ zeXZd3Ga9>~YQtKg3Ou@&anIJgn$7&F)jHvC;l{l&Lul+e#%rOMjr0komFrj&nAC=5 zUu;cByEU-b6V@{i3I0-rA14QstzD5z!G@3;l9emn<+U!3UC$+;iXSpZ|Mo>Ahf>W(Mx5*F;{Fknzhz~o?Bs(k8A`xf5u77F*Wi|~#>oZ+B&csUn!NHx>g z5+<9!a^i-@2PVj7B`jPAJCZi^JLBS_)%qb@AR4o_vwG0QerH_UIIP3QLj1=)stYN` z9(B{yAO$5?;w3YEQ_7n0-C14=ISIc38(F*of~Pn!bTX0OO9x?;iu4a?`R zdN28LL@qRQy?bW!yCF`z#-TJ|NG>W+vhNU=>w6{^p6LFkxzw!}CLVGc4qB-+|1_9n zRB(1dso>6UB}o2M)b$WjyZ^QO&LFbJOkL zsj!PzXwC85n>IH$_r8-BfqG*Xj~Hnwac(y^prz!8-;2BQx3QY0YmlMuItNhs?|u#3 z^yD7a)PkfyNeVXeBnt(_&+!1W^c~ENmTqHKpT)%{@MleUEROtDF#^t;gASB$V`1iN z$iPq02`F$dxKXn@)Ox!h9a9%StF^>KUxI1FP8RCD<1>q3A$hsxEuT^0c9tMrqq6P7 zizQ-*AWXf(8j5a1O}BT^z#S}!x9_I4KX5;*M@M%E0XWHeHXs75sW%2SZ@)HBn7w$| zn?HVL?>Ez~{VdE&J}WcR zvw^^pnlGEqGiVb)QB<-D1Q{*Yu1Lg zmgx$Diux$BbFqwh_)H;fMzCMxX=J7iXE7C;_05=ygx`g(B#0`%8Z)=@t8sI+udEu2 zr+?)Pxj{_C(F82@r7L2oZM#_p)^X@=F}Le>>thM4oLlcx<=Qa#+?JQq)C(+@n(xs@ z0mnH$wR0<2y~iBq%Jwx0q;L1I<{VoS%i-`g>LRP>7UekIN3UoSP_TVl4HRQ6T9$97 z5qsGirfIur^r9x!;8i8Iq6CZjg$L!;Ke8m>7g4sv*h%TwYdFEOb_LTEt`iD*~)4@Hl z=WpO172n2H{j4adSum+Pfz~O1ijC!4hO`E`fID#CxxY2A`<&=JP!nIOj@JY+-Pj_H zKn~|w&+5&5QvSDQCX{PqXnWxCF=QSPW2pFbn`3Vu*SA#F8NiO>dpl5*!XJkMMaTG_ zXmwER3FPzPSk&v_6BBOLU|n`lOt>%E@&^Rc+RNBEr}y}BI%ncL=j3XOMOLMSs=#(yf_ed2;Di&9P{JYlid30T0lcJa_?1k#Jb3$pR}8 z;m+B=A;OKb+FEGl@W&eq(i#(c$|0j+?>Z2x@W9{Nn{z-%tRs&vO3D#IC}45nScw`t z@)rlR73Bwuo3@#zAE2D0EId%F>hL%)&>Qj%{_a(bto~7fWLKIt3kaH4romA4d>UWI z+j$H_ryLdiM~MEZZep_t@-An=RgpNMT;R?7Hqv3R*Oi8=GV; zkc|t$x=U`=!(zO?q*aHXdsdr9O*{EGSO_u~bn>_WOBXCF!4iU{0PE6mHlQjneNKo8 ztfNgJ-`W8m{rR^&`G|JxXAyxyVtkB}nYh89_dKY~uO6kH6sTEGYYddkLT{a9wIACZ z^|kjmoD{pO0WG`Ax|?PPQlGxLwQ0lK&pXqPd*PYCaJS%FYOMa}w0hw`pw&}gM{OY6@9r>cDX?}@Y6yZ?#k=ynOYvbCqvZ_&_C7oDCY0vj$m2_m2o@XA)` zNdg`;`D^DV&l{9W{xAu2&@-Ciwe{zKvTt01}8Q@(Yyt=h#7fsQCpZQ^!(06BrXCy z&%XpJTNM!4Pk1AO>GIy~$2IfTDtPz7C7j-s@6)nNf(ndIyAeP>mw^OV<~TWM`L#Jz z_cDuntoNqL!cOl{g39!VGz59#5E&0wbXw;P_ z`hJp+vLUVblaxkO)DbDqcmYVksaA4^>#mv{oT2@yNpOY^@>@A8Cg|G4EaEKSLq7ORuCHPZ0B)(RxSt3#Oh@C8@I7?`j7P=HGF zdEjN<7Hhw79pzaBtnWcu)jRPv^2zA^jJnP0M4=z3$hb?9qaV#Up!GwWZ?g>Z0VjwL zN&SN0vv7xP;)Z1XSQLT|!ApeOkf=bOCvoRn4?XA!l`V`*MDH7y z$ST7x$^RZpG;O|3?eDQT^B<8gFBGr51qX+FY&gLy`$=uS>7fRU=Ohwwb~MKg{0Us-4$LW zU9V(X<$bMi5r3c870dg<qhjO!Ay4w{c0>bA|yRfK1sD4L$J*w1_B&x+Nu<#-fN z+dcD;!c#`XOG=bw^O{(ZJ35WuoL*%UPISX0CAC&JV2-Y~MWHh1XeYf7y)>!3a$20o zFnxx9x#^Oh+zg&n-XkI2D;#Mg`RO%Vw}(X z7-apN1~@Cv0H8$f4vT&2tSsb^B+)UcVStz9WfFtu3ZUJ>4cVumpcYz(n1_PG7rfvI zu**ep4le-|9NP_xjZo=ouw^2{qf$${Vh^<_D|wK5=7pfG($CcPPoJJHo0gYVv+kta zi$QIurMr@hkk!HN$}U)?QapeyUr^FPpO5YSp2}j5(j{I>JQ5MfmuvfnII!5L;iE4t z^$JkxLW5K|;+TI^19L^qBW?MO1of+VEp-hQG&I%~iSSr@nfk0a7Hk$inJ9h~P9A|u zq=Chh7%0%V?23B;O$$^!9Js9dRKewuKH{z4_%j1#ukf3lKLqj3KsiB5bfdQoQe&h+ z08D>}xw7V)0O>WW!t)ChS{1ITI@V+l*1)QGAQtA3RjFs*>r6&@w$JGVg%Xyuoz+Yd%MMB$#Bp&`l?dr!arJv02^Vvwk;`~Q_0wqu5qBm~=) z-M0kVb3zpq|MEVXOe$R8EYSXZtkOg>-T$2?#wqb!3%W8+xqwja!Wzno zu|?S>Qb3byDy~{{88muQzCSIgsrZ4il+;v0^lt1&YAV_P ziCleM+aOof=~`{&`^RY(;*XV7K1aJYcMfsUiFC9}RQMC~g7}fD^D?yM>9*9To>FM~ z4AHqUNT>Dz)rqBPU3NvF%ATgI<&_?z7r2JN!y10#$1MKPA;+6Mc@Jg=-n)9>1(wUgGw)*@i*=M9r))TNM6!ui>vU6FhMJo`Tg_$l-5AW zaZfkARgnjD-W8bpv$}b?IgH>`(Ewx#`3@44SR8|i2{_1pr7G=0u5SR+5PHRCh-ZxQ@3}E-S&byrFU!8)jOv(i^W_NfvN;G*ZI(G9X)Iq*XwvpO^^8vJ?zi z94>_>$xohMddLe$#Y}_gM6C_Z3*a~`L2Hc^o-klzBjp{~&@$Uh@u$?r3ZmW%<}Gr9 z79DE)RHDX8XHQ4U1bmMJGX$}-rX~Pz487Duc@zE?e>73z0QEioFqK|xs_=p7$&Ebt zz^c>dO_deWPn6nBVPN9*V2euLL=#Q8W6y?W%G)l-dAxb~`b*+?cm;>L|N)9;sH(D#b&1<3jAhnHBn;y1Sn6$y3 z)kgVDGOaA6%WakRo>~rozI=5rP)dptg*&;@a%@( zU6q%C8*g+~CJ5Ykkm|sVc)0WdH`3Cu%Qo5vrvW9g>ILay0xqU2MOgK@8DMy^>gzL< z2yBi+8A@}kc2K7Bfrdxh3#419kU@(xl}5moW0}f(n9>)YS0a(dclh(z30LW>=aqfV zSexGwF%4XJeClc#RC`;urwnmV)%ijV1U^KMz2c!*ekyx}{rB7pN*!#xp)V-y5SYCW zd5!p%+4h3M>r~u*L8;&pu}xBg$ccep%%gOsG{)Y-C&$|d(Hy44J7aGiLi`q&H4ihT zm-CDpX6qJ8Q9w4LL<2<&c;--tI9yWYCMF{>qHfJGbk-v ziGs91gR_-DLtHosTlTleBM))G>r~}HTsxtRL9Ec%_ zp5Zr!Bx>y`Ug*^m&kXK;9KV?~-6m=oE$s>Vh^kcl*}iM=iUmhsvzPd2ST7~E$=k?F zq#aIGX5=ZuGdZMD0qXW%3a@E&OaImgrf@}IuplfFY8plN23H@Jq zbJzOSg~Og^eBv2zM!v$Ou!77O3AAR(D?$ug^NLUboPLEf%LQ^kO^l)Ct3v)lYA-XA zxTGw@Ks7@UHxL9+USA|*7_rPR*Dm*0-ZOzA*tHrd9LfeN-0vprHF4saD0;$Rf9moY zc6nOCv9A))<@wi?Z_GdQiA+js9!QJ+rL=d`glZ>nZN4Fy{^apG82>>ezjP#+T;IT{ zyySIdI=EGNkdgrj`_nC2ZH*bcLM3ks z!Nj_%A4(7mH@Tt^MG&IfoG#b4&m5-wA^3RiZvElg$^q}M)@hddc+iJ$*3rOsl)S+1 z5D<(E3>urwSJ(QkQVMcxq9Gknvi9t|inpnI`+|g*8c3lc&!?02hkEZRJTb*H?eahP!%HmQ)JWHJS@f(*+4Ew2U9v5BBIspK_D;m&_0C9W_*O;UK07I;*Y`UbhV zX_4&K-gL~pRWNye-N+UB@JoxQ_NJ7M(Po->w}%%!J6V~-b5E7#E0M7p-#HnfzPcKA zeC6dB?UHWoO|FF#R8DIJ>hcNp*$F!TiL#rwQ8GmdGun_U+o-%mRx94J{oxelb4hjbcRJ1=ig;HmMW>?VYSxRlwU5QGA8v4_QS&A3Em#5_Lj?4Z`4$_-D$8q%a-{0 z)5Ez)&K11&uTUCvwY?YB%2z)7zg!168g<`dCYgZ$dGs+UpZ-r4gRmGK?DIZ@)cF5+ zMPC2^>0;Qi7(+w~wjuMBfD{dV7Q+Ww$E1aomtR$0&f}N7e1l-NTtprckSdgV-ZT%# z+bpV>r|`^vqn9H+SX!Y_W}|3EfPHEq-~H(Ya-&*6nT20Mi;^x#0R_!h!kP=)hz(|? zcx2nq?IK1pICO7ZqI=^~uLDj4=POyJ$sSZXA3E|1DxEYr7^x-@I)hykJ!^ajQY}5- z3SKwn0Q-wyDI++||MP35hcu6t)d)t4-`z>|$gOuBPinV2$&dEe2!7eL1X;sOfhei* zA#&Cq{o~VUN^IvJNRt*R1t_*u_d8`gvbe4MPMM9L%*BcdUVhPHWi0Lzmq62YkVY+m zEPaC(EP;k^F8#SgX=S<;OTkN(XQZRleJSK+q_tfN9(@@dUJ7YuEIs5u#T2y+-`}7? z%fP-B(ehXPEc?5|O%o*F0MYg0#(GIFerWz|JaC>ihBj;Qq?{ zL*jej{4OG>JXBnRos6(4wr_FfM21P3u3 zb$;tZzAc;VOmmkj@lOPL?_RDX*2pmu9cy6_7{BfyhVg4*-eyz=Ks#de0J>%^1JvsP z)vy=ASkCQOmMWD2C}H!KU@DJlC_4A$;0Fs&&g+$6A6)^tbR+q!#DXf6xiVf%O=(f& z%d~VQB(OD9y2A->VBMVFq?Be(?v8S4hTRQ@Cm|5YE8RnA^#aAJJHC2pY$&hQ%?)n8 zN0a@XxZqT}{#F0STws&x->*XXmp5T5t z4<2f=4$)ILLYJ(u=h!_KeB`^hUm%?9l09LM&=WmYkp~_FhMRaWxdu<{%yV-k$^Glo zU^`9$=p_?h;zo(QZ^0F#eC`R?H;`x(?o}sODtZ5Q{L5}Mg?92t^8elV-4b5%C*^yn z8-*8e08RZKQo+nTn;eX>6@D+oh5z@5SX!Q}4>5;|`d{#%^QL*;l>4RG+unFJq;V)L z3fF*v7(?}cfc7no@?P=?p~*ieH84$u^J@p#5ADqP7DavRL)Iy8NyxtJL_?pC4z@p9 zuXHux{eNdBTeGoJ?`-+$Nxic@ZxaqmoX*u~%8M{v-S}ClWjc+R%V%naP?KNKds@M~ zZZVJx-~2@xD4n(+`9%qm%)bWU1K+Soji}ycg@^O&a-kuCn)LidJe=P|d%xRjqhXsd z( z>?i!DTz5h$d&=Fa1UT{J^|V#_M4D%>u?;e|X`M8)*bO9kyHeNbOr%_pdB;Zz3$Ewj zgW_-nthDh5i|G7zCAQ$lmt&C#C1i)<>$0BLErUU&ySu-eCX+f@cT<-gN=?&4XG)sc z&Y#BZP+EaX|FlC0(w3bH&tGjRDBXkn)%KTmD!!7(jN?2}C=Mi)ff>0=vH59dXw@?c zm6(!4X!9;51)*>}`mAu?V4&jbgF~rBnbHTD-|eFhRv#ph$8N<>x?qpot#oq&Tl~f! z*!JiUN7$jx{`A>CWw3~)Gf~;=p2&8(9}3uYl)qnCYMrR`7$Cm1UqStJ``kZa4aHpl zdI0#=YPc|;k9pVy9p5#K>{R5_2kkIID(uB;sA>qdL}F=Z{! zrR#YTD!J~o?j$H-8XY;Q@G^AWPbo|A#Q{IHJ~ckAyn^dN{%UnSUM|4qV%=dcJq?k? z$iZaQ)b3hf1vEOYG|5Y~jS@~C2x-tgn>42kC~N;y7?|PLA==6`>|2$tAv|&cMxl69 zWtuB3qM|aS!Cg0f(abYS9d}+(reMEGK3BWo%E1sEYLSzhy3(mLN<&d==3;IBSHvB< z8)4$el6aP|2rL_&MbjEVR39ow-Xz2d)wc{l2L0qT?Dn@)05s86^7q0a@y--r8;j>6Wuy)RG>#mnDb z08{WL?YRKT2J^s05LeV@xhS^Im5Wf~q*9Gb3eVj9{Usz9=Urt4o* z&=m-N`0aW{`Pg&8cdqhDlYDS5W{!?tQFvw*y*`1l%9sNYZ8pXUSLHkDyPHZJJy)T4 z^XNt-Pra#xyG8TEOhku{s8Gfr*foaxQlOCMLnXzHJ7(Y@g*e^ksxSzBa8+nnYf$Uk zN^`n+RpFjxs48$ zt?QV8jZ}IavKxY$gz-S+Yt}<^Fp>4?eMz-3;eY`wZs0Jr{`X);SEQ8VL({QXPjsYP zY4Lp13YvC95g~lv-cVY&@cBHrm(Jc$-V}5Dmoc~fZ;H81*7|&URCP4HFr#Q%i97aM%`9;0BlQo z|C%DZwGw~krm?g;LR~ZMj+oOn+MFJ`qqGxnpEuyHcNa?TVF)x+!aL~6pG=Njaa)s2 zTv5e9v>PV&MX9bjtujbG9Tfi(8)M~NB_@I^jEyWru6(CfEqkwT7N2`Uo!j#s3Y7o{ zMT#+0qoO|dlmMD@PjRyp9=FN0u_>0|70WSfCkZ!u?49!In-gr2uh zl(QO5bM7l1$#0{+&lAhS!<{t0BrhYC6)#U=I4gM-TjOn)6Km-|p@3R4CwCVc<6@7DgpQQ_f3WeonZrguL8k(}rwH(-zxopV!r^GesZwFSv>S2JPtTkftV8eE3gy(-v{K|UU8y>5LS1t5%} z{uk~-s}5lh<_C`DGF$|JH&Z;+5FWO<&_iwIU>_dVrb`~`aGV?iJk@k~`?$-asn{3$ zwaioPiQ=sZUK;KTo83o35pCf9I4^-jMa>6ad4|Ik}iOy=(GW6V^%3zqDwR`oORfRlXHXz+kbeAN-)XX^T? zOEFmRfSeZq`&UESVV~izHkaagvme!QuuYR3kUfQOiXgv0H687}6sYoab)Qg!Cf9@L zLZF&~zFG&Vyd2HuAhqpt|CV=}CI)4Tv4w+qn&#+C-&+Qut-?KpxaVn~gu@?jaIjk4 zbYWQ~8&%zM=QynPp!b`DRTY~lIt2SiXP>AOzcE;*p&@ELuuOA9)K7rv^+K`tQfYXo z+8#e8p+MeLx)rKECzVi}>S{c&_0{U?FPNFy9II|0!PrbDp2~7l# zc4!~T(Q5n15_frlKFhwEdc{>vkPoG~iMr{fHU=fXu#U6M!MoqwMER0dd z;U^&$OP)%jVpT4XE!AE*7>oS%sWOxf-=ffKK%Dv#s*t}Er>4N9xjIgbFwTw8p&pA6tBJ&eg?I( zY(5AoKzdfLKy#H#I9QMuQ2cgOZFQQIX1CT+|ENkP9@P_M;4XsG^adgM%XlhIHrr6#K_ zz=Jne|y2Rja0N@Z`WA8$JL_dns(oY6a1-Pidu~M2$t2YoRXAN@v~}kih4$M z!_?J&MqMqa$Z-mj)iE^iS@l^^k)_Y_rL$juR-GdWzG;e+yqU|%G^f2R;BNiq2|7_j6(rgq*kS zIdvRfIIq7DPwTs=tpYAMUXU+1KK1UZHl(8+#1PJQ5Tw}FQ5}k5e%evpiUIWMq$2A* z<#$qh2>7QP@IUM%;J>Cf75g;!zul|B-@mhf|J}}NjK=%iD3CTqLx->=O|4CbJB#lB z>MXFleiuReR(27z&)ii!?A%p=HoB|&K6c52t||kU{6ebQK){3vm1lCr`_xn&$}bEk zZ>0(-bM;(cF;9c?fPgX?6Ff9cOz?~}l?(OdX`=6%=>ni7=>nh!>EhwD83Lf;831S> z-ONz?iN&7?1t!S&uuL_q+4Tq93?Ad#5~;$#B0exug&{ldgUY;IF7h_VofYq`eL%lv zs*PaiyPqj~dgghM8=POyt9_88ap&`(NtYriryHmhmv;Hs3;5V)b<@W_-x#~;1u^#N z`q-nNHuf2Nv=#c-3u1*nctK1+!3!!E|MMw>VKfgqt2Nz8i}B`SPEwYbkkwggI$ru* zdnuBMlPis>P4Mswn%zwerFl%PiAbGanc7ME$nLA)j2A#JGC+J;6(APqAljY=;;G#l zh}%^G;$fA8n4c{m{E~{h>ktOacR(o5H-=1!>FS&0(_J7~Xm#NqJQ@tT1q*2!#^>c3D&Jie9ua7!d ztjmwaXczPmqg|ta9Qm}-{=A1S_EGt^iGE37O}m%Gwwd;lX!MVl1eWxCS!|mnFN=rQ zUKX=mr>{By{uwj+sw=RaJNAQ!GKgmNQ^#Xh$G)PD@G&sEl-sC&6$1;TpI=ey8{Cc8 zW-$$hWDxbLU?H~X@P_N~{udeMw<>L9%D+{9>^N#@?yDLLvHI1@gXQk4>U*C2kSTG| zn0Ff0U#$@{42eHAx!UOdFz+5k}xslHGzH4NyHmjywiJpiHIsfr23C3=|Xk%|J2B^SC+~eLxz6nQu^EKV4SoY-d5{Mcj^4wY80yFdAx%$&!YHuz$?$9MenFzah@aN-6}lC zUsV<{gT8rJ@Em9Kl?eG~h;X(_8=3Oi%8wn0@Hd|0oc0NLj<)YrqQ>a=)cyiBb{ME} z<2|vHF6wOtKe3Z?`7wWf1+^S5cGBSCYHe)K&xd1G)5-R}nu9qX{k~ZEx$ldG|KokJ z#^E2RWAL}a4}>sv`2&^vquip34?rh6jlkrk(tr_aE|%`x2sH>xXO~8)^Et2gb*}oo z`CsyV6ID#A7ZB*>#|H_{^??`>uL}OaL{bq_OwJyy&cKIBAF6Mf%ohUXM+KvuL!=-V zGaRLKU9VTJ7GIVV~7V6SHefF`yf=PNK&?^cEAU6tTZzb35AN_`oe5@urgEUNrA#_{E>XbMh zJ3ozDjTcm5iW3imMRMb=L9J>{70|&0EmfYXx9aVP)tsjNkw?eK6V#@_j6C?50W+pf zfartZkqPP;Fo@Ij4}FjuYG8GGWg>)+RGKnT;L=R(i!&3|C>$>NPBhA=bs*U$smWZ7 z$eP5(2>Uye)E6Z&)D^~1k4zRro%P>`8cr#nsKGct)KA3u@%|^`OrPTbHO_smW0d4E zMIijNDJri{JI@Kun z(}euqe46@foTe@WjM+-r&py%?)jr+YI5>*PFByxwId zKUiqmOfcStJiW3Gn9r><)df;My_v7Jk*3n}e6@t%Ap(Zqk-EnDVx+v@Nh`&X@$y!Y z?2#+@{5FV*){k*a=mw{PbxVV#$Wf4_#hEZOwFIIwgWl+#fkE+^hY+= z*_f~*8ZcXZi4S@+c5>Fx09xucyK>N5szAtT)fOk3b_OPuC11Ybj)DJX4E#48_J3G* zXKR&aGv%$7AOHJ-Z~Obef1Xoi;5$j0tJZej9WC#8+CX+z>5&g)XO)3~^6oMQva1r7 ze?oc7sx+G^msNi37zjxP8s!Zus6u&n+j9z3XYM)jN};+Oh#LB(x(O?FsvL~`J+hrFeuEhIGDLZ+KMEtqnCDw z^g2=nvJ6UJBu=}dI)MLB!BJkNjZC?`^5e?U?O3FZ?#v>bc89N`TG2kL^PPIg{9z<4 z9vO>4$s-qQ^44OpF=s4RRS>#ml~F0Ypp`;dd5wm&ObVbyjoJknM|A!w)nep~^jalm?uI^i z|9{3O+(=Oq+OG1)hEH=U zF10Qy`GWDf*BchEv{dCG^tVa{{~L;i(j|S#9Y!X#V5}P0nVVyx*e`#1{znpshg#KEH%X zt_iO4Y^?(i>mz3nqS<;MW^UOwGBV83Uf~%B_iP3qw1G@ppwsMaPuQX+nJ~mYTh$?^ z;}WHIaSNt%Th(C*9PPbLea>`HDmYdj0p%{-p>(o|+P9VunqMgttfH_|xA^rAFl^3imyaZQH+b)=Qzo55vsUyr^M8c2%-Cb%tMV7%* z^d8MFgJ_;kPQPQ;E2zcqn25Wi{0_BG9b4>f35YhK)5DniA z!_2Hm@;&1eNZ;*-J!lr)-wi@Hiuc+lpB^}T5DDB=?6v0`&|H;d*viKv65in_tL6|ofX zs;W2_)ERNMW(y73*28S?_ov!fLaz3r1L`ZLjZQc<+xk=8gX#;WU(V3zgQ~x2{Ta$X z2utQBI(tx!gXz!vklNKW{yXY%NDbG0)$dn2@!zhzyskU(e{l$c&UX6okQ!~eQb#YdXXsj87-fu0NL$7w_8GsVI)}j>EupT5VTD~xqYkSddF=F&^{RlVRpgu< zMfHxrGMP>jkErcT6_K>-h`JHC(~m+@JwO|df-g;{cIE1K2=BR4j_vUUr5wX-A{zM^ zhL>vhI}T;LWU>dG0Bgu2HZxAEwP?~w)f{UrqZ%=Q1hE8=R6qv z=V|SEwY~T56|Rs2gD03u;aHDZBE@?iH~J|GuC$@aA0MmRj<*DZ+J|CR|YK zIscU(Y|Wt`E~sH1>q#Mg1%B{f7}$CAoLUt4*( zy7Ce_eX)*Cm%-I9q1u<#bo2E{p84hDY()NCRt4KtJn!2`PvL-MXpDATR_h?My6#b= z8R-6tOP!l6YN%-~WEw@(@TueYd4jQYlash#4);>(b46_-*vS=Z%`oGCbp?c{jLNP+ z>MtYb3e}FeURR;+#?g^?ReiyE5T*zL(ud~z(}Sz(JJARzZ|0!pTt;z|HCH1ixUWod zlABZUk7>w{b4~qRpaja9EyK6j*VWaaM}9X{8RP>+%-mA_X}}HGu@2Jw8#n>h(VsVf z`K!qDCLW%q=WfD~m_{Gp#B9!_B{y+YUZtxyA)lpE;4LU8c2nD1YE$PA;a-oB;YDAd zWZEs&6DTt0mfE2SU;cZJ<;NI))g1$nD#%qUH3!Hy3;zT7+Hdg0E1OXyXXmm2YH(YP z4VXJ6TFVGL^}3B`p{yp)KTZ8^gD4eI;ce)=AFhVW4xIYICX4TcUwg%EHHaI#wpJ@B zL`e*U>D+-?^ZRpeib?N?HVA~hueh*5LRGM@Tlo=}j zd+Ie<*MEnZ%qM`(-B&*|$_wH3ZQ{6MYaeC@2ebs~8_1kv3@ zJs*N_AD|fzMW1{Q)DVwW{K6J|dh7a>3hPf<0 zh^%+Xg*utD>zTih5X0E|xl z={VcZV||+;iR&YmY;KcIuw-|#AQlRt67Z9bMk4kF$J^AX?IvH+Ruk%KTUl}bLN0Q&*gY;VaKJNFt|zrQTd#RZu~cdaNW zo>N$Q}-@3;+667 z-*>c@gv$+q$@-Q?)?6oE4AzzQx@T*m;`D`Pm_vL$vN_QvkL*j>P~$waWvE+S<$F5F zX+GJZ+}=F+M)f-NwZkfo=V7|Qm7(#tiW?a1#rwxbxi31idBHAJ&6-Euys}@#cKp#R zn{US>UfGk-&p_|&@ut%fl9C~~bBK8~JT(&hfKEHrvf{2i1O}+Yvp;x>E@ym%waZET!;8c!Z|}W;X=&no9G&9vwgv0tGs*3CvDGU7;r1XhB$W%WrxbOS(q|(h93!Ga=uA{>uOipaHU;EGK9;K>`W3B4odV3bqfdS zXiba5Wp;`=87?=B1Ux|jTb~i)_x7dR%{s2R#mVcC@{T0R1pcFfj9LPv#gw?Bhzxb?|<4W&dM; znq3k|kwjsoWai7B8-8$m@7CBhJ#Qvg@qUDD4Zz+EV@M1qGYxs ze;I{I+(rwd?dX$yRm`^kP)Do1E_^S^UmX+fn zMpdO87NsL)IDO(rqsqz7?DQXfF)7^XM+eI%$n8hc<`{2seuyW>v*l!eer(%ON?N=k zm>=z4m6OB8eQuOjGTEQ1m6!co=gzY4%QxmwyYg~n<3bU~(0t!nA<+66=jO<^Wk-Nu z+~{ds2P`ww+99>Pr357>l<=@Mt^kUKgLrcvSvjS{Gq81aKS zAD5DN+8RSMMDgi=~T(#=w{uEwWz9TMh zqaFntyeXuL+|F|k)XIG#;X%1#q(K6#rbNr719dx1CO9@W-~@uxwEe7apzbkp1>JR# z6oX6l<0^7AJ5C#!nr}6^25D7gC-EsL?TQ&bG`yyM5xT^dKYx~Kjaj=IO z{qNhZ?uypzz9sCf=@!9QYldnZb81xM>-$YLzP<~p$unResZ4b_LHx;wg!RAp(#-0} zkxKd1<#>jF))>IdFVr!HL&@A2Ia-`&pc6Y6_|w%GP>ZJ|^?{COSPhxo;1U|btXlmV z@&;_ZM%){!1|RdYnQF>)!N?@3mi#%Za&;}7Dt@8MwRn|5wRy){)#e?WRhxG#tG1kj z8^pkm0F)>>uZ~>b&`m1IS)h)kI70QILTeUmFD{BQl6zfwJ4pYJb$Qc%Fq$8I@!T;(&0kLug$1@kg(XT>k5i6H9 zZM^LR?clHR6V@FwV&xFmb0^sWo#~*~pzIhAepFkSa^n2EgOipwR(JN6hiwX`SZxFz(Y4F63HM%2?&@m~IIvDU_t7 zyP+O7O~PppOAQx1l+g0Fx9wO%*a@ZVouJOGX_U_Bzerkubz0Vn zQm05QkhSQ}sGLyN4jB=+^-qfxQsOuh@-iFV~t2S6|yxg~ytFk_JXbWVz zKq+nIDHwTB0*?0=s8a$CEAhZLFJTNU?Ip;}?&-w@Y+KzZIrY3hZ5aL3(V4q+#;`-F z$CtRvwfRJ@=+5rkb)?yaK^)?yd?Htf>RY5CWLMgClB^8j;KMYCfDvq{b4(-CHn2$UXBrVQG@m}lS<7&%)ARqAuwasV|alN zd32DYFoH60S28ew+9HM#WCpH-r?d{h=HryrLEcsJM;E9O!PORRfF%4P8{GWp*So)D=N#R)>8jcx*lw&OA z(P?zV5+t2r5x7v0oDgC5ZKUtFnJppGj4k+iWq}udo?$=X*=MWS;wNQnMMRViA(NkU zpGAz)&pa|^8!XP2lCltB!@V)z%ikAyL)TO74Y77|dBon%a$;XJdqd-R z%-+yi-c@@;Q+Q-R9YHSj1U6z$159#4Ii4btmsc#8KL?2z9&epn=0GG^B#x z3`Q#GQ^SR#zTo>(X6(&aJoGhTe#U-=>f7E?A?X9omd7n;*0(;TDQl&_2X*Nr*ENrI z$BET}V%NS*{Mok3qsi>Dyl3Fij?_;%<>14t?V13`KQk#^`|^%7P}osfw)O zh}cDuTk;Z)TrOKE_LI9#h6CzBKr&q-ta}4FqGlz{Qbfyv{69 zrXtg2KFHu-VE-+5gh-f6sKuO7Sz$$#F`n-HnMaof$o<9R0(o_P?oWG1E6&tspzPwo zbKA4soJ`k7D^2OAf$}hxwMUske@gcG!AM;P;ka>!Mh%h!&2wMnVUwhY0cMG+PJ3>l z2ZQ9q;+h8xmVG>VrG{F(?Yuwos9?0x#Prr#a34d_Wj*Rr!Icv=DLEw6kt&UCTr%~~ z(yr9452m1izUm{V8PhNf8aN$q&7pm9I7_3eedQ$xM)ku@BaNi~@&W{x`pXy7=TwRi zs?lS2*ILx}7?7a(Fqu8;PalHI$Xd!9CbzKp50!_plikc=EX{_r<3gA|Nt{1dG)Z}x zx}Khc>uEfWJ3>Q!IL>)~plQQ>$Bc=Zih$4hF|^>DiKEiSR}m8BhkR`+mOGG&~P zu*{{;hs##8O^7f;OMT$ii*ZC4jvduNhlcYN^&KIXGyRemfSl6pLLcfh0*oS??TZm| z2|?WF!j`5peLM!7k&N`r%4Oj(@aZUc(;X1t7EE#3N-d+4rDy>k^;P`!X%^~myZ&2$ z)u)+Gjg*gK6VIQAW!^eUZZBrT>s@qvcqtf-ZT;nGYBw6U&OJ10G^Z5#&tN*_`_Zx| z_V4VyaOhSrTK=3m4N%I3=AIHQbA@uELoEZGZfl6cXEldgwRAPk}T2IZV z$m}t~G?iTu!5*9@M=yL>O)4+;*0#h@btNNW5&~;IsLtXY^MC_IM(f>H`C?D zVnGfyo*`R}X>O7?<(*D079&VcsUISQQPvE(*ni^g8FKkCpGm&|tJ&sWkBVL*{ECbI zYp=mMv};8%n>># zSzg5`Xe4FLmP2VuiaZSlnZ0Lonz>;%kJX+d&tQ4Vuspq~`dr+}&QjaCxRWfVeskqB zfZ|5;aLE7^cT2^k84QP1T&xP{a;jWWoO+8~NFEPdoJn#Xf^PHWGz72b%ee^lE|3?o z+M}tepW-vGwNjQAER@~E3#Vz-LUeTsm|?ivgQvycvUK~rd|uj8N~F z7lV|7qwv#WImCFz2MXgcZ0x%l z5~SGTqW?M)6H5ZCxX2(dLj;qK2s!qL1CJmp4d1lPm6nVpM{09HcJj6>*PA#(Fm1LC zKa)9KZsGbpQ~9%6J)|@9NKFUldm+t8m&&f2Ix6lR1ZBlBA2EunK%!gCCgF{cXOA5n*>ByCMPpUJ4Uor zu0+?D@jS81!4X(Y-ImL>ih!(yt|M>fkYl4b=|Cwi%i+K{$;B0~E_u9**eHtB<^SQU zi>^yw1bX@QF8|wCmm=6Z#hcPem!QA8e7?f|>cX~>A1QMM4jQd(pRdII9|$;k6^@k! zbY_(tB~H3Uf31>}8Ro5)&#|GOrN0wR9O<;-Yy`|XKulEKAV;`9d1!&(`*z4) zKtfy1hZb$XhTo2U#z)8H4=mi`)te32{o7H(Mx>?Pws0E^-)@wvzy$BDzjwz}EJ^xa z$KHvOdQ@~cN10FB`P1`_GPkX;2~-ZY6*gg7hf=Fea%Dafck!4oXn7bd*@S0`Hc*qd z!?b4>XQ9YhC>2k`vgAg1#K3!@^t3DX!7Nb2MeuqqcR(;O8}FalbdbfeDP%L46xlRn zv#f%MwXc@bOjHx87$0H=w{p-LGV zXOr82Qvz8ps<&0vJd*fZ4?5sxb+u$u+>YY5LTU95*&PjT-@zNau|uxOrwOlV37cf^ z#zqOgH|v5aw&jH%TyjO4YC6 zw;RvL?Pxo)6w6g#MdUpkNly2y8HDS4_#U|?vUc3_9+HgSBQtZ=Cs^9cwN~zW>30^n z^GBFu1-^yt#glkD8n747i^C{muk2IoEV&3(pk~D^P#oQh>LEb6kE2G|K8_l3`*68w zP5t-D6MztDLh8XZSoCv$7Dp{}IEi0uA3LN(?Nd{%q#jR$a=^uh-gl17BsA~m;Qch7 z2It}e#3c1(rYP^YpI_2i?Z>Td5#8G_k3{h05At0`&{k3QLAfMZj>|4I=YSkbBQDAo z4_(_F>^0_%;VfPIQ6A4SulX=D+aVqwz#z_2iG%VYpu@(4aw>w456Rym*mp=Cik+dx zVL6?Z&Z4_V+Qoi+SD3A?{`6ZfPk;LDm?!H7RI<<0{5(06jqeb(K2KvHn^QiXucaxfQ{@tX`I?pHds(oIHRO0^2q4e4Z zlX~r4;dhhjaY3KdvKQV>YT^ZbQm>Qsl0K=SfR_aq`Fw_6;`6!o5}(gwm-tDb%VnPU z>t#NLE?4jl(%RPVifn+J2^w^jZxUy&f@{C}Woh!iCJ$$8@PNABk^NJT%5Jpd8jvE5 zDi_E!N(t92#qO}$FuxT{w04EbU69C9N~UekcxDw1My(+ zS$7}GD1;E=lk0LLR`l7w6fHq}Pso9>BtPLKSr zi}Od)>f0Pjx8LUTe*QLIRnkbk!{`0Z9X{_)cX=Ob-<1{gVa{Fo0tBA={)#iiBC`F8 z)52*I@9906Oj-B&-22h7d;G*&?ml1M4flDCbsq3$vb-EK-k`?!GX~2720>W{^nNNQv4N(hJ_Deszv1$CmcIRs_vEkNc%##v@t&-I#(PrbIZxdEocHANb3S0V z-{ok($1h4J!UCU3I`?y)gDZOr_mF;=MD2dZA@m`Q_?;u^ir?i?*iSM=zMrrwL)22P zr-wC!l9OGl@ZFwbSAu5OhRi=?W~XYoNC{_aV<)v!KF=5LkTmQCN79w{YJC0~fk@jl%Cb_~NAur$}4K?-e@8q!uTiqt36eg?FUMujG9I zg{FUE8PVUbUh|v8_Sd*cOt?kYUUT{};4k?Yz^48i{noynA`FV(yf%uJO1zaPv$Ld4 zBx_rxJRN>3_hs=NA{@0SZRbr>1~LHJ$x8I0-h#p)XsV#_t@(RBb)?8s7m5nw7lauU zc5ho}P%0z1XizF4a55_6SUtIViC0EmBEZD+G&SiTf7CyIWab|`ne|2v>ZvUpdFq#r zdg@_4RdrHAO+fG?=x!{eKiZ~VGg4f0C5*N^DNR_5NA--4n<^F>>8!Awd73ltsD}&h z=pq*$3wPzQ^{xuLSRQj#>H`|{MH<^~4kWQ=fALNd>(qPe)fO^43X{Y-ZC~@Eo78_< z^E2<&kszIUSNPqU7q}^066=+lqDx}2o8w7}byt3HXXpHLMTIE;_a`N7)jX6k3;<+L zr4cM>FZNWbBgpquDv5JXrCPwHT})*yN_oVny&fHDQ5cim&r6xXh~!m!g>LXZHo%)= zn=9c|;H5M{mZ%bZa<-OG*tzTH5(+!7JTIZJhv7(XGz{TPZ-v=7ed(=~WZek$Rob(? z$ybRIC*Pt)z6!h1R`gRYu|>H{Rs0lxiu6||A$5(vauC6Q0EKaw+yj-qC^;e!C8yk? z<$=m_Ll#a;c6|7{i)W@{mUx}q>!3w_`KY?%JwemoE7@|b6&rit`sMMg= zp-O8I&&8q23IvV9lwRVLbXp&#bV1Z5TG zz^|ghPNa(}@`Wy2N%WyVXRX4RA$TxX5W(fDeB!`8MI)fLVa{USygh7n$g zQ50KdHqevhZTxMs8Y-m)4$6BC=?V9O1aCUt2-F03$i}>FsWAt}#Ky`udcGeF z`Zh?fKUSD^z$#66zWz-(T+VNz+`+7jZOTE*qnR?1q2>`<+g#sKEFQWFDQFWA??hGtvRc$Mw#Gxq_2n`xZ(av^lGVvY(ItB&@>D^SAYFshAld z8q!MnG+;nP5i?a+)&yIGT{0KZqgF~|5Sy5I5S!J@s7t&un?ZWK!nVsjt(C=WFFXr% zAW`w<`{mp=%4B>BX{#(ou&b?dh~+qsr!Hq@gvSMY$Ls^~{6v|^KEu-+D(Fqdc1kE4 z(Ixwc-Z3>Uzdxde?UcO$C!xJgN=tW8m=lkV9hB*?-7#zwurj3DS*sh2QN_S3Bx^)QgUauK9^`Nu5p# zJGer*GjB^5Uz*TKDdD}>g_Xg|-PXtH3c9(b6G&qL9qXj5Wpi}bz@8Gu(5udzz$eH` z21~wY(3zbniW0@*_fajQ@Re0P{s2=OsKmf_x>628VLMc%5*mMmciSwOIe)DxTpO0Z z#8uUlVvWxF8lRCT_Cft4+lAS-3W@NXf&&bc(d%N~!3httCChc?HUGRLm zVf(w&MPb~GkGt|C$LC%3E$s#M@2OOxn%(%vIo*`83|(For^eER?))gUw7W8feR}=g zr<5N2)21FuUDSN9hmr&+?bDNE-piiKST==YjWnPqpz+sFd0wZ_^yKmOiEWdG0g zt zGv5oMq=Vy{(xrY%zIXxR4d!rvI?x}xZ%6Vv1%dnSf$mMoQr`gC?d}1v8bTT0DhEt& zH+Z4t#Nmonv_WP;6>-HKj)PrzqAAxVXpWR zEgY#-u~%9+ywJzfEV*zNC?jHm1&xkWK0>V(Mk(=ZBHT#mS238%f1ISzwn57G#RhI+ zUJ0!KQG=BTYfs6}YA^O1;bQ0f$5~w%Z*%WpoDM#vM=_PTfB3@w)k4T`2#6(E{X>*6 z{{eRScvnfsXm=~5=)jju#z$cQZ5pEZBI|)6*t6iTVkl3nI+Q1d)vR0@)+6F;Rt`rs zx~7V&#BIrgF2l<=s#!M_H-lAlai|hmeprz?_~O3e<;ZSu`CYHw7_SqeHdfj+%-uxY zem9z3T_tWLo|zq?C5>AKgt=M14wBsTvw~h5)R(zGWUGf|D9s+GWH%4wU{_XjlEfiW z-pYIjcI}0bM35^7Nby4<9J^Re^0Xqs5*Hn6k)H|&$X^u;%|IN-`vXaw36q#4&Ylm2 zaCVMSLan-JO-+a)LCB|$!+SzL^JlPT-jmB|nxqUWJ&Q>t8l+=lBEaFQ4<5qd21r*U z7Iim3maC3bI14V@L&hpTK%D5YOju`z3BWgUtWsN;O54UNt0C&qb(~U#Nq5W|r(Aa| z@WHuBjH4%Ru@IabuM84y)0^?iCvcpTFhS|%vpAenbvVH0;K-2m3LTrEl=jP+gQ|6y@*^-Z63zog(~-V6mh2_|B`3JRcx6O{<_aRCWNN@-Tshel0QN_;R` zFDB9AiAsPeSNPanr2D;N0_pTbB}%WwL<4_>plkh!5O@liqyz~|Y_%p~@AP|esaU!t zfX$^8z`8*~{RzPJ4o{3Ub+Y2-yu*kYyXIiYr6rR= z(y1v*dEpBEHAQK_ro8@CC0bZP{iiA+UYX%c%oJ@lL)RdtmP=_$WWw|!fwdqFs|%a0({MyzL5HRRC3&?0 z^k$mkWX^Cy0cRS!`!9$)O;>_q`BbA96%!-P=!Ju&c%B5<5Ox=lHs4SLXC^yIf|n@B zFQFz#I+=rfXvTEl@g4epI?h*fpVQ6hN@+18oW?GF4&yvCl)&f%M?u!@kRmxm2z;41 zv@lsb5!T5QKWv;5XMju|r<55=xa+nfVXQQSce8EZ&%m+0bgmF-U?tg_VrmdI)p79T zaO!Bsh0RX%Fwo79yk??P5VnfVf;=kxHbju z#`oH!VyI^0H}LV3SHnqw`u@*MbYuyTJDF~=ymQ{=Wkb<77qX^<#g$CW(v_+vh})z7 zQRz4<9;d}fDGh1+qWQI=gf+3qO`hGe7G}h9oSw46kitjds0?1XX$Ddth0iuhJtd8$ zKm;Et`FhF|q?j33oE6K|i)AV?0*YjU(4z;LO4XIv&Zxuv{#i={}RKUvBcJtc#sY=6a4&gv<@vy`-ab`q_yjF)P)3@LMX%2+*R=`!U9 zko>Hb5HcRITybGIAxajCKKm9@tjiT2eaCgu_q_S{C}+8Hw5UMF3dIHRzbI)HWP0|m zP<%hgJmo&i974iMWusn#&3xWUrQ!$KUf8phS*3VY+xoZ|B9k~Jl9B{Q%07-1-1XbK zxyU=7CEXc4^-dq#&Io42$W@Aqf3Dzeb~EYp%v|hO_BJhEg-tb=4zE(e8M>wz{|q9- zYNbRXr^eV(8A-eIfbZw_@{EXMK{BwH?|N^Mrs$oTqIU}VSq|{N1Nw~c07ngMg1Sj( zv&7{a@nOz6hS6hISfkX?cO9%D$d|QfxW7~1iKak` zUaMSTlhUJD=DWf=B`^?OfneDO!sJ_T{Z0OR<2q%s_y`iuj&=O0^?IcStEX^X7k^4y zuY|Ei0loT()lr9^oB}$zUYQFl_-um`VLExq0NAu&-_~wWx|`Xl^$BF&Gpf}h%e^FD z+MCqqqaZVe590dAyOSF`)|lBA*W>EA00?y+*zSlqKCw}0FJ5D`e7--`-K5kpuVE)F z@P8Ywgu#JLN+AGnV3tyoZR((!Y*Pm@|3Di2{tD_^&#N^Jo9+39(T&MngSrPn0n@>9 z0m@USz2fLnwlYGT7ETeh{_v%~n{j5EN;5VqL7`V2iwK?l9wFE-LLxhBk3H&Bg9^?; z`}n&7LGEPPqTI*f`mZfYXmMrHTNQtCYB+NVZ0oueC@U^@rid|S80RUtW`?s~cfs-( zQmTJhJ9Ul812RD1zUn)ZKLk6R*jZoSe)tachbh8=ES(28r8p1OLceWSQcGtBM+!`h zNeXF-%PgZ%CacL6XIQ}%RpZVeRC0i@)6qI`!7Ld~bjYT7IWGLw5lpyzx@N<@;0Oim zP*#gsr)mEV+);1StsP3mlDBYd#3wd$$3y`p4VK%mTLoU~0E*rP?#%7*bgw%laqMaENGw5vcPYMp zNhT{!eIiyJzs!lycyO@%<(VFFCsJsTdbWlK4cLPTd9h2Gi5vIi?*RzQ+$iOY=uiCy zN+WCd@_JCsl zLZ-dAH^64}bia?N=U#BJ7rVvq%Doz(xa3kWC#&Spn-LNiKW0?CB5Oww-!sD2NpJtFCWfysL-vCRB-B~L*n1Q zNR!5S{XGeS6|Zt3!jCX+zfz~^xYJ&ii8wMlU_xw9Ecnfe)#gDnf^P1!5PZjdBL=>nQU+M^@5vK%7Tn0R>SKg-#kcK!qw_XCoSfhfgOO5X_$DC3wi0u_ZE z$BW+~YL0*nXkZk47S245li49!dmK6C!5k$rcwCJorrm2a! zJx$m0!CyXQvf{xyT$P2#A9VEcX{D>MoeF08#nSLI$|HSZnA3HzWidM~j_b2j+;x_? z?l?H>2#fp9BFQ~&`ti=Q$ebC;w?wYy*>&q9?vP&f-W2nM;8lmsVh1I z>%0Q!i9L2#{ptSw!pf9fzj-h%Jg=O_n+}+X0pz@_mnY4;05D|4rn6X`3N9$?dCj+- z{L{PlEG58zz(u8eP}YC0|ItN7r4lRI!M|xpTgp18IM%>^2cTzI=pbzc_1D4m@Z2K6 zO`2!_1tfQnb|>=~jcxDhL*Z_!=LbD7Q7bpKLeRsL|8ayVZt6+5@m6fMQ{JyB$zAmn zZc(zk+9YUQ-hV8O`T0o%muHWMdK91oU)BCF_o99wKKG%NISrvy{`H*(lyl*eU|URj zOur8dgm~DFWW)@?8=0-a(ir{-{`s<)s^a}{qGd5vz-)$5!plZqdemjSqX^S)(r+W6 zK>y`;MtZX>hL~nk%JdrEw03z+b7346HZlh2-swA1N^+yllyPT3H``E)syK^J!fpA1 z>UL55Eu3Q?cua4K6$Z8wH(PK`jIZ~*w9pa7?>tP@4;zFuAQYyBGb3m2?^SjUXw zI-afMbzmQsman3>rBwgOe*=9DH$ta42ggpv`8c0KwM(nz!~ab_Y2$f^x&q6Dc^r#O zQU5Lz&UavwO2;M_bw6neohq$9cK!&^wHsu&#*|fkg;O-ItlFc*87t-u$7~!LdrRU_%L|yZFlaSw^~ujdUY4o05*1avE{jyTk~&8a zZTl;!FtYc;lSJ`&+?D)Ira09g|nEIAjwKjqt=D;v&(NOiGZ(>z9S8)05 zk55L}0Z}6VgwKz2<48`p{_2L{lPo4Q7 zKSANu)gVSh<0ZAT`LI5^brK(4VRf}Od$K42OPXL*Hf^X{F^Vr6@-b&N)CZH(uxK!T zlvHxC550+2J?U|bIvIJVHBv)D(8ZwlDK41$!Tbuvx|mf%jj4k+?CMx{GX$;@SG&UL z4_!1#p?@nLW-pFzS8c4Gp{F&~1kcOw0fptI9U>;zQk&T!;w6KKUGG7}3DpifO7Iv5!h@h7<$UYR2JpKr=N2_CCIAhQVK> z)%v$9dg3c2G8`EDC5{0(%~UhJZK=9Y{pM;CD%jf`C0Ej==6u?Ee5D5Hc?wz~Pgo0% z+7();ArXL7yUwRkm+EnoxPB)Dk$~;4VCHOS25fI_o9{$ZTc~mNex7Kd#xR=UtwT8! zoST7WRB6d8uGdlx2}Q+rjZQlXyV-dftYRuiM6YKcANslmK?t%3*y}3lht9J=b}DSC zu4b#$O2bh1OdGW^)@^hf^(sDfX{(k4H)3*I^@gz1);mExFNpaj zsDXAV{llX4uXj5sw5g~13432$G$MxD${Eqj2%3?ulAi~C`>EPboaf7NihxsY+-QOA-e>A)L0o7|ZK_5a+@yn){zWmi_3g#6ZD}u#ZI^oK;8koonZNP4>-K%| z4t9vVzvTIweW_=(D|y=y$Gzym85xtlTX9+R{X?Q>KAs5{3wz4tzV*An^oxZ0erhlz8t=BYG4(9h?wqn#AFp- zLoICg_5WLOT_@U;6{qOlIxX(4u6~aq+R@D2z6<*5Eq#cp?vjqGtR(Dr#>)grjgfm>U>b1=fuU-fk@!$;iGypppGsBIg(zk=vvZ!L|VBqFLIx<+@00D!qhX6Ns(dHo__zPG4 zK13CS+4RRybt{l@{V*KOR?(ls)Nc?Q@-_CJh4k~+>M10y`9_VyAbjOWIuasNDQjYy)B1603{@GYR(~&{m;O5*2UjCK8LxH_!B!o6<@zkM zAXT!A<-cQT@&t9SFu>MiqACeu!ExKvNvae7F=w*sD2i#0>2Jqa1wY%=@6>jJ_y-=% zlGQNV>zQm%)MF|1=L~h2xcI}IFF(ks$5NqYD7=C7)wXG^+$gJkkEYarf9>ita)H{= zoU@XjbaPYGN~Tr(=kE*Dn%FujEmY$uaW)RhB28VWM$oF+YF{QF32WXoaFH59)8>H5 z*<=o;RHQzOkOK+zpe%HBk@_iu%4uppS}+#`Go4<{Rr|98_E+=NUC14=1i3#>RR`(y zxl+CytID{zNn~gT|Vg65!RzLwU3zY$a>VB4lY&|LA0S;;87l;f$3@^y&?~qxlj$Vok_>e z09m89`Oq+2LE)Eg)WPGaaPEdI{)r3asT+yd6s%Wn^kLDl$8R)dVRW-zFzomE2JXDa zZ)}C-#_X#%La=M(p13gqJk#_uH-f3(wHtl_&-^ntB2hz|i#OuXeDcK`jKj0%;*AOP z_~{J`-Cco8(H45ULiKY32d_!6YkqZ#*u2{(b)eOa>aWE4^#Db$!Yz2cDLwzUQm_!R zdKD0DBSan44Dq&^9&b?_II}mxG2s2)qg|`jwO}NFzD8Ardz8Bd^!}bLZml|6bUP5v zta=(6I#`N|G1DJEmH0$FD z8!n^w$ht$dvS`B{>T)c`?Hy_j%c|hoqJx`}(LR3=#|2bzr#evBN=tUC6Huh&E}V>3 z)0ex{Z?V6pR~;-s!~c(6!1t}x@_Rn=@4r{ShM0Ht-RdM1*tMI@tF6@@d;`m3_g*y+ z!OwfK(hF^G_o|S)I&A_S2IXiS#Fcn3!1bT{ z9#cPN2$O5RnFx=>1OB*Cmz3jbG)ueshmK4IjyErvlO~>Yu;fv$)6Ec&_WTo=MjK^% z-;4$dO*sk9!cik-oPoQYJm;HbfkClPZ}^d?%S}K0mJZzTwN=goli`2v;n92*lHN%) z;JL7mmt(Cq)bt#V!c*zxId#4; zpJty|cfgBC%L|}Ga3*p=4Hh?hP><3#eQfE7aDu=4BDOXZsc~8D0EZIOFN3I0u~1=s zqdx^*0dTFRK3CM{hEpz3?VESgpH5y;uZyR+6{7&#Pgk)cimzO$>dvr0YFePSH0M|& zz;Yz%j#`ykxNUN!(*+>DuUu`73sn=(+wwX9>6Gotb#R1qTr@ntWUJD!JaoTG0^(E;GakCw}&Gu}dPrjW&R- z^i6L!Nw7Kv<0S(RS_|pMZMCzw-%6QpA@#YgKn-X110 zmfSJgavp-MEqwa7nlr}!$C?lS!-pSEQ^QP+vW3`+Q<(3c(uRAPo!IScY(&h-T0 zyZ?|r^WUe7E4)4t@ zVGN+>8)w_*Kh%{X^)zU^nB|o)qgEqeLQcMe)gjnZf86I}gxi|rHv~#bZepSggG*_T z(+5oO3Mn038wyeW4lvrq_Hm=;Vp_S~2wT%$Uo7*7Z31|%Jk3n!cA}J?<(OSK+Vso% zILes+(u+F0Qf2YZZxxNG|d@IDaa7o87F#C&5gdYYSm2lulm7FK!#Og*16mxw283T;7r;5n)}e} zC@rp(F0I0hGq~tDXt#xe)^x@o%&?Ptq!tAA6E_-FR;xf&MtPY?iPS7ea;F@YbaJAb zi54RX;I}bSi@_I9O8KOnukBT&)>tU>`_(Y;PB9|;&R9GmFMfkCN#izSMD$rHZJa)i z62;?a;PQR8eY8+rsi6f^&(fME{7CysYaLAw_pow7WwenfeW~GaA{DyO-61Fqjc#wT1}x>VZ&>#~SOwWCR#! z1e*dMDk!Hh1v>ZgeDp9!jM0-^UJEnsf!HEt54h@Yn_XUO$DSvDsis7P_5n)U|YiZ1W{*qdJHVXBiRBayXg#eRM zTc4Di+I&(T=-;Y-#Ip?6gY6&jnW|4IcRamQ>u65U_!v9&3qK04gWf^qzYfoxqX&k% z8uQ@LvMwe7`ayNICcblT!FYF$2oHt(fz&qz{Fr--eyyuj6LW4*SUoLTL_DFM*3&rK zSNf5jyy)OfN9$?Fa4Dhs+886$qz+S$`>kPgrGaMg%gH#(A4y@+owMeMn4aI7|gA@qwltvnFAq@;a?SYebW40uXfTl{_^0k8K^Ttlr7 zBZeCrY9TB<)=(?U!rvQeHESGu#mG@Jw6}x*a>B1<{>y@2_~gd-LT5+~b36&PhQTLf zk4BnL?d8QqU%zCPpeVQQI-r)A%x1z~jlH~X!w986r45a=AQ95_3HL1_bgPjT;AmUy z#SHzBv9VTC7(wM4Yb_jeZUu5%KEoSp%)Za@##&sZj3Tmh?gPs{pcLoz?m>fds~wom zGm}AaH2h zU)W81bY^p{GNQNa(bIbL7kf0I1^;^69_^w>@7SZs9kc*?d(p*2`&wvT0L1(jAaBs6 zTYSws(oy=?MG3Mm1Z>zbm4=orwVE)wbnl`vmr(n8%*utu;R?7q0^y#cNRv z*mB~v@p|c}?@D*n3&Q6~QNe!jIaaTY)(j?6CbrSSajaO;Myuj@VOJQWY6|I68!g22 z$2PW#uiI!7u|(tAVqITx5`3*KcDNs@YXVaC>|}YqPv9waKG8auI3c0ApJ<6dp|_uC zld+;ng1(|l+VK^=(@qPq#!KVuN5OY1I$jrtWh*+Kayx+3x}AIGPi@+3ejqdx^du~5 z0Nrb@xw}o&v%^UsEEDnUSm6Mw+Cp=8nN<9Z9=F#TqxfV!3zqrax;oK-4w^GQPSHPN z(U}8`eI58x8#`(ZT!$B%A#w$0RIA})H#KC2g3pYOeCpPB)GCPgSJH)!z@UCqv6I#Y z?+GJ2VN#aTpPi8Sgj#pj`U}@-Z)Z%%aONo__nW3Z)J4{!u>`YZUe6|3s~(nQE_U!y zymgX37?Wjfs-g{M%RE%ks<3dSqP6BUM$sC0>-K;Hbb8{$D8pK6s%o(;!}RW2O>sgF z<)~VzKz>p)1xI)?^VlYsxyOTPqzS$YQhQ(|$W>lLhlW!NO>1WUj=|glDva;#L+drI zi{mnuun^X28Els6sd>09();IP^|b7z`du_DYq47wt<3+v<#Jtl%gwt2HlNe%uG%m& z2l^$f1HM$Un^q4U>)s8YzoRwXv{7c>olL!daox2*<6c2pN`)g@_|l;6n*aa43zd5C zF2wi1;1@8{LCa~Z4~%kb>VeH_8M*h=ssT;odSaD-q~xAj6}MBzykL&rfEhoMMnCn` z>Y3o8XSI;Jr&*Ajv$TfKj>J4FR{K;N4t!V(*CSj1@Sz_+<@n(7na1pxJ+VSSzQJc& zDZt|fHUK{w@tMZmFC0Z^JR2!(OphpF#`&T@*8=e5-Qsglj3ny+xyC$ZE%+Qgil@7u z^V-Z`Xi-S4`~@KF6m|cC=bZS3))oX2+HDCbaLRH23yt|)3hBjn+U~uyruc}f4*$5f z7ytOM7mgdJ>8mfb>XGr%p5p79U40c}&bfij8E*3&%ZjV1@IeQEI{T%z2KA2lO52a3 z4HGry1!``hwg&{U$b^xp*j~(mBIu5%{=NBx?Ch;EUBg2ZQKjvBx`xcp%vW@-kJgQ9 z8nlXF)Pl$;bZn$nojH&ZMrq-Gc2_eZT+KunbZ0Z7QI&0$te{p0io%eF!cH`9B zf+}(>tpi2NZQC1Xz#OuNxoRzhUu<8w;>=O`7f6$``fD!#uUQ!P%yw?l2V?)@$59 zdRxX@+zc>O(>(yHrwuHcf5>Ain?PK}ERU>icqvDz>mM*%8%w*s~6 z;u2q)@u+*S-*4}L$-XuKrrY!?NSkE3?dS>~O^v?VsNmbh0QJENF7dUmp!l2BcDt_@ zCWue18x!2c#5=PD_Fig2>%u@R z+ihFvfef&o>43!-U9dc3fE8(Uu{^ihx(wFvLYhvW4bko*XgyR5@%!W5cmxJ(B14Wl zlr&UJfqGeqVOmnao#L_Ba{wCgJd{prhiSp$A6DC;VYoYqzgy|<*IF}#w(8$#LxswB z*dPSfStIiELGUDq1{V(k3Hl)J(9hpu5O-{^zD1>;FZ4m6G}FX=!3W{wVtHu=97E22 zu;wjJH&VjuQlaovQoAPA9izPv47Qjgt%*UnY8x?Ln<|KZTFE?7JHo>JiCR5z-#zl2 zq|FpxS#9Z)w4Wh}@QA*iqWuOE*n6t>RmhW@K~^C+(nELj01mI4{;N%}*?R|f?8_dwYL94WG zhIR!RrhbQoze=mW)2bqN;X4$5M6dP4;F&DZ)@r6!UldZ2w)T@)aF!~~!R$XiYx{bR27c^Co69_HEJCP-X-Np&N&5jo zK53)GoO`ym^R?$9vQyJV+EN^De_f>2MNlS9`xrr=H0>h(r&bzmZV!>%7o&?}8AOb2-jKskV*9~gF zQX7QQhgNFyQM&so4cdRV>5J7`XQb|1jhVVf_19p+?@{nttpb9kYXO$`XwO>Q9`DlV zb(%khn7U32_sPW3!0K4efU90PLx45d8VYsKBkQzk{_Kks*PErcWq&%`KbBap4Mts) z)@##)ZkrjAEWjXz#t!y>R(IP<%WSH!LF*}urI{OWW4;Y@t%%L0k2ZplaF@Q_h|5JL zE!wD+Mv#j{@9jobJ-<9ci0^Hz}H$?RC2f6 zrE{D3;og5cFMGGHYGLzLW zXUO7-J49;`7+%|{PZpRinKU^IRd1*DSz18ASWlMku@K2Cc_BmwHFUre%xb!vrA3Nw zt*O}<$z3Xwjjb}1nq&i?Gi{04U^`%@XfsYLSgy@%4Q%zd;K+gKtgTqYu_SKO*xS{H zZ8#^*rgPi0T5fll8zC!`On&1`LECv}YHUXxcj@!(TDTQmH?oB>vW3B)&JBzFsO)H!mG<;)v?K8f0>Koa)tu__l{usj@s|g>bmRsP%$4;+72!J zBVH+67*|%~i@f)1%wSz8$JPpe;q?lCu|)X01M5c5c4$MzoP1mFomvM`OwOnM-)jSc zvCu~8u_@6SXk}}|yvy8LXq%bC<|BSLsPuN~w_A$};$6wn^RX)PK%>hU&YLWmwoSV+ z6~Q`$8Ko@b!IxzIeZC3STa)PS9xW=gC_@G^1OsG{DT!yAVnUWmd$o`tfQwNo!2SnT z3H$ySD~h=>0=Pci3pU$qI<^<50Bw|VkUJ1CihOxI_j#7P+CHrga`)ZG zb5GibbMtK4sK*ZN)1rNnO7Rka2n@nt2THdbz|3}v%F!Z%fLBH-!@$Rq#k1`&ux?q# zQqLT%QwUoJjFSJI5A_@U-ww4cpG?jV#IsI|o>fwPOP7I_ zMJ?TF`8wt!xlo{o8G;|IJxG_g`7%x)-{>}9@uT{`XpLcj2l}9kqNDIsGjmEu7h3*{ z)&o3L1D#yeF^En~>F8u|0;@E7USnTsc$-}?QmelVqHk}5s_&s~x3#Li`t36VZ;6bZ zmBvEcKVRJjf)A(gJNix1gvXiOb1A+w?v7T|yjMiCP859=f(H3_Gzs@)@4H%G+>^)N z1^aq9JdsCSfFIh>U$v_6j!r%52M0L8<}aM1OYZ3riz5a9P-BxwSLlr!r2GqEHO1Qa zu_49EB<2lpR7A^u)oKcp>Ef?opRzG}lC|DMs7=j?Fj3O!kDVy!9v`TMGP*wXqq+A$ zRA2z*9=|&k+`~;4_j>WZmTMY>(%uyD*DfErd|!*fJ>Tnr_CrW~k(f^rGu_cH=VQcl zJ$`^i#Z|cGL#-|g2S3!hv+MQQhuY|fpPl>w8Tdvcx{sv zE~nbz8pX5bJ=NmDe+>H#r<{1|^&4pQFiQDN^Y$+?8e*`UIziWAP-qjSw8$z+SCIp& zP)_IXLq5vhq4K;#0=R7M&p>j9QY99&rub*tIPh%qo@sS)&#s(ac$j(liFmG+M6`-M zsvwF^jD8L{SW7FP^94BlTw70m2eldEGz)oMsOCdE4rpL7l0B`r7$N1QSj%uF@SmWgC zH9~38PiTAw?fVHk@=;s(F%9pV$q}qYU;60(F!$c^Q5D_)_}=X$n{2Y#^n~3FfzSyh zbjbw)=|!>T-U}kA6eWs2KB6WlDkvyOISOckpjeP%TU0<$RFvKnkrqYl0#;DU?|o+O zE2U&YYP$bLO-;=gbyii|o6locHmE_ptY(rCZ9I`=(9WWl`7p z1Dld_NZnrEkdn5RKV`+)M%d%c^g{0DP#q=k5pCI8o^5?CRIQfOhws+8t>tY!Z}?&U z2GYDuUA6(?rXhndtUybVPVmGx>12#L`*X8OTnM*NYiId9*Z1!tGsX)cQq}78 zqQ6aaU5Bae&qLI^KZN6a+GZ8=l{@gp02 zI>h8VWmvu1Iq)j>7Lq}{Vy4nq;s!q4qJ)Zg& zEA-pIcxwJ}d3$WuU;i=eve=-R^GSJ;^{ks#e^UMkNPgeF82q&~a&LJz=aeMiHcqg< z1|jn6_LisP`JTPyw<|5E->2n|TE~ZJ*x7FBbmCL+mZjv~SKc^(as*~{Bzlp3MYbA& zs9^h;pE)#m9~Q$>s@hkclX2FaW2Om%NGi^cg`&2UR-i~yQw+uMo){BLpb34uul$nG z1K#)%JBd?;YhI;ZpOv>y`rwR9{mG)v+vP-Z_2f@-GjSfkw{z*)&&n&X6tec0-wImq zrmjjQh){;Ek7(ze8BhtOMmm=6M8*A$tfS^FE$|$Y9tp=KlDh zws*~>IQKj5~2{QW=8DvRj@-c1yVXV>8nHKS70f1JzU-w1Rz9_-950ebGW=I z?lR=v4C`Q=Q>pFq`>@q0XA8t#sRd@iYS-`Qbn07M&Sz~pc+>G3Z#vyoTiz)7okyL> z5UMVCG7mF5lwPSVZ(6i*PG(?OoOYXjsBTppKZ6b5Uv1rGO_o{1yhu;*Rx^YV~l z#M*vd-db^fT?J2sU3AkI*s+qwY{!?wlRAbYJ~N^xek-J89V;<@fp)oZD$R8vwmHfWG$23(|l; zVd!6QZV1&(c{l?{B%1G|N)I@Wty@En{8@gp?E{-iGaYR*QXJiI`jtgpg;M;7-s-7` zsmE!opKocx>GEbNo7Zf$MC`C!`GAmn*U*a7u&pxqPfnLN@;`UJ^xCpoJNurHn+`vA`P7o^v*A7h-y>0q1mz_hiE9+-k_>1oOFKvtktg^ z+BL3^ZB|>Q^&XnJ(OZv>Ikn4^57>c8EHxnw(x+a!)TJG2_-1X08?&kV)+HJffo*8& z(H~uEs`w;$?Jw&Tq;Qi#`7~_zL?=D!)>c|i@1&X}t+;Z-=^?68(Ibkuc+pvr%}3pE zdZ#7uj3-XwA;p-Zy$&x}m9KL=FXn)svX9z2jy}e~b9I3^)(Xr3nt(0QiZJKDzevd` z1Y@+0iQ4O1)Z=G%QgW};ngYxuGMbo zh;(_wDji^>30ynw)dm60RG-!?Wm*hq<`8HGe~lR3?bC`F?qVN4A7HzMar~%yn15AO zO|GiK`G1I0lwRa?*TUB*KYh0xBQ{o`R3WP3+GSdyZw9zs$eCNd}&&qD7dLk!K(Z`E;wm63ckt(KU+g9QBbt| z(fNX4(lhtlGuzwM%?$HmlzefvtrT(-TT2pSBM%&xWAk2}+R0QAte5GxtAdQBqte_b zXmHRZc_!r&B=W?N0U0zSs3jLp+v5fPO4=cVGE72e4j$YFX?;*@>Br2m!2~HYuu|x3 zP`ixh|FU$gvpK1A(zS*yP^uS*kyWff@kfw!oF~o8fEVHgctzi(YemgPA7BR(*?;1F zVKJlZ!oG;fP6M9|^AK^0h*IlysP@`Ue8VvOfE6z>NWnVw57`rlKLlhhSpae{dD`?EaDwgOy-375BKEvS!Gy!|{w`?nqJ5fP53%k$iIiB&c& z$kf_`V(rWX#ab%r2#RG@SFNSwEUmtP*fvY+*m5Z-2+$U)glZo7C!%rpI9m0YYqVH#w)U`<-i>N~;ewk|hP`e42q4l*XxE!pnUFKfmQ7dnSn+uiK*BZhhR7>ab|0>e9^0ik3O@-ZU#~1D( z9iFc(u*O1E8y%J&du)M*gb?@A`gxaU(DC;xd(rrthZW+m@{DBb4&SWQAM$BQ1MNlU z7e}%&GjwG`P@ae2dVkr|8THk@aDw6K!W3C6aw9H*ZYFZ)G&-(Z)(Tee{Vj$*iz$@ zwUiRA43};t+F%6Zve>YS7L;fY$J1FIH4Zb*?WCRImk!c9l_;>GEL*LY;gt|Y7UlZKjGO9Rg}D@n`Y;d!@6tb3@?Q$)cG0o zad*-72NwgGZLvW;G%pvrrl(eJL!s)Kue+dgqfmr?>Z!etSHo}8(rHUC?NhCN;6vJRUr9!F_}2oQ`&u)g)E2x`@X+7iA+eAE63>2&x(AU3ig%)KX@I!)2` z$w^V~3a3-EsoFTc1%lrNi_yzdwQbhL$S-=b-PP5{_tsbJ*0r$4PRb2dhwCXggRyUob_pKM8vj*B?8O>T1!WVwt$)3W!cS|Lhfe;wi6t^Y zViYsCq#{IWu%4aPi1S{_KN-Zi8es7?Qy8pd?sTsE$mMu4CDwAYhVvu z_o>Diqif`4|EF5mj`GMy0{@a&`aW&69aCF*P@9QDsfRG{d#Ii{LhWLT$UuZ3HS^I_7TUk!-BU*2Un@cm-)DOi*AJJ}e1A`8KFY&5arUB^s zgZ8u?o|cVCOes z7Crf#7I8fGL^7!2@;~=x!$xrWH#+oH0A~E zH)TL|>ZkRUY?}C@HWH)~GkhH`k)n|qRK8Rj1FNqMI9TzxP!mnVjRn*D9Y_j0&<-mwMIGL{0oI$fXUfCv$hHZeW^jfLCXTLw71Sq_WX-MwlcZ13ApyCyGO+1vzkvlus|aP zR#FtG)$9Co2y`Cyl4)kS0nhQvjhbNZ(d00={B`)%pC5+ZmHZHl66tCzuxly({8r&K zg2%ZqS?d`&B?OyLLV=rG!Xc)>#(fuev45f4V< z{Gh|5$`bX5#mFW1js`H~{%~@ysNZi7r|@HYfBx-*?j!2UMoxPzm^p4fMdlDvI$CZp zCxyF2zSp&M1v??HYpwsoSHAGNmRBiJ#%Jy;lmV%bh8&cO#XE>9Qlvqwj*yYk5vzNx zYI=ty?0~*Ra&mwXslQQK?0>;|d5R?3Nu~ufH828J9y1H6D<_=nlsJG9!UBY~zhY4y z{WxlzyHZfjB&lwOL+X~dz3PuR%M`UuofEaq%J8u;4X5fy+fv!j8KulviwjE0cngtv1pE0?_#}Zst_rL; z3^RHu)2O@Pc*D)R?m4JKTvIR&ZC;*$uUl=f)!+e+*`{+Us#8(MZ27I^z z=ahKF2PTHwW29rWtFviR@c{)_+{jKR9si2XTtuN+H2fe`=jYfswA}2HfTfWrKMww zQ!fEs#HaU*WbkEBB$F!o9BSzSjhF#1B7c3_@vqX5Q5H>MI?Kz9O-^hefaVs286td3 z1Sh3-3r|@BI%{77Xnsk0{Y-i@a0k+xiGu4bNPwp1^p2#dO2n5S!9dJ#O6-aEw0|o~ zS}gd1b{noVb)$A4mZbkftq2hLXuVgHpan%;71$$m^Ww$Sz>4O=)QMvC>0cjeepI>t zLv4yDS&+#f3>O(6Y0G`d=AyJ>w6}i*hL}QaH)#XS741)~Xn$fw`_HfFWOF@ch!t(F zM`@}?arT(Ev2f0$MYJ5F|vHwFc z^MC{Oh`FBOi%Elj+Ze2jFJY-HCab(akv|d2BDZL+%?rBD3lbX>*lDw?0jywmd|h%W zc0s~`$Q8_0uRpm$1A%U(qDet>cSu84$jB9UeG?>QtHvQp(XCoJ z)>7qGje~GX4h#;`zO9gx5V7;+5F}MQ?9R5=1g%NcYUg@5X=B))A|C}F{xU*kqb@6? zL9YB{#Y4H+005dn%K zM1=dgS+JFokWd_uP<&X2fyuD;3siBNLV*Ga_%ko9AMQy{ZIAshOFy}x4j0CVkKWm? zMg6cDyWviX3ld+_iS1gb5}mm+3Z9M@$AE(}U&dBZv9%cfRbeLG?=~Ghf!rT+zox$e2NQMcyEEs#nOlk|0KPI7<45D!>W2&7UB%$ zQ7=v30fF30*YDIi^aj@t!On>{b~r9W4B-cG%2#?JuQGNp@T(%?u$6^v$odCiNDP>S z1JNaFLqT94`au`()S`g;&JL{u)$G)~EgXJi?8KWSFEXfxeFI_0sf@U|4JV8a;IiN< z;adPyX`wiy4*GPb)xtXXb#^4KeaPvKb)SZ(7wpf(B6Bspfp3;-%Ucs8KS!4kmvoRR80Z0i^Q zT@3Sp4YSCS9%Oq+$YV@e0oo&$Bp$&m^%>Rf(&{Tta_-g&+B!`F>%h?YouZqZ5J+?_ zQC*4-TwQ!AJVL$6p+cs_C=2Z454B2^G|7@#7FlhzP!Wz_K*z`MUyK@isxoRsfeKg+ z_{Acml{W3xdUV9J^o;m<&NJkU1Fyn9o_g$FNen{WyeNy7U?)jQm^3^n4m+vO9xYla zP}~j#Q%3j4S71-Nk6&R##;<-5YE?@FXBtQx5tx*WyL&1kNkAypPv8g3;DFSOfAE#! z+br&~SUNy;q?%^56KN?Sf7~L!#;nmo%CA{r$A78_U@b zFrtXWhQ%=Kpg|vNMQ%B^VK3eNF(hU=0-glp^28YzzAFi82aBV)fB{=^fhJ@U3e{u- zFlSyH=K%?i8BcF2Y~+(aRcKG+@0J?DhH zdG(x@uA6*SKe0-#fX~9z_IOHg&T3a@FtXv!P)2o)o(EG>P;srIr+?Ja1l+q3arV)V z*h)AbJmLgM*D-C6un!zOu8BVJ>1{w&4lHSXLR+o8OUF+@etUx^`~*(f-*m2d<0mc2 z`bLBn>NoU?CI76w%+l`qU!YndFfQ$~O#19sEnQ?-DTBN>fXaT=E(b%lv&rnXuMls9 z*W%tzfnQ+>KlZEUhPmT-69rbpl;5;|fOC=7J(F(zO)IdCg~3d1zv~jJaTg@h^d*7p z>Z#)jVQ2{cuGLx*yFc?of#ip?Xw^y0 zPwA($k+P(n7HaL&Y1S!ikbPzVrqoDUZ3dk=r8TzB3?LbGuXO72hn6o3!yjPVl|j1o z53N1Ji?~;3(uO~@Qu!9)=znNgl=Y`pA|H6=gX{m)R4!f;{Th3%e`*nQ>GMCe>jVfd zGE5FTt=%DOBqJNz;dJ`xw00#5^*y8ArC4Jd&uFt)0~nU&NvHAWv_g1$|HL&bFcWEe^dcH}zGF~k7=$FbDsnwBY z-0JpwM!G2E)njH%AjZVu^#QDJ>ZpCn5*H%pdh=%siuD?^{cOSdJJoUw+eO{U%% zPb)HY6PXb6&pmu;anwb(Pwk#UX<2$h38^&=zII=*I?%J8;vnDWnwN%W={KPEM_FR% zGqd&EmDTh}w%!t#x3l%$%G#JGNB_4Kig_K~e+-D#-xdEdJpF&I^;`F*RxAAqm3$iC zLM^84{rx!@R+_)H3SW5Y9u#7Itu602b}6JY}aCrP;%E-!JsLR#$^b+u!|P~NuH3mS+abGEG~tggcO0|PVu6M zWf}+w>VmTY)gu}(6<=FiNPy~1JCZx3ThAeMyWu3P#wj>x;@gJ0w}nuavZ4qR6QX#M zY2S=G5Vmj|#F(+HDtRG?BZ{n7ZcnNm3g5^_CuTaGzQ7!`N5gttm0szFt^*M>UFu#8 z&L@u)guHJ9l$&5whGyo4LcmErElu4*_}-t@pTstj`E|tN>W)O+zoJL>C4?&4Mn%c0s7Q z_;$>W(leKh;?OL3vIOAKQBI~Uv_5ekwh46%r^1K=3UC8zHb3hH)k#SF2-Xs11U_L< z0*Nt@i94~`jP_FjRh%A%E>?<(VqFh?!S8fF;ZB(6*ymlr#|pKDX9@7Ka9|2_P$^ZS zG(2@hrHHV{qd-zbSUQn^QqqFBC@lI6pCNbFt#ii8m^933H=n(j5o=+9xSe$%bB>Hzd|6uQY%FN;}2!Lc9krFZ97J zrh#`JJWvX;&PHRtd5v*qfT#yB@WYO3q5{^SC(QaF%m2{e`0yZp4+98p#oEI&;dR+f z_-A{?uqVl3Ppo$v-gU7JOSm_7>GOk)}!>%_!B!pw#J7eTnloD=-zACEMwDQ-k*UDp`Ax z@>}e_4tf_GZr67P-+!OZcGkbLzt7$PC#vD_eYT69BrDr!QmjWPR&wJXwO<#7%@pvWQ3K%qVZ6K4LnwRT_ zsfKTw?WcUQz;nZl$I`5|m zpWx0}VK~)f#Vs{)j%^KmODVnd+}>_s+W?J>6AN{t2#t?+K8M-8Q z(-4iu!bKJ?I5QJSY)4pPBu=NL0Sl&K*e}jIR7#o_cd}<#(tZJ0ar?!BIBk$JgB7ND z8>=<+@zHascHx7+<8nt{19sel8H0V>^3FFa-=yG}_VW zi41CfU(n;Us`IgNMzy_;A~&7K?s3OW7o;v8l}?rS1%0js2MW||*eoI=AImHR<+KPh zC^M?279Y4R%zN%!Nu-f^5_apGFVQ>DisrXCQscuRjU~LTanYf?%v4T{!2I6@s}we6 zfD?mfz=H~et_Srj8(xo|x~XvrW<)Sm^=k{*oej)X>HK4QAC?vt!_%?b5st>2j(?Ty ztk0n{pbkeYVh7avc_ITiKj_ACygv+=RbfR`q?x$K5{$|nuFxp5|( z9FUy>>@#d{Y6&vMxg=`kuf%RTY+_;jjzgAg4_O;v?6?$wO~VajGFzgIwALtU?H2_i zX;byFcA3?K3L3za@#2HGMcTU5zcC=*F+fAS1Q?GYqeAXAvs)`{_6d;DM=zvjzx4N@ z?GFSqs{a^OsHDbz=%W|0#Uge4jI3Cbe)@J^@i<^BJr)?CceFX?!GWngtzUn0h}PWm ztWV^?bJONSj_f8*-dfAUN8%EOX%LtCp#QiOgXiMXG~(k+%SaL(e0f4k>Y3EJ*mhkc zkG7|bNv|y6cM~G{VRs|z9g$9aSEWSi@pZBiiSTub5-H^CG$m4>uQQZL5npF3kp_Hy zT!|F(b%7FT%-0$v(uA*zl}J;*KBq*Q@pY*ZY0lRbN~8r}UsWP4v-rmrl zU)L#-_SMsRH&z;YI`I8oCDM^nd(1D%M3|#(Ow@%g;``azk2RCy9f;vGKHUaJJc#0kQWl9WP&)& z&`mF0sy}p*XmbkJK?MX|g1nVtRA8z_oWNv>TBg?!wpj!WQ%eyrnh)L|ra71Cy}P=) zO~D!nw6i^KRz^qcD*T=ywluR?)o=v}9*7%5$A&@J+73>Avf1spQvOiAOLh&{g}Z^s zONPN%fUOGt?%A~Rfqt2)bu#YNb(6c4T5I^%X1L6hTC4bH6*d^89A-u{KyI`I)>kz;xpAoOC)fRQFon$N3Bh>`E46@e8`ZO@2=cuf0C2`rL3Rt{I|9 zPEn)2Dx9zO^3T0A{Bk|iPPAceG{Q(47YE}R>Ft5{t#PAI+;prW`vO&b)hk#DtVVBs z!S;}hN#n)kH>sqJYnmI6Pzj;K2u31y{KZ&GM=;qJP?-4V%WX+pV3{+%9~o~KoyK?} z2poVE(SG&_pA<^)oI}sda275PA;{6 zkEFR*=&e|8xl(UXDoR7UGh6A&ClE72VM^>{RNH8rpdcU}fmkG25lZf-aaZb@?Gwo* z6CoYwwEWP&&9l^X#E1H5aBaQxl*fSzSkzX08m?35(3N^=Lu8|rSf9|V#RpBnspFy> zQ)DH0N$TyK;(KP(fh+VT9+RNL;P=v1dV|gk(JDWSTlkNkH7&8_f*O+{RUv$cQb%a% zHje2{UEVfW$pRzh&C>%S7dD;5UZ2U7;eHP6VD!S2N*@`&Nt97GuptDDHdO;qc6UVP z{fi$rz(wBWBBmfOiil&d8Dn@*YJh7+6R>K;G=dCqqAzwUkE4&wvuT4X+Gkhm;p!H< z3lvwSY13HEOHIlhVku&YidmV0)rTQhSJzpE!o8iR9HK{>oPdOp-enp#1UxBwFub_% zF*)8B;o=Sm4t4|x(!#u25nId&2`iuDzCiRqN(h%axlY6BLN~RYw|}_f=PWqtE>C&Z zf-PYTamOREFDNBXc(qB(h&%4kjv}x?#Cs`Y`fPEL1zj}{X1D+nAI^ZS;Dph{9Y0Ei zOFfc8!W=S0#bsRaY934wTo$tFe*vvlOx72FYtCGp7m7B8+RUCcz`cJhS3Di zIbff+yx5Vj_a>?7d5{E7zh2_p9jpm~blj1!sBksWO?s_dZ*7OizG*y36-Ziz)4*BP z#4@R(fTm|xf-ec)SZo~ztqtY_(33M3tNV8DOOBV=Gph3e`ZWp_?TI3K;I?{xh|xMGl@M{$8YCtT^_O>>YfR*Bi9Q^%kq zYydztF)LY^6{ZV+!$pkA-*6Fo8Nfw0^}(4f%x*7ra8aH_B5<*wa1=V*(=TSN4l)Xu z{}C6tudoydb5gMNC@KXdD0X3*s{(jgiR!15WQIVef?kpvvT{BC4sVZav9qo-EQ=g|9VtS-CiI*nd zj+Hdy28vv(XW8*!0$p^i-ty{*q^JNK!SrAbM1;6G2cn{ChYB@TfILqPglD}#g9(@b zUeA&~2n!rW1gJn;uGM>0VwodyhDQ<>2w{f9yE}v%iy(0jiK3zl=`0dOWgp_)oEa#u z;3nL!UkaDCC~I^ig0mo!UvU?tss<-Q_TpyzrRp4XBTUx zkZPL_4DxWyrqt{7rjQXJ8_%Zh*XfO~lfUC~a(y|G7^wPn2C4_QCp#lrN|0@~em#C( z2x3uc0keN#B}U(2tj(4m=MJ5ul8d5|H zU-&gxCVTJfQP*1wW930LAPjJm?RXxDj99`5TE)7;fXx<@2JVHAuDD(gRmuXMIt5I^ z*Fdz06y0hAIUDDfk(dqnDTxtbjb6@%{hqKD+#oR@_;hp%GlC((66P@%on#AO6*+Fu zvoO{LH|Y6bQ^37xzw`(M7O3l(t!s1~uE!~{N#&zB|mazFf zT{cGVf-ib(jQ#*F*<zdeVspIYCfA4SESoAu)MO+=rQ zFd9wbJvP6lsd$r)H%;rlkpyBg-FdU#>8fURzPOnzg%oq{NTCU%d7byo>%5Qi`xbTH zx2W^pL&@Xyj7FYF4puYJ8CGd2@U^T{p{1pJyY*Lh!`-`mST+v+jh^at5JsyH0vJ<}rkdAvT_ zU4%P+NFyusYnm7FEMYx{GkU{~D()|7VLB3@W$cfo@D^4E=IO@@z3YfJqH#&y+noPm z>4t@xpgY2F5k}1nY;-b!zsV+T1rQJBvaJNcDV)%#)Y56jEpX>RexY0RWi1+nQyJ@| z-=?K+lsQmpxIQ4mn-l%-3DOQVQDMhhOSnG0b*sM6-8c+OOK!9=4JhBAO?OYwQ|gzZ zNj?{e2fb7_nu(dhX|q25$J5!ER!q=`C=s&V1{M&Z=C|pieC6=Z72K|mE)EL`(H2I;TsWK?Wy8*CHk%IQz*G?FCSlk= za-&V?#Nf}f>BHO6(+;Aiis)$v+0zWs(*SxJ5It=|C2NrcKjmL=If+owzx2+n!e{^< zwYP)EM5D5eiYO0Vv>`UmnKRnT&I*^b_S~sA3pD_r#|+sS zk)xLWP!Sk~GbieOQ1IG``Wq;icNaFNJXCs@-qhAK458tRjtCZg|57L2bC;f$z0QJe zR3b4OBlbGeNSVzv=--p{D1CUBo`c#)?$RH0hR0wThk4q|dU@j0>NB`>guhkm_{_|uZ$9H0~Mpx=xvo}asayf4>VexvVb(KP-NO?dH6>+!UGhb%a zr7(%fK`0kbPDc!PzbgF*S?|*$#UTU*)sep5=eFXc<9!ocKDX8PKK-tw4`f$ZclaQt z+^Z`JU7UZiUPGHd^FlZq>%!S+!l_5A8qX=DLsRsTzW(ZmiKhdn>e$Y?Pro4-5{3`^ zv+R!!OMs9N?F0R(f+F8K8A#D0j0on}5D{lA{Mn(sBh4<^l1>rG~DCk2}#=3!SBW5p*hhaPn_of@~*K>!4K@<=(b|H;H z=LC(h0oU25Ilx6GL?w+G1JTU_Z4fJo1%)IyRbdSlAZr-oj`ZzRy@7(WTp!X$c*D&sj!3{-77oYm zc}V|R2}Z-62Spp^LhZGNJ5A>33^z@lriYW;F|9<*MmHd4xE;MbO>daoE*b78R#?M) z5eq)^t7&?nyB)J7E|E4}Z-ZufP1gt6q8Rmg)Aa|$kHSavu2DS6Mf8*P&LyBBw}5(D z(G~=jM6*$v{D^+F5~V|r=-1oAAS1mW)uY}S(70oW&B*2l|z=F3!hK(t@|OulP?cc1CE* zeRn{<%fY(?mcmNN>OK7c`d8w9P!{90b?|TfIwW7_~h!apqE72@6D3*KQOgql(} zB)1-^bMy!DLB?RbxD9p;kTEDu_|H7@kwwcRbM&U}Rzm)Zwj!g~ADPr*E*4)cw^YeK z+Td=rW?KQV_#9Y#(hAgyuA8ej!y$xOiNft`3E8N^Yfqoc>;1B z4o+31H}uM*Zh+BW&`Qz|p_Q4B>!H*mW@Q#m0`G*>BNTgFzd7y8zdXkIHz&5flurGg z&<6}|&*tLXX!{-z7o;a52kEq|Yqvfs>)TW>0$2g|sM#?@r8h`{yv|-bunzN5_R#n9^|qxV zCIjCE;0Q*9;11pKYd7vu=rH!f(`~(ih3A{>w+AJ0dO}l6Nvo-fa*IvtvEjX2w%`pt%eN z_N(93{p9cJe6k~)0)!L$LE$#lJ1D9ILk{_Y|1b>g|2M-RT`T;mc`Ol25Z^yl*%Xmq z=bqAs_M!t$$U_o?_l&>uz_{8HH07_QKs!rDrtXZ?Un?2CIVwar79VaW(q& z7`8n%`W5cBVK~m`M%z;AGui2M$wEE7!H@DQrKI+w`IUaLtg`Wy*QAKD&t@d~5!S=B9&7Pux^@xRYAG_z>(#iF zF4n^hf00mGr~v*2wnpH>EBgTLQfS74IK}Q>tlJcP!=z{Qf^2LmG_zn|j}a9Sk}BL7 zCm`Q&*b`gzjDF0HV$Z!GjQN+n2wBgA^%@urjR#my`(M;AwVn!7$x=N#C~RC7R`4(@ zC*f3x0@_k&lO9^JR7hEem+H@D0RX>-)eZ_Qv*1RY80{#UAs(w5J10Orgz9-YafUy#DK|>i}2YOAxsmnIxN@w`+k#S^@>yd zjb<*_KTi5x4iADM)ZgjW6?$X;$@5Q6BLC}W!-Hv)mGe3*>{iGgMB7&AeVk(VdotBq zsps|;HaHf(paSrg`zZ-V349RB!Hpd9I{W4`Y@=Zzvzdoe`qe*V&&J{h++US$)cbQs zx*OyH-XDlTo3R?1Xac#-LzKB?LSvfNtaC#+8-??#Ye!`%@KE7&aPDw^DK=8v;ZE&f zes_oKiA`B|I3iNFxxXYcZQEacwLdH{9VS@QUF3 zrou7F9d3p*h4{XCDcn?WZBYt066mBZGZ(qIl%Es)VQfl4J z_Z_LzEBX@74psXYvTOeSioOOnvDaUPX2(yhuj_Xx1Lhv@kx7re4sZVcbm(=s{`HTQ z#vmtVSN*(6Bvgx91LMIlCEbEEsl7V2q)^GBl$wnWs$K;@#R1hPMt~GiO?QW#K3b(u zNlMgpBAu@OhOWYqsOAlQDLi1PX5r~f8u=#hu|F+Lo|}bjG(=!?hOLEfCS}s*H}xmS`bbO6|N>sGaj&s)| z3i@q*q_{_X)aof=lZ!=(J@Yf9lb!KXj}Q%e(o;nBez@Be zoByHyxYfGuEo!@2|3aBX*;^n3&7xjg5TUX$geEN2gWoE|5hKsY7rXER?=!dRgOrVQ z!&W^kiy?Sr<1fM3!maw%He}R3y+dzcr2y66sdwe;$esFqtr2{P4GFdnxUs1aaf92y zsco#fVmcoH0>4a4)EgKdw)BJmh$C&_K6EwZ?$VnTtV7CZ?2`+AA`{9Wpcf=h2|OM^ zAlA4Rfo!VWrEgZYQ@`DqQ1}y-oN{CWFP(vH>?gba)7l`-dTV+ry|Y`t0u!CHM?b{# zzV4NVnZhe1^s!zY>-LTQ9>+Vnztab0qqneFVoS^-Oj+zLZ5JD)vE~Q$bYJZAWBQYP zd`i^`y_t3UE3_lenU{v0EM_k1_E(UFa!>>&ds;c_mx7DU94Ue8;?7V~6hq0)D5)-9 z0vdzlr~G@$BK|GERTb`|653!KZLMeIavAgqTX*Khj+r0@m1+D>dPnE8Q@!fZ`)S2b zn4vYK{H(V_{`?L<>n(i8mcRni6wK$h8FcHK5F^UEy!hi?8d}W6scT zH&xtu7cvL@tPfWPBBNn;h}!+8s~+jV$+Fh`Uvxfb)<>!z$DVEaMdu?`PyPbJvxXY~ zs^|NjuG8F*UxC>3Xwt8+^9-Qpf7S0mTIv*;xT^hcIwy>u^cy2REkG++CkKDiQ~3DR zA5Vh&T^&7Vn=;5I@%{?t3*cjccz)d%UNKS2#w(aAsc58&Cn?liVrQ2)poy*uj9 zDK@Ug-}{V#%7Hn%jEj|3OR^M0L3E+%A>uc6uq2h;L&^{*-k;i74NjeKm(^&CL(Fn$ z(xd*6FG&@C3=kx8N$t@!lfJVW&vS^COUwGEOu*v?r_`3<*IVmxj28;x(gE}qRl?r-#8 zuv~00nOLrxdrXP_E3qm}jF%fGNvhc2VT>Q1Y$Py#VY1QEcDdRN$H=B-dc`J9;9f;- zUMHDZldVV%HZ#TOOSgQd*Md!0K|Tie{VEvS-0dnvN{#+e&$0fb(7ubW%C|w~r#~*f zY6ONy?{QThIKvO_>Kuymq$U@h&&F(DYg61bTuBSR9x(bVfpt=ul!@%DfKaxiO*0yH z=fJdB{T$#Q+5}Cd@lPVl&ZJyp02s~oTw^A^KJdeOG;DiDPg2s1MjV3NrlAsw?A-+A zh;7$=QNMf<^kKoLoA4ljj3dYi3>U~W0}HRZ1o5hv$hjN6xpd(Dj54wZjYs|uU}``4 zn%D2beMR-?<`2Ey=!$e>Hqb}yo|WxuiJ&V8Uv6$sX_TCf=j*#<C4g^a%7 z8arC{0uLOBxLEMOfjt`1f(#=RT6x4-Y{BUH?!j8`>{&p~M)qijr}=|>Fuqrf>;Wo6C3^iJ-I!&x zaXqjAL;K5zv^dKciWetjv7{kAa;asu5d>Q;J9IdM!kcnhP}Ptg^JByF3?zLVh`Fpi z*dZAEHs836=~dUT@jNcygbmKc;*A)5T=cCGW4#N$yc{cp#D0hz9}+djLtS|{YIH*} zXQ9yrtItkvzqT+GyQa{%%8FYDh1)L(#WoiK6mF675)DzuBZrarzM&C9mukJ8GpS2M zg99~Y&ggz64eD@jUP2CW(Z+_xJ_uV2r`Cfu_(rjjlzCbrl;AE%X(4!3F}(5r!*ts1 zPIdbZ8r#UYQBF^YzH4Ok!2ngi5#Vtg+!!c~cCYYjSF}s*9p5c`-TDknF zIZr1V8;zACG~>-csCr-j7RYeYsfkgB+Q;7%u&9YK1b5#yF}k=`J%i~uxr3TFHR?-| z#vJ>tZv`HpL6>BO==F}q42<2(aV2~zh;qt!#5(02nt94dchMZwUhxj47L<-h?e!NK z6;#oJ*8>ec*BH4#)4y(r-wQ|Qhsc=Q2g{90UYMF#ZE#$^aJAVIt8M14R9+^77j@^a zpOoT9+VoT3TtZir7;8gy2iGHPLd~X&d8}YBDtNM{^nkpQ;ezq;>$>p?io-32OmI7A{N=@!Mn8vR`B=Mk}+uG8= z4wnV!=TfoWBcYbay1kbohuZQoAM7uE#JXV(4Q?ODfO^#{4mVbCfZLdvJ$T$odhtkf z?I5rMcz`I!4u;<~cLqB8J#tWY5EB@gGsc|28MSTaQ@>aLHg_{t%ei~vQB+*D+MK)C z!e0%A<@LJLyy9h9bn?R}y7%RHQB1R6xnL4xs(PM;3RlN0>e9oQz>`o>X4JRNM?TPh zw+mYLFQcVpM%eYzg8(*pc`Ve^=%i3`H>1Kec?urQSWX*z8TG+f5E$P!cscdB#CQT7 zs@Me=nZP#@8vfaaOxkpy?UOX&Vq?Mox&2iy(T_dQ{@TfC?C?w6{!+y?=YHHBf9Zc} z`nx(!$6oJ^wS`{Q_A!d;OyBrhjak<1&y!;UX5kxZJi%z3_2Rqs78Xk<1*)xGtxE5t zJj6d1y-V5sjN#VPR@yef;3MPT?`Mp`<^J0YKHR>dztJlBgDEav+7=GAdwUA4><>b_ zh{|s_TG5&J`_`kTzix9wv@+e-3zAK}J77x@?e9 z0om{UL57M!h`EOt4qNo0-*>=3`~sGWJzz&Dsi{A>#OWesNZ&PpS`0P1;M>Lx1q&Sz zn>W;G#nrc5j_(K5%qtB8Z~t|rv0NEK4X-kK_&=ZPRI}9wPx!%ChSI;UGMY9V7x&RM z4|{e=IT3agMSZz84+XElC+2ecfshpkfQVSQ;|70N$gT?Z zS)74^6eu@FiGhvK%6o=mJLzF#G@UFL6{57hTkA|3cB$V>FO4+v%=2KjbKYwBl~ciF zBad#<3~%IGwNMhNgws|$UQHB6IDEk3626 zKdlTS-7g;kQ$#mUH!|klZ*1{P7qKkp91gVsrCwHVI6S79 zcFZu43*rHzn3@hV+#q(1X!Q+7iSi8nc!Nke<*w4l_PM!sLV<|qL^f2JiZ zdy26V*;e%;y7>X4vtRl+_@T2SFph4%LC}{sZouS-d28g5)0KClA=1n^)OTq8q}G_K z2QiX=o46>waU&M&*L3toBPwU_J=#9QXhT~cp6_z-P`^)snMMJP9c_4=JaZo)ABZ`1 zqo{JkBoCJN+0jOSAkc>tc+6<;6?@%f=wE-DF$P*0q=Ql z^YF&bGV;7)SGX(;2Q%6}7RpMoku9|va-n)bBaD>ooPF?Q3A*+y21 z+**X6e}K;`+Cw`wl?LhD=4MVBc$3jMt~LzvC)nCtSc)vTyru zT*ZESoU2^*UwKJ)40-5Z#$A$)#6B8?ne&?go&hE)NwK6M##k#|Jkglr+Hee0c>Fm! zJQ2)e0R1`9=priOP>Z2Pn6$eLx42J0qzIRLZ{6 z80wb?NVr8yX*BUl=h7R~}MAYbP1*zcP~S3mM6k_X>KE zBNz#7lXtlZ0@KSc&$jZ5kIXwyX#Dwt=U^WVN6ZdH#(SgdKkyPhz_8%IQ=84CL-kCKaX0LnV;=xfzm%%G+>aza4}dG+jIRfc z)+Tc>`B0oW@Bx}dG=CWK$~^R-k;Il9=0MwrVFCXG$vOQXr0B1y!IU_|Xe1a0RZbDa zzOmpI9_e=qZb2)i7!P7$Hx(?wCp}7;GBp!if!0hF)tV<*LVY@iN8k&l!{}f6Lc=V{ ziL7c}{(vsGyl^@XJS3*GM9Kxy2Q)4h41d^^3tA_pk-15m{{^d{x2Fk_z;v|ypG5+8 zl4MfKB0=dti3C(Wy$;V9GhOfu|7Dd~wB&lD!pE+Qs1MO;HXVD!e^5FN)}7(ba)$jg;xpXkKhALF3^Bvc&j80gWv9(EAWZhB*PfqP{CuAIMNt8qy38FdjGR!uUC2i) zJ~JCUWI31x>TQyjuV#Vx0Q78eX*=6sJ!|4@80aonx1MJVZs{O|d=1-X8}-HEb=xmw z29ZpY;V9~bT!DJeF`Apq;4Ux+1lzQ{7C{<6~G(NcC z*|?ENq-0gpH`Y^Rk&$Ixxt=;LGWuJmDs;Sf@F>*tizOR|Wz>y8IcVIEdn^ zEpRpP%&M+_FqMDP%x8>(B&hyL>f1kJ@-{q6Z#`qM(dgWhMhmFWW!rGNz}Y81NrE~s zv*9C|6h79>K{q{RH1IEe$*HERQ@`;;Cmae{!)W4Ics4CCjCMR_REq|&_Y}>QR|mL0Fx8d zg|eSBo}jfg#yH#dNfFxdQLkKO3$5RI^ z7t;^^znP0Toc}f#G0a7_P{G{|3i3IdfD`6YF{)z0v%QCRhS(ZW^6jJon)bYL3#<`y zUoe_m&%w(00_JtWV(R+>OordZUVXuMS#fRsp7C%oja!OE+Mfo!=}V_YOCi0$sP(El zo661>HKoTpeUU*23L5!n{HB~M=sSk!6w)eRXp*l2=ZRW-sFOPqlBGTpqw$Y`?n zWgM)b1fGh(i%P(Noar8|j;~PnzOd&72Tq8>bJ6HWu@x(fkz(*Z%x+F=($c2VmY0ne z@X05FX+2@xRDVKZ*UWd*O`GJG}cCIhIlDr4d`1M3*=q{;@;ak2(Z0a^F~vH@Kmv4tw^ za|(w-AyM7;d~zRhI>dj%TOj@u4g~R^$Vaq(qje_C!8c!CFd3JUdo!Xq>Z!&%I4joT zih^-UEO(s&XOjW3dh3lE?%uk0VJWFvVlxeHy?f1}Zy25&ZY zwW?aR(-ML1gUi`8iv?+{kuEDJ?h(z%-Wzsd?BoL2^R&SvenNGHhYEZTR3VqW#HUaW z&;VsngZ&7FFO51I4*+~IE@uJ^@+m>WW8zynGwF z`&ycc`fQ`dsHzNufyP~+)FTq;FBbsyt9+jTD)cb%2tbRs1L&)1@timqOaX&|`rAWD#Ku)a2S)He^LUSa=~nY?$n(vk$z1) z61WhcmEN{N+T6qCr;BzN&P!iOQ_bXM7*&-aauf0Bb#)rU!p7VMO?bt9qTfqRSanah)Sb3wEN*fBNJ5=NM-JjG-rvt==!8 ze}4gVoB>l8y4Y?PkI?0_+~pN%@hl4%S(RZh(8Lzx|YAEQ_a#%ZVLCt zH;6Fxz)NXrJ=q8bT)^Z;;;wS)QrXDr3mUPhe4l7U*o(y@G%{e&FIm-9TZ^!%v%T%d z&TH(_Js_|&O^wKQFb4uGx08?x*2#9ZU(k+K<@-cCB4}JZ67vzIlBZjTD5a0fN0oaF zXQLO>;znjn0mK7_37DEu z42w`&b?OJSvX3iFr5_u~_F6aFllLwyFipuw$cSUBD?Wyrv$vL}e++$KHywKA`|fnO zIyH;7J@N>4vFDW}gWY2fESpvr8=g8lDcA^WOI05lR|Q|4CPig9Ac+lb_19gL^62+j z))Tu(d+qxUbo_&?H0*O?Gdo1n1|IOzz=w}^r4=8+9V4+{_VGtXGuH$AAb{+jM#EqK zz8TWWnmOB`4`LgwIYhh*Hq9nd)%QQ9P}yc9^`EvrYonMkKQIOM$mT)>V66<-)* z0ps8o#)x{0-xl3V?-e5?|S*=V|lq{+#Yvrcu zq+`xO*TrdGf_VN<4q+};QaAx{aD3+pRZV8M;g#y}kcLX86|OOzzJzNG&-tf|Y2ud< z|Ax>rUm9u}KU#vUfIsH*CKkL=3TSZa3Y>&?)QI?Ha>Ft#McxeRaMUOaUmK@3aVm+I z@vO)|wdGW@u7tB9%RMOMDWoTl$~}VhwUZiWN|$(->2l;zf3FIw^|1?Z>L{FyCQ_rX zjC!uB+5$C%X9K?y2E6(FES?~5{Z~e_#<%}}%)JMA6~)&-p1nOc?It%jH$C@;&|5<9 zuyla{0RaVsokc{d0YpWGB!CJC0ty^KGzmp|iG@qm#7a>JMJdt(s2~UlO{D%mGrKo{ ze)WBS@B93p-;YN#cXwxZXV1)>Ip@qdpW_D*C~t$LBPJsFr@S>9DB@_lhcbVLpRiTd zH<2)-x}Jm5^db#CH!#UO4&Pjrq~`(1n|E$tqSR-8H@n*;Y~V-F4ID3hM~|N$2m=J2 zI6ttn={*THyPR6CD9ThS*?gUU!vF`5cz8cLJ6oH3JNIMmt;qgo)#EMWSNC>NK}rLs z?aO_rdl5$&Ee1X(_5M%$+{TM{^~$q(<+=Y}d9J_m@nTfohNFLZ^0qtrlUMS}XL0l| zm5<%lD_`D=%2WQm@)UpNt-SIY9R16a*WA*d{5r3E5Jy^N&10jZq+Bw=(+%*er30d< zyFnQ!9ij~eh3`jSHYoF?B6`iJjFP(ft{Igj21DO=$bmY_O&cuAENDlqtP1zRVOCy+ ziml3a=vHsp6s~D`0+keLkFQ;z(wO_!SSjgprD)2`TaplD*HgLit)L>i@-?)lH-Z$A zyzG-;r2&j^!MWZkiIUqY;K^Wr+whjzjr7cB?uO%SxzB4GOvC`sj5N3}@|d0XXlXbxvjE-#_gw zW48a>^7yyCd;F`1zs-CZIi<2Ftx9MtLi4OPY8$02gc^P_N@;{5+O0G;ykns7YNuWF ztXp|q+DMn(=--X>TC~!LUusn+K8k*bMsM}?g~celxGsA%R(Tbj(=;FP_bXbB@mS@;y)&b!tgdnv?@cqdkD<%;6z;p%qP{X6KBy(F z;hvv&Go=RQRSr+0!l>vLzUqkzlG?!mGn&QH8x5a{pr?}*xa)IxU^iV$QqX(8FppA) ze~WB)M+fSjyckhwWz~@(q#xrWDnHiZqT(N(7)Y71(H?RqD?2a^P9-Z(2Jb&TlcR*4oqrqOuyK-FNl6I&1okEf+l3!vHg=1(6ms)ZcUn4Pr?S!+vlwQt1*P>V ztBS&fiRo1o8O3*1l)es5C=5$MC~QiE=jJa%z6(3I+BDM$_IOogI0#l)RS*mr8FYfR z3)Il;IAra6)db;O{}th8Ru_cRbFcq9;fkv(HZ$KSaci4<*jo1!&l_~+u3L^0bc?3+ z%1R<#92{pe^9}77da1JVN|2BS#70Og-K(s~RQOCB_lk%Ul$bvxj!RncG^2{rkov!9 z=a&*_PZh;O$7?EYN;$rvwZI%frNgzANn%IMLq%V?oirv@X^Ra;IFN8BmEu$-P;4+H zi)0eiU`ty!+0qne$Xy?(DIb`_{akucl{6()Qs~JvB}wcrR}|G_`O*sN8yrAt&;>c+ z_JM)EDoyzquOCo{&juP_N8$c}Tk0t9Q1Pg^6vNGpbg8~_Od3xoS}Hv-?9*B)>5f&4 z1LeH|^6gv7*+1Al2NB@_MVl9jP2QcY#BuFGQBUy_xneArXgoe^%D z-TL8CZxN%ups`Z%!GQM*WU%9w4|t$SuczV|Q#75L?zC8uQwr~gT-#!TfJIE}f3&U( z=>^5cPJsN`PeRlY-t=h=keoZOjgnAP40{8H{R2HVKua+Ikz0hBh-*-o;5bG5(kn*N zy*7#^_~AK0j)DnATRQhOvRv0K7f$$ZxAe1K?Td3yRigrcaQZTc@1V za?yxnTHj3JgCi_A-<}}F()g6H5b8XxGC$|g60w_`D^VB|R_u1OmvLL&=1N;U>!s$( zBoz1CE8P7*5=k*KoK(AmQXMDzbx`V?7y7J7fj*}NR^NeCl5iDz+v*XWs8y5NLFDPE zIH*QTrQp#n4dY$fSe{q#|9Fp{L626%gyiuN|5ti6^MBfzuJ(_1W}Eg{dJ*H${(s(? zK6GXgcT^6b9meR26xbQ#uq!>=S=o<{XScULNtu14qG?SR<$c3W3uXU$D~edUQeYaN z9MFz(x73fa%3`p<0Df;>tS`MQWEVq@kxD*=K((-&($A7(ggqJIZ~ON;DYU!N6iQ4+ zvkl;tzoo%f@Y}_4ZsZKswu|LQdC|MwmD-Y$TXGGFWQ=gaqx?Hl#Ku|SkB+uf`cbT# z24pB7mTNp33kdI_c%kvY{J>40ep^R53qX7b=K!n&AXf$v>(oPA?S6$X{DvphP}*qU{FG{oaCYj{c-gJas>M zr2~!bqa>NiJVD2)AR6gkO4FlUbn5QgiSxhAs!d}vl_cpD%^Zvj=<73;G-(l)WGb6c zyf<1Q6m`caD}C?u;oW(}Ors6W08saY5@gseQTW_!C+)qx-a#QxD!t+1qwfy*y+vVb z5dCR`_?`76ICnaI|D^H+23DoMN(PFT`YJh64&CajaFV3Rz_l`Fkh z0iN>LnUWY>wmMLrZjk4`!L21ps#3x8yx$1yw}J!iMi@=#edRlo5vn?9XJMj2wHKBny_qohCDFI2JW3(v%hlm({HJVO5t?=z}%V0${WN)Nl zgB6eA@TW9muu{QLypalcd2SQ^$V)7;w|V*QCh|OkGS5ftcv-lKhCQRC@Z;IfC`pFx zZy}aVk(-~xj2vxh#WMh$#q`uh8RmAS9Qc4%Xw!Xz2#jV$BbL%B7H2s1@G|4KYmF^hA3ImI(qV1Gn{)Sec@WY=t)BDl#Tg-eKU z6p)oP#ewxUyJ(eleubxPF2CnL)65+l%R@&l zEWe_m14cPsqvj)&4j|oYBZQ>&%?PE6O=H1w_1yfX9?6xv?OLK_gX~vB#J%Mn*AHvb z=wl{#?tL6uY{I|I!b7XNLh%_jQmOeDNpQtTAql2ULqzVyk&rY-z&m!d9Oj~=ZmVq2 zq3aMEFu_f!ql9E>fpe_f>2+vbP0P%=T{@&7;B@#XCGsy%oiR#DH7as_k{ei@P}GH^ z5j-OsP*J6Dw^IXIgVj*R?kn6aEO3;~ncGRYTNI6}(~DByvsR$_&nZI;^K7(lZ~as{ z^>suA+WYgK&J_Kw(h1Uz5v!R9x9B%A)8U)`t|DDU$nGRX>ok0@7Nfnl4RWCkjeY@h$xDCUUB2`P~a)wI^Rj1 zo>w}>#2*mNLgF!jw2|9JuL`0@#Sp)6Q|qi_#X7U%>JT zKcE*BX4vAO&mZgO#wwdmmtJ_J)xt!gPcnRb2#u~b)|tEhLYx$YW{b@{G+R&4r4yQu-N_0){)q8>w{*mdr@olw=X_uw)G{YA(u)v{N|#<^qtKq9&K7L7QV7S_f zN(?SoJDR$J>DCZ$4~)^w@Y+=k%>d0FT*c7V8}13NYT$Y2anv0sN;rBPh%hMnBU3z1 zKJ9f<+0KwODjTm<$-480=8BXGj(779hlqx%f!~%U0S!?g`mK%!*|vZMfWMzeKvM~l z8x2c#IL0T3n6f+}9NrWV{Xm71YYYqWh6sM9Wrz=PTnO?8Kafv6!2o}NZ5(=kP>q0w zfJpU*Q2WD8!s-6ABh8idTQ%1c_-U4}whzGlaa$Xb4>yU53gS4*{yVfq7d=7vN7(&k>t2YczQ+I2QEaUjQmP%y=!HA`-!vJRu;YKs^Md%=`tWszwL; z7ezEWmIt2$uLH0{$owt31D}RPY%E}#ZB@GAtpBxQ9wNE}-vszU7vv~2UK0j1$v{Vb zvOn=CRv`~h|02k!wO8BT;eBAHoSyF>Z&Sa%d^w`D4|*m#G=~9wdShymG;JSdwG}B;S3da#ZAA(eeg#$t!kn;3 zJ=rlPON;;J99CP9woWku>kGN_tO5SadHw~{!v_>3eSr2_^*+<~Z#Z}ePH+iZs~h6a z&4fFe0rW)N$TL-p(?Ntn^?Y{#cjEL8bd+G{M|**9Ihj4ZPyWwq%7^zVdxIhnR z1qdWhh?tp}rNi_*3ixnMQr14I+$Tc6k8?)64nAjqrx67wu7jiFVy5XFunnz`92w(k zR8C6GddFih5Li^F2eQ@P>tP8B@tB7vhsm}MUI%U1*C-O~0)R*McFDXj0|^J5AqY7I zl0#Zc{B=Q~ow1QVTtwaqo$@a2PvTIE@^jD)$cqg#m8gNPthHCy}P{ zLGFk!+0jA8ixJL`|ATN3cwiVG`x;DCsI0{TAWI*f6UK+WZdru8kKQD)`=~cb2Q~n_ z*&|KT#%74D#qgn77@Hx8;(IVQ(WQSKn-OAUU|eW`v7xdClE9f*wD#qGpDT}}9eA^U z`U!nRZ;zfiL$oJIj1Vz6L-YoL8oVXi;QV_Nw4o`MMvOp!*I**o!w&<7V%P(mr%-)k zln0Up`}ak|I0?ig7jFcja3icUbGf79Wc&~3#b#L$7T3M0MKuCkSN`Blz=Q_?YZ7x6 zOs+`)9|w(w=?)E{{@6Ylxi}$WzAoWqaT+1S%QV=IP(9TI_xF$YU)6g`i<$_>72zmS zp?$eunaA7?__x|lcc`r8UEnMrk-BFjxw7!F9YZYq^P6eo@p>v?8b`#xQ zGnX{%I%pAvrO&QZ#Svn~8SoiDk&+=SX91*(_qndE@eilIsUO5;;kED*eBNWni?msc z*8?Wf2yju^#&JnQcoBlx4&IDO&MynVzp!@6_VUF+=yjNO0LSo?$Up0ZcZxpB^>hP5 z0ujxlRZnI{=a$~EOK4&^ULs@+@j4w;Mn;k#PhgzD-;^dyMBXtjmxS@E4*Y2?&S5EZ zBuC(ILTl+&-by=v7$yw<$PPIg4**7Xd3D@q!;Q&N9z4f}XW~{{P_m2P&A-w{H^(d9 zM=6moFB@svs!5YkD{ABt6!E9b(q&Yt{|eMb zE}=U8w`y^qe8H}iE8UHekb(Y{cy|_;1jo5I8^7vmi0n1mp~p2L*^S(j5c`ZBkcS0v!=5Z$NA4F7&hu)V zfGF?`eIp}O)--E7+N9&|YZ49CG7VRsPY)eczuX!CVnXH()?{82mv$UzFbX7VZI8ii z$nwveEG||A0eBML#b9_4y!kW&aGXAkLc|OL0%lkUz!7C>T=~?{B4M?up(Cn17@L9} z+Ih-U%vbKj#Mdeyq1o{sG)ufO85iQw)mYSx`b^fQipUY==o=F3iCm6_KZvKD^iN1F z{t4o+1BP3`wD@NXn31T07h}?4AR*n1m}45J2^1oq4SWqm0CJxfNod4Ms`5Nt&CnuD z6rMf_99+)x!SjX>M~4w`QK*X#5A22~+Z}*tGU5U9aqJA4p+W>YEaD>6D*bXGswQ)e z6v!*{w^51B>C6IAK@OcqYdHcqpsAiCfcG3nSTC1~(7jqn7axpziU7TPaY;bWcsP&O zvjddNs9^D?@-;2@_IX-5A!wP1Whs#jP4drMEg~M?0u$~@ z@mmuqO?;UOeMF?>nj@xbpkq9BubCE=#g|OH8kvAGh_J?T0S=OA#}JY7r5Q-bF(}LD znHJHkX;yk>0Wo&`i#K}jA-(E>^d_Rs^!Do+2ZTr(Sgw*${udQvs&csqos0}=T#wTN zq&c<9vk>rpKpzDG<}E(vQ65lF*he_o%hLwvnm=FUxRS_~29OA{9fVnZ0H9k8_ZZXVf7zZ-oKiiOzYo<+7x~8x#B^9?t$RL5qumTJ~ucNw;AhEryn$G+r$hW$*_r8KdA1wLK=m9vqwo z;E@=yo>^@}T76h4odY^hzs2j~-^ zP>V(60&5|a81F>}hXSdecNeUyMH+BwsH`FL0|D&|YSpe~be1q>HAf%kEHDXBC-jAE zZW7Q2#oc!`6re^AGbWq|+ty`>s>qm{9O++8u(&P1Z>>pPIn-(2Mnjv>Bk!g(*YKmGY?qs{CcDKG-HlZ^}*zb zdN4V@)&>Tj9bZ$?)=SPT-qeTb4WZQp=|#w{|9g6iED5mC33`7MppDc2-|4LoaV9V7Y{UI72hQ22H zb3cfO=mY<6sszj@>Ao^#x`9BQw-J+>LX7`Wu-48d{|0X=ghUaj!@vz>o z0r3f=H&X}VD8JvIq2ZC1aw7f1{UUz@r0nts__H|t^#RfU@Boq5;i3EesU04 zGA%!XYy!eaFb=5YskyFd7k|;>9ss$8UkI4?dvk@#8g7Za?Wn=AQv!HN{yZhxq2ZQj zI3>Zzok01^o_Eq?7kfIhxS0z^6~Fz}pDf`~4-UNg2fek(`Nj=7aIFtQgeA8wVB3s0 zR8Oj4kgqM397=g&1bp1cPy^0xe$le5B3qlScAHFXZGaL00PWOlD}K zNSK9SfB;l#TNJK_2!#mtL^LpTM-kP~@Hh&0Lu675_Bb0Do~~f804(kRfZWsc_mo`2 zTI98!S^|g9N~Ul+=ClQhU9mZr=0?&Bi-)-J1Zn`!y0l`CigdBnfOyIseb!5kEB%5faV;Do7tyJi@B*2;R@rDm0z-+i zBP>z$^g3l?Fb?%SMgx#c2Rs`~w)M(1`uKgN7ksb+KY))$56VBiD#r2G4yIEdwoQ5a z7Z)6e^FL7b2kqF3L}T)%Me%Tmn3#*v3U|BwTxBHu?85St=TS__Q=Y-5peLlUn+*Bl z)aCmSyJqJrm2?-=*?yp@uW$~|c7NHi#3HXbzKD8owFz3RaM+;}<1Rmd9eR4PQVo7H zvlc5!K^v|c<(j%{X~{|@DNuOO0Xldrl`K}KVbeCvI@?JTm%uRxZnpiq!k1;0Qi(1t zQMfl`FpVBv3MA<_hb2+1rNVEt@lvI`_M#Vs4ojk%qjun3= zOk11-VRRd>e=GNIgn4s?Ak5kon#ZlcV>*j-wx140$a?}1O%VceSa)4=$U!)$yHe>c zoRDHEe5K+H6X9@>ATLbu$`QDpmUY!lMJwTp@(LYasZcifU_+}c-m(8zJC0XQcIdd-XDUZaMu+&G{a6_!8IPD{ zD)4oP41&zVw?1G<7*D@{0_W6pU?!zR8$lTA_bFWF(`ogm*dzaje)<&7H0M5_zfl>4 zf(CDdrw{io+9=7JK9Vq*KG~>LsPepjD)@K7A&3g^q5%9@^#ic!qw(YVdb+<6Zg8(t zQ=bxxv4s@#RCex)mtOIK4*-YfyH3$m>QlVvFyvWy2mSMXp^_4$?c4GGu~XL>y(?4g zV^5l?N|Dlq_H0sYXl+{hOeeh((cD3KMM`3zhN8s3#=BXO@w5=ipBM(@xHQz5u^BEM z+~GQB!qpf+63bHx$+sC(tSepGjM-91jkhSn;OP`jWn-C(wr)|9;dOOl3kZTTberPl z-ddHmD^GCuqwMWUB6ly!+pbjSB>H|k2K9D+cDA!xw|o(6_0`1Y++$nlxd(6hqi z4{g=`TaXo;k3OL*S>!0nIgQPp)cmt%%Kl90gI2hy`<~JmT3dM4O1C~!+-Q0<6)ZXH z3Nmx`1Y6sVKV2lPVUaX2_-Y_!e6Bb}7ajI@QRe4Lg{0^G8w=WdA(81_#Crz*Umtyr zfs;)opX)snU)~ZsB^Dxjr5jBwR2t*$iBPE!euSQ>fukgnuGB#oMiCfDI!!1NZeCuR z(+ft@RzGx1rh7$#+{rZhhmMu0>EhwszrFbvh(P#+W_+RauTyF)UsWy|y(Y~i%OD%& zDSnqMAmMVCtWqQ92~_us6#FG66voS!a0J>#5nm}jJagAqa0l&1>0c|&EgOs&Tve%P zawjJ(`C6Q>^bLIOHcl=0GZ`tciOpcsKQa|`afrAX@ft&)V9T#IsAk8#_Dc}pz+ zH0N7I{);Qm$!{?f6bjn`9?*ws?@(f*{R^^gTeWGHAztVdFC4JQ@tQu<>!)Taz3 z+(qvgUw?=iv#`(Uslo#Ic6$|?H?uWCfUp4qlz4|ggiU^ zgH6Nm2fG+{M-FYj40pJ`bk55Xsb{G&6u&c*v5xF3#UqZIsboxM66LKhhEs8f8HiZR z8@xer=M)a<#mcFw6vjRmy`&fp$xnbjSQeJ z?P448CL>Jh3Y@Wl(sM=04gE4uvSjhSD{PaPvWVHSiRbwK2#^K)n#>LuaiPH>G*A)> z95Rr$tyC2dV!u+|Yf5G5SL&w~ldmZ)40l|VlaBzzL)R1zVslfwTuEBXWN8Q$qjfZew<7N zml`5~jkv^g8hjf<4qOZ^E~H<%4VenDdkIAdM{Qu|pxfSlBV6P;9oLCxi;19au6pp) zyQ3`U0?*|;N*x1as0w$L4WlP=q^ zy2___Ss_A7_u$|SeavBEaLT-=#Gz|v-V-rU(tYJ=G`>|uq~@7$Um1-nP|8|72>COM z;3s+RU??Sfpp-9mv4a6Sp9ciLb6RB*x<-GFsRpBlK|oER2a?XIeQj zF#V*&@uQM1V*t85kEy6YneG z^s1Q+L=_j!j({@z)|6yB-8Zwif2LZ(;JDxiYTH9X{9kDpO+4lgTE#326FMy?Asx4X zhL?Zv!fe-*E?HPo@TrX+8S|A>FNX4e0djB+E2{_UF)QPNUKT|8l{71kq#6bmL8-H@ z*s0LUG9aetJ}0(Z@A4EWi3Z9$9n{IjoS;wwu~n}i0<7K6lt9hJ1kwxT*%$}Q+;3y` zAisI2WW|+kxsL9VWTk#ZGog!7t04A* zRD@(E%!4wZmQ<4qZ*0aF@(T0CjN)W9HVR44iD>Qn*@#>WO za|=NqUkzLmlDtN(x(oRWqp~#^7$ssL0&tpP?1mJe<5=k-d%L z?MiF`iW-&KL=>wlvlA$$S7C3Uh^Wd|q1axPO-3PCVYVWEBu))Uqa9geM%U$vUH`Qj7IM zF|ihV62;+K47r76wPI`nJA!NJiEKdpF*6@2TxbdALQC{8n0$hVJMO!%YftOvF}G`bGGAsM zs*!AQ9HXm=>JrpAYvTdVdSuZOEGVPihaF*mH0gWj10r`Fx_hw|d6X zsarSO(CqNZNS`zgtyq)SK7xXpun$dq#`^Ns42zd68$RU17iFxrSMc3x%917XxgVn( zt9{<)ti5ENaRFlZZx$froQ$F=E!ZH#YRoyMDDs2eDN-;6wnTS)NNP(~JL1rf#TYAb zW|{v8N;V^qa7jzX?Tj!ZQ+V??ofOiFZN%bbrtV`ax#*`>%w7J1G9J8~`t|Q-YQ87V zMu{?;iUo1G%%BWvP5>UuegwVs(HSsAne^)o2f{ zK0*$iAO2L7QDE1%XSE!MCIfE9A)oXiXb#N@ql~TJMhZZJW$hVXdBZv|9%lba2gYTR zQys+HhjwHw+G)r$n{)&Mu+nUe=~`vYh1czg07`wNwj)^XP~!(95ck1ce6b_r=Hk%D zw53&q(znAw(8_rpITnkl3HG6~Q6D(z)yG%^7(`7l4&@A6>kQ+bt=t=Q>bovE5o_>~ z#~3$)ny~ohP^^>UI|+GYW+!lhbUM)mPu%wBfG^;6ut9fp0U%+zuL_H^PYlLSdwqza+zc;~fnjgC}nsPfs z*~sd`Y@wXq>%!y@4#Z>2v=`0m!fK?P`PzVI>HdgX5WDWfV3mb~o?|J7*5X|;bgv7m zjb5)r`$7_&^m)c}=K16PNGQk6;gUgSI%|q5RcLm~)kyjxoqYvsO~&~TbiADW_>+xk z!}|HyhWP3!yRWn>t0YypaWNc{U|)D>2#pC6EXFI$PXQg{9{FCfpq6rdI~BZFp9rr`a?Vqkj%|(hpB#UT_3~ zU@Du4)Lx#!7$51r4ujb+{>V@ut*vy?&LQk}Oy0#FhzHS4S(u1MWF? zEI3%;nrf#r=+EJ-kzsBy6}>Pi%AnnuEaGVyti{< zH+O85ac`NEJ{yZwBb_dfW%ZrfEAd5KLPqclPovTBdA1Z!Ircnz;y+&RFpky2b6*(8 z`bY<8&p1d`&{JyG!OHUjdr=ziTlxYsNz!iL$`@H%@%5Kq(!M@;JWCMWJ_qrt)Mh+u zl{h}x&<_5*203z=5O%Qnj2-g;;V1ajY04kZI#|wEMB^hUtr!~Sw^Pf)$ni33kHKq( zn#kq>glW{vtd`-rF;^Z^3%2f$UWQ=!g|FKy5M+#BI^^6r!)+K*vtMQ0Vzm5KmT3Fx zbVXqerO^zFj>q$uiGF>RrD*dYS>kZb|r7xun#@Y zWz41cB})#!>wrben?n2}#*B?~g#veLGdY>@Bu92O4ixmgp3;X&p&#xtV?593~h z5So*D)~o2@+F1zFh!*6RBsoQ#3ak=}R4^2x&TR3MOh_ zGQ1{qgJ)i2TX5uko%KU8;dM3`oqOhW_AH7nZ?Lho|MvQbzrNeSPdxnMW>jq|v)hj$ zF*vq+hI^3*cQPA*$G<<7eTbs%G&TZ7!8Fz%Md)-^gra!5XkFDe*)Y6%?wjlx@Ma@< z4_INpn}L<;vt%zQ0sZ7NYBB?3XfKVJ!D>jyXu%AuB7JG(Og0+D$(ig1iXY$NQopbB zEL1`H(rnfUB^AtJdr{=P%|1d=?;Tc*!aP?rYt3BtHIBy2V~;06A2IqpdLPnCKxd)1 z(9iSO5Ii=0K9(8WbBI`4%x*3gAn=4+W&z*E|3KXd#MXuPU7jl_K~ED#Sz8gU@M5m&w>Dji%ZAo&vmGpB`Xkt65*mX$kTR;L|2Ur|Y{0D(TBKa}C($On#n} z@vS52;u@w%rzw3c>x8TCu7#wrfKIMubu8k+2I@8#jHlK*tSzVMgU1F$)AV($8LED} zj&5H#t!HfwGbLc6T#Tg4=kM95C9m3i z14}gAz``3H>7>jJY!@ClXCa(FTHQ^w(-Q@(reT4RbF|AxG zoH;F>PWW!9$eKMTtaSpcL7^7Q4sk;+8|s!~Ob~Z)tuQEoYHVUQ%Z{C*8O7bglc{Ff zeX9W?P57rQx{*m@(52Kv}g!_?gm z?SW0*Ehz1^B*hz6hzp5SYZJ3rR%jQ(SKUkC8>d#Pop#@Bbo>}dCpO)1w-T5CLr2`f zM`;}~1rN|VA`ic`j##AsGIb!SQ9FREArUbh*#wEYE0v*$%0>kbf)xRq#ydp(nzEY` zH#4_WTzj}D&h4a*n^_ghIc>C@INc9Y>Sh*!yo~vqS#*jx{~ri{OeeQVKDCpMZx#ci zU<|eZYHVRu8u8a~0ZEI_f{G&iD@1d6S0F|fT_K{w5yS1bb;~PuQFzUXiB#BVrNzDi zZ3l*#0sbawVWvphvjvTsNhMoYbZ>Dj!ym!@U^L|EqroIE(tk-}G+={TZ;<98ZPens zHTqx)#z3_=R#3OCEJdglMF($01{$@9ZGg<>=R4fsM>@(op5(}o5q!eq&mWAGJH+0a zR*_1#2ZtlO^TdexzYYl@&oY;bh4|aeG*8L*6>-vWF#^SFZ6orc>q~R>LsOMBZ=f zyXn(CjAvrnw}-XTt3^}wy)4kYbTzNrcrUAAn#S#Hd3#tCW$k6r7;t7{FOG52+PzT1 zzoYO$e>~|k?_&+QX54%~J7<{fprZbdM^e)REXgoJCf2`a6m6fH$hC4{$wa{%de1_1 zfOUbs0V6e)H9P6_-97-h+GGsC<1;%Xxv1q2Y&bszG{gdUsTKXevQ4wG=SFju&vN>n z_z}G*t?^|aV)Z4VLCPY(M zJ;_GT9c9l+>wPDWLS97m7RMl)q|>{{*l2uVBo!^34gjU&*uG28-4F*%HQKcI)sghX z<(~Cv`%4L-)}S*(O$fTB?wdPC=4L)02dic3@FgjfH!aFF|MO^*Z|VtFh1(MgPD1oE zo-oUlwu_=@VF?t)6STVomb7_vzl7yLT*^7ks#@k7y*7M&PO~^CeR&$A$3W*!vlk87 zNc(<<)kf_(XIN`)oc-Ypo6S!TIg4j~LGPYry+QlSXR+y5{Gl)WXFdV}w82JoNemVc z6gnae_5Oub>;AN#5&7M^{uO`5uJaxpf}6*6fsg2+G+2ed`k0D;fr%XD`CrhyUuIIx zU)hV$s%$Vtc=xY|N04Q{nfkwWA%ZUWY6jA=Uzt7hdZ`t=ee$&>aYFIG_A8|4k>owc z;)1Rga~G#RxF2q$`_~INqXFkwrC@%~{EbHWXnf^DeR9^fTQuQ&8^e`9iw|G^FU7>UCNaI_=K~im>65hQHBrxjH;K3+Fi<6 zJM{V6WvouqV@E~o5nu%jGHi1^^2)=(Hw+rUfoM%f-WnK-IQGoL&AVSF9$x*5czF9O z;^9NCh=;Ge!utNl7R6p=)%iE+fxa3(3%*GU!sXw@u8Iduy2={2oO(XIwn)GXiAEL) zn8lCt;aWqD+58X<`==(}(%+^Br)nu=@HQ+N%L6gs~{X?^BTxZpr zquHriS7-@t@E|Sz6AvAxfH$z|Q5SYu1bSjj9-z6`*<)Z6C$6*BD7-gVeQ=BV zB<+K!J>mwwIh|%|CmU)mkFjf>OQu^l7~d5&{{db#o|^u_D!DI*A+?0D6_49m3h&)2 zh7}Sv?RZmKIa?X60Bh8Ew+jux^8n8u)O_k zCb_cYrrMX4=Tgc03tT z&cxjN*zM_wuK5b~g_uaXf1d@~%625lXW=a{&!Kv)Ggn*XB>Zlq){w@|8?3%5rOzu< zIh0~cN#*$pcabcqk+eWklW??~3c}KXB_^ra(1E%e)J}X>gThs)uU&moKWIqiA}XfLWltW z*s)lqk9st_H$qy@ZNfp^>zqAbg;2 zWQ00QGG)p+Hp*EwFcN-FnY1uYZ4}HiWkGu8n|1I#SF0l;CQ_XNu+SeP)fc6s)YYZ# zbbV6laLkpe8W42sfq$zNK`)MtR3l1_um16aOVQ#|G%gw1VS_{4E(5@v@SHF@a%pT7 zdj5O5AEnlFodb@(C$u3qzj_dW#98AuqKyk93GfI{4cbxz(8J1rILS#3kEb z-=^W!@wc6Ft2JxgU1IgOoO|h7^|m1(Nj@3iD3ai*VTISyFdPRsHc``PwZHY``6Td? zP4q#uTFLOMf$n#@9!1BZRW6^5iovio(zY1260E^zV)#&|=VI07ShUv0s+CdvpcQvf z1fQ_V`hskZrJ_3DIRgc@6CQtpy2Pm!rCBs44tI&pkii@CU+L+lvFl4{ZAc(pPHM)>?qwgkIP%Oo$h(>Sc0=SF0kTt|Eb z3ERNu6N0F?f;p59Ca5Fer7b6_$(Sc|M#28_N}^ir;d#P$?sk~QBmhB6%g;P|NTi!C zC8{>;wMlPE0<|_GNiD>u=eNJxg2Fwjo116u*-f2!d3Swd;TD$XQ6sIo_ZX$7s4gn@ zs1w}Z-P)rsbDPAk04y)FZ|$Mnw$5k@b)`5YmE;hE8y&{6ABK?^3~xAt{tvV{nx9=T#n#RZg`{iP6!HOdS%!kIoC*DexI^^$eWj zPSqG3LMO7lcEp;@d8JX3b@H|(*^R4gc^&A($*P-QSY9WR9Jfb>AM8Ys6yt9acE2?RRb%B(#J8T*#DbJ7BS!4N>~;}SQm&Aw@)3l%Xu zU#5&B$0MmU`(`NBs|5Ztlk(p}Qi*Yu)Ym!R;9iSimDPBRA1h@>$H(Rtzh6OWMtS?P zJ+!p4I=#H3jIzI@jDqI!dyhv`-mN;kqY7@-afbN69wOYIdtkY*<8*5uuOV07CW82xsg3h*z>S&nR~ zn{L+$1}Je(Scuc}$m;}&9}rtSc~)#nbvjj5<%@b++h?PVCdZ4kw|g_t+UKpNhD+t2 zW-9+Q>_lM<%Aa82*tEP4|Fp6bbsv11Nqk!P$+}J>uUGWh5I*cm4tI8&%=}~0YTl_v zQVo^66PDSAy3GcRIV%-W9VgCYNPAs0@Y&2@3?7c#0SUc)@F0v_ALrs7fB7Em;qtRJ zDb;S|VKMviO?>2JG`<}$L|F}y!d z&x|(ms?D3C>VZXO!P>A_B=25CuQU}^S2q<^6Pu}3EuV9XeF$;$4k^t*-_I$#nc4`& zX05o=Oii(D=C#5pr`|9Zr8QTdlE%=i=4vPND4YfY>Q7+Vtzqh;`AD@|w8sej{jy28LoKFHaG zij#K5L*~k8`0Pt&Y*jiIQ`xK`v6Q{x4gm1eLo?7rskd)cf6viO;*OO$U&V=?mVIBv zCG(|xPVa_Q5U8W_YjU4^F%;G-*!{^;WfY{(%jQ1fwqnO(;m1NtL~g@ z7RLly(@u?p-KM1BkZ6e3Hy6{KL-%S(n<>0KgasJMsXm)!Q zh$x-ZZ}=+cor&nBPU>w4&lftYoh1le4b#=*_$*gfbrH9o6y&Xh8Ph!6V$o1a>3CO_ z8&7n15r4Xje>I)}eo0u8b>j(Oo;YjPx4kvv$@_-)gz+S^o7%*>aDiQ3bstd?-PFcG z+wwdO3^lMhzV#wq@21u=Ei}NfWMIJr7jz(p}|QKMK361JLlK46rmTyknq? zre~XBhm0D)ZD)$9T;7&%l|y-KwB(#N_>Y}mgU_00()8?A+WGnUv&C% zfbFks+ZosYXBh_USO)wV1}aONeV6*F!weSe3RwA;pRqC&-c6=ZU)BJ%Skiox!Qge@ zWd7?Q4N_F@n@kH8wFNJaD(X!v5eJx>9xS*&c&CN4{~D^=IDVPYp9?@!kYR}sZlOG` zlX6t`WkWYPHzP3-ZWfL~Y9hL-_8>^C=i%CLvJd`kvl-Id;<@19l%!Mcz- zSZ(dsD1GAxtD_`KUyc-OqdAR6JLeBkbJ3!_A*#pT7hpd|w5RY*+BHN?F`z6RqIQz@ z`kFqgGJ^@XnJ8^kEf;+{Oy%Cmori;obfpo)A>wzVBg54V=4PdBZ6Zg;daQ8a(u^BIzt4J6yJ_9W_EHsVypMRGrG1ghtlxI$3qR zs%oAThf1R-sgZRxQi`ftt3g%2@>;B!M(i-a3B4%A!P7Ps!K-R=R5__HPEuoR_fL6v z#4@lGCSykQq^BmU-k?kKy|NRo!!TTsG(~k&-ek2N3~*LJBC*M^8vQ<54YaO*%`5cZ zyV{-UQ`8!8AGTskAFsiRFa-+@5^}tT=cZHd*YK_BwCFXJXH+VAO>F|w#lH?M@@;DK zx>`#R50sOOjWF#`d|iD(>gK!ty1JPse_uaMt)wSeIywzzg@JT;nwkR9z$)*jebdpP zCezhgp`8AOM)~an@V$kF;f3jH9Z8{;)71p)=Wl3(N zp0wq`llr`=R?rq>zCT!cfnIwP%JD+l_@-JDQA-iXf695nkpOCSwq<0(Uz2~?v0ovC z0G>nwJCgbfRzG;b^E1?1RY%IlbaSc33Ne|EYuy(BUm)L)+Mb9NM!M1ssk$}s%nbDl z5a`31AY@nH_cPTf9&Ua1Em)1FQ06T4F^sP*v(%R0#J6T)JwZ9{ZIA_=23~-ljEE=Cfw_EWFC3}S?K104CATh ze00y-73ALnNPa%WNyF!>?(+WpiTCHM`D!z~@*;&3I_va&VO|U)=vqedk-8DrO0{cK z-c|2tODkZ}^re;mI!JRDXiMwv1*(Yp30$b2!KeSeP#umSiznZM;L(jvy{GnpOxS1< z-Y}a6FM^-;8Dk+6aONont+JwIe$iI{6NQS|#DAEH!KZaS&; z`|4aY?$G<9ad$;U-_j3MmAhbB^VG8tS1;zNqfFRf%*mazrJ58KY?mhqGlZkJ3^0w_ z-J#75sD)&iMI*UgO0xRG7ONHmo|-W}(?!*ns$&iBL{d&vAP_i~3NtKrVO{jz+e3oL zu?!Nik&>3d5)32%@MY?LRG$Av*GTI5p*o(+7JEKaKj9_9pQ31BUYiJ-m}Ixo$II2< z%wMgq1a)-r3YB31#uDRp5?V;a$NUwYw}PBo_J&h(`o3MGHsllW{yLRME-hIPqjNX-$3#E z25|1KRIdPBG2J)3KyA-Go=v%_cadYoxASAQI_%VR{S$QuDu4DVSo#!7->6nH?Sb=q zZid&3_e|f2aiWPG-N)a+2E=CdEuQ3b^nfr|P>AkXQw74&tS#!ZQa9htEm%tNoXXoU zh^NrzZE6d#p&Xc-b|V^6Q`mOQi*#Ru?HDp>4B$1NSmg3e{~YTMI(l`X;7MhLLZ+%) zq}G&(SdlndQl!=rKDEOA`h1ZZgcayIt_|m02LJszMaw1}=uc&DiuDBQVRIpR1c%Kr z(l6a;E+Zb~s22>G&*<;IkN4QXI0F6P9^wfP3lqNlFQDQWZtn1X_ND4F!m4`k8w~TV z)bCq$d39J9A~*_`H!KKSdJlu;!{8pF85@cX{MQ+(xdW4a8E_@AfOVx;cBm70|M8PZ zmA6xT@u;0bri7oxm9{R*+X(`%@dfTu;d4wBx?9xgzFSR=yYq1+#Hwf@kg%!=&W1k0 zcLY-gb#cFIQo7O{k$6{>G2fuo%#~m@%ndaZ?xn1 zcj`jy;l1>|TGudTFRlGvona{bh??$E*YfhWJzy8z=Or-e<6@~zej`%eco+M9 zXqSgFid8K_>BECUd5rymFSa!22lW|@jhjEHGa;y?(C_2nOrHCr>c_EyX~!YrrVrp8 zs9lbBtx1o#s7WNE9;Cb2Ln;qUYIaDI?rKF1il?zSXTAQVL9PIaFwtiIzqfx5JN!aa`kw>M>0HhPobsVWu0cIiki{ z&aKDj#Hw|vLlm7kqBhgV$~L1uR%#wqYoYbEHThlJ0mgjslU3BiSb6m*TECV)I11r^ z4V^p+A#wpF{-pNASQ+z^I#nMP_kU7{#PROdL2aFUIEbl%X9i(gCFhv>B&hn+F?F&u zhXx+Ud@iI{j;oIc^M2Xvl;`ZXU?29UeQ)AMTG9p-WDcb$2QQP2u2@h z8B_s2DU&UOCV&Q#bx;REgUMm?+t)OGx3_gr18FhMv<^z?|FuEBr3<%C(Rm)beEWfL zdja8mT(1tqNo`_^iS+PV_((ckyL?C7tcmO)wm}{K0=C3#gVIcjd@q3V?xC@(ZG)bM zLyseH(ErEWd&gH*JpaR-o7{WTb3=N+2^|thXraTQiWovbQ9+ugfJzk+QG|q!v;-j| zHKBJ10$xN~q!%Fplp-Y&?392gJ$c@{=iCD7N4|eNuh;LN+?=v|W@l$+XJ%(-nqfmU z)l-^@tBbgDpA`gMt&68rgMM2m)uoYMQmi?LCF310P|@v|11aB23PIkULtavS_VR?> z&1(}O)+2h{^&_jdv;rL+^p+BxX%aLcDfmcL9rp1&JBl@%wy6NQnEBy3iFz5 z-@%sX9UqAYK|oyApnM-GRyab1KGJ9`-l@J)4dd3+6)ZdGBVVau75Jr4uu=a&I1@a6 zx+q32%nI??Nn3Hc0u38lIf#bD7<_2-@~ahd+WzcLeP>8U3hbO@sWTCIxBw{%n>ODBNO4%-ZUsoS0bfi-;3th1RFwJx%*Pe+N-Bj1N-1E6^gw(c1p0B1 zPM{gk*Gt1Wlb#Ba8o95;VNz85njDCuc~WC2B|U>ByO`yZ#Hxd@4(79&`z-h_K-*_C zE?UC08NwD4L`U~|4ri-~=~e8hlvmI!1mhxw5mA_bcYFUE@NFVgxD=~Ya%d#Gco z>xP1h4D?ngM!bTig-VnB*I$ga`ip3Rcmr?CG_r+|G zr^|=dJ3n+dLaK%N-QXDZGfII@?##I|K*K|9q{Pbcz7{D(8Aswfo2V#23Zfa2lBW^* z?8SWATp8D!BEf#0>0qQZ8d}Ncw5X!=O0_N8hgn9(E&3O+B5Y`;y;A1+p*o4}?9Rhi!*Tcj*)m zD+NZm_$2L0^Hd%;scg@I!Q{K!rIRiQevlHn$>N^>8z6gK`bZb| zIvZ;*& z;Oqd$+1P{pHgI;(`8Dnt{hvD|Ug9B_?$U9ktpGr{15_THU)?Z3Q>`Fj4r@(#-qQQ&}?Gw{Ltab3`6@e&Bha`{pU=zHv5oKu6OnYlvJ~*@?(s zDogo7j%{8Q=^JKtpC(Inkn_jYq!ze3qg|bdJb}LnvvQ2#LLDlz~c-gOp z6lU6F#MsWU8`Zteb5LM3E~VZzqy^f`7aT7mdcUURjU_vwCSQ4_n$i-`y|I?GM>t0Z zYDvrk=ba#x;^%RK#G>O~OvJ)?o;D>)vsv`9r+Af3Wf1kOEmedp99&ys`JX(+A2lg( zy|%Oq+QZs9(ys;-p#4QhMvQ~`e$^mE%>de5SLy}ZUvhW4&E-fdZ5 z+J=7rtS_C1i;7OBa1nkzh4nzK8cFY)x&nwl1QOk3)KYFF)#l2^e19?bzNT<_H->y1 zM2U^1X!FB`?$$sY7*21DwG<(DgBnZSm=ope#?mw_*PWY4zaW%4rK!ZXX#59CwP&Nd3)OIY{n;aJ^0~rK;Qm(_ad= zO>YSu%DyXPcI*n7;kvrgO5(dhAtIO^9-Eg%=?>f|9a>9i-h5Z6f;Es?=}THm$uZaz zdZgnj-mWS=)@YDz3zfE(#$&O2uMH=i{5Dd}8jN+9Ty+;q{4Ha|@@Ly-Xj@9$_vqeM zYR@rO;=r8kwYE|%H*K^ur319Nxi-@a(jcY|zt<7#D`sHXi;R$L?K(*n-QbjZt+VtU z=&DYdG*)o4ZAz0CxM79u)J^aEF;a-$)K=KsZhTe>x=GQMc6}bjW(D(@tsnh}V>*kg zj%O2ImICdtgulvRp;t9njIT>PDM!N|QZ8Wmu7_lCGrA$WngN+GTLtIzW|T?0dvlmt z^pPgHW3~=RV1!ZhSOUN^>9i~r=+hNu+o(w4f^j{YWIC=&M`HBWef0(j1^8nG{x1fgP*k->ay~0m1tf0K^Q$y%-qaz;V z`3`t+E**JCYRftR&Asc|5qu^CrE+}|J|85_#ZX=tEPcdIKdjZdiA@;oK|ck1j3mNur_n9Cdq7 zdIOjF?@3b-)6;l_RESQz-shdzI*pV<1)j%+28mKl%KAY1Q^(UMqollW;OQ$JPgU)B ziib=(YiskNgoJoHHoAT!&8o~q$1eTlN^G_rst_xA?Ey{T{y7>wR_Z{rMo50tW3)67 zkQ^EfNFXKmQf8(UZ%Y^>)xapJ`&g;6A?rMQzW{Hw$j}BoHdE??u@`1ah|9J`jFXlN z!dTinUTO{N(`|yp6R9%3CdSt^VuEzXfg?7Dwz(6fV8OVbv-_q=63+1Al>TJtb96du z3S?$y`gRI5hkOnx(yvXGR^jv8r)r;n@QE}W)IVsNPW@|fGG3QS1=FNN$fR4-q-gIS zkJ~MrQ#5Rvq`U9yOqV*K@yO{?bIz8tw8nw3Aiti@8<$Q8>nuEMZ~UE(%+P09hmvMU z!_D6?BlVntvWlTs?w%pRPq&5snjs~F2CC1L4%@{OW{W4(a>KlxA@^CDcxpOJlZZf8 z2xZTbiXo$}d?|;K_eA(^R%S_&&q}L!x|t>UL$xf+0)up>$ZRg0a(Cn%ez@ziW+xEZ@=L`O;lX&aMSgWz!lDG`&F^7fQ`&l&2I!;zAH{4oz4nRTkFJ znuXGATs2$7ulg+l*XB^&#ZqEhZP)Mv7zNsBLYQBm(Es>HNye~d}7GkHh=!BgaRob4d ze?o;J)X&=(LWh>XXuuhbB_PU?^k@k;7NeJPWAUY>+*mxalpBjRmvK#_!!m9tj9msk z&)Y^zmq`yD%I+i{@a;4ZCeh;6QXJh}E}6&5;$*!LbCQnL|4?jMvC_TgulT2%GPiZ>Tli(X}$yc=`J5+s`_*eeY+X_HdOT)P7t0) z8J_9VT{;!5{AcrKmiE^EEjg>CW&un+`O0Px3Hc*f(c~-y7)z1novbJ}kUeCTRAvX4 zW~_Fq>+@Gj3Bd5D|2GKdxI!q-aW?*U49~TLi?heNF)`N#!!?;rF>H;*W5SqyMu}^k zP&Qf1p`7RZ(DUGN{!>uScQ*caC>Q)4$^~{Pe_Siobl`cOj^~98&mq)soiq!A;@~>z zDwdkH>vbV}O%T7np=oJl>%q~}srv@3XgNe1xO~~UL3+(TExyZK!0kffMs7zf*S}uv z`AC0-OCRat3TI=-kZJEm&5pXTQMaQqui2tDNm&BG+K>-L{1n~Im(Jqq_-3gNe2b4a zOP>n2DeH4-C>DERi}V=J%C=y=+eArQr6$5OdS@&2#Z%CRy=j z@E0(GPLcG5R2O?|IbTS1xL5v^K|HWsfLFfg3&;b+aNPYuQs8~~g8CkmD$!V*^dhco zRCrLTjLHM(xHBbhm!=D8w0pbMvb`pb5$9@`#~-jEVzJo4QDCiPje$Jgp<|%_v+|fX zgg|cdrKCBNzH+3!*2&-Juc^3#W>t+xC5qT zH=4%o{k|nmjK;k!?BdqAm^AAPAzvz zEU2)@PH7D==e~<$uF5Wsx#7Dw=2q^~F?ZdLxsqKP=I$SWaaCtGW+IK=-YpHm&xPGm z=QpnSh{yF&)pd^lUlI3>E8@QSdqZvK$&R=QdvwH|aJ=cNda`v5h)bkfdn8W>_R9Bg z?4|8>!QRNdQdeN_DDKtKu?G=)+O=1^N9PQK5J|j5J7OaWIAS{#aKsiBaKy%b%@KQ! z;=YFQFzRc#cT;KJ*U}acW9mMsiRqIdeBgW9vk&U(ihWWLmi-<3KwzWj(LVGCEp9(Y z{QLW*_u&=1u^-P2RQmw@+AHXt16bj<()F{!q3 z>6wbyy?Jm94uxO-WPN6wq#R~xAJ6d!>Dq_m@(C?+@ z?03`m(j_R+GcLk})RgSO4&9lX!UHc!PmK9C<}?|6Sz07OPoCqRYdI1p1W~18X(j9A zSh2*zSwc%N#<|p`L{q?F4p*f;B~secJvRFRHZkuJr5&VOFjbSTNjD6IHj4dGn#y7V z*8V8<5vG#YPttk}#P*X^$uNDF?cz^Tn8U&AyMUv`e*Qh~7ru5a)UjIS`PQyQE`6kn zi=2&}YggVc+S;|_7tNu2{}*YoefEbeHV+UA&(l}%zogaK2 zoo9_pAL-&6XJZGnH0!#C#5LD7B>sHe1&JG6+A}0>u=l``*kdDq3?y!}-+w+NZgS~1 zUEJhs>;xj+kF%PwCuKYS9iHAydw=^9r^yj z+3)v1H1^{h^YY!Nof|>6qjx1i&{?MNPw5F*=EPspJz<>f;5`Ya$y03??n7qbqaF{X zWB57q5bH=Pb$SH5E0^A9KT~K4`bHvrsc#_({jSu*fA}CqwSMg z6Ia?kskb94lWKAj&%8#5%COOgJ?nC*4VU~bs&LnGt_rU$$2Ra^UqvAU+^bYru1Wpt z1lAMOe7bad@m1tb)j#pIAZWu9g2G{PesIH=;x5 z7NhrPPLwALvi(H4EXeFo?PNiR!DTb^oFF$w!sLnuxf0$$oxV1HKg}?S#XjQIomxEX zWP|)Vq<)D(j%j{khux#}gAR4@vmT{qHr%f|fuv?``uFb%;sf1?nBgYZhO=v@n;gwC z$JWbYH<>%&AG^tK8_z_G*n1A}iAQZZcX>YKb+}QEHx%!)H8;u@hrFgiCfRI{c85kl zrB7gO=i(-8!QY)^@H`Udx(2g;Sm3&|@xRm14SkqfoVMT%y&a>WX#bo11*f&0ZkC;f zp|6K4?4=s)EpZdD-*$ffd0@Zu6zq4LjsG3?KmHE;AFi+m-gSkYndMur(w`o3eKrZT zJY`?UBn15B@^vO_|KdX#dyn6SjJ@ZC=XnNm-=({B@xHV1zYpet*2I;WACRZF%y;;j zdCT+ci)+ARm(Cfik2$P8p4ef1;{4q6z*^?gUAkE2Z0vxQGJRyeak{`q);3PJUbS8F zk<;Nhw$<^I8!!Q@_{+^88pj)PH1|?4?eLfTLHtHpWQgC+^kRU#3YT{Rq&TE8 zckx5|&C!}*fBAN}j;6n^QoRVd0W?FT0}>0m1yM!>sIDu`jF3A-FoG;Lia+Kt(ew%? z@-zK2{!|nxhu59QJG2_aA9tCM?|Yv8DPK?U!TH*ACT`E|VyAXrMH0n-lD7+V$XGP~ z&`4PeT$*4IfB#WSMRXuiuH9phxJdtiBi+nm=Lhn4+U4hB$6MB?H?y9RpSjvcE%;_? zl$>ZBf1Xt&8yh884VwvtQ13-cq=Q%yoFyuxT~RVSOY|Lk|C=%v7UvNySH(_NooE?J zkqW7Ov^)ZYu`^m`8^{4M{6~$EkK?Ldtb7zdWwG*m_!(}MC*bG4l~YptIJrLG*WEz3 zYsf+LX`HM?r->V#P-ydtwTov=w4dMd-K32|Kfu*0US^RA`Oap~!(f|T`bZZyI~zM_ ziT1>640b*ql*0n97vH7GN^%M~r&}etUX*Qzi3b-WA&9tXhe?mEMJ^99cLy!4BqO+Z zQF;}m?E1Nq++9ec7M10b7`pblIDRPM5JIQcI4-_~cshEblaNzupW*h2+Qxy4diRH;tGf z2k3!pI1ui`qkUT^$kpQC6c0QzFg(?qF8oD!t2)baxYt1)G^AnJm;jL3sjf!&bZLSd zW?sKHkellMi4bJvo=nN) z_Yj2iN|Y~-S{!%0O*3lCdtps>t|R9mJIbv(a%-kB*GrNo;c`ck9IG9@{Dln(yX-$E z$t)H=ELpDM%Qh$r^`V92cIi{|ALZYX?FU#@O8uxOa?aiX<@85FF4Gr+~_=q@h+(k~H-y6uy0Z)yFG7AaM zYbd`BAiY!MS-4t|BDbolx#;ZFfpD&3`%$wWG;kuVzBr*KG?Ih#T3W6ILQNaVp3!WR z>8c&+Pph38!8A1g@pX)t47bkWMl$nh-fSetnb$3~@_QkT)>uZ`_r{P5 z-DqB8ys~;vj93lL3K~Nh&Zb9=<<5BYViP&ed-9qXc9;;KzD{+T%E2_PiOgz2+#s9BdVkgEvBDHE!}Wm3PTEC>j_XxIt@ znmwE-VzK98FZYdfyJIQR8n%|}_%X4t7umZ`YcaOoZD1Shn~Yi-)S?YYt*k77EqoZ| zBi@Ro&a;haBX{C`9&0Nf5Te+wXne5Mf?GH;eb-)& z7Bo6~jBYj{n_A?A|#WJ60}-7Gwv1svUgT6BV>TwW)eLD(x)S z)CWY?G{_q_8kr{ZJ^M{*auFX58T2J!dKbqM5R>yJ=>Ad{&Z?2=oKsO5K5(a#ugEM`KcYKl*tXp{!xnazQ^BxEX5CwE z0yio@S-@%pEMa$o=)+fKmZ@*StMURUSShbT31pP@$jMpLUjt{Y{MikhwdXZCy3*QA zJ7=xbF;MYo(S<;>^4H|H;CEZQ*X2mT!a7{0PajaQin6-MA^IxLrZAlL^pKlEus-U+ zr|{jLd$M?OwMJtK*E{A!SKIz+aVFnh`V?+(y#9|<*cb1a$34~r z@X%h+jXt8ey`X{)$0+jYh3;}gdeRHl4i4?~hIme;+}<)PqqarEEd-(!vT!T16V#0l zruu#4m%*V-vNWJQeV~YqqU>rv1=*JMl|zN<3`^^rShDG`g)!vvr3K2ckErQB3~Mg~ zVXwT&5qA7dj<6I-o&}BPD-$JO@(ZQWJui6C?~)w#KNw)AEB1CeKKbw1i^oZ(VX{M` zNwnp^|2zS z0a^P@NX+&cmg{D6Rp0&gw^GIZ`u)`^r`IDY47~X^v*ifgP~|MUc%udVWly`iZEb%p z+K%X7wx5;x4^8wa|EAr*JL+uw@1pIP)`VN=x@bG5x1(1EI7QpU0WeNGlWl-pujajn zS_YpgFmUeh|Jk89E3STcXn0bgLWL*Z6<9LnQx7TVEeM2Bhz~T3rIL59B1z9%@L#3T zj<@6!pt-4UbFJ&-+pvJnP`h`q;7+2U??7emOgG+rA@_gEuad{}2eR&eVR0+)enD<`0o4 z3ri?|C}1g}mxsz#!j_M#rojUG{>AWiL&JThpe`Rr*+b>QLg$=ekc)2g`Y?G2x;ZjT zPB6^Lq9u!z^@zAKMHC;r1_Bz>`s zA1+Tf81lAK!29w=;V#{LU#>39q0o^sJCy&%NV$PyK$8RvXz@rsgl|X6^&0(lTbsEC zn4KT_|7_-xaP{qN`^>Ru8+Wiejm$O@!65$ zG_$54Xc3`MN2Z(kQX+`AuEZh%d*B$@jFV{O7-(3jv~P^u5X?Nw%tKPC;#fHWJ+~Yy z%W$qQ9}B>~pflQ4;|w`6sU$+o(LbO?#K8}fw^i36e6-M5e3SS$S;@Hx8GyVqQt-*u z4f}tjvl;RUHl3?7<*J-EL5fy}g!7qLfF{zPnH=X~<6vt{qz2>o)obIR8)K_~oSbaj z@>`5$CLJCpC+fnonArka5ZP+GV!u=ya*Q^O2m^k~Dpsg~ znxxQD?FZskY1m*7EnO&Q0?a%1zE*xU4Pk$nA^ie1Y9- zro26$h2r>_Y(Eohw*zU;4DKZ;&<9ab*QY^D|KKI~nnMLbm2ze}sDwKS{4M*~Ggcva z|6c}{(HC_ExVK=|Oqm6!gwK*Yfx`}(>EZOsDU>^ly9N%Ksl|-S4%fh8d;h6)Wfs>{ zlCxlqr_zWl%|Cj~Oj&=l3Z{)&vJce1ud;OY@4i$0vt-Mayzg$cY9#@l{7EgcAtp-b z{cJhWdv{?JTrbSZI!U+Y$iYF+Wc&ad>xM_5msqIHfi~M{QplRb^(f-E;W8@Hab|b@ z{l~ij7*&s5tdpF-N%DH8#- zPA%g1Ib4hQ-r4{2m~-ij8AzA3CazkYTZydD+5XdV}QJLbuM2nO56`EoM^XxM&VAcwPq zvc|)6BXPGvU9hd2D(4})}+A_I{9TGaR%sFG1mT@TlbawPSQ2g~2 z6n{AzJE3@Exdz4i%XKK=jNQIm-laJR9+)X9UrwPdD`XWc7O|2osw@3C-fW z?&4K%%NW}yn`IMP*|I;EJp@ec{4H{CNVf-D75Z~@)>^&k@K1T{`0v#=DBp6F3xi{{`)xWZjbpc z`HDQnMIO1r$KgUCc^zryO*?l$J4++$S28;oocR@Bs26|5 z*Mc9ul55!c2pqlCWsF^@(N4ZewoD(YeL4G&`CjhQN4mJ&+4$e_w8D-jD%zI{9iORi~$lwx)}IX-bW=lHeyhXS5&HrG7`0&N5NqXH-6PI%6Q{p^E$?CJB|XKjsAxAV&(D4y>Pv%$vY&Ps_cmM(5yNqB}D&so8!QoQ)lTQ);2cp#2M-YR;NM zxsl~tieO!hr+%m8CWfv1P(E6I zf{D@cpZfml0!J4*befxfzv=zhZR-D6W`1|+Bb}1ZJZ<{ft@i77yi?yZGEXtE_zaI! z(jmF!(n}ZW|1F24^#2CQZI?c98tB`9hUAVNlAP~!%>Md4wf;_Khg{F$7V?`>$XWR= zEHUqMa$BB!@qxGa!w(VA2VS9G=j7Us^uYq(lm6_STsiJd@xBgikWRb^{Lq9|EBpsp zb?F?JRpsY2SvBmNx>hQ0*T9?FpO-D>Q$;aiO^Bmj=Vcb;pMM@A>i7Ktq9^X1JI}>d z^$WOHwuu#R??zoNK<2EX%nR^kjNcc)w=mXT;O{-WAlIq&zBo?L?(BdE#^ zKG7?kDp@JA?Er5Y`@QT9@i*;z?pav}tyY%)o^t(_~h zUX&wzSd8E1TtPg*d}AFh$`ggp=$ngju9M`Zxg?I;3^pP&k za5i?Zk3*)}>2Idig!8?iZG6qt+fm!gPP^{C%knosKKU zb#j>L!^weVR=QCP8*dOrmLSgX)MJ!LMwm~_63j66UwW268~ltuEs=kKsW@N%9BLsk zFtOAv;4s1QkV>Eaz}K7eKR`oFrRG=V4)~dPm9Gv*u5v~3r>oqlSN9r!^Mh-0O%_|V z%u}n#zVn*w={8VYPU1}y|9g!UevwN=OPj}ip->g^Pd+!E@cZ~Mlki(Hb z^TG`|18Zoubwn@?y(u4X|Fn)Fh;mmAj>#QU9wXGD!nReS=vK#05!5QD*k~)bh0Pm$ z<9w-nU+2!g7!^yFbNRMh`HeU2nXNtT%;}{wCwom}i|SS{d%{}X*@!p<&ArO=)#}GT zJz0)rUIr6eLA+W;$q?kN{P2z(W8QcsR;&W%%)KLb0TY+rkz>s>4)C3R3i$)<{}IK# zP$dXSxMXkh#NrsSB3|zE2Y)&L54>D*ReSlnKR{ORlelj{V2GV*oe=Y{77ataoYcE= za1=60YHE^R1P^X5o(2(Rjz-d$y9l!xL5uIo2?((=i+#7xzWGyTrBfPi~wp3B|kBUWbgVBeOi>}dLTxuexd^%1M^2Jm?9a#OT)-}mp(6E~#~_@bA)vJEsF zXjBG*6*7!UECS^7jEWWc?hA0`4*pIcF<|GbWO=(^4XSmbQ6-veQrg-Uc_^PV-$55I zrLEBG_$+rZ*n;fnZobGvEnb+ZUmAQ3KJMPuK&0QY23id$a3JcHy?9_eUVSo+7y9DW zt5`u1_G-Kve_33PXMxBna@$+!0Ln3;B#3Cf97tV!l-8!NE8&KL`ps=0Nb7u*^X>~O ziN@TbgP}r@ZK1EyN(ddra=dHhYrRE%YmP-Y{^6&H;mnD))hzzCg-1A|E8Wo(ME={_ zg?b;()g7Jprqd9Ar4eFhR{JZpYJ7hb)k@&#G}$ZPBHy`5+n3N{6gTQoj^t}m!YIh1 zRAfr1xYHC>(OdL#&RrLD;YGJAB?M7SV1n0JZ;@A}ga)c}(sP;E-g>rCEo8)A#1c*a zP7c~KBG!7P-nfY+JfY3)_25}?Gxari<2NF&wu zR)FHqf_6t$RDJ`)$brgi{M-vvTJdSBNSpn-1X5a%QXMaU5TvAnfoumu6r9CKv(*e! z-ejCOBSK-E*dS7|@>Zy}u=`!)`ixXgptELC3ggA2Q3}hU9~iALUQCZxhO(}{j#VlN zSZgA30(yl~xm5`PY$0(BHcE+8>fz^|IAuF1yK+1z8ykr6iq)+ne#;(gIWd4u9plovziAnIsz>!J(y zulbCLH?+1+u^J|>@-CyIs~%&>Iw!^ZU&{(@`ZMLf$_g#fYINN`lEO2|XWmJvVnm@3 zCetmAm}!r({q-e^zH}OGpA0zkQ_@m6rK4nWaJq59B zh4xZxBIxNO%1Q`{!?IftS2@s8bj!#JVIi`x0<`#NE1a_F=OlQ_z%t;{j}=|)A%-U_AWbua}V(!e@Od&3M6`%DDS9IFGVwT$W{ zDZ|}Y8c~?J;PrcmQ%X|8qgL-L!i-cm1hGG1qR=5;h^%g~#8(g}?4`R&$`;fk>S8vA z(w=09q``>#cMr|=e&8l}(J#LJ1F2eFrH(Mg_G(?FvcO>ISG6RJI+s2)&nv|V(foQ! zMF3MYDkYx0l9UK4ucvr1u=0!k3|-LvOXPywR!t423yFbV^udS+5%f`gys%85WTQEh z7S~sL;`GzQ`bq=CYNW1fpoFm!K%E*W^NsJuxub&6?N#?favCa0fGoM8($5FAlyp9I zi=eois1RDQreQ70s#m2AjZ0AqFq)*Y_d=;>Bc%!2#CF5THZ)RJK>5@4Ql#`|>yFhf zL||6f1~*oCPS&y}$_61dXLnFlI@J_1U8|L3d!-rHR$TP^rEdgT<^)#5|AoyJ8-9fL z5lmqAS<|qpt+a*mB3p1`st?V-_6?kPaFF^!`EE^3_L$cpcP{XihnFn<__mdZm zZKI@Nu{qgBX^fxjKl+D~wXKrE&NpvvlftVyWu7XlPNjZPUS2ps5C9ja8>V1b{@5U@ zjR;lGu)hW51633?Q<#tM{FK?(@`DPl{6PQsl4Z!dryc2jsqB?ecGIzj{3O+7m*5r_(TzoSwUH(;U@(yT=RqGNC*A1k8FDmtntSneKm6T@&()t&b8T@$!dmchBta%tsKORW& zr;JXDJAX4$dvjqY~EK_T=_1;Sb5ALa$3 zjFy+ZlcF`T}2fRk|AXdC={FgF_Jvsx;R! zgrzs?7fUm`DRNTaR!GL_XPaxXHzNS=S7yY)s7(_$YJqgU2*dLLiuVMN$A`PRx zb07Jzi@3P*2x{=U62smv+4B}w|JM~H-KVLqEAfUy23j(-K8XLT0HY}kN)M=N@946c z^x$>H2NY4f?X6&n?4kIAR?@F^3G=96S<5QM`B34{*3fRh??7j*MU;CM`USd;zEI+>D0*4<^SxwYkkFiPtK(F`#h_ql@H!+n$>w#i`- zJ*eoIB`}OF7+6XwM8~PicUk_Wd9Zb1A!@Vm0NW)UIful3^_a>1aP?qxQ`}+Pob=w0Lqq zgjT<)_%QqzW;_a_qi-rr8Sn+CA9126*;JN5uS<$gB!^Y6EaicO5O#ZqfmraePq0y2 z^5#oe<_vT~Qrf$H2)ldc{3nqMZY@QvwAz#Jhk3h;T17uM%M5x$Rz5N^N0x`bo4vDf0Z*Ylnpg0&3 z<@Q@J0U*!bR%%sca_0A&xGUDufH3H*rn_D#sshefXVK*=3 zIDhfQJ&!O8Ol^iIjB*Ae05fg=<5D2q==kt;H07RgG+jpd?<&pQmxB-}`BfYravKhz zj3Hh24x~*Dsr>^z7^)x-$}Nc9q(E zpbQP3aY-`=EeMH&IT(tcsh8;R2T&ib(t{76$F0oGej!l^p_ZdSBJ&|dAO`oA&2p#U zSNtk_oAogp;AovaN~vZj5~!c~D;!}Nr6glm!j=s|)T5`5kIniaG%e6d+*ng6Wh@J_ z=2+``@g0EEf;d?}xSl*3^fZXXW@4oICY-89xO_9G<%DW(@R_5PM2NxU+qFV+i;q+i zj5I1B&>QFS+#Ag8TP?s={bO(v69z`HLT+558eh52g)^598$}2T$wZsO@IN^ai{)_Evw);2i9@PK2E##?tI&{~FUK8B$S(ffOdz`}SOs*ZLJH}R_sLD7j3#rs%JR3u9 zX%Vnv8#G=)K1?>0ii;l`fUX4-lrP|%=sFRIoPgS0N>$W$^q8bfV-Daslam7xtn%I)TMylAY z`e<9PPZV!KxK3|PQw}rv6XRPq)b`?ZC7P+xUG8@?i;>_5?rZX zC{51>d3;B!vz2Z<@~EtWNT0h~`sL=b?mVBEcxGTCmCjKt z=7KLw+>ABPh2}e)O6J!KqV{u@;Sh@6xp8}aq0%)g?cqVibCpWC=R-xl(Sf-c;Yr}X zm>h)}HgSC)1?KL>9TWA*;XJZ8?$scgnFAA(=uVDumT@J@`y#`6R3Oz%i}qVpN{WD7 zO1D2#-oscc(y@g~1e=BI5!1t{e4+9O&6=s$b2VRU<8L=Z(UR$vs--o;8s2m!BLWj#Q&jjOr z0A*z;X0HW$L%cOKG{X#o#O^NVB-VQcCM->?N|*axj-fj%bgHUG0aM)(1G-Wfh7s&t zskC^OkbG8gLaL#$rki~W=bs44-&5p8BC(1g{ij%ymfT7VW(R*kOAY*Mfn8ZN@3*sq z#29!*POakP^kkJX6;zW*Z_GDG(Tdejc~EzJHP>$f*C@$&mPDIJZ$QD-zlM2xdy2_i zSo9H-DWGD*Ueskwx0+Pg)8t3SwMttmo}rwFAP*P}MY?$Wb$2S7sjyUY;w)u6#t*w9 zw{9@qY-sjC>A>6mo_%QOAVWpNcvMe+CnSiHy17-ME{0G)n!Q$O<8Z9~L*@4W;fMUk zdh{k7gzmFW;Z8|jzx}~hFN>M!L?J+iWt&$Jom{7Qn;-3t5hHM?WE~8J4P;rbSj{(W z+Ws^gjA4}3YJfX+TMr+}1{mBa5I@_zm^)2BX+%XYW8Zu_nvN2>X(yxi3La+*1$d=!gg^+E5Y7YjM4HIhAKt zq+a7rn`!R`c*CDDENW0;&4*P%)2#5b-LOcm^>77lz0tWWg6eehiN*f`2{4IE>!hIE zUCDiS^3I3F1(h77p~GpGlH$oOP#-#s#?*RPkv`5>kcyo)rjD0|1q78I z)H*E4>ZaK%ZjsC-Spf)vo>=fX^hGqwTl16FOxS`|5jh3M{2FG|UTL>QsSmtq4Mlvr~ z$>E=26J|B^pnJcT1=8=k6i;^4V>#ttnIGzoX!KN@Wt-AMcy=mkQE}TxVU)M=u@@zE z^<7@hc%`|AwMpK}SMma#*r=ff-*A59W@Q@;TUqP!(O1g5Fm&4PRGKi?jd=cHDA7)3fbee4E``-`H?SR6{bTNwab2IRN%e*)DG1#O&6Mru|EpzXk=~UxvTtt=-%Om4Szb zEP-0QSUsG%Rbbd44MpnD-W0z_=?s@r<_Bj2k(zLrLU~2d^*7M2A|=9f^ke|j(M!&C z3Zp-ZlxBtvaCt}=ZTnMjQengQl%jyBembSpg^VmyWB%xOm9G2U; zp&inIAG6ZXJ<4u7Raj;|!IJ&(p)ZyH{s?6F6?idg$z#S4yXQWJ!A~W76`21EI)5mz ztKyu;PqCHwQ8~B#3*LJWOS$yeoADgX{}zm9k{0#XXr}bWWA1%5?Ne%?lcar62{ms( zU_7^-oz{O`1>}IAFx!n~^AK1*_{Z5acAt`fX6yGUETBAazmm(Sj`{eKO=AP8*Ze0{ zy|wLj*j&&&nBh&o zQWmq|C^2w8!?|^;)$o6wEa#12Eb=cdI{R&dLJVr@j<7{ zLXFt+hIrg|LKz6Q)QumbgDthCgqei}FT$KZa@Nz2`kaJVf0tICg!CFrKc0l<@+GAe za%b$ALhgQ@SE$Uiow)+n7l>YM>t@Ezp7fj+(kdA4_$;(_gr7}~wDpUI862(mgpjAmXU zPs$4|kD|P@5Pmb5^&du;Ld*TB@T~H(<|^{kJO$0qDer4i7s9VI9N?D+mot7XJ*TYE z?jykDJX~DIkHD*S=sc8K!-A75VQ*xeePp8I6Dgkb_&ogK+UgiaEiS+dh6{M{;%LwX zh4V0H=z01D7&?kJ_Il(=$1W)TOlsaP$6)SW;6A4}zE@ttL~S-a3Z=c@D<1=v78jK; zZGQ-7-h$%!5jeI(w$M(3QM47Ufj|D3Ch#JAV z)cw@f>XtHvRlI4shOJ?=`NJp zM??3qMWcf0DI7MOzfZax=TR!}Vo3m{QrfAl5vP5`u2T11SU1&Bg=z z%aP8PU&7;F2U8+6e{3`fhv13KI+)^N$ORoWWAl74#anwCt37RTL-EjVShX8{a09IT z_+Sci`9>e&KP?WWBm;9p52YmVS>Juygjo-`$=BlKo4_a2tFMeV;_kykDLO4wcclf9 zif<}?ss0^huZwixK0)RQ^uK+dZD=j|<7u4;8Ync@yGl)nirk?Eu|gPS`~gdIv4zW1Q~sv@ zsU$M>$PMu^nI2W(oca?{8p|m8FQqkrDg8Lbv3TlqvGOmt#}Cq#zm)S~cf3SDjcVan z<^B_^8LIj*D!iw>r7fFC@Py^a-H$1^_LX_)eLfnBJDL|tGd@hI49Ef;kOh$c!N%wcQ@-W~)9u)K(C7MK^RJemR-s)FVb5YCH1JUvGhX{8jpIh zN5ATiOn7wlCt83<@F#hTSoi!@sGa_5gdyVxy6&%bO3Ju)432|Vuxxyo{{TOt50Viy zg4JI7Ig7(s4HFBetKIVO%L3f{ThuYGvDSwuadkmi7}`s%KB zrax2)R9Qv?3RDxAuhLue$W3n*gA(H32dR)-sZ=Liy?|V&>R~&l+jZYGHh+&EGEUFj zANiD^KI*Q{W?UQ4ykiKxXH?l#U#a;djJ6roD6sk|qsmx4$fQ=r7aE(?4y+U1lC+L_ z5M7g=7;P0v4)mC~7+dT@WcrP^_$|Ku5-2DB+K$_;I)<%+p9bPI| z8cWWXhee6^mmb9l`U;i`6*Qa3sMjQCN{ElQ+FtuoFp0(egXm_*hw(JiTWy8Uo%B{S z*y`bfk1*>fjPKgfpaJl!o%O+&rjW^3Whn$&`KoJ$AF-H3z6l<7`T$Ink?L28F0Co^ zqAL~4ER?iAvZ4`M0StBK5m;bpCV1)B&rU&hq{?<$#8;tk6h{K2&~s60NrMVVKZEGLU{NMh&AIyb+i5W*Bs2Y()u_`R9aivyMJm@?PkxloqT0D!9?6p}rxuG^^S` z@V*vd|0H}!ufeOit7m01b>49)%=UGhstUq2Ta8L8tZlf$lQ(yd@pm~X(FLCM+=A0a ztja?xtATLz>w)Ta5&l0N{btv&%5=Mmt?#O7F7WJcU*wMd>y_0erfG*g#XXBDp^7@$ zfUVvow{MK0dR5gr43)#oO+x9Ts+`VeZik56SydeYs>Hr;381^xT{Y+C3+`~~eo#ZT zdTDw1D_|pw3fmweT0BsMM)sx z=MkkAovexZ*;!rn;>&`G;#7nNSr)@P@k@0znYD4nQbYZStuME0 z-h--g7}VdXrus7IGp{C>qGdDS9=cLpt-oNeB6u<}l(&~&s-@O8OxR1KYk>`?(85}3 z4Q_1tQu2#|;nXU?U~+i*436+Q1B*7xNlg;B!d8gkMRXcvJ`@7o z@H+KNPy>w;#^+CQ4QB_sbHCb>O73<2EqrAWM0*5XQGy!l{lk}5c9;b3Bgi{Z4WapU zR46hJ47N!hJ*p_R8y2agU~mWK1Ef z4>x$*1LT+xtU6+{`W<2$`|UP$pgwig?e>Kze`R?v+kuYCc|nb!822a4oP$%2Ib7h6 zL)=t7m7C^vBNX;S%>{Xf1wY2K4$mA9u2@!IWm@7-^;HF{pg}ZI(a1@tV%9+Ih!ZgS zMv#6=0Ukwn&6VjM8RtR5@;~7UXrQt!(1eDn3~`#>Q2icPgHqI)xO$wTX5uREHvFw~ z8>t&nVW(|lwW_fjzT-#9-*HRPCTcUB$au4f z+7DOzapic!+*Iv|d+ANpmUtt(smd~zZ)=LR@-SU(s#bSj8w88b@}5sHRc@xf1W<-G zgKpD@_E!Bg#0!(g=?B~2o0@^Y`{WM$pt=y^gZnXT;zSnX1Vf{~H{-ngadB{teojfv z0nV2+s5usar8K*_s$faE-&|#BL7KHt6Ew@Q^3&Er7x5l)YPNvDKV%DNsh$#$uI^eZ zwYnAAC-oJ_At7KaUPo@J1Q?26{y+($nk1~IjM;}HfWpEMcR!)#O+~EZpU#CnNxw`B3uGdcn{md^}$> zYn#8=Ow}Es2u=L&%~Tvs;rPT3INm;A9d?k6OEmo3S<2=P{f6=;_Wxx3=Y3m@hyYM@C4^|%|yO+lh^;K-# z+4>DpYYN7_>scYstfA^eRx=ZeO_hvbsy$3y!7j~|IdBCwTZe%bZ&BxW)iPv_NF5G> zTSp%ahsuf_#(tlviS%f=dKoK)AM~=!mN)l{`=i2Zy3+jcu^7N<@zAOhhPN*tjk z7=ND|j0AzbN2rnJar?E%gp3i8bU2K*V1(M<-m%T{J~T&^87%pg=3}-J^;#orXN30Ckj8&JEPPM(6YimR2$)^>xb%lI1zp5 zLv*T88$?TJ+lvg51Y#E#;S2q z5X;}Masx0DSV&O8AvT>LEvb!>@U^ z+RU`_tcN)J8g-nlHZ}elEnciZ*<;>C9`2K`JI)@_H?y5kU7W45RIitv9X}6LSDu3E zinFl;s%K8T`isR{6X#hYKitxofhK>d*0e)z`&8ZOelc47feM2Bf}aL_=Nu>C$L4Ur zujzf5o=2wpi$6XE_>a!U{|@+1e+T?0JK#UhR{dyEaT`Q6&Q?7Ff99`3sl-mGsL#a8 zx$0-&%9c4QGs%jgcSA48VG9`L=D?a?M_z;{>!=B-AETbxc2aqn)`z4jTz-G1MhM3H zCs{mt#yqtri0|S&^{S^XEK6agTy)0?+xcp;rzS29NW>gBdmuta7N}kxoKpqy4rL2x z!|3G&>L`5q!~zaX*#fnmd#dxwIa{_|q}GebC^qphu}}>E!4;NxK85G2{PhY=Uj*}c zI(@T<5B;}AP|Q*(aWRykarEY5RfaxRu4C1Ha=>5A&}yJ#?az%P0q)j&i`5!v7x({h z_ulbURNeb1r=}+-oFpebCm|3Zv``~`6cL34LQ|9$kTVkyB-mc13%*jN2rPOCDoPDl zh|(h{9TGrMq$CzVdMFZFa-X&LoCG4i-}iU#@7~Y7_n(|SGkf+-_UygaUTZz;Sy^ah zF15~bB_fb(0>#$v5|leG3oC;8P7S~T3lE%T&l&$t$|`M`{54q!8a=umIi7EV8X54PkEF0;I3q03aG8cpwjMFzfs z{H*{w=67%j-@vI3F5weidNbc)_GB|6ww`v~I``bO*q~wi`o?evt$WtRnV8F-b)Chj zv(LHOLyxQ5(e)hL8qCX7T+aqC`_3rf=ZFhqgku7J7Jo-^srZBtr>U+17=_>SPfBjB z&Mp^Aj+to?B=|C2T_dnXFayL>Jo#A!V|H~Vm{*1XgCFZ_w8Nt4)K`0FR(1=g0YPEi zGCe$bQ;K_HDf?@yof5mb`UDlNMZ}ph4u6dbhw!fSP^wYp3yp)lWXvmXV>fkk$&i4V zOFiHQsSdA88b70kc*ZNxHD;YOhfsWX7w5Dy1Dl(DGQduwy1Sg_&q82SEEswwm}Y+c zz&~q#!@34vI^5mWUG{5jimewNM6G(b>O$jBEZ6w!(ApmEo~=X00}_GS?BU{|poTqN z4fqq)BV`jj9&PXes@CThf#zwFQ66TN#(J~WDZi(SQ4S5t+iomBSWP)4!`JHAbZ3lUwzC> z7{uniWe740?`KYL z*K>SrN5=#QRqf-d?^~{lL5@=KeysWf`ap~uX<;8%2d;Xp9s>MI`d|(qB*2>rmh}v# z=)SIc=sq7RYd???Z+wdpQ0 z&b&nJ2e?wqvlwD`?e~v^Y0UuaD#3y|5Q{lXqXS)?#DEN?S#M*`FBu4RXbG_Lu8(D3 zBjl>PYOmb(r!QkO+LdgBT($qnDnV(ui0x>k93~!auSX^AUKnU1q;l^L^_0d1lYps3 zQTmTH>}C;rSv1I1{RQ}rILH%o(Q~k5R>IH|`Xul_xQIPcH}r9|`>{^5n}139`MrnZ zLu15nHSt-#hx)o8L_VeIE>~#O;;RqWjMZ!6tf=`dYBm{(hv=3I5AdIqKjch~cs~~6 zcrj_AFex}IZguv;plGSOLSfqJsk-X6c+pV1H`_S49S6B15!%T3-4&4KjXzQ`QxeY#bfiCa><$vbt3SG0>O4qNTs<5ttu^+n1 zD%VKpDmkm5XRX}4(G!|4cOeWCvqx0-`tw{f)33;xn;0OeSx9R9C(octw(-MuZ< zEh)IQd>ci>R=b39{Qhbv#~*F=RF2)C-K$-_D}WDrb*I0Mp<_o^n>DU4j5oaL<{H=c zh6A~q*Sg-|P`{)c*LMI{-_CK(z|Z^ZAv;s)(0Uigf%|T7i8%1lUqI7EuYC5UtB>)H z4|#lrt$J5#|COtSKRWBvX{Xf8-PoQrb>_o^z9IM+MZRj>A&N>ruCGC_|_+g|YkLQ51Z8^?0R=(~`M z)#NR*eC>*{yn!b>X~U3MJGJ~8)|2PyrLSFKm9;H@MaH@9V&;PxU+W#S-=v&dD?8?= zuU&Oo4|Qv^l7s@^N3cdXjo8>0ZZn|=pU2a5MHYq%or;;YA27Yrli#?8aR29g<7&bq zFnw63NPmANf#UIhhLh$+2l$TBlGiIy08f*zJ1hrGn_;f?_9UyiCu^`yK2K5QSX20 zoy88oJx%JD-&+386u3oBliFKciu+|Uw}8n0;}E5x`)y@)r%z2|%ctY4lKP9gm26wF z8Ijz%6us3|8w4Va%OCPTD{}rylZyW^O=(hoYx(>AtxubZ8=!4&*jn+zC0k*?Mdr!VmI~F>7pLTllII?1cr6}u2(U{-g|6J` z3tGE8R|fv$b$P-fxjzrfJXWOZ-@3vKP^|Vtv8sDBBr9irD0bF~yId2nTIcL?-2u(S z%I{#3$fvmPU4LNh_T24i1PisV0iX79fQ_ylZ9^{TYKnaIj?;F-o&LP(b z{KOr06`OB(E5Fe!OXHB-y7@5bSwMYu7A|O})VWmPn##xLs?dgE&^2ZparH9qtEQYs zRBYp*c}HCivFM~_6J>xK8N(<5Icjck3>q4E6iSECu_sD-`l<-%sJ=8`Tj^xn8%@y5$ z=$P#O^T+h=Uyw_+e}JPPg6R_R> zZ$`)MhuTO}Zdcq~@p@x^l&?4c$BNN$;zu}7QmDppn3Yp#(s40GJ~=L@$bp~a6nWPm zm9WyEu>}S!;e@C>>x7HBo!+CQ6BskQPPlA5geJ+ui@%5=lza6g^e(!#%!Q;47!glh z2&F4E%Bs;?umkNr0u1MHyB>@q3~Y+%+gA(E0AHO@R+skv?h-zuqA*M7 zqU{3>b)k=^#~JMlUp9o$vE{BPRwx7{bc~;7CFjUy(Ny;%=)fN>TK}@49xeU|+piIH z^&{bGRX%oo%`cMeHy#nzHxR~p|ACD8tyPvli&vLcXI07Vv;t}hAsU~!81&`_G2Q+| zIQQ$VfT>Y8BLr3ef*TusV?CT^QhvIFh`Ti5_NMeznEOaF|lhzM8=!_5Vss*Qoi8(Fs zM{rtL8M7FREr0@u?S?`);wJ8(p9|rV9!9oWW(Oq}!I5-`vfqiY)5s!MhH*L23fnr` z=k4$`Tb=SgKy%|M;a69*aT~t=UI(K1e|0r6tulloV4%oh@j#GxIE{bm4Ldn&BzV!V z&yrJV+)wefQC5z&djgG4Z> zgna&R+3|H_{%|8Zum!FTi0#-vTmvMY)GC95@BV>JqyXwil5!Sqhg4dA)-|8MN6T}r zIr!WK=U~zqM$zXX^19OT^SS~_A27<@my|WY@WuY=YRNs*?@vHLQpo#)Q2VN1fT;w! z;q(ixRMrh)h*pOL)6EO6Vb~Pg8opNzromUl-81*X6fpUU%OUXKdqfkF zf=+>UTyZfjdN1ymXv7@GZ9ll;(s73|k9rbk-l!KzA6|8-#wpb}lsSg-PhtSsLb}(W z;l1vgY52C$HEG;6xEm^PGy=A)L-m*K0ho8l;F{ix*6%f#sX=_Qe??FSkN9Qtr^6zc zH^`IP6k~gAq`t*20T5>BMc$wHL#gz&J5{O8AOS;dciknBPjjxrs(?wf^s_Q2UFmX1 z7&!KQh7gr8De_>=`3F&yxCAjL9O2JTN=scCLW6I>d26IqH(U+*!=1i?O&)%4-@x+r z4fVPSE9?k5deaqa-NH_BAG&5tRKG;2*>2(qFDII636Ds~viK{cTrLxnTf_3ur&|V3vAc9q4F&aoiOQiAx!qD1u=AO$_hf){?q=+N8_LjI} zJkM{9RrXfF(KQ_TJhkgX#$*aja`f)^MjOR^~i`*+GndB zGE^Qi|DiMMly_$Tx!qY|eeQwYnf1g!goW1?26LDR*3k{ges=o&fy@3sk7G~BSC=;i za|8KiZl`|bH>1Z4W)Uwb26I|zrNK-~O97VQHIGN~+EQ1H?=AG@VT@$FVI#`?s=eK= z8(o!(VcM9IUI&tU~|1bZcmz%qLd2TB;JQ8t=Ego(P(3X~>0^$_szNUgbc5arMSc4%Tvu*+d=+?`C z*WgVZs<#o<5f@{dIro|>*e3#JHhU7W7^O~X(B9=k4R(*V(PV?V8Vg+$quTSIJ{c`H zs%(=q$QN?M`2OebFau%)KCu;A)Am+F@L6mW}8$; z)3t2&)+18HhDIdahV|iCNf^wS(mVjqhU_vvD;hXsQhC|X?O^}(p5hx=%T0q~HnugZ zO(4Q6BFjZ5dg=rg7T}>~nN_Ae-C$Nb7(S=|6N`Q&U*IG=`=OZ;G|ErE$5wGqDsYZ<{nc>9OLXwZ@Xw;dwURkr!cZFz z+v%@{8LwBP)BY-RJ+*2f$2)=&70SOpJ%PpssN(|97Tc7`B{roBn7`oRwe?}PCxkDY zSN#I7|LvNRkPu9V&AmN?4T@2@Fbl-=xR>vg_Zp1g1X&WS`UZUR(7jb`gDL%sB1Z^v z!%aj)Ei+C|o)g{_fN-#7Z=wR5YWG7!I5H_~*4k|@Dz>RHe%mK`DAO)F6c4=DAW90s zsgH2#;C7RKYCM%j`zvQQBTnbC-CgYh_HQxm6MXzuzi(1jT?o?8X9wc;gBx+`mb>cs zlxYqJtb4a@A{3F|#@f7!4}MB+Q@;xcd6@pY>gn_AIS=KB2_aDYPtmg9RW=4?f4yytE!&959T9Z@$6s>@@W7V|0|1qMn8?CD^=BlKyReI z;RiQLY{IwnVbK5gzQdz^E5E~|ottz)4GaFqt_3RgpAa*Kr_N#O7%^%-n#7;ofKgLi+y_wiFx5wV`}ud> z-wKR46|d(jzr0<3`8>~zc=3AwzUjc~bBeBcX7EQZ8Z-7WA02$52!gqyhSCRK8J>Rg zPwlFr+}!Da;)1W99@;&|UPXCyk{K|`GMPN5Pei4OV!%YP&CYVP(kDtCypWhEHBs2J z2~#H?h4{hxVsF-$Vk6H&c!=DS2edmOR#aS5vWvF&wQOV&} zOnBP~8|Zlh6Dj9y&<{Nut!7v5Jbfvs+w6v=f8QPY|RSi{Z|ud)w9V7qBS2b(_3m@YweYh> z{`@F@=5!RN`ZKhK zpCj_;e#c}5->P+|#`l^)xf~ z=6DFCP{rGUZdDl%rtwFw;N*=d;v{WORKuHZLZc487yG4$ZjMl{;Z|J0)2jFyi;aI2+p%HWzWWAD{hAp3P487H31O-^vq7 z9Rot?%R1^lW63h=pU^WRZsw&U*hx-A*pDKM<0^`y#7Wv(SB*0KmitRx6=e0mbTv?G z8t&3_4b%j1isdCa?DSp(^|En}Sum2C4Yoo9rM(p%N}ndFlMRz8siFG2@uV-M{a6%E zNsZ9hyEOB+Q{j}+NR2d_s$>OrG#DHvEN+zDNDYcUaBP>@+!}b@l#>x*E0_z6_c}^P z8)4&g6wI^g%ek|jR-ZHYetHTB9ka4@j=`2r=h~~)46l>VGipN6-o@3L8arWX=e-}> z)Yt)qocF2yGioPe4x%q+?+L@4+P)|S+zi>^zs-L}?T;A+=r@N=0reeB<2tByVDa_H zN(y9xx%wUIgD&$PNM6de-muV_4k{z5(l_CYG@miFD&<_xw9}5~Z}@o008)m-9QKO} z7K}@AG|E)O#F4|Ft`9o6jU%gqflY?mv&Z?`vubtYFE&b=0dz>c4~BIIJKd-R8rWE6 z%J9f0Y6{Z{3~8cn$KEorsoKWEVP9YY5b?k7HdS-5^Eb&A#GOk6)WBj1VTO&AX4v+A zL)1*I$M(+Ri}4PGgRP>XW)Lx;0ZdjaVoa)(8*MNu5I)l}S!hm`0-!KD+;#(O$q;T6 zTNv=DxyB-wWsuVkq@*3^WN3*oyf#^$P%8*_BA-xWJg!c6D&EkZo_s>>NCSq92?pL( zBHytPyg$c-tv2-K6GAfzkpE@5W>o1t^ugnf84;;my8IDP*GrG}v8BwL-7*wr>$fPo z1wQh~=BhUw*UT`I9SkPFCC#z#Mub`B;E%v%xW{CPsEn1+qx6K$<#KaX+7>_9XXX&K z7HUN0z5BAiN~_V<7HWRA$A+)F8QLQ;K0(dCzNPvE8}I^K#)Oh%!t{8DMOQ#EoZJBo z9P2`cZaE>ftO|r#6mEUE8Gz-giPk(A2WbpNIW#MFkI?#!zp8|me;CfcxZ3c19d{UKEz*VWB40_uyPpT{NuNA%0od*Ye zgHMSWbKxm9j%Un{?IjLR_6eW~2W>cfCzwJPfzBkgo$85y43^s%_-kHmrv@O{WyAgI z1_#K#L}Zp2C)w@P#OiF%5#vOOkYl)t0pbo;MbB zn9r$4@RCWxf6$s%by9O7k_V)y^bQ4J%Q#2WVoAs%x6Q8so zRZTWRgZAmHzJ|lGomGbACvBSUpivz_+SI(seSu4TYy;lZql+4X`mb~m<0HF^8Yf|N zf|0QI@m<~lR`+_SAYljI=tdX$z`AK_8(#f}rKvUi5AHMxP^b+H#CJPsd79b^trn)K z1F!%-%BYB8FN0@z6W6yZ#_Ft{CV>q01YT_NPFmbmWkTb_T~%O6sbM#D2^QD$)Vqhu8vW`X>R?gDL781Jkm~kSn_zWj zW;)>KLTPMIZ01ua@p&lzDb)UX$d_+u-190ES?4^jJ`HdDt>;x0pQ_IbYP1=P1ad;W z3`l3j{ARwi^aZuO{CshY$PA*=7sS_y=><8ad)9pYtn3@J#hDbGnbk|>=-fTMWbYYY zRG*d&RHuR)VB{KQ4fCO4FRJXa8vUZmVY|y-#M_`FUKHQP{F3}OwK3=Cg;3j<)W&-E z$J4@>)PJLsVtb?8hf%-Y>Jaq6{@&;mSTXwOYvI+Y>}P4x2gatZ)B|UQdH9pb?3)6v zlo^+(HoY&YCR`Vt2$~#8d3521TF;YiV?ccH`J}K8W)LLP37b%uhmRQ zIRm8GtiEakgc_TbWL-v3|2}GH{U>Av5#=fELAr&L*HPYvTNP=z6cZ3ypn1FGgL*Td zC%xBCJ&SJxLTo#Y?XM2t#d&F?eh#|ZA6pG0MW@SoGdx`tUYeO1_~z@<#YgJDdR;Ji zRE-Rv8|i8gPadxUSbfn|3!5P!!(i3lE-9f5!fSE=eeNMEWojY8zA&ORHBK`^*29{cmyxKG)NtRb^@|6z5f`b zHZu&%1*yb91D-Tq#hqYsHepf}tE$~USoE)tO`HRZ1kQO$PmPx?i!P~X@EZ!$u+!K^ ziiT;hih676SajY=O)Mgz8RdN#=4bIUIn6wp%{-dXov`uIUi|or_1zp1hpWEus}`>S zOgnC{YDb4QMF)vdc5o8+VGQN1FAb)52di~?=%V|c#Xoazu*y!Xs3B?t{2Qr5#DADK zM4bF>h*|?DyqZ3BHf_H}X=oKsw+v(^lYCG9gwWwgh^bl$^RCVBd$DyLDh7VPl z%H`5f(UAWzwNWGz7w8Br>8gMp${4J%5Jg$k2Q^^(n>9?B0JjcPTgcvQxG4WuLy!%1 z8;K6B!bU!f`?y!t`aJIS*-_r2oE=7t`=PI@Z}PYtR|dDQ?Hx5Vz*9-q+dy72UfqYw z9v(D8j?($VMYk3VSDW*&^vlG`15Lg;U3;^C5c!-d@}`tbbviE`CZ$zYV2lAe+Se1+ zK(dYyD@X7MRX8Wz4Ne`Q3a9=D+uMgA`VXuEzm0%B6K$7{P!q*gUt0hCtn7RppI|w4dmUEQ)caNV@lquh&ByLbd;;Ml&AXg!HAE_q7n_KLVM5XX=t+@StnO<2-VA{tJ_hKjwz` zLeMQw_|(e6IuN>asg)YMqaxarRyxaSf-OI?oFHFd-*+sP-e6$gBWT|{s)J<-$dNNZ zwqEj%+7tcPd8C?-pA92bfgd+1UKO7fWTRK_S$#3;WSju+-PSqFs^LM8kdTQD*tJn= zPkzba0~dr+|IuQ#8$VhOiAQ#7sA#2E-cykVV2sK*lR9JMkkiJf92LDM;&xwtjd_4rsGrvQ~zJ%bOCextPxW` zSOz8U9H&0XQ{Q8}x*pQm1k8c*$#Od#97xVlWD!HvbN%eiPIL<23^r-fC&5MHAHO7&&

    lbLbgXo% ztj5sQ_f*e{u{H1CYOGu#k<-kBS4afdHV*c7do+vp}zr)V(+Vl9QzreH_Vl}1fLOXVIxT0ccN zLk>=0H24{Pu2A56;F`;K4j5hT2&|lYsexJ}lv+$v zZH57))CsazbE~lxIgKptl!ud;jhS`ev=t5QfLvdWi5F_@hG}YbcF)3(=S6|Fx`*(A zle3cUs2+)QRI@MH_>#W4kenPId{)${Hys^gPi8JO4d)Ys4TpL*ojDgpn=bV zE27(DGc`G)_8#MBOXxv4d%c3QkTBh-B5_lU$rDVo|6}SVPiC4et_5yIk-CZf<4D{T z4qqYCHepY^4lxD8W~lFCI3PO(Z~qI%{TxOJ!-+#Vd***o9n3W2Ak0-eTHF)BlzM}z zOO4H)NMhnF^%-7C0Ne_tKW3?&@d{05!?0uIfVEJXKO1HuT#xnKf`kyWRX^-kH_*M> zB6J1X|dMege5lxc7EnuHQF$oa^_;-b^{w} zBp(GH_Tr;uPrT+J|8#$c@lykp1;dv(oC^9^=S%5f&qUJ5c`EY*r-vuUfp? zDvPu7CgLk=B{Q4xz%e>8AI6HK^w)eS^G7LqfqIhxWD@$>#D_U zh@j;Q)mkv#7CnKKF@+0NRno~Av+_L6h8TKfk?L*!%LHkolwtXszDUi$Qqf>+6YM1x ztI0w}TWI_e6$usOzQpNmn?!3Cs}s215}|U9UIHy>68*6RcEb_$>Qan>VN`a#%t2GW zD2bTBdT<4xG1_{)Rv2uEGiiO+Lo3COH9u6NXP2pI#vhE7 zIdozSx^mXgiLF7>o!%iJn#Nr>S;!e$)t>@B#WO#X)m96W{pcBXovpD8`qIx36Vf>Ln4l^K2>nQyxzeMW%3HtLaB@M*D zbXL9H4l}STCA|WG;oxl5*LWAp@95%IoGYiDOza8iZ$&z zty-Zb^X|>67_ws1kb#nxe5Tg)l2``D6xIDyT_h`*9Z7V2i6?P8` zX$OA1k1vR@eQv-LU|aeM`uKxYs;75;S-3puPs-gP_Ara$&Y!W1n}x+}KmQ_wMvK*u zZ=h&f4f%|`8|yyW>Javz^{drxfCre@s1uC8nQ7RwsSYnM<~oqUR8l;b>Ld^hPZ4WTh9o)FYgYt?3vr>*X+3)0dF zwLlWp^0yhjR_$i~%>V|Ltj%e`baJgaIPN#I+w)U?gQWKHQhw6kQd=jwX)=B+Q$9jB z(YkeNsP*jf2xZT5Ir`)t`}Ol#6yo)d^Dp|znWKhbTW{r{+O=?@ zcg;~__@$i>n`iOTGJ=j@dU_5F=D*SD9H@T3QQ!4yxW}JgaQ^TWG@ zsemLyPtvLNa)8{$MSXxQW;dZ6AoDAVb7YZPZNR=|77g2=w)OaKL4v2XaX~EvDN7XJ!_fazE73%M*nmB%I9iLM$Xoz%njJ$|NC>bhR2fS@;P68 zuGYmsEc#r12DZ7nRQMV2j^`JgjiUZvsBHcp@`YN%TEGLPzCHm~e}UIcp_5;z3Gzac zej(~haUu0f_k~9Kg&Fd~jxSYa#xZ||nN>h_zQTV9L;qK5eanS~{B6hMjAiB`F0SC> z+`rJVwEru$W)t^EJ*j`x-{eOXW75>r_>+uD@l;yyV$EX`@7sbhkNg%yEjOwO{GD6M z?<~1>@SR(Ub)9_;V>gPKa&)6Qp&ABdn@SaTNUh0388CE``dWS#(|+7$HQ2g#In2-z^g;Iz90B-%Kghm;@dZ!K+l&|ZgBMLY z&&5yqABQ3;RP***)H;?`;^JFdSX-qWK6AH}s~2v;I6O~=t?F*W4$d5Fr?vmu=@+dKh(OAm{Wuf?i8Z>BLg5F;!zEn9U5ikUC+o*K>`BaI(6%N}(PG5r-=Z@Eu5 zD>y5*-htZba5_zswYVd5=s`FkS<4-<$>S(zW z4<|5Z3o1wE#szO7=4GyyHQsY_va{zqc9<|NmTCct6T5p55 zH$2IlRFd-q6ih0KqR9RCLcN6vuL|Nfe3`sDoZ5Y-&cG|2dB3D?0QmW&Jq7lErlGWb zFV%{NUc5FcxjFk}rM&N@IpM+gYK9q!FsqWGffh_-cSF{I1bVlyFZ%A0mI-&e+iRfr1X1mO)T3F0kfM{?}u`NEYKy~{H$L=Jr1Ztg-$jAi5RYy*02hW zdb)N%c2@R|P9fBH?A?DLsLwixZ7wvnq6u~oX2+Z}XKjZHVPUR%*6?o~RAU~}@cY}q zbTWC|T|Xm~j<$zjmYhUy9}?EM6^EeKO)}3do)SW3hg2_=vt|yj4L_UnusEXp*zOJ_ zK{d0@$~MVNJ9Ql}^hevg5K0hb#42;`LUV1S*41qr}u zB^(_sO-KkAfKzCgI^cBtX-|d~&fKt*iV_lzFp$L1q5;&LoTE`^ zo>yGLbDKGCDQl-ltAS;*CawEfnmOHT1Y+ZAW|cY&2Jb~}uN%M;OMw=I7s`;hpg`uO zytD!vNizzVIi8eVWOY~>nTT;b{e;TFXldX4>7X+wR1QXq{6!swH(KzESeOF)-VHTTgIT$V8p;-%4?UeJWQ6yaSpnekG*^Ehxb zV+a2U+|1Yh6S$eLKOWr7Bkg}DxOt`=68HIXaB~H~^?w1}yzm;R zt^Tiqn=yG7uh_|$+yj8){zr84|LZ>lqnr0tz{Ca0oYBp@{&IKte}isj{400s{|R(+ z;S$l4Zgg`l(9JyzmBG3HfNWO2MfTv+VF}&>0AKNMY`FdVe?UA(+U0K5ptzyCjC@Aw zp)l%l1?J@xnt7}+G@ugXJ!?Y|r$*RzMUC-&82K!dgBC_00kiR{8dQ$z1t^+gud0tj z^#ZgUMA}u=&t3`F3mN4_MIYV@e*9X#;i?)Q_z3g*vJa7%2u3va>MiwtRhsjAp0 z_|V-F_~zfR*QiR?+rlr^^)}3zT`B9f?vkE7Jp{7UKPz)>D7G$_ZsY6Br-%}@i9g0D z<53XW46??J)VBm;*+?Ihz!sTGf0d}yz02clJt^tMKZ0rb9RMi1(vCZN+rLfYwuAJx z{qCv>QS(ji$VxX5(5gt=660Xf?y8ObcTbX-EyMsS+b7Y7IEUx%xvLHk|5KYYW)VzN zN>y*(G0rO$PQahI5^r3V|H+T8kySjygwC#BhR)^81?81*i30f_RVVvCjlfgNVmI0mVsRg>9n4$S6EJ>#qzt2fJVR`lz= zUvXAxMdN>;73|fTw<~acwuV0L;~-xTjpM9?J+!)FW1s&!D@YwZv}j-jv$w$~mG7ku!4AYk%T5H>qSLj!{OEOW&5p~4?osH=C-277c5jUh zZv~ve-IneX@8i~Pxep2kqFUR5Eql=GKH6t;$0+#b0_e;irCzjdNU41u6U&YB)p*-D z!&ejV%w>b?iyU2#_;7{e{RKZQfQ|K65eGQdPYd(^XrH8`1P)PIypLA+X-#-Y3QC6? ze(3uYs_w7#2$qT%JdQ#W6PRqMVl(`;;1=>ye|e=he%ABOvx~^DDwTAkWFCv(2xByB-* zB!WOjLaxd+FD4wrnnihMhX)}dWjW0{4sXlRs#+kP_eWJNPRujdhM+~J{CH#KIU{IwU;8t98_SA%?+mU-y=hO zVyqS>IVwZkoOkK5+UKD94vN!;g=WKD7>-uc43*a*3!D- zr|6Ac$SGb+JFP3tPI@H~qX4WhLx8p}Ow?jgE}8<3csTUxND8cw+(ZTvXiI04mnH zS|sntBI{vhf#~EE)&k#GOZ_BAg*O@IMg-9d$M1xByAu@xbdwh`8l)o!p$Y#`4~y3b zYE)m-SuOk)#hihMy5DgSYaEWqvRaKcq_gv9zS9`mSRbU_HU@quY&0eT#N+Dv$GxK59Rhl`Vuu@NiS@u zMHy!rva)}wZV>2HcOZOJ7I+^Ffi$I&_F}o=a9q#Q1d4C0#T(aQ2o1D%pxKSJ^hYl@ zYNFNT%Sltu22m%kWWPlXUc{bhY+;F$oKFv6aR<{dZ`%5AMpl}#!jizhrM<{(sxjEO z=+1PIWWR75xeQCoEW(C*sHr9_tC`7Tg+*B;*THOnMR{H`?VuF3753{yPPDOTM=t|E zmb2e-0wON|W3~hLvWiK?*c!Yu2C+g5R!VPVdDLW?u* zHfA-rABUx-!R4`L%DEBafgOTO1;m@$faaP+?jN1UQcRD6(UJSmT%_d&E5c0b*IW}5 z3?|%ebf~%ZVL1k=a+>O#Th0DMnrh+T$ez=T5l6*)n+g2M`0LH8Td)oT6p+_O3l(@H zPxu>Rs}FKSg!% z_?3W?W-7I5t$p$TRR1hkANZL5!P&?3&+Z*uw{rjB?Bn_;Gz!VRQN1z{3ugroOQihn za=n`$us;7|x^H){F$gQ|W;5=vyo?&5X0L~{dUxZFa~eT{6noJYq$ej{7w$o)UevbW z#)U6wit*lD%IU3zRh4KDqq1jBEHV~jjm328t;KlhBg8hD8uZpU8Yr(-R4~2WTWhS} z8f!hYns1@Z2N^+hp||E^nY1L#Hiho?#&%{hCG^oa;54I;*3JDee?90;DU)~3oL~>8 zyL~io?=SdHe!91KI@Rq9bzw3!?W?uH-rbjm^wA<|PG4;##XqUNQ9dRrG1$=hC$W(o zK-o%<3a8*d5CvIu6cl)bY5YgOgjnFw0-{RL)iijrM@8`2*r&7@&j+*3k|PNIJ_xC? z$^5kf_w}qu&MqDUJsqn?Ipv0Eas1e1{#r@xu)lnZ4tGIdnbih@jr!e((2;f;rxOx^ z1FsH$!m{KF9DB6sX)T#?xe)T*jrJv%%m%~|9V@g_M0+inN#UWm1ZTa1B;d{I_{D7j zSve@OFR!3I_G3o!dqxvsI{lu};;rYmW7B7#q7Hz4FL_3D;`+8{g!uL70I^b`G{ct6 zs`%v}!#wP9@_X)M{%8Ib<`TMZ2rEZ)*O--Sy6?2H!2}|#TK2g z6}(1$J87eF{UokKD3^B9TC>;=r}R!5HUTLb^LcDb5f=+nuphfdF{v779qOH`)nn%L z7#VyMKDNl4R;OwLM0_<>YiM2Vf!B(qtj<{0`V?39#I1cg(+d|;x?$G)_y7Vf2cUqHBbC{1gF2m5!G53WZAX?XCsP9O-(?5YLHTkDtK${mx} zRcnP?%DTe5aE(&Cp&P%U$=&2`MK>pa&|OBQHxauPb`>4%CUz^P?pl3D?HWPkzWy|J z&7Hbyp@3i-m1IgvxC1C?P?HL$e&wl~)m>xm9X;yipV*rOM^Yu`DH)f;eBed|CuBGM zUC-VorgEet~o%i*hUO>!n&+-{A zsE)@SYsg$&l8A_7===19cJ>y%-4kQz4O-L_nsZk=)KjZ#*%5*?GPL0htKHYEr;ib4 zv6$zz_xYit8vctNY*#FxiWxTCMk?m&tvK*PWm zU{ns1;Y+g!jsW{jPpa{v)+9HeA2b!HDh=i%BI)h^+8|Kep6QQCX54F}@!gj@$a{b` z)_&3~U&u|{WVP+jT|59wm0=^zy4Wy?MrLcizQ3Orl)`bIO5yo=6STHySDB!VH+5F9 zTP9eVW@h*IpeBQ$iW~rzWg^zv1GvT3g*L1XfZfu*z)TAVX(5&$Z$@BF_nxRFTF%_! z;xsO5v^tibMBUL`+%M{`<6^F;aE6QLMbY+e zE?(o?6fXXBgNyrB6jzJleJ;K$igh&lEgsP=14R-oOhmEHw_L=B33HDfr!m%B|L`)%bqBf!Ln*|TM<+A1Cn4A)s9+k5 zrHuz`b#W9akKV!&7Q5k-fzj9`uSCl$59AS+U%spD5OEhGA^B(mj&Rq8A)?_pdD80@ zandjqO?5&U4~dsoX2>JNJMzs(M7?=KH3c;iOW13_Yut800=YEkMGUuH!1-@hr;^ptI`aw01K53(`;zV z_NsU|48Z&V=VqHFt8c$3LsU<*(m>2*Cf%xFkkdO>@WUx$+@&c=?w%LJ8_tU=K!a6@ z^-#FuK|m2_P5oI?mn@Go=R?w~KjMHXAK2c^xf&F6Kzmhd4gW#~+HS7rAPdn4wW`pm`?#IX5#qr2DQFV?euI1vp zqS-TC{8qd|;9DsECg$~1T%01BeS?c1h`0Hai@U|ypSie7%xj;2p?FLbTm4Im@y_Q7 zY*A`p0=xdD^~Oj)NrCgU>J3hbgvwY*s7H zO{j2cGBX8$gNTou)5H->qkPm~9{EuoA1#wd{$yCi_sOFGQuxR@UEF7*@qE-DM=>c% z;3JCz{0uU4jOc~5+-JsX(+tJ~p4fp83ZXICnwRfq=iJ}x<8%Lm{JVBm%D-!}OWpF% zhdNKhI`IEf`FHnyEz0|M`6Yw!C1WQE$rC0Qa0ssIv~&`*Sh%77x@kvXG1g7L+hh6r z>S7N9th$e+b$~V7E&d?Ls?*}Z;!emw7L&U8gEXs7mnUo7gf0Ui)T&d1DdLna2qD?3 zdr3q++sGjhgIT^+_YoO2uzgAaK1>Li;GtT)Q3sG19 zAyGH(oD_9J%qrtB>}_3eLjwvN{iicfGO+q6LfYYU5;-%qm_W{V1zW8mBp*&Uq%N6S zbRb7%^JyXba2g_&PqP%|(?SH|bYohF(|%HgGAL3K&YGds)`j4X84#*c{y}~w>Y@*# zGf|g%keZ3Qz=Oa{)MXuHWuh+TASM%a2?q(8X!%J9I|#=_UBW>w*3l&#L?VQpkZ?!2 zC?%X_Hi}ZhK^lfo%ItCp2ayOHFds_^w}`7s33rf-Qo=zlx+NS$qFcfZtbGaxb z9He0go%*m`!a*d4P{5pW370qrRi%XM!$m3KAQ#;d4kFPl;cjqIO1SECQIrx6(lCUE z&ea@VLd@YK93$mlT2P?Gv@17xCR>zv%;eAK!Uvc_0rRwawZw2pE6*IEhY9E+jqi~n zt>i3=wC1#I9(;AFv}&G^Ytf{=z|!nQxiqWBhriI^ceHfxlTsUE7jx`wt3jD_o;EGi+KK@W!`!Gp z!4R@^m_Ioe;Xmq3qZesU#*_f*>y}KqcwScCz{lt5G%Dd=h+Qo9gckB!jXmL-#ad*{ zM6(+rBcq4V3+wee&B~YO>D*#*XYD20tA@^5Y10yz5G!S{jkYdgZA-NwII5kc)yJZNWN2q>Azq%+>u2jn*>oJy?LPL+oa{qT@H4Al<fswj>enJZ6W8)_4MdnYz_n=oT9!PF(GPc?4vF`1@@9x#2 zU2Ub%rMj#Xk|<6;`zg+%scQOR*}?BDbY-QM@EnBIqw>KdX~-4v8PnXEpB|mGtQ2uq z@x(PMlVpj;{oEjw-dY8NO)4!|rEz9upVeA@<1#Tgs)B@^UshQr#z(9HqV2)^!O`#* z)e`?ibtxZ+R$~N6ZD=(kuRh>V%D7BpM zwJ1sjrz01oZZnFDQmt9bMXAx8=AvBh1JXqW>mfLaJnotLM?>eN%KLML~PQ+Yl*>| zrd)W8dS+JU>r=u*nRAZ%ZW8L*@=aQ%xicpgT6QDDLG?CEnO^w?%+#{@9|`HuTH2ZPlJLn7?XZ zu#vMt_v+MteMW5>eyDL0o!$l`d@5ynG>7Qf0f5xTwH8J}f>c@5dlx7QWvABO@C!}ai72UQv|^`LV1!5G?Oj?Ipz8PS(w;W_MYiv>XYupm zciNl!#SXzT^vGyKW?aM}$>qsO>wDdaqE6py@u;5pJ#a|VX~p-zc>G1Dzt?&)Orq&- znCpL~H+REbhQs~x&}WY}iVr965m)!_!T&v-?(c!5>`Jxw;^$X-VK1CsztZ@ zy8;oWVz43C$A-NEomU_$mB~sq_i54PcIL_?j(zqC6TF^{!XXU(SfDGBCkhhBh7X&Y zEqWRXFOmGgDgS2&qi6-Y1)4w*bPi=Ruj3W7!;@n6Yn~qLc?yQjx!!&)rf$*BK$sOc zaeP z5C-gu*gElgf&fzLE&}y;K=|t}9Y8O>LB0ot4ZqDnEZOgU83NvfR}aFMhS)AXbK(m= zvqPRK;xjqoOyD8S39d1d+cJmQeMk#^f^~UKLSEj1GS(^VXda^u*CLBA2x7p5h$$VJ6arMJu)O0&6M$M?h z7&U8mmXDe>hsCHla9D@ttlSLn@VtC+(wVP24Bz9EKz8;%G7K=)e9`QTe61p)Dpfv!aO8p~RtdBlu(6!%_;RyD(BaQ%-IFcqG5&jRixN#@)tNfmo z+`PgGboq$Z6e*9~t`j}oBQy%#Bf?G(<*0Can3Vmr!^a3e!%;2TLm(RwE6mWw>VP)x ztAc*ARjDF<6c**6R1+9bCaNAp=AI`<1T$Xt+EKVpd4M1^IB!pkomw5!qHL4DjK$#M zl(JUayH+?#ia!DRG5=&;GmSqcL`8nq_L5-i(Q=Ln8`}0`@NT5c`+@(G@&lkmU1{hK zT1&rQcE_Nl-PulT(%z+wKWH(MnCi!JVk#z}Tx6SIhyhsFANXzfs5(E<-H&Gfs4dmK z{-M5to>)g1P|xE)-Ap!ebGmY>4T~ImWz*2g|}9=5$dn= z>>4HXfox@((+zrHRAr}9Eyh;@kE}MdW_7n#m8O>o(KfG4Yw2!{E|qCs-a29fjPX>w zdoM^3qMLbGl^L@`Y*XgOWB`IOw^IfqhdDpl+*uiYY5DX11A!D_v{$p+4syQW--|mu zcI>P$$~mRQ@WJ?wej&8~1%ClrjyVnN)A{XLBmKLnvVgS=J>MC5t4<5N zGmu}ww6d2!v+g(}U0o>dj5fya{mCB6gd3r5%KlfdQhav??$_(t9?JCx!5Eu+sCe1) z!8C1(@8iP%L}ZrjdK#ytfSYpx*f`5mS{Ruz{?lm04HRmRrlsJ>Ehe6Kr=_SICAgtb zs~jbmZCU21n0IQ+x+fzamXV)YG!+NRNSl!OoQUE5!WzCfiFrjRqeB zt@{n&)2rSeCS4J6vh6T3BnG=BN@yyXPpl&6?^>+)J8o895Uuza4NYj=@A#f5WY&QIv%x#avmA8h?KE(RHIOw~PuPrxI9l*0;1#z_IOCHw8fWVG zFpWKE2eH6Rr|W-e1Av|NqwJob6&rFvYtE5|OaQ42UJ*ih7qr^Ozd#sw_c{B#i`p*n zR<^9Rc7CgS7qt?+)y+%54fLb>mw_TM(wNH{(_92C-ORxjr!NcSd)om>O|`5r(wz0d zkT}4ZeXnR88Sr2NR3i`6yFrwBMf(cPI4Q;+cGp<1p^`o3?+FZ05nYAO- zXlO|jiZzb6DJ#~Vj9%^O&ZZ@S3anr{?azWP-Ndmx{jLLRaf?2xT!J6>)D%H9~rsf&A@5=c{FmP&n;~}YX5Z$TiIcx`~_>o zB>MC(e8sMG>MyM#|9NG+!}=$+P-=Qx<1A;1QoaL1BitoebN}w(e+2a4si)#bmNWDj z@^DYE*pai|?co3EHb4*V{ngdmn04D8M6-h*mFv;Ch0g|2-4ZPX>CD@eXilH4-^VDN z7TpA!r?@zQFOH-|B^vV-=*fNm>Fp{BL-7{KPR415^nDAygizT$6+Imli^4l%UzL7G z>xmEX^&Rmc%J36;#lua_ssm#^6-mzO3u^cDyMP6!(5Aau4e(JF-PHzKkMi(rDIxxS z?rBXhFj`U35M<^1?4DK&N3Cg07Foz6^VCPV3T~+mmJw^5S6ei}5>t)LS`r z$DzQ7i=-!Fy{p|a(%bLD{STiPX*PxF1Gr zK?qU}BGr`PS021AZx~G3zazAX_{uN(T~)*z4W?y7r#hNGK9djmT^YIC~8pU9l? zgCR9bsTB*<`k4M2;-D-UhgjC8TQg#<=L9g4iq^LeqQ%w>2VjX`S~D0CdET1AJEn1s zY>wQv9vR{PIhwN~N6~+ir-qXg{ojzMhQICO^VD!cr~i$4YUbR0Bu@9xDXBOk$W(Y2jB)oey3y&X8F9WBk-2B;W(RihoWICA7)h%7*}W^p z9=rMLDklaisJ8%&3Behb@U}zr^gwae76w=uI6=@e_(6govS-ALe^ej0z^L-pdt84! z=F#j=!!Krpl21@ZM0o(Q5$jb_P)1{)UvrGgwrf=}?x%6Eapj0&jNN%v2ge3(!449x zd4(soOi?D{jL#$t_OTn4bGagQlDHc;Z{_VE{Tf$Hz%Au@zy9K#N>@G4>hW1NG% z=;yKwA8_{x6A_Zhq*51U9<YPPJ6Uf30k}ZDv6tm{!-^rWTG2PBSvT?QJ_va%9wi z4l}DCI2lBJKh!VVV-%#wOjdGt51n#kG=sQ91mpX&qNs5w79@>2hh{Km?(oozFk|5^ z`ajrv5Adprt$#S@r01lZLwYZSP?A7`6zSO%DH1}Yh!m*;d**2Y*$c-5eKFcQicrC zUxr^j!-wLJtqXM-Pc^*Os)ANEM5TgSb?(lhn8fKbw49T^|1&Hy9zz1Yrj=mAT>->-MzPeD=nD_$uugvkVYp_t?c&M zV4%~*s>xSl%7Wo)XfEhv-i(EaEvkp724&jk&dTAdIy)8$(Wn9BPfrt7 zPs^knC`;HN8mku1((iu>7nrK5m*r?SYRs<*E%7YlJY@0f)tSkL@%C>5<40Ci>pJZ- zq5$-qAtpo;R8@=5*PQI2tf ztEq3`;N3#fcXCiPFb}ISEj}>&=?k%Nh;vU;{i@8)_LCT04J$G^+wZZ1gTrIw+{3S@ zv-MwMwQkR*=1FQj<5vdCxV$tlz^D}=OaM$V@mj`8_yZ-va+1^#3!ntsfTJ?=aDcfl zL`A>s%yKAm;-nn-Y&-p)r0&EPU7xJJj;$76T@Cds?1j=tvpw7R+)B~_phO7A$`-*{q2w!+K7TK{9LD)K8_j8&T$`ehps zj}=6py`W~{UTh6D10BMFWA9txC{)u7dZKm`CfpxV+MG$e#bJcp`e{Y8#5}R{D zQ;m-XG_&*385$p*A^7M*osSkaQ+s*qeDrP5H?Yz4mr&JGu+h_3>})ie2Gvo6BriR^ z^BG?1Ov~}?IfmM}n4$JS$AX{s!gcFIS#!a$6aGHtpl3>SR`jGYg3VqX{Wp7eTJvHy z>sFG@R+Jp}*7}kh)~m(y92Q~Xt32Fc04$3e+F5O28Qc(b-i-`VVCc(Rs2*i-M4i)? z#SwKrt7)($`C&$I`#@^iQY|l-qNm0bN3~SlExOZ*ohd><^4m8^zjdp8L{sfh`#)wqu zH*RKC0Q;MqCfVQGH2MA$?E=Oqm|=Po$?(2vt5$+rRC&t($OT?kwbcI)?4@N{|0{b* zm;}n&OLq0@FZPoCxm{{~b}xyZ%ic>un=0N*@JK7UmvnD5#1CuUW&aoLrG@wZqrH>_ zUiG&-3DV^Mi<_tkHA`2=39gi%uJ#n#-RUms_crbBm;sUbFsT{9m9B`tgm!n^nZ4na zljouwxEBBoSX5_*eW8L##8^Uck*0;Jzp7rev7PE~E)5hx?voBTg^ZcT>GQ zb*DYZ=a(tzvHBwUyso-IS2%D9S^lfNt}>hf7PVKK;?~9<55nl->#ASXGhbvJHurZ>LmaPsx}6H#*j7jwK5_d(Xrns| z!w2&29tomHpHFo2-Zx!yKoRM%woS*E)!Lv&X|JlCahdJGG%C2?1Iav4uGoVGLl>aH zPHH0@toBkvX-Fr0tRKy}dmoO7og@KNUQ;vhGViU5z@g@&G8W z1>ekQLp@gGknL9I|Mu#LE&3O$Blf6Vo%^)7n;PY5+l(l=HRsCzsf7tO-rV}1t&7-E zC07M}X(Or~$yI6mA1?^?(Ts5ZZ)irip>L>5ZQBJ~M2K!z#CEwatP|2CSBf$Ag0>z{` z-LT)E8pT%hfSqg0a|STWk~boKot58V04x0(Y#tC>`e7)~Tg@_)VKsA=R0r(M}Yc z#5m+PjvT}{gq<(g_}e-fs=~O3S>TaDS${%2f^n}n;i51%zy$gNE--=aS8XOxkt0%A zj;1&93dhOLhOsbneG{x1d9%}F#OY=u1`CnMNLifjbNM|4o^sr`h^&md7((ttAD|0LrYvg2?^l zSt0bYRTZ)1!>np&Y1deOQ;ntXtE+CV9_Ie|TredILs-NB)!k;=z`Op&g1y=47yV({ z=r}+X-ngN3yCw^ySp(F{&i(LO7#WZ_fKCrkC!zPpxB7|_sal;=Kz)VQ(n7w&##Y6^B!H0)+yW?D+% zy0DE&ACYB0s2(sL&%;`kwyO0EYVVJfNzBtHXN5dZ(l!_HHED=yPeqI~Db4HzSJj^> z?*rhCKwG1try^GB_L4^7HIzLB4~0z%+)_Dm$^xWXUbh$0PZ*R5pHbluNV1Obojlzg zHK(JP8`T@8)(5yvgmv;S=MJOP+&{Fsc%ruX7k|*)VQND_ykHn4aT6qQ%W!G&oqO*H zItAI;OIP2PMqeMz=$rD6H2PX9xZ8}r8wMjoQT-8WIT(`CMyNxm+q)W7`w!Nv_^_+^ zSfTVez~8KyAclXvW|C!z!-X=}Ogt@n%><44@2;81a&hR+7Am-|RvIl-l# zS+|3$Xv0z*mAugu#ao6BSIYqjidWEy77mvJ#a}MtWwGnhKh<{K%#rH+QoC;Y6t$~I zrm>zO40E_Mkv5D{EKw{G5ZR??h=r zcxK|9`cG2d5$k<+l7{PzCzpZi#sX9mngSfZ;%UcmS6VnlHA_Sn>n%3&hd(;LRsr;`O@%0X?&S`qJm$TYh8zU&xmP` zHMN}Rz(F`b?zx2HiT=f>Zq7=E0mp7&vLbofQaP=*%~)+(c1{&>tj-!!VwW-PH%P8< zzHhMPO#O^qLS*$jGS5)=h$a5}$ru+-rACEnMaKu_pPvhz_)_)uo}!(w8pP@CgnNHI z1vkfXz)1Vi;d7G!DSH2$WU99D?>~p}d(HZf#_#y?J=LIwzO@|HdiX? zg^Hc;q-@B+VZYqIhHq4Vk0&0rjGpLh;~X0CjV8k#sEEVds8L?env5%L3 zi!;V256pmKT?Zpr2*T*O%Nq7RwM0;B~HGTg2EtrYq1(-($`7cEjotmj)NA1C9hemhI-i7$_e(c=s;RN z*nXy6yh0@&e&BE z$=+UDruMNf)6;j&w8%J;_QS|)8>0S}A?DCa$OymoXXm(}YB zHQcn}3C?@gOK%~utO5T}v-)_QraNiIhmx9=wzhVw1=hCUqwfN#?FQAEF8!cJz&=8j zUbTHGc%|y;SIccOejVK@myzwf&B;3w}16=C4xg!6aC)N0|ar=wn01vc~GADSh_D59~)!*!_ScG4u#4>!} zLOFL;;e0@8tL3Q-EQ`K0$iSRv!D^}ODO;dPTwkqb0m1!61tMSi>?c*EMGp|iFMj0r zGl)JC%>68lkO#KH)uH|12ty3Kl|)ur1cAXfVY&8neOII~6uSMJ+aPEpu7PzHt_R)5 zrBhOQV;p_IMjbCm&EI0~1c|AaHwi4mVR~sy?WAF9cMVf(tS<{whp)F`>c+JtF!ks4 zaDTZ}WG-P@6Kp^#lQ+b(zd%xih`53kfrkiYQ5L3_wL*#?NO6BMr~{JN!JbnAYcMCw;~EX(NA&Hc4-@ zze7^tIaUHS-G~DjA?yJsH7^(o&7J%W^0ULpx^8nZCR(<@;?$3TgkKfo-|t&g5$4}x ztF(Sk+NvX-IOGGO`BTMhY65)GLNwoaTMRdf6KDlXZTKg>Ub>CzM0d8S(*)L8j%W<7 z^~tj2UE|8dH2J7n(fDHkMK{?T;DlJQHe@(nR zQtr#gREY4Dbxf^^I>HdI4oc+|@`O}Q6Awv_tZYV&#*9PQaF-xx2vzMsxgZ2GN#(TK zVNE&x7sD)ACWlFrPN|_FfBFDDF{nv4rCA(AjJ{WTfZe7}^rBA3)ED(p8vns4*Y7WD zlt=(~K+_=p#ZaGvsPM8A1NH|*g_3mPo@TBRB=*ofiaRLrOak<+gZ~adrP}-N!}892 zZOQK=9IVumivfxyKXB2-?nb%$;`C$1YEAKi*A_a>zgX@;$IAkwv__Cf-9l52 zLR>rYpN#Q&q=fKs`gAc;CY_P{up~a7J)_~{ztF7K&eAliKg&`~))h*d&hv_(o3uy% zwGvX67A5>q%TxegrB-MEkxD!3p-qcA`fm;Pf2g(o&3H4e`~x#;dm464E$@jM+R9H; zg=-m99=rJ)UZ7d4A%Hx8n2I{%I3}70N9a<|N*Gm*@(iZ*W8J8#8ME!rAdtZ;+h)vu zR^s{UI*fQ|ijAThv)eL@<`Hh(@}sa=$5F)qwHdX#p{hdkL0!r!3|ZU%fKc6V82)$m zhAILu;iVlwbM9xll=DYtIh!;>D|X=gO%!}nk_8!v+4rW}929KnO;y;!&fXMMRtnQV zn9y6L)E+l__m;2#+JtH8#0e6gTEVPk;N{ zgKr_=mUZwgT!r$V;LLmMgza?eiMmrLMEN6q0_nh0>9l+MsT$=y{m0_+Pm_L}7S3?o zJ^ijY?Vh$=JM5lT$i!K9VP{mfH!2W5cih#MX6bb)e7aHjd(t>N$G{eW@B3cemw6{A{OU=+h-xfxaUihsAAjx%9q5a^xkr%ydF}7UJn$ z6BA51VX!`>5gVNuF zxqGCUd4dFFg|aYOU}k>C$G2&nnN@U|aiY9=A)+B3A#03l7^^^W78YdEnVc~B6~(b= zVz}$M=Q4_J7YQQ-Sf5PD0xN{SuWr#n6<%faeGzm~W>65+J1r;(ywI+)8io1O*}59DE72XMCBLPsSzf4gC~sqj4IJRmGDl zw!ZWy;%HVVZqfqT8h=O|R}1_hO$~y>z|=6wmuZaG3D(9X-;2o5f} z=@b{pK0_byCVeZwmu@DoSd%P|BMcX)GT8IIA-+^6h?PT~t=2(;x8(K4u6M z!R&bxTRUY>-v@=2iSLWUSeQxR`JFMEEu)O! zw~}~n7u?Fk^U_aC;Q8b~O8VrL!1K}%{t2FoH*{<+jprqw2s{_@fq#p!HY0peG3IIY zy>wgd^SJ+4I81jUfcqGL#Mk^Afi~QSVJ>4dRgaYD`g#?d@If?nqDoQBAH=I+6pQjM zjjv>lV!{-ROoaiUY+IsO1N=f3YoMo(ER%_S;VqqIP!24B`Fcy7)y;9JLWhmu#va1+dzl&q_ z?bs@<`El&U(uCRWQ&C2xZUhuZ!nNi(bp(Vt5>7RO_?AXWoiuw{J_pe({R{{jZOKMG zg3`BvuFs$309B)X^e$}ps1sz9#i;1rJd3I(i=#5p_GSGUkku~?_In-s;9FxGgx*3> zU(LTh7Dz2gwV;_G)vYVrNwuycE&Y6=I4?f*5lyPh_Jd9W@iaQ=OO`-2+|N!Sjl~p_ z_Wq%U)18)~B1+Ux(m_!`@NpF;yiCojP?Hen4q=cEK8+W`x1^8K%Lk~oHC~EuKsAIA z2Enu*k-#+9tY9h(+u~0>6aEV65)*Z#3vzTvkY~3k9YH$IGJOKMQqjY8Jiw0+VN9g*}mEFRhX4NvsC=V;dS# zqZCCn06%GQ4JKldFV>Klm{OAo5p{4)rrCX^d!fHL>-xT?M8cajnQ*R6s>Q}eW+Qx9 zv*FqbqB+}4xGqr9K?27ORC{V?Ua7U2^yK(^YZ;}~VQxnFEVZh`q|XwpddRO-+Apc+ z$t^*&st)tB$G*co(ja_T!rX+-7ssTIl-U#2UwrB^7w2{z>O$Pm9GK`$kbXK+-Ve@x_2?Tx1V_F!6YrAV% zG=!)ly*Q+Ccv3wn#Y-=a?Bj^Neo~LcX|5a@yVd?QrM?D?h{jBM;%7EyWjJtXz*u;L zCN=~xPLvnUEpaA2-e0(c;%r^0>B%jzsKwKS!Y-#NoY<3#uHt~WDHApq;khFHQ%qXb zHym!kgbWL}A6055g?&s^AQ09X4g^A996TZ4b^^Vi8A#7JDRN%jL#qc;by~vX=$}tZSozAH(YlxZ!Hl{J_anJN zn)}gzcZFR4t*OATyVYN=&{f}pi&|z}C*^|eFJ~FuO@msqSb;|aT#=HqH4_=0Gsi{3 zmpLhwy@*gOR7!M*cW{qjuUF}CDqD%RBby@!-<&q=4Z~h?Ndp?DQpGgLLwl*e_UqF$ zHW474~X4?J=&=?zJZj`UIXW^#1Up_Z2Tj2$5T3@v*(x%naSMYmG%h!J3rPa>(`)NrjL4#2` z1lFRqER-sCkaPN^1Ge-Gl+0#D7~_VHtYvX(2R)&_t0GJD$o&7YuS(L^|5a8q9Ga9i z3|kHe95$Z_8>_*;j5{luKF8Rf&-L+YPiv zZhaRNGystO$~B8|Kt2tDa*Z8oqvtCZX<#Q77PrTq#LJ#&T(3rf6}Ba+btJ<(?fhs; z%{EBb_8JRy*MjJUx7n>uOeApb@fxcsl9t<2is~i3kg8n6an#7ZlC5m^G=z!{L?N8t zUSoqj()6s-ILSTMCXhbq%zTU&F4FYQEFwk>7UmHz)be#OBZqkfZO-<-(e4P^CD__| zM!9S4;+|`#jloe&I;sn+0KVaZ(nEQl+zFyyU6`N$mb;5)G@}`EXL7G1i+kG<)XNlJJU`8QBT$%%@+1#BCO$9PibCm+KW|-N!3%A*+%K5mEd&M za;u^?{R`A{#jAntGAo(cimD7nGok{cL{)|qMdE6@QuA4yzGKJfTC&|8%v<6#DrN(x zscLT!I!+6xv>dJvG*JJ0^UH`nW^~Gu#NKGV2SRFmIt8vj0wTFB^%&ZZg*l%uuWUsf?vG;O(UjCX4B5^4F_CxrBp$kmm$utp zGWUn*2)f#zHK|pcEmc3=N1_+`B}GCt-Cjbjm#@(lwjhz5nVwsaI-Dii7KGzZ zEXWs}RdtpNLVGx?=qlIYpbZjURwjMYf~`Q0g_L4tu`c~E*2DToMp&7b@v#$4u(D7? zm+a`V22kB~RyG0fYc)Uv`iW9N&mJIwz8DWB&`;SuRWLvT-7-)D{Y>fn-&o$W8qg&u z)A8$BoVT%L0KGtKsqthCw!j8-FlOITeU!rDSN{p~I#;5%bX0bF_Pc_MBTauLWB+KK zji1+E5l^BVEC!Lx|Ge$J+#YYTRt7_7Y7kzoI-MQ_deE7?2D5JsyJ_WMRvDKwgF#_- zQT-vTTB({M-8FMm$>g;>VAw-d!moF`#UTk1}X1sABZY`9ZpOwLY32agdT|A zVbR^7CW>~V5SQLi?@y!x!Xu0cuB#5kyu zidhUeXT{)SQjF1#`m4pjYUbsl-xU4D;E4?gC7$3WMlB%|^gfGmwapQQU|2{M3|~AE zurMjekLqcZ7rFBKoB>KP=e!Gv@bO9L=SlmMmb!w)3k_U6C@iuB7L6vV{^qfkH5j27baWn>PLEt~63cuW&W@q#mPLl=0eh z`fxN80pB-Av$x?}XQDgJt^V}pL}sFo$FQb=0X%N0sM2R}oF2p8M#~OkStIWq5BDJ- zS%F9jz4GBc`g$yjLz-1@jlL8ohE+~2%h%iOSVsFNv0yLF{^wxsjh=nzPK6%+BIS5~ zN9QnV{3(le-Eb^Q2{E@L_9<(NeDiBQWs$BMFGXNyx1&PbtJn@N+GKe5kSJ$6wCXqNC9Yop=S7{exV{2aato2cIBtaJHI$akwPx`)iI3tm@E&eQ;@ ze7XSxs+OI8!iW#-{+v}eo_3_cCsX~%cPgvlA|EGfxYc7Ss{mMzp30I!CqET=PhO)6pdVIz&tNMu*dDgE|Bmr~W|MGjY;@YtEn!k-3j% zvejZ^4_?`%6Q#X2!Ihp=xL~4`g%RGAIGb$($SeaL>rs3*jxns1^>uas+#cBw!MyiO z+MSUU<SU!qybb*igyn7VX|xtO{73(L5-|?fYmaV~TMkR4n&2>{vG?(+yYI1YNk9k0Kkg zwsdahL)7aVL=RxK=8ovvfIPls9Sno0$G5B|1f%KSGH%THfgBgGta1=iQOaWpF;LbwP{aHI)kWcx;DszE_~VTzH180K&!aDJ zcE3tSv)1hKvN{z-vk?n%{)E>epAPCEu7kd^#F5`3<|`gnUc@en@tD73Rg6zPsQ!1X zsTg|83j<>5+wa&X;$h-qR?+EDtb(whUU&R+2P_6tauVR7xf7lIa%V3AS#Y_qF3-Wd zmC_e`l&1&vdQQ%Ldns6$;V4a6#$FNMy|4^u^9PxhBg^NN4H&gkXp9pQdqb8)itu{N z!O4cwnB`352H&@wtpgfQ$YE+=!IpCNlWZrUS>v=;xxIxvSAd#bB4vf--3l14qM5pL|;OlDGjkSJ6Dv4#>hpD z2+@%j?Oe^mUfPg>f5zg!QMHY2F{;_CG{RIHf0OO+B>X*Qm7_hWqLXrOrT$BtnOV*5~#symf*khn5(3T z!lVEgdE%0Pj7F}Ovd*H_QhwRGnk5+*tfG6XLF|sx*q`M04*Vp)=liq#UWcCZhK{V9D77XAqFH7v&PAx&BX{GPc0Y45TFA zz(Re_Woqe3KQ`j#)ahi}$W)&*nKIhhm?3UXnNA;Vgi_XqR&HeDz_gL@bni7^YM;kG zc6@A5veUN-#s5|wwrm;-!FKSYPMg5xfI`7=mHT-UO9D%AMn;4;eW!1hM#!StbA74t zW~u3Ab~%Z1xZ2-?d%+=M7yiZz?(zjPZ;@{xkja-mKFuoG0-0QK%wf`6>^aTiX#Ex@ z%9lzZ^28R|v1zO1Wk_9y57VqOEY@8UnD8!5-pYC#Hq&ogS-YxJ&blj)9h9kGJDYn( zyX)0wokODBwTL>v=gSj6AQfU?1UXBIL9&I|GzTkY?KL1m?a)BX_b-QTR@|TLtS9x{K8UI72Dt zcPIjPdKbl*+!U>nD>!;~R>!Jnl+>pvmUi!A9%va(_2&0L(c)cfG$fVbyV(bx0zzX^ zvQa>Y40|+5PQoGn)i6<`G?EIpu{V68G(jN>!mK$B$lYN(>rAijWumO9yAoXtoE~0U zg;&=o7?#XwbZ2jwfC`P*$|(sEsFzaypMWgZCaVaL#Xb)*a|Ij7@^%D(`2uE+`z6e( z?iVnl)%!JBt{7TW_v5+(ES1Hr0J^j1b|eiuAR$#ngVZ+%SU5zx%?DUbA&I%8$U#y4 zvp74?m-nmXLoO<$xAR$=1Z0*D$o=_tKr+BENy5-eE8+@XEMQ0nez9Rz^^(97rCU>? zY{1LTX`Fy1Y`=rWmw{`c@zP|7?gR*JC7AvW>!Khp4?d*H%XUmN3j?CSwDWs|VD$mm z@()R{O}f@DkXV!z>8?(_=1kQNvyOn(i{!D3HFDQ#A&3f92M)`$2pds8gkZa~Q=5y=~QjAc53h&6;Fvcs2hkFnRVZ!O2! zP_)@dNhfhQGXFShC)%KH@@LinvYcSqXp?h-4aX(FFM6=wgJUz(1vm?=roIwH<@ zit+qqyGG2=;sU*Sjz#)h)aNYVcCi?4R$#%+E07xD7jR-763ab&*^Q>OP7C*RQ?BUm zpwdV9dI=|C|IWM0UIcl2a22}hbgF)h^^mx;M8}=k*H}fvQrdQnRds!E#b0?5OZM;@ z4BKx}_;p-nP^0URPYY@Eb=FC~nxnsZ?K*rBmkN^k8|}WvqAb5_LvT_y|7fE#EpD)A zXEBLCDEc}ebXOnb41;o4+iBn2U>#+@h(FQL+4ZIzQni~H(v#JGN<9pz&rMrL4`fF) z`zE#;I(aBMK}x2ZEZ95C2(l{7mnN7!vgqbE!pwAx6tw0&v90Wju+p8 zo6}pg0~gU>22J|b+Rz)?j#hk2AZR9?(C&R$eD6bwTVQQS>u*at_^#WmI?(ZBQm(%V zrTz{$2c(%ha-l|Omz~ffoJ7;;TrtNjx^;Lh+32^zrX39rusmJ~WnyKR`q0(ab;ChbT-GahJ7o9*DLsR5Z)#OP}6lJy4j^>Fp;vO6BGEemFL393K@3?FFt&@2Ojkpi1&Opk)&)zeRMPB_? zmr>pGPu2${Z1bONivOK!7I27K4$x)=_i(}G_iNPu0a)4@`uqW_1r=%61F0gpJ!DBP z(;V@Ya+G-=r&Q?=(dt(k{*Xms!Thq5t9yg{u6W2^z)yd&dE_2QIAp~&i_}rz zR<10u{Vi0WS=Z?9V>U}OrG}8fC)}47KVhN}b*MIqJ5S^&U}FDEshJTP;_?QA+y1E+6exxPoo<_Rx7_3tjBqeazr*KHoRM!d z9HYxduHaJHk=L+jxOB(}W5vq36>1rmQ_kqtIMsIKF~%u3XptkY>;&-%h207x{pgw_ zZ-t$poT`qrXHGm2pmS54NSTTqG}MWY!CD%fxme3O&b*O)>PiOhOQ3AdJjA$iE-i89 zRT8w13O`BhFX3*EWExsQPj_2cA(5KX0VKib!uw(MnF|*#A~FlcY!@zElgxVt_|qH@ z9_MbW{R2>jxbhJBT~zaN<3W_}$^*=6^F%aRj8|<3AAITiJbKTSzkoq5)*Jh1jnBFA za3dZY+;}7qH`Mlzh(MgaP zpC5&qxWxkRNFi$(YZ>Q=Rm;hx1|}YATn8O-a%C8HO*{gH3@4dTI&CH8n0N^48SXLh zj)otoyeFoOk^!DP%SeW7!v{_{kTrPmWT84|{!q)8ntSmYXg}PGH-|e&v^HAZ9mHMH zR0!d!c2;X)QxNpSA1DBFN*-v@*qg^0e$7?A`L6~eB+71P9%ej~NyE&%v&&`y8k`RP zW`-JT=HhHV!UC+s*@t%d+QM6c_ua7Y)({Wsl;drTyHRbU6Y>;x?@)w_c;$G2u-2?E z$7=~{&W}e2Tw9}6@M@|FzB7g33kAQ>k4G9Wt)Xr)yuLBx zAf@b{oQc7rYHAd`}>M&2B@OBW}Wm zP$LL*q7C&6;*%gy-VNe2jgJkKoI25$md0^+S{BUH@Zf1M?*+hHt~mPAJ0V;MAm4^a zbi9TOfMF&}JqU3lD)Km!7We^_g&)(>io6beAIgOp;Kxwe6e^f#>J!F==TqjmU;Sxf zC2UYFoI_xG%7Z)pM0k#lL9IpWlUi$!aPiUXtim7=;+d6sC6kt1LVPS(Ynff0$I;$! z`Nbo$IfX>X4};{^~BNKQXcMaXeyhcXJaa7P+g(qU5 zkE7)00Z& zo)0hrThEr~!4g~J?bzz!{S2a3iYZ?Mpc$=U!=D9WwI;KN*%2~fpYG3^|d2&6^W$j{*f45 zBCw4nSCQ}67tJLCM!7ezH$NqtQ&hbCVk50fpj;ef$8&eFMHV*3S#cz<>|rluoJzOj zc{9vt6B%mqx*nS~`CE)Xc@bJqN&vK=BqYd2TSX&30>TM7WE&O5<5xig?m}uJuZ(s* zzr#C&YVpdnKamRs3>me=8^E?i{MxC#vAiL7&Yo2#!cdMLMRP9?TU}!D(VkVg|6dWo z301){ZA388W-c(!5|{*}xhJmk7SNNb{M&@=1u|qztmBSho#aenE zDZYI~du2mBmUvkW3GbugR$Y%{_D1xy2A8Qq-ft;av$Cg6j|Q}r6IusH6EHfP8Z8z9 zYP3L!Q`%E~eWN^2+k1t+EZ4q!G(O$s>{_wZXY5NIOQ&ne(VW#yF$cS<8Vi z4Qq3kf3oPYf3fJU(x~)EU;udk@!I^8(iotdlS&bqsnfOBRyxuxe_oMtUgV9VG}{s+ zQz#Dh+?X|zb5X7(AfI2)phZW5Zb5x zx}m+37KL|qrj;*8))s9%;jesCTPdNO-qf13Zy*PCOB>>s+OON%Gpw)}qPd~Ol)=ki zhZlV`ccYD*N79sraw&h+nqn!1rRhvV-V>Illty6cn`ufTo{GyE?UInfuR@G^Uje;p zsPH=4-+gd7t?-7pgf-^vEYkjBRMuoV!7A^j+;^a!r{+Nt>CW9@g_+)lzfO-Db1$bf zZk?9g3l^?%G&cbCX}h-MJ%GpST5@3r zjBO=&BQ0yib^n!8;7gpOnK?9@^CW{NGkE_k5WBu?1L9-@DMjT=S_A>c7}uZn1xYi` z_LsRZ2D&L(T08P=%?ATgBU|%SfaUY-oR;yhfP@d>u^vJUc--q>TA_PStN%BylOEib*7d^~dWFQn3%SD~1J<6n6d+98;{ODEn5 zbgO$OE)1rNJ4p%eHZB0}Dt-8LmOF*g@-ZGx)b%wUA-C41;;r=~CAWiEVk23uo#n2| zrS45{3NMi3Wm1jouKggh>*$j#4`ENbmLft76B&#sDhixk0~|s%(%zrYYSd z2iPbe`=V!F@$(X;x1Vasl1lrJ;MKCyz1x{F9$jTLN{D2GqSe5Cl;7YNUUkelL~Q_mY%szl5g8 zf#L^kdrKNNx;Kvog8xEu{W}Cw52q9-I{7L$1su4oDfT5T1BWKjrQSTkxaT&x^x-v) z2PRR2K0MYqdo1SQ%?>i7tvR$ zKJWD9!|<@EFXuvif4v{i#m|8LT%3h{-k)2=U4shCUK(vu!Oc_2z@)HvM)c!H-Ix$1 zva>D(3zETjb!?>q8<4$eQUhL{e7HoXLhXfWT*@BZId6uh=j}~WtwZQguKWDbq$FYDTgoZ1&?^`InCFF!f19@A_^ua*M7JI%a+2V~ipU12^gJ6H^MLhH5 z3C|~Q@v3fjHw7q%!~yV{x41asIV~R$j?2+lOyi;00{+zQZJr=|xvcjx{%zUI z4{!6Tt~0OsD>3Ng%GJ%7l{neJSsaG5!Nl#bd12 zFHYpB`}@zbq~-5}CF#@K_`YOGH{a)Duw%#5;0yEo#X8i$w#fTH^4^KY?0lDa?1d?L zZJa4;sN}%)h61fpX~Iy+caGr#)X%aF&IeIN5W7={$(4L{n8f){hVk-9ZF;-h*&q*B zWttqJxg+f!#$Q245yNFiOuPIzT&nC>hx0_B$CpOx`D;^1ha>Lx2N0vD!QgHsWg5`<&bCnv$a{TIOs>~NzSDr7j!xpzL%iA) zejh(8WobV%KI0GYbJ*tqpVk#>U`@r`^!{?u-x7oIPXpba4jV15iKJaQ0jF1gLz9Sy zSJuuTz`tE>#}ROG(EprcP)s^noZd=@h*yEA^_2JsoOFzs!Cy1%r=v6E#!e3O zLM&+FKv$Z5D>&TbrpQ24s6_zU7kr@MJni{{XB*EOC}sY6Kg#@)&og9Fg_$_j$fTFF zOTU@CKl(o~lMgnXj@3QVJ*ay&DCv+{;B2^yqQJtF)Qy&B^B3rsS<)yH{uQ5U!a0q_ zW-O$_89bS8ekCoXcfXQr7cm<^o?M9KPjorrh^34`a7Uc4yJk^!Fz3_Ixjf4FiGe1i{T7&g zEjPkYA#u?)kO+z36MeyE_#& z-5+U~PljguBc0&6T#53`r~y!Q9wzq+4Q{n0*z?Av-8cz_gDEVW)O8*|2zR}t`H&<( zpik!m(>}=EGoL>)xWTd5L2-npcHmo{?s~ik^%d}=(gGe=LpP10ke#P6UM)7_I(w`% zS~)BeKium&oWw&BjJiWKf+hdM1-wz@Os$b|iD-m3$2e-&^WwT`5)~}q?*?tem!+HF zSliPLPI!8{hz2g?^+Pa{N;uQ;u4TO7DE()AL==rINxo$vk2Y`06E1@>7EvbETUn7u ze=LNu+J>4e;=+A@{~~EJCH5Ux@$=Ak(x6{^v6Q}DC~q-{#+1d<#IXT40cpo2@|nB# ztm_iZ{E^TI=V{vC`?Ut1T7yd8OQW}!_RET2=ws&hva7SWfLxfhXD=?5&-yKuH_K@^ zH)=O;FU5J;W=dPeU-7(p)Lr@7sAT>DTLXQ+Ow)3D{>*!OX(@DYP7GrdSj}?&F4USp z^2y^}-DRRD+;2k>Iea4S2UDZ9c6A38<~^lB!8@0S#cQF)G;Xet`cDK+ zTFn*P34;X)A4zl4!fMikAGq*li=rNCQBA79QvQmj*MH*S)ORH;0|FLHY_Pz$V<=~t zR9{HIgIcWO!tb%eDhY^K2?#IYQXdWNo6(?_b+u)Y>qn+=T1d9lCsc7Ga znzv9{z@UM-+zs-z7k1n8kcf7jyU|IB1q6=d@_5)&yb%9ew1SUtkC%gR1kszYS~8nC z?dsGfpP%HM6D0&pK1x;DN}POm{fU2KyckR8f8uEpCvtS0X!x@oCy-5m@_&}oho~y> zK=Z~Ec(7~@7fAvdtSxi8VJ4gHUutVPYq_t@->1aFN6Tr}Dr1_#z9I}mEciEgc43Q^4Ww}2%OrEKNZTx47br+2pU+RmW9c$%|SKK--A)2iEeZ5Kgy@tALu zkAK)!{PGn%b_U(W)7b6cdI*NxUi|dC?RdH(PdvS}oxg;qi93p)_SylZW;D&-A*HLL zpsK#~XooyFsJfFkbrg2@q@56^Kiw&b;cDE(94)mk!I-*>C!;~3)}Yfa*MdsbnOY?3cr$42at16Z~PWBQ36?BOXOwe|M$t`dVb z>lid|uT%+k?}bY6RTlF1o7+v_$D`xK9=>B+f7g&GFIy2rAEiiNZa7*M(cp8<0;t= z9Mk)qlg}%@WyIj&EtOvIQZVHl zi@VfrN#)tF|j5}bzyF_iVGv3iPfJ3pTZ!#Klw|-y1X22&;UTWi&OVrW zoB`I}yJk_U0R)52NQL*SGt%-f-#`aCcp(M!S*h{9b5=s&C++h1EKf9^kEMhH{xQ}q zr+_ywo{ObB1=ugC^g@awM@Wzg z-bmHX$?cPli!(4LN1`=!?{lC_XK4L7P~bD0~|6o4K6YC24c+d0qj&Sf|hP z%K9zO3%siHm+K=zeH&eXTg-zUM*KPb0`$J)bn60d4&8i>j^^2h`EG`)H1MKiBttLC z8Lz)6&&`}J$zLrl@k;JnH#;Krg%@1R&6h!&Ctd=RJWMmS7H84I`O#6qXgn|T3Qj*b z!>N4sC0?7Xm!;DG?q%5Y?z__T%jj_-ow&@c(A%0{;W;i3T+r)I8hjqTmb=QUJMD8* zc2WK!IJbAX3W}6UA6(^OFoI3L%3C|aL!6SYf!p1`Dz*4(*QA^@?3z@{mtK?Rp$pfr zs2$029d^g=%0cO3n%nX^-)9i=LD9Y2NG5)hmlr}pyPJG472V;#A!_ep5#-U%WciiX zl*+aPO&LAvDpA3G?j-2UrTdudSn~Z-UQ+&qx54k%EHa&X54gBy_|-G? z!u7^A;(zig#xt;<#KfZOKjGnaiT3`9bGSBSdH{pkG^+mqxcn=PdH@|amF7Ia*;6WA zeIPx{;vd33afv28+7++48R3meKz&NNZ-ME6RN+iN#MBWF^;_sqyDWXb0fQLX6v*B;!n5--qTYe zO&bi<`TPkVSnQSOY2YTR@Dv`NGpP+OGFB}LiIGhKxmi#7yN0U2pLABT;c1=$$_!_1 z8}D`$F;t#53I-RuTE^kfv_ZjY8mxk5&oNkqH97Mp!oI2*t?dB1kBrvwP^Fw`UpWMo zRC2V&*$!w640u%>(00W=C=SlrB=nS8cxaE1hsl2#O)*)6X|1DGC=Tv$Db5Q)n1QPZ zGbsGjJB%JVTBBWeWLT6yP>ZY(c!1Y&vIamvZ0lqdLGH(#tSzxUJSeM2S`gKDwu&Hk zllTQ!T4$>W>7LGLrg>Q_z&_TqnL8>nd0A^13dqIVx?9fuXMOIcz0qhXIr>-=T(=auDxvsl zEgx$nzSP%C7tg-U_b^7}oedPO>#QOzUrU1MjY?klW5tkYC zni&Aa5xLn~U%om|fAy%@4t9ZLeJoaykD*F-@;+bqRNk>zMXrIAa#mri*i+7`A7R_! z9qcRNo%k;htcR~vgLhT3_~{`m#qi$c3wW<6aFKTILSF&z>^arLa18tYm$w3`o}aY~ zK%cCA#8m_R&wdj0g?t!`m*i)qW|B7a- zSFv5DRMN0$V=YAb?W|-K(SYSEOOpL%Wr<3LDw0}Hu3|@}0^QPgs!GY7;-;gLZn%)` zuv3!ifHT#Pm#Ab?T(n8Jg+!U6y==(mC8Obl9beIwzWQ`CRyFEr8*{Ah0W7KSyjNO zA14(vY8@QO$r2pp^a!s4Se+!gje zCF);;MX(nW9KXu~$Cq_LPiI}Wh*Mz7sUs2NbRDa3eSw*vx>Yf0R#_iRy+Sca=vrM# zWa5gUK?(Kbt%{WSg4K^w>scdg6k||5YZFk6mG!LKfLg=qTL;U{yIY6M{rZwrL^J>; zdbG<$n%UADNJ=zVTxL*K18W_OC`ojUv_}oB@v?_)dJlmOWe*J+S`*w(Ub2Wx5$$Mj zL)k@^xXhrOhSpYwg4{<9t!8bn9@k$EN|7%&Ou^^J>~U4%#k(omyW)a(Qy{2yrvu`b zmF}c~I~Gt!#d^7}$b}$|TVjmJ_lT?r?ZyAv#yE4uv$?#7it>6ch5CrL!b!^KB1IEI zE#7Nv9bvKMQV@YJFXA>LE}WZKMe^dfCf4_XB}H$0A}Fkhb+j#TxVbfm+BdZd@A2de zIJvBEYVD8Rvzg{L0ikKs%-T-44{w2!<0T;P_sy)|qGkJ+tipjJ`Mbt`^nI5`ZnW$r zYh{3QJ4H9gO5J|RD!eiyn_HW~qPY`^MZU@OrD4sj!jpQJ)@B2Kq0P%uVA{7K+6_J|(@eCwmDOw$-scF|3E_R# z@@BzwyOq@o4q(67v;@21LC@YKTZ2%}F`5HBy_JKy(XTh9ylj>3Z&_bdPoz&@wpv_I z&X#6Fl<++DYmAxR+BHCChyB0WO(nwQi`J=8c^=xD91i1d(2I4PV zWtVeg{Jf$>i6hv*>T5HM`xTIt8oHLUtnY0P%eKG_HJ@j4+=5s}l63-*T=57F>JT7u_02?X#xiYe0A#VtZ+ zRrh4a)8bpS!SciK^4s$hDQcK@Kbl)}^QG}b!?>S;iVxeurefiYs8$qREJWv;o*#fS z77Nz-YO!FQXT>E@`db^cedBOJsu1nwsJ9hu9uBTBfKo_0> z2gGadtY^6FbIXe>ab!dJBeXMi)bETPyfYqf)tJ->nX||Z8E=x?$83lrV{4OjyP@qv-hvb3=!GA1H?@(V| zM|X|VuFPD$PK2KEBTnxFLRfQJp@H@yG!X3^r9A>b4!B!e%=7*8-GYSPscAj2JmaX{ zW6R>{4Gr)tpzk#y*tOIF^UZXRt`!J;J`#lSHeK%hj_4Z4mrJ7Tp$J;t>FSI;T4(@A zadu~D?4<94Kv3a>-l5PG(%lxbUY-lW^VoG6Y1DeO76o;KrBw;-5B?IUK~>AGbZ%## zAW%C|^=QrQTK2Ns1b;bN0M#`{><8wI5kgD0*bhWIRVg8`yyD|cL6?Y-#R3h#2lD57 z+Io+6t&rV*vBr#{_-Ti(Wxy_q3dV|YH*PTQGh@ZL+udu8yNMk4s(S@KHKnbl7Bta4 zaKXrDj1wcbMEid^^5~$fe=B;EN2Q}RX$3zC+nQGQX)zGodfdn34jA5SVDF>%32Zuc zpBQ~BG5SbnNPsV(lKX{JyXk)IJ%9C4CmXaQx|agabOar9z>r~EnDFU%2sa7lHaF+!X&+Mb9Jf-$tEn%jZk z+a3hW3#t7>+G1Y#?c|R9yN9r4Eu>2x7HGTaVeKw{*--|6x@5feEM6WOuRV&(?TC!a zI9>CI_AYMAAJuvSi+4S$v6Vu1S>4&`TGL1w426AeddR1vOSCpn5cIV6IP}O2t$k$3 zmkaSrgmU0_ltN7iU&5+_o~2@u++7N8kC21%@@pw}2AipQnKn3%W&X#Y#bkPfQQ{a@ zc-k*1133rwyi%s=VC4`)W}Pcep;hy>Na`~|8-!=?K{Q!?B9Zo8F(#7o7ih4>n4n2- z^({1f;G+myFj2@3h-Y%_d~q^8Kk?55iWgLj6K7KOaxf{Aw4l|pKtGE>QIAO)dsVnt zusJsEu^>M6cI}-isnZLfSMUVj=*nCmo(@ma#$wpTleMeByWxtp$r~F_M~A2TqnzsY zpb$|&b(1017Es42T9FO%+|()BBzBpNo~jjtiv z{+M|CNf?Q@&pf6L=C^f^X>a1~^2fDOTv|V&X^auOWqgWPpU_s~>4@ngHw~SO zfh>4R4CFBPCXGIPN^6cXCr}ilhIbJU1YKleUNTo;=Bsm|vDpl>J8iWf<}X+XN?*+r z0*#{_!bxz}yO#@r<|e+(r$@`7Fk4S9(lY6ta$vpqeWSb}azAM~&F3JhdmP6q4EM$Q zk~px3c)$l|vA#rc?+?fONE%qCHKw0QixBGsr!K*DaxyHiW>Pu?iuC!Rg_2I{d~Fbb zF?YUTSJ4Z!k%F(Brs8ftB+$$SVmZM1=+XVyAp4&F^KuySwAKuA@EJ=E4rzA(inn;q z1`+sHs(M;V!Qj}Pyyy5in}xjbnq6%TuATD?B-yc4_zYBDh-&_fR)Ez|2ABHN2avdQ zq1YWv2rTiyBP3vy z5=p%mX>28NL%!HS+ZIFRQb5-SvR>kG9Tbh1zQ& zDKC#rBG)_V$@J5+S|lc75lG1}Z<_Fj&c(LHZytI)FlpBf^A7Etdu!SRP- z4^q^#QL;-!H1ujzyBS9ttJlO`N&8>8Hj<{D+!{lHKc0!JOxghHOHA`oMg8@p9s7{{ zjZ#J)v{7T<)ZqTZNxL^{H-v}_)soL$*`jrTaSvjijt`MZOsEMx;v=)#3`X$My-by-N~v?^%HDGva7Ha`S_$= z%>){DuF^QN;qWSLGGOpsm5>_&G~R_=zA3m1Nuybt1TvMSB*fE(Ow-lBF+z&uWx~ z=FhFd-u)A|5PSfTPO%)Ig$e!RzuMI%yfoj_S_t>iL@L`6QiUQ5Utspjyqg~Isn*s? zQOa4tk|}50FP)+y8t6m=HFMocDpf7?XCefU3~<4Qkby1QKt9etwne*Ifa~{qaHU@W zF8c6&0hEjeaO%5NsE(D0S~xUs)uc-snDJ)qA=r(HcSYNeAokb?p|j3EL+r0~rT-Fa z7(kAkI_zodK9GA_h8y+$5ZkZQP>8T$Na2ST&>9P%Maq~N02 zz7kKX6T0O_qB+}v<#C`|L zc@wPdk;?M-x!^jyx>~M7pxxcTtL7mP7GYHm{7B=FqHeXN09>>@_CVAXMoa3u9U;bK zi1a^!t`YFeI=lRr0E>+XnZ7czwYdP<;yLy>Biq*}>}oUNXw;Un-UExyw;(Z=9@!z( z&Fv)I+KcB5w@vRiO{DxSS}slBsd31Y4)q|T>YYN_+>xP`MJIPchCk;*^POl+R~Y*A zuF-l3jGJha)C#XUH^jKkwBxQ{Qs}K}EjHSUOK!m=?qh8%z}PjkJi9~(<7Y4&yD=P# zsLw8~14?!O57z6RU1GiVuy$X;qny8_XX&3<>$PV?5cZ1P4V23fpz9?;*EM?Td!>SI-ySfTXxr$SOdO!N?@VbxlBZFqUcer5?OQ!OCTO`l0MZpmlDuHsnp zG4XWvGpI5P7mdjWpZas)KcWJ%?Dv>wFp!D$X601OTNHAtOt6qhMRxR*4;q^h8Uu(-!rDF#lIIKsg0-vXI z*e~4W`LEMgUu#pEgn~O)TS0OrayXk{Jk{0VxS6qwrhTJ57AJ#b_*-_dy~vLr-$nj| zTI1L$ugiEB2l>MZuhWo&+K|{_5R57-ic{r5Ow0hXf2+*`P@no%6H%P<4+%+P;UQog za%3M8+Kon(^8>i^b>E4-UTNLdL|Ta7pa(Eexg65p0eP1w%jJGA-X+Pqk@7BCmRv6H zQslcj+@YE5A4D^0vd9BJh|kkykqz=LL)?}BD9X3}QIyY;C8psax{@vLs^y(e*5&<4 zyvyNta0z|X(-_ferGF4SsGw~V1Dh{PHJ0D(m3O)Fo$s({vhc8IvZ*ZcA|9g2X0pg( zStR`k&Y(Bbq$AeJ%;!P;-G3y6ze%*}v{pd9O4W#H;f2~#lBEb5b3z+Vdw&)zxK*Ik zouMR_9~Jg31CI&}-*@!S7@qT+meI04x5Nmw?L|kCe}U_%(LuV;Dw%w$DQJ=)mUR&2 zQ(`%AF)!_xa3aHo*1yyVtj|6su>PfELS*aM;3%@yalr~YH8_ei@JK1BeDF9nBCs8- z_(jVT+~AM}6|~(2c?~Z^2)omohgDWs-WGUnJRwAjktf7L-+w|Z^h&^sfM ze)?6*3zE3tdIvOky<2)V1h%>`YHfq{o*FIHZ+uGaf&y*~`XK|?)&qe_JOkmC3WwSa zK=|P|aa`>}1`IAvU!6rNEz4Je53QG+)Hu$E+HWYLZxkNOjdeF5^!Q22K)C5VF++{8 zGv&YUcK~K6t-cP1l-_4II%)my(1)+5;#1IEWStVn{`h^fe3VOHpVCs{INIMIfy@my zFv?_0{}H^;zUV&TqI;n)fgz*TTIfWM*UtkKg6)d1iZ7lBwk-1eAygtF*wcc2Acv7h zwT`ss4=oO~9II?^xE_`kw><>Lk+P5KRQ|FqVeH6pL;Im%Y3Q|M}@WIa_HBKt?=|(l6(@lP>inMLG12bkwECiM~A*>|2yO*tb)%ZBQ+cF7nii3= z&8f1@+avXE%7Ds1q@Ki@kk_O1WgZAKLSqO&6u}oBiUz(Ay%??ggA=ebT5sz?h%ZqN zCgP%8MvN$TWsL5Rlpb7Y9(}78JOY6# ze3?%2XZMvp~aReetk?6F-um=P48Eg#?`qa`z_a{}4m{IM}gPiDIZj5_P}p{f}hS>_-yC zPy>9KPn!~T&d;qR>3zkg9|b=xND`lpOTwpz@M#-BX>pSHw2CkD>FXr@3gBR?WW7KT zr_ZfVF`boSz_ch?kf#;NsN+@a$%LzDvZ&*CzRahz6s+0;8kvF#TwggkMSqy}gi5-8 zE92Si8G5$RBG$f_okZrTmm&~!U=y(7mrkj)IYWO+;Qo*G?Y^VXn3%eFdMHyg{CFm& z_ShbT{hM)x-UeT{*m?W8@O^z`se4%PnD>VuHFJL_v9EL3&Ym$pInn9x4l63>uTv9m24 zNu*wJ#EQKVS`a1;UJ-90nGW=O#$|(IR77zYc&4Hmm99G3m~I?8uo2Dnc8H;t&Gjcz zL^3JcGUSYe`Bzt;t)Fk&GQS;Q-`-sB=4QG8dHV*6ZJ{4SXOxzD`fkfcERyv-F};&$%%GfPdai?>iBJcdI_MXLI`9^^>`uOp zdNK8D-0g)psh&cb61GjjY`MudFeVd0aMW67e3aB0@LO!Ai))>ncBHJR>b#9`WKWt^V4Xquht+`qA-8TctN2x)JP<*vP9R6(8;7 z;xNDa#+jzvPsh5(r77bm(5}%q+S#<*b~ui$x*?_|AW_r1JelSzU;2>1M0V4rzW=fl z`W*G(J}ADC+ikQTCkbuxx<%W5!4C25K`9=@6MyUzJCu3X21aknR#I(9wKlwEzeJjq z*X>%`+bdeP@Bbr(3H~I&|CzYp50x~?4w3^wk24VtVShKs3a;_iM_rOyVaM+cTH*77dnPY zZsbbb4JyH!6%c6feYo{~DZX#e2_8$hTmrT<9|J2$UevyK=ORWwt%$KlQvqcgGz4C_=4N)D6>R8o;>aw`bbJy*kzUpOtw4kL?n8 zLN)QJR!+X*mqcH0dj`iJzP8y^b#i-NU`b(Pr9JJuwRw1EICoqPN45(w1A>SnlQ+k& ze*`LpDi@>>7B*o%N3<=<8R@fivW4YDpc8m#8P9gaozguF zdEI;wUF>;Wb*?&ojNjHOEK&`F103G>h07+beCqZr+HriYoA$q~J7~cCL5X>+??Ob+ zAdQ7#y){i3=-DuP-q}cwwu0Hpc|~tr;&b#zCS*sjjKk-?4EHu<8nnKW!xO_Di4lgz z=M0Vypt=k_!pMEL%f?`1X6q}J0tztR?SqkU#$}v(*XNJ}#l_8s=zyg=3U=e^MRKnKL=V%p{PBGLzi}lBX zHBE{_AW>d85^ZZv!Lt%*>!1VgKbx5(`IRCl-O(_$^zk&z(KX~d9hE@K2Np*|RtN?i z(vgDA%4vD*xeOG$mPVhB5+rZT3nkZ6_Wt=X;V%wUyyV;7F@t8_mfI_kU!0+2Q~uZ+ zBB<)^A;~o9=RxuGTK0g(fzm$tif5Qxt+K)QI#-Gp9zoxr-~f^z&xJpVr7=+0K__0U z1CK?}xR4?XSv*@5O28!ZKg@5uFX0}jscuZTInTD-J6hmgb##BixyN8u5(E{`>ZZj~2$OLh7$IDLqP-`eGmr6{>bg z&gwD5#ihX<#&dP)yw1l_rELl_(Lc)Iy5}m2yAlVw@a*2x(x@ zLfOYv` zBnlcWuBaMUpLdi$lG`IA>ALI^x6j$!hIYg72Hm-!=kUC7mL^(1twN{OaqC(o~xY3B3KoeEdsLNM1+ zq2%il_0d0gdbs42gpLw|vWBQf3LsohKQPkL(Oqowr9q;{$~@u}iJ#oTI(!k)7oL?v zSjs5b!2R%cwpH_WeuI9$g{zd=RKCIdSrh>-cqhS+Y;pC@Zm7x6&q$1lL3vY(}60%PM+tM=dD*-hv8-^ z-#8E*tAu~dS+5{$6(=H5f7rX}6+To16Uf1o_viJB66mqdS;ZOG-Ra!dJlj&6ANZo4 zSH}48DA-S#NGJxqbYkNi5lolsWHb$ykx5>h>f1|ws-r{{vyz{RVgj-(U0(oMqyRw& zbI}z6SpiT1S^-c2TEy)VAZ5rhC=-1NLC7*F8M3(&vdilsTViEQzX-I^e+F%yglvaD z0hSX4uUo4KNB36v?d%@b0hcvvB~bI!qd(S6WSBZHglQgww4@4vqZ?>@Vi>ddM71fv}7l&ZAf08{?Xs zN3Vp(1&zuSB2M+YZK<3P9J6gjt&^n!700raHW7_PO?*jUy>ilL_1C|`%PLKFxeP_xoTPV7{8Nd_NntLPFmBa zE(;FMDUM-5VlPvdxY0(U91OyjSmerysRhBl%#eP zAEG;Qw!kMZhgiik<@5TS>HZki37V_^e*XMd)tLskAYwA(3KM+G&Lx57m*6>b zYhO%%fX)_KV!_JoYsB(zB#@1Jo(}#NbH-z3-xd@lhI{`B$<#Svpd+A3d``NXL{8nX za5?q7B2%0M-f$=Jp;!j^V(V6H!WhlnuZJ zja+I2wCUJ0kHn{YWLj6XqkxkYwZsVlBX0up4g|Y|G=)!jnrd zAy&Z2+|aK)`~tBN(+qr(sl!0HITMx=j28hUw-`sB?Y11R&($jIZpK6jXeVYG9p`l# z3E|^1-U7t1=p=Y9Z~oj2b>$kA0RstwNM<8*dXIB%z$`iAawHZ;$T*L@4zh!9gV-pl z2W-%f!0@A4N@`+ps9s-i9mBl>(YE4qE`dPA?K3mz8Y-3(DwZP>!R9vh$2LITSVms2 z>TZC%*eqR)ynY<@|F#H9FTXW{Jo_sENYQ2z1#E5{wmJ1Yq%kmVu- z7RFZ=0ymN0Sfug40)d-~nFt|p(_jM)5jgfw2psz-1olb<#*+D41eSJT76ON29Aegk z7%nZs7=iOb-LU#0s+S8%B5>1s1eOVzm+E+*EH_ z0z!?$-oGT&f5P>+3vm4}2z3zGrT2cc!1b20ga49H|L1T$?mxu!xC?PTt|6`;*!ax* zKmSWym$r5xT(`mu0CX4Pda}TE8FZiluD1>m=(s=Ow}>@q;ddJepZ`JvEp0kN_-&bW zTu7j!{)FFxvs^%+<0O8^{R{k-)*u#s=QkXQMWAIGYsT+jh?9_@BB}>${)#|{tO(Wi z|B67%kej>=I{Ynxj#6#^9)a%IfIwRbvj0CI&{6*((nei~w7ef>iGmGP_J6JP_&drh zgNjOQJ!Dfm$;ptU7VL*JclTB0e!Fwyh!UtlqD7bvK_kS58)R$=wjKRuGUJ(mzmhK4 z8KK$5<(#Urix6t&TfZ$iN5rK=^}+^I%@ZrWOR(u6oeS2EEo8svx$?=SC8G9LsJ!~T zT~wZl-*2C{pA8EOI~$3R!cKKn=+0`a3GY)`2@%{)pCPVUkcIH z<-_iq_insqHt-ck7UQfvGcu9$2G8eeZd+es>tavg-w3ihs-lOt2Fd50g4k5^ z<~kAg*j)3bIz{gMybx2Z^<^c2^M$s2(8)TyNb(t>c9$a&lN@Cgm+pmFFdo&iX?3K@ zy-l{rjSf*XZBd|oRtxoF;w>r`giofX<1Y1!2s$bR(*p{?>k%Sj%1xN%J23*NNaBYAh85Wp@f`Re)Wlh z-G|Vy72|?U$9d@7x}rG1%G+&*eIhH7a2DtlJ8cNjb)$R;grY0J454F@ z;dDHzm6FdU^oSpag%pXKtR4tP64V`8*20Rf1j=mhy|5&c-K=K@>IVxOOXbe*2a_yB z#dulI0;J=u3#%Vw0B{dHMa7ihYyiq@ySG%qlZG{7F}*8_s0m^<1*7-6=;Yy((e&`D z2v0aL;}R+>>YU~7%E~*t&qdiAe@SX0L~pd4XX|MlS9w$`uCE;j7wm@dURe2_)+mV@ zSYU_pS_I==j{G36_s4Z1h4l&yh$gk()+m&a}>m^}sDPgrx9LEgF8b z6CPS-Yut|yh3#GvE%8l=i}5swBMeh#1g=eP$_k9=2D=Jqo6@n(us2{@e<5iFH)GYZ z`A7ln>JSq8{(fH(`JdWX#4_6|5o$O|^Fo_q?mO=*VlQM{vE2Wi)(+UB-)xfnF@?8g zr5&R+ue6Ic#UIJ>gxJ_e){unOw1m|a(u0@7(1XTp552~S|IEo|Gqah9zaS_3XdX_A z1cR}<k&I6y2C*v-+_QOi4?W$S$Ot7l9p#`?4xT_*c{91-r&htc17&?ul+@(nP$A0- zlM5l34A(|uAI|Vcc~r~d5^req%6>^rxd%aJ6dqzm;@A|-2yPCe{0=Z9kqD5jp(1jdHrXdxQTy2OWSup^(A73}%NPds{ zO?}JXgaE`70`)PNe0*T^Rq0An?}YyFj#qqqD1@cWCm2$P8xBzcs$6eq#T=CNDUgmB zDZ{<**wuqn6w@)OAfD?8@eousl0OaihpV=GM@h+C)GtmD!z{xEkNRz}Mo}Md=PNs& zQ9JY7gc7uF=e`6N^`T%{w5*27vWKi;@y`9CvlxtHpy@T@PhOR6RBo7MiRMwi7o8Eu=HOM|TixJjk+f~n zgwzsV+{_2DxP#K&53>JqK{ZvkJd=rp8rR_K9~yj((l7)NWR}kpU=6^G@yFn&Q+FqM zi*YLjGwJ+?_dm(^FmzC#eA$H|biNk#{uC;PMIq!U@P;t;%*vWD9E4bEZhU=Me2q*u zhpA@nu%u{@Ds#trVG(wOD&`d@fhJ0`X_$=t3{%dSgn;kYESSn>^}Pm>863z|``fo! zu?mtyTjn$2RJ2U*X!{S0XHNZ_#xv!L`p%5MGoG0&jjS#*o}tDs=_`~{#KqPhhp)s< zFYC`C*Y_*B2CFXp69t}BBISAUeTz?s{rQ)t>46$+i3Yfta z(9J2eX;-I$gV3pPC!Y znZBA|PIz5rww}%!0 zemI;SU#Gu_w;f)GojW+>>(cV^6ioTwe_a6Scll^co6`usR4E>nR*F)?o2`te&*dYf z@(G07ST9~9a&{sOU$3***X;FrKWR7*@94CyN%Zr2{av^Uz50fJ0|K|j{8R6ZOTj<& zcD7vysq~+EifzY1ditN3tOsdMvqK3~{ZDylHj*?8t3aOFM1$wstMn^40Kl=MZeYQab)#C+^eWxMkJ`12z@t~HgrQ|^ zmFRn;O?q>?20t_SDaI2*5L{V)d|L(${60K}-rJ|tEb2b|Qk__FVU!5*fT>GIm*= zxJ7>$9-|5se+ZMff$!^OJo&rc*V%#DPPHGv;p3XE`fa!imt|_U>VqsSN~WG4=o}kq z{|7q9M!MxgUBpHbxU=s=eKnrV+NN{RFPOIdR1{CO+r*rEs|9)t!3FQ4<+~Nt;$7UT zPKfbSt&2#A9|>#Q;qtPkz(}O^AL*^43W9$3us0@U#Aj*b*^afhnVM|ZM`Df7+^(nJ z`NLXh!~wJnfC4rJjU{9gD*b!oDmbew~U^5os2_p_bNr6D^2ygzd3^BwxNuwQSx6DGztP)?1W&M45k zMsFW6sj3EcZRt62cdTQu43Tyy63h*$mKTJjGv#Yu_tAEYPkrGyr*!tq+60eWc z=+|(iqZh?Bqq{%W(-7#sa_Yx$fWY9_?b5ql!g*_6w}Z_K)kl~Q?#96gTYlUKT#7(~ zFnO+7s^A&M+|m~T`yZ&YBGjsx)b10I^e>Llou9zAc>t~aM86+sfGBI90abc^s+Vv` zq*U6p3$FjWKGla{w(~yIIT(82GhIZ`%AlH(Ka$A*x&Az!Zv9+P5XWvY>sUbi;Vrv$ zj&A9bcNM$gqfkKGcS|elFLaJr-WZm>S0z%x8_BWsz!!Qd=K0Al^iPuz2|^CAl|Rh; zZ4+_heTg2~qYvR&2fOyb_o#r*?SVT%0bTy3eg&d$S!XkDYO_r192u#~;}-~1wD(J~ zyrcK(9M`BNt$7~-0!QtIXG#H;?G<$#Sa~dg_V3j@p(0D!Z>J?yI#(oB^<2@guehSh z*>%$QT0I~iP1hR@C+& zDC68$>57B;OZ@W0LA_b{H*oiZMQB|jnBb_W%D&&iYXFTyprVSW-%F@`;*j3VW_uMr z%Qp>)r$;{>l_*1#%lN^sv4P}O1`zn-PHC6-HrZ@=~a;8V5iw|s@^m(jm#hP zPAKl6{C5WC(T*Qm9b?Dnhvj$PSCqg_TeTer_~8LgF7^tQ`rWm{{f zBQ7It-bY53vbeH1*7)3}Y@l-!!caqXQHBpz@^R4yr&*YD zZby8j7H#xW{-$ql{?F|j+yM@|jBfwqKz35$>FoO7(J#VOPN2L*V^uigHliOyAee5V zks1@Ib26n5b3+iOI!a11{P7Q3B07xeg~E^5>{UrdcV%1Ulq6#;+-b=CJ)t!XNF z!T}OzQ-hTi%ewBARZZ`Usy_cpR5j2T;*?d9S2c>blCV%EtX{3J1a2|hp+2&b$5bQN z>d&exjKRT5;@TSnK&^^yFcK4kt$XE%$@0V5etalfuc-Mlh29=y^sv4zA8cHOj|;Cd zSi&p2#9&!E@MtXJskStjz#qE`wHHv|s}1%NE4|w2fXkX8Mn8UclUUh3`-_L8`-^1^ z-Y=H>55Fc-Om7g80tApXo~E4x{&#`;>vc{caWJT1%EX}Fw~orL{9g&`;9wc6F<8cG z40cx6|0AppR>D|~N*JqAN$K_f7ptXqSQ3yRl>U1_9c=x7C|29PUPogJjd&XnXL_Ii zOP>F0$@Bluq5HobcZ1{m@1YF;!$ph#*SP!N3*BJr{{!i6|GSK5ZDnzE%y!R1wqK(t zt{rR;R@0dKS~jEn5$`sI$0S^m)Bi||tl23nyu;L`HPm;Q@iR2KZHtY?z8i1=!CqU! z_97aNVmXLNdGKQ>JmBM~Rv)Az#l~YYu)}T|Kip{Qsg`e1ik9QvS&kz+Y;?=oWG2wz z;YJQ>ju~OJZ@VAmT7`xAQRn5bf{#>p%MX3l>e)QP zC{MTn$8PFDt0BIs2M&^ct8uAI1f|%mP;XYhetawTqeE%aYwpy_sN0N|itSvIgvG8V z0v6Qi4x=diL4R0(3jDKEl1qKM(&a_WfKBICrcuZ8-@4NucNi0F3!

    yVD5ea;I_J zHW_>UIa^Z#UrcJN|D6{tw*m}YdKd+s)# z5B|PN3;uos8{=1W<8>$~spyT73G`6=Xn&;L+A?u<$L{G8PrJYEol9RD1~=rpEibLy zG}xzo(_N>6N`g&gXMFSC9Gyasm_{UC)sBdOm;DVsC9!h9X?$k0)vcwJcv3yRm1^!YsxgqVol%MO>iq`mm}*BZ;s_h<+DBxOFJXKy z>N_Plf({&2nkv(2&h~pdQrqhjT(s``gif^jH5=y1q@CtC z;cq$p5dkb^2r@{PuCrZ6O&>7&MpVxVR}&F8Um@RvMq;Fmm3z>Au|{y#1IA6P5j^sM z(ZcodjBr@(+(20m8bbZt_d)q`@q@+}&dH4QLj4m@vmY{8%{pcwV$FW~knxm#MjTQ| zCLDk&=wTzC@w4}^Tj|$_p?5w0h_P5Hteo?xv6VGQFl3b3Kkq3u-o^H~aOj9BxV%+n z_?7LIwPnU$8{baiTdJL8On^@7w#mj7*cGmvY`hn~w27(&${vlzoXnVF+@>t0<5LVo z#U<~<-4m9*KGm=}1j3j19F#_%K4xshtEV0}YM^Rz%8<$9pWt~SbGq>khOo&~98djc z0Q-i~n!?t}NJ}D|(-1IXOkwjRdTxf%4q7{$hO)V&odUn+CI#jV_9+?Uohi__-K?kM zE8EO8DizdPbT|nqux1(EoaJ_a3!yreFUH}_5?F%O{~s8b)V$lec}QvvR>gqc=COdy(O{eKe2GEHbXa?V!cRv!GYME;jDRogOgqW9kh< z?dp8w4G0){wpnpBydpb^&BF@lKvB~K4+x*|A4W`$+Cxo}sPPg3{F+-c6X}m7Mt=}c zwZeE@DX*-qFkVxXm#OSI?Dt=$mCqSF(A1+#jd4I82b70%2G_<@z1 z^yiJyP;Q-l-dGI~xdLV5a&a!Qz$x4UIcD0uZ(!fm~IQd0Rhu!&CZxaTKS4G2V?KM9OQlg zjaY6xd`-y5w%$(Cq5i%EUNtFvgyFXbDtbgfGc^nqFODJcp%o?Mh=dF5j<& zGIM)n^eVvSg4(1%s)K8@+)=IL;b_av)FEnHwc2

    1CU*F$yu<2iF++-mhn{f0N(Q z8K$}6>c=zajWx#2P|qi?HD+^$*!-k?oFrDQH98{!(8;w%Kg>pqj8#+ks&RGr$|h=T zplF>RG-KG6k@2>juhN*O#$+W6=R9@is~lVgX^t%4JV*JXxyjc>tHLeMdt1;MFX%X; zR-?SSbXhKr>(zJp_q6BuH=8X0Fv3kw)>#xh^TDUm$^_*}f6Yj?;X36tqr3C17v1Xe zm9*tG!*o8apbv>O=QSgq2CNfg?$LEd8gOU9Iv{ER?Oz9C0Sadyl^DppB}*v^v~8M$ z=l^^i1K&`2>~*6luU{Yl`Fc)Hp#1fQyZPQ1_&~^S>jBsyJkSfSpbeVnFVhyb&4!T* zPB)DnI4!Z!lEBckXq>JHT_YGLPSrN04nXdq^`N8!DwnYPB{44-`VL^*3vU_OP=RlG%eWo7 z?^bUcKFnHlpmu0uOw(;|8||R9EPosH3U%+R0&1ad^BrS))Pkqo>WMIQ{lW|c5_fGj z8Y}lw%gsj91Yu2j6IT3;so9-v*Wt&6lXUxLV}NaSQeejFEZ|7>X2b2Aq5wt-wCUaC zcsjCK06Ozsp{yJBF5o?%9(vcfMKp6N*v!Fqjm8D{);s>m>16ATn{wFMA=GsBM62of z+kBmELmG#vvlXOe&SlGoU^E&Xww75^TJk3HwvtvLaaXnxW40Xdp2ozCUNG=N=d@izSgetwf*u=dpWT~D&;@hB!=qF&23TX+h({~{oec|V;U&<+K-HT?8_CE+Kz*{K+o;QN@Y3y zwB7hE91p|k=j}!l^6WGkp=jn#;~u=6y%Vct05z*I-g2I>BVd@DDze+f)43Ys2JnLG zKQTHJM;YPlRn|9kM2j)$U#BGvLd#HW7`U*Sv0 zEM>-iuo4TBAMH1q1g9MlqU-yVbwKpV^4W{}_xdE9_k!HaT08jk@B1XY@3>EE4jA2S z3!bJU2aKtJ`nX!72y3bh)trX8$i7;LKtm~iMt(A#t2H9UeB@JwJvE*(N922{-PcA& z%&LtJ6=7W-`%GawG`jI?qh&K)Z7&I-A_m}#QKcUi)7N=3(>bsUrnUoDmB{g|Y9}4L zhVuW>qy@cQcA1L`e0t+b{TpL0GfF%Hd}Cp6K|>JB}E)f=vbvt7LijMqj+-aMGZC5%> z;ff#1Rs1ylsKN1fY*c(QGAU4OHdb5_Zpr1nOKDB74N0_m%h&-_xAB%3*e_s{WT!Dt z*2YuBG3@pS(57A~$#nHGBem6@Lmq2;8Lob6{pNsAu+fmdDpn9OcKM5}6{H(%Xaj@UMv<9i{{3eF_$ z>T6$A;n5`ix$p~GcpRIL7wD(sMr%g+IT8D_yaKL4iOvDwwtKcXfmSZ{d#-a@!TD|r zMqv531Udu)5CW35EG@zH0)g(WU!*|y`7eg*T>YF!eflhAoiN(k4%SlP38SU+V6BK= zSbD<9YQ7u4)xG$SrANN<;H2#6R7KDaRTM9xW6Oue)1DJXf^By#)tvxkTTO5M3fhj{ z@5Y}J$n%?V2mk&}h=@6l{+Qync|Z1o8OH_MJ)5T_P}Oh7$Jjwy@g3}xv!rnw`tYRT z!9y!_12*q_`nRE|-vw$U1!}j#va7Py?}kGOM~K}tiktTN(17;==Fi>%Dbck4l+iZh zpp7LTH?rY{!43!}sR}I2@t=2;cLLc@8*^>%?xF>!Iii$uEf8!Y;hr;RzlKkOux zk`!8eWMn2){b8YGmNGUIx!7?Ce(n!r5=z+v703>ST*>VUk*xJ*r;FY^V?^LZIIZk) zdoIq;8^zG6GdKgs)@qzRk*+w4{oe!!#jSvH;=~7whG#0>BIK4s=zc!@J&_Ka6-T+7 zeryt7={skPQg zFlWfttDg8^lf^g?H$WQ3ThS@m09lRo7CzPP=XhG?Ff*0Y^d73_kZDSV!&F49yA*JA(Kd&JF7X@{~Bu7O)f1OyO~ zcxY2|vsH}TVDa`!;qBFc_GU7*cAI)QGQNB0e7xB?LI$K^P=4h$nMp^eAa4)*;;CP)vPtzN8KSQ>G@0Y}wcYrx$UdS8}n^u%y zi=`|%U9&oyfk+u{f}dtnk92cQq?Exuc!0Ip%p7Uu>Excp#F;7<#z0(}gyiUkc!F?+ zt$;2T#_g0C7bWCtb*IF*194`HPCJ#LBqCF}!je!*9imW?YQ-;TSap>^!RsXUH51qu zAtMcN&yE={z=AHz>_z$Urd!NY^S{GEgT9S7la$$XCf;PLI#{^%FuTh%G?q7UtI!vgBl>%T_OcaqJ~SXf1m z!%~|UR;)}mV=XLXAqb*pn*`yB4781c!XMrbUZ87NIly54nF3^=sUM)8Dh6m}{}cmU zB_CO-KY56e(k+*P)01lNPDf1aCgv3p((#rjb9kDW1~B!m$5P5q7hvj^Zf?MvDvE7p z-sQ2}M){L9FCIrVab`15&^;6nS7n%&G%X0Zb2h}L3lVki>w+}KS$>{-Ul*F22=!fB zlW*p@rN^dsKaI{b)12aM5zWpt6K&P6=Gqi0EIxfgS-<=@I25$kCgyG04~R5%i|h;i#!0B z9%}11nInEoWxe`AW#l)zh=J^4U?ebE7HAb4k0?WmdeM=bpNi;Bt)^tMgqtRw= zl$E}KSI%VlnAeco%324J8o>qCyp;6OApQzJmO;@xZtD>P9p~r#Yi^3tsEqS(slk$JxpB?K`XNF$l zCl%+LsTWOOqgkSaTuTEXP$KsMB+7(9oA;9ykH-boDN903&$~6C=iTb*dD4?s8|o*R z&Nxgb2Q-^l-rc+c19*x@l|aSa&3`yqUPbWEzmax9;(M6MEbYzS=nt2T!tBx!=}Zh|iy#q|QA}PTxFV3GspMGFP5VrMFnFi}-C4J>WS9DUeIw6X zjo8uxtM6@%Xt~~FZ^l)wRL#}UN6_$zC!vnmINs4c4O{kE=k0C7!g_>pl5I-{?j=KsTdI`PCz@mR1Gr*J32$}Yd^vt+uZznSWtQ7vZC&9i7% z&u*is{mt7khS8_KOU+yQ6o1R^mx!Z+IN$1qSq&;vMMxMm9E76HrDm#a>1?{%RJ9FWWh3jNDeE$`P}xJqWo8%Ud3xb8^A>>GMK#el zLVvpm+&lYnvsnfp-(4=G|K?YioKpDq zD+H;3@d~rEGJ*DAVcv;7hjr8yWV23r*u}@D*mxCQ1z~2=l~52B1k{A4Sk`Y|X?A3F z*0C$izUYvpQKEgYpU0qvET7j5`GQ{PN4^9KTfp{7s)K8wEa|Nc~z5S=D zrByb-IB$U28vAGo@ksLaZJN}ZCkChgmJSY)mYp)3AaEv9t)4C>5^5<|_pm1rSwyY* zSh`xl!zf(+Kb1bj|W+*^v&ZkLM|~CdoTxoQqx@WU@KS&Ov5x;03~9 zPdS!C%?FEzMT5=Wa&CBY`0-$qy-kvanCv7uSYBoi5j$!pcB~j|LTfb$a_CAW<}aU7 zkNG%hVghXeID?M;V`yUf!UpRMM@*sshkkP6xT&HLJFKqPn0%x^^BQvoz?3o6Yzyqa zdZ;-J9nJ{>AvZz>EkyV(YUlH&h~YQon0~xR{l4bt$^xQD6)pAKJAIhq8rR{taL^k zN>YmfhHq{(ld@kvZ|9Tkh|Zvj4)s|<75#Btfcy^i$@6wfxyc;K>*FS~eaGKVd9AVt ztghCb@=q$|B6C4Dk0~c~t@JSyA*)5*cwSx%gvY^j zvDx1H%o?_nVjxCiJTuo&Nimqs0D^Y>0Wnuz1|Uw-hnswuZ4AefUiuWx9&Y;6fB%}5 z(NcBmvJS^MFpL|@Du#Ll*pVA)`45iVL(vms#IXL z73eicxm~K%QE}Y;bUJnmCi87r1v&UWLmE)*m|!-h%-aQsabElwlv_XFZ8nXRN-8dx zB@33^ZnngtLN-gD244`|bo6#J4W0DdVP*@E`Y%8!YfyO>N^Si{02Rv9ifPh$^$;XF zb@w4etOAag!pF}r)9Lv;%p_Z28g0D8>}mVt5DW{=F0r$B$wK8EHg4uFQt!mWpgS^x zpE=b@yJ+g2<`e)YW~A8~m!9%6N?zuVG}|*An~~Qvn^*~xFTmft5dKC=H%!*PHD|p_ z7g}_e=>~7K4$0~vEaOoEP_QvHF9U>HNqA+A67Xs*VLEJ-$%#4J$akMVXf}?N{+SHn zwz5pxLx8(fSn<<*S+@8gl$D_l`Dr^@_O81{eeGo#F^N0x7L$lf$krrsgB@i7OkU$i z8O4t)>BMEaMT)q62N=?+-Mcy49Z8q&FHBVf|ihx&7_nhjHQ(hMNl-17)|!E8 z+H?;@`&&ks&iL7{e8?mX)Y_skdw-_YC8p|;S}YC|MZ@nkCm?FY!Fx@A%J&Bwl0Ykr z6`%QKjWctC+ulgt_D1oxw{V=<1d`LZaprv(;$bdh?VTc7>W;-Gjxz5vo8%U%!Ej6= z=^iv-qa+AodB47n?zqo1Vn5p`-QDLh#9v!S-`r;o!JK!!ACt0&M&57wad|@Cy?MXc z5qEX>o81{7c9Xh$KN3(sV`k94GP7xv6;CJ!bS{G~*UHV+E* z)$qD&;_0df&9*?9uOup94L9{zL3bE)Ha#dXr)W#(cuIZ=|oC zLU(UPl8ME)2p}U2ORaNsmlZIExi4jnH`CGCAHt|)5hNAnpHWtX7jE`P${Ay($DXwo zx4`!Er|6aO0^4_t7ubFbmy5C8_lSkHr_&7)>+ zv#P(r{i8xzB&1PfIzbcQ!WS-pI$46P-EJtc7QnFv3t;JAFMumW_l|SH1bXmZ@Ys%} z=H*xgkCd8z+v;zrqSSmEsMWJfVAz;4iDAE8h+#}7VkVfEfDQltC*|2Gsp#U_GbadL z)M;ySLAx1M{%C*#XF`QpV14)V$IVO>O0p=cC#evQP&GeG}E@!5I??NoM{5|(_uZ$i4Ga4QI?L25q}0%%rv`4S&A)w zGLxSOCeW0YJSOxpP-4w_4+jfXkD1K{-avCZ$xMixBSHD1;vG;K{kT~mHv>=ds8SOX zFs6p&-g5!D$5H+hW@GRRI4E1rL@PObR*UmB<3&1X>B}>et)H(?kivdavnEEb* zdF3qgP6_5E0?e(V0fqX55az%^`9CPfS4dd0(s$S#FsR9&ur?sbgMZycv*(y4&8jEy zOz@US?vI0K|If;=r=xN3^k;c7Ad1hE<~b~e0Z(1D7#hrR;3@NZza(pyhbq0=8qrc& zDNk?OT(Jau&NbWGPFS<~`?n!+$4g(#HC3L{7py7$$2=U}fY~jhnyF@6nl?}Hs~1D+ zMF-7)DZdeA->7U=!(!BJ1Ky7(JSlUt*l=iE-EC`FQlJUa0B|q8=nQsSOMAKY^;_;XZ3+w zT`jNIMB# zI*J~YmLOFG5{e)-p^1QWMf!dAo;gWCzxVaKzkC15HkFylJO@06oAqma z7kA8aL}5NB%@aIrYw7&)?POc&)OqLW&u|NK&-r5V^PTK^EcE!a;SPNYy|T6e>SHMn$aQ>%sk)Ynsmi;gFFzPT+VYk6v$68F zEfmbOaG|3&hWo&C^F$vla(E$p;NU;FYk@w{d~+!fOVF>dWayQ`(n+k~eW>I-#V>Ze zh_@YnmWx8*JEGsi?TbgAn^SHn-n-ZlB^KZ>V!(sw>0(EO|ClR!_Lv`f{`c>cxWo}J zZaSvVN&_Sra?^(79%)1zcyQ=&Ng4Od>OC$#E`l9AA#Q^i2GPnTj_?|#gdjptL@c3U z#nR&kQ5wGFSrj;TB-a{$Met!5%B)!Nu&kGT$nD@bp+D3JbDh4_@f~K$bD5acs>>V^ z@ju_vZ3~D~Y#<|%ME5bkl)~rOq>TIRSw0# zZw$2&35cOC)`yx;T(NsrX~80d3!KxhaMpNEcS&(3>V3ZCG>!a9Y>pRnr_0H&9JLZs zl#9k&O2Z*6%HxSp=XP*q2Vq*(SHLRu9rat`sA`4H(^L5kuzvnf9oDQ6*5Awe$2?X# zQXzBx{*M-4DQPh|Rtk^VRsD&BD;@RBu!vqmEzEl_hf?e+p$D~HC78o?Vk;p6k6Y!a z3=&#@2inc{RgOAga1;Nd#h{UMh z(AJAws~yok-=BjM4v=fW`sabCQK=NAaSb~g_wQC*W-b)W7RcFKDa<(7n&{{_ZSP8I&DgHe~ z)bv~D=tS~2L&|!1dys-r z*x4LKpR9Mpo2H?lASG{`P!A>y-TsMLcjo?73(WM!dKkiPllRw%3o2N&UtVhtEy>#?fCtyg;otIC@%+d15I1iG9B&h&F9- zG}fQ@p{H~{EZD5*h0wf|zZdbrlW=bUt&fHYq{+9ADf~r~(6F=LI^LE}QS0vPBV!%vnGV*CqpV1@|YWBMvm0G{;E)7=ZK0Vh&+@~j?yoSZk z(YaCS@Q98tXjb&FKH1iX{QEo!^Wbe3)B52?$4e;K{4^*k+E3znKB(N;3Bv&giNza} zy3yfj-S%4y!UQ_ela1gut10e#N1QePatyzdUjE)uv)ae*5>X|s;>kUFE{w^@g+cp7 zK2IU@jzeA`;*_wsVr`=C^Y>zC0)G(3uH+vanJ}Y#^Mj)?c9u$1e5$9NFjzrOdP2gY<={5<6V2jP-kg?g3l*mUI!>bgQvyD)y>81d^abT~a_>6## zrGm|l*8covK(a1%@oI#quet>;m+h3c1(by{s#~xKuuLazaU_}m$Xc7yv!!~jD_h`w z#Cqe|Xz7=0*s1w8N4WoiySfjU=kaa5i!?7sJc4!Ui*1gY)(L05;msbCroZ4)p&oNBS7A`iq7OAh9-?V3@;9HrQ|z4;$Fo~ z+o6slo_)KcV`RZXp*!&fjdU&Hu!Umep#&mAHRq=nL&Amc({P8B%#vBTHj^g(2=VNbwZq|CyQI{oF|M9QF;s2m%yB%S1LHvU|M7)pi5pCO1iYZ_E`78K* zWSYCIWy$CD5MHi~1@3g%<&12a_OoLU&DrVjHjP1q62<@Gs78l(Ix34+fI0A12u@(M zB0#i)8tihEm)(8svCH9$k$?J9Ees;>n^C;5Oy4dWU-H|nf2q9wrI&VN2SGOPZZWWv zcRS*u9_`Q(`nmt>+Q0Vg)Nb*)q7PmV4dY)k9Lr_Cwt@71P1>V>ElmH~&OJuIBJ_R< z&xa6B-~|!=iV471zu4i9{WdEZ#{Xrf_Km$_YK_u%C1b0n*6{`z;k;!UlrdX0$X|Dv z@Iu-c?HIjPt$#9F6(?Fn89#}rSSviCV!}hwr1M5Ic=L|@>!2L}Ni@nxxGQOto=V3X zWu(%TY1Gd~qx76Qqfsaf&q*MEpV6qwdZV81Ga8jxI!;t(oU;BoPJVjGFLzWS44&qD zjnb#fNIxpmkeo01=!^i=p>4n8H9>jR_0JC9Z+y0f{#jqV?Dl@0__+)8%6@&S%1n=+ zsBQ(IY%`42KzZHo2oHh(q%42K)&cG=K03%>_of)VudVlf(*dLRb#y`z2}TB?)GcjE z{=Cwbd_V6WEupl7f>7T)D4JlDL@Lwo4RdrdeR@zQQ@B|8*f%N=i=tZ;Q83+E21GPKk@B>qL5nH|fVC2&ze?KaL1ZBH*YaK4Q#4y#aheGK~LA8-SSN zqoVg89u>WJmk}w``@8xFef4@G$g~AZpy*#5T?P3U=zX8^i_!N&qwn1EQCx-=PW_V> zsv0#e_yX`l(HgfOrGzMqiWV3MvK?~-$(!fv^DyU_J`YFqP9HrcI{oyR=yd#Xbb9x} zQhML^FP(NA7oGm>xahRI2t%1pk6s`?xc{=6ri%u(X zz?4jlj@Zu^Eajha1R>ok>t`^8LuVaTsoH6nRmM=-X-5y+#&Z^T4nMwuZFuu(M>vSy zjiwKGk1pltu=zr;xn^`yzXqZQAbT#CY$CjMD1FY~sQMW(-KjX(mX-NRiDcogyI2H& zwQmgO(zVam5um3VD*(?P3^g#*li>(M9Bl9fZz$>KuZIj!@)z zN0j;JM<#%qHaqX=?ETkM4`7>u<2-a0hsPp|Zrynpky9w_f+Je2&c~#jcLbRbzqXe; zUVu#?jW%3>O80=yUT`Et=xK}Z#7W$|@Fr{`P>14hKt^2TMXoVBT562yxWj!t+;Jbh0)-?aRW4dempN?i0d1)vL3j|ej zReJ=@RJi+*7AxsGzM!;I|{yAUx+xIg4mq#MuGHf9$;m zRPd2x&CaigI-@MmN)IHpysLv%eM^=PRT6EWlU`~aIZymZbT#l+V? zA64S2N#UXoLdnNZttcI&+I}hr`M7y(dJy&WQ$NJzeSYdy44%th4dr(q3{a=zj<;=U za|~aOO>GQHG(k-W+hSKD2wc=Pbbu1&=ByEDK|Nia zL)8YnSvijzh0?nf)L8m4OkF2l3L}dKk1*H9tFOoaQRY8fv*Xoo%eMO9 zzc-lU8U3$qJy}WJ_Bb+2k_rX}uwJY8}Bw4L5{~1DSlGPMke3Y#6$k4`h)NZ&qvyPg; z34UW8^$mWs*H!1?^t!rgrtgHqV>51+i;F~%-%e^?kGGMudTM<3`5ulB(# z{Z?OHj+0pp)K78Jr=dC3_bsXPB&9);+k)Bbu89xZKpJ{I?!iUG*=hlY-$TMTBfgCs6Fwkd`k=~ z4~x09x~ zQtO#K$|+6hX)?(3Y%5G-3O#P6uEA$kDPr7;6}6+$ks?&eQV_f9W>{({@Y)hP&3Hkbh}|ysMRh#9{kstwz?-w}MO8!;zo>Em>!vTM zU!XTXzNFSJ8RiEssnPPC5DI@;ooec-94zO|Z5k&9x$<6CEu6k~w^gTMu-!g(Ld19gEV!X3DsvMXK~fq*z{I+P&?tYl&($yw8*4% zOn55&ln$m3L=nfI5mjrs@rXQtD8e)HlQ7OGHeX)IPyPl-LwSHYiDL6+>b+u$B)(J3*7*a+6FsF78)f??=+C!}!@%>#MrOacLP0ISa9>Vm+EqJ+iX-p3_2e(yz zOWh~^O1Ixqd4yvEaE1EAd)QOuuEq+^Mm62tNjq65oAPN5M!SMtip&puTXaWkIdI2Vy;9VMcr$#7+y(?BbA}#r;Ht&k%rM|0H<>t@2l%H%3 z_VHIlBCxG9A}sTH*`2$NDt)QN(m_Gg{yp`&pBoEGH(j&&>G9Irbn8rAyRRD=3HI%^ zG_4qZwmwvRyj`dX7BOLyt}dx`t1nhcC%WYcF{0A@*kC(Rx^ximX78)M(#I6|Q)hd~ z^9E)v^y3Z6`%(oes{VF)bgnSh#O=%JjUR-0c-jWLqz}}gd}A5b54;H1lYcvFw;3hH zECy6aPnx#X7V3qB3U0cGVBjwG(T3K&f6YW`{nfkJT9Gh7$<8TuSND(9@_cy?7@+3j zl{Nq*L6WepYIAv6t0#&Y=#IZ7`RLp-%5)}HrsDakQ#wYO3)JMuN!wBCMn*|9vHX$mAzTw4@JG35{{n2s z$EcO_U+&XECiMFzIn`7X{9B$>jJz$f^`9I}O&7NHr?Z;61Z-DHJZGob1J#%+2I6G` zuXrPKC1E%Y`Udt1{=@zSoD*4j@)w;QsH%4T3ToCVsOmcihokxQ_8@gU-g#}1+Rnnu z(D7*f8?dx@7%V6<-|u`dO&_er^DW0hy=w#7s%7&F7CJImttszbO{S049P_eSCfhao z>SOf-Oiphv0Ps{EqSgb&`_Rpgdj&a*dVw>$1`mO-g>R(~#q6cf)S=*WG94X?7eQb! ze<}oqPM->aA?s7{U70R?stXLB!*qe6&oC~)(fwf{0}q-z98!e`{WV1(TqlI|lJ4VPQ z*T)FC#A|GcT(Xfj5Zn0d;Oh*2pNJ4MKZo2RJfc{8U90b$Ej^+Q9TDd2_RFaoFe z5hKt%OU>pZa5M|k-;JtH6A!#R4cngwjh_bUP9ghr@#@yo)jH_b;OT0MGSiQKJwN>i zr$aqJ&r)Wn!}0h}GoT)LkjG5$cL+Z-MPG_$stx!6{_4CHWCL%mF-ypMg|pPkB{I>I zS!xKEi9)i)n5S24Zg;KAhA@uT#Lwmpb+wqS*5%-Dw+7flfo3w;?2MgKLGq;RIqD?vfYY&UX&gj3OR-mO zqLvK+0X4;yv9a(82IX{yV=WzrZ8d|7iRUJ~kmN02GCOPUNdWEl+Sj-qop~XtCsqGW&62*N z125v6b12|Ie-r^H;NU29#VbG-xT6I)a#HMX`Q`Ze29_{H5MLB z$0n%T9jV2uN#TBFG2!;nf1-rz{pW1V z&Ho=}BXIBkc{WT_4+qoDHc3@r4^%t;hk4ns|G9aYNfTd6vQhbips})(Gn3vbP(S&X z$;rgX(f_}bGph6x|6ffGy>}QUgH5i6N7S}_X=NN$_nDkL;3Gq78ANncEl-1gfrPh} zPXD4Zd4o)>Mv$EnFZ%eAdJHnBvE)$AFbR=&K?$_(^q@eKQqJc-1&(Qgoi*1QobCNm zC_U}wVV%*VD4sID8t+5H3WF<9#Z&5GkCPIrBNmsJ>@L64ki4an1Yl{P2A_rybE^9r zUi8ix^+nS}Gul+JKn_azzk4;3T3N0}P~51FFO%wj&`JZ3s|0>j`0#ExRs2=G0akU(4huul z32dMpDf!`pPVtSl{x#&Ua|GTZqD)q#Okh;;}snzl5^*2|qW zTVhkzg`#pWXr8+n4!ODu_1<(}uN9hoQVoVQw{A?wPo%N5KJm3ilu_-CU~0J}5giP! zhwz-i^=puSUL~@BY#sr!$;Mx#|F^@zm`bez6^R9MTIwShGjeaIqAfA2Q-kosE4k70aIdbhh{vF^6oi|?yz~rpKSa|MFYLw11ByrTnc< z`96Qoi~~A6N22xCV?=(x1>vO=#obn8txJnzm1qReymVVlN#ytV={`NtTRm*lQ{m~; zBa!p}%d{XR95?@PTdisyh?@gA@}Hd^-G1zaf7jEyu+@Pqr~jo6!P6*1y8$q>BX54#oz{JG!H;_F_A$}a zdk||oQv67ZB39IPSvfr}LIk&^_YH!bJFE_LrM-WY$F7sVWnj1$LPQrwVc+XQnG>`1 zmE$`4x9TsIeaj|USv&q8Z+TGmEhkZ{_nEg4-tr0gK2&$05<=laHCejv%o|q`U>1>& z)E4p-*;xdTK5T>ektQ1WNF8YIh=D>zWp~6eJ$a;7Ex&oQr*c|WR!)Y&$@V%fLg4pn z2xHe{$U>v<(z}l_RNqj(e8Emdhdq4*QKnQVN!&mMo`62(4!bV)($kOC3V=qJo`BNE z&`VDsAp<;XSA?CMPavNI_doWj>aGY{$&8W!qw^@|DJb8EihXLepz&rlST9BJy6ZIy z>&w?phk`)~t}|9Pj{n#;$p>Hkc?(VOVu|tu6J;itf@n^S54<_RMc_>+LYKT)xHKW# zn{jho=4Gq9YC&~hP?Ko5WJCRe+&wl7*|iEve;i))30|Wev;& zkP;85bYB)t_kCG)jI48xZ)Ixl$KDgyOcWT35&OxH)sm-&lGMrrz}|Cx11QelxWl49 zz1*Kw=W6w>L*@{==FcX`3uWSnior@jxqb<5QyQoN2$2ag^*-4bdC3bd!x(5|KD0A{ z)!?|Ktoi|@Q@(EUqz-i(`^zv~#oE{#{K~Csf>rfy@4k8YlWcFslFrX2xp zRr10@8><0(SF3uBV<Gmup*^C+}Q2@b5?fvh3_PT;jlqEZEH?{kt9 zDQEeO7V-)tiF(zErMO>x;wf)xfvYN(Mk%hUKV?L*xE>-j3<&uF`WNt+*n|E@9BE5gB8;R5P4$m}MiV^gqEYTXcVx8`9W7 zGWl1SWqpsaC<5GsHz+@xHL?7<&P(}qFY11?#h99<5v&Rh1re+%Cb`u+wJ^XHB3Wk) z@TdHcLxqv-bqw&$+-1SEHI@ardqQdyv$*l1hewHy7#Q#WaU6B*4Fj0gh({|KN3^#D zkK5f59g71U35Z5VHvHnLT-rft(X6t&O}+wS(wJt-jb>F_yrabFlM58~|1!DpoUOV? zH=ZWOvsg-sVZ&e%G{Y`@D``3+K@(UQ9gbn|@Y!t~tIu-xSeAlKwj!-R0YSU$NcmPO zeP;)H5-Wzv0G|AhLzP(ihIA#dgj$Ur{mW2^=rum))8a~psxYo}sBC4Bu{)q^Re9Hf zsKEa%6dk`az_YbT`^Va-_J1{edgQG>r!+pE%@gBRqh#C$RxD|3uXsN!mau*(nu>`5 zBhW+Nym_mSB#6PR_0PeyiHNt-m0Vk_%betAWd1mICQk1tw}; zcvmbP#aAnqjv{4ML=?5?E+54D&kZ8w;c~Nglm`D-V<=EE4H6`|63Y=|*r;R-ZS+$m zo%U*1)@iR}WtM_9no}8z`8)clGE0^(WYJ^(^9Cg*vgz`;nY1a9RWaR=lonJqk)>1P zB-TQnNi;NxRWsvsUOD~zgCy3`PhVReN(}^8Z+Eh`VL&ogtFYGGLGU9@la7VafhyPl zpr2J?(eC9(HLEhKPswN?G6psU z)@cbby7gY5`ts| zE28#EDc>r{*8;dqK_79pRA=umOj3-el4Rp-0Mh9`1mFy<#-_>{6Ue(d>o3i94XF;% zLteR^me*vlkTUnwWITV?tQ>Yu(`rF(ojk6yjUsBXc3`gW)ndJnoO;w~nWq64X;FSL z8U`WmmvVH=WP{pRi^YPo9HVufAB9kz+U#A3QNPl(lnz1JBlnqn^msHI;I2C~xK-e~PWg01@PrG83>lDD_w?^O)lvwkb5W9v<=_@A~Mz2L*JD3!|y^ z*-&nn^n(03IK-9EfPElid#Ro76-J92F%YGUoZY6PJ-71Sw!3CGW$7{qt~hLx-SxOR3*$0$NK5tr-wtfW?s(v{ z&S~FSL8;LSJ1u#*9xCh=2?G~S%4@qozr8AZ(z|U~2sGB-AJl|NYS+k@snv^@5}mf? zQJ5e53+(9sYrj^q>(#0>??uMdKijw7p)mj$M>#tbFLAqL^l~&nP=s#v|B1JY;O){d zwjTt$UV51|kzfbQY|9!Y-oN1qP(5Yo0~?fV7zlLc;|B=4c&ol+Kv#g0UDTE_Z`8}t zultkIB`S)Byu#8jFS}piQXkcPl}*I2A6{iG{dMKKh}T+za!uBDtaAL@ZVYd??1GEB zHZAUhHl5lI)7^*Ec1&a%^&Z{725oG|8gb`eI~MEt#UDX{fxv)-wFe&>i1vEZdhhyn z>fWBInBkw>vv!z6U&{AejOuBAi!1uLH6K*l;b$Z0hv|`_xOGYjYmGYgg(ev-yMK|;u_G*;QNT}B&1 zoS6}_1bn6rkYlsyYzMXxq&qtuY&M%NrL!5_0USZaF)1O=HHRW43w_y<)kN{8JsnvJ z)KU+i4@o=gz%t*7RrB9I6@?3BW#0TKp;o_#bLKs>LZMJ+cVe;TF1Q`(V3*V&4+VKB zg`Jov;2~ldg6T;o=85$lPnlEwf+^-T=4o0P07+z8*LtDk7}?w632+1c#R`?S4A{5M!Z$s*Sa8GYJ~@j^!R^mPDMEJO!b2;H7+QOIaZ zH)!E~=u9`Aklj^_yhFVV@kIw4@=~&kV-yPrx=DA|5mY|8JBzhm-4UpG;oLXfSqD@& z@&K0gt>{s9dlSCFKr8%uQy{{f`GqFpLVzCoE-QK;I#Gu=S*(xi?--??xT~2n{~iy* zoctzKWByok{e3Nr_x)ag5;Wq@7UF_U1j6G(f8PsLw(_*Dz#gm?9PLUE7F6PBFYU33 z+q-^F|O2dkgwT3N@>`G{VE%ww;c=#TfE`-5a%06%I0?u}|Y3IfC-r z42RuDnrNYeFHE!o_}18=QM4heCl-4O?eEF*rJr0=d$C=TB)dAl&1{nCdL@{?;=g#q zPM`H*8^99kyu)CmtfXM$c(gXyBKwIVIAv-U==4tO^R9;7N6B9*1^RZ$RbiXY=u12is;OZK+4EpVMV#aS3R9spH-E7 z#p2j_hs^Im2*i5j?WeO3;NttMglew7XN46SwgXx97*rkD{*q4pO!u5Zj zE$6(|MwvBU52l0fv-&)^CXmv-{ewpWW=fcKGXN29Sa{nC8Z_|h;zHtrVc{+RY>#oT zzLLdbdQ?eU6fZS0DEGL>Ua!j#Z0mzjH&k*T-UqurU2%4iR9QUUKZ-Vez+Q$;7s|N% zQ@BrO1Xf+&1`5WV-@Qc!WtDyq`8v_yeptfBIXoFknU*t%vF!)z+%P)T4_2U$$@@bV zE$yeI5A_`;k~$PM3Z^3;vijIty!$gA)0^0zRj~Xb;}tRbEBf?j+iZ2+2)LI)1E3-hpJ ztv7N&&K*o$9jq}nD5O?3doR>mY#3Y?O``Sq?WOM$JpnS8`*l*N^Jdp7k_hLls)uv> zs;rxk_)r^xOMD|##)E)^8O)3Y-^?mZh$65CPq&H%B@z47U1X?qyzWC&a0TWQBRlFp zDfm{UjQ*JJhPpH=v^}d(xJOQ?mLPC?%8VTei>{@{dirvTF0gQ-Mwagi4ZFx7_byUW zGtMZj_lQ&MHxK9!4VzX5#SUbNqT3Ce>z{@~_Ut*3^@V?aXD38K>jSz9C<8-R4i z+(22@Yawv+uri3%#W)QfB&=VqL2NXBH5-hjltN<%GhS_?1r;O&giz67Xn`r@{V{7{ zx>^Yp4b~?%ffM{=#>+_Z0S3~w&fN{AnsPp7)jPeTY&ZD)e;n5zb!Exm96y#mT*B-q zb_ndn7|6y$STi^G8a9L>;?R{pgdt#y=&w&$7GM8+XqvfR2;~gL);$-n*KOOt#WNJW zBvLQFBQ0%40$OsQUVqXnI&0Pn* zG#ncgiaZV%LJseLkX6x>ij4ka0Ua(^N@d{vM?}}a{Ew9O>VG#cSfSnVMdxP!Ze8zx zBsN|B)7hykHUQf78LR6at*4)Xd=9&kN3gwI{dqVNu7vG0Izy=9%QC=204|G254xPe z=1X^IY^J!9*|iH~=g3$SuQz?MllW7rDre&p_#TlMz`Ih)LkhfkM{W$pP^v_9vn7+)QxRo_aT9mZ9V zLbJbMcC1$e$k;7t{f{O9z!8)kLu2c|C0plr6X0liNeS=E-L{)x5IiF(5$600g#jRUB|-xrc}LQxEC$( zp65pylbC-1XG(v6>!B<+iEWmWw^j_L4U_m>W>02wr8BO1lUW@;qX(z5JMzs+v?GgK z3TV&%imy^N`My0BjwGZFY-q<+7Dm4onT32S(+&weFx z5CzOICUNc^N}HieI%rcxx8-^64AC4z$g%ym=7>ac_Y|NJC?e~JNB_^waSJ(Ab7o0% zTmxoe|Kp;|EcQBAI4{m(4qo6Mg?K4#UvhpIOzCwJg6Y#Q#ZJHOOIF)(X2bvHYlu23Zy$oW^&(HPaX}DujO=muG~ixc z)De$C{jNBN@$#!aZd8fDh&Z1TSGzag)q6L3CyIv8VXr`s@Zq+Sxj-{MJ%@Q(-SW$| zIjjTZm*#V!$hgn-nF|$u7|ovxt@mU4c`kUwpE2}wF6TAmC#Q;1^s;oKIed5cb{`%8oq#-%k3hYGl zbNH;L(3V{GzGYq@K3j{=rkz?Wgz}K;y0cKfZePqkl;+XM#q1M#(iFPC7);_?C5m5y z%ScmO0&7DGjb8%gbULkH!X|)Fnk{7q!LEIm34d;lWvmfQfJW9c#sjnKr!z4>Md*LF zp2)PgwKxsoI&trsY2h-)(UK1=VPrI&OvF_ia|d9F#&M zRxqAe)q5p|2hfeH*eoHk%!Lqsz{56z)~&)`_#GWu#oEb#j;7evtP1bKtE+K(EcIV4 zbhPEGSr_?gC6d;#dj6cb@W+qgaph;4Hh4@3bz8$KVq8Y9Ved$M)(=qD&Q2lpcr9pQ zF4bGd7V)zM`q^9Su+Pt>%In!me)f=l_Ud}pAO>RoVPiiE265<%5jHDt5cTG<)beXK z2d2IgU$fn2nEGHG6)R@bH~8!lirc_?V?%Ri?eZ7si^WLR<s)Gu?6OzO2@7S9d%`_L}_AlrY z7xvTXw9v&~!pYzDljS#xlg&1=A<|*mu#suz`(~uKawRl~T7J)>OTLI?%@Op$_hKF< zevh%~4CoXV&rLixXzJZoA@uNj=7pS=o8@Tzin+lQ{R8vz=#P}t_4HOSwfKQ~3*b?Lye+{UWno)z1K1IC7wrd=Z{qXD65Y< zEwuhF;x;n)Ni_EML;#N-Wij~w>`}%`gLqNSlupRHdhmBMN{#pScTN0-eIQ8}=+9$# zWFjRTXQSmbg;#({pr4MjkFf*Sm5f(d!W-sF1%?uIm) zc>;u%Mr}^A?U;JYDQs!TCO#$fhKZ+GmYCkZ-6hl$PqPY1gWTp65S~y0FvTTvz36OA z1Gz2E8P*10PdfwknMdqoJ}5$& zyfb1P_MKrI2FXTB@8WnG`}K=asFBRQFm%IYi=cz`UyY`N`iW$-4J9dDUV%nkNl**< z7J=fHx|$cUQ9KebuNW@;Zmy7X5IOM0;vG<+C!A+J@qcEB7b=3BXI=q3c{?F6&aAZh zFu}*Rje;*=G0vct7ubvbh9#BfCn=Xl)3Qqp%H;*v)>5hX0y~8FY`DlO88c01FM^%T zAnB6eiGgqB!T<+vRdVZXCVa99}D zsWSKJ5|g+O5>xKh^bjAtgrs!o&0Aci3{=SXwBQO00WjyWJ*q zCs{c^KVDd05h{Y1qw01POvTQ9lqO$c?IC4Z5Em{^-?{?v1=09dSrs5`8K$I?hRG#z zk=v(&CQ4jn%UpA}0u8vse7y9!HGIjhx+;VuI58>r4o2n7Rpx0PjBkbNzn}2m+_e@) z#dla`O8M-Tl~(1(+NkX{)(Yz*oN_~JhSS#1ZUy;yDtbXs&UsJ}R2pfgRd-oMdUOrG z2wrJ{`BhJ%T7R%^_!ULH{=^Ggc_N5t-ye*ZXpVN~Kd36zC%^0BXNl0v=Q^t%B5(sdP+jJj6d%Zu1Ni?(kY3s+n!alNIE+qQXZ5%R-*$uD0zJz& z*}FcR7Mkm{K-x{l5!T}WHxh8&6eM8443&&@neheHl#qaqJ|rOq)bXl!C;$^M^nwW9 zyCsNV{;g+-06F`&nB6YQi^8cq>r{+V9VU1STr2!S_HFEOoyhMtr05H0VgTILiR#`4 zujxc1an9%bp?JkZ+z-Q?oVAGn3mEeMx)7v{=Z5^-w}l8E zk4X=8XUvu9&@%*Mhg@7!A0+q2>8aEbR4c)tH~$X!`C!_@52lFEu_Q6 z#hh(K>mbk~oi2ULB-C&_*&PXU59+*38J~n99q&H#lh*~&w6=doI|sC{gansC_ramg zQucjt{IhiMK6?#5I~o3fRXywS&kEFa$a(npB{(|62&*Y>6Q`? z7b2)Mzc{lJ^?QVEbQn!|1cKXm7#3g<%eqIbM%9nqVRG&u4D48L%0cxp0qfUF=QQ)* zs~wj;y^)DVUa9QmrN@_YEQ{ukAet9&Ac6Qf;K4D|Anfu^yPJ=5oS)9Z^h8mt?exyoG#y#G@k1-9tU&YF{`bYv-oZWDZ;~c zNTwFc{K7qs7o%=!1Iw#aw7t5YGpj~CI-)*35t<$Q1TLD(At+p$*tR~sVbbEz(cT|~ z;`+@8!Bzc^=Xoi1<=j`%Ncnx8_L#I-^Z6SwaL2N~LE&Dq^6gmO!!9IEl)~#jJA`l) zA|5x0Lu-~(E^kAwXSqlt>IIpTViA|KtpKKmxhm2D%$g6_y#$FeKH^Cb%`|J5d3?47 z2}ejWf@eD*Hh`w|Y~$&FdYcz?9c8r9rub$sMr1@-z0EVO8V!rIJ|3+%E4f{O80#8V zErG{Cr(3lU%L-3WfQgi^uR@NqYM$U7@goj|xpJ+VjoU|Vela@8X}fQc%<{G?wBJ*U z5dx7kH#w0<#k3h2kX?PHg~GkG0Pq{xxy4jPit^IKCAc`Bxx_ov$D{SghVnZIm_Blv zG%u~9jN@!CO#%MM2`_DvoP`Xw?ROCz9vE$+wcc7aDa&=zTl0|U<9l8U<#UM3m9b26rEq7>bjtg< zQ3Xm3(ZcCmLX)-fF%P{@E){ zy9SWJ;AR_c-V{RqQJS}z`_epxG2JAwt!Qd8M5uMQQc0 z8Rkc6vDP2%#VV2DSHIy$sHz*R(0pNrLnS)kTH|7Lv=-ZX)$%yyBH~Bz9wWa(_#FkH zJywhvvF(xw!x8xQd*3qFgv*sFbLH6}N~oqa zL4I0~Y8tN)d%7CtbRCtiuFXeub~Rn}D7D`Iy;ryjDCXoni{%{n6sC zU#EKsFmEC{R1r6&Q^Oisoc$Ue;6YYa<)-mp0Ohxjf}6hvIQy*&wC&6Ct>xJ{bf$*Z z5p7DYsdWJKz^Iy98!6Sbiyy=g)}aojGa>X*{a@_Vu(o#9yQC_*pR;#X00PQdCu3!$ zP~T*Y2N^6*){=uyul5iXy*NyoSCeuaRq*I)x`Ip6e2S_A9)Jw5lbLoJQb+p;gWHIt z4|~EJXR3#KZZ)IK1|=gHXE2C^@fJ z;j*r$`B`T#EHAc~gY~osVBR{5Zt{%Sr}ea6n5~ZLIOs z8?~{<>i{1pN6`=NM$?!F%>wAy^pybtUVwWsHb218m!n4+2!n`iqIn@1s(|u?{ewiH zU-oq=ker|R`#9q~!lW?Q4^6bj5~$&BQ|uwBD0!=m0Wt7g%UefZvR6Pxev@*snAC-& zBjs`&)49g~e9kA5>#t^-MT#hTuosDD>m<}~Er((w{TlF;8Env??T{AQS4bYpYoU$B zdVaYj<`#)~Ew%QhF_jfhXZ~yt(AKXlv;cZ(VV4l70e6wh(MoHIxoFo4%}Sxkt+3kP zr#MAxEFZr|-4!hryLikXKwjl3S`ERr$5@pwmc)qgu7`?N%{=~q9r8rA)>@=>#<%5p zco(I#*24dpg&fF-&9<0Ev=(IM0Vb7ffvWd?Ypq&1C$ozsZ^pnF5fN6Dhdvfk-_roT zmX(uVBbv;uyy`A6xVm+DtsEHYug6e5T!fefi`OHU4nc0cTLsxkYoiT@N%wLa?Jp$w zYV)xwh26>3r>%BU<_e#*`#}hGZl`sWf5a|w0oWz^?X(PBakXiWHO+5X?_D+2wI&5S zJtzyi{10zM1N2Mmu*k4h?2TTfRvB%AolPv!QaBPQi_g6Y=kSiAs97UbFPi_MHJ;SM zU>|b41%p+Q=X+*K?4;F_X9ZGbgTV-h|L!Fdshz;afS*?2+gyOR{oYA?2=T{t=`}5t zC(x@O*AIijqBXZbMF*%R<&NsWD|>3axR8Xq>QKY3T97;=gmU{u2h-bKwHM_{mFd>) zKZ0Cax@sFG7_vU@hL3pA%5GRMD4f|{>jHs8?XGcrCueu9Q2>g)AV{oRg4Ivna=t^O65NoRX%Vc}wh zq$?pM18X$w6lIPY9AUeLrB%8pj?bYcy|5@w;jDX67(Q6HIY}v+^XxQ+iR}r|RArtC z)4x{o%;o2v(b4>$eI~s08J!MqKKGDrw0rg;qhM;uhxQaxU~jE~cWGlNy|>oLA~;Ao zO~p0vn_a!NTGquAO^O}yvyXaf9N4Au+gc^-(R_F%aIWLqT5?Ue;bQeRxh)BzkC4ff zBJ`EZW+-x9#bce65M}!cWnQ%~`P^FC_qH|-@9WVA!lwt#>jP!(z*X1wK3a-|-?n$P z&e$gVzAL!lymvK@|LFam)|@~3%6r;Ge*EPR_#t*_RaKYQeTtx}}X zM8PJx*5j>PxOgpE3i<$IsRzyc0Q+bPo&NxPZ7Rj~)A~d`2vO?lebECY@t6R>67>WZ z^wW5)(fZE9c?l4PF7y)v;{T!cIuC;Jfqje3gok+ehhWwzwDLoZ0|A=*Yuvk*+Fv__ zCdPk+Yxvn=fc67^`Zypc;%9SJ8x99vp4)-vZNy^P`YZXuf#>awKrFFQ_oOE(B%)NR z#k6!BGMV;n6Eu5gX%LUz-Cepo#LE!7({1!cfIb;G(%c;yr)ka6%(pbH6%I~KtHh^a zm!@^%Lm4p$LyGjuLE7gy6yq19uYz*q`<@m@FAvtZho<9T)9X#)%z@4h?|>Jb|7L(IPD3 zR650eqBWAnQ`b+lX}%MWK(a-ZOjImeNPm8!HIG?tQcfFPHz0_;fzii@O4LK@FjQzD z1w%C+1{U?HHlDkUfytLyGZ@m-r|3NNY!s?=1rF1eNS3URO3m7%o$lklJbUw9mh@5Lk5lN6~v@>WM^6{Iw3 zm0K5f6u&hseSCG`G498s>m#%X7-5YNC?k;x4sP8A7>GME>e@o7=}65>UcQZ98VNxN zAvzT@w9Y*EYFLKW(*$3#CvBTvKA7%gXdyh_$|qAxatFjT&eV8L>HkeYjPJij{r+n} zj7ez?hyGKLj_<#w+5T&r z^q2`>Bd`i>x<1Ni)2>Za^K*??yn5$zt&aZ&r(S{81~bxPCoTS5t0WDbpI%9dcD`S} z5`Z`U{2aPQ8Z{lQ?E!I^#%OIYSH{K=V1yL->hU)mRG#{b!CR-zHz#p$LH^dv`Lt*Z ze=F@B1KBo>T8_nXN}(BJHHUPUJidTs#)GoH(DK0pI*!vm0S|EP8?U|Zfn&YNT1&3! z51InC0X1l+YU2@xv3x4l7nGu@SPMjQ7MLbRI7_Q!{sxt8I?#t%TD3_2Z@N-RXJAH4 zVf{c+s6DhkORHd7?W>GLCN!LVSF^MrX?ylGh@+$TP{=fGtbFAVEtsZtH?O}EYuigt zreVo$qT187B=etZ<87O$$8_yQ>z@mt6WQj_SJSn0(+nB@2oc=#OS|)7RBeVfUw#q* zuqthUd?1bvzUUiGU1n-={3#fe=Fo_l+I!Ltx;Rs7-)6Uj#bN~QA|A=xFk<@Zp}BDV zh#P9_oq6U4y-Kvjwwngc!l>+~S+lf8K2uS|+@}Ab39QhKy+J|Zo z3^g#b-wKrD=zY@sV$^sa-0RsdUI%XURqBg9-vXd`O>xs8$UPA)417MFok`azn=|r@?Z>ZQ%WXS zn{Lhqn;uI6Ut*g}p>|)w_WhNs#vJqkKU3#wUBIZfmvc(K2@>2*bNQa=EVe}8N6b8- zd#BCQc)&;hd0HB7-38uR7a16b=4o#OouK}FXeg;PdA{~34xS639UgJ3B{9z!xgyXcG~Txi&}ZY(}~U z3I>RLjp$rWB$vj|ZW80CR|YVGbg6HyRvpRR?ua3OW5)i+U{YTrlGlj*qrzOx9#tlV zRFC-fb;s@Q_$GUy)~q~_dAgZ_${m(C51zMxt&M$M*NzZL*$=R`I=jPGa7^EOjL^`T z3$^M~lxt<>2q(=;k1PpKGgz-^oxk#%jLWjW! z9gDOi6Vi82iLfGHUu>SbSb<2WoU5r}RC{TLl};_v-ozX=UaYCcGxD?h-zYv|@>v$Nft{1*_<_rCI|7DP1JiH7kskEY)6-ex@5sL16pf zKhcnb}8OZ}z-SQA>xarO8tX$LI_U=lp1^|!> zFTV`K`ARKb{t8$j17Nl|y;4)baZ^{}`g$6^N_){472S-X@Qk2aPM;|HeU;`fg0Hq? zMh}}2d}Uek@@!Hr9IWiX4!K4-{2zw@ckR%N725FscRT3uH?SR|c0l+B7%9`J@dhmswF7!@ z&>}G?h3nebeI`LK;bqu?flYyreL6|gT{kvpzerqIwg6U@1;Oob<~!}MM^lTHU*=j{)6U5=#D`BClZr5yG00pM?!V%DLx8w)m#%y-D09&d+5tq4YnwCzfqQS(c;xu^o3TazLT$EaukZli zDO*586Y0nn+#^%}t*7UNuxtyCDPl81W(8#gUUQY`XBerUP~Pe7@GllnHl(fkfVOyEcSd=?ZpeRb0}K zTDSx#u*e-+8-B9a4u}h|<>6u&1n~7g@j4LKcWR4aRm=xbk-y^!8vPX2^K-@6+Fus>0zJ~&~^tpcH_C4BUgmZV;tG#V>H_3HsFYnfJ3G<1P zR6J|RZ=aT80mh95;LXDSGjJc2UBKt;12fE{r~9;?_|@}gh|$P982z(WTkxtYcTEbA z07g*$&)Njs(0)I3B$4S=m)5_jAU1M8cwP#v-VYWJ?pYtDBx=FoykD~*F{=R;er|y< zfNXad!E3lO4rsf)OdOcNnW@;MAZNh|Z^=x3j%z`-NxOoL(kwQN<)fYS#c{0_58B&% zTb!H0%_t4X9Xt8rnEQ13RD5H1R$!TDvzp zn9iNirb-iC+F9*Bmx}rqYc+gVpNMN9-$YSZcmrukF}x9T=xDLfhr`ZkBc#uX&S^uy z`&wO`8%Bxe!2l;y+Ig*_ks}Wyu!oQ;GtXJ^~!Siqp z_Q9-_cgF2XlJr21-r*Ia$X2~qAjMtKY}N+|EaPs`h8M5}AEluev^2z%nH6LYJXr#V z@dYgzbyp3A#Z9eNBVj-;@om<<2y*$DdSBE^Lx#$^|DQ}O;z*eWk!g<~>*zNEd2@a!0!dW;MxB(&-A zV2EEsJXpFnTwKjpHLBg##_Y4bxY8S8yG_&WRJanAVG7t}8dS7Cc0t${o<48=s z0CLpx0jTP0n*2c9jCQ^H5PslUt}zd}o$Fh2J<=H7o&PQ3mzzBn@<-3dT6f&B=`kL| z9lt-}9dWgNsvYKSN;Y}LQd4Q*LJTj^*4}FpO82CJuj7}@p~>q}L6)ySUB4Y^rKf$) zT3t?gAX2{JCmefE0f44Q7;Q5RTvQUhpkr1z05E}IDy4c*X)u+D_*-Wl$Q3)Kdbm*R z)=%miNB#@T`@%sOZW+jt>hmf^g;I)TpcM+7t|xdJW*s-8N6pE7L&>k|Yn5raWuQME ziEjiG&CiyB9MHb7z@rq<{{Nxvy#t~;y10LLVOct>QkAk`S5z!fqo{0*F|nI9)t;s? zQR8#>LewY_d&kD8sDLG6hgeo)0TPWGQNWTIdv7RcqS1)u_nk9$7r9yU@ciEQ{X_R& z=FGWg%ANV#DQ9fU^SHB1zNT=9#>g_GTs&Aqz2x2!YohJ7k@_gxxtlJAxN5eQ7aHP4 zOjL;36L)NeX;M&mFf-gcY-A7g(kkt5u1xc#SAcc1tK`e`_kf%9mD3`v2OHkezh`Qi zrH00s+O}wAa~ys6IN@Xx}hQxiyLoV9{REH0_ew zYw&9{IB1R9wwSjvO$$HyoRV{rt5B|lyh3sTsF0`l;Xek z5{4outurQtV<3~KdTtSGT}67GZz8IK>Nkm{RgqdEHHOrCiB1@1E~z5*(p<(ACMs=z z_Hk9Ij^9sr==fQU0nuGrR|>#S_8pd5Rf^fgg&yJNwR0 zit@gCK}`GWFtT#t0&@+O>M##~$p9OI{mF(9M>co_iUUMne8hP?0{htKRF?c$oUhc9 zJ@%KXbIZc)mIZs;?76~)jm%*2^kc&Vq;A~1ZGaT)d6BQXr!2jAnOzBxqJmdB*$`0~ z%~ueSMuwvTrLWO>uL+czBD-ob)9|;dvc);80+Ksa*QI8*4bix|)uJwl^KEF5#9bS{ z8ib0u0cUzk(;OCN(I&Xmqr!Zn8WrZ?Y7+lSOsyvUjU#OqRhJrj&ti16p2ic!mc-bv z)ul-1$zIrBHqh&BKUO_hst0?bSmM~uRoREZQkXsAv#TKCIIhD}Ta~2*OWa-f>R{=0 zujGR|Q!UfxN5awSqhKjgckHGUX8-GjNY(Xu5BcBUV_iZdT37U0hy++;zl1m}!j>q# zm{59i44tqVq27OnRZ;5C#?Tk)PZ6&a1)*pT(B0>DdJi6A!=zBVsdsr9;WW-85B>P$ zPhBls+*d++9lZcsZ}Jx)id_jq6Sai>9VQuF;55YD)Gjsg`&w9-@}`gE?;%{5@HOM@ z#cTe#QECXT%^_!3J~p2auj3(nBrnG(@n!xtFD3Q^18v?6xEz@4!Y_gTEI3^92>BQf zwC#1*^5IAtS;5BwEuAKJ4+F!cAea2_&~9I5@!_ZsX0|w73fCY0In2bz_kIkQYPhWC zmhWSOA|$M+376dT#goEtcC4BCL`b!OX_$Nwf!!hyIQ2l7Nr%9G5mF6)m`8*Zp+CH& zs);XbTN@!oVMD+n<@4U2gt8q0Wr-mp$x}O zHKec6o)$38E(`(Re%vmmo(D$R#8(q?worMLZ9>Asq@2Ua-+=U*63EK>TTN*LUohp$ zzu@aj!E9A+$q>Aoi35)VkzHFEKUOrthhw?Mw2HC9+IVS3v2isYgrt^4@)7o$b)?tu z?hURZ?L=MIV*TTzs;pIADH5z{_XaIK&D_LSz6tKvSVCPX%CPK5z7)r%e%6mHr>?|@ z+PV7V26!FBB#OJy1KZWuJaP7v1 z)t90|i%V^(2t_I`l-iEKWjpKJ(}aiiL}Ge1kdj??)e1M5+*2!CFqWDeDe)z8 zQIV1<0IsV~HK^-6C#I+IO_gzekd#z?6l%I8d^RL5m!E#$2aOUfDwKTi$OK;yte z1Dn%GYQVNNq;BzCL#c+>4_r+7sCR}B6{!)6ZiJo!;}4A_%!aZnjZmd_FxSS?RIVbB ztMFxO8cTe*RuhGs{BBWMqMS_0iuN$ZfD zc}*z$l;fc>qo`ybHR`6C$iBNxq;Qw*+`KTB9()n2+L}s(xd}$agr?FbDD?=IwO{AQ zYBiIp!yr>LDMFj~dumB>O-&u`fn{t~GpU}|35V|ttmE%$iUxzbV&`w7*B5*NoYYif zWg*R_WF&V>bLkjMvY^+b6NnsE7P$uWw&_4m#G&FcR=a-DLE`iAaDv9~Hi^3$3kKoY ze|EroRmg%~m-z8^wdij>UZ;#Pbd;7t)y9t0$=&Tp{kq2+QfK_}-8Uq@VsqIWQg=kd zdEH#Gwi6mpe2R3E_}*e=#tL)Iis|G@22Bn6YJ9^oaZp$P3diDe}$y)e1pmJGjB?B@Rt^>R~M-XOMgq6fV-A#W1CO$DcxD(1BR_g zdVOap9eydgcagR@f2)I+Fq=p)d$p_726AmkE@nsvZx;GKoRF{RDm8=E(W3RSHS9W5 zTN~M6RcUV9P$R28y?YRA*iGWAQQMJ{Zr!9Wanl~hDHT*@`Q6Y&!S8=J^ef=+?vzo9 z+s9yck496AE$)s4cT4SAJ4#c{g@4Iog=phL7mTd+&R2ribA&?GJ~ncI3r@oxTicht z(nI4TOo9Iii_0z~bxv^eZt>9&6_Z?|7KI&G!EA_{Z(|b}2&DP{!-Thh5_fSk**|7Iet+ALsVmUIa z#_!Io;619#xpn(t75dGZI(DS=WG8kvw`-{NoA*(qPS}ml1~vH3pPl&t4IX^%q_4o+ zII5pim9_X#`VS9JZSq4ce3#^Wh?X#g{rRCZiSOZeW=*C(@n`e;NKxEX7d9h&h&ZSE zNN{Pd!A>X&9oHA1C@E}HUuhG52K1BmX_&QEe~F)(s6o@DdD0hd!X7ghHh6$k-vfH^ zlJWhVZfxctsV2)AAk9U8WF9D8&)y#-)#vuk8B|i0u|d*o)T%lk zNy|`i46NQqQYgFj5!GPdkEL(X;joXT#c+G6^q_jKzZo0;2`Xid_24H`R}C1!PkFfV zu47jv6)!*9y2)qK8g4=WyLYt{mSB7)a;vh}msQ!TgC(Q(iaT~hcl2c=22-ES21^!A z53A=8=_|f#dF2RN_K{ak8=IkCr|bF^YnLs5Ry+2EnDbEysR90(1VPy0`0UMNp@4dGEW><`28Z4-pIjp?}8PkpJ@Hg|1_fmf|&zL3w z=5Wn279va4*suU|5RQhE-hd%YmfqBzJndxof>jG7V?4>2m_VB`%y2GvBDSy zUK|*6IFO7eu)-*yW6Y z!kVmCas)rUPI77OsT?}!Y!Y9RTEqSj+xiT+BoXYJ3XwHk!lO z!?E}{f$MgoxfMJCOyPeTISzmNksUOe8?(bJBu{o^ob;vsW=dr&jwocNcszX?`zl^) zgT`%rywpKE^DMg;FICk}J~J#BngF9CKM> zf&{=UVBuZNek?mdaznD7N5IA$G?8Y$$si_C!cS^=YiE$ezzvcID}K{#aNleHP-1%$ zr8K)$DK!y!8q2F`ZtJ{NgU`ErTd{@z*0)lle^@u8mf4LB7%#bCWBig@=6Y=Qcx3Bb zwqd+f*KX78@nlnEZL+CfZ8P_OkcV$!Exv^hcQMyy=WCnY@VCRt-=5dT>wyjAa7BnI z3a^QPw_KK3$J~sKn*9@anTk)j zuO>-es7&J~p-z3l4o{Nm@T~lmrPjhj3#Lj2)@U*$=CbI?pvRSLPCc_9H=Ew$-Sx~o zE9Xo`2av;^P!FsPy-EINBYQR(DZ;rB_04#<7u{)HlBg&!4+k{uF5- zo*Xrmo*X|FZRR{|8!|T$b@akidTjAjDKrp`iOpe|ZOHD0)?`Ga+0EsI7VqH|c6Wwk zWXmGW9^9U*ENrIqD$ATkrreF>rm$zzXsGQ5yD(GoXWgfRVV1F^hURJ-cebvfxjIXl zj!tn4J2_qItTZ(J8kxh<>WPM?#|*SXb6H*^bFj0EVWkU8Z;@Bk-n6;j@3*w^HD7tz0xSM#e*8XJG01^p-s%e)wnJ8MFsXOLIbP8@GlBAXN zF1X+g&6p$ccfqH*xfWKCNr8Ax1LoqR0MBZ#^4uS233ncDoWG)NefZg4}$pg{>(mc?+rR zm$1g|%&l10MN|=Iv@!GX!C8w?c;lHzw7ChYUfXC?y@Okf=R zu5W9q-S>+^u7nr->?(Zb=V(&r{LVdwADNAm4}8;H50w^Mi0{SXY^t<3VJ!|Ef0L5n z`j)vax9MHhb2SG2co)ZCpi!&IunTYD1Y`)u$err!W;e4JI)~hK)I^7MfARJ3KEv|^iz(67a`=l{kK)E_a@MA&Tyaycv8TJ4 z_ZkPfo1=7SrO#{FvjiznbQ{mt(<{=xhnesByNLO}u^7wi_Kw+=eX&6bLIQU7F!#s% zQmrRS{`m%aUpj3hIQ^w3hFTRkbuwLJS)I{^+3KSo%JJ1+X8z7J-XxWEVSP4H)05K6 zOkLP5mf2hB!n}$^%J^q~5zf6jg7HePCHNxg`ZnyxD*8<7NbWGrT682|Wug*}XN7N@ zn~2^mQ}k|Gc3d5sCHmGsgkeXrByLl+-ei;Edtnn1O7!<+(>J}TI5+gB;@tf`y%d_w zG`TS19dj6RVfH&B7xZk*X1vH-*u8hqbQEkx(;>QxcJIE>T|{l6?qb8cq9uE-6p?M8 z%nMy={uZ*p=RL9@<~_2Y=T?aq%6OdP_1$Y&bMT%y9Jdp26r~qdbp^hUH@O?rY@^mS zber@uRd6R%@S<&0!Go>z<|TbVb=!r_uu2A1FHwgXJ~X?buk}G?n#YVEQZ;X~9Rr0n zd`p7>YR}pa$+XiSl4;?6=%>jJ%AC|bsL?9$y* znBvkOXXJ&!2L^ZGfE~6hYHTB4X4oS+I$wsSJa7te6B78>S#yA-v{tf z+?^R>HwLE0z(Is_>vjnKHj(ekXj!QRuAd}`>nL2`P6$xeF&S}p#(u{in3urfVKbCn z%*N^Su)iio77FSl`gz!fakPg1$@j2w)$cKOr4GF25aOWqGLeDA2SK?_l7m z$LAg_%G1r8dF>40XZMI06 zhrpov-p%adQ85Gm_^8y{<=S{R)0Mwi>tj+MZpfTb6KsaC++z~=jIZo6weO9~gWG-6 z%GEV71W)U!O;c9zYvqfYM)+*=|H|G|`=k!ZV+g;lc8Hii#PEq&Fi_^V7u86Ng*fx0 zSlI9y&s|g7pRSET&xGTWw_>k#{&5VuYw!NSM)p73fPFQyzAK8aa-)NM658~Ru@if~ z=l;9u@R0}4Vh6!*(mdAgWse+e8TD^^;u4- zJp*cD2l{84f!L^pX&IGVgr=<}3 zBfO6kHt=Jar!i>Not-<4k;o-jfhUc`D#}e~X!yI}3@Ei5^EpdH?e)b^$FtIRP=5O? z*yCLmbN)gA_PEiRE^r&qdR2d87|T8tqEAg)W5h7_-DmUlEc55LahmBl=^J-6%ir9T zHn?ojU`7LO2+v~F?X_Fd9PF+*ehUh-SkoeD4Zdy96iJ_J_FCV#Ej4$-?U)kjON=<& zC_%rplc{AU5=4xhS8JsbtDqXSEk8m%Eq-$tXwt)AaHN4V1;uua71 z#sA=9$g=jEXz8u5g~*6%bmfuxw5NMnWOqcytuthQong`I{L9O_DYDi-=UDb@HCfi3 z^DXW=ZDuJOG`wrDcRj^ZRc0yeE5EnM5*n3(Ym=sRCA=c`tM#@kdPnLhQ>hfI7i+)R z(j|n)LPvs4l3bQw>9LzuVR{GD~L^PqS1@FWgN` zwRF{{2e6W5mOxgNYVpU05O0)3qoF?g(H>r^{Ew)r;v(qgAU29gl zrN{}zxpb8!$lq~cTJu&}5;d&WV6?w6_cfohn0ntjvvEdkL(L59oFkS!yj8`?t)F3B zSXne)HV5QF*vn_hD{mO^;_<9{B>=~>X5GL9L+3W)TvvY5D2w?x+JrGDZ9QwZ)s`># z!A(0dELr&ZVvS`7zPoCzMZz+zmbDfvjk{!BzRptB8B55wZL&1M&y7u%_p4me89hsf8hM=aspdfryQ z?=8#SG~2A(cUmUtFxJyP7nOM{TboOj`F5_Q1#;P$h38qST3h{SanYepx8HBkYIP@F zJ&cu8i{Gz}My2mT3m+I9cF+<@kJq#CqnrF*QUqAq+t|-~?x5v$4Pdy&AxksoeVCVL z;nptjqJ79RT$9Sq9-`-m<4#Lu(7YvC)dqbxt_iyx(t@b=uP!c5%qk*39q$tH*|&M8(oFx8E)G zvE-`x@0RAc`&``3|J~AGJ7Fs8blPI{68^Thvj-=`brycgQVngQ7Ly2 zZ98qL!=|0G)WE_E7w+gah#fp-;d5x$PFV(M&nI(Dk-^tB<@+Hl4-h>Khl1IsEhEuj zYtC5sSiwE*F<;j0jHNz3%afiJVamv;V#=%Z#Jv)xl==3JuJkVIMUzS$!1re?(a=(I z#!?$a=fkJp{n@~2L0+uQS&N_MU2Cti7Qo;Z*5kZoAAXXY+Eiyz7f==Fvs)J|ZBeP} zUPSKCXG1SqTA_ZfxQOM0m)QP`mL&Y~{Y&&3uD(PS?#?BuaM+{4!b{)r4R~1-n(NXg z-umNZ%Mea5gT_A$u)cQHqT%n_>(?x+`C3Er?BRUf;=%uz_&wGT`V4bx$I|}R!N=OP zKWi|<6+<2C_ctuF^qRkz>8|C0=C9Os?zN!L=Z&#VQ{5ic(-dfCryl+TZ!(Md4c>|B z{%N^n?fJk0Y|6F{{L7N7by>lWoW*R{vRA9J)_+^7Y4>W`h}MZgY{cJ|KAI$U=x<90 zI1lo9Y{^HP)b6(BJ9wm~ycSlahE8oC?5ew$qk(gnS= zwGQw4Z8W>VPVSd}cJr+aZ)4 zCUfth=fmWw5c=H6Wvz3Jat;2T=U1V?k}C381P-f8ipE69+342V)Q}sn1Yda|e5BU$G7I(lnzL)nPZv|1a<5&ShU4aK&kJB_K>hF^U(0z)%%uD(j2q?yCd8c8Tq0;8f4(Jo36as#M=3j1$-UXMGbpe)F}vAlyj+D2#eu;ud%7z z5#27nTLK#Sv+PlI^lV~NIS^F=IOaMmkZo@&TVP?YRdq*Nmo<|wYEc0bTEIT6vT7ms z!VfkQv}I8(<<(HkyC*m=lex$2T$d|V*+;G9J{W$gJP}?$a@tlI&5ZZHb7nnWm0gq_ z2d~3Cz8bageprO@Ba^bcQmoo1+r_?eE{4UZeY3;(_Jhn}9^#P9>w&>6(^}b$?amI< zV-JE?Ynkss7#Q3sf}LxLZ3$yoQgEkGgfxzF@k7Y$)^a2C#CuxH-Eemy8Q5fOBR9wT zA7!@b z93J50W{|D=XxUAJO*fU>;<;KJC@;SbUTRYM*q1G8i?(7F3r~C$$ac5IoBB5ErE$h* z|9o#F%hPvu_ex*rY6>wG9i*jsEUKLxrc2mS1*?|Z&3*-E0i<_x*8jc(Yick6rupf9 zfN&T#r=7gpDQA9L>-5Rd8fWd3lkB3;?3!-EUlZr=#18TU|I&LdjVo1ZgZ1%FrUc(M z8hE=i{dtdl)jPTi7Rx2B>+Ht{eh}S-1-}!`KdVh0W&T+m^G-A`@j05mnzTZT2sfp zVbpNH|2xm;^+D6E_mJp@KXy&ui@H+Ztb528D2VB0Hjuo?@u5xdzc^TeS=1JSrm*W3{Ki0Re1hiua zO6rGYVlA;Ju65j}qLXRcGWJzB`EBPbd`lS;*UwGtA>dAkBfA4P_|CC{x8-m)w7blc zwgi8qq=i!v`b<43EaF9&c+!RKo*mtRz1l-IaFr3HvZiqK&DS8-5Cb%2#aUBKYv5@| zddR&|;EIn8+xw(5(IO5in|3|rDDS_P&>DZ*n0Rdo`=%#yU@9x@NjcEE7g>z6@a9E_ zGPxI!3MZ63EDdnw3Q!(61&^1<P zy?x8J?ZAm|8sXV`;}+{`mfwbDsb+Zynu#WA#dI_}SIixN&x1{--g2u3cF&kE>YtbQ z&zEj`9;-e-x~;G9p#=BYMhzd$Frbn)=ZW$~dl3DWn{boC&F}LLWeql~et@j;S`b~2 zWxpeHZ}Tl#(%fd%Sf2&aeeu@G_wX*=d*g!uXJ=EvG&tRp(>33)lK130E?*h4!#wV= z^wi4O?ds?3k^F%?%f10jYz{bo*o|)h(;RUt+WTmvC3k}TP$3L#F!$zREDo-wk*$sU%EvTlM8o4<(1@<^ zH6|OIx_eD6;@U7Lk3tx!6 z+PnDSD6fsL(%`XifV|*Ey#{t+LKk;-9mfYN+Si}Lm^HNb8tm)mp;y)+>kPv%PJG)R z%OLQ%>EL05WPDMoo^@=HJYS>9unzecT%cWpC4!6FS7kqZBJa_pT1R~fj?iAHZT;~x zP#!MW<-u}C=tvLA#StDuWOoc8!0Q-GoZs2c^Y*nv%7EO-Yb`m_|HuKlg}DEiC5`vBp==g9+&DSFzx)&V9go5cvK*}AW*=isWI1RsE=5Hs;8z#$AFl`p_>HY1Wbm8J zZ$-|Y;WsZ%~RKX)ked*kL-(OPmWE zruo@?ci2V9!=)(=3PdF+AXO|pP7aFaRe*=^c!~o{TMA82%2k2+DC=@nfL!jHR`M4^ z!=o!}nC;Pd3d^bhzZ*(+@+x3c?JBCk6RHA%+?ui&TxMv5#ui7kW@2G98V#7-%jS6i zk5obfIJp=OSGJu~X!`&%CETIO0F!1UAAx#u8*S0{B${~RAvDc^Et_eWkQ1X}8GLGv z*DS?{muMV+PiCXPmYZl#B(n`)%X~`LC+)2OcJ^z$V+S5P^BG!wi%M7mY|6pX@=V;&l_R(<@Z477>ByGUI-zcQqA@(SS4%kD0oMh4aT2Xu8(isRs+M{&ur`*- zogXC!dLMtx_lmWwggxMPBc zu3+wC@aZ<=J63y)+{nisjGmy9p@e-rMy~yjKQ46i$HR{PsQt!4^p=kP_~kcpoqs%N zIsVvDWs;Mrrg))HQ(&Ys4x}Ag!wu(L@b7-DvX~n4`?ho{3Gp85K>zDw<;WKvs=;ef z!s5ruuff5)&EZ38c+-ZOMmXxU9x*mwGSjFV0HnIe9E5kH>s z^vCYvCka2$sd%iz2@~U^8u@EY!do3zsn9jv3pVF^uSnJ^Go}gB`>|$;a;u0QwiBgouMYBLyi)W7alK+Uo0%wo=KXvXc_GyH#oy9* zGtIYhAnAIAg?l6f`g$03rnKEu=`}4-U3I2KyIJRN<(j@dOfBp=F2;lR9%s2p_%J@s zmVPU*z%Z6+yj&kYUy2_#UJk|Gw()WU{9F=0-V^Aq^#lt0K-^87AV)&v`w4PW=K>cv zG)S7oIWWWE}%!9+kFMiIr2b)x(_mJ#i%#FE|~5y%22VT2SP=96T;SQmSQsz3pA59~c zH<|RDoGb^2U^#U;3_~?LQnn(u@)V5vUo{nGTNpHYSo;1 z3*tfh4r$9GSHQO}QsXLcQv>!}4_B;DJu6jWtGjqreQOu)$~+%ef(=eF3SpU&mgk@| zs8kOK5{bNk=R>{H&e7--_kjFD((rm&gQvb2C4Tyk{3F-a zdY0zeHn{R!If*C3Qe*`^`2cR8R?=2_>Y)|xOyOBks69^4H&rq8z+Y5v#RY_kS(qza z%DJA_nJdIc0l#g9=V?8m5!6V*xDBS;8CSV9ZX@}vk__Q{4-FDdlbDH@3nSw*<#6x( zAFA8ClLJ4nXESAfcA%5#JRA9Bh<{_0p%(yo*8FNDrNi}9x~4)_R9_HD!8jHhGz&U+ zP7pd>@Xl|Yz>;RkL5;c2i}nP*P`%Q~SYA7p*soSzWhZB$_V!?Z&%#UIgVmZXH)z-c zEwd_zD6+n+tgec;h;N!2J6q=7;TGWs@7wiqG4a0Lu$L+;oGk~&ufN9gjGM8Au1tXd z58R?Glg{qt9_Nu_Cj)L1aQn296Uq`F0-0Qxw$+N>;-+0K(tFeX&==CX-Tt7Q7asJ% ze|^#}+mlRNuA^EMpWCs{g`1nr@0|G>iS7If1%`u_ZrXb1`!}drh?sBx%M4tZ9{l~x z+3cKvE7LupZ>9aO^KY@r1OHR40S}xjOx|J-%;bNi#UXk2zwNq3{YW?u+AJcRu?OC_ zUtPIHsg0RXWPAP-9%G$&eggg~6i?xQCF@Vxua?;3%qSAp+5fPTN1P;-WbkW>y4N1Q zrHHJnX8%J07ZOR}SG(7;ka_Yh9D3qpx>X6=rFZgP6bG+7B$}gMRBt-`EsOl57QlJU5k;hocVGUQc#Rd z?{9q$7rpakxB5zhrr|i~W_qDPQ{M9ud*x=K3-F#l%H<6pm-aB-$YtFY$hGhc92?x^ z`K(PAp50r)knemYC0qMsL%ht1O4f z0SG$DgC^bL8N|ui$MpOr(=WsXVGr!GK>yf-y}wY7gJ8izIXw9A0((=gq+B@9q#;+Y zML2zK;{q17NUnu=?=B)so(fAAE+R`dK*l>US(xu-G??x$U}qL7W%e8g#{AGeu!Ijda+!pp`yY{HPg=afsHB~tC+4l=Ph#f68TNo>AIBcoX8AoWo++RD&xpqHef02y!V$an|)2U|6;S2QYlW> zu&8lkTC(D$n0D#T9&yQ8R1f*rjh|`KLsn-QQzFN4I6L>*Ybt`)+Jgd2D-&7EREpd$mCTwc%<6k-w7a+6bkv7g8Wx!_Cb<5I7dSG|bY!=! zrrSEV+4e~6Ie*welIPGAWcqP8Ym`P0>zzhLotP$P!K!BIa(Ml$A9><=XXa(BW?K29 zIwR)^#e7N6ILI4PUXZVDf7@EZI;8_+6+C-`mQ(gdE=P_bXYhGlrRdOk`dwsbrU6i^w&+pCpX;GYp%@aT3!?c?(suWmw`kaZGUC zZT7d%Xv(7N7ax^c_Ne}=@Td&Cbhv57L^g93Jt_^`C~my)sBr!$>xEVF7yJmDt{KRl zM>lM3fvYjXboT}uo1wfXD=^7AWlXSl5lQe`SHpDq21_hL9-YsiJi47hxxPx|dej=F zQTtBA1|1z0T=&pIQM2{Nnx?&U{bCYUmnC7w8YE$-UAmTO%R;tu4HfLgHS`*Kua$8E zba(dkI!JzZRCuS=8Ec!;kHRIe{2Cggb;62W#iOw>hkx3c`0F=rJtEvM5si}GSjTjy zgl$+)HDEsvx?&HiYdTxPvPzITpAD3{;0@GfZ_-%PXO79xd1VT%85p@R{LM6*U&F^T&M5Hf+J$+%0v^I=aZOm ztQMlrMs)DkI-zB!T5^|=jDVJ1>ag7+EF4;%3oX^RkuBM3$s8dW3N1P6uv`%q0xcsD z9kxstT7FVX?iG^Npk=Q*Y@Y}Vf|m0_OR3PZUoCk+Ncuy|0d?3x5#|RiJ*;HQ7x+Q$ z9#Tu@3CSwZlBW(kEW-Ga4cS7=X`v-wEmp@F_I;>EH`9MqK?PNp{T&h#xX^+JN#e8 zvmX%2og!&)7GpfSU{}HqpNTh}Q!6=N?#X(S9+4t{uss>4RUpy@b)<{sB6*=TjAvi} zAQw`@dr9*z#5ZQA@?CbB-ShA5&)UzI^@e{CU*a>~HtrN{<4$TDuPSZhE~Ra}h7DyE z2EOZLFJaHDU1+RSz_)uBwemNxl=1lst-Js}!)^jT?>&xyul*jGpY7+w_qW|nmV?!- zXVQ!bU`zKKWWyd6>_ufOT1zzSEQ3}R@x^5m@ug%_&w3!6 zh%Y9`A@TiLmh`cZ;KY}fLp{RJIb_cR4a;&G6RI@z91ucsVUmjay5=gq*+b1ssjsK= zm>{+>mlC@(m%5u9xi;#1{6A1%sj!)MJB{}e^?kjUD#25wYuZa$m%kTws;KYTUMkAx z3ib8hC%aMkBxu>wrN~JY`mueK6}$Hl`ZfL;3RURW|7RuP*tO@C3Jog$Tm3U>IQ%nZ z=0uEO^6!#7w=wSCwCIX=o~R#_v=sxu$@WNW#C}+#0>EYa>1liSQ_0`kFK1EerfFHL zbUFCHQs8udTsibD=LFJ{JrDaW)%fbI-!NUiYT$-(A-#|hQ zgoU1{8jXLUsuBGQ8UOh&@**;Ru9hua0ptH070xTmn(l{?H7Y6`dx%PYzLpL09uuN$ ztFuvI!6AhTleHD0LRR*uBYAj~iVC0R(W4f^ovzOdj}lba^DwB861EsV`ZADP|3Je# z`ATl3pjJ9S!+TYbTRjRWxB3=PQ7l!8BCS9vie*SA*s$Thvtg<|A*h3?S~h15%0>l< z4GO8udlk}y(zVvaH^1($Vdsy^u9OVyRU5kw(Nwe;a7=y;q_#paEYg3BMI6pdxLAA) z*`~t9kmE|SS7}+^dT3NJV|W0P9exi8vs$Y#V}?jbo?yn2r@)N-nwW9ZDPqR8 zaCys_(KB>RC${jk>{m-35Rx1g52(WqiZBj~sY1(6 zq2-WTGEYcySj3F$Ff)?vv1T9h|L5n?cFO&#c{8g>ww{l7Z zEiSP~60~?y9qIRSkpwN?xF{DY^B09XHu$oHydQLq#|VoqDXqq7902^%F~WPbc$0Zq zG?|yF?Ko>|GB3+j=uzibdh-n5iVYE-C!2{FpIt^%rXt3MSEvWLfJfAMp$8Dem~e%N zaokl$#JK6I!giOjkJAA$X4M5TdR?Q0RJ%qAxr(*eoEZCGBkUP@4fd#rG3}b7^}5y} zF)x2E>`M|6NDSIQuT? z-+Gr)Gto&9@ZWb8P?_ZP5@u|BPsydpP7ayT)Espq^&ZuY_4mm5-|s2RIL)bI%s5>b z&#T3rKae#lX1wzUmHZ4RR`?2DV-mKHB*y%yFyk!jcKYuliL=Wd)$TqXrDDcm_vukd zPOMkU7ak>;G3UOG8RsJ0Av5-SsN~i>Cx^^9s5Npc`yu64-a{&i1xisE9w|kU>{JnE zWcGxB85umM^xsykLZ;xeuP0qfxJ!*S#k1XV#O52pe1d=iuR|l{-ww+6)Vmx zRg$~Z$ssGwX@}&Nlu~k^lu~k2ofK9~6RIa*H5A4dFKS|2xbkaa#V~CwA75OK66dV= zO-Hbzt5Ymz#T8D16=yod@{z=qPJ$Iri`!LBf)&3b<;05BontwNtX7_WD5!4GWN zsg~R&BsnYYQitspVVo6Hg_fN{OSW1vM@Vv3%u$EsiZITKK68bte9h0B3SW=T1kF6C4v<_-E2=5 ztXQCqR9G&OV8!>{V#UbfQM4Z~olEZH9xLXOk2(DdCl2byn@RUrK9`*59?R#FPuQAC zk61C6{408_3J)#*Mg|io4)=)t2PiJ}h~;z1C((s;f1%kIpm^6Kmd_;@d&WALOAhmj z6+?@sog9Ku4_da#_mzL4tE)f=?`;Oa9J>%(*Jex#2_RJcW!J5hD#s znO%2!DI!LhQDUE38$Ll)H-dx6 z__u;$#jqkAkyL0{aXk5>ph2rf)sQtRMC@0MN`3;Io%h2FY;#^ACYv*>#fr)1NzN5P z#K~ok+E^WrQX%5m>h!27&Mde83y%_r7!@3=3@gGnxMM^-9IE8jbZ3W%SU3o|)i{iD zD>{sdVkQoQ;^Wl`VM&bB86b#OM^qc}iB4A-Mx;P;$SlLCIy#3L-8Psxt&4 z_NoU&k}LJ)A;RG>O&yjl!Z;kBM|8kpsnD`QExA%iayVS64qGL{I2`tf6j+BJ z4ytO&3?a$kFhd=-Muc%V%obWs3oYx^lIw*ehr{*iuni)N!(row0_*StTQ;dBGle9F z!%THpmI&i;m@2gF6k0Z`CASDk4u@ORVOvEQheMx60_*StTdZoy?Lv~n;dXV{4iU!T zFkWa$5n6VtC3gu)4u`wcVY@{bhr<$~#iKF7VYXT_M@Vuw%qbVfXPxheS!V}qm@A@T zZn%sMbIZjC8~#{MNU-4^*wL6G2{!ym9cgd5NP-RBqrip~Nw8rQ?u8P;hCi#7>@TN8 zu;DlMNP-Oys3RRL7fG<;fhdIye?i0XQZ_u)L}@AxIsXeA7Fu}w*i^KSO{u{+Y-=Bz zD(&MD9NAD|Hq0l3i4D&+MFXZ9MD%J#?R|kWyC=WU-U~Jy*o@e)e{)A{IJ>!mamSn; zvf-RKu;HENl#<8IDJ3VI#UNt4R|s-?y#jkwaG3ClqV+dthj6(66@tT}SE!>6Y(a3C z)WRVgo-RxJVMuT|yxW301pk&~&siJ!X(ug;*yq1!JT)0DIlheMzK9> zNs0AnMZHa{RyIJqgnqlCiw!ReTR0%bw1>xJ66{tYUOiP&?_8S(BL zN?}aWRfG{IlWofKhsipJj5wwfm3n$7dTWn#vN7T`okK<({1!3dbj6@x?P$q;hW#Ay;rOkCs-XP#aK4{?O0a~BhJ@xQhbf=61NLk% zCL}p1rm4fyMHmOg#=QmN;Rm*?P)n{9k{lFQs>4=^Fb;~TLd#B}Wwlx|Lr8K^%ut7| z5n&t@eclm>hacFoPA$1!NODkIuMXQF!Z;|#3oR)^%OIn5hoS5@8$^ON17W zcgdE`YRN4^l7r$Fb=X!B#zAoaqT`cb41O?*XjMyY7m^$lx0ee8C_Yg}5oZ+ta};rh zh^K>)eH3v=IRzlaAIb>{Qf%}dAdeymQrxMIw5wbsL5iah$(38Eahz>!C`S=f9e?~^(Sji2x|`XCu`0^Mh%Ld1C%oRP4`kz zjJb;v8#aKFIc5NLIT-_Npm<7GaZo%h?B$?XGKfI2)kjnT&MFn)n~w+-XMY4kRiL=% zBPz!8Ix&(M`mr*Scme&f15kYLW6FoI9}_5+d<=yuPz?P`+Lr@(232B)530Zhm zv5-LVnmru=#cR5Xf#P+0B-Z#-n4<#4{-4t0CVWc8p7p5$innwX1I41Us<81hN1%BA zGt#dcOv$;UBKTyDupp{xKbF;Dg=tp?I}SmeC`+& zi-uFFR~|tRN_4S;Nc(Bnvagi4=UW$t!1&u&1dQWd1i=z8P9VS2G~T;$Br;9~jAutG z>7MBFa$s!tA4+%E|ByM8U6fJ9DMED`dRa_7H~AXG$ghbQM|@4hIL+k+Vtj8D5#w|h zF}8Si6b&ZMa1mpR4Mx-LOcyb>I7|4;=E(TPXab4ZiU&PAGA0QTj*Lm_usI@(BV#tA z10+rhE%Vfp^Mxcw#`)^71tN?iW8*Ob_V5G1Vrt2SLXsonLUq_85yp`*RcP5Mw4|sd zmk3FYj7!vEOGOw*MxSp4?BNHtq^c#;gd|7CG<8_I2;;~YFSMixEi2TLD}^LS#+B-@ zRU(WdV~Nn>F_vsut(MFXk{lT`)M0Bx7)Qndh|Xb8Xj!M0TrVU!GOkyLZ4hA`8S{mf zBK!auH>o8vg(OGD%yMBs#>`?d@torT8M8z@9fa)2m{m>zkn#I+LIN3=jRP`LB!P^Z z)seQ8izJZo79zP*B!P^Ec$*S|jN8;otmTvlWbA8?B#?2tI?|4Ekpwbk#4Ce~KcE45 z>EPnJ1f|8;>GI!j(K}JJmx{gnkfr(0cxd$h{R(NnRn+zsg+>?lQOofYg5~%~o zaS^zfE0Sl!#h7mi7u$_@go`7_$BJFdKe3BD+J~t3v=A-kji;2H8c!+NheQ1M3dPU~ z#63+Wz#bJY4xFIi;(iy0xVU-(;o_kQ)b&1^K!b~4O?1eMhsu(^0TP@S3no$r@z+GM z=P=n5;(nw|u-hcqq#9lPW|C5J`7Zwsjb|rOYKtZjGzLz#LE}-EibLZuVGD=G0aFPY zGp3TUCzNV%d#X|menma{6M$41krM1OM;Y%Mm&Dm__>KS(KcsN^*A0QgZzoUOtE9_;i+%P1jvsPLBO& zQw{lYHW|NYwnC1#Tq;J6MP*qtE(uwqBF7C$RP?u91UcRzX&X5v&r!g!7=9lA`#Qyv zvPV6egGZ^rvEf{L)Ln22A7Q*_dz1jjgt<0w`~$W)T&NhbK*_E@Q7;{AZlMvzaSJHB zW-Oqxc%YO;!2+c${&K0v2;)P0N>B+OqM>sz3*9G~3OzBI-rSAJwh_k1j)Ae$LITE8 z#UKL4C-%p%&_&2F6)<*Nq@?%hzX0RLMU>uMizvO%ZNQj7E{{!n1u&+k0vP!<0ps~p z0>*FkF975IGy=x)dI5~x(uoi!=mjvQh}(&J0gRJ`KV=S#r_%{WCMzDT?Z7xih;U$> zq7IuX!ZaYbOj00o5(2^pwFty}DA<2Ppp*n1l2;;z5BD8p{BwJF{ zl1qdn2gW7pu%#l51LFWh=cp&Nq^c#;gd_*XG<8_I2;;z*FSHa1Ei2TLD}^Kn#+B-@ zRU(W7WBXNPOCS6I7+0$$GlV1u#*A`d0LJ4AFkW#0jB7+Z9fa(_xTc%}0OQ(nLIN1Q zzXR)0Bms=;)RESgizI;YLqu|?NCFrW>`DYMZd5DTR8ENi#yoo@0gRdINLl3~31AFd zt&A~#&(c4i=Eq{vb~-!W)lxk}X*F;R%FB1P&=}*m4AE9*P}{LpFTQ09GL*J*oBn@* zMk^Uj(Aa1V+A))oRGRsE0gTVG6ksgSI|Rm--&1Dv`<{R?|9dD@ z0pqjpm6RXTI|Rl~n@Pj4&1B&T#Xz<5euFu^gPwH*pu&mqrtMjR81L?|5#ucw{X#8|wG^6SYiDvUcy zVZ`iK3ZodON&WZj&?WYipca;(m2*Ihhjvq`-`h=ZZRj2wG5(=uMU1<1l=ME(zkG->G?&sFnM>(?s8@y<9|_er1Tj|L4`SrkM2tQ56EQx1 zkr-PZAYv?4h;jD;BE}~QF?t-N+ouXKJ`+X9iLuK;Vw&gbUN1qMfx?L~K{*4|PLqiu zj1yxjqJwF63N7Q+k`sg^C&mftu!$m!6Qj>Bg7xqN)|;%BoFXJSF-}p3O%-9B7~_SO z6rp9hT5^Vv-jtJw#H~`T(>j^FM)ROas zBqzrC>aYbOj1yzN&{8C{Fty}DA<2nxp*n1l2;;=qK2NY7evrEiC~F^)S7 zVx&ld7+0txtt=Nw5aTb1_buK!MpyH8MR51pWX=g|opE&k|Qaa#OI*urVC{Yj$5DJRL; zeM&vZJ4u;${v-@l(W3Y7RGRx;1uYK$U7^JTt`2E&HN-Kzc=&gs#rCJ5P(_QwPbn!s z?t16)&DcT0DDJ$)?|2Urvkd&Qay)dX9`A zbxxthQ?3=G#nWY3)BilOMn#J=&r{K#aTT<9mZa^pc;UQ4i|1S`LW}3io^|d5o~5Ei zuZ#4o3$B6|FWR0ZXmQ|08!cXfF%D_*>18FqE~8?;j28P}q5S&t3Khmxr7$wDD1~v& zwIZ~5-JTNE!s}?|9MEE$t5oWPuF`{Ux+)XX#n+U#=a#EOYOHgesIf>fjHvOp{c-Hs zb!4218XMkF(tXGE<!g=wLI_z%| z#(B}_o*+H^fJI8xl23#r=fx-Lu%{x7^J2Wvk|MM`S4$?)kupZkiwVjh^kwWS!ZMiGiZITL`9e#P&@x>u zIYUTtUYwy0n<>ILFSh?vkRE=JyR+4jNkWqIVv;&+jtJwtxJhU^B(%&^OU@UPoEPV- z!xo4z&WmC9$(A>0e4qvBK@Y(PICHqMdw5?ZqlLL5rCWm3HzwxBr0_SChR& zi{6jWeyM1&?IUXVGu#9%t`VuT(PGjgqQzN%JEFzxzZI@q=k{`141P>WssEUgvcXNz z;_$}=Jc*BCkct*FA1hinxjCf8hmVOCtCv!r`(`Q8Vos?;THIWg_NS2Gv}k-nJ;NJM z$eyiaPl)@rGQp)!V3Ud#^PVV0XLb8`T5R}~QrqS!(c+M&Hd_3_t>Uz}Q`o|3anp06 z#YfM{*xjNYEQpT7e&_`~;?%6TU|byE)Sm4|sJP%)6Scw+qs7Nu? zi5~a5QygCfIMOLj?1uiutzx8jsH}*GJI6WL4V~&t`u90gatK_X9`p(m5o> zZaO8K^4(reiW_xteDB6C9T|U97bkW@A9br3DIP1!njA@d%tOhq z)2Ns)BgG>glwW5&s4&hdg<!h4fjEYsR(hYkCNW2ZZ9XqXFil(PXnd*x|>3XH-zdO zL5TPK;##=!Ya+zP{&C!A&Mg##eX~nIKpfxfQsgE$acMvt_nC9sO>kn7xV_^hII&n1 z9p}UbfpMHcO4Oa*T_M6b@vb`To(SWd7?0?nsuZE+PqpNIA;~%MzB=rI2;-bsBD8n} zku49^l8=NW=fp?qu)jqZ=fnYs&IwOwDOF285t5t}pQyv0iZITJ`9e#P(DGa@ncz-` zYjI9YaDVa881PJ@2;-dCz8cxm2S3Q&@oLElLXvah1a;U%5ym-jlhATVXql{*oFXJS zCr(j^O%-9B6T_;LEp6}vTc)ceX9!8oi8It;GesEZ#Mwg2I{bhWXR9TXge2$0q;g^4 z#DWrb?*yE2JK)4QBAN~|c21mAEriT#7)syC)cf)nSdBh4=tNpRv?L~^G{ zf)fkuN(3h+tCg^FN(3hchuEGhIB}sm(xP&a1Sbv&i4!h!7Q6q;u;Le?N`sN&{_mg| z#PUPqJkhP338iLZDYWuoMPr!KOfGZ(A3!mc3?@(<7lvj`1&SNOsNGL<=b#wkB~qtw zVzM!gd(3%eM8Eov(^ndY#|e))E8Jg(i2-b8I3;9pI3;A2yTHVA;T(0?y>OVL!bD?) zqII>qLrfeT5yxHTOpl-rcY8z}cbOAaBhHb_oONX>9|j4IiAgo6Ti8~E?Abu}gu0c< zdDVnTDoTv587B_6+QdqKXdmS01QzUd31Z7?Qd-y5q%P-V%{awt&iC#Whs4do6b^}D zb>g_!oFR3{)U8S#SYL;-F1rrwR1GN>*P)WMx{D#j?sXMV-0toW6eriEtk_VOKryTy z6skb6dp)JX?sRtuimV=K*jnoi2qkF|T@u#vvKG(nzC;CK^{#PO?HT#s*jEYp=xu5aQIpoCMkxDM@cYhft z2C=Y)R5v0UlJOrjR52N%sO0n9IVYCA!@_G$P9p^qkGNL^ z6Z6X+wWl#2rNYEJjp@#9wjI-Cdx*MM`4OXN<7GVl4UYrdzXXWWa*ms1&34P^8#mK?GyLNVTG(fZYfJR!|hMf`afn<<6Tomxr1B zHQ+h-yj$Mf_wg~sp)DlBmuP1Mr0Lvhd z__i{)_eA_)#fuJ%MCU$)#7hp0#G(A_Wd}y$6)J8-B*yn4I#kM6x++dVBv#3>s~kfl z)VTkRchtTI?hBS*2%G(977})ag}PWa$C;4 z! z;9r?{@Bn>jkuxJ439N|32>8-5Q~S4^tv6XYhDeO&Dk)rLhMYN*GZBe1<=8BaArf1- zir?P|iF4%4xtxheoNE&UB+jhk_qQyrYyHRP@3~zENK%#fy-fj7;yjxqR$?J^B!n8V z66ec}7T7dmCHlSzN~A`t#J=!57hxqv$wi`Vim(zFsEt^OF><4YHjP+`XWkS_{K4@N zN-X)i*fAD4K0=A--Qg=+`n<*48bC3Z_T+)xO z3cv41-B|J=8y(V8~7AM{8<;>Lbr+15I?c`Gs93l`0#KaJI||3v%@$@R*RZ`?gH zhV`F#r9FLW`Ua(MW*;BBzO65XdxV#s=z(O#GXtr|sp3rVA4C%v()yO7GJFs%XqqEi zF=vplV!ETQ73(1#CekpNtQb8Q#xGehXRsLm7DrtxJ~f0YbQ?lF+$MVXk^#QCPaOta zr?)%WXT=P)ky11SdLvn}nUD7DKWP1j{6koAr=xvV%(Slc!1wj6IQ4xR&6@XVG}&S_ zSKk*v$#HDMirqdCvy|(oYsHt1aE3&GKxfGE52*78KM+>j?P#AB_gJT9(?4NqBrBf# zC$0QmM`c%#=Bdn9?C~#Q#r=-+hqd62?G5te}6%RSK zVZ{L-i`goGvr@;3Lw*mlmG&{sR@TR~6i0X|mJAguQRrw76^qnyz$sV+Uwy7a#rZ>N z$u|$B;~aGqe|qjcOgwXrIqH&e;xHoPadC<)cmc?$9!(iI9A-@-UgAt7 z<0UzEnPW)CBCb-+RVwAoD$YbQR>`re978hp`I4~*4*;xcIrBPaA{npCu^SviGNy5r z0I1|ZuM~>a)7?LrXtE6z1dO5R!Gm(r9 za_m0Gkc=%{#qVqCOQW3G#FU8JK0LsE#TGd;!io5bWQ=gq@)gLq zqmDmrQAdo^xEXxhqE(F3Y}$hur`sg47<+#M*rP@)#u;*>nKq4BjPsz812tkXrmIC* zjI-q;b8L#R7@O2aEXKKVqwj4Ru^8VOCB!(-=@DY=H(G2M^PL_c#vy;k&2ltvmZNFg zh=i&j#wBCKW*O!58*VE`Q-4W}!^glbCW$d}4DJ0fPRjVdz~0Y;vxu=`42iL9tezNM z#|hgla?%x}`x_v}(c@?!VdH2Zu}&<;oN)x6qvN1Iwqjf|UKCZFbiw%ccmm@$sape*=~<}T?w=%{pKvG6-u z%e797#qJZuC2yURE*8I-NRtsck+9e@5eiCJ>>escp5mm7#fhO*At97{m@0a>{7t~3 zIt;i{Z*sB^i)m^jrH>hUBVlojnU1#DOl!Z(EU@^KlYLm+VqN8&Fg+~RhEe^_;WV0U zVl@9RTs-Tx!?RBJ#$rOan57IST`aD68_tcEa5^`fCQ;}AJV{`2r;~kH%(PBTz+{*j z35x?J)5>Sz#-Mo?GZvF43oPb1*@MMg>!A{-z@a289^qFxbn8iv3RZXfaK&5E$;D*)-fw zX47zsoP-jKxpXNj(X;@Rh(D7Or!F8R9&=(PmVN|E{4$c1c-)DVcq4LR$H(EjeU*h@ zq=m18KyXs(jNRjTF8>zs*Fye`LXa15o`!d3hhQeSH2%sS3Q zDb~rcn;b(aj)mrEJg#zE&b-5!D8)N+>@LSpisf9T5gtH_^>StdXQC7vY+@kA>*D5O zlMWT{bGr_Zq~2V-Z&LuM_`oKKskrF}pdvM5DmKcEnrs>|6(2w&2WrGrG%m6fVJbGu zMOti%Fcn9sjhKoN&RQ8mcc(d%n#GuyiaQnwDo%HP1QjzEi(O-e^CPIZYb0)!vAk8r z(%vx(s^ZPXaj{~nobCJ@tT=}{Ojaz6g}qF&;=@?F%FK0E&VLG9Kab90#lcI+iUSor zD^67e>*hP_T5;OH!HVY;8p$<(6~`t)LCK1VNn+%yoOP{OnM4(wlc|SmL=T-tffdzZ zz;*gZXZx(UR&AuDB|~o{E0!hG(VkdAOaJl;VZ{y3_E|B-y2{;G>REBbN~%9=C5B= zDh)T^Sy=G^myWnecN8~o0W0FqWX0MoWW__yY{mW&V8t_A$%+NeY{g;Q2!@B9`Ho@= z|9Zrkomfc4$%)n5$RI`XwXT>`(22!z>?p_3iG8-S@ZbSdbzIIo!I|j96LRb%$Iyvs zT%~}koR%}sa3(tOj2!!gW9Y=d3>F?dKwnDa%u>!oCzi^wa~wk_Mst-Eu2L>%R&XXd zu|kfW=NLM%g{%1OpuSv`GcR!_I`NVmyUa0k;#g>o!s9BHa%L50q7$p+*j0|96U(_u zBUh=GGp}^QFHtoS(w``J_i2*x7c+`lQcw26C$EFc8@oQ-0K#iD*F=`QJ;yt-Yy-g8j zVyW7Qnb;sVx^L5nnfQFBVB!PVKHB_@#jaUm!)SaI6JMT-yJQycl3BEEJhbeRSz?!L z{w+*wp$-!hduPKoCNXhzHtqTmF3OPaVb^yd1Y4MxmrYE}$RG{-kb+a z9FR*R`8bzGGRuXTn3zk{*_;dgk(gMKE2_?M(PiRudBntid33oA%_An(<>@kUK8=Qk z-fb5%aqup>EPS_%`V;A*d>RQ%wB{XwJei42yTrmpyR^l`B~h?y!*|nIzu8TfoVeW< zCH~-IzY-U5S5S%Ndr67U@1w59y72!MM(v}io4ODBDJgN&K3Yn}g_Y>CUnnuoMOTS$ z@29C4y`Pj=z8?xoN_5E=1CMvnRpN*FRAF*H^)Ny7aMB`BqB;z?LMOV|r^F<+krH?S zdLt=u-~l??{|?Z~uQ(u-xYETwC9bkAa^gWfB^Di|`gae~Xx50){P~c0(*5Yth7uxZcGJ_SOF8(i#DVv2QYnhRiRBqeq`Oe?<;`W&Zu60;H` z4hto2a~h6(y-q+NxjK+ z5m?OQ(yJMZK_!4i{F$&gqJ*%x+l8^1wHC1WPAOq=j|*e*NGaV|+^e`}ToE@G{mzje z_qi|__tOCgj6=^6Y4Tm9n`Zwr~}{a_Y-zIr9u> zA{fuev0pfbU>pn0k$POEM9wVbOax=896QG`1Yb0E}C2@~am2>WJ|wx9b2& zsu-`@6aX<^vq@qxMx6&SQX>{)wcO~sO(PcLS!m=yjYy13E?8vjQ!O{ z48}US(M_91492(%0*tp{3uzOK@fXFWaogn)_Z3&9;f{Hccg#z)b=gNw2&U2_58Z~W_VnZVfniXIq8ToJTu)Cc3IKLHrC zuh2*iU7?XY6kv3zB=rPULVqMM4z3hcTlB%GR1z37E9uHxRY_nRS)~ic8Lr4*8hQd` z;C;osD!N2msiOYOaz(%z9A;Y+dtHS-NjDZpT@@=g$F(gnD&w}nx)olf(Ux2#GCqCH zLdJQn_LFfw_XWu~=sJ-x?mBfg(v`_rdYvY(_BwP_B4fY}TFhuyCgYSF;=&i>s!PTU zNQWDX=WY-g2h~79iHuWf#K;%9>XI?PhAP~sp&rJH9$w!GWK@R%*Xt#&_K{Ih8!6GX z&>M-2Ikj}OOSQE2?sbBU%UtavW4v{hU2f`;vCmDa|Jh9%O@bKB`kUfum+0CC8E@Pa zvy|kjOU9eoaBd8`Md!vRx2W^q-x6e8>1rPtS6QcK%x#z&iHr%iY2{bDD${b|X-vuL zo1p7%3o`x);a~qa?zPrK)!czYNn|wKr9-WARod^;9Exu&j=O6y;|A9@%;?-8W-A5G zN*y!0?}gbK+d#85sezUvRV+nbgIJ19uJ)KQO&tiFgK4h1X6$#L)_nYZddeo=x7=9# z$yL{iuQrkuw}=k)&j%~2M^RjwV7eqL_G%Kt-R7!mMbiNoZc-BscViO`H^Ws}aR-+^ z!&Y4QSZL3u@n^DP(PN?b7U-R>Y{i#~z=}H_55;%4WV*5ydp!|~Z-LHo5sG@qb(Nf$$0_KRQF?3=y zS4rV2`Eup~&O|33kYfiqhE8nZDt=E=Ukc>R!<>muJS@kKa15O|7Mi2*xJr?nSZWqE3f=;(!^HF4 ztOMkzOgwMX9+-H+CW)EY4E+e9M$E*Ea-&N&jhKn=bqw`$phkRSaUA^4Mc9c~x^_H13j)q4*Z)NsgiT zDI_;6yQE_%e{4q$T(InRVl8!;uoU1F+RBLooI>#fR_dVS8O^TGPE2+R#rHrbI*01K z2fD~Pl-~n=+g10*;?ZBgiQQaiB!6+Ck=!Mhc`8#}Lh(J&3tgZ;k`wb>MAdp%-5ZNf zxrX9ZR;#Tw60 z{?wegZn|82t~1TYfX<=#sX4iwp`gUYn$BY6^WAj0_-YrbFsuvpFjDmJlMBE_br>+M zQEv8eFqNL=jhMMwL&I zeM0#|bC$W;$HjQ-)Rg(c)JR-(_M??w?xx(l0?%ejR=GIRFO)wsC(+FwE+$zIHQXN# zC2=v*pAMDmri`!B9E!PE;U6kKGH0b*8(f?mC}wLFoRvCUoK_99RUSyQbv=-lVvSge z9!9YgKf2k&#kJ}{;2d1*rpv`lBdz&)BRyqZfK1lQ2fZ86w#rq8sMUO z6lKaYFkKQCQ=bvTO?A`d;^tZyuIsZjT>ocjxM^;Ji|JgtiMiPRMc^X-OkC{qB60C2 zH|FB>$UGi-Wo|^xy%YS0HB|=1k<`VL5h$ zW5~r^u2RBPisZ~<&O|O2%dw*zLoSAdF!bO7`f^;(Ji(dB#S?PuB*&18Nn9lp9)OFd z<;*jjiCjEm69Xm)~mrhv;9pT?a@~z4(hw0l282wMk+xj_Co^qekq-61h>S zO(XW=PH5ynjo6D7Y7zEgnOvmYrU-lSrI#&7W-nIAjn3ONVlRfiEWCID_K!Bb82$&b zV_bB5gcqkZ<2LyR-X{M*`^IIgqz;o8qy7l{m~>w;`;WBkSGg%G zS~S}}d(rJr+OM_$H|F!imG*5KfG6*L9-u2F*qG8|1{0UQkeS;_zN# zoTeTUY3$UF3uo$`*wi7VZ8o#^!*IdPTf z&`Vvy|JPAHic<3)Oqb+DLq9RxHSW4j4Dy2EPVGm-UC@t)yVhMeaUGXVhN~yM1A6=r za3cOpPD~p@PTb(mPIL+ge_M(B2RSjtotPTVTTws8!dI2M|t@VH8boVkND(TO|c z*v}k8Czf-SMy`@6XJ&CGIx$O*WpfOjIOv}&Ja_xa~ruJ8a(ERr*eITM{&Y!d?~rVA(L={WHyw}UT*wmR{sO#yJ?F`FcIVi|NK zgc`9EkIRit*fe4%zW5P1ks7fR2gC1Ngq?UwE^^wY2s?4P+K8QaMsD4Qi;J;j1u=pF!AQ^aF_g;cgc@w+c;<0B|jFsWEotr>}Fy)^_Q5~ z{4s1}5)-=(rCq-Qj`5sk*Jmb13?(K``9zP2X`cwtU3AxF;^yapiO$1lB)-FFB$wTp ziNl8xb;b{a{zyzr9ww?*y6ZBrau_kuaX4LWUmH$LOdqbx#A@r%Z$Jhz(QO1>7J81L z{@kGc7#wP>iIF3qPm&X}Mu?TGb#K#&d0k=M0!GqkyN;xb&PO9HPQ2xA|NX?<+!u6W z(*KbYtNxEVd)IPp`ZrBppMOI~B`1#gH!WtpJKs+%{I_sogT51=`VUP;xBrk6ll}t* zB_|gCM~u8t--%wIQH5TgQ4b%A9=`Fio!DX>d--S38_9_-pVQI)^f|5lr=JTa zPVZ!&6K8Z%UyU&Q3q2=Be?j%PeL7)#KRdXnIV%|3vC;k9&-Ipv58zW|GQ72s|e)<=ft=us* zTZhNcQpAd-a2qR@Vo4`^oT#V+0VgV*be$MKmezdNSUS+sP8l~FCJb+{3>qK$^pp4( zhGm^}y*Ot)c`;seY<@8HF!!^n%PIyN(2TiUrG%?w$eBAh z6V13oj{VFrG-JqQ)*d`SUoz#)EY3tTX34Q^j-eToxJo8h$(1wnI1|m7C&zYi49(~| zg|!C{(3d@O=3dT3GwzjR`#6SXoXS<=;Q`E;FJ~U$Of=&Gn;4k!gfQbJ9Wx%}cJRH> zRx=*7DF9|XWRt{Z95@xYM~&Ew1#+XqHjUVf%b<}1HDWX7sYTd~g>sQ1n<8vRrwGfD z*^I?SZ??Pg92pjbo<6UM8V2VLDv`&cNklpym?5Xsnw~Xsnr`hsMB}f_EjIbkP_z7|=L* zCXHm?Od83#PK?IFndF}HGoe2c8r^1zs^y(@(fHvkLSy(Wy7sP{MQAk6)(GZm z2BI-yHeDlroK5|?3>T7rz`aFl-b2Wf&G^zBv2c~0+B9R2_hH$h=Fni{=a3l>%(0m9 zS||I>Sj~Mw9JtOSGk!FW`g+51eVRvemo^VNDw(lt9<60y z%%~0nF1+_T*>`WTUTvfdiiF-sW}Fg9M_V09OMf&{nDK#~W^A;sa$%I78C#;L{_mn` zG!MmSzKRyly5_dbm>Ml+sYTz6n}@==;Tl8dhJOro{@oa1#_1mRnQ?}P;qjU}`cksi$Vh$UhvqCD&|W3)ODI0vIWbj|3f z(3-!j&{KA}V!5~YgNLpa>*L6Zi$sTo@Dz@T~WUwOsOje9eCMz!UU@Kl91y&4QK~{|SU@JacK`>nI!S@#X zt)yQQJlKheRGgeRev7b4H zPMpeB;<-wuoSDU$=)^2Jmd!DAVl7v3{E?iPD`)0$COR?CCI(Jy5Kf$XyY=6ocX2!T zHfXC8ci9vGC+@aMVkhQ6M?$C(J8_TPXs=BpcA~>ta3VEgC-#8fxd=OPzg#5WrU*N6 zlG=!!ctCD+(54YP@xWT)#6z%uwCTixbz;XT@OXq1kNyw0$@RQVuBUzDh-I5xFSf}- zkKf?LBI+i6b|V6NjhhIWam#i0-(Dt`iqd1Sj4| zp^-dDp^=>QU?=w8NY)v$5&9!JF=C^rdfG$RiTNAJiPanFdh4A^PK-&_bz+Hi=tm#} zomiJj*M%;ds6XdCl=flZL~GvYP0%Ij-s192V&Td?+H_)a7%W@!CK{|`8eMc=OS3rf z0$jc``*_>+VcZwFFX+Uno5_g>Hd9|OTdqw%(cA_81Ra%}IPfQ0%SsP);%iFUPvQni z6ZoLC9z@LEXcE#$4{wMb(l`9osN;Z(bd867 zP^?uODY;vrI}#LYw$kA|x6#_0wh1WS^04pb;%)0P_uj4t#j)F|e(ZJ{&RsE_U$%>< z-932P>3(RAAwx`4y@&42MfVwSa!k#jlVd>!b^hlJ0mTP)Lb1_0HHkZ5Y9uHg*+EO+ z1Uh?Q_IG(m*{T$cKMN@~+a<*o>#+iM!m%VN4%kV@ityxb_?za5goR@<6_a;bs5srT z4J!7^7V|a3QYE9kO>h>@@zkYa zcn+=liX3{@7Uo!}IL}j;ieKar73Yf%(Kq}pP!FT@-USmTS#k6(G2Tc|T`Rgj9_FnS z?xOLQ?xOKVd!iNBcW~m$3*hPse}>+b4^+gTiHa@xM8zLq9n>%Qt2_{jU+}lc6RG%} zGUj0D({K-Qu_sdTuSypG8taKve6b@h9Da36<3Uo0;wecnj#E&IadK=a$54uc4zcmz z0W1?QXD;VVl;UzZmcTKTVlG!H;VMaTW-@1@6qDuH3XY)^Lkie<@Bn>TC19p z_IN%5isP^0CRxmzWHD_T`z)JevDhT{d;SI}=2M3WiUW_rCMH2~@=@CL55Oi`4Of_h zJUq+C<`f?#DHa~nlVZy;VY&iOT`9hN!`wyr*F+(Bc3e9O~*+)yN*MLBq`P% z7gdWqb*1>~36kQ_6Li6ydjh4nLO;y((zw?|{(|jCUzp1!GKw0OLJRdu}b( zTaOiW9*!k}G5b6nt3iPAzU5d9Mz;$VFg|DtjH#Ezd^J7-j4qdHzWguKVmuU!G4irl zjApyQ*rJXE&cYUbFjiltRd>Ha2b$J713uAqSbHV0QapR6ch-gD=}Lm*jLs}sg5%82 z>h0f6RWNZ99M4sWanI`9HXM6jrE&MaO5K^$S=?lt%cavrJ}R7}=R`G)B<@=tko=HwhKdoh3fTa0>D< zMvg7y81gX}ngc3IxXL0qb1`Qk9~aB9SdJkdLvAtr-~q6u$eD4RiF}NcV@o-Pd`#jh znOr4a&Rou!$j9Y!EP-RlN7vg7KX`z?B*~e{oQZr)mSZb8hJ2jLRpPnIDmimCXCfb0 z%ds^aLq67W6~{Z&m$h={I?hBsu9IWyIfi^30nHJ9TqQ-$+{l^8$Bl9BcgiWMPKc>`+ zT_dyeuldoXf%nV?+B>qv)-8e}f-$sl(*QoCes-BtPD0po>6WXZGVR9-hUI zeeaVWdq2?gJ15RkQe&Aq2Do0Ab+%892c_eq{hO>>2P-*HzT})o-p%!qAzr|PmLF? zOB~R_tn;4eK^>_6gbp;E%VIb`cQErO5?p~Novs=mb`aB4*|}{s4u8^&x6MX9Nu6K% zq?z9neXX;7YOJ+yP<3FGMgZzf%b^&J5gpCqP0_cYFS;*cG&qUrx((;0&YNB6F5?s@nyv*-v=(>8 zS`<5pwYb;Wp1X|o>PX-utcMLw=W`c_I@6+0bH;Va*yL;$Z;F1PkHxoL&G@G1M$sX{ zVv~9pCBO|POv2&-H!4v#B^ivBcYqAez%fg5q3GK`73Z zW8ZTOp%~(0MuhZ(2dFY%&RoEm2*m|*ERtgg#U!qh$yK7|%oxr@D8|UKg&adDy82RI zy21nWWs#h@m@^TIi{)4>#}JBBxk@}&QRK`x&O|82$+4vzLnzjA6-PhnOT3)9oHG%M z%jH-C#}JAmpg9tct0c*p$()H$OqOFSIEGLx;wsf#WtE({nlllKtL4}ljv*BL_)}ko z!UI5Yt(>`zGZBjGY+?Y#O9F~_bfCDN+jW2>6^iR^3IG&0*d#F&T?}Tw5NgCwOpzOH zv}wdp{1_TJP$Pz7gj$55xJfROW>bWrcvx-3P)wH_ZMJE|Q1lKk^SfPsiXZ>K_8v-1 zhr>^LIvSrcou`+I1-I|n?kV`~Y`x+aD0Yo4U49LVQv!Lf45YndTNnO+Y;mC2E4O#~ z4Oq;eP7@Zp8(}Y#usF;}oBxh3jK!aMh!!lS8_oDpI-7#v>KZu?*-FPvb!)Aqk@q<%8FpAe07U3R~G z#*81OQ}K*h@2$~$tYbGkYbGrAeU`2cpFd0e*+=~`IPAA3W<#Qk#p}#EP4*LsCYk5ojoGXgHN8P$s7ATbX2;{nD{)c zW>FUgWApO@jKy7a!T9P6G#SHQATSoa00kv5HoqW7e!Pn=7~g)8DvW-SdU#Uwkid9K z9S2;iPj#^mjHlH`ifdQsjs(WuUFmTD=}L>gu&V&$*)H~hvBbK}Q7`F%G4~~^fB7XE z&N(rh7rKcjUKu>`bip{fo0z6@c+&x7xSYy+BBWir*W0-n4W|8h3f*Qb>_#U?X*cS8 z$L<1*7rNL7#*5aesp$?=BZ1KnLQ8+C3xn}8Wm~|gj0+KBywb%UF;-fSHKqp~OA=#3 z4?0#AKn2Bk)p9HrV_gr67_UKRbj29?M=@X3aALM4#+pCUd^P=%7UPCkjJ|&oi&4|X z9x>LcBZ0H97IrxuF&6xZR{iFm=vf=^ibagKy6E0s%;-sCye&FJV!WdsMu~bACQK4z z_N!vNce}KGdokcO8t+T5(Rk~-h}(+|T)Kh9=-wN|h(D7U2lXZ~KG2Hs)jlM~Mj^)R zJ|xB_Ax6i(^y@<*#%5kR{L6H|zGRvf`KlM;MXx$QF-CYvnw-Wl6k`%J2h(J7l^Js8 zOwL3x&Xi-bIEG?$HL>;J0re_p&gD!L<6JrRJ;zXtQ@Kh!SD7zoF5pZQ;{rJr$uSgT zEmv{;EA=H>&Wzzq6l07WTgWjK;|OSu*5fLRY5Cs}#Tkh%rgdOy*1!W3o*Q#5ng3 z-&%~j)A}`xE4W<;NK(bP!lnR-aivWXi*d@EAVzA$Vq7IRT5Z#a#druBIZz`OW1U)r z#rUIKWUWmR7ULU#w;Y+pxK3`g-lh?Yaqi#E{JD!8ydH6DasFFk$4K$|H7(Y>#rx!2 zv~Q$BRs7z+zHf_ta+B9@&|(^On6#MqHtb`P7LUA58-KbNYjHCV&!R=+JEX;cclES5 z=w0EuEnaPFapSu*l%4O=P_}uo7MtHC@VLJR9g?)z_dQWH1HUy8F1)j^Jq4eO_bQ;< z)zorTne!fLG37nF=ALOkytSC#kFE@-`cZ$fsXqpX9BX2?{?I4s z*5W7q#nR<^Jz9&|{b{rX{pq^X(BGoP-Cp)sl#>g+yo9vmJ-lUF_n zIx1<=WiYK~z87n8%wVC#175mXTnp)-(IbONi+zSbK}m~ahKP|Dz?p-jV zq|wW?dYY0kgesgHLOnbpdPrIG!6Hix*=ROeAblR(JE%yE=ogDrD zNu4+UQ)uz5mwj3+u};nKf5Fs9T8#V`Eq$pMYw;Xqt6Hr1m(XIFmpxi6w;rqPLpYYC zMdy#`SQTEZ#q*Y9u@*;uWYOXU=!~uwAAT(6>mr<(ZE11%P@1n%LuoNCi^WJEDi-64 zmpxjnR7V15VI}NxI$C`F6I%68KcNF%^%8%St{EntJ=fqpdns`4|9I>%I`=yme{WiG zOnGiNsj*sgjMR8tJ)F`!941auW494v+&8@1R%6r%8u#)M)SX%{p~gBcy%DaZ@N&j! zpMe_jXHsMCXQakkupsKo8P|SJYP{{m_Zho=K}@{k#rGM*`PaK%e4p_iFCnTi^9!;> zy?o_s;1pD2gB-ihF;t`Lm+U=w0FgAxnN6IDYHX5Y4>^WvoXS<=xk`(i8R1QWMKwlv z%Yx+?sX$TRp!Wu3 zKSHPxqcL7?wA`i8M7c*HfAszhXk1GjCN#Q?g>6hiW3REa z|F83AG_L32S-nwY?3Z=>D6-sDK3x$Fb8p}e($oF{bqVYL1RTyBV z9_|x8BsA_<#{rk?{oeMWF<)(@)S96?5*h=-=x}d_(c+H}6KFi-Z66v7tjjzmTn~*& z;Z%QLI1T5B7*5AY;)z!XPdr^T4wxjSsmQx+G;W$iCr8#K>ipG70*%MK?L*^n>(mrZ zhN+Rz_;4~U{RwYI<4MX^(KvXDK;tQId(e2=daQv{;aCzHCr_ngo$+Qg{$e>6qp^6Z z1&wE+GrDLTJzdOK37nX1p|Nl}%~$DkT8wjIF^n_BVw8E?gT``oBybj%!!DPKhLv$lDL`tsMf{nt7!pZXyao%QV$my#uvqQQSWJi_EME6!ELQWcH@q2(HN13) z#jeo=ky`nRSH~%c#X325lVga*sn8r~70*>}%b9mL6R~(lj@{)LVzHL1IL1(4>gCJ^ z&O|IW$g%qzLoAMf=Eyv*(kN#(aVBE1Nsc|_7-F%At5kE97CAG*hv14>jPQ}+$}z-Z zpM}gkcmU?jkTYj;CSq}>9Gk^4#9|s(Dc~w|A<(4$7I#YJ+X#WsytiyNSk12tkT7OO>Ai%aApicJyLqW@ycky(pza-*d- zjaZ9cE*4r`=JNbxp3X)G)4i*B{|vuZq67SP^Qr>xe(_O?V$Du) z>!&o9_KgInidr--5&LAK&u`FT5_OogIAsa!W0DqAm(a$a?1Ne~IP>TP7MCbw#b!m% ziXm}Ab*p^ZvZ9v~8Ak(I7DoeF598! zDOs_{GF>aCSVuk@GSG@K%jmkWeHry9mHHFV(VFKR4_%U|_(r@~w=|zeQPD?9jHkh- z#M4FROuU7PKl#{C#VygzUf5^PMQxywz2j!IOlNu;IB@L?(rOcGSw z;iF5%IY~4ZsYyh|z+@;WQE_0h7vPzp{!(vrml1yh=Rj_QR7- zSBlxI#4P3ev?WC!C2%#J8!xS<&i}vFLW+lc?2}@Fb!vLAfvJ(CIC>4O{9zxIqV-A4 z-x-~^MnJL9#~vsaSr3)-BOFSC;*B5aP{lq7MeCv1iG9~voOlenqU*$S>&0vxhqF@O zi9Sl74K!Q*H_%d?6iX4aK`g~7AA6j5S{(?SgQsDC({Z9-3az;*g`TowQY=n9>!a($ zr&7s@C89&%#Q%xS1D~*EsW4p<6P-7S;hytpi;3_}UYlsRlQz+C%Y6hBD|i5l;mQj4 z6hGYxOvImwiAh_Di5FlQ1QXv@=590N7XV)LVJ13nCnjF>HzSLE53No=uj$P##GO-q#1I-*Ws7ke*d7U$niPz=W4UQobM?iA~9#^TAGwV1L znOG;sZgLEnSj1JTxyo%h^A2Ys6Yt2eyBtF%_SwO}g9kuWy`0&=naIQjId-38$iy_R zQovOj<;*6|L?$-Lv4IL{`Dl~@S<2%$!-#QAcg1vZUXiN2YjL~6uJ>Ow%EbuWs4o~Ws4 z_0OgqBNkE-h%wn>gIwZ^!t{S}{%(9(RB(HIVU&ZZahLqvcM5frY*>>Go0rvw9Zglc z6hjUj4E6ewryV5(a z)8Ul34KwIu^fXyNR?!nbR$A+y^wTb-TY;FaTwgMy=H-e0 z`0~W>3aI4r0_yj{0)fHZzUW79CE_sjJ84=6b!rTzIQqjr{x{JwHG8a6v*|EQja7sJ zrrpz&bBE~=j~}5!^f)32xZhW4zHjz_e!Kd_3^Z+~pS88~t+l%sLTxJnjiyzzlwpNb zdqyFh;^~E8K6p*A|52EVhAPX8mY;@C&8e$W1{@VrQQ%7;bg8Bc{7BDW)5R)f$x*76 zb(CiJ2+!`4V`3jG^hG1Wt?y&zC!Q~e<0slv#%D}>>1S=9i>!VA=P7%Q`%{gLQYb z#Qevn@n_=`ZVif4De3O4uX4V0golz+YW^2IK_5G3o(3PKU8=Yz*YZ1;JOqw9)K9<<;)A5`3zLKAjd9p3~;AJ zbCndXa#_y2!kK|k<%%4u7 znKhj01yyR~SS`l@cS<=|Y2+$5<;+{0=>b)4$+6oU1KcTtDyT2tzyr+gT{-g}X9Chp z_vBbT$6kagxm=}$tK63}A8@8KRCyrB8aW2IQ$o&DU;4oV^yQ(P+02;^P^DRpwQvk@ zrzAmhPw=Ln)|+6w17y6%&)hwxRG&BdIvh|vr?_1JWzp|MH`8>Rws5M>@FT~zGf@(G zPWc2HeL%kx-Aps(Mzd@hk>^aa_{o?-OfH`ic-G5WcF1yTsD6JsnMJoa)na=d&N?%15{gm#XJ+*zffr&3I9)A z#w+7HM>LM;H&0i{B;I?BwD!gw|={h<=b^F(-P0qf&}V& z4K6HN0bA~q;(K+M`zhrC6Af;n3!q$Qw?U=^I1=444V>uEkt@+Rv|%N!i93RcmB4DT zdnZAw)J`5=j;3~hY1hf%XY(hyhrsrv2k zvLmQheisj4!Yrd)rH&F{w92oo`>4;rKv(-I2|*JLu9oBDIXK9)MoF$UcUH=R)N$gB zZMT0F53s9P`N0#HR)gE`PpYEO3;2JX?cb%US6|9+HSCcCocfFsI89Z^6W^Su% zz|%)!6_;AG4_qdnuN603pV7?O3-Eb$gOu^LG-rvm<`*FG03<$dHMScVTP9i>_ZC;s zy$-IvR&l$dxZ!h$@JvYeQ#L)T>8QJ@Gjw#bUq;EZ6YJV*dK!HT&H^pLI|0F!yj#@o zv$xFeK(VcU$~VtVG^nfXfwQd)zD->YyA7SNvfC5cUGtn~oSu|jbldzlIw^Me>E3_+ z>mBO%&wfh!^AkT89mM53d&eBq%_{INAaHzHr&c?e+6Bz?)4et0=^;~|> zycvB|4+XX8_62k+Q|rZZY>%JPzQFA5+1co4YW1Dkt}khd`{Md3b@gPXeWKTYYOvgm z^&?q_XzlF}_Lk3`eD&OcXIQ>pTQ_L&1UlfSgmlxKKn8qBjvu;Ub^Np7cqOt$ z4D>WyJM?bR{%In7H%$xOA#G}*v*8!NjPZY(IJ~`!wwq`D^l#broY+%oXdi}mMoUDm z;Jz(Ve(7UjLEWsBe-0>*+obk+c20YQbAD~z!o`Uw^HZk2s+oxAX`?Lnh(Ware(H_g_u-N~*dc5hTyrn^ z(Y;)U%hWAozhZO@dj%|aMHWmYr=a~S*ZJj$I$)*ovANh!voCA139yiGtvHya;%ACX#X6pa+a$!%b6{l3BEVA$gv22 z%Z**7y9@Q@J$Qh=O!wEa8|loMX#W{=Cp`2YV45vw&f!e7{~S3smt%Be z*Cqz&Z({T>xOYtH?HcAA(gdfqchw;~O{orrE zUl-8<@bh_Vu}8E!`J_jicQisNb=WJ><^vk=*j*{v-aq$*cJXt*Y_rl z5(kDEhEc5aSL$la{z%y=UBtw$@>jaStzNuc+)p!w%-Qo@XbN4t!d@Wl{pe5kg@47g zYq{^Zs?)r}TA4Q8i_VU9{z^c9&7`qu*ZXJm>yM_j)@bp8GozJhd-#T-#ozM{L(^`A z^LZecmRiBf2-&oGzM|io{P6}cd>+j`{y$0wxKWJvlLu)=%&_g_7sjwn_t%B(Pkz+- z&HjpU@Wjt;mh~rpx_|sDy4|8(*e!74=)AXSw?7?ZtH07?2_i6_oWhA`A^ z9|KH_tXpNAL9A)ftW$2#!r)F#n-JBqrxay!Vgl=*$oaz#E zi-JYbeE+tgJM2SEWrl9=XK2mtk?)| ztg_zBejaaTPkWJOl{Pw z4*V1KL!jv;ruze0U^4<4W| z_vFla&P49k%drNI!Rr{5M6R-vt2~f18#xoX+bGAHIELJH=}CQg5grD>?QA)-g)@=6 zEpjZvK=elLMi{i%2JWWcqj%Ilo(JCD)Dyg$4(GM-?lhZZ@a}Xj1YbdpN$lPG&>;u< zoxL0QDo~Yv7dN@(BC~9Yuy?)che4HSbecOUCTM~^coW5#Qa&fHyUP~yh}cexI8 zcbP%uZcQ&SvGE2Aca?G9YUYr=JES*Vni6Oz1|_k#xZ)-n>~U|BdT`}t@7C@$_Mx*R z*`P%ISJQuX?+Qak=6}(>)*53?aEi2YZ?cKpyVFGOT@B~;ci>)XrMkDrUoBoY=(@M? zJI%=1y=i|H?p%GAn=mb{+*|RcSl~2+u6xIrHA80i4*EMiVJ7{Z+}r&vDBH@t zBi<5aw-_Gb-r6utadvODpmXTqkKx zD0c792IY-O;9hmwm8f@Mgst40`;Hi4ra{-e114+6#_sL@E=}CfcgekO@3nSspZ7%3 zTtnOLJu*d8ncchTJ({&$2CaL04G_=5-3I&IyGI=}%-tS1pLN{3YXHsNUV{=cT{Cy= z-hE=##!XlEY=m#`fvw>?dY~9-zCjnhjne_XMFR=Gr2}bn2MrlRX5bxOZ8s0Wo~rXs z|H_%*-ZO*gc~BsF)ihYR_b}{G@QRFIaqkiBVU8Gd-FtHg%|@X?88KTk8|>a9gK%%{ zhv425?B1pi!M*r1yZ5L;cm&mbFj-i0d zxXJ^rQYL4Xb0!M7T#i+63(xk`&_V<_M$TxA(NfPnAGnf08B014ID!OH`v5Lz?X!8 z?|^^io&_6v9h9e@NJGZL;MtpvPl zByAuw1C)?h*g&{H76H$KBjFw2aj~$SawQ~i?@yspD*})GRBWhopw*)Y{4f?SAC?0# zfy+Ln3zOsj2?Eax_)P?!uZ|L~8}kEn2|VrJgwO>6$_+&`P$qC>028=-91vJrEGppF z2^_6$5FMaP;BWs!M~?|m%HlLfX96z_P#l*6fw>M7_=fT~_ z_Q^L*Jq_Slm=>TbU-z*zUFopKt2E~m%Xf2tvT+s2SDkjHc`S^um3%|Si4ksr(^BV- zZ}w`<*jT=a<7nav#*us@#bC(IHvyOaUoymW?z7=d_OhQ zZ0rwEic&SR!Sc-y5b_-{73AB%@*Oo5ZHh2=`^~l#VeXEH-?<2Lw_YyNU{i#-n+=VesVB_c`vFSVOyKUuIfAK2OH-Gr4|X}5f?*hE{P z)uXgKIvXw-fyDgwM%M1Y@9AO`{=Lxd^uXVw-5FF32MO1T8G*Xmy*ZD(IWtfhmJ0*5 z9G|s2E0DFDm)M^8Z7?TLSGyPH)6wS!Dg*O0M`!JRAE<=qfp)nLYj<9t zs@=i`Vq)h9s@fgAOEZV8-IpV24u?kyHAV&6quprrpvuw6R@z+>MQ2A$pfYB+rrV6& zg@GCIyAiwA5`$vk%xHz(h#11|vKYed;y|VAKEN)uQnBl{(1P?pUF>e!rx`F~H+rGK zZd{-)b|3qJI=?hf8Mhy_%e~}tWLcm++KtyXi4WA(Zl^_bkmZ3&L_TQuqeXO;PYC4y zCQe#J+KpZW)6z=2d5grlCI#whci;idkXgGSi)oENSxnk>iG{MQwA&|ElwB402<;Xf z)D&m!rpJFK>M`2MIAHD-4-~Xb+o%;InCYHK*jZ_X6{(K+r+93J_=j4T1*K@ zXsz7=31Xxffx6l)ISSfMOCarLC9vfK#S0vEs->ZyI|FsOn|~a*yCaF72$`Z=rAdOj zS%LO&H(Ps{>_A=a9!;j{$O%;XoYYJQb2m3oaJT43;O=s`%)8xJN`D0I;?K<8U4a_z zj#^9H-5to>&00&`bz4W=-5bc<-ACOb?pCZL?(PqixSP)@$lZK7c7S8Z-GS>Fs_+0H zJ0xcoa3*rMK#m>e7;-mq&QXCilt3jkZVgv)*hqc3AZK3WOyurGId+L-$lc-49A1PH1`qIh-YaruC1)ac zE9F=f$B?^KHZkDtM&@o7aJP9QaCf7XyH{;;fxFkZP6rbuF?Zih1*y{S%-yl@I~QT@ zUYCp9uqnda%~Xppch9Run7g%dkvf|q%-wFAfVAG`j|S_pW6Vy`*lU=-q&HsMN~4gVMz|S`V!r<=u0a zG#3r_ZcaK~j;hmzcOU#V?>4HVgk88%-@BjwMB;1$1zyn%l)d{rxqE2eF&+^dY+MyJVKqf&NN(|?BV_r?szYY1O! zjob`4MOwkPE`#9fu!G>cz^KGu2l!fs!7uEM*kSRyQ5U`eH#8$>__pj2@QpF*!uQ*s zsq+hsO2rL;FZYt+`-9OQ_%6~mS!C3O@ARE?kj1!e0N(>U>3Sb)WcXg+N$_pi3DeRF zzCAL<0xL#c_~z7VhRpCy%A_aE;Y@<>lq@LQ3chJsqHMhJ5%BGEQ&XJbYs{uIDM9r8 zKiLAliAMY2o1~rxa3Uueb>Vw6o2Dz-sEoL!IiVQ7D~!s5TL52m+Lf{#7-1{;y5@=z zt}^PvH{rHsYz*HixioPpxdh*ld9C3aohOQ}HMR|3!(B~fhHrBo&DwgS7QT^t#ItaN z(LVU5sAGn?OM&xQ2fprmY3??{6Qn^icMRWDv1)k@uxG2ql&HO};hVizj5N)t3*UbC z0ltCz2)-}vqtR_PW~{i6w|Ujd(9NHWy6%0o5#0NHK0Ob%h+g&27w+9^w8y>Mw1?Sd z)OD}v0L{jBqmtI7nGJSt2J|;Fd|d~nPa(KBkKNn95ZsGDvwMFwYTR22F}TgU)5z|9 zsfgSgQAF;|GO~NKsaxdU!Nug>9HZpkTuwpv=E|`=j-h*Vib+Ff;Q@TNTh83Wndsg< za%?Zh(7oM{vRL5(s_d6D^EngUn=i)>a17m>$W?Z7l|yo70cWCn3*^{gj-h*9j|*TJB6z(<0{AG%;TJi?maHYPH+s}Tfu@xOdD6aBs2Iz2|Lm!Mzu_P6rbuv3q|$0q&*W*}diPI~QU1UXqJkwkg8y?RwHu zgxxy?e&-_W-b%Shl}!hc2FA1sS{dhGh?3Ji)SuqI;uGL#0;k%{?u4(OPKrDEAJConSQ^ySMup zx*82VBiwt-_?zzY-d0BmyYOwJ?tR{)zmPod7?oa%W}xieyM#qgWr{Mv!DdUpXZ-d1 zy!G0n*Bf>3^X@)NM{h7H-QzSzXZPMWDnsKY*t++D)xDca#KbmQ-P>cSW)9iC?xi$` zy-S4~o9*&$3wIuub#rNJ?^cx3=@Aj63|t2N4ia8x?@kNK2wyeiqXX z%HYHapSy4`*}LSuWw+dv|G&(zJ3ylsKPYrIdkJV1%u_ zJN1efVSJFTcb!*j#>U>Qxk3}?S4rM2u59hymP%1HDX4AlMy}CRX77%vqFGxJr1kE@ zYr?xLgY5I}D($JZ3eIO8?@p_xxmz8i)UMOa9ea0;ShXJOVXsz;Db3Zbz1!`&80p#| zUGHYDpWvfJUnlP_zs{Nu!W+HdU9~dov>SqSy}LGLLQf^GhMos0qE}fp!n+%T?D1}@ z_AseIy58MfOS7>Fo;#_U*{$4+hHca>@@`%|d3Sq|$?JZ~S;Y{@I9yzv`W9Z!}TxA(o z*)M12b0&H>UydE%7<#vct2jKMz8sP>3pf+KTOh{{a}2#Z9Gat4xk{m&S;U#>-6AJ^RgTG-$2k+ddt8p4;23(hcO&)XV|W1Xo{}?9b0&KCv>ZFbG4$>kn;3Za z4tclzOeN@Nc-d)PW7yLncdX?7#U>rddzMReFi{ed_k||VD*evn9R$B~5hib`T;!Zh z5hicET7=2FOD)3WEtiW_*c4&%IzI&RQcsw?=Yy2+ofGyeO%DZmFTgfpFL^K00f@YV zo8juwioDaBY2&yA+i0d{<6!b$wrrzW>NbitYQ{>f$Q#lkHquIH^(gXYXK5}QOy0y6 zx*!#_2=ZPF`c34mR!0dNadnU`c}?xZ@uM5A2PvsJnt?KTZv^p68)|ZZyxL+lLBCGk zT5W^cAYJnQ;W0XT9c=iynxiv$Zw4s^xjF@v|G6;Dp}Wio7GA68&!0CvWp!&4`)2yq~$ zPgCco1uJ>`fV{!zb$lwoNisdy9`er6HklEuOWyzMNC%l2tQ7AD@~-O`j-SpnE11c9 zxMMhec0+kbn3h)Lb#o94J11C|yovcRWa(T<|* z{NP8BH}IgQIFWaWQ#gKfL!{{Xn@-{U(G5|-_K7!|XN%9@=wMy(9(AJGiV0Tw9D?)7 zGB_6R!eC|8ArP-R>+qRFFu+#gt#uXyTokM;-pK`;p|N;}yU@JNcL~RjZs_X@XS(#! z4P#wJQ6;!-@jg7Psm$UnbER2Z8mtxX=uYAM(GAOj?GtajI%YUIvBgyScb zZ474drc$>^ygdTL@sr9n1xw;h;}jHcnjA~#7>YMBFdR*`6CR+-PjcoK&P4HUkz-pq zhT?TGQk56s0jg}5Gc!07#hW3=c5n>EJB6z(<0?Dl%uLQi@n*`gERLagYq*L-5cMTT z&dlXZ6mPB^%i|b|cQ`aht8$gya^@b+MDgyCV|zJ<;w|JV*SN}lIWwO#QM~zb>;T75 zyuE{|FCW7L%OoLEdj;@zQ04yrUA# z?6$J+(2hJS(h|VNbMV%*==Rt$NpE4_nNJhXo;`I)(d${8d1=BJr<&F zI5d<&-XCHaR8L5TLk*rY4|op6{+Lx&1_1c?<-9y^nHkmeFvd0EoBSqEpKXt z?6LKFd&k^$XgPzvy;D@^`+NP+cV7x+{*PEl{mBXX{`pMM_YrFtL(7lqhrVZ0X(f+i zA@d$W-_SHV=RZ+LPEOnr7UYgp$HT6SZpZnP4IMu<?%A;KOvcze}?WpXQ#=+^|9Aw9^?=rR548Nnzwh@EN?doD*@Ahg-A+BER`@!#seaE(^*jH>% zTemXKQvEye_Sz^To2%mL#lAEDMC>~;gN}m_RIXNMsMvRP+_PZcHICJ+iK`d;7IdJ} zSQ`g5j~t}Iu&)xQV&8>b5c_Us*mrdo#J=QjhJB0T9I$Vbt`z(JD~@4bu`9*C#lD5zDE9p*&I$W|%(4*d`>}J{29`#!ug`M~wc-!rs!yDAZelqJ_TA*1 zwwa|7>?<=Ws~DB7&N;WSoCN!Bb51K}X$1S;V^lnzr@VaXoO3(NNwDvB=d>LxjbPuQ zSe&3%M&)zooEDaoU|)-K+7~R1VBb@W%56qvr*qC-EGNOfyPVT@vowNzJG{V9EB>H# z_c-U=%W@LzyVp6bl%)~uyOmKn#;ELb&bgoEB-nSqbJ_uxMzC-6i@ourz{wkJL&-?7N#{-*DjECImwHi->%8+mY|lTDcMV9%GcWSj>ie-Mb@b zrOyocrrVXXJauvGyx*^&(&YY+8F|9LPQnwKL>@pG+PzywKyB{&GU7TAw#}7eW(l<^ih%Hjksq)ygxGLNw;!+>muIN zzEnMK;yh)T5amlVBS>Y4_ZFo6`Y6D1$uQwEr%tkj&g7R+J?fy|;+H7uJ@yhsy?0Tm z113b-@EnVA$n3B3elM^fImFVH^|(O^AY7FVorn7j^V(ewm`)y)UC!>Y(1L zm(|YwEv{aNuN>^qWQKZ&4Wu1CZy-gz9bQ4Qbx`lvS5&f({torlgg6jqsJHSJig2E& zyvGkxQSZ}dM7=dOeZrwwQ$Ol08AQdE7Y{LEI2htpOwUknK7N%aY{CL}`j#55wS%#R zbx`l=!DtfU$0?J$H2?yVsd^%{rPMZLX;szhhT|268p6yZRbq24`1 zsnll2JEGp6IV$R%6aQ?ecdo6?D7(4w^`hR294fnc@z62GL3RxF&W~qnmAn|V*EV9% z>(#obS9(=#>B9JWQLm?QLKs|mm7?CeuQE&@Z^3T^j!^sCSuTHOu1bMZMhXR2s|UVQid(G#KiIcop^5yoIQ@lA&I&QHXlU z-wgGxjCVl2t1%5dzN_LH>b*OPqTbBW6!or-XQ+1#Ws9O-!x)Ns*Ty@cUWH{Ls8?}L zD`aT|^~z%?7FvZrh|B)vobyALlc3%YozvE_G=h5XF)AKoDV2|$bAHTn64d*#bJ_-$ zMo{liEKcw$qwAj-f_hIeDz_PxtrFIqeIUMo@2bF2k$%gS_l? z&bf=_B&c_nbJ}i}Mo{kpM&%RyLDaj)IpTV% zd&f$I;oif}M2^%V!f@{pEaXi&VYv5bJRDC&+}mTkihGZt9eGyVdz@B4r;oz%IDOQ? zy%poBfqkV@2ZycG?w~1-0R)kVcuZ4_ujj7 zMv9oA;@&gy{}t~2+SW?6#9znPi+c;+qsa3coK9LeG?d}qf5$W2+o2`mUPoeQ` zxVK^wmEqG#Dt5da|17xoimg(}eZMa5EqtG(j0&y-%laaLj!^a`y!^fK^)5^;yQvmRj zIxO(pYVHt~XLd)18s?czjhs;}`OdMuj{EjH#$j&f&rv9Ol>MrB2i1cuD|`mYa~wu`NHwojt)A*P;TZF+Mr+5 z22GoyqTFBOpUt=Xo2}<@;Qba~uW#3HDpjH1<6&W@g9y^3xJvTQ^)wy)~O+$mt0T*;aK!Lq%&OwjDX0kpMYo@KYU50Sy(iRk_Vf zpzzk;{=MV`{9ZC?I^;h$Aplb5P>7p8hXMEmOT}{p;yP9_CxJp-fBW~78{qeoc|v0J z3lmZeRsl4i0+_3EiXUNn2TsmYmjLq;DCBKW_j7FaaWdalDPEY1f^qsVMbG(kEauK9 z=FYNqzWGzF$Fx647y~aXN&ut#`-wpXj2Epy5*WfQNU$N?k*FGrvD@ao5e$#r-^Z(z zmzrCkZJDvuoR8qoZJD_z{`6mFZizqhmQlz92~Oa41*-x9tgym4Z6!-fK*&>x#gWQm zM&$$NoU2(*1hB$t=d?8}&4g64mQyOD@CV_S;+(UP~K8pE;r6 zbcB&Nyre9{moW`T3$AR~>%%?c+`Hmu+q9~ccM%Rhh&1XA158>$3x4;s0j@5>294so!4Zxm4~aohvD# z zEhhZ$&A^l$97^TqtW<6f&uvgj`lfPkU_;V}%*Njc{lkrs zggRXP*YJ=iB5+g}-hkRdyT@Pfpe;V&V(6n>!2$y9){i(VyRc|Y&p`M^RbzKn?*Ed(;Eyp?K@jq3U> zj4HS8Mo4%)(g`Lx4X7S%i-Y!N4j@X!e;NY0qo>8-9F_g%CxU77wRF!wq8_dz1!S}l z?c^_|nh3lo{JV@lidG_*67`|ci2)^(#WGUw6U?}}A z5K`BgMTT&}5zYjMuSgZo*R+Vaj!#AqPyJQ9%&1-t5DT2fs8!fY;I0ajp0sMpt3Q^-w6; zW5z&FzbGAyT5mS+c^nkYt%_7uA5Gyru-#HXDmNJsL)9n!`@y}P4LrD>%HY6ME*yW0 zj-_zTvC&1Hql1)EeAxsaDmV2{QmRg+aDCj}S$E-#an`Rcy}5rwr8j#}QiD-FVB7|CFWQXh9BYQM5Z}ic#|u7=s)h#ERj{?^~TN|26cu+j?mozF1S#PfCDFnjR zi^Bqx;jXD%yz&*kBwXijQycdR<}`(+axdV^tm6Kyl@q72DOfBND!ii-l&9)r7;y8C zhAAg^rf>%6yxE+hU$#dhxEo%9K^AjFU^tbKMj-t)%i7TH;n+~kcp*Z`=Tf;KMcS3Z zx!XJKL77pB#AbvoFERUqaf{i&eF$k=%nfN1qgWH+#1^v`evTm;iXsODE^peg10-)X zlXg~Dq~PVBJq07=d}2-nd8-*4revN;;RJjetEBk_ashDqGxI-{r})whU&ev(xw#`O z+(xrzf6cNYtRyX66h-9+hJ%+vAg6U0?Aml?8@?lr$od1{;V*ZVbzxJ-F3dDyCTvWK zLkpqF;RfVgDs7E-5-v(+sK{C8k;=g!m$ zK5BE7l=CPus<-ph#=?vpX40E2)!xiXNafr;Z7N%}Un#&cZLtr1KQkM-8Iby!`8lkj zjU)4;zhynq*3SG`)Vz+Ln_s}J?H%}4H;8NAb+Phl3M|5cbfk} z8@b%tNbgM2yH}Qt%z<`gK7A94_n6bTJotW(RYI2-3!ay4EC@=)x*#q<$-0ep+2e}sJ=Ao0 zN_wmqJ5sy)7H>EMKkYSVQbr2xjC{`+xmKHzVWno1oskQBsG3G9!yBe@-ms(8jJgVk zO07)&peoP}TjjzHsz5Nh%|SKDStsPFS3A(G9cw)f(6Kh|fK^lvRZ;z7t6TVmar3L~4VVtnvDV?Bc^K`kP4-%Ur?ocygJrg= z^B;es&Rb9D2rqaR`H+vmwSiIv;A)Ft#C1F zB4Ra-_)wF(uwlQFy4{Gwy4!Jc5}Y_}cBlRHg|(lq9;TKdkNa!Oke5$XJQkimLU>cU z8_-I)BQh5_qsA~p8H3L+;AxSmoP+s>nj`2r?WsH_nRRshPX}&LyI|;e)a>#1Os+j@ zcK0JjbEjRTGdL*QZ4Q9rN6p@7$Y%ZxyW3TE!;eu>CLN<%)$^E{0GF~Joe-7nG&l5^ z%UKO6TsUT?hI=06FoJKy6P1e92!A8X=9I(Tb`IyO9IiP|Ib85J9R4wd3H0u9%HiYV zl*5=4W+KJ{M=^RVwsX1V1mkiE}l>s{#UC-TW{Rvc51k^j=}(Mp)sL!)bFu$arCOeeA;fr_JqffP8k^%HLWC z{uDcZN-h2dmz&*jf+|!=+9#+YR)Q*M5mV6B<>tTu+VfUUb(GV!DLB8wm2z_$W%r*B6p^t29^iQkx$UAZ0b(RuTF?28`Xn!Do9;&06v=rgD|*fbkTC$wo}8Tg&~ z4w8YQ>)paELob?Bcr3HvviU>I-0X@u6Mx>hV&0C6)vKRw353cvyf)U+uW%gi#J8=< z-37Yf!BuC)Dt!=)Tf8+LN=-qocnR@4eqbCwQV*Fw4A)!ER+@je^8Vy|^Cj0Ae7FGB z6aEt2RJF*wH3?*_WA@lDQ;=D{$1p*)aZ>j{2C ze|g#R)sN=SRGOBeTjrHou9v0#eRCfUTd<(Y+)gu0&_M1**C42@LOeT4aD{@4uAvr9 zwK;=Fioyf)kK7qZd}wZGI>RkC89j}zMz@hkIHQ<4*VIg|8Hy_{qtRrHU4k>*w1+rJ zthH=-Xr4tXNc)wFRao{`A1M8>UkfOob4?Fx78vy4d3;Qe^3$Y-oafp?4X1;|-^{&& zR+raV4WBp-9e+26Xf~fpSMFbr;fCPSv*_n|4le=x(`*Qyc}_<+n7nai?$XXB2!H-O zt5Zr&G~v3!Yi0RaxV2F9{U>3hJX~!ww`0&36?N)ZR{_y~U>(Kf>5x;F-w(?O=~u&f ze8eK@{NXT28;$pi8lJSr&#yl+kL34-K*^uY0)ih^>rz}?+H`+0%wxn}tLpc>XZ zLihP>xbw*T21+4&t2R`_<6?L0WAi|KKKj_4flD$SI?d9wKLkMZ6LXl)#xgyjXLC?KzcLWEJu&x<>?!EktpcQRiPx6HDa*Y^{y_T%~ zA%uw29olO|gJDl8*?o-lZ0+KMycUV`LR|lht|nZyNre+?sEKRo*RSQV+$yuiKa*g8QZv z?zxKnJh6f51;0GxLQ)XKosH?}sTGX2t}Tf%glakD$;5d2QA;Hmt`obU^%D^Vq^5Dey0;7JeNP#Ap97Bd^Ujmr7sd!B$U0|tQWkd7t?}He463x z>AJbavPmzNahhoxGJwk{{wInxf6I|@o;-R&pYTFUoiYbL%RukgWf124@*1@JM)ZJF z9^$*2>z~>vm}(Y>^Y~b%U(y@Gyu=~==EIiZf#PgVH}7aVI%ASe;w z)Ds$-#3ZhdLcG0#&$PK7!cXX$f68K#11kB@7NI`mZAJ-nIy zlI z$wyF^A6&T6$7GZ9m9Fj!7=~IpHxNJJutV-O6npWTPeF%9ViWE@ zywyk?!xxv6M?8?%Nc7c$7nmkniUVsDy{dMflrcf&S_ZYEylD;ZILU%{VP9HElZ#di9`m^3lm=LDgBy@1j# zKL|OKLI~{ud){oA++6HH^C4~C$Y>vLE-vBbz_1o#B456p@*U62Gz}w!5cMr}?ITAgFuSns<9O1#1LW^nACkY-t_h`_P?Fg~sI4eT#j*#s z<2gAogva0KT8iy-znsS%#nqOXEycM6o&>ZOui(#v*5XVwHt|q>YD=iA2Qo+*Mw!rU zJUhb)L?&TSzSUFvvairUWw-&W)%V#LrfyG0GFxb9D{5yrqb*~&e_Leu&!60c4{yQp zw&GXT{zvgA(MGE(FuC1dsz76VzHB(#&aMI)#Bh4UHcRvN;yjM~0!q{E{e;bKY8NW$ zr>3=niY5U4oXhYc^hThYXPd*6p@)g=r zj>t9{RCE-(G_6{u6aMWYluYMw!h8vv-HvhTK`a5Us#|+f2!knBK<7*`)77F8(!u1# z2f(UKoM!sKN10+*A42H@ZrC1;B$VKfOfg2cf=7xSA?HEo07w(WL{hXAOw~St-o8Q^ z^-&0vm&t9KjG_wNGiWqyC9et4$HcTrp^P9!&9pH<4L3G z7^552b)6Qy!#R;4*PFe(e@>No$VU}h4I=zxZf(k0RMhYB!NIbJtsCZY^OzHy<54s8MVTu*^u(Q7#4U( zXL6$*p;Jw=7IEg_=f(H=(vxuhd2tzk07JZ95JwSvs==8}OaRvx#g6=uRnYZC@m=y7 zF*kXAjlACRFNp6hP9U%K?DhWc_NB3P1D^-yyF(+3WnC zVg~<(1xkC0qd5&U?Ipg(SMGvky~JKok9Fvd_GKy*8gA4x&QY3f!n~u)dyDTAItHlP zup|h!zSztSKIkp>;fmp2Z?Or2BZ$lr$B--mBuf-z&d6|6j5*0%FdWSir(GL7PXD;GbBu*5&wpXQ@fAaPGX)b`{QsY z*y8FHi*bP1j^o~hK`)Et{H!CEP%w*1ogDYdi3~y@H$a2rf`|)sZ z5F(eM;5%4sqvKsr=E=&{#mVUU{CKQ53=R$!8@SHZp$Q{`R#q)Z=KSF0abhPJFhp#? z&BZTAi%r!TDjGWUYoYT{rzbt`{bctSjW7mZqCnDES3aXanmL-gX11b#Es*BS8f}NS zhLU;eGp+FC3TzrGzT*0c26u?IEKBCv!jiYeX5Ou+334Tqt>Ka-f0%feqiUbS)IJ?@ zf4LY0-Fk@zaD7$P{a2apcW_9%M$*Ut_=h-vN4J*r4>6oCJdTz%psan25IBO zV5XieM~E+>dd?joCL=~B>iH@}z9xE;dy zG5b5qrhlTj(B`3qcL8pZe*kskW+_XR_l%{H7QDz4{tbJ3| zPaa|0UkQ6Q-DR6E)*1PXY5=kDUw78ms!>HWV#K{JqIF-Z${)v7rv!=v=W$-x0!PdjtOSysQ)0CX2Q8SL}stt%nXpi$V#4vgC^C zR?Yk)7n%PA`oArT+$GD`Z{vbd*9XOL(?vP80#!9c-TB}IGPXbAgzNW-zP<#v$BW6@ zD@DPG$|K(uqx4I!>FA`L`7Wv-u1yEOD~3@@cU_ciD+#5a*i^$P;r4-*((!kZ(%QSY z0)Z!l(xEFJl#*!zqm(g0rBvmjELuel+pN!*EHAsSo!1>Vz2%8MEO_Nqo_c`(2G%1eAWV7{PI?G4NbGg+Grci!EvJ!5kgCHoJA_jCAAuLpv zV1dszz85(V%ZBPHVn`%eMmSAK1uPe;dHhsV^M^$`;peNC*QbhYIoxb3oQ5!Ih2`sM z;(9H&5puFG2Ee>IDBzV~oGZ@qQQLwzNEX&|kTZ69fD*MWnTztU``Rtla}mbk#QpJn zaUr(^S}zb2xy6>81!4uOhFKNJPM6bzLsQC_QI`6{s`!om})Lr z#Sg^BzK*IR9OfW@)uABe{vKr1vgHHuIh!JRA7z!Q7SgmvY=ZN{F;%9|v|!T-#~o;7 z;}e_Av9M|(T}+;IUFxJzCs;9}YSua81eS#pYs99idVRi@X;(XiYS(B*{E%pu-+FN! zD%R)g#mNZdTYV%p^>olL826EwjvHVXuq*or0m>_=W(_R2J`yK!TAX$(Imq>H5}=$s zp3HSpjGqy}cxHoW^jhLAe6RAZRkBZD|9f1cEE-)5i!D(bQTveU4OSdBFBIQ`uRjsD z^C*Ld3iIF!80?lyvrH zqNM19LnR%H`kA>^Omm&W2@jNlok_^>+^wRQYHPDMqpdC8DmDplSfAlUg3A002PG#$ z1AyNqhUjs9r5AqXlE-ns;|c>*3>Fx&O^o&=s}x)uVy52#X$F(I=IXTSF)-Zh z9b;)+EP8SLQCk=w*(m}j!KoNG8)nC#jeQ)y(i63?;(8KZ7aG$b2vP@kYXYU8iiL02h4)^@eL;?4b*MFDH#Rgf|T!C1JzMV@9{%oJET*S1#T%nSBA(_j;vc;cMN1v&} zEkG&7cTMr#)q&LkV6=##x;d`sGV_9xK^|xTMin%L$riCas$@l{Zn5YWEWK#;3x0#~ z%Oz1{v8(u8BF@LrP}x2dSL8c*vNR;|oMA-Z*(bULYUwgpDZqSP{0TU?ZYzwn1;V$p z=EbkoD;; zoi6V)>L4>s#%n{1^KQFwxsdzdRtS5a4Fw}^5~=k9lYAeKQygjc@7v15pdUpHCOkxJTqFoSBbv+3hrUZ)<5Nxpp%EHqV*t4S9PI z07))R*3&R-6J zwAf|=x+8O`^Ze?MEtA1}KN@h{Ne$QG*5~74gJH-1|Brf(93!;$oWCCm{^Kp$WEb2f zG~nN`1&R(KKBpZP2oDb-D*r#-YyKX)X>aLCZ_(ak&-L}*kSLvtP<6P@X3Y76WHSaJ zS1$*^@DevqFb{m&!!quu_%5e8u+O$7Q?Pq&I8PqQrq1er)uD59EupiK(J5@F@l-nY z!rd7#G-==iHB*P^A)!eF6D-;h;$azj0&#}s$SNE0t2@fVdGbhz-~G4_@$&VA_-;l# zmD6~_kUL@*%f(aTa89%1Up6{L&GW-~@`!YT^48SZxh-B{Nvc4XyQXq+x^=gz;>omd zo;+fih;NGOl=)pD@zwKq;0{iHeYvFbgtp&^g_;#>Y!ve2riSz65h<9C?5e|k-cG`O z5KipE7nTfI`D6Y+`CnY=emm5>o;N__hK40)L0&kIsg%g$^>x_Tv5v4oiQFx+Rc$Jo z5zdoGBDl@_>QudZFR6M7lvavC%kRGJWm#}uoXBe`cV)nx%OY;pvCVO1?ZQOP5d8U6 zEj2p6$SJCQ2>yILRjclfU%ny^M2)B7!s29WP8oi@375^U_I3=JU||#=*xr#C`S9{j z>NKco18LAq)~BTz{+`f1b$|!B7wEk#3ol_^nx!Av+L?Pn3}esO(BKu@>rne*TRQl~ zPwmIA@^oazvbRz!;Waluu~JfU%q0GvJR_x`Z!C2v<$Z1$dR?5tX^OX73jwX3JUg^{ zm92$z`X|97O3!0WI1`!((&nHQyX(*{-D$acQ+$il+_l(f(=H^B$WQ33eRay5--~hr zzm4GtB2e=!sQH_ax!pDbj5+d5lwiZ5Iux!SAd+4Ver`*GEQWicp4SxavldqmB;d0{ z+m_dE+uCZ}1Ff77es4r|gO2{94)*>kp60*Q;1(siW1Bvpd#1&|iJR11&p}>J6n&_@V_)~0z8>5kr$i}Fp*CRAc7&@V0sNGLpMrj3CI&G5Bi6xIklXdSD zc0ES#`60ORSWKgF6gtScaXrA2@={uA zT|av&2IHVQ@f0EbGN^ef#`53Xgt!{?GOzK(unN=6fq}4Re!M?f>=sPx679v#)u>C9 z`!!+`E>Tp!F|zxgeK>fmiL}M)!couLs4b;?U`~r&^#9WW_N9qV@MH2Zgd24xnCm9F zLsNIjcUiIIrOTh^Av`WwwojVvMgCmG;gc&K9vQ$%alzxQCvglatB4kku7*XN)E1r0 z$2f_^t>57!61N@#rgM`6phwJ~XVJYKC!A zTeZ?`($fv0{Od)5&|4=((pF#-gb&a?026i6W@n}8q?dxJx+TJ7t%P63)Js07J@fQZ zIREe#Y|u+Gq1nVn(^pG7oGK8EbCYb|d(llI-utH3?tCWwp*wn3{ZY5|us_wZb(|$y zfoOBoH66$s3B^Ho!Jo%ks8SajXbc$dC=N} zcH7Gy(sL;0LJvtmC24Kza0*AYY%32}b1UG9hZJt>h-gpR5gDGeBgT13v3%uiSn4U! zp_i_hN^w<1#-48&?kQ!^F+fgvF$H%Oc98Dr?j^=UVWh7Vr6*AoWM6ZEuM}={+KJOTZtx-9 z<4`;p7f}~|RkFX>$p#s0WS=ugQJy5Mf~<&j!YNuPy3S!aE&Ab^r68N6MFy#JIAL`r zE+rYOShidhh%1;3QYa)#{oGPm@P^F~kMU|`8DTr-Kw#6(6V}SlxIq4r7lR_}G|cK` zCw0qyQfDeAu+Qvkg&RH8zrGaeuULHT9JW{t|H~>x6Sy&Bhl4h-6|z&RZS9 zq&e&DBscrpNM0r+m)S^uM~hRE(E$>11mhMja64W?M{s~DYjgx#yKr`ZjnJ+D?85ID zA*FOU&xJBCaKSKPBnCcI`&-@%lx}nAP+L|J8wrzxaWJdiGK>Eomc+%C)GanfBa?ls(+APwU4jwm^u zk}y_xY_#O2%R54s%j4d|D(@b~D2o-VXv{~|VHnahG0G=Uoiu2^Y&iU$)Sl)ux*J3A z?28xHWtb>+=NIrWWTG^c8wgh?N^fIbIYudly9N11X$HRhbCPrpu9&2*n*MkouBh*e zfzUoy`VigW6=sR;d#gL=WV0YG4$H29>^P|-XR#E-No5@7>?&hU5(n^|PMCWJgXu6Q z$WoIIqXqR&O*f`-fdak9!blYEK{ZdcJ;1uN=@xDbsI|il++?W&9kEv%NaHYIR$273 z2Iuov@+B{<^Pl;(xg-1fU*=QpzRf4xLD&@RXVuFD8B?S>Aqas2+Z4p3$S@Am6aF$> zI8ab`1BvQyogz7J+Sg3MIc_+lPR05MK-N@=I7KXPO_e-3(6*6&B+l82%D$0a?p^I6 zJrLZst~Ql5krI5VwxJd=GwZ&*)H4X?wv|j)ok&ZrM<{4NfPAB+fuE$yW- z+)yQVVg#P`Y>_S*lXsDWT^@`(>@~f*iR>;=$B959lu+9_tWk$G=BG=IvBS2cO9EAr zUv$F#^Grz|r%S{&m6#z#c%ERvB1qX6FVcCAom_`|$6q3WWs@`1!n5?Y!lyE5;YV0l zzx_*pYLTNl)a_<>A&}TiLw_{Gxq@$q2lZvK*pA!|D&1vvx}_Z`-Jd!j-O2|ng2lHZ z?NUhUDD}fxqq=uks0BJoEjj4kLV5$ihR{kfHd*~B1l>@vd@Gk!RPcF^LY}y|xIFQ6 zG2+wXKdn#b&=T(cxxA$misiWTH$q`gD+%|9TjGS<8@Myq0$^8Re|L;R(NOF~B26`5 ziu$b|oN0+&@js{x=C`U<8@aQ{RuMdHMWB?$y|r|WSiS#3Q^TD!)do>8GA_TZ)Yuvn zM-{f7pg72zHd~FHV_J)wAIa^cR2CTbf0@#5zRV(={zpn{E&Tts(pu^M7fP$+xnH4t zSXmHMjq%kgNgfHfsvYxYdZbe2mB4vHO(*G}(5I6$l>60E(n$*7biZ=wW^`4GF=v$J z$IdvMbvrfqN{33+C0NO-PR3&Gy5fBDtEH@~rxz@KkBIJ&!|7 zx6l=7c;g*sxS=ribc|L>@k!v`RmOc6gCQZ`z94o zo`m8NQoPj~K7F|!YuGd~#*3~f1$BN*drb=D?;eJ?21+fNP4vNo6CB#a64*LWYJ|kk z4U}Sd+*|n#e=$ZN%4H zh|GVLF2c2PX4;BJ5-YNN7#fjZex^GeP&1Mlk(|C#DB=}2App21-2-6sFsTVG{+qq{ z@xIgumAr+P@%%bHohjXfU{Zi$9>3u@p!-0teo|+r0J63H=v;KVADxTt_hWUYJ^ElI zWaUU1Q1TK^s`U#NM=ces8plWlThFNV@nDN}K@DZ4qP>2QiI(I?uv3p{xrvUF#gX3n z6=@|m(1L>9`S&tCw1bVj|DjB+#s7E6)Pgeg;r>FNXiKR)t$VRVQR@rewaSxOQ=sxZ zp~{m^ruE8`UtddAF+};91v+z~Ck1K$LxEb0|L+heRZ`2y(f>yf`0ocD5x6=GC<3o< z7+4XwIt(ZRr|MrDfup7mo+wRo0^k#2{3K~Qsy_noNX`zvlg<9G_6fl!1FKo28X!4Wk3@(if~&J~kqpn2T| z$_y#mPtCz$4h-Se;Ivr%!*hWeTnv&0q>raSFA=gv^Z3sEOCIRyF?9_I+4}ndFlnX~ zlc>`7Cb9g65?*j;$XmVr$&+0#gh_8g8D>YWuFgcK&3X$zOFGN3(!3FmSlXMF z*0B|tr$D`(nDi!ab7*PP9BCd-EnDZP(0G?t_~>`$2zfGx&PqvhaaOBVp>dD7bs@K> z1LQVUwhn_8b8&&$6Hkuica%abzs;3i;4J=oq(F|_t5hT;a9u2K?UlkfkN2&M9xq5s zc*G2Le=AKc=V)93fCRr@#aAt zP zS}NUR6!qwf;ECqJq-EIayDa;cNjo%{bK**p)3Rcvbc+<6@_{sh9H__{(<8E7fWX#h z%mQQOL9B95Qn`+~L5;euu{v*z)FbC%oX*+=s0UkA%lzhQ^o>xkgpkbc6hI&SRU4tx5gy6N*Ft1)K4drnlJSvoGogg6Ijb25Va|Mhkk}}Z`vaLuu zK>Q%%KdhaT_#_U0NOS)9A;}4i)=4JJ_~N>{&WqLSXvW>^BzlUW3HZ%x9b^ewFTGCo zImC~o%Q%2qz}3rb17Uui)CAUiEX~1rqcsR}Ob~S3fX;?K(0zl{)d>);*+2o|sSQYf z0NmRkg}vnD+6xfU=}MEhWvpR2{z5vFIUYRlujQ7hb-7u9>b505l))RNuv%BSS@JhZ z85+dN1>f)?aAlJh;m|KV1_R`8ry1e?1}_gMUaQ^S41|TB4{&ejDm+}r;aN6ypNM1T z3S(_-oVs8v(Euom{Z}9u)_QBv z1y7E7nS7{A)SE?CV93c(OYAnOEl*B-6^`g1Vi{i|ZREJS5WQXcgy?DRlHBMvI>HQt z!C6R89U?kHkH*!LlPO(ex%#yfGIpSwkE!VLt)l~B*bb|j(#vbekub}K9k{B(^FS$| zOO43}6{*&X-6yARP|f&UO3E4`Ap6)hZ{}!2rvC2mk2kw%&bqfD=2VP`bR?&I=1LK9-E1pLf!UBxV;*B-T?x!Y;N{8N7=wZQk7_b#gv- zb8r_OBR}ktIyAy#H_?o7^(H%SAx6~=`w9IxL>8}Mi&)i0})1^hy@10e7OPVT#)NG2>)P7jkeRdyeN>Mv&71@R}PBwq?N z7&$)#GLW4xFqps?!fuqe-~dmupzvhJR2s}-y;=C_klb1PxOlP6*jC~DFXH~&sa zN!XD0PD!2dXV)o;SuUQE-f=^Vk#$b$#Q`Yiq^9_D>YUU8f4t92ZCt?<{nUo@QZNiV zFEt>KVM@_Q4Y&|X;dyBzG1xC&K+Pdai+dC0e=y{->VnjGz-X(hS=AUHc1(u4qg6PA zf>KY*Xo#Tx^1zi3J8a0jh>;hiPELmGt&36$dW1i?NR95Ui&CBY8-3J6gY=BqeWc)c zN{x(>j+dyi54$8~;LNe+k`!t4W|v-KL#4NSVt>d?cqan(e)_f^`d*ffqpze+=vXN| zI8FQfzX%<3y&Qsm$C#({Lt*Sy>E&7hV{N~eNT^@g_td=ChN?r8F#_b}YY~uNE&YV?oMV5MdT3kOx!WiX_~S$U4^mHzf3bq7mky!;P9Scr@^o2MqcX zJ9;P-kG&89naA?AkhgNO4u%&U_rYvKyA>K?>yZKv?NG$hTEyEsV?nO@z(b1%aPjQg zqdzg6U?`+K!dCH+_Xry~6gEAQTHsS9d-8lN&E;<*gc<4?2%8^cKma?P9PLE|KiQ<3 z1zBhRjggq&4AX)kZh+fly2`?{)as3xZ1wdYrfHqvOYJ|M=(DXMC|J}sO*_Sr=+wXy zdmM>Iy$b+lyrB1mv8%gzL&LG{e0+8sa>w(1I^i2U1LTL@o|zj8KRm$@kzP39v4fAm zsHf66Tgw<4R{=-nt7q|yS7oFt7;7YdjBQX)jkERWe{2&yRc?hI>d|s6`qyn@2g)(F z;e#3kBaCynP=nj3GnTcI@tQ%hQj37JH;V(7<;qPtep#WsL^}~*MuF)8MoM?*~nn0cbXFUUuhC%))C<!1f5K_68r090xC3k=8+526PK^0Kqt54_=_{)h+ZbQxBjA+ z6Zk73OVVoaN?SKM5nuUr85YPtJ`V+7`;i>kA9g0UMwm7lo`V`Ux&MDv*tBX^Ux@RR zC!tQ1Jsg5Nn&*K_^a;dAzp-CO41w;8F0 zs`!yX5dPJhVNlxVO;<2@%M)?1S6!p)05hKO3 z_cr0u{H`B6?t<~fu^4dghKrkv$H3qxlQYek1M(ba4J}51gYn{xwn*S==e(YnqpHP1 z$B6=iCFTR?m6w4zgcfb_w%MHxIbVnwwa^b1wp^(9*g&TWR~jdrxuLPUZRSu4xI_+Z zLGhGySX6o32rUC@H9r5%g|@~Q^;}LGUu~IUpEf5fa%z3L{`{Y0Tk>Tn+Oe=z5MIi{ zpdH@5td1fSsSv%uM%7fakWj5C&azQ8eLtU2EnBgH$}~S%ZmIwGEk7D-pPh6z1hV4i zhCt@BRpdfdFQq)95!V5#{_zcoxe~^G69D6;DZX$;f5zQ!#cFa-Qmk8hD&j?}^-5-L zA{T_z3qoW^A?t{c_lC$s$hpZ2OiEQ`BlN30nU!aN^iUb6XV|&~(MIa*JU53aT1O;b z0;gLlW8Y4s_rm%?*{V5dis5NPP7gnY%5HSN95W4{O8Z{bGlZ-h|ZmDvW3^Ox_EF;PiKI z=v{H4iHEWR-wc6X5%NgQK;q$BbtVwTja})AC(%;^VCLAB{+8b(WISBjA7S&nY*@7E ztPh0buG~W8Fgh&;e@aHDEzlItNQZ(oX`?V-$=hio;Y7^;qB3akhy)BfYY2tX2!Ge* zTc<>$cuThL2_XuP_tP6@!_^jZ5|xYN61f=I95ILVs2h*vD}&ygZK_im3Q(VTdw(aRW{ZS)G@=*4KIN z>~eDwl~uiMN^{nE9v|5UjX?U3J=5TN+J6lbsB}!fuB3LNsPBNt<*heja12A4*+1Y# z#up!8M13m0jm{N#+ejb*P8zm@F3{ZBif|&1!&|e+8I!c1XHvb-Xeg&^$r%$@NNc9Y zyOiIQ6Y3jKyFUZJWI5W4d2)BN+H>1Xj&(Tx&%POQ;o9&%T+&orRqI0$T-R5@`k1x%LWt z)tkPA&lj;eDidiPs<+Wz$K4&QG3?HmyE|x{(eQQ~lemSDmxPU=ud-on60IXM>Vq); z;ttvfUpjl^VV4KTe5o`QzfzNpa?it+3r6Ls#FdEeFnjthA3fkt_WFB5>j%Z~l%xx|U_;j+l z+>9H#yoG!hL%@G(A-Ctae=!PJSCFg9upEL2e(&uBy`r2Y+@K7IQ-NH6BBFI91EM<%Ou`*S9_V<7pO2iBC+a|~!usc9WnIFaJKA(R49}3s8N^RAQ0_h9ZU)M>Cm1`(qtVU1po84ii}1J9%HNd^l)pq~ zHtXZ>OUhqrWF99ZIp)GMq*SkjK-9m{9pxF=2~A*Fx}2tJ2;nI;Q|^pxH-#(d@!6`u=NLj|)^q5GSccLt} zaAXFJg@Z^RJ%ZC+QKZmG_Q8v`l@4!5bHT2Z(XvjI(bkkvPkI9pVFB+Tsx8;*Z)<1A}7Ioes?UG9n(NlZ9+dpSVO)T>eR$q4*Fkw#*#!4`(Dpv3)1slcx2(6`6ZBPY znOryWgUZu0EyvvicCET~J$}Pp*tQ^t^emZPH_|^#PWK_^gLn=a6UTuIq-Bo^g)g$? z!NgZUSn|G2n__i?2-%dWJ61ud8uho^6K=v?2O8PRmy>Zv zv{QfiGmQ55y}z93N>9>1g8ao8k=kyM+}P*tMJYmLzt_qx6sB!`Dtw-?l}3%Ln3lsQ9xOVuFRpW`lqW{A8At^Kwk^1EnI5{Am{ za5Xc0D7r=_!os0)F1qiyVe+>ecN#7XM~;tyR}OYy@pKrOgZC7#o&g7QL5&3v_IOk_FL=3zA~aa@J#Jn3*k@*qxIM`$E~Ao4ATmhWj@}|3%i`DM1csm#|LI z?%Gj^cC9OpZKLE6UR_>5>2R!0U0qbZusRm*4KHxRB}UX}`x2x5XbS%qHLxu)TI#J! zi!Gxm=nrRu-`*Tm4sa@`0PhB)Vn7g$4r+qnpW;id9D0tyI#hwbHHJbe9`6OtIe?e! zAm>G6(A{BOTwEGM>oGdlqb@ECCaRZg#fcS}XhnJoybQS@jkT{c)WZ&SSoNZ(9t6fK zjQt0SzMQk}GucGXZeUZHHjPu6ZU}xtVJO~^CL6p;9oHJ;F02TJdE@MB4OlZy?v1m4 zA_4hE@XeKd>#RAFb8#Tk^+M!-T5rHw!0ze^+j3>%4ttXOH%kl{{x$_e$)xHusCux- z$73C?FYpQ?vc4#rezzfg_QJzm_*`;nMa1%V(Bab)aPffGZNDQEr$x%jf;QY(D2?qD z2;#~DPiza)npiL)0ykQYOs%ugf(|u2wwpivmsj}jId<0jOo99=uXrndQX&_q*^!qH zf_r{0vQLk#<7585X#*|u-jyRb{wf}SZ2emh?3sW{TfSYX7~P1Aw@#+qdonq;r}`7L z&oXW4Rd0jpu2%yWu&8a)a&p(})iBxv+m!`l8gcF1uijVZR;2=;;~{nBA{}fxmhYi; zF=}yl!Z1-zq8k@_;8vmBqR!>H!*FGdM}(evA@K4?jPmlsTldf{!Sq?9q~SgZhK!g) z+%)dE3{ob_Exc(C^#q4C$Cd#eEJw{mncm!opN4{7d*ukFaS(o($cyZlsKH~dkhM+5 z%Q7a)ZZLO}>_wJU8r-uXxnb~zd2V{0fn@iE)I1qK8B~h-Xy!Y%%m$Wujdm5Ite$su zg^EA%Fa*uq{e3HCf0lW4aU(YkQiiGTv!$E{Cs0zSubu@AVT2y3HVBGV%DAE>?0K54 zM1pBnPrbl=7?{=4*(?tr*TH=t%0J`J0!e-we>hp5fiw0j8CQAhVLSPm2$yAC>`sKI zGJ@NQkTzL1n#dM|I^=P)SfgG}tXI!C`57j{+mkW(dRRYM&c-Ov-zMW?EFT)@$=`Dd z_~av91={AzCVtjkf=GPyLL+KxX5no#c$M&sd^tM!;+-=tom^Uzi-c`|Ro$Uq=4|(b zy>Y?&fblN@Z@stP4?=wf0;Q8J*jIO|CjM{-yr;-l!W0ZC6u6PGcvk1RSgp5`7sngm>uGWzt_ss2_oZC?Aj4_d75M3L7d$|!-oL1B`=H;09y`@PJtM z;6z+T6btuS!n|4X=g4vH*W+EOUcLQNPlvz!|pQn31@QC!BCb+GQhmhyvQV`vyH)?G{Pt~;fmju1{~Rk$a*Zd z^Z3y2Ld_laQIh&h>@3}Qcqa^v=e$Sloo|)D_(yxlUL?QfUqn9CfJ%TnfzP7~czRy_ zf7tu(_^7J%Z|-C!l{C^DOhV{2D7}t=AZ&mrq9_7kQ3R#L$_macv`~{!@=yYkPy+-= z02!qwh)PYNOHBk7Q6N#INPEBMoI6P%uIv7G_xJAS^S=3Ka_&9%+;dNP&Qre+#T=MA zzzHBb9J!*o*C%VmmpG&1rnR<<$o0_MrB*eR_T8o~Zt6Su6pmeTyFH_?g90xwdJjB3cQGW{NaHD@IpF<91&C5)bbP|LG!JvDhT$5`yad5_JCUZ zFrkBm?88CfSb4-XNOu&CJM_IPyrTXY`fd7$^qZ1Xaa8E!x-o6ManZ}Y_`0Ck%MF}p zBURDp&aPC8tj>ZcIy0&hLCx~goH^-=BM0en6?Y!actzaFA+CnHN;;8;Qd=jUKGbm` z)IbL6wU8^G-e1UTZWN`j7jmVP*CKwe?IM2f9Z_1kh~GOZN)N=nR*QMf_{IEQswm|x z#=0}4F5$NtEde1MNXwQ$?a&AQ3s!UcBMWM<*fwLUYHh&Uf3ctj%i~bHH6q`NJLHQxYF9lTR3YWbBU#cPhY6JiiS7xr_dwjXP#Cm*uzUVP>J_ube({OcKX6*o4R=1*?ZX7q9b(794 zvxb7I)qhM(1?wX;wyvn*W3&DZ{c9-tx51|OuMzKG$If``q4{h?TUTq1|M&6#9izLo zymw~YTUlOWeVt#?SFWh#O0K@?P!{&JG^x~AjvvnZdNrN*RRB#z9d z`22f5EoK?@p7QBS%5v*q?DmVxxo-D2{9tlhQ(W=00n~T}Z0`d}T>-JP4;@)yH8;^x zYcQLmu{~dZKbOxf8=-H?ORN(|9qX^@N^W6nyOIwM@-XV_ttVzqcXh2;XF{FF*4d4f zyepkVS0Yzg`(tc6i?La>%G%JGeNrxTHY>o8om*uMF=Wo7+pDaNna0WqfV~-OLGU}S zwz}bi_EN$(-Ql>l8hWjBl(O2|k3SChaL40rHNIdOOQwsACI0MlW>UZ!M{{3@=3ZUH z6-uwK0sC@}cCE1vFfE-~1L}g{Olu_6aqTj>y7-`Y-JDGRy4*}F%e~{f)*93J=b6j4=FGKXMoQw zOSQ&azxhBw`={=F;73c>@m6xzStH7+_k(p-7Z2fGf+0Irjq;W}Yo=!FtqeTakxlVW zxy+aV7|&TKoe4jotB(G_X~tv`>O>A1DS#oJa7pZCn)aNF7xSC(uBqo`WGL4Fb=0Z; zD#Wlu4Q4q-(x8?BWXghZ+d!SO;Gi*>-p*nqmDZ!=%-GVi)hMUnu0M?#b`}{lHYd&QC>RYX^gKK|htMz4+4vA9CCs<~ysQ)LZxr%0dVx0u8-D?|k zUwqef3(@9Y>**SmT#?EVwu=ARPl1l;G&PbN0c76zE)@}_zOSkNJ zO96#^inkO{-%qWzqj|Ly-Lu@t!~%h^ZqjvLW?!EIO8peisrJu4wITv0gYrMKHVe=2 z1oy2Id)YH3<VBW|9)J9~qt<8Q?b|DQTvC2-hyM0`yoK)j_!v#xC%##fibcuu z3rBl-qP@N4?b#E)u#R9t?blyg@8aj!SD4LJbn7d=6B_Tg%2@4L`?0)z|qTTj+<`g#hY*0B&eZ&OJhrzM=j!>wq;7&#gGXcge{EycN?yzDrsj zDMu0C8-W*x?7r&H=- zE)WBXN}(RyQ#W##L8>>{Ybb1wct4ACzbV$tu4$Z~MlVwRbBJiHLbbEp;yF_b&( z`wQWvh`s7{)H)otr7L*FOKtpU`cbe0v9$gu*S=q+$Y%ZEwbWyFSL#x;rI)?qF{_mY z*FP>LU%vI9l9HKQQm_+}wCQ3p8!LyH%m`A}6JqlI)BiRxnPSffH!&_FFXu9Ig^X-} zc!rIHa4qH-lf#8#S&f3~ziQ;aFWJWI-^gBPYG6by(<(_~%GYN~~PT&bxrp>4B z=egn1_EF;q4yLsWgW2LhY{~Wf;NU?AK(07f?8A>gEaLTVV3QAl z;FGYlMUWd8d=Po`G{u<;-?AUN!Fa~RTdBW59LEC#%mLJ|45So87@8bFbAAE+M;4(n z?$BXzecj>V8%-U5W?p%el*QeAL2`bPkt*3;C5js?mK@xdvhQUW|!SQ)dD z0&JM1aPw2t{1%LaiMMFxEo->f!&@Sg5YzOlx9O8xSomw{`&-tJqyhG_VA+My7p`Z6 z*@o-cbSntgvlSvK`P_0tO^Wbz<$5+4X?{=7#wbXInhn-cyi_1CyWs!dZrNf6HrP;Svym-l{9_G$a{q(y7{# zzint%G%$Uht0xb@t@L{GTIrT8f2>&wx4%&z3UcWJr8JPYiuT-CdjT}Gp`3*FN*l_J zB*S(mDhqmEv{S>@4o}vwjRsDT2Muj3&t&jH0J69B!&{l$m!@C<&9lescRu5H>qLDYo0^AEK&swIUP_V8qlm%V^RbxILcS^L1n6~^Jtg;)*gH$)b-}4EZ>^ z-wp79k44JgCPzEmE8vOFoVVk;UoCguj(167t>!TgbU1J4eX#Z^_^PwO5#~^BnX@Ly zri^VU)%rar^ukYU8Nv0KFv4{6ZM7KfPOx|v9gm%6qzqBb~T)o zY{}yqNVWQm(a=SqR0RjI?k+KOFUEANcT$56rrD_<;}k z#vKl%>s`OEMaeT{=4BdaQ|{N38hIFnxz_@778T8qE61ZS7i*-&kUODzFr}i|KGj9(XP=_{4zfF*2&K3O)7lDO2OD2<4qxhq?xO5)qmJ?j6Z%kC zG{Pw1;#OCS zGrm)ylIr)T6fPfwa!s}=ld%}$ofpBY*iidoKvU+=;DJ(K-+ z;4Vuj>5czxejC!taK#J%W$vO2&&XqpmxJI+08g?|iXFb%g}dU~c5SJTE;qlmsyZ#} zD#ya-wP1LoK)QImM;A99_sAW`dUxYek`EOw2G5f025-B;-2w{(+7RO;8_6)u0a zUwyjEBUry`@P5H7Ktw|@DJ}Q?>;AU0YBSiEAN5Q&k^8f9FUaWr!eqcY7%kGFu#V`+ zBo5Poi$EU1CX1zlXXTb)&$EA99!Oz59W4sgL8?PbIy-hc{A#-g0Aa z0k;iXEMQaId;qi1Q#Lb8f(h#_Z(k7f=e^}HxAOHw*L%uwLBH2v^5;lo*IRDnEtXnE zi^?OycdjopOeekoYmprCYFMrwPm~GL^c7{|p$}U|LL=$_< zuA+BQ<-M!Tgq7Zp^{S!)N3U869N6++xjEu2gdhly0B(ANrk$A(BxXW@HI6I^@A}iS z-m*LW^sMaT#yzI^GRggm{1Nn2CQChA{3lH@anHxfUEt?9FIHa1ViP*`0|gsQBm2o6 zP+BcYMg3&v>F*rJ@5RLNdt*dtQ5?UQFG_bssp<1Fiw++4yu8(LGn9f~ke>pvFj-oW zW%n4s2Ys{MnMS=JzZTxt0gu$~#W{B>3HU%6O#rd-^h^!{=?=krV5Epu<$i~GwjKv`&idH^I{ z{J!;)jQnaNY1PYe8>p8qyeu>2p)^pQhjp=Fp!^9OSbD!AGc>cpSLE@|Dw~-7)bABJ zh+cnHeiPU8Uv*qRD6ao?ko+c$X2^i{stmvI!X3_ZpxaCUy}u@}$6`7E8W_-6`t3D& z7=B(G%u62)mfJ#G#%xJcG`c!aL#3@QK!C!dDj1U)^I8<(EOf|rBz4&#EZ1Z8Vk-iuzH)Yqpu5_(NynF~? zEEnSC)+|HZ+45U)xT+14^QBaK++SsP3G*^&xI7CEM?Vagf5FfB*X1{jpBkWf%n9D@ zPp`cp&oJ7YEZ?ve!pUWX{G9ZuJ#K_7I~i`d(a}-zKIdC*n2&F1+`a8V^wwzEoA$mX z_cq+CLEdl6gW2!cx8*S7r(TvTqLFoP%PZN#{YK00N8PJoxvGzd!%5%8q8pqHK6vOy z>bto#h#roXUoki#RABK&?=bB@5s$6g=#ZFc+fjCOVyn8jvNVKrJQ$Uo-Y%r zuwJC0-|lEgn?eV>*k5>8jyE_V51jA@_a3pNI*lpX?rq!iMMFqE*WQU0WUpo#M*bWFAL}06z8>+auq4lBw>7B z-ZeFhn!lUu0%tp&`3xf88)=o9PaXozna{(MIP)1yakjmgf$`k#9lSjPkiIu6b7v{~cNf{^pqOn2fZRj)|tx8EI^ueP{4@b4jD>BpaTP zH1NQp8K6%8LE&QQ6Z0#|e_FTz5sV;n*v1d(gW2+UbQJJF5l&2-i`;VIF!MpTUtHta zubeY~Xb%pBc!szRNnl;|2=#MG|DrJa-@b(6UDBCsIqv4P@EQTw%0H9}e@EsRd9Kvv z8_L2Tm~5#BlQJi%l!vem(R>+hoSZ@gQSQ34rW#dac$t9NifS$3LTQb1DYG_>#w9Ll z0tNc-h?<^|l(^)`;=lZbyyJ+rNGjKG5JGmNJSvGMT-K!BxN8~ZX1$~Q0SzH0c#>MW&`htXqg-8FxeGN6h+!Id?S*nP+|6GoH{oV6C-M!| zA}C@J&LAC4=e5(_Tv-$?4P7K8ODDi1L|W6sXhU=zaVK|?dJM~m8RyS^Y@AzfZ{s{= z4N{lklRmS_&%${zo!@Gdj>pE6mM$ZKG5wm(dG-bwaxdd|L6Gw^!e4?%dM^)u#z1Cd z$k7ho(FsC7pgRGj=vp0a^@-bE!ISIJCx6O51Bn{8KQ+*R^3UJEvxkiOP3RSo5K1E1A$Ez{A%3^OOLyDiLR`Dtfvb4(cdkf+N?SS{~n zHdytzVy1qXU|I*$n6lNubRsD&lB&b4*2Q2!$_fNRaI~kLnfS=TRFugjHID3betNiA zaWQM3Sc^^a(!`yVwQ^&uj@@hJWUQ^e>*RrkM>S~OI(ekS9j!V?s&L3=o!84O|Cb*4 z@Tb;+Nnq+a)`1TB^aty}qys%w#%rc6XEyOY@pd-!6eDSOHs2G)*>Zo$$=)&tk|VhK zdWaoCrj$*aWe;%mY$03j<_FW-EpkMFaK(KR!O?9C$lFkAy9Fzgt!&^UFa)P3R<=oi zAaJa|C0^f3LAD#$>w$Mi!*!lqd@;IDkaX_jJ zmCERao$@PTnYXL-Z{aQ0zbWnxlheuilsx88h&^JL{G!0M%k%g0vnTGs?i5|+h*wnD z-xL<)_D8*al*@bTo%eToYkqH(3vI}g>ljwvq@jD|0Na_{O{7l;rbn?a*1zyyApF9Y{U{1%KpqF1345CN-pq=}~ zp78}!ehi>8Z?^zDkncJ()sdy~Opv1koE-T~nGsCy9*~K73uR*lq0Mp7+(E&kk zfG$IkTjxel-$zTFot$tg#vF9q!Kujad^yn-Po$Jzcjeb@1*hvu;*m1k!i(!3f_iB% zQe=2g%$B)<^xh%4CEM#p=u&x0`PO^RE_eseq7k=bS$Jwj2WPr>NcIxdyhOESJ)U+{ z^R~s;WVy3r56j`Aj*qA_>o8=%!L;D8JjHm0DMfv|%|%j}`+BZW1(gjVSLJxT=>= z$W8d@ZgY%o$_YNYO+-(;b#)pB^*|c(2eQ$fzKxEZ5To0aGTy`J7Dktvyqzr~rJ)$# zX5{-ZkZdu&qo7xBPKB|h!Bjf2XNTyR@*#@Rzg7=Wa2C0`xL&>1DfuZduuoA;rzp(m1q#AqB%XA*Jxe-B0ZU*55+ef?#D(h2+y28 zjX^s|cTUR-Fdps1c&zwZ&IGaf%NcnA0204BBad)wj_RFQa}Jh4iB9pSO&62BUU9Z` zW;bv|c7A-w{_u!&Mm#}9dvPe0KdkF7!7!Gcl{qMb$2qx!V~@n1lY6)T4$;Um9yUwK zMLzIza&2)1F$Vm~jdOAn5SNJaSPlm%^*r>uDz}QisiquqE;-&u-{LL@Tz}yy4hfDG_ zctSed_;nr%=pZ@-NC?({$tCc~D=Fr(+yl(O-!8+sj?Lh=GDAc(e233{o|=CrKba>- z`A&|hHxw`&VsOg=#&sx;Y7qXQm<7X&EbkOArv?Ip5$2dVqwKGIFK?F&pI)IgKZ2Kp z#^CD~{&eL>a3+9Ez84-y{eF@YalOo=RTW>YnOC7*h^3`7`_yzZ2>fLqjmowa1R~n^ z%??!SM|tZ1u<3-+cY|%&!x{qKq~kSgeT^bdcmz_ex3MLeGi!QKC(mbnDC^oE*}8$~ zC<#Qz`c9u-aTvP4>>NfzZ^)`{-gf@9moZqzfqHMLKNXfXsc!G*sT3lWgFVt)nITD= z?O8sG*&toAAE}{uNYZTj+E3{#jiCnq%G=UDd#b-O#31F+tw6<$+y+5GN;FCxf|O;> zvyDjO=thzA*ZI*eK}st;)G$~Xg+vGof&r0pn3{wr(S~~ldLaZTkKY5!Pw9&Hd=sLK zmZaU(FHGqnU803y%0rYWTPWigI@8r>?ha!mFwPk}DDJk*G8r4d)G(B}-_ua_nvxnrn|h})ZlUlt zO!3eWesHb|pd8mf%Xhf`xt35yHFw|fq%z8V30GG-)RPU-Kj7CfpNB~O$Q?_0Yp(=A zw6Ec4{^xr|1Xx5miqtn(5SrOopq&seFNML7{ujD zkSUA%QGX|&AA%^OY0)t9X_&WYiQ^{Em9tvz<2k|o)Fo>q{|Zh$@RH3e}^{n{wa5Spemw&TB#AO`Vi zxZ74~;TZal`zfy)W;${3af)h?^oIAo?p6SgP7fZ3W~FVTcom1g##J(T*G56AK! zEYY~$Vot)S_>t^uN3ncjuqTH8Q3bY9MtFT!F+az@bIi~0?~{b>z5Zx^{`33f_~ZNJ z@PBTfP}<8%Ic6{wio%mKV_SbCS{f)#2JY#v1MS0GV8^5mQd--azsh(UzH5d#2o!e7 zYm&Y5Fy(~4Z-SlS>T$6O3c|h%bZ&$))_!of0xb|$4b8`e=uX$`cMOkc(5Gme}cltDN#F%9KQ6RfrH6b$B|-c zSB?2ZBKnM(tQH-lf>jQRhj2^Rf!@N)ur28CeU{%`7A997TD?bMr4Ii`lYbjWB$i zSCj$K2Vs8`V<>D0Xi(q~u?D~Y7HWQIiN{ng3lhobheQ_!xG*d{6HHcd!_N45J>i?O zNmbbEmTjAk%v!3_)RTQg8_Sdv;+>(I(%4jz#H=^HH6_er+mtZ9%i$EWd?@d6qNX&# zaBkC-+R&ayP{Q+(LA2)7PoAlhlo0T3H7RH46+db=33Cuj>Lj4>$J)~-Vf8SIb!Edj z0}chtjpTCUf8^2GjCo?tAr9le9w=AADdU`1Pb@4y=gV#+vva=asioz{{~T=&^IT4N zwXia}GB~f4ooa(}$p5^ZDl^)a>{P>T6a7qxNd9S>(gyv^sId`os#_qM#wIG>s8SA2 z?)C(~vL#Y)#sI!r6i?UrR<9sv1Y<~o04pilq9wKET(25X-7gw6vmib|r=*Qiv z8yx|5J&P5Jd$6IQdujzMoMOxb&e;ql2;=Ha*_$`irNJ{4cfg$`@4<(_OLUJqA>iEE zs+9SRJ!Ga*WN=FS8bsN9ZV2s3QC?x6Rd-paL0k)?N4vAS=*T%m4&gT%tE>Z8lMe@z(|lzDGtJIdcEB9det{B? z&AoJivY6$9NrfPb0Ndd8z31RSGA**sT1x%ovj=D9Qw_FpseGo z;R$0O9<5N-B}@$G_N=u_ly=T+n@+l9|6z%ehmP6TFIC2~4o2IQ?Fg#5Xj7u1HZcvJ zPAoh_%|<<4m$ObVoP4HG?R14fXAe(Th8XvnkO3<)w+Zz6jbG@-&Dv$@3N|Iz)l*o8 z!kkNWYqZawae;K!?b5o6K3vc(JX-!u=LLjM{H+??2Q@aA4%6U6ySZ++2zWo z__p~glqhKv*;goL=P4|sc$84Hm#$Fi;9CM$LJbs4?N=%n*#y?3gw0R+QOqi(4lCBD zoUOOv5V#83mc4X-mC_c%TzqL#2sK}=gn*(Op|vg>*2s_IS1WaWD+q8kpBHhjF{uaO zU$9{{@^>7hA6F~kE{x_@1I_hXqcF>yE$1nWpaCk%&TFt@htLpq-4VLV_0kUgZg$Mm z{;Bz)Mryi5sXm~EuHn@&&Hkhfgae*A7R^&)fFHAg)XW5Hhw*HkSuvg;W@7im(yC0Q zo-~DyWGaotK(-4_>2Ej-R13Sti>A8k+ZtuBnjQ{ZDmrK9$7S=jra z0Vx|G#SNy&JP?L~v@;JxVBJ#N`{C zcqRFBUa4<3FJ1gx31wZo_qo#C@W7dx>{C9#tai@9OK;QA9OZRx0Y{dQ!PpZQa+E+r z@=<#A3(WmQTJ(i76-y_t*@YlD{R zjKSoB@_{>i#4&K{rhB2%5h}`4J5u3S$_k81*_dN6OTRypWjJv-T}^TR=`i=V%E?lL z>G~(w8;Rt*4MUSi`3La1i8$Mp7x44aLFEPGO6FD5{H_v0UmaA!40xSvR~oRd_dcW? zzz0bYLlJ^ke@-vz(lgS7E_|x2$J_oxk+-S!mm0l4+a-Vi87$nET`sodqYb6@Sf0K+ zm48Rn?YLb^MbzzuUHn+(GTOUr8LvE0Wi}4)FQ1LXuN<>sxsTcSO042@hpRlZ^HBLJ z-g=;X6*I6<>A?TSDn>{7Dt@T1;sU;k5hY6TIm+-V%XsU7e|Z_-`LfC&WPVvbaJl;& z16Q*DQ7F{z|9BY}fBrvT#&{iH#`yeyyo|v){+q)R|2LK~!)PS$BEc1M@QL~5Tw%p> zPRp$_EBp7bSqb0-b~nYHgAGE^SHtf1ggDygBMU#T@=*5P^7WjRTfUx4W=sv0a_vKp z391YSE1fEbz-*;_3=5}$yv}13L2~MHgT~iuz)K@*fl!GtPI=dr_KdVWysn%CVLx#L9K&sfO5;m8abx_*s}$xWz>$_JO$}MO zG^bSQ1j>G-lvDPYGhD($rfi-$?Qsn8k~WiiQ1jXb7wR_>xuZ(UltqSfJ1BW(XXIC~ zS)Q&3769US{PfPuu$M6^!fzQAEnUsZ?kYpQbyxZPOy233A9ch2P{Ypll;<+9FWtKd zolzg^d-r?cZz~oD?(nl?Q!zg~ zzP^K>mDJ>}(y7Meo#I_)#GEmYbqw^!clilw-*gu&7!Hw=&yhmK=cIEl%Jm!*K@%=1 z>HpS4!~v5^L;J#QUm0w3qoxlzCz~+W7EQ`KxRCY`ViClfe+M?|yb7HR-+H24u9M*> z$^C6rrZ#h1`P9NmT;FW2*@SmyicJW@%r{|y*n}!ebND-(aF+dF-Gs@T|KTPKE#6vXrsi*D zV|_y))-qrrp%>lYs`^A8Un!757#Q!7mBOW)t$V1+pbN3=S}D|~E}X=Ey4f+$@pHgk zZvOLI_-6M1-WL9J^W$3>)5N#%L+3xUh5s!F=>PT>p8NO~UeH0U2b79kDr}pzvz1?e0fSzUb~oGYqPa z*Y}%5>Mav2wBKx^OoQ4V8q=5^cLQvLE;f{U(`!zuYlYs_s5>cD)|;wM5Tg(^)U~@G zU3F5ug(lY!7G+?XTn2la`MK@lEVC3!b&cvc5Z{aj5I)m;;8=QKR5KU}T&)$+IA@h< zh9jpxgp1V2He-z%&=>B!&8)obf#PSdWZkAM&InfSLu!y#IlSG#!rOga)TePv@Z*0|Q@^g-0w`3k)>WGW zv}#seb*S-(8@wnp_PF?k>DXCNx*EAN4({lxYG8qQsNvMEo?6|Im`uzUotKuhR15wbdBIZ6}KC03UTF)Wwwp!pD`kfG>GX@{!W) z5nWX`C)!|E7df3vhYjl9L4VsGa|7-S%-(Jg7YCZ}uhd^}EMJ3ZE6W$|@#T(%D-3YU z#mWu6zq(4NKV8k9I!OsWZU~d4GmUM0v{)14G(L&NKzl3ystw1|#ESky1xK z46t`@tit~($!6=&P^wE$X`REVa7AiMU|J&YY4*+%PZvuykJWAlC+ z_>`CZcC_jyN%>-v!L7B(qjIHi_VH3@FEZb!2?#&CDu8 zxHXdxp*_Y&9WK$}X6ksutTk+l1ls+cRz0}`SxeQ`1ZSm&?Nm4`(U^AXSz6J2$xFt< zYB=15YdU{K-&Hr)Re4MHI6O`RXy;MN;rIbGHCKJlu-rfygF<@R!@H^(PEPkXKCwyode^TG zurKeSo?-gBkDpVS)Ry@i4h;jH7bVwTywtH5zxSpnEfuBxz0@%fACcYTFQCRR_Euj< z$xW2L?yU|%$z7CQ`iuHHbb!15f{8Vd6w4cH9IKuMv2^XDPK1qMN*}dx_3`j^^AY+` zGnEZd;Y8C%b%iVF4}I`t0X6BXzEgdn>TX$L1b%@LF5m0>s?6nE_sNQMI3>f2l{qDk z!_fgm#%q0Xz9>|)pIQ$ue72uD6@Vj0`l$?bym1`VJ+agyPGxW%AIIT6fUt;DHFyo{ zy6-wL*8bAQP2?qIX)5MCufpg_h0m)D<C`WAGl ziwCNKY;JO1;X`)r6+RojukuodS9vKxl+r}0NR;ls%ID^3DjS5knLdb*|BXQ^llNPR zi!)#27t3DblhSf9Z*%BiJ}DiB@Jab>h}sy)8qSsuv}*`7mHBuovdHl&ON!_^ z49r|CjU1*jz=)~C)YkafJxuNH8Eg4Ue;D&m35&1SB%gb4x=_o%sxP3<^uMaTJ!0Y3 zEEZNI`M&d3bMhVzA{$E~!}+}T9j>mzto=HiPvxT5RU1le-%y!j^tm_GX_&*|Bh>e$ zY4$TCR3B!u`SDHlAfDegQhiSPBz2V96NTqSson9DG)f(fxqC25HA$Y&WAskzuSTxg zv1*H;ulcu`t6A7eo@un4nIf?DUVdAx538>Fw%Wss-I`r->!i5#$Z;#F;#U9B{Hc#e z>rbUr+&Vg1t>g5zrI;Q~9~MB~W7L()EK5?vCm(1f-H{J$1q*t`J9;e=t03O=( z9rZViVS{(od}y5RysJKgVQc>$X7(Vx{GJ*Ggv|->sbeK(f?+Tpo@JGM;`>q12WsO^ z!+{7PW;FcIn6+FS3IBv$i_{NPzwqAy^U$;X!T6H>f!e{D&BNTA^z#SmHW0A2AF3Z> zH%5+E7a^VBj`8YM$pALuqXp{A^ynki8;U6J3F;EV?I3&B1Qh{|-_TnhW7+nh!yl`| z4YO8J3oE{LBE4@_FG9iVY*A>is)is}klKfxhkIq%p(m1$qCUX0UaHEH9=xKea|}4I zuBz-=dlLB`FT1}rhbTLuwBRScdPFE*LFkKUs z&QJl1J40oLsOvM-?zp%}TiITcQCWV=RXQrN-=CZE)s@UtA6N$m@8+?I*FtvjS;jmUX7*^^VC-``+Mi1k^#~W zW`6|c?3)GZ`%VKa8=)sX7fkP@s;y0Tf-IYWVgCMG0rt;R)ir!MEELOOA(q2WsnlYT z`iya+1xVuwNpLfsxkx?0XLc(MPID{^$Q64Ri)FDyEQ>U;EYh$nARJsx6U$;L29ZC! zgNCF#mIe5JEQ?Nbdl_4ub{Csi8{X->iC5FHHo(DSZM3A;8N5o542Wh}bz_#R3k>Jd z*|O*q`Z*s+GdzsUPKb+`X!%?pOE2=ZsnF&nsu7g3LhY!poMS8a%86Qum4jumY?aDV z0UxIHRaiiGR;kTUIwDG)R`Zn;znZNaT7n8EoDpd#j_Ump7FhV#9255?b2ZDP2O)YJ$0W)bWbqSTHmn)4tx?@f ztN8mitWhIeew@tTM@4H?4(NhPbxd>FD<~)v{n>Kg(bg%->Gn%Ngyo5NQN);uMaM&- z6Ef8vPY9h~WJ0tXN_R5VNQ9j_1GXn}baLR6VW%#ZbD|k$p6t6;4Sigdop5elA6gUJ zKfr!^t-6Ix*R1tSdPTC^23|~M;5+tM6kS-4oqc)^y_Tg;f_Ath3tK;tYHZ*?UB%CP z;%60poS{)RT3o0s9`RY%Hz2jsc#7YsvWV$98zHwB(1nfI`UO;dliJC!(uunGyct08 zn^b@2gUqDwNxu2}{V53-K*v{ZQaeEVT(U`RhoA6lwNcQgNnG0~K^}$5-;=5QB@5J8 z>K3&YeVnbFvTxB98l|tnRK>@&}TN0sD!}h;U2&xxaQ(Rn{reS%HIrS5$noqLwQ$z+RQZy z;ak)&m*g+FqZoDCqJ}hlylp^&NtWLo4d~@D8ZpcOvUQ945JPX<8y7?ex2gg7zj&(} z=M2)x-6xvX^rzmRV60)b|3tNjIf$mR-I@NhgIzyJg`cQ1G5CYFsn0(#_}t#Y2mhQM zgMWFO82mfi)FZ!N6CFcM)-k*Hr|JL$*4TfK7ns@m$PH(X#>1TKzqsK{@%v}^(}QVB zJD#lQ1oqd{z~>lIf5dj2G8DqzZ=*H;TVy3#A+VWOq+@9wK6} zaAZreI;wb3#_8DswD*vjh8-~EFsDb$7T*t|6^GSESo{TtIZ=9W7}D55iaCPPK^k&I zjmOH*JEFD-*_r~f15psdU}?2cQC_VWj-`U+bV4A`gD5S8N(*s{7Ni#O&OBYjJ2R|E9f{5yE>c?JwB)3E3Y+%bQ|cGsx!ayrnGe}V zry=4Dq=>K8GANw9&+ucq1r6=y7D8jrfZ>lN!bSX?J;P<*h_n1>i1^9C4^Hwnl-s^A zkjz1zrqpw)JKU2z&Z#VaU*mIX2ujb2(ui~Faa`{G6YFS*o1ELY6{l?wGYS4LZ@F(9A)$FmTiU(w#t1u3RL!%v$4o2Ry~zI2{1%m^= zA+`3TP{VZH##rkIwFJ9Tx~hf*-9LQ@b17_8u9Xrm#9URg3|qa(a-nyShbPMi>u>h7 zq)jI2N9da1RdygWh_?Nx_640_7!)Zr-$Z)gpVVVu_R4KUKfM*^9^wV z?P_Ua`Fv{x(lRnvO9a?=oaslMNU{e;Vf*H7@5Ze!hfA?48NcO6abe+pbiY)s?a5x#%<&qEZ1-&tbuGgyF3e-EXl(pm z0)JStC$uJ=ku-OgNneF?kNUo&`@=R^4J z3iF9@W(UIJpVj8Wul$W2cpM-~unrOxg=$gMrFpWuNdQBYC=QMVQ4{x7hU$LkKGbu4DBuB> zEJWG|Fc}*t^dVPuc7KQ}2HGP^S0AeFQL6ih--~+$(guVkPQ&8QX3!=kOExk9d$cm- zvIIuh1Q(q&z6pGdTG8LFhs}U`H7V4jF}BFw)TF`n>rM@OFK6vt1IYhwSB<4Oil&UT zHy}>BYOctFQ-|{Iu0=W_H;qYkU}|i>wGB9nW^TR_LPMrs_Xre;RV6-hM=Cz^Z8xp4 zzKfQ+X<;tg^8;9Yy7CGyT(%JyylKR#nO0ptp|RJ#sUTPn7bB+ z|8KZ!4WJ8Uz)X)HBJdF#ge3Isya<`3U8wnA^TShTx2!>h-FpPnuO3<`-K?(7Lkl^z z8V1l(Pi++bH~VPM;m5bz5C`M~b0CXb!87xyM@u?T@w9L=RrmgrPev|I>`J9RT7C1K zsa1B$)~V$?W!4nOPDycwr|T3U2z=+OF~4K=oqgd(p123PfST0rFruKEe-+%A=4?u8 z=9G229p!FH3PChsQB-3@6aKa-sj};XiMc)mXD9VHOo#64>TG}8jp)YGb9BGmL3j3T z{(NN1vXjDSn!m<0H+lXV(*96hPSRA0HmM(>3l-!F-Z_=XRWQia`P&Ys9E0V^ZHf!h z{&g>g#K*iCYP*Xvk47)2SoVX#S`Z^7mXjx$eB&9aF>_bkSEo?2WuIaRLBvqHX>6Nv>SEB8MY1zlA1!frhj1Y(I+LjQ23yzC7&i~tu@}PXQL}RcO|+(#)*p9bCY1S+ zw^?h2+kptiATaxLdPb6L)>!n^o(W|PlP8$UzU|>pN6p#-O#YjZ+Dstj+>F%BJc(c! zWjDCzPfemUe_jUqC@a6hsOmvVjMB_ZgW-h0Gv%}8{cvJHls4eA4eR&(0PRvceCIn7W#Uf6BKN z4JvifpwN0|*F}T6))QTNnuFl6!{S<9jWJ?QmX?%vHYiw(OXqr;YY6Mz_vMYDhK{Zz zQAxBG{FFdfGFZ6Q)PaRxjH`xWRvnuM?d&NQ zt>5p?y&ZG!Y5EtZ{V3Z?|Fa37f3F?$l`Efc?p~r_Y+(29tGz3E;t+)wpCFsiOs-0X zuCf&nf+eU2H}>O4@TGoQI~;N~<20+`pbN$Sv_FV!&#v}`5!hC=s+LsKN958J7C|&; zf{6e?g|(tuyUXrkw*qWUk5~9pV6E;J7rw{!SVuk1{SUxe-7P%yoo9g%>B5Z`76L*3 zle*Qc>27i3I!p#0R?V_#pGYzZ)e_4w=|(xOqXX#j^Vq>7snrV_1L52Gf|hJ}XrMm* zwKnXxxy3D%miN~}kj`~yf9(h4hhF`nHebrHw;!OvOFzRN{}SX6V+NCti&rWB_UxCn zQYTDZ#vm;QdlmK=Pp<&`)j?VfqjbvtV5pYvWVnZc9IiEGzXij!zEUaGdRUzO75`-_j0(0;C8Opq$Y$bDZ|yYDXzcW8Majn)6P~ zD4H``O9CYoi4N}Q@c4H`&MOX&f0p9LYQfI@QXEx=$G`Gt6CI#gj*qW5%kc3HXALA7 z76dukt(@rq?fy?P9sIOa&)B77Pw`9#NjzhhfTN0|%9#$35bPgiI)HXTWICXJ@hgnp zzaIB(P_0_)YA!gkt{?ZMNT)ge)K8O{afKy3uoWZvFT?{zI=-8jZsI?f^MIDUr|~fR zgs!t2x=*X5m6$BQYw!EM#`OdPKhQduPOLWh%&|qDttlY{^8?Kn<9zKp+0t%x#Zh0ep#l!&WXi-JYOD zi?OnsCu-5K?b*9qwLpV(fCecb$}j>bT21g+A!Hdp816y8EOs^eybbD6wz6*!-B3U_ z4%l0$S_esbg~n=HBm6AUwD#D7r!;LWhM>nJZ2j9Q0h7pNo7|ZQy5s9J<7CyIZ3hR<@vs6FoJ5}rE&S#ljtVbF9z%-?f*P2oB zRE+BJ)M+4<`>5YE?Rj@T)2v!UDjB&9J}}cXh8N+Lh%fI;afuppCCpCb^2H(X^Ian3 zVT5u{M_ZX!9W8wF1hsqboO%a#c6HrrD2 z%`O3ybR`csBX0xaG~>rUd?MSq@k~)L?d`XBO2S0qD@P@3!^PYUzzgc8VA}T6+7wLU z^R#Dln?O1?S&I%7u%)o8i%C4UO-y3@xmvB@gJI?VeU5V(aw zn!5`XzIMiw8ZW>}7E5gwKk_UmijOhs>Y}2{4b5b}e+KHJLC-d(+|3i47+oxve}+pE)^{I@e+@|rv%l=_ObgO9 zf3Ma1o%C=Nqa}4e+0(RPhOeQVy#j8b*;1VNTw4_6YC-y(NR!26i?=qFf@$7TJi9#2 zNl)Zxw9HGRPnK%Kj1Pc}N)b!7Alq}>>PfXcIEMya0Wd@&ul?9%+H7oh>BgxjEI_kO zvv{WNbh9+F6z&oJAY*J0ZysF=fX2O8J00R_u$-9b!0hp)lA>0D61?5MOBq8xeS*EH zce(~ffO|7Y^C^Bsy9gS(Lv$FycrBHG2%*CbDsUUyNEpcRQuFPGrh=jl{is3aLv?;6V*~9pYerb8=Y(cuo^WupMlk61m}+@%W6Jo z(D0ozq;Dg2WKy(q`Zjj*P{P_hUB&<4J49CRvZO^JhU9Gwwy%TJ^gBK@-9|LvqjFxUZ(F0poRJKWLM;F$KA>fdGQ!0iar+L!5l(fF$ zYgxJ>_O*_*Qn9JXG(=@~tvuCG<&Q=P>3{7}@u1$Zq_ z45rHtT=Gd0iNOSH?PHP;WQRYM7;M%yA^6PFNdikzJWV79eSx&zwBW_?Z@b;6QifQ?oVT6ByQs5Dx}o+!L*KeF2-hi&Ryk0T%MIlFY|R4 zIWe6PQR(3{Mnq%wf*-_@xL2ECo>kgLD8VY+ymnr110@&_tepH4Wt`I9!OMAo5icR- z-(9V{x$qbL!3ynJ=FjZGwoI#-R!SL-C$*q{4HA(b!I+;b2s=rR=HdiTT zQj%exM)6}3%f~fk=dw@$j^k2%;Lhn)IypbFtv$voF&ezLUD`Eyfn)+mn$M502qr!& z<#nM*EPL#cTEWCj@FJ2=ljwQiyZ9sUR_9RbD> zc|nxj${h)qnM-lWTX%wBshMA*$&fgeVuo`KHG`Z(>R{i% zM4_QJ&wtSR$<@36UTaJYU%m71lEpTetzMzv|J0z}~wqXH_5u>iKU z3kk-CiU}GusE}AtSA=Myi5UO)z1dxM88yae^825Yb388d=Djzs-1m8R-rUc~Q7ODMDc&Jl-`$nGTy+l%g`&t8!=V4R(Y|ot^nUxS?L8xz zD0uk9v`0-u&VZ~oE-e_0)A>g4*0A@)wC`n3CySg;AH$ZD(~$l1t6^Uy>hf%g9eDP9 z6A#sbk2+*^@Mys}LG+K)^jX9DL^7VLGNC&Z`s**@>c|Pu4@XXHE&i}*w<9lW)54^e zrh%!Lu2>!$k}b=lKyO|ibVv*IWPLQvOi>KVm6@c>T2F}Y@lZ}3tg=~Aj89hnA8oKZb1&jKTnQ9h z#8Rsb9yRz*gKqEJ)J`jNNVP+4-Z86gdUGZOn$=Cyu-ojQ?xUXGSz{J!@Bm~~-L%t= zxB3b)dH3-r9qCLPr`s%EN}Hxh3BKi@DSB0qW~e$v4)cG6w9C4eOsn=oJR-gS3pOvs zMwaM!%W3g`sTqo<8Rv9|1G9ynpfX&~HCnZ^GKBU}_6r{A(xuxP+P2Vl!A9fK?P0TO zBcW)!j(l7guOeRi);TJ_KUqyt;2( zo=xAc9f~%5L5#K&{tRQZgNZ%#B;jh;tb(WrCNPWV+n{@A*`*TB1r`mM!w(M4Q#>tu zsb%@i%QY=O)56WA+tZchimsJ^Ny<n{>{Z_`O1Z<2RE!+d)!%d*#1kmINwgxgWl^b7@*$Mx5eovJt-zod6~ z7+Sz+C#_Q>B1&O8nuE{iq9;MZQY)jH+G7YG^~kId7uz#*=b}NvqMWs{tZs$P1W|Q_ zCdK;$@VqbO}m(=2e0=eTbCifrydz|*z_-Y>$_v1m(bNhFx2+O zyu)D9Y9Z8F4rAOO4dCd0)r{$F5`FvvtLP-!>X^Pe{?SL@nca|2^$U8av@9CGQ|lGdFmGLVi0!9efIYg@ zPyaY;Ty0u8vdag0B`+M`%uR}cxwgSj=Bs^|VSiUa+3Ggk*xytTy+H_rY=7-}6y(Bz z`cYW3=OF$3TdE(XN%cCZYpi~ZIjN(LEaX|lK#dmlBWFyTWC%Sc*t1vGE7zx-mY^x! zs%Y$rEtd6}x5;Mu<&{m-;{A>kD+XysQFr+CQTOxi~8efC{puhu)F(PX~$vHYIXW!pm|#F z1=}y`e#F*Qdh^c_Epqd3Xni8;BdwMtQ6&o^wPY?UBekeTX0+APwV3*ho_x5EE9{Qn zO}nx7wnl3mefb6KydBo_Yr-g+_Aav)CQoS_1C^Imc2GH?iz662X^Cw=VTcfK^;h;P zdRe~5X1B!vGhQ?FAF($bpm0AP!Q5B%xNMhFz~r=e-@F5grs?+^X8ljAq4@H!b{*o2 z;o?|*5knf6|DwJh0!z-R!G0Mhi6+}!`w(`tV3f8M4t>YEws^`tN=qz6a_V)Bqyq6o z&+1CeyC{J<$Zn@?Lk%+g3cgbaV)a35IM9ImtNM2A28{Y6zqV0Cp;snMICWUjmy$zw ziwP}Y);Rt9w;cGt2Mk5uSqqN5FUe^Mn#^O07GFDJ0fsAwmGdU2#rrKjp%|_s6^(&m zj}vbJhP-3uagzatUYfL!BUOsZHdNjk1djbJ5LkP{tYQ;qM$8F{0W(f32Eq8#U%>za zV!%G)V($Sh{pu>~8O)OLi>4*`7F8=6pMBPLX-|8AOMBjFYY{P_5>1Quy>da(wDR-H zrTy9cTH0mR=A|v`Ue#pOsD|7hR*um=qpH8w4N`vS*9zK?)jA?-6u02XVKaJy#BU)l zYRN~MI1iB|nQVK*mZ^t8MW+6*6vfXkPa2FbYR9om5}cf;*RZ)v#(aGzbV0M?73~YG z-iT%j`UnTTk)Eb+p05w_tGMuO6TRpJq3(e_Z^$W4nsBG^FRn>1#>^nG zqu+yRJ#n0!{6Wy){4J3?eZjyD=3gS(S<;7mbJ(4Qo7Zqd>g(EUlGbsY_67WzH4b%W zY*M_NF2qf?eUTfMF&~{-f6Ct11c7p{UXx&Io z=50O#%0AF~VD^(A(Ckw`)NZ3zH}t9byLgP+y;@&_qtotVEjdeIUf_}c19R8vAGOR+ zXv2iZg6FzB3y$psRehqhOprzvmB7Xm1UNy>47=Cqdy!fCbgH=>eIRuVAE26tGqJ*; z?@D?!Dp4DalQk<*`zG0@ZzO47CS}fT(m#f;!7H`+;*tX&Zl;QV{$_f<6um`%2nT2? zuZ?2yqyq=&5zE*#6X@8q6X@8K3fda9_~l;X2VgBXMQs9(6n;$iyy62h^;+V`=dmK3 zrs0N7Mfz}t`Oa{>SpNli{s&*v8 zbho~bDlerwY}>7mF?FOf=F0y}yNFR4j_uJq5HYUWi(-slzDxCeu+YR({Xp^_-!5JI zBq@V}Ps;S(rzd49_v!KUBMFurz+UCT-UPl2f(G+GKguitC}q5(tGqyQIUH;PX>Pip zJHdyo6pZ;?>)X_{Ousc*>xEd0LHzf_@Z0Y|Da7#T2Yfd&q=+4paeyX%p`A}I(>_M! z_5v6`<}I+{E{E&naM%Lc_c8_0)Ic*UF~Yim2qc{$_*1?H8{s;Y z@1)Ak=nmXvp5jR5F>N4tWNST9G()n{;Fe5#B0osRk=`)83~hmjB=O_1L+ux8#}f<* z)$!hJ7{!qG4H$xdnlS|bL<}+PTcYhp-~s_D8s5y;;&k;nSt#3mw?_kpFDZB+;+%H;4?@-#YKIV!+Mj0AE;ktd8Q+Q=_|&b|Mw8(h(O;*5-JkJfT91Cl zzef;f#2o$&QdnK14T53owUK!G@JBjdMNc2909Ouv{Mn#QLQgo3+%>vRke9ntyAnKW zQ3y_K)H>t1zWF)dmBn)(99PaVF-~*kA^lw*(lK*+GNc_gYcDbf49&J^&(dein9ona zXMD0vOV)SX0)8U4YWo5neXD$D7+a*xB(0m8!;ip*9mwHh=!wqE67AO{_YQ4G{Bh3Z zTj0A)hg?1q>BAUa866F(glI^~<()m&|7_2FrQ)_`cv4#_%{TZ$_XHfs<@?fGTjX09 z00WvX;iK#;OT5t>V)zm&i)Bl2kq$SsUCJ{A)Y|9qLs>kDLh);ce$3>xLZv5UqUh+1 z#+w|2+|6`gmhlU)tJ%wVf^cPfv;$ST72V6ITP5~c| z-)8zALnoRx zgUM?UL{QDKz$a{4!(T@Mh(4t4k3W+SX+@lnsq1(Oq8%TR!l9o5M-5Mdjvx-16fn?i zXlPCQ4S%IIb-C>=t;tbKq%{V_%1|POamTcAD&uM!oNSG2DPhGl;WNF?;o`i2j(&B`@n_j?{#h%abAx_+_+BVCAMG(M9$Z(S&ym*^cY&^}TJtSj zSLR#2_gdD~TYLF!I8afg{A(uA8HlG*KkUPGfoBo{`zhQE-;W)~WwW0z$DhzzZC7&U zWCJbz%4p+9lu>y%mhnI1xy#9e{2)?I_Rm^^DD%JN38Gy1mhQWwzT;aXqOAW#n~zU6 z6#S~~#gfbyuW7enuIQsYL6Z26Qd>llSx0#-Zbe?5B(nS`9+Q{$-5`Bdrm{CFTuIgcF9o^4Pr{C21LFien3v4;gYgA>s8X-cj z6SPx9PmoR-s!#9~1umZChv61<0hsSb_`#UTQiO|9_IMPH=EF&q2uXMpV}l00s^p5Q z=;%~e@vH5g;p&i4{_4yA&_SgejB{K6BhTSa-=FwrEUPBUPG?!e#XsG7)!ae*xGXo% zqTLM*6i&AzezFbsz>l^?QzRmDCr&q#xf%yuD{>fW-oy@^;XB}( zyLpE9FsTtS5L?ZAk?+L)rN?j*S5}*=cnyX1t#iCJ$Ps(lP3H*687`i~AwX2?aDflU zcT0#HAU%wFqW*$KPi$dEH1$B~j=ET@+v{S}sC}WV)WxBTX`Kb&45%Lll4W25H}@Kz zfSaeM&J1n|coT6g2>N;H;w;lt;MFiq+@p7H*d3-xv~CzDvhvGJcq8qibH>lS5u1V7 z7Y?46`3|ZL2W$W^5IlW!M574x(Pa?7YL47YU~cd}hW);}p+qx8B>duDK=3U{3D!B| zgof5rB+RL&NO+^3B4KSa-B4B0cQ!~E3O)azqW{<*bOS#32i<_PZlczQ=WPlQOz$ON z%hQJnxZu*O1)}PG0b%v1>fwu|6YOP#9Wd)TiNLuD636z_`9c{h43u%YH;i~*>VZ-= zT_wo+1VZAT6d4lZB6O%~WZ0SRAR?OYJZ>kLHI1ou0zt&S_5wvjO)K3%<``UX5GW$H zb`*#LHri1jh*;?;5Jc?IM%R_a12`K*9N|p50%M$od3LDxE`z#>(&Lc5Qri(eb`jpj z)p5y1pzv7GR!87*rK>>T@w%%(UrXEs0*?lDlx`&vNyNuu!_;UUT4p0iCV2@2B>O%j z5RjbokkHm{0=E`fINAs#s&>{*K(N$!3(wKnUk_e=ap!S=Sa%K^`-zV*R8?JdE70sW zQ6f!_^A*U}RqHDdWl7UbH&8Y2bR%ed)L)=F{#K;;R`CPyLy$l;rAgg&6eF(((7rqx zC}7lANC^~BO{=!W#7BeZ_&gg#<{BpT(h*GD#X`TBpD89rz}cpP27B%lEcC;lM}mc? z%qz})x7AXKh26oz9l^j>y$O3yvb-wpF)gyDR*TGlScvcb763#EBbzQN0X^ZvP@xrz z=e=g^Lj}GAuC%HBbq&~8#_0(5y&fhI>?{00GHuzTU|hIB&hIb9=o$lHQMf>~yt)r1 zq6-H%7Y3Vk;i^neN*HU7+mT{(aGnHe(0yK{kFXq}x`ogZ`|R0LAZl#>VBKIVHI^`_^et%zH@6f*?Z$AY zSeWb`>JM)X(UC@KT45uf0B)+($XVbUt%MMVk=U!V*sj-yQ?6CWBf1dmQ88vFR_ax{ zx~Cy~s;eXPYAx($<{D1+=AI$%25B9TsW&N72vIMsB!;-*O}k;7SvziSC8X^~K1j&y zm?*Yh1;u?iLLEz+9YaVT{rhp9Jc}#^)L5V(BO@jRvifn6Bzs+3AqG*&9&(;QB3r?n z7+)+krk&79{liJ~V?40bzLR)HD-0n;;?iSC5hqI#dsvkoqsDUE(_=cRS6IrCr_DPF zOhybXx0NF;%ZTA3F>73u(8;4~o0Gms-h;4K5W=2&OtK(3QV^4113`ro$zH>$rMywFjIV~)bA zjzSP-i=G?PiCwV;PL?AF|KcEy-0C+ND;f@oov>ATd9tOn1GZ{m9u##FUSSqz451mg z&O)c4>*WsAl-eINTrvGk2J2Kg#6E?O`(y~M^MG7L{V>*fd0j(Kjq4!xVc`|_20D&= zgbv0*k|lqu{8$n$7BNw#FuEI47dX*m!*l*9hQ zmTojh;ZV#`eop@CPex?_Ij9@TO(s)WmmT9Bux1+_Zw6h#sklU+Ud%M|$MS8E@;LVb zKFRnv9k}*AglLc1rY@3tW^N@T>jP7J2qQ4tfgbd6aSLOjJ-#+|k7V1rMb6f{r|>vt zt6fOD_vvsh+B5sS>>Y<>n|q#x;!c7$lnv(wVe5PMLL3*M|Kb?p&7=c_Es4RmP4o58GQuezu{pyZCh?kGc0v!l#VRS&?Pa% z18X8ByZgW5}Uv{FgE0 zYHEx?uJU7O;rJ-b{?>AuA*ZX8Hw+yh5DIE3gguYmDMpRtNamR%xt93Dt)P#HZ?^<} zMUAA7=VeR+-O{%&SJzX4IK8pKHjh8G}9k3Qn$x38#*1FG14pmxzO2L&pia zz6_&-NfUL%3t-wryqs$&o2XmGusr%^`f02m1dkBX*zBE9R@yTdvd@W54%s{D2d`D< z#1M}e_&0Y1S|Ht*OWg^~pf=5rC@7gS#X)qeu*;2P(%`PDaZ{gwPbcF;aE5v540%TE z*l2&1n|d~Ee;eCS36*c_%Fv~I;XAsa7!jySlm^ieoPE-P%Xh?nj(8VMou7c(Ck2iU zcRs57D_w~;08EV-h5d}K5jD7D#?^=lw_VPhn)2$9gZPvXhSl_!q(-&{N$=_W8QxG; zBlcq8xo3o>2zLM3-`|D({iI(+!u9ww`}@R3_V@Dj9qsSm$9OUgJP2egP#%Pdu|Rnc zqRfMk84ET%2;>|5$AiEKRFqO?#e;xYovwkKeG|P56PL^wP3m?ei1*nOtsuVBt3C_f zK$|=$&`!p^uzyH%7#s7f8+lP6M zZF}^4ST|kQ%y2fDygU60*{!Aq!O3Kulfh#KzHQ5SoU)RNTQYvoc_x}~{hC!+fVQB9 z12c8~84OXaPC(`YnW?4#T2r9m>rCAs z#vz4RR|jPkPtoA3WbB%;u24B7#HS@j3_^3Q4aXIh_tigGEbj}B+F0Jpm(-AEaA>8e zU;}TY{G`S3e%En};r-g;AckI{;r;K^289)!QWVVmi4>%?kr`Fp@Vl4xJv6$cQF>Us z&Pmb7`&KL3sXyC|a7H2-uwQ_~ZnPnel%29^xqKM_lXmI`YmADjuACTXaq zZ~i;j0BZcg;`QWrR*cqEUQ)DsLye`wD~y&7lOU<|O75`l;>(JH^>v2Sg*yBKYfT*~ zv!;$Ly#JQys@hBDu|+qi%Y#_Ftc%o-^{f6>(ZHf#x>@r^K4-8;lrvIn#Ti-n;5j2} zFGJxN~)BSunC zHnTntRj&$W#*@jknx-XaHq7~KbSiD5x9TQrw zXn6K@OP4c$v*|MRA4QWA{1OutqEYcjS3_#BekT!LN}iDA_CsdT{TErbyxw|D<=K$a zknW^av@LU5x5nfND!L8C2`axP;>4o+PMpAqV^!;Pt<2(zwqZdeK{or;l!&GVH*oao zd4eF6I#H@MBUY97N~9Z*D|yZ}*OC=IJtA44rySjy$|NUhizZ*1z;?wfMada6Nl7ZP z`so%xAe1Z?FDW2w_)O7IV`?{et*w5ISz4_L6I*7PTTZ!l^vWcy#&ktZrE|#hskH9; z%#5`_mi!>g>%TyLP!)V`8E-OG z^qLO1K3mc3>IL1bsSnwVy$YFoMw$Ll{9x%180p0tbtwmkCXM$?U96bUT?@O(Oa`OO zWXQ}mivvXxdL@g4U&&HMKNm0QW;p1pedkV8hG!xA1gc`j2gGMU@}t)gT(zmWc=(3f zK4C7&DcOE}T-dcQ6^%Z!%(8~cm)g!Lxh8Y!tIJo6)P|K%<;btXj!-s((T2^SUv3^Y zN{^&hreWK#T2WPIVK-aig7H2O7gTfdEenzgD7hvp($~07F$Se;4KJM2Y43u%@Ty64 z|0(*yuGMCMpt~o%GT}q^MnyjoH*~Yv&zPCihM7r($yapum%OX0UuP>U`dS%)&OLi)nz4#l; za?dU?&!CJGEMC*)Uba^;V7fhxmb*1ap?s%#;N)GKUYbTucR*3sseQLz?|+MUj6vqXzqs5VG*e;D0rM2n0hBLI%iMTK(f-o%M$3H0gIngizBLPp ztk>WrUFF$F70pUKa=TSdxC-}UmDe9qu5vl;b;H4yd>ILsyRbEnM$M(rH(tVUKBsbAvpjOoGl6N;Mjp5feP-(4*V8})$VxHHKXMsA4B_S{wBlxWN6=s z#~{AzpjT&pnEji0+as$gLxX26i#nruLkZmM%zx>y&Jk~@fooRb17APP2Vwe&hxtj^ z=n-AyPQ2HJ@5tH}y5r$F^EF1T+1ibFK?QwRH$H+Xgp1wyG<<`Z+8s@x-h_SK`S;|8 z2WB0d)C!+9x(A=a{>Wqcu)QVhwsTSg+R_LZukkJ7aH=s3Aw${q_hN@_U5)&Ce3}YQt?`mA}mEfP{rj(uUdY9Z3)r^|1 zP{3=u{&jN70+{|hnl~G57%IkphoR!gz=6>`IiXR|RCd*My)#Y4DAQDmWtz&O+tXB3 zc^ZYFTM}4QTV{2G5Hx%vLw9=y3sQ6}43^@1WU#2nksXdPWhGKx#~mmvWrn+^ zu*@+ZZ&4ac@!z4bq^!CvjfLF0YZ{BHKAj3=@L%MyumzvPiQ{~4iyZ$Q8jI@Gyl!xl z@L6zb>3IK>JeJx2JdedFn|d2Veuf-3O^gsSYBcg>mMA0 zh0R_J`6b9akmvo+2rMdc?5M=P+c8+qLMkgbUb4YYP4PPy+g@jp$CvQ@Nx?p%S=jR!D_O8M#}WM}v3&lN|!@}aht`+#*k-{>FYKvY(TYPXt78Z|e ztpM>3JQfu>qg7zxpA%X3HsImia9GYPxgCeaeCKu?79-l%TR1ETOF6A{1P+xH7J5Ew z1BZXcVVOZWELdlLTOGm1+frDTn!(YE$AZNYy##`g_ex`7@f22xn73uIu)Dss#l^o& zVo}u}Y6OUP$zn0eEEeNG%VK$*ypacSSFyjTmLZW~o)5UEW6gD)LY!i*e z6pM$@SRnR=tUz->9_uiM7?9^b63Z<}EG{=FZ>1rahkSiU9?M6XQ+pIP-g9;nb8TuU zT=9+BIGnmYrdP7zkS1@x!p=K!pT*Am3fdzzHf@*F5`2vZ6(vi`3=>}y)(|`Ius6^J z!%3)o1G$w?z~nDO0$Ui*>@`KuJc565Doe0qM>$*=4NMI=Gb{XItaCpNe3TvHVnsnG zY`CPQA-UnR~yDK{)k` zOOxV#b%zzBwzeE&777=bi}1ljfx{kbo+t#f^#{!ZNG*rtOL+vtb{$nzl6}NtUO(rs z#k`&rRgr6Iu{`6rV)#z|U>W!$M{NeakkJPrkr(G8!MChZQ84eMq0ouA=cDA1m)JuM zybw3Yc?bJ}1o8VGS7hFC>wz_SSEXt3zH?3~8fp9yqCNDdV0r?!XESpTNU5+rdcDw@|m?lifazvNn#K}CBUAeiV zLq$cH=NSU&6Q#81bR;6Qh0;QO?$e}%0AsSE;4TRZ8hUC4^a4d!epk@&!bbEifzc5< zfU_VFm)!&dY&?f&>}*5A1T-x8t%A^a!53!<&Crp$ywE5A)N>4L?2FEvu#Y?ijRoBvcW@RsJ&b+|<4mm2vM_{a@-qXE&j%AEX zKeHKQO5vbM34UuoSB!CLW>2%taeAF-UgATcYbpY4?)_igDt(4!I4RQuFL5;EedZ~e zR{Diu|7>&`(s)rLg=Vn4o?F9>4D`8^+lW1b>)9$;&|i%>Qu4Vuh&hR91kp1E6KUpJ zwqm{tvdFO0<(fF(W|HxeOtNOhVnx4ZEV9g%KF4ORsJT5&N(ic4swh~rgcQ66y|u!8 z=v&gp*-$o5z_`G4ZTLXVeBp@I+GqvMvIOE^|BeeJdS{!)zWQ-(G)IRsWL0Ej3wDYv zkgkd?iyNj9!&lG!d*BY{x2xzAIBTUK@%xlHZa3N1fWzdTB<1Z1DZxutp%N9rtAuF;)4U4E$}{}0K$t=Ld%95QfoA_0?<5va>M_&_iAF#} zoaC>j-i-bE(Mu4)Y2*?U-REM)S)m1N z-zYqYNCo9vl|m?|CHSr=QFLI&*M{fM3v11*-mq;O`rW|RcDyJ|d;p8xtnWHPVzJOp zr7yOK8bxosB%jNkOkn$)W$ZdB%|HNytAVAMWeF0(U*$7MK-TH}o?;ESxu zcxwn~YJ~!V2(>6z7vX;;NP;p2SlLoyo?lArE1~n-)VNpi)Y3gfz<;raw0He5Ao0&a zHS-s zDnzp1VPJMOe;P*t#KIb2~AZs1`_Q z3O0=XK|pryMVR0yeg&J33pI9HM~;EQ(?igg(+QzX1G$Mf+`0R>E2q9S0~_Te;gtp0 zQjaNQch?asV0)a+JZzSEii(G+%=?xcSM+dkg&}FZU=xDrHX!yOLNH|?vlbPZi-cYg zv8M^X*D4i_J#x|pzX0*;d6;Sx3jZ+-D?e^4Jmi`PkFV~uVoEmr1i`h4wiZxwt!n@! zeU*8FsN#mPNl@c!x}jQ8OXk@>0i`+j2ugEKTR@4f19DAJ$=7&6G4Q454S(zrZq1VX zGq?eSo5kRJT`)d4$k|nGEk~5D#L%P!zwAqj-Xzx8APx+BT088);Z6MoTah8xRAkD3 zRp3ND#(Mb=sI(gZA~pfB@o_PE!eFLz&*(rbS55SNjl zFEhQ+lT<#e@)A3vU)~?RL`Be-aSw@i46gDQgT91X`{k^ANJP($7vT{faT2mrH~NT6 z$z{Bs_yYd)&lD|z8*JjeU@-YRx5?H$=q&=iG`DI64fq1tC&XsZe<<$`SN+8*(ulcY zC)E|45RX8SMr=4ZR}6vI0!56kVVDvq(ufUdK_Ur&QW+#J$M(-?DxM?lpVCZRBd12g z))t~WNL@s9z!oAl#cc>eL;-!dhJ=d5=lF-A;s^M1B~%>1;xUWoW^Bc=9K1lY&B>d^ z2-vP64}|?1kwk8JGfXVR?3!?~3tJ>YvsGdbNDUX=N%piNF%Yu0imrh{!~>YdP2+;T z@){2VF#w)vA$GND`NN)1ggJAe za_OKTjWg7p>8t@wOVQixOLY4TH|oulYbmztNPUTNVdnfKhJt$l`5&D#h0}mAB~8?% z%5XVLAb918;ZW34^r!WqXJ360H5Gx=Eyb3o7`wF+2hv;U+Lzoy&!dLXt;7LLcoKv4 zw3O>m?Y&B!4_~*YQhl|xEY&n_P#f9|Q~ZyqZSE{bcaZJKhI-<-NVyrU ztfh+j*B>zkWu|AOcohfujj>{X{CTG>&i`=3?`=hNL5&;Ki#PzA+KW%)-|8q)_OD-o z&Rb1QTpD%fCfbO4MhDRnIj4i%rnc5?BB70BNssR!R^t<=zk*Mn5G{5fYRidNM9TFz z8ZEX$8D~0*83>1l%ueEA($cpc7Ave|gGx1F|849dPDO$4(G{g?ILz)UPQjN@XY}M) z@G?sMI}^lCEGipICy2xrIpZxc6!vwaGF{P4oQrap(4ES3n;v3sw){A>|1omV$J=x5ONAWC&VxrdREG(zkRfjz~i-BnGvVp9x{$RN1!(-|j7 z?k=`~&}StlDCj9BVS79E60cx)TJ=Vz_Zl0*P;n(f&JW;1Fyb@sx@K1G#c~HSK&4F}={?aK+&D3WopYLWoCNluBQ%Q>iQnc0oJd?L_lgmJ#;d3S;vjr~ ze|LaLEc1*5MB-e!=Rgsot{4mh#nue7!%#U$T!E8im^no3$YSR0kBY<|?~}(w;t?|c zF>xkNRiB|Eak`&5RAfkt<~}YCWpN)r`*_0?jUGlD@a8a)IF5E7E|QoB&RmtL%|8qm z+p+Z*z!^v0+~!wDh}1#I9EPhO z4vXXP$+#=l#fc=)2JQOjC*&tTLAq{meG+4w;WRz=lsJ%?11V3T&q6KieM;;aF^s!p znrclDMH&Ya0Myc{Q9r}gHp$A~6UO*JkEg{)v69MUk;9)IPh&q#VJzJ1tOCHq!XwX! zcl0}b2Vd_$TU8Xt{cLJltUBHB*|VZIIXb{ir$6*d6`kSIbD|^qYQFlMNc>aBJTH#L+x>qO zhrs#g#bzkcPA`a!{Zl{rf=C?n3ooEdp&n2=N(@Im;L<3O#BpjdTC{{6aZj|0H4qE= zqwjfylB_C<Cg2ZZWe~jdl4$YS z@6KCQ9}874-E%tytBT?{!PL%3>vlE(>4KL#l+nK3lzRk5`jVw7Ym-2x-` z?Tvu^{<;W5#;Yie*rUqV#P3Ou5LmhcKz&_r0n{!~A>pkIFiI3vTPNcnqr2r~+y$S3smTZ< zGG@A5WZJ5n!rN*hUxNKli^I&|>9tFKvaG7$5bYvEune0`!E)qm87z}l4GD4o-g-o!YW6*Y&=ISO;5$KDsD_ta9;+`2|9=XIBg;=3;5bT(JaS$x3rY73nL!k`1-$YcRaN zR1BqB=w$}ft;9Cu&B@dMid-8@RZ)C}Io1Vx^O6rV%M+u_?@}ZW ziQ@2Vo=9S&1S}Irk|$335}){$Vau0@6$psWuAqpJxVerUm3eXv= z#ZR#%zH5jG>@aj)E6yP;+Pe<#eq{(;FCHglt{NyruiHQ&`s@Z#kMlZdBc2xwhkYBx z>-e*K6T#YiGLd6(pCGT%ByeT!W)TBd!lPU01l`;s_F+%0hQ3?zjKS*VIS6xZ+Dck$ z7`sh$Aj0_CcG|vm+r>Uqcs@t3{VQt_ z*_{Z;Qd29uK(kW($|X;3VgT+;*LUMfW@^eUWMuvx`MqHoaNmoA;nzLl3vT!xx7<{f z4~)ncqoCOlRA;~2i<|f%h%FTdqxk@oQu*=PN9SkEKDxnI?33l^#(pAXRDOb>pbTf_ zD>zk#FPynB^&pj@KHpLqdh1(J=e~yF45sI)gCHy&qeKLJCw3>A$9GhyhLxjGp^b)> zP(?uCAu8Q%4pGV4cSs~r$eg)taC0|;&iunf!^%*Im@7nmPs{cFp32#&?`1i=a6}|g z$Vy=Hw^%yvC~k4X;k~2yT(oVllCKEpc8r!Ea*US0cueeVTDw6oumU^v6-=qXG0BCJ z3b89zSqjA$7I}mExafirdG@gxUZeb>%W?6k#jyqr$ipE=l z0T100Oi~#D(UlEnPbiwf?kZCdPK^VH#y3_{8V=2>$OstPSE1602#N1Huh>sxxI=7K zPA?7P3)_Db-B9H${ZVWjwkGr^vX#RVKZ#LJG!P|;uTxy`2WrGWi6nH*uAjtkj8Nmu z{lKC}#0lO_n{c-avoi)lPKg8UQXDYGLfBNv4?aF6I#YZ;!Gf311aFTfoVA%FtT=@V z#7NkCN~Do)&f+C~R3!^x(RDN!PG!xLFB$mL__oV@Ze!;y86wY$`3yVve%X1qhW6*h z&*jJk4h@kDn!?5ND0*m4cR{QoPrG-E?_d~q?h1Mfzi2ux#6SiW$!-|F^S%c%_=%ij z&=>~)867__48_^2`{O`!b`6)-SQ~!VuKmyOyX&nCzpvXGenaUEc}{L;d;gK9 ze7VB(SofvH>bn$8vSf$m)YgVxnXJAu^A+Z~wJR;g$ETLt7$4J5;xs8iQ?Xi6aBU$e zNWDYnp`BKPKXcjMR8EWcyRu%<*2U|(5_kOL7^cR`6Ms59F(&ybVv2FYLI08?HQF<- zHg|n2}_d_ ze2a<|1v87Rt*?8-@B5}|tmdcmJ)gXKb?`Ym@JInud1mI~0wq_}YNh*Dc5? z6k1-VGxiuFR9z!`=r6JI(7*InhS!zL(ck=iGq)})wlTM+Uqlpc-!^w-bq zfm2FlVb^qOZw=}N8F;2Ge}AS)qcpnNrh*NA`YY2&L2A@|Bn75;R2_ zih}dfNkJ;sb7n*Qn|iaGep#&Lw0Ph0xr(;xK8FH-eJu*LwS)e$44Y=ly{2iSG^q;| zl^Exd$5Rb$=HLYp~YmbqU5PX zhLm8LKtLVz%hLNHllK4ww<5=8G$|v6CdK=eHX@u2!zHOkc$c>*=F`85o+Bpjo>{QE<*`Qjm&jYJtt*qLc+OG%4P<$e?KJm38oH zTYWW3sQ`Y$sHgrK8&CbI zW!6JRc90;3CXMnf`d(30_F;qOaXk_SPD97|Hmk8p&W#_8G2LUQ>IdLK{XtJ>f5`r& zEfQnw@c8;R*08Bpr)gm7@+UkX#htfj=arilr-`UlP8X-&m1Bw_C_mc6FzOt}sA7Lt zLDhL(FZMV5eYuSv#A@}!uu(;7{tUi@qp9mSY}-HOqrdEXhfyc3Gf z=#Sg%YniTI>QKe|umdYO1&idCOB$)j4^MBt@|ArIh zbx(2WM8mqzx^yOjv4;bF3tU1L=SLuPxez$#cIEEhmxbX4bqYq|l^M zewpVK9lUn-uGjqobJ~C9v{Gi|w0G^w{8=}s^YlkI+%I~yhDk+SK(3A#3_2t^?MN7WjzgBrs$iy@4CJpd9eL4G~L?k`@x7wnin}I z*|f!;8aALUR}-!x|DY+`E_|&j>gea{$T?Gs7)JdP#3twiSz|sFS0#0V`3ZU_*PSOd zTvzpz*en;Q`u2b~e4U{8XU@V83HqqWDV$rQ2e8~O`hX@@k777d?_+)|O@b?a1jFTzy|Z z0>>bm8Rrk9KhQ_Ik%5>i4+Nf+^}gv1OFz&DwfgC>qk1goEw_!OoyVv6(5Ey(#=(ze zD*S3O5)MAp!9PfGF6YSklAIX*I_HCPzK~dId>Wz$zv==rKh$fQqhOaB6=J#Kf(797 z&e<$jd266)@xDiD6-#2qrA7#E9h{*8!*N-y4Z2y-r01f1Nk_6*MqoHm4WmIWr(IXp zjx4(wR}{}M{(MX5|64H|*y>s{^waosOf7}}fTF94!O8v=2M2P_e2i~arf3x_BcRxE z_6Wn+bGlnoAQU^ogAU^`?~3)JHf?7#Ey4H7?}|Q^|7N=bEPil1K-pELK*?$GetCZ= zTBg5oi!Fc#akvj#fbP0^3!obje#paj7FqRMIY#@8sv!BEEsyWIr~xgHx3c*C{Ny~n zhIv0@zP=OM8m)LmtFSrVJYRo5ZI1n|K0Fw>!Td`^;ZFLHZw|Y&5YdMlQeW3*leCWG zv@hV#tZ~{~8y;tj*WR&RwuTM2usaU6Y6<;1XP7@;i=QxRs7rqq4>O)$tfxkpN$FZ| z_;Rs65I=MDnW*(6Um}0V#nvu>BxhZB7(1MwjJu8_hOnp`^0Bw!{1W|>EGi9sm+6Dp zRtuOL-kNqdLK!vwg)oDEvh+`u{HdaUs=^<}aM3BgFiGJ3Amw-7(NORt??k?*Y+9lJ z0KXe~LE&b-FAQC&e+ysvHm}r^6PA=I=rnaWe%aLzP#sC>aksww=gdZf(0lUbUxK64 z?qe;nvu0l4F$D6zM`Yv4evv{Plb+?|Huwx_w@;N;JGcA65Hyqoer(e{o_M#jQ zgAS#7Vgx#|R6kIancL%TJomp3r3vWAd>JtB^A-z5`1F0=(bZ&xl#pgUQ! z*sjwtpKC1!NZ*?5HbblzDmCRU7$}7p9{qstM#dDuqrr23jqJI<=Kq4{{u=7JUsayh z1GvjPk;zWt498cw%JGHQgZ9=z4Yrg zQwjX5UiwuVw)KFM$N63a`l)06zvZUiSlr{^bJPDm^jS?&b+U`pfU1{P^NwZ~O8sj7 zj&||3fLivQ)>keW2b0(E-t6fMV8Kw>w1&TqA`pE@+aG@>AJP)*?y2i|q{E;FW^vPx zM}QC7O@9q_)33_jVFQ+p{Pd4v;pPdg1Gen}I_t+H$l|A^yLQ%JQF<%PyPdQCi`aJR zr@!W|{Pds7l2;aYfv&9DJq;_%eCu|8`YG;M{Pgp8@Y6r9yb-wE!cTv$?5CgqGe7<4 zXQ;;Hq8|_P{-TS1JTt_R|NAcbRk|M<;lVxo=-+Un5f=QpkNz6jM}N(~?W4a7uPBP)Se+NJP)wPY_@X!48FP8oE^MC56emXlUsZOs5ib69AN{)PjR5g3ee~DJKKg6^Ss(rQ_HRMI#@_i^axmPWz7v|t z)c!gTa^`}kIx$ej>AaAp@_Lv+n0$pFNYBc5M!~pn>YM3OjIJ@0uP9s~7Oiz3N<V z;qlL;i8`|@8)mMdY@%)z!!EmD2EDsvTV5P-jhp%ed^%az7lkN?m(Gx9+`AbsN975P zcYoab03A06Kv}Xhlr?UHq?K;r4#sT_Bc5#j_n|sn`j%lKHKv0mE2XkE z5C-4h8^r%S&=0oFMRoKFT%Id+K+0wFFQhhhSt`yGa;9hcz{_7q0-okO;E{X$ zl*fGFQ1Xy&&~u*DI(P*4km=cGfYCJ3*yG1Tu51l-EPN(J?M)hjS7g0l4c?FxFf0Tv zJw4Cqjh8teOJNzDN--O^cq#e%$d!=4^^3^glsRYmekxZL$N5@{nt+Yur`~5@4`WOP z{OGgsOsdy>siy;(qpFke(R}IE;9*>VT;4-&H-5(rw2bPF`BE(!qSY*rhG5L3u2~YY zi(r42B=~;g&S~UwuBK__j-1S@>JrR^sKe;Pj+``gGz{uum;1o-Y^h(nY)r(D&Sfeb zfN;6ITad;f%+A!#<_$&Tz%NG{;Y3TgBK2-!jx>`w57%>~*YJe!rG-*4w!O7Y-?8n~ zZ3upQ9%ksjND5|{Zw#XrOPv_DxD?WIr6~M7Qj{wN(J73Ay4iz$pzPHe7nsy}t_wIW zksd>F>j1IG1_i>zB@)>JW-XE0B00~2>j-hbA>HW1k#jxZ)DkJc%EvV!=s7QyqH%Zc zxfDyGQ_$R>{WJbIz#hg;NcDl~OC_I1*;in8)mW}8stWPQ4IR%;_eBr8Tnf$lcz%f2-{Sip}&Z`~Xid!@w2!Fzs zsfR!mJT?;AFPB=~eR1Nrh`ksDb&HbYvc~cuj4O;f>KXtiS4ac#I|4T#z|S5X&EWHx zHXc5hQrssX7$&Wh=Hm3Yu9Cu3wTrvL!Kvz|@YpKJ6DN!KU8eEVC*@1_pk5={!KQBp zsXb2BvTaB_6*Oevj@LrwD(NNkL0!K};;^-S^XWv}BYv3626~jAv!f+Q?2-NF0P>}G z*m@S+3Zzwz$LrLbqxv~y8A+iY8-G`GZtCa49h-)^xN5R;rrDw0MCd1v*h9aj)191U z5?W?0`M1r8czB?v{4bKKpo-RI}8#qZ2lMOEq*_BRz)s zKUpJ@*~(lawF#bE%eHTVZXe0Bon`Njc;$sxpVh+gHPR!D1TEJ}uVem{wY1omYq64H z@XK21ILezZL}xzY1Dispd-}?l(F9SN;6?p$73Zh^6g<}Bs6K%+;tz2z9`k`#1}WS( zfFcGE)V<@4BxOMfJE*eI_+uQO@mAok&jfpFr}WDodZBh_0DE}2%rBJn2ajg$xn6Y(Zz zSVkl>8R`tv{Nb6K@@F#AoWT6;25Q-7Yok5d_;N%wM5!x(`$B#2*r=e{ zwDSeyR}#@gu6`xGiJSMUUrRHXXW{bKQYwqPF!d`%-2$6-VGLm>MNWO0bFl0pf4=!T zagJ1A=sq6DIa-R|Zu51LwG_IGYZx!43CfPiYz((P`>?D_{lXb%Sl}|x9p2m_d3epb zL3U>c?i$LQmtzyo8TzL`UTAO?R1dv-`&7&hY@X)wBh8S;%(jJA=^JEc|3Y}l|< z`knnf3D)kCqU_eNsI$bbuJwhRgGV|#t7)TAy8_qU(q!D_yrAk3u5``2i~71caSzdD zLY(tg?541Ab+^yOTME& zwNJ_<4up`F``hEbV0S>OVZMRO2c+R>^&L}&n6na=mq|P`209*;Leb$;+(GGcOuTSV z%CXz+z=c8lYvX+(_gkq13y%9vdKtHa1K&wQDcnRr-NG<$=x`&~9*$K>Uhqh{q_)~r ziJjgn<qGll0;^WVf`U#iydCRa|~Ou2EIBbMW8Wm^o^Rpj31*G=ld3-1G__itzrTdW+68$2qJ%Kt!I;=e*UBQ7x zU14u$Z`gKHYJ*qZzN?aCCKw_12hv*(oT;B#@+*TzGv>I!o?|A+wb!s)1D>8kDXJpWJLbqPBDB+ev zH4>Ee;;fv_?HKetunKZ=G*8dYzV2wK_)+T4FsrR!wApLzVQfi%Y;UleD`<|ohC$KC z9a}?c;y8OKYg%CkmrhF~5wg6(W}=Q`(Hug$UBRQ#8Ggori#SyYN@mD z#&Q?au5QOU^lajfTkyJa$f%ZHv|G%gis4x;b?ro<0r!VtW?b+zPd8@2vRhF@?QT*- zC}__~14uPaw3>|bR7G$;FGW#3z{S$qKr4-hAsWw=^U}+tperrt>PE+&Jl_pstEHAO z=mH*fqfKCZ2h?7$yY}$W18EvV2a1vr|tASg3R#4j0p zkq*efi&CUTc_EJ8P>Mg_JsY_C{$HIB?PUop{=4Q`>&n`*Nvh{Xw@siXTvxL>+ zyX1<~@MNv@408s)tfl*(OPv&iE2b%U9Y=P3&pO=E(OX2FGzwoJn#uUBHog2fa3ORE z$?IZe9qFtg{AUS0fDeZbm!NB0`t2OjjWyA7iXyYRnm|W{2pnL>X>>O z^#FWf7;{ZlSJFOi?Zc|aK~z_FxrStM9uSVWlNAJZylC6Kn`4Iy0oaGrv6Qe z@gVKng`5=ZJ89t9-{@m!{DzMe*FQubyXrUjvCOBf1L$+Q!NGUG41hm=lUhDR%I~(6 z$DVbEzU4XoFzk29m1gb%aX)ChVbbqXTl%m)mdvmW(^^gBddXvCh3A-kov_ zu-4u%xy?+f!98?cYJnPD_v=)HL$vdEv$k4>uxpYxq+G{kIT13iOTn&lw$jnVN{Sl5 z4K=>EVeGut?(j^#l#e14e__EfyWSkCd)%c|i@F!~?M$NXS@EoMzKHZ@)v%m_K= zRxH$AN{xi9Cl&<;(WqQ;W*w#B_|k}K;UDOK(zuo$zaU!$Uy*(_sgP8S7~c#lIeo#E3L;Cq565lj5?x#3+U+nTbCg zZl|e7Qg~O^4TrD-AK8^9Z!M`<6wRXXFVs>eUp?H$@yPF9R7=gddf1=E*ltNrHV=W? zh%YRU>351eCcQQ}Ac#IVj`Nb|s-bats2`JJ{h4G3hdjbX#{o%i8xC(W$xh54P9C8U`x|(p}}X% z8oVWp5slA8E0r~OaC1uDiARWW;mMKA=&ac9TQVq*H9t5*OXp;cc>|ao7&Rk1CePW< zQJst7+!GG^zyjxFS2Ro>(feQk6!lJ?hT476Gsz3cT8l{TLi*d(HTfMpA4+jeeipx> zox>~AmCl_$9|>) z_~Ir@I-^d=7=Xg@9%u$6Pr;30QQ>}=e;{)DBMe@m;n@J|`jhQKKUHbN4_~ zpX8S@W1SV2@p0<+wA>VARg+at!vo%C}{}XyX48JeP z1vPBy-VflD04qsZ(9j>XHVyq{txZG!G|1RCGeA=0r9=OdQs}S5&>sdK)#I8E_ETl9 zn^+m2A;$k^qJok2pq~Ln4XyF0Hrya@p49^Sp;jN=jTDM5RifHC1(IW}&*5%=2@I$c zYNcR6$(+@--JObyU;(BZ;$v!PjR?0wt=+Y>%s53TrHg1JFKv^R(e3odlu=GPylkW`0|2xtf`0oGTI9ouX%W1taL6yo|V1XGa!g=Do3^5-ddW@v|^wY zBbECTeH6E+LjUeoRtaP47{`SWKzaBV)G$p%^}(ax@iQ!vATiXRoPp zQvM;DYQZ6|Kd-6C&i})j>gwyxQ0z}-VgE5s)D5Q-MN_lVcgot@5S{iWn1@-5 zo)msn=~EfF_GpM179?9oDPO`YMc$OTMyN8{+Mcn(kkQsu1ay8GZ5_zG3!UGzc2R$t zAApd>qBpG_F?9XuO>1=o1BwpM8;E(MZo1s}-?C~6G~e~kPbR1*SV^mYnho0aw)Jhr ztVfXeiVzMHmRTEwTuoI{aKeZ{4uTWG_<`Vr2|q5SLaVLTI3z|0Tdjl`k)7U-bk9Jh z*)}UuBWy*3A{hgW+-42N!&|&Kj&Onk1q8$(?IcT2T0GD*-_A8VomQW?L|=7Vi@b$H!ScbmTZYD>)9t@3fLs zLFMsykToAmn0@Q<2zy}?4{`2SVcU4?R=iCLY7o4Zgd;LkOT&?eQaD04l?FBDNa4s6 z_zWdmw;}c!Iaj5dJ;RC4rq6(ag0Gw7lR!>`5pon(oUi-IHo}AWD}aW_^)gZ11@Z=CEu~`YpH#*B2q(C7ks*-7jebcR@aJ{#fVeP9x|35n0nu1?9WLt;A z6f5FP=WtxG^+j0*7|uEp50K1RYoZJ?V|>hTW@jfil!t^VZ*$-3^`EvMOe+mZvCzu+zzgrR|in&DZaj`RN_gH@>bk5XK=ZvssFQ$73 z!0^bGL2ziVb)>hV5;F1SN-iC+15%AJZfhsWD;vJg+CuU3YFM++8dc*bhE+*H2vV@f zU{iM~ps^R2$bWErB%z^aW!%hdeqc&)?r96t&Y@Wt3PPY z<3-2ihM%`~RTKa9XDi`i)q;%q-2)(4Nb~ll6Izj>flPB>1?>2l-oP(EJ6@&*I$g4Q zkvA$6oV@IBw2u9pxG3sK*W=}QqZau55`EOCF45Pj`^CC6VhAbZkbg<)PNdN#xH#(5 zXQaYmv`2oScYN~~t4)C+S3@Y;-`(hjy&bhIc^7#9VcxOy*Z4eX#IsmB_j?Kf{X9S!|BR3 z_hVu4BkKre>TF+*P{Fg)+mTuUwn=~qqQdhdJh9e_-U|-lf|4FX46}>4k=i0GgivB3 zL~n+R#9P7oiS5-5u)f*h+P3$W*JPS8y=?mLYcdfSNro#p)_clPHS5dn*(_1rMk+WA z9c|h8i(u`J(^5)2=Ck;~;4<@BG^{thcS;;9!2{{OE>W{98TQwoq$9OfauLd955r)P zlB=rPPZ-SwrnC@PspRy?v=1M7j>e-I9mPZ_{6eFHwknQf+I>6o$6>9S3&x;6W8#4T zO1LM4qERO%ma7sOA`I$l#edrDdlW`!uuy9pw7=1-H@G?clM%#oh8F1&YkVNspw%d z9lWV*El22C`?Q>$o&}e*9Dy3LhRv)1J1fDBi=et6Sx~kVWj!VUEQWdYpv%Hv2nvxj zWJv^EcH`WA&fHKErfVevT6}*)XQJdk;xDknJB-8^8ajx*!RS3`ljyAclQxY-z) z5BA}fBK_T4&rJ>=8?Lgm__aY6Rk)TK8I9cP)lHuYAL}_X40xF@H&u0sFmw~bwi=*~ zA7{Y>(^^9lyywS_#+tS(eq2+{R0SSV2N`{48i6%%xO;(9MBJm9Znk<f@73F>;L%9LRF(<`4UgoEK7lR9N1VaeQq6+%j_2%h0)N znK)9umIJZKzcz91>fZSC0NBt_XR7>|*itqeX=07P351Lok1{Nxgq11%psqjn1zra& zIm@Y%6b@l#j=bQEtFvgWS#|)2JX~9PU;t7K;}$WYOb6I+#@G0V`=BD!w#5+#O1)w; zmN9r$4}u8|Dam-vqD}*`@2!TV1NYdPxTWBHWK}qRCteTvVb#@{`-61Q zFo=7p`jLCFgv8`wA>CbZ!Jl?1-byhxWBhR2(etn|h~6EC%w!tsxqgBX~CQ;!O~MJCy58YR%lpX&QM-eTT6~ z4Qoh>PCsXWc9l6JqPA*8AQLXuK>}@MF3^RBO{>bFGS>|WO_wU8ZixeR7`F(Q(b6!k zp6C2yZtPJkw!&I1oA2}p#-AXDxCqqP+mcpXZMSfh1L=Z9b54F8!2Yr+l+=RZZ+uC` zl>rhhT!`aHq-?8o%3eEf8UalN)Lslw10JcmH#tI}{Rr@@g{zAk-SBXZR9RUHz3o`! zXh@HppocTzTsrEYXI@~1F{j1n)G4K0Xo$FcfGhScLde*JN3B1SRhqckHZ2f@Q>!c!HuV)IUGTlTQvq{2EQiM$FCpe z&Z*DgH0_t*bOZdlKDSy!&cGn0Qr4}0axs9Lq+Bt;i-R7q_)8nik44{RDtsHuMN10X z2)^SIaAaR2?kXz#M~yfh^*P^|8^IL9y~bRc3K&$Q3?!RiNfWMtYCeM+Gj-T96I^S; z1!-0?s6vB)9gN4=-Ifc4X3ufq=ye7|`t{Z(TUdaC(aJ>yDbI0jbhGcfu@5V;8CFjk zcIH3FRYxc6Ht4VzKJFsK<9Mr}ehvX4P(7oOFO!)$^rre960F3E4k)%GRV*MeP?q9B)tw^jpu zTcExRYtH$3-rny^=;M{x6Z@fgbB<-chw;t1+S++vYA`VA4LQv@D$;wKbFJ~|d9~nH zpgH@r1+{7sExE7Av#bO0g-uKlrU>u?k5*h2W?$%(X@td1I3x6I%UQ@P z!v?(GIunR(xd`l3wV^G(<&)5|9Y+Y2W7}~pNU>ED$a`ZCK8ALjr(#A5oN9;e$3_Lj zH>xMMHBezaR>>C$Mrhfd8-)HwGvaRq!uIwYp>v*Y&-KD3*ur7nXo9sD@ZVru(N$EwV8>XxH#qQyRnedi6b25r2bz1P}qqJ(h0>~lUow**w5-A~Xe>DsCS>W2^-N_+2w#%n?rbQbt|WnIm<`Q7>{esD;wnlE&9X zA9d7=k6Y83FLEPEy^=DHv(=TWwu8e}UW_NJVlgJGN$sKA&*osrJh9 zp~(!_x^iKl@5;GZ(7lu1B33fX_bCNBQt_F$d}r}p@y?v}Oe#{(G`cJI3ds=az9u$~!Ve6ZTl*2hG85?C3Z7~_ z3i>K|6od09kCm0bl0Y4RPZPKoQLIdm%+B|Rpl)2<%5ki}bYspJXr>Z{8j>|b(byC- zr2k+Fg?ZgL58O8ZGOBv}!`5!x0@P_ikQbvhd$?3}Css{2+diFA57Vp5yK`o5qCKjx z2ewGj-`?(A?JC3V6At_iIxreoKKI7Ci^oQk)VtD*_(A%r(Ph^=wLT zSZLi(3O{Kb&K2s0QMc<))!~eV<^8!O=y)VHFYTicF^@MTTm z(8ImTd&1V#wqAHlEi(izMy}>RtqTOwjrj4p|R!aR!f>N=Sc&>t-nam<%h?TimfZqS6iVt;u&W zIOeLr2TOQ=w};;Km7BzeG5QwjG9W-Zr!virg zPTR({f}q#%TyZe`XqX)HWWR%Zot1kJU>yj1;xsVJcq7bw4Q<*~*zg+1qSki~Ns+Z7 zjZ0|Mls*=ZaObq-T$A(OI1S-DxN49*2>rk_kTr;tTJ{w5u4;gnKH?L}1Im7$_g_Bp zb&l~kb~jf4H8J8|koqNOfqTn&J*<3#tB3l=8(OU3!(sc8k2GFn#=MNtDuMY7Ykvo< z;5AC(*=?AM#=rOh?*_KBDb--;V6G*)R4I)MvF*xWE>d^vf|}jOuorGf^lA=l#MICG%8f)&?DU{}$DT2vq9NLpXcn7W{&t1)%z(pyLyj^&am+I=2SihF7&O$%{k*Q>!cUB8-!a1Wh#ljQNCut(?UZ#NrfS2#{ta)(cyfdIbQ?B(Oh@3T=dtH{b7-fi^+|AlT$E~Kqcgke+vOZya6gl z>)$4F1PR`aLf}-3fMBS15@qSp+vUkp`W;D@rj6nJBUbKGvfe05c6>?hUg9R#n>&PS z<#AscL6Swj^f){igU;h#X#5V>1tmmX+N`><8luCggp?;^XWrqutIoKyTFAcL#SB^7 z(eoHKmKymHwrp8A%M+~wV-Xvg3e3B%QnhafHw_eYeoS6q<0G*5_N#!l(!`W06#^Mg{tV+pW#mQb*=7+qTH5Tn{^NqBsF4KG)C z&@qLaDrzkZ7{}ehcSD5-7d{mp8H^>u1M&TAf%f(8Dmu8{%Ml$EKPozQYlfnOuxjxz zC#>o!Gbnz4qs)MAl4PO?T7!W^0n2=mHI+=V7}o4A$=;>z(Bvt%9<`kJ=PH-?a!7qAOw4rbp2?v zUQ2r&;P!-SJWhM?;yWwSWfURZ1x3I%nuN4WH7L*D#3Y%R97I{yKV-OV2r zy%m0{!PkPlGq{?l5t0hHL9nPM9|Kk^hPAlttQf!}NzT81C&*94WQN6DUkfANYwHQ8 zqP(gA$01aUn&b`NR=Fd24kx#Cfy;h8QFqBj@r|K%ZItex1g?j}QhG?1(t|zu8*~x5 z=d^d`E3pC8haid+WVhV8fCfQCyv%7P8Db`X61fg&sp_S1UGR+K(cd#ch zoY;&2f8$T#WWqAUtWG~zJLGj!ZgeK6A}^4sopXx$6gH%0R-*&T0is#BWTg z0>z^YTDaYl_k%`@5ueM+T*BQW$6>y`i|9aaekG~3HfyK+XdhYj( zO5X{p@rn;1`C?XE$dB_5gEq@K4&Qa^=$$6W$>51mW;IV=m;}BLi6jqG!-Pjek zAaN$&9*(Wx3~tL8C|O-8x7IGSYPi~$H|m5>HFEPehMo2)==<>jI{uKBw9Zm=M7x}J z2$ENFO_@EgW+mcNabW4)9_Ivp$aiq3T99@lIX;>v9+kz!yZXLVxL2=2hvSSpWYj?) zc-)&jf$7=RR3Q|_RHN!c4gHLGB~F)@3U%Y=5&f&EhPH$jbP+kcq7YcaKb@V-DXX_0R zIu?)d(K@at9`yb?t`2@guIH-aM@%h0>i?=T>+>qm&*iH@enB-vse<@0$Z1;QrlR>- z^l8nI62w~qHoaJuZg}*2+>1BXcBRFX1p+3dIJl2p``wGUgc8 zQe!Shv?autKa`BQtPfm`IqHMI)0i*(%teTQu8Xj6~G<<}J?1@`)aCdsx4f^Kr+3*546S#Q5{tW!*OU#x|zlFjDAAHHZj*+An zB)`vv!@%C6M(Kg(*5@lKImugpkt0X+eP1PHh>_=L&}e~6UvVCG19<)xb$QXa`NDve zd}yrQDVC#0d*fI~3oR+OBnX!rP~xrzhg~FqE%A#@B(i*lqVz8`iyjwChm^2>k0fD; z;QU4RcuAn-9)Gf*tF1zJcsFeG7t?g<%^FuWz90nie$bdTP;hsFqnbASAg=R$&AoLi7pNS=X zRcS3utM53gLs&f}!|BPU+<=qcxp=uDN4W^are)CjC>L5k{W9t5vx7lIS^DP|=RY^u zTMA44)G)q9I9UnVZ*<2Zpa-4Qu>2_JuRA0|IvTVR`%c5&qiA?`LiqPwTfF8$-*Xd~ z?eOFG+$fBFW#)|BDGgaxQfpP>)+Qh0dgCwTrq0e^NMJqrMf|vqCb)BqtBby=CxpAl zVS4-rt`qJgL-5|EA$V%Rm;8WQssN7uz}2Ct2JG$ZxO&TR&Zw7s_6SWQY%EI+d%NS9 zKFo#WcD#ilb$dn zp1?H7PFQ_{>xZtj8hz%NTQe{Va+VACmph_SvwNcw`|Se{ngr~75~I5HU_HrA#+0Vd zDQ*nD`l+Y5;rNVioZ?2|6HngTnI!X5PIJ8x#1E0s2Bgu+i#Sw5jM4KCg&4Qa2J%F! zL)|mf^KX0xbDaeYUQ3vKyJxt1c(9x^Tn2_4Z3?+>R4=!WaB~D49?-6ci&D?JNi^u& zMciBHid-tf^l2}MIm<=R+rsIzJIx08&snZ61=y_EKIWlxJIl{v$g+D+80G}mYmh~l z+@~RFkX(ZzBGeU0j`+w3TMl)01IszC7FDyi9FGI9vnCXz4>ZEabI24}2kGZHsgqeG z?PLa)*DqCvYv(vO-v_ybwsts!#2$p9P#Xrme#rtg&vRZ#g^4{+GoETpIg$=&QpR)C zdCsI9h}|IB?Tazj@$qhrn@oYIC-pC*FDhC_;E8|q$Z=(G|2)2^wNU#F^D5f^ly+Co4;TO1ecKosEmh^bGU%+Q80Vl;5IA`djW}kC3 zq^M{GYYwJ>3D^CvFRg$>?1Doo96k;ve4wm8V(u&0R_7(_Re z6S+^{B9$9opT`r*-7|{KZp;4MZHc2t{5i!51(Xcq%o@5a0bCuri+`^}x9EzCL-$jK z96F#;nfe;H)rro;T;;2SM=|Oanjnb6PTw*}a~!Fco_qs1R?PJyR;Un~lwe{DY#U;+ zDHC|P3lUni#T&KSe9-^OwJQbOP(6wOP4tvnF2IdH3Hj$~onyBnA?7-FS#e7T%o6km z)2DOofxE%^Fw1l2-#|YH*C@g-fzUUAueJ@a^Dj?k$HEa)fXDekI{sM_6=+(>nkcYhOMjO6KQb=E5G;*~bXT z0IP;oIWW@JMn0s%5nj?=8sR1P;~OLU)fv|nPwPTsz4o}((Z>@)6WYsoYT+Y4IfCob zA0xOjxXvit2J7!(+9MYZ+@ofq#J+3h01OpNn+6ziA8im?lmYZAXnL61rqlP4Z?zo8 zJ>b4(UWT?05n(C3P88|thp5-PLc}BPW&9ZTh=z6>9wC1)Zgy3^9@;+x>^BJJ*~9sG z+_a4+aE-|ouEEf*3Pdt|YxGnxB%{$>M39tZbHs9o_S?~#00__FLg56%d&v5R6oa}z zH9-!S6rq}_kRJWx^Kf0kuY7je;NKM8d0Z&%i^|{sD7{fJw3c*ReqMM-i-yYXi^dUI ze@1R-f+XXaa7@ov0A0=f!IyVMRH=Z!G}97HVAcMRW#H8gQ75n}A~hcDoDu@7hQkjA zKENUBw+(#th+S6{QU*ny6H>l_yQU{8?mFJcH^$D=pBZ_QL6KW{+ldLX2-6Hoc}R_2 zT=j7BH1DQWSlqGmKrUpMc#^P`9Zu)LsKZGQ_WL+als{h|+rtg?=Lvd*;LTi=8w!%D;r;+mF)X;7Mb+D28b!{B(72D~me zEtvNty8RiM_!Qa1%QSon*9JhtnPXI#5RZlM#E*h)0~*&vR)#*3KZfsK z&YhH!^jAs=IkF5q*z?zjkk^9KwRxvKzgZiF+>s{zT_MNjIj0bW>>tJJbCb$`mMGk*KC8%BU zF$nD%?199|)e>5pTc598g9Z|RN;l-9Zony;&rB`+o6@o#=gX)C>H8n51?u~M(Uf2I zJ9LIjqy&{mXL!?|n4wGt0_MI116rWBMd?8@n48j)Kg8^Vqy=rUAIeWvLt*t;eJFf3 zwkI=M- zHerwt?d&3pJfc@2yc51IIdOtEl(HaX8%oolr8ma-Yx~Uv=W0p%ZHP8D9hthd!3skUSp!H>lPT>D2 zsj5IZ&R>Ly4w_Z%1T*_12{5`lAL%N_JUr~qV?}N`Io6c}h02iFlQ*G!Kb~kkK@epO z*9Stw-ux`PSm$D@)t|)cB+Z(OX;%DF;Y{k5D>M{0+c7~pKH1{Q+C>?o^6FYS7PpJ? zQ^nnwSq+8m{rFH!uVU~`9AtaQ-4*{G^P8rkfp&dG5o)1(TqE$AO|zsyvx#OYFU-co zsvKsM^I>pJv#FDasAD2Ef>GyRCB`=uFxNRdk?)7Jd>`n&j;jq}NxTN1y>Is}&g3c9 zh9~i)63Z7Ju0vMeHtCxmM6Kt7Fs81lQG1~-FqDb9Not4)Gfkhu>bbllHT2DHd$jFO zqU|s^^$PDM>w-(K@UGD|a;dS-ju0bg8rAkHU-S&M!M`ffK3hf`3?EWKZICsT&vwFY zE~F?bty8!fQk>lz-W$eOWj+VnFusfa^MH!^;Sv#Q^>Drxkw=nFRqZh;kt)NYYna%~ zPEOO<0kU8SN#=(rc3p;P$^3H;Bl>MJN}e1fyGY(+0dd@D zz6A!v+-O((Szhql;7z_E5uvB1DJb9K8%p7AV;6!#Wtj68>ccPK<+u4*dhc)Zo8(Xb z+@vwQo>4EjLd0y$JN$=smlg>L0XVQzF1eCOxwZ*iYGI45QZ%C>t_-8}xqN7l(FI*c zV(!m28u6mFHcB$Im0N6=p}L=c5a{iQaPcQjdJ)>xp1HrgEBUaLjqnVN>c1(rg)I{# zv7x2d#qyWm%bZe+S|ybyz0KspAp7J-4ZJv!f5&L2ojU;DBfrE#$Buy(_-!J>J~Hnd z{3kuWq6bVu*Ud?-QxR(2f=LwOIWoz0MYo(>$|F<}R^11aQO!?<^^+aWAkEKtfbaE# zII?q6DaH*>Vmb|-rl41dGC;k;9Ze6H>lGfE!uMCr+IXN6G~bY29r{k?uc}vECM&ti zG-M&m+&SVA;!2j=e8}|j?R~Cm)WpHGJBE)AtdJZ-GzJ+T-!j9(>AVBAIhZX?F!*kI zDOZq!t>_A3Zps8j1&#bMokeS0a%S+S?ArfX(8>Qz>(-;NwECC7S1kBio6eKciO1Mw z6ul&r@64HeoFlk#EaR+8#5wBYSisw7J_~1P`iIZJ8LF$nA~!uk5EXWa>Z(0)51M;$ zI7N?U^L>fRPAKH-gP4iy{F7f~$LL)IB<=xE7=P3mYBPt{1T3CI0m=M1d{tD~6?b`d z?)`Hv&n%dBfv*Q&kF$69cs7L;|0c%=nrFFa>{0TUKh)SX209|=caKQ<-Mj(TmO=F2 z< zAozDJD*`MlGQy7^@s~YPE};atpa57~)XJ{&yR4{)&VLFp;ONSy00a8Lmb`XNo_SHx zzX}pKUB(JX-z#JVG`zpUXM!4vx&?)RFeW7&68l`l&N3T#kr>s|(yEW`amu1ezlESOZFRx*J&PG1a$BB5U5YG0+P69$VY)^DGRv;Bt zT^ix9<6wFffnZ;(uE+of8woEVHM>@0p{L@45)0CVc5tSu@FM7&2n`g|5Oc03G%zSw zKZ)xgv;ZU5;w}C`IWU>$JD7>$1 zLR$A+kH>lO?k)i{mheP?L~A3* z?Z$w@DV{Xjw0Sq*ota@Pxe|e$0IqftNNa+Tdk|%c1M40djU;HV8NkxLSOvv<_@1i! zq-Ll1G=}>9_wp@O7nImyhkgwmBzVHMz5EhnXGg~g10io8U(-l}3T!&0(0|W(DX}d9 z{_6-l*eAu$4fpd+h%+`~KO(*_!+-<)8y<5m%Erh`>Zp;^Rq%!D2l&qDowYhh;psxX z5C97f@&OLnBtpI8AQftCQe*aACFRh}ag3}4D)CI=Of%>U_()36L$R07L1XX@cl#S)U;!V4 z@}E&4%fAxkKc@OcoH%{Hy_zV2g9TIxloZeec;7>m(Go1{g4RDGdG^~wd>pC)(_yR( z?QLs$y9OhTUCTv?Y{dUBxv8g>_HjSBNc+jBkap@PUX=aBi%uROb5+91>85hr#bc7Y zs5oGT_31nd#Wi|_+p0T>9#s7=&={~^uT{>n^qbq)%g79RiQg`0Jgs>kobpr zjeew@=7$kGyWusVhl@0$_?jX43_nMK4gU@d5}xx`B8OW~Y^^`q+FT5nER6d61rjX9 zy@442>>{2Jw2F&p#Pr~ea%?QqZBbAa?3lA7Ua$Z+Sn!bT>)w5`516&c2&c~S7Kb3a z7}*Dd9Y)sv`_4lIsh^J#vaexRubgu-vVdY||4rTyYHefA^C6zZ+M=|fD4NL*6jUC0 z9^Vv_1cnNPW^!hzK%%-Jr?8DdIZOW!7L)dd4gVqIx7Pt8Xh<=S)isCh4I6rp@a&nE zxc{w@*;5Lg$B8oDsPw&JR(9wW*Mu;VLFH0i+9<+IplO;AF1*UC5TE|>DxZqRA$RaK zK36VfAIqG`wf)K~iN?#j(Ld09|JYvS?^mL@wVO*5JX+m;?K(eMdGdTL8X}7YGH;-D zwC8v}y}?&^v(vF4DLYJR4uKh4GZ=63uBETEoTu4Mz9(}YGHy~tpyVdCk6yRt<9bV+gED14Nc#rQ`b(7YPBg@?#?VY=bDv(z@gnhj` z(8Jlv5Q=6ZVBGpX?@^w`L+Tf48tf+Zd5|n#@_pX!-rCQ;{XX9?(rz%(+S-S*$_7)O z$x3&Z3}5s$Bm5G3!Vl)(=Y0Yt4wl^t%Lk=m`RHsrvpcr@Ay7BEQ2Ya)RNn_e^JCWn zyxrI!3W0kfyl59u3^g?{vS?ft2!2S7;*f{LC_07JUQM6t_6Q#=iE~IVihn!i{j_p= zytJIceU(tLL~=ci@Fd1I=|sV4g+O$QmuZEXnDITJ6-3PH_IDFXakXn=v$9xsp^ei; zE{CFhzhh?|^#5oxne0)Tr>(f}4>|7j!)(QSBG9&`*S1P#HWE&I2yO9=@~cy6^$$}^ zN2-5HncHfx&{J?Cn+{s$j&l+%v$B`a*g?ze=T)xF4S^kAg0Z4D_ch7pj+AV!o44KO znry55YBQwsu#{zIujqu#yvLM_=8 zpE}_1h(jRTR|qIiNjQkAv|!KS7TcAC{TS#G2g3_~0uC<*yIZV=@sX2)f%g-nTrgT{ z`R7gtd9$C;gs3*NRIcL~WiK(dT~%8tw;3(DKXf!8x)2BR4FW0E*=rDnp!x`&y@Rjf zDRl!UW&RMxR};=w6E17A&Xt0| zba1CSYRq2n)DYN-6%~fS>_06B0<-_=zXO4JKxl2j;hH}Ki~nx|zdVkWvH1IT-~E$N@Xn=DT>V#|VEZwi1O>}~cY3=2 zgHSMGOP+y;J)WiC`nR%Wo>t{ikD}zpon@Su6MR3=wK$(R=q%%ZL>L?3AA1&I@1z-*Hpst$r` zNy11}Hctap7oV1(YP*lS{l5rRqm9S7*fsBjNcDOqANCItULyC5z;sQBe_gn(o?J*U zGz6#L|C6}%*L$80m$v`@_i$0ZNx=a>yRAy!K4KO?~F-xRibd{*E3rFM`0H;Npl^&g0{fAaj1dN5&;026;#4wl;T>T<&USuptk6e&?Q#(Am(xJ3 zjx*05jupt?2Q(B1X|O9l_Ed$8UJ6WuG!%#9plBT=HWdBgV12PNtawj&7snvpixp>( ze*HdDZ~lipFlW5?eZ=49!~RC%t7rvd8jE50kI5NLw{-z&3)7f(micS}Y@ZSI?&;to7GbRcHv1g3jPRDsbN6P~8rcyEU zTzQgE13@MoWH-(?LcdAKYncpNCJ8)#^qnFEc}h)VeURvJ07gv4^)ngvO-7)U{<$h9 zjvxD{hibcX-JOyj#UVx$+JZ>$fUdRIMYUus4W4QJ`XfNJSRj_sL#lr+$y!3pT-H{ znB-c?$()j4LV_`somuA2Qv6H;`yO&~F3z7Gg$#mxkr%>nZuT%<2-dFpB?PTvZxDGQ zFwB{Gkl%=fwy%)8$5g)97|6m`)-b-X?4l9bka4qpus{%)9MWqMba0sprb7W)_#q zU6**`UjiZV-n=mo48o77=b1S|T~zDQbA+MlNwbZpmu+)UO(>vfj?hRp0P}s{V~qaZ zQgG*-8#n;39%*8=?jf~gk>C!m%@txax6c@e$tcRak6lsb3ZXbibN^i7P1Nx0JQU|4 z;LD3fU!2e-^{`dwQ;E*^gqVfcjP}JW!86x1U-(8LUrXUadMy!)ghpy=jG+G_OnH+t z`#|cJ2lUKM)%2urVi9VD4?$-W-on#OvI*(chmZ#>Eg?;iMHw!QgVC^ZCtCeVa&i+C z*wz|y@#LQ{>K%79_zcvGg%||wi>xbAp=IoKg9%5>!7ySmg7(&nZtTrU?6r$HRuh{? z;ZQ7FiMkf%A{H*jw&%m)YRwM*dJ6&RzdE3_xMQ|mi32cF4S}YhGMYfc(uo-QUO4n8 zd0~CCx1?ambTuUs+sZXr9bkNmG#%uAn5ly$ON8C{>gk-d__OCsFe+s?ju+4dxZ~D8 z7`BF$PAAur9*Py&+c|a(mVG2FLE*q65EBeoj!PaB&n*H%Y+fZb7!OEWE{sy_JO#`O zRJx>3ngX)lLblXztI^6_kS3N@(qlKYqgUYN6~ZgbQrNnJ8l^|}J=D%Ud=BqYk`AqO zkFRzqq3;T$O}x8OV9A&h4eVGUG;()XK6tQFc#fVF36imBmhP_>j6O>bOT%f%NoO5a zK-d}qb9SqQmI$fsSw$I`k*g^KGbT&o1x*nznXZZ&21Ayq3$}ttpQnF&DmMosbM0;AJW=Y1zFUNwd*h2h_usMeInL1 zrJm0)!T5E8J6W(3Rw29Ob6!o487L);6f8MxOP9k2*w~YvxMZ*3Iko5LaRMQ{cCyKX z=9eWK*JX?zi3nsS8@WDzx>m6>B{|lPO7?@n(Dg!?dgpmE3qf3urf(B3O+qLcqnEfM zwK^E#%zC`K-p+9?z85k^fWAwB4pMSxe4c!9Elo*N<0RKMQ{yDnHp^o=|GaHV?wcRw zqW7^dI%7*}EyqCQ@Tdc%5;ZyMKoyApZn4hi!@JVT!;wO4`d#D(MIC5@BMXxcM>2-Y z^m%&yV@f?K#2O57OD7VEh&CU1Y%oGzUoIA|eL@!&BYfX1a}uZXI9x`rOW&zpXZ;S4 zUU4I9A0;i}0`ligSggvWCP-Y5vfDlb}bn z-fNRE0mr2s-GphqRQPR^FcCH5d!GxR;Vv;>Ame8M4E#bU#F|R6(V(43f5@L;CtgTFjkumI^_4p4r{KsS)+}?%w1`q6Rp|0~dfNi_cizEks&T;UYxG$>z@IC0H5zQ|h!s6gr4cH@?Q9|qO+8r2i`2wZs z;6$`z_%EEeTd9)du6wc(M7s68ayRS|fH-a$Lo-5DB+ig0y=3hZhA1wc1ke4H!b%(N zw%CvAb;~q+c%f!Lod&P%m)PUQZF=~taL5d5`c`!faB;t|p56%R*^@q4qdIY(8tTrq zctYXB<$5@H06A&gci7;P{q1wfJHBv0sI5MI0d)0&_Z? zCqJLqI+d`2s2>0Q`E_W$a$-YIWGzqwfD_9g zepVJ6AAFr(rg}0`8pw23e zUPyEn8RVObgM6_|ASSnu36YAe!Qi`941iTe(GR{ohJo%4C^?22>KjP9A((S({UEeq zN<)EaM(*TL= ziQgokE<6Z*FJhtwA zcN`{Ts*8ftn!@_?GSy??N0A-{&Xu0}UizDm_@l7KzJvuVFfMlqr_v=1xP;%%ZTb@e zU{8MCD^C3B*S&nP7xH*}!qdO*p|BuWBupOq&QHqk{G`h}U+yNobGohcJKtBqcaFN3 zzH`};Bkvp)Zb44GqtTn|TSsT?Z++_?`SeAr=x}oK;-&9Y#nBi4+poem_~OGgq6Nh7 z>w73JdP;9!aYJY!=`KR>k<^GnUzm$pES5r5DzIGfH^KUw7){QHqMJxo!^rG%yaAfu z5_W;|qOjn}>w`c3r`N}K1%Fu`d?GK6Ph6HpnuoMB=(f^JV`(`{1Mf8Mv+srV?=p#Ywf zmjK)~iXLdgc4)*Sn6W)-5(hCa=ibwb-F`<26dx<|k}WVjKpd^Ok4WbwVE}oAf1vu$ z-~P+*I!k`nSuXGTqE33(bX)0nonFqn{w=1Yp}n}LXf^Y z7s9XM;sVqHsYg;Q5WixAhhk-@E&luJII#F|gy_%(JKD^}zc9dfrx_vLbX5Z{R1sOl zUAJ7miWvPwg|ii|5Unl_pf39v~;T~!=m(o^d3n@$m)N| z3r244Db+QAWpyeRadE(<2f2)CI7$nMlk1l%Q`VHu9uBDdtiaSZwrx(sMSipABI(l`1^4!@b_ghwwqgs z-LXlLPfL-M9VWCCYavdp!lXxP3o)eJp0}U3#64z!cPqL_*H+?eOoaZ}N}P!wV_Rb! zcK{Z)7L)MXqtor&A8)$K5sbdIV_Oz{#paf&&OH7nCg5=GCu*nd#7uVq?rQ_v|Q=>a2vH7s(aNSYy!{?ZNLi+5Wxk zEcOG%hLN2`jimhIA^cO{0LU3X!3)xHYx&9Am`iV%!J_6p{jq_BvYdP^HVzGkb;ap! zo+Mw35q`LWV13gk7)s}CAwB*lEXlvR$n8&MZew=-Vus?I6TIChtw8^zBrc4)G0hC| z+b5b_V0?@f?CD#Lx000;xOky@Y)mo1fW!_=es+PJnHRAY$Em~aK0n-dA_utaG5N(e z@bsf_nieJB4+bj58W6u@VqJ(%T}g%*V-D8=CpZTnk8q9O#@CG?+TakCj?-tST474gO?HJ$BR-fx3I;8 zF%Xs@o*@~5)KNHw%-l_^tV#6>*RTvcOg`fe3Ejj{CJjb*6XTgI*nxlc{5Undk)k;k zXkDBKKX*fvWjb~=Knd)Ed#NEjFb=yJ#HZDU@!e5nbcOZZ(X)wz=)Q^O%pQogD4<0T zu>~W*`#r>Q82;Spfr~m7f_jRWJb;v2b&R>|dWxSjnv0%zKyMiMirA-tG@V|-R4E|wd7l;CvH|!&Za~oh z(V|&NE+`oK50=hngoT5}x;|3Hl#d0+sq0_Dbinb!cmdl7;spRSPQ(iUsG1}m)2+(W zV2ZyPW5g%ACJ#JbK@F>bdasC)_>5kDMI3^s+4%~d1_@3YHiF#N2w=!Lgch1}MQ zu<=zfnK=a2UK2_C_IF+ri}BmwLG;@fgT(82s&%i6oluS6d0iaiIHQ|%#&K_mRlOCJ z@Zgb>9@YUnAl2yU#@42*TdBVY``@6~(ReUEoI>a`n7*rHgAoDj3WtV}6XjMNiWiPw zU-%C_@BIIW*9haL0mMxBzywQ%iG*=;beK2}7j!J7$0ehg9FB)u3*vBGJ+~f)=~uwo z;RwWa0q+swBs^5c2xNK1!KM*n1N^u=f@;ayBgNWiYBX#MDBgE9018KmmHk`ND`nUz zTiw|dhW&7nG|yo9NIXC{I51LdtCRn9PySQbD6yu793~H`7*o6rIATYPGRQxgx=d;} zreVLV1SPjwgTGYQ`&A`!9%`9z&#x*0+a<&RCvZ>u;eVC(1XHqD6VKc-S!`$j)A?_u z7V7EvCwk^@D?x!b(uzj;omSJ^2-!uCkB)+T9fx+=uVYsw$f$+Zb$&`CcU+G#qs1!p z7<*7~S9UV#%Vvcj>vFok^1}yVFlV$FrMk(mdm(+|%l>eBwCLx#E!PigFnZ%X>_gRZ z&7T(Lzg@p4jOx7_bMw9HX<_o4;$eIfUGMx9s>BQuhAY^8FzqdIf+GDp(7!E4>QYwG z;qQu?c)gQWLC3encIc=GZ&N7s%G=26i37JW)CuV{M(nD+k?PC3>tBYfF=8XkXX7}= zk1?NJJVuoA*;<$OLAKZC>LA`b-zQKS>!x6DUm;NSqHXr%wi|5yKn$yA@54Xbo`#W2 zu(hl-?Tw5>ocW!UZ&D+zo{+Q1&2D%H4Qe-Az2Q|EbLLnv((mgMHG91hyQj#00xw&> zcNHeUS5vhTdL$(?uJZ)k>@gS5cAoTY7q5-NScnT*?{sMKSb;D-Mq=OH`$*(eExx0 zyT))fNV){a^OjQlOc0B7ZL=#37p06ud9*k!TZR@_bR{yt(gGx3KaZ9Np@L&XW?|u9ERc zMnQs}CwNQ|J^bf<`grCPvjoJ~^O0mkVR!aG|JEL4yo}G$z^Ex=eH0HPFfV3@QyPbk zTSO(W5}|QSUxah|_QcrMd)8p6XBU4d7~<>CbbA7qW9U@T1N|W-%3FB^J;LX3m)bZG zIW3whzTn7_?s3NWSYs7RNqBf==#;-K)PVKVs6!Yi5%doD{X__QCDSl*7nkch9UU!n z9TFm}7C2>ab3+X@fWk|djJ|rp9Tv_&eJ})~-zo5i9g_;&lv@4ROe^l23KpwqMel31 zRTP;c(3BH{JihtFqF+HMZf+94E}0XXsf+IF^;X!xQ7esXyh+&l+!L~Fy@EW|@_YoM zf|9usY(>Y5WWc63BxIb%_A-4#RA3gwAl#&b^Hui>%V30UTx`@S~VGDR&}iW{QS-b9wC_zSKll6Ob059TaG zq3aw3Dy)z=M{KH|N7$N>e-O#_Tjz)!@RwPu(NP-!dFRB2$l@6>S4_t>6u|IilX&1%d z+^UO2ErY3~oS)G}!PRNQbvFdMT*9Sa2qP|u7Nxs>8F*)j`-sQt4@uqU_+y4&=Lrw9 z#42QhJyX=r0FAQ6*QqF`9K&qh_H2xgdqJLZXdg@wYqZe+vRDN=E*3w<(`F2hAxZk| znTOI8hhrgQVazc6?S|1YLm^~0)%bKl5q(D%l$_q83+f?cY@6xOb#mIAE+`CH%UMu1 zMoAVf79nlj7UE~Zr?~V7DN^;uf5Q)uxSaaUC0l0Tb6YpDEw;b2kyVheb%rB6Ek*Sp z+3u1_w(^z`$#$1?wKj!^E2OZK9hMg9vCFBm=)zgQQv9{l!l{GHA>*LynrVkbNiqDf zHDk*c>qFLDu@eLrh&rt=Mo->)c@5>Pd29_uLjAR3)Dss{1k75CZp5ElNV&L>hRbWH z1)Rtc&y~M~R+1$Y!7R(o`j{wSe6T~YFKAA-=mS~D=o-oKpKC&H^_!i@8hIX8d?JRI zrl_bClea+L`5BJp3z1yQpvh0@x^QE&G(&Z8=Z<5YOKrpO7*UyX=*ephfp5CjWZ;{w zwQ15?lYwv7wT8g=KV_|XeCt$F8MnT#?OtZJwLkFKYFk!jwGAq7p~=drvr{jPdE!cn zE47H`S6C5ou<9rAJkuo?^^oNWDrmF3ejwu#M)tkF7Qg$$HFT!Td*4^^*59IIJic+hcV_RQioEyr|EBl;jmvxQ0IA=L_n+pyXFPm9 zO_BfP*PbPddlqsE_3@Cra(i2ejp#_5QJaFaseg)`!{tJ1Q)cH~dF)*;EP71F$3p9^ z;&V^*;d)#*ZDeD;@p(!WK#q4{;mg~&etxNKj! zPF>H`fSDE;@X;X;^eR<1#d_E*t>H~E5uLZ$H^p!|3bR*pBka40>8vi$`ev~i+TRj) zV+iB(o4BgV;Q-dH6inf6rxrWlB3nVT0E{26{U(mZy$0VF7c+;!^NzR)kC)QFwi)S{ z;+xE3=z15!0S*f8ikE1e2sXRU_c6ked*Twjnz8rMmpKme?u$*(K{QBH+2P`SF$KRG zA=x|10OKDZqPr1RKEORbgt&*|bmcGv^pameBL209)K4fG*WCpAqnbYO>Lc+gUV%I> zh1s`)oBbfoO_6gDv`pG?G)5S@AO+L?IW?p)Y3)&QWa~01%acj#9T~@}rQ62tUnHf5 zqqQ0Kv%3->H~{~R0Z}l1th)=zinNz7A-GqOM$(JkO8SwkN7SnL0q+J`hvrm+G-X;- z5~qbG(yQx)i7LiVhA&iUNC>nQO{&YBB)OdpshM&;9?`ZW0w)D^>p@4c}!H{J@?#qLqTKxZU1pFacWmq*=;(wD;xy3-_J< z7nm!wpO}VjN&xm=I|Cy%UBDDmvOeuK#dIW)4jU1mByGEkeA1%u8D(4i$ihx)uj&A! z^l5|2{msx&1n|Aptzoop8sNf^<1aQU(42X)8WKy^#hana(P~;4=a<$@aq<9s;fIBj zw?30l)@Xc3cRqvjeratmFI2;jc0_T@7YZ(pFoN&@WADA=t0=nv@$5~%>7@6Y0)!9< zk=|Kp5)CAD6$n9WC;}>0APLgj?%stQdJ=jkAaW5A2)&a??*Ty~9V;T``<~go_Xe;& z<@NhL&*$L}Zf2*SIdkUBnNtGzC{m`h3Z%@pUUR1Ok6*8pfAHs;g0r7y5$LMxcr#H> zPJlEXTjjj5NwB95KJ6vLZ zC;wQzTElmyRoNjz$9JezTfT~v(%JLeprB*$avCiy#p>n6L2K$>wA8?5n}GcUTO}VS ze@Zh+ZL|-L+J|K(sTOKxG-P6&eg6p9IN;>c>kwETM2JAiviuaV!{ig5<^exm~?K$x}xm#=wjK zZ%fn45+o8Gm<45!<;5zJL9mYe?W$5e!#07^ubv5@ja8-kk9X3A(T(3~{}uWnL7MDy zZ+~5coz#p+e%N1^MB`Thj=s@O6{UDd2xgnZY+aZrk7gXb>`5z5u4D$WgC>;5Qe+(|7#+6gmSggMxXZxt-x*J> zcX#Elx{?S75gkr{!)inR5}RK(sG8uH-{K2RgmbHoR8i{UEPgeSl(yIF=I2BvaKSTV zFSSXkEBP>zA9HqV1x7hvh)NLNp%(tLodWjM^$2i)`G`|LyqF6K1}Cw6w%ytflLjV2 z9w#AtOkC_wHCjt)IJ!P=Ek(QJvPW=d?fa*#rO9}sf2NI;=z<4D*Zji9CLv(q*ypg~ zd-I$1LnLxbL3=4nFkHDoj_FbrP}#(ENz+ttr}OIyxu(MNxXl}>_=|9O3Q5Q5m}a@1 z4q}Tr<#v?b77SyqQSOSiR<8kL5Y`psF}kx96?FRQR}RcqpMzL#`|H+KDty)}w9$R- zi-UuB5r2tz;J13#=1+$rZzn_a(ikPW?s z`ziolVR!x$SDBa(xOiQ8r?gFlo#;kg@{ZNV2W8XdR_I81_akJxUuH zH$6g0xU0Jum*V#VXKvS#-_5qA4sXlrFC90m6d20_y|@0-GcG&Wkpm9~&FcG8$G5-> zl+f9?q#X30IRHppVp%>w+Q9CA{RRQmJJRjw1|gNjifuxKmwJRns!{OU)yhe&v=-z;rqGp=1X*vTLw_x4b!2Fo=K zL++YlX)UXgT`E0=@%Yu;&A2SFi>WOY43@f9$Qrc!OxM7IolngF_zuc@Pr3-p+*J{; zhmiWdG!YgIF&{{ag@aUcrxZoset;u2jaKfI!s*oy(a%8`;Yz`lRUZN}$Y}a82ZFF) zdW>XD{1_y(V}6J0HH6UM-=1?R#XL8>Gu_%e$D7>8+^%M~O!VplSW!p7C+~t56 z;#eGDAisfTaEQYV?MS+p0Ohuveu?z+XL)fXuL(9%&0NWq+3wZPmExE#6mwDFVbpx! z<9UBH4at=nI5Dd|D!x@cz(aHwC*KP)IryP$+1N_(&YmlI-~#b;u2h+|6Ez$xoq<{n zmrRDyh8e?*LNE;-E>&WAik4?V9%>v%ihX@JTx#Vq+JMJr5T-4+{8@2Vdg&9XvWvk1 zUyb>t6TNUzE&N1+0>d?0_lXpR9*%v&Te0Tp+v6Agn5z{-V+VE{*mcqGzJr6q zeGdl{QtNCfW=*?DOT`8tS0n1W0T-MGwWrw=q{iUv#9R~fEcPe3!@5he0fl}r2@|E- z0B8PT+?Vdxz2xTT04V{}NnT?1Npr1{2?xqw&Gp9?8Ygss5 z0y(vun~wI`eR3wK9v@aT>ip^{WqzS)%{VFl)LTQUSBZ*-{L%?n>4?D_+&(Dks1ztXVxO?i&HAE9RBLAlEWTHQIXS$AHmzg=l>E}z zB*8>?S4zI#+aB1N;Y|-Hq)6&)7>l>nD-#3qZ^kDH?dV>kJ)ASv%+_ufNvW7rlU33P zyu=r;lI$<>e^a_`bsJT4xe~--Dvlx3~`eA$X$8S6nwl{AR?!oUJ+qUMPUlR{2E8p39F97h$ zhS_0)_N`~!wk=P9@m_IVRK4lv)kYtFG!2mI~54=yBaM%L2=eQG+NB7w{p7`J8`YOQo&sm@s zY4?7~Y$(~RLH9m~E?yk1d>=A6V3EO(PNaViruHm;bUJ?pu`dp*7C0SoE6X}0HAl1T ztW5elXC+-f#3iXX7pqe8VF-Kdhogu4BS&L2m3i)SA^ETbCpGMlWVgXRI4dDA$LSbi zaXcdBvQuZ|QK_YN>c9>rBrTA>J}Py`S<~d0)DMTj!ei2Ic4!PbAq~aXnZm7rCQbYDFl-IN@{~BDsHsCN@r9hf`3CMAbzPZGY z@aMjfqS*M}D3@Mv1g`A33Tb2-xnJWa*0a}eVjZT{*KlGTwzyoEx(EiWY0n${#LB;c z6ASCN{sup>THch*4BKu>b@1bHOR67@Bhhx%#FGG&O_@rwQ9BwT%+0zbB{QtKC7C+> zD~>Lsm}EV=@@`9waaPr!lzMx@yo_Q^>uD_3)D*!!x-Erxrisbg01=Ie&UYEm4FDBu@Et&L$THzOX^_DHy7BM_sWC+8E@B-z|NWoxni z+`=%^g@g_*{Asw0+=dl!C*fX?AiCfprwKEumaE)}ef6+adlp~IU1g?A733zHTvX;- z%bQB;!{JT`H~BQ4CzIUe);POwt?U*|W8LMNUdw)f>rrvkGEe4jkhZzYN!3T3@rUa- zU4z`!YI3Kk#yWsg*&sWiFmqw$&n)6Jb@{4oH5XQ}RSMf3La!R-YP{`uTidgYa+33g zvuK+R80B!+Q3`K{a#nTYPZ@=MjzR;Rd*2GBrXF$OFScGKnTaBuaN9Vaz0cqB zRwel(K`6F->o3=3>O9eba&0i&)o4)1m|&`9Ug|~%m(6gd4+CWrDDU(@S;WujK)EG; zOhIxZ5SJR(07^k}Wh9}$A1vc)8ibWiqmx0rXjCx&>7)HD2nM=!q|#vdF*!-b;+!t| z1EXpPu9l7=@|*19cfKna@x!4qdpZ-sc=vv-G6M{FP*V>1v9B3(TQX5kVVJzqNJ|yN&}kT5e1OsFGV%}<$Q2<6rfiJ@`Pay)CiaOmD3+7Znrn=i^Wg%Dh;)2J-E1Xq$_dtqCX z+=fZ#3*Afn=>wD8&uK0Xu`qdW0Npil5N$3!$P`IEDT|fimE;y7(Rp?FaHhq`c-71I zyIxg@<;D`e#4QYbTegYRgW?**vBP0>CZ0R0`BTV?1^)EUFG7`2FN3&tywwK9-{yI@ zq`<^B6--;HaPrqMDXS9_6RJBG<*oTyTSJ*Z8uVR+zq{_g(HCz?(@f#6J2h8o`LjnR z>p^TOGrojbT9m}ecyGjz{H={pR6H9JrH}FtbvKARwGmP8cv;(@g{C3-CaJ2xo*Dm% zQ(){JUyzUPkOOjY?Ctu6>{67{WNC``{hQ30ZDR*!aPZ4b@=K7JVc@FnJK1IEw{(_E zUo7N;*?xtMj2rBiAtB><#mkW2kmK(MuGN`%`-?}}n!1!B4|~~g%q!n-Xf+|gv1Ik5 z&krokUN(YCK7XS2qIG)hBi7ne*V=05#(ffIK$2IU`sEXqZ+)RxK5DI8_PMQc>HQI5 z1|-?Thb5~f&=p69oD6!=i&iDevykdgiyto^)spKVwNgu+tR**KvOq+@qsX^XVSn)I zJ|pThOOb2v*Ah4K>##J0#-zx;JngQfKTAPlA5d9}JXDxZy`GX|K>>50k_l&1Xl?lm z{2Zw*_X?V^%v8_tfyq(abq}^qQw99B@z-c-S4Zv&eUpMZGE>FgRY%SR|DIY`?iB%> zSB;hO)%}I*aW7$6mPXs^;tWiqJ9XuLaHI=)lUCG|*=ss+*3(VYUJ9I;7he}>!U!MW zopwe&5We=7bM<6@#tVI4U!I0$CN{u0+f%!S@?@mWHk4-=N)WNWQ@1G3D9&Y;e9B*C z<~NcP)BB3iT4z4|aD%T290IWW$v%;qWK3)c4OI{4RCA|`Ewi>Et|^Cz*|<)0Yb(1CqSv_-K8#$9=^Gj zg-vBIR`|1K@=g>U+FWMl-W!_B@i=16H<$O}5|AR|5ZKZ}4i7x$(MS%YE-mF| zSh>277vyp#zH%#Df^9KS`&JwWKWxQuaD|pS(Mo0pyg{vbp4b{k)=CO_YOe(9#A|S zgQ;>afW3FB9K#-Hn9*ac9&#uZq{?-9>-%9unO4u=awApd;c&luR?bH~^KvE#rx} zgY2$-J)wQwxDK9OHnf&a!6!AdPbXhq>7;|UIPjm>TCPn`r^_t>&`;7iKo_O+joTta z-XuJq*HP~I2M~OkKISF;6Nlp0`MIkNLIBlzHp`V6AZ7#2s(}UUaP{0he_}g7#03ruSad?EcT|F?n7Pk2iB_$*KKE>mqV;% z;@9V854Q7NUjzYrowmM+wM-+Y9&!~S*HXQQ?87n}_mp=d)43PVY}1QnQvY7^e&Hx> z&IEFI$dto_j#eNG5BYF#&d#HpOu4yMF33>!Ic zQcfQ^gb~u|edLzD8XXEMDYCsCc3nKgbzUIk!Ye}$K?`KnySmGAk<0x7qFHv?V; z(|^Pc*N7t(;5tPIobNm*tnd_pvJOJ{GjUrUUJPH8gSC1=hN){AoKr!6JzfWBv7%x> zc_8TT41LzPR_TZ{Q)`jE{T%EkcSD(3Pn4N$FOxAk(LX;E&p^)9;|)1M*h(YckY7Lt zWpCi(nMU{DkP~s=m_wz8&>(8@rtAq`FYQgawb$zJokf#4cVQU6>E*vEcNg~1oj2tu z*UOjKw{8^KUk-abpoE*aP+K-l;J=Uteb^%CQQJF6DSFVYW0e9e-}cuIW$ykF5_qnJ zrt6o-e7)dt{c^5-#`MdXt53!j{*kNCf6URB^dnwPz--!`eTHcMPno;Vp8K4MqH|0H znBu7Ma#b(Qr9agEOi<6H%wc+EH_9E4${*d~l{Z;G8|nObIh7h@%k8vQJm{kda#zcl zY+R})Z(iL(VjqAWjsyZ6-q>)UX6v_Y1;{x_QRy%h>{~Ao^#M!Fa zVNy6&W8c@0l^eORd7nQ=cgM<*pHuoc&d7c|jx)JM<2X)TWT}f3I$mzT+@d&%)wM<; zbXXtGEv6E6m6V z?aD>jzJ0|8+KB!lUNy8gnISf`Rkg!#wyMFUo%Q;Q7_zfMdl}+Rdu7}F9^?01M9mQkzbtC}o)hjAyYu7}9f9&lu8xy8iR8B4 z45juui6?&ML0u>puIYeUM+qWMMz{9s{e@8Bw*`S@dgrJcB~8VJ&_Io*f_vyi1E=CH zagi2I1#CIOmD01*eBcEyfve9N5zh1mE4R_*;7O&~@HilJS&5$!4fjCd) zC%=ceeuD>r4gUq|>GX&ib9T z!|2Z$Y8UZbg*Gyf(hvx%V*@ZXE7VxO?uBv_4nrW&^g>)ZM#7L2m;WTuv><(nQ;y^tI#D+LI zf+TRN>vgrl=+dclE}x2wF1uRKtgFlABwV+K>m2M~+E9HuT{`NUq?h8<6AzY$uM ziU-*Uy&k!(lD+wP=08&Bo1x=uJJ5El;5c=41;=#nmGW~yp%+(jOe$Q-F=_8gxu%A1 zn?4dqDY{W) z#ls7==cJ{d%FL0K6Rtg!6{GmmwNLe)@7N1fTca16B~VP4jUhB(jhx84yl*eG5QUh~ zdX3!HpOI5^Lc6`$O$MzOK%X`htvCHl_C=xgpXnn(Cwd{8`x&pl&zgm%tywW^c~Ba4rJA%>QJ0LmR}?c=u=inQp3;E)%tE#Y7EvJCe{tL2#BC06`nLq?a@ zDl@EAmO>>YW(zzKvC_*bmc|5^O<;oZE)=>>?_fDlY@G{VzbcfoPG1d|S+P}BLl(h$7c8Q05^t~v1B(a})9->aW$tZV)G3La-)rt&T)6sAEb5 zE}})tXU~T}syg2MjgB=!CF^B(=Nso(w5PM^$#dH_7ro@?xSOXKdCB6U zsP>jOzmNw*F!DsKi^0aS6;>}VP^D^BmDYbX%~Q3+0KFkW=nQo65`GV))k#tErt{ z7a>Bpk2BE?x}$}Dui`eEql9>BpFE zz_K(#7()bedAG=$Zf}EZ3XebA|w?><%OFhktJf3oQS3Y?>Hc*h}?utdH zguAOj{>cI4Vaj7ZOhb4)N=xuTa8qEY+n3e}bf{ZEiko*=T><11(ex61( z4kH>)8a;DZX6i)8(ebY|V+STAR5yjsjOM*H6Gq#Olk#O8f{Gmx@R z%5fZkaa1_E73?97weq&?I*B$>B%b`*X2G80G%gCCk$PHYz74BTMl>FozB?^1#I zlAF%kCTW00RU6Cp7;EdSz38!5#hPXMRr=nyP#ly$a=H{ECextRwf*T~ne4(Ca5h*^ zuJ@+NH(-@}o=c5Vw2r+0%H_pbe5&H@UY9(es%?zqcd5anQlr{*en4ITMb-87LFl3e zMt_aJ#%2)bJDLnkUXS<03o`6Oa=#3tCKn*ONTUuHunW^@)CK6wFt)J1jjM8|gCz~U z^Av9%D!U-NarSSiqxjuXO z14~)sl01Z6u;5m9)taCE-CD;AUi>b~CQxZhg?l6uZNR-OARUDnXs%^3g{}JK(n@9i z@b%gm!V^18GLX_{p}zq0_v64TF6a09P34?b$VyrO4m&*BiJCp<;cwjoekBzq$-q`Z!tSX7l-;Vx zE4!5E0dS@I++nTw=RymZ)>ddU11Sw~c2h?No=08*;q6|lQUP${A-emmO)5kwSLAve z^^cG+ymJ8MT#=Lg9(kF;;E&Sz`FG$tJF zF;9f8bQVu&gJKUjxWmCCwR=EShu=3TbcSSzZ5xTJ(VXtf0pWP_unsz}Lb}lc>FlrL5y9N!B6I6ChMwCtRy{_egpNB!= zLN8b99n;X2M&)czq~1HWC(xnm|Kr3e#&)!MqqlR`2qylwII)c0g~`<5d%V;C8UH2H zgYUHmEFPE9@-JY*-nYE+quhouVatEwV)XMraWQ((&s?_t?9cpTHcMTkHQL8-wU3c^ z_{Way$3Ua+$hG-{kC9^T$U$`E4w#E_x~1h-{zcFA(sG-uf76HgW!4l{)%cK$w=;p6-I2`YI+>^&~hN2S1)K=o?%X@Msys!G*NA6b2a#r3EKB2<?Gn4=`gi#8V#tCEec9N+dmKSq=?HOO!#`rM)nP*+%K(r8!adFook{{3$heQnV3A z{PBqE(AmHrJZWN_5^Ln%lr@(lqKjgi#KljzG=&rwMT=e$O;V~-FU-V90l0d78hSBI z!^Edy!8CqhGXRHXo56ENg|XbckRMLcq%@no^&wZ&hOFE2S%<6_!;ll%kSkky`zXmSIBw)X zr4azVH&8jCjjtvfUt8Z~K4n)8#sXL_?|Z;9j}WClA8xHb8LoGVZMf(&MU!czw@{)e zDNNDu0Z3DD*N7!#(yOOPNm4>7GfZJ_&YfT|$N{e@X4wF5FAw8|RHdWECtPXl1Sr?F z0iNj!*JCh`w=9cRikKNp&lshf)29L$C(I$9PRA%OVe7YuRX+M%a5vzCXlx&L80V>U z6u`)5%G`B6M%sjr+{jrg4Wnws>&pX-*UMRQ;+1EZ^;mP;KqKkbstOauZ+74)0_Egf zBX$?fuckcZ!X8z@^{}O=r13oP*~{@ALGK;dM8YUNQDNrHn-Z0ee{&*vNlHULkL_gY zvN4nx_=C0AA^SvruxR)*AxTN#g?G}VRHZ)MN>bdd+g2}wA?>2FRHZRB7nKl8uNulx z1I7;?$A}N{8)JI;>BrW)tg_j%sV(uz}HpqgHAt*A_M!W_=%b0})9 zR6+7AA9}pyL2GSOtZb`1?~F}xo+DE{r97kbHWOJ)Rmy4ZB* z#2avD0pt5GIx1eAQNIb71xyCb_lTxTXGf}8v$Z`E-bv9U;kOYCgUO(0J&@xlyOZK> zT?4(OC9jiGm2LO$X;5d#^P09-BE5dFSbYK)Tslai@rGN*oZRMK`69bHUso z$bGZBDUlxKlW>LP65^jZx9Y^0TH4f2sq8#?9xL@NO1TzFycBtLSHet>MF@8h@7h-h z$aNPHl$^nBE8fo3ySq}&>%PSqj}A?1KK7){x8%WZDx zZf7gZA(34${0Pt3wU=TO4AU*2ZUN4?@j`K$jBB{3RkRS!Tc8K{XqX7037s! zS_`@w`!3B{YgQku)@qv22VL_|HobIv*BkWF$MDf_u#P^4_w5$TM}JhHp##u4&&?2Z zC|2Pe@j@9^MR$8s`eyLem^p1T02Ea< zU?%Y4NEFl8zAbcfRC^Qpw(#T(o)#h^ord;R5*va1R)1_XnsKS-xLVZZZhBJ~D_5Hr z6Cj5^-&aZMq3xM?(7n^xrS%LZ{8f(G)-%8=M_k7LV)jbw0RDQ00Q@zN|K*Fn4)a`3 z{I!|?#f%JXSiPry(jUK{8u_~7XUM5U(UCuQp_Sus1AyglKPAQh0t%mtp(Kr0 zTn*cn(bVzED|lIZI9_=TRtJvSBI;gAO|GIAIFU)Pi{DT>qkU(Z{Yg$}ev{KRgvwMB z08f5N6O{?nZK%SYZT_3ca2O|{8Bh8q#Y-Y5w3?eR>#Nh)@|IRA=wsUoIt{T>!Sq3P zDi~$PE-n!&P+e^oYs6M3iMsuceGBR&(NlZJ(MTfoZnQYj@I9i|CW4gclrZq|F@O>l z4p-vsL@-Drg6XP81P9G3w-LdR$17WjAg8&aP6Thitt1*&!*6PJbgNUr@W*TFRFG;; z1_8Da!3eGIUib*rcvF+bAyyI?^>_n138aBda9HXTuy`_hK81&)B=oEkyqL!;Y6LId zXd`v-YJ+owGHVQT0Ryn=T|1?Vf4r`h0T|X4o$CJh4^Ghtoo+&eHPIGKBd9u|tNKVw zAatCtazZy~@V}eTG3Ee-u9`+`tU+`@onZaS2%Sc^HA0t2g)y@tsLy)}v;JHD9;a$a z8daqQ`XYx8Na)8dX_v^foYKC#s`YK@aL55*3$n`GC0xwZHDrHl*~>*|3}Hv>A#JV zah9!Y@k}S$I*OAs@6rD}IpZ1-c1pJ9pQU63N_L0Zj;p|zW#Ns6`Q!`yLU|gu%I;q% z4Or6rg^~)Vgp~5Ek3VhdPD7EGaj9!ye(#8Ap*HRFtoL-j@7Y9wy&^ox)0Hpz=P98D zJY6`ubpMZ^V|T*;@pE?i`9FRR7rFoM`MJV@!{W)4AnHrQvkGpMCW6{zI#ShbH`7or z?GCO5u}=C!UXHa>gWpVzpK?lP)#~GnTo7|+4ehV+ym#O!6`}BI4MUi_X-X9SPM)ST zfX>(E*rx+%$TWrNe5J5E=zAe94&vcOPq{8_E{Y zKp%50O6xV7Ie=q67zF-laNzMJPc$Mgq5fYgJJCq`(erS$uu*Ac*a1g{ADs@eEZe9o zG$7Jz=VHZ#pTWh-cKkHnqD0`Q`xYf8bd>8HQ@jZdkWK!kAXA8mg@6vm<$M&Gw#YOPe{_U)4B!@0{qgx@%*>qwan!^kgGE(X5ZOSir zOGW$?=DKKEh&hrf?*PXOd%7=EP5B+_#tBT-ZQu^&83Ux!pYKvWfggybyOqPtMBN$A zif*rr^{2!=N*V+Z&WHiY)6yQrm%*}dk1~)spk7g;gj3DESg9$Nw7p6WYwN&%Wh9LJ zy{Y+br3sl2C?^2NHxEJ%(4Mkm%~cH-7ty_gN|9c_o-lMz5q4auas;CF-e2LB zNm*bN=L_P*9PQn*=qn8LI*bA-29aZxZ%n?*@&Z`nl`bzPnl}8je zKHU}ehSC$v_1OTA;Bn$A?Lh_C<@cGocsIJ9U=DpeGOde#4`gpG6jQBY^Fi8mO%NGC zSJ`_QR1HB#oQ^3$&JU*ru<;(lc-P-@<$Z|9wDF#+W)64$3i*@hVKs9cbODtJ1N>dL zNJJOOdk{nT+%csY)-~$5QkCIF+vCbMETrcNWveipN=|_BNF)D~fHt1CPAZRiFDm_J zOMA=KlMq9riOi3_3C#cK!tLhkEb@>Le~) zMls(e`g`BV)f^nL>0HUBer3uFPWKGV0rb#g!DKQ>k#w(2F+y-=)b9OOvvL>Fg9~GE z*QU~!y986i^Gaw1_o_}J+^hCJuXKj!?X&aBYZzA41q>^V8eYK1G@5ilNvnA!*O3RF zHb4W&A;uj}M=&#Y7A~MwEK@w+=Frb%2p89m(O~BOHC|=zZ-D0{z^umCN)lk^YYQj+ z3ak$xxu1%N-kDp+xnsRW|AxUV)^nm)$zu5A6X#Cy#tTaqlG`{2Q?H9kwBcq5WnTmp z?MMX|6_FRKYAbf*qEg3Ox*Uap9KPx5`$Z)P=3}Z43N&g$B97`EF6q@GY}IC6QtBBH z75>O2#l&MSN9Zw^Eq>o9l^CLN-$wsp|FLLJj6#rPU0TQd$I`=f>uoyXF&8GXSDa$z zJr)-6f5m&O_tcqo@3HbsGM(I%^0(Z_(u1p-yo5)@SZ%*xFz0qOaQt*8QT-PeaAHiUYz4p+P9-JH_hY|NVfuPjCT6 zbE)h*uo558>FG)|ZTViQ3%?xTC)!$?|DcQwGmMz?2vd=}d{-DEg@Ml)9C&a36V0ue zPj`LHyU|?6(eu!8U`$1>##9iPirSX`e&#U-T*iL#H#5)h!2#y2&ZAu?n_{W?79|8< z?gW@)Liv~9;4VhfQ-S8V3fYfx7o+K|Ky&yb*%i5q(KIK}yw!2cyx-t1N~_EcGgQb( zrB8y*_aEUdm{XvNj0J(QNU$^s#c8i`7cbDpaC0@V80F#Sz3@(D<1qF{nA<U ze=*LS1O{VFoVgI^QewQh1k?r$Mg&DyF-HaI?$r3<2yVl&T+^`tw-G_htC&HbDw{q3 zVZMWRQiY%GU_Pvk>&%B-#Vr0a%!fV$6PLzn$2&L?YbW4Df=H@r4*E;%h{kS#|FBlq z`HwLPX7L~4KeYD1ZCKj_w~_SM8I2ZLRInIXSWnJa03G%wnm1tq$5%IR17ne%Wd3u; zqGb)Ula1bk82tmGMgIRr;>fT6kraC6DKMaa?mfK7PU!dvpryH`4L<>n);6;fU{Jv2 z(}rDpHSp}(%b)dGj99}0_@A;24|d_-G7y4%K6sMGm)$)#qYxCMW8o@vFNv?NXoyzC zE_o4TioTpczJ1MMu1D@_P5@K-VyJs4=IYeS&U<*%S?f{*Xmj-CAVl82RS$8l%h~q~ z%KiC@Kb7<~dwU?QwSIa}UOTYCxZb>M?&>=4JFUs{pS>PH;V-;wbQKX*$9EyZM~z$( zKnL2HJy5jNuPB5vLod7eoG3PMXM^kwcXu&j;?=!emzt%TnS06H2IfrsoNr)eo(FHI znk$+rRdmCiF?B^a)q2%j#kle@XliK=O}|EFrkm%NpF21nJm0}r%>j5bGcz5@N|X{b zEs2(|L%=7zp+0A3Z>RxO(tSxZt$5DtB4kqGhua=zgC7Stb zHw%bpTw&*Q{C>%fr4|cUur)7JRy>6@XwJZWP&6|+L)K*|<(Bn>_pZz?+FBH>fXC2j zueHy6cbGT5^R)RB!9b-#3Czt};v4~bHOmW$73c0ZiiaKU866yeTMmsJI`gMGXVJi! zaux$b_IxdbhTU!Elb5vAh4NdPePArLvZc8S^ZnmAgl@DnM;pEeL;GXz07~D~)rkt) zEbz6OJLEl+XERUoeQyQxXlM)1s6YAsk%Keb*7-nmqa-~7sx1^KvpqV~${g%wHDe&L zRehL)ul04J**7oygllV!nZc?)C!e`XaS_+Sw*{yN z0{J+KYfPKG5NGzOBK0V+QIDDb;nZXPiWEAY%4zXmAt5yTSq)1$HC|o;OaDdmqe_~2 z2#a)sumk~gBlJ~wSA&S~WWGPpt~7HC!vX_|Q+^Gh*!E@* z{8NPISQqnj5T3WYnp-)2A0ooJ!t2fbU0TD9Fl+*IKR6X{^~WK<N%%wG>fRCov!sCHGcx$ER{Pb0Zgx6i`Vwa~D(jrc%(p@B{-! z*M=Fmc|a?5>lyfsjldsUZd2>-=A?)lki6Ig7fhSMN|_jmoY>tw2t@H=cXNH5iHN^f z^dOMhKX2|Y+@KB5o6`(MYw~)SV?8xBm?BNPGUxlduu6Zy?BA#qCLfQrt!XCmlD0<` zU19=I6rhC|SNzbd7tFy1{H}cg^te5pc>%YSZI|fR9_Gqa{YCRg3}DrZ7{GBhfCQK0 zTGusum=ik{yIQ?&AxMEXBYuStd7%uems@1&K-{JE%6_;lnP-d^GuByiek<-;LrZ&@ ztKbIY#1s!}Mh4K89%dhm$AaiNC2Rz>!0#?gx?yZ{qrU_hbnRW5ht28ppPVme3X#65)-qMNli)C(999SB{ z`Min*zpMg7_dD#OmA3=C7;FF;%6i6JnI9bKWaAeNphdUAFzN@2m0$GotazYQWEibH z=x;KNk+k_`GjlR@e$0wEy47cyH^skVX3h$f%1dfd^@wXmn*9p61ZWU;%X@-7gk$Qu zw7J_7##n65TFiOGn(P&W)Aps0(Dq1@ZcJs&ps$@lWUd@*#a(7E8?|m<4xpiNm)Xk( zIACywt^w@$_RXYKahEfw_q6;O)ZxlZ=9Cccr6*~*^Z4+8zq1OfvYEbt?JsoDUE=;R z9+tyDhOWDm@$uO( zS6s(47PR0^bCPLcS`-M9ya^qv*X;kCkc+;S>{JBQFgB@v+EbJ zi%`so2!ASgX;cE;`d;=nE`Ai-^|a=r0|=k*TbRs)5ofC)q43AiZ!W`lrQci);|Unw zgHk8+^gitej!tL%uQMtN1G3uy?uT?z0H9? z`>=4hcTUr!U(B#cBw;!iJQVj@@C4Nn@0xkYgY<=s=-PDsTFc^|n`UT<^Y1Nqhi=aK zw*eQDvWjAR9tQrm#r6!m5ZnL9g16ZmJ9v!??PvBA5C%y84NiRjuVAsfxB{3LJO<|R zsSBA9l2eI)519YY;InZ)hb@2E;$D`uG$-2}rK@Z+p9be4CXF{y`tEGzXnE5ybF$$Z zXSnw^*FaX(aWiwOT)f>}$8aZve%@|=8SKc7*(2H}Re zyJf&`^YeoHy2H4bIf|PPQ|TUan9F7)5nuiG9&?l{%MyzY=iM>~Y2Py}v)7qZ4IrUI z_k%!pB%#dwm{LLZcU(QAc^Md)sn?ugYb-9$)09XGzW^hXr!w`7(l5Zs6pYo>9m>!M z7@7R6pQ{Q12E@YiJ8vFL`Om)s(cK2~Mk{_|!~QEhp8v=1|3R0**y2(9k54hNTmg&vLU<5{Tom4|0{%Y&ZDSk)Y5iB`M0nUbn-tR8&_Ta`xJ5sy_X8E zqv*)6kN>@B`Cq_T{zV#D_$Xr1^}8C4^gDClz3|Ns>O3BKd*8h}2%mkxKm`q|1gN*Z z^`HT#gFNZ2zT|3I|Erm~_SH17f0?3Cr;xIlPv}Zbn1KM?c||V-(yg?hKug(ua|>3f zuy$^kVQO6xJgB2-+3+W-jmTwjy93#??C}Q_Q2S& z4h!T%yLD}7GWog+u2kjv&=@LN<>o~b`wVuoBnqmNkjh^{muarx5Hb!e7ibCoD=tMM z$-yBOstC`-3gJ*mn5Shk_2KYv7G#bOXWMX$x@i$R0a);H1508OfyXC2F^Tf=6yvCV zN3{)VKNKHyYDg$q3~HB{ZSoUkXG*pS-3iPpQtrPwbeQ;+iIm0 zEekWSB&#)Z>Jzno$g|bjHQ83{{F>r0Ds@&f$k$C>@4P4+Z!G!eL!;sG^nQ?9Q~N*} z%W4Ez65Ul-gRsF8=A-5a&MO`-$v;#qxlu2<=JAsJgI4mcFKhElLYq5WIi%N2rGx(J zWWy@>lFWjEw9nAcM#8UK#PHuh^XCh{yxcM6MKg66hIg+^D z)t^j(s+;rA61ylA4k!zA6EDq(fbMEH>JX@E4*J)7o07R zkCcC~&B;Zuq=u-i1mOxvq3TzTWxv#+zG3PpVGHF9|FP%7XTnv3(B9H6QoY7v*E)+r zzTfTyK(c+bI?;fMorzW(BL;Y=NiD#+zTTwPffmh8liCD7Nik|7ujERly`f9eC+L->~SoLXdHfbokt-Klzql7LLAE(B7?fUfqJRh`zMe&+n4^ZbgHQv<6 zDkQVU|3c>Jm8E*IT`Os7oN97@3B&Zt7Z(_WK*P0_loc8uLAT=6D39Vb(PB;CPRRDA zf$=ILd&R4PF3Xv5fe#hN!?A78c-75y(>xQDkUPEwHYrI-dm`r!$)eb@@O0BFu0|2O%)oO|FSs&eO!*mdL@nJet7_gIw!JT_HE)F3D zTe^8zV^1yuWr5A!V$i zP7yj-3hJoy1-?t3si#IUIKNg;P2?Y@)KdpRAJDbFIsiZK*H_=h&z1V>VEpuMpw1K= zE%zI!Z3TlPJdy6W5lqoZL)_@)Mrwv|(_(3)4ih5U$9RgmCjzf9lcyGE9&aVC;*Req zqlp@Y@eFLDHbLb2FdFoJULe&Rth#z=F8ZL#1UE0~Weo!9Y7;ElrlLl-rs@cQ zK8nPzCi~Ovrl30QscJL+(WHGWZl+rB@x$h7si9yUl|HS;)4&$0r|=^UZJ{z5^VAmV zP=Fyw#CA`kj-txWjrF41(31^XcLIQCt}Hd)n|lB-xnbBB9DL!C`DqnOM%4Xj^?k$l z7S?#Jh#v(pQA507?bX^SR%du6vUm8%mb|YSEqPzZTBIzzVqyb8)=0br>fz?Lh6>PMhDwl)_mycg=u0cCsx~1Ik5_O zmJ_R<&#E!PK+1kr4RU6kZzjJqHGoz;tA?QSozJTAA@=q(H^HzR<3lCK=hRx&-?MoJ zw!y&FM(OO(@L-g#*K=yU7A&xmZP~fDf)SyVbb|6ehOk}F4zi&?fTX+8bMqZcho4jH z!>G+OO=V9KscC8~mbibKTH7$WjOL`NHIP}tzNXRlY3ea#?rpEGMC#)X>K&xsO;=gq zRF4dGk)e1veU_o70LL$9pvEXNcI2%-(@~w|vdaadIYd4k)j+!45x`5MgidM~I3X^6 zz?={d40^{Ip2x6ELVL@a&gv$1t$nwvIugmdUDc&5xuCl`9ZB(d&=d5%>;>L;%NId@ zq2uwQ8q+&>wky2Y#|n)c8eq5lGRw6ZQuXUQ)I#dpS+4gT931X@IGB(+VN3ZUwcD1` zA_g1ba?ZMaFm7wCB)DqLQX}Z29%>-AiQGd?z^Fd&p;pGvxgP3Q7{=ihyxZ?y$NVS0++g66%e239GU<_OomTu%|ovW*;G)REvy z#o=F}K@1OXzN>~*(jp~sVsZ+^M7-)ip@Y>3uWK6CFrs%24y#|O5lA0IH}#6bHgp&F z-DRx9E_eL7j{iA^{VCr)K%27E+Hdx;MN9IxZe4eAp1sb!Us!ck=jj~$8(7~U8@2lQ zEW7JN)yV6WPo=`A0504?BIRahl97~OKN1? zx=GFqylBrF0Txf@o{v14(_1g8A+8#HJJH0K)VIKV+VEkiuwt|^hU3#XZbqccc4M77?D1Dk?OvV)3!Zzd0lM=?3?_$x>p!az54-U+SA#7 zKp^!Z-R;NAguTJbJpYE;Q)K93jjY7U01tSJb%is|so`+7XxDP>sV{{Vb%~uFsEdeh zZ>UK=TKrfz@`NW`b_zZ9rrI7I=f0`NBz)l4+#{hnIe5uHB$A@B6%57p;j=dk)ipjvx!`bd3BSC%G(J zy@h(Sa@5g`b*z%h32x6^bqBu24_7au8TU{4IFde5nGfApKT&-IK9@E6T%-}|PZ-ju zk*X`B$&*H@@3EmdkKyoWI7a;fsUOF1c+?$>k7@M!ShXd7mXGBO%HgqUAExhIvaeBu zk5Syn0|;589K1A6WpTzf>67?NVGfMq<_c|OAf=ss6$2gUN_eluxaqiDtX1Kf&~7ZO zv!__B*CX%oYN87x&xhAiv+-&?Mw?$cKU#?L+FGHbbhtWGS+wMB_Wqz42?>h{+QfyffPFe=={G^0CooRfcaj=yI{u)J#$qwr>)8)fn6XsT zAg+nP@3!I8VG`J(AI8$a>1qV4r4)c|*~7aw8B7VjHwAHz-nEH}C#&tqRbo6hEtk|C zPL2-Z0V*h*N*|YasdXiYcd}Q zwJ%WJ48Ofvi2%)p0&M{IC}$4V;y|Ig0?iJc!{$e~=kO(YZLazu1I`G8hDgzrEvrEs z5FYb*!R&eJ`<@eIQ$0hG7nbMBZZgaV%Rh#i%~z{o49Hucw!>yk zU7#{m#a9=A5lo}}1?o?1eiGeWq*kF#3qhoAlIJ4z90qc2kviB3_%wxl7O5GQwTp2x zMzal;F`%DeaZ-Af!K4e~_4np1{TVC#3HJB=Y z2B!3RI`SEAD$iTqU#l)>1FQTwsJxke{+yG|`1PFLwOx-pPMT%JdfdiPM)`u5d1(VL zBX3Y+5yt*gz4ZjjSg%$yuHjZ6kRQSHdxN@GSVjxKR2Sl>!$x%~e#$qhZNQBrZvr=> zoOT0qChq;*3!F?B8nFo{K}T9{&AO^(F_*Q5%{;66X1&&3d#xNTYq2$}K(ICVU^66c zC(D=~Z%VNm3;(~MX9kMAu7=Qan^ZqKwpsNJ-lC6KWW#}@Wb1Gi7o)av(h0Rs7vmn+ zp2lubrx@-#l4+|tiTxIB#mTXZ3b&~XShC%AwU2;+mD|6J#ZBF zA?}h|!?<7T47NR%q+O~DJ1lDNW{1XMYP^So^|d`5^yBw1(9^Cx>SVOibFbF(4|~-g z(c_hUT94-aIJ3}m_yP4}mmi!kz2mfMyIPsnWJdVWR|nMhF_6@Qd?3%3s0usZ&X%YR zaDbntn!A`3s#Lv!F+_c(jiJgRK88+*)L4`$qltUe6ytgOl74!Kv0jvVSbgXO^!=K$ zj)KVaKBC?S+tBN%dH^U{;~01pmivvCn{ixKh0iRPj;oOj(Hu{yxlXc+_$`H<#{FR4 zDaa~h3Of(hqd;YtVdU z;kb(&ZsRX$aEtmzZGZ*o_KkWQ4Yj+BDIcb`<>+Q4^@=_FM4eY2DLlij+Nu&i6WiUC2Ukv zqUg(*WWp$V$ep6sWgy-#nsb>8-FBIgDDcXJ4779Y72sY1`CjGzdGRU})BUPQ=@@-= zLJ4UtnU5JVH@LnD$kghnKuqmVRRHF2i^_mm$5R!6>1|Vmo>|+b3Jz#zQw3nE zHkAQ$h8L&l>&_Sk)N3hcG)uIRqnwR`l0h$v7R0hrJfhvRM#z0koW_FOupxHiH z6`;8`SQVhzJ46-Jv`?tYpm~a}6;-PQoR*b|AaJKWD5-752zn<>6}Z(RTxINR8NogL zZ3K_P)5GT4n64R75qg^D5;8t0s1yETRhR>=48B zykAsh?7UJ`6(O5$nnW~!9q z#LpJTq>3toXMAOq!85Chnic?2HqI=fcnob=JE5FC)$O)8xvDA<^j1|>An2rO+)NV7P&oUjqlVMM z+Nwa%sq*PcZB<}j@j9wN&~*9o`#P#X(CPANBc71tnoKfNzI?MTCz&Om#^VV|eyOVp z1U+AuiSVz-PqpgtQ`>r~M9>AE)Z9;vrrGsW7lQ6jlT-0nJ++MIV2iSd_O>e-K{54J z5pBRdZ5szA7+vMSZm-cq-GA{I3F^mnZpzkyisXN;Iy4nt^WE)j$;h zTcja(-&+lty6+ka>Ks!VsuEz=dBVIfCz5iTsP6+{D>qdcU~|mZS@R|YQJrQg1MDV* ztxyvkhnlH_tt@7D(9{>zBJ}l(C=)aGMU|D)U7j?f!N>?&(n1x=Y2-^PE2l5NtP16{ z`75ee-4A+270PLeS5={$e*CH`l+&2kRH2-Pysolx`kToxxS#D-PM5x+3gz^W>l-Vl zFSis>OSfAx*3z32YhP}y?(-fmtfG0Ir0keb%zjkzoDEw=FSX$gJcdw=J0?`OA9r!1 zV|E(}!`X=p!$aQU`I+?=!*GFFah!zVldfzO{5Iq8*0&jld%wdt?DH<;aO-#7I9!nC z$2dIuT?X6T&QHK$@k!ut$+rBdWm`86J9AB!pSC+c0f(KRinnv&aAG?Xhv7J>$q;a# zTW`H)QtX6aXYTDHw}jva?HGa=yeAQ`d3y=Lx$PN(b2>;Q?EXGO@UHh6f|EP)q#e{r zO|xOL|LsYZPu0ry`?5BnxW3t0WySUFE)w_N@5=o;qASmrMO_(u&vj++9neiy9sU7> zul++=<+6MC6&tIDrQUohO- zdP}%1l_cSosNt7@+s#P~xAnecxV`x$!|fM+O}L#*nf*X!&~Wjy#<8%Ugxeb5NVwhjtrUWDC28B&g6-$In>X$|hFZ_>8EO}P z&t13Z2ibK^`*YVVw&^!-hSS*oY93}~_W_K!pAJNI!)TQFf&FP9BkuWuK-?7SlFW#^ zjH(X;;{Ke>h`U@qJxXS*tU8DhccpweY7oPzLq6r=$&#R_aEjIPUB?to@w0rIi6_*$ zKZQZ;UJBC?JD8tZ4Cbd#2AhDp(ME0Bg5{SFb_4FrNpj9z8myMF0dRk@QS~9Eqo~Rd zRm2ObKLiua)LorP#|&Yd{dEX4$`%{NHWY;loQ)jHI9qina5jaG4P~6IFpP2bgJDe6 z$YFvg$Kqio&K|T;{Jl3LX!_R~@Yayn#FI`;hI!@c2;{v=jYmq@J^YVTy*x?+a2_=q z2>?Db3INP@!~&ZzU58Q17_}U~IBCAf8Ka&OhJsTz8ua6k2wFduvAFCwiN)`xG8VT< zV=PWhV=S&Vp0T*!c*f$26Bvu*Rf)xyOoj|AjK#lbjK!B--x!PE)ftOz#8^C!Bo@Cr z$%)0+ZIl?H7PH@wOewJVoypwEHxaiW0<-a!i(MVdCrd2OnZj5+VJgqwjZ+zm@0u0I zN-VzT%0_Y17>j?O##o%3&R85how2yfbT<}n`WYc90JzJiGvFR~egYPYPXdc;&frh) z&v0Y0Ggp@Ubj0}ySnT{%b*2l8yUheEyhTH2ngzgC;7oNyq>`BHKZ`MU^(+Z|ZDvc% z&7aMfyKjyJ!0+ZV<{q2Nz&CCl&)(Gea>l1o@KUvkeY_X13%HG+F+o3MOE?K!stTLI4C=fw>Da`>KPF=}3Jl4TD+-a4G!;9qCl+}#G5kE^DuC-R;@Dh4s9dP*I zTE^j5*D(%ztY;h^xSrX))&?~n+HUwphTr98L~CsHnEb8F zv1+4)-)6r^_}#Nfw!PbC2FR(K)vp5C#InIGGn%fSn(#7x^sD+dblp|Ia*wUvB6GdD zRjrS;-X=3`5$bkkLJiuu72Mp4zS+h=+;2NZZx|WkCxO;%=X&mJ2M`aUUOO0wcTk@l z0Ad&qO4FqssxJm%r+nqVlVNq2d@6lmLRtUau0B_GQ}8axq8=Au3tGRE^X-u-|3E&} z7PyNsI#<4gS)nYY?&5U&8h6Oqxw!WNOU|U-svSYt z{FUFS%M56fur$O+9X4rF1SrGgu3T*!E%7ltkC09kDF{+o#Xx=B6DW_b~ z4#&^AYOaXdb%kaeK=;l#sP;nApx@L4{B-(_yXLz5w)!_!oE^F$pB~7koARmIA+;+q zOh2Ty!q3%1>em>~Pk!gF8u_~_EXD_ZS6d+aJ(;1(Vf70<{Y@dispV&md^0ebcAZw=zv;GSe@kQG5$Tlywa?#Ou&lscz& z9JOxnP5^bgq_*=)y@x%;7pTuQ-zaK!MGdl!3Y}b|H4dRR`t3wXioMJYPP?LpTOS;z z8PPvg#wnfDBGDFjmz`!QW_gu%T~^!v&y+%m1>P;F`H8#`Dt}e|1Kk3*v~>0M?TDxc zhj-#6g*<)Z3y(8SAL)Jib}344T~h}HNUGyt-mPo(q@+a=k#ysl`Vr0DtECRXiL($80ss+cEwFZ_mDnyK(Y2%%x&>BnDyrm|>DTn2@ItF7m?zTD?{a*JkXm71(?_cUNJPo;{HicuB zLB(Pt>F^yWhi}n_&2WMH@Qzv`;Kbj;A4}e*VywBIbh^L`)4&W4AW;kZc6_Oy zeN#`qz>@&I6ikU9%&a?x`C?aGc2ca!Jns8+L`maXPL8mH%7qkJE-W#f-U!iT_em4DI+^O-5VZ zxR0NcwBtTn-#s#%KA##25bce`{6|r_&NsPP_e%z-dX^cSB1%{guopic%5v;^hl2S0%o3 z+3L=M_)gt!4lnH`<2zAO%_SnPW8xnZqvfl_^pN3I!S$_ZqgAUMCj-kt@m8FkAgr!1 zaaIM_Hh;G#{t05=x5##AFrItNF6$BEXV#;h?8Z3Z_gCEimZFS@w7Rf+vdo z?W`v)dG$hddVn&}l{1d)DoIx(^&qP2sf96!gwVcf<6;9(j`3ul1Hlk+`^Ql8D7_A4 zcxuugVaUZL4Je_69!QVzO1P}q7o}IUYuF3-hno=Lh+p_LsU9&&RFXJvqVVvrFSJ@X zW!f}9yc#qS4*cNQq#E_JprYI$k%Jb-maeYH4X-2-2Z@TA%`fqWb6S~c7Y zzG~O{`u}ND%#}}E3>CaPES5(3X;J9InSNR-_8MyWYl>inegWDCmg#h~s#b#T1ZZ>c zYHFaSqWYRaT4_AB3qlp!=xUHAY;x6tHDO_m57DOJX?=($?7=?5J9TL-lE#E;-{ZAU zm^KfIvcj~#@v|tLi)$XCy)8(MkfcU{R9xZatQlkrz8ZAjJ zB1w&rq{c{6VTM>jgI0Qdg@C zj=fn|s{t*pOg(Kl4t8hM)0!jYm3o>6N{80hf-IH}q&Coc$e|G|^QXU*z)IwLl4P(WDmIO94x7+LSnD*1QUU6!m$W-b-soj*DH?O-Wo}HhSG2j%mJhvxVV^_yU(q@tCUN^$wOUxBjCmDF zmO1vks+AJ;+;~kJiN^GQUAqAqdcT2zN}wfgXyVjcS=3Dosdt%7AVjrvp*PHTP@PgwPRiVnL)?LTAs z#(u`s?vYO(-I>}t-L<-ckU6-5H5!L~a=U}tQQfu5;^kcT%NpW&p8MHGai3#W5|!w| z#P;X`E)&H5-ct({#Gd&A$dW)Iy|ondbcWf}rKpBINSMntZ~GECR`8}on|g!ZpXhRL ztq#<#QhhLFZ_#Ugv{wsVR}n|9r}WW8bm+Z(wDQ)YgXmr#wEYNGNCIQFqF0i%eqgD! zNsNdOlC*nx`PY})q5z1p)g}Q&OibI+SBu8yQ+>6`V3Opom`P@TrFF#|vGvnl!M8X2 zfq|AevioT^OfHAxYi+eSH<|RU))|R%zXh)@bA0@rwpW-*eQ>Byim*2QwIN7$us=qx z75y}TSvqbYQxlV{b->Gh$=XH09i!H$tXY7qh!(uZqXz`LJ} zVBTFYg4y8w2%y6)DnAls-=dBqwHnsjfi!NUWQP+LO1jWKf==MG82NnnGnP!FfS`Gf zE~B&*s~GZ=qqP7r#5BE0S_MxvRJluwN2Ekk8fh2MTm21f5zx2%L`L84 z6Ct*ak;f$N^zxHY$v}6Q9F1J zCyAQNtkQHYv&!zd%qoHNm{ne!r*#9>v*$6@+vhLuq zfEG_^WbwF>?dLY0Lk5fRiaPb+I*Bu`HXUA@{0X1Mk%w9f)>Suk5O z%%ovdPO0BM7xuw+Ap%tZTE1@{&QHTS$m*?o@ z(2g>l4OfHHu;5=wHCBKHIPST0(JIi&4O%heJh*}Ru<}Mw4WR0p zgFIlrU(Lj^Ci~6)1sil$jaT#e7JfK z%izN%m0+9&SV8=-m*KENE+be@u0*ik_c0?*+s}+xu%8(*{s0eF*8@CQ>H!Q^I&C?i z)x+pKI-tEN#_Tj%4r0u@AJnRd$3NvGIINN*|De{K;j85D5+kY}(aPem!#OKujhql; zKQFl_0Nm662y@$mBRq_ABXq##Dl3Vqc#278t4YQ6}oWqf8>n zr=3Tc#D_;E#@@1~TaqioR0K?m3BE0>v&F>(gV5W~Z*GA5%j9MTxDCg^GXi^O{-OB_ zfLol;0QY-7^IQ7@ts0tgUpU-95l+(!w9tUmQ00Ny*FiDVr$mzoI#{5c#z3wMC?s=wMfQ zjge}eQ46Q|xf+an*EC;z{O+1I)*F}8d=#7}yng<@Fgi0=D^AU><7)!Fex3Poz;))w zlh?T^-Z!)#SkEN0!~ja1ul1qFH@Lc{vnjeEDgI2x840`OAM$l^}yFNBwq*b*~ z;R98{J#j2(#_IQ?1&;bt-fc$O?7x_YzrDjeyygz`@clc?APw&_yL@pM46>f4-<2BV z9Gv34ygrihM{0hwVF}dqBKIV$;>4o!i>F}jlK%6|V`y>3ApVl>X(O4nAKce)IX?|H%_)GeDtuAFawC0WqR{dq>_&y%G#fq-~*)?cw)@V`oHL?Tz zF*)W6fZpz5WE40<&Jqq(QYr@jx$j{ z%0?vGpBYBiy!6VUPpr}KF~@^y?6?s@Exh&Go;$3{FO+mDA&ka)qy2Bu6mR`$b@iIJ zUemLy@+&%P16&m}@X-Uj&;BVrvL^WGF-4sAZ1c9ZUD+xbs0$79(MvH!+b|#xTSh#& zgR;X%FYeV2ByGnT)dQIv>#oNA$)8i3ZUej>U;FBFJTN5+cFr$>AIq-!wWxZ>SKgzo z0Xp1O-$h72qZ~aB&=r_Ll|a1w1zJF;;w1?P9wFm1WT3NTh&Z74oj>c7x{YDok^GWS5 z_o9s{X9B5O@mE9X(-2)a5&ReS!y;@ybh=1)8~Q{rc4163eHja5B5Z^EYE5<72A?q} zB1$Qn6W59&;r?2f6AwvqBEL#ho-rrRUm?wj^JNw`Cq80xVhq1Zbb4EG6E=Ni`i$su z7MGc`#)#i4Qf^9yE2>!15_U)1M$s!*OkKGjCUS&GQ4G`|jCodNG5_b|vPlXvqSF!? z^y&q-C9?Rd7g|H!gpy_U;CMDY23|Yl#o<##o=b;FX?>xA7>VNgOKfU{Q2NKFMs}Ip z=0YW!{`-<(HZ{vQasGp0_Y6i&Luq6GO{!TZQ?U#+A_7mi%1f>KGTN zTP&8{loqd-#Lx10y|$P21-M_aQv7m6Doq}c>gC}P+?krEPmQL^CG{HC5!bslkk{e7 zE)(L*=t3#6i@^eU$DUTn7&T&)*HC(G!H*Bpe1g!#Ef?}uU3xU3!lBimbL^_S%P zP|B*P!$VbBJrZ-tQwgJxYI79*UeZDWvS~)Zi0C!>?5A3 zDPB%*RIIf#E&(>UWZPtDGvQV`lDY*1Mo^zh`bTuNoIVZ9_Oa#l5|%Zzq`dwJEzPK) zzl|#-mWp~6{8X!`zv?wXG@zIuESyp+>P6Axi!17JjS3U#{RENT|A5F6&i+MVC1hc} z>SM>EVkJEsz1^&mUIe2R&-6J!pVeaNuJ7Fw?vJr4E%L(Y&H|cHS$_yB)2iqnV7s%d zv?Dt=^1PICoY02;52~uS#`%^mRrSgUG3TjNkOMHQs$P?yD@qcsRMo`>Ye2Q9+VihF zT?RZBH=jKf1U%k6CX9Zlrk6%jrdQ*pR4vrib*k&r(bb2lqpMRKe^p15(b$@lSwWAa zsde?&sb@{y2Q8}gbc<@6O;4cInqa0(F&1@XTQ1ZDGiBgm-n1P|-!@eL(Q39g6sDTXjV0qNDzFr0sV5@1^^>NOCZPIH26bZ+Y`g#%Y7Hw;w$6J=tg$DXos1Y+3 zE{LK>k6-ep+=hA^P#xb$?}48&jr3S6_JwoKghGj3-w3+iCY)h-f%e5EhwF`XaTl_F zV?7qbxu0^@)eUoe-dOJ}tYWN!{Qsir-w{=QPOtbL*t5>Q_BI>_D-7bHRImWrh>%(3 zo|0ME-Yn@;7ygI@)B!-5lSMGx;IDQ>rFR`)*5VuJ_LC1s3fpM$i+Tf$S2*QN8Wo@3 z;d@WGISX$A4u*%dI-iH9$9-AB;$LX%)Jtrge$YY}`ponedZKful#0FN5_MrzeAJ*I zzbKxr5CBRPWi8DpOKV!s65-wkeTyR_d97y&ji!jyXo|he8clZJCC9Aiwwp0jwo4@v zG50L9DCbL$C~xJQc;^hF^2HKg|9reKqvCBZ6hx&nZzfw2+^yU2B~ezf%{}y`;v7HB zRA)u}FzaxO2%Qq;3}c|QW)a%wH65OrR?xVwm(=n8Wi?#Xqn!9AXT#~l*Gt5W9=HyO zoEWaR(QBg<+<{Ua57h(UT1T&mw;U}cx93cM8N-dE4LnD{l-KQPtQ4}dYL1yApLqj1 zqzAUzasBr_)X;HS5ScBq5<^=z{otXMmC(7slhdZ&W zWAne=iQ}H?MEU$YomkupUaM|D<$v$(N$oo5 z{jsp0adP2Pe#?^**EOT+$7cF@oV!t*Qf9B~1ZYb6aZf3JPCRz{> zMu)*Q$_(!k4dz+9LgBZjx2s+mXBht|66)jO4edT9bypna`|t81W2GL5?e`D6>5Z}d zKE0d%1FJQj@UF8X+*6r+(t{F~--+?_lBcs+?d|k|E?l#DQAnk`5tRLb{%Soa{!gn? z90^gJta0l8@DgY$$gKS1xD^cfAL=j#I;MQ6zhS}B|LjM)*e5ylvAz*1!|YFBgTkTi zPxS9_Ppf)Tvv5b!r!Yk^g&|ljBF;}hlI~Oa*F~Yi&yBbAbF*$ysLBBTztkg5IV6r7AEPRt>&>v}=p}xRQO4)`FdXLcRAOXB!Iaup?@QS| zbg_SSw1-|FiNbs8gRR)I&28{gI4$m}ziKh)R!{vK>!3^2tC#+sr9W-yrEAvHnbheE zSix@7m@o7g?uL@G8#aESe}Ew=MP0hrjHE`r^-}1#F1__S_5`JjtT}+vW~GJ+$1loS zuj2k?S#oor$~JVow_dUPM^5*40j9U8|I&|&m%{GvoH6Xmo0Z5hh7T6u*oEV+eHPD- zjj*n$z*TNuMt%C|4ZZR*?1*nkS$){9;R%WS#}cfN$Y$1d@gJWw0N&oO%Zr9KR7F|4mX4@s(g#RK!n zSNb5iAgf1-O>m3n@mKmweujrqUpCjD9`)3FS(jg>b^UmlBEQxrn8Q?x_I#}i&w@w4 zHpi-QdSboGIC|H7Ktnt2{Q`}x@eQ<`*3|nOU0g+7^o?EzKLy`F2R4U^ihZkl`^ixP z6K#Yd{O*+El<=+Y3oku6rrz!Ud;=z3+c`(<7k6ecE&uV5ZIUN`*h`N^c1g&>vgs<5H^s2TCb8Ya*(J`=PF~6C6J;ZTtwErMk2EP+t?CEpZ;P2nK%;2`l zZFIMwzUxA52I{47Wx*3y7P`G^3$F~XHfQ)~Esp*j#(#ype0nK|-P9q+ zVN$C37NKDmQX}ZhKs}<+DGG7f$R`=vT32e6j0ILZ>XfYWdG55=#=h&=ldN+f?vUV# z$1U55;~KMq+lJ#B3#GU1m?Ac*@*>7)+>_dFo58w>FpW^gvDAumU&_P_)_Yw+jj`h5 zpvIcE*t?+xB z*z)W@i{d5Bt09y0k{r8>Hug;S;XENS4-Vxj?sJ{)0A78JiFR;VDDCTzRfD5TL0nH=z3A!)X#>5-0Z8*5If?E(2?%?TK$r}22$eD4n-+z+Vn_At8sdc z*@A3Id=0vprg!__-GYHl#s!jNg5FsOSF;7e(KjB^gf?_h%(Uv^76cS z@&B$VGw7iq*51<}8nJr$sh&Zz&Izx6^bfX;Sn@NjA|ORs2saEW@)(u+Z74!V9fLR{Gqdwj{b^f8>4 z%+kN4tj8yUthu`+ahD1aw|R$?IN^sL=R-kiG-9M5dnJ6|Gp$R_l?7ZZRKU#55h_Ucfv?FeXURJ~5$!aj~c2H+^4PoFzPc%nzk4!PIayHh){wkE`|On8ALOz3`JrIn#_w&LDcP}5#bvm*GG`Nv1{}}SgK83qwj#a{n=Vf#W{3zt^SHvwg;+@ zp!~IZxTDcJy{*ObasVV=@&;^SZCJ0@6OU1JZ3}#T2W`-Oyk>hMeKbuwpugi+gv-Zv zXz*p~zd^4irg`;)dSg1jLHGCEinSG8-KxLhXtq%gwpcDvn;iWk{H(~)<8UeFP>%i~ zo*MpwjF^HVV^kcMXvJk5?_lJQliGZ^zELknk$DM`bpIFqn&l#0+JurWQsQPV>C4Uf zhn^P$lrnU6lU~u&L&1a;#Rc$M3io%oI7gdbVW#%H5TKNIHLr>vuYCZpF9ctp%Uig( zz^y0_$tsCtm93bY+^7>UBj5xrh?)L5maXr>33PX-{)#2r(QFqi?w;oY z;ENj-l%(9<81ZuyyobxKu?NKAVbEN~aovVGw(3WHuLDpFsbOei<=6{|cH1qS#V|r;UWo&TTcl}#`q&}us3tX4#qrl=dd8G74v*Vavo?CbF1xo0+4aW+O z>lHcCBzL0Mj_bm!SkiI*RcHRwa|8Gu-WK`kDn5mYqLIt|gnG}uK&d^B!8^bodMsCR z4(^&~c8w_eUo5H4%XV)T3%<2~=r28`6$hN)MO5<>dOS|z*o3p~kV64{5@+BE^wPZ? znsfqo@U!&G3G8vsEAYU|@a74f7~I@@Tt$Ja6_j!M*XEX^}z}_n4T(zrwv#f4MFry%6IPxo+& zI~Ha4Qf|$*03OEFCJ}}ur{qiod7l&k;c>3Xzcte_TroXr`#A7{661(78V&^-? zR-!GQj@&Xd;y>A$bD!wUxstxc&(gO@(AVle*O{Tlf~Pw3E)|^Y7)HVA`YUvEiqQ?X ztKOYz2-k(m%l)El;zWRz3Z_^ZQC23_j2(V%T!Wf7$tv&c`vtOXna{Rui6fvcz44!G zo7GtSM6WNFlr4RhvTQ*axMJHYH1t2m6~RX4lYLL`x5Ft*m_Z`eq`e5k?R#s|>Wjy& z@6j99;c(Z{GAN8Tyhj7*&;taSHkmzBHfzPR&06jl@Fs0Uhf{pA7l8G&VWX}`8x)H$ zZ-6Ne9X2IIIgloNF1$;LpN2;S`6}}Egtv*bS?@B^ru?Kw#Xh6+nhqy8yp{`#pFDug zJFtaOdFc~lvQ!ek>RI9)j)eCA*Ac(s3F22U@w3-FL%jO4qsd2vyTEVJn;%mp@4>5z z!0UyDvS*!+pnx7!6dyA2!M1!EKG2DesV3fx?t!HG5|PwK`=+;zqz<1@3_e`N2iuZa zB58@9ly2Ei8+uZV^>6`o`;?-vUhshHmH78Oo;v$J?Nb)2HG0w0hU(;AR0{hVNqt`` z;*EtfwqGGjul_DWnh7!5r&u{3TKpLmvl^?OX!0s<^4j&!GlaH$1&Foj3&PnDKEs(*SP@=UWmlUV?j+<6?EJ8 z)aCUtxg!ZXgM-AtesrB2D%{ znub?xlBuGtGwz~zP`BMwld8Xw;^l2qEO8zoR$8A-wfLirLMBio`46Hx;{3P|4uf>N zO<@7jQIuz}C;;B3_D~7>aS$+O9fj<*M^Lqs6e+g0_r-b@r~EK(?*hySBfYj-Z3N82)9@VLncn6Qo$v;FpoGynhA!vxg^COq1b>@;w_&J zMrch+nMNN6$YbQ5sKOtonNtz80qWV+pC|@~$+FZuk1F`d1LWeQd^s_HqMVgb|Iz3c zlwO{48XK{`^5lrPEs#B$`r(vEMVj%G5l;DAsW}Z8L*guVB{}ZS)9Ky{9~npEa1Ck< z)k39JXwWvQM}cEWIOIVn&Wc7c8Hy9K1DPswq`F2ukUm0OhY=1XQ<1TJM*(a!_uRK#O-Y>#?jKG#OLL4LN zG2Wc#P2@b^H6DO%r6c3177!s|0=2=~O=$yOGu!w~xFO5-&gE7s6cR%i($tUQV3Nh0i+zA&m-P(f_e$dF* z8^`s1gpD`e&j_Pw;>{NEW+&jjm+^^xmo$~ygGW(uokn=J7nWWzY3-(I7qga5=(yCF zO~r`nc=JTX;d7p;7l{IJ(oflk8ZlKv_si1ExoT1N!*)81de{$`@4>8V4SK^HJ0A#S zg?MpisZO9gA|mD-ST5VqW+FASV#cOUrfRUvZ=6h{KoxAhVusSfDHMQ{U|@z=*)*7S zd2-&L;%wT{7oM1%)oqwFFye|SX+JJ4o?_PYpGM!{bj=^w(EPx7hgznSZ+wDs!W=3; z^I)F0lJBG)0a?&Bn4&ZdX~Aj*lo(h$($lJ#FhFP1(H*D__FXYW?Wf$em6*=8oqnOv zB)u}7#Kqma(@9)QJ%eLD%c(-ZSy`U|0N8ZJ?6jYAy`ph5r~(orrXtwf#de`)3`N)6 zyZ}=zL`Mf1LJ_m`;=jj&GQ^^j1uwZXyC-PcOv!?aW>Sj~IYDEUKdnMsh)7g?$}<($ zYpupqp0Gr-D9E$FauuCe#Ar?TX3_g-eNtBEFsiO#1lG>x5pae-#Kj3w8BUtql+6bo z;a{G?_FL{AX*7qs?>5FU#;8og=TJY)(uZ@XvX_v!cfgvE*@0$UL#Nd4Jr`11e7}dD z5@LJfT&nBMVjFP|h1{m#dF0DU?qlabNbRQcC8xXe}UR0rit|`bSC$hu4GL1=Jgxlg$@WJt=}mQ06|WMvE6>Hf0N-7-^xn zdsNmwN){&I;L<{xBjoc>@R8aO{!0EPoa%UXw5|&fFdz`LVM!-hSVB|sQVIYp7`USV zSg=nti-xSYvXmKZl7&IQKH2?6Sq4?z2?B$b0ikZwScop}fT^g-YJ40xO{RCs{_4v~ zIIm4x4qD;CYB|*bqRgP=ZB(C%uOMGc@|oy5h~t1+GN<7GSArXU;S{z~vmb)&o!2m&0kD@?)Pd<_f!RqjrFp2@$u zP#K9Xe@;&b{tas+>K<8RqOMy>e?eJ;%lpuMf;IeUx0V_+7_4J3pp3PcOSgoIz8(xI zl!09FW|@%08_@ki8IU0>mg~|H{*Y*qe1hLYRGs+uxHZ2}d5LhJ^{f*A3|a~l% zoX0>3#bEU=Rt&1`CgD`E<8FEhvwOyFQw_L`&Jb!qJ>M&s89p#u6y4*5hb!PVCyzGQ%DuKUZ_8WDsbII<41cKjc>R+=y|ZObN&mM?Rrny}zU%@a ze|@oRzAxc{rtgC$n@4&@jpF;I*6`Sk5BdR2)X6xvLf^8eOtG@A z5H?s^vQ1q*J=Lij~`j<6@G}KS?+ei(Hc+qxALikh)-LT1y5L15<6&$1Z4vU#6 zAnRgx*F4YM&v>F=oqpV&&;zcYl>O>=>L2IBwd8-=xk6Y@ad+u!dUzVbsXbyxup$t&(wUS+|4J&jOV#WS z`BE73QvP(>2v(tRVa;oO27OG_=?uN@302@{3OPVM?Q3Kfp$WvDr8i(*=y8@_6GtL_ zly#1{gH+8LvRF*^Y- zdvFpRHUj%zS8bGem0I9St~uZL$uDBQ?|X8-hwPX2y5#?UX42#X{2EMp;NN4?gN2Gq zR1Uf`yC(lL;{P|9rLchdjbg65#s7QP1u`s<;{X127XQDSc+lwvi~l3sDrw-OxSKo_ z6>suT9Hp!i^rrn7*TO15IzFItj+=;Z@g}PP-EOf8F!mO!00(ZFDnNl%ssN>LQ(b_< z`?uN7H}E#h`_T7KKRM;;(QWc}Tk8MhzNG4Zv8X@e?u_S|?q{Fq$+Pav|GX#9J=>G# z%zQNBIF+Wnzucn!@?R|KyWD|{edtH(mS{677FU z(cbJni}r;3QnZhG$fAASLl*6SvuLMzk0_utZW`Vqb|EI!Q4-vboj#!Dcc{(%u$BEaHby z^9Una*aLDb23sG8dPsZVFiy*m5^FVt_3=meO>+u-x@a|o339kuhg;Z>aMhuV@L&X> zrXGe^N{sYi3!(ognL-#1N72TLMsb`tGK7utCrXSmD!Nvwqa_8V)DQABgn4?5S>ba^ z{jr70NL0qUGrQQ8#(JUyV4a%pX-M-lr2chJ19N+^nA;zE^jFfTSrMZR{be)W2bmKD znUQR@FQ>ZOqMC)f<-8_80^ca#%V-D9puV>uRzpPBVvH&@)Y}l|zrVc=Y5tpNZrOGA zF@&V=>0?N<-((Lt+1L3PrrB=_QVO$QfUhCVepBJ4Pni80`5L_9pXTwT&`&Sa4?^gt zlTyrxPoB=Nfv3~mJ@Y&$Fr!d$iOLLjW>>d9gQqiPmcn>ClU}nMaybPh|3|waw*=s4 zQOJJ#T+V?N{sJoMXCUk$HT5(4d9$8BAC3XV-d#0+bX9w5;%}HX!G-A|xakp28*3Rw zgBCeUVC&!_N{oY}y%YY1uiP0}j6xvw12beYPnh-nf{Dfj7_SRMz!G=>z=l9jrujKo zmWx+3YmN{oEdK|z}2W|Uni>;rDLM zbPF>n?T#|Mdwm37jIKrd^RVc)LWLzN+uWJ|Ig4(WS%3vfv>OXXMGGv*lybgG5rc0i z7cnx>p51OFuc{=W>>;;D1 zMCGVEv#aB1Z7~U%hl-iqgy~zNxFOc)X~m6_UVFvjJfGtHpuz7h4(3l0lDxn}TJBED zwhFvoijU5 z?zmf&bLONy@9a=9Y0sOJwtPt=KpOHdz|*MM&$}p-nRYx!a!G^t^EQ;m6r4a;OB-T8 z?+OH$*v~ss#t0|{k$%Cv5X_Cg?wB5GM7V7Gfj8t= zQ=n5yIa8t|UbvXbA-CjrQ=%)kpdE2DIE#Ch!^I%@hD9_^kj!V3Yt^ZIn zz_?kdMY(Ir`g@#_Wqqp(EbIR+G{vb{MV9sV%?jPJ{(-AP<$)>d`yeea06`;pH}H{* zURqz#sDL^1_(>r@h+_qtbDoq+%&{qEyyfQ<@`DSNk*ExIXLfV!#!8Z7^C}t7ZU7EN zObp{itFcth@hz2&APD_ol++wTzkC%#Sn`G=n6z`Ro-S4~eB%<75oS$pi9eDl5vLK9 zks^B-ZB&c~)U~Q1HcvmV%DC{8r(E-|tjglQay3)@kMWcX{nTnK{-;$l>aa0?93{0d zqUdThr}R%nLLvQ|RX3%7nx~Zhy{ZG9*3p3KZcq)KP^fc+8mcpW6r|)aHMgOWArs$uDmI={6iE}{o!^Bz>cz1{T)O3pe zDTtE}(H}TfrZLTX)Vr2ZPm1+vo_uPDj@AP5u;fqol>36yWflQ2MQa;y*g`qArL3Qc z-2lk?z*#Z{mip+bSrq@e(I9ZPd}l5LXm1^-$e-hBiu^b0J4OCnG(d>_f%Tmte;!=% zK;(zacatj)@yz#RObJ{dUpu!02Q`3zK#27Qz@Iyg-30RD}nbQXc)p#lVEa8^?V z$e@B&kkCtz1{%N;u$a&QGR@L~2*n`K!N*yMOb^4JJ=^`IPvb%=KxShw-)&mg*uaJULp9B7|7tdr1`@nDrFoA~UjWeOqsQ<}QD zly)~Y3hfR4EP0e3<1O|E*SMMNc{p?}*WtAEt#xPq=N!6DW+}{}>&$%88oi*I;o2Kq z+e|0~D! zuR?iZt6v_))ix&3o3BZ=;V9}8YQr&^#dY}Sn4JIirz>`-jbDt_%~TuI4LJKywPK541{npVr9clqZF~D*D=A_us=PYwCaVPkrlY) z^BFnQ?PvKt%je^*SU#VV6Py;eX3>1!?0B~>aKYJ-1m%L9^7I&KA%HKYr+ngJ38Sl9 z$mTi-@LC(-2DbGs(Z5j}&c-r5gsJBhQ1UtaHZ;PqEN>25=Z?j%-PwE97-eJAqexVsp#olGT;DK4UdtyK2 zidZjr=)!;o_DAxySTjs{mwWWFsT-Vomvw{AZB5-E#U@V%4VE!BohO5G+nS4nA?AVJ z_;yYuVJLDyNeCL|jLInxVHm=&3o}7_J604j+qoe)WVpQi=o*jV6#R*SxQp-c>T84< zeDFC{vXO-fOH@X>Gyn6!7$vh{^)=%?H&R@9kCzo4+d~UDMalT_IxUQVSj#gnN?M?>!VkxiZuGGrE~PGITe)CnfqOr2n07pG1z31tbLAgc>1W;4KK8|wsA zuPbIdrvE z$}H9m9jo0vvDzjV4k_KC3-j^6pKWYD2wEc(N#$UT#0q-sou z4mOxjP``(?7;XfM6xt>X$dPR}wSyTwSUdQ|-CNJo)td^Hk*I8PXLfZp#r2fhLBpO# zi_j+z^1q<`iU$ArDlXrOLqe;18uF0PR_fZ`h@ik;m`;a?B-!0#Y9l@+Goc4x2C{yeR4(u%zhrK2sY!lBg z4(0+S#A)GuGPBqlY~9DHFzm-A8gWYKfc$7G3<9n%<)B%ktL4$m*~s7L+idw z=OGCMRPQT;_YQtHd&~s@hh>3*!QAe{s0JEE@DceI?H0Xp#P+0C5tt`GJ53EI`k9mW zs04+;WAeLm@}_*vllQn;w_Bz7!%TpEw-7w{QfB|kh<$iB` zh@-@p!Gq#t(2qaxCc;%g>&NA;xf^rMEZ9Buugi~OvDBwO?;mXI&!BPB1cLAZ#&=No z#||*WF`+dBoU;Ef2@Cc+vH)RKEHTh%iKIOSvh{H6KxsXM>sw6vaLOAf(X~c)+u{_M zTzD;Z-X>Oq%kCVh>1E01IrhFpt0 zt@+5zM_ZCj$c5SQVKVCny$2a3r5-TYORgUl4FWvyJRjmE)(>H{XOPhmm{2K&=h`qY zfeDecJH;rDt-(tvMl%>3D-Q-(=F9AZ=uvwoD9nDtTAdkBK* zAUydHL!1VP8EU+SlRh5~H5!S_0O>#SoZkDR@guM&)k_HXNa{V@c)K`^hiPU=9M_y4 z?I6S7;Aip!@o<$@&bPWcuAN6EAJv-8Zgdiji&A%$K3;OJ23Z$r{9h&4Oa>m z&V5k~J-=A?ycnA1shlhWBNt=D(D$iElw}i*Pc=HAjLZ0lAA6c1LJ?+z?Uv$7Uz;?; z+oKC29cIUujif$lh9A7;_$bT3h0nyGYM!{Wh+|Ef5G(&}UPfAL#`AdZXr&t*!iK%k zk9Z#U9fQeO4>VE?0M{1!!Z7+`o5@4L<@4HI!swoXY1NrBiuH@4_a_=(TBgySiAE>u z-B7AB$!Kf&lZH+*UPO1zXi+?j@+N_k6Uc9}QOU-al+&;Gh_Xbde^t4ZC5k?uY}f;? zFR&|7%9g(@xUBjvrA#&|ms@rr6qiH6E8?yp0!IPH5c8ey6^c8p%KqQjUo2f8P%qL3 z7q9RPbagTe_&q7R#`*Us-#Wc2H69QiNE3=y{T4mGuV@@DHXkNSg}`t;T4LkoVUZTR zJdl(>S{Cs*X4Iyf3K1W}`_jH&tA0-JOgBW_EqH@D4s&1jh&g3!J2;j>fikF~b&MC) zFfyX~6^Am2_rq5i#9+z}>Ne95Ze6ptU+nCC;4Z>_z>jKn$IHb$qM?QC>v%bqs@EUy z8F(t&o8wRgqd5n%snsk)c;lY2<6=1VE_b#i{p zcU5~AD&5gMLU1 zqpSsnxP|VC8_FrAcj1Qe0;6i+jTtz_@1g8UE5^o|_yd{j3#m0N6WYS_|A%Y~ooPlk*3DiHs$i!3SB}OW4B(Gayyv(#6aMu=`iQ2ZU z616FrMp3`v=ZlEiP;LYz=B*7wXMxEEW*X5P-1R;V_6!@OK&zVUAg7|*E_g=sI{gL0~v|ZQUd+lef{VY1L z-qthbw7VFm4T32frnD#4guu3GY})tHPJQaS*Rl6(DSaLnQ>tf%6Q_4Rd0D^ez*4&NfGEo8 zn&K&K!vKEra_sxI)@Ihd3obg=zHeK|nxM-Ewzq|^=<)|PL~VB5v)L9cFrWXXJOnO{ z*@CrJaTIK^y~J-LO3>t2LMgSxmWB=gqb0Tnh1bYYV#`NLy*{*kYMdj8_wY|0%|5c# zXBiCNW}9ia?oOw-*;rhg#E)&w?&&GstJM(vjeJtEi0%0L9%l^<_|Yu3)1LY}8(U-8 z3k;a<$obgj#ljqYNM#E)1=E`CHZLp%AK?($3MJfon|9WU)1MvRZtLoIevuhx?!@v> zV)((VX)V23TtVlzObw&R4^tnMN7>JD3S@>#Ph!VmOpHq%)^t;b7cz}&ENR}2^X z%y*I_-64baF&n{h4k^B|!&W_nB4h99x6{_deYm(Ae4c(`w0Nh@iwo->5?X-{{nB<@ zGVShj&eOL>tVX)F(>9Qi-|f}UmqEqVO0lo16pZ{%8xH$W)tsqIH5*S7?!JiO0lHLP360#%OCVpN9O2Om!n z`k^u`QYEC;2yWApk<@K_mqy;sT}Mw$)rE6Gmfg1un)hv@RL0T19bJ5A$Y-`XNbUFH zRX$1AjM;T)-hRGhX8f@Du(7R}wVuRtxwXuCxWRnh&v2>3PWJ)l3V58G?yHV{K>Z!%-eI5%DqfK#Gh%Zx0Wf$vEB5ud@rM zQiKFrdC2C$gHk~wLHYo0x~>WlcCn)Qa1I4=nWp7jKLkHNXgRT04u*U1d+96!)U(Uu zd{tf3K@9UuJj;_NJ{JA8*DhUj!CiX!EVo!isf(Vp`a4peHI(wZux$mMv;>- zfGqmPVVjHaKK6)>h4XL+`$G08V=(nTV!Mg-e(Vu!Q044EPI@mLvBmS(6R9NbbOf!n zE;st`D%K({fEQoqjjl65|yDT(IElO)IwWh5{ zZH)8Y9n`iN16RcORq@?>uwYyzkIZRK4UX9uZ9+0tW-pJV)Tb8I@-d08L94@2c2PY{ zCDYGDQv2bj{JhvrAE-;XS$xb^8z0r7lB@y2)bO=4LH0FgQUpev4{8T?uRL{a2u-?B z+ssM35H~PPYUG>33+NW`EQ*vu#Uqyod-J6nGdzeMI8VMOr*{Y#hG>9+FE8)y@I7v8 zD;NxJlxmw7L64Q&?qe4L|1^itmU5dnG{QbbUxd?%a$6F!i@IaR*>nb^(5rXmdEsGN zg{>cylj#*UE1V`6Pfh0KCxhvO3R@DJ(JG+PwVgk81P3xK zTwavcViyaP!`VpCPd#b!38)UMXzK}EU8p+WvnvCod~IW#D?PpjQlL=w*VwrINQ=M5 zmVG+C`!#lieM#K*G$+Dp$aTOC260V=rg1*<4RpY-Dh$v8d%ik5+H%Gg1dVPWt^P*S zI1?7lW(qS^3C_L^R`CE{CO?V699 zz}5)Hn)4$caRK)13AHfK?t5wh+vBGuoot2eQflQ%sAowhS%^DS@Szp)7EV1AFpP?m zPG-`kbGB`ew(RqmDYwJU`q4q~zBK(b4EOwtc7t}@9%rnJK&`baZJh*_p02d@2-&a# z>U{$Y=S2?uW7X9Bot3t(!f6Wl2@;9}ESbMXFtHD$2Y<5lgxFi`Wld@Wuz2q$TLMaV z^e1d!3^e8fSMoo*fSu+F^0{amDU{L+7j22gIsS;=y7k1>2wHy;BLF(d!%u+tdr`EB zjs;)vqvT&~{$T;y1SM8eQr)0E3hgj1(toyv8f*qC6h?;AT01o8W7yw1B-qmRZx6oWT!*S6Nm%_ioi+0)5+;lm2YTeDC=$@7uLD8mfmYI}QHQ0T zSe7|){9SSY54oX%L_D_2w5k>6e;Qk5(YMk!5Y)^=^Z58E+E!?#ENQX_S^v3@5#dy1 zEw$3v$;1|iwa*@jpl1wHsz>EFQ2@{?zoDfDsjZi-u=YrxDn9Ps^z1+Pv6v8E?h=L; z&L~QKF{oy`OTEMRpjwD{656Pm$^OIc`K-It6T_;FQPNg^56YX`B!n8D=?Xi==HdRd zxl>RgEip<-7-XJQ6y7M3;yVYK=#)_k7kcKKBnkP+CTTcUm|sm28)wbU(o0xV)|w@@ zrhIBf6rJgG$}Dxo;7hegi2xY-S)`16lpryr`c?+}IgO&qX!T&5%+Q-2vVg{u@n|}o zwMcBtHeR?toLYNG4XZCJ*x%(VH~6X&YQ`=S+Lb-6SrX3XZSs(k>tYwF$3QbVw{Owf zG7pK-7aM#NO~MsBCx}b%l(c~xL&dFpgIRvHY4h6yJ*o{{wx^uqDWziIcJQnS^W)f? z8(X)KR6Ggy{K%8KbdrJ?1 z`TtjM9*Jm@bzcNE@{tCiFOn(y=a?`m^pO}`Rq^Gr;6+Q{>`7K%=@8~eeND`K@BSR& zzj{W{V#^#au8J-5B@SiYG%K(L6tQLgCli9#R6Yl|Le0>pp^}Co|M_4`4g_23&y~mG zTIFFB8zC)7{pRD(+!74pW&B(Za&r@f%tXOAm|yDw?Mxa8DZhmc;qeG5#*cj^o?1{F z)W71Xk4Xr8AfmmOXG3*tdgTDO^in6*V7`5G)71{ZV zEG=>7LY|#%JNZUSksaARA3tYqD{+O~w&JHMH$Q&u%8gSS@>@JNY!KdU5)#zK*H2_$ zi?&5P{k7X^KGGk-?)msS)8D40f2c@K8R~VO?web~MTH+}!x1HN5 zYw#QB9(L2m$C=$xmaaiOkDsdQ`0#62b{x~@w|I7*l)au;$46veiyQNKb;`F>ZVZ}> z-9z&F9`~Y_{>&QP?=7-xSNdLTZs)gn`d-vwGf&@JWM7LjiKl;gI|ar{k?q($A1`P6 zb6G;zz}HCMi(k9a*Ek>9E0Eg}v5;H#6=LP_baQu*(4`*69=qw|=}dSNu8?pkeySSA zlV7_M<{Cb~g@nIn3A3-n%bK`u-9hDX@n~^&)5pV^@BuC1Q#BIy5ZSdWVPD=N>=thk z#N*u6BxFn%U-+!zp14!uB|n7!wZZLyf$dv;aI@EZEY2*?;0krg+F89W7Jlu@(vN4! zUg25#QPG7Fd<Y8|eS)lU3WWrdhA?6&4b0NQC@J$4IOJ!6F| zu&>0mD$i=;PKq_gL&(@oD1rLu*uzpVh~@aHO4yxWyAlrK3A0y_@Hr&>1p7){Silo5 z#s5`x2(DfS_L`5unbkMALROdYQR zO`*(9G(c>4y-_@_IBGC8;0Yb;-~}0&B!zR-#36|Gasf1|{V8|%>Tr5JNs93}F(m=O z%>F2r%4a?Ve$5WhDW%wz{o{EHVn1T>*pgR(&l8z z3y(fYmR z@n`J5Q)+@7G_QfCru~uemsU5Fwql2q(65Yb(CmG_NEY}G&75Dfn}w_{Z6q-qt+EmH zaFqfZOGA8j{<;?p&J307e%%Y~Z+Db#OJK1=A6=A@5$tnxO_~16&NZ+1`7sRem*!$2 z1UyFNjipG#nKdL@HZ`G!sgj2Un>XxF`%&eADj&Ufb;;s37JVo;jGzMQ1VKF~5egS6@t`4h@!jP@gp3 z)sLiMjJ-hCz{VjoI}M^Yffo0;7y~|Gj=Kj?c6Un%ozLy3ZxwUac-AGaCQ>Z6CxMi( zwP7UXUWyAr-S|AiP*Zp+FASmQn_#O{N^driG?X(0NZErhg*TDj0(v`)M)?jnpQ0v=VVzH!k z)ZAJ7I~r=uI;PH3NEdZX9iQqmDzk^(6iZrz*SEbxh0P_+a*J5f<;|t0h&@ttsJ0MU z>khG?tZep0oL(!5<-3Q_>K4+fs;wJ`GuJMvf#!VEijOkgb_C#&+m3WJhuMx8=y(&F zQ^Vz=vNbm7z!v-G1G7?Bn^-vA02M_C8xUJ+{BX}>rxyq1!*~=UPUPwP3YRZLTl` z%n(G~1m#LqTh;md>2&^H9Tf?@gFPgQhO|RPoM2SWy^n@d)(Ci5jh#L}#hWjCs3Ai~ zxy54bPg?@~ryn(NpB83-x^@J!%i%4|KIB~P5RksT)L9=2x3h$JGB^ao8H1|4z0}=M z!}gI~g-pTr5ld^g=Q68Fc$EQ!Ug>OE!X%h|Aj?X9mQD6z7_T_BER^JqlD}|~ zDi6&A&ud4?%di}LguXf8%I+wYS4nwA#%DPKNR+E#_T9U1Ay4>4Iw~x?ThKC`j!$0h zbw}hT;1snDF;&C z%d0}8Zc^Oz^$0U>5Q%SQh10N)W}A$#;RRE+t!}t(z!*)BJSe3acH+qA)AK@n5aUoA zZ~|fjta?zI$tu@hn$9X0=sOyAkpWU8K77Q^bAsu`CeJ}nsm!rZ6D`exC~@J zo#S#DDC&vet(jEmm=dme5u{Vz^SR7MQkera;`}+@RR<_ zp+x`bx`Bz=EvCZ2lrV5NbC=7@e1m({dD8qFyO}`djmoJmkURu=G3{gTRt_#}O|io? z85Bk!`k9Bz_9`4XFrM}elXgO~%7oHzS~DET@le_^T&fTGxiB2vJ&2}cNH1fpzn&o_ z^ClmAB!pT&Dg`2<(gTl5oeVdEDDP1zl8G1#;F9_7>JZw78#q(_)uU1q`~*HG4Mi!( zK89K^J4bUKlOD6oJlBR3)&KmMG>;o!5Gr=t7a^oPF4glbdD|0G^}|KRW#6C59!GJ; z(6z^{Me!nKgMfb z7V>{m%44nQvR38@3!MGSjg|FA@QIIia;e_QrR({AiFa}-&PnmQUe)!L^X=oQ{TS&(bUjm` z(d#e()}aTV!36L$2_F}R(p%3!v0Ouy$sbg?NlV~|tW0s8k%r#gF;ReA5OQGg1lev6LC++{54Vb&( zcSlKO%cA?y9%Z>wn%{35E!+&tHdmK7k`VV6i@A8qAW5HEbW2l}JyOJ*YGe_b>V;}e zb*-wY%6|S3O*Ij704UL3g#HL$faR;BXxNL=qn)0H%;Z$i0T9}#JG-0$N z@Mc*zr!d|-tjrssjJYtTOqaaPIJwO*!zg_^918}KHLWbn@%eNq&!jh=J@-;W zAQGR>k?c1$+&8(-hN~`<%!7-`r0&7R$M$h;Y-=7|H74*q|0>b+`jxkpk@?H;w$rY; zA3*wHc^r8axfC-4w5Pz9lWRGByO<>zG1yAx%ysz^RZN=9=AN{lX25M@J*8(&(-tA7 zfEAevTZHz!)lm)Vf8LAJYB?RvGFwgNj%Hm>yBy7K@lQiRGA_(;6(sF-d@_UkrfFqM zr;M4rAQdeR;3UG9DK|MZWp0_0XkqiFfN}{Wv6B$#gz;W}%E(o8Hr|h(qFlnx2~$C^ zoJx&XNz6Gu!7kl0)H9Y!Y^aMb*@LO@vDaF7UFD7HG7st3yiqI5VWdTFZ({j+mV}g6 zA(Ry=d&9{$OOht5pYHjmF)tmb0y8p_iwoC1ty0F)ksxg0; zO^j87H?h7-uqLKHgYA*drJ{NRW2yLWmF3GdWtn2$)Yh`wwlX{!q=^)>tZLqX^2%FU z_jl#Otogf|n5L6nLzbbt{(7xgnjw$K~GvEPa}aPD)duy?K+hqh|=k zu9JotF8b1>b(g?kM*O6~De_z58O z;TGAK)|`=^h*=OR25Tsf%llu$OW3Kj)U((M^rQyw!lR-WO@0@EaWC5YuJkb9U;^*o zyAy%Y-jhZOdGywM*wie-bJ`qHDoiF^h`qQ2*QX}C* z`gIEsSmr|Cgo@5Jyk((JvID%)6}3{-^JAM_a5cSokzL+*Nk%M4x?Q8<57-M`~{<2`ge`;gV+Bh3c!Eu zj_R(*_{E#XxOV;j{1~_2d5kaqYsPrN9mcr*kHw*#F@LuBp{&QFY7;G_O7M!CZnCTFva{A=MdhpNNncR-KuM1L0OQ>n2+)7wNqa$T@ngij`b%Gjuq&$cb;SBu=Tj3}< z0h@XcEmC|yGr>fCqU5gFw%elQ*M*tXAX@$j8}#@X`Jcjfj*nyHHHMHkFIZa`Vqo{q z|27h*yYY{Dl4i!^v(r=>FEga~hj@7+@_5`T11NPYw#tbDY-1$}vgo&TzX>tq5Ul}* zCu}|g66Izw-{M?`w(E`6&SBtO2H!|~2W+6>iE?w4BtKCeD11jhCdze%&5rOSIYci> zTW3jHX(dS?BR8k-^L0^%!w!30`56NUm;LIa>Ix00FAvh%=66eUxxO5P z2J&v8cSkC%>LAypwY}tfDW?I?TW!GeKG;AWEO>*~p_x{|WIF%gTzLOALaqwE+(`Z$ z1xs(t3pTnjFW4K6QLt@vwXs~+`)5C~jrL&_1+9&3mC&E*)hL$~H~OY}unbBItD9c~VB%yyVs$nX9^`e9_b zM-E0N(f7zPTpIV{prl-nRX?7jrgEI0i#LH8{d&{ddwBk5?m_->kPjzUL8P-MHC_VX zA{(e_8(ykWZRCr>Ajj~wa(e;4h4;$yZzHUE8OZg`csYz-=)j9Lrvs|ji@>3lwW3Id!(b>iHq$4K`j5ti;Hc8PH3~f)W4Jd2ok;Eoc3sGC%FY$>{ut>Vpluy zvNh?<$5HJr@+#pUj{RNafZG%e;|S-PyYW(W=*CMmq#G~Qp>DiXA>Fl7<=$VF^&3~T ztSj#4Sx5BXSvT*&vmVm}oh8$b9&(D$auWhFYr+vm2}$xZj!_TDi-kLgZQovUa0&*} zRsA#90R2_tg<$S~9^$Xgr`lLL+e>DgoWJ(sC2rYUp2YhwOOJ*a=Iq04Ej*zo`fz_A zURdvRxxerRWu(g=p$lvGmFL{1ozR8N>B@t=oqYTAc1r2b+v%VEd9D@xwRRdZu&Vcz z*SvY}tsW@1U_zCn7bw(Opxmkg86M&VYW~=oF3vV2(H<{|p*7-?6RS64+@Dd&x zf+j1XMnmO~ya$Pe`UerzxUW3HkvUBExqSEKk}pmM7hQET(~zG-9k=pUKlF zddWbP!+h4wq8>O`fPfckUwn@*d`^0bd-PZRDf2lw)aO&J5^%c-_?Fsb@;n~NP&ioHL+hzl;(Y`pTeGxE@r`C2H&uP#& z%o{T)cN|acT|7%dZI0=wfi6?4jTXTcMclwx&A+0>PYe#HxbYb4eW}5Ch{eSfUg9pC z1UfBn=d4%9%SnchvgnQRavkAI+BIHoXnE}iGh!eNr0e75D8|wfH383NQpX9Hr1D9f zfIhN2c1*ZaA2p{s6S-KlnJC9_E?~r%4V*bBgxWQb6KKIitfIYX&qUsD9xv)6=|{ab zI<9UO^>DIm@>%i{hEOhDeMz>u4-hM<`0cPzUv%G3y!k{1dAEOAj`FGQze`WNEGOfm zxi8D9`1#;vIo^BD!e~zT<01Y`8IglH4NXy@SAWNYugEE44f7wv9U2L>Gd+Udz` zHTg1UuO0dB+@*!(vL&BZPnHL<)XiGz@mX>=I1!Dh(@@aP0*HPU!E{f($Yk1-B{M&v zz)i`)bSO)fgaP)vDUEUZe(1O-U>(YqjgXGi?cc@Fxybpk_EP`4f`_l;E%@k(N4CcD zy@_~#{}B5XJn)9o)!2=5;U&8LJCkL}0mcJ0aB&n!@3eF89j3?{lUM*19rXvz%M>|< zrxoN%>&+>0e9{;(NUNpMDY}~LEl%NzN3~R`JaAsM)A%T3>{MCgiG{cl8#Pr<^q&1o zyyn05?NqW&l^cVmZ0A(DzV`>eFh>DqFbU@d6DG|?j~--X7mcRrNrk$SdSx1tDyo*$ z@@aA-<3A%s9Q;^OKQ2%^cWi(PyGKixRyFgBjK0NNQDb`HY)I{<>$ya@a+y0_PBawe z(Aw#8ZN_~cM`fWoF~Me$6QJRshr3vuulchDgwErPaANlESHSPdw{dVc`<#q3F((vI z!b~~Y9Uj?K(jB&gAv5Iw$S+Pdgiwdr*2XZ=t+kuK)hJ$bQM?$%Uy4bcDYwCf0*=2v zSqb#(O!+=;Gc5U0jik852Hyau(b43~YeGHYhnC(YnXKNd&muAZ;d;?SY-l=5zbT$%ymd+WMh0xV^U;&laAbajt_b2_q4qeq8>fk)}yACU`bBS^DUEU`NH@F*2<&i!v zH<*MI^VsI7#I}sP!DO~v+T7)CQno&a`C_K!$jr-39D4wVaGu)XPpfle_~k7s%T1%W zT+DjCD6=x}7FUy^Av$Ighz8*u8o5cXPkFM8Lr0Ec zSsv+!rj6Ytw}XKbF{^CWa4+qIG8={Vu_f_BIQ1^@wT4@CA3KA1&4Gh@;{H61$ga@) z!FbcfB?2gNDt95(ffTq~=7Uf0c`($SEiYrQ`rKquzH)Xm%FA7x zhM~InVMsy6?AM|U+P!hqbtQH_V1rqe#o&R)$Bx8NBPrLzzO}rrz|JKJotCl(m1n*H z&5Lc430~g0X1ldQdz#T{X($a$2epvT=J}rPCQw{kd4*0E%Nx*gi{HjhwI{v% zHk6A2RIy*)PRrh@lES~yD5StKpQq8-(|e5c@J5-ref`l`{GsMp^wO?5=%VbU+6CGi~hu!iE0dISc-IF+6>f7;4u{3>{b%;BEtbwA1Os z##F{Zm@#>k>p($SJAR;maS-Z0Sw%`pFo2-I^`~5p)PY&6Qpn!-A1>m+TSy1t<;s0I zonEfdNcA|SGha^4%T>I^m-D>t%XwaR)^4&o#efJw!j>uFQT$%I^Dtu-W8gH0y(prN zP|G~c!9C^EW`3SxKoFI@XP1XZ@q6jcGhS66*&Nz2GwZR{X0uKEkdrzEoLn7j$T4YD zgHilRx>K*L`h2DSd1;JdF==0Com`!QE$-UmazxZhb}QYX>wp?z|Z7p78sH;I#`F|1kZzlgQ1pi&+#DzFLCzkX7 za5zRMGsNj$o#4=j|KLS8Z^-I|U=3Y0h)j&(?273-3Y^C+gAEHg>0*F(n0X;TaDa!= zl-bR0wQ$`tV6A;@bORy6%%7%HVFd>?*@@-A@TWr!)7I1Ep{pAPYZ|8@>gN!UO1!;n zS{-Z*>@!wDi98{*17=o4u$Mz=_zAfwt`bOCG9`h$N+i)3q2;18?sL1fN+KdEK@~q91W~Wle;GSfR(~f?bzc!FvS^Iq)Z?U_VgONLVAmGGG`!_gMw)+8 zjy0|`0GrRA;l@^o8@TU(R?ZVn zP|;cWRR-|?D0kQ13Z|kNopJc-M|m9F_ChG(M>)*ldrrRUj;%2cc)ai7(%p-q z?M!z+ewpj;LdDr=DjmEmteOZ5OoWAzMU83rbsO83z;`@>hM(ROLWi!%AzXw5e^-P# z&t;#he6R#jW~{xd*QqKIPQSJ)MZf+XJ5pH?4r{M5ErJ_4a~6xC+&KGSI`}JKQaD>0 zP9CK8VTwQg&;G{|?76SW<{*Uj5jU0^`N#vSo4Bl$UJX;~(fn)NIFK;lWCVx?UNHuR z;9(Udr#suaMPJE|p+2vkHhYUFs}`IhOLmf%cFl{}J6sv+$h|JVDHv7(!E1RbbWtxQ zlo4zf7cP(U(GVBy-1edzh4E|a(dMBG*Z%E+ zRSl?@p!j(ep3*!fe|4kM&H*trMNoPOD`~Hw@X&6oTr}1+%Ipl%B=}}W(D_bJdeMzu zk9welIx)^&mQbU)(MzZ=d^Ji~U{H7oHyD)G{?5W>15*pMxY7CUPvL~to|laj?yfut z?R>PmG8cV##a-Eq{mMq862WyFlOmzpN12tM@i4=}t{lHw6kiiAJ$?DZfA}hU{h98r zldJjRxDX{ge$+~Ze#%t5U&~)0>p@Di<@-LQy&aCT$^@AO`*c& zJOdqlt5SF1=*Jj{30jitEdTJ<%W*t;7mg?AAV$XO2<@Z~&gg7bSY0~ADv^ex>nNk^ zo`%8Ud<}LN*MI5EFx;MpBBaoyKJ(4)jMx_H60>s~AeNQ)tL^E>PAB6%H9f}zk8`&u zb?sYbG!iVnnsS2!+ISgf*`J#f5#$R$>l-^YUN{r}zq*sk+e~gj=i?NnrNmI)3e`%( z=S)tbcJT`1B{qn$?9=Kh2R{T`R(PbTug<6paI+^A^o&x^%E#K?a7Ztuodl2r>T%C7a=`WE<&Z62Ck)g zs|F6KRy#?lsUF<*IR->e)gy+`ta9GATG;3sRt$MC`sN zMJQc#ezxl{YkAz2a3e5x1S6;o5kN{#YvtY5 z6hn@{$+;7Bnuu^sf6_k$l*t*ndB(ZPn(XnVe(wFMhj*3WVb&{xq=OPcle>~D2bs8@ zyU!7K$j^hf7uK~(+#az(&-_V{WQTe@- zpN})UiG|s>pcRL*n%x)eeaf50W_1do+|iLfH0HN$08nldPK$<$k_b99PhW|}h3Ae^Fedlc*i^6xP@Ml@5J2&}+rbEUrV7he&a zkvmKgw0W;GfgWn1Bpc>O+w-O+3So}?7Ro;aaB+1JtG z9;LHjyb=X%zv$HnY=joKRw{*kj@&kir$Hx9~VjvJkn9_~hF^QYpnUZM0@S1i25F2e-&A6gXwCz62Q9Fr>~NNu5H;D>q4<(M_(mUFkfagzmb$dwGmFLAH;bNJ^i5a z0{iqq6cEMof1*5wg`1Fepw+?pH zAEE?6XL7V13WX7NLjBm07nSeY7fus~DWi}<#W0@1pyA3XWY94~nTHHYGn8Z#ODUE5 zl(z~c|EH7&NWbk<%I8QgXoQl$crcnht#sihf+{Zc4YxFB3pm1@$WLSJqfB2utsFJD zyV(V!0UJc5V4=@PDh-j0`zT1#chq4Ngx%e-b(E4M7^etgJ4!!-@L|_SE1u9SJ;e4@ zeCV}ciXWpit~OOLN{~m!V7Lya`D0LyfwXpv!tKmyzbX?c_sD1u8gkj_>lpNm(!?Nu zwCKLK5XJTc*l&iCW2|yNZjCA!5=AkYN-%DvW-1^08r%|ax?bx}AF6y!38P_$I-7yp z52d*0lxErsI_Rapu%=dR?S)Br0g1lzoWh*+PClpPL+mGwQ(oq0;#Dk zJRYy?qulXIE?!BPpuC2`x@>~dg%4J+&268ld0YHCL1|!`UlI;;LWAd_J+J%1%(drU z&ufFV$XyMi$LMbDOmvZ1lWeBdKw5$CSl}@IKNIjY|#$((zdJ)s_MC$ya@(v1r`9-AT9BKiCLbM2_eM9_83cvb0aJnM}} z5JGNHFs<@bgMUBvQ^F*^H`QZ5-DQz}FZL5Yttyf;_S3paRYkfuNm-2m2>+O@+y~F7 z(~~jZ5-rG5x`7VmNEU`R(Ufd{wL2TnN*v>+D1u--<0m%1wGy;>s$%xiw%6#r7QBJ! zN8AKIT1!_W!QbN#+qV@P($4m6<@(fBnVb00EaE-Cv$*!Qwow&bDc>YU`YYDs;}0f`gvIGU#A{< zN{sQWNjyk-uPZTLUpN!{iSqK4SWHE0@{r0u=|Y~;*^+I5xEyw)XE*l-(YQC*SRP)W zJc%qy7AUPSsIM--f)0)%qy%A||2i*?<8`GSUisy9{z~J8%7g?|3iGvA zm~Wi7exe^1Dp|rt8ofw)3TYi!#MAQ4S0=C~IeBwhr<@<2rNVq(h)?pBM)>e@zA_A< zCe7jxZj^h-FNBULO6~A7+Up?y#rXfQYK~n+N+Z*+Gg)N2a#CWG^0K11XOCI@QO_|f z%4$w<)A}BUWGG2in-Yn&37$n%_SOnSpjDLQ@blF(*jAN6j!kJaY|dRyNz z@h9yY=9Y8%h89r|zDTaOZpya?52;1Gz(3ZANMj_WD_=dfS7n?jA>*Z+Ey(z1J;@NK zJpEFYajBxYGMU9+TyNbu<4e^tzK)EeSd$)c6F1M`%NE+@vYry+4Jt}x%PU%LZsKbT zSTkI4K6RGnYE^08pW!UcRYcPXY#17I6G{Yawp#Y(vR?0FuI#C~f*zgwI_uF9iV|y) zv?OV+qC_R!lG=@`)KKsnZd7K=MqExsY0TU6cvZULD$+f`+LP{Ak?sYp;piDvQ#@v? zP{-b(k5xVtj0MVIAp02wN}AxH*9(*fFm}odG+~~pyQt~zgBEd?=Dx?q_qfGenAOF~ zy)eHWUaSl-T#ce8cBLcK?g@50Tt|!TN}8cmr7}Af*ga$_M9FL`;sR7^RjAYgDbkQa zCDAmS-nwPu6#qiwxKOAxzW0RL<*e%G><-OY6;!cq0lPiWD5RGbsA2Vi zuyPd*D^l(emN=v$WwannqcM%t){YMUP<$9f*K>)I3N3Nc63o=tdMb1zO^u{^OR+WS zNzzi~p<2C=c7dL@FH4&f7=hgoVLVzGI$J@#ob3pG6QHNz;ze3rnioOuFH_=#MRa%> zRzr8nUaoXxDq|59XB>?{P)%hLN-=bW(i@ws)hnPD4x`c)N@K%iUlQI@65&E<7MBY4 z;v3;`q`UVm?1`~ubQHHxEdupk355I|8n#kVjXgyW7Y6RwXdvT3&)&w>A9S|;!=nzbk)+*$yZDC4S zSFC)*ZWq5kCfG6eZEOb65|!^LZIRy=fri|(r=_1o+^UHJ3pTZtj<;7^(du=)&E8w5 zbV2Nm^_UhxqlX`~>NYT#wGE+}>!FzUr1kjW^U`)o7?T^8Qr(Mjx0~qhA~CjzJ2d#6 zIkuopc2H*g1E5~ppfvD%^M*y-ZV-3xiUtzfpT=*%q&kNFu|Y`!X8;^sDf7h+TG+h_ zO$IyKJD4iH23X0MX)Gi~-k53a==+Tf<@*0n>3@~oOkXqTp--@J$K`@glx~c}K$ruY!MRTq4mxf7t?A9KTEG3;6rj`T zy9b^6aQNn5g*TO6b>U6iMTT87z$t3y^;@cvb)8kE&@nF!SdJrSH=18Ku(@`+?t@QqC6~E8}IywIlivCQwXje z!s&M6N;G*Q~;42M2$}|Q{lDEDHAP;VbSjGiH2A6@&JBU1gp zfx11DmVBeMgra=(8;(P@|F#+q<#Q_zmHW(+|4kgq=XY@^90}0(DTN$|YWVLFQ)1eWpIKPq4t z>PfB7DYKz*e0+{QrIG;(n90v`Sh7|n7HW4#aix;NF{9d)?&TLwh3~3f`IpehrzznQ z$Biys0#b~%t1h)Yr^HdyE6P`F5wA~y?)$^5MOMu285-`{P=k}ihLqkmD4a%L)ls2F z8Y*P{)nX#`QV&m3t}3xN;X@x^g$6R5ez}S&45YMcJv0Q_0fcBFgM_jp7I0_DYa9(4 zKEx-SO6T-9Qf#K;LBp;CkQ_=QuPcnlvf&NDbVKQ(8yq&7r(JE-uFl?ID954%bs@yc zi_V$Um_-Lv2BCQK3+f}NogjD%1+^)Db_yzkeFhm+2K$s7)Gm=se`c^xC4!U&^iME3 zS#BdJqaJjog5ghk)aNje6KmA>g-(ifwtvvEA$%M}{+V@oKmp)G52NtExvQ-3b&M(l zs0JJP)eP-wlM#g)O6QGg77CSVQeVc;S(BOpRHwIDZGfLw%qoL=QY|Wjda^C54)tWc zHWkseUQ)arH!Nx(!+Qcfd175WRfhMFr^>DBjHR8*JyjPPVFKI}7z{xi>#h1yfS1Z3 z2_5p$YW4?^g!y+NAAEYd4Z2xOc0v-9y;K(lw8cx+F(BDfO=buJFKgDy-POuk&sEl7 z6jO(R?y{J_2Ls))m^`ki2;}69cU3VP_^1pQI^v@;Tqx03Ww_8TUzOoP!G0>kh2Hby zSML7ma^OO%{8d2^&d{2GsvZbv!COEFgiHX0TwO4rB_CuiSm-V*_j|BV^~%wtK$rqi z7YeMZ%NKzvLxJW6sSE|09IWmE3iLpT%21$rAu2S=tpBV1+h&-)Q7gMUIIRSy5K&I{6FgFBH$6Jmu|Rn)%ug@%Gmo@!; zK&X0MZ-T%W`r{P1-cf2>C;XEar84-(J6dgPd`A%X($QG8uJb@F3(#Q+#IzKxP7+?v zk5L)E5*wp3wCBDUm7zV0Vlb0nlk#P(%7G)3c!2J;s*Pw<5Y(B%!*TWw8x4x zs-r#o;?!8oKxgBS%0DSBUhOPgqUYn)nMm?Ryvop>R#ugvJ8P_38eb7hgMP58o+!o7 zR+XVV%@X*lV-i%3%s5e=aBcr+7OPO6{6t>*dWo1_IIxpMpC%&LcPJ={r_m!xoq+60 zl6YmmO5(3uYN-szX;DiZh8Z%yma0J;47AZ^NcsV9=%7tpZ8g@%3EG$d+E99aVz73K zXlQLU5=f9qJcqrQkQhw4wN-6f&+r*NtxszsEsoFRC#$hZP8`PM!eK(9tfrdyPlseZ z-3xA1#L@*^P%F|bUes_54P#bcw60YM2i|7dme-tZ!I2p8n)9hM`|H|swsh$L4br&oX3w01aIuzaF|#LuY2zQ)9h#bOwn|p~_xI`HmF`P5o%II91#G8m$R1-eVX})iDTvDpg_f zsg;6J@(y)OQ5k?^Pf;0wQ#GdFiD;m50B39i zl>s>KG{D1kbhLq*BrMs`P-VD@1Gve33^G~QSY?pOw~aBoVP5+(O-;szzX>L}UNoqQ zn!uEH$E!`$IaPp2Vl$NiB4RTv1MYOHnaTkXn+p&zQIFfjTyB zfdM^??rEWNaAaf)H4%BtYk@qliD8IH7@KEywp1AyQdk9sbQ0VhC9PDWz|4Y6X!vSH zB(K)$RtA4yS>o^q;E;yo-$vbvcY&E$1om*1{_tE|%>3>S;3g9VB)wjsOy34j1=_30 zxZI$@AU*|X`RxFhICL_*x`2>HWEr%9Z=++;(OF)y;7g{Y0utw zp&|)LX;W27=_^3lzjM9fN9{$`8&HW!{D8{F91W}KshTP3<9o9}>Ft9;sLck&it)Wg zPf5H9BRM8w!Wu(99nq=akMF2*LuBB0d5<~Pbi`b1c&{ct(zmnv|Gj{ml=gpHFQAc- zJMQ>Xhx%-t(umgdP}%v|(o2&Q^PgGZPg_^0-o9~s(uxRR7z@}%Z-cSW@CQ`pp9A~p zwHaN#PE`5*a{d_YntPGKn};2Pv=VdV@l0T;1EzhJN|v7rg*Te!H_x!cMDENZ{OmZ{ zQ=MaARwg4h)c#K`j;0~mBR$-GVIN-HN9FcmqlmcN?8&QRy|gFS`=}!Y13jJ275aj7 zzB`EPt2T!E(5o+>3YEV6*}lH~S)YFVSyn%Fj`2r7oDnOE+`~0$X6^Oi!B2FZj4~cn zQ(%UTB2;O8B0tHt404+oBD627n)TljS zWbLo|1zf)2!C6#Waj#qWHwKLN38jAh)mqFv4A+h772&6gofY}CzsiD5>3(TUx8J; zST;=k5lh_h;p#Cw`yhkw z9Ks$|XW*4o_DXH~_)&EQxJbr6ramJ0IK|>SH<0TddR*O)<#6Q_YIAKQwbZzUuRfv1 zVHGiotw4G7VFdX-r6z=O>o?RImO=w@_jeja!l)$nT zPDlu@G;_LhWZ>Q7MXVd3B7#zZ)nMomy9;Blts)jVb@5m$CZ@VDpHe*(Wue?e_)=qcJ0Mg|MP_Q(et z2!6Eo1(mZpe?B6ZzIs7zf&>F6s$JM?fxqB28Z}W(V^`U=LvU3*QLTkn4o<|-=;`o% zQGL_kzU)d<8uoEyIQ+^oggqgK-wsj6toAUc*waDUfnI(UdpsWTC6u>kHWEH_n zbc4yC_6xo{-}2i#20K^c>b~V$|GaPcnRU8vxgN8C`Gjn|bpAeSsW1 zaW-PSwDDvRZbC^`1bv>PHfB?|J5-&D4vz*?Y_1xLhk2z(qN)6oY!mg%RU`1_=v>Sq zL&=`2K81C{l7}AyJ)5VtL~Jy7#-I1e6T!4OPfap^?};0pRNQt-2>qIe^<)s`s*^)# z!~*q0<0fyQzk&5HhtO(IHOT3lO(9W+wm=Sw{%bG-W_h zPSrqHqwuM#E;pfS7Ex24s#i|apy;8dzW&tV@!h_5>o{;7n6)a>w~N%d&=Q`@SF_PO z7xUFeh4*P7soO9&u*0s|PwWnMG_^62*=HtUdE0R6DXC#_l8x1tQ#0k<;}h!1wRq^+ z`)Q7(*2OkDo-*DZ7;d+At0kB`xeE@`v)Tib3~($sC#m)PSP8beiHlBZ%YU+rmHNm$ zwo>alkRE)}B659)hp_tyK0we3kW><72SzN=9!*jf}WuDXz;@gn(g=EJb~c!4I6<^G~lnf1gt+&a+AUREoYx z@lz=|{8Wm*M%}a@#lfUBoJw)6Qe%pk?m&UFwY7=16sgwVoA&5j$31LSN_j&ah7DUd zJL1vWQ#*Nr?I7)Y1K(Aht8|&$^E>ZhJHbe8CwTm(ouGE@+zBS;f6up#QQB@$V-{k& zLF*DA!95)vmH>SD+b>-I!!v8H9{U5mLR+}@pRZcD_MX2*vG^+%F0Zd@b|$TUOIyg` zK{4LZV5R!2k*U0u&ml;8+hR40*=8RsR@upqNyRV;Orgw|n`6^Dv{5JOHKl{aG30Hv zp8!m;_#O4Rz*Aew+^n9_iJo;05eXJ?*+fquj$N^#j$DS#rZjoZCFylON^7=~0kojc6Qh;i8X&0hO=z3w7jv zpx(z#u;*=7Iu`8V;qC!E!mw5Ciq&?nZE`d{u~iMiI-L3f!pfFsedbBI8}dD9@m7`5 z+^pKlZJ39)a*L*K3BPJp!mq}Za9pCOL@mVD&Wko}g9&xWhd@@pr}-bMnZls_j{vtC zsOv{+iVs`V^;Hx{;kQgeW9v36D zMMz`O{DalhB=Xa`&ec?B*~O=~TTS(d_dph$5DB;;c!u^YEy~;>Lhr# z{i3N2yLGi8niAfx6-r%ps69}-yd71w3($_hxzvSNoLRCUX8erR9s~GN3QZwStDEKu z`-gSo923sE#k)Rr)s2Sl)NG9}?gVC_m6YDy3Cq^g)bSH_I=W`(Cu(oluOoIrekW3^ zU05ku0L41gc9)9t&b!oC@Y3~N>KF+5=-ul50yg&UVhSY;HU-n(J!(T=mTU{rc2--_ zJw8?I*Z*)9ThSY61q#%R0Va_nJnhb>c1CD`ht9INl)9W@&j8B>{S_4o;!m1l(+Q>p;z~+4R{i*T}f=%tJWX3 zpL-zdM8mq-!X)z3I=rO6)T&s;g3n^LM?YV~S2?k_Wv5|QTN?&^|m|oed)(+#= zWa$5_xk}tzrI^1D71_xgfNAqSROHfYT1CqD-3ox1#MaeQZ%t`tgO)n=DOElESkfO= zCH-V6y5e9q>x#Bo;dNe2lXx#nhga|mt>IAEds%WJR(NvXRHb&+GsQWi-dFT0X<&+0 zrH`xfZC3^%+Q&VOpDlwKa^ZAdC1g?1gwzm@H(fG?|uvM6|4JY z(vM|o7>-YUM8z~Tg5p0@H?rLVnXl_bv6CY!bKgCm2TCb-S8I z-T8;(Xh*da)5RTCAG=1}BKIgGv~$zk@{8&d=? z8g*D5i&T#uX4W%uKY}&I-O=NSI*Kh@j-#-@?Wgji0H6Aj-!Zl8O-@6P9>e}`I4wG+ zCIH8B$1#P>-$rojVMZt49<(;&TD;@luTWXTZ_}tj!-y_){y0`D_(DCoH;m+l5#Cg* z9P>Rqd%Z(Bnw0s}Ugn%zUXG=lui?Se=UeZ7G`8aZTY>)IEVxUD`(3U3cXYPDMC+!) zQ`HcLV^s(PJ4$_Lm7Ab)Pox9iSHp|4{$%jOyF>F%IkaQ`r*v8=1Wh%}v5;U`6mI7C zK(A1ZD&mlX63${5#X+s+cZ6UjX z4d-i|3jWwlWVtsMtbSD_3T8&4P&98+GbiPZFwWi+i9+wLzQZvy=9sETsja<^)>Mb} zYqqy>RGw1}RU4Q8`xZnM(#I_eh8>@CBOIvKXmc%;@yzlF&gkW8vy7elqww;7T$3HS zsmZkK|CJ{Dy-2;6b#95v8tVz;mM|QF7dI0+e$Ul_oS)>>`v1HZJbY6NYS;g=7W_tU z!EdUy;03(}`MsJgc;G*<1;4zh1-0vcSquJIik$yE5j=EL18Ud*vIhLKcA)>f2K=H% z1J?KCm%RN-0t(o=L1|~_aeBGDIg?xrmqIkCjxwpzF(us00}-b?Bd+skf7V%T(msO^c`0%7XN_NnoaE1pqG>CLa6$^I*4;wGe1;xooag+| z&SlrX=CW%9{4^giS=h46ELsUM1!?3RRuF-j6;{rxzNl)j;nw|(6S^Wgr?uBX-WZ${ zI&;|46uKT(!0lSuFXfJ-m%|H~-_iebt-~0;{-|L-uh}qO+BK6J`WLkgW-cx{PMReq zIR`b#(aF84OAa{0{VEgpd#Lg3=}Yine{yuIgZ?X7VE*Jy9`-`n0ax1}b;tg&gU ze(`r{>2L$Mn>lr>M%&EWI!9}3jjp*yThILWwzXGj4cV@ypU~f@!KdjBt`ThW2G7+R zT%*^n(cl+1{97jz`mIYf;ZD6zyZHOGHB?G2+?qJv9KO4y@+pO^Sw zF>&v$A>1im+V$UR;tpr@t-QrGRgAazL9NAgO{{v0LlgUVwm6M`u$pui>KAvE?qQ+R z4%~78{qkpyjr|Kw8w}IRsB&h(6fDx&t9C{S{HiV;U0Bd1cJ3Fqd^YVMJGYMWR4p7k z1{FMNFf2SksRI^I!sqoEKHoV&q7x$_FFG;CLapX0?L z1=|FJ`UNXR2w9V+4u`T)vVd2aGct!AMIPTZ2(rV2;E69uvEhE2zvH7eVCILdI`S)p%E z-tx_%Z}rw_?uZ{*@Q%Uo&57#OpoAL>qQJGzYld2Mqpf2KPQg4<_Q5K41h;%~0Xu>_ z_Q^d~DqZ;n^G@qvFJR~HChaR=FD&0zz$oQ~u?2%bgE+dhpcdRx^GXX6gn6{Ou;67_ zE*qCYA(}|mmKWeCdA;BQ>&L~5L0Dc!W8Wxv58+r+_ZNVvn9>Vz7rk}Qfr6>-ufVM< zz06}1%oUz&$Yo>hooRA95e|CC|O*;etrkvdDb`9Xnj$ zha$w;#ZT(M4fp*2VedP@qB^?wxp$Ygv_(1yEZ7SQ*4U!gl8#Ce)1#7@W^9;h5*5_g z3r6Lrk-K~Mt~DxP+r$dSUcnv}m6*gXpvH>&KQnXh7Epuv67&7P{Cpmt<<6Zu<()I{ zoH;Xd=8McXaFx9KkxT>r3_X%L8xu1u#19b8c1JP$+)IsV_NJqmTj>Vt8o(Wl#wBE( zShLEmWuC%sZo)*9FL7y!dyQ*CmxIxfaHKF(=bFAG7*`n27Gm{YhKoPHq<9U@%Z|eP z6`K0ug;GN@i!i(Y)7VjCPmP%$0qM^gE2FXRC`bJ4`HzXeM?~)G3jOH&Riq#7afP(> z%s4pLEz{eYG%{1<`7J+?&QnK=gwq6si>qGIG{MbMMa%NSIr>KF&bjL zg~lMv$b1bMGWp9oTsXg3sZ7M^{0g6!?IfUzt}t;zW-Q@a59>QKGY9ef=A{HQ$BfExg#T)s8&3 zLQgE2V~tpunZ&!-BR-Z>XFCy6>TIPCYfdk0%(R*B9km%aQ8vtvKfeGs$z`77_|fw! zc3vfj^3U|_3fY$}wx;D~exq@3NV31aP%U~)>4WJ#UHCZxasL z{Jdd9`c4{rvH~H zO#iqU=waAsTRApj&y`@KAk%~jooniNYt(OKs)8(!3L$^)pslCMhovWvUU#;H);4~Wsq`9tP5R3 zL}l`{(vfK3Oy3ARPqt`8Cmcp7N!a7NfywWiPC;9SRp_Xz)2uIrinn+?vyj(ItOd{Y zV%OmYED9$9A5?S0`x`D)_$>E4>EBa%UNcxb6cT!823X&U6!C!9>9d3+=$tCfc}{g! zWxUjp6_PtK!a6uw-0Y?~G^{bC_u;&eHw_w2$b@!XduTB0x{@V?k*B^t$|3a zMDY!2gq&~1Q23~!*p-=zB4O2gVlZ55DAquuQDnRr$KUXQ=iU;I>=;JC z4{I)d<-X-?V}lzeJFB^P5KTWHKPD0j(BSR6LP?1>5j7(PtyYJI;ki3;30jjH4ipE# zk;lXuaImGAOifjhkhJE_K&?Q4UHhRph!iCbqn5Q2`(t8#TGKQqv=-Z8a=TiK@9_DT zpy+Wi9J;g-JMg)eAng;eD!$8UgIS%p1UuS@z480zkBjq^sGlma0-_qx!pgIG*JdGK|Kk7RincbuZl z++nqo>^CiHl4;v->S!~^{ic7p&HP~~Zs*f>iqmbOidZESuh1Q(6uEnTmZFMvrMIuujx>6zK9hWg>uVQ#TR2&aCUlw)N zwOz#?Jb$#5g+gtOxeA-*X*uN|rxOo%T65^EUU zp-nfjl)rMyNkh7Fic#J>k;qB)ys&)f*DI8-)n>&zT-gMoua*7U1!<5<)`1s+Tc(;!jrkeNbz9U9B^CPjM zE7Vx=pxb-mQx4SF3R&^md&r76DJzCUyZ5o-HpA=hQ))c^KH)34`@UF+ zjY^qt!$r!3Q$RmZ)Dt=+hHa$60bm>`4uN%zMRG?Mx|E@$sO1D~GvOm~2E5eg-h>#b zao2xt{k@NPjZor+e%Sl5Nj&J(cpH5!yND$ptmvtVCDcD zIciQ{u@^3iQ6!^iMvNK(F~-8ob)v*5EWjDClVUYE_OaOBkr`b<_(XiXJU!-KAoSP) z%03ZmVS?2^wQ*#9xcRC0Y)iD%-*(Zs-1gGw1$~SgVMc?8;%<|;J#uDFZ-qI%1x$G8 zXOub5eum>#Ip$n^*N>RZ9>AR22Z=ZC&zwP!{=qh1`0PvZD&qa$K%e`R1$DOfoGdx= zxb>X!Ck=Ako_dbC z8i8>nRix-li-mm_ezdR=QIqPFH%Og7YL!M|Tk=znkdLDveziy_n0{;vTa)>0(3YPo zlwrpSYtC5lOAhiki?00nLfow++H6rV(#UX538MD2Ex%SsV8bug))T}9Jb&nCr=k-b z5Lf%KK%WKWp04m&?kULKAx^PoO-7#K5B*B=O~pdf&*)Q4V`_X|u2cAy3$)s`%U3)1 zoVDvzaio^dKkZa#T5UCq&Q3SX5N|UL(!l(CdE$9m{nukdq4tb)Ut{hG^oqbZ)4;rZ zk@v+K^tf_<`%q8liy9@qUe(A*v`y46l~u?{=+oHf1?^{v@l3U>21f_twF#d3`5?^_ zo4T#iU=Pr&NPG{j zW{P7G54wDb5>U|8I1kqTB8F!ip@i#qL_CSF**fMC@I8t!eg!2aF@@%$_?pl<=ECm2 zBDvtoW;hhj#|cSWoiPAjDHN+~rWdz@v{PajOfMAMYjBAZ{R@e>99gK)c@Xp;(jrK6 zzOWJac^TWo%f~3`4Lv3UNaOTe#DZt@mTjko@H z;zA{AFGBnnE6|gAg%F5~f;SgpsW5ibX&QUXX>l{sbkZ5IqpIMVF6t;v$8<8P3T{#- zBT;ZuI$=(z;3n-IKNKdM758H9{|z*Z2QcW)4|V{9(lDOCpfs$Uzi?Dz@%+U<$iqqG zt_3-sX*#A~JPRqHy#+c4=xE!B;>f{$tGOv~v2CWtA z`E0qh3$JbHYH$~p-P#2?YsFaMEkQXc%AA(qiCTBzXjXv|Z43P?)ZpGe75@!r&QIqQ zH9+;e`8G(Oz7*_=hse)oLDG4=dHe2bHGSdLb)w$=*g1m`qQ~Qq>%u-%crn=o!ElsT_7R7Gu~96D|(SDCGs@C1VY@iVxPi>l%$;FBkIM|tj( zCw_!ZR8QoI?~+R`o?0(<#5*n~tQYH&#~;><&$*2vmucxCZOSu&5dEX5BQNUxC_cqr zQ~~beCV?>FM^R5+7=IL>^i=8`gZF%X=^g<52C*ZH90UcA>jI$12C*JLZ#0bGfRo-) z=x{(xAm3itfYyLf@c2ft4te}wBhG#kVZlamiZbY~cN)3api9F(3p%>Fg4mqjWQ|%W zUc&Kq<2}Y(HH?n8J1Tsv=7JB`5fNg08I zwj8YZ-G1wp-QqADeD^q&n+?877#)0j?SGVmuhvt4hlhiWjg36K^h^Hy_?rVKeiGZG z9JBFvy?yk#*Z8~f5str`|GM#a^Ml4;!0{J7BNvI|5d}5|qk|Mx3vn2OiLZJ#^6vhR zM&3OSHS+Fxz{tD)`u}euFCHGHBQHBVN=IHiJ4#1hX~-{em;r69 z^bF|w_Z4U)^?Pg8OJV`XTUIzxFkRuIL7#=^ud49biIv25atZXY#^u(+-$nEyJ^BYH zE~eXf)Sxw)Pr;iWp@GJBFB!P@{Luw)ycDeT%>vPJ?hIk6f^~N2P@iWrh*vy7GW#x_0 z7)$YDOk&~uhFHzXtOmXJX$4nfa#S>KW4zPINKEHl8XI51SdZ4kfDSwRv zpC-mH&>S?n3F@(QvN9ZR*DyXw$kGdjG&MF?857$RxgsAGaGat!UyYM++I z1?pGTps=N}qw|~uOVX~DF-$WLCpmAlGJb%cY-(lv8K(*JTN{bZ9jPx8PPI0^M`||) zqf`Dv0l+$~hZT?0GRNzUWG5-5K5So{bj-knaK6zWXMktmNIRO8I^)QzVthrJM%X4B z*t};1TH>_<#sy@ufw97&t+!DJ6H!|4G3~ezh*JmrPV7Lx^XzEcSZ>z zd|BJ*Y26iVbm#bmvz>URXe`=bXwYXthZa;w;PiZ}SFG_4$EVM8B0yBc!Z{_#a3S-# zpsWg?Zdru3(&?+-vyQ7_tb=QS3mi2$#geUrQ5AHa6yfc*IBFJ^dFSa0MXr=01D;|JIWKs%}ZB}Y3)AdI@w+J3f|@;5nq0srWS4o?+p5H z*bv?h=n$UrjgdI$DEP)mmJdsZJNe|J?t{{1jwNn6O1q40sar*xmAVfS`b??|YlbqS zD4j@$=|@-Ga~qq&aou?xL`^s9DpBy2_JT_zsA>T@@smCRU6%2CvLLb{%P8Rbh+8(A z9Psg}Y-1!^hThFa1I8#Am2GTeuq`&d!S?qVyacw`tILFu%e~#rC>Eh4sW9CR$^hzfkBrGx3!xwKZF}{gEtCkq6k^E0A zF;>U?U6*28;i6Tl@H$>Hx76rM-aWh2*wE+TfqeA2?9aPkc6vz8F$Q@0Ggr3yQ6Mj+ ziE+z}apZ&eWi+vF%hd7(LGBV`6nXV6dzFi?F!!Qm#;PRrE(@)`oQ8H?vIMCnv^98)OR%9ujIKES|M#uP`eaZLH!z_ykvF?;@JO8k&$!|v&fVky)sXhlfD z85g9^pt4P`xj<)0I4miH|4xn&qMpzwP#o^^h>xKn+J9&XhSvM@!=F~OW-4u;c z)7(vT4wo&M$Q-U%Fex6I;-SwfV;IIr`f5Z4=S=>$N0Ct=!Dyu04v0z(i;WCTXPaNb z`eBMkrq4lvv=mH*#2XTs-%{sC%KUaBgH-W{N#9F+kO3aUL3sV$42RlM8`2vW9pgaCP z3mPHSNROdHZX;7nf=-~P;|#p8a3Q%^M7gEUmEG~86X-pB^kR{3f1|gyLFtxg#o5r5 zgSgmu4%QsR1*6Zw_Yki5r&${uGQQ@93-4o&;hb+Gx`YC4pmp6bV;65MOU~wZLg3;7 zV{98(j3yL)JN?K&z2q|KtvS z;+i&^+&G(d^Ln7ppcBH$6jJ{ZB-b<s6VdqVoVJ22d_ACP@7(A{T;FT2oE3&NtA5l}+o z!JAi&Wbb}l#IR5}cGcLPb%rK*OaY}o0#dFSKf*5X>ov6tguqiRk^(??GRQBO?a^nl zhyCGPAv?Z^{UH$6T{nif(yjm{jZ6{l6{SA(21@$agH$gQ5&YtYa}DsFmx-Ku zrbEC97G5xKr~$mZahVj2VH!aT?OKnG@bVH|sX5FIw|OD|8=$|piJbXE{*Q$H-ljGV zgFqN}o(cckJ|-gk2|0#9IOk(}iwy!H(5i+hRuO)l5-$q>_8I8(7*C*4;U87Q}UE^Nt#(INJe;%6nnaDWswVx^4EseuE;0>$tkO1o%Khrnv z*af9C$8rL%IP{)LS=RCBsy+F6HoL0o1?>jJ9V;Y#= zAzD!-1^}S_;E$-^0C#8Xafcc4Cc*Us6c~5#56A0?FUOl~1HlE>7e*$~zJR(=Fz6eZ zda}O2ln506$;PG}!t>LbQ6XQ^%#>u~ z`RG=PgrbnE8NS@=0TiDWlN|`TtxR=PxmLfrhF{%}-BHiE7rUo`zKw|-OZpcZ04gom z-#G|&e0Dt;(!u0TPAA=$;jM!^VtcC;-}5a(@y4#G%Nv-kU);%L)Ae)lExlb^1KFu_ zVxh|u^j-HSOk~@x2A5l;LlaN~8G@Ss+$T)WD3YDueoi3ho}`kU_@s$Cz4+=$Q%B01p7dfHY~2+VljPLJZ(Ow%cN-zG-f2Uz~+ zA!Zv!ZSjF!PSvO>A7E6K=Me(Er3Fv(i$xz(MNJ9<5`~_oY*+XIpC~o5IQo9yBaG5(NXko$CSR|3L0S2Ai}txr?mtZMSd~gb#~_zC-MU zce`76qVZC}qn3}I>?Jau0m_CbZ0JhZFdS+OH9dohElM0QY-}HDdeUt+Q6fEI^0r2S zP(Rf~Zns^Mio@?qph+_g#+}q@X{L5`R^$T(!q@=#DNP|T9NEv0^`eTc|1cylHlY)S zDeA0?{$)sPKajH4kYT0}q|l6Erf41sG{JpFpmqB&Q!5@>vE<~C5QzHPPM{=F;;-SQ zuW|IIHV4#Ib9kIse*3k_3%~GPXAXh2>K8cPt6y9tUocHJ6!atggP_ewlLw0S6C+Iq zw~0K~G#qjwKMAl79ce1_yN8DA3nkH>?yz8TJzt1wWAe?I(9{ z^U6s(dw#IA!&uQo{0$_nHENwh7=o|||32)*!ZG(kBdwSqdNy+qm zM-6rKP?L9tWNL;Y-dr-pxy{#55nuQ1++awRO!c|>ut+k!f&%Gg##PQVKwb^CK5jO> zNaPU*bes8W;RSXw4tX^Yu3AhXie88VdJxnvrqYO`I*X5jsK!Tf4TOx@7~eLk2f>bF ztlAmK-9`s?q}l4cHDsRY)c^;cMZ*~z-XZl96BR-Cj3WD#>7jSk{kyn!ZaL{=&;PLW z-66E&2{!5D@xbk3i4N-y;s+>x*R0jHnBFArYaC_p#I=W$K{bBmWN>g$<)!bTH^2V7 zq;F0+>0{3imOksdr`brK-^$ZQe)K@%iZj%DwfziUVAUP^*C`Bz?EaZ<5WSI_bL*X@ z6B;~+2noNO_M&EB5av@f+ie%ud z!UfYyV+6Uqrm)X&{Qx_d)GB)BH{G3+^bSbt^XVmzkiXEpjHsU*2 z%m!ht5D1f_-Vd1^T#4#Df+cbN`*ol9e5EA!MJ}5?BeL`**I{R$A!l zH?a#H^i&@1Yr%n@O(ok7^+J?1T&l2Ht>ATuZdvXvwFFZOR;#2TKRIp; zEx0U^gGFq|@}JvW`6!C7GtIMmieryU8UzY+= ze*ZxHbw+#9b5i!zgUm#USZ1wG<$gr+{}APd?$5Jsn>Rn#QDU5m{fK1#A&RZbw8LFw zbRrz#^pAEyc|@}QFeRU5FS-9H6qF%v+(S?vk$~rYzn+{%`2*R8w#iIJXrKI+mcL@3 zd_=NcxgzUk+EGrPvhSak>`E1y9#A3>Lyr$B-qwFYlq*%#mS7m*AQIE>BNC5DigVUf zMv8S{7YQoJ?D-!PwnU z|GiW3{~SyI4aN7LBvHbXN`9&bsgvj!=uqmlPNn{HBK|j&x)f(Ry2*CbDUq;eLL?3q z*hnhS1zyXrPu~8VGV(Xo0>qhiV$r43D%q>h3KN>8T-Ysys{-o=yx<0RIs|(_Q%QOZ z7c}}wQaHal1I9|y5bcpLJkOc%PB1#4HcM4_yvZxsdqk8s-581Yr0sFhcZKd|sqP28 zgevT`mPhlL>eEb59fD5D%+$NZ_K>8GKoQwQUTCE+& z3DJe5{<23Lbte~|Omc+tQ1af`e;ul7@y!j){PA&6eQw@_#hX<6Hy|6?}Ja* zNeM)R{4SoT$7jVEbECB6-sB^%c^m!4@mvfH*c%aKjGCk2d|^m#4|kaQ^AkbvQm*t7 z_JyKndZ3eJoq#onIo_1a{s(;2BLaf*q$!$TrZs{t6UP}~d!FPSP_l&hXnxF~YwyyW zkH=3+mcZFODFWruRp7z@#i0QZxn2tMJ+s#>&c&sriyrN4KkbE%>!oho7?`=9!gX}L z^aTCF)%JyF)HlS5^Kkq>v^n1kznZ>AOD%OIh0$vu`A1A)Bv^lx`k}96#lx}};~Dg- z>_Hov(wB^#*xc)_vtQV95Llv=uvyrCCd^{+wajZ%X~li5Qo z=i}~W&>1|N@!kflfR(9&KbvH{-O{BMr^mnDTDpYb&w3daZ(o$TIsj&qi z%Z2y0NME{b^+J>bAm;YU0Jyb9YQPtULBXU1^gF#(^1+cKaVxIV%mzc)$@Y-FRcao& zqzZlzq87m58sn#oB7Opn3)*ecIJ~SpeVf#WKN1G|rUL?@%62Id883djWFU+ek+EG0 zg!i{g{SY^Q9h9i9#**&fe9$;MF}6 zISt^7?3?t~VPxOE&$^P-qQJOE^6(`|uD2x#%lAn2U5AnH;kP|f18?$riL4P0a{3_< zvsVhINi~85b59&>K3?Dow{Mkrg6}>lIGD02_6YLLK~6aSbEH9o`(GyPm73VnIZV>o zrKZyq3O-&CYD*%Dmgcbi)0X?Bnz)RdyiaORUv0A&G-sbwzuw%VZdlP43u7ZSjEwzP2ATS`TUaQAlx<;;3R8 zDoKX7!Eiu&51QVPQi(qZ>kX+DI*qt|Lwd~5<{ZNi;~``(g_buZfjF*68;6(Eq~FA` z9=%J%jGKs*MLn9#Q*6ESmQ#g>+IsIWZw53d2^_r{Ojo=a{8oBjk0zReD;f~MNX-6< zOOuoZYZIWswDX?O;ILE)A0cr3u!H6~$*y@)M=mTzQWmwg!3fvuPwN4 zLb=Hcd!|;9g8zJ#;89?&8(*#p?3q=;akXi@0{?ghKNbE_O!#S#b1RgUbLH{3w!*k_ zRbbB*tMFG&eE(uW8e6Uk?73nU{z`+%UtEPT_9~=>?{~0Ov3a~$Ce4EETha&ou`s;G z{QXtQDfoxB6Ae{Cw`%LR@uEixz8);q} z(M90d@L@Z}sv*ON{v|;JDS}@B4CKsJFrS2t^@AX?@j+jh$C-mM0H@7C5I@@M8Hheu z%@}e5c~y!sw|r$Xs>$Cb-R;Yq0l8 zkTWPD0>=q|KBlb?iDuw%8s?%u#=+#b>V!h-=LwyyS2gAn9Dh6vZ_cO{0{M48aD^+b z<^>#p(aroU|1Aex49*emx|v(!fRJ=P0_TYC<{&I;!Nvwjko)OlzR>fDn*P@P?&iZB zgM-XYZ+MzV^DhZddb4E^Z1Xkyz-*nlI(`1g=dqgoxbJ<_@ptG z28VK?5bS5Jf{$8=Su!$|qBc?9Z7UGTC|b0`)pX4;3rR+FFEo8#s{>Wk)Z z*sM1<;itMm>DK0f@OZ4*4-EchS2T(wHO9B?{LOXwvv_}Ac837SO-j{5Hb&vThTK>) zaRgr!YYxLFsT+B+7W+H0-6-GXIf@kyyLZ?45*KyVx`7=fG`R_p$YAi20)71{es%#>wxS?F+`c-=|_{{W~@IYS4AR+1K~tVr^{~ zmu4;+oI;&j4F0v#l?`JZQI~kYMuMcith_}H*VKdDzGk{P#%X8OU)+=b)AH8d(+UO; zq~)Z957`41kR9h3e{rAt4+~9}r=ag=jDu3*_c(Bn^UU-w7URF7*xkQk#inD)ej9f> zmwT#W&zS09&&Xy|IvV6Wr5o`_Q@X#R++EUGxw(w<4sfGFx#wfxhMAAza!BbEb4%Qa zp0wFK5G_mDv(17}_DWBog^)gz`rnhUQ|8-~pwLs|LWNx#l`}AZOQB^OJD&Yx5`A5x@Gu`~oVO`9GLD z;nQs}kHODPE6oGow^8PH+yoF7n6oiL*(&qPc!hNQ7;|lIzIE_w^Ck{M4dcx9u%H9h zVnJ_PT?Kz(?_^@T>IQ4qnj3OG;o@2|xm*$tlhNX3rS=HI3;5cu!_Yp^bL!q${CaY} zS@0#*ynwe_EA=c`hxIHtL+Z)pVm)V5L(|J}cf2_)v}|z!8u;}tE_AI7ZEBH)1i^DN z%-=pbu~BRL_lV6KaJTCmUkKb|CT=yTx%5#EK@TlEd&|E$yAUCrWx#8xS2Ru-2+!i3~J!+;=EBe=qj1`%tnQe~#D98PWk(8u~Yg)mOWp=ei zS70AX|4>Z!T>Y!YBYqndlV`y92Xo&Ch{*z#S$eK|l+2=5^zRmvN2zB$jF`~DDBn&f zlQ%ld&>q|L;6Z3h#$PoE;YG4Lx0+WzKt4W#=p8DJ1i_;f61ARxw~#zarS_qPWVc;N zsK&ycsm2oHmiK85%kT;}t{ojluFS;yhHH9x;Z$ANkqV_JP;*6>*jcy2`P4>GRC`?8 zpbcMF__AyS#2+$$#=SJ9=zIex>9$4-@kh;Gnq|WqL7HXFnu+p+CuE=XwjH^M@$%iL7Ej@0oK`z^#Tx%k3$2)GOmu;sVjShh-C(Oa55_M0Q zE$$TfeP64R6}Dr;b%JpEt3>S0^S|twrX$Jh$0u{l&bD=U#(8r_33yuXXZq^@1_y z%=Mx1X|suY&ARWjc_PPchPTg}zr^i5))QyVEqU%GBiA*Wi{kaeprE8A6tb3#^w3g& zoCN`4Az;`&!W9yK8|nokFPOs}W;DdF+@cF~MpJl!&S;8~3+RkS^(Ej7!!DYq^UKDo zR|iUs)51CW#BL63Z#9&l(I17TPXm#9R3#ool1j}onXh?n4g}9j=KZdlc8B5?$&;7N zb=jZRDwoYQ$&SbtS1{i+c=d|;H~gU8@8-U^9Dy!Hj%q`UCvxg?9&o~YhnpX6jieh4 zcmc0WCwE}{ZZ^=XRK3ts{MbN4x6Ci%L|BWSNs<@h^Ov{G zEl69fxMl9bU%3MAW#)K(8g54&D275(nRytevF2Af@jJ;(LE`-w}_yBhl6H%GW``5cj}o zdbxz_Y~?t45r?(O;$^b&tV)ju zdOfeKHXQ5Y=>{Vwz7T?`bp5KRDwr-8wTAq$m#adQt6YFtl(^C?ir&YIhhK1$Wqz11 zl)B1c_yGyCzUD5sg3U}8}25MX|<2R zyBW{CC%OqdfkimsqPJ~m3xo(S*^9@GZneGSp=gen=OvRpe`md9(f!tNe?f!$#wK~o zA?`QufovjMvva=^)s*FY5m-=ezR6U8-JPX^PA!?lU;g2tS8#b&jg*v`bJif$u2!*Z<;+u zsI5X1t5BHptH`Y}GoJv=?8+}ZwZ(d1X6Ju_X9H+vQh?kGld4)iGipvDTfZPCP$nBj zqge633Y1$>q@o#8hXN6)6($X>hbtzXV}h%JH0kGpkEPv>7o5jj(OFzkU^T#emoa8Sa=k*>P2u)j2pExAsx$ zq8mkVuhqm*ITVXDH&iLoLR;c+EmS7^y`sXDSBvbg`i03Y`7#e!5GGgE$af5|HB7F~ z?SzYAay|EpORA7u!4NKoMU=B$xe07rFdc(l3|CUlwx?_frBzz&aP3V#w;Fhp_oOSQdfZX&(FU79UD}!AarAzKnwD0Riz*+ z?74kg6&oaLKWUKdRb}F7@4OnzYLC@Al9lQ6NV#Uh?mGsQqAWKdS2-J?XTG@Iggh52 z3K|11ocw{JgKd)M0y%YN(QR-^urtV&mL(%f?nq^0r9G49qvW^-+elF`3TsF|HRX*g zWgexmWK311${SrkO1T^a3p%dH8t{i5Y2-ZR{Vtx9&jkQONi zw%W!ra}ieVHW)BV{qJGIHZ_V`qU|h_CyHXh3bjPrp~M^$808{VDAEpxA~iH9mCv;o zDb2u&w9deav|Gs!U5j9mTIZ`p8f7n1z8Xa>Qh~il-`I*&-~vgBF9h7HOnV&4lo}&< z3?SX^M_ZY&?e@BWSArbfe4m>A1=>9Ol$^cQocFW$qxm#7QgXr#tf+6JO8%2Qr_9q~L=cR}7V%s-*-#lv)*5`sDu!daSeHbd{!Z8;p%|dQ^zJ?sa4TIh_ zRr%zhTwho26gx^UTvS@a z*5Qj;O9oQypco2j%RTfZY72Q7-1S|A5@=UPt^;W3PqoI2SM8gSn3&&+(2%MKhQvq3Y>b| z!055)CjQ}pJo$A#Y;7R7%E7{k6?gliv5kR#ovji7~sHxlIVio`vFBV;P*@iySe3E1*$x3HEcnv-=4A=cYX7){e4WB%OYMlz4cmo$;XiSFjzRE{PS zsJNym9a-(Eg9fVHBosIAc+U0So#@bGcf`6s4E~As|%m zRltrsM)UD%f%y!dPMcWG$Dp6aK5{Xj_Jfi(6MD74Yv52b7dG zzYL5pY?_iRGeZb5?NsXR#G@aZ*CVK+sVO-4UKnFP)e;(^dMRX2G(y>5TGhMC@ zlRDC_H>0E6#&rc%y^eI0qv&>YPXBU7Clm;5nyQ_Yroqj9Ij`#ip-U&Zp2J+3z%r_n zoPeu;KXj5~T#351$XF2BfD5iDyNemVTD%cM|AZW_cU-aC?t;4mHa&9k6!W@tFOn^|yUT88}^I9&fJy)&k| zo3dlr|Al1qdT1WzYfKNR&$%IaCv`d-%HAdc=bue(gyU*uSB2bXWqoiNE=m*j;e?~h z$X{faIc}*>a9FM${h1fV5Qu)d&`m?M{1Z_( zLOck6;L2$gNV>VPs$ceHrqvS;nSWUWrA;#%d(s1o*n@DnI8i27)NwPviGg-43c{dw zXIY1%B5`!-=8P2%^!MX*gX><@AYv_J?(RtqRukCvyR-(4&A%RbZeOZjiIq# z^oA7dSvbLgl))ov!y0_c^~XJ?Hv-{s7ugG0H4J**n)xYo?<$kcZvM}XKLP_@K>-+p zJ2%^W5(uVOaD2@K|L1Y;L4ZtN8x;WU-o;#SEyjQOXI&2SGFsy zO|NWsZeqN$Jyhd?3@rWfo^tIUYh=>2c>in4x?$nQ-TGRbhx@f35L9f4yccA0`Cris zvcYfaX*L-oa8EeRLr(Pg#-8jt8v=LE$oV$ADqc3_TRSD3g0nN?(*K zcw54&0h>bni{FqbY4QiM0Ae?WF}?g`r)`}FCdZ7AgcC92NyNo(V4ubLbaiy#*)wB8 zIOyM`(5Ljqa-s#JxBNN0+3Vkn`CGCcM!b%*!^&Z<+d*Nr-yb;S4b}$#hdDFqR7TF< zqV|%?h`4UMGu+BEU4HmK#4C+>ZuDXUoPQrXex;=RY2pBblFGI}Ln>AzmAS+u-lC68 z9B}sPBY%TW*Vt2RU!3vq@N!@JZdhOWDI8%u1UF;+Q=wd7Epo23HuB}J%Wi0ZiVbh> zg4PCM?Pa&yE-o&&z32hj#h2Y6=ku^Yi0VhjCl9<|Bdv8r7?kvvtH3M$WN)0hd4T@_ z`9-Kd_$d$j@mIxWjT1@5o{ltpydSZk8snGN#tY8;`^#i+m51QX$^%3D%N}t{C%WRS zE0%BOQVR>Sa3Zl`szsYM(bb`7<0rb(qWPh>0;<20xseC)5UP|f3MYMj1LW?=z5NEr z;b_&=Gc82%5r9QwmopIqqd%Q!TKx-7DFrpp!y&?dBn7R|+>kZ88V@;sAmfY6WRAcUmBN7xph!P6hf(XO9h;UXb#@1+1p z#kaIoqDbyx5Px;HH>~?eeg@k)8jAKmg3QHn3dP1FvpEjB1^P5g*HqQO}5l z$ySBr>NW1pz)HI|%`bwb5YH`oqTSA?3K%(YBfh3<`8?SjSCDf-bjnC^z zTh}ERv8GPh*~kFKSWj0EuiAXoSdD%FczuqB4$|)RAR+M80BHNU9OAZ!!+`pb_qiM# z5l^DUcq@{?j`zA7GzM>M;R&B(3(tkspUcq^_Bah`=1Lq)s3A+)a}X7gm_bw=%6U~l zvzaOm_WJNB4#p&Ch?kSh7)0eEYY>%(Nl$MLg5!g*vlF3c!bI?yhFyHY?+aOvYY>Jn zjci3KEMU)uE`#MyutRSgER$W(cL&Sc zkzuzFk*DHQ&!JSC&K)YZ<@#i#qKyT8Zl=m_VVD0=F{CJm;IYqdU{(_iQ43S$HXKf- zQ{@R*`oU@P989zNFnRVLm$n1c8IGXO24Oh0`g9*Ie}=_7FkEhhnO7M>i+5~Q}UED&=IZPq3KGWN7fwuYhkx%1vCS z-44b%>UNBdjc{WmTE~Bds8N{r3TQP-ZiP*95V$kxcw~K){2nfMUK=IvcVBnPoh}mj zelI^P?gEr7P;R5%23RW~9%w;2-tca%ahB!oLy_C<1S$ed0gxXTdn zNoAHKGR~vbkV;aTEeM1sK4g;QGmHh|Dxok8@Bet*(p)#(7B6F_+!VnZ0RvXc4Rl|t z;pnksCKVrPrW`@`Q{+Esc?+U5WgqRU!YB^XdRywl8=11FTMnWA(O_C9e-$)F$w_b& z9VpABoop<}I*uCkSy+zy^K(Wl9fza9m{w4T_qSkN~lsIE@68)C=XZIWBi zVS6eRC4LwP+36PKc?l~>8fF@2P48!U6LZOyJ;8gH913g9@=e4dg9F29xxS8B1hKQ{ zK&f0&IHq$@dKx>A(L#k|hJuC9eX&4w+d_q-%t99yJcMsq!4fZ6UV$;QWp9LM76$_w zSZe!Z+L6da#6H3n7HvV`H%A_UJ-~=h(fGt1xdXCwX%dP`{E^Ncke^}k zhpuxeY-UJ}>xS-Jd@UhWvFOiheLpO&Q%mERbh7a{CY*z0$vvA9JT7hGxadW8^P`zEe_j zma!fSsf;aD(tiMv$1P$B;KDTRUP$SSoW4SOQp}HJfG%Aqe}yApzeRN2BO8iV%8xi34k!k>45f_a6p=gypy$}* zdIk`>*P?HK#JJ-zl@0b(@|PxqRa`sEUN0r(rgM7O@I>;AtaLm=x9J2Cg z)zO6jp>y4FB{EXgyiTgIJHz8Y($3TWNBIjLN%~ht z()!<63?ykXX#IwwptF1#eo6^->M!{I6yxl;(@MHb7KGDET_42VQJbk~G}x?g_gTi> zKGWrwVdZ8VM7s#*6z)E+mO4>5uW?<)(ozh0-QGZT$H!6~ zp4&C-Q5y48gR+naERoud|nm7{a=pDy!d6IP0d8v{M_v#9dSpZz-8Qh}Fwj z0uG#2=JXZHGe(%0JkOyR-; zqN=Hzs1`601{|RLHHl#X4G&Ui(iI%OWRH^>4zP|rexqP8#h%RFg9-*y83xevkV0P5 z?DY?Z$g=WGe&H|$A%lUS2c^oa4+8@tZ2G-`Ky0T&{C=eK8A>@6IxjhL4?2g2M`@>R zdz1q5#!(8$ECrBEdrf=`DIlT($j(9vh>-!JGpXfEG;*gRai}MgH+b_HjU+K#yv?@M z1T%1l$A~;7g5M>g&g9#01;p8Q*L>{YmoW5Zv+DbbS94Voqv+cpOLX9Q0 zOKDentW+8Qc0kXg@`wIAm8vT9+MTR#!R=Bi7`s4UC_m=2+lGg*n{_c=zAXsyFUilM zQdxi{CllE{_BTB*Q)OT;?N7RW>I?Ktdzp#}ccr{0?SFtpQsFqDz;TcTleygXtL3$$ zkPO~yG|j+1dd;)VsuQw|#iJc{gZ?%Yt6Bf>Ablj@7k(C;S2!+4Y6p&CAN%49O%iodP)q2H7t<`ny|Tpzl7 zo1$>qsb=?{O`Kr~IE>6^oW4Rl&eAA!WS)G7&bNH;((0dQ)gOG9R{sK4znNu_w_24% z;UZQWr(4rHTZlcan1SF^VvkUQpWtBZU1|?1Wdd?Z4e1QtoP}7*+HjU|o2g@^#zIUT zR~WPEerK_XNN`$91>4wFg7GfK_rd04j>{_O^5ZjNptA*KqZaDBLOn1fHy9hUV zX8yRPmNgNMxLU}RJ=)DO0u3FvA>|jjo$iiWxJ8hS*SU6lv7-kh0!zvrEiQze`W(My?w_h1y?#p zytjpzQ^#Tr(AEJ)ZwuKQIN#ec0)HC#Sco}r0_6HwsD4al3Tu5V#0oe`18H&Hf{9VX zfJX5KzO>NGQ6@Nl*3F+fd#!Mj= zv$NK_GL*tLo57}=qZR?XURcGhH&?+aD~#eauM#+wg|V&|uHdwQ;?x_ahtpp79m7et z&{jL6e`pkHa=C41*U~Mrg+g=$#cHvFRhC*%?1d2&EA%X)Vg)^`(yo}paPnKCCPTX7 z5(TU67>9PnrT4`u2wse`l(Tib8chLPrU15FEk_QRqALQnLIJF^fdXcIFkq+##lS3s z#TU8iJA(q)4+>z-V<=!N8DKCVhE{PE6{_amtJNwd3acR|!ZOHbjXh+I0@_-&u!%4! zmV&m<0kpfZG{sy6v^@2D0$Lse&2PP9;QIRl=L$pWS%Tq4bqm>ONsS{vvM<%)|3@ST z)S`78)FS0TtD5C0uAnBRxJ?Rb4`TRcwHU>1c8ZG>w}ob)P}~+;4Ml(6s?qwW{6pif~W*ym~L`E&(SZxc@igse{*CS`Nt79Rg*RKvGz1@ucb@^(1JW5rE z5}#jP%TS^@PpWTuj2ZIxLb}fKRnR^bwcMcJJ&x9WzfzwE(0kkgmVm>cf57Q0MByNf zLI?elIGo^gfxZoBb$?Q5{b&OVG3FnJ@4Ru)KcbdCQ8)teK9+W{s3CoS)JF8xy$kJ; z3Q2HX-7#ATB*a@iXHHj+5wx=4tQEAz=N3m+oqJUzH6#n$m5p+9J1-O&B6mLdn*wyKEQRRy&Rtte{ODuG(d))cj8 zS}UmCV5s@uREn!iLvCWt$nu(B8(Ps@3Up;^r4ofQ2HkCY$ZZCl_Z_v+WLH0u{bSyD z?UC*}peR006Gu0mWSI0z)6zW;iYA7EI8^!#a||4&y&sJC8UjF|SPs`REJv`Ehy)%J zDq{IHMkBh#`1Tabk&2_#2T9;h?J1UL+ACO&*3yM;|1nCL6)eYKRS1@gJJ9Nm)e`-p zxz9MYW{JW$Ew!oX#@m7*t)rr`CA~*9HnM;_(f-!I6I0z7a=LW&4Ibt1WQnK4<>dQf zrLcbUCso$(k961WDT}hGG(`*2I<%urWr>#KJHMwX-%V5Cc>vePWv~Ps_%6fgE95(% zQ7GR@PgA~&dWQ1d3@xMg3C~c>W@;(D`+TcbG*S3g3wS9)Tj>5QjWG+WOK6^~X!>N@ zqh-?YIzFO3NW^9$RuiKd)ETNiNBJ-DImZ1vJF8%rwajWFv$*BJnAL@XVNt4eAM!8i zVj)IF|E?BtMyWwp3t7dTt7TS`d1@hW<*}=UtPRcAGOLL(iB@a@$|bRyoMVsQp{Urb zCJmpbQ5Mp$I=V&nwE919Vb;~fm=Cd<iCn*7L8u<2L|WE)s8fo$-b z6(QTGKvu6ig>2JNWfR;3CGWLp);5_?d{wkeQpS1Xz*Y*z?s zhb;&UJt<~89WdKvf1BNtsaXnU`Rbd_U`VE2Eh*XJZMU@0EjW8vBo&rD3M_kBFoC6N zuZpnjQ()QFi^8(M60n54!<5hiPH~C)MYB?r(1Q#t-$P2-8Ca0_4pYb&ND%)n#q6*G z&=DmvcARzZQh<&+090sy+vPn9&@ly|O;Bf4C86&+LxkoR^jMb?D3ofN5csgcAoLG?t(onLq7}Kc5)F6&!Hk!tiB@JRk1bc zIm^2oy!L@50`vncWWPy?mhLyvm$HZ`DP$?Llu>v1B_*`HG2xPyZa?w8tR&CYK{5tf zDz0in+kvzrbs0!0yw5;N;a3$3zowQi5u!e#FkDwCyznCm!wnQsq;Q{`YWWg{o0PH@ z<9FYWX|!83td4h?Ej?7SQl3Y)EyM_vyl*RP?)!-naEG$_dmN1T)IyvH8a}i9KlZ*m zAgW{g-@9z52-1GQyDAE{jU5t8 z>|#$Wh`kG%Xzaf;Gk14cFi-P+FW+zSe($f{J9qAs&&-^2=FFLMh?z;6is``Tex9c@ z;sKqCnHf1wCPz@W@AUL;1O`YVB>mUVtB`cBkt~yKL5@_(f)q=p3-ZhA3vx7OBZAcS zFPR`E*Zn)Bozf})uVlrSQ(l~UV`)|Lf*h-2c7)^Pw%ZouS9C#+$8Mll1#w?fFej*F zkxI@?7Ub79k!q-2q;kCNF_bRI3>CA9%e1}01v!*0$f1N{IT7+HERzkODGZ>RQ(3Y+ z52u3h%eYxNjI*KmYurQTjG%kSIgmtfDjJa&jXTb{8L4brQg`S( zk|LEcvMO!&$Yq&iq`>&CZF4=Jp>y=xs_2w|%VaC39#=yLWh*1}8k6Ti%uofVyoioS zYn9OvWppIDy)rtF#!z(3GCG6DQgkdbIty)`OW+qWblQ)j=qzIB5W(DSu_M!B22;Kx zC0~YVi7g3T$Bv^g#f+~+;g?LL;!}Z&omyU=m?v8>6{@H>9<+>o?@Z~D%q_#Ej)#~Y z%jNRrcLZ`ubH15IN&2K|vTU>o#|hQy z5I7wNq6fcO#moq|*n7cm!NwCa!mais$eB*Hoj>BjM*^?kW@|JW?qyL3x8po=&ui$u z!~PAw1BY1FxBEkFkb&5V^$|I}n=N6Nipc4VvQN?PX5SN2_P#SIiQglW_@gr^iQg-C z*+Jq<995RcB)-Y4DkR=xAIoH4m$Pl_a=*MTXIER7v+24#=(N_VtxF2=D|2Ky%PB9e z%fqx*d0ifs*X0qpy|#5ZhsjyCbvc(#uAk*~dDPLlqw>0(Cu_ba)uQY2xFgeXwk}UN zQclS0vecG@>vA4jm)Us=XF?C=T)H~TWDadV~Vg%gNaa3-&g@T!3 zp=55ch03hAD0KSUwx;7kTF8Vo1{ub2r4#55gX^xXbttPj;DUUX=^mR-_w9x8_ZeIe zvN(^Ks63!hL3eznldKsmu^HRA-|$|WGNxn4kZpJRaEpZ6s! zDWp?lteP=`adJzL5sXt;Vg&7$(QM;sT0{K=M{&cJ$&6qkRz(;=DQ2bcOj47BR(TfT zL8~5St;q|9_J{Jqt%#A1!|hMMmA36qhMK8mGUXOHVF59#D2X!3t_c1K7l@w13aGUG znd0;n604~+3n5lew2JDe+FB`TnvQ)SN3Dykw7Xeqs<&|mdv|$IGu_QM-_aa1)DGQ^ z`%Fi+nKZqjewIB6xYblI-+DErNFT1wdq6B)-d{^e|2!ONv~ba9v;4$ry<#m6WCD1s z%X2apPld4cbUNi?ONhDL8|!V;X+A_}Cg?2j=?*$AZeW45p68C#QR6Xi4 zZKAj=e*!M#a@4I&jQg!{%8L_fC9Oc_ek;{%Q?p9$qs;wsHq$9)RkKY^%`FtM?-+pk z)pBMW_<39Cre+O+tEJmo`wM=p13$76+!AfDwFHWn1_<?hjEvy3=H+n;GC&*6k28kzI91}5<5D-mbd#j;&sgxUR~y*&ORjPb_rmx-Ksg zUO16A#BQ?4)e!<=L!8hM9-hc+gG{k?XTMD%GUzR@`&HG?qy6a!p=W~_s85%QONFK7gYi(vFy#{@8YaDjKR3~sDucZ%d*{* z)7GELBd$=6pUP{EhaQ2aDUIoRI0Oigs4=_uf!AV?i98I8Q;EfIbrv>iA|| z$omj`Gw1@fK$xU~vI!9g(}lcf)XhznAHO-VKm$P+^8zp}Lj$>DCm-l~F)sq)8gh}s zm2(lt1K~P&3E?_bK;Y6`rf@a9Oa+1Inrwp*$@#hQGTjc>xMOVZwn8k-yqwntx6@e~ z7~WCvgX@=ZI0~WWmAtXe7h4uwq0r5gyW{mwpwnKZb0*-bOs!{YplxU2eXluA0P%A) z5FaHpfa6ywBy%-zwX@K|eV*M9Ek92KsV%$u!lV2JZ|Sq`=}>Sj??r^|{xxdO*Wr3z zGkp5&I+cV9u2V?LuIGUQQ@^}H=gagPc~Pp@(3KdvLu)Ja^^#a&HkK}7Q&ZWgP3l$knztE-S@hj!$OEiq1 zfAcHFW~qh>MD7KwNMe0ffK4VsQTJOkM&dwh?8)xi|9?eAlp2oYhJ&`5uL1t=zGH!lI(r zu>vZ=vCio$gkwF;Lg6snr-XWghVC@nH`@EaZ`808U$+Oe<3$>F;#=&Q`D z804Fn+wGt8+cofJIFj8QP8ejT#waE|O9*kS*AAAG%sdTVx!<9IcBN=ql@^9Onei zxdS%hr4)#f=spc3mEq3igi;_j!uxR=BBj?KkTauLIY=cC)2PvynxkFX>aZk2|p1!6y(qZS%-=$%l@|Ez(U1BEcpqb!et&#)pvL%XHI zGl)}&R?vkd@WQBR>iD?=aSN})d|Lw{b*jL@%l zrO;oHu?}++2=o^#Lx0Jho4+JOf0-o_=r_7i=*!(~&|j6IzsB+?_(O#R`fCjOK^_$P z>s6sIXSoUVc^P2X7nlX<9nzz0$R^&SuXdf_%Cb+7A?bVZDz)q{9)~D(*8zvg`!< zky^~vb~FLQ0hAot`3lXD!H?1s7H42IX0%)lqMh$s1#RH{DBNS5DtkQK zq922MtW#cudmODmhI^crZC%H+T5WJA`ct?kpsy%$9=Fk-!aY$-S)G28oEhQn9zfxq zj6ERNRx%uKP6P;q_4@=0M0iXLq^PC`BC76$luWfX3(79#1$azjA1e6sIYdM{7bF-F z)ai02#=EfXSu7g?HA@S|JKcPtO>N|29J|2;nxcp!fY7RZH$i@^fB&@e|!tlFqy>sz?Nor~>2R}Qcwgkm&LOIe^k+kwRW5P{h5 zr-xFgap1`h^Kbge^TxV3uG4*3vDnwsl{aaEe3gPEl?+ z(~BW85-UlMV^U%iKEV3gh6_ZU^jf%(W9N0a^B}ij(&`AZUF;&rj1<1|T`Z&Kw4H;5 z2s+#H<+}cfTp7KD6;MfnSmN{*ws0xULgpQmMhL_Np#b8dPzWky-=gFMrn&+#pIU|x z+k{I)`%jy!3mqkPP^!htei@SZglzz5iO!wD58ap1Y&6%6GhkU_gX5i z!`vte)(0lWrHP8B6LB+xP``y$MBrZ+jr1si->Ris5?|2A&{-H2Ll^IxF@m04 zC)r*Vt{tod0@n^1E*qP%ZFS$qCAw3FDXoRzr{BfCAuzoeFI2mlw;Pfo1Rrp1Oqb~% zr=C9+FL<>vU8e6gmX~RXmhNmk_sQLpPha-YIS0{AC^GvQQ0@op81M%w%{~1=dwNz= zf$VF#H5JG;rOc)js3Qz0KPYV~gj1ctPw0MI2!POLf)CZP{EURLFSQ zFtM5N6BVY8YGLuqLYT)f843Qng^<1(%@OkiSkqh}Mj$5`o|JXSo1{G_@M2`276Q4( zRjMT-YLxz@Tn3_<(?Y0nd#QO#I_XY14cp^EoZXUwxTvKJ;u$R!L7~MnSX~ePtQLaH zkk+L*K96msiHxD(bg`sz-}dw3tX4L)CvcdZk)?o2?5wu zU2CB=1?!3yLQkUx=EK$k(@(v-85vk!4$$at}$i|yD&jJCYvzg>x>cW%UNCI zc=bUW3SI>=w|749h4T%C7{YL4VRBmv+YQQa*`5-1v=!uI`kOfPH}k#>`bBQF6E(!j zf5FdCI~x6~++U{L;(wKa{U;kv*xil-d!n5T>}|$(;r;d$*x#^ba)s%RTr#etJB;`0 z@7j}~qCExo9ySBFm+trFW@2WH*+BR&-0wgK<^eM5i3`~F$^D_d0RABrM9|Kf7mO6~ zM_9>iM0_qU=(z5Z#0!dsXlf+Kld-ei5jraRkOe-%@eWLD^Lpt=vUlVFBkp<1aT1;v zW@}|%W*xzFd!i30I|`p8-x=CbAbPHq9ff|}c<_Be2$8@0}PtieaG^)gQBn!3mQyqPL)P+vtX~1>GCgi+^%X&yx z3i@=NOf^kiWpuN2kXc{whdr2;QU}O-T?kn9qL9mRn_zx7AsadQOu6}X<}-^`hB6NH zO%NQaG=^ltE5iHmFhL-ugl^p_oE^JUIEC&M&L6uAXkX0n*#yqk9yzQu7lQ{nt(*-- zJ%o3w!kNq9?3PI3oc|PX&P=3mS`r1O($0f6orMojCa2Rx79w#B>rXFJ+IsJ0p*Gf12>la;0Ikfb@B?OtdhIho6_9XPX;r34XXov zVN(``Hc)GvzCuR7mS&-he)y|&?yh6l>et&Eh*#(P(3!b`f(qq*=%n0OX&OVD*XTeL zQFI}VJr&z$GST%Gy++0L`>#=sAN@Lt>j+{0H-zZtPAnwUc8gQn+%>Y2Wh-k3F+|@g z=de%cAK5!MoX~sU5Dd5js(3^A2IudPH|hK}ze$nR_7%d_CyCYPPQU^5fmywT(Xg$r z;Eq-@{4VV9@S%8E*cY2L8|w6{ia7M6i0^f(y&9K8YC!Dx-TKRPc%P0jxEcK^9p0~_ z49@+49ajE;jxo7|_9O^PrX=E!jxae&A|epF@?ho_?81vqy6Ljm_jH;f2v=0UUtWH9N$60xd zkQBHfDJcF&RS28CLm@mbL-;%Vj1tsY?@$V`@EsY)i#m2~=8}w(ENxxVv1>C!-leng zvX1U2^;aBNu78(ec@>8j&F~nxy~bV>mNNN0I;pQi=6g6JF1#m%p>$EMBl~GzFuX4q z-N}ltkX!5l8@md%{chO4C+}|9-<5Y2I#@TpFRbTq<$m*_kbv`O$A`i!g&~32r8agq(D}UfnLEd9u5D|ORV4(%K z5AF{ZY8#J~Vax~49@rf{`OthcJ`=Y5fi9cx5{UP6UmPM-jyOT0Gmac0kcbm2hajuz zjd|1bG%t;R!MSlhph*!r;=D^pp$&XLMTo(tnJGdv6{AL>U%vxdZzxR>8r52MQ^gzj z1yT^262F3Fjn+eI;&J$?0E&UKM}}_Dj6a7{Sa^H@2=_q13nf0&M^|QQyI!sD;C_o z6tu{r+@P?RXoR8zQ#@+UzRLpLxEL^e243zn!OS=)zeJ-MBx)wsfz0RwxB|XJp&H|X zjF|A)I0;#=O(M|`l3->ycm^#A({HQdNS;009Ld+kyqt9ciIm{AV?s*|P0=A`0$~*W zQzm=?eMej+c&ASijwycI2FW#tMW}zlIktrFo%I4m6{w8zSdXI+VhOru2yX~P9Q zevle{B^W$GPdP*H1E@xJ<%9{^>m`G-8hoqv=pRRcEe^W}PwJI^0P2$NO?Y9-Rx0(cu<= zabQ7!nkLDEbJ9LI$DVp{XjgWRfBLS>nZUZj?b!EM>`L178A?dY6nvg;o{`8d(~GY* zg5f4XL*fJclj#LGy;322ijbtZuG!01yA8f zI4dQOJq_%N{Ua=;wE^0NtDCa9HBc z5|(XN;=es3;qZK+7dHnZrwJs0QI`e6$5`0<1p=|C=y%6G5M1+wbPwj3{s{S+c&49~ zC)DExKyjYn?amy~(^u$$zAR5L2ET<(^kQcNH2fwFC4h1%@#zjFy;Q-_N)U{03x5bh z@8=jvK!q`hOr7eWM>9e2Z-5TyRlIkl&(&1m*6==btA&?G4u|r@1N~}2NaT8gUKGMK zTh4^hv^Y^PvJ&L*sk8wuatSPgstbSWZWvz^OZXCVW0Zo~q7d829;Lv~W=r63ORtpO z>|-x0`K9-j1mYk)NA?U zU&-%X4kf|rP`5gyXZS?fh`U9Id~YBhVMBnl9pCQ6w|t%yfnj<1P2~UB1?0cnv$~EF zlK8szPvvh(eq=xm6z>{sP}HLzY+4RE7U5aNqGC8>5fV_6YvA-Ps(Ttz)KM_y8$#JX zqJ3fDLLp8?BJ@SlplUvlzfg$sSX8X%OF2G$2jOV1zl!t+tAM5e320$CUV z67FEmX*H3su&8JjpAAU@#`sD(Gr@<228F?kgy(6|M;%2MEfS(s^RD>fcA;XCP}?=* zlwK|+-X2{vW-;2Abca5RDd0`eic;`b>|H*+Bs>`0@&&D0#yTjUV%>~2(RP0Q1gx7^ z#=5!v)9P5W5E>f3g$?Wce1Z2ONSXGj`H>2P+DlV|ZwX~Tpb{u}i6E#IH4uzvAeX}+ zl0PpI25@_!?NU5cQozSc=~9-K3bQE*Xv;FaRv;80O>r$01`(R_=k9*xc>t!`vbmhO;QBo&)(Evb%KKLV5z6ayV2vB1!yC$H&zHwN2h# z)TugM1_l=|j)1lc##)7E)CAmxr>$G9LLd=p%DxjeD+?9;Ui1ZuD(UsBg?cDqmVoh8 zeIM)H)k0?ufw6@!^|b>d$1o+p^j}MXS+kY`b9k+Q;hnSA;a&1TY43hW{QH%lnQ_!gqHSY_^rGQZ$R0t06c{}Wl*63wa~{cyBL`} z^N}Om_?wPONf25M&%zTB46uX0*xo|=*j~YqvOuT@o|{qq(gQkd7TO_zhG%vJusY^! z#v{^6VBCTnqC523B776tgTEse;KQaO(d8JlL?pmYL&X-Mu8nX7Zxy1355(xCjQn8! zr}p|t8g9ras5Z(0k;mWZo_>v z?l(x_f;QWQ8`#m<9YRx7z^nL?9K60o_@EIBYKmGDHAegB!H<%C{64npgiAumPC?^p zpG>3C!}33h!c2go3@OszE0f zn20~MON15_x@jD|xmftXV>TD1l-8 zj{U-U+Cz+NP`ni>^_~NGpq~S+4k-G*lhlJ0#9aiCx07%@eZI1||0uNQr z{4BIWIu>?R2y?-e*8T(|%khQ1LcIzrHJ^Y{2&OW@*pa#UM+&q|?vU*y46Ih4~~prpF)<$?Sb2;g?5U(a&WsKw1ZF22rIDJk!OX&9=lx;*UfUN z-q}g9(VVZQ2YGNpz49NC|S0x)0vHd?sf@v$8hyUc7G z*8{eRy$_{V#!L>#-+})XA(A3jRtlZ22qc`6`3fEB!(4W5y;$U^$FB%_)CsEiBj^JD z*0=yrT@@ld%BQ0f*&6(cZNUZ?6r9^$#RV|~`dt;CjkLO;^L;kdct4iSE!pWl5uelM z2Frr)G3XzU;kv3sn%D5hX@fC}^>HXzI6J`ggxrA|7>qaUn$XFch)WAx_==oREa??& zS}D4Yf2SuN-d_{K;?AUpVVicV`IB-hFh&(?MHwv!$AjZD58H(Jvh397V>q9XY9a46 z{3%;QPC?n`FjQmTc~uSduL~o%d9d(0${#4IU8fR6zj8{;=-jWxocyyfBC8kO{KqF1 z`M}0o5eia&`E?>o0 z$o=qywC9G0LYrGc5{lh7z-vyrH!QeCSwY1u$_hMgqb@xGUbu}1M`SA9!tqMIDhLX0XS&716)ZVMr98_(HxOz5*8Kc_16_}_%7*#6DG z(LKW(cZAjWn__$c5B%WggU6XSMj4+e!APUmOjAKA}sszLpuKNJ)+c`?9^&% z`0>;mt~>#t@DU|{6J(dXPszb1Rw^TjpXm75zR;(~iG=!1?B8E|)ep@7m z32iyigg<*Ykuc&boVXr;7Aiz?n6GyciHR$Ev)`2*6a<5RT38ppauHq8UI^q`Y=Im# zyzJE;PXzfHP+I4OfYH>mmVGs6}F~^P5_XRQBT01%2|e-u}>5BWjc*I6e=O-{|QFeKn#E zBfSZb+CYug-Wt)B?&w9_K;QCp=PSqPhLUsNzXCa(I1j6@R$N4es#u3rEr5O}7Ix$& zLmR#LJU1WG^eHUu7*8(pYg~tdALKj(uI0DEp~AH^qovUVDzlz3!bi` zUbW#8nHyoQVr|W-9WF?3dIRq&29jXkxw(d+wbiKgxEJs0Q^Qb$SH909$!VZa@)z#L zzfc>>Z>Rb~%A=qCv%((wpqruKdeGNRbmP7Uukf-cNNoE;Fl28&=>h%Xe^a^qb~_%D zi_>4m9(bL36r{k%vIY~{8?QX5R(!z&EZ)_X(6<%$>|f=cS{S6jNBpV{bn+0%K|qN( z;usCz{a!|dS`OTun~;TpyP?85!k;B2f$6hMqF<}Xm>H9T+ar)0A7w;h*zt;^iT1GL##56>sl_wQh}TL;Z6P+(9K7g7gHM;N%xI4D zAU$^T8hA3CS1Yfa@>Y%9doD4gC#d^lR zxcuc=tPC=!j2@JssCnjT(Zll#@b(iEU4M9};~Vm2rD_c9S9HwHCl;j%`O-S7ATf*& zFFPkt*_3q}7Upjvxj#N;8Wj48aS9BjX7v2jFMDrZEQe-X>pN?y>O=#Hi336*${$y8 z4>0w7@#U-yo%PtW%l={z?tt}Bq4e~I+5uuHKDk2o)^7yB9+z)I+|@h{&`zV5yFu=b zCU^)JBEBuh@g`@T>F|s<)Cv@v{-(rt|!+HhqORZk4ZI25=IZda@`X?Xf~Ks zx-n2}rMf@a4-tBZe-X21f<&UV9TbGCY%0tT5<7E?;Bt`IiNexchNW$7u@2soORg3DpR8k&W!A7(7lcrgYbM)M>JrZ%6WCf zPS}xXNHU%9hI`~)0z^iLK`4WDj1Z%706vbu#A7f<swI69`8l#33%d_$I)2Z0`@r zb;Sr&(tTSOOFITqUHsx09IPvLr7b&XYgwauVx2CZ@GV)(SO`tr+{=^p7@4$_H=}+Y z70eob-4^_Zf@KXp2P4DkFfy!8jtu)e{v-N#s3($$zj6>$dvQ8hO--_)F8*jeY}8wD zzaCOkRJ`+dUJQmN^~D!3mf>^~D(FGzH%d0vn3$yxP;OT7x@MZBk}?D7)PYwfGIh#)x8m12HTl#b_(H zm?{!bpFs=8+{HEEQhm_?x`v`FHw}Cniape%lpku)rolH2X)y&2#Yj}nZ;Cfo}WtRzYN>=!Few6N$|GbLbN(8r7d-1wYCaOpO%76yI{${WiJa z5%kVTTsCM&8A;hE-w3~%0eu^Z-(cdgMz|tZf@hSNh)>B;Vh8-0A0Venbp^V#I6sQQuf9NO%r)^MQ<5(GO?R5y+k1 z-w#qcT+?Zko=?_COf#G?BF#?daUel zWd%^#;mQhHYW%(_kz59o9cWS#s=%4-kTN1racl+TepN|!;3v~k-59x2*!JIi+Db5u zdfqPQc>RW@rb0?1$u8$)wnNg1a!x9iO5~hZu++5EOd?5tQzQ~eS%gF+lJqDk-s9{_ zMQn{4t!pSz7%5u`MNtxooou>>5+#Z?eZ^`r2!D49kwGdFrB?c42gIrU#7GFnDnPSy-8T`LVzG}@7dpQnwnMX~;?Jdqq?J^!wD$#3ZPP3D z_mxO1UCbQQ;V-M32^C$$o``YBuHr!C!!dzUOE}e4d<~O|10_G``J&hhi--x5 zqT%q1;w}82{DBw*7rKeVu!zgGrG}81AWp*c!Vg6}bnY&uVtQPN6bwIh7mZvm;3UZ( z79T3tx*+9+^tMu5lT59LSa8C0EYJv>#326gxYpXy3m!0TrESCowhO79h!Fa|)xFAL3pMiDex^l8{i&U^H?S zBaf39Wo-Me5k(BB9V&%5QO0LOrD~KBkTMR2kzvwcVg*(Q9t{zR71)25?!SpnZg5(} zk$Uz_v@=!|j&L3S4Y5Xvmdc*8L`!AQ3@Do{1*m0-wzBMr678QVd#)8 zRL#HRV^n4*r-pGsuy>K@4hPc3T7+y~NEctkHQjUsC7UUWnebUMM~bjXbSQU*!^y>> z_74i5TK(Ke?$<~@=p{*Gry3ixSTxN(c;|EVgnSHw~rRdIX#M@Takb+&6R3H z_85_vfS2c@1bTgp_%Z^Wv`qAYSI3IoQ4E#Fic>ME^*9mfDG@${VbeJA5&plLCk4TY z@l^PHbAm_?NKx+ehlUfy&#=IpiKy+OBBv4cdl4@7dl6bbf=Jh%vgqly zxW8TW{CE;-oYumON#ZV-f_wYm-N|ADHU1$M=<#dB(2i#O&vUJ65WTtW-(uT8s^rn~ z4XEr+ze=*1{3-1_4Ezp^7AXY$GQ>|5S9DWN*Zi#uGQmcE8{P$tj1$&Bzy;A3-H}0(^P|kM#P$%_FE(7U0#Nkp9W~13Z#DuXsg4d$tUAUlH-7G{TIXZ?s6QI`fVDb$yh$u}K-Vlkd`Ij4FQ}twWbb}6QAEo=a;>Ea*;d*xt58VC_ z&hJ`k)qJ%RJSWA;gXLiE zp|OMj-R_7){akv-rY>m&pWhXKL-Lq%PwYg<<9GMP@9;78f!KyTE_rBEll+fP=F%Tk zIhiYZBokGXVyE|)@LX=?R4L6axBho!|I74Kzsgynf;Y4hIf!>Ap?{8@1D0CZMv@-M zJ>Eu=*g2q$fw8}M2dV78%{1aKe3Um8;(DPXbCi!%$spptM|lcjO?~7X z{1f|zKYEn+z$TIYccK656m^C3lGn56>IZm#j@IR0C#uND`Qa9Cw3(!5cIK7zc!HkU zJ!EHgG${!xpV`e=`RAV5Ew2J9dv@yzzTxQL`g27ao&hqpj4OJ85m$PTI|(#eIG7%IWV7?j5jk3Gi$O=_ORAHUzw=Y z9VFtZYFh^)rdscJkTe{;J?qat+xfdK_dl#xUFN*-!J}&>0ct{5iQMD)6Avo?ZumZx z`R%jBGK?xr`XxEgB<4Kf)}u+1A0edtp+hnuHDq5uSD#ZuD`h6Jy-nJB*omfQU&Xgt zn8n^wZR*yZQYeyLG{6nYdRbz&5UR@C`nE4ibX(u&WlCl9UdEM04RJ%&T1HzIv9(fsj~5ysGA_=uMx>-c|i%!-(8hn3(|@Mnu86S0oRc))eV%BUd%=POnSI^tRF# zKNP0+aw4_-I`j$T=`gQN1T@eMAFk%Ts8PTlGt^Z-(LSQeJ!duVO{*pvV0O*fg}P&c zA*01mIN#gRFSMZu#eVtHe(8`jN4zQ#g)1e^v3;b4>@+R_wtkG)03Y>{0+G1UbGheU zlZa(6yhcsb?!P7x9YMzHgg#S~3Twa{5=Zvv)TW~8n-VeTUH+zIx2YK3S0XkQxBA+M zwLi3fIn`mt`}?L9>dK}SVa%Yn8&YaKf7{M+Jz!h1)CEf}n_l4!^#(}oo#?b0Mh%dN ztwV?JFb>1g0TQuw*fpS%KH;w_{bHN{7bUVkOri^%Nwl6l|9u2ryuVrPwgj09%W0>?ylboer)J^=U7HdnZAk3aA!WF5wY>_Pg8w?z@(B@N#-jYBohcI~OQz_D6 z>L7h8{gq4|WZgjP&+WPaG*pX(NuQ%k@6fmY735x}#&aqM4qFFetL89sAmL3=zp_&fFC%8Zqo8R%vLz@C&E-HVCe75GP`{o@BdlcAWHQ+b;a; zV&DHEQTd|;9NsW7DUgbUneqd*TKGE%*#Cz}Kb5rIN}peae6weV^5U(T(pwH1o}Gxs zXa-1|iGCP5#AWJL=(!V*%ZTYQUZHm3U7#RMjQAbH<61g3IYiSDT?QJiwIPRRF>|C! zHfxjS{Dla46Bjj8VT6Ejo---`c-~))ls8ZyA;$x>Aoz8u=m~Xlq#sbqJ)a}V=Evk> zF9?wW*+uya4vimxvKEHDVjOKwxY zG(E%9#`jXM<@7D?&& z%AJ0x^Pp>|rYFiMMUn|?%q*6gDb&9xuq;nnBedQ`%kp9$P{SibP0!^pdy{0sg1qf@ zykh-%GqxH}w+C;P(s3P@ZizViI;=VD8tf@nzBn zD()i8Jx7ZTJC8t3CP2i%Pe-KYkbho!6`LQ+D(HGaI;7`LgYhP6fj@pbj&nR8xpn>X=}6zEy?h6NNZifLBK&wSn&LhjQm>$#cF z2cQZXchW5be4+G#q=LEkrTR#CHs6=RJx-q2P|rFI@G|?c^YH6^q&#OJcbWlxCO@DB zEPWuMr-kgKiS^N@48JGd7u+67tEjvcPh>|N6@!_8IAU{%mrgD=>X^zBdFb>%_qZ;TKy{X|j z1g!=Cd53v}){m{Fx|k@OLxEfvKjsHBz!&HO((^TfpE+ z^X7Y+y%b1FH`X$b#Fx)`<4X%g6t2XRYj{wRJdexaw!d@MzYz{mm;lwLn_q1Kbx%ANVTF z918;iX=~;MVufp=BG8sk#DeaeGG~3xQ%(e_#8qAs4>@dg)H2XoL`er>V zUTZXe#$k_#htvMM)S=DkRfiUOxeh6G4{3S?B=14~fQ81v&APPdvGp)-I*h1iM*C8$ zcYX6t4%O2q8<>L#{Zo^(pVeo*!MmY(NpObN=Cer694xx=jp&Njd!B*g4bAhoUfG#9 zh?AOWk>*e&z{?}egzYqIgmv78v5jc!?$3HaXf60mmjIiJdnbT(w z2PsdQ{1(ULryj)EGhLX!zX)_m=3OXWPgYB|FSukKvLYv7^>t6ZzxMHsp9FOtmVi~5LZWm&cWV89Nz9_UW=VD z4T>k;{0j%gPgWG21yi@qgRq>!kK*5lq7+IOxbMuzIV+^Umr++`rKjA)`}y~eJ36P%-wK!m7nZ+cReY0BCb}B z-t`186Nb{seE$F*IHLDALav_V(#GrJ%(~mW&0oea_rPEfQ{_#xMvEydnEJ^Lw~LbkCc+xFELa1I)Eya3}L# z-z6kg8K#83m4<11U-P;rt)r{ZraxUryZSrU5x?zibiSHQ))CB1HlOEu zS#cR@Nf^W5TSDQjwBS9^4306PG%oM-?+(%^d5}g`8l+5lkZ79oApNrHZ%gL{=Rwl5 zXL?dn_JP?&*0LEO(L9_mAkRVO81${xevtW9BzZVPQHmdA4o3E~bCCH{Bx%O!ANWCB z)-4ru=rlO@b4vJdu(>-d8T$MeRfgfmQ@=Y5<*NvpkNzwz?GWCX$*zJ)B}}g45cX<)BlrJ(I3V}KhH5^iY-Nz;IZO@LRSEa z>>`(j95H6YeQ3CwTGn|fJuh+)_mVjnF3vF%Ewl@C7!>OR>2u9vP)LX`n-PGARc2q? zPRQ6M-v<)sp)#Y7b<;faCbC;CoTWj1U5;7*dtzL7C^)Uvz>?-Oo55?jj&b_?^FuOD zU7oz2VUNgWZdtYyH{`Q^`V>Y;W-Ch5CEQ*=l+?`i)VB`1cuwY^!^LNOAk%F2!ZGV` zYL7pxHdFPP-eNW=mU3{-)YBiHvzXsOVY=O*SU=di!rTUhxrY|>cpRN^3(X;9bhzt> z!>H59_(9-b^*%5v6S_lM*CR3T{$j_t{LP8V(+o&yAsY~{G1W;)<}&l@KRO_IYV^;? z18_Xr!J(Dr!%sgZsaD6B{QV_^r(7%g*$zrZ>czrV0w;RR_Xoz~F$=AJ5hZL@8RfC*ye0$xiAwGGusA0gTTi3iE)TmM8foly< zd^%@;Vi77`8DXTc;`TPx2V{3Y5yjPnjoUs}L(oRE2O3_MG)eV_A-fvrTwQr~%a=IR zPuysZ#bchdji|3pw_e$3j!|%1thK*4`zpBQ*7!|kjY4hVu%$XMd~Xhd#7*Xb)^%IV zc*Aq8we62)wL-B%0mb=C{2|n$*TTTn- z7&#*<+kwC6VP>a!q9W}iWb8Ee=Eec3jXF>seh zmOrfBW!8DjFIU^uZu81v-!4?yj)S_pk-j8k8;3@40WRdg!gS<{FRb59KTf`N-W$pv zOw>Zoz8T%J+NCL>LwyX*(07knjZIJOb9E5xo%MVzIJ1XND1O8p!ozV9 z>L1xg!mDR8#tWH0!XrD=KZ;W;mZ4J&#dQB5`Z~$xiNfJAdg3aK>!J8 zp;h=8NIEeyAc)yPRyUozvVwk=HpZg1c{u5Ccm{D{U6P(}clejO_T$|iF=Vr{}D|n`oBs#U~XuS#gTr% z>`%ja^sEyK9k}son;)%;>5al+FgIR{m=^V!;2%Wy5=p#|{U}a$&rGO1`Pfizw%P`B z{~tWVVaVA-TF`f$W5-%P&v1Z+Sd&lPXqZ}FM!e*pITB&c&bbiD*>Mi4S}Pixkx#R) zV=f!g(@j0XvqLUMa$0Uoc1rCi&W?9T)z9%3H2u5?bJ-D3bae~QzJ@8j<=dinDr`R3uJ}fnhi6sx^41h|R_Dxhp4myRzeQ5(Og?`rn)N8Pxm7(J<&Q zj!40&{4Ye4u^q0K9myqL)(e+!2yiiA*DBU;2o4QI6!v}30>1>{|Lxx^k#x79qo!*s9$(B#6a`aoCrgt-(dk2fp$a|)^jE~(=<85%w{!ke(T=5Mg zXB_i}oF8YpS$mu{t2k~KymHPQhb-*dbLMSmc$;|M?9O3mt-cq`uPJW&Sl3)ICvk40 zx9RxF=mVcdyz#$eu4Ax=xUo6P!8J$YykKZOj7NPCUb|$D$3P|z)^!enw(S!1$gj1$ z26E%_d|>^oay=ZnWFClD&$QXbA`Hm~?LUub3mKPjKal{lE}IFn1nBM~mH+J@hwub{E zbg~fwzFfMob1<~o)7jl!$J1*pG+>S=beN7opT=D!C$H9DuafOkcWZ;|W+Q>4Yq@zh zJ_c5pFDvj)h3XeGr=&gdgOZ1N{%|s6sS4`gAfrndK@f@76Fej7cxs1Z^SdvTSbOk6;u$IZ4sr+lops0DN==5W ztknAR9kY^jr1Y-2C5N%n0`8;k7bknO2j(9U!-o&dozyE8I5c%&IA`&N{tqdWpY+f? zfI9)@56$7~rQ~%zD0c7Tt*cKDeifdhq3I*@Ka}5-a5sf3Zu?~SHezf&Iks*fMn|Fq z*53PutfMu7d+~H&FG^#u`*I|lnork#dgg5Fej~X+yHil?_O<&rN%yCZwzTqMy;t)V z&Y&VutfRqrruk9GlVPGVAM!RpJA#!Y&)i!D@ zB-rOxIq;49(+%Q}mC8uMP&cd>__4eKa2VTZEi~BYt6EDNc^1Pgtz`mt*ji6#iB@1> zxSdc4ef_P2TrI!gYJ>qEmQR$275r{6j?eP8UiGj9x+rs%{2ulkQp;k+y9CyQ-j>ef zPC=-z1IPDJrS2Mx~!u%~h?FRA(<@V~HuCs?K z6_y04{+7ptW7YA8SuX5(j=!VFr~EC1=NSVmL@@Xn489hWBKz0V!q5OqLwqBWpV6>4 zz!HN$j{+=&Exs6NAz=YcftE-#+Byj()B5?rY>x;X)didkv;_IhSW<#wCULN^bCK=e z*u~%(WC_4%iCX?t4KVFrT4lG!x$)@ zFwq`)rfk@78qI}7t;73C-wd*}aXE6=3;G@M49Kd7YaD%@87%b_@&!z(^S8q&9>&zS1R&N=jZKy_HhT6< zrP<$w$BOV^fI6I^=_#ju+%Qxbb2HBjxXlyQw0x`=b zjCrPFQp_9pXVMnXHnI>Qrd1E8D&Ysp94{pw}eL1#QyjbV!w%p0pMh!SHtLHKu?Q=&=U7qp7bWJOlPrD zceGH>^~s8{)Ov5A&9>4OJ?;qsp{dZrN=o8uvaUMneN04IcC8m_(bqASR=V$U^+e|5 zTS5G%oqS+lj3vx%tb&)L>8OH$>*^W;L9v$EIJT=|EkB|1I5W=jEK)2#;5XLuh6`~P zVn^3M-V&v7Ie6ay8BHv873VqV_pKoiKib>Gl8PV(L3+&)KX|Pv#c*g-O9Lcd!Nh15 zCA@PVskFo_3ZV#joOxJ&#w(Dru&xF=H?yqAGL5%pQtFZ0vv+V-3yapavrjsE+#inJ z)Ve|(riP8-Y@r@;i%T|*c<+QtEo|4H&F`$k`4f9Aw9c1fTeYn}tc?mOj6n(UjWrks z{Jmjy(KuesfOYJYal7jkJuK9XT72>{0ZVN;JY0t!GD#htW5Cd0n0>=5d&qPYfI4zg z02H-E4TF4e>}4`VDlh=@)xIYGAa-(GT{D4N7Fsi#Lh^xP#W>t{r$SQ0VRpTMJQo}_ zqF#X3n3!s^>jgrmm?E1@;cS7I>@YE>m$FJmo(ztX*2zs^*RDCq5G>5rU?CS^b?~3=TQ1U6B;s1HK`Rx6_7gjf`1TwnZyTF{TNjQwBuB? zX8V5BAAMvZN|}O2SgWiGs9p8Ly{x$qGtH#d@3mDO%&P8-i5Nf8(8dxFMBgRxp;Zew zBNvd;2FL0Q>u&Kh9IKlOI2nbI)3hYsSoOmd6!HlD3aY!p{)V$k`$Z2^bCV#ZEmlh3 zCGinezeQaP9j;+*u~JzTvu8RE*D?iP&z_mhYAUlceN7Ty-~Li2K6p$_fnz@RWqUra zb~s!G(54+Wf!XufgmuR_qp1h^(38pK%-{n%(TH}UZWNv77nFRIy+YQSXu8H^TadDL zl&~t$-rkGP35C%17X9#(RQ(l)On4Nc$<#4SIY!jFdGu`r{yRY58t`8c{f7qOvf75| z5H8R(AN;qN{v*mZrdT7&wsNX~Bg(d&c4Zq=#nph%HjeOyHP{kYn=(g%Hvm$1CwaTa z(Z+kC-blftLF>IS0g#xypt|Hx_O_`BBy_M4YS^!b#G=sv=k2TQID+svd9Rf+u5~;$P`YeiaNH+^VUUE!vVH>kWxUkJ` zEsC*}i$8Ml*YGqg3F4;<{$LoqMCW!AGogRVaKwEZ@b4^n220^z$?9u2rB5ES#9x6k z3@@68W_8X|tL6FS`Pq_4MF9sD&8PUYv?Snrpq?7t;daiV2BR6DEonyeo*a?a+Mf4; z($AKJBc84h?>EyYD=~|>swo@0qz;r1SnL7Y`&-&$f~oGpI57OQ(+!4QrG~y`y|b!` zVb@}S|GH3(IVDUAWOG#7hRCS#i*nlMk@yrR(i5qjwO%Y@rIyome24o z&(zJ*oI3(PcC!@W)3^l7RyTY?~ec4SFZ{Qb5K{R4{PIpVM2HO=jT{a6iYLEk? z(2)1%&yt+Iu?2eS4jA=67_GWl56ftjVO$Wu^p%ahVP6l+D#d-yIzAD%ee?w$Gi+~+ zj-rz+7VbUku$ORSp#%=EACavyZ0>1k!p(*|JuR1A`th~U4Rf==Rj;7H#Z9rc?qvy9 zki0&Sr1$WH)K@KyF>l_hmJjemz_SmE;uy~Na&|EE=wqqtVV?o9=Gi_c{`@|DgFzRf9?r?vogmJjMJ@BF=Eqw;X5$?FLwAn9nCn zZ0P&ezqrTH%u4sdA*9j6{bA4BmaxakNrW@81VDbV;>Ub%@Mii1Y8H6a% z5aMV>Ui_J*ndXv-1?(&zY$3r#t2wqfvcqvYb7Ti4WAt?90AvoqO)gDJg5>&3ykT#h zOG+pmZqd2z#f*%U?c4#}SPLO##xE?rG<64}T_kL3x#G7jC*|Uvqhr_UsEOgg70v8fqv>8vg zf7}EMQXVLFdA}>9y*Z&iq<#J0VS2(aA?jhNxCwjmxRj?_nv;b>$HPR&=l`qm__5Nm z`O&d#6rwAbhFJX7G_BgYDYCDdbx*f$*nq^t?(u>LeDI}(1lD}2C6npAWT4+ymDDBw zVe18niyOqu9}x%ijQPTLI~7x$)Ux5AY1M|~B<7SQvh7b##)^k6X##`ODL;9tvB;=0 z79WoI&mD`$v6u_n94tnblnIMbEI_x#WUa`OaupuqBrZPxpPrX(q zJCBc^J^w*+rd;&A!Y8}^#BeUux^9BSok)pl9@WF&_xFX<6D@n_GY8z)N^jUc$vUUqgn>kseTc*z^aW?K9`He1nqhl0<15JCmO{7g$D z)rL#Hp8er?CW?QjcDPXS?@^`&6}wBoQ2Qqz1qPdoGg*dWVfiKtUyBq`!10r2&?2y1 zdPsVGA>LS=VhME}Kfyq3Dr)ficR`yemKMqdHBsy>+ZYt=uj8qv)_|fXUnB(MwdLOU zu^S|1R(LZ(xp<1@BW?sVoodO)BbZZDk>?hGeww8#y`bpH?oxjE|Jb_@@F=RTotbUv zY?E|Mlh8s930*)) z5a}fW6cEt=+&i-+S&{Jl>WBZ&^YA=jX6N3ybMHClo_orBrt#7AGgiuDVDzuRf@ypU zukCk=@W|Q`-@W`!5uBceuAw)r1~XY#$K#v}cU&U2ck;jO62#`m212{(yt`%~j>Qiu zrgrgHahD`0C`*Y6aO0?Mf#W?_7|H4NFX1z&XOoXzJDm?|G#sxLTZ(I_K^w)=qlOz7 zNDqE2H#R?#t3_J{%B_4d_#kFDlzbTM5A8E}58dW%k(`_UC5X>Jm47%SXYfs;KjRb+ zqixVE4%O-~unwQ0qa1Lg5qe)`_zw~-Xu9hG$usC|FPXu=$!rCWnMgce!J9MrH2m%QO#UfciN>?|MR>J; z7XJiZxz6Ud;MJblcsR)gW)6QCt%=dFcQ#+&gBT`888rC1T=1I9f2iK>%Qc3QL5%`3 z=J7sOmycdHNGPsKEqV&MdAwm%Q!;z#qiiahFRJPBX-2g`+E)VC%+^#fwK&;Z-8k8x zV8=4laxt_O{5-Ww4P#bF7*iuWmM$d25uXhq`@4B+u7EYL#IK1M1VuOTaF)qi$oZ=| zRD7Hm0Mm{1thU3*uVa7m!+@xff$&>4@2h-s9c#TFE!qUg*TQdEyf%Ii*U~oP>iDBu zIeu&_TT|P|f|sd?`lE+r^R2b=$ibY=KdnCEi6-T$3*p(u-d{Ylo5z!y?`>_}R%b-* z>^&rK?QBi$Bgz!z5f#s~k4QhCe+zYx&*t-O@z1jPe607WiE0|1qes{6zKL*cKHr4- z0t^fIPf?_0Ea1P!2g4Uq)Bf8Fd0-0Rw}t#Vrn_a`BEBXOdq)=Yd3g8RCG>7r9_>7M zH&H+n#ru#g@KJb#-UI2(;b1Jg%DzM-aE!|io3W-qFTjs-)I zmj>qK@E+zoIrz?U_%(-r0@a57z?gV{c;3Xnk8fOQ zLNOc%XH5KQ*B=%zY|T;ZNMqtBHJKN{@NRc+OSBnXVC+RLM7`cK07_qbUJtKJ{6sWq zT##@&`a%6%Jb6rouDSf{cymE6(p5jm8;)@qmvd2dI|8?I`FHS_#5_D>_k+|tJUFqi zO}?tg;}OaPMla<%uq9u?h~<1uIJuPfWRAk6rPT1JL&=*rDaa2ZmhrujbG;yD1>aCX zLm}~%!ZPH2EN8kLyO>71s2_Gz&FST}m3{4K{GiCAGfTk;Oq;W8L_Dg~A z`3n9?vNcI7_(by8cO~D^laS+L6_>tGiyr)bEBV?@KCwzsE8wcZ9W^QXuTB(e4R6^( z{utVDT-zKqcrj}m6#2jcsaE!0R6V&sm7F@Df`Jzo#5Sm>GV zriCAaLmRP*o+rz`sEY(|k*^NlsjsY;(Dvh1Fo&ZgKr$vT~C4$VDNf6WmneIDQmrfdecU1pi7*)0gr9?#&a9^M&xh6 zMs(SAhprp>7zaL95k4Nf5%;$*AojJBewMML#%~RtQYzhT(cw?kT!5^tlA?DR^N!-xL;Y z=0oY@WCt>M8npU6D8hT_B0IksnTiLuEqqrTLBbZk4lZ&#U}gsSSte{jwF3wA^ftt& z#{tC^@}ID2+sJ_6WFhaSP1{CCbES}v^uD_lN3&`w9Zm8!sJWf5C;y%RUAOb`jmYl? zEe^mFH^DrX+or@X*o=mSH1+_091L%-Z-IXou`qdk3k(D5^Q0Pn-A<)P(;a+0ls!9L z)xnmlyU?nHUvhH~-xeR-??SAA0hVq>7&L(P<;=afP>cZk ziuuv#OzBm^&(;>R*!~!t*w05o;6A>+4lSlS?zjtNfB3u~4B5vI#wU;LG<1s`}t>aDkBb{1(t`72XHC}!+5;XVfMa``$6u>viShNkHNSG z9d`!h>!6l?U_Qh*p=5tZ#f{F2K=OVC&L85NYL5TJBH4!>=EHTD=E(NPj)(bBqJX}B znEzTwhkU^WE@zbntvtftV3;}Z(|3FeIu%!4AnINRKj4n?Z-w{Z%Bu#p7}N%~C95Vb zUV_-^RpAgC5)W67(pZ{n_Erzx?OeI*4t*rxl`Io0#nOCmOpc`)cZ}~uci?*`Eyc(9 zLl_ALi@)ca5`}<_$LF>~U-39ww~YnpCJBIuCM`Yt{6c?3W#|{>9o351a^>zgbee!y z@&K{1eM3$;ArEl&3EKeS^a=h4T;c5}(YV|XRHf)iN5(8ACOON7QWRi#dAJOH&T*EH zPw|-Uf(C>i_!3@p`yrrOCkwh}XoW!52UB^|daj zDl6*&{m=3`tCptY(xK!>K5Eny+632Oiv7*iA(W|=hCS8Z*f#7c7~8JgG`WdgG1YO? zAn6S5d2P<|UJ5Be_j4F-^c74y$In56iaoCo)Oo(Hee5$xGntS^&9r{NO#5_H=L2R{ z`hZ#X#`ph#+0Gv@8)7c-Pg%!4=&Ib@=4_H%8MAHFeV>PU&Jk^J2be27TfOd zuS33cr$S>f0|}*X_`$Jq43g*pFIDgzz2)=cIRwO{2gvLS zKB(547{=(R@DPWfa)P7};t}#_1^QS9!o3Q7F&-RCdTGMo$!mDt`XM=zYmH~SUe|E@ z9S*~lpZI66!>FJ6FyztpKl3j! zxGk(fO99#8mfR#eTO6#rMPd)Z{Wf_D>fh#@se5txn9(!xn;kid)F5RJX!<}pCX9>HD!KgS1o1fwp>F(=>njU+YiCeoK=q0^fL<00kR0|2v%e^_GJKSM}Hy)xf zM9mr>j0cA;odZ@KkM-~;2U7LBcrIm71?0vYvlOWW4}@0>5ndxTzjlWR1L4HU5w9VS zMEy1;lsys)1-hv{bOG3cJADKeYJ?3a;rsvlOaR&s=!_UVP)!=66~^OzFP#v{ycR%2%RJcptAi{#5P{OxE|A^>I-`Ltw70Kj$&>~xVQ@!faoGgp1O^1@t9S5CtW|fFO^cMJRp46q_$msW?qRdeD~` zRa@Tzxsi zv$7)*Vp=oB@>avC`#gjN3p8Go zVghn6&m?nor_B9ZN_J`jw@9;0KYYOFIf~!{X zh1q8Z9b!K0q+kv4ktKkAaw@sPsy{gtvO^DIW6HGEnI`w~m8lAhP2_3&@AD!?b5Zf7 z_^51?hV~XcJ1Im%g1jotS(SjUY6`DdKo6B(Hrvq{_-aktIQz6!EST{S1eP%?T^(}7 zNdeh%IJQeok2~P=atg7T>z9?+|$K%kyCv=r*JU6~R|yhE;>=eto1 zQPB+U3N8l50~&PtWvn%HOV74d-|m!~CXM&)~z|VZ}27 zv9-l?5{RvBU?+hK!<;!;S3-w}GBtAIoGU8-`JDv7_rLnA@C7#8_bk4@CxmqtIPdgn z?s(+pj-fY>c*5T6EY$M9T}Y={#U0v#|8d3e>N%;9-C1~!NrelYg+{uwd?8WX_;xd++ppF_JSFWt#-XHz2ROE-2AtX{;cU4)vt_2@+; z-TQPEs28zuS79mfhLm;{NWPD;WML!|p%1gW42az$3=;oc>Ic&Ef>$pZSca!J^EC^pPL=gV}8k@zp3p zq^ZSnk7S5w%~gizhxq`t<>jj8;Of}F))rLkIJhcy0C!H#LB@Q5MlaY$``!yeFXBwA zFON1NxC6=jQ${Pt5!+5z4Is89dNsN~CwPvcNr5<_N;aT1=i(1@7~DCUEohxkC1nts z+9uR#%yK}o!_kUsL?;Q>y(mOmXZ+HO!bivg{ksY2=%}gah9{BkmfSdjI%;-y7uw;e zGWQmqL?e3$u6Pn{4(Z3$K^UYeyvrO0QxD;Jox;a(w};RT&tArawsjdlWAgDPSV?YR zyg(5DzlawI-om1I4*DbrP4Lh71fc<*Gx8F!M;ystsKowly8s>o9(ot} z+P(`=l}x^_hD!EHC{}lK;co1A+6cy!z^K=RL(B~5)kh$Kd})0IVql4RL+7t^N7;|m zgz+0;(4j9X6f&toTwfs?`AIGFlhy0}hqS5VG>-hFu{Cw3P1z~0Q((f8pGx}*9J^p8 z)P7xfh5`83>p}}0=&aX;VPQQucey89rjEhQ;4o}o9p_z1`n_%RQwU}su)%)~h=>A4#ID^p9Ssk0Zf*F6p zHBh1%swE$E@-|_W4}tOr{DFMXamqe|GHn3Lv;`|&xm9!Ey#c}tXv17NKrmnl8ZBld zMWwj__KShqEbspmFzs^RMk-A@HX=kt zuRWk=ROwBpW~YC)H9L31+RT_Zyde|H;x#b>!I$p|`_Yh-@V+n&18X!0<&*H{Q9nrA z|DpzBJ{IbFZO?P#yt%cfybP|WQY1~T9|SLcAT(g7heAK5EKrZJ?pp3JdTJPSa%wm= zZ7BjmLj;cY8er@7GU@f+H7%}j_=l*2ESp99GwS{7 zq5rD9^L&kSk1_+&9DLxnJp1^d)E7i4sLNNPBddUQJs6#_6< z&PUFb8!}WN^%>Ha{u~TxLxqMuWD>)y!^4JtMxSy_)Q1y8h5GDNOuKtNH3Z9%X6)9Y zgOczL3rAS5c7o)$ez0a&wU|;v&9wg_7_6?Ha7}MBDcZSphll0 z3Ys|!(1rXQ{s&{yy5XN<7qsf4LVwqTh@rGgBn#^}L;nkyg?gv2u{b#bd0|A^;996x z%W;7Os7J{tux%pPX!~|}JN*m0|8Zb(z8zj{P{Eeh3ek7H2KR3PxI zR8b{>P6X#!$!(?9)^W16mENk1@S#5xmpAc* zcrUbZl#gqrvmBWq^kJ~VM2m^SQVhL1GZ7WZeh@lI_?pRv>`6iks+OtHcO#&0W0F9k zlM*Hip~NkYOBewIx)wR;V_5!b=4_0Tm`qhk#UAcooujXYlhd84YL~$2WD>`wHf_OKd6ePlbd)LS_E9?L#M5D(NTLv)yz?0xl&?y7YgWriLlt|1pQ46pI2sd%F)XN|LN<>f!SiOImPz8Y4Yn2U z?G;6i3mApuiq@?j(0(S$6=n7Hm5d8oG%i?|->VlzF2m!xVq&P~?EapKq0;Q$n<>w3 z;4FdD63Ljp58jw1BzqbQtW&#s8JwRbbV5T`liAc#6*;>HqCUs@OmasuR(VJ@t!W^MKjLa5X>1VdGe&#^@!lxeah5Dx}pA(;k zths_=RBLh<7gj+ms^-T!gy$x3ZK}Na_dZreIHGnKl@CLrTjXe7xHL~_ZvFT=^XbR? zEf8*~*Xg(p&@W49>Yh&{hwyk52b~t;s;`433xyYv0X8W?L<&XWlx~(EC2{9Ii-eCc z)@F;-Gh5|n5E+cy3T0~+`hjJU5Qp7a1LBZzl@(GV;z)P37AsKVNZ@wc8{5Ta<`RJ-BduB@ zbh2^|!waL3TvB-SR>wgmj~40faEM3q@gDd>5I)2$;k+QsWUj#I9BQxKlOuHXC2V&Z z8DSnZo#M(I2K`&n{?OVaMCwkbM53Bf1OrS$L~Y|?EwQ5FBi|`Q3Lr@a6gHJ+GGKUI zwnuvwx|j)RzB77n72OO)`Wfp@PKp^~^s5{x*^H*<#P3+c0E#8t}3Pfb(2rIQ*(CAGTaq$(z`7~ zTV+r9*D|H)GJDfi%dn{&34D<>C6U0y5?*7u5L)&8so~^MM6|P4z~t*413fj|H9A1N za}BaydI4*mEyqBN-7sspa0i2IwA>9BNZRm`pT)dF@Kob+u3as(MUDJdBg2H?Nm{=~ zXo`<_SR;IcWUyn6ATn7nY^`t#?JIrO3GeH6`C=zyG5en^=c#qV6nyN{_2{74W%+(R zdOA>(p1x6NjXf7{L_@3*yz_;jDEUX_3pL5cMQFpvF&2*)l2RdR;tLqVo-g&~^qE$?WV8lo;@{XQ15#Q5Ux;4lwfI4sS0P-tUiBHt|zt3jA(3w> ziC85d&q2gO;31(6<*$1uq4y!7Gcy0&Lw4r(Rl?_NR^**HZarrhwaYr{UCN8Cxf~DR z|J{{Fz1!Z{MwL#Z-Xk}07&T_}d~;ZM+B)v-hlS&~=nIdaO<*_F{|>DOXlVTo{j-R> z_?-}jjCg=DqCe~?z%A|Mcj#1(gJwr5$#gp^yoS5SVPz#Xoz%u3=;2P(%qF~sHuE~04-3$h6FYJ z?r>c2plOXKAn6N~{f_l$ElJ0b#ZW#JxGid~V)XN&{|Q`)Nzm4PQAe!U&gkc19koT# zxCte7)&@f4M_A2$Z}HRK8R_0$(Cwt)PPa58!>ueL5DKqAl-@T0^d5`cm1NIIk418_ zCrJq8JQh(mE!rJNL=eBuPA9YSs-48FJPmVf7xsJs;!h@c!Facu-YQoVq=ltud7V5D z?YR(pTN9*ZkWu!rkUjBu2z#Uqnw1I9tF~{Cg~WoCm+_mjPYEIPx~##34)t#Aj`ctz zM_AR6##Ot?3#k!o%r0BogpqecS-ixiZQ=GQ8c+4Vs99r0MvnTNA|qF{$|k7ov2Al= zy)UfQ*{aW;Sqn@=4mld6C(R@E5EDjcJK;k=AoA~9Som-%q;}20>aY;pP%yMNA#$)K_k|oirR*1T)?rl0$Zk22>?9WU zp3WIZ4_Q7C+W^Cx$H8dxL#UU=M+258@Ps>(O&d&P7`GQD4I?afPn}mSM+i-i?N7xY0DfUd@6EtoNBU@eLUZZM`z^QxVwAn*Cp8dR#e2riV&Qj|<|+^cjy7)BjD(^H5A5k@F0}`(fTW*a!wh<`7`4${bG$ zUJxgTg0D!N9Ps(Bvmx@0$}WyoN~yxXir>TP*!dmel?%%3)7Ck$Y4KVcvoBdg*pzJL z#B0yWm)5;JZG%(O-Ro@}zF=J?4lm39CKR>JKibRL8;=HuGs_^eTTTMBU6S(<4Bj0E z*D)FYs|=3ID%Siv!eWWis@@(It#vWcd4YmTp;|f+RuL*AdflQRM5!HHe{eYK4zH{r{*uU@%W59E03qt9vzDL zkI1)H9#3B3)No86|Mk;3u8|{?S3aHN zlshu{qjfs}yV&HRnf%LtJ23fe8^=^;as+dyJGhMFF7M#Qa#)fK-(HEw^Z#NVA2P~e z$hT}mmYIB=*@;zei8dxLHd&dRa;bc&aCzNTxzt=4Qq^2}L$a~@ZgVA8FY^;aF{YDp z|9wv9%+5!{4tJCJhaS#xjU0Kt^5GoU!;$A7t;6}>#5E7g^6ob&%TVpTVn$ALr}Ozk z2O<8I7CHBy?W0YvU)Tt|GO0;H=Jp%B6SwE`Hf|rk#LDd@_0Zl%Uil!(xuXteth{~tG0J@@Df0>a*@z#^RUQ; zPHcK^fsMiQ=UW+^Zs+o)mBW`Tc4~Thk&VOGEv&@hB}GR=F@yIHIeg)x!QpEuhga95 z_Fq4k)LOu7V?9KUxR#zllX2hOaA#_3gTSN2G?VUk}Rqu+{n&T*>-|<)0{{ z%jKVBM#rQBT6spU`c#S2&;51Ed&*G

    *}AJZO3{Kb_^os##e!F29v& zd{3)I#zPXnv6EJ=99fCs)BZYN8dXKE*vCp$kv%~sIoe0Hbyy@gF>M;y`2E~;h2Q1; zb&Rw^-P_9V#WS6nrp~nS`)R1e?*s!8p&tHFb(bCue&41X&hJG%OoYrM;6TUKa^&~Q zhjUyHM}B{_4(ES0qdY8oLs+cBBJWR*hIskHQu5O#dqiBavZpI$X6c@u1QnLAg0%Ej zr8Wld5;@(e<(6qS{+=_{ zk-v=v3otVsV^!@8t{HK&I~a!Pd?0yNOAUNKs6iwc>iW^jZhbH^7VB5OGxs^T{*nHRx5!}iLMDe;`sJziD z*EBTNX{djuV)Y*k^}KzkdGC}sMgcgD^v|^L{0AdFXCEoW=#sB#j734e!oOxic=%yL z(?Rwf!2K*8vn?jNX70ThlH(Cr)oD8BZj9yDAd`w^Z`_8cOQr}Yon|7L_p%X2xtF{q z-50WIOz9jrC&g(?DE%$Q()1lu16Eht1#=+s??K*p(`VK$@UmbLb~`!yWT${zW1L!V z8Etv@J<|&;Yf2$oM;LS*Y3hTG>G6=>Qrey#@6>k5ILn41rjZOgeyrnG1k{bB+`^;f zi=p|c)MXq{_3Kk7Se{8T&0*LZ<12L_f4p*!^Z@)2lb`PNB(nM4v}9t+FKe0lndt+D zAd_G+O{LT!@Y!H$0|Sok(Xhp-q+bK%o}cRuX(6I3ln0CC^XMC@{u&o>>2gffF{WLz zWPf2=tx}b{amMUpddxu>`lSgmy1{3>DF|kNi8&oTjd@+7nJS}5luW(Z;`5bO1265X zG2@!k%hr`!8jmtnFyv*xy#8b$>|Sb`342paCHTVZuS_xc!3k}1tGp^I)2kz7ep5pS z?MIthuy-$4dMRGoU%LHgr4wQ3khvQ3H0Z}h{r-1y zw<4Z}q2GpiL&r5H4ZGx8rI+KS?d5@|Z#%ub_*RT%%{QjS?EO}85CworB=~Q~)R{VTpYK zLJu6FV#u#5k!KyY)SGE~hGoYew5}dy;)C|Kf%(Us-Z|!2jAi2xQwRg8b4~qqGzSZj z_3`z#94vb5RBjPY4wzHw)XljQmOGiI84O!|yi!}4NtJuFasFwi#%VuTW@ej$)%T+x zMH1XCC7;r~693Ehh8gCpck1=@+87iy&4@tFS`FN~HJJEiOr#n*y=;KxH`XpvWvz~Z z1mp1LpwB<*4>6g;N!o2GZbk+lgp- z-%)t}M?z)HHtRcSjKMaCx90D0daG%-rN>&+oIemL%Xd~1DcLPjLNNjfrHmp{w8f^+ zk)V9$KNSog9Hx(ktfqsxSScN6apdi;OBGrBEy6Ru00RBg^3PxSz_AAuyOG6#Pz^>JU{Z=x_kUoiaU0AJR3VZ%rq1rH--qc0)$dJc*SD?+uPTGSlg`cY$m? zM_g5U%x5p_^l5m8S3P%#Pw%9+3_NSv!l+7pImmVWAP_p9H=V^2m<=wNMpy@>&qz?i zh6|?pICmuXys}!H_)f!)@Zv?&lMpZ_!r$1jmw|bPT_?cF3R5jy!;-r?0>+9peEeX5 zm!_jU{B_eS51&SW(0hXe#%DSW-!#W!ykz=?VUMUF(~=o%S#||CcAUGU#v+-!q;k_B z9GtTXTlUoGt}voTa}S8CK*~Hfv(jr7>o>hQIAB4x(|gmhEQ7C`o>7qx|Go1-M|MUg z>CvV|(&%-1i;8@b$xRi=zv`^}p9$r*cO8WCQ00Q0&n=hlnwm1W{9(VEhN+IIJRtm6 z6N(Wm4|%s)Rqf7nrbZ$(raq+27_5iA z--@1=2JYgESpUg53hQ_g%VE?c&vuZkdpQJh*OhtuRw>3b{4~oUhribt$~A%H4d$|!`$yl{+HocU9slF ziT@2M?%M1>7XO#NuD6hRDWQIp+`#ksW@H_OmSaTh}-mx^M`%TeMfqC(@&fThoBi?#1Be~;7_TeAx; zR~`yYZl(7I2bBNhG?ZyKEYCL(>#La`9mHrYSk+j3=Kiwu?IvObf!wY1&GLzg-W(i| zdfVwuw{BXDO~spkpgAYw$-Aj&6QiqE@Ta!AbLcCj_#N@AAPqI8obn1Q6ku_DU4aFDpy=#o$uWjPu(%J>f$8gE}v6%Mp zGcll_CK5jnv+H6k(k<@>U$zrTovMUcq7!UO`ZSTiwv!0eB1A$h~E z9=X+6ZTAxnB#nMn<(gWp|6suZ7d(l;GW&SkhKkoCNSUUWJ)wO_{U*@SEy5Kpz9`ni zvL?){by1USu2+NM*<3aBxYkxrpuZAFiFFj*)9I6E*Mh89L|3dE!OB=&SmWTqKyGTK zB$9%Cs%Rvl4t(oU0?p(O^-+WHB0yJ?Dpn%7Hb`RSeP2k^aS)I$CS+T}|xu5F~WI5F9E8 z-*Im80q$YMxh3-F7LO65*wlnR*>UpGfb<}y}zXWJNL0B8D80%VQFowPg37<1!MWAKG7*~SKz zn?e8A0ROjYCAn7z|F?kt&w&3sK!3#w>RdkkUoigfF8!ZB{_ps5(gFeDxO4QLC;rbw z|L2PTOQXGDv2?DSKIekP>k)*q0op8J&Ku@Xx(PE_u+!(AyMZb$btTsEi2(gmHtNaf zXO32D?*{nP!;wIH~kNI@VRL23i18rZLlOLBijAAeH-+- zJ*pPu;*aup;EEuA{UGd3u{HkI8~?DA7)T6i=AU`00pkX_Z{jQZ!Rj}~C*8M?(dZ{J zQEC*_+(0oL0tSk;G!w?+O=vq%oQgGPK8rb0{xHRlD{ z#kVlxUD1Gl=8`|hVZ*y<*(!x=?~3!)z;J<(`1X4N5XlC6!kYKQx_C?~eNP;KdGOr( zq8U?T%HJ2$uvy9n;z2DUVyY43DrwbBf6LGzVgr_WANs#s9HG|t;=&=xFES8HhKk*o z?GTYf$7N0uUq^^E1Nkio>U<Wx3HmGXxV6 ze{6sNi#k8(_lX$5-ufCo{X}f+@txXAqgZI8hz$tP$s~&P30cG#R_S|V!)Qp%+)W`s zFMlGwiWAo5Q_-L;C7;|F(ua$FmQkPLl9EYl0#UcS1whtkVywq(hHEM_hZl61b2Su> zs&YMm878hEPd1aMckeK<89SRXro@C}g^Vv3Ua4WJ{keFYVIbq*Vplcx(HxTdz84Gw z|1ARj#uoII(7NwPJ=7X5hI-wzXgD8ke>w^Rw9`L79M5C}j8REVnP8$PyBKPqy>a4j zF(lZj#!f4WPu>eQ3`hMj4qQiwPavB-jmF5De$aCSu6Z1MK0<7Xf20v&G<|(rNRM@| zQo#a`(p@cGz7*RM<@oUi`*?$Wyutq8+Fbc@@xOT1)cu$oMmsDGb*CK?=L&NcQgSCYuo;Vc;dG!KMSJNh$$6=nM>K`XQ&MN8)R% zXYO$SuJU0Kx=ok$zJJ=cKAfTBi2bX}nyq&Xc6{J>_njk>%0}FwLj*H;NX4RHNSG^r ztYuwLF;_vs>@J93J6H5Y*kBdH2B(j19*E!zBG$JrSzAowU# zY>OAh?0-e0O@1>zhj9lNGev?=yT>RNppH5@3-#tWD9RGUh_S*85(?@CfGS&z!Mjgn zi=FUK_VDX|Fd8b-nLR({g)UxMSC;f(O^L#m4o=+*0cYSdXtt zRcS5fN4>B_Oib9TLM^Gcv7cK5Yc0sU`dx_ww#2tt80j}WFn~VIaHRje_WpOw6B}zz z@AJp-hhOH2HFY!R`jW0tfo&$^X}@{MpVjw*iZ5Tn>Ie&GbcfveXt-SPG}=t9-la!I zU?2-UoaN=PovdhH&xo9AGSgg>_&Kh4NlgRJ(h*=9dJ~LbCd{x{&H3uDLi*k&{;E}* znn6LsfVa@GP_nh@yKuy8l{RQ&KA#bYg&DI~i}h4!8HR%A(Q6yI!rcuzu0RtlT55Gm zYD4l5+1}nex3bheOiJx-+X_B;Xj6{E^HOmvWF6e-A(zObb<@-GoQ=aiONq!2koP!ixX*)7w2ynYmezOi0S!3BRpUqA(L_GLGuYXpPy@wwpaU%(m-B=4*oEp zO@Jrd^GU_Ce*Kr-A#lC81|?O=dOZI1gS+d+VR-e)2C)lXt=)ifV=Bf=ichj-D#&jz zA_(F(;@PA-e7jLRf(O@u`6zad!@PX)ef(3SKpgJ*!#ymCHG{$0=?5*4Q6O>#EH;L= zA`Xj<`N&2itz5W}6dS{XpC@D&iVYxglh_?=CJfmml2T&ACNZ5J#cKe!a)uwgv{~fw z_Px#Gm)_g&6rnk$6#awT@;gN^ev4Qy>P^na@f8>;qT-HACD!M*OR#r~7{v^PiY;g? zxg%m2g%z+S6xx259f)$PTq!Z9u7N?|kW0{mg|4=wk5h0U<3-II~GSEQbdoqN%fk@>AFsqW-nEHk8(`Tl4qDA}!&R0DA%vfL~vNmS|!o+Ux>R z#v(r`U74mK9Y)pMVy!E+^ty&KaPt?3Dn_F%E_gHu^@HpZk!!S*<+dtSrsR4j$W_~v zB2&14XMZHEh{b3dw)*w9e>g@&mbh@N-o-^Od#2^&vS(O24NGaX-zRphV!fHNPi(Fp zKq{ZwaIShoZ%yWfdVVM&+oU1%YOjH6-%&Pe1@)bt3QoCKd& z(*u1Si?v|rqDt=qiN`bi=p&_&*j3{X$?4u281-3$0N8L;45+fGrAJXu832CA(6&pc z;|Fv-WdxFlJ&cy^Zpk`^PGt-@;-09__!Au|@tY2faTvDnG;jzsxXa%!hz*|l{?AmJ zZe+wl=50LoUpPtK>3_V#(-S4tJx-L~U-zKIi=V^CxBf|UBcDt?P#Yrq4OOhGJ3;OxbWW&|h|ZCG{l{};!8sbmpsH7KMQp7( zxQMt((CJbSwZ5dnPC+o_Dn`^4qtpw;>M48cX(6m%tr{v)J(6r?o-`O&k!_GzE=J=H zrjdn_rh1Z0OTSa`#Va*?v8hdtLHfCbAUB)T0z*J*5SV*U@diVM=7g$38e zZZP*J(NkR%%GEGtFRF(Qx4q9!aECoViEiwQvvA}mRDHgK5>In|zO&mM+*VdgMAn5NV=*RzLduu&MMfg%0O zn0IV}K^3(zYGyJNci(Lb3{v(xd#nov1|_AY*0II}RVr=1@T!=XqUlU)??4)7&+#B~KbTgP;agXtalwYQ_ zg!~?El>;0j$ zzS#rmF>Tcc=qwsLW)R$q`hPIZ;Td7yYoPR<`JPZpmg%7;-F>%RWYc+wZt1T|-B8&UZ;YlaA;)`H z+qCV(?@izRHU`qJW{_i22XeS9_rOTm%fIaQgi9x@W#!&UKi-Cn;x1oP!uvf#w|v-q z9Q8>Db#68?G;Ir`_vxi$Vo8{rbfuB-qS(MVClpS_adf%WF3kH5t zzux1Rw#PATk7L^Y*)eSn;)8~>jqhTvUO3x!yTVH)hkQ--j>nP%lLs))|8cqr$#;l{ z$LS`hWc;5?H*t_0$rsGN(Cj5MiD7!6!r@+6MRLg3k0rYX2`1)f^-T>Kyf| zB{a5G78COmPrQdedB6agU}47l%Q4;x1Q}8gtV03$;OT z<4yA<3=t_l^P9g9ru%6WyFbrhe60pb7Vq5FOR-tUsLm%v=l4j2;jhIMY8PKH~}ema_5YSnp{Wc3X5> z1~3shu~0minxfO|3NbKXd8RwO9wd;I?Y^qZ@tRLkoNy{Prr17UgUFyg7^>QmRFSn{7mh8JY-j zAYaSc#{Xk7EFW3zDTEE9WC~0Vt}Yj6ga}FCmttOqvN!6b5)zK=vwl)AxPN7i*WMr^ z6%#5l4*9vMsF-E+JWO7w4Tfo7nG1=}w>Z$tACg9!1GS3$WmE_yku@6SFXklpg#>xK zaE|e3Kml-za*hYUq%n3W{C`n?po75ML&H(OG>t8K5EtmbHQVFRCVs1IoA)Pux_0IX z)V+~-G4mLFIS)OZ3Y^WY9W>*;cphfF(|s%+2%3#Cc}_FNhwN~P-(0lqa0L_1hRT~; z!hG}77->s()V%LzyikKi4jEiIE4EGkfL~}@J;jS~r|I(X__PiZj?OSZjDLof8D}h; z+l;ZfVH4(3H!K1~5Twl&Q1BW5q;AY~>UcFKWj144;$G)T_d3vLnn@RaS zq@4Hk`JYI$0CXW?;naySz8_e`Sgm_rL5cy8k)N{5gl2 zcfb*nXCBk)3Z|KDX?1ksEA5B>l!;$xj)nLnUJu8Cx?rm@>y)@j+yE5KaL@@KPkA+I zolN=FOu8FXW451%^+tJ?X{g2qO7Qlx`{P-!_N+S}v{vhOw=I2nTW(TJFL73Sr zr!0CIeQL9a?QnJGoIn^d_M#iSZ#KJoU0$r^g1PlS$r%iz&F039QukwWq1BeEBrm#g zdinyAytrA;IK*v24=H{j6p^CBY!1KxcOOW4vmqX`B(oMzYKgfQ0w8zW#|SIq{;>yi zct6)2uCKUd0N?E2-|YThh}`t$=4w-7+6o6sT=&1DM9YsW%>hVVER=1zf#4*o%r#jS z6Am`10z7matLTOOAg1S%U>LLt5odB?%qsIaq`ePTQ`&2`1_?3_hO9BuJXu!)>J4k?`4X1{l58oQZg(1v~38B=IW2t7R$_ ztuwo|Sg@{HOV-7pGiX|}ByMH=bop4^0ROLP?a~bYAlP0*{DW!+i2-Hn7`s1JpQ#0n z*PCnOP8`49%;5+U?j0S2FV7Ayh*Z?{azW4Vj_!|>4F8?xWglT2D;;@NtbC-&|}hq#l!31=|2s+yE=WQi@w zp61M=QmTOto6Q7j=m7|W?rSOC*aB9d?G~A+9+-%I?kTY^GZqrUH385psEmZD5yVK0 z->x`$=yNFb!Hif6v~rxqh(C&Bra*yF9J9$#Fd@|z@uxt>Rf_ndsAjU#Nm0!(;;*E| z++ZvGmlD}-Z-QwW6xYmJfQ;apB>}@u4+@nFkU8U;VVO0GYi6xSh`46(H9Osgo#rWr zx7y#ae5HbFra*oXR5NxW3+W&7K~~H!CqI)F^NYfoDVSe2STklRRFoq)nF90W1ZuX< z5!8(0vnilvhh$JQdMm*h)C|GUD5#l&gGNBjFx zk|w_ex_0Cg9I$o=sg|F%%iOr9i~~lHzGQqag7hULcoC#884-*ieaVPm1nEo8ej!L- zGO8Cr`m#oA5=1ZQ?DcD3L! zZByg_W0Czxh-{+eR)?J3S5=nQu(3=g@5ki)n4BLS4I~yOU7$vrYS1(_krC+(sTZqB z%c++hs~t)L>m#O3%Rs{kP!v8pSY<%W*rBDf!eHY!2er`Wn%VuiKT|7?f<4#Ft{%iZ zkE$`6SVDpO_FxByyiT)@YQmNCn3v?NB|ime@)Kb)6fF%c+<6^sKg9SS4nBv?5x=K3 zdr$;od{-P7L1Ag#S5_9r%C${(_Ml+IB%g_kgrqOWG>~-{yn!f0)AwVwAvG5zn~L;t zmiV9Kz~%o!W^FhacBj>Y$qf$?_qb1quRoMeIP6`+K6ebBFmw>rdsho64J^X^VPn#M zf)SQ{+uV{ItD_G&`X4BQZ|t75C*kVyiKI(r;^F7v{a*#O@6%r6EU zUqNjojKQTLt8T@rNoiBPG5by(THz=**A&XGXa=$6r9DHZt#f)o^4j~q;5~NQY8bj@ z%{%zXq_%`=+G^TS4`vHgq4rutzWTU~g@O?3a3n`Fe06^f+;AD^VZtW6)bTHxy031AHW{_i4P# zotsh@O>W$|t-$zn3-|WmLhUUQ!001|vZuGgS|2HzT~$bX#b;{LXI2$brNqZqitt{5 z|L2y>pnWYVgv45r;q^SYF#B@}Rv;z>ufjP%tGAoR5W+1egk)d*LKeLJ=n_5cC$07D zjzf)LLx8@ z3a(OgbzmGkWW*&I2qJ-tkzbBYm0fVlGWhj{G73cWMx@kQO9%!C?;u_qtMN_L?sw)RiP=88G#v9A>*ktS7lK z%vOt~zO>5?$!m11)P<7QOci%$vNtOhx1S~sZ^8dVA*D^Bus$atxX11b(-q>^}vKph=&f&TooKnPEe>LWOl zD?yy(fA}eaYW8y`}j`#V319 zpLh|P|53p!st-(v6zzRR{$LfNz`1f~NEd+?B<-3ElJ(Blq%}y^WBW*14AMxw*CjoP z@M`sjlt+m8!W&XUD-qZ5;4aagtav0H`$>&o8pK^z-qxUclzhdZj|A?Dy|JB^H};c) zS)}Rj`bllAv|O{l^aYaX^!^e;%v%}`kcJUj&Q6pxgq9b-DV5`}XAG3K;Y0lgNnHso zFBv4|AuacLOA?WmUH^puyhw-sZ%gY5E$?CuZwU3zMX} z=(b9M6Hi|Yg40RTVC<{=M^YPq{QK?KQUamm;}a;g8d9aUc=bjqCE;O1l_4@BBjVw`PX)nDD_U1uaK7Oc}}uD%T1DRBT*9)pDbV1 zm`sVd!(`lz;$ZA#O3T|OSE6MXq~(w_N|fEw=mQheBu88?@<5sVfPcEw1IctyIwjNe zbcx4#ZZn0FY2g&bw+1U8M`|}`UHRFKK$&?o3<{D;{zQx&GY?OY&vCqvSLJ^5B zTOuWDCeNb+wC8-8=w{ESL>IS!5FOlEAYDWHxUx`6az(-#V7Aj-=3P%pb1Tf0=1y3D zLIG<1sf8rfRlm<|#3<5#4GMyfCFu?9tVEL9`{7^xW~rA7hxPV0N?$qKDAAqUMv1OT zA-$PYC_RnDQ3we;tkkyMMnO#>7U+w>h$3_^^#qVP>mlUfHB%dJ_?j`vR}D|9C%y||qy4|~GUoldm5S$^Q>osxl_ zlLEoJq*#RZd103nhQM*I+#v>%C!WH(r$QG5W!Qyq(>>tSE{XW{>g=Xp{f_*{v|DO| zZ#cSJne@eWov7I!scDl<7d+8>{k=j%UX+Fm9{(Jq0!Q-rTRf-}~P0FPL*y-)on(_daVGPg|A7Q^YIVLs@=2H{)qYjr}Ab^r`H4 z9>y~aSU(OkuNAet8Q|q%tYA-gzP!^1vtJFNvvHkZyfm*NZEsYd(#p{TB1^J^+nu$U z>BNBul;^DNtxcZa9rCPL%F_hSIg}j|_KYm&>TxbSWK}u|KX2ij!M`NCjcfJ-nh&^7 zNp?ezWQk}0b2DB9X_?lqk<-)J|2&MB95hk#O9Du)@A|^>((EQsQIhS>ru=0N7I!EM z(YDvw?s@CpHBOiWe2m#xJH0@%^+WxR%RuV=4xF0AcS=_r7XLnV?Xm2ne+mw9m713z@u%ZH87Hz+aExQsS7`w%-86gVJC-s&9@;ur*$PnAzL7|; zx7VgF307e)yIN&-yUcArH50V<%kq^cvRXk&uSATXp>3d-FDyHD(G#}(ilyrCQ2zFb zsHRWF+|f=>QK~MOjFKlybYt;?9yeBczL{w7e!N%J+{vkvlPi7{aDQ*6bftyxJPazo zK*`5#ogI}~5#LJFKS4VwuxPOlv_r#+;0NYy}M zdA6g}p4onEk|~5Y6F!Hwr?Ty-oRylEi1v|_tM?k7p1!|1!8M_B>@GQmm%~VcN zg0UDep3bEI!wozP{fC+K8$r#xo4g_B2F{)TcIte*6;{cWNjF@nf7Ab;9P0m=bvB!> z16lI?|9K7By#>6CuLsY)2WYmJe|2xc#9GLHZ$Zm{vz@5Fs^wm5JMML~qiUT8NbZS& zYWB?9j)nGiEcj2hBh&KGoWHK6h(C$-sApRorfotW5qoGTMJq|*$q*- z4zOy`uiC#_3NYKzeC%rn{`+4!DJ$p*8}DZq(%Qb`9%MJASFvhqM+C!`2ic=kw;O=& zVRk58B_~b(%~re-4i-)ggz*ovY0hKoeHzcdvPiZTfVXWmxbXEgqB_E}(udh>tD!DX zYy}0FDpH+w)s-eb?iM6Ah5>bKUyNQ1FMIr`(FaqsQ5MY2_(BW{&d?SX3d#U`a0@ zLF|V2iUtYdOkU>!b2vW!&=;x%u`lMJ?x+&GxNLOBVqiVP#Q>PA62D^AAA%tMJ)|7s zEcOyk!w6?A6?_yDoy9QW8mw>@L)70={$U)d)L9&cBW(*8k=E0G*+neH%3qP-v%PH~ zM7xUaxXN|LttF{5PGPaGViWJ0MQY5azip@xZSESkXKj+!y20 zN$eq1L#?YA=COA_UoSWtn}G1bHFh&HS}pPmm`$N*)^OZ}Q;W}eQ`??(GX8LhN2m+b zVk_5_a=MPF9s9mNoK%Y*Oqv!D`E@5hs6(8m_8+1(Xt&WYS|b{8{~<{uvf>Y8Uh?V( z4IBAj=`Wu-KH%jhX4?jQUKjU&wkxshN`GaX*ybrZX67w_X`J9)$k$t>lQv%7FISaY zcoN@o{t-M&;)@G-dIya?inH|@$7L^E{jik2iCB;jzZ#?|eeptBWI>YsLfJES(C|W8 z?W5WDEWkdmj|qUp)ziH*(*j!wYKVRLO0X>lKw*g_==E29J|Uuhk-75Pcj$UW-V_GQyYkG_HPllEJzN7(rYUNA)@aoHP!~iQ;`F61E4TAs|9SI zyg`d0WdnYC6nk{FxBfx-PA7YzpS$HdVNCK?yk)g8nXU77rA5N%E5&}W%~$lpeJp31 zbu~IQtllA$8(oS?NgHT2iynTW3k`0x0A(>vV3ZIVs_r^;X zW4#=`amGIxFQ3X3?!rG`HR8qt4xlgA8#`lhA220I{18XW+d(27Et>?3Y_xnWSlo=m z;oV@7j+XHuqJ6Y9u3ha58$-lTorf89aOM$48f`;GOjAY&&De_0tQw*Qi{OC`mXM-x9{-vJ4wSI&+4C^fz_>^Kz zrfxq2q)w(ch^2UzRcR2T*qHX5eS{4NSFsSl#n^;~09X^E-iS+!2o8!ATM3I{N+cU% z3nIlZ4IN_XCEYWTVsOM$0iLa{C%ycO>bI~DxS>HV#+FtV)}eRfDL(X$jIs~C;y}H> zr;D*Q3rE-mVlhhW=HuAspn<+K=6)J=ZgDt-H4?pX0B+exG+_AVj8#2_U=17baS-ka z;%AQxnN@R}2wLdz;BEsb@R{QecN?+Mik*i3A3R#M`UeA5W_)@Rp}Av_s>n@sgTiT| z8q%6#?`21#q3koSe=vBA{&X%KJYqFiKxMSM;s>8M6KM*IX>G6q@T!{`?oW>%?0c`0 zqH1>DT3Ou^V)|!>L$~I9{9qr%Y;w#N?7ongTTSzGVudC=oQ6^a#bITY@UdTprP`ik zbM*1#_c9OpHO0yzV$Ccnf{%X5DPbS@bV_hck*=w4 z2EhXc`xoXs!z<53e(Nqi!g{roR}kFjDYmc2@ST6gtB-1@Xl0XLurfp?V&YNFfIJLT`~qW-8vB-Tqo+#y-fl zMP}BZ4pAMESz5+47MVThjSGu!ALCB*8R+sdE*i?g{4(~wVQ}MRu^HBr3VlVKkH5CO zf<3DoF1~`3<}hgbs<>6XmZs+Sgrpu}e(>m3@jEYG1u7O3`_m#&>3zh;hIfr#Ty9=c zrd|;!3WimTj`qQsjutS&)W;CQ3K;qH6<=)rXoZilnf`TrVf`$^gQg1SGrOzxvoRHZ zm-Y=z>MKTQ(y!@_&tY|;Wqn0jU1)1x(V!_jA8Zux*}1-A>t>s&uzogK>XG6F@l?j; z7xfJKh1bM3ExxoBn6itldZsW@EDm;9A1eJdvBT&A#z0Qm8vWuXV-Q;z2>P#(ul0)w zrUK7M?#gdd7&Q7x_&&IvT(nbF4`%!WtSU_ixd07cLT&E^#W=W10?Ok zFZv7v#Vi9Fy`yRqt>T6D?5J8#|3fQwRQ*8zTYeD_zr`_OYu#+6;jL>pS7Q`g-Jq~A za*!C0hb*OoM0yCXjTKM3oK<0Us>j=shk){ z|8;W^Y7%ktJOwj6MZ7M!{WbcwXk0#ci;G0-z@EnT=4Ev;$`Jx7c5tGmh$ zm&3r&agNK=Yu31lY)K@fuk8Y&r|7L+&$MRy*y%mjw}kFvM7G0QTT|5ni5lZskYo~T%*N(kx@DShTz8|crUHKlo`PKi33F1a$5p0@9<3D7F zruJk5Km32!1eISN>4r6l{$qYHFtMH=tog4u0?AFn!2<`8is@_+@tA>8#aQ@ahByn? z$PZ_TV^w&YUr0_3B-3V!cw255q<$;DEu4U>-{P`BA)eof9R%EtbBDMzu@B6fg(33^ zSTqYa?J!|d8}vz^@5H7sdz=(N?#>cb6xNf$x^uVes6PP%XCtj7GGR6@ypTiX9C5Jv zgbK0sAS@Jpq5oW@x|_T)S4^h(cyE*PYMsn@bxcNHInD@;W&W07h*Oa!>L|l-$VwLP zBfLN77r?p!<##;=`4td-s@R?K8@`rzgXS}{9egAL))3o72aTk3b$=*Zj4AG4%9K{tL zNFUsx_QT4_%fzOn??Ta2fK(8Z5eqK?qyFyC+4Y&Y7^$X^^u^*N6~1rE-#4?rAHEFV zpCjKa!}q9f?Fw-)Hd61E__PAvUn!0fvS8Oru`l%MSlIv!nPNFoiH5{TsgHY%ol5K~ zgij;!tHkF5@qIfGlcWI1CgO`o>-+7N$SKEg$BKMNY8&Av$Bv-clG`dnDdN_#F_d zm-=ddw!<&#CPfKJxud1tl-w@%8fpZ|9eLds@ZE0GP$jLVepBcy4Z)}WE>e_+IpF@M z7<>YUR+?Ue(Sp?;;$%-d$PVyBzURn9KdC?U?+Ol3=>TXDhyWGPAy9e` zU3qDs)K3@!7Xqd0$nRJX7MCXJvmYa8Pq5Z6=k)86DdbkeUQ)4EHOsa0=LialAk(cZSHxB&Y1 zM1l&L&{KMoLfx$gb>q0R9_qLw;VX*HH0-0?Q0x%Rz29w{cNz`TM3uq6ST;${W$QPdcac$ z*nsC+fmh)ZG|a{U(qk$`vIAIay=2@`k44D`p^D6ZQwgd#PJrz?=`~1vOX}p4#;?D< zYUpEVt{-Mhb5MZsgKg~6t?bh933|!W!P3jl=xr5mptmurEVKd)94fi1&(WT^2zvC9 zf+59E@`3JuNYTVHRPt7#j2ZPf=!YS_1rRa}o3{eG4U;}lJ#>S$!=%^H(QAe==c*Wv zj=lgoyp1qvg_rib=Ux7rb&Kq>U~sd9qrQ_ zVazxQPZ>Uw{9%yF)PxNBKx#mJ>nDyGlPa}?%^ync41E(vFTvkxg}UYDdgyhRax@U@ zX3~+iA4$%X#+G_C633!pCc~VuQlzkfY#J+drXz$@4i-)c6x=l`irQSrzQX~+&5TE*5VlOgFd6oZZM1q_{_MHLFawI2L72Ylrh2+s!i z?HoR4lJpCOFLc1eps%bl7BLxhJ8Tw7qD{AhA_haumpNfD(Z|#n>b@{*NX1uD8g+~K zucaZZ&G6WpHu>qVQ9ssWcKsP1Af7jQ`x|K!ZI;~*A+&oOLXVh+jh8|arb(^o_>UK~ zsdG^m@!oHTLdo!c7P8b?uW5JEv+je}(#A>8fq2dA3WaqhfAZ0E$(b_4OWQUw+Jkm7 zP&8AD^v2saZH$L(SC64K(Hw*6aHZy|dv4J0TWK$%mpag4)OXA$#(sx#rjfbdNptDY z|BD@>3wq$VRD79AQc|Uzbo#(++b4shKCp5L+J|7QD;*PD+bBER*00Xmar%>JkuNKL&yaBe#BWpM43`btC1k-COy}+3 z=nocLrX7?echcJ=y+iqA<=FUKQZQYR^@Q0wa4bUugp$v; zOFgNF-DS!=DzYhaj|rl?Z&QYKi~9}|1W9b9hz}TI!Y&))LvDpS8)6FCvolxjrKw zReBHSkLktI5bulk^{nutif&ckhjYc!BJZr}KK5ss(_z*@se@+rR<)spz6^doC=JAE zrokbpjZgx{L(+@vRSdqGen{$ouksE_VK^-vJtXbJhRQ6#i6k3tmY~toNMNbdl#U}k z4zs5V598BRLJp(&*c;L?AK*1}08D6OYNt(iDADaGf~AnrN2N##wm=1fYYvM&nnO?5 z94#C=F1aC-Qqr^jbrwCG$@c>X*Zq#*Y}vM!g7+rx{?3J1 z$A$RO&I5Gk(S_NxgHyGQG9YCym~&owjB;(@I2#=}XD%QPn`>~Ara0L;lN*V&S`)7lihYo^WO`&et{9rFFEE zRZ(L4smZU;c`%K_fnZA(S|7HdLMGOftE2)-C-LjTbvzcjp2w=2}Y?4Df%xQJwk0m zKf*a3wV`hy{n1aTZ>MTZL%1}@d0W?M5Q%k#6O?>2=%JND!0-_+ibuJbs*w6gMqT@> z&3v~Y%iTo7@ty9b)s%fX2RP*bDDXgl9CF43nIga$F5h@Bn|u|VcN%@b9KX`ed+8#B z`8A+k=6#kEv@ZOi#@iQ69YenEhkI8&1Mr6<|9^|i6T%n4-rA_3M*t~^O#57qf9*ZI0X0&nBE2&IH31%*z^Vs-R42Ig^HACU*^Ea>LqR zdg2r8FRz7}-V>HUc9^N3^AHShGjB^3aH=7*&231%gEQ70J6F8PjIEYN{uXXJqCuCx z_e>AE?|@Big0QJXY+_nVVIMkrP#57A{L}{DrjSEzOdfQt_4w(|qfO*l-#hAWL3Afm zlqQ)5WJ%7Te~jCepLQ};YH$G-+rxAom7D=ZaVFN8g4B;_d(8yl6_X!q?ulBn71_7W z&~}FuL~0hAe6jK92o=$bDfu16?W>z*W5@7kar|Yy5TA9d?>RoiXr<%k~3>r1N~@T?zYas8$avFW#( zW30jld>dBh=H}3FgUOrd-!L7eE4d%IsB51PbuA;JU1t;Z92q&xL}+LH zk(*(?102S^gDq46Desux^UQKHZnWNs(L?qysgw364%u8k1bU1x(T%U@k)|Q4N0_@~ zB;uu!A4i%xcwsNdc7AF`(u)ozXg<*yil$k7q2D;{yEr+GGY#`XYT17`4biZc&2h%F zUz`jZevJSrr0LhDWKWbh7lcbD>rNQ1$=ow$ncOLRk6Fk*nY5l|YVV1?Y0Ls9T--v_ z2w?+cFT`HQI*;NE@#k_HlZOjU{is6~P;z~>TWzv!fE5|on-x-+Vd_aeR9K9Sw}Coj zAr!4aSDUaHn}Toja#}n#!uSKf4OwX#13jg0^j(9gGclEyZ?a#D3<)V(@{6 z%||<}#2#mwqG7>OQ#JBVT4ox8(jQxf6744UmhlN_FBf^AL*&{Os2=My`~OU&>!{}e zhNLUDBT@Y_$#w5kRejb2wT@SMmf_3B%Hs@`re0K~l0zCnz}1AbOq2x)pW|Dz4x*!05rIrNsY7QzuFgXKl*=gdLtr zeS%A^thaTElg?14HxDM*5!TRcu%b=2Ci{(pMsG$?Hm#I11slPvVWw^*bF(Rq9aLm9 zGruCD6pFFKn9bNUiZjfowmJmOCF*seEZ)uNNJ{*eep<8nTQfmcm` zKteSxy$m1bbb_D$U~@telwHfgsFrcw9~!*f2S#3vs?<`ii1rW@SqIdpjzW-bJCdM(I!7$vv=`b@;dR%XC^hRTi@-1|ryJzC=0v#QWRU@hvvPWP z0SCoN!U!(VP{PQlqN&9P8h)RX;Gb#wZA+~c4^@g>b@o5U#+c~Fq0Cue`mwEyIY6tSW zgHUj``dR~72Xg{p!0a3iSwAS}P=G7O@jtjgnqm$D!|yrx-O2|!J5hqQRD0f)^y_St z_EYPvvs$nGL$n_2OE{ZiLlW#uyQ!yEjLjLMVW1nVpaVZfP}Yw&@-}~>A9Wz5ALp>+ z#h;kTA$44iJ14M-6VPtv63}H>!MGgOk)%&;T(YfPA|@ag)|14ixDf2EW-3}_JeqAk zd>M~s+fA0l=PaO3YUWOo`-GagR;tTBN2;t7SqQ2*MyS_;=1t0>0SMuql4r+<>yyyn z)_rN_-oo{hL^r0wjSQvulIx>c;n z-&=)GQ^~AVIg@BlIpXrvGEIBbL18eV3R0sVgM*!O-hz7vb6$Z>L8J|AyOb9J^A6=a z2P+QeZG#CVIW58PWnOc#xlA0TCJ(mfG^4A)H_85c)C+uFx*L?VbLjWK)MVjOV8ybQ@fw$O?1Yl!DX0w z33(}G)uo(lI@8Bq#lFIbp0&2fwyW48Y&G}0onRQryp^L9AhwGooJ3dWWYQi}a?OT% z-iq4oI-;^}cA*|>#JwCJfy}STVKLH0F3}~2L@_terflB2?7#wK*ocTXa=KC%xWbV1 zSM5mD3RkUM-@b)hSvRb5;8TGQQq*dWdhH3+YgW|X?jkDdjMwX-qQKu!)EX{otsNC= z9-ycu+Wa@{@GRztfbD9W`lkuz^VCSLAZpAFVAXi@6mWAkSCK=Haw^bfi?YpDYu~g= z&`>a2_b_h#8AXB=Kc%zPZLY>0yDZcKcWf3w-n^UMtw#iXpd~@E`cwRST$lTHd>G?l zwyrZDJcUGcse)2>ODH+-X&z7g=pjRgm3p%~_m(=&TK9+(w4Mn)a!?`|iA|%NA9K!$ zyqso7{be}hZ>C+i*5AC7p8Jph^ImkP#6a^9;W8WzM6uW^@>?iLGY5lb0r7xC)6E{F zRggJZhh6A9SGo(`M?1?wQr8SgrjmBe%!Bm^F`Gj`X=k%L()_hEzD*%@oy`X*{yg^9 zv5W1lO?FTU?~Aa>#Msw-QAc;OQz2DBDQpv<2aFhI&PO6?j7TrKq6||1PF*4$+Dablg-uYS z%tJUM;EYm7AtTmNF?6@%to+dYE@?d4e2?OUziY!;%5mo50+shrjNmB_o;E&5PQGhC zK;>F)HCxSl2*q?-!O*lTxuo>yw&DBcGZZ$H!|GPqm7q3Q#o2uFArfF+62o_!Xaq%j zhn^y==BU~=c2tP{81-iz5yN#G0-XkY$mWmDzf)b($JumQ$C*4HhfG*!#8t*b^Ec3X zk~xrIpIbwjtheftI?<-f2CmCSn=T3|m}vgg8DW323be@~P~sOT5S#fnQ{vI&_!nk9 zh23I>&33?cn~W}Vhm4+V{*ppSRtS>=qSX}UfPA<$NvsLrs3OEvOmq- z*Bjq%bA4(~gHf5-lUWmQcV*iS+Com7ZcNV0G^bFaMXvQ0jXNB?CvG-dx9on#y11da z0VI2~x!en*t$B+1A|mc$h`k`8Dp#l5Z9|+xXQ|zgREE9eY5_J2>m_@j@}N0Zx0ge; z(C29*`x^H`*)DS+Ox$Xgk=#B;u8(%Vof0H&vvrsQP`20H4Myz2ZE)8_sg_w-gubk9q`hfLCTt`q#p=J?6 z9u)5~A49xTR=jJwZFr{{p6(21)=AI0Z#Fg(+nScn&hlC?E)j&G!-Ro)zxC11|0t zbUrrcJ%BOC%zbnZ`8$=KHS|N?&|Av!is6-CaAZd+bykt0k1>&6I7a(BymQPvl>1jA zWSumJ!;2?yTm0HF^J%(X$202lW{l=}$xXB*M4iNr%$Bn=)KJ&V5&~0>nOkdTatLHk zmY*~?r)!~aA*o4jU+s4e+|Y7lnGD^_Z7jd1EJKL7+`NF^Sn6}yT!V;nDASkNNC3%a zur;dbJTVutZlL>%^Z^?M=7G=k+$cC(l^bEHFn>tJP3GdJ*jQF$hACvJkcvw4HoB{o zc^-QWBbN@f4Rig#>jIKvop?S>tTL~G?H9}skkSH9X`zFX{t_MD=^APgg?x^TxMcpE z&N5|}Z8U+?>~RHYvYxn@LN*~^Trp3h;w@oBp?j50r=<)*yNq+8S1LZKGP47+5wA;7ik=650CrWwndyIYZ^+$EI{}_wQ-FL2KvJVzYdk2!$A;XaKTd0$OT(&!CN_Nvn0Qd#1m$J>EL)*8 z6b%{JH1|~%c9T)fb1xz3?Ub~&n=EgEuvOHch1?k1@c~}7-q#|x7Zqa%7vpD}7*#N) zHHyKOk2{$Y0XorPvcFC4WD1X2xKV6KX=@{k<*EsF%$?N0}e%j@j(P z7MaJGFWdXnR5eO?oMGxt*d?TmcEZ{VUPE%MH=cYF^A;AjcDI-;15in%@hjKzH#-f8 zjYBQj+OwQt(oT3yAZf4XzD2vt?PEX5q*D!Cps%A%9+A14L8u3WT z9oraTt2u1p8XN32E9`X}YznDfle;qtVev*9&Qegf8~aNYX!f94l1Ym_xxtNTDE9~S zJ8ga*zPXya4PkFmx~#_qsn61O!+Q-ldg*T4$g+9qHf@0@g7cC@N1r=fm^0T$yI(UGFnc-2?unqn?33;Jz{M2I8}c>LI0%+nhIYqp@#f+{UiK03Y$L z@#$>@WZmyE9|l+7&YeyLNrW-?QPYWcQPZ>V^H~=ck3SJZl=V)W5ji{G}eztm_)NUsZEcN6zhWD zJ4n3@Q(Y{+q}$`%d33;;&G5Bz?D!C&vRFTun9Hy};s_QuO9zG>EyN6waQ z)PVE26v=ifw2_jz6fNB>cy>=8q&!70!WB_dxd3T)RA}jKp~r3m@eiGE;sY&KLoeV2 z&jcbtHfJrgs)e1dJ(qH1kmV2R=ZhFsSP^NVHvcgaRbqV#G!S29ZcJ`QT8>ilE#};p zIJieNwpjbmQb>=+eU*0`TVx8ljDs$BfPU5l$+DA#6`0y?3eHXg!gJl=w!nL}9T{cCfgsuhJIV3^l#cCk-9(0h_b7K>T1!3qGlg>}WYf zv9cMKR`0Uy-f5eJ?B?MWFm!;7ZkA3I zG?#-~o&dFQ(5^-V-A!IGS_VFEZ3-C@8R%!9q}B@C&4MjzmndL}<_gJ*L~80IXXkEn2Ji{E1h_fCFr&R?~Y$38P7cM z!h^Uspv8GhYuBWe!I+ETo%5E4nt4C)WYCG{Ev&Y}^7EEpM75l^qLw>Q-7Z)<3m3q6 z!4lql(`KH78E>9xc)|xQ{mhYNp}?djj%?UaGwq;1thivgfkLNUw2Z*d`>tJNTKinG z?4_rF829!jFG0mil3II}Yua9aVo@}S(xg&nuhPJ^ki6#bH#u)8EGrS)k!5+JN<}=J z@gpw8udauG&5jRcfk=SGf!8%qRGuFO>&xdIiJo|WLMrL> zS~HH&?|oh#k3h`o-!ULEe>}ND2lZK$D4uLP=pCMbpv=CrIVjRo(P0kL>}|B#6vlr> z+|}$`rMVEZmiR#$K0wPZ{fulBsO-s1_J;7m7i2$*(RLD=crv6;BJ`G#G>LSj)=THi z=i8W1hL;jZB$smmW$v31nimMMZxL6rB!L(y&O(l}$bl0x8*!Mx84!Pi1e1xg$!2PH za0u+Z*ba}Lx0uU3cRnh??7sxltCD79$9&R;eoaxkjL^%Z%P9U!a9xmf+T}LcN1D|X0APG zGtpC0qqEV!ZbEK0lkG${nML?NvE~gNZf)oCY#3+TO+IK(MbTgZzA8& zmdoR8^Bp(`6lzm)O(B=*vR~l<1rC7LJDFUuJ4tg&VH*Xo4glL7P$k7o&Kt$#XL@VX za)ew(;2m5}+Rz?9+ko*_ns5v~i|uvoq)jx3n2wPb=u!DD#=hNd2P}HkZZ|$+s_BT? z*7{-i9uCq$&#b%0rf)B@?HuVqN$q8%pvMht0d{k4A9D}wej8#68Fz!MrB{g#ICO#$ zk8SY9ya^NW0eZ)r$E39*x136LlqsP*_5|T$ko9>U<|A#EhnF8I zr{ivro}V8CJ>DWdq<6Et#uW90Ln-Y^J3efCK94$k<@0$X>CLE~J@cqTmDkhalnt0& zRl-1%GFxs$W~{|dGiC$GJ!4+uAVfXGMXY!NtAgu3Z#e4C8mN+wAm-tD^C{9`mmRujuh>xc zL)2qaW)bq21hv4hj? z#2T*slrq$wHBc?r{)e)>P5#*EaToK3sM!seKe&%=zle}bt($bf3??{VZT6$ycFQ{4 zdwIxyu>WD61<{l0@X>+-89)XA=}{25TTAb&8d>WLz-6Q`Mwn3nIS{gxA=gXqDY`Q_dS`W*$e zE^lVp`23Dv2O}RQ{r8N|P%gfH=LT9AIMKz(jhV$+sS(x@@K9#A7WH;DAdfzZ>?Rx=?S=@K4DtE7oEZu za#anpiN@QeDLdL�gzZw6$1j=nU<7)k_Vm+^DVIx zh0QZ)V?ybS{GoVW(R5~h6Dq)RhXwR2?7;L0YX!Fg6nuwvVXnE-9aeot*y(^b-25)T z4bo{eD}M={m$rVNe+9{9QF4Rf;p}{OOg^rjgDg`?^EvqzI-^z0!)B_cGe3OQBlF7=n`~fQ32pfSm!lD}46+#x|n~`+M zg8UJ<*VB3-0;ZAJh50+^rqLE|UAj(&k@+Z66?~LWtw84H=aVRekR0kmN;%q^?L(Qk zYvyo!bil}0DbM#{yGLdl>wLt{<=Q?HWa~bVg|(WN*bvi5OO?EhDwO9CMVoK4^I7QO zDqDS8wpw7GtGs|3%itzk_a+LsE2Ov~7uF72xhs6SmgwMMTE3Q)xyd2SFx#kf;ecbs zUgWu*@?_rWtt+(gWMO9^Cpo}VwvOpV)}Cu04grV5=47L%97fHwqn`9X+bKaiRiQ86j@?Z?GUXR0vDdfvI`4kPXhQ!NV@K0L2+#Rzmm&D7Bnhr(}IN;8wbm7S$ zsD92(68xDwl_tje?@km|TYT(4lp+YkFJ(uLq}BiR>4Bi*WSM4`vsJ`N8k=gbh?6w{ zbMMAOEtwvuW@+N%ApOfUntQiiNt~|sVmMjm)Q56aVXC_FlOFCmx~)i)_(JUz`I*dI(#0~Gz&Gn;@r&9l zW?7b~E^DgH68Ogby7Y7CGfi%wKP*H#z2xMS*uzusz-qsT;p1uYbI&{_nbYK6&X{N^ z{zNj(*5)-`eja~SCayEU#01ddqw)OF$X8YwV8n^uZq6?Hk#G4(G1Gvy3nCX~;V+oDlN zk0}X+=f0KS3marB%4)BEVQ?}Cv=}PZ+Gr~c4Tn)@RT@{GM84!(xkbWzMm_IBf2q`l z#^}TB&C<}v8GY=i_JpoarH zvavzr*0aHh%&6Wcolgz6zYxh};8{)($yQve8vH}6u=E)tqn>S!t<+m^gtka851M$z%3=J)Lpz4GF zpUlwkLRCV4tLDww27Nc<+)aXUrCM)+ca!Bo5sb!qffLE%Nntg{7OYWeQLEBq`Mq!k zRBC(4Q=PtOoWIW1m`Mo@PLZR$7p`+Ft6$nXqkpic@T!BVS65g$@~xSKNkFxa8PY*ZzEx~ z`}551o`y(6q#j>C|J3Ua*4GAufxhnW)N7uT%hS*TKkLWW9iMvL$%-9eh@h|G^>jH5 zC7YPe1WZkrLxf`3h=0P0)y6JQA$MiS5&B}N;D8UTfZd-0?7;vd5wPuiITR@ln2&6V z;bZ*M1qtu4mQ2<0`hXgvHB*;Xk1v0I`sGfZtw@FBiss89+@<44<$PQixYr!vm7ctz zbeGBxVi(GN+^YC91GJ58+z_@dl)+{A%TX?nbYZwZj9(-#5Qc-0A$M@S9Aez<1fyT8 z@q}He|??UGVWfIK3QuR~L}qa&dOTP3ojwYXjlTg;QRjfczoOA&nNxJvGuf zwNZoP@5hVf=Wx3$ZL$0U{@K4+9_ET&w8Tog>k@gCaGWe(B3G%L2jI~&5(|K=>;{Ua(|U8 z%7qEJ#@zD?08!Q53udgA_IHc2~Jh7qB2uW<^db0dLD~!gbOnfUdS%OgMdWJWFKP7&qy;RB3!tl(;%VjOF3+~x4JP_2(7w?aF0 zm*kKqv$9`{PoR76(tobGQIA*s zo7pQUIcmKtT4aO@ntD97rd9r>HK(=br70P?)lFG&Cl>H1}5&5X#s#r zb5V$DO*FKvsTk~^x8@nlAF?>+bt~rjl{U=y-=+jRuV2Yf2f;ggnAfm^QHgjgc|Fa( z(q{#u;-M(|immo#*0L79f`yleTE(kM(GpRRIe3k|$dfcZg)ZC6`ee59kYz%94urV7OIZlOYBt4euh(cku9S_g=| zzm%8dh;Nwr0_YFQ0roVs%N-$BZ3R{zPmO3)hF z_muyvQbI(j%qk^xF2!}`y{qoVZD}yMR4$|Ql^Vu)d1H~8{N-Bsv`mh`evncoAN3rF zqFHynHIVhjp++$Ouv~}grTrosUH%Bc+{5v2#ABJOA4`C}aDH~uEKaxL7a!n4@lev?DhhgFeSLlC6q%l%a+D#5p0?u9r*%Q3hb z3E!8?{qfh)a$MPs1m{yoXfm|ne}xYf(ADU}-xPc^kiS`Jf8)#FbWN{tb1~3(@{#?OKYz6; z`VvPPS;^wb1(kAply*<0tf+2=z|6BOPPCkrzrhgE8rAsN+5kgDl{G{(7O2DZJfh)2 z6zUR|(PRzgn?Ai(`p;y_j`B&xXxCs>v4X?`mA#_B77v6%BB`oh{EuCPM$e^~?PH@3B zL$_*qG6Fmn8!|Tfu&M9|64|S zp}vt`u%kNq$;t(3fnJV4+ST}CW?4F2a`im3Rs-UcFt-L>C=DE->FmbM2s5tBu`U@Z zW7kX}p%vDnh<-Q06-xo4H)lXZjeHURXlmsSE=!$_J?euDuayVjyY;p5AtB?(uWrcn zw0iO%Xv)EG{SUdfHywgd2mY|;Cbm*0 z?7S)e;gac$w?iu4PY8x1x3Ev;LF8?D1-{&VTmHx;PlbzaDQKG?>2XK?z*%+M9e%to z|4jdmdmw+Is%rpeAINXgzg-^6p)Psecx1+ix!#upVa`K2jlzc2$zMd&H87T0muN3FiD=vF0d;2a*QW{~ykLfot zV3DE>z<)7YDXs9-L{M4?(;-e!qOh398Au-x>z9#mzy(qSg)W?3jTN}kZl3&9J?w3Q z5{#uhu=XgF9l(W3&FB5_X!WKX9&nb+C)BGvPtDp~rL@CBZ11R)D6E8;pii9_I zV__DYh*SzyvoL+lilP1_J4*RFLbX8)6F%(}1TXbc;t*m{uX+&UUQ#xC`|n-;%yMq; zGH5wi$%-sp9!alfpp00N-Oo^jp6#` zm`ABA=0Z;l(YUE`S4KbI1+vCy{b7H2Q>}Uqhe+z@Lq3kB@xqol0Rm%XSYd>ZhAavd0lC(I;)1-adQJS1_Ar<0k@2nGlEr{Hj}>%QE~+5 zb4#LOOvlq>(e9Ct=ZC29XZ)tbIH(z_{Gu{%AeA2}{RCk;@foJf6P|i7Q-BF06t`!d zYU^A(syuPHdJ=!8pndocUO?UZe@5s2KLFR>d*%h8fccRa1)SUXOtTbkjK(P7fuM4k z3h^1Y!=P@wQi)Pq%V%Y^PYO|Oh-T%pbb4$z+#hCp#`EUhR zLUP+YK~tKEgN@4^Esd$JM+m`|@04gS|HSKEo{pEwt4Z$#%F8a!N3M2(%H=CQN4H>+ z2>l)Z`KFQnGjBeF^!*Kzx>!jUoY!A}5{dqfU$NqC@Lu-6aP+EeeZt_q{)XcyW8DpU zl<_=_ezcgD-T9BkG&O&udBdqy*dMR}5i1s%{O=8JKC6{rO#1~b*C;Jig~#E|H8`wZ zhr~4sejEd}#$~?n{tp<~;j3vsD9!QJ`X7{ERn9mwHfiDuuolNve3!jeX|B31;FiX5 zU#MQIOvY(Z8m|w4(s9?{B1hIKhXlHRjS1Q%tcfYFSNgdWyI{b?em2~oj6i1JY*5bP zpOG7tIXDwv-l+Hp>ReT%o6!y0`VI31-%W}?CM}c3e}SmJQ{c!X*iQ$P~$4)iVKqP0ONljMx`-$ zT7=*8rrR6( zNN2Xy>}f4T>#WZXMLRTsqo0_lWb}o5-mp+s%v8PRnUO1^a66Di zmg5zrHAZ906y-NG+E)d1`7r=8w<_DwAfvXSqE|rL#$G0GS6HZ)U8tPGP^~>A4e$?i zXItI+amMGdG-885ceb@{biw(jq)2(HQsSVH4S&m=_(71+2FeTT#3(Ozm(q@h zWcbZ;vC*K%6E zSoh8x;~R}D?8GGrZg60?;>n44F!Gs?ziKRS`p$b4b{a^-M8&iKei?hQl?KATy$TKFd^um-Rp&v1!I=hfjWG)0XMNN5DQc}fj>8?YvzY;^^yW9h`6OM(8#R`q@!VaQ4uZ3<0amK)#83%C@k_0mjDKx%Q zmnby8n_5DDSxOa8>W5xs3XRd4l_{e!rfbT@)7v+Ko3YSHg)!X^Wl9G;KEj%PtaLf^xRC)%{dQ);12UFzF3^>BTgwybZ{?f439+R9Ghuh_J8{iv_C9rYjEv<*W* zo3{C-o=xYWnAE1Y54fhMKP>tMS0j@l{}-hTjs4m}+%Y8>e2yrc>CblTC;8xrA_*Ac z1s%gh$x;}2O!)+V$;Xr%7$$dwvV%$x>^ZIs#V!_pLh0pA+wTOXak|63U60OgXuG(XFNB;`M$k#F!cyT+QqC$7 z0`5W{$V~sD35MD`e^(k|bXe>J#_c!$u%8HeLk zh`=9y45Qa?dQXKQMUz_y?f=QqfDPt`YJn$=+4p8ctQ3CdbqG=yU`SsD&#Mc1sAl1v z=1p#R_dGzOhE#RIbM{)ccsPxU(dw3e;41}|3BW^Mz=nc;qIETa2cdjKW#J+%kgI|8AxnHSr?wIVH_gQZ!A2EgMYvWtCA6YK?V9a=h3 zh05Z!2AKO>l81+y?=j;nKLFlwF9;F7g0I{QB7{lcv-p4?M4#|b!~NjXS}$j#%d2?& z_OOc1RFE`A69A{(3wo=W96oq!!^Ic6XbW1Z)_)HlX$xB8$dREfXiDYZt}W=p;ryX2 z^R}P*WiJ5+nRgI1dQ)!kU52vKfuY_8sxdtAn)n7FS1DQ>8FUp z!@Xy5TB!>D5e_W(EMO7#pOE9>@w4QZfKb)oSwz5BgUR#$1!e9mYL6^n!F^@30u0W1 z*oq&#W7Pk|i$^T>{F4`4pQm3~_X+BgfF7;6Fjm5V9P=}GENg{BuimY=In3=^&{_Bi z4=p*{ad!^u zOwwC!wVkqF!#{1i{?t}CFQ;BL*6(v@HP#pD@E^arH?H#HW@Obr+j27=#ypg7XVD97 zl@0fHac9(hByQ4SDQ@^wSr&+C|3uc}!&M{XBN-FBQ_a&9@)U)xY(J_w)YS zB(MEA>qYIEr$pz!spur>)dH3Ewr05scQF4Gmlgjj4bH?q{gl}JH=kq%9s0t#k+Tlc zhK#}CyDZoPMlT!M6E?&Z%=Z6DWwfq4>_=v+%<$^qg3kK#ty<#}m2v(rYW)~oGYL?e z@V>8$#&{(I)(tL*$2!s~Sn>a`_vHammEHf|8P)+|5LpD#0dfUF(#%~(voaT;GBZt~ z-mpjKuszwo5%0fT-Hr=NR{l}QjSO2>v9(IVlJxIIk!{j3kX zJ60z4(0|iW8j85#j0U;%2cfSg%FhxZM$W^8;$+xAR_4b%lc#(xoC$FkNH^Y$+twGt`PG)oN=-w z-r6tdHfGKs7`8Gdg}6y+giSnI+8)$@?ZR%`sn?v{rMgyP5*P@9gzqK3urf*3-HV)# zO#xj}>+;F4sKUEY*-G(k5(e~Ft^LUEXU@3t@68^2jXV-JGc`=IAbGC$!PIHXc7 zZWjQO*RQ#_QJF~G2R<3!{0riXT>aquOR}DU=oQV?Mb%V<4rtiCr%{x!E5^u@7&Hb7 ze*CD0v7VA3j}@L%MgcRZa0>n+#6!#|A$zav8NcFUyE|UujCU;fSG{-KsWab^I2Q#w zb>x=u?BFRf%;*+?I9WlWx}~4Udcui+%lvV!vTOjFhY1Jp@Aaz2$w*vuJ<$qcg`(pcGG?6fHNhE1umFvyBiiSSkC zFWF7}Z}Pi}EG8SL`YQV3jeFjZOJMR>YIH>8OqX55r%szJ*Q5QKcUaaNyk-^?-(JEW z@?Ma*UK;`{XUK=ciWHeA(w8Pf`U+EI(O5JXb3pD75gW83j507YWDhgzSap&-mO%s6 zNg4p@nTmNZVvgcxynpmu#X`Iy@m=KAU6B5+Y%$ttc*If_ogw-?SwAKpR09Lc0KeBIoWmSIZPp8ug;axZ7+OGVcGUbr{#>a z2Y9_D3x}(zvM+Gwc>OOuJ5C*elLK=vg0dFYuUccUAJ z7H(e!=5n-_@5Nu_UW%L~j}$GC6(GeG_)Fk6UUfsl_b)^(c^8P?aSJOJ;*YZqDo@Df zK)kQP1>RaDQ=*?MYO(B9f=JaKieM;QBAbdA2ft5$gMshM7ULbos}wKe=BKq*bcgs1 z+0*z^^(w_ww)Ik32HE`i{_@9h^J5bffpErO9z!<&Ygq{N2#`z7zre%fc$;=V3^#uA z(~99RG7~kg(NOiYA{zDv%1LI* z-%@Z=-WMbbC=uB|$R2`t{%`dUvLGnyAa{rP3*;iWy&AW5G$bz<;bA%>YX|c>(o3Qj z(r4}24xe@ZLi$q2v-ntX68bl@h(0MZ0pBj+U#eb9pLBi@K55}5`lLw}vY~`X7sv~h zA3{n~a%6<)?=X@)85W#o;NPVy+`O~~&g z55a&@=xKQ{CY`Y9OXW|S^`2(eFpK1x5x5ccXqW|=#RK5p7MUxFE>QjQhZ_3j{yd9H z+*0~w!*o+c?Q{)AjbBs!QoTmr^7>`NWLLU>Swn7+zv*o4zalwE0v3qQ>Bwb>$p`QqgkzGJgh(6&$~_bqRvo0kfN&fL@m2Cr zM2Am5mCZN8@oXM{eIf0d{4r>MR2BvE56RxfS0@$9M?>sqr~*<P_8;bx;HWp!*Y%C%!QE`+*sfvSO8wh7d6?=eKDaU+chDF$=JBx@ro5$It zLU}mE4_6SJl{hO<2tTeMTZ&+dz6OG`-C=)BZx4V;r~$;jrFVh(k0=V@wgk677y5Y8LC)i8&8)28|JBYYL$@Zoj z!}!sw?y0xfT*MLQ9Stm8(%`)4Fs=a z@+VU)f_!2^{KX{K-c=EX0 z9ljr{@C_(4x}c>-6#l&sqjsq6BMOsdG6=wCfIjv)eTzldbs?LCkQ)t`PRYB%-S3en zDEM}Td*c-GxE1lwQ(Qv?9){nI;7fD^#N8bH&jhp&;opd{{o(i-N+<#?p&c=n{D<%w z0a<71JBYF5C4|@h(7uAcgcyrYwFBXm(1M^!Y1zmlYgZ`zRz3#FKzI!V*^jajcr{`y zp#|ZU(1OSs!-Hy1Bc4|NB(ulU&~p?v?eR2`e*^I}95$UplHP=S9q>?^K@|{GpMd-w ztzGlP?ZdHxY*j}^dz=?_%nwc^D!xRbX-Q;@fmf`m0nnx3^_>O07@sd9csCDqGL$bk zIR^NJ{YBP+iL^!pCKBGXp}aC$ZYi|44oJw16w9nA{+g$lzGO@B zp5~;u>lZcm8t(R%^I3JIKY%saO=p<@;~geC0?7OE1g7+~Q4s77Mw6>H_eXZ&V4iI1 zPx#7wpqn}9b6+%zPFksBIhU-}F}mBcHVY@M+a4`%g~n+ubq$ zBXY+&bYQAZ?=atrs?$4o4fy|J6TDZX;n)OVY+?YMd$k^2xMqAJ_XD$*_Ft|Uw?upb zFg`JgJwK~K_1HQ{aT@0%8AC)5Mp6D?g`+`=)!9uMqwNBFCF9u`$dn_E;D({HipkKGjgI!^>tHd3{Gf9vCf)TPg ze>(@;h2y>Wlv<3x!;lZ;QW|z&=`3BjfWMn`L`hpujI)broZVggChYqFZ+t-?L~mU7 zfxKOa-97oXM|`9mk_s)KWHf}vSE6u zUQ=e#53==Jtu!*Wd4oH3=#dUmU2374YGeCy`Q7%JdunF8Eq40HwoOr(eyRmYC&gpX zaY2$RNPbtkK-@l=oPBNshBfL|a!#%{YbG>p;^ca&NAgw)&e-tf_9@|$&plxTP(4MQ>*O`0OWpTFq?NhE)x zKRZQ$K>^%F`)E=Oq&g`I@GT4}8B;eLj3$vt9VTqp#gK5iiW`mDSprE%YY!x`7)Y9G zj3F(?U2bIfh{f>H4|NBPCPCI+`9tvcak-ZucMI9t|E%!QUahw&eAE$A%T10%a||h+ zqwn8e45jjK+^z%|xz_s2+6hjs3Gqx2twM(IBU4HiM8TU|K_wt$h9_1_8@rH%kb zX=4F{s-xW5cofQRCwACP9sd0~K@s4>c%iw3ySiLDZl|)p1+% zM8vPnu;G`s+)k2jT1xWIuGW(#P_o1TcXvszQmh@p@Q9}iO8sKZ96EA6agNizul|DCim7Sql))C~h`1zF4g^Mrrt z{yH@;QfX&(`KKHMfD&5(fEBMOXbhZ$-27$fb`ty4y&kOM zqHHC@7EQrK!@9Ngj5|F{bwTBww*(2u(gU9MyR_Kuo>_~GnQXsLtM`^A>1HgTxRTCe z!T)8S)n5|CVoA`yj5a_m)j%M~xC7M*%Fd8A8;iC7TT6eMIq8hW6y$401gNX(XO5sG zoxlLCw0baMw9KQ9=9}F--bDFkzVPG*#s7AhPYWcS-5&}ZtAPUZKIBn==DJ9Vu-e4v z^vX0A!DsS~qiM?7`+NcyeaSX~>voLvzqBY^P5+=Dvz<-h4k%|JuvevgtrLd-Gid_Xp)RAKo6TI$q0MzTn6-uZRv z%U0*!mgp8f^N!IDr;qU4U2x8NyLpZs%pNr#mix;nZuFUVjCzsQyz_ivC%>i~Yja>) zSj3mF&WnL85f@nhc`yG`K~om8120EF>`4VFP_;cXEq2fyBbWe_NL^#k`L+F?xAb{; z>=BqV{GNxN(MCY>8M@~W{qWppF z>Y*IVu<_>=%6igU)GAI> zJ_|kf>9LJ3Wbf0H^3CdpR8N8Te!U25IAgmMW5a};*VR2Bzf>b~auZ|yW>J^oc_iW< z8mAhPvr^R`|E##GAl)glla)Q8;-cBln}dL>;j(@eK7oXLlMg0G|`UA zWf1S8aDvnzO(B-XMh9yql0azL!}^7IUABvg6n4ghXcpql#P8}KhUs7kf)0Nv{FwZl z7}X#ceO-sO!66zqQ1#Z6ZWz)yJyegGS`?_ydDDU#^(=K5s5Tlz z#u~$vJBnaS&3>gC=XUJ_##0pl`a85rv-}ZN6vW=tkpfmGTtf;LlTwxapz2SKyp*un zKwe5{t?G^cRYq#bO4^kp|E0%qc)wR$C3xSRYxw)ewr$mgJ0ksrskRhsxw0zH#yiTd51 zhKHf&6m<}!m8zxqn;>VBnri85Y9mu(O?6JWnrFvHo!kj0rj)BqoJf+2^4DpMTnJb^ zjr@mQGrm%jP9?~Mg!3zdm4yGw+A9hFg^o}f`7a9M&wStvtG-c_(-8WOk~Akl{*z#) zBxSunJ1Dzhl{B&*#uvx1i4vuW<7PwQ_t<|1d;5hc>BqNFwo5#%PQr?4@pauGxOZCJ zo1D8iWjnYRru2rg3WGPq&MR)s-VIkyGIASn235YNCM=e6R=q~B=Ng30#iK~MYX;9) z{h{J%rO3oxhJAc)Epk_+sd#s#&YrPubWxI_3CL5V02C?-gNYYK4ZhS)Qd3FTgb$*<|j4^kULfq0mb=P1$;h)o}+5?6#VBab1By$F-%aGv13RnuLt=`sN{Bezj33xn8M>ZscI zu0qW_;~L_-v$OR9Fz*>9;ku?}J~OhFWsY!$thwqvxXG2TYAC$z)C?86ix2Yv*D;lf zG!y#`262qGM-%X1I25MoyRu(QQP!}{AB6JU2(E-tlX)&=5>C|wKgoehc1(HlBC4Ps zr&|j>QU&uMd*U}8A%08SP&P49*{5zq6lPv9b1H3AE5J47RN+*6PW?}VzFAP6tnY}u zy(#ql`n|ym3g1x%)Qf+3&1Ma~rV;oT!XB8de5zLbv*yjr3k@ORxg};jvtA@D{6OOe zyXQ3nM>+_Uc@d%D` zS~drPgsRp55an&#k5(3IW4u=V>V#8=`?qpKANTve0`sG)AIj&3+r82ZozE?V7c9z) zfV`DT>ia0aUSM(Z-Jc22gd~TqQBpTerREs+kXcg;srM(Xn~+qpyD%!3KL%7?O5+!7 z`R^Lb*52R2ZbEv~MY;hnXfxeX>cNBL&6IdHyHsVNx4Dn4gLN;TT8=H*TM@seo-Z46 zTj=CENcBNms$t@eT6VaFPOxJnLx(+<6D&GF>8HCay`Z%miWWM=4w8JSh$lH)a?wg5 zYT;w-SbEIIwg*DQugL}jjg3w|rhJ#U`Ii1Z0wnSGBA_g@^W&t|JghE3L-&11`I@}5 z*ChbLM--SX$d)?wjy+_Nam>O?fud{;CMC<*aLTt5yT3`mvA&$#+VkeiS`#XrS9X1;~9ztu}g} zWut9KZpyQ9|0E}uTamoiLb5dHTgxstr9`}Ml0|!L&jzggnm&T9CelI&Lw%^BCb3j6 z-Ccv^)bIISr(#ju?k^{2Nvp_KVyN_0tuY<#7CI*mKEX$pC#ZJY83EHPc(JFx)lBMN zJ?F$hl6P51rW)&uKR>v0;uzSAc3Mczj>TObbJ1uNSS#5rbTAwwd548$y32#E^1J*X z4u*pye^`U$$QwL2k~H4HZNJz#nM!^}ClgzKL%E}#;AX~8CYKV>6kc2sj}kbCs$xZp zg~2!yNFtC3*?l*a{jGwX@$RO$O5!c_Z#Ee5toYmL5T+4NPvR9$xNYpQ6 zOD8+S%L0|rLp%Vg#$Z?eT4JGlN{Zb<(o^q?Ua1rz#!=BvT#tX7FWixEFyg;k3hgXLgvIs3W02TNR2BfMJ^f zFwa|+jlV!z0w2418FwQ49ENRnLBe@;AiVT6Hwmf|IJcZZ#Ux6MUgROr_8G1Rl=-MK zkiy2rN~JeDU|3)`*BvT`sH5SJquORs!Rrz14R`&cXu92&e?|P7+8Km}{kHvR&%zb# z+IJ;9rdGq(JTOX?903d4{Zv08jNb1?M(%h=7Mj4?OiKEpPI8HclMjOtMbV>cOR z9FN_kX&sK;7+J6hW2O#;Z7AnK*iK)#SFq3-R`#a?3R!O$L=I5xLaw`y&?z6bY3*eU z)_Y>uUJ5af6=b)tQs^KfZmYqF{MyWjLEC>8ya2?{@qQjwq)jhRHocxx0KiBlcr zLG>k=GZLrPh*Okppy!twXA*RcOi=aZN7}ZAkY`jOaP^q0vlBL(z?K*Z6k6v$tDvS{2Jg*}2S|||bJ#Pl$d(T^d7+>~==`X8{K)hzW z>M#)naT8QlNfI>zxEbGC2?3HWF=Aq|ZMwvg3?70vPAm?C=t{LI8L84bXX47lVw#L} z{zas$sl&EI;k85+$(bmcfE$*WM8Wr3lFAsieGEfxvX@lLc%%)7sV}RJJHYN6&pyi3 z$V$S2rW0ZIE2@#u`)`dIWLwJ0cFY6wfrYmdQoprwJp#d4$xefjwcV!TC@-9#jYIZ0 z!rGy@lH!;ipEp(S;8xP^O1La|Q#IM|&{4aK_8eh;E=&|Nz%%+AjUwi2q`{p zcZIBke2v0gh%@BgO>GN3r9RPY;#;aegqWO?eNqqrZ_U8`7|e9rAgHnLK8ig9Tze1# zi;qHOoH`8&tURC&!Uj0yUh3Dvaky7SnVrZgDAL`zNr%<3 zez(80yXevv?D2P0nYGvasgrcEf~qppy^`Gi4r0pqTWvdKcdL@G+4pCv9(Sr+PG+7o z$;muEoQ><4eEm_6Q^zs$D^TJj#V@OFhv^c)N`lm<7{MtV?Kwl&k@*k`X6SP9c@ol8 z0|mG%)$P@hnA4Qvs#$>BSrEeK`lPFB>||1=HW4Z&sjredl}}caJ5^6sPsckYC8{66 zUo%Id?t(W`C92=Y8&#g~6abTx)E@W{DT`G7Ti;<(0!qKkZZC1hW^@HJbBl+Q$x z#zFN=9cA*6m(&6H`GiZ)1$f~&)APr0d}}Lg({k!O;P=19+{+l&)vC_8UF?r?7BupS&_)HZ&V$n$veqwm2i-#bVj)oP) zN?cl#`+jsyOx_9OSJ&@Yua0eUvU+c42Cg9SbCn-H@DG}*09f(4YM|@EZ(PZT@(Q|! zGrpkA337HK-wqW^+qBI&tO^nw{07<|R(0^)&3`bom4~Diq$G=c>F4sq?>&T6zI#~Z zFWCJJtT?QCNK}5uU%Z=$d?$z*9oQC153AmUo?+^BWaG1s(T&HSusujxYaWNP*}5)B zQA)Tvij2xC2zThmO!0_*i`|xC)^n|saQ&cXjG;Z036yR*KXd(1_Eor}Wm1-{Z3p5# z^1z(s6lJr5v;<{CPa68bC(BhG5NcS*jx3jfiX&NhiFTP1AV`J~c#vWaklQ zlGED@?tP_khs~=I=f^|YYSnPEt&_sEAxsZI z(eyqI+8SBC<6xSEF6Ed~{4aYzv8l^gWT{>_PfSY(l9Rqz}fCBq^hG zK{)3NR*cf2ccXwNIYtfElRU)a!FrPJn|}x8#B)$~M@Lc+uMF1L5KEYXIG<)d!QEZj z+4$R+2TSk?PXW`-t1T{>_L7~99GHhCL4uQ7sCJXQinlA*M@@yR|Ng>^#A}V6*VkHg zUN7Ve_vlNug?o!?6zRl?*E1tEK|eCgMEy5ltT*u1$e z_j4}b#iRTtlS3iOwUBHRmTnJ}0f4pN6mH!Sk9$AVVy_ zu-)b677~sTDq2-zd-=8f_O_6qaFFViwp2sp?OMce3yBHGNM3hEP3w#38D2rjrkNVj5Q;(kise^XclpMf0)Z=u?5b37Q z#ipV9r!zBGeQ8^6l<=DUU+O0;n3HUM{$~*#rfl)r*4Afl8xJ z8QbhGySA=b$W(R+(bNlRWmARK){;YanJxEaUkp&5`>#zWq6bW*- z8Ib_Liz2}mBNCMINRVz5FTy=(Gzyeb6u?lbb-3u}=9U0~QXT~8Gt?3=!9&*=B-rvw z%OXJ!uZ7OiMb6U2&eA2$;-*1`Qi=+Kbd2HMP|!$6!?1uS!2}EBLZ4o05+BDtCg#F! z3JHLa;K9y&SKYxeTqya-aa_3j#eXm^VCxIqmV^jyCd^O8?iQBj3QZ0SE#w(%3@|LP z00Z?;hb*R6Ps>`qjUX7#F10et(k*7$gK&~Hf^Jco?M55d_GWtv*}x8xp1np*{bkH+ zUq$4sRny4OgD`*{B$wzqpvtv6A$PHX4nHcUg^#pc^9aPLbtH<}kaBj1(ufH;-|-O) zer1gD$XH_1!Kt3Sg!lU7 zX4>5_b9oQAXwdx)Gd@w@6yz>7T}DUTE#+1BovZ9F+q9BRKBz7=tL_dYd+p3LsqTC> zS|;zs=~;yRJRYmn!1MQ)2zTRq{&lwiW_4KoIGxC3p8!pm>jryQr+6# z8T5}^rlp<2yvHVOnZ{20K|RZ;>{}%Q({5>(FhRNgZfV6^9P5@gr&8SwN__-9TYOQSUJSTy*XyoE~b5yFOZ`a{{>1KcfuKm!%O)3w><@0Wigl5YcQ z$@^VCPrF-f`-3gHuD- zeua}cvAOtmq$vTo>{cWssnegutB42};Igvo@*)1W)9hsUg?o`~)E#wv?LwR2f$+i| z^WDmyzJ+5y_`CUSTWoi?l7;M^d+HOlZ!$puVP?9?rDIG2#x?cnAkBOd@P#{&wMZK! zIO}CC&9Nwg`1p6#Au(zMW<7wmxG!Y^hZsQTF~x=Hzl0G9{^vF$F|U9{*oa?vN?lc;+I6wm4(fnNq` zKC5+qC@5t7YQD4dHr^SR1Y-PTRd%;NcZEGMMDthOpdi?G3DR3@UqiU6R4ok>T#Do& z0jcL9A>&sb5-M#JeC*#zAmOkv?EARJR>8+jYcwQmw}OPjJS2EOrLj@)g=J@(2@3hMr+KFfCsP9knm2N84}Eehs{|G+ymA>r=f)oO%MXMZsgiz#lTeZcX$sa|C5t7 z*XxS_o13``x8X5Nn1fT3D`u+63@uZ8^155P7Jc@gUKUK-l{a-a*IJ{&E#&}f5F*q& z40h(iZ#B$?ilg=-`UpE=x~6tV5{r(cB1TYw)qm7p04k6TytuDAZg;P9CG4B;XdV^_ zs*akjD3I?a^?V2r6T1mpF&8xvk+%Ww|iH%7cbdU?Fqd6LJA^G3W7;ugdF zC7Rt>KTHb>)9b(t+!x0%gGDo9G=sOROz+*6cL=4|ffrRrn*}f0f!{9uI;4P>*QMKl z2A<4DgN8?zJ!mwwb0``#_vak4Z7RI}Q!Jn33(Mc)0#9|YU*NQbWFr`c~ zOdEusnJ(2n3O$Z!cJQB>=u{>Y3Ss`KfNoHht{)UwKr*Il7MeVJwYq1FPzYjJ|=@oHRj^# z<)s=@T+L!}HJuKDh0{YIF%Bp67@L7%33U{Vc}h$AmS7$A3os;D=|-BDJmPiMNm}6~ zt#p$9=!7Xnc`=5En0D~umzoavjdQ=$5Q0KSX-P{k@n|inqJH5k4H?RURn)zpCW`QFvNwu9*&n*k`nZ`I>2*6am%GX#2D5_nJ*4yihz=OTr758tHYy3OouFGQ{Jw z#G;_3(b(q83nq@!4rQLs>AJc-Tvh11nr5>sF5sgL)#J3L%u-Sr?Xi1Ndz^?g4(shZ zLv`2Heq`{`<+GXz_{jG^^N6>w6zxpPrj(Np2#AC zw4XK8$d=bV_{hG+2#YO724T~+ChX2$pUiF0R-lO#ir=hc?iq{BwZVs`G;iu7xxtRE z1)0S)%^Uckiar6`yxmdn2iQcXYe-*yZ4VYLw9gGgT&3F=HTPNcz2$H;Zy(9px4L1X zsmAl2Wvdw-HMuRdKuZlg=cjk?5GFYP>!wdakx#GYT_2QO_DQ%O{buLOs!wTP}_?N12) z)q(RT=KLk`g78WMo6KzG)du`F8?^yzqWsODWPc05Mk0vPHHIeE+OLIb5~Nj2I82{(q!V6c>DPh- zqk>SQSp)5YwMLbqA8FOH%EJ%{PH%7lpztu@RGqCy{MjqP+IFNLnx!>MEZqLsFeK-t zBQBs?iCxPqjauGrpgoHSWF55!5uvsmG`tLPJC3x69t&jdkSgWcgSU?XOCT=ee8JZt z+6TL%^b?$nJzH#di3*lU7201s^P-%Qk-&m4R<0s zkMkzoTpofWowYcu5zcnjl0jApU9?F=Gch%C@pSf}jYusj3T@-!1{1q!X9_Futf8{f z1@>*_e88)_w!vmD7Y_4AE;e(q3531SNwB27`nrm9$L~BEk=j48t

  1. q5)R^?+EDyK zOiof~s3<%#3X)UR?x1>_Yl|Oa7IKRqu`3;WSC6Js%ZNuy&ll^Cr7b0N9nyS6Us{lY zT5$Z@Y!dn1mf1_N!|drtwb}JautPQy?2u7{?HZt+@0sz1QG(@vWweIQTUkTt7CBad zl85%c*)UkURItq=zPe+HhRG1}g>6H$$4nv&t)X?uEL4Q06A@O)zjFc`A5nV;Z*L>G zj8{%%7d%EJ;R7*sq$rN=*Swhpe~;0cJ1|o7rdJ$_5~GNz#k@f$BDHSP>$7fHv~Iqx z)v&R6#X7r+BtmHg{>F_mbB_Pc3l2xjoXO8?Th7c$uhq=yO~&6n+E`l$(AHT8rzUH6 zqL8A~sM3u6o6@ZMH>E%|yCA@YzGU0Ksp7~l;a#_1RfF&4=UMi zcPrI45^`7zSEi|ELFwz-t%8!RPthI{WE}v}40KT7|D9)O!-WQ+6qt#R_`>8F z+UEpo4*)wu`-JD(17Ea~2uLeh^7*&5N#J*M$vB||+v-(&cV~j>w}+hGY4`1AJIJ@I z-G#oEPK|(_8r!m8Pt*R~m`Ka%?KY8?n8H0lD1k7CYg%YVp`GZwxz8MEIl0Fi93l00 zLb9gO^pl_1U8eh(9sQ0LJF?YQmPkYMxrMfOBWrp$-5$G#&)5xjf^^dbmv+Mb+1fD3 z3f3huLZ}Yb9b|-T>MYbB@VJt+TZVpOKE9dV^-LfnchGIXPn7N}c4vf_c1EtNJ|c%g zNgEI3iwcQuH+k(~^$`yy=r(Kj4BI{>kG_q~oT<7cU>BupaeQBGk3%xX1m`|60Z8b* z)j@(!jKLnvUF2Kn{ zZ>qGm-31_ar_c!)wbs|MHjBuMjgAOyUuD+a?a~Nr75E6#bXZf@#o4^_-VF+eVozXW z$HfDywH;coVM3jxE__pAubdb~JGi+T?GIxI#yxXo0gyOD;f9S3joLjsagFvBqdGqX zZmrXLf%iIXBGKZ*>#=30(OdY-dTkHVX>s58h7c!b+fIuwY|xrJE#BOqB_6}Q8&Rco z9)r&p2t^yU0nlkP=Csgmi~b&N(xAt&%_sIv{1EnUw)hYOKq)hb;Q1}ok%*dl0PNeM zCDQ~@U2n&~`NPcO*0A?`jffqVrwt<*-1A4nU{_~s!|1}dVH^Z!JK;tfdoj8eXy*ve zA)}b|cX#-0rrOil8G)llL&mmHHCyHnlC9c61FvKR`pJsrw%DTK>}Q7A-&NL+xHv=Dl}ltvfb)!$gT80P?43T%DwDm|2DG z8?giBS~Shxgwv@tdpJHS94&nm5+`XNf!m{~`G#E_Lt+1Xw9!zM?bMQ1j^bTt8PwLw z(K`3xvHIINN(V`T1zS-4?dJE2Nu6!Rc8;@<`fP_GRL3)|LrO(rO)Ja|oMA~$XWb!PgY;GFFSS`RvEN;ST51Zph=Qs&^-)QN6W7u*cI z+i)Yd>MymlhBiC!GWMK1NsSBJV$^2fSqI4a+uo0_ru%5WZ%xUx4p4?wydst5Ck;KL zrCoGwe#$1!ye8c07-i7|1%zm(~O}XWh2r+b5D+2qe4; zk(cRq+HyoQFsfrgBDhk`|GIRbeI4x34E*XCb)v(zn`c}%FT*-W+UFM1=qzvV+qFo# zX5iX}$-}wb*4haf-)$B9Yi_=6m_Dkc9I|X5g)n|if7#|{+=eN{@!S-`D8pVA>8O%S z3QK}=m)dz!GBb!zL&M(rm-aITLdNQb!C$XxIT-1slho?mpgyu(tl;Hyh-pFj66&S$ z-mQ z;9Q{Yw^}!fI<;=(m~Ts6WMoa9TKQ}29`{@}@6;+@Ri9IfwtJ+XsNJbmyvp9Gg|AVk zmj9_Oc2ASGIg+jR#R^k4tCQ}?2s(%ucNa+Z-Z0G}=w2>!mY=nC;wDFPR)uIB<)O1BrpeE?Ai@0O@Pk z{B9CdKcwmd(ZA^0g7P)=5v{?DI5N2s;`i%&fcI2A9bK99sE($rg?3jP2W%;@PDs}u z{Z4dhWyM9TE4&+_?g78{*ELlgOtZE^oWp)F42M&oCn+nnxc*j%^nB8Aj>B~@Kj?U` zQOaz+DQ(SWJXT_*nszs6frf~&^Ykx6Yn!WDM%GrDv2M0{>sg4mJzchJX5 z5eb)NBlVO07G1Zy*Uf5n|2Ul&BUn^rx+HyXaS&5QuLxTEhusw!zegaxmak*J}XVH8kX+pC0kuI1Ts=8zRCQBiG;cfCwbdpx)tq4;g zeYOiJq>tdiEHm9s{NKJ80i_8%m{rw{V`X>Dcci8HxTNrS`!BmER^5!itQXx|f^C05 z`K{sw_Hh|fEy>U~!$7gO_{G|SGvw-oqGE-0a0Xvv@ikAz|G;9q2RXeklFfXU;Ml}B zbuZL|W1G^AIF_g07R3Y!(s>;7#7*OIj67@hB5e<*zV?jtr^tR^8{t5~yE!Vu)YhL- zxTq?^RIJ}TK^Y@{)!(5}c;iw8NLM=aK(vB?#hm{b0Q1`CB;D^MEp(C=kxc8RXzANL z%^O*)=v?mzemRq4**N$rF8M$BswLK83t!FP3}^&=!Nd)`HAYRdEPi3@OKD2yT_Y$H z?WqB*{Mz1E(F{I;#*n$&mQ0wtjc%yz9yWtNuMsrD;9dNWTuv>Qs<*LEtV?yCqkX|H+#1JCJnAEVY6#J_|cLQtWzcyV$YvjMCSNK<*w!7lo_YrK$LG_CaoGsCb z*pVf=DFTyzUvH5+uixXCAd`MiO6vuUhiSS|=-cK-i2j=yfncs6HN2Hn zJT0u%L--(qRB;%T3-wFk+C+VWO%kiVg(0VPjccprK$Apa#n)y{z4_ZD3d_E1oI)OU z&a9A=(n3?~6k|&*<5=0A`}B$EN6Ox(xAr5Ek+QK}ij6KLTB1f8>^D_{tzX^xuhIFMgw~&dco-{I`jPXco&5eqy}jUF=;6}m@jiIdsx2^FP4TW z{h{MEbPwajTQs3C@|x}?yf+S7$Eu9OdS}T09LJ>QgZR3Rlsrn~ls^)ZHtQgB6rE)zP6-&A-3du1x09ClPVGoW(Lz3O};Iti1;2jr&f3VNjn;jCN&ME*Lh-F1gF5v1?p%L2B& zmwt)aV^nYVMIKRfDl?+cCL_3{h;rkooeV#B#Ed8^gIV-f7T*gJ;F7v`bSLbtDm)$m z*m-da9BQK{&`Y4g(`I})1(QX`A|O3TpCUN04GI(V-5?|wXAOSFz4}-)x#TAYP>)XI9>hyR#wh5`Xg9LazCE?N+b|kDVk6`!SQ)?J@g1_FQc0{Ad zbMk~4c_{RsJi$W`J}wVEgh~oMjq2K{Q#Br59O>G4K;BI7Qd`$X;kM5k2QSk)=}iHP zCW03-r#uwqzpfU+y)MO%lVRn*)(bXMAS+V;|7{OP7JE3-G*}E?7)O%3OGFYk%!M`L zO!gziYlP&`I*c=$zBN028pavMQ}tAnKunD;jx7!^Ez;hRWXU+zodxa<)0;y4B&GN;4vwGhY6GT7R3TwQ&1`?vXkwyLNh4k z?lXfDwMWRB+9SCK?JmnWKrXZNfxJ>TGMz56xvk)I5#)cVllpyTchd`O1Y0^pbCF^7 z&tv4R)>~4X*?G_wXLcSWI8)-W&j>T*D=Ex0suN`Xj>f~xb_Y5^W^HRGn5nH3q%f_Z zaWIqisu^Y;bX?pEoTRx<()CW#4NVnRXtp+yEVha4R&Qj%(jt-^*T%&bHh#>PIyMv< zKRa7*M3}xPJ(+M#KgfESmK`UhDu>}q37ZZ5pzv8N`oO5w*!uDGGCTMvTN=SmoUTF7 z-0SaC^T5tCXY4|G`h621(R#!8c~j`p3cEX2WJa)Wy`ynwSltSJS4MDYndw4W-nWci z7PoBURsy^|Lgo>$WV``*}S_jKnrL_qaC%~j|I z`nqSa2oL3&pPUSL5#W*0clr5rvE}wsDR(8;dor7t4_O0TZuP7Xo%;iM zz2o{w+^K?L9sKgDu-}I>h$9RE_)1xq^tKQ?=Jz%*Cc^MG2wzao@x-5;w=~I)P!+(` z+!NB4;Ix+p8hhSe;h+l8h{m3mmNg6f*VEWjc>4Xu=>S)Dn{|LDGBq9WWKL` zNxIfax(?yKo;d*ydo^j_Pe0zPna+DPvH2%XhG}3<0PX$h$2&Cfy2dy(S#)S-*6qf$ zG(G4pT!b9uu%UUn#H;}{Y-nOX(El!nCX0PgEIDw^P&(zHp;>a&0{J<|_`eCM_+QFL zipR(Y7v@R4eq7@Op}rp)90aqS@q9~ z_xx@yu`?2L7qfw$+#vyT5vPlCllcE0fmgh_q5R*y;j}j=790^mj5l@`6pOi;wOf)a zIjLZQ*^=ZFf)-FylGXZf*wt51v+1K4#`|)wV$y)hmpjl}&ldoTUa?An-=c-OokN(5Yvt$#?Qod9O)1}GKeD`qP>GT(jj_GFjs&SRRwdy z@q3GAaQ-l=JtuP6McUN(L3;n&zA(K#*AZt>u4<20V8+CW5YF7@g}%S3TGt!i>&W%R zJM8bsks)g+w%9Y+hZK4+QD=%L}S*(rxK2IV(c1<#N&R;!f=cCgmK>d-vwBY zGbx-SZKFT`H#Z0>!a35@<+pGSgk`wbb~eWMbI4B=DEERt9>O2+X&5t?>kqA!dXcGv z^sUo;SSx=nep0p3U`n5mb>b}P6K6Vcv>xZLPFy#^MFysH=EC8L&RhrP2)x=EpSCHo zDQbkentNcGAMESFeTTm{ZMF6QB!BYDS~2YZ>VjLt;vW(pw&LPN7A`J0!_91)ZpXwK zX>7M%+)spwTle8c;D6)#aQ%fB@qlHm;KJR7?@X0=Nxa2JK-GtvUMu^Om=g0T_$=;k z?LF%_f$Q#kZn1REKNjKX(_Y zo6*h6cntIfmG-&kq2hBFFIT@-XmqLWK=zZxWY8EDSh%b%GsLsg`XcvO1XjE|_HsSj z=e8Rt_ZhI^Yc|&pyQ>OvPN}g|(nG3&q~m=ceAAyJg@lp;97zC+Uri;~t^rhXogKiD z+%Gn0APOxf6k6_i%=}2k4+;lSvE{XnyGdU5fFbL&-J$OgZYq-vc{wOU1aNu?l~=B@ z+!fkQ${W;yw|t?sl-q-X>vJhL7@cTsAmPU>U+@~rWulrw0k z596M5y2#)mcy|~Vit;OU124bi8!hrny)V}n_AHTw!5fcrPmwnFTQ;Mx<3O>Q3b2V! zAi4RVc!G+po=-ls8#+A2y^i86<0&f6jz5LJ?q;}J zz`Y1%5{)OMj^r>!?M`1CccnM{`|;M}){4m1^uq)`ZDnd_$@eA9CilvnS#? zBG=LqIMOMf^pwrn#f6ed15VQ3klo=me;Bk2IdVMs?81JtWxKG6aNB3_`g;53*V0Xv z#_h{?a}f|dmOEyWaxG;H5&fhQ;!U*BqG!cCUuvZ&0#Q@KPu=cbbI8WcTir3_klDsb zIER_*lj;uz`rbp>{7Kv&MCer|aUn43Wv(^;9sdf~gMXOqvJPLNirb_3y5t{!ApXn;&Tu=0BMtXZ z0}F)cFq~kL${O5+uHx-P8t5#|(}%-a~EdGQCCU2MkTqNB%ATIdVS~$ykT#nO@d|a8_zLDr+TICn#fs@`9Uyr&RRQsR za)|N2j&Ni)x0_c7d&2~U!AnT8n@}r!!eg^QD&fDVH83L8Gl22vzQV$r7Fp^JN9S;2 z6sV{ll5te16+UKC2(u6I?q^g8P13V`u9fsO>4IMK@F4Oe!|U_79^_c3&&FeYU>?`s zq!5OrqJnA+Pw!Xb=8pypPxte1mv*Oc&xnnI>dWovn0ImJ?5(Ij#=wD?auxqIPvB6mM=6MCcy=J^0~QWpo_AIV%{ zc`r`R&REXnFv2gG)!^NS>kf~s;6mtXd><|tl5xd+0V`LaJl+Db6?G_{RQTmzHwr)F zr1k5(@SC#gzd;R~1wX7u9V(ruVH2FbV32PoZg5Zo!!RaQz|w0~zyKAn{%m|6s%BmA zSCBB>1x}JSYsALCQ6n?|?P>fQBu{ZuYSY8k3G=U8B!=VK*XAp{{Aft~`uhXazP^CI z+qkZH9Fn#n>NJHFiCHWTt6k}Jt6e3$K#<~p`IE3x8^yy`G|;ih{8j@=!n5amlg9Oj zN!e;)FK8omF4$aXWm2YFOiH_uOH-Q0Nyj;f*Ubxj?8*)8t*Q&AAXl|)spCN|C_HFI zeOf)#H>Lb-D(Xe|gna~_5+_n1!MujRYSLPctqa^to}Ie$h?K4?u+uzqSN24qda;R8Lp2k!QIl z1?ZxFw~~Xp4ei`3CPSNc*t^23nos`3VH%2Eh{Cq5Ju$Meqy4kg--mOlh`Y}+lIkh& z-j6-P*TAgv)TE9J)&^o)r^*A$E-U=Wa4H;i8OX+F8eXxTMnwV^IN-7;?CyZRKW~4{ zK!G?LidGqj^AG#glVHUlzzLu|d*FQI*;%S0)Hx!uRU~Y2HJjFc;$TZUVak~lfcCN( zGlg?5NhqW6G7UtOlmCvuwaeTvG@9v*Db*FuIAbau3WGJ?@WeWU(Jam@x*N%~h0WEv zUNAYw&{wdAfvg-=M?M@91fgRq{NY%Rstf#`W00CAPIZP!t|}}5=r(-!2fCA+LJe)nXd}!`C=(d?aB%K!D=A97d_jem z?Rfa)Z^YV6<8ye$?II#UH8&;*3gbG5L)EeuTL&>TxDYC=J0JBl zM@{Z#XwrOCcC*m1OhEi0lXl~vvym=_DRoPqtY1yi2Lld4%&)xkx#DUtNgpdOABG)_ zGj$K}f~FfNMCh-e<1^?0JTW9sL;uDa=-^>6PQmK|XYeH_R~(nY;xIhgr;s15+g%-H za^>Nq3_1eu5HEQEV+|;7x(ybVO=6df=`!{#Tjmixj1gK_2^kvTXh!#GTr zgi3LY-Eef3p?vX&JQm423@BvUK~@`sGuf2mtYMHz)bt#wbb|GV3|MFmPkm+>#U{2j zh)K#+il1SjU^^8qe&FFx?-GC3&;h0%HcT9+};X5sCMpyToAZdPqmzQD>PO`W1~6?<({L;)ul&cTMIl zGfv0A5L&Te5JaF@Ev$q$(s~yCVNpo3yBJ6tb}Ga|cV4g)VkPH^5Ig6LE;D9c zYZ|D4jti1pLGruOh3y_`&@h56Oiq8CFA^Sw5MNuNH+70-oHL1v^3Gd=m~*_SfM^39 zMu!75%~f0&4lobju9%`GBQyJBvr?MufclB`)E$ydQSz`!SQzz_tTh^we$s)R(91B{ zJYEOqag){*C@AKafb!~;`-5Zhk8pGNKUE4(FcYDcZdV+#P@~{p~G6? zzt!R`OkY7OPgf5L1#VJ*%7_AqSZvg4F84PapuT;af0?ZcVC4f0QX*;Y4KysoJE9ij zXP&|1B2I@71{tj8cuR&DoWUy`MPJ-A+7OsE*w6+=&irSzgP?dYl{Ps2E}X@W$%vq# z<9A$e{Ejm^_fVIy9lw(*MTI8goKc~{uBpE6ttE`a#Wa0~xa937?JT)z7A0X2U8y!F zYScDl2Z!MK!O~#{Pdr&rI8WJ&mnThFDmD~C(v&2wiJdQq06|AP4$Ks*#=_NcN~08c z41c18^Xg?p+uNmi2gZ#s%t1obuW5{awNMyz0h{VlM>}z@p@Y44=Ncx3PlVuK)iE%9 zBn68mn2%?hQtN=7+c+690FK8Q%meds;(5h~+FbMEEpqPu6gJx#f70g-({VG48k`AE zyLQ~Lh%jnX@oQ>R(L{G^D(_Dk-v^bjX*|DiG&)gcTu}N(zhK$L`}4K_L;BLc+dY7H z-BC{--Nb8jQ>iyhJ;~5i3DmU`*l>G#@-t%`-m-zB>N?14hTqpg@?Lz+io7Zdc}X*^ zcCQ(JUdPB2U9~VtOjvmYq`t}XG&zCJ3%wby`4H39D+ng08ICePLzi@ejwyso>A30v z>;kmxw?W84)Si>!$%O_bLZ{mz)J3;J_eF*unJBjPVnYZ4*N7#CouZ#MkpXOLT%`i2 z&U@I;%Udd>C?=FJ;_D2Q7Y@UGrGzvmC=A=`4DH`Hh%nCw2iYz9eN>*RsuME+3g0)h z0T*$xS&eEA@gmod?EHj<1$Jd99Szd>HKf`Qp5Z?9Uc)b+PE`df72ASH{`Kdbu)wX@r-{a}(;i{~x)xFq>j3R5>XJ zf${?j*f)nvYp@T1dWXR>>Lq$7&zGcYX2{Mnc6?ZNnwWfdU7XrL#azR1NF-fd%BJd^ z+0b1EtO={r#LN25#Gcd}^c~Nh;d{;O`Jd$tBEwR*95guY1JbgFCrrF&<@;gL_cPJx z_8Gz_TwVJdy~|DD0Ag`^>Xd)v`}yuZeLov@W`oTE-%q*9FwMl8|3gln52cb`arjm%?wmd+5-UA^hqkCxQ5`8^qjc?GNf|gT(c_^TcLf0~e|d zG0f;ZY0N{|1ft@wj~5KNW_SuZM*rw7IQ0!X{kS2g9;VOz%Ea_E0QD7%iJr@iv8Vq< zmyQ&3(J>H3YiZ(sK*7MLWY&m1MM2^B=sTDNJ6~7_nepZbP6yB`G?q957 z_Z`OhoRQ^U9H-*v8i-Q0Oxd5}xc_Oj%wHVmqIo82Y-Hwda#;1rqotuR+U2Kq5F2W0 z%uIoSp{7XJb>+@f0EeU>lWQaLe^8>f&*|9|5-?6CPKp9PU%W6rplbT3HpjCKP;vgD z&9PiT2W3}L zbpDdd#*lW9>Gm$#i1!A|m6-j_j$hJ#zU^;VGE~dN zL2>R-Z#a8yTwkV#)!DsRl=^%kOi#!H{5m+~m$&;HiTUNThGV_KoMZbH&aTAvk6Gr$ z8ikKdF#itmGD@x9OT3Iyqlg@j)Z>L4c= znYqFjFgG#HE#JoYRZ|nj&d@rAPe}EP%jOszT@<X?kM8|pP71JEtLRj|mb>h8O2g*7haD(LTh2c=X4dYoZbu)$FIoQy> zumPm~iCHuU!1vt??ME!LJ1OCSN6Zh-b*K3UAicvrKVv|Gi8}Lhsj#Up)u6& zY2r}NZ!6}|1bQW651A01gb`094}l!>9mrS@2!5?F(01~!C7Oter7X#G$bC3I^%BFn zlyENL05R!eg$LqsqyK21A1r&#)Ck>f%&(br=y7xTH9Qs8Q@8JR6Y=LuYx%hr@)8e( z8S{FX!ilz}q_>GW*_8J|6a2e<&;-9L>y5$?SlGujR6K;?5c-Cx9X)?7A?poO3-Q#^ z+cFq6xX>Nau;zo&rLSoOIfOmmDijYP1;yruo^~Fah4v`nuBTL91doc$+%>=$@F;ADak+lz`?{zdN7xdw9~oT+Kwg= zJG3Z(#Iv&EIVC=CHAQ*RZzZdwNIZiroZSe8OD!p~Q8-eCH)qj)Yxxx7&W3a?3am~k zNZbets0iFg=o;o2By>&RbsuqJ!y{#lJDqo?h`2l9;p&81hU(FWh{p+%w4SJ*Kx#(S z6Un-LRBwsJQ9iTjBdVA0CoM6TAfaSf7lj1KV>OhvaKEgG_@&uOqSOJ@LDVtEkH;=W z0!9=O6`vGY3!&6LG5HuyXGplIN^+ej9dAM|N)zlcY zn0zCZG834wuA-A%4n}z!Z_Y7AKRQ({$=)x$GbIMtZihZZ=o4yBuS>ce8lagy%i$Yo zGmTRgnSNrhj#71IbG1>m0_lZw52UMxinthbYyZGt`WQDxpuyA_WRoLq14n!ZV^l(IB`3XMumYLovEZPBmrh==?S?gc@eDDy07_N*94 zi8i-_f#b|B2sy9!rI<@&awXP$8fSiw83>sxn`pAeoA=_g%%;t>&?DNcvc1&-Z#J4> zo**5FZVE+i=(alUylE|cnmMa|W1PHKV{-uhu)TC$VEHOj@7m8&&ENNyZp(}T&vmAH zOdd2}X9^E{sD9e&3^HqH%$Y6LSl%=jhg+2XI)0c`Cy;EK3tnqX@tV?wR)E!%UOTwJ z_|6*B%a7hLv|7$V{I<0-rrX^Bqzt4ldH#`x%H3+HP{y=?jPH^(=ooE!i`fjyt)>QU zrD-ReRIA)@DH zOu|Ntz&B4g=_G-qVFXHu)`oC>t0{_k0fM*Dot3c76pJ97u+7w8GgV>Bg5^vzRAc8k z+n{QjsilgbEy0QX4HNRD=%uX8Q1N*L<0EA+XF<>Hrc}g0McYju;!m?3rXjeSrHExR zdrSOa#}3nbc)McLS$}9_G}ZMq{dp8qldonFxo!LND2&2;`a!HhM1eBvckyA_mJ(Y# z(-zonL}qg^q;4Ihb!OPgEl_PVwN-9eqGtnDui@7)*Vgf4YUsYxdr~?A13|DQDI8N4l>~$S521*JCiZ&Uo(_%nSB4MXNKv zMwFcZYraOXzY3}97%ixZf>rQ4-uK);PtKl{u-VIl(DSAjgziH2)3ivdN`}N;rckC2 z6nuE!&!4@sxx|T;sGM-0ikZU$$#+!)A$ON)ikIsM7WD+U9oQR(NTTv3P|@s!#u&fe zbewUX#Ng@C@6e%-^(^xU@c8rFAlSOmG+uJ@z+*~zQ(;DY`h;5E*ubHd_sIiBTFYCL zw#4DUtOsM~@r_rb`a@?5iyWJQ`c(EKk(GK+!g zPtIu}>WFCo@^k4a=HKvVq6v}Tc8D^gY$bu>HD!@UI3#7+^ZWPQ$QhRk+J9YF|eUj2%H6>+;Nmn>shbtYcoyde_{^ zmR6(ioXC?^1(dH9tfSkV_g2UyL?) z(Nz7~_+d(X{<^Ww8B>3Tx;nUPdg0TW^Vh~Q%^rO8x5W`ud5Chd2JzHa|AF0gOQ}&u)RUIF<#PFGHyG(GUXO9_09L;!zIX;?)}>|PLlCEBuATD|0NPO_~cqv3* zGwESOYqO^`4YMH@^uDfz;wvUkvRkOy zgZ|Qcxc@6r1%kV&jadVYcJ~fbx`?UMbWS8|%T?19Z0ZK(9nGv#L3_jd$epHa9E%c4 zCv${SX}_x!@7B3;JqUZu`o+|R&MVJ0uS>s}!b3k|JwYI zE&(FKcBw@u(yB~NaXvoab=A}Yu2z{`@k#@!g)`MKx}(_#it|<>e{|K<6B@H-SDZzX z&x<~gudVWdfvh3#Ho&bL$eurH_#QCuHA4j z?q-XVx%C?bcLWq2TBgR0RhJBrbyf9%gqx;KSiSJ}O;ZEpM<8ukwgw6l%>5wicax{B zZec~ttpLgG#A83_BrGB-%YB<_uHsYOZ)yw6kL4z1PYD~94L6& z_f`sCImKbB3nv@BB<5uKBj-hZK2N5J6kL>$PNs4?ll; z9(?|s13@i4OO8UZT#tCVy-k+*EK5`$&GWi*C>t0OZwiF3l8u7ao&hDzA1xcS^usKE1B}+-=Oc}OOK)N z`0#P`z2*_2@4DRFp75-x|WY2A4We@(<$~=jZ(fbm1$26k3dNO+ufqVjC4=UT4Lm$f? zkXk&C*eE*T3W#zW*?KJw@wfpmPE%;_AU*IUNYCCq&T=1 zuVe#FKc=UldQ%J&0J%s8??8R*~$jBL;9=hY_8#Z3OXaINPzU0+i2lVXLBT~ z%EP;uBbayLmm70s$dE38_q&)00~ZY`cR%oh-CfL`UA_zqld%)KV3lKqS}pT% zMi7a5j%56cs5xR@Hb>|Nv5iEKy4lnma;utyG(#;%!E2Fz9*ybH8P#B9p&A?F^8ARN z1vMTiKl=p%|FSv6<;%T#wvp;JsCwBPsy~ydXXU8oaAjj{og=^HX62wHSpF@xt6773 zkIr3j4nJCStO8$suPaJyc`&!DS?5ypt9Wlaxwj6^bTv1Q`h;z6>&?~^4v=VMoN%b3 zZYCK~5RNPJm3$rae8sFmwzq}&lETjRwzN*>Q%HLS#o3P`=M{4_!rk(UITg9N_T9{6 z6()4URakWqYtbNh>vX5!Z43JMz!%=?ZVtu6)DF_!qhEJxZ(COQw!1lytkwFL)Zmt2 z4s%Xmi=04r)mH-@6U;4Lk zyw7F_?n~HY6q=a57^05#Du2ZnerswzQln8Zo_PTgsU&~nlh`ov=@Zy6Y~a9#i)^=olP|jpFxuVL~W3wDG zB(EspSXfqDaGPuiNTkI5~iP zp%DQ2lg$_bkk#~-AKad74#z{z8b)jD;Q(4W)kR@H^G{OPE6lZpQ!rjl`P2C>YJu)5 zv3{3?y>T1*O)--yFzNG$YGL%}W@HE zo&8Af-q@z%jBgC~E^STwD>(!4*as4PXUrd;KA_wO=1jrt$J0MIyDNIK?pBZ(5+#ip zjnac6ZwabyJfP@6A7426xp^$?_{r3pET$Fogzc@LamoSfrJW=@$i<1~U=USW(~sNm zID6;M0Lk&jR7lrsDs^}{`;0Mps=4IRJTH~Vb57a%q5}UZYhULVI?#mm3ycG2pnkX( z89>E4N+q*1A58{C;~ScPN^YB;KnC!22Qn}_(@F+TmO0Gn&bP*03(T)SUK*F~F16Ev zlB3@SFr^|L=(fz9j&8`7W#;bAtFVxQ!RuNm;}7}XU3$T+Z1Y&<^y5|0=;OKs!mgNEO<*I^qVQ8_e2=<@B%r161Mi z&3~6Fr2m6dp`+xo1ajB4MnYWklbL<=i#0YwBBJ>qVGzV9mwR3 zfuZCl9j5I-n?fnL8xg0_p8!ZO;woGJ{>W%nOG>3svBT^SD~-6(%8VsO^I9n?0>Qqy5R4@ut&b~w)W-&>1u!4ThSicTUG3GABYWGBKD@0 zTeHKUtd3m<+PZ|)H#hr0o4p9Lk&q9~d||X^mds^CsTb)N(#G8K4b(X~TK)XVTvffH zNIGI5+}>+m%lrbl`^*~&LjT~PMu|QIqy<|asZQ>#2(2M zTF?b4D;3eZt60rg#)^u57o=imi_C)vVcL%`|DNkY3r)&UZn&Nc6Zf0DVL~B(znP@J zYj}Vf@H3;&sbN_YzX%wA08wcIOg})4TYC*Q(gZq8J%sKM3OvIR zEAag7eO(p%@-U&naON+>DBTBQOpgL#n7tqTSQz9EndyfXQ*&Jky#RZM1tvPU66{cU z&_1}jkQt{C&rN-bv@zqkZa7J2%&V{U7dMb{Vm_#LbnZAEYUue3crdaI12e}8c6=AX1Ajpqe;_O*{ zQ>++^o+oVO&05K{(KaQSiP3o5_L2xRtQ||?sYLdYe};-v3jRT$TCb@GD9vGX!2S8w zdo(c8dW^LWZjd*gXZHN>&W)Uq!ByekCw~Voqd@#KF-^D+T&u%%`#Y239-5SRO#^EF z*~Hs(f3Hb-KK1unt7J`i9tRUN9NFtns{?7SnL*KyXKIDp(DZYf;tkdvTw|-+w82=W z<=Qh?t1HN#3t`qnYk#g0;_u9PTvN&F^{~R9^M#ZU&VrvWQPrPi^iCSnCWl^EZ!+EuxUXP1n(m?<1M*&pEl0m_J zg%6yY@O>S~sK@m~2~rM8Y z*mTVmvg>n+*yw6~y0Z;^tBH2KqHnby5uGd95;|`CT!FgpC>lqGR5aXkom@ZAGqC=%aY*Q;By_ko5Oh$um2agVa!R0 zYQ_b~t2XONrMKL^D6HnZI!O+}xm;&DWD?8?Sb*mfBaPHG=7sI(Y0+;t&P?*;@+{4QdG&wh*q>_|z zi8OI@^( zle6AcuOa216XBt9A zXO5-|)MIR7=)%)Z07{3Ng?}pw^ETdY7%8F0IoKP@g5(1TSC$@Zz!_c>_G4ATlDaZ&9_uv}V zp(6~!;xstC2CB(fJ-H@0x~4t3So|5%ldHC3bLr~UQHH9(1`MGUNO=Mz)@vU_Mo;d=P$b*?-9$a`^jt)G)rt%3MI zIgMeTt^xBFev-Pk(R+Q2L4A;rAsKnE@d_f3m#ZtT*Z@5bdz{8YiNoBru5~8*l7xkSUbZX0^YQf6yUu12lA-pGnoarzPAwT!R7`{&;QHkmhBOkD?5F%9Rym608HsUdxD(=jc`;wxUSrT9YH%1NGv3~e+cXHG*>r^|i;^l1|7_VC-q+ZUCDg@EeE({g#S*hA6H z(@{(@B%NL2C*DdjcugbR9lHGfcsdA@)0fMmR3pM9%_Y%DJqqzHQeX#-iu5lcT2^f% z_Xust*a1I$z%_80@dxqXc>{8PKdqIJK-ky9L!c^RnOr_w1WWt#_|<8Ps%H9$caoqy z-mSxo_Qe;;pnLOM)OH#Ly2W7VY~-n5mMCCE<_UX*P~3 zzOWgTraz50sU}H057gik%2tWjbWagBC7^t{1O45(oUkd!pyG#qYRGRgGyz6e)Rn`_ z1)Pqkt*hUAA9;@%9PyIR)p?T`j2<(&WMlGV&PQUS!<({Ua+{_HFyul5S5I*-88>8bZJ#23PJ3?R zr*6T2RQ$|a=2`(;`L35W885B?k z?QitUM%IyXC{{sq@N(`Q3GN@-vV1vhiPGp$W6BCH?g5eX3j?=8vdtj2OwOS#|2IU^ z%2k|_fTko+hp5mljWR*H^~^FTS;P5A3ztPfQ3K7}xIIe_H68&w*FIl$9TaTcYuDB( zk&;zdsTz6| z)~zC%Rqwwtp%Ri7K5fxrXZUyv#i>tG;X!P^NFyjhEusjPBGmu7X*Gk4xw-DJ<^elWE*E{wS~E`qWdaCK7~GmePC3JYt*J=*vGxpa$!0~ zc}~@{t|CKkuNHA(%vSigh>L&8Ixv!G$XQ8Z4cR&)bP^0S4Gd%0)d%UQ*_kdQ z!lWbg&eVqJ!is@9&Z=z;0#O0g3p)FNaz7XBLI-^?9b)#QJ!31pwx4@Zvicy*-Op*s z@4Ee5a}*NK?ngbsx~v0S%jRn}>};GJ{Rbx=CS{osVVDsKm81j+v&b{16~;!QASYol z63RvAs)}1w(m@?k`#qLsGB+{OgSv9|^{5Di3ju zB~ukpvBk&NO*BBtk%=#wrB=hpLtGTyVq0szx8@KRCi!j&m=AH`d;B?Rx+mooYMpk82w>!m=R~y z&(4XOzN8a!MYk-(Sk5CL|g^*6(!aXv$9G z$cx-~siZdxsVmO;f#x>1Tykf}BUVYg`KIRlR}Q@teq~&Hl`EjV#CK}%2V?JZ+ax=8 zS|^k;H!Xl67vh8ha&|fNaOZ0Rw)GXfX(C3Xk#w~wxUp_Rm%H7tP>2pzF zA{SQi!-wJDBjQK8geRUtOz8zbM0qnd*XqJ%kB&y(BIo}OiTHO`{!Rv!}V_~2RTCo#gmWz`-Ur@R@Uu~Yd0oL1t5=+o zC*>0Z+r7|`c?Q)FtzicU^?$Z!8BJx!Sths zPG9h))6dY-=^xYbq&VCTKYH_D{(QTdFajLAm6;I32wYXi;G{poDII?Er*LWzz*Esp z9mFpnC-+=8gwxp=)V3ZA;?eSFJR8LCBY<2H!hb43T!0PgLAy};EFqL%LZ1Ds^muw{a<6t;>_bCmD5lqFp{&m!E<^eIxk<{8<-CZ(fPyNriiTJ$@bTQFA^13;g-G zKHpn%Tn@4AGBxl+eZG`_q0|XV2D_@^L<4>cZpq0}d^|4jcc5>MoA=u&{y2gsuOWW~ zpM4z7$A=`a=W3>4U7Km^?By#bv474U=Eso8yXn{epc(UT(&}g2TKD zC8fK4U_&#WhRQFFP(x)igkS=MHs{}Ikib@1$LeL@N7dq3<*1shwmwt^Kz#pFEgWi2 zckZp`d=U2iEA&_v;R}shSWos1(DlOQj%&#$6Z%QF(bp~cI?{3MZw7X46r(ntYsr63 z#{G6H9QTxMWIK^@_i1e(_fM_qPKs^AcfxR$J5G@FLxvh=w?UvKz?L?AK1Spux8+H; ziDhl+PBOLSUwv>VMYf|mX_7TCU-{^rgvYxH#;ZX}d^DDd6b(I77)ZZ&3%9H{KgjcQ z>L^GUX5^K7LdW)eTV(<})!M7Oh$MHnryKond%DTG#nVl;B%W@v@8kJqI0?+0q55ra z0K~HVOyVBkwOoNFVwMLPNZ2_HjPCV{4@`UskNR=g`x1Yd?z(xH-lnaq1`LY5?r^LF zpNrcowIkhn^C3PPJseCO`QxlW<EVfsN9&H$P=G~V~I%H z5}-1XZzLzahj_#bUhveoS6<*zZY1njDSB-u@r4ZTDdsiaB*{}l=7jfqfdA|K^Hm0C zepu2Ohmv%&G|cnfZ58#TA`uLCZiB85#qsE3M?x+#-^AoeQwNlhhD2 z5P6gJFm534FWs~_3R0S%9gZU=s%#0lJdyUQada{tNmwvQ;aiHH+lGAi2nJmZQ+Op3 zt7D5NYGJo9s}AS~AqmHmHHaUrAA_a|D^unYpp)vo>FJWOqHBmVR;|1-h<{&FycIL@ zbPR#y7gT6Mqsbv)?qEJ@_z)YvWmh@~_>^6}j%K1dNdBI_iu`Tumud@G+C!2p85F)s zo)SF=wnxdozGRp+(}awr89(p==!fvFySx8%4V{5FkGWQH5^&qQL$k^a;9I&f(e zUxr{lJeu!_&iTqzzMo_Z16OA7q4L8Fe%%E!Ei2W=+*E#ulsrkF!-pbon>&a1Gq(Sj zUnHgQR1n{JH4Mz;qddO+RmSSrRqFx}OuazYc8L~Rea5$8IJlh22PuF4i98?^^Pmp* z0S|dKE5s-OgdnE+iuBUD)uC2R;&D}A82XT%9Ye?l!^i*Pe@3vN*L;vOb(i-Vbs`K5 zWBJjN3;?fj{4fc6EL2~=>I3t}QL3G=2>Ep6^xhtiG078n7f7DCv>x6lYNt`do<)2w zW(MSp=h4kFYXWUq9$JiL%_blnPk`bqehzvMC?RgeKrL*!x6Tb+0MdbHJ$B!fu|e#- zIe6Z2=K8uM7-1qF%#m;n_&}FwKZ_1hUW<9EKa8KWRP+f~88YuhVt&U7i*YlMPJ(Tn z7z##2VYC&xuv5N_!MKI^G#(Q(h`v@xEYy@%5Et`;dR<5iM8(|()O#z+i}Vy?>j|4` zM8B=~m+-E*!+pga&WJl4eb7a_E~>od{z@I=VO0JsGEO6#j&nc&Q$GfD0!SY|&+Y_} zx?x`jo7pz=lMJfdpSQ$cg68t-T{GI)&E*a%Bc12DBGCt#=>AKKY~HP28~571ThWvI zSv`*-bSf{FZAdDutstW6@#3j`#j~7-D|isP&Y%Zj?hL*kIyKUBkY4K?gwN#rOYs3c z2I)pT25X<`1mtD@b0=T~T$|6AKk@{mGFkum1F-QV^%VT~4uG|j=Wqb5J^lRy0C)h# zLG04!#cTc3XF;*+AudL|wwsHLFBz=b9Sjna4M0rHz?MJ9M?lQIWv&o^IMW#qOPyR^ zd?tmGfJqUcyT8mGZ;#4F$!Y-98MHP4_T(bY6H_B3B8eoa5mamVfGCl#z+-g~H5f*(MAV3R2w0chO<>PT-c@;cy`FuMW`1-9{X0X| z@Z(Bei+cV)SMseM@p0(4idSHA25Sz=Cwv#Ov88M<&K}c@C7u`aGLY}8-9;Igox4HL zzCb_iE`B;-HLsPgBiO(rYZdPgiL3dsh%$uLd<(~+kQ5PhL>&91QH)rF)Oj!*J2>8& z43iAO!3To{oiVEPJ}x31R0l&!;sIe^fKrO@#cp(9yugN{EP zMa%X4U>tDvdOrFQgMn-7=|Wi(lZcEKx-dI#5Qy18KxBw(5YG5yt(qvaZ4jSe>q34-NPj$6Vhw2IS3Y@--X*GUM!Sc?hI!;^hjF8ON3lplDg=5ZJtl zcSWu|%03*Cvwjj+E@vCknOV8=hW1w<$Cb<3X!-(j<)L}Vm48!3x$=Q|D8H1!(L6o{ z#f#X@{B~xH@xo@luLOnj_yW}Dje(Q`RC|muW*6{Z676@-tq5?8?cIuuBW8!($~*FK zJ&exV_%!4(3`JZd6N;n^edK4$T-b|?q70trBbh+Y%|_}}CGkUUp}+_Occ7;7Je0(C z!8~s}2vcW>LGO0T)h+6%F$}~DWY!F`@pl3aqC$arVD1@_k$Dvc1~w7>+YRn@>NBoh z%kRrrPxk9mHve`vkxv@669ux7(C({OME~~mOO$=f@|{PxBGI`WqP}{*RN=vZCJmYF zevwV`z`s{x(x+MhP34;>b%2Zs)F+L4NLcz`b%Tlj`i?k$KFy(E&K{9r%AI0xV3;Om ziBBRkA}R{F zXA;-(e`tEt^TiYHDf6FUDPhl1ae`DKW2Ea!S(*Qp2^XB8s;8vKuP52Dkbkn)Gx_MYa$aCSViCrua%TBFrm9l3*VnXZORRBE#<=`r!bqV>SJFRU!JOjgi>Bh#e5gEru+Lr z`H_`@kX_0v9+LH$moI36E9KkN=Oi|rku`^k%<4lz{7q^!090-8h`45}LI^{;4XNKn zp{fFtY|H3pF>qRB&rm1%hm6&;$173qjnej}Z}^6?NsFbJZM*Cn6t=%uETw9ibU$?C zFK;Q4J*;Ptu}@JfU>f>w(US7tgB9YSN}2C$7+0?zqkv^+ktsqt`Q%-t*j|GNDYlq* z?y1;9+*Pq>4?QQ0-IlNMzo7O=1-W0=*SIT0Pa{!3m|TVORE;i>?CQ-`e0betn>NzQ zr7CJ^Bb_i2a~~X$4^&T|q49UnrHR_eNod)5SL$oHV~S$jumppzK|dvg(YjIoUiBX4 zASRkN7+=l1;yHK0*nnKA|APhy@cLu?U`YGsYYgnY&KF4b2Z|<$;9s9F1612Zl*Xz* z^FE<2m7@nAP(6e1VRg@$trS~p_DQDhaxEsvSoAxOZsiN$^etTenMSYMm>f%Tn9jHj z#J2btb4N{+xj;tTJD$-0==a_bc;|UR!5Zl!S~Lu7NDjX|@IN-f&1>ziEh+v`8|HZ33#oZ!zi1im^iw4AhTbH}dyD*s}NQw{2~z zjk^@WH)w@0^ofmTh$~E?yMV?CgVB1a^ANftK_2NLkcW#sgtnwgn=^)YC%*K%FQ$|f zGixFy0hPa!ICh)uoWZnYS* zPZIrHt@ahG=!XIyW|r~5SM8!7q%~@;bt8ru9pl9~L2Bs{%>U6l8B$B{!TVi(AZUGkFDVhv z$=axB%2aWLiMYZ+P|_@e*kC)bpDvnq&EEj>sp9Fz^mF@%HuOpz8|@)N>w3%}!s`7erKjh{fuiZ$>TR@nBHs(#Ja z$k^-K#!e&LaqJE319+CPN7eL}WYbL4UMmQ--0jOEyAskPw5uHW@*J z4o!sxK|&Yw`e=sXYR%EJDOe!oINAma0nB1}BN$s|!SrBZC$kXP5d7{!7!@MK;!jS9 zz#`87Ap}9S0Nx1|hA|6`$3g|8R5HC%TyC1Ol$~BlWL^YWd&qr%w@*-~FvbIA+bhSN zNZuukl(+v?bp>*}dHA=vE8cN(V$b7WtW#@7w3WKDh17{f>@o?jM3|#bk#*63Lfm{N z!Pl4+A$&nn-rcP$bg0E6$dN}#h!pCgz3{_GL67!AXZA2Kk%AA6z=wiJfq0-)MhfpT z*WrzNh>^y?~;p z1c5qQ=!H#&N7E+DqlF^0JPvFm7K#b7Fd6oiQp>%PA1}bBOAZcH=OuW*?3SQW>Ni1RqY;#t;yD(M=Czt2M%VM$7 z53$($EC`MhT9b!Ah!0cagdjXybK``j*zI}o<~MOd9PTM)6QL{SZ0*%Vn2Fo2yopeb zS4B;Q>zKuU+Y7=#yz*%#^l+|JvX!81Cg@;lGhrgmS>9aek6;VJ(C)&fC;%HHHRc`59D)0~r_C(?W1_?#*6zGUT?_p>IiHm(eodS|RGa)Wu8V=8(}li16E9K%zOs}JL9Qc2bq(OYG7Vxp$`6?(nIhgk;u%H zVRj>Ab@*nx5mMI=U+IBLsBuJ}j%LV|E8Zq{`RBJ40#cQjmffIXf1f!;8xw@3z76W{=pBn!~l11mY#@3rR^rFX-8UUTGn7V|EO5 z>n4yiLdRBSJ1Et>?oMl#)sZ&#hxFU?o4d={&6Jm<@vEsF=0qvPYa(D7(>n^1r>|ey zc5(e|(c$5nNtAF&4?!yij3>c^%ZQ=B&$Nu#FI`4!zxHLs&MRJ6ZtuMII*MKYm373A z)U2cROJp6H)J4@Z?caE4A#I=e?^?*bhZa)2rjjx)tCT7`%;8vN|NgVcM>987hpb^poZdf^sg)ICy$=fyPTR zT(JyUcTapc`W-5E#~YSoUFanlav0ztko(1WADtaYlAO`evwYz0(dC|S_osz!au%~5 zc}cKvG=1@{p+uO6jG@SM4uFG0g#>3I5Q9s+I$}byeV6lYq*K1s6#XEljU-nMB66cdWbv;zFH&iO}y5E%1rl$q0IEfJsI(fY&Tr^h#79& zIvn{{n=I!}OIKRuP^cO~bp$?QhgiSiS>!jWD71}5V}G?~EU}+-sjVYm$~$Vo!%I-X zy|upXUgF^7?DrVtN^}HTsCXMR@Z-BEMGc3!SwaYmcn?|H;YQPY!XQSn^9Ym#$%DLI zSy6=EdBiGH1%X!#`pxAp7F;~=9=m>VUGywv*B^nDu+U&Iyf3)QY2zfwdtZ3fYc)2~ zd7|UCRCSgl?g=qew5rdjm102>HQvVZPfG+}r7No=A}Zea95R<6I=7ENPeoVz2(VVk zlSWWBN^o@*M}S#^w!AMygWqT&!oBuD;QmqMSo@C_JTMyQ-O(tPeh#xo3k~sV=V;ts zTj1(w6g{^^crzD8i!PrEFXP`C zpQ215$y$kbu6~NRW&r&0Dc$nP zLR0w`0`;~KcRCTJiLpX+d|<3QPUy|x>*K}?_sI3Q3BmvdJNRy*(2BgMO%qy>`-y47 zOANWOFkN_&+&Gqw`voD{~XRv69kkrR9TY( z9(0w*cGWNp`SGuN%_C;%=mz*9%5V0f0*%pz*gU{(a-j@ zs-mWv1i-33JLL}jPV9Y3s616yucySonPlq8j9*_{14^76jna9-s{}cwoW~?G10X#^ zctKPI%AxW;@Ya1rRL~*YUrC5nb4)VZ?_telDV~FmWA66d4UwrGcKc@T3k?5tKW_ z`UR+u9d7(>ffZxYu|AA3!{A!4Y}biH*uR1{T|{s1C!kG-0bBjSZMs%GJ62CDw*Z~9 z9#rKWT_NwSY!%Gyo&8v}S~tsvR>$JR6hJWQABPA=wW%ckIOKp&<(}v9CVO!{MW`1K z0kc#Hb*Gw2mNrjioC&R0JOXKs zSs_$dktQKth%W=+`&@(rL7L=jHC$=Km*i>|qD>soCh^BYe#XErD+NrRZ}eOxd?%5d zkq}hb0JDd-r6ec-uQ2%bSL=jZc)4}GfLZItK-omJ2Sjfa^voIP zu@TiUXN=P}qIMK7`7cljb;c;)Bn-zFjid8~a|BZ+7Enw%P5jwgV8fIexLbh4j-tx| zi2G9b@=-VwYEqX1rmgdYNn24L2M-`iBKH!{Z>z|gn~+6>_G;rKyUbhL0UQP1M>v50 zhjAw4?5t%1TUR5CQMd4%B2={@CHM-L3jL+N5@t)b9l%Q8LNiIVC)_$Ow1x5$LNoLp ztM;2X7|IjhBWmDb4gh%pvNYqQ&cx#&3tz7HgZ?vze7_pGSn=%=V{9 z99Q)bA%#g;RFYw}8@4M%;*L`t_jPSCRt(Pg` zAT7_u86v+I20_wS4nQpXD?lVE^vJHVX3wKQoF)R1-g*#-INb+!)qgP%+nH+tam_@P3dkM9S{o4__mCW6mL75k3?VT)(Va zI#2Nar3SzK*KacL8hI)XMqfsD|EWk#v6Aj7%05$v2=SWgIw@Xz2CyxBEZBP9tO48q z%5M8B(1VyO;_=KK|8;H2gF>$S%2PL7Wf8bsMfUB=|Ah@lyzt=aZGoieei|u#@7Ef% z207M?XNB6q$3pFYcfb7w;3*6>N46mKWJCD=PZ7=O(c?#RaI!;^n{AVfsdt3wkF8PN z8j`=Y$RxYdAmzR=2Um}lQlnQ*p#1ivPMY&m9Xc)k+&Cf7f=qf3V+CVTxnPY8FYOsM zTn)F76wv8cebLF_ki{3->NuIpL$M7b-LMfxhb~4R*5z)Ns9Gjb2E~z-bxp8>VuYm* z+C|GFETLHA$ZH8hG&fN6(%pWuZ)&4mIqsI$^PH0&!#yxh|qw2 z)Lhf$5f(U%diVU=%d?Y#jA)A+sG|_{C&@zb_=9T{V{F;bQYvLm{2L1;XEJP~%G|vo zK!RzOaa12073mfaqAE)Fn@**w|mSFzScJF4mIY3`RRucU5X( z=48t-G5zG ze2&`1PspvG6J2qv#ph_~*TBy$t#LNXKDQ9xh>GTx4L+MMtC~w*Mt7s5mH5YK{3H8k zm^jta9Rps3sTNYw1uKz>U%o%p(iaD+hSX29{NbZ%7E%El^8)UU(7?uNmMnxRJKZ9n zYQb}c1$Fr_d4`3gt(0NLK7@`MEHf;DlDXf(^ncr;7M*4}mS&^%J;JewD zhSJ?>QII;{(h`!}Srp7Q=sw5tiOWG}o%dI&gAljC;;#^0#7rasTjd-}5=A@lb1g3^ zuQ4|FFibVk*-{UJ7Fzs3m}`lqA881wS8$bM<1H^r339-9S}LhJ8?)3ntFA%DJj+&R zsT0=3W+G!44fM;fbVJwa^%<7sIOfiobj)d))-g9Rlw=a07CP#MGwG=57@CT93M^1V z#xQ;kj^XZnOQYJ82%`f+XE6JKHsRqU1A_7eblO)ISU$!jNm+;!JcvhxKD)Y*KKo;# zIL_9PzVxsL4lbg@RApJ3qME)f6l`3kfw!_ON_2>kVO{IEbNl^Z{HcD~ z@*C~~(_(}%`I^a)yDOUUeGr$HT-cAv?aQ+?Fky+Mub&*VbW}AE9b;YXs_=!^jGo;r zQ=UR5rP)_8+>o0zn?&W2qDT_F&OJEkQ=eZQdd$CWjOl6VOh``JyNElCbCN6}avLVz z*N0Nd(ms^B#C5Cl5CMq$kP=DudXg4qwDDHK&^Igr4^hfE-=P}F`_STvlydinlv1Yu zHic5k^i_&@(5(;ggw}m6b*0;?8i3x{LUjBzsdg2_9L|T&)3zQW4?wPQJwDMayz9{KlsmN- zq?w&*`OhxJ?Ata#ShG{!76Gv-&4DUr->5&RtzD4Bhm4(AaRP_p{2_~`!v0lXslJ`e^LN?$RQ zzaGXogHEONgd?%2hfI`9%tFFe&{n7e`rk!C{obPhU6!Ae zy>T3rCy5*im~y}m`k%H$prp2?!+ey~7L~O2g?*fWJd?$U9xn5OBZMyAU}$j;rhS7e&G^Yre3yDLuZ+}SqZP-j24q@sY#J6}nC%xJ8ju}})0wRG$4p|yHd>tSOGwuo^^?NoSJlcXSN2P#>j=VgeoXQJ~PV`Y2H7%oCv_`Y1R;XPXr|+iF2) z&i}{Wdj~{$JdeXZcibHua2(RHaEI8iAoi|Lj3vebF)`@5n@=j#Ofd{ zJw}a^IBj>T4(r#&D8Xf17e|$hMGGK$TNlKxM)$lPM$)9{I#!nbJjgg)b^z0js@r&C zK}Dl4ac)K@2TVxY(`bt*4huDs_-D~;rc!>^3bD3;82>C57bxau?Vhlf`dL5jX>70D z{(xq>>e9;?jkejWUPg?ZH9V?k#LT-}p=(QHXXKqREsYIGR;gWRyNv1?-z}+?vEVsk zNU7hiYz(vJ93{>`mF7iDimx`P)l``Hav71QCvm}*0`ku<3+hoLsgCjJf004}Dda3X zXkqNZY^w~FJO_;VZ&AtO;#8s*?#t)NIqm;Fo*Y+yWh)41f_h8SuX1SiobroolR}m- zxr<2Rm}pC#Od%tX82-`X;AP8`ryaW*it}mlo=(L73#@wk6BgksF#ct#BK;eR046tS zMRPW}z~P04dLt)b^#`{>}e8T|aemrnX+{XpM(pOP;yb4=h zHJ-qukj(uYO1i$VZJ;q9H(xYyqRTfe9htF^n9$7&v?ETBfUaXd@H6xqWUNh(ktJ!L z5{8+@G3Cc#V<_3bYrj$Yz#oH+UMS?XZy5L3JK&c!)zKP zH>~?c4E&29Y8-`e_`eNBg?}RSc+(h)|0cd^B#z&U-!vv5-hzi2@5m92wcj!Z;dyWM zl(g0L7({wRJq1L(WpqZZVeDH}Ysd*X?E~xIGCCr9(>}c-Xb{k~b}LMb#okmwv$u`o zVbj~j-8ey*q)HD<-Z4(Z87Xr1qDguZ&F&;gPh?YHlI}A4UDQmbK+ckZ-WcyTsv`tk zi>VF|-?e_e*zU{dkw)_6*|WBc&QydXUP z*Y5CrOj;HBQC3zDefkBnNLnyiO)uH`rx|jF{UWK+f773___%Ytvm0r5uRTyLguyf( zj=0;~y7mC*cN`^YDl4b-!|-T9tT0p4><1gybL+o3*sN_kX`aa^$iQE-?aQgg?X~=0 z4!3J|1;cfpmu5fQw8G=XhWojZVmIe!<2_98k2xiLWn^PD@uV%JA+qoU327*pX_P`5 z98S`75|fR7G7M>8mzLr!A)S#Y0fY~)sgFre`)BiRf_);ZY>Qeuq6 zV=!x0>AgSu$9ycCnvWczFX&>8Lip?O)xj_~R-lxEk5_*H&T&*|{T~4k3Vgsu&7ui= ziQ-fVAlj=Fq-7b6z=-!$j{Q%-)BBA~4aB~7wbB61lK_gGZKToX6p-=lx7m1Pl`t7w zF?P4_Hy^Clpjx%o)kr?v%*~M1blX!{7v@R>rhE0t2?9A$1u!FJ>%TneN^l%fK0dzq zsKt9qH^lSP`EE*(^S3SK-ZApY5N*t>l`^bN10rebpa6X-$+(Yb9;UBHd%EaIrZXYt zcNi?mHr9i|U?d^1PB}&$>;&Uzl$~B+Sqjg_!DsqLQ6_`4-+hSu4 z41gQH7-julv|||CI6SDqI;EseZOnKX_{GLnXr?hJmm2qw|A&?t6~t_lyWF@C*Yd~} zMi%>Cv%=T`eHkvSFt)+NfLbZW?j;hZPDn8hBso*Xsxv|%FdV&9b;g=A)d3yJNae2@ z=qF^V#>%um_%z5@qJ5(;ys*;vhQm$;COtE~)5tTW-wDhWq-6At80naj zwY(u?4Koy!Htal6^52iLr9#CVIaXW=D5ZsOXeBjBC} zhJo}$F~7SbiNsWiza^w?Cqd&LtBrb$qieO=I1I}gib>nCNVM3HrcJ|`$-ah+)yBm_ z&G^PC{5OH9SzTOX^nef3jYE(a_;lmTs2?^3?c%ZM(v)iqgD=+@dn3^p*BGZGnY^~v zND2Ucy%uRF11_wkgr{655ME1&el42j2Fyxb6J*T{?||9P5(i;^f`Gs_YIu~ohU6k> zEzq$w!~YXiXeYLfq=bjFZET;~CIMX68>x+~-g*h=Bi0)~!AP9b>y1>K$060$c91$E z>BKtN4Q%*II%v3M*wiHm&OusFk5oviAr+b&kf;Kh`f z6>Syglwg&@Jz zy9GJbbFUz$`u<{EsJ7)QbBCxEMz5rO#ya>bLHkfz<-^c@sKLGhu+P}Ngg>hT`a8#U zn(GC!{l-q{&)Rjrv1Xv1oD!C*3t^_z#Ts*OkaB5IIG~@W0}3WD!F@KR;b0ZH^@f7O z1CSy1j3B0l>{%~)!`1ypQcu=&z_<=Y)1-q`G;KX-6;1Aq?t4PhL&8Y`$tL1w%_bs= zC1DWG5H~i`C#FElaTWrP(eb2I`!v!ttHk>Sbb}W)nf`& zDp0iV*vXQLxxFJxivwHpDYPwv+n>!7xc!4XiQBh3f+moG5OIW@xx$ho#`><)XjT&8 zdpSgHGwbvZWB0UDpF%DnL|U{MFbLxld$VwhuHuXAEw7W`lywX4u@lH0wVSop_wb z5H=&^RaOhuJuLq?4yK;N74kZyjnZ0!s*+?gcY(W-`;ah}dMo^yU67{ahU@MhC=J{G z5QKY&i(C^U{~QW@lxUwzXcGbv=b{=w;RWN{vOCCFUR~*97<wTru{PEyZH6 z-YvXf`4wZ3?6xz!chOiA&RoIeg9f4&=R6?ts*wbRzMj(m24>F0F>7$y!$+&J_$;MK!KRg7>e>WN-;f9g; zrN_B(EFB@@{`YL5;zHI< z^-K9jN}@}H?lzUdlyxvqi75@P`+X~eoGETDV`!R0NGXw@H^hod^qG~CPL>++!{Y)a z-IH@ADQW7CO5o=!1vgzb^OzMsbj=)kZMCj}zHvg;C}XuO6jojwx~<$tW8)X=w{CG2J=7DaW&OoIoa8$;LS4($w48cti1 zurBU=GUA$OxdpO)r>!`nGVxRQa_x3j`BIst2iG>xF5kn+v?mX=8geZWCMY^ zYQP0AZX7Pg$oIE+!VveaE->~U@+M(frrf$&pHaZ$9AyoxP%fuZmSIJPW*sY{v=$bj zv0I}`yEU3an3?XwF)Enr!}-WA7ue%ZBsBW0COqE0zAGdb8r>9AQ<29(qA!<-OBsDd zvCym^w})7D8Gp`Z)kVkAKC>CdExu$H#P>sqgtF}i#syb$M%!Lczo&jY0Gfd*Y;8z&sK3fezetAp}(Bd zbUgm#nf3_8*T(VCSK+K!won=mFLoeS1Q0ri8A7K{s0P3@R=b!DM`FT%(%6>pU+OYn z#JsSZ$QRu4q5`;#fsp0sqH9Ns z9%?UR?Eu?%LZ?Ae^KdrE_EPM0p$Kwa+G?Qy@?;&3FOy;G*;)%-)t4HDv-NE+#jetY zuEd%I>9i{xUjsTmN1-CYUkrrmIUj%e)>dOcLf2FSB`Jv2b4vA81I>RX$6Sg8M99R4 zEfN%LW7{ta!)ii@MO%lnO>8g4VI>P)YMatl$<{ub(mquomI2doR?ykmA_ zudQW$u-@h|desZBGU?Tec(sgPb;YZh^r|CX-KB1+ZSg7@iK(@$C0QZ@dg+T-g2$^TUgcxruhudxUI{+JE_n5jwsXX* z1lqL&Ug5!ETwPA^8zz~lv+8oh!uz-`7pggSQQ4$gwf5D>7yL!&T#xJM&=(6qfPQA8 z4p!9T>L>{|a;ky*(T%nJevKE(BWiUdYnOvHgk9$VF$0kK>FRUN`1ww3eQjfX7+9Zc zKvGege3F9IGbLMEqC>jQMaJ%;mQP(Z+z_9w&$UE1;;@JZUJ%@XbHPsbp#Me>zL!w% zD4_wDLG)!>4Dw2nw`@5U>}r-?SB^Q7A?GD57Zk8r?F3ynV{t`15>=(w0sdOH#!Uhb zBm6HaA>vjNsVUIqZc?kHeFxRf3Rdv`AYRc4S*2?_x)&yqsN2Z1SkrNav~4X~m27vm z3vtcUi7zx$ltg@?3%=Vxe4&}|H%x?qO}IGp!)9C7XY2|brG$Dhv{ooq_~{9gnwHhZ zt_afO5wWk!9dU$$YecH(8qxOD26BK_g*c%V-ZU_GQ8GD`tN0+H&1AMN8Fe zmYhwyD=3}WZMjCc)w#Fl-$r|bctl6fh%{nj4VL_c$c|hm)x)(qJd+y$-*iN` zt8YQui3?=*LyJz_=V(#Q=)^TpY%*8V{tWq@aJk9Ay)&o77f~vOH)Oo%?E>rn>|Y%s zhK<79x)+@sV8V$=C4AVK>*9T2SsfN@-sqHUCKHXBjB5ls<2~%}%(au@e}^vI0(#a} z19E)-@PLdi+!0&?)4OtkvIEOtZC7rd$6}dqR3(}xb?(}OhCVFUNw5;?AghVS1J>?- zQ3Dw-aBI-&Jh&S-6|K&vyK(EtSzr)EyEgWK)EBux#B^Oq+oAGsaun(sYta|_Mcjd} z0;W3`s9JVO%QA?D;OiTuuvqQyNUC^UWVx2vkF#r=UVF09oR<2 zgodM7h#2P|(cc&%H_Guq@^oWH4W2!?!AK6{dmu9Lz^n(?4gX!jf35pk1u>SN6eo$) z8yD&_+s!SRIq_lRYFvt`NnOStKI_SOU`KO%a{d9I_?HmQjw}_|* zgeN#ZMRGN58A;^GUvn-#^rRU{x=vX_&up~xkOouc3){Zo5Iy{aw;H(;<)z5#LvD=n zhmmh_hcaZgm4t^;@$;LX!oa8&$YBJrEm%m zhVc79^g9XW1IHItDvf;)*!l@yg{zd>8=-4R?e9>v6uJ zjvU3T7{#G$rs1biToO4q4jY3C#y5~VhI8meRh1ac&W|NgC9iqQ-FQ zl;5w_VO&8rmg|jE)^{vN^0+P>%e8kE1Q}6tQI5gMv0NS9Th=X$O{AhyN*NkyhGHwR zz|q%)aavXWcRIEKa_XhyxVrT}M_9!TjM85x7wzdv zHk4@XXh)v5-ko*8#+Sz-u-}4uJf~C55}$>Rr_TnA=R)KkqdP+APm{c%>leM0uxv@8 zBL%fJMBg9b2?z2&#EjMBxp$CthfbjQN|?ZrqpNn1)t2{w>T1Wr<}?`_PYl9OhRp8zG2oR&WYYHisL%T=Bok! z>)~D;H=bEwcxMWymC0j&ZU{v|>qvTKVnC<&rUffT!e`UCDsnm#Dx^a698(|!%;&lg zG(@j_5r46wI-)6G*~yG4lFVQynyXma{p~TT<0R=ovy}?>^oWi+@102g2k|J%-iq+p ze}NqyV{Lc@=A`9A_+dFmLUgN6=P3i1l^dt}v8=U>Y|U{a%#6xw1jCX!DO>J8ibxu? z(|Wn;QbtDRU&ECUS19zYK44R15kWrhkoc4^^P(WARoMD73~DPYfvGYT{!W zJQ@`PBzQD)!pR!Y^+2401erQQ>^GbXwut`*nLbwL{f5h+Kgk6E#sio0&n&G zQ;8+%iDSXzbg@fUhP>{JaL`|J|isPGf{j&9x}G_ClMrTnkhp z-dl?snGD#o76o4hTwIIWufc|dbzC0@+&!Mk;Eu_D+zf_H+;@Kg=Q2^b>I(<5sK~4d zwa4D9jg{zK5D_TyqnaH3H^@ipt+u}V9!=#^Ji#K5qJ$g`;Kd@cz8jj zjevFEaW$L|o9R9t<-Z>EgXCT{O6=uTtYA5&9Wvi@9ZIBUd+B?w8504Yea{784N^Jo z4jDg{7oJk5B!<*sCMG$K!t89DxFXrHP0(~R+8g8${%1{Z*fOi%mk3Oeb8BjyDR7$? zv?yelQcm(ZX8b^uC|EwbABk@%`T?=<6kkV=d*GXr`BpIF3=@9hl-Pql&)FMv1 zm2}wHeXJ8MzF#3cu;2~Y(c_E)g0qnZY!C--W>ionLVq(iL@^Q9M|H@VHrd0Ko_^_Ewd9cpBp$|1#yK-rn^^=h3pZPK z6}@8~-1miVE%e!53tAW^!aWPO95Ld)A2TAR=b_>{9kTPd1G0Pr%sGO};TQ1z5y~Q# z9HoQXd=yP%194&JgsOaiZx%r+q%g-yui<0mtYL^=jpZ-qDIHW0aGX0V+jI+uU*uk^jRw7XmP_ejrZufl*UTu0`rA>j%)TE@r?e_Z1XWTaxm06MD^a~+O@3NV`A_wWtw zH8kOeZ3tm}6=YyKFgZDSIjGq4aWMEM*SO~QGV6(_kPret7sM5@8K>RkK1QKl2X2Lt z2+3PqPXt>$%aneOo?()oL($c*!%%NncZ;im(&v|3+#tuDDRs1m7`8q{vu@~UH9Ara zJqo!%r`=mj)wEM(cud*nHB|s46mm*jXbmBHd2=7g#5>0?Q|Xt%z@9z$rlCd==Sl1V z1qahfX@;CmzTF{eGrEJWxXryHpSr0bWcHp->Ws#{?&Fj4XG~MZ37XvDw3;~wlr#uP zg<9;i1Mu=4?iIArueiev$07c8hb;4y!h->rjH2mXvLQ@KI}pNPOvhbrgu{6Tt5>Go z;a&x|FV;FDs>R~RVtg!~BT=6OOv{VMEUW8!EJ~TJf-(2F`sf#|7N|pkQNVl)S*8W} zdt7tP%0l7Dsxc~XD+)pT8~2LCR}6;A;;(qZ&Bd4WpxdnpaH5V0v|ktf7i53$ivDkC zW3Kh_+#qlP9gTMT9c?ND!F@nKWKF+wLLyyvNLzRg*HTMg2S|Bmu?E6ic{gvtTrXo6 z#wpn>21{1e!f1=vpwWG7TIyFeBG86{UZDWF&c@WD@( z-%MAC1d1dvT>)7Eb6S8@QkRe^*3l)K^Cy(h4NXaTN&N?9zP8%ZivoCh#-;xvm7ehZ zHG`b+h3=d}PWZxiPMHX)K75wIj@v6JCq{=Lz8>;m8hp(KA&Y&XFkt{{{`pM;!PlR!gPcMI`s^ltkdog-0Ym+Hk{JI(f4&v74jMY} zJ<#Y<i1 zvqBPlz}VBz2|Cr{V`b~VhaI(eFBqWW2guGdP;~nSX3tjhFF;Ifo-C7EMeT?#9Qy7g z4+z%t^&nq({*EIbgDDkLCmlq-MB3Lj*2VTIY(i7US5B7n*#MrLN2EFNpJKyhI-bl0 zsx7_>e2aBxBc1p*5T>WUGFZ=d6jym5{G{i#Wi0hZAPeN{Bligoq+QJlm;k>0xE_bY_&9g%$`*X5fuz*SybV0E@tPMvOWmCM;nGwCYFVFW~E!>sd3Zc4$S4Z3f==)~v-?!1aVDPhtt&mn4P4 zp+-C@FCTU>sZ`dp$kmHGA^B7X(;Jyx)DMa;e(2*ZtbTTB5;-@Byp$A*|Dv6+lxEoJ zWX$2}jXyX6__@~tuoG`!hGqu9yctO(&t9hY;^=>qIjr?Z<}m#qU=Fe05#}(e@_eB| zUsfSdvnb=yc<8;!5)n%hT|Xy;2|c zJmkjBO7f6A;rnOjAsB;Rk0(a)|5upEyvbK;g4QL?L7s)2Ba2OK1FchvptP{AmF3^ zF7SFUUT+oqlkr+X#XhlBy^P6?M|*?fB@~M5oAH@Ay%|${F@f#FW1v6NiX?*g>m~kc z`LXXBLgZWVI{0&1V?Q|6n{NV(oAZ5{^C^jSo1i{F?q!}Nm$>oKTwev*oj3?bWC4A7 zRH6G2shyH_yFTjrh8Fw?T*dSHPz>JcL#48#tu;9%>eHA12%ChrqD`_|(IzgoCP7Zr zM_8vots$l#-$~R2YQf2Vyq8TAAWnFw^#9e5f0Zcx8ql}oUv(1pmE_BpUyKp-0eX~2 z#_1$%Dap$;rqBcGgz{!HXU#6Ph<+lo0SzQ_ zz;{BmWcaH*QA^xA@*Su~a=98iXLl{!sJsSmbmSY?8Aqe_m>#a;Zc-&y4krd{qNd1D z<)7RCj!!KT&R8r6U&RV;xYSH~%G&=GssDPN_{O+d5&di(tXm4|XN$@P!x9w+`$uIX z2;vq{Wg{hSR72eP5rZ8)N{l@q}Fi|(3!8Hnpz+XlI_fsNTHPQ z(bf(c3W}8L`8Tw{cj8^VgT+dunni57ayw2C71N~FznwXxU3su-c2H`+2hyx8DLeE zRIE8m)0Y<8K8a5Jae2u>f?g8_B%Ldyyz;f5Rnf_sGM6YiG?{BL9j9cvQuI=&x5gQp z7Ho~fSg+v44w|2?I$({WHq{h3H=C}4zGg~GIP>QQ!mQG&Z^TkbvRU1r%R~Br@z~f5 z+z#(o!(T&rqS2++UsFoq$r&=cRZ@4VZnIIA8ldZw(p3Gsr1ykB+7K+>Q!a+Cnt>4E zxsm*0<|Fj3oB%})){xy#^bPcHEXAw50DAJFsEGV+hP4kzUM8>A|2^*IWzW4D+d8X4=0%4YLVJFWc$dy?hG>r=`N4B@h@QU_R>ndAT~fQY^G8!>F%DJ~jW56Si|!`rx> zQ-}InHkSHo>PGUFML58USm5CR6C=>*Acxcl{#7}@9?h@2el{VaG_mJ*q5hr=!jBUsl7g?hr7JSHhvu$TAb^hP4CT6uuSc zX7C~K!e~A~K2zNm66=SxUkhBNYAOgqT=w13;uKXD5Kqus`% z*~`{X3y2zW)EzQE;O9WM324T$HZU-LI66pp^XQA<7R|fii-2f;NQpkje!#b|jd&#N zeV^B1!-x<0f#OeKgFD5Z7%qIs8<^tV7`#5=x8XAaoPqh2?`OT9{24!h!OwF)M?JVW z!Ww;xzkFsbuYv2|@DVV)<X@U0;6W_^LW%yBU)n)t5XXiO>sZG&Xe$3Y8C&Kw0&KC#jG4~gk?mq2A_M6$ zVFuq)Lxz6p8mxDoovyq4a_~K_dNzVp&?IcAFn$IkLp3;NnYvl$XouSPEP*f81ZdAIKflOA=lM? z91sTCBX0$5qp-E_S6dsk+15>UAC1t)jka;KwfW3UIS|D~k-5xu1h|f>8@{&iuMm1V zc?_{u;|QLHQM@#OAx9{8r8q*=DV($vcVtPCXBrL#7xn*w*-Mq~~rgcW7QfD2hx7_e1ML}ml{`D8IvSV0s}K$aCE!HR-G`O*;P*j*zE zr0=YY3xT(O*Wi@xJq)$GM$o12tV;}mwtjbCdJm0H)3yjmBPSUd7NrLSy$LKm&3BRD z7nKmh+h_PLxO9k4;R{=SwXLs|6&He->V_KU_$4xNm7Tx9FT-m?+-3eT(OcuL^6SJ` zL$2`)$)m#S|D^>9UOihzOd1&8A&L-Hsnwe&WQt7OVAz)eu zu*|O2Li<*7Hr?)3s_m7c_y9K9HCk`qNX};4z53Di%E38?;@LWYLw2op+qJ?eIA-^X zx4n`VAHaFLM)~%QUs*l5mI z4Q$jj^(#oZgIkfgkbQ@5DcdB2)OQB@fa_hPc1%3w6XJux%6xG3-%}mgA`QC&G{|FK z!$?F0^dBAXr&iL4c53ilahGQ`VmnBt?cl~;^hJ0jr3iDu`#@}>Mgh(4@pWBDt3NdC z%s()s77{myVRq1ad=15}HFEUG?fg@3A7`>Fo@-FykG-DcJ&z`QGTq}Z<7Tspx3DSq zd6HMVf-Nkpcpx6dl2RCVq@91cTUdx_m1Ya|!2Awa$|p!EWOjhGzDdE%Uy!(czOV2o z91=fHAV%7vd5isI$(x~Q%U2y$7+a3;55lyDX(Z8hQJXY!782TVU8v^j7Iapv)}b14 zPr0}SnA+oI?gkuAzFp-1SVbEeOj1u%>;O~+uN3ykS4 zbPw$%Gf_XTH|3@|IH0R?Q&aRn@pCZgFkDZGc^E^Ntnq+w2h)1l z3wAo0T4QRo2TmrE2e6~s)RQ?3Q`II?h};vR^Buf^Q=5qYl#=xVwqH#TxUDudq4XH% z%5Iu17zmp}o#5BOv zuj)Qn&tPlYd_i~@({jYhcvsUn^wH5lWSAHFA-bA~CEQ(OdJo@C(wJuBKPNX6CY6IU zH&ZxCH&>T24Z~ zjU(JmB%*kg@b9wluW@zyFsizV_|<%e|FFMi5c$db_#+;sx_B1~aa|_)7ZGK^aeg~v6JglWuHDAZ0^ z;_M`(Mk0wIDjIWPi7^ZJbj<%)Wgh!6V}wivr3i{hgzqhBn4y6t65;#L6%Mi=9;Ja& z5eO9^6>8Qu*|JGMn0Q0@q2X|S(|V;QRur1VqFv2&W4)aVZ1zoV%G7*6B{!^37+dSo!@ zLQMzcgVFUaXWC*!N4!g^(NN=puN*i1!p>$K0t&I=xl1_ zzJhTIykhzRIgx&ViA+V-t|K})GtA@)Z;VGT^5yT%LG#|E z1V_0{E3zhWZlbP@_62^E$pPLSZh8S)zG@0W+z)=$^a?VofC%Jg`(HJU#7Cj8p~ja1 z+g~#^V{+lvYo?mArFw||%%p=R15I9)nU8)D+xu8k`0YWDiP9`&5q|aKV(Xg7dOvgw zEcwc0)1Rw^X$kQ$DQskYrVhGFnn(yFhD?Wo$f2GbqehF;P|h^`O;J)TP5%&1y-6`n z0yXV0PKs<$-Y@VYD2Ct>h{&^7P2TY9a8pMC!6eU2*F=2ua|AM>3}_l@8sM~4uXlCU zDRr)(8Hg();Da!`}*8)f*(FNldVhT z(cE5rMPfEtqo~>dR0a$hP52DN6();pramT&KqYiEH2Va19wdg$0YY`7J>cpX6RB+S z>U)%aQ>L2Q!0Go)eFggUHoP#_G=uRf+-|HkCK$8Rxac%G*ZB+47bA8DoE~Qis~i>Y z9$!k}rv7W#tpk64KtFSyyWCX+}aEYQ=LTSG#re6ed z)xjwbM@LMcMwOOP0>OGi_LnAg3979LAuj0}c(a$u7lNjm>LbScOtlg*;StDxy$$WB znc{8OJu@9O%5p_tKfPK7Z_co%R3;^K9&Qgs&G4V(w1f>rRvw$%;{|Lo^Vg$&mZU6@ zkU3$lDI1Y#&t(g*m`ZZl>_8_U$Y^HrftXKB3OJRXOL3`&W(lS?R_dLcU}d_s;8=o{ zW>;Vu=QD|>F8D8CK1x3eyf~lUO%?9e%s181uJqC?bjn6@N1cLYqO}&tpO1Ut%Bg~{ z!PW())e?Q1E+RKhvQ9(XqAFI<#aPhr-;M>k-Mr{v^WeCC(E;?YA0#;iD@o)vmqiZCkOH2m|g5yqyrQTT7?G(b+=ISzv{e;b?1e_54 z52k7Qn~FysXpIkGw0Nas$fb;45*vMhTzeCStw3$^Cahgy>g;z@(H42O3ilcgV*-_9 zbPhTt;o{heNiq4@y>=NB$c(}69K_e5DJFF0c;ZH?1VeH&ec+xlepG#QLk>u_*BL2q zDqQrhOy1)-xoz?u#mS#;^3>-`@O|N4T33PJ(tTAKQz-3RF|}WVH+>;uI4-I8mf_+$ zc|6w_xD&Y^a4+2yB+YHJH8{6>0q52SrmjIfW-#1eW18V?QDXS3D+zzKz^t{nowa~z zt*LEai?W?um`cYnfod|9>M@Pv)wI%cZ8^_T@OLRJf;eT9wQ4mTg($m33K?OL1A=5|-sHVOicPXIWyXJXw~~>*CAu7F6}J zJht#(S(eW>g})Y`LeT7>Jl23YZh{y?$86IXh34{1;gE*do6g$Xn@&nXgz3|39y15n z@u9@ZLn(IkK8a#6K{cgVF*P+kb;uM>9q6Otrw&s~oI0d!npbA@E%wURo*SeTd(}V2 zklsuvIvM6GJPHT>ukqw8BPTiCPlmllw^`ka#`KZgzoyOe=!T$69tl+_`sI)(6wW@X zar^DI#OLnbrhE=df{wAE-}fR@LMZ6Ao17uygo$JkD*EDQd%tp$2^g|2nTSwJJASCW zxto?VPm_x$?Yp^{Ll*7)cb$s_jABT`7_ zSnIz_s%IoprM87PFAE5#yRs9PO$W->dW)_f^@4s^P0q4oSh3q?z4_#-iInL^b7l zZAP1xptVvB{kw57Reg8C(jbiSfNCFcfp$L`N_76>J zWgIcLDj_ZRx`!hw#dxlK5aVCRqpH?aa~2)SAiVCJaEKVB&_I{Yqf~I^p(z7VT;=)e zo`fEnc`cxcQ4LMM${_(n6-+R6VRCI}HtKvEdjfaA+~bGX!9Tl0(I2_u)SYYy-O$yQ6`$VqH@cq&ZD42THnN z=ama4=D(p}iq(uLnDYcMg(^nHz{Kn|Pw*ysHX^3$^@y}yqnp{U*Lf18Kh7(gdg*$d zTP~znCW%5S7D%Fyo)p)sP#LKhsF(l28Kt1+NuW|Yx^PeT-jqe1ohyNSY;M^g(*;{T z$Xi8_#TrZ$1VC1|tfNYMT`r|fy93wL%|z*eb@eI{VT=WZ({Voelw3D&c-C0LKmE*n<5 zV#|cJDy8c)fl8^Em*zEVxE&*owSy72aOG>lv&x#!suZfv4kIVQNH@&eMoO|(lR8V9 z%;fR_rOWiIvLLNWx%y0yhEA~49#SUQL74rO1mTZgl|7YoY0fMQz$z7|&jcZ%SLpkR z02vjfhf6NZnG&SOW|j>pU6^G;T9s1t*#QlSu>&v%{Y3E6+mQ$kc+?ij(i;|)$`=qp8N0b{=e2M}~EQcjuP$ApCKLm5To9 zt?}v2GTYYp2(k85c56%--@y`0;l^x=?+WpIuVVaSlT!HID&iN?mgV*Z-(9)6e;>z~ z^26k69&a_@+gl&1RBNDm{gJbYy;q4e69| zoH?1hj^I1Ge?xSp=-S8;b7_{%KS~&l1GctNL;cgacK)u^(_vbW$qWx#-|hi>M@U*S}u00 zQh9qe?CN_Q=m6ul3-p}$+flpSWJP=$Yezi+v)`1)>=r9#pOr(W%|~N!`Pi*Wh4I<2 zOU2+`iFTQTRR6D#G5=Mu1jHt#81r{kz?g+I!7s}t-6~a9pB=j}=_pky7UkTqBVEBY zwbGoKs|07}%Hqs%5P7o7IWyfTOeuE)s#1r3cKoY%OVpiq-fnk$c8c9bVagLW3gtsu zb*3l+r)J?+AvlwmqULM`-H9DfVT#%%fk_3Ba8C^uL<^8Tb_KmI#1pzU&^SZ(w;j;C z@wmSWmhl_X3VQb#;sG!Jm76b{c^yn=2h?)zj+N`!nb)c9Km2iSZSVYRxz%2%)<#y1 zy==QGyas76yZW_%Bs{5BjXjT7Y_$$dH5!}ff|1X*e!^KsNUrN_EiKAkxCX}_qi)h~ z(K55H|BdS^nli8r`fpwoubbiZk?Sh4T(b`E_S){Wc=vr&-<_1}l~ zPdih}@Q1=aTsTgQmB9Qlw(LnI91=pK$_BEkHP^onBZ;=mmiUJL^e%LIayHYGHa%7$ zlmEUDYZCOz9qD@ZvE)^D46=5cOP{e3qe{6jSG7L*Y%uSTU`AePFP4P^MLS^cL+J4` zfTgSUuVP*;_FM3(R`8w;-0c#$CV#W-VB9tJFKJRS1f@(ksnzpQxqw!=vh{3`Zj&IT zLQuG;LJ%XIKZJr-=1ko3CXPw0Ez_Qb?^>Hz;Fc@AjrkpQ!WOx99fJuftuoGc*-PWKT1xD&ejO_J)L>=0^1EHPY9!L+IB95%X)P zF8z%DM)>X7?H|x@Hy)KYhlnQo>lwN>Gdn8W&OWpv9`mO>YyeyOnrjOO|9;T5_mOaT zv7dQ4%J`!3RPwt|Fef-BJZwM;i#tKY;!EDL+^vu^!R#wLuod2HZ|=)XU*ta90}`gq z34(|yGYLf2eH!Zx@($+Cs`I~TS%vlu=+(g-j;RV9fZb6K>&164k3izc)Yl`Kv9~w$ zs|lI!n`=Q~wAqoSKDq43e!Yrf1}V!C()NaXf%X-1E!j>6+S;C$l#ORW9pf)+t`cU(rBf zsG8OgjJ#A2%lr22Z2kuvlh{GOgu)xFxeH>6`qm{hTI>XKA0H(CR~5x zYG~cfJh^N#I~Ir8YW_BvS--9nnL+kD=EaJH^*-8lFzj7(Z5dYCPMkeCNGVh_hV*yM z!5!aWWr89o`Ox>M02Fzd*F zmyt-heStqY+zTd*G&hhLWYBE;U*3>0(%eldTZK8<#UTh~t4LCK%_wsl#jgex0@!<$ zxt>e%;vgO4E~|z=<_vn5npjF|l-b8&6@&F|a-1+(ezu!KN6@}g)0bfllX{s$6mC=P z7U9D`E4K(Y{rT@N!re0|-BiIMlzRHRi?B*n`e#~)KTGQ{ZE8v>ZvV|7a~&l)|4{~D zsheREv;X}8)&<5@sPD*nL6hOgD#t;l@wzvL-r?4jFnz+(LSJ?hn119(o(e4gjh0~c zb~vVUO6Z{gohhmY^f|LuZ5095K101ndSMO*njZ?g!PNZDs|8^|`i#3bmG&9;wfaTi zJF*(XoCtF(2i%v%N0{pv+Ko0(ad1ojQ<4m+l_bhzfBgGI`TdtwB^jii{w`5g<)-BC z(xiUD4tu|gf}IELNYe1nmKophxmA=^#?$&oY2gq(6I><5z>R=_xFD9EuD{sotw_28Bx>kqrN{TV}QjErXlmJOb zJRl;*>?k;2V{m%Q;hr!h25l3Ap)kh$2d0!FKH1UUe!g(_mz6bOX=IMN`l9a?>_tqa z66a4dt;z9(CTq^hTF^nCqgLb|^2XFvpWkZY=ftopk10uhG|)BcgDif%i^8`=Jq}E{ zMdTFbL8b>e*@Y*|Kghv|xPFj%&QS%!A8Ir(a*CN$p{R2IZ(6TjoTO68nkw-3R{v09 zx=u|Ori<#dZ_F@vC5P!tXPU`j`resla+n_Sm05=&>S14@@`RBQUzy)WxA-p6N4i7u zEOQ5X{uP#J*1>_PE1ls+^pPM#-Pz{)q@TWX%$NWT;^vr#Vi}y%bIeWf%UVN^_<-|= zN18%-Jes8jLwvlMING0$H)DLfA#$!6&&^~|`02Z`PPGow5@;`6 zf_XBw?w4qOS%!Q$>z8+ZV97#rptl#9E@ZtVKi+yrHYwAE&;VRnU=C26E|B5WyDl`> zP~|6AM+?>K5VFu*Dr=copb_Uh0(->X6Zw_2_h6cJZ?o7dJo2pRINSGxqES_{YEDI+ckJ*}QyJjqdF#>%0vD9L;mi89eH$FaHON z>WXB`W*un-vCGUPz1R~dmRW9=oc1RymnaoNR#8np^hSKX3=Jw&85LcYnHsb(CCv<2 z++~?o$b5+Io)0DqnE^?KO!xS2D-)v^nmfO|7`><|G)6DZbGa0wmnxe}V)P;lX&4_? z#H^XrV7Y_aPjL!r*i|Bdejld*y?ky5Z06o%E~%%WuerP#%-&3~l3EmRAE4(*0`%Oo z%_KmtpvJuRF!^f%8_~m82dg*HMNKyiai1l8Pz*b0f1%hBJ)J3b%Jg)m*ddj!tvnuk(L&eRuc!-N8}QZ(l*WiBy(kl9m<+1~K!vl(^@3d{|uZRS_O zM$`0Ha~txb?!U`xY7{~$J61F!CH`s-j(LYw+A5D?R@Vy6NGdxs605R(N-RA1EipS` zqUHv&QF^Q0$&r3QUg)a1Gu4P4MEFYKuXE7D#{5Dj=yuK=C_DW%j67#vhzFyG=Y`!v%9~ymL=UY^P-W;qnEuJMFqUWIa}U0N4991$bXHdusB< zG$y28?x8qnd(o^Xh#hiKK;soCnOz8$f4gLErxGo0(E74DxUOy52I(<>H9J){ z#x{L|woMF*FzvFr8M6s~xQsi3DRBO>xv}%6VguYkJ&Z>JEdRC?#0K>219ykM1uA2KO z$X7uSn%vP7n&dxFf%7%o-SoxSa5KpzJ^7m1pZNe5Uo!_dBr|LSC^+2?r|p`#o^mcZ zLum+E{(pFb`*m|4Y(4C{*}ryQwox%WVlJe{!mdTzmu(Eu>{4%7f8G2JE>!m$Xba!> zi=puib9))3i)N73MB`zYe9Jt6!47X0n)~Cw&PC?F^090SNX&QefsZek{a|~M*%1k= zCB&XB^n%kx=C*j(3UXo}Vz$WJ<|aym42RbmiY{XA@b_<XT#anKaSWZTW_n1gd8Q|1f817sWbNh$+6#qR*xSHDjP_J3`A_I-mFD~# zOK^VSUgG>VDGDe>eGI*ipbT)0wUYrTNzYou&tz3JpMP> zcV!U>Z#K0PYpW?Xi(!viYN8A)LkJ2V-jPsv_f9bsK6mgtK@Zt?&P=>zk zEK!WCKbsQj>xteYx$P~l;O?_-2g{Gl8*sXVg(NZZ=}7gpv<-}h;p2{$L!^XHx6YQ2 z@!y2*mIlratc-4*6u28R86!QCx>!ENcb|1ZCW6J7U#*2De!5s<@X-rhElaV)jZ!F4 zbEm82ReacswQR#5Q@%idtji1Z$J~w49Lcj>w+c!C{iEq9L+33a<`6c@66$7|dr-*l zM+%zob0IFu(jMQ14zduBg6N{eQb${9Z>E!@E%&XK_UcsV(gb=;}GaN2-JmN+7~LRbomJ$g^eHd`=LOA|WIz+Csw| zC?XQ#B);*Sa!>bhd7+^Fgq}fGAW4AxMBo}ZYqCo%l4eUJR6O4-^l311CRV^mK}u<% zVow~;HyeEljHs7MOT~RgIZNgFW};7l4G4+1le0@HYHV!O*#%Ebbxdp7R2d8UgO)_p z<)~Kre6!T2K#zKfL@bdD$|08LnXhIiSBkI3EViSP#l@)v{$q@_awt(JOO!!X5aHgo zcHlq8Tq}naFn(i4C{Th>>{0R`;INfLi8`qSp$PY76Uu*pu~rT%Q2RT9P_mj{DygX% z(17dBKx*SWB^W2OD5-YOGdHFMcoVi*h?n$} zRbA>O%}h;e1hHE!G-jQu`@})OfNplZ<(l*&30-rY$=403Fzaw6}>$f=x?#O!tMTf^I+e8i%D~+P{QNxLMz!t|6sXo)rS59 zs`JyJaK41Xw8GH#3nq42ok-hqn==f* zjdhCg>#0{|3dXoQ+_&=Itu_$Ktdj45r zB_{y-d*(?+qGpxgg!bF`=a>^#5*O;PBw~#7&y$W;o;$PG6B%D6u>mV^VPRcJpnB`f z;*?>)$RtO(p!3JtEw=mDt&7cm+w`21PAE{VRQqXO#k=+P>KPId6|G8c1e!*9(yl$D zL!KVK8=oge$f+9V70EQKu1nl%nGJ!@=l;Dy%6mFwPM45L$PgO05@?d@uuHZavKcr2 zhb3mBP|P)}T^>3?mD1uXsMZR9wYOV^(~7S`u*bmvu*iBQ45+6TrvdR^QW5Nt@W04u z{xm*J(sdESb3 z`6Ra&F_#z$`sPK;HT$kf3^n_jRU%P_njbD@1y#Z;Rfsq%)Rr|`+57I`b~*hKQFARl8A@vkrJhX?kzhJwfrrK-2Ufz zQzgMwKSnT$$mfSFo5DRF2X0 zy19AVs6K2+{VWfUva+v8T<6CtR<7edInQ5bACyEOen zh?$x<7tJZ|-LB@#kbOqRYzR_{X@5+elY*IfkTZLZufI^>)EcBDv*n;iQRlw-a*$HY zqvRgDA()u~rWVV6{e?VA*31mjCy408Pp1Y6DPgcQZVmjEXkcWEeEfwhF|3mi3MGAl z)Es$dMv&6#wB3ATFie*%^7E$;!daJ+ALRd#lIB~V2~y_&Ky&bi&ddvD&VVUygReh* z6wbPp{D$O}98jk==uT}^D#fDAOy|))puM!wgNcX#kG<~>i0Wz{96u*YU)D5Zt)B zS?zP!B-G}V;Op5YSI8~SC;4WTCHc`1HH$7fJI>0F^gcJom2L|t)pC+Ds&K}pX0Uu# zzB|5Ky!YD>NaZ#+g<`xxR_%F#i=!0x99)#C&f1GX8LUYK$jLncr0oaSY=M1sn1? z%!6UoS~6?)7Hbkn6w4lP^1J*ln85?{pWvxcFU)mJGNEAhKTjd81s>n@gpSe2!W1&r zi`-I9Wnf#()psCsV}5NY{tE*OCNIxdGRz_UJY9ZEcgSW8YET9mSZJSx`v6ni4RMgO zCjSonR>N>m-+xQ~cnOT%li!~>$}JOv;LKRLAN;c?KM7c+AzXiBTmF|GusPUpMBim^ z{ykS$SC`r@&~bnMLW#s>@#_XZ2-6rmFbiWtjiHVALY+{tAqY*g**Z*{m|qv-f6Mp5 zbexd*TYiFfy6A-^))(9k>OLSA|w zf2AwCL-hJqYm0laMbc&Nf&5zD`$aG8w!RR0Q0P(y>fZxME4iYVvaK)u$NG|7ml);2 z1bXwLcTUlFULat*!>+o9C{H2TGkW%w``m!}VH4JWsXx>myy{^p!ZF!sdf@n8*~Ck5 zPGfJT+UGRQi8*9W%W8Hl$c+?$*Fwg(Q7Q)Ki2Nn?S*+w{Y82?+SXoP$*0iu~>fB(` z;DFr5o`UWtN1=)_7vJvWhE&B%P{nH+=Y)a!Xlgx}*U&&zv~ONbKh(~gw@BYJRNrg* z9%%su0XfLYx|CnQ`E#c<&IizuB4)>bk z4~JB0?{A8-UJEuv&73HF?W0D9=BV+LgK~(*&j`wypl{dM@ERk-Y}itiHFa)&7|fgN zBa@P>oLib0NRH5;rUtbwM{DwXM^rE+H-9|l_B_&*;W z%-y-Hnc)EAMO(FIU~&g0V@epzi7}AMe3&*g7z$42cM)=j)`pPgcz*)aYi_{QpRl^Q zVHOO|&o99QopFYImS#`h<;L#aB4qqbe8CV=pJx2D*#{`jf~=CHqOoL)hb3u1-7yWQ z=5TtTs|#DYc`=vY9kY){v^3DnrCdJAIabM0T8o%NT5Q< zk3>^Cm$WhnQ0#L+5!>1jVNKzAqe0gIoZ7KhlE)K!#bF7CWK}Jap&l|?8=4>{CCf`| zIj8L;S!MNO%=tA)Za#6|&Q({O4m+M|XRv!ZpUwc*OvoU~E7Ly7dj zUM2H*mJG~mrzoMEM^}W@_8(bjHD&*6y1wG&u#f+rGbkY7NkhGYego+e@)f@_ZLMX&Z?Sedb12ub^N0WOr`JmXTDM9dKisU(44rU0`;jIpMbh# zjoh0~FLGKiPL1orZ8xy=Ym}>@quYhwU6o(JXjel>?=PgdY*1qYV72=Qj4;3jpeN&j z*4UnvQf0Yk?!vQ6v)#%+^Aw&L$aiqY)ez`*hyMJ>)e!BKeJ=-_j>F7y+wbK-Yd1q3 z^-x>YIn*^Y@gF|qx8zx0%igje?nVG6+!k^SxG3L&lDXbwPAu92tbBJAe3~AvlwbW; z!>TYpUUW3(+xC$es*?l9dpTj3LnW0 z#Kvd;{?HGW%MBC6_V!^wd)uN9E6smfUdHIwqtTt>3TuN5dof4BwqvGO&;;0A%aDp~ zr7h^Bf+6FtxWSn3Ons@%4QO-E)o<}K{H4&N;oV>MC`S>;02Q-4b*I&7ip;Fos{k{<^QsN zdNb1CiG_bkBMmKxc^y+5-s_z3|jTG=)LOChmaMPIC=UvxpxQ|bzD{an}3 zirJ?xu4`b3-SfZ4GKXUw44taO62I(FLevr$uKzEz#Pw*2Ph`Ya_>VI7%I5!ZD}0Xw zit4e#0j=;fNb6=8&Gf{THNXe2zdE6eQGV+3b2G{bCz70^RWZUZIgD^-{>Dbov7^Be zc#>0CWM4r%;ikhQmJTbg+B}yGn{m|@a3xEY4p=Fx66HnU_s#}KfYC(?Jrxle+_C)S zXSn2fI=GL&DuVk$8Mu>PGmP@izHHmZkg}PV;ofV8M$A2(HZl@p{WG;mZbId@_j(_E zel)3SH4(_^CBpKYGnSq{G>WpJv{>3&3cu&dg0PC0XFngd=#m5R3zrDu^+2sPxIF^< zRPFO8a8(CEQQ(j%y6q=iQ!ZsJr^f0h^f9y{6-~DFHIS+*d|&D@i5O#0GY24cj3F8p z_cIJZ$3pHHLjZX8H}sQiVMu|MK$z6uFdQFbCK>|t_xs~Z*vy~-)HRVdz(9(s+!%mn z))ojIXh_Bvmk%_&fmbDXg>_lHA$=hF78U!mJ@n~=3?Ey|s`!HSXKqI zPIq6Ug3+lbYrv!-hKATIR#~YHhw%*p3f5X_1`mJO?G2l6eB%xw@rKseSIh*27J>2< zI!KB)j3JXiNrKf0GQ*9%p5#r7ufz^TCx}pdCH6Bzh{qB1y2z>jBM@R_Q&iOR0vSUM zLA0Jv5M*UXs9@7)2BD^6nxmx}@7UZay1X%Um;i|Q+~7vbtzdi5>m36vi8bOKLoANe zckj@VI{S{{9YiT&A|0v3cj-vwOcci26N*N6^8odGhF(~`aLjuKQtxH-Br6V!9X;=v zWa}9UCm{~Rha=!n7c~8()Q1y38Le#rJlck5)sJqPbHVVF|-f)nfZx!=VPa%a~Igy=KzSln*O zuqY`epohY#eqj)MKETaZG*TPfDH3kJ@Z)$?KU065QQ74}Z-wBzqr{-uF{0?rRt&{)&W>56xJ`Eh z;;td|Salv^-ZTzFLDXb?8SE>1N{$1rIsN51UU*HpVa$A+eO3jJk!n$s3q8D!V#_q%+4^Z#toz7 zkN5k*D=Q39ZiP#++O#f#3&)}(b5|G^xs|Rap_-YEXZb^im4;?aPyMKshG~r3zFZmJ zzrD&(hZzFNY4rmjdbQz0TuLlmZCD9CvJIbIle3|fQvdqa^2<3eHHR$1f#@Xh#&rx(4P|WQ%Zj#+dafGbeSVf^~jCI8wj^9 z$5IcY$Y9}*xDA|tDE?@J1)~W&dRhldG9pUiLheKERbx;{rmmyFuB!^2*_AJ_v1?)G zSHZrbr-WVk0=+iEQ~|qA0Cv400?QC0yJ|gX2ZU3x3tT4rpE^nvtEhCm69eC{%%Ke^7uYi2oI+2r8LYTx5~D&|y}9WxZ;d!kVd zyXw?4)6BH4SoO-1@{hj`3rR+aLM;C4Fld?@U#hfYL1A*hOIK~ewZpfNdd_5DcvtsO zKP~J=2keE-_B4WKy9F-}ousnQlv4)l&Ips#HO4kc;V-92>KbF6r0|C@NnK+eJxSpU z!X$-1oF^&%jI-1)JY$pkn5`RweML`+)Z~rdi=<4CQihA?9(r>ws(NM{ zqM(3Y011!uxI8eg;gFl4%2Y-a{2j(d@{_GQSB4ZV;QfKGtk*%ju}Y7*+m@7VrPvDO5)2gUV){-D1N$v6>J0>yGrH+dleAgOw{3|Djrwk1| z+{8tD(6$LDV51ds!rq&L_o9*(4s#UZk8nNVublq@#ZgK6bv!H3FELuIp`oN#&R8fp zYar3X3D=jKUE8x5KTM;btntG%3aaAxVHy)`~QzWj`j<4UJx|hkaTLaK`UbM#4uIaVsQISuz3k@G7+hZ^XpVE`YrG~ormIk)IJ*PgTmeRPnn^$m_ z_z33YY>vQZbs+xUH{&4lDs>+Jm!U~SISDuXFGD{@>MP68+W3qXFtUV3TUL&Zq3It2 z+tMxGQ;r#v{VyB;S1-f=j9xC8k<|fSzlXl_N^9ej&e~WZT+`K3r8!yuf(Q2oBgdd8 zy>c3EhkcRT8(m9m2d+8(+tx6yi+;sJ!|x1UBnEJ`;H9=)Z8*ws;S%BH`fxLVQ^LbH zxf;+|!nxynzHf0+FhuxW!oD{GisOU4p+Lg@$xMSSL0sd-u3TNF&w|3Druu#<1(;(F5_;AVNt_+cTPiK$^FqQ6pjXQ9(I6y1y~3k z2*&&R%{4eTMgT$U=pJ!Lcge2D;6A{Mt0}<-5cf8)#)pd(qpcww1k!*vP>S$pbD-izOo77D4;b16QL>}f+F=jy;m&(z|+pgpJ) zbDP3X!R5woKnQnJJa(;MRvpd*2V`9%?v;NhUV1opTRKe=30l3E8q_1U$sn@{*Oci) zdTowQl|e{ApTt}r0y*~oHja##g}O#Qf^2~>yAG!i`tM1G@+~@)tg4MxKcX%d%9QCb z_XS&zNe-Gl4%s#hIX~-gQl`bYxaOQ3QW|l!%k@aPBegLnFWaMlBW2XErdIkr0=rkE zx!_0i^-Xg@N)pEAHikxxI4>v&<2>PEbDNadI1@I!#np6O>?QF6&B1`WpgwTB1r*mC zEZ3#;Qalawu!mP|UDBlpJapq7c~h<{s3E~aF~4`>`nzGAzAFp9{nGqkNM|lgf}v!S zJ9Bm1R$7R+c5P>_Cu4v+ojKyjjD4B=g~^A9FLNhx>3*^cm&CZ948?;Og&&5fU_@80 z7w)_4?8<%4Ox4BQk3{pcz;dGp#7%xP3Nl~i{NRTc+^t8_gpN>?mfV|!9g|yeFP0&H z%ht}E*AZL61BY*NL7lmSpIN4fyonVwiQn_TZWjoCMXN?X<5OYhAU72nd4(9$6cdLd2@q)0} zx_hLYY)s%D5DlXoo%@278^Wie3d2ZGC~<4y2OXzz5t5W|A$}Ulz*kfTj{2_&(XX1u zWs;4T_rBm>knCRu-+saUB-=-xqZ>UpBoIb_$@NC=-~T0d4FAoaPJ{p$kM;q&Sl`;r z`!I6`>Z26>w&5JZfU*H3u+06JYpPw{Ls!Jl=~V%_-Ias@75h%mId|5g0<-U;21sVIfnZNhb1{^K8b`5BwYrFx%QW{Ye^@6R&G9n1N93Bkp{0FU+6tm^xh2g<0CH6VXW|8 z4LJKTr}17YdS#*TikCH{*^2J+u?Xin(QE1SH4W*^1MI#2?@ZAvJFKrfw7%j68DkN=qoP;#Tfy_TM)nHh6F&~YGm2iz6<$*cHSeuN zV^|*;bF;fY9398Cl`KgI`FO6g_XW{sycK{^;{_O%0szILSFTtA@O1(pXFLK>DthhK z^2HN4Iy^P)eJYd;JHsAs&9F&2ff~an2)(Hm?|Ic9=1vfRJ2ZjoMu7DH57$%niv+U~ z_yhBCf*(x!5BHK}>Q_)WnN!2*{~#aTfNTHZh%?2F4Ft{oohk_ZjC&gc$;W@jy@>7z ztYhBfmOmW+jO)Vu0?N<1zLMW(2;YD8Ip-<4A%XBNa|5M*6#6wk#rAa*;qkyEuA?2T zJxO#}4kuZgXa)(_@X+f0B(6UK&^MVju_T%M60&b^Cc7;EYr?y+4y*NeWxUcH2}!eY zHmcOgN-gnCQAgF}Ih^3AdfahJm^_!WZ!J~J-g4sXJUq9*mLnMfDi>F)$fFB7`)NGu zwPX9MqmKKE8KWDdtHX515%4YO7NE<-i#V8=&b=-%hUzk3sEv`Tr_;H{$m0^oO6sG6 zhzzb77PRe^!F5GYw0={A++37BSU1@EQ=uPZXK*TJ6_osRTm^9#Jvu|g?$+KAy8>5r zst@Mbhom}p+n!)#avdX+_S=d^un9OCB272fc9_cTaV#|H*(F>Yy3)#!S<}2LG$XiggT`g>r>}u&lR&s~Q`HSk?yA@NU zlDig3>#P!m+5Hs99X>Qlks?DmiewugW2W&l*tecL;n;Rc;+(0n-C&~%-F6Z`CS=)e zsA5!tb&H9%L&$>dS4fs?e3iDCB-kb;i`O=;H3J|2N@NsDf8|g_bp;I?Fo6)ij~k29 z3F;7UKV9myI!q*Z?#H!n58aec>);Bn@qVtEM3078(Y*i&yf?1_c>U9moDQeLiU|%- zSmW<{L_ooQTs&HZHTE^{S3vo})*!gW9G!1thi4_HmE?+1KZ&>^$Icb{ticDXE8L)@ zbw)QFnyi4#M#>@#H)zJVyvVpCb6g)nc_^*&i#dyzKWc*(rdE1Ze3Yoez_?D&(F5IcM98vCv>8n$M0Y7g2A5j$+YLb1EEx@y`GfkLs9N^G3} zbdz>v2xOIkin!`X83GB{4g&4SD@UNzJgmimYi5UHJeucBpwe7Bfyi_vdP)d{Psw&X zjEOM*gsZp52N>G7-;qdh9<&oeAN;;T`f&HErWUbHq88m{7$8u`#p7$(a)b*7^NXe~ z`YR^xRr>_?+~lj0mfK2NJ4NWP?DJKWJb4X~)kgGU%IxM$aInJW6F2^Pc z)J70LCbFmv2E?x-_O_#;j<5kICA$dM<~PqZ02e;lcpB&+|fntno% z2}z)+j&Y=Z@s!S&jAN{m?PrAAbsAS84ekLIv%pldU>f|$M_sBk2w}A>)F0jD^^_>_g=w zVbvj2P=E?*JS_4t<~x)Wf5=%NQV-b#g2q{jo)URTJ@h0xN~0jn5P87XD^yWGFR7Y} z!ZxWqpo$u)?-^(uWS56$&SRCFnfE!!MWcg-YlmS~dY~M=j0XTU*JrRQ%$Vmeu2K&= z6Knqg8?kUk3HB8|CB(v~PhworP6)B^`wEG5`Fhoq7q&^~6I5Qm+3EDWq^lC-I=Syf zA=sQcv(kc`RDx6N`P1d{E`P8~c}^UHUQm?~bl+x1nzo&;1*bGK5|5#Cp#0P2zphqb z>EV;;7buXRIkQi!bDaiwHwG>apI1k=nas4kD9oZS4 z>4AhN=VZzpXF3VYL3QOGiiKTQ25;S8PFJSx$GOep7$jWfJ_XIo#)6Qo8&FRYdtm>5 zXN6h1&!#Zbb}tY16+I;ivvgl2X14{xQMdJAcNZvVFGOROVr6Dy^M5_*Htk&1&JQ8P zRAK(-bz>KdM|Zv+=OIHcyQKL*zQqSb2|O&!C5!f zjcx|fHnpsq{ZkIk~BEzrX)~R~Fu)nV{QnqrB zJNxh_DC%o`1GjHG_A}OHmce`dj4#P}6~3*2!s#yuz}|kwF0!L?yx~F7fUy3?c*)-$ zFr~k-ma9d@dO=p<%PQE?9~s^;1azBGIOj`-z#F#Bdd*Ka8;3xFLqK;IaR{u5&fF_E z1T^=f?d-5p7y|tC@k2nj8tK^BhJZwS!@|!u`NG1tjggYl2y2E z-+z4o{5rr`n=$Jz4KTVfxI+@GE6ipv(uEmhY=T=P%?23_0VT$k)_-I3|bdMn?=7b6#V7YD!_LyUgRS{OFOsFvq#@?|BM>TB*0V^h4h2k&|Ow9J>4 z)A#E^)0*=F-~oOhTgzYrxX(CixJuQ4b}nJl*ZZ;_^vwp4xB~N@z7cN>VCKW{cw^J3 zacoo>JTUFGHB*=aBRm+3V8<&|L}pTAJ+}QP0g@sN_0rw_|!>v_@KbjJjd3WR+8} z*;)Ebt+5XiGJCC6ua;&x>(%X9HoZz+8{)@Av2M?*gkoJSDArv>vBr7OCWubOrYp2U zckZp46^do3xkAoZB(8wdq5M9F0qj{pnT; zZ{O=o;i6w`6wYXo9PBH4N(fx^OC<<=oDx`)jQd5|Tr-%RW>I_4ZU~vN{R+vPeyVD7 zC$>q+{P8%W-oDs)Zf0dAX|~frvy2p-$gC8+TE^YwsJ3G_;2!a35HQJTa4h7Db~_Vn z)ovTX=&63uQ$ny+yDLGkN9>HyUI@Lg`3mW^Xk*n@^4KP!7vMheNXShw9+#B(VL*}` zQ+;$*X(0Z~w^T4D=LO8JZhXBqY+W*IUSXnU1IU>9p7h?`ekGs#esn&4{>1L}wEE9!`nr5@i4^Pci2U$xRG{ns3A%S@?XuG2HFTI|0hMuzbF8q}#8$+RCHg zv%uJ0wtrWii!ucg78oa6Z;u&b4umr)%|jt@p;2XfA$p-P3df@O{NzCRc%gAKYCz2* zq5&c8_Jcso!j5r29kVf4=h#KY+GO9i*}{{7uyqlRU=N+nP?rgEBYVEJgbeyk7aRSt zg_jr87T#NoZ4ZIe#l{HPv~&cGf#^9a0^#Ulqr1Cs1MQW(&VxUM^!`#mr>XPVFR3ai zt3NwrweZ&?jlgTBu%x1C6Lyvp)Z(A@7&?Gk0*+h;JDr7;|Jf#_G?#(sDG^e9`XmmV zRiqgrqxgM=GWt_W)pRPhNo5p+21Y{XWyT}=F}sXY@K80dBV;O2KMzD-q~%_V16|b^`-3t++z)R4VjTKx55_)j0b5Bn+2LRlx`q|5$r{$#D?@6- z5D!N-)^o9XIAFq&%e8DZVZ{E89Y0m*-#8<7An{dkAeF2UIgo~|eS`yvBoZf}TFc*1 zXUrVP`dAt$$Eqc?l7Sf7RnHV!lDF5jzQB3% zv8HaMy*mXCNmE}FSyj#wSnUS<)4{Cx-g%&{*X0@eFDrxmC1McFY(T}4-gD-VE6L5YJocLcy@J3K(uS zzQ+vL`Ch?DRZpzZ!%$a%o3a2j6Xpeh++zF^(_ziE7~geE-Gy1GAouv(An@Uh5zL>^ zj5p#zASk>vx*J5}IWU+!c9u85hU`#?-I(W#XAFElGo_*NReiCMq|}D;=|)Jg#X(l8 zu!L*sjiotrpQ#)9DPiC23_En^1Zrzr?;G!@FK4VB{YhWQ8DB+XO^@aiaUS#J2f8Y4 zdD3tSw&qErTce_<#8}($Q^hMP$t{d=BAKUt0QM|8IcN{WQp2VzwA2nTPGA@fu7N08uX?-Ue$Jg3kj`5_|o!XIpePMDh%>??Xo2)*!!N)Y3n}jF0UXV9} zf}{bi@(?WlK^8_#*@sD`OIoIlJBzDcbH%kDL9rJ;1vk{zLlt;f3PXg zd*Qe4tdU_2vn2R+Z#dgq8UWYbT|GU%IPOa-I=isx|G;;_ruxik$oLFTb6ci;;~7|k z6;4bN&)b4?Skjax_mo2f%g{&nauXjyBmH%G=I8xrp9?u+{VA*TL}?3#`qm{mt( zW$^eW$u%H9)YK0Jp=6p)1#FmUIrD}t(GrC<|FBrhr6XkQ5HjN>a0@qqlRP1@sghMI zO>69;^xPI}m6IeG<1a`~iTgUyx<~LPFWpd1kan-vw+%2gwF{Dc@BAp)L>CFty7e|e zq6d#ePl+I{TVDx5D!+H`L3<&Bgw0ndNW0CI6C}5jzKq`#&@%CzF-3Eb9ENloDu=y| zP5&U-N6kaY$!lWji~;BVO-=EPL_e;nNrUv%FKK4N14>eOC&u&!`kj7?G4)_ZLg86t z+n3&IiRB}kBdbc`)#j!yct84!h5`Cj%}s+DSE&oSZjWZg1%vtpQw#j`trtw!oLC3Z zqpTBB*R;jXI?rv%TshWJtanzz)@$3WJKk?iIqq4qM&F^4sj;1V>^p?($X20U!2Qr1+0eVlg)X%mEVu;~gp=lYM8nr7_@hOtdbu01cBHrdJb+`I*qB-c6z zxzb{tgq@ZCHr{V#IcnWnp+C)1zmrnd{d5m7rqvb1#cK>I?=$szqjNY zXY%EKEhgUz(Eczu9Fo2X9|*-Mv#?b76jPXFrjL-nJ~mhCDpArCxG%w-DJCTv=&rbn zz3p9$(+W>A4QKY~5(n19W4Fta(8iEJUXm#twQpLB^ZqbB*+i;$Y37CsdvM?}GL3A( zjWR?8VKIOn5Hl5RmL4#EDz2GULB>?m=Wya0T`4Blo)+vYf}5~V?$=MW^GMMr9E9Ij zs0F?|Uo~}(ZBh;*JCFJyV@+?{IjCCV$HkGiPsd1#RnDrwdQDWivp>AL%|D- zHB$``D>59ToH1#qc$xOh-Rji=e!2sEsw{h?2?U_P&o4E73N1I7x?#Z0zg9nemeG-q z#qyS^62&nTItPN=5>JWfqh}YJ9LK_*n=n)gYWV#dfecyeGan1`vloL(!Kzs17~w)4 z)iZS44fd>XgjZI#UVl2KfXr3G@cK>{a|8ujpSar8%N2^^^56G9wZvAD5Z#MQKofE* z2(yD_c$)vPSv=26@6+OgnQC)T#d;r#w~BP=x0E<^4dM`K$uAX(v_4~-iE;BT1;+^7 zf=7+O^AemYjDX@B2S+9>C`;k7p#0ukU;ol>Q!mE#H;J?cq#ivPrvGuT>7>Mal?dOZ zc6<{G^4m!y9yE#0l^wL}csdvdpm?lVsXv)*S}65Cy4XSS z{fliBrz6lN_xTHSCGn$SBGD&BjK9Rr_|Mok}d~6;@7Hedef(QGMd_^q9ffLIIO)O)rb)U}0{1meCSEPY=6dp@S++ zN`?r0XRD{$r?1C>UMWigHeDA+Jo$iFX*+}b++?6qAS>oO20EiySY$cbmCv4|D+gzq z15T=9glmUg@Jx-hr{W4lsx#=Y{2#l95$1BpS!><`f7~;rL)d!r&x_8OPr|6~=FKqg zb+gBhXUuIG?^}x;vs%$2+pP9XExE@aU4;ovF|Q2f-f}bDNk>bLVs6k6bvFmOdM_1W zxA2kJJuj)L0(Q{BSHOny<6MfWjUNTNE*fmuqW`U?Io#EI|3U}-b}xJs{hqm?RRJ}{ z9B0B=uPJuEwN9A4ixxQ0xv;>7&a*eNo}MRRibh1W*>|EO=k9hdC5(W}9k4>Kc>3KBb%aDgy)inOEc4 zOi6#Ua5l5ppWSvufoC(_a91mNW}?bfM$TrY_BWHWnatbfPcT`zR5)<2fTT9@fw1Up z^UE|Bx~q^2{cw=0Kgb4{2RhDbP8?tsoz;}lvzlA*o~Ha+O_}4Yri`R7NN@FL5O@tV zyEE@VQQi1jByT~?KywHA^2>7856@+OI?x=&d;;kM&0pZ&S-nAKdK^=i@lhkDHB1`Q zM>vYfG;gkg)6*4l$Q@)3#22p&GDj(lKL;x3GKi};WbF@BL9@Z;_Z){ZBVpHIbCm7i zC7#Sw!Gpo(QI6x8-D?P^HYIFL$YWdhgL#NKf)0fWN)ESF0oUzDFf@ucx5Tkah&O+T z{}R7>=m&-I=DtiXou*bao~Y}dVD5(xRwtN;<3FFF=Jw1?=swgOi%BEq3^jKR?ZJi! z1CA-)>ETp48!Dt!z&*p_q2?&*5K@V6i8|0DoZM&WQBCOhj#+IxwHX1vGq^#J-j%5d zNfT};p|G1-4az`6FNk~H+!1vCW)D3w2pZH2MHb9#y9M)14eG~;KvnFrX%0Dv>33YD zCCS7j_JwVD%ly3*dW|-}@4b7z!&ciq-)5_cF|Bsv`spzRpWz}+HPuN|iHvI)L5%AQ zX$}nev`1n1%=K?oh?wjkBHgmu_=&SJJD^8*W@A_H*&?)3>}U}qo3ZG8N4jFg%v7bT z9KHavzw}Nh3mIR1s)DUxjv>`teA`C^!arc1fLb7V;BS75KU2EGtR?2b&-A>iPc@MK z%p?)%lkB8-HWsVhcKKCop=Umkh5iuZbv-fU04pXiAE4PtFQ0>fUJal>aDYyElAlg# z;5_ElCq+*WG0d4Q;*$IJp?(e)`qKliD0Log>veg%@wst%h32DXvDvW!GjFlL9Zsu> zYM(_OH_jEpN{{XQ;~3(Mjag!0bb|WX^K_-a10(I}$$MZdRc6#|YM+ zo7MVbSP8ZMNW@sic5@e+y&-0wn+i&|n;VB?_6Fg7sr`ML1P)JkkWvrHf5={h*mD8$ z#lOz;)vsP_zT@h>J=I|*Y)pNWnee>CtqRrx4BjU2LdlZvL`+QWJw0v&k7J-)Z?hiE zdh-dGr7-LD_^S=$&ChcndupBySzrhg3UIkGdNI#V>v83Z{3>vu$Ak z&r6o8Fc6A64rWWMe^5LY)FqiBLb!CU4PmjF`^-hXD%jk1U_&R|?!Spd{?Kpceg3Cb zH7r|%;>t>W#sTvRM!IlCLrC1ea~RT#oME8XF~tRM`mHVZ&5kwtm_y{73#;tkXdccF zmf$6R@`iuu`f}gQUa!wOLcZCt*8UASe=5OC@{J~QW4UjP-!;UOts0E)W@m3`2!%_R zeS*bXv@r}5EWzuFo^_Xx_-awRwLt3sS4HFe; z-?0QhuR?QIW&$MVSt6KZ$jGy(A@eVD4DwK3c6}xklqW2nDk}(#+N+I3Y3-!h2@A<{ z8vnO>BBnJ+?A0(3GK(!9cmz=Mv86TiJa1Nb&rg!Eg)Z#8Q$n1t_N1i|GYTf1w1mhn z%nc>S`gBQ$>oYWQVw!AnZ}2%~X$k!=(0GxjB51}XvxA_gFPRBJ3t>2>uu@_Qs|?>^ zeh@oziaW$5taOE5m(AU9o~r>F2`lS^vSdzEh%-$_B3f&=B{ew}2I|aj6&`M^2lasj zVIygMb%?Tjb`9@yb6gv^xU_On;?YX1)8m_YvgPuu`i$Tk(q^7)qxho?9|+f!50XDi z{RIAAY9VPN#V8ZCNq9J2NDV}I7{-5PsU_TS=HS$y9>>8!kQ-@fipVFsSd!ZBF6ISLJsS)$M525Us$m?~mzvSoUa%Wr zti;JS!?v(t*5$#gl2aGoz;>`(JobEX(KnWM?ljpOgPFDxRp@|Fr$oCix@S@1i{Qmr zf;2iP-4b(*z%`&v*rYIU!|7b zk6@Je3(q6rPYL~r6+Q1qNR=nxc&TMFa{_wax74fMS~%5hSA&_;oex&r`m%vd4U)N7 zC4Np6A$eZyiqP7LT@jK_s-OsG8mpoR8GyvOFHeKaB1sKU?%wPzMYW^LI$V#5KwY8r zYSj%!&h@VW5r0}bwM_Yv4v$>zMpBo^3Hl@j9I{J0mxlQ7_DKb;kMGze({^=7T<8+l{L61Cqr6m*8n$m zKVg-a>BI3j_4Hp|;cGskCiHt?4x}32;KHsoc~j1r^uXLi@+%fpu00ep3g5Q4Gkrl@ z)F;r@g)QBzOSoK*`4kGrJs0JXU{ic5nWeId4{~G{8aY8H@0(PKP^IB}I%iyPK}tDR z-$3eK?sVBrjv;pgZefl#eA`GLz9MC#V@e zB~nbtCgg%g>uV`z!ZsgEBtC}dh`WBEd%@!2Hhq0K-v8UjqQ)}G!AeUiB9!%eYZd&W zv;~cB5t+5$U3q zboIi{Jgg}l?1$oRr8o=!x)j?XReF|K{Fuo8x|An7|3=#(r^k~Tvqh~HO8!RtvCoK*tohe%^V-iTL(IR)mmvIJ3O=n1~pFbm1vR+cE*>N#<%Ucl6} zM8LAQ>d9p+RalTYQKYYyKNw|gk1DH7=1N38*2Sil>^6z@d;PwTE)_<-W$rpDbLSIl)!I!tTT1G86^s#{`r+dhsN z0THp!Y`(Uyw-1jy>8(4mTETcgYK-Lt>(s3)2(Hg4pkUb%1p&Jf3vk%lTr`0fIZxo> zMWyBBV}EIVoWN5U2{Q?n$t|^Xd-Cfe5cgYKqR~`U&ZsfplkvcW|KvAxXk)44Sf?l5 zcV>pIrFLeZla%;5;fAfHdgKNvV_&4hwta>VaCu%*#95c;akw(4$)%DZVZA}?Nt+;? zK-#X56TUq6~aIrS0{+Mn1XhpfhHqak&&jyQ|NEAmS5^|IGQe0|Nq*K|4Fv)i+m&}v6Xan+ej zP}I|5VgxMwr<|x3|6L!Z_OfjBxW?S~Q_Jpa809r+8)q5ET!XD~me^3c^|~$l4(E968H?39jwv_JSQO|X&m3dvX?2b_ zsA=tuQG2$ge(@c*Ao{GOh2R#~=;9C6XNK6Eh#tXSnP}JkF;LG`;kd98P~?Q6gYA_fTSCoEp@nW`AAo zvHDDW&Fnwvz{myDPR=5zOV6Qac#bYHr#?fxJ~1VYR50;VOPI66N8Qox@X7iVm;A&V zgdU#lx!!07^@iel@+Qo$kn{oW3-pDI50uoIpK!r4?D=_x-9EFM2XN%?%6oUBKNn4+ zmmHHQUDU4nqa5QV{h|N+bIU9y*q-BT#~;q@Rs_DkA{Pm~<|}$gG)+-SB{YpwhBHsv zK2b77C6!PzC$?8?@S&2iWmS@rM#*%dFP&z&K^D2?76hfm6hHfdfP7KL4EzxOhH_pD zvXMc(WY6x8Kw+osITHs6ES8(M@N1r{Ab>;=}sD@bf3AloMqy1ki>I3R zJ{<_eKxoJ6U`5W6bJjNaq-4-P*=NK@Co5o6gUsJ_1dB8X8&GJ)mGjg z+KP!ZN>$y+pDo(5VIt3r%_{A{JzIuS!nK1^nb*ouYUwq7_e{%oq5zRo*PJOe?bp7NJawT;E6J5#2^JtmSUvNVB!8X`k$okJpwgA(+$UT~=FIf@ z_m$+Gr)9fJ27{?QP%>>^T11b{K`*UFI=98*D;5&VRResQoa+6E&@fzcde(Tdz%bs< zv^vd$`iv;NR+o$+WaIpIoGZt*OU^;qHOpebf1+^sPw=PBe}X^l{*&TsmLcdTiMwv; zjQ#JE9mbYV?v?{*D_ zy;nhl?KW3IgSD(uOwGbVE2mpyYEsBR{Ex-daF)u))HJyB?5$IbDD;EkS)8}>j=1dL zEi5}Y@NeAsweD(E!6Bot*rfqz#Eo!mx4EJ9J&UcfiIjw1jrQgHfM=;?MU`U9l2MAU*w9zy}ahl)|w6vH*h~pZrYL;`A=rZljL=uif~#@*9tTyYUljuM%sI zTDXNWzQo=D@p{v{ooev=?46PQTzdCYPkxW>T?vLt(B#@Hy!myuS0zcS^`m_G9^{&a zpx+W908RY(rB!g>4#Uwv&+Y5@Z>K+Rb=uZlvVk9E$=9d&&2?KSm+6+vx`eo z$N9?TjD5S+c1IUwsL!ZjMj+pxcso}$#W?pB){n{H>fZ|DUv_odxjYDqSuG3Yht)_g z@l}3Dj$y;RI6fHahw=XC?d=f8H^zS>!ualPvzFAvmv@EnD=;d0a5xY6?@l=1P4UmS zD&bQ(q{i{J;GGEmV+7d{!FR+{)B$Q4NF4gU@EHfSRGX82DV$+yMEW<~NJ;j?>@d?J$$qiQ2wJ>Xz%p2dGP>hN9h z6>S~9P0Q3U)=y~E&sKR@LBdMAv!`~_sx1v9o*Kp))8$WtEKco&U+VBtfe$>`fHI%D z;8*al4j+!qhu5X(46ciKEPyHG9}nquDLSX>@^cWnq4oGR2y%`36!Nz9`L^^RdKjd2 zt*wHY^?7o}{Cs_W0HV;b0Y%~K1{C(f1_=AiFjgY~peh6VmGZDhQrNHTgq{rr*lU;h z)P==|^BPjvH#elP-)M+HPXM1NJ_2EH7R9&l;w73;wt?_zO(>|#f9lncI@n#+GIb4Q zFDQvBgHw!O6zy8A?1|hGC4A}+lk4+Mpj~6++g|W-V;hQEh-ku-t=k4oD4t`QAf7YA z*rwJV%ivjB9?xd9v(lY#x`}{ibeT^vMsg>FH>G%XXiD*%)D-dD0?Wxi9`-i1;n`C7 z)K|c>l@p%H&C21~ns(iQ;@MjG)Q{lV&#Mjn)LreN_QD~O#5mC15<}755kt^j+#Io; z9>%_C?Y9iJsk_Q?WP93W>Mj`7T)?(NnNM9MHiBbjzCYK#ut zaZG*R#l_{m2S(Yuu5ZVjm0qmZ}z={FDP+=@>@dS|!d zNkCrT*8D`|>{G4zSFy>kHhe7J9NdO)BH6wReD6v_{p9RX7mDF_L|qw&;2d><^m~zh z;N6+`gwt(!xn`b%J!b7Hf({r4U*?Fu(t=xCUK6^?F?bTII3E|@TD1#0wdEUN-yh;X z3D#&Td6n-47uxa@B=~G_JH9p*%af4Yf%k`R+u^$lV1GNrc>!E*$Ip`XXAKb4p4Y(o zB`Z8&Z!F&ePQ8dD(;oub^S@%lruO_G#I$t>z6)MW>VPO_3n==?S+f8}HboJ*4t(QA ze|WPND^B4yoOsb|T9&sx2A{TkVCatW*qs*M-?0l4UZU8|#D8||q#Y4Ed^V{gUmHQn z=tv29z9S+v0c5fKOawkHmS2H{yl5L;LdZ5Sj^&f^i@PjEsdp!e(zl%uCEkwG6`^ll zKbRYKeW-n{Z-$NHj zJFiiJemL(1H@YEyOW?0=e57ROQV4yWZ_3<&*I(z=u6@|47$7~Zj=z_jokqi_g~0T* z*ZIyuXtFnZrbxj{=*OL!G z#iZ>?71JE@ZxkHr$%n}=&I?sD%D(V>Pd=DLNZ07a*L6EzO01F=z4(^$3WAKwuF#q`6W=?N+Qh@Gat)eqGuUM3CXbC^Z?UW0IYVGhCXgK>WD0ZoSRZKw*y z>gR;+>i2nXcXTVD%ZObF3AcMicmNe zlp^`fP`)oS2mTn!kCv3EVCXyi7DS`wyZkV`)PMdiuVR>NnD-vVqvYTg6`XqyxsaGb zhwRAsGwUc8wGIndtfN@qD~GLvuM+gj5doChFzE+viXr z3^miY?dt0CKSGmkBl-GnN74w!F(dhgG$Q(Y|)tF)y6qN+X~#kWE=wtkdVjp3P2I5vt8u3hfz zNRiMZp7CJ6#e*h9--Xw{L-m~yWZgBqJ`_J#sDRa@`N^>LOMbc}Ljl|Rcn4yA58hw0 z*$tS_ct7}jI`4t>oj#raP;$T(5@&@3g2xQLl_c2{?jN}v2yf3oD{?9PX9nL`24NZr zD}%gqHSwU#3}lQ2aBl`5B}ogzXy*3<;ia$mdT!~f2;U6A`h@h~?zn|3zW86QM8K!{v3dXWyCBse{@r8sJ>BtiIV z6}{(&zj&O?TG7z2O#0Ll?`@>Nh?_8#zDJ_X@QAtAeO3_6`IJ}K&zUd(6kQ@cfStmV z(3af0Q#3GddYTd@jYD0G!8qgiawl_Rj->`b{y4rqx}zgNGb61Q1dT_|#~rK0&T~Rx z?~*icg&9He#2FKBrn#-RDiT)$VT7M-1uLdXc6X3H6|7Gg`GWGLdY9Dwt zf4+~0loe74(&O`$X78p76Xj?(!qE;k7j9O_=AZljb-3IX%9TU<8_8(o;Sw_M-mO3w zI1Q({Wc{pZ{6YpN^o%)tEl;OHzzH8T>v|a{5`rlK#_|MKM z*Hh_H{ot8scjL+~OLjX5_*wjmvI7iGN(|)v`j<){J)0l%*gkuL-(0?vWX2I&pLz9` z2Q&1_+GToPxh_+4_5J4YZ!yeqq0708cy~CK%GZ-5OJMdizLwrQjUVyYKD)xj`H1Jz z9BZF~la-;DK@hu^f5q=qxjt8&)N2-!J`dabY|Px%?^=Y8>c2f_4@Z{vtJvpSW<)a}sAk;&Das|#qXs~F%Q((G^v8`Rfdp-Z6WIZl=m&^&$ z4_Jlj`*GNIh12^xdc%8b_!g2Pvkeduq{z@KE6OQ_CDL!SKswz87A3Z=qM6w(zr=;rioSa3O{g8@Y{t2mgJ!jn^^#_4U5z-N@a> zKk%JVgvb2ApCOmMex#QRek2?*LzhuIl!<`MjooFwGm5B(PHwYY>Oxj}GgSb8-Bv&S ziv3sdb;x+#t5&=F!W|bE_5%K5U0!5_wTr@P?a(Ie)=pg^H5OVs7q3G?r|v5KX+0X% z2$avy6sR|U=F@O^55h+W&=oi47O#@rx&@)Tkh2!)U)#kGCfZ`%ZvI{T=e37VM=Uq* z;bn|$3!{;EY5&9tMy;(<1y#e7Fe>M*CIIA_Vd#iqRkNT zmR6j@ed?0-)Ob*wWz;g|BK^q&hz%;QxNQD?{HM?6m*WWZIm9c;-C>8(h)>q9I*jXY zy!_-Sz1(_~{{&kuf~@=RgnJ6Ebt|U5a-JB|XfdW%_k5%nQ_Y9U0DVyo`hyXaCb|5} zvSbNTxnOle>rV5wE*?nStL=E{|~Z(%pzt2|=^i{dBlzM+bOu@U`jR(QN;CCe9Qbd{&BP zT3v-|F{0N?`4;-#W?Y^lFq19lJ-Ms@&BBjmq+9dKpqF@>Z-RWRJIxOy`nmKBx*t}< zduRDoh@PT=myo+&h5Sp*E`9exzJOddIZrP~o=0}Ip;y!D^%ls8qk7y0*g;>ZAo?ON z|2NkC7ff@VFwM1Mir#qZ@&pBzVw!)EXx`OOe2ITWwu=baDbOOwi~r<1==GP86Q%o4 zmB%|A!mjc@h1n2&futb zd@3U~a*se)d6710m0dTK-5+kD){-wEBX$M7xIHGSAm$G0@&%B5hw%5>I(Kzkfdb%6)gTB4%>Gvdfxk7fj16~%$PJ2tNBaw)Wfb+7eK_wJcS5_FvS9U*%a?@(I6G- z5T6=3$_C>3G+q1jjpq}3-Lz1vrqnjgePFltrfp$Lti`o7#_0ux zpcesDmn6ZhAV@(ON>zQtusx9imxo0V5bUkG~^Fxz;qQ~ z>fQ@n#g{qxa)gO1(=updl%gjTgtl_$SQCxDw9ZUdqZB`$Ul7Wls9>|k=g5=qB34ez zGZ;?swuNTO-JPB6YtcSi(_C_9C8+`h4ukb;X|$3Gbq%s5CQw2AdMIzZ=J-)?jN%8) zya6tW(tD#~$|a!lG#VXv% z(VvEn9ADWtKn%vqI+!x-E$lQpR^ckwp*8P!r;U#%#zb0>r%2uJglb9=%WQ_afv`=;%26!!rWMslEAkG*5wOV$-HDKnm=gL1^p{Yd4v(?S5z`EE6L?#-ncj2nXFtu zlOfCMhf#bbCBXl$D;7;z_OJa^w~|sFro}_w#m5Jk^fb6g&SO1daBXT+Rf>{|C~NX} zZK?OkexYQnteoWe-VZP9XAb~Y>PTtrNg*%3YbSdZV*s`8iVW8CF# zqL50@+bFV{QUNn;QcXD~iT4(o759#fs@4$i+t*Nr@x#w`ctyMv7vNi-%`2{{{BQYo zEnrTk{kn?SryS{bWsayURmsn-r8xOo6sF)b%F2I|qCi*ypl3g)Jjai@z0V1Pf9pBL zji}L#dNac5N^Rg{N6gPgvr_#WPpeMkySVKBPBZG@tUOCab(CIMI=L=(R2p@!t7IS(V{Y53FkO6KS9u#Hs@4-FrqmN9R@6f^ zBFKuOySC11kNvM@2Kkn$`~Dn|#&IpHK&X`J3UG^!+otc+2-(e<8B+{9I6pG7Ga_!GdRP zco1d4V^QU)jp=rCWrX490(xIoDtPlkKmB>NiQ$(3N@%$&%qaUHlr!^>-QoES&s|+4 z(ejo`BWW7BTPhO`YmZV^rwXwY{NzuQdF@eQI-S)@se`39V{^;5lYks*E5)a-XPAZ- zUiA>@ZNMpEeK*k?n_OOwdQJo8Am@s|lD^S>u8<9~~@%%~?`6isEw=F+NqU0z<;O5aJ)Jb{d|I3&;zjclXH0cY0v%G>99 z%h?X6iQ+n43#Vxvloq~%U;vHNsCru^N*n@9Us5{4V~v?9udUJ)b^v!<1$Ka(7nF}G zrpZB1^^91oV9#0PQIa6FT!zw?&b*+sLgmUYD)DGGl$NF`;gtEJ^1NZp4x$$|*y(PH z{|LKzhZExhH19+WfYhv=Qg!qj9%Ida2sh1wqr)xysnJ92@(*x}5Hys3a2i4+FJMiC zR?8CQG$&B3&oy6)dvBPv#;q;5KGqYW=9 zp8*(kUgnUb&M$*#r_s+ZD^Y%FvQuwe16#c`0k#ooqU7Q52?cOiCAc zQOh;tU`UmG3jruYY}0^tWm zP4MP4|9m$k9TThnsuBZYc33Mm5@D)dF}(D>JtYC(J=yTj#u@@!8G4bal{^xJv&++_E z8~;9r|8*gk$M$dx0*%*%M7}}^jb%G+d_zf!nU7N3am!OiWM!5`#~BpTs+ZjxExN9s zt{}B>_1<4y%0P5OQJb?4DvqeZWu=UMt7Yf-CC~6lXBTlk338JpUsym1Z$T~8-jz8V z5!HqT(64YAX=Cm)wX$7QFhD7h7(IDgiSaK|m*fG)Q?4V{%z;hwI6E^S;IPAcGqOM$w>6zCJXhpW+jAWe1Kr zuqmgw9= zPhHo~B}u`rOv>idxARRJP%1+oo%Ihd7ti4@!FgYp@eDXlP3PYP=Up(hl=Cjy_aw@I zM{wTF9A_s!Q)~Bx{AuqgX34_5ofddwx}-%Fq%e4^3EZjsd~_V*zYub`4K&25xh zt(l*{Pr1Dk@_{lMxHanor6+K!_yfTi`G2Ui=Ggxs_-PyhnE~VD0)*lNjI-FYsTFG{ zj`qoeFhaE3lwh*c zsnN}1i4`8?MHQfX@X4?T7$*NrJI5*&jRy=sxBcT5#<-eBRFHi9p=^?uPK?1}-<7gX z#fLk1mh|!&xPjxIJtY)$o;{UW9iD?T$0wn@nvh%e7rKx`_@DR1P0HJq@A@6Co5|VbF(OL z3Rn}6s|t_X(}D|15B*&)8uO##OB+WHYDtHtD(`wfe3DE}rYWPq2tknlOWHS_hMGLZ(bCMx{%q(Sr!Fv+M6Ejz7hMqRXS9MU7f2M=3% zeTZPgS|-rIc?yqIJ4H$|{I{3P6NEbR#we(Ttz#3(mZJ>#UpHu66)YQFhr2o@B%`yA ztw{anD+N%?SU8-5W9?!50)k*H<-~LLDqddoym(;!m~-^n0)<~@i?sKY8_n!Xx7L#U z$a(ClKdoG#1Yv(Q&%>3sfh&||}bRL?!58F+Ka(2yY3>jWM;Y;nZiLGQf0n zrO`TreqD&8XEsGHQkLUq$0DeYX48G`r|x3$^q%&!9zVv}1`z653*L9oZ;KQ=g)LEn zQ9gNzDA-5)S&AQCFvL|jHxUx8C~01*1oM}nl%5gqpqfjS3jERLl9Fqo%)59-Lo=3& zhJL~i{~G2xyqLET=MrCAxWv~{F38QZsQ^EQ*#_F!-rr8WJ}xm)OsVG|AP1}N#XXEFf zZrTX*i$4cfgTrRXa>W_+H>6#Xt>p@o1I``bE z=PMgIY;X#cUZ1C*h)!QwyFL&2oKyQ=6s=sL#PPGo44?Icb#L2@`yl(s zNAs!HI>kvNzfgjV3k|ZxRhVB(iVF7CIU|TLsOp25%s z8sp6UEy=!gJQw1M?>B8spRQE+Er7Z?plrm#Qyg0FH29-&6O=0@EJeco4eMIW-AtQ? zbPl6lxh+HU!&WJ;8w}-N(W2F`1RtY`Yn0>u6Mu)C!Uz7VKJdwFvAGx0{I!bHJVC-( zt+c5-m=Rj1g!>AoaM%IUsAR2D+kd5}@&ttRu7h29A@#)Mr3o~8ol*~!KyG!;;Cp;p!ya(}eTNZ)>?jFZOXH{GmcOVSDYWs4GJ%D?QiuA*yOl(&F=JSTq99c=D_ zUn~7_3p$ka$6m10^{*8koEn(eJtB@@#u%XCphtJ-tEU&W0J?*|0o6&Pjo&E!;ba$+ zuQbHD(lsAcR%)N$XRA^mN#0c9TjehlirS{6A=oC&mDdROl+dVc@L2H9|8W~m6ln|{ z*{)2+>bnLxW2G>9|2t()=~I5(4#gn(oqCdN-NVDRqFp7`Ye_b0vQv2_$=geg(Z;7K ze6bG%0fQi9z!gWc_Hugu^-g69`eN}*?0I7;@2e;q zW!Dd@Pq{t_xEZ`(3HH8qE19yEf7b&F1o=_8lw`nj#;Mb-b6RE@V{Sat=JFCgi-|^q zh2-aYLM1cGg0uVJOe?j2`EdlfuZI~a{=xprIa7WN%D?$D7RuAFbDDQ5=Wv2>Z;%N| z6;j^{q8XZ+zZ$dROtT%>PT_|3&csoYv_`I#k8mhyQ1_uB3s7Vbm-GPAYBO zkYmZYS7f29hjBJ9hc@hW74du(#_^mLf*I9cZLBcv1&aAqDE~v=4rvx^_LA?Oe`drN z&hZhS5f_M8rrfR3FVle^pZHM!qsmGwj_sK8O1b{)(~wVFIW0m<^fN4?y;UBk$dmCH z&L#^bQS92wdLKTenuBSVcpn!mP$Ff9c5O@rHh&A513q_9@^R$=dP)7NQUo2?)X|5U z9gH?p)Cr}n@u5vNP~pgeFdBYBIf@XP^xu_f7z(Zi3#Z)R&rNjicO`){(YZer+4ECQ zg6RYff@7}Z+E_D5ipt;lhw?Ja)fXsGQQ#1$^}^06KGft-C54VC&?+LFrFNZgqd`Wo zT?~A6}B-+nn6dOeOP2xC&9vOaQ_Q?;^z z=VRb-Duz0+g@2d{Xtn(^^*jdykT&X-7`0@;JNNm&Ne_5u-ON@SCss2A6OzHkQEt|x zSaR2{=b*nXDl-E2Jvaz$WGkqJw>&sVvo0x#&OV;2QqQo}pjF4~t(vC7tSMxi7HeOcnRGwg=vzAY)mN1S z%a<5+5C(VTs!|nh!;h{iPXF82t#YWf6J{UaI^52PBc#za<#lN|&A*1}4JA-o;(hx8rPL*OTqdC*&iP|TnFbcoJL<);{El)XeyMX62(T_uPZ+Oh3Hfg9UyuY zZ-Yf(8CHE)zEKW96D7RvKC}n8p{|2A-BiMGBdcOJ=lbDA7!}=A8ifc&hSP$I7!Y2E z^VfC?zNu9974}DAl08+dL|ODM=}|FS{!=l_Hc=x=^lyt6+@iN!)@8KTW#1A{mocJC z+FGInn0Q~Y<@yr*zUV9HM!CLf-9TSQzcK2waB2`3a03u1>nK6%Xxn zukc}eQm>eGv!hwACIDiQ%T}tI1}V)R=`BxPj(f~Ruhq3)58W!)t9ncH8gyG}fnAVs zTQEusZ!4K~hsmj)9i{K4e@1Bw-vvNpFEA?DZK;33LkX^OyZ;KOL4Uzg^VJhyxF^ed z;l{=fTOBbKF9^Y3T=3&JDJ}|GBt^vhP0@pbB8iKZ z&!FZVrM2i{r6kYA{foSdtUKu9>NX3y(2bwEgPd6w=1nK>B6o_otTCr~lAQ{MKM=RC zUB9DL1jFA@8<%dfLVu0Kz*si!J4SU|WL@&Wd7bI~%pM3l`n*9LUluq=o2TH3J!{q&X$^UN7Iv#D6aJ$kKLFB!h z#_C?@X_jyQaO(0<3CFG)^bo`Nh^9VN5=(nPFH5m%x1oZZYe0h1{;Q^Tn&Zm`nDvWNO@6E+5_WX+Lr+U6*N;_3Zj2xO zm=jNz{Ma;n`^aB>+vzX9UGNv*d;?f3jIezGYb&ObK$+f$!)RjwYi*np4BbcOjaCi{ z3S@8cSydqEVfQe49LaoWULdP$cxcN%5Xiy+Y&sjnT8kzs)24qx6*St)QlNHa5ysiU zauv$lc*{Yb2eVWF?r1PeLybf$L*|~Gl9>@S#)`4crhQgc4I{l}72jKg=z~fjIXlon z%R*QixZPh0VJ(1pH9}c6IP#h0+H^QD(ndo2WBFjDK2R4ZP6YH^gnTl3b5U=EDY&8+P5~E9>v-Q(>wFhF-ig zS;tCp13Em;j7u!{j&4iM3(vN3SsTVkK~&YwiZQ)thZsIr8>aVxYs_#5YgXIA-MBPF z^wAN~4AQzj)+5tvoE6j%LTZO`b1q$V2;}S&#_|9>V>oMpd0V*FWncFuj|CMNgOEwt zokC(*^8nP*-K-2z6cWuEP)g73CX);k+eFHZ;W$7K-$;q1Cox#x+0-VMy@~eL#tMA0 z$dQ_U&@Ya)Fo+^votXu>^g$pbPjw-+-@IQSdn#yqTxW!7SK%o^rXQMdT;K%=asF%a*lpcZp_KIeUM(LslfbwkG46c!S_ z>hv=*<*6br?YeX=j#ZGjye2*AZOiXgn;~p&BF&oNYs(+;JUcBJ z#<)G22Vqbf<4$%-p;e_<9NW)6)5VoDlwOZT7`C4F2%#by{z%s`T4qBLcv2#>Zie04=%p4c+UNN6BeI*JE(G{HO`hCYS)Ifb7pTj;`P`HwE~W>p$Nf2+mIlkuae%wecahwXiFP5()fcn zq=QlISfpX@7I?<7)&X--&&fGQ8D;X?vQGbfOZFGEmcsr`OVW$%ZA`x3i!8}}YTIEi zYYxqMk+tIkQD0ic~ zD~&zRS7mQ|wi*jJv;#Yer#9*Ao}^Io3|0x2jCV5FEmZH(k$vvj2&PVABh>1|KJ>g= z-HEmI**rrmOAV5DejXlFlXIH#cvl6!R5dB{tFGac{nd{e`L898h#)QUQoqzZMH~@9 zsiK~KY@|}rsv9FI{lK4X=!MQ~1F*2D--oamb-@szB75*B*ObAW_(BCJWX7{+FnhVe zH&22W*yK}xJf+=9-MBVN(q9SfPKT9jpdt5bis*)&b)Mw*jr)?T8~c-MC8ZzkSIyt} zDsymkLG>=7k)*x`fTPJrud%AedBHfT3f5P0Q1jQ>8z{2kbyhR>)E@$|y*Xmr1!DVa zCIWGtP4Vl%A2i_K9YoQa-tErbmp10J?rfgqeQ#L;MRsF}`Y`ez_QZ5?-CJ^RmVtML z#=16|+MBhuUj5uhKJ6txQq9&(9894(^5usHhLC7^JB!ayi$^^%nNNtYSi`I>2L|!ADJRA<98;j&Fd$d7nnT!6stK&2M5Sr&0QwOop*Ggqm+3 z97e0(WZcbc_nTl3d*wu~cH~>%0^QNoF$g{u)2i_{OOX1|ru)y?0<@X%FPKPX=!~NlyB%acw_p{gXY|M?QZfK@Nt-V06oO;w}5Wb_xwd$UCei zhS~fbOrkj3BXS^_(V)9F8ubpV2c|xY9y=)Di*-IGFR&-Wpj-&Fg?X5DZym19A*P{I zsUMENG}ov$P8eiR`lBdhe7hg+?PL8ge_%gmG{hDyg{QdnwM28ErgrgdEzD2O2pM(MM}%h z8_a4;hMO1Zw;?RWxG5HEDvhoVS`a^!wHBs`!fDHF^yyI6&qxwtiLwT)aL~h{te$a^ z1izVt`9gz*@`Wb)_Y zRbq5KFB5lGdI8?}l?^@#5*W;r^R;U=*TCIVK0cogz0ckQF1P%Ey^QFA>6 z$5!z_xppjX46{?CVJs@KkE}bR2YX~+i>@LQ^`IhyFBP-LXxfC0npeNCtZ9cN2)jOV zgsXQ*l)g39TgcqVu*{S1s`FRCXx5YIKz<3_+$3Gd6R_7ajsd- zqrk;X`IuFXoNMsdZMCF)AiBEjy8mMq52U+{A4~q(IH5ob`Gh5yO3p?lm}tW|mO$M; z!7+kNjURskA!rBf$4`?X2_`|Ud}U!4aRxX+5wInFJeJy!C?{4$FQdivOY)_QR-tix z?Nd;&_Eh{SD@5mC4QCbcb7DB-W~+n|jGLtTj$kdphx^FYNG_=WCyNoRTF@8AedGh) z^5yYyLjJfjg2kJbKMIBX5j_%rc17`;qIk^T{biu75vc&I1LRtqC2$1z%G${yGQQ0m z$yx-?n{1YoCf0mR^NZ!#sn=WZ1N3C7{w}aOY3vc0!GEqJEK^D|DFSInX~eK zYs393$r1H8smE7-o*z}#UPuJ6Y4svUh_9~p36U3{*VggqD3F?A^w%iX9Mi5hnpIEK zRH+_30m}gVLJlci?<979(L`3uSNOaO%j|cfae#kBCq`p6Kcu^(S+=gi6^%TLq&0z` zy8pVz%N!W|biV>WBmRb;nvXm1lVY=QHh~6tFf)<{W-*^q^c<1JPJnE59?J#-FL#Z_ zBsbBYV_EYkAfw0G+~4Etr((~g;?saAKjfKTAcO3IGl$@ot<5&xh zkHzCyXP#}-N8X13^NSVixV@Y;h!~RKr=#7E!rxlpCRBp7X*{-%2L*p0&j=_u^fR^# zJ=U23My3<>n84bB1RQj2Y8HVGcT4~em_}D7KqB5uwI;Hp0DaZa=V31zdLYdfa763G z;tU3{9yO6w5BeJzw@zfS0iMMR=42a-$DPWfCb1avM`-G())aM^#C)OV@sW>F#ti15 z_a?ES=Jt604Qj81?lyWjiDfifLlzK4P62hYh`lFoCXM#_2r8AxgOoT~1a|%tS&XC= zli6!hhny*F1t{bfQy>{0rK?legt(&yB=^Z3e1bm}KEuq7hJt zpj!FFB+8xv!M+2TX0ib$$c1OUXmmDwe5TH1JZHI&{HHd~(=##7%~uWLq~ZQa%de6- zn|+8gV?;I%vo!fUrOyIgKatI9;pu|*6gP`;Lu~t5qR1ufkd2A92Sl?inUkm=ZJ1b%@J+f&|aRzOBA`OJvrx!BI$EQ zk=xqKwRnjle`!y3aoh!HseU=Vknd=(#VOcx9`i-XyV|Q!^F(9o=ZVJdYcKtBL}L%M zr*u4F=3{b1kw@Cg8XvNx9AZ4ttRG=frc)(ia|HH|K`u)jd#!YanA~XVeed$;I!EAw z``+SCYz=|`{i&WnW9GATEbZa>tUZ>=xd7_4G$j6|j9Cmfmo8wn@Hk$7Y!9h7U87rM8&A)zwL0G94JoK>6EvKg;VXtf=}$fm?Z=#vlE0x%txMy=>OGl^;xr+ zHAK~Oi&+XzmGC93UI;%m#~bBokBkrieB{~4mOF61&1m7g|F9)&7yx-y`*~w2q}}#( zU@4n!>>%ezuEU2bO5v_z766yL(JmIFv;XrsB>4Qlbb)U6p~Eg_57hW%@d;DD;bMtq zKIQq6E9C`HQ^D=0=3?7oez_p5@6-NVHqk##UZexX-<5JNKytX6w@8wFs99q5w79R6rxrD($1i>@tW6;0s2S4qNU3*qNq`dRz}<=i_$6bz)43YlTl zc{%jHY54<|vq6&CeS&|Yp&wY2X~^`d+=a8e14!d8gcyydiGWtqs@ zdKEil&IyKyg}|Y^@7k#5muw_NfVE$O3CW?WU$RdP_d}`QYBt87i;q<`>5*=&W=;dJ zCTtDdRXRW|&)yf}q0l}DtYvASs}?w&rDn9Zk@M@eCK|R@lq_1yn(DZ-+#@>HSjQ^% z=u^($Oxrph(NUDsPrt)ehe^!gQxg3%cpfBM9&l{>FK(Ywn6MMF^d80v0Z7< z-0ME@7|QHd6CvquvA1YrL1-u~*u;7m_MLdvQ(@nUe0VBUm;BEx6U?qrUiCAz-2x$S zYyg!oWE4s71{aEyo!-v;Yg=#%^IW`#qn#1d@f&96xp*@I>)L6=H;e~6P5K5WCuG=f z*kr@mZ)tKqt7bm?t%&#dHlJ0k|JddUjMh`?!@p5zb3~!i(C5-bJlvOGTu~CU6}pc0 z)NCsbpY}9(D|C0OaBD307u|8OhS_fw&%Tk)!#ZgDL*}Gwc-io= z+X|Fbz>;;(MebWSa64-PfUMch`j(Eg=6B3&)<#MVzhhPT0ClXP)K;0x& zmYV6Q0d~UJZhXh4U@wl`0flb+{N6h;DD?Vq0S*Z`_7#XRTq|H>f$&2MvCREwX(4+> zI!reU!J2MoXvwx{i4OVM_<-JDNfX&-BfIyGtI z3D%q@>|?RUDUi%^4zpnt`y<$fmDKP@h%)`C^N;Km^I;3BK1T^B!3^*Ik)@dL+wh_` z4LHf70-*vC!WAr(_iU8#6Xw>Q+W#b`G3qDwt~QW*RBIOo60%<`UczL0NF z`p;|xV0PeV%nPGxOjY-?2L76egB6sU(4f7rvh_G9)C5iWL_5=W2U#Vp>1Ns-1Ak#3 zp_R{mVRjCkg@;(C0qUGbhgeSBN=vD%6D@cH40?|yF!)>h(Wb+!i#Ex<s7+ z?K0v*5jy-c3tKt<7?Z&7AZHq%o}ZTZ3{q%_+d7?e`j5QSJ5XyBXa4jlaS*t(5jPSDkn~gsrdbY z&48@UvwRVCHT@4}G3!a27yiMjH<>8Os@{Hr2U>cnGCh&ACsi3fYn+zI#f%L*<{R=p zB@{>VPKj|xC>Zw?`cz@#`R)@P#xZoL@4jjb9b)&L(>p|tJ8r%<%jY#=N8f+v%RcKJ zmTkbf4D%gJml<1xO)^nsML>goZVe4a6~P7qJ!28$8R(_cSl5*_?KC95eps7gFUq(I zq~3KJpAYApf&4Xq+MZz*OkaK*28+hvGi)-d-8%!QrBSuBLN_qrEVf}9b@&te1l#XV zwh5jmapzdepzJATITswv747cF!RKH*#$_#;!K2~=A8GT^uWC7Rj#W3@2+BFnBF*9z zZZA5|B24@;mNt}CIW&S^Igbqp3VU9xSl)RY8(1+xXyY!Ftyr}S+KP?SnWfSd8!s3g zSzod7WuKo}vAicBvFk6e4+A;APVkhZO_$lrG~yyl#x$2*WSIe=5gwL2k!D?C-RPZ5 zEWC7Bu1jUZT6;+wmWR_WUDv5k4Qs02Sy^gBp43}IBr&X7mvN3kNq?D*!YGoi2yB{g zg)P7`I_+>c(q3K{w^t-K1}pd*!BWi11X=fPkuufjU;Fm3r7>}6PolH4(If%CNf z^>vtVja6@fD|2%6ag55LJtD$TqpfFE>A0Ds6WHioC!7no?hjV0GpaK+wc)f*2*HZToV zr6;|f@k>vVLdrLAAbja zB`YcEF8IWL)akCEb*t~P7jzKcxeEh*8a2Bo_Uf2>0-W2P0q1rB11O6iK;IWT__+sV zJNVEh?NaM;cqe^FKRgg1zVkqUxXQzFApZVuApV{YI-%7r9mJBnt8Bg+VcT7o%l&I-<;JkV~VU{MdrP7-~ zN^x7e3q;oMG}y0?pcJ=7mV7M8+;8}T;F5)TsVX+#yp3v4ega7<-+Nz5D&Kp@B$e;I z6ocx4|44(%;lIbAay_cqTjjL!qPNOvrP-*anzSoH8XMJgX)jGTstu(>w9lv}LOpre zs3rj40!`{J-Dy(XM?l z2dh;;u2X{5(sT3LL+#wm3Py7sX*E9Sl>7_*%l%+AJ`wjWPS8Vx9D-YbmXLG^3{6}6jX zgV4d5omo#e@>ZytZ0sT<{!o}m%<>%VJ5QRpDO8QB@DE871tW&0=4unlqidnqQ+X6( zQ(pj6okJmZgi8#usROVMicRGVO|V_%hs`1#nx4ocv%FX|;`9e~40foTf$Ho~IU9Py zAu9TXiCuU#Oy%iVmKpT)LX{k9lHYQzE)N<@4_C+H`wD|==&_1Ym@8!^*C;)>RZ$xQWmA;{&mCa#Rvz)KhM+Q^gK4r$JvHrXvZk&P-Kh65Ni`~eL zV)=P7>OqN?r7S{rllahfbU8t_OWrw&>T5JOPVHizwD%cZlh7lj#jD>Nw(q47r}~Lu zH*{awc^&8vr`k{Yn)19YFN9j*-BQ_*#Q$^lm(3sgpQBCF4K`Qtcky743)-k*JdHx( zd7p4s?>OjMo%~UN3*qlS1 zlR&UPq3k5}OYUqDP)n`6vTsEdK1`eQ-%M5mCDY=)h%cj$Dybu+pXpX5wHeCg*QpG0 z54LjpT~6$KF_ONQKa|tY7&RVgy+>^ z#&ITSelkCL&qlU7D7%r?)ltVoijAW5_mds@FV}2?EAE--w}Y4b&dSqp`S4W>fSdD484L3{0ar4b`FM9Pb2Q zIe`ujciJhgk=hkqCz8AYUV>8_sV_+-bi9!mPZI51QQ{zs$Dc+u1|?bNEmx$}b^UC# zt+AQ{I9zG0W~0@SO>m@QPdC8pc#E3G8^RFLoslf=!ynY=+N1T!dEk|-fv;_TXSGV8obKXd@K{x z53SVp@EudRuL8`x=?MA%u7$b^PtQ}9tfta}mg;Ay5Z_9Lt}s8ll{!!|{PL7{qx6U} zf?l`HDZbc`a(hIYX-M&VP!qOQqovR3Vq4W|`0XJ1zo5QpSagBjdqMpI?o^R4swv3U zVW5yn$KRnLdk+Lg%Od6Cw9U`BFco}7r(RS`kP!1=J5@!7iuEsHWpeWGzXZ@3is5az z#%?3`)H+7$oTk?2NS^n|9EKnnvzygx~gW3s$z};H5_y}6p0ceT3 zzv4G+?&gC?p$9$YaVfzV;O#H|K1%BkB*aqHbhRTdI4WJeY<{hEqBYP+3C-iG(EJQ_ zv@q+NNjmCdqgoyHMOcOK$7R-qN`s8*}Cb_v&t>WN+Sn28`gW{7J=rz}BAM`3wK z=G&t_V)c%8R69I1hkQ)UC_VjZ^egHL2@F}qE@~70<&7@t+fS9CJ6+TZrd3~on&hAD zs>VxFe=@!b;`9lnzN#+6LLYk-w5XV@uc-$NXE$<>u^3Ncl7uI-qu`>2R~04c3iX@% zW+MHoyLu2k7zPt&d(Od1y9oe*aLRaQZo^|SLEub)B?e=Gebz&QaMTMW;hD!PCzgkh1 zK5B&Fa4co+Ft^nbblm#aQ*oQxV+6kqr;QQq-9s|hUmeu@)E^be{kA$7oONcSX%2rx z&~x=KoV49E#Izzfix&73-m|UjW5l+|oseY!cU-%7vkNT<0=!K{=!GG|{2~YNX@u0snBc(bF;n zh`|5SG%dyJsv<*+o+8u}?)Psqw0QL7dded`MW`O8kA8MTeb?DR ze^&->IEjMviZEWW{;eH9 z7d`{}@rC*OhTu>DV%{67{)%*F2i{Yi0V3tpTple5*x!2(C&LQ3f~ipu%*`N$>9Oe| z*TO3R{pR=8=RkvvuDp>EQds`u_xVYGj5>UX!~CCGGY(TzV^(;3lB))23O|dUNR_92 z%NPbGwFB)Krt%bNCBxK(qFYeUVTc}C{*n3$^qTiRQa=%|{gIPnhMlHeYY)d3F2+Dd6DY8on=fmAq8`m=YGQ z4yPHPstzR3U;e3DGk`DJCSSg8)=Xlb;-I*clQUfHgNx-uw6oog97w>yiNhiOcA#H| ztK7Hr`4Ip@2l{S=+O(Bsu@(WGFxf&@`B)#CFf=%$oDORrPv}eOrR<)-Q&A1(+-4&| zaQag3k*aX|5kaPe2miZ&#LHnYPn!|snDFpr8yy^}Hid~daFiNv`OD>$ePLXyJxc9} zKqWI+mXJ{@uGJl-`uHC!NRTUun$hBIa11~-8VB?BKf>e`)H*UstqLpgqfzQataBU{ z2Hy&!C8Grob$B$SP-vvah^Mw=)IL$z!SH!$o@fY!o4A(t$%9C{#%N2QsDUihv-Bbn zfXtWPnx%dWfKAR4OTRr!wEj2?n;s_SvFaR7{4ZC7U3aV+rmbFO8sjrEjBbnt5+9)o ziL=aZaIhmG*3eWo1sFK7J&$R zEWftHimg#cgHLc2747`o7Ayh}u^Sg_wf+wlZYk584uQb zMz~w4U5tB7av^P)j7)I-CquQght^J3dvd`fU1u1<-dEGrMR;sKLw#M! z%3nPLVi|Vw&Y94D`jhu3i6&R7yE=rXC)sL*MGz5~ebTqR9!Ag4Qd2c5axiBy z1n$wZK+70inWe@&O;qi()#oZ;t$)!i8$q7Upx=n2C5}0yO@rsPNu~9()g)|=UuUb& zWBHFzi0jobxG4!}WX@5izzy}v9L{J`t+{GrQ0xJ7Aq4HALvt~eJyd<32C!-K1i*ZA zIKbdOq@ELW^babT!v{>D8@aTDz`bmt;%d%Fx=Ct+*hbU+^ljvvuO@H@gqHJ#l(llc zIuMR34B7dNX%4EfKy43@jaYyobs)<^wOO10lK2&Ab}Nng73r`D^r&_If&4}Ioz|*2 z;QY9Lp&G@VA3bz1#Ck^i7$FztIc0dll4X(F0lT~FA~nIX40JFF??x}e5z>i{@^?=Z zgB*=_4;QJ`;c;MwU)j*PfP=hP9SW35olwI@dl!Szg!O2N$_=imKX-z@ZHbx))x;H` z(ytYeWPgduT?v0$A`}hhm#Exd?K+j5NVX$^qjt#+^aQXsZEE~hxKD`~CGyn|UaGc3 zy>FL_ddHWl8Q{vH=ObxLXFDD0ddNgC1-#@>87?(C==+&w8BTkPamNPtTKLqZ)->&# z7Y;qcIu}^WuJnrw;6SKb;fK$?OHUkT3w6&`vkWJ8KE)f0yYKKSPtA-vwCfp;VA3wm z`4+gOhRIS_1MG<*J#UAT^#?V>xUwx`+uXlSjmr=GTs_RUg}O`~1Z-))9DLtI>}TjC zCI(Pe9=I3(71%jBmHWIp^~ymK&96v&hFBun*ikwba9j5w8AOFFUUc)zryyyjp<*B zF^}E?Ca>jY=#-EnW5}8as=7r?5bwtV42G}OWb=w(pjI?xSrHP|@@w@9XhO<2U>Tvh zS@;de8>g|cw0@gfhf=qytvE6KXe-XsdGzI0wIvtMu5DGvMUR2N3HlFFQ&$o5WTlBg zA`jJ}-S1VQum7dqG@aVa)j;dM1)gNl=xwkT?4dQ=F#A0euwCuJ8}Gke&BEi=?dk_8 z)8{+&a%h3(&hDqB4ucsjje6}+r_?PlIRlU!L_dQ4WRWNgyI^^+oa{L)1v}-ZC1rQQ zP9`H)<-v6}dTyt>N-Roc$}+>CbaSUT6H*IQ9+on^Krk0M1?ukr-H<{7O{GwvMf~?1 zEnEkO#34gv>;?f)AV(b4-K7o^P1f{ah{{5UFr*moT(lJ#JwKi&I59n5zfWT^m3 z{lwzX6L2DxCEs+}`^rgEgxp&^Z7gJ{2LDEKvX+;ekUq*tAx$FfG-go4fG#3s8ZtTk zKM{N3Ziq%fmH{_h28lCpc3M^ZlgXnd3;p5XTTbxup_dQ_cj$g#VmGdx3J^MlZY z<|7xP+7_aPt}@nBPJxJNAaiy>(r^rSu6C=~iDof%BH%-Zw;~y9O%(!czG2Rg z^Wil01Pm|8Mby$K!ka@RYlUApT|EH}!Ww$4s?QlN?4)kLLwmK_hf=2cBH^`L?N6^9 zSJNC^k2Rvj;gfgI28>EHv~W&x8a`WzdzO$qZevKVHYO+%b2m`0lORY4RX)kB60TGP z`Ek)8v$e4fU3XWEq~?Esw*0*u&k1TH>j8Id8gn=-gk~^kq3QqH@Q0oP7X;hego9CZ z{ghh8d)0a^TNm|K)E?gB@l^EO7sxc(4SAr(oD}AZ5=EF*o*tNir|4|Qv*r0mI4Jv0 zk}rX2ECA3cb1d|{MMY`@9=9b?!rk7D=+)EeI>TyY_KLmJnR=X2hZ*MDDQoQQ?v#2~ zwHuCEDVwR24D3P$p z*Zp7>Ij?fBR-;QUvB8_N$ptl8cU?WolOS=o=b?Cqs7IaZltw*zxJFS9Li5%OusZey zsW8*fD$^aM3}eVe@PEhd#mljrCww(Lf-){bYWs?YUc_lWmlj=A)4(RCywfa#E?rV9 z`)bav+I=Qkt)sVt-E~!;~wcA^G z#id^@j0})}8xzm-7-2|O%J>EmqMa^-VedrQmvJ z>Cn{u$`!Rbp2D=J_^X0rQo7`br6IK-^Uv6I)j?yLl+-2b z)#(8={2FwJSIgyRqz%`AHc*t!8s9381{eKWn*Hum87tGSfdMWYjYV zX?n8koKfZVWSPb5ka71V|3F%QT@4E6c=P0@QNCstdB72mGBcb`Uk9JPm7v_hJV|GlK@ckeSk_QRi8>#!^2N%#?KwBpo@OnCnbOz35J4ku zK1h;BEbm5j-u|*$`7O7l0&5vJ{^SEDI z{^ovdl0$`Bi^qYL{4_g4`1XrHu>QA!+C@u3m>}CkUzE2xKbs zwbd**aY_pksFt@i*mdx?~7za z(+=sK>_@lns^Rb?2)w7tL3|;n1N>u=ItbEJ_j^zg4W!BU)M(4W&DzBY&30u({@q2u zq(xTBBFa7AeNV+@z}M*dePO-Hukt|kmtc9V^HALnK3V=5wp1K{xM{+%b?q~v)!i?t z@QM1J#O955$7$+qbPR@U-YPe=+uDs0zON-`}{M(5d_N1iCM?1W zzHV`$Me0kzcAD(#4um)$z37fW;&r3Uue0!m<3{GTd*Q-nP8Uzte3cH}n4V1gn|Jh; zoOJl>zmVp;dt^&m@8?bc|6TZaeN6rpKexf#?~AP#WM;;eHIv+TT_p9~QzMAtgWL`j zn>A}j-<%J8f+$Y938x5$djMw#{u5wK&d(2Wk2V;tc~i!;XPy#<`&ZRTdBDnYkZtS=3Rp| zuGr5mK(J{g&n?!K03UIq#{s*0CQ{?LxAH^%za8#?2seXg`Ad-i@)RSD{_gn*%8qpB z>F?l{+cU}?jrDB4qfXoW!YDUf*4NVS(e7OQd>Z2(h<#_Ego^{fJKY+B)b0)`7R-j5 z-)~nn7Pp(EQR`SY_YRpF>*f~qow4p@b3Ts*wU88a&PI=8-EF`!mzfWB8BMznjWdY7 zI1A(ReGpIPueHdow@8jLinKuOEgp?MgRswGk=C|rdb*4UqYK|^cg`Z4SbE{NOFgB z?}(Bb(4fmn?m<|QjY;m7Ncu3e4vra1MRyPU-D_r#NE%hq&67d&OmRoh?TYSLp5P^Y z_}k%BE!iE*6X2LBGsW$oOgu{7`J3lUy3Wyw{ zld6Ad%YVD7yGVin@}#Cak@{D6cR>Rm*K&Wt2P|^B@2KJSrPph?aicKQS(fzNp8Xog|f@nCrp1Vqg*>i1Z*mI+Zma7il zA>#HBVGa1w?z$Q+A*}@T?bd7>T@Up3?&l;A3x16gu>80N?(LFEz=PC=?)L$Np^K4k z;H^gP2-yBcH*&Y-u-Mng-QDoJHyye+6bZVUx+_wz#_oQm_prZso~8iE%8lK%0|w#Q zs3D_2ZEWW5NJE=o6Toq=iJM>5zL+Ut!FH)}?Fy}q`K-f6GDEL(+E zz87mfse^u{om)k7ee3#ZZ3q1=RGQRLa*yd9^;_{2`r1Wy%5s>ft75~Nv`Bz{8(PoDEs|{6e{Z^S8;nMy$zsnch*Dr>D5{15C(HQ!${wc zKI)8WSk=yYJ-MnjtZJZ(Uf(WPmHIs4OSR)*2G**=E_$ZpG#eE%DdC7E$!V@Bjar>Q zlAK-j@pJ!#C}l><`l72o7tQCtHy{ViKYT6L_Kiofu}srw;d=wZ&Cj|W6C-!EOv`D6 zM^>BJ(dE?a{Q=`)GnFJUG1cRxzDKQga$Kjkx2`U&Lp$o{`4F9V`l~eJI=z;w_{G}5 znwR|05F4#+kw!0Gr(a8}y6dlA1OcP%e+og>?fPA`yoVl0oE(h8?b=XOyqn#|{O;1u zl(0M-SN(?{@z8|#2iBo-OIbrI?&qjYlY8pN0r%MJL0yw6wU_>2^5m{Tk0~xXBk73X zz}ZW0m7;=l@I^os{s6~2GDJto#2Dlu>#Zk3fiv|AbrcNk&|-!_;J-LRN6Bf;m!huj z%b1T5ql*=S?}XmEJPWN#ur#Dqy>+j1|7!t03#HAy^=#*7+XA6>c&O^F_tg4RyFU8W z0Q;Uk`bU~Uz56YI($^QHGM5Vb>J8jW{9)5F%*apSKGVv+`pXt%+gkZ$S~88#*MnLq z&C1trvAyg^_>@Wg^!k+DPwx%K=sWu9llg6&dh6@2BmDPKc1m4ffq@#o^Z2*)HF~(e zUPpU?UhWSpok2(Y>&2*k`v84~b|=*us9y(y;l#ZnYn_jZ2I}uZ;59F&;b25=5l(eG z4H&^n;mp_1WKoZs^+r^7gPy4!pfxvO$6u>GyApnF>;AaIP6uz+y>1l^m*e-WrmR7F zTU;R+Hb`%Q^0No&9W7tLG5Oh(emXcvuM4D#8~pDU@7}?3@yxLC5zXatiF%I^63#6NS)DMwWRya0Hq+3n5b9 zOO=JXzoClqV(t`dfPnlQj`G6x5DwdpJ*RQh)s*uIlBCobr{h9DwHb#l?xVr@vEP#( z`Z|i5<=QfQ2-Bj56a{1~WohvnDkz$pY|32lpAOc61K`$qnRH_5tx#D!_Cy*v9zxB9 zg1~>V4Od_rj?w=2`o!C~<;^%sh`zHHd6z{GMHYusP9$WSNGtxKUylPUkyKa9p}@f1 z5PhfXuRun;eaj~)DX>R|w_cDNBLZZAu%Dbf)d>5^1!m|C+ujlu4a2ngxAs4W%A=!N z$S<4pPCd;R9SRgexcV4guQT)jpX_`zL+^mI1De?dK5`i|fvUY|;<{-mHnsXd)H2a^^{caULtp=Ft8o5d$Gj{|U@pkdLyE#Hq_Qr{n=?E6)hyMm-=_O`@ z3{&5R;cVLx1db3pT1hqI((O{UI5OZGgK{@i-kY|_C^|K*V&YNE+pe0yn z@@y&9emEO!WHFMo)%pc~oJ+ONWgSP?(K2Yv!3XoT#bFZ^$8xRsbE4kPY8%=$)=7&7 z!#0_Jw?0D~TJinedMgXN16yL@L&zVR-={wdZ{<(#gGk?x4%}B`v$03yHoKJD0{80; zuf8d)vPO1NdqiZjv&bfiE)p$bD#w}tQBukMy3fv`A}kbYp!sYvhStjIW9m>|<69l{ z&HdQ?w?lg4JPB3zgC8HC5s(|I6Ixr<0vIBiPS#sum$`K^q<}|%N(!Z;4BcGRzyQLAoe>*U`y(i)#Bs*qrDx{hJZUkJ>!|P52%f{(#<`CBFys^o)})ZHht! z^oXM8Qpg7XHE56z)R;O)Wa=Dp^yePX8;-syoDVRJl2G@;a5^GW=LlPRF?F&sCRB;O zE|nn=^uhBO$zmCB=ENup2LFRcOu@m_O!5|7ZKF4)=;@J3-9AOnjy``d8KJB&alcQ| zo3yz%YYG&_>n~QahhqA3$e;a{hA1l$H#E<6@y$d#>{6};gtyIiJRWksI6~Ew(eQzw6dCDt=b?R_JT=R_vsMYQItZI+!5Ls`=|+ z1^t_H4|){m##&^XF}F z$vvBc?1zvD=TH!7%rUJC3HH!0-il`X@3Jz!qB)R`lit#~Y;QI;TS1NI>GeBsvI@l( zRZu!$v&zSYJv{XDTK0V65G>}ApPNI?$Rh`6jeM<&3L16t(JS+Sd!N&WdHPlif7X1g z>vHP$oZiRrv4+Y>ZF4p?mAngd7p;9xNgU5ZCc)jEhptVcC!d#wjaQ!6n>5DN8FL3Q z{glI5yR4z5U)#J(xVcybuZKD=(=#Z2fj$;3J+=U5JLH^Spx*|ohPN#AO(u4N;Vfl@?kjpjxj?^1MHZ;)6)e!Y!)k$=z6zts%WSctVfeE? z)+$$xJ(4p_`Q`9hZQdeH*J!>jH}4NzoKPc1dFsf78YqS2r4M(PKm^n4%YD!iVr)4T z0S1NYQxzAAepOG2Zy*cVLt*H~EQvrj2YD+ccL7LF@B~T53AZM27oEW^< zQk`9;GGEg_bz_m6s&OC<+;e)XL>Zzo5DSl5t5;$Sl%HP^fam&UI^V{6eHkxU*`jr+ zSklLz*HaU(kg)La(-q-{Ry?n#H&lv^6&ESdhpE}9K##y{rM6f@r{B|%OK$e-dMR#$ znXbPvG-H9@!>v4jx!snuVMNEphmGwdya1@?X%iDeeuu74YjC z5=}CJZEwisp7(~tud{FHx1s~n**6B!#UKGoL<`buD|8RAtzw15w$|nPR5v1=v=5J^ z*+TuX*bZt@V3o9c`_PD$kZH=TSd;a%_w%Kxw0I>%P2_T23E4tnBgesse@jnbM9f*G zKY_<3tMqP+h{xZC`Jopzen(mZ^>_69Y>OPBjif!=GC4K|Sw6TgFXDE6rj#5|V; zF}r4uoRq>ryf&)><7s_`Ug@uK1L~stPa9V2J=t$9?p=K+ zK!T6;I~?;qm$$ZeSYE=5_?b>KS)zQM&!=rkbnZjFZ{nUW_}CR9!aR6lgrdB#ROR=- zE6Hn~z9TA)6&!N`Am~^()#6=FWgmexzFzU(M>sA6Fnd0hhS(;X)>7PUKeb=pQL%OB?bD z?oV6wG~7QDE%y2-eH(0SQ%U<$&!XbH6WCmxV5ibeXoXwbr1$%GgW0!Pza@Hosf_Iw zMWv4ns7Lp1(R2T5KuG`FAu^x@x^{&T4K8ojlut9{2(bs~4?5 zlnXO8H~|6-9_bk*_fEYwUdx=qU3Th;mczK2F+=#N{iJ=k4`g}G=f+Woq*?YmDcva- zTILw`esC&N+r$0bY&CnxrHRhpa-(HbYUHY9ytufxG-~_BHPJH9uk7@ST^DycY8TXU zxJeJdNm=Qh4(+LYRts;%_q(u@f%fBe>*Fl=ec&6+I*Kj)R{tE2ckR)K@Z;9KSj#LD;kf15@b3 z@AN!qV=l^H(kg{K-|HM7E%kel=t%1LJ;eL*l%Ijy=A7VU?lC0TDE=fdKxe*(@!@&S zi#>?4=bv-JovoZs9MRj@AANxx{PKR(r%)$df5Tsv6*8?U>ih=U=^koc_hc>VTQ4=* zp~gVXgx=8dA~INSJDQSi!fs|MHB&yJ-r~<`y3q5K8_GLyggTvwn>;tvap5RO2+5pp zF|fn0rRN9L;S<;VFW{bj#L(;8)@ngZnf82b5YEVZTn?I1YowQoe*V=?9R}BFgH6Fn zqYb?&EgM`X&ayV1N;=;GAFDxiob=s3odcc1MJDuoaz)$^`eqAwy^|{{4?>xYKw7fP?tfujZOu*(9mbjR0h)hUAFUmjdjtp8E1QqT zDLo9fwBtv;rDYis3GFpHIJw2puTN5+qk6J+%f1fuMzR>kU-R1>$i~{#DVZ-}vaU$Db#=dM&rIj;An_Q&*;U^Jj=rbTsigQfp)HuvIup*zpy z(xb=qde+saa%s}X?~P%eHM2O~g2(13^nS@F&tFpK(79Zie?o6!{q=05j@(c9nJXnt zfAkV@`)moVs?wWUrxs%)QvK|x`(iqL1M~q&3!k{8eCgxxj6nGXkA};aZCKnC-jR<| z-U+?01So zzNlXa_ucP9pu_JscXd+VdtG+={j}cI9dRiDBF9ZVkwfjGk7vfhJy?k?s0_4oh!$nF zwlve=!7z7X-6R@uzOR$^ep)x4`Yf5ko3r;fxEzg|SYV?)C-p1jFgJ#WnSKf!_ik!` zO0N}LJ+f0<1C;l>oZ^g5Xz_`_$pk@3m1TsgjVr{wrLpO)h*I*qeR_za)c9|85j z!66JZ@*1csfqa6$!6A|;e%K8`yp^gku)G&lp3ymUL5d1pka1RT5LlTNN>%bqAl zc+<762$*YOs~$5}Dn6@6JIs{JGtcUr(mP$%3NPE=TF8(zn5Q#rARWCzL*U>fRaW@;Ez0>*@8n>-IrT1${ZnsW@9n8BMxf9voA=?cN0+iegdMt6vc2tp z>RsZv@GM*C{Vf?_J_9M|95$5?sqZ+t>dP{APRh1%gDmaZZyHXa-ky-Ek#-c^=mJ9nW4PUXiQ6 z-xAs@k-TKnmHubXiFhFTMQ)IQR-(i8_~SsOg+|y!GIiEOnpRB1HKFdz+Nk7r$S%)m zVkA)fv?f|%{Sd2S5){#OHyx`*<1E63SFqGc47Z5efgGnSg8e>Y7;~?thpmG1B)BN& z6)3q1cO4?$Ow7Ub;Z_K-y>YIce%uAL_P%_pjY^&KZFI~kQsjsZgh!NM6SW)M9adk% z>yKNA(OANk7Py~OkL%P{8g3J<0>E$6L}&;0AGFZz ze}aAZVno2hSk5ocSiKKZ#~6_gy9v-gg;wXgp=!p66iEnYtf8}I@c2=LfB^Y1K(-HQ zH<~c1A@`y{M^2S&8yYRnN3d18ysJPaG(x*Gg?hV00$i|0xx_5^PMmOwmD&z^$t@;I zbSbrjev|~zyoJYq4RAt5xM8zols7^P5!<1a1q5JETU<1eRBwm_A?(H_lhwwk==np zaiWK!mgdJ>L|8x5g^Ln?+UT2`D3VPdZpJh%UUZT}oE;uwpLkI_J3TuY^B=!tgg{cHjKCgnNR-@d=%)+R=*%lJeoY53osB zPf1~j*~cb3QA`7xzm_O^A%E1#L~#bYvJENYnwL#WK@=x34uz)pMV9TuETnZ8vs^eN zTj>||Er=x8yip8T;W58R#v)nyyEtC#_<TJMT?(t*H`q$)GS7W}-BDcWF!(O{5^oO5wpn<*Y}ysi8S zMPuC6f3%kP2%+J+XNd+dTTIFlfsDsBly`-9z(91^EExKDmC`BPX2{`>5pEEU%+X+$ zIiIia)3Gd(sC`CSwn)8Ne#@`H63u;W73#=+&69%+IOg8wR+jkCDkK)m7Ih`S@dWt% zG%H)gb0oBd*w z-!By-f1{^U#B#*%>6i-6087HaKzDjGM~uL$grIoYvi?_kCn&D67+Ey?;X8U$>)L|j z$g|q*wy>XeGz@bn^hs^ek_&0~pY1{Gf5tu033bnTX?PuRgLVC{xs?6M(3Fe1$;-X) z+oD|2-}2A;RInM*h)Q>)xoQ32?_9L-gTlrXxT>kMBDbFK@shTxkA?o6*4G!X#a7I0 zAaG@8A1!W(w?n8=Bk>G^)2?d-#?_njMxqC15e|$rsc#!NU^W(4Xgb~97@YqXdZ)4I z560wbBGNOk)2WpUAS9_dBHxt)lK36mo10^rpVGaGX!v&$-n~QkH#ZlYyeSJwc&ZwZ{`3vbvbN9S z@Ug7?=Vn?HoW(@^@Tu_?q9mlz5(X?m6DhM#+`lGrl$D$y56bMPuLK68gF)S%`- z;b+xQw#*1Ip#_*rFM6s4_+eNM-rk~G4%pj5upDf9&isd1Af0Bya)?gI`prW-vnP*-GR}F^2Ja5sNVo zwSoxD6*^Gqkp`(W?i!Im>CJ>U#Y`!!g;?xaRE^q4TZ!h_W3pOfat2YTwUC$Ehqo5b z(CX6P#^Fe5R9!J9*BKS6JpEY|y9-B!Y=r=w)9v6e73Sj%w+D}*Lno=kcIpP8$&P-f z)3uYdBkxowxcKa)wSGNQT}wY5uC>T`EzN>QRBLZ}uZ~m`D$3i6G0fRg+lzmIvn_5f z?guNY)d8$|BW>;=#sWuMbd;$2U`L6nFLacsdaNV%Z=KqPBtLsNB>I7$?FdO;el#SJ z)X}L1l3w3QM7yea7c&kR^?TpqrU&r_C~Gn<#WKKr{*H0EFUz>hkdKmaU4*i3<%P^B z`%@+q&Bt`rQIHW_l``ti)}G(PuUW6fnc+$I!#Q z#1$0ZMMO)s_B#@Lzo6vV+%A%>_3R>>AKyh>2X0W&#pG_sEumSGyQOv&Y;rIaP<8wS z?&eb5ZH^UxoqU0Ybp;|7(~PcC35$WR;SS?ToV#^}a@B{LbQ5jB%(Bbkcc$Wg_x-;# zNu=+yGVJtRH{r#H0FCOOQJ=o-2Id1s)?EshL0Y+r;Mez6YIdyK6slRmtj*^$_1tbV z4;#yuC%TKPY#aU1JGXTZnbhT4OyVI6W}$A`j+uNK_~NyqDR5=$wW6E)fD7s!vBZsg zh-kSFHlRfv1sqg+fZTi2v>sw25avt|xdAp-{LVaibBCIQIVt5`R|ALEWUZ)yLrrVo z&{2HB=GRQM^B>}nbpH#pJu@~=O&p?g*Qw1frKgE9vv$yko)Tri*8)Ms&BDAo%v=I) z(^t>teVjh(DcRr=6bCnSUoU?eUoW1-Dy+I5+rtg?{q-UTs*%=9q zKAvWLY^VA%9o^ia_B>CDN#51VWRj<=@$X-~L>_q0AHA?&b45kv#cggcTujNF+LOVt*tznwEdj(n+)P z#X4vJ{h^JGq(zUso=PnSh~^Gdfdq=kTaTyF;{!yS_`{DxhY~{1zop?` zBDAuyg14J$K97|hjTdN8x^Thv*Z_&>Hx3kh!FI<$p)T0kX~S2uk(hO)KqQMB#7!^` zJE&tCVrlNZL4+^a7Q<0kUb0OXgyp!2s&=ON%-llq6YkXx9wgMg+Gv{e&{xVYHh+|; zM{5QNwj0`ExRAF1^m@HCmmLSG8!^Oa86KHy35&1j?7*P6+8w7`^DkH#bIq;8!qQ9b%eMZ zbCV|Hd(z?&qK_O@dSv=It!2*aDqM!VyRL)gkGyp9w&ET9jxY9+4(AUI&!m48@cCw1 zRR0B^zJR67z`qa;<6nE<9MA|<}48edp6iA+wgKLvlyK9P4 zxH*|l|Cn?lK1PPtk~YKh1)>h>)VT==K9VMRj-}A}n?y9IX*T~o{U+hYHf_g2Jgz<< zZP1-Xb}H*xfK=l*iPW00XIPdvbdzYTV$YNn3~8#RxxoNY&Z zF=L0{?M8C(S6d(mqwYu|{ZE9s@O3`STsB?xkogykd0=KvHR)Adqj5{F;)!LwpUb)W&LC)Z7md!ZS#?9qDXO02dF%+db9bd)N!Inww%kN!4t*R4)uke zohaJ!yPR8}hU5Q4k>FfofI{ew~~(D zDXy@b&!WIxVif;Aa+i3n#>#jr{cf5#@3*A6Tj~r>L`p;$k1nXc^lowPqJ^oz!kpG> zG{UG*@ymTMWT2#LvS<{BjY^l;lPmg779RdG@&WOX{gJP-fo$Rd5uko^2c}W_6i}Fz z+D?H8hVgir7@0PED}%QEVh2JsE@cn`Nbj=iLUP`7F|(p!|uJww5eER**{rs zK`S{Q!>}AT6T$)CL90NpJkibm@&c#&lupGnh0Xl*aES=nS9~6+^-T%prh*QZh-)*> z?#uGd(L9%1AuoQ5xw{(V+>7f+zUa69|bGg zxt<5K{!M_gtxI19MFS|K9+e|&^w7`_^!1}6j%#@+R4Ovcw)GBbZAo7;HVq;6#7lg~ za6>^1uCKo4wb30X8aU|K}|eXH(!oAYap)V&Ztn6QB4aL>-q{opW#V$Iod*IzP|M12zt zb1YaHf1$$02paaDB^smflv$#+HFD#jTGmXGco_SNU>~zto2t&arhb8Az)(^Wh|sU zb3}|?!5Hq0SX|Y4Aq+_8knndXrG+>st1N5oytrRL(k3=bjdXH9C0tZ?NFZ=MHD4flF?{0T zq7=?D+rWF6iar-zY2mz6iL~o;ApEqQjPQTW3#Yy)Ry36Jsx`1gU2T==F>rY7E%bik z>Kb%HB;b&ud4-|V&-3ILlnGxdf58cldFNIhU~3^p{OM(42na_~(wQ=m=tpv6@IBdb z6i&JLTu;CHWyT>C#>(ZUq5zFat| z^i|>D!EU%ZGnL9;#fG$Tew?b9jG%eK$2?9(P3JqErSwtm{u;6+gwe_VEa-r zm=?c|6Cb(fbnsftNZQyK8NMhPq$)L9&IQlWkQG3I^5w#X{r>&s6550@r`l2Z*v_fc z>=;hSHQpQ4UvULcN7lkK%NzXw~?~aG?*&FyTF>|B2Du68&=4%7p+h{zOuHv zt!l1ng_v&xVq(i}eGhVEf=SL^7N{|LW8FEIC)UBxdD_PK9i;8v>jmdLOxPRbHR ztO})OlTM3r`)vWtr`fKnVKB#D%$F%K?OG_tvoY&mbEg@w&P z*zdrafd_1NDY;1hU{b#pbTqI=k;sIspuOU`P^uFlA^k zR-Nri-U!Mnc@GG97?;^Wzg!uUK*FqSI^e?@D^ghvFkCtRebLdr`%OkRFxF&x{e2}l zV3_6xwd;LR4>)k{eYu&hTnEcn`ON+<(odi4PUUOFY}x5lkxs+cN=kTett`pHJMCSI z&9rzk7v}mnpPfvY-p0P7E?{Zrzt@uFLx!t@w$EMKM53ofl z7|(p5`1#61`5ZA)-Y;uVstd>Hh-k5V zJ-C*nS-26pj3DLR6ytC*E3lwW<-bIRO$u-79HB>W*V8)cY#2* zf(;7lm5~V1j)634{UNqg#V|oTNwob#iT&P}uSug{KNQWFa-^eh z>yK39pz6s(GO2Y2z(bk9*X1U&Egc^K~l`-wF$&K%-(r} z?XISIPD?Dqou6a zX1l_I=9LM48opiZuX;$X$|Ed&!GMftDR3`07!GU-ZKNpQ8s=?14P9AE@fZGWa?}E=Iwm|Is z+`j58D{X%*Y!>d6O4CIfM00ol#Q85=QQkfSf(EsmHQDcp3w z7O`Ow@Qbg*)C}e(sX39ni}Gwp_a{7&4OC%H$8SU}R{G=ydKVr*)U&_A_$iIzzY~a; z6BV*5wdQ!yRjk&O^z7${imf^Xe);K@??jx^v&&#_D({>Q2e$e~Zwh=b9>ulx#ovpD z;hpnhx%KrEJS?ePMdVftIi!o8=xTNx2tDzmBM{Xj%9)|2!B1qRy1=#<$~R(j_Yv@UcKI4znxkNpW9Ru#>m$)|C& zSwUr|#UcAS$;B_rOe6tLJ7Aie{(=Dao&`rzN?3IxS+w9!QCpi&>;J@I@*JAo#E=+K z+rU+XBGH>}JBJf%Q@dzg$8eDk6O7e{U?umSYEF{M*v{91lq&x%%{dQ~+hN*%UJQ`J zYP%l(XImKo>v>x`U9ci;pIv2qjYM|)oAssdG-JK_=W&bi32+6L1z*KRtI-vRQxRu3 z?qCGM??ZIjVXV{ERlMgk(lt|Q_&VCCVPB0gVxckBiZQ|(L%W#p@ceXljBykLDR8m5 zrL3Ss6D^q_R3%c}nf?xESegjiD865ywL^?u<4woY*)SahD0-i0!|_CMdPcAB7Y*qd zkI_-R&?xhO$aOhcce;Sg8^s!IgoKgyBDpn=cE=jeTb|CQ$_6%sHHAXpiJg#;mG3qyw_dM)zG3HsP;T!Y5{^cri22oam7lOw|pw`GedV&PcsFa48^5o*$H~m(cIqo}7r)Ikhh<^yj`T&OQ?`IYBb5Ns*SV&r*zN4XXtPoQy1!My6yX z`L)lrrHOaVN~0Uoj5{-*V{3@UI-80@Z&TJJP%wBAWSJD`rBU9w2(VS7OjuM@rE<~@ z2y@TQPDZ4H3^_vyKD&<|%rH8Ede&uN7L?tZ_Xa4l3$y|BQl>G*{@T}U#;>O3Od46s z$i%X-%IxGcOw152q38x##{A|}Ph#6ctP-q!W+5L&NgOzNCh}ID-gK(+J!v$3WK}{9b1;Y? zIbJCh5Q-SjV4f?v@e@c@jZ)f?cOF7HuBa>93Q1$F$vysA&!}Y{c0{bTG-uL1X=JHy zt^4UGpPa>n3B#x#r&P$~1aG%C>L z%-h<#Do>q$%NPBr{HvkP#HbuFZk&49c+H>M>B5?)HZjaIs0D zuOi1m&0iIMJ7P^k(1j5+lXl-LVk!Sh!_RB2&7I)&(?eGp8JIR8>J3ym4B>yIVz6%0 z-yiYGLci{2Q$;m>Uw974dzZpKI(s!R9cp7$G>(%X|M}@e24+-o4aSYoopIL^!UxA; z)fesAJBHT3i|c;+bq>f&LvW-v@M(eTTR6p1v;@PS&m~E}axG6EkQsT4R=9Y-skZ!O zhh!mhpQJ12_w7k0I#kM{(S5mu<)l#T%dnAn#*Y~Dl}^?DjiS&UAtX(Pg&z@8{#ak zxXSCC>uDQT7P~Z6%dYsmqcKFYV`Za5RPY4SevIg9#8JOa1_y&Z)5&OypKChfXBpko z+1SJTPBb|3qQ}$xWtGR%G#gFmV(e0{?bN)JkyA0gtML;jkzv2|^$ptk>CW!PO4nnE z0TIAWlVUq*Cv)o2fNPDL5O$>ETB8TtP_!Nfyt^wxJ&Y0yJY8buK4m0TeACmI!-CI* zUdCE{Y|`84r=d!5A7eUxV*45mZQC?HKb?kPz`gq#9T9JFR$t>|1TM_)h@;cn@{M=3 z-W9=qMoYdrJET8`@g&XdZ`_&ND;&)w-V7D!G4IxJs6aE|P#op7`2|;$1{myaGiCr9 zwp278XuJ-`ql&L@fV&M|R}C_rgnP^6!A56oFRdMHuy=aZVB;e-CCDH*6@hHG4KW@A z$o+?cRXs-E4K*5T+bZ0{jJYyk3)H&T_t_Ue^Lv~V78xCv`Bvo2ZJ?7mQ zgm1yTWZAoO8P{}8rTcC+Hez5MZ!z+CV3Te&Hsi6~XyXcgoH)kl zj)?NB#~4$wT%p^H+pgTW)%RyqRMemDC%6->k z$-nqL_VC9Z0+x-gu5`!i1vIJU@E7scNr59F3F5JVfy_AJfUl(?;-nORo;c!#4U!qjRO2U zaJRuxW7|;4J+L{xd$+{5y>}bzhh(|OC_r1`7!wg}HN#Axt)hF3Yf*6HJ#zgA+-nff z;OM z!gM2tdK4S2@b|x_8^No$h5RG`-Bm~mofa)t77RBMt{Uhs`zuNG0CbRzd-@r$oVQ@P4EgjIo-%~N1)mb#qrK@ z$&^7xTi4eTXnFf}$_(Ri%&az3&g{2QW#>-Rg4?Zkj<1%-6WU{r&fBZvj+sDe^f97T zLi%p0g!J1|Ljbz9vn7yypEeNKj$U|L0{Q*Z;I06&;928dEdthebB#>91dGnk1wP`6 z85xgT`-Fa=^(96v|9;gaGsgYqWV03XQc84lpCHi+B#l&$`xAqUB$fTzZOBg5{IuaU)GI=!IBY{jl)Vf@wYcKuWyWL+e)ld1 z3%5V^VTyMq{q}~@(EPK`3S$8HUlM({!bqW~S3n{_XpI#{H~iEtH#*{5D*aS$1n7x! z$s1q8OMLsW90n338eA!hWU3-_R>~r)R~k>C#}04890C!d*IVe~hEPD>EQ`)zHs^gr zqlvffN^!f@^&0PZT&`JkTeB493<~yNyKK=-X$UraeC>kfv}Bc$9*-4ViRG90QT|f| zKSFJBIpHTpk9M?j0rr5WXv+el4Sl%EsBNjrrVei#S6hC8tJB-Y4VK^JZ-C~#ZOpLj zNA&x;(6vXrXQZWW%r;}wBbvWt#1OOL09Z12_klE8@}AMzw=r9>>hSf_DDS5%X5;GL zJH{bxKYd+c^`;GT-WhwhYQ%3W>b`X7gDkdz{jli1vXKBW<>A*6qbq-Jn-$(w~8 z^qJMhdzR0#Y0~YFaaakCj0o@4DjI_*C3jf|%zekm#a+Ttbzz2=&~Casw8hoXZn^~8 z?<>x|2ZTdA+8UTWUPYF{>-we8b!#9VeNWrh7#Y^@E$OtQyt8laTH|xemJ7h4W9yB4 z%ht=h+jg0E+avEd&xmzlRW4~IPxZ4@M&1`}Fz)pGFT57>!wFDh#pfH0Q#Q*Nk&-+a z)aX;_YRCO_-KR!l{=NTGtnQcD^ugCgs=P;|PHeuU^`9CknIE}0peo`x6y~rKAzWYG zG5j3m{m4ZdJ~jMxH2ih>GW^B;+gM9-5moL;tyQ-DrEINZSzc*|mPmQWnmMDreEIyE z97KV~yR5RGtf_DS&3^4?FSWWot%;}HGA`(-gF8y~En5&%3O;fZzc6xZxuhbAxHaL! zqUx)=K^q0WGW@jh3nO-5(2kfR){w0a>}1x^gOhS%teolAa(582P<_jKzC^@;%fAD5 z`2;%$e=(n;)l<-8K6?T&bjL0u+ap`?sISy#Csfp642|AtBg3{yjv8YCv@8 z0*E3{5~4$Y3(=u!h~C&GC(LvM!Gv9KU7S}sz$` z$Cz65YIetr7SdHs8#f6RZC>bzPM0oXk8Zg-Ac~oGGjEsRO8*IQGVJXA3b&3 zfTTvn>AvsTx=FNtKf^X zCxZizbvXaxsSm>wKnBAevN05#Zh0%|ge!wv=_b30|-m zwk(Hj!!9$+iWA`!>;V6qJsf}5nob4#Y_+(#>1K0NaRmGCno~|~HJUTUmKx2?Gn zf>6WV7GIT8HuBBJn!ODuq(0ABB{vpy#+vgD+(2c{*eava2Eqw?fpmeG1Sysw&eMt^ zzOp09X)6SnpU+Sr#<$+Fz;YD^TXdB@76{fiXk$DZ5cE<>-#*Es)LJJ<_;cbF z_9%7Qr2+^9+<}BZd?22e9B_iW$A<3=2fUy?48+zw$dRhU!$9+Qt6uKMrog=vNyG|s z0yvxi_8hN?qcU_gdWlDKUhc(=KpN=pqVNiJ%vtZwT=gK1X?iZcD)F)l8x!k@tSEyGk_s=ZjF}A(Vghcpu(3*F zE^9p}M~jWC(Fdl4dS5j-Z9GDUw6vUslRw8K_*LU|eq9SXFJf`%=7*@loCN&N(+YEZ z_|@_3$L}?TIkEWJh)2(boI%kqcmp5U1-)LxO?&-HKRxiZ%@e1Bc+0D(kn34@_R+P6 ze@(l?ywndNhP9>2Kq{7wj0+2{WwgamEnOf1I+@dhd|9W7>mj3_C$f|+;>wyjWKM#!Yy4;SPiT_w- z528VD4i2fUy^?Y**U9Zr;gHJW=#bd=RUowMc`NR8Mu!qL%Ux4@->ac3zyleif9(^WfQ4+3p^GyMMe96&2YvS2Hhg}R(Zq5V8;VZ3RKBLU0R8AZp%vd*tQdC2cEJTiwO2H|s;ks+V%`KDTU7=K|X(k~2 zdNj26MR|*5@){X$J?p-ft|GJLG+E3a`sM2^PDX^nW+)C1vl1zf09NEHjRu={HjeTI zZK0@ZgVqd;RwYztww@7LwshGZC<<~5w`PXykgbK+iNkiZDZ&JN`b`pypt78KMV`xH ze^tDj*%x+nW?wQq8=AZeO=j|FeAGGf=S(ZlUxB50DlR+^Y36r@!YO-@iBnCJmm1Ey zDL|D+PQ=pD%%5Wr%p*&J$a+o|op2x~@ZhtjYh~343KGgzb7y(==QM}4|Ke<7JDbB`-jUlyxLCiRirntVn7Ic1oE zz$27lMuI_X_~;1ra5NZ67~ds_>PWh17#_yu=_0L>nmtJvjjGFnf49y2x%MUW(bz2B zD`W;{h`*FRREP$qk0!LB<7P!4zWQ)k;vjM(LJ12fjzC;XfJ+mb z`jU$Hxjw|cU~C|+8|@4%2$D0L{j-W4(7XzD7M2p;LA7Ie8j zw%6!jJW@YH9J=Te-nIp2g&>T%3D`1%PKYLK@kwOKGNwrsG}QHy^+NB#KFOlACj&yJ zGsnY{5O^~Bl^duRva<)<5!{PlJL28k#vT@p(FCGMUYnDI@?e{Rq>O;SdoUR?R#Mks z5^CGK#$p|Etf-H)F|kp>j zkn8?U=U#N~m)(0axZ$XPw`w%%V^w&Sfd&F5FK_MITHs}zbtT%b|y2W1v11Yyez7G6z&wKpr2m~f?L z;k6y`-Cc+UvD^(%FjgL#s>w5knwZI;=Q^o=M$}a~YMvi8W^=3;4AfHeACB}g18q@r zpl05HIA(h4UXm-MvIp>>TdF}VY3^9CjCbl2ssWAzb$Rq&o|CcFXiJsMCP$Q-- z2+8#-#aA#3n6=2{)GSkUQ6W=t21>76Akmhn#LktD_D_Y zB1WSOsCDTWE?c1FF%5J~>ah5#tjk&&*o4H~gl$J2Y&ftqgz@=miSTSf@+eEg)iq2= zMPWljkAGuAV&gayElB)7Fd}&_HX^|oqf~AWn^meARibJXp^w2pfq3JC&I?REl0$ki zAT}k2H5uhN0X-&c>bXV{sxly`6=JlC7?cz#{X0`n%>TvI^(`J>dmt6FpA_Q?wUKWS zhj!PtG&^u;v7JH>WG1CBwwVTBFamaH4BBDxr9}@7@}>JFYN{q>5IZ<_AktWLsI7AE zFwHydB;d-tGcBivdB=Q%=w{1UcBJte|lIa~_|BK&TiOaKf%4?Ng9_qL8GCxeIJk@~?^R zV658Br7$6C`435a+YEDw2Wc3JAkdpL7pE|v#9jtJWrZEHhdIh z`h+Pp8}48$N6+(-b9_s$&mMq53JS}O5sIM+YA+z?Go$MMpZI3wENqvP@+_b!zp3qa)<3xp#5mb^btnE_9=)3 z;1xj(x2Ao{Odt!j4{VGLRG&qFuAzr_+Qc1SsEKc?QSfpmDwXUBt+I`Z-Rj!H-guzr z_%w&qegjm{b8zr~ld0!8ljg<&HJ;ZRVFgMpt_V)6xZ4yj@Kv3Q|GiSA0%T*b-|nmKOb-?kies z#gsV%vC>3u2ak!BoH3r6W^BM2w6n3^9*CU?s~~0%E-(>8J$Dr5jj~f_i&An0E!O0Y z*6yH99$^A_BT9N45he$2Mzg!$l+?`RC9 zZciRUW7ynYc=Xr?yJ6E)W45DS5u~dBrlMCmaB#DTQMytvwTGXJaugI3ednQV+0dhzr@T%!mxN*4|Mqx-lYLfRA1QfV33QG@G5%wV5K){F}DLZ22xRlnZ^ z@6Yk0kZerrW3c8s&5y{FfsY}azp@_0<$&NyVEs~- zhCkky>?I0ujjduivDol9PPtT-6!XGaCtLey<*4JeXx59rHtgj>0$0iFnK$h+yD}3A z^Rfq^l3gf0^^9b+^$JC#Ruu3l0ZTwb5n8JyNwy`g6;0rxssU<;m0<(DB`f zqWRfB(&8j3!Pz^H|JCwtogM$sg#*XK;9TeP&E;_y4Q8F-65ww@0zF`?3WMgqvTU4Z(PXLBWUMliZxZ>2U(z4brGVQEJECb@NZ>^ryE+dAGO_*Dbj{t>0_(b)KAE38StCVA)t!gM@LpmNp zPgi*(Z8?te=X|PK?(tb(HLL$%$U!vU7paX11eunTE2!#cqmJX`3JKk!eYoMwf9BJc zeMVXg{tO-Z)9d|(j^VL2Kkny8_^vWX?gj%8vqNlEOBf0r1+cA14hd&8X0M^w6)>S6 z;NSf!9Xo`}v9o`up3nvSxi5!9$h0h6u7Fv%JPb^(L;fwHNp%%3LmzXdYYLoH*K~gV zhkQQgv!%M{@$=HVt(=585=5S2QVCdeCq|SFW&H^y4LXX+__FXe|N-4 zb#3J5-{#=^+#lh$yOSTEcpr}lP@35(#ijF$&9k|=W#Q&lmGa}(@Z*Q_>v4X39fiM? zj|m5jG#5XfIDo<$tvh9;xEJt?!=JhMMf2Z`ls-%N#frIHB76f)%`S*nx;KPYafy?= ztz5#qh!!a!eG)?Jxr7{{M(4^sDXuO2V)r`?<6b}^fjU*ikLSaWuf6HOW6mKXtv44w zg=k=C-#p5Xv@g%>Lua|fRs=;w2{Tt(q=Y=K4^73|gRr~G`yY2d77Q6U*jF44SIwI7|i-cQ!6nxU+F-HSWm2P25?? z6nB0BuRTyX)%7|*KOu2J;?8P*{(--nxbrc;I4UaucT!!I{QRwamdLY*pJ&JhfIMk2 z{P;V62JWP}_^FboU7=3nVt^GouuD!Y#!^i>SX}9?7Mji_PVMEj05+w%=JE6U2N^k! zuK=nwXr2D(R4Ei=&AP$f4$?-|8w6OR6#nywnXgqNY9 z;$=lYRWpE%HJe()P5o*za>*Cv=gaU#lvHiaI)=6+iwz>kvs`=yRw=JR=^O=?Y)gK= zOj{_a+A2F<4cFP4aGhYd)|f+-ZOPA^c6km@OCa{l47YViIad+z}tRdxN3&wJC$?#}iKycv2~SbA0V zAyw&O1q5tSKw&M!B+4u*2m-RGa4hJ8f}jBfMOO{#k{By0SQ2B50`H9)V*x8F<^MVN z-ZwLgSn~b)`~H6=B<`EJbKkA!o_^1XY~zw^Uyvn7@;$}j=eT5pD50qb_Lg*coeLUe z71Ngqn*e{2k<8r9Ro+ysY~B_wj(o%=AE=UdKipd!Ilv_cRf+a5Akk~@M@ij_+&As| z(p?g+}l>*}7(fWo)AWTPq(Q1}6tJSR#R3QIfl_YY)^9{|EybYa##Cz};OxP(i#suBT& zw{Xc$RU&|JEth;DN+b|&=7MX*86f~+Nn{%r+^i0bfWqgvWUVS;C=9>OC0pf7w||3; z(r7DFSBw&Yd_$dg|#}Oy~o=7 z%2(dqZY)jxn--uqs;tFy_P1cxuA@2M?(J#3=8c6+R?)zMGy})A@uAlsSd>RMum?;i z`YOHn?cP&*pcd{g;eVd!lLic=TJ%-;Y$A|OE0^K+B+LZjy0aqN#k``H6NbQb9ZmRd zZ)g4M0=o9Qz2_COxMJR%Y>nxp>01YG}{L-_V8qRZ_a zu73rW>%)65;^*Us_kNAK4<6Y&L7TtAZzZ%>S6pWeL=P*Tv(CYzp;EK{py|&dZQYSC z&f)MI#T4~eRr<>znijWv(GItjM>BteYj~>%dm`dDWE(O))(Cp%-7C+4=p>R3W0bVr zf72N6w-GHnLFTHFCsJcH=%?Kt>jrHd&GK4py!QZFAE(>A)~|8LFwbY*t1WKW=Cg`5 z-&PHIJ`t2~ULYS?9IOvL*BgjOwB=lc$EYf?Vwy$Kpmm}Cu1-&sSS|SZ4xYG>ceunV z_rL9qYi8X#GD@xU@^-t$0waN`;KHNJblU!8w0}cg$ht}M-~N=(2q1RWymG5K4Ubrp zkjdv@xz&zdidaSBS6B2-GApb~D$cS_Lt>9vS=Lfa;82#;PEDXgw)K^^m|{8Bclf=N3_Kd}@I8xA4#-rxtJ`o~Jj}I%Xbb}#OvmS0&mi=i z8Mj`h*YYhJ<&PF%m5`G~u2Lt;DYQ<)QcWzh9@K6iEY$!yvB-KEy_ObRM?6cLE|SfQ z^ecA&w;Z>Xp#Nv-AM$}kipgFt*VS@Rb?0Dv+IK=t%lcRTT8_)KjkBhDsCSu_>)o8I zM=N@UUHKW_gtlgOl_glGU$7e3r6>_D@>5U5O61iM$eQV`ZuwKpSre@Zg zm;)BAC#`92JuX-7YI>)IHC9_Hm(Lc~1w{Skl@m(>(if0E5f7CiCfuHWvBTN3f4Rn%7Rtr;FNJ>yeJUu$?ut*^@1t zOFFoL$3SO3;}I$ND1 z%OGPq5KrqnTOGL5<rnL+Bb}5infB+YB3h(qV8CxhpDbRFH-}Sski1i%qx^zg5b8UwZN_H+zGWvOjF*w zAC2x>pHCw{dAHNbL17P-&#-Rs-R?&^Qn&?tT3J9Z%>cY0;m=I$;wakv=i3n!VWyR@ z<7RZ%{T&f*bEXyYjz@h&cIk*%U3bpJ1n)wp>$?@vi!-gP;vL_zn>h4a=A+`13!mz~ zeVL*qy-Ub{k(H;NeS6nYT7K5rRK*rmjYlVeQ+H#-y_?nn-SoI)>?VjOF5z6@@ ztB3bw3_VQCy9D#Y^0p9PE}27St6;v-WI#+`L7C);KnJ<=vB{jupuDxi=@D1A3YO`= zE~6(tYhUaOL@zHx7U!yIZ?*`_n=LTiN9)L#WtHg%?jmze&TyIJb<>6C=h3RJX0~=? zy*8o}C#`zmR3x-I(`tG?yfl|u(qSad4Poqw>-taxm~sl@1xr%103(AwS8z}*xCsexibNu5px=yFDqVN&(qSl$V~*vuZf&e2^G?z2R4&02}D3{Txk7`?ivp=C;=loAfvxIBrLt<*LgM^3pgBhD_v2+#=V)a@dLFKXxt}3 zP0OOoM!TGtQeBhv4!Ph7+p=RKDN3O&cq$Rv9bY2 zd&nxmbiO4VB?Y-{Z?OzFC^gm0ZiSd*w_rc7{H--x#~F%6^S~o7wY&}f-&v!y@H4f! zY~u7pzs#X2R{}6=>33IJXCvOmJ6Bp~;?egiQ1x26^(yOJ?M^y;6`0&R>D0N_Jaql$ zT*2~IC9Eqkf=vnQIL}4{iJG)a-_Q5Q13-}&!|FE zi|T5vC&7%3nP-jDB7gnMPS6H5l#N%5p*(lBb*lccht^#3K{Gn;8f@&xw0aG2*Dcq8 zpQxps*I1J=oX*#RDZG;s*NRbT^YPMFjouydNeR{8jmfN|*XLUUw2hRzz$$YVricbF zuxfZsa@rLX)5{C2dqQchh`LSy&%JLQ{`eMJk5$lj9v0y+JlyquOp?_g15dQpO}Vk9 z#nfWG6-4d;tAYnC0&i3;5*svdk=UTDW!5153tX^VW|d+@%a>S1a#@xxvwo#n4b|6M zXK2kH{pU`|fU={Y(~*GER7Wo@wpyq9Xk0G(cxAchW72)8K8idZCQ;~S5mtKVjTXWo zE>#l|mlggeCZam}r6)3M8^Ws8J_CDd)#p}!z0snJKDQddWQkM*AMdd?L5SV|1z>Cx zjk`)OWh1bcc768Z@l-u-YB|li$vVPY@SxS!U&|_!$F-F=1d4+QuHcI6LNv_H8iedz zU_#x<*|2UhGR~CYGTNetfC3Rv4gqHaK3I2=6lfQ%UI7~ZDE;jrs})73-RC3sR;$?a z3WTltJ#SV5V@Fq7Jy-_4c&oL5cC57S&pg^eT18gz&pO}jl&tr?|NJ9w^N~N7;`Kl+;@tPpsM%}F0`%BwtFS2scx&}BF+h+mTVr*UXkfC$ z0R5@&U1H!s18wP=yTrhO3tH07yTrhO5L(lOyRELr#0vKx3oBqf9jq{thOe{EJQiv= z`17zr`mi1YA$;{i2*D;GgtCU~HUM$`Oso)Gd7oAOW0*m9mWdfuFK7MUIu54^IPND= z!+&QsgxM@z`MEXY$B(SW$quW}8E^^}+-p4`C;yX}4utyW*{*@la@TBm4IiguH>GN*)gKWqh6mo#rVk}WR%05mD` zh*jpV1wUloHlHdVvD#s91|ucopVkHXcN$&)PwONa)nGLT3qP~Lx`N9t{?HoE&#FhQ zw~%%;{Fv3r^POe}>gQ=yU>HU}1~##lW<7=@{2;A)3@q(_%5GOsLf3y}6;jdT5Kf^) z*}Qs9vp^^cJ(SPPqV1i&%%^i62ZQ)n!{W!m4eHkxiZE=Hz0DfJy>0i|9VoHQn!+lC zny;;a)Zz)N6aVtg*VbTu?)KYV>FFn|2by0~D13mSk;erD>7<50rpk%vFwMEq8ZKy}qlJ-}*656ZQ zbnLS64{Ihb%)FQ6j&vQ4z++wZVM#xI2?FaYwB;SK2HRh@uGJo)Z~q1m`Gj`8&Y~2J zc?+tUXQ}Qjkd0>>o_Na|s{NwJ1F_mz?P1|HBjg15dP^ zE`C>R@Ud1mJ==z<7AUjC6dD;rT9zQsh74R6P})g8pfqk~T>-sgTLJ7ngxW#WK511s z2xiNc9wmiAm7XSGDqaV#foCnQ%%}Qf`n?a6paE`#DuC?arnBC&`uV=jK~>x!y7xrn z4lJ>|Kt;XhJqS;Kq&2q=MUKEy`yP&dyZfo;rDT@bEjYSmncYv{Xww~Kb^`(%o>Fd$ zc()5G>~7k4daS~3`GZ=m&nxT>v9ld>Ybrb$j66TC-SVXn$TQK7dpvkm7^PS3Ezhpgh2!!eBXN9ffk1x1^iN@ z3v{9AQS7Hk(S@uny{N(ZH6xh}GBkjmKZKJTb=$3w-offXjRznlP5c)?d*@Hnr}lL6 zM^}*%xT`*H$%c`1BYA zVbnfo0~gTYeL#lmY1hjWThYM%K%jyo8T7(_K^6YKA5;MvkThND_?bf%fFT7*qIsWL z30nW9Wu=Bv|5e6NqF*~h5qP-?rQCK%jN+oh=~3K&7+PyVn;0*TICAs=Zav}*pok`Y zn<9+#=@IKv`tDmRpZ&_&dk#mwp9WQep0XCs&D?UVbF@kv%L&HB!|`j;DOnw0sd z&k?a|KYP#(7<6~0Fs9FLrQZ{g+{Q&aCOR8AUG8CjI`gH8T^ZmqR`2gVW}1)-e0#uF zd&mTBh{xuITlmVv^v>-J+U*=>A}3@!%mj7bIq?G87b-;#Ij_C`mmCLT<>%YwG&hLO ze*R#t$d8J>i---JVOCreUI%OIi-y`h*iCb3%xI$v744YV?3WzxNiKz zR4`U0_S>}Cu+J4CTjTZ^;6`)Zp0nx00rrJ3rA;`_p6{8U=?Qu=ZkN!!nEei-(N2xq z4?qn*Z~e;VwEJ*}!Ss*ONBpFjcDcSI>NbsLKAvOMOkdK>y$=Ldfa!wUspO#@+d} zyPe&g20oOVOFIv>2;TNAEG5wkgB@1R_hdC}YiS#r)=2+oWnZnm+Ay`X-B#1K(|%)O zA=UbN_ovO>?D0-PbzA!mH&%f5Z$(1cs+kvi=tx_8KAVlZ-ZQ={?d)t9Htc9;L(_R5 zjH4UJm(YRs_FwqRmJ7|fKxLvgTH{Nxk~Q@oH4cd;J!@assPhm z<=OdD^IY4*4j>(XL0as@f;@G@BA}QyS9Bx2-qVgFL%`QP!7ANG#l7sm@w{4$K8$SS zz3m}9{qenK9-W!6)a|0Zo}??}Qd}Ws4Vi3r#OIpH_7ZT~d;SK9>D){0ziPKO47kij zDw9uX*X4Hej_*K;B^hn!s*riJ!UqL%#Z~q~<5OH{$!yKYmQMM&b5dyJN8h2RuM+Qmd6j)C-WfU9 zo{9!H&9(db@3Biw4K+TVYxjt}7K-EY6BNb>eoIEJjm#$ryCtgrDuEq*jsBIe&%?KI zwRYFki;HUQ<5BiptvvywYc|jBfN#U+q3~0>Zl2xMgTX~<_8jomyXV=pXl2^f_HXo^ zpVHe`+t2dQo4QeEt1K+I!;DZn@6eyFv8%Y23csfuHnU9`X^$^hdQmI?TDvpXQUUW) zwPXN1T!2H6%6DkmwY&@sH(qO>rs=;|%=f#C?E%zpf!)meE<&IF6Pbbvk*4mAx#!TU z3+xH{UqdwYiay0O@H&u~#q_J|AUZCMQS6$+LYllhJK+E5PrF>v*Ki5+9|uahnIGU= zFTIZeXU(T~Nn>;m@saI_0{!)f^>$@R zGj_%^U5AT#6xi~2JvoR@9Ic{p`8Q0XXRZg`#R=v+H8U35Q!-a)iM}`{fBF3qdq4Qp zJC=e9*3F}*mfC&!`R!7>ZMbe8yC@=bw7H!+-C(!we?!bv7uKAhR4qktibyYgu*tPe z{jiC#q+|J z275~I54gEkg6VCeNz3f2tPg6@%j-v81+I!Np<9>P1AVW#f%V{&H!-V#K3fKP{~l^x zhn;U?V?08#T(L+d*c_XmtGTL^d{kgWWVe?IPa}9^!m7DFDabpZ}^$Q5ik0B#^ zi@Z>Sn`%NBcSRqj=nA_`yOBDsu#MnjVs4uGI89iA@hqXMR@fc%jgk7*!#coz^TZ1K zQGLlg`t?fNa0UQlECz7*N+3yCh?XNIt9L;wEh|Cuc9oV<-TYx)>Z@DDwH|cfc6(En zykS2UR&7Lnqz6~oapP=f3!x4Wo`?8R-lykki1hfyD%!xjf>~e z_4M`~wh`XY*n+)&Py>_zHK^=PJ0#ok%Yx(Xv;%>=Z_3AYdUQ4FPP?+h98<+|P7Pnj zp!t9TZ=@!ou_9*qiJJ}bPim7D49PLU-{-A6?K1DL(IxJzeO{AKk$OAey&T_R2;=Xa z@Ersy@z0tPs+)v#-jTduU%IW{j=+mzO~>|7KE2$|OHb8+L%5RkK%voX)4) zR%24H?#SgM<45*-`txeLx4r?K>0PH5!TTUO8vW$ayuENls9IxBbdNFfY3$4UV2&Ny zD@6CNv5VuQ%mRt^We^-h=wL@ZxWw=bqHBC+Vf~u^@W!ZLeQ|RQEw8ap#sIX3&MBZ@ z-DT%7zx}(rz|G93C+@QQg7o^}AR~Irx!Vr(t^Gq0TqELoFINeu{(;Af+Phr6T~U1g z;PE0S?UU+KUK^65E}`wueUVR}?D-VQ)}CG$rWSXM^3reawzDybQW}$UeIYE~b`I9$ zfxGR}Cadt;-S+Vn8$8a9Ac;9JB@uj6B*&>-YhTLCyVmZDq#(^{`S_Cy>9e)qU#_DT z>ulUTe2At+u5BJQcomRN=2hG~!_2@N+;wmB(*vf={Bf=slWXT7CvyjCnrqj$0&pNT z3_dTsn?I`w#?!5hGgXvJyedxxr;^#X&MxLuGQoRnQ>2o)bsLSn2l#g#ExO09aE28T z0V36~XxBY-w&mg=b_>@ste+Hm$%@kd5F-9P3ED(FZ#qh4*q^wkap5gB-Omv z&K6U6?|!=MUi(Bq+Ee%1oM5Xv?TM5YQMCm$a^PNj0H1+g_t}2}d;0Bt_B76#GijrJ zI?{UeqV3VrVtVr1GkxxvW^dYcjSsHQ&m@LX)lHvNQnU;%w(E-UiTN&+F@NI>>usO%Pdme!4~zXeKxQM9Y#&Qd(~TyV#5YJMy5M+vpP6>OtH zSKVrVfrLMo+-85CSD%kKXXewOTrJ&9vBP_4&5kqM(au#X`%tt^&_mWH9D{Xq+WmGj z&(=bq-`w+C7toUXZL`yR_ac-WvR#;UoAMk0Rz$^go6kQHGOzKNw>{5}kWbM!_d|Vk z@KtK@fZeR(;CNH3ac^9tHG;tO`Am)@wG{8?}{xDLRT4o7iv z^coQLrw@*&H5V@L&S{=Y>B)!eJM?)-yS^2A>DwC?Z?)gmkgl|5ZA-{Kb02}wD)TSy zf5MK@z(3d)H2W>L*;i@qhBe#lk*G_bJYm1im5^L^r(L-I?@!uX`u0=ywWu_$(H^1E z32)j79c(|R-PD))DVN$KOZ9fUF+PuD*<)k~ONh7-C5-&t2=9aNeOab~%MQ`o8}9m} z-9tx;4$L@#&4voC-%7tR-K zsXFwcJ&XtGqb*-IFKRezhkYF0YgqLXBtg8h`epk%{uz-Ho`Alg`W3r17oWdVH1)|& zFb?`>HB_@?aS`p@R~ez1{R?9WpAq8tZn%PhAky$g3$@n`#H+%iU96M~t6~9u^gz-D zJo+FK93BG@^c|1tST;WfBj8S`qdq)V!QaNlqWqYEpq_Y~9?Rq3CdHcZw{sB#3y%vB zAq$V0u|o0wYy{52*UMtXG_CW1wp8aX4CU@b=t?(keP~@lBT5J5k3&Msa|=fv4;au8 zL_`k{(v8vugT6h|_L{MX&Ei5hAPm^exj_QG^f&pQiH5RxNpJT~)Lb9ajFR=ZQh!9N z;m|DziGmbToxEi&T-ka4KtT7pJwEl%?+@TwJpzQjs+$mC>v|O@-qexC6}$U7(s%GL zyATNh5w= zag45vX8O4vlC9*;G4~z2m2@{5?Rvans8%30UvxqtxtC1tF&1f~-~|S-!6}D47e{b_ zePYQC&x~IB7yQxPo&!Z<`4LDJRTQ<5R||X)?!CDHR>i^RP`|&}EzZKZm#>*rlUG1lX?`f)#P1r)t=6ENBFIoDf(;gs}-2E-V4dJ9QjqPy8ImnLzoN zquvC?H9YcFml2qOZ@eeK9Ec%fAfAv2W~oBJBuv8y91LUC43UNhQ6;f=5p)W)i=!^K zmBGeiXwFU|yjat%=!4}#JUht`h9w?HbBJWaTOl%(49!A_Q@Q$BM)Ux4-Mqkvc!J}V zxU1E^n1)%aMuPx8B54!C%E&?Re%InC3yApM5UTKN73Z8lOSn5C8GR3MZh(iNv=t6C zV6timwc`TFTZMK{Y7#g_!>ah?stCx&s_+XA{KyRv>T_p9uslP-=l~Vbo_}m89)655 zi-YmKfw#lJA&WT!mx74T890>8U~q_7AFmMN4-L;kMh5_3Q#e7? z7sPlqTq6J+(8}OEl*d_HkrBKG@Cn412^_wmaSom0iTM~6fr&Nzyb1}VA`;!oP8D#7 zBDl^2IB(3l?cshyF2EqsW?&Zt|v@(?l9%bjrnIL6=|gMZhl-{5$5A`Kf1 zp*$W2bOE5i!9M~UCHS?(NsAIz>4ALE(fAoQ{E~@08a7;L5Lyla8a}`%|KoWwd==8p zMUx8?E(syLAL4Mb*S3Ojw~3fkabL{kt_F^0bqVmfzs9TrrWYSi0$4-WFeipEVhBEj zH3YKTr$_w9Yyp+QP{>xa%gn>>8gp|);$_$LE*e65^%qSZ(M|#_f@2f6$;o#3&ucu)uQ>9To2 z3xlKL9Jh)|4kjMg`XTc#Dt)6*S7dSfU%N12gfix3*Tta4`?e%z8rt+tgNy}+XVbMH z^Iz?9%^g&*aL^It+uE0NO}u2#s>Iw_nNez#U6~jZU0{@4iCXWYQfT3zWwqOC_swhc zbG5HnwS#{yu8k3({-A)WzIk`!ylWOLxuxn#qx83Uz0WlZL6>wM91qn!hmm!yTaB{z zkALmLgL~gK(+tf4vY0bd&^eA@Io%9gX80~KH}7^$$6|+On1RbtBTy6f&*`tBL4@pi za>H1j6yL5)&k`+oHsMHnQO?u-skt6&s)=LI)!e5~H+%rTj7bklPZ=|Hg>ba`W_yX+_doB6v(JIM@ls0pPk22MUxGTAWT`gk5IW;qkl~ z@gS(!7}UUyqDIWe(OxTEochZ=37c%7t#bULj!J?!{8z?KSI_TSxi@aqkwyvz45_vAd<~Nv5v!xcMDA5 zw9CxKc>%P>>~Ek(P{sn&CC@#7*Fk0AualKP3lKel$;GdH*BdO0nZSeRR*tyhWoB}J z)U3N3tpazK$BIz9z|_O>2qQ#4vY?5D@t5NRUt)8OW>~=>ykNCNKOFMV@NrZ}gv{hn zeEC3ZW))T;j6{7*OR=^iFd-}+CIo=MCoCySN5#+u{s-t5oE!>4m+*xPFn7k{;NS34 zj>Em7OE0?8%xKM!xQ0)%s%Sn3(8erXst92mQ3sB^h&c|Bl0YqaJV|on2-O}na*pQl zypq2|CbAjW_7s1|VH!QvhF^tMGz}vviByzZ2OGm|m7?FGLqt9VKMsMF3Alh`=ftFr z$p${v8xX!&`i6x~sjn2Y!~Cv9Juu!;39h z50yU7$I?#u@r;|Ga~JbR_*&6ws;N3|sxD&_lm{Ie^YHw$X!-n8i@I}|OodIv&{K@7 zGpzzKEwS_x)*}D@v=;JM7G_LKy6mN=;&$Ha#OV#(-Lt}us&*9 zIbvERMv)Ow(-K2>rbV%=G5HBTH%+7?;TIoa=}0iZ47a8}6lpGy$Fdw+TDikG*eUkc zi$jYYl(G?0f-<7=m{pSfO>@5)qLJc$AsQVA2=Y36kMq@ZixTtogU5ZHgRRC3aVg>wSYAFH8VRFSvey^X|=w~1LaRdqB3yG0IL}2((Mo&lO zi}N7_ESESR{Feow!F)h?HXNH%NOQm?ybKwfE?W}?lZUfn2!uM6Yr7l(bJ1C|CYREo z-%c)TLXlId0SCVTLpqC=g7OP6i4QOdha$`LYe2(NJD{T59F1wjB7uN96gjA%EuZ(I zQzk{8iuS>(r6g6EaSa$+lH`2a6$}=3avAwXP=Q-eAqOzcj`#->hai^71cOEN(eX1T z7bn2HfFzC(?Mg_4#F>UPP|B1P?g6A>>Qd0sKn(zCF4H&~(nNpUw+mEF%#7tMjMP~( z2k-FO4G`?i>6qM`8H*<^);IxD(o(jYv}uY%wL%Q1=x-rmdQ9UOkf#>43FKvVEczXb zes`i@nItPL%|Yl@$ydrmo`IQVzXI~4=BwmWifmNeI@l%t?Ms|ZhkBe}##xOd592~btm{Y2mNQob)kqL)j|4$@ z4ZneNjXqw;T&`q6^|?lc*)#f9AYS3LdBQn{^V#J(Kb~D9lqnTku#1DhEtQzeLx34z z-l*pc$i~6!gkKN3gPx!dc{g0}ugDeu!Pf$#_y(g04lTzgRzrfhiECY4E|%v2B9$(^ zpGz0eCdL*6t`r(a5DI3)Sy9E^xo4Ok>%e5ZYEXSh7X;8h{NynchQ|kG73J>SSJKu% zn!*oQ%7N-&H$Sm_Z}SrysDtmcf$7Yiqbc@$H>jT5p6Em1{*vFUpJ9e^;>~&5aIh+< zKFHPEy$~-M;Gt{z2^P4H8`%i*r4)7>(h58CZEkx5M$IeC@(zT#+MRD`*Fv%EH$QYu zH@$PrFr=%CQ9B)UH41PyfZ|M8NfMeTrjWbR3jKh(e;WipC^2`r4~POKUa z_)X31$;U7U+@q%@LPkI+_qJk?!0_V8ZH_b(;F|FP{$cE zk~5YZBX*8Mcn8c#g0rdmvG$;lI`fSvLlG7LO-jZQ1CGQwV;ImfAOso!Y2sxqA)t_d z#Y`j2-|_*K*a>FpG);Gy^vK0HRAhAU#S%(^ZGilOSweaj(W26Zi8MMe z0H6~O)cQ>SgFsK`;uBEtR6M-x^{Gze9G%-LP$Lt8KH;Y^{(tp^LsU9_OMG@{t<#|l0dQ$zQRXyOv znFeAejETf}0SwG8x(;>_OCXojA%f2KE0iT-&tm~;*Rmc3G<$n54^?-__vNvtE!@m` zH?aMz!lh}45m%;hM!gSa1D+MK!=`2h*+J0Q%r)$T-=So6=)251$vYC{sj0|msU_4{ zpCl+2P^AWW$nXixlNbX_Jp8i=l^>?Ax9%@!!5p(Ae~1ABdgOQ^T|&g3c_yd?lD|Qo zWzhz?e*h|ImBkI{xg;5@0^P(SVfDnjicjFrF3e9%6Pt(E{0dGW24v2$3Uh=O*Fj|> z)*IRagz_BARoJXW|Ij}JjNnIkE-|LGawgbHB;&x2x)Io9 zr-nE#v(f1T^v5$Mw;qoZIsxCnZ#g)>_AdhG=dd6HoS)ifnV!@ok$rQy4XG@a$TKhr zb7egD(~t^vkOQfp?mr5tg3Z>T5nw290;!@%97s(62OzZsGlNdqfz%f4TY$E}^)RHi z_)$o0{)3Rps~e!I)4@^#T-i61ak3)p!oh@lko=tSUjbKz42})35*@I;z|)e7-!9bbU=Iq_ zvYuO;Ym{D@UZ#UdaY%W>iBLgL{D*oDGX&Fs#L!?ie>V8Rcl{ z)`#BP!T*)cz4A)*R5B=dDh5^tmd}N8g@0foKRS<8`a8E;tP;V}#l4#n3wdT{^-1MC zDYSYd|i+ES=v+3qG-P{4TvRWpXj~n>sm?@I_o<%p9kKF+6h!YDz6#W;M_@_+t!S z0FGG;rOXTl9<9B*O27=nV0`YQmV}eC7$sx*fu#q>Bwlk?f>A-{%HYLz@dOvl1FO%~n`FwnwlK0EKc~V=UmX z1)bGZvUN%Hu{9VNww3WMB(YxlMwVQF28E;qw6vD700#i-rLX3nAn9-L z^macAfrdXPRtxDH7hBxsqbwgl_=Toq2Co?08&JaUL%2z4A7vhFD922f0ogEmPs~)w zupPCK$v7!xf&|V%n?h>C-;W^3c%tiKLqPNl(0^DC1kvN(AUz6(NJ^kGOLjB#p-0!o z5azX&BvpYjBP5l`S;88O6~%(=aPxqLKpPOAF5=93ctJbEq|S3vI(eKY07Ngm!S5wL zg3k>~{w)5V6m7uZfneuSsD_UOjJre2#c`G$2|-G{?=maRju4Ms!<+oh$3XlJ6N}m6 z^0@0#wo4%}wQB^_W4yxr`CUbQ9;1Pvod_fxqMqfCZF$;1zq|f#rg|8h&UGT8q8O*aMYi94?s7 z9;i%W0y|(mkK+>6kG z(u{+OE_bzD8q^dPXzfYE&!92 z%}^S|nG5tzH(MH1?i9_M6V3~ST6zeysSX*RWb)GF#RxK4OVjj z1?+G~yy=fx*p&e0R+xtSS9BSREEoaRHd@0Xr{QkSQD7&OY0|yy*t#L6dO$5`&QTFT zNdm-siYHNRUVR0SpN_|9h{~7*e+09FzaR}I{IfP=)52J(DR>Z_k)4j0wFQjLPvMm} zfg?~1x>3%r;3uHul0gF(u4h$?i%ro13~x|^`34hibaTxpA4!mt1Pp%yc1s5(%tpqg zSY^J(gsfoPZM@_fa4&qf+cRU+f_OQT(=wy{R48JER~7Uf!#s&WIfk|=Ubes}y~Ze8 zxE>5A%%AYb$`X_ibopcmt`K`c(>2sw05%}!q_`g(PJ%rTTxZl6{!6ezVT?L4A5#D^ zzb01792cOSl~B;h!TR<%M#(@Rk zU0)6|&fuoNhCi}5oayd*3Dau93b7ZTDD+%{Wy9MVOPH__3V;d)JIH8<&l%mX>fl>B>oS1{zX$x{K?i`9jk#{^z%A{UFI@lqh zd)nhs`r)xP94XYKj1Lo9%J>ab04Pl1U3Yp|g}%4egOGJlIA&JD`e zZ(4yP^Atq1TTmb;@cHUG*b^qKsZO};{(`EOZ#gGS^ii!TuC&+*A(?#1ze6=#ew zygGIu37bI%>UauuSUE@k(n(DL92J9nr|+$t&`OFE1yEtF5hHoWB@0#rbkspm9BzIg zH@`4rW5lH*1Jq91e=BLrv)-bPtYK5;U+5Fl+Cj-}F=1izFHib^5A$z-Os$ruR-3VM zofXVMFTyLQu1Yz#zcF?`YyVB_Z*TVjmOc+a)^wDV;*u3sR2hHOHLDEtD7zIf=oo*s z0>)9;1tCK^(lZ^XnOqSBKjMM13}Hr}y4J3w7V%Td6TqUlFT#fg7gJbCk9#IC`RN88 zrM>lbcmM*b@Bjexzyt0leei&FasVFit*OQ%2ls;UsOYN?$0OQHABzX>M^3;4_n1z{ zqgh`lw?hW}2+qZ$pqG9D9));+CZ6zRnTEUaFzGEdz(kErziH<-MvTt8N$ae_t^cs?>|>5E z@6o;XnuNR}I}!*RS7ads6yOuYMOF;&a3NM8o=`$ds~WNfh%JXM0g0)hkYr;G!?pP6a08`p|PROA{4J4&edrS7FMu=n>7#rVDMmO`ddJa+zYE`OJR% z@#8jceXlfnJ(ox6Z?@gPls$C#%FxOcxw2gO=;YJ>q+JZgM2t>iLcbHGAl-T%?Hu2& zl;$SwtUT$*0#PHWy2z(3*<%q_AZfSDV?U54{S?rLNxL#nT-yaxni_8*wSN!el@0{% z^tg&>+Ix2YJhsU)mgnecIfIZkNB5xJU)9z&s%a_1V`^Gr zN;um;J*8&Yl5Dm+rKZ&EC#ED#Z9JvsVoC*xmM+tfSL@tjChQ5rGh(+;%m_HgZ3Hnh z_#eUG5)aCm8FIs5o{~(C-;^dW&!8k`1_4rRSPOX;qp1ypR+y1_JG3tLtUONdy>BaQ$Dr>p+DRL1kZ)-5K-3dM;lSt^TQ3Qrs9D^DeNd!qrhyEX>^-M4!Pv} z9Z35aok^}vGynL48bn9x%jJ?)(#(hI)Sx?2&Bu2CY{}!G9WiLa)#(Cy`C~hnCpiRo z?d*%n4mwlUbIbGT;K%l@S(1(iL|A|>bk`^Lv~Xw>tL$d*bp?ukYTukE?neVEQp-_A zk9=yMo81+g!xT0U{X?PImD=sIn|JRf%h&;3cGgXTMvx~iBggyA?xGT)fM4uRzu9Mx zrYSFN^LaT|c@K(hM%12A(hlYI6csgd)%$AbJxSY-HRz?vQz)$$_1$l`KL+0U-T`$; zQ*YVCpf8u*Ub|0|VBA}dH6^IHV*p;pJ5ZAHAr)69+~pD*0XrD@?6lVh?cs=eSX7o+ zrw?hD^~jI$o4`8YBL&WJ>i3oXW5V@Y)@LK`<)Y8*yyNH(zIlBNq{rQ#XLq4-V?b-0zB~*NeyF@eThIu(LGIkZlXzJQ=*>vR3XT@k| z<%Dc{|8skAmRF>HaG5J#0T5B2FYI195am_pvassYO+|Fm7j}LW;he-Ty1Dev49-+_ z-;`o{=?goLayCx$odHdb;99ByBa(k%90LA@)m8A)VF42EOwxplC@G>bD8j(Ls5^t{ z6<6#FH-#`D(*|@e3WHq8?vcP}`_Pz5;4`hXl|fGo=pOCkRY8gLG&h2@Le5qiaG(%8 zgjexRy2Fi7<4J7`aJdKSABJNc9;x6zaQEOCuS$MLPq7~!hu!g%Wpu#oP67?B{$rj9 zJK}NJ9j?VHN6gA2mS8+PX6SPU3Z%#9`|Bt5? z(OqBK%}y4+I*`&Gr{t_`IY$svB){1pPkFZgy+fwoBI9a_1gd@PlH-7VD1 zfdgbB6c7Owxr76l8D~J8a;4$GBOnlq5_C-mRZxWAuy0vW!YCB8#0T(B>o!~wg!zC~3` z^B3eAzIOUZ_|@StmM`Am4n6G}GqOEZ9iNvS4uOtpT{K_ZJ%pB@J*Gh9-M~(x&uQ28 zDae6jFZC$GYK+u`-`EwoLZ=6c*x7>Z2((L2R)wKr7gKdbpP_TVwU0YJ2>t`&_jI^<4UOxpQ;^Mj4czdBXQucL zlq63$j}hch9dQv8M4ZGdsbllYoiR(Iqp7|%r&9dRKI1qj;o02-PE=~>d`}fJZ-0%o ziUzxv1)%v?iUYqBk4(@nFRhuMm0yA}ax4b<5}O4^!0$>k0<`NpyM*1-pasJ=xZ(we z!l(yz1@<@Ymewg$3mvpub#YdLOHnqB@^5-4_?H1q`kp$L+M~@f;%zzSan1+f98$ zTra1(o_{aUUZhVB+GQmX{y|q*%`YQ3i&ZoZ*+arXBV6f%N*g8^ntjMFOz7DjuLs6E zzU~#og)^{uXuTi~VYz@mMNumC=h!(Zu(_kp=nm>~;@Due&gl-NPB&m2SYDu4M~uq_ zDLvbf;qWrt(b?`4N+EW%^8h`0>6t}2j#QT=G6*E*uWr*vv2)*G(#-)rV~lwlvS}3k1B_)qvX_5dYi(-dW+n z2Mb>TZ*&l5Pd=8g^z%>bT2}x~djWrl#&wu-;}M8Ls5TVUpm;ZeIC*@`WJ6q4{pjV^ z*hzzb8;qM-F&Wj7P1K(wE&+4C;~+_csDC(k#aJdjNH*J zeB4x&Kf!(r5e>)+fC-2%I8Wd>0rKkV#LowLDOyXASN9(>UUn#2Cd5mjTS9zM6Npb7 z1@Y1~z6r!DZ^I@4=}6^i6^rt+ZcS=nVS zlLr86TYhvcY$1bf>Nv10jC&mFI4CJN^Ee3Vnh$#fZwSk}-~w3Tf^eEkLWMyg%L)uv zOZS$p_-nGVb+*9q&RNM9kfAnI%BNwVFq*oEIH4ktnL$IfWVcf0OWg=UiO0bs?iyk5 zases}Xt|cm4}kc9+mDB7qn6~{MLE82J7htB25@69f?;u;u6i|CL1%5+*gA*r=^)4k zE<}gXLV%{}$$XI0%k^YCkkdQ$+Rl!RGVSGVuh_0#qS<{~d>u>8GHc0bUspOXNibrIbq& zP@I79)PnGE8M{hAqrk!upL;&VlFu+ikVaS7iK-&({9)STN%ksZ9wtSXgru$(r8RZ+ zCQtK;s0}*pnbI$RAg;eKQo$dN1>im@9#BRwz>^f_y<)b?cI;+hR9rB{`s+rNc6*Z* z*+4XS9U&L=5#_Nkg?z~hpFqFJ4SUfoMf6nsk3I=aZE3VG*@AW1=#(cGpeuaISQPOl zq2YE2UY$n!k605ZI<8ZNmwAnL)XbkOq3SbF@E1V=JshYI3h0q|K=V8nk0`^kP*nYv#dTRy8^i$J{UQxB^d_>l!uk!G@qV1=jSU}$tCW~M*>PNeF86_*eMOuJQLdnPgHvmrq z|LL42H=`pXpg2%LZm{hs?51R60be?4b?*GO!oAO>Uc$-2X>#K<1tije79r-wiNXNG z$&wQ!_i4b1Q=A}F8_F6=1xKi-@d-kc3}{f*IVXrs@@y>~7I)K&;biAR7z7l<=wZS; zl!>*Ac7>J{Vd||T$qtCPH#U;2h=9K0rj!=J0Nr#&BstR?;uomqy5sVZLcDd*t%Kta zWF^}mj#!thWGB2hDJ$6--x85zIo*?$?2pfTvyztwv3{oOL?~ZrYIf2<>AdV@0qP&A zySJ1c$WEFxyjyOB4rV7q;9vbY$yVBC>Xd_~U!;@ew<~gz%{#-Wg@2wgz^Cklz^Dgn z%nAfJ6FFpEGJzfl3{U4IyZeNAkwrBHo$@IfO?F3d48x=Iq_YRV2=O;VDbSzo%u|T6z(B^9jV8z*P#8)(-YceaC zTgxP=7z#LZbsxm>1Vu$B@G2XOZW{YZ5#&B~Q3DDWrntc)+^r9`K%{gw9Hl&14IcwG z&oGc_r%^gyFd3U;X-8Crj9pTZ$0|Fh$o7W`31Sx@dINS#m(3r6XkmymUBQ+6^+C56e!1wuEh z$Y-T|DMTL^CR@_R!enKZ&=9MiJJZxGobfvflQ|SEN>*k|4Y3mDyUvifiTg<~ zgqbB145c0!Tsgon6=75D(D%U*tdLYNyM%byl^GQw9x^BLxu@$a&)HIkET6% zT5*=p6sv9SPis!zFVIZ8tO4AzDQy4)XvIi8y&qLT9H?P4j;d}bB?xTE?9NDP0VcNG9~f|p)8)TZ*^P&Z07 zsiSU$&HP8yjR7}o;qayWn^snz$DkT6R-N=RXrc9f88 zmcG5~C@o(HvuTX72eRUkYRW-N8ro?2h;;d{OUkM7%l_@CYT3mIB0DEpOsmKHA`~58 z*n#S{7Kh3kapNSwN=C2%F(6jf4dLzr#QmCj?e>;h=?L~~oeq7M_|X%0^JQhB$%Pl8 zfh*&n(a?i|&O*r#jRh;m^6`Ljtia$*W6bN|<*Z?}Wz>RaoOllEf%R#p8(@RNhCljt2)92(><)}_nD`x6d`E!A zLZw#h>W8|5$6|>j4=;zO&xkH^$NfW~@5q6VY$7-vj0GYq4ULE4c@4$r^jKJ4lEEvo zC%{+AkMA=lm@kFpRkQ;GN1|C?ZJ_>;3T&!h}Qh03j(i7X5na16G zj`x71FXFk8%P>1uWQl@p+z=#tb{EqiDheTA_>Xh=1}QN*@?uDxW|kLmvYjO`5c3qP z0Jznm>}HpwjbJ5=PH4)7*cBlcI0{^sWwVYL8@rc^Ui-Olj|X5<5=WMy6aG+CKen<| z^VHA!Yilh~3{9ZG2fpZo5hr#f7NCC3o>DEpK;jBtbPcrJ&N%3)dC4=vA!W*PMfcGS zMzW$ZAmTRp)jmlBg+DsqleT6--Qp3@W%z0PNmm!NjBvZkXGh+_gF5kjp9e`q=LdtxFR0)kC^I$l75cf$;jEf;D%wquWhI4^8 z*a-~lI|S`Zz8;?6FX(1_U_Xze+r=9QTqS)fLXPcUC4rjaVEtBO5z%Ba&BcLSn)i_p0`fixSj8Kx~8h*xUIedG8yAhboomy+g21@->Z?J_FuxoCJOD43y3RV3pWvY5 zk$8}?TQ;y8#0R+73jCJs;J0jr-*`+4zo{`f5GSJ=Dg35l8mYc{wfH}=V%S*`v<{mv zgGt5!Goj5fLo*TT4;zdEW-;(d!nlA|DEl4Uh)o}bBjVsjZdM>Dff|MM+XOWpg%%86fIXOiHz>SR0R08d#bv$H>m2Rw52Ri;2**!Vr15~BS`E}ztI_1$AZd3cEBYxQl{Sp@iB}d3h3bJ4l=%Y6R(0UZDK-H?_P=eF z3@3h^kzw4GVq^sFat^w5_EQI4**DVEMFR+9dRS1$fEq{{Pyy180X1ZHkfx7(BbwIJ zV8_(qNf}Vl4t#S}u(Tq*6yWCpwl?j}uR!Ni|mSu;0bP zb$(9bgT|DKhieJH3+5}BOAyX7xLqvBu+HSa74009EKT5SVffAhRpLM@_LH%V55NYy z;LTdxheMQN1B4|3S-VD=>ZWWOBSYE$=rLN@cvK5g5rh_oICs&~O@wjj3FlDY=+ymc zaIYt2xlIk^RcCp{@stpk_rmo1RmoUFNnAr%QLJXJg_Vu`hR)0aKEZj2$#*=$Tml3meq@d4hy@EWSKt-gf-blP#0^Su z3%KYCgp3vpw$mq@CBi_$a^;u7giTk%=oDiINoJFN!urs{$DKOy(84!2jDKq=gnt zJ+K(cDFN0;+eBZVE#0|FGDcl9~skwD5|D^-%_$L&|ExU+}9`F>t88GXCm{<+@p!9)XpjsWv3roQv36!tw%bL?pqwAU_l# z*}{S{Mto*91;=GVv(WLgZiJ&d$31L8$>zvINd3gx2B8x{m~K{s2cjR_zYF3dJmbNHH~L{M5wa)io&qiQ>rbhe$t zlAenPEa~vpXG?k^R7wc94Rx1W5*27&;IGf_@;J+Ea?U>5gszeUu?ZcupeKS^8_UP$ zbJS1pB~N}GHc$k*;<>^KhHx;#gbo8Bo6vKxtYH|;IUSHPp}SeP##P0o0z?B9W^|;Z z5pgl0_Gn^8M{kSVVJNk*&tg8+vpYxlV-Q4i9!h zfZ|ZN_F@l|^$om8K zqbP5lV?Tm64LP1t_9Jdt7;=RD2u7WwOzXnSuKukbQ87?-$#vyPT4?*G& z_OD@lD2L#{t#q&ONkgQ%HJ7pkLN^Xz{l0l>0Bo&@cbjRSl9%fWj9i$foNIMIZl01p z7rDYbm5sYBU&#A?8OAB;TTz&4oJu)aV2_N08XR;yxakUdlCnjCzmlw%A9DbpAXG>!0^UJb-2yU#HOG=mt1eQv?Ur2Y58?7t=vhnpJLf^l)ByXv6g%T)Md;*qA`Oc`f9md6ND8@xh%5X8`;J8dlyFS7TKKyb!;nb(D5F)jf0y%Ym z5UA8AJzz?xYyI^O`a$4^OXESXFEG0K;N&+V69RdJYFvtaQL}0~2I&jnmgq;_JXHOo zh3~ofNkORhs`nK3iram7y_2Y(Zk9q8f5e66GpM4HYiHwX+!_$)?3sf(Ta zJfy8ZHJ_%;P6paYFB1n`ov1~^b5SJ-@nUBv_KsCZPd=aY(VVA~{~vpA0v|<{wGXGd zJKafV>!h<2LZ?}RVM~-vWGh!d1H^G~7veH5h!DqdW?V?3j*4svN{+ZCQ4|5$MiJb` zL=;ihxS}AC(XQ$MDsdbYMfsj{Z&h`72ndcd|99p?f7$b^_xErQ}>a3MnaR&pZ`NBV$mMR>;)RjgOZgLfMxp|IaDv3}_( zSbaZZA{Zb|QRK}$D-|3NqgF;3+0Imb>k`w*npF}ebwZLd4GM_St6g|f=C4a`M5s!_ zVR9rQjxq~j!0u!Uh*47+afne8Q*KpBILrpB5r=V+3|DT3c%N3UQ>K7GW1AF^C@Jzr z@eETyjD|`fftUCeTUyvjNdgs0gjt~AfxuA8owSVAb4ay~btPdRtv>DIdSREaY_(a3 zQ>^xo6NTo7=Gv1s)m6?to$bt419uY3zKpv`3M?buu%{LY6w3`z0SCxz00pz#&fSY8 zvqRD{1h>OD(82Z-9FBN@BHK^=Wl$&Zmr0#)7P0EW)=~Tt%iIZc2sNy+Pf|RvJ33oT z5EuD#Y^u|-Paqp+8>T*vZe1D3$pXINCgj1B=K)glb0LjZO1F#SmbSQCyHH?64pG#sC-RCEy`3 zUa4Z=Hp!wDPm2NsF^tLl4wLJEh82_({2i6&hDM9VU}5ms1o+&-{YU{6B!Hk~9yKqY znc|y-Hy)0X@#^rU@E~yg0W)gx30j2ksHFh^V9Klo0@=AoB<~)H?TImJDB{Hh#0h|a zgvWs&mjF3?%*%{e?%0 z-pn4zor(KMlt`3LFj+SRXC}(hiD^$!E7c^ z&pv`+0RrK7gxe)ge3*PGi*uOu%z6=n~f1bhyV&jfFl0lK7cUShOg*%Qqs^suAl4L zxcQG+Q*;Oj1V^hlaIs=SKdvy+F&s~Ewt?J)LqDLugHPKY^y3PnA;%i^EEe=rsh^%o z{YwG^`ele+FYZ@KVD4><`AX~anqx#8ZY23bE8NW{YtkibpS;ei_yw&Ai$sDI%f zIoQoCN1{!{!*=$O5PPzZ#0Jt1H%f$bVf5j225A5x;tCG-lQK|M2$PY{?>u9~-}uYn zOBb$^Xjz6`1=s`0WLGKOmjT6NxJo#h^HSJHh8?5~0pDE5{j`DDh;u>-GZ1FaW<3Q@ zGYS3$J5BLE5ASQ%2B$$R&5ssyCZ4Qq(IvYV>|30Q95 z3deP!3M1<-L*9kNgjoSfI9&YI=4^D=issl^co#_XN$)~DnFLBC(=yg5!ict1NgJ#N zFpO9jj8}7c9t@CCh`}K;GH232%Ev-f`FnW3tXGg*6tHm^c1X>WfPa7gLcmiVYjj|S z1I=|Rhu||jQl?|TSRn&I#{Q*f;|C#lLRL)Cv=68CnaPi8ZQBj3GS)n&BYDuefPg0U9k-4GY94x3#s=bZKQE z3wTDjNv7??0(pLkvxF>a2xl?oKZY&pZ`@`Ztq8Ow(!5Hv#juVMXv>$;5^Xt2t_}%X zvG-+TNso~4LvQ`1zlvLDF|`?K6~6Usj`R`bNJu}{=p!8hjM@M)v8oBkp#OlBc3+q` z9VzWLQ`!#|b=~D2pP3QXIcpoiF?HU42%;8XX@}K7GEJ|<8BKUj1z0XIPsA% zPMU=dn2q7s;?jg>XF6Zk1K-GRJZ&Kx;{*ey z2}fzvpEFdN@E;v{3Xu5)Cg<*pbhcqFy?sLQK;_5%S1-)O*h48q7Y}u%pTkHXJ?+T>Vn-SZTIH6~{>G0<7VV3T-Nmxr+O66~_`0K;bz8yeTue zLJngC(G)e~Fwhe@_BYufuEVfHZ1KpFnd}gx){3FBO_R?f9>YmDVe+}AQDOn&)x-kC z8$bauDBcg*e0CdQOo0W!XRu7ZnUaz05KhUULAYG@3E6N2jg$<~;81ljyPMcn+8q@o z3_h3`tWHG5u*krws7(H8}Yk9HmbAcLqbHXh;d>=1;=Sd{`8z@NqwFv4o0 z8799)vO}2Pf`;YB6O{8K7z7tkFa^N{$bev1!3nk=!AdCsun_DJq?GCuc62lS$i{;1 zmVlpR1>z8LZWm6=SeV|1=Ng_%Sgz`t*zwRk{p-N;)5%Q^+tcX z;_~DZS+B;*6=#4D@jN+#BZ1$P%MXnwj7$%5$kci(Zr)+sg2-?hZLj68N!p57Y&NrL zys^%4K^_Ei5gkqf4ZpeVA_8x~s&OyprG^VhF%<1fgcu6vnFqlXLz5|CVkRtx24o@@ z5`PbTN=PB33jf9R944`6*1H>1)gQtSqFs!_h@v@zf7uoZ~jw(vS+Q_C2HuzEof5kc*z7#8Z<5D(b-%P`YGJ7TP ziAJXcOo(wTL=Qd`+zrMUMb8uH4cYUAH+ltt?!@Msvgt`&7#6{v5&J{jeUF=-2q|If z3w`3ZV>ROo!>4kZMa)q3NcM^|B?5u-SpCC>usy*I;0(#vO=5-!Ge*ED9nXS|)CAy% zFv2drVDK1MFwqCR5det59^hgjOMwRLH{;1*HnhctY! ziM7^VtA~7JWto|Bi89#b$_ll5h^8L>uI`X2>sZWV4Q>aHrCsMYh-?`|37Hea0LU&d zAyy1O91<+}&!i*p&_w2Lcxd8ia8Gt$+Bwu52dHy74i=XOi%KE~Aq#NW{txK-D~*8> zoulbMv`kFk4y7?bgLGH}7w7$%bcub};Ec&fQDMVH`xoh4O54DG4SR>?+LMtwRs`cJ z?R15J{ymg-7s0ygBNT;<b{2Flu8Ef+uz>FwjTNb*66D&>$h|s-OdkA<3XG3hD0ik#7H182~vbEF3 zM}U}!wm`z(8#gyRa>e4) z=l8SGa^mr5S>)u8N6W{fWkh-r(d+SOSux-ePS1!sACc|-wWH;(NkW@C%&6{&u``!h zfzEQo*g2kcZ=2W|SZ6497EKdlId(=%Vgs`@VrK+E96QJRvTgiDyRkFf@o1oPxzO;3 z1k8!JKWuK+=KkW%*gk}Z#+{*#YA8tkpJO;5p9?>?OPVPJ>@hmrz*QgFj6d^yFEO3I{gBN7R zQ}JT-eTeblI4e7z1V|Ej5NvXQ0t9d%z@?{6s{`ltH94)(7zz`?2ANwY@4)1L$-rFDr5McWj%)91EQ*dTa{2HE1(Oks;RNW9@dk^kky8#>`jxkCyY$!06_X5O_-VMlBn zV01_pnKw6zZ!Oju%WN2D4T&+yIK? z5JvO>ajq@V!-jPsQ!YrpVO>Bg05axOv-k_^3HM<#Js_8E=6OJyjKck~QUPkm6knMU zLOHB-{H%;i$|2l#!Nd!3+nqn<5 zOs3|s7DcfYR|4cK2|BEbk=Mh-!rz}Px0hUZ?dlF#7bxNMB zDq*#QZ7bQk0gD~-!@OiprkE`D7$h`Iy7MTNb91XkZ47az&r-&58zz+v7k1HRs`%6q;o5W zaIXMup|JO{aWorbu@9VIIDVoFbt3x)qUSW&)3`cJG`k3*6@h3BC0Y)|U&k6TQTPTK zvJ6o84DoO#WMe4UIvk>20_T7mMH$WkUU8e;SScBM%9=WbA3TzeyylAv|)(6-y1g8cLVi=Rm z)z%EVgc-&pw4si>47Q=PXtJ~e7R_#1G^kak#v7z8n<_|Iq7GpMoKl!3PW_q&4o<9T zRAfy*ig!3?+&*#K^%FKki=rRj3}lP|k<8TJa+B;Zh5>7Sd7tfR{_r!U=I?A!%Uza5 zI|gdGyGv-Zh*)D+f_8}IO{;UUkM3K6XxgwKP+*Cxjm7nZah+W`^%P(X&54%ED8v^MA(E$gB#UN^dgu^himF`x2 z*mc^+#?w5)sY;%BLK~j=zy$0_4MGyvxu5QH)Rw;7Q}J?q|3g7!e821WzZpW0Treq^1U_8*q~3EVzEIM@3V&* zj)*ai;}}0i#Q5&+D6eNH#L45z0h>{@#sL@dc6b4yQ;e~ok)`k$3!5!=Cilgi=}&>U zF#5xT%*9DCE>7O!9Ak-5=PO`_uk-U;gFD7%6}Jzr8G?KlToZeqJB}J`Bh!b<$R3~q z>j7+`#aaPTyIJ3l9x`E(J=fbO`MEyKpJc`Ly)OzQ*5YO(;&;SeZKE8g`Hti!gH zby#XaS;q~v8~xMZ`GG;$8Vh@3b&8YxY{VjF{kajoa}Pp#cYYuiMtPL$8 zYQ=fc=cU1<*Z_j1wXwT0iVoGjiSQYYo5v@@XZ*#T{P1Fi&*}V02AkXr_Flrn=XBHx zv4J(>YBPSeScgXVjQT0TI}}cgFAjDVK{V>bMG!4uRw!BzgX1U!Hr$|SBdA8G$Kf>G zF|Hhk8;-j%%31(8Or-N>2eRYBjI99DtQf^fMe7h!i{caR3xew45|0M z|6MB0d^^yeMqG{NzDEwEo$zdbZR2J-wXkh=-%$n90EUHW5P>w?GtP#zYaCFLC5(ev zND>AOhZ~13M{Z~LD_aW5%?`ElIfhU-rdy=hIBXSl_0>idHTSFw4|XeW4D_alx&*ve zMC*h=g@%+<}X1o3{+Qwo0>dk?dvfE&gUt5}~R z)fDBAGP3QY(Ur6CXn=r)>yyJQo6f} z4qc*N*qf%_V^5?rvOi79{Q9e|XLg8dP!#)A*85TZsD4o~r#|p3ZQ2+(J>f$IHi+HjyWd^1MOA zHwU`e8uO^)mA>aHE!28Ru9qh44y;n@sXF_7FZI|H$XCj1)uJv+22I=(n52xMkM;yk zQ9hxxy@4X7m`WPfdujOC1FCpSrfcq&7yY&uUY9$IK<7PlL}U> zk>FL#f;*d)LBS=BhCnu>A&~7}<9t*t*N#=9?TY6LY8;T0;ZS(j(bi;}&w&XWOiHFZ z)vc)CFL0}0Vari!jkz{81;$PMv~r=-%9oOs0Sy~cH?!cpkWaYIueF3ZiUttYB~@KVS< z9=hB5a^~R#QbwKKg9`t0dz_-sTTPhjZ>aK}Kn-3p-wlAopxSv0Vu)Q|I{n?ih4}oj zcLP_IZ&#QPFu?X6zantj0?e4NiOg58sKPw{GzKEKMfow#j&1xr)b+ zmOlIk>@DLIz+?tRjrGNx8a2Q+g5LqJK~@9@W30Inj*qmft}@kmRzeg_eJ>D~ggOL# ztK5VSe0IM=54{(-FqNg8&t!2blRx1g*ZYABdgbtK^@@teP2%oOu%(J$;!O7G_yA?3 zWw--A6L*zLGjPg)czH^Wd5S}x0tYYb6gXhGT-3+`QQS}j7e1Xjd=Ti0g4?JQzzInb zixIP{2;3(Lya+VtRZ&-ZD(@U(&$EgBLb%^Twu-rROkV=J*5Ue)D>ts4$8~Aws0f{={;3Ro zOz@`|DsE;2RLaIBkoY-h)CATn=n5e3#-=8f-3a#?cr<&skj|T#w*t6``g|BjbK`@X z@|c&DNcZjtIR`hPrLAe0z*pIdNPFqS~L0M9@~;^I@t_dy^lCfOGy29(BbMM9BpnztQ@ z<8!>l+7+aT$z%CaK9BJ}FPTTnvjBo4K8LXJ2ja>}r~2+);AgZ|%z7+jK`HZ(;L~w+W1!{l zplK*SH&3^pr<&PF9;rF+ybDhbNbE*2d#1I+=+lyq0y)q(Z+{ekipC1|(Y}ws4qKaN zHW5e`ia8<47zbM)#fFgtJdKijU$h)|cEC|;hY{hU0B}mA1#4Ljs4Rp}@bG|&jtc@T z#cCRXU??ij$xn-F%9|k6;-O=&6ywS1NE9eXu|nX51+oO@TJ#>pYPpe@fcz9rfa9hc zxn(P0Q7(NIv@+Y0Q!CL&&NCIyj=^O~<*VZ~v{Ae%&q3dO9Pp>{l!?)nt3_dPcTlfw zfh;AO&e|3@&#^X5b=J04+Ld%#xh>Ge@kXBNqNXc;2Q9uW&>y<>gzbS*HZUJrccC@& z!`lOK0GvwRftG)HdmyD8>yyb;(iOqb@d)xXFgM}#sOzjTllw#k}d7~@$sg;rueg8TA2poe%@BdEsH{SKCR=q0g?u=Fr>{v>E6 z)~;hQu26v^@;pM*^Dsf0&>*bj z7`iHJ8rdY57aq1q!eqrqs5(j3gKvyYo5;B{;4c?mQ-uPtkPehEsDq+lv(ySO?l4j6 z2FQzaf#QtLkB}EQQATG2t80PTt6N-6dQrHV=|!zGFCq8-fD;9!7f17VBB@?A?<|K| zpPNH3U0ar96!W8Ftl=e@UKLIXH9l}z_a&h?%g4e|21y1DFG5F2_)SsYb)ibvr5Y^| zA`X!)5R_0CZuIE{XkLI|J|o%!y$8-tq(#+VRq5RBnmjZR8QRd06v`0CVt!K zd%%aoXJV%Y%aXTH6b@Wmn$hi%Jvh~9f)JlgH=J@=2hw&1GUH{F1F7t2=Us*AN2F6rbD+i}X%p6` z88rLvftn0iH*bAvRL(o))vo?DaFer;6+t02e;Ua4NRUTSZBj#LQQT*N!88*8Q~J`~ zp9O}b_(j7Pp%0zxKiGWK^jRQX8BD>?0>6cd8yX1s%2|V%;v~rr((Rt-@*F_#8Py;` zphY0hJuaezbA{rJR&_S@jeRyXL(HB*I}m4>6DIKzF#`rvf^O$*nCWHQM4Xc+Hg zSZY-5Ud(NG+j&q2{cY#L;W-#pY-;}tparlfY{-Beh=VhP+@^XE0Sw|8oQ#mvelt`w z{=PtUa9c`bxO|R@INo(;2jikQ`|%B&q$pwi)h!qR^EPFvyiFZ8ACa2pE0@}_GtAnV z3C7LB{;2!@%CXS}J_RnbeXMDT`JL@be2woWpviw_hs)Dra4Oq7Cta)sIxF#1t_6Aw zg-V5f^E=f2QKR62L+x{9^*!FenyZabBUm-#lWkEW@P1d+**C({2w$S7YCDTMdY5Iz zfLYWm9>UeD-8}l-VS} z5eh=(Jc$^V@6X0F6BS2i1p|d?l1PEc0ta_Z6w*l;NIx}RKE|67XYeJ$zQj;=rsso! zuF5V_Y$GP*!`JlzlZ1=b9WU@ddg28hOCet1(e=fPXMk-WUC|O4n3e{~RF}7Q#jitQ zvC)R7OiJanbCox#o+LzfYPARTk(b=yIqr2z7GR_{4meyt4Zp*UcJSy6^YYbiR z{l(+b4}5bde6Z9>>So;9^Q3(Esh5^-x~LHUvwM_}sdCE z2k&a;(|4_b6O{MJ|5cz^d7Y+w6}UoKOz(XaIMH6LB8!*M(MzwEOpc~8_jl_=!~YS8 z!RIdWeI1=am;WP>2^8qoe*}6t{-LO`)Z>+Y9q7$}1m1`iw@=ky2eui1mi^QEv*eq= zJI3?XmR_5oWYP~QUN@cnZD6%=a7oALToAD2UYg?9wa{~>S@hAa8(868$- z9|)YL;7#M-Z}(E!j{(0jj;cTXBx}`@AMu5)?gy&;P3Ml3bTAO@toz}eD9>0bnuK8< zJ7Qiu4LulecA{hz)6A;cE>r+ir_freIJ|@!A5k(~>dW8b+(xQA7|5^z$lI~+(sWvW zFi_BO7rtNx<5b@>{(}FxKy}@$ZvXxr`u1Qzv+ZzG$&-`P=l)ak+YUxkmZEhUh?$W; z3cVx4D{(%&WY=|kCSP-+U-8r=n_r7NSiEYAqCKwIwmeJ8-`aDi(5}Tew>&GJYp7i- zxb{jFt=gEVP<xVMm{!E9V<)xNerE~I<(;#=3pmUgB>S^c|^4KA%wu^)O?%@;dAQUy z&(TeL3u$svc?MUg;r zdQobEQ+@w!Uw_*ri0QuANN2mWQ#AtDG4bQ_i8CSSFMmyE^L=uf(@=1D(n(E=Z^it7|{b}^-H`u)vSLs3h zW3|q>)J3u4QfZW&S>lZal8+92m^dj1n_@$9usv4DfkCJ>{g0oK1K~lMa$xm#Hf66J zIS@`H%fV!KNDh{{wI5hW*Ue&rVGo2;Fw%%oeBwQaEm0CYA1ZR|j|8CXJyW!Pyl$^Z(T4JC<(H-D^g@a@4`=WtTY=UWvF~?F*ayd74&ad#;{*=~_X&e6B7Cva9yexOA

    OHYD4Vf)og0s_?xsik96fd*Q*`Gfbb{6ZC5>b^d-64iJq;xyE|5;vwswm z!kcvZGFLmnd7qM(sCJ|kxmr5)?WCQE5x%;U)*Itp(@E>6Oj)&|llFv?_~8dz*aLzX z`0_k6>GnKL#XY<#UlhM~p0bX{`89vebJ3wTO~x?DzD$beA$q{C-K;!Cah*t*WZ?EEv$W=LksJt&SGI1+dr9&u#UK}Jff%YaC2c9c{c0UghGx` zupU(~MR{RWchOX#U^hQTTf1nN$Fs71+^%kZ%;71eGrMY?3vN<-ONm3DC+TCyt8YEh zxxZ~YGFj?NTXOr`w(?((uc7<9LV)k4=B`>klvScyNTvTcEtPIvhJ;U#ZrXTgnCacL z%P_9HyJ>7{qw}?s@N#m#5QBc)ckTpwDqp)$DX!_Roej|#K>Oa=*AH_&P@n@yB+{(z z;v|o)Z@OKr`hIScKPSbb4&v|emdzA?dJw6dwN#KrxCrCGeyTq^A1t|%g7do zm8hp!4+X|L&QyrE0>U?KpUEHU_Yy$?ifFuMPmxI9&F>-?k0NFq2h4E%so}06(~ea1zMK0 zd?mE6KeP z$dNcod3z)58YSu*p_7eaJVcdy)V1;yh+J7u?KD&5UhJv$Gag{oKYKz6T6(i@Z>@jF z?HE2tt{>h0Z~i?Xanm%%vT3G!dTU#g*dandV^?Q{PRAjpfA!EwTF>$;)%T1cJu1WMQQwc4kM~0-AAUYQFy{lq7nQ7_R$2YP zIFHWgs}-3ubX#9-JBIDTep(J*ZtkabAn=K!r#DPE-x)SPUtN1Uu(l3T25#*doz+N0{?&X_W=>a~-#nF=Bw zIQnVSC!-m0D3zU}9l)&IFj&j7eOE`*25TL9NLzQ8B8(lcr;5;@w^<+l3D=xLn+I#> zIh6$~NeVpfZPo;)o+8?9u_%X#Z ziv|zZe&<}Qz#WgNtuM<3ZvVI8@C}M-&u}dpGUBGZP2Z*=q?kfJRXYu;&ePlacoAan!XsK^^cWUCM&h;PSs9kYoA!#`n`f!=haiS8r!D|CHHSlrHQ9$0p-qB zC8ukHZORIob*6ZPy7~i|^wXJIe%cbNsk96)pa{18;NR?|pgA)J)oU z+V9-4(K3aCXk+$ST4uKRzU0twVcm1oc$Su7!|TUqiG`z#(DH4s2dH3#wuV3ca)kDK z+spA(H2Wbhz5V;^R9e31(&SZdjnv+=DVNb>=V%qmh1987JI%J%K~>KE>2ymmuJkC? z7i(4cs^p4osdVOOZJ2T{mAxPs|7fj)>$y1{kdZ&XrpKLGnFp3OMFDP%GK!6y(lPRkqvXV4X*3}#;WU~*Mk{C6 zab}6umplz0r&8f#w_b^fD?P(;GWjNb+kv{3XjidUi9=4bK^98y{5E6NhriMOVuw^; zdcM}5#ec;$*{QVfe2wLC<@wsh&|0ffF3^(gjvYv)QvLdqyfo-yEf>euygC4`+r{G0 zTQ1hlzzS%%SUcCw0bBFykcj;8T35bi**68LiOk(+^(+W8Hmdx}c}ndhZ$~ACUKtOW zTtTBIXcJwv8}XzYcG1fdG++0%@(qwCMfF_gabz0>5rCN$aVhvh*!%Wus{Y~uG&g?9 zw^_$GzbZ4n{al*k3xaK=MaT%MZGwmtW1}5y_kG7Z}6<)5rsf?~| ze7l>{39rp~t+GAy5fx9?I;JgM<$&kK*pi~Ikbg%Fpu*XEvuWOBt%vd%sa2<^(Tp*l zbgr#S=&s~r;OeVRXBR*nn3+buog&sx>v`9DY3>v)gJQ4JQeEFZ1MB(TM^rFF8$~x< z1@kbD8msd&XlxnA^W56jr@ARQ)N#I+Lid$v-h>SYqE)XN+=;vm#AQ(#et1%?n$%tC z;ClL#93VyK*Op{Bkwb=aM6v%6;iD$+;XG1!m9_n;R?^JP7zmV z#yh@3ZK>W(`2(%ITDu2gQnaGQhZp50ZHH~keo|j{=F-@|wm6+zVBdiUL**e}^jnpbg|pUEVUzHSIeOe)Iws{f_qT47*_s z(DLgvhv(r&hh?tp>hwnHJx?2o@hn<8$xG=I5q@IdxhrsV#U9P!J-E&$a30Q>eJ}r} zl07X0aDwL{q4Y{qzVIbJJ6+6U6p~Bo{OL7Uww#OuDjHi<_d+0tybH)9A5-AB$d|1s&wG^8gb9U`DNID|Mb-{Yf(2+>(}^RF#B zPqz^r`Tkf$hafuF(IbD>UV~7NzXjnT*2jjYPolz0&P=3+TeMfiAsG>jRl?oVYhNZQ~lSZvaephrWv)6x9PSZ>*u`Z`00mOhd#@ zjkju-QqpaU__{{C9=fhf#PfA$->!|qB|pAhfIHD}5|TT+y?pOkiCaIHOA)*vb=~K5 z(o}ivczNxdH_zrUy>+TsVDaVJsDffMdug~*up)}u@B|l84~pu7zfpF>H~R7uR8g*- z>-Y@zf-jazyUVo_Tx@WKxY+p>2;z$A$qKE1;@1nYhSq(+#s!w8w)8-6r4MCRYJ;GO z>;K$>h5mta6xE%jq}BGh{shHEn<}+sn4FT2gN8bMhpMLP(X`C9$Hj^fKxr;b*%q`E zW6|1Rf$b@UN~i6~2vdp~GA8#`9GD=exQ% zXFM-7ZvBnB3zU0mn;-3?WXjJQL8LsNudqRHteTZa_ccuS)2!$By5oyggPnsrB2U%cbk}n% zRG+=iig^kn>D9CDro5Tqim-A+@Lx8gO`o)|8HKQf%&0O~S82$nVq}|2_H?E(Ra#dZ z)F*4Vw3BUSt+vzOdntfP-MiUgDVn|)G}dcd5^Aaemcr&Y=;0RAVay#&=G;>J&ciVeQBnvL0sl=NJ-iwYmmPPc8?N;f}%xveGT%kpg7UGLEg4`}7Cxld!D zpLvgl%@qUPnpu7Y?HZezNP(AI{!>niWp+}qX6|{((I+bE6oBS-_1hOC%udC;U)k)? zj}L{7|C6EdKT3B++MKH%K^!}pn%6&_Mwcy^$&=7H1Z`C=e^k5K_Tanp@uN_d_fhx9 zv~w|iw?3v_f_GcxyB@We=+U*6V|pt&wZ+AKl+?s8evoz-`?{#XALxNv(_qy4w&YMu zoi;LLFpR`F(f}cYF{w@%jA|c}SL^GvvG}o^dhOi8Vv{L@6oUcMfrz`n@91yK#KIju zQEgc3JY{BvBT9uo-uTK}?2jw+H8p|H&9KfLGau)^bZ;ik zT~7Vd{;%T#yE{D0#OnEq*VMcFu7}sarK_(q0=) zTjs>NX!MiX+nCe;kiFXaJwNsZB<$6emC{~qSsAidTMT<8K8v(h4TimXzeQf-$o9&Y zIBmDhaC_|P9lL4MLScVks#2-bBCYek&t9qS`B-cY87o+Ji#9Bl%kf_|S~W{F*eoh7 za-`8qON3f9UBUBFgY(=wbly^cIn$(V+H=DA&NMdv%#Lv}1`F58hHyo6rkx$Ilb30u z;W&jXl(Bf=!%1h!3~YT^HY--qie*^mpVe0HDuBoHF_yHOPU$gzI2MjN>at8b_LHIV z2o^N0cDl9z;=H2FC#%<{dVXNbTwcb0Xvrn(ls+KQJo zD;(YY@*&}9>$JT+cl-vn^Lmxb^agga*r42G1@m#?wP{pQ9L%C6t05$lsd=5whE{n? zXNWFsuF{fAx##Ilm|NxK<#1y6N4sj5J!x06=&l$3%V#6j&Sn?$;Y)n2(KNXZ^{)}* zPhYOpN6L}!M)iNwvW|NAFM2g>_-DTQYY+d|4MHck-taERd2mYm33q40sOhn^V_iiW z4S!ARW!t`mCcg$oz{WLH{hF3(L;SV)HRQvmQB&brX_T}EN!#MuKDXs7nf7R`%gQwZ z>0Pr1n9gYWa*bA)SiQzBR3zF|sMFR^uh+HTitw#=_&G4v^w8_bSQXRvuWLnVW*jvb zdH`|MX?Q^#HT(@$2Xy}%+L_Mh6(lI!RNc@cmHzRD=IdCjLYXij!LZ3Nm`9ZJ(k^BF-)btRvQX8!PtNc zDFRknxVo{gIG$B~6Y0ugs(DlE<9c&GbkJQ*wBb#y40@-r&yEb*lsX;w8I`Ux?jhB> zhh^&+@}h0)v<`9KEET`Z`!ItxZMWVw z&tQ?w@Z3|Kii613al0oT?cD$1eZ)tVzrO^fiS{!_iE_8`7yaH2xHJ(XsiQXWsk zKM1C{>%@3E88K8ZYbl`ZA4tWqPrJPXekOsMz6y?};rT77(Ebn>T!cQIm2EX!wQSqd zo2b{jU7w&=w}R|3nwp-vW4ogDwwRXukY-f6fYD=By>tje8mu4RPB4Rw|2sd`AQNUtkaWecE8zhIzN$5 zzM|~C9*XkZ`xr*CZbO7H zMz@BK;(r3q5yH6Z{+7g~J?lZoX2h2p%>>tz`nAa8|2se)_akCBLqWiVWXU2Dg0(I0DC8sK0`uKb8Dj1Wzxf3&DQCP(}K+kwa*)E{5pLfrqoeQr@ zqb;4I6X`!cNdVpa$)CNw9yMYh-w%pHlS*~_+vG`}n(^;Z9|AlTn&aV+;Q##0NCeJp z(`#^B^)`Kntzo~&r_?x&>8 z^Hc8;H8Hl?=ttgvPDZx)qQuNDSeU;G7`*v+x&?!mK3Lavd2lUIQ5&AI;v|3X3{w>ow4-uT{+8r;-wP1!Zi) z*z)!uHM?|<1Utm&r{kg%Vj|F05d{`)tV*Z%Z{FS!0jaEt;vjxQj4q}bUPTVQ`e1dU z`=QWWuSn55&?UG06k}(WMOmy~1VlQ7k<*HQ)}+?f?Ja25}nvN_ zV4G<}!N=STr}(Udl;q{??$m#Fbw*8PFq+;@&^_t%aXj}*zz9Q<~LiY*r6FHuJT^@Ft zsTg(S2Bc!m=oVI~4050nCVDFloPoinYTJZN@N!DY;Z)Q?yNo}SKL_*GEuq)^KpI_ z4SNx&Lvf1Un;{Azlm}M?6W#M7gt99R&8E_^GrY7nMbE*z4t(bT=e)WfaK+z-ly}01 z9qEU;vDq}$tAB;5Elbt63ry(R*%pdZUtGf|PW9jBSSU`>+$S^0cM7x)_ymGkfL0gK zI$x#}n!7Xmc`2%hU%6!C^l?KMUXwa>hfi&7dvY z9*m~KfpZ**(_b^O5k>u>k*fOXLowvZw0wx(jV6zp(bXzygt-3XKyTx z&W55Gjpy=GYn~pCRmCt?)pT)vKYBS^h+`_XRxZqVtsEGb_!G=Wo zY3fo=)ij?EN#E5U$U$hqhNh_D{6&0LL+Qc}JVD*uBvze*U!e^E8bn-kM`y3skmHG)1L6$r5Kdz2bSA)`D5Uv!s4P&#T! z0lur8yM&XLt^1cTmYV$iGB%5O!sR)nGf{&MeD1L_ByVWk6J7DqM!O1T0VtJ&tH_2zGIIh_n@1Q zx@nI|;3nnb>Ah)Uf88zCBQ&><9_+6(@LTO!ba<5zD=X$XjZ-*4I+f7a`R)ford#cx zcciKgLb;nN`?d~xgvt)7h}1Y!Z5IPXWlc^q=XYRV6hyf#kEf#Bh_R{;LlEQL&{Se zTr>}yvcQH5q9>hy{H0?(DT$%upJ8M-5wo(viBf1RO6;J55;2)@P?@QbU*Bj+#q1 zwDoIhle6=ID}HerVi?%S#;)*$|E49^PPw3u5=#}M5TJosGVtnj8g}AtXG$s(x1m+# z!m6U%PS=Oy5o6f}>O?zE*SWUIb4Emb<`SMy-L{ix>Dgl0#Zl8m%d=?tiMxBd=ZImB zX2V)`+ROsuy+BE-9Z&md=t;YIVB={;@}lk*DSk4Qo+)y6m1m0ZtDf{xR9LL%)Boh4 zW>Md>^~_@&+3GeUE8qXpkzL8+W#ynJ(U({1lkidAIQ?AP11o98RlpSzD3Q#fK$Sbow<2>l_SUBJ1E#)Vo&F&M|sF*Y0XbT6pX-y+0;8hL(TTF^Bg2 zPS19(drQzCs>b4ace$u;VRL${Dn2X$AF_4cp4|8b93uJAFTX_;QY`g~E{PpJwx2N*l2%)ud7PRYJc^-&c?kbEa znokI7^WXO5i}zri@cZUJwfHINa&c_cZv@{tEU%2Bwb{rjPq-N08(HNoU(L*?k1y6| z{f~}pK0R}x5Za>|S-RmO=}k6aSgF={b9_wONNYarn{c#aDu6E@PWLRK3H}8s&Amdu z5@pV%RrO=2=Dhz|i5-TOcr?Q5p4mnX@cVyB4Wv)h=dw1vVkZEPiF!Q#R&sm*B<|MV zWNf5p#kkyf*%rbG5Y-)LXVA{6x))Bu7x(CvlaO2v3?$q)c!!3T>jU98p|2=4e%rxI zv&!{hB3@*^+2(r%PODVts{xla{aMeZ&C`Sn8w0j6Lf0>*>B-9In)~!u%Y}aRp&@_ z-%O!>d)+2HgyP$Drq5nBOVDT8`>OQ~=%)OZcD?9Kr1+cue>d>?wD}gHLymFar?(k+ z`TqF8AGO5i)7y6*`@m;1-oTPh4R=Wsd0fnoM!&E!KSl|k79rsR==lX>{o^dX8VaX* zoG*kz3&e79&gh$VbT1+EG3O7xKVXs?VH`qid_OGDWq- zm@0j5*oFLYcB5>Q8xn$C1nMZfibd5#(TF_^K$eWy!)m`M zWe=(*Rv|ugh1C}_b8rS2!S}vF7tYgfx7}^0qFwz`scv+ZRfH<|f#MQ#QJ&f}Z;Kz@ z+hyGsa|R!HNbm3Zj4+AI-=L<4bS{@{i0_zI+pw=Y8WdJk?d@87%YyFU3SRm!?BqCF z@sKNn>gt}3alFpl`1)%+;KpAwJ(_B-oR>&r6SgGK&WCk(!k+!nsz;r_MiT$Nd06ie z{aLdU4EK$*uFi;Kg8RKYM8PVR+-A`JWW8za=&AWiI0LGZQ$YqZOr(O!sCCsHA!gXk zRc$CxgDn&}?@#sp@j$Hu>Nz)CG7V5$7@<+^v*6c)TDdG6BvxUu4}u z@oJ)qwR;no=Y@J&>nWRt*7#%5?^X~SBKTfLewB-FjkG-f8mPj)V4@%v(-$eJhbc6sTXMS5=f6APrD#R>D;1rqs;@=@M9d-HLk(Wn$B zHhEEu|M1&;JCg6C4Q|@INMJmb?>(JPb>CGwQ@jwcP)3BEv6}UJ)9IAO0wTI%u}lC| zuiq>4>9lLHG)h(P?)8!T8IjUYdqy~5O(}g+>5^we<^v@%JJGpx=F0B|Q^Pa*hQpSY z+19P0Q&8z%OmSKNWqL6HglO_z_H7zHyi8Aay;1`a+P5a6oNUo@ z{XbsdlmUxdoE2uSquN+ZNRx}t1Z<+Sg4{aMIi^QiGaq+QYgsa$SuR#u22TNlNz z)=!Vy^_sMCZfu;m{6IHUHJL>cTxx_OiQ8AhOc=F+J67wc4W#OCqCgty(Cl^)wYtB;rfj)%B8Xk zY3Uv>>1nR@b0HP?uA#GD(wSPTxEGD5@7A5+tKIWcZRu>lF4g_nGLv|hdM8FWRLLY#_rG45$&$BBdf9eIA!uX2gkUx{ zX?Mb5xn-d=fuNOffizme2wIs@Bpsra-DB`O3^JHH1`BpH0hP_Pt0_L>mP*@ajf^DhRq))h1yZ9^Ry%2`!ySv+sJ+M~=<@9i*4xG0&9Eb(Q%S#8hLU)QZ z%q7g#%Atpv{{J@CBado?Wu~78xAGSa?v#)8MfjmmxbX>PZG-MwfE^C>Oh&at(!dBk zMA86EBAGN0AC}OR*FZ7bqJymziD-c%Ss2T^;S5L3B>HY{*T+SRekjxwGc28|g2Ej~ zi~&!KX}|k+%Hj}?M?T+){e-fEXb^ERTCTt$Vx@ZNCx=z4s9Ru1xB24Ts=GoAga|_N z%J%f2F*|e@yR=2O?_uBxb=%!(*>1@BWUBw82tykGD8i7|9Rhu7y?xImwC|G%X*4|` zP}KkHgH!qqQfd<}-p#qE_AE}=;84zIq4h{(jW_?>BXdcMz;k|XWO8?hM#lXU+HD(H z@v#ri%su*I8}{Vdy!4_p8nag~h<^X6XtW)hx>xTOeHnra8#UD~Nu^izB0Kja_4r)x zqim;(KiBst*OIU7hfEs(g?_qik)w9YQWT9jv8@{Snq%Eh6Z(44dPDZ|opr@}?&WK2 z17db}JYuU!qYl(;HEC=Mfm02ZYFOhx*<{<~7{C538Uu1OT8uEztU(rTyQW1xPo;4_ee>z*ecQ3XQL3gM>w(325-0`5@ zGeJ$2WqKCfP?A8R;LK_dV&5ar`S|@bs`O^1Wgqe*f?|q{=ee}>vj?;M;Z^4Aqg1=q zjSL0tB3>QG-8VoYK5OP_RP~k43D^Gu^}sOO&&a>~M+HJL8+1{pq^>J4&KrYb?eXIup>`}x$?-QEQq2zM$$ zu6{T^4dyiPD)_k>_#tuz-10rUtjA~J*I5ktH7P;%RE|6ovhD|K!2P{tihtn@3`h;m z#wsZ}Sdc+GQiDvQs=uyd8jY_R#py*N)!9*j30Z>{QS<>rdOdM$4)rf!{xa#-O_`B_#0sNG0?$_&uHT z{GP-xje{N`&r|&?d$8Syy@el9VE4>x9Se-69fAF2P{^1T_Xu>v{*c2B_W zucO?KK~9j@=ZofH$s?~zr58^LuEj@{gM(M%rT5IMGw8>`&`U!5ccRTFK%W7izEbFS zPJS2lNJm>YpQ+#dQ0<4*(jY1kNYATR1)XjgnjmqGJ=gxA=hEj_1-VIM-Z1ERBSP77 z?jh-s>xTuofUB`baGVtuBS|iMY;g0(#H&L+&Psbi0Y62`d7(=-UK(t}^PWBC>wNNb z4tj9eyw13+S!6Xv4KjOs$~8fM{zr|Xiw`zLv8nGjI#K25kM56-r?LTns8&#cH`VkG zhJ%bY17u{VspQmPA6nKWm@3EuskO;JjSDQsuosvI*q3EOH83J3o(PoMd9Bq3WfA&?;vkn;ZToV6uylR1p$s7 z7lHpeZBR(F2mV44P#G2xTHqVY$kK5U_^%Uz5x-CY{4+uUQ6N8uwN1Ot9iFOkzkgV6?1t-3ncU;Jv4 z^{XHzoEMa3lFSp_b)MyFBu2U#RCi5~o57^evY22O@}DCd2vlKX>+@iE1*931_Muy@ z6~37|4qn68k&+_bhrEW4VD$?>Ak?d(kNyTV%IK(9}8{YQE8cyohq9 zAXpchKlG%!H(S!&`-E<`m`28X0q`6{C#loOr)l}LsSF^Fjjp;8F3EQr-JV&i>TV3a z%e%e_O6|mFJ9VLhYx?mWDA{O8zJx#6b+fpoV?*3Zo;Zy`?#iSDFZuSji~!0Ly#L?u zI|A8T@<$;)Ax4c=Ls#_Y;JHVY4nLfXt8d(Hj$smEiIp}U9PF#9vwbfL~^Y@^id=(gh*;M{S z&}zP8Y$O^w8O?XZ$(x@5sAqKGDYXu5Pd;Ke6`lCa0E%pVP+C$UJAl)QF_m$pq0j)Jm5-s^KT;hi-%*nxh!GiY|v zN$z$HHUs-M7~2+bEUFC_#mcTG+}>l;3Q)6_aNIZshky;83_Q*sB5p7m z>E!+;C>!atX0@c!@|i)uXy=qeW!F@DyU5Mcxu=S;Yq~MN7?oUuWrAelUxMG_39*2W z3m^S&2wxJNGb1R?T_zoa@QJ7dLMMRDf0wXLp{cX}9qMkop%a9<+b(;Ch1A_nsqVz* zCFZ`#A$4c!N}=uyMa1fkd(W+?2wJ`84EjgtL_<#+4W0}|S$U&Sl>4foV5Ooo_d^by zh~jdg!iLX*f;B44>wbJNlYGD5p3-T#Vs34NGo&69cEcGSA;CiHOb{b72z&;4O~STvZEea^sn-`)f&Um&uO?ztch{Jqkw*l?&jDrwMM0n=cQFhljqM*kg; zDEPd4bS`a~5gg#&+eY8=`;fln{^|`CU!@T=E$ZtR3gzn~Q{86A<_Sg0-Ax)7iX>0- z!XUR>?@TNH61;&r)E}312<>rM|M$qc(Dca(!q9W9h9!8^g1@JY;PdSjg%poKXI5A>7IKzM8hN&>%C1>om47fpj4HmD!h}{vO8p3*0HOC zo?~%S?pqZMwQ9|)otH@k%LF55*s>tEb3oakA12moH9jrEyHslKSnd4)gd(gUbKQ%^?)E!p*)(NuP&Cucq10!O z3yjf4>HoaI%dz2^?7s{Wq)cmp2rc<|UDyoUn?R4_+QxX!Xr z$ZR?wt*@D;WXnngQ`1~f%CS-bx8{J-tXzP5L}+1|O0{dNq%j@KNkwwoR+zJc z1y6F+xJzYjA!d+qu7nmNxwlDSNg(@wDn`=d3&rZo+8e(TdKmjq+t|Pv*+5byMjNxgj20XZ-(N)=v-G;SAxHajSu^FC zDnLi#hB<*HGJa+ZP|-j?9A5oOfo%_Vl|75kV}c>EK)m3GM+;)sE`nC~-XH8X)YPyo zfxp|l7JG<8j+9NqCL4V72+mrZ%iZ2UgO0QndUBK=DWk=?xxds8gJC@ZFSh4O^nt#gw ztt{Mg)_1#|nsPWlQ;Ol@8Q(#1MHy{*;njGW21?=vOCjfSnJ4r)aZZW5;;`-oi%}}8 z2retB&7Z1|g_V^oixqPPH*B1)D!t;drD$3U`>(JXnw0ZpwC!^I@X2)BM!^{b4R!nZ zvf=R5*?;L$9bMG4pPmW~gXTL*7Z`1{8rDc@aF&(EHhRjm8WVd5Z_;A7E^SpFq?b(RQMXtI4%E^ z?Z3!$G1}Tw5f>w!MpO6!PNUg#$&g9c#&iZv{C1X$#wHuIDS<15&NOO$zg=S;62l}-CHROwR}9n;x3zw<&I{34Vtli;egO9(c)gBoMBi9gTc40zN@560=b^u zv5k+b(8r8*V;+US;B&UL)j!FVfU2FI=Pp2EJAJQ^Vx?vOw~LTka}_83(hWbG+UWz4 zGmo{?HhchhY%H0vL|3E)E?Yl&M#P8kM^shJHq*i^XdOt z>dsZ@Z)Mp*uCm@rf5m(6*g@{fd$Rf}+(BO0Uf)r^_=F2TeJ;3m(1&y5A-aS9G50kS zmHd~hr2IjNdNd5_pbx@5D!mbo9{La~RTS}hB z|4g0><~Zz3mj>E+e0>jmLJ$-u;CRHS6*><{j@Q4$^@MfttkvBg@%m1vi0VLcui%C- zfXCkwU?Z=85>JLf{%Y_8ZAX10Jkmnphm{f8$`>1ORBw##h_6@=`5pBy$jc=74jgTL zp7_C&%}YI?StorcR|ZL)^jh}*`t;aoQ=?8Pg(4@0IC^&&{Xb%Z;N+WBy zZa`;!LrQC}%g!O*u6!gzy+CbzUnCYr#QMPg&U){}fqayeb^__{PxffrqmuY&>#bI@ zLu?nlzXYk=y^Ee_R6bA)nOzu_S9j5CkzR+p=o{dl>%vi;uBasvU}0B%BsO>|>Z;c< zvbO}?(3soiz5935*N?Jr$r0odzLoF+Vm{fGe_Y@(Y}$ulJ`O2^dT8LoZu)4(IY(@q zv!r_=Nv%lma-X$aC?vAA;*}){ib|tU9E8Z zL_DCzO#<XF!x0Lm!Dxq!`VJpr8-e*DW2i@W0jD( zeRnJr4a=iZpTaLqu@Ik}N0$JlEvm%gSDc?2Qox4kuJnhwxRn<)J_SmWlfF)c~nH#NcAX(YP#A zl&eEv0)m+e!+Sg&e?D1_qp0U3=_z5bQa%E@KCP$0w%h#Wk-i zszOZG#N1K%vimdmV)N0ZW|j3UqVQKbpQgWamiEHnUeViPG1&Q(R*KX4=Bmm|LQ`BB zhR#iwVEHS0+SkZ3?!0DAapSN(E&bl zyi~4YGR{jGg{+7CRezZV5~t{Cd#!2X_2Ciemu>waZ(gGRxAjhuictw#$1r{LoqMQQ zhvuB&dOG0O6EX(qo4}Rfj0%NcRq+ihX&zc(lbUi4w@#(%>(C4vo6)n^Mh2XEqy_a` zdb+MJn$4Qp<0L6xn4QK>rEQ`uC2^dT*qN&jl#F^x1wkVoOgY_+93Zv`LVDQb)+ht6FWgu&-Nl*4lPn~0hk_*B zL^t)+P3mb;;&|Rh95E9sZfPh4yI&s3kY-$7zYjK@Ns_t{-I zR)$yZL4@0n@}kFLksA^q5~=A0x{$JlP%$5G8U}GA8SnHTsi#%TSVWbe4^^-ZIJid% z$I4V9`~52s)}G~7iAX$#5)nOyd0P%hgfEaWqDH2Zz{1jmg9np|{d4|TWg=su!5?0K z2J_Xk*BwH)p$3An>o&ol$Nvh3sEz(cQ^5qI-CoQfv>Ahn9pg#W+Y1~-GR;mp`ickt zN=MBs21*A8@Mln+w6Cnu;FVG}Qz6Q2*2RLIZQ> z)kq?ENJiJl>cMWSg8iC1P=jIXf`_rJ;%4F!sQqtese4W5Rj~xOs;ZZnwS;kD(?Cq{ z-!_p2dnV9kiLsMS8dw!*2!S%O1>?sp0T0 zA=_US8LVG^Tk37oz!_`&`QsA35~i+XX6xP|w5(NnTe5$P9eX&I_J*Z-_WXdgA+;5c zsN+mmcNmcf@%F+<#P64-tOQ$)|37rO%BUWf)%x0qN^Gve9V}>5qku&DclMa7#el^9 zF=aoqrpJ#p4NHt#Cx`?KOZ;SG7e__pVTZ49ko+dSR8=Yl4;08Pzg(^o!&-l|hTO6{ z(BKZ9g}C6XCXmJCiXp1dhNv2`%)^dh-5p!@fvgGJEF42~(06MpZ>LWSsz^+vQaENY zYe)H||6zNfsYUf7M)B^B0sEL|P54E-SKqukF5%(kUOSoE^nk3g_fv!2$h2D2F84*$ zU0B7^tVRW+&oEn54byD2F%5S}&(!Sy2D9MQxDXh9j5#&;50FFrFLoTW;r}JaymyKr zq8esdZ(|m!Xklnc%{;b;Ej3!tqBHVFPEM_yXf|c{897uA(o?t1K1+ZS69qZb3^Y@6 zZ}_3|jNrL33$xC~1dpn;+zI=NR~YOMl1d5zr4pku-S;w;a({7A{&*XgtTG8)QX^YD z;j;cUNzqa$x~gwM2}W2IAO|PmM2IVEVv9YNjF5Uw?-RbK`Z>blK!MxZo2~r&-++zH z$|xfV3B%eq40n?GE-a3Tu2)$&d=6$CO?0tQJBz*6UHIGkC`rviu;&DAVacJs>=FKnD0&7mQBMRC{e5! zBzG5%yKEO`piC9pX+J&3)tYGDE4bMHP{FZ^uO87Fh z2DUOv>Ar%ND5lR`K}!@Xudbq{6JFO=VTmF(v0sr2$8`n@s@GFfe!)gA2&`ADF;-w@ z(HEj*p&@2l0yc&s;X$X9_nacmZaI_1f8wz;%RV{i*p52*ZhasU+6Gq`wG zg<1jmVN-m7bYgSKF^;Q&b?K9Rvp0Rxgj2Y>u$p}u)bo1$KYkF`%pmvn!SU6$SgwL* zsz2&{E*_Klt`HmdMHrmyjIB&B)@Q>m)m^Go&?xBC8yrCU7_5AXO=)+7;+OIQA+MRC ziSiqUI~kpOliF!&qF5n=cafo7$j{~Y&lyN#^C)y>t_ipT00DBs3Fy7QS)a3b2kMx$2CMK>D%zvH3+ z@M*?YSdMd1OPWT>-IZ-$JX=%diAlg=t&cTlirBU*@b4ZGR-9xE_dI%5&LZS4xY8^- zD~H%7MlnH9qhdvzFJouRRxuW;QQ7I`*0`6m=FJ?m-n4>hhw>-r*9L3JYW@IgH;C`s z{j=y6^D!^SGk&Yabx^Kk7`C+5iG&1RK)<8jVtPkGRy!Gv)9yI-jk}6FWYH!Kg-s0s z4z}y^N<;fnvrb*P!T6Gzb?QoOwz9^Zx?(3DzDK97L_W*bM^s|%BPy}>5tUf`h)QT5 z(c$`)I`HgfaIqFNhITXbL}TC$+=8(>a0|^+sfx-4VWN}U_LKwPlNM@1N@!Lr1UzA& zGwGeN-mJLk^Z+Pnc}{BA`iGhEc>gSF#<6MFlgbq~Q&jAq6)7IuOws7KmeR7hN*}iE zAXU@U2i&w-Zumg~pzd1qF8Fr;m%>!0%S2apmSeYn@E;ACng^O66c9d~eX8pAiclAmt7zej#u_K zM020Rul)`6xY=3BhG(U-<-7}cnQ=1t&}2h@uE*NF$p)U|o&nES3>`gYe*%H;^V?V+itvHc0p1EryQfD zzo`fETHzg*J?Hn`TCd<)`(?}4dY$!F>mKU^bR%#>$snCDoL#|(vrnLV?zNm3M;RfU z-Icv)hBN1t9Y3N8=MhquUW5d2!e&{Nz@?|;e6&{LrEtOx=t(7AaTM;Sfhu@wh@mMe zhIvB_&GFBXAqG0yUB)+nq+hif7=CS%42GYctb_QW1{X$;rdE3N9*Xq%Wt%tBBYV(I zf!yXb7IHU&)J9Y9n7xj>(HV}O!(Hixu?nQK?+v*N9runejRJnlrvdDJzHH+;e!gv_ zJmt+EZyKJH?2=$Z(ClD0ag;pX*aS+8Tl#S;AvaeW59(j*c|+SL0=%H>FhdEh*~HrK zlnmoZ2`=3%yCD?fXkOMha5)stSZQ4l+x9}(FNP05X{M2Fnt97`XYqXv_d#e!7+NT9 z)UpA;THeJr~ zsLN@h36f?SX-|~l?-*#rJ=vwon%UAFR0I2`8XMqcu~|l5xfFGmSa#1(Ge)puTg{#Z z3bKs;C?r0R`qhdCP;%)LI+VONXcKsPY|{o9zZrA#yo_`qP>o`QX4!g0=^g2@UEH(-Yu5t9Lsv4VAhne!nw zap?gWiRS{K=tF~x|L$4BrY9Vn!EX`&@1&K|9Vw0QVM-=bw2i86rNJkA^5c!Lv&T~( z8CYiMBSRbX79 z2O3(hrvhC)V*~sI)>ebXD7ewA5shxNf$n$%dFl@_sw3X1sa-mj$Dj~D@|JqeT3#zc1sDy-*|5Zvz zLzR#Xea;kpRZ1;tqJ@<6t6(J(vS$l?=O~{&bVcMS_%+o;^Qt03DI7bhiI~hi%D8Y; z@AO?_r+0GyU+Ep1#qqyVCTz8(xvPpY!4bNb-swwi`Ga{pIaRnxR5rrN{~BeJ{{!wm zu;I%Y@m0m!Y5Jq%-i|W63PK`b?wUtf&o~HqO;ya?syI*z$B(XxaU2bfY8Q{6?6k|A znroMgUzu0)&v)xY&9LH>Ard@Ox67b#JBuq|Yfe`9_d+$kQhsq8XnlTh7&I&(7z~e?fDS-@t)W;(DrYeq+!n16PFigD zgY?UNm~!d|IcHcF&p}~@s$^FR#|+v>OJ3~(tC`Sd-3Fp?{K$h?6XBhC8;HWOqagAZ zSTyaCu&qPmjp3^4dSM$Rb=5!7Lv}wS?K$*d4X|h2MW!L)s-WB+)bLKfR_lhBR=e0C z!kHqXau`Ddigt}804i<@;Iio?pEHCw${S3#KZGs7)qz_RY51(FG=N!ZWTnauC^QD{ z3ojXI82^!whYm_(i09*x)8$=RsxRmiuj~?Z4k= z;|Eqjf-^&ct@6ter!?a>o|xuUGoDyKCsiddgtQgFcfg%_#8lgm2UwKj5DEcY8ZZ;a!A-Q0{L$876kZ3{;h$6` zvQjvH1f^Jn$x-zL{Sxeib%Kp@4sh>7RK!-OYM_Ud<83sH?PX+9-A5Fv8mJqnc)^Zf z<7!T@M{V__(w`L?>eJOz>DdQ$r=Xz!?Rw~A8*(004?U#ClN}D6DGnU=r4nB?+NyuY z+TeAR&mYn<;@LZLsTO={@_Z@x2C0V@KElw3a;GsZZM7Wg}3fq!13 zKXE&Ln$a5z{GE9jJ@$d_X~sra;Qw}-v7ThM9Af$`^N0L241LZ9l4fix-4%ozXKyVq zHiwjS<1$<@G@jEn04^;w>Y&S5<3ucY-#6CS0jowmpmdQj6dHeQY(?wcRaNWV>39Km zVUC+PI&Q_sMmjo9Z7ou-eukKw_hKcu>X=kEwpT1XD@({F?rF$Qxg5dKO%3@YZuvvT^UgBpGu~JSdQ337uqTCDpEO_sK1tZ)Fm2V; zKv(My2dKz8j14Ovm&oW?vEm6vU+3reP)L#$4arWN-+)sFwy7v}aDE}?R=gX$EsP&_Z|8X<1Cy*ca*bYSgyK){4}pHUMxER0FTz?% zT(CRD`f2cKuJLincvr|7_#F03%r(*m7Aep8qvD&@N(xQS%#cCOu;%XIGtc-0*E5@I z8-qI}(x8_dlArc#=PG9#D4cKu#rkhrqZTu(CfXE-c5S(c21m4Ne$`qv7v7(l zL9}Y>C1};IEMitIaf$H-{LrOKj18TK;PlZ#b)Y}QyiVje95Z*_j_#nI6smv%ov#!; zi%0lE(NTpr#D5Z}hS5unSqSj|qBe_w@vDq#mHHEJs(c#~y#-ToMfb$*A?H zy3tHM$>bn@wLx|5f-W%_g?>{J+oK?6kI}JqL5X|+IoMcNE$yU2DYW-Hq=f5cra7wv^$#1U zJe>k695aWv+U7|8#+v_1H?hP?3u#}iOs&b*O^hG6kah?wUT6x>>U!7}`u)t5v;9!h z)W#*mgpDs%FIu94 zCU2Rj>sTE)?N8W&bK#K$XSnM+DX2#tRzlQi#&p%dqh=^*Sk0ml1~2#`dn5dV8E z%2$ZD3U$U0=`z-)SdRby)?R=3z?5(2_(EP0<46ZJNo7??mBO)O;#I54q(;C#kZOVT z#KyT$As$q#REBbI zI*JL-PC=u;WC`!%l-fgs^7Ul(fIwcjoz^(#kk)v}P{aZ*ejIhHm1k{);XYfAJ5(E* z*b?tPa`e#QVRDl;<%kkKrM^k^+;+wW6w~g)v18nJDycTP&2yi{gh|k^-ZKpfUNXg5 zWGVjmF;__J?9g)PcRfj z)myKB3^bIsw@kG3xH=7Z`ZlPh#8nHGAZWGBkh|;|a>s)+q`Hd$kM8ApjxGRdnP~Tb ztfu@3d%N3-TFE0JYWD`sL4IT{N~vyyjfsy2A8xbf!z~ZYhsu*xB!{Pi||6psHv ze!LHGHDyQTFE-#fuLJ+Q-oHO=4)Y^<%f^q&V-87~V5>X5ZK5+6bsw6=Ne(>fg?~fN_+Gwr?%|)I>8pIQh5%JoP>c7o<+Ek||(KC}XqB zn!>)x=#VAA=<%l3%A*LT6e~Nh%Bpa@DS{n~N!t7qvw|URW(y@&X}CjS+H)FcJi$b( zG%#802gwsm;n@B&v((@VYQiQqSG<3g_5dwzQ%3{QQ*njZA6pKd?F8DhXCt8JCyx-4 zB4FNV!GCiANziAEz!(%mFjYMG|Bap-;~Yf~Pb>5gGc57^{~0NCPo+aLb@(=!qQ|u( zQ_H5B7IHnZ3wJf(!tm>oJX(f=c0-0Ql&m=Sq9$YNZXD<1q*Z8TRLD90kAvVj-4r0H zJP3W)n4aQ(2VRxs3mey%df}W6?z;$%if>`Yv@m%3JCjPW?U!OF{`;xeSk{ECgtJre zg8zUz@0O@P-jZL8)YHc+Xayhtc>VH1@Wfv$-@Ksc2IY@*T*t1{ezH&ioG zDNnmp3O&#L;s*`QM%td5%~6`&Y?FN=Di)f|WYMVVlD&r*9avtQ%Q87ON9k$!`ysSX z$P^h1RM0-h)QuwkOA}4cR~H67Xaj?}^5tI%+UY)?(_#$MTVnu!7oqM2M#^M!3-~d| zp^)`~s<0@93)7e}52|?h_%z1bm7>5S+DCgYZn_#daP{a_wJJHTU6X8mLoWy0S}1qtO`T#Vfm@@Ff$ik!300y?xDY5Vy`mhuc>Z z(}Ej#88!MW$hyxVE?--^-lU)!sCd!XVo2L&@{kl=%`P6=kh2;L98wexX%PV~+#*=D z&lKRo3`r9248wJ0zJ6M*i!hwd-hdnc{y|3A$Qb^8p!MDE`y%?O&!@} zA3COQ?{-r(zCH2t6#;N!zbS{yfzd_izoJDcGDYAoH+Pse2q%L;{S%@g0hSe;SeN}` zrVA$SGQ~jAka<{I^b?C`&N)!Uy_Vt>x~$zMT8GnNH`d{--z*?0bGIoHD#U|~gC?A4 z1r@tZbZj3vXri6-Gl$>OKw6Xa?$G!UzPLY>9{ln(i1}zbcAZb-R1mP$MC*M2n=wb_ z_P+RHfhj~4Gs^#~Sc-+@wOdqf3f`R+iqnw=_eI*1%H2%(TQw!MQQT1;|lc_dW-yFPdk- z%=CrU+L^!Kl7>S@@CjE~Q_2dUn3Lny;e--CJmFA!W7lnFY1l~z%~Il({uxM^%%QQ= z#pkZ}pC-975i+m#_feRRAaZghfmdkD;fRF74*gSMUn#R9s4b35W~_nq*QeK$&sf9i z!*dgGLR%hWZu~4jIF$sM?`F{Y@XG051WLxOfy#B0+F5m`?)_X^8J;! zPpy%#LJVp_POOoD?)lwR;bo@Iiv{)Goirt!`Ns4RsK__jk3wTbiutggURyahw{BK0 z_7lzf?TCv|GQ>Rc!rzYA2a=M0`Emr*u7?*6yY+Tixa2%XGTJ+;l2IufSLd+SvUg;K z#6cHnyA6oUOI6T*A4gSilB#keUxLi`iNK5>Q)aCAqzW_E;_8W(m#98nB(oLK0SmY^dONI~vLq)*n?-!348nf`E&CKO-(?JzQLD$hP6)hwKNz z#a1gWW)_;6CB7d!u*$Ey;9!=BgD)r!3MM>Mez>^MhJ%WQ4}ya&RvbX??+2oQxR|Rg zjJOvj3dS>Tke@k>m?(qF^ZipTTDq1sTUMW9R~Y7Lruy4n8mjZ`bJS*=XTO=DqB_-f zH?_cIp=_K0eLjUg<6%M%3I1klb%m%0s)1bjla20~0o5}dvE|(0vT8P`zmHq1WbIm2#_>=AOt|W7%Kz(Rp=)Q(4Rht(C3Y1Y%rJW;)mz|=)8i-2n9H^N9?3gGr{Am>f9HNF?`(DDZMC0JEKq;g#iY=M2XZY@an zJwS7Cz4N1uV7cS6qhMn%2MKoaS@RmYh;Se%(kc4ZE|zVx#zg)&sALitgVc~&<0G+n zg!#9j&zY_Hx4Xnd+COjp;BGMy{snV$mutl+J3DUef>AFp5APm9k+m2U!KOn!Absk> z;}~v*6wlGtXzSmQp3|xhZxFhT(9Nd%Hh@=@fi|JHZ8nVs3@g)BSaq4XA8Z6F{b{$o z+O2lOR4pzs^E1qKArW^>c~}6YZB-6H=B;H9uwTkndpB*MAY}J(FKRtuR}EOAU{$wz zUTdQpGY-OWwZ?%hm}*-Y&e&j6hM#SC0A;BBt}1lkF}zy339F&nR)%*64byxWg>!sw zt#VCO_{8ICsmDy2eHGq=sFv!IRp;%KRTZ}-s~j|DPk(4LW{@Tx+*j!AD&-$0P!5{0 zZ*BC-)Ec6oL%M@zthQI4iHnc8LgZvyxWO?3DZjA+#MFmyTpa_}dN9=<9LGol$x{SY z)1A+>w_f*QHbGOYnQGgz^&lK~w*nelT}G7Jgksc`b85@c&aS_s80j`0Y5D+reL?$~ zO_r2-jBeG@Nr;lZ^Z7prp@U{@)opwz96JVIZOhh;T-&1FF|mSabL?of(ji*ax=e{+ zI4Dl-=G!2E;o?EH!c>c{Aj>xFsuY&gw3KdJC616cTeA%!WvcO)vXN0z?ROk+pv~`a+aA76$aYt( z&Q8s2z%_E7bVUu^Ai&b>HPc-n?^`piQB<3s^MQ)VM^x(5_D)O*)xJ%RHizUlC)4ul zM8y;xBs;GR_E1^U{n*`31zx6g0e4NH#_r8%0s9Nhv^Iq+H9rZ7YXod3-B=N+TxMgZ zOzDzv$ipA8a9a(jqsBFaqDFZxSaFiW4fe_U&P->)XM8`@2ejXrFCd`*^JGx({W%o= z{Lw5_5!HYO%B2kLtbU%70m|12G;y2;$w#IRg#QhBIB72r$Nz45P%f!T3-Oql@tToC zGBXNt4Xx@xnqNQ=OxtY!Oj2G4bgeG?!tjrtmt}{BHsSmv*hn&ST<1_2R(jCdNOJTR zb7bN`ULvR;MUbel_I!K5iC?g|9#&&xS7ZGD#QF69^jF+_;mqV;Y$PcvJG|A}9vL#S zM*B;!Z=}~&a~t{kPvra`VnJ;|i1O2y|z40?#YV;Yd z_MhQuz18*^h1<;RGk)1-`;4IN=Ec~e^QZ0R$FODSrS0Zrc$B*X1CKqRWQSSX>8m5& ztf5d0HWQqD#QTPmlhX}1CoLZR`LpFnjYmf7kp(S66KEeSLF%;A+?MMJV|JPYQKk7n zQb|`V0N-h@#COfxWlqM<*it?a_<|OiwL!bh^(34##O*c5hJLafaXt6gZmfYJfd+ovYj%|wvf%7q^I&{` z(mwMD{IhkRc_2a;x!*j|xhEeEYKht(_Ut#;SMB(7A6ked9M(^*{&OGP!gIP;___ir zq>~04~QC!}ABsTE(K@ z19=Xw9euzYDI0;8Hi7h~-LR$d0rOjE3LZOXeiHE-1BD088rU=TLb#iZkEPsz&4?3V z(?RoN_;WMhe@)SV%OP_ZqPO88b65N`?2x$`R$fZ^7U1>v9N&6a02YX*^3xkM7ZWaN z;}n2LV{Ztf11S=gh=ZQcC=D{xS za&q%^LW)WUBTsS-B~t$TOECR6^K+X zxc~*}SLlVgr?h@2Q0`KG z-QvHt%~^9p2`bW@v;#ibx5A{H97dIy15vO_zwYY~E6dE0?x$9|@^j_<_sH#1NXh!c zFS|o&80YFNQ4fXEiTnKAwUoQh6$Vr8&K_PE#svmkUx`@?iQ37@V#v1c!4pS*Ui+fn z+>p*fh@HAK09*B!N@1?S?5S8H{=C{?9>7T?P7u~hhMka2=H~46W97W@8;LpvhMUZR zR4Gq3nTMk`zHVYlnV(pxf#fePctD2POn1>F#_sb6li8e#*YqRi4x)0-;j~hwoISs2 z796Dz)B>uxS9paWwo;3lmWpbc-GOSlf|#}30Prfu*Q18c{GwS4Piiv9Amo>CNcl#n zV278RBe@aKzb+0Dh#uSQHCH#`1*o%h6`1hBwxF2GctLeupKM$ytz3mk>?<@x5)?QoHsXh&d~3IfB z<}DBlZ?!r~Y`1Si$sj9wGy=5W!i`Jjj`EBG7k<}F=yKWo8X|l7WixGq?kAx7_+|6Q zxK2yHf<`t0(yo}J(EK=KTkw>T9X0Ufz%P)=jrFAP%N4VaH$~NQ0abFedCq(=Q&*Cz1|gX#t*rul8@a*pSKn=v>5VsD{l zlfYBA%uh0{a#F@08ONbk$-y6}R#|t;{5scjW_|Jo{+mhA(VKaROhg?rh9e#72@c*Y z4y`&mc=!>??5kZx0Z?gu)UQA(M>HOSi^r}+-N8u+b@AjllqJQvn0a_!zs7_>QQst` zpZEwS5?XhD+jt%S80wOd5|YUEf?X04rkFil$GhXX3JG}z&vkMpRL#8UOg=$kU2-N= zv+&P^XrQ;0P|e~6oV2+H_CMWI26Lr^dd=RzUGL)uMN;xU#fJv+e`%wE{xULzTMm0< zBo@6M-|Wh392Woqa`GHEcI_}ZNu~MYQU#%#XH+hP?&EmDg>2z^tgYipbR2g9;*>;- zZ%1RDW3h*Lfi~jnZ2S6u1 z*ThZE3$qG1G?XQ3@|+BVJ;Kg=fBcPUJYJ2zH4QX`z(_CB1A*G%Mf&0&-AV(7go4U6 zu<1v=JFGCBrQ51fyor71UK!mmG*C}Nh-rm-Ub%>^UKMOF#~OVkbkGo1i&;Dbl@#4` ze~#`My32O^QVnTPWv6|{`(%#fhA!)=p97%VNOB(KQ^rdmWhT1(Ngohe(V(pi!G`cf zV`bA z8VIe!&{o(g#2<=QZj?b{9U_hVcCwVUgY`tcje1jDqC4S+JC3@VE_}s#L7BUNuFWnV z8EOx8Pk=h4fnS0pI4i7naK-4tU#x(Gb(pG%8PmcCJYSHwKsnQbyDNU zEhEr3ltjo!>YUspW1#en-_WwXJ`nfrg_3wwx0Rt}KjN`4jCAtFAt3^eWmY4bvl;@m zqzTjE>!>72QHQIayy&CCPms`!g6;4R>hpKB1ob(b(vlIl!c;<9Nrf*A){z9{p44xL z`NMu4D!HD(hZ8#&QNmorso{jK-#vtvTOC7*%`uelsNA)h)_$HA|IJA~0L`WfxYmTJ z`ARQI2t?H-I=7RVI^GXg^Uk~{dPIZ2rPU)m3YU-IImQK4_<*qWWvRXpTS*^=~x<#-Y)x+9WWZ)hAvXqZL?1q;q2wWEk7Of%cE5|BhQ zGJ9HijEywIw+J?zU58{o{x}JM9qY2w)H3_-i}7cn`ezN)ysV zIzxg%wBQ&L3okb%!7}>tAV_~wp@A_mq>*c|@KU5pK~oZ>IJC`+SK+OtO-V~`1_Z>A zp6r%T>n*X!miaMw>6v|AxZdmq2V#&%&t=6Dt>Ufb~aTwej#bFN2Y))b&6?I@obJ9anQWpYRkfHdUkKO*A&DqN+`{%Y` z?BC+{D_B@eOWEJMC5iK->|a-4f22n%h;80qBeh5XT>zK0WU8$-^!(z2FPw@bzA&*B zp)H0ATQSyei_R^Mq#5w|ovfdQ=a5I+3EyDVa2Cwlu|6(+vr}bva6RrBZ%yjm&ibjX z8S9H7xH}$e$NGU{WKK|U}%r};vM{oBFLA<`9kYvq#-19 z5aqR)p2X!evb)a#G46;9`2!ZPpr{$~RUWkbG6GI?Ad{pC{2?b8)~T`{#N^CZ!`wLH zgXa!ALDID=8tAa$xo|MX5jQ;dGdt%GF5h-h~?u-K{jrUxdqL>RB*1oX(A&M{#Pd`_Qjo}!94MhACTZp$07Cl zAV24$rMqY9BH}=soEo_{k0-92WQ7FYY37jqr!{ePufBb)k&SW5ZMsggm$+<^s;K$C)4e&C4qRIMF zCWrW^tkSZ8!}J7==NIoP4~EgHM2R9JCYY@>#P4M^WEZ1aPh5CD0QP-Btp%LwLRiQs ze+6j)O}i2o#p3V6_%^5zD|-9+s4yWQnmnzmdNCw-C0e&zpDTC;a*-TemiAAR(Cn!` z=n7!$Ue3Egu}2`P3?8 zgk^PAJWqRy;aQxkc7Hry&tZ6;E>E%I*^^qhG5FOJ%6#}}M0M+@3C(@T(ZpHshacu& zkpv~t$rOJ5}uqvgbI@Gn`8N%|2qq?4G0JokYK61)hr_V!R zFBT!_-wQER3?K9&kNd41FGC1r2%&oi$rTRa!(4kl?C3?XWfg=x%dTwoENS5J?PpRg zt;{*Z4OSPz;Ab&}feDspNfKlD;^*sWpkZ&4j(08VO=!qXo%QjvVQ{uLE@~6N^EuMc zW&JM_^-hlW&gKV4a{g{Y*zU`<3iVD%d5(l*C{B*9clwO(zV4>8LTU#0^_+$D71R4* z3dq|Vh9?H9FkG2hI$HzU#AiN$g7%e>++|4o^?ba%;tC>oImC9TY%W@e3Ypi7Y(Q1UYBvE>zNnpm6}Q-PtXnduc_iW%i<-V?>GP)~wkTE|Mc>_beS zsUWE%#^-bT5EWimQ6Xd@)#x3TN5fNGMQ@})E?4m+{wa(t_sx=2L?eMT;AP%{0yAT5 zIK*_Wq^q1^k_s9_O7C3R5ijtAN+StZu(^tAjE2`i2PnRI^8uhfQ=x{z{mF00_dSwH zFQ)08Fapxm2YyUOUwH+%rI2oJ6w~3zc@)uoQ%GIzZAecc8n>OZ>(Vf$jGsOYvQtPC zE)DjjkRbLL6ysggd0f}n9hT>YsUh+e5|5OTL*l-QKwP+C_0N~DFx8;|F0(=d>-Fcu z;ka{m3)TC*zhVD=t&`IC_sWt>Y4488p>&+)y&(Z_RC5A_U%KP z5j-oLQw~cZCxwK;wAYYCX)xzC5n6Ak{2Y;1^cwjO!iXg7cV2+e!-W?#I(n)o6e;Aid0+Ncdfpdu2gTc1=*yD2D}NLvWRv4DLg5weoy+2A-pHsG;zkX1yV8u^-M>eJ?-(n}(7z$gB(B zB=5QB&v)g=aiXWwcbuEQ)R``XI}IbLxCXYAoIq)C`CufKGbD~^5DGUpS9IojWc^g$ z8)j{(2!J{s6$)6prNUdLR8wuzKdl`7lm+FkP`;%i_^y_?s>fr=kswdq+vDl5x!huj z8$)vy^7;p%<$loNE%d{B!KTgS!EVeppLXVbP+6qD#cZ<-ot^wi=r;}DR`CXMfE(l- zC~pA6wxZh=w!MPZy$v71Y^_(Bvj)m9p2v1HBZ$A7HDxBp`Kbz2G|q36k%$9Ns4Us% z2RrAGKv?-Uc?`9|>9Z7IL-yzY8wU@%!n)dB?Fr?lK3f>`MZYwuS z_z-l(WXR>EDt!2jchK7y0rGcAm~b`ZlCm~|NZuK1SEEN_{Q zKjT|=zKd^Jb5_AOM6j>Fi`Hud_`ip|Ig5jQw+KJzfd>eB2;^>3Xj~P19m+!L{@F?8 z_0d{1cgEW0}HMAK`x*}7hk0#yxC{wkx>J3hKCi;g%&If4UwlI~-61)&K#t!Ol@ zF{GI`jkCl6h08DkC}q-sl^x8PFb--K3LDNhRtxHK(HPPZX(P*yYZ;9owYktZ5Q5T} zvXf^Q%cD3Av`Isin*gt;k+Jy4l*SaJD{4ZR;<0G-RzFK;*$uaBu0d1G zg>FtK+wkG;P#T)x3qE<}L9lKtE`}4};#d;P9fJlRnJR4QpK*+d=Uvulimo75FF$tT9X6qT~G?8@i`sRX+*YfihvzioqP6)(~kHqIp zByrMR5*|y~+$9<}7d}*ADn2wjx2=}*&F-rT;}kL>9ou9Q>FiPEK`>?#d5+$%gVYyL zNt-4SrF=Yx&kx5a%Uc@o{1k&X2@v-wc?Clr^#oKX#n6lkFKR(FaT`7*o$*4+WHOAI z(g?_`RB2$+Wb!H^ynHhHsRrmgg>+SXih`t2zqB@U3TebyF;qB}4B#@L{xs5^D)rQ9 zgs(RXUE$O&;hcx0E*FlK6EkEwsk^i2Z6cd~eOB8Nk|v=BD4&MfXD?izCYrV=h+Xh| zAf#V zBFPxED3XQ}Ek9)3-L_H&)4wVAh5nO>o39W#;;I@GX!#jNF_PgwpJ9UW zc_c|oNMG9Bw?Wn73lzy#Of|47jWd)z=(VkwD{Hkn@oRfWuI>9dapt%JNSQ(2LYFdW z;5r{Dn}IGemPpOSfGS4HU0w}=4$8~%P_iC>-{X#=>EYL%hUp{hhK0}7`OTHfvAmJe#w%mDPNLFNE+jpn88Q@ zua!Q&SquEaA^H6ZVUdl~%3Hw7uUO1|#rqXnIQA83j}q-an~e9(*(&tMdK|4IuIJ+L z&+M&`Kby3a{NW4w+2|-HpjFb1Ml%vOheaIn=aAR%c77LTW204-?$BdC@%FK-xhY03 zS}@vot`(!nK$qHx*4*#5Yv9&g@(SWs10OCRFTuua;=;rWmnx-?`@pGeMoM0a{~xu` zq2;!lMd9BSm2|nyvf2KiT_mJAXlO%YS#lpg=R>Puki!BnOhH1y^lC7*nA39^Y6Isn zeI5)SEye(ibxFOE9-W-W7T9&NmJt7}`Dh+TLhyW&pr&}ZCgK5~i}jgvt+9t>XuYhG zh8@Cy%q9PU6?lZ08M%PP|4%L;pW<)faLfFX|GinMXdw$Xh_#ych2NDqd$^by03nO) zB0EDC;fg5h^8h{ux#`12Vz{9Jq^&9UfsKoh+6fS|n6cFdi)gC zYJB}tG&z_Qzx$2#kY?#Bv=e>yu6LEuRY3FX;@Mc&3L}@XrS`mKB%VPx!Qvc|Wp<1` z{A1 zNht4e5W4QN4pd*EBp6p>05bt@Iyd)&I&ZyE51Otbu6RvhmbAGK^jyV^#Hdx|886E5 zQ$z$IDK|SoW=t~;^j&KWZYD#&JmP_zJ|vI4C+&%KrZ8+*Z+l#|&L>_BSKFYNsIbxZ z_vAI$l}~TVPLB^j{c6l7(RamA{5Qlc{1t0F-1UA6K`F+_sYFcwh6K?Z7K?S3d_!Da z49ooS>ro^szd?gK0z$tflQELK#|hpXKyYmAR}){1Fw6NOj7w*rQr%V5T9cKjlETr|#ODrw zs2DOT5e?pJFh{=&o?b&j73TzN2&rrEyK((Bbqxt*Pdwz5o$@P(T)U^JwHJHj&ufT} zM-|5pF0a8bX);89M|5&(QIBAvA;ZI0dz<-H@JHFV^UP(#nX8aG_mn@R{alVsNWLSp z7_o6F!GhTM7>t+yIp@43wu)+fEtdWC1nsJhKJdp|4ZI*?<4H_0e^1)s*_5Y-V;I$^ zmlWcM6IbZ}J?SE+j`wj4x>N6L!}sKEx1Rh7F$LgySE(5D1Mx$0pA;{;{~~Yy55!eY ztC>zAxIL^Q(EzmXG?0PzN8;wbdv^d`;@~wUPH;Wve5kV2LOm>x{E>0MX(uewd`<@? zHxuRHyN>8k4t@jO%ec-;SVtP;(eJ`h<8~9!()51Q&0WEtu{;Lr($``5pNh#`iynzw zkG!-Jo>@d-Nf}IBz!~=ueant7%O9#)F3|$MBCE zg)UZDok4T~sT*cplDS(1Qe2X$(bdIZ)tdz*BE+^L6Rtv7tt&FfFCgh?4`q=0UX~wZ zPizqAW|yr8uDFK=MqWw{#~7fHs;8OARfS|M(!&KdU5cv<+0s!V(0@;bi;PyQx=h`*}Mf zoS25ceJvf2aQ<-(0(OulbSWJm*b;Fmt>6RcS7VTbN;C%E=u&#z4$>DX7$h#B*LRuh z@1fv@>^wEM!Qv_!(>wJbdTAxi_=G_EV;>=rKC0&nJ(iazy0W+e?jyh=^qu4>ydo4* zcM*Y%NO~cXKuJGr7o%nVE|P+aJDu=(UgF|T!G~M1+GIBi-oL$@G_?A`l!)jD4-jaX zzng?2qKbACT4fx+2i>~_czF+@y@2QLA@wbb+z2S$+Y9TO_YgN+*_!ZzJ2ZJCh>b;S z_{?6?ydkbkBZbcrtQ4|)lwgCACq(^@*o(p$i{-w-cc^BT{ukE1C-;($w`uss``G%b z-#!|qgVFm)VAvf`U@nzKx5ohA1v9XF_mMR22k5aMg*gLYKN$qOi_lrj_zlh$VUZiM zcKagI(j{kYu@hqFDEbx^{_t55X$^aBomY8q?&x=M7&@2oIln=Z;L1QHE;-o>Q@AzI z6&G`Ag&RMAHbfPZrzNZNVPr9xPX8(o;9FNhuLEQ_qISyx767?%01^ER#2+MqRaFvZ zFM5MIDOv?P4&wTJV^&o8Y9VD21tn4C-MBH(D7rih|8$QoAL4##iYuC8F*~vUu;95> z9%f}$xzTFWp*PB(g`jgR_a}qO7fD?>*SI_m9T6!8$tyQ5!IW~7a$0ni*W|7V3tEyO zRt4QRO#vIqa2YlLh94EY@G2P!wIw+L`;W5X80|4EjuF!nn5qbsVz%`|ny09bk-q82 z*y8V`XQ@Bj>{uBHCt}KJQX>8rjMHFK>ezCc;=|ko{iFUBO9rsy^;gEZHs+rOYjF%U*!aGw<&b1$rTm)Amj>E z=zp9*{!4?tTq)g=j0@y+#9R7=-~d?eals$5dsNb8sT@jE12oX+dgH2kTdlhA0nA=r zPUD3lMwO8H{DlxG$a;?HaH_6LRTo+@)s0V5VijIxD>q@^0@WsNz;~Xkfu$u_;5rhn zl#tJGUmNkQ6{;oa+%|OXmq2RjeTpjeQ7YAPoGS_~AZ?yQS}V*=0-iu9@6J zjVU{cHD%Y+hm{&5#Y&dA@@u%72**pVg88NUakM&2cr3q(`8}61CO!(#-YRb=I_UN} zy@w?t%6p2)YcSow*6M0nITGh8L@a2T%N@ev2Nk8~Bg6s#dc|_1MRFnqp-F}0E|vZ; z&qNNQ$h>PN`_RB~0#m<4Sm1sdA#L0#dOx;!dxwaidx~$6e(;nW<1@}!mYPyd!$)wq zoYi+=6*J~r^%z>YMPBs~9UWXIy5g0aE374-m|d7PG);kl>JW94Zt z_>!Lc8k46IJXau`Q(eGwpIvh1L-Abm3mEzx0m&Cw#KdrcMNGUQ>G}1TO}l!&9t^$6 zkdFo3&#(7`yvc*ZV8ulil=}W6GuYQI5;{|;;~(T@lv}SCR{6p(-$8Qt;SUVf9s&Iy zq+bL@=QPW*Lt*hfT!XX(}%}Xp)RdR`pz)Vw+Wx0E@oV158FOyJI?dX6& z?h{z<+xQmog435tf4nk8xY8Z=RG^Lws>8X#@GC?u^0PhCgQEn8gkw4CI`-xqy~n$u z-*iPpe<&lcP>hNAZ=n%=7ygT1wR}BXgP=Df@W2~aNr>xeta8BWqJnR+Qz;3O7qFrS z$h%5H8_=KVb`>XnJ^qgt5er+9U3eYy!q~M*aPcbX=T09RE`BD&T_6Fjbp@Y8Jp%rZ zz4r`^s_NQ?nY77dQYO78lMo0cgoNJ7&;^pvM5KnIBGRIwqLd(tpp<};1yUv`3Q89- zHcAvlQ6PY~0#XtyD6sblDpvfiwa+<|5V?Jx_xpZ+FF%;fnbY>#ZIx?XYwqu=*KB{N zUTZ*|_Pv6b)~TL}^z;JJs*US-M23HQ$ z1A*w6W-C{VHi-UL2+z=8`HScWh^p1q#=I9so+)#~W9@o;p^lZBXc6s$Hd%1Cks0ix z%Uw?kt_Qgvvk3OLbl?Rkg@S%Ugt?>Y6sWnbjx;Y@w5Bs&f;Y@g3R+MSR%N9x3)4f$ z;Vn4480#$INMg7Cay#gu6M_j;) z<@6N;?L3=W7&`wfUs1m%erECjU?8iA`={Rc3-Po4zM_Q>lzwkI{$i&%3h{&Wlt)=v zO=9TkwwM6w5gE1FeFSX#}1p=VfmcK1c;$tWe%$R{(3Zx>1z*X2vPQ~p-F*yvc3)>q9D6yf~-0N zxorB5{xz%4s-p=^*pLxV!=?Hpu<^prbAM}3>Z&TY8M^+So(kvRoX>QpE3tR zXvZfY8Ge1Qm&5oS2L=icO9H#4L+wD%xdVkCSQ27yUTyw|*Njt3fsy=YEQPgS)9oCT zZc*^2;Gmk<$_vt8EAi&nV$r#eKGvuvKaqXg{Bm>EDhBLT^8eA>IcvY2({t&67oxth zF(-x75^AXj4NN!jXmPM;VhZ)$VEygud)_{TmVWTAKV^jo-(X$xKJZ#0(KC&-Z+l14 z@DTB<&u4KUE-yZiHGJGAMIJ-`2DY-*D#h5rQ)=GIcdrix7!8 z7!oO3;2>;0){XCo6p8qjt$%wO-*C$2NWpNxBl<^mq~L&G`zYZ-nYE#@uiXJBV3c4S zNn6rZIisnRzYTS@gQ;PSrUOwzj|jGBH5C}dJ1Tr>{~zrVBMpalonT;0w5ShvWT$9Y zYj;rIB56WO9w`&iXbpmRzsCrU>rIIjYrU!v=P#EfG-oRCT$lHYB&=i~#bN1t{rU;| zIZpHqJhRE>I%;kx=iZZMKo2R*@!}5LXVUwUwXMnz)Rm8Jwm&=*M}2tYJntb`kq1Rxwq0zfnhOctC+d3+)a_Pk^<6`dGNt~VY_ql&7Y zvGixM8V@1l+JU6zbK#$)QI1pX6UR5VjHJ1TWEus3D0n#yrQ)<}aSDY&IlK4rUXtB7 zEQ0VUsK%vk07;oQ@aG$}YAn*jKi-4#u8q7pr81(;f0EPJaez|3x*8Q`)60lCy`0{F z*s(3{E-zz@%$CODL3FdT2?jq%9vrd%^aqV6_anh}8gL3`yW>joJOJbeL~dE5T@qyw*5f8MEQ^ zMQfo0Sbb>TmJ8t&*cqX+E4PW>w62YaSHAqXp3hVF)`EiYSR zLwOue{d?3Jv}=2)Eq+T6!H$$KdZ?i|rl*q1mYzx~S9&U`r1Vk;r}Tn?m`@SC#Z#D5 zEog4>1Cg}5w_x{4NFUKrHUC&m^IOucx4sRhDSbR+rhrcMQLX;Ak6^4*YYG{RY~wFm zi>{F-{6f#}Llz7)?KX7bm1U6>+*yS2d>)6V59s?(iD3Hj;Hlxm`j^4;S6^fBv{!*> z)|W7NI$O{00lgRo&0YPJIF|QQ;)v}pIP}vQL}-}iYx}Di*@Y|vFe9gDPVk`)=Td{H zLOswRCL8E`;FK9MF2jM(M8D1>Co)e+>J4x*%75qEQNp+~M52?1`%72VW=_qn;? ziCn?4+UPuyX?+`SS08WJKM#u!crEy26&2@+Jax^N<~2X$scXXWan0+MR#!Hz>7B2x z$zOUQlIG-#Kwm_2KdDEu?URwTF<&&a9{mxvCFcF{d@;=W9HVRiJt+U^rwHmXKoqM7 zTrwX}IY2$Ye;^)kiNahdctGcYBE|moAqCmR#TDcli1l~&Kw-1){Vc_0$0EHX9j+zhl;(OA&xKU22Mc>QwE8YB)sV7Mod~?5#Zc566!b~pkR<_ zX2;7rE_>l-r|Rj8|CT|buk~4O1waBS1{N|{%vP;fsFf)@`Of)_WMLy1GswykIdG-cfKJjo$|8;%|#qW!ip!1IEB%`(2`d7KuC#=3`y z`ueX``mbmC*B8)iR<|z?5$*I}5z6Q1b-5kC7UNgGHt%-P8Vc_dw<{^k8B!cYdv6zZ zboR%52w30SMK6TjFV!RGm8eMSH&g`JPI;#|oFPufNGklo7Dbg4G&{{5DiTzqe=)mm z(@@puV?#w|;KiSu214p`Ju2i_OTrz(ZvE09O}e5Vaa=XJ#kFO*59j5>kt$OB7&RpT zwc%@?xkK1e&`I(pPy{+j(=X-Vw`RQP;XD5Oi-t#5>lc9a0Nc(V<{LL0rrtPj7~c4^ zJ?0z#WW4d3VdfkEY#cc-43ae8wqlq_z(BgfAFC+fPJHB2`kjJ76u*;YWNY}X?i7KL zi{6zxMMFz&S;TO$*y7o2J7I;zX4@Md*lhQVP@C=P5rR#; z+>y#+UOrNEjWV{`pn5L+rDFMku0z}CyOAO-@NBgn-B(AVMu{$*_?9{AauiJ-C5myQ zc`pS-Q^aVo2+6nWM~gnH8{q_lR{&W!)uWZIW2h;09cP@9^V?2pHAZBytz)?9^|PR7 z>!d8qC|EQ`JdPFER&oaD@}vT6dx+j02HWG{0%h+M72tRFf)(brciDo}7Q&M*f2`UW zmg^rU$BIX=U-lm-T6kT2lZwWPWUr;WXu~)$)AB6EkB5cKJ^Hly@`dBo%Nu^Lx-UN& zFMoYK?H(_(`Q;54m*?emcNSj0WP*D4DE02^CkW05h^Bdme+s9Q6Zq{*?h=fPpMRIy zw~pPVUODt`^)dKv@f@(!7w^UbpGVX05iRQf`i2TIFGOCPcdE@{2lT?`vgO0vwmG0E z1-ia)(+BqmF5TiaQH;W61rzID7J$oaFk94R0s3WsmC~Mxq9c5T+C=>N;YA^_2VsG#AKQnMeJ*18O&%11UimI^73L#Be8h&Nkz0>0OVCgra=?k=|&d?8ikr zcfzLT7WTyqw9ExF=EHDh=eiGI8H8&6DY9W6>ok>JeB}>|VF-!EJtF!$STLU%f`Pv% zn6$&K!}Ua~C690)!(ZxOWkray`9i1td zQX1J`bb~LtI#-MfQLb`!b||oF7^h%$zJ>5u=QCCk4>sUdA`3Fp@W$gg;Km(yCR`7O zc?1`3B;>gkoprLFh4UiSc~tzENNA=aVirWiPSm>*Ru4Xu!c?CiU0?NcMe)+8enV=o zuPcgN=e)xaNgVCl1SC2CC18dOmYT~3V)2?5lAlIhXNh(&SRR?BRM6aUXQJtySs2f` zlsQ{@oZ_i8KcO}4n632C1V$pX4)W7epx78e0?V#L%P=VCivWtBBYLRb`m(0Cl2mU| z?gP3?j`7TqujHBzqcL*@BgLI{dnyEeZ?y?np_%(4)5YwrshFyxiabiW8ms2$w(B83 zHM;3|kuX``Y7JL98KpLjG!|NUkh<&a^N~TeowWHPqtEqctga?% z92f|4Yn&6#JGM%}cu|8O_camZ>UVQU=m_$9fK8Hf!<^{0-mVY7N>=`|VVL?w5gjeV z@wxA-WVSE82QX*}dF=TAbxSIoQNZd>O7(#Q&9xmQ8i$?`g?^8RKor>&des;4>?aY} zdYtZmQe>zGTs0f;>XWJg75Jh4?`N%mJ39u)xmxRv2V)n7O{F9W_&X&pz^=cFx-L+T zhv{8Dh@`9qc>(T@0cnzgQ=*RN%u&#^Ls`XB0vr`kdJ4TdMUYsCXaL$eu4xSYIe&paHCqJt zcwX5Xi^P)_bX2Ej#BFx&C?g4vil0$Bgpc7+F&9fCa%kivpLj-Odlgw|!^zg5a%F`l zd9hf4p}Kx_bvz9iU*JcF7OQZfzX}(+Pyd-}Nu&5BYN*)stlZ9%hQ?CG(kVVPYzbTm zAnzMfU7tQ(VuTE95^|d?RhI>FLN4N-Z^wWaNgzvEZcK2a3f(PHnTgLfwvCoc=m+x#;RJG!x|EdSgV`Q$U+0qN!}TNXk)Z zU3$C+8C`y+-`LybNyS1AFZ)H2isj?j>p_kdp6NWzL-A&MA*gaqc$Yf-dgg?g!r z`bWyMDyS2wM{FK>R^;M^#~hp*qZE*;X90Rc?oSYCA38lJBK>sOHtn<@Px5h0M)tAx z;`wOgrK?yCa1UjbNL#`;Q$a|e!f}nG0~Dk|M=D)-PV}gwYhie8QZXM10YE=}iStaZZp1S12*{yuBmziJ(?(APq)NA5Z zuN~MKKw5l)K3RnZ?V}%8iH1o`Y@iQhJvj@;laIdCfpzK?YQ9>;g`7HjxL#u~tQ76g zp&y;4VXI-FoT0_5MMJP8P-xGvC_iW{e164hG1YOBY_5F<#0u7$KT?Ln!|guog=&R6 zzza3`dBIc(Ho9^73U>PE#hv&Tpz|XoPeg=e(i(xJXxgzxEWj^;46;fg$MpN`G-0hU z;VFPy=}f_ouN4fps!IcBk|e3~puQZqj`ZrvwQymMr={<$2fZSkFNz(^xlW{b(1?B3 zVXzIRl68PVm}Cj>;so%zUs#6~ZZP?-S5c{~^;jXm``E4m%1w9JqZQk)I;d-OqRkFM zG-H{|EpaQgzkDGS4+i|&b!IPKyJE<-7?-Vfi)?7Z$bkM4`Tcu~tK)4dhOOLtj#7nm zh-bEvhe%d`?V$Hd#XhFkS>COAIF)P=D>1u+<_8NDFttA1E&*s|ycFQ$Wu z@oR+z9$j$p1=R)KOav1{lV4O_fDDBmSMi!JLIQczbfaKmHa{ABJP6aLj}{j@%p6tT zE)UbHQYK4YQe9x!d!7iGsScqFaK#QPKNlQDBVR(KbG)L~p`8zb$Qa$ARH5}R!P#MC zc;kg_G_YkM!g?=>_SlMNg{uwaWvWL{G>+)Lr$F1?EBgW)&V*(ZSr!BFbXK1xrr< zbUPj0ECiNIq-sBgy`jUaqPLxgySXhOsx3 z_U%@#l&^L}7s;cz*TsH3=gjNCLt&fQBRuKdNc$h$H*Q!3-2)ruFr~jCl7J>i(Gm3SuX@;3CQ2&o9n8c0GU1FhlvY6U}07N`As64GkrQTq}^c`*ImP?gg}`OeE{+ z;f?eJq$_2jIR-&vay@;u1r2F$CWf9ld^igA(5oNnY?Pz{3J6 zyPYzK#=Ip8gTDMdRJj&5D{7x}Z;A9#Utg+q$ScrhcLp$jFGpxC@h)QnL{>P5YyBss zLjQCnK<#vWjX*4WDb%gJ0{w5k&fF`wlcP;e=OB zD`?s~A|c0^DQGh16Vz_fD5Vve9W|A^EWZ{^*bUo>YVVaxw}`O z7l+OFe@y}JiuC$Nyj&ieLD>st#wob|U8t$zSO9eUp#rS=@2Y-Y^DexH+bLu({2{qC zX|Le)_p-gB6Z|WFu2vZDn)0s{oa`5AK)_oo2>8umg#P2L17@F@429$Y+J6vHEk?JPj4JFZ3n}?swpEZ8d~wkEpQ;rm z6{)HwsAc*|5NNdgQ1ltR__~U$D%~#-7zW_5>LI)e+c(~I;};Yjatw!B=*^MW+CQDa zWp?$GXV~dTL1xZA`k}~j99qaVq*MLc)Z^+F`xjF1A?S~JlzB*uu^ghMhXe?p+&hP4 zT6AEnI3zd`EbAjNMD_DRLj`eHjjnHrraz9>>gaR50C?Qd2W`kXF)4@~A7g=n=j~$^ zor}{6a%>f%lR<6jhj;q@W7WsVjqniT{8=GxMU2Bbp#fC>_x^4EiHgbj0@+vN22cs} zjPYY0oG(7I8Wc0o<BxX<3`|NR)rW14h*nmkGpO*02v=UI22_49I-Ith1pUuTN1*xs@x2aq zVTR@(zo++)s2%m<5#hwG5WBsjGKx};B5aXMw;dHjtVYk%#-pN@gJ<0`Qz7()$AVpF z|JEU)R@0k-al{U^#_XxNht3{TPMRj34q|0JuR?W9#{b+g@sx91g^x`hS5r?i)y3Mg zFDTOxHT!8Y>vRyEJq~5C>fJDv(*NUer40H4_Q(B5=n+;1*Pl?zU<=(rV|BGOZV2*M z)e|S`Kz z9v70;r3Z;YGx7kXeJ)a%CaGKxN{##+gLI7RJzAbS08!M>MZ44mSR-Jq_C(H`x4wE{ zIQXf}(pYuqi_eu%ZhVf2Fb}gAOhF9$LdDREzCgCtVEX(E7+Swphq@xM6yEqkMabe$ zsR&uSQ)<)}oWia&h?bqI8>eR14ek8Jw=q3BCpwruo%6IEX9YRPbz1xhmAuOt@rv~` zylE&bf{3}VdqE$?VN4L9z3R@AqeGQ0Pz=&w{} zuUe_H4}UGf!=Wx4tFAw#>d#9&+QY~%jtudk7DzjLXASymD z#`1HF>@?4Fbjm^w$pu|d&lzw*wDLUX$Q%5eSUPY)M8@uZib*tC%%%J|$oWP7-0~D% zy&z(-bc|iLEQXwwqE8YY6sQkZ&x1U%Kj7a(E{JxtuTr6q4pr8A9`0p6&mIg9Q<}@t z8=97v>->*2pb96>`-T=&VX_{f9aUH)D-_2z~M3jP+hkFnki{8rs%{ZMz1QCRL2ZrAbfU*!e}F8(PPq!HygO#3Bjog>%Eo9; zit3{4JJ%EFhaVNJJa08ruZ+v;@8Z=G6-3fPf~WuoAcqz-wz@|oJ$_l#5Bc-DL;2Ph z^O*kiI=y~b;Z(o54ENZNb_%>A`rwLIdREA!D@y5JeFaK)9tB+$1OL(gQ?45Q--1arDMI@BvRrrWc|bXzUpCC{Th z0x0a6wDW>b3|S>QFOOPDHKOj3KvQi%;+;rCF1bMuZW4uAU0u~a9KDO-HIl3|Hp-zFKth5h-t#svQ2zw^kei4aryZ?Y2R`Yg7Y>M~gKkN#M9q8J;fO3#x<)yP+ zMu%1CI21+%`!FIHtSME$+!0Bi`~p1>ZmnNLOUUyCcrTuYnbfRgNhl52EBtBjbrFgm zPS&Hpr}c}WqU$iZkVA2uAtbaLANUc>;OZ)QT{OX0WMDIFonrpvdBoeR{*pw{KwoIgb zp}x&YUcTCoI``UQrG7q=Q`evOkqoKcb>ws;HSkpg!xr~|XmB+~0ovm2%DK;V7X5|4 zio7PJ`Z<_4P17HgsWi(^=Hr`>PHi{sNw9?oKk35c z&$de4$35ViUeVOGX+Z#;vwCP&ncZ7KCH(v)Ta$(d_8&ZU>O6Q0`uj_+BE}iVNYvCz zg%rtVw8vj^VEw8;(q5k5;B+NI`;D;4AvkugO>r$-;SNx_oz0@bN9;Hc#~P^PIp#Ny zfbwV_fE$3ieD6SbR@+@mtMO)o?GAO)t)KXi43Qy}J0qRp6z2nEfrACJ%`_7b*rQ{< zQc)H`IHT#XUFuBmri8jvmq2w0*lA_}G{w}u7BT$JKqan7`gd_X8KlHzAg=#STroik zhyY&_3U8qyXu%CwP{u z1S;Q*82o)V?&Ezsk#3R~yS|gCGC;;t1BZMbgYSSt_Qg=NhsthhV7+Y)tUE&`N9X5; z$_!8b_-mmOk)o0?^s1Q_-Vk3b54e}V!6DS)VUm%PcZXr9A>S-avR~vO{c?EA2d;MnUV;}2={>_zm1@&5f~16v_C@iKr^>!ngDOge;u*UMXD|^T!H@x z$kZCKF=n>0>VoD}G=1_-BR7MlMX4^B6(y4!|7Ux$DtQcSudaKc&aKsx5^PY=IhmE< z1DtMMzbB44*yzV7i9{}>7DrH%Xjurkx4xOp-%b~zCHq6#)QZ_8$4J)0Lr)-Ld-sj(#+GO#35DoNpudg|z=qS|R_VdkOG_<2F>}2s^pAD0q6%IP zq`*RFbNYM!C`7(u#C>NGn952BN;s!G7eFA9bR2ci~rHpEmi$D554Sk4}_KNsvq> zj<_jDsya254Q;xy1rJ3@qI?3s1<;=_BzLC2?jGvz3uhDO4+kKkTag;Q zFj;1^-X5yQQ7Y1;HAwdyG8d8!Vf_KQ(nYzMGAl$U_J9k?=?5ng0;RcfNScX?0y(+< zq%e;bufw6(wmk1tO@UKuVhddsl$)Z)2?)tQ>ViOCp1g;y1S$?C5R&K1u9T3fPJsE8 zkF|7XK9T@O>xbg_P#n!qm0Yi7O{!#KPp|rtsi+eSQl^iBGMS>qU^~Do?5i(31gnk5 z*R>NHk3TjZzckrg2@Qo!zEZGQSDF%_^= zF}P@X0yKf7ri!IJy{SZ2zB~Iu27L8%no4H=lucE6gAN&LwVstBIU#3f1{Q6U^~jKo zE$>r&Gh?m*(x!L&v}TesKaKiKb=%Vl&H4CS+SN>Qfr83rG9A6`pUH~>J)J4X-~m5m zN(P2on@cXl*||AaPjFZH#o@hXHMkAbFwAZ;W&{kCxA@5Z3`?=JLujPavJcIr(4L|15aG= z1xVht=6C?W-5pxWIId+ew57@#KHO3=Zzas1^UtOx(fC$)yF7ZOm0XP5w`ncS+#r}f zNSFkqG`kD7()Fz+GgF!+jUvrX4lt5~)Y%{HD0w=SlT(aRM-~7|ue8R~0S2g=)*^wn zuS^Y~=54Ta6`gY`%9Xq}vbD|*!dOUJ+(yQm>>%6P$mHz*26nW<^x<7Y2T2aZH+@Ke zoN52Sc#3H&IVX8gTgl{?bKA;Ake96;7ROw=qaBYETGLMT&hd6~h}RRlP{K;KrjhMs zsMnu6^)DOS%c)+U8o%7uL56$2Jlg@MfjUoJ^CkcCuKLo;Yol>+N=F<#XnZN_C>u25 zE`gt3bqNN(Nemeg=d`7$+MftF1~7=jr<3ZYM>@%e(IK)E*0VgiqqFLsZ#v(ydm5r= zzA^+5@h?3?%eqKAbXlA0>yoZA!UqxmIvo>2m%B)tb?c54R}6OeKf7RPJx0yDDlv}i zs>JwRSD6d)|BJ>0Bi#okG__>W)EqUcQ?8Fg5=V~YypruXatb~YTxvSBcS&|#&T`3S zfb+fTlKs>&Qe{p%OE+jY4|)k&wJGZ}Ll#K9R0P=V)Sg*&Bszc6OI9VVS$W9>|0!n%YAS4$5`?YBU0q zoU+;uiJ-4~z-%GP?kPK9ZJ69s-lksilKGP5J!Jz>jQnX_2TH!1UXsJh@Jjmik}dF# z?R%+r9N9~~c`@ePmL7 zj=_3^J>2G6U=#}o<8h-%TQF|8k|br`CS!peu(_Thc^fKJ7ThMA)-uESmaA?2@;g#jfNj~X~H zPxizwWby2V9P`P`mz+4ankw_rKIj1K_B)?1TjSI<78)=R#ON6Vu+kr*sRLy9mbtEV zHE-wXCphkd&`V3s`Kb(Z#&&`%F&rO@&iT=w4X?#uZ}@9~9AsIETgsu0SEjn$#(hj0 zNj}wJ(@bdx@JuB9#8@eg4TP|ADQ=KV_EjWn)Mb!N^*10TFHm_?W9IyGk-Q7B1d(ps7ZSN)RXj%0#>eyFFi@` ziYC7TbordK{;5iOSIErYzArmCL_Uqe&Sm*SF&L49wB`;8%K5x9_b~Jfq`HOH-2sQ_ z_jk%J@bzq^ov*Hmp`78;>N6PzCnH-TP^od4jV2D45&TkfhRbaJ+%;V0-)GC;B1ee& z?H#Rl<9BfCtZh!p7$XDJY z%Wf}_k1_AZ@v-tjEaJV!$+q}5XPjgf5N(`%)$5Za17hlUBXk-yo*?f7urwv=S`#X+ zmT6wsz1&m3U_F1p{OTP1vV1;3!UcE9j`&;7uXa-AHFVagyJRX(rR=w&qv`aZ)L=@v zTjpElx_3R6W{L3!`X&H&-CTP1Zh5cc+$toWm{ zQ0i5%5DN`ppVAw1en<3T$4@9E_4nlq>}!Z(yhb{RUri4OCy5=m z*&=ArWI0mF7`e8ph8SKfhQ|Ip6v&rns!bU)LN=B{O99m>n4HauPdHWse(?BTZY8!Lg<4bo7sfvzQ%4#9CM-7AL)KO!Ly)x{928EG z=Va*05h$qj$28?0@So14E+?W~4WSKWPFHR%Ul=ti`Dglc$;m$kd%un5o$uKOqDfQB zIIHPtlyZr2nc#4#W$8>SROTOwCKdy3Q(h<;D4R|f)@Z48pcwd|=JzX`rqRj*Ehap` z@BkR71$Y1&Q|Q7kMp0>ROJn-+e)&Tnk8Cm>FI5kC953)2J&5UGBvsw#CqwDmIkJ1O zm%h(1H3%$MJ;6#j#)i$6*)$+W^QSH|z_Y9eW(WS}il8wwMU2_(G#vy_KGs4-I-I?dpAdI9F`d8K!w@K^dXE_L20>eAx)S8}x+iqDHDG zW^l(7H;>d%6LN&CSPQyH8*?C>uq1Tn5gSVV5I#VUHPBw)aUjdb7#-{iOds zcvmb?gV*p@c(${;9dl}d(J`nqWU%-1;EmCV7p*SFD={jq;*Ti3aKoKX8J*LbFHi${ zqD@b<;vFh*p&HO_b-LD&cBmG-WT8UCx6==8!*qveK3ymom~B~vaQ8HVBK=%3O??KY z#%d~kM!83(zlzuU;TbqbV9~xhbO^0qECY}OW-OHuni>sQ_|$yh4mOywPA^uiDE}Tw z1NJ2{6LZ+#o!ufB+kO5LIR#&BR6cYP>KQDNOu86ARcFV9ySIPbz>-Q`mMVb&2!D1= z1DcL+@WW(9WkIi6u~fzaV6=596t8U*vrP6(bd51oObFD?`dJ9eAH!p9z0HsiseWQtT3wjPanWOUOLyMp`Xc#j8+<{ zrU;E20?-|(OxHVbTr~jn%hhTWsRIq-m$giz$;;L57)6%VKoMrFm8eUqABv{6YcXH- zToh*CM2*4wTf~&q&rb{jkG;Os;BYLBNehXi(iMt;GR{43Zziz%$5tQ~0aDFp4N){V zL{a#x^6nX+%etcAM5ZsFwNl>m(ix_!9p0E?RzwTnM@~|bDR~aMGz%u#Bbd=t^qiV; z&Kkj>D0~eA&gJKnn>1C2cqFV;VgUCI7rY#>QpFL|Y9vsjU6holY0hXTC2g(%8ZOTIIxPf z#2lpb*cuh339yokv(O_)m%+f<2+=QJFXPZ9Th}XB%(3<0DhHXGECK1TEI&559y8=yq3A=&`*?%fyZoegrD*9U=aQ4wQ_p&l>D)V`|^ zF)*~ICSGq^e7kS`Aib?UC5cZ|kQQHOQai6k%uLsGs5uK=3Pwt)*%c)?a64;83Xe81X2At00lBhBZ z_x^jM?2g^x3q#`Yx)`gYUeE`wuvJv>l5A`JAP|G*bUk-@GM81_^^(ld51la&*6&uF9EZaq0EN6cS3lsk};{TkJ9M99Xmt_afl5q898Sl## zRPLkTO|rA)W$M2PenL2rH^~uj6ZnI~C)+O#allt35*1>7gXut*h#+ddS=z&HPWkcY z`aR17Hipxf&2ar3CiiBUWH$?D_`9koJLkSgZ}#X_ZkC-auTbJEvafo^*Pdt8cI>e$ z;>}ke;{rPW3cDgoUe!GjW1Du1r0iGaAi$mcUEjkc`aVcF*1ih&$ryNVOF~D*ka$&| zYW-m#hR$E53{S#ff{ZedvZFXhFt9ic1ybQe9@mElbWuS-<@Dzk<<896D$}eR-}3?b zcR1a*6+w!;GRrnBgOHA6I|AopC~Lb+_k!o^&h2up<*l;Q+vOdW2t3qt<5aG);p2FR zdhAr5nI$`AiWfkhJMlGe>3dAtpn9d8e0Is{Ue_Y&p|)E{;8hZbsN{Q`WlCDzTa+{Wg?z_QS@4&ey;0! zbit@i4hM|o3n1cl%P36aU+K7GTm-$kTQULdZ~C|MyOo|5{<;)iuf{6pP8TX}`g9%@ z?}6&2ijg;=p{HdU{w{BEEs<88mLcB1{&a#~J&k70TWdp^C4M*M8g^F2;=M@rW>UrhU1#FiQ9Yyb`ts+!M zbU0cShR}~a6AV_4X_d;gGN;lIRTRz3 zObn;rD-jb!;kGJ|5$}=Fn^j6iMjapz6riq*Zd555C4W^*Mnk`i; z@+;U{rt@UpekF>;ujP~2^NljX;BxLzKbZ#f&v($A5NU&&X7K1kO-rr;O+Z;OEJf_Z z+23H{%%$<)NG@XvJFnfzp(MYNStuAK-{zz&$0JT`6!YJcc}iMf)mJsn=zqZ_97+eu z!K4##5Uw;JoBL>uY4Sle@IF205t~Zo;GuQ=Fp5O~e`6JHMu$FtTXQgcD}E7Cu<;lc z!G@5D3j(&B9LXZd7GNl_4^S3U2VaT57EYCyQv9K5T;-}UXFpU!DNrX4?tBO_E5J;i zL&nbRL&|Un_Rs}0iF^6P?-f&U6olwdE+vB>cdekw=UxfM-}R`fceRDL7({#LD6Q0YZyD`ad&u<8_V ztiW)6fChJUsw-GmMLo?@CBRg(jvm1V0GidKlDUvWYuaPi*?HKJ5LVM97^*tRgtg)P zW2$#i!X2%#8{9fLKaz?YeV0x@_*E&COohw~Mp6qBHC-Pe=hGXT(v%8#i@AACjpnVc zP@QB<_FFaY>#ym{3fUw9sE(U>>d{HcVWe7Vj%NiQ+AMCH?wCX=t7S_eGhT8bt@DsS$3}AF6WhM2({TPx#PppDTfM{6co*EbfLRvarW5 z`$Fxg2fvUz{!ez)gXWI!d zfq;17@7D>gX&^P?zf;;-w%vg(=6z`;_jf=q=DWPy16zebzYP9f=3^7p=7ZT~#`jA1 zNC`|){QOobSO7|tfQueyc&Q0XzOg}zr#!gIp|ctOF^`YUbSkQop|f?~q{W!^m4Nj0 zg&J7cc!>)3DDn+QMghtKU6jnV!684U;SV=LdoH6A5`OR}MdW|yC4?yrB7Y&AD(0iM z+M}1CC~qR|5)c9pP~s1g3%&&Dez(IvsEDohgXDq@25W!vl?xGc_Qn*(emdMCha14- zHs?pEgk#Ezf5iD%Hv)%W>xqxQF3V-kilwMF<_ov5KN9)iZeUwu#XMi6!-HmtZH=*4 zWhR}uB7>Z#_*71N_77qTB6aEqzkA<&Y6dbIVa6aO-{}|c+C2{;LUjd`-K#4$*17qB z!0+qcgGP_M7L>dS*K#JcKXw%3+V|>Qi}-_pTtFf;@>-hL&)<@D)U~7pWb7LbQeByZ zg{8tyYUe0l+$P$+uVn*^A4n~rUQPvr2ZYpkSXuj~;{H%49S zYTyZuOL&oWXo2>|F)(<4IJY+qXl@Oq8528&d96yW6ID*4mmaU~4vXVoL(8La0;0-~ zqp+uJWj(E_q;qB@>fm+8m$Fui=#nR^1FgHBROyyf{F7|QEJePCBlf~ifSj#z165>Z zQ{?=ttK~*iIS-qDMcmKOh<{e9WX>;2F=x%LaH4ELM}JX=cRf{YM%O%1PmUNj)m0U5 z1T@FF;0XX@Ns!0Sev9}gn=w__brszc^Q6TWs{K8DKsmo+Y7VC2UlHCkBgKdtbEFsn z<9ItOpvN{^RFvfJUzO%Q^ilVbcd5xeS4HUYg3v9CD}d@4w~|G zbvSx%-qY3Wy+Z_>H!Xx)a9BWar8fe#5I9<`tF%(PM+8LL)X1?3IY}K zXJ`p34nKTxHOJv&>D?)aX|G&d%?kU`#nnu%6wlUREKOfhUH=v#c(w+OB4Pg;My9`) zR5K~MFCg~+j3FB_W>-xN8Ik6S5I`@NR-@t+?O9q~6FUBKX*E;&Fvp)6I);9p=zegQ{j{G5!BUN3uK67uD8Z@0N(c2IB6xzM`KePMR91udL(RY z_0gD<*XgU7!xUAw{FIG7*;i}O?VrpOs0Y1+e3W;Ou$18`uio zMup&Q)72pa9Z$k*_o-FuV%b(^_t(;NVR(Y)T^ijP4O=Z8jPl<1YM91B*G3l7cj5+lZy(cYy*lZ^Yq5NXrxLCGhv6cGrl*5wtBx z74uX9Ulpo+S`83S%zHwx#z`Vi2WuJDKYsLa#UpUK7uo;ll5_arEPE$~E^Zq`F(F!K zL{Nr?Xv@?sc9>yvEkxZS+JRd<^&Gp(22)>$y2T{^SVd1ev@X6y#i4L89&ubA#2wTzUKiw@qeaaD#H2>>$yh<3bOC*Kcq zJ@*nNg=z6h4QNL5zHJ#EqEj%y*7)9m0xpB8AWTcP???R}aI51s&1qoOJ5f{`rbRHb zIP)*?WppG=^S76tO5q}kIGU}W_KWAV7V5Nc9jooRJI-vW|Df|Sc)1q*?gXtJ-=dX% z<7weq0HpV5xE7!AK%7~eP7i3n?rLjT|Ep+MxW-&YmEl?g%=PwqK_^G}0blq5VO=$f z(AcZjF9M@Gw`_WZw#lsbox_O|iF%?$-zeN<4b6CkYy-Jsdyw@8f9nqv6*Qt6GL zNGgcYvT^4XG3w4A#AwdO%Wt~#<3%xl)vH(UFMB;b9&E40svR7wb;K;|8>=y3urOA; z#|x3cGqISNdDJ^jyPbWj>*F+q#ycLTb*n?;=qcM(i^h?SNZ6H%#u0YqbH268b}e2= zgX6K%<xTU58~V8MD2E;pCVzXm&R!kbUIOsXBglwiT`-8!5{ex@<xNraG}Jmo-tv}|oQ@^pBkG!t7t5tp=~_b6 zi%*(9aU~!82Q~S5I-IVJ43^77Rq8sw*X8BZs*%$kwe=J8w}hL2>mRiSsP9HzIX#1d`Ljm~ z6K7ohoR&4w(n3%Ds7s-h5wtl#2b*a5dSoHzK4&Ojkp&Vmf5ZmTn`%QKy;)7QpV7JZ zXJ}sBxigw+4SDdcYo_(CGrEjf18R<%(Z##HKDrc!weGCJ=xR@+GBwWXEXh=>latDS znH{Y&2!X>CzMkJLaLxXbsWCPqvN@K8T~)+T_^zLOl%&lGZZVFMq-v$ z2d6RM?l=_TZkL(vcK@7YX;@aBr3G8;i`Lm($%dcH-a_L%7Q+tl?7_9-)_+$~ZVN4) zosovi(xCLUy1YHk$l?~5{`sgMq_Nk|R|ooxX{oV3=11jKuuwQ*%cg5Fy!eH-(im*z z?u)xw$_~atCr}%pSI}W<;LGx_iI`7)`eZ|joqj(kO^V*y(I1p+?4t$3o-{c3 z{^6-oC+nPhQPlM|sCeV4R!zy42(_C2sE<(VtPK=V4g}HO+q59BO<*;=BqJk16N}Y| zZE~~rnJ?@h1cee{te6(i1McQi7%>lmuyE?#S7XyMkj{T78`AVeed6spxp>j(EE$XMm;1&+*xLG)DelAsN-7$vXz#2w7cehHW z9{sh$SjA9=xD72mcQww=Vox&`-$}V@@x5tTtpN?eHN}yjt+`qwFEENX>$@b{n+e5b zu3BrS=V|S+I#?zwL2cnYwbEMMuFo5w7w4{g0A7Hjawx6esvs zHU2wabK#I{0Qz_)tsbCF#oFdS5Nqxl${DD2@>;W+<_y#lI9+Y+K&?gS>+?8<4%@-A zlcJbms-I02FhqL6>_|!&q%oE2v_WdYVyfk!o7b!TgN*eGK0sr=a?sy{w7Afl0T7C# zi5IQTgSAdrv>qL-C0I?8$#sJ@MKU??(;g9iF5S^JcIefZV6#%O5j)sWx*at=4d+)F z-91FRpcmd)o(tZ|g4?y!!0%qMxsd*>BA+F*LL%tR;kuE(^LAy^CJt3L?XIU$OSa&n z$v*VzP>tQSzYo=xVB_%78IqIk(Ha^qlnRy*M?FKwX}7Gg;Rzd?71Pue82kytG%oMg zWf&TVjJwb;vrrjulom@%hiU%S-4`QVjWO=m4O4c$yge#{&JELMVDP~|woR)~iUByY z@nMc|x$jhcTZIoE;O<>N^Qch88Q$u*B$x&a*ZMfP?G;Abv3LVo7MKxE?+n)$00^Lf zIv3e&K0wms>jV^&3$&rMc7(>|B4jy)Z<;cg+O9$dTfuq9!1;E8R;FSXj1GY&&DwSAKo6)7^fxMOrO95bYYan4rpMz z#%nIxI$Gt4N7JsKnjy3~9^{i(^+Pdy2tHD-a+oznofS)CCuq?$Xbe>9_v!vIT7M-g zPwf#uxX%75tNsN_E_W87Q}VGDj@=213j*p*&Bkhao&bDbeO++vkJTQ+Dal-*#VjvU zd)#n&5$FF#I3^NuJe9X>QAaqjA*sf4xb?#*RpIOOI884{SYIU$(5Q*pB%2Dhp@(y6 z*?5f;=NfoK#Hw4v8tK?P2uT__eN6fsFTW;#rQ zzh@twmx1R^nWX$ZOYp%iqYms4j-)pS+8y+tNpNUwr@tm?U6srM15&FN#(pQtj=djH zvHSFyJLx`cGQ{1P${$)6PM7b~3h=E9IaW`OVVhM!|U{rxC>hAKn%P4#CfC+imf zew5yuqBS2d4v6+TZhK$X#+qyX{EaW?YfRVZW`;N7dK}(tW(piskSz61uBo1PN@)JWLNv*HZjupfitvX^V&2w&_|2KVI36 z>IX^+(P>aW3bn?n6dnk|)Op{p!cz5gAzT)@^nIb)<;PY|g5SK^EB=&szs8vl8(Q8M zPRxl&)iiVeXwf3f4|0{wf|7L&kdj_^lzW*ptZyYv?$!9)dN}v zLUUsu&~j^Ps2qGyi-q=pN>;Iy++u|v{q-Q8_&zn9q4l-%29srII*-jznvUTMt7~RD z(UDs}q`fm>PZZIW85(ojfzgsu3IS?!KBV1)A?&BBuI-x*HWKc-fgDBATpMUiu9pA?$we4Jl#|6>|Qk77vs zws#cSXJJHdr<_?@-w^Hq0|E|d#?jakB-(AAr3J#^kJsngt$;0WAEYm4X<5!9ix~kj zU^+&@CpMjNzeGy86D)=MiqZqGfqcs#>qHY-U}RE>xR6xzIb3?&z7Baj#WSdli6E%Bp8 zTK77h8Ke66O_n%tDu!o9)%(^xGYHsnS(*#)(7<_G5#H#;JZPMtMSooDhSvu*eh=t= zXYRWiM$00LS-E=RaSc=*bog;?EIu;kYs{A4d%nhnX_n2`8kwow%_)2Rm}tAg>Kj^W z)qKqfcXT$;>@A`x{t3+n;Kt0Skfm?>6=NXCEDm9pPP1T*Ft3u?i$q#oAzqpH9uXbaoxG) zFOC3Oev#5`tTeR>Oq&C$j`~pJWm>AS&m2&=BxuKXF4GbyO`Nn3k+tpYCl2^#WN6t%X#SQ)AIns=Ty_H4Ue7^HF-9#vF~?K)63gC|qr zGs^cAL>uk|ANNQUw?lBU#_0_%EF`c(9!W!yplT&#?<6}jMp z9_3OoYi@lAdyZLYdHi6cs}VNalwxHfXo2nwJSQ2iBHX3o&C6^J*yLUUKZ zPJG43ot?#$lGE02^KG^e{vB0&$muG=p8#5Jlxv?yyWIjXR`i9p(EL9TH1(30gh(N=B_b zT(ehdGSB^7&8U1M+HixQRt#S6W`4NaR%v#-0V%*8nyXY@eWg$W0l;7tw8O!)ah2-J zid7nO(+pn?A28O;)vD)OBP1Tuni8LfzXTDj=e3baA~#Hl6hE&N%r~Bgf@x?zbm@64 zw}Ywm8m%VmJ_275r+f?_taNsEFQ4wfJ5ImnWDxCNqb1_z=hh(pkW0?B8ncidsOO$H zBMk=Sq_xUJy=!wdQU=x{Y?VvL)?yDE<9Z)?3DpnlRg0cnryW53@_JcdM$vD6`D}^~ zDCNF(hu&Tv?^N-Ub{mS{p~`(8jmcP$KwVze3PN;+f&CZ$$mX`Pc@F+u0>_G7d5UB z0EE#GU*)}A@jT{ii~>*GMvW=JLa5LMj*Z(l8oj&S5C-ktsE>CDf4*n6AW#ntCwun?nkp?*(|S5>tEDNDo0Kq+rL@aN|slYLX)5> zTSZasD_VVhB~B#EgRLUy=~uKgH8S?pjEp2z1jgU-h?|%kK~&0MqMkm&Kv9By2i)|cauMwSa==C-mbO9Pfd-QR&%zi3A}bYVv-1lZ`T<5 zlF2p2#*$+}h@))I4lU6eYQoyrw1+U4!gs5+#X<##r$o}^-P!=2i~DwK{ng^~tGA)^ zM!l|dUW0?)Ge`nmDtjvprHh|jMZ;d#nzI&p6WM{&t|#y+Ez%#sp$*oOa5_I>sGUA| zU1LIatNVBhU^J-n9xVk;K^57LVZS`M2lfYSnLXO$_(*$0?cjEI`R`3Etr1n%H+SB= zcD|v8PY`AQTV>ET)TdJv{`lb+Nk~tYo^~Vk1q&@tWQty9%OPMbI@bVO=4+oWcRCNHg zeOu$4W_nxsYmdLJxscppZ2E8~e4rK5l6SC_ARzdT)(^iKpmUIhy!lFIgx$!>#infn z&7&#h*9)06;$2?)%kF*`=7}Y*tY|Mf8J8QdEf@s3#mIix$1N_4*snFiN!0Ct_805S zu5tvm&c9D%%e5APuYT+2j7CEeIEwBr*ZSq`tO1R0^+~bmMIL=!UamJkGf?MTs_Fk> z@4e%rsMi1S%w}tLlWgjyk?d|l2oNCj4jH8P&=jQ#77&D}*Ly9Pps1)IpumGt5(E@P znxLS72Be8dv4BWd6c9+Vb4Ka#d!I8in*_P{bMNb3e}8@TrIVdGbLO1qw5Prw*g03j z`tEf!F?}GM#vK|rz4i^NwKXt2?(6G3gO~#~Lq^Zx1$p|g;;n%?uC;HNz0r6eTsIGI zg|>ACb^Jo7{Xv8FbG`_0^i5qG76g>jY5#$w5&y^+Fp(Bg_%^WOJt=D&+yi>i``d(U z1$dFWk?!ouHZglLw~N`cY`dVdj!zH2JJ6Z3cZh?u=?>7V2R*VQFi`rHw(kh|9N$%mrF(WlZ;bR<5AF=qc4=vyTyh2{=lq>w8#e6-U z-l=@Z_~bns!awrJ9$~pI*%QdcSW90AI&gz!r+tC@rDD4F19;>w_65d?Pc@`&`vR>I zodR`pF%9|!&sOcn+5o)F0a5(<1A$YbB=Y@!i;_#e5hbTz4yC4vBZJ9tzAA@3f$6r&0T%9|GxG8-KtQ z{_e1Fu%PlE1D}Xet*O_~f%x^?js%?C7Qg>!V4Jw#R=dCISisEhuR9*th}XxT;9tf% zIvLn6ihV&ne-3!oKYvOy<-hn-U>k~c{Tbgxu}4n_cq;ZkPJ>Alr1%~W8~h4i2s|8g z24{6o`t?j;1Ri!h8~6zi>zvcx%==Am$JbQ<96nJ0Jk~E>YH=a(ayTE*eY&zIgBJb} zXhOpdKr8OJ7)U`?nHK~6JJ&CQSa>D1EbyHOz67}YzQS4Y6j2_y1TG7Z?%u!)ag-Ve zyej(g9X)zEP>ps6V0P$dQJn;NR{JtESq@HC6v%y55(@NQNn0kcriYs;je z;YzbGrYY%oW~X5m+h;9Gfi!Xb!&dx4pC7X+19(rqv@0ET zXY5#q;&*7aDfwzhQSojc*z9VPGVFApLy6}LeO#1Mjix)4tUGHnES3EVxYv{BX96F0 z!;4ARX23h^vO{?SpC22hJPXqO7N*=KNVm=)U2~@(-A%nOY5$aT9HVfJQ&4TMQ&6q9 zOHgf!OHggUOW}%~{^1I@FfI%iH}kf?5JQ(i9o(uJAqcZ9Lh*3IY>CtelMto!*ZbU| zQ&l$#U3v2#bk~NFE)N+^QkYVYYDJ5tJQ=OrkD)#st&|~R|H~Lfcx_yXQ4lu#1*OC) zbt3sD8i`l0Bky$>w$XcHmAg@Pb*v(?JsgWw(s)_yx_8>^2J5%_05+>)IcriJb#tSlUj~8U_p>HLLh8j4C|Gc4mDnuoVHr7oRZCsr!rox3}(TAX~0)o2n#ouRFWEjMii;p7l?pDfO^`)-U!d zQQCv$+Jgf=?SYi8gyWQ3A6Z@DyWjfinMyRDV9jbMT_t>NHC?TvB(E>dQWSps&05;l zvZl6j4L?_8qZDT6o>J$w)oi&#%51D*eKliU8><;U zI(o|N9rct6Xl(l&r6w+q<|tm_`N-$4U^3p$QAT5~Tk0!o(YH_PD`C8E+ZrfeiMBxYCFHMwv;#m4zqH&j@ zLOa+L<5WzE&6FR+30I=e>onTZ6sx9~1~gY*L?Hjs<_fovXSaZZe@`0GLP7SU^|SDc zb0m9ODd!-7?4bHfUW}u!TPsbm+$?RBhMZovFE?vUhRhe7E6W5A5wS|K-q6)*w6=|M z71ge6t90TW{UcZD00_!2CCYgrBQD%2?-p}UOUXK1RytNvrgF!nb+W=y8PCXyuhHF@ za$oCx@g#ZeRRB{DAa|x4?zX~U2HulWQ}nbA`rIs znnDE11V1fApzU2zOAku!CMeWSyNuE<)3wWb?Q*=E!X0!|yDQuVbBVm&Aq+g+U1^1z zOS&svz`c}pS7cp;;0(KvgdAQt#;m3eJ(O1V;`MO2g%nDs`YG`i2M5`pTm6*u_#6#U z!(U70Gb=5co=OX`POoCfICh7#m+}%m{zfm+hJC%1cf_uG zgBH585Y5mV+g>pp?5${=`%T)?40h1dc}fr5ZqP^Bie>eCAEhT>R_*&KZ9&_KrlN%{ zy+D7O*H3X^nLQ6M(Z4l}r_cK-iG1Du*iZ5EWAbJ{rIt7$#Uk)y;c5+T(O>CY;Wql+BYF-+Q+*H54N-=swg29IyM7;kZN$ zQd$MQs0V?If@AgwT-NNTp@WoEcu_w$NG#h!gOs6KM8An58pCB|*kHx$d~YWAuKY=0 z|Gzd^;o_;T1qmwfb?4d1+!qKCV0#B+w<#oPh@z$JvT8Y{_CHt}PM;1}dQ;e~pTk0J z@UmGjMB(nUfJx*KRu_kea3+Taom6kAG7fz%8j48;MWMAu91WcfV0-T{MT_JCYE^vE zqXijK8r}Oq6RryyI}9{kL92%;T|~1D;4<@Y(QF-*@pcoSX!emed9yRN@NcRtIx z?^P`~T{JD+4G=4|n?sfXXN%kVJ{h9KR{}-_Dj8RC=o-W@TKKmbKAv!`H`RT(R6|G& zW?c)n>oBRX%fP_V`z;`>|F$KWmr9^1S;HFBkr6n)deE;UuqK5^?q`_&*GA%$`hsx7J&^21uzcVpi?f#k%4EpMMgR-?;B-V z^wNV$GrrlEJgD4tTkX1Hq)P1$992f`P>g71MqM#7W%8eDfAS%vJ-WB?AtgI%h>sBHLE=%I?L8q74n6es)>pq0r9M zHKUZuP~_Y|DUDY8X6-h~x>7|F>@F;>I)EBBUIV`fplX#Jh5J+Cd+{l>;!?hioR28y z%-o%ye6O^HC_DzVSwVfrD4m@fW;tZ9zV6-~qj0Bn-ET5zIn>u3U(*o#&W?fjQAooU zrg5#1FTJcfq9c`irCzi!9f&0R#wy%CtwRWYpyp@j&goo-IO7K|TqrWi;;G&P4f|5j z)xlPg<*qoRtS!}^C?>Ikr(S7F<0cBty*y5ARWFQF+TEr+)1?_4JQd0_9$0}n0_7Pj zqK5KJ7v7G~BFlKCy=l=r>NXzi1u&?_j8~@f>&@{>M{J87@|8z10qRcyILWSjC0qB} zCSThXy2Io6=26Yozy27g2l9RUxY8JB0K~ z`5)3RD}I*@RN|*kdEm|cFVcMcFvI!z2LyNJ5 zy51^7UB5rkoIsIdVD5~CYvJa9;2?vePW?eYX41`nD3P}3XL)&u8^u1Q^o70b;ivS- z)CgK5kB_1EpHjx7YspUwDeR%A#n3N%T5x&Co>qJ~Wo|vKa4paG&nO~@BHnc41bloq z-I$6 zUevUh#nlAHihNoxj1)0K)LF^{x3K#z7H}m(&;i!SfdU9RE2&qZAaF?`PR<_dS)pQ; z{>!-ak8NN50w-4>l>8}V{UwB~BYywRA?r7%I^?yXdi=rv3t9gcA?ut{n{-NHD*wNb z^}jS^edY}1TkP$KD~PA(-cXvmIQcJ|bQqHI2KgT9)uq&k4RHs4js4d#+B z4W_BPO1V|4P5aVxN-k3B(}KCkC+eMvXnu}qZsz9NSo$)hEQ($#Qu@*}Z3AHzZaqi1 z>aEfs)G@FOs+Bo)YiZ@EkJ~Z7f~T}$ORp650Z_-caEgwg6CFy$PP}GCX=A$XXLhIV zii;N6sde|#RC?}++YVDY+<-h(@NOCQtN3aTdj0P}80t~vd(00XfWo^1?kY&;TV{(L zdSUz&kxtG6akbP(tLK(-zn^e&bw<4pkaDje;!T5yC*P}Hg^0-%u}Ha#y3J9zJ98vA zD{iF9Sh5Ikpe@o#RCJ_P)a?zp1is5V!q*B-t;8tiJ?iwn* zj`aI4NfqR?M~H|p%^L{xszaYF0aX5hx1pay#>uypG^YXH!b8CF8s;N!?7K>>hFVqv zj`allJm~7t&Pt^7vj%;0v}n{2`OHPH2t+Tn4o@`$Kk+?!f3D)Syjk_!069eMVFwlig&~XYQResSXFxDMLHUa=b&R2NULK+{I zYPA0DJ`q$fADvo3^X4nP#1Oq0s?YOF^EIvk;Yv-Z_X4FMynOryLp*#A5=pp=fOS8; zI8cMmFHrd853F7eSG(B0X38B8h{1#+FiAaWaFH0S>Q!L8|Ha(yQ4FEvehL(~GduyR zOy}vvz||j7G;MyWr2B^O86C-aVeYE+;!X`){c^ERKe!nh@ZCk(u;lZ3S&JejBdOhm zg#x1A$9?2aG#ZdW+3yH}FIz+Ko?!dRMupv2q%#N|438s`ZDQg(N_#=B*9>wUcqd3M zF`0SZgCUC)jzgcL<^GH;Qjj8b4z`0f<>RfCy;$KOz*Zi@&r=-qS`5y!7k#!k2*Of% zGIP%vJ?mP~Bj66Jox6?XFVR>oW8!i!kn$w}1JUO!#lNd?AW16#hj|`@m}Z){n0x~> zGG5HvW}4SjbKQ-MPtFhCg@CS4PQ2QJTD)DF>S(Eza6e8r-&Hs~Mk_k?_wu%m*5W>& zi~HXbQ?88$DY<%bIRcNC3S^PCfCYCa(fv!6M5r*}`E+WRgdOIqoyhr7FfU*eQUM&G z;2KTGmnzexwd=<%Q));r}G?j;{6 zL%^t}tx&i#kzLQ;*K38s18m2y5L)>#@;Q3I;rwsVC_qTJ)A2P*SKzUVY1e$EP&cgF z*fR;ho0rmPlXgGAZ=6`EB%;~~+OjDlj@+x123%cY$JW?;xzaM$E$AC6^OH$2I!UWU zCv|U%+dDZ7oxC)a4zJQW311lANwG!horGgWa2q;e9i*$DVyP6emtMhQs~ zJ0I?1x}^8A(cuqa;_5+x50xf0zy3H>g!z|nCD4BH!*6X8@`VQH;?UAeij)Su*J3_A zMHAaJ_R!}&+!mVlkpgJowMt#=OJ!@7fw**82RWn%&0i;!WGB}tDfQRB9E#w2zqLik zF8&Eei;%DQb@|Jo0HbIcT4H=ixLJx1mHeLWp@(?Aw|%V@zOd&b@uAF*mA>d}bt+n? zG}F^OSkcYQqKVbbnE2m(4C71X*HhO+&)AdhTQ6S!XuVR5b`IE}^htWk7w?sPE)F`4 z82d?RT$TyCrAYTvv~`0rn&VT{{Y06Em%sW%;XXY*KUH4Eufv}zPr@$Ld!uqM*Dijr zQR#S_0Y%4*sG@a&T`s6~xdUcIgH1}l^d&9cqzo{BX~k|g{GmtUXv${ANvWHa{`_A3 z;JuN&ZOUc^wrl$IGi5IC(dSBcTo!$Y_+P-4PS;tTDgA?}Z9^)@BbFq&^eMeomzb2$*d!`ts3DsQJXG$f9mi>VtX zjUn%L#RoxlCrRd;@pSKY#bxEV+q*(2--cuh1>2Q+l`KJAYqfE^umqLjMP$2k?@*HB zstV3N{u7zW3mtuiRA#RuQ6vwrmz6-`QZDq9Syi_vfrb~4~s%kxT*pn*26t+sh6n}<2p`KqV zFJqz}{8AWDvUe*_7!vdP_jW6x+#ay}E38u_soA4+1(m;}{ClP+(3|+hTXSNMlFY3D z*Y_xOgf)e0I$fh-v1|Ob(jI%t_eC?F$b`aZ`q#?9sFUYxFvf6568sO~EhTjIYo$YQ zE_K|ijI#>h_Jbrv0yBNzUf7H`(c!&dn1G-H2qgPHB^|o@?0t$K4|?rWGH^g24$-hC z&gUSD(9C^GYps$Wt5ov)zF;L8`;~Mn09WktQL4WWW-(Dya@a9_)`K^gzF(Q2JEy`O zZlOLB`E9${|S>)nZY2>$1JQdQMZ()W3NdAq8j0F1bTcrVL z{xgXj27m*$kZt3*XnO6)L?^ZVPMA-+eFv_34n6#x(u+^4Prg&C#|XIerIKcOf^w2W zrU$-*-J}Qg{azSs&W0@57>c8I@D!(m=6)-)K8gF;ib_@Kf)pfA#?Lok}LgTg8qbx0YR)k7}R`wTu(-{Q)(_qmy% zTz_b$p_BS0&_{=awe-XxrL&>>R%lCH1kyjQiMj{C**##NeE8m>6n|Jj+F&h6bnKqs8@~M;z>AvQW!f8Jk9m8UI|*x8>Fn54PHuz z!vM;0nAaCL~iE^{!L)0MG`+FFOSWmfoue(AeEQXCD`mP8fM_m9^64 zb|5KgQR~CcmL^mAafL_Jg6weC)o}!*+qiu5iS- z_+ON4=jv6dJlq&cGc!p)-auH@FG`s8h#fa9;zo=%{K%9U#8d;&H%hvVz=kllC~ni< z-}8%Nx4-Zy(&4%LCeeYvZ}XT#-H#_xor9uo(Bo&cR?et59kKgo zlvz&R%EtNzH1up`iKNm@5MJKg&QkItEj%miEWRI~;C7aaXBCc0ZY5tyoqDw3oS-*y z(Q&u+v?)LyELnDon+5VN?()q34NCqVH0C#jN1lh#@b{mIp|%~q%y1fb9X!FkxEpyM zdlfK&Hf6>q%3lT(t6FNAy7Szs4xG3^in{N-l9@2A^3%>$pH`>O&O(Pz4-;Dlc71Uu(jlFIh{_$@5M(@ z%td7fHi+RfOOxo)ab+pwE(LQ8tb}*E#L@kw;54v%%qks;TeAHDL}i3sYK1q$ZB$+- zG}^SuL#G}ak2TbG*qEZ6MH!Nr0%d|*_m(STT`x>?$Vfk~q4d91u1WG6%N3sdp?W|F z@g^4rp>>@KS9T&Nc#gb zS-??nL(wmP2xwCvS@R5;=(3HbTvAdif;qHp?mhsY*0IYP8U=?*x?lchXcU50de5Ek z>*stYUKl}Xmo*IrI$wt#x~#Zu@4lhIAwPE+%p|gjUWPj3-P4HzIC1A?ofaMnOnybs zVzi!wi%X?IVOkUq43GD6t@P;k)5Gb@_lG&@^D9C;O*@Ck{bN^zGe8o@Hm!k%1SL>v zb5&^qJVcXsI zA-#P|X>glxtDB3fu1HO-?7<%B{dhp?&_%$vT6-A9k#?O`JYWfw;;EZDdP)$;B%9GgLy| z5a;Z}IHKUsu*=1ADrE%GO2NUx9Gv&^@zM@7Fr2l(Y@hg2asqu2&UgfsRZ|t$yk5tT zog)aIK<)@O2_7VRuwxj_xSORQ&E0?$lnUksp;Hlz>*K>{*r))oUcJvpQTIs39dr<3 z&GAVdjbyE`i!6@>So>2Hh-42WXc03wX1G?SBTplSla_nDJ?dszVam%kE(^=AoTOqm zd&*w87M>MgF<9tY9@cSNWJ1X8y6Qdc|b03Ii94^Zl!?;W4$QahhSl-b^^5|NU zCrnc_3b4B^F-#7xfTZF+qmi+!uW7f5T0Pz~*=9gd?d?CBpMl83wJ?@>unY4b?TItH z-e%vQxMJEMY7xiknr=o_24CM(qk)}n#xcJJzJ3@H)z{)#CYJ-&)SVl~F5~Z^1v%Se@k_CR`@Q&0&LS)r~T4-4Idv(-IiY#G-|}>p^3O5dCQCf3vKu zaN4kG(Ar}X**KI=y;WA1!jhPQ+J?hU%fX$M#JDowahnKW1VW2)I24ObZY}~CNq0uj zv?M0%cQf8Hf92s~HB3mz#`f&G`g;F{9gxgZTEN-?*WX8MmnvJL2YK#XWhSxEMgDJR2Uo1$lxzK$Qyp zZX@oay;?Yr0l=H})UNNfk{r zqk0CQIlOF$3CX7OUxuS&nveCyJRa|3-1Q~zZ^vTDcwcz6BKsY5a5Y(qYwKnNyr88C zT)p;fO;+8uw+JQx?4Y;sL#`UU8DuD`_@4=oTKJzKm&R@WXWNS4eV5JTdH@Eu%BPn@ zmnleN`Ois%u7&(xq!AdhqHE)8i-DO_n{{sRpLc)LbJEJlWw*JXG8mvz1Tt~Sav zz8-U$HvK{q>aprPBZ=Tg!$jL%_qLn6+3u_mB< zo-Z`hk{m3pm2@G8?JymWeKYD}8!DeZC5whV5&=nB0w8!^1LoC~W3^~r1E!}tlmP)k zd4(kjl+uv-tozFZ(|T7!*2%V~%*vC$(2RyGE)*MUz- zn?=t~&L?MiSx#vyVD7W-`u0Gepy<8jWITL1S?q3i#pj9?VUS z!Ff(<)ui&ts3mc@w~5$qbqB+snfrDJ!{R3BAaMDbXy+k33+s@hX{Gbf+mxS&^k`F7 zkz52R5Mya+Qx+~gvmhxQ-TSJkH~^0|Wk8Q8T6vYH$VqF)xbNZgW{k(%c|YA1H+yls zKU~MYgil8gIhNb88`IQojI*u7nzI3JP9rc`8p@9uR?r!5as-dV%~=FS>TGkC?KIHQ z%#cR&{|@N5ruaJD)q1r~6Mk8{!VyB(FRjInJ=~gSj1M6`gxAVX}+VR7mNN&wI zLRfxl!Q$#i5A*3R`F2FHi7_ocLUe*eK`2i1ntJ; zHtcyY0??DzAK;_58!x3$*S3PAwbR6_C!vFyH^xs>v|Em%g<%{oW_4S}pYhT*}F1GA@thvWIKvGZoo@I6Gk0v!Z@pW`&YUcPtn74oPNxxo5XigMNNg zW|5}(r>Q{JmZ3{yy>u>LXPAU^TOzZ3%;X3iC829OmWFmkQg{qYqLf6&p z`!DUY8;ougm?fKs9v%O_)hIK3^>4b%a8Qk9Do^GlP}bTPY#HuZSC3E z(0lzBS|886)UN|e=eR)^=9KxYNHhgWvuMU7zvOY7R`?~T(Q8ruU*uiA-mABYH(JDJ9HW=579!Mt+Tskn3Hr5v1bcVcpZV9de<|K#KV zm$9K7*H19Hy}B@WaOqe9CM>WRCv;)Wu)06)QfYPPPY(yQUKhT)=~frU;eD!iX)UtZ01l3$<$C8n>Ap9CS=_7H0D%nyG_r1tdkMv9zCJ6vv8IA} zSB#A?&@D*3o;18WO9m+>bZ0y{4KfAsoHa=I&QTEI=)SB2j2WF+I2H6@gE6;~H2v8h zJ(%IMR+(tYwKe4va=1frrUS_Zcfvc75B)HDc~Q~QG;KK`(NtIFad^c(69SK(*LyMU(c_~*Z^6ZE#fXWi4h>g|EA5B%7Lsdv zCAXfhdovESaj-Yjz)q7|BFV0t$9Ni;Od%K))BtNt6M&T5#q$Qaw`WWilfs0!NVtLo^cHjGuEaNBZ#AIF#DA)Gm%ic>Qv%z zH1;ZNKLsr_ZZ79@rR|Z@co-+Jr++&@%*mSr*ef8^Kk?~ zrl(AvmI?O*Uzvs{8PrfJJp*)2TVy;9kSs-(^*6?|Y?pSc}AQmeM z29wC`djAdu+u^ttN#wpg{cj|ZlLw2l;y=q52dilw4g0N=jpC<9MoVjH;@MF!YJOMx zIPJea%uY`Zg^B_PfOO))YIO4aMOPR+doD=GT2fd>2Zpk4?yr|P-d+K?pEbdVYEgR0pVATk@x90spxpy8vRQcw8|NUYq z{4=>%l!M&6^nSsINi|;AZ514$cJ>Gs%vfD?vUwIx_qHRT9qLQNGUH-t>ImixCVZPw z+ zjcK*L=;ZgDp=|yT>jQU{DG#yH8lIksw!GRYmfR1sSy-)Grml>kPaej8^%NzHV*Mid zKqkvmFNeB0Hl#&6E?ys{jpJ+M(A0IKSWlc7)}p}Ev0x~}#t6eV>%lY@rkGY`G^2&-hVv5Dbc^T-{~YFkBIkB!@> zrj3k_r|>bsvl?EtLf4UZ!JR_h*J7doGmZ0l{&_b-LAZCROT(*veGKCssN2Wjye`>p zlbd5BJU>R)fxraKeP8R26*`dOvEr1DqKVd1jmh<3L%!)DA+eE14FQdsk%)8RKz1EB zErworl-(tnXy>D>s}(?qJY9#t1gtfVHFR+rvk>{>0gh-gYMgdzgSK31`F)%?ut$w& z+`6@QJmVhaNi;pWxrfH*S3aFJGA+VA=tsS!V!)~imL^E2WX*lh zuK6iKcgrrP$!UUQ)o9HtK;|!ej5PwuK6(r!`(<+)643OeBabm|`MQaF&W*phIUFTA z>*MvuP|L?z3W#ve<4|`#L(e{rGKM*u!=;HbpP-CJq3V>sbwLc3K8{8{gGw^R@5mbZ zab*BAd!Nt;DNFM}uQQg7rae!H9B={_lQ8q!Qa_yK+*Zalz@oc z9+deHD7|6A#>L48vbOxqD*#fZP5)p#GFac9f&*dIfN8GtFtoM1>DE733-h8-NFsS# zGLs_h6$!my`nS`X`@-O=UU0}tIiF_Q>E)*wk6z6A7>+j6f4Sx)H zgx@nkTR^1~7{^6Sr2Jq#0YNaknBlLN}h<7^AR2*!yU;JS??O$14NHrKs1I$ch0;7L@*8KknzAo#m?$Q_1*>Mw zn4|G@Veiq67cEr>8VVFSOUJzigFtAJw8=GdXrBi31FyAzp)#N|cjPL&&9e4#+ zj~+#B8v7-_B!@rNe=fzm#y-N|Q4dA6CHoY1RobvVbSkp|4~A;L)1)RfcpauW=(65v z!T~x~z0M~8>#sgPjkVH0n701JH0U@`(~u=iU}KoUcrqD_t}Q5P_^7=oH?o>!h3unw z?{LuFy)#$`l(H2KJDe_6qp|&`*bz7|WBOfjwEErHuIuN%0Tn2!JTU8btk?~#IYrKd z=z+2QL=5V%wbc@6{NX zX0yDADW$sbJ=r8rDy3&45OA&`$^H=esBQuAnVfJd<+vMO6aEX4 zPwEf+rf`#!K8a_kWFeN$GyIy!doe!F5h5S^$Rtw0cO}*cS^!P*rxqTTMV}LMam9d; z_D>QU?mG2~Lq2WDsy*gtix!qFoO-(93RbLsl=~LrX04NRyT&1}?hhU+ty7lc&?Fl; zvr*4;NZzsQEvUqLaYH5WUk|~9ZA$6IKbf>%e7iCS5!{jQB(8F4-wq(;5mbM0ZJlov z!hWNwSrLwCmUo%=HqEn+uuugYl5^==d^=nr4EutPurPIdD6Lt-+S8_D*5<#g zYwa~yN|&&X5q9o_Vv%o53>8yw+CrB8Usio(qG)EY>NhsSB?B60UiEF3h5wWSuWzRO zcUh-Mz0u|R+M2zH`TxsCub!jPgO)8~k+vOyP@y#cd=bm|FDotyXw;z5i`pc zJ{?=kM%i|L_&=lJ7awvO_H|m4gL~8eVrX6zLo?83>}3bu{jW*))kh{VN9o!3SY+yH zKG-Bvb|~(>JSttg{Tt_8znnj}3M4sm{+M`9!a=W@5{5a&o7m1WH{NW~X|a z%UpCZDd1S2|2`WbnJyrBFlu-W>b0l-#H$*?< z`Cs3W6f<0$@n=?4oVK*$)$6wP-BzNhs40IHuStje9y%c#!79leZM5q5*R0{tJ8ON0 z`~}aK?-2=oY!&0!!4vO;uDQ5cj)RKXsaCZARc516tJ!(e7JJd~Q69+0Qxh(6V4?k^ z%yC6IN7G^8Ua>}Oq%h*e^y$bsrRyL4ncLa3juJm)a}%2Rob5Q*;zJ@}oT`3%mdWLp z+~aA_hb%E(@G}xDG>0T#B##Q=e}6~0y-ro5W$kVt~N?Ql!;9eTOjtzH~tl1sn-Y)q<k*gTZp9@qrGs-V3ho=$x>ERjAv{#N z9llt)CItBCce7?e0go%Q7k(y+JIS||)hycgUWUXK*`CkY5YdOJMjs}AF8UCmi7R*N z!}~?_#pkRp_a)PF)&%8pEMums-eGc5EMK1r49^J}Dn6Aaqw_Di*(l^xn3s#K} z)jeOZZkfSxon!)IikCobElYbiucXu?lw|*)Gbys{dT2{oK2qJ%qANcCe|^hqP@6YlBxpce0E) zL`Q1f02H{^1OCNUJ7H7NauF`s$?C`5a>`j+u^|2(N}b=ydU=+cj7$^=P_0CQyj|=m zPJ%tV*xyW7dhEsonKK!FvD_iHS>>kEgJrHJ!m+4Qx7YJe(5GGqcI2=yyP1_+{18suT zjqhyz3fsP*Yy&F(v>n15_Xw%E*BjQ|s zN>70jQ}t;{<#$Dh-H+2ij4TiXPQr8dv*z4MxS37_1C2^Vi;D?fzMoBmN}vTDKg8+< zW5j#V2M5GiargkMVJiHX#{YmcpYh+IH|wa&H>@@H+MWCjYuk8(j)@bNWm=~pq$2_h zx$F;Y(V23IPBjzK-a$!3Yffa*<=%D{gH1WllEMH@H=+*|KHSF#;J9W zMy;C%Sxdwwv^WIq8y`eOY@XVPevdx{k-QfjImB8bxbBM(T6q9A=0-n2^NscM1N<&E z3UN#TIbm}QDL=3T)8voHbr^GTH+4MBR-)wZhhYtc|6SkDVray->`6O!;&jSyo}kZv zWS*oFczR`-#u!^R5_0P2cOr1W*-}U$ZyjOPO>Z8jk|PMpT1TNrq0`1V+;x=YG%l>b zCb}N#3p22ZPHxf1A*_k%dZ>m?RETj1gAoSfu=FU~02zAtG3GO@<9lct%Y}4w41!!A zT5*iEzb#hu<}u8IVO0M(6qtRe-*MLAwgT@S7X=Oq$_dtzcVOTN zHr}+>Uz9(m7DDJwo`AX(K`poLj-j}dn09NZ-AUnGvoHm+-PDt;zkO>_x_b}cx_F#x z0(mFpxG3TjtKrzT@j!@sl1V;H((h%l)aMk;ZEI-!De?N!Q>>Qbg<|pM(U77o)(r4A zWv5tjJhr7{y5oFMJ%`2a{fYJC&rayi4Dpz61h4APPU+7Kvm<||{={-c?7`1PrxMeo zSop$j+e~>sV`p8xnV$R^gt!~?>2%TX}l59RQRdE7i>ue zU+}5m3&QqplFYsW=~?r0$SSq3T2cA5WT^=~^9!plWs>~s7$fE+1>qSdAjKle|QG63UU4`fnUu2Y8{0>qmo7=J=EvnmO=?od%jde_$G|@CE|i# zN&FeKAGG>cmT1rRfpq}jGadMq<@EA2F^$CharEMP5jWls=MOXd*sjLoZ#*7T^)XI1 zj#f4avA*p>nwp+PA#hUvzy%<`Pf-5yxOnP+hNX?r%9W!W_YS?Fmp{#aYmbiVx4x^m zwMW0Tt>V@u{T5tNjTez5LDbouuAF5fl4o;#XniDY9PU;esMzw)UZm9{C!{3upg$f+ zarPp-uXuR6?vZ1s56-c)_BY}T*gXyI5mVZEPAdP#p z-{t;>B7ehCVyD5svAdjy;nJyX(iU3&8_TBsAGNg8vEP{6k>-sA*!pOnm;U&Tb+>pS z+U%fC=UKnFOpyc9KB3(${4?$zzcbwJ&7{@m+2d4lX)cn%TwqBlJWgL%z$c-n7H@=; z|Ht`0wv#FBZ8OK9QOtR?-pP%MmU=1xkuiNXR?=P^noqY0je8HCQN4KBw zr$6E|$ss;hXf8^)_??VLfTNS~$c+$F$PFi|iNkF(I@u{a#EBoij_?99d(&yntBtF9 zEc~w18{zej_PMYDnnxqt3|NPO#=pe6V4E;3W=XW_BI|`ya&{?8Gi`pIe5I_hX+tU9 zQ_5O9U*)kd&2XIHm@6)2ZJjvgbQk_4l5=~+(XCQukL11Axk=u8DmnT@BGoHnaackf z%5b<{iKF^Y*<$JWGFGi;V7XAoow)`h6kgQb+xUyVC_yoYZUHrWqvR0x6Gn7slEJ~~ zmW?d5>w{}_v5eJqg1^+gm_)m(fh)1g;o4Xyku+zKhaN0v8EDUI<*YRrW}RnErkkG+ z1kV^?_UdqK(q5<*3j0)H)IGpzfqB-M)nqCRux1`u<+N9mE9PRBX(Y|C zSz?NEU*-r0=K`z`-qT^1QmKQ&+TnMs{vORxSTp?A;Y5<@TLpe>T!ohZ`_Wi8oVa7M zOm2S^nAmobFOxDDPKHeC#8{m=wJ=Z2m?wy?dBW=)eIq0^#9Qme_mZy`riEEHjrN`vP8VOkuhI<=5xMGggU@Ck(cpDh&hu<3S(oV4%rMI8ie;onF|!WX`+-^poOcBG_uHmq=NhWm-ZQl#%UY&nWQSCA?!0j zYzZxN5(Z9EFytVJj^=eaPT^#Am8c9 zYf@;z@2odyubW+x>GJQ)YtMYo=afx81Z1^|kD-Qtunf+D4E%$oa$fT(eg&`j7Qcem z{Dfb@YaZs;IUDE-zXGZt@e)fd5d5RqoZO*&8Cv@Q=AQTnhL<0n&mG);s^_TvkP%M{MFlsh=0oE5nki(kdOy?t<{&K zLi+d;YdcCuZQvi8X)!)jfmG`kQ1BY_GRLBQD3U|MAN<0EZ#5h3kI+8pkNQ78NkcBP z`!K^kz0B&>LXJ*t7%_?TT^iow{7|#-Lk&Lg+6DtgF6Ii$j!g49-Md|e4^|@eydvg# z{uNe$5%TJF(bX$hExlx)_B%nW;yRi)7T?@-%a;C4oEzM%g$05~>Dnua^zl`(kTZ-b ze!I%L;uE^Sg{bjs>{;vync8!Rt@_@?&B9t$I{YkR4z95_cvTm|VyMP-=EFjnb-oScw6?q9+QB`S%uxNM>y;klI?)@T$JJV7M&3&OG5_J(#rh zkWI^NYI+L|u?r^(3@m&d%=pGC1CXCDgF0F@(V_+6p?Wv#@>V0>yeYt9D%%0;5Rk_H*I@k;Nm21cLLiM2DJGe4Xh-Z>@MaxN3sOil*@~K!F7K5p+Hh z$1M87uD=+^=Mj~f)bQ4v@bg~|l`rcPXq!<)TS_{eK@8z8<;EZ1aCa%rP#xVt%|g|7 zmeqEiAiUs@fhjaMRCNe={T(4idFPWPF zaZrDcUg5vFUcatXZ5~pN2iL|wr~Y2;mC9>)uR(pjifaaEe1 zjSMLG6oLie;--yTP;Wx(pe{X($TdCSSIJWA`(^v~)7GWph zkXXk2($b<=nP1--J&Y9dYp+cWkLL61#Br1S8T>T)2K9Xi`Cc9vW9OSvrFC<#QUiFu z4jN6+`gO?Y*CFHnzt^uHDpi|@;KF~SUx&34Xe7=tsg@uuy;kg zwMwUsRQfva)Divrk)l)g9yL03)VTlebxK29GPYYoKM`4Ju;_$CO^B%6h2tT!rY}n- zZN5!c?9;?87j%t#uu@Yn`N9KiBY3gj3Dp>Z4{(wQs>4 z1I-`|R*n%f>9%ZCZ`iVd)6e;^?>BLt4|^$elbrR#p89{YellX>5O~H#2NQ+4R8M#! z8fU0i+*H@4*2ucB8p=J(ev&mq*h z^O96ruxg-{(!$t_PdluVN|)=I&ShA$S>`jX9$| zP4yDrS3E# zO7*zTn1iTSZYqva<72cQ4)R9wE^Gaw-BD^y*Y&s{238c^ic+&1_mBfdrN**>-XRit ziIGAt5vh}Fj8@r5K_nU;tv2A6hFQ^SJ)CLVqt)tA;@f3~FO+!tAWaR!ZFh{?wyHd9 zsUpvYf%bQnXIpz!uO`oG(yZ6i$seZ6vwLDxF8T*z)b81nbsa9&)FiXd#O19>EWxu} z-jdvQu3wv^>(VFFnm9E+#Sp3PBwo?nShbr?tauheNBwFmzS?WYsrUW`A8Hq=YBMLy zExxFdD@her0(`I$0;ko?|MgdEdyMY=9ztWPYu(%E`HQ;uN0sjVLGw~7b?ZHiqXw0AvC3y*3Ba+ ze^EEDR_W$dy_+$WyIGH})Kb%9uW2Q@#C}aL7EL*|RX`M_sxgMKOZ) z!)vNJ8kJwvzZ@Oh1pcDkNAL5qwTwQ$q<=Xo_+=~~vHfI&J9=4v>gK!7-LY1KYn&|X zQqX=)mPp#Jcp_iX3|0Ep^9r5Xo)!<)-mBVej^hJX=2fXk?ve<({d#RRJMqSPiyS3? zI|IzHyFZ@3rhm&$a<*DMbQsde)!$7qF<=O%R;gyHq(KP(*7%5rKFL<&{#4cLdQ~<$ zgQ~KI$wuN=0F>!`?{rb6Hw0!!7@XWZ^W=2$ezQs#M&U&nOE-(0(U6S=Omy@Ntp!0P z$_1{Y0R z;|F?Z#cKm2>&+4mMV~@s?oP!;u@i9i<Y%f=NM1c`Q?6G{N9hPwk9@uR)GlBVn#l3br1kRhg?7a!`JbT8Acd-D~U4 z1rNVdJ{mGQsHK>vy=8L$yQPqx|}63@vV;=Au)-G(e|{jOWM!g-#V!?NnYvH8!KT zQV)v%Ne}3ihN>^R8T=^G4!ai#;gbEP75+>rP7RCILNpLf8*~~q!Hx2{m!hko6%&Wu z@8Ld_$&J)jX6|uG;~S~51N_9WyF*OQOKN(=jbD|j%3_@elqITh0gw!JK#tk3Jp_q#@OL0VK; z@S?A#x289|UTxHT}!>w@7J(h>KCLLE>0GvAX#pB$YZoE-}_+NOGA zxJ0kJg4*SUI+?9h(pXKDTG5Y<)f5oxQe(A7)I0ikKwh+9$lj4?;lZ(S^&vTXolQ(G zLwhWo2sjuz%w$>G#f=Fr!M%oi7{C$q^QLODXOU4`xVub}7a8MAfu?G=3?n5p_J$Ck z*&D42O041BPgGR1#Hc2TSF@x_HFUL!8Xtij#SqVBc#-h8sCiS>=|cJUs+OPIRE?*< zhi8X7&Dan^F{AwEF0?Rnw0JR9YoCDaGK$8#MU)&pEPt> zlow0hg_pQ5fkR%VH5N0{Yl#XC!EYKK9uY^MHCNp!?;8&-n$G%ty=@L?AE>VPy2pn) zv;IjNvP2uGert5#$>wTg1~QN9A2$w_9p_$W2zgi+WZcaS8 z8^OFk zd)<`UN=@?d#s^hxm;+cI!I=qF5OjR`KuNUc@}V?ogifHNEssO3aobR?yX}MP{`A2k z_#hl-*0xqZkNQ|E9gVJs@qz!CPJP`Xp5AJsPK;V_Jd4tvtq(r)&^>L{(GeT80(>LE z%XIwf7KwDOt-8_kiS_`~i7(MlbW(-U##}Ye^J$fbp9UYM%W6N*M&qGa+#7=rUzgRI zwKi!FT{y}&=}&aN2!k8S-99k~`6%boDOqimxmha@a`I+u{?jXP*5Y1SysZ5*y)4xo zH7LOvuFVxZ=~Gbg36zFT5CfpkQqBrs<(6o#nlvWFNNHZ-7lk5Qj3PboC*B4mIbq zoe;*gjy&n-($8ryZr4;%j_>y&a=G{m*&Y1wa@Dvsz^VyFz!V8ldGa+Uq80X^w^HG! z6Z=xx$TNLuXeUhFo>V-#UIM+*No`@;^(AjZs!PK!-SwqtMB%Z#T4|GPhD(^{YY08K z2X>4b;B{Y|aq%J!3Vg_6*w{})L*Y9nbJE$D_X^q|kWsSTth6zC?tkk?)1S(jo&{B=?7 zrP)##&F`x=qxma5+$nw!p5t<+yE+F|6!s8R6!%bTh@K=O=>WX5PWDjWM>7}HyX2vF zdcroSlZ_&Jsn#%!YUp<|ZJFCKm0I;u?cG2=-HS$>d?23ye%8rnxYSe}phBhI8(LgU zrF-Nmgq_w)ZHmu(pFQZIEoj=ax1i}Ky+w}`^8`(Y zcjsxejO(LT*J;Te>!0Z($hf+Xpuzq=f{dYkMWt^){2(V|En4_h!tvUCwvL~@(&-9 z{AHP*^(FI5q2x>9*GW==uNwbjvIJjPT&EyGB)?9Vd|rN?DfxW-I!E&P`E{P;OXt^O z$(O;eizUrMwG>Wp{PzbE7;IcuOJJyRg;J*`zi!~(Z@6xfe6{(tMDk_x>$VY+uMYoX zm*lIBV0qz!tG-!s0W~e;VGTKKoUR#6cw#P47=*B&& z>+W=v3e{ysFpcOHSS6nq9D1uXL9(9u4QS-MN&-kqV?>@}wjuR{bO*}<_R z<*oY|4I8LtMA*bIXGwv0O;)8qDCIvPG8JcA?ckMEB3DpkaBb3Xo zKo8~P179^hU&Y^EoA?DrN&wnwzl3Z4YRM0DKk?Ls)`W5o*HF!u74D7sep?5>IUEO( zaCj8e1E`f(lBm}oDuX7WA}_EcoEq))?0q#nPpyXTUcFDP;j^Ks7I_28 zi=LW&p(fsT=@CE3kl(@YqVuJ_d=Y382#21aC0-ll4^lJlOqxuG7MR6JW1K2Fx&)4F zEm9CUWq_%Ktqah$vFGAqVzEpB1KY&3OA`Lw9JtysL`{xCQ`+c$eIX(DqsymXA$hQx zU2qaTglk_qM8u=;CWMHVE7gJF2s}B|ZwI;T?nbZ)_xcu_5w!1l>z^&DsPe8IK zFKFfHg2@mno@AM_eJ<)XM9pv~`_23m1v(Y?l(%&%l4qq$o~X%7ELkBTJ_uw>EOqdQ zomLG|lZM+{guv@ufbf2ct2bQG2(M;fgVCmb46g}p^SW%Lh3Y4ut1;dr_s4!fx#-Ty z7M^g_aL2J^hkOgISZDItTE}?MH*5t7dKDTJc>)G$p<{oHr30X}Z1m_*)kon6?@lO? zCtx3qp=fW^56==TrR|wLj|A3^LSi;z%>E0)D~RT@Fjf$^C}dR2t>e+sdd3< zyN0e}@_O9xnztHG(Gc9MJ|lJw7-8Yu{vYAKiLkd}s=t8$B?bdKHu|wg;&r>RH-~12 zcrZXAow57IVi_eT;}=}OWA$!o2vf1#jA%97tHb%XL_9D?HQHhRPa5bf4f;YM*CS8lB=nnqo0(mH)tGI*&l1;%1;x|LEJ!+h_#)~CjwQ!}9 z?m`|(tDXQO*6MyWA_Bu((=;bks}V6g53AK9Blz*{jn`j7M#XfXCv2Y6*hMSuSHmGi zQ%9;+Tb!E%_C>=_ zeL@hYn}&>3J*{E@oT*{SSPh?bL3ukT6Z*=9WJDK)X9LS46cf#FPR3Z`Zmd6+){InR zTiVh7P&Wr<(tX^;`v#dg5>EkU)Yn%-MLr_nRA~YaFE#rCwHhEQcrM{nm%GPUFi?v_ zDX#?**7STp9hel1?$rG}&>lXHq0n+{c|i4gFn5<4AJWnb^Hg35dOA+$gKAwcd5K1L z&Ii@7T2-ci7VpVl(Ou9%Nv+$6R4H0BzowLm5O6Ne=uVS7DKQ!vOZQ#w9!C2fRPCl4 zfZYnD|9_-?2YeMp*LQYvTl&4}J@I4C8d z3DSFz9*WY0L{ShaL6IgU!0v(w`2A;Q_uc?`p7;CS4}WI&&Q3WqbLPyMGp9u7iY(bC zBkZjSlY-3~L&tR_L!Cch5XEBHEwL?*F$&&K3{zP$R)<*UY&|kE!dAP(ox&}UAmf68 zKe)IAFF{Q1L<3(@9o0g>4?uF@3S$1i41H|A+?}TMfG@dfv%4tnwA6#cr0wuksCb$xuY^@mz z;S9OhT1(1J09|9^L@#{?$;6J=4J6X!)*^vcKq@cwz&oQJD8{J=eptY>vT5+rRYT1j zG}jH{VW^rLp;evUp!M&JwQ>nS{+D%~#)n0$YeQANQXtz0*L6sBUO+7D z>V-KAVEku#;Abn_6;Xp{sJy=6?`+E(5xG?@=}57p(M>lNxVff;3cLf|6bsx?gy$$? z=BdS-fo|+&Cwx#aGGM63-;;~$#-s8W=YqOyFRCr3^`1P!pBjQY3;$KfRmTf3WTtG3 zax+2{<|RZNYDX%w*scUM*PX}Un^4!SqOEiT>N997ltZ0fMJ}OC-_qahbbe+5Jcb7S zJy0|Kc}Cz2?{Uag-&Yd|TvQ0xr^g5~Lf3%LRAovR2tEnRejzqh8aNbA8di*J*MKSp zsDU7VhR(fLP5d767gd@3aSePll0}cau09N|bHeLtO3FRtj%(DjET%er2sP|FIHI@R zo%BemKhW0B#6NyuDlyV_W;=}ll>K4 z0uaWF<2dTz{5oLil^Rl%lSCx0OYqal4DIZ&>pS(Y7n14* zio;2WJG>ui=3Ev)VkF#L3Bu$ckR6u>sgXE*d^Jez{H!sC*g5SXfd=ovtqZ_+Fp6cE z7BKDrT%_1^!HhEDC4cxa=FaJGzXf?Woywd>iPYZ(V@7$dNuw7UI+ za1N{%fN{1X#DW`)&_c-_7=&Zstifuusc_SrX8#G-eg_9bB@ce;2CJ#yKkf`xyUTWW z;mS4%Qq(=r3psj#BBG-U=nWf%;QtNuTZX9h!wu+LiZv6+==R+qD)Tbeij=XJBjV;s zsbIjdK%~@$ov<@9ukDk;b%#^GH`Ih&PONd(=${G+RcF>=hOYLdxcq8w&rNN)07D1A zhv>RHyuHMjLuBagK^zKpWZ?2eq@dUd%sVCJV7f6PW_ zc3MYH6sN((4l7EFZN5?s+@1pI;V9tmyqjj)Rd@rg0&s?I*cKYg^et=nHvvFYI7=iEHP4wr{CTLBhDmS7yOjNBP8yc)iCy8bK=F!|IQF(y`?6$ zNpRb}TPfbzRtf=cB}N=*&Gu4L5rBt{b|>Ia=?^aWtGB=qpaVYE+ezo&Qquz=HD(!L zJVFJnuNYi+ySE`RbQvg~ z=}zHGsiDGV1Pjc85JBB3<{jvHIrv`P`9JgEMkwi~?ldsrI}C-kKtodkLIiG;vgqV{YC;r86+6QizR>uFAW`|DmQj@UzN)02uzHO}_$aXb(8>`E ztB#clq8<-H);#Ndb)a;DLOxJiV++BUv)!g8ycz0U@Bmzz8|T{u?#a08Xx&tKSr!~nmv6j+%z_5 zZ?Qr!!X&pJsWl>4C!)o0NAO`xZ9$&*UyVsddJ6te_I50WEn;w0Y>_!A^<%Y`4ex%b z2t)C)8e_wL0T~xJ>~~D=srzRaiVkb!Kl*|1TU&5tM7GtWK2ZWahHcmRZ<-V;zTXa0OJ+R2@- z*0!^7>Wn7$$XDZ|Lx5*eCkVytKoIljltOv=YGb<6yPq}2#pWpmgKmni(L1nRRCb|d zGEICv&YEj-fWnRmEMS(`gvo2$3Jw=*%8hN2&7axlAf}~)rule53~6rNVz(BCPmEqE zrs)&om{ASXY43|C^i29kHf@5haCqa3is*Pw{f$E~O!_=^Nrk=wk zN0a@TZwBCWYlh$uOp|lC+Qw<`=k{l$1AuYjLH{1Ewzb%qq`h#s+NdsX1|q0VC;^29 zNSnK2g)xB+ZdxsFcU4UXQ_B%5m=4e~HwauD2;7^gL7rf_9S6Xls|7($Iba0t>>Qn_ z?{E;S10&S>ATxJHs4;lpQzo^Y3}aCaok`e&Lu|BZ1XRE#f1i<;0i@3on4{?;K4XMygGmjL!yJ3PR}{v0AiZB*+`MB2Kye4a)78 z3LL{3g3jP;M@Ht&i41ioi?c?kp#GtZc!V+`U8pvPuY8XYYk5Qx2?F{X(V-|oZ?F7U$t_lQu z2fkNW%>hO>>&wQdwUPiXh7I-Ly2Jx&?1t|n400tDcuwG}yVWPyF3~cOR*{E51kT%G zB;3xC1Ho(IsFtMyz#yL9(of=Bj>tS2Jg(hG=PI?)k+zIglOi2n($bn8godE%Ai6SE zZ5L|y?&9cHoOc&b%#90zFN`?0%`y9X&h85;YTm5{`nGui(-7}qoDfzE4otG$Trb$i zPgEkUJTE(R;FN_sP28OzE07V#4Ze;B)G@V=Kw&X@Oj`pSJ@Y7Kt_ZB1O6!9i*p1mU zi7ZGDyOF^cAl)N;((n%15}QDYO=zW&;v_6Ion_!W5$Fh;5a0rmf<5rF;=v$tYKD1n zJ1|dd1e+kdjNJmqp?310pgtN07#&d46V;=4xZs0JP}i_Gqv@jwsw*QFlO?d} zBOfv`*E;4o@uV0(j!ahNBwYNfQS|i`HRS&Sse1nxr242ToPz3X6)2U5(@@nYmGi&E zrn&-~>fVn{tm9Z5{~4RgtH!4C|Adja*=YLw+3%s^u1B=w0Tjuw7F*yn){BLE*GGo1Xq z3d~tBi66!ePEw;&@TDu~*Z6)nT5?C?1``sc`%yKR+JB}dhIqF+u!9cj|C!nuO|Je- zeM1^eH9lAC#r{_cM1N0Fqw8~mgJUzOf`to?U<55_2>5>Q zzKM3bPF8#MGMRtu5~$FDYi{g?>{ig^j(-#LX>rG4SsS}4sDo)N8_rlrmX~qRoH`U> zyy(VcwF^ZIdoz-+A?&;_O;PKjlar>Xb^b3pna(@O7r^~}G!{VRF1DGf#xlKSur@eY zPgTS3!Fj0oc_}Dc|M2GHBb+u6&U#?Admz2%gLrKj;vI+6CSJ3MsJ?OV8udOf4h*kp zBdLitK@RCS;mVC_1h=BhY3f6D_AqJIAI7rahb5Ds2m@dx59(mZa>kDoJ5Ktmrm5{~ zosRUH{R#;SHnVdAGJj?4`9LT1NNh-<{KY3DsKFO%%b@E>9m`VB`xUPICkEymqrOmU zV~7L;WEk&a={T3t&M&}bVC>WV8iNY@bxCz32<|XFHG+{*2#$~5_wTA}4 zT$l^MnF7OQ%AXE#W!J((G$lXpy4Yqh<#TSkzZ&t)Zyttiu6`0j;dWf z5z0^Ozy!+p*9^4>N2KcpuJNPo(9WMH2Zh1o8apB3$Xs}}S%ehzB;LHB;+=sSYzVdR z!waP;3O4L_aiRnIbce$^Y!|r2^4{nK){>j!q;PSj8f(Ep7KU20)uzqZ8{;0uSN3R) z(Zr?_<_==;q~e6j*a)=DBpMj2=BxqAp09SMjkDAMxWm)C*Ts4#u7`rUVs&X(rDvT_PRPY)8ZSmhR3`ljw~?kgiT+Cxp?S zLNy4HYP!?mLbZCF7~!z{MjjkEZJ7%TtXCRLiKU0Op0HE!Jk=G)ZDUQLf@vDdM}9() z>JEU31Rr-uV&nl)^wvBz*&m}z7mL)m1U8g^RWX!qWN^xw$J^fy?wN&6~^SdIjY;iq{v*bb!850CNMH{RTe`r zZ!Y$NFj_KK{eUCp9dBQ8(#f1x#dA>Rvlw!_&m4&B2HeXFc z=sp}fu$C}Q46P~bE46WJE{S1BHGDxL#0dZ$H!Hba_)*1z&f$lN8iH|#e2M9P#L&>M z)ReUA>{=|JoyURRTvBW(ncYa0d~zC*h+oAcW8i z(P9>=*>$pDEohDoJICD%^ElBCJMN96hF{}2U$IbS%Bu~&Rye&4MePc{>`9v0WcWkbe?$+GHnMzgxFri=K;(J0QHdJb+Tk2a^)FfBwR79iFXn*H>{%)_iH zkdIob#^oAjgcjwG({V}-E{`{D2@yldP%y(#8McHLW%^ehr4G+$+7#ZC&#)|n1lh@j z_|v?wSE|e~9JDBFa#gnx7VV3wG8&eEFk^7CAZDf^AaBu>-WYa(vhpn;tIi=aZ2|Ae zXIlQblLTbk`tJ!WWg{1;0_S>}>;bYgb~R=g`eDI3-@y-o+um7_5iySqJp}l^`QXEw zzf7&4WtjRgFD4N4@lnYt=W|QZk?#eN*ZO5%OM_U<<;vQxd3R zt=btIG}kRLrPYR+8nA`)4)d8*_eu;6TB+7}s){=)3^cn0WEyeoQqUZ#uSBmUzF598 z#@cH*VopwFO|j4gqKH@-3&=AtD!Q^pNg(woR_pY@sS@2z@HVuNmBNJ&P(@r_E%Y|V zZlc*)k!e6N48nHCFvu`%L#SQM;@7MlcvkF|7)x6Z=Q`-0RceT`&YBg+F*H3He z~twdBJkx(w;sL)(l%j&K?^=rNL|A(nJ?90T|uM<^62MpcXayU1D z&wZp}XU1l@*r*To%i(R}O%yQf%vgr?s6s`A)QT6brUDNPLo;UF{SE&TPk*mh!$J%j zGnT#q>7Qf6tn-apBiS%7W9g=CnL&=2z>QqrzY*7+%i8dVxf4po&5NbK7xfJTG*;X+ zK=T!cgakGWQRZG7)e$5~!d>n!->8pvHB8aiCTrTE`Alb`+;FGWnPvA132~dsR5%Qx zVi>1Iq4XAsO7ai^_RS4y$J$$sxkma{?@Vw2u<8u6G&XA6=+p+aZE%T!vq&kSx*Jtb zps+TBdCGS3H0S|l`L&g zmI=EOJkv5^SAu8tOw0+MHMl;E&0Q0&*Vyk`nJ_HCvo_)@uxFi2*p=W}HxqUxc&2B< zuEcHY>#mn6?_>$}xk9wf-GI{un>&N+B-`8#GhtVP?~O8HSAu6_XyvnKlT5jsJ)6SG zFMDQY!mb3*X525k&D}f`b|u&pT5ncgmWxwi!Z3o_eocCPMB9*1KewM!x@<4sRcXkV zH+ms1-e~cgoQ{`j(4cF>nC+LV{vIB#^GSDS`e%#U%U)HcA$yKLF8>xp`**V)0Y@0MQ?vbvQz&ksJy{Xpgz4-V3#R9r*A z7T8F2r;FRv8lAHg+*7c#fEo4!Sq?21up=|~T;JR+G1*22J_)PCYS4XS_5}QQq8rzC zG-#_eKDZrHa0_%B0`eXtZL`Ka`h+j#MT`oLVhA(2NOG?8?}#l|ZpZ%Pl#RW(ZCJ%% z4`4hCSvKAPaxIkl=W7(8(h@Z~a-Bb4W@r*OTj|Pcgq4dA}={Ncl&GPXkl zA66L_XE2UQFo{S+queCIk9jr*JDMp&ot4!djMk-kenOE@~b{mcke*7QoHt75Pb)ZCmix;L5%=%?>n)Vqs z0gO%9XP~w;bcc_pU3{@Sg~#Gs!tv%wk8GO0fJHN7Bbjls{FS>U(ayfKqGydr#3fMd zYNX5I{43Wjj5hq0d56QDeG8?z{!)^K z)miAlE8>yfjj9$UEFMICbP z4#6afm+yd$D^}B~ohqc;2)>vE>Q~zSW~lsmEowL_;!7&+e=UHV->SpvfA=}g{_bGs zU?tDdH8lYAJ*3h*(&1?1CiC^rY}SLQ){|=ESDgX&JKyE z*zeTA@^A}{{SK0V>$L7W1_Ryv4wj6Isork2D$nZnSx~I?1~CpvyUy9^a#W zAnl|Bd(?dCGwQJy7s3$R?d4@l#6#(EHHu>Qsd4t}cbv{o{5w*~>1QKCgE`kCInM?H zlwdl!Pff6|`rDU*`aJci&BDIZHU+_3uIy8T?BCw1l;O%gyVZ(=4RT!l_aY<5wNG5$ zHUdP9O5~uV{i@qOGQZL{VFAIu^~E>qI@UC~KKUyu)2gfHRO^pr%uE2;-}MswFIbgYP^ELePg3vjCab@O-;X7Kd$Tb z-S4yD_BFz!`>YY%Pofbz{=Hh)GTZ_?+x(c}k>oz0=1N3G2h_(b(9j~Km*<(2i0UuX2C%0yV1Hss=L;-bByFO#hz(r1@RAL zBww7t9SYYO=ey0_L+WD@?|T9`X9J(>HQlBgR>uxSD0kbP*U0^| zDxz)YmErDc=+A19b?3ok=VJQwXZ2Np1&8JqX9NWwR?{IDH6m9Ta}POK25*YVL7zCR zvf#d_E)R{MrH7$LF^_f~RvXrwus1-tHQu6}@N*6|Ri9vi$S zIgf;g(9mDh_vIyVbZVs5j<#L1g(9BM@et~~U3*Dh%9FcMz_04-h|HUldRk#w?6mb) z^+V~mN(qI#%0s2!Y4-kSUXXYGMsM1*Ea^uov1#4VO{ZO}A(vTbNX?oMxY&7GpF;h`yqd* zqw(w3A8OkU;-t*DK*NHnufaSE1H34AID|-ng7|tbG0gbeyci6qa$d-c4l<*Zgd=wE z%rj~nI}`Ir+{y1|2GWT$YMA}g^KK?5qJLhU6+=O1A;Ei`9zCnpfpVrr2}Lk-ERXSL z)xj9mJ7?8L&|N3B-tu)UZK!o4iH4qo3=EM*XedjXdk!~oS+x0_ngPLB1WjuEMod5? zLssViC6b0HVKITssLI$*8=eR9ZJ%gU4k1q1OxRun`QAUTrdxMUiNP*+sqM!J0e;*l z9qb*Q+8+OaQF?$PVtDjHU~?Fy!>jEDH4^Z|Q~pDU3g7mEdQdL?ii-Y(Gn_hqs?V^2 z{`I3cBkkYPq5oe*D|_1?-iD7o)RtCEZ0eL}CV%dN*NB2wTfRf>0=8Qy@7sD7`tqVW z-nLjmcw;}xyQC(>vOPD;kQXc9-x8QaGXN1O`&?3Etk{`B2|m1p3+=%);}W*QZgk?3 zI*U=Sc5zxHeRdfO{W=YZ)8Y%K;NlAhv&(8Y27XzbmPn2(xDo3{Z5MTlDeN&N3>$U} zq=c?1wAb^4-(%*%VqPIVdqu4QGJ4OR6G{`~wRXV5%U9HHaJm2u?!qBY1tCC5yU}5i zh5l86dgfHB=d(ikutIIgcAEhDx30DdFib?51o<&o`a7?xY~A*`sy4!`1k1m&!m6U{{U)}uo&JN{4jwN>8`-V$rZIB?b6f) zKz~X@RkvsOs=7FXQgk>A0V+JJbJ9OsS937736yhHtwr^2sO&gZHY+8Hy53OJ@g<3r znp&bOnXkJ|7vNUpf(=ufOgXELfjUxT%hjzAB!76aJAi?3A;UZwOV5n3xs4bnPO`8dgLmy}B1c#}KN^8vlL z$tN+Q_c!P3{V89wycd;z^D5PIRaBX69s6ljz3^50jc?F+wUvJJYA;p=X}0w`Jk;C= z?N1%F%;G^2TD)X8VJZ7+SS&6oO5?Sd49J;kp}eKGe?~KZH`5PI!yT`so?l&|cL`~(#Fdp>`qgDs zQ^V?71e8tcCTQ{0r@9sz=tuzeAl{D$(W`5}iJ*x~=LVsZ#xWk9&%U%ff|66Uw8juW z@DXJjlo2(~CmxkM^2*Td3`AW>mD2rSTG1s{<}xEo zCQVJ$>XEyq7TE%-h~9n}&I#C-g^^_~v5O7vtjn(O{a88e-5v^OueL$LKj^VqwuaEd zH4s_&5WtiHCVv+M>qdw=GX^GuCj%bdO4@-#H zQygwqxokMeW4fXe^B4!w2CJ$G^B0s@lf8K)2!7^yFNt6ziGJlm1_EH5U)iy+oV4hs z>Ird}3x=1Uv}$@fx-+FFkgyCU{{#so076?@;f zU!qcL*%i*cf(P|R!87mt>F?TF90fn!$6;k+^=K-6dQo(Q+hGW& z5UP$%g>#-nr;-riy1a98Bpt4!9mYPtysnlJy5pLSvkZ2(tZceQm+ERQ7-uEXl?*MG z+NW#b7OY&Ek{W8YC@)=O8@)6W0`wW_nj4jDPDdr1W(XE343#XML4T)ftym>i>XWI( z(7^hdou00z)e0T^r;W3NxQbOq{z;$K)9RwS^6hGp9g`s~!u`Uh6Soeu-(c)I4S zqUL%~yGM_J3ji5ogmw(kmrP1MH1~FW?FrQCDhrRGAD}uQ49OuG2Tj$m+P1p{0Xgj&F#aA9@Mhz?j|~5)vKfuk63Y98|oD z?CbekExZ-nIzR;tF&xiRPV8S1t>$_2-2RK@MjrEG9)fqCAE_C9g;>4#!fxmz3l$BK zX5mz1Ie8js4@+n1rAAr<=^dKVNXuc6-E72r^iX5%1wb~pvDO5UD-4GYSW~P{j4z~y z55NFd$vh1UfK?ydL~9DJR0I|bF^WPSl*lJYcD_shZla|~Z_~$3v<%?NGCV@R_{PSE zoP|3X^9@~WqP1c`)o!Yd05r>*YK?ISuqklGG%g~N(pzW_N@)g6Si4+IRVc{Xg5~7S z6y^S%sdcG@R}#ak)tMZxPG+LaN>D3!pm9(Qd`({>B24l=Gicm*!%D)S^i(v}BswTzk@;Wm@MOp2#o++%%sNXmkZm z(;P_=tjf61d3yqxjE-~YllM^17NQpuTRhl{2CcP*0mAH_oeKKeSHzeoT+dr$06o)E zdx|Z#`V63Ibfl$LE$pQ3=m`+u+WP_jz$^Z4_2bQz{$(Y6J~>T1usU zZL~ljjbX)Y9%ZZwj}gZR8x^$StMBJFT1&9BuD04JaCcv{)qa%hYyPZ~OFjGmms&i# zz1CdndHCm2ER%&G@9ee#S6#9qk_zz31Z<;yNh5r(dA`?=yhYyQZ&bGf#6de#spPC9 zhWd5To~70uwalhEZni+qK5)IYK@YUMG{xlLf76;^~1_i{KA4*3PckfwE^;; zRLZGw>SgNKNt=YB@}s_;H8=g$iHnr3c8!UkjLsTUV|}hOAC`J@=U9I>Ov)Rf%G55} zb3pOz%dT|lp42C#cv=@NRf_6vO395WMx&*xDgU*JX*S`=oElED#nQNqW5Qd%XoeCN zk~(DlZ(#;u-ozHS5hjWz9eFJZZbNG!U>AMxsOFaOobjmEjJZ!obIIt;0h`(8KaXm4 zdc0^x12*}I|Dic?5yGL)Hbe6oNCPm?oU33_On^5i6?x)6h2X9Cw>BE^Xs;kRgVaL9 z4i866rim712Ph}}q0{WaO=9R;SB*tXhr}RKzM#>&k7?RtQV7 zv}8=LQ>=uLZdx*?^i&R*xAKjyP}=a>um+ zNJ|Tc{E;T5Q;(-^B+@faXyfGaYLq`r>rD?osl6?)gvrZu+S3%?OM6|u>t76@N+fw@ zsL?>mqMYYtE!_C^^1rmxl0P+E1<`6s`bV&2ct(51wks4=Q>K+qwvH+;e@3e*$)mwM zkJMW5YbEN@Tl<&%R|sonrF=^~>F0skYRGhlysoX1E{ew`{*cdefL211%09}=4fv)% zul-AUk5?k8J1|`-wTZN z6@R5u?`ZGH%l&DHbfX=mZ->Bc?Yr7I#Hv@`!|Z%Q*-1driW8V_AmytwyU>95wP*d8 z%MfWYoVv2v7D+wgceWH4;6oHvqnSSZx=-Yx2h{t zaa4mRkPo%N$OQ@)L$7_LrO78GDjgCOL)|{p9-9#c_^r0;85)gc}xJq zCr!R>5zk%5^Nc_Ljhnl?VVW+F6hEOLAhM0&&)$^Dpe@)H+n54If=BH|C3ly_7k-(Q zCZ&FMCW<~BslAAZbmb$pZvffV3*~XNdX$!ke3O1Z9$$Q6l=hZIzLG>aTWmnM`lq9c zmyOqcmSx$`K-%>MT7PK=Wfy2a$Q8)PsQ0)@+G6Q7-nC+Mt)9fQyTFK%yUSD?(dQuE zJ!w)xzZg3An?01|$y#D)#S|N?FqHB=iR^-y?p|vaOC2VIAWf6$>clT%sBcKHmEM^Q z!g|R@?uRTfLG0>o_g>uj;|8`YA}$8UA>5H{``OunDptkgC^$tsD_{06oXy*AxA#pe zHJS?U3-`#(A8?Pl`If@+HW?7C=1$eB2TxgLRnCBE%8!Q*LA&8m(UjaSBmj36KkR4M z(Vmx^#ssm=aLy6jyQ9gBaRKbomm)~3f&NY^J{3znN!ucQPp)a&Pv|ux9T9Z*3oTau z)>4Ufy!8c$!#$s8S}T2i_sjb}-$QubpRTBo)YeJm z^hFWwdj`_kBJEviEA^QTWY|m}%?3j{f}}a<=mBz_xfVgK=4c({ySP=EqrC~#(dGc; zvQ+BpY#tR5C?v?vK2+AeQv}VN3*NJgHqX`COQloiX_EwKP667|c^tIzdAz}==ko^N zp09n3cCXLZ-UCbnzTz-#_)2>>d8@y|)Sz()7d|s^ODN>Gc6X?AGj(5})yMb`U7*di zorVfJt|f+ig#l=@khd~;q4vHsl`bsQ8cIux6Tj91BJNufUn$-g59E51{#>M`*r$~zL#Of-xfW}+tjAV)oExbvUTf`=O&?yyJ!7CE{BijM zSJtiKxB@`Z$n(SUsM!0Q`UVQwuCo`d?6V-2eq0O?4pQ_IfIouGUrkmjf__+{HN~tr zmTIqH>IW~?>PVYt`cjP5I9k6H-$v2prCKN3_rWNWPSPRlSlyOs&28{Z;85yOk7v6_ z)0|~mD-7z1Wm=rHk8Uo*k!J+;UanaH&}kYYvgSP%f6X5ZU!#}z&BCOt_?60NIw1uRZQ<2NWHgc zq4?f^3r;;}BpQ0YXEbfu0>eJOeJMjPV{ z3?67XHV(F5746U#$@$gD{obj5v~H*NJVrBamydSPXS=i>Nc(-4b`7UZ3%Kt5?YMHh z^sRP4l8ZNehoieB)A`-nGyc64G>1Dx8k!kk1BcXb7lb&M|2^E{?;Hl9%9-lXlzVW3 zwYX@H_NXN9ixezb%Y9mZd0L7wueSYKsr-vvSav-PXUi-5weRJx4R+0XKqL7tE6rA( zjG%4h)g6?u@wXNOiKU3(4Rs<*QDMvJR<8=3t(wJaL zIX4IThCDk#G!{?q9noBF(Qa>4BHo_%zA@dlf{VppAJP0Jx!@u#`$db6_hx5mVoxy5 zk-pFZgFmQ?bOPU5KK&Q1E0j~(9|h>cssB-}rvDgQJgq!(DuNas)y_z(XyUINE;c0p zYq;W$8E_>Ze-JLXqhxT&46bhY&ft3axYiZ1XsH8AJXjw8Qe^zz0`b zhm+c;7(C_S*l0R`613|N3MkhyrPb7~9DL6h$|=Xr_*wC(a_u;X!_=-n$I>RN9uRyE zdI)TwWo7ngy7-&cSS}n*p5L_>L$9BNXdCkWUifz841NB)_D0RCCoNp9=n149I>V%e zsVF^wi=H4T zbR~j*JRo?tN zLAoc1->UM|WbofG1G=KMO$xFoDO~Qx8tHRUi|2RgZYuNF-8Ac>7HAt|g}~ZFt_u)7 zWCiQh!c%#ErdA6%g>#NoNu>ghUXxPJ|Lm}Auqf3;n-eX1d&<3}IRIW7IivJu0p815 z+Ixxb6Y!K7rMIC2$EPs?@x)fmW9`hn7}U&Idr^V;aw`e;4$AFCRFbG?(DcjTu8xxX z3Ye0k)DsI`MyA|BX7#{Sjk*{Y#mApKP&hd}~*lV!~Uge!@$~%`PoDj0fFoajW zrn&G+L651;HO(UzET+EKv`9V!%?nSxZ;@gnnJVe28y2yA{FvhE(Hk`XnpO<~>|0RL z8(_{)UejWDnU;l~qI76jIInAV=jj`4O{Q`!iXi3C4XSya7iuL65T;IOy*aXj?p^MkGS8M%ohCzd+j8(e#7qRfUJZ#e(=;WfF zBDQ|V71Kwm)>r=a7doM8v0paJ;1- zyyh!Y*O`Dh@axlcbmuRvx}`gFg2!i|IBZtFok}Bb@w_{X zygP0|xZaKIe`}u5lO?(m#_#ABj(Y`w!P`%U}`zss|<7mqi@V~%+IARh8RJWC_-cwRg{ z6OZlUag9Hwr0M`{N>BcG82`J9|NV{qrErNq+Ka~<;xR|kS=V-n$2pN0EAzxwvi>L* z_efdK!sC#vH*Vnz$1P9+_kxCfy%Vd;jLhx*X4uv{up-;}>j|i(Hy)_vs-X<*&1o3B z2ced0_kX)?7{a5L6|9zSwBKLP0GYVsuXki*LN7e^Q#C1qa+CEa8fei2te_MKf6NIl zh+tRHznh4E6(7m?<+Q-Rd=;ix^+ZdSa?4MU!H=-ZR`Z4K_0fsjya*!{AdR>E=xWD7 zFoLt{4td^U`p&AC$kS%fSeyQ&Jb4D4vgu7Rs4;fEzV)c2AZ~Bz9}ua$WY@#kZv?)* z^9Lk3Q;gqv64gC}-@EV|#eTBu4OliXsjjnH6eT;*=cClpp|?jrMo`&nmPo2`UaJvo z*a0)b_6gz(>yd;#uo~TV=mE$%Qshhw(3uCsQ6d9&K~Jz@*2~I`7Mbc_(9!}8gI=}` zl?CYSP-v|9x*T8Wu|QtyI8hJw#yZF_US!DlQ%egLAwT)Xw z;n2c1%3zCWw#ypr8>F+t*6bkt;c7l3T;CiBi&}m+V@23bzCpS~JWj@|I{7yFd7)BK zADs4M!Fpq94&?>wP1ueI^Vej(7lnrKPE4h+D7|^0Vb#hujNT!7A^=1*%qYEWO~XQ! z4UlP=>H|YqrSd(aJVZ~G*Dn@3W0O#QBAd7A5+&I61gBwf3eh#3GXy!0()Cb)bd+j_ z@v)ud9Xcz$S95MSO$pPZ0Yae|yH~DYq6{lgwrLhs8oI?-w3NWvUK1#4=oAAtx(-ev zZtww1oO(cNmN$N&4|ZXsX$;{!x{{=OT!s}U;1nY`pFGKWbEns=(qJ+u+a-o_ff&k@ zExlo+W834UoM?*_dTsfRHdfun&( zuSG?XdH}v7Y_vMuUILjHOFax=SuMAZ!(l z+(#)lnveW8{DO4Bw5;=WP}t3J*2WW~X9&nP3&EFAaFWM3SCvoMD27jmeE5W`mLxvXKY5Xg-PIjP;uHR75{El6 zS$~Wn&o3N#0*{(4ZlGDo`t!&xrRWa>++z=bd)&;Lr5qRFp75s7k`x2nlLoQsb6E?N zM=xP?q!j_RLMhX&H)Rl)SAsbBl&FG{gHv9p(*l3J z5)U8fvtpp1OXch5)l`mE=LL)xd@vrw2VnliR6Ra+#*)hTbCGA_IGtQg_c&K>XDn1| zS~IY(P`cSp-K%j7y5z&4u+YoiLfAhqvju?dvzqR3ZZBbn)KrJKSzlE`KZ(*;jMA<& z{c)h)OKF@X8J)&y=QS@etOwM&E+}SHyzU8BMGvrG6xBOKR$AWucuGyp_f2~McXja* zV@u1cb5>;^9`NO1Rc?x{hJtIDwB;{j-Wt}>8#Da4C5THw4MAM~7R2SYw>`R3gA*5} zCI%H3!ZkT@S%_bpcIDCRbUm6**3|8>EAAQVe69<~$NFwftkrSb`H>!42!6`nC2XW) zT*HLEAguG0aHs?igVKy~CgBUWH7%_L5(r!xj$Yex~ z7SPJt=w3*=?g;%RU#J;k?^0IhQ?+!Ck&}#}>65Ov0dCJs2lf``^TUEaJMl=$w0t^{ zuCs&1=SJS3dipcKznAOj_3@ZekE7xGdYqL$hhJ=9r_t5JpFs*ypYudtuW>CXA$WXTd&puOR2Mc8-tN*i6G_rvnfn2jht`#Czp~wZ! zDJ`%_j1b!tQZjhOeKR;kp7X$z%@tW0R+nUOtUith$Lje|EoBmhKhm^)_rgmkC70uAdUT+}i_XIY-o~g9b9bafLU1Y7%I`Iu(v+_j){+^k7 zE8xecnS4GDX7W+l^uT;<<~8y4oY9QKo70Tb=w;0W7qE?wFtu*Z_ofm7YaV_9i^ewR zXO$fWR6Bi8UBwq5bZ84bUd~%uX&ZU71wV;=-GYDrwuN5J&bj2>G8a@tlBK0yjZO9* zG1+^~Ix*RM87LW4&=Rke;YSe#ZBAj zAIj1*wDKW+10Dm~=`}b8mdb@aYBOGaNjuQ^?o$=L7FE?l0d7C{rT^d2zyI+3L}2xdTUl$9HwAQBkGb<;gEOubrn(_ezDXHGYLFdh-z z^;c2NN8R;__!ZnkZ)Z5_hrPYsF!d@D%D)!ncQFew?gSWn{ccPWVo3>=K)d0ghL?o3 z*XKR-RO<^Ej?*+LTQ|G{WnXkA(&Zj{ynWL(f995l!m{=5uBhZBp9@q2nxc#_3l~d}= zQ=ib|idQ_LzsBY=zL)-JP?l0*01fMzTs?ut_5#7pqHlWf)~-QGxW)VkN_a|-MQW3$ z^tVvq*H2-JzoN3I^tzbHJ5TAY@vG(2K#}?M-qU&}9?PHB=gI##i=X_LzD|>tx7%>4Z)_<<9R(9>4Tov*8{FvFX&sPZFKGhEbT06`l6l{yn2j7`EIAI zsFHIiO?(kVq$f&`BG=lmDB9aePmLKZl=87(A*(7W-xem}UJ|+mFM>{Nrv@+SOe3Pl zOS%V6k;nPd%0<(oAZQ-Xi@}k_cz;BxemshnyaXnsk1_!_jIG=dMILxb55`jY^(8Eo zO4f6%>Uu9jKq0K>`o669wDTTK@+WuePa=!Ie_8LqMk@SO-6lm(n+o$jwm{?%tPW-M zW;^?dn9+K4pZ&k?@Iyc({t+75$`Ru?7E^FA!jJI9gb!{xK{NaZ9Uw;bgdVGIiUpLy=pCfLY z0s1!}J~syFxQoRt*+Bguex4erhqIsRApI<+`Pg9n36O$@L-c+~oH0cIh~xT9h9J@O z&l`FY^>_mUHJ&A%zC!|UewII7o#Tn1J8$Uk@`OT>P(0yHeLkzd@!P!qgm?7q(gHg1 zj^5b1pt>>_({u>eB6Z)@M~b4xolZIf^aex2I9me<;VNrT*kuhkNOXL-pI} z?f6_S8$6r~ULi|a0Zp){aEFd{bdc! z?sz?#vhwxO(uU%n^Y!);auxfNQs;3vE*%a?aREP^bIczM*E{2Yy}@v~!MwvUdkTxP zQLGxKt#@*`J_IGQN9gTQ&t{|X;yX_!Qt1etDM%d~0W$p*IX}TR3I7M_pXlH6`Fu`` z^;e4KQRpcBcZ|yHxw>1%&#QCv&hU7y|AMrlJI!M$Ym7bFdL$!U$~apDMU2xA zA?@5ay%tMzO~5kkL$i}gVrcoQk#^ZRfGW-u{W$7!T4j1$uk=DvYTvWg{p9liJ*Z zps+)qNIF=c|1KX4gWJ?@5#px#;3WMo|7poeVV;zMefH#M`ggAP4TBMXZVkn5K6rl@ zBJeiruX{2!DcHSE#uy;2{Pgv@7&uLb!eO|* z&NP&bvz=*r0bk$M@%QGXV7OS>Vgz=v#!Y)?hg{tBn*@7xxea{f>q_37o(su}uv zd6!ezsXH6rtVRcC>VfjPt@P_meS&<-!_>_>)5=*`q+B1;P2Uvi+0tcd*yt5FCoGw0 zp|&*rLOQ>U*tVuWoou63!M7_MXi%R2B}iof(=LO&^Oap0QY0 zS^JZgf@3VEjZ5{h@e51tp9X9niSSPiHb5qZMGx4j>4SRVx%~@;#Kf%TTl|Eug`JVj_l#}mv(ohQoV-%fPT)V z2t|z?V{{QWy~JHPdS7)W-I^~QmBM6@P5kvJ(ROHrxljS%(Xc&nWf0W z4aRse@y3cV3fwQ%%2g|1pXA3ZDHWcXrBRr(eGPK119*I-dQkGZoH|*Bv8F~mC=J_< z{0-+nJd;=F-D?P_6rd%3u29AsZ+^_7C~&oOFXe2|Bg0r{So_czvpN@AX{BRXB<)|9 z6M!vcW%qh9bO}Ht@bSwwT{?JCl=X>9ep^%xS|l+pa&FW|$kX;w{!+M6nzoM*tH+j- zD6ii~t{eW)@W1+-&9+{Aa4oui*9T5 zWw;p@+1oSj3rOL)vlXY;O4C?%BMhjx9ilQqK(*}75CbZ1Y2X||$y)&x|C()vGxqgt zHy<4uxK+0W?&gC7s9?RwpqhomMx(+NpHBjYypr(lqww6>rrN5n#x-KRx!#PjMvS+# zO|JvWl)ep+@T6=70Z5q8&{uA}D96=kl<}h6)g5O4<%s{&6Wrcv~+lT>D1hnX;AY z_xI{FN2PE{;qh#h(*FHppq$1KoM)J9@?B+usKh}ngL+FQ1LLY3eTUdG`t_G+eWQiHAuNFYTdRI z!+tE*^kC$zit7c5OxcPNh}8#R0bOn0J|&pPG*t?=Ga@kEHC+&@kbn7&MSp~TL{-!kyFf`3iN+YJ6z3vUI$f947gI$AuR+wJ#^GLI)F zB5^%`V~+4t{uYV1B|Ia$L>SGh3C7!g{*|5I%lR9&A!QrShh|wP82Cy#A1o&ijH;CL z!9uSQv=8Xeyd}p_&7~MIPQ7E*imxu7JzHsY|6Jz5+Y$Ii5sFmF+sVmrx9>2Q0SOV2EtUOzMCdX~$~Rn;xJQqR z=V{r>cMlYu%v+_`_h79~=1l_D-6S2LfEQug>t2`ar;D5CKE*@&TeKRjTj zFaj*;1A0~l+%~s5~fxb#s z@Jd1s@!ZM^UI{JVhe`O;MKhK5aq&DY8$Pz~AFoYf66)_~`?om>hefxJh}M5~DMx(e z#59PYaSAVyt^DHqY;5ACyxMT(r~s+dtof*zhs*mh4@X_z$YXT6P8)0JchQ5>Vhs&GfHky^X0oC@Dcc+H##i*Fn1d?^bcgMx zD0hdITT68gq8v}kMo1fPmkgN4lP3!>e|%842aexmEcWvP=H*Cix+WG;e!Zo{K!~t4 z3eTVI4O!y@rifSSx+uC)WLA5TSNo_4I^$d(t6aLjVxb79@DkZxT{xp+@K-_^4m*L9 zZ4_6iKmU<5Cb!*+vByh64cOyh}cH#o*KvfZG9zp>q*l;>kx z7(@=ZliHL4tFl356kq#$9)=q!uJP;LumXd`~Z@TUt*ek z2fOj8T^#Ht<4qjwj23aQTe6QXlKQ&1l$(1f_XoYU?WQ=6F8cx4xPyNEL65J_ld=`v0N8iDyJ(y`5gTd` z#s7%Qh;H;09xYhyY@CFcLQ;5On05+>3*!p?Fm~8Oa%D_K7uHk$m|;ng5+cFyO>aF; zhkQT#%a2xGKMsFshxEwYbs^AR6eW#wsDv;sz5?0!<^60doE66T)1oXf-u(GV)W(O6 z!D?kWF-wNtBZn1HOmH~0F<5VVVWqi;m}ri+9O8n{lZSLq0zYkLL(fsP>pP*2-v|G+ zDQQ%(IXIAV2Smh8J^M-s4f+Y!UeM3<3J7lUj`{=y_~sQ57&B5yK(GS_Di9DD^I}Md zeRy;cl?gmj@h0%7!Yd%Sc#nYKp$cRXVgXi6ys=`Kr3VEBJac8NSugs)B?V%#gropd zWb;k|8&^|Oz%zLdw?0%d=STL=k0~jrFeC*WJcc~~RZ_qQ(tGgr%>zo`D=A2zF7dyI zIY#_ay;DNa?^Y_?`|u+W`C!n5XKV88Iz6zuFK{4T$$ zEWt1sd_8|-!C$xoBJj^>m4);IL(bnA#jIGv(!f8n%q*X=s)WFSk7@P;qDC}Al7Gh$ zY)P>3&-g{RS;g=(p`EH-eHf6&)xI=_wlsHmp#*X-kNVB<|PYBntX>-f5SyX&n zKTDl2=vZ^3Qp zqU2cWeZW74zCNkrCP+nc=>}RkqHZ=L6aPphKr5~J)wqwGRoS?V`#Oq`7;WK;IF@e$B`W1}fgHu6sP<&~Ei?eMfJ+8JS# zz4(oQ@!~hW{;e>|^0X?-9{WbLn`g9}SE=3QMp>R#McE3Y?0RegOnkR~y|3M3qbyIW zqU^%;qTLk+%quFvd`C!Z<9S*YWs8h<3ygLPDz%#zD&~`?RZ%u?J(aZ_+ma67{_JV& zeEA~}RFjt+CYP>Hl8+d$91*Z6A>(UE1}HqKit2V7pv*9e&ZyLlyGB`_Rz=zIM%kT4 z*`1Zj-sWXv<5*G^Mb{WbZx@S^zg_Gb`Ft?~HlAiIykarfsxe?{r2$)GOcYP6qN&ry zM2$9}99;>@)kayKRz=yHM%i+s-SSH9t_`P#b34Swv7{=BmKsI(8%6h5D!R^SmZw!w zc9T(do>6vQrLyadvOKMdvXj@dy}t#`zYc}EkyBNDJe7~#Ws#3nr?R!UHeMqJ{0K;< zdBIR(7bwTms;F}J8Zr7ijj}r{mE8k}U*YW`m#lge))+-s7)4i9Dq1E8Y&=h^qS+$c zT(h3Ma8n;7&o|7N;c6n1@}7@qMHz87!ow{_=oFdX<@z~i22xq#tQhY9hg)3V_={iZ zW#3}=tXt{LTl%EvNXA=R;J199JIGzFCZb0Cjp9AY zH5bC_*ALb3LI?wUx)REgVTG8?pc^CqZNzv_nrH82;%V z?_HYjPyJn1x5(c6$Qz_k?;}ilB*umI&b<>r=|;&-Gm838Y;K|zMhOrLThg_f8inO5 za-iR<Fc`2F^g%^D=D^O_}t_J%2+Dsiwx{kJ-*4La5^b=1S}3AETRT zDX&pZ6H0t3Gz^aoz$2;=7F;t+OSFIKgpFXLd4b~Ll@%;#_Gz@qz8sr?&Tmim04d;oF$)PYf5W*TjMiAAWgn*uX9&L2B0$!zVGc%Wi~LP+xoS1 zH7bUx9XG+THCy`l1VW4`$O-hCpfFqSf?zH@4p$Lbo{2=Y{y`b-oOwby041T+AX;ii z&0?f?fOxW(U(nI67^$5mIlnwc>ZS3Yy;vW|b4X2~u6JqS6oQW#i)myXDb|&{6~JW~ z|ISvFJ+31)j8C$Mr&aC_$PJVfY2g%vkD@=7wDmyz4L(PHpQC?Ljk*%pd?>N5#Dn~^ z>q@bn*=L=s%XXWroWXuyT`3|02Vm`@lqCOu9ln7*I8@Q-k>URZmDQE%xb8UXWI!=3 zOWG6gYSxoNaMQl^Fq^)htgl7|Q0Xf*>(kv;kKO5bJt;zun*axMi%Rju6<-W8sz}62 z(b_{%l(m&{CLhUHvzhwGN-edh-8H)4v6;S(m3nK&knOXJW~y6XYUwf(ukTC66@ZX@ zSYO(U7kDX7U{;KD<<&9^O^lNox_+y{S=e?zXltUvIH?8Dk7aREGUv@KJao+Lh3w#) zq8_v}lHjkOIqgSZHHr`@sB+!gjf7b&AIuc0=1EDJ5CPq>GnAeKvm-0bu`Mf4LeS@O<_xmzjZq(e`PwDtvQ9xz0)ik)Z&nz>l( zimp#6^L#22O4ap=^GQW5qhTMI}vj0b==v;G9D!b_N^S}J=< z{CKjZ@}rybqkC&93j0^$X^#NZeOHWKz|}0{+oSfLPhGtZs8UZ#%Lh5t%+}Iw+{fBR z`Uv9zVG>;{oTi<4Gc-F9)8i6(CQ4!2xtMm>AVVsaO77G?5%Upjc!?4S0&G@O4Dxd) zh1~R`(H376I=BTL=3b&?z`kCQh;2Z7`3$9w>>NsoZ6#ON%V&fVm{qe$y@-_vC_DT} z+<5|0Y~kG!C#6vFsZ>9$A&WM&l`Psqcgh-{$=N_7PdbCKrM#`wUONi`)JOeI^maRm zv)0aPC%vXEKt5$VsVo1i`Lgmk?q%r=AY8A$A|1qscYE=1roFV@Whj&iA4;3^j-QW8 z4rukWY79?NMWllir0GSwJ4nHrUis(w2WaCSyow zN*lo!mDNKEp<^AT=IRysp`9eF2CQoEjj`8#Gna1?HG7I6VZ*3~JEX|3qaG`=6liU*IRn8rjQji*=-3y&%t^{hlH>58i07MtA-2T`N zP;n?{>Nwrq{#c(s=S``x22yn2TT(g=F3jL+K;F+Ag0veiQ_Aw6ThYS3O-(d9xuSzD zy=}C{g;u^T`D3!BPOhs7)~uw{Z%YGh?Z<{`;;AU_?-*L#3p2d(=fYmnUydHv^^wXk z8w+klD?4k-pxwxXIPutr68lPnV|afGl5^{nH2!I^YCD8@V!Pc@678uMKUtpXt{HqL z*}E$r-E~#-{Jgt!jnBIQ1E4>j$OnI+pGNzOh9bR6O!+MaL9*D}mJeCW<{i$e-^rQIhY|9!Gg>q#F-Y=-qrO87pxtuj&!CQ*pVgB44`zSj&uiIS|HLPh0{;y4p+@5+gZ}6m zi!}tAK!@?reAm)D<0Xr}a7~2O6~{`u&ocR-mZVyE1Uvd#+CE-t05<09If$Jqd;nGVEO`q@nWk{tnsD+ws?%j=y?1{_5&z&X-!C z^TpB~I>OPC{BK8K^VMDeHoYe}O#?s7@*q-ee{}<4Zup#g;H?n&UO8aGEratJ*Vuj;l+A_lh8mT?2Zb92;ORKfhF*IDhy!(k%&mnE-%TJ~Cl(0bR zsL#v>Y!~SnvlmExP3jk=gyoYnu2vm>dAvZ1Hz*rLEo>CdV~5vucA^jFNV7Q#o=-u* zW+UcGn*ffjHvOB;6QgRpQ4tK6LI2u4L!y)c1!uH3pe!i$4d_P@_y~hW*4py197J zI~B~6u4GD~+DFfwy|aM&WmTU2<)+jsXKR*Hp5K%}8of~Jq|Gg$`JYvunRA2r(#Q(t zs@xYE?=!7fcYyXTl!~COp;Wj9N_XN&S9jX92o1iZQOtB#o?-x{ZS*WDnc6KDMlUSY zP};g!(y0t`JSvRso*So`8|cVlsTX~pEge^soDkaB13I@V75EOFpRoi69~8nq7siH> z+cK%bKKZA4OjX&9F(sbmI|jjT>T(#e`^dOL`kXURi&(-}4o4ukr=L*)b&3DUJ?+4+ z@;m&4|L!2jAGrT+-b!f@#hZj*K=|a|wn-B(luanJv3r~zA>S}#N0v%W-eXLnTX|E^vQQy@N3EdUX*QV9biLl%Agp$TJOA>+8 z+!aW#eJ%~vT&8WGLn;1(Qonx_JiVz`Txh`;(kktusvOUg)<`!sZ_$9Y(kn<;GoJAT zI4-}XC+XHnJ8|E=>!gn8VxzVQ>}l>xT_|!rtn?&GUJvJ6PqMoD`{gfRk0IgbZoq!~ zHQm`D?V=+eJnHBsRL6rQ(UjMk_0w)~<1P-BT6)n&sh@VU@U5svT5ghtXt#(XO{wI9 zvz|&eNnq8Z{+p%WwSR;u{t;w!_~++tf#QU8Xu7*qs_%SLW2G%;UJXG_b*1k(m$;ji zGR7|RqmA#c_M>;V!Qf1`rM3!1e%+`h&DxOnc8O=6sKIA1H9g5)0Y*b1O`;~-C0;=i z5ze@W{xo$vOfTq`+a*iH%yU{!SEX$xisF?2pskB<#spDm;2uo*Z4-k`)T(uo2QH}C zF1-ZWF*n*a@--9nn-$cW7JMZP^krW`mq0Dl$X^wAR?$~de_Rm1LkiOV_!o8FAw@$c za|7L8UZc-Vwo85MLrt#W#OSsi@JA%mmK{=G+`#8+DHz(Bs?c~l-bAU2!Yi8?72CYm z*KpxnrTnj@*FZlHg-&lhwww;^loE958kFbTdgj&O0C%fE3kzy@H#=b1 zBl}YiGrjVy)DPVfO2)D+a3_TOTHOUUnDe8M&EuZZB@w%%CaCzSVt_qS@iXO+)QINq zf)^9iQrG7A)24B?k<5Afepl2&jC5H1p}QrXY!OBAZk_yW3kF6&^H1L`)yA=!;u!7S zEpcLppLR>Z2plN?UkBpN@>Vm%<+ZvF+N=P zqrQzbma;rP2YnAes}#K5;%CD?si(GdBMsXpjYIcc-6yRP-FMU8eVO~En)Sxov9p+W zFp$;mtJw@R+~~-eUt5r7!~Z%Z)0O>F7q~*|7r<7YrJ=O)nr3?QkW`oE7l=+ky)G-> zNr@2Ei;JT|u}}o^Q>iV`m2BTh^`;H7 z<2>zS`kx}(T?K!tSw$QJX^$FsKi>p{*aS#GJ$5 zrw>W9kfwOliAD~*7fF*2OSO>%ZHIee3Ke2%UOp`G#Q)z8OHDD?kjs$`-(36=sR!CU z>xh)5zpBA|p8|Q=$s|96g2EJ-5R^PLYyh@Zs;7>T$sO2B(PK&-30zhL#h~Lc#7R2+ z;zcWtO8WN(S&N^0%l~1}6nLguQ^I&LO5-K3evr6|`~{Fax<=vNE=(&J(n{yZ+#MQ4V7FNHhL)C5!E2c!J*yM8a3v=E;2 z7d8x}4^P5_)rIz)6p~jp_3P*tw~ ztjKjgMXsOuLHpE6DKM{2XC*s^=N@i7C7$GJf06*Th&?3!mBD5}BBj^F6Y&88?9 z1nIuuw8U#GZ$2%xgc$UoWZzHyY0Jh1dUvHL7;h#v1o)PVgwUQ@B!u?qB59fPTX1dl zJ0r!=<|V6KX-P4}(=|F(EX{|&>2pT<5+@k>3I1d`D=o*ty=SFqTqw2vLHdphJMB3s zT6fM1=_Nw?wmt`!=a1C;94xbIwEP@w{@HYze_SK&d5rIDiaU?K-%owdOUXF683%ct zh-9x;{&fF5wy|sEae<$h-}C~s1)Q0FQ5uE4ru3o|quZc^Am-a&_Uv6X)Y(maf0W!j z)S0d4^ruhT_|dYrAmZoamv;u)GcoKE@_(4uN}h%)jMO|0byNRmVWebiU{Y87D76ri zddod(^Ai^TOd9YL{3lyz&QB2OGijsp?c7gNU7_jbt`Dd1OOk74>+6eYMB#C$xoe0U z!&@JxNH#ZBzW)!c7fh@6McKe{Y4tU!=%nr{|0-I)_flo+pI#DD(sCId{r!}5S*iso z*+dlSr8$=+cR29%))y#sQVFyo{OZG{>v@g!_M$Kp4Sb!hUY4S?2M?3>3U;(d6n_Qr z7xrB!qS9~R!UV-BgYfgzD^j4i7dDofulOzA(!+(mx*|o0`(3EKU&$5R@98npU6mT> z9%-y7Re#nk)a-5*$pscpYI?IEM7{k>lsWpKAu zE7JIe1ySOMExf4Ws+5E!)S9eQEI~BvniL+EWM@CM6B{=yYW${KqG0pMLR zt?A@1RrN@F32*NzdgNcfNW3hWX5Io6EWRP})W(RDbr8v4{1+|00Vf_<3vLK8;0EPB z&7XXKl{$cNQ!Ptac}u1CE+m6Jkar()Zwna`X4fy&mGocbmb|S>1zlB! zggY+%w^it^kU;aoNMU!>Re1d(^|>QtNctVAsp}Rkx-p7M@4(rA`VQid+vxTkDG@@Y z{$02Zx6#nMFwfqi`u7l->q2wyNee{J*CFefRR8>@_o1W0wN+Erd@|!%6 zUgfUdDSt{U@HO}^$y+0?YC!3KN&(dNp)?&sa`>V26~arC9%19aX$Swtu8ON3N>U!a zW-~k=UyEh_6<`+F{axt&C*qrbnLtgPER$yAQtDZbTlA#da_J7vnO7mL@kp|&3ZFkU z3}?aaLbWrD;0tr>OcTxbV7`l|v;N*i&gcL&=cfi){aGk^X;=--EsD^v=14?)Q^S76 zOl3?ra1uSmn;v;fzimELJxHnKUTH)7MPzhBIhU9&Dhdh%}z8 zB^uS*lf4Mn(L_(tsJ>pJQFaZ>Pia&=Z>3Q$`-n!}@=+S~hp%YVd;|L#jY=~zK`ybZ z2I~YNe33@~P}{`YbP>%t=O>yo)x=_*M?kwN{X98PX-$zywB`kW(V8@WwB{Op=`UK7 z6(FA1)XWfT>OvC&#n+G^CLlJJVDb2a!R#meXbTbF+J&-C7`O$Y>>dtI4P$H23(?^$ z7T}kZaP~1?{Ks(dsDKFEHHqGgz;9boN zv9P*0XSs#RxOa9W%fae>MAsMB@uLn=Y%bR`&PCyzqf`;alEJiszT%r{J68V#gY%tY{Xz!>Y_BP2 zt;_sEt5|A^df{#TRCy-4VRYTfZrENI^I#_3sLKXm=5(mXT8Q_>M$RcAoPeNMP>*pw z;G%kLtk`_8^MFGZ{7EUXEYk9gCKx2Z&&X9!mJ2%IY1q4F(r2-(0Ul5oi~aUTx)Y1Z zxSs;+vj*I>aJQ0%tX?pu`qyUxFvOPN>!nnXbk%3!__|d6`W?Qa4cF_l7jP8RzT%|% zapI)q>ep0!#YyRLjJvWn$BDUoF^<*8V$HQ>?W%_@D69coODukuCn zEw9&QCBd9h(UQ&4epHhe{pwA(TCuU(=`|Jl6ojjLp`?eV4NF1|D~nT{lb7c_N*QX5 zq|t3Kj6hwqe_EgVPfD&qf3;!DP||IFBJ0T!kf?DNgv_PQ#T;o5*XxNd?SIYQSWE?F z9_=X6rbWx{l>zewm2Cz zPTYGe=043@)X|q7zRdpMZO!OjGmLyIes!^zZrr-x5Ji?%-uh|($0n-ium8D;BUC;i zooW&zg&EEo2qF!y_^f(FVOei&&p@8UOU%4!am9cwt%WeQb@uGzPM&}OR>i&U`8fYn z2lggcLjVk*_;VG0)cQ3R^2Y6k34IxgHh3f+w+1L?h z&pc|c|LSBdKSIqrvL{z00o=i=r`7H=20fbCRd~r`Ei7;G_MTl>kniTB%3V0)+4`ek=SpV5l+=Zp z(aOPHL@W1qVQ=7;CZ%naw-m)tL=|N%v}$q7*OJk&lXtnZIl+nF^5|Uv8^kNGP8K(N znk-)V^{(s{j^5IuIvK7sQG@w0`lY3s@EU^C0WQ`__8P=qIVq!H+UQcS(<2^LaYu%0 zHib<_0}E3a$2I+(f?fXz1$Bd#l|-$Tk8LM){xq>0dl!3tBwg#yYMP^XA0RCbPS?tJ zv3Qa3_wyzfFC4B(eGgUyqI8M^2=jo0qjz_fj+Nni#6}J z8io&1)FjeN3;1IX=7AsQ;751<!QK#Wg3J@{>~06J`& zJG2%xsz2D3hV^6yJ%7ajfEuRtWD)uqsFm6bU%u$c;$9kWr$hM926#BCN9z%)QpBr^ ztzo(bgMEKCoZ+!=Fd(_8KV^Lv-KnlUj7& zi?nT=s~lR61Np6^-`- z6P1Jv)hSnR=!L5=xgJ+{1nMmiA}DcAg>S=DYTt($ybDT{%Xty+ ztyIyMMb%Ip0o-qF6tG(lihm7v+R#TdXY_mgWwP(R13+kRh@sp+6q&&*uP+1b=aSwm zoLY5|P{y9$fco_n;<)(p$AQjxK1I|WF0KS55DoCzsCEEv!18O^{jgZI)S#cZrjci7 z_06;Tu||gdqNk%gxk%Ppcji%XKg=FLPL;FojS{`wzdvO6TJ^QOd80~bWq+kxeQusJ zQ=Bo>&DQr}n8s}M5Ua*TEyBo!hAEZx*UfOT22%XDADV)zfYz|sphh>-3Z%f+HMGEI zn7angMG3+{XTPfz_-4Le&AzLp{XGYVQNjRb!b@}> zAYOUV02b?C^*rF0Il<=ayY#~V2uUr;16U`>bk+G__usfE{sqi^Cm<0w)1ZN@u692F z)2pWi(Yk>w47%>&fvlE-5ssv+=^)yhOj_L19=FG5Mnrcvl&Y`awvrz42GS?af(-nGq52zskA;Mip89QZ;dc1zLB3L^eLLx{`4BLv+o>x^a ze*`{`5YNoIIeCXQbt&^iLVWfM30}1C`jdtfH5?-?G#)cqMl*MMWB4=j!->m}al=_- zE&(d8pelL6@T&47Yd~G~!q|785gkrkbiDR1dx2kQ9d^}3kH$)Mz*dS~4N)eC{J8!u zmPVz(aN+_ZVubR%m3?ob3i=5CJVjWD#hS9Mxe4&O6dffGXKr-<(ik5Dcm^Co0~5Z4 z{u-e?IpzCHW=edoij>G1*&3i*@vdLKhbI4_$_lPu{Q3viFHkl6J;o9AW$#sri9m>n zek0M=gQ{@w#ra=fqZK2C(r{+vbJC$a9Eyc_%Il->6h%&ODFL>dJbHhW&|=n%5?664 zArvwWsAGW?J(`)ShzsNclu(D!$_urAX{ebNjb^-Fj@ec?MXNE&#`$)-fzl6+RP{U&bmwTp9z{&}`DZ z&tAigy1Xy$_Z~jDP>ZC3&F`CnxAL3(-|rjjt7u_d#DL7fFq@2H)xNAr*V7PSX*U)+ zk8@oq0oV8L8$Xi-T{^y$b65D@!m{sfl5rQ8Jj zO&al^A>}5r{ zaojMO#a5AZSux2bFFZvdEaHk!`D9gLRm5HaJ^12j0Ck$e+#wTRpTgqA)w?%A+S#n1 zXf**|E{IJFlYw8p31@h5bx24)@D&NM>7mdQL6Zs%T0@IVK;ymlL*}xfymfD$Dgrur@;xkdbBS)dl1_ z9D{%qmtCZcc`zwdNcF{XDsCiO%}2|RRTHaai1VD9#y-GA(tPsB>}-W)H6UFPT$-`J z1=8kp=na!7)qNqzFViuZ=22t@TcO=iMj1L;Rq%r8`UciE>>{iFfJHclX5IFuZP)Y( zRCMpBM9Op?;zC~2v4T{Y-F7;r_j9ZKo#`xIS>V`C-kOJM+ONk%d#Wi30&aqQ1b^~; zG}x1l-5BD-B{bxCAjQs5S{w!QW5f)YqT48U2Aiz?89?HQ=4NW)8R|>zW{Q*2X0rCK zf9o&~ZniAF22$wT87zWIXR>zu{K$d7gIsv{3oaBVy^92tnQ~1^pT*pO_4A;S4F`wN znpvza{rrM4fO46qj#ds$@F8gy*4AoD`IyZ^w_f|0y@U_L;h}XvO)S^pgtmoepVZ=? zn&{^BsnP8+uF*L`qboc-G>Y!ch9`4I0l9sGc`wXCBNfkPP5H63PlQgrt-(_>UHgQE zRgno!TqbyYD&%;ZPuU>!ZSj$zC};X9Yme39JO?X1iQbsQ(z(o~(Y`Mtp=u6n+9YzD z%j$Y@W#7&zNZaN@fF~`}={W=|Xm<0QwJZJG^Pk+jpD=fSx6!bj7)&{6hn=%WDi`l84iSadrJ2lf3B9d9}$9B)e#T_`Aw13gTZeQ(IHI>5wk! z0!QCl5B^h5!O0Snfa6aWOv>SHR|47FmAUdfk3yG&M#|ME^Ii-n-& zmC+xhruYFO3Pt1VOlHt-+(Sn)MaP$AvKZZcJ#h6`mtvDLWMeY*&SGvrtf_n$*qDTB zjQlwvO1Slrp7o6OAk2+@S?mQq`Z~-sW6u}-$n!Ji!*A_bd24qsq5mO#XuDr0PNQn{ zU3!3A7mW+@`Ri-DUq)-a^EG|_nf;bN;+DQ@iVgZk3(fRC85c4uTB`a})!CM=E=9 z<|3}H?X_=jTI=IIw0e=fwE;>8lrCaE;Kr(0Btjn6#p->6s@!MFV%+D-O2zQvrp)=3 zv}~~$nbV7vCWSbfR2#3V@?BQGssOX`sv+5{kc?G1#J{cNLtKY8Wiu~jSi+S)R0_)S zU;x+d@6+{c(T5g?8lsMNq!?{(rnM&Qe@}i;N`aZt$cN(ZC=U);(OPf(K%bIm@_tg9 zTvIeTdkL!z>qI5GtZcD@pg@Z;Ridl(#r%cn3tL|0P%X&gL#0kC7#4gEpIRbx%JL;F zl27r-rP%M0g0vK)T)A|#eCbSEYQMCuG8`wCis87lR18PhGIcoWQ~ao>AVpt>`L}wH z-GX+uuGmB4m)UO-=Xg4j?DZvKF|JmnXf4l4QE?QNZ>V^C_(Ji?LBkf`u3XdeZu2$G z{aqP3LJ2*V!@n0&hxN9FQiE#M zqpoY2TMNN>3FSj|58=F~%KY#Mw&+v_C|9deJlDm#^4kdO?@os9IIS7w9mLl6(F(}v z$&|AKUZski5!P^cl?qp2=r+-V6|BJv$rphKx2&9NmW3SWi58#Llo(8x#9sa0$+)Z`advyrZ2aMDR9GPar%K>Johxf)5O ztJ%Bwx%cPruG#2=&*8npX?LTzFIb!~;BPGA2K+g) zdTULz8+dvAIMe=PZaM$)0#|cQUal(2PpHaQzF_S=Htvc*JkZJTaZRe|)zse`MutkM z$hF<%HLU)Bub&NTm|xU@=Xe(3TK=a66!z=_Qm7c!6?7T>@rmxaC1iAXR)?)+k#0M8 zM}UwMiy&()I&Cr?#6kV^JrPzjj@?m?MXX~Dn~t~stWFKE11ip<=i2kHD`V?A7y?PO zYaIq+0$o_gB3<}o|CO%ybvNv?tj|5k3L)vA(}}m*0T_<@$AAU zSM_z)-zjxkwxa5f_w7SnH?VN+)`xZl$lCIHum+X%ps7dYKCG_v{P34hdK9zZPs(i| z`@5u{<7tMf3x!(<8r18<4Z_MERKLMi9D^n<`BB=;4yY)xk$nzXUw9MVkUJY8t+T2` zaXvjtew!3i9bvx!>bHq;FU_`1j3d_#n=u``P@Bzsn{Y&muuUwd4>z-T?Phn>DJT!1 z!#Dw_7skZ+k;fK7{ubum;+PIo^)=&l z6N9Mqt^0x0@{17eHbNTVTJ5d-_JJ3PaQDTyX)oTV_%i0_c3%wDGK)>qxu&KO1?RJm z(BX*a32)55x<#7c$;O>Fo;k@s#E0~@h$(`LV%(NTbLrR)|bPTS2|`d+=Ej5Y0hZTVt~A7s?PFeOS?kM#1GUim zBexIsb3w`-W|!N3)&sc$efF~!A}Hcdnj^^O*|J}CiQ48GF>4C;vyhxrglZ6t#dKl& z;T@Yzu>}Z^?WdjvcIQbjkex$Jw5Wjf!fYxn5FVJ93xx+}V<9GyjgAyzf$gWi3x(gM z!FTpcBXc78UV5)E!J8(1$GYMAli#U+7I=ylA$_IM0Ws019$+J|9<)#ii@#$nDfS>H z`$&pk)C2p`HBdo*`u<}-8h#Msb2cqMX!rZnp*)x0{pj>T=7wfmJZSg4)T0xHFlAN* z8u{_YhZrwOUEfx~{INc^{4mUw_77|B>cWeP$JyeICcuQ~5PJ_NHLxWgi{_||!@|^T zdKi$Le())0y#qw4h^fI>5>Hv*qs+`xi&;;n53{BLK0Hoc^ihG3&Q6L`1Ce6YoFE+Py*lf8zJ;P5oZV+(V2|=tkM%q zN8cQSCSDoycIGkfAC9q>T2yC5e&Y0tj z=OVkQmg<}lS54XNLO|`1?dw7Be$RXq#Rh~7XEy<*j;WjdJ%BM?sNj1DX!)w5go9Jm z`tT~1f3LO>fYYu+VJq_%Ha`JdxiWU{%wy+opHNTqa-100s4_C{%p>C>r0s+o1BmY} zG)EUDk6T2*QDV$-sg8GrsY)2!nTNq^oK$+D>q+)D-q4rgPcaDjlfd)93{}1zJkDyl z3ky`JX$?;adn4@>Ya}`vyP4xP_MO5b&ZzI}ie{a-N+qXQW2Jvg%9-^~i(c+^nk8^U zVbN&@yr&M^GtA6}(BghR4S-`Yg%k-{nNkGr$s}4*#5(egNM{XJ&f3^_h=Dwdp^ph0 z9h3-N!E3VQv!MoWQBZ-0i$suaRI!M|e^xAl)%r{tUrD97}mSOj2}Rg3ak*HPc$BkYAX(lT8o;Lp41%L$EVOzwwf~SX$_X^OdkG8aGVdEiu2QDI?C&n10YXdN{R7|%_8|X1c1WCy0vxbl zy`ngyisg3%-2bUxo-yTI99AedEer`yS=P_BYpuhA#Zx_8o zcg~6T3_Fh=TfRTS8Z6FiOr_`0V|~sue;3|kO~jSHirJ{O-g~6bBrQ7+Y+*MlIM3o7 zulc;CI`?VgKnlGeELGKi{%?wHbxXC<#m-+ZfwBTeqt=YWQr&l<3V@-oo54iCUtpg4 z!Ym8?A>HZ81@Uh6FXG*BFqyXXFEQ1CovWY)Dqn5=MHUGo zwX%r7zpLUPMi$1k6R_>*`SOdbX=PpjhEkO>YF>ceFoC-M$Rb_2YF?;V4)p1dP}#fD zS{xTT-KW<%UZMC$_?t7S^hZT4_x_31hIw#EH4hxQ#m`L=u>n=KNz8_Mf4>mtaacqG zghKqm?xTLrXV=?=qF~x1B+iP6Lx@gyf27RF0p9slH2x;Ofa6{E7#cr zX5X&9lkNF~dS7OfxbX?^yajTh7`QvZ!cs>IM)5k@K&wlKkUCle6cy+*K3Cu;hWD~C zDGp^dfFFXt`U-abNt9tK@mn?sx>?C@AeGy61yX4q64F>l#x7_Ulj}`()^pAlV>4|a(!-7|q8m3^gV5`4cFdVF1uY(Gbt0Zx zm0st4c-lW~QG?#N#a=}gLj0@nMen@DA|csbX`2LQ+hOI4O&;#N?Vg+3f*UubWNsa5 z@jH9uQF1!kaEPan=_xPtx<7UK1IX*eB>lmT(1q&*6%&BGr+YCV7+!oFn!SH>YJ3fcX&;z zagQ}q;yw>=Ju^k{RZNi^x2jK(CAX;lH8Dks8YIB#zowvMG$GT3okf}w_OfoX){6Az z{^EXI97%xIAlDc&PD- z>+(EgRKF>?B9c+zO}no%L2s7U9IOXdt}}1Vk?e$Ftx;RB+^jA7&Hf6JpTRKwO?iWY z->Sbs*{|gJ3;Wn7eS;2anZkH9eFNqG0-yzUMa>9rGxB{ObG%P#ad{xM>O925TjA@o z@3Ph#Vw;YSYAm8u9@J=|9HJL~W#dCRW1@9y5r>6a;F7AV)g^#BNtoa}DP1S?5St);xgp*z zYTb?MZ&&h5rQN>#XM3L%&MylFzmgc$xj$FGYUgz-xzF~1Amzb=p}~~Cwak_Fmcj_v zlJ5gpm>>=LYjBrm#;RvR9b36sqw&Z|{8OXjQebppghrVJrFY9jOsUSFtbx!p=D36F z;!hZ-ldu{y_C0AqKmEx(IF|7GevUud^W-g0SB1=Ys2zT1*UjV8XE$~ zqOtT&P6!vxeH`diqQw!c}mCg+S^tMLFo2Et!X zl&b-PY1E%!+Q{sok8&451+n)xdT`UkxeNV-TT*YW3^eVQ6!(g=73R2KkO(qmT_`uJ zmYXkQr5ehXSqEJX3U5*B`etBZkYRhGR+`LS(Sj_??J;{rlSN$~!(IcA+G98tk|@y| zHrj_TrgoyPe!>2>`*UKTkhgilqII{fAy*~i^S!;CL03*`m!hgho48U`YvMKajqxKxlvUVqf`v z-5M7}pdyDGf)?B4i5T-hjm(4ped3-*f`L}Q zEceFtywO=!;`3k3aKZLm;w*DG;ZtW>zzI{cb1guKu9Gl|961Ze$FQ zBk0=c3O5lFE&tjd7y`{|Zo9viSfSU6IUT=nS^!;G+{61{wLKA+*zYFuxCHbbz@@x_ zT>nSiNoae|DET_85*>7ck{{|W2XR_15s_%syq24 zM{+t2+1%wgC~fNQ`EL(?&VT9(r7hb-Zi*FD+G?qp7qOT?DIRh#Xtzdq$gv9O0ZE9J z@!+?!$4)hR-Z~ns2-br?*#}(^0{z4Xy{-RG)yMqCkNMlYzHq6xjwZ~y_aSisM z&LOfJ#xuf4ZZ9NS1w5D^`pECXUlgCE{tD2fIwbRP~|4Wj*|;rBQZ+-&zaXI&}m95xtEvj~HwW$KvD9 zzIdHa-;!`;@!?`MNY4kwM~Trd0h+{t^a#@8tD>%6tUe?=FHne|e8;f>qfBxVhG(=% z4h;T}^|#6-55`91OvS5P!ae0LH^K@`_LsvnbLl;Q*`nPD9>p)O`q5^+>_c1qF}mI8 zTYov$lfQykft;vCK{hL4bsn?u4p3iGtUt11P2#%L0J+kPeBQpYuQ)f_9U#Ws>;Jy& z)TM{t-R_ z>IGu0O`y|}Jp!E(o}>POa%>g33XqW)+R*2SGA|zHL}Nm;xpVHB@y1s%-j~l+AMd&6 z2utu=$_=4VtmdpTDqGK1AC)_2@>49bl?%pgccCwT z87Xt!`BJ3Z+M+Ues&QPMn(hwNsNs<_CZvv12O)aWIZ6)Yjx8;)EmV;&3VOqsAf3f5lwkOGOt38>vZ6xt;6J9MR@RS-Ma^T2K@E!6b64CAa6Rxt6k; zYsn#K`X{yIc4*znTJlTEV|*y<#*;vbi58FP8f|}!fl?ZwTKH9Sg^%)>v(fg)7-^qX z4x~)q3Rh|oBM-o{R>a8d>t52>i?kvdEW8ESZiU*2SOQ4c>^VDlgW1gkkP4xs>~Mh* zSNlIiLrz`U5-Ug|!LYA^dnrH>4G#CxbAiR`{uiB!hF5Y(%#_#chM$gam?}~Ln}T1U z(o&&XC^90DG8RFQC)dGlvFfK9*4mhved~y=S;e~kTMPbSx1jxXGtSz5j(=6)DIOJ|Bep6Go`2 zCt!Kir@Y2>{m3g$c5^$B?g#V%IwmwuOb8V^^MBCQL@(762pga|lB^AtSFjUs=&Yh@ ztkB|4#mT`s__yL|l!qKn9t~sRKfXFxE9WZ z1}9FLc;=*ak83S8X);H16NycUg*`oc3VR-zlWK;h-K+VZ&KhK9ijh*CHEISVE>(17 z&hX$<(9_J*!sothsE;7N?Bikg!kl%dqL&S!WNsoi^8-*MWU_CNq9d&8;_6qGR=Mio3Hw#Tdx)>NthHN&6K2Vd1JPu4&j^fw zcj?B7>i1cMV|e;q(gf9xr;Hg0<-4jPGW=W#QP=ga2^11LAJ?gGA^)fh><3`%~Y| z<;^I!pPx6)zjob?l3L0E*#0tK1sZ;8OW6>ixOD}!tHZ6UtK!z()KX5s1rILv3Zn9s zGWXiR4|KRJBMYwcUT*kNN^2aKuG>}8_35b3Qd$>;)~-nKQ=m1_WU24+F+acR(Z1PYOY53Dq#Pl zw((KOHRyF;dGdX<2`m&W`rG_b&+hdXTJiINuZ(WUMxH@jb8P0b(rWn zM<7lopo1w51_V;CSA>bKZpRMkt8>KRbRrICyw>Dd=%9+FR>eQ?)ZIT5;y*sFtdYNq zx+g0+mptaA1?^&%yN92j0I6cR-@awAHW5FB(F2#8ChFE66KgWiXjvwj+Ftf_$-Nk9 zMK;``tRPz3Ugj9Wg7$KR%fl~>fY@{$H8qHyDu)9)$UH~2=5ssPbFUyY3W1qabqjlr zs!q*O?U$f)q2(Q91Ln@A4svh=a#U4TFQr=$91;v(96A_`^tSs0;qqXb4voA~`V80W~IdsW))feE2La_jM(bU)EU6{_rnj%n?ckt6u zi!&buP}dQ%2Q95zE`sL3l0Ys^1A$pbxCJJmH~^H@ZDi;qPlj`LL5mjysee?N3soTQ zLC4>cW84LK9HKsx=z1r)y@E}0#U25LH?gy9;JA@)o#mN$Zg>hX`u97_JhRZ0q%6L& zt_s}5aI8M?_FZqU3Nl&teKq#I0#FKC@|u&A4|mYop*FZ>-UdB5&3D!S2v?&``@VE+fY z%aL#~=Kt1RuE)uJjIX0#0VsMM{W^(0<{#VW)azK|FcqAwkv0faEaN?I$@OS%Pq_w8 zvh~DC^XRvpiXd>d)~YT3<>bHHmLyMy#ei zZ_9hdcGi%r!`GOo{rbm&w4oPVE<9PYky2yjaxZxheB##Laxyw7tGB9Q3ekkvZ*IEm zPnUZO8RHDR@cqX_{s$Qo(MRTLwh9?`X#3BtP5KA%q9BU7z2OWfar`-131@TpLf87p z9*!7)X&*VlbM7jmwGPCIv$Z*8yar5ITwftF+V{nee?w&G#g8qNAEzrnF7GQePZcBl zZ;gA-6cPC2r+tMfqH>AaO%WHXs5_4(Hi5eI6T14yesVl|GPj?sBwXD&$P?8O?G^I; zUO$;9Y%%<*2>T;klpnAa|J+a$;Bl}rVXJF@xz@kRarCi;zU(i1Mh$Spg#S~Jhdv9a zP{YAWS05(h@P;M@1TOkIIaT&_^mS^g9O-@Rb0d(yqCXKY&UjbnN2^lhK-W!tSsbIR z8UXNiPAqr#I$|?&2O*9gSI;ZMc>sR<50D!nfPF#@VEX$9PH!jWL9gac!tRQ1{`5Oo~BaFCrFlLwtZU@o5!H_$uatW0nl57^88~5KvPRoKM z{Q`1(<`9GqR`Ue3FjQEOjqv0ehsr&)C422{5IQlw3YS&U-s+8*u@}B>`BOY}_b|CN zJ{}K~r{b|`ht37if_H@LvEUuytQh?sgjhGqdG8tJ;`Dnm$A(hIqZuN_Ipz4!?$3ME zW}I+%)AsDPH%*|{b}KF0xVw7GZtNo4yH#7J*(D=xae}LbmHUIL7K*q<&Iozb|J$Z3 z@n)1GRR{5ULzv0mDubB$ZS__j+$jd}6KXU{&PDeXkCJ)%h3ja!X%*ejh3{whFVI?5 zjRiU(fJTp&-S{>+X|$Y(3->K93!HnwDvE@jcRc=kR*~==FOT3_ zwKG6<*Z&^oN15Ycm;X(N$7As3(Ub9VeN8u8U-vrDi4Bpu%5VtCAXGFCinJk9##mEl ziB-I5dbDDI-I->`Rsi#54_Ii0&YSUA^Q_LR`rCxg%ZsJ)@{>9j?gY!LscY<~IM^!v z9nMhOGvbE$8O(~u$okD;f9q-P@_2iq%;8e$6RUV={;9e2(?sFPS92R3a`K;A`dsuz zq21xpn}#1KUMk*3n(_fQZ{d(xydXJ%Y#%_;KD*9nJwa1?Z4RbmABbHuz2Oj(0b?fE zDKVPca*c3}cJcHIqKHZ2jOLSMp1NaEbZ!R%>A8kIC%{El#p|2K!gDEd%HW#;bK4~0 z+`5eq?xLwl4Wo5oo{IBJ(W~PpD|&Ttl+jA_C(BK=W#8D>d`1gY-uOn5On1JizUG&I zlb<&QmIWf)J3mBB4F+Lh{W&Ht4pn?5%GF!P@rstI@_sNVmQ0m7Zza`BmwB&fb_nm7ZkB?+e&$W-kd72e2@S<%M z;J;|{5e987b^1uQ=r7DPTP>J_V?GjAlNutm`>deU+ZRD)^D3<-uKXy>K6=$^@{K`l zI`)xlKqi)oIKrwHzH1i+Uc}WQG(`m#>8fHamCQ?5k%?79yc_kJj;4;F!fnw(GdoGP6gLBN8bjHpNLY z5&Z$Z8LeH_4E#;tE_wQyY}RgupYPHmWC>-L>-m>Zw_gKMZPuy< zm5{Mv5iHN8<-T+@ra}O4GOi*U>q%Ji7%EsObD9C2LNkD67C|LG(43$Tr*f#?dyC~a z=)*-g0>#1l>Foeou}BvDSpAbvDEDx86W#6%XN6(0{IY;Tm~`UOenQ=tbH_|87eTw~ zSAuM|6(a%ZGi1x4$8@3;Q`?|yPgLpLS4$Su3IK=%RKo{qNNy%X$m+dj>PjM{l0kB8 zG~XSCN5C%66a@j>p%ST9_M~D`_9Wo7!pU=q?9&WslSt38JE1IEFdl*}i|61#6><{G z9QF=Zg%l(haAQz~sQ>6WrkqUp1>wpJ_omKkcr0Exc-y;g=9^T5%E(((+}p32oT=0rE*o)8=?mddDH|G&=GZH&l3P?CL%Z>W@}r zLv+i5KdcLIr3zD-3oXo%O+L0#R}TC{nvK>g?UQf`++;;*9J z%VCfqk*Ay4O#9EnFUPMoC|5`69M{LJkn3o^qU06u4I^2xo5e)5LPjOvoCmGoY%2K{ z_`-q}@>`11?`bneXf$RvbnNHOe5Rw1_~uk>gEF^|?%0I+`Cu^!)MImHPXyKya%BrX-psAy$#`DpU6?Dp zMgI0hq~gV%(<%XTd`>ZUu`0T^tMC@VS)MpRjZQx>YU@!_o@|J>MMG!$ z*4zjJheCH6xk|`;m5A-%GWOe;|<*iKTW2On(}xRYihrEUa{^WcVmSRU)e^0-e~CsLEC zXdr3}BZlTdt-p}D=?KJrkbvNOIxBSvc+5kIo!K$?!F1{iMW)+*90McPty2V%88Xt! zj@q%uPo1>7r=D7!J=<5f!Pkkk8?^+NJim5-SX(LEGS}E&Y1;xovDYY9rLU=e)s8PJ zue!C`ewD~jUCpm*O{spDc_=LM!Hi(-QPfD>n4S_1@p^G}^_$JbF}rv@m}kG4K=pxP z5U9S$yy_R-%B{R;xy^o&fJ@tycF(m{zp7wmiP|q^cY(H zjU0&}F3{k?bnzR!=eHD*kGI}OUGn8%*9}4dX1`M&kkkK$#(QzZ?=A{1c3D15M$VKm zV+S`GPvy%Zf1U>|sxH|6JF%*Z7TX6v4BKKcY+(h9s}BHMB!;cTUD49I_Pdcl1s+p$ zwDnu;g;=e-pbBdVDs}ZV2&g&r1k@TQWE=$2dTYZ3S90DB?Rpi(?-n5ruwwdN+)B6)%CC=3%L&1{wBE1V`DUK~iom?ia!_YiW5DDz2~8glSMku)z&~>OT~GP?=fw2MI})r7Xkrtm+TinOV6E zOXu6K5;*bs$}A|EU;V0F9K({&4kN>NoddEz7}|^qJcsG%%6D=4{JxgqyNtNrH|}zC5_L5;YWn zqF)X^qZYX4meCM>iEI{$Lu>>QOEs|{G!qVx10ybfRCR#g!ok{ z{d`Dnj>#BuSZ>X`w|riLnZ_KJ)A*N_%gW4Db{L2OaJGMxYob?=$YudLRaFs{k!9Ku z%n>|v-VxZ8rL^}5)%@%{zqjFNLRIV(DW!inSW9+p7E!-s5(0o z3>q0Q&a6P+xN>3EsZvMrEb1JlV9+t3zc&0Cj*<^h3lg!p!(XQ2?*8q;LK(0-fSiC4 z;jYDFa#Q$LRHX$ZIqLHijRiUadOT2(f~aZd9BFS)kT9S?r;Oi&sJH_9?TRwwfy5t| zyQ9ly9+%(7DEvR{y?0m@*Vi`eIUIUBc<3F(78{5LV?mCIC5hcsJ4q}tv0&OSMa9HK z?2s6jiV;wvsAwRXXd(*4-q9Gv3K%rT3idNIz<2MxXE^9dp7(j5>$|S+kMH@%;|#NA z_Uzev?X}ms*S*RQT3DugFh%&R^Kl4={=Kn=29(A%p@oMm&+>R-NP5IYoykr30>S5N zEC5)h7D!8{!&g$rv-<6|mv)_B8FVWds)ur{W_PlPhy;%s@>xh*HgA zOFR>bOdnl=ee1|0*zQcF9Y>&V3#jafr7QbmQ}M_6qn7dfKF#=jXy;MjEDGqrQE^oZ zc2y`fKZcmnFO+bM>*vYGV1TZtxyNwB49Y#m!*3Ulsc4Eiq{f4Yn`0%s1ve86Ui6TP z9n(|yeHQ<=0yqXXQfTr&e({G$v}QAE-Otni;p%RLxc{V0;5P(o0yoB{bhdLLyW?2A z%I9lSTSRu|^SK>SGT(M?&%!y(?Sn?W!wkC&U8qjik=#e(Yjr+>uZ5%>#xA`m9cpmX z35(HVLzQ6QVl-jdRdo0SpHbm+YN7wrEe;g#$qzxGW8^7(w<=0L#piY2 zDNBqV15)>_sTnz+hWeOFA*cCJ>3-VM85e$X8i0kVOG^2<$WrVet7udyTJ;MpE48$Z zK&(OCO^8?ntasH-Z{&-(FXbPDky2aA{kfZxYE{N@K2H1vpZKUVYQQ^yy!wqnDPFV6 zY0t;UMRqCju}=9psKcRZr6N)hV#W@jsIwRe1#`8LzyoP>g_6HF$95nr#yJdxVmFk} z#ojOT=TS|m=EN{Z8g|aolkFeRS)vYE_vZeb#5Jkxu^+;6Y(a zoB6Tt-+wir0t1&e2wY~_4qxfJ=C~R&mDxhA( zoSjPZE?U~a&SEa?>YX_zD!FJ`hGtGEvjjr@xY32!08 z;n~`En)w4Z8?*U$^2?oT`<;|I2PoppyC%ELuMT949vh)!PMeuu9c{u+Q1Pt0&xfRb zWh++lCI7sIEhyE$1__3KUpA$L|M(*#@lVTId;pdyP0^Jwv_L&n1B`%U=SI(B%)-gq z9Y0x>+}WV-g#Tw(QeLI-nq@6G@5`iM8C-_@p&vba89vrkly=#Ygqz+z09(A|M_^{6 zuUME3(EW;l+N50(ke;nqxc;cR0$9#qdgiakmU)yHeBaHdvw?*Ry+y=O^=L)nj9a90 zZlp(?9Y}AG8a1cMCdhI_Hf6zLJpAle&FMY9UDdG+!dro{Vja(z}KaFSzyB_{mmnr8~?V%y7Nb} ze!(NViboo*A<1*2H!QC1>cB8J!v6ginsJ>E zzD?Kp;5%^LG8n@;_y*S~uiUV-GeDytJI}=f%jpeh9U#p@@cEycfkm?8e#(&)KpYlc%)U*tZhoX`B?5bceUR5>GND=Fq-vwg3k@0pD5K*L^ zH~2MI9~O-}@rQ-uKi~L2t&hSle^?9r=iX5|dB+mrba*?e#^AnGbH@^3z)fPvt1!mT zxji#@xS`tluKLc$;bNNx+!6!ZICrT3`@*{o?8GP2sP^A&h*+u*4*yez#1kfBJz|Nv z-FrMSz`;x7uc${v(z1K-8eNztQs@frVbpD;TlXyCt~+jrnIqtW(xZ4~((Wh|wZ6|m zGd=HH!kw0%2nCTd49bc3xk0HSkp8Wi|71`ix1d!s4XVU&^HypL)wJY1(;PP+_5f=A z1M2bs+r_~d#UTdFy3Zb10{I^I7VBNgcwh--F{b?K-L(WfI702^VCwYH(pkTFmZnm< z5rjh)e~6ql%T_t&eZiF@Pvk0}`Is0EnV4_MOk1(}Gq*OjSiaIh;VqLe?OvX*sCI|WnUI$@H`sIx56&H2_-n$M|xoT%7eGJU&QT8xMF(Mi*FMEi77 z*8oBKg1VR5eguq>0*?@^m)gEvpB!tmCEy|=K+Ht62=P+pXchRarGmx5$(k&S^;J#! z!&bl$;jeCQ{MkMNo0VWXrk9!^UHqdBVr&UR88_WQP-v<4ONj0S0>*BraZMm>S< zY-GMt;%~My4y73e=_L`=RD;DH?B<+JQv@}wY-3v;?4?P1XtWO;rHRl}e>zIPKm~v2 zBz1=hzThNH0lKiiv&3oxc5{*5&}CAli!>aU)VN4P@$;Ii^bD^2+EscRS1PX33S7C& zO?p|Ex%IZ2G(m@JhI&W|xF+308jouXo>E7wTAe*5Yii_^q4@VbB^HXe)^z`$gyNmd z^_f5D=Wwc?w2~v9wLrYl%So#SuaTuvPoos(I{V8ovj-2yN776R1oMDV@<%v6-6(}S zrfl;zH^qGZ%_uPtvkExYY772jINnO>!T=R&I3745eE{)jd>=2#*tH&5s?~RLQkjkH zc{Eabz+WZegDAGr|gPj~BCK~A>wWk+-B^Q3nc9h{E4RsY8E_)#Q zQmD{ZI*yN?<|mE8@ObDay@fUm_m>!5{|hE=V>UVmN}<>eviAlq)C{ZRj6kV1esTk)HYn(JHc)EOX^yX^ z2{l*}+g(03_#@6C!A6{diYa^P^m(9wM0|3+ndUIN&R5 z@gOy&Hnm2R;%==PE)|koV=GmpaH$QRlzOcvAegfvpPsW>Hw z6Xgvb(~d@m)&y!S5fu> z4@P7;`U+?yN;Z!PcXiJha=wD5)2I{)mzeV^FSY ziVrsl6+5MA7>n;TlcMz*z*u_9*r8~+H&*9nM>C0Gfp0gHL_M+Jmtdo!?qm#R>rN(f zrz=v2noDiyOK7F4Jm~2bQd9jbS^GE~z$){PqrWGSIYu(MOV+Pg{z$t}_#z(h zD}75I*?z|Pk4SDQ&3W=$wM20P_CFu`8&|a4h^#|%ue_;Ez z%6)4m72MOL_%{8XkjlMhD|Pj*RVwF>CdK1gcZAf^JGN4#)mEvcRhkt4AUI^R(Rcq% zTe0Mu^i+H40J`ePe#>JC!4ez}eY zWeoCnax~YSjWGVGLrU};{&qYmp(9q`ezd5g6s*5$N9HJJupV}lK4jEjs(KM`bX~kr zN|o&!72PIXoK*by8(odl-YAs%b%LG3UyHpRe~-PLU_)#{y-g|HVP}3IYZG1p*sW(I zS9{(_8u*M9f;Oec^wXJ^?6_o4v!9XP)|cLVtX(+ddhh&Y+jc#ww0@x6KOYmrAs1VE z#a65mx6;&Q@+D2II0!C;OQI7>uG&h?zxw~>XH7fv-~6mOSF{)6!~2T*Rj=E=(C%yh zFMn0u#((*$Ab^%K7J6>#j4-prmWI+*2_$JD~d%>HA_L3L{&+VH~Za?g7XuYrJ2eybJFes4PqmHi1{MyUI!HFZJ91@TCe)XpiOV;R(^{xd&|@TY13R z*v$Q!6wk-NxI#|^-#Bb5m5pKVx&i2{SEX+;jlOzKVsXJG3!Mc0TiI)pzlVk{ zZ4HA8uu}WirEbi-hKfqm=97+1=$+RkXCLh%<~;%gwYj)<&g&AdeQA#bKw^>eg53P8wc4J8bd!gb3jahMcjzfle_0;M@jis|+!6DSDg z?1JN_HFMvaGj)n9^S%9d9&~${)ZCD!gHE|U6zJO6;ZhUFUB3kK2aXtyjR98mg(0o{ zGg{UJ>zJC-g7R=S59fBo(H=T~dlZC0UG?x0(zp78gW9*`BjBJIc&Ynszvbb5lsr

    ;H36+G5JvteLETk;sPohEq%(&^ZcuW{4(ldqmW9zKK7v( zy`3n%1e-jm4e+6VBubrOm>b`aWZfU+_NLUr?GF?oQa#IolusTeIvfJ9s$ zg8FGCn?*GebiBadGJ2vNZ%P3eC8ytnljjt@`xb6@%2C6$JB!=73P?M=;l@+6^DTZy zH54H{Jh-E9I6LExA!GO*r#Y#2RB2Uk$1@ZSuY~8pG-!^IU1}kA3Uy2EG~155_9F zFpM^j%m4hg#NzU*SK{ALbGE=ggX*+k1#Ik)C!4kCdyyu}aeuE(kgR2mCr^;VoE}~a zFrQ@Z($g zq<5I&Wt#~e_xob96v<{ULW#b#W3t5e>>O}voC11B>;nNf^{1z&z-s4mNI2h_g?j`%+<&^g3QSV5-!Tfl?Tqd-aupCK@(XVpSnOohn7aCzLr=`V`6{ z_&peYEI8=}W+((RSHBN7zLoDu(Rlo^_h9KwrTF*NOMov@FB#Gea56QxEYfE%Ktyoa z#mFn&sAvzK@*;e-qNwl;<4i4WYB2wv)}_fZZPfqK(aEYKRH#9!RAkmKjc$I zWkITU{A;eN1WYSNoX#+^PsArQo}@Qv@`n=VROGW{%ZHdHDms=9eJF)Fo;v5n@vYS# zN{sqi)eZmlC_YK7^_duGC8I^MPS*-iCZR@H@@zo|v=|o#j74O(Gv)oT z#Fg4i8|*?0|0BiftH4Yz9AF%4wM*DD<-2U>)?%E~jIYDRniRKqi-lA{v8_~9kyR?Y zP?O^O6CCCT%RM3rZKV$Hv`VGy(4@=?c8@#6vmO=LO6B34*21g5YEm5S`YV_6E&bJ2 zYVogB{+aY~z0P1Yr+Kyx*BO(hNu0HqqfL&P;~bGPhy6%DDxU_Iz^W<=?-A#(hjIy? z4tM5eik~hql={r?UA*b5>5`{ml@5C0_$$~4rM^?^M88az1~KKpAei&0~*n(?^q;>%#@hZDQu>s0#7_>&`+$|=1j?j zAqoL@U*F0^3ua0_EUM+z)L8%pV#fAdGF~ffdUBiA;r!#`koyL9Z?o<3M_aAmDeq@Z zj5GB7%%tL}ThXOK;FYWB1t4LSe;ZfyXxhYC@%BI_pGPj%uW;mTvECzdvvv<|U2him zcyE@pbA~Vxx9Nc!!<^j0etG$s9Q=>fpUGAKlF5F>#i{D4`RrGeFT?-X#k17EJkr%) ze3ktdcdlf={Nhslk6nD8ouRxhC8y@%zD4S#1@)Kash4hHXHEd>^`+#mKUhGPFQJLS zIP#UWP&XjM91{g7(eAILelRlh6ftMAiJH%rdc__18JlY3(4I(KW@UBqD;??&-Sn>E z4lVSVx=1j#!d{*bZWm-e{sqW-5WC8r4Qmk&ZMdA1bbF@LwVXxN#*+)ZvNV$sOI z=;WP|U}lvmCgT*!T`$Bz0BuW=-beG=%#j#J$=h=zPDBJi3@^P?F^BK`1LsP8IO~oJ zudQPeSz!(w3MhuFD@&p9abpy|3_`)Zmz(DD^{ryA)IpyDciRnAWJpLF=Ln+e2M!cB zPwELZHf$}84IKdh|B0fA5?t>kiKq^|VZt0{KHwO11tWQ`Sii z_JE9_sC-(gG%gr2YBF*CS}L+3J+M@Ir{Og-sH6CK1wW#wauk{WYz(@_G${yuwINL` z_Ihyhm5P`0H}zO1jm4XOuuOW_fsGlknDFn3yLUiGv|BEX z3B?U|sjMFL?<#mq!d>yQKQ4z=nn8bvpGV7a-+t6H9b-I$CZ|iRP~b}Ob42_o>6j#g zsoe@m)WbMe$*NVozCuz+e_WR-4fFkHMM{BLhyZ9xvrCp$X?~Vvt29?8WUy2(}2%ltQ2Bc7WHU?k{mEbC->m4%zV$719$?bc| z=&|<)M_%fQmCGvpfu8zaYR7gWEO)@10&Rzux5r}R^=%^bY3q5CJC%JeJqvZxWDRuw zDjKy0Q9EGi)&Q7LNQc&NMQpd0tCX(d=YzG{3=E`*-#Ylv!j00i)NVcU#zPiKPF(ka zA?*vKlg-!wGe#KVE?oJI$`LvyglgAAVHRzaytt&Z*rYQ>({`PzQ^Ht1G%!i8mwLFW zmUXxrw0PM%RVhbUA42ojLt#&1HP-x?L|=4}yj~K8)uQUJ6Uv(xTH`kkrE43c_G~?x zvM0vR$&+nl^ycQAyNw3sN=_`a=@pOS2$OOpSD}Sl^1nJWHqjaIDP&N3uG9m4bupLs zmG4I0R|7U`oz#}Wn!E{Wimg#MHge_i%qFfzzuTm~3JMQxgmLu359(SJOWig}FViL* zGnL$dGB=^SI&Z-G;+m(b@Qz%@Q{b?8_oD4jGr<`4T8&X@k&l;i5P+t6z>YE)=qlJ= zG`v&3^o&rkT{xi~&Ci!Y@Fwf?`78XHk7XZ0$>Rx8sAc%0^d|qZ-RnEko-%)wVz`bi zBHghE-gNCp025NE^JZxZSDC*xdi>&MbZaxhS8M^@RWI?Jr>ZgS*cz=f@1|~>r4E$4 z422oq{!wb|vWKGp;MM~+V+-rO^ssFJPkL^F-hS&RDTHa^eX15#-4XU?=sw`%xE9X% ziEH8C#LwlQxE5~zGuOhyf96_vp7{Ay{QUj1^mF9yd|Q>e0_U_{$gDg~rSdRD9=D10 z_kIwu=pU>XmT%N9g}xxWGcPjv z(#bv22YS@od2z3_1;1N$`>@2@KRVXkxMyqde#uowmpfQIJ!auvTDuB1XpiGQ%nkf$ z!MPi3-{$IiF7+#Amb!;ig07^M$gt_WU3%VU!3B-rpnl6V=K{?)$Ax$}2~;AD*ugAV{g|)RU__3-*PW%l?%Z<>G%L%-L5Y+Cuw8$;Lt2F4%Cd7J zY6DC(y9gfQE;})E82y`*AdZ{3Q(6~VPgSbrnrKv|s5A^GOk$sxO|^%qO8MG7!?-t72pgyI|8WZKaN$6pr0tn}fdSJ@9~%9dy$^HDh3d1{X+ubC=GXDf zyxls`pDp@b^7BWnoknKE1bhRmZw7No4j)HroGGi+J&cm$#|Mf8^np!|I#XtKTnjQb zzvLB)-4t8A9n99Th40D8GaSqqTYnr7+i_mz*6$$Ol~C`4Qb$($Z~8&#u1!=t)z06E zg$dZlrkV4W_|d6@(sFcc(jnfl#)-%Y=@wTT1%y7v)WqY`M{utQaEt+NnOjvY{q0x@ z>3ky!subO?^`I$3kW?0Z0=b0BHpLxR^L$F~jJbJOb@VRZ!?;Q#j)-MBW+JKdB0K}8 z>LALo?mPk?f9hJT-#B(?EuVV6$!l$=Ucnm5I4Z4dFw5#`M9>q1k2UCtF~5#%3YdeA zt25Sgtxx1*yiX$D%JXxsp8=v%hLlK)&?$LKru(Jen1X$s={V-)B$fm7MEA@@CmUZ3 z<(-l-v$_e4f{+u^YQ2)Jy$WX>%I2@qcIj%oiV0{Uzyi}4Fiw<7W2gS8Q4K*AebCT~p>wX^7oK|e8 zZOWXgT9GRbN!{>=WM)=WwM$Pwa&VKI(o?5+JgeCKPZRYyg(a*%l|Kba&uOP%%pJ>Q z6-1wI#Oj0>W>WSk7*C>ZE>)d^ucaSFoR*%)sdr9GV}+>%6h5P}zkV8P19(XKUk1No zDIBSK>Q@TsGxT{W!bcUfyHsipTM9mu%e{SR$!V#byODn;Os{Y|FFfUp#MpXM&Hx8j z?S`qFkble<&hZ)-F@M=-WAx2bcehr6f{I^q^QG9cQi5oSH|f4eG12_9K%X#G+jqPV z6`qycnCr%ulEw`1aj?hinN>vB&T599AI)q9s@{_K>VgsT65$k<&YpMX5Me8E^hqMnPtfxedt5p7hnnwrv4Yy$#CKr6bpTRL9%dr zAdJ#3U{m_dMM)S};mE(N19ihi>1}4YL{Q?L=X^4DnWBK=iM}Ycpai|_LF>vSAB@n# zGS${=BJR?pT-tyRJ64Y2+HdQ%a!JP!us15C7r4>TT$D2Ce+f?N6xwk~>Wl7gNkx7C z3Za&N!T}GXd7x~EDw({jFVJJaW*;&7P|lyy^ZL>ZZA^2uhC{Xx`{rb8^V6wbrDcLZ zv{KrGrVMIQ+kb1xWeMcVmEV!aUx4)5(Tu;OIt;Rix~~Iu{A2`ezlvys-B#n@lAd1~ ze_a|)-LGC?{w;P7TH3sJ1iJ`b06dy{xgz!S@@qnhFZH@x<$4hY@l)Tp;Igz)d5hCrE z<;&=9!#Rn;6=Uz{OTT;!cu2^IP8`doO}n&L;+|$#WQ;TNAT>bP~fL`7Sq|kKC1#@%8)PlP+Tb8nCeeEtEIy7#`Qc zRZ!LlcgBqSfTgEU?R_56nD~G%5N(HpK`UWoTx+`c8yvp+hth|5dfNS3u`J}?uZ^Ie z9!mN8(j||56dZD&=eA|GA0-9nH0vw(+sDLk$i#G&B>BpLhBf|3mW()#qV&nv+C@<2 zo2JI;pX|`N&}a!?MAeGMg*8r8F2R!K;6s+`j!br2Wr(j5NDpM(o!1CN%9_G^D_N1A z!zoq(P!I_al!}i^^ledK_TrCja#tEvBe4SRPOPY05Y4UuIDUaHJqd;A=x_~S$g3%) zR+_>-{PC}_tNOK;-~L)HFtycN&2>@*o10B^GII-6532R1k8~(dmh6QJb%%6v6ZHLU zo%}vm5?*xN8(CR1^l}U?&ezLDpaQlAiq+tTnwn(nw{?M?Y{%}NX5e=}_U0Hr`a}ol zs&@AP)vw14nG_mfFSD}C{xoV^R3O!CuINnz%fX0ba*&aY__g*)xIz3i{~}FRd~5q5 zZ!G2?(ie7(IW=v6Ms+WpZan5W3daTNah%jgryCNvKh;+9>LTk9$XuvBkGrfvN`w&* znVe=TRf0Qd1Lxj+O^Pcg9P)vaOBn&kwoMJ7@|@dmC5 z19o*-QvHanqo7AN1I zOZhNjPzCDZ+;EL!OEC27uyNZuY9{5fysMtn6IE)iErNy!DZ%9H3JNS96`*)!jj0io>0_qv80P zq1GWY0%P%_mpT@`>&IeK$OwB_$YeH_i_n-vlgxttezeF=ZbKVPGFLv{d?X(6mcPW! zhWMb{Q0}|t9kAw|UI29W~?~^7%N&q1QLE zIWp&STQQ}9SYE9r#$!pfTq+`^W}gk1KU>*X|FBYuXeP7DpJKt6m{h!efjb?ajuiul z{T39x3-vTCq4H5&rPHl`ZmV0kyp>@ccSp!`yccgi3LFId(WiB8cCP$?Cn+&f?#MRf zOC#m3>^FbP%VAsZN6Lvhj2b;{nh#QkDN!;jjBZDn3x|v#B}#sQQSa>jhxVr8oYpzH z7VRy0gK@|^XNAS~HLpIhitT==iE+lBhg>T7(F0ql#W;tDe4Ot6xtb9qkRjRg;+T(vR@0?!$V5}W;;%#0KeTrj$&e9C2J_QLx@$kkb8@u ztS%ac@`z(PCwjf5%!9HchraGdyIRUkn1R9E0ws6Hb^lk+Fn{{!DVak!n6n@$4@Gm^ zd4TgLZ(ba7Erg2WTf~Z|JOtUm zms@ewJ+`&X$^!h*T7Cl~#ghh|TaV~p8+klVrnZq2@N>M4%#v)K+RD$fd|7qDbfL5_ z#)Z(wZRM`ad&kPD>h`xc(b2Z@E9^2Aq=8BvUw}BWcRLKsUuj)Cxdps`C)&x2n_{ID zZUN+7scr#5pTS%nD%i>;{fHhL$Lwg?56F>%XqmAAU5}QV3pSu&3UwIoOPSumZqzwO zc7ej~86$`BL`j}{OXkfje9%>4Y(vDms^meuw=Xs;!j&tW6e0&VoMu+0`Ox7QnNxMbW7${JhyM+zVGEyf5I_s0T`~9+wj9l73iwo3d%1HA+xxKE z9d;V(0%WFkYPOhzTFSuQtfsKys-~29A0*k4v9dRcb##iA!yMIIRvHKH^Vp#!iIAJH)O^8tO>L2kvd0Bxyw z+9{Klnr_T<@@}5D^_`XpMYcEyS`6@V`rFa{B%+J>-)s|R(ai4EF0%EO;h>zV^6~& zds@iJziq`9;~d2DyoBX6I`H*o2>+dMq|Z9bGxe*$RsZZRKNp=@hsZi=ZtGC~0Y+x| zQvh-dEWP4FGoBsOlqPkNSq@M_%ZL87v5OqRbPp#Cx;bl{hW*mGLRwIjN3e?q=76gO z+#}D8Y3If~bPi&^IZ(wRq*sOZ9OKeJX*j0GoY#dhJrUSVW<@y1caz6L3m)r+nTw>O zczGx0_&{5Bm%BpUjO`A4Y874W zE`N)gPEWw7=|{^FWJVhDdxG3H94Y=PLy$@uqS61b&S4}05oS435AM$5JqP^YJzGzs z%&-mzQ>s}Op2_dY4!%Y|&NJiAJr1g8(w})I!>HeZ@s2KhL~c!E6@>kJ$iZx{KEQ8+ z>PZ{aL(b5b{`J_`#UcB;zWe{O{kpUMqV3Phr~lCcX6~e5n({ekg|9d%wb9JrXM4)) z(4nZc#Lx{bd&!(3{^MR)Q{ZIE=q2;ats}i;p1Eb|C9{;Hgx<10vwo*f!!N#(2Y#`6 zUeFtzt4{}WjBwm&f3C&l_;da=xffdjM)i?7rAzDS__9-}ybs0@2!;BW0-g}`yd1&E z5!@-_GDt~4(eMsT%cAF@JEoFXT~LTU62HJ9I)NS60PeizYMv$zVZ}=c&7A&tqrP^ zFXVw(6*9h%S!k%}3v8Fr=zjfWmM5K_v{=V~GZ*W!aod3dWX3G9Z~*R*LUjYs0fVXQ zKv|^s{k0+hUp8r=%qq904U`2$_Sd}zoE`O*oX_5AHow7u+584Y?5IE0&X(UrR@?Ex zd|VFi0IMDaOgZA3+~_0dFb8+WS%Fp zx-mQEp;bF6@f9>@J$?3y%<^W}iJvL+d8^X!!&X7PIbKl09h#4eQ`0xD&{-(~k`v-y zqx1!`Nx%EDHmbRGc9{+89ub#q$Mn5QtD@WXrzXUW>pz)Le4j|2ZaVY1H)?6us0Xu6 zKkIS)?4wGz>5=*#;VI$zFW0)l%FOxG_TE=7S?`@&q1{_3`U;^$S5(-FoiFENXW_m*m_zItc=ZDGb#HZjjO1&v# zxEv{XPgKR|M8}TCJx%ZQ5)`hiXahYpLLB@=d$>}u`YK+gq<}`IAMz3%d z2T8)Go3iS6_NSP}%S=q|{qUwxdk5Z>!SqYYn=;$+2MV9j=(o^;3uxh6vg%R} z7V+M0rDL3EK=c@AiX9`5Y{AeoDnl%6Dt&~V>hEDO{~63x4vsZk5=vG2`>6XgMs{cO zIE-e#R*O>YSH`+fXtm-LhAlGUjkr)nPU+db{*jk~x{j5j*>}@za`z|Cm))A6n4JLL zvJ~k^-un6v6Yk9Mx7g(^K&cw-RiY?np(TpuEt5Rx$8k^!DO5F1?!Y|`%>+Q8>v-9P zY4bt9xq8#^@uJx+8aSbjj)%I>EYqeN_Xm~n*``k|qlgu<$^D{rUM{|%UC8Gp4%zY- zIqQP$ygYf{Dz@cZ1F=99@a0n3=WL~vvsS6{GYzBy^f=^VC1-5Kmg1adfK{E=#5kt- zw2&%4Z7Ve&=QOE;KQt-sg8M^A<^EwSb@HTDD*1O!iszR8&ZT^-PS{H2o}hD+-ohmkI;tzCvs@#OFnlXjCDC+PYX2uzM<2}A0A9zn5 zg@I!S=C7=~sOggMJ{FQml=!~950;(A{Zzjh^W;G!##Q4<3lqx2Y3v8`YAkdvAM%B+ z^@rFvuBQ(^gl#&QR(z-~wfQ$-gi*Wm*JB4UxClDS4npYADz^Mru_#N(v1@B ztME~ZL$*x_DzW`4OK}b(0Abr_<)^58+!atGOdJzKsc(+=N$)pT_bgT28Dr3vlE<8w z|7yZ1pU4B*N9q45H`>w*=jnQo?9vmi&jTPl7%DWTv!_?L=lvdS^Mb*r?*E#8>Hll`{a=}Ws4!-xk{BhJ zjITcmrx^?6cKXtzk4+dHa!tGcsO^kN!8uK5?mzsP7!Dy8uUnZ>aVkU}Q z43rEJhivbZigVhXiVkRZ;^pWM@aOw&J8UbJjI>5h^EZEg{SIBw{NaSyp)31r#R_mv zdsy;b?O|MLqrM(n!>ab!O6B34CUtL@CdHKs4w+c9%3Zc%**K?(T`k@Re+eZnmjmeY zZI*%P6`m4O%*B0|;?GZ_6Y`3v+hTd4&^lHIVIPW59mlu&-^zlO<<|nggUA;K4^|Zb2qAqCxB?^ev@mU4BrRGZ^OVoBm+gErHbfe9-gIgSw=z9Q zeu0@O6@|zQo%lM6oB&+JF;#u8c(VeUB9;O^EaN`pGRmyRUGdT!Ke|h@S%0+&nFHhe z9N3?+nf_t;>sDCG5E}5|+aBpvi8_0I`Oe2W7l-_tl>S5SWa6CGxw$(Y6T=}JfbAJy zS-74MyoZl?|j8|D;I?yXz+|=9`*tE4Djt>y7W^<~mnk)=}t5wx@6ZOsDp|fcj+{^GwhVU{VmLA{=3`%_wI$&7>sdpxpWIc_|l%Hdi zWA%J1TlR-n$sb~JJiA(cO}Cd;td_6n?$D^So%{hNmP7T5ZtM1JSOvJ`{P(c) ze<9B`^5@)Q@u3)5XA&r)-_{@kH;KyD$aQ#Z*;>A1m)6S9>Qiq}_Z&PhjTYv}Pji=- zT4EV~?Qk#ue|6>7<#1Q7n%?L6Uolh%2^u(2!ooo-xy)U;!8G%y_MDvzDSpvZxK4Jd zPw^{R2gmHqZ%pPW;}CkVPG)(qYKq^#J&yZettoyW`22ym4_3IYnGbfsdc6Ecl(SwA zvuBjk*iv+LGf~-k*iD1UvR<{x&R#%@(6XRlqmLy>no_lHox zDraQ`7}wFZjhd&oE$J*7-1w`;IXuK;lN^itMRTwW;+}%g8FRS-p)>aim*0yErWreG zJP^H@>qy2<3&Yc=d1LkXU7rVK);a*>M~-GaH-FK~OXj0E_8a+fd!{4X z{psUJ8}oUH`a-@O(f{yIfnY@VGA%H|$^0AsbvCE%2#Rnq|1JkcxSG?Izz8?<-L#+x zck`@A0TCYN-;e6Tf;wh@;N@ z#REoHkoKb-`26{Y0eE5#{&nKdb>`1?;m>vD&voO^bvHkJz@GTyg8*082wo7n%@B8M2RvItZ7BJ9QUw#bY1nfcl{;F>vKDA^mEY{x+k&S|Ro zYOW^5SLj?JRhnxnwHW6#sgm`Y6pu`=7h|qyy{(k8j!PAV((#WRLtwg_BB*w&Jen=^ zDPXiQUO{Dr(ykW9`@C?Q%<)UNnvd|Mv)kl1FupRT6o=uHeA@kUXKPTvp3FPtj@12C zy@S2rRs&R~D|w7@<<-5gY$MWJAP=Jvzan(CniB6m3QsS2OZPk-!wIfGomrI0M7MvH z8L6Nh5XCX?qdZqaTx}4I+AhC{=7hHd=BjABjIu{mvK@QMPspo4Rx6g{yOxXt?NgG2 zfvT3*yh6vWjdgHpWaK46J!z&>Q*SD{KgK{s50o~P_bc2`-FB$YHr78onilMk83myo zKKx@1XhHXPVBd-k7`V6@Q1$J0${uJ({7&AE89TLh_&m`L7m@nS8bS$QUI%^XefUz* z2qy|{G1ir)7RqtF1N+JwD{tv&NOeev^CfCxlYcFPlvC@o#ch{)SV9;~2Uct7lM6L!fH(Y2d)VXF&ITudFpJ?^_@#!i&9TV3r?VlewUQY`kU zUn`1=_hVL#*du=i|IgVySat_f=w4O3^RNeX`A@Sz7+^GMub{<;79Bum_F}7CkfV)W zZjR*e(d(O=V>^1w*HXzo`SZv2!pZ$ST2bC?jHsg5bqvLme-ni+2KK9EP7CJ)R+nnx znK9mU_yBiifc%;}Gc-E7#DgNJQT)Coj52qR<7FFB>NYxk(JFJ>HqM_f;}dFZ{8{o}mc)q;TxkPjfM?l7Dv z`{0<}1VGOwM~j;)oF4Td-~or#p1WVo^4dllJNbCp3Ca;3Fai%YbqntlVzN`~=L-Jd zRbR2{G8MPufXO{9yYk#qV|sYJF3d{+{zMU4o_m^6^{HM5ZhEn@)r5+&b*%EUh;l9k z<68s#2@bhAnzF|BqwN0Ps)%M~YhpaxBU?z_TWu?qhjW_xs>;%&xVJ2eOX?lCbOGBMw6-`R@YTe0=raRh?!?S9y#u=v;H z--Rnhnnj*5o1rhrlzsyzMJ8Xb?$Svh&>wNk{i^y$%S5hyAuMbN7s z`JRFQ_7^JIqNKx(R&@r@vq@XKoRu9J(5LWc)I#q^BhLvtHf*cX7j|sbIe9BEiYidT zsQTtmUzHmtjN+mDHia9$5J;dt7tkEkz}cqsK!+{8pmtc@*B~nekeacO(}-VCc6Bh_ zz#nWdUky!qnWPyMPYF?a6snDul$)^%hZW?v(kvWPbuTiOl4>5>pxP$c7*}# zD$0Z&19}>(&31gEE$I!0Ss<8``6$ayw;g5W%V|)ByqSg9%@ufjz$Lk}_?9T5G6~6i z?_T1X{`k>EAHaT4koH357{E5$fiV@T&WUbc0!#%%v?q4-7*q&3?Tll(4>4O5*m{B_ z6Uyy~qn9#n8y{t63@9_ZwmHE8hAD*!7^LV^o? z$=_c=I5vgC|B@48MIx*}OIBqyzSPWC(72v^<6Nm#*|1I*$n{o%xst&&?4`;)VrG-^L)5Dt< zeiG-n!M7rf89fPUQ|1aSDQD{xmySkPo>E#$NABu+x+9N z^a=)DZX5>kuG=u?5RR9Esn*&UBsc#l7-<{p;|yD!IyS`F1n zFeoP7M`&<8Ex#{E^POiTRsYp2tbQZ^WbNS<Jp^{`Q<^wl33FXmbzfNPJ6vFVu`NerRs_UpJMz1FS6MyjpSQ+e#ar z0-V5$x?gxGb5g8U4etd1ouJJ!FjB166rETa<|YUg^dKLA%WkG)9?!pfB9APY>ZcbY zRV85zR4uWcUO70Y83UDzH7RaG;E<_lzmtn?#ZnjVqZw;zU$QenPh|G0c}`#QwI<9r zT3?Gt7JY3itE5>Uxh++b;wXhwA(fMAD|K~|RVrtpCdDaM7jh~6(uE=*y1;s2%6#oY zP7gF+-2Tx#+uP^ioYoIl=V(%Vr#VMRZJTW?RrQrsD)&oGiuWE4xdm1_$5t#A=d_3I zpZ%B^4!KzJ7q(&rpIgP0WKE3wQj&$#iZ5-YN@rQ6Qoqoocz)p*Lh44ctyCt?X-zBz zSlV8xM_l7Dt(jtu%vJWs|T#7QWsMa#I)& z?_4+K6S2m*QH+BgL5s8+1BET9X-wDuR+ziP?EcTvt!c$Ie!(4gp6O z5NZs*+i7qHUh`0RApEhXS6}B(f6r5yE}rg9gYuAgU6opc{ee*l!42CQ8$5W*ty*oF z4x}O@f7vpl(jC`@c`4k8ueym}><5N;DNl==`iq+m(Ch7~WcQc|nsG~U!Y2N>m!kSd zU=uy-?Yrdeqd1z-SZV3b{UVw>ner__9~L%N`tX%7m~M4M`SPOWiaW)blqeW)!%fNx z-A`mODJ}35>8%VBes~pP;#OZ`Q261KLq!X7yp`wR!@TLOoPb!7j}jUD6KLE-w|Q_c zHnhL6$`Qw>S|6oX_+BTi-UW(Ou+r%EDrqFDz``wfhu-p4V%hG&R}n0MavCdjP=rIA zEyoYH<9^uAz?R_eant)ym>>FMFtzZ52s84Qq%(YFMbs5v8taFQ9^em7mb!w*nNF)44K0z32Vq5Hq*O(&+0$7Xq~Ik7e!;ZyLG0rl~8hCj>mwCm^Hn z+^Ymp*G)BUbo&{_WVAPT!M8l24V^Jw2@c_{j;kbVtS28xTi0|*b_?#*)u%XSY_OomTTtAga$EkWcT zsWf#d7E}=ic$zZ9lxeKF;mSg^YhySzM93BQLx%l@aOHOl)%*yh59IeYVnraid|OBU z()*B<@FMmZJHwP$XnUmM?8rwVQs%3}mYL{cr1DinKl1^Vrb6Qyus0tR4`;~xgN+2* z(44r7s(}tc>HvB&0{a|Fpuup1Dsel^CRHaY`?&Ev0b^%ad=?Nnv>4j7~~4 z@W3UVl(x8}u9L#xk48EhrzAKF=OeTpr9HzhcJHj1QL}wOXC(!?wmc&l*@0aYIPNa&%$sFp2JnEw(adO^5>N=_BN}AJy72)enH9F-HDJT$)ozK2 zelaT}Vk-y|-3^uQOR@sPg^ux25ef=orIVjdqG~hWj z^Ie+!obnoPW+zH|fP~$0b~@->A5Bhc~>v|;+hUJ;%N~T%ln3qXoiX+paX!{LVCSM}Tt8(hCg|CI%4}%a;4^U{G^0OMEsA^fSK?p{ z=~?WV`54^>C@*0ROdOybuv@PKImhOWi2F5v<3)<^_m?AmGZ3EG^H(2hG7kCfCA-qL z$(4Uv-!%KuV`4buV%x6Riaok)728tTKr9d>227(zl-UYx!#S;29|5*3Hdy>yTo8|1 ze92a-q{1pSzg&~zmPfgex_ZG@DjVmtXH^31++Z_@L-t;}6_o#uV)7_0wO+XxNaY4s z;*j^i$#b?3NX0qr0l9!hHxR=i7pppHE0%|Inpo8dO^nBVP6(-4r){NnpR!6N0~akG z#-Ve6aH+7AmBml$$Y< zLEh-IVajxV)4_gzv|}!6+$(?8I@t?VQFRiv%2>f{8Z}(3<(x8o+SGCUv7k(kq^JHy z$=h?o6&@U7Nw2xkMA?jDS|$OM6Es zmkf7YkV}=N`@ole8wo2JsHTdMinER_sR$_2Oj7{&00&XnXr(c9SAC8K75xHV>Xgw! zPx2VKLsJuNn*|J~A$=UGXU4u{peegvLbbKgN)*#s7({UQs8&S>}0 z&!v%AK?J}kg&rr>q%3si6!U5)1Zl>>dd2!OP7xTRD5~&9>}KjX z#Z+&A|AV`i8Q^OD#{bgE`vfgJuakh6e3QJ!E1Z_S-oZ;F$16^b+PcsEwyR4c%V zNyN}J$F3I@O;Eb%OO9wW9A4HSKEH!gPuR}yRLptklA}~S;wwz)y93A3=vL|OG~`{S zlk>ifj-cLiFkT?zY5@3h-^E8qgW@g)`k~-ZiHmv8BO{|ok%;&cUsejiSN6;uks1FUCsJMCEJPjT;$Z|>SQbtfjr^Y@ZU?vkQu-VRBlWAvu z_={tMOL$ST%@Y+b*ZRjAC(yBp%2&LKfg^c!n}-^jla%px12C(rngvIYWs))(1#91) ztaNqwjxGP#@)vb9(ayk}qWVT8F+ zV7~EpV)c_@S?{3QDN3LhS_yMPZ{D73XB>-1VET6t#&!UoAR$Q^3`44_?L}k;n1h{Y zAHD5?5(>)OdOMVMaQF1y8b6iU%#6nWDL`}H;|&=^D3X=%KHo7Ef2=Ty5R}*{vg5q_ z0d)0!Zqxju1TF6>f?sVu)BR^6Sp-0kUJNg;) zX8iTsNAOVnwB$d^PIhh4f8fpeziLp-C(2v@XUUA1CT(lL!px+^$o?UD!Ras<}%0%@@A;mY&gaUQ>_Y_nm;a%poBjdsm zhKwC|+vpsr(^pENu78Ht)h0T>t)8=$qdKsXT})9{q9>=#QBnkP2_w=L#3k&1Cn;dA z!ih@;&Q+|$B^&3$Lj!5Ud}S@9bLRt#fzQ;kGn{3u%8{dE=ir#J@*#Wbs0B(_a_?N@ z>5+}bX`NTOO>4f0J8cthoxH>LtqTgQVvhg>7jMn z5oaKX>EQjdP(QWroLG96>* zMK{!TNrltGj*g@%>$SP{k{Bx6wrIEIj`}U4F(Wz)Y=+A-pnAHGrieK|!8P%r4|2m>RDVgEl#7rucy!8Kl;99n5k zHQqnj0F$!#%VON?$>fBS`POGG&C{C1#c;^QQu1uY_WxiNO93udya|t)ZDLYAd^g$( zZP~atz1@ER^}G2SFne9TMI_(}0x}+TM^ff?z$ewr-ksm_ctl0f7$nlC_y0u4fJEg> zl*ce<=1=QdbKDQZoN3W{V9r>bGm8FhoG5grIs3zwDvXir`K3y0hSqBUllCPGcP1!5rmXtEC8?({)3b%VIK+fO*ejVqP@*x-#? ziJ-?|%2=tkVBK|=x0m|TK3H0p^|=N)Mk6wqG@K z15L_Q)J#aAUR5r+e*jQ`t|E49GxnV{TouAloy5k#O?)DJ3vc>)l@gDyaDSCD0n5|q z)yhbwtye3k##=;JR>Sx}Ig3GX*tW^W>ivn?nXwrJiR9WD*-8uM9AL25K|Q8o@@B)` z%&livLBV^heXu=s{~jA+ERgTPrO9FqjkQ8;pVXHpqr_!OM;cH7cs9QuV6lrzO_cd+ z&9EmBvAR9&O_Z@lVTB&-;Hl%+t$eK}j1tx=LHv7oQL!s(puD$M85hg<1}gmps>s_# zI0%~penV_`P-p{b)(tj0oNLoPN9id9RsSuVC;u(MFLRV^^xjkJc)Ua9>2VkFj&bXh zaTp!P)+uq=H26`{d4msyuIKQrmg`l|QQ9fQ0Dzj!Ot$zq2iE(Irs410Z*-Q2fAZHW zZJ-u|DSBytMzpSQV$4y))@fjaS7_P>rL(?roi?h3=3d8?MLeA-P$XS?M*dp?aBY|G zP%bgEC}Ir^w9eg}S4n?xy)e4$)^t%A3%}dlGpCtdj2?gFEC2}7rprZU-V-6<^KVCvFLkkobmL> z@A)tb$@|`RnBBaUsq!04R&`CZW+(5wC216kU{0;4SlqNrEP~1|5z~hc zg$2Go+N~t=jgUR1mGne-e7DjYDc>sX1>!#H4yI90Q296`dUMEu3OnUKecoOrR(NDxsQQgoCff08To_$E zrJ%eI3)$xFg~wzy9o>rtL*BEk$Kwm~fPKmv;_>d{@lcC~hRJ9#M@10)%08vF2v>Me z)|GqS)a~W5j+Agr33V13?0PJkL-!-7vVgMo^8iW60Uig=Jiz0?2E2z#ZgPc#0CnB)1*TRFNJD= zHbqA?Y@c97X6>suBo=jqSSV(4O}`~2N`wp7tjMZFZbQkp0HN-fT+^0DA5fZ-+YyBo z_b~ufm-q&v1Mx=`me*lm7~g>idZ!-YYkb)eSlZ~^tg#3E3~nq2rFGhiN0kWZ_b^H_ zft=v0qe^Ftl491Q4KBKWRCx-g!;dMwTtHW$j)IKidX_s{dq{~;87n}tNt=!d`v)Lk zMucl3cV|aWIySi`n6)_0S%Bv3fHT}!!tJ2C60W9;j&mo`x#P+ZtQDvc^mouJ8PS&J zx+b*#1XlN))!MY-_@C8$+W0PAZ98pFuA=3?0|=o`70&7nyryb7sN#1tk~Ao@_4kzzm2ujiISe z*G*O_oEn&(%TFuM;{#NlR^Ecqlhht1Rz{cdKwa^K8eiI3s@%Z&4QG_EvEap@RnBpU zq^B@IW6ohRX3=Qi4d4ozc1{>`%g!kr*3KM<8lj*gjjS6N?Cxk5MkdB1W&{Togtw@( zr}*>mHF9$Yb*>nS;M4P1XjfC&c_kTk?dS`NW?vq!LypkF3-D{CP{>7vmA`rCqSD;% zUAPg8V;ub)c{CR(hgsYAzeWQ$CkHc!lq0n*Q#$AuBQHU08MqmML$(mx-B`Jo(k>~7 z?CctuX{Oyo%pXJfHc@aQXQg!=zq&#b=QyktTsm@AmhC_(%Ct%;D>W&OfLqC>dY7)S zl}g1q&1N{foNd4wxrT8fq?ktk!h%FIw^;_^1Mv!m%SD3(Mgnt+y@J8pJn_ zOSzP9&Qe>cO8S3Td++!ts;GUO-E4X%n?ia*=rz)jk_A*Op`+4^R22m5D3CyuNKF)S zfB*@I^b(YAfFPiBf})_b1SwG|0Z|i@nfX5V+?h?nqVM~Den0v<=$YksN{ys>k_rTst3a2Ls#x!I!`P z$73!RSzKZ*CgwnaN9q;>;EQrUBa0BO2=bB0o0!8=XOGk;upU}NU5rxdw zDkg;sHx?;UBj;=_%4@BLqZ2Yhyt~BZ_Drp;oS+bsHRD0~I6Qv*gYpA-eAB+#33{|eV964Rf?=VVj z%78!Bqd~HTY+-l=tTpr~4WaMClv3f?U6A1@!_F?G<7VZi!=9aCQABxPBa0$DJ7X;h zC#nK%$BvLgmn=%G`G;#{a#ljjr>{|%vm$%|&pRt(ugq~)#^ET^MR^xT87|6ne5V?& ziVZ&lTos`cf9a}>fKDvBmnM%yO;BSuMWn#I7pN|auN;k*Iy$>dN$DPCQ=jOSF2koJ5mvqz$;E7*gi0-wLfkCdGw?HyfEq&r345} zY$sZ=#6N&Oj8a5EKdm12`zAL4&=-<~UYU0rjuBbJm!lxa?e%~*m&_GUVPcv_D}nWP zi>yE09Ca2+k_Un(YJY9X?(QOMvfD0tXf`!&o3JCA(4us6{{J0txJqD z8~c+et?N0dV*ss-QA8Epr5I%)hVW*r@`7nO<;B8$F>7iKnLt$k>TWCJ>$DF zXOHu9rKY;yll&Gw%Y9gy(a>$KKJ{#7A&~ItbuR-gcxx{o8W;ST z7wv7KbQdl*pO#9L5nvFZoETpjU=YEa%_n0bXlP5pv|k~u*&~ROzWUQbCt50JP5o&_ zE9DjE9I-vnz2nHHj%}@^ijBeM`4V8zTO*DuVr_m;=Z8{K8)Yt#O3MX$5;Nj?4~|gW9!w4A)pkd5Xt)9G&hCE0nF1@a0SjWEhKdez z3FkEuhsl7sbfKJv_>7atuMxO+JPm4uEvy$6H`4hsdz%ZykuMkT;t^c=$I4)r#yUS8 z%@E@6y~e!fozliQt$Hbn;1Mgka)&WmoF&9Mn#!CBl(tu@p+n+AC9pD|ziFjyzSATEU4MQFc{H zY~zp_cvWp*AkY%IDOOkQm^&?4@_K_piiIfVeRMcHbDvq$t5LBIFraKaC!#QKE zJV1$8r4iy#jL_v;639~F9dk$1fVXbGM$rpGEg7AZFd-n$>~cmguujmnFgY)EGDHD# zs_ddb{QE3jIWjbY)^&PR6a;owjzSb%>8yx6iu^gH$Oh`74B;e)h1Y;}{_a6Hy3$2i zEp7U2jKvskfl9W+P}X#bfWv#wE4J8t^{|6Pn1gc$*@<$4j3q)jQ-$Z2J5rUGF%{zO z7n1shtvZFK!XnykeO1r4H_INA=mULVO)2!^SCqOaZ4G@EdqrYaT8$6{_7azyB23Rv z_QAiL&AAVa2XookLw<1Z#)pm%E-F1NOCLplW-fhPTVl|%qYK4n;#C)wIMSZ|r{Yx? z{B2N4r^(-vEah)Uvb?`4$dVoyWUMKm-G+Er@t=-VIXGv`>w|j+6+aAzOm^*_BiT}% zGsw=~twM%FK^A`Kt|M9b9VSEY{Qv$vQ1b8EIb(zpXx??(cp$HDvDQ)YKlIJ8_TL>W$vyDRN@U)bXnLMh#$4+~?$IqQJ883C)i-IeEgb35=k z+{C?lD1%IED5nSbXEpuYLlITv2v@RE(YmLio1^Yhd2hU`+%4r-i+h`rU^cHRCeD92SbZy|~3)6t~Fav`$I*Z$c{+h2!s)0n(i1HX{=4 zFgXCJ`(mZ+bzv)gKAdcQlt_D`-KaiFl-pOcUD3)Msd01rC?Yk^=rv*>vOVtUW_x9d zn<$~V(?=00_WEvQ^cHb8S}Y-1u47*~N8Y9(eU(8DG0rP}_1$tmTk18qI>p%?h0@2V z$&1QZX{YEL(xY~YVSk)_QQ?q;sCq}hSr6eGNJ5jz_L5;EM%V+$ubAQHxAjGeDx${2 zY3j?0L~eqMUWAwtI+n0P(e|iueG2cVBtxby@27|~uvnT`QXWOW^i#MoWpev9!S3ER z^IJ%bg>6*n>-X)i2)OO!{%q#edL*O4U8Y8gdJ^9OQq^#RDP@?I6-f=%-RrWkBftZE z1}Y-CVdy{w$qn@FK!syB$a>U+29MZ)#zYMoWK2}UiW)z6S)49h=w}8Q6V=#W&BrwZ zPPQglTYso!vSwbMf*iiPt5MeKGen=VruIY!3oUsEfs;0C%0p=I5Jf^y#Y-=C(hy}G zCa?Zbp1fu>uxw;4D(DCN#1DoF7Yc11s&qm&Q7Mj@ho)w41Hpw^3$hnD1TQxK>kKSRynA`h&P63 z7R)jsAe1p$5g68OM@ymj_;3j;$sU;r_e~a)d09+tJ-C60Nqt&8aiov1%>>?E;WwdH z>OO{DCmb+I8>8rPLsz=DZ!N0YUh#Amts6sS@Ni39?HG4%jtlkpbLudbJsHVkr7W$) zTNxTMpSa*im5Ou5N;vYfLB%Tp zhfG#<$&qXo&KYDEFH|AJp&)C$>t~&;uDLZ-ywlAa&aR^6#s-Qv%h5o*J2?Y&E8fJ5m*$uAo|V%An$h;gDbKlq1!NlND5{Ck!e!I)Dw0XGN48ccj{e za~L5iI3{{{!_%MEDu$Ajse$y@JM;Z%T$3}kGAGP3dC{Q{;R$*~+VsS-^}ScZ?O?NC zZG!$@Q<%O7 zs~K3{n@E|Vw6kBDkfJ;*Z)6o%vH`R*1s5wnEofdNkoW-3d}#YYXk;>1EAg$o`oIO@n(i*U~1{IlN~ zRLsLT6l6h%zH=l?`flf`Pn0Jf8!Y7%L<_~;lqoa+Q`j_hj`Ck&Q@&d`6)aV`s>pB) z{aftx-!HcZP+yv_2waSc0P4Tc{2!yJ$h)-A{&dBNqM}!KT_Yd5NN@S~vt(B@T8)G&O?Umnz|pgjBC!kyk`hW2yf##XzrU zMC);Yxax^z5JyAke~PQF#C-f~NY%r|E85o&VO7({Vdx^Ag%H4M`aDY!Swxq!l+bn+ zReBx{ReFek3t)Qdt98wKLKh%N+OsL)1xM0;YM!m=m>C^pqmpIWN@E11I%aKwQ5;5> zK38IV^*Uf3>?4mRc5t>*qZRPs!H$amwRs3_Sb^XlM`uHw;Dp?nuo7y$D~IL}p_#OZ zLeKvkL4nE0BUZXf{0ty!z}x~9pn%m#T%kNk?d>2Mh|+S~l&n?C#{khdqJwA{d1B5+ zjWC{te+pv^EmOXLZ$67=e1S*zqTOF8jW__nVPLxZ1&6l%S1XMe5P_qz#_Gk!#`Q%R6icQdS}0tQT@L=dhz3y>)2k z^XrtL3e<$b<1{yV^9JmzCF_+GyFX+?|MDQ};S8|jro|5};`BsiY!D5e_Ryc+SfFu$ zsFLBpb)HazJCw3vAb|1?%4FeVt&*u@;e z06p#!wOW{vQJW1D(hHUBh;>Zetmr1Bw@B%T^auAz7{qF_;@pSQbCkf$`LCF`yOyhG zv_+zcit0^dq{v55(iX*yK^TxP(vGV(A?fnBaFq0g97LK|)4UwzGFHU6t%{y=6)d*o zKsvY;-{@z$ycJg!QuLP)l8HN?`cf%0vDAoU1z~5$ZAyU2OE{JEOcEbDJ!^G6nz@}f z^K09cS>UNRb|@W8>uB>14nm#Yp}b`kFafSrVFK!Kl|Q|@ljEIl@6??fY0E_-H)!MdlZ3Q(P0l*8q=|d33R)CG~(K*`d4&vXuP>83T&#msAh-IZ|!I zIYX@}$u+3hTFRAFXZJW#Exg+CqN-9IUBw10eBiUMqJawJvp7DuX$IA;v;)+U3BABICbtOK>ryV}!?)U%1>Qlh|y>Elv5 zh=|a|O^$b4fOE#(@=+oq$G~`o8{`=BHaJox;haHrXq`dDb%5)b%3Qvh(oe#MUtMwG zgH^_bJXjoxnF-pq&hh@mYsvSRvJ%Vh%VWwwb4fP&9aq9?N|4y4uo-OfpNlH~xj_Dt zx*b=VnbQ&Oe;*)A8ON2@Zu?4VV2!PIqMp|q)iC=l5y4#%%xrT)2{#wvbfeZ*dhLYr zhI!5!V}uN-utrY6#+8l(ELu_VUaPVVDt<2<@)y6h%8@J^=ZtyFU1^Xpd%>y{Rz%Wr zN2BkGi-4ta#d znT}*RIA@UET3m$;hk`63DdRC@3z-a>cK&KFyxJ8_{~Y8 zch4$~otY>rMiV*V`y|bZJBiVN%_1ULC8IY&89XsjO zAC-7>p&w<}Ya2}4epKK`&8E{oDv>&8UaVlp^A-O*t8=E`PZ(o5CH$m3=lbb4p@JtV z{U;^5!4ebR#9i(V=+EdJW3+3Lp%jbl++uD(;SBrU^b7C;n-0=kTmkB}1gEL|CnYrS zV3HHMb+)Z0oJHu>`6Pb6PNJN_nw2`9Q>-rAT<{2}6oUHobBdeC>W$pH!Wm8hKG}FM z-|{QIQ$2czYJa!!GRQ{mni=W*4Jzt9XMGsoK$7>G!> zOv$#`c4q4X#>}2m0t3||e;!_4jLW%gwI=v^SVSM6M}TP?Z4vjmk}IAzZip7`QEm`J zVaIsAgL$8{*tYW}kv}WZ9_J3~qYsgnNPuyREk~Tse8bliL{oo;1O4^3|UgpwTR$n2So7^GyDFwu_jzi{irxZmXSjj|2$Y)QjMSm2>s4RY#unmXQ*Z z?aDmyQE~+3bxo(NN6AyY(RleHjGRQMU#7C_0n~0$=UDiVWxI8e3l#tAlK{iG#74o2 zONtF?5jt)J)E~}DbCFqTsQh*EE6TX6tTE?(W(W?}>pzp?Cg(Fpxl!7WJ$;eQ(nT7XE8co7j5$#i8kV#U9`=q@~m5c+7&YU;v7e^IXGvK z<;^n4_{C=FFE-1O>eeR}R2x$bDt<8>vhJ7aNOfXn1y$0=1{Gc`On z83qkM35Ps|sWTkOR!wKJgEq5ung#WZ1H!4>Gsk=>|A+F%wC=jH+3=1U1ufweeJCu1 z^nw=nNgHr23&gzTrt*a_kM`C3Cz$Gw#BLq2Rui!G=rbBY&#u*)2q)^~wHm{{E?=wF z7stoeYK*J8u}G;Gn7r7+Vx>8ZB8ZhI@uMuF-;0zc;>P~RmjuzgsQ{1a_8XjOiIn^s zoBX-I$>@vWeksN=O1j;DSDr9`HIv%^jyTzdne^)K$eS?J^52y=+0OBz-)|`mY2F5{ zZPq72VW#TjJNK>&E%-wLk|2HYhcei-h%C31Hohl!IPu<%BNU4{?zcU5<*utY2K858zIg`bmF!Wh6{>rD^K`*m+C6+QOzyd&9*<4>fYh- z&G0+Qa2|}v$DLrMOLvf|gs9+MrF)g)0nTFOT|`2#7HpB8rpVW#o!%(HS4*T*C5lMoiz-!``dt6orCzma zt*Qa9$#&&y8dS;?Po@0rv{Gd*uAlo*>EpA=$$+yHJ{5+0tKNjSDm$Q}i2DL@6uQQp z3#fzZQ3fM*GW9D%NDr{7Wo&JRm*bX`Xni@nE4g%{9Le%P9%_*>5oq-u3i7(luxgc% zHteH98*{7ZWp1y;Fd-HI50y!HsOp;C^h6+6TPq%jK(N@4z6#kw<$f9>OY)4tNNJGeA(!!xCE?GETeZf?`{j}QB1Tq)1S`!1TZ&nkK z1pS&>71dO?PJp$bNuXaQsF3|D^9A2{%KCQ#QqJTCh{6TT}s7v)`h2z>jKC!*NBJvs!9CpHxLK;ZO)B^Pw3Oa~O&N9`tw(vAEg{ZdBYw96~)T>mSdm8TCSt|lRn^53`dO@`rgqA6yb(piQn%^&ebg!m= z1KRRFK%R0=tIp;_K9g!vW%%rXQ`*R8sPn) zRE$AhxREA$t70RPQocmqeomR=?Jqv8pi242xINqI|46FbzaK;OR|VCA2L_egD<4R* z2ah2;gmcCaZ{4p#hC?yCu@~<gr2 zz=!;>jlWfS*v8-Vhb_A0NOKMMF&aLS?Y zGvd_2$dw%ur)ppq9XjgJ_cXZ{7|&_vFSS&&$#Up>INb|xUK$ID)U&4AjTY5W2g$Sk zUtL}o1#imvpBQjsHB92exv&K`4FFHQ8=mI}grJk{c{pn$> z8fl(xq66yYa5~;%fG4_znG9DWP)MDqM@@CJx#;J|4yowpszWNmTRIMj&x#?5QmJj2 zt4FgE3eM2ib=AE(qf75}W<3NMg02y6l&_0*h67MP_5ACiQs@RcrX3R124A zybKM@rERq#_<@1lA3r-%skoskO1>f*siJ;sdLytD@Shr~b;9#LcV(UQ1zZT7w6`Qn z#82+$6xUd73bMY9RiS)?;M_F9ZktLOP1NPsURyL(1twxrQ#A`m z(eZrrTDPfDmEF=#{mFDd=I5AYnrJ;agked zzNmh4wW}vC3YS`20Ij$K5tMYH%tDKst2L007@_|~x7D0&9B)Us3%XKsy!j+5YYydL zJauiMidH+nw@_c;;9e{Z4JePGoTDSHnRiEEoN{n|Jg z;XpCgEYqarVItZ7N-MPm-v?@(NL6UmS{(#ezTYCn3Q%b^gu_v%<_h4)yw>RNfXyp`wZI6BNJf z=>Q6UQWZ^fTRy4EveJdWhe9uJ&Y(Bm+-X3}4X$rNcOQfA@y@yqDsyRDQQ?@;GM84&m~U%cQ8sWZ7q(NQJpbAd zY4c+^$~LlN@AvIcyt0XYZ>L7PPX8*>)(Vs8-yV~=i4xkY(Vly7E`SNp)8JXaI81HN z1R40FDB|H}gbW)?D!`b$Ytdg}LJ@>5+Y7BpfgUA{1 zu+ruZ_)ub^57AZ&7Ir}g)%!mu+Q-=jJysOm@=R0Hj;ht$adN|}CMu)sfa`QQQyG|R z;|c>Al3&cOANttvAMJ49zjRb%Ja2A~wE6OE9igEKsNji6Py;cQ%@WjD*P~xX+FE0_ z1|~p4ZKAn2=eYytsx!d}NpMCI+!O@H^!nMg|_~t{Ho6)k(&+P8;17FOAKM|eOIQvXKimf^{u1^R}=%fb34!51vzZYCh z66&&=ePvhUl`Yz6g;br-ALXFTSlaoW)KD{0vnwE0BRi|^_RR0boiUdctO`)%z4+|o zJF6j>x0#(WH3qBZbmqA%#5vFNd670Bo=e~@3xe1#Oz>ovN^?1)i`oRNdij4CKeMXI zo=0vLdE`B=`!@2pqJMYHtk#8RHvB0_{I{vYQ))9;j;~)uoimC=MXYiDQ)&(7)L-d9 z$7fJ;_|$)MY6z7-r3RRWqXO=+92!w|Mz71kSeQevBOBrSTSm9>`XLM$2JgrXc~J#$ z{hp_*aOzDoB?hM|Pcx?mJX48N+dadxI}Yc(cH3w74`?e1!>zOhWHLAH7Nu85jJMz! zd_#k2i=SbpjqdutX4<=Qpn_>3M_jk+kJZ?1LN7| ze7?zp-Uu1vN*_F{)-tE%8=5RfWb&o{o0RXUNoAj|(0>mB3b&FedQwttJLyPu_Cy6$ z$uWaUL})4bRkc&ZwPTJnNjL|sKE1kZI~Wx`!;6|;9vVfXUVvp?IqUI1yX@Y*jSse^ zo7zga>x>$d_$;&^^;!z0t6n$t38+8=yRnYu-|%4sD)L&zSH2iUiS-}bYB!utqw-J` z#7^suU4RP_TSu`6q*_?4TV1mk@U>&BLDPdNFCgWe0Vz*0E7Ulu*8>Y-52C)!NqQlp;Ws#F@>Q~eZ|-|NYj2lP^hnu|?zZ{WB9(vr)( zX<;w*S^WJ2|J7I57Fr6HsS}9~OMwCj=4^{`@&*;4gM5Dp*D~zY2 z!Rogd>y{y^$h$f=L>+|-;)kmJk>D>fhHNvR2%yi0s?n^5`vJ2vi1J6kIq}C(IQ~+p z;V|_TP^1mR(ReyD3at$Qz+g)L+8M2mN(Z>mglB45 zsK<5{P1lFRbTE_mD=OE#3)J@Hg=HPd_rYjxSqyuPUH-7q>Y_=Fte&mpQw^he8-YjS zJ6?66#HpjX!*=5lLLHZLL$8le!!X9w5j-pV-_kI`8l z>E3ILZY;etO6>yjrK9vosY%o3p!>Z4XjSxKZ!%gPEj+Zf$oFFlQrt$fASfLT=jC{6 zJw_E3Ma#$VeC!>=^HDGcbG@F*#z3;bmRUV5!n2yqju=2apUMgrEu@hJG+`_>5A4ha zz(NEy{ceh%n{*W3`liZq#UVRCE`H<4#3cuGhk$9yv;azYV2UKa*Dx}c;nDPZgE9T^ z0g7Maby_&9Ro$!!Q6``kJmw2T)4tbLw1y_%aeOs`GyidQeQG=Hp#bY2TpvN5+gH>m zsy`lc0jS#XYEvP&KNzouMzF*-hs8PziEVxc@|pvz;rPKfG<6QBP3OnMZ9Iw2Tmmr(f0`>3uz&0$pNafw>P_TN(|@9FJl&roL~#&{Vqh6?0Gd_M&Bhh;=1O6m z9-9+LLw+uGV@0Y4`6rHy2(akbC6&MOfzqD?$GaS5je%OM#RytCctPIDZ4_W1UCVq%F;n>6q7fqyZfl zOnz^xF}hG<96A4tk0ky@{Fy|j-oY%7C*>V=4vuEMs}5u-qeIxJ?_zn3rwwTed?RA#poIsq?<&TFTdS%e=>jnm=EN5JAA<7o%jJujI0mT#iFTiC`~yB zH0A*xf}M8LTOTsXflfz*T|(rzAc@6m{`n!3#Z1Az0SCzx7OlTc!Ft(EHK(evLMPDS zW$eQdB?Z&4=-1P*sjBE1JXikgo~kyK!n1bP@)(mTmb|B_0`(6AD8#YXG}u$n8AlbFWA=B=GwVC@NIw)Sx4Eyj&7s&IWe695W*j z?BX$-({|CBH84+hlE+7erUIOfoN^a}x{9WX>r@ZnTnCuOp|I*g;9_)5%N{n!^lNAG z(2p^C#%?myR*aF$1YSaO@q(~XB62wFa9AwLQKG{~^^o576Wfj9umgNM4<{mbyWs|HEUck0bb)(& z7L;_X+Rd}D0u!@hK8!PkI61?@IWy~)mD&Z4@uohr)mOxBhi2a1K7o`!8+OGn?utxAVy`i37BUYHw9zocWu|4rVXstsJ$yQ0F<0*Ii)0o3zT zKA(c~Sj#z|!c+SFjhe%O%GF8mclb2C&|Lp;o@hbHeyE~QdCpL-Dn!=aG05l7ZLKJ3~$X1&|hDct=1t=kA=*(lYjYAgeqH3s0PG=7=d zpe5r^xkdCFC=C|ijRMvY{eHt@;As*TsylCvC>%f!JG6j|gO%F{pbbObM7hM> zWokOcki4A7uy?syMMA=`f6E0~l>%nUK-jYS0X#w9ZXv(LN46D>3?eTtt%_4X44sm) zRblSU&sJLtS#&g8eNhN580~FL8)(1^eBxA^xXB@K!@0^e zhFFopWqs-sq5eflD}4Otx)mNRt?;FvSFyr3eGYd~8v1ZB;1wI-y{TZz^FEoy!%WWR zl(hy2aU_2&Gf>cjHI59FwuYvzR{L5^e%EW#ildC|`FVGi1u<*rkEgAe@HGn*BjeF&_bP~aRd z-GH5}k|!zsMQDC!*TZgQPeTiuutC+e2Uav5OA$=!1~tfxG3VFxY)5`q##EQWB4wE| ze4hPfJp9-POC5)wf^$a9d(jeuif0dpyy{bzIFc=0%w%W~oBmdim2$RsMlbDg(?ezY%t2C1FPfF3>x`wT;8)t8qsF-2T8)g>6cgqB)FqOJb{=XW_pMM^ zCsEv1R@S$4hm&sXR`mtB?I*(2qWrBeq4v}Ltyq)$so|GM?72)mzeK!z5^enwn&tSN ze~Kfl)ZW|Fy5NZqw_%IVqGj@D-!@R}reC+IO~k6x!A^Al7+?l?)d^j=@pkncDNTay z(j>^+@RCW5vT%D<34}>#=xr=^dC9yTYU}!jThLV+nQ#jt)l|3zC*X%?;bnO|ka~`9 z4Ts#X?VC*h<=MbL89cx_69p|qe|=? zY9h(atH_a?^D>y5f3Qlh|D@lWL{igPb3(In+CwbSvtO(I9_8sqq?VW1d3u-vXIRr* zHBNqICmR3B!7=_)fWyVMmHMD#wf ze~4YLF%8p&R$fJ>|weXiWkM5nAkskpUFBAI_r1S=44fV(w-dzn@)$ z-|pvVe62k2b1xd5r~3lV-7rJc`;gyTUV-#wp4!=ydB+Xe?$ugSa>ExxDCB@T8!KVe z0ku8MQ!{{r;(ycvsPup;dXskh2Dxs%DCHadhG+O&29N+;q?6yUad+PMW!Aay*bHWW4~Q28gK!OZ46rGE6;LA5%T)#`)N?X0&u)=f;i69Vj1 zd=Q#{B1Im8w%Loi9#SRva{2@0Zc=vPl3+VzNaZfo0-BNXy~157`Y>d00boAmX2U`c zheGJZ<}Yw$lj6@R$x6U{R*)e9bj2yPQ*6?wj#L-ZE2xg7Ri-lIP&~}M3%@VG$eT~6 zzf%|C+nsr%G#Z7NnxC`mnz`%<#1LRqj;QrR>{Y#$YI>~#T&UwwNJldz)cYqS!u*uC z02~rkz9P4>qDLoRx%Q~qK5zrH{L1TDrqn(>s@8}0QR|o*Ew0d;QyB4a@tB@%zy#xt zAz-n=LMAWIU|M!ebrTosI$7n5_Z(B}*TkRnG7!5=kR>1{8%htLVZ#AtJFP{^f>9O$ zjgNz^gb4UMSKxShvCqoaV&iT=;tF`pylL+XBO?MWM&T$MkGXt3sz-$fYkALB(u3t| zc(A1YCOuf|cj4CLal-I8_!}MvIIwzC_jktXs?4pqRX!RH#YYRhIM?x8-;YKUuUKj z`JACnX1@ZOcv|gZ7RmD!OehY;$by!pI*x4HOiIc}_RUwcBCS~fCAp4_qrE4>MAyAx zXVi({n~oF88c=q_F>KTbC=V*|8sq=(F4UG{69>Xa5S{*>#k%Q-DhqIE`Jy1hHQ4h9 z=>Z=1gW9kK^mnM{lJ#H_Iw89kV&L9laps{(=OZedK@RejuGr``eA8 z&K(8#!YkG&>150Ya-*CCQQk)fu3;VKedIU;=TmqcHmL?>_u>y($?w!hMxEzL>e*_{ zdzAE}YB66%%3-3<1k8ouKoKgugY)FYR&^=*so~;phzSARzps~bX4-yJG>v;|xD0PO z%kWn2xKfWw8`;LEhKE6AE^IYAL}J;dpF`5oZt{P6I7k2LKRrAYPD0B5ySA15#<{no zw5NyHkZ)Ns-FQn@NTxry32!7kGbSm}>5AimbNIHI3Tvi2~yJzOK zUZ#41DQOO5Noh>xV-L0oe=#iQ_uwmQ>>pm6=3Y_Va0hR|Z->WI)YQ=~boz?wBFF4Q z*;|hTjP;5tP#78%aC9K^UT;&V*uWF2hu8JgMG%85Y%IX8yr1qAKtb4Tq7`Hb&fMR} z)R&S9kq0G0R{=6FD!ULHYA$UkR5_16kd_9751^)3^{aw7HH&&&<*No&#uGoY}&u&>9{{O@2ilTQ7>){e}qSh(F&Kf6g+! zkE%j1#GKhuWa*srs~S~_uh;%+h|m~Agu-b%&U{OuGl7~NITVM5O*C7?MdhGFVr6;x zL1Bi#V6qJf7(+fMTe;A@>#7xM*XP&OcQKa<3(H!<>Xu)_=vQ4`^ov14`^m8C!hkSX z3US78x_$$3MRPUItF+_)TIr>ma75sPHl6J*&!*jk+1-syC+CM?qco%tV~|1w;j8_6 z6Jc<8NISO*b`l$4%_1fkGN}yR1B#GJk84I3adE)XBDfxL^A+C7Naeg=;+F9XM&kFI z>VZ^e#0U13MN|9VU^UF8*PSwJ&}FmPol<^N`${+#ZyI*!oR$9kO|5BOfzbKmG5Z%kSD)X-4YWh_FM!T;=aBK&=RxTk&sJ$2B1PQWxnsbxKNvI)+%c=Q zPRY>2O)}!Hwnmd=$tw3Lsk$bLgg8#}m$+4@a9sIl;&TelVSUa8rqbHGR*L?0WIc*j zoti!sXG3lFHZ{rtKJ6#mfec5r%%da`ic(KRP?AqnYK{ zAve&Ga;c8mQRig_oLG$q`goyWECe3C8j9+NYwIh*03qZBIL6f zYY^VN0E>%GY4nk>sjz{~G*M+{^d=wAQ2_E(9!7ddP!iw=ny6qVjJ%V|!vT6rGbbP) zPSaGOFBEHnrx&)?UNGHT_>qFjT!P!Rg1J2>M&jv7dVOj;XU zG^|T$5N$GPfhLVDb!JpeoBnQ^o6cze?LLW27QU#P zMHAf?(fb|Q4?F8SYfd6}y0MEUvX{-GPInjVLtYR|U9=If-b}7qXKZ3IbZ3oggtv2* z$~N7lCpj+d&&GjN7FhPIdDWi=+p(d9Lm|z>lL{QUWzH4mmStHn-5MdO*Uw#hSMW$G zn#cOx7=`qbpFG`Zeo~3Ekd=l{+QLDyOYWLb5^lL`FA0`#GStM15B{=;R=*|wq#G}~ z_aC6Yx--Ipj^x$+D%eS0Ag!BS9$G_Twj_OC6h!47n!9+0&Qz7JL-P+SHTKj(z)$%{ zgM(<0r#3*CZ6?x$;MQ}@3E~8?rw@+~q77c!6XJD; zJ$(}$0P;#K&>_pL51P&IQrAK3;zGqL0Qyj69JJRx#oS8?HRG7eo`M$q>B!m} z?^6e>)*tK)Q!Lyh4Kct0CdX;^YPTcB{N&hO#g6nR?pBE8qT9xJxm((8rV2fO+mWi| zmY~Xt!g4}rD({a$;W4%MPVU@&i<@I0)*$}aKa?UKW(!ejvy=h7g z!XJ%mK$IbfJGd+~bHY9>_q#bGMVbWyB$>#+>Egi4SQGW>weurGG8;x?1mSyOLnVc3 zqKHPUq!76`AZpsTEGl!J6P9t0a7`4jrhB>uWKM|130@8tzp5QcUbRa-#O!TWCi3ig z(6`}QU+5+|!=TEwi-52Kyv7lINn63>yd0b=FNb#{w6@_`4!VC>Uk(-i;Y2zaq1EI3 zNmPv<*P{I8LNT#JLv9KUBDF9xP>wr1SC<3f!_rGfnSpJr>(@HAF$?55e>n2b+TWS$ z3dmHW&a2epM3^giMr*^wTx^XisFcS?ca9+HBTc1s(VD%`h+Nh4fbSFk*pXS3Dtr>s8UC%+S*cW8+ zwXH06;Zh@!oVdK0UW{e_N{iKm;f5}GN$A*gJ63BT)W)p4&K6T`n$@?gx~JV=0O+d0 zHQ_Q5P9jg4UC{lw>cL9ZLq&9b8J0Q?QI(pSvzXHZchB*h#>8nu%qNPBIpws6B3_e0 zxkZk1dhsSbUrSpl2Jheb_Yk^MTdPG4Yik0J%tVoOw07=hUCzRR)DopgT-$|yP@c4^ zwuXYK4Db1YRM2U$MbL`2RpE8Crv;{ z=$ARq(?ruoAUwqw>Tjt;#b{tm4H~wl+u_lE>UbsttbtKz$ zmB}7t7Pm!(LUvPaEWQweiD;;Ld8jKjiHFz}DRXeXpdQjmSAnVl@|L|YlW;Zik3y(8 zr2+cW$7>Nd!O6*K$Y!n_b3^>GZbfpsxXP<6lD%5EFC%^P>NaBmwvUE_(zNXukD3)s zp}X_!TfKC;fGH?m(L(Lsu4tOqO!E>RK&aw|YKI6uJb;gn;M=`0@Bp4}rj0e9FQ_ti zI23ain{vT%?y`TWnDRsC4Kl8FKQE~soO7f~#W~|c?fTK6;&R>}CDpd`j#TB9s8Y@v zR2+Og%Ty5$esH8(fOB}(VYI)hF?uZdbU+Kil2(xPShy2i+lHV}Pz%Gic(yf|(oCCL zYZ1~AMusU=FT3?=jdd0V&9&B=5dfg3Z8Z0P4;8?N-vBDils4e6A`2x_oNmG zsgs?1G!VXhUAk0kh46)NDM8+oSlPYkOv6z|-Z6&?sBlL!YZ zv-+QpGFcz+AYwI;2-+#l0%qeq$av1_QU$4|FHN_;x-SW96swrVch}Q@yf! z#+m>SGQg&JRoV2}l+ zmED958BF^+SK;7lf`hMj);LbFV(!HtYI+UU_Oo5Ij+h}M56P1f4vYlQPy14L%2AKF zlFv&ht0~^sN?4&4qBE_a#Fvp#ahBz0k3FT2%Fp_AnaVlC!K=*f{Ia^ZV9IW-&dgq5 zii6)FC6C%Yt#x3#+>Or6xP=aOPiyT=r|9(4@Ef2$;~8jOx+cu_8eM({oIV+NejRo7 zlsnIOcGbA^j2Y`Dy=z@7Egy~6?yq;%It%TztJcnflmy=_+xY7E43=lL&rtvDCqJ;> zY96+mKW`YW$c_B!S#1TbsQ%~`(gP;0nDCr7(0M)fLMu%O2@lQ6Uslu9jovf-k`hIi*9z)toWX=p`NAaP0(itcGpBxWqG29Hcs3-ETUGW%-7X>@Nb&i*hwedn#-S~meqR52c0 z_i>dIxMT#xQ5EV%E&u@`aWocr`m zf4SrY=pen)U#sITcMwKF8lX+EbOTUZR^e7>lU2tgJT*Xbz$7dlpv5~E`iV;q{D4cT z?Le(YXU44)F950ZI(~|)y&4Prf=AHnZizHhsb3aV{PUXpCuI!OnhNwfcY$7KrON}g zW?njOp%Wfgfko)%!U%?*Iu>KkL0|*`BdWu+5FHrtzaO+_kXA=Pb{=R~JAf_>M7hq~ z;hL9Kicf$EE@s3$@l0K@i3GDq|Ni9HPW7WCTQkUC4NhGH20ZV;n?5 z6(!$F<|6?wQGg=%?X$Dq}E;5!aOu2z*8Rzdc~= zEBt`;SMUG>bMgEuS|jHrkjy~37c3n)LbLv#M*YSJEgGXv8=+M|E&ez{YgAj@v~gtx z26mbO2FCb{;#HbRc*W`x)d9hEgL#_jXpBQgYHrS}GX?14xRICy#$ObaPw14*bi2il z#@I}vG3Jld1R7&=iN-i+gpWXDWYh;(o4`~XrP=W3mh#VwMrjRk)Jh)xB9B_jqwvvM zL&)oAM{D7hA}6#Zk8J;I2(A3^&a+f}shJNAy#JIBC0$lr>Go(W+EqXvs1&%wA*&;c zjvRFejFfy!SH@_!oz5OQO4G(&Gr*H9IIczqTtDm1UAMn=l+K6Hnfz64y&1V7wnCQx zyA*W;&K#uZtk<;0>{<}0G8uPj)S^t6W+Gd|^t$#D{=i{P04%-Ej)V9)z{=>+*UN*V z$7?a<1w44+4j5)QRVZPi3mncLwDP3(t6=J%NZi^NCzIiG>Lw#7datC4tIkBF ztb`?poH9IdM(;6~30fyHntOHE!6O$7R|wsy5eHX}jFJmvmh=f)hPb5Zy_?8poQUmb zGQBZTd(H(3;Z9ISxDN{Ydq>m#iCSkFNDZWkyEg|=w@L8e@1xO^w8diP-W1^x3V&1k z3}erEQxk#5F!`=_kDr&tCR@arM94>*voe_Y-jm;A#cJPMaNO*pyKiZkxYg{pHPQ1e znkGbziK6e`)|Q$}4jQb(x)1t@3q`i*pd$mULf!4V+K<9^n2$nMBj^g)#J=d3nlrNm zIqFx-!YLuHwNNUP-qS=3HupVk9ez5fr8Q{U`&z6BYavaG@+V_|+5bMAX^6yfSk~tQ z%?QheQquz?5m}g{cvJ7me4qLF5wp6rgF6y_=Q8~;s>x}Qpxp0$QPhJ zeyBy7Qs^1^GwMUFgB-mN-I}J=q>~@wYyC_&KGeEc3Xy70O;Zran0E&*hZm-3{+MWg zS}`UefZm*<^%hBk)hRCpKDWD5G#jQQeyS$YS!PewhT_xQnyP&$u0c6q3I+}U%q7!c zSOWla=QK^k`fg6+%WX;8P~5o&-I=Pz(zi+4b0YI9S?g$ry9Ca$lYqM%l8mKhrn$*l zKV)5kO|tU8h&2UfOlQAjguKD))3xWsW04J=qSd9V)1kCtv8KON+Y~JN_(to!QQFVI zyKbfzXCU}$rZqFP1iX3C46O@V5j0BC;xME*^6%N%N@G&AJ{Z#86b*gIcDjB9!x|Kg zKW6T&%dIGdqu-h6W9XA}DfeTII}=*~VtcQ748+1rEkyr3Y2sC&I?WNk_&if)YQX{W z%Z-tL86p3$W~NpbPsszHmEUDVl_?FM7YHx`sWvV8C2d<{V^N>nG zpFo4%Pa{9k8e1-T+2XUhZH|AI!BuUqC0b#$ZxLpObi00dOHHy zDibD-Y)4=gUO|hk9mVt+9YC|^YR%!@%bSZ`A&YL$#nhrba-@F^CvT*c_MXR^MbbP> zbt0{iKd0t_B$1rvLndZXqxo7q&>x4)*F;CC8S}NqULwl7|Fl32Jp$p1gc^^d44uI) zh>N&_Gj2972*DM{vd&yZ9Vj(O)7;^uw%Cr-uxHRYB{2=lWhT9srbUUiAr{+78a6E> zNYqZ--tp~9*=xLAX>*?(ABsq>?MgM$Av~`gFa!=;IXDy&C*te@M~Rb)b8t6pv%)k6`XHu{PyMR?7xMH8NM@uq#BY9dc2YsDWXQ%L6iS4_1Y2`^FJ z?y?xV(y)&kxbEKM{-`q2@y$Hw)6cZ`#M*X3<GfYqGz>uD?PjkdUvc_EC19obI0e+o8CHpMN(M=?{sg@|c)qkRiC0aq50f$&@} zdM`uM`@F9dMFI(_VOGk^&|VT%IEjO5$5DF(06;v9n8z!@q!n%}4WQKou9`#}ip#=0 z6M%AN@*9u0@sV9CO^dWw@yFK};hOOj|H(>Vmya6lN^2KklSrjoix3N(L|qnZqIiDB zV(oia)_U~E&5k`L%L9Z}G;s;YcGLDH*z%G7*X{GL8mP9@mO$PlQlm^Ld_!nh?QGPb zxwQ7gtG%14zgn6|(4s-dMus9y9g&P71J-dQqY5;OonMcWK2@oGrgPX1i$6no?=N2-D^E2z@8 z8dMBwvsHhwZH`p=xRWu$f-MFWPa_UZ*R@VDTO6r!Hdjzx+gODPhhjR+`CDjfpcdc_ zYUBRfHdMMYRJaqxbg$arc>jy*E2tK&t3*}9j6*>db7HL{SdL(010>$38o;~M9>$SHbNCt1v(2bPtZGb#kL_IcYj@Z|WHev%X)3J@3 zz`lNB6B8WXr1df{a-vOF?*>c1Wb@71<1nvdXyIn;{{Z^gtO>+K|1A(;iS*7Et-Ba` zldx~($OXQ27zdQy!u0M5t}c_>7SWm=8be`Q047oxxjz8aN6@$u zsohSk0s?#fPVIjOf!%u-Sf(4z-=#Hw4DxjgjMsIyCeXtzfDACb-P20bcVifdbac1Y zgHJb*qi9*G)OZXGcBAS#`XO@AU6ARE`!uA4h`s1-xgpF#drFl!`gsrZ*KYK1k2V)K zPW>9wyNE7*&3dGFt|mG!#Y-#MC+m#aVyZ#!C~v2pOIX!;>n8Yn^o zI*|Eo05#bQhMPoR>}3_^yS>mjQt8fKtz9!7NGo|$Z&5bQO&d8nAb_z&{O3`?Y}5%s zzur$D?$hEtOFe9DbZW{`lte1ohp-BIMDG`m+Szo!#xU8>$Ve6J)Vq)*XYT^nx`vp zcc2X+oGrQn4?U~}iEZ$(CL6giSUYVxtTnKpNgJwiyUa!w3jPW$`b<_K(73JC>|3Z- zi8T0IO~7z}@U7MYnfP13g-IZltL~H+8y8M(zSAa~m##L1B4LM;Un*a?=pV z#j6Y|uGU}0R1pQM9H|!J9H^39Xho1Vh0Yx{+`}QF99*C=#2jPA##VdGd$4v-AJe)B zbDqJGZv|_-$f;p7{t2aX zC&5W(x_450MV#yL$0e%=Vn@!h0EtWmC01cVpg1XzvQB|P&9v{779q|Ve?v6VO0K8D zpDQWiG?vTnt?(Tm2M*565H!EAZkC6IjFN=4u=*Z32M{jyA-qvVFhC1`N?iJ;%G zc+}JGj?ujR^)7T3)j_o4%jI^^nqm1|zbuj+U&y#Q+DGPC@5(kNiX(v8k^@Sz949Ip z=L`-gSY}YkEq|FLTbu1jmV|Q#S?*GUj5{VRWh!$?CU5zsOzQcAw!_$90sO%wwIX$T zf)z+)O@0+w=)JteCYyIwZnA?$!c&krbO21Ry+3N)v=^p4gHIjk?ZsC7)`kzc?*tq0 z3w~lvIJ#r03|k@F%Sep9^%L8v&gXdFww;sqptvBiBC{i=8iO+!`8UqI#m+kiY0!;M zpVON9%>Tsb`cTa_^Aqwu&)nVVJX_#P&$HTIb{^LwSld$#9AvnEBz~fr=?t4mk6oc( zFlvLmCD0-|feQ)s|7d&f_$rF-f1KIelAasxO>P>=P3R?%&_UXYpeQYfovsL?G<|G{ z5Q>V_pvWQvOb}G021Nw~lK?6RLL#UrEfGXiN{~(h`MuA~ZY~hz6-r?##~Y z%uYFT=2V(+C=^603>HW(0jwS=O-J>fX+>m&SXE5e+z?CU#P!P+`rYuZO>R?)ewLSN zk1=yT0z0}k3{DPKM7rb!Wmhf5aM!wGH!`2ZzpP)%A5jXDaHvG;wcYN#0&~g((9n3+ z7;``(^aTebLf?8o-j!P(ESCRC`J>VPo?T5Eu(I z=&;~iY=@V)`A5n_>9VSU`^?@6kE(Waz+p1uQU@$fEeP5VAF0@HPZ<4*%4=%-;RfV} z8vv4$l3lsrA9fA$tX-2c&#ESapwFXPcg7o)D`g=MmDVXk{~O{Wz*PsXbwHrE*yHVb z$9l6=0eeUFCwpGySD#m}mP$R#=2*34sD?SJ*1S2DYZbih|BC5vS+%53`?n-Q=DN<@ zfyc6Bu_bWNnCLdL?oPPRaCO}3gl8;e3J9)YjM1oRSs)Mph1D>^k4ti--SP7KaAZt9 z4ptIk{vI#yWBb&h+l|7%ceWD+kK#bBN?NbJDyda$t*h9eim_nURx#koWY!P6RfZ=( zh73=@%4A2vcg>a^k;<|qGmOb6u*4D9Ve^VOv=H=1dGCax8I`|s9`Z2k-y1LgQ9h5P z^~B|l1M{gT2n)q?f@@&nMzsL|GpfU%lIK)d@?;&O?>@LlSo~*sv|=KFx#xh#w}L;h zM>Osl0|IM$1hfFV<`xGUBma_07vug?n$Q%sRJu#s`Il6hX>_ujYz)@UpAqH6x#WbR z%;%F&miKmmQu_ICu*^0X*Z-FL^SN{7_d_mEiYUp~W21Tba|m-=cCMUU4mLV3^}+5v zUtV7m(6{fHCP3+46T zu-oJeCXFh% zua_K*xs6^I%f0LsE(3&E&Y;(v$b z(-7{XVPX~qS&hPQcGvSp+e<(+S;ojq<#F-1VhD%w!!FP5rI*anymF34Gs#Go$f1p8 z4yv@VP0d$mWBbK3I8^M2e*+%(Y3~-W&OkxwAGUEDqkOgq-ik3(RYkhLa8u`9M&^(Z7oX1<^i}v_ z#voSV5gL0Jj>*k+WwFX^=DG@i;Xu66qs5RUQPMG%+4-Lu8>xCxt-`#aW{~pf4>=ZJ z9Kh~nGx*5>25T}t)F#__*Ty*3uIaeWQiZYUJH@8gk~QS9M#o>R8%?$P@)-_RQ`>ccCksXvkn$+G!1E_DT|0I~=pM%0 z+LbMQoRb{{PJ1knwTrM6DT>I7b^70YSs(-I;>Cds{Apf4h)Frv*^_oJ|0RfF@$t}L z)-=LW?ATA$)_%@=1TzRK_^ZLP+Bd=M9(J6&LRd<~7oV%>lT%>NrhoZ4*F!KQ7x}Xx z4DP-7q7de5wZjghuzzQ7fCGa(HDFuKkuOcWRuFvikOM))Qf$q&IRO&$IF)W6*{1M-aMpranwc`zOL4jRgW>Fc z?I?5{sy6WO+;BD=?WIPbz5Ql;-6Lds2(RdCH+6}r0AQ{``T0TA2*}Li@5Sre-;4K! z-C5;Ymm=|5RKnOuoP{^A$~T3xfA@|JSZ>kC@b-y?55AfS|l8HSRpBt zdLT-u)l2<;&c%A7tJ_>`e9BSyTCwKCY?jEq4!&Uhk5A&{s11&!uP~t75X~1v!u8*Q zGE5R*5y_fB7l0Sxu@z_*hKuG2JkS4gj{3=~S7lN?riN6H;ZIj(^_^cqRfT3|VO2R& zUsh%5^v<(YS=|5h&W3JQhg5EAt9OoYzT3@w!GDs{3n>QF<7++4 zT~!5ML_|>19iaUBGM}e;SfKr#i}ZbMJ*c;KvH3hz)l(rV%($6Uuc4|ZsGd|B;VV&3 z1<&M#^olvwE7Dcb@F*0O!83V$)c^5wr$wpHZK6JRXB0m7*XinWuSKy`rB~EUHWX%t z+t$y$fp6eFqtTZitiH4`vU=Kpk)s)@L72J>Tl;l}?LxbTc78gVxscyV={Q^-0~eL; zPrPjBXtl^?^JdvOp@a0qJ!`s`Tz`lMMrJeDOV{A_KRt!9A$#Co;+P-4}4{JvOL*CD5F z8($ntr%NmgvP(S=z95#R*gqtV9KJP{!67BT8p|5kmlJZ~_2XEJaM|t-t6gJsMxMvz z)W4N-HE5z-r3j#WP8{=*QpZjse;PC-cgC@0+V)Ep-jxSGl7x7@MWvMw{$-_Gc>4q< zZgcW;c*bjn1Ji%|o>S+QHBPAoD}W zyZD1XV3}{Ai2BhVQG6Cm5+ySRc7=WuD7Rf+&-pJtW**exq-^TpZIk61cqW;BWS#Gp zWne1QAxwKfkSR_+A%)csp@XxmK)`XO z5r(VyYM{|&qa%zTK_PjRdeu>?)nIV7#oN?irU&<%?3;V=Z8dOcp1*R_P*!QMcrPtbi3%JikzzMS#I<*PT4Q zHgofYIxJSp%H}QVFtDZh@H#knyYbKJu-2ydeG0B!bm5syFy{kqugmJNDZF7_M&5<_ zeRWxD_Hd?s{;9!?gEQL$QHZZNM6laTz;9 zgPUUBJDrjHWY{pPX?QoCbw^K6q_an4gEd6qdx5}yeHyb`vRqBxtr>`T(U>j6Rt{ge zGX|zq-Spag+8&m~CpVEzE^NZ2FgAJZEAYV}8#H?CZ&BTF?HX*y%|`M-U}yX+PiShk zUthI9u&Hc6rzv{`y$f!}AOz-Jn#r#VZZ5wrO*PfIxooO`b8N{k`Aj?m74}hcNsRrV z0BgY-AhRI=sZJpJ5Y&SwNAc%dFfZ%HXCPn3E1kT7^a@Olze%Aw^wx@|1xqN4A8r93 zB;a-Dj}7fXN^jA;e@hmvm6TeWO>(VE%-OyYmGW)pAVbV?V;^^H+K3{K#Ak4QNpIa-_h<>hGd zZY=GlM^B57Cg-84mCQ_~$+Ys*!*{h|_kBvK^ zwJu=4jY)1+t5K=0nh!$a&$=eCG9W{nI=_6K-Od zzb&0WJNM%5&P=gpCVfWXMZ%?HQ{JbutU9DKyDe*mFYe5UHDfZJE#n=a0V{%)KjP9& zvD5-glM1kAjKz1f@EF<0!|aH<#MAF)tnlF? z>B+Jb958&Z04A?@Rum{``?hV9c z_eFFC&Z@r(bDQ2M9j@n*6=N)p3UM0?TMr56x%V)WzZ?6{{9Vg7ABURXHs8P&(D{Ha zxP0t?(Y(if>^>~Q$h-P`_!{%U zgv_VpgIMnAilYDu!EF*f)uAvDjES;bI|br5JVHePWM)ND@M+D)bMIp@RZWKxko%Iu zX2=)q5X1+%`4?SrHH9$!lP}>wkbJ*5VeC|1ou_wW&ujbMyy-Q4d18^fu`COslvijo6qRK zw`M5CL8xu?JP3yxBi|tk#VDQ%>#y9@p$?;D(DiU5?~YRG`GFL$`h_PvYK)x;Rw)8W zhI8H%mwt`!>dDMFB~GJVM8e&~DS9I!K}v~ML?lQl(a#YH^&BU1$t|0abK+XUzxdkX zu3k)fzl61@kum6U>mbwlGP+$He$LIada;;)@waswH(k=n7VmpMlV<*K!WB*7H`2qD z5e4}7J{wR;?){9SaNO)?OL=ZV*Il{1LvIw#F?<&kU+)#9jG$~d z%Bwv9X2mAn{sAVvY`K+}tr_i~q5zNWkBy6hrxcP1jmMf{u1)+53W7P@zO(L?ezth} zgIF&(r{UN_88c>k62jA^7gs5yg8OE5iGtti0434~f6?@9A$@L1mt4lE9YdmwVW*!Y z;yD0JuhEWRNVM0FbcEgDnG3cO#mz6kDCzW*#2n3R^d!t2t(cZK8r)wy{bWqA+@934 zq#J#7@yB0e4}(3G9}n*hKfcHw)WCOI^)UNQT@IKr`xtnO?XF$+m?tpb^9bln&1mog z7>~PlK=@eF%pdEZr0-xa-}NXsFj!6ST@q`|8r&j?5;%>e7P5=q{}}F<8ejAnlM2Xd z>X$|Tw<<67VfU&I1(R(0F?91Hj zz4`q>)WNo{cqf!E`}DXT#+UVDRr%n43}R_MxgSVejsL7b!~QJoDXDu?1yRUDb=%$2 z)h>CQ!hW#HJdN@wDwoW&%RCvW3vv}`Xi!+z3iEdv#j7(ZHJRxCCebA*veIhs#;xR) z${Y9Dy>w_*l@5b=_y9@p)f!;Z9cRABLufi&iQ*#%(0L|(3Gu7}EJ_L^=E}-utd{_P ztQWo;Z;&N6$r3U0OoWZMf02^cDc2VWcS_N@>Q@}D7F!kvkNE{Egi#f21u6fFw-}(6 z9JAzUiEHcBhtI!kNINoZ)$c*h_T#rnoP-ufZv(3%9pXGm2yFh>$@Sv_=JP zqXPm=8#|6YDXBg@k~*p6G+|(hMzMCANP`D*M>#Hxu;Bb_2uj`cN+3ADIZv?BxC#VN zxQz~j+j{6YYXlg3YRJ27X}CNLxUB8Sv;^%slOUM-YtWh z5Ro2Hol%4Jd52e-G_yEU{*)Qqms;hgo@8j%m^~dTu~suc z>F5I7G~2bfUfpQ-PRoRA~F@Qr4OngQo~3T20y>)ujMpaVI-#cxr@s$EyZc>iZXaZcem z&$7F4{l=yp)WdB&)~iLZgU<8~O!Nz?!@NBGIW|-_Q+0r7GfBPJZlS?6r zP9--ldyb6;^*Z7|wEh&K_dHdB|7h}DSfE?%1y z?m>!}7HKo%4A|wN1e%q<{5(qvTyZ2)KZ=;YJo|Y@vO@%0AmjGiHF+Cav{{R8R)_)% znb^!21t3Y|ES`9UphfY-HP`ce_zSoP1KHegioscL593;Qceofav^I0{xEEO$E$1(5 zMN8#?ztr_K`!9uZ{^Si`Vq2{>>^Ho@8irquFF;gfEiNO4nlIleBb%Gzyumo~c=s`k zQblviZaQ>sXBg9t7I)ghAzr@f6)ZXEJ3)ZvF-G~PtYOASchnQ~}JG43G31Puev zhdy(uM{7v89E&?K7>4hbsiiG-Q(&4EYWTJfj*>VCVtDaxnY8*qkU*pO;!x-dyl^Gb z$oZhGJx?76zQVJ{qWNVR&_*wrUxrX_^T&fl)r&VDZ=NP^ze6fxXICEb@(JVFopjdX zEF#r?kI`@bwVFZdZUUj2F>payXVdfwQS@L*JPeh{9t3i6R?rm`I_Y9mb}I| zUMIZ)_>x-27-6Y0MjRZc$cPOV4J0XQn84LDzJv0X=@@JD8(S zarx|KIp8=|@!7$&x&DS?+Q5}gB5yf`g~v(PDW;E8aCP~6^qV@q)o@KMt%l}j;v{RamcJI9vNi{RwG z1D3iG{%R?VqWIVulI^h8%)NfM%nhB%I+N{2|9eW)2{ss4+6~L=hndV&stPp*re1UN zh*>O!qQHkK)D&zKk1KtNJSc`6il4{Yg8a{FTLVEnei&>s#`Y@hP0q^dtKl=f?mH|UE^u;-=P@Xd z@zQztfaN^lUA73X|KeRaMu*;2H>Y%iEqKz+N2hzpTQ+ZbR&SaoEZ}a;N4}Mg`h8i z3uKq-F2JjL@y8ZmbSkJX7 zeE)xgzF-+7rqA+i%PbreWfUi0i{`i?*JmX>^&@!#=6odg#`hmFsgoH?LtTxx zT+ZH))|b#$HAC;) zCx&lbfs53${HGPNp(`sCPV*TV!QoN7=}OjzeZXh0WPO2?&a4Fb+08qwVr$q=Ub0H@ zOWmv4B!>(Dau*_EO|8Z^tY#7Pq2I1n_~^=N_90qWyawoE1V6F{7;OsgnIqBAj2xz7 zXG+C$SYhPPt>&%}k&rTW*4Zl_eldr|$cv}MR?rq5{czJL-f%50OTBoDwRi`yN0#y#X)MWs1I*sYq8prU%Ygtt`h@V}Ht!J@m1N5>h z@GW$;vHKPcI@4JJqPS~%nlbRV*WETJskRM_tx=C>e#|O#=(zDQOL89gD^YI)x_9%( zk_X#FVaE!GRsj`!VcDSUS#SjpmR`)0K4GLY*HqQC^o}fd22R(DeAFkv-_P@`PjJrk z;`yJLBeL%ljYvzWR>(uvN#1qzIur9N9Dmf8}#UqtkGqUH`c}HEtQb!?ux zfxYUG{%Lm^`ZG;q`3_JOxUBW{<=`7;|KbX(5( zMi9bTyl^8#uw)2wWUy}FRH$xjz5~4P0bk&dxxC-P!P26Czrx%n_E*NilaXhMVwV1B z)sja8l7#T1=loc?+PWWjgU#&Iev^`IV9(D@c?z^KS@8SL8wI zug9Q293jfF z<}w7*CyK1kHWtkH=7Z}ug(q%-qNEH>PmI>ZTX6PI;e}h+K#&QMUk~x{ySK71Jb7R% zYex$3rcS>@D!@ncPq(tWwo;pL5XLM?I%U$IkO1;G;aOT$FFY4KrhL0(VJ$INV+> zG|MEK9r$fy_e~52r|G`W=6alG?Sgg$5bWsh8rS1L?79KLp4A<+*wz%vUraR0WKbi2_vIxa zAy#Zw(o^{EJKUCEhnp z)dsuI&EpF&8zXq90=59-`)dJff+ZPU$WoG_!eCl-m^jyIhETJ+B+By1Wy(huGOt>p z$rUS<K|E>eZu)D*Hr%fkD$rl&U%U^?^*tHpC=iS@u+A#mXRO>|y-;=+ zN$Rd+!4ACf4Wl?DILh!fy1NNfdcJFJ^juOW@{8ujF$dJMcaDL<@jFPFfG_HvU=Aie zk7O(&Ja4;yFiw1JyzXHf9`btyr!ye>%QgcUAj z!uQwf$ml#&ad9s%A|t-rq82YXAZd-#1GrCC+@p;2)=fOd!BJPkaAW7a4zl}z(-s|M z(hEI#n2dD9dHBhLthNR}L9=r%dwGLHtPv8t?;$oBn90bD7+Rh8IEtG<=wT=-LhN=} z(yi?eLjwso-^B+MLlMW-hz0T~#q2(Q<}h?IiGLqy@mFTrz46OhYMgaAx;D35n03#$eBM;WIccux<1v-7Zrgbe%6?EuC$t+!mMmE)}AYk zHAXZV8p8V@W>t-}v51IM!uuApakBY%*}T+R8V|8BYVhmDU{aUxw!boXaNrYumFG^* zuTqm|=dY~)jo(XbhbNE9Pn~iUn%yNl|0vYqHt^D;vRb`k>bMHfp(nfN3N9$e7(Ai! z7ml&|T3)nq_Nl>9(a?=0H33taSWlrpjZZiRzv&BOA_Lh}e&!eyR*ev zGm&RR)|k{=yBcha9zHnL@KuXMBP(=>BS@;wVjYJW=`*i*M2VBJ>T@4!VKW-_Z2@JwEiFPr zlo|}Fr%Vw=Hb%O`qKBQadnG}On69_0XsX4)Ki8B+4pna?psMG-eLd5)s4o}|`p}_g z(BKR}RWaIM@jeVun?TGx6XGF2@WaJRCVba~8v)^?OZ;v^PmoIMCL94cN1Ob)wQ8lu z_0QFzcK)-7DAjY=A%}e_F|k7`B_hIfYbH7C_qjFLK$%ENUo(sYy@QD0UKDH zvH9=1UeNh>#X^Z?i1G0e6$mfxPdEDmaVHiD|w&zDd~f2 zt-6xBN0O*}wo4RO!zZ~;=J<zNsqc+Q=`l=NIxrG>e3TLJ3K|}Z zG6ttzp z*1^e-DzAeq1iIfwU`^j@HCkFy}Hx2Uwt{60#o{3*opc+#@cAP5Rdh_ z9xcWrRfke*HbqB^T%)W+%D?XW@KR}?f`^wt(Xj$;w?2_v<^FpY*oJ?cxkWLOi$TGQ3MD( zTXCj7V^J>HdMb2p*H@oRc6}_;>tG;Rq38x!jhzrr1J2QQEwx5KS`aUl%PwKl(#juv zY>E8fl}4n{+(yYK(KU^kTTeNSf=Gv3q}5}r2h&6*U?1(c3!!MYdc_5#+M;Jo&?D+u zf54Q8<8z(z25|xbwDc2mMHX@!qtsTj6!pIg(ybb(T7v<7&f-7u5jYkKU)<)k2e}II zGb5#z*B(eeg&qOzC%aSrUi=gNhSs&~gwfwVBvHg+W4)lATx@-*MEpq7WE-8vKhjim zPh()qz6o~7myWybnDKQ*BE3U3<_2e3uy4FQy%9eYJjIhtPy z!*Bmp){{OhwiV@91b~~pX;B<268Vi7>s|fiZ za>f0>`zx0H=C3&Vz}Q%=>^D_2?%r3%c18K zKewc_#60wxi+fu!Hm>66Gvbfe2?l#WoJBT{=tWrZt?2X%7ClVJpF9t&g7N& zJ2U-EMQ21tI=$wM`56n&Rjyg^x4-6sv;La-OBTJ-JdYm<{f_Qn_L#@~jcxb;)0`*u5%_U6K_u*g1Fu!#2;m zFSMJ;X^%UJHlv2Y9hO0 z{)%$_l&Xr=%E~KO%t0P1?!9q=q#YgrFK(evRX0lRu?K5QH^G6nH%ZLx$k;nTs}1gA zuskg_R|j#CW)G?xGdEsqViY|$t}5Jgg^4}yRcC<#W!L;YQ48{#>PpJ=iIp*A-UNvu z<<^;=DM~ssFo?RFizidC{Q>NO)6D|JSkhhz|FGrUU6b;rrq? z)}V(w<;d-tQqdu~BBz)ia&UU(4rL+FS~Ul!R@9TLZK_%CF;d;AAk<-ZZ)Cf1)t!kPK#bXf6cXwydh~{NtJbonEKYc&h zHB~IZZwM`>SIm3M zUvc_utD?E&X3L5XB)?O+UcnrHy#;Sq)Kg3DZ8ZYoa!w6<;E=F^>JSfOkiAt04cCDl^!~>wXvAdNHWE^)LoL`+!>Jk4bd5Js$0xWKwW-daoHy*da3lP#(zar0Z^kZQU(SDkvCb9r zKf=5;*FxcmIcvE%ciSgjA0(A+#ph|@3nZpa4Os^)p#=QEJ04b`CuN`f9vSzja^&SX zYdOlbw0`uKMZ~9gXKVDQ1n>b2X6J`MK+`R027bH(i-4eq(NT6l^aQMi6M6*T4%R)l zApc$D8>qbti3`YYbSv$z721=GZTNKT0jv4@43;9lqH=Fa6K+& z;f+!}yLS4J8b(@!!49zxSuQ6Dexkrw_zS5d=cLz@U^1_yv<=yZq64J0KIhyVxadLd z5Tr;e+`LNtYqz9eS#~gx7!fC5E~*bXtmSU6o4Ag5K@clq`_tBa9#>bdm~cOQ&4`}J z@dorKBgK#Fc%9O2#r2Gl6H0J(>~Z$1cmgmBYIe1Z`Hw%4 zXw-?i5+Q0lLD%^Mq75LennwX2Ko?-G!rEaU)iWYvGTg?=s=r6h39yOS!T2g<*Ei1I z@rXyMr*f?f&y!)co(kx-F=90NSS43RgQ!N8LX&$9$IF%+;1 znRV)X~mY1MjBKQSb z{cGQHyC#W-_#M}=QekNv0hdD5YNF!&Lsa2!RmDoGqEDTUmr$!oM$fy>{6ni!1VJwn z8_`k&C;!dq8h{A#P}6fSdXeV3mk0q&vQJu875!<1-*Gi7^{0juPpbaZQ2lX;k>fz2 zdM$LORiHD;jx@@bl_rWW@VZd2O-(Ob6{>Yw1y0kXlF5Xt>}Fj)r|F1`Bsvc4upZ+Y zNVe(ONG(nDeF+_}KwBe_YQ$avPXnJ(^}XMmdK~Pm9eQ1>pM~Rr2HQyqs}JZB3MQt6 z^>*En7z_@IOl?GHTCEXvGJytzl`)umoY-|1dRoNRG9dnmdfe-rw9d8Y4qaPCtxxuyggqBv|>~FGeColamdY$hEi2j(51RNz}0h8JDVi90tjCLX5gW7_nqV5DR2g4LGFvaGB zO6f__8+ncG@L9DDx)i$}_6UItyD9hqXGHQ>j}ZhtvH{O(0{@r*3ZnnA|WvSKEfM%<^%vO6%R;?m_2(_Avq}l538(Ve1MraaRlnxze60b=S z99cnN?z|7!DpZY06@2Bo#bQ82O_p3ot0M=92&cR7OYQ0HcKlQ{$`tyE{UFk};=mHE zrsD`{Sg7!?C9VhL^KTR^vnq7P9uQEjR$u+u`ur!Z2*&bprm`^dHUFK$T1C$U60(tRB875Qzq(N?UxtIVF!F=N?*6KUbN%yp>06 zLOKJaLHL`D&BX#aAQodKv<*IJz2ty6jYkc%>6)Q0y2mXVO~rN9Q51l89#)gMGz*AE z96^2vgn17Ah$u!*f6;v!E%aP53NVpv7PA1`-aME4kyW>bnqCM^|F?OJuRcis^}h|? zKTqCK>#GPyAN`lf>wsx%h@nn)X8&x%X>`AM5Gk6rfQ9;E6vskt4oBL zPgD`m&I5H>e!r=?5IY(x&;#znR8iBMMC5J+=c(KP7g( zjiDDon2r#dz{sEec8j`54OA0&#y^2Afuj%M$!n>(0s2{gFUco}Q~z6a(vFR@*@jdF z1{Q0vL92S{n?7xANkeQI_6oa*=;Z{d`o4>_;WZy{}d$OZq0*o6aq ze;J>X33v|()E$6w8Ak4D?iRswDwg3DRci)vTFM1@RW3lUC`QgOEWobsU=#+U<7NJi zo4TU`ddXtkwbnbZ_Aqgq2ySx>)2jgCmW2?;QHv8E3ay{;P-y+k^8cK!eu_P4>rNZK z?wU9}7r0Aw$NwOp|Azr5vf1JQU?-%L4ai2=DbWwGKKSfY0sq5}iE=<#NQ#Vkm<+aF z`~;Y&ZFU$FYInnDzYBUAXK+`*R`<%jOH7BpPq+I*D)sw>M1vAaf@V|aG>c|B-Uqrq~IfIci5O4d2p5SfA0r!E={{?E%oQI** zSS;A7fQdFN*laO!DH;?%BI83gS-{{)7Ayc9%QlH_c$x@O>>0p)>{Fq?kLR+<56mW4 zBjLVreVH*J=X|u$_mMuqVkI(b*8ryYh?%5k#UZj>1wE!6pA)7pm;IMsfjr z0{6RC0rxw>$#CefD5jli%zxYF6K^5^E|mKTFdZg$B6u|s(_=(izBzg_yE8f}+vE5^3spi){iHxs9~E}NY< zE}NbIxNIUmR?DUvU~Md)=K*QK?EY^p{>y?1`9v+4JvV^V>4FLxN5-BhP&^(`xm|sojQ=DjqGfAB&MK_#M!*HVfLQia)9r~}L zoQ|r9qgGq;tU79TsqF?#HgMVqz`BmViFo|Ye6$u>jcwiZ-FfyLWiV{yetFby_1@eim`4q4&`&%3VgljZW|BH%OpH$^XB8PZ`ivjDPAy9hwv3<045jilVg+iq zgnRkRW^Mn)?TVVSDy|m=9N3$O%~drtZICelL$eStK`yg0^jxsd3fNU^>>{a zS>Z zHb@Kv^o0M@9NkJ3ykYg=agl>cw-N>Ck=F^6)_NOF+WrlY58+@OgcMEMR7>~FG9SB@ z5K)unSC6hB1{&3#rW%H#zdp@;jeqv0TfKTwz_yPOi$@218H4==pqjK<=5U=u&SQAe z1A`OQz;Z9YosLDQ?Cc?^{I)mOwow9F^*acze_v#wN@9$8XQum#`kAeMim&lFjZG4l z05jMj(d8S);2c>DmvFn74QM#$)2@3*Q@73Fxz=|Timq4-_hH@)a~@YC4K$E@7%+oD zIVbH~h>IL@?&quJ(cu`>qeVNc!zA$mp0)?ekek)ZknV%;d}OCJ0t@8`M2T6*c^V}b znI$845pCQ*IDsBUR0l571sf)VYU+rY1X&rb^ts` z(^hRSN%2i^O+M-(6nQ@v=Px}bIjd>vo@9bkKwBf@@QY#t`; zGqDFbiQ;RdlaPNL@F5%=>!Hp@2gj2*9%_YcP<+Sj;v-`@_g9t7)?l7xxZ59DVP(%f@z0f#&wRM!}g=8zJ_Du)uf-s1C zt^Hvnzp)F>DV9HL6PNLVU@Y5|K zj^i6q;J7M~+ZyQ?ATrNg`#Xs(@Z_|Kelq?b^~jxKI6;RJI~fC(Jl)91>wWls;rbJY zr*^iwj91-XwEByLl2#I{ft^GK!?_y(?dy_@PkKb=DN+qSBX$GEn`#Dae9~mTB|z44 z!*^_`7eeU(^Vl6D5>L~XfNPXdhZ4NvRiu7l-E$v41D-S9C8n3q8rQ@YzydsY`z)OZ zkpJiZ*wrlra_!>a-&lmU_ZV49maTD%T@g0u1lK>u$Qz4j4cL)g5aR&vU^B!}TT6r;Tca5P}@1;&a)>0?X-`7op4uc7rttBa6IqbH3oVaa3txn&GZFq=IZm>H{( zORa1IBw@GhGVrGy68MRn^p{7>d^!dG0z*#^O%y}%3{hmnTtNDkAy>czq;Dy@c-kYD zT?IyA&xk#Mh}kL50Fvg`Yo&~BK&|#=5UonzrEo&hM~1sX0CpHQ`_nz z8nME`)RCRA;~QSEEU|9)4Ip^nNwh-DK;07`;^oaSl7|3E|KTzqyn=|Ba_}FcRs`w| zRGT5@xZr3NBk-&tR?R{{L|zid2r3_Kjf}#)SKY>6$1aC0?5W{EU9xb62K4@cK;S1f z1v>M~04b0_0Q@qo4Q}Q(uALtmEDj}UEG;}3zLF&e0-8dWemT=8=ZR-DjcfpgGeDDe zJpp<%*lc>-#_%tp)cG88?}F0(dceEcibXa}cI$2lXNZ{u6HYrVc_K~#b$?XC!cf;< zQGy~5V-&jBairnKG79iCif1PQAT3<=yo5M*AQCu3_}td?rxz zbZ9IRc-Hb_VmFR7ZR8Dg>QF^Ajc3Iyl<6oHB$!l?(4Zi31bHcP*&+g7`@20N&WRgW ztwq&wXH~;)`73nlUn$Of74p+Y{rbunT{bkDoQTLEWJMQSHZ#(;wC^6FwAJg7wtAaa zL#E_j3)I*X7A8tQ2aBO`!5Zt*=uEJF)0u)3Q6i(e2pLI6awY5(D`$TiPyWhih}XBm zF!7yN1A2T03K+9XhI)-zn3hkBIChuNi^5ibV!QCSC<*tZWU> z*3T%F6u9YnB0S`{?q3v7gZiOp1n6^`_)9z}b6*j!113YDZt6T(c;wb@{R3_?N-hsg z4N}SxPUtm6CTJ2xH2@?PtpL4&vbYzIBd3lWsZ@k>1|hWs8MSTLM-2^E>iH;fR90Of zt^=kJR!dWZWT}iZkkE`cA2<#G`pruhl z?A%6mr$Y)&*l95mFwVkqvpd?|#>-cSwhU1?4kHd6x9RH8gy1|A^#D4;8VKxVp*^GLfGb|nxdt}EEx2zy@{*t&CIF=`B#FjK znz?;O*5S@~7)2oyql~Aww0Da)YHI8o?1vt;@L};984^|SV{i~!(b8}*twxFX@I{+! z(!hq!y1ARgPsqGO*&l(-e&8fzuC-~Ob`y^QzQ%fpV!)0ut5%UAdrI&fj4G1g>rTM; zSBW-tK+HJSInb_MzQAkKm(6v`Hhd@&)VfM_fb6+qE|p~KL_XlX+B(PFu`N62)=bI^9Koz+tLm&^V`#{fZpwSk-zOYhf>%Qyrzd<9Abh{UpGl@moHQ z3$-gIy+c=~wn6%=Pw-m!;cWV&#~3gT8i|SZu`-et&593I$0@p?9M}cvo8F?b_>>5d z-vsC+%q7=r75(VP)VD0ud^qXQhB$vsWtWR6cpJ@{@Ll=xov`9UQLjjE0K^`*|4edd zfYmMOQ(TX65xH2^NN?I7)`JZ-79=L4YaJnts26 z-#+`sOoV9@+4xP1;0J>CMRKab(McbcQ6s>#@SMFQs%rs7>?-<4d&O{MHo~VZl!b7n z0Ji(Te_A7a)HC=*-I?_^qO9Sg)**$sf8qy%!8>QjKzIS9ScZtXqAHeDa=mVP!yD0S zn52iX1{=xm57alljqjt$Yh?6$eug*Ip)2orPW?2^7(FrZvz^FksS$1iMVK3>|D7uq zqm4NBvDgIYv#+DIFN&$%V7Y{;Havc|!>z&BRAbHJXfao;O@*D!#VkgmK-U_FXI2l@ zLMTkex3l2iAs#yDL?2qN@(|nuEgV776tL{IWfdWEe;{Kl_RG*dd-C10y|PP!v8?~ z;w;+zZSWgQ)5xDu>@ng`^avB>F=!;AuZ{QNBQD3M-0qyHP?yUj>tny0w~;Ow`}DVV_IpZ zg=U+i7?FdNS6g~n?7)wDckaF#i{K^aw!~r7$Y-R^o_khjcjH?Zs3%uq>4`%R9j4|E zV`DOjs224!dvTdZbZM=z5J&k{1mwdJce2!7gIuoK^-EvI;r)BQgfLRggxxd-2$VB1 z8`T`GS(@bK2llB@&8>m8Au=aCRBo{lm&^-Qc`9~E z7;GWIZV8ilLF(v0Xdcm~gT{y@GafJwXwsp(M1Dt&)%2LRBo#M;(76MKv-(>;xA+rf z>uZar2(OOStBEP%{)d2sawj7BJ~1Kd;03K~N#3#PF^!Rqu%%ijT{h^U@|7O-N{$+s z1+f{hH(=GfFlP}b)_r5`mSBDVI?)5UZO315Sm#28gN^|GayHa^dSXg3>b(K>R~eQ9 z`wKmr-KgHPk9h0qc2nU0xy%1^yCvUNCymW@mRV-C6|0Pj!B+P+Lp=RCUTa+cSz-hpyv{Gwy!D0J9t<;xMG94$t z3c&hQbw7U8Hiz$j7)cCuL6u>OK*Q~!rd*prU}AT;SA!_=su%_skG{PQXbx5#()q> ztz*UOsp@d@kD7A&>cZyRjmkdP!l{JRQ|x5c6r|6cDy}0NzKBIscZ_8c^rY1rD&}2Y z7R+H!SHnIGMTypN;MO4bOg=KaH!f(qwV!^z{ zC<)Xe=1~n=pv`XSs0{w97HA>LBx~C>G2tOE*uH5PB#b)NXhctQjV{3tYmK%vNB!Pj zYK`^>q%}I7pc?Hvjia0z@b;kq3CE{Dhy?SBm)lbn$xqlqN4liP$xh zPl>ybITqFO0ij)JtQbBlj(n$ylmS@ovi>1C1TkVLavsE+a{;@cO3*;;9$BKOiWm*i zqDKru)}u5I#eUY9;?xrESDR#@!tDRLN$6CT;#WdV78CVXd0~ZzPhk6-HI9L|OkH9M zU~^Su3{s;u5)d{`*YbL-u0G|O&jyrW)Er}Rkxc=K|bwzRE_YbGVhbS-r1p|kImxs+b z25>CWmjD|=f>P@#jX^rIT!cNXcFw(kX%L*f0{9jbXv3e;AW#`0`T)L2GO{b?%BYZ$ zT~*(tWMt=1tQjcyy2J7Qfc|=!G4N#fXfX=OAaLWx05*oqY!%>LDE2pCJ$!Vv5g(&>mKeUtt} zBYITy1Z)KUR3;!@?iK^mJ^T+qgydAZywVCza3}uv$XK(xC2N5Fl9vq(;7Xf#`xv8q^m7Y0`56XKF=xqQ|SW8di%@faJ?) z79gDRix%T>YYrWOk1?4q_@+87n~JT-pH#CVDsz~rOd4Ru8-$ZS%S&E7UYm(VpiX^gaC0A;W15Cy5L4iCY8oH{Jc|zin_`p?047p2N=;8!Z>#zm z-ey};9VF_&zwe3~?CcZ?aKFV>9ToE2TkX>uy@7SpV~`b(y25z!|7M>aV8*X@x*kWnt#1g@;5SnL z11(jAYFIRd#2}f)(fVnU(x#yGPU5i-I+Xv8YPX8rrD^2(g4YycRG1 zMe!Yq#6vLq2Vg2pW4&*pwIFgE`r6+f*Q-LOH1Z!O7)tqT-*m&rDeMW?KJRdcLSiUS zL+KT34Hc4(P!C;2Brg4HL$BJwBhDZ@M2`A5#^_#`Jk7VO1Joux0G6-yqUd%%`DONT zhbjcFIY}lpeTTu;*+?>(J8&v7*nwMqpN2z~@M7^39i!_h^(-i5d3^X61KttVlqZ>- ztyxrXHZe;;{SKcFLJ%)l1xSS9CBPXb%O14&3~U47wZni-D;PYx$kGL8%wB>xWcnQk zx(t%euXG!@akFX!dqp*801Fi(X5yj*IpH)wxCIg)06vNXk<9`s^B%S7!D>QoP)h~L z*P%{81<5y=PEOyFy928#vj1~mOHW=%UK)YCBvk1ryOAbvB*svD_%`Ph=BIU8X>*A^SuY zwqq+BON~acHa9QYJ&qvm(V2jvN7YI7|7(wa`lU2+rvWCh?)&+Yv1TV8LYV5r%A!Wm zc@dMq;wP<7DU+!N}Mz73(c zbU;tItFPN{y5j@&72-QJrU_2mOUJSh6vAMf2yFH!C>bGp1+G&eBZNo6uEQn5gLDz7 zEkW!xreX<>odxD)+~$rIVFzg|z~#G1f}Adoe6htd+50)s`#GLJC)-RHjYF4*$l;>V z^jf}@j~dk$L>!E3R&SGgn)KVW1Y}=jH^4;8h=cSIJ|Sq=-VM;L*hOmB z>r2WEW^W1i{8V~?NbdRCAb383^9CSWipv%>i?77XKgxgM=@#j~VEynUP~T@|$F4U~ zgVdKKd1nJQ73AHF^24mS8zSdxI5%nz&KKGi{PTPn-nBf-y?}s#d!e3DX)Y+5&3JbX zMx|mWy@l)pC6*n!@M?%r?gk8Z#H{mjlpWCCW}K%n2#gm6x1t6|>%x_v9&Xj_^&+7h zdI=(^9D)$O5V2%t*ISd0>S8kGvH{YG>H}hd6eq+qtH*KoKiN+9Mo#}N(p7@@?t4J7 z2Q~Q`EDGf+_@AUfoo2GeS3>;&d8^}8Kz0?Z2IQ@d#~H#All_&n%vu5RPRBk9P6K?p zIXg{c2Zktl=D;y?K}Kve?DV(RJg@CA*Knf;*fH1=upRsWc70EP?^r&h#xm%?jpbfZ zj+kP5kq4YTdDj8!DOONOix+}bQRgJ978GKh76(J^F%Qa9r4Bg!U25nLdNa%cPCGHo zho~(wO(1(EtM>1_kLIHn*gZ85dAAIN_uGy`+eYpiVbSyeLA?K^(jtpCOf={SP5{?| zbf8na;MEHG(VPEC;Jk*$>x(T~&v;DqW2!Qqy%S=lXC49xHviKzU9lc@+&d6n*u*6~ z%D1T*Adl_~fb0nR7!dcV9;C_mm|*$*U|yZ27VTr6&GVL_WxNDo*H6=c^{4=aE{FXr zMbA%0gKE!4QyqlF%8;LFACO$s4MDuZIuNi4ylKDSp37%$GeSyX`3=sc^!fqfP-ybkut*E!qk#P>7o=0o1ktQ;%N#7Cj`%;c5Vl zKhDy5vTPir5*x{_?}dI>3<@(~^k=CTv86=>(aqMgbc zc=?cd!-D|au!Ko=0y8N-B10UmQL;0G2K>D)x~nhfsuDSSTCqhNth5q7ny9A#e_1K- zFn<^ojr_W>&kTKN*Yv8$%LDEMis)+S_<%rOW# ze)^qaFos{Trk|a;Z45cLp>O`w=(ho8EJptyfR&Rm`cwR}#nhQ9%NA2-04tNwZoxDdgldPlx60{Qg2i1fFil6&jQxcI^_)ntjFrYk^^!SF9EWf zJrbi(5wI3uUs2U>eYlv5K7P@vMTV@FIg3>%APPQjp5vB1;!C>jmVZ@IP$$6Qd36q@ z6QF*UhIas2MM(ahRRpl1miQ2CXg@w)Py@C>3|L)y^)Ry^p)G7w9BH%&5&|wya-_(7 z(GV=Ih|qi=rW8o0I$5>UkOC6}r&2(PNvKF2z!Yc3dEV)liV@`9G{xtr8-f$WcyBhj z>39S&3&;j!m2xeo^dZplM(sOq-&%i^qgE5}O|1||jX;DfLjJt;JdY%9Z72mFm7Q1} zkUQ~dK+%c4@F6fAM} z)m=_V%IeEdP}V`(i2jHra7A^zZJ9%3o^PD{y`LWNMP!yF=KwBbZ~8Vq&VNrp<;Uc>}BtD7tnh{k&?1^wkPx@n3vD z!h@EIq?t(iL7*_Yf7J~AgcUpf&cVSV3c9F59z{q^Y?$f;n1rf~1bo%@v!-7$3Lf1R zO?UD8op|`xu9mI9Uw5uOUMvS#EZr9S

    #Dq9U;$69ZRLI{G)CfpcHLzy%6L|C($` zURMOgD=p=^My=6}(go*|+WZZTmi`XS-TAv5Ik+@fbN^kVf>5iL9CFhWOi`D3BJZcR zfKNjb|AFKFA&*2;Blst(RllvOiTR5+sDgD|=K-ICqOLnKlIQPLq?T&TT{WsPaS%aM z4x8dC62C?rrk0nbF#ZQ1i=0mYWx5Ai_FXjUVXsSqr5w)=<)w0Yy;K=u)1Fwjvg;W* z+v&u)%2$y*h^$v68+HS70qp>5**fWiEu=qh)nf8SA|RH9TTZd$WG4V2+_Fm~2TEd? z(m@}gj-aRo0|&g=rjm%B97)CK^Mu+iG%N3Dl+g8r%sm=aiv5g|$ygfBK-R2(ng_Q% zS<7?V!hLfJI4KeSJ{gMmjTcusQZ>M;Xw2t$L-mnoV*-b;GZ&QE8{zf;tkK}213+j0 zOEI9=|MHg&_VJ=+yfuL`ud(KEn-&4GG~NZs?wG599l5hxgBn?Ed<>|>#U#oCExKtR zf`TQ-FmMc*r|xdMRjWxAZz2M|n#tb7K#K6D$dcJtGo|z}O_gy>l--blB(7;HW46PB zX(3aJOXW3Pj*pZq)Bp6a&hR9odno29A+xe67sH2Z4{k}x-Vcx!s;Pi2l!GUiT7hzu zgC}yPtgTIQ)|u2J9yCg|@1UB^I_R@XH*U74ah{Xq9wPe6TcdtRpW>V;Hoc_USO>uc zRF{bm%$o2TK%N_?0Hv^>=_coF6R4g+n6ZJS$a$VDg_n%&`aGYh7hKCr zw83i5dS|RWC$3i!$>x_CjWpDz5TnAKbr-M&(@azJlQJ6@tB&~`LEJG*N_Wgs*)dEJ zOH0Qs^K=>&B0Z~GmjF|orQNPG;4DM`%xD6ePwO-F?t=u1 zvEbo3&WRnXN%g|@(wj~Hrz466AURuzBLIb7v95HNu9uAzdc^@?DZOF?6<1&$8)=2} zl7}!J6Il&m9%W#nyCd^Csc^EhM9P;;z*!*2NXe-JA3o3!g8BinVS%0Gz>t79Zz)}$ zt)5Oto?9g`yPY85!3Qm+2>3gR%KSJB*|EN{%`dzEufCB$caShxjNx`wQ(m;InX)QU z-{F@R1pQ94W$-IoXbh_!G#J>eu=G>_IFuER-F~S|^XRXw=CMa-V-VK=z=ux&3abc^ z`EYWuRa$hNz;c-nj{#)$eH}xoz8{hUM3E5u!GU6V?t9g`h6rld1Q&g(YI;?G!?JZe z?+%x01NVJOush7iZEB05CCDNaGjAPWiu3RmKBQ!_rfpm35`vjEIj}6jtf@AjWZlOs zJ}VZ%d^qN9#4+wr#)ULIVKMR-|LgxO4I}aJpc9q>OLun&cAl^{-YEk8!ZYa4d)2lh z36H@!Krw5IyuBs8YNsXXiCNPiQjW~?fE|@4_p^nTEM!ft4d^{A=JQW>{i=|=G4v}!Ucm4_>ayYja@@QDSX=9qcNwq&Gn8b=N2cFb0ofxl5U>^C z2Ef*UcLAAGBw*cG($61~hO@!j?bPxcKE~32J}wiYw}IkBj7S9MRD%AVkDwQaBkcNpCB{C+;!ZI9h!6ax446fRxM4voFXRG8E-+TKz3U60~CuxqwyiUk?u6Bwp>}X zOgliF24CaSP%CQ(hYQr;0*D-W?* z<2~ROhy!l^+JNEhws(-4rOo8BUG(3q+k7NR6+Jx#RjToYi|!$$7WPoqtS+n64)9e- zl39R4lFTTZ`(H9$GiyjLmLuS8$^+zHJ^{#*M60PJNrPH)CiVklmNY}b-2(2XJAk~> zI!9H=>-L#zj%5dZZmHUG|D}Yu!?5wj=#hRtI%J;gKWOJPqc-NL<;N|Qj}NIq&9_o! z8?0tWERb1ZOBjr(PT6%ZPN;JdU`jRb@Yu=>&m!;e{1eDLmls=&oT|^pP!4|ESpxh; z8cA4!Yz1U%szhYfks|BKzJD0dlocziv}75~w~&?G1WC_%4dhT< zQLs`&DJ9+lOnM5pAbE#E3Z%8N+gM7h^~QnQ|0tzIh?;%tWH(8rf1Q<54x`iSg|Rvu zj=}Oen!}W%*{k@k_x5nq!|37EPWlGFK?m2{=$rjUtI^=prWoo2>_oR@T+Frtyle~K zC^-yUmHN}yKx;2#2)wqBfcsK7{&$BE>I=w1Xe}TMp}#eugZ1HWH_j7e)O zWKCW!U_&K|w@Pl2B0T$HA>VNYWgka1vub=H@$-PKak0jBv)_#L)ZU3k_t||MwC``w zb*k?Wt%7?DyA4bvkLzToj0}U7T8x}hL<@FN%HKiSbt`~JkDV^gduhc5NtiNlkJfa9?Ug;!cwgoOx}Q)!=7u0GjXNQv73Fo~s2$5wKl zj|OCkyBLty0CqAIyy<(ZkA`Ni8w26K^|m;t1bM@ve&y}bPLUtHwQtZGwGZv2A2w@G z1ES%1!T^pyOnXtn5e!+QJ<)U-A^kCw-P*7|p}NS%T@75_HczOat`xjN_CrHLC1EV+_(F5nKew$2G z|Ef(UW&8KMCs! {KvJ;wF#NY4X`?Ftvo4llb)Yv7+=l7aupcbC>B*#%;o)+N9E zG0iWlNZzQ0o8e1GUy*ed+VOyP;COPO`Kkxc?Yq#7y$#EOG?6!fJn^_yTcG58u^dh1 zxeh7eOy$gNfTcwiROt$i17vA`-RfO>WNGhwN{ZGxfK2F5@^3K+x0JT^8A5`qm0gze zj_Mz>Ej&9H0hu+b+o~NNf6W~)&Q;*>zM5yAR%3I|57|_s{`|rYZ;Nn++!rOl!(2iQ z+DoOWGa!reet@cjGi_4U3-aF)feu~*q%XLG|JH#!7|h^mN68FocanYi3Pb6;8)`EO zw!}qK*X8WeUx$cbbnY;lq5li}caMt%9ViqlxU5Rm0PHI|b)-%0DqD&mUc@Z~EVGFF z0D;n(KicNYZ5|2-fAP*Qb4}Mf5@W<`ZM=bvx^M#_G_Y zUge_tFF~M&WobHjI=nS@oTPFt!ZAgQff4qX{mwbE!c5lJkpXK;?w2K5w+2*8C9@Qr z;OHn;g9jqw3*M9x{fbo^td{;}(?E=4s$Ar9e#O}eR>7OdzOqpdta2qgzcz!#3d+|u z8qdLzb7Upd;@2EH{TkS7$XqkD1AW%jWE=BTAI3rMMnSauE?A1S;oU%GhsIez9?r0C zpe~^iETqhTGJWM?paZLU>D*iz_ENf?q2Ki3z?3a9B=%3fN4{-}Qd%MJ_Sd^BuAB zmY6rl*2p!44Zc$bcV@hf)?scw3%HBxoeYj4To{1Dg#pO-3*-XII&AjkAr=3Rd&8>I z^q#CmWYK&;?*RUvw<2zp-Nq)k-b+rqzJQekp>CsMkZ4TUc8SD$Gq%$bM2l?%yYV3g zFa0ewcniRr6mQ*04ImucI84brRLrtnlrDl=a*z}+yOnt9j-V0zQWD*nU=x&sFMx zJwRBq0K4G#4M1E(m{;o^b|>IIj;vh;G4xx1kXOX2MeJDNQ+9#+l0}p>fNcnzCdvJy zN*vBnO8O=@R0q;Uc=|54hLH(i4DOF!p%r znK*KO!b9=-Des|(;ist995syTNsq_TzwxUH@?H%15=DQ?)3>9M;;ewnTp}yj=+(KL z#ibm1b}A(Y^p7pUVE=uA*DeL9~RMiwmsq7)Nh#{Q;5v3U*w zl`MyHs00{%{c58OsaH-0WJ>-OkWUCdjeI(ZGNZg@I%&m1WEfQ_N?y3oQ!-rv`lBeY z!60xb+!OmYV10E@Y+JX5?=@)&u=HzMjF<*!ToGXNaxv-*hNDWJj)*gg$L@)t-3Un) z=U|IR#?pt2Q3l_is1Ly~@yAhwG^8o`iOYp>X3&Z)JTvJgU{n0AKa|PVLT>=3YTIZ8 zV1d>#@2O#I>7lJ33`bj0rEP!>Q@o>uX9v`X1-Nmxkhj{2`7m}l1}-=SxC_XxazNheE3h#RDhdohvB|I87b6-xH^6Xn&R)H2?fcE80OFR<(A=HCf}Yw{?XE>Eg-}XLsCBn0v8f9A&JrY7yb$ek?wphicVhPh>PL zMudy{kHb8T*fxYGetuC5KPp?_NC~q<w@#b zzrb|kYc!is#|>QIOB3+l+6Rw4W*x@^syh)_oz@|+JNmTZM5~s;q}TS%?(uYSBf26~ z-VdTVKhj$oJ=*t*F|yCx3e5fzBgYpj+VxgKO^>GkJ;w<6eN|co+59jIHJAzv4Ra$(R7RncL3iDF;kR!P~0{>4ZyXHvm2+X8Ct= z$372PFujO@2&4K_@EvjQ9&?$wD=j>5+YEP@1^f3A6AHH66R^E)zZ0h>Q%dk?%})GI z7e(Vm#>`Q8vFd{@;8fIaD&zN~j{x6CvBiLsa2q5}#!zu>K9Ww;Sfuo$9{}G1M%(FN zftBx9@?0FEY~mn1h$tqF6(^9hfz%Ey{spjxMiena{(c^?N1&J>-v>}GMlgo#+cDYc z9%8tU0<)PV;QlBD2LSR*#@T@FeC~S0rVA=Tm>cAO%*g#RJ(eCK2pchATa0DbPDBS=A4_$F;~lKchE{Yd+Ma5~Cr!u&B~;LlJBp!Xrv(pOZ!f>^%I6(#d_Fwb$x@~)-! zyUo?E%R9hq&VL$9H=Olc=1Q*FScx<5pf)n@O?Kh7GkFgfUiVlZt2f0N=4XJ!Pim_h z9sXOfV8_hQ%`?n4zUaEGt!FJdiS!{_he=A*tv|5Z;hCQ zB~rZi25c%NL!uIc>kyO#lp}yF>F)rtq~8DmCnWu^%cP`l4hjBeC4Cz-eh=_j!bd}X zvxILA_$MTMM=0XYv80D0J`J!Y6!EQqt?>w+4I;ZKE~9M)xL1rs4Jn9A3+>lw3IzBd zs_`wR00y9@(WB?vF6xY*i_x|RfTC@+*I-1zr)qnpa;#wOb-dEJlD{0TE95X;Ldqbd ztS2tOcNzVjYZe%!M0tHkJ= zT!GH9lnyyM#D+W2TN%z98?nNP-_?NK+UWAElDpE}VdZ-RCQL0Wo*;{hPCa7@?+;TT9Puka3V z%2Oq=)D1zfVh#QKUePoiKRSXAF9LP~d3{frYn>37l_2(9A?gWVtWZ&ZNYFUq_7nyBbH+1q9S9B|EF`z{tbaGK#h|j+dsEkECq)Jxj_-Rg4}R9govb z_|*sZ=yv*nC+{;x!I?U7#)BbFr!i{MjgZP#CB`(_LVeRX2e$R-yDug{DSn;`kSf`} z{mVFKx)GJyFrMxqAW(b3Xz+Aog5~aFavw(abYrI#Pf&I=qGmP4%d5NCD)ZXs8r$bV zyOm+5CAs71S^Q#;|6srwAeNLpuxotGa=ae6h`J-NF($<%Kun6flYoQS7=LXaCT_?_ z=0yylMpTtQ;*3*?)^MZqbN0wkyDo26usEfmo`4HYL!4viDX506S(uN)$8%sJrvRT~ zEzzb&7+qQgMbo4E*+X%K1^_n3FyP`LBX_j}I}#9(7S2Yw#Wc$4D#F~LQs)7%2q)X% z7SjfY!A=eS0}nF|KxDMYDMlLOGY}w*ahEj4ui>{#Am9az*WsgZALP9}L|p*+rlAZ# zw!{;BEb*H7o#$4LzL!~=2t!%o92s6t&KE;!+!P13^+7ywl3oUDe7fEQx12(azQO-q8OShx? zcW00u0~ba33~v_Kr+Km%aO{%=3x10_TPEgA0~d-8Cok@pY!jEdG|+J8N46|4uk~?u z@}SkA*?4;I1ZJj>ze3aDub7I!he48i0Xt!=DxU-?*zk;k&B%E-G=}=)x2uI*)awuO zfRfY)VCmPmm^9sOc{HGj<#ieSB7nquLI(U@;88wuSb`GzpJMxk9bA(#VvJvh{ZSvw zD)G1!I2A8P=h1yc3!}YC5qn82)B~^^%=LW0rkrla-N)bpctFcL96|Sf2p4 z_Sn{%w5{OrwB#s>d9BbVNPWMN>{u4~o6O z&a`9H3XrSN6Oi?RuK~FVMSv$!V&1Pjxlo1Ti`eCmC>{lK@U1iWr*55bri%APs$63B zGlyOQYy_AEcn~?faarXs=?b&>XAC_wKaTF=N0Pr9P{k;iR4F<%SY8AI!@jD~;Qfd3 z)Wf4M+bR93vN>#eHDg&FSb0kk!aT7E@I@BmHr(>DzsV%r?Nw~mR-xpe5~Y(g`i-^3 zKGYwOHGuJe(~-2!HTIKQs0eT{_}lB(Sy+vw1%N5c`1azXk@*o%m2R+wcZ1pi@}n(d z8A^WG$S9ef7)_TD($g`EIb>rasvauS=XW?daWC97|a1lR;xfeo*$NWRVE5=<@bz*vp+v$;1ZE#Y5? zs)x4E0(=5}b%|jWXhmE7wSZv#JE;YPJ7EIb@XN^DF(#VczRT%4&^tH|U(k0W zzK^BeHk;N2R*aE+vR5iwGarZBa7mmrToo$a2NIj^MvnuxVjOBxH?-TdfAQq9La;B} z(=&kxHFF1x3$1bM`A2ja7^0^8SGJ2WuGp#uQEgN!#OUYfjv3rv=>K1I%ob*~CdO?;J=UbY*N198!2MqNPM}o0`YR^jaW{^#L z9wn>?`({hag4E;1|tye zT_bDCeHZP=k1n{-Qf-QW=}!+5(XG@DV-v~QYR^@2Q6KzD$7t^XY=*RTM&8CvhZvJG zgVZ=&cw>T8Z&3-J9&^z_pe9)0lDmSBFOkuZ2pcX8#jUb{Y_9S^$J0YV4&&i&iVt={ z4*+b<>6YQ+VeV*)9!@z?=o@;x0*}C6dPHjH?}crO`h8st9Iu5wH$;UqZAEuFVnjAz%+1I2$aG zfwj@PYY1=wF*pXb1>zHc?*MT%U}p|@ariUz1Yj+3d)uiJ$C#XYqd#KU>xnA*}oAXM$nLdlfWP+P1 zMPZw}l*)56`MrK-(^Hk5#Fyozn#tX`@SLp-cI$gyKWiF?;R)o*$HK+b3BQtq7G}ia z+7>-z*^$EyG;+c_Z|{PJCcg~uB4ZaQN(~4nZiq#AO|D`P$s?3;c(asd$SLMd7K9U zrb5cEJt&m{UKi|bho!vHw5exMLoaYcM)^7CZe8xo$Q*2l^v(R&Z9eMuF#)nW= zcjBWqhup%)L;O)C6@BZM62Wmzzs zitxe8eM}XWnjL8j;1?(@xhk`c$@CduqsTq0th^A7{zEMbSJ5U8MXFnXJ&`KCnoM;K z@R>@J@&1jhp?Mc7OhvARID`6Hb<`nZ+lWB1w9Pl%=8d442n1K9mB6rOD3~)9Z-D!0=;79ro;G=j&W*s1J2PgvME9ffK#k`7G;HkQ%&l*9mAdvea z3y`aR9k3e`JzEc~58gQ|bm9SlmS|dsfP{!&)=5$1aAW0r9sPtrZg^6C8}3=?NP_`C zLuyL{RK=ke>^EOOSfL1b6sL7K3fZc~pWNs#yLAp}0qE z+S@2fI*FIc);piDg@*@{Ra57R-D(m3DaDSchNO1 zC7nd`pqd9pTA|Q^aFPW$*Yl$`t&Dn)+>fKBO~G+Op@pcsLZgk`D}Th(4Fta$$yv3L zSw$f$qhMF{Xp0lKAUCsV9k7qOKOs)u~e^x4a-Q+P&2?fg70q0Wr6n&e%G>f&~bnMvak2X&~p5) zjoO?7Yzyda34srqZ3Wnf)nmLd;r|k1`b?X6LM)z~tuPDe&0hagGqzs}OVlm2{{^?! z)^IO!#L;U=woz@)U2TC&5EFg{Lt)9|GWH-g<#E@$h{<6njd@(%FM`G}6v%jMMj#JS zF}E}i@_GJ5&Sw}3R7bxrt5GEWA@(INauh#0elZwKY=IaYn>79(uL z?G#GVZCV5ijb$f;VyG>CanYXx_Qx!I0Qef*r>C#u&bReen-)rg9#!^0=a$hiG$jJ< zq2RwE6QIWf3e~XVtlKP0jMF1;KSXOemPLd`4>fw!KNDkoH|uuQP`o=Ncr2F0rw!bs zRSpx+77FQy9Xka}@5i#iS;OK?werrKu79`ThS?D`1F#j~F~IH+q%9s}wKR`D0Bi!d z1h6UKc?DD2p`+z>%CSQ9$53|!b;CU02-qIVU+CjD?Vrf<9l+iQKMKg+a0}dak@$X| zGM>Ps0>)^--msx9dL=rEnAVZ$V5Wp{Jfg zv?w5jGCJ6_26V9#SP;!ecna#i8<5*#ds?=om4g2UtYTS%m&ztShr7-3>ot*ib#LYk z(4KS@@=w-wYtn;`kOY*B|7q%lM!WM}s)sVU;hz9@PC!&QYMs2Q#V1LLF6S0N=S9T6euskZ^EK+PHt__3%|O9K~VLk>L$ zK1Cg$F)P)IGM}|+FNDgi3Rd`_AqNoK593}JG5k=$CxAV<{|bzfThB++ZTx;2YyB4H zy`Eefiviq>;}SOQ#q8%XH_*l~z$6EjAS^g|-332lLX?Xl)JfDH0jX&DJAjSQ(yst( zq4xU$n*oOY11b|>JHTpaOgF z1IR6je38whe$)-HC&Ir2>?gYApf@9a!Q7%B^2y@wRD=S!9hU%AJAR-BFLOH%OPPTM zCaR49Zbv7;8erZ30hD)HA3MXc<0$+vXR=(h7U7|m5t{L|^XY`32&d?m<5U8NMhx9W zWU%b26DlbA6;IGf85DBLTWWj6HnPpc{pR#`I!GYww2TXaH$9IQBbNK{JRtXB8t9{1 zpt#HY47P%N!jCb4I9{QRhzJ&a@r$u+{P7qnLV)axv+!j^+OSKttL)B!fc?>(#em$M zZMwVi8E6XEv4`i}n&`3UzQUk?^XW-?NP3Zr-2nv=#nHo&HBs~512Ae-nJ^^c@dp-qZ zPu)TVk1>?pHOwfujid8vZ?cI$p4u=}hS3v7>-Y8q8g=JZu3+S}Z4xqR#_d47cf#7; zcgE>urz;ydZ}m?x>POyeNX>g=sH#u98;m!s-8S7S-`d6#c=GkbKznz|mT7lsO&=I%c9EJ+;JY@` zQT`)oAo%3IjEtQ)fXR3m?^VE|#*(|Ix@ed1WXCHmqd2}!D00r~JEV2qX~b63wBxv9 z^H!xWhj^p#_<;if&d$`}9X8CegN>4FL2(Wd*u_|~Ws`cm!meA5l*K>C(B5~^-}GdE zc$6M{uwCxyv_p-*ExuDLW4}CpVY6R2=&0DzJJssU3iFsGa_=&~2BEgs;3bh|9dQ>@ zGBV_6l~0%8vHLdoQ8B_lcj|?}6s^GM@#H_EX$F4q&hC6bd7F8VZ}sjXII40B{R=XY#v=ebVvS{=_ryaae4eG=Gpsv} zM{EdvkJu>ZZx`8QOSLw}W=2i_`6B(!xo8FCM!)d&)tT+OxadRt2v1mwo~>blKUP9d ze|$)U_*k)NA;MejMCVDFxwxcS)AwGaTfjq`DG@c`Baz(zWpksv>4Ndh3#w+haf%k< zLo}&^Y*MhWIKj%W5$`?Bddrp~YK4zf%j%WX10N}tRV!&g;~4Fp_57_JG@wb07Go{C zy#udPIJI=T^FCT$VfXwUcr+8QF9qnhaUYjAbfvg|BW=uH--rNbZ>*8KjFhLl$3*Ct z)>Le4nYaN(>bKWW)EI{rn<#FLN3S6(w-r3*@DGIn&Nq=LRwSa&N7^(;!rhxr9yJ?3 z#cRx$XaW1!R(tZ^BQ20;h0!2!<)pZ1AWbBke6_2GEF9(|B|1!eA7mQGIaK(fz&8*%RFu`dT*aZq#mL21 zO&_<=Q>`)d00|Q<3wKb(|JbxMnl<}F(3cqRWIB!S_zI!ufy|pWkLrB;cj}3V=CHZk z#**Q0xo8c3rok9K0qFLb3|34v3jIjprW#9kyj6+X9O;w(jKV-TJawLUjcA2~76hXgl@@N?fNfponVg;*h@7Io@~M%e@rHP?)E*tll$gV>+J2a#j=)`LxwVUmfpAi@(!LCn8XD7pB)jI~V@vTMh!Z#YW)R7utoojt)HIXz zjt=xM0Xx!Sz%sOOoFhRu&8Q#`T}Ukkv3s%?bpe!Tbz8_{ykwArC?HGwKS3v{& z0w#&R4ts;lIR4c2gf8k}B$-HL0R#DBLNM(HyxQLw=c8C(Hv0*>Zo?FVGeG!D^rleY(!&)ZXJA7>Kf$Kf$%2i1t) z6GixNdCAZZsp#6HxCUkT{r4*R6%p;v;gR_dGCEFKBAV{c?kN|^npLI0}t3$Fb02xu&%z|T}N!3I@lX}Dc$N0$-)91h_B z;#I|!E`C;#FeZQZaqK&>5&T6%oBa_+YTI&U9~bVrL{wg)`Viwwhd&ZP%P>e z+O@YVLkbI4}u|1ud`kNbhz<3#u!9ymKs>#g6tNk^g_ zeEZx@8Zgy?-rqh6e7X#=-;nL7_`At0%Fz4o3gf1UQHJDis=i1!ct(^V`CBS_97jj{ z(>uE050kd@5uY4Yn)Gk0;!SH#pS4-e4c)3VtUC(hu35ny6O;ypQ$SAE!R|_oqPce>Ry}{BJ(uS8z%s$0bjK#qR`0sEc_iYp1N6nivlh#(jZtxL7I`z8H8MU@62z za;Dr6iG+GtNuQ}v127$zW&2veLg}+9+@n%~)$}dbEJDT)(v*Pr4fn+=!vp36uLXqt2--gj!q+)c zR-ZLq<^s6ZpIb%Eq3wkTjxvf;@>v2a74T7z|7cB-|9W6GcCZ#WMx!iD`d8_>8NB+_ zf#v}wi5Y<_`lU*63qj#&XxVsmO|3^I$dZ+SN`S1ga04z_L99JQOp}tEF>;z*{lPO$ z1`z5fxIyF*mzEwY@AijfFl~xeAH6ji>J#XM?gK3?R#+dUh5Q87&Zl#j0$4fplhmlj zM1?U>V3>-6F9m!lF)GS;08n~>F2t{y6N}%yNS&Ov{@7+V)&(O{ z$n&|HlIQmko9xUkcIb;Hcw*M;_yz@=c5te8@zOEvTZw&!oQNCON z(q;-{z3glj(2yNoF%XO`{@b-MVde@8dpmzZR-r3LPQ;bsn8Ow269&jYDu1}>VVKNd zsY#-{&y#h&VtLCI%d4=!WO?8C(_7YUr`UpIM~-7|)APV%ddmXjrRBYVWd!~`MgqrM zB{?3wwa`>~@G^p6c4HADncZr|>^#J|4N**-Yb0^Tl5-I+9Wu*XYqGpK2&xGMW~2#b%I(WBsF~K7KeW57JEdP>-9xgO4Q+lA^Pd5@wzE73uIdp zH<=_jVONMgCpX%Iut_0oHW5}#x9Jb�ineGIz7;t;l68!m{8N8T)k{Oc5!Ox0n;4 z4Wg5sbM{;G?^eJjmD6LZOq(R%Mi8vBth~-fN-3{PQ};Gi^sm4Ob>;lwEJOd>6-MRd zj8UFMhjWStJ87rcKAS#fJl?E_wdi5$)DOwiT>BS65SCI1cBul^iUQ7U4=IDOTVY%g z7~kG5t1|3SRoH7*AxNJ(3vLNN&sghkxC&?1l(HQ$0C>ECTR@|L5$c**Iwdd)6~;z^ zQBqDG`z1!@17;PxT8rof;e$IMkrEG@NSc1kw@V<`TCYGYBTIa{0ipd7nrMZnqGd4s zTovWJ4j67z;aRvy3aIZD`>=;b#`$LUO5_+W{3OyAy|hLuQmqgX zTtTuWi~h|#neSo6Rj4nbLoE3@^dUajhU&3O+ECL0QzDPua|+KH`(St9bJA{(#WX)A zC0+uheQT;y$Ne}^oWE0<-PgipO*2x1ASgTk;n2cEPROQM;Wb@?e552iDLXY(z4svO ztBBQplCTwiGP5Z%CE-v6uq0d$xDxi%&r0ffpN>4EdJXo}xHXdf>;q(b>Jp$}Kl=h> zCHrZx7XDFbXyjH6QW{j3b?}@-UHT%*-w{H45S|vrGs$l@lD3}dvuI|ZKR&4Mf}*|- zzzB7XQPk&|T)_BMVkBKO$J(Y(*;aZE&fo$fS(i4IHddteAykr9L1G|C>#~`JNiIkB zgIrL?Wkp)jfg!~aJjl5RSYx_krZNd<*I}9JiYboHU#4LjB+2xH`rTY;J$QRns7Ns` z(94Bl)5#W&U&o8-DDYTa`pqPshH#@vUHqCK@l^UR#N)Qq4p08=>zElWG^^q`MO*#rc(ikEv#Fhruj|sDrN{|UTDbe3+4TW> z8Dhh*-BZM~5Q!xN_ai%C+*cSy0%H)^pXui^m7oWTyfVb~zZe{=&UEUBM)kKa{cZqt z`muf#kV#qRn7@7kjPmJskiu9hFqm{XZ(j-@EHM&?m{pMc)vN+j@_i&$9yx#Nq!wGf z8X3HRM?jj?1!3j;?>=X2_D>3@nn}pRsAM-3uLz-xNtVg{Sc3!4l{nn273w2WjZ>3m zINnBLBX4^#MSlnCx5Hi-iK9VV?Ksn%x((WxvIRMFEKb8fuvdsd4-Y-W&!X}jlA3*PzSs^x|n{EW+RE9i)@oFzS%1W`zl~k)OJ|3^|XLgj6ZKj%|Av-`=FeH z2-*OaA%cDgWTu&G62VafNFtc2y5v4WBoWLiLj+9=B@xV4M38~slF5B#5<&ca5P?`k zm?P#y42_2?F0s~J)g`z{-WmlupQ~>8_IM-Y`x#<^f{=$Gn9em7pEGO~Oc|PEub^b; zxA;m=k`HL07bT4lM5{0^fio* zN~}?pz`Uym>o_?I-3$axzqLvttd$7OM4pGRJyYb_*itAy@xQlc-Eo~+C-kr=WT>dq zV&t0`FVah+T&(=~8Rg00=zJux>NJO&5eCkmXuWiAGu6b`S+GmzkJ!Tp4vX!|nA)+? zcFgDVnBI5~qIm#bX4lUgqio>t{d-{`z)4v{`)#cBy~6iazlUb!DUZwn!XeI+|d0#Xq1EGX|7p6Tl87KIoUNLxJ_3S@S`f=5*Hx2k(p9* zqoZ;bN>(7Zpnw%fNqNjH5=q3g+nz6{?lGB27{5Z=R}gsJNJ?g_#LR`+(D03vX?vq+c*kSw%Y~MR66Xbr#-S%*NJ$DG@V| zdbd^0I7)pH$g}Y@j>*BDn?PF;AQ$$3`d<|0Iw$3O7Xf?GSU{fgO94FwM>L(nPd<(u z32m$+jMZ*{qlDbOpmG;-mnvS63t}|^<$~Bn*=LlF5F1a#acPQ((p&iu(fK4nMCX%0 zM7QuQh$y2qh=@WjGK~y|M~n?skF>=gUs8kIMqre2HUZ zA916&n=(5&bNs0~@s^p$)I`mhb4%)&)|@+==?|2|5~%13OmAUw+)*?nO^z^VS9`9? z0|VG$t8cwZPhFMNjR#&NbB+Y|HJrxV4O~E5GTDi;rC@l*#N(9%CBxP z&82esK=x>;dIm^uUL5@C>+S8sV9BE5HaphTpZF ztQCEEGS<|JhLesO#!#*6OrhmXk`W4{yTJH@)mPt5R2cJ-5+iApyvbYxt33>6%+tlI z_$@*5G{MVDCm*c}xFZT+Htv@a1&mP`^=>c?`%W~;uE)yGD39o3KQ}9765Roz@=Qlo zRoFYY2_Isyb-c0c`4C(+nqk+%Y5(u0!J9=XVazeb(ik~z;*_h8OzE~B|xG4EN!AD;1e$enG>+f%ch657rttd zyIBRT#*FXnT71;bLb-b2kykVB!_VTn247X_>47`6#SDE)vtx$ND`$EvP#B*Hj05H5 zu~1?p$(MA%HEsGIt4qx@+Kc3Ak>6l%EYCkBA+jy@^8E_b3NgXTh*C}kOw}c-E^l*e z_`MvferI=#E_c&rA}l5R2Q0a4-snqM=7yV1HvPK-Oo{0e#r_IQ(RN zCJ&JHnFxnn=`$OAry1=+IB)Rz5m4$gd6E;6GZ34ySf6S3H$@lS@Znkbo17-}naOF; zXXfHt=rf=Fow@YlAkas-j5uF)?Nwley2@k3SWicdW0E$RbYC7LZWGLu#!7W*O53ao z7!8b2S9y$hi^9lbjB*(9*8k3k6UFm9Z836wj2I;I9p!)ryO|k36QYP`^T|4m`=1_xf{-7>dINx4PgK`xLk6hToDe7g}lAX}i{yZX&1#*n>O5F1(NFfXpsF z1r+RJ20p~jFM8dFEap}fWHGlY$YM3V1zF_1!DP|Mi5#75C~ewrGhHIz%gQFohkDQp zQ+8t4<-rPaZlP;`P_0>l)a6U}!xAIuh)FVVrb39IMcehA~BM#n*DDPwhOP?cxZ%9 zA$giS=3y@9NTsb)*dw-%7f4TsWEc@ zl)K_@W^H&~Bv5zg%av>GH|)ze!aMPf6wx_kaTuICFVU{7j2nKeC3}*5V3S$PwkZN$wOo{H~I=topX$(s?sn_JzgV zT<{sN%%wG~aq-qDl#bg*xyLNW*NGie$ra=(ns-wa4%JB-%Q%aBO2Bs5l1(*fYzz%( z2wMUtcQifsw%mWfFA+?=O;4ps3LA@4c`z&z)VA)g5iGUf&qdlYyy!QTZk$b-7~QIv zbT(dgRcMyzDnVy77O`HYMCrcaY3Mg{n|uXaHlsU>*Vky_wg=kYD1-s$NTunTHi zb-PyE#maJN-ZNQIQ&J5yH=31Jf9^6x791g*-zy5(u?j~Ub$Oo`L8qF;V{(|GhvXiB zsWMggi4C58Z1B{Jb+p83W+LV*ywmF24EW?g6nN5(2|IDRiQuR80%5vBm|-ILslY&( zp&HYc=v=tbG*(ecU?A4jX>lrJ|yn9CjNn2{jc7^?lSsiSX{Q^D&yc@t60 z*kF%w7tmt-mW(Z5F}8M(fU$wH`vWqiF9l>u-vcNp{W3n%f>x~*FML|5{rn0r;s4gi zu6=Lr9d{#HE@{fPRC=-*txM6X_9()2ml!!#tDiC*rJ+^VXc-`FJUA;-P3->KLu zh?VNPIiM!dZj%^E>IEmJk|ij@kMyW@6G1WMkmL?kz$jppM=?7~QB2~law!I+yGvsF zP)+5gzEm?uQO#}}<-)p4X6x={Ut+B-W&DT|a&24MaY)}v zy#S>ejwKAJI^d#E6C{^^~9F!)SQ)<++ff4E|LoXQ3B1KlG%~GLs!$FWW)MrJ7t{{1u*jUTq9tMTv zKdAzmx8(xLxEc%cOQd<8a6Y+}v zP2`&#WwNX?-Y@-9Ag30&3P$z58nLI6HGz|v^t84E(YN~74s|eCda3_K@ zV{;sil*?-XG78M?f9!}V&Zl!o!VK%8Nxp6V2J&UU5?~qjHV%P|ec4pm?jSJ%! zCI8*zY*=GrMZnA1UP2VpFw7@0?78?YIa`V1Y|S1sRkmxsDjPif@^H856uw?sbGsoC z*eRTkJOmdk!iS)9dpjRGpZtiR^U05Z&gbG=(0SFz?ONaP`7^vC{&&@!ZxG|Mvsk|= zLlSS9W4d-ewwUKv^vL~NDoNxMb{xGeP04@A*reNLa=ha8jaG{Nbw|?bp(gD@6jByK z5?Kt&72LaKYLgs<7)0&v`ck1>yaE+U_3xgU$fUws^Q=NHVu^_d!e`mH+mp=PO=8@- zSmNEMA{Yd5+E5ygc;S!8Fft!HX)Za?Q{aVSuW6>8a#z8>98oetp6=&8%0J=8Vqh@g z46-X5q50DwGm&Jl-RE3bnG;{5fX4}k*p)yXY8Rwn3e=&b_h*5c*dAmj@*9Tyl6>~u z@tLpTc6H`!I?$vgI>N42vmWUnrD-=nmZsT&^6b|byF4c1nAu1$&SQvSg4)>8ho0s( z7W6c?G3aSEz6CwGJ25?ddDlx%V^uvDBPKlj@By!*>vI)z95Inm=GdE3bDWBGcIH?= zVTn;6FJlw4WTzmJzHB*eY*!j36HqrK^b!z_$IoC7Gcl>>3)ND|#Qe#p;si7E(&RHi zrShSlT3wKRxF7wHjxgM}If%OALlDm-U*hTWj1;69fGH8fMtc3^zmK3L2;||PY|>5O zvnJh4`JZ(20`NHDR7E#o(|qWL_90eoCz)P~TB0fCIcZmP0c5)(2T)4b99r53{!{Au zymWNE4JavPrb#Kwn+Qsoix|Or_Ta-KVplg6q_VmxNM$>|1*u&A2b>cXwr;lS`|xMl z5VP#&iL8EhEdp=sf}ovwxQA}hws_n#Bu;J3R)hbQIX+X!s(-o8rki(te5DY+HW7XV z!|`QuUn}BrzsR%x!gm(^-V9y>m3GV=726T9;o%uD0?e4XD&`Z!l;w2uRP0g_Tbg9C zCd3mqX@OZOi@y1y&7Tiuzr^CYuyim89;-o|n%V;+)HSCZj716~LtyOKX7S7hb4o2% zHCSTSz@Z;0jYfr{3TsP;qY6t^0ZA`&6*dE-bQ6~;jLrh%Ksgx8RTaK5s}Q2ED2+xr zNRAUl-$~=k*Fs#O3b-T+_@f+*l?ucC3Rm)CIT)){6}~mA5TUP7-RaSfs6Ucd7hJ~^ zh8|e0GG8w;A6(8LtWg-nz=(_*i5*bB>DQ{F*O^6E&`;nl6y{nUG-~@Qw|;}FxhEXO z<7QJq17m;@>Ga`sh})nhB1=qh%rthRSqMu^NDXB;UO{4MI4*gdkE6T0GGAoI#W>q{ zOD!xvrh*X6|UCNO^K0L?+&5hA)xrhS~TK=T|pLmN&ke z1JikSH@iB%x>+%?3Q>@gd27AAZ^>FZ3oK?~TTI^9y1P`(x&xL`%|1sUV}GX@9^FQO zRL!=j4y&AQ%E;|yxZaD1=Zr(bF{tY!yLCa7tC>cb1=sv_!i8u%0Iyzqe?T!eX>1?g=Xh({z}uA zPPKdZQ=w{b5t4`dsdf8ROvLNual8X6wxx)DP>LTORI$Ag8y@W8hm?We)ywF6Sl|*= zx*M@&1vgf=I5ztYo}RyKFUzE`xWx!bN6a=_^*LoYL}w&VbD8cLUk-uAEm8V(Q9w~S z^B;>_0;5o1T>rHc3&vc+;+CkwakC16x-kYP-2E&o_nWc`Wm|AU70?G5p{@y~D~|$B zDvTU~aj2Y1o>EmPGOG}(e_5K{P_d}O%3;{eQ);W_X;nbWp5=|fPb#)Q$ClzFKl|_z zp+wVqV3k#z&L}*uGoj)yW?fA!$YdtJn0a2?AWs3d@5Na%=U|7H;2h|cvnHCyiaclL zC>1bGzq8sU^!IagdaQ+|VN*L^3;??+M2vPb7qJNa?vBhQJ%Tjr3k&NXQ>E)Z5;vRjI%-g$=^ z%l>Tyw`b!B;XNNT3I|GB6w7bF`#@GP&-K1zWjOG_Mv5Jb;fD9p6bU5zY%5-2uzWaRl<@o2S<0`*z%JFdy zW$O+pz;g$IxR2sR#PJjw?@$(R4g#c;1@CKT@w!;kf16@_0!5+n=IMips+GG0ik(l&KBrndmSRA3x_zDuX5nbWlrJm>lYn6Nafrl|@|H{(Z)wCUemaOrk6iKi=s879I4AY=}* zdJtx)aq9dL^MIv@{UVE#OS39lwI>6y$_UHA{kh1nmJJ4xr>`zbXJ0mMS&{%c+JWK(stwJsP<^}y>{sr>;D{uFh;-qp%~KyBW=2ALL=*p-`A5?dGRweAaT@`NUz2tXb*Kl~Wcx_Yj|qiAlV?!mMzAiS|ag+X5}(CRL(Ogdg03pvJE zSZFle$rWly1!=nR$RkZxZZzFV0N7aQX&g2)!qqXq^tt<<%xGR4%Rm?=jhyhg<;jj-Av^g#*v z1wN}|wIHZ_`>>|M>pQY(Fq9R)H9Ge-&fS6BJVaG7xmElrKX0g>Coa@t!=wP z6(^^xGgy8)SzSfJk2y*Ip8YOxESm6*uHY45geugXI(Kl`+;4T&)uw8P6{2(10j@ek$)f6Ay6{$C($|Mm zx4SjQ8;lW7-R{v%*lU{Lv_f>QnuXW1QWw=aLbUZhUBM4r!A6XO!5V+R#<;gXHFEn| zyH_O}XWs$ANUJeT2-WAG;pI?$K8vBj`ure4llOsxCg5Bi4Xk2}9@Y(MH2@7szPd7C zY(Q@w5ydOEXwXQIcGR@Z*rH}II4W=b)L>A9N<#;OV?JF^gMr6$+*A`VDyVh?#pLBv zy&lyKKj9132Co?rYNarq=GOlPAxu0cOljx{9%Igs&rEIN(pFZglXzgW_>>tpt_%`K ze>_Hm%!IFJH0Bezv<{g+Lp=c?jRR-wdVy#-0J2T-?9IlHBlI3@?G|}Rc`?0CNa3vK z23ie`5DK&ha?>KbL&r?~q^(2yk&=u59@xd=;=jb-nWDA;LW}4PNM)?JEIpv^9f}>C zv_1YIJhY?;n6Ki&J6hyE&7(!`3K}g&;Rl<(Im56XJ| zSE1Shp5-R@4w+Kkxtr=v@YF3ip>dvm&}_H_7|zuCSy3TjLaqu%`ZYs71hJVeJJ7sl zqKY4ZuXmbC$+~$GkgP;<|Il7F&G)K1plMkgL~S~U`I^_u8&8e*#s;h;-O|LN=aIta zQ8MR(bY!c8rI?5O3>(uZ3fnjioX%y9;>U3NZ0{LKd@8%(qO8HCVgcnyNsS{cIuytU z{+jkQ)ynQSo3*@Lkb64xEG}=B`WnU268hkL3`x94t+x~<;X>4Lz+VJ^_Hk(b>^#cw zXJ3sN_Mmey(1@>d9eO$!KN_TAM(w9^O7PW*Uvm4HQPCG)s^SHZRv)vzixF>}p zx;X%dXLf)?uVFqv#!Tr3absGmuL0prj)NURv$#Cz4%tVWCvA_3u!gQ|#758syvS_b zWUL=skNPFE^{7?E)|2sr*}C1haBMw9_s16GHsKwRhLem^9x7j+KFm-C+y6tjymi5k zartn0U40CU@LWDZW6WfX5C%s#j}(mN`KAfsTnzbwls3vBK~+HnXveM*f!2lp7ZLEJ zjW$IE%fM*qwf~C@c*dB*0>q$Dp-GWm{!bfgunhlS)cikIs*H-T_AQYOE1q!%*X$0S zyPmXq9u*m}w^U8X13MTC)tgJeC~8rWDD}-qX&Y3Lk&izV8~G^K{18??CIOA)W4xA+ zxUZxIV*fWE4}%S!5(}wUf2XMK_(=iWi;$B3K8IBF_hhcCwVM8w*!ty2MSoA#tvCmW zgY($LQ|IR z>B2kdGfa<$i@nov67jeR_~+H|;Ln+wgU15HnM_elj1Y;zF-tzDvsRfmSHIAy5{40f zeQQ@Gre(y64ojd&DOMjda{hQJ&;=HjY^~;y-^3?6QIpK=#RGC z6Z7R$oC~-<8IT7d*Gtf3wFEy&$CVi!*LbST<(@z)lwG7Ldj$|yY>R^x+Yz zxofU#atFlaP7jXDo$$Wh_I~tB-*Z?r2$sv;|itgc-=1 zR+>shBR~_E$naFDho{I1RV&pp%VGOSeLS-+jeuk6;un1{d#QEiFF&>@)d2JZ5 zJ8_VW^$vZ`bPhnYEp;DKa?&@OZDen=)QwSQc9o1WuON?wF9#1^Dx>vBd{mtutt`|M?MIzOUyn4CzGcF(6n$H zV$?O{m@wGdaSSfl;qYx2eRQ5!6PfcHb1a%~RSv`=Iq}r`^^G{fo{3tuo`_nFA52tL z-q_ZI4+Zw>8D(6rhvZ|@4jXC>E{U+d9`D;LbyyR;+ae-($Vp^S;fN;qQBy=X)1m^e z-;wA?Y`l0(J|_+LRNc&o#Wc#4Eb%I>tw_Bu{GEauf(PA8@iH zPZ=4dTM%f+rG+#^opu9|=S7C}djSyApOsH7T!zkO9y%9nIzEOhQmb`_{yhN@)3M&r zKdr*hA6qWLf~{L!)E{Wp0WJo!!6iYUb%0{L%_s1e2d@x=ytc|P2x4t)C*dyvBqm|#F1~4*uh{xxms$fLaR6?zm*Z6# ztA$_MBMsq~t^ksA7AMkbXs_BH{C3(YIDYSFRoMcy6s|!f%rAY^kObVK7KO_|&GONs z$Rv*G8?7fBIRNMllhJyz(WJ_7%$Lf2ia4f!bl~>f{`%s3@4>18fB%Z?J-Wg}CvF1x2q=RMN_#@#u(1Is>Q%tA5`(NTH3-nO zcvcrd?)mk|iJ_HPct)@@Vj{)DJP6oxpv*9}bt@)#NsZz7I6E^!hb6OFCugdcHki?R zxR6E-2E;#j79WtB1R&9Pgc`67-5)nncR!smQO!4MlNqU>h1Cr|$>mXmluc%&FW~nR zo6I0RmV36f>JJFH$wzy03Ur@`x23|~agxI^c>_DKVhcLa6VBLGrvKy6GvTb=B547X zv){T%xQ_n-1(-#ZNbAf}v80Oi2aH25U5&UIX}W8Dot%$(9P6?+Yek*<0bnwAnxj|! z1&ceKOr#Wb`CD+W$_4^m)$%3M$62^0nlIQ7kZ9vcUg`4sow8>+YfqaMYO* ztul8Y9#1o0NkNi;a%TRQ6lyxllp@mMBhoD0l0tN`=qJQ&B>ki^awuSH0%U2=5W2;X z!Y1Gnfg$Qqpgw_~ER9x+@1iB9p#X@vJNsq=C<)`MH|zYM=Kfae!Sp?FxFm<%iL=NMaTfApk`FAh``zP*_ANH~`#C@4#+)T4 zKYlOX54|#Hsb;)^{i1A+pS;HEb1K9ge2vvIUB-0eW`^7-Re=^@MJ=VN;f`=Ku!Mc2 zK*C*#v)p{Z%Rq5@4#NMAYarN3V|-3449XxzF^ujV@zG5yHA?eUzE*@rY+B{z^qYGq zo31vc7*01A=B$nuzhhjs6W6Qr0bfkFyX{BR4v1^zbEKK+_$Hn? z+zMT_Yh|Pk-A>-~wJX&kppcEQ&e#aa82rV1zFzlx*onnofkxhQMJX$?jk*t?{Jzoq1NLjiizum6mr)v7p$Co|EA(Ihr);mZv#KRCWmBbku2wkgkm0am0EEL1 z2fP;;s7}?>d$3iGXnXXv6Xw4=IX6OZ{g4MKPY~+~dBgz9 zsR04&S1sz$F)8c(nkvF~&D8h~5S+;kAqdxnYv8*Jb3str4bu&x;<4(qR;2QVyw+IO zq4;dNCp$(jf8m>8zu2sSi-D{%>Pflwnyenj1N+u{=DTm-7fRtj!@iVU_1o~pNeZh>F&NE@b(1vTq+OUbTGmcIRGe5 z&v3-83@8#BVWdH+AQbm>+-DSkqV{sFwA@7B@Di)-1LQ5HFB-T;f_r4LyW(}DtyT=LyF}%pA zH|QOGhhT&?ah&)^3S-11QiGArSKo}q14~1ZpEP6_*dYzmeh_I`iZs);xYBG~r?aLr zD%ClFX~-F`mO(nw)U#L3NcGjtWF#MGWJ66bGBVL$MiQ?X8JQF!BX1&)=GH@y(%iZR zsVrJd2>S;(tGN$XMgr8G~U!TaFVdxXaItEY8h>?j}!722ThfeKd>tKKm zo*AQx|4dpU1AF6R`I;I(Hc^iN`iQMTbw~QMxT0FV!2PyJYeMbFFWzdVmI2(7&)Alt zrok?(dcD=&VS7V$iNM7{wvOrpq|dRNW=?+RTYige6aX}fm{O|F;i0{)K(&dq+nPq^ zZC$PxG*;sGhZGEYK9tF$*ssqQ{JGWZUG27?$1l*|i(s}3V$`e#yRC^kZ&)N>@IBr<-5 zD2sNsN?JJVwm#skikSS;K^Kx$-DHQ&r8WXej(|$Y=Kr`+^BDl{10!Wb1W9*qa+R&Eo8)l$C+0*sqVLc%IXb3LV^)}2p|o#C6w}V<`(&M=T>1j-d~iM z0Qy9Dy{PT*lN7=SNJ$|qL3#lLWND(E2grJ)WTYmz?BWBs7Y|Ifm+;^vTh*&fwyM2E zwrc!fvVDwubYG1Ky-?Q)f_UQmr`_rvfNo0&bQh@C0L%=%D0+{4R@1$P79khs?$sFk z3`WS^x%;@k3ooSD8mkU>VUup^euL|OkFL5mnc5Y2bFO*=z|4fe%W~Bq0JFlb{T-Cn zsNKMDhP@~Ekj6+zAq+Ak&46aCgTsQ6e#EpA7xf}SNdTI99j}M34(0)xcI(YO0G?x} zT*KGw0Z?b@-H7ZBDmGO!bFDCQmTKYwn?WU<5OtTT@-pnWRirz>_c61cWR=wHW|wgt zcttMbia#aQQ!MaPM&GpqtIP7yY592P8OD-{{`<)Fo9K_jPYT#^R&@ghd(;v9ma`=1 zR3#wh#_UgT6*adNDe?7Lq+|%TZesMY za4e#Q*RY33(h;DTtvNWW}4KY}Au1rk-^^-!X21vH~&?z}ZY_uXa# z;uo*6ZZ3947b7xI+7(j=5twei?Ke^E|0|+-^6s%i6zEPEr@Fe%Zi`O&-n?P1h{0ig zH89^8THtjWq7 zw-~%@y3amCW=v9`*r7{tpEP&rbk3%$H^1Gvg?dzWf#Wi1&fde>bn#|DHg1w`f$qK~ zC)RB43n)NkHYb*<+N9dzfwz-c`y6@ROAE zIi#ed+hy9d)i!`j$5e_(-5&s_Q8(r`!_0$JCFq)}o&>~BTZx{<12gmcc<`$4+AgfV zYime-H{b`W@1a>g#@d6WC)M38e~h*Bbj5D~qotF=;cxkhPC!+uL4Z8Q*A6XT6J?gu zhcbE-mDdN3#3sWGfr!seul8aM(^#@kf4ITA0DU=ZEn}(IenzGD#e1Wwyzk)xY4lu* zT7=ASyIw|0V_V9e&YN#g()WGko61FBnjJ~)ZYRQx+OJ;51J4OY3kz+TM5pQB1}jjY z?az>ACKS~BmIO!EtLXreLLCbUdDj7!iMrFS{Z`{{#zemd8Zl8Gr9AEz%J(`IH&XQF zIpq4WRP(z;Ulyr)bd5*-1HU;)7gCuJeC5YlcYvwh0*i^IH&N5J5D;dnNqAtU+JFZy zQ#JgBnX2IsF;(tgHB;5M0#k)qa_f#erNZwo`&w5=tkg7Rvgvq#o;rh#nA4Ayl&y7;F@R%o>OKH769RRS>cYT44WtG$uwS6k zS<1kXBQc(nDw9JrX8;V<`5E_ug#Yy(W>3>O=BomD6l!!%tk|j%M{3jr6v~V`&!17} zv;m{?D2^?0q`&w^&P6NC{FQFxoVh|Z0F797fnnKB_km@>;N6k>uS@d0rU*b%oeP!1 zgr>EM`-K_c%e8>E0YpM0Es9kKKZ54+Z7zNXc{IW=)*L$02N0iE_?T|Uh!2?Rs{2MJ(lp{B88tQ{?HAS2S`(|fN5BeG{U1grfEq-?=Xo9hrR)W?J7KNJ zVFImJJrp6~MrHDX`2oW|?Hw4Zk1d$?tY_ zDo=jPyVx=Lbv_|hVHcz{`P~`oKlzPsE0f=EW0m_OTt%pgU^Lp*!oPsWW2-fDVYT%Q z;E9IZ<d&)hgRpq=z$g|&67@$AY=j}-{unf4=azN@3Pt`UEUzdmUfr!(^ zYBe5O$*dOZG;Dqp!0&Nq{2?iijQm5fs^Tv(=*pL#vLl9n2lY8pe}xgUk)Z|%Xq_x{pQ7E3eqMbXyKV=_B-FkGPGe;sbzcoI-OZv4b~6^=uccEMC3 zQw87QmkZoIsp{>;a0C+vY(mL>2ZgXqMKlLpC>+kRw{klFs=CuGU04Sv#`veeaJl z_|K_qvQs2cRrtXY75QhoZH$ZdQygDTv3Ysh zc9 zkxX|kyB=XxEasrU>Qz8mxo)t$OwkX%AaSp$wlDu)M@f+Z59ysTO=h;61fy$Yyd3K&Z&u&5{@oYU(9vI?b z<~;>&?Sz!LRUw@R87X(>S7u*LR`0%Pw{^qsMNU7%FMhG5g^Qa8|=n;mIQ!)dJu z9qnbMW?%Jp8kflTR&VH9m5dqerSV~%-U{9iOB{cWhVRSX~=)Vu5j$u4V(3T zc&hC2*CaoBP`c?})7e5GeO?70zSpU&j^Mk9ugz*~`3G2yCCj|4-S#*1*n#{Zy%>>r#Co@#Q&VD&rhur5}4vCc?+X=hD-$mL?H`TwBnBs@eJ?<3{8 zr)()jte{TFHkZZw7FEx2?Wt-6a%sL$=hX9s?0+TTYPu0?eP z5f%i7v#Aq!u6d~b^c?tEji(`{&p8_ zv%c&{_9WG!Wi(a}_TwFL1Dr-G#J|GCzr|iBw7>g5n)aRW;H7JO($u7^dhB>id>pR4p2kzt6kiJE40|cQJJp^?{)kyq9TMpmV4ch zn*wY2j^(!hg!-<2jd~RiLR4rl>x%=jfd;EIBv`5lxruHHPJ%Ip*Kp|4@NCt2EOOIw z;`Aa-$Z2 z=7`}ra5aD|#-;fQD070g;$(y|qno2Oj9!ycS=R7daI-#oR+N%diV7 zYe5I&#vPL#gSdIu_mbF`c!})GjCk3@9$_6j3S89|ur#^jOiW50s?$?y%9g+t5tizO zE6!9N;YUo^sixzBS7heovsTL+0p?SS2FjFwGt$h2OFP`W<(;(J*&XUSfTY#t85a1% zAj1Na7SVskd`Th4Q$!m(^Q~ zAL5|iX5@)_D@Q5}uuMA7G4!&iw+7@e{hJT*qyMP?F#Sh05dA0P2h;!Qp>|sj=UHr~ zJ#tY3XKns*;VS zxTzP!l3PjSR6ib4{F{SvOSUf95NL-%pqIw;MEY5KV}Y@{5^3<8GbN_TpAs2w^^%@<6YkfWt;9alnvZ< z2L9Qpxub3jQ6XgS7y_Py>IlRSL#0LBlH4d>x+RNQy#UZ{p{LSzNrCCRO_kxM#U*$* zE0rd^!Fyr%==NL%Mz~4uUg2U`bETZr9}ZVa zUXjdlw;-ii?ir*!%S|ZOO!WXB^pcG=-YnVt8BZfz8{s!UGSz0>gt(@cNnU{o)h#J! zP48|W(%4#XNp_yJ`-=VTCnKyer@a35bDDDFkQr(p)#=MGB9N2%lu(1RpbQ72D$RsDz3CNGpRh2t#_8+Cu4paj z+iANQWivPbpmpIHng<-11cHEju8KxXO(Lhjh~92K#vXy^VZ9MJ$mqmtH{;$BKqKzm z%IRAwezJ^=ZIJqnjBns4jf{hl(#W_UDY0p<_+U2e9WS#RuxaTOVbgk~#HI;THJjdx z2iAQr;lZo>sy=7kS9P6qUp0QP?)!LJ7^clt#d9#*piQoJ_2_h1{Z4;|eFG3I5Ct+U z;v~$V8Ojo5hB9n_$xR=in-9ej!nGu?;q-jL#nCKWu&a2LNe!GuV-lLl zYJCA+EsAE2iVxm>z7}|NXtK1#Zu<*(GNqKPeA3gnD3{nmb&11v&0r5?4$z3xmr$xV zlW`9uDsCm~X%wPV=S>h@-}ap6XM^|Qh{Juk;Chc5hTq~LDUR3f$5yD84nAfhB~C9u zN^Zz~^qbdbCrQ(AN?_X!F#wv*)k0w50h?VU&~bG(mP^3;NFfEa^ozyd{dsoVM?ps) z>i`Qr`q+FvVD5k`3Ghw0D;F(6jQM+LE3BV)OnnOc7^k_^iU#^TK5y{Jhs6L>J)(Agix1B?R$X37#>BesBDsE&mclNVt8aiyvfy4s z6Xg!71JV%B%4YzQS+pcxAJaJjfNWb|s(T`SG4warxlBuq_xQ!L$Req!&{8uPzaO^K zR+LI3HFqvCyV_Q8i(9u^sk_MRXIrU<7w^7>Rf0hK7G~jXHhQ+;;b#;B_A(yQjUd(b z6hT4?L2961EJ$sZL6G=1qdoZ)M_bl_5QCdJZ9Q_~y;u=x&6uJuVN(YI3%=zeu>v~< zT)8-EK5vlsCRGI6=0e^>X5hsl>m(S*M)!3(kpz+dDx=;E#-H&o;{ z>fAP!BpV^phJHpMZkCPBrc!Lg43Uj&yq=XBA{%&pi>_b;S1=IvAc?1c0}-2>Dkxk| zE%iMzD_xLAg0^Qw@|pD3N#@t zV#j#37Y{71dyKfATWQ2~ufMp8A8fk56Nvm^1q;>vtHhtx4QX45>rA8};<}HJAg%|D zxc+9f5!V{sSswr*;(9PxTqh%oj%OXx;(8vxAF-3T9ya1SV2u&iqav=V77z{tc`R5? zk4t|*PEo>f`9O?)=fA){2JF>;ph}DED|qmVY(p;*S)>rz+}=iHhp)BU{u5@uLbG+? z96mp39AqG{>Ii5?R#EZtpz|Z60P#CNl3T2X0P`-6UQDM(#vk>t!EsVri<7f_=Ywc* z#AYS;rua8#H|SS;#Bp&-u=U7FoBW+>@w2pb>9k=9ia0%gE#DZaUSAK()V*c9-I_be zdxzv1qt_8Vs{#mnNUxt0Mv=3aF>1vI!!C8Y#yUV^63!fQ^9~sYIOW(O<=7}pP#>=s z0lEMnu95Tly|BhnsebQ*VV>r&fkf9|6y|YW;_s2!?2E|tn;m?LpTs=hY35mt-;ZFH za097$M{w~jhNRYN@n-RhtV1e>(GR*=Hvr*~u+dvIZ`_LqeFnF~R!mNL+u>Vy`pCTy zk?Bqkq9ER)z7bHHBtHF`>2tZUWj9v*yb4QYY$HWug2{W~V9@JYKHddJu%fvk?Ze;< z7Z%+@mJyF)*+gB$*9>k1Og2l2pX>&Ho3qt6>%87Nl9QkvTpQ-8`?fE}_HX39z6sj*nVZ0KGVy&X zOJDY6CicnSXG={mJT)ozyfr8$f88{RUF9Z=d|u zkZ~|K$m1BAD-!-0a(GalKqzKV9@S4I94RDxGX3H~d0(~N_LZA9KkXgu^-ScU%i`f0 zP9Gx8hyJ!gccNG90#!Za$)aFG{!|^R-&b+F!ONa-L*y`n(jF+mlpiji^b_X`n~pH8 zGou7wVuel{VMtzbO6@@TMDmI~vZy~w&1^u|^Thp|6AtgheftU3aj&7z=$jF_7-+;C zV>FRf0%$3RsK@HBa*pGsiO9A^wpV0R)cg2Jq%IIr&%w{fA+hI>&btkBorK_deX;&b z*678$W$f&1HC|^Kt8Kh~*=x0ZB?x4-WgO5}TYEe(gZvW@UIv-mUl;@_7^IATF@qG< zK)IHjb%v5rI~d>UfCQbx9awX_~2GEKr=DaI>B124yo)g4uP3uxrq&o$D}-T4u&! zSaYV}(yE;Vk@x^;z6po9VQm)bqm$neHN#aAFxY}AP0$mLIY-QpG+VPn4InY_dC^&# zha1t5R9UVr14xWI$7nI~u8J0$tKSPdBozaV-kaxT@MDI-=j(n*T)#44WG}eXYFYWpmFugK5n4(KBd4v)gIXjdSzW06Z|0Z!k=* z&KM@&D7?b6>J$n9m$S&68KYTseYrXcT;kYGhSS@f1*gMa??P#?KWZ?5guTV^_f-Hy zfp0ZE(E_8c80@$e7pmDiRwt{Mkwv_{U3j|%w!uZIi2yzfHNFq2aQIGXwaTu8=EDFq z8L9AgwRDa;00^&HAHxGPcYM8{My?tx8W|}xay9*8jr^An&aACnX;O#4mt zeq<+-!!f{YIH0rBYfSmFx5LaaWY*gHBC#=z17_)+;Shs^399&EI@R_GP+~nBibGdm z51AIs1d7vB9R}sFX~hxKipG5J=e%8hUR-sZTai;1>fJqRs`$+%s$wWm=mY#k`j|oa zoKfiZQ2G{sl;avDt=6!<*i6e z>%`;iIb%@Kt8CHpz^9(POzL2Iwt58*tPai@b?^bKwzhDbO-GvU8p>WZ69(tYMXDNL zv90U5vLA6p-+e_y|GXA`_XTMP8|e7H3x+a_fGF~RQOp13N@cx(ljQ0WvPk|fiTvly zrX|bv-$VWzlf{lm-p~QBsa=3bWcdc&BC*-7=ubB`+m&FO?R!BWo2|Dh^T_g$1lQNsd+LVbYuvr;FAsUk-WiJ{oT zd|>Ag%7qOB$4CBC2cYgD@%)PxDaaJ=4ISMVh;oT&pe zhQGKXmN++ZDPvp@Q$}Cigj~~vIIA`otsudH797wT!`m{npr5>5@UjC9s0@SfrA8P; z2ou8Soc_B00j7SJwQyk&wF>rA{iB1ysDGfmt?srtLJWjKI`37^Gt4C(zrm^$-{kRb zQuE}Q>PZbj>MRlbrFd7XA#nvlX&nVjHb9ZvN7R)&0(iV9Vb-%)Tu&QniX#JriW^4P zuw~LN!#dc{9$!GU9(a@8JHr#T72PuuY{gE15!^~~061za*2MkZ>9 zKxULfo6`C6a(IWpzko*j;btL~rLWP_Th1}uax2@0h+PSd@l_FC1=AKkDGpXwq_p$9 z0;$*(g}N@Wnm@DS@HQ-q{z%2LD3b1W92zQC^IGJv+NdKGv6>U39onOF7oI+H@1Nta zPT_xq_UIII8DR_wwHNp?&P`u5wzgOC=?ql|NXyi|DoB*j|2UAv0?`(KaWx@sj~sj{ z(1(o^R)mp0(U1@{4n|W0ff5+Xav31uFSS-zk!7NvM|h*3e=U7tE-6TxZ0bXUc<8yL z!^2J%mWimFtv-r%$nZ1OFiSrt+6sfR5NT$@oHY`Sn7HGsHEJV(#2wQOcifI;P?>1W z&=d@@{rO3=?tX2c(Vx)%o~?DN3Vi5j1Z#}DS3iN8l$td3%nAv z3R((SR%%s4=;C{srv5cxI8(Q+3dLBcsb6lW5nx5x0`dc%J!0V4i8 zin(ps6 zA-YeSALRT2-M0!x^KFI>A!h)9v`vuGwi_gympN!OCiD6XYRF2gsEP8rmk64H!6qwl zZV5-Z_Akj8oj zyi%iirFnD1D+dj)lmR5B@?qT!F_n+#&o`#>k;I_G^hX7OOywstv|j6i2WF?fc<{2* zs4>D$NWo5%=@+w8MT>CkgecrRHXS$pAIJwX5&bMPSV_zRBs{%OBPW#JCxYmmcGA>m z=xvn5NmdfK*ecXNZqp<`ZFI!{%Mu+i2x(?Qo+h~+I^xU4Y6*Zu^0S8Io|cB>=Wa&w ze*%q$raG+^>ZN5eG}RzehNkmDgicn!_?f7N3!2=Y;qhl(Fl{r2?>#cgk|)LNtk-4!kAjnvy5x@3s>+_qW-N=JXoTa zOYeZ)2>|)75`K<)pt9Q_CAxG&N^}{Bl<6`P4@{SDI7gcdWrac)q@YU`{bIT#pfw-G zlMiUv*Ga5B|E`7rmKi@bU=PMJhE<)3vaYN#`!dcDjQ5K42i)AbK0v-OZ6JRk7`z0rgA76=YX}a%V{+hgG^x+-C98r$NJGl};H3mlHQOZoXJ2_zthxpa zr+34IKgJNjXg<_eap`Pd#WEQhs)nH7Jh$?W2ig1(c+f|js>4hf;#BpWSRE$s!;;kw zojq;9M)5{hoW4lgvFia#i>RKe;_uUnVx&t?cv}1d?7`YTUu8Z+cB3mR#pXzuw@5|_ zS~i%uNc|0H#975iY0tv}r2g#3akmog7ripZrMD=30)Q-AkJY`U0FmKfoZ&&Q0lN!% z#DfJc-q!C?Egt|6vj3z|5E-KqrrITINACz zUOLOMT#1$Ocf7{DI{**fVWFx>co!*nx0-%2@2+~tfsGGa*Tx1;TU3XKiARQw3c5oP zgWv@H)nkC+Og%9-XhStHCTfgLj6u6*1NagclLRCEYr_Fi*16z7}XZGgRwGHIL0OJZ3#+cxWLA)(E&doy!=_s-!(3sW#6! zu;DQ%R?`kW$M6K!>u*5yM|9z@A~$^8siPVrk1@i< zojRtgKW?fI7k8=#uVZOHRkKb}~x&CI#scB~!WX@~lH67=QzS66*;U z!Y9WqJJ!@Ppg27tmt3Qio^Ivt9f!p*w|5!JY$oywqDuTD8WA!$TLewsj#&g*Y(7@* zt={}I_#GQoc|Wr(x0=vEsswMDNnV7tR$pu0C-9ws$Usf|nzo5euOkDY@qO`qX|x|` z$13&UpTP1kQZiBZ)=d z;vhFVD6mGC=#4JR%pA&l{e$q1A4WzWp)(K23(}5Yno2ufJ3o!>0{_fzADov3J z@6OWsodDsT(|^VTvu-xw$U2+)hgoM^h^G)%ZTrt~tXgXL;7eqOXVuvTWhtYCa4EQP zjz&qJYseL8h3dM5w}Snb?E%RO!+i5im0tqEnG(u(3kPVA*VxJ^ zztDvJvGxKmvCcivl5&)B8P^%2AIAWJn6g6jqq|btY|Mj7(*v#EGxou9qbj|-y#Ikb z+WNafE6iE=Exyr}MqxhpzOfGw_6~a5#2a6uyU5rFYurK3k19bR`(O*o;Mqw%9+)j} z{lHJ7j+!PK6)808WctPSLFcaUd4#h=07K`Btaj6#oNLt~05posV17FU!68zwneSGR(fMPfr;Z-B*UYGh?$fGs+Yg*K26yfnC2^@^pB=pflYRC~G1)KTMOF$;bNmLF zvRR@OkU}X`(JxjCzwb#-^^ki8)IPvNCtZnOP^XVMqhwX2x3q-ileg_GKQ3{QdaHwY zKSgx~evEtBfX3Fhz3FCDIiJ=?=N52oIhX`$M_z{+6!tY@MHrk_S2!8L&ktR`+z-A(BLF}wk%J2 zL7~|Ef|UHBykentm~<5A*}6Q$u#{KrfHdU7r0VxI2~ZF$q3BHd-*!#~6x7 zSc8jfjONohTkv{T>d^cst9}g)74)x>i-J9l)fJ@oC&dxuXGi`x&H5dX@A%nbSPR!0 zMc~$wNQ&)UQ3=ML9taz!EeKD6X^>bDan_O*w1v6^1*Jt?ouW42fp0EQ!T=RdIlus$ z2N(^3azNN7YD;+{RK!lb>Sl*cuw{`-9w;iJ6H;1r8-z4OMJypCQ1UCy1M2QU_(%?^ zF+qQJ2SCI>H8F${a*;=jFi998Rc!-6bi~)f2p*MJ6NSr5-WzN*1s0G<=qd7EQ?(Z0 zI9hv~8muU$N#BT~m?rN)QEZzniXtUXbI;>=@Xqb4=Lq*81^3j_FXo;PhmfK;J=C|D zB^Ks2z_Z-uDnsw^sO}pY#`2u0=`5BfT|$?fGRsiV&+=4D@wQw)=XaM=iQ%GQ;kl?( zO8=Q2e*UZby=I%*Wh659dnr_r7O`@VT7(ByAai{RBuQ-^jtLAKhx52jJ;Ge6^PTlN zU#F5lBpP8lA|>`2h%|(K784TaUuM|nu91d)7V7VP5fEXY@(}jvi#%eVMTUL00wCQsyt#}C+Mx7Kep6Nw&xwRRoE!qmbcsVyRe z4ZhJt-f22J+~$xocr$RramILjWaCXZ=#vz1Y1WqGW@UEAasQQBwG1zak+v&IFUy{M z$ZmVXy<1n@!r3C$)zR9GZp0d`T&d+u*u%NjBYY79f}2w}@eR_A)xxhFwp&{-sgX+; z+F-z#QDd%HFqbYAcpN6M-fMX$t_YQ1tl9=v)bw_NlJQs|XY^o#Y%d$Y;; zwPEVoMj;M>9ChD%lEs8MVCIxf{wOjP?I{S&zev_AOExRNNDNjVt-lbYv|a`Y8t@2( zwvf;Xw1;OPDtLshaOs^KplN>W?iO{=T%&3FB>QWcguc2G(KM9_@Ma?+uuO30m(9-NwUM4R<~1_ zC<@P~cdBL!gxKwoh8Q7T0VE|cC|U0u+Y5jwiNVRDBnr!nj>zNoM#0^9Zl+v=#r!f{B!ag*s6bKKt+J8V7TcdfNs2iHW% z4n|c6SZ4g?O1o9EmSU{XJhb@|z}!24rz%qf2E(90*eSixuu~&z%Iu(HI4T>jX7T0V z0iIgCt~5_?0ER>}4#p@FjKZaaa2;2=1S1q{h92*00Zq0H8ZmSSyqw0TK0E&p1-H${ zZ?ht5vo`i=!ZyxVLSypr%Us_x!4!$YSO;D`d@FR|e!Nb5#FimR*tE#bXCdee&(cNe zUI5AdeGh3{_KS8Q{b$)gN>f7*6lW8Lw@d*%)^xiI!`#5*T5o&2zYg zKkaUtYkE>9IlkS^bG0tHTCP^24qCx3S!Kqg1@iqh?pWOR9lzRPqp;IuxDo7KnlOI| zfDA$l1uyJrs#U-uqLypL61Pa2B8F|dHKLQ=MC!K)n1`P<04)Kx9K-%dwFdz4jVw*p zzL5{BWY8%@N-AJKQX$)NZVm>W*|c(i@LK6>HQk=ZgLlv=s}L1{6e^&Kez6MpbRE3p zL5Het0G1g~NAHK6*GKQwJs5vNLrbpG0=U}rc<^cb)f!=qK?wGduhBH$jPgSRvsOuN z`dah4%?b(7qB1rR%bCSR@01)2wN4lQE-(_^KX>HN?Lc$;(uk8h+3s>g-KxZJEUx-!P{#d4y@zmZ!6BW4tTol&4Q?+$6CF9zOj3L^m_#cz&`ZD(c@cXVeAyBXe{-Ev0uGr({U z_!u=B59}wvwmpo-E!FhRuuouIRU*wyA6G6BC+U>faP~vr*8E|%?|PN1>p&qPsW!6p z$1O&-cHKm_CIgFJ+ihfPk9>v5R_0bR*JvZ^UZW_h+W=3~z>1296x>Xfefw5d8OjL;O~)zGTX=z>pj)n*OKUmVVA zjOO1`+@)Nt}vuPZ3$3XD?mui(7KI17y6Ks6V1UW;mz zM{kOWeo^w8Uos7gutKBAUJ|6V?+j9;br__j+k|vUst{$T(bmOsJY>*CLu{WMT`%sM z%Pc}>m&3{x#F0Rb-$lqWAo}FJ!B5^_B8(t;&jAc0Re>tN!%kXQ_<`jeJ5rwZU_bBZ z-6Hifk!GgX>J_J3AoT|Wq<(9;It3IG-)lzdpV?!i{`yU%egv@SwHrq2vr~A6BT}ER zS4PzPkot|NUGS3xzGsTIj-~=2*3lO!JfeEkb%5St>!`OXwnf`+S2b%8xlxVYr@e%I zQi2wu`by2>U+$~6p8P*<%6~&mH~=N%BFFFka_`-Oxm=Rjll&b}(s|24@fbPa-mJ!9 zYsY&U#$*$OH$;EQFEvrUkeTkH?O-+6DHJVd_SYp+RR1WomQb99xM5`1Io=_y>HxVd zp7v4huDMk&HDw$mi6DQs!hiok6j97?fXeD!V2GVQKQ9miQOp@bF$Njx7X}7~lF1W{ z^dZuPHdJ~8y^ycBGKy>c95-PY3J-v1QX~bb;PFG$gk5#65DdgK=O%O|47sCJo1Y?l z!&79ZglFhazajWkRu9i1+S_$EUZ5u@HMUn{54afZZN}%v%ma^(W!0 zIrI39TX@beQWtqE53N^O(0CoVfgiC4^Ao(6k%Yd$dy&?v>+)W{e$Q36!uHN>F)e(J z*h=-dzrmP{o8zsLxe}6elyDkJe8v$f5WRyruFYC;1Fb~wjMfE4WM5GK1P1Q{8JnVP z9o<+j`O8s{|i(WU=PVvTw{K#Is?QQo}m|TjXx5;Mw~5$LP&D9 z6ynOW$1s73Q~r{vj)BLxw4#Eo(U`w`cPR7ig7L)~83hy@DJ93tz3g%sZ=|#jKwVi% zCuk{cQHu>PwEits~;=}4V9x@|fAHVrw6dvZ!Q{5j*v0dXR zZrvYFv88Z?(GFj@Y`<5dAli31>v5B3?e#ChJD7K>GCmVty!PIQ(I7G7Hw_3golF^Dt2ay zaz7PqyG>m?jhPGxJu5|Zejv$~3a?0{wQD3@K>K(j+~r|?GgAHa4E!p=$t-oJr{t18t2kkC5`5CWZvI~KXYX4obv@upPsY&Pu)pqfg& z0tt(*C|cJDYd*KBAtzJN=N$oDP13eiq%BLe{ocX1F?K?lnQ%Tk${UFJRJQ5?Akl2Q zq1ko-eg(h|O|7_Zr1D61Ouq5K3&HouB>C+_&&0T#&2EC%9(6;LKn=RKq}r~t8npgxDE8)chpl`3{M;z( zaNVs4k4;X%1Axiwh(_3y?|dz7MIe`$^M*Ex7{+-5Sjuxa`S@ zXq=Ojf#hw-I}appL`K{Ghlh~-z4jJ1u<-#v!VegyH7ox-3SSY%?{&tXookz!-aA51 z7%)oHXuvodzQc-8CJz`^>u6hd^-$wzTQ_3lx)k0KpQfHokG3Vou%wWCV_zF@fcqSPr|ydSy5#Wsg@w;nP+YX;jo_B+9J;H2i8$R~E5 zg;dxX@xlEJ@OPr4*)#bcq|)&}=#D=W%N<{TIYm1D+|E>Q$Ezsa@rl)`wl3=BSafA- zNWf^28qva8Zwz9L%~=1qywERDI54gWM*4NrqY>7q#gTz%YCm4jO1)MjaR2$?4PC+A zPIPS0mcr~*o_(aK*O1wa)>(2=Wu4^~G6bG#^l(I7h84Kj@@|UlAyor>SCk;GUoFFGxXPUUI|S1M_lgfp_s1 zzbd`I$n-2NP&w;TaZdB+@zJ(cc0Qfkn@jY>VXf$)h#gJAcsLr@1NqI|=sp-15f%qT zNB1EPT_zYZv2Q9()GY85fPGW7Cp-?g$L2X$TSnt~|2*|QiXm;8o2t4lBVX%p6QXTT z0njg1q+2ZpK$d5|OjX^#OF-Ld0FuG2zv>JY^Z4{;)5K^V+6JWRq3y2#Jjg@aK-2%T z0iqe=pj26}`5wPN!0*ASs{UiJmm2IshXarY0H4;K1psN|14xA}af>V}HX9gQyM=9^ zKq~perO)i=nCc#m=u(5*G!uT?F&x?zO2Nl3ND zspiSV$h}6$x{5!ajgWqBK9c(xbPGJuCi5QLH49Gg+;k*VC8)!!iTI3{d?{b;r`)7P z<8gt=&Ml3+qxLAB9iKwk)IiSWu>u4~j5*>0^#o^^r^2y$Y#n;jn+0(p%7e0j@a?NZxhnS@6`#Q(N*(GW!?quRL?+jk5l-nVUC&r>GLytk0XPOB{v2K z8a+BACA0Sfq|M1t`sq>Q_v#KP^rk_hYDd5VH-+Q?q7BpVV?r};bQj~^ohIDCmR7X7 zh60)dSX!A)F+`D}DuYECe)3>3Gu3afpdoaY^k!;OV~Fq%Ur7jinqyr4O3k`A+V+S# zgJFf_r^NJobI6MHdnvl?-{6f{Q4lmls~3^$XZp~f!Sf8$?aSJbKHCj&3z==0Zg<^B zvyGRVqubdun(r@^trlq6XaN=F#;CU-HOQw^CJ3~;dJttWiEJ4%u&dWnVHs&b&4r^J z;+gA$ppGJ^ISFdJ78q0ArzS;OeU7JkeXoeuK&+o$?i0)-Uk7dKS9N$bE46fTP`o)v z&LSf@D8!lCXG|ytBFwRDbt8E-FD_E0<9S4OZlkHqtqm8uU=VWFulNPofGLYM32HqC;V zv5S61s$R*2t@{+9#8NAv*%N4mwh#c()~k$wo(4!(GFSVNSC%r_7qBLnu2s_ak!<-^ zX+=EL&5C%l!z1>?edSTceklGKD8`0c=S5MrR;m~NW~!*$qiq>sl`l57p~F(t3&3zD z`%f)J@2>kV^sZ;UVUWNXNCnEwObArC>Kp?D)vRg`C7GEJs9e>H3=CAM>Qex*!E>V; zg$MQ|dsMXg&uN_*j}n&~;zu}0Z|O;o|8U#3l?=DfBbDKHucq?0 zmj9)B-byw69Lj^^Aox2x_X%yA?>FQLS#pDv?)N8fc>SBAmfZus4bj2}`JLI zb@@+xo5E!Gs$(YFA%8{unEC{&mXz$_pHRmZ=vEKhU+__mqeiTrK-bH-cPx-tDT=Lj zRR9Dk|F|I;sbP`LT0G4^p zWgZ^*$~?4f0M9(|wYkj$|6JooF|~7jHzLwnvfR6zaZP_%CuBBvH6W^QA6#~&w?SXm z#JXWx9&Z2ZOuQLr>eK*oQy*M2I&cs3!)LwbcvL3Dr-_4o3@~Zlcued_>v3a8_EJ_m za1Q(4S~S7vwQYHnH@4}z<>o{~vRtXq-=Vq-nRHQNKeZLeXmeZRlK4_({wW&dnGXnAlr>0+ zY%S1cB3oOeOtwyU>ESFtD#;9IMU9j6aJB$XU78N|=xu@ILoMEI_qs?2dvwr>Htiwm zN#sHG&(1U1uOmD3;NTFCD(x6!OKE0`52q=I@>l=F6r_%;4<_QUU?R4%goyFz@i)QS zU6H0I44>4PJ*G6D956|Z2JmV0X}&*U;zmgu#aH2a+6+^pLuv9?WD-rrXqrsJZ@QiP zAX0HyU`I1?j*@c){Qk zKHz~K{Nt~pZNKFuKfV4y$CzQ2qf(FBjLc?kzoiJuEH;F4JxhAb-yq?|HK2^wC~05$ zs1kY*+XEkcw4NXl=a zQGT)r;p_yR1mcwk5O0w`@jeF%4NJvH{U&%@@sqqMw$3s*bwn!ULU03?tvWy`4&JT5 zHH2EO33a|16Y7b3G@;(agYmy!Fa||V>m<--)$c%?_<#im<@!AgA@8&|0-o6y0SOJ+ zvdYk546=h)7*_u`G*}a!1_>`|8r+WuromcGgUA0MH0X#lGcj;cAxf3pp9C*o3G&D$ zTW?6Q4FDR4Huw`kwTCn~ZEvX;kW&A5Me5i83O}j;HzOtEpc%#*>3`fcOY)7yTF3pfX>_5+s5m-ToT z7of6sY7(S>YkD%Az0m#@a7xgEL$x$0g%=#6A+NkhPaEOjFfYOjDdb{|elf&GZk%zI!DeN*%jRz5)DIO>4kves}^59}uZ;ekE!Eg9Hf zMJgKUq^9QB#)_H)kijc8C53o!dk*u{lt#)=gGMUEv(iXqo$J`T#?|EZK4nOG+K|#_ z1vtMcvkN{I7vSv%D=On8MgVOEiX*Nj$M+fiiM&4sI=;`wX~*|t$ZTZ0K^>5$g$H`N z9p{Z)y-F*A(-$7@3otX3hx_CIlm0On>0>{_qn-CQJ}M6FOG0CDX!qjPCpffULVjXh ze}{Gz1~wHWU@)@lCw(3(@^YMZXD9s$?rca<7o;)+yAr3p*mD395xN>E zLZ^|*cE~j?LM{Ic5mMf->xP=21H|!z3X%50H*bOk%62wwVnG0l7^*`8PjC>#b zRua^&J|RvNLbte=du7V~Auw3I_ph%PFU0dX4d4dQ(-!A}V>Drv(`}4??LGC{YWf$y7L3=%QR{!An>oe{He7U6g1l54 z&d4&3ZEIe48DcA;#RheX{^V5mC-eS> zFQ%+ax2E|wV!Ghe!kX&_w6Vp~FOkt)Mn;a;2Wv7 z#S{f*vFNoxDkNQ@Yts#oFxw*fm@!yFN_1^X-KC(Vr5gJHW2Y@lw^sRAWwoa&AlGVL zl{M}{sKvjyDhsG1(j;3S`Vgs9WxW*c*dWL@*O#=6k(j$UgMd#aMs9K!gxYMHpvh$^nWX zy`Ux5ju~Prpm&g}Z|>CJ+~xUZA@WjF=A~P^{i(D^keFe8s2XTemA$$u`%G2l(z74w z^7reidkjFv9QIVD8hNQ{v(v33{#B{)R0XeA$g7b@-LHbq z2zbkFb{sR+nnj;~%+;HH$cXF8r#XyO8zp5mplWEU1Ud&um>RcwG|&sO5nu3UiRvR&$h|bOqqmgA zgGOg$rl#bjTYVb%jYE9}Nkn`i(1Z%v)TIwhabATz&F}K&Cr4%-+g-E77o1WnrIwW) z42wD!&&r}s&8lPjlN`!5#|n)@r61XPbAK!ZiZgaO?(u}>;n@fUGWHjYgaNw!mfbqN zSgz}IFF54&fKkJjT>88@P?!BOa-FejYbbk=#>i9{S5T~f8H4rLhnTO2VB@o2C8-Rr zr^W8a>*iWd(>#P!Rn1H2$yMNpCqCDYqIttKMn}ewQ^}?fSp|dZFB=q!tYxXYK+oGj zRNSgJ4ETxBaI**1fo7bNA=&9a8cr zK@P6PHvYdECBoeKxpF^HXd+;#5hd89Fz{S`z1?lQf=vc&Ye|rX-DOzxk!2y)xQq1! z1~QBhGQ^KHbe`Qe$QpmcgD_Sjj57#Z7X?|lw>${rq=F4=S$D3x*p+G9!VL;(S8E5S zH?C7LSn-hS*y&I!|2iDqu0!nf8?VcqV9Fi7D#)rFt!oPe_$itG^eE&$*?AYSrA`m$ znCb)RbwC=~&kv%H@Su#{{02Ek!yCrsbnf3Um_F)@Y_&lZ{Tf9yOpJjSeCrzuq_rC*> z%!;O|ugCGdglYX`7WHSOFRNM5j0QQ@y>a#ED?r9He#M%l^?>K>^lYh$tOC#0(mJ+3 zq_r_L-yDCvF;~!omHj$b)9wJ!-?QI1nPV*vNvd0*P^=p#zpmx#2nrW8AnQxkVxtCN zoxJv%yDnE(D!_A#u(NCGxVi$Rh>qTBVT&ob1!$7l_fz?}_!A#zeELwt?)^p)3U( z@s-1xKCzyL6)4yOL?*dEy}qmj&>_H{a856`TenLZq=Z635{JNX6y1Amh;^vabLJZ{ zdVm=lXN9(_#m9U$EmB*#>>RdZ%Od&&FJ-tk;~e9@gRv+^iRn^#C*0D`7;J?YN#($7 zq?SfGh?&`-vP@9Z(NVF_%p6x-E_}g3E}X^YEl^`tay*JQL!r8Ah~@UKf?vi#a7^$# zT9xt?JpZOY{A&d_A)VY?tSDp{mp^c5kUCKAfwxoe^0{((iUz@JlaJ_^R|^5FkX!TEHnFMOJU-x=ax|NRPH9Z-Jc z2z=Kac$~}UT_f!k^nh1u8TvPd)~ohvt7!bK!a!PqeD*J1K>8Twt*Ij+7)f`7tujw1 zO$&Pg+fK`cxi*aGZv!b+Spr`-$gw3}jUfU=xhawUR~u|P&~Mj{cj|q@ySzGNCu^6d zbk4{2!#ld;?iRc|rsM859e3m??zl8P6diXSo?Fyb9k=8to*)0t?)m{bY96|+cSm(_ zN8Jh_chtySs5i9@=77=zu`a7>p$^pa5QMp6A^jaFsmdM6XOGU0QzH^!X|X5g!<*qP z!%!!O$Qr{s{Q@v>YI$uS#$mxoI3kqgTR!?i0r(2Xvna&FY_>+2tsep!Z{In92H;^k zyzj4#tz(-8{@KTYfA+h<^e`S8!E5;fQsLF<2Gsgf-0)1905P))kutN+1TgEY7ZW;J zX9Jj(c}leGIl;@s#WPCFo-@q)=Xhq;{8hnV)(|{f8P0KIu%+#UD8wp2o{82sTtl~Q zXY;{+wO8D{DIM^d&i_#5pFZUup8dMyC*Kg^V4JE6o6``>T75T*vv*TNb&tGhN`}DUoLaC|`6X-XbMuy4!@`wC#imJ`d47{R>DdQ(qn=SkV$No&9CDsK&)OSlcY7t0wTerr( za)4uN4^a}o8_ynz??>HAVJVcPO=aJnp2HM2S9V2VbJ!K7cvf~r zmuXnaaEh#R%lp&NBFIqqfQD*XCQITMfb_h}OW;|&aoZiharEEQ(c7I~vQM7_@|4p{ z-f0yekJfm~YKVM~640|SQSz5|d}pY}=*So~NcAwuPa5v7u@x8rez;Utg!Ws+1eV1{ zB`_Htxf@{$_7U2=nQoaKSkDMsHa}(8^SnFKylZ53`9hZ2j{I_}lG$FVcty!ZtgO-wCIkKCIwx&xthv>@rZ2(-A5`inxm=q%q)0-SvkLi z2NBLOS~z8)X>=@0DZ57e90JBW=@ zrJF@LPS^S2;G47FM6U`+{tQz=l|R$#%aT7+=XX>2eUR^4{w(2nxYDjlN?{hS4^`X=yxbPhPt&~ERuC2JL^5l?u?%cUL_f?gfvpm!~I697p z0T&;yoTqa?Rk=ga&QtsNnoG$okleUJ^XY!&aN(82VnLPHb4&43YQzK_G2d}qzeE=q z7CjZ8S?Bc`T%X4(CaCK6YHAC$#3KF<(sWoI1Cc7LaiK>7#cEunKMSjIJCMGB{_QYd z^zRZc{hR7oDu_0S`#~VYH&U|N$y(+qQCo@wwIXf_y&D=bP>D1>gCA{bpSa3`{BJya z)bC0y$ZG+03o`HigZK_@3_;H4MMd5vZeQrDeoKUO;iZOj9Gq@2kkV=t=T({y`+?z% zoj$d0fJwMoV?-`ujLobRH%bv$wp zAlC@nCY}4a%Jq>n)NZqup!0WEQxPy&f{q{+CAmevn^3HkWOF=-lH8`1P9CmXNjmuN$wMjg#Csih`Z-6 zTJ!;4PpeU&4(JaoRUZhDC2-}S#<-|3YLco$f{}FCRH2p?C|ZX-qV>BKHHp>{DJ8DL zl;R^iREU=_x$;p?hXIQZs=U9NZsUo?<>8e~=ywn;PAi-f9&U=lIjM_>!Wjl6Ryffm zqHrpG6wVnzWQCIlg!o2^@0jg)O4JHxq{v6aIrWA$QZ&vzyws-lA|(}VVc?nh=zDm6 z&X{>s4U{ZYHGnK+Hq^4Pc9oYbG+)gv`U`bLnie}`iRUPY@$Xh?28{=XGd8<85TjaS zlrcthmVX&^p39CJ?e!+q0VSsySbD~4TSaA_A1eSnu!BYGSUwvHa>6E!@R zjAvN%+ugQ8&$3wDsNv7(9FZ3@Nkl zE>gDH?|QS4GGQo%!E*19G`^AIODF4o0RM9JfN=y))yrOVGKV`*+`L_AF%J z+0(y!Q1>!6-Twxtd+f-MQ9R9$0Z$9@tonE12JqBzYopzDlr8t3ly#idWXp}WcrVzUi+v3{;TCXxPgm}M=QgG*mqjVImqmf?6?j%` zr>)o`S6i{2BDS$qv*|lViA^lM1W4oXk&~2Pf~RR?Y2tPki$TbUh`6>y2lYYDIQ`0U zAQ!{Ee ztc#dpil}9IWUCgC-lg~Pa?%qO66!|+{p35|wf6entuz#%jR1MYNiUvArFgfw@=n*W zoZ^xLF{f&ZxXK~R7%dWzD)V%@zr4+mYSqDL@fMKy*hLmnRyDJHL~6DmvPeaK&DutZ zO($!Pr$jwkxKSIWdoFcxZz0$_Od+uD?xSR{E#i`^Boau64dmm5Xbur9%d6;vxu901E} zqls$HUCd8PzbxP|Ub+S1E{A zfwT;8-i5Z>TUhBnL*dw6qlMGsFIcO-BtqHAS{op|Q$%>{t`oc|W~^Li#>)Qtc&zMk z){e1q3Z6Z(yg@WrNfn^cMrm#gQL?--1hTvr&q|gX9e^xrrJ03iQJR~yRILOgEP5b< zpWlYsGBbfSq;+Q@$o`lx9g9e1BR@y`!C^_X^iAUj4`-KmU37P8Y`|` zFcQ8tRSdH7Ps(Dx^ex;-Lm%SxrqTY(_d9gq%T(dKNuDd{ehU@csWC1whH}f9Cdj;R zmk6Y|Dn?2-qn3wRc17~-*5KLVgx#%C)xzFDM#bpk_d068Xx&IOvgZF)$A4l9hph%fL~ISZY*Zde;#JF$PA3 zLB^d1-W|+wR5Exph&sxnf$AuotYeCs?@9u1DGH>?>l8hnVCo~S)*Uo?8rOgum0 zUW7iW?EvmYp(VGGXES}N0udrXrwR^WT7_rTm*SwSO<(#H&pefwh%`0Arw7q?1@q}Q zbeCb#+%4{8>uv#AIxDgie@-{vx{Qc~#lt)Z=QP#+b^_zJiwB4^v*OH3%6Xl+kTc~* z#>LXT4g*qi_qwR1xB1Bjb+1br<1JuBvB>&#&nn4Hsx~#2;9v$#xw*jJ@zK8H2TK&2vQeBv_e^Q1m_Hm&kk-Juy(X2wwf2HECg8&VF$4ihpQAQ<} zZS4mu=?{2l$~&gY>mtk&A415Q5oWVXw4>@fkaBgTqf4_e+gp@8HOv-~a979$1!V;s zL!(#E@|4m4*jXl^sS%ft*sY>*>=R;havos%DB8xSQ{ZtLi5Pin`3Va>tzN>Z!}!cb zUK_dDyfoVgGAZ>6cfj_^VYa5>S%MafP=i^t${B|BjLvPsY{9O>H#XN&2R`jsh&_l{ zBVV)+vpwbL;l{`9yXMeGPwG?$-z4XGvxB==BZ_`93_G~DE}^b*VYar^6?tLUu-}`C zs@SKWxh)JUgOdPFQR8wSY7KY{9bi1gpT4T12%vb$fs0M*UjR!vv|)B5za4G;OqF=& zcR%$~+=R|yw%Xs5H9-~oHc(TEj z!fdYks|SB2^cmhBWG}_9mbO|?+bGL&*nZ*|=zfhZ;iYGxAs#{V_^?q&r14Cb{QrP1 zjv<1{!Ji6{!{?3eB9-$-!!-#y-^M#sT&+nk!k+{qO(9Hzkw2US_O;ik+odquLsa$+ zD9~_Wm^I4h8wh3*#5cLou+lJFy|~f3dF&)j3C374h|M%ggkUKfF7Q$j~cck(5 z?Zq?*4}8F+3@H;g>6#%fqTrx{h(M@_yAN=_PYJOmO8Ih_YvPX}?wnCL_U%9% z@C!Fsyf(yHleBm_ChNL``_JFR`048Pr52=-O!3SwDRGR$_LyUe2d@ZtEKiq^%E`}Z z(h!`m+Kxb#&pIGg(@mXUq3*Y&;U!2#s%CjLoKF#Eg8*{iVb1?g>jvM|t($9FH_ub+ z3S?%u2KuxvTemK}z>Q}Ws7}@@yikMGBx~qB)6}AXriRaVHx+jzux@EYtzLE@Y{v8V zpe=K<&YE^Z+eL0BWS zU=3Ow6)xL>xBf2Hc2zH>&j?DvpEV;0c2O}uvA?}}bhzyoG$#bZo&Ao3B0|G#%|ezt zppw?9;$o@fSUp5F+4nOj(1z;X-PV5-j^d)@$5uN#TgkHU@>nJFDjL)sG5= zRs!;ji81wTTTaCce7O{y$nd>XwUE|D|84!!y{J0SEdp* zjmHH*NmEPmK5Iev+!j6H-3EqCPW&;pYK)d)j4|R=paXfEuEKUx1e^$c#dCgs>L6zXG-(rBZdvPnjUd*{vcf`PyP;_|CY)hqif^I-zijv+~^f}H|hrD)c6M>>&b%aI^SS`0A@OW~26{Q2nJ77B_eG_R3QaNF| zPnYBf57WoR_8VgZlHVFomiz-=W=1d#0#r^19&ALz{+DTR5TLju!k#gIeScUp1pX;k zM3{;z(GjV1j0zzEcZ|7>bjK*e!&MdHvMeE7pX0T?9gDtTk3tuSUOEd`Nls&Gi0~bi z79<=qoR@>Ud%aC;dLOSgb(%RZuN@E|N$F+SAm{eS1z9(qeb*}W1r;u&qd-lIK!G4; zxV7>gUy>Z{s^Rsrr)zrs*Fa5EmN&nC<*vlqKB+tAc;xb(<)_s6TaS+6_lx*_T93z- zrdd25cSZzKxq9M^;nLTI)F}m41kFbtpW!^Kc~v$Hh9}(yl!FwshEbiW48im2!`cvR zenA(Xf}La>w(NpG|1Jswb}CaL%1{?ne7A-EJ9;k$7HN%pbS`O;n+uGZf(}&a{3FN@ z^U^i4hEV-IdQIGALo~6d%*pExv0=7ffkfYETF=98ru7w}HKo9|mbH$nQU~WXRgjg* zf#W(LSDBh@f^)C9?$s+A&;dZj_{KRG44g5Jo4OVtT~d7!{Wp<{=->8;ehz@@h{#er zm@#1^;>ckn*ci%wCk}hbV?x=x+z(t0xgXrw6Krk9KX%XXCWFb@t#TLN$Bp+D3@o|v#6VzF`efpH7BinmVE~>_OcSZ zrcHIcrcGI@h*y~;_i4M@-taK1pv&N$ySEV<5kphk%wWGGk5I=x0# zve*~LnrkcG{*LMDVDq+-|4nnmAuw3eou{ijOYe>}Au4x~Hj{%fI~}=*#skV${t={d zjC@#vgx{g&&@~def4C;SRzOVp5t{To8?8e{Ky9TMFj6yMls5xLc{8B-Xq{#B(C7re zd1;Oyupa7?TC*Oa&Y$4BYUuFz3!*1GY;QNpbra-J2=0i9fumeTk6go(x6%RyeT>L} zjL^kxji4{!C%6WN!Safs6?idB1%>h+p~ohukulbOX9`^c2FH0QPY<(ofvbB$0=a@5 za2mXn5oUV{fII=D(@FqD0g;f*nXf7?3g`lIDFBRHkARw zhV)^ia@@Q?Q#Eu_X)P77qGEd(F3y0j$l3Klz9Qw2Xx$N{qeIP@yl_YqLY&Ll0aIkY z{|dEi9%jp^zs<)HvBl33G2eqe5$HT|Jc3jvjyUoR1}R-6&WMGAts+tX1grcQh6|9& zoS|4VqT?g5Owh>xAQf^h6{$1P(_N2;tC$?L9~crnz5PF9wPEzi6XCYs(l1(~r$zHp z*uo_?W5h2@pjEg~Acn>xw~n97s|c_sqj@5*;B0*}S6E^CLU=3IPXSAA(6=iMN_(LA zhnz0anMtLZOi)<7bjH@a$Lz&D1gu!4Qw5A3)cGoRsxlNGX!fpBug21SnA#YfY`s0wl-1)@khpBRBd{893H!?e$mumVsk~7VKq! zh!<_6=9+lXt^=;T9Gm>*db3bK&UfMR0&a1L4k}*$i9~0ncOC;n^%StusfPPXUNXIb zXEoe^@pzc6w~Fk(7e}QqIisj2AZ>oUd=9Xh<2!9N?d}hhnoKR+Uhti~h}&+sX$BKn zue^sc*_bL*L$z^qUh{TzUV)?YA8o=^)U9$oq94L<8PUJiwR7%J9}pcEj^SJxSr6fX z#}u46hYEv-6TjQ4!+5(AB&12?Ze1}op6~YIOypCdIuejdui7h3b&uy=@}N2DELzC( zq{elq({*^i=^1E|a=!sYIh^6r%WH=h{s3RzJ|AW)U!ICpt_BFT8l(mY`1i28hKGv6 zw(q9ev_-UE3x@Lb@#REUR>;V_U+Twew&L%bgYO0U`wl2HRH_pPWaFU7T`%!2>Vh``tjhq=Ml!!f6COirl?FEp6AIOYZ+rAWdY*vi=TAK}03E&Ns5%g+%}SG6~)=)CEY;g(TF7d$qsIQQQ} zRv4It8|Xyzm2-bGpfbO>q}9?v##3{;D$Na1OAUUixl!%UjmxIy%#F+6&W#6KQwiS~ zI@QFDmavL^xzPm>P5GLQDA~p9Z9ZMq1oybO8mbdgeZETN(TeV($VNfu2d<+k7+2kB zzzg`F1L@pIpwxa2Op@Ba0U|tdQ`Z!%x~YlbJ`aQ0eAN+gBL?C5!V${)IaC_#v0K_6 z3%{-DrMk&IY?elEWSF~~tLihc)mjO%S)_PF;jZ^?Vf&Agg@ zRDsMxun#m^>!^snQY`nDzKK+*R?C!ZTJ#*7T3$hIn_^UMy~-P zv5fjB`mcm7LmuxR8IVXtn1MH=%K%7x=Yff2tIuOc^H)qq8Kn6k9pxRs)%ZQwpC3a^ zrMaVE7a!X5BlrUg&8Ct*F2_5&<88;nh)^4~gaf1r2&+ssqOYevaDWr8MxnWs$f=U1K}@I0j& zWvFPi(Z2?9cy7=J5AI-gxCVp$D&`stF|_{YH(|Dq)QPlH$Kf&+*EwkpkYhyzZ#d%YdD=8)ffY zX$3ked#8$@s#VR;^mk*5_yb(l5SqDY%aKT1!^mS<;?fRIsbd|^qQ4`b@0Xh=`LX007>S_B2LTrI zvH+^$aunP?sxC?}L90TME3EFZ-=e<*;@R#s5zitco;?6)qfE{D!lxK&krih9IW>44 zp{(%Dg^AQU8W&j6VSwMJS1{DD3R;v%rK5P^`!fw#oS0J{kywx38tA~qM8!fB-g2`Q z2x68l@s@K+coPZi!U`L zqf7{xXFmmEZ{h7&;`OT9w7n(PwqjNpWWLUH$WHhwU;(_@1@m{cJ*R4iKqfN8RZ?iT zrms~HUdmb{wW0gSOjU7?r>;~}Db8H$l^IH}{1MWrE;v28!i};{*JmIydCIv0DaYtc z{69!8rvDw0%Jd&`x=?ez!w}BMAprBeLYs|Doduu`OoP<7Q4bY(U`wLJ6nPDhrb!U} zt^P`Fo3xv^_U7|zwGoPJd!o2j=n^0-DtD2JsFc%CbgQ@@;v1nOe@40CxrcDC$9QQp zg+n;fYdAn|0bUcocM1`|br~yemtmm~ziBJVOod5xiPOlzdQrCyB%;rCO8N^l0LLpJ~T*OVyEcxa&V)LyZp*R2ti>1B28G{uy@% z(HlwHQUNkqbDlNbge`+uIt8$paOaF=@MpAvL)Z>Q%3LZ#%CYG$AXTG%L^rJ&AH{>w zjJdeh5t=c#F1#u;@T|NlFLsAlMQ%C1h$TH)@kc!&qpG2#EhU-(^t|mV> z$Ac%pBYPXD88#K$&CQ{Uila7bLC&K&y|0{eC1#MA_o|p@i{xbC(tWM z(}QpeD%}M99Xf#DYAQbhpMWX&n~0GfevU+aU=6}P_?Zia^X4zYY`*}vMj5aefo(G( zJ4y|WPSW9z-vCIakU56i+5l`zE0D)pDA(}3>NMNtR{$0*G)9OlW?(Kb$0d0gfbRn^ zK1oc!hzW+ASmsIcvi_Rpc^Z+IB(r}{^e~c49_f$t5Cxaq)5z0AEl(l(cAM9cqvkbP zcyP~aX2d8}H-pdg72{c{x{1BQY+a-G;nqnu^V}vLB|@IkqWBmShjhXEq*_?)0BCAN z0pc%hy&P-R<`pvfjA3<`0hU{>VUUxlM(U^ly(4^@sy@rxG?BODz&XqF80I@+?!r;F zXLw6hW5-POy43({?5Tajup9X1ENWE*qnvuW^yd=F2_XYqz0~ZSfkWQNb5CJMQ z0(1c&5uhR?KxOkNrhk~aQf$5voo)cg+~G?jG^GHs&@2?8sYf3U2vaveF498dSS$@; z7gFTFFxv}BuUN$aGO|RFSVp=7i3h>(E1DTpQHq%`9_+{(><->(Kzb z!9I|U5Pg`Rv9tpK5tL0@#3DEACMeT!vl?HTP)d3oi0qrgWt4djsaX44o;vOZ)%tk)-y%*0) zn{*xtnemGRco?uJ-O>DbVwN%r`n*P$*4LU7?*qdb8{o}C)piI*!cI*IObm_0xSdDtAEoKDyW$>0;q$ zO>NjztwN^QYUfPPg00qaf=md{n?BVa0G?#8LMle` zZ2LTIwEn1t!bVS4n{NfXux428^Ch)rCW6)T8G;r=nosQ6+Zl`CmZ)dDCIVGA|xe*mD@EV z=PLmcIlpe?+&za&!jz4zryFJnlxa|cR7TTLLW4R%mcEb2C_k(z_-1ROI9<#8Z7ZPk>icz@SJaa&al@V z*m1Mp0f*}ceZp*SL{Bg*4NY;nI#?5uy(WQ;BlA=)o9lQxPYciTP>0PyiLlzEjrsl@ zCU+kK(8zvp8MTMSj?I?%85RvPDRX`IZ8^h~FJ-h)XQB{g<}r{s^RahRgSGWCQCG)p z=g;96=?)50c7E!7ZRbx06)-}bkTn)uf*@7}t$Q?s$+y9&%UKnQkZ+u{OvYHl(h5skV99?gi^|nPY z|6oJ3M*2cytXlYX4{Veu5M&HJplSixHp98lyik{r5+?ie3iWGl!>&jW!qBm+QM9ak zE!Lvj1`qD};f*9Ex;K(w(PbxVi|&7l!)zaVDN>tSdYrGt>@0FUid3Q_d?~#84m}yS zKv!HJX)_zJ-(14hBJYd6aHXDda3*(D2u6?7fFKc!T{)k%l7t6lo|C{US!)&*;S!W)X9hX5(tZM)>D=o8@YMHm(r_ zUcM~H+lr0Vcu;m<+)9t#mz}D(n4JnP=Hgk|x7j_LDqR3dysJOjYFTd)k3j|2mcLk=SDnuS1AT5i3gvNJVO{RJ^of*1_R|601q^xq!1_Q_G zj>rt$lJJ$T(QxFph8S#-fjPEr2=*Qfy>3<(ZPvi+bP+hb524j+vkzgLZtW+4h#9m! zS?@#8>kIX0A@W!{%0xPD;ipJPxyUj!>>Uu&@wH*~EA+)0GyLpO)oVf90AXk1L3hqB zUGWDE&fnrp+_Vl7UgHYjZrz@{3d78>-0mT8XOCbc?e%acaO22cshiOSHSg_-p&{!b zBLN$v_n9uf_9U$WhFbkSAYEMV-l5wY@Fuu*P&zGh3-`WM8*U-=do|)y3AefRCX@_rRd`zrzXnh&hNH$}*Z~k5u6L2L#qccDvRDi!zk@LkG+ZO7 z*%oHZAsqwH?zL+Jhk(=o|0Xaznin%LumlH!RNheJ1)k=p^yNihzfkAc7Xeo3<_vP#!UjeJ$A9W5wgyYz%cNX4yw8Te{7?hSy#YR^IB{$#z){ECzi zY_^$S@z<|c-JhTmysZ`^zI*FvG+B*5gG$+*50r`~88h8#I(am#lcVmH)nq2-6a zaKJUh+h|LX&bhXtbz3;uG*upmdXATrm@0u+)<z-&9;p6mIU;>??yGNh`(6;d@l!vxJ9ZldQXWuR6<>m$yCix@mZjp1h9-<6I1kTxA8I4|0k2U$I$h@d3F_r~lB6Mlv60*`4q+el~&$e&2)9I2giuKI!~h&Pbyr6A_X$5}zlGtzkm zD8hyUBb|l1j%s)-)YAFpY2m?pNQDRUzk>(gV(9(;Odt;=&fS-q#)BBchX)c8bAfy` z*ee*xLSK^FtmR8^K!Glxgfz8ED;utRp4F?gi&MNeT+_?vgrvnOl=AyLU1n7!)Djo`~J(vbkmF47f7 z@Y64d(e^4**2ja93Xw4(`@t%}M00tJ2LCi11N;Pl9|w57k=2_32<0{y$|Y7C z%Hf<6v>+=Ex1aViWOBKiyy+K93jh|0-E8Rh_+_Ern@E{{c}RtR+oUa_*6_w^?dSk< zc#fL)4W_8d;`Q3FmP_TLp7>CO~tFcLu{uZyxOHsRRDK@HPQZ>nGWvOy=nj;GQZg4 z8M)>IsCKD|N{FS1>t>;EpW)N%0Lj4(ocd9tRW2ZEKiL5v0fS%YptMs?k{vYkpOmiX ze;ltVA3>cP9v{Js4CN!3k-<9w@T`0UDK~lTZfjnUwProvJI8DLd4P3vZI~NsRZiy( zlWJyvSUy4ZpuCfu{cv2i&#b!0+(^#=l3qg~&hCKwUy6QIO8E{epG!=3p}6nDlWNBNLf z;lb^QD{iXTQ`{8n*@$Pwo}>4$ky!1LyP)a+)_opqcATP5@bHjx)5SE`4ECE`OreQ+ zIQ~f$-6CwkIR#DLjijAGXFTx?KY&e1=Wg(d@Z9capDlkQ42frTF-7%p0|=J=n5kdNL-i6Ar^4`>op+9>NNH9c89GC`sGBVU6Dp$JmDR=?UBlk+*@uX zhzaQz0CT^*ZPed>0C=%5I@n?*K0Kr-xk7Mml~u2f!}hPxwK2f% zlPYtVguc2>@I(aOWmke1(&B1bt~!uQB9L=_481z zX!QFLss3CaDPQ2d`z?XQn}tT~If~Ko9BgWV zzD|sC;1)5y1F29TtUku2>KGKCAvY}Agj!~Gz#&7%Yblw7+@$C{#Lb*@(e0I=VBWpR z@7C=#D%9G!fgR2gN+By+s|G4;1r0@c@%HQ$ zGzSkHNMUd^qOvKeo~(&n0Z3S6-#)d~e$YDTBlmmLbpUw-`4l>uh7zblT?hhxPxTfa zS^}tE3^MY32p}0frc3#-qY%}wFrC-18q{;BojfyA)dVb#x&R>S-7{0Yc6a=Yt|5b+ zhbdqw+fkj7@^-DykSZ7d1UxAAuEv9#y?dK0_U`42wJPzf*n2D%>~(pumzgH$C-6+mS*r98}fP?j4TBs$b`DGu9b;khGYSV^%IBlI=IKTb(;1G`iZg>mXA)NLcshjQ^dLEuYIc`YE-UC;H!vG*K#wSRW7C9HP&LY zLyJvkXc-Y3M6r^ZD9?UoRzi7+E7ai)UyoaLDV4!amI7nx1Y(k8Sj#hVtAt? zDCtcI)NXHq3g06L*y)O4t~->Gm^pjpV;&v#Ul^VC86gVKfDkE%`+m1}0_c6Ur~ja- zrwZD64{&x2g*P!{*kK`7$mJGlIQkVb6qi51gPY4YS}HEzXbCQ7^GQICR5iG%AD3~u z+RbIrRnhSkhRj~Vwyn zYCErGbns7%j9w7lE7ew)FFP)nBC{+Po(XY+fXSohMXlr>engZUq7QhPURBamkx7I? z)G}Eug?nT&hAtzMcfejYlG(0>7~tKJ79r!Rk2<5gmQVx$UrW`eDz|CC^;C);h@~mV z4NYcrn50%lWN*rsMVHb0fU`({;?BRV@_)o(?$kT_bJ#6klfUzh5xMb?Lhr|TPqt(M z@2)}E282M5=RK*|w<@N%`=$;)b0vE2F^8HlXExRc?DGK#cAbaYQ^iqcgXjd@o(lkG z?U2=2uZSc+ZpNq{jVZb}R-PPY9g2JCFctQ{(-{{ewa*bJs;vL6Y1e(Xddk9 zMcdnR!8{$#m&()7siC&es2i0M?1MW)Ri%y@Os`t#j4+jchm?ohN!|paGk}T>H`&l8 z;-`i-Q+#RDmflAetE{OtQD_P>g+kLbh0^~^<_E7LReoxuLJ`E2{vo|2kRlJy_M%9L zHQQeX=csJuZrJ{U!s(>O^ZlOPgI{rc^R8$j%`XW;(G+$FF^p`@R)<~H`-I4MPYB198-ES_P^OqOu z_oD7Mi*>&#*5pD%vExi>l`7!;5e;49)zHN7r5aJ$V8dQA)RkQLUh z);K<9x_X}?(z77Xc5m`f6$){}|9A%}`=63AN_Y)0UwZ`N>zb%B8|Zw(bPG~BVYcKi3`J*H%KAno~Kgc&*2Z+uOsxxdqWW3TiL$39Idm|6Fc7aufWaVVmJ zVty0U6Hi%a?_-Yr9;9xdAxB1>hm;9Xj?_a4$01W)?6CWTc;r4uDs4tUXwOheZC}%E zKI-4*W2O*p^RXY+<^Y=_o!)vwxB0kk^9fILijdd1!H_e&(ZOFB`kv7}CizY2F(-XQ z;x#~J^f+ZY%NGENZanSZS&ncS=q!~riAUU9rn8*Uon|H8F3f-88{=lj+5$X3< zje(?i_@Zt(tBMfoqCep;scbcHSQrmdBd=TvfoJ+j<)yxGiMj#!42ILWNO?G|_94h~ zuqA{bmo-70-$;Qf!t(pb_DD*^6{!mA&?`03AE@t^no^eiH*qdIw|-2y=Z$$@I6o zDQGBOH4Dz35Gr@ot2+Fap#8E>(#f$G2Oa36ciepI;{vLA)3As5fe)zA`6=pMnIpV9q8^_4zz z0ShE*wlp`PpL`dtq?#f+y@wA+P1@sGkjC_lEI=Q40<}9bW7WdHcZ}-+szI?d2f3}% zv1Xy0?;TMiFIxgP1i>a9m!0>%OydTn$@DCIu&F3}d_F@i>(hLs2m@^5zHi4*_VwLI zihvFDDoD@qOu8Xuo2d{fD~7E|mDl+K9u#Hke(0fW?&FHGxsQXgGw`e^+pL>IN6I)j z%6*^^ahp*<9PL78s&nKHhgI2IWs5jDTpRlxI1Hy+v?5Ail#QzIqh+!!<&MG0p)HI&}5C09c z2ElyNo+^ew>guys=%=-wv=4p4%CG#o)b=;;4qg*|9z@j4yu;XV+%K}@@S1f^s@v6QCZLAk67D5W0< zikR{-oEA_(g>)3Zdg%L1h2~QGe1pxfNM>H9eP?pW)7 zliK$%W86C3!3F>#W8C_HG434ln93T+-m^I7`I6?NFqt*0InFc z*`GmQnL06pzIq^o9;iFsPS|3|R?}!TuQxMj;MXDEYJ(~OZNpk(n`ns#1`?!C`*4HU zS+ZTL2M!|mMqXdE2Rfq6S4aF5U|HcP*E-_wfW&>5j+hRlpNfw7TI-01R0zRZdKbeE zO(bpv#vYq>=t8XPT6qcCnPHwt4;wkV85CDbnbor zotu~I_Sev@SK$@0YYv!h-6D(6_*nyF(e03QZWH@2YM@BYVd>)ZJpYCcIHLPEhyLTy zc?eSJ*++eP_F=$zYJ1+Dj|2PY#Pw@Gq0FF%2gzVv@+uzOOD;3osL^^x8;sV)cvhqJ z2ZON@rp7Vmgmi)UlSY#6<_B55PxC%7S@u7v`$#JcDPhsuPuQ)^yBzL?{Zl&kO_iIw zJjlB3m3vy}4n(ehoXbk@!7BkP!-s%WM~OM-Eql!|PA6bgdh92M zC&cLS=n;%S(OK;e(TAM5xA`Y$!PM8zre*%osn3@hS*)vV)rtB z%Mr1wM$}||_arj-IO%mWj&Q)3KRIq_?!l5@f#HPLQf@+%@lr_BTkbsTmaoo)!}+#k za#Vwkqs1s3id4iAvjvFT_Z>5W+~>Ys_w*+*QN)(7dtg>Mj`q;uT!;_^z7lDM>&t~Y zVw?)mg}apa0={QZ^UQRwo$xdeP$6Yjx}HrG0wknFIOGj5L@+SB4}81EN-yh~?z0L0 z7XVA=?Uk-K!EXSFXUWw_*&1#=PHebWk^UeX?rln%fJ*vJ^W?y6zjT@ACG}5tpNa7v zGv(-Pf7K3i^5Q|KXoHK-q zrozsr|KK+pO+(f1I7;cn8>NPs`myUyR`HNO`+d2~u&+j21NN zJQ2(4s6jST5u#ja+5?YPJaBaTdjxC&SRQK67_N^VHrac{Ug$RV`_L_JoN1bmaY2b7 zn>r-UWa~~};%7JR{u8JS^m`;WPhP8IRozg848ow3r#|?MgCviq&IKUq|ACzO-sGfq z(~Q_oG-CTEKq9u2gjx_=P1Lru5}7G5lYihPgIO;iC#Oc#n+zZC9lRJsL_xjB>D20qtZ&z6ZwGq?~=E_uNo)04* zFr}l&*&vepxai1vay>$UDf}6g%^OkA?hbZuL@m_WaYaT9xQ2a;Y}y}?iMM_Q{^3qb za59c`0P=NmHX#_ME_OcQCNoBp8oWy4O-6+ylE;4QEaDzS4wc@|`+0 zTK9Pc5Q+fnz6?-*>;4{K-(lUaG?e%0fS}JxRr_bcO9X-K`VvLqdbGGuv{tDP#UCy* z6klby{t7_StyXJln=_^~7g^k?)(Ewm(Fp)#6j*C|W#W9`s2wke=exnx?P`v<+`f z`6^w9cT8T02G+3SE^3REE*^j_7<6G=HK1WY{|ij4t)Q7#c*hotFtdfBWg-26h8D+k zY!{;TRUQMeM>u?N5+A$!u5cf|zwwl5XS zYhSva!FL7VJruA%U2j6U2LR6$4^T9oVsvQlgPtnBy3F+2Lt4~i3O@mGwe0QAKk^+? zRYR|S%j-O1h5jb&uQRk_1y-<7&!g%3JmPwv^N4Hx&LehRDRepJZG}Z2*Cp!R0LM-5 z`3l%V;uCHXyG^m?B~sK$Lt+V-`bU6;#HY;2b_^idFoAOxsuK!jo+}l~yo^-z-Ps>O z8GRnH?P?yLYC4d7&ghc&86{?9rT@9v^9F%{5V$|*f>i1|jR^_akk5t9AYfoG?||v zGmsm%z85!c*UXIzD3Yy#J9-#;8RPeh_6OcUFc>Ya)9H8a78^T`B!dQaZQ+TO$T$_ym4>X&Ywqn1l93%I^Qc89MM&uwAi?U}mYPXpMPbLfeRbk~` z1(1&n4MWNcK@~`44m{n9zcg--=*XE!rOVEg>>nPjCw`V8!|}7h*5TE$Zr|K2p;N+a zgHV&5Sg{X66Ek_IkDUlQ%>hXs=Ji^+Xr|SESbuCd&dm_RvHl4}dE(`xgU<#oAGM)* zz?Yc0^D?yQ7M_(LaQc2fL7Xcuu7 z7ilhsR&82WtBt)DrM$q0J39koJ~RBw4C+2S)|N^ioq}B$u|QV}DtLkLI<_tXr&)VX zN$^F!SEB3`9RYH?h=m^Hg+@Ju9X9G=Q3kDgn{Rk&0g(8|7i;lwuMQ33EXY-{sE1e* z<8m#)GR7_u;^Xd#N=z*2`6FUnF3ZryFvVm_+@D>7t>DDMp49<$P2 zUm64i5w{X=X*>upTbO6v*{go6G{&vgU$c1H^37&mR!66#3s4$qH5>s>JpPb?)ypMC6q2wxZYa|-?eq1EJ&FM-p2n=!TYI9UN%t*)Jgr2$?N?D z?iW-E@$AZC_m#KUag@0&-qM!6!y|2(JCwBXmg}uX$X+~cglrqixfY3m<^zDlz{b&d zrGwl;whdV!w|I>J&JJ(E`T&5PMx;K62yrR9yhMsuCAI-BlC;NLk`m8~ zBsE7W+52=h04hw-U+|#ZNrUikP2XXf`MesVGM~p7H5AWkjGAx`2iKxACxu$0iW;z= zPn|Q|ug9OK&!b`yCnttl8w+(Vbpot$)RY1{PYdlgxS;6;)C16m)M52oBZDyvsKe?9 zburtJS#uN;Ou~4eOFC=>I$#41wB%vcx^_Xw!P&nh8Ro>rtn-D^_In5z!k$M*AQX(%3=*%r_;q)&5z^_xCa!V=3ZT?u8@ z-^$48w5Uxzip&qUh14ltsCEtp(a?e6wnX01^fcfSEu(M{PF$#H8QrftY_HqTU#9JN zXi|H8x^+8)?hg;g9o2VC*{{$uH?XJ@rQ;Rari7(9IACEnK-t`#gY+4-75g6aXpf-0FjPxS%yfp)JLMx)<7@DN6CIG{y1T za7w9Il3O?F5EbZ~eaMRB3jXa5d|vKg6+zPf`|8YX$c$0JDvnL8pW?vb=L>+O*SHwk zkBaI!F|xP28#s&UFXgpYvAGNFsF*T)=kSxVduQ;|4EwvOLC&vxNY(=)3yqv*9d$4x6uy(>vowmo7SsecG~JHwVT&O_0qh)e9>GRfPJmi zAfKh>AfH=of_Q29KX^rNd?G1|wg4nkl^(^ZDR!BvI40~jd|C;_A$k*XNR zT1Y(6Q3{0ocBKUiwALsTpbbIymDVWqm#rc};N|IPr_(mbe&@W>xUno?ivdvrwjU2y zwSbk?RsvR58v<5=XC+`~!kvhM>wnQIB49y%#8PGi{&&vVY`3zf#z8|2qrQ@$wJc_55Ag)CpM>}ng*au#s4;rDjG4%)Ip#i#gNw=Qi7+2$QvKJ;<8FV*@ zUhDw*H}X^EjZKscrTU7Rre`4{A$qW~^VVuYtuuszXdm}7`hpD;==e zqXQiDZ-AqlO^$;{NEizjlQ}Anu*PW<{cf641;|0B~=_~2QwLz7B>!~8y z39IenIHz1>wbi>b56uq8>~ou@2d1jqbg!-#f?l1w=&M@l#AYylj9f(jsgF-UVz%pU z9bP6c+O1$%I~S45)=qQ--I*W319#?bNO|pkCDJ1P-Oy?4g<^I$q0a_{Bf>$Wc#r^q zJ)kWBZ5?~v6{4=l6Ya1$GF%Hjay@FW?i&5L~ zbHa=u$mlt(V6u@BOMh+b)E%6BR~yjhVJ_UWa7$N5ylB>~ zCVDlt^X>?E(2^Z4o5Oiq;aH^{5M|3lEM^zh)YBW_T7mC}*3@%vfU{d$-M?JOTd{_k zKg=3o0)2oqowpB-!~-wMzTeDguhw&r>#b!Jns`*~@D zx?7-kc$R?bSRqhD-I_xUDSg_bsplreVa2S7_nm;Og!dG5J4)zD-G9v)5kJ8g2Nl&G zDWCrD)0A32%Fd9FBVF){z5j?PsJ=}pwKM`6Yk~%3H>FMh#L!9rIC|6tr268;ruycl zs>V?W_w#HEr!5>UeG#c33~Wl}bMbL+aUm8LnT`2M%P+{;3es+0aDX;-V#P2>lL3a^ zY3hW$7x48Qq#3T&X0`PgZZ)t<2h$dSd7ImiruvGx?c2H0?OH>y)XAHnw5lD?Lf!;K zb|nwpoa=bc8-DiHBC`sbrEvJ+A@g+(f=JBPacFHBl)>02Q# zF`=G*%wwY$24NN#Y!$MN4tqUVnNY6hB5}fZ>f=t^OZGbsx{QZrw&gg*@5EKhqj6!$ zLTbQfEp=vyt7@LzDqW=@?2{iSpQM$@Om)p$9BlF3adrvvGG1raZUYn9x#e`QbvIjO zQcFP6{kGM~a#dba9Z>2spg7_+4@-_r6eujCQ{Wf;56`L8< z`Q`sd+I0t3RV97y3lPXFc_GOI5(q&+fj~&8f{HxXvKB1s?z$_Axb<6C1$MvPbuEy9 z(n~-oBFO~l0wG8*AwhZ%y@mvk-V#81`F?ZeoYxX;-#_o%H|N}Q@12=5GiT16Im|Hy zgJ=@EQCl#+qQc(+F*LJ1<`2+w1t{yg27ehEzk71qSe%aJ3Gw<*DqhbC;ll%P~cHJ3f)M$5>DL~lHblC7AbC~=Ty z74O^!8dUdMPda_M)8^^kpb)$d%MeIM$?i}Rb}tYDSqp9p+1#^GIl$D`K9mO#i|i?los;MDh!ZUz8UzMBE)rh&=?6Yh0*FW;7KmO>!* zja8`J4)FYSfItz53c^E&Bj9{A~$fjY*51`F8r1Y zw1r;H#pvouU7pl7|E341Cp7C*V>*2{*y-4;Ujq7XvmOq=c*?F~4z>ghkFC;BhQ|st z5xrVykdLq%)~oFu+oU0f8*J0+p~o+w9xz-+pd6s^y)zi!&pj>peifx?iQRrJVHMSo zapG<6*5kyRj1)`CdfNPq-TKhYspdEA!OTQN`W`LPyFUw4AzY>M+G_^PK0nq+EV6=S zEfwO1(6n6p11XUfX=IneE@W5zo{(Lh1E$v?*+s8GZmAgGbX+L8Rix$Cz|Ig&VAMkz z$@}r213iiZkxtJ&Z?tlWX8Rt12-_bH!F)7jwQ^&}Rv}ujZa$)iz)3)3Df|Vap^vH| z(1rQ~!gKFAC|N_7p=9yodQnfYjoJER?U3XuCmi0B4^UPXRIuZe#t7Kp6nze(qk(%% zkS(%FY>`$Gr+qCc_g64ZutEPEN*2Fv*b*v|MX^@IIcW*jqVA|+37m&gSgJIbrQZ8B zSc;>O%R)u-Mbirhx?B|MR^4As1+o;kam(sa$1IO^$KD%(E4)t2ZiKSm7>oVwO-}3A z^xAKMKYQ8i%HH{lE#^GR0OY|awms&ZuF2L2+a8xS0Tnnp71_K^hUT zBj$YVXHBv2ujqc_u9{YscgzsvF@@b>l}BD7?pC-q`b(urbLDW@uPtX;)i-= zE4&3%WNhTkgRA5~^Dt=UYX>PA>d@=BrC$X!z7@!~j@wcp!eSeG5Mgo0uq@pCtWeuK z?n*-z7FYsMBD=KE36b67RfufRcLGX@Z$JjyH`p#M+=P#$*Sd(rcnhUS3}jzIJ}Z zlWi4n{d0?i{*Aw9S4Dq$Asv=?FM`zT3WBJh@<16rpt0yjN;?H?RORH5kmRqTt&$>x zXu>}+p6LyIu_ye~LHDVh79Zl@Gcb3CG!`eG`-*?=gk>wtordmZ?dIraw;H3}(8fB~ z)@uOR)$+`+#^RBsG=RjbH(c;8y9K5K%wC_2#`^R!+ndI*H=;4Ul2ZK1a3k9wISn9QB0P_h(VP4~W*kh?;~))_ zOEnID1ft3PR(V#Jsm^3!^|&d1QiND5)D<^>FWO_`rkcBh^drRM)O+H;Cq4gnm@N3V ze3UGT>c5R|bZsb;rC9but|_Bu0c4!d&^UL@lt+o|DL}34B$`zY+s+(m$-*Zm7~$RD z5rZWIrAVJSa=Vs3&%P_t=l3W@`pnf>9}bAZIvs>>fSo>%^m6$_BGX`#VJxS)FuBcO z`;0SEzTVqqb)$!RFbU3%j0(0%fTMX@9(7kOj5|MYCOKbP)LCHAZ1dh39?}uzyjceqxB5N-;Pd+;$$~$~#xKV$LP21TXD>i0{X_b}{ zAsmIV0!DZ6mLF=KHCKr$9rs?POJJ~lR@=@=?G#&VTm zjk{m-T%t7woSPnljFS<$+KfmRdy>0!t#qb&CE?$~E6q>}udJ6Z3HJ`dj0uWr=sb_G z$}lwXMbBnnqbL|8!wpu+=1rr_DmnkLTOTRR+*s|?R~rH_bDzS=jFqaAJ_4>9hJ;~? z2HT{0Y6DsX=eUrqZJVXf$K;qRe!QBo%Y;3?t&Jnrs=Za;rWc#H7{Z2*?=2N7vN!%K zB=WwG8AJHB8?sX{9sgvoZdXzvh7u!VtSZrVjC8ZN9t`5$k{6zJ#%ZNS?2xCjJsA0c z-RcTz?bJHWvCF&>`vE7QR(jqov=MDq0x)Z{J%+>&eF$v^tD`4M8Tb38y{2U|=n7tF z=zx-Kxv5Gt!HQ5>u~BkZS|l7XUmhG#By>F@bk#;lHai6sVaM|orZd}?vE|b} zts*P&XrQdF%B%pJ#PuoIo;>Mx>s{WxcuXtI{F9MZI7NPjF-Hec$y)8WR-SYRfZqUc z!sy8l`rxCK0dmreO#(>9<|!Y^e0uUOD!IqghH#=M+x9i1@{AdkTRXe0$7miZ*cds4 zlC@>R$7U>E5PZ;2(Uw{L>{evJ*|ef4O9lOLWq$OBSn>2cZq%~&9+;22XzmUjNEh#o z{Pz7d@-J6_{JW@RRDGwBUyCgl|DoSDFAn`y%Zg+rfiWR>EL=Wg}RJK%u`!mD^@R zkHBCLwides^8M6^Pj8~_`%r46H$j#}_|1by!K*_xA^Osr3+Fc<%r>O-e^ z=rR0%8UH^~{~J*r{)^WgGm5V<@*?}ICz_QnOd&D=g|srP?-(Gj#74^iT7i3#=)K`U zs&a1)q^P-e>-Tg85XNRA?q+OuL&@^$Ba}bd_#S3HzJg;Esq08KCX7p&Z4oxWGXVVo zlxCP-Ls6Ph0ZI?BNEs=}bbPAs#Ft~00r-ukZjdkRHTg{N=@=zV#P&OcN_HYxqwrFE zB)d2f#z-4h8r@LCPJ|qk{Zv5NI6=4;_kSIYvA{lrFPbz6cJGciov;r9M^gZ=DyHm5 z*xHGi`a3YqFUO|nEtBTVW*IzqEO?`WLliM>z|(a0se6bK51D5KVVUlt&--|-O{8|l z=ipbc$6b`&U|@F}2R4cEpPXpplM~Ac2ggL+IS4UPBYu*A1o3y#jcD7+<@h&ZinL_( zr+*>n--=SuKRpQj1IBCge-(=U8Kx6P|BUkJ|1mDBcj2Z=vQE%Al)PS6g0hj@cUq!a zFI%U5RL&g#C+9Q?TsU*g)-`I`U^tmC&n^GubIeP3rl@TB@;6Y*m(L6O@>&!0m(LIV z@&%?7{_+Lozx;b<(}@est5&?myihaV!xO=H6|6BYk^vftPark!3tg&rJml@TRY#6uW)(PeM06JRNupF}}rASferBL$xS(!W<~OR$9cZ^OG!e z*1a4z|A4GrZ|)9~0_c8y1+w-Xn*NnmUmLah>OMo%7joJv^)&+jS$%ER>dP_HsIM)e zz9rodYK7rnJj>#ZkdiQejtlJ(YXl!E(RKNk0?5T1XJD!1@L zvj8tY`z;3a2ave;UP#=jEiM`Wq0=VdMDdqoHEuThkZv z(V&kXYa=8c(;eRjGfKugfmrFYB_d zFbr6i<)h@4!+PLcSvfqbdGswnghz4E1S83BUh&f5dCi^HV#A#mGXs?DNdmjZoMSmMTtw`t6*RBdj)!mpNR_{0<`VC@kQsYU|)3pQgkm~k3O}H*W-ogBc$)L7D*Q_cDInaz5#6O#*za+@)5_~zBqE^G^bs0|x&*Qe|(P~t4LeWT63ZD<9P6zqRUIj#O zH%xu2+CQ2OAY*R0!JN#T%K)wi0TQ*wD8rE&KeF7i32Xq@dPa^7|D^F1j#K>ip4P@0Li>t z>KbYUy%X<+-XCMy7H;7Hv=ej}CFkCl+?2+p;Dz13+#AZeU8SvCnza=w3hkye4KQsR zs%WsOnwcDhhMA^?d@#L@D!zMq@YhZRxSpDoVxKUEWEZ+`n~|S01HLVmy^ z?V>lzIx+sV8a7U=QGRMQ-_M7TNEnoj918;ZE&+&SQ^1Qdz!X^I<2lMk&2t#Z=THih zEe%5Uv^_vJ&uN!6Z4f-C%`=_w)FSWaP+;u7iX3A&drl4QO5 z7Mq39eqVEe#u2ZRKnCia{nTl{o?@`z>`A-vR}FETP{%`@=z!Q^EA{wZj{odCSS5I- z6bMZ|CE;O|jN&&?`cdp$Yp{b{tigs7Sh2`SkqOult zICV$q&yZ>3RL&}nIAWW5>*whZ+Hf5D_NGAr!{ZJ^a{;G0D1)QXZ9$uvY(bluY`mE% z^)iRvCLZCyyG(i!WxNfU8{WZ%KZ|p&PQkIOshB8Xm&;bu@rk_GA^xc5gFT85emN%l zW-DjJUQG$u&gap9lQ8VVD+kOi_e%?zTc&?&#Qgz9P?b`RW6h#z2da3P=%8VW_+!}B zh6lfhlEa6Ko2u~P7^;07o^k+6fLIkcJPQC8oQIo^IehSqXxfbb9F=|>rO3gff$T%i zoe(+sDoUw`xBV<@&EbIj*S73CiZ}_8!PZPFF4Xd)^#rzhO3e974b7g;`cFFWoVy=6 z@BzC|1@n%q4`+$2wmUj#Yex-H4Q43q5;IX(X$G%BNeZ z6dcqGT`FI|us=93P-D)3K)kc;4Dd1#I|XUjAF&aIiU8+yohMK-ea?w;YDn+m;dZrH zaK5SJuCZTGPm8V>bSJ2%9hfUnw&GHeVH1uF?9YHyiH&_ z;9}rk(uh@gppq`@55c&t%+sgKq2u;D^N=o-a$b*HLjht6NEml80iL4SAV_Rj_F^m; zUIs$5N@4$1IqvXYX-eH*=MA=3^@G`0iOPU*?yn<(YJ_uVJmRogIj{NJd9O8(3MkyNPj>bmXMflL6sHdS6 z229J0a`2(RvXJ?sKRNe~d~#~7g;l-jNeu!Nk>1!%X<#9wG6r5u&QZOQ8_KDVdMfYb zc7F#k5XG5zkTb=5swhSUsrKdiSlaquhxLH-<0NI;adN+plXPIrmfLG9`Oa+g4mihu#PFC=*pYk_RLy4vV9XA7EEK z?F3j>I|e4vh*urftMu!uG9l@Ok|!j~Q3@)DR*1^{9~{5g*D*o^GFZv@9hRie_ZTjp z4~ZWXRK|0_^SCpvrn0B+HHPCe%fc(;zg^veC_8YkC?&#r zjz)kHChe;@WTm_tE-KVu&(oHw4lBMK?|-dHMJ_O<-{KVIHCJ)P_j5hHjT`-$UQOnx zdEZAOs#Og%;`OQp)Dz_Sjbowt>dxMU6cq!Fm<6d39(gz2NmT}z+VH*kcd@>V0@IKm0h)Lk?^asGR~)621oiV#6o&>MM`*AdkpZ_#xLTg~^Di~ogG-m2bKb`6}2!0V{sj&J!2!5tr>Uzx!M zO7g-$wyw@Hd?VVa@W<_nmE);bqQk02JE9#bn@1#gIVdC;n+*?AD?oWZwKI@`9lPXh zD=X^EK@$^(BN`Nez@-4HAROV?SZsoJs34qlltP{TnmP}AggVcl6zUwTP{#kD$u;x3 z*dO=P(=apa%`UjTML{gDtPph&gwl+c@-Puq)-7xfwoD`_jH37B1BAD8z+qXDX~?CLGqEVy$lVPwReRi&PZnc-oAR59;y=sVLC# zjA=4kH7OV5h#_#+43u;JrpF0 zdNGMg!ok(&(LqDc#WHufkmZbKdiU!?Nj#LZua|E!q8YXxani&dXc7@?Mmz6iG4836 z8YS6tX=^)-2*;=L7C0x_eV(@9zQ;kO&lHtBq%s$WCN6md1opyG?u}BSe@8ddx$QOp zBtv72CL|JW%vw#4fxc<1_I7`N4zle(OA4LF0sIoGIb!ME0gF zRHC&eb$rmF&Jn@}0Wd{0^}&B;5^MrsCUGn=Zvr`*)!vBFrT)=3XH0e6*03c`o^viU zcYM`7gdM1&0ZNEx>d9d(kF(R0gw!FvAUVcZXZiaUWZ)wN0F&X45G+*62n;+)-(&8 zyU-o(Pq{MJ>QNK9PJN0RH4xP>1(b?0vl!=kKUUV8kyF~0ExW}X&B)ncMo#-j&B)oL zzFjMyq|F*#X6S4V9XeagQ*gp0`uJ(`$~gD#|K(Qc1~#o5e!i_iPtkt90LfFR-%7cQ zS@H}$B<{RI;lwb=DJuI17%Og@X&Pi)17F)j$5#GTmfp)IItk17NSDHYS=8AG!Z z`fKbb)iXuKbVapVuX`UCtin&h!0@n#au)z%-JWhn6Jk9OF~z@vPl=j5>#%x3kxxTe z2jyy%oTRGSbB1ac)Vmv_?G?b)+G%MJD?`_m$;aDOemU6nkV-#A(734e^Dy2N)e-2A zyM^l2=pDe_tb2OnBGG=mPeZZcF5yeEptz`{hZ9RCd%2mq{j$E@_5xnPJ+^-s4BPuE zx2+V8iRFm?)C}PIFcP0f+3JCr(`$P3tXmN{M;;u|p;Dfut$-_n*jjErfANa$G7tCs zD|}T9Kv&JEdG19Jr9u<%nly=t7u0a>igIQkjmPZ`qRQERR0w#S4R+sIT-;yzyc$lRN5?aHt0&AI7T?zCF;1)A|5*W1l>g8ef9$cVoK)NNAP zJir8E0Nzy=acr0u7GPUInSIilYxWrdfKEW#Jb-=1piSTAW3~(wqOo&wrL{eXIE5Qyr!rEb+f8ScdGrxml zm4(KL=79@@5hHbXQ2KSj33Xhv_i;X3KD4B=ch)|-1;6Tp)EiYSyFYEN86g({Uguwi zlGpi*QTlzT5u>G7n5NVbD>m#V9D-8jaGwVe;i)c~2;)MD@P+AwLn*!}PlO+IP=(kX zFT$#@TgT}&lpN5L**wVH@P+j#a|2;L;xoP(757+tQe%3mBT(K4}7tYd5<;al-iJP3O!3b#p=_-9CT;MR*$*lTVOZf^n3xQ+OW!R>tc>Z%tb)V|TDP@&fN z-^PV+-{>{F@)KOM!%r~4fpNwj=^=l0SbvKeHYdzmw79mns?LGAK>CXf?@$Rhc}-&T zO1MT|^HhxYMElxV;oeU&;xT0@qSpXvSV3&{2*4Xuuw!5`25b}m84riiOr7ztq`5xh zVHzw5KI0)fvZ6B{-uN4at}=I)f_>HTVEq8%?D}OWpHliRPkloyv2vSAaXKx6U5bs>sD;u znizvHuQ~Q{mwFA4LoE_q=5cl@k2?L67g*3UG!SB$mdnz>ZY^wVr7Ni)S}2y<3kFdq zg!KAf%xDxV@6*^X-Bi_zaQ3UBT#{_JW%Z*KXvK`TzqyWh&R$v_j92?#Vyql6g6N=p zxCo-*s1+e!Bwd5|_957zAs?`F1eMHthcxds{kP1myP@o>Hp3m(?<3rBM5EM98jpl> z!%=C#M+SNS^K&MRx8HMEsn$Yj@n6`#&6HOvo2MArk^bcV#|&X*mSK|n_rNX613Uy5 zhFJc9kmKr0BqAgQDFNPxL@k%opVwh)QSaJtnmSKvG{Pi1*<3k%KF*nl-@iB0qOhGF$8H1DtLleijpUYDKP5TE!Y`l&@}splx9K& zayYpc#$Iei`-v`U>+OBCs3^SplKKdbq?c!@EHk`GGQ-2-S2;plHrNQ7?$LREg=z)a z8?ZfWKqM8zT8yRS-VSRG%h4;wf{RWAGQiGPg>PfA&AL@3wDby(e) z1;kJ!Feu5CZ}@O-93%8DSAv~y23Rg`nhai* z<79u{dC3!8t1=F(LC&IyP}ld$5$qvXKZCq}GzU%p?dmUIhz07zaQ6$8jRtaH&46TI z{`vTXqj~-;uE_rH`^Tq{tjweK{dvlqNgtw&4?A19R;QS@256&waB{%u0-R!+$vz}m z=Zoje(x;b(t3YT@=yH51-9a1n*moLebm_2Uos?)WK%z^Bll3_-y)gNQV-`poQPl)J zXCza0HQsIF9As4K2#qmL1^hXhe40#;Hn3aoQIEku37+&mN|uD!gMcP6RKWiMFGa~? z(+S%1SnZ5bjNH!^Kg3ev2#$I}Y(VZf(R#$`$Wy2oEw`wQjv?o0IFP9hN0wAWYVylx zsKqdN53P076(w&$orJPcq}hM_B_E=(ZXfLhltuseWSWh0G?E>ensDA~5JWHG^F=P0uw<}t2CX=;Mg0sj4!%^MkW2>wQ5HN(`M60x_v5HwB3OLKYIrub9Hk89 zS^5+HJ4(;Pa*_ih3E`HREw|&?4-DejKli&F*esxlHe{V5S}gS%13lC1w8NVl^h|g) zBV>olSf-wGlYOS>xP;d7Eoxt^Z|+NFfISUDeVwfH?)!HL@WGq(=dl--BRisSHMS zMs@!oD0%wjgC~Gggw7f5%aiHZJ=LKHp2!qD=Nmld03diS(0Gnqq54vI1~;t;9&PQN z-^imllk_*ixc*y~!S%`@T%Q75aJ^dNdX0WvgX=Xx-ws@_9L9`9<2A(m+i2A?Cr=W;$ z_;ui6Q?g#^t@|Y~7PF+t-$WLNHk$@7pn=nsyC>RPMbAICn5vIZRlP=kbU$!SeRMBJ zG;B51Gq~D$;1hV8ztqPM(h9)hcqc#+F6!18moBT7m(GT%5a4ZE=+}d)VL7pCO;dDJR_IF-M%Fo&As z;unyZJyEh8%ty&5DD<4>us(+NI!qrzUp1sU(}67fKN6tL?vFU?f9~68Ad>!DEkKt7 z!a88RuLeGMe3K{ZD~I)N*um>7s3)%4R4HiaJqcy}E)ufRy9Y4gPCBLE8L^*gXYr{} zjy-K2j5#9uP`=3c8Ne&A!gj=kIhzN0zr&F+z~uc7S5w5_%!J>f1|RvF)2}A;omyo* zqZy;lS=~AKv4Z@7xVM3)?=l>-ctfUoCa&OIG97+D9Gd>QSq{q;Vql$5R!$3?>{G;R z1bxv&IV~>P&***Oi75OgGi+QQF^K6HeR8^gFeo6YO9PUL# z%$%q2%AU&xPi9d+XQ|4{fSXtheka-oF&`9RRUWgU+jKjn=E{oY6)h1RS4|()VRcME ztymq`v>b#_qXa;L|>^io=j5apjP4cI%8I#+XEXIv=G>wyai zQtL4f6jCWc`{U|w&VfZ$y(iB^c`Gxs(QUvUa0W3DrOs!wJivbdG5B!{gf#PhZa!AF zHyX(1BwofGHeQx7KhaH^dvhBHC(njk$_CcY1~@2zHb%pIx`56aIN7HVh6LJ|mY_4L zw}8K=WEMSyi|rV>u7$9#l&frD3pzY2+^Ur|D%`5<+Bhm4Co;5Ct3Rto(SOj4P02wm zRG3mMZ3N&+00y@Z8AROzUASsPGie z@rnTu*VXVA>f9(Qc*bcxLH}3`C8u&ek7z+I!5W* zxMl2d4x%gW9j$Ah=h_eokNNrJi}Q@t%*vuj(Q(~fBtoY{cuq(<_Hggs+7+=uVqPE{ z3{Pg``stpHqPoh--@@UW0w0304ONDuPM0@iw zq7?^`Av0V>X@K&CE!&X!AOJ$<37X7X-eEF#FEC`DXvn+~ASUxZltSjo8if?OLeHDL zEp(R5ZO=OW-om{N6tVX<0I^TvS`oYKIb>b7jlYDAX*_E>MZ$bTF0ggPR|*B*6lnFARza&b{bCg#VbZQr zBZ%73>KaFGR!YRbeyhwxm`@kDvXXLe!;|7Po}oXiB}6VF8U{q+od-nu&Cr>_7smK3ol+ZG?3NEz7hZgwbnxLxU8*LR%K9IV~uAksBdcb=UAf{U5OLYz*&% zyg9Lx0`VGdZVP?>34#^Vwm?`=HtMS5{y8nQwC?8S#LFe9bkiPG%AVG*>F^F7-|n@* z8k)~-Au_ycloN-cD)Lg~#sI3mqvZT%BLE!RL;%F06alc+e8GzVDaXkxxKL|YAL7Ed zTu@S734oI75CEmPRsvxBc8B#R-|4&SV1@B2RV27mPT$q5RICFEwH)t)%8FAkZPP7= zs}{U4hPk?$))*skyR?YgVQ?CpPLtDo6yaud5ZumS1}kqCM(&bc#4Owu$YXE8BHSG) zm7=rx_t+h>PU zjor``yh~|6MM3vth4(VAo7wk>VQ@fnLoB@kz_TFlL8B~+Oz!Syx zVBVS-*n=`FJ*PQm7;6225Hi<2uY_e%wF~O;IJm7CjVhRSwv8y27X&}h^M^z=l?5_E zM8rka!uudvB*4UP^}VZ_$TwSlRg-51JUuNy86TE073m57;I!VPM@wWkVJ^xyL7Xdw z=!ee4V9(jZhoK$-zN$%2nE;3{Sib!72>hZd z8^}$qP-a8jJV|>2{}r0w4w5%_1UnXH$+<^G-jtx^IYL^Bj-K(YV5X<2iGa)z(rFuv zju?_TLLaHJ%p9SQzS$Qo(^nes93lJLpQm`b)%jRI1>&RJwiZf14i4}|x3k~G2pA** zJ;w(2X0)hiO{Smv6i-qK?7;!^b;`X;dal4mVj6%t^`6Kyj28yQO2Po)8vg6?t`b@XA^RtLno zg?qm{IO|eX?4yXlHIgwueum|lK138j6Fk8vWq)BM@h#+aI9*MSs$#fTB6%#NWuhrj)Fq3Og$~;g1DsaRdn{U(WWMSUJ^Qr51 zvQCzbQesYKrs$ZHGXTjt*(@0}5_3}HiiqZ%6m9Xp1At8CW*ZbO1&9~P=A^Kh@1b|E z!Y6|9xfkWb@G8!wC|t!*(lv->{GX@)w@QzO6+95onykW6vQKgW?MLe-u|uMCw8=s< zEY+T9)l&*gg!?J`ItYO~u>Dy<3-Dj9!J*`ymZ+ZU)7TqWu*LtSx?Qiwo!0#k%k%(* zzBq#h;@!;C0weJzs17^gmnfwsU)6ZXjcKS#&-WAO8r`VrZ7_03ZcmAmEYO3ut7;Lv z7B4MUNQ;DT{8A%uf1-p`ej~5g^v4T-D#a5U==CKn@+lF5-7LokN&AJo9KX7}oNq}z z?t&8FfHj);Xe0o~rrfGKrE$p!sZ7$ueTO`BRSCP)%A!JLM23KA=oz4Ee3UqeqeCX`B zorW7ib@ooxC8F5z$OOCDcFH@5?f~+jZ<{GYyj7g~;EaH6rh7EEPef&X-!@b1L8YyL z#M>4frL(wT|51Kb*oPRu^~0SizeGApNh(;RKYSA);tf0$K;}z;a%f|*qOOOYujbT( zr9_igoPmb{mldxg>ZP=uMvqi?g05loEK0L9!FJsLXNWepJA=ZQCH3wx`Hp(W4Z4G~ zc!-icZlobE0n~JyP;K4N8z+q35KmLkJnt}`$DXG84yV;W>;;^9COSeKO{Y~K%F$GY z2Cb5Bjc483uF?Zg4d1D2UAt>M{R)GQZTS%>A5@2#_uE+C*db?)GD#bb z#W;|X2lsgy+`pzekyw0a+Sz*{*m8zbDa>11T-oO$Jg2W|4m?Zo^x@Oc?#@z;C-`ql zjcK<89m;&5EJZt-4gn+@=b{i68V7s(tH8$R$-pI}aoEQs8t1aXaSlMNajqzh6HV+` z;>Cf@C|Sc?(~>^&uaNW)T=&1v_2BQp>gWxrWTUSeyiY7ZvQe@C$wR3GND(fS0I@{} z2oM~$!UDt`wju)Lz8ELm%WU&qI|4ge+{?H1K*&d>J+`9b-0nz=I(PM}!r*7C@ap1l zzkh)uV_66-oCd#x-fCl}1vtpKInQ9aphf8XGMy&GvAsSFb#>X0>602{`~@+j7p|+e zk$qFu>_`lmzNrEBA3GjCPF3#Ehg_eiW<1-30s09=CGlg}3am~}_zt3yuPyYb;QAEs z>&bnD=osk-6Hzq*VEq4ogx|n~VBsg0 z$5_o;d0ZQ^hXWx^{7l*7RZtUDQo$?B_zHWx!s~(KLV{OP0aJwAQ`_V#Dh<{1mWG9Zk_}zU*#Y_^UCry^yus|(y#mS+#pJMv$LdCfI z=XjsH)tRcFQf?_4sHcL4&VX}8#lo8=2$zt{atKE-%OXboqMH6ygz4rHVj`G)dd~s- zJ~9+T=Dl>kXz{ry**!eVV7tQu2HQEB6S@K->U?&pw%V{$L7|(LqmE7TT#f7R@LzB} zN8|dRU~0D3GEuUyEkY>_kL0EQPY%v+S`h~$w-O7-xP=B4!Ri~BB_|%NW4X&=l^#K* zO0!EfB?%!w@Ua6mMSa@Y93$Ky} ztoiC=N$qE`Fda{+2<59atHh<27aD7RG7qoSUlJ0KH4L5mc(^;=*HYtuy%8m60AZAF z2t!tkzBX-Dd(KY`(c1n>$(yn{Ux<{tNsUHs7k*d<7t4wQkdL zylxw@SCdc*!|(WiGrY51McCgdUy!iN;H@0PgMW9)!|x@#2czfmOusvn>7Ra3BYm%7 z`hEJLVETQ5cpo&ykN194G}HHLFBICZnVx0?AhP{{e1!d=>Q7|*A=LV~zrCYK9>ub~ zNE70%4u%kiG$Bp`B7`W>1LLrMLo+ZAhYpM*rr$2q{UJRthT}q+fb($STL{Rmp-jN+ z8gTpN;##da?R?m2ePlm)0;}?aRNfwX?GdNd*8ch0Fz@hh1d<6z<8u2Yk7?FBjoMIM zdpy95^EghZS9HUbcOuxD3tGtL=|wx2e2o}$Cj*VS*P~7uR8&i}yD|OHmL2tgmrkPQ zPb)Uj&b|8roO^oGQK5s6CmpU%PKj@8jSFRhof8wR9yRsCXmD)r-+)h`*$3A%B2FhsI;QFNUU} z3+<8r6r_NGlfb$CO3~yG)agY~7~DMvB`*PvZmBKwrZ0(wKE_aQ8~`%eAKOw-_Ll=B zll{-t>*@nkjseW{8`o01mplE+O!mKMsaGwA0mPI2%$5>G((z@P?9W2U?%pDlPavgI zcFUj{9p?5ETAEcp>I4+AxtWHN=k}Q>mBo{X3nkc(;KC=^b7PcX&y9g#FTk}D?6%*s zbFf@MGxY+zL1ai2Gvxx>sJbt7nGWH9{ix7*<*CBnans~gk;pGFVi~e=nr<-NG+2xV zv%bJma@izT=*1rE$%-X>Nb6Zl^DeP%#-9^;EJi~LD00_^`*E|=wK)sN6 zfGjvK@bMi2qfeqW$EYndeE0ZkhVK>`oba+nbIM1>+i1B&bKiQXj6X*#)!zy=Fz0n) z!^0?fu{p0C8!nf|ve>*FaR`{!C*>P#=}^>seVcD~Umy*5nR!B2&8$Cp&EYTIf(=A* zXd*OQ$<%RN8xqR=jrn}>W3E(h!G^|4!x{I8m}^TfzG*mPmEjByh?DqLAud14x zVczc@nMW_64Nnh7pp*r(O-7;}1V~3fUeFP3Yu^iP0g2hCQ4 zW_D#hMVC3(i#FPp!J4rXuGO zR48&5!y8S9#1th)e+n!BzAk^P3ks?3m+|IH{vaNRSwVE@oiloBIz z%b;rw;_RAJ;(tW1-O&D-UIb(RPDcnMDw4_92$%V1f^BrA_dY0LUhsA?jOV zDfS~EKJj>#EYNwhv0bA6n`n;0EP4UW9)YPd6lHwa<+L?Ayv~8pDYmUYLdlD%#VBKA z&gb}7+Ro_fz?C+~2zf`uym?2^VcdfqNL8y@H5?lPKrNq`^T=>LRNt_Z}C2ft(oaDg8xN``;uZD|iey4f1Myt=^ShPP1t4c-aJkB=o zGrEooGi$cIXU^G_=9!@1;UO?!b!Yw z4V%TVs5RrU`C@sDFGDC!WdJ-TZi;!Yh3mqw?LEe4~i9b9#tpMeTGDI#f+d`R44L!9zK;d!|EafP)d>QxX+jj*#SlsFV0V%vR^+To&g z)kVj*S8^Ysp7;|lYe1JDz~j}TTPa`R9Hq9lvwU^-0srA=%glp$4Tujv%Uj7i`8J`O z9@Z#&WEi+Pa_K@PYi!x~;qK)N>2HAkGGSCh@AA;WoUgj`IuK;M6^(@21=xkpW>4JrglhA#XA^uMd(waTtz1&QQSz}JRe6J6M_CsS_yA=CpR z=E%Q#7yvr*Zm*xx7jQ$Px-WS51${PrEc>Mm_BiLKe&Mug3vv(W2mg6IYuV?i56Xv8 z=A-NklgpXuw9cznEY=Jkn}tvf>k>VTG6m&3C_98-stWQR5%SUsfa(kAs0Q6)5LzdY zuk|rq^$&n_>*E?Ui$Q3;)!+K0u4<6&Ykf+Cx-tl@(@;KUou!p1lkg1}P{!E?%pm&& zkgS8S^LV5^)0{olfBBjJGQ*_FJSPZqgN6Tq4qDhYU7=5L@oD(CmGQCXTaBq-*^O;j zUt+|=ulg^P|FIU)Ig|-j9yun0=+;Vl0%d=^&1RH;wX&(rBqz==9zvs0{uSjNlywz` zuL*OEN&Mf7RT67M{%-$964TYf^@eXMYZhR4;F53X_md%+A&5tz?27U-N}2iIgsfIO z#2%euX1=$iYYE)>3&1RrZ@1FEycGbnR=(If#_DoSg_N|mQ8zBpHm$Yz^w#13^WlAX zFsHX36Sew{7GA_q0Iy~z`#2BVFNWRVvuwfjqct-HFuZ6rQABCH6>zaNImyZ zX=cg03^hI8oqmB{I8-l*!9ZO{+3vir8!Vgr6<rQr9z@Yi{6}>$$$RG-m-gv;l&_%W>#@X(ZVN z=K}@deBy(91(ZwD0^I>N=cv>X3qr@$LTSKW)1C`iPA{6D)jV1lHx~fezn{LdhTgy5 zAvqeysK+nHeuQ$o+5ynUzGRl*ReA@Ih86PXV#A+H(4=DiTw=Oz`LSG`nWJE__- z^$pkw_UIDW0u}IPM4o&lc$0F_hUccs%X4HzM80aL_Jj3e=KAUU$a%UFmq7;G(niuF zxKKR!jp4!edBTG$g$HZb-nXKvUahU>-L;~s3a6`tpSMTnh&WpQKuwx}&ZMcz3PvZY;gGzXnYIH2_OI z#yUR-b4JV!fxOG^js!3)M~rR?t?>;bEGH!()d*V-GZt1;(8sqiWF@fIRN8dAuv@zVL^z<;3P4kVkm{ zH&W7Umu{K03Jq-oj!`XKyc%Ad0Fk)cbUXww>3EM3e)9l|b)VY7zO4I@DV96lw}bWp zEV=0Snpdc`ntMKWf>LntMEGh>6uz&uHZ+CVM?^Mz6*QT?}Hfp6&UTf z=BL5<&y06M|Nr%V7LX@>j7JtE<`ZaeDv$vqPWu}SMFZi%Gl4uD)jYQBH#k*Rr8aqc6TB@I3cK?dv&*2b6ZOl$ zDLW)R3Rz6V(`KTQFBpYfYT9A1+n4_6Wmd?~Z-$7A><J{JkG6Z`{d3?;<`p>UlMOGt`yjh?61O1yK!wJCQCcI> zCgIwbLCoiPh<*cX~kH&sWw2pwR;wIhMm^HQQ*tau?k1dz38&qMhukiVlB7~ZCDEqY7=0W zHN*61C_WZ>x4xloZ~@P2)*jYnCs$BiTrgqpqGXTjn|p!S$Sa%HnL~bU-piY42%zjE z-HK8K!iYB7n2Os6Dys?BNQF`z(clG`LybPAm(D`e(0Ke8%6`^{yjNKu)Po`QIHh91 z^DgGmZL~Qx4uE$77y~>&y)>W}P&v#cW827C->iZ-;Gs84aa@g)CsW}joXSgE0OxUk z&{sd6+~A5ts(TPURaw>0o2j`aDNAsNJ>ZGqoToV}lxfJvG}Ie+t5^xbg>uzC(#z#{ z)nX$R&jHLvDwzYk-rHq$tCOue!N4xJ>w&r*VpiD-Pi4?H2Pl9EhE-;wiQO}HS;$TZ zH2KmrDN#*sXG;@b_Bk|}sGHQ8WZt5(cTIXoJ4ykwh2~409LR|(Rq7Oa5ge9Sfh|UN z(1C59~A8>Je_v`48J-Jx@XwN0se} z@Qyi%B(!oM<1)jD%TX&fntykWY@x{0O%j$HMhu>qN^JjfdA*vF3bbOi7eg}bfIM$M8;U9;Q7ovO%*k9F#toJ;yqhC2A zcFgKFI;wJwc~z$HX4LX+r6^VWZOI3Aq-I?wZTQ%W7a;4@o)?soXmz8ehI>;a+^D}l z=aihun?mKxX48q}k{9JvZ;4h;?-ghoW#U3Br)}qra>`rb0a+ft0J7N4$+;j4^#G)y zr<}yWK-g-im4_ywp)Z9}iC9BaMnsPpQbomFO7;a_McVeGNYuF$G~n3YAQEktd&4-v zUT?IJR6T5oj9el?l{@r+w#^(stIBMZ;B-yu~&jX-$(Onl`mP0^u=lrJr7H0K&iRC12au!e&a|NwJKZo63v1w@VcN9CgOH~4sN}6ZXEle_ zyJ0x&oaV6e>V5S#EYvDd@fI%F9=f1;Yc>80Z>MiqZ&=UAkM^-VJJdkmqVQ7H2kb z`MBBUJ+f1prnMC-C-WVbQf!&;x#TpsK5g}k{v!)EwX(ze(o5ji+EhBOGLFaIQR?UI zEv1zyW4Fg@IHuc$EW4ws_v5x|O2n$`F7EFNrvId^%;+5bq|T;{n-MmbHg5W>-c|Z| znaX`O&4nW;2l#sO4#2xQdDtX{xs;LfCQ8wUgUNfJ3!6FXREGNtYPl&&G2w?&dLvk0 z)C~}o-7M=XJs%qah>wL4#>Fgb!nlNmXI61xhQ5i(=a-4%7aB%yR)vqG&Tx4>7GM*m zSOH9jX7oCmG>AF@w&2@+wlj@jcDMy))G_vrlmW89_uDae^ z_1^N{y6P4`m!%w%9V+!@*TS`{RHK>;>EMoF!%n};HDTAOHHp#sOS_`7dQ|>^aPN-E zwS55>IQ^H=OG8xcjQ(NX?*{tAF~&-*=X3L3n-_$6PYluxs1P^RcaB^U=Dl$vTDqh= zfVH#V9$VRaIIEVLVRxzyA!ytACB2RdHsv0TaOuVNEMfE-c8KkvpGb@l2Uhg^gr=d< zLlCz_7C1L9%kEPCscg;M^cDc(U!Blad)bBoBoo;$HH#y@V!pm{qTy+`13ax3^Cq6z07~g}rjQaI2nidi<RLXQA$!s1v)K(4%~OE^`T15g_@2VN^IncyzJ>>Pbm2ErVV-RxOc{{&|@QvjR=Zn`mN>T^6J@rNs)}qD4(^!GeW~ zq%M}a2|En7WFBqCpO`K?S7#U?+mwjXX@Pte5}p1JnD`%y!&7dO7T7(G(!6pKq9npOcxJ&4*KOa zv1n?G^#&f3hYTTm0U(4d4kY9|98?bSsi1O{Lb#)baDx&R;g+CA5v~{)TF$1N02P#+ zz1x6kH3Qx^!|=xW|E&D zfh|tx7A-(+d+g*2TAY*?ai`2H;0)nKoNV0}5KJH8=Jw%NPem&R$-}>R+q7x49~Ww* zoi*etz8^SNR^~Z{@7gt@AXFC>N+b=(&P*$$Mi0p7dlRKvMnWlcD>ZbpH#T%D({$VV zHMInghu%d)v0(rR#V#3&6$8W+>kKoQDK-?PQ0%Iq*tq)?#S$Km6pCFy6W>tFZlH!* zHs{CA#kCr0kx4FOtH~dY)tA}I>fmUMYkC0Xpt7!e3Mx;m^HpBgSigYEzyn`JUfz(} zIyVi*u`q;lK@7$fZ_uO7Ky)>QHUgQ2WKTdh$HIp$$oBH$6*aGv=V2}mops{fdn#Xa&W8z>OE6W2ew0 zfOqit?c0ueHf3jf{>ez}QOazAxC-doIVkJ9ZqM;&&c8B;N&sYGTqgzW0KMCfM!d|D zNqngN+o>st_)v4uggtEAP{!F1lyUc&NO;%=N*nBOr<7Ee^04(nIUAiOw{)o_cSC90 z6E4JD43nmq(RhcE^&~52I*bVlcG?45xSdXWBitkijXm$>*lY zqpHa$$P%M^jMN*~j#9sa5n5YN2e1l3GCeV)55>(U*N9K&EaNMzZRVlUOq9aB=W@g| zI9|R}mNw^c(|G~vDbqX)FQYs`yQXk>Z*%Z}oGoJtJ&g+`%%~mJ-^C}`J=0##3fjq$ zYBU)D4ks%^DFW-uc6xU3a0er>CaSmKWiE)UKLX4mYf?Ks=gkK|g8e49)ANJKhg{ZZ z?1-GI8OtApHcehxc0^8-euW*Art7aUR^jweuKY?GuvM7&u*(_|cI&o8sd;Dv{zv@u zShc@IzlW2hU%CPx5mMaiqGcTw{G-Bsndb+sT<0@79oaqAj` zXC05WCX`#(N&}8Z%ZE_@QSoTq>a5ekUU0p@}_u zPpSV_v5hwf!4iiog}-@T8xW)@4_CQ-HIDZV%;c-Hiz)SKHfd!tQrUZXp~#_)y8pOM z=KVHcKj8KwwXhT=J4p~m1!?24E$Ty)(S;H_TObdnGNE&x!K5BCW2+H6*0T^h02FG9 zJGM!`Hm@D4PHCu>b;a$f*O{ z5ALQ|q)JmqiE72kDNF7tRyZx?;TK&hs^UnH_=q^FZud4u+{K)iTvjXh!hlSEHt*Dh zbQxf6MSZKSsA|imar*GR?Wo?v(V$xQU%9M2*s;wa133O-ILbP%(%t^>!Lz$*F@Ro- z*^@z*(<%ALYKlvee=U~NODL7)^bRgKWFr?PFG=1($=lj;eYY%WokB(RZn` zmO4a~Y1F~int>|e6s$-6NR783=9c9_B*76(SsWO*e_ZuD=O#M7$Cv zZzSxH^SC`BYSX-ceDIaM%jQwtSMjMTYhO6FfK6Sv9mV8L z>M9bUJxZZ-e_h`#HPWiea-n`>J&7u_0U}XRb8esuHSLY69BFl<_--IT$d)f5zyOL$ z=04 zWLh@YW%Z!nzlmR7>Kihq{*|5{>UIE)sPK-&2p@Jz6x*htUK1-LK4!0JW zkPoaRFQVW60c3%E9VTrWQa%8(lssHM%buZnl7+tWs8tJnMe{M0c8>6qV}v2cgA3S{ zdH;_to%>+qgW5p+C?yhsP&ZH^Ys;T$DkRo+WBpIRt}z5hJs2`Q8Eqcbh0_0|-Ge_I z%+@V&jPAIca+UElM$_*7zc6)!;~Is!V|9xhZV??A(I}A|NQ#k|FFVveL#4Yu&7&sM$xQ#d8_&jB!4Trd8J{V}rMf@LY?;RNBarBRKk^rI8>F(4p zh$5;@FLrD?T$&TdVEnb6_f3p#aN@+T?HEXL5*I9)-i5(*X#}P>N%Ss>D!S+$3Dc`2 z3q zMG(lF(TYk=u_bFbGJcJWnP_qWV@Q0&?;~6E!db0EFLcfpD)8AN)C8Qa5czBTVNGF9 zD?LYZaX&Nom&oTQI76yZO5m)#eCq%)<-4m?pSWV54^4iCHNJTm=)qJ0h9JNOH=_hVS zJ$4-5iJbe&Wiue0M%8sYy78fBKkto!24`BmkF-kN{A-&7F*U+`%YT9sIsK#HV`&PD+aBh@@j4=1U z5!=MaG7MI;{1G%7x!g^w5CoG?q@sJs5P`E=ILW<6y+8>Z;Bk#22ag3fnCw@7le^a% zY4bHQq?5CaoVkuH*$JF$>z#F`ceMA)y5QbfFBN#Mnf-UO0`bEmL)8t2Ac2E`#5sL~ zG^pxEQ(^w03cf8vVth{Ry^d3TMRt4y`&v+Fo=uP&>!TbE!#AtDu|cH8KUr>+-nWTFD7o^AI`y@UczfInS84yHuxJR8Qx~-Mi z&O)cn&Z8+S+|a|u{acSuJA%ijHq`xN=wg7tPQ&QEe(rHprU}S?2HCqzwph;c<%OdE zIX*Ee!fw^KFob7NCuB0D_Gr#eeaVfnFdezg@g=*FvhU%3!}Ii-8|Tv9|5QHW0LZNT zZ<~H583$X5|7{ms^GvZ1Qen))RyffP=d{KWd0sw9rjc*-l?g%;(yAdR zx6x$$;V>43NO^+Lw4c!uuh_ct0`iq%^lGqJD3a&P@^z89367?!j~~;o^cC7ZKurjs z$YOUwl4LDd&h{d(tpL8$DF0{v=gdF zOG?9ie2C!!qzMx2{a9n5ORbe2;(v!4zgMfGcJsI`pQQZ71MbcA05?|+xpkZphG?zg zjulf?hYF^eBCQqm_4yFx@y1KyspshpWHO@ewW69Zy;q?n$Y3npw~CyqYD3xsqiiI# z<|&Hya~sAl_piNuhD-LOOs0~tJg3=+Yw>pbf_&qmuzvIV;bMmBMp3@9yEwU%)kQ=uAv=NXmzNLebj2RhkoQiPPF0ZlRBoNDOT**Db&&cg8m&WlI|oQS4x z0cYz88l2OE!8t=7Dd3zTH-(4!=ESI_rpI&_Zba87Mmf4T*)XD!N}VT_mZvh?o2BtJ z5jBG4sm%6f>l!;%4g2XE@{BoBqsClm1`o$s3lX?DU~BL+VH=@sPEf#)i2cU6S*abH1x-(Q|#x5#nw5FH;>ULD8#i;CkTo`KuUS@0SJ`)4u z-=zV@rS_R*;p^0f^?lzGp@zcpB7@~L0$l52%eU_Tz)8j7zQEBN;e7PQJyhkH-x3>; z=|jLtW(G^CH-H-JTqf;R6TeiHDih!e{9&Ktu$ISO~f}x%(6?nea`)fU;cxeI2V zX^9>#3r-09&$5`_L#Z?F?m?K8f}EAs>l$gOA&d9^g)E?DgNE@&-G(3-i_G09%{7)Q zwQ`^=SIQa%%N4I2An4l+$bwSaR5l5es#G*|hMhhCuG<9jc>a=rC%vQX3a`QrAo#ZhOx*#-)5~N6`-CD_tEa z@29+lv`P7?b$xqV%YMqJeL@DkLymgPk&1ngDp&Kz^waHL?LdI8XBLVlnK*Hy`{=EC zJVqYh5R{K@IjAWx7d4!51Ghy41dCp2Jfv$BphmF9cUW_89MAWQm*lBPo8cU36CNN- z=&AVuV=rP2XY;~wH{{iFt-4mr=YUK5D*MR3o@tDV z;Xay46*9!ASYY_MJ2I-O9!6MxhOP6YB9HPkq%iWrpGb&CY}%UpM6nIMgc_QRP5Ji5&Fqy^A)Qg zB5m?JfBG<+FIL}5&8#k(SAvtFIEVTMP2(OSyrODozdL!#^jio9N?j}r^Z;qKsQ!CG z)FwV`)%Eq=Lk*UQp&eoN!5{S^i{z;?JxW6%s{^@6{dQblKS^9Fiol0Rh1Az=q;9ZG zlln$5slT(5`a6A-CrVF&f7o%iJ5>QC%RVUUrlxXdRl_Wm`S}R^a!YDdyKQI};9PPFjMuFD%u~ZUmMH9%L!CrR5;c$D*V%%=D1`fu{%;$5*Hw4C9!+9D2YSb zXw!)^2hGR$J+zHw`VuirUcsa6>!=_~;&AG{pNEVTXqk5G8h~j>6v0rj0nT6|9E?8&LEWK47E=^U#2iPT~rUZKJmiXTWY3-|*3= z+Ej!av?@2Qjkd}a&xIt1RqkC{zA?(tlP&RBv;d0gP|6LSm?v#Q{{bQsHAL7R7e+IX z`#f?d*?==y8YHueTAKkJgtLkUrr67}r|C=*kvive7167`7P)VOdxl?~+mm~TkcWFMO;mC28 zv1IGcw|;8AX0#Dw*;_dLXq4j*kn+3D_llHHN47+h-eddN-N^sJk1c=9|FL`Z$G(ZI z`W)nLpZVBSA5wFUMSF z8O5CN%Yj3B_z77&iT;LcwE}#^#@c^{&cZI!3y@Ze3Y=aZ&Zn0jLMA(m9J38S$E67} z{B*`}!g@R&bYVZBnx$FsysdV@6+Q zY?p71*tu?A7V0Y%;Dz48{dM9?1$4nj+`w?EHg3;Dl_>w2rDDMN&NhrHqjBU-^&ZyV zZWdQH`ROTI=Fw_92Ud2j1)#M&o&+TJ!iqePMWdsV8X-|LS%$ef&k%7+Q-P z6KTgq$Wg4997n3xORkGQ7G{sd{I9raV7=t7d|L2&Nz+Tr8#x>41^iJwh(p3KIGP#6 zuP@6C;(@SPnQ>t7PD)gfix-zHPNb##&^^ zT7AE^+9BhWtKyI`psm#*!!@w2nw>DC4Q#8INd`$CFOv*vYn^8d_E)AUMKYMKMaqNg zeZH>1+fIkIl|X!tH@zq5z>yP*+6PEkmXAbgnS=5qfZ`I3U% zyX3pCeMuGw@LU=CyC4cOG@6vI4kFo_gA?9Ltv4fw(O2q00;qmrEYYvE^1EKDi=L zd4-*wunMtK3VG)65`0uyxQ#?AfL;9~pcj0c;c$pFyNxUxIZ8rh{}6s&FAwr4{Nz~i zLj}lZYguktz-d&$+_cUBCj-Wd^7KC_@HV_VSq@iu5^ClR^`Bis5^;5Aa;!dEo~@+& zC)1a>LEAjm%cEkc2zfQs`t_b2IB-C`7dMD73*CN_S3lTIDYc?oox~Cafu`n^NaNha z1?D7{aNm`JFe--V>gdV~^iQ4*QIT78=O`C-PbF-+QN-A4z~m3T^vWkt3SHZzI-5kc zSpZd@GH@%qEEOVUv9{BOCUQ9ig}XGAsJ+g}x8f*bxBok7I4TH4_Sj|GF%+dwGlaf}flIYE zv@45tqhf2<5vj<$bp%LI8%7$#?KqCe4UGz<%|SXyX#~gZ6#2v>6d8BjGr3h zjdiOD(OXER`RDD;uNo)Ke+sEI|Kj5}|BoTZ25A^Hs>}_)R>5~kH$3ukph1_(Q_YQ_ z@pDkA6>xsV-oUHY1|~jX8dwzEKv%K9fxcpUckjYo+}*`UrM=(U+dH?4w08wkY445y zs=ccdbbG%u9evZ^UW!6%-$6TX+1q*B+RiN05ms31*3RTZ+78-ZAEd1PO+i{U z#PD;(K)D_KoK{-^+y$wuPYuzp7kh7|I%p@KMm4lukT29Q^9(f&_;HP|iZ6H82AYQl zKYfIHx)0}jK=&G9D8h#zxwnm%cr5I`vthiZNW@4#MJNML<**$o?X1#{I@V_>z01lz zd4GwChVx5#iE?}R5TyYMxkj7TAqH(bo5cGb73K8FG3{(SFg|_~0ff~_Nn@=fY&1?D zg%Gh4-EUlQTgRJsy-p6eMXPmjvvcO55b73--Jr^Gpy*NsJy@iS5-AZm!MrlW(~s^o za4QSSL_>~(b{OyIj~GN=3&RY+WOsfO6rjt(mt~>sl#D*-ASf>7%vV&pJ)PG=!m%qkB)MrmftL z${`odreVB_3psf8+qKTt6Dcxw{8w{q;<1`TE`BIv#srtIrbdW zBHni+{_yjx{Y}-e`-ydcMo2|8EO-p=2=wchrTW#KVd>WjzKk^VRclImS{j*Y8mapC ziLHk@sz&XQHaLkZ%vY&RxuL8TtUIhI6OpB#ghfQhGa@TGAZ1z618IO0A{HBTBA`1; z*!&mu6C*5^*;>8@`AS$U4~F;(^AHvmD;|R!{_d_rN1g-!hCx`YRPByf6=*_Z^nR7l zq01_g1Kk-L+L!+U0Z+SD`z!fY8~P~ahj!o|5eI7o3ZAv9uGt^4HV6)_UD>7)Sg)|+ zB8~>NHh9mmqT}Zj-p0s;byi9>TCYFL$b|L51lwTV^*W8jGai#S>O^idF9`8mqhv5V z+fX+d3J5|*UMLG811~T_+N1hrQ(Xww6WKyA9QyT3mY-YHOT>kjZwjEswbgt-PK&V9 zs$mC1t8I2#%|U_4&mA^e?KDl%@^fb}t#+Ary-qDUK0d7)c?Sh-fO2|yPp~g?$gqzJ90$&><@+; z<)Dm(*8w~IZX#P`>p?sH{`oV|53+O$QkJbJk+N*Pk5u93F+;S4u^z;Zn?P4lLAiLHYp0!%ul(AryyVZf(}p^B2dF^L zzaY$c!DP$!oQu*VS&+#=9q|XaB&-2{03F_jN2$wrtqPg>``@_LCjJzpJkc$}yIaC? zslqh8Lu+0XL=}VJYH!XJol(-xYWTgTsfn?neP=UVyc`kVb9 zcKv?(5ta4bO9CH!r`ci-N}X|EpAtVl-V0|!!`#$0PH>IbbL#`1ezGue3r%A) zUHEN{C2H0cNGxl2*Z0y)KKLLFb=Zad4*DR-aU>$*uBzv2j(Q)yj4`F*%%$kuC`Uu89pmFK>c z`$w>ADGw6*997smr62Y9Jth#;@eA-34sD5YcxWlgM9B1Sug+WeJw5xHnBoSu*O+3P z@Q0XdME%ySOv!`W3y5UBen@-2t$0X#n-LpUx1mzVR<|j*TS+UVN?IX(w9&3x=)5(X zsW()>+H~xHS+ZX8_(rtX){&9^_fyl~!5-l4i*UheV@+SygOYaU(TKM(m5N9SR7^)j zo;4ju3QZ^tWU0yyvRTlKTSttRikLLfTPR^gXg*SzHH{T2>y^WIU)PGzINfx=X?whR z2rEM4)lFr%W<6Z%541UQg8p!XWV%G3y&+O$VtZ-^#U?&v!yGz+y!Z;M=WH$4AcT4# zw*@sqOL$C~)Lu`GSm_sqcru+tvtwxpadOLH8 zvW2xn%V(IDvrt&%7vUD^ z3X4sJ6{s+OPN2eKO{erfgBIR1Si_sUH?W3>LxL5Gc5-R-K9u%9RoVaWrR{Y@ru!(a z7KVX-8F_kxhGocSN_rQMP$FzOC85$s-W8_rWtDgZq@a@45|63t|C#zL6~K(Qia#FH zNL1i>OgoX*<>MW$sr3Ww+M{6lEhrL~M>0vCdre zHR5W06~$FU5JM^A1Gn-DMMP6@MGO@da!9B@Blj7|i^)iNT;6D8sM;s*+N9eBjd2qw z#6z=dv*fYKb+Z<%vU{!LhiE1~@z+RYdb!2IZ&hhL^3^14Yq0FuCXbY5wQa(L6;{?) zZhNP2mx5(@Pk*EiZ!gFL6{+JX{Oeh2tHgHQ*Q-(Lj2(R2oLzlsO6QvQa!3RL6;YVkJ+de`KQ zA-;joLMo~dMBR~BHDr7)eTqLygF65@Fq6GHKmEH~gNEHY{d8NO=K&sFXxwEg(3aKYg1}dK{HCBHkg*;Xl|5Joo^M8p@>x{Gs zPSO1YX&W{Yo(+cFIrC&5?#|K6|K<_q5~^1Un_U+HiTdDg!>9{V%WM*9j#?};J0q>- zm_a>}awvy6oUaUQh#rdnu~dNHN?{A?`mV~8yhXMrmBV=n3qFRT9#O3G(TFa{sD-0| zdm-hg&P6KY*0=hpSCCUFY-wHJb^X*EK~KG*pZZVFi zr<9j@Iq@-d;b-WB&)tqFFykjk6GG-Kr1TZ=piWDY^}^mrTUX$>C3T>a^D836f;xwQ zwxi(J;Hu;fdW&((WKo5`=wNeun2cY(-Dj(wpABV%v}5#5nP zIw;kbMfVU&hKE}$iB3FJ3YaN}b_mvqhe;vxnXjMlSu#>)gfyf!o%lb@tg4OFFTtd{ z)C7t?AHb?Zb_U|`2cSh+$W<%SqdHjeRN8xsIu8W7RR4V0!2+hJ(fXx&0$zY>G65fh zUO=3sSQQ(wYSV$s;?*9Cr(imH5STjoJhgazqsTISa`+0C(x5>Yu_cb|R~=|dTs)7c z$gAP#M-PzJiL_z9#aOf>Vw`+SC7!Ph##j>i5)|!|_@XDsGlT^e_TnS8&f^@md7Q&G zkHd#9p`1P3iy64Bq4@7iq*~)y&CXw}09=#ehq@h$cuF@JABrhmgJ{fiQq`yUaI8BJ zovINX!!eJ?>CHtP^LXH%5L$T~>Ul((d^%4tdJe-P2E@cpr0j6*7>=PzQGSX>amc~F z)Csw)mQNM<(j;7S6u;d_S<#qoKssTBfOJL&<*C_#o*4=D#ho)XLc8I*8LnsP>$Pyd zsPCGs`xS_tZ60+VH5u=7I*5ZMeU>6TG}j9Dh44Gkl8`+S?M$y z(jh+kO5pTNQzc7RskTsmHY9TXD#UZN#xtc9++Qaqh<(tti!x#1jQ!x*%vhYwl!7X(fA2z?@HC<-J{uB=zEfc;g3cmYYkEO~r6LB`jVG{WuR3_HYRKKC)Ea;G zFt_CZmC)Sl(9;v#j%dXnxn|_ZUkTkisvs*6tKx7L{R8z_!_Pv>{Nkkf zJkGyDj*J%@Eu7Z8Lk!BsqKvgNZ2Uppcsh=2aah`{An-c<74n{khb@L(*u|OIWvg)B zQ^cOlm8j2TVVZ54Y0_}b{I^|SD?ew~4owH}-wyLYc65G+MyBF^Ja(ty!fejK19s^L zsM$h9zW)K_PBTol+s=h=qJWKgANVWmHC%Y4q2j{XC{bLv6My_%SlCE$VPPY1VKM$I zF1$()Gs?qL^p3)#hQCUXSHp3OJYS;~_DQV_PRFI~ zJUD%hI?Pxn%3!PlRZTJ0OVcni{4irB&@xo4ErVsD?mr2dak;hPGIC6ZDy+i~YmS2K zI;lsp^cD0xDk!cxC0tdTI?WK9^=UK^2ld89N5IP2|5!*fwtt4>|GlF$19dov^%<#C zH}b5sQFg{w2cPh&Vke|kdC2O9KfITKkg^T!3epVRe#zjQ8Ri|=WepM_|FVs9BCbeD zI0nh?vt|AFs*P!i0=E{KhbpFtDE607?>XQ%e8v={zo>=1m-%4fK>-?>aWg1=A z4>A!7uIsz~cD@@@fg=?3n5(t7Wc*QFGy{M9TvXgdaZzy-a8VLFpY!P*o8~=?i@q~s z+3)A`SY{Z=8iL@asWO7Alrdc0(!*8PWvuO91#fx7Z>tZ6yFdYM3ev0Opy2NfJ-Ser z1p?hWRocJgK8L+EmMer3DacjMOE3S00+xvMcl!GC4NU7ajG)VHq;mhTgZMb>a}& zucK1hWxb`zLIG`8qzbej;17c~11W>{9#Y-_ld;IHHoy$&sLeJ*BVOv`koxHZAT#$5Dq(H)BBB zQp+e`sd@?>^Oyf1I_{zhqod;ro+cu8dN=+PEttUmU{(hpyvB9Zp;8LhC_P*OV?syK zz`fAGC(2u~c#GN-H3^gI$HR|k-Q@EAAXcj)g*(PHmd|T zlkK=km8yc9Ow^Hex-@xJd56zG*NmjVQ(-g*f-KX`dXec;>Ok%!ujwNf3}t)*7_U&}jPk}7&+$CNz|@F1(R`H2)Wl`@d1cjU=S&L8#B}$ z+OCnI+us#haRd#(9p0uR(_+;S$Me*IY3wnryri|NeKR%SDUG9wQfVV@(t8~<Sc(4}DSP^@ z0mnl$t586?BAe&TIl_Z97uP&zK8cihZoTHY*;}Bv<9Y)% zI|vgY{cJ0!hnH;x_Z^LPJVz0kIy{K%v$1T%epN%Q!oLKbY4NzGqy@OCJqDD^NS|Y| za!`wvc3_Plv7)#v>X3XBRCN&MkY+SyBn~lgxFhursoeLws_sXVRW!zv$lA__S9d^`tVMhy&lg^K z2ieRkr!=qR;9BOpr&T}uDC%YmUh&!i%z9Dptmd7yxMtsgCg2=)B|G1dUdFOkEdBX9 zRw*Mc2x(ymr7YCoFe(?-os}sHv)lJ^$0fr&>BwL%yKG?|=CWesvvJe~dh<$aXQaX@ z#ePni^R(iWAt+Lul7T;dPRV>maZ2Vh;FKKvSDdozh}-d{bMyR)z8eQH*TG>&A3#m2 z>n*iqjHV#JP8^><%I8D)C$PZEx0*$+poTN<%E1byLWo_L8Z~ZcI^cF|tUJ-bZfH)D z2r0ii1}Hh^Q!k`t206be&teuTKpkeGTZV<$reB37ABO;go}7X7>4yEM$0}27bIjsy zOfv(T+6d&oQX7G$QRE3MX#tg8kS2tr_ow&qN2ywOjSl`^fvDN{@Jil=7|pvA_g|3k zRU!Dl_X6dk4zG;e*L76L91pcAWazP9_5*6MkhPsRkmFQfPfCMdQ{_PDoCzpt4zwiG z?r(T`)iZ@hqtnPW@jd^rc@`kc$A1N~d#Bxw590U`cC&NUm?4Kz%J&!?s}Ij9C+;)Qn)s+B zTRqA=115^QKT`6odesQIpB|t_WUTdc8^P2_40@l!L9KrAbMN^EE!oV0%p{E2d1NFZ zqd^F(I-%?{Tr9^})To@IzeX+aVorv=k<&SXR?1ljCGTZ?-^hIx&1SGs@`^YrLTOEJ zQi|7Cyw_j)rTzfwbB<##AOG}>CHws#(awdFpjY)Z%EAXu6g z4ox`XVLNTX0}h~D($BjcZ=>fzFJQx2`Od!aIpwU=I~tDsNCmP9LZZlt(kSs>%|>y8 ziG>$S#kgb{lX%hXcnPXOFQh{h9?}dRJh{wLO@V+YyuLls8W2X^kk;hM*=P8p&@dH$ z{Aeg{rO;5^3TQ}Ts|?Te*Ifo0yyj3WzaXKGSJ2BbysSR$nuiw%^~`Ll?&D!7kML&9 zM|6&BalZ1}h3;!zx>}X4Lh1ODKghS;_3>%jWekIA+V7m9JD&y1 zXII^h!4NDnL50H}$bDHXd=V z`y@;B`#JhG3hxj}4&OK5g#lxpVkRVWs8YbViB_ea?=TONqFIts? z4EA$gpfl3KoenqMM{XomP@LBw$k|MQG=Y6JI^)mJAqB9@O$n3q4_KJYL#_yug^E~D z(0$~LL%qei-rR59j^2395-m=gOZ_D3OfO-8V-YeAsfdu}1~U1`Vi9tSipA;K(UMN^R2P}R%8VpqT78u5*j}B$#&(+Kyp0{-iMAP}!l)H#`wf9BEEg)X! z+vxNPtdecWp_7d&JIXvmbOma$x7S9TPW&YUK0g}K&uHi{2rPOLA~phrn+$GxAtM0@ z8HSV*lEv2{hquyB{9%M_(LJBDf{$2idyMzQn>a{dPPFGA|WN4B^t z;-D+iF(Jc}Xykl8E#N*bT`V1ZZ+Vn-ppDI*MaSi*S*YXi^vh?!G4H6 zfr@Zg_aU!&%wCh{i}dg?jB9;t;blBZ2I74(5Mu{f4(@54+Qp*=(EXY)ncX~)=85G! zj_A~Z9!D)jodcRWSEFOlhDr{Pqp^~qhYUk>MV1;L)7qaYhPPrhP-x>YQVs<_w^kB@qRRMJ6(@NSt?R4BTeuJT+ z!-ldBi~njs@pOp7xk|SydK{ioK3iusV>Uyy@5nO4+n&=k-a!qy->P7o*QJxVG$<&{ z1wFX1!de5WY7x@9WdwI}Uh=oG3w5vLQA5gQ`;byI0*F^^enkX=I)pZiE^RX@L#d^x@J8!YT!gL@jN`xBda4P+#KdGh~z%NQ}0kKvr}6=29~1R-tc^^*+uyek;b~ctK&Tf38xC z6~@Zb7UajZIzbXB;W?n_p!&}yK*rlX77dG#0rs=B4L~Mj&I}6Ez_3m8LgU6ZT)oVZshXDkPsqJzC>QhB7~D z$O}-06@+Hk89Nav2N}gV0IKUP1S!2U^bV^C>kd;jP^JTJnrWd_10~^R8R|sN7P{$a z6K+W0ZRJWSaL&;*W&fqb+JeDeNQVJI_mHw`)Die%M7@bL0pnU)lNcG+GMBj=_mrn( z^1f*8cig6FjN=swuZQ0D+#MC_+m#0%6B~1;h>7Z1{(da$(2U-=wVpaOBiKl@P>Y!y z)Ch(5%d*mob%bUeMT7s*W^;+tNe&4_#2BsaIK#UbO^F4^b!gi;%V8M3;uP4 zZ<&Q$;es3?U>t46(DqAe*vO;oFiA)U;I{SD3lgUuHEk@+gs3q9DQqmbZjR4MM#>mT zN9s#NGd7nJFL}D#d4b*0M4&{DZ+GuS$MkNp-t$I;EhzrE@Iy zMqW;3%lmQKft;r*&HpN1{DA2`t`p*y^uq#DK6^%~vjMjAKb#HFtU0KoPnQezZQxku z7~FTs!<`nlDoR4lYF<7iB?J$iFfUZq%-1!CBY=R?efDjjU8vch;<->fXtx&CA&B%; zxrN7ZnsKz(3|NURA*+-QyiZ`E?9ho-V0pfBRs7(e!2dH>+3AW0Otwkyze*qBKAw>6 z&$Ug+@{!HHBL{M23NJJEb`Y(iSsnDtokK!$kvkuvfA2!oahqQRdedp&mTDKCY%;8>3UW41J+Wqjsc9)}j!byLh zA3RmjcYKHLD^TpDM#VS&8fA&1-OsToD#?%?v3|7R{!l;Bf_s*nWPo@<(7^U#q+dcEwPGm>@Al3fA7R*$3L_)a;rp--f77Bn;N&j zm2tb}b<oL@919nJM#{o?Z89o+7Tdi+0HnmB$YRAHN3I5#A>OLsq)sG3Gr=3p6q5RRC%d; zLwtj_#zIE%A={o#{JaxaaPlMaDyY0pDsSwP3cl-`W6_;lub0Z(J2}*slNaj?S9$5k zYv9+)1$FnW!=<;<18D|t_kp@yyNuD&nY2!nL$)b?ib}j#k-W}kQ*8ZHAOOm3XQa>k zm|Z_PxRH1L6eFz{juU=mfZTn<43Jnp{uy^OILb%o+ajoZo&R-b)aWFZ4g>j9y^<>a9$Yul%p;520<~R!1&ng?i&~<87 zV@AuTeu>c%6^B!;E<7rJh3miIdIaUZfu>Ny=VjC!smf!h3r5MOoGJQycunmy)DYzo zUOfB-dRyu)%q|%W-Y0^rDPLlh%o(p>D|d4MfjmWUwh&#-V)V z@`e0!^WJ)q}Td00bUng^cl)+AfzVV_nzfv;gYuzb1 z$axCgaRI4x*K}!r@Lb?gXWCAh>JXpmVR^KpE9M?y7b7tRXz?=7{yg}t4zo;Cq-C0A zW@-8|R}w0*rGK`aE8qNoP^Z-JKSzCPJf*jdL8H@t50qIBO?KE0O-2lD%c04L+O&># z<3Z2My1-ohq)x9x&8OF20W{DP^VU&|wLG)${%j>j*tnGq4#d+0l(j+GeBkJtSg^uf zWQd}$z_4FrhO|Nyg{ELNi=yx*E?H3+iIgYE1xQ~6Yb{i)6i;2jV1INiGB|@#WszpO zBd-b5E!Ire{Lkn+*Ah!joOZ6*wdn!q>(PjC%;PGRHewY|t zR{WPxP$2|)+}BV@q}%@sVlg0ayp$ghagnR!wH_E#R;hwoWti+J{dZ`;>iE@^1c_ah z*5Da$PQf4; zu+4abV)n+g1=lj!*=WRfvp)e7)C3sfikmE$VpoW4n!n^i#0|f} zc-{C9&>UHXd;x!IM6-U$AyzIN7niwxkm0=iOCwPHg=_I?|G~Hi^yuO~s6R-YJ`bu7 zilan#tfPFi6ECCW^2z~@r$ytF>4QJYU~mX{dLkB>*?Lf$S~?|Pp~v`Y@5&h82&oJzXH>Z}!1^yYi8 z&9O!H+(RKnJ5Wc2$a$*}iN4@}a7CQq{*v!PSune(dsSd|@xOstTl&QZez9_iS^!Cv zWm)=G6eQ-Ys6h1h%lgwo)T!)#AQIsLlPb?dAqaCa3?VceBy+)+0GNrty;MpQ+9tI42(7LGs#*xv+vt)17+$3n~%p@@gL zjy+|FL&Scd#|&{dbxq!idQ;=BO)tUSEer0Ra^1Gnylq3^S=1K<-mxL@m%a56cem6K zcTYb|hPZngm|wcp6zMD6r>00N@yEZeFy5n9xW;?1!Zi#3)e6^jSPg1K=GA^GU!4M4rDx zwT(~0+{tG1!8^Xt51_YDCD@|aR~IJqvpjw17CD8GXZk#=Uw|96)u+&lmMSgy82`iE zy#R#)tB;zs*ROM&T!bpz*dS1T62}E{1fsN z@(TV@U-Cppmfrt{T(5m#x)e=@@?Q#Cj3!e4J z*`eds)0D~am~M3g9i8#)eiev*CRN58AWX14>tM0R@8QKjn1|bIdWS7m?pd|*ziH9wtWO-p|HrBXRHNVznWrOJ9%Uy=a^H1@xG0So;Ku zBcg4V7!=Pj#ZmpZ*k+VL@my2fK^5EVGbo;Cia%7vHd76X=bPd*Rcy1`pm>2P-l>Xh z1{@S;nBx1Y*k;Q?ai%G5+P}2S%7QNJ<;7M{{b+~RwNN_7voplEa6O&;MKq%JSv7^MI^^|*v*IZxU;=!iXj|QNhFk4uRjy(*mhTQK)!*gtj z#s<$5cA?5M%}@CEB{YFh+3nw#kf?WH0+!Stm5gW7@A=lm^jem*bi{`8U%1dx~y1FE&k4p?zo*F7&aKd zL-xw`mw9qMzz*w_=rVi;I0LNNq}o-AatBDhA&zo;R`(6e?u_3jwwsGQa) z+R>1*ySeb5=_uteygBPBc_k*-)L|zm6_u;s!vl0Kb|fIPWz;&IiLH;mb?CYmqp|e) zU?@Nbp%*dCU?1W5!Cwe})DWX6bwfTIectz%Z=#n|ng75HE#~Pl*LQ%&T($h>SZJ0^ zdK|>Jh1}mvC!g}dYVv<0z}Ajs^byjh%l9wu%R@K5>IDvxbmS3i>NqbrAkRpAmRj)I zA{gjNBau}dy}wm@za3rXI%-VWramd23g7f%#kOjS2cbm*a|efQ?%=S^9UMG&SUcW> z{TRb=n+G$9RHSMKu?l}`czFg9YMDXokawkx!h8&b--#ZFp&`b7bc7BW779om8bMu` zWAupHWjY)*-vyd0yTdlz8>!aI^4C-PcF@bSTk5Hy3vk=5@lcRYRWSSPVzY3j@obO@%_@{4QRn=d>QHLN74OET)%Rj5`T&`1A~`6K zsf@kk_)>ajjM2vqTLIAWh!Z4g=w(NL96nsf{4WaiETe+48YRac zjuOuaeG4X;AleBlQruJ#y~@&}K;y+(D7DolknSja=5aBiElwv@1GUPZQWugSrS5yR zLY;Lg{Q_GCzcI~FD!(5&^wI>e5uVb3q17!S0oIks=G_&iH8`Tr`0s~^K&#GZh|q5) z8Y{zDJ33m^d=&AV@0^kujp;0|W%77lq;MR$n|NVecmY`9zQ14v&j-l3XoXCrs7v}I zSX5lHfG6s*`8pI_wgN~(Szon6hiXDjupBCGhCJ?q+LO4;XiRH=N; zd^zh%;Aj^(pUuD7c(__~>h&@F2B;X95v7zh^a#ORHUNN+$+tL|AF{pmKdQuX&Sz_{FzAK z{q<=J*j4m_AtOGc7=`sc>r9&$w%|c=1m(|WSJ9*m#)GG`FNvnC=fNp6SD9X>g{M56UEjVn6ck zXOms`FfaCQ974X#F0o02pGcWGk#J;aHB%__JW`>|AYGo+C)!cbI;cGgeLRCrD-%OK zpweJ^FrOWYMuG&)kV8zvaqaPJvQcV-P^vwu4K>yL^a-aHNXHqvi zG~k$Q1IIArv%H#wRKS6=krjA;6gX%CRH4W)z=8x8u5^PId~muUfTGq;8@09@CYoZo zVT!pSKrz=;Q?B&MDT@qLzAjBIs|6(2$=m)mGRY(q;Dv38DvP6iyq$``wMV{U5IbiS?ak4Qkw>%R+LyD z=9(5`7&uRhQP6-F@sRQg&3tMOB`wzNkL$`x8p67=lEw>n3t*RL)y$P)Bj|1v3-4u` z$2)vjy6e#xBMLQ#97?1YR|r|NEM%=h{gGQsSr-;+g04Koa;YMe^!sWGy3|I{)~f`1 zzd|a|TmCT0JzOps!aYeZfIN{*z7=JVZ~P@iz6L_Lm8NB|QC^{CxRD8W66uT3I-7!Q z)!iEq1Xvvn#bMS~&!OKV_ZKKlNBWGCbayWMxNp7Q9Lv#l`s4*UhByXdr zlxw4sGsjSAqm4@Kp)N3kzKB$)wE4$TsSq=gI`jfQ0!vyRU!L%%bBpPH3~q$N`hl>| zi+FJ3u+L3*c^xfXTLU$HTT3&hcbh3^#snW=hN4Eg_cs{&Y<~!SaKI?)u!!7Yp;8s9 zu+boDr;SAiAzxTD-$twR$Y)yJL@Kn}W8N6T8xGT6ixopgF8+wOTkda-A){t?9K79f zH!}%FEUV}{vNi+*oZ6kg7p$UI;Un`vy?FaJMDf9fT~Jl2zTZ!U;C+Z3%>OMspkA!m zhp2Y0dENu94s5Vl4i3sgJeV;a+@LK7rDu%JL;793;M9JL$1w_Sle>_9?iP?HjfGh za{?ZRN1>9szuTTC>K>@$yS|-jV=l*5%7P6t-=`7C;6Z#6QuejZL8^SMS%Sn+F)n#Q zxz-NR=XxV$SN=1)=RHF`jz2rk8Y%*n3wDafH#ih^_I?%3%Xtc3Jm$!WHwaFnU|}kHUk4cHs6p-a$L^ ztUCLx?c~@4;zWy99`2jAL9B>ZHz;IQ(ZIN&~P6bl{IV9D;f;YSp2y$DFGDs%~V*TP)f z1*JmtZ*0C$ih^jFJCM)xK895K__Xplml%^90%XW>qD=gEVq?QzpzQ5j6a;AypE#wy_P2%`8=$TX)eoth;D@ z5{}cllLnUk^>hyp>IgP#e*}%-J(;84@;ct8O}P9UGh1J(br-(&u6`Q>GY4q(7cm=( z4F!Xpu=evY-OsID{Vmn|tLpWm2k1OyXG04IY!o{Sb%PmB`h6fd3V;MG)$8G@HLXP< z3*JFAv|A8H=e`y|ArWcj(B&Zw{#DgHkXw`|8 z6PK}P=62>S<+qu~|J0I^;x{ZAO}P$@DPfHNCBmR#;_`_HjiG$hNaT)me52*%Sm{FQ zcuFWRPP&hhZoq2lzKjmkYDB2-^ev@ER3mq&7kfCzoA*F99xuJzPo6P@CS0;W^JX*P~WDKQ0jBh>v+yN(^Ah39ux=vSzrXV zTF@KF5=NT+u-?c<6=tV7w%)jfT z>-y9O*J2`CrimT7Ts~D6HZxJ~*C90Wohx)>*gE6|>e*7<11ayFxr&s9O!I3ZWL`r0 zs6wW8wuMTi#v_0`Ta%N117Q$ZhP=W4%SVTG4YfS!2Q+QRL)BReEMa=nA8u$cuh(*> z`F8>_4D^bYFXNhNxlw2ty-9z)83#5Q_+COqf$!#r!MF2Gd3K%+z5|de@ZDnI8-B~c zcbkUqyU1bq{u8OdcgN$ww;M=Swx+eyz;~CWV}hhS&ByJJ4Bxw`TpGUl!SJ1PN8non zV>H8euO|83d{&KP0LoUbede1W#BoNMf^#G!vA}u1f%5^WCUEY6aK&mAeouKYmxG}c^v7ZLc02K^Oa!yQb&)a=6D?q{5zAy@%Y5!KsYv` z!2kT=Me{w6C{<;2;{-Jge z(!rQ}fB}p)^AF@o-+X8K<|eYl1aM39$NxCJia-8@)J#AgL!0SAFS@)Acd72Uqr0Q# zUDH1FmNoR0@XOuD>KM9&ca;`E_kww4LX_^92U?R!+T@=nP;a-_(F4qoOy26e$ax3X zB6YslBpOR3_Be7-B#}BzJl;}+sH>lTAlsAsQEwkl(Rs0<3av(Up75PODw1d*wZMO~ zN}lEwde28H^d2nbVanFxI-_kZ&GAQUEzQpwTT5a8Fh}?5Lrh~p(Ng0qrN?;TH)i(; z5?jmAP1+n&ges9SR$n0LjA80SVrg|}ufyq`h1s{?tq1JB|)wP?-@&7F;RGeE@Fl4=T!d* z!(iiW-97;M$_zeXQ?M|csJ}tBb4}E@CBeL_f~1-i(El*MqmQeiN6R#~OfsFG$yLfw zx+cr}YKQn9ZJI|_6VOFL%2x~ISp;JqF4cA?l74y3nI7m1O0R}}FH!r~R8+pvEFbr* zp~3>Mqmy%rrJ5TZCNqhtnlG^@9>7#ay03Nr*zCoLl#L2J&`q=SRTa90T(PiESAEru zKCWSUX{IK34sz5M8KlCNvmd`BUX4`yV)ix01o_Z$Ql?|q9MdM4MNiZHM6cuNFxXtM z8Ko9WjhqqCPs;FX@yzqXf( zq0#kqF^ay;VTV8M-xQOGtKcm%F?4?@?^TLu#7nM`bufIw^imxuJC9^;D!n}>6=l3V zCJW%=wUD&Bz!q$mE~LUgi|qZ=+O=4>hF8KD>)uJZ#6CEi{}(T$T-+*S)sjuhrmOuB zoJ$S)pyf5M=T%0OW!UoY(`ba(JAn-D@8$Z5Vm?`6xupdhSq7?A6zn;%h~dk~XSMJS zQt59vv#RpPV7yl&)#ev#e>ZcSCQk$1$Jj{nAN!c*pr-gP<(U3u-z7ISN8j>p{*Fk0 ztq>32ZS{HoP4Cu4zcxcJbH8q|^=p)UQw!aPhSG`(P?vo`HtK$MZ8DTqi-!Y|%tI=YxMP;I-VqxrTS=C;ec zWR?c&nP@lIZer=|`^e|cb~Q7dz58LE{qQBT$T8=`o((a5&8v=2QWcOXGVF9DB3!AS zepEX^FWgsJkJ+m~DjlUQ(fWP%F8W%XqAmN5rd&{6#F65CEsdN!VC3XTWQm+SXzv)K z&mYqL$m+`>O;S-`8e%MC_2osRqP`rpkuvfbA!Pzm;TtS`l+8E)fs~`q21uFqEOQHJ zc;fMB*a!EOreT5pnnZZdJmoCZ?S#~!lc?VVR6VJ|Oz%I3&Qrd1-)O>lPDy>^U~{T$ z>YcVw@3f72jav!zx*!$m!CTb=#HiLnz3NDXdKaWTJjAyrTy0Kx14U|cf+s)DI7<5d zW;DPa_bVd88R6PRYw$m^`bGUQ@a!)=MWvc;SsR3uvg{%dQ{yG07<`B-GM!SBDW4Qy zHpSDp*dG&s7iY4O(~5_%t3M>(-fV|1Qm&arBHljo7Mst-_I5rEu2_b#$P!KYoN`!{ z>(CyM{&A}Y&El`=H`ttVujy{MizhpI2XCbgn7m6Iif=``tf{wd=Qk$DKUur{2db=u z)M(z(tIQZUGa8CSEX~0+TaIu-G_LDYjZVOkS~9vtUJPS#k+*eY)Yh4u*}0+%I{cHkiji^b6_e{>t}rL>(mLU3SZK9 zbFgyRPgm#gB~wsMnLbKx#tO!Y4)`(Fo5Hkfy8BR^qkHZC<~_hwSu3~wH|yC%>Mzjz zczf(vnQ#oyRjLp4KP$v%7I6h^s7S?lKv|o(2W_Svh-n%_?S6?)iyn_-l`S58gRsD^ z<_y&a`=2fol5n328VjXqFrM&jES90B;R!XICVniIr)dXr+IURNSiNA4jU>;bBK-uv z2~HC%Hq?_xuOp{}#{`H)4tshJC&yngsR$WgOzTj-pJyT?H>;UQ9m@WdSH&So*{oK8 zV<`I9fDJnSO{AjNeu+b+m4$pBvYd)fM#IMF!onE`*^-6d^C;tpZeuhGy3eeLfKx4B z@ajGNUv1V465nq8sE(;%*(>)G zP3KPXlRtRno;$Y}9#B^2PBxt@lg(0{E0fKHRR6<+`!-dGA3Ez=9{mpMy*+497c=XS zK9Jd98)v$C1_pudFF|{bI$mPJo`w1jm(WmT@<_T9sh)9|o~hQ=^vu^mJ!2M<`k;nP zIfP4P7+r>3(R8Lu|5VoV!`3gGUYcooX#%oXJDG)4dTI8f_fkSMT0Y{HvP>{@Ob^X9 z1c0%u-&YkaVZ_+Ka9T|-(&6is}JE`-lQ1;5$hv8hHpU&PCYf*_e z^Jk#ZSi)`R$&^Cgm<@)>+)TB)aWK}**DwXFeQJ%_nQL}i?Dgk(Fi}~*hR&m+j_RAG zJAC_hd9?dojO8@zx4Od@Nr%7Y#I_@eW{s{+`XBDoAJeHf;hXIIf&Wb%4HyjImV z3-3~WhcW=*6PHrfdu*&}hgpfRXtE2b#Bz(%l%)1O5FdObpO-JHw_s#Tl>B| ztp+^2KXQnt-@zL|@72!}R8Trr)+!lK0VRpIYEV#4caRx$--bqYh{FK>4KiLp#&!dO z9YG-2p+WFT5A*dqOM&1x$`}N@bms*?;Gy`p4fp5Up)ei=9C2ljy6Izj?+@~6d-3>A z9A_dG8GN?hJ{u(VTOd({8Vrf3KMEweBIWCzNFNyzKlzg#5;9&NHjsFqi~W!gk#NL7 z;;0`I*{D_~B#v1i(frQ>iQ@(mw~-;7b>ja=NQ{R>(2yu73leWr%m35T;-mq_1LQC; zzL6ois(Z|ufSvx!HC8))B7F$4z^6l;(x9PqWU$d=KGM2s@IDg^64zM+EX=cTVue!U ztU&4Uz5&WPD^Ml?0f=#n>K{8VTKYZ*lj9aByJSTNHTw&i0r}Dfsf-_2%+N9nSv<5% z@)s3>=I7%?0cejuJk?nHp*OG%`j#s(1m>$-E^LDy#M{a_a(rS>uVou_sBD8S)^Mp- zVm{G#IL+a+Zihy21#$1gRttU1Ksld%Q#30HiM@E1V&4NTQtDd+$)2bZ8MGZ*s$4f! zrlX2|rjom5^nbl*Aps|foBBy|{^7Lxpci&UC-+8AxOi7| zs0oKh^N^=v2l31!fv(_^V+Y+uS}mk7nW{pSJdLh;fKCB@?MRD z1+4k6VlWk?zX_7>fywrvcWE;+*u4;2W7Ih3dZ3#ihVD*($HyqMQWEW+z&fm7-~0+i za_|KlZJ~U#zFD3Mkt>nNzsS@2=12eVI@Z?3Sr>VF&JkACsW&za$dldmLI@5=f3kDpTM=svO(5krT$-DjYS#WqR^P98XV7)N+LH0C@-T{(S7!7hrZs40k-A zx-uR*#V7wl_glhHi%c6#yOZ(q>O=G=@wCGpaFKPOow&DNoISvzplhhyPu2eo{MkY+ z3Y3QFkADT_fl!O!5K2LgHPm7*t`jON531!);q#RT)nfjK$amBmTZ&>TkMw_~08K|- zr0O7`KDy9~vDnHf{u}IQ>xmmIXv@SUqb(b0wa}D%d2|B*PVt0gbe^8DT=)c&TR5KH zM_Rkue~hu%?o*lDd<85hxQ#^y!)+|)WblNm=Ne}apbUlX&kWqg2jKQHGTBf#fdptt z%Nb}H$Q7VXG(h`B9|2lwX`rQ<*C?Q+*?{)j&(UVyctGYpf7I!8eVeSfq)Qi8_!1k} zfxcZ8;{|;!R)!e^%#?cJdUE{oDlEa#3&2!_%NCxIdLXY}oc;J7!QfPlp-j|>^x6Y6 zGWvF?JMG~Z1%1=>oz=bowu9ERr|Yt=D2ud(XcQf82DRvmb*Y-{ymyROBoy=x@jnGU zWyyr|-VEFy>`b#8c{)JE!@T`w`H?5vUUgtbsL->7o*Y?6Hp;z;?}+enh(_MyXhJmN z?7q=z_PmO|L?M8i7jqLo?1%!$i31$UTkrcGQ=!4tWs?;yQJ?S-`n)=WC>Hwr}^Db|5bz~ zpSbXznQTIp^UQ7kWNJ4QGdHX^e2TP~O8e#%4!t7L1CO2=a_{saaY0&_kGG@6u_Hz3(gYum{!5o z7wjPR7u@|zr7G;TfFg|cAU{6jzI#~<*2(vZU1zRx`+95MKS7J2!&HKO8{qqTj}o)S8V zE9q@4W#D6Qfah1x)vN7U7pA;!o`Bfdx-QHgCOFi$avl8~RobDOl96_Y2sx6ccicye z1%{M0_o#kbbL7Zs$}xFxv3NX*r+!6-JtU_4}tfgE* z%3I42cS`~4rE$;|5)pUH3`_yd>7;2kn`==``A>ag>iGw-Q@WZcSf>ONr6o_9D= z;7ad2El*Gp^LBtmT7(o`N}I^6aypgLzh*mk6I@1y%?raG69>M#jq9xctvs9Iwp6CK z@LP$dp(;ndKc{k=Qn_ny;HguJB2Um2eT(%4vN^5 z&oddG8fxM8ij9B9BcJ(aCQ@OEq94)xVoUQ!rJ?x=UtX&4YzWIP9nTQ!DQ$4@I2O+} zJzORFD-r9%Gmq}$F5b#|%}NLp@xEf4a=h`pQk!zCcrzFx-Y0=h9e_6+5UP%NxsOz4 zjW;0V7BDX%x;>MFWz=^XDVg)&3{R=Zl>n|cA>b(v4qo}|AoA%R3K}UIAz&5;A1t4S zhhuW_#uTqQdiQ;#LZds6Pa}E(C=kzryGn}Iqdv%~n6P(!v`|Vdh(>}$c1k5W=20$c zGIj3Ts54TnVAc+z&cF+bI?uQsXacj3zym>&D`|_KN~jS%cbZ{!><7<4gTumohqh4Y zbgcg3ZC_9i(4`vv3D?clX2HIyT0P1^j!>#Uy*z^{)k(!HsfquLrlv^QiqaXW&5H7H z79!UyL!UwVnO&#E!j)nEDjSvd6aiSJsTAuOted9rgatZEo(~w1dl@*&IYbJ52rWoi zcv0=B>qTebRhcW4dkU#wY>X3K$Q7zh5UNoMa%2pc=m(zW*Ve8{0kZifsqSb@jet&GNAHYO$d_g% zUrX|Tdbq?&K}JxllyqH1&eTbN4C;P>Y1~eT`Q`~@rfXiEuqUKU6jGCgTFOsV_-o_( zTECXL@M|Gu4JPH#Wo$_=MasU*DpE3p+0(9RmK=qUjlrfW*R2wVy!XOyBOEkGf6 z$4pJdbGR1Ity!9pTP_A8gHhi^$`s=K2O;rVqvfOC%8KfEzHzx8#R)b@-vXj z=b>a-$QDkCU|3dXn;;bhXHhAVxfW}xvn$79O}3M`LCCg5ldbUzBmb7^CMUM9h>>C# z^7)YViAaTuS3CyJ-gd8)x9jztmH&yH%h#5TK-VhW0^#CfNYBQ=Z*|bIcGR}DVjf}`V%qQZ>t&El3Q2(l)Kge^Hi7THPIcft-KAqi_(0$~rbCCI-1 zf2U5>?d~MbsPn#jU#jk@y0`B=^{Z2-PMtbcr7LgNRirB;EEaD6_kuDeH^#SDCg`J(-^v`lv#w-Qnf`@KyVrSJp>tyuE3u0D2s3P~a>(L@# zo*mf7ZXHX-KF1y1Glxq z7X+|l&3Cb56zVBdMr5NnfD!ux7!k8Y z7||E0Fyc@UBhG-%3deP%!idA)lMxc^=yLux36kbIqJNdU%|FwwlzY z9z}R2Ekv2Dai83#ZNiV_8*9nwz_0F5ZoMlyGDijjp-LAyV=AdC`&jfKed~D(o$NjPZGDt;Z$+a86af%Hv%6I;z z7lE>Tpgq(q@DcnK2)R}L_EG9~u?8J`TL6C`PGCWMxL^LH&%_u~qokw{BpZZ<5L}p%} zP!l^W@oL#4l->Zf6IwD8=@m86`iv@Zin{3 zYcd*to~M`2hRXXw53b33BkB;W&hD@F;iPP{AxbsxFj{w&XA@a}#DC{-c?O5n9G>@` zHbTb;{ZqV@e-01krTmeo&#oMfQJQZof^$pRLGMS!&h*ev4nr4-P_Z&o^JHU3NHX@? ziZ$>AO4Tmp(NuYcCv)?$3AS_87lsQM%DzAt6*dP)We)N0A(%Ks?IGZG{V{oZ72->M zlPr4mDKjE&tZGDc+I!-!Vi7m&Ad0x}r|Z^d+hBe295rebrU&3=J?+pj7Ia?4pP*`M zpXI2D0dF`lPrGQ_#bRIPXI+;PxdI~V&fucK778-9O4N`Fb#eR^) z$>s;p;e)}&>kU0mGG^El$Vd#ctz0nUdK1!!*8DEk=BhJAo&*P=)wruh2cW6?#~3wj zP6=wJ32Hjfc@X3rkLjvsh)p?^l1>AcO^46-YO`D;C1h;AyYswvYSlvEV0E6?g?VIq zhVAulp?WJho#AWsoOt`8m9zxZMq2jRd?Sw`a6cUdEg@vaB7>(sWwb!y>LqFk_w_ZXfi(n3pEx>=|F1iim{x>>HQ>A$o0sZm zWQN3Il3xZY8=KD}6%Z{C0#TO>0-_g?O8Ls~E1!xlLivoT4xa8644&aT!>fR2wH7!5 z;E7ygz+;D2o(udmsmXzCZ2*2+RSJG`1MySWu}-S^9&~ljyad+&FyJ(#LAXhKhpZR) zv{uL0B{#*ul-$%Gl5>M$xfPPL^n4spbp#Jc2wAiauEKv}*R$T=YE*3sL{+G72>FT6P7Z=Z(y%#ZkZf#{o}dZN!j0o-SXzY?oTE#H*mSVO=t2c?JqAj-(zXk{kEX-kU^vKj*(`i>O+k*>k7KJ z&DTr3u#h}n>p_gww8Tg@hGOvkkVYY+|rHg1VlcG&@P3@#qDV+SRr^}rHD#zeW{ghpY;4jfr& z`%}h2Y^}0&&$PutkHNZ#?=4n{+ToJ@*83u5zx5oX%5S|0_+q!la|TZzK{TzVXbqmKgc_(eME3a1t8@~+Y*?LXnA)hl`58Ht>_ zMBsy!2iR52rx6*cKE3lstnKC4Yv#$a!0NkZaHOJ!(Cfj7QgO$gs*Ql? zKTglmG0JH^9>M$ha*=k9;cixV1S?_^q3x!|ogJ~^@2eAQ+rz=1w zucuV6Hpr;?T4Kk5`C3T>HD4=ffcaWE@@l@;a2P2(5qSEm zxP8Ee-<;Ker(6JU+_+VNXM;$M5mKWGVu5PEx)9%;EU6a=avbHSo-|uMX>&^T8l$8} z<5cTOHTfE(Dy}Ec;m6?$K&{|*pd1d;5UlW*-{EjD5tXD@jK%ev{v%;8(~AUhx&`))kTw+WyfGYq8{T=(faLeiTgivj(g4sB?8DE~ zNMuwm7)L2_xHU72JHc>IEVd10U8M2I@PzXtl(Dinal4v|h_d+E62G$e$r5sUV{N>x zpeIr}2P|W|Il3_uG#T78)t58+Em3;_g?s=B3HrU%EIw8rK!Qk93jIAX1$l;6g1!b7 zr+~q)#@PPhm}(dd9m7^XR)w9Pwml%Cdw&pFVSFE{fc|R@`T|fG^oOjHnd;5Hze5YQ zBD@)M{F_kU;q`HHC@9A9Spu)b+2+k^>-O}@^*WQWp2Y6nVkR9YP^u=e zFfIWp&8Q4Ip@aG$I>7@`iwr9uq81taAY#6+-4B85-$ANG=_q8BDDBfFK$Mm@RHC%J zAw=nQtR_cMcj{4w{ZSwXCckiOc!)*>M@ml-y z^DNcSD2ppBiVMo*EI5SWCU&Qac@RR$K6MARMMep#d=XUIWv*3=Shek}AP`tv2gj&c zECVZdFpWVSKK^)zfm5O8t-vYjAp@tPKsfaTnSDHqjZ~Tof*gyqQ$vWy2rY5aKHtp2|GNppRa%mz`kxM07E}aL3<rz^cn;30(kT!f&O_lZN31`x3=UALHFT_Wf z0b+Ka45~dl@SvK!hu%g;VfAznR^RLhB_8WrA0urVHKv?Ta_6N!n{Pxp%?FXsaX$k| z4OBvP-^h{08waLMSE-x^K;v_-oI>t8oG#kI!i zO4O3AP(u*gSnd0@l)!5!W5+^lV0fON3($fX=4F5!B?@JZDe= zG#n$%7XyfmFbCrEV0$8c7U?*o;(3~uuQv*R0}>0_8&=U5C>j6 z+=u$(0ac^!r7MnjDff?aV8J?u!DIW9fpMywMriiS3**!!>E23?oQB$;Z4Tp5iD5w8LJw7^dvO+4ByTWT@ zUAG8Sc0c?o5Wn;U@F%v(DF(TbQ#Euh?g5MU|F#3fsb3X$?MXk$#w7vrhe7oZTz z6ZLm-J(H3Ex8}}SR%37g*j_$Hu>>pM{(@))dyxua=NQC3*i8`oC{ih!C#?M5TiYA< z_%0;QH%QFZZ^kofo?T-g6w4!qpOE+%yh1w~`sm5`(NsWo8ERGfY_23}#t? z_`|YE_A#|=qC(!|JP1g}UsJ1JqM6X3D-~=!(Ia++Ti*IZcZF+j{fWBPsvvOf0F`~5 z4kBfvBPJ(mJ(edge3n^Xq{`fgRLqUQ&}aCuje;Kf=r{7?h;XQolZ9(WUolc;ZA7Z9 zja&1pS{t`%ZYyi!f9p~Cd+ge1nx}8%m@C06B+wqwQ}c|p>xMP7NUwoT;P&h7x=KQR zz_W&)2*MH$yVrVR!FOYZy8IptP=>S})C-vTTWq0uq$r5K!e9gyNwGpuLrAqBIR_R5 zVO+!`lz|ax!;rF520>k4)(F}ajG)`)dg1MN01q#`?LhhmwCG*|Ml4T-hwSoCg_C!w zsW3bE?hC?B-YZ5hl^DT96`;wGy59_`W-9DFp!vefCOG8*;we58)7>~4hVhhFP39t1 zt0p)%TZt;Q4(B{#_=)?DXxRPpRe@cZfn5krS8yEl*Q5f}U;v&&%KBfMKge}Aq-||e z=tHDWfWCt1Y9q*LM7KHz`RypT9WCPt zV4n=ajchyU2(mH$=!)7>KfET-J*#1BTo%`j0K)TGUC1{v!`KAn?S4HB{N4S=dKmm%M^Sb^}nO5IJ z9r5_TVUVenJsxs#>I37EGT$<4-Yrq{_z2IZ>5+bzk)Yb0fHCxS=UvlY0Onmin%=Xx z%TDwGqp2ggz%q@~@V9{`<guPsBS#-l#FQMdk3pQ~-w9ZV^o^Sh*?v?{!? zOL!<6MJ&+H&*fWqJpCMd`o7Bs{rmv5tx|`E7Kja+ia_F-$q}S7GZ{{{Payp1|G?_J z>MtS-3y=n!Tk-3^Lei<|Kn2Q==~vEFe_Qx)sPqTi^dH^gm?6F2!%7EQI!#gUr&YKX zH?+}|HW1v2{6g*(2c`=swg$|{9AorzA>ydV|A_uYNLl~FNomL-j+C{ZjgNCgTvxS7 z;vBDUWk=%irfM7BO7M%nfr}VYe~nZ?GcgD>GeBoZEVarr$d`sGN|*rRdkm>G2_TGA zo79X?iV-@Q0*VAOEQ3hmO=`xS4ZbUM9(RB5DCST66Q85cZ4C8|nI{|1veYNVn_a7o zV$FWl)61p8WJCq|jTalFZf~L#TMU-?Tf8p=SO!w|KC_`26QhsZbXhJV2XDIc841(O z+oNILMLqEznU45{Eb(bINMf=0ntF``8rUa|b)fom4@D25`QQPM=4(LDe26Kk+Oaqj z$nVH!R2%?FHmT0m4U_Z{+(XbL&mom2L%h%**d%R|O_NxzWqKTd-#hoyg!$&9bd#`t z%;N<&$;Y@`*|@U*MgMG+V)|!}?w>IW%rmv}vVe}Fr*?5H6uK`7qsATF_HfdvOxcj? z)viNj>Y6vDvK6Zc`z_F|*@~5hv|-4=sW<^lId8;#s=MP7-5u#LD6GLQRh`ZgePNz| zzvT(j;v0;w!z!U0}2o;8c-RrC9uEA=#q;$ zu>C;i4*R}UzERL0zTkc(!dId|nWoB+u~dp>4=9yl*#l51wj$3eMJ9kSz;Qbb%gS33 zlmXj&KLF+a8u!6(*5W-MH6r79YHt8z`uY|PtgYq~0jHb=wm{!TO2jarfVB-LC18SI z!$j&)T8&C|l;F=R2sF<}Z#PdCcu}umW*ESr44nKYQ+#SQT*QADqz&ywv*`E8@Ih4V zM~I4Bq(%KaT=S05VnLE~rvZrC<<@Sb!PBm)cp8KvwhHZ5?Hx~rxE34y9*v)*QCJs8 zjeQysS^Z*dZ$y=t&jtcZw8W=3Qw7iabyeP%TATW}0#6+W{5Q~Q)DsvT41!TK1Pa5b z5mHtbx*%1S&ECi;_&nPv%xC~T8;5C+jW>|{C0!eh&gs}PH^O&iZ(aB!l#=g@?*a~d z+gaWumYJ7=j2XSI3Vd*cH3r?d^ZUZ9#kxGIfp-Trs_GTT0`-bI$K@AbJL)wCM(LW| z)lTS_VD&W@l?G$6=cE!+9Vw}`7kl?kNewl@O8fFZm|)c&3m`y%wMN>|J}#SnfehoR zNxIvGS7I{_+s{{xp(Id`jJ>tB6O=ZLBhGL~hyon4e zq!$z@>d{tQKLRVxU8JlO>Am4GT~2?14(yqfbI zofK>97n?t8TP@3D5%YG~Z(hk@yeyiGIro?bYTQzE%-?Tnyv#$5$hZSb?Mm6;d621b zOKLQ{t--*SfF1l3Mk}f1dNVT8{-O=(*)Ea9?hRvYVW%;9NyJzXRhv>j|R2VEcUuyTu;C%Ou#ZPomq% zum{6YinTq?`>e8f@g;Mt?6YF?;JC5W4Ma8%eoB+S#(nfPt{D^qsr@!qRh41eIcP`V zDs<9hBef9l2leAa_AabTy*hiL-uw+^Z2^;(9cHMy z-ONaqg3dx_Gg5&9Lhj)4ada0H6(Qf*N>6}WP6+@*d20oR^40*ub>tNoelZnbh*x0n zD>VQEI6Pv9cDNs@KZ{#?RaJD*Jv^bg_cSoU4+zA>DE$EHJ`J$(C^#5o0S@?yRC)7E z#3T))A*hw00%H`HD0t93P#Shp$l(1Js;L~vSL8Q{aq{=;+ zKlj)o!Y|>t2uvy)&*B*sCY8@1V|DoJZB-jzZ;Lh_!d-!l9DkgRHuj#mGL3Z?*gV*s)F17pVs)eVR zUzmgnQBi5T-M%p1p@YW9ntk!}9w-<)QB*(dy3IEYqYP%QaTGQ;))pO^RlbwGGn?9c zQ_Cp{q^@YLzDRj>;_DqW-yVl3{jPavza|4ieKU3h*)wrmNw)QXMdj4*1rJUaAA#Cp z9GpoxE8rj(JxhOANK#}{l&c51<|E7v#+ZIc-$lF4*+DtYcp@6z-D8V(%nbm9D;q6@ zcWR6D;iOgbLezR~oL0Y=s%xWue?5;rMKv9}6We0B%i@R=m|c$YV`9)Y7^rN%y|+Zb zWm{DcH>gDps>GsgRFyfpN)9;43n26^ifc#YX63<^wHEdL2{a2D4ccO!V=pwgkNPjK zErQ-zAfjxM5?vm8(g{ySDg>2}Q(qh?&|;Su-mn^mCR?(Da$n<6&@U}CY=r+k%Qkz_ zJQ@fhyHPANNIwRG#A#TLo}yyOy!nh5fok4cB&Zum+g8Mr;l#NPFY;%8-ha;oco)dAZG6Bc}JM=PT6y21G_}iJ-PVEd!yYvM21< zsLjlcwT(xWg9ffSATSS_tP{AFYPi0MYliDYqyonynh|AFJWv}hfX=(iZ(HR!yo^7T z9$p`7d*421Amt#_gm=rm5{}dI3}{2h*UdYcM2J$SX{(=+=xc=R+K;tQ|M=21g=eu2)8*M73LvOAKGqX4~epJ zzlX%3a{3*JJS(XTl)LUr`nC{Xl#;u+)*cdPQC~ETZ#9GwsM3=MZ4~&tj2Ah|OAZ4- z5W#yz8X=Ch9bi|q+S?&`0npw^d5^+%^xmK1dnhs=A_RmRK=Ru6J=CKm&eL?<40!!l zP=hD6A0g%Cn_PW;1SwB)GYj+#q|)X#bKJh)K*v&&H73N3Iqvu!FoJq(ioA8#!08~W z)O0KpPA)@7@laGD7!Z6CcBl_0VLt?VGaWt4e-d^wwLbz>#HSP*hnIoLDo7Sb&q^s& z!>5OcpUJ{x4l-(g?Wcv*>(6dzfnOCFMZfqw|2!Yr$O{{Th_COb{>6A*n7lqjDkiVN zR9VIYBHCpwh&)ReLVdw~gujk;1N7~8qK7N_@_Au;`!`#9s2?bQ1#8QYs-@ZCg+Z!J zQn+t~{s2U1B;PJpZNc%@ZitE{izx*JIT|fxw_$kaHf{)lv$%f1F>!9FZ+%g$5(J6p zj5S-MMhUOzZPbX2s}>g>3`><7327ELYx%0|w52t;TUnz<7Y23mBCC_{)}5SQMsJp3 z>x;sG4*nLp_89O#pld&{51*yFHsa#kVT5-b0w)go9n*if$8siaV?j`g6uzSi=oT_O zh!mp({{am)UbU{L>VDea?vJ%SkKzfs@$+#ljvx~Ybq9@{B)ri9B2YmY5svyC5MNhu zW_>I@11!`-AAAKVyMxR}x)4vzQYdlL-w(oqh^{ypgDCe+=T}zSvnL8e38!SWa@Zbh zGsQFntXRlP1Ob2Ww5hsSqHIj1UN?C+$C5)3pBx8tnz_RYqc&aN00#gxH{#KN*YP|U z*-C*~|6sK0IUbCD1>#1fLHXJk4XWUIhwWMV=V1(?F=>NCd{d^z`)Xr`zzRPs`Ks-b zuCrJk@tWJ_YB0lmfp1P8V%bjfnz3nyMxzV;H!|i@rOR*gR2$t|gWfzY>qZqierA@w z^8>y!j^{J}iK)0F%+?>aHI*8kLJK+P=(h+-vboOCVchr(8e}f5L#c;)j*GNKM9sJ) z%NTZ81g2l2p6KK(xaa9g?XJ{D+pYvvj7sw<1-(BmGFu+4ch{phA>?F!Z5rN@4}Hzi zzspNZIa)}(0ST_Q*dvwc;Ue8|y^o2q`!-V1E|$oLgddQja*jOWvfbxzrT)K(LMw$F zkF^!3R;v7!Lrdd+`A)P_26=5w5|&ym!0k0+y1%^;8Ar8OyG~K)YlBZ<_===M@ur2A z1r=vQg@~bps8rYSb+O&Id6CTFD?qtFu3Gz{omS{}>Uxq}xLQln%b+)}vHe!*JLmA7 zai_P|4QOFmn8(>=XvDb0HP**P_?F%jtjO$^wVQjmKf$h1@PO?MJ&pEGa#sdEP^mIl zO;DT|fpYd7T#K|X(k7>&WUAPR8>G4ET~K6v#tMQO2TtbGI1qUp*rc2I3a({%-mFJ} zrD*JDX?VFY`M_CT_0@Brur1&gQfYGRn8T~Yhp%_C8Ndv>#Dnf#)ylzR?z6NOV{mgN zJK?dazCvVY$XUoy*SNtUa7}6&(y11^8K(`V79clO)!~5w4V!m+*}qv^f+x?iJMI9JgFesK7|THJTLZmSgYf zYS_S&iu99K@{_F7cC5BVjbc5#hlcvl#8*(SS?C!Tjv6=$Xn3ft7itPUic!1;TCy+F z#Hj3BrjLjC=G~&*<%m=%rT@F+xezHLOEWOUwd9oj7gOiC=<*Sup0rW>E`qbOMn1;1x8= z57!^w!EL;bIuB_>d-)v7N2Ul|&bW%0xUdjji?zLtM!6t*g8QO{Wl`sGt=0Kes43#2 zLW>Kml%52UVN|Kb#ZRw8Tqqb_(l9D`&J7=!eW3H2=w;pZKfNJ}!xgPK&_NJ*?cr(w zI39FdGwcR@+Ca)MOu8Xun2gfb^H}=W*3x05?30yn3-y#w)*aoeYD1+|B8YyEGG&SU z1R3q#5-fze(Z$;^VJL5gp!p?0a94xio_Q;PplZn7ZfG(ceY=9EX=;f;P2CVS_ahWG z;{DDrjfME;%oXQ^ChPcvdzS9je*cY-c9ut*O5gfAW}bQGp{57{8l=pEEy1Hzyp9WnPH2ohuGGpuhy z?sy^x7peJ&(gHG^Zj3s5deFJ9lq8|AXT0OKb+^5dvD&Q%{$cVGS-)^&7X2Y4JP!rK zk;+goLW(a&K#+aE37EYIVN0Ujw)Qro7 zcH4eK=R)0Tf|!OqP;VpF3^~J~zq!_9!>wY*0>$Bx)EeY2;KpdF=b^a{d@f~xEIj$b z@MKH?PpA;(7E>N`eCg*3wF_5lp^uSD%%Smte3^mIXTB^&Dtwvv1A_nf@ zGB7Nc;?B4|iaYPpb6^bnYpzE68a|nVS+hBaH5-LB9cdW&!87fwKn6XaVgpastf332 zBVyqz{uXO8`55(##NFu9Q!@Iy5sL3~TqY^eFg0TxTj~0T@uACg0kJR9t+SA-3FVC7 z@4$p|rp4jklP${qeW&mSL2Vg3vx1+hxU+1(=FWRAaEB2zM-UV>*RU3&+T37P2DQeHmVQlyuUdNy?1)bi2Rs$i~Z`KSQ3MaS5NpMMnnJ~~goxmiEzndnyQM{|(! z`cZyS(E3q(q;At8sJIC_6RrqtchDW&+KJ1G@#MA z?4S%&`!JM2&5ENVAaPKM{ZO}`;kOyxRKDr}Ec9%gh&t&19^b(tF&_48#m2)!x&)CY z=!5$Va7qJlwF6|vRjE~cM2h2@xnT}p^_en<$J0z)CfU|d9#U3EBAT1W9ar_C;{Qh$ z^FCC1KN>d19ALs;4Q#PEL6tD0#gX#?F3qe6_pR9B;Z;vndQz8mL8*)VCpBVamFSd| zCY&~GKxq!NTVqJa3OJ3#oe3Uw9)Qc}HLT!3tyztthT16;foil)Zyvp` zBEUk0CU4RfeLi+Z!B!Jsa%(tR1Wv~T&=~XvLAf8~SOtwNR-O>dQa46^q4K428)vj@qVTz3JunQSXD?83PE;;QbXKL47`U;{Rb#MY~HW7N?QOPm28-FS$Bs z?XER4yo+f7Qnr1rLpoHoCc1h@j3|`+HmYI=v?45vgtj8uHt#LheC<^LE@XFPQ;#%pIe~)+5JdpZhCfXQdhFXvvRUCxR z8od>wQ-z7pMfqWfIn&E+dp$PIP{m`xmsYHoX#2m2v5ZoF!aTzv4M=&B()F0z*0C9) zK$>6l8;HNujU)k=zSK?71IuRNl!Dv5?b4^RPcb_&w86~h^Qq=g8?#gX#uP(gALBDq zXbW!BL)ciuu%ymB&Ml&@NSj5bYOf4PwQ_1dHX2*mN1)(741_sId2}9Mtjz!QsK-m; zwz|~kar7i*lbR6piXZ=x=Wa7m8e<>#6|F)>|MW!sG>@Jb7-kex{U;#LFl<~z`UikF zQ-e3@4|QSK?AOJud`~G5(#|ZyWM4GK&c`Ko$Gm6aY#Mq=!LbFVtz+hsPsI+EdavwytiN5^%ZzQjXP+J)w9|9A)8J?b<`i z3w5)KDQ5>3gy{nx&bLFw*{0&LXj?PK9R0RD))t`#_nC`Gc~0N{r*hpBsp>-mkWs#Z z8L#q6ojFbp6F5ksA$-o^IG)V0>(J^yxN*9d_i64+rZ*UuziiW4Uf^OE8`@c8lg^SO zAMT}3P?(6e&q7+Y?Rlx!u~5G{yN|~FOxk~uw7*%|Edp6qb{7Y=e^w73HjaKp4WB{F zOEgTJR}0DD3Bw1#b>JT;@cYe_9v0V{rG9jbE1`9$a~OQedKRKhp=^czm9D#^ZFQs0 zt+T5rb`0=C>&WqQ2u3u(N(Gl+QYNlhrCt>TpVdL|IgC02pEc(7;E=zRlAaUzz^O&S zr|j35JWw*IqKD-g_^`o;k6>D_;qwuybKkyzlnv5JzW{uY{t2ll=$rL7^qI}em@7eN z$AfKF`BqgPU$-_G^+}|1Df^+gNZe*nhlWpE2GvH(ON9_B>=vlB3oP;iMM5}z22jK} zx65N(i|Y8cLzF2MemP1U-z6&QJM#4}*I`eU?gE;E>O#Xs44t~J9a7!5wU!d3@aSTU zkO;aU6t$sK0F_JY;O1>(da?k!PVJF4i=1k?m1UJvUy!;gSzl~q{YsGf!wDMkBO&eU z)3cD;t-|1hv#Xf;RN#jrgB;Vwq4;SCzfz>^akD2-oU_MG4#c|hHu--d$V;jV^8NY) zMUd|g`o7V)&D(C&SAl{&aAJd=g4?lq55E|;Q9z+c_!JDt_+<#=GPd5B(tz-9IoB4tr}NtNfxaUkgeEud{ANMv3P0$XKE|x2_V+xpg6$i;!2M+4&MsRxQMN zg%-+*mHNe4`?-UOiT6TkgRKdN-_V$uOgHw)b&Kr&)`VDy49)Y`9ZTlQ&SOj=&^oKrH z*D+Koa;ReJ3x(}_#VTHkirN)$m@u+!D6b!NvhQ{PExR3lKds>wD`d7~;$C-sgPZWg zGI|*qHJcrY*HbqC7yrb#xxRw_gbe%scl$FGL$q=Z(!{7LF|H4R$g6;j-^9yDup8_b zJI(sd+n|Y|c8t8H1nm^_%1jip=l7TRT})=Z^eqT-mg`tyc--3mddqDKwV~4Zo!Y|k zNUH zoLTa1@p8yxSzUaPTCF<7Ihb|M;l4(eS?9bq>&%wB+6csR-Kd-E_CtJ*^|E5Hfu=Q` z4K}a*l_8$Jl|Dd*aoqPknc%>^98im=!?@;cbvRt+epXQRiVDYa~VdZlm$x7 zPHU_5cT}K8WK6X!l;lKfHLo!)-5P!8OQ=zG58PTBFceA?)gFZZb#jIM*aMf1x>Z6r zl!3&CAsHGKaDpXa2&?8%MH;8@>*69mrSpbl9bfLzO?;F4arW_tcQPBn5J>88m|3=03}fZI8aq zp>EqFohyV*#I{c~?wTQEL|;)v5{tf~2&h+O$ScwJ_@{2$-_>p;9Ve02fYRL+085rQ z`vgUaCFVmg6{;2ihq@1B6jqDfh5Pqw6lS1C&G8cv-4PIrOE?(t3v5TW7Sdrn2NMo=)_zQdCGoLiA6Vcjf{t%c7xAl@_kAP$A@SruEm=Z+K%)G z$_7ouW4RWOSUlOUZ#<*LV<*T8_SkzH=^XsbIZ6cP|LHhySc*Yk+*wkOMnMh5vpZ@>M%Wr7o7vQ5o1dI$SchCOPDMDG;id!@t#4q?3Frog~7i zT?s=+=!r-RWUPruSsm3=%Ict}R3NW<%5x*#wtjInZIrpJ!F>cZBHh*Z$z0LUzG~jq zS9P1rRbAtnRio-I8N_~sbc&V$4~(P?nn7ek&P{D07vFGxCilV}m4hed%!2r!Sz~||)Eum9wgYw^ zbPVy=q&uh~Dk9EK{gSyNqOu3_tRnVC%ER)9NR=fp6B#w#+<=VL$`uaP$`uZ@a&n|@ z<>O<~$}!b85mKLYyjzVs2S-3&-;9P^vPN*E7@RNHws zM%@?Rx^hbcgmGk{G$TM6`_g(Z|M2?ju}iTZOGKw#EHnheaSJxd2rn?clgl7Q%4q_Y4G3INdnlurhj zI2s0`8Y*xp$dD@&KtgE(Qi02qAh^5@I>Y4yt9+U&m*xK2wSAZ5to2-!Tkgi8l(wH2 z`n?4CtmhQhJqk$IJpj^>I1QxYJl+X%?*K4CuV+E`Qj0X!T0cH?x&h8aE{+La_Wv5} zDIUR#PK79KY}-K>k@^D@sMY?&$>5JN%FWzWD?R4hLN~n+(mPmy`3C7THtgH}3XKqK zi0cK?)5@uH&MxX55@&mj?t#R?k)ozxPTd3s%6Y+{!?KN8&WPaUjFzEsm;uc<5Mk>i z?qsW8HbPfmZj60&Q)S>wM%o2nT!WO&Q*EZne6J5uzAi%Au{o4$^Napvo242UMS}CC z8s|?=hkj|V%%a~R(?tZ`G6kAAXKmlzx}EH|d4dHuxV5ODAi6>zn!fhWt-@%-*Z6** zWu-!BJiU|ThD&?L8M5NHN>Lx83AmPFa?p76GqZQzMGDUeSh%@XJX(Akzf)GEjEo+ytGzbSU? zJQOIYb`cp%swLyw@%7130Aniif!8;p=R&G^KgCqTEMJ)YZQC>mo93Cugdwe_olAKJ ztq1X}NN;rXUEq=0SJ1X-d-f* zBMi_$P;(-EeOT90!tbFYrU@{zB41UhD$~VKswif$_MSUx>RB_4W2)N6NgOHjFR0cw zY(X>M@m;i|8Bepfg5m{2k09mo_AXL2-ZoyMk@++-7BW*^3Yn=cATtYjh0NEM@_3tm z#J{&#R#lFI-rTdI+D7}+28L~xL1aZ`@AGf8FE>TKQB*f}FrNAO<|Z)y$v*rurg)?( zE*cc#+xnINz>057@fuaU9K~~I`HRn*;tQ(yWLAi8_O5!?aTn)IaU(#mZp>~J4>}%i z6`$9L?t#*Vp|Cq%plpEJ8^0C9?oVqyYR`51f_9E6d^;}cR$}90DQ;!sV?`jU8_=W` zG9k!8`f$?D)OsocYdsjRc{-ApT2C))^J>S6R0>;Ztsq_!gx9EGwGRK_`+tT8G-o|IwZZvyjdSRLpMc1M_J+oJ8LkEA2(*G8 zZgBq28o~K(jo|&b9)SDq2*RCrEjDntLmA@FKoz*Z%{^Vh`XlmHQJ%b8%*QfyNT%X^ zBVHSHNYQ1sB*Y!%qiI2?GIjVwSCMUEpHSs)wi5N(4^t-F7nNSXp(%2<1)%)9m4T4# zyIV5XLwT?*rB+Bg+6GY{q|G9eEmwho<&+8%TUv^d@)0HoDt>{N*Tm40x&iI21j=Cb zIqlj^+~`*E7@DJn$ErNLG4Og9BjB@*?tpU@uWq2W1#XZd{3CnwY7_~o#V#jb{6eM1EdKot~jiQt=1w=j; zU|b4~0Fk|HM(n2c^*m5&%0PG?gps?&ncO+bG=~zKeKs37rBY5I4;Dv?C=VGN*@+^a z9;8vuVb(8ig6u#&5+slyc!27ld{BIEq-=(sZNP+U-r+jOAa1UH zDMs8}Q%NCip80;1%nLx=(-gMTxGHA{;;uuExx>gW5UR+p1-gpJuLaTo;j?0t7sMhw zS80#?k+H_;>{vBMXUAfU&P860(KmLvZ6CQRch&WMd6;)aspXM{()Vc+T2p>%`Z6r zT5oN&*Zy~84zYXRvfVNzeRnUcuaR3uS`ury;-QyvP{4Mo6@bPX4lQ#V zgkOWOQb5s&-rEPXsx<^`!{qOXTrJ-rM&le5tBo8xkYPx`;{}k2rU|Ju zm%BQxWKm35*obX3(3tWp@%ZQr5J@G3-?>igyRYEa|nuw0&b@5rkRre!j5MZSL&c}F$z0l0#$+ZC#t0i zbW80BY^m;O7S&R3A;aeV`AD(U0!O*X>s)vx(KC~W4Mw=~qZd<++={5O_dXN*|&|)m`RNIKhik!DWZ#ow3<%DT{(g@JGoBKFmsq37&u{DPcmS9kJd( zfEenVw~*HlQ}OhKNcEHxayKmnsZk7m5V6DTzByB5;#sEIbPJ^p`|gcY`=sS?aa5PR z0Fo;EEtf?o7x81e$@dz&VTSmwZ=lI2P_xJryXok=ad7jUb_)1bO4~_MXDD|?IQH7F zUnfCQSUF#?j+!~@*qW#JxtQs2hWk!g5JO0n)8agoid2^7%P~;-4)NxO!=Q;x;*3_6 z&>fHNtb@*)P>vZJde1kzDW#bQJ?1qKL^hoj*|c^MC_l5QPH<6wpsOwiD{K9Y2&X5I zig2ow@|Gc(uhc3C_0?*^yj-?ew!?I;wVvDK%AvX6hIg`Oa~_&8;qLmj2Ea9(u*+~{ zC^uOc;9kPVhjLJ=ooC&)7wg>0(($0EHAF2A$DAMG+jZS+jS-xEtFiI{YDC5@4wx~j z&}`@*mo*ZvSU9NVJFK6iLbw5m1-QFYIGoh3f`dm#)diap&x3=OiOlX>B<{MM=uH%e z?sN?tgukALiVoC;EAAI4;QhAukV-7^8=85qLRC+AD1D8b@%8}PHFb@3ATX|y*LVZe z@ru>-HEwtmiue(vkA)*R+%5B7@rS@)o*V8)oR zGT_Ouhx*UQcG2`bw_{_{Gwt^9Qo+zIc)vs&0rQ#Yh4 zxcYm@s6k}N9^JwIeA#rc&(%-IQAK{Ztxi;Cro?mRnNWHrEkQM&h75&0XEcxckyl`Y z17X-6s$2@c|IFI#uV!!-v>{Ze0dyWayXKMz!% z>5SFXZ*a}(WV(6Ss1iKPIZj?J39fm*ak^@5{dTsn^h2-pY1}T{H(poZNiyySJ)}Bi+5k!wK;kD;- zo)q#>H~SVZAAWv1!nbL5JrzT`-EH=x;W%7(MtaP!hna~&Qz{A@yCx&HSK8NJQ%E#9 zo+I_`Mxl$H@-X_aFCZV(Qwdu0xS8o;$}5nm#_Bm)-_`XFk2~fr8Iy1b5`HfJzrOFN zGsUo1PhI@_=@faAtooL)w8W}!lQ`a6QGp+>t3u85__K1Dj6YNNSmVf?3Tk#&k0a9! z%pbgmz6u0KFJzjoi%t0tI(-FNvajYFNEqRxy!NIPfhm$dt0Tz|@Nd9+b-mU=@z zgtlOL#)}@M$j(+6iqDu2uXUxz&e@~X?2LOJ9A?1!&OEt`1S8Y2AgwSmzZyoegP@fy z>I{ z*t*crFpu^rSfW0~OY=c#@X)&TZtMK_T3^Pmr}hAATklf+BXyGC z?S(Dz8LZtc)tKxSj$etGQz=v4-nim9<#I}c;RFX_cjUbsTS0vh)D?<~K=an;qIs!j zglS)#xdbe8`(ht{_G^(qULQ1mbJ~t7EL&Eq#;!*dxR!Ia*HBL&6p^QDdz4ICt3}G~ z`X1=a7eQqsO0Ee1X3ljMzq>8iJ4AikXI%{xKttXCx-y4%2G>q>cbJbL%-#sDPo zu?3F-3ZiXn{^4LrSq{x304xuLmb-jgC=H+Et^p(TJ^&@>L0I@eGi+7g|48IEd3_hG zEZfvGnpox)KU{FaIG!Q#<`FX`Kt(tL?7U35DCTvwLZqT7AlkeVWR;lN-Qz{69epD^UX= zZ<<9+J|)6r5??{rTZgnCID9$?0?(o0e}*O;g;Zu4XH3&mDQGgw_(r`_4IpvrmE=K=)FgE($nYM&3l2QTHn0|~*aqghCKqgX`%2>Pkf=aRgD9(^(s zxQB(%T%;m7F6(w53h#T&yw9UR*|}mH@-U;9>{D^{0EU%R-fEDAywXQHBzkaW@Ko#~ zSh}H!Q82DZPfEP18x6}-zC)t|J!x6hxPV(l)iBD0Q8ljVp4g=kI#k^8=N z6%({aT;dJu7eahH?)XE>i!zgn`&+~WZEpZTZtABWL8&V``M9V*IEMvgw}cTQ`Ys#w zqcQlT9CI13Gna|tft455d6JaQGX}m?GSyDyoSI?}=iKLGXt27S-E-}}P~XhUb`_-l zj%wNlRD{y|LLo8lDv9YOXA)pjlid6r3Pdj53znOoqJXDX7m6?E$nZKC#i|bAoc8ca^2^# z^#a;HqXAn(ptrkb;&5{M5LA|lgEh5m0#CTlf+~`6$X+8EKi?ZLJxIjsD#_Rx88!_L zrIhBp=)s3=hEh7H>_)c(X*Q7lG0J$q&d9xLKGlp`L;L5BG)mvbvjN_Do{W^2SqUk7 z8y}VHOz2T+)%D*iR0weOpa*s(R=Ll9tyFH-JjPJpC&1w*U&>cNZ>iG($ymL}$@NOGCX{^*pOt+q7_idO4w@B#atbGfVN8UD;_MkZyN@rLoohm4WJ5v_tvao%^t^>DCu-*voqQHA&HYbdu;rAERUt2fm0O$vMxOlt4q?)#j4*y-_M+U0== zH07zCyH}lh>-FM53pQqDVGmrjT~_quV+I-P_EP)G7&QE!Kzb935l*neP=KJ*xNZe* zCju57et0Z928EkOWfNQn`dA1+* zKq?wnz8O*|12oaNaKw%h5BhL14;?^JTRaS5+m&4D^K}HqmHVDF6ZS%kB%A*|7?jmJXt6f)gXrzBfDsp14mJ`{a@U(0{mjImCk+u!XYUbMy zhWr6X`OvR@5FM5cqP72os$y%KX`2y794!l&PwS-@BYHbj!S#>sSx8p;_%wv?hQCR#YK<3;IYN> zDG`^0!CF&L5;lqFp#I+=g04~y#-;k|Xo#lt$8OA27|5^fRR;3D^bII%6uB;PU5-$x zkG5`s))b5QO+B2sl0E3EZ-O5C!?&u>!ELPCo#fmhLn!N16!UId7hiL6fPDu1$z35TyjBsdD_vGT5?b(C( zDdTtx>iz%lC_HqCs_;0?$2BX$u<7H5xb%Ako5CphjoR1%F;u@KY}%Q>6#aRaJf;cF z27yC|;CxrUjf!y1yY+0pLTf;ZB_UNq?5KS~N(+YARQ*_35GV!J)DWAAj2dFsAtOWV zx?h_iw(;6HEZ4UD4U~;)$J(Y*li%?Ryo1unxJjG%6r2RV9t?eXwA4uW!h8-iZ{9z` zt`v5ziQ#oE?p8zT7#!_~?%?%8e(_M69bVH=+WWsvcldIjI{LN&4FTy*bceBc0DQAM zQVTRB*1)L?(jPgNdT1eTzE67YI0X$aB~1(my04-@4!9~jBEhj6f(^}_-@=*m+<6^W zjJkn_gUP<3H<4iwcm2Ib#e2)xry?Z_mMy z53&lqafJ5FHfk9^S6lUIn)bf@iY)+jhm-6^UbaHdh_JKCZ2@p%@&!yRa&ML_lLILMdjAU{U$Yw}_Pk$E8Sd}}3A z*3Zh2!kMd(ScX03Sf*QmPfqqhTCwpm4Jn^_xKe{eop~6wO4sCdv{f1y&efX8E?uhw z1kU~R_#1dXVCfm8G6=7gFVkl_jRT!6S6^G@>!kVB_} z*(NDX+-%qYpxuH4QP5eg)Cc!AkIS!02e`NBr_bl7M_bNf%2c(L*1d;Tp~H}MG0tuB z3w+4;Hj#MGA&#O1>a5Xr~nrG_8>T6^uJl8x8-+MgbQDcu+-N}Ap9o2nX zkIP6ogk_NtY3!nS=c4~)oEsPE-FHN!6&t)B06|;cjY!LU*GRNo0wD~-@bc(&lIJu} zpiqv66^Yh=t;-gcd7kx*VJK=3Jg-K|c-|L?XFA_sI#7uba*YRofNI#6paxD6a=!(Y zh1>xn9sEM>poRhqxinN0yS%Aq3As{T&DiCYkPF`_hdI3bSd7?bT}5$bCgA(4fqLJ& z5im9ouAfj_l1sDMr>T^!R)+;onE*~?O!d9UiJ;3~vPR7a#IU0Q({6UGWUK8+vqp_#+HIDsDsWyf_uN zVE`yK$8ESJNJ_kIUK~QR+WvStjQeYj-f%}_we`otH zB9jpSu7uAPV|?-4D5XRxgB>Ub1ldvW2{lQBM5HoM8vKim?hL+a8{HpF!Q@0F;iu|3 z@nTioT~{nCsVJ{*Ss4h=L_XTlKJYq~poTKke^#PZ13AgD;1lzLgXw5G>s>uNMA*U` zjw!b*6AL@{j8J(N+_jSIt!jOm-aceRQ+Ux0DUrzxv`ZhL#we@h)hh zGY(U~5${KI=Yc>pusXa%I}Hs4K|CWylms33=pBR!4r-1n(Z@Z03Ia#cN-fc9WP{H{ z(&gD4_8{|f7_nNWrQg@dUJvZWiNPKuyEepjvh&Ed z^CFhoBay+`D2#>^8RQ#@R&tKhuV+KQm_zU2DXo;?8;^FL!7gE$U*K@psLL0_b<>6T z&R?XXGh(1)UqtOVFk?aqHJTY?YfRB&&`|XIp)x8>q@K8LN8@lUXAe!HG*IGb4Jguh z8C03gmh_TsREVO^QJMbs_hm{0A}+!d4~%a|#-mHo?}hWoebofC=} zn*+eH#*XRwk-Yn66k4Ha)b(<4d*d~~igH>D;$zT6Zy@ahSv*5?a`-62$(h2*$XWVP zYA^p96en1$bj4fj#)3P=8n)u|Q=YY3J=GFq?mTRG(TWElV!MNN$PL9K754DZs6yw@P zE%JZ3Z&4sNp9D|417?WVPa}}ZYR=MN4Dx8YtS03B^h=0s#lz)6$QuNDOK>U&sZyv` z87W{XRIBwHi4cHK8JPP0I(a`#fJz}lo3@-eHkg%G-`;$tM#y0&|2WM`gbf1lytH~U zzBwvazYHc&zT6V3#3{3Gnu)r+pt?>&tu;EEblUYAY8!MrD5$-H;sB^^^mClnq3Bt~ zrcFU?>M%jr)Eg;AX$QCW*Pxj7!01yQAK`M_=;+R(Ing}Fe(n>&k@i?fb9wr zU{8{C$Zkkwkl6DB@bfCQLZeHk#Ih%l)QBo_Vi3)>59qb+7tdx+h=Bk$1A=Rxet$I} zgklEbhfW*xj1mBb9d9Y@E3A=$NBf0GF$WC)*b0e`dO*wi)u<=39xDpjEb9w%=oE;& zqw7#0gW4<5lm; zO}-Xc)CZ}^qSL`V!tO~FvC*VFkW=-@GlNygH>eHLUn(h%1p~z&(JYpLu9kVuRg*>M z^$UnBI{!nM=eXc!9>OAEa8EeA4^jSk;QQiK&CH^x*}A`741iLzs0u$Hd=**>g)`I6 zoT86$OI*m&Q<`U#hijhaR%)zWGWTk%UD8-CZ739- z;z|(u9CHo&u4(S}1clM}52Vr=Z~PDjM&I-^5Pjrk5c)ovf^L~GW|~&n#_z0ogmm80 zUoR?K;e0{gZOy|7=HalVh}I0IdF-DqrRRaWC&4{9{XllLqm{T8X$G$!mS&On^jj&> zejddEqCI(kfI^-FEke06r0l0&6o&xLMeAdrnyp2Fbkk4i=t`_PQlkYTwOS(;Mh&90 z;(uW)twF*472R71<?qUgoqB=R|> z9%Dz#4{$A;4TkR5X9^6Hr-+~BJd~@wr>obpxpH^_|DuYJo6!65TADHztEd^ap zw;83`7r#{4cRx~LU)q1lzK+be(f^up_c_guK*cUf1CxG%UNc5m<5kCueV)!ch-4m- zl1{Z(2!Fm5{=|;8ST6&?Sj{Dxh>9{2q|?z&JQ84!xMC9BK@oRwY=>Z0P$#g3#amCL z!=WRTB4wSS@hY$b*H0q-emX-{3^_ARi^CuNG_?VY8hkg5$oiHbzM$(OmMPGzVMN>U z7?v(s!lwpNS1yHE7&;FJNI-!DD@@iHdI#5np|1>vrpQkThO$s@VTc_LY`F$G(}IvQ z6Ldk&*BUu>)(LXzAr<6cuJErq-oN!4s!w;;<8`YXk1ei{v-ImH%(gfcyk{7$VAOpB z>^R@aWSWHHy4DHV({w+bqc9RjeJ(}VA|iQ2#bQ1-r44bCs|Qb4F5|Wpz{LEGVkMiu zUzVXL`3g*_(T5jHbbOvt?Okjq7rJEw`YmwR0u7Z7Uu9lArP&}zOXQfASP<9}r6{*r z;xXq!{h7Rauuy}w-)5uGEedLzQ=m)REYWTA%oaT=FWp~tA#<7aVBWB?>_2QWC$-sz zb=(-UFd z9l|-B3ehA)dkn6%UP(Hu-q%A#_^AYY?iX|(8NC5CSHDN}I=RUw=fkcO!4wDS77N_$ zv9^1L_%^Mhe%oQy26)z^m)GM(bPkFE4-b&p>vV&3Zs$hpJ$OC-seGf`ZPHS27Y;@T zkyqn4D+o2DYA+#` zUXPiI>h)tm`G@`XNQx=MZ}3vp6UeYxmHHxcSNm5lOHfwTWeKpVZbe>MRp0I&2V;J2 z5o=?Jg+e9BbqGaV3qExc40xg_?oD4Z#^4rq-a!)rQ=Tsuq>4L1!*VuAWx=GPJ6q^w zyq_6xqI_ct*t>HCXbBwNWEL{j!i{pdNQA_tUKBX>xt}|3%3*B`I}xeUMcD~u@4!WSpreZp6{wGo68{6PKrPeg;Pa3 zJ&h`ARr&OOZ94w>epXk{ji=tosG>9bsj{CJI_4h^$ZYW&k??L>4FanrXSEb}p3`p> z;&Y?RJ$cY{x%0ZqA?jN)h}`8a=teHZwKVcY-N^0G$Z~?$CEdJTN~L*UKq`%Q+245o z*30BKRR0JNt{P_6DYt2uD^Q(x0gDYSF4oj8AK}*K-f9OVfRER7!%_jNxT>6$a6Pc; z&=lk-=Q?oW<98Ps-uH&I(5q@9`d+Xme zEjjThx8$m?Cd1v z9ga1K;-5PNiYSpORLKoJuGuK#Nq!NC~L1~EuS9H9(df; zPty$)@M)x@PKb6{jFfwE1yW_5bDsQni~8}OACT!0CK{#TzSWyOK5Vpiy-sURv2dGP z67JhJ)a`R9+66^RUuE|V+Gf0J8lC2Pt54c}d7wq8dfgQ*V;6?EJP+2N_<8@Iv+IDb zs!IB~FCp!vypX*2fOI;F6vYBIu5Dcv0n55;1GtCgvvOlSkvnCs1nsplYP})hU zhmS{cYT+91(F@7hU2y4LWnrT^jf((7ot8eO@d zh;mNbC>`3Q=eeZ7B7#R-@(k+@!6G#!bCu=4L^a|Ko}u-G;%C7jad47=7{8r=!W$BN z^VKNdCLB6H86Dyh`rdRn4M=@&Dqq3(cPQ@j`u^&KLbKIV%Ycon&#pC-26>%l@^_JW z+-cmk%9EaPd4M#HW;dOp zA$q))1J)#(opTNh)G*^5%aC#3Pzo-@bhZGj+Q^9`u5ZBlgw@D}yL=WboXTjC;##^6 z3TdIiLV%ksYKg3%TphN*z|V$1Nza@Rqhs_^Re4^MELHNa+lQ`tfAqwy-M(Spp985@Fp z!jB}+tWv$R`Df;;<&(mE!jB|Hk)%joZ9U3n9$94b2|ofIrCkQ!CY16kFe!nxStN46 z+#2eEroS<9t#vzl0F>{v`WL4{39h=K*!`xNH*NzTONv8DMXEihssN4y&_{b6IF2gu zwx;T|pfD^Hkywu$zo5lkBG`_lqYSYd%~uGqGl5J|>Q1ovMS)az)=AM7UN)XnspL6n z)h?dDrh=GPtuI}{_L~qz8=y?y=*C8WuemNb5pEts)w`X>%`qE&x^*KuPPoiHvd3w3 zjM=2W7d^g7F-=^F0t!)w#wk&)Kl7@dF*jQ?=8k!^9bh&|lq!ztQQ?Fk@AhkYuH1sb z)7oj6l(vF>^)>*}I+WL@LS9Z4LnJ-SpJi;+ERKA2Z4ybnu!Zurkz2_o=5jaI)&#^wVFC3?M~rtUZdyN zpVZg0p!-P?{p~8|S2_VwcHO*yQnKPX&7}`VImH6{8I%%r0na-Mp5_(U-MC;mxANUM zFK=FgWdTF`5}!CZkmKn%_et7&aYzr|4$`e#vK`GZ;Lt$xQu_<@8jsecbkV_VRxWKz;%Lj2rJ?>DP@Gd8=7o0qCDeJ~Sqzywe z4CGA4<2Z#F_vk%o;l`gPE_H$bD_r<`; zI9;8)8#;}MaA}t1h$!10W3x*-2`Rl6?A4c%AR0_96#1dOw_D3(PFJ!StrR_ zT|gjM>rGrRYt2E)taTkFv({u^)|#R}2dp(ku~zg{1!Q?KRZ!naGvT$xl42oB$zosm zu~>MDWHC2NiJz`mtQ#PL#r*AOjS+NPzy>n}-D0Bu)p@N89ZLl#!|m@n$_AF(sZY4= z3y84giRB+Cd19$Tse@~I7$8%6I^^{K9$XtwBXDC%?7o>z%mq7e;+G1pT@EM**Tyz> zs^D5NTIn79jwJ$5B04u}H6)rJBz2s#&JUb0Cn?RAAB zX}nT%9}IN6puVz}YRLu+n3eijoA_CEX|jci$)rK=ohB|!vC%ET4#KDP@(wHXf0ZAh z36ewyTmHTt=hOx!L?wV(TQYMAR8YLQRv&K<3P>8H=-|hBO9lBuNk^Zaes5=HTGIW0# z3m?PWvC@|-6sCc3W9dN4aCq&mSC!-GVGC~T0nTZ6BV=7DJDF_I4f`2DcA?X3L=D(+ z(FPs&Yd~4Y-9&To9vqMkg|;JD@h+6o%w8(mO3yD>0O$F|ev=;jFm!WUQmso;woc}UKnMyaT@=Qn=m`XTwR6@1Zjya*OhGBmN}`G=R3Y*tLCI_R$mz6{LDaC z_-*=G6Zl#2lYj6@04h}B?KG(aSGWxL6ez-HP&T#{VdO5=cAOnn!#++gwsRT-pppKt zTiJ2aZbI;eeWxU0R~c&C9&P?dEjnM}=BD!K;vY4GoSaR^0A^!O;muMd*&}BNhnYJt zOe7=cj4u-ghEe9N;YJ#LJSYOkepDre8`04fx}6}}EBq#wrMIAAM1a{|J+V*~VA5z< zDLKvtlVJqfi4DS4f;rsucl_p%vWX~pemNlL7ZR~VwE0%BJM`RxYI33L3;@|7IkDVu z*r!Ig4oup2M4>tIqBm?pW;2*fk7_zgq#YAv;`|1%#j)Kq0{aGOvB#~4Q&aQ!Znd}2 z?smzp_oC$0`->>W>OHGmhiIfDEs9ox79$5AWWiz=Z}H$-C_(KSyNn*mr}XoowAMb_ z!R!bTU&ql7r!_MU2Z8_54rerKB~Z1GcBt0q(*hlMv_p+Xr*z`G1CMt2NuwVZ=tFt_ zM?0L==+78k>u85_YJ|)IHi-?N=fU;D@LAPR8a{V6tjq9uLA4PZKJUKMDGZ+%^?kNkk{26w9o&xDdw(|3d8=VX)A=(h%%UXN84= z*{|r{0kdCG%>EwEc!;Frdw8MHg?gZr9`e^Lrq2gVGW~VM^w86P0FWhO2APks_AjF; zZ@m|+FTC$Esr>^iJ}yIle~3x|e;U+ZP|?$@g?H@i6z=hT_bB)HG5~lG^b?Qsi~Q)n zM;XT1&&`w!+8L#p2F4$_$8VjDK;A)$oTvOrAQODtt(6kCo{;)l*yh#4i2?FB&ikD> z-_2i~O0R^$WZ)~DG!Yb0@d4)$V_XfP?r$+Z>!wib-|hfaqTT0QV!8rI(`diLi0LLg z@eXE};d@k&`{#hz>kzF}0)*UT96?3T@r$Yf=>?6h=YviaJ(R7gP-f#QYyjNVc<3CR zc{W8I25~Ll<&%B(H1aq;>7PmQy^F-7e<=OfChesZ9s+?npOhr?Quwqkn8a)EiT_@m zzHaXOT5@0FbgNT>%%NMoX~ftiCZ((5rf)Pi^#Y_$Zdw6^x^OtG<0&T& z9)pKIO36|S6iej*B3Wvos*zwRHXwDRYe2FLTI46v!Xud%Z->}|A6a2{lqm+D-Rmz- z5huP}OR$t@bw<1IlsG&C3W&oMJ}ViaGp-YZ&Ph!mt6CaG^cc#fQPs+LitHOlD6W45_Wp{k zL5I^TLBxB18zlQRqUx+jI5d9xyqpNLQFcffRG^cqrr>n+U*>p|tA>~-=FkBU-5)NJ zscza6MA^?o7|xrZ^1@y&(t?J(nI5Km4ocLkMGCXDFi5zeo7iEb*9&Y?Tb^wt(%cN8 zl^-WkyJvW4G0?l21Gfkcbmu-B0dZUQIkVxi7v*}kjOO;jDx^N2gq^)Y`+nk3gcZ~T z5{;+JazWCZvhbTj(o4%;}~iH90w93mKc#zO(g0m%;_ zL9Xcp>f95O4GdR+l6S^`+(X$v3&cO2@HS0-8Jq<44Jf5-gUTTWcaLAfVG;NgaF%UD zEPRE)yTmC5vlG=R24%RAQR!t#NGdDlPvcbxkT~A9K6)a~6x-IAFmNgvB(O8N(udjD z3h%f0rF`7$bsLepF;)7-5Ej>gm+m_uJQ?N4)!{x#5n+yteY0_hSumBlyauyIJi8i% zm~rOWrIK#HW(M1G>>Gka2$6%b3n}aGJX>(KP3YdDDXI=4cX-mKF*1V_Z!NDC*D|~? zxOLD>GH>RS=2GiN8j<$H78@gW^>w+X%s?qMsH1qfICPpy0h40qn0yh>WOI-ZDiWGg za99R+%)5WrFTvPSDNCx`j4h27=xqLHF6MZeD-VV`!jGcFw`Q zw$#l6g|Y#;fjvURMw*rp@KF`re%9)CBts5N_(#`pZ!;%vvhl)HnmDA&h1g%dpSrva z!(%{#?(;tKB`xZLe1oINg*-i7Aw|;b5H;j@2YfF&83*Zt=tCL{NDKtdrP=}~(*Co2 zs936=0bz$5_RN+!p4)-5N@i=plZIc*tzQoOnl+ocyo+HAZ9E&LI`TOy7A=bOVoLx@ z5mt^c*mic8NgwiGyfS7qeAC}kGUjS+8507@!Uvw4D3fEnnZLt1^Y`7YqhNa;_%0&H zY1LaXMzsC9ZhdGqb8w5~$czdd^?DUB$&v7W`5Z#aW~GVl)Y~b}j_6aNWX~4>NTvP@ zn$(Y#s$q~l4^gB4gHn$w^+L%hQ~Fn^V*#q(jlw=s3d9aCbO+!VZc7e{84(CEBcc>D z;^2xvC4NYS)cIM7uK}4*;vF5LgdL7{-4vm66mlFp=P2y_J|+txi@Mwzg+Y>w-^~L2 zjHTb`P}D}8*?S5k{{90~c86=q~RF zAWt+Nq)eN|_j>@i6~>FrD9;Nw!wCduKm=l3_&0_Pueow+b=O4kL7yX^`E%6t6A*{a zZEEJ?&26VgLb{XsUU*feg~bI^Hb|HO3Q&rkEysm$Bz^rB^eijQRh-3B8p4m_l7H}F z&6gO=TP~k>h(I^L@E;6@*d>_Ve^FcAovS<*Xt?b#`ZRWW34I!y2Xayk6UH#64 z_)I=h+Dz8$5d9geG|Rs6x)#XXqf=y0-w-NYgXR5rRp16T} zPR8QcJnVRO{rHQucJye1VUNFr?zubw{|0$HnBsfS1^BU&jK{#_=su|yi zu8ya?xA{b*yk!yi`yp_=D4OBR2GKKh!H{)HM*gD;QwcR=PP;GQey-+D8B& zM|(b%g9#eYen7s&IRCVdo>>r-D_Eiw5Y`zgEX+Ll_2I#0ADQki`3u>#h42lbA5}Y!PjcfveYr1|;o^uQzd3~}0hcFJX?;|74U}Shg_BxCCZ##@w}qNRrn|JN zyHFu}Gtzzn$fe&1B;^2duQ7u5pllko_V8Br<$w}Vd{`-`OH`||eWpu)shlo_GK95} zR!*Y^NaZvgWrvh``C2(m#b}mM=^b`0w#>`rwkD|rd-76?#5Ejv(D$-Qs7#agP zZ~|~C2UY_k_Rt+`O)Iw)FdQ>iS z#4+wiS^6D~@-B3~SFiRibOfhSMm7tbV%Q9EA+m1#peL0fm_nEVwxCRosk|(Y7YP9y z@4ifz0pw#~fAkeG@w=?IK*XTw@LTd34H>298^r5MaZ^n50Tl7Na=vLu38S&ZSMj=1 zxw!XeB%Fn&0L~dTDmCvp#>nMO21;Ju?30X^KpOyHwc;{LsrVjH;^{H40E?&RP)ZEa zZ2lIzh^;+;HhGykjnfL`VR3f@h}<|>8ARA~;u#&|OOp*5<7-%nF|u)|$k%X$KAs5e zna=Q|Q1_!4>bva!?h-OKHsCx|MQ)q%oC`Iap zE42jARn;j{VqLX3X-2H@PHU2nds8fy=~MiEqOKVZ@Fvk07KWIs zw$)eu*RjwX>YDX3sAwi69=z4ZpQ0Wh@~)0|PYf2Ov`mWxo)^=ZL@kUB^Q)QCsj$yp zB|L0d*;EY@v1ibiiZ-zlST%)P<#95mvKo>(Tc5Iuv~RPhJ%GG>-=E5H<*$Ye0YnH8 zlyb>25HFJYXYw>H4+e?)xos8e=pg`E9t_^A78_FlklxZm_R3}NM;}BP_fdzhuZzhiZov#>S@G*l$=6qZeD_B1Igb$u^E}RWFXRx~O_M{ReFku*Pj zGy@ui7>Z+MlTy|+1Ubgc+hr5mo*Z~Qa~FLFGVU=?9X*zcMqU#Lm!dzp+kKAbpli5SbbDff@8I2kL=N7s8;>_)+QvjWz%69Lbc>tjj}qL} zn_iuZZeo)rwgWa{*n4@Ze(X&77CzS-pFLA?SKDu$;I41JlibDTvB}>F?z-7N%j&o; zlnFAws2yN(H9AK=T(eZi=mPJfkbgf7%+#7TfxMw`J)f(X>>41F z$>#Yn*?iqTn#lkNV6p|)3)l^LfoyO(Ip2w+5pqU}_{PMjvb47v+i-|0_PKvoeBBL; zz)sPA@pWVZ)=_xX_{7sKRy;&NI(*D$(mt_7VZUdrU2C134Y(SR^qaWPa+%E>0d)RA<{anh>T)2rS}(?C(h+^|w`LlR{m zGA5j6FG1hgGQOu}xZovf-cq@zSF~5?FfxYDr014NK%)$Q}Joj(W{yt%I zC8~v27S`4NI6;+1aB`{DqJ~*3c#h&$`C6@|;b@Dj6!icul-v9txX_WOszbnTWr{4H z$y)hzr!o$eTQBDE9c-%Jq6*L_+K>tQGA{OVM{V=zsCsm@$Z5pdX8lMpt5LU5aXRgG zH8MC@t_A%Y2-Xk3-z(Bnz!xbXWUdpCJN8mGBIBAx|6tX_3EM&18Z2;xThvbQjBty> zHpR<;^5pR&?L)6Y6*$9t&>So$r|?~S{apY5ves#g5jLd?)wOb4H5GFN>*;M!vL4z6 zcv8B4r~u&q=|UlsLj=CCXR8n$_T2D@5;M z0BW?XDJX%g!EV|Ll+wa=R!u5DuBXnMI9_`pqVSqUpHtt#Sz691ruE61`|@TiCB-ar z9$fwiS7J6m6TspZ1vRorl*(mj8Orv6BLG&g{+W9@eBjDbZb61JdZDEYClknMq{JP1Hw}q&@R{h~cf%2z@+sia=%~Rc zWk-&X%@DdjQY`oWdtBSw^=rEW(=gP%S)CDVNXsL>YY+ZLIcvqPVTg~E6iK5hl|vNP z6oIj9)aFN4Ie23&bBEZtkA1xCEtx9bFW!w8 zIupptL*c}sZqi|hq0Qqas@DaZnAy-e6LrgjPI6SP#Zmh#>a8#9>BO+e` zRHlN>^XIE7ARZEv++bzI#FK?ifyfjrdcIeg=!Ap}KR^Dj^Px^RS?o1V4mOE2n zBR`63xi9+^ye#SQDpp;zkcSP&@dCbMn);5ujJ2i!RviftF$H{GDbHl09_M~-3fQNo zfa#U`JSKqnJf?481%?(*Jzimdf$;qpEs*>vC_CKs{W9sOcstevrOULFVmtg=xvYWm zJmZ7=c+HS+K{(x8?lJ`DOJB57l=2Mdt((&|W6n}?W!4I6e*kR2yI}dga-|dXIEXr< z+Yy0{4o--zu9W*Gyv1;;G6Y8uxQu&gi=rwJRL!I3`mzDV9@10Cx3b&3iPo8SaIlx? ze0kbQ-W5& zrLK`#kl~-{XQg;67Wl{?f-@U<(L!$>M|aqV{uFA~d@W)L5Ot4n7hp+|Jd4O)A@#~Y z5fxV}{|}u4yqUAE1VG3pD(<`s%1mARxNBsexM(T#A7{i``3a69%EAp^r=(zZN|Ff) zzO#A+mM^G1d^qbmKb~I&s0=t*ufDtLMY!|RIl!Ghjsk|CqX6<6`8W#T-22&d%PDZY z%uG-$`^`3W9c2TmG5yg7eD z-y@{5@Ge|fTZg|P7MGu8v1mo~DzS(xC)|{YyY#y;ZE{L~iw*)Z8sbn0$lY}dNaVRb zD&l@SQ2|R%$h~DKc{it`Qk*n(GyVI#Q=T!kx6;qxP-pC~qf*r-SQuC;E9u2xr|~L1 zcLC!XPpzt?xGC{Qn^yZIonwB4iA!HY2A*3hD!3C}!vnZ_5fIhy!%_Hil+QuK-i?yu zaT{HdTX=`TFILcRB6@JSLL9C1iSmuLA5--tyJmR-+3C7H{Av?%!)ZNAc{Cd$cpWaNhfZ{O66V|s9q)%Hp&B9vd19m zj?g^eG6~Pr7#DU}E&$2Sbc3r@%Kpyv_#77lOkuPs7_lVKv>tyXAFeR zW|V@b{>OC#&XLApyv}AY1?Bs9F{TneVo_U!#B9e0_i~bn>nJ(NL;*%4W~9cH6OWD% zMxwcJ)WwS0Nu>Zavh7+%$8piFR&;Qy1efsykNBW_JFdXfXtm)sA_5wzEo2lEQm1$-iJS0K5e-$luTxj_Bif>Jd6e~;aK zl43`}NuY6&?pX}QlIx|uscqy|Vv!oVB@Holoqdo1(_>}2loYEaMe-W!Q8shM5}DdY zP8gu0)J7QNuIZ)4-qbdFFLJGV#d{!$a#l^Q{R&7=79i>CtXI@ChvF61_Jb*_vQ9l| zw|EjqG6z<6y{c@n^`tNn$gDTOM4hNjA}TARmo-AVbZwAQp_2$R4hI(q(*X_;mOhnQ zPHeQEj`stJW!~4)`wpkKCFVhnv~!ZSMAFhQVC^;?&z!i~dN}XF@xwQ&8#XH;HV8sYq@#im ztHI4;O}j-3F`X9WbTU3eZ0%yh0G|ZIR8*J|;oMd&W1H*oLR(zJH=Q0G6NhyC?H-PY z>ukagBYsT)F| z|IYweE_HVR(Hbfx-IeB2e&{$(2o-EgIe-Y`CQ2#6knaq#${qSG@^(U@{~x1C>olO{ zH|ANet{{5E0Et=fDk!3ybw$rtNQ$JrRu9!-KnkJ^ zhnRze^=%bilxnMcoktXRW&jf5^pCt}PG#;ayffUmG3Kb3FU_Nn=rGkZq8i-B{B}&~dh|jI z^j`!6?H=1CzE-M06NhItK2MHa59e?lE{$iESVTjMs9vqw~ z;vDc85!c7T`0--Q|EyS(HU1EK0&v$K4auL0o0~%4D?^!NLsa`|TnLGFMe>Z)_QUC9 z8<%k>y85b8%VPY4^Xaj+F5?m4uW42&1VFl?T(45Li>Qo!V%;J4kZVBTa{%4b2mx&o zB?(|X>|$c);%0m?c_Tzas8>5J$@=W`Sr2@P#UBDN{=|azz4k8S9aN+r&I4gnoxQ($ zCQH;{_%G2kcrpKkON&ad(S|f*<0|dYqD* zQf`HXIeI`P=FxTOSQ#+vaRKv-n5WMK%r8uy@&)Wro==?fb~0|Qyj+J2K_h$ zY&(jIda$s35deE#+l(`TklT!-_bHCu4iKM;*!gysifbOL8c&9vP6ynTHg`E&mTwPo zDogS#@tcFQ*pi&Hoc4n3c9|c-1M$ng4fY{EONP7e0B`c%`Ij{JubdIM0t?Y_>eNvx zn&bD0IMQ^Q0KnZ~feHK65;RA%6&olhrW1Hx45W#&mK?RGm!Pi#$riL+#eHm>h@cLC z569AW4RA7pBKdOP1N7jXSVQ0@98N5F@LT+53&mu`gV9sGJP0o&=4%xs-|H?HVnw>p zc$AVMrzwU!2?#UfFBS%={lThE8u4hjWXKUs6hrp7+lL{KCJBZ-n#2(oxE2hVaSs?W z;IvIvJg)-YEH)rCp4x*&J34$q;dvWshU8ot0c2!-zo>X%XQJ^T2OH6MKsPiNQYFf! zb?}dUw$&EMXx7;!%y9V#2^2fh4pR%cIer{;AK?E(@bWN_tKj7V)yE=uc_-lB;ANy0 z7HZ>M#cVdXm!{q4GD^|xXHed38(Kw8?#DWnnQnn#x~A0j0m*I)_x*ZUyazOV-t{8Q zfs6e(F!n*sfp8e&K4lIprtSdqb_F&Iz#%#-Lq4E#<+@CB-SF4g2J+xTE@KIJ=Q>KZ z-WDouquF3Wwuh~foJL#l8$Q;#*r?)3H5DaKvOU%B43vLlMcO0%JM~p8#QY~!x#GZ} z0v9;x(?@vn3vk(N#G-W93WSU|hrZFFtOtV2U&CR)wX>|stfr$|!rOqvY z{|`L#8ORmSAfQ3?ir|?IfO~mH2fUYPo|(Fz;<_lgR4Q1coo)U>N_re@gGM&Gx`g{f zxfD(^$ekz3t%^113@GG8xow}GD7VYcl@n!pH@}He*ifUt*9?W3@_QdyRgZXkD}f4d zlXSV;p}A)1bIdh2baxpm!5la&m}OP&6A)EkqFyN3BVxDWnPF&v=2QtNdqf;ZDa8|l z4S;D&cReY^)1xRQrcyRqxXt`y8>4~ZiS@EBPqSWj6*E;}pedSDuvQKzq7wS84orZw zU$fQ@5HM?1qpXv)4*IZG&%a34I;2>O(w;#ZiMaw!JU+bj6yPqlnY@jQd*qyTM6<+| z4B7xNcYi+Ssat}xzF1GmV2EDy)ZbjvYx9Jf!qU+DonlU^I&iqnNhw$2V}@-DwbCCA z-bUS?l^WJ5EmKZw77(*q8PIZ8!?~P-dxcCf-{P}{rQQ8eFaXPiYCnGI1?Wvkj*yEo z#Q+*AujY)`V$S>2?7S8*Z{hj;pbI|C!a*D>0cQzQfs!Rm>WlLCJt+T>gh~8Gzur7> zJj6V5q`oO~qeFK5A{ik0ibWA9gM?xaU8Y&Wlw`t7 zOyq*?708{Jsl_XbrTS9!+dMQk1Hh+ZTt}H4v-7ZwHRA(t$_~>FugaCzdno1B;(+~1 z>d*?nq*Y;{th=0+ye!04zd`$zZJr=!ob*>rMN-ZT-mf%ro}In~<`FFe7D6{;*W(LGQf*2~lUdwNd+JG;!n6vg4qI z!d+Ae8_PI{t{klhX*WMBVer8~b{ex^X+J!X#YK#j&jUNPee+k?$)jG$?34#0-i#b4 z*-1=jk@Ut}x;MV`<0L=P(}sQonM3l%c+DHL`UwHln?43Z{1feY3gs=q#RIe$8ubp~ zY}3u%uYJ5&4#9m&4s0R=ypR|(aGRHTGPVik=|p9UD35xBsCo1x^(oRI?|4tkp~-bK z5uy}8!sgp4nw91N&;}xCFUk}Hn6LNClbCsSdM$do?jA_T=`I(leME$_JH~_2 zsq6c=Cm@_%ZvD*Fe3c85C>MvKcXl6!rl;gWD5r*!zw8Ku$X~ zC~uD&S1CNf8sh-LAk=MOC3XA|ol~FV)(x|sxoxowCt9f9VPB-an*9}qgS4?@>W{(F z3>3u2EO~yURRFV9fAN0dvCx1TeB?471YijOD{+E?mx2KHfKr+?0_}$!^x!S~a`n}`cyITyG!|u`WMfe@ zx`2DQD@yL+cTtL2=6~#)hRLga+P3z23Ee+M|Hb>p3F)-+EZ}v5&9!bcF?#Pd+bX^i z`2=7Sgk5hmt-=%JsRcHq3s|&7Hv3vJK5&HUe^77x%;jO`)eW5BvzXcfl4Q%-PhD^! zHp$jQH2fS3Gm``Dk36myU?HF(pUE*$3_;6>vEo=h?7W-}R>$($%uR5l1r2Y6Z2%3Q z@Tqkyoqzlc)mkma&TMADO&LLG>H z!1+{n-eR|MCKUvyaX@Q9Fc!C~a4iG+@E@f zgvU_I7hu2W8KV)kgIuX0<~OGrQPD_nse8M17n^ErFu=?kC~^+*9WK%3Wyn+@H#ti9 z3Q=K`fRv{J@CHXoja+Hs$X;d{It=U`jtm^((FCa|?h>jq8J4@u$}%;JM-msGa+1?x(P&*cKn8 zOCVsqw4xuDC6Jb8e^e)CNUnCdLvrj~dJVuwfGl9-uP_Xq29mwDe?iF!f71r|4d3qg z$?8I-W{(K~+$I>K%3_SJS;MWP*WCD+UTLJIuMQk0z3_vp&Xp=V9;+ zVbe%8Re_(HQv2b0C0-+*jOd@{*jR}9@e0o(w+C@b-)&du1Ca3?@{^wb%j(C#p=2At zodG`kUqsb8RZl6ZUczi4Mb&xvPF7l_sA9QyLG#~r&`JKg=*NFK;IxzALn(kRE75dM zwiHcWP)f`d*;Ya{85Q*<=b1M-6z7?3pgV|3fAb@DoDeW#Z+#rZbJc3nI{1$|kHW+v z4#Dwfx@)Svo$Ss%3zN8YGD(P;Q%O^CTT79FFAUq0o6960T~{|fDgqD1Y$WC&F&hcb zZNa@lTw#YQ#9Ry?Zk<*wX?^S)uHUe7V*{g%g3tXpZPdlk#|ikXuc8XT2OTUR?85Q|tB7MvAB4bi-(S ze_bO?{N`BfgSLQ6(E;V!64J=d@m3+7QB|dGi1{px=d(%QvAR)(dssZ3LMhn;fd*Uw zFMA}=gT>KC^O(WvRqV?<7}dvY){wF=XUWV4Lnw2Gcp@NtSWfqG5Jye%sl#=3tn3ye z)RQ6|9GW;nywDvwS^A0lYb7Eq-(OSwmlf~|&c;7Ed1X;=(Qf(UwS+=vLI-3#XFST5 zZ+TR7_I7I?5;KzMY%wE=ElME^iW|O}Zd1`}BUODxS~tvWA?CC~a1*tiz#9$=aE{Vf z`8FwI=p}{;uZ__M$b8jdG_22);RdB{@J9ZUvqC+***?bGqEwChcoVyOj?ZKgs2q*} zQtlgilaG-5hDAUN)o?E^cvOEWyD6T!6>`^fp9rNxq)Hf1HRy0B4Fx1pB|wsV zR{#jdA^wO`j%au#p=I5nyTZl(cIB-Ona1dzTxj&Nf1b9hLH%|~G-j%a1XD?XC$#LP zTv_czvRc&t{9D#AV)3@b`$bQjOT+*ay;IFsqVG=fl^Cc;6IK7@Sx;k?ormR?P24~4 z;7LuQci z(0&qpe;mb-_wp_w@24t~VTbEud*x%0@L9Rj4oC$*X4K_iWtTF{tjn|>cs6K$rSMu| z2<+o-ljVqf0i|^RnJyU#cC=C=K)GkX(LH+^fR3V1XQ)2yGDY|4Oi@9|lBK9U4FR0h z$nhv;&(2modt65QOnNm&Zroi5g-Y&FwJln8ZR#}MtE)?I%vYT{$La>zsXo%0%5ZmL zl;}!7?SSli4CHR@^iQ4FXnAW6aVuWX=qadm*D`a%RsVuo)* zA5VuohqgByW#gEyd{SKH4njf&wKhDUOhi1dhfsrWq?f>w1HZWhq4A)TLIB5?iBY@? z5NVKFCccG*Hxd*d1DL%B+CVNp4)1~gpj^-t8z5RBtN8)GkE>MI*@Q%1C7(iNC3d6H z%|*If(<0MsoURA}Ul(oMzFLt;fxcQcC}q8i6ED~ZKzpJkW8M8(3>ZtLWXy;WYm^L5 zkClaMu||2}b6%r-JR6@_C$Fth{XB;$>QF@2Dqj3fR~i$5Favle1G53scty@iG^+o5S4OzuIPw*l(S1u~B{SChLPof%!8h zDOCiwZ&DN`7R9VXHk0y{asrAH@qz}l`Fmb2U&Cu6<4TW(nEgxOqbOD2%?H%tX!$8> zU!YdoTQs}hJy)wQW#Umz-;lM788o6#4320kR~29dqTHYN%kTj9klFg%ydS+yJwoZU z-)f}=?p=`LT4@28W#so#M!M)a05aR#4xywxPh;m{EyWrwN+}C*SS~+7@;u!$U+J|d zC4RTSyF&-dL^#8MXu_-R;UCzoQ=zkv3k`gn#pfpFab7g`amfGBjwvy2A*Mu;6vrFT zhAEM{0KpitS?eZk(VQ=5_kV@nbl?m_af^; ztgC9CsFqcx9>9jj?yGUY{CKA!);I@h=tDqTIW~Y(GPhczzD9NYIv_b6*-x@h8pTwe z3+B6nIQPyE=cvg_*}7-{OP`&yzEJkrIn`$+xL@|!d7nOGEw&T2h3d*|azXbT>$0-v zF6y3pV<(hWDq%|W-w!Bd|NZRKe~qZsDmkd{Kq>LRs3u8Us%EN>fZ}0YI1v|01u8$S zRiG6`S_KO1!Yir^uUa2iy9?i4%|@p^%Gewsjm;&MlnZ!E(OY3A+}qR$#-Vg#Za)cZ zWE|Tu#*Oz%?CT1fw1%;42>A(EZ3xMrNk1^#J_c-B-0{p{b91p1c}s=Xnt4!UoC<*v z{tS%)1t(zay%uh3&{t-oY#cjgkk|b-YY?(;j)^gviuESNV$~Q~4{l=zgQ(qGVeme` z6_5w9>g<2;_pUmd3eU#@l)jfMS&94gZrWVD-tDz*C#{oCMuT8T;kkHDp&g3$TY$EQ zIx`WaJeFuE@r_z`zp!3*^V=w8H{;m5?L1g##ETV7<~gN~l!L-jM+y?8$uxmYrnnZu zyQY}^fodte^zMebO%hoLRpQ-cAc%?&&^$2Kvt?EOyY>;c5w%x(afo?YSevIpJqo zjW@T7J5m#BuJIaON9zxBYytz+-#rT9>m^QWh8UyKof#ef;~AUz!;Z2bYc(}i;gda9 z-728R2pX|2L(_QRl8X`VOtMILmhvMRryi5^rA4z~J2Ly{c$K9uHOY93qQabYcJw{fW{yD_trN8C0-zXi9BLwQJWT!PY4;Q!~B8kuvFppQCZo*JM?9 z-tn1(TiABs*y3Y52-vxx$AOf~hN*JoMNN~BkhX&ipnbNL=He&&_kE>?UR6~rrv58{ z-YOQGU(+NEzvpRWnRMy7_-e~{HxA=!F=7&vp^zO1O7&zIkFd}=lO4FQP|8l%4UV5 ziQZ9EU@?cDNLTEK*_v*GC`oNlYxD?fGDgpL_wyLh# z)lhUzgBWEEyBilu6|AX*8X|TtUWjEo#XqXRg>~+wZqs$nWs*8JFSaX!)bFhht7WM` zhv6U;?y!f1wSu)0G4u1nNx|l! z{Vv5DJp^p>^k8$=&l;8`U?&#@n-@2y$XS$D3D{9QFKd*3ZMA@125kRV8kTl|-+OR7 z&MwGLP$u|p0#*XLKC6^Lmofw_2UXsASkvKyaPPvE!RF5vtV+NR9k-b)&+Ga*4l)0VygZ`%Iq|5~z>Co$tJfx4a{Z`O2} z7tWjt&Og&-&rjKu6a1V|<`5YjoO4M)Me$UFzd)snOj8+HXAI z?kgIdA<%w91L&(7T_DhYqXg({8eJvOegg*R>l*Di#Z}|6)A##OO9jt3q?RU~1)7J^ zs-s?XrbhP?XdY41W~h;ZhxgIwJb_+;yJzab1@sphT_(`O&@AP}YD*00z6zatnrk)_ zBW~zV!B)-s>6_aL^mq)uwdG#5r@uz`V07F-7@js#JT?oY>1qJ&yTpsXEMPkbQW@?Y!k7=KO8eFdd{{(hbbSvb}STe0zUKdQsW_5KItV?c~NB>hD4F&1(D9iTVh{OD1KYAH6O z52^Jc4mN53lbS8ZXgW)g8LP;oB7?{!ZuamHv(9~6JB~N`RZqWrG2F1YsNc;Isl68;^G6I3mf{gwA*xScItMg_~HgSa372Jcm0x8{t_=cRx(%?NyclB)RnLkemHnYF*ZUWBMB>5J} zwe`W~c~870iSjkc9E)T*#LeV9uYF;TCMmE;z6MVn>+5|{fhL)2k$eN5@_o@cNBA|+JZyENj@P2=WF$&DIgI}l#32|%Hv~Pp29a;*CVpKu|S%0 zU8^8S?9Ahys^TJzh=%?rhIg;Tj*Rhv>mzx6!WQo-coG zSPchWcwx@Pg*-ZNZirhg7K(B8cAd+F@4yGVYNMAhbnJC36V_=)S#L2)tz`nu#?5MT z;Gi|`#0V6N1Tg}!p?MT!I`gSo5P%7aC5NcJd1fvQvQD8ORhhJHrdSDpbc3o4eFk)G z-Dsmm=L@vo`T%!t(&)Vc9jF_XXmm^%KRi%3+N{y{2=wMkxvJ3TFqUfcy8<1kI&IPD zT!AjAlIstBcbP_)3Ur`mRj$$31ln&^f)CrO(QU%H=6(wlptouCivsPpRsnjuMh_Qg zzhw*1-vd3G!{ZBqj;Qaqf&qGmzWcPe+ix)g^bZ=H62VpTTh{=+Q==aj=mlt0UiRo_ z`B9@k6KKB`5boZk(fN#y^IHr7y<3T%DqwFGiWx79AgCxg(#^RceV0M>IABep$D?C- zX(Vbup8=L=8=6TIaB&cmTn2>EokIIUR%;=Kx?znIQF|$L8ic$Q+CMSd4b`Y~l-qa| zKM(NF1nqevETmq!LmNRQZAu4~;Gt@Or0#|E)%-%~SofUKSoaMj}XEeXO4RmesQLWKA0v))ts?q2YfesWOKWX$8fesWOXEnNY zeSUYK_&BH0&kJ;*_&5(8dm9hJVL(UJ4-_94^xezF-GSocqDG$-=)i^9C5=vs=c)xR z%zoDB#{@cXVRl)gKNaY}h1o9}Jxibi7iL#9dXGQ{uFS4#bW{RYEpTOaO{4D;=p2X- zUbt!Tab2U|W^}EETLu-S^59|l(6UkHVZCX^-U_^ggQQ?31?T)QnJc(ckR6PymvhiD z#A+_u>BhNudNmg=@99HDoiM8>eqlY7h0XXiUYpAok|L?EMZuznDRk}o9=4RDRbS9T zyhbQT{SVhtj#j%MRD@I-AnJ--7=T1LeAk1B@Ts5(s5iVG9C%nHhG{@O0bpzQpu_T* ziMl0|Tn`S0g99r=WN)Bl(h&JNDU&(?%331q6>XTdF$+#2rBxpohoUeR`$;0Vxb%N8^;?-*P z5a<^<24tPE#4SVF17-WhbuJQ0TQiTn1Eid+XQ+V@HB&OHT0R3Wme0#^!5ctE6Svp^ z>W*?QxP4A-ZZGiT_5#&RFWuqBLBCb&Lyhp8=W1~QgJm%LLIM!r3;C@g2@z|JZ`DI4 zHgy}l+(UB%hQwv*dE2xZI*;8>{)`LDBOxP7jEjsYjEgK>i*fNrbBv2ReXHlIe!30{ zwHfMXI>8Y@=w7!=WSgtvb%NjO;L#Qs#=;GS*VTH?UZ@^A0$6NiFW2^c>9@E@VG9Me z|1q06ZCOJwv&1e|*fRpF=Tt3Umndv%OMWuXnFsqcut&20k>>)sU#TPd)Ifj!*ci^aJ>JabTNE3Oq!wo7Jtt)PVp zd#}Lm!(QonvD+bQwMt>%6W9@$apuiUkV6}zu1H}?U?-x^2d*IwNqy03h20{s!%o=D z0|R-G$tSN-*y{otXaQZTc&yzG7|#x#J}(y~Y6HM`3i&=G?L1FzUMY}7fF#)p&d~~7 z?1v!FyHRV`IFtyiqKE0)i6TZSh@HKbPoyY}KR!ffqn^cH27qU=O}{#e@sMqdD3cnL zGRkDLe1nWKx#cD~b(QL=Yd8RM>e}Kvb+z{N7`NF?P20G|DS6#dik-c!wFcofzd^W7 zybQjZ^0eMhe7JUcOR# z9{h%?49|mFX0aVw$nZgWUJaVsw&!VN7dXee759>W`RU3uLcqLZ6?Sqe6fi%nn9c~8 zpDIkLH}gC6Sd}3YT?MQF`VsHh$*Jmd0rS&zX^w#Tskc-qV17C+#oog2@Ka>zUIFvd zUg-uixmQmjLS`#*B~3c~o{@1E`#%cp}w0 z=Rp3!TL>p`S4%ONcng7-v?;ghC9S1pQdhv_lGf5I>2rn&@6?l+IQfVvS_x2Cj8qnR z>i`0&g0=y87iKNTZE`N`jnaxS4Yp#&JpeZr?sR7)Lq=6g=8= z>;;jH@-h70i;`1JG{+n#b-455+g-%7UJD3?0T$+>8bzz62lRR%#3(w63q6X8q35BE zirE8tC+mFd0UZK~>J8em(tkrHUXqng{Mq7ox$K1Mr9-!91@3MZ8{kPtHGnFU*DUT8 zVQQYvS7K6|%2zOXwZ4-lHECV;E<|x$5zmCu{BxNcGSjZHk`x}wN9q8CAaBNY@GWSG37$+Rf^#w{o^6-6J5!fzCV zqK~5Z!lEef9n+xrLQ(X!DEvk^D3Cr-)T5t85oitTrzrYc6g>K^9eX^ZzoHmmQ3Tq= z1}KVw7DWl3VeRJQ83Pr?Ad4cvozy*JQO))SDXaekIEe0-LCB+UdiGS1It25h#% z?q;kIH6xEmQR58i6y$<@k)8wWH-OXWGs)FiE=xzD9@gm^Vblv?j>#Aeu=3~l2;hU`2EbPAwbAb-;D!#KrmR%euE z8uaQ3M*{Wg9MyhUiqa&IeHrqSnR~=DX-p57J=7$Lb@VBG>3&E`!?v(JW!E%Ao|3G$ z8%BBZd-VPj?R~&)d>&o=ODUG6cVW=a|D}}Pd=Lv#<7JOg8WA70XHL0770;oWz@!U5<+1QK~W0Js17m198c1p@vD8~^iVT| zdUxS#meNhQ?htAV0#O*HcZY~G zrcwH%Xh&KP)GNkMbmN~{E>EK;QMO6{3b)M)HzVa5#Au|#eZyPYvM?{0S^Dn7pzaz5 z>NFfUPj@{cp5d{l*ivJnANs$L&S{b6EPhr6WdoOPz4an~wNk%^7@tr+>e8_ue^;Dm z?n5)<={f*yjjyTgV_;n*mwg%KU-5ex%Kz93E2tB`o)Pb${LI)yCsB65@ASvr#@8q} zpzMaSQCEn0yun1-5x+k{*@f{6Ud?dv=2Xw5@Z@-U;7Ohl(?sp-rG+>|)24aad)|tt ze|Hm2OG{DewmpLD4u*}A(5z|t13jnzel3&+0Q6?)Y$UBTo63hrJ|Ww_2ro&EZzf-2 zUg9QN%4E&B3lr#VkUfP;7NJbVGxwqVLUwX1k2x|ep8kUeB%<5CM9JO854@qC=r*dx zbt84x1Jv~?-!7VlUz$FZPU2TYr0AefyuFPly?0W4Bzn2nXdJ=4%rAa`dOR(AOa3aw zuWrU{O8tv$`CODAHQ(eiZ}sICgv;J0J`aZ|;|yP$VA|VcD|CGZnu%@R7xY(Lw8VF2 zqD-}K+!BX%2{XYR%mfKk2ym#oSGtHc#{)Zx2Zp58OS5Bq>9J{4A>gR+JByrrfPPttXZ4CaVLI2T~R&`vRsspz@)X> zQ+`*Y1iFr&NOI)q-S7Q)y6;)H(LC(TnGiD=FL)2X8b{5~YN|fryCC_*0>Jr+K zDM=82O**rzJC%Gx7s)_Lso-yh9rr?k+o+8)H z4XD?Ppry_K0I%B0=6TZlIg>rt8`$cFmd)ebOw{uYu+|%|nuhFNn-T_Q3DD-$ubaXa zXRhVzfm8Te?7<`Emix*SkLYgNtXriZ5%eu>K`m|nNY^(6iyPL?qfHN_!(F|>n{Lbi zm8e^?XUen-?LFPPw@C4{Yj`n&>h)m$K1*pRml%(GdhhGfrwBn$-U;|ILJA{Z(iUP)-C7j%P@?^`XWtN8{MeWOq%YstYOj(0rfU1nm~*v(0h zxzBhqhm3WH1esUzJ(F(V;i5TjyN$nutU^G|$sNilXa(kmpoQProAGoQa|q7l*T z(RiZBG4h*o#%@M=AJN^6vTjxPvRqPfCRBBf&`X2>N(+rMg3=?+Xn9wIMro1hH0VF5 zwC(UPT7-+YvHKEfIw%trPr?@vf5ENv$!Bh((&sbkd+X4R`hSkk==Q1^Z`I}Zd`5!z z5#7xM>sISCax<{7v_U#H#KnDFzZY;Z2p!<|BSr@_;76r#2iP**#xoH2&!WT_E_`2< zwri1;-3Jaa=$aWQUqG*he*rCt5p8k7h=)-!;wzL7x)c{Z*f=aY(#tqx^u=>snyG+{ z08%qfdmtNxO$7fn0RMHvue7kOV5$WC`VhY!<$)8$qb&mLh&DpiQ$#CZ;7|o9p2Pb) z_QTGB@dSN@@&O?_s*xk|8uDs8o~DfeHV3lCLZ0&?@9*z6p65@RgbV(pr6~E4t^x9q zPotEN9AL8^`89xzJt=!{jIa&9K-=-Ft$n=BY%Uu)##2*jbGEjdEkqlGt09qt9nXMC zS||!;A~B_*4_JOt*MV;1Y4lS|O(3-yyV=U>r&S;^(NDHPZeuovaskREw)vCjt-+{j zRMyF@m~5VcZjg17768=T$fi9gA2N!m$q-aH`6mNaxJkYtlB*yx3!w^Fjnw&=S-7nU z9#e+$0X)Vz6pw*Ec?ZgejlGnKvZ3v0A?4tr0|aC_%Dd5uvBOxs8bc<^`*1^Flxe8@ zG?cd+bEpF4(?$v1GTdzpF+5a=^3jk9hS`z2r>A54Fnt6Ifp6$`l%L{(^HIKpZb``E z8kE!RC_92#d!zi+0Kw^ON$~hcw=o%#rv~Liw&`06JC5STogRmYb`w(GQaZY!L5h@y z6i3+@lnp;$E%1(4&D9$5`((@-pXYWr*LZKXhG#7)vsT{1@<)rAwbXJ9K8?rjE4UbM zTeZFLIxbrHenPR&tN0U&^~=;JY|x*uK_hJ-YIs|Q6oFs`Lo)Kv0DLhX7lSdAH=Bf(LOB}c{UH|}=6-q+wa4O2d_}z9II{YDN?Z{!DUYI)|o?cZV{Df%5w8m+vj+f07er+to zkzC%08(|EYkB6lvzk&*#v`A4QF<0{>#%mz9k5J54{E44XYn16>D{E5CW>|DRgjAn0zq(>cA8FQ5J6tEwJzry;8$P`}-TXcX1YPknJv?uZ3#^BqAK_2D5OTp`UZ!$f#?x^8O<=$; z3b2F$w(}0!f{Rum=NvHUO48UFOnTmdGbbgW69a7L9MlaLt!!r<^a(Cz8MeZfGg%t4 zjGOf2GfDLMEPRMwm<`8|)=$1__Ejsh=-(#_`iV7=UYhmu-fW2iik{6Z2yLSUF766l zvL8P02k8y`D8}@3b3R&~t7I+@O^UUfgM1#?jTQsj`khzJ!Ro0>iUp$?g{qxVBQ{VnyB(0e1HpUjVpXW9P@cgx8zT5B^1F8E0 zxACzpV;+^@q5}ZNLd>iw(Oa5SCXK{?Z^KXLt23VRfZ)c|yi4_Cts zWIK~WlW@_V7Z)g5alLVk9Bl8Pd>+r;i1L$=S%%rj(>*fANiVL2Rt)$DDF1EDq8gMx z=)qDyQt6Y@j)9Lzp^B7-M#^6!%~Y;56oFK&GASq>6wr=lY}q{y@d|a z85L0>1Vpi4z%BxUdhfNM6j3Zx3xgn8AgHJ)Ac$BnbW!OYrK(^<1yLyq{y*#Nb0$Ig z-Rphc=Y8@#`R=`TIlJ$*)?RzhrEL+>>zqiWU^SeA)rjQ&-=&AdkgZ5`XLQX-(u#sj z_|PfXD>&N3?LQW;GvymRE1A%5tjV#Sp}8;kNasL_+y>UMM#@Am$V_SwUREnTNA~?( zV8t<-8ir>K4c=E?@^OxJw};`nY;BI^v8=_ia$SyfS-!*M7sat9rq%J(Da!0@yW>Mg z-jt^6b@zW*o&{$ke|Ojb!e^F!!+1-ul}3mz<0NIHu0XpNg*WZ*rIMo24((oKYovM- zSkKxgLp4&qP3#$pHPudcR}3}}jQQsgrFGVkL|0DrxohO`w_G9A7Fa{W-?Fo=vx%$= zhJ@lHxf#hM!R|CWQcoF7q-LI#Tu={IRpEA?cp8FP$-E-AG zHC^x`Sd@EYp-NcE$sYHM$fXU6ydi3MfC$=oai2Mz7s8>P_aS&0{ATWMxP(-lQBU%V zyT|kGW%Le+4XlCEDa&u=q z!0WRIfitcD+`c*p3X*G8v|kS?raSFcc4X2>E7z%r)zg(n|J2Gl6rN&d3GU~3CH3>M z=3#0dBYN{#=?n2iYl6fbFpSZq;1Je}_d)avvIFdnw!AoeU}E14Y5Tbz#gxbw;CrBa zVJl^&%9otsSW{&J2wx?u!MS=ml@Mw!RPFx48 zOR5YzOyd%-5xyIV_cZtj{=g48)?@fz0MEyN5G?eW4ll}T$#24Wwac@A)HB?$61cMXo3fD zXv@C^YRmrtK17Q>^iz&?6D{}!Si(ZkXxnLb0 zl?!&A^}YYffq!c1?i|^CT9LSdjp+7^BNyC)qg{%T3*th}gWhy+c+<0kGi1W7YF1nv zTR+^0DptNuhm}GUSZ!cz5t(KhvkyacYb@qa*mB=VYvWfFs`(ei(}8 zVvFIul$|>m6+UwKcqZ@rGQK+86cM!D3G!dWAY*ReuyQg)Gs&-{#CFH&*QPZPeWnwo zom>3R@zi5zrkrFl*ZJX$c^xsE)%$D5tt4nPB&mT!|qBmws8x1zK zPRYAqQ4SA0IIR_1F}dfgkz<6`@GnmY{qWadGHZ0o9B|$bstLv$U@L2b90KdY+xvb~ zRn8Xa2v$XQxgM+^gGBa=ZF7;F6#CV!oUeE2*YL8eRGRXa0;^AWdiMiW!$7AwbF7a%+dbjn?k{p= z{24v8n|mh#X0!g`*t3OJsbYuqAJIqF=oX5Epe6y_w41~nM)39dQM?B zM#nE}ZJeEe4jr;M&uTDjfZs}W<%juDg43q^ts0(nH6;C=JnpjY^;`9=b&|;7?5U%% z$^700zRJfboT4X&t$UjDdk(~@!hr-I(sLDVum1P><~`@RigWRmm4tFy9#|XI5#-`% z6SsU(f{GN^;HgfpJ_OdadWU=NxhE@pWc9Ev;ZDoGJTH7_z08#IOQNZY#hyMW#&1oa z`TqdtYAtLXN2mUND?Y&y+Tuf!J}Q@${q-LLR+0?Xu!_z|`a5+=I%j8)^sg(2>5Qa` z&KMY{b#wF|uj9F>>ZGHihO>9&pMPr2$l)6;-%eCXuDFmOGdc#)Vb=2c(Q$t%?Z5`U zd2fB9hfwwv__)x5x8z>PWf|9`#OW#A#+d%WlscaCup(G2b>sckYE*qk!1Iu(>L&QD zwsDj66A9sdbAQ3`1IoQj@n6A#o|P-)=0v~MEO^M{_OBVB?0Dv6jIE5s$wYYAvW`LV)0aXbh4lAZ>5xggJ3k` zLuug=W#J6j0wFK;k2N0qHzs0HGMri?ze5}sx64B`pNTdz#gA-XBHKXKss&R0Fdijx z9jN~44t}ZFq9o*q2#Ib#(NwRku-`+lhDYNWp4rwKsg9YZHqj?MvhUsMT>QE_O>-=j zx54I!iHB`JXZh#nWl3kBpXH}S?g1w%W0My?dUrp5sy*G$Rm-W;8|=b?NEz6|yYKTv z7?1<&r@9;Xg8nC-QwI|D4*Wbb-p#bxy8u zK4YBaE6I3@Roz5g?1@BuzrwlHIAuhp-};wzR8D~Ttkzk`7SyhrkMp}r>uv*gObr{BQFz1!TtDLhfbR&-R@V6Gcq>zy#DrqNolsTUfhPGP24A++Uvz^JT*}<)DJKF^}!r(16>7uv*ZWJ7khs9%6U0{tE;uV zd=%K*@=RDhtw~jWPm&)_FDg=%scpZZXJ_f2s`eS$gn+g}Nf~>~wErGG-1C6g&uU8aJsvN~N<;J4;SR;LY5M`vg7gnD_n7awb(Sr?Z)yRnGFDQ_h_@+Qe=D((Yk@q0YuH zN%1T`Xzvav^?Y_Y79X^E zf0h>~T4@nmLzVr@mqne9^1$3ge;v)Xx^cPOPC!c-j_F`9ZSD9`!#8>`AlsbH1gT;t z&dBtJDkYrmB>a^G%Bj?>PQt`b$Jq%}eVe5eLXihE@Vjx;A;$9>qh#~gQNx*}*(Pge z{YuUa#z%z4c@!Ewik_E5g=XX7&b4DPl^8NQ5T&vete1ouey%jmJ17lsG|zly!TP9R zGPH`5%y22)V7}A+H74@o?2hmLkRU7&^^{h=??Z$d2%j}Yt@n5kp0**YN@or zv5q+&U+lMDp+0Ydv#rJD*EV9TX&$#XCXbknH9|F{C#m!0H3(ZsF|3K-dW{tIoBFK} zypxW`gpx35ID)Sx3h3-+>=XW9wj}D0hsCsk!G;y&p%sn=Lr1sBNP=5gugbe%S2Brf z?zhH!PE40Dj(X1O&yw$T_6#-x*SXL**$mb(%YH-Y z`CTr(@=Pa!q}_Q;3_jKwyqp?L0lOlv9s)b3>MR{)g-(^}lT}wp>(;bT?}4GFhFQ!o zqH1EOnf7B)?Z!U+m0!r*(rZm5UrZls7$Z?t}O=%lSgBoopnCE>&^cB)8r3_y{4`trLQOpYcHTX0& z8`@TD)<@QW=RvpH`K?c&uLB3>oLE`qY{o`^W^VK<>DivP$HHMKm}fIKOXUpifV{>3 zY~Qq_sst-aY8mAv!K9<|8RP=8Jq0#P{duO>W_v}bWZUg z7Mtx&9wMsOmD8TY^FM18690FNLL%w|dpWbMI&6&s7m-|z!j!RlQ)J#Vd6qB3`Ke+a z9}7l>oNe%yi&=xH+~-bwo zw-$sif9^nLxNq#tPH2yZPYZW?a8QH9XxrA)@*R&3FZ;4#ru2Beft5rj%;;Y=BiuJ7 zwo}}!)}Gv9(c#kUDV@T;t&K44d<9ls+IK|?f#2B;PN$b2I+Dk)C%n-O`69yYjG4sR zQNis*%K=!N0(oD_=x`jF*eJCAi-IZnoMKp{k1Lx58!;?7B8IV9#i;%!-aWZTg* zHgIyhjC&fMOG0=< za&l$c#hxxFRk=3uLwAQA@|H3^5?|S(><|yFM#+)S5RzpOO z+{o94UdzUzWekLS>_0C{JlFX-xwuA#gEv}p!kZTVo*~EaJjCkwuj_ReIwXnz(9F6^ z53q?^@jZ;Ao@2#VBgnmq!}1O!wc^_k4&>mzdmk7`mcTnfy*K$bcqe(*re#)whrw&( zXz3{5VJYdSa_t>560FV#UjmE0>v!@4$cU<+;Ts!!YK_NthYY;IZ(U`iaPEx^oSY$h zq3FI+FFb$JzznH=qi(R6>VhgoJq6bFobbvL9Q|49>)fQ=#ca6@yh#fNYQ&SE+Q@Xd z*)WJtf_0GNnumvERLhZdcpD(LodU;uSY)2K&2M$g#g5dssfHR#9pQpWN)*5RWSb%T zHpv%6c!Z|E{dPaLk7wzE+;zTtf7-D^`4c(H{ZEJX=T`oZG$LL_)W&~N{v6+e z9qgJJX12OR9ZMv{uNl>vWMss2#xgcuO{!a(GmW+5<#m$Ou@=d8umy8Ed4P8AV!0gr zCvEpJc%BZ(n1MRw7>8|e{AoU;8al^(E+e8}lP<<_y*hFR(ZE&gr64Y^jwd-3)h#74 zG<${IMnGc^jwv|0)570?Z8K3y>8!2pOfaoVvRxJFdZ+FS*T}bEGm2Xuy$8& z>ppn~tnRm$q};rsEXr4ysv4{YX3g0^usuV6!qGsB794^gt&X)gY|1Gd`OLSRyAU%p zdH2R1z>n0}F(T%2ze27|f2SNPRx^pSG) zKVby5wV%ULqK>a|j8ey-e^C_E{xN@T{{@6zhsmyHV=tToanyD*2+AU**E;xe5dQIi z6><*f&8Y!Jw~yuFj>~5SeNRZMds#!{R_cJu4TtI?rmTa~CU)AQTtbuY(*?0a?gv%S zTmt68PJ2TI;iJzF$dDf)T*IPw>HVtb=`J^eO)GKNw)XKwi2sJWuKIxLEKB585HWUY zk65_cay+fAZF15OrTtL%6Sd4I?u3x%lX)Kf9h11W9EI`|zVl=X_@J)$ zVJQPkJyWf4-wP#Eq94*Rj^?Tf4z0mGphjN|!hV;>4pXMuv#NHu@V$1KlbUr+4v$~Z zw^8`Wnj~*{e^F+-eV^1T^N0JbXJfZ}P~^+tTRrq&-w|kDnZO%B`?O+W`%0%3(?_y8 z!o@f|nQOT5AJ3Z-&dHOJG%^8X#wU4JPKwR(+B{fXC@wrAZf~Xxnwn25RWMr|0rI;n z;q>3@kYO zVC)Ts7^QKnMupS3C^{EHUg~$N%=^7MfIeF#J0U*FiPWIzA9Cy%u`>MebI69XAgXMb z`h*$1SAjZ$o_BCRsC#hHlLl`B8GdDB7>8)Edw^Bhx(9)}bx#IwP5y0dLg*XE{#WKN zr&D>I6?5NOV|6WHznwq*m4f8liuJIE2tj%wC+~mYixWcm6sjQ;jLJK2>br-0r8u z!W%->O(80seHzncJ0hmbFB2~qdn0{bBYfc4kj&_at@0m)6nc+;5)3uQy14d4d{{1D z3f7CgoA|ZE2m0h?$QTHN>BiIGC9q_5!_|JQ@KC`Mk^pxMypB#G}Y(iLlnekFB zD?2>6Z>`v5SV&t>9!y1K{E`@T*?Jm=huly%Cp`G$L29B`9NzSBT!ww{Ht7c|JuLU8 zCWU+KJd#*G?`dT|;K*t{>$fJenv{bThi|sP=Q3PV5c4WATz~7d?c8EsclDgK@+yTdPHQZVgJ7ZKZEUG@w}dyO_E>0R%x4;j8>Mds{7ft(_rNI?7zWF`RsD= zIZ|C$rUJ+$c>#P0M(z^fkoeDKo(-`hiN6NliMa-LLB1w^p{$TK)8oM(S4hJb7%MD=SAmn+myd#tEA7j+)~nG>Wh8dV7*NHW zt)Q-C*|Q8@<=_+tcY}FZMxELwDw7$CGBpoCmzw;d&Z`Ad3~C;O!KtbUV;8@>UzXH( zNxAN+at(N;ZpaI8)VF%eKCnRydaiomiMwO40DoBE0pVs#RI%;hs>>sTQ!RMvj8c zF>^Sn4$pWbkSQBcnEYkx{LO-&YwA=kc*WG|dL&>qkO!C^sc{E4*c0fM*BM^UV048K zSqbq%24lh-s172x1aH9C)vLd}m4b?WA-+OP9=3z$q1{iLtH*R3Wgs{kSv>ufgBenH zo+=k6NjGpdL;n}BXNH-s?$`8Sw2GWsfC$2c#q`iDtA9}{xAq^Ak@Nlb)!9yO>KXeS zc?WDkZa;!LktUI*r=yv0bCX{n)@JTjU8wxtM(GQ-LccK?Y;2D1{Zj1%Wx#iR=(l|G z>RWy*t*XNmpKr?M4Mm$-eNa!#12Tm8{_3zq@bY%q;*>`*J7#jo-lckHf5>yE?>!k0p{eiB*~%u!TFjGR8;aR{5zQC3F^11omGoPx!iT>KsR8HZJHP^J z@GGc~IbHBJ%bGEd+$j_B=(@29>>lZ=T8k@p)xG!{&{Z#j+EshOskG<)@0j+S2Wop> z`R=)Ur$%^S^>+UJ7^?4fP!;VU8Ufxhm;mc2=_^qCNXC19E5p>HrkzMGgmRDe9ccF* zs3T$W`}!>-zq@^>BcYC+EJ?qW8nnM6)t2Z&u}`{!+7A7}+OdDkL!%NdYj#~uTsm^j z`*AX;oM|t62#wb*I^1!}_&n(mlh4FTq5qN@Ik{jc{f~Jghc8u20JoE60Ceq*XTVyq zcTkRE`>3AUd40!uizArWAnJkeh)>&O%l^`;R#F+?QidQ2>=Z{eqEPSj#FOVaZc3uR zjyD5BDW5$GHo{Q1a4E-fe;o_|fUIAC6g=OwUi0vevwz8!FQMd9Wowy^l1b7IY?}7e zOOI&zYq}fHgHW50elDmgy=`FYKhKN&<>n(7f>Y^${orlpV{N1mPp;fX9~O{)G}!vj zYr=YnTF76)u#>)tl&|z#vz)%DI%025N_sGjzHl2X{eiaGGMs6aB6C;KFSN;G(3yuF zC2fxK@iD9UZi3yRwER+;k3Ul{FKbRQcGFAGZUHM0uC^~bUIr43MqTa$RXaEbyuj^L zUjJ}rZW*7gQ>2452?0l?_T-Sc2Feb}e5A+t+RCVK;fTE%DRHLU=4;_dx%s6h36oKM zI$;Ia^3ToUU872+N2D>>mbo;tX^dopMXKB9(T3-CLudwJolf({wnMS_GFX#K!0W)EwO@V!l|$Vmsauhl!oT|NsA7gC zS0PN>3<=`3zllipLdw>P1q8yCl%9!81p?xxaY@U^!?zFi%q@gpn$WKIR$d(`6rq&}R z@^7#QTl^ZZvt^AePu+pIsoZe?omhF&w?(@+5RUBf8$YXL?2!R&oemXO;t zSjlVm_^lC0bbG)_F{dp|K1vVJR5ETaBY=QI;DcPlsUrJ`k|hu9W4vm_40Cd^2mh<~UJ#A}t=c0HN z*jSRV4R4lZQ2EhoISuv(FaJV0`0mp9OUh2ss!HS2L2~PM81YLw9Aq`u0v3dOUip58 z^ud2E1$+Nd>3~w>s zn#SAeYg2<;K#f(~kjowN4`9o<6&{S2>q^%jkh-Mg8w3}-j$WsZYW8v;RITG%;FVy? zwG((vW$>g2@UO#ctYBIXUrEDfZ8sNDz(cnZIQ+m zEz&}AzSokM%0-}dTvNG?!nT$V@avx2tfD5h5^OsI`}0Xuq77Yj5!ebj>>=<%3cLc; z`_lC(loqd*ETf*-h0W^m>Xh%bTF%lEa&Opkaa`W#Emhte&GP z=D~9We^P6bIr1?$8ocb7o|n&&&%tr&5p7Z(j~{&|8u<}F^R=_-NlIT1{iX!>ST9AE zUCsVfWT|G#hgvEU@Rzf$n}4C$^&;VFUW%#FoH)DOYJ@mTo#1qvgdqwEYH}lHKX@rO zV(R~j(h>hMQ2oir^=xaVJPD4p?vm6K2(Yn(7%Ho!A2&`iWhj)}xy*V9R2z)@Px`H= zvYy!L!Dgam6z7s^LJF%I8n;ynPwB?CS4zM}Y!VNGA<~qCO})=XldW@;BSVsY)3`rL zE3k;ZS|1+L7ITrocw6G#V7yE4>T%XavABhS_Vst|;qGz=_)ONBd2T6^v=lrW78*HU zGEZyHholqOfw;rKW~oQEn7C;~IMm_Av{tb3g(R5$f ziaC>=9I-gi3n_aDZ07rFsr_q6HT0Fmn9#1J67&SD=0({59&juR%uNFf3qCj23TgqY z7a9(bJ|N?XUe!aoH*f^0{sypF{wE()v#nUN$#j+NF5(mR?}2_G1<%w)qWj{XeFIcK+K^D^5$kM7n@2Fx7n!tWmHqHgaFVF@a9xhJv&3Op$UTU4^>9 z@6|*l(jA

    Vl(su_;?(E80gvJv!J3s;~1Ot4^Z9dmLN}DrCO2 zSczN$=EJt!0=BctXQl=?`haQqAT7Wn0h8noU%);PF!u9jF)eJg;lfwPV|Fzixuk5j zF;M;gi*ebI9;jek(qKs<*PbJnD*gdgk175aV~hWVQ8`NfZQ^!pw3Q7_GUzl%=nFW~ zi$1fMB89p62mk*E0p4umU8Y_}-w$BEGTh0z0mQz~r2}{|0i!`3 z@>@U@XHt}BhIrKq<#V`G=R>u{Hyf_G{0oA4&}X~!ts1a-Z9kXspN;U^_O%aJ^Sq0o zN}A`trI#w!Nj`J^Q=O@lh!uKM$RdbFNxM8ZbvpNbaHs(oNk%Yy@=AVMh*aj zED>YDhdI1VuO8q>N^MpoF|Q~wQp!uA-y11ke58ElfLzPBhZs#$$4zj{mlzs7L8{gW zST!kMnkiq}S>?0O%7clN?*^jvuy)7-usNmr8q`uH)C^b;P^w43&MJwn#nDs`)@ns2 zSxR1EicT_&Mr=a}es{85+7e#7z-DwboM(6<$9LEbG$^to4JVR)mbeE;J3TPWs~tcw zzg?aK`|;i1z-{<9)v^8M&FThVd)O2osu#dwbpM|%MswI5e_Sb^`Z_ZXNh46tpf3d* zyLO`S5j)W*AXg*!RShnfI4-DWqy%d&PmBw)-xm4J9(!u6oFI}~4RvTh0LdD9*XkK!fD2;t)8oD{qR_&W<3vH7@pw?s_So!3{Hbc*& zCY+q?CrnRHJk3qq3qj70Wk09~$cYurw@^mLb_$kS54TFj0v-R@@{*)v~S*I4z zEA6YO@*v>}@s1VGsy|&u%`dOoCV-63@^P|lz}m}lwzFNJ(oyPJd{{huSjA1DKk;FI z^8(Jf4vfyafD=(5UDSb!|J61_FAB+ZujixdUqp<&GkE(~BnU-ns|Z?@)}<>Y%mx6n% z`he%x;C;pTP_7x5DQbLdCT3zN&lWHed?nl?Jka&04B1J1J%1>C`0OXVTE-SdIibBiV4sI>vl7T3e5-q)`@mvsHh@~o}r>h(*J7?C5FsHM9iV| zi**h?w%wjXJ@Ke5TTNR_oF(J&tJzw7sFs8-(W1Wzr8rfif9MI#pXjkKj{E>ouWIBG zCC~fvA^Vbuw8v*()wl{r3pSQgVs~W)N~9*J z-F_QrU(0B1UaHD0MapJvy%_9p@!}V`BzlvXF}DTtxGOsAth=JajiyO8Houz-qUtlfF93UTo$FaJMD;otec6($Y4jxfMG~DN zp^ogs1$1oVp4v%Y$SvSYV9I3yOlh{u2=JylTRoAdFHO%d&7AWMZ^-UJog|!Z*mq8Y zy_m{=I&+nymN>gNhZAh~W*A2i4f!tE?5y5Q*4{h~d7pAVm(!d4=);;Q(?aBeVD{V{D_DRiTH`**S^$*YaM?t{K|=p1fPvXAFw{k^jMQC1J-%; zSbwlP?~=X)mNIe^u3|SFcwZ3~zuX6^<9VNF-1P|&R9!arTSK*O{~tSeQ-$UxKD3E9 zuhn$>O+K8LI`??AEgcWqJ6K* zmhZu?^l|HJ0@jk4FZl6i@zKrM;=4A$JC6^`RPeqQ+oS1I_aPDc+J*bFY+UHkMPBEc zn|(`J@44x?9l1y@xlV=AL)ghP8~CY^_|RugB|d|am%DJGsf3?O%voq&sn7~Nzp&hQ zeZY#b=<%$7n9aHmsG7IEP6ftHrl*t5b0GHU-B+n*wGy4vAH5>gq>nD`oce&`30vXP z)aHI^+}HH$?cgA|oSk5O?`%DH=k1PV_s)cG=*RZw-K4`=e_+74Dbw(HMM;HO}cRCQ&960 z>*bUu-xA;e8CHKpc0y*@H!$JCaQ)J|Qp<LpB=<-shQP zg`3>jJ4=!W8X==Ks8%rZK(##$^W;`Ra;3+&d&r1E>{^%$I?rjl^Zh>>peBY=EALv4 z@is~Sx@+0vjwQ!Pq_(-BS1$!co=4*;(}Y5)cPGlgN_T+b`Ej@+UOpHCy`y)+Bp6|g zN#4fyG_BKhaKJjIf@h~82z=_8i^H}%-GieE?UQy_z$&Z0cSKAmj+fJmVpHtk$OjW1G9SDI zoNYZWKY=YVldC&ShwLtS1^j?`w+&|~x2^Of0(&6WV3ogQ`_xlIy*@q16SPJCSYxgm zn^#2NI0r0y$)Op1Wt9(mdJZ#v?so+ZHMBhF$i6Y2V>a>-KVZ8f|*nH?j*lYHqK%^G(Ho~dHq_2&j3Yj;yXQESMMTk zOMbaAHuTGMxdyVn5k4O5mBJ?E?)mAtGJ*m&mTFI$U1+sa%#QdQvbr^?{z--m$8#QA z(L3Ngu>TmtcI*Xgx$uK(3uFTk^i*dQZKZ%syb0<)*7;fTj4X1~>w)Y4AL97phX#09_6wiVB zzQ7u=sb}$vrc=)Q&z+*f{~NuT(AIih`wivIOvN$ZNVli7VR*Y8>;>1i4b=TF?`ebm zz`?ZdW>CPpp3(JcyX*sBW2im(EakiS=${QdbJ>_5Us**jL&Ua?(k*+$$|@0lGcNS; zDi3Txn<%?DFadUPR{%!^Dkc@3y4sYJ!luW zhJJb>Z2IXisH&~T?ETaz-0y@xLmtPYTk`v0cT^uq&zVT2;9GjK^L2Q{suy#l+7!cj z_W}pA;jaYs_VN+1gl_0C)u^$b0MCOn{DJ4lgHQ7uIey(qvz|B2x9L?ik{g82HnjrJ zBlJ@+-x4_vs*a)iH2Zuh9I6q@kT9NxdY<>Ip8DiOM=mg@95)=Ed7wj5%Gh*xvF(Jz zytzi_|7GtySt*mAp_3JfBfF=JA!qv~=a+D_b7j1*@pR`h^6yR(=V2!%`)M4VU z=i{lcc0JoN21D0MuiE_CJmznf>s*GeXO$~r9<%2~m7pi=vnA-NFR@g+wlNLe9eWVe zR%#oA`Ql?9ZnGx^6I36I{LH!P$F}uLn<#7y5<&_5KB(eusCD5p>a>b}ObtyELXYwK zpBf0tVREZRUnIZG8j?=L;S;Q2gNjp$uF&<);Rvun71y{XwN2DhnlZ*Tv3B9B_?H1Xo#)%9UiR3-1h2C-gxF>(0@+$sI-TGOG1GSkFJvHX-8S z3%x63|5OMk01dd$*64K(bCb2Xx5tLwdeh_UCr?8v^l+hN5sus8Z-Z~BBBoTH1#e?@ zI|GizKV~l6M`v^C;A>9_;po5x4F z0}>x94DX-txw!)pI@vW}ZYLz*efE)@P!V@P9>-Uo7v|prpQPHM`DV!(3u-fL0?$vx zGRJ%`O}e+vMHFlHW&rz zS)m4e`gMHO`1Cr(n8_A~ru}ZcBTHfzvZ~p6edp%Y8&XZ{4H*gsla^1*2-W4+*y2M? zWWHvc(p1?N3~cU(*3^6~*}Mx9<0Io{;R7pP%!c{W9>dS>AO)m&X-y`Uusq9ORY>?$4G}SN%A698GI^@Kr;$Xy5D#jlJkwWCS97XDaOou zXL(^LhX&bC6dI)LZH37a1dB6Y@f4-wqeI?10rio(q!08UvsA`|lRc*`UaCiv3}F`7frwv#$|G2#mSjk~rDnIj6TDb$ z+<36VnET2mNUcnD4#2Qod0mDSEmJ{cv0M#aq{83~9QFy~8637$*kF0U`h|t8XoZ=< zgFxl67CLy!!A>g;{ZR+kf;X_hHCm-i$0T_WYz4jrHmsuyo&JId$3a0qmhS4;=hOYV z@NtwJRaDzdtHjj->rQ)AtcVG{`eG~#-y@K8RJ;xrMOK{c_;lc%P>iMjk2q?rW*=%h zmdX;as^=3cJfcI3oH!kijQEof2d3*7-|A#fgZ<==r6<;4Ct=o_V-orVUOVe&(^2W6 zZw_RHTH2%WXLmGyM)U+Oyv2upF|p;eQkZkzk8~HfPkMqOyEgmX+LS@6ZN72BNwp7B zf_LGT%updS>PLK9vGk7>CrdN%NxR5jR}}eor^s0jI}?W}5XH)6Pu0^-zDd*|A$iyQ z9Q`Q~N_oa9c;X+XQgOb!r9E-&ne&GUO`{8b2aA$F8to6YvU7ac zawcZ`wQf_45({^x^ic{K-ws~l;cD1I97QSw?8H&kk<4c6v8<5??88puobKv@N1GqO zP~)%~>tJ$I*OVF7It_u~oie!@q6!34z-ti*eg##P_C$E&@|l@(*?KcSM}n6l59|QP zfH!SWd0>S2HY#JiK>C2cG4-z96tE^?_xKao3P$-UD?DV;kPPXxnG*tTv2_E9Up^IV zrKjjywwMI{w<@7TUI6RCNUj6h!FeZcqt4i}Hw2X{_&3-v7Iyi0%RCOX1VRdrLwy2v zNjd#?Y$!dnWup1$>~y;RnsGJIJ&9)RFzC1 z7r%YFF(bV1iaWBC4KQRr!as}}d^VP()kyeoc#!OJZSLxTP;BYFwcTv_lC$`Pryy$*-E(x8r zc)e4ZBajlj4(m~NfWdAr@Ee`J*cADy720G*(zQg&p|9@-^{M5hU=vmPfy!kx`rL3C z*E%@b!37TP12tU(>RJQoy(g&B`-7k|8T&wGGSa>ba7lp2#XvPm+v8x}gNA>&A5^=~ zd7y^>?%>6TjQ<%><@yi7%fQ^PG~IH!1FX++=(jTQ-FookbMYrc_X&L$E^O2zGdyp8 zdY|&*uVG`Y*s@7+(LKXWj=i5*Uiu9q9GSU%;9)(1qx|LHv#9EM?^%yF=*`ihGTwLA z_op1I%)g~LKljTGl@;ga{>{Rj zOLDGUxXt>aoBsN**~$_^=5bL9t5-(b#C@~FmZYD=bD1kiU++rNhoQC(B1!Xj#A3^N zPofA`sg4IDF&=L49jsZ@J3J!!GS<#;F3*GYJBl7RSu@>b>DvLYO`{>%@?yb5xg3-2 z!rKP6DDx-e7H~AEQsWVDEcX|g#QzDkkKZ>VsR5npKAC^AoDcvnC={>)D9owCkr%XIhS zQ*rVo@Nvd!<6o4iERl!63lJj%MvP39CjIibB>5xcEP`Wy)hff**1=Ir9X)W&PIt8f ziEW}h!G@uw<0RoYc5uEuM{Th_y=_!Xut{jwQMnOviErv-UPt{K6>JzQnij zP@F0SuWW_U{{?KG<$)7w6@vmWK9nc=lq+unp5pY}w|tqMuk*6Xo6Dpwq1GcMOwgB$=mInQ;tb59z1bFG}B8?ZYtgFd3GIp=IkTxEEB zrkgxT%3O~#xf=LZYsj!*wb0~OEPkZ6mwZ8ZLzOh*b8V%~G_aHg_#RY|uUSH_eHG;s z=@(z0VK)r_Ql!UDiMiJG4i?E$d@by1k9GG|D=8ONA61nuJ*L_nQrDS+)j4MiI9uc^;sg`7nxd+F)Hs#4q4T$i&?*o()HzFe0* z`Anu0F;kw0l;EBJZCt2;4xEEenep{DPL?BJeb0$Fsfxa%oxTustvcfN=u6Q1Z7oQi zEQVAy?tqr%fJ6FKN!A|8hsqIV!i{=$f{c ztCEc@4uCF3t;Mpu6zavylZ32X>psTJVM)zV_2E?fBUMFGEjt(ODuW7q08A$M4qaG} zlnrY@#EJM{hThtrYpYQ11yxQwCWWNPl&$#n=<8?O@0WrA4ap3+6x5~QS0~;q{G95^ zX0SI?zHTlJmad()FgkR6c)G72t$H#_)(3OBQNRQ^jH9n4<>gu_F{PnXQF47@u61kb zZ_WTiACk;mm`M07wiO9-eTSl44r2eEZ<3sjl8+#?t9ZmG-G0PpGvT$E2WOmlVBRri zH%)i;U|#V_53vX5R@E_bqqGBay@%&+QsFP0KD1Acyj7jGP{tCF;QcMEzlPpRrr~Q~ zv%Di@1mT%dy+*EeTk=T5_$D*Rxyl3S{FH|cNyj~UfJQgxTCHSv0h!T2hd|Z))~iO% zupXNTw()#hL)PI?^-vxSqug#MP`TX!U{8DKt#(>cK7wQ~p4y1|L#@})cK-%9gSXh* zE+Yp~943g?xK$R@P$`7320Q+_!7`|fHrND5QvN?1>{=pfgFOhIqrr;2Z+@Q5FMjuu zy+klg^>n4C(w_@^mi8$@+vYZ>h8;2co-_kG~M{Xc&e8`>Ki8a@*Z8Dp-@sa2XxZ?3BxLvJyT0-05tO^G%+ z4&Dn6u0wCyLv4m7O-||~+D9R2v)*2}V!g!*A;TVLZ$qq2v(0or;FvoTY z^;jR`l*OB6Nnh3z`=~&Mw4!pp7qzy-P}zJv-xI1u(~Tmw?mTaT%HOrCZ|eFOsKaJ0 z*rK>3^lHUdowNN6eqMwh8_}zm8!QUJ`O?c;){Q?(qXxOwO>H8-MY2|d*ZydJkc-{a zj{9)5!F`I~zUSpsr>*svdSLU`kwM=Yhu%}}kC#`KYFNRRp8Za`_hKM!W!N>$wI1?p z94DJ_=q1CSz=<^CsN!6HmVqUyI&6;)+KJ#zEFp8HQ!|}T$&JlYGf#X?)PI@dpYQl5 zJN`GF_dGrbv55 zCe&Zsx7KF29khuzN0K14RsP{>GrKdlXk?w;@309rbQr03X=fNIH=n!ZXa^de@w80_ z)AZ*{ISsB$;`T}%pk}N)9Dg>ATqAL(n?Z^6>;yL&JN3C}9@-d#yH4E0IlPLJEJJ$p zgDK%gwFbq8i)Y8g$zB4J=;CidGeS?h?R`nea5F=|V(%Ycribb=HeSM~Y}6V>JxbWe zp}~L`vn2ZbTuhUAN(j8#?zxBgSsq<-o7cB#ey|d7<>nQsbpXTJhz{%;LlT$AU z)nhTvqwo*lzKGi>%fUwG)gf*(;%ODT>u3xSnq8=SWLQRkkqC?MwB=mpC-72g*S<6C zC^*u=4;@Ut$k2N_I0+&!pt;=g*vG+4(jB*0|@fFrm zmD>qt0A%PKvwuoGm=HQ?dd8<($&=y6!-i%{`-^iqdV5cLgFR@rm%%ISPfc|{6@Q8O zRAaE%`=rxsH{;W08?C6U;~yqNZM7=A44-SICqA>td0%F@47pUruHjvCtr&^N-I%s& z4HmnNIS@~)gyCD_><4KcJ}bd$C&6(|kZAu%i@sX(h#e^)7n5sl0;Y|2(nl*LZN*m> z6IvV@4M6u#aPda&i0J(?`JpeYc$|Su6#sF-qSWw1` ztR5rq8QVIVe1iG);6z`Uj3kowYB{LA8s8nXoBAcUsjq{iy*dgk_U?Y9N~k)$`VKyA z>d$PPET_SLN1AG~9R0U$N~Jw?otso@+V(@RQU#_skur!>Ez(p|D2 z@FqKv+f-!^HKnKdQU|b7qUlcX6OgOZRBwRVRC_^fs`$%bv%#7mKjI!oq!) z8s;^yo82&r-G+(oWg4bFSnPe~NV?rHeeo66*5UrD)9zW7hx==$?d{?InkU?|X;GFe zAxRhOfW%&|Jk|lZO40t-QukYnAZaJ;1&h7>Zh9z>PRO{zbV3V7U2xvCbIg=GAzZ@S zM(=<%z`bB+*ykF(m3u3ZXn4I7vyFDGt<^1 z%9MZLR|aRC(!s5u%6OZc@Z!Ek#=8zw8E*mD%cnBl_?XaIHN|0!Y?Zn9&{oQ4ugB5X zx6QOQx($`+*yTF>lg(OEZZINA9%w|C9a8OIR3UYzNkDXaZ%@1NESV+KX1=e3s4~kg zXGBJ1mdpwvFH?oQ_RLzpyiata?D*8of_PF&Z_}wsa~_l# zL)fI{_1kl;Hwoz5-wF824hYJeJ94deZEogkxt>%x~<%GdbO5vNDa_C)JEV7z?H+zxSw&^&+2swzrlYG?F6SFI9Itu7M z6+kZqudoHs*PU*b*C5#fsCKdP^6ltTm6SqhMaWIX^y#IEznaXF;c4^e*fEUFuD|$1JC&uAU=+hH_r%zQ5?L&gxxIgz}p3H-u5D`X~;%mUv{vK2|>v!2t7oIQg z-AgR|r=^&#J5T;lKkbrmpPAYn9sDP#(&ww7N}sevyKMvHXz6@;48*7h7heOMH zWrn+dJ||vURmtV?;@|@`m)(N%UF}f`Bxg~2OqPw+tz{gf1n=k>vG%H4rfDelQX41B z=b%0aQhlf?&Q)MnxWaMKQWe9Qe7WwbJgZ9h&aue}vX`)Q;vUgBV7muR5$^5~?Zb>XauV#+#n{fd8d&B}DKj$coLn!?ohS-Hp_yp8v&`KW7 zwI=JD{!+B`i&ibEHQKEHSAqI`*lZ~!PPY7j|5AB8hO!C zE*Q@jVmaAD>==r>6P();u*hYl58`PQiyDLofe9wUHDDydNIZ=aSFhsjPzJ`z=jDLFm(g;+^<{m|Y*P3A2;Dm1~ z)T^B7w4^?2d;zGjHaM}$@M|vXz>DCJGoMkGYK8m*G;MgmZNue|v<<%ni@a~F@`S1? zbM~xh!xoC#hC8B-LFr%!H!vZ#fUR{xq)uYodcLb6SK_FR;4=)o*>k9d9Kumzci3_F zV;#fhW4D4u5e@zXe1_}X=PV|^$k8Yq|9-RF#Hoo?us`v; z`-yIlv_AKMbu4tbpf0ZEHcplU;DxGxul*c*olkW)4=0%wlCJwodJvu|(+N~tuX$im z((tc%{@s@8zmXXlp7^aPQw)bAzY#_G$f{GAuy$ESM2FtB<>O_L?7eg2i?Bzj-#dw% z!=KBhnvL{h@K$Di)8})sqArzXpsNj9Y6VkmE+}mp)ndmy8fhU%b&=|DL3T_vR$j^+ zP5j9%-;MGBDeVKWQbJnDTD%F~@XT1dpLgR^jZk8lIsKXhs?zpXcD9tfjPQHc*RCN2 zLK2Al_Lvf-1O93?N^x07Cn6zL>oa5}tX`ehNQ{ZjC<>6h2RbM{Mq!!a>Nlg&-l8$x3o z3y%n+dd@DA>u1xdwz7C^j4b_vQKi2vAa*aMkJAi?VHGg{@mQ{AF(W@By7ts@P<3}B zUNKAozi!;*sUp);iBFkw=(X7NS4|6C0S@qfRg=N}OpJ7l(cg#O4=vgA=py+6#|Y2J zMKa_yW#qYkKLN+YMraMpDZl5ihdx7a`7qkxOns?(wRy#}P1MIq<+4_fIWU;MmF|wZ zM#)cXk$I4(r9CrAFA%qh+8+yb!X%!iKpLf8UjbEH-1ZHp`#;5@9dPknqb+_;M$FU6 zxB|a!2vcPKo9a)1s{W~tzf}D+$uLlboM{gIGbdh|<1d_V;`IbI-gJlly3+B_aQw#{ z{|nCdTk};7pXr1TQ$OFE3u-T*oOrJ|@v1L0>0WjG zw>$pVocMFqPd@uV&F6I|UN;7Jt>iZ%eI9zlN$?Z_H4^7W0%Y!6W-uHByD|+rE^?da zzT-}W#WCh5O=E0p7<(r8-qC{SOn8`?fMQkNCAwi1-*uvwy_;(dpI8(ujfOB{8vr2`t-?DL*0Zga0N!%dg(uy4#!}d zY&*W1XZealo=|kKZl2n7I}tKX1oLJ9$(s?yB1%!AZ=!Uhk&DxH^Fdu~Zx+nY@|f_% zPmX3JG2!$YWUBsfi}r@jiNp`+0Jyki@+w_$o$SY-Ku3HFj)T5JX3*-c@;kC^XjkMn zTxlAFhYVPrR{ot{F%0{vzw}3kve&jFPhFv#GZqYrs#M)56IUrSJpe*W?03uW~VHn$KGA0zs|flp3u$Gc(s1`7zxt7-zP)b5+gs7pjGnLNbS&t2+>+3Z>u0} zll_n`$=Ys6i6QOo58U#8zmoDARn-pJOQD0loo>YU7J5TX80wc&RAYL%OO|~|DH1<5 zQPQ{{GmgM6adr(pllg37F#eF*SevCj->qlLy2mMN;@(KXWE#OLU+x9XX1KyFRR_M} zlK>r5nfc{E`Z(u;DeeKpvEy=!)36GfkY=)d6=ytj8W1~On4^~=ivTep_ zF+@Ek+Yh?OWDNgo)d*Riz`fZgWZyZ1J}1Ihx;A&6h||IQ^Ky@^lzarA?y?I&-DTUa zHG}p?*@Vj-v`0)?b(`G)S+#?)>sX61wwtu5Z?1H~(-Tj{Z&nAwfsp2 z(FnHwOk1U|oLFy8vW{_wLKSC&seTG=^$>WgeO~=brH1(zt@o=8px%|HeMO_>%f5|9 z%W^zYd52BQuHYFX?G#8n;nwO#X|&1V8MSp<$Z)&~-X}Kj^K6XD3HY>)J^)qA@|$#| z5zdz}OlZ}z{9dW88sa}~`|Bm1aq}+`-xify?vwLDbEdSy9VjnD(s{fAYytlsyVVT1 z+KMWPJRBSD^U5<>asz}e{JPGoU|oKHaVyx26)}EWE^jQn#lwZM;TbI-&yooc8d-12 zQm`ozkAYo0Cj-)MI~sM*Z^`BTa12vL*?}GC8tj3)%Pmj4ou)iDfyLgj^P)rbX@lqR z=`?uH#>uh=Y{^yIr(%sZB;VY_M|yeMe$Ojdz*uRrOAE41`hf-d-4Qqz=yzLu=6-jd z``rnUv>g_M72o|HpME!Ox8h`J0xE0J54^-K_!n*liy&zRd%)}RS(;0Suf)m_7P1U!z#^NVWqdU@ z+;ba0%v!3et{PE2hNC!sy0c8n2YBmQ-^(|k{?v5i{bqq10-6PGom;F;khEAQ!D8>J zlj$~3QGCF(N)JW-;zH+(PeLe)wGYwcP24>Y=c7L-sjC`jg{M_4uNR;ixEr?~SuU#_ z;TJr5WZC2k?Wr>92kLRnLttA(^LIg&OrpPJ*xF6F!!7HBketPMnQS_!Tf}nHP>G>! zj~Q<0Q{w1=_}#|IQb4p8+};U(P4+S#UxK~t>~S(>*;yqch@2_!6R0xoTClkI-6vwP zuC%-8L#K=EvmdvM)>Q7IHD#p9ly-;6UU$`xq!2>3^np;voI!moJ-*X8TeQBign$fc zxd|L#7wC(M0wH<-`whhTqxqy72f*z}+xzk9#PaPZF8zr{~Ja?g5ANi-FCZH z*)jlXOS*a{Sm~^8rya~j47nhIS72;?&@LxY!*6wk3QIq*Qlif)C5n+Z3Cwj4$v5HF zLvlYY85wci@U&q-jRti4PuqoHM1@VWOtm_aeV^r(d{9QM+m~ zmyjBETOD)TY9A!0tq#e=9~pJh;CtFC>Evj8$k7U4@eVtEoA`BPOvpcoq6^Y+u=Agp zwj&S&_E%20U&;Ex%)|Czang&hYe9SL9d@$*z9Q>qh+4@T=97f#ndmDHehBJs zMrHnDP96F>I0v-N^T6gwC805KW;?7Rjj!OhTV#CiJgX>itjSpI{`&rEGMMAw2~abr zf7~3VUIiKk;c-VvCrcn{R~-b4yvI-bR5iy>7MS*Ftf(vaB&uPnjP8Jv;~15U#(gmp zY9m-wVU6&dG(M@zR~7zeIf~#0xK$B65UdpSc_->zjhbMqgqaZ29BQlBJQU==6PDr) zM-xyMCp{ zeVvdI%Zns@5V0`#0F0|m@I;zfK~#r`(_NkvKdbRXX;zECir_1c1>Hv6Ovq&Ql*vlM ze|mX6ZSrzH`|8s)=}2tPob5UZ^Nd%tJegO{jX^SMf$jvleJVm!*6NSl?>^{%_Y0!* zyO|JL5nO;@w+!ZKL&$u0srTJs#JFX6!ToN5Oedl)-tFhWrg`hXx>Zl&NU;NEnrXZI zO#J0$K<|AE;$BKKmJAn8x!o-#=50`(GlPB*{N%Y59i-0TD0sT|9L_nRXV3Yw#A+S- z;ybhUW+gdXRDvzk+bY56UMDw!Yv>@y2TGXpdPyz^TN9oG_HfJkf?w91M0x%GHIEQ! zo?L=ZdHVC9yXLDKAr&fvT%090gMG+sBY2uWQIc?R)Gl&$|b+_ zftr%c|3YudB+9cUJs(U+iq>|M&eNpv4zR(EEtHMKY6nP8<43-=)tG=9Qj^US;;28D>@39?}?o`P3wl#_80n^89CM=2WQOL>Qib-_Ln5QC`kly_~oCIe+8z z04u}K`ExJl&cwJmf8phPJ`u;{e5uU;rB~`2M_~S4`a72)KJf`ip)|_;O~8uaYaa8T zM#vQA8}F0Th;cvpt@p{Nh?wN&H700}yI;riJu~^0uKc*KO9>;_w+QM;^#f2>Sog~+ zaW~ez2Ok)~yg*ix&L73Q=@`XtBhHNCcYEb^ z4bww*&h_h7!V>E}nw9zrw==V@r+{3XqrK*8xf7fWW0&QYxObNPEK7JQkb66`b1w9Y zp+JZ8PZHg>3G*NEFZt)GWwY7MOl@2T`M9&!XfZx#|9lvkA7EOyF%L%tI2LCJ59cxx zT@Btt;V;N5u|%ga{y--cawoGyYm{(JNgufu)QOH?L3g5Kf0{9IZp<&Smhhr!L5VvJ zconFVqz6q7%qI~qxxjYnz@Lv~_-psug$NpFp#M|K#yOa2yN@M$) z6g2Qnr3~ZYSXA}+pi$K|r8j9>%1+|dQ~EooGbvq)O00W>t_?XcC<9K?ZuA5qH&-6- zUBdrxF*6G;k4*M?qzzGV9_c5K5R6c!*FfcwqiPu*c^Fh4X=|8fw^oFnXYe?P2QfKsvZq`(sVyh83C&lhi3Rc zzFNkV7~aW>z&ljLnV?q4Y!A1B$F@BZb4=W580J0Y6i$1(F_x_tp~ zuin=roO*m`w8ZKip2adxcWDBr9%kEjJtupJJ`axSQwm4n_Hkr%Or`7%aMn#SvaH0) z)OBLBWL2fM{yZYirA7~c%3dQ$?6TK=L1)YA?p&P)d)*|X%8>`;Hd_vokfnTtFDE?5 z%e`AgiPc~EcCPocMMOM9eizg+%r;NDx6|(}Zd1ZU#C*TbbSA|R@~ive{^}R^doQ}Q zSrU6MKPC!6D?|Js3PJtrCUN~{~g)l*)>O`YFKbT{oG@A05h@wMukt~NjsIu^LEWFS0o1JmPfK_DL<_m8 zQ3<2W-tsi4J>;0iN9Z9lh}7AZ=c>!@7uYOnKeSssZ)z=#ZgGHL#=AvRIj%_w9_}6V z2|a=3d_qm#Jy0)*#dCqoq9atu>pb_Pl*LUc6?h4#Ui)P-myS@&S^Zc=4H#x3|1?=Zv@Vw14{9g4iL`Dfc*Wypt5u2h052ARW616`lO3BrJhp$` zOSq7TCrEe>+UYJLv_=|L-Ia zZuq<+v^Jhxj-r#9)g7ig+(TG5;JpF1hQaoMW{~u_&tL=FCotH+oQ+;)-pYeLyj2N2 zxC0W{T|>A@c6BYWMuj(fO~yF7kQJPpW#mzm`ACXeS?+z0uoJ%7qf`l)!Rr zWf;L+oV=qz!)zZ(InQjV>;`Gl1pTZPgo~s*rf1eCCMP{a>JynuR0mn1NvMp~pgQ9J z1dSiyl6zI`@!4S+$>SlcChWd7;mJ0(;92UTIgmk#heBgXPP39bvHSA>EM- zmRi!75}1Xk+ubs`yKYqh9Tof)@3QWcm`TVK`|E^a>*l%MludirY*3ZWRV-9D zE@#-g{c5;cUM0P{8NLFWr@EsNsog{6+dA$_DB=F>UJ^a7#2u^m1#O)9cYr4%tv&@$ z<9+L%NH3S16+SuF5ao^_!DbCVgB-Jwc5j@K63E$CP0r7xS8{3|U!q40RrLn9TW;R3 z`FVFc(d2z8*etkety@%?O-P40D_oo=#!&xcjB8?1tj(hw__;jh=k8iMqc5b?}{)~#6q3SGT0IzCx zHlMR%bs7ZjVzk0BY5LJ-@k~v)+zzLba9r<0H@$pD?ODVBi^)gLG`Ll1e>tx?OE_B@MqAd^nLyZdi6ISxCU$% zJiq`%*R?)INI&qli?d`WsApu=JIxG4IP>F7I<)itobfee7>^mUkXO2*cZDVaL#LZ= z))gFy2zc84Nq0FwSY_igvXYchW&mojs&W_483pbJHAcbDy4B5|H{BxnKG`>rk!L7> zajhGuYn_*YW5BMwJ&EjI_-l6Z3h$JpO`tj(GR{Kcxb^$FKeoJtD6QYy!HTS{U%8GI z*m^~}H<`1J7iN!qm5e}2ll4RXFPNXd{HTpb4%Ra6f?oDfzK;t6AxPQ5L7fx z-IZmpNjF|&vpe*6x1+)C%8_9!| zLK%ONR_t1N5j-ADzF4)?S~(ZgdrGE(&2;~J6%V~>tei`WM6G z(fUTBJg3QzhHnagGJI2JFZiLzn>F~!=dv!B`ds$2NiFAV407}`P_Jxx9JIk7JZyeh z32T3P$>m_A4*R3_rkjCqUVOrHpZQ?DFmLyzJF8+%^5rFxb4-qG0-G~UdcgaYe>YKv z{ipd=^YBusxZKz#XM)C0v4NddhvW>%IWs_49D)#tw^3CYz`JU=%0*~J5((( z95{`6xE71&eh+J1VTR@7z^TNChgDlb{%!y{pGdU;Cwm7*akR7QkI^HZ^0Nw@*wJKS)-JV7{$9J^CyyjkBWa)uAAmo7gLS+n%xn)Y2Dy#e1( zcz1^DS+F??yL^O>F9+B&oed37anJlZ)9HJ1uZXktva=giSyz=WI96H9apeNqcOi?CBtD`4rwk^@OeNe42MVuT)vhr)zrO_V+S?zog6+a(t{ zGp4sMs2ct+m7W%dZ(mbly{Jc@Z<-ySKRVY?15|3-Mv)s=Wj{k#6bUFHhS4BIuuZ1*~j6upikXnPhLm&F9j zosZjF8P1Sje!>lO9e1rJ+)0+17fj-i?y(PY$$DB!HVd%0`h;`HvfO(2OEH39X(>Xc z>;1!0nA60(>*Of6Z5@|=#8UXjcA1Mz+)|*=v=mw9SEdwAM)b^Zj+);!TUuOSV&&vb z+N#HsrP#AlVgW5iwv#udeWCQtuVn>g2uZv-*$+er=v`^=gFTriE4x7*=}YBG@HlIN zJO}=}8#hJd`rq^2is|;ZU+FnnovjYBbbCxeXR8yq?JM{C=V<%n790qkZntnZqYS;V zgu{$y$`tUZf^A>jGG?9?EA=+Ia7MSCCrfV8^}WB6;C{~IzUL-JNRaU^*cCFuBk{Ue zKS_JVI<9;f!q2=D%+jYEC;9C`NJ(^A6U%LgQBlKRo@`kXNi=RO=a80?;RaIssJnen!kmx!-lYf-RA zMGZb0z*JAx|FiUZKn!!)$NS?0KU7MOn~lA8Ef~+JnrY+>;ybZyB|yv7ht5Wz+IQ!G zc6jw+JSGc?uG?x$G9TsK0>#zrixmaInusM;EIz90uCe@#?hsOfMkze;^~s#eWN zp6eWX^a3xx1-((sv)!4!&;M!L30kMt^xroxo789 z@VEeH4rkp)nNzu7oo{vFxr{@9&jnjz*4++jW*b1g-(n}&%u8E78RjF+i6EX8hke`m z#W{NPB4^lCZJ!TBi?Bi zPw?D|ciX^Y>gdgGrZagrG0=`{%z05Mv2ghJAkMW7j~3C(&z?#N0{eq9mxs<|`VrVD zi>=OH25Gfr#CJOBQvY@p&Rjqb>b;;-Kt1zwgR|kKt<$Pbm{wwaq&oPMlZug{U1pSU zZ!T6g*od~zy2B`8bNl)_Lh1f>7@rc*>oEQo9US_vI#}j#m|~Hh>^b~SI){Iz=VAi! z`_>OrqX&7Xg#0gRG~^x1`JdIORK*}9yIO6g+gZ}$_+l=wUwIeer&>=U0uIxY>9Ut3 zb#pysRqpS~Y<9O%n3sUP(NNEV9nera!Rxs^=dziqU3EhVmhEf;=lOwy1iI25T^;(O zZaFzb`^Z$HpD#FD@7;h^`|7{`6+u^ypE(Q55al8*XEsD1O(r--8}^?F<|PLy|g#jiEEA`hW=DhZEOp?41tXOZJiVE3ATk)C=? zeX+Cc+FAv2-hHYm7s*htmaB*|5o3BGhW_hck?j^>Hg8pkF9W+FEcb(T8+qC%esL+< z$8+f+!St9x6lYp21I6j&-Pjq`Jb?=?ht4)?^WR`+NPHUfYcrwD$#Ya3Z;{4eZI`Yb zyg!H2buMp}uA9IHp*THdGGIv=hfAs*@dmFd)vmQ$=gUDiFjFe$@=;H_1>;IZtEECZ z-_I8_GC4?Va4aA7Hk-7??o}bG-Z&Drum0;_k>d(|8S#*s7+Xmcf{-0x?NnntghY*p zWodeai5d^#yb7ya`VgzSx2`Oi4`nh&!_>oMuw&j|YzEmxyjH{k&}iA5BQ#KxdGx;& zEQJR067-kIHAK`P+lgSuurZaY^|)*xy8iK7l3n*!0ykCUvH8Q@Y~sGDX5>7h;xyLP z-63=RbSyiTgL3OmQEI1RJ0fZa@LXaolN&*G**poVLfs1X$n&~mww>ayUug%uTEO$c zYBQp`rSqU?f=uOYBPw_)sJVR$9&gmuc4_~B$zlLl^JF#j)F_DSXODE^JkrgjB6+Hp zlkL{N>Eyj^<0|cJ``}`=09TQvmgZAXOOy8?UCeCiZs)YTe>WF45!1l$W7Sox%+y}8 zR~N%fERyn=X&s4+=|JCrW!hdHoDHM*)s*rDXod<`>gYaR?^-to2h~SDsTr|M29Qwc zxD!;v;7c$rGpfHXZDC6_Ylef`L#BgTZ>vDN(3myV-A#$@W;nlNoY-X7Tux*Ty+YG4 z$Dx*9II$~?dRXU#DcVZeQxHZ^&LbkirC5>;^4`$OQV zlx{D0v}d8&kJGb_MG`Kl;P$}c@+`GTt|k6lRu*jpJEksm?XtXux}54OX$3Y+eaf}V z2J+m@v&-(}`2ycA+ee^raHnnsTAL(!59{HJ_99vqH^jOmbFnGU1hhHH znW5L1UO*Jv2xKIv_TMT{O}WoN-;~Q+tgZXBbOP1z8m?hucsVmB)hd*yh=^i+tp|@` z{mT~5c#03FW4UVh2;x1@q#ae10nXSXGI22C{wODf<1FaB2ITYHAz3ZB*Q`x4ae z*M3T8eDNZ7;^9=a-lp-O+u=U~^$-GXWS!rzS-v!XS`B6t$4A`ra@(e2Hh+yEO7CD> z4XPct9prxZs=Q}PxW)wo?uzGFZv!)AKcCL48oi+8e}cvRNx?XK^oyoNn*yKE$C2_0tq zi;N05OYBSVEbyq8)SEj~ZU$TB-?98wY@n!@JF9px&vKD(?DOUQEPj9eG8IGS6BV+V zP$d4LEd9`*L@grW!sSMu9RNFeL;GqW5g_XvlXdG{Uzq9`%#}_R>E6(fp{2VGlAVF5 zX`+Gt;k{v*xkB9!i)1<2iel^r)%a*qrCUOnx#}FSor;qcxq3m^V{evl^1w_v z{jL8mgi37AJY9R&5K&T;_sd2cGl5v7`eHy8F&z*tw}FpAb=!B)A-O-_eao2jfmn$z zh(-{58gk(c@RGnY^QHM(?73`n{}5*<>#am`3vmr#-$md+cqV6^>YLuu5Nw(A?QZo{ zwol5&DEVZ!Tt?&&bnAQIUJ~u0ix)|ELaDN2J*Gv@!PNox2dVsE?`p~3P-0!kq}K?r zCkA<*({ILSEN>*(gpch5?@8g7&wOXZ%fmS7>|LFPx=*%)iSYlnn z!0`|8X!0pC`Sg2Ftrd<20Bduv?!Dl{DdUoH5@zh6n`UR&B_8J{haZtEH_;{I>=>zL zpuVtU#IgR>hNYE=)(}kTdjDWb&*|sSfczKFduer^{p?c1l-|9ZhADe*HcaVUHzU7E zX@(th$xPrLA@zIgoO&5{xtlVHx!&?an4NBGJbYm$Ida}d z0^szh<7~J&E#KMw`skiBcUpOlT$ht6i+Oo#+M5jn#iIkxp7~oM&g`MJx;oSQHq4Xo zqs2^kyz!x`*3EM1NAv>tD*NL^ugH2r>2W6ztHGt<5Wxx2~4hcGjJyeW=5q zeD#OqJ6~RrRX00in@dx4^+JK$ot?)o$*RZ<*=80(_YW0(Rbp`hip7+}pdXJdlof>A zBOiVRCm;?+Asl9a;cqk@@}jmYFV2&|w@9ySB6O9gnKyDa{QL9*>CcNH{9+}jp3!8q zmL0)MA5Z6vipt#XRucYE29jg})7WW9lqO7Lw+2;;xOdf-hTYERYc+fu?gXejNuqpi z+^G|n0snpCE@W3GiVsgaCyI~w#GOBOa}~BKyT(X~PH8)*Fv;|z3?Xnbg{pt3pa|Iw z+(H#1C^nKr1w})de*u@}h~9ow$LW6G=Q&P6?Xx1zt`B~URDJYA33t0A4{qM2@}8;6 z-MHUWfX+Ylj7Uzl?H)tq&+-l0gG6AK&)bfk`%lz(w(V}bGg4z#I0$)BB|e# zXXVRNye~t3ybF56%9N4{<_^4D=*RwC%rzhNe!?=$`}y~`OrPW=f;9Wr-`|ox#Lp@` z+ci~*`aX5A+KV0NflFmS?~bB#bp9DRkh5vId-Qrz5FgOm<#IWZH({E81s*3SNC^=u|bJvXp7FUn8j^*rw1E31F z^L{U}9?Cx(E1usznDASv`3E+1?z^T+0<&0YW^Y<9gNYr@@4o}P^7{sRaowk!&B-e= zY#)Og?iA8dBL|j)kCX5RP!l%Z&jNNnI~n_~ zK41pEsyO8#Ir;$Rirb8C7O(nQXfwXZyEcKl9+KTWlmAd#Kr9o$GFCI+nhflR^ujL1?(b| zWzb_1in)D9imRU1Yi+YPVWZ-wJESke)%wAOKa}b3WfY;>srP(Q7QRj9@H{f@RrN|R z*>Zv20o6JXVUXV2`SjXaMKYg2NrL5z5p{PQYS|Iy1&j&6mXlbrI4Q zPz|{<6Wu-~qK2GtAYVtI1@FquyA=fWZlVek45XSIT7m_|kH2E3*T?9bq|UF8(}xFM zk@I+c0qa{H(Jw0S}HuAo^4fjzC&@+jCgxaIQ@9`b1RnNJX z-G$68_ZZ5_&e*ii3M4k6*h+C$+I`awyZSEkp9rKQyIlBbTp(3nefLo~QawSoD6N>S z6Wz*-tt>e`FJgu3aEBZ>#(kNr)?J!0(K2kaIx9Q8JOhf;Wy!%J26^*IuU7+q0QRAT z4QfzRX)82I$W2lx7ZTOIwwg^@*{lmuDNg2UO;v={o|5Gxs1?4xf{CIWQsla48(%M9 z5#3qcd3Ew5EKKBK5DyI)liUWj16P54n48Tjh+xBvl@q}3dROdZ9%>gGb{Lb&?6!H_ z&vFRmf#tkzoBHy4b^HIua~h)b3eDpdK7w&n%0xYHNpBArY`giD^^UoAsbok*nUU zM_9{B|Gr*sBE@mJnj)ATaN9JK*bT%+wS{(TM*q2mDoUuy!0t-v$%9t&)nGmS;e9;# zKYTAa-n8q@qr9U(tlV7*|9QR-CL@^2@@mEPaKM9^;muMIiQp32AU(kr;C0|R^xgNs zAy#1NLa|FDI%(l7DQi?yCKH$&`1#E_gQ8Z)40Bqfg&tW_4)bLOY;#r*G0wDw$8f9( z=JlwKET-ESl~^odUFc`nSQZmZ_p@C`z|XdQX0oyWVt&S~yL7Dn(R^q6Wsmi)>R&@G1UVUh@Zj*jsu_3tM%sKT7$brU!Pyc?|FFk-!v`QGR0c3tn9%7etz(#4py8%5kpVg?LnxHyq=7FuL z+;V5^mdt$lmS97eJimFwT|D$J@E)~X*T3B;=mik z98nykyFJAl*XS_lZN3*@OOe%*hEfH#VL_Qy8g|``9%1Ep9c6el3S%{UqsYn{?e;Z{ z>c;;Qq3+rvlVv}&^p~2)b5l4PK$T8A0y#T5i74~>*K4EG7HsHm@*iLp@pl*p7;1Fr+oZR z`GIF1m2LZr7;p7<#@@OXx6Y$tUmUY~rmm@P<&1Xh*(aAcTP{918lqM%D^>6R>)~__1PKD%Buc_&NF4b>p0V&DGHr1FEFGcSeb-~NgrIEV|rQ-JoT}h zSinvSZw}Cjym>^cb}XYj&#-+g&z(wCXi$+e#J=e`XO*+IphGMNH?LGM1a{Fi!S=EKBw!^IbWVmbUmNhUL&Y-Lm)}St` zW7Vshs&&Dd<}7b)6|&up!7=KHC4MN|SSoiYjeTC{<+A>*4pGHz+E#EJgA;jAubkZ7x>v#Ymcfb z-fdJdzpcn@7Z^hVTLOdQR2x@oI?b3CzNH8Pyv1)2kYQRIh9vg}ficN}iZo}{1II^4 z!qi-j z={%X*c~(tWlkZ&l&IM^FrH2{+WcVxBvkW`9tdI^1&~S%j?dBX-=|$&a+{Nf84boG? zzg5~{CvX3g`EqiDW>z?rUP2#Ji?7J_b5!fyJVQpdw8Va@HQJrhMe%yRkALLN3K`Fc zuXw!$?$zEb8aq+3nC)_&zuA2eOVj-U8C=!f&Gn(V#rD_6<0VIyw4qlR{`cI`?i9_g zcQWi9&jsxTlwH?C7CN!_h82!ZwyjP{Dk-&H!{9s>XWs8?y46KP=*regyQbd^p16cB zzPFg}24A%*!pD`@pp9c%9j*{Ft(~q@(b{=}4U-mG?UOdSz2-ntV4ig#GdZ}LV3VXB z&Wt%DiU!jcw&JVtzFuU$j+5PU1$kSTXhF@5yVu*3T%Q{RRzim{j{a97;|ip`5V+(Mno72#y6uYu$fu zDTT4H%C7QszmKGAUu!}E?4;h*9|65@KCEZDf?d`4#gW8EK%J3S}Ok`?q z-kgS)TR#;{M#y@^b4(rd z*)XMRbTqv-%N3#28lHv}R}UF8H{{Lyl2-Ll%;Xjyv2UyUT1Yp-7-?m8iG*x-8Vhl*Ydn6b^!+!9zcX5h z{fT_c?_rt`Q|IhhR4s(ER0*hkkU5zil^74MXNMPPP@{!B?@mao4ON=v?1|o8a8jDF zF1#r(RZ%YAt3hJ4&|z7VvstU6S_oZEyJQ(H#Hy8HClol5M;he0E-E$iYJ_Ze0ZX+K zswY=m#IRn%uQQ|>?T$CmLEcc)zw794t$u&d>CLD#Fbx=&AT$~`#o+XEmC0rCK4aFv zRL@>z*bVDQt6z)R+kIPEEi0!iWR}Cgz<$TvfWEhE)$cf#XTrfIzh{DOH+EwBB zlEV0nsPkC1Hf7_u@bRRst8iSy28EM-TzOa(PMA~);vEwT;qf07PHM7>XlF+60kuyt z(%=8I*^Hw?${P*GmGTj_P1=#PjqJgzQ{>#)dqANK zB=$VxG7j18+#e*mUfQ|8a$awEWscMN``>cUHl-eUa- z5~zclI4}Hiptjw?ytMpzHhN^h$?MRppHuS{M%ho`iK*pG@6aqL@=K{z?96yPB|rGt z@Ial>siS1o6Ai2qCo6YCtGSmU1LVs0i>*jipMg3>g{N)QposM$E}JtiFcUHfLs#EZ z!_ZY`{H8N=nMkzk!$+>zU~b?4FB0uYbMbNWjXISP3{Blx;@2<4Z;`MMIHKntWW9%YBPvJ-;gF2$~^RPEC@KY=F=L z>5i#z5)(gDz?<+KWn4-)?itKVm>cgaV|b^_7`$=VKU49mS>cAC6BB4QmM)(t@Jf}~q$MZE-S`p}4bZr7)vp2T(D6>LP%1G`FO<#n(< zM+`(*huB9h0rg<7s0<)Uq3k1kf+j3A7u%h8WrWp?eI$K2Q)oEtV)F4d`ul-|8$jgr zp8Bh~gxu+1H}@j>if|*|=0Tm#g;mOqYxP&d3G*vw#+KrI>HcpL$!4OC(j~bG1$gUr zsl3V*U<9ZI*aNx+XyAULL>{_YE4q*D1@%U&>;8r7J8-~q%KkXHNcIp?vS&kV7e2UZ zWGG+0C!pIoqtK!=#)CXu;NiC(HifY3IHN0rY1;Dkjp5Z5#9T^t^{Bgybacg0I2j0DD%bNc23FY%Dyxhe8DVug$0&hq()LzD@+;1| zw9^Wu@hF|y>?JpX^}zc-{n*mbBxbe=CoL>2|oAYh5R9B$K~Rqen>HSi;!VL!S2llU-&*;U$f62v zs!ginIt}6;nlx_?#!bl_O!zM4zvj0_tPE}^$*@0){~(rO^f5X{??7?}eO(-pAtVn; z&a{XX41a7k!B*PqUNi@T-$5>Yn5+35)B`iZ6Le;m3IhAk_*6;Iu-a;Z z#}kb4cAL{Lr%lZqHpg7%4%{dSvy#(z>(5Fq)6yNX6hT(;x&@QRKZ562Ur6ss5zfbZ zN)CXfsH4bj5obryZHHv1Uq12$x8@_O(zZ9A}MrnW^(Zyv0Ciq{lfdC;a< z3|^bk$NnKn#-wZK?nZN*LPOjEYC}}u7X3>@3@1_>Vz*bX@j=QF8zQvF)M*JvBEHQp z^+?3SD?S|jaArAcOHY-$G{ZU6_gGNt`$rZ0S-Ej=k=%JFRew02zColO-tuSsi}A0Sxxz#~ ztw>c4Jt%o|S;?#T<9+Ku(OXfdR55EE@wxnjqxWC1u;nE8kNE$twWunY@v5{4i z3?{iRu_-4x<<0xD*aV|#T-9+7%3K$!oO6%1%1rqhd{p)LUzVuEr>(MN>%Gi4S9|e& zZuwhV=*Y`c_^D?{VGG4~1ogQuVa{f?w;8zpYckUMtEn`{6jhtmIC(k zo!^Oc#7CIMu*mTCd#kZFTj^T%l{>ezgn&*dW;-)JNr}iW1ncB}xaStVD>c4hp#B_P zn)0O#08hkRdJG)k-MAZ1R5UkYJ$rJFrv2?w4?+ zG{M!Rdl3uNr@|ZtU%iDNHnQH3C&5mT379dLN;LFJ$Hw`7)ZID%FKx zZI&5&ZVt01FqYx13f5(Y+elHLj@Zzd(fX<)XW->EQn?zB7mXjLp2?yIc$D>W)h%Gq zvfiqi@(5!R9i()5EMi>=8!QCBqiZ^ko33dFE9Wo7R`ItE3?-l)A=T*7e`I0TIO2f{ zN3^ibh_^=kP$N0W_u`8Jx-C+Rp?B3=;BE_oUwTprA0v$yBU1tgE320Bu)u@%fUrYt1Y*_Y7fY9PG?K4XECF|N5B`r3!aNu-Llr>_G9>-mC6|f68-?SmTd+Y z#o^xNA)E6)apo=2DlFabk$j(OGX#fY^?U+v_fnH6|C)3HXT6v|~a z>Tz3b4R7HnZV(x`4A$Uyvg*kbl~0)LX62}k_Vb)tyqhc$A>tuf<@ z$CJaOn8TQ{ys|*<;tdC7%3|=`%6INgvBUIV%AreP)q%+w2RH^-HrBR*ig}9uly|R6V#_7cWt9;kUF= z&X)T?t?9GY&|=wsMdBvR$ad^;nFaC;FSh@uAFyMtbZx|%6+Kw#`^Y^8p+=0enmXG`0SroCSUmCSMPxeOt% zgO6*2UA+la!;N26H*AjR)nC1(8SVd?zWRlS<1IGn9`%t~Z#Ndyod=#nw35GyM+i2LCqtT!#g`xbTaJ<$(J@73oX9H0AjPY~ttI$jw!{Zl^T^ zcRgM8Fc0Nc2j$nseg}?)%xorhZMLn|BxWC7pJoclG6U*5;} z5Bi;-cjiX=;XJ9e-IH{^Vi)+HzJzqfh|zS|+RuS z34N2T4fLYmvt!Hbxns+uY>%#7ULae4iCASh#w(U%KlseXr0|RKHA&l80f~I8tEd*p zmR*bsWGta>x%`+3SF+J-h{BU)9kCtq?_p}pbUAaRL69Y)wZBsV{-#_2inUXGE>cGn)9rmxd`+>Q&a9E^zXFEDU_w7Z2cLtDIxbxu0fSa?&p7xnVt4#fMlIz z*KPvAgA(Jaz}R7B>*D?-UN-v&9k(%k6SBKXImEN8#Vg>)yy{j!4iu2QOaYaSZibG6 z>Qb&W# z0V6tf!2v;grpGIMDxs52Q*SWeEUvENcjJ{1;F>BKM0-c_Hk!zkSS0K={YKeI#WV`8 z`LKrl=!Z29Y5Im9o8|l(Cu7s$b?`Xvj?U$m)B$;TJiVXT#P;~0y7(thGb~z^OTcnu z(nPQ#?G)<#<0QwP$U&yB5L4e(E#D>E&oRhI3ZEvw6WPqVLhAoctE8Pl^3Rf-u~W~? zPhr2~6LKlhy{uE@S+HBqS5wpMty%UL%PjY|fj`va@UEN-mIl|p7$Noy8B3^kfZysK zhql)3vJsquwK{OG?t^$lW`kXlhuYhn8NK=zIN_Q7Qp^&%y}ZyBvV$64na|!4?f^ViiooVlY+`U`#ovxRjQ6aq!(1{t$e4ixqLs4#M7&f}nD$A*TKFljX^z+YLBz3Fz0G#OxcNzs(vM|qZRmh!JL*+ z?5nS(UquBY9J6j$ZNI!g)U^Sp*W!p1s3WI2|2?_WZ(HyfXYtzPuslQtYXcMOIZxD^ zQts?pzCTUoBuA~+k>t+UMnw&r7TK**ohPQ8TEiJ#*yqy`&$=Nf}iRc$%AV z+p9mf&t&2;UdJu+qj*Igt{MZDTY=qA$pZyZt8HLiP_}NWgA;8h!S;bQmebE+Z&#uF=mWeyVH{sgHTH`J=DUT#N3@Un0aF>{JPvpviUfO=3RMOft*k?YBdk6 zi8?L6-ogpRglg#b=JPNiu-tOW-!IIUu0>IJ67ShrJe;Es&+*VC>z0+Aqh`6sW@I^o z&TmyH$;DATO;vI{*n?H|w}ZVo4&+mi)lyGMuvQe~@+D~wF4X$^l!swf+A|NWN(#Rw z{Yt2B?6^JPAbx*pB#J@aOYQ($>4#tEL2s&+ojlY!)+p6S)RB%>MGFsi)m5gqhqYF$ zIDCOWto(~Z%l+BvC!Mjwht$l>G$TuXaG?xk<*d89SRGi-+>?gn$umUNz(=qeEDQeh zt?rgMRdy08CpND%F}6LSa?Uw83vAx%TH9L^6#sq-ntcPb>NJ4S_E4fn%6gHGJ?Dhl z&QYDO;iPD?P^Q@da^tY1mGL3#8mR}yu)lhOZFD=vNFFXRjG96#8%EWq_Z%yKP*e(H z+JrDFXKlEQD#LjA5vyoWdDI%2`Ljsj=i70m1juR5$bk=r3lmP z#xNQOCbt78VV$o8&n8^bgfM=mhECoOXBSp2BUr~`+sf9a%AoVBnm5yk(pS@UFfd#< z{js3N<0UietNWpcH;-zAXB(*N+uhTB-UVFXLnSV=vcDoTg)%EVL zay@LEv)Y~nc<^3Ma;DelSR_vn_C0t^Ul~vH=R~Rp?-kF3=PyI%wdoFSN;>BBs@_Fe ztaUTm$D(KU?x1Y!x$&HDt9s{&LsVXH_ggVrZwP*pkoxl81NCx>4EqgPg7dFHYIlrU zdO5`u5cj>a>X@7IWd{L0_~A_huQ|uhZx`oH6;9e?cgX;C3 z1D+Hg`|cvti?>~mRq4woF6QAVc8@#=&Py9#m(?Jt&hS$k7RdQMvDDFH29Qcgl$xuVVL19^CD4GkIuZ zQWiL4U+JAMb1sZp=SlZoQ9MJxX$~w#&(o^`E+DGJ`b|cGZPLc-t0M2!+xp5x6?;)N z&Wl=orC)EA0UyX5LR~Y=%Dzx|ysRf)ooU5=Xc%j}bOSX!!3#g(g@5(J(Z0M7G52VC zdaleEfVm>miOynfV-8qq-6G4tQwZnwbHi25z?*eQ{eN4dIc8Z?R?Lcp!qne+L9%n8?c8E%ak`ozuVmU_4kGs&OO6~+kyIil!jGJrLzNN z!=Df4%W`5=zx@EVZ?qxZ_7-WF6~6RZcR>dHl*{RcH`lezYK-h`nSUuomfOxWHSU0= z*3DJVf&WixSW3=`^K3_FMhH^76I0jlW+$iRv$)GfX^g4l&YqJ)=EK2Jc}IT@XFE^q zA5`S=aG!JGVHDAsU>k6%qT$kR@+W~}Sr6mp%1)j$%!`$d)%V;2$%9`fdwhGGslQcD z-k)a{$N}Ey405ycQP@GZW?#|4WC;rZh|*W{t6#n5y>c$0-3q*Mv|gn2x~D_3N550J3XPRTZgeg#gThEs;2bluXwhKI!>?}Iw+*)!Pp@^x@jn0x|&Mg#W zYA@zJ6EhLEZYe(#Kj;wVE|c3YrZHgYS>Op=k+|8bsVpgXYwCSdQyEB+Oo-4VAH5BjoP2Udb} zz>z60GlT7v-!?N}T3)UK@l)vqwqb-j4y*(p26d+O0C)<&>pK{mg(2p*I>an+rZ1m8 zsj6g1lv&xpOiMQWR0$)VKa^UoxyHhBVZP%*cRwuqV0Gkky*$NBwU(Vh$-|4}Afd~d z`M>;%sC6S`ZwJpuE+0EA%08o~ zeHs=yqlO=so}3as#Tm1)b%8VHmz>nB@4s5(TKY*`!0C)#H0?Ae+^&2$#USQ{{FZ8U~(Ab;>twsVVCS)n>ZtJFpwdx6xHm>ta4R9jvd(U*Msx^_*-0 zJC(5Nh}D=8Z@F76&D#VUVCkt0YEzG`WG7v%_16ncz2S;2h0gS)2U29?DDCx6@+L&q zFM`|IVzp=Jur^ii{fnM$1rBD(&TEi@=4^M%neoPzH2JmK)N5oo*hIN|E)N$_iPpd2 zM_#lB-4}y+xS3kr4jxafHoH#Eub1Qo@F+}VwqH4WM)k~>^+YtP@#fPRoI+{KxM&O$ znYS4-;JOMXeaf%LArYALi*)3nNy^g!RzEG8S%>2?#uE`vJ%hBF&Ioccu9qdm)`6f+ z;Ds=3#~X|!9}BirNffkmwJiCvh8QHdvr4yr=G+L2WNt*?8@ZS)-Du%58A^Ns$25)w z>sh%I=daSGuk8XYSYH17JbCUW+9bSc_APq+N|t~8iqrDV(fM;nD&aI&F%J!CuA{-0 zwCle>J=WtXP}{Ybrl_L{yYiszdLh_}gmb}S#`n*I82mF^|4~~CM=Rg;a`F}pD3DVK zd_c41oiwGkvwqQcY4snPl+qw6sUo=@E1b9ibCNmy$?QjGGn#rD?5r?*=^psFrgQz` z)J(Z^jCR64j`i*r`SLP>eB+Pl=!94N5vgiCHp(g}EU@dwVKCs9x({qo^!c-C?vW#( zsBNFtDd`Kv&z_Z&9;ec>-37ONfB(lJjwj2x8L^Q0^E?Lnx3SfSC4Ixkt14_h9Rpro zx$e?WOMom@?%BI95KMqII)^ z2(6oN^%v8eCx>5I!|A*Dn^YM%wbV*)V-8?Z!m1q*f1zZdS1V6@wPHP_wPFsU^c!x_ z#DrRTiGW)x1zxR;o@8h#Jfv349JPMDrlD~Q$+T9yZ8}G4q1hfS4|ue6rmSVzX2*@+ zLKoeZK+6gOw*?LaIOLz9G4)ZBNP{!9RV%Heh#{c))F?M@44*}w8RqT_sFN_?D2TK1 zktnDiinm9p*B)(FAq3=2ewxFb^B;h^2{%^#9X+(~JihlZy*BlB9gaIP4?Kw@SiT24 zSW{VwgB**0`G_5;hB=qgYX{|sda`RK{ZyLKTbjsLvPk#YbteJ0VH&U>x_6P>w2+c! z8lyQxJ2aG)cVMbIQ;si5hr9#yIz1Po`;5d2IASNMVXSDc36zW`9vNHbK}L>Qw{F>9 zzu7~ME+Nel2+1((yCFnYKnBj=x%9uIVThKd%T}*-|NAbR&>XE;Izfrt?vW;+kY6+H zB(2S7V~e$=&9qf2pY3&*De!c#y2X#k|22&5o>1@YyaM;3do;=Mmr;8Kw(s@|+##{R zX1$^oIEN-vZ+Bnt=%QY>XL2W&c-YKtOwk%Mr4 zp6uO@+Ln2aj_f~_b)f51hsE{mp_MZKVTvlV8<(*nd+`sKWy(}uWj5_)ukx*Cf5i_{ zd+OG_rh2ZQTO+BRl3a-ZId48iJ?48;UJ1hKWyupbS(@L2Rl(@{91si9X&HR9ru=y= zGsT>`$WLV}FES|pci;-^9eMQLDD$>`q}zS^!|P=T*p2s(gR_V~cD9Kh4nB)Vpx&IQ zHIw(t!9HO2T(#$?NKdft-*+Hq$Kb&ksYd-QCi&@pXUT%}DJt97J7u5rE;gMdw87ZB z+Gd}UK%HylaQLy**v7x9F}KrDW3FbQ#?D?uv2)%tnfZdNii}QA(0-fT>gy`!(Vi!! zd}!I56DjeGb0~4*+J~L*9H9a?6?VDXa7bz{(j;*9VdNZu4G#ziD273Fo04 zW}4R(G!W}*YKWcBZyKb!B2L!wd>KvI{sCj`j|H{xpZ-nZm#MHOzgHB=??vr)IiLB3 zH+5h3;Gu=z;uU^5@owR_CKNt(+KVPy@n0$oF)f4staeYFOZ>Jo$o$xq5QsE@#`X#Z0b0rbDOuWIfo4ndeOG zuZDlyHyU`|;yO|$*2YgV{P!4A}G$f-j4T}DDjL|lbZ@P}8wo<`9Ge;h(q>uaAp z3=JJ*Ct(#ezk^EAfxn^XNFAXp|4;wZai#xf!k7EdISx`Wdg9v{XU~~K3S(@&XQ4-9^-}X(4_EYGZEqz#v5j$Pn)ax3eCb*O!{gwe$rvIxg4W? zsiVB}G#o=SZ2^_e$v&OuJ!9ycV(1)6Q0bidH*_AU4$BH|_vWdG0ybhGhG|`bEA%JTjx)<$pQejCaZ6HL7n%KhL-> ztGa^jwq(yX##0hrb!e9|gPsP`l|hVFQy);P$+6_XXX;fmL!Nht)|rG^mNS1Bvo1R3 z(H$c9$czjPe-uk-Oa zhtl*3(Mr=?kEZ>El_vQoG!@MAzZP$`d56}K4tVOx*Dv8zREuuD3?lzxaZS4H`^~Sh z>FoQ>=bfnot}IR%`h*_vK7h6uvkbRjypE2f7s_M}X);3bhJ5gl3Nnnpz$dx7T^Afm zvk{g186I_Hks&Rrs^lS;^7gWy2(7P&53R=TG@wR5;#K27!pe}-z-pprA2u#}iMI)| z^RYw7jWsDnZa1SBrWZc`SE3*PE73J2Jedros>&mJp+|HkBW|T`Q6ka0Q)x!?+OYFb zUbn>Hv(FfkU#r?^Kb%^36j!j=CnetGixVk1OPhH~Vl#)HGQUvM{RukGu~}Rm?a7C5 zZD-77{keJY<)}4=A=Vslb}HKNS<4wabU~pky`2s$H@u>~{yv!qcCsePD`4|@w}wt8 ztvV$!+Duo&CF4~!gp9q?j^{+Bh-Rj1N91YZhtgAHuNl4bk~8DDAqCD$WBOIdY~pnB z%rZ;HhIAfw1rgdOmP@}k6Z`3O{UH6+QN&kL>-9sLbA|Vdt=0l=EHxn@x$(Z*Dy7 zn_5!7sU_u`<4IM|v;G$Id?{+Dn0h+_@;Ccgb@@;g#%!XsCf~Q@iPTc$;yNPkW*~L( zI#wAlVEPSglzV+eGCro{hRMa{rJSDN*Q!3N!y^) z*Vju+@OegA--0^I8uPAB^-`B$D{FvQ8{xL(q4rj1$)Hb)i_+u%v@59;%pKo12b?8GcQ4Ed z+P4^QaWcmUO_aW$V$Q}zHI_}5_8lynEbTmVdFzYnH9RMZ>RV+u##RTp=rh(E>9~4= ztp8eVR(zXdUk@p+qfNM|_i6UmA<#xjop2DvT)Px2doIQa?B zi3CjX2)Je|M!FI()g^%YjEK;|-0iX-61Y|zlf5i!n&%|PnwjQNbRh*$il+Y!MTb|( z3V!1c<9G0^!}$K68*BGYFW+YfYrc2=O}-dNZdE_+l{EK@>ZOL~t-(JLfWitarEMSh=0PiJYTM^9&IuP@zB=G7y|`(zsp5Rsuo zw@vV`%=U=;lK4KVFXkjP1M>)9!3{LV+(Sr|Y7)gG@#YqKp26;AJF`Rc;%~)*r4BLB z{z77zoJ^XGYUlBMkDwbE#8Ue;yA{|=~qHt!o9di0Xh!RK^@pYtsveB8#1z+MDU1M+<;d{Z)k@F*eV37;8{>FjN1ol1$3h`9)nDL;RvkYtLtR@d)~GKj3YOXNpnqAD4%2Q9qJtDq@_oAQC>NBDrxYx)6LO+NsqeaSEUGUWWk zIzqn;!w5{b=Ey-%X+P#?7o8CwOvsme3ABKxU-7x^s%h(|3A2{TsjWdvE10 zQR_Y$Y$fQP><;QjI{s>KBzSDBm;L6U`Nz1L#qehaCk2g@Z6s6SANb7(|7M`>Z=VQW zLHn=ueqP|T4CNL&eJ;H_Rcilk48wJ@8{u6bT?nf!a2u!!;$aXMuj~P}YBzf6dXZX> z3SI^>B9NV68{TjB-gn%K&?o%97apcz(oF?b349n=0w0+os1leUTX@~Prr-ECp&Zcx zH+$xKnY7J({{~{)B#5NXT~Spa zEi##&lO`DR-^bQe?!z^Rn+!i zwb3w;XSFd`gX#hK*3Gu|oMxp~1B&|H-{g9(De8r8QRj@s0yWh>XJP3fa}(bmp?JsB z&RV?bpcZeZU%Z?^saw2VUh$d{*50}MZwNWr5OS)i^H^4?70ub>HJdkqyM$~K=SzP4 z3r&|QL;U12M0;6F8>n^ivqx6eFL5rge=(FfKYbM~l5W^@*`Z(KZ)IRgX@V8`mnw?p z|K<}GAMpP67g{3n1NLA@_LG_R)hOn@HqIYjrHmx3hTY@fr}(EPrIq6L{6ani&js5B zxh4dez6(^_{nqqSs|&*VPfu8XL|BFOK_jf?AmLQcs;ZzbC7BBCX)3fNqtvQf?fDy% zEK4YLiCjW_YhUyU0oTqRCnI3vVyDLkooYxO2D~+?$D5N~?k#pL`m)e1=4AF{`qU^= zsCXamok3e|WmWg7BeZY9tzH(@qt9EDy>akLNU4ysp+d#|Fi_39i86*y707DB%21R3 zrw{r=n3G_x#39UN|D&(-;tGuZHra-urzRg}^oMS*F7z@@#7t+--}6e&^g{|Mr;+{) zPIq1es^s6Jh{V6sD~hL4kob3*9|l-{Fi!gC!bPdKrP+5U%M%|Wv9o4YzkWpK^IENc zC)pX)^riy&gK%TQvy$b$kI)rzd>GFW5%(k;Q~hSb$bXp+>JbO`dGR|4mlB@sg=2Yy zN!JZjX+AeuP5J_7?aL(@&fC|%ACfaqq&DSS-eqbj=ob8j}g>Dgqn+4Q{|5&{Vwq_-;|NC|`@MM|Q+qDWQj0tp6C5J*57rJaPL zQ~^aqiklz`0zx7xy+i?NLO_}z`2U@I?{0$ly`SIn{GVr^{oUzv=gyotb7tn8NXmgT z1Pjv4E{ReWU1Ap^7a5U%gl}@-BK?JU_OsxeL6CDpy1$Vk@y5r8!VR-~?bdyxK}%P1GvxHhwNSa8+fY z;n8?Suk0ck`y1dEoB(hOnF#Z63$Nq3R~5?tG4+T|lvM1H4+RP_&14N!DwVuGhwe@=^@>LKi%1V|Kk! z>Xu%d=}~wy@%zju>QA_N#BBI4g*^Dm@iaOP`53I;cs%#@(265)KdKje3Uc(Sz6u;vT(9;_>gQCxbot&Kp8yE*#MYrQ0jiL7&)2 zsg{VN0B>NXPNPypLW759{7D_p1H_`^W0wv{g5 z=h+p`7-aIJuPE7)Y^U*X^GakPuq*Haa03R{q7;2LYF0f_YJ=GbXRi6;Hs!GOUvO@F zw0GdI`bT52cs62j&CdSon)!#GGm`7`DgA{k2CyvYyjDKWUZZ?I)?NtYRmR2p^G5gm zP0vBb`OJxALbv4sk^*EAQzno{#VjCi5&sBeky1h(bnl>U>hGTH#7JvBC%q2uAOuh0 zVBi+u%ZPTvh!#v)=*aOQH;pneE^eX=Z$LrVhi~OEEd97w z1l7BkA_YfT)Z2PCd@Aj>Q9=OaV*+VH*XkwW5N3B8P+!mPH6SmW&jC-OQ}1e!h`S}w zTGCLTG423)o!qk#W(;5&$Pp@sx6tdN$@i29B+Hau)m`- z<-CFY4uzp02QBQ4x1p9z!BJEZvQPIk!W;x-@r*G;t5~zZnR-q-{= zSsCsz_=?k2$(kt_vUYQ%n&?EYGJ#2K`H3Y>lC~Xcr zYT|8*f!rz9{X@3@^QcImF741tmE`&p>VenM$#npYM_|J$MEg_Y)epiyi;4DnqZT^R z)`!n$RfZ2ScYxj+9uRn^l11JU^Xm|%aQm5tNu@Zf!pO;rlvZrTd%&fRn% zkh|$PAXDh&K&H^=fy}35bkuv@b3mrlp8}Z_p9SUtM|47eLH=JG`7`Ul{pS}Ta|}CZ z6rNxQ@=>%T{ND$@477sh=Xh;_uY$|pO(kIABdHYbff#PJ;i_h^`y=3X!_C8OuO3ef zaXnX^+H^&xD14tuWRIGO18;D@4kBM_qHd>V>nLLynaVcm;7x&b}B|FEF$>i3=| zrZhX=mO5o5N~6pfphx>nB6F@aiuS|j0BX6iyH3_m19>6PyobIJIAFZ>Lb$nA_W&OP zPjkp5RQDoB&|&RsTZgNMO`3LKM`bVm2Ua=sh~7CoX96c=VwvFKmJh=57zR{baQxg5 z$HltZ9V3OZ+3H7OsZNlSl?dS-<`XD<&0{v=wE^#vorGfA$u{p;esCcWA6o7ySfhf} z9h8sD`Vh!H^cOuxrp}zf6Oq!(_n&}c0>q<3`sidVvj3F-=DBA(BPf-V~cF@v8>p`gy( zSEGSEMw$S5jPwKY7|8>&tn@gL>2}xt=*y_y4JsQ@Nw-%jsC3{>qdu6SP9j=6sH?hV zbUU+7+rTsZp-195RYeXRQKQ>NjRd>c1hV0Gx>GdJ^c3MK17IynR*>mU5fmhucZCMyy4 zM+cB!Hh3A_b!iQ3joTyRfVIriQ(Puo1Id4aqwaxMp!ps4GU;ByMlGQiWm*c22}!|% znGiQL$gHW#kP$GI>cgiNPInAul;27bE`J=2<#^H36xs;9sNZO+?S1l#qf)rI` z?`dqKVgJD#hPz{8?`9DFO>jkoef&A!oM|l2hfqab_cn57Q5bsz?XuIxqco+|f-Kh0`AlKeLO2@tie!z&DrHZ0w+Csf4oRPTW4Xen~63rq;kKjF!-#7E@L?rdju7^4srgA0RZ zb(?70d2*y)MaNhAfn8av;|G;F9z}H4%oKzdNwEB&*OBVNrD<2{f`=G0=k^VXSl-zt zW+s>V(cqUbe>jXw#Co3dD)ZckM4acZoM-U2-uM1i%fcT2z-#Z)DhCA?cyAS1chKH@ zL1m8b!n01z5l||jcL!a;J{s&h{k35KL%riI=R4?Xx*UbZ5G5}*=p)*G-lx7$f*!ZH z^Irz-lspPggFLF^nKoCaoTZpa=)@~LP&ZQ8t1Q+ipgzEc(i~C$SXi`8yC&O1(@5&2 zQR@*wNr2HtJsr1po2| z6CV(;pmF?}-=b!~CcrVk?eTjfJeKJ&V{(59H14hj;cjx~cw~toic6~j0d^?g=1&0Q zwZMizzX^#r+joW90(rvE1F{mVg6c4ox*Lwg7@MPVn83^`VWPAg&neOhsNTjngc_!p zTyT0a2K&%AIp?c12grlI7|6@Ao4{1u@U7ouh6DCLwX1Qeu98q>!cSamc+B6dd(4Sh zVHXwOOz0@ub~uwt)@6JP=4xJ|v@7g~g(W^UWuGR#{S=r8UP!wqp}4U9=ceS;Q$oBK zMo$h5u1WPL^ES^$$^{OLIPg=ckM*GB^7EJn^cBUAITCF?>P2M9nk%6Whci985Jsy( zJ;UzZ$YZMno@=Ngr>`SMga!__(AwTGHc77_R(rJFR$v2Q1+bCj)=jHwh9;2oxA2V; zU#(PaYccHLn$;bvEztVvhbcQZ)gR<_Dx!uVgSnih3p|p{vr`b)Ph{`L zWoFmgSd<3-^p(u&K>SqL#d*bHqh9cJ;p19FSx7<@O^1_LbDsk{S3}q1nYMEBY7&S&OK`Y9$a!kxR8#HwNXA?&Ctnr0sq2$5G;y5so|h~$<-ui zeDwzby*LeBBH-;~X6=PS$u-l87i#^E_Clh~n!XPD4;-=HC}E=h_MSGH2hSvVHdN0x zpB^c)dOTsG1MuRG5;{E*SD>Lb8raV05Y%=TE-#CUNvWMhVMj~{b%)oKEMjl&nJ{WU zBT?F8F+Q)zJOaH8X*0o>hutXwZv_s+GmK}#cXR9jHnpS=)Fj{ghw4-Lc=>p4FD(i> zMUTHnDMFOUbdCbHKtcMdT#DDTDvxp!DF#6sLhFJ=T$AS;_U^D4ut~+UsYz~8c*`mjZSL}Qc=gmAeOjIazgnpyJVulu_|_+1-B24(B^QfK##9|EDtg89 zyt;56zJoTc#)+(u(~;tWt9lg8T$m^Y+cl-KNXErDy~R9(6kLp95DfxIy%^o>85gr+ zk*AnM(WCukd)xyPqh@bRn-@i$w=X%wc~^B<@YM=c44#7vP4X7ne7;_&OK)Eb)$%=2DeXlB<-G;w>e3fyUT~@Wzc}LS%J~H%pjY z&ky;B_s~r_YxDa|q}9JjO>ch3_53IZZx$Cc(c3I(Ld}T(hwL=dRywl^!yeQSQ+M!;_y({a_+3oxo5(~oclN+^S*9i1Iy3g>;1sj--0X6 zbX>-5+45I%9HRI?0~2UKA+r(P=s!Sa@^=8UfHjJAM!f?t8B^piU=1+tvw`j5J_t;b zj?x|WPk%Q>ZK;1HU9lIqnO1shD}1g8EOIMPFcocJS>=<9P;pEHt)Z72ip`e6sh}F) z0#m^Y8MKtDwwDPJS3S{w_kuHdzhjgNl@mFpO-T_z7-@{ z+P&~gUWV?b6CdJ(nI}RC)eA0BGQiJH-4XIUP5Fqo7v|72%kW`Yq2u84mI?GJToFk1 z4e$a}uuqp8 zdN~4N=1>J8vSJ-L9RYlcb_cK)FAT5ap(a*x&Q%<+(A^*SqbzNqx@$OK8ubU(z-O2U ztZ(@P-7E+lX%k%B&CURs0ZUt}_nmiuytrEqcOxgx7 zrj2I68KkL0sViKq$JyxBO^9dL6*%J}dU=3qS8u%wTU}UxT}0$`P+;TgyumdG=$6V9 zo>!REK$##a3ae$U$2~x5V2_7~q)uu^et{)H2p19UEut8H>7XfAzw7$o#+U*2XR05L%$fNl6H(K=gF%ttM~911^DO9bOk2R#m~Zu!UVa0my@Q36KZ(8DMpgfROD>Jc;T8V}YH44}o^% z0Ec3)_bl)Y%XcW<0uu4u*E$6fKu{oYrD-YDkHXOvMYZ@wrxX2vJVm_@WHRLjvN+~2 zFh#x_MbZxNni?MzFVxPHvDW~P+9A77!;G?e={hqzv5oRJV#j7ab{MX&}VwZ z?))346QFABj5aRtF%(VIK$dS&sNJPaijvAjIJ`xS*r^pkbAfR|`;6gXR;zK+e;CIa zBcqSw3M6T-)wr2AI~7GS$1oD8a}2CwG#@T)9J3r@;Vxb!8*BDbI6i=$ANR05ydf@S zxJ$odCIC%Ve_tXDbxoudK$kQ`)c?9xl(;nLO@G-sT$GQ^@RFn^alDJ3rbKluUBZ0Nhhvos(fjfYmpiIpA1NXIKGyoWf+P?&>%e6k7 z6GdC#h?SSgBCBH}wxk|%!Zz0}_(ek?5dLGL^qOSdb9r)3Y2_kXqRc){2vbUaN|a`W z9{X$}xB<@so3an^$(I2XeK1ja`hk=}8hSUDmLaTEW;}AZ86t-ucArz>g znAI)wsLf%}OY5wQni?sqM=D?xy%2$8!%ELg&cO{rPawID@K(-7dIh)wb*Off3E)iF zP|#YJ0Vu&sAj54&XbM(laoa2-(DdpZTR`(js6#^rAb!zUVB} z`6A+_&AbRKW!wRfCo;#8Mpv_zW*6W<+;xf z{8irp+67#SfYE0mOXGmtb6n66%4(O4ZRjuIn&d5}^LY-N;~oiw6`2h8OBeWPBU0sE zOvH`742t>ss9kI&s89K;1z*4)PqIIx}OBea%$MiwWBJnsO@oI$7HQ!n=5 z8MCILB^uGtA~k({n)q1pTzrP=Ttc@59WMd$*@0+r#bmWn;$`FnXN>O5VkfFG9T?~R zgzfcD*hT+@TM<@W#u=~TLJZqKj11ywCZ6mu&8vLDrh2+IfSi1Ktb%Fxk2DUbHteP* z>fH-gcz9OA)i#TIeSaY8pM>sG3oe{LZV13@*9KhKPgjt#IYbDxu3*fYKJ`<%4i+za z@Hhv338&e#M1p!GR~{cDIKdteKh+i`)x)81kewd8BXva48_E=+TpboetFJ?7;%?L! zo4k_b7FjpOws22x;>6oXd+4*KPAOTwBa7B!n@78Uhbu~!@+q)|6BF5&lmWafuLu_P z4?3HPob>)UnD(rDm}(4upBRS21A6Y*6vCErPuR)dm! z5BwB3`A??zJ(-2ViAgxpB0f460HqV^!4I@)kvH)~=&23~Vry=@0NFZ1?2CRRDp+Gg z?|jGF^81RBw_7@N#e7+JF%z55x}iE=76}W&<7hE_G@b6d@sOGhV^*5TSu@QeX?ClE zRk>rOpUifxFl1oGD&ZcBM|MzGVDqpYeyr!$2WouHSmf@Y_u!i z+G!WuC^Lg2Ze)0Za?d*EZYi%RMJnQ zaZxB3)Qdax0?t_P?ah6(Owif2(yr_eWKtLC%_aodNF88&3p*ZZGAt}R6kqC$J?uEp zr>B8DNp1oDhA*)~cH&G%hP$pWbSO(uybaN;P>0mF(YGe2bOoJ!v!4@mFN5OEPT0iB zpuNCR_II{NXvD%t@#E@+0cLNfo)#w-TxaMFU@YPaU;}I6IZbn5NMkKp!8tkv@ApAk zp7(dMz?`-K!9gtya7t=@D819ic~!M1DB>kFfTy{~;u&N9bpWP_=aH@!=mc?kWLFN1 zvwK?n89nYO0BA~hpdPn1kmKe69f(M1*Czp>9%~Vngwem>h-(jWf)DtV1_L>5 zA+RRwVC@33_NlC3r_=@f!75;Tkp3$`j@K{*Ee2c+Z0H%RajdM~PR?jqvY2(@|H4ow z*ki*qQG!^vVxFB^!Ox$0jIy_#(r}Sk_I4D#0l#2vVW;Rz#zJ_chwunWQYY#QI*}7z z5lI&j5RFw`lHQ_T5mz;hPvj|L%9(Iuu~d!oic}ulXscug(K(X!rRVh+ba1<_d0A4q zHpYFbYl8viqm)y&7CaD=1$LZ9`F4)eQ57HAVex zZ5@GWRo0qTC!}Othljj%*a|;h5uO9a1NP@jY#-I$RdHfnRI5H(+m8fMy^I8t(q zRsy+(6+mdArXOsplmcvA*_}RBYFpx?SGS>|l8x)@5r}y! zYzV}-#&2%77~c>2l|2o*1bMqq{5QZv(?nnOYcXN|AUoZK+lI}r@MtG?%(yx`s2ts= ziNml)r1ziiy%nMl5R>;rcLEcF4%~|~3frZni_~epKeBij*>(YT#0eSCb|>mmUzBKS(W01I!m<&=xZ*E`aNaGIkC4> ziWIf9><(0B7lb5{vS@E7)djUN_Wz6kZJ_?`}=_(|c@GGr=hh z4EvkXSA7m$g`oFic+19Elk2y^Ad15V`dy2AP@+?MOG-D=MtIqB@I(6Om%uW+v;{p_ zC(W#_RRO_CG*;%7W^M1Ya4U-XLG$B(5Yw9a=K+((p_g*pdk1vOCwC5vsinO1$0UKe`xd}|Gt*1`%Z6Q@j&v(YYm$f$vG&TiUX11F$T-uyKvw)rD zPyIx3tr3xQ6)rx|8kXe5vVAwb4AeI3R^#E}D2)Y>;*ww(CYq;Ge+c51eMNrNoLFe& zQafO0tQcni3EiPiGIxiYKLucKT%A5!Uy$d(vyQy#8m;9AkoyzBx>8>XOL6K#@iaVC zgA&~gV1M%@UGHy^5(WDi@L`Eu1+ZoHgXMu(c$7;XWvRwcGB$iMj&^L5ty9ImC+kIv z`Hwa9r{}9XrPh#4t^@LUJs2eqPmQ9GRFEb(?V|jr&Nk`_XD?{`ECkkr*s~1y2a7#- zr!fheM%RHXRZUFC=Y?Fb4Ujqbco-_#Y15Q9veuN{@Q%kdA_cv_ z=+)Kw3ig@KR`!pR{0Oh3n%4??0SS|(*XVs12o<@)kas~aT5XO>N=%wz?7`5hxM@pj|25Nr>$gffSmmHOR;J# zk*S8+Xb?P@U9PQj&*L=b5J*5Z?wQ~W#2c;vwwB7==YTfPSpwp-1Qx2-$SED*tw>$j zx9cGc%2p5_7VuvIj!#6c$YR8*>JI2wxU^Wp_xStY3lzx+f>0k+l!)n-xTIBlah;M0nQWzw^w zBWWL8$;j8Aa<3;#eMLp9&DCghrc+wNZx_C}X%yA!iTX$0N8Wuqg!nLV?}MODSgS7t z9y4T)w5%7tkDMDITo?Qh~=~o7>iCw7x3_;?3P6N;&&W0w67C_ zG@>towPk`_{^e;=1fJDhPpF3NaQ)QsR^y&)`c{n*<<1D|rjrdfvjW8euH zav_^gJG69%O4eA#Xa(~LUuZU|`%ckngz=G{-N483 zHfB|(Hen9*HQTkoGcB1etKMUR1!nWOM+3 z&n!hba7IB|SH5zPL*y)uw2G5?T>@z*ysg0te}LRhR_8837ZcfYu1C>r_y_s@zR6+D z5|_tW;w+m^B|^5%0sPJvjvzne_^^<4n%CC6M zk>uY(0^13@a*-{hpZQ_&SClrDJ3@EL1-4`|3rv^KnMK9Jy`us^OXu?ZjE&lmCNSqT zO{YK=yZH$9Q*eO?7HUGhNcsql%+vu%a)=ojL)26b_S7qEJIM~LQhsHGRLJ=bOVVDY zqkHg~sV`iaY|vx{9tt7T>N4FaO|b6W3ezE0&eEi1MTg-XCnNbyJh+fNW(Kd3UZpm` zSCDQauo;GgAG%-W+1fTSI&qpGh0eq}GxX4GUrkDH#VGoAHr0b?X7I{H6?7MdH$wbk zDd!mC=|f-I_T6@pE#`sVYrhRaF7bS%#O zK>}{RO+=jiOC75xzAe_zPc>RQE^PkuXFF7r7hXh5~Vf+WqD)uvxR{Jf7n$bR`CK zrmxud##CK0D@qHMNZIA;I_TJelS=rMs{RDhsA9%V_|x6qx=#^ExnH_kk1EPX^E>;7`D> z=Q?raV*q_J&nbN#rFY2|l0Sr=+#hlLiM!*3`8-Tsr8&Ufh@EYsOQ2VXaeJ zIpcpl1lTM9riKf&X+&HeilfP!;b;uneihhTKUHv=x-JC84gY@Y6rQ=ke|lc(J@~f? zpY`D+HW&lS>hV7f|IVJo4-wePa6?FdIoA{EE%>+Me!K$@YSdojjwQXUN=5`3a+?5A zx&dbI8x&&HO6MpaI0cOuUBn#ttzc@82cZ$g`fq=P)f}7&aE1!S?_Qj{)*`1gnXLtm zG)3cXPU&KvWad!h5~uWmT>2@*p?%}2^hliKA6WY7_deDhnCl>l9`QadQ6P@3$5S2- zL6;~(c)thn)FmG!!|tiNouA)Y%+H22LA&asYI$X@H?j0dMjX4}GIb=KxUkbL~ z{Ke0H>IbK26&%%2Au7W|a%Elosa~gO2_}AHg30-zQ!=AM26OQ*D-@{7ER6~U{zHWd z)>P9gGz0lJHy^y^4?CK)7mn)K@(B@RY)%m1tJ5rG{|M4aKMVtyRnNk6JIR-p07n2L zmZ8skhe#*5>PWt#ZBbJg`+~!TC?5kG15X1d!^-&Z;KI>|aMhQ8 zUPFi2n@4K@kHG`*!v;L`;2{4spy$j*XW=1Ez7s{`@GwxTmm*4DS!{D(fkzB)Q~1N$ zEAv5=v<{;IbIIetEcrJ0W<12id5ydpGVeg+Ko)PgT|tcIc>7wPII-nBfF=RaM6@2* z5$->Mt0Z6d@=tkh1Uy(Rod@gm8B=~=dJ4$*U6%si048mKWE0pAcmde{bMO&b9UF<< z&mh;xhew?C=jqxuh}>A)VTDnq&FmeSv$_PblzP}-GOP85HJ00|ZoKG(trYl9lYT)LH7Szjhu=cb78Lk;XSEiqnNXjs~A z7T`G%)Q#4;;-w}*u(G5r{n?Vl%vJ4hVohXU9p6lpI(Nm3Ni)aymu`r4fq^mNWYM6u zLaG-SNflf1;s2>*-@ldo{FhE|$xVWM4M7GAcDZaw<%QHc!6x#bS&>0E-A-wRcWPmN zCXgHfCMi_>=6^EC!^J>vx=rLbV!}lH($)UKvwzei!fTg81gJAHt-+cE^1fsFTYHUt z$DQ*c6jN0;W?BjJ%Q_pAB%TWi4y2#qwN{=UsINPfx*Zz|YoqNJdhaVIHa<7fquZU* zYoYplR4L7Y=Vp082O5J1J1zbivosHkEqHjAA5y=;=L~+;CChE)wjlW!B5%M;fCxwK zK;H%N6*&@2ANPYROQsZ&yEM>2Uu;p3-5L1p(D}|JD&6VClHvDL8jnpySCgTnY2nP8 zk~Q+`a^0X;80JZ^Kn}n!G^Rs})R889>y&PRKYL{tsfx~Ai=-#NW1@A4E&~676?=Uz5;80HJ|37A+XQ4*>?Dv`vHtsX zR?GxetRV3j8;&P|q*UR;{FnUB@S@EfyRyd$y%sEJdq z_}Sz-EOWIT!$?%Iaqy>L>4q!n0QT?w_NqS!#qnSNQ5@ zlg+A48)?|=R;QL>lNX0FO;{%uU9QbLTVh>mM=szJGU%Y?db%=K^?S}$rh7*Q=k%e<>`K()T;1AJHwOA9w-Uot_1D4q^_p?7d*oSiz6rdL0}r9~_XDK5M6z zhtL7F_unh2dzN8O9miashi6jI{=-UR8HWkf&n^+cr>1F{3Ac*M>@(x(EZkNIp|W#} z_2X>6>>Ws>5A$yMMjCvC_riCR8~B8G#D;-Uf;60kzeOn>l4L3dyB0~0A4NOZ_RKV? zc1@gVRu9k6o@pUMntC|0qi{TwxMUhWp|)UEc*E<8v zm10HsE~qnDjF>&>;Ay9H!{7K2I+cx*twnU{3^TGDp;Z?%AinB4U{8ZMd(OB(i!OKE z0W<{I0<8EvV1^MHZG5iEmuv$^7et)~d>$n49}1pStlU zaBqQU177}Kz5qcctI(0ezB8E)(V^OOs207*G8jyBmoO>V{0-LDv)|xr&7&oV(bjY! z3JcwJ!|TV0=NTz}-N;87vA)?KYYq zRg?UM`|0$SqST7xdy_6>aU`$Lqmva(x<96(z6#dYA6vwb*pqxBU4{RGe~d6;YolK7 z*RSwV6TDd2Rq$DHuO@|}OXEy(Bm{;qVQg0-_00+_dfNYv9iiw~lfod=Rl+z*aFAlF zA=gR@Q!)R&f#7O95fJ6XT zEU$kP587S$50b*vvk%% zZ~uWx1n5>C;Um;Xf40#Pc-Ei^H~F*%Ys7U*Z-N7~z|dpvZT|Ghx17>)l(!f7kQRaq zgog*gygd>=icPbpfxIa;1;};>!-P}@li$bSWQz}0%1tqWk9Hxq0TA=Q0pz1I-vFEQ zNp1^ffOSt_vr)_)mX>Bv0kA}dO4`R=(pq4H_|?~~e9Xw)*e4nked%?paaPb*eeXKmLlnNTk#>)B z&Y%v!(eaB?JV*8n3)Z;urOh#{y|WBan2C<~OJ|-t0lP@+=w0A2Y)$@Tfb&|iV~ z%>_#p$og^@e6K*(f0N?SR6nAeE5I1v!h5ZVZ*smMLBA1jDnf!WFUH7Qaw!`OP1_K| zXg6*P`B@8TECLs3AE6Fe@obk5=22}(YWfBh`g(5LTd52uA*<78@ZYXQu1{lZ9QoQ5 zy5dwYnVs@eq!bg9G$1GJkH=6xGK&(W3ljWjev*PMx`B`=)zuO=G7{%c)2dX5p2eBV z2%W`O0+nE{n6HZExt5U?`(wFUx+X@tRWoQcJhd7&)o1Q7qlRswP%3qSS=KISH~~b% z(G|^olUfC6O-I9k+;*P=u}?w;5YxxVI}5aT=|VT*OyhScCMi;Z^t27GhK@nJb--Bp z)Vq31QV8l7!tuVU5-*A};5`ztw*q73ocFcnY(`rW@si<&acy7i3>}hwL*b}$dwMlQ zk=B`cnC$cs;b)ge`l|EiY4v%A)`X%Qe9*1HDO#M}o;Vv9YIW&`&^7qFMJP5CpDI@V zp@>G{p&wUoADuwi?I|Q&!4=vWG#dCgnq?2L8=4_DLcwG*gB}HThWlOM0jD^@Ynyts1>ZQH9>F2po?42d zMv7Z2wf5<<5Y51Oh5~PCFL}cAl3UhP>0~i94Gg)K^+_s5i^M+I)h;4N12lybWyZ?4 zKB>~poZKM4R7u!?4kA`ht;Exw64!6gdRUjxGrFRHKx4ENLa6s1TB>oZ-h#7$+=3^8 z+=5|odJ7H!p3t)V&68!t7gc&!0(}{8yu>A=F5Jg(Dk(vcT4)I?JPFrtHJbEuglX@6 zrAiXLyTwx^zOeohzk3qiDz4J=Ad#h`h@&^{4cwAB&wXsmcCA(~a;w~=fi7;&!)Vl| zv_;X|@G=l>xWlMK7ewLD)E`)+RrF6!UhA>{fG*c1^se4$Mjxlq82-=l?Uy5XNUElv zvAG5EW88kZR{2=LkBF&MQ=~-Wp3EMwt47S7`XfDt;HJ_-_e|hjKJGESI;LYB_xJ*s zhTWV~zy^rmNL3`s*R(}e^PnJ;yKb{I1-g-@`Kps>3p^47C+pTWBwS$|jj(=5{Vgz_ zEBq@SQjKchpsA-CIHSssR6SiUr9V)=%U4IQ#^XS)#$;e4i1{`H_h`L-I<0M}V5@Tz zP8mni5j@|Z)%6rjx#$eq*O;l-KDa;AV$Y=24Cc10}{)@)$4LUBBt1d}I-gILm?6_yoy!D5a_8CtuJS?2NeXwt+gNCW`c_ zRwPU!XhmLvPYCDuew7@XQ${ld*4#7PyMRs(o~s2XP(TaLy^LxDt9uS^&KGM}%!>*N zP#0*8j3bO9^SK7m!2#+*-QzKJp(y{_85I$rQYCMVieZDe`==dY)dSfjg_eF`Qj5&$ zZ|6cF&F@3jmJ0NV^6|MMp^WK>c0{a18U^nFPuyQG=y4~*GX-+1#iD%tcXqx?w?r>` zxVl8F`y|R91TWqEm~{wMAU00NP~BGCo@F!`*ik>$v`mz*!h+fjpJbe|TW%bR!9vvF zi&kj)D&f$oA+=UCj-(4PUQfPC_$m z4S+TDkhOYRzT=oGLe^gks0LMh50r0M^m14yF$eUCp5_R0;mzjYwhFdXuJ4V;21RE) zCs_V~MSH%iG!m}L(|Gl=9!hiLS{0^E&`-6d3wQp9i0ofqA2{cUQ<)g|^$%zo7ouxJ zv8X5*k=L56?O>{&`Rm;0w@1iw8Fpc-FN@DyRCK+2-A~)w*91rNAu%JX-Sqp(#AspQh`4Uiz zT-pOi;I+v0r#u@ur)h+Vx;>)5{CHq2dbbH;`!S0mB556agkHL%i+Rin>T!n-!LuoH zjOb|OsKz#N;P%yAKJ^nUr0PMDGzMX4POe=rvs$DV|hlmZuTo+JUmyRSi-hrqk5tD5492pp*>#Puk;I2KZE zfwA&jNt0JDZmL3WguDDbWT!b#`pUH?T!oY{+C9~-=9$LzK zz|{5xCBRCr7qAvqdX$R?o8{;FEl?yXmyMXF(wZ;X->lhX@wZ`PFbWo2Aw-xlDdn6@gp;+xNEZH z6!~?BG!j{7Qv&G6Z0;(k`CqwB>{RCo%)$O2&EbvXa!IIt6bSC?oU+qg1iXR_yq zVLyZnm^%}0c9_#3FrHSzZ<}HN6TrXZlaJn`Ay1>LVU*`i-doN0=)Gc5lK1-~ z^wxiv(^q+^PAB zG=XorDJ_$fo;OCsqSo$Q0w+j%6zQ*d_B9vHX1btOA)%aEg7uU zbwr7jMpEFriu59G%TX>Kb|R0??;#J<*S?rp*UVWFMVH=Jq~=y_cNa@0v#RGx|3O|a zBmFVpi{?9gj5JtOO#d#Dh6@EZI5H>!3AKzu1xB!)euKM%*+|~>13md#ppiUWjJdEB znmN8ohBWlCxh&~8MdiS5D5mZ_j<=nQ0n7DGvXo9g!fOax;i38H8+r|*#5xs6E+5^& zW2^4&Wa#dihS2BCH_S-rpzzVD;Km~sF!>)T#vj^-BWZ99)-#5r2;u2;0bW_ixa&f1 z#&IIN_k>8%qWPp?ngj2bA&LkkRLyTBGENXo*tqLhZJ?4ulz&njvEJknAt598(XFLHV5PP^$7sLNab3SL2Dhi&L9aL=z z^CDlmy8y!_d8$c_nfZ9CIC*zg;+(H0)TLVQC?E{LiWFm^9~))2;=cZ_uk~8^YD1Eq52T0UppXmfrG`K&7)~f6uOD(5kg1*1I`a-`M zisv2}OWP1$kP_&FPL0ig94QDB>z;eX4@|7v?-uJ5YvG;yC)UC{#>D!>hl;cfFKqoB zFPx0~OHh}BR;`u9Ycy@?rcae<@!CFq9k>emBsKdZh`jVFTH=y$$sii{bb~p(0wJw@ zQ3BOl#w(?%?h(L?l03z%-7txwofu>x|1`+_I6bYvy!1bQ$5edHntG^ba@0~~!+(%o zAMe*!{E?rVzyDCrxBCA)w%t6o8+kIXMz5?2~<0d-2f#qs?CvA0q`)OlxFgmX>m^@>fzdRMeKSM6OMpy9A3aZHKZd9alaW?yU ze<@c;XLI|L6=d)(HY`IoVK)Ou83qGil9%K7$dBL=&cl_CLy=LN!QSB5Qzozm?G z2i{M%Z9%(&12t2tkCSkyBdff&w(x!p{;61ol&0oJisH9SX4(RusnUKNP3YZ5j!SdSgL z=C59z?5j?MfG`{rO0Xz<@@cz!=`IClDltTCdlYF6@GD>g2%&EPkKp*~_unbfM^!$V zmGks`vZZ_R$z zycj!y#E|EfUT*quygSrpTqo&lc4J-^Izkn*6&IY3mweHdtg1d4t>kIyCFm7uiP4#mD2pfOf9HJ{6k#G2n1WuEIZDVH2;+O%0_}@R^08U%rCX1knE~ z%Qg49>i~0n(G%8O$I=hnUJhcm@7#!NTqah$K7PEeU zorc3v3naU&GU2}=cHe7TiJtNHeP!YYskVpQ?bnldr!aJ`{YE-+`~fQD8Iv91$iUg( zIY2&C{*#bQ_o4zr)B{=$)`{*D2q}32Tbj|kQ!mvAxJ$&`2jqn*23pSgj7fGZ`*O_oxSMWo}q)sgZkb75cPztEJBZ?Xiw^1!Wmz3qp#%I>0Hjfl*o|xk&vbsh!4-Qd()8C7)?OZ~vc+~Qe zQA?NEr71nXEY=0ZM$zMNCgGg#c;F!I%gyq9xnDWR^W}81_ptSb(ZFkZl29Bg>h156ro)2LbsthgT~aIKCZ^{j zQ$6$pN757O4dbKg+MWN0j~WwrQ_nft`Xs%Blz;!aw>Wr$60h$3(5}|UcRYi(YCQJwotvqGSHQEj({6!bgeu?+DUw8EGQp6sMHprEzEn3O0wNg)zvbAU}o;g~h zW&T_D&(k+j_3oc%tW^GcOVM%U8DQp#WRgS$Xa?=_s&^#BhTL3gSE1>@7h+77=saRL z1E=T(nXNC-XbcygI{pM=Ru$RHuGtpi^=k%B^+duJ7uv5eHgBh4TfqK)6rF_oDP}XW zM|O=53sI+QQ4LOm#)P}1TD_i9XBck~{O{PinN>2$RA*Ku_EJ2mK+e&8Stl^U1#31s zzeZi*SOGTdCh#$>r=OS9l^d8w^|!gC6xUewT_ZOSuY>XU?fhzu<&!)z?_DH9yoR_G zyC0Z@ndAnr3tm`AlpDwfb^Aqv1i<5cH1gNU@K^|s(P+0YJK7Ba*qGE~HcN6z)kEfa z8&93*3Hbt16-1qnh12-OcDf4pJj|^#qFm5~HGonbNU7Do!driMr6i5TsR5l9R;j;E zMVTt{P3J;HWd4I5jHojp9C7Cw5gy$Ul2$|xO5i?I=#8%2&wVg0byA~fm(<;lyG{|U z#d9Rh$A5qYZ3i<6y=WC&F3ZpB6LC7b7yZDoL1L3*c=Yt5r+~eIUjSYHAAOk!eL{%# zGn^c)K`gg8tUBuhZc4kypd-LV645!3|8n5-S|_;e=>(~mmADgcHeSqY1fXgs-gc2jARc$(B4ACt+iu`w(4#LU zv2Oj%$jXjZfW_YWQK_Q8w!cd!m>IyysOFDAX2PqXw=*Gq7RYx< z3xNq9%7AlEOq>ix=sXA?hwYiN*+- z_4Vs6BOSe0&1En`S0~fgaIhh^hRH7J5uBCzjt|B-Xf~Wfz(@WL?26#FDcoa027%xM z+{M5~GVaq&`1N+II}BUH_5Xfogf7*@94_DbnR=wTw38Fzb-v~MP}o-ONWZ}Ev8sV% zzCG59-07gImZO)7ne!I~W#zah)%s@>b*#nXsGA5MjB_+=;lMpJQ8X;UPIusVUmSmC zMW%e)BF2o!sNNLYLIli8}7P6ooc@m$&X;|N-Ylc~ZhgR~%59t>?)aAoAkqunZT&T!j1I)md**)Me z*bI8Mp-Uu!mf@QGtLr@K9ZTdp#||L$ZA0 z4DG^0qV>>CFnd0@v}v+tL;h~2?2pp0;IXJ!XNEOKVsHYl14jVQ0iVK9&1mA1rlRmb zv8D5vX!;$_Ha~Hy6ih)1pO5$P!%g3t5sx zueWeXtOY!V{bFemoDM|Y1bh@@IgT|p=(-inK@%X|K_^xMtTU)qOVA;lvgi+d6A6w1 z`6T=;-~iWFh&Lm#jbl--L92o^FE6prb zlD>coD|2zLPhd11gCo_x8ittk4(L%7rXE}`%Hqw5R$bnDaJ_bKl`S*D&QYYeyJ2at zMbmO*EuoQ}P*|)MCDWthy;3B*b3GLzfotM|i==nq9g>~E`eME6g z&rrJ11uF=7L9CDt1;IFgG_*ObZCPD{5Ps2+Y9j05{=u}gzYC&)8$zuZ8|}UUN1!Ba zBI$7#<*@mF_3+3L3jT9 zDV0;lX;3#8PW+0fIbD8oP?rpsbXRM8iCi@UG19ZTyQFmidEnz%6JSfRwobq5)V7BU z3QY270Wb;jnqpve*6Q+WCKwf-q|jmFsZLK&3C~q~7z1OK9X9djhNVF?n1fn+@BVxH z+JC$I?{7%4br~uxLKefI$SGwnQ3?DI$*)qfgAIKE+BYe7*yIN$?8 z6->HeWT@AE@N7Jhde?!;>j!<~$m zyC_`ryrW-`uE`Ex-_Y^!FJGrhZ_4zXnymUdRC|Q+^&i1QbMv}_K-Tdv8IB32;|i`0 z|GlQvb|glCr;#(@U=}V+C%yl&R#kQ-GF7WL>4S}|PkM%SDrVuzQJ%M!u2CSt=A~}4 zbp!6`c59m;lx&z}84Yi?E%YYv5x#A=8xNDD{**b|CG`*HSG?+@?*G_=Rrv;ZRg=cj zVPLFXTZp&Cy6)T|=&y!~$pH29VhR}JlG@9~fz%xjO!{8}P6EsHCvY&P>&Kthr|p-3 ztaxD+Pz7EBvH|f#a+hKh(ZUy)>cBufkY(b2W3e~`b^@kKAJS-GZ8_(AtusdisnxU| zk@LMaZw0E=sN@h9zM{_czJUnU^&np>gPxH!tNn2B<1UgX#A?wq)fBx|REs&*0TOoXY|^HDQsixt1;eK?oSZNHKkB|aI;!IRn|rq< z*^~{NWYe?R-Gp8ONQdMiMbHES0!mF#M5zHgQWAP6LCBz#ClREV03sG(69oi8NE88) zk|+Wy0-;NNKhM3Jfa34__59v*-gDl6_A@hg?%dhAb7!75&%<#yeU(psif%0D>5w{n zjdIXHbI5!T02}+RnC_$e?oz&8X22Wse=`>6#6ZB-K!V+{*ki#w^3;k-dTkRP>k*Kc?p@YBU3I}j{ zrc~3Lz8FcjQLhVR1y7HTm00odCXngF2S7dv+3_8163hf5Tqn7KEY-gYd?H4DZT!Py z^8onh*xV|iE@OC#?4tQV7krm~3goGB7g$@qyqRi_jfHW{x3mg4D`@_fgH`NSdzj^@ z#G}cn!}QcRJV~Cvg~lV%QqOg$uz*D;a~FedBzb(Slw*XfIM~lXWgp;g&@L1yhBH^= zEW61kGgg|wkD7zTJJLe($x>y9?uEb*2_wF70;DUp{V@(b%bO*PU!HC-{06aKid|%w z$e&g+)c_{IS!!=!6#mlNz^5P_De}l)(y$dD&I{S9S?DI6>Qdf4|?>X1U;WcK`m8qE87@(+Wu~6dW&|+W10Qk6 z>9Nvr(=G{3Be-o+`{xiFa|RFcDLC+gBq1tU+5gubvWS?iarAs*;%C%pfEN>jPO%;K zbHIjhDmx3<7EWbLfc&jr1GdB9HJ=5x3S+h#I8Hi5ZD(uJj4{A=(vPqrVg|pE0_JE^ zjPAf%!Iw9)egX@TZ<{JjYLrva`gi4b>)h&ne)3sL19GSHfIP;Bfjq`xi?p7#1dfO2r|rN7|Dp%2 z|NiWgcN#B!FfNC`6!AQI&uS0mN&+A+1Dsl@kX0!5Qr4p^jHhYL? z%s6$JM&@IJ@YlNriAQ_96dkST@HYKAkWl2tAGcA#GA3?Q$Zt6aV}EsKSLisZQv&9z zm2@BSx_XLQ19=CU0IbPFy#Wax>JlIib>IqZsM`T~sAm9q608SK!uT{;$!&a9ix(rwlLY-GZ45R2cN;i03eFA;92@jC3M!SdDFik7%!Y<&u`G$uF^_DY>4D)kr}*5%lu5Sk=39 z+9$EnDKwV&DMkWA_#P=p1<`x>WmVrk;Gf$6v)Y3zSNLH3zacw3|IhF9zs?bLg|9=| zDCRH9y%Sp`f@kHE2pTiCxr&`{kkAsq)v@GLOa^mT5m;*S=`Aje9DLqI5Y z=^k)8-s{v|5F`P=1M(MO+l`kAOa|6~O8iYAU;h%A3Jl((;UM6b$k+NRRw@Ku0KNfy zVXt<5E0E>i7l1MP36k=$DC)By*dH6DrU%eMsWsRaD|Jv;wjFVmE8A2Q#!7Bl4Qv&( zbWSWwE)2?wYw8MTP}XMCZCq-O74C_z@pqcv{{-Hw;qb>tsZa^nnOssuuh=iE{5^b! zS=p|>4a;&`j0PMy$>at$()VE9Kygn;NbVbEgSgkb7h;?L7>3h0b@xM(S)GaYKRrY{ z9#)|!h~$S=)%XUxH;Xlkui+oi0^F2}$#xFNv|+yk*izKV_66k~zzG%BSlkd@XY zBEM`hG?B>q!}4Z5uolSoAAlS?)c7sdN8Hv0=wfaihLn*3X61<16OUFVA6Hpfd(_j9 zh=0eiAA6*cROQ&in=9E#vVX^-M6i#|k!V@LkcX~@nsSw5!aNT->8*(@stICnB1 z#)5D9@pJg7N3Je%eV~G$3FPRin}MV8Z|Z!nZ3~@%&q`o8=?K^%X%B4$j=-#oI|@n{ z3+`|rE9_PPUyl7|fnKq|wGz00K7>182Z|ZEQ0LIwt3u?QL-jC2lR$xG0OJh{bM=-B zvc1zaah zq?jL>oZUi8frP)<`h+$ny@3I2oHgVmGYymIParI$DCQJXm6K>XkS(YpPcxZ*kU9Vx z$rp~h$08A4X?1EfD;FMlzbqJm`+4*xSY?C9o0UJ*%MgtGQ89i0-L$#*NVBPMDEoJQ znI$@4&Z^55wy0+1l6K1@vL1S=46C7hb~b&0gy83<(HWc$qJ zqyN_)cHzHUWto-hk2IT#+~fTx>5OOEMq^l^$&QcPJ z;;Xat@6cwwQo}M%x$SAwrVc2!k2{|K57%2X7uDPOarGL?jFr*wHP)TVP*x8+SKwLb z8GS37`l^a$9HpQr5)U2%Z0FCHzN%7r-%b=hQCWX4>MuQ~RgVH{)e#`5;xQR0gy(Aa zdq6XEZ12&E^SpIlq!YjkQZeoOmDinOx&b74{t`l5bdcj0-TQ!EOxk_>J4U2MvNFpP zIs;acyj}T@% zgVn4bQVU=th~MXcQ?VSB0$btP(HEH$T|~Wr9l;3C_dF)7vJVTi#{}RpMX2;VDo0#G ztZn%E@KJ;;PHpTK;+8MRY7ra_z)09xG9Nn&98}ipYgR);x_V`8iXx^fB_h5vC^E#E>3SHa8}5Oy$M z7U_Tb1=G(cXo`xF*BFzjJFuI&h0l^b%19q&dF9~RePRPDH&M?Po`LaFt}}z#nYI82 zV;rNgWzR)^1F*t&>7VxL)!OK3`}FF{$5cMz@qIdsQm`j`!w$tqSyOof`t=vFPvzzv zZaSTBSK_e`Z^CV{rrpc!@cGw`en5`RNow4BbTdyyj_JSUYH8We(W+YU0CG$X-UhPK z)0988o%INijaDOWYgA!>;86Ku6n%q4xLk0Ienq00^gB84FbjVzih3e3ph5$5(|r2+(fRcC--Z#N{6EYmpZ(fBaj+V^jOJCIqjLTPS`KKJ8z_G~h*2Uibvnup ztQqHMG|*u_jtLb4{j`sQ4HL8&0&k+c5hl@9;6pkw0@rxL4FSfQDyG)E$nn%F0y3lV zv>u#0@I4?i8Yev%Yj8+eQa@S-d?IwILHVI_>Q{a%Fju&Y%b&qYVXYA^AYi3%8~8hz z-4mYL;g!qQN$p>GVd*^SxfmuAf?p1!crOQ}WtsFmkk9Z;2F5{gy%y+zkC%hMHsA#U zz41r%J(QniwgR`glaaSbvB}C=PkVvd!@ybuE7LxVXLYJ~ohl!Rz=JJpw7>^Lg+I6+ zSQ`uQabQ1Cr@t-rb%5CKY}UqM36RI349NCW_krhtXHlyIu&y7jo0F9*o@ZKAh8^Kl zQOJFi|l$-&-8bwe3%m80RNh-+|Vu`M3yg)v1pfD1!|Z7)GmLGY!PbT(Xt;@ zbx5lWVAk%-kp9DU?h952TiVbkz({l^(-Y;~-_x1vD6fI*F+mO}Coum9BBA=P{sIZr z>B|iyUIsJQKiC2H97H>SE3l5f7~+8XBAI>z)eI)lwP~;T0aAm;ut{f_t?j z&BNuUAWQcH4j!P)&t%!z71o)evbEdLk{#5PWgIS+HU`Os*;uS1Xvz85pu&Bi z)5tvS5}n9S30D2hcJ{8(LnOt$THn1Z+9B!W$aRNRBMbXKc&I){sSZpykJS)sf&%3z z{MWxYXj$^VYC&_+Vwryf5p^z)Ns+ex#Tk%$lhXl43&PnuE(cb;TpAk31!w4EV2UR5 z@d0h431>NVm_p<6`Lm$0GZIZXF&&9pIAJlNngb?6o}DGy^60@gnAGS+mhn^&*{6m| zddjQiki5pL%2SZC9z%=@>%jkLR_FDP$Ki0Rwgx?F(4{frUW#h8p1 zdkqIH>ds&HQoh*WzJScohrL%Vl{|LA=)GB_>q>&ej^^3EJye4vblamHuZYd_U%IXO zlc`Xwd%|1c*2-?veT<2!Shv;2m*D9Z^+aZW#hCi4VRt;eqLe!5K9s4RLsk{$*8im+ zs`urJepoe%6}MLQ<8N#XBKD|iMOLQbd6nn2V(a4b;(n#W3V||^GgeqY7?luF{%-qd zT8dIHbkK9=s^U1rf9YW8L&bKg5~_6&w?5v%3KJ(aMi6Uz1L{=_9CXs1k%_|*kqD7< zLLVtMDgoZK7-hAkFWmcpMNJ3ql8SwY~7yb&-N+t%gi`bOW{TWeX@!*Ey+_jnE@C)vMlpPH16IdMC7-dxVMHJK6A(bM-QE}Xf zO&rn$xa9{aQ$E!yS=~pQI;5v`fA{hcM*ZRRqdSVX0@X0r{kP@9unxH%DDBirD|Kfe z(NRXpXNevsA*D!6k&e=!Bwo>X$3p|7(Ki!YyaNUzHGL#Sz6htvtmIfGJF^QZAX3i@dGSv5}@ zN&8%IM`3U0Krp|oK-3HpSu;jj=^#q*P&xz;9N~0nWHl*?PU3DqdZoRi;@KgZuMPIb z0hbmiAIwp~JMiwk)13kwESZWwC}Po;uy_rO7bC7rP|Y*hgjMP2Kx7_W6;ZN(V2Bu( z|FRc7*~tOJCz)ktuzOd?N?)TS67TRF&{vXD+}EDw%?htL;X7=?J(KY)81NZH)?B|} z5hb-`Cs1Xlbs_7w;EQX-kq6% zI;3t2R*}}gqNh4tc#k_sU4ZxGJ0_9iuwc(mbx7UxH$oJNQd=1CYQ8}M2pW;qXE&m| z_HjuDar!x76ajzqt}Bv$f+w5~T^(@nkAJ!8wgGFQx6AD75%cA>^*U+N&fM3 z_hcjnV}R)La}KB!l4-{C4sbPPbP|{V$}OOm12$npMV=)ijGjWKCEq^TY=@3l%3OL6fbrF0z}^rX;4Q+p}>_bi7yg3de zCBK6ePk&Ia)Iubcw!!of@=xd|1tJ_xV69t0B#puQmk+|znDjEDG9ed@2c`n~JEO~Vt~e=BC^lc4$qS}R2FpPji&Bp6u@MOKYWLT`bP0Ni+7pqG zrqY+e+e1b6yemdw2@2NJWs6=iP%$bR zspV9VHvHL)e6O38#v*4&OQ{!dhHw)y4)rANhf$+9B zDoEXKO!PiVgD{CU0@Y=ry;AmYZ*NAqB( z09^F0wh=usAAB$F%K>JgzIA~EhBi7{3gpB4QMt?sVa*3}IFKX2)4-2~w&r$N$oK1L z8IbEc-s3L=KJ$T5x}k_toqaV4K^c+t!u*WV*z*&}hT>n=f9Y7Lh~=&kuZD;;yV(J*kC%ME z0E40ihJsQ`hJ@}QJ&UTmC1wJjz%5NgzS|V+-IV_oHm0T`_G1Kr_ybq#<7zW1+bdz) zX_&_Z#5C##?2S>|2z2tyIgG?m440D6Yuq6k3*??8^4$JQPpk$7=El5UdAb7Ks7Nn- z$4cjM49>CYpvje~$xb9rR60m z08K+LuXeC1gK~h~tr``Rf&BwS%oqS@m_KnP8-19uh6(0mQF`uXFnx#2O$S(=XDE1X~gdOX+yD5|bVIiweXjs`Xz2fxVTrF%V^^3s}m6*bV5 zdm3;c+>ncr^UAEEa78se8MZMA3D!Z1#B}V1TqKs;+*vt6Gz%HLQ1)_cr5ngR%`~hb zcTKY(dj1pK23m3Kk<($c5t#_SW)fM?-A8;~)b*i1P}&i0;V8;6F3!bV*KYI3sHU%I9*<}p5ET>fN_4A zyZ;V{w1g+xy`5mZF!Or3SzapN2%({c+J`+A7=;%TuCg$+9a(?AegFyn{31nWjf=q) zgkDjpYo$?Hlg%xX>Ptqk33^c&i!? zjF5LsqnSuFz=fSaJ~aCW@ITOROrNUs8#vp2ykZ}uH-K2_L_&?KK~&>w2TWP}yOV&R z2ypymxf5&A*8TV_ot|JvP}4&T?28gv@6fT&sVYMhdk5I=FGOIxVb$S(XrUSsPo*M6 zokf{uky$O&A0?Z@4JWM|GJhixKtyTwz0r5*bwP-fls;$j&=~)@_0_2~Prv-{l zUK?zba1cuyUc^4&DtwoP`)}E3`XTU^cx_jKw{Y=7u|t}Vd{&7A8c>-0068N2X<$0m zeC1n>KzkK97kS-xpaIk=WTn76(U9FwLW%mN&vA^g8JH{&)|R6maKXV;XL(RTkhuE$ z^&riGbj`!+gm$+8_GIIXcfZHSg*L$si^3+}@RE*#hl>YxTW#@ZcZ7@4U}_;;wv0vY z1=@T9vU~iww6~gu>Xh>zh{7@VW5t6;4Fl-4lMX3Yz6Dfn1rC?^^qIPWJe16h3HvC>49Ii+SI??i(LI*HDAgFuP>#sA3> zEo&ch!0a@|y&D+7Zlu2d0bii4m!E9rIqns!gRz%iV>t+b>Q#?3(~sapz!tpB7H+9# zGhms8KqNo1C;T*HFECO$E;Hlj_oMcC*T0K3R}|lEr>9OR3dGKoy#WRrwF3<;X+287 zkcjf3!yS}{aqTKfmLnQ<@o8g>$b7GtQRTn2%SX$28ODdPZ%PlH1q8MhAn=b+1PJt> z;0X|D!ajLt6`8|oNKaFppB&P+l5XkGSh6wSo&lc1|E+a~g%v0m_X~^S`hz&FWfPbB zPBh7up&~!r2!CmNUQHEwKChZZ;?M#gVQH0TqBqWh`obDnMU?*&q9BZo#Mc>yJTwxQ*hstt zmtvp`DhCdPeQ?i!yA|;zdq8eF^&%CsrfTQNLW`XaI;J zOMaJ86>}k{+8mp(l*}@S;$?%QLbT(>lJe0#Z{<^?@*4s=%P=%i20;I7v705AAM`g63-8^r#1C}@hV_}+lbNj@vl$nS7k zo6?YNi#1+qe#4A+-7yXo5((rbX`##o8~f=@2)|VQvCj4=-ivH9Czd4Pez$^-q=?VoBUQ z%!+^rAJSkHI6b<-RT9<*ZBbjUCFw(4u8;X}1ULb@!RK%DmXC-52YbV?@(#0BIdlQY zidSAB>O)DD4(tO>-%cRtCGxt*)bMh50uZ}#3T37{F*7$(5$QjkcSAUC3<$xir1Zm4rg$3YDE>z$xAb<`Hv2{;${qVZrH z#Msy#602It*Wi?D;My=!pctn_uOjQhlVqOtSpCA(;Pg_F!kWi$( zWHvf6;Xk6fKu=V32=G2`Y!yw;lm@y-p}3fb;7Knh>_gtBL%;@jk|gdYU$jw#H?rRI z*B4fa^;70=rXI)-z=HlMFdBFaXb1iYd=l8oM=S3GbRnMw9Pg)*0RHwsyAOnMer6|R zoxLa-C?2^-@B8qc7^LxP`wHt^&?~842lBPceS?<*p4@Y#)?c( zbm~)Wv>i8Eefg>Tw5LiU>vXM9VY}JD&#%IlO%?T^m|uVslVkuT0Ij~7p$A(v!+lLc zVM2)6*W&;|f}O`m)CprF-=eatINF3Mwy@$@?gpI}< zlmN7bRJf6;;;|(G1Iy>kiqekN!Xwm36c`$a`A|DtdXv^N>R%6sd}sFVgea@8M;xnz znfj$ek#;`}NIzHmu&~DlL{%0d1`sjD8|+RBbiyP++f0g%?Fgd#RhNqOI zONU4b##oqgFLBJ%o?`fI1c_n8aCZvI6C`}!nITSyqJO44z;Ol+nu?EdgU+fwC*OwW zsI%nT%ID;~4tN?Z=KvC9shFegr~kD@|gqBMMIxKr8_ zhbV}e;O1c%5>=h6O2s`sHVtCuQSUI)M>xT1XHrdIIBXo+0qt^$B+Bm9u+cc=SUy<* zTxOhET@D*BQCW5kDN?i=n^#@rEtweu?>|oIG8TmOQBLVyydlIggq6Y+eXI^^g5}%( zLE`eX&kQsX#oeXD^aJoHs&9&M!u8}SddZHp3;F%P=0IbtQ#t|C=x1OslSY3!oYK#@ zaMI~i6+CacoKh>^p?x*)72hDw@v5U=`!hroDx-{a9VM~q`(L70jxC7B|L%_7_>0sx zp^Iu6=R|~~TeD*^>>DW!xkz;iAl{KkZZk>^W}BF?CK$Xaq?9dRvU#g21qg_$icOr= zrs`0|%KBbV2=Pwo45$+w6bmKG#)XLNLx;>{tA^z<;uO5iRYct}gxhto70Tt}EelE< zk^UwngvCN0J-bNUJJ3e=ai=LfViA{DHG3&WHrt2|aEj=v5s)@1z)*yfzpsM(~{Q;Wdfw$TtuPUn0`=1!UQKPDDL0NErC;K)azQp8tf9!c1)CWic&FtM;6 zH3l;0QCbRHN@lF8+T{RkkAoc!kBP<8dY50!38M6eUS<(qyRVOEor%D?cX9WA^~*t& zz>cq2>2zZ!h%~UXL(DdMy9w4@Jo6TiDL&QXe{xeNge1M_0&ouSoo2js=h6~j9knTg zD5!BKD9~ z8HzSnK-a3{kxFSDoRUQhIyWX&o^E`^vsP>A1h(gO188U)r}QC)2L4i-3Hz{{5p*=# zCB5W6@Fd6{tD8pnG1zVqNMO~h8BEZQJITn#5gftw= ztpg~5)LO*MZEq8wP8|;G%Va0SqPa8`$deBqy+ptd8NqZA1^)bjokF4u?EUMdIH9Wh zf>r}-fX!DH3;}1qBB+xnIQg1hoQ{$GMZuL2lNi6Yt3O?q|fy_Gz3G?&7aZ+ zG4Z2%)d{DXaExOX!(V9`NtY39=?M{8I>DRzyo@bcy0P;Wes_o)xdE3P?!JSaP?}XZ z$w@*k3NAR~r0(=!2)=I)zm!yd+a~g^y!M(Xy&vZ<5(|3<>XjJ+ijw zlK7IZD9*Cg5!n{KiJHIV1Q(>eJsX{P-6{2@ja~4MvH8cm4e}pzs2urc@b#3R>>466 z4_v^oonGiq1*uM$UsIG^b-YMeloBN@7hAx6(DAO3!kz|CHkMba`_ijjozfNzbp00- z5t6%`6X$x*(w9JHWTj_8lBnmycMgBZ`peAv55^^C{bvA~^}h@R>ra8*!BU`!93VGw z2>3rV(X@xw#B)GyVkeNBI1PLXSiL9cD-b7_fVDuJxFeqD|BaHGy?7x)$uqs35XnjT z^kpCLd;0akpdwVwzF%Lk1sI}uV2m-Bqhi52Y3$J;>W>nK@lOscWEJTPpz3%ZC3P`h z_5oi;TMhd0r#YU609|M!8yJO|w*i{+ z^1+xPtAQMl8uA(bKSA{5D5n|>%lB0$y(O(dSrU-p!==R7+M3F^a`&rHW>fMikI@zz34X*PZ%_P8XYucsZ3(&Zz{ z9tNJ8K9l7M*>nL2Ydfkx3k(qbjIk>F%aSzYk;UkpH<&Z&OaX6VFROUF4;Q7+Q2amN z%qv+i4Z^zC`SJCv#%K^Ma!H&PJMhkXO1F_)jz2?Vd3`-a(l{&_FnrC`4UDX6eAEF{7koel2xTCt z=z~hkEqJ1J{3}jpAQHX?u*9REdGct}7i6*ywZI zQd1>wR>;cynKG!A?sOG}b+GuwX7S?N6X6iep<#bNuWeK`HmrYc*czM|U3|7fZbE4! z{f>J!^N6Zuhg&9qzJPzF+7q4XnT0H1BLpH*iLGytQHiZ)`$9#{_v`^nC*fmJJ0oNz zcZ$rk7F9=KEyL!OdWdm3imbVcU8n5)q$(!)L%QmLOYT4?P&0yl!F*iC9T+LM45Fp8 zRpwS~a+TV|*h7Q7$T7zWubc3iobXZ`Yi>LYR))n)gS21kROPDHzj9UUAPTmZ`BU4u z*c9bkAwu$oipVdUMOPPAz}eaTcxsE>O0Z)WfQk5^WPJYVFAfAdHqVJj9@BGpGlTnn zAe&V9pmZv#&jV`Ju{Q6wXw_eamaFT#@Gv508bxW%iJ`J(jk^#9-6VdxGB+4DTnj*C zu=F77!kPdI0ZsJlubhU@zt$R4l2TqixiS*8QtyF6vGap^4 zGq8>NxHAtQM<`4*uPOJ4U{+qDUs2Lpp5QAIP7Jb&(&9w3&7{Rku^S*`-t!=W-zlE& zBg$L5nCtS0Vy3@`PnL(Hf1lf7x;2QTS1>vt$bB5eT_pK?he-W7EmWlaWY-%b!D?Js zu_$jo!o!VP!~)V$bRP)O47FYi;VnYM>a=gdV`z>it9%k$vWes-gW{>z5`2z$+=BaE zA*`=r;Ri~6n}g`?a<`qx`zSh0^e%niq^FiL7YCI^ZzR_1ZiP66Wv&uRP6FK_ZKj^U z;n<1vmrXu*wGnb3}!t2q(KK}aCuvP&prpsJkB*qUrgVSqb^(GCBsFR@IQK!EA1z&p=^}p@rvNgz~}aXv(Y_ruNF?;qPDe>YqIP{iRnq8(E0C3yy@4XzsIY znirqJRr28|b43`;`7H%ZjO`>la3F%#OaUfB1GWeF8V0k)CMWzm<Ptbjvsr3;m|X~@c@^Y;fVRz39IQVG!@9)!YW`V?2?hHCtmW}rpb4j z0B7NYG=jzsT-M!6KcZl!{j99SXiI{}&dx`3rOW4@QP+-mV%Xy8y-%>c*x;k#UX?0U z?wKok&&tM$w`o7F#v2d6Us%O*k!~Wh1ul!$e(F>WsGV9rd_F@z&@GpiP4Q&o9`-Wc zJ6`1**wI-LE@wn`R;p=ztMGj8qiFv3BBAw8M#sj(F-{E;>kSvjKOxJf?5l2fN(vUb zT7SP&3+cm+k3f|+7^%&`8j$Cm05)YNrJfl2)u=E^*uiY%NqQ0Z0&p*o?b7S-5)^%+5sUSrJ4FnOzFTvOlhMwr70B|R?)5l*46bue6*tYK$~AHwX)vQ6>qtf z$eQ0N_%DtRMArJbFNlns6qC68F+%+*%py$>Y5{7E(~MWUuWL1ItM?w^ryNpj{4YVi$IFgl^wtA@~r$dG*Z zm>450-)cknN?mEU<~oza==RKT5p(?rk$Dfy#F|k*ba{RXP+b z5?$52OnT+oatTCd-j}6t;Et*$kiz+QH9=nC5ldT9+#S$Sl z&6sJWHxKit+(Rhi%@9Qg=rtX-NQ#{sNOiw=N(G3QcpBJ1z8Xi?Bj6u+|Kos#qRZxA zE06LSpa;(x?vm^x6Q$S!J!I0q@?-3g1yp>g9>==4wem})GCWz`Y;Ggb+?ajNOWAUa znjggqslOEmGf6ff^J)jP;R@Hc(Nu`5k95#Wr0P=bbeT)Blz4VSSjuV3!GF@v7&St( zqJuu#Qu5Hq?y;o=hm0zglK#gY=`bNP!s`oiS`J9CBT>f11PlA?oz2wv2gsjHyFN#p z?n$u7>U-WQhOKDqOJh;)Wtf6pWTZ_>}Fs)&!ah)pZKUOf0U}D5<$9 zZgb0@K0Lt^9C&n0Kgoj9FKHT(t$d4L(Kj(ewxP}ew(=^=fhlQSRCkH+eb7Ka0dfkg za+uqDeH(V{Ii^j?@mptn$2sIS_Gxx`@=Drx8f!O`Wm)ZC38fLGphYT;$QC09BQnaz zkuoOE@OeRwUTuJ$>~FbX*BxF4Qde|_{~>vU0fG?|6vHSobW>U_>A6`~~yJnzIo z&=k4^oFNxNhH{5B#os}CBEG&~8b%v_g?xo&bwvjC%pS6l_)s_Pv|!Hs6!E06yj&1U zy?%4TyI?_(+Fm%Bes@Z{vASv;tG|!8$QXRchi;-cogb3nXl4^%-3P0!Hjh8adKr-+ z4c61f3%r6n_Jn4CKtyAlab9OxD^Y3n>X0^NuUciKv=Dx!RWCB#)lcMo+RsKkkm0iw z(U+Xk6l0+`#Ax6Kd&ohw6D4+ei9w`ywFQaNg-!Hy3q@b5qBd~b1>=M1`^!!o3oj(4 zoJluWbpl&*f8ICQ#OWy|UV1jTpfVII{-1u}qfC{RbGswdg|}$oDm2^T6>luOfBvS! z!mETgv3c{J13D4B{>DDfYt{jR7vJ1L_BgtA#VK8dc;UiTCk{LH5P{Ry*?f(U+9c%9 zK4BA?+3gJ?Pv;XMYURZHJhI?J*del3Mn{=++FDO#*O;K}Nz!%A7C=B@(?M9?7;bV8 zMo}Q-%QWT&WJXd3odhZvs+gPDZH!y25R@S}@A*2`rMFn-kCTB2R^3MKsU-qQx+0zyfi4vD8WwY|IU#tM{1< z()dI7pa)JIAmlG5wZ&OJ0Wq@0*~A^+xTM>XaV=Idr3%IBTrl6vKs=`FK{~S~V=3}B z!&mQyTGmn|(sqnOD4d6$W_Tvdg7dU}T>JRKEEvKEp1k}0=9FlPJYGfrP4lj1it2_az z#`0^CU@n?ese`n*R#Cx@98B0|nOssR<}0iNMeMNpL9_z}y&;zj^Wq0#2zLB#6^o9y zL-=WwU@aA!-pjSpVq{uqgMwfpwSTtKWt6nV-t4jE@a!W{WNL>Wc`@(e?Sc>ylDRhi z!Qw&S4TCro+9fL9TRUWr8I5z0+AieTCULhK3sv0;0(@Mm*VGVka_2GI#^K1yp7DFt zm&b3jI(`L6&yps)Tlt}fvf=2RV9OlgPP-jS3j$C}UJEhw{`YNk7C9#O`J7v*fobGg7V*VO_=qx}+F`P@B&~I>UJ7KvgUp2)`H?L>tZVu2Jf99NPM#a7CQjmL#%>@-Q{z&#$uZB{OFc)Nc>oRE&5*-Z}@=Tba zTan(SrA49RgJ6-CVQT#dt$88b#fQ;^H2r!>CFm)P{e=U2)cvL4>~Q4 zaxr!Hu%df3O4#MtL-nki)w4}?t^KNC!d|`*I+D; zeEdL}{~!@0dS-}Z9WTm%A5~LWM%;0V(q)I7?m~x)Lj%iH*X4rIMkXmT-0$zAHD{OqM<-BC$oN;C6m+JTx5^V)5mHg=w;-#l#uRdY!{ zFzKH8?Hn5!tD~dncvoOAX*8_|b~4Up3lU#YWX910OAQF8_^o3$sLf8R{NG|^uMM67ly97) z>S#Jz`UWAiT+li86!jYq_L#xtprk#|5H%9YWgE=KOVgu5X?7E)&U#aMGf5@6(q^B0 zf(q)oq-BrSEvkpQa_?|aYTu<*3X_hAkukxL9!BhXMmPUnBE4Uqm*GL8#PmxjeTU3Y zaB4Z#PlbxoH@~!q%;;T48lK>iwjngGh@IoxN~E2C#V*}v6`$Hn2VuX|#iYM1TT(>e zlfQ+jtyXP_w~JPBIw6#jk$H)~iogYDY~q_uUA=O95A+iKN{;x@SzOzSrfEqd7qqPt zMY$LhEiPY)w$k`IE~zGFH#&Ktu}h_Z|Ls_WN!OSNeO?qq-q*|jr2&0!wgWEdX@{z* z5Tn~B%veP^b30M{%=DF?+2KDE-BC?l5N{b|_7)+exv9alxf$Ld$L;zSiMrBex6~Yq zC>9oqZQ+vcVBw8w>5}?`!!?NVSJNR{hwv&FMWeC#1h&FAZ!FNEHIuLxDESdL zC$@Is5LXVJ1b(Ipl6^$})V5al#zYrFB%?XANS%x`>n;EEg?ccl4JI`TeT5PgVik*j zuk9noEsqGG_i@1o%cJKcJEUC9F+pzSuP%@9%0-2!!nWg8pTu{B^EYWgrr`2`9H;_{ z^5kX+FmZKaRZ4E_Qmv<~LYZ;VO4B%tsvCef1L?jC43Th8h#3CD#aLK1bitYB_LyNP zvx(H09l_%5tHDsmbX?&TjWxgGbi2nz4*I3Kd0~M(ZNh!rFI@+yiJ@w!4{WD?P9Vs) z-_{nSiF~ov7i&N?Dp8ets`eM7HAV?k}I0KTE3$% zwvenT2c7bCbELGCZC!P?cM|EZ~J0skW+|Pg>`lsqRe_|Dx zTV(@LGR7%<@6E?1@ZKA|Puvun(%a2gP=6$p%1gnY(t9cRJNOr6`&R{vek*7DAf54Q ze?-Z^g>n3>w9YP^dWV2#8xl#j2j&U^L1na|yBEHN6y%*dkyNt_z6b0l*nmaC2Wi3b zt{wCu%A9h+4w{aHL-$FxOQc8XZF*UmwUYLsEXI_%)QLCr0bN3FKUP%f5{@Tz6?U3n z6NQ8H2D+V!-CuqCla0#c<(kj^dR<+x#Xn2~f$^pvkF&?o88i>M>V~h6M_XVthje!s zvITeJm3lW!T6nqZDRMU7@Ng7?XLE)#P3})qTgBnMuDklz_qy(?_Fmm3&+>%v&;#`^ zt&b2-$3Ejt0Xzh5UuGsUgyEt4GY8x;_ooo znAj*oX7bQy79lWLWEbAji#t`V-gFn2Y|Qg~ ztBHMTX?*UBy|GsKe6p1!}R6JFKv3GrQ(#>KQQ>Al+n*7br2cO20`w6ec?++ zGM$3m8jd!K^3RWj_!$({iD@Lxc9i{0{rd6u{-Ibm?qs->vIq|HLdEHECj)2?F0{jf z=G))JCP*UT!@i;Jp2)P29;eMbk*}cf(`Yj)N(1X**!mfmR4Pn&K@kqk+6^QeM)zGK z6QKBbLaFfp7nE*mAPRyQkJ6AkX88G^ZupRJaVxLBGV)KVya!F|DGD;zJhuYlGdrmTK?w$ zqGjTiU!fT(8`usXr(qa>dQ+$_up7RCl9v<1WH1g( zkXIRpTS&0$gJ6gt8?xE9p~8kZsQ@pQze&w^^P_h_tbo<(mUF}lvw_gcQocm zM7qxhR;oI}CAnae(F8aO8_2(8YBqJ*)ZGPK_9MpP>fUP9?7?|@ zQ(}e-+WLZzG@0wp5WPh_ejb6h+2%qa;Uy<$a%XA2%^y_2(a$*gc_9F zRB57ySwq#uxYEqHjZJ-GD7M54ulOR0yx`U2CXn~-SdYC)ol#oep;=OkS55?lii<;j zu5LDJL8;V#yaBbaZ_z$rH5}tA2i9WkQanU7M|+6NCmYrvdKI*|F2mtPNpC>}Ng3lX zK`}MPQCcXuk@2Awueor9_UxmkVrZ3TXEvsaU%A5I5eit4 z6DueMl|s=fjuwRqd%k24Nn@LvX)cPbSgSU@1Fj7J&*+)jrN}4Y8L?xue^B>LjG`(X zy?4$=+4J=fn2pCZKE&_-{5mTw%pRli-%%A#L&c`33qh0}9gmtUGldB=C5;8eNb8aN zSATf7{t??a&mV3^PHOM2HJRv555^vUG?WgE=}zJvw&q1zn~S*!ZpQP-uwEG$EKMm>3zNL5AVTNf?#0M{l!pp`utI{=3H&;*yXR-P_tuY$YBnksE&g<<3o>{aFZXN`S`QX{6Bei#59+b zXE?Apg!f&fryG8lZbdp}I(Tfuh51~*1nF*ubHwG>k=}2ZJ&%QeyJv8n34-ec&Ez^e z)bgQ7UpKD39n1pftobZzd1sbOTBGy%etRs+u+U%wPlorRHrXzzs$t5!Aj?|!^GGMj z^8O%^zPfsp$ZYm(JM&iOyR3RjlxFYJ>Wgy>A`lX8tq);f<*o^orqnT z3X9TpXp&Z}#kmUUGZ8yuQWL5Ni)$Y$L=mVkTpj@X?2W_hl0%%EF{vk=a>q;F;@Vm46lN- zCGwvyZ{qE(aZ(_2Xk0*;NK0sC5kqsYu#~i9T!76C!lJQUA2cHD(njXGU~)8y8VVNJ zjG{TfW-yFXk6wd=rPC;wDT50hy3i$c(C0uOp!p6vfc)F|s6AmLJ>Fiy6RMFRaT*o2 z2k$}rD}74e0PD&-B|6o)niQ&oot7ARcUB11eIM@`oLi9Q?4}R0k?NTKR57NLP~?nx zO$pKVRFHD&eu}=U<2w|I&o9s()Jl*uAu#G^3xRV~Y{T%xChP;&L+gtnPQ&2N00b}H-?7nB=bE>W2#JJnF6hZ|F%UNGimopJq z+9`wzk(r<>#Mi=tx_2JWpJbW|Y~-`%B1?H$-;?{w{UADtLR*F2LOp$>Dyv?~cS$>q zIp1+z;wbH*L7t;DI!%$OESYPt>=XH$!*N390~eeari)l}R1l3{2F8M2u1`UNU9R5* zjsmhxDBNi*XGR~(E)ZeE;7e*OJP3d93uEOGAA;fV9KU_bZd8xo=5v{SK*ic$`38-i zbFy3yp?1!qn%(dMB>qO0_y_YL-1Kvyk<@wxORzJj6EG5f(gy)+8eT<3FRo~%)hHN_ z_vB5T_r*cnS%0M_eadK85ARu&uj>&`g(zdM;>UpOsZPOu2kv?8&`u($c|G`!dn(Nm z1v%2?%a5_)yDl*sen#YsZkr%7+gME$v&AKS$^x?bALP2|K5{9hD>1TlyfjXv{@5#m z0%ppXP#NDvgu3%~vOLsdhaT*f3SE5KCWV$3K}M(F&8F}87J_N`7ofhqcWs7F`VcGf z5*F09(jgS4!yGcMl<+CZWV-YR$Bual5e`7`4V| z4l-||5#t^-BHxi|EE2QfQN;We=w>cRKw>xw^0+{I4E*h+76#L4lw?U+l)je*M#E_% z@O8}?K2Y;1+j<{LaPLPz&%HQ}({geUmBN6&D(Sz509!sFFUY`p-w&Ape&PruM&Pc~ zK+jz^+BCN=%s1`3F`Js~2m1sea6XWqdkN@yZumnB_qUAMdJIVfmCuB_mcqZm9snD- zR=~Ta7*fQ>+!eg&L}{L`pa6ZnP) z^F4R~*dFE9&zU91U+;*-llrfCB@f(%6AsIee?iVHC$H^Ta^!2*s0|Vc2*&sta0T}v zP~`n&kD?YkAmq_ckRVJ{y^y_*d@+Qy>AOFR7HQRA?nECPWIe>xjjVV{KN=063=nnr zx}y*A$NH%5gk}^&cv_)kp=V26@LT_gZiSkE3%wJ@^uNej+^nsyrqj3%8(li$lD@z+aL)&<9d2h5IkprYTfJYG)DYQW>%GL~ z(DfCXWZk1zI?<)G_#C|!{=zqA%OW=Jnd+i`*V-{uehzCf2DRw^hH$EV9#3SC@)<}Z z>vo~>thDRB|m451slwgtN55XJl3U)m`WTTEA$d`y|XC^ zIK&I*6(nWdzC@8;l=UnonridK`LgOWTZ%^Sj;kOL91_xNKypLCpiULeY|Pr}2r+_g4zQ^i(6 za#xVlKS1)k1O2yR6?^=DL|@}SG&}y?ga=T9xqIkEUi%dRqBN?L-gLki%Vt`hGxVAh z2v1msj6+v^HM?Jgrf+(?8v*}fD9qD1NNJ_ee z)z5sk%!i}8#Paz&=>ROZ#-i8;;Xp1B5hBIC{g5+!hfFklfLsCAlr~Y+pB^@r5(0xH zYfM{&dXpjWtMCr;NEg%xE_tcGownenU{Hx(+M4iC*{%`tlI2Z4X9Q+cJ*raY78**`cy-%WT5y*#-WThkB9zT;wZtYto3MW)ZWC^2REjvhJ)xWp!DTDW{% z+xvop`I|X*T-A6>_9``GJ!Dlv%9`F)F40#UbWVL`O&i;>$6jgiQM}S6a7vHO)^KJN z72k8=q$cz;89&>|a33pkWXWbz^(s{wSBb%!{bIAJQedQ0HgBfpr~(#bNopJ@x}C`Q z!oXTu;*LWQ>|4mPhwZEfcpn&A&#cCoFO>lIoFq}IV_7(bDx4?19OIwTZWjAacsVy`!pO@^wY<|Vn!XEC_0KvO2z1eP-_F%(?%zJ zsWA?VAP(#T-vFIKz|&a$`ACbf95FtZYm)-K%ql^3p!6>Ul_;~W569V4CbIg5-~Ilv zKJERUzgj4<`FNittk$dWe2}K6E~V9_|HIyQ$5&Ns`)8k=lAaUNLrBgE zh2VYOdwuWs{&;*oWbK(fd-giB*Q{ByW)-6^TSM64<%(c@(mkrZP1BH%MU{3nrsnEd zc}45tMU|ik*KxoSSStsL;($33zL2d{i@In@IO6uL3yOysCeFt$BGTRk6zWouQjdxh zrlMwzxc!S_T(h5=(1n&bQ=%78bu0Ee?*qE<`3uV8gK1`PJPwRud1U=Qlqyho5@U69 z2)xQMb|V2D$~2k-IMXokQ2kNLUcDmqnu`+4)*}Dz zU{KF@Lw7Zj{&+GZ?0_cmA9SXuRO1@sMyz`iOBcy4-=KcAGe8- zk3JPjv%}(*k9n5^*ROC9YlyJWi{bG&Vpt#)3qlB3dyF)h4%Ju^OG{_7wm=E{_<}f5 zl6A%lUYoTu_`hD4^phTaU6N5Cz12g?P`ei|Nl!706S@4YN#QmI9 zK{l-3M|;rDrmUuOfZdRGyJh2eSbff;A%M5T*?A4%3gtNUi$V32m&-KK9KQtyD2hJ;gLEt~sc0tLGMR=gBU9!EA zOvE=4r6grJtp~JOe*Pd_jYivJD79+wyxLe>R%3Sp5{`V}%06XjIQ@cK4`BptGVy?j z{;5|tU$bhLS|1L5v(ARj!A&YwAPU+E6yOY1Xvf5aBBL2)Hur@hqZi6u;;Q%Y7i0%4 z_qWssEM9izZ#_Y8qM=P9hS1FsT@VuYwN?NOSqwc=aK?y>i zvqtjxE0Zg+w!?IH_#jg(|>+GWOT^hW>c40mu3E0Ih8ik6pJW4Tsb7VBG%&qhE<8^%(tq zti1AtGjHEkayb+Qvu}lL8Pv}rsNn7S*LyET~lpcsRqKf(nM52Z;c_OfAll*VBftz&~fs z7c>aBS|TZG4xrXys3<-)D1=<7cm#7VOzd0U7jcx^BfJZyT3Y$|a2k%nfbc$UL#7(4 zMVF95s&Kb`Q%&}Gjdv5;C34cZFLSg@>ePV+ktH-3u!Wm0{N&NFKGQ@|aLWi$`t=~6 z2ce_luM3*cSGSL!T&U)glYP{Q-%$YyiI^E507e>q zoI;0jk!pS?1Y>R!%CqfZhSo7&`7!o4lRIqz#zE7odpZpvcep)!B(2Lt25#x~w>}g3+ zH-lfgfAoDQB$=m~aWher%|M{Dg{WbHEqTqwP^v`XL7e=xsP{TdBhAs0?E+eg!M$Qa zL}8CKFVXt0v`)=h@oQn4gJ5RbQ~KEBDJ`rSGlufcpe`nW>>+tEh=c`cq1GulNfM-} zzAMd-QutQdV`>|%FZYQ57h{!Nmjse)9<3QGnuBg{VqvBn7f)iR)9!j)+smK9xTbf- zg2-*Na4`T&+?RlS`u`hXuK2jmPqEOHvrGLJ2%1~XJ;dQ7ivvC9?ytYenY&*%vHC~1 zcxWi`d|7uM>J3y4_z;GC)Z|}OG59mzXrC_?gJGO9{#Gb`-cE^EnuoEY6ZB~wNaSWW z_<8!u>q8=?Pt_18ghb%^$`<0)!9Vp^DzSS6_*DcwVz`g8ZUs#nN^m;tSBV*pQViZx z_0*!fs3i*h=#|^RY-$?3hf+<0OJB#<@lj8`BOX5LxhsrvV;P9;D;yGn0j}vj>aKUu z;x2afQ0{`Letjn8?x^IrLXQD*D7x8zm1z9z-Dn)WMHpe@(Ak4|)CR$R@Nsb*nAcN% zLr^K2B)GR^zoo`2J*d|`@kle#hx!BV;9r#9Gn88GZK8ye?O{ZiiPcV~WxQ_f!`5Ag zc5{d=K!q|a71a+z%zqPbF$_w20l~&#)IPAAScAF<$_M^Nnu>aB^!(pElRP}Sz?8#N zo&K9=ot^pRUuiv>)cc`WYALmMyt0Q^5y~7B4%VL3M{cg^5kO7@Far=__h==c&HC1F zp8DYV|)Bo&FAow zeg^ErzIr{<2~+DgMF#`_V&7?wRk(_;|S7p* z;Os5yjT30hOFf!vlqvDN)IE9B7ZcZs={6oPDooxgMY0CmayPh4N_%)NYTeE0zJRWSGJ+{ zAf068s)C5oW&~Q6tV3T}e3^BG>5baTrH3_SU!%`9G3S4;9apnj`FriSn$`WkQ`-Sx zz~&e2W?#d2QT$FwusGTDv0$2r>N`M*?c~@-(l;niRyNbHf$=h4_(niJj{g;~Eoi*O zAaDW6bvlVMx-YaTm}!X3qHf937&ZrSSe@m5w+DU#Si%&32&AdXm zdTMv7UHqmM8zstFMlhTmRPZ=h1pR>KEY?MX!|;2%F>HQ$w^8!p2#m`QyWL-iN9pA5 z8)C5#kNM++?4e5F5$(5E`*nV{FzaPHgqw^~c|(+b)KGfPZ=d!6*s^sJ_TCW7r_c>!c~HmlkQ>WLU|EEl zjOC{dvD~&v4%~Cp`$>d;1co>}ojj8YMl&OS>oC z517l(9+S_)iEtw5h=TDHe}G#6J2-yaDU+7sV_ApVH6?~OY=NY(Wq|?7Wdk_XmvRh3 zjAnK2yBcDCC+ZGgGDb)nK4drK;qy5uZ$kruDABlSk3P7UhpVH91w*$-Ub94@6TU`R zSJ03L>nm-rDDi3hb`V$xKpv-W8jjNuH#(>4qH_TcXy|;Wp%ZXgLq}T!PU~MZ5~yt7 z>lSn{H*3(6v-8GZbmuS)$us&F{a$;qpUoFvR2dFTA)cRYh$-g34TD_t9;s*~XT&-8 zj6j8)5hE~AJR=xJzqzM&z!uBv1_PFhhCE;w^#OYyWgf7P0eQeKHALgc`}+6$vF?Cn zjdTy#&-#Gj z$L;sJxOK~P<90>EjY?3X&CRPCVsXqhKCj0$cHWq4_&uYcc1=SqC`&sUmtT(wJ&Tl= zc}@*LJ8xi_t)Fk#;b~{xSiY(~t1*zPct9h$iIhE+yBIYZU6^^DpQMn2Umal!2AaR? zEF=)uXUlKMG1u$avhdabSxV`t6@2{A(opr>kOm>Z6pJkMhg0E zMQ2fwC>h8M9n;p&xiQVrF^vlacI#^xoIgs-Z;b17Jj=MwbmN-q##Lt>xjL@L_$3f* z^BUq>L@8Jko~KdI>!{}IsIEeVhUzRG)$^#)26eW3Py>Kmq5Sq8Jv`^Udl6Vd9>@R;G3;<7b{0kXi3@eaoLHwd#ELY; z0*hrg%#J~i2)CutBM)6(ouQj{qoK3m>n_&Op=$KZ9Oe%|9ly}Dy^BEy9RZYj^NT)uwQcW5UtUl^j z85gfuqOWe(mJwb!&ew?QIsvL^V)N~zmbg15TNZPOEY$O0<^b|wzU{v6)?#6~Kxhlh zjR@-VDvMs#XxWoj^mlZOhmCiC=?yvwu0f4Pf*aj~8w8}L?5;)dmtEJf9Y!#iynqz1 zCYxyM1eU1Y)y615u52l|$vD2(a8SRii{k(~kCyVYzpvxiJll=qW*x_2sL^oTQWwWh z>fpHPdj2hOv~G3dWKn}KO}6T&y4=-P%#y3?lN@@tK485jxd&{IK45WS_^4-U!~&kl$FCRHHLO

    z{SMK76}S(Hz6~6JQq@M<-9w#m|wr zVDa-cKq-EHTIY8~(S2AQdDve8Y>F6v#elE#&;MNS_{nLkj!UJF0ofBbVmcrcE? zIjt~jQ0#*0&0Gx_Fe6?W69=QeD*ZRWt5@6boYcNySIP8n{+xqjF4}_TEzFx(PXRd- zRgq-D-^tiFHMR8)w zn-$VUX%6`L0ZPfm8V=k>04@Tp`Q>4%qMQggOF2rL0pkEq0N$*;L6P}5oj0bc)iBR} z1tv#J#*7RXYjfI}Xf^HxVf?$i~3*#Tt;;2nT#0Xd?_4|=)N ztauqMW-K7GA<+APx5BjV3gA$bpPG$+(cd5RC3?2g3X~nF-v@Y);j$k!eogCeAYe35 z%rejkw6swnD!Ao#z&jkN>Z^KY3*9sy1LUig7HHcRuT~!T`06!Mt|1Q_-TpcbJ$VoG z2ri;Qgf9Z-B3_Bt9LQ%%0`vB1dUxK;+dcK~G+nbO(-z3-^uYpbj-%&nH0yg7vzjNb zH4z-ado=x>4PW4-;2r;E3Z1J>rI|I|bJtRJ_v0JX8+YYwe;yY(ejxWey`4{CI#eFi zZXOiia?%%2$s$axfLR(!+MZ>WL@Ba$3@B{lHf?7RhU*e}&1hLsD%w`d*(H+a&?_Su zFkeGb1?2hudP5{9E~l4pmnVXPU#|(Xb0scK#q1AzhKs=;_B659u?V-rKy#Y_?a^o7 zuN|asq2eGy91>=wh*b(p(KznqB6p%Z5m@x8tYJ_DEaETiAZaDhmB_SS=iR3{* ze*4OXZ!cOQ-_GM7fgjFBn$G}o*5pz^yY-uEb=A|KUX!ZiC}SAEEpV~+o!bENdmaVk zjp*CgzbA~nFq_%J)IC+S1dVnpeOx1#FyBMy-Q1T(=l zp`T@doW#A)ig*OD=V|$YfvUi8k$MMJ%!bba+M6G|=1vi4R(D@>E7O_SKd2dxdPCmx zO>M~g1M*Ph0P>K#^r6s}2RSdl)`t9LN_mTk17`(*Jn+i^?dCiO(E5lj0uLz8Q8kL^ z?KXEm+Pr;rCAv2p&4vFL(+D)7T!B6=0rGA>bQRz&Z~Wkrq6RjYv6 zsoC6H!0A}f9gRL%qF4mT)20+K#8ADG4&y@V681<+jik}5nHwY57T_J4I)0y=!=V(k z26hX0_%^_4__2EdXW~;H6hR@#wUD`1Gp36yiB~qG*}#J7XO$0~={MATPVW z>9FV9tmMC!#sc2%|M@RoYK(e$y^OF%dr{ZQbm9~eV$wBS+i}2Ue+R4J^~vD8)f4gu zTl>=exStEg{T1MLz&F>&!|1w@W^BNs%$)rLTrg)p0(b{oVaINS5nYHpkb`Xj4&?Ya zj;{{Uu=jDAD%u2Rn7LupCP*koZb+H9451PD`zeU@_IKlzM=cXq*ldlgRkQ}B;ULxM z_xMG<>1MzQC~pDmf&n>0wr5)4=|FUjFlLklnE2=K@A#*$hVLFwkD_KD#KYz5A=(T$ z%yj518})OfTJLd2ka#dKEQ`*2G}82^jf zdZ8OdC%dqGkAF=4K_^!PAD7F~KRu}RRxj1*BpoH~j6jcE4yzasdswY8$5S=S=a1TB z@@(6a&$fNkAMq?52Ntaxv9WIcHG}$N1T@bGC-oDI{d(UVO39^CWN3}W>{&0WySa=qRr}9JDta4Qv21h0@QsmjbLh9>h5>O!TvN7KP9P6nrf|t+nH@>pohI zQb(k}`-YpCxC1M#!*vLy9+Ic7qO4ovP;oVOY#cQ&PmW;__EW_;wZL zQTT2nKh+2+RH!*{MBI-e6B1HCpeUM^whI?Yw`H2B^)}`vvT@D9FN*;qqpnL3YEo^I zLI%OuC;dRL$HXlM$KeOr`zMG64}=H!$slz*K9MH-BDozhRkTrq!0cCAyv3jymzotG zP#e6cTyDR<}Z;$Y!45DhGa=$C!3qCqSKG4x$YMZ$)0q+H~Pd*WkByrj6Z8sTU zBV|^%UZD?A)fVjbJYZ+D^d&cnis8tDqgL`3HkBR+Yz6z%*?{l?bB(Ivd4n6jon!%S z81?un9?9o-QOegKht#Q`bWim3h_f%Z2ZD6$h?2WJ&UdK2iJDb&qmiwVe#2*|Jx2ZY zWA_uGwov^BZ0KUu>W^tP`pf}e^QEe!7$w-%=Nr(8CurFOR*=!}US#pTb7uf$eTUT^ zCO=uVHN3aRYx2rG3k@*boS@lIWj5?uMftAYVdn}kf zD?Y(W1*2GaQp?ms(^2~mknK6Z{&-c7v!Fyn^9 zj{$FiTETb$`+Nl0Z37q!^SU%Z8%*6Z0Xc=pg+E%uX{g$I%tY%@mFQow)JyHI{;)w4 zUA{$K%NCpSIl`A+TLksYlHO_@)1?jOKkDA)91pA?eo&l9PK^k?o`$`(5GB@OYEzCw z@-!m*4Mx_%MG4VVNuEk4(R$!FJ_ue5uLfG?<4`WaZvrtf5rH`LCo{$V&vLk%xgG&@X8>Xaxbo1IC)4%pADH7Wqs@Si zYxKMj#xHu;L=C+}-P{eR=#cRmxe2=cW=&?;0608#o}hBC@fw1kG@!fDuR5Scq;!;I3( zbPcLrL>uStAY2UFR!SFvz;j8#)pXtf(vTBE%*b7Qw*r0(y4M|JtLPT+G7xr(}-n6|yMsIfy)t^7gX zL$=sBnS*R0F22-rb0aK)hXeHpA%0zm=?108&A{_^eHEu`==t1MMgdX>DC@rJU8`OGk3sBd|MB9>5 zR-?&iP>S8#fvJ~D4+F|@E`8MR!f8HAx1#n7KsKhYYPKBVwcl-KA}e^p9A$&Be^VVi zyZUrzksoerD@tygWTY=K-^~~R^X#LSV#yo`9Kb}{0p`F9DCohpaC&MVXQAV$xd*RK zusW0{@RD4>4ti{ZG@IrFu^)BK5ZgfiR&JY4+|{HRZih7EW&YD6sAZ5t@q$E?{9d>& z%Ss=J7_VLd^b+n_EnggtQNtjj6rdCtK1x46@zPAgVLy#!6?e;UH`cQ2e3N43&e&B4sYP+kYXJP1WNbV=Lfk%far|gOOF8Jflzkf@K&Mz5FJA2 z(703W$09X^$2ZlL18Cv+7aY!~TcDRDZHsiD^@8%ZD%1gypzep69OeLP=tFw||A7vZ z!W}GC30n@b6D>g@)Ex|?^4R(AqG-9lg{;v?3PF((4!FI|qB6j!e-=nzi?i3yHPPk( zUw3B_bd}nf-u(9%c%o|z)+`Eo`v+6^u5pS<`CY_>ctx_`l^>-xb-0n0IYZ+eSa7$}!+;xTd!$3j!{~HFaVpu&FOaoByC`E${ykJ=2pyD77pOcEfR-D5Ip4~6Tgi$r_BEl8t zYYY}hG2FH`U!z!gbaxPqj&?v(^%vfB^xuAmclAk)+_eRz5XD_2E_R`Krvu*gKO$hhL;2A3 zi|p8bOGX;~l86z3FJRfpS3*VV2L;|H7#{!PE3%gy3!@dyF=)71kZg$%CBavX|Cr&1MQlwqz9jVg;p82^{Mzv{y=-mCuMt!ysw805(WJh0$<*?nmhni1{CJ-L}V~u`6T;EWZ7YP?xPEGepm0R#lXR zAbaVEPL7&%D$U&fg%#cA#675whqY$4{!1P^<{Pfoc$E2<^nwxrrG3M_++GVJdGO`N zB4zb%fART>-~6onb0_~|P#rddwpdsEu)CY6o_yH8v4se zno86kLjuYO1vvAO%&&HL#QKkPU#Z%7<7YpFcc!afR|iyf${1?Zjahj%r2@XFET&HY zM=I-)5Ejx~pY9I$wa%tZfE|_Dt_y%~E5_nR9Cq&kPbHXq9&spL=|`2PVIFzkDpz2k z^hv>t8IsaSq$~+D(zR5F5?C9Cit^Ab6WKtN+Z@VQ=JiZcn1mt9iUHUPD%On@ z(~H-aY19w!dCb3ZK$ajwfXkg=gK!moDkYdkp~#~8Y(Ta<{gfeYHxgx4w+BaXtx{>k$)0NL$Cjr~?7Thk1?^O{qtiMBf zL>t67aq%AJ_-clSurA=MwFN9wj7!7Scq&+kBqHRCuhs{v$-{t1(9h&}@yI8k3u7XatM5o+2X{%|F( zOMoGYa?<6M;ZUv`ks{ObghQFt_@v3#X2yrZU_U!F4)(~{2lA&gSf|o@wCD;)=Zk>+ z>7II0`*dpn`O~%5hTG>U?bEda4&`<}WA1!gs27E#>E(up}rZ&Uy^C$>^8{<>8 z0>r1J!GI5-aMm$c#_?o#z}xZZGTyp1jOL>-z_b_=p2wV`n?uO@q5}bX z)>9SWI~F;?c6o@ZA%(~T@e(q7hD2Fx)SO>fq6kHy#RR<|=#9v@N(xDcFB3uUbMmb#W-wun69;T20$g6e2_)re+ zN67o1iHz}c!ougSseo3I6D;gm>Asq}szPMGzU^U=f5$hSXvk!+FwfF5_%L}-cn)i< z4Bo`$i_NDFApfZj<$wYi>As5QNUftzsEDLy(;RR{93o0a9*aOkMF&C!y+KW;16Ax4 zx&wAKl$Oyed|_Pg3)Wb+DG3%52T<`00w>5EIz>e*d^od0Mnz=(RCQIICiE6*!BL@f zVTMCl!ve_gWca-Zb=849Ln%V{EJ_~6y*!gVRIDBroNicOUw!Y$Wr+~K5 zOpH@!F((NUC2y~Gh_&i0A7vz^y~fLEDvbhsIqZ080~h5|S9g(~KkjiuVGsqqg49)p z(k=DFLNFn^D<5*byH@Ul3{+aeY-k{*edd53)>qLl;R z*6y$7vS}c82i~CST5t*#(Xmm8pr7&As#PI!oUF1fazKlO<~@%)l>4FL@4k^2yN{^~H&Ot% z{^U^JfPgw=lS4UzlhIW#Y7dAm^dK35^+E~Jl ze}BM(?EpN~?`p29zZbf*lnUZ{6Y3Z>q^ zI+R`Eg+Vrhstk?82ET{Dhp(T3v#f$vl77SYJzn7M3hKLj7-4w#ruaKwDc9$ogxlcK|;7l%RGe?;8J8){rO8d z)ooS&I4ypF?14_acsQwmjV;-yqal##QaVyYi&0OUiolcU*RV|c@{@_$lj4G5Mi`AN zmr_2taJ#YPwfAMZaH>Lyb#avOtpj?8PgiI>FZtZeksi~yay|XpKliixKQDL(#D07?sSTR5|%4i*` zyYUcQ9v4E!Rocd^;#8LHIzA+dXO2TV$~@RyvY*T=2@Ti}1+C_-8Jy4m7}we7yyPxM z72G9r(6Z*V1vkCGd#C_P%+ZEzjcdc{Qpqx#5+DX2F#Cw13*+NO{=Jdj^uuO|6NaA^ zQ9WfMj>SU!jIIG&ShC}=L3Kjv9@@$jfOfqR^qaMRoJ>(X{_#=+RuAaifKT zAidqtI8F?lJ+a;sQD`(z>oq{@RV;k1ev_v@aVQJ4CRW)b(iOLZQMYywdML6antJXK*BKhy=T%_2|Me^6x<07n+ zh=OiLixBvKOyq_;!T%N}QmiwP;{V@Fr1(Zm1Z46bGLcm!|LsiV=O6xECL*8wD@;V+ z1-5@6Nov0SK2Gw#K{E0AzCKUU%SaxpZw%?6DS>}CRZVD(6usE~26Y@?v;D0yKc3tyk!3uGqwKHeYpRnKWP20yO*GPxE1{uy}6Kec$uBYM|i@uhXyxFP@-d?YEYM# zX`c10;Gi;1uH?OZUKs^NCGcLJ(g4{;AUW+!V^NuWELIGioa3 z`TLx%k?=+K?R!R3Iqud@BFG_f66taXPonyI^SZMLV#r^cMJ(O$EYf?$EaF}j!|OHD zP2I@^#rVHEnX)$MlSzLAPbR#fVC0)MZ>T$+@P_|=(}^+~Cm^GM{+(zaO7g48uhc90 z|GtvAG1L41F{gaKy^iZ?W#)QvRtaO}3O1Px6R6JmOM^OW*EGYqJua{8Kjw`IPB0R#&Ukl)XkO9(Q z$YjmtBbXqO{rK)+8it1=xp^b~`Gu&kEAP0r0{R;~IjdK}abq}rlZ<|GX6vbjitOOX z(0a$A)U9m-vj6hkFi{{5H>cN85$u0ulSvIy4;E-?qc@YVZE+I zS~xSb%ib;lrw>@<)%N({oRT?XT6eZ+PY&g5KR7YJ!`Op{^+*4EuaU#qHB`DecA9Og;4uRpLZo)C^>FdE`!{O6ZuNq_xahBi$%0HWRzDD{AQy ziwyth#I>ojM-l)mbP@qJFQFVf(hEl~*FKL8rSm9oY60~q3T-+iAT!T)qeyo33ZXYq z8i`|<;(`Piq}-gKG;zH1l}Y_R%ZLys<5WEoxn@g?6HzaD>bA|pdM}MaW7VG<2dl^S z`ymU7bAr-bJ{;nHn4UykYXj0lEV|`j z6AMmtV7U_ji#Z=2d7)9?hGX#yN z%q|9{iMTrOKBUI^=8;w~3CQpkqc)8Qr4o3;nCSK)3CcCMfhe(osD)b0XsvuBN)jg_ z=xc!u=?n)woqz+^ujvdR+k)OSEJ3pcMTBWlJ#%je4HGsP!W~8ZKqLgXc{t={&XY9= z7xT>%J#i>w7Mb(xa4PEGKaxs|Y5y+f@-tGjHmZc^>x%n9RTj>m{2BD*SM(Q1n z!o>pE==mYr24nCb;Aq%<>;c?tuH+X4(8ZQXU<1F+hoLc@zatJV6uUCPs1^x`uKFrBU>^Jw&K8iB5mg8ujSk!WC%4MFz`P~Bd8ESTM0!sr~? zz~_EOeUAB!aI_B*+0!$FX~DB#6hLktp#FoxIF}e?!RHc`Vr4_&^X@l9h~mfLNAx2G z!bvkw-5x)t6tEN~x7jaXigQ1J&uedvuFV=2M9+*#P@dFshc%J8!|a7GVv@n+HU{v# z$PS#x6dh!p_l2@k6BEDNDJ>_Yn7Blg^_>}M;+k|=md>&HSK=B01LG9+_|5~uI_+$0 zVe2xFHP=e|tZ30&%(>Nl3MnrBJ~!NOcD=~V$!TUjE0YV0QH|y`SMtQ5Kjub6$*P*1 z0hr{vJz>s9k=`q}nK?%@$v{4s=E@Y2{q>v(ttwrl1kaQEzHQ%!i^>iqp?-hB0z_j= z$JYzxrjj_zFYjRzVXe)&GM6n*imuF!4)(*eI<-Mdv%-cOUv997b+I|^M7NN6y!lx- zZ%&BVoIT?M# z-i3Vurx?qQm}L_sCv$yZw&RyFzA+8DI{{fBw@js3xNu+rmgzQurS)Yb;~MorUvIJK zK&}r3rY0yU)a9N886wq4MLiRgByTOyt`YVmN_HG3<2>B&?EB?n#7}28`Dx$Lm#ArD znB*;j?r0Q=Zo5s)38!nlunzc39t`_7FPk^K&I{2YycLAiQH~TOC_HBSX(g6%89aRM zdR$FqPuP8YHIc8dwvR?X{bBU57mz>WfZZn|3W4auSlazG6lo^PY>DD8GDfuvr?n_X z+rHi4?z!?EchBW~3G8zfHtHKzsipR&k&*9(mkBg(-M@h8{)a6ZZA{Nj7Ojf z&}N>@C(&Ud=+eGmib`k6LW|%o22GC)5HIBPM^f^4M7rOFn!Ft*MDGo{B@zxqBRczt zMSd5&(jHSIHATl?GGMW2slD9>EP9~dx&|y{yEj2|p}H9toy{MdF~MNP^&$#;6w?r3 z97B9|j#P*Dg9PDIp(lpWG=U+ms}!)Qfi1pv&6EjuWUk`?O7EAT z9At5(;9yX+NLpbH#1I61-Zn)1J~cXEcK&6vD2nqn(f9`wU@9wAd$W8nJ1g55s-~r?3 zFz%!e(EKLaf(oY4g2%qoOgO4gkz<&5+*EuHat6gj&?nl?|j^Qm11kcyC@J7Y+mBW_R9Yr$I0{Y6=OrqD_xbQMz$A z{Cg;AEHgBy-d?{wlm?-|qInMBIG|VM(=}XN-LxB)MPg9nw(#Gaw>ysfU`ON?G^@;{ z+SI~her#g|xf4l>2G0r>Bj1H^H(Ydk?;dsvFsPrLm*z%u!t(0a3-uoNcYpkg9gFd6 zL`D9*PV9iP^w8HZN*&&WQ}6DSs?y(=u3_MR;-! z9QzFHRzM7o0zLz(DSpi+P0~`tpse{k&DUO84$7hQ9If4Kz;W1D!sGw4FM@GhUG5FC zN#2+iPSwku$p5{c=_Z2dCPmS#`U*fg zIbTaqI(fpzFGD~nP;Z0pnvALkjfVZp8=QDz1=lJcq8$r)1vQ8s8)28b*JSkav{(mH z=_1MdaQ+Vw3cT>nLadmEY{b-j1k8uVp_mJ1=TCgRp!9XMeIo&JU|`8f6>r2Mp_gvN zX~Mp!_%%-@BpRC8;UJO)duYo9|ue zD?y%S{!JC@u#sWQP4nBV33{E{1D*sC6j9WhJK@;9dP^#-Q-WXxqk`Fu2 z)!+7S`Qx(s4EU#mK2puVN_8xk;Q&xG1OZ_B_1d6KKQ&+uWJDA=>X5Qga$$-FydULE zz?Z-e3JP*3)6W5k@?6cW#e*GejTWy;&0;NHvgcX1Mft@CvgH1}R*Bb^wytz4K5~!4 zs=UexZ$*hMw`L(ao+$2{#j8NNtEG}mQEy|MV#Mjod#v7CGyv#~ML|Ctp_N*4yc?Wxl^*O+ zScb`t9{rFc?_ejN6Sc$07OHw#4r4Z2V*W2~F#k&yyZk=HeDrKwN+45aJZBe6dPR-` zFFVYd)rE_x+jdrJL9|$k)Ly=PUvIc6Xv8re-p>`R2Bi%YNnad$O7p!aQ2LAXM~{Vx zlrN9KX}aUYtfw0Q8658 z%M)Ok{B^Dj5L750NlP|Ui7Gs|~*2ItTd+Ul( zJ?w$huD0&RFg>+v*>gJbhdtC?*8*5f64ee%E9FCx^%O>+A3WZy64i{ak3C5v_G|0T ze?+b7{A0D$njLqHsWtoIV=Nj4O)PKezsw|8A66vfEJLszZ6ln~^jI6JjDj*rR4&@h zijj5G%Nqzt>g8D-ME>z|UixiW<(+-LtffX}&#}5|QP3CV&xfv}2DG@jkQRIj?NRgr zv1MqxDdIibw#0@TBWa$--<$=TG8;|qE;&T zJVEJQL#X=uY6unm|4W3r@WlTdp{`g|pHLZBNvJvhCZT>>`Ck%h#fiUxQ2(5*GEb~w zt8)hIF$Qiv&Ou|lAQC9@e;+r9vH#f9PUL-i)JL+~^z=P{!fKo7G(B*C7Sr^>&Lua55yCaDC_uR8jt@Y6Rn{__7&Tt7>Z@S? zF_<*$%r?=CQxL$-1`nK$7^ykDgc^$hM{f7>^oA(45BJ(@_ssge)y?9ydr99WC|8sr zu2$bAC?D}z(Z$p9tjN{o47A1uFk@R#QaF8embqcUv5O0XOQr1OYNVhHQE=t$tMf!2T6+QTig$kZ*ju?0!Y}4Ysnr$X^!#4T~ z58P{<2IWTK^*2hfH1h{^2n~{+RNY(8H)U2eMWsw4iYC}V3FR?_eKKEy4qLug zKOoZI8!hU*w?M!401l8C1E>IdFT1$#Iu7)fq64d8ngXY>^I;-3Ykms({ixxfi@UWr za2oOy3>Y?X&%_}n;LVAV4o&31nNun~gXiXAr{*uz@+S>c=e*m5*Do6T6D!4rbFiRDZ-bhDPV*(&it5PN>pcEz{Ks(gh2d@_ijN0E zu6uQUTxhU{pX}UP(|O9zvU3^?*w|9?j&wB=$)|q|_wrD+&PB!ESs~KFGz=brGds`) zwDoGmNCvt4!MnmW`QJ0jX0#jhZDfRer(zv0T$8?M@Bb zTtzgQP?ObM+$zX`4Gm6l|SU zbHq^Bz3Pt*H?+;Iv8W6B1Dm&iS)Y4K=T6SEH{o;Yj!JoA58o=0+hu&@-)Z9SbG$}g zAp2GABww@c7ex;&GKMT{ATCrca8;sVkO6F>>{~B2;9QPbE%Q*{sgV4ORD=TKFR?Dk zyRju}j~RjZ`iZJYll+|7-8g(}HJX?_SIqAYU3bZoU>4H7n9F6B*?nlY!Kr)#j;*;D z(^gL>`)o=EPJKEw#p&8WiZME|%NQckh6aUD0SfOb{ny@OazZFx7a*=KxI2O#Gdq_Q9loiy?i(U2#euDKWe%i$yu{syN<%?J*RZmugbV7g|*=ML#BXN~` zZR+loj-!tj7^RDyXNFm2c(>nvl>OoHMnbvyywsz_eA|tQmN|VFiI$_LgJq~g2MfN~ zrbK{B)gN}4B|0gSzSq&Qzdk+G(`dyH1aG(2bqU|?!9mzwIvk>N`Z;C2OjH7l!b2l< zY-?=^Fb1?5qm!fzrY`^yLs7Une#UM7DLA`}v4~Q8s8Pgj?ieHnclg~xFZ()`UA3~j z=3eR8F;5qa^ppRxZDy7s6dUm8u=8<%?`@-Kee#!l&}}+%5UZM%t4%GPGT2W5#adkon;r{tML z^3|+%!Znb5a5wF7;;7?Uo=IRu^}Wd1d$YY5e046jQ$`aj9bk7=cT-|!r30U4qJ{br zb*7v!OsN{fwNiKK;)R8yMefUO#;^=n$CrO@Jzsw67AXg{=0M^<)v~}~s-@U>D@0Ey z*TXSK_l!zZT8Zj*d0YcUwe)ol6c_%nDv<7p22TKfH`2Vg!p9|vKF3e-W9eI_#ZhHu zq7pY|ATF~O=4cHAMpS?UbvA6I#5k4Fbu!E%E@g3R zr*fD0VqS|ns&P4jikmsCB$XY1+6&uyfk$4OXueuem-# zyJ%LtRyv_!udjGDB|4S9M#HLE^%bvG(4&hRgoJz!>D092F#oA#s z?0NmVK7&_BLCq=MSEy4*C*pB_;1KqXzu+u#Y(JA&aB*NGKCaF1n|OnWi5K5bj}hH7 zd+>Sf-y1NIu64pf;O&mVB)$ezO9^@ys3p=Brs=9B`m~gcDJ{N;{2%#hWfT z;>bV9fN)C&o4Ca}-pkX|I#67s>7jl$FU{ZzvG~RytF%*Dj)($NJ3DduIE1bMvVvM% zd#W&;I&^U=O?l5{gdm)m_GGXt6E(X`FdAels?2@m!Ty>QjJ{A6C>x1E7w4I1jOv7b zwm)40oZ%iiD!kRHnBBpvMpAjWc;(Y_e=6tdA&8T}^UuO5{HY?|OV78fE8_Kp>PYvi+sPodLh|Pm!dy|kaM)vJN^Ns5 zWG>dm-}NZIPGpSy!dRPBmhoO!+~FC#DGT@S5-D8^LtK~f%mkz2=^EG1sZ24}{0J>| zx&9-PANluxM1mYk{YU7TaP{pKK8pKCl;aJzn|TWJkFZgDVA#n0Q*f~0dL9*ur`%Jt zlBZ1dSb$J}jp;#OKjBoyhc2AeV6IOsaE*D=scbhWyItLeI$@g#8LIf?TlM*f2->=; zizU_r@=Q)%y=hPB2x%0BC}7&WKROJeZq2-3{RcuBx`sQkr9`0p3S87gT~l5d$FW8J zm8ovIVYIcnrWw)#%V~JZu2HK+HM*%a7qh#DT6wB>LC_SRkxm7w73u(p<8={mvS&CA zM=(-4TSz7zzdNU*mS3DaoJrWvEO4n6^F9?wx$0<@{)6=n0Z`^dc@lB`K0 zgOvyF2a1ca^MWZc)2U>k^S1!yj80zHH^xsYM6^kmMj6kb&+#?$*qw0WpUz{;4d*c) z)#pQld2Fef#|Q9DIpqKhbG4s<#6F&OG3=q~-XgchvOrPpd%-VAo91Sugw-O|ArkN7 zB9!hQ4W5ZTC{1B{df<5{Z1Cg`B2pxq$48Ls1*hWh=iXYYSI;AM z9c1wzPzS-EV#e?;WaoAxi~W>>(hb7<$-peuzOGE%{!zg@o_L8l56?{=N-BRDT+n^y z=c&esjEAO&h|)oajS>IenV&_CtvgF~Q=YoB)Ri&Tsa$mb-i}D$=IiT+KxZbNDz9f@ zWO%af!9`0<*53dPn69orvYj}D!>XM=;rdluAUsqL*A~>z!1j-JH-h9UwiwrXd77~T zt%{h1=+Kj}=JT?Gp#HQU4H}EC8(PT*bO`qzFr1uDEhh8s<|y?9|7?P-yeI?btsd0QmGBK8|pT5p9@B3jxFug#!dxZr+<0csJ*y|uGcBGmLp zH$HW{k*7{Fgj}0HiMNWj>!J`hb>Pl`C>dIOIN^2OC=m?B+-vIR*zBx~XiwN(k^K}e}V(A1bkxJ|J zpc$|qaz@^R-9_=A1Sd*5j3ejRqEkleMo$j733|mrkLn>098;cF7xNvux(w_ZLy0if zE(f9(E_W(VK!e?d*mb(bNZpc>jg#O=`GWHccK+P&Vo~q){j@b8D#OIqv>Ty}t!UYRADCTzf#dw3nLKv6O-=Q<3$ z?I>*4v^7cR3*MUAn}dRb1Wi;1_L4z6&{(oEN?s4G&h=c(@wU#z?#6}e)a$xVwb=Vw zr`~#}r_q=@_0c=6&(k{l*5PLK9MEXlkc)ZO;bL3RgcEor0Yf&5)!A1zip;(SY+ypm zrdI%`!^PceBbUdJQ^IVz3vh(8+O-J~>}$2_j`y6(0%l)TWlq@o5k2#v#=hPJ?5ZI6 zh}QVqkh0{ zW&o+Q3Xr3){=g8gZdS_;VbSXv39e{l9{6mz#sl90WFFXZAM-%mP=0R?r-TpoJ7JH} zmns15kSa`S3z3;PGxX0npSRjl@+`^uk}K+SK9)Tupsr2)V70YI61p{*x0)nZLbh7K zk+4irkt9=8um=AEp5gG6Cbi9f$pr6r%{bshs>$m$hlZ^G^-SkOqFC>1c#BIQmSo!y6eKaZr%zoCdqEi8J(|AWMU&U`is$duqMi zl_=O;7^T-eL^Dq~l`62%iY=>clvjzRPiheq%823U;;DOJA=GAGzL`pKkB^8)J+a3| z7q}tLh*M~hO}lNYlD8=du$}AzX(E2j52II5(HauxD!|UBuRimHpJUfYS2yOw%({1j zmGu^0Vx1lF5ED;gzMD5>HL~U^V$_lIA%%UL!C~kbRNn&|{w;v2VFj|)Y#$jc3ZMSU zo1(u0TQx7RpbtOUhf76GBR+4w|7*Dkqvrtc1@GGd$UN~ot~bBI;i4Ofj8(|dWB*2O zQlz1Fu)aMK?k^a5?|Ay*he;73O2R;4JonV*a-j z5AKbYzGv4JCJlo+W`FBcc84!*7|z2}-8PjT{SK=DZwd-=(FQuReSnw17^5gTh$G-0 zIqg)sBLStZ*r;_Jh?aZ_61o~qfygfw0~;lMO9X~q5tT8L_MQQAmf^#d&yex$Cqxks z6zTDI#)`^k0-VBT-rv6|bmev&c56&eiL#mP-uj+Z%Vff~z9~!Mqv`zjPUS_z*HdW7 zStkPUPxchal^sIFBXev%(w-LqTt#wn4{6FC}vUIIMwOAjbPf_X&_GrC;p$J%XL<<8Oh}~1}5$cV~RKwSbNN(jBB6fwxAx8h2 zTwh_^77(jP7Kg8nP*=_f=UpRC0($)vEQ)fTvPcXlts1ivZW|N8m8_(qVdML z7a>9Vemn#DuKaAsLAQpsqb9*P-v9^MiqO0m3itt2&D0N_HWJyd-6Idd%ARXGLX1j- z2g{+;3*ls@hx7nH{MVxq9Jw6y&ktDOWhSE$=w4xfu6Lq5zz(-6TuzY$N zcBC*x)DBoEXbSB0AV5~#bSPR>zPZpCc(6>fV=!TfEH5)t{(WHS#w8!B>Ir?OQJ z4A)~s>GM5@8`aHIx{KrI$J;%vrvpUcYo{V<@b6CLQFGB`KFbqT-*&+9Nm6PDoWWIW zZ#|Ue{GqK`e_ydtNTj>@SVtvNqL#orNz z^wV0&U0NS$<(j1{mkt;bm2+4NN<9--R{(|K-CCz}^oi72hwkUqT3W}N7Z;hg4=jgyWEmxXp6*>%n zl>7l8B9YQbz!q2v0!)eQ&>~7cfn)SLDD=lcd3KyJ#1Dr1niYy-eUn<56S1pAishcT zc*VHIfq5@8WmfSG?9{FT*4JxNQ%j=K4N0wBkKzJht+OU`RyHxJ^m4dsl~*FN?V4Bx z7$}qpp~yVtgI{dUW(RnySa*K~m>FuiWA%CkFjjffwFoeYx9uTXZmN^M_$erc3VVyp zP_p?YBJWUN__SqiiVAn7pxBDTqUk4w+R4|X`X^ui1BTfZL5WIoVD({ndhH=?au1uS z0HRblko)_$jfZN9PnmP}pKKeIDv`W%a$iqaK~wP$&7l207m=t~17^Lcg@9mp@ELEC zZ)BpJkI{2ijRCTfRfx_Wir6-x!9)2I zI9+4A^U5oEQa}go~k+ADyV&5n429-%~~i(k$R zv${*cS(O>dIA23m)7WR-*;8w>PI;<37dF)tZBt&O!)Vo9$s(m02dM0g%y>BZ%1YSf zOWjbDfiM&md+v##cTtD~l_FO7bC-gt8buCE5W5E)v}xI;2)ZXe5xEVJQL6e}i0J+4 zupruw8q85qmD@Q~Y#-7mPDE8APG>5$b|fNGY$_Jjb&0!%(S8&=8ifH7CS>MVib+UR z3XmD51n^Pi0EIXcl}ZH2VDZkrBns!%aa)XJO-zKd_Yis;kYhJp1dIYJ@N3TV>leG3wfpNWr+-)vz#&(s6M+9)i1nm%=a?KLihd#x7PAJUA0m+Ha#0s z2_bAk&F+TYq(63n0I{H;QY?Z;Q29$ziaL!k!y%UL*LvHS2oEkZAS_Vf8HrGp==%k#%3c-!jo!(HnAL9V`~c z(kmTh+2ixzpl8(5J{U(lk|$V@wsO|eM`>@nRMu|wngU_1NTr1s?~cpA)<QgeT)J@Jo3sU=0}D$^GDO%f4%O zUD|MWst858xa|YpA|UAR z+}M@q|M4|ay_9;T3QS{w6<;GsSmJLG$tdnTFXca<6C^lDP1&6{ow3I{P z99qPo2o4o+h&|F63%w!pdacBR4b@9!8LZ#`a_o{pUjosJu2 z8Im`*I=>R*50ECsB~sVw;m0OLYo#bELMB61;`UWiyAKXE{^w6{B|QuvtsoHsM8nGmS;!1Ke(?*{<>;3!5xvyI~dE?f)2R0+-E{-S8?lcm+4m zF7AE7FHCJspL0&2wHeS6{#R*vo4=RRA4pVfMw)GE{T5%F)ho7H__%H}>W2Tm!{jTX zn|yOrZKge;+iV5c9E%tmLh0XfO8oq+M#4%Hk!la0zton>+nPU?j(3*QA|&3ADZ2{z zGzRp>1qO|1VQ3!E>?e`c367)ghmV7aVH}&oJ7+uLMi_QGnge9z&~+40nkqH5rV3O; z0%<1t(ur0K#6cFLvmTJ?VIScAIL9REXP(Yar7A9)L;vLq5M?%-Kh}_@@Ai+9hqJT% zWutc-A+q?|hc=misCEz-ZsrrYF>Z4(q@FhyYN_Y=r{o zx_B9&Y-Hhous;sgM#CxbRjXF=TMmn=y1K9G6I?Y61DJAH`a*>vZ3CqRBKzOds}m>S1!gac`#bT za_RWARh(SWE&e9s)~G^r(Z1%!qoAwKvqodxocYdWGn%N}jNHl@syXRsG+n)JmzhoV zZ8SYjroQ9A8sVLtnl__Zg;wIctzgKTQO_}rM6ISa!@FYsl^uuGvAJ#+O22&mvKcLW z?VkLBk97~qYr0*Tm**Hvjfe0-`h?7!Ga#Dtue(+xV#S8Jr4pq4>Z8_NS&YCj2|M@}S%T_aOP zEe;GsAcX@Hy(x>mDLcI>r@Sfl=gm@$5lBhS`k~`sr={AAHWmjiYC(5~ffgOXSk59c z;oQ?erO#E$*AV$aZjx^`=i^@d;BDceHzn}}v(0u0B>8Rmp`$c{vNJJ^C95_jSP;$r za_l29dyA_Kz}my~3h>=#DLrK3i-5)#0gW#L8ear7z6fZ15zzP|pz$p|^pE%=pT@U5 z-%asFK8-H|8ear7z6fZ15zzRq{n3Z-fT>vt7DO4}*sNn!@I7{`@(T~Mt_1;IOU^N0E$kn`f~e~J{*zT|+3>5r+{>XC9)?^2n5tue&6}y> z4ce8B8^TTcxZxLH?M1r|Bv=qteH?qHO6@03QP%6J;@6w>@x)1QEi?dVBv=sVYT{Rw zRjFoHsqZhf(yG1tau za$GgP>2j6k7yZ?dil(HB6IHPg3#kP7CCGv|#`fmFZ^48Fl~O}4xHRTg&;A@fiQuw) zpxG#gG=+@9-%8b5&o;v%4>ucCQ@-|j7qC`oD1X4E`8~kqh<~r*;4x0u*GM-Y#DXau za3W4%IFQPcJG#eE84@0Ya8QWMIJhJ#fG>KuJg;1^ILTh&=GzkmLgj*y4WeaITB~5$ zv%{}}ka#vN5#hvztYIWM-;3E)>nJGyk-X-8kpdW3y7lcbvZ9J#)?UAfVROSKl#H<{+R_ zJl>R_yeWegnt76En|YRcQ??_ZN}ctlguid5Y)59blVo^P!sj5x%9{h_<>5j|w<4iY zo$}p+b(h7RDS=^l0)j(fywG^}i|NQ&moZp}Ky3~jFjMBwH4~B%P+9KsrabLUnd(i+ z_ojU3O}XGrNt|ca(*Xfh&*KOrb5n03kcvw?t>jMu=5_rbBL8?@|64_eAX84;ls7O% zw4;53-MFeJKVy%j!;3Ipp10@YZ>nZBe2F=tX$YuM&+w)U_ok#RF!OXnK;;?kO_}CR zN%+Xja|;40&!gUySG_3KDnMVkl~8Eor=5L;b>^ z)i2DOik)_C2M^Tq;=8E=-W0HkX);7WlOY0{3=z;|$e$D$BB03-0ZoPoXfi}VlOY0{ z3=z;|h=3+T{-nqd0ZoSd36xXI%6qX%hKoUcf3hWvcWrRi>$F)bxmsX?jFJ z(<1_!9{H1^J_Iy9@+WVKrbnb`dPG3eBLbQp5zzFAfTl+TG(GYsMUMzDJtmT4X{zwI zto^YPRnjX+4~K~UM8FL)<-@FI`CkL(~(AxWdPYP9+RxgvTfBt{|udl=R zBQKM#&fko$`L9n{!B1M;n{fPj)B&ss0u2L#*@x^g@&IY2f}s9;RJu}Qc^z=3njHH& zE{5UJTR=)waPKplI7+)m%r*i$5>sHy%;++#?>oRl!@`6 z)e2+uNn?zF!kGGR;F--icH_*l+C_J)I|VnJQ^vMql{u|~r@AP6XEyb-{~XVz6=$~T zKjV26?KHi~%$j)4ICCSONwgmLhg-3pwxA3koZ(6O9PGrKP4e{%0o8 zb6=V04(`*kMT4o;wK@Cj}6drA% zZGjDKS2fwRRAb5c=%mTR}r|*Yl9wr1bBrUc$3v)7t+heJ#0^f;p$28 zh5z}$@2yZ%hOyTih|s?o`0votO$pAA32wtLl}G>kN~7=D`0d{i+>*UFC%7ixRYaVg zMbs9ew*$<}foig7ZrZ;;Y5W7_9lT)x4w?f{uA+S73ApvXDwLP=J?7bR;$&sqf2xdo zo&DfI2!A|_mVlg|jE#}~x`afr+BM(oB9G{fsH+%X?T$!C@0Ky@YBxH_II6zdpFlvb z37S^_?fvdpg<3O=W95a-+hG;W%^>4vUBsu)o@}FlgSf$Z?|PjOc^R*x>j2*X!>-dI z>;!lX%>{f*bobQ#F;%Sb^FL`ZPC?x9!h;EPsW?@HfL(Z64sd+{OY0>#CGqz&)nu9L zV$IMXSgCI>u-q5Z3x%o;u1j)P3p?~ z{G$Zn{lIlW*lVWM`gzBYIWn@~)#qi_YX1Q0eLfXV11?CTbmUH0sKO}@Ue!Meu7}P< z-1%BF3i>k@M#87j&fn9-WZC)q!_o5YgrgB*SJs286yj2?uT!nprNT>i{YF96vQ8XW z7YLjvsDeO&hl|H?@l~I9lmlA*G>8i}&rT4Z&#&$j4lu9X|oT}4Vx+<${aj+0O5HYs7BYZy-NA4 zZ9Ysde&fSbiS>P>F!e9q)iGqQTwr9^_HSsh+tEj3s*kyp-{T85(;XrbmG9~JXar8DPFL|hry~v9l?8or~bF(7eDf$p=JV6Jrf^SDYa>( z4~-4^mC#T#p%e8?Sl4t6nIg;NQ&F`bM1*Ip_F;bU;~VGhV~t$#x+>k=u-1p%sx?03 zctk9SGIH^IXH+RwFde1z!^Z{9rM0O)*OuH$nDPUH(1`;n=WRUAI%JjF4$bs+{Md~0 zj)N&KW~h$GPM%Yx(8YHub74=}ox&dT$^3F(ir~V+e4X*$e2R>8iaP_R) zZBFrY@|Lkx%B_0chsB0$-~1>d&emN#Hm*vc!Z&?g+&|XW#g$@wf(21E;8~NZlsYxR z*Tp}^-8kTi$!{@J@wb@>O9)e|R4{&uudg|ie0}Ao5iv>kb!~2yLJMM;q?qUrMo#}uBZ zQoi^XdZdn1H1WJw%PBq*ev^-Ti)y1G7Q|KAg}+rPyXvH82%7y?_!Xb(3Ee$~5T^^Uy2|+NwL#4hRG+nVY!Gfs5;L7%>K01^Vd>aW%5XAuAOEogL?6$+GhoePiVApLh9_r>#@G zX1O3_&Nn0CDHR8!P&sr^`#!Xxol_ja!HC+UUp%fk*Q#`2?$wGIENQJU*mT+30d?H7 zAj$~D%q^}`e#T)>-wsZ(O871M5rrTr>>1kI$+Ec~S@?RV8lHK5oKQ^>&(WU`JD~wN zR2D306Gy!tabiox(Z?P>DV}yC_Oi&KdmeQ{eEbWV0=QhZ`r*w7{pvz1M$HXZ&qBu@ zYiFD~ERa{E0k=9uN`RJBqzQ;5{ZAwmBk`!hoJUhaQRur&xrrT?Y*g}z@yVY0w>jZ< z2c46VfBGd-;T=wxrP4i=3#_)dLDlX^sRmCA{|iY<7Dg@ar_4K0FWOR2OwZlvgtkC; zS_xRgvgk+JfxwH_T~QESOK#jI%G2jAr})5+2h`HlDH?kRv^66Cn*j~Ip`*s%52!tv z_M#VO#bVmj%_#Bp7UUam|YBTo; zuU4)3dbPB;gUpP0tFcV)tL~+|af@QlioQ;k&-IfV2f`H2)qW5UXDyJDh-r0Ygx?Yf zEXo3Fvjkl1{UlB5o@7(ju1LQe-61XBoOKq*X)+~kTsDq=SXw-@h+-SPiDD#Bl>NUm0o(>DflW` zHgr#n%zu6oi!MQPB2k__H@W7_oe4JT`~;L;ELnSK1_Is0L@MC~biK)?*l4=@Nhd5v zOr)uRNTd?Lnm(aV2gU|MpTPrpDV<2&0Xb71;6TI!pVIM%0i9?#_x;I<)ENe@qr=Z! z*7{>?hWo^2+JqdpqeRftPSHy&qW*wGP}5F8kL84irVet770{u{%d^8P-j!fmkg{YA zJs-Oq@ML@)nlKpi7``qy&^TGmkZWow7UN1J)^<&q$r5nY^-^j|-UVvKbS3CF<%p7i zLtRnIxN|}!`CzY+KDK;Yay9iv1x97vO)mH_41%_ab?|QU(K9@mxJX}kM>%8u|57Q= z$Qs+;W~vm+JpToMCo-orivQ25A{$>=+&sw7sHi7GS;H_iF;K+1V zB85svBtdJU7!j4rKqV&ozB*9H`EhxG*X?@JTe&IHad>v1$fTU%PT}*slG%1N9k{!U3oDL<0G~OwX7E`BU4`fgz^CNiu7Ql#Cx8#SS}lGxg^Lc)fNO-!s=~ znI>edOZ(!IO}CwhmcLMt_7 zX5L(<+*SRT06zg;_KlbJvEbq9E^{3b6HZzhR;$*k8mm=}Icbsb%^5Av-1bZD5N#14 z5OTwbG9qnneeyt8+ZLvb04};ugx%pdg*|x~ycB5O#&JE|VtYDJN zT{71p`%fBOM@~f&1YRsqdPC8QS}w||9c#ISSxqm7erVbOGwI`Qk)`Ky!fEnIr>U0( zH5V%I#v(6`PLWGfRa40_^R=-JM!z77r|q-W{;|rk zxaA-(i;b&cApY1-*)KRnLz(rV(%0g%lf_INEc-87`UJ-|zT_0mrM=)lv}`i}l_#*W zz!mf@((&w{HD&%6pACc+FV6BiCGB>?D&S&iuhq^?Zz9qpblO;9tvTBAie(fO{RWJz z2`g*%)z2v-3JJ2be`cIKdr-tv;p&>AIz9R?CsYLY#QX(-qJyEZb}{ z+qOKGro9Sx#mrT1%J%B|olYq?=4t$NCSDdC>lZp&nfC`b*{(7Fhjj-a$A<&9!S}^xd@mr&VVwtr3n1!{%{#>|nh5CTeSIwg4TJU36Ai{m z!v|;4#}{fxm9kl85<%WvcVQ za>MU__}>;x4vq;@|5z9sT0>J_cY<-djZOfjiMJ?rEY4k4ziRlK4G0U5q2-9r`WoP~0lVsBdYj7RX3s^#Kte0a2|qkD_>DAje(W$<_I&KVc#j*t zQqKC!LCP;)pX0Lz8DO-M$u-iWWpTk0|G0m002f;EA(R$OL&uU#39Q!oUse792Q@pN z!qm^m*`Bq91B|w^Z2FziemJ^Ohg>H-s_Z2379aKS>RSteR{Toeo;8!BXfWbMSb?D` ze*2^-`ONEO@p9>q{(*F0ty6^1tJ9qjhVr9@fY194F}{?!;`?|iUWs*<+Rwn@ob5mc z7+;YG5iBWv;)D%$^83>3h_}MveFo^pAL|#uj)>QPTgUGMOu--O1;Fl5s{R_VE51k0 zQ#NWdTTLt1(9nv9+cMR!TIhF?$FVN`XS~C zqp>?>`A&v`I8t#;c1EF)4u)}QVAkcA^13amQze% zowmQ=Z5zy_i_~F0&U!RvHik|tpgh2N_}pm@e_nf3eSU;KMbwSY#{jqB^Rl`8dGhfJ zpY7Cgo>L@-F7PuBnSG9;v&dhI{)G=8pj0xNf*kY-RcZpN`vwWSYcai)m_@3yF&;m? zVnaM`)o*4C5ev`(E9yQ%MR{QL(i=#~Q$@XxhLwtrKck8cp?u_L)OGffj(6)u#%9Qt<{ANfF#1bqk&Y4v%LX@lg2CyiA`+vHc z9B}+tl-19ee4#>@Yg3aCoFWVcH#-8>(*KPz{5K9qBkQKi6|;u_enTfnEOLqh{~h)5 zj>yV}F?0|KkHevTr^Ogf)#`<6GTCr*t9Wy>EOCmJ{Qp{wKx-%@o(BAY7rjgJ$HTYA z(ejU+Vjb4BrE{Z_I;Sj3+K!Eir*XSaB2*RVdybiClabV6Bkt2bH5EwEH@jiH5ua zqzv-$E!MA}F;sRY)x+(V6qtF zSqWInf^}y11|VW7_+GC38g944KSwspSpkploucH~uXhjD7eHJfH}8JL6Y~X6D{u5R zqZ%2f8^i5&HxKq}-k0CH#J|IG$%`n@)9;1plLs9}R{ zjld_Mpx*$Wv-nk$!@uqqBe!Kt3Zc;(d6o8~+rD&)@qjx3uQL+G-vNoy!O%JJF`O6) z{6&FRSU`fqmTWiwul76sN9?ZPFhdKLnw-rf&;bXoDHZ}=k^(D0~ zN)eU~8yE+0yn%V$%YZdQ#vii4odT7=oE&ks;IoG zqR17|vdhJQ5dUjC0-zyX)bGw3K`@^6t{+zibF;9*QryPkuk>U| zlKd?W-qVynpahc*;-^D-wnVUZ{Gb+IHVWSNhHuFBm-%1j1l*lCIK|S+(gq9aEL7FX!gl3y zfPO1WG(wu&#rEaaszQf@R&u_>P?_*jeCW&2mCeJ@%9DJRN~cml zc#WctzoDJVy0}eu=Cll{r&_>275eC`jVpWJNB;7+FS3JzcdDgXnKaC}y39$nPnr8t zZt~<>AzDqHZGG04EBZ`nAb0&Zi;WOuBUc;n&HQkgFIhb$Dn!ZPv%P&-)#!hDb}t!r zc$Oo0hR5pPaI|fd0muxP z`GCDbzq%M?cuaF+^Gk8`EVnj>cNTS%b3|!tW9<>x_9>N}!@be2xKIw*PIg$K+>-?f z9{cmLRJgFQfSE|t6O0RT5DY_PUBq9C>}5F2!VX#PeO>RD+wQ2&h6G+k8ZU*x^sh^x zz!0DDZMfoCj+9$M)M-ee94a%z+%fWS_tGfpciky^%Cy&iVSZ+q%zYeZ;bjk=OA1kM zML3Yd)&p()3%3KA7}A5s(t#ecu`)X)PY4#VGz9V13iAT5p|yM@G3q7*{~u6qBC@3T zs&$kcw(>Q9+2dQcElj)DVbkJ4Mzo2s=MP{E?ZFtC9qPV6C|1!23rV`pYqaAu+H!-j zl@Wt=n=A1tYUD_@II$OftZ5*ufySMfO; zD5hu>l{O2{7CnmDV-pcC0irv!6!12{Qou3jb%XLr)BX*3(#V4;GmwkTfb(oQWz(yc z80v=T1@InkyMn?2r7&V^q|xwNwQvPFjHH$d!~I?i9ar@{nkEpumW;e49Eia3Y4jL! zHMM|fOKL?V!nm$h*I=AB;LDr9shNztk{=~0DWX$-ubBg$6w}0kX-dau;{cp|`urMt z6P#|e)H`AbWK4T1&EYu203tQU}pCvh0Q6*7G{JRDoMK z7A1ci7i^Q#k`Xpoh$z;eJHfW6gN9Po}sQ;SQ{bVuEx zn~lZNbuFN=Mq6F>Bg7dbn^|w zW_+bD_ZIssfw1bRX9{xr33M^n>JmMZW?GD|&2r$cv82DvR6M{zrIfBC(@=#6SZ8bJ zCc+5f%lF7Ya6Z#y-KbBWa89lAR_ zJG=1dHjMF3nib&^FVhqoa6o()HHvq^z}O1JTOhuhp0T?`8>$_szZX(I;?7{ruL9pB zo%-QZvY1ZUfCIr;I{}ypD}{Z6Trfzg`o759_oHFxyK5vIy6Yhf_pYh_dQF`S)ktI7 zDn~2Jcn*!KhMP)a8*VvP8SU@l4OJ z2Pmw)jo+%#idHUc2%TbFqIJ@7f5^(~Y4TC#Xvho>RiA;=SBakao-#K&I<{{4beF(_-xk00h-v!y^OnePFe?q_7 z!GHR&qc8B8XY8Vyu~-VN!NsRjEZ{&m$axL$IkDMO3fQs|g*HvnlX&%pZt}(9?a#XJy2TM-QfJ?{e?h$oB=PNwJeo)v(V>A9?tCWH@e z=;J@pGq1Qz&$)n1&&vUso)>%Rc}e+v^lzfKk&kE)y8bfNZVIf>(WP_-@muLxGrp_> zLUrjiqp`60WA8AQt8`~@etDH;C{l@-n>W)qtTb`>_rz>uxI|l+igk$?CgzWCD2Rpi zlky2FMJC=gR#hbC)xQ21t4(4))Lawu8t*_-CQ!@_`&4ITV*b=5W?5`)VW$|(PEE>h zq2`&^0rGBg6_6>oc}q>fQvnk}@f!pcJjiqYB@#~Jc(4qF+*7iddALCcZKW4fQm0oOo8lWts}|3VT^o#QqPV5~aCsk6_G#{*Dt9eNg77?s(8{D1ru zkO}t33It32Zbysg&mcf1v)p5Rz$rj16U0?~17Y$s)(kH3;YV3_=t7$STO#{W*y|lQ zCW`ELxcyv6v%oHpO` zdqRKa<+u2*Dg@o^)A?-qXB*?lLkcZ+bATLd)y-U-Xa-{Mx+dMO8_2kje zE_zN%D-d%{c{TGHy%LqF32ZYTq|7t-dxiO|jUnia^yGl)d>#0M4&tBPkftH2C8+yr zz&@~o@95?dUu*L99SO^NYVy5kjsuj3|J{)gbFNljK(+b;GK!Z4UQ&cwR&Rd4 z?)&SeyVC#LSskk`%EegT1DE;g`|+?kjB8{mk{F3ME&50lHqN5%?z{zzvrth0c56C> zzH_g~BNHg}rLYM)6R)fjEOfS^OVn3O5Ej*5I_pFW8Tcc$4x3b7-z1$DrB|is$>m=r zdl8YtKT3(Fj0auHQP%=MK0|yCco_@tI?!=Xkw?M3k#18r>|Au|LOlLZossr{`X~FY zV|hrb*I=YE-K@QQb7El)hxgoQUeQh?_bqjBW|(n9c5F#+tB&$;fyUmp$da1a=^yFi zf=k67v=Oic#ztCb2>#Qpsma579@_%GiOz2Xhv~*P!A5Z-_MuC74(X0hw4&1M>NO@Z;z%S|>pM4}Jh%2XiRe zJ>?QmzIa0SeJ~*Rc?}@b;$MK==O#~9p~dHr#K+mCX4h`|Ke}NX;I75f0hCk6*=08r z#BeY74L3E$|B8FP6p(ve0?3E-l@?j>^!p8{2YUSo(w71a zW3OV43?C!P<;xp(7HuUWGw8TQ1PXbJ_2AxJEQ ze~G(l$50c*`5kXJU>`kBUL;#)Y9#lVUGv&1y8+3o3+WZ)VWLz}; zhLmRLchYm{36T80e7H;`_j|iNi$)_;iW;LIEVA^}pE1p#DAgEG5Fehgq_TP21_&=u z;S@In;t|U^W2xX~ChH6&VqdDk6n8*Xt5(|Z5iZdIEA2sxj2!+Ru8+&7whum}n`K_) zGJI!B+{O?C^OJ?W#l+4Z=@OrTIMxF;hY9twfXx6?o_9gG3y%?ihUo6e1N1QSYQT#w z@hI-E9>8S462Q@5`V4pp?F*6Tp_g$d@k0y0TIldvz6(6~nhVlMd7k5d_xhm^w`B9b zBac1?{0xmfJH{p6Mq_@j^Ips3bJjxQH5_C-9gt*W38p*7a(mtBDZt*SV{AW?_mS<$hfkFJ`yB5m6l^Gu6+#0ef~M%dadc zvF;tvM6Glq$Lx&W@UaNx>dgKaz~7N)DF}sTqhTvfc+;tD1+$?3LP7{9%%G+}fzccO zwzmbfpV3MrMp2(RSf4;gZvbv&I=X8f(@{RX510bD1uzS&nS17QT&(j9A(t5J2aM*@ zPavb)DDgd)7>5rF0UzKG^J&0GTzA&zICoIp53$1F^BaIa@QC!o$H_=I1$dMb3iI_} z;51-O#DmcP71qQ4#`_ADC@MrkEzI5-K>iaXuhf5nzJUBESOB_Eceb*P2=zp_IApT~y_z~dNy_(Xk3 zqRSgyVu&>lUVZ2+kccA!ZZ6NVFI{2@*Z9z8J#T9&&)cWv^OlP|YcOwjf5QYbo?ZoH z-0}hW4}J=eaci{2oS4$BJTd2~`!+`CJY@oAi4C6L0Tn{_9VSA9cWZ=N7cxSiwM~A~ zsFxK@_Ps7KA{71p+U!`AM||NDg?`j;zdivB0^}v(BH&p@<-{S4%2u<4-seGr+saW% z{?R4g=lR-RVZN%5_& z786?0X}Ih;FyRr;CgiCvXmhw5j+H7(u}rQ$s|b?i)f|Bit5%mezlW0TZV_)O+e7UT zxLq7mA}#XDjzwKei59ee8K3Tjt$9g6YQdPCwMxo`1!F8(5YO98@&25YAv0oKQDU8zg;}xACktb_ z8YYuBWXA=lv<#U$dUTZdRAy&xtLOiz%2i4H#gZK^h2`zIfGhkt1O8_6P;a@&%UoSI zi@aE_g-Ja0$JgMbn~1z@(#4d>%O+inMP4jd@QThdFDmUOGB5j8IaB6kzba_Tyj%`5 z)vi=(hJ@Nxyp8>i`a#X@Mu8QXzJFG5i!CUvB~(_a5KE{`Rw0&9IRzA<)qv0fmBw?M zwN_^AU6dT99@!C}aM6wh?jf`gEjO0tL|J@#VXUyF#CCeh{$JTsPN2T-)Vzt5D^@9vdc8kIBvS+O`*6>_Ypp-3Ek13OppYDiLVn5ZjQwA3MF-=Wc z4xfOkWWgZn;m}PsR$@UR zrVj^H(L{M4h^7U|kRpc3ruD}}hl4=0w+0qcXjU#DL=Pvs#S)wY0#Yz^Sm_OSjkuYI z>iNs`li6`Bu^283{&n0&L-GC2T1$7RwLjPabJte$4yW&0EM}!Wo*mv=?(yu0trStm zExK7MdOYhoGp-4Hda-JXDEDiu^xc%KM==Uv?;sZ(q&2`0S`C}b+nfPWxZ`(NX&6$Y zEq`vLHxN+X)QYyoX>V%xm3xpWuQym7?U`lJx1O$dF<=8=T?E)9{ODG%zhR597d@_z zT6vFvpO_WX95fDbc3i&`kOh(=s6UEzmWT2i@@~|;fg1`~z2txuCu3y)6D_;QpWF3K zq$UlqxuXf~uMO*g(!n(a|_SS{#hecHvN5^(hXfXh}zqDE%O6iM@BUi zH`T($+NQK{&1FqFY|GT!ffi7_!C_me>DQNad&~X$f;LCT`{9469Q#J$ld)@kKw33i zzxglt#rgp1e5C=jCoB5(o$tmO0@(ex{Q7P$7lO-V$7njv^2we7jojiq%(>HpP5AuM zS7r{J?~uizJED>HshQ>o+YwKHA(Dv1xTeSm@ntLIX8S$01I~&=cLdU4q{4+7y~tl7 z-}WxxvvF_DjcsKqz|)8E`RkBu8qcAxE<31xGmvfKm>?riQ>l6P3pA}FFcWtwviuA0 z4#BeDpk}dD+}aI2Eq8M)q9BqGnS7}m#Cj3EGxp^68fGKc#&{cfdkOV#=@u>M6tYwo zW9T|yf}(Y7w=a)@Ps*V){bg2uP%!<9jE!hm3pY-kJs{;@sXcp8grac1&=(=o%W;Ks zyjackVRiM2148W}We2dbYpl%cM4+K<6)>;W3V$I@cPxvNJ$5a#tCsH*J*Yz~H`HR& z>1Du2V&~3`H}OHG=Aa$QH}R>Baj4ECXZl4qAIt+yBj#vBMo#}GPIkBh3KuIdhRx|+ z6k*KZ5ckEIHE0EJ2&CVT7+*WxF!y9sV;&f*!S=`0>)Y-SP-MJn6cuc2}E@}d9H)_$O&gy_8Lv*y0;YrCqg{Xj#T)!y_89Y%X?1LjO; zTl=2cx45A~3AwcQ+q%Kxc%L={4r84;?ymJj9cA&`7PZ%k>qxx+K+w_i4;6ZNT zhjnq>Rt+2D-{Y`acLR+&YHu=~0+`#i$v#BcD*ADO+Wn~dp!IyMMqS-tNP@$fEaxWd zh_9~YRN>hHmk5mswP^1a{j8q|qdx6GFrM=9TLW$cwgNsOPEn%{Zd}3M2{fG46v1eZ z=;#*P1@1>~rB@nF^ZN;ieg4|X4PB#`Jl6q-2=K^;7`$D-1d?kkSEhwW(R)aUf!^>s zz#eEJ=vFse{hgwF0T&^D*^J+Q8?UXO&~ZR~_cXrUEq=3zlb)J)xncJJS}(6n};4E8UKD2K^G^O9`2BX2x zW4(_r5BLjpx*xM`h1TtEnVa4d`sih$R=M+Ep{%WWFHOVOg!&aPWZSD5es=h*G^gEE zjNHV2;&vnRU6pjz>OA1ay|+L00!)F=d8@Hk4j4T%7Mc%ot$!}l% zJ7jKoEvY0{l0S*w~(P}`K*AnggXZRRy zE+ChC5@>vPj*cTT zLi|j9hH&@0d)@);D{T7<9S*y_gswfSw>7v6gY(o^VX)$-KO^bZq1awAWzzuR;EJ{a zy2W0)0LbS0MhH+H@AJ&kz!nC`uUg9iXQGBXUT{O%H{Ej-5Ul*}^xjK4 z!Fbutf~o0r$G_a*?{xPR0tT}7s?GQYH*!$kC(|%RRQ*-AI1R&luerq^D1RRCD-hVa zQOpcUr)z-In6gH@#qao@o#loG>L6;D>DKj{+_OLn>qp&Ye)v><`FV1q9d%a33Id z{3_rJfFoabAf{^r1;vhxyxmPZ(ZFOz%76zacGCPSf0+yw;FW*hgH{_f702 z77)`*2;8QKX;vX^L}ak|+2bC^bOC}GINlALJKZU6f?JFM(!W-t>`Bb$TY-d0poI1l z)wQ1-K(6fFOkY~O2+ivj@W_>$gPt1DaOg-xl1Kx%%65uGnB#GGu z><-uua5*5)@^-)n@u>EuDeGXKQLsXe(*hCvy486WuduzSKVSp@Szp<()K5mZzF$9M zqAdBkb}Vg2G{`!{m?UKOv@j^dA#U^kB*2&~Wac4j4B6j72IQZjG?T;8fEHJ@FBHa9 zx$fz0a208u?`w|CSeh11yOH3ouy?T$=)l=}?`j8_ zjJ?ZdOy|sM?zK8A{V&c!e@pK)-l7%)QdUoo@-G4^9`1U?zdVZuy`Bh-(- zT8ga9^$5~UZ$s2>UvNTMrp4-wre~e7(y8~|qAAr}=!U4=1nLaPlAS97_1U2C1F&Re z;x}E{3#;iDtGrdMw8O22>sBk=b+S{PC%MRI!2=_5gmmwja{V2)V!yd?n*GG z+P@K3{w}icn3^|{@+?|ohp|hL86^v& zHI{HXh4jE0y#4-K&G_mwWo8VS%yUX4_5BpoB~PDh9_V^|mK6uuB#pOuhO!x2V~(vS zO&-T*VfLL`TQ$Mn6Rs@x3}3>F6bSXLkKCfbav_rLUyAJ+dtmA^%%cVGD&6z>l#))v z05bqL0;a=;M#Ku-=u*Z9qDs?=YGi`L-#j>Z9jP)e<_Tnc3QMj(n01-Iy&pwKkuZ9#Fvv|RPqNb9VQF(1jTta( zW)!{ni5p_Vz33-E)+iRMFtOo0p8I^`Nf}6VJGX7OVEkI?Dj|h}vr$+O|6+c%TNFNs z1BceKtl?XbPr?M%p&wCJPtXBhg~(%iJPD=+$W)TLzuQ$0PL%iH zUL-cMZQI4DZjxp1UyY_YND9R}ls^=HloMboK#E(HJXK!uFC_AXCT%S?Rom*<6~R&l zV#)-^vk25swQPkU@sUg7$%D~PirZ$YKNvi(=gO=50r?yG|Mn&R7ZkdVtDO6%_W02R zF;!(Z1b8R&hc-~rA9nojMj<6Fifg*6YYM>q(VsnzlzdqlRm;-Q(lFUlr zn`(7D)TQu0_fxHYTTN!4@{gi(_*~sG_bA!c^8s-uH3Do3^CbNN6(X;4!1mi7J!JFD zWcIE*R4$m;AeioXsS&INcG}<;UxW9kJnSx7Emw|zzn;I=KQ1w{oZ^~HZuF~9>A36x z8105J$7%1>u*_O5%hpe5Mqhl?Py{P>CA--zetk)T{QTA|98+XouPkQdW_ZxG$kKCu z;47xs+E!ym{)uybvR}^e7*y8z!K{j|Z~fUUo#W7Pc70oNTNYGnWoe6P6*X)9nRhNi zvpVp`-r^PrRDIS!M9A7hrbWtWEvMOnx0M?_P=0Q8+-LA0PG+qb(_ZEjZ+Fm|jc)j` z=rz6MR3p0UOXg{)u;&26?Z8Zs8^7%n9^~7ENlRglBjbui{Wzn99oqSfp?I2;dVvEY5E8eL|{Sj#e?>QM+1+bXI zU&2aH1sSc4X(zSm2FH}*IJ$xl^#kAfvo=(xF9(vdkO$^LIrOjgacUc(Cy~+`LX;%g8C2=pjmv_LHbgM?|j7) z%^Fk2=o;she@gNe)Eg}qyo#^4==L1muj(;QRr}aJw>X9Ew#WBwvC#5qDV;~4z4(Ee z?FW%zlLW6$Zd^Vqiqd~#PRckWcM0y{eQ^t?FOb}$u2vT3cWm>u&GboyrzZ8<#+x8@ z{{b5`w#|l$L+yD7(F767O{D5=E(-P~K!|kx03O%5Gd&LK&P)c>opDLy=?vYOTPgey zxVPwx$wG+KouSD{=4YNXvsP2GF~HETUEGxw$immLN32*Rt3N--Ab<73J_V zKAeSBbiWOuaiz2wAMX@XDGaDK#8|Zg9EH2xYQX+zr-g3Ed$*u8tHm;5y`ir^>#-z zGiNR!pJzMBk{(b2+kq$_U6Mbo0dWoMQEa&Z7sD{do%A%`f|RCMJe~pkSL}lQz*ym_ zLWOa_c*i!njE|34V4Ju1F^mt3R$5{AEvxR1Xv#xMT{QQVzI^_KXez1;{23>k(DF*w zZ>E1C=^o&*39vEi?^>ZwD@#5DErlKDGkH2S1ANeyABRuiTH;eQEkx1~UC{#W4Xvic zUvxzS0UP7oI}?zlm5%^6vs?_L*b|%~o%#b7S}t#(X20^Z9-sk$iI}lbfG>j0Ur0s2 z;oU8?TxZrOlDW^n5ldZ8q9+bD50hEn^_}CG5vBR6(#CRH=?2<}Y%ht=s4c2tWfrTk zhsw^d+{Q4Z^ux6524v>mce>s>r*J3u_w~MmY{OA+@M&+o-<$PzLJHSQfcy?}5O7HB z%{q$it@s@aA-#$YbrY}CR=^aD*C{|Q+VCt+^%i7%1A*JbI@$`TG61R!r98m1Jr4mU z2}no76IIzHcU(vuzk2WxtbUi~mN5aHr(J+txD1dBr=jgIBH6^otrL+3AgO0rU=k1MmKXEM3?mp7tS{8~`C}tMMz7UJOR;3k_1fA#Y-y|r!)A#niOR?ISqLqER8>z@YhgF zK<2cK1Z<7(ura4D2wx(ejBzd0`&)8yUCysfZ2S>BBkRlN{9|1@DJf%yRNX;j(ZU(zi=kOn~V%3#ZmKZm+=>{LWT6YsrQ{@OA}U_j%4VKkO#1**h2Oze01necLCmmc&-`W zV#cdq1wRbev~eci3Ju8~UY*T`>RmCm_te_ohbvX&85+(SWC|#Oorx z7;q3^m+&-^W?d9%ysy7cMf_f|%u@pRtPo47hdm7s0?TPRU|p_gvCjA_;>|g}M8}&) zn&b45j%OqOEE+fqs2W(N)1N`P8q}?Nnz+Tbj5n?2VA<{366GNzJs@mLIV~SgR}=1m z<-+JRNOgWhF9JRecn~mAETM}EPNEnLQwrXo+9kBwNJN`$sXEf%ZFAu~|@oA70`H1@0(0zDK!AUe5 zko)jC;4A!gxCten?i@uu6Vl-O!Os&>GfjXUgM&G zY{i|OiV?0QzNKq`H7)x~WcGy5?|OU1t>K>GNf=oR?qN-noGutY`!P&T+X6LrtD*nT zIDpCAGcy$LHFr;Bip+191n!pH`0^D#F!{*=1%7SiihMl$?@4Cj{{OAX)3i>Ss0VJ9 zEa}oO*546qfUzo4!=sVHj8)ml4e_C$KFSWD{JLr4c}vb#s$VY+?+nK%7w~Be*k6Eb zk|w6U9>~W5JBEL|!K&n7dV-a?Z3E>a@lng0eln+9VYF=Xb=NvFzqDs9To9BAZHEmj z*Ru^!5zq>R?YqJ#Sv$SZUq1Eq;Og>v*Ft|?EmKjG2 zoM|G6B9Pr4K5LxzMZ}foj-zeJH^6e$LTSj;8I=wNWZ4scqq;20=@%_KZ0;IJi;-%# ze7}d*Bk;IbNVQ$OuEAOeAe+x0wyiEsx4NOZNVA8}-X5%!b-1DF+vzhT4nV;~w=UQh zFio`+U!k3)NVSLO7isJE%o_Nxh_)f|J}``v($dts$0$I?yJp3KZ62-%RyHo|8bF1} z!hF+%fb9Zaj{-Wil;1&W+z8VhKJRmzG5}W1VKEkbP9Gw%o<9=pv#1E+VZr0@7CwtP zm$ha0XS>G9+Q;Abr-6;rM0bDniPj-J4+p3Ro1`f%!=C^_FcjJ}P06c02*@YuR{@_v zXX{JxOuyLq&C*01Vh!|^r6GzbqmoDJ<0>}{v4J>mIi>Mo7M@=a4N|-(m*$Dtn`2JH zc3<{4l8lK3+NH$ZoYvr3@6}4%X>xdPR?OEu_@kGv+lZ@S3x%{2rQ%i9jTNIzwkxY2 zE{ESA7akX2X!$`b7-%Tj*HDcXx*^j=HAL!|^%>xmB}7B#S9tk|Fp0D;EGDUv---aE zx!OXp)L>kjE56qatBovuuB+}<3z>O*QoPKc7*t&*?duv$_Li8>NbXTXZ;wz%OPT!I z#M+Hpakb!GKkMbrnv$>qnlB5d8p3#YV}QxsZY`Up$16LH8%LPU;p(?(Vuj{v1{j(n zs|TS?g(h#2Ih!Wdmfc2n4aBIo)fY|S9gKFWCu-DxQJh3{vYjj`Y85M%dj_;hgQOw; zldzbmTyZFSiKe`svX_`CH#R;QulQ{lGH;GEN`cxkiZh&ol99!wj=r+}BpK)ec4oe+I)}(l^)M4Jo^SQ2!i?ho; zQuGX5ALtdSm3cJ@Z_x7a#o2Y}&~Ui?!Crtw5j(|lucDM( z+r1`2q6pH1lmUh8L_|SqEGP&hp@~vsmmWll6afJd0{nk_<~ar7dU?O~zW?uC-^yCq z&(yQ0@A=K1Jr_q_2VK|WIWuuNT@F+3hU9+4OtiUQx zG-=+AO1kngx0EK{2EH*oEu!w^hP%pd_oUDxFHdok`1S9NlgK@j5&ET6cw@GnHwxptwMLUsUcL0VqO9?C_NYaI^T$YvI|5btTXJs+~Qup&4Oa zJPLZb_6MOBl?}LUok(e1oQuws-?(_MbsoaP5H=*AC%bht6BL2fTR=lKnEIQUT09P1 z=}*V2n-{@+?=nU_;zZT-6hoadG%O7-8g>^=(~9wk50%}6RU~5X_z?Z`0DW^w3TttR z%CzFtrYnDm!MTE=)QDRkJWD}6$U86_HYhu=Wrueg&}7$Mm<)k%_Q|*nUFd8YMm;x-QU0hIKR5pFiZ^Wl+a`si(%h>sUIrPT<@ zd6+|n&!IwmyvQNJMo82n9J22Nx*H$Qa!9BVatt1wO@QUH@#6zwnfoo!Cro=jBU4{2 z&nXQSC<_=*0wu7bmMkt72pjY>It#65aV!l-%*QxWyD0qSftd1s*ysSAdI+?YY2Orj zb7;2qs2G}GY_r8VgQ5^IT1F&$|7>j@CyepA?c&7(~n_MZ0n z%BQon54F&fCXY&40;LsZL+hsQ8OTXmJ?R6HJgD9TTZ@GVNTlwgQE*xgZwG?wKyTt; zH}!j#cWb{OIGK73$_A!dPvxKw1tIrbBX!(hbSd_@&hU7UJ@5ia3Fy5X(Avo8Bs`K4 z5IF?Hfdg(Z0$PlN5J}I$o1gI^&=)zl9o6Bd6X_y?GwA{F%KQxieVF;{V5A-mk5H-^ zpACu3`VU0nz>X?yb$fU;(U9vSD9b&dRiJs=$?6lJAF^ut?B{t0*N4`FvW8>e3)$Li z^B4<5t=!k>%}Gc}F)y+(ForsVx;=d&e7zr_lTXtT)(WW57Y0Ccjom^WcY6B8m%haR zzGH0gLxo^PCIBO7g9jD5uXk~T=u+7^QVdO;5pFsCv01;co1Xh8studxI?!TmXLXN% zWoy4{m(3KtdH?zi&U1Sd$Ixa>9R;2_;sp-*&Is9s@ocABOdYysj!2@^mjR)e8Z7h( zJ`w}5x~YL%2Ipg(`o{oqe9oj8v9kTC2ui|m?TPXGG-$SI`7}9x2XnL?GFoHNbwpaD`($b{=VluzI*(ASC<%Z_xkx(k153jrkOFO4+Mzw_ZDY)TCS0LFvGx@P<;pS zkVNldCk=fyTOxahjOt9hwxRutUq>kLf~rXT@7qv8tbR(}R-mp*J{1;ic!apryEroX zh|CxQF&|AE6F}?X*x~X7@a${ZTHR$6z-u&WB=`7r)eAsB*1|B3JXQ+hjftRiRJJz6 zj6rfDz!*Z27-y*%TW-+aJbYlR5T8kO43j}LeS+^81aATz1$y5Y$XVu(toj*G2C*30 z4%!d@Xfu8h7^|8)9+3Vm$HE_DFAwy-Af)@l$o^w^B=b-|XLuZE55x?|kiVY;8t6e} znncSnDLCmJcy~nb9uDRbT=e`9PXevz6`ll`|4T-GW8fVk=Y|$qef41kL-X__a+NXK z^brjQ)wPeR*MTnK$>8NT)MQWr%9Fu%(AgOErI-UI@uUFFy3$9Ar7ABk3gLf(Dkp;r zKdAB=JI~djO8?G7$C0yCxeS@YSfw$j?}CE|^;}RM)LB!r*%ZOubWi}=lF|%bGko`i zddsBqG~U7Qu8ajHG#KBFn@s*mZL+NTTLwNF%L}l?p0NO{*G&*J0a<>mLVo*`97%1@>gG$mt>ZT%iK3P%Q0RqXBk;K zuE??wF*(aIpeoDbzAX2^GutJ()IGKXqdi-|_mor>fFZWR%lmtp81m0YW0J4f5zkTR zn^fU{<}J@}o%H=yEj+Wc#Rq{9YTq~5Rc9;Md(ZRzR>dAqJ2c7mI33KLnXQf0wpOnMouuKs^=@KZXEH4T-D=viR>~+*%GRI0XDwe6#jN(R zsQYsrzOUvZ7;LIvOoi;P-8VU<8ZA~+h%ew$$UJJ`Oc`f+&T z$)6cP`lp&G__kdPz4bOvDl@2HR<_m#$0=5Q86G29)(uw{;q!Piv4YKx~X)nhICQaq+s-T9qt72T-Wd5tQ>RaxHeiOKd#V`VpG2cUn`>`W ze+1fE1LnI;MXSE_0q+yAJJJR`jYl@-6+1(A8C?Uy{X-w2E!x0HuTc`;G0Pqm3CAq@ z9wX3uzX{^<@@duEkamp5+r+;wVR3IMeGmFK^r$YMaE~gb;h@~3)`E_;ZZ)9|e}TI2 zg~wy72Yt#QH#*nxrMzlS4%hK)P(|iF4($H3aT~(=8Tx~#uZ161)vo#)6(B5CcA!7^ zv$qi9?Pu@9aYw@C{VY&FX%r@u2BXU*2vsxrlbH;ZFJPAg{kZeQBUY*q@*sCVIcOUFq0%a~ zc~r+AnsD~aO}W*gpOYbY#_^oN;5A*(z&W2^js>)*2HU)*SKR8t*`A8#d-cq!H}HUs zk>XqQ1sQBC{YH1ax7O&c6IQA2x(c+CyX)iYvti0(dZ_-os1N=ec6YwuGoIcw3e@GP z2JXK4Xp_1U)fnBkafo4V4l3s>zw~tHGLt%+;O_iSbmUt$s*XGaRCeU4DuS3lq4;Ua z+6++|y?eTm>Nwnd<{GyJZH<$_w+w?s#tU$m2WKcNMtod243T1Z3&%b8mg*gF-mEd` z!u|Iada90pc_~c-%?-k-$Sl$S;d^3f7u>9XXw}~_iT+Rah^D}=Aej3prSt1udGO1H z{$U|#8r1i!`g=0A#8el-Qz^aA5&CVz9b)mq;wH&+4FgO1@hKMl+W@`lHN2P!-94*5 z7dEOk#z)ijU-Pbg8r=!nP5Xq#gQkR*%v7kYRiDqfdGy{Nqa8`9T5@%dZy*+HrtMH{ zA2^(GE{1gIU*EBK(Ss^SrD_h*kTE@!!NGkk(nU>b7WBv-zNM9@`JniXkebQz^0vhp zBqkJ&O{DvO;Ny%r>**7GWZ^BiU7&8$jCUyVM{pBfc7&}hY=s_+UUq~!zz-;&uorc3 z2t>KyCe{Rq4Sfc2E9Pb_#;%VW{-nWS- z25o0dHf`wU1QV`o7kqQDjYM_%%68hi;yAG-;Sjg}3CE#Zn4B9LEgt%5e%Zky2i9BM&>elh^r^&==@+!Y#K-RL-r$=WiZm*zR?-V?xBpn9X7%*Nf(3A73Hy?6^0HYZ;3 z`tQLB)yey^VX5APN01i}33t$}1KHYA(}f7?b1)k>4|-JZ25lV3J{J#TJAw{(?-8`6 z)>lkiX^#tw)a5JavXw<``r8f>G5Q9Z*xJjS6c?#0I|Q13*>zD-HKnbCQjhYPT|aVz zLf4Ucg39KuJ(KaUs0evBRIH7o}@8hWUwZ$Nz`Wu=0gs!}r0) zizi=EzKTiwy779ODNJZL#5WctU7k!6d+Ntqt5^J%t<7Ln(Ff1)rsHlA)hRVj9RDTP zNquIyw2;fEE^)&4l!GoJDzhB%yJT4v*IpjZZ(#|reJ_Ww2S`kNIu~75`m)6Tt#-rIxk+-Jf zV%>OnH8!mb5|Nn?#M4^1iqMjJnTyYAMQunwJVgpemA0dLE?D1$-Ius^$yBI*imxL+`k*{^ad6GK2VPTisAmmaPKwTaTip0 zH&D+1MZ^8J;r`xmn=Tr^4=R5jwANHUj=nIVO6c}WSdL5wV59b>?_!mm*g|-{1l5)! zpz5w_;S)V$X6CuH2TUI5`tV>DyuT$ zdWa|;jmKo?H*x`bdl>#~Hvz91agwoc=C+u02uVC@sfP70i>}PJ1n4H6Emq5{TKqXH zd#E(sg7EHoOO<6CvkOwdJn9R2oq6sXz~gBuz71|%RItniyZfohU?kM7%7fH6E3N1q zL%|jo1i|&^H)BcM6Xb;Lx$~Q;8$7ep9`#%~@mk0X(swLk16(rV`b9Jf@zP-9dmdBu5c*V~*-d)YU1;XJ1vZ@&liaUJDaU0QUgJTQeZeTTh>vf+~&dU#c!-a^J{t>VxC z_=lK_kgAR0Gmd? z#9PDcFCy#qD(mnLvNEjp=i%4E@RNt0(l{>;JL$wFljfLt(FOcwG4knw-ggO<`#@(^ ze|HC?utuNFpy_ahC4XqrjkjkMmk{dYMSN+vvldZ`uouMj6b+vVRE%D0qa(2{%^sp| zrf}<05xQ?H>>|y$f+G2d$$I0vMz|c?5E2l8Lm;TW-_LtEWUgMHF_>OW{gaqq?*3V! zu>WqrW;V)450431t1vUx>9{MD2hUW|mFjcd7|V+=mf~qA0@!AE9Tnadk1l-)?yRsC zE2C~ORbX4L*Da;oNEbxp)AS;!G}>y03ax)0n-Rcyd}HKs9PT`fo*cVN)6FL)^5}U1 z-v$HUUzT_y0yyyxM&e^|H|JvfXcWU0g$gk3A49$Hk&9Vn1gOEs_RF%`i2%-Oho>xX zHw`Nv;e@6(m!0kwYfR7xc z{K=Q{fPcy`;}K@&;-HcE;TWU(4jI)q10G$?tA2||aq97HG{Rvcqg0F$F0~HY&%D2) z5u&}zeyXz^lRe)JRWUgOQ= zHT zuG4v-tkJv~l#`q@l4K-u8}1p-g?<6wMrj(1(rknmm*#>I{TST0n%{Yiqj$haXD%KF z#f>3)6SSLIY-JAXIgFKt&HM4dCN`mBnFTKQ`{6;8fW9$5{0`b_{eY6QKc^T^vKJN731%iIrW%WQ-{ZlZ70r4Ge z00h|MUW;<-7=M5O_qP@7@Bc(P?Lp2G@jZu+PL}F5!8rS)PN^=)AFvq=dN)*bmw~b( z?McwvK|48JQk8ccXlsP80-fvOJZg&H&*q~}rchL8e(-s58m7~MkLyznMm#Iee^6%@ ze%Tf1!k5^ngR4Lu(^L|`ak=RzRwGp`etz6(in0da`595L=N3nxes--mQBjf-ZahD8 zRw9~Ii$tjr`xwnU_=ZF?53Utj)Lp3*-o&L@Z8BPc{+7^II-ZnG|>-Z^IO-)ab^$K1M?x#D}*bTV%Sl zkwM_?ZDDVDHio{0yOF1%8qM;{mKzE;+j9$Q9HRR8>=0^|h2er@#&`Z}tj_k!vp}Ei zOZ@L!>s^(^2T+;4__>JdH4N6QPRz!$v*0Jv+mh#umIQ=e*c=9Ef||N;<@ZM#0@^0h z)7}jM0HWp^QNG|PTo>=Fy6D~vqcF@9^&+Cui||T=+W&OWD)jR^o4a6CWHu$YaB1VL zvv~@D+Hn8-?vAF_@cK^M3aieLW@KM+#y}*qLcFb_Gw^JV{eZI-=l4(Q2I>MjS}5J6 zGzl~pd)T$09klM{*;vF)Cj&)kms9bg?_Q^w9)s6&$o>b=J5=_WGJ6}c&vCgJrl%F4 zSNwK@TmANpp#0lUfV#lTWW&8gx}Tz-rMr}@IhalHaZ?kPZ&eH2)oOvV{Iw+|#1_D5X z>Q?wj(6nN@rHe~@16A`Q=q>nBXC4b3vb!Fq6JNU^_w|KWGWaS61z*+WptIPXiCO%OPCiLUW5e8ZbKfauO0+g@PJ8s4z{--#9gCED44w??kWH~6Wh}A#f<3nhU z)7aZwS`rMck1;@AuR`ls1*B#{2w#IZ*>Vxa3&H*G3dJ5Z4=ZX0<=l>$EP}fStRWnl z8z$G{TjA+yF;Jgih0QFn zQ5O9T=_7$7Bz!|uh8=`0lV4d*jJyNOY9l|$7eWEzOu{?UK#uw%G|n=OVUNk8s`(iQ zmBFVuu-|2%DOSdQSzg!;7uSx6+CQQGpXNw`Vo#WHRz{X{*#7?a=mOkRot8biX?P_xO!0f?xH&2{A>Y$CM`J(qtr?@+J7mZJ}X8tMpAT8@? z2aEo}TVbLHPS#DI_^CCTj>8cZQ!~q&&6XuwqyEhu0y=^$pG8a0upqLJo+@y$HojQY z_o4)g=_ovU;myIIf5DM%qph?vltno znrH)PFHq;b*m@Ys>jek1@z}N}&mg*pH1>#)eN&M?7~A(Cd04*yijxrmO0tS8>jSugTt zo#j!$rp*XZSpxvN2MXU_HbY@(4yk3{>3(@PqbTH>8mykU2I5Zr5icop?`{dXev28SOL9Xn-NwhSxY0VhHY1A zgmr>^lis6c-QPNa5&haBuShNHw4*cHSPxx*byXnx6YpaMYl<4lolV(b75V*V1x38O zOx@qNVvNu-%I(9uvhE@(d%T18d*ro0tQ6G`b2e*RpZImgv(=x% zWo6Ztn*O|V=tGA=8R>LBs@!*ivb)4^&okV640q^bE+Cy%qiHif+}Q751XUI z7p8L_$9fFdXaZ;lOd+9C9hmCj9E@9T1y5kbH{iF$Y*~omw~_G71pF56-TBCE6G9ch zB_pn1B=TO~9UrU=2?g38qhmfVzRM8Sj95c4|(`73dm%Jdn|~Uy*_}=ywc?j}HvAzexJu@e|tf)L&9e zv7pZad5xoqC~N}RpJZXIJGnvcHGMl-)>#vp3ujpJ0Zb02HhZR{imtw2X^f7{J={H2m=N*64YrLp@~ZmBD)&6(!pL+ z#ojqMpAH?h$4D(U&=7FvMzRV}C*-|aP!@n2KvVIKSMngBUZEwP0)1aWxr2FHIfj~x zpiu~oz+ucZP^ZFHvJC`b2QskH4g~PUAD5_2=;5Fcq)iUpILfG=JtT8$ha3hV#K<9s z>ObTam~)7u6$s!8&Q&GY31@0(&3dB*i_0(Lr^OJ(PkT@!x9cyHwPFspa}B0k+J1k za2_jcGROiLC0_4K>@70YK5xJS+wsxKQ^dwExU_!-jSa`cFr~M!8KZ^p_y_~+u@@m7 zH#@NgAg;c}$j`XWWQB1eDQ`fB%l;Kht6Qn^Gd583Lw$7}(m`>ohv@s#{up}cUvl{o z5Ji(k_*on%51Y9^MT(*kv>$=l(PxKCm4i^vTOknt1nnw`GePLfdkJ_L-U_M9xiy9= z;JAk;z2c@g24Yz!vItTa%z7B6>O9umEy`4#l0QNM?D7hVZP!ht>APlbXiF| z+6;v*c^Oj!wJBzFvAY;jJvt5=5SSB#=~slL&=Q2e9;oPl*J(!#Bxot0=3vnc?htT2 z2xMsoB1${+h20N9OAWk6&{+6!hMOxE7_uryg2#%6=8!zu9{wXknZLK!s9T3t%!qHT zp|{}K3li*c&?g}a8aC;S9*l)V*`#9*@rDobOr|%6sU@VKU9UJBmmIC)p#I1pnSx4K z@ceR_#VgV-TSn>dlywlJ>Oi<>q}XUGeAzz79#EFjaoJF2pHM2Zr+m=SP@L#lcp*h8 zK!|=BWpSeUbf;bHx%i${EZUJ88lzSflg{HPLqGg|7@MV{yIz4vY2LDv&jpI{on(C% z7RDe}QaN1mh#VW5$HdB^qm!xKt1j4c{-2e~@Pvkx%H)d}`7i}Jtc5mGNoDGhjLS^p zH+(FvNh*u{_%rpo0ZU~IVH&>-l34C#rt$wrWHZVcg}IUiGHD)vos`trnw1pLSWjZ| zs4Mgc4vwtOoro=1VBin0bruuL%CDzMlU>mG>>;YO*Aq=1&s(NopAu6u?urbSkFB1A zuvJ>%*3q5CiN|IpiLOKEKZx|K!yrAYrp@n{w4?Njq~DaV4ntj-=&$twkTBz}Fp>Z9 z+s(vQ*DFyXudN$&pvS+xoFIZvYEIx)pwV}3cavY7H2>~G=D^e~#g19{eTq?GdUF$A@oRyiUOfDb!kM6)wrcGJGC{sFu%@W|p$k^jZ85D4T| z@A(9Br+E40G8<&gJ`^>_Czm@#_e*an??S_y#dD`9SzgRp)ESw&sa94qr29}RYr6KcqTYdjLmH{Dc8nUw&k&72kt) zG2@gOb6w&h^gt#1rAk@LMFZibgyN{NZDVL0oO!H4u^At%L2(I`g-z#TRmvtp#(Ne{ zx1lBR9=?rSGgYpk%C;8^^I0l>Vim`iDiYKK->JxQ5GYq%a}}kQqd=xP0ova5$pmWk zfnwniP$?$w2?B7ibuI6vrFCzqFp;fN*CA2|^J}MBZNmu>lriq%FHD_C9Q=5|?y!0w)Q$zkOHLxn+!Nmv=% zc{|D@=m^{*-+^+AG+Kfs%xIDB_-0lIf+_`sg4_rPRm1rZ>LTeAlnS&rXnQ__o`?@V zf?f@393R(G-73^v*eWFoaiy;kRiTNoWMArn&6}>DqC=bZjg@IL#Ak)K2b<9!?FUF8 z#K>fg%7l)=i;sfW`f|uLoguo2tdb*?xCrbIEkP5t3%r2pJtLWzH}Vb-fGws9oW z!U~y1a~zpATjovmrSYr7;KjeXK_#h#GcB}kHZ~4(0-a$n;X4>?CDH--ha-p6z8qll zk_%6FeWr5Qta2Cx=k@9cT|Dy6*#xSHKsWcOAE+b^Mv^*}BxN~zo4H1wy5ECuEcvInwFuhkv@8W~web4a}FFzWG z;1#GO8(l(Yw3BNkih{G@ZMcm$4zIH0!<}WGa)$e45x)6scqS;H4Q~g%3;m;6wM)Ct zd|sZh568E0MvVJnxodDhR1GgSz*aA`hucKcA8>|Y!)U2t^@xjqaL#w(n{yrn%FO>P zqlTj+?^h*{v(Ki@2z&xR*SePBok>&(s+&&Cr;qTF%WqtO8b$lXXqnDvA8y;jsy0-g zd<>r5%x8Y)TQu+En}2yDDF5;?6)}A^wmRmO`#H)0d~=kspd96din13@&msF|r~PU` z_@DNx1oPMUj@kVW`;&4s$wn`Y)R- zd>!gLawj(#EMTc!pM^>iu@0-l`v%zVni3jKGx4*bREE)Rr?E(6=mf|)U;*6K*sNZ} zx&r%^BRFG+f1Gc>5TlvfZt`FLW5>OAoB|mpgHb?tgEs04^`K<1Hff+hA-= zU&2Qxiz*QAe8!jhxt6jxP-^D#ISF0w1($w%=#RP`j$_<=gN{J z;Xi2u0(Bri;RxVETsLT^pb5dabWy*lL##TXe;PlD$pk@t!N3Jj&3{ntJ3(2W;3erUr5T`Z zxHlT^W1tzG!SH8B11dceEG+7-9I7bHj^O2g4ql;n2(zE0ohSG|YG#CN4drk$+5n$hktlixFUL#hCeT-LxWC?T z{{hN}``J7BaNpDPAMoM+EO<2uHN2cj@c9Zp%`o$C(x~!fR$p}N;?)17+dywcHI;#K zwS54})mE?E)q%VDR10gGdk^Xdv==DMrZR~2Ev4;a;C3c^VUw~ER7V~W^((#M-h%;E7zhigz^8uH33aPdobm8JoV0FnM7hZA*g06su4tP%tg&c-3A&36Jd1>({le%A%{(~n?PcxYfWz0axS@!wHHBWnwMvi(v8AXV@Ybr|0X zln>+kg381AB7Dfhc=xZ^4WO~^H0a+!TLkvSE$WHOTA(@Jhg)%X0eV(>jiTl8x7+{V z8$X0PhuQEH9CK$J#~O{RPMtvcs?#t~?{T-d*z}C&wEN!bm=i9%?!#4F0n6up?_&UB zyz4Iyx&f%Aonnm=+=uzsEjYCmdb{`-S^+;cwe<^Vdu*t+_iu`$L4RNopqoxJaCWtm zZRGU{0-px>XgvOhC7&lqoQwp^Z6v@s(f{2{*g{0US;6XkNxUOUC1=p{{=*@6*zfA- z8n$f|a99QpK41PB^kqgaBPkM}>L9uUIq!iWivqcyvwM!Zhn(Y4=Q--G8}9VNg3%)C zw=MDi@u1t6e>ape#t^5xrBpj?Mqvlxml%aL9=GtIl*Z#05{2D`C^-?+R{4&;UtdMZ z=M~CX2#OPZ+6IbNq0^uR@i>rDKk3EoouT@t7dla&1}IR<6YUezoW_YZ@akXTt%p~Z z^BMNy-H8%#?0i9;VLt_W`5Crh>5JqUHd0q3hDx2_O&xwwrEU*;`7yP>T^{d2@;m60 z>LJhny+_EGzvI~`8mQO&r3xC4#P`glR5dS4YweF!it!zXCDF`2+`<0)j*-`TkC7Ev zsoY+$G6P`cJLfuuI`~F6AUViK%}hc1oIg4NFic~xZq4tVME#7J&tkw%Twb1Ng0t}1 z`F+ynT(~k-gEv*pId3Y7PO`gj=FEr0TaTW8K>LS$)u(!~)vdKPX_KlC2D`Nilj&ka z_2@9SHrf<%F~X^}09JUNGj|e<^QT9;wQ9uM3p!2%?lvUKjr+b>IyN+N%hyHCx<-p0 z#dsH6Z!fipA#0wIqQgc&tV2b-6OFXjK3<+b}fpIzF<13@ifW+V~QbYolwj`q?JN&rXIr#WY^f zNBGD#oz_JD$X0O?>UL3xx?KbaZmJW~;LudJmT(ymS2=TM4E1WvS-d-q+Pd9Z+V#rP zz6C;9upOoFK7wPcAkAczsr)S}|7Mrvue4kkb82qz7>5dShJL>_?FLg04w24$K;7V@ zYpZEEhbY{mrGF;D@@+rHjA%EaK*_#>;=p}2YUE~6BaO>14ePsCASjb@mCtfe5;_QH z7+1-Od9&jw!s*tm>bG*m@#I+!a>Iv>+~(#W5rxML+7PY5GUXixCJ_6xO`FvN6uV#2dEB#&Ty%kZ# z)*?fdxkj$3_9DL^HHL0XN8_589%DGN6yFR3R&<9Edm z8gR-6QU82c46Q^>1=DNrkH>E?LuptHYd~G*A5Yrx8^0NTF-_U;6X|ywzK59B%v23R zJKzk*IQ|8cfw=HyC?K-C9rRbUXZz-EEw|NgW1?X7H9fU$KsK6t|ClK6WhjgOo!7-L zp0682Q;~!(L#+kn(jNrKfyIu6V?`{XJKygE89{l+l;SN#v#_|~24(Cng*JP56R^BAL=r|nNA-jEb`3gL` zna|0({DNbGfy1DTAnz4vy~<)KFB_XMQ~6k0h_b}Z{Bk-ssFCid@tcMzeI7N({C{&UqS{SgmdmlvX@B9gC|5XcmdPfUv^Tv5nqyx3 zD>uV3d~;3h;4qZ^v?$zrb2MdNhpI92gm6Y2uWK3eFyF%KfaZVYbfOy_C9q>aJGjoB zN;JAn4qU&SO7!bC+q^FBHn=-#gejBuR$L_Vt_F+oYn?Ht90TQz;~xPcvS(;4FE>P-(j2+KSb%uFqCv(pqDn zhb&#I;61$KsV)A8L+px_rs>0=uQ!>Ri_rl(${!Y~jIc}Fe9@&1 zsGe{$R~tCgTQ@~lgZ20Rqw;v$pBtm`u9L0t-b&Bh>Xr|x{wWf_8*04HS$dlr>QPrS zBkxmjf;p84QS;J%D=og=jdNrQ75yIxi_L)5`5nJ1WrJ=3Z3E-6jp_Qd?olV=T@Cbz z^6zlN)Y>Ro0Lt(}&}F+|%yY`}1j7rp>u-#vTkqs)ygR)BdYzn4ty1j=wh-Xsh!|@; z^U0d*4d2rNc;0K;hihKhfevxFdEXFv_%640JANtn&%dNF3*O?_A_{NuF;sNzmT;e< zRhXPbSdl5WJEr`IwXd3`ZFi_o>D8~&V0hjuFBp7$z(L#KVg)W&542QZcRf-RKYddI zJq~C4nC>3ayhi4jAK7fzqp$|;c^d@}vr7{$)O`@vj`E&v%>vCpLsdZ89Y?Caw&A4| z35+S(c*xWDi{2U8VLV1@(dFBoJd+K^?_Dn|IOeU~rW)Q@zj5B~S&-nu>Xw8OiT;s8Q^=VQ-hIW2^(z+TbJ#XH@yd{ zhp$-&)qj25^l%BRoQ7YzW8Z-k^?>0I{9$tj=(Pu_<=vPPf)?ALPpogb6fN?5ID%n2 zUT(}_@GVeZbvhBcb$peevDfT;EfVo{ilBS2f}v-mQf`z3Ra|qtnP#Cu@a+c+Q(HjO z)zzn4w;SJ6aMH!3xERPhRmE+PjV z24=$g`C4F8xsNP`J9+9O8-pT7ekLEf#WfO5|9zPRSMZh)o8!Sl4EMXWCdjgG|7GtQ zLgZO5D#s1wH-`$phTU>3<%JiTUS@sA0_!^zwIGWRqeXth&<-K1C7u$*%3g(i-)&*I zy-yiFYx=#ts1M6Z6=hF$c%F7W#EVQ1`W-Yo?p%a!EQU(IQ(8pE1i5vW6VGE*=RXWY zKuaw-CTA`fj9#rC?`?)5UgGGewE&%kZRR6xJXzIXqI!IE4f9T1ut^9*eOj`}d$QC_ zJ^Hv|P;>X*5c@8ghi~9Fl-k#=&4qEvFF?C#Cn&5R&-3S~4Jec@X#nU00Q^FPUVD#2 z^w@ca&1}cx)1jiOTh|!T_t__GSTD`}u^Pubm~QeuEfwyaoBAUxH?w4R9xHmmxKM|H zOpw!Ghe$on41D9BQA>~$UsLS>%%gM&DeR^hW*DCz<)BE+LcCUV0?otOMKS305Ld38 zp7b66h`#Fdgx86#d-ei-FB`n3H%MJC4BDe{V`9Phd8t;c(x9#@HhL7dI&XByu2Bm$M$MRO>?= zGzcD%fv;au5jvs9wQ#wO2Q%uL0j~yih?Sf9(SfGdT;mV?4K)snj{`t;)b)H&Y5$lf zOuNE$l(Z^mj`>;r;)Q+nY|H%?brk^uq49*VdV=>qt^^Vg^30g2YQ{uTpEOwdcbLoI zY4S~cc&m0V9FL@KM%9MOsx=!8(ZsXY0DI8Z>NU(k1e-y`~D4kU4zswYF@xpc!Vp70nn3h>1Es?Urh9 z*+QF+cZiR}Q@+N?r;|jLI;W95mn=G@fUC6~pnW)}tK!=VqQ7(d?Rg`Rho* zy?i>Tj)m@qt5k$tJsR!p>}_e`*i_Bi+ogsZdbgSv9{g{D1Mx4__ieI~k#iGSsCe2-A*I8iqL_nQj|`2$)z(nFfA( z$`}k$H40b3C0o3SG_J8;W7sV@hj=Mgc~86+dQ`g}j;5^VP-)by5bI^6n&2$3)QxS` zD(s4Lo{XWPh!8@P5#h$P`8!N{BiV^P#_iX5VF2`E;A(uiM2$_;oN`)(p_xRt{{s?b z(AdWMTG|eeW@6?8t*wD3`w|+9kh{D;yN7@Fb37dQW>hp4<7dOjiufJPWAQA|5xN!M z%Fxi4m;KI+x8?6NgN5fG5T!NNkZ>gSl7W;VGh-jTdtA7jDcODMX z4FI$vMrjnWBt zK5u!GZ{mL^atE};^@kTAyJOC+0_CT{HiO;@8v7z@6uopCoHnX zz9US-;IgNE|DC#s7zaUTtMSc350+Xs*jV!&MMbrMnawj1&9w-fv}LeY z@17DOL%YafCK{l<8_L1yDO$kKMV;WxL2yQJ6M%#IfonoSr^R<-QjvtX?noSR2i5v|e32!%ff9a9k zZo@ZZwt>j)EMP-XY_5(dts_N*%XIBca$ip=S9$&RzsMeq*Cn2vpC1$8KQJ5*)O;FcTbI`D)>1?9u7a_nkehrK! zdk?)~7(lLvR$U!>;|{hco9>J?EP$3Hc8Bm0=dF6Ue)dE4`qt0ztS= ze)f35ZafN8x+Kpr_10NIqT;J*nbl(u3wHMZ=ZA&Zuzi2l|HvSy^$h}kOPwx^!Ag(2 zC|8Vum&Ura&v7={Z5*}<=5H}=j;E3M&H{3^5cD?Is0qT8e^E_aM^of@?t>=k1bTx- z#>P?8dzTzE7Cuo(Qw~~$K9e}X4QtGA(=^Z$+y+i4!&nO%8G>y??x==X+7EYUZ6sw( zbZdtYKjIBH9<;~ZKF}^H03%d?Fu+R)vv%&3Fji=_e@i)&6u$ioXiMxsgYX7k<&H>P z?|KAHD*0Y|8gJXKI}ygz^|3LcBca{c)v4E(GxDgf&&|p%{_D~ zE}6~V*Wr}U9uS~9m_>Ckdv85f)SU~BQ)j34XY@FnQePJ*?ABqHAZc}W;ba_I$Y0Bl zzs5$0FTt-xxH3P;Hud@X^9@rlUpOE2SQGGW@bCbJwDiaEaQiv8CO4KQAa02HF%&LI zL@lz#uo1%A`qCD(8v*vv(?{)k5-vOkVP~JVG|@p3Q+Y;RK$)Pl0@C^Rz;s;jDY!2$YRg zSrBRr+uFq`Jw)g)H^L|Sgn8xMRFL{EB@;|XI*ExhbDzQWxT=5T4xpKDy5(Aj zSKYRYm)~BPXo6Ab6JNBA4b%^QF{Lg&MQnY0p~Z6W3$~#z%EF#ZppqHfsb`7W$qVCE zK!Ka1>s*Fg{S<@sX%~VQw4iThqA;?x(_X zj6Y0}VIntnx?^ho)Ntdaw?}3#41s^RI8iz`K`cI5ZMTrE0VGvhSFcmpn1*dJWXYD~G`9{~1)R2^h0yG$kQVs=o(-f^Cr zoK`kL%mi#YL#jZ_P(O>Ux#AEkT(`SY?^-uMGcC>OLv1q8n>jb zv)tN9>)1JgdJLX3+YHyh(CmBu1_F3%x>6UkR6h7yHS=6m2OfFd0W;D6MbQeCp z8i6Y#>wwGA`-mJ7R00iu(YNa57?D?en^jbgInL@g^$2?fPoKG;h)op7i*M^BD#jkS zVfHd^z#69+n7u4=MB!akJXu$IZcnrrb60yuxaSp8E}K=<+A)K5o;o01Z2rA1KZ?2F z7_elDTnG?Ol)QKXO+i1t>(=msyC~3x0n2+4dVSrg=2tAXH2ytwK-ncu^s>g#VmRB& zQg<;*-SarBk_68|aZ;c2m}l|8nf_(3{(x>kto9IChk&yE6svBZ`a}*4#=$)RS{zZL z@ZQ20L2ula7pyM7q6qZTT!;c-AsY9z+*)(0ft#65JITMi3$9iOjS)S@_HHWNJ05`j z9WGn2TElWZ2CQIP(Kn!m2Dp{Du+hKQ`v9W8HB=+iL6lkDys8r9Q}PB z4w}Qbkyiy6<*kEP6O=Sb%~4k?>Bx^LdOq+a)2blRvo=KB3A00ylVurz~o!LrgT1cceh4eAcdxvCTV1a~`GH(PymQ%lZOC?Vyc zwBe@bbjmG&eOZTh&ic$#BP&#m+-lmLCG5w5(e5ei9ZcJiEY!kd8Jq5kq+O2kPjRG$ zT39P;9T5p?{@V4%ZMgbFn-G)?ez3Lf|9(+)IT{+~>&Xdvqp7=2{a10Tb}Y__^&7__ z>OnJzTG$1+o{q*{H!K+_>IPA;^hpQxTn2cXQy1usa5Lvp{d+3GUOm;v$hXy0im(p2S+*RM)iHL1@`DPc54V9z%1ZT%13~#0 z^Y*&2Zf&YA3W@b#mpfIZnDrTlOweom95K7f&al(h8Fm?+p=C8XgZ3QNw#tD#9$WOlZDX38l4+70f zoNG!8VJ*;-K;86Qy3J`G0C}jHsg->$EkuNbpb6o8dv1AfH0^>rHG&5^mS6oRhF10q zy-`;OIcw1+0lu^Xy%%qpyaMWqI#^v7;4~+to12;9(`@>j)l>`rp0fUb^VEMbhC(LF zUFy!!9KI5tEkWOe;H8z&Bv7NQhyBYMVmz&evX-w#e@^KRE2Q3e#t=&ll^YY@neLBB zP5up2$y9~VJjvSc9@ZM*l?m~}^Zwe^=IhrllD8_4>|@^i=)id8Ks9o;BC zEfBvCR);Qd0-B$M@Hb5F-!ducXk)Q5%A7`9tDKru9NQ6N6^o}0g6uQ6DU4gp+0}#= zug5Mmbi-@GdP}wPi?qR;P6&^PDJI}qkWxZ?gumx!cZdhMQ|!F{*_~n zC({hL*f!V8(K*^MNOi~G@7+rrTb9M5*u#z-iE>nai3I>dx$?%87^;CM&Y{GfdA(cE z@y%}S?qGG<09{MeNBjmZKP+<5&J9uw5<_lwx247#`A2Z(IKOvO>Zu%*6U#OF0$lB6 zL9z`IW&-?q;WupQU9BUXtD-u@$_Wg!uOinbuee5~D8*o+xE!2u^b`{p_U=_4pTj>* zp`eV|HTY73XJb_ov2j5W zFWD)gGWkBoR99XXk-e~pfA~b5k~*EdR5cev7Z$P1+4U=h=%=frYq90yqQBEcc=B@H zMCeP3^2CHiGHSusDr%-GP+4PHO~Sr*XPnsc;%cbqafFahR|M)&d@gSjeLg9Qk5)>< zfjalR>x{xSOF?0=Dm0@~tO_yoGM1#^FzVJl%dJ7Og(dV!s?&V2VsrQF6JY(Nuya z%Mdjm7IBp8Wa-864~tkjfsD4$7DIL4e zj56nEUbY6khlLqQ+G86X`Ee19D2SYoi*ChFwDV_v;E$?h@O}Yn8gO$BMlZ};Qgl0_ zcJ$+yhHg_)JE`Vc2q$ygSyZ*VEuOxHv%L)qr*1)8iCxQz63MmQ!*W}ropksx&v{he zg4^j&>*jQR;|cH>+;TntwCF}|l`M=W3#K((gAkR=iel-5 z9Y`GFl_J(s6nX9A08-+0um}!<3H4RbE!}4~Ca++aE2?9$Ssj!CUy6z}wBPxb>aLC8A8!7o_(`B3; z-Nir5{n@iq)*v~tl(R)~mItRFXA9Q)aTZSb&2wZmjYllzkHs$VM_b^}^^~_q2@pBp zB$bNbN-(cyPG}%}x<>L3cUDyb(d#=A^%(@Ttq2MS2j5E$9AV8&8CWX(cIv-f&P3mO z)mDX|%mm9`kp19-n5QH#HPIbuiJD014t2N7*M2kJqLs3{T&EzMWwnH?V{rz1tcLJITaYPVojn11s}d|sN$DnD z1T9zs%OTM;roa7!kr&44Ji8-W2(Qev=k$7mLR$0q)c35F#`8e}Hl`CPP-`ncy%>8||n9 z&S13X&JKyPlOI)`JPrbAx=EKJkbjj@pHEn-h&cc$N-_mI@(K!i99~?fzy1YNXU}`; zbOT~DSKC3EtBat_)k(=!h@ZeV_8__)55H5YwpPL2Le*AiQhKPTt?2^%drFqR^RRUP zA;r>}zhG&}IS)(Kh|Mf*0X3TWtZL@4KYY#nhhk7ERLl9H1T8KZJTFeHE5c(!?Q*m? zP4D7ng9k_Rm$|6oFizOLkXnl)45{sU-8WIZ4WIuEsfntUMQLO?dO4yt;ik9o&OC%K z52ThUhAt?wQtAne4_b`aEWt3wM*V=jbP~sxW$|j5d`vC;3Q?oG;AF%?0clhMCo2gt zh&DW=yKbmc2Gfa?*qs>{K(VJ+P+G~U>$YvTQtSrS!~0HG{qY_Jy- zmEanyE?fqyodc{!yHQZCCkEB1Tz|^vxN)MJ6LFGi$|ALafJBiwo2H@Yt84d$elASmemB5|287NP+T@<1y!K8FC zV1q1uo)2bhMB5QF6ftW={~NwYq`*r!X!O8JQiP4ERTE>N&K0%EGw;5Lh%D=@l88?1 zpJn&MwMuqRm|9g7*=V)O!h)qArY*3ioi!8NCu0I$qb6X_dsGm|W)?yO!pgetij`Ga z7)AHRTJgDDD`p;sJhAF&d8$xn_N@mU~9c z8b$wLG=)OT7`6MsPpXZVqv1#2X!uddm3KiFXSs44%ay4<*1le8utpV#;RIW?py_O% z*gi#%7x|wSH4XI$ewcHp?u{6a0M%4UeB7;}5cOxV(zvHxTwAA-uDaztjKV<9NZL3N_m9LUCCyl_$}_~xuAZCRMjhzi(FHQCg!awN}w4C zw_#toX_ee89#c&G>ZzCR;-S?=iC9slQGO`4VVBFSvSNnA{{i{qr#wG?2wp50p8SjY zSaQKa1^Dqa$`4Z&(ht-aZ>J0?%mC=PPn=eqo$+!;QQ@c_fWR)$g3HB2E2Cj$@K;Om zSr239;KjA#j6kjU`t6tR1u9L^+|aK_TsxLH>3<`Z*h?1Szm6haha=zr+ZbYh$@~8)dT2)p{#Rj# zOMoVJwi?)>6hFMcA$PO?2Z6)dy4~?JkLAFY*n%_&306oldaV6HfAo+`epU1^#Rt;w zTJ`@IZpaMNtPE}^KcusX?1wj~wMdNqL}HwIe~EE6r*WA|l=%y!P)=V4PB;QkU~-5& zw- z(jZrk78=2YUvpyMR(Itgi$gs?*tye>#_qRR>Z{kNO0ZKOfVYb>oIGI+Jwr)VNyvdXiIuV-PGhPOD>dTH5IY*WSf8M;iVp4EcIRd3xU~( zq~6v>F?K(wQH>>{e*P)goyP`?K7%(~fi3kH0_hU_qT2`GU`Tw;74CIj^lCH))fw`O$rcuS>7bNAFo z_Z4U)D))|nMImV34(}4S-w|Ny%76N&AJOIqar$@W~fh2q@J!3FA6gUyOAyG6QkIMKANn}=}@vjQ7zwgCOJuVqjw2W?Z|X9F5+!2$YL-^h@C z0UWgCTj^LH*I)|?&`%zbt^^Jlb5wq(HQ3;ouN*R9tv4VnK;Q2daA}xwv}mw}2k3K; z`SMz&z9SlJ5dr#E<&Y))O?~4>BJo7Tuf7xu)c4lp2Ae%Vzc2>#SAae;h#4DRCLOa^ zp*T_aov)-b2|>g3HOhf1XcVA-t{jr-J?i^=q`^@C<5OhGgUX`h~9+r-p$Oc<%fL?Z?*dqsZR8f=LHdWCXialktDebCfkOA62z zzP44i|91I1qejR?sSP%$`p;30bWZf8`u+~T(-_%}l+n2I^v~3HW`ivyK;NSrvJ02K zE+aV_Y^mt4%F&inY*gP#4SfIp!0YPwWse&%N+wBcu%+Qgl%thQqQ24RfsFj79341d z!DyKxw!zjUKwqsKP7e6V8<2roQjV4!@Xi>S0zEeq%(DaKUnfgnI#vc{H`uaJG0K77 zk3{c|lOdJ{TT}FE<@j2LTv86O+zd}NkC)NDl_AHJ10%S3fc~p;oRcAkCdg>A+i(9m?OV`L2ho8f5cqrl-X6NZ|;UU_@Vi}kdg)RJEXyu8=#L? z4i|Iqsrr81++e#7GtUPynk>&A^_|yXyFNgt4`qNHS)Z!!4h^=}`2CZ9A!9z0v8Lkp z+XU#9pGcSN1)J1&n+DqrSW-Wg0h#>!@2T&l=+bS`375%`WDaRi-)oUsI~aRdDMPw& z$R+h%sWl9XUN8$Iopo=P33TGzP$XK}zwmjT*Q4Tpi4yf<=23uDYKsg$7 ziWzHVit8J2i%#F79O_5ZcW8sH8wQSY$YD^vPNw)0d=0x1OM-IB+8p<}401NuZo&Xl z4ms^^Rp01m{~uvz1K;KJ|Nqa2QCq84ty;Be)v8siR;}7ywQj9+vosl%7ONJkrWQqN z5yI3Wgz7BjD~yH^#fA`y`3fNnA%r1BqyO`LZa%xVZ~gw~@p$gKIq%o|{XXY9*SW6G z^|{$-CONaA=b9R`zJakmhFR?mt=Ba>&H8@{a}HzXO`9euzhKt;59XNC#@R0J@_fUSYZ{*G8-BuU{H{;1>fO4ANp?K_WH$5( zQT&3gU^GnNl4myBuN2=EW&_DYdeCenO2wKNon#VMH?y%{M>%LVkfbw@nGN0P1w6VX zF=ngDj7_tlJMc}jKBT7Md0dt%v{jp$l|(5v8?Vr^DNJ5wYrVd9AA3pLF}5nI#nBIcp(d}e?MH|XSc?s$)n7ysM( z4ED(C%71-l_}Yg0`AJ;a^p9Biub&-_YJ$t#U&?3N{0)A;Y4S9GgimcP9p#TGAD12H zU)TGLe|MFCvOdngD^uP5Ca?X}+x-Xg*d%=qp8zY*=53%geala@?dRVUdDfJ?+~U)^z#pB*=X#7#j_XXPaZWneOCFl3;Ow!nwNh&ub=;=p>dZinU|a0 z`>J{QIlX7kTd;V^{N8bc`wxhXnmaGQ_oWNx&u1|&d&rFqsNC7J7UxGTTrfLo?xIaZhYWq)v z{jHmLI%(db81=~4gZ-Ub#YRn}J;N8xjp|mr+EcCnY%rg{Y4DwVTx!abgZXrrJ}l+8 zJvP|?{9yGq+BCI}zx-(4H-r7X%4N^_vE>7rC-~bp+CH^?g1=qU3A1wNEL=2yc6QXF z*?F^Pl}|}X@W0)xe8#v0|Aq$Y#CZw+Ips6>tIjxc-h#R1|7IlcZG1H^6K(l@{H^kr z7hRO#zocz>lO+lM5zm*;=$q(&zeoAh3lsgHHVO9m-ZXMh}->D-%Nu7ve zSXPCpAE}snjzm7jjrf_>2~Oj3o-gVp!cbX8LpCHiAm zO3b-v#V&>AYLFuKo$%Kgy3`|>?T~u=>f8MPw%Z#0&^pd1_UpHB!GfiWmMqAhH-Gkk z(F?8|?UMwC+TuiiSh6%>6c!txuBX9x%D|)Xw%mI2g$Mg$ z@X~`W+k%Hg^*Mhd&z6XX`KjW3##x3qZHQq)b#vV>8)Y3)A|ydFq`(ju3R3o3n_+C% zw@GE6I>g|OXey@Sez|e4vVKV6b1g;GHCbt^N~n^EQuegug&pbuE3+#=*HT9;C#!3ieH4eIiVPbeIh1ft2agPhmX+2Agf|NoGE@b^8aEEuA zU7yZ!hRR=(=pU)a_a>6jZDYxgpuRyxPkn|~njQZHb_C%Si+)!o^8YhLl3;esk{#`2 zM~>cMI$>k$VBf{Wn#nP{7YlPXw^!TWO5`76Zoewg-%qvUZ=TL#64v5j4<3qmH;js@ zUFGnWP$4BX!u07}TzdO7N0lv2^mphpZ}ez$jG{1<10bc)issc5U1mf*=QvTWM|9AN zF87L57EwC)xx@)}dIZ^ROltGJ0@fF()a8l%!~4i(^mPwuT@aQow=%0*SWlH_8#K#> zD)NYGtmuk*qD8hrIZkxQBT8#)@>}c`sYnm(#%bcjhBZ`bPnXRlRD$obDlM3e0Hqi&Q+M~+1s#Wz=*J)K>ZJ&mXYf7cHzrLRR zYE^bE?NQGYrI}V0dsK1lO>Q^TQ{AXlJyrVZM1Q01=5(m>=nAdwCa+Fa6Qi4Iawn0x z${?MNmCNs_Roq-hkxp*iROk(f{uaGVl${>U_zot!TfG|A3su;PME_vjnh0!Mj8bcV zTRr==DlcHa)MM}KXlBoK*n4NsB2|ffFWrWN*vl*{CBxdU_u8v{*v7=_3BWWV7BeT= zW+ivjkwmRT5~rsCBPsAm5~562cX}nP-=(5B8r}3HFkH9&fJaqmRd?4@ZPaavRs{u# z{svl=jipPk%Bt?Er@B{_Vc$#J@ATNmcQU!%SI>Tvi4vybwvI^x@uwHDNQ;FC#XNN}>*V&}EwVvw!E!Vl$G{nTEwc46LP|v)?wnonZ zCb#Jx*+DCN&?{5vgougLGk}qlc_jR>mcC9usg}i<$-su&6E zZ7G>OjHg{Fcf$)Ho?Zl#PSl!2et2Cwc{--nNet`b5lh+K(>N(dQ~@u6IC&Yo>0EP5 zqQAGg_cm^%)KJ#vYp-okyVMHtSjM)L$XMg`6};?$S3$hK2F7bDp1P~1w2gYEy&)c?g!VC>-a@$#_JeqO z8)`l6(moU#=Oaz@Xr%=8H9p=!Qwi^a`1mi>`sl7^t|gm+a_H|y={%*fe%yM>#M1;+ z@4+N+x5Eci2-453DF~XR+EN^2M1*AJ!8c)FOLn@z`fr z`;WZ#Y9Cqk>>0Qfi^a%gwap4XsUwIgLeM90S5@E<)L6l%UIFW$*=7Xp-wt?0>HSPI zKCdULQc>&Oj2eTD%c{iMe^Jl=OB1AL;I3-9M|9kZzVeDx9szpx3Eb;ddIaP9o2d;YJ*k% z;8m##BE+hKJD9BXB{d5xm)9|?_|dCi{U;r#hmtAY+#XhVRGIN6yPxZ+s`s~$VwMQL2(8T<$p8A+p_fk#imoVKUM?I=StNPumQdJug z`SOGJ#xET^m*+97`O~Xm{kV=aOvl*iv7bK3WcHWWUX_whiYn&ztbx9&L}3+(Fxbo~ zCs5SDKOl3;zhLH+sEvvKgz}2J68&AwWS)$q&|X`LaCL-jDN%{W)k&m2cKJbEox!r! z)z5lj+MH19BZl>Gv{II`oPy>|HqU42UWNy$ye%>~!GRMy1}v z#jv+bWMW_9v5!eIF&cR7iPg}?klRtw)Oa)%Ruk;isA`F!uDUnTKS~eh46IyM5y>V> zBd>xep*D)V7?mhTJ(@hLY3$XgD*X5DEt8+vkHW^q*lX>ZdhLl3W@E@yCYntiO;n1> ztC?4$itdvbGGB`QF^~OHYv00aPYiysQXdhSm_#!kJC|3b)wJ|#RO%*)Ay)~pFY(yN z3^6&$g9-0Z=RX$f7&2RmrpBWwu$nerjjGl$WZo0|3~XFZN34B2uRZOE)G_)DN}Mo$ zOzy&2`TYisMoke1r5*?4hnghYdmX6a%{+cpNu=3W4}oy3T*#eP!K;%x&5F_?&GU<; z9{cEFCIUC|b?iH^M_Fi<+``sTM(aonQS@OtzjQ2Je#fnf z`@=e_ZaSXHZ>PsTC)MO9cYxl*6l0^DTb$^R&{3kXbWsjkmE7`qRXwe0S3tGFqlzDH zVsT?uM-{8W?q|lVeK-|_p$k=HMRL#N4b{hr0=G3;9??-N;wGeyD9(s_1|CrD_K4Pu zFzInIt`(`Wtuh#flHh1PHAi6Oayx7lT)RAqP;C462|SqE;Sr>cG$EMYYXuD0LAEi0 zyP+@)U6f5$BvZ1t2NG;!0yj6g9?@|tV!o>tsjLSiwZJXZUXLJSlu3+s6WrD0H-m#3-yIO113?+(#Yqh;pom<5eqCl_k=iz%5Y% zMlQ8VE1-$B0@^c5M~PFrA9Ob?8$7CnF(x;5)lrQxs`!}+BfK+;p1?fv5-UH)D_7No z8mMmjPolrMK9jPsa%qNRDi_DGUIp9ZY?{YWwbrUikE+0`&aI~!Z&f)D@z6=DQn7Tg zs;z25J=H|3I)JLR9^|DSRaTnGaFSQ0im@G}#%$y5Dy@jb%EhU)ipg~pVc3o`cPv^_ z=uu?Q{3%#xhytd<1*#gw6n%Hof%@HCd8EIOqf3+SqLf%&rqx{-&~@!)9$JZFIaW?_ z%qlLjifJB&d1fVweICW?aVEFvRxv{>3b=Fau96?2O{V==xflnm;$o|q>4~AI1#=zp zD55!#(*7)~nB`IEIYBFGJc@j)xWp8jo${M3c`V zYr9z67C)ZI4=m~j)7^BV4|^m9R+4WeOGL6|yS&$W5x zipJ&~U#VMNX@x&O?DO@@3G(%ai!TfE&4ejSc;`1S$oJX3e&5_=zi$rvo_^c!`#nF% z*M5GGPc*`8_E+#uadJYC?;v&KSYF2Ra*(o`vwj6htb_ts1=j_uYs+|RK;C!sZNuPJ zb{4{Iuol)q5v+#wa68-q8{lTR6Qt}#dl&0>!$!CV?uGk6w3}cvYykzLEe0vo7Y48N zZDr$rcmPV^LHG}d_#xN^55prM;zvPB7&BBU>yN?XupP?a2@vg*@D%KTr$MyOfRq%p z&$7Og_`c^@c^-DbZV>Sc@FJ8$1&H`1kdlq~W!7JTJ@6{L2Csu?_re?SCcFir-3L-u zqutN?+wcxl$}xEt{tF_04-UZl@BxVULy%I2_#o>a!N>3k9D+|lw4cG}Pz7IrXukw0 zndb%j`MmN0Tzti@!|*kHBk{k5BOpG$gYV%7I11w9N03s3_$StXhHCf)eudvaw8!9g z_yhg~(H;jWvD1Qmf3f~IoPZkm2Uh;e9}%AfUkERt;S3P*nJlGbAP!>vEI1n)0H193 z1%qfqST=%CXbhrl!cxj|v`twLgJ#eiT0l6UUFmDdN-Jm$5g_6=ETxnnZp(T*h=lgg z0Xl*Nj$+vfIztx_Z8S?Md(n1fy&H6g80Y~#LA1SC#)dHddb838MBJC9lxoCrtoMWd zFaY9VAc%Mn%fXNUi6Gh}mQo_82m6v)Pk|vY6ox@6h;}&35ik-)t>ll0N3)bN3h@}$ z&w(@;3*+Ei5b=1H6JR1t0@0?kl#-2hGVABT6v%+{VJe9B0+yL@AzTEaT{(>vDTRoq zvpxeZhMABBvp~d`u)GwqVK#_(4ofLzXy>w?1M}cAxEyjpwDVamfQ66;qP>D8Wu>oR zYOwDt*8Fe->wGLpbF1Aibwzf+XzpVDOqOTBJ*>+d%V&Okn^|wnvJpJOdJ~qRu#NWl?Ab-nB>F2>W@YlE zo&EgUyDx`z@gw?N)@?uEg=Jg#IDyG!oi)-QE(crRIP7-2S5_tZ z+tO8HTV=#mh|Nc98ZwU%K5Q4^&1Y@&jxDeIvAGH}i9lzU zXLjVVqpjYt(d^j3j-S-_D@XbH5oqpz{!Ibe&g2`i;76*Gc;`7EUz zW_>8jMGWS}GN7f*q@ML9a3x%2_s6q;DeKGNYPbfL!?myir0l>(rqBXdW%nIr-*v2C zAL5Jgt!Cv0xDjrGH6SH5E7*54>$kwIAwIS0MGjeG+p~oi2m7kCQ~~=&=muA?V|Uh; za&E{&&BzTUNbW4zvp|3FX%*Yj*i@FKGgScvvTZ{cqvK{E*^ky65o z#7FS=D3rou@HlK&Ctl-CX#Mfb`Phi36qcJnUhcSr%dmX{o`fj7|0&jY*!@qll!;U9 zpMhsV8n_c=a+Uqh!Sf*dcfokOpAL!i?Y0#!u#}R2S+MU#*2@{Czr0@m19<1XDV;oj zZ=(MtzaEHh&ojAa@Dexovhq~wJNWfSYzuHCWod4(?{ysR#o>I8l=l;T*J~dWv5@vx zUd~LBt4iNV^ry9n)7`k5Dk*#C2m2~<@-9v`@2hq4IqMH-CpTjuPJApY=36KIw37qu zl5%W8uqk8BQA_K8aaGdsf)OxMVGwFSg`Uf})Kf+J&GgQMb z#%p_>bC`O(QYQ9!{58IFa6!hK*wM44WPFGnQsS=&_Wg?fH}wg1?eu3PBiSdVl;tt% zeuqEcPdE;Lsdn!s`p@kmey+ntx@0=b603_?#K)hpJ3)7@!m@{YlD{$S#jYBgJw4^N zg4;Um&gL$p0W?&9V$*A?*d(yO=vF?6fQ<~(VCq9ahG`>~-V%||jSBl3LlbBUVbBbk zLkkFRr00Y7s_4NXeEd20J^7GFd;UJ%LYi>-V$+13gbm9NR#p2`_>^VQ0X}J=7V)>R zd(ipezA^%pv5aOZC1r_OW?mWWYe|q+jeM&8`)=&CS2J0EDqQ>rVIj>bK#|V6dg24d zjY{KhTYa3f*(oLSD&wjH?m9vgbb`*%1)`y=X-h}#f3W%`KX&pS@6cbs^=9}IZMtCXB&!M;9t=nHYs5BkFZh=+kN$m_j@ zn)Y#`KS_o0x2I_Vu8#3yS-td8qJPpjeTL@a)(r!hrU&CjhCu>LH@nI3aI;$?>r!H` z4)!Ino(w7Kb7FKHB*!3({Ricx0Ob(tL#Q7L!ypxg!w47&qhPd4dCDh={%JbRY-C~A zHutH??CPjK;_tvta-5G)A?3(5=GzNn(4PZoFjnAaL*FMC;$KC{$(cXB`jO8Yy!#91L7eQI)f>B^XBE5wY}E{tM;VRCM2DZ zli@s<{<_Z-`F_i^&v>$>XR^)LnlX83IdjgnDwTW3B0IAlpi0X0mBGGo_?W`LUjJ$B zz!p~z=?QD&ih%fbeZ9;(NT(s6t|lRH*GrSfqhHW-+C?muE`EG}eaLIrC1v$> z#>u5P$%ff52j)T!%!AA7wr|*1&Tqx4TECYL(0+^Xx0oklQg(13bvgQ6m=6nJA>@G+ zcY(ZuZFhlOWb3M~#}DiIumrAztJLR*x%*KyU(0Pzb8ZbH^yAOf*vg@nlEJWBitRGE z+Ul;+x=DIiG^Ab+iVXR)jTDJeGu`28`Dp#$-}30b{Dp54{eFKB z$>(u=NDleEzeU!_-(3V@HwF75NL1!>If-v2h@8ZQETvT49IX1`zx~-8 z*mLLqhHqNF^gC{W{ra{ldkxb>QFHYj0iu*tv?xFRz1(8yF?dv7)KfNc0l5oz4d8Co z@hBIpv69S{?3e7*Sjt64N@yWpw!rQlxEKB*x%*gdg3Yi66coc&xL^BgtM=oyjs8f- zAw0RuS_$4Bz^Viug#W-puniuDN8nNGVc?I6{^1=ZuVtttuTd;Fft2{$xQXZV`-?c8 z^c`nARZ~5Je@XfYx&eCF9KtrfC)3fp?21-Hf8t8pMJ`yg5z7TDm8FzIyNu$s@Y8Zm zW8aN$mANl&{6W1WaDZjRS{3v&)w5(rEP|s`%^*%^eK^j_X+s4_=DT?nCPiM$y~Mtk zp$o6&y~t4YZoh(!9H=hpR^sd$Dt`K`GYRa#PcG|HDvRh>Y+r@f;C0vwZ@`=I7VPs5 zn8vECI??~DzVJSPSQ=1@v%RdVtyJZz&c7!5Gxdyph@Gwk-OdwPyuA(YK&845yX1C~ z*_Z2$qdhEZK+3jXo2&WwYt!^YtPjFR@G%|x3%d4d&~F@wz6G&izAxGT6&!}I;T!Pw zg{(`7ydzk3Le;YIQ7nFhpWtV;oqgxDmWKRAj^a_u(G9$OBHC@#nz7-&3sV`HOU<1 zg_CwE=e%q?{4xhns_zQ+ox%E<5Cmtz+0XzQ0$;L5K8+|Iii?uXs2g@TMMV8_r z7($@F2eB!Q-IAe(@L2ay3YirPwwB>1Y;#R=b;qrtEYxei-X+ z#&0IZ_TZ#%4E8l=y9It^axvKXz0aWs~aMGcYDSeFuck9h&v8bt)O0eM!_ z4kDpFbO^PtT37y+=)bCqxLAW+UZ_eA?of5aR3^`;P;RczOybv)?!~@?I{$CJaG|>) zm0(WM32Ue5%(|S#;z{;*v7Vw?x`QtJyW0KTSUNv4NSvSU?3a>%FRw^h?*TobS13>M zVp-{}eju4?Q{~hdijg!WoMkS^(^W}8UaI!NwlBnil#KgKFZE-)KMa6)7zl%4FeG?; zsjZq?!}s>oPI_R7zBue51U;r^osq;jD7CRYC5eaFTmCJvz#e z%II*%RE|*w?UB)OK5nEBMs6-j@;BExiBqhhyD5Naks@v?lm>@GD3ueJ3a4BTN?7GLtbmc%Y>7@P3yL{Had5yb<9a1*k zZ`wZxA9EoG=D}rfIpo58ukUtBG5R~}V?R{;4#LHz4XS|M=jpMxjU7_tEL?zoA$TWV zHy~szy1|`?jg-R=1pBUFeGx1Mxy#EBRaM;Pby8!4lKe~bqoj1q+zno7Nw9B;n8H=C zRDF&e|Gt1OTtb};h=wdnN`n1&mfvw!lK;)KSB4Mq`^G%X>+cD?Z^!$)5d-|bT@7nl zHI`(4m9vKOSg>yyj<1GmU^z&MW&gFTuYi?MVE0dF|0>q6gX>|n-M_*5xgpfo!FMA& zZ?YA8ZN(b4Z-!gc-=RtVX?pm)P-Qp$J@p-FvEE@0&c?@i&zV?-a2u?Jbx;KB;dZ#g9e8s`x~55zf4&(`h*$rvPO{?? z{aU_+9a4^NXE<>VBv8{ebPGNd6wC68h$N-9`$(ya)1h09<=Le zEUQ3DWm&LVj&)bhgTJOKu4)+ns9k*J>P~vF%y@}rxwlN6BveNmYF;zK>gQjFsFYIm zglYLB-lXun$^EI-O@%Te$$3!R7UARc9cpf)1M0VJxNoa zQg;!w<7qN(r=nUU`Pb{b`=XH6=RFzh%Xq3z-oIm%rTaDqBVC>j_U$6)Z3On-d3bYf zrw)ZD`B&+jV|V;d&iAxT^5!XDX%)Kq9nm_;zfJe> zQJhKHxYKmRejG<2{ofvLt$NUvv1$)Ts-GTG$Da*!!J__h>XzU{%8}=cv-j!Q58y*M z2p_@6@Ch994ph@0E<$))7a-&U#hu~8uL{L9ITcZLLG9vHJyn_2%59T<%Zj zo7Zw_WWrHY?{aGzQJ&Qy$$z1Lgrs^DH{OyISCsNYvO)=Y<$<-xw+aDNPb zhdQAs<1OLFka1wlKK~$1|(ill7 z85{8z&hm8r{PKn*lzZ!uwoP2csA=rz+->Jey!nb9 zKd$Brh7f23q0ktbK-0$dIi@_9K41GtLl(P9b?ltvAKFXu+`|rcUGv_wg`t;{@QS|9 zssdbi&$A|~I6BF{R?T6wgsGujll)zDfblQui>m695^nzIEZH|unagl}m z9>ZDY_ZU z#M@s@RBB(DF&;x+qAvi?;6jFXD9dASs`6Oo=lGfW?yuonrr$F6nJ7c?HVjf>IE;Xi zFbYPWD#`?$<>=f?ab>+`IS8O1^LbE^@OTmb&TXXHORthR%4&4!EU&G?t!9``*Cwr zKA*q48*@AAit0X${b~k(kEr>n{J2dkX>3>(j-N9#Zp;^Qwy2R*cJ^HA`E=p%B!7bH z%ipQGEqREdcd2#k7}rY9hlWdf2xyX!0LI0B`0oT)35^bkG5ZYg=+7{}+~d+4!A_a|!+~RacXTds1Kj81(h$s4(=Cweth$ZD*NB|0Ot*68nR3 zco_~aS4}udr*)`)I9HNN<*zvcIo}7IX6j1QCkeQeQgPI{UWDt#kPl1XO1KJ^!m`u# zNnf>cLfs=!gWJIImP!+CA5o-a{A8kCjn`{nIa~`XU?mj5s#8Uao5+o??xdn0JrQQI zJ6J_daz`Kw|5A?pY~oypzw6bT4N~!a68|_080<`OE`b&f`JiV13p{U{>;u{^26u zUe<5N><-ufcfwt8H*AD^;9k=+?N!-YxzMa7_Svcd{yOM)f%9;&rqZ}e{WaKkACgV5 z+2*=xjhvxtuy3g|uEE}AyaD?y*eWOn$#`os^>hDJ9+Z5FBwWA7%)!iM9Q#|a?|#f4 zfD(8R{sRxeHh35waTyn9$TW5cN6l336lM^e@jl$SjEiyiD3Vfm%+tGl)DPG<*YEsf zVdFBcX8mz&w?i37#!sjwnRKyAAzCw?@LsH3!mE$*S_7-6U=6P|^NgiW;7iPQR1)JoosY(8L`C6#{lAjEPomjavQ-9|J9$1${1xT7N=`^E;nD2<_ zp%96g%d?X8moa+<_Q0#~8oUmB;SG4xHXX+opzPB*j2m3vFrs!@A zqSobC$okt@y#tl-F8tT#XTCF`^UJ|(brW+9jr=p%_a0^k;C=W2K7@nt5qu1vc=Kzo zF1&!3(>lvNIC5DQ;^+{@pTcLJEaQ9gJ(WOjreo!@J;?g!SXaRp@Fjeuv+b@A_YUe~ z!c3Yu$9X4>`mf;|_!f@9ckn&@07vVl`5>dmq#1_TrFoF`A2I$3e)guRdS95t@1V;e z--L}zGWxGzm5!&Dsu_RV57EDRWv=t`Deb%#Ccho5|BlN);7>RXf5G2y0&3u&y7~P= zyr>QmZ#rU^U-aL>zJD=33BKlPJ9iAN)bLxm!|p#jcga}q$UK6~rJ0A!&n?Fpa3;ve z3~H`^E@ZMCZiO=KNx1RYy5T9GFh2|Xv!Ma-yV1U22!Tcr3XPlF7gbTy7@j)gZMbk5 z=i{OYW=$c?WxO8KR6Q}pQ|+>>V7(b;&7lQImf_7+Q+l?I3Y*T&ygu-oFmnlJ)bN=M zOj|)~h=4ZG7TQ51w08;S;bOQ>@Hj49f_rh%0ke(}WM0zYM1LC z)`w#@0!D)5I!fo-Q56x0-z&C*brY5@>r7vWZ#33p;2cPUu`mwKh4C=qf3t3^HsaFc zTZ227?_S(ZL^27|UA}Sw=&K@TF&6c>D8$HR9qteDO~&{ej0c663a1l&{=`h2k9d;?Hs+Ti(fz;8Qt*Bkb;b(;SF2;H$WYx)dK*p>E zIb#`>fuV5_ol86m-7GYhz@;DqI@=~b!YN&kr(o=cbT#X<5zK+PkOTAJGPoRaVZJwY zGd*lX=5o$DGsL$5vxSi7a$ZF%&7D>>)h^9a)~~>95iADj-+b4<{~!s~)599fT;HYy zh4_|WdL>*1OJNyY4cEYOxHga=_e^coNgSQ6mS@w?O=UVfj5|qo1y4jG+1ph;$loZ0 zTyk+gm@JCeT5pr@U-z}&fb@k|nGYK8#Mm_@;w&S)9pN3W)mt~n6ZO2=oJjiQk#FfZ zLADj}Zk6v&CzvdPE(z}A-s3&?rPlr~?C(BJW)m0Yo6I(PgvYFKBf@)5BOJaU+X$;X z!j!X3lkP=$->HTDCoQs{%Z|a=HEp#OZbG>E)WQLo3sK6^$nyyIS>YCh>NG;WR$zPI zBaCQZQY}Wf)e6;&x%{wbPl+Mlijw5+r}_aX0V#P__8{B;v9b~Mj`r~EY&p%$l{C{j zdI-Tbc-T7HYaKnp_Mi%*slsehePBvZ#h8?d@!r{U7lI-=A-YKpOG{f+yiA z>u9NUw1e%ZUHlgU@w2S#8LFR!omN(9WzVtw{AuD(S#n8j`*&JLyAbS#7p$Y0VAGHn z*)DhS=g)KP52ISruAurQc-hJdtn3xG_xvC61MSbTj$TFZ8oX{D9kh=2vi*jO-~KWe zzrxDir1~w`XJv6AChh%fzkQnc6PD!Gwm$-aG~^uwmGG{0w8lF6FWc|A`1=F#^Q`Ou z)$hXxR#s(YAF_S$|A-%G|6c3pBLpAAC)QCyBh!#WY=7$FUwgT0e-zb{_GeUo4pmlG zWMyBl{pD%mkD7O7ZTpv6M_(a03}0JEN35f7*#6eV@15)7S6bN-s=tHptt>Uvr2PZi zNB@ubf%eBBkcRw-;3xRmI@-;C`Ayd{G#8g3fi@Q;fj0Ck!Lko&&6R z!8jVaLO1BH-o|#CJ~A7qmzLzS+y_!*>1}~qm%4)Hv=|>fpeOW#Sm+IXpfALETVn3O zVvxBuRI}a>v;Hu^+XnLhVF%SN`=z{`jmK;t41(V{8iVc8SkL)mMppt>(uN3@?gg+c zUEbcMv>`e?#Fv1#L`Z^UNP!_R6ox^nw+)dhE8iWBeK>Y4*?^|IF-j)oIAHdVM zzB;i?>|B!~TZZt<=e+R(W8fS}vrQVf#5L&<3Te`Amfh#*)$kf=f6+EdXgM3s?uOEsL6 zK2m*zl{qX0xRN$xvD^t#Wa;wuE~PHFb%^gG!cK$fFas`znUDpu;F7v+*mjj`LpWmB zhC{4hig7l~uG@yVrS2pt#>llHJ0iq42jjVr1M}cAbuqT)B#EY8S`x%^I!KYFw*_up z>cZND_%6psF3g7oun_X#3Rnb-T}$GYxu+OAap~GnfQx+0mcW&+4O=laC&?(PUG@#z zhWM_+Y$+^*tKk|uqB>pej>cXT(uQp;^*7@sQIsxk?^3FEP`4aU*TM=|2?ekUu7m4g zwQGZ!f~yH;t}4?JyOu<^3-R56@r`hkYl*)2$*&vLo+L-mxF(gNS%dw}a0}cDg|;m+`80dMuzxq!_!(=2Su-i?#9zN5vk`MGH$>UmSOEoHY zVJ}9t8S5>epcuBo{qO*kz=JN|3IdzCHVv7}G^|62??0G51lzosnqhPRQzz|393kFfq2rjNsRD1#^9Nq7o&z|-CYBULo5HDja*u}d?vV~Fn= zjGu*_-ZTfOQUvC*7KxEdwwU$jFn%6(fn26{dy)-Gaz9vDfTg=c$3=zsUcmZAD2EDo z30{U*U=O_N@=Y&r9eNNKF4JOMyoTB9u-9e!5~ij@v#EAD9%20r%-)2zKrUYUY>s8C z0&mpp#mrr`mUas9?Z@bvjh;a%F^uVd*YO6|8@Xk z;cJ&~6@kqN%|Yfejq4KP`v$Xb;fTw0^7VA6e%^HqQ_GXUNSVtdfmEzq&U;z^3+un(1jt!cV{-1M@8nA`aOYEI*AU-782t+; zK|Uz#hcn;rrM>sll2~$ z^@Ls^y&D^D-vBMRnXfFH_iT%>b6uO>BgEGm+dj}2;-DY&hXD`|16_t@Lo%cP{Fmv5m!}zp} z_~Z*#3@cxzH`#bM5$GWohnY)yC+intei2Lq>D=i$Y4i5t2I^g>ru7c-&A{ejm^Dw>) zE(ht_+;H>h0u@%|y;Z3~=DN2C*?i0wz(UA_D_{{UhJ0A!5|&RGnDZ$CnM+lELFr1& zu7aiBRLzB852h~3G)$Lab~RiB(v{1-N!ojr80=h^9%TJmY*)ZaD1cRP9b6Bq;RbJp zkt&?#noDZ|VwY!HT!`;RjBkQ9F3%^{OP6j!V7fFEBbRLv>o;S33)~9QrG+lr;@iDl znun?D(x`sitzy0w)`<+(!|iYfY=Apm!l}eJUAh++F4ZDj+=bcQu+f{U>Cz0UU6Kb` zzX!8>;XaTq-Q-QucIi&+T$kqb=l&GiEuf$nw!;1J0F=Ok-V7sE3C%TK8iv^Axs!Ey zTjM_n9&&m9g=wT7(3_}sc{UtiOt)eBurnQdhci9uG0n85k6`+!GrdPl^;7p0s>N$5 z)sMmBAZ3S@ZD+g8%Er`v>OOGFlKC?e%yUO`ZP{p@J%Q*+c*;5pi#O@+VEbv8gS?Gm zT6WCJByN^9eFoEKovFM zFM4I+@_bKESVyh29Fq!o$x5eN>C0@t;-p*ebP-2UEy?Yn`c-(%%63@U>um3JGD$RC z|Azp%DsQsVH!yh<-m=oLK_=OKZ0~o{$#=PbEwI`uw!d)Nmk4P_YPOYqN%dE7*vbxB+1G4;eFxfS*X{Wyh?n8{6HjEUE77JZQq~Sqo+klFue_0QE}- z>r4*ls39ij7##HYzZ@iZ9K;}!Mo8IU9rVOOFPC_~Elh=d+&?{7YRzLY=?#5AO0|{t zWjoF*HRt&OE9*yfe;8n8S$F~Kz!7SQ!yG2Bdj>ribt|Ns;;;qARdpA zWIYsC*@3Z1Gw#U{LM-{uYORabuM(4tKD~?SyX-{B#VqI}TKpcvZM4p6EI!w0W zLMuLx?J0G|RRM9X6=z^{K1{XZqgH$Y+nII6sasvz`>gmvj4py{Ry=;VNqaimGwO!M?Crdk(UgB~;=n;$`WpcR!!6GNP z8B=pjiKSZ7SWI<3ECDH{R(2)ZS2@{t0a>AyEv0%HTy15cqfNAH*k0~rV;^+Uj#}BZ zRIh-QR+ejJ1#GW!vWEk*@l;Ea*HL{vthTa!R(1p1H#%AHe_XUuE4zv6HE^?)#f~va z-oo~+PBt$f3#D436;gd0thKU2D_h5Qk(0du?NTe=j!_vrVa2gyP1;Yg{Zw6XK|maekwo5s(bMpZ6&G6Zvuy9IE3OKN zbFKI}jGl*GR(#ZoceDLMU2*CoF716*{31r>P+`TR#+kHVV*6z)9#r>UVZi7`bIf&K zuA;FBqzO`rtoRkgdtBsBkIDz&0{2u)J@$vJ{j1o&=CzN|uVMFiOk>V9dA*M5US~QV z*TyuAYL`X6HGKoqH&4?9J}_C^gy|k}g%!Vrc;BhT@xvF-Giqu7Hjg-Tyh(CD;oBmTf8x#}_Z@;aJomt>JO{SecG&h*`YX}-s_%9?(J>Br8r)8o$T z9*=3zPbR|HJMsdfoeSkq52{mhxZgz5AF(kI#0^mD4K;0yQ?zJkN>HGBi# z!jYD~@|f*B&OAfEKYC~~Z`g#YVNcZm>S5WWVO-``>`3yDP?1ma$TLJDC1B1M(iN4x zRUW&Cn{U{$TT1K{@y11r--=!e%iwCb2A0FMu%eacD}wyilP6B@Q!dV$^E`1X*gaau zNx;99f(#R9CH@Lv6n=jnvW5n0QW}hpT<;?ybGX;Z4d>mI{x>uobVVqVDk=7f?NG?W5Wa z%25}Z@q0g}4>;3nF*Q$}qo{VK8(A;G>_PaCGkrhcb*aa++IoEm({0YQ$MeqXK9A|B zi%bF!WBQ0QU4?0sJ}aWBb_o=*{wQXp@E9b~?aA;s>qA&>Z{<^4?;hrFIZt7K6@8GRbmDo&KZ2~ zu;U^NAK;Bt zO4&EV44Vo(z0^u2W9A0kW{eB<(2d5Z>`#X7CU$jJ7rdC{pJ;|I6;d`_Y`T6gUf!@> zU+-1-;IvtbvgglQT6-y4ipU+1!>qrF_$}CH9ZalyDNf8-G;6`)yoHNr%gc5-CVLS{ zkz*o`WVxEpu*%nwrKHU?S?$N^+ipPIT<#{{SgKw8jn?!XOe>w~M`EfE&~k06PO_te z9{435ZCI8G^Df%|I_=~N7v`A9G|QU4hv@-lx;0=rifWfpnKgYM(+`~KF9FjH9@B_R zOadQbdeEBco0L>r@evgtdnXoL6`xY^nYUt(t@xaZDsM%#t@wh9FTE9! zmzu1;qT;Z(BF$EOO~p61Laln4JBKFjs$MfoIzp{vr}?4yXri#=BsSr*oigw# zoPZkm2mU=>?(@~jU;ZcJ&N-flVc!KJ77)Z*L z-n#8geu+s{%}9~oFp)Mk(k;x)(eXOImE>PH(Eg}dEHR|)yv)REfX{{y3?a}6LZLA< zIbAGsWU6sR2a0=hWcJ`wN_wvG-4q{TtyM3wJJpdfS$q0PAMZ7n2fVHu$lZlp{HNnk z%8~iTacdk$KpSWa?I04`Lx)o({lb1XoT6|+(v#kHNgrc}l+_E3?~eG0YOSWBI91Z( z>6F81=YoLaI>V_5zfz*FF#fyaKL&b0Pv`})&>Q-kF85Oor_4N0M9*-FBa)PgMJ8fj zJjX#l=nn%R9tOgoQ$_53;FQDZIDYB6a%uy^X&*79WagV#gYlUFiI4=zkOD(s=;>ma z;Z(FZ;NA?UY8;g?4^Ex5csk{9%3K<7TxU4N z;aAF@tBwB)@Sh16!bLC*ro#-l_;k6SayT8wGd(3uDN>%{R7oT$S<6ktnRw2ES#Swl z3fV9l=A0_x{!dRioHkygFUBK)YY}g-bdfpHlW*XMC^3M?q_KABs~YEuKy}oQ~s%yv1>y;Z%uV zDcP%y|C{i?25yF1;8rMv+hFbKazEv8+IYPuqGvee5lNRDO~iG0E`s%NJKO;q;7+*f zR1xQYd&=RIaD$F_lG?!R6iN&!8*ehP?#AavxCicq`(P7nhApRyWrkBFuINB>u3g&4yIFoR(YD?UBMMCdPhq;lna;p8Lf?YQzw>bkY-3#>uRM+EGw>|zgy-OS*af@Iv2U;Bw>lzJ z6^^>ehcCg)u2pXkJGQ^bbN@f`ptT{sSCH<3SDk#wPaKtTBCq=Y$V-t+ zN4_SQC2yUH z@ixBRX{~NWX-*d29MT>i!eck>D;(2WU)}qU%9yqIa`U=a-xDsUUP^qCarpr*KWwcg z;lS&1xOR5X>#S>gWO7@Xid4!TmY*U29I9N${Z2ln-#1#b(;c?B^&!45kbVhYIr+R_ zT)&4>E#-9bL)1&ZA4dK)d;{OY5%>A4#Gtsf>fGj=dfE!#9byrQ#^%5s9_kmQ7l>V zFTqHyyUw+u){}Wk6^&NP0qdhRJ|ZI236GDWf0*;t_ndC#|Bo!klx!CMMZYGPtBITt zRn}9{-6orkc#48f&>6ZwG<1b-uDxY{x?W5`hS!-jb-iw4x0LZ4jo0p|W1t80gkBH} zy`hiuTKu% z!>5$v*7qcQq;m?ObNy%9K8S;A`mY#M+ji4`L7R+^9V}%cy8s`V5$Y3<4|6nYeN4wR z(9+s$Dy*lx&BoJAJY~TwxCAbRY?uvmye&2T7l90~W>lMhi!NT* zTn3jzF3g7o&Z}wlW&gTXA27c4*p908oq$g%N38FK_{fV;P0_jjGi~q2z%~6>gsE+N zxAv0XF?L*qZYeB-tKk}0uHME?>oF@>UkL@U3a;}kC3Z%!xdXkP{j1>yxDjrGHE=WB zV%lYXlGgh+N9)Zs$^K58bCdmM>ffNu9qCx!rjn`&dUnntgp`D>=DzDzToy*yd(vh8 zWP3LkNwvH0O1qy=USqZv)>%`1_n2=hil|uctthq?w^MP4w_=~I*g(adF6!_zlKrE4 z%8iYmYAN1pLh(LxTP5$m9VV-o`_*;?o%N4sXCR2VKSZUnr)_i3lgxJOHtw-^4koT8`yQ1T zEAW1;THGkv|BUXf-B<)-eAFbFJEkR}t|bSNNU13`kzOQHxi^w&Nfp&D%BaUB${!)p zk{`*%v?TtqdQr?VNyk`9{&wSkFaF=~`j2Siz66+wiHotjOkym+`${!C%*80hqFzg8 zH*+o7i$uz?CrqUO66rk`>0-uqt1jag&gE0~_O4lvgG!8D%+#kO<~L1~{gt;>B-rB}U9iL0)do{VRGVlGD@?SMmrS%KL~B|%+O3^jv^P_QY+kHtMaer*hjx6~rX_8>*&rll=?y zMJx)L%Q;@xUZ{WFx|;n`HoXzz>yOI;ZPc{x$=tox{^#B%s$hiVGOkCmf4e^C%l3*h zHECqBKU(kRpN6tNO{tz-H1&V1*oHqTg>QxUlH2&y5%Q_~OZw9Mmzv8R%?xbhq}%u= z-*b9PmD8;^tL3pAV(n@p)lxF|^D7>>swBw&x>}|RLQ`n+{zmeDN!w@9hR8YT=g#5m z=e=zS6N6sDOy3vcOW&`<+^%1@Wm6#~;T_Yp6X=JDFbUFOGMoofAft_bHR%3pvc3K$ z%aQ!D53`l-pP09G|H$?CV|_l4!n2gzN;3@4$J5k0!!XkGPU(28+&Ij6SH|HbxSpV@ z`pGQu6Qg#a4pV|1hv6M|uhn7lF_v=tzosEG36s@EeI9qJG15}qI3Ss?ajcl_{KX@~ z-%NHJe?jjVe`^jHe{=Dd(?%`qe`$r;&-NeE;Ri!hHJQe%@;l_zDcF$gKVMs=U?rvIqY&RJyyv4oz4w`S(tI=i z+RsZrcV6xI+lOAF$v;s(_EFtv#YsfdKhfUsV-xMrC#KJDA!0(Jw7T|;4BYoI?%vW} zy$=;#EhBEEx-li$f48}g;6zH;r)J#UPN&~dciefdj@5^1$6e@WGVabMzyy^(TIRpa z%y7-k=+iSw8a`!4Nu{=juFckGQv^yWn?5%U*hI|Dumuzp!&bN-9`K$`O;pyfWdA+d z`9Yl2I`7RaXq<1usg&3+jPnwlJP7}RhhQ5#43EI0b)8q^#5m8Xs&yW(qPnN}FVvYQ z;8eq%p5|c2 zVOn?i#EnVzFH>KSO7^Ge`S1}eWuP4XD#TZLSPi3tZ`ZC4Qz50~n-JfNxQaybzpmcU zPL^OJPPTm=;@k9%c5<`YSDfr`tcO_{)l$|RF&+6j?y3lMx?vWf`g3<=rnjZv>L&io z4l})Nz=@RI-aBDmtpqgIWo-R&aFGW9m9^E?8t629qqwb zO4?DA^GAgFxQ*&N?$p!K2jlBbZ>xXM{p7ze&#nb@b!HgH3{oeO>aXdx#_LsC+)>dZ?fA>Z+E1- z>1`AKq!j!T;`^23bcl#`54&7TO@gh|u*q(En~c2-fx>F0MgH}9D!O=;`f##;h8|9Z z)JqxvTZr!je)kaZ^nTZMObJYE+3DwI*G_Da=p|12uUw#i^Tx?gagTBt*CQ?yD=D$R zo8As;>*KfUPd(yZ%y1K1ui-~DaMK-Ppa=AXUJwhtp-blAn|#R?dw7D^^qPCMT&sX7X1@sX!%z z^%!1`ob*Kbf0UgMe3sMy|L>cjPy5qKYSn71R;^mKNS5wk;i}2@XVJ`RQo6%oz#c zC~yrJ4aR^>FcyqE-BC-OnC>f-QRh~<>tfPYPZ|^Cx2ciRTA`k6AsgRVJ$_xyqw2gY zJE|VW$TM5?RI?({;yu6zOA`8PpJvTuZhRNxK=Da)}9U)o7Q+M;jG|9cHe6t-T3pp&3 z8)2$-7IY;zI&=Otn`-lKe7G*O$-idPZ2sjzC9<-P$-jA2;yv#CYot!1Y_5UxQL;nj zib%=AWm6;zi*A)H%*(OKQHGu*MizC(;36zVy3{kJD8S`Ija3uOgU+nWZjqFW zoNifj>bhBFzxxt61vZf_=Nr~Vur6+_UbvwK)|R|JGWZJEgO!cAi#}?ufJ@jfGV_8^ zPa%xU8>{X&)|_AMZnF7RP+wQI83tvyJ!{Xt*`BrY;S=d)25J_5yeYheeVag?e6wsR$pZG2N=tK9T}2{jhuB`gdH~pm9~F z=~|eJ7hhDUC$W+CVy=Jta6lxgiK*AOsD%w+BiIBsgJSSDc*ot9-Pa*e>YdwcBGziG zYiIWDc7hlOvq);RNx^qv+G11irR{Q6re=2c*46`I0!lUo7d4d>>;>~Am9|6DA$gXZ z)qd{CQk{J?cP<8W_EUFQcPp?G+1|{!+kv~C!R}&aTX(BbvhJc{#oZ=CnWHwNVHSu( zVoY)JEPotoBB{*{{}=F=2J@>qmOlX{%fG0F@F&AONA;%A4MPp?2tWP3}) z|1JFAS^myX(-Wgz&-AQD%R1N^rwf2{P8@d!&!=4OljS)lm&$v0< zSoN4&tv@N5Ue;4;es_NT;o!XPyuiL{(O_XK&AOT0hIKq_A_v6ktO^$dC(C&BaI=8jrdhk7EV4e)6r?F`n(_0}57t~g zryi4J>Hko0vQ$6lWBV`d?^RTfy48iRx7FZ>-r1C0VN0ndWxZtZN^(tm&|c z?71jZ)`L79VC~pMZN_a)O=)5kR^GeD;?A@PY-OaZkG-r56~P>|E@T#0I4UyZ;!s%^ z@?4CUu1(ZXmXH3+i(Vws7aOa)gzCj0w+p=(q$gQ(p%%%w#8i(T7s;RpNC7=TFVGwG zIdk?%0ZsPw@2ab6^W!#q#=|T!KgncIUzqv@XOC-zC>t%CJ^9@vd+vmK@Uka@lV=NR zH1pBLwm}x6D-zY+lw&Af(weAKi)yZ_Bkas1`%I!sI1F)#=w->M8#lH6H~;p?%w-#ljZtDS(d4-BBA1P znzf5`m7q9T>#XPxoyeXZp|VEfnFwtb6^iniXeX-h!tUM#O&*5Xk^^q?u{skDvR|aQ zrz!U|Xmh{~U^=)FP&1cSpiOX#!6s73;ka489n)H;NEN+Kiq@tI}hg;yA;m!wh zv9g=PHWA8uOClVi28GBVZwT6g&nV2aC?+r;%E)vb%S> zPKG@Y%EC<|71vtrT*alZ${9|k>69qKjY!JCP+7k5EQa<8@FZ9QmV#wKfx>@rC+j*U zu?KMGWBsPe-DI88sW=dcO*Qqm9Kxr_32NV+(!pmeX`6G@_7}Q)U(#(8Imnf7AFa0e zmH?+n`e2i9&%?dS=G#LrcIQXiWhCyxVViGhLnPk@!ff+x@0#Fzn~!!N-{hdlw^101 zlnpiIcm-eUz^mXj@H$uz-T-gbRACEVk$l^**5+F@L;*iji>#l+>=wxxX8gPb-v+P| zYyz7>F?buib0$A^-51EZ23M!Kyq$c>dYg$Ck&w$nW$DH9F05O?d*FTW0oV#Y1RtHr zTO++DW3tXSJe2hpn+6?UCF{BeEx<(LNu)46R2E=7+hE=fc7UB=7bpQAgHO)vv1(lSH_G{8_HEu-mMwsgS6x!WQRGoGImVVMy=ct6&Z2IL~;Yz=DuiNyS52whw zD^2=+4fh_Ke!rq-(r+P$ZTb~uNcyd!T5S3yzY&~%htUqCg&Z{Lw*f)D$ks4?|a*(-(fgK z>W?$&7Y=tsv@>@f_D**v{VK**rC;Q=l76*ew&}O*-Qe^~g)Goea?qqjG=?ID<4rjl z;wuU?0*yfv5Dl7wW;IpY(5;ewGq>3E+XG?1PsjJHpVjb-BwlCy#K0E|nu8XgC5Qv9 zK?^|y^yohX>s8?A$ZD5TDZ9zNG9wdMcpyQdmajWVBn|>!C z9N*BU!4Xzd#+juUeazQImFBFWWH@shDcK48Y4k z>!tH9>t#2Gt(TM>@p6C&=BS@bnCGZ+^j_5MpD^t-Ux!dJ_qkIs6v@58__`cl>DJdv zA6sAP9JaoSr;D%a;Gd%=e=5FmKC!-5qgTCLs2E?{F%+r1(fGOsU!$!rd0Z+^&scVI z*!t>!lP(u=Oje(vQKCzfn5(_4{j9t9J3Y@zM@=OEX2U!Y<}Azn_UD#)JcliF=`Ffl z;GC!OzTl}R&0LHI@%JdT%==LjiMrJ=-vIM;%RKB$%Um&|iaF~xVLpb}c`EWN%bW%Q z%)8iOV$MZPWaaIK`F5CRTIO%Rw#;)mY-6sRDa`lbb)G8RW0}j)fO*U}mO11O!<;)S z)N?ni^T0ip`G&pSy(wMgao&y`7I8n$8_5r$$+x8RH9W`D9i8p7@f@aNaN6vw1@7)? z=dMHcb@zU)>u@zT#54Pd+&&snN$cwYpcD#`kUNEn>jk2E2s{iP0Sm#S;4$!cO&<0h zl_z#z{MJ6RS)Ql;box=ApOoFT)%>#VUam>xnWaeFh$P)*Dq#_{i`|vbKrQ&5VOghK zG)lIp1#_j6+rdYNrBE$Y?GxR-uj``apcg1w<9}>oFTq4)>pWAmr||W3w0Z&lnuZ)x zkQ)xzf~>ncP!Q({O?X63++$*21>Xxnu{SaIXr-CTP_nV7-z%{n`JpQIV+U>QUGiPA z*FI!p&%{Jz{{1HQb@+OflQec`j{V}FZR|7d3&h?}bvtYyVqFBANb!7Af(@{4v?cKV zVjp8(!C@PF)PoZH%LHcYeG_`7-Yd~_>ivLDrZ|*E(h5w}@5BEA*a|)bAAxOPJJ@li zWZI?M)VIJ@f`7_w2}Z#zGWQ`+E`)R!?Vy;8rjWv zqwwZ*idfu;^nc70stnq1okA_G>yw)af7(8gfQ~Iw;p0-KOQADu(?Fd(E-Q)s{<1BU zhc@L~;Pu%~uLtJU7>blGHsw2n!=IzoTX?A{yN;aYql-_c*O^DZw=B}EJ&xIDm-oXX z685Aiz;E#V?k+$RvtlcaQvO6$0md(p0-R(pau?uT-86mR3WQ$OsdF$9S+dN8egaqj zM61~p{LG>EJ!wPFUm6I#pBiw=rqxQ=L`sw?KnUNFJcs96Q~2(gw19aiejP_`-N!GN z(BEOOafcqZbf?eh9JLAq@te-k1q+ePr%mJ$_^1OSL0wP}oDb@Q3!1v7`F1RqW-y&2 z^(j{=!b5!CMY{WC!z_~WjPcL_riLI2Gy;u56A%rWx;;dw$T~ir8QFP`{MAp6=r)+S zLi^d=$j3UD9CR+o;1?-**7#`#Ukr!^%|Q#$62yU4HTfBRp7^P{=Mn}HZEgI>!HN1# z`5tzQWUdVLw1%rqQ+3(7zG}}OnaGdSl5V0O57v<{dCtWs2TkPJFo{$=Z|=8rf;ACz z1{Z>hKo@W^=vq_c&3Goafw}jhFR~IKn!ByGDyE8BD>*vOJn5?&#Iwq{D|o@&g1H3R zB+w093c3Ry@Pp(tyVJL0w7V@3rtNUMGqdX@I1tHs(X>bp2veG>Q?-3H_KJvxK5kPt z4)-|^z-6x1wRN<)kG0dr5k6;TI1@IJ)U}57GFbaJRZmh%cV9Evvsl-A{u)=ke??N6 zde4ACWKWS{8VXYy7zT!e%RxH00*nZ*h{8yp*KkK+9LSPM^h(2hkliBLFNb=r#6AOD z1+E4o!6!#LoV7#HJ3cVn>{p|Q6Sz(^O&3?_5 z53Qrf2OW7nJR%uy7`_?s-3o34w}YAB4loPM4vyUP(gXAo_xQ4KeW2Ezd#x~w9DLJw z$b)H4Q?-i_PS3at)XhzT$B{V9$dIAzHV4Y4tpYEA)!;?22CM}|ZVwSEr>zV+ zDJ^}@b6oqjY^k54c0bQmjHxAdp0d_?Q2>=l)K+uf?H%%> zvQ_oG5YAiGP0P4|)NPmcf!uUcvnjlJp-LR)BI`di_t`!ox@}F>{XESbochA_jOI9q z36Da@wDWl%)2*`wTahK(Or?DS$ERR7_zZjwz5u1*OLyzo_V3u<4gvE&3bcH0)h~e| zpo3h$t%O;mWP7ORD_Fh;dw_j8<~Mwnmt*c#wL4IW`YWMD=-RKvZrBm3-(R{9y)y7E z_zrvz_Jbe50TWp>o>$}7!c+l7_v$Zv)xuc6Vlt0ivj{{Y+RDx!)tZhzZ$s}v^*-C) zon@Yxw-bf4c?qY;u29cUFdqUx0~_sOK1;N}s7pH$t$9y~*dgxg@0rIU^!2ywUsPi1 z_6W8|K{@yp{04pp72uEHx{d5C`Sd3)PU&__C7k?{&8HF>B)q!eRzNC}^r<2L6Oz9` zCHNa01INJ$@J~(Tk6mcV4}Yx5)kQ+CN0~m5iWKe+^_+y@6!0`NliT*e@6Wtw_>du0 zFW=0^z&2dUXQ3(qCr!_-)r>blG}H6brYh}XpSSN2X@~PaGf!icVwA+^w0_qieLc>` z6T;d?I{S;*rm__o(`rrc405mjpWxin*p~{owHHEpC*reVA9m5K92@b@nw*1Y~Ik6gUk%TXe zk0`hrfyST-hz3nTGZ1sSkHxynWR<$uTd6m@`MlTaq)38Qr2bc?9%Er?ZYyH&r9Q9o zJ8-DkD$jOQTcFy~t=hCzqW)5vUZ3iZmbF+XpV4jwT00h_t7Tl;*zxA=xrHc;xa+#l z_f<`{|Lags8;IgTThI=)2MM49=mmgkA@H0-Rb9^*weQDM=p^&k`!*&l)i73RY zn^4HsV|h6{MRLC}z7m`9Wu@-HW4WPySXb}*JwZh0BtxXDHxB}l%)Rsm0_z4YwRN@} zHRlJpIBY9xHJ_yubVt=^Rewd*ywQE3OSRHb^`n|>RsB7zYMD#5&%RJk57bgXPe=8_ z;3nvLdG__!PUuW0lax=uK*Ze)zB2U|?876X%S?>DVC!uiw_MbXmy7mF@p(I4Dz*F@ z48pX#2B!KD$ZL^B<~n43AnR+%-i9W&v6zn+Rm2@g{W5hNg%-Mxuc$#GaZgpk#C;p; z=?C{^pufXk?S;dg6EDxnzCL$M=P{ixGA|0Kg;B9Xoa+z_a1jg-uDc}1Uccl@=T?S` zpzu4>bq7K)2&96+US6yMYpS{s7B;7%FPLA-hf78{ia4``K_$ zhvP<&3vL28gImB1aBEH6@q;Y){6m`ib#@r;QE-ZsA2!^#!Erm73GM*1z-*8Q<^*$3 z8Z2>dO|{$!P!RW(>^9sd*dbDI#BkpU$6a79xEss^_ketGZ%y1;LoE09Uo`h$>@eI* z;1o$LH{AEZaX*+39sm!51)u;t6wJLUP2#S_Uy~=Y53>@eIuI7Lc+HQW!w@d#K5 z9tDqq$H5}7xF+tE!z_0g6x7Kj!{OE=^d5GI6#o|Lc>?<=j5%;)Mv8`&@iT&M-kxL<5<`7nUwP2U@>$CM6%Jqm*3j=!+$l-ESNg1lf1e}zs8 zB9c}S>UjpkXTfu7V7kvcQcs4W*{@e_ao(TLBC-|Tm7t|Fp0EDH%@LPGueaP9rf<^swkT#)T73F_(e+pGJaly?`7}` zSO;DOuYuRW`qTaNS8FHJ_}b6bKLdXDYVQ4Tiqtx0GVKjG-UM%f4PYbK1U7@>GjZRk zaz^;M+$=bsZ>5?#tEkjzH|=Vl^O}$PI1o8}+!W$%2;XU@I$c%$GOz4zS=+dc*IBny zMOXT~F)DeU&)Y*!JK`|b7eXZ{wbDw{bW&GxK&0>=!~P-cA2m~BMpkFfyg{yu+mH5n z6V;}BeBK*%wG^Mw)iP!o(?5OiKFzusHj$a9OyztG>nF|Babj~{nue?L2jo(^UZ#)V zvCZW3O`3K7NnHo~*wINJT%fBwA2yLpZ?H@D11t_JOkCDleQMo*Rwz zc~@u;Gdy9^xfigzz22RuniY_~+D|t8B7M#_e!hk8JMcZ&4}Jg#z>nZyupd*NudWR) zPx@Kfn<&NJk7|zwL-==Y?@Wt!^Lh^QNkT+kHIpy=S7tTh*%BsMD!tbFh^@ z_<)Xg6qX|CwTzeJcsbEbz5cK)$0&OLIr>)&;yG-c6*0X0gW5@O${AkT3CEWINfdmD zVQ2wofwMsfI0u{y&Wj1Ur(wGORggT-)X}W! zbt|kf>K?|7wl3DP+5y%?eQ=FtJpr3YY=mjCNLcH}s3r^(!FgSswT6x!7OopnMy^El z`c$8HjZVGiYz?eR98G4Z9zNG9wdMcpd;wy=C%VvyWHT8w4$D?BgsM2kqY4#nQ?*flL%ku z7`2Z;f}5rMrr?fLP~Y&e`!(Ibb72q})zB~{!PG5AZNpVHCOvTdc1v)4*$rIr$w4!4 zWx*zr(#Wu;z}ge^0=+>W&=>RrmsP6=LTjx4o?!>BjHp1w?e%W=z?BNWNK_Nkmi^%y z00x3VAQcP-L%>kCp9uBOLo&14b(_!otR7;zG}bLDL%_?rX5!!!@jVdcNyB~^7|s%f z-0;+|shbfU=DD1m>EMbOHHh(`ohoB&2vN&t`n(ClWuWSVk_<>uY;%B!Y{hT{urq_w zreU5d`9A|(1+E4o!6ckA@^bXxz4Y*HOt7am_@qrF~p*}cYcZLnHi7aeySPNi% zC`KK}Z7{2xxf`m1_xrrh>29^Uo#vByN4(yBk!#*j2%E@^4u*9Rtc$@D;7PCqECtJe za@UC&E{D0|&QA!$y-5$nbKw*j)yZ%d!m%7Y1)c^gz%$@k@LVvrDZ|eT>`-UsAh{h~ zC6R;Xeq0v(B3X&1Q?G>Y`4}~ZsYrW08l1xy^d!@hP_QGw+|H5&YVCtnQ<6vq4)>I# z5cR;6L=HYsS2}qCmLmBV;!fSi6t1z_%F(8JCNhe>*2h-Ht#t(RDtOHqxAaWp#6@AA z*V(xqyaC<>Z-EV9BiIBsyK96SQw%lV>OtmXjHNUO@lqhniYlOn4z( zO_mok)Wl+3(@?YcvEZSm0^7jEMh=>xCK4)<#3VzxmGC|!p&zZDdS>NL zTpP$iGo>kmUu1nx!NpHhc3De)4o0eB+ zGS@B_t_Y5AbuU+Za&Uo8{FShY{mhcgnpx?tSd zYVETu2n*+ky1;j>gu{6unf&nH zNIkr7L6OE(t9;&`F=IT43{w3u5lI?oS|Bc#DRrzm1%*9Z2t~3gUd_;;iHb3Ci2CU> zP9JPVcC(c={{%QX1V`Mk5exEqG+K|6jd$)KoT_8+k5Ee}S6|H^#$JcNvEI$8`&~b$ zs#D8)c+WMz>s5e`NM5Q5yK5}J@(z+fH*hKF4t&6GTSN-dKr_a>ic<@U8r|)srq0s^ zoR5k~^k7rKWLSFy7w`ht)3P4aY!SEfnO7uGc_UQW8acDBc}H%UrLFUO&r=1sILEB5 zq@zd}oz@05Pbqsvwhl4n?2qRGv1-AKRn4=L&+g_)L)9TN&9j>wBIAde=+odBRuz3- z5z~M`^Yll_#$G>7V!w~5N2mm}O!F*3BT!$mJ3^_KeBMTv1ac}CJCVp?Cg`hiI1-Ek z*MQMr49EmygBwTq+>Nscsv4X%)6EhMzsPE~l6T|aySA!ex~I6F)hs~G7H!mUDcUD^ z8=-Pu`Ilzdj}ZZEM#t4_vM?9PxZIR58_!c>Rm{s(%`%$L?q(^!@xG9Fuz3bqn` zE*v*iMIZU9yID$6vazp7m)IK<(FnC+oo$u`_6BN7c1NgAuLU(r5gHCcTZKpOtYA`uFC)xi<&LkVLtOd zO^QBZ+4_HJm0a}jKNKBTt5mXAtdPd#;P7~RW-{jKD(R6gQ`Phnq@9K zMCxB-qTc|=#;WKOH@Tao5@j3v77Tc*oQOuKJsWMaq_Q_qQ?ffk4c#2nEG1}&6puDR zzmLNYz*g`f_y}wR+rf_DW)VJjv-F3e24|*OwsTNq)EHB+o$&3dDwt`Oae-z@LCqE| zEK`bhCq*BjV&DFkW?6_40Zc>3)htn%i_{uxN?3~LFJsj%>cRGwh~nU8DZs=bGR;yS zTahBRl2m1Id|NGgbsWF-^jBc=QM1wKjFad;!UIY5uFu<5pBT-rDjY-)KS$X;q^q1( zWTr9`1Cjh|O}vL~g zDx4C8{J}q}`THbBH~NJPR#B*J8EBrvN|+Gl`4f%5KqdGa90SL}3Gfd%X#+98huR6Q zcB<)nJXoO@BC?@NzaxwbFAl`1H#iWbUxJndw@AWuVV+a59<^eN&+C4vRJanVt2N0= zbeGJkBH@5Tg0aYqtT0cl<~)-FeK1M+R`zU8`+(IIudbh!m=sOkypR3U&GS}sF&0Uk z6y~YhoQHzI`OVd^6@6HfOZiHc=pX)w-gmCFQRF1GmVX+bvwkuz)d50@Ijc$Y;Fa{PBq*4Y^4*lg|3|wr`oa8J{^<8VVnFJ(~N3+R1>VKend=l+vW4- zUMiJ&6a%?MTkP=5oy{~1<#8<`vUfVSv#$e09YH5c_75}(;Szr#hqYf7aYG8T=)omE zZ&*Z9j)@=KqDgRO2{o!&vR8CZpQJs(y=Vyk?#2QVqM& zu%@8e)2a$izxL6F8XU1c`k$8n~aN83oOg zq01z4Mwn+5>eqnL)?`?z9oH&cs@bTHK`j%Eb)O_+)J6=#^thgglE?Dz#6!1m5egzjvzcwdbT7EiX3nkqeBOmR_oF#% z^RiZ6nCE`f=7R^UYR@vFzfN53cT^)`U0R#xuuxk7UgC2BTX|?l_CLhuhe08qA7Lw! zHYd!pkk5~T$H3!Y5m*eK08fG?wya04@$;1akRQozb;oxy_7(O_p>;ETJ$b#x3+!pG zx_%=^^SCa3cLVT*HpZv-}}7APbE~R`MJ>X zvjl#TqPfP;i}0-hYe5ls3A_wm0qbh=vvI%m69vU-elBwSY~Y|s$=$}!tMI)BUI**J z8{kdw7T8depKpG!ev+U#%}*D{&mInn?4D;9b2q}b32X+%;BD{@co%G`$C&>^od^x`eS5^u+Aaa z0m07yAkgP6Az0)h2)Wl3VHX4?H4|KXW!8l069$-tCEXtnx(L!8f{!8i6-yi1r8nr#(8>{;1EO|73`p=w9yGa9upk%oV`Mek9 zeV`0{3%gZ!f|OK@No(=Y zukx_qq;jT$I@1rj3>G>Dr!ereFslp77^U$y5*6*N-`}>`1$yz8` z2a6no|6x$u8hrd4(=6R1b6u)4A2I7}p{Ry|a1a6NfJjgm)N2v6w3FA`?`@=Ve)oB= z*Q-e-(8+osyW8pAjZ|W^pGi;QA6yKmp%qNI^@K4WUm|-J8lUIGUB872g~_f(ngz5f z59g_`F(0k{bipjhk2zRpX}NWFfp&8cJ&_HM88=OE6Wu~hgDBWdQFlLUR7DwnzBAwH zPoMXYb~FD`?M891l|J~aI`S8Hr1i{tE1V+h78&lAaL0jGpfzX%;z3)`F1Xr?&hz8H zDSyM&vz2_aUVE#2+<0U6C2Hp}x`%p^gY|S3Hdm3g{5-u@@VC!fSNkuv}5Rn1QNn00?}f;`cM^ei#X)0dh;`f;8NdVmzr z6Z8VTL7(74n#@W42mjjhYN!I9Wp{(BY%z}OXqTC|5-DD0T=s>!AGi$k2Lr%BFbJdu zyL7kf%ap{lYY0R*R=QnBpWvl`TuZ@^c<6CKFmO zo$B|t*9Duas_~zRiGlqL-T%yaG=nf?M!LSv!z3XC=C}1wBtm3vMFf z398^MN!dDd>{xz#*3TP&8WTlrwUHhht;0x%Jy5?DUKtpw`u@3U2L$zXIAPF=WIk;Q zK8A2ITkw`2@!ahK*&Wn^?LsKDZozDbMN*zI4kqFt3tSH-fyp2n zOaW7?wV)mcQbJ`MXjt3tRca@r!6040$Q7oZ^=Kd}&S;jMXP=g36 zxKLF&GDEY@d^XT}^K|rmU=Ufi(lFfu(+qGcxDDJ6W`aAwtZLEgOj%09n8)HyK;>j! zvbySjes3S`p%`ZEVU_VP8>T!k2iytn0&~ILU|uy3)#~S%E<^6~)oSJkT_?rxi$t$B zd3O(d`N4UY8_2sCTzU5*aj7-LJ4B^K_<17!c$nWi&SV)}fgGq{ceN}F4`dl6BAIJU zAs@o|!(gWbVdRws~U5R0S~83&7T@C0}gECEZwGN3?VjkVZ7 zXW0eSvTUupE>Q`}GJJ_7y=;6ghx;kAjG%%G3Nt| zffvAP@FG|P)`FsH(VHwgKagcmNtVG)memhr8O++ltH#4iFue?30qel4;5G0%SYOS9 z$+AHGI9ax?TFp3F2ERz+>n6+IfbUJ4W!}zy-d!LQ!3*>a$;#KN(kyX3fvGhF%tKZU z{obWI!Lp!nn!lrZFUs%y(xDG!k>WQ@Y2L-l7VsW;AAA6|f)Bw*!KIM|YocmH#aoh_ z`dKJC)X49>NPF`@7w~pPW4||3_nhtQ78(DR@wN@t?JZPy>}qP~4o&>tg_>{vo0_jj zU%%I<&SUCzo$m2D@QBpkX!t&bZ#Vc1d=9<eKxrKyiTD; z>$qd#7m3|u+Tv^Y_5`d97NfkYGOA_Tg)Qh32H&CpD%?(w3P3nnG?=o${nF5 z_vW+*znrEra1f}sS7U4|B|sxmRBX!m1O5+yAHhNJ6F3BZ28V;oX+JG04^mmN6Utm4bLbWIUnp&x83)@OF-*(mBU+gxmlnIYW$QHx*2Yi2m zzd$AU8yo}2!HMALo&FA0I~~1gr7rKf{5%(DTPYHLk+AnnEByoC$>3I!3!A#S$CRRM zTdCIj(n?dQoe4_OCg-Z3TKT;*b>{Vf%&8;u@O6EZMG8JJr8%!9mn<#SY%GFn$JG4I zZT#L_G}CSj9j0EYM+avr(^Qqwk0RB+K}=Sqajo`O87@a>};EM&#K?~3l#DP|z^_l&&r*6!vlxA$N z=BIvD#Whz)hthqzkL!Cyc6K)J?UuFVG(3xp+GQeWgQs}V7PJHHK?3LiI#!E7>T>h? zj()G#JVFq)(^Z*AJNcbg(Plv{vZuskStqCxTRPXH>>A?<@ar@aJGX7IjsBU$;ey@4_B?o4a%+HL6o_OfhQtcyzU=JqYGE>Ea zy43G|Tur^$?;WbS6LtscYn$3c@|o+&Y&b=7zA)Sa;2sDDfmARU3;{zyTD2z8XJkLM zRG>X9`P@X$S)jXWeXdlSR3X1^&H!ujp|MWHnfMZk{?hmy2KR7qIY1jTtQZJCp5GMuIM+6kA9mnHPBBwsK&YTuca)pm_aTN9h-!!zab>mkw!Dqf@Z35 z5A;-9PCtpKCE;N#1E+@fP^_mF%|*Kzvzq7;?{oa$BuM0dPUA{Mbx5GEHrRqc{t(N{eAz$p{=U$}LTb6F4@!x4anVbxE)smBt z+CvJ=BBlF{hr94Fx200O&g>yybBAFdg8|&;Wn%l;AyR(8Fx?N+eDDBx5G()%;34pE zaDD5}yIE?(8R1s{5U7Z4>cK?6x3>=V1k@rq2Tg`O0@XryhPBs=a^ZTMOG3$}SoTlE zqz(|P8RyIkB3Gh85ymjg^-&ubvpeZio=Kk>n21y!GR0YnuVp}iLa-b>1)c^gf{SC) z=c|E!@9ny(lAv(>m~Y00{A{=@4jb-g;CL212UddT!7A_qSRKq=HO`q6YcW)COE>JI z77X@#Khibj`Nen$Ichw-2-BLD>NrKMDRE>ZYpm9A8oO5!eQ{2RDyOXC|WWTt;E6-_upVu8!);EBxMG`U$@66-x0>i`HHKH1s>5 z*$H-m67Vtj1bhm1pHAOEwdJi5S=!0`KU_{)sdqRqNEaamZjrc35TRoY0IYD~-M!J?0}jN8TBzg;dw@rQ0Qiz z#P$&Q85~wqM{!N+m#dii*!4flJY2fa;rIoeBj8LNM>WSz;m~&na$Ot;`CQKNU%_v7 zAZm3DYjzilyR96yLy+&EFwgI(Re(Q$b@wNqCFH-@4pEt7SWoBWP+}d8g|#l{v%D~& z60N_%F>oB50RMoK;FN7gdDLNy&W~Ko^zHNV(K7Ka@7aUZ%posxAz{W-4vSQrH0+)@ zUdIrp)?#lvk#O}^iEsP8(VB4vs;4n3qCU5?G?3?%VO+$v7Ht0mwSg^dD4(UYVQful zn>3dDWK!N4*x2%>dcx&9p_>W2LG5}dpAYKCIadHf#!65r>ugXZSO$V>rY3PXLZ$hG z3!4F@NSarudEXw44dPU2W>sN@*HqkYl+VDZ3#+Sd6ig!VXNBv>Qk%lqjOvpw#jDQa z{NB_{rB41rP41!YcGS4wjyqimF%+~qe8;)}RfD2W>$+Tj_Fph}RLmlfqv$ zUM}yB`xN!p1i$xA9YY$foESQ*b=PsptRsm>StRm26UoIy($!YkfQd|) zbgw>)nyuYTNA(g^ldS4;RGpXbaoDOBIjY@Iz0|7y8c<#6QuWj_0dz;zXH|PUj2*>o>+sYZpFI0m3P z&{5Uj;Oy@l7{q~8_kks~jm2ON46)>QOoqI5>V&BibF<8lGZQr%`eDapC?;vvqyr|V z)k|EeDWQga7^=gqs<4|UPGdQ2Sr=DJi5JE~WpI>M^9$|ghg%e%K4 zRelX!2CS*qj$KA+qKMBVYuoNr<3KW9n;HjFp_ugu`eNaf;w^{Cx#!lQ#4ENJ;tN_n|XTft| zC3qgJs)>8_?Us83R1!BkoVei>snyhQzW~Q-@FG|P)`BAN5_tJ^?k1{irr&w{qAyx= zPrJkK{M2`SI7JGZ8SYo$SO;DOuYuRWdhiB#vnKADv;5BcOG}|5ZsG2vx-uY`W!%*; zizLJv4{yP=0c-@Dz-CYk-UjcS?xB&|oF|tYjrluGkDWO&rtTSA67<2V^_(FIevv)R zjh}bn+Y+ZP2@xiGpKHZ zb-NvtzfF<{?uOpQTDyK{+a8qcAf6JZC&TS=(?iKLtd2@7>%sL>*<~`*j4AN*t9M5+ zU84)trKQYW)xHIO?{M|cJh}QD`JmrBNe7V%mq?%1W)}PzL3|#kreST1_HQ2iDigw< z+D}%iYJSr7rDqzfa~jqEl)Bk?7& zrLFP#1KbC|kKiEq2^<1HgTwzfpJn%2p9dii)aM=dS)V2N5}DiH`1}R#Bj6|~2fu>f z!0({q|K_vse(Q5(JC{%YeCx9SUn033jL$#d{uBHKD#7327&s12{9k-Vs1Bq?Ej5K? zX~P?Y{N5W(+a?73=b7x$ZJUQ*kr|zg|9|jv5}X2_R$M%Sv%uLPq?PM_&6zUR?cc0f zF6kKX{H*pl7hfVtosG|P;64|e2Wo-;f!ZJxg#G{c?C_9XCmofjeJXYspMCHpQhA~A z84h;@r~@KFT~H6459oXc^dAH0X)@R5?#^?Gj#^(iaHvkPm6leq*gC-#Q z|HtQx3$4#RxWH%3qxjUL!4`aplwNFxq^58;Yh|urSt>1iQl5SadyE?jx+z{lO)k(D zu@!Mo8%t!Ld`Sd3(N)Gx)ey%$)H2N9(rX8C?AA+SX^Z^c3)SO~+d-+;C5Epk$&9yc z2qV6g8iS=Bl!PTw-HGA-nyVC(0M{idZ86t-I>rrfh$LKUxH`d=2s(oc!9}18xEOS` z)i{KL#;8_La9dla|NL%x9RHf#E!Au6zD#o`!6}m4-Edz5M-u1;E(P6z5BNc{oBJ-! zx*K!O4#H{%<2-mo5`CundtjI1RDZQE6<$1i?9_=9`l2jLB~cjIv%^fsxF^QF9AowN z5_=sr-le*o&%IIW1Nz!#?x!M_at~fVox0AYoRS>wxeUerU;r2h27y#C7z_bJO(D7M zvfS_OuO=?zx>Fs7?)eL39b%Uz*Z!whuO|Z zLA#Yl`QUQC1Ez{@?7`31l7uVBkP}oW(&4eo_MeW1j zDeY`G2lUs9*^0#VG~1Nk;hw8-wvON&XPc!!uX=SUuI^>{vQSS#)s$k8dVK}cES1gQ z_cVQ-K2BNC5!ucEB76FVd&WUu2&FAc!83mEa{WE@JdWxnWxKm?xGLkTZn3IhcQ?-I zOP-ZGiMR5%i}n!R&v-b9u1FgHixgZI?wO2-G+3<%Q(HyU&FQsuv#zHotivz<90+>?v5?SvKVY{~OAIqRupziFBfY{g|BT)6`r zm*=jsE=xHqF7w%n#1AyvtU=+PJ8-$4;DTM|zfiMF*>7By!yzuS*=7z>yEtI7VGE?< zESIfF{ZzBf8yxPLhqD!gR(vuGksdlw3~7V=x>>d!$la`J|8kP-19KT zkAQ{$MIcKxLU7PUkPgA47(WIc{||!kvN|LLNf_A(R`7Wd#*4ud|3zRU$afKx^I5*j z|0D!U9D?d&Ui$Rwvv2B4#fkS)mvKs(FQipjs9u*%$nBdwVakN5{I-k)v)yI3VwgE$KaJT6@CPu;yb@18Y;w7YUEZ9=4KO@4@%JZO9*puYWsfycHal63FL#K9@LVi6e~J z2bgWOW>a3X%X*O6h+wQgH4IsOOES z$S__$LHSchx!SPQEp_azto2QsKBX`9th*&fMPHa(YOvYp+!Y>j%%J}&P zzP*$I=XMHtI_u_*^6i!S8<;!l>hO(paWB{;2lsPufbNCyFpKQJ#(4Mv4+p@H;2`)3 z90EUs!)Gpu_%t^xLLefQO-aO?DM>lIwV%=9o?qZP0*=<)8eMx&%f4{H6!QyQx;3_9 zWZOPzjA_nt2!6F~|MA;06clV`Y|%5mD3q+hVLtzc^6#Jm`~m(1e}PKyH#lZXcBEK3 zrrd)w9Ww`GO0)JInMwZ-FA*vam8SZnS;;|>^2~70an7wP@o&zpO_dOtoAS9F4W?MO z9|qmNCpaduaI7g*NNe5{-`aE$C54JTU$QZm!?rm6$AzmR$eW)P(b~Bb6<a4p5rALQ{*dC_2)CMvg2oQQH~aG^E$5><2OWTs2CoX;1b z)&*Q_RXc38swFPf^ehubS5z;ts&i0HG&e*zYy(*Ds3xJ>&8^yAMSe(wX@h*1LG<;8 z`%(se3SdIOFz%i_o43()(?DfI}IHhP~0TLpNxJFt6%pczc)vRvd*PC(@{-9 zwWn2m6;(5p$>6YM-R`LNLbbP54c}%bNJTEyxXIzH2690N`dQWGC4S!Lk%K{99fk)b z%U#Up%TVqQ23Uh(+qrgbAtjVQ>Lv%oQ%xN>m4iRM)U1~xK3|3U)nKGG`C+HMC7bV34Vf118HL(4V6;{3xy$DGewXSf zRL7u}3C3F0M^QD6pTuDsKqa5Yp>{18Z&js5Tc|qx?WYI+0>{9CVS$w`8OmY)tX^K7^7N3@48K#pRifo4>_J(lJ6h2P{)7%s-e5T5!!Yiv0$-75# zFpzhT+~5!`glIaSZv?r)MArp6RyIoRh@?=K=q87#|MYOr&3wKE%y1KpQ|c3*W6@bt z<`79Otia$_ly3vKyA4|S%qxJT2s2R<&-OJb;yH#JpHiJO`7DxgBbTv!o&{zH5vggP z+IA^-hc z9zN%Tdo6{|5ubUpl^=J)&0~qSqXv{M*7kuk(35cq5o--&eMFVo`F}jzsh(kci%5D{=yz4Se1R zHd&(1Uo&*;Saw&V*o>O3;9`fO==N~W+kAcpyz8cDskTC7^0+@r?m`LC79iF99$S&| zGs8Xa^Z5g?)e=cdjq{lkk5u!CYD7|~4}lPU#8#vfqHTQM4t7`~DO5|9_>H{|C_>3y zJMN0yba|!s^63v0a)J`0S-4yPg^@&4KjLxTg-VHvp6f$?hq|Yxn(McB|MR>eEu4>J>VOw zTDMH9BzB*j1s1vt;%0|?_M*HGlm!{I)H$!)!lj>w{#I1GLPN5D}~ z4t}la8pGUQ9{nx1arBkON=UiVkUPsg)j@W5&{xK(@QY;KY5e>K-|wIT`~m(1e}PKy zxAh}8(3_|u-vuv()loU@57*ufLyNavs0`G8a^V-rzRUPI2H$aT0{jC`f>XfLhC7jM zoJ&5pAF~d&=6kyiRt}-#!F|0p1AdXnxjZTf*V!PXjndC`IyD{Lh^e16VmZ3Dp0}XS zMO!EMo1GOF9KetR_L{S;tBC!vAb?IBbT9aouv=v7-KL=71P}r0fJjgm)C1>(`Zf8H z3sZA#n+k>F!7TOdW`{`jyl~G2*f#(Ts|r_ekZS~6xKwm(;bQO6g}Wc-W@p8?otlgH z73ey38KeBLn75-hR6|)EG>;o6Kp_&BZ;BO*>*j6LK1y%bXr#4zsp3O+RbeG2HL@0t zp_?|*U#&}oPGl?FcqrR~c2y^C27-ao>X7{V@BSTd+Cv!#&BE_5dlMC+G!wgFc`y=w}No z>k8qj;0X6Q)uy9d@T)ry^MrLhx$N%^kyKkQ4zuQ~*(g2Um^Vhtv6&nbiF(jDyR3~z zttLeK&b`xlM_?YKdw2f_0(?*C-W>;tNbv$gHk1g{z%VczTn^H~6=1}fA~)4s4wa2H zy0iHL=5}aB3LY};bR{$ysvV_m;(7;$T@5iK-;iHB@_yg(WVIa8yhKf;9@6xV|Bz&-t7$|CI|(9ZW)ZGROu~ zz*H~|Io(kj_|j`;zSa`ua?Tx7UzgX?xM6Wjr2f!QDr z%(1~5_Sh$rovyq6@c{WMon`A_6It|xVZ9UUyTDvN=3RM;zD18AOBK?;cu7}}z1S|xP zg2%w)U=dhs<20o&F0`f3Ug{z*7!V*&hg2l2(2zd?$&+9SSPGT_1q#9PVDiMPEP0}; zB40KGZZjH3!6{O*+;Bey$J1@p(? zw}I_o2iOUAffDesWp$Un_4^*2ZZ{U)2{*KtlWUh)DLD((i{&WXW2?`W@Ea zgZno7Jj znJ>j>UXaX-tWGvc=0TTcEt9>S^jI(+mo(6>`pMp%dN|F+mq_Ys#^s=JuNEPyWE^bG)D%uBDK~VjtDsF#H+Q~xjB@QZem`mmH2vq$vh-iA6t>~ zHw;GuI2y*Q$qlPG+?}H4lA1RW9EQp%Bqpap0N z;y^1~!BTvsbPv*%;K5jOoYRO2eLp)y7H%}Gt+8$suevv>3f*u>KQYDMupvGca%k8R%W%0>gQw^CPxT+zoZL+tou7+%gMN&R84n{*XCSE<+rm9*^s8v~+ z{h=#VJ;l-0kP3rH#Wurq9ZVBJ7PuZv0+T^Dm|{aU+*R2ci!qI5s#s^Mj?%N;aIf59 zxTnG~Enbam9~|ZDx|w#P>~K7#t=C~CGHRExz8ULV;#D1**QSn%Bl0Yp+4(yI97|0S z>M~}*AmaPjFwKH#Hpl~Wz@6YOFc;iy%jjwjC4)((io7V9>$3r!8A5f$z7p+CQuID` z^3r79^m#o)K^N__KfXkwJ~ck)!F>k4v=S3)R5+HZs^lz%L1gvkhUqbw9tVrSV(tOKtGb61VGu^8KS(BrM?9D5A)%5MzyYf!vS=jdM5phNsN9d@HEog>+%!#b=) z^7k3*O;~THb6{c9p@t^w9h|`Vdo`;h@JG6t7Q!Yn{#(QPKCB;rt>8oO5!eQ{gB^k5 z_6iHxOc*_D_(6&sfu_LOiucL7vONxA1jf{{l@xptiK@r zvG}j@R;6eqB-G-VzRYcOc|(3MtfdDG>t0y*fimzd_zrvz_Jbd6d1v*rQHEd!UysXd ztL$fo$ozwb?*Mi`#;YD!*eIopPpYcKTmNIAq)S~V`b98^q#QC#M_@V%%E7PTH}E^C z0DsuX40l!HW&c#gU3H>Qg;J#AXG8rb6n}wA@HaRHj)N26pJ3{$kv0}%$!XoldbVtm z`mo{N^NZm=3CAgtdQepbR8Pw^RmQpm4@0FTd;e!fSF<9q8!lYPO!PLjaR_r|?cyNR zB3q9d7w5KRKH65*8C>P!!HjAbbcc^rA8#ZPk@rQF(xMg&AMXwf7=OMP~kP$QwY?u&w$T?=}nmy%KcBno7w1%~c84FjX~` zkPo#;)*r@2GhD>9RcnV=xiHb{(bG`PuP{_s*h|unrpB6DACl?J}X?;ZztF-vhJAS z=nBUrZPiek*H)w{rR1dvr}XbCCihibF%%+OkF%@^O%IR)+*ffu`QNPVbx<**lD+5Z z6~0AS*lW406XBj-X!QntK;O3R6}}jihgCOyMb{QhdqsB`hEe=4BHMmgUIzMu0YGHK zKcRwQf!4l*+naccfB_B1}y}5*xy*RjY<{vuhpZ-Q(5gv+H`lU+?$zzOK*pxjr}N9FhL#7}l$>zPhd2MND=eoSKu@ zbd2Do1#tFFP;9u`WE( z7egSDQOgkB1JS);KDZCu4;}!yV1c_YlnPJuxi!Pot|fIQoFe_}8198|ECP98F<1hY zf_$*da=ZH|d9Ey}gSSMkNcz{--rW7w5tVqeu+}L~$D>F>wDG(g4=dWL>>I-AIW{|T zMKZLmW_<=G_Z47!7)18^4AUx@R)aNQEhq#E6oGZN4Td{>1?a(;?laus5nDmA$ky`> z_j))UZL2Pt8IJO7*$A&!w))SK4ZX0|*(iZuq~HSM=PCSbYO8+E3i~k;>l1-KCQ9nL zA`TDTA{a!{>Kmr#V0yl-`g>L+lUbk5jtOy?_1PG#L{2s^)~{f_of8s0VF$j6BRpsm zQMH*1584_H4N-BdA$lF6H^6T2CU^_H4NAc~k)0AAvem;WlRwgz5s{7VNe0Sv=JZE+~FZQw5f|bd>z;xPD5_Ezk=gy za0GkIow+wMO!yhY=ldX+)wRYTyZKs~0U6E}JkI_U_Lv7S6Xng{$(Z(hy{(T=Sh&5oE&MZJ;X1v7el+@5y@ATqS0VQLOj3(yj@0I={o1yLp z#U<_3-wZh0t;Y)NpqQPaDV}-I4vH~Yi6r+h)`PJg!hwQ?wRU%$tZqlDMi2LKe%T?h zyXJEbu9x8+1@~w$28;!lfy==-aD{F3U8_#HRt)ykE@o~BJ^V8l zG>Nc^RP;9N<6)W5PThff8@X_q3z{gD=oUkwr(8o)Nx4XQsv)@wlB?UP0EU+2^ya_3 z#x}q7qSKncWvy-gK{!Qr^fBDm!+itD1UG^iU?#`{H$^sIk5zM(SaGo{ay?j0qvHc|>?x#A)B|r>pB5?zvJqxj1 z1oD9UDseG?_fZ2Mv(Ne}v9Z^O@@B^p>X(9iu&kZAKJ2K1ynPU*KEUdtKH}+SH05bu zkgZ%Nic}3WZCQ@x3QzzZ1P_6S!AkImZHs%D$on88)fbQV@n-22UL}N#zQddQcwdpX zLSppcaT0owy=lhHD(F^&HDE0$1PT;^b=J+!XCg2APF||11J6ZX_Eo?sl0VpRuZQDN zumL;<9tTf=jo`^h?(jNg+aMQrc%8BaPLVl74fj)UYyz9X(_jmD1{8y5E%%wz(^oZX zY#(&a9ui8Dc~f9M{302{ji2Y>d!DIjQ+RNiY=md_++nVW!!vs(3?gyqhUpcUwu2qu zRj?E60wv%z8?kVki{SnvT&&?0N+N6``$ihp*Rg)1oyx|}&K)Mc@C@!jm4P6=A9|57mm4?xp*sK$f-k@!a2Qm8FRhy`+aed&IhSeH znK*Obk zbHgi;qj1naBevTc(#IhaDV=CYe}(ina2)&({0{yAC%~V!xifayAdgSbe4Spkr`x^o zh|HU0`2ND~?{=ya7B)zetni9rpprFo+~)7^Z4TtZ+dTI2Tk0=YblaW|Ffm zHQeFxIB{~AJABEP3Z=-ADTcZh6tzJeP!~i4AMk_oBdNo~)Q_>8adjVuZ%9{BEVBD* z!(9)K3zF23*TM-nwU?%-NpD3io_AlRxn)!?P$gwDWc7nSy&fuuS)^#1@z59#O_J1q zuZKO%z{LGTx@@ZE>-2tTJn9L0GYleQt~E@}VQK+df>xk4Xaf>KTbl>N9iBvUu5odP z??+_7DUx!X;cf>} z`V3z0id9daI-?0Nh?Hg;rrt1Jl%(!>H|4rJ19-M_A+xH~mAQq{-**F*v(FDdllWr&r z2O~#iEUJ>pFCs_f35rFEZZS+(!E`m43Z{W;z_nmHxXy+;Lvx2mW!Y>Oclgx48BUR$ z+YI;haNGbg!Hr-BmYoz!6viMhit&4uX>Fb~`b?gH5$2i$FAHF*e6uEDu3?(nHS0Zx(9d4~HQ zIPPV{?~jbq8SyAP{p5^ztVHJBWvmxsy@(M{A4K+bcvx<{GsNM%D52NCxiE<2@tV1GJd$Kr!R5SB8P&`A%*JNa z?9w;xZWH<{)K`NwU@a&F3KW5LHmU9b5d1ds@keZqZkW9PIamGjWgq982@~PhaI96Q)I_{!~GN-o4{u9G}r>30ma~1 zH@8{s9l@OLG_2tXyA(E&4fh+?=dgZ0NyQVB?bK8AU>%*a0na*72r$D?e3TSf8;So(Fs{Iv}HJ&H-|PX(cWZ~ z-mdbgY^r+I4R}-Z>8}`HB00;9&#&PAI!PTq7Ea7?Oxz2K&H0+o_h;nPod<(R$_m5u z157`HO7Ign27U%r;1?Uc;SNvT8OvSV;qe)SQzYg=!~H89za^>FzlNhcTOM9MKj7pc zrr@+ZJXtT`?P-<)FpC_2$awe*4}T}|W6EI*-Td@+ExXM`9!n$^Q<)aVmk!a!w57gX8LL9CI#dHWn{A&zR zJ%}yZ`$2Fb!M-t_9P< zb=KuhW?z$x{!eS_Y*_u?<%udCwb{bD_Qi%ma6VyFfO` z0e4%Mra9s9yX`qwbHd|yC7dF`7Yz43aNG;#gZse!-~o^e7DRG~$8Y9V7q=e2I_{xx ziX4B@a4&>o5y%6J!4j|(%e;ODA)iV z1CO^?wHpV#a~Uu9uuW3W^8cHB-q5phd$j&Iy{7{o@#tV3O$hJ-jxU<r-fa~T}RKzlg7F#D9fRsx-G)>s91rG8`lCt= z_ng-ZcN`o|K{F5!62OI^IcRYv?im+a?j2CUeVBrU`YbXZPLZjv({b3h04~3S>RV!ncYO$$ zFLiAd;0FO_^8aNz*d5r!e699SaI5bA*%*tIzGX=ILevjj0{VjiU?8{@q(vqr*haYb zw6@%FP{7@Z;#+kW?WI6u!`soGLD&xlL!2%;rzVGU#Wevw+IwRnIgn54>n6`b*&c{v zO39!akB9hbqa&S5kJMCE_^PXJhrs;A-$9I>zG&=Jenn-xZfXW>BIDjM{W6Ad#)8Yh zl??!tjVt*x=WJlvKlVz?M+b-aZ zX(vOm!cle)#mZ0k9jzLg!&3!`eCs&wnpL~TMk1%Nx+;e;SWA5m*HryuI^)pg>%&zR z<&AZDoLZ8^{HL3Il3E>BnK=NjC9LV-I&eL>0c3(3!3^W5X<^5Jw~gx5KH%-GJ>9ebTGN-N^`@(_*4P4O?7kqFlgChn6hEY0e6FYz`bBT zxDVWKn@f0C>cDcbb^>dq@+dZ>bs!Tt>5x8vaV}T@7J@|}4=e^tEUC_6e6r194z}U2 z{gk_NSfku{IKfsco>S6P~gcf zvE1XQW*0kt=3p2eKT;m2w(!3hKXK5BwEx)9Drk$qI&g z+k=!hQg89U89zN?7D?P|JUju@#t!O7LWpSlkQCeYVk~I;QVLAlQ!o{2`H7);28v=R z@ZnIXgl={KZA3X7jf`fW+DfhI>trZI5lEVjf{_o?^~j~nm#PW#TEBX7 zT0QW&dEP&fEpzWoDu(N$J_ZjWaR-d2127&0Uw}j4FsJ}ug0HM6nb&X7Q%ZrD@8>(6 zACZ%+qP%w_@s|jl$ozvQr(a`!M16o;`#l?51_iwB)Vu+5I=>;6v!3QF#!h;wgz3An z%HhbZp`!T-$80^><-;aY`bD(oM;I%?Pd3f#`pCldD9W96vKOOdlbyl-4j>|1F+K(& zlD+YeNx{!lRDoZ>ui!Uu9Q+UbZc|_;goHrA>rQr4^AbxUOk~+dt;zCMDG=X>jf+2^ zIsyI!e}TWjN$?N&*Sgq(xyf=0X5lOcf@E3eqg2X~mS37I|A)D!qne4Kowy{;eN}CK z^3xS63b(+=afuVope z77?HMg`&EuigDOTJ$;F+H|p~LR6QCiF_L3oDq9vkhf!*$l@fKc65$aE9x=lmD9n4c~g3ZqEzHzr|?U~UYWfH=?;Gz0M< zp`(3@92%+1^cdX-$(hDzb2V`wlbLS94jhPV`_>G$3n6TNdLqxa-?5a3o*kfbzSC*E zfJ4Kb#^(Blhr z8T7$00D_<|=m#zV{lNemtvRmChsmk@#~}glH99G2P%z=|qPT;~9UAZs)03yCGFpc= z?kD46AWWBnG%yGZ21CG5Fzj>>7pil6rScQ^Ya!&vmmp8m-Zn$)c$=$JFcp50lw;=F zdN_O|LMdn_muvrw4tUQS(s%0AL7_vl4%(7~bhJl;Q9z{U&nDW@{5=MY1($)#!8mXQ z7#|sJ@d%l?8}t7iI>I?n6QQDDiOxiSI7LdU4EF>$CW0%$Brq9dfGOarvvE&Wna}qo zA609DysVa!bFsH3-6j)76twv3G!lP0BYPc)XjQ3`ag$m25pT zd%-Uz-=i%1R9HpQelz*L0rt!@owa+gbAohvTsCn2ABy%iXDn9{=VsS3coha zb&O}BbTgRk7{?wr{%_&$TTeHxt+K`hyyx~2|5XmfZK%!xw>uO$P|Rij4lobcN2zzR zFF(P2S4TC10n}K%50!tUTw#sFM8tiCHLj;GbcNObf6@A9x3i(haZ#T7v)gx5SE)L3 z<#X*I3Gp24jt4#H|ACup`A z&NfSLPo6Md^I=~GmV*_b06YjD0uM)eHNUYQ{sHtK^s!a;hdH(`y4c%F|2q2P>ewHt z-mdxyd5u4#we$IZMSE7l_y|}9Y`3mvU%GXTS~5Q19nxDOpMtLRYYJNtcfZb~%w9Pk zXMZjBg+STS*7u~$E^8-n!f0-PqPq-5JGrL+9qlQ?U>#V0x{+VsA528a8WgiH-_Q9d z1{Q-JA-K~|}8Qv%KpT#SR9bjVKy3{d41kL@MnBpD)+F&v}c@JsR~ z_qJe>$@%W%9R(?2C`xaJ1mg z&DnfNT_t)VHO}#Q-bDW`@HXh$ZP?JhqbHBNbigpx^6G%Mmmck3!7S12kO;64+5ACm zPpM=14qK7g)JbQ&%ir(W49k7$2JL%}o^oSW=Cl!6`X@DnEFERrHKmSW8HVpWhTh@I z&lgqkNtZ(A@*dfos0`)s6LGtSe5l zRx_^Qx=+8kQ;Ctd5-G#zOANjOUxOpooB9C#5tr&&AD!|crjLiRUjjsA`wceVhHZ6u z(Rn`4ca$9k--90_IDP7oYXjbK1BH1QnwGf+`vpKmwm)K78D`MsF*SUipC~&9Otfm( zy#apuZt`?)bvGBvgP7U?=b`>Hs#PHxmwH`QiqZKxBRx^Hz7Mkh3kJW2d^q`6&9Ac= zEJDXR8Cuil`3>FUAtzS<9`xJjDb|CI$>9!p-!TBw=!dJLF(7fGMG6B_Ag);-*NA=a^ zc+@5NJ1{@uQ}Ns7zJP?VNqf1U59vrVX{mQww?_Ob#tX-f)Qk>k#GYK+h0$4eR%j+b5X zBYibZ7WZCY_RAuk-)4 z+Sjxu#+Qe!NSU)uY3lPN;j0dGPP_E)K=x9Nux+J$WaeD;9cKAj!#W~mAM|CV;s5JhRz7z}sE+adp5 zPQZJMdWZiDw42NX<7OY)S}ru(am{_6i*b{8SA-jzz@vBb1Xic+6AZ*nf41q(b?SEN z9~OKK25G=lwjv2F%yuQ)ft|P%1!KJ6GFjxRvPPK-M+&E#(p*$&5KM95SZd-7TlC}ktTC@@+@-xu)i(H8-+ z)LE{r*yr%Kh-}B8JJ#B;m7f&JkxHaa8=vPg$}R`v)Xw{5o*mBrm+RY&HCp?$)<(9X zbp;r&wJyC-S}>JzVekaCnkQ?j(VKwYM9cO7*SP&;@lxi*ZQ7Sb z{4(}~df*O4ODyBq&Th-V#_u9@@*KA1d9c+NzkX^h+YZrGb7@5<^*=OPYK_@0jl>S3(GEYI z)Rl{Av-Wn-rI9BZcv=RQJKo+!GhVN@(x}Co&TuPraE_d*S}qBAyXmZzQY$g7WP1{b zjO*z0tbnTkJgDwMw?{y9T2fx4yV0rB$>({9`iH?v@CaB1R)aNQEhq#E6fuxY|2AIA zO1+8nZ#i7rFWV@%M0OtE?5N-X^=g!?K+@L5)u~ru{M7ib?RURGwp} zFAI2I)_C>%;9lugtg7GLM8RV(B{bn)_l_fO67zb?i{ zMQ5L9Xjiw7#t{}V1p)73-JlG-i3GcuJD}4 zUZQTB(}~BZsi79~{{?L&Ss5v&17zQWzW5T^=GeZB?JF+ZChbJC*kzT8rbHnkT`AqX z9dIqU>nS;&COpLRX?@AK&rzF*np~yqKf?Ux_u=2O~PoO@>(UGmVc^jPBji&NU?dkKB zqVo=T7uay*8`23!l>~b;tjwDOH?8Dez-8ho39Gyx%=PI>S5!6{_Z8NhUgiqxJ=n{@ z```nx2b6;k!AEAQk5_Vq#TzI%@~hgbKH|K>S+TJI2F2USGzv}Tg+SlAB0bP#+2MAoE=2lW6EHLLcG z4c6QimFF_GRI|16lyLDH-g45j)lpdF+OUG!#=7=u&At()Z(;oo9Cg^^`e^nx7&og{ z70GVivnVX&45e!G{|wDO^CVn6dr~9)7h$ciDK!?Jz|rc9w?L zKuLzxKF7#?iJU^6y_uC3Bs^6}1A|Wg+zE$Y9Vn7~4(0zV^w~5Q8~W!N3Kn(|2V*c4 zDer6g=Wn7p3H|~9g8zUgnU~=}wPfcJkr@HTLpu)TmfAyI^~95$>$M+0bdH}6DhZX& z>cRB^Z?ew7K`KRd_cIwd2kxk3=dqjI8;ezSAEm4G>1icO_GmwNiL`R?I%%cpSo3Pn zl^f(>d<>fco%)m5NXO>4kaDRl(2kE{FOoRGIIfH1XzTdG$9Qh7lU~)|Bz-qq5qHuP zFttff9w^~-$L(b*>hXYgfp$I{4ePwII+yY`>T~|@uR}=1M&#h7Cf^MSA(jwuZjXl< zPjE$|sg9#;Z(cN3lQwd7VcLPQNWmaO5)Vm2vg(APn}pZJ$$Sf^a~`L2hG^RIv{Py8 zYt5@Pc@d-{<%4~mHV`L*woa0GZn+c6t2@X9vjPR_8QGu8zFlG;8N%fYM(sfd&`}NF z6!0F_)8uOEME_E@c3pfN+kN~kBHK>bBwJgyBBI-w{VqUmk_kj=wDWnoQkDX`0g*D#b`rbj<(1V{uViS85cK@=R@dR1@4j?Aj_)hHOhjqhCFeM&$IV3 z$faewHL~_Bi=U=%Lty9O*PkucQbzPQA>97 zG+r;B%37OiN%5G1j$BKM9AtYhy7R$(b`HI%gB)C~-emIbDh9HX$fXHsPOVD4cj-l68&shadUF9ZSSBw0)%<1Mq&rrbQetK7cUQN*EcO-m-%@~p?~ zQLq8nCFW!7%Zm4Lwj!n2Ji-1(@FcK$Pq8n0o7gJz5Uu{ZEI@P?i(HN>ujirwrKiCb z@C+yh&w}T`^I+?lvY7LpTsv)qbe%qlc_3=Prk-;}Cbf(8Om%{Ck)D}8&kGExo>({s zkt+V9H*2EIGJ9{~$PL1w6a~$-aes_NcHGF70mgCE7-M@mm+*eT`-_rL9x25}9|avHlh7-;&iXENt7w`a)IXv&fkCVMt8E)Jj*HS7LJE5h=gT z@cjkf-{2(p2mA~E1D?(-p*uUvXYmlLcH&{CjvEiZLxnhHz^QD`30 zeX|u?k^c7@j^1!w)LAw8@>Guhez6?$?g??M=;r*oTsr0=74r>EKWHui{lNe*5L^n< zz#!YYj)b*XRa}|MOzi)a)t`BXG!_nG%s$GJQzhS+>io1vCB-81?l&$5Lp1~p1;fB_ zFao55k!}|zfm`o$u?BzV3}VJ6Y$CC_hIJIyqdTjgzX`YBgemQBrgND7K#0lYuqC!4 zTNfCP@o-G&tQLJ2<|wR`eh4?Uj%KRFke2>@Om0G#pwdg?ION47yZ}0p zmidNuF0^-aR)7C=cG}CF_vt1s4RI|~dKl?-_2|PZ|6oSu2d6h43u`d0;VE0+xb&u*~|2{w?5qypmM2Mz0TtXFhadq}EHvv91_6T$haq{qeH^OXNjf-*pOunu8WU@iftV=f!ULMP{!uex8DF6Vu#@$P5|QyEVs} zM?xHrc1t#Ih~!`{lDx*yJO|D5U@Le5ya-+b+rZ0b3is5!L}^#!R=Zp|hfXRkM5@*r zSFb?19qa(Ff}LO&C;_ioS4;k}BP9kiGH}=%j2I~=DHhqP4D0JyztLHZz|M{o;W+C^ z*;nYI4Ud!(=tSnMGqmqQ`yMC*?}HD(9#9TGbO(FZk+P;J`w+K?+}r0l?jNY9PN)elhq z2r9u(;28KBRDoZtE9V{I8bO|6t*#mL4%Y**;0Z%du~{Vdhf^f)NyGgs9KSKMoEOeU zm?>T@foXzfI*OqL3RAK!uB(!31-;$$e6>4tJJ?>{hR5ZhZha>GoEIR`pvj1 z#k|no6D50Xx^a_FwZzAT)uOsMOC>VXSDj63j1M>~Ah(ZMY)NAvtR(r1rt@QaLl*7&Ip zUjxt(#DYekF=ztf&hBSA@te!5+~Sa*LhWHH%py_G8xKukY6jv#0=N(~2Q5I$vwMiS zzio^hv#OSc)T&%IOFPF>gQ|N6k()HFgo3x`&tp>Kz_Duh9cA9Re~qGd}3OUr%N+sEHhBI~mptFvT*P zM_3mp5T^bNcd4W7evah+4EM$od5oi$;;vb>>rBI&s;uTgo*W&9rL~SBh!&63d>012 z-E|CGDG-_ent2LzJu%$SMcsjg8U9Tij_sHjjyO~uj72F2qfZN?6nmOf!o4AU|>*^3QVG}vdR&KV=#rh7LCjIvD`0it8TzAtg)AYN? z=8C!;W$BIt4A<7;qK9Yl^Dumt{X5x;Y<$D#xr_a5kOS;}$h+B>`;hmrRpx6rwzdd* z2aJ+S_1iHLV%ZO}zXpiNR>0U01Lq)kOvlnC1B~7C+ww9UPZ-Moh(^F~g=;xtilNj^9F(}61S!?iNJGp&$s6)`}?`_{j zKk72ti;=u8{~SiogRS5N@FI8#Yy&Ub%$rB~LN;3Gd??1u5b^>?oc0l?>b#NaZEC)j zzJgkjf)7kwuRyik#`Ri9PV{>COr<*1ggrd#KRdf4)8URXUfKJjk&m$rGxH;#=OD^ofI~LSyHQQkVYZ~&hPj*l!>Cn&FM)*ll@7D3 zKGF-QxAA3s?DKq$&Jpkp_!fKzj)L#O58%hh_!e~ydb{ZOPC{hk+X0cBB`Pua$;S5! zs)-FG;{{aP_;&1-<5TsZ@?uq<5#WPP+fstgOGw92JoQ-Y#z{cW8>Lu^Z2rVJ`yFS0 zSZ8Kh`y1tG9bGO;)@9VE#^3}7e_Dendcqxj^^{C|2GiYF;j){L-Cx-J4Nh7+<7iWN zx~aE}s&OdEdpmPYykUdKT!V)2K>?lZ z(VbA`GMnd^or_s@8?Ky!W7XVVthYiF;!qTApz}XBllgfV)c`d?El?ZO0d+xiSJ$Pb zy#g_xB%1@Vc|frh($K(4?j7`Ap@&pH{33b#O`Cl1`6Gi{coD&czPD&1iZ-}{0|cjz z(b~0YHCpDomv*BO@)S(9o{CTwS#!{MYJ{i8k)Bpv?Dmw2qV=@l3-R0EJTD2W5)3PIIggj*g zt)~){wWkW>sRN!mT2Ibu1La!!ov=KVte1>0#Y;2zgKARWpm(xne51qnmB2VQ%2Rq<$^>2zOlsobk5?8n7{K3N{c+-XZt zwYendZC67M<~-Qc2%hD%Q1dA4t3NIn_}b@LSyfNFD_kGtIfuRVY~{!9NXa|!$X!2ob;ZLa3n4j(;ReRHH2A0L|5pP96$ z9Eb;rB_mPT7_``3ie4HR1O|hJ=XyP5=XpKj!3OsK0czdgpf_QlEI6c%(=ihng8EQ! z;T!r-Prb0_5Wk!ty6;rdQZXwkJ6(ncs7L$9@Kw0*d7IK)-(#=e*-xOlrQSF(>i25$uplo={(;hXeb;3U)gn87FfOJ;e;v3U+yFAc zjbH|t8JRKhXJ({Cj2-S4YWPq&sD}5-lcMT8%p{vb*@#UdvvO|Q>^>2`HJX7+n;%$+)up!bO{SJS1SPoGLk2I}vp zi~7kBr5@w;Xh`l>Gf;MaKV7s6lQdU7hLc8}>vKZA8Cp? z$Hb|oR|LJY_4hGsI3d=YJ|<&7Kz&6;!v@lnAl4#B|MGd>h2g!f>M$zJTpwSlt1chU zT>`ykDo1_gF>|&_{hR9tO!k6L>?!s32|;gyb{R*toJ>_3*6r0;Mtehb{gra_$v2S% z_{4o0N+P8vnN`tiTKx;y4!Khjt>&Y?P7lhHs2|T)onTq62l(ET#{S?xTvuRO0loxs zminrzs^A3GQJp`D6I5$SVlHa-1U20Q=>#~t>r{78&r?0nE3T$j&rK1rTo!-%H>IBy)btJ3uf5TfIY6NK`qDCIc(cI zy%e#`|h<-x+zp^Ighd$KqT=Tzo({ZeRa@#x&FDfAFBCvQ_I*UP$yCu<<|qh z7B;m(9Z(lU10V2%^HW@l__}J_G^UkZwWhLM^Xj7_11@`11kd$*>S1#Mh)Hp-Uhc#q zL3c|6)h#P`JwZV=vmO~riO9C|BoL*Dwpq2fNRP?WWg=^LZP5FpX34284pltG%k^Qr z8)K2FHT|BZcy5-WwqFx@82i+r>w>%w_rdi+?^u=1em~8XTf^_kEmV6lxd+`a84ejN zS@4Kd)$)5Q`p4_K6H(9o(X^&>lRfeW}XNTq_g(B1I_&w**yPXIv8FU6+Kv$3g zx`FQQCcF8^s%MC;f%dYkHa)mTds*020-X)BNLpRLrw1%OK`+o--FhR>Tzbd=jH7Pf zRKKVDdLkLkbsGAcFY!W@_MSX6**DYuTI`TuFmZXQ$O_=Or!NDICjD$ zj74m#fXM7$by+icUun#(7*OF}}5J~X)J%i9242FQAU>Fz< zMu2oM5{x4KM__8DI?v?JkN%)urNg(EZ7e(@dwqUY1C6$78UH7$FZn-Be>h?-8sdFE z+cIz$ZDujx$@2R{?ViVet=e8s9Ob3#@2chXG;{Xf_|4>KFXe^UCQx3%zVB(C4zgb< z`jpFO+@yTZSOy^bC;a~Io{FAfo_H#v&i8vBJ7k=p_`K`|WZEWYb%5Qh=&vo{*SK<@y()#$?QBPkZ$-cKAbA?lWgrH?$ zNcp9Ycts~$|1lK<<{-Ua`?4_6M>IgPC0hdy&;2*h2i}P7e|H4OK6R4@qGi$(3U{EcL+P~z9roH zPuhD!nK*{6oOnvJF}T*%;txi6Ln(S11KXN^O2RG6q>F9&@1w%bc42D+a%bq}q;UBO zc&yHh&R$Qp{i6yZo1&K?visFZwcQWCZTfXDLH8bM0+RhwCs5f>bLsSV?GJVBm;HOb zZUFk(o?MOyxo{Ta*?)#fXSWVJt3`$+2+_&iU{Wgk>5$s;aqP=jk@7cRGOd*T=Yw8P zv{Sy4ed%H;zm_aUG5+))>rzZgrQ+97;ULOhGOd^LzR@O)73??o$n>S`r$2AHtdjkh z1NHP2cY^)5me&s{*e8JPntt6 zDCO)6=}`8o;Y?aHj{U3;OeUtXU%cO>J&S!$oA7?>gXWNy@>sf9x?mpr?=$JiWGeej zc6*IME`R);V9pjT)s|aW)?~l;oL4Va_A~2ApXITYvxl8oAL(s^+e`ZzxMl4^pRg}SE3vHP@YFnnGc7nD8 z&YcBY=5}n$+=Z`kb;cR7p zANw(hX5Ey)HUQZoMr)okVx>;X7E77hk{k3U>2ItUL%Fq^=jbfaI=`dSM(eC`>6AD+ zOSMk#1wn5MebctWrQ>O9eC3M{cz;-wC%&)O(;l1y{NQ*njPEy`=UK7-JkK|5m$Ln5 z<9VJjo6h6oRbJ2G@vJA&|3BKc4$~PqQYOn^Z1%*I?B6|UG?8=L|@3xVk{AwVa(JHVg==~^0t{28a zB;+e0-^#x7Q^g}=)Y|GLekp|_x$XU)ukg4I<|Ays0pEi4{QW4{03K6Yujb)x=g zaRuh~mP7`(+&828G}r>30ma~1@Ej0H?Bw?p&;if$_g3%%coDn=wt<(yD>iv@W0iL= zmU6+dD|HEXD7?KS{Cq-NQ&3Nz9_{7%cI>2Mcd(U)N%@Q5Ri}LCuAR_K@ahY-sRSY7 z@65#l3MHTycujR*7WDSe-!F79Io#t@(R-cxHypj)Y6*H>^%Lb3>Q1H^zOC%PiOyT# zZBPo{QQxAQq`w9(kNPM_H>wMl*wnuV%E0?vT4g;V_wolV=T54QVITVWJq-64m;MK$ zuO_idYoJ!5-AHREqG7eyxU~0#v>U4L(e`WYIWFxZF75J=b_12Xf_wg2yTqm4zH2!0 z4_(@GLfSRZu#wDmX@3;bZrJtm>CeRRLpVRTi|A`$5^J0d@qjH_ehprQH#Z8K&v(P%%|Xjizj_oID4 zMWfwGvu>r%_J3l}FzZ3|zR=^gjn<2z&gx~k^bVnS*zx`Lksw{um{dq8{Z-s7px z#J|FDyt$!F=xMNtoJ=*W$7sqtjO;_1yVh8OC^SL@bJs#(zD@07L$IxnA^08lf2cl~ z*@swt3WMIybPT)Ebto2U)BrVsyv$h}_(5F|4Mg@j zy65xv|4+Bh0K;4F?7G<@;xtG3g0m}!bPH%j40`oJ10eIiNK1li$ltM`5oipWfH=?; zGz0NKWFoo=-Fou0nS$n^g;P=5&qUplzikU!u^*WYHJRh3zN%Qy>tp(jqK7e?Kgi5o zS?urVr#dm&jn|c40v295Z1&3b5~Zjdte~L0*d2?NzAeIT6-tv9W+eFR$E}Re|q9{^E@Tk$(g<#y0RkJt$u|w zNxu)ak~({)?>W%#NkXT+i?aj!9YH6M45GWKUvBEfg)Gn{}zIzwb76rEA) z0=in&4@Fgb8%MRBYinF;yrrOOThNXD?w|+g2}0fmJwX!812QPAw+twHp(fsXTW?Qp zltXnh2IefEh?4cWk$uU;MHrY&973;+esndTI-3bU>zPz^E(UhZ)5kg(goD_2(jlq( z3=BQ{<(S)L&{WI=m`YqhYbJ4-6;LwOHloe!_eHHAkcci(U!iBtB)Qbt^?3~vERpwj z^meOuPjY6`UogLq6@%#MFtD+$$j3(da{#az9?1TsAPo!xp$xwaU1A@hxYE_CAQU#+ z$&|}sG8ha2b|OgO=M-OJG#2d)6)RqIV$5Nh2rmu~71 z!#e?;iQq~wNzFhvNngmuP%pf4^(%Kjut!6-)!ysOFokZmCPR=TH;dwdhO-*MaNRjF4^&^|sAA9_noj(;eO0(3t~n z2Xoc>kZzhwx7g9W1D$!`PH>m{L3H&=HDBwhhFdsS){h--g2+ZG2iy(rQG=;V(v7Qf z5ob8M_o6c&+z0MgtI#z82dTFKZ*+7YKqnV001MSuA>CY;Zk40E2%S8z7%Wlkp0T{; zF5R9ZOuS3c$p_28ay3hIb>m{GPZ_CrUg_;pf1{(k0;K}*Ab3c9OI^HH&NIrsVo{Du zH_Q*Cv=Tf5R;kOVGp#$RmCa!=-O*i*&Kj^56skgW+i2qc)Dy)X3Yyg~bCeZIMPMCR zuc~pGVaD)At!#)>IUeL#d=zW|kAcV4aC9#jAjf!p>g5!ck~)JY6M^z60Oi|EMZ_)Bcv z_g}U-zt%jCKVSZ&gyv#JI3<_!b`)bCE zwn-l9Y^a&+e}K*&P!2v+FN&THHO-}0I?nI;i29GgUhoO{6nqBufzQEyC)8cZF9p5c zYWnWfw#&^h-2hh!97^iCs~cYldS6vN`Tu_%qQ=H}-oAoo8*KNYBC=z=*~UyT%{TzP zG~=KeznxL5GhT^~ZAONp_l2W(NIf3X>q(u}D|Yk_J9-uBSM<#F=6si4)I{U=OGoc3 z)o+I#IeT4t{T;op9lay!A@t&Pe2LUqzj=<{H;&%7>QnU02%GNGJLu?r=ja_(&0Zxw zycn#b z-75#|FX;RV;y9P$Zb$K?qxerZ)v&}eZg45q$uO?} zbrk>WrY4}++DsxY#W9Yer@I-_UbP-QGZd1kvmvf=^r|^}=cpe%uqi1tbliR8` z7g6YooOJBZb?mFF!LMPjTe#2Vr~ee*WI?BfqgS)LI?Nh9R&7E(`U;tw6Ht+`&OY+0 zd*pbvZ!}3bwV;!(sm)fT6b_k->o{)es(Q>`=14Ab_(d=FDx(+e==szn^vv8@>C#KR z+RUB2kl{HW)B_iQ7*HQH01dml&Qs>~>DTm2@98*U230xwRq20m&`|yQ25(I2(^VSO zT4=I_91E39K8@7i-F7tZLq}2~5AMH-+T!g4UaQCl1btg}go8r6vdyB63c98(`AQg$d&XBi-q#Z~C?Li075p)8{k>tU$ zAm3WErZnjNMU$6ZtI0c2T+^$H-sRS)e($p-)FQ<<7#E$P>e5}sW9a^DL0uIl+^K$j zk5p>fsn>^SqrLj|pdAp&oB542EqBIw)>GfvFXB0nEtj|UZTWYu^6#*<p3ZYm>bA~MUsEtp|MJ;l3S?|fXDbBpaq-Rgr~ebO(wTnGgpC_Pgxm}H*_$oad_rfWXdJ``-VV?#Dfx%!17z&1g z;b4U2-uY->UiZ)WD9Bs8e|{KbvD$PmlfBAjzl**vUky6llq{C(H>txv2E7TY8Pz>h zLM89KH-xSS-N~G*& zLphGHuTZ_w3f&adv6o`P+?X}Wz>ibUOF=rW+2qUK^8Ntf`6{RCjn z>=0cGwT0p&P2`6_B<5B_G##Sr)P5XA5+#3XiSn^<;%cFGQf!D4AP{MJn<2`A=qB|8 zjv|SIpIM?JEJ8#dP;7{jArMKKV~FNJbi4WsN0CJ7`z%p079pZT6dR%-1S0)!H$*uQ z-K}a-A4!z)xg{#WB1CkIVndV;fykJ-hA0=J1*$RikwjVhEm1iZA)FDy|G z1S0eAG(<%Zty66;f=7Jog!*sQV331w>z}cX1R+l<=)3%E2N;w1r|rf|mA&Qgq;wK1!NdJX~$kW5);jB{|1-tk$=aq~fEK><4A*N## z8>Vy^M8+*LOf_Jt*+Vr!A(APJv)eR%_?KhiFqxl=o{FtVR-WPT!*PBOm4wCV97!ta zC;32P31`R-n(rv)4qu9{Y^G1z^I#LnU2IrmVQmB&gC-yjGzHB-d=F>MZdzT02NSCY zW4L|CxWv_&E1*E6Xo+D>!1}@-Y62E#igm)z5^ELaCe~QYLa|DviFGr@BHNZ4)*ni9fLCe0 z*$;*ICYdWI7(_Bw8m22?8s9_h!PS|VZaxw8Uay(9Vn}35|K?~=F@M^xfy#tOWa}e_ zZwh=@^-wp-r+29s%E4U5JIa9A(d(v`mgo;@A+~1c^($)MY=zKYM z2FxNwYmJB7VVVo>0Q10|;4Y92a?a%8d8kbE$Ds=K`{;kU;iYz$sF>-f%wx$11QI ztO095AyA;`Ox*u5q)b+WP=vCoc#+g(^#sKtDI1K3bug_b3)r0@3u;JIU+4JGdsOr7 zsxQ;YQHne3h=cHm*fK4RhNyGXYtgnMNz;5s+cniG!|5$q$_^ikO zkAF8)Q|q)=ty%}Q&Zku?Yg=o(x6Y@jkV-Aqd1`7Ara}m*Q3$Im8bT_BC^dvA8bUM* zAxec1jsDN~_5NJjy@Rj+@A3b?ACK4W`@Zh${k-1S;d6bi&*>i8RatAyIp6i)W>7lp zm~yJQurmRRt$Rufcn8qCOgXq!7WNJtHS8c9yk^jU$FrFPvC~g0=>td~GTGo!8A-aS zim5^0OtsB005`9*Cflk9uUFoHXO#CDywA}ARD`}jU!sHPP-RtLa7i*Z|E1SR_ErUX z04ZTF2|B5bf-JUjgO>0Wq_5F8=rH;geTTkBM=C4fiJESx9RUTqSuL7JH$0ePM>Z<^ z2N*x1qv#m=2^~i#(8SCXL(fI8Ko4x6u!PESC42mhdN}zt9;}jQ&RdptC3_HsCC84Wp}uC&F9_ zM?evMmkim=)9NPs^ryYoK^8mtyq4gLWtD}_MZxGiR0UN?{dm>@H{#1hFkIDXAf(MzN*~87d>~ZQx?6jRT}U5iX{kBv^Y{Nf$tB z5o>1PQ5mUjL)TiPwpdcLh0-6JN$zDM3xy+=_KNb_!D}CDHd0_^yek_yUOtXQrn~d= z8YlZ=EN>hfvFxqN>k6-1tT{`8WqHv&TF~0ODvq|zPT~l!8OawmiPo#C3xSBO+2*ZR zfyKp|!8lb0dpR=MmtkSYaAf6cVLf<;SWY9Z2O^gDsz#O!%#Tt~D(Z{+q5fz<*^#HQ ze#?Jt)mS4yxLA91Q~Wy8#8z%s{6H{+&|owK4MoGyaFkXN-^P4$IDv-^3Qoi^J)UTu z?ES2NI5@8;UB%{;Ahu$MmU9uj5wT`g)5_cA3))kIu8o5Wx=D-%y@oWg+yaGN25bzY z38%^$_%p&%SSSt-)}x2Q@<?%StzS4zIn@Jek|g{7RlbFi(nAoYmuytx`G6;MQ+CuYlru6)OHBM!3Ej`CkZr{G_i#{6?Prz*TzkDnCbsx(9svS;FItXPp!?AM=mE46J?IMEKtY!_mg@!KxW!D-Uk@3*OXGeh zHi#bxP4*6EBh9KVvVJ?-R$6^8=^9agc;7>@Q+v05R*y)zW0POZI*o zb`ObSJKxa~9wnHyv8J&_uI1;mnwX~hlBw4>xQw^pXtDxc@J=#!h)ikEp^lvu3rQB+ z@~&3*DM(Mp@~fStLt^#4$?~%~xD2p&feaz5tKy>F8o+b7J&!h{7to97CA0;-tgY14 z);q*p$5UTTOaX0h5l_iVo1FwmS8%uB)qK~=Bz0zwSye~uZZnHCjrA0TiS68@vAzO) zE0b=A(pZm^d89taMkW_!?t2>L>o~k&Hjqb81ZY=;m{pyUeOWamlw!Ozlp6`6wT5DU z%_HwUa|218?P?_GeT`%fuQEv9MZ3`+^d5R2?L~#?gTO&j)wGG0XxH#J*fgUN+S_Q; z0l8>b?A2&L#Q7uh3WWwnn{9hDm^}1mV=!avFj+%_Y0AfzmaW%Og9G1&<>u;0f_k>b)d)u@x@%NTDAp>1#;epu^}}^d0&h9YH_1 z3M;#PH^-j$K>&LL$;ys^DHigPHs+5oj-q4eCv+U0Kqt}9j@`LCTbymW6}Y>mD*_=E z{e`T*@|&BbO*gccY-gXvB>SRt>`9r@<4L$^kAJ|I9ks`~jY8(jBOjT)Bm}LdekEB)&o~HTX`g6?&tXPA7X_p9 zP!&`ag`o3$d23mza8=X(LK&5&Cn&ou?g!;6AN8pQRt>l6C=}H|HBl{88`V)N$O-m<5=w2ffWtaTtH&SxULiWc8{8%b8{ZaVmbS@4q?FSqHt6X z)kh6b1ZwE&usSx`H`d-m9*modd(>wdcO$Yk?qw#BNgFiMM!Cq2%gs2@ln3a>={Bx( zyv&z;>}uu{Y*n4jNEF-uxguMDY}w1yBAe@@?F{%HraI$$kOe1@)f@05>`*^Uf>=nA zGTOuFfI6a1s59z&NjwqkYecv73~L+f>Kdm)DQJX1JJ;-=w-RdJn#0< zi+-=63qg4WM4DRn$d?VH{JuuE<1*okC;q zF)V2@1hJK0DQN_xk-bbG{2VE9om71*E?V^vvO;R+Pxke*wazC&Y|Gcm7z1N08iy`N z;<9+ZIL)b?UUk$z)ljxLJsRO!xea6i89b6G#O1nQ_(a>o&OYT zFx!fq%t7Ak4;l^lM$ex!iX+X_sZ3G!{)=$P!(!wIZM$}xIA_kJ+1V2&&7N(agS2y9 zCf^^sMDHhA#QWhyGo8|AAhDcprM_k@A@}kAOLUe!bHA*wJGd&ujauoUZFE0(XuB9s zv3=iZi)BNcOaI~LT0QU#_5mEPvBNGB2Wk6rWbVDazdPJNM6y`S5#{B;yAjPt3(!Jz z6S^7Q;@T>(ggyh@;r_z!14{UwWIYp|1X*nH4_d+^NVoPf2MD3Eh#wy4TA&C=BCa)v zfoMm|3J7BPKk8Jt1k&ATDO!ed(LLy1w7gubcA46Ah>V=@s{E7MfTOIcCUiI(iJj)# zf_Bqo&QT3`1-Sdr{pbO-5LJw;(O-;>zpB9GEmq1DKsHRuuaC|X;tvUVu78R{Bx z>M`w@g|frhMRKn=DZDvkx%ea(oaE}4ToId$Mx*lSaz#tOGx5XN3RYC@sFX$ z(GzGLdJ;W_o-P~KLRz_z+t!gFTw5|tIZvAP{aAt$wAJN~RiZU+4VdJ(;ZwxE~MD`;!k z8t689aIBnMOu8u9`+d_KfQ(bUnst!mI9pCEe6fYUXgS;9y^6M@9jE}khF(W+R94Qi z5$+UYAt*|iFxQ^V9$9iW8?sp8uUf)RNN+M1;8)p}^$m`CS}_U-Z_DazZXLzMXJ_;x zlEor_Q{EnU@AWbZ@T-j1LT4&t%TV?%n1X<< zgZP$l?yN`=$zsj_))I;#{oTvlfL~?p-TiXch1td0-geH}N3sryj&Q`X{!w0V94qlS zvzG!Z%8P>63bjUUP+QavwMQM|Dmgj-JSe@gc?uLI z$jSNXw(6T!WuD2_dd>n~v!A#kZ!lxvA{}dq;j@Zts%1eOPJItDkgMVvM_? z3G49r8ru+9L(woa9HpU)&o2pCnl{bn z%l$YKu}-ZiSGlP*502RB8p_LnHwjHfQ_xg24NXTgDvS6GC>;?AAiNPV+qOn;qYD_U)zuOfLAn*)hHgiT(H-bcbXR31ET7{>%RW%j_I9+yX1mdn3t4P` zxR$U4(%o^U3x1W27Fo+wF+bt1mweme231xxdeQVS31S`VD{lq7`_TR90kjf5h#o=@ zR~B*nH7??udI1q1BDt4s^;pPaiyCMNd5~72)ySYV=n?cNT3cBO%dT~;UI>clbw-Ju z=Vp{#$YQ4>>exH9@*zDIXFA|lS(_Zi@lHDiJL15#ss-0^K1;`ULnRGpq_M7t^bFd7 zHlj`FS@axwzOq;LH{Rgd^(2m7pLH^$ za@g&{wYSKqzUug z&UX!tkaQ1pmSjDVI2w-F%4W*j1Mj^!bA|#di|pwIj&}@4c(R`LF6l!MJJwuD`yhRc zK0%+N{pd6FIXX~Tf1ClO3#|kYC9#^D+|j~mlEntJ&=QIueSyA22hkz)75W-|Q&|ba zZ+7!>?gh4ly(H-WN*x7LEWf3)55xF2&K#xi%G%+jTUWWf#Nv8~uaMqM&$g1xDwfbK@&nM?G=7 zV;=zpThG%BSnT%KYaom5YpW#$Lpl#tK~+%*Iv-U-)hjFES5SIEDFy^3OyH=VGdFi| zCBy#o&LNV;V%ygV3WZW5-Yml>@P5#mruLo5zQ^o?hf~`LMX#6b!KEH9^-%-#cQx}i z+@|L=i#G=^mjAe1=PqtTvX2ozMP505pTp};v>M`Q^Nf6N!`M%n*r<+mf||p+Al`gR zmWp9qU~1kir(dpF!ntXC+`giNh9tHrtr)X?E+ej2!8Kd!x0Y5h0RL9FrSaSW5Yo+%m^Ze)?_a*bY zjNjqj#YWg1Hy2@M4~_5&5Ld>V8^}~P!c`B*bvZ$#+YT8|BU zl=EzS#elr{CfmsJFSL=hFwYQjxE(jOV>Q0eURu!g0B=A!=teXjEkFy=O>W$5cvH5{ z4iCC%XC4p=>hhM1$&DoIn2dmFEl%rxGmKl%B6KUd4c(3wqdQ92ZDjcu{ZO)RsO_O# zAg(nE0m-5EojBYTZ;nz@*&e!nm82v-!WfdDq>;%e79V1p#W$_&H(_Q|g5TH9yPQ}Q zXLda7F50BVYrqi+8t}c8vmC8J_o4gI1860BuwuZC%o$3lW-{|Qduh9J9Y7cS5ug(M zLpVQ-^3W=@8X2?(JyNzSr8*r=8rA9Rs*?uAtB!6Jr${g#&|EES={4`=*EIX}EC99oQ zN$KvjuuRY)eF)D-VryGUuy-p_Cdp!{NgCjDl<+*-j9x%5qL1pn_$LVX2?t!Nv16>Ud5Pyu?)wXR-hZ9=>1hLS@RG^!y%H-)yJtT`AN>%EI zcz+ac7U1UwK;TZR+A%lzr{Mt4UUD??&vC8O@{W;gt)KEfhj)MhB?Wp>ri{Mj zYTDRrf1JzymJ|v>ta*PWeGTcGc(VgIp<7ZeZUE)U_*oq7?m zu^B|Q8{6lTHo**h#OJ>r2l{z!l^}VPNFE=O$B72c)klibdHp|frj&sGkB-()0&x#a z1^P=v@7SO6En6c|Cqct$;+c|u&Bce7AG3^705q3muB3W$nFpVw@Ufl#US4EsnBD@xNCTHxI> z!7QUyTnp)r_zcaV>;C~{B?jFQFL>7Nh>wsg7Cu4;WqU{+P)F1Wbw*uKH0tUGWhuLz zZLfOvT6dC-HT@zxOiRmY8`;&~ozt8W#5#`Dn7cvjo?x~TO4*nPKks5*iAzb$dr8*C zLo5Wbj8PhM9He-ZfO?}u)CVP@glC4M%C{ zA{V*brljNG6z;I)2BkrE9ISvNw&qghjlgeYf*Fp7Yg3ua+nc6m+$>(3tS~10CFgBd zldQA&dXmL9k5pF%kh`p zNd@C9oAPWE*$ z5?*7wvpzzy*r~C)$;}2a2W6wV=o)k_nuo5dfNo_+daRCd2yBm~1=Kgq8~VLpLkSwE z#e`h0HMkz!4UBW*aIG-xti12|stb4?E(E-c1buuW9AB}>@fzyQFm6GM(5>h;bURv% z?r@93(K3{a?r~fl;lmlwI>PgS z5Uq@GjW!0FSZumd@5OsLT7m9E_oD~UO7x(k>Rmm}!u{;BC*P0UG>+gbK#m}2Qy zDEm`ak6}DM2jzN-gOrh)*Y& z4zHJv42fB{vBPBcP#sLpYs?^#dP~Pbyv3GeDCIdQ&$D-wZNOV^>CME;7?NS;)t$+{ zA$HWB#u1|4Qrv~(G`+oXB^c0<2#6p?wdN2)r+i)x#n%R!R{ehtZ0go-i5Rq?LqIM_t9Qd zh(2(UY2Afg*VNpV>>F(BJ^(~X36fmJ)TViAo8~-De4b7ZWDz?(RZII2>PKiF`WStJ zK1KV{XO)$<;T?N;%HO`W%nU$YnL1ksPty`2rfUhGLpqRPb`XwhnZ(^3aGD|Sy4iXm zE-(xU!))tD;VYIfLm6Mg_$I*|pwvLd4K{*&GJD=VOcrRb)=i>yC=CE2mY%7wAAucB zFlQ+(5Z2AiDs)v#vEW@emVo6;-MwYP5zDzsdB4E>6`exAq2JLT=rsD%HK9%f<~?^7 z>lhH&&Gs_A*zO6o-Ln{`*vgqYCH@8D3@S!{qkqs@6x5s5b8m0;T*_{v3p=-11j5uP zW$2*ICqZoUERFmeDChPzW8W`r3B93lFD`oRKa#A(sdsl?N*n0iodqO|6=o@^8l>td z6xBdAQ7u#()p2ni|A33bcEQ-qwr>*7uxmB;Ggak&$RV=pvLe0_J9f1;Ll~I4z0Jdv z@48H2+W(`-L^Vq>?d%vjO|rE)8e$_DjeDDo_yscB2b}oJnq4lS+Bzp$UML)~h-~Gx zfY-9O*-hMzCtIb?7mLU&Lx%+2Dx&Zbi=C@AYL9n^-sa#(WxZ1Z_P=Xzp{1_TGAkhgV7K)6b(beQ5w3)m83iN-JiJ~dj!suQ0rnD zb*&{Q-nFv@nO))#ISG6d%`>>6enU+P-q2w#ewyirS-4rvC;L|37iXco#s zSGyAAc(tLa`=y)Y(s7m&Hpy~$ImxZUvw^M9(8v@}!)yYjv7Q7)38fQ3D?2(DLl#?dyO!`A zr008^!T7mY^~~W$<_^6iRg4QHy(HD;h>LY41hF-XmGlavt!Nv16>Ud5Pyu?aBvy_i z8yaEPG4VJ0y;y65C{scmvz0HsqguWc+kA(X^E$jYdYc&pQWEhGB{LM6AO+4)a+cGZ zq4-j4*PTjw7t(HKD7+m>kH3!n=#DpH$tt{~?l@^531a*2QpSfcK0^D@$LJIEDcX-d zbG4Srf8Fpe@cQMhYS9r=AuxG0z4;?+IU>>yds2epMD7L%(hh+iQ6icX>5(C_FE zbQ=BXqAX>%4qRD)Vr8M*mXy#c;K)7+zSw|!G~&PDone(hHW#tB>kOJv$Nv^wymr;z z8ilV|`n}3HCy|9F3P$IlDyS+7LFXrW%UC_%w%`|cytD@hR6SpH?ys&LGGU5kFIRRo z7}ZfIs)1^vTBtUv7T1WnRT=WFY zX}YK_{Uwy2$B%dW*ce#K4Nl6{JI{7Qn@wg;5g9={HWW)>c< zzPdL*h>P}eN3z1uz4-)oDXr~(X&1?2yH+Zx8>H?i2K7Ka(S;}$^>UGw?w2mMwNAhp zcInPY+51Qq+y9`l<6y+21k@WPqCO}IC6}<7LED?qzuY`O0B6{8F3_7xNDw>rkW&44 zr=V2S7xhE^(Ev2iQDsYNWNM#ry+00TsCsrx&M@lfx6>qx1?TBjIta#KGz1Mr!_aV) zhAyhe4m|&s^|0MaOG^km|5h8mSi~x=!w7gI6U}Y{as8(er~M*&{Q-kA2{ zt(Oxr@DZE(hz2to-#Lk^n#l@DA5WK(+vw`sI~>`M53O~=2gKGW8)vbcM>T-!f!u&{ z(2Zz5T7VX!n*wX3+y;7pZpZu)P_&t_-I>e9P{sDGtrK)Jgj>)ebSt_I-HsNcJJ6ku zF3eU~bRW7OJ%CoC2hl_5VONIi zQ>&PDRs6nt?C%zY;Owq%?|DLdEiaM(jYtmt5xz)scU8Y{n|*Zb6uIRJ{1~&we&7Cl zzi+&0x!muIu}?VdhY;}9mDA<&eD1pc|1K%Y!(j5@msr$O8g4%Ido0lmCrUTU607@t zf!EDeJZZ<+4wBt4kH%Xp_Guku>!Cc8XiiY0K#I=o`DB*!1o-PfPsK}Y$a;-oGu|&G znzPkPy>(wZBa{}hV{r>EjC0-Bo*-G*9HSwKEqX?;L2ZNdD%y^ApaS$7dL6ytda;z< z&W`rL>t=-jORhmlIqn)%E+vSq+@LYPMyT)wc*30iyeDTqdpAnTl5|J9vwkHpdZmu7j-E= zB4ExM4MOKsEke(To+eeS_<0TY7@(ifadZNmL_ecn(66olT|~;I5nWzn;w%l%MG=3% z8PSl<%8qzJgFgl1H}pID1D!^HqQB6YitMsyL>B^+MyCv221P*?>-eHZUJT{$M00?s z+=k}uM(eu)l7|a%%Hp|+DI{4BB4QzkCB3AiVE&Kwd8i7iibBx&s2Zx?$6NA_kMQ$Q zbLq}`6A;)3Nlw<2_I5Z7fhjh6i?%^1j2eAR^#-L;3Q4Dfon)qt!q7Tq;3byzvPKq; zcfCHQ85vw1OE0D9bWnr~ag<&}2{VJ)LK=BDFXccITl|U=BOx|HO;Iz{99@7~pq8$# za>BNeS>MRD<7pt2A*XG1^IZW=Y|U1sM&aEGwMK1FThtDq!?Y*rxD~Ksuq$s0)flT~RmG-NE%b#qMOcl5C4JaJf#=!{jt^*Sq(SELQZY zvSVQMKt0igC>HfXaVWlo&APv#ISWLG{}7xdaF!#1!~Y1$VyCxj*C)W}jS^8Gl!TIz zAEi`emmU7;Ko}ZQh7OJ39ZC-`(8yDv^zCD|HZ2_*dO@H|bH8^%AO{!X)C&SHk*pU4 znnMtaeoaY3APq&s&~TK7Ef& zfw{PkIYaqw3=2#z2y7-Z)hxy61%c7{ieK)WMu3rK+hF=Jzgf z72+t}&X=9-mkk28%`9kQi*{;c8BiznF&$b~PHo1#tf!xj;V5%a3Ds>~xsb&2-_$rW zAzp=MqFE>lU5#d=Ij$+?e0n2Oz#c?@d_5FrV%Br@{W#68KWnpzWU-xZDLWg+Tyzb( z7R^J~q3h8Nfowfjuh)b+;#|U(bM(qCBw4KJZDr@cxDm}q3(!Jz6S^7Q;@EnSc@~Jb z8Q=`N*(I{VTiDj`Yh`!5M@SYsxl7rLVBCssL${;F=nixzy34V3AyTWIn;XXA3|kjD z%SqNnPBF=1!S5=235>hZQnU=^qI=N2Xt`t8Z149DQnKH%)W8#J_QovThv`Wm$YPPZ zwS*Or?(1Xr5`r6fa{Eh1Gpqw=f$f59F)qX^H^FqV$yH5_r&x8{)@TbyEOw9b^5CsP ztC2x#&?D$kwAMwO*wO7F@^Oc~g9N=el?q2})O*Uy$M3N|<}A^;__QtObaHK3fJ;eR z{z0;yMoEVtHuZfat%vkXAJdo&j->njyE?lb-;WC47JwHvTe?b@q0f-e28SRllzoi1mg?zB|3->p|8-_ z=$jI@-Tl?=;UZ4Q8Mcms+Fv$V;Kp$dke=) zEb>$JK8E*CYZsu=IT*{e~ki%%HF&Imin%%PKb57bjE_MX@! z_{vY?%k8D^epvaPeYwq4e#5`A+fK{>Y`*iWEU)|BfA^jHiGITFZ-bXV=XmejKXMAZ z$F)2_vbH^-cfAKEu}Drb&8TEag?lr)R`aL2xjx?S{p-&ypR=#@e!%b)zH*~`D84mN zO;iijMs-jas+(jN*zSpt8i^bX3A3tc#-k4-?CFAZIC{F^E7DrqZ$kCPefz8k|Hbhj zU+Ay=WfW;o#eAWGhf_$sB(s$W0|OsvpV-(*W*2SHml|y(4o#>jL8ya!f{37%1D6G8zrJXCAKj$tN;;5I`58((&er&I? z>G!Cg$CD(BUa?&QO>D_A9UqIJ-kN0M$xuR#m9x4p4DtI$*)y%-WR>w@)|1pZ%Khx2 z-r}~BFU7KcQr;4HcPE)yWG&$h_4|ffQZSh;DUYPqkxIxRQEb3*C9HsOUy_+X7Dtft z%vH>1!&sA>Rs3yhTWr6jnY|?Fk>Dr@VyP#z#quDnLaUKMYtSR;QMA_erCtS_KHTqJ z1=|9I*3+wC-;u0W!O~!grJYoEK8(lEtpij|$^cngb z9dJ~gW~YsoJFR6sp^qg-fN+!T)IT)HBHX?}U!sHP5c&#zjlNM_QzN^=^Uaw{?GEpe zfX5PdL6jcko9T9+o&ATIK&krsW``+5tmw3sbr|Ni=sWa1I)Z*cKcb^9bZzFNOdX-7 z)@AOjcNz!^(tX+jl3Uwl;1QDLDWm_(((eD7Uml|pi}_1C;26>Vl*EigJsWzL(6qhN z$M}60*(FB7pQSAwaz<-^3cufyOk*N&TTtn;(3rULZiI=?r za4Jl()W4M-4C6dh1yw~M=zLTSRjYhW%)ZLIU*frut+%tXSE%|3A`Sv zpUnS?ZNQrd)DSg7ja@?=pTJ(mR(=$IuJTKQ!tCNBlB`XV%|P9_9;uuAzCb zSAAaPN52!`_eP1R4@yGG$d6K7h`J|lKFRMrV!jY(7ihtG8fYpGeUr@rN-7)ZJGf=r zzG_QW+gAl7^)w46({47xJ?EK?e9-kkOcjkVw5mop1n^Ka3=KzV=pr-%jVv4ClB?uQ z!vf}sZd6UKX|Dw4A}sMJQRW-fCG%Z9c(e`|;#5mZOCmRD*Tc?Q`HjTxL9r~Ne?1DUv zg9Mp@!=z+Wi%eyk^UmphZWV6MU%eA19S4Tu0uuE3_TXv+Gz7mkruGc>K6Z_fNupS4 zb&V$z{8h4ri?nHM5c5W+kkWLHJ9}BP@y^>f;IyyFB14^iAn$2>YwHJ73i<}rfT}91SBZJnUN6@2a zEy_p3MrL=PFrk}yihtoy-{`5vDcOGRPn9Rsbpg93%#ISh1NM9Sr7SY_XeWV!#8Shx zz{h|-o@~xgVYl&=Qg!jS85c%fDNm2((jbV9tEZ%AAZ=i)qCiK|sr`nzZff6!OUcxJ zmSmmUr$P{$S6@jlKzb3qgtnlU(JN>x+UC0b_zkj8T7QkJ^&udz&yt|eEiHm3me)Y3 zuj0Ku*~F8<#V6O(^fFa2nef&tX?^B_wwv}klErc(bW?g0##_l|0)CF6!*3TZeRU!x zs|-I=KvGo6QYMdNvGj&YdJoe3XfG;6AD|D>M`)j`qK<6boshq;Da8$NC9xN7Ab)9d2|-P4glxZy5=CRXrSEv8blX z_zA{wbON13KcipJujrKPDt$Vq&wO|0e+dwx)T@bak*rtzqG5_9HBHAuDIQ^V$Ujc9-YnCr7H@njkzS? zs`g=$#UfgV*`H@@1*5g!82kbm`na0j;N{n+SJGRB$z=)w4zk;H6o{d-GXCd93fZjO z1&06Y=2kwxu)MTHdj+KY1&9F?XJ=eBah}UmX&!-GvHYec4NTUgR9|S#qBc6wb)p?Q z`_0x{OWQ#v%&O+a#oW7P3YPgxen%)97q=!@(^k8p2kt%nX7BCJJ<>dbqaON%lgX}E z)|1ph4}I)PU_D>hd`mogaQ1?#1Z*`a)FaCmy ztfJF-<<pc|GFf<&cp^MN6G!l(+8<<8b*93T?Xo=g$7J_1cHuH1t#wM40x_2r?h-G!spf3h_ ziQjYpP_`MC-R*)d!iAs(*~Ek|bwTGq5XSzUA-O@c9*xdA^HrJkQy#Ry8XtKni?-1te2){w5kZ6=z9ve4CN zHkyO7H6-_6bOz>fKEdv7*HNY&S4kxG(s5NyPavehHOVA*)RD!%rnAS|+ejB%*;T`x z3;!B)Et-d}L)W7lP)_qHuGeXLi%jZzSt{zga*gt+BfRHf_1Aesk~TLWo@# z7vikz;)#6I$=<-*(;imN>t-g9iynjVIC=uDLrwWW9wUauC- zdXTxq9uV#)S*)m+vY&ym0c}K^(6i_{^gP<^*t(cG3q;vNaJJjNJfgVZA-8rvLbBM& zIAy;8<3;om+Jat2ub{1Hn`4)rUanc@f#Y-_QpP3F?Qe1D?;jPDY%M{{coo)m=0bvS z!%L%WndhR-inkBJCNf^G)N&*gEwjhOOvHoC&WM$$I)_1q4%sUl&~l6!Tf^bYCT( zm%>^$#SG4OhUGHSr6nPRq5sB5;SPq_Qt7Li$+ z{#CjEc?-$<*lcrr#X1g9Mm-qyQ_MjMaSS=C(4(FeWQL)~6YrC(4@<`4D>h`HGMd0> znqp2+h+_GRSqhi`P9ixnL?h`zi9J)ya6)x;(%W>0ZJm8l42Tfsw~(D`vkK7M$-`-OG36!NZb9|5;$V(Mkw!cc;nFol#V8%E6|lF zqio3b>1GW!6mKusVHUfY1hHKs6*~#{$!H3iil(9IXa>r3*yB6pI3WNVgSW)|rpzHX zZgw5Ek7ThUqZED>keMlF8Arvg)8*G4xf>l9J#ZdERw2E>-BR`_?i300g03qWy6&G~ zl^>?=jEoz~E?;Fs+U1qlre314%_X*L(6wkDx-KQCdeHT}xdG+4nwO5R2BzR8ch79$ z#Wv^@FS>ax8>m?Br3$|h#{3l1fefzVOY!!$S2BBj(!)aa!Jja@W66Ucwr#YMZiRFk zTOi(!r2lR4{Vjg)zb!_R6`t;*#=q?M#oM0VMY7nD%an9Cq@`#X%0>5}d(m>V!qr#q z0&Hl`eZ|e-X*f&wkl=0CB#6}>tJM4OzMt)yVqJVSx4N2Uk5O+rH_|*$vaYBj@fC|5 zr;JrFRSMO)=-jHINk)g!fw#4%7t|boP0^=+R8o?rb#quU7;{_NmrkHp# zIEK{1I|WN7Fa9XgzrdYASx2&1LAo+tg|R)wOu)}EWS`o|6yc)x+qWevBzZKXiOG1) z-5a}yWU(U?mGma0x6s>Y7kUT1i*}>g-AnaEh6*H;K^ao!Y9`pu@ zn|Phat61#}uP(gGC9RL)eu6$l`_X6Ub94X|xw^<4rDvK(;YKZFa?*pOQywp5vhu#b z@5>ak5f9hOIxRJO%e6%2B+FPv!U(%Hh2txhFhv(=-@^C~eUFZyAJC8JC_3h1k_B2- z)9Y;xkP~H>d=Ad`;vz7&Pz#=_LH&f|adZNmL_ecn(68u}0-Kr|ySQ3r4_>oD>A`C> z_?Cg!Ztba@+F*@*)karuS$q~tpQgqA2KINhIdZr*&JqOiq1jjqTp0-wW1^K#2%Rl4(^s8Tat%yy4$tGVSqB~-t+Ur z%6<4!eP(#!RHAayY+d(4^ zxBrV*AJ%SclD6^_4Yp0DUR6?>)2wuc^GscaqQD4KBN0 zxdYs#i@)PZwCl4p+Ezr>8nr=fQM=S2Q%wKV@S1%7*Ru23QOKQ5wh=<{BV66F4g0|D z*tU=?w(n}ib^_HIbwSanE9!>2qZro+dZyx6AUa5raE7gCL9YFfb&MSthe#GXIa}F1 zVDwBi598+shIdQHM~*a(tdP80I!N|z=^$AwG+Rl%Atj(72S+wT?+i(!i8&r|m0Fvh2vc>G)o=%Q^0E_zT9N>(9p z+z@H{f99gxM6%ef>y$JJ(quFRO-0ktbTk8Hx+rCr-pCvVqPyd0oM8|D+${_Cksx;L zdZk{4_smpt7alIY<7Dwp%#O1hg9It@*iLvBjSS)k2qPX}!$S=ZWaVTz^Qr0mr&3|fO8L64%f zC?7pmk$r)AiK$N;WfLeWp_87J(8Bcph9K;~7zbZ$(al=UZz;4 zWG*4KhM}jfa`6@0bc-@Jz}U!s6+bt)0$cfO9QFR*2pq~a@ASiTjs1^9+xSu}W?5L! zix6K*HFNN6vEx3ntgmLKo#00&hDs;bB!`TqV@rAEy;$4u^Mih8r8lELn;N&u$9 z%{{uN4dGR6z&+*wUp8tZZs{btsOIrLi3~SV(tIQqdT*F1ps;$T>n~iT=^;gaK|b-_ z%xmzy3SGhLB7AN|x1rn7Vsr<(({#p{f630@I7^sBZXqP_y2K+yEe{L2i`+}l-DoLV zhH}w8Ch=FlZ|o&f`Y)dEPF^GN2_ec=T-&)Il*I>H!~1*j5zAi@7PNxT%lW(l-G}Z+ z51^IkLG+NeX*2KttS9^?n|RMte&08?KZk>mP_rp2Z-wc=*SFcF$|k-TGHc4nS(CHn z%4$$BHAi3D0|p`@D>s`TT;Hw!|ysMLxger6qa!w($97FD*1q3wedlTfMYX z_lE^-JKBMUb?rK9=FEAs=g!QYc9rS;2UAEZ84d4{SGp&k*JDU5;eoKA0(@RW zubZXh?a*5Cgp;1VS@RU|{tdq0iQYulROcYIzd3Zc7pIX7E)C4I@DyJ}f~9AWJH0L2 zFqW}0Ea+`KcA!?t_)_B}M6)c1MKDK6ndCjvWZS2uiFXkrkomlSbu%ISX=m^js(2wXSI);8i$I*#O3fpnyZ{|Fo zEvG#UDJN=GSkU6t{O%Svi(M!Qd3=%0tJo&qUvnO-b$~yk=A=otN%Q~0XKDUl`*XJ% z?XjU%H;wWLPGYs!Fn5#bH}pG_!T5(8jKd;RIBaZlnuEt)QtCESIu^5WJdMMj=r42z z6{Ek=KjS}b*h@c; zSMkrITc!HWuZs75RbDgr&Xpngur@*2kA?+(OLv5j;e1pLRY#$y2C9i_4e$=s<-ZBn zG&Rmm@zve&sV~JBrrq(!BibF2ykYy-G7losGs6J{? zv5t^?A zmp`Tf9O6}aC4zzid!-?t8==O?_KKNbErtE!;3`zk_U#rtrE|nmA6H6bIZ6{gOW!sv zrGyG)V+kb^Pe)nrQJR&bH0SdLs6`1Sv93_+R!#BMx3Me?poBl6v9v5liQ;oB)Y?&G zoJE-HfixH>qwRN)#U8XxIcQrxw?pk6)Fjf-jm#;ib!=$qc)AK6^C%t2 z-4VG>pcC&qqb^7rTPPi@|IPsav~^mwX!3PM&c7S)yQ3IX>fgw0gHq>Wsasn-T@-5b@>w6ZqU4C8E;N-XU2k7L1RS z@0v?0v(n@AA%7Bb9g)m?KPuZyjZAQLHypA&nox>8N(vr%3AfgEj`a(K43zwqkySfRI9}6tU zy_fWa4O**o@&%5oiG02Sm5$D(HR*?oq`Yu^q&y$~6cHr1NXzcDDq;a-ZJWov5=I7c z^_ax_$!H3)_0XBMMJ+aDy9wrcaG^BcsKHGo^EBij(|JDwl?Eq+q@lSBiVn5Y0hC1^ zB@>UU0w^XQAsRPp@wE;Z8zQuJcx`p z8Dp;X-Djz&OLMQ1HgA(welGB9kgNQ)yq|}zL)Rm_25M-&DJd`wM~ONFhzy6N7w7@x zv%J3n2QgQWdzG}1XSKi_@&wlKMn2C+3&a=EPPVn@)S-%fWk4MAN^~@DT@*CWBQC`2 zCgiGcGw*Lf<=X5U0orXe4M*4T5}KHU%TB_*4}6t8;Z$2zD2ssK8c^VEyuUrLKs)C* zG;_jId`-0qUWw(2i#_6EyaOBM4nE7gc_*&{N#}MRaa(R*OwWZf-`Z5I;QKkV2&{F!|{If0FuT0$^qVy^M2fH8s7el2gH{gYga~>FJ&f|u6y~W_yiVg)4qsRE zUJhRkukP@54e#yY>#9a6zLp(m5Mr1lgL!kn!I02=6oba+hZyGG2T~F0eiIFtD8HTmf|{Y4GX#ekH_(N0O^7yJ>lvXa51hMdKVL{)}xEmmCM4QmF z15I>MFV2>J(Ke1NN^$_FzmJiRQ+iv|rCl69{4dFM%s&3Ms#yT#IXs_7o4sa9e1Q)y zqOt?8+w?izldqWL4ZL+YcJu~b#H$Kg9RY6DT_|)LH z9AEo4$C1-!mN?!V;CRY&eEr`XQ)bB^)cNo80LLM(X{c}fo8zd7r6qPFvkNufbKF_c zQTn?<>*P5atJLw%0LNm_@y&mAyi#Ko$FBn%N4>70zV)w;*&3@j#*x{Dy54hqyK={f zR?}uqmBtajdjtG}-_QbgRrGsbHl0?p=9KvT7~nU~^LwWfKSrE3jd)6deloj2H+zon z{;MNR;~XCfa17n4k?#IiN1Dbt{u1Dr;W_T9=%~F&_m|Xh5Sd-5+dRkjDmvQftM#y1 z*(C$+(E!JYH#OAvD>}}mQCr##u{gjX%X8RU(Ls8_oAJoxLfhpz6jpR--P$>93~*@v zmWK2}MThw%4pqqHO33jXKCI~Q2@YC^2>}j=Jco}eI&^Ep0f?>i)&Pf?w>6}F0S@im z>{DSE6O%G=4y`T2DH6wy$IMo!t!u9LC?5w<%FIK_85t#=bg%XFRzR^1;`mU2W9T~?>SzDvm^SO$631Tx z95Xz}&nr60exX6@zE{tkD8Wjz4kEJ)wZL;cP`P7$6W!kJ6dnz5i+WcBEvo1ydsKG# zxP{x1@K1nSj_3A8MK|3-hfJDdr*;YR3NpJei#*3KD>`a<13RSnYTNQ&32Ti1LC zaXaMJe0P&I!e*__*KW19koU3<`U-vRW%Y*FmpJH_nL#EOQZetpA@gDMZCQt&9aDVq zak7B^luV|L{eED?g;v@RlB74YFgB6vi`5wYVYNM z5X{e&qZ*kUP<1To__+PPw6mp>k*l+&^%#7xwhDCk( zAE?Ekeh2f%zoCwmpvIH+e@68INAqC*{5Mo)*OI9I1C+m1tujbRd*B!&UJ zmXBc(X(cgyq%i~ys<2IO@1DZrZwvW*o}Gxk!p+5y<+=GPck5zL!3`vnb13BfIb=T9 zI`F&q9OTBMU_STeH4)jpt$DY9iZ3#?Yu_PPMC)cR)9iZObHCTBMDJ77dH=6a&65H! zp}0ECHr`hOQMDWHsd4*vQ9UV%rPCW{F^+~oFR{^XE|wq1Nlv12^X&bdQr7(hDTEj_c$EP|+K zMsgA;&W?%iK*^YRlUK38eQRw{C1Zm3jX*a3U)VEpZYfT1SCReSa3weKkRjxNHd zwh1re1pyho2>SJQhbeo=# z-?RV3?5UGxmmDT64*-N8)S}z`J0RT5@53;&?Q$Z(H4oRexU~y#J+D0vVvf!ogt(%f*$I20Dt0pE^+Fx^K@PIAMkIhh1jmDlpH1k&7aItDn^%OkG> z?i2tnJDj`$b&8C#-0w`rE`xLz;dkS%!ZGQE{W2$JXHSxoN75(zadv$&?LU2MN9hV* zNg9E5 zzc@Zr=+15fC%YaQH9a(F=ODdWuoA!~uMl|^SUgJbVD$wimUdX1zc-)D9j&cSR^meZ%A+e{o<+N)5fJ%=PRB_lsdL8+)O>WBKH z0cao^ga)G_Xeb(nl4WpbPn+fKHG_6h@Nm-8kgH&5$=GC4Hi?6n+DvRej?(Nd?om9% z0=M`jKa$3r@1Hht4ku^q_XEDuDqR#n_Qu^mz?zyZg0v0Tf~>9qH+gO&DtFTszb(Ka zoE5EX-yxL^Nj=JX|JRZ_#a^DAjgN#Y8%!GS-C|f? zg>~_NvPKM`Piqc1qLE)>^Osq?t|o(CtY}Rp*EZWchf6Cu{DVWhZOl6Y9Gd^2C5#Sm zD6<9XLgU0hdZMLW;!BW4><(IILhC zjV1HA${nK2ySVA`;T2?+xuUxay?+^wk{)_go8a<_$nk^SIn3{YxS(@9hw%XpH3PSZ zj3D!DWFO9aeT{zuTj^o=IR98ihK$Dv0sda4hYjT}K9ezo6Fl~A)evtG9m8GDPD$f$ z3qT1{Q0W1vM*mM?*8&$+wY|@bn2>1bknabgDEY)UzDFGq0Tl%m6%zy$l*b68;-iMj z%8ZI@-m2UsI06ssjRH5D82Vue@!yFQEL9bwfEY1I5XY5f4`4?_S$QG zYwgF`=RN39sBvUOPdd|~&^u7gpe}C1okNwB0?#UjWhMqwFr(!UA{{5!0HyMu+8giV z1Az<}WCB^ha$p6J4dehT9!rF~A@J}g6vwemFV+--qzIsN=4aGndkwIbfJg7^;^d?EUZN5-ugX_oL!qW0 zx~J3z8O2at4{QKjprMyRHe!1dP>$^zkW;EW-`=!>S^L!H`?7_&B!ZeurlodG5k_cpN)`d#IV22RlGca>AH-2$%eh2C~?9y%GF zLmKeb0?PLR_X9hC2Y?4feliX+!{m6vF6}~lW7~Wj)TY{uKc2(u%A;*YerKD3GbH1^ z;WlIAF1zt{gUu-3C8}XKc<$#Y&^Wo^fO4Ilof=?VMzYG!oy40nP>O{<1*uc(@k&3o zK}?#5)3GjTP@tFJbvhlb6w(?*0Tk}`{;N-b^7w0Wrmr9;&xS?5E<))CLrzCfopK>3 zeXBfz^+Ta=Zdn(l@4alT2w{Ux76&cafmMEi8xUsEujd9>t9(B@h_dMKVg6=v@*ltkBP<5L_f}nMl}}@RC-lu@JC+?-<+Hf~ ziO@F>nG13+jhVILBX*Et3FsYmV3lXEgEUJ(3%Q4^@-EEp{}xxLhk-``0hEhQ#40s&a1v~-t#_67351vHX z-4|=@)p!F2+mtFef12}WIDeM&-JCzC^1jCNEcgfKG&HnGR-(KQIW0DO#I}V~ZL1a* zHewM0W*@g1gQ~FjeQYzf4-YU3x3@Aj0sFAs z0o*SFdjVRAUJ~;cVIc~qPB;M_T8QYm4aM;?>h-5zuf&Ppu%Zp_T>eLUqY4$T0{ej1 zfc?Ph;u{c+mc6db zD*Z&1JD^;NybtoYVM<=x*3oPaO&%)cR~DT*D9|ps?PX<9&t-^Ynm_DJY&%>=lZT6 zD*Y;y%{}`NH*7!TO=}PNcho6^gBF87r>o;jE#x>cG{Qn0MiBCvDM~*ZWg>DTCr4Ac ztFb9lG0T%I@)EYY5r?t*D3r~s zaL}iU#|gQ)=aydyNcDdL6eti6P7Ekd=5iWxYT;8|mE4W;VwCIJJB+!=2mQwKYnwZ` zz~=;;ASXVZrdTF*$+cb;@mmizpVj3sq_?kcSF=>x8?{Whl^xfiEO*fkD$x5Xn)8G} zP61@|TnR&&dMJwJ=fsmgPPJX*b)rl>4oeT0uwJ|+jxxwwLVuxUZ>(bdB8z?v%M*Do zg{e%3l-z5$xk0rMgrO?2qY88z50x9`tCfxXJAw6gKu!%TM@|7f&2p`Ji0hA98deMW zHBj0xokkF|AhDCf=mkL?a+)iH_1@K4%|T7rI!+C_E;~_ABXy4T-6+$sOeYV{F)6@G z$Z=Y2)NwvOTFISVz;9Xwj3rMrpX4P_kn2)MWl)AP5$d$j($(dtrv_ZW1SP#1lxeTk zX+8JEDdw$5?xi`AVi}u|uFCP*e=5geC_A9%MovTVCogcCxQ6vNUfH{3RV~YR@%mGT zvUzX(dWOy0tVQ)~(D@neiEfUj&ku;v%`I?3PRl|X=Ra5iDu$qF5f|R12#Uf{;O~ zOTuHD%cCHtuKY1sO`2?!sinD`)72A|OHj^1A4ZLK7}udpS5s0R?J&mRfA<*fF=}_A zODw9WLpdB9?uicLYn15{jO1z4#E^3oaoIG7u>_1EvlU~tW%i^bsz@HP$kQOF!Te#O zYKa@=11P(b9QX}9dSP1yfK8dA7AT(HLCxe|BbqBla8sNpQ&;Ge!@ET)pUmY zAfF1MJ4^NGK+BMouW*Q{pYb|{x5(n5as@ZpBCmm*x`^%=P{eg8M<6fBb{JieUwU52 z({h@x5F0Fux*PR0nNFz|k26YG0GUj5dx9L4K~A%=5;-+_mENyV?v8TWO5r_E`%%p* z#hCJdGDMwBwUE29pZ<@zxT=D#==I27$EMLH5;YOLxE_Hh8So4-u zqMpWRwq@*USU!4!T6tw2G6a%U20rn8&<^bNYbagH2 zsV7G9@vIJII+xKYyE7lbLy8>6&5(wzk%t4L@uX^5{aS}HTWcf#$#SHQDpr$g+9Rrm zVo@fCI<4n9lxUGB;T{_Wo>q+W=pERo+2AndAW!8*IQE9-M1g$3Oti??a95{6PF-4w zoc8l}`V<7)lny~o4trU9$jcS3(ap!W4svSAo0d6I&ko+@fI@C`$WJYu$jQNj+(U^d z_aMhC|AqN$QKo+cP>F`qP4rZe|?mfLt}nwW1D=YFH5Hsn^-qP4u= zMxorMNej2w*)S7w^KR9jcb{y?&9i$sPgXbN<};6pNh+{X$W1-sHN2J;shkNfgf^di zm5@^aBY5}GG1jpD5Duu8^>qC$mY%9ZJ)IX{=t%sgr8ev~)sk?FK@`h7vja`+gq&J3 zoaHI3r|TEsmN*5R201y@>C!8vhQ&i#0tHgUTSPM7!ewnR{u(7OwaCw(R0~oWF$v@U~PXw$F-3FHW^ZJ)G*YMS1B8uk*Dkq{l)7>!nM-wUWE)Z^$VnomcrEY`>Drshn@T_suM7Bl7A^ zm!{fETJ-H(c$KkWKTwdVC*UHCO+GE6}Q4H4~) zjUb`i`I@MO!Z7Ku0t)PKnRL}|{}rlZuSr*b*J70Gg z|3S-s1ENuG#9e=qHKP1GP=hjoWPhN10dSHb62*8CJB|%F1abn&>?pSo7ho5^i0o=%NAmH?%-DYbQwTaOfrGFiknAdyTLD_n z9GKQK1yiP1R)MN5~Z7va4nx{Li`wFnJ!*}}(U@{SRRb_M~a9mDtx z9j>SB)u?L?1Oqf>zZM0s?<()t??6+jUtQoLr+QH{H=8DaMAJa3CN{ADHsEawnEhXa zviAQ4e9|uS6%Yb>I{^O<(o6pja_G>dON%_21#3LZ)-0cqp}yLnfR1xO`p9hV&Wi|$ z(A1qEq_lkQpRCJCQ;DGW$RZx z7k^LKV(P##9#skKzixOmr)}# zu#pL5iJtwiPtVxIgv(j+uLvuca0Tlzp^5Jy@O{!I_kD+v4V@g)6B{EjwDSFfWXL<= zP)q3y>#USIOJUcsvm4v1fkL1N@BnLowc;c=2F#O73GC=FvmZGnI=qlS%1?1l@{$i! z4C`P|jW0&N9@qeE1U3OT05^(^>s+=;lKXnt5chcGl+4`4kWraZ19N*}PuwNQZvt)x zZUHs}w*t3`-@x5(6mi!656_*yQ6XoGSYLiMlM~7$Ewr7Ogbk}pZmUW52OgD;BTi6B<_Ztk%pYM z4Qxk!C{>2VkRa1k8H?>=fPIY2@T_-d@rq3`mZ8qth*R&2)9@7Dn#c}90n3Lt3rWWi zT545bXCOcGz8F6UfvF#e!=8ai)0za)N>B+wS0V7XmDEdxc;Hb%;_zkUVG9JbpHhkf zt3bz>bLT&b{4qc;bkvl`QQpP%PauC1&h_C4XEI4l8@kR^JJ@J8R_r*NI83vo$W>b67Vwc3Q!d}oU1NPqLk%2hRJY1gPh{s!Jco*Q|9-Y4?Z>f8Y zXGX@XBrzz;WlNW*4{>0V4Ma|fqRHfKlGpo*CYS3;Kj9M<%^`TAXx>BqKJWo>7&roa z2pk1!0aG-h%}|$ZP8@mZ1{O+I@5kAbxi3brF6k#6a~L0i^<$u}*CS|Em)2ikn-1-$ z6W>A7UHk|?De_+jwmc?chq-Kh<7mvoU`)_1f79b>!5AT%SBdf9f#41NryT z87@qapNbdd!(Fxxt;r)P{1|VDBk&a0Y$jQ+mB17`$C<;2-QTAsJ<7bec zXGgyvKL&gXd}B{i-|iWCEh7 zB~M7yJnBEnQ&A^x4q@B#Ib^uE*8-ps4M47&DfXeUVRp~w;siEEi*fL`K>mE)G+1d5 zjl_mT%+x28XQN(w2sw_&d|(Y_57&xMz_WA$_0`YBgD7{CJ`&mLK?#JN?xQkncYu9I z=IA5}M&S};B-zH2-hZ*}^o8=@xyk=I*e3O&o;n0uijPt$^vFk-CLg4Se?d4JZI`Vc z4-JZhQt+2*Pw2|p-H>+&dH_9vFrXI@4)g~4h|AGfM@3uw4O>EOKLa*7LdYqZ+a3UR zDpM+9PZ40D5$cP)9}o##2lNL900V(Rz+mNRYzBW;O+GTgLFuo2G_a2$u&?VS>d@pa zL8DL@4Ma=Ap7V(4`2Qfv{z`Sr7)gZlO622!@xTONA}|SX0+WF$lDo?y`FRLANC3fq zi}V!gr^3($P;X2_9s^7VVu2Yz91ssA05iqxu`XM$>FOI%8uJ=3(CAT0IDrEsv}Oau zmWX@~Fc(Myl7V@^d|&~PBH8-M*$@d^8XHP`vAq!WivZ$Tj64-s0$dL)1=4_YU>T4h zdX8%zRT&s)6exB3+F@iuD+?gD<;Yh6*+34k5?BS~0(n5bWa}3}t!o4i4FaXz;Gq+m z0_YHr8~JK+&3G5SHY|bvS(9lVZiN>0ybC!c^Bmd5GLk2Lqu2_Wtq8eCvSmn~!Kf#m z(|&kjQKwS_^Q>W>waC|r7ZH`>`Ivc1*~T2t857TrZ&f_S%(EW(2C-lQc&1Ui)}o%` zi9$}v%u~iPl84kOo{h}23Hc4cjp8!6)XRrwnd`V8u0YrmH>GUm@-kNm@|%F00X`N+ z=i$dC(pO{^%}}RQGR8#MQ8LHKymYf3_gI+t7AC$Dnd!R%I;+{R{qec|ve&d16Gr9!7M*LTNLM?twuW8#P@r z+zj=B@~k%nDv3v`t036Wq6N+{)M-j zagepAy;;2r8?y&_!>S#|y_V7BDIo zWos}eLugKyLatx-7vBcqkX!u~DobpWPxQyP_RxL|cpTUTJOMljJOxk+#$`I`Q~*x{ z&j4EIS+R2+yvXy*)79d26#B|>t^#q`0CAQC@*|7WQV=R{Q0+zoD6SolRRWZ#9rVL_ zyTMMc#U^=%MlVaxT)H;BFeg3Vvot*;11p78HBLeIIp{qP`~#>2_5d#cF9Lgkmw;JA zhb^6+Fk5_i1ML^j7rSgDSJGOz7xv_TGx8GvCCaUw6o;AfWpGm3JkVG771Wt^s}jUV zx8ZVKtX_|^hmqti7G~PrX+IRNGQ~dR)P&bW4Qz)<+x;fn#6iC9_gmb*{s`LKSHx{_ z+1ki2hr(c_ogc#X0T@&RHNYFdo4{Lu?!SXN{ym`RA%}1aQ(XCG35W1m_V5?y2N>x| z_V9j*$kXlJ&hBYtq-PodCn?XjcaXU!xaBu^Qj@;!YUA)@u-gzEK;?{#*7g~Aw49OK z${yVomym_@|Es7+JIJ;b-O{FR*v|b+6sXT5S&< z0KOGj_V(9M?y}~5w0L5d-^Jdt?Qz%cc zhv!qCV-Jo*AbGj=t0|zoJez$H^8ECcEd>bkv+SYoK`(!W5kPwR9wXqoms%P5>skib zlWKeE_59P*Xk_Nl=g;_ww5C8ROk~axzRmf;dSPVkXNqT>2|*BW$E^SYKO6zY+BaNcGPd zQ$U;j*nVrVt>Y1zQcz&(m=sv*W;OU>`Od=fy{Ng_Wg92EWWUKabChrNCoQ(8MAR+X zb|Cb%-(!Ak|7o%Pmnd(t-D$FQj`sEYZ;S0|ITY$Y4g^D={H~R&5l#X8*#BU$|545? z^&#yhwkPw*XkXv|XR$q_4~Ok;#o3yPlreMCK{DeeG;IwMGfneM%A zV|=5ihxyMYit}>p`-qER=qH0XW@6axhv64kH<%cH)j`~VlM~gBWSHq7g2(y>@gJD~ zW};|R6jP-C!zSYrKgPeq@DG#m1?@lYcHIdsm}&oK{7_tkx%seiNiPuCAJ-ISCF4f^ ztn|DrwNh1?$dbqTHs((Y*=4n0&f20E%sw#E(d_p_V9abDjZKuncDU?}Qj=}ucwgss zi*1XUq8%2O2+`vXm#v+oXfRQf`k@H0P_&#W-oQy>pGh$VxtUki$uyYiRu~g}Be}{# z(@NB0K17JK2&9V)P;MixgR*T`rX>rjsQA-dW^)Ox14 zNp{NnThS?UfhspqI4AnHCfGvJMugm{m)BtEYxn#8*tWIUUc)`{C>X+JPZXONA}9HJ z53w+`(+%iR+BB*ritTIDx3&pjf7Pe}EKWwsf`?2j{ zvF#|FccK4e>&HW1`#s^uwv)xSvzpU=W7aGyShg}N!(%>PR+z{VCi^y`i-oMKnpAzn zgu8JrCgTZ(nU1H*4@EZ%MR&cAJr4@im77fzVN-mg=wYGgDbgOHoul(TE?Zj}M7@cj z)DJ@#GxS1ES90MT#FRPs!PlJSIa!%%#ZqSxDPYh|s`taz+Z>Nb!>~q*Gl-?NoEQg9 z)|pd%TN7cnMl5}Kg3l?_3veW?wEtQ^4E-z&k)j;7YI^K6**aam-mhcZ{>Z5(2IvtT z`ZqnIfiTnVFZ!Vv$P|N^Vz8!o6cqF2OJJ2uA6lKR#uUxX{Vr3++t!1i}j6V3Nz_$ovQcIzc=lpCWcZl zxL`32hykVpvA_&KGsN*e8k3k_h|>vAR$*d##wz`oKLrfBWsQE~i3gMUBqc$0wD<|} zs8#2ni6M7}Z;NI!!z|>qr_AQwU3j0KC{eJ|G1U2CNVLQ-hZ&AEG3+uiq{R8gFxSG6 zBpC*axcl*tM6NcSV5MU?=!YTM!Z45fVILS&Ka`mmqT_vIm~UZN@W>9llp~kjizd?w zn5ICL?g1`DPWJ#8AzuvWAx*`}5w3FjiibcED&u#7`mTKmwr>LD&BCgIqCX6ayEChnoaDASg`|N16nOl;Bd6pb>&IctPq> zm#x2iiW8YEP0}G4CZDILLU0CJlulrK8-l$T*be+1xKC6;SN+?;z0w$O=p)}Z0E`+5ZxYwy_`Fp=Hb;&_O%n+ZsT#*(A>egp~XMx=!aTmH(zASeJy5uVXATHXjl7T4xEhtkj zJO?}73!5OLhxpG!_75PMoFa8PfXCY??*a7p5+r*8zlNh4vBihOQJj)w6uNtBB{=?;jd5UKi=Z!4?134v{ z^fcKI0CH3u*q~vl25Nve0MYKq1U!f@IW)!=fk!el(g6#_oF`qjDe`G-f+}Fco<-tyD0Xix zKXM>RnUaJ{wklnnO)th$b=@M-rUJK6WOd+Tw)W`isKsJQQ+0~2Ua6}~7K`Vasw;GL zp02K4EG{)wH|py3x;iXX%zRq=j!k9XnY!AYTKzDp2ia_2iVvQ_KIAP<462fLXIirCI#81?nn;0_onXGE=={|K(8k?HzuPhxa_K9q1>Fhp>l?<+@5al0SHFnQ`d$D+ z-WJ;+i0lx#Oa)+8J{*Szb&$G8;C9Q~q8_>t*VeGExlM}L5wn-R7epfR(?`G=U<<%I u6PIlRQ!+x0h`b>YnL{GhLm@CCc5KAVu@QK@Y6PbA4>dLcf5YBGt@wX`wC&db diff --git a/assets/dist/ort.all.bundle.min.mjs b/assets/dist/ort.all.bundle.min.mjs index 34bfda1..cee83ea 100644 --- a/assets/dist/ort.all.bundle.min.mjs +++ b/assets/dist/ort.all.bundle.min.mjs @@ -3,7 +3,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. */ -var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDescriptor;var ev=Object.getOwnPropertyNames;var tv=Object.getPrototypeOf,rv=Object.prototype.hasOwnProperty;var Ta=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var C=(r,e)=>()=>(r&&(e=r(r=0)),e);var Je=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),sn=(r,e)=>{for(var n in e)bo(r,n,{get:e[n],enumerable:!0})},Fl=(r,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of ev(e))!rv.call(r,o)&&o!==n&&bo(r,o,{get:()=>e[o],enumerable:!(t=Q0(e,o))||t.enumerable});return r};var un=(r,e,n)=>(n=r!=null?J0(tv(r)):{},Fl(e||!r||!r.__esModule?bo(n,"default",{value:r,enumerable:!0}):n,r)),Pn=r=>Fl(bo({},"__esModule",{value:!0}),r);var yo,Dr,vr,nv,xo,vo=C(()=>{"use strict";yo=new Map,Dr=[],vr=(r,e,n)=>{if(e&&typeof e.init=="function"&&typeof e.createInferenceSessionHandler=="function"){let t=yo.get(r);if(t===void 0)yo.set(r,{backend:e,priority:n});else{if(t.priority>n)return;if(t.priority===n&&t.backend!==e)throw new Error(`cannot register backend "${r}" using priority ${n}`)}if(n>=0){let o=Dr.indexOf(r);o!==-1&&Dr.splice(o,1);for(let i=0;i{let e=yo.get(r);if(!e)return"backend not found.";if(e.initialized)return e.backend;if(e.aborted)return e.error;{let n=!!e.initPromise;try{return n||(e.initPromise=e.backend.init(r)),await e.initPromise,e.initialized=!0,e.backend}catch(t){return n||(e.error=`${t}`,e.aborted=!0),e.error}finally{delete e.initPromise}}},xo=async r=>{let e=r.executionProviders||[],n=e.map(u=>typeof u=="string"?u:u.name),t=n.length===0?Dr:n,o,i=[],s=new Set;for(let u of t){let l=await nv(u);typeof l=="string"?i.push({name:u,err:l}):(o||(o=l),o===l&&s.add(u))}if(!o)throw new Error(`no available backend found. ERR: ${i.map(u=>`[${u.name}] ${u.err}`).join(", ")}`);for(let{name:u,err:l}of i)n.includes(u)&&console.warn(`removing requested execution provider "${u}" from session options because it is not available: ${l}`);let a=e.filter(u=>s.has(typeof u=="string"?u:u.name));return[o,new Proxy(r,{get:(u,l)=>l==="executionProviders"?a:Reflect.get(u,l)})]}});var Ml=C(()=>{"use strict";vo()});var Vl,Gl=C(()=>{"use strict";Vl="1.19.0"});var Ul,It,_a=C(()=>{"use strict";Gl();Ul="warning",It={wasm:{},webgl:{},webgpu:{},versions:{common:Vl},set logLevel(r){if(r!==void 0){if(typeof r!="string"||["verbose","info","warning","error","fatal"].indexOf(r)===-1)throw new Error(`Unsupported logging level: ${r}`);Ul=r}},get logLevel(){return Ul}};Object.defineProperty(It,"logLevel",{enumerable:!0})});var le,Wl=C(()=>{"use strict";_a();le=It});var Hl,ql,Kl=C(()=>{"use strict";Hl=(r,e)=>{let n=typeof document<"u"?document.createElement("canvas"):new OffscreenCanvas(1,1);n.width=r.dims[3],n.height=r.dims[2];let t=n.getContext("2d");if(t!=null){let o,i;e?.tensorLayout!==void 0&&e.tensorLayout==="NHWC"?(o=r.dims[2],i=r.dims[3]):(o=r.dims[3],i=r.dims[2]);let s=e?.format!==void 0?e.format:"RGB",a=e?.norm,u,l;a===void 0||a.mean===void 0?u=[255,255,255,255]:typeof a.mean=="number"?u=[a.mean,a.mean,a.mean,a.mean]:(u=[a.mean[0],a.mean[1],a.mean[2],0],a.mean[3]!==void 0&&(u[3]=a.mean[3])),a===void 0||a.bias===void 0?l=[0,0,0,0]:typeof a.bias=="number"?l=[a.bias,a.bias,a.bias,a.bias]:(l=[a.bias[0],a.bias[1],a.bias[2],0],a.bias[3]!==void 0&&(l[3]=a.bias[3]));let f=i*o,c=0,p=f,b=f*2,h=-1;s==="RGBA"?(c=0,p=f,b=f*2,h=f*3):s==="RGB"?(c=0,p=f,b=f*2):s==="RBG"&&(c=0,b=f,p=f*2);for(let g=0;g{let n=typeof document<"u"?document.createElement("canvas").getContext("2d"):new OffscreenCanvas(1,1).getContext("2d"),t;if(n!=null){let o,i,s;e?.tensorLayout!==void 0&&e.tensorLayout==="NHWC"?(o=r.dims[2],i=r.dims[1],s=r.dims[3]):(o=r.dims[3],i=r.dims[2],s=r.dims[1]);let a=e!==void 0&&e.format!==void 0?e.format:"RGB",u=e?.norm,l,f;u===void 0||u.mean===void 0?l=[255,255,255,255]:typeof u.mean=="number"?l=[u.mean,u.mean,u.mean,u.mean]:(l=[u.mean[0],u.mean[1],u.mean[2],255],u.mean[3]!==void 0&&(l[3]=u.mean[3])),u===void 0||u.bias===void 0?f=[0,0,0,0]:typeof u.bias=="number"?f=[u.bias,u.bias,u.bias,u.bias]:(f=[u.bias[0],u.bias[1],u.bias[2],0],u.bias[3]!==void 0&&(f[3]=u.bias[3]));let c=i*o;if(e!==void 0&&(e.format!==void 0&&s===4&&e.format!=="RGBA"||s===3&&e.format!=="RGB"&&e.format!=="BGR"))throw new Error("Tensor format doesn't match input tensor dims");let p=4,b=0,h=1,g=2,T=3,w=0,v=c,S=c*2,$=-1;a==="RGBA"?(w=0,v=c,S=c*2,$=c*3):a==="RGB"?(w=0,v=c,S=c*2):a==="RBG"&&(w=0,S=c,v=c*2),t=n.createImageData(o,i);for(let P=0;P{"use strict";wo();Ia=(r,e)=>{if(r===void 0)throw new Error("Image buffer must be defined");if(e.height===void 0||e.width===void 0)throw new Error("Image height and width must be defined");if(e.tensorLayout==="NHWC")throw new Error("NHWC Tensor layout is not supported yet");let{height:n,width:t}=e,o=e.norm??{mean:255,bias:0},i,s;typeof o.mean=="number"?i=[o.mean,o.mean,o.mean,o.mean]:i=[o.mean[0],o.mean[1],o.mean[2],o.mean[3]??255],typeof o.bias=="number"?s=[o.bias,o.bias,o.bias,o.bias]:s=[o.bias[0],o.bias[1],o.bias[2],o.bias[3]??0];let a=e.format!==void 0?e.format:"RGBA",u=e.tensorFormat!==void 0&&e.tensorFormat!==void 0?e.tensorFormat:"RGB",l=n*t,f=u==="RGBA"?new Float32Array(l*4):new Float32Array(l*3),c=4,p=0,b=1,h=2,g=3,T=0,w=l,v=l*2,S=-1;a==="RGB"&&(c=3,p=0,b=1,h=2,g=-1),u==="RGBA"?S=l*3:u==="RBG"?(T=0,v=l,w=l*2):u==="BGR"&&(v=0,w=l,T=l*2);for(let P=0;P{let n=typeof HTMLImageElement<"u"&&r instanceof HTMLImageElement,t=typeof ImageData<"u"&&r instanceof ImageData,o=typeof ImageBitmap<"u"&&r instanceof ImageBitmap,i=typeof r=="string",s,a=e??{},u=()=>{if(typeof document<"u")return document.createElement("canvas");if(typeof OffscreenCanvas<"u")return new OffscreenCanvas(1,1);throw new Error("Canvas is not supported")},l=f=>f instanceof HTMLCanvasElement||f instanceof OffscreenCanvas?f.getContext("2d"):null;if(n){let f=u();f.width=r.width,f.height=r.height;let c=l(f);if(c!=null){let p=r.height,b=r.width;if(e!==void 0&&e.resizedHeight!==void 0&&e.resizedWidth!==void 0&&(p=e.resizedHeight,b=e.resizedWidth),e!==void 0){if(a=e,e.tensorFormat!==void 0)throw new Error("Image input config format must be RGBA for HTMLImageElement");a.tensorFormat="RGBA",a.height=p,a.width=b}else a.tensorFormat="RGBA",a.height=p,a.width=b;c.drawImage(r,0,0),s=c.getImageData(0,0,b,p).data}else throw new Error("Can not access image data")}else if(t){let f,c;if(e!==void 0&&e.resizedWidth!==void 0&&e.resizedHeight!==void 0?(f=e.resizedHeight,c=e.resizedWidth):(f=r.height,c=r.width),e!==void 0&&(a=e),a.format="RGBA",a.height=f,a.width=c,e!==void 0){let p=u();p.width=c,p.height=f;let b=l(p);if(b!=null)b.putImageData(r,0,0),s=b.getImageData(0,0,c,f).data;else throw new Error("Can not access image data")}else s=r.data}else if(o){if(e===void 0)throw new Error("Please provide image config with format for Imagebitmap");let f=u();f.width=r.width,f.height=r.height;let c=l(f);if(c!=null){let p=r.height,b=r.width;return c.drawImage(r,0,0,b,p),s=c.getImageData(0,0,b,p).data,a.height=p,a.width=b,Ia(s,a)}else throw new Error("Can not access image data")}else{if(i)return new Promise((f,c)=>{let p=u(),b=l(p);if(!r||!b)return c();let h=new Image;h.crossOrigin="Anonymous",h.src=r,h.onload=()=>{p.width=h.width,p.height=h.height,b.drawImage(h,0,0,p.width,p.height);let g=b.getImageData(0,0,p.width,p.height);a.height=p.height,a.width=p.width,f(Ia(g.data,a))}});throw new Error("Input data provided is not supported - aborted tensor creation")}if(s!==void 0)return Ia(s,a);throw new Error("Input data provided is not supported - aborted tensor creation")},Xl=(r,e)=>{let{width:n,height:t,download:o,dispose:i}=e,s=[1,t,n,4];return new ht({location:"texture",type:"float32",texture:r,dims:s,download:o,dispose:i})},Zl=(r,e)=>{let{dataType:n,dims:t,download:o,dispose:i}=e;return new ht({location:"gpu-buffer",type:n??"float32",gpuBuffer:r,dims:t,download:o,dispose:i})},Yl=(r,e,n)=>new ht({location:"cpu-pinned",type:r,data:e,dims:n??[e.length]})});var Br,On,Ql,ec,tc=C(()=>{"use strict";Br=new Map([["float32",Float32Array],["uint8",Uint8Array],["int8",Int8Array],["uint16",Uint16Array],["int16",Int16Array],["int32",Int32Array],["bool",Uint8Array],["float64",Float64Array],["uint32",Uint32Array]]),On=new Map([[Float32Array,"float32"],[Uint8Array,"uint8"],[Int8Array,"int8"],[Uint16Array,"uint16"],[Int16Array,"int16"],[Int32Array,"int32"],[Float64Array,"float64"],[Uint32Array,"uint32"]]),Ql=!1,ec=()=>{if(!Ql){Ql=!0;let r=typeof BigInt64Array<"u"&&BigInt64Array.from,e=typeof BigUint64Array<"u"&&BigUint64Array.from,n=typeof Float16Array<"u"&&Float16Array.from;r&&(Br.set("int64",BigInt64Array),On.set(BigInt64Array,"int64")),e&&(Br.set("uint64",BigUint64Array),On.set(BigUint64Array,"uint64")),n?(Br.set("float16",Float16Array),On.set(Float16Array,"float16")):Br.set("float16",Uint16Array)}}});var rc,nc,oc=C(()=>{"use strict";wo();rc=r=>{let e=1;for(let n=0;n{switch(r.location){case"cpu":return new ht(r.type,r.data,e);case"cpu-pinned":return new ht({location:"cpu-pinned",data:r.data,type:r.type,dims:e});case"texture":return new ht({location:"texture",texture:r.texture,type:r.type,dims:e});case"gpu-buffer":return new ht({location:"gpu-buffer",gpuBuffer:r.gpuBuffer,type:r.type,dims:e});default:throw new Error(`tensorReshape: tensor location ${r.location} is not supported`)}}});var ht,wo=C(()=>{"use strict";Kl();Jl();tc();oc();ht=class{constructor(e,n,t){ec();let o,i;if(typeof e=="object"&&"location"in e)switch(this.dataLocation=e.location,o=e.type,i=e.dims,e.location){case"cpu-pinned":{let a=Br.get(o);if(!a)throw new TypeError(`unsupported type "${o}" to create tensor from pinned buffer`);if(!(e.data instanceof a))throw new TypeError(`buffer should be of type ${a.name}`);this.cpuData=e.data;break}case"texture":{if(o!=="float32")throw new TypeError(`unsupported type "${o}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break}case"gpu-buffer":{if(o!=="float32"&&o!=="float16"&&o!=="int32"&&o!=="int64"&&o!=="uint32"&&o!=="uint8"&&o!=="bool")throw new TypeError(`unsupported type "${o}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break}default:throw new Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let a,u;if(typeof e=="string")if(o=e,u=t,e==="string"){if(!Array.isArray(n))throw new TypeError("A string tensor's data must be a string array.");a=n}else{let l=Br.get(e);if(l===void 0)throw new TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(n)){if(e==="float16"&&l===Uint16Array)throw new TypeError("Creating a float16 tensor from number array is not supported. Please use Uint16Array as data.");e==="uint64"||e==="int64"?a=l.from(n,BigInt):a=l.from(n)}else if(n instanceof l)a=n;else throw new TypeError(`A ${o} tensor's data must be type of ${l}`)}else if(u=n,Array.isArray(e)){if(e.length===0)throw new TypeError("Tensor type cannot be inferred from an empty array.");let l=typeof e[0];if(l==="string")o="string",a=e;else if(l==="boolean")o="bool",a=Uint8Array.from(e);else throw new TypeError(`Invalid element type of data array: ${l}.`)}else{let l=On.get(e.constructor);if(l===void 0)throw new TypeError(`Unsupported type for tensor data: ${e.constructor}.`);o=l,a=e}if(u===void 0)u=[a.length];else if(!Array.isArray(u))throw new TypeError("A tensor's dims must be a number array");i=u,this.cpuData=a,this.dataLocation="cpu"}let s=rc(i);if(this.cpuData&&s!==this.cpuData.length)throw new Error(`Tensor's size(${s}) does not match data length(${this.cpuData.length}).`);this.type=o,this.dims=i,this.size=s}static async fromImage(e,n){return jl(e,n)}static fromTexture(e,n){return Xl(e,n)}static fromGpuBuffer(e,n){return Zl(e,n)}static fromPinnedBuffer(e,n,t){return Yl(e,n,t)}toDataURL(e){return Hl(this,e)}toImageData(e){return ql(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw new Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw new Error("The data is not stored as a WebGL texture.");return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw new Error("The data is not stored as a WebGPU buffer.");return this.gpuBufferData}async getData(e){switch(this.ensureValid(),this.dataLocation){case"cpu":case"cpu-pinned":return this.data;case"texture":case"gpu-buffer":{if(!this.downloader)throw new Error("The current tensor is not created with a specified data downloader.");if(this.isDownloading)throw new Error("The current tensor is being downloaded.");try{this.isDownloading=!0;let n=await this.downloader();return this.downloader=void 0,this.dataLocation="cpu",this.cpuData=n,e&&this.disposer&&(this.disposer(),this.disposer=void 0),n}finally{this.isDownloading=!1}}default:throw new Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw new Error("The current tensor is being downloaded.");this.disposer&&(this.disposer(),this.disposer=void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation="none"}ensureValid(){if(this.dataLocation==="none")throw new Error("The tensor is disposed.")}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw new Error("Cannot reshape a tensor that owns GPU resource.");return nc(this,e)}}});var it,To=C(()=>{"use strict";wo();it=ht});var _o,ic,St,yt,Sa=C(()=>{"use strict";_a();_o=(r,e)=>{(typeof It.trace>"u"?!It.wasm.trace:!It.trace)||console.timeStamp(`${r}::ORT::${e}`)},ic=(r,e)=>{let n=new Error().stack?.split(/\r\n|\r|\n/g)||[],t=!1;for(let o=0;o{(typeof It.trace>"u"?!It.wasm.trace:!It.trace)||ic("BEGIN",r)},yt=r=>{(typeof It.trace>"u"?!It.wasm.trace:!It.trace)||ic("END",r)}});var Io,ac=C(()=>{"use strict";vo();To();Sa();Io=class r{constructor(e){this.handler=e}async run(e,n,t){St();let o={},i={};if(typeof e!="object"||e===null||e instanceof it||Array.isArray(e))throw new TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let s=!0;if(typeof n=="object"){if(n===null)throw new TypeError("Unexpected argument[1]: cannot be null.");if(n instanceof it)throw new TypeError("'fetches' cannot be a Tensor");if(Array.isArray(n)){if(n.length===0)throw new TypeError("'fetches' cannot be an empty array.");s=!1;for(let l of n){if(typeof l!="string")throw new TypeError("'fetches' must be a string array or an object.");if(this.outputNames.indexOf(l)===-1)throw new RangeError(`'fetches' contains invalid output name: ${l}.`);o[l]=null}if(typeof t=="object"&&t!==null)i=t;else if(typeof t<"u")throw new TypeError("'options' must be an object.")}else{let l=!1,f=Object.getOwnPropertyNames(n);for(let c of this.outputNames)if(f.indexOf(c)!==-1){let p=n[c];(p===null||p instanceof it)&&(l=!0,s=!1,o[c]=p)}if(l){if(typeof t=="object"&&t!==null)i=t;else if(typeof t<"u")throw new TypeError("'options' must be an object.")}else i=n}}else if(typeof n<"u")throw new TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let l of this.inputNames)if(typeof e[l]>"u")throw new Error(`input '${l}' is missing in 'feeds'.`);if(s)for(let l of this.outputNames)o[l]=null;let a=await this.handler.run(e,o,i),u={};for(let l in a)if(Object.hasOwnProperty.call(a,l)){let f=a[l];f instanceof it?u[l]=f:u[l]=new it(f.type,f.data,f.dims)}return yt(),u}async release(){return this.handler.dispose()}static async create(e,n,t,o){St();let i,s={};if(typeof e=="string"){if(i=e,typeof n=="object"&&n!==null)s=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else if(e instanceof Uint8Array){if(i=e,typeof n=="object"&&n!==null)s=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else if(e instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&e instanceof SharedArrayBuffer){let f=e,c=0,p=e.byteLength;if(typeof n=="object"&&n!==null)s=n;else if(typeof n=="number"){if(c=n,!Number.isSafeInteger(c))throw new RangeError("'byteOffset' must be an integer.");if(c<0||c>=f.byteLength)throw new RangeError(`'byteOffset' is out of range [0, ${f.byteLength}).`);if(p=e.byteLength-c,typeof t=="number"){if(p=t,!Number.isSafeInteger(p))throw new RangeError("'byteLength' must be an integer.");if(p<=0||c+p>f.byteLength)throw new RangeError(`'byteLength' is out of range (0, ${f.byteLength-c}].`);if(typeof o=="object"&&o!==null)s=o;else if(typeof o<"u")throw new TypeError("'options' must be an object.")}else if(typeof t<"u")throw new TypeError("'byteLength' must be a number.")}else if(typeof n<"u")throw new TypeError("'options' must be an object.");i=new Uint8Array(f,c,p)}else throw new TypeError("Unexpected argument[0]: must be 'path' or 'buffer'.");let[a,u]=await xo(s),l=await a.createInferenceSessionHandler(i,u);return yt(),new r(l)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}}});var ov,sc=C(()=>{"use strict";ac();ov=Io});var uc=C(()=>{"use strict"});var lc=C(()=>{"use strict"});var cc=C(()=>{"use strict"});var fc=C(()=>{"use strict"});var iv,So,dc=C(()=>{"use strict";vo();To();iv="Training backend could not be resolved. Make sure you're using the correct configuration & WebAssembly files.",So=class r{constructor(e,n,t){this.handler=e,this.hasOptimizerModel=n,this.hasEvalModel=t}get trainingInputNames(){return this.handler.inputNames}get trainingOutputNames(){return this.handler.outputNames}get evalInputNames(){if(this.hasEvalModel)return this.handler.evalInputNames;throw new Error("This training session has no evalModel loaded.")}get evalOutputNames(){if(this.hasEvalModel)return this.handler.evalOutputNames;throw new Error("This training session has no evalModel loaded.")}static async create(e,n){let t=e.evalModel||"",o=e.optimizerModel||"",i=n||{},[s,a]=await xo(i);if(s.createTrainingSessionHandler){let u=await s.createTrainingSessionHandler(e.checkpointState,e.trainModel,t,o,a);return new r(u,!!e.optimizerModel,!!e.evalModel)}else throw new Error(iv)}typeNarrowingForRunStep(e,n,t,o,i){let s={},a={};if(typeof t!="object"||t===null||t instanceof it||Array.isArray(t))throw new TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let u=!0;if(typeof o=="object"){if(o===null)throw new TypeError("Unexpected argument[1]: cannot be null.");if(o instanceof it)throw new TypeError("'fetches' cannot be a Tensor");if(Array.isArray(o)){if(o.length===0)throw new TypeError("'fetches' cannot be an empty array.");u=!1;for(let l of o){if(typeof l!="string")throw new TypeError("'fetches' must be a string array or an object.");if(n.indexOf(l)===-1)throw new RangeError(`'fetches' contains invalid output name: ${l}.`);s[l]=null}if(typeof i=="object"&&i!==null)a=i;else if(typeof i<"u")throw new TypeError("'options' must be an object.")}else{let l=!1,f=Object.getOwnPropertyNames(o);for(let c of n)if(f.indexOf(c)!==-1){let p=o[c];(p===null||p instanceof it)&&(l=!0,u=!1,s[c]=p)}if(l){if(typeof i=="object"&&i!==null)a=i;else if(typeof i<"u")throw new TypeError("'options' must be an object.")}else a=o}}else if(typeof o<"u")throw new TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let l of e)if(typeof t[l]>"u")throw new Error(`input '${l}' is missing in 'feeds'.`);if(u)for(let l of n)s[l]=null;return[s,a]}convertHandlerReturnTypeToMapOfTensors(e){let n={};for(let t in e)if(Object.hasOwnProperty.call(e,t)){let o=e[t];o instanceof it?n[t]=o:n[t]=new it(o.type,o.data,o.dims)}return n}async lazyResetGrad(){await this.handler.lazyResetGrad()}async runTrainStep(e,n,t){let[o,i]=this.typeNarrowingForRunStep(this.trainingInputNames,this.trainingOutputNames,e,n,t),s=await this.handler.runTrainStep(e,o,i);return this.convertHandlerReturnTypeToMapOfTensors(s)}async runOptimizerStep(e){if(this.hasOptimizerModel)await this.handler.runOptimizerStep(e||{});else throw new Error("This TrainingSession has no OptimizerModel loaded.")}async runEvalStep(e,n,t){if(this.hasEvalModel){let[o,i]=this.typeNarrowingForRunStep(this.evalInputNames,this.evalOutputNames,e,n,t),s=await this.handler.runEvalStep(e,o,i);return this.convertHandlerReturnTypeToMapOfTensors(s)}else throw new Error("This TrainingSession has no EvalModel loaded.")}async getParametersSize(e=!0){return this.handler.getParametersSize(e)}async loadParametersBuffer(e,n=!0){let t=await this.getParametersSize(n);if(e.length!==4*t)throw new Error("Size of the buffer passed into loadParametersBuffer must match the number of parameters in the model. Please use getParametersSize method to check.");return this.handler.loadParametersBuffer(e,n)}async getContiguousParameters(e=!0){return this.handler.getContiguousParameters(e)}async release(){return this.handler.dispose()}}});var av,pc=C(()=>{"use strict";dc();av=So});var $a={};sn($a,{InferenceSession:()=>ov,TRACE:()=>_o,TRACE_FUNC_BEGIN:()=>St,TRACE_FUNC_END:()=>yt,Tensor:()=>it,TrainingSession:()=>av,env:()=>le,registerBackend:()=>vr});var ft=C(()=>{"use strict";Ml();Wl();sc();To();uc();lc();Sa();cc();fc();pc()});function wr(r,e,n,t){if(e===void 0)return uv(r);if(n===void 0)$o(r,e,1);else if(typeof n=="number"&&t===void 0)$o(r,e,n);else if(typeof n=="string"&&t===void 0)$o(r,n,1,e);else if(typeof n=="string"&&typeof t=="number")$o(r,n,t,e);else throw new TypeError("input is valid")}function uv(r){return{verbose:wr.verbose.bind(null,r),info:wr.info.bind(null,r),warning:wr.warning.bind(null,r),error:wr.error.bind(null,r),fatal:wr.fatal.bind(null,r)}}function $o(r,e,n,t){let o=En[t||""]||En[""];hc[r]{"use strict";Aa=class{log(e,n,t){}},Pa=class{log(e,n,t){console.log(`${this.color(e)} ${t?"\x1B[35m"+t+"\x1B[0m ":""}${n}`)}color(e){switch(e){case"verbose":return"\x1B[34;40mv\x1B[0m";case"info":return"\x1B[32mi\x1B[0m";case"warning":return"\x1B[30;43mw\x1B[0m";case"error":return"\x1B[31;40me\x1B[0m";case"fatal":return"\x1B[101mf\x1B[0m";default:throw new Error(`unsupported severity: ${e}`)}}},hc={verbose:1e3,info:2e3,warning:4e3,error:5e3,fatal:6e3},sv={none:new Aa,console:new Pa},gc={provider:"console",minimalSeverity:"warning",logDateTime:!0,logSourceLocation:!1},En={"":gc};(u=>{function r(l,f){u("verbose",l,f)}u.verbose=r;function e(l,f){u("info",l,f)}u.info=e;function n(l,f){u("warning",l,f)}u.warning=n;function t(l,f){u("error",l,f)}u.error=t;function o(l,f){u("fatal",l,f)}u.fatal=o;function i(l){En={},s("",l||{})}u.reset=i;function s(l,f){if(l==="*")i(f);else{let c=En[l]||gc;En[l]={provider:f.provider||c.provider,minimalSeverity:f.minimalSeverity||c.minimalSeverity,logDateTime:f.logDateTime===void 0?c.logDateTime:f.logDateTime,logSourceLocation:f.logSourceLocation===void 0?c.logSourceLocation:f.logSourceLocation}}}u.set=s;function a(l){let f={};l.logLevel&&(f.minimalSeverity=l.logLevel),s("",f)}u.setWithEnv=a})(wr||={});Re=wr,Po=class{constructor(e,n,t,o,i,s){this.category=e;this.name=n;this.startTime=t;this.endCallback=o;this.timer=i;this.ctx=s}async end(){return this.endCallback(this)}async checkTimer(){if(this.ctx===void 0||this.timer===void 0)throw new Error("No webgl timer found");return this.ctx.endTimer(),this.ctx.waitForQueryAndGetTime(this.timer)}},Oo=class{constructor(e,n,t,o){this.category=e;this.name=n;this.startTime=t;this.endTime=o}},Eo=class{constructor(e,n,t){this._started=!1;this._flushPointer=0;this._started=!1,this._maxNumberEvents=e===void 0?1e4:e,this._flushBatchSize=n===void 0?10:n,this._flushIntervalInMilliseconds=t===void 0?5e3:t}static create(e){return e===void 0?new this:new this(e.maxNumberEvents,e.flushBatchSize,e.flushIntervalInMilliseconds)}start(){this._started=!0,this._timingEvents=[],this._flushTime=Ao(),this._flushPointer=0}stop(){for(this._started=!1;this._flushPointer{a.then(async f=>{i&&await i.end(),u(f)},async f=>{i&&await i.end(),l(f)})});if(!s&&i){let u=i.end();if(u&&typeof u.then=="function")return new Promise((l,f)=>{u.then(()=>{l(a)},c=>{f(c)})})}return a}begin(e,n,t){if(!this._started)throw new Error("profiler is not started yet");if(t===void 0){let o=Ao();return this.flush(o),new Po(e,n,o,i=>this.endSync(i))}else{let o=t.beginTimer();return new Po(e,n,0,async i=>this.end(i),o,t)}}async end(e){let n=await e.checkTimer();this._timingEvents.length=this._flushBatchSize||e-this._flushTime>=this._flushIntervalInMilliseconds){for(let n=this._flushPointer;this._flushPointerperformance.now():Date.now});function bc(r,e,n){for(let t of n){let o=t[0],i=t[1],s=t[2],a=t[3],u=t[4];if(r.opType===o){for(let l of e)if((l.domain===i||l.domain==="ai.onnx"&&i==="")&&lv(l.version,s))return{opImpl:a,opInit:u}}}throw new TypeError(`cannot resolve operator '${r.opType}' with opsets: ${e.map(t=>`${t.domain||"ai.onnx"} v${t.version}`).join(", ")}`)}function lv(r,e){if(e.endsWith("+")){let n=Number.parseInt(e.substring(0,e.length-1),10);return!isNaN(n)&&n<=r}else if(e.split("-").length===2){let n=e.split("-"),t=Number.parseInt(n[0],10),o=Number.parseInt(n[1],10);return!isNaN(t)&&!isNaN(o)&&t<=r&&r<=o}else return Number.parseInt(e,10)===r}var yc=C(()=>{"use strict"});var xc=Je(Oa=>{"use strict";Oa.__esModule=!0;var cv=function(){function r(e){if(!e)throw new TypeError("Invalid argument; `value` has no value.");this.value=r.EMPTY,e&&r.isGuid(e)&&(this.value=e)}return r.isGuid=function(e){var n=e.toString();return e&&(e instanceof r||r.validator.test(n))},r.create=function(){return new r([r.gen(2),r.gen(1),r.gen(1),r.gen(1),r.gen(3)].join("-"))},r.createEmpty=function(){return new r("emptyguid")},r.parse=function(e){return new r(e)},r.raw=function(){return[r.gen(2),r.gen(1),r.gen(1),r.gen(1),r.gen(3)].join("-")},r.gen=function(e){for(var n="",t=0;t>>=0,(o=0<=r&&r<256)&&(t=Tc[r],t)?t:(n=ke(r,0,!0),o&&(Tc[r]=n),n)):(r|=0,(o=-128<=r&&r<128)&&(t=wc[r],t)?t:(n=ke(r,r<0?-1:0,!1),o&&(wc[r]=n),n))}function Et(r,e){if(isNaN(r))return e?fr:Nt;if(e){if(r<0)return fr;if(r>=$c)return Oc}else{if(r<=-Ic)return xt;if(r+1>=Ic)return Pc}return r<0?Et(-r,e).neg():ke(r%cn|0,r/cn|0,e)}function ke(r,e,n){return new Me(r,e,n)}function Ca(r,e,n){if(r.length===0)throw Error("empty string");if(typeof e=="number"?(n=e,e=!1):e=!!e,r==="NaN"||r==="Infinity"||r==="+Infinity"||r==="-Infinity")return e?fr:Nt;if(n=n||10,n<2||360)throw Error("interior hyphen");if(t===0)return Ca(r.substring(1),e,n).neg();for(var o=Et(Co(n,8)),i=Nt,s=0;s{Ot=null;try{Ot=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch{}Me.prototype.__isLong__;Object.defineProperty(Me.prototype,"__isLong__",{value:!0});Me.isLong=dt;wc={},Tc={};Me.fromInt=Lr;Me.fromNumber=Et;Me.fromBits=ke;Co=Math.pow;Me.fromString=Ca;Me.fromValue=zt;_c=65536,fv=1<<24,cn=_c*_c,$c=cn*cn,Ic=$c/2,Sc=Lr(fv),Nt=Lr(0);Me.ZERO=Nt;fr=Lr(0,!0);Me.UZERO=fr;ln=Lr(1);Me.ONE=ln;Ac=Lr(1,!0);Me.UONE=Ac;Ea=Lr(-1);Me.NEG_ONE=Ea;Pc=ke(-1,2147483647,!1);Me.MAX_VALUE=Pc;Oc=ke(-1,-1,!0);Me.MAX_UNSIGNED_VALUE=Oc;xt=ke(0,-2147483648,!1);Me.MIN_VALUE=xt;U=Me.prototype;U.toInt=function(){return this.unsigned?this.low>>>0:this.low};U.toNumber=function(){return this.unsigned?(this.high>>>0)*cn+(this.low>>>0):this.high*cn+(this.low>>>0)};U.toString=function(e){if(e=e||10,e<2||36>>0,f=l.toString(e);if(s=u,s.isZero())return f+a;for(;f.length<6;)f="0"+f;a=""+f+a}};U.getHighBits=function(){return this.high};U.getHighBitsUnsigned=function(){return this.high>>>0};U.getLowBits=function(){return this.low};U.getLowBitsUnsigned=function(){return this.low>>>0};U.getNumBitsAbs=function(){if(this.isNegative())return this.eq(xt)?64:this.neg().getNumBitsAbs();for(var e=this.high!=0?this.high:this.low,n=31;n>0&&!(e&1<=0};U.isOdd=function(){return(this.low&1)===1};U.isEven=function(){return(this.low&1)===0};U.equals=function(e){return dt(e)||(e=zt(e)),this.unsigned!==e.unsigned&&this.high>>>31===1&&e.high>>>31===1?!1:this.high===e.high&&this.low===e.low};U.eq=U.equals;U.notEquals=function(e){return!this.eq(e)};U.neq=U.notEquals;U.ne=U.notEquals;U.lessThan=function(e){return this.comp(e)<0};U.lt=U.lessThan;U.lessThanOrEqual=function(e){return this.comp(e)<=0};U.lte=U.lessThanOrEqual;U.le=U.lessThanOrEqual;U.greaterThan=function(e){return this.comp(e)>0};U.gt=U.greaterThan;U.greaterThanOrEqual=function(e){return this.comp(e)>=0};U.gte=U.greaterThanOrEqual;U.ge=U.greaterThanOrEqual;U.compare=function(e){if(dt(e)||(e=zt(e)),this.eq(e))return 0;var n=this.isNegative(),t=e.isNegative();return n&&!t?-1:!n&&t?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1};U.comp=U.compare;U.negate=function(){return!this.unsigned&&this.eq(xt)?xt:this.not().add(ln)};U.neg=U.negate;U.add=function(e){dt(e)||(e=zt(e));var n=this.high>>>16,t=this.high&65535,o=this.low>>>16,i=this.low&65535,s=e.high>>>16,a=e.high&65535,u=e.low>>>16,l=e.low&65535,f=0,c=0,p=0,b=0;return b+=i+l,p+=b>>>16,b&=65535,p+=o+u,c+=p>>>16,p&=65535,c+=t+a,f+=c>>>16,c&=65535,f+=n+s,f&=65535,ke(p<<16|b,f<<16|c,this.unsigned)};U.subtract=function(e){return dt(e)||(e=zt(e)),this.add(e.neg())};U.sub=U.subtract;U.multiply=function(e){if(this.isZero())return this;if(dt(e)||(e=zt(e)),Ot){var n=Ot.mul(this.low,this.high,e.low,e.high);return ke(n,Ot.get_high(),this.unsigned)}if(e.isZero())return this.unsigned?fr:Nt;if(this.eq(xt))return e.isOdd()?xt:Nt;if(e.eq(xt))return this.isOdd()?xt:Nt;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(Sc)&&e.lt(Sc))return Et(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,o=this.high&65535,i=this.low>>>16,s=this.low&65535,a=e.high>>>16,u=e.high&65535,l=e.low>>>16,f=e.low&65535,c=0,p=0,b=0,h=0;return h+=s*f,b+=h>>>16,h&=65535,b+=i*f,p+=b>>>16,b&=65535,b+=s*l,p+=b>>>16,b&=65535,p+=o*f,c+=p>>>16,p&=65535,p+=i*l,c+=p>>>16,p&=65535,p+=s*u,c+=p>>>16,p&=65535,c+=t*f+o*l+i*u+s*a,c&=65535,ke(b<<16|h,c<<16|p,this.unsigned)};U.mul=U.multiply;U.divide=function(e){if(dt(e)||(e=zt(e)),e.isZero())throw Error("division by zero");if(Ot){if(!this.unsigned&&this.high===-2147483648&&e.low===-1&&e.high===-1)return this;var n=(this.unsigned?Ot.div_u:Ot.div_s)(this.low,this.high,e.low,e.high);return ke(n,Ot.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?fr:Nt;var t,o,i;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return fr;if(e.gt(this.shru(1)))return Ac;i=fr}else{if(this.eq(xt)){if(e.eq(ln)||e.eq(Ea))return xt;if(e.eq(xt))return ln;var s=this.shr(1);return t=s.div(e).shl(1),t.eq(Nt)?e.isNegative()?ln:Ea:(o=this.sub(e.mul(t)),i=t.add(o.div(e)),i)}else if(e.eq(xt))return this.unsigned?fr:Nt;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();i=Nt}for(o=this;o.gte(e);){t=Math.max(1,Math.floor(o.toNumber()/e.toNumber()));for(var a=Math.ceil(Math.log(t)/Math.LN2),u=a<=48?1:Co(2,a-48),l=Et(t),f=l.mul(e);f.isNegative()||f.gt(o);)t-=u,l=Et(t,this.unsigned),f=l.mul(e);l.isZero()&&(l=ln),i=i.add(l),o=o.sub(f)}return i};U.div=U.divide;U.modulo=function(e){if(dt(e)||(e=zt(e)),Ot){var n=(this.unsigned?Ot.rem_u:Ot.rem_s)(this.low,this.high,e.low,e.high);return ke(n,Ot.get_high(),this.unsigned)}return this.sub(this.div(e).mul(e))};U.mod=U.modulo;U.rem=U.modulo;U.not=function(){return ke(~this.low,~this.high,this.unsigned)};U.countLeadingZeros=function(){return this.high?Math.clz32(this.high):Math.clz32(this.low)+32};U.clz=U.countLeadingZeros;U.countTrailingZeros=function(){return this.low?vc(this.low):vc(this.high)+32};U.ctz=U.countTrailingZeros;U.and=function(e){return dt(e)||(e=zt(e)),ke(this.low&e.low,this.high&e.high,this.unsigned)};U.or=function(e){return dt(e)||(e=zt(e)),ke(this.low|e.low,this.high|e.high,this.unsigned)};U.xor=function(e){return dt(e)||(e=zt(e)),ke(this.low^e.low,this.high^e.high,this.unsigned)};U.shiftLeft=function(e){return dt(e)&&(e=e.toInt()),(e&=63)===0?this:e<32?ke(this.low<>>32-e,this.unsigned):ke(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):ke(this.high>>e-32,this.high>=0?0:-1,this.unsigned)};U.shr=U.shiftRight;U.shiftRightUnsigned=function(e){return dt(e)&&(e=e.toInt()),(e&=63)===0?this:e<32?ke(this.low>>>e|this.high<<32-e,this.high>>>e,this.unsigned):e===32?ke(this.high,0,this.unsigned):ke(this.high>>>e-32,0,this.unsigned)};U.shru=U.shiftRightUnsigned;U.shr_u=U.shiftRightUnsigned;U.rotateLeft=function(e){var n;return dt(e)&&(e=e.toInt()),(e&=63)===0?this:e===32?ke(this.high,this.low,this.unsigned):e<32?(n=32-e,ke(this.low<>>n,this.high<>>n,this.unsigned)):(e-=32,n=32-e,ke(this.high<>>n,this.low<>>n,this.unsigned))};U.rotl=U.rotateLeft;U.rotateRight=function(e){var n;return dt(e)&&(e=e.toInt()),(e&=63)===0?this:e===32?ke(this.high,this.low,this.unsigned):e<32?(n=32-e,ke(this.high<>>e,this.low<>>e,this.unsigned)):(e-=32,n=32-e,ke(this.low<>>e,this.high<>>e,this.unsigned))};U.rotr=U.rotateRight;U.toSigned=function(){return this.unsigned?ke(this.low,this.high,!1):this};U.toUnsigned=function(){return this.unsigned?this:ke(this.low,this.high,!0)};U.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()};U.toBytesLE=function(){var e=this.high,n=this.low;return[n&255,n>>>8&255,n>>>16&255,n>>>24,e&255,e>>>8&255,e>>>16&255,e>>>24]};U.toBytesBE=function(){var e=this.high,n=this.low;return[e>>>24,e>>>16&255,e>>>8&255,e&255,n>>>24,n>>>16&255,n>>>8&255,n&255]};Me.fromBytes=function(e,n,t){return t?Me.fromBytesLE(e,n):Me.fromBytesBE(e,n)};Me.fromBytesLE=function(e,n){return new Me(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,n)};Me.fromBytesBE=function(e,n){return new Me(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],n)};dr=Me});var k,ko=C(()=>{k={};k.Offset;k.Table;k.SIZEOF_SHORT=2;k.SIZEOF_INT=4;k.FILE_IDENTIFIER_LENGTH=4;k.SIZE_PREFIX_LENGTH=4;k.Encoding={UTF8_BYTES:1,UTF16_STRING:2};k.int32=new Int32Array(2);k.float32=new Float32Array(k.int32.buffer);k.float64=new Float64Array(k.int32.buffer);k.isLittleEndian=new Uint16Array(new Uint8Array([1,0]).buffer)[0]===1;k.Long=function(r,e){this.low=r|0,this.high=e|0};k.Long.create=function(r,e){return r==0&&e==0?k.Long.ZERO:new k.Long(r,e)};k.Long.prototype.toFloat64=function(){return(this.low>>>0)+this.high*4294967296};k.Long.prototype.equals=function(r){return this.low==r.low&&this.high==r.high};k.Long.ZERO=new k.Long(0,0);k.Builder=function(r){if(r)var e=r;else var e=1024;this.bb=k.ByteBuffer.allocate(e),this.space=e,this.minalign=1,this.vtable=null,this.vtable_in_use=0,this.isNested=!1,this.object_start=0,this.vtables=[],this.vector_num_elems=0,this.force_defaults=!1};k.Builder.prototype.clear=function(){this.bb.clear(),this.space=this.bb.capacity(),this.minalign=1,this.vtable=null,this.vtable_in_use=0,this.isNested=!1,this.object_start=0,this.vtables=[],this.vector_num_elems=0,this.force_defaults=!1};k.Builder.prototype.forceDefaults=function(r){this.force_defaults=r};k.Builder.prototype.dataBuffer=function(){return this.bb};k.Builder.prototype.asUint8Array=function(){return this.bb.bytes().subarray(this.bb.position(),this.bb.position()+this.offset())};k.Builder.prototype.prep=function(r,e){r>this.minalign&&(this.minalign=r);for(var n=~(this.bb.capacity()-this.space+e)+1&r-1;this.space=0&&this.vtable[e]==0;e--);for(var n=e+1;e>=0;e--)this.addInt16(this.vtable[e]!=0?r-this.vtable[e]:0);var t=2;this.addInt16(r-this.object_start);var o=(n+t)*k.SIZEOF_SHORT;this.addInt16(o);var i=0,s=this.space;e:for(e=0;e=0;i--)this.writeInt8(o.charCodeAt(i))}this.prep(this.minalign,k.SIZEOF_INT+t),this.addOffset(r),t&&this.addInt32(this.bb.capacity()-this.space),this.bb.setPosition(this.space)};k.Builder.prototype.finishSizePrefixed=function(r,e){this.finish(r,e,!0)};k.Builder.prototype.requiredField=function(r,e){var n=this.bb.capacity()-r,t=n-this.bb.readInt32(n),o=this.bb.readInt16(t+e)!=0;if(!o)throw new Error("FlatBuffers: field "+e+" must be set")};k.Builder.prototype.startVector=function(r,e,n){this.notNested(),this.vector_num_elems=e,this.prep(k.SIZEOF_INT,r*e),this.prep(n,r*e)};k.Builder.prototype.endVector=function(){return this.writeInt32(this.vector_num_elems),this.offset()};k.Builder.prototype.createString=function(r){if(r instanceof Uint8Array)var e=r;else for(var e=[],n=0;n=56320)t=o;else{var i=r.charCodeAt(n++);t=(o<<10)+i+(65536-56623104-56320)}t<128?e.push(t):(t<2048?e.push(t>>6&31|192):(t<65536?e.push(t>>12&15|224):e.push(t>>18&7|240,t>>12&63|128),e.push(t>>6&63|128)),e.push(t&63|128))}this.addInt8(0),this.startVector(1,e.length,1),this.bb.setPosition(this.space-=e.length);for(var n=0,s=this.space,a=this.bb.bytes();n>24};k.ByteBuffer.prototype.readUint8=function(r){return this.bytes_[r]};k.ByteBuffer.prototype.readInt16=function(r){return this.readUint16(r)<<16>>16};k.ByteBuffer.prototype.readUint16=function(r){return this.bytes_[r]|this.bytes_[r+1]<<8};k.ByteBuffer.prototype.readInt32=function(r){return this.bytes_[r]|this.bytes_[r+1]<<8|this.bytes_[r+2]<<16|this.bytes_[r+3]<<24};k.ByteBuffer.prototype.readUint32=function(r){return this.readInt32(r)>>>0};k.ByteBuffer.prototype.readInt64=function(r){return new k.Long(this.readInt32(r),this.readInt32(r+4))};k.ByteBuffer.prototype.readUint64=function(r){return new k.Long(this.readUint32(r),this.readUint32(r+4))};k.ByteBuffer.prototype.readFloat32=function(r){return k.int32[0]=this.readInt32(r),k.float32[0]};k.ByteBuffer.prototype.readFloat64=function(r){return k.int32[k.isLittleEndian?0:1]=this.readInt32(r),k.int32[k.isLittleEndian?1:0]=this.readInt32(r+4),k.float64[0]};k.ByteBuffer.prototype.writeInt8=function(r,e){this.bytes_[r]=e};k.ByteBuffer.prototype.writeUint8=function(r,e){this.bytes_[r]=e};k.ByteBuffer.prototype.writeInt16=function(r,e){this.bytes_[r]=e,this.bytes_[r+1]=e>>8};k.ByteBuffer.prototype.writeUint16=function(r,e){this.bytes_[r]=e,this.bytes_[r+1]=e>>8};k.ByteBuffer.prototype.writeInt32=function(r,e){this.bytes_[r]=e,this.bytes_[r+1]=e>>8,this.bytes_[r+2]=e>>16,this.bytes_[r+3]=e>>24};k.ByteBuffer.prototype.writeUint32=function(r,e){this.bytes_[r]=e,this.bytes_[r+1]=e>>8,this.bytes_[r+2]=e>>16,this.bytes_[r+3]=e>>24};k.ByteBuffer.prototype.writeInt64=function(r,e){this.writeInt32(r,e.low),this.writeInt32(r+4,e.high)};k.ByteBuffer.prototype.writeUint64=function(r,e){this.writeUint32(r,e.low),this.writeUint32(r+4,e.high)};k.ByteBuffer.prototype.writeFloat32=function(r,e){k.float32[0]=e,this.writeInt32(r,k.int32[0])};k.ByteBuffer.prototype.writeFloat64=function(r,e){k.float64[0]=e,this.writeInt32(r,k.int32[k.isLittleEndian?0:1]),this.writeInt32(r+4,k.int32[k.isLittleEndian?1:0])};k.ByteBuffer.prototype.getBufferIdentifier=function(){if(this.bytes_.length>10)+55296,(i&1024-1)+56320))}return t};k.ByteBuffer.prototype.__indirect=function(r){return r+this.readInt32(r)};k.ByteBuffer.prototype.__vector=function(r){return r+this.readInt32(r)+k.SIZEOF_INT};k.ByteBuffer.prototype.__vector_len=function(r){return this.readInt32(r+this.readInt32(r))};k.ByteBuffer.prototype.__has_identifier=function(r){if(r.length!=k.FILE_IDENTIFIER_LENGTH)throw new Error("FlatBuffers: file identifier must be length "+k.FILE_IDENTIFIER_LENGTH);for(var e=0;e{"use strict";ko();(e=>{let r;(t=>{let n;(i=>{let o;(S=>(S[S.UNDEFINED=0]="UNDEFINED",S[S.FLOAT=1]="FLOAT",S[S.INT=2]="INT",S[S.STRING=3]="STRING",S[S.TENSOR=4]="TENSOR",S[S.GRAPH=5]="GRAPH",S[S.FLOATS=6]="FLOATS",S[S.INTS=7]="INTS",S[S.STRINGS=8]="STRINGS",S[S.TENSORS=9]="TENSORS",S[S.GRAPHS=10]="GRAPHS",S[S.SPARSE_TENSOR=11]="SPARSE_TENSOR",S[S.SPARSE_TENSORS=12]="SPARSE_TENSORS"))(o=i.AttributeType||={})})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{let o;(l=>(l[l.UNKNOWN=0]="UNKNOWN",l[l.VALUE=1]="VALUE",l[l.PARAM=2]="PARAM"))(o=i.DimensionValueType||={})})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{let o;(F=>(F[F.UNDEFINED=0]="UNDEFINED",F[F.FLOAT=1]="FLOAT",F[F.UINT8=2]="UINT8",F[F.INT8=3]="INT8",F[F.UINT16=4]="UINT16",F[F.INT16=5]="INT16",F[F.INT32=6]="INT32",F[F.INT64=7]="INT64",F[F.STRING=8]="STRING",F[F.BOOL=9]="BOOL",F[F.FLOAT16=10]="FLOAT16",F[F.DOUBLE=11]="DOUBLE",F[F.UINT32=12]="UINT32",F[F.UINT64=13]="UINT64",F[F.COMPLEX64=14]="COMPLEX64",F[F.COMPLEX128=15]="COMPLEX128",F[F.BFLOAT16=16]="BFLOAT16",F[F.FLOAT8E4M3FN=17]="FLOAT8E4M3FN",F[F.FLOAT8E4M3FNUZ=18]="FLOAT8E4M3FNUZ",F[F.FLOAT8E5M2=19]="FLOAT8E5M2",F[F.FLOAT8E5M2FNUZ=20]="FLOAT8E5M2FNUZ"))(o=i.TensorDataType||={})})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{let o;(u=>(u[u.Primitive=0]="Primitive",u[u.Fused=1]="Fused"))(o=i.NodeType||={})})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{let o;(f=>(f[f.NONE=0]="NONE",f[f.tensor_type=1]="tensor_type",f[f.sequence_type=2]="sequence_type",f[f.map_type=3]="map_type"))(o=i.TypeInfoValue||={})})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsShape(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsShape(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}dim(a,u){let l=this.bb.__offset(this.bb_pos,4);return l?(u||new e.experimental.fbs.Dimension).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}dimLength(){let a=this.bb.__offset(this.bb_pos,4);return a?this.bb.__vector_len(this.bb_pos+a):0}static startShape(a){a.startObject(1)}static addDim(a,u){a.addFieldOffset(0,u,0)}static createDimVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startDimVector(a,u){a.startVector(4,u,4)}static endShape(a){return a.endObject()}static createShape(a,u){return o.startShape(a),o.addDim(a,u),o.endShape(a)}}i.Shape=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsDimension(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsDimension(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}value(a){let u=this.bb.__offset(this.bb_pos,4);return u?(a||new e.experimental.fbs.DimensionValue).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}denotation(a){let u=this.bb.__offset(this.bb_pos,6);return u?this.bb.__string(this.bb_pos+u,a):null}static startDimension(a){a.startObject(2)}static addValue(a,u){a.addFieldOffset(0,u,0)}static addDenotation(a,u){a.addFieldOffset(1,u,0)}static endDimension(a){return a.endObject()}static createDimension(a,u,l){return o.startDimension(a),o.addValue(a,u),o.addDenotation(a,l),o.endDimension(a)}}i.Dimension=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsDimensionValue(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsDimensionValue(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}dimType(){let a=this.bb.__offset(this.bb_pos,4);return a?this.bb.readInt8(this.bb_pos+a):0}dimValue(){let a=this.bb.__offset(this.bb_pos,6);return a?this.bb.readInt64(this.bb_pos+a):this.bb.createLong(0,0)}dimParam(a){let u=this.bb.__offset(this.bb_pos,8);return u?this.bb.__string(this.bb_pos+u,a):null}static startDimensionValue(a){a.startObject(3)}static addDimType(a,u){a.addFieldInt8(0,u,0)}static addDimValue(a,u){a.addFieldInt64(1,u,a.createLong(0,0))}static addDimParam(a,u){a.addFieldOffset(2,u,0)}static endDimensionValue(a){return a.endObject()}static createDimensionValue(a,u,l,f){return o.startDimensionValue(a),o.addDimType(a,u),o.addDimValue(a,l),o.addDimParam(a,f),o.endDimensionValue(a)}}i.DimensionValue=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsTensorTypeAndShape(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsTensorTypeAndShape(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}elemType(){let a=this.bb.__offset(this.bb_pos,4);return a?this.bb.readInt32(this.bb_pos+a):0}shape(a){let u=this.bb.__offset(this.bb_pos,6);return u?(a||new e.experimental.fbs.Shape).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}static startTensorTypeAndShape(a){a.startObject(2)}static addElemType(a,u){a.addFieldInt32(0,u,0)}static addShape(a,u){a.addFieldOffset(1,u,0)}static endTensorTypeAndShape(a){return a.endObject()}static createTensorTypeAndShape(a,u,l){return o.startTensorTypeAndShape(a),o.addElemType(a,u),o.addShape(a,l),o.endTensorTypeAndShape(a)}}i.TensorTypeAndShape=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsMapType(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsMapType(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}keyType(){let a=this.bb.__offset(this.bb_pos,4);return a?this.bb.readInt32(this.bb_pos+a):0}valueType(a){let u=this.bb.__offset(this.bb_pos,6);return u?(a||new e.experimental.fbs.TypeInfo).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}static startMapType(a){a.startObject(2)}static addKeyType(a,u){a.addFieldInt32(0,u,0)}static addValueType(a,u){a.addFieldOffset(1,u,0)}static endMapType(a){return a.endObject()}static createMapType(a,u,l){return o.startMapType(a),o.addKeyType(a,u),o.addValueType(a,l),o.endMapType(a)}}i.MapType=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsSequenceType(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsSequenceType(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}elemType(a){let u=this.bb.__offset(this.bb_pos,4);return u?(a||new e.experimental.fbs.TypeInfo).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}static startSequenceType(a){a.startObject(1)}static addElemType(a,u){a.addFieldOffset(0,u,0)}static endSequenceType(a){return a.endObject()}static createSequenceType(a,u){return o.startSequenceType(a),o.addElemType(a,u),o.endSequenceType(a)}}i.SequenceType=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}nodeIndex(){return this.bb.readUint32(this.bb_pos)}srcArgIndex(){return this.bb.readInt32(this.bb_pos+4)}dstArgIndex(){return this.bb.readInt32(this.bb_pos+8)}static createEdgeEnd(a,u,l,f){return a.prep(4,12),a.writeInt32(f),a.writeInt32(l),a.writeInt32(u),a.offset()}}i.EdgeEnd=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsNodeEdge(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsNodeEdge(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}nodeIndex(){let a=this.bb.__offset(this.bb_pos,4);return a?this.bb.readUint32(this.bb_pos+a):0}inputEdges(a,u){let l=this.bb.__offset(this.bb_pos,6);return l?(u||new e.experimental.fbs.EdgeEnd).__init(this.bb.__vector(this.bb_pos+l)+a*12,this.bb):null}inputEdgesLength(){let a=this.bb.__offset(this.bb_pos,6);return a?this.bb.__vector_len(this.bb_pos+a):0}outputEdges(a,u){let l=this.bb.__offset(this.bb_pos,8);return l?(u||new e.experimental.fbs.EdgeEnd).__init(this.bb.__vector(this.bb_pos+l)+a*12,this.bb):null}outputEdgesLength(){let a=this.bb.__offset(this.bb_pos,8);return a?this.bb.__vector_len(this.bb_pos+a):0}static startNodeEdge(a){a.startObject(3)}static addNodeIndex(a,u){a.addFieldInt32(0,u,0)}static addInputEdges(a,u){a.addFieldOffset(1,u,0)}static startInputEdgesVector(a,u){a.startVector(12,u,4)}static addOutputEdges(a,u){a.addFieldOffset(2,u,0)}static startOutputEdgesVector(a,u){a.startVector(12,u,4)}static endNodeEdge(a){return a.endObject()}static createNodeEdge(a,u,l,f){return o.startNodeEdge(a),o.addNodeIndex(a,u),o.addInputEdges(a,l),o.addOutputEdges(a,f),o.endNodeEdge(a)}}i.NodeEdge=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsNode(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsNode(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}name(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.__string(this.bb_pos+u,a):null}docString(a){let u=this.bb.__offset(this.bb_pos,6);return u?this.bb.__string(this.bb_pos+u,a):null}domain(a){let u=this.bb.__offset(this.bb_pos,8);return u?this.bb.__string(this.bb_pos+u,a):null}sinceVersion(){let a=this.bb.__offset(this.bb_pos,10);return a?this.bb.readInt32(this.bb_pos+a):0}index(){let a=this.bb.__offset(this.bb_pos,12);return a?this.bb.readUint32(this.bb_pos+a):0}opType(a){let u=this.bb.__offset(this.bb_pos,14);return u?this.bb.__string(this.bb_pos+u,a):null}type(){let a=this.bb.__offset(this.bb_pos,16);return a?this.bb.readInt32(this.bb_pos+a):0}executionProviderType(a){let u=this.bb.__offset(this.bb_pos,18);return u?this.bb.__string(this.bb_pos+u,a):null}inputs(a,u){let l=this.bb.__offset(this.bb_pos,20);return l?this.bb.__string(this.bb.__vector(this.bb_pos+l)+a*4,u):null}inputsLength(){let a=this.bb.__offset(this.bb_pos,20);return a?this.bb.__vector_len(this.bb_pos+a):0}outputs(a,u){let l=this.bb.__offset(this.bb_pos,22);return l?this.bb.__string(this.bb.__vector(this.bb_pos+l)+a*4,u):null}outputsLength(){let a=this.bb.__offset(this.bb_pos,22);return a?this.bb.__vector_len(this.bb_pos+a):0}attributes(a,u){let l=this.bb.__offset(this.bb_pos,24);return l?(u||new e.experimental.fbs.Attribute).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}attributesLength(){let a=this.bb.__offset(this.bb_pos,24);return a?this.bb.__vector_len(this.bb_pos+a):0}inputArgCounts(a){let u=this.bb.__offset(this.bb_pos,26);return u?this.bb.readInt32(this.bb.__vector(this.bb_pos+u)+a*4):0}inputArgCountsLength(){let a=this.bb.__offset(this.bb_pos,26);return a?this.bb.__vector_len(this.bb_pos+a):0}inputArgCountsArray(){let a=this.bb.__offset(this.bb_pos,26);return a?new Int32Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+a),this.bb.__vector_len(this.bb_pos+a)):null}implicitInputs(a,u){let l=this.bb.__offset(this.bb_pos,28);return l?this.bb.__string(this.bb.__vector(this.bb_pos+l)+a*4,u):null}implicitInputsLength(){let a=this.bb.__offset(this.bb_pos,28);return a?this.bb.__vector_len(this.bb_pos+a):0}static startNode(a){a.startObject(13)}static addName(a,u){a.addFieldOffset(0,u,0)}static addDocString(a,u){a.addFieldOffset(1,u,0)}static addDomain(a,u){a.addFieldOffset(2,u,0)}static addSinceVersion(a,u){a.addFieldInt32(3,u,0)}static addIndex(a,u){a.addFieldInt32(4,u,0)}static addOpType(a,u){a.addFieldOffset(5,u,0)}static addType(a,u){a.addFieldInt32(6,u,0)}static addExecutionProviderType(a,u){a.addFieldOffset(7,u,0)}static addInputs(a,u){a.addFieldOffset(8,u,0)}static createInputsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startInputsVector(a,u){a.startVector(4,u,4)}static addOutputs(a,u){a.addFieldOffset(9,u,0)}static createOutputsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startOutputsVector(a,u){a.startVector(4,u,4)}static addAttributes(a,u){a.addFieldOffset(10,u,0)}static createAttributesVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startAttributesVector(a,u){a.startVector(4,u,4)}static addInputArgCounts(a,u){a.addFieldOffset(11,u,0)}static createInputArgCountsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addInt32(u[l]);return a.endVector()}static startInputArgCountsVector(a,u){a.startVector(4,u,4)}static addImplicitInputs(a,u){a.addFieldOffset(12,u,0)}static createImplicitInputsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startImplicitInputsVector(a,u){a.startVector(4,u,4)}static endNode(a){return a.endObject()}static createNode(a,u,l,f,c,p,b,h,g,T,w,v,S,$){return o.startNode(a),o.addName(a,u),o.addDocString(a,l),o.addDomain(a,f),o.addSinceVersion(a,c),o.addIndex(a,p),o.addOpType(a,b),o.addType(a,h),o.addExecutionProviderType(a,g),o.addInputs(a,T),o.addOutputs(a,w),o.addAttributes(a,v),o.addInputArgCounts(a,S),o.addImplicitInputs(a,$),o.endNode(a)}}i.Node=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsValueInfo(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsValueInfo(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}name(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.__string(this.bb_pos+u,a):null}docString(a){let u=this.bb.__offset(this.bb_pos,6);return u?this.bb.__string(this.bb_pos+u,a):null}type(a){let u=this.bb.__offset(this.bb_pos,8);return u?(a||new e.experimental.fbs.TypeInfo).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}static startValueInfo(a){a.startObject(3)}static addName(a,u){a.addFieldOffset(0,u,0)}static addDocString(a,u){a.addFieldOffset(1,u,0)}static addType(a,u){a.addFieldOffset(2,u,0)}static endValueInfo(a){return a.endObject()}static createValueInfo(a,u,l,f){return o.startValueInfo(a),o.addName(a,u),o.addDocString(a,l),o.addType(a,f),o.endValueInfo(a)}}i.ValueInfo=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsTypeInfo(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsTypeInfo(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}denotation(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.__string(this.bb_pos+u,a):null}valueType(){let a=this.bb.__offset(this.bb_pos,6);return a?this.bb.readUint8(this.bb_pos+a):0}value(a){let u=this.bb.__offset(this.bb_pos,8);return u?this.bb.__union(a,this.bb_pos+u):null}static startTypeInfo(a){a.startObject(3)}static addDenotation(a,u){a.addFieldOffset(0,u,0)}static addValueType(a,u){a.addFieldInt8(1,u,0)}static addValue(a,u){a.addFieldOffset(2,u,0)}static endTypeInfo(a){return a.endObject()}static createTypeInfo(a,u,l,f){return o.startTypeInfo(a),o.addDenotation(a,u),o.addValueType(a,l),o.addValue(a,f),o.endTypeInfo(a)}}i.TypeInfo=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsOperatorSetId(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsOperatorSetId(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}domain(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.__string(this.bb_pos+u,a):null}version(){let a=this.bb.__offset(this.bb_pos,6);return a?this.bb.readInt64(this.bb_pos+a):this.bb.createLong(0,0)}static startOperatorSetId(a){a.startObject(2)}static addDomain(a,u){a.addFieldOffset(0,u,0)}static addVersion(a,u){a.addFieldInt64(1,u,a.createLong(0,0))}static endOperatorSetId(a){return a.endObject()}static createOperatorSetId(a,u,l){return o.startOperatorSetId(a),o.addDomain(a,u),o.addVersion(a,l),o.endOperatorSetId(a)}}i.OperatorSetId=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsTensor(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsTensor(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}name(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.__string(this.bb_pos+u,a):null}docString(a){let u=this.bb.__offset(this.bb_pos,6);return u?this.bb.__string(this.bb_pos+u,a):null}dims(a){let u=this.bb.__offset(this.bb_pos,8);return u?this.bb.readInt64(this.bb.__vector(this.bb_pos+u)+a*8):this.bb.createLong(0,0)}dimsLength(){let a=this.bb.__offset(this.bb_pos,8);return a?this.bb.__vector_len(this.bb_pos+a):0}dataType(){let a=this.bb.__offset(this.bb_pos,10);return a?this.bb.readInt32(this.bb_pos+a):0}rawData(a){let u=this.bb.__offset(this.bb_pos,12);return u?this.bb.readUint8(this.bb.__vector(this.bb_pos+u)+a):0}rawDataLength(){let a=this.bb.__offset(this.bb_pos,12);return a?this.bb.__vector_len(this.bb_pos+a):0}rawDataArray(){let a=this.bb.__offset(this.bb_pos,12);return a?new Uint8Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+a),this.bb.__vector_len(this.bb_pos+a)):null}stringData(a,u){let l=this.bb.__offset(this.bb_pos,14);return l?this.bb.__string(this.bb.__vector(this.bb_pos+l)+a*4,u):null}stringDataLength(){let a=this.bb.__offset(this.bb_pos,14);return a?this.bb.__vector_len(this.bb_pos+a):0}static startTensor(a){a.startObject(6)}static addName(a,u){a.addFieldOffset(0,u,0)}static addDocString(a,u){a.addFieldOffset(1,u,0)}static addDims(a,u){a.addFieldOffset(2,u,0)}static createDimsVector(a,u){a.startVector(8,u.length,8);for(let l=u.length-1;l>=0;l--)a.addInt64(u[l]);return a.endVector()}static startDimsVector(a,u){a.startVector(8,u,8)}static addDataType(a,u){a.addFieldInt32(3,u,0)}static addRawData(a,u){a.addFieldOffset(4,u,0)}static createRawDataVector(a,u){a.startVector(1,u.length,1);for(let l=u.length-1;l>=0;l--)a.addInt8(u[l]);return a.endVector()}static startRawDataVector(a,u){a.startVector(1,u,1)}static addStringData(a,u){a.addFieldOffset(5,u,0)}static createStringDataVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startStringDataVector(a,u){a.startVector(4,u,4)}static endTensor(a){return a.endObject()}static createTensor(a,u,l,f,c,p,b){return o.startTensor(a),o.addName(a,u),o.addDocString(a,l),o.addDims(a,f),o.addDataType(a,c),o.addRawData(a,p),o.addStringData(a,b),o.endTensor(a)}}i.Tensor=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsSparseTensor(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsSparseTensor(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}values(a){let u=this.bb.__offset(this.bb_pos,4);return u?(a||new e.experimental.fbs.Tensor).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}indices(a){let u=this.bb.__offset(this.bb_pos,6);return u?(a||new e.experimental.fbs.Tensor).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}dims(a){let u=this.bb.__offset(this.bb_pos,8);return u?this.bb.readInt64(this.bb.__vector(this.bb_pos+u)+a*8):this.bb.createLong(0,0)}dimsLength(){let a=this.bb.__offset(this.bb_pos,8);return a?this.bb.__vector_len(this.bb_pos+a):0}static startSparseTensor(a){a.startObject(3)}static addValues(a,u){a.addFieldOffset(0,u,0)}static addIndices(a,u){a.addFieldOffset(1,u,0)}static addDims(a,u){a.addFieldOffset(2,u,0)}static createDimsVector(a,u){a.startVector(8,u.length,8);for(let l=u.length-1;l>=0;l--)a.addInt64(u[l]);return a.endVector()}static startDimsVector(a,u){a.startVector(8,u,8)}static endSparseTensor(a){return a.endObject()}static createSparseTensor(a,u,l,f){return o.startSparseTensor(a),o.addValues(a,u),o.addIndices(a,l),o.addDims(a,f),o.endSparseTensor(a)}}i.SparseTensor=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsAttribute(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsAttribute(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}name(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.__string(this.bb_pos+u,a):null}docString(a){let u=this.bb.__offset(this.bb_pos,6);return u?this.bb.__string(this.bb_pos+u,a):null}type(){let a=this.bb.__offset(this.bb_pos,8);return a?this.bb.readInt32(this.bb_pos+a):0}f(){let a=this.bb.__offset(this.bb_pos,10);return a?this.bb.readFloat32(this.bb_pos+a):0}i(){let a=this.bb.__offset(this.bb_pos,12);return a?this.bb.readInt64(this.bb_pos+a):this.bb.createLong(0,0)}s(a){let u=this.bb.__offset(this.bb_pos,14);return u?this.bb.__string(this.bb_pos+u,a):null}t(a){let u=this.bb.__offset(this.bb_pos,16);return u?(a||new e.experimental.fbs.Tensor).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}g(a){let u=this.bb.__offset(this.bb_pos,18);return u?(a||new e.experimental.fbs.Graph).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}floats(a){let u=this.bb.__offset(this.bb_pos,20);return u?this.bb.readFloat32(this.bb.__vector(this.bb_pos+u)+a*4):0}floatsLength(){let a=this.bb.__offset(this.bb_pos,20);return a?this.bb.__vector_len(this.bb_pos+a):0}floatsArray(){let a=this.bb.__offset(this.bb_pos,20);return a?new Float32Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+a),this.bb.__vector_len(this.bb_pos+a)):null}ints(a){let u=this.bb.__offset(this.bb_pos,22);return u?this.bb.readInt64(this.bb.__vector(this.bb_pos+u)+a*8):this.bb.createLong(0,0)}intsLength(){let a=this.bb.__offset(this.bb_pos,22);return a?this.bb.__vector_len(this.bb_pos+a):0}strings(a,u){let l=this.bb.__offset(this.bb_pos,24);return l?this.bb.__string(this.bb.__vector(this.bb_pos+l)+a*4,u):null}stringsLength(){let a=this.bb.__offset(this.bb_pos,24);return a?this.bb.__vector_len(this.bb_pos+a):0}tensors(a,u){let l=this.bb.__offset(this.bb_pos,26);return l?(u||new e.experimental.fbs.Tensor).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}tensorsLength(){let a=this.bb.__offset(this.bb_pos,26);return a?this.bb.__vector_len(this.bb_pos+a):0}graphs(a,u){let l=this.bb.__offset(this.bb_pos,28);return l?(u||new e.experimental.fbs.Graph).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}graphsLength(){let a=this.bb.__offset(this.bb_pos,28);return a?this.bb.__vector_len(this.bb_pos+a):0}static startAttribute(a){a.startObject(13)}static addName(a,u){a.addFieldOffset(0,u,0)}static addDocString(a,u){a.addFieldOffset(1,u,0)}static addType(a,u){a.addFieldInt32(2,u,0)}static addF(a,u){a.addFieldFloat32(3,u,0)}static addI(a,u){a.addFieldInt64(4,u,a.createLong(0,0))}static addS(a,u){a.addFieldOffset(5,u,0)}static addT(a,u){a.addFieldOffset(6,u,0)}static addG(a,u){a.addFieldOffset(7,u,0)}static addFloats(a,u){a.addFieldOffset(8,u,0)}static createFloatsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addFloat32(u[l]);return a.endVector()}static startFloatsVector(a,u){a.startVector(4,u,4)}static addInts(a,u){a.addFieldOffset(9,u,0)}static createIntsVector(a,u){a.startVector(8,u.length,8);for(let l=u.length-1;l>=0;l--)a.addInt64(u[l]);return a.endVector()}static startIntsVector(a,u){a.startVector(8,u,8)}static addStrings(a,u){a.addFieldOffset(10,u,0)}static createStringsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startStringsVector(a,u){a.startVector(4,u,4)}static addTensors(a,u){a.addFieldOffset(11,u,0)}static createTensorsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startTensorsVector(a,u){a.startVector(4,u,4)}static addGraphs(a,u){a.addFieldOffset(12,u,0)}static createGraphsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startGraphsVector(a,u){a.startVector(4,u,4)}static endAttribute(a){return a.endObject()}static createAttribute(a,u,l,f,c,p,b,h,g,T,w,v,S,$){return o.startAttribute(a),o.addName(a,u),o.addDocString(a,l),o.addType(a,f),o.addF(a,c),o.addI(a,p),o.addS(a,b),o.addT(a,h),o.addG(a,g),o.addFloats(a,T),o.addInts(a,w),o.addStrings(a,v),o.addTensors(a,S),o.addGraphs(a,$),o.endAttribute(a)}}i.Attribute=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsGraph(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsGraph(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}initializers(a,u){let l=this.bb.__offset(this.bb_pos,4);return l?(u||new e.experimental.fbs.Tensor).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}initializersLength(){let a=this.bb.__offset(this.bb_pos,4);return a?this.bb.__vector_len(this.bb_pos+a):0}nodeArgs(a,u){let l=this.bb.__offset(this.bb_pos,6);return l?(u||new e.experimental.fbs.ValueInfo).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}nodeArgsLength(){let a=this.bb.__offset(this.bb_pos,6);return a?this.bb.__vector_len(this.bb_pos+a):0}nodes(a,u){let l=this.bb.__offset(this.bb_pos,8);return l?(u||new e.experimental.fbs.Node).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}nodesLength(){let a=this.bb.__offset(this.bb_pos,8);return a?this.bb.__vector_len(this.bb_pos+a):0}maxNodeIndex(){let a=this.bb.__offset(this.bb_pos,10);return a?this.bb.readUint32(this.bb_pos+a):0}nodeEdges(a,u){let l=this.bb.__offset(this.bb_pos,12);return l?(u||new e.experimental.fbs.NodeEdge).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}nodeEdgesLength(){let a=this.bb.__offset(this.bb_pos,12);return a?this.bb.__vector_len(this.bb_pos+a):0}inputs(a,u){let l=this.bb.__offset(this.bb_pos,14);return l?this.bb.__string(this.bb.__vector(this.bb_pos+l)+a*4,u):null}inputsLength(){let a=this.bb.__offset(this.bb_pos,14);return a?this.bb.__vector_len(this.bb_pos+a):0}outputs(a,u){let l=this.bb.__offset(this.bb_pos,16);return l?this.bb.__string(this.bb.__vector(this.bb_pos+l)+a*4,u):null}outputsLength(){let a=this.bb.__offset(this.bb_pos,16);return a?this.bb.__vector_len(this.bb_pos+a):0}sparseInitializers(a,u){let l=this.bb.__offset(this.bb_pos,18);return l?(u||new e.experimental.fbs.SparseTensor).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}sparseInitializersLength(){let a=this.bb.__offset(this.bb_pos,18);return a?this.bb.__vector_len(this.bb_pos+a):0}static startGraph(a){a.startObject(8)}static addInitializers(a,u){a.addFieldOffset(0,u,0)}static createInitializersVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startInitializersVector(a,u){a.startVector(4,u,4)}static addNodeArgs(a,u){a.addFieldOffset(1,u,0)}static createNodeArgsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startNodeArgsVector(a,u){a.startVector(4,u,4)}static addNodes(a,u){a.addFieldOffset(2,u,0)}static createNodesVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startNodesVector(a,u){a.startVector(4,u,4)}static addMaxNodeIndex(a,u){a.addFieldInt32(3,u,0)}static addNodeEdges(a,u){a.addFieldOffset(4,u,0)}static createNodeEdgesVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startNodeEdgesVector(a,u){a.startVector(4,u,4)}static addInputs(a,u){a.addFieldOffset(5,u,0)}static createInputsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startInputsVector(a,u){a.startVector(4,u,4)}static addOutputs(a,u){a.addFieldOffset(6,u,0)}static createOutputsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startOutputsVector(a,u){a.startVector(4,u,4)}static addSparseInitializers(a,u){a.addFieldOffset(7,u,0)}static createSparseInitializersVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startSparseInitializersVector(a,u){a.startVector(4,u,4)}static endGraph(a){return a.endObject()}static createGraph(a,u,l,f,c,p,b,h,g){return o.startGraph(a),o.addInitializers(a,u),o.addNodeArgs(a,l),o.addNodes(a,f),o.addMaxNodeIndex(a,c),o.addNodeEdges(a,p),o.addInputs(a,b),o.addOutputs(a,h),o.addSparseInitializers(a,g),o.endGraph(a)}}i.Graph=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsModel(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsModel(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}irVersion(){let a=this.bb.__offset(this.bb_pos,4);return a?this.bb.readInt64(this.bb_pos+a):this.bb.createLong(0,0)}opsetImport(a,u){let l=this.bb.__offset(this.bb_pos,6);return l?(u||new e.experimental.fbs.OperatorSetId).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}opsetImportLength(){let a=this.bb.__offset(this.bb_pos,6);return a?this.bb.__vector_len(this.bb_pos+a):0}producerName(a){let u=this.bb.__offset(this.bb_pos,8);return u?this.bb.__string(this.bb_pos+u,a):null}producerVersion(a){let u=this.bb.__offset(this.bb_pos,10);return u?this.bb.__string(this.bb_pos+u,a):null}domain(a){let u=this.bb.__offset(this.bb_pos,12);return u?this.bb.__string(this.bb_pos+u,a):null}modelVersion(){let a=this.bb.__offset(this.bb_pos,14);return a?this.bb.readInt64(this.bb_pos+a):this.bb.createLong(0,0)}docString(a){let u=this.bb.__offset(this.bb_pos,16);return u?this.bb.__string(this.bb_pos+u,a):null}graph(a){let u=this.bb.__offset(this.bb_pos,18);return u?(a||new e.experimental.fbs.Graph).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}graphDocString(a){let u=this.bb.__offset(this.bb_pos,20);return u?this.bb.__string(this.bb_pos+u,a):null}static startModel(a){a.startObject(9)}static addIrVersion(a,u){a.addFieldInt64(0,u,a.createLong(0,0))}static addOpsetImport(a,u){a.addFieldOffset(1,u,0)}static createOpsetImportVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startOpsetImportVector(a,u){a.startVector(4,u,4)}static addProducerName(a,u){a.addFieldOffset(2,u,0)}static addProducerVersion(a,u){a.addFieldOffset(3,u,0)}static addDomain(a,u){a.addFieldOffset(4,u,0)}static addModelVersion(a,u){a.addFieldInt64(5,u,a.createLong(0,0))}static addDocString(a,u){a.addFieldOffset(6,u,0)}static addGraph(a,u){a.addFieldOffset(7,u,0)}static addGraphDocString(a,u){a.addFieldOffset(8,u,0)}static endModel(a){return a.endObject()}static createModel(a,u,l,f,c,p,b,h,g,T){return o.startModel(a),o.addIrVersion(a,u),o.addOpsetImport(a,l),o.addProducerName(a,f),o.addProducerVersion(a,c),o.addDomain(a,p),o.addModelVersion(a,b),o.addDocString(a,h),o.addGraph(a,g),o.addGraphDocString(a,T),o.endModel(a)}}i.Model=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsKernelCreateInfos(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsKernelCreateInfos(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}nodeIndices(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.readUint32(this.bb.__vector(this.bb_pos+u)+a*4):0}nodeIndicesLength(){let a=this.bb.__offset(this.bb_pos,4);return a?this.bb.__vector_len(this.bb_pos+a):0}nodeIndicesArray(){let a=this.bb.__offset(this.bb_pos,4);return a?new Uint32Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+a),this.bb.__vector_len(this.bb_pos+a)):null}kernelDefHashes(a){let u=this.bb.__offset(this.bb_pos,6);return u?this.bb.readUint64(this.bb.__vector(this.bb_pos+u)+a*8):this.bb.createLong(0,0)}kernelDefHashesLength(){let a=this.bb.__offset(this.bb_pos,6);return a?this.bb.__vector_len(this.bb_pos+a):0}static startKernelCreateInfos(a){a.startObject(2)}static addNodeIndices(a,u){a.addFieldOffset(0,u,0)}static createNodeIndicesVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addInt32(u[l]);return a.endVector()}static startNodeIndicesVector(a,u){a.startVector(4,u,4)}static addKernelDefHashes(a,u){a.addFieldOffset(1,u,0)}static createKernelDefHashesVector(a,u){a.startVector(8,u.length,8);for(let l=u.length-1;l>=0;l--)a.addInt64(u[l]);return a.endVector()}static startKernelDefHashesVector(a,u){a.startVector(8,u,8)}static endKernelCreateInfos(a){return a.endObject()}static createKernelCreateInfos(a,u,l){return o.startKernelCreateInfos(a),o.addNodeIndices(a,u),o.addKernelDefHashes(a,l),o.endKernelCreateInfos(a)}}i.KernelCreateInfos=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsSubGraphSessionState(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsSubGraphSessionState(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}graphId(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.__string(this.bb_pos+u,a):null}sessionState(a){let u=this.bb.__offset(this.bb_pos,6);return u?(a||new e.experimental.fbs.SessionState).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}static startSubGraphSessionState(a){a.startObject(2)}static addGraphId(a,u){a.addFieldOffset(0,u,0)}static addSessionState(a,u){a.addFieldOffset(1,u,0)}static endSubGraphSessionState(a){let u=a.endObject();return a.requiredField(u,4),u}static createSubGraphSessionState(a,u,l){return o.startSubGraphSessionState(a),o.addGraphId(a,u),o.addSessionState(a,l),o.endSubGraphSessionState(a)}}i.SubGraphSessionState=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsSessionState(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsSessionState(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}kernels(a){let u=this.bb.__offset(this.bb_pos,4);return u?(a||new e.experimental.fbs.KernelCreateInfos).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}subGraphSessionStates(a,u){let l=this.bb.__offset(this.bb_pos,6);return l?(u||new e.experimental.fbs.SubGraphSessionState).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}subGraphSessionStatesLength(){let a=this.bb.__offset(this.bb_pos,6);return a?this.bb.__vector_len(this.bb_pos+a):0}static startSessionState(a){a.startObject(2)}static addKernels(a,u){a.addFieldOffset(0,u,0)}static addSubGraphSessionStates(a,u){a.addFieldOffset(1,u,0)}static createSubGraphSessionStatesVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startSubGraphSessionStatesVector(a,u){a.startVector(4,u,4)}static endSessionState(a){return a.endObject()}static createSessionState(a,u,l){return o.startSessionState(a),o.addKernels(a,u),o.addSubGraphSessionStates(a,l),o.endSessionState(a)}}i.SessionState=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsInferenceSession(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsInferenceSession(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static bufferHasIdentifier(a){return a.__has_identifier("ORTM")}ortVersion(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.__string(this.bb_pos+u,a):null}model(a){let u=this.bb.__offset(this.bb_pos,6);return u?(a||new e.experimental.fbs.Model).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}sessionState(a){let u=this.bb.__offset(this.bb_pos,8);return u?(a||new e.experimental.fbs.SessionState).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}static startInferenceSession(a){a.startObject(3)}static addOrtVersion(a,u){a.addFieldOffset(0,u,0)}static addModel(a,u){a.addFieldOffset(1,u,0)}static addSessionState(a,u){a.addFieldOffset(2,u,0)}static endInferenceSession(a){return a.endObject()}static finishInferenceSessionBuffer(a,u){a.finish(u,"ORTM")}static finishSizePrefixedInferenceSessionBuffer(a,u){a.finish(u,"ORTM",!0)}static createInferenceSession(a,u,l,f){return o.startInferenceSession(a),o.addOrtVersion(a,u),o.addModel(a,l),o.addSessionState(a,f),o.endInferenceSession(a)}}i.InferenceSession=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={})});var Cc=Je((US,Ec)=>{"use strict";Ec.exports=dv;function dv(r,e){for(var n=new Array(arguments.length-1),t=0,o=2,i=!0;o{"use strict";var Do=Bc;Do.length=function(e){var n=e.length;if(!n)return 0;for(var t=0;--n%4>1&&e.charAt(n)==="=";)++t;return Math.ceil(e.length*3)/4-t};var fn=new Array(64),Dc=new Array(123);for(Ft=0;Ft<64;)Dc[fn[Ft]=Ft<26?Ft+65:Ft<52?Ft+71:Ft<62?Ft-4:Ft-59|43]=Ft++;var Ft;Do.encode=function(e,n,t){for(var o=null,i=[],s=0,a=0,u;n>2],u=(l&3)<<4,a=1;break;case 1:i[s++]=fn[u|l>>4],u=(l&15)<<2,a=2;break;case 2:i[s++]=fn[u|l>>6],i[s++]=fn[l&63],a=0;break}s>8191&&((o||(o=[])).push(String.fromCharCode.apply(String,i)),s=0)}return a&&(i[s++]=fn[u],i[s++]=61,a===1&&(i[s++]=61)),o?(s&&o.push(String.fromCharCode.apply(String,i.slice(0,s))),o.join("")):String.fromCharCode.apply(String,i.slice(0,s))};var kc="invalid encoding";Do.decode=function(e,n,t){for(var o=t,i=0,s,a=0;a1)break;if((u=Dc[u])===void 0)throw Error(kc);switch(i){case 0:s=u,i=1;break;case 1:n[t++]=s<<2|(u&48)>>4,s=u,i=2;break;case 2:n[t++]=(s&15)<<4|(u&60)>>2,s=u,i=3;break;case 3:n[t++]=(s&3)<<6|u,i=0;break}}if(i===1)throw Error(kc);return t-o};Do.test=function(e){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(e)}});var Nc=Je((HS,Rc)=>{"use strict";Rc.exports=Bo;function Bo(){this._listeners={}}Bo.prototype.on=function(e,n,t){return(this._listeners[e]||(this._listeners[e]=[])).push({fn:n,ctx:t||this}),this};Bo.prototype.off=function(e,n){if(e===void 0)this._listeners={};else if(n===void 0)this._listeners[e]=[];else for(var t=this._listeners[e],o=0;o{"use strict";Uc.exports=zc(zc);function zc(r){return typeof Float32Array<"u"?function(){var e=new Float32Array([-0]),n=new Uint8Array(e.buffer),t=n[3]===128;function o(u,l,f){e[0]=u,l[f]=n[0],l[f+1]=n[1],l[f+2]=n[2],l[f+3]=n[3]}function i(u,l,f){e[0]=u,l[f]=n[3],l[f+1]=n[2],l[f+2]=n[1],l[f+3]=n[0]}r.writeFloatLE=t?o:i,r.writeFloatBE=t?i:o;function s(u,l){return n[0]=u[l],n[1]=u[l+1],n[2]=u[l+2],n[3]=u[l+3],e[0]}function a(u,l){return n[3]=u[l],n[2]=u[l+1],n[1]=u[l+2],n[0]=u[l+3],e[0]}r.readFloatLE=t?s:a,r.readFloatBE=t?a:s}():function(){function e(t,o,i,s){var a=o<0?1:0;if(a&&(o=-o),o===0)t(1/o>0?0:2147483648,i,s);else if(isNaN(o))t(2143289344,i,s);else if(o>34028234663852886e22)t((a<<31|2139095040)>>>0,i,s);else if(o<11754943508222875e-54)t((a<<31|Math.round(o/1401298464324817e-60))>>>0,i,s);else{var u=Math.floor(Math.log(o)/Math.LN2),l=Math.round(o*Math.pow(2,-u)*8388608)&8388607;t((a<<31|u+127<<23|l)>>>0,i,s)}}r.writeFloatLE=e.bind(null,Fc),r.writeFloatBE=e.bind(null,Mc);function n(t,o,i){var s=t(o,i),a=(s>>31)*2+1,u=s>>>23&255,l=s&8388607;return u===255?l?NaN:a*(1/0):u===0?a*1401298464324817e-60*l:a*Math.pow(2,u-150)*(l+8388608)}r.readFloatLE=n.bind(null,Vc),r.readFloatBE=n.bind(null,Gc)}(),typeof Float64Array<"u"?function(){var e=new Float64Array([-0]),n=new Uint8Array(e.buffer),t=n[7]===128;function o(u,l,f){e[0]=u,l[f]=n[0],l[f+1]=n[1],l[f+2]=n[2],l[f+3]=n[3],l[f+4]=n[4],l[f+5]=n[5],l[f+6]=n[6],l[f+7]=n[7]}function i(u,l,f){e[0]=u,l[f]=n[7],l[f+1]=n[6],l[f+2]=n[5],l[f+3]=n[4],l[f+4]=n[3],l[f+5]=n[2],l[f+6]=n[1],l[f+7]=n[0]}r.writeDoubleLE=t?o:i,r.writeDoubleBE=t?i:o;function s(u,l){return n[0]=u[l],n[1]=u[l+1],n[2]=u[l+2],n[3]=u[l+3],n[4]=u[l+4],n[5]=u[l+5],n[6]=u[l+6],n[7]=u[l+7],e[0]}function a(u,l){return n[7]=u[l],n[6]=u[l+1],n[5]=u[l+2],n[4]=u[l+3],n[3]=u[l+4],n[2]=u[l+5],n[1]=u[l+6],n[0]=u[l+7],e[0]}r.readDoubleLE=t?s:a,r.readDoubleBE=t?a:s}():function(){function e(t,o,i,s,a,u){var l=s<0?1:0;if(l&&(s=-s),s===0)t(0,a,u+o),t(1/s>0?0:2147483648,a,u+i);else if(isNaN(s))t(0,a,u+o),t(2146959360,a,u+i);else if(s>17976931348623157e292)t(0,a,u+o),t((l<<31|2146435072)>>>0,a,u+i);else{var f;if(s<22250738585072014e-324)f=s/5e-324,t(f>>>0,a,u+o),t((l<<31|f/4294967296)>>>0,a,u+i);else{var c=Math.floor(Math.log(s)/Math.LN2);c===1024&&(c=1023),f=s*Math.pow(2,-c),t(f*4503599627370496>>>0,a,u+o),t((l<<31|c+1023<<20|f*1048576&1048575)>>>0,a,u+i)}}}r.writeDoubleLE=e.bind(null,Fc,0,4),r.writeDoubleBE=e.bind(null,Mc,4,0);function n(t,o,i,s,a){var u=t(s,a+o),l=t(s,a+i),f=(l>>31)*2+1,c=l>>>20&2047,p=4294967296*(l&1048575)+u;return c===2047?p?NaN:f*(1/0):c===0?f*5e-324*p:f*Math.pow(2,c-1075)*(p+4503599627370496)}r.readDoubleLE=n.bind(null,Vc,0,4),r.readDoubleBE=n.bind(null,Gc,4,0)}(),r}function Fc(r,e,n){e[n]=r&255,e[n+1]=r>>>8&255,e[n+2]=r>>>16&255,e[n+3]=r>>>24}function Mc(r,e,n){e[n]=r>>>24,e[n+1]=r>>>16&255,e[n+2]=r>>>8&255,e[n+3]=r&255}function Vc(r,e){return(r[e]|r[e+1]<<8|r[e+2]<<16|r[e+3]<<24)>>>0}function Gc(r,e){return(r[e]<<24|r[e+1]<<16|r[e+2]<<8|r[e+3])>>>0}});var Hc=Je((exports,module)=>{"use strict";module.exports=inquire;function inquire(moduleName){try{var mod=eval("quire".replace(/^/,"re"))(moduleName);if(mod&&(mod.length||Object.keys(mod).length))return mod}catch(r){}return null}});var Kc=Je(qc=>{"use strict";var Da=qc;Da.length=function(e){for(var n=0,t=0,o=0;o191&&u<224?s[a++]=(u&31)<<6|e[n++]&63:u>239&&u<365?(u=((u&7)<<18|(e[n++]&63)<<12|(e[n++]&63)<<6|e[n++]&63)-65536,s[a++]=55296+(u>>10),s[a++]=56320+(u&1023)):s[a++]=(u&15)<<12|(e[n++]&63)<<6|e[n++]&63,a>8191&&((i||(i=[])).push(String.fromCharCode.apply(String,s)),a=0);return i?(a&&i.push(String.fromCharCode.apply(String,s.slice(0,a))),i.join("")):String.fromCharCode.apply(String,s.slice(0,a))};Da.write=function(e,n,t){for(var o=t,i,s,a=0;a>6|192,n[t++]=i&63|128):(i&64512)===55296&&((s=e.charCodeAt(a+1))&64512)===56320?(i=65536+((i&1023)<<10)+(s&1023),++a,n[t++]=i>>18|240,n[t++]=i>>12&63|128,n[t++]=i>>6&63|128,n[t++]=i&63|128):(n[t++]=i>>12|224,n[t++]=i>>6&63|128,n[t++]=i&63|128);return t-o}});var Xc=Je((jS,jc)=>{"use strict";jc.exports=pv;function pv(r,e,n){var t=n||8192,o=t>>>1,i=null,s=t;return function(u){if(u<1||u>o)return r(u);s+u>t&&(i=r(t),s=0);var l=e.call(i,s,s+=u);return s&7&&(s=(s|7)+1),l}}});var Yc=Je((XS,Zc)=>{"use strict";Zc.exports=at;var kn=_r();function at(r,e){this.lo=r>>>0,this.hi=e>>>0}var Rr=at.zero=new at(0,0);Rr.toNumber=function(){return 0};Rr.zzEncode=Rr.zzDecode=function(){return this};Rr.length=function(){return 1};var mv=at.zeroHash="\0\0\0\0\0\0\0\0";at.fromNumber=function(e){if(e===0)return Rr;var n=e<0;n&&(e=-e);var t=e>>>0,o=(e-t)/4294967296>>>0;return n&&(o=~o>>>0,t=~t>>>0,++t>4294967295&&(t=0,++o>4294967295&&(o=0))),new at(t,o)};at.from=function(e){if(typeof e=="number")return at.fromNumber(e);if(kn.isString(e))if(kn.Long)e=kn.Long.fromString(e);else return at.fromNumber(parseInt(e,10));return e.low||e.high?new at(e.low>>>0,e.high>>>0):Rr};at.prototype.toNumber=function(e){if(!e&&this.hi>>>31){var n=~this.lo+1>>>0,t=~this.hi>>>0;return n||(t=t+1>>>0),-(n+t*4294967296)}return this.lo+this.hi*4294967296};at.prototype.toLong=function(e){return kn.Long?new kn.Long(this.lo|0,this.hi|0,!!e):{low:this.lo|0,high:this.hi|0,unsigned:!!e}};var Tr=String.prototype.charCodeAt;at.fromHash=function(e){return e===mv?Rr:new at((Tr.call(e,0)|Tr.call(e,1)<<8|Tr.call(e,2)<<16|Tr.call(e,3)<<24)>>>0,(Tr.call(e,4)|Tr.call(e,5)<<8|Tr.call(e,6)<<16|Tr.call(e,7)<<24)>>>0)};at.prototype.toHash=function(){return String.fromCharCode(this.lo&255,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,this.hi&255,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)};at.prototype.zzEncode=function(){var e=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^e)>>>0,this.lo=(this.lo<<1^e)>>>0,this};at.prototype.zzDecode=function(){var e=-(this.lo&1);return this.lo=((this.lo>>>1|this.hi<<31)^e)>>>0,this.hi=(this.hi>>>1^e)>>>0,this};at.prototype.length=function(){var e=this.lo,n=(this.lo>>>28|this.hi<<4)>>>0,t=this.hi>>>24;return t===0?n===0?e<16384?e<128?1:2:e<2097152?3:4:n<16384?n<128?5:6:n<2097152?7:8:t<128?9:10}});var _r=Je(Ba=>{"use strict";var re=Ba;re.asPromise=Cc();re.base64=Lc();re.EventEmitter=Nc();re.float=Wc();re.inquire=Hc();re.utf8=Kc();re.pool=Xc();re.LongBits=Yc();re.isNode=!!(typeof global<"u"&&global&&global.process&&global.process.versions&&global.process.versions.node);re.global=re.isNode&&global||typeof window<"u"&&window||typeof self<"u"&&self||Ba;re.emptyArray=Object.freeze?Object.freeze([]):[];re.emptyObject=Object.freeze?Object.freeze({}):{};re.isInteger=Number.isInteger||function(e){return typeof e=="number"&&isFinite(e)&&Math.floor(e)===e};re.isString=function(e){return typeof e=="string"||e instanceof String};re.isObject=function(e){return e&&typeof e=="object"};re.isset=re.isSet=function(e,n){var t=e[n];return t!=null&&e.hasOwnProperty(n)?typeof t!="object"||(Array.isArray(t)?t.length:Object.keys(t).length)>0:!1};re.Buffer=function(){try{var r=re.inquire("buffer").Buffer;return r.prototype.utf8Write?r:null}catch{return null}}();re._Buffer_from=null;re._Buffer_allocUnsafe=null;re.newBuffer=function(e){return typeof e=="number"?re.Buffer?re._Buffer_allocUnsafe(e):new re.Array(e):re.Buffer?re._Buffer_from(e):typeof Uint8Array>"u"?e:new Uint8Array(e)};re.Array=typeof Uint8Array<"u"?Uint8Array:Array;re.Long=re.global.dcodeIO&&re.global.dcodeIO.Long||re.global.Long||re.inquire("long");re.key2Re=/^true|false|0|1$/;re.key32Re=/^-?(?:0|[1-9][0-9]*)$/;re.key64Re=/^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;re.longToHash=function(e){return e?re.LongBits.from(e).toHash():re.LongBits.zeroHash};re.longFromHash=function(e,n){var t=re.LongBits.fromHash(e);return re.Long?re.Long.fromBits(t.lo,t.hi,n):t.toNumber(!!n)};function Jc(r,e,n){for(var t=Object.keys(e),o=0;o-1;--i)if(n[o[i]]===1&&this[o[i]]!==void 0&&this[o[i]]!==null)return o[i]}};re.oneOfSetter=function(e){return function(n){for(var t=0;t{"use strict";nf.exports=Pe;var Ct=_r(),La,Lo=Ct.LongBits,ef=Ct.base64,tf=Ct.utf8;function Dn(r,e,n){this.fn=r,this.len=e,this.next=void 0,this.val=n}function Na(){}function hv(r){this.head=r.head,this.tail=r.tail,this.len=r.len,this.next=r.states}function Pe(){this.len=0,this.head=new Dn(Na,0,0),this.tail=this.head,this.states=null}var rf=function(){return Ct.Buffer?function(){return(Pe.create=function(){return new La})()}:function(){return new Pe}};Pe.create=rf();Pe.alloc=function(e){return new Ct.Array(e)};Ct.Array!==Array&&(Pe.alloc=Ct.pool(Pe.alloc,Ct.Array.prototype.subarray));Pe.prototype._push=function(e,n,t){return this.tail=this.tail.next=new Dn(e,n,t),this.len+=n,this};function za(r,e,n){e[n]=r&255}function gv(r,e,n){for(;r>127;)e[n++]=r&127|128,r>>>=7;e[n]=r}function Fa(r,e){this.len=r,this.next=void 0,this.val=e}Fa.prototype=Object.create(Dn.prototype);Fa.prototype.fn=gv;Pe.prototype.uint32=function(e){return this.len+=(this.tail=this.tail.next=new Fa((e=e>>>0)<128?1:e<16384?2:e<2097152?3:e<268435456?4:5,e)).len,this};Pe.prototype.int32=function(e){return e<0?this._push(Ma,10,Lo.fromNumber(e)):this.uint32(e)};Pe.prototype.sint32=function(e){return this.uint32((e<<1^e>>31)>>>0)};function Ma(r,e,n){for(;r.hi;)e[n++]=r.lo&127|128,r.lo=(r.lo>>>7|r.hi<<25)>>>0,r.hi>>>=7;for(;r.lo>127;)e[n++]=r.lo&127|128,r.lo=r.lo>>>7;e[n++]=r.lo}Pe.prototype.uint64=function(e){var n=Lo.from(e);return this._push(Ma,n.length(),n)};Pe.prototype.int64=Pe.prototype.uint64;Pe.prototype.sint64=function(e){var n=Lo.from(e).zzEncode();return this._push(Ma,n.length(),n)};Pe.prototype.bool=function(e){return this._push(za,1,e?1:0)};function Ra(r,e,n){e[n]=r&255,e[n+1]=r>>>8&255,e[n+2]=r>>>16&255,e[n+3]=r>>>24}Pe.prototype.fixed32=function(e){return this._push(Ra,4,e>>>0)};Pe.prototype.sfixed32=Pe.prototype.fixed32;Pe.prototype.fixed64=function(e){var n=Lo.from(e);return this._push(Ra,4,n.lo)._push(Ra,4,n.hi)};Pe.prototype.sfixed64=Pe.prototype.fixed64;Pe.prototype.float=function(e){return this._push(Ct.float.writeFloatLE,4,e)};Pe.prototype.double=function(e){return this._push(Ct.float.writeDoubleLE,8,e)};var bv=Ct.Array.prototype.set?function(e,n,t){n.set(e,t)}:function(e,n,t){for(var o=0;o>>0;if(!n)return this._push(za,1,0);if(Ct.isString(e)){var t=Pe.alloc(n=ef.length(e));ef.decode(e,t,0),e=t}return this.uint32(n)._push(bv,n,e)};Pe.prototype.string=function(e){var n=tf.length(e);return n?this.uint32(n)._push(tf.write,n,e):this._push(za,1,0)};Pe.prototype.fork=function(){return this.states=new hv(this),this.head=this.tail=new Dn(Na,0,0),this.len=0,this};Pe.prototype.reset=function(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new Dn(Na,0,0),this.len=0),this};Pe.prototype.ldelim=function(){var e=this.head,n=this.tail,t=this.len;return this.reset().uint32(t),t&&(this.tail.next=e.next,this.tail=n,this.len+=t),this};Pe.prototype.finish=function(){for(var e=this.head.next,n=this.constructor.alloc(this.len),t=0;e;)e.fn(e.val,n,t),t+=e.len,e=e.next;return n};Pe._configure=function(r){La=r,Pe.create=rf(),La._configure()}});var sf=Je((JS,af)=>{"use strict";af.exports=Jt;var of=Va();(Jt.prototype=Object.create(of.prototype)).constructor=Jt;var Ir=_r();function Jt(){of.call(this)}Jt._configure=function(){Jt.alloc=Ir._Buffer_allocUnsafe,Jt.writeBytesBuffer=Ir.Buffer&&Ir.Buffer.prototype instanceof Uint8Array&&Ir.Buffer.prototype.set.name==="set"?function(e,n,t){n.set(e,t)}:function(e,n,t){if(e.copy)e.copy(n,t,0,e.length);else for(var o=0;o>>0;return this.uint32(n),n&&this._push(Jt.writeBytesBuffer,n,e),this};function yv(r,e,n){r.length<40?Ir.utf8.write(r,e,n):e.utf8Write?e.utf8Write(r,n):e.write(r,n)}Jt.prototype.string=function(e){var n=Ir.Buffer.byteLength(e);return this.uint32(n),n&&this._push(yv,n,e),this};Jt._configure()});var Wa=Je((QS,df)=>{"use strict";df.exports=je;var Mt=_r(),Ua,cf=Mt.LongBits,xv=Mt.utf8;function Vt(r,e){return RangeError("index out of range: "+r.pos+" + "+(e||1)+" > "+r.len)}function je(r){this.buf=r,this.pos=0,this.len=r.length}var uf=typeof Uint8Array<"u"?function(e){if(e instanceof Uint8Array||Array.isArray(e))return new je(e);throw Error("illegal buffer")}:function(e){if(Array.isArray(e))return new je(e);throw Error("illegal buffer")},ff=function(){return Mt.Buffer?function(n){return(je.create=function(o){return Mt.Buffer.isBuffer(o)?new Ua(o):uf(o)})(n)}:uf};je.create=ff();je.prototype._slice=Mt.Array.prototype.subarray||Mt.Array.prototype.slice;je.prototype.uint32=function(){var e=4294967295;return function(){if(e=(this.buf[this.pos]&127)>>>0,this.buf[this.pos++]<128||(e=(e|(this.buf[this.pos]&127)<<7)>>>0,this.buf[this.pos++]<128)||(e=(e|(this.buf[this.pos]&127)<<14)>>>0,this.buf[this.pos++]<128)||(e=(e|(this.buf[this.pos]&127)<<21)>>>0,this.buf[this.pos++]<128)||(e=(e|(this.buf[this.pos]&15)<<28)>>>0,this.buf[this.pos++]<128))return e;if((this.pos+=5)>this.len)throw this.pos=this.len,Vt(this,10);return e}}();je.prototype.int32=function(){return this.uint32()|0};je.prototype.sint32=function(){var e=this.uint32();return e>>>1^-(e&1)|0};function Ga(){var r=new cf(0,0),e=0;if(this.len-this.pos>4){for(;e<4;++e)if(r.lo=(r.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return r;if(r.lo=(r.lo|(this.buf[this.pos]&127)<<28)>>>0,r.hi=(r.hi|(this.buf[this.pos]&127)>>4)>>>0,this.buf[this.pos++]<128)return r;e=0}else{for(;e<3;++e){if(this.pos>=this.len)throw Vt(this);if(r.lo=(r.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return r}return r.lo=(r.lo|(this.buf[this.pos++]&127)<>>0,r}if(this.len-this.pos>4){for(;e<5;++e)if(r.hi=(r.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return r}else for(;e<5;++e){if(this.pos>=this.len)throw Vt(this);if(r.hi=(r.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return r}throw Error("invalid varint encoding")}je.prototype.bool=function(){return this.uint32()!==0};function Ro(r,e){return(r[e-4]|r[e-3]<<8|r[e-2]<<16|r[e-1]<<24)>>>0}je.prototype.fixed32=function(){if(this.pos+4>this.len)throw Vt(this,4);return Ro(this.buf,this.pos+=4)};je.prototype.sfixed32=function(){if(this.pos+4>this.len)throw Vt(this,4);return Ro(this.buf,this.pos+=4)|0};function lf(){if(this.pos+8>this.len)throw Vt(this,8);return new cf(Ro(this.buf,this.pos+=4),Ro(this.buf,this.pos+=4))}je.prototype.float=function(){if(this.pos+4>this.len)throw Vt(this,4);var e=Mt.float.readFloatLE(this.buf,this.pos);return this.pos+=4,e};je.prototype.double=function(){if(this.pos+8>this.len)throw Vt(this,4);var e=Mt.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,e};je.prototype.bytes=function(){var e=this.uint32(),n=this.pos,t=this.pos+e;if(t>this.len)throw Vt(this,e);if(this.pos+=e,Array.isArray(this.buf))return this.buf.slice(n,t);if(n===t){var o=Mt.Buffer;return o?o.alloc(0):new this.buf.constructor(0)}return this._slice.call(this.buf,n,t)};je.prototype.string=function(){var e=this.bytes();return xv.read(e,0,e.length)};je.prototype.skip=function(e){if(typeof e=="number"){if(this.pos+e>this.len)throw Vt(this,e);this.pos+=e}else do if(this.pos>=this.len)throw Vt(this);while(this.buf[this.pos++]&128);return this};je.prototype.skipType=function(r){switch(r){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;(r=this.uint32()&7)!==4;)this.skipType(r);break;case 5:this.skip(4);break;default:throw Error("invalid wire type "+r+" at offset "+this.pos)}return this};je._configure=function(r){Ua=r,je.create=ff(),Ua._configure();var e=Mt.Long?"toLong":"toNumber";Mt.merge(je.prototype,{int64:function(){return Ga.call(this)[e](!1)},uint64:function(){return Ga.call(this)[e](!0)},sint64:function(){return Ga.call(this).zzDecode()[e](!1)},fixed64:function(){return lf.call(this)[e](!0)},sfixed64:function(){return lf.call(this)[e](!1)}})}});var gf=Je((e$,hf)=>{"use strict";hf.exports=Nr;var mf=Wa();(Nr.prototype=Object.create(mf.prototype)).constructor=Nr;var pf=_r();function Nr(r){mf.call(this,r)}Nr._configure=function(){pf.Buffer&&(Nr.prototype._slice=pf.Buffer.prototype.slice)};Nr.prototype.string=function(){var e=this.uint32();return this.buf.utf8Slice?this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+e,this.len)):this.buf.toString("utf-8",this.pos,this.pos=Math.min(this.pos+e,this.len))};Nr._configure()});var yf=Je((t$,bf)=>{"use strict";bf.exports=Bn;var Ha=_r();(Bn.prototype=Object.create(Ha.EventEmitter.prototype)).constructor=Bn;function Bn(r,e,n){if(typeof r!="function")throw TypeError("rpcImpl must be a function");Ha.EventEmitter.call(this),this.rpcImpl=r,this.requestDelimited=!!e,this.responseDelimited=!!n}Bn.prototype.rpcCall=function r(e,n,t,o,i){if(!o)throw TypeError("request must be specified");var s=this;if(!i)return Ha.asPromise(r,s,e,n,t,o);if(!s.rpcImpl){setTimeout(function(){i(Error("already ended"))},0);return}try{return s.rpcImpl(e,n[s.requestDelimited?"encodeDelimited":"encode"](o).finish(),function(u,l){if(u)return s.emit("error",u,e),i(u);if(l===null){s.end(!0);return}if(!(l instanceof t))try{l=t[s.responseDelimited?"decodeDelimited":"decode"](l)}catch(f){return s.emit("error",f,e),i(f)}return s.emit("data",l,e),i(null,l)})}catch(a){s.emit("error",a,e),setTimeout(function(){i(a)},0);return}};Bn.prototype.end=function(e){return this.rpcImpl&&(e||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit("end").off()),this}});var vf=Je(xf=>{"use strict";var vv=xf;vv.Service=yf()});var Tf=Je((n$,wf)=>{"use strict";wf.exports={}});var Sf=Je(If=>{"use strict";var vt=If;vt.build="minimal";vt.Writer=Va();vt.BufferWriter=sf();vt.Reader=Wa();vt.BufferReader=gf();vt.util=_r();vt.rpc=vf();vt.roots=Tf();vt.configure=_f;function _f(){vt.util._configure(),vt.Writer._configure(vt.BufferWriter),vt.Reader._configure(vt.BufferReader)}_f()});var Af=Je((i$,$f)=>{"use strict";$f.exports=Sf()});var dn=Je((a$,Pf)=>{"use strict";var Ve=Af(),H=Ve.Reader,Xe=Ve.Writer,A=Ve.util,I=Ve.roots.default||(Ve.roots.default={});I.onnx=function(){var r={};return r.Version=function(){var e={},n=Object.create(e);return n[e[0]="_START_VERSION"]=0,n[e[1]="IR_VERSION_2017_10_10"]=1,n[e[2]="IR_VERSION_2017_10_30"]=2,n[e[3]="IR_VERSION_2017_11_3"]=3,n[e[4]="IR_VERSION_2019_1_22"]=4,n[e[5]="IR_VERSION_2019_3_18"]=5,n[e[6]="IR_VERSION_2019_9_19"]=6,n[e[7]="IR_VERSION_2020_5_8"]=7,n[e[8]="IR_VERSION_2021_7_30"]=8,n[e[9]="IR_VERSION"]=9,n}(),r.AttributeProto=function(){function e(n){if(this.floats=[],this.ints=[],this.strings=[],this.tensors=[],this.graphs=[],this.sparseTensors=[],this.typeProtos=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{s.name=t.string();break}case 21:{s.refAttrName=t.string();break}case 13:{s.docString=t.string();break}case 20:{s.type=t.int32();break}case 2:{s.f=t.float();break}case 3:{s.i=t.int64();break}case 4:{s.s=t.bytes();break}case 5:{s.t=I.onnx.TensorProto.decode(t,t.uint32());break}case 6:{s.g=I.onnx.GraphProto.decode(t,t.uint32());break}case 22:{s.sparseTensor=I.onnx.SparseTensorProto.decode(t,t.uint32());break}case 14:{s.tp=I.onnx.TypeProto.decode(t,t.uint32());break}case 7:{if(s.floats&&s.floats.length||(s.floats=[]),(a&7)===2)for(var u=t.uint32()+t.pos;t.pos>>0,t.i.high>>>0).toNumber())),t.s!=null&&(typeof t.s=="string"?A.base64.decode(t.s,o.s=A.newBuffer(A.base64.length(t.s)),0):t.s.length>=0&&(o.s=t.s)),t.t!=null){if(typeof t.t!="object")throw TypeError(".onnx.AttributeProto.t: object expected");o.t=I.onnx.TensorProto.fromObject(t.t)}if(t.g!=null){if(typeof t.g!="object")throw TypeError(".onnx.AttributeProto.g: object expected");o.g=I.onnx.GraphProto.fromObject(t.g)}if(t.sparseTensor!=null){if(typeof t.sparseTensor!="object")throw TypeError(".onnx.AttributeProto.sparseTensor: object expected");o.sparseTensor=I.onnx.SparseTensorProto.fromObject(t.sparseTensor)}if(t.tp!=null){if(typeof t.tp!="object")throw TypeError(".onnx.AttributeProto.tp: object expected");o.tp=I.onnx.TypeProto.fromObject(t.tp)}if(t.floats){if(!Array.isArray(t.floats))throw TypeError(".onnx.AttributeProto.floats: array expected");o.floats=[];for(var i=0;i>>0,t.ints[i].high>>>0).toNumber())}if(t.strings){if(!Array.isArray(t.strings))throw TypeError(".onnx.AttributeProto.strings: array expected");o.strings=[];for(var i=0;i=0&&(o.strings[i]=t.strings[i])}if(t.tensors){if(!Array.isArray(t.tensors))throw TypeError(".onnx.AttributeProto.tensors: array expected");o.tensors=[];for(var i=0;i>>0,t.i.high>>>0).toNumber():t.i),t.s!=null&&t.hasOwnProperty("s")&&(i.s=o.bytes===String?A.base64.encode(t.s,0,t.s.length):o.bytes===Array?Array.prototype.slice.call(t.s):t.s),t.t!=null&&t.hasOwnProperty("t")&&(i.t=I.onnx.TensorProto.toObject(t.t,o)),t.g!=null&&t.hasOwnProperty("g")&&(i.g=I.onnx.GraphProto.toObject(t.g,o)),t.floats&&t.floats.length){i.floats=[];for(var a=0;a>>0,t.ints[a].high>>>0).toNumber():t.ints[a]}if(t.strings&&t.strings.length){i.strings=[];for(var a=0;a>>3){case 1:{s.name=t.string();break}case 2:{s.type=I.onnx.TypeProto.decode(t,t.uint32());break}case 3:{s.docString=t.string();break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.name!=null&&t.hasOwnProperty("name")&&!A.isString(t.name))return"name: string expected";if(t.type!=null&&t.hasOwnProperty("type")){var o=I.onnx.TypeProto.verify(t.type);if(o)return"type."+o}return t.docString!=null&&t.hasOwnProperty("docString")&&!A.isString(t.docString)?"docString: string expected":null},e.fromObject=function(t){if(t instanceof I.onnx.ValueInfoProto)return t;var o=new I.onnx.ValueInfoProto;if(t.name!=null&&(o.name=String(t.name)),t.type!=null){if(typeof t.type!="object")throw TypeError(".onnx.ValueInfoProto.type: object expected");o.type=I.onnx.TypeProto.fromObject(t.type)}return t.docString!=null&&(o.docString=String(t.docString)),o},e.toObject=function(t,o){o||(o={});var i={};return o.defaults&&(i.name="",i.type=null,i.docString=""),t.name!=null&&t.hasOwnProperty("name")&&(i.name=t.name),t.type!=null&&t.hasOwnProperty("type")&&(i.type=I.onnx.TypeProto.toObject(t.type,o)),t.docString!=null&&t.hasOwnProperty("docString")&&(i.docString=t.docString),i},e.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},e.getTypeUrl=function(t){return t===void 0&&(t="type.googleapis.com"),t+"/onnx.ValueInfoProto"},e}(),r.NodeProto=function(){function e(n){if(this.input=[],this.output=[],this.attribute=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{s.input&&s.input.length||(s.input=[]),s.input.push(t.string());break}case 2:{s.output&&s.output.length||(s.output=[]),s.output.push(t.string());break}case 3:{s.name=t.string();break}case 4:{s.opType=t.string();break}case 7:{s.domain=t.string();break}case 5:{s.attribute&&s.attribute.length||(s.attribute=[]),s.attribute.push(I.onnx.AttributeProto.decode(t,t.uint32()));break}case 6:{s.docString=t.string();break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.input!=null&&t.hasOwnProperty("input")){if(!Array.isArray(t.input))return"input: array expected";for(var o=0;o>>3){case 1:{s.initialization=I.onnx.GraphProto.decode(t,t.uint32());break}case 2:{s.algorithm=I.onnx.GraphProto.decode(t,t.uint32());break}case 3:{s.initializationBinding&&s.initializationBinding.length||(s.initializationBinding=[]),s.initializationBinding.push(I.onnx.StringStringEntryProto.decode(t,t.uint32()));break}case 4:{s.updateBinding&&s.updateBinding.length||(s.updateBinding=[]),s.updateBinding.push(I.onnx.StringStringEntryProto.decode(t,t.uint32()));break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.initialization!=null&&t.hasOwnProperty("initialization")){var o=I.onnx.GraphProto.verify(t.initialization);if(o)return"initialization."+o}if(t.algorithm!=null&&t.hasOwnProperty("algorithm")){var o=I.onnx.GraphProto.verify(t.algorithm);if(o)return"algorithm."+o}if(t.initializationBinding!=null&&t.hasOwnProperty("initializationBinding")){if(!Array.isArray(t.initializationBinding))return"initializationBinding: array expected";for(var i=0;i>>3){case 1:{s.irVersion=t.int64();break}case 8:{s.opsetImport&&s.opsetImport.length||(s.opsetImport=[]),s.opsetImport.push(I.onnx.OperatorSetIdProto.decode(t,t.uint32()));break}case 2:{s.producerName=t.string();break}case 3:{s.producerVersion=t.string();break}case 4:{s.domain=t.string();break}case 5:{s.modelVersion=t.int64();break}case 6:{s.docString=t.string();break}case 7:{s.graph=I.onnx.GraphProto.decode(t,t.uint32());break}case 14:{s.metadataProps&&s.metadataProps.length||(s.metadataProps=[]),s.metadataProps.push(I.onnx.StringStringEntryProto.decode(t,t.uint32()));break}case 20:{s.trainingInfo&&s.trainingInfo.length||(s.trainingInfo=[]),s.trainingInfo.push(I.onnx.TrainingInfoProto.decode(t,t.uint32()));break}case 25:{s.functions&&s.functions.length||(s.functions=[]),s.functions.push(I.onnx.FunctionProto.decode(t,t.uint32()));break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.irVersion!=null&&t.hasOwnProperty("irVersion")&&!A.isInteger(t.irVersion)&&!(t.irVersion&&A.isInteger(t.irVersion.low)&&A.isInteger(t.irVersion.high)))return"irVersion: integer|Long expected";if(t.opsetImport!=null&&t.hasOwnProperty("opsetImport")){if(!Array.isArray(t.opsetImport))return"opsetImport: array expected";for(var o=0;o>>0,t.irVersion.high>>>0).toNumber())),t.opsetImport){if(!Array.isArray(t.opsetImport))throw TypeError(".onnx.ModelProto.opsetImport: array expected");o.opsetImport=[];for(var i=0;i>>0,t.modelVersion.high>>>0).toNumber())),t.docString!=null&&(o.docString=String(t.docString)),t.graph!=null){if(typeof t.graph!="object")throw TypeError(".onnx.ModelProto.graph: object expected");o.graph=I.onnx.GraphProto.fromObject(t.graph)}if(t.metadataProps){if(!Array.isArray(t.metadataProps))throw TypeError(".onnx.ModelProto.metadataProps: array expected");o.metadataProps=[];for(var i=0;i>>0,t.irVersion.high>>>0).toNumber():t.irVersion),t.producerName!=null&&t.hasOwnProperty("producerName")&&(i.producerName=t.producerName),t.producerVersion!=null&&t.hasOwnProperty("producerVersion")&&(i.producerVersion=t.producerVersion),t.domain!=null&&t.hasOwnProperty("domain")&&(i.domain=t.domain),t.modelVersion!=null&&t.hasOwnProperty("modelVersion")&&(typeof t.modelVersion=="number"?i.modelVersion=o.longs===String?String(t.modelVersion):t.modelVersion:i.modelVersion=o.longs===String?A.Long.prototype.toString.call(t.modelVersion):o.longs===Number?new A.LongBits(t.modelVersion.low>>>0,t.modelVersion.high>>>0).toNumber():t.modelVersion),t.docString!=null&&t.hasOwnProperty("docString")&&(i.docString=t.docString),t.graph!=null&&t.hasOwnProperty("graph")&&(i.graph=I.onnx.GraphProto.toObject(t.graph,o)),t.opsetImport&&t.opsetImport.length){i.opsetImport=[];for(var a=0;a>>3){case 1:{s.key=t.string();break}case 2:{s.value=t.string();break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){return typeof t!="object"||t===null?"object expected":t.key!=null&&t.hasOwnProperty("key")&&!A.isString(t.key)?"key: string expected":t.value!=null&&t.hasOwnProperty("value")&&!A.isString(t.value)?"value: string expected":null},e.fromObject=function(t){if(t instanceof I.onnx.StringStringEntryProto)return t;var o=new I.onnx.StringStringEntryProto;return t.key!=null&&(o.key=String(t.key)),t.value!=null&&(o.value=String(t.value)),o},e.toObject=function(t,o){o||(o={});var i={};return o.defaults&&(i.key="",i.value=""),t.key!=null&&t.hasOwnProperty("key")&&(i.key=t.key),t.value!=null&&t.hasOwnProperty("value")&&(i.value=t.value),i},e.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},e.getTypeUrl=function(t){return t===void 0&&(t="type.googleapis.com"),t+"/onnx.StringStringEntryProto"},e}(),r.TensorAnnotation=function(){function e(n){if(this.quantParameterTensorNames=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{s.tensorName=t.string();break}case 2:{s.quantParameterTensorNames&&s.quantParameterTensorNames.length||(s.quantParameterTensorNames=[]),s.quantParameterTensorNames.push(I.onnx.StringStringEntryProto.decode(t,t.uint32()));break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.tensorName!=null&&t.hasOwnProperty("tensorName")&&!A.isString(t.tensorName))return"tensorName: string expected";if(t.quantParameterTensorNames!=null&&t.hasOwnProperty("quantParameterTensorNames")){if(!Array.isArray(t.quantParameterTensorNames))return"quantParameterTensorNames: array expected";for(var o=0;o>>3){case 1:{s.node&&s.node.length||(s.node=[]),s.node.push(I.onnx.NodeProto.decode(t,t.uint32()));break}case 2:{s.name=t.string();break}case 5:{s.initializer&&s.initializer.length||(s.initializer=[]),s.initializer.push(I.onnx.TensorProto.decode(t,t.uint32()));break}case 15:{s.sparseInitializer&&s.sparseInitializer.length||(s.sparseInitializer=[]),s.sparseInitializer.push(I.onnx.SparseTensorProto.decode(t,t.uint32()));break}case 10:{s.docString=t.string();break}case 11:{s.input&&s.input.length||(s.input=[]),s.input.push(I.onnx.ValueInfoProto.decode(t,t.uint32()));break}case 12:{s.output&&s.output.length||(s.output=[]),s.output.push(I.onnx.ValueInfoProto.decode(t,t.uint32()));break}case 13:{s.valueInfo&&s.valueInfo.length||(s.valueInfo=[]),s.valueInfo.push(I.onnx.ValueInfoProto.decode(t,t.uint32()));break}case 14:{s.quantizationAnnotation&&s.quantizationAnnotation.length||(s.quantizationAnnotation=[]),s.quantizationAnnotation.push(I.onnx.TensorAnnotation.decode(t,t.uint32()));break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.node!=null&&t.hasOwnProperty("node")){if(!Array.isArray(t.node))return"node: array expected";for(var o=0;o>>3){case 1:{if(s.dims&&s.dims.length||(s.dims=[]),(a&7)===2)for(var u=t.uint32()+t.pos;t.pos>>0,t.dims[i].high>>>0).toNumber())}if(t.dataType!=null&&(o.dataType=t.dataType|0),t.segment!=null){if(typeof t.segment!="object")throw TypeError(".onnx.TensorProto.segment: object expected");o.segment=I.onnx.TensorProto.Segment.fromObject(t.segment)}if(t.floatData){if(!Array.isArray(t.floatData))throw TypeError(".onnx.TensorProto.floatData: array expected");o.floatData=[];for(var i=0;i=0&&(o.stringData[i]=t.stringData[i])}if(t.int64Data){if(!Array.isArray(t.int64Data))throw TypeError(".onnx.TensorProto.int64Data: array expected");o.int64Data=[];for(var i=0;i>>0,t.int64Data[i].high>>>0).toNumber())}if(t.name!=null&&(o.name=String(t.name)),t.docString!=null&&(o.docString=String(t.docString)),t.rawData!=null&&(typeof t.rawData=="string"?A.base64.decode(t.rawData,o.rawData=A.newBuffer(A.base64.length(t.rawData)),0):t.rawData.length>=0&&(o.rawData=t.rawData)),t.externalData){if(!Array.isArray(t.externalData))throw TypeError(".onnx.TensorProto.externalData: array expected");o.externalData=[];for(var i=0;i>>0,t.uint64Data[i].high>>>0).toNumber(!0))}return o},e.toObject=function(t,o){o||(o={});var i={};if((o.arrays||o.defaults)&&(i.dims=[],i.floatData=[],i.int32Data=[],i.stringData=[],i.int64Data=[],i.doubleData=[],i.uint64Data=[],i.externalData=[]),o.defaults&&(i.dataType=0,i.segment=null,i.name="",o.bytes===String?i.rawData="":(i.rawData=[],o.bytes!==Array&&(i.rawData=A.newBuffer(i.rawData))),i.docString="",i.dataLocation=o.enums===String?"DEFAULT":0),t.dims&&t.dims.length){i.dims=[];for(var s=0;s>>0,t.dims[s].high>>>0).toNumber():t.dims[s]}if(t.dataType!=null&&t.hasOwnProperty("dataType")&&(i.dataType=t.dataType),t.segment!=null&&t.hasOwnProperty("segment")&&(i.segment=I.onnx.TensorProto.Segment.toObject(t.segment,o)),t.floatData&&t.floatData.length){i.floatData=[];for(var s=0;s>>0,t.int64Data[s].high>>>0).toNumber():t.int64Data[s]}if(t.name!=null&&t.hasOwnProperty("name")&&(i.name=t.name),t.rawData!=null&&t.hasOwnProperty("rawData")&&(i.rawData=o.bytes===String?A.base64.encode(t.rawData,0,t.rawData.length):o.bytes===Array?Array.prototype.slice.call(t.rawData):t.rawData),t.doubleData&&t.doubleData.length){i.doubleData=[];for(var s=0;s>>0,t.uint64Data[s].high>>>0).toNumber(!0):t.uint64Data[s]}if(t.docString!=null&&t.hasOwnProperty("docString")&&(i.docString=t.docString),t.externalData&&t.externalData.length){i.externalData=[];for(var s=0;s>>3){case 1:{a.begin=o.int64();break}case 2:{a.end=o.int64();break}default:o.skipType(u&7);break}}return a},n.decodeDelimited=function(o){return o instanceof H||(o=new H(o)),this.decode(o,o.uint32())},n.verify=function(o){return typeof o!="object"||o===null?"object expected":o.begin!=null&&o.hasOwnProperty("begin")&&!A.isInteger(o.begin)&&!(o.begin&&A.isInteger(o.begin.low)&&A.isInteger(o.begin.high))?"begin: integer|Long expected":o.end!=null&&o.hasOwnProperty("end")&&!A.isInteger(o.end)&&!(o.end&&A.isInteger(o.end.low)&&A.isInteger(o.end.high))?"end: integer|Long expected":null},n.fromObject=function(o){if(o instanceof I.onnx.TensorProto.Segment)return o;var i=new I.onnx.TensorProto.Segment;return o.begin!=null&&(A.Long?(i.begin=A.Long.fromValue(o.begin)).unsigned=!1:typeof o.begin=="string"?i.begin=parseInt(o.begin,10):typeof o.begin=="number"?i.begin=o.begin:typeof o.begin=="object"&&(i.begin=new A.LongBits(o.begin.low>>>0,o.begin.high>>>0).toNumber())),o.end!=null&&(A.Long?(i.end=A.Long.fromValue(o.end)).unsigned=!1:typeof o.end=="string"?i.end=parseInt(o.end,10):typeof o.end=="number"?i.end=o.end:typeof o.end=="object"&&(i.end=new A.LongBits(o.end.low>>>0,o.end.high>>>0).toNumber())),i},n.toObject=function(o,i){i||(i={});var s={};if(i.defaults){if(A.Long){var a=new A.Long(0,0,!1);s.begin=i.longs===String?a.toString():i.longs===Number?a.toNumber():a}else s.begin=i.longs===String?"0":0;if(A.Long){var a=new A.Long(0,0,!1);s.end=i.longs===String?a.toString():i.longs===Number?a.toNumber():a}else s.end=i.longs===String?"0":0}return o.begin!=null&&o.hasOwnProperty("begin")&&(typeof o.begin=="number"?s.begin=i.longs===String?String(o.begin):o.begin:s.begin=i.longs===String?A.Long.prototype.toString.call(o.begin):i.longs===Number?new A.LongBits(o.begin.low>>>0,o.begin.high>>>0).toNumber():o.begin),o.end!=null&&o.hasOwnProperty("end")&&(typeof o.end=="number"?s.end=i.longs===String?String(o.end):o.end:s.end=i.longs===String?A.Long.prototype.toString.call(o.end):i.longs===Number?new A.LongBits(o.end.low>>>0,o.end.high>>>0).toNumber():o.end),s},n.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},n.getTypeUrl=function(o){return o===void 0&&(o="type.googleapis.com"),o+"/onnx.TensorProto.Segment"},n}(),e.DataLocation=function(){var n={},t=Object.create(n);return t[n[0]="DEFAULT"]=0,t[n[1]="EXTERNAL"]=1,t}(),e}(),r.SparseTensorProto=function(){function e(n){if(this.dims=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{s.values=I.onnx.TensorProto.decode(t,t.uint32());break}case 2:{s.indices=I.onnx.TensorProto.decode(t,t.uint32());break}case 3:{if(s.dims&&s.dims.length||(s.dims=[]),(a&7)===2)for(var u=t.uint32()+t.pos;t.pos>>0,t.dims[i].high>>>0).toNumber())}return o},e.toObject=function(t,o){o||(o={});var i={};if((o.arrays||o.defaults)&&(i.dims=[]),o.defaults&&(i.values=null,i.indices=null),t.values!=null&&t.hasOwnProperty("values")&&(i.values=I.onnx.TensorProto.toObject(t.values,o)),t.indices!=null&&t.hasOwnProperty("indices")&&(i.indices=I.onnx.TensorProto.toObject(t.indices,o)),t.dims&&t.dims.length){i.dims=[];for(var s=0;s>>0,t.dims[s].high>>>0).toNumber():t.dims[s]}return i},e.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},e.getTypeUrl=function(t){return t===void 0&&(t="type.googleapis.com"),t+"/onnx.SparseTensorProto"},e}(),r.TensorShapeProto=function(){function e(n){if(this.dim=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{s.dim&&s.dim.length||(s.dim=[]),s.dim.push(I.onnx.TensorShapeProto.Dimension.decode(t,t.uint32()));break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.dim!=null&&t.hasOwnProperty("dim")){if(!Array.isArray(t.dim))return"dim: array expected";for(var o=0;o>>3){case 1:{u.dimValue=i.int64();break}case 2:{u.dimParam=i.string();break}case 3:{u.denotation=i.string();break}default:i.skipType(l&7);break}}return u},n.decodeDelimited=function(i){return i instanceof H||(i=new H(i)),this.decode(i,i.uint32())},n.verify=function(i){if(typeof i!="object"||i===null)return"object expected";var s={};if(i.dimValue!=null&&i.hasOwnProperty("dimValue")&&(s.value=1,!A.isInteger(i.dimValue)&&!(i.dimValue&&A.isInteger(i.dimValue.low)&&A.isInteger(i.dimValue.high))))return"dimValue: integer|Long expected";if(i.dimParam!=null&&i.hasOwnProperty("dimParam")){if(s.value===1)return"value: multiple values";if(s.value=1,!A.isString(i.dimParam))return"dimParam: string expected"}return i.denotation!=null&&i.hasOwnProperty("denotation")&&!A.isString(i.denotation)?"denotation: string expected":null},n.fromObject=function(i){if(i instanceof I.onnx.TensorShapeProto.Dimension)return i;var s=new I.onnx.TensorShapeProto.Dimension;return i.dimValue!=null&&(A.Long?(s.dimValue=A.Long.fromValue(i.dimValue)).unsigned=!1:typeof i.dimValue=="string"?s.dimValue=parseInt(i.dimValue,10):typeof i.dimValue=="number"?s.dimValue=i.dimValue:typeof i.dimValue=="object"&&(s.dimValue=new A.LongBits(i.dimValue.low>>>0,i.dimValue.high>>>0).toNumber())),i.dimParam!=null&&(s.dimParam=String(i.dimParam)),i.denotation!=null&&(s.denotation=String(i.denotation)),s},n.toObject=function(i,s){s||(s={});var a={};return s.defaults&&(a.denotation=""),i.dimValue!=null&&i.hasOwnProperty("dimValue")&&(typeof i.dimValue=="number"?a.dimValue=s.longs===String?String(i.dimValue):i.dimValue:a.dimValue=s.longs===String?A.Long.prototype.toString.call(i.dimValue):s.longs===Number?new A.LongBits(i.dimValue.low>>>0,i.dimValue.high>>>0).toNumber():i.dimValue,s.oneofs&&(a.value="dimValue")),i.dimParam!=null&&i.hasOwnProperty("dimParam")&&(a.dimParam=i.dimParam,s.oneofs&&(a.value="dimParam")),i.denotation!=null&&i.hasOwnProperty("denotation")&&(a.denotation=i.denotation),a},n.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},n.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TensorShapeProto.Dimension"},n}(),e}(),r.TypeProto=function(){function e(t){if(t)for(var o=Object.keys(t),i=0;i>>3){case 1:{a.tensorType=I.onnx.TypeProto.Tensor.decode(o,o.uint32());break}case 4:{a.sequenceType=I.onnx.TypeProto.Sequence.decode(o,o.uint32());break}case 5:{a.mapType=I.onnx.TypeProto.Map.decode(o,o.uint32());break}case 9:{a.optionalType=I.onnx.TypeProto.Optional.decode(o,o.uint32());break}case 8:{a.sparseTensorType=I.onnx.TypeProto.SparseTensor.decode(o,o.uint32());break}case 6:{a.denotation=o.string();break}default:o.skipType(u&7);break}}return a},e.decodeDelimited=function(o){return o instanceof H||(o=new H(o)),this.decode(o,o.uint32())},e.verify=function(o){if(typeof o!="object"||o===null)return"object expected";var i={};if(o.tensorType!=null&&o.hasOwnProperty("tensorType")){i.value=1;{var s=I.onnx.TypeProto.Tensor.verify(o.tensorType);if(s)return"tensorType."+s}}if(o.sequenceType!=null&&o.hasOwnProperty("sequenceType")){if(i.value===1)return"value: multiple values";i.value=1;{var s=I.onnx.TypeProto.Sequence.verify(o.sequenceType);if(s)return"sequenceType."+s}}if(o.mapType!=null&&o.hasOwnProperty("mapType")){if(i.value===1)return"value: multiple values";i.value=1;{var s=I.onnx.TypeProto.Map.verify(o.mapType);if(s)return"mapType."+s}}if(o.optionalType!=null&&o.hasOwnProperty("optionalType")){if(i.value===1)return"value: multiple values";i.value=1;{var s=I.onnx.TypeProto.Optional.verify(o.optionalType);if(s)return"optionalType."+s}}if(o.sparseTensorType!=null&&o.hasOwnProperty("sparseTensorType")){if(i.value===1)return"value: multiple values";i.value=1;{var s=I.onnx.TypeProto.SparseTensor.verify(o.sparseTensorType);if(s)return"sparseTensorType."+s}}return o.denotation!=null&&o.hasOwnProperty("denotation")&&!A.isString(o.denotation)?"denotation: string expected":null},e.fromObject=function(o){if(o instanceof I.onnx.TypeProto)return o;var i=new I.onnx.TypeProto;if(o.tensorType!=null){if(typeof o.tensorType!="object")throw TypeError(".onnx.TypeProto.tensorType: object expected");i.tensorType=I.onnx.TypeProto.Tensor.fromObject(o.tensorType)}if(o.sequenceType!=null){if(typeof o.sequenceType!="object")throw TypeError(".onnx.TypeProto.sequenceType: object expected");i.sequenceType=I.onnx.TypeProto.Sequence.fromObject(o.sequenceType)}if(o.mapType!=null){if(typeof o.mapType!="object")throw TypeError(".onnx.TypeProto.mapType: object expected");i.mapType=I.onnx.TypeProto.Map.fromObject(o.mapType)}if(o.optionalType!=null){if(typeof o.optionalType!="object")throw TypeError(".onnx.TypeProto.optionalType: object expected");i.optionalType=I.onnx.TypeProto.Optional.fromObject(o.optionalType)}if(o.sparseTensorType!=null){if(typeof o.sparseTensorType!="object")throw TypeError(".onnx.TypeProto.sparseTensorType: object expected");i.sparseTensorType=I.onnx.TypeProto.SparseTensor.fromObject(o.sparseTensorType)}return o.denotation!=null&&(i.denotation=String(o.denotation)),i},e.toObject=function(o,i){i||(i={});var s={};return i.defaults&&(s.denotation=""),o.tensorType!=null&&o.hasOwnProperty("tensorType")&&(s.tensorType=I.onnx.TypeProto.Tensor.toObject(o.tensorType,i),i.oneofs&&(s.value="tensorType")),o.sequenceType!=null&&o.hasOwnProperty("sequenceType")&&(s.sequenceType=I.onnx.TypeProto.Sequence.toObject(o.sequenceType,i),i.oneofs&&(s.value="sequenceType")),o.mapType!=null&&o.hasOwnProperty("mapType")&&(s.mapType=I.onnx.TypeProto.Map.toObject(o.mapType,i),i.oneofs&&(s.value="mapType")),o.denotation!=null&&o.hasOwnProperty("denotation")&&(s.denotation=o.denotation),o.sparseTensorType!=null&&o.hasOwnProperty("sparseTensorType")&&(s.sparseTensorType=I.onnx.TypeProto.SparseTensor.toObject(o.sparseTensorType,i),i.oneofs&&(s.value="sparseTensorType")),o.optionalType!=null&&o.hasOwnProperty("optionalType")&&(s.optionalType=I.onnx.TypeProto.Optional.toObject(o.optionalType,i),i.oneofs&&(s.value="optionalType")),s},e.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},e.getTypeUrl=function(o){return o===void 0&&(o="type.googleapis.com"),o+"/onnx.TypeProto"},e.Tensor=function(){function t(o){if(o)for(var i=Object.keys(o),s=0;s>>3){case 1:{u.elemType=i.int32();break}case 2:{u.shape=I.onnx.TensorShapeProto.decode(i,i.uint32());break}default:i.skipType(l&7);break}}return u},t.decodeDelimited=function(i){return i instanceof H||(i=new H(i)),this.decode(i,i.uint32())},t.verify=function(i){if(typeof i!="object"||i===null)return"object expected";if(i.elemType!=null&&i.hasOwnProperty("elemType")&&!A.isInteger(i.elemType))return"elemType: integer expected";if(i.shape!=null&&i.hasOwnProperty("shape")){var s=I.onnx.TensorShapeProto.verify(i.shape);if(s)return"shape."+s}return null},t.fromObject=function(i){if(i instanceof I.onnx.TypeProto.Tensor)return i;var s=new I.onnx.TypeProto.Tensor;if(i.elemType!=null&&(s.elemType=i.elemType|0),i.shape!=null){if(typeof i.shape!="object")throw TypeError(".onnx.TypeProto.Tensor.shape: object expected");s.shape=I.onnx.TensorShapeProto.fromObject(i.shape)}return s},t.toObject=function(i,s){s||(s={});var a={};return s.defaults&&(a.elemType=0,a.shape=null),i.elemType!=null&&i.hasOwnProperty("elemType")&&(a.elemType=i.elemType),i.shape!=null&&i.hasOwnProperty("shape")&&(a.shape=I.onnx.TensorShapeProto.toObject(i.shape,s)),a},t.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},t.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TypeProto.Tensor"},t}(),e.Sequence=function(){function t(o){if(o)for(var i=Object.keys(o),s=0;s>>3){case 1:{u.elemType=I.onnx.TypeProto.decode(i,i.uint32());break}default:i.skipType(l&7);break}}return u},t.decodeDelimited=function(i){return i instanceof H||(i=new H(i)),this.decode(i,i.uint32())},t.verify=function(i){if(typeof i!="object"||i===null)return"object expected";if(i.elemType!=null&&i.hasOwnProperty("elemType")){var s=I.onnx.TypeProto.verify(i.elemType);if(s)return"elemType."+s}return null},t.fromObject=function(i){if(i instanceof I.onnx.TypeProto.Sequence)return i;var s=new I.onnx.TypeProto.Sequence;if(i.elemType!=null){if(typeof i.elemType!="object")throw TypeError(".onnx.TypeProto.Sequence.elemType: object expected");s.elemType=I.onnx.TypeProto.fromObject(i.elemType)}return s},t.toObject=function(i,s){s||(s={});var a={};return s.defaults&&(a.elemType=null),i.elemType!=null&&i.hasOwnProperty("elemType")&&(a.elemType=I.onnx.TypeProto.toObject(i.elemType,s)),a},t.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},t.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TypeProto.Sequence"},t}(),e.Map=function(){function t(o){if(o)for(var i=Object.keys(o),s=0;s>>3){case 1:{u.keyType=i.int32();break}case 2:{u.valueType=I.onnx.TypeProto.decode(i,i.uint32());break}default:i.skipType(l&7);break}}return u},t.decodeDelimited=function(i){return i instanceof H||(i=new H(i)),this.decode(i,i.uint32())},t.verify=function(i){if(typeof i!="object"||i===null)return"object expected";if(i.keyType!=null&&i.hasOwnProperty("keyType")&&!A.isInteger(i.keyType))return"keyType: integer expected";if(i.valueType!=null&&i.hasOwnProperty("valueType")){var s=I.onnx.TypeProto.verify(i.valueType);if(s)return"valueType."+s}return null},t.fromObject=function(i){if(i instanceof I.onnx.TypeProto.Map)return i;var s=new I.onnx.TypeProto.Map;if(i.keyType!=null&&(s.keyType=i.keyType|0),i.valueType!=null){if(typeof i.valueType!="object")throw TypeError(".onnx.TypeProto.Map.valueType: object expected");s.valueType=I.onnx.TypeProto.fromObject(i.valueType)}return s},t.toObject=function(i,s){s||(s={});var a={};return s.defaults&&(a.keyType=0,a.valueType=null),i.keyType!=null&&i.hasOwnProperty("keyType")&&(a.keyType=i.keyType),i.valueType!=null&&i.hasOwnProperty("valueType")&&(a.valueType=I.onnx.TypeProto.toObject(i.valueType,s)),a},t.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},t.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TypeProto.Map"},t}(),e.Optional=function(){function t(o){if(o)for(var i=Object.keys(o),s=0;s>>3){case 1:{u.elemType=I.onnx.TypeProto.decode(i,i.uint32());break}default:i.skipType(l&7);break}}return u},t.decodeDelimited=function(i){return i instanceof H||(i=new H(i)),this.decode(i,i.uint32())},t.verify=function(i){if(typeof i!="object"||i===null)return"object expected";if(i.elemType!=null&&i.hasOwnProperty("elemType")){var s=I.onnx.TypeProto.verify(i.elemType);if(s)return"elemType."+s}return null},t.fromObject=function(i){if(i instanceof I.onnx.TypeProto.Optional)return i;var s=new I.onnx.TypeProto.Optional;if(i.elemType!=null){if(typeof i.elemType!="object")throw TypeError(".onnx.TypeProto.Optional.elemType: object expected");s.elemType=I.onnx.TypeProto.fromObject(i.elemType)}return s},t.toObject=function(i,s){s||(s={});var a={};return s.defaults&&(a.elemType=null),i.elemType!=null&&i.hasOwnProperty("elemType")&&(a.elemType=I.onnx.TypeProto.toObject(i.elemType,s)),a},t.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},t.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TypeProto.Optional"},t}(),e.SparseTensor=function(){function t(o){if(o)for(var i=Object.keys(o),s=0;s>>3){case 1:{u.elemType=i.int32();break}case 2:{u.shape=I.onnx.TensorShapeProto.decode(i,i.uint32());break}default:i.skipType(l&7);break}}return u},t.decodeDelimited=function(i){return i instanceof H||(i=new H(i)),this.decode(i,i.uint32())},t.verify=function(i){if(typeof i!="object"||i===null)return"object expected";if(i.elemType!=null&&i.hasOwnProperty("elemType")&&!A.isInteger(i.elemType))return"elemType: integer expected";if(i.shape!=null&&i.hasOwnProperty("shape")){var s=I.onnx.TensorShapeProto.verify(i.shape);if(s)return"shape."+s}return null},t.fromObject=function(i){if(i instanceof I.onnx.TypeProto.SparseTensor)return i;var s=new I.onnx.TypeProto.SparseTensor;if(i.elemType!=null&&(s.elemType=i.elemType|0),i.shape!=null){if(typeof i.shape!="object")throw TypeError(".onnx.TypeProto.SparseTensor.shape: object expected");s.shape=I.onnx.TensorShapeProto.fromObject(i.shape)}return s},t.toObject=function(i,s){s||(s={});var a={};return s.defaults&&(a.elemType=0,a.shape=null),i.elemType!=null&&i.hasOwnProperty("elemType")&&(a.elemType=i.elemType),i.shape!=null&&i.hasOwnProperty("shape")&&(a.shape=I.onnx.TensorShapeProto.toObject(i.shape,s)),a},t.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},t.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TypeProto.SparseTensor"},t}(),e}(),r.OperatorSetIdProto=function(){function e(n){if(n)for(var t=Object.keys(n),o=0;o>>3){case 1:{s.domain=t.string();break}case 2:{s.version=t.int64();break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){return typeof t!="object"||t===null?"object expected":t.domain!=null&&t.hasOwnProperty("domain")&&!A.isString(t.domain)?"domain: string expected":t.version!=null&&t.hasOwnProperty("version")&&!A.isInteger(t.version)&&!(t.version&&A.isInteger(t.version.low)&&A.isInteger(t.version.high))?"version: integer|Long expected":null},e.fromObject=function(t){if(t instanceof I.onnx.OperatorSetIdProto)return t;var o=new I.onnx.OperatorSetIdProto;return t.domain!=null&&(o.domain=String(t.domain)),t.version!=null&&(A.Long?(o.version=A.Long.fromValue(t.version)).unsigned=!1:typeof t.version=="string"?o.version=parseInt(t.version,10):typeof t.version=="number"?o.version=t.version:typeof t.version=="object"&&(o.version=new A.LongBits(t.version.low>>>0,t.version.high>>>0).toNumber())),o},e.toObject=function(t,o){o||(o={});var i={};if(o.defaults)if(i.domain="",A.Long){var s=new A.Long(0,0,!1);i.version=o.longs===String?s.toString():o.longs===Number?s.toNumber():s}else i.version=o.longs===String?"0":0;return t.domain!=null&&t.hasOwnProperty("domain")&&(i.domain=t.domain),t.version!=null&&t.hasOwnProperty("version")&&(typeof t.version=="number"?i.version=o.longs===String?String(t.version):t.version:i.version=o.longs===String?A.Long.prototype.toString.call(t.version):o.longs===Number?new A.LongBits(t.version.low>>>0,t.version.high>>>0).toNumber():t.version),i},e.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},e.getTypeUrl=function(t){return t===void 0&&(t="type.googleapis.com"),t+"/onnx.OperatorSetIdProto"},e}(),r.OperatorStatus=function(){var e={},n=Object.create(e);return n[e[0]="EXPERIMENTAL"]=0,n[e[1]="STABLE"]=1,n}(),r.FunctionProto=function(){function e(n){if(this.input=[],this.output=[],this.attribute=[],this.attributeProto=[],this.node=[],this.opsetImport=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{s.name=t.string();break}case 4:{s.input&&s.input.length||(s.input=[]),s.input.push(t.string());break}case 5:{s.output&&s.output.length||(s.output=[]),s.output.push(t.string());break}case 6:{s.attribute&&s.attribute.length||(s.attribute=[]),s.attribute.push(t.string());break}case 11:{s.attributeProto&&s.attributeProto.length||(s.attributeProto=[]),s.attributeProto.push(I.onnx.AttributeProto.decode(t,t.uint32()));break}case 7:{s.node&&s.node.length||(s.node=[]),s.node.push(I.onnx.NodeProto.decode(t,t.uint32()));break}case 8:{s.docString=t.string();break}case 9:{s.opsetImport&&s.opsetImport.length||(s.opsetImport=[]),s.opsetImport.push(I.onnx.OperatorSetIdProto.decode(t,t.uint32()));break}case 10:{s.domain=t.string();break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.name!=null&&t.hasOwnProperty("name")&&!A.isString(t.name))return"name: string expected";if(t.input!=null&&t.hasOwnProperty("input")){if(!Array.isArray(t.input))return"input: array expected";for(var o=0;o{"use strict";ko();ka();Ge=un(dn());Gr();zr=class{static arraysEqual(e,n){if(e.length!==n.length)return!1;for(let t=0;t1&&f>1)return;a[s-u]=Math.max(l,f)}return a}static index(e,n){let t=new Array(n.length);return r.fillIndex(e,n,t),t}static fillIndex(e,n,t){let o=e.length-n.length;for(let i=0;i=0;v--)l[v]=T%s[v],T=Math.floor(T/s[v]);h||(r.fillIndex(l,e.dims,f),p=e.get(f)),g||(r.fillIndex(l,n.dims,c),b=n.get(c)),u.set(l,t(p,b))}}return u}}static isValidBroadcast(e,n){let t=e.length,o=n.length;if(t>o)return!1;for(let i=1;i<=t;i++)if(e[t-i]!==1&&e[t-i]!==n[o-i])return!1;return!0}static getBroadcastDims(e,n){let t=e.length,o=[];for(let i=0;i1&&a===1&&o.unshift(s)}return o}},No=class{static getShapeOfGemmResult(e,n,t,o,i){if(e.length!==2||t.length!==2)throw new Error("shape need to be of size 2");let s,a,u;n?(s=e[1],a=e[0]):(s=e[0],a=e[1]);let l=-1;if(o?(u=t[0],l=1):(u=t[1],l=0),t[l]!==a)throw new Error("dimension mismatch");if(s<=0||u<=0||a<=0)throw new Error("invalid shape specified");if(i&&!gt.isValidBroadcast(i,[s,u]))throw new Error("gemm: invalid bias shape for broadcast");return[s,u,a]}},lt=class r{static tensorDataTypeFromProto(e){switch(e){case Ge.onnx.TensorProto.DataType.INT8:return"int8";case Ge.onnx.TensorProto.DataType.UINT8:return"uint8";case Ge.onnx.TensorProto.DataType.BOOL:return"bool";case Ge.onnx.TensorProto.DataType.INT16:return"int16";case Ge.onnx.TensorProto.DataType.UINT16:return"uint16";case Ge.onnx.TensorProto.DataType.INT32:return"int32";case Ge.onnx.TensorProto.DataType.UINT32:return"uint32";case Ge.onnx.TensorProto.DataType.FLOAT:return"float32";case Ge.onnx.TensorProto.DataType.DOUBLE:return"float64";case Ge.onnx.TensorProto.DataType.STRING:return"string";case Ge.onnx.TensorProto.DataType.INT64:return"int32";case Ge.onnx.TensorProto.DataType.UINT64:return"uint32";default:throw new Error(`unsupported data type: ${Ge.onnx.TensorProto.DataType[e]}`)}}static tensorDataTypeStringToEnum(e){switch(e){case"int8":return Ge.onnx.TensorProto.DataType.INT8;case"uint8":return Ge.onnx.TensorProto.DataType.UINT8;case"bool":return Ge.onnx.TensorProto.DataType.BOOL;case"int16":return Ge.onnx.TensorProto.DataType.INT16;case"uint16":return Ge.onnx.TensorProto.DataType.UINT16;case"int32":return Ge.onnx.TensorProto.DataType.INT32;case"uint32":return Ge.onnx.TensorProto.DataType.UINT32;case"float32":return Ge.onnx.TensorProto.DataType.FLOAT;case"float64":return Ge.onnx.TensorProto.DataType.DOUBLE;case"string":return Ge.onnx.TensorProto.DataType.STRING;case"int64":return Ge.onnx.TensorProto.DataType.INT64;case"uint64":return Ge.onnx.TensorProto.DataType.UINT64;default:throw new Error(`unsupported data type: ${e}`)}}static tensorDimsFromProto(e){return e.map(n=>dr.isLong(n)?n.toNumber():n)}static tensorValueTypeFromProto(e){return{tensorType:r.tensorDataTypeFromProto(e.elemType),shape:{dims:r.tensorDimsFromProto(e.shape.dim.map(n=>n.dimValue))}}}static tensorDimsFromORTFormat(e){let n=[];for(let t=0;te.length)throw new Error(`invalid dimension of ${n} for sizeFromDimension as Tensor has ${e.length} dimensions.`);return r.getSizeFromDimensionRange(e,n,e.length)}static sizeToDimension(e,n){if(n<0||n>e.length)throw new Error(`invalid dimension of ${n} for sizeToDimension as Tensor has ${e.length} dimensions.`);return r.getSizeFromDimensionRange(e,0,n)}static getSizeFromDimensionRange(e,n,t){let o=1;for(let i=n;i=0;--o)t[o]=t[o+1]*e[o+1];return t}static transpose(e){return e.slice().reverse()}static indicesToOffset(e,n,t){t===void 0&&(t=e.length);let o=0;for(let i=0;i=n)throw new Error("unsupported axis for this operation.");return e<0?e+n:e}static normalizeAxes(e,n){return e.map(t=>this.normalizeAxis(t,n))}static incrementIndex(e,n,t){if(n.length===0||e.length===0)throw new Error("Index incrementing unsupported for scalar Tensor");if(t===void 0)t=n.length;else if(t<=0||t>n.length)throw new Error("Incorrect axis to increment on");for(let o=t-1;o>=0&&(e[o]++,!(e[o]=e.length)throw new Error("the dimension with value zero exceeds the dimension size of the input tensor");o[u]=e[u]}else o[u]=n[u];s*=o[u]}}let a=r.size(e);if(i!==-1){if(a%s!==0)throw new Error(`the input tensor cannot be reshaped to the requested shape. Input shape: [${e}] Output shape: [${n}]`);o[i]=a/s}else if(s!==a)throw new Error("reshapedDims and originalDims don't have matching sizes");return o}static sortBasedOnPerm(e,n){return n?n.map(t=>e[t]):e.slice().reverse()}static padShape(e,n){let t=e.length;return e.map((o,i)=>o+n[i]+n[i+t])}static areEqual(e,n){return e.length!==n.length?!1:e.every((t,o)=>t===n[o])}static validateDimsAndCalcSize(e){if(e.length>6)throw new TypeError("Only rank 0 to 6 is supported for tensor shape.");let n=1;for(let t of e){if(!Number.isInteger(t))throw new TypeError(`Invalid shape: ${t} is not an integer`);if(t<0||t>2147483647)throw new TypeError(`Invalid shape: length ${t} is not allowed`);n*=t}return n}static flattenShape(e,n){n<0&&(n+=e.length);let t=e.reduce((s,a)=>s*a,1),o=e.slice(n).reduce((s,a)=>s*a,1);return[t/o,o]}static squeezeShape(e,n){let t=new Array;n=r.normalizeAxes(n,e.length);for(let o=0;o=0;if(i&&e[o]!==1)throw new Error("squeeze an axis of size different than 1");(n.length===0&&e[o]>1||n.length>0&&!i)&&t.push(e[o])}return t}static unsqueezeShape(e,n){let t=new Array(e.length+n.length);t.fill(0);for(let i=0;i=t.length)throw new Error("'axes' has an out of range axis");if(t[s]!==0)throw new Error("'axes' has a duplicate axis");t[s]=1}let o=0;for(let i=0;i=t.length?t.push(n[a+2]):t[a]=n[a+2];for(let a=0;a=t[a]||s[a+t.length]>=t[a])throw new Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(e,n,t,o,i,s){if(s){if(i.length!==2*(e.length-2))throw new Error("length of pads should be twice the length of data dimensions");if(n.length!==e.length-2)throw new Error("length of strides should be the length of data dimensions");if(o.length!==e.length-2)throw new Error("length of kernel shapes should be the length of data dimensions");for(let a=0;a{"use strict";Cf=un(xc());ka();Cn();ve=un(dn());De();Ka=ee.experimental.fbs,Qe=class r{constructor(e,n,t,o,i,s=Cf.Guid.create()){this.dims=e;this.type=n;this.dataProvider=t;this.asyncDataProvider=o;this.cache=i;this.dataId=s;this.size=J.validateDimsAndCalcSize(e);let a=this.size,u=t===void 0&&o===void 0&&i===void 0;if(i!==void 0&&i.length!==a)throw new RangeError("Input dims doesn't match data length.");if(n==="string"){if(i!==void 0&&(!Array.isArray(i)||!i.every(l=>typeof l=="string")))throw new TypeError("cache should be a string array");u&&(this.cache=new Array(a))}else{if(i!==void 0){let l=kf(n);if(!(i instanceof l))throw new TypeError(`cache should be type ${l.name}`)}if(u){let l=new ArrayBuffer(a*wv(n));this.cache=Tv(l,n)}}}get data(){if(this.cache===void 0){let e=this.dataProvider(this.dataId);if(e.length!==this.size)throw new Error("Length of data provided by the Data Provider is inconsistent with the dims of this Tensor.");this.cache=e}return this.cache}get stringData(){if(this.type!=="string")throw new TypeError("data type is not string");return this.data}get integerData(){switch(this.type){case"uint8":case"int8":case"uint16":case"int16":case"int32":case"uint32":case"bool":return this.data;default:throw new TypeError("data type is not integer (uint8, int8, uint16, int16, int32, uint32, bool)")}}get floatData(){switch(this.type){case"float32":case"float64":return this.data;default:throw new TypeError("data type is not float (float32, float64)")}}get numberData(){if(this.type!=="string")return this.data;throw new TypeError("type cannot be non-number (string)")}get(e){return this.data[J.indicesToOffset(e,this.strides)]}set(e,n){this.data[J.indicesToOffset(e,this.strides)]=n}async getData(){return this.cache===void 0&&(this.cache=await this.asyncDataProvider(this.dataId)),this.cache}get strides(){return this._strides||(this._strides=J.computeStrides(this.dims)),this._strides}static fromProto(e){if(!e)throw new Error("cannot construct Value from an empty tensor");let n=lt.tensorDataTypeFromProto(e.dataType),t=lt.tensorDimsFromProto(e.dims),o=new r(t,n);if(n==="string")e.stringData.forEach((i,s)=>{o.data[s]=Rn(i)});else if(e.rawData&&typeof e.rawData.byteLength=="number"&&e.rawData.byteLength>0){let i=o.data,s=new DataView(e.rawData.buffer,e.rawData.byteOffset,e.rawData.byteLength),a=Of(e.dataType),u=e.rawData.byteLength/a;if(e.rawData.byteLength%a!==0)throw new Error("invalid buffer length");if(i.length!==u)throw new Error("buffer length mismatch");for(let l=0;l0){let i=o.data,s=new DataView(e.rawDataArray().buffer,e.rawDataArray().byteOffset,e.rawDataLength()),a=Of(e.dataType()),u=e.rawDataLength()/a;if(e.rawDataLength()%a!==0)throw new Error("invalid buffer length");if(i.length!==u)throw new Error("buffer length mismatch");for(let l=0;ltypeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var C=(r,e)=>()=>(r&&(e=r(r=0)),e);var Je=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),un=(r,e)=>{for(var n in e)bo(r,n,{get:e[n],enumerable:!0})},Fl=(r,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of rv(e))!ov.call(r,o)&&o!==n&&bo(r,o,{get:()=>e[o],enumerable:!(t=tv(e,o))||t.enumerable});return r};var ln=(r,e,n)=>(n=r!=null?ev(nv(r)):{},Fl(e||!r||!r.__esModule?bo(n,"default",{value:r,enumerable:!0}):n,r)),Pn=r=>Fl(bo({},"__esModule",{value:!0}),r);var yo,Dr,vr,iv,xo,vo=C(()=>{"use strict";yo=new Map,Dr=[],vr=(r,e,n)=>{if(e&&typeof e.init=="function"&&typeof e.createInferenceSessionHandler=="function"){let t=yo.get(r);if(t===void 0)yo.set(r,{backend:e,priority:n});else{if(t.priority>n)return;if(t.priority===n&&t.backend!==e)throw new Error(`cannot register backend "${r}" using priority ${n}`)}if(n>=0){let o=Dr.indexOf(r);o!==-1&&Dr.splice(o,1);for(let i=0;i{let e=yo.get(r);if(!e)return"backend not found.";if(e.initialized)return e.backend;if(e.aborted)return e.error;{let n=!!e.initPromise;try{return n||(e.initPromise=e.backend.init(r)),await e.initPromise,e.initialized=!0,e.backend}catch(t){return n||(e.error=`${t}`,e.aborted=!0),e.error}finally{delete e.initPromise}}},xo=async r=>{let e=r.executionProviders||[],n=e.map(u=>typeof u=="string"?u:u.name),t=n.length===0?Dr:n,o,i=[],s=new Set;for(let u of t){let l=await iv(u);typeof l=="string"?i.push({name:u,err:l}):(o||(o=l),o===l&&s.add(u))}if(!o)throw new Error(`no available backend found. ERR: ${i.map(u=>`[${u.name}] ${u.err}`).join(", ")}`);for(let{name:u,err:l}of i)n.includes(u)&&console.warn(`removing requested execution provider "${u}" from session options because it is not available: ${l}`);let a=e.filter(u=>s.has(typeof u=="string"?u:u.name));return[o,new Proxy(r,{get:(u,l)=>l==="executionProviders"?a:Reflect.get(u,l)})]}});var Ml=C(()=>{"use strict";vo()});var Vl,Gl=C(()=>{"use strict";Vl="1.19.0"});var Ul,It,Ia=C(()=>{"use strict";Gl();Ul="warning",It={wasm:{},webgl:{},webgpu:{},versions:{common:Vl},set logLevel(r){if(r!==void 0){if(typeof r!="string"||["verbose","info","warning","error","fatal"].indexOf(r)===-1)throw new Error(`Unsupported logging level: ${r}`);Ul=r}},get logLevel(){return Ul}};Object.defineProperty(It,"logLevel",{enumerable:!0})});var le,Wl=C(()=>{"use strict";Ia();le=It});var Hl,ql,jl=C(()=>{"use strict";Hl=(r,e)=>{let n=typeof document<"u"?document.createElement("canvas"):new OffscreenCanvas(1,1);n.width=r.dims[3],n.height=r.dims[2];let t=n.getContext("2d");if(t!=null){let o,i;e?.tensorLayout!==void 0&&e.tensorLayout==="NHWC"?(o=r.dims[2],i=r.dims[3]):(o=r.dims[3],i=r.dims[2]);let s=e?.format!==void 0?e.format:"RGB",a=e?.norm,u,l;a===void 0||a.mean===void 0?u=[255,255,255,255]:typeof a.mean=="number"?u=[a.mean,a.mean,a.mean,a.mean]:(u=[a.mean[0],a.mean[1],a.mean[2],0],a.mean[3]!==void 0&&(u[3]=a.mean[3])),a===void 0||a.bias===void 0?l=[0,0,0,0]:typeof a.bias=="number"?l=[a.bias,a.bias,a.bias,a.bias]:(l=[a.bias[0],a.bias[1],a.bias[2],0],a.bias[3]!==void 0&&(l[3]=a.bias[3]));let f=i*o,c=0,p=f,b=f*2,h=-1;s==="RGBA"?(c=0,p=f,b=f*2,h=f*3):s==="RGB"?(c=0,p=f,b=f*2):s==="RBG"&&(c=0,b=f,p=f*2);for(let g=0;g{let n=typeof document<"u"?document.createElement("canvas").getContext("2d"):new OffscreenCanvas(1,1).getContext("2d"),t;if(n!=null){let o,i,s;e?.tensorLayout!==void 0&&e.tensorLayout==="NHWC"?(o=r.dims[2],i=r.dims[1],s=r.dims[3]):(o=r.dims[3],i=r.dims[2],s=r.dims[1]);let a=e!==void 0&&e.format!==void 0?e.format:"RGB",u=e?.norm,l,f;u===void 0||u.mean===void 0?l=[255,255,255,255]:typeof u.mean=="number"?l=[u.mean,u.mean,u.mean,u.mean]:(l=[u.mean[0],u.mean[1],u.mean[2],255],u.mean[3]!==void 0&&(l[3]=u.mean[3])),u===void 0||u.bias===void 0?f=[0,0,0,0]:typeof u.bias=="number"?f=[u.bias,u.bias,u.bias,u.bias]:(f=[u.bias[0],u.bias[1],u.bias[2],0],u.bias[3]!==void 0&&(f[3]=u.bias[3]));let c=i*o;if(e!==void 0&&(e.format!==void 0&&s===4&&e.format!=="RGBA"||s===3&&e.format!=="RGB"&&e.format!=="BGR"))throw new Error("Tensor format doesn't match input tensor dims");let p=4,b=0,h=1,g=2,T=3,w=0,v=c,S=c*2,$=-1;a==="RGBA"?(w=0,v=c,S=c*2,$=c*3):a==="RGB"?(w=0,v=c,S=c*2):a==="RBG"&&(w=0,S=c,v=c*2),t=n.createImageData(o,i);for(let P=0;P{"use strict";wo();Sa=(r,e)=>{if(r===void 0)throw new Error("Image buffer must be defined");if(e.height===void 0||e.width===void 0)throw new Error("Image height and width must be defined");if(e.tensorLayout==="NHWC")throw new Error("NHWC Tensor layout is not supported yet");let{height:n,width:t}=e,o=e.norm??{mean:255,bias:0},i,s;typeof o.mean=="number"?i=[o.mean,o.mean,o.mean,o.mean]:i=[o.mean[0],o.mean[1],o.mean[2],o.mean[3]??255],typeof o.bias=="number"?s=[o.bias,o.bias,o.bias,o.bias]:s=[o.bias[0],o.bias[1],o.bias[2],o.bias[3]??0];let a=e.format!==void 0?e.format:"RGBA",u=e.tensorFormat!==void 0&&e.tensorFormat!==void 0?e.tensorFormat:"RGB",l=n*t,f=u==="RGBA"?new Float32Array(l*4):new Float32Array(l*3),c=4,p=0,b=1,h=2,g=3,T=0,w=l,v=l*2,S=-1;a==="RGB"&&(c=3,p=0,b=1,h=2,g=-1),u==="RGBA"?S=l*3:u==="RBG"?(T=0,v=l,w=l*2):u==="BGR"&&(v=0,w=l,T=l*2);for(let P=0;P{let n=typeof HTMLImageElement<"u"&&r instanceof HTMLImageElement,t=typeof ImageData<"u"&&r instanceof ImageData,o=typeof ImageBitmap<"u"&&r instanceof ImageBitmap,i=typeof r=="string",s,a=e??{},u=()=>{if(typeof document<"u")return document.createElement("canvas");if(typeof OffscreenCanvas<"u")return new OffscreenCanvas(1,1);throw new Error("Canvas is not supported")},l=f=>f instanceof HTMLCanvasElement||f instanceof OffscreenCanvas?f.getContext("2d"):null;if(n){let f=u();f.width=r.width,f.height=r.height;let c=l(f);if(c!=null){let p=r.height,b=r.width;if(e!==void 0&&e.resizedHeight!==void 0&&e.resizedWidth!==void 0&&(p=e.resizedHeight,b=e.resizedWidth),e!==void 0){if(a=e,e.tensorFormat!==void 0)throw new Error("Image input config format must be RGBA for HTMLImageElement");a.tensorFormat="RGBA",a.height=p,a.width=b}else a.tensorFormat="RGBA",a.height=p,a.width=b;c.drawImage(r,0,0),s=c.getImageData(0,0,b,p).data}else throw new Error("Can not access image data")}else if(t){let f,c;if(e!==void 0&&e.resizedWidth!==void 0&&e.resizedHeight!==void 0?(f=e.resizedHeight,c=e.resizedWidth):(f=r.height,c=r.width),e!==void 0&&(a=e),a.format="RGBA",a.height=f,a.width=c,e!==void 0){let p=u();p.width=c,p.height=f;let b=l(p);if(b!=null)b.putImageData(r,0,0),s=b.getImageData(0,0,c,f).data;else throw new Error("Can not access image data")}else s=r.data}else if(o){if(e===void 0)throw new Error("Please provide image config with format for Imagebitmap");let f=u();f.width=r.width,f.height=r.height;let c=l(f);if(c!=null){let p=r.height,b=r.width;return c.drawImage(r,0,0,b,p),s=c.getImageData(0,0,b,p).data,a.height=p,a.width=b,Sa(s,a)}else throw new Error("Can not access image data")}else{if(i)return new Promise((f,c)=>{let p=u(),b=l(p);if(!r||!b)return c();let h=new Image;h.crossOrigin="Anonymous",h.src=r,h.onload=()=>{p.width=h.width,p.height=h.height,b.drawImage(h,0,0,p.width,p.height);let g=b.getImageData(0,0,p.width,p.height);a.height=p.height,a.width=p.width,f(Sa(g.data,a))}});throw new Error("Input data provided is not supported - aborted tensor creation")}if(s!==void 0)return Sa(s,a);throw new Error("Input data provided is not supported - aborted tensor creation")},Xl=(r,e)=>{let{width:n,height:t,download:o,dispose:i}=e,s=[1,t,n,4];return new ht({location:"texture",type:"float32",texture:r,dims:s,download:o,dispose:i})},Zl=(r,e)=>{let{dataType:n,dims:t,download:o,dispose:i}=e;return new ht({location:"gpu-buffer",type:n??"float32",gpuBuffer:r,dims:t,download:o,dispose:i})},Yl=(r,e,n)=>new ht({location:"cpu-pinned",type:r,data:e,dims:n??[e.length]})});var Br,On,Ql,ec,tc=C(()=>{"use strict";Br=new Map([["float32",Float32Array],["uint8",Uint8Array],["int8",Int8Array],["uint16",Uint16Array],["int16",Int16Array],["int32",Int32Array],["bool",Uint8Array],["float64",Float64Array],["uint32",Uint32Array]]),On=new Map([[Float32Array,"float32"],[Uint8Array,"uint8"],[Int8Array,"int8"],[Uint16Array,"uint16"],[Int16Array,"int16"],[Int32Array,"int32"],[Float64Array,"float64"],[Uint32Array,"uint32"]]),Ql=!1,ec=()=>{if(!Ql){Ql=!0;let r=typeof BigInt64Array<"u"&&BigInt64Array.from,e=typeof BigUint64Array<"u"&&BigUint64Array.from,n=typeof Float16Array<"u"&&Float16Array.from;r&&(Br.set("int64",BigInt64Array),On.set(BigInt64Array,"int64")),e&&(Br.set("uint64",BigUint64Array),On.set(BigUint64Array,"uint64")),n?(Br.set("float16",Float16Array),On.set(Float16Array,"float16")):Br.set("float16",Uint16Array)}}});var rc,nc,oc=C(()=>{"use strict";wo();rc=r=>{let e=1;for(let n=0;n{switch(r.location){case"cpu":return new ht(r.type,r.data,e);case"cpu-pinned":return new ht({location:"cpu-pinned",data:r.data,type:r.type,dims:e});case"texture":return new ht({location:"texture",texture:r.texture,type:r.type,dims:e});case"gpu-buffer":return new ht({location:"gpu-buffer",gpuBuffer:r.gpuBuffer,type:r.type,dims:e});default:throw new Error(`tensorReshape: tensor location ${r.location} is not supported`)}}});var ht,wo=C(()=>{"use strict";jl();Jl();tc();oc();ht=class{constructor(e,n,t){ec();let o,i;if(typeof e=="object"&&"location"in e)switch(this.dataLocation=e.location,o=e.type,i=e.dims,e.location){case"cpu-pinned":{let a=Br.get(o);if(!a)throw new TypeError(`unsupported type "${o}" to create tensor from pinned buffer`);if(!(e.data instanceof a))throw new TypeError(`buffer should be of type ${a.name}`);this.cpuData=e.data;break}case"texture":{if(o!=="float32")throw new TypeError(`unsupported type "${o}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break}case"gpu-buffer":{if(o!=="float32"&&o!=="float16"&&o!=="int32"&&o!=="int64"&&o!=="uint32"&&o!=="uint8"&&o!=="bool")throw new TypeError(`unsupported type "${o}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break}default:throw new Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let a,u;if(typeof e=="string")if(o=e,u=t,e==="string"){if(!Array.isArray(n))throw new TypeError("A string tensor's data must be a string array.");a=n}else{let l=Br.get(e);if(l===void 0)throw new TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(n)){if(e==="float16"&&l===Uint16Array)throw new TypeError("Creating a float16 tensor from number array is not supported. Please use Uint16Array as data.");e==="uint64"||e==="int64"?a=l.from(n,BigInt):a=l.from(n)}else if(n instanceof l)a=n;else throw new TypeError(`A ${o} tensor's data must be type of ${l}`)}else if(u=n,Array.isArray(e)){if(e.length===0)throw new TypeError("Tensor type cannot be inferred from an empty array.");let l=typeof e[0];if(l==="string")o="string",a=e;else if(l==="boolean")o="bool",a=Uint8Array.from(e);else throw new TypeError(`Invalid element type of data array: ${l}.`)}else{let l=On.get(e.constructor);if(l===void 0)throw new TypeError(`Unsupported type for tensor data: ${e.constructor}.`);o=l,a=e}if(u===void 0)u=[a.length];else if(!Array.isArray(u))throw new TypeError("A tensor's dims must be a number array");i=u,this.cpuData=a,this.dataLocation="cpu"}let s=rc(i);if(this.cpuData&&s!==this.cpuData.length)throw new Error(`Tensor's size(${s}) does not match data length(${this.cpuData.length}).`);this.type=o,this.dims=i,this.size=s}static async fromImage(e,n){return Kl(e,n)}static fromTexture(e,n){return Xl(e,n)}static fromGpuBuffer(e,n){return Zl(e,n)}static fromPinnedBuffer(e,n,t){return Yl(e,n,t)}toDataURL(e){return Hl(this,e)}toImageData(e){return ql(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw new Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw new Error("The data is not stored as a WebGL texture.");return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw new Error("The data is not stored as a WebGPU buffer.");return this.gpuBufferData}async getData(e){switch(this.ensureValid(),this.dataLocation){case"cpu":case"cpu-pinned":return this.data;case"texture":case"gpu-buffer":{if(!this.downloader)throw new Error("The current tensor is not created with a specified data downloader.");if(this.isDownloading)throw new Error("The current tensor is being downloaded.");try{this.isDownloading=!0;let n=await this.downloader();return this.downloader=void 0,this.dataLocation="cpu",this.cpuData=n,e&&this.disposer&&(this.disposer(),this.disposer=void 0),n}finally{this.isDownloading=!1}}default:throw new Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw new Error("The current tensor is being downloaded.");this.disposer&&(this.disposer(),this.disposer=void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation="none"}ensureValid(){if(this.dataLocation==="none")throw new Error("The tensor is disposed.")}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw new Error("Cannot reshape a tensor that owns GPU resource.");return nc(this,e)}}});var it,To=C(()=>{"use strict";wo();it=ht});var _o,ic,St,yt,$a=C(()=>{"use strict";Ia();_o=(r,e)=>{(typeof It.trace>"u"?!It.wasm.trace:!It.trace)||console.timeStamp(`${r}::ORT::${e}`)},ic=(r,e)=>{let n=new Error().stack?.split(/\r\n|\r|\n/g)||[],t=!1;for(let o=0;o{(typeof It.trace>"u"?!It.wasm.trace:!It.trace)||ic("BEGIN",r)},yt=r=>{(typeof It.trace>"u"?!It.wasm.trace:!It.trace)||ic("END",r)}});var Io,ac=C(()=>{"use strict";vo();To();$a();Io=class r{constructor(e){this.handler=e}async run(e,n,t){St();let o={},i={};if(typeof e!="object"||e===null||e instanceof it||Array.isArray(e))throw new TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let s=!0;if(typeof n=="object"){if(n===null)throw new TypeError("Unexpected argument[1]: cannot be null.");if(n instanceof it)throw new TypeError("'fetches' cannot be a Tensor");if(Array.isArray(n)){if(n.length===0)throw new TypeError("'fetches' cannot be an empty array.");s=!1;for(let l of n){if(typeof l!="string")throw new TypeError("'fetches' must be a string array or an object.");if(this.outputNames.indexOf(l)===-1)throw new RangeError(`'fetches' contains invalid output name: ${l}.`);o[l]=null}if(typeof t=="object"&&t!==null)i=t;else if(typeof t<"u")throw new TypeError("'options' must be an object.")}else{let l=!1,f=Object.getOwnPropertyNames(n);for(let c of this.outputNames)if(f.indexOf(c)!==-1){let p=n[c];(p===null||p instanceof it)&&(l=!0,s=!1,o[c]=p)}if(l){if(typeof t=="object"&&t!==null)i=t;else if(typeof t<"u")throw new TypeError("'options' must be an object.")}else i=n}}else if(typeof n<"u")throw new TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let l of this.inputNames)if(typeof e[l]>"u")throw new Error(`input '${l}' is missing in 'feeds'.`);if(s)for(let l of this.outputNames)o[l]=null;let a=await this.handler.run(e,o,i),u={};for(let l in a)if(Object.hasOwnProperty.call(a,l)){let f=a[l];f instanceof it?u[l]=f:u[l]=new it(f.type,f.data,f.dims)}return yt(),u}async release(){return this.handler.dispose()}static async create(e,n,t,o){St();let i,s={};if(typeof e=="string"){if(i=e,typeof n=="object"&&n!==null)s=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else if(e instanceof Uint8Array){if(i=e,typeof n=="object"&&n!==null)s=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else if(e instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&e instanceof SharedArrayBuffer){let f=e,c=0,p=e.byteLength;if(typeof n=="object"&&n!==null)s=n;else if(typeof n=="number"){if(c=n,!Number.isSafeInteger(c))throw new RangeError("'byteOffset' must be an integer.");if(c<0||c>=f.byteLength)throw new RangeError(`'byteOffset' is out of range [0, ${f.byteLength}).`);if(p=e.byteLength-c,typeof t=="number"){if(p=t,!Number.isSafeInteger(p))throw new RangeError("'byteLength' must be an integer.");if(p<=0||c+p>f.byteLength)throw new RangeError(`'byteLength' is out of range (0, ${f.byteLength-c}].`);if(typeof o=="object"&&o!==null)s=o;else if(typeof o<"u")throw new TypeError("'options' must be an object.")}else if(typeof t<"u")throw new TypeError("'byteLength' must be a number.")}else if(typeof n<"u")throw new TypeError("'options' must be an object.");i=new Uint8Array(f,c,p)}else throw new TypeError("Unexpected argument[0]: must be 'path' or 'buffer'.");let[a,u]=await xo(s),l=await a.createInferenceSessionHandler(i,u);return yt(),new r(l)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}}});var av,sc=C(()=>{"use strict";ac();av=Io});var uc=C(()=>{"use strict"});var lc=C(()=>{"use strict"});var cc=C(()=>{"use strict"});var fc=C(()=>{"use strict"});var sv,So,dc=C(()=>{"use strict";vo();To();sv="Training backend could not be resolved. Make sure you're using the correct configuration & WebAssembly files.",So=class r{constructor(e,n,t){this.handler=e,this.hasOptimizerModel=n,this.hasEvalModel=t}get trainingInputNames(){return this.handler.inputNames}get trainingOutputNames(){return this.handler.outputNames}get evalInputNames(){if(this.hasEvalModel)return this.handler.evalInputNames;throw new Error("This training session has no evalModel loaded.")}get evalOutputNames(){if(this.hasEvalModel)return this.handler.evalOutputNames;throw new Error("This training session has no evalModel loaded.")}static async create(e,n){let t=e.evalModel||"",o=e.optimizerModel||"",i=n||{},[s,a]=await xo(i);if(s.createTrainingSessionHandler){let u=await s.createTrainingSessionHandler(e.checkpointState,e.trainModel,t,o,a);return new r(u,!!e.optimizerModel,!!e.evalModel)}else throw new Error(sv)}typeNarrowingForRunStep(e,n,t,o,i){let s={},a={};if(typeof t!="object"||t===null||t instanceof it||Array.isArray(t))throw new TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let u=!0;if(typeof o=="object"){if(o===null)throw new TypeError("Unexpected argument[1]: cannot be null.");if(o instanceof it)throw new TypeError("'fetches' cannot be a Tensor");if(Array.isArray(o)){if(o.length===0)throw new TypeError("'fetches' cannot be an empty array.");u=!1;for(let l of o){if(typeof l!="string")throw new TypeError("'fetches' must be a string array or an object.");if(n.indexOf(l)===-1)throw new RangeError(`'fetches' contains invalid output name: ${l}.`);s[l]=null}if(typeof i=="object"&&i!==null)a=i;else if(typeof i<"u")throw new TypeError("'options' must be an object.")}else{let l=!1,f=Object.getOwnPropertyNames(o);for(let c of n)if(f.indexOf(c)!==-1){let p=o[c];(p===null||p instanceof it)&&(l=!0,u=!1,s[c]=p)}if(l){if(typeof i=="object"&&i!==null)a=i;else if(typeof i<"u")throw new TypeError("'options' must be an object.")}else a=o}}else if(typeof o<"u")throw new TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let l of e)if(typeof t[l]>"u")throw new Error(`input '${l}' is missing in 'feeds'.`);if(u)for(let l of n)s[l]=null;return[s,a]}convertHandlerReturnTypeToMapOfTensors(e){let n={};for(let t in e)if(Object.hasOwnProperty.call(e,t)){let o=e[t];o instanceof it?n[t]=o:n[t]=new it(o.type,o.data,o.dims)}return n}async lazyResetGrad(){await this.handler.lazyResetGrad()}async runTrainStep(e,n,t){let[o,i]=this.typeNarrowingForRunStep(this.trainingInputNames,this.trainingOutputNames,e,n,t),s=await this.handler.runTrainStep(e,o,i);return this.convertHandlerReturnTypeToMapOfTensors(s)}async runOptimizerStep(e){if(this.hasOptimizerModel)await this.handler.runOptimizerStep(e||{});else throw new Error("This TrainingSession has no OptimizerModel loaded.")}async runEvalStep(e,n,t){if(this.hasEvalModel){let[o,i]=this.typeNarrowingForRunStep(this.evalInputNames,this.evalOutputNames,e,n,t),s=await this.handler.runEvalStep(e,o,i);return this.convertHandlerReturnTypeToMapOfTensors(s)}else throw new Error("This TrainingSession has no EvalModel loaded.")}async getParametersSize(e=!0){return this.handler.getParametersSize(e)}async loadParametersBuffer(e,n=!0){let t=await this.getParametersSize(n);if(e.length!==4*t)throw new Error("Size of the buffer passed into loadParametersBuffer must match the number of parameters in the model. Please use getParametersSize method to check.");return this.handler.loadParametersBuffer(e,n)}async getContiguousParameters(e=!0){return this.handler.getContiguousParameters(e)}async release(){return this.handler.dispose()}}});var uv,pc=C(()=>{"use strict";dc();uv=So});var Aa={};un(Aa,{InferenceSession:()=>av,TRACE:()=>_o,TRACE_FUNC_BEGIN:()=>St,TRACE_FUNC_END:()=>yt,Tensor:()=>it,TrainingSession:()=>uv,env:()=>le,registerBackend:()=>vr});var ft=C(()=>{"use strict";Ml();Wl();sc();To();uc();lc();$a();cc();fc();pc()});function wr(r,e,n,t){if(e===void 0)return cv(r);if(n===void 0)$o(r,e,1);else if(typeof n=="number"&&t===void 0)$o(r,e,n);else if(typeof n=="string"&&t===void 0)$o(r,n,1,e);else if(typeof n=="string"&&typeof t=="number")$o(r,n,t,e);else throw new TypeError("input is valid")}function cv(r){return{verbose:wr.verbose.bind(null,r),info:wr.info.bind(null,r),warning:wr.warning.bind(null,r),error:wr.error.bind(null,r),fatal:wr.fatal.bind(null,r)}}function $o(r,e,n,t){let o=En[t||""]||En[""];hc[r]{"use strict";Pa=class{log(e,n,t){}},Oa=class{log(e,n,t){console.log(`${this.color(e)} ${t?"\x1B[35m"+t+"\x1B[0m ":""}${n}`)}color(e){switch(e){case"verbose":return"\x1B[34;40mv\x1B[0m";case"info":return"\x1B[32mi\x1B[0m";case"warning":return"\x1B[30;43mw\x1B[0m";case"error":return"\x1B[31;40me\x1B[0m";case"fatal":return"\x1B[101mf\x1B[0m";default:throw new Error(`unsupported severity: ${e}`)}}},hc={verbose:1e3,info:2e3,warning:4e3,error:5e3,fatal:6e3},lv={none:new Pa,console:new Oa},gc={provider:"console",minimalSeverity:"warning",logDateTime:!0,logSourceLocation:!1},En={"":gc};(u=>{function r(l,f){u("verbose",l,f)}u.verbose=r;function e(l,f){u("info",l,f)}u.info=e;function n(l,f){u("warning",l,f)}u.warning=n;function t(l,f){u("error",l,f)}u.error=t;function o(l,f){u("fatal",l,f)}u.fatal=o;function i(l){En={},s("",l||{})}u.reset=i;function s(l,f){if(l==="*")i(f);else{let c=En[l]||gc;En[l]={provider:f.provider||c.provider,minimalSeverity:f.minimalSeverity||c.minimalSeverity,logDateTime:f.logDateTime===void 0?c.logDateTime:f.logDateTime,logSourceLocation:f.logSourceLocation===void 0?c.logSourceLocation:f.logSourceLocation}}}u.set=s;function a(l){let f={};l.logLevel&&(f.minimalSeverity=l.logLevel),s("",f)}u.setWithEnv=a})(wr||={});Re=wr,Po=class{constructor(e,n,t,o,i,s){this.category=e;this.name=n;this.startTime=t;this.endCallback=o;this.timer=i;this.ctx=s}async end(){return this.endCallback(this)}async checkTimer(){if(this.ctx===void 0||this.timer===void 0)throw new Error("No webgl timer found");return this.ctx.endTimer(),this.ctx.waitForQueryAndGetTime(this.timer)}},Oo=class{constructor(e,n,t,o){this.category=e;this.name=n;this.startTime=t;this.endTime=o}},Eo=class{constructor(e,n,t){this._started=!1;this._flushPointer=0;this._started=!1,this._maxNumberEvents=e===void 0?1e4:e,this._flushBatchSize=n===void 0?10:n,this._flushIntervalInMilliseconds=t===void 0?5e3:t}static create(e){return e===void 0?new this:new this(e.maxNumberEvents,e.flushBatchSize,e.flushIntervalInMilliseconds)}start(){this._started=!0,this._timingEvents=[],this._flushTime=Ao(),this._flushPointer=0}stop(){for(this._started=!1;this._flushPointer{a.then(async f=>{i&&await i.end(),u(f)},async f=>{i&&await i.end(),l(f)})});if(!s&&i){let u=i.end();if(u&&typeof u.then=="function")return new Promise((l,f)=>{u.then(()=>{l(a)},c=>{f(c)})})}return a}begin(e,n,t){if(!this._started)throw new Error("profiler is not started yet");if(t===void 0){let o=Ao();return this.flush(o),new Po(e,n,o,i=>this.endSync(i))}else{let o=t.beginTimer();return new Po(e,n,0,async i=>this.end(i),o,t)}}async end(e){let n=await e.checkTimer();this._timingEvents.length=this._flushBatchSize||e-this._flushTime>=this._flushIntervalInMilliseconds){for(let n=this._flushPointer;this._flushPointerperformance.now():Date.now});function bc(r,e,n){for(let t of n){let o=t[0],i=t[1],s=t[2],a=t[3],u=t[4];if(r.opType===o){for(let l of e)if((l.domain===i||l.domain==="ai.onnx"&&i==="")&&fv(l.version,s))return{opImpl:a,opInit:u}}}throw new TypeError(`cannot resolve operator '${r.opType}' with opsets: ${e.map(t=>`${t.domain||"ai.onnx"} v${t.version}`).join(", ")}`)}function fv(r,e){if(e.endsWith("+")){let n=Number.parseInt(e.substring(0,e.length-1),10);return!isNaN(n)&&n<=r}else if(e.split("-").length===2){let n=e.split("-"),t=Number.parseInt(n[0],10),o=Number.parseInt(n[1],10);return!isNaN(t)&&!isNaN(o)&&t<=r&&r<=o}else return Number.parseInt(e,10)===r}var yc=C(()=>{"use strict"});var xc=Je(Ea=>{"use strict";Ea.__esModule=!0;var dv=function(){function r(e){if(!e)throw new TypeError("Invalid argument; `value` has no value.");this.value=r.EMPTY,e&&r.isGuid(e)&&(this.value=e)}return r.isGuid=function(e){var n=e.toString();return e&&(e instanceof r||r.validator.test(n))},r.create=function(){return new r([r.gen(2),r.gen(1),r.gen(1),r.gen(1),r.gen(3)].join("-"))},r.createEmpty=function(){return new r("emptyguid")},r.parse=function(e){return new r(e)},r.raw=function(){return[r.gen(2),r.gen(1),r.gen(1),r.gen(1),r.gen(3)].join("-")},r.gen=function(e){for(var n="",t=0;t>>=0,(o=0<=r&&r<256)&&(t=Tc[r],t)?t:(n=ke(r,0,!0),o&&(Tc[r]=n),n)):(r|=0,(o=-128<=r&&r<128)&&(t=wc[r],t)?t:(n=ke(r,r<0?-1:0,!1),o&&(wc[r]=n),n))}function Et(r,e){if(isNaN(r))return e?fr:Nt;if(e){if(r<0)return fr;if(r>=$c)return Oc}else{if(r<=-Ic)return xt;if(r+1>=Ic)return Pc}return r<0?Et(-r,e).neg():ke(r%fn|0,r/fn|0,e)}function ke(r,e,n){return new Me(r,e,n)}function ka(r,e,n){if(r.length===0)throw Error("empty string");if(typeof e=="number"?(n=e,e=!1):e=!!e,r==="NaN"||r==="Infinity"||r==="+Infinity"||r==="-Infinity")return e?fr:Nt;if(n=n||10,n<2||360)throw Error("interior hyphen");if(t===0)return ka(r.substring(1),e,n).neg();for(var o=Et(Co(n,8)),i=Nt,s=0;s{Ot=null;try{Ot=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch{}Me.prototype.__isLong__;Object.defineProperty(Me.prototype,"__isLong__",{value:!0});Me.isLong=dt;wc={},Tc={};Me.fromInt=Lr;Me.fromNumber=Et;Me.fromBits=ke;Co=Math.pow;Me.fromString=ka;Me.fromValue=zt;_c=65536,pv=1<<24,fn=_c*_c,$c=fn*fn,Ic=$c/2,Sc=Lr(pv),Nt=Lr(0);Me.ZERO=Nt;fr=Lr(0,!0);Me.UZERO=fr;cn=Lr(1);Me.ONE=cn;Ac=Lr(1,!0);Me.UONE=Ac;Ca=Lr(-1);Me.NEG_ONE=Ca;Pc=ke(-1,2147483647,!1);Me.MAX_VALUE=Pc;Oc=ke(-1,-1,!0);Me.MAX_UNSIGNED_VALUE=Oc;xt=ke(0,-2147483648,!1);Me.MIN_VALUE=xt;U=Me.prototype;U.toInt=function(){return this.unsigned?this.low>>>0:this.low};U.toNumber=function(){return this.unsigned?(this.high>>>0)*fn+(this.low>>>0):this.high*fn+(this.low>>>0)};U.toString=function(e){if(e=e||10,e<2||36>>0,f=l.toString(e);if(s=u,s.isZero())return f+a;for(;f.length<6;)f="0"+f;a=""+f+a}};U.getHighBits=function(){return this.high};U.getHighBitsUnsigned=function(){return this.high>>>0};U.getLowBits=function(){return this.low};U.getLowBitsUnsigned=function(){return this.low>>>0};U.getNumBitsAbs=function(){if(this.isNegative())return this.eq(xt)?64:this.neg().getNumBitsAbs();for(var e=this.high!=0?this.high:this.low,n=31;n>0&&!(e&1<=0};U.isOdd=function(){return(this.low&1)===1};U.isEven=function(){return(this.low&1)===0};U.equals=function(e){return dt(e)||(e=zt(e)),this.unsigned!==e.unsigned&&this.high>>>31===1&&e.high>>>31===1?!1:this.high===e.high&&this.low===e.low};U.eq=U.equals;U.notEquals=function(e){return!this.eq(e)};U.neq=U.notEquals;U.ne=U.notEquals;U.lessThan=function(e){return this.comp(e)<0};U.lt=U.lessThan;U.lessThanOrEqual=function(e){return this.comp(e)<=0};U.lte=U.lessThanOrEqual;U.le=U.lessThanOrEqual;U.greaterThan=function(e){return this.comp(e)>0};U.gt=U.greaterThan;U.greaterThanOrEqual=function(e){return this.comp(e)>=0};U.gte=U.greaterThanOrEqual;U.ge=U.greaterThanOrEqual;U.compare=function(e){if(dt(e)||(e=zt(e)),this.eq(e))return 0;var n=this.isNegative(),t=e.isNegative();return n&&!t?-1:!n&&t?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1};U.comp=U.compare;U.negate=function(){return!this.unsigned&&this.eq(xt)?xt:this.not().add(cn)};U.neg=U.negate;U.add=function(e){dt(e)||(e=zt(e));var n=this.high>>>16,t=this.high&65535,o=this.low>>>16,i=this.low&65535,s=e.high>>>16,a=e.high&65535,u=e.low>>>16,l=e.low&65535,f=0,c=0,p=0,b=0;return b+=i+l,p+=b>>>16,b&=65535,p+=o+u,c+=p>>>16,p&=65535,c+=t+a,f+=c>>>16,c&=65535,f+=n+s,f&=65535,ke(p<<16|b,f<<16|c,this.unsigned)};U.subtract=function(e){return dt(e)||(e=zt(e)),this.add(e.neg())};U.sub=U.subtract;U.multiply=function(e){if(this.isZero())return this;if(dt(e)||(e=zt(e)),Ot){var n=Ot.mul(this.low,this.high,e.low,e.high);return ke(n,Ot.get_high(),this.unsigned)}if(e.isZero())return this.unsigned?fr:Nt;if(this.eq(xt))return e.isOdd()?xt:Nt;if(e.eq(xt))return this.isOdd()?xt:Nt;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(Sc)&&e.lt(Sc))return Et(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,o=this.high&65535,i=this.low>>>16,s=this.low&65535,a=e.high>>>16,u=e.high&65535,l=e.low>>>16,f=e.low&65535,c=0,p=0,b=0,h=0;return h+=s*f,b+=h>>>16,h&=65535,b+=i*f,p+=b>>>16,b&=65535,b+=s*l,p+=b>>>16,b&=65535,p+=o*f,c+=p>>>16,p&=65535,p+=i*l,c+=p>>>16,p&=65535,p+=s*u,c+=p>>>16,p&=65535,c+=t*f+o*l+i*u+s*a,c&=65535,ke(b<<16|h,c<<16|p,this.unsigned)};U.mul=U.multiply;U.divide=function(e){if(dt(e)||(e=zt(e)),e.isZero())throw Error("division by zero");if(Ot){if(!this.unsigned&&this.high===-2147483648&&e.low===-1&&e.high===-1)return this;var n=(this.unsigned?Ot.div_u:Ot.div_s)(this.low,this.high,e.low,e.high);return ke(n,Ot.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?fr:Nt;var t,o,i;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return fr;if(e.gt(this.shru(1)))return Ac;i=fr}else{if(this.eq(xt)){if(e.eq(cn)||e.eq(Ca))return xt;if(e.eq(xt))return cn;var s=this.shr(1);return t=s.div(e).shl(1),t.eq(Nt)?e.isNegative()?cn:Ca:(o=this.sub(e.mul(t)),i=t.add(o.div(e)),i)}else if(e.eq(xt))return this.unsigned?fr:Nt;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();i=Nt}for(o=this;o.gte(e);){t=Math.max(1,Math.floor(o.toNumber()/e.toNumber()));for(var a=Math.ceil(Math.log(t)/Math.LN2),u=a<=48?1:Co(2,a-48),l=Et(t),f=l.mul(e);f.isNegative()||f.gt(o);)t-=u,l=Et(t,this.unsigned),f=l.mul(e);l.isZero()&&(l=cn),i=i.add(l),o=o.sub(f)}return i};U.div=U.divide;U.modulo=function(e){if(dt(e)||(e=zt(e)),Ot){var n=(this.unsigned?Ot.rem_u:Ot.rem_s)(this.low,this.high,e.low,e.high);return ke(n,Ot.get_high(),this.unsigned)}return this.sub(this.div(e).mul(e))};U.mod=U.modulo;U.rem=U.modulo;U.not=function(){return ke(~this.low,~this.high,this.unsigned)};U.countLeadingZeros=function(){return this.high?Math.clz32(this.high):Math.clz32(this.low)+32};U.clz=U.countLeadingZeros;U.countTrailingZeros=function(){return this.low?vc(this.low):vc(this.high)+32};U.ctz=U.countTrailingZeros;U.and=function(e){return dt(e)||(e=zt(e)),ke(this.low&e.low,this.high&e.high,this.unsigned)};U.or=function(e){return dt(e)||(e=zt(e)),ke(this.low|e.low,this.high|e.high,this.unsigned)};U.xor=function(e){return dt(e)||(e=zt(e)),ke(this.low^e.low,this.high^e.high,this.unsigned)};U.shiftLeft=function(e){return dt(e)&&(e=e.toInt()),(e&=63)===0?this:e<32?ke(this.low<>>32-e,this.unsigned):ke(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):ke(this.high>>e-32,this.high>=0?0:-1,this.unsigned)};U.shr=U.shiftRight;U.shiftRightUnsigned=function(e){return dt(e)&&(e=e.toInt()),(e&=63)===0?this:e<32?ke(this.low>>>e|this.high<<32-e,this.high>>>e,this.unsigned):e===32?ke(this.high,0,this.unsigned):ke(this.high>>>e-32,0,this.unsigned)};U.shru=U.shiftRightUnsigned;U.shr_u=U.shiftRightUnsigned;U.rotateLeft=function(e){var n;return dt(e)&&(e=e.toInt()),(e&=63)===0?this:e===32?ke(this.high,this.low,this.unsigned):e<32?(n=32-e,ke(this.low<>>n,this.high<>>n,this.unsigned)):(e-=32,n=32-e,ke(this.high<>>n,this.low<>>n,this.unsigned))};U.rotl=U.rotateLeft;U.rotateRight=function(e){var n;return dt(e)&&(e=e.toInt()),(e&=63)===0?this:e===32?ke(this.high,this.low,this.unsigned):e<32?(n=32-e,ke(this.high<>>e,this.low<>>e,this.unsigned)):(e-=32,n=32-e,ke(this.low<>>e,this.high<>>e,this.unsigned))};U.rotr=U.rotateRight;U.toSigned=function(){return this.unsigned?ke(this.low,this.high,!1):this};U.toUnsigned=function(){return this.unsigned?this:ke(this.low,this.high,!0)};U.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()};U.toBytesLE=function(){var e=this.high,n=this.low;return[n&255,n>>>8&255,n>>>16&255,n>>>24,e&255,e>>>8&255,e>>>16&255,e>>>24]};U.toBytesBE=function(){var e=this.high,n=this.low;return[e>>>24,e>>>16&255,e>>>8&255,e&255,n>>>24,n>>>16&255,n>>>8&255,n&255]};Me.fromBytes=function(e,n,t){return t?Me.fromBytesLE(e,n):Me.fromBytesBE(e,n)};Me.fromBytesLE=function(e,n){return new Me(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,n)};Me.fromBytesBE=function(e,n){return new Me(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],n)};dr=Me});var k,ko=C(()=>{k={};k.Offset;k.Table;k.SIZEOF_SHORT=2;k.SIZEOF_INT=4;k.FILE_IDENTIFIER_LENGTH=4;k.SIZE_PREFIX_LENGTH=4;k.Encoding={UTF8_BYTES:1,UTF16_STRING:2};k.int32=new Int32Array(2);k.float32=new Float32Array(k.int32.buffer);k.float64=new Float64Array(k.int32.buffer);k.isLittleEndian=new Uint16Array(new Uint8Array([1,0]).buffer)[0]===1;k.Long=function(r,e){this.low=r|0,this.high=e|0};k.Long.create=function(r,e){return r==0&&e==0?k.Long.ZERO:new k.Long(r,e)};k.Long.prototype.toFloat64=function(){return(this.low>>>0)+this.high*4294967296};k.Long.prototype.equals=function(r){return this.low==r.low&&this.high==r.high};k.Long.ZERO=new k.Long(0,0);k.Builder=function(r){if(r)var e=r;else var e=1024;this.bb=k.ByteBuffer.allocate(e),this.space=e,this.minalign=1,this.vtable=null,this.vtable_in_use=0,this.isNested=!1,this.object_start=0,this.vtables=[],this.vector_num_elems=0,this.force_defaults=!1};k.Builder.prototype.clear=function(){this.bb.clear(),this.space=this.bb.capacity(),this.minalign=1,this.vtable=null,this.vtable_in_use=0,this.isNested=!1,this.object_start=0,this.vtables=[],this.vector_num_elems=0,this.force_defaults=!1};k.Builder.prototype.forceDefaults=function(r){this.force_defaults=r};k.Builder.prototype.dataBuffer=function(){return this.bb};k.Builder.prototype.asUint8Array=function(){return this.bb.bytes().subarray(this.bb.position(),this.bb.position()+this.offset())};k.Builder.prototype.prep=function(r,e){r>this.minalign&&(this.minalign=r);for(var n=~(this.bb.capacity()-this.space+e)+1&r-1;this.space=0&&this.vtable[e]==0;e--);for(var n=e+1;e>=0;e--)this.addInt16(this.vtable[e]!=0?r-this.vtable[e]:0);var t=2;this.addInt16(r-this.object_start);var o=(n+t)*k.SIZEOF_SHORT;this.addInt16(o);var i=0,s=this.space;e:for(e=0;e=0;i--)this.writeInt8(o.charCodeAt(i))}this.prep(this.minalign,k.SIZEOF_INT+t),this.addOffset(r),t&&this.addInt32(this.bb.capacity()-this.space),this.bb.setPosition(this.space)};k.Builder.prototype.finishSizePrefixed=function(r,e){this.finish(r,e,!0)};k.Builder.prototype.requiredField=function(r,e){var n=this.bb.capacity()-r,t=n-this.bb.readInt32(n),o=this.bb.readInt16(t+e)!=0;if(!o)throw new Error("FlatBuffers: field "+e+" must be set")};k.Builder.prototype.startVector=function(r,e,n){this.notNested(),this.vector_num_elems=e,this.prep(k.SIZEOF_INT,r*e),this.prep(n,r*e)};k.Builder.prototype.endVector=function(){return this.writeInt32(this.vector_num_elems),this.offset()};k.Builder.prototype.createString=function(r){if(r instanceof Uint8Array)var e=r;else for(var e=[],n=0;n=56320)t=o;else{var i=r.charCodeAt(n++);t=(o<<10)+i+(65536-56623104-56320)}t<128?e.push(t):(t<2048?e.push(t>>6&31|192):(t<65536?e.push(t>>12&15|224):e.push(t>>18&7|240,t>>12&63|128),e.push(t>>6&63|128)),e.push(t&63|128))}this.addInt8(0),this.startVector(1,e.length,1),this.bb.setPosition(this.space-=e.length);for(var n=0,s=this.space,a=this.bb.bytes();n>24};k.ByteBuffer.prototype.readUint8=function(r){return this.bytes_[r]};k.ByteBuffer.prototype.readInt16=function(r){return this.readUint16(r)<<16>>16};k.ByteBuffer.prototype.readUint16=function(r){return this.bytes_[r]|this.bytes_[r+1]<<8};k.ByteBuffer.prototype.readInt32=function(r){return this.bytes_[r]|this.bytes_[r+1]<<8|this.bytes_[r+2]<<16|this.bytes_[r+3]<<24};k.ByteBuffer.prototype.readUint32=function(r){return this.readInt32(r)>>>0};k.ByteBuffer.prototype.readInt64=function(r){return new k.Long(this.readInt32(r),this.readInt32(r+4))};k.ByteBuffer.prototype.readUint64=function(r){return new k.Long(this.readUint32(r),this.readUint32(r+4))};k.ByteBuffer.prototype.readFloat32=function(r){return k.int32[0]=this.readInt32(r),k.float32[0]};k.ByteBuffer.prototype.readFloat64=function(r){return k.int32[k.isLittleEndian?0:1]=this.readInt32(r),k.int32[k.isLittleEndian?1:0]=this.readInt32(r+4),k.float64[0]};k.ByteBuffer.prototype.writeInt8=function(r,e){this.bytes_[r]=e};k.ByteBuffer.prototype.writeUint8=function(r,e){this.bytes_[r]=e};k.ByteBuffer.prototype.writeInt16=function(r,e){this.bytes_[r]=e,this.bytes_[r+1]=e>>8};k.ByteBuffer.prototype.writeUint16=function(r,e){this.bytes_[r]=e,this.bytes_[r+1]=e>>8};k.ByteBuffer.prototype.writeInt32=function(r,e){this.bytes_[r]=e,this.bytes_[r+1]=e>>8,this.bytes_[r+2]=e>>16,this.bytes_[r+3]=e>>24};k.ByteBuffer.prototype.writeUint32=function(r,e){this.bytes_[r]=e,this.bytes_[r+1]=e>>8,this.bytes_[r+2]=e>>16,this.bytes_[r+3]=e>>24};k.ByteBuffer.prototype.writeInt64=function(r,e){this.writeInt32(r,e.low),this.writeInt32(r+4,e.high)};k.ByteBuffer.prototype.writeUint64=function(r,e){this.writeUint32(r,e.low),this.writeUint32(r+4,e.high)};k.ByteBuffer.prototype.writeFloat32=function(r,e){k.float32[0]=e,this.writeInt32(r,k.int32[0])};k.ByteBuffer.prototype.writeFloat64=function(r,e){k.float64[0]=e,this.writeInt32(r,k.int32[k.isLittleEndian?0:1]),this.writeInt32(r+4,k.int32[k.isLittleEndian?1:0])};k.ByteBuffer.prototype.getBufferIdentifier=function(){if(this.bytes_.length>10)+55296,(i&1024-1)+56320))}return t};k.ByteBuffer.prototype.__indirect=function(r){return r+this.readInt32(r)};k.ByteBuffer.prototype.__vector=function(r){return r+this.readInt32(r)+k.SIZEOF_INT};k.ByteBuffer.prototype.__vector_len=function(r){return this.readInt32(r+this.readInt32(r))};k.ByteBuffer.prototype.__has_identifier=function(r){if(r.length!=k.FILE_IDENTIFIER_LENGTH)throw new Error("FlatBuffers: file identifier must be length "+k.FILE_IDENTIFIER_LENGTH);for(var e=0;e{"use strict";ko();(e=>{let r;(t=>{let n;(i=>{let o;(S=>(S[S.UNDEFINED=0]="UNDEFINED",S[S.FLOAT=1]="FLOAT",S[S.INT=2]="INT",S[S.STRING=3]="STRING",S[S.TENSOR=4]="TENSOR",S[S.GRAPH=5]="GRAPH",S[S.FLOATS=6]="FLOATS",S[S.INTS=7]="INTS",S[S.STRINGS=8]="STRINGS",S[S.TENSORS=9]="TENSORS",S[S.GRAPHS=10]="GRAPHS",S[S.SPARSE_TENSOR=11]="SPARSE_TENSOR",S[S.SPARSE_TENSORS=12]="SPARSE_TENSORS"))(o=i.AttributeType||={})})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{let o;(l=>(l[l.UNKNOWN=0]="UNKNOWN",l[l.VALUE=1]="VALUE",l[l.PARAM=2]="PARAM"))(o=i.DimensionValueType||={})})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{let o;(F=>(F[F.UNDEFINED=0]="UNDEFINED",F[F.FLOAT=1]="FLOAT",F[F.UINT8=2]="UINT8",F[F.INT8=3]="INT8",F[F.UINT16=4]="UINT16",F[F.INT16=5]="INT16",F[F.INT32=6]="INT32",F[F.INT64=7]="INT64",F[F.STRING=8]="STRING",F[F.BOOL=9]="BOOL",F[F.FLOAT16=10]="FLOAT16",F[F.DOUBLE=11]="DOUBLE",F[F.UINT32=12]="UINT32",F[F.UINT64=13]="UINT64",F[F.COMPLEX64=14]="COMPLEX64",F[F.COMPLEX128=15]="COMPLEX128",F[F.BFLOAT16=16]="BFLOAT16",F[F.FLOAT8E4M3FN=17]="FLOAT8E4M3FN",F[F.FLOAT8E4M3FNUZ=18]="FLOAT8E4M3FNUZ",F[F.FLOAT8E5M2=19]="FLOAT8E5M2",F[F.FLOAT8E5M2FNUZ=20]="FLOAT8E5M2FNUZ"))(o=i.TensorDataType||={})})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{let o;(u=>(u[u.Primitive=0]="Primitive",u[u.Fused=1]="Fused"))(o=i.NodeType||={})})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{let o;(f=>(f[f.NONE=0]="NONE",f[f.tensor_type=1]="tensor_type",f[f.sequence_type=2]="sequence_type",f[f.map_type=3]="map_type"))(o=i.TypeInfoValue||={})})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsShape(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsShape(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}dim(a,u){let l=this.bb.__offset(this.bb_pos,4);return l?(u||new e.experimental.fbs.Dimension).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}dimLength(){let a=this.bb.__offset(this.bb_pos,4);return a?this.bb.__vector_len(this.bb_pos+a):0}static startShape(a){a.startObject(1)}static addDim(a,u){a.addFieldOffset(0,u,0)}static createDimVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startDimVector(a,u){a.startVector(4,u,4)}static endShape(a){return a.endObject()}static createShape(a,u){return o.startShape(a),o.addDim(a,u),o.endShape(a)}}i.Shape=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsDimension(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsDimension(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}value(a){let u=this.bb.__offset(this.bb_pos,4);return u?(a||new e.experimental.fbs.DimensionValue).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}denotation(a){let u=this.bb.__offset(this.bb_pos,6);return u?this.bb.__string(this.bb_pos+u,a):null}static startDimension(a){a.startObject(2)}static addValue(a,u){a.addFieldOffset(0,u,0)}static addDenotation(a,u){a.addFieldOffset(1,u,0)}static endDimension(a){return a.endObject()}static createDimension(a,u,l){return o.startDimension(a),o.addValue(a,u),o.addDenotation(a,l),o.endDimension(a)}}i.Dimension=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsDimensionValue(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsDimensionValue(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}dimType(){let a=this.bb.__offset(this.bb_pos,4);return a?this.bb.readInt8(this.bb_pos+a):0}dimValue(){let a=this.bb.__offset(this.bb_pos,6);return a?this.bb.readInt64(this.bb_pos+a):this.bb.createLong(0,0)}dimParam(a){let u=this.bb.__offset(this.bb_pos,8);return u?this.bb.__string(this.bb_pos+u,a):null}static startDimensionValue(a){a.startObject(3)}static addDimType(a,u){a.addFieldInt8(0,u,0)}static addDimValue(a,u){a.addFieldInt64(1,u,a.createLong(0,0))}static addDimParam(a,u){a.addFieldOffset(2,u,0)}static endDimensionValue(a){return a.endObject()}static createDimensionValue(a,u,l,f){return o.startDimensionValue(a),o.addDimType(a,u),o.addDimValue(a,l),o.addDimParam(a,f),o.endDimensionValue(a)}}i.DimensionValue=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsTensorTypeAndShape(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsTensorTypeAndShape(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}elemType(){let a=this.bb.__offset(this.bb_pos,4);return a?this.bb.readInt32(this.bb_pos+a):0}shape(a){let u=this.bb.__offset(this.bb_pos,6);return u?(a||new e.experimental.fbs.Shape).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}static startTensorTypeAndShape(a){a.startObject(2)}static addElemType(a,u){a.addFieldInt32(0,u,0)}static addShape(a,u){a.addFieldOffset(1,u,0)}static endTensorTypeAndShape(a){return a.endObject()}static createTensorTypeAndShape(a,u,l){return o.startTensorTypeAndShape(a),o.addElemType(a,u),o.addShape(a,l),o.endTensorTypeAndShape(a)}}i.TensorTypeAndShape=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsMapType(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsMapType(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}keyType(){let a=this.bb.__offset(this.bb_pos,4);return a?this.bb.readInt32(this.bb_pos+a):0}valueType(a){let u=this.bb.__offset(this.bb_pos,6);return u?(a||new e.experimental.fbs.TypeInfo).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}static startMapType(a){a.startObject(2)}static addKeyType(a,u){a.addFieldInt32(0,u,0)}static addValueType(a,u){a.addFieldOffset(1,u,0)}static endMapType(a){return a.endObject()}static createMapType(a,u,l){return o.startMapType(a),o.addKeyType(a,u),o.addValueType(a,l),o.endMapType(a)}}i.MapType=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsSequenceType(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsSequenceType(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}elemType(a){let u=this.bb.__offset(this.bb_pos,4);return u?(a||new e.experimental.fbs.TypeInfo).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}static startSequenceType(a){a.startObject(1)}static addElemType(a,u){a.addFieldOffset(0,u,0)}static endSequenceType(a){return a.endObject()}static createSequenceType(a,u){return o.startSequenceType(a),o.addElemType(a,u),o.endSequenceType(a)}}i.SequenceType=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}nodeIndex(){return this.bb.readUint32(this.bb_pos)}srcArgIndex(){return this.bb.readInt32(this.bb_pos+4)}dstArgIndex(){return this.bb.readInt32(this.bb_pos+8)}static createEdgeEnd(a,u,l,f){return a.prep(4,12),a.writeInt32(f),a.writeInt32(l),a.writeInt32(u),a.offset()}}i.EdgeEnd=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsNodeEdge(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsNodeEdge(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}nodeIndex(){let a=this.bb.__offset(this.bb_pos,4);return a?this.bb.readUint32(this.bb_pos+a):0}inputEdges(a,u){let l=this.bb.__offset(this.bb_pos,6);return l?(u||new e.experimental.fbs.EdgeEnd).__init(this.bb.__vector(this.bb_pos+l)+a*12,this.bb):null}inputEdgesLength(){let a=this.bb.__offset(this.bb_pos,6);return a?this.bb.__vector_len(this.bb_pos+a):0}outputEdges(a,u){let l=this.bb.__offset(this.bb_pos,8);return l?(u||new e.experimental.fbs.EdgeEnd).__init(this.bb.__vector(this.bb_pos+l)+a*12,this.bb):null}outputEdgesLength(){let a=this.bb.__offset(this.bb_pos,8);return a?this.bb.__vector_len(this.bb_pos+a):0}static startNodeEdge(a){a.startObject(3)}static addNodeIndex(a,u){a.addFieldInt32(0,u,0)}static addInputEdges(a,u){a.addFieldOffset(1,u,0)}static startInputEdgesVector(a,u){a.startVector(12,u,4)}static addOutputEdges(a,u){a.addFieldOffset(2,u,0)}static startOutputEdgesVector(a,u){a.startVector(12,u,4)}static endNodeEdge(a){return a.endObject()}static createNodeEdge(a,u,l,f){return o.startNodeEdge(a),o.addNodeIndex(a,u),o.addInputEdges(a,l),o.addOutputEdges(a,f),o.endNodeEdge(a)}}i.NodeEdge=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsNode(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsNode(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}name(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.__string(this.bb_pos+u,a):null}docString(a){let u=this.bb.__offset(this.bb_pos,6);return u?this.bb.__string(this.bb_pos+u,a):null}domain(a){let u=this.bb.__offset(this.bb_pos,8);return u?this.bb.__string(this.bb_pos+u,a):null}sinceVersion(){let a=this.bb.__offset(this.bb_pos,10);return a?this.bb.readInt32(this.bb_pos+a):0}index(){let a=this.bb.__offset(this.bb_pos,12);return a?this.bb.readUint32(this.bb_pos+a):0}opType(a){let u=this.bb.__offset(this.bb_pos,14);return u?this.bb.__string(this.bb_pos+u,a):null}type(){let a=this.bb.__offset(this.bb_pos,16);return a?this.bb.readInt32(this.bb_pos+a):0}executionProviderType(a){let u=this.bb.__offset(this.bb_pos,18);return u?this.bb.__string(this.bb_pos+u,a):null}inputs(a,u){let l=this.bb.__offset(this.bb_pos,20);return l?this.bb.__string(this.bb.__vector(this.bb_pos+l)+a*4,u):null}inputsLength(){let a=this.bb.__offset(this.bb_pos,20);return a?this.bb.__vector_len(this.bb_pos+a):0}outputs(a,u){let l=this.bb.__offset(this.bb_pos,22);return l?this.bb.__string(this.bb.__vector(this.bb_pos+l)+a*4,u):null}outputsLength(){let a=this.bb.__offset(this.bb_pos,22);return a?this.bb.__vector_len(this.bb_pos+a):0}attributes(a,u){let l=this.bb.__offset(this.bb_pos,24);return l?(u||new e.experimental.fbs.Attribute).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}attributesLength(){let a=this.bb.__offset(this.bb_pos,24);return a?this.bb.__vector_len(this.bb_pos+a):0}inputArgCounts(a){let u=this.bb.__offset(this.bb_pos,26);return u?this.bb.readInt32(this.bb.__vector(this.bb_pos+u)+a*4):0}inputArgCountsLength(){let a=this.bb.__offset(this.bb_pos,26);return a?this.bb.__vector_len(this.bb_pos+a):0}inputArgCountsArray(){let a=this.bb.__offset(this.bb_pos,26);return a?new Int32Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+a),this.bb.__vector_len(this.bb_pos+a)):null}implicitInputs(a,u){let l=this.bb.__offset(this.bb_pos,28);return l?this.bb.__string(this.bb.__vector(this.bb_pos+l)+a*4,u):null}implicitInputsLength(){let a=this.bb.__offset(this.bb_pos,28);return a?this.bb.__vector_len(this.bb_pos+a):0}static startNode(a){a.startObject(13)}static addName(a,u){a.addFieldOffset(0,u,0)}static addDocString(a,u){a.addFieldOffset(1,u,0)}static addDomain(a,u){a.addFieldOffset(2,u,0)}static addSinceVersion(a,u){a.addFieldInt32(3,u,0)}static addIndex(a,u){a.addFieldInt32(4,u,0)}static addOpType(a,u){a.addFieldOffset(5,u,0)}static addType(a,u){a.addFieldInt32(6,u,0)}static addExecutionProviderType(a,u){a.addFieldOffset(7,u,0)}static addInputs(a,u){a.addFieldOffset(8,u,0)}static createInputsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startInputsVector(a,u){a.startVector(4,u,4)}static addOutputs(a,u){a.addFieldOffset(9,u,0)}static createOutputsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startOutputsVector(a,u){a.startVector(4,u,4)}static addAttributes(a,u){a.addFieldOffset(10,u,0)}static createAttributesVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startAttributesVector(a,u){a.startVector(4,u,4)}static addInputArgCounts(a,u){a.addFieldOffset(11,u,0)}static createInputArgCountsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addInt32(u[l]);return a.endVector()}static startInputArgCountsVector(a,u){a.startVector(4,u,4)}static addImplicitInputs(a,u){a.addFieldOffset(12,u,0)}static createImplicitInputsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startImplicitInputsVector(a,u){a.startVector(4,u,4)}static endNode(a){return a.endObject()}static createNode(a,u,l,f,c,p,b,h,g,T,w,v,S,$){return o.startNode(a),o.addName(a,u),o.addDocString(a,l),o.addDomain(a,f),o.addSinceVersion(a,c),o.addIndex(a,p),o.addOpType(a,b),o.addType(a,h),o.addExecutionProviderType(a,g),o.addInputs(a,T),o.addOutputs(a,w),o.addAttributes(a,v),o.addInputArgCounts(a,S),o.addImplicitInputs(a,$),o.endNode(a)}}i.Node=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsValueInfo(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsValueInfo(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}name(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.__string(this.bb_pos+u,a):null}docString(a){let u=this.bb.__offset(this.bb_pos,6);return u?this.bb.__string(this.bb_pos+u,a):null}type(a){let u=this.bb.__offset(this.bb_pos,8);return u?(a||new e.experimental.fbs.TypeInfo).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}static startValueInfo(a){a.startObject(3)}static addName(a,u){a.addFieldOffset(0,u,0)}static addDocString(a,u){a.addFieldOffset(1,u,0)}static addType(a,u){a.addFieldOffset(2,u,0)}static endValueInfo(a){return a.endObject()}static createValueInfo(a,u,l,f){return o.startValueInfo(a),o.addName(a,u),o.addDocString(a,l),o.addType(a,f),o.endValueInfo(a)}}i.ValueInfo=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsTypeInfo(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsTypeInfo(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}denotation(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.__string(this.bb_pos+u,a):null}valueType(){let a=this.bb.__offset(this.bb_pos,6);return a?this.bb.readUint8(this.bb_pos+a):0}value(a){let u=this.bb.__offset(this.bb_pos,8);return u?this.bb.__union(a,this.bb_pos+u):null}static startTypeInfo(a){a.startObject(3)}static addDenotation(a,u){a.addFieldOffset(0,u,0)}static addValueType(a,u){a.addFieldInt8(1,u,0)}static addValue(a,u){a.addFieldOffset(2,u,0)}static endTypeInfo(a){return a.endObject()}static createTypeInfo(a,u,l,f){return o.startTypeInfo(a),o.addDenotation(a,u),o.addValueType(a,l),o.addValue(a,f),o.endTypeInfo(a)}}i.TypeInfo=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsOperatorSetId(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsOperatorSetId(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}domain(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.__string(this.bb_pos+u,a):null}version(){let a=this.bb.__offset(this.bb_pos,6);return a?this.bb.readInt64(this.bb_pos+a):this.bb.createLong(0,0)}static startOperatorSetId(a){a.startObject(2)}static addDomain(a,u){a.addFieldOffset(0,u,0)}static addVersion(a,u){a.addFieldInt64(1,u,a.createLong(0,0))}static endOperatorSetId(a){return a.endObject()}static createOperatorSetId(a,u,l){return o.startOperatorSetId(a),o.addDomain(a,u),o.addVersion(a,l),o.endOperatorSetId(a)}}i.OperatorSetId=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsTensor(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsTensor(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}name(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.__string(this.bb_pos+u,a):null}docString(a){let u=this.bb.__offset(this.bb_pos,6);return u?this.bb.__string(this.bb_pos+u,a):null}dims(a){let u=this.bb.__offset(this.bb_pos,8);return u?this.bb.readInt64(this.bb.__vector(this.bb_pos+u)+a*8):this.bb.createLong(0,0)}dimsLength(){let a=this.bb.__offset(this.bb_pos,8);return a?this.bb.__vector_len(this.bb_pos+a):0}dataType(){let a=this.bb.__offset(this.bb_pos,10);return a?this.bb.readInt32(this.bb_pos+a):0}rawData(a){let u=this.bb.__offset(this.bb_pos,12);return u?this.bb.readUint8(this.bb.__vector(this.bb_pos+u)+a):0}rawDataLength(){let a=this.bb.__offset(this.bb_pos,12);return a?this.bb.__vector_len(this.bb_pos+a):0}rawDataArray(){let a=this.bb.__offset(this.bb_pos,12);return a?new Uint8Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+a),this.bb.__vector_len(this.bb_pos+a)):null}stringData(a,u){let l=this.bb.__offset(this.bb_pos,14);return l?this.bb.__string(this.bb.__vector(this.bb_pos+l)+a*4,u):null}stringDataLength(){let a=this.bb.__offset(this.bb_pos,14);return a?this.bb.__vector_len(this.bb_pos+a):0}static startTensor(a){a.startObject(6)}static addName(a,u){a.addFieldOffset(0,u,0)}static addDocString(a,u){a.addFieldOffset(1,u,0)}static addDims(a,u){a.addFieldOffset(2,u,0)}static createDimsVector(a,u){a.startVector(8,u.length,8);for(let l=u.length-1;l>=0;l--)a.addInt64(u[l]);return a.endVector()}static startDimsVector(a,u){a.startVector(8,u,8)}static addDataType(a,u){a.addFieldInt32(3,u,0)}static addRawData(a,u){a.addFieldOffset(4,u,0)}static createRawDataVector(a,u){a.startVector(1,u.length,1);for(let l=u.length-1;l>=0;l--)a.addInt8(u[l]);return a.endVector()}static startRawDataVector(a,u){a.startVector(1,u,1)}static addStringData(a,u){a.addFieldOffset(5,u,0)}static createStringDataVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startStringDataVector(a,u){a.startVector(4,u,4)}static endTensor(a){return a.endObject()}static createTensor(a,u,l,f,c,p,b){return o.startTensor(a),o.addName(a,u),o.addDocString(a,l),o.addDims(a,f),o.addDataType(a,c),o.addRawData(a,p),o.addStringData(a,b),o.endTensor(a)}}i.Tensor=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsSparseTensor(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsSparseTensor(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}values(a){let u=this.bb.__offset(this.bb_pos,4);return u?(a||new e.experimental.fbs.Tensor).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}indices(a){let u=this.bb.__offset(this.bb_pos,6);return u?(a||new e.experimental.fbs.Tensor).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}dims(a){let u=this.bb.__offset(this.bb_pos,8);return u?this.bb.readInt64(this.bb.__vector(this.bb_pos+u)+a*8):this.bb.createLong(0,0)}dimsLength(){let a=this.bb.__offset(this.bb_pos,8);return a?this.bb.__vector_len(this.bb_pos+a):0}static startSparseTensor(a){a.startObject(3)}static addValues(a,u){a.addFieldOffset(0,u,0)}static addIndices(a,u){a.addFieldOffset(1,u,0)}static addDims(a,u){a.addFieldOffset(2,u,0)}static createDimsVector(a,u){a.startVector(8,u.length,8);for(let l=u.length-1;l>=0;l--)a.addInt64(u[l]);return a.endVector()}static startDimsVector(a,u){a.startVector(8,u,8)}static endSparseTensor(a){return a.endObject()}static createSparseTensor(a,u,l,f){return o.startSparseTensor(a),o.addValues(a,u),o.addIndices(a,l),o.addDims(a,f),o.endSparseTensor(a)}}i.SparseTensor=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsAttribute(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsAttribute(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}name(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.__string(this.bb_pos+u,a):null}docString(a){let u=this.bb.__offset(this.bb_pos,6);return u?this.bb.__string(this.bb_pos+u,a):null}type(){let a=this.bb.__offset(this.bb_pos,8);return a?this.bb.readInt32(this.bb_pos+a):0}f(){let a=this.bb.__offset(this.bb_pos,10);return a?this.bb.readFloat32(this.bb_pos+a):0}i(){let a=this.bb.__offset(this.bb_pos,12);return a?this.bb.readInt64(this.bb_pos+a):this.bb.createLong(0,0)}s(a){let u=this.bb.__offset(this.bb_pos,14);return u?this.bb.__string(this.bb_pos+u,a):null}t(a){let u=this.bb.__offset(this.bb_pos,16);return u?(a||new e.experimental.fbs.Tensor).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}g(a){let u=this.bb.__offset(this.bb_pos,18);return u?(a||new e.experimental.fbs.Graph).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}floats(a){let u=this.bb.__offset(this.bb_pos,20);return u?this.bb.readFloat32(this.bb.__vector(this.bb_pos+u)+a*4):0}floatsLength(){let a=this.bb.__offset(this.bb_pos,20);return a?this.bb.__vector_len(this.bb_pos+a):0}floatsArray(){let a=this.bb.__offset(this.bb_pos,20);return a?new Float32Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+a),this.bb.__vector_len(this.bb_pos+a)):null}ints(a){let u=this.bb.__offset(this.bb_pos,22);return u?this.bb.readInt64(this.bb.__vector(this.bb_pos+u)+a*8):this.bb.createLong(0,0)}intsLength(){let a=this.bb.__offset(this.bb_pos,22);return a?this.bb.__vector_len(this.bb_pos+a):0}strings(a,u){let l=this.bb.__offset(this.bb_pos,24);return l?this.bb.__string(this.bb.__vector(this.bb_pos+l)+a*4,u):null}stringsLength(){let a=this.bb.__offset(this.bb_pos,24);return a?this.bb.__vector_len(this.bb_pos+a):0}tensors(a,u){let l=this.bb.__offset(this.bb_pos,26);return l?(u||new e.experimental.fbs.Tensor).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}tensorsLength(){let a=this.bb.__offset(this.bb_pos,26);return a?this.bb.__vector_len(this.bb_pos+a):0}graphs(a,u){let l=this.bb.__offset(this.bb_pos,28);return l?(u||new e.experimental.fbs.Graph).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}graphsLength(){let a=this.bb.__offset(this.bb_pos,28);return a?this.bb.__vector_len(this.bb_pos+a):0}static startAttribute(a){a.startObject(13)}static addName(a,u){a.addFieldOffset(0,u,0)}static addDocString(a,u){a.addFieldOffset(1,u,0)}static addType(a,u){a.addFieldInt32(2,u,0)}static addF(a,u){a.addFieldFloat32(3,u,0)}static addI(a,u){a.addFieldInt64(4,u,a.createLong(0,0))}static addS(a,u){a.addFieldOffset(5,u,0)}static addT(a,u){a.addFieldOffset(6,u,0)}static addG(a,u){a.addFieldOffset(7,u,0)}static addFloats(a,u){a.addFieldOffset(8,u,0)}static createFloatsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addFloat32(u[l]);return a.endVector()}static startFloatsVector(a,u){a.startVector(4,u,4)}static addInts(a,u){a.addFieldOffset(9,u,0)}static createIntsVector(a,u){a.startVector(8,u.length,8);for(let l=u.length-1;l>=0;l--)a.addInt64(u[l]);return a.endVector()}static startIntsVector(a,u){a.startVector(8,u,8)}static addStrings(a,u){a.addFieldOffset(10,u,0)}static createStringsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startStringsVector(a,u){a.startVector(4,u,4)}static addTensors(a,u){a.addFieldOffset(11,u,0)}static createTensorsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startTensorsVector(a,u){a.startVector(4,u,4)}static addGraphs(a,u){a.addFieldOffset(12,u,0)}static createGraphsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startGraphsVector(a,u){a.startVector(4,u,4)}static endAttribute(a){return a.endObject()}static createAttribute(a,u,l,f,c,p,b,h,g,T,w,v,S,$){return o.startAttribute(a),o.addName(a,u),o.addDocString(a,l),o.addType(a,f),o.addF(a,c),o.addI(a,p),o.addS(a,b),o.addT(a,h),o.addG(a,g),o.addFloats(a,T),o.addInts(a,w),o.addStrings(a,v),o.addTensors(a,S),o.addGraphs(a,$),o.endAttribute(a)}}i.Attribute=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsGraph(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsGraph(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}initializers(a,u){let l=this.bb.__offset(this.bb_pos,4);return l?(u||new e.experimental.fbs.Tensor).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}initializersLength(){let a=this.bb.__offset(this.bb_pos,4);return a?this.bb.__vector_len(this.bb_pos+a):0}nodeArgs(a,u){let l=this.bb.__offset(this.bb_pos,6);return l?(u||new e.experimental.fbs.ValueInfo).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}nodeArgsLength(){let a=this.bb.__offset(this.bb_pos,6);return a?this.bb.__vector_len(this.bb_pos+a):0}nodes(a,u){let l=this.bb.__offset(this.bb_pos,8);return l?(u||new e.experimental.fbs.Node).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}nodesLength(){let a=this.bb.__offset(this.bb_pos,8);return a?this.bb.__vector_len(this.bb_pos+a):0}maxNodeIndex(){let a=this.bb.__offset(this.bb_pos,10);return a?this.bb.readUint32(this.bb_pos+a):0}nodeEdges(a,u){let l=this.bb.__offset(this.bb_pos,12);return l?(u||new e.experimental.fbs.NodeEdge).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}nodeEdgesLength(){let a=this.bb.__offset(this.bb_pos,12);return a?this.bb.__vector_len(this.bb_pos+a):0}inputs(a,u){let l=this.bb.__offset(this.bb_pos,14);return l?this.bb.__string(this.bb.__vector(this.bb_pos+l)+a*4,u):null}inputsLength(){let a=this.bb.__offset(this.bb_pos,14);return a?this.bb.__vector_len(this.bb_pos+a):0}outputs(a,u){let l=this.bb.__offset(this.bb_pos,16);return l?this.bb.__string(this.bb.__vector(this.bb_pos+l)+a*4,u):null}outputsLength(){let a=this.bb.__offset(this.bb_pos,16);return a?this.bb.__vector_len(this.bb_pos+a):0}sparseInitializers(a,u){let l=this.bb.__offset(this.bb_pos,18);return l?(u||new e.experimental.fbs.SparseTensor).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}sparseInitializersLength(){let a=this.bb.__offset(this.bb_pos,18);return a?this.bb.__vector_len(this.bb_pos+a):0}static startGraph(a){a.startObject(8)}static addInitializers(a,u){a.addFieldOffset(0,u,0)}static createInitializersVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startInitializersVector(a,u){a.startVector(4,u,4)}static addNodeArgs(a,u){a.addFieldOffset(1,u,0)}static createNodeArgsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startNodeArgsVector(a,u){a.startVector(4,u,4)}static addNodes(a,u){a.addFieldOffset(2,u,0)}static createNodesVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startNodesVector(a,u){a.startVector(4,u,4)}static addMaxNodeIndex(a,u){a.addFieldInt32(3,u,0)}static addNodeEdges(a,u){a.addFieldOffset(4,u,0)}static createNodeEdgesVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startNodeEdgesVector(a,u){a.startVector(4,u,4)}static addInputs(a,u){a.addFieldOffset(5,u,0)}static createInputsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startInputsVector(a,u){a.startVector(4,u,4)}static addOutputs(a,u){a.addFieldOffset(6,u,0)}static createOutputsVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startOutputsVector(a,u){a.startVector(4,u,4)}static addSparseInitializers(a,u){a.addFieldOffset(7,u,0)}static createSparseInitializersVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startSparseInitializersVector(a,u){a.startVector(4,u,4)}static endGraph(a){return a.endObject()}static createGraph(a,u,l,f,c,p,b,h,g){return o.startGraph(a),o.addInitializers(a,u),o.addNodeArgs(a,l),o.addNodes(a,f),o.addMaxNodeIndex(a,c),o.addNodeEdges(a,p),o.addInputs(a,b),o.addOutputs(a,h),o.addSparseInitializers(a,g),o.endGraph(a)}}i.Graph=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsModel(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsModel(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}irVersion(){let a=this.bb.__offset(this.bb_pos,4);return a?this.bb.readInt64(this.bb_pos+a):this.bb.createLong(0,0)}opsetImport(a,u){let l=this.bb.__offset(this.bb_pos,6);return l?(u||new e.experimental.fbs.OperatorSetId).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}opsetImportLength(){let a=this.bb.__offset(this.bb_pos,6);return a?this.bb.__vector_len(this.bb_pos+a):0}producerName(a){let u=this.bb.__offset(this.bb_pos,8);return u?this.bb.__string(this.bb_pos+u,a):null}producerVersion(a){let u=this.bb.__offset(this.bb_pos,10);return u?this.bb.__string(this.bb_pos+u,a):null}domain(a){let u=this.bb.__offset(this.bb_pos,12);return u?this.bb.__string(this.bb_pos+u,a):null}modelVersion(){let a=this.bb.__offset(this.bb_pos,14);return a?this.bb.readInt64(this.bb_pos+a):this.bb.createLong(0,0)}docString(a){let u=this.bb.__offset(this.bb_pos,16);return u?this.bb.__string(this.bb_pos+u,a):null}graph(a){let u=this.bb.__offset(this.bb_pos,18);return u?(a||new e.experimental.fbs.Graph).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}graphDocString(a){let u=this.bb.__offset(this.bb_pos,20);return u?this.bb.__string(this.bb_pos+u,a):null}static startModel(a){a.startObject(9)}static addIrVersion(a,u){a.addFieldInt64(0,u,a.createLong(0,0))}static addOpsetImport(a,u){a.addFieldOffset(1,u,0)}static createOpsetImportVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startOpsetImportVector(a,u){a.startVector(4,u,4)}static addProducerName(a,u){a.addFieldOffset(2,u,0)}static addProducerVersion(a,u){a.addFieldOffset(3,u,0)}static addDomain(a,u){a.addFieldOffset(4,u,0)}static addModelVersion(a,u){a.addFieldInt64(5,u,a.createLong(0,0))}static addDocString(a,u){a.addFieldOffset(6,u,0)}static addGraph(a,u){a.addFieldOffset(7,u,0)}static addGraphDocString(a,u){a.addFieldOffset(8,u,0)}static endModel(a){return a.endObject()}static createModel(a,u,l,f,c,p,b,h,g,T){return o.startModel(a),o.addIrVersion(a,u),o.addOpsetImport(a,l),o.addProducerName(a,f),o.addProducerVersion(a,c),o.addDomain(a,p),o.addModelVersion(a,b),o.addDocString(a,h),o.addGraph(a,g),o.addGraphDocString(a,T),o.endModel(a)}}i.Model=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsKernelCreateInfos(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsKernelCreateInfos(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}nodeIndices(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.readUint32(this.bb.__vector(this.bb_pos+u)+a*4):0}nodeIndicesLength(){let a=this.bb.__offset(this.bb_pos,4);return a?this.bb.__vector_len(this.bb_pos+a):0}nodeIndicesArray(){let a=this.bb.__offset(this.bb_pos,4);return a?new Uint32Array(this.bb.bytes().buffer,this.bb.bytes().byteOffset+this.bb.__vector(this.bb_pos+a),this.bb.__vector_len(this.bb_pos+a)):null}kernelDefHashes(a){let u=this.bb.__offset(this.bb_pos,6);return u?this.bb.readUint64(this.bb.__vector(this.bb_pos+u)+a*8):this.bb.createLong(0,0)}kernelDefHashesLength(){let a=this.bb.__offset(this.bb_pos,6);return a?this.bb.__vector_len(this.bb_pos+a):0}static startKernelCreateInfos(a){a.startObject(2)}static addNodeIndices(a,u){a.addFieldOffset(0,u,0)}static createNodeIndicesVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addInt32(u[l]);return a.endVector()}static startNodeIndicesVector(a,u){a.startVector(4,u,4)}static addKernelDefHashes(a,u){a.addFieldOffset(1,u,0)}static createKernelDefHashesVector(a,u){a.startVector(8,u.length,8);for(let l=u.length-1;l>=0;l--)a.addInt64(u[l]);return a.endVector()}static startKernelDefHashesVector(a,u){a.startVector(8,u,8)}static endKernelCreateInfos(a){return a.endObject()}static createKernelCreateInfos(a,u,l){return o.startKernelCreateInfos(a),o.addNodeIndices(a,u),o.addKernelDefHashes(a,l),o.endKernelCreateInfos(a)}}i.KernelCreateInfos=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsSubGraphSessionState(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsSubGraphSessionState(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}graphId(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.__string(this.bb_pos+u,a):null}sessionState(a){let u=this.bb.__offset(this.bb_pos,6);return u?(a||new e.experimental.fbs.SessionState).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}static startSubGraphSessionState(a){a.startObject(2)}static addGraphId(a,u){a.addFieldOffset(0,u,0)}static addSessionState(a,u){a.addFieldOffset(1,u,0)}static endSubGraphSessionState(a){let u=a.endObject();return a.requiredField(u,4),u}static createSubGraphSessionState(a,u,l){return o.startSubGraphSessionState(a),o.addGraphId(a,u),o.addSessionState(a,l),o.endSubGraphSessionState(a)}}i.SubGraphSessionState=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsSessionState(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsSessionState(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}kernels(a){let u=this.bb.__offset(this.bb_pos,4);return u?(a||new e.experimental.fbs.KernelCreateInfos).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}subGraphSessionStates(a,u){let l=this.bb.__offset(this.bb_pos,6);return l?(u||new e.experimental.fbs.SubGraphSessionState).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+l)+a*4),this.bb):null}subGraphSessionStatesLength(){let a=this.bb.__offset(this.bb_pos,6);return a?this.bb.__vector_len(this.bb_pos+a):0}static startSessionState(a){a.startObject(2)}static addKernels(a,u){a.addFieldOffset(0,u,0)}static addSubGraphSessionStates(a,u){a.addFieldOffset(1,u,0)}static createSubGraphSessionStatesVector(a,u){a.startVector(4,u.length,4);for(let l=u.length-1;l>=0;l--)a.addOffset(u[l]);return a.endVector()}static startSubGraphSessionStatesVector(a,u){a.startVector(4,u,4)}static endSessionState(a){return a.endObject()}static createSessionState(a,u,l){return o.startSessionState(a),o.addKernels(a,u),o.addSubGraphSessionStates(a,l),o.endSessionState(a)}}i.SessionState=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={});(e=>{let r;(t=>{let n;(i=>{class o{constructor(){this.bb=null;this.bb_pos=0}__init(a,u){return this.bb_pos=a,this.bb=u,this}static getRootAsInferenceSession(a,u){return(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static getSizePrefixedRootAsInferenceSession(a,u){return a.setPosition(a.position()+k.SIZE_PREFIX_LENGTH),(u||new o).__init(a.readInt32(a.position())+a.position(),a)}static bufferHasIdentifier(a){return a.__has_identifier("ORTM")}ortVersion(a){let u=this.bb.__offset(this.bb_pos,4);return u?this.bb.__string(this.bb_pos+u,a):null}model(a){let u=this.bb.__offset(this.bb_pos,6);return u?(a||new e.experimental.fbs.Model).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}sessionState(a){let u=this.bb.__offset(this.bb_pos,8);return u?(a||new e.experimental.fbs.SessionState).__init(this.bb.__indirect(this.bb_pos+u),this.bb):null}static startInferenceSession(a){a.startObject(3)}static addOrtVersion(a,u){a.addFieldOffset(0,u,0)}static addModel(a,u){a.addFieldOffset(1,u,0)}static addSessionState(a,u){a.addFieldOffset(2,u,0)}static endInferenceSession(a){return a.endObject()}static finishInferenceSessionBuffer(a,u){a.finish(u,"ORTM")}static finishSizePrefixedInferenceSessionBuffer(a,u){a.finish(u,"ORTM",!0)}static createInferenceSession(a,u,l,f){return o.startInferenceSession(a),o.addOrtVersion(a,u),o.addModel(a,l),o.addSessionState(a,f),o.endInferenceSession(a)}}i.InferenceSession=o})(n=t.fbs||={})})(r=e.experimental||={})})(ee||={})});var Cc=Je((HS,Ec)=>{"use strict";Ec.exports=mv;function mv(r,e){for(var n=new Array(arguments.length-1),t=0,o=2,i=!0;o{"use strict";var Do=Bc;Do.length=function(e){var n=e.length;if(!n)return 0;for(var t=0;--n%4>1&&e.charAt(n)==="=";)++t;return Math.ceil(e.length*3)/4-t};var dn=new Array(64),Dc=new Array(123);for(Ft=0;Ft<64;)Dc[dn[Ft]=Ft<26?Ft+65:Ft<52?Ft+71:Ft<62?Ft-4:Ft-59|43]=Ft++;var Ft;Do.encode=function(e,n,t){for(var o=null,i=[],s=0,a=0,u;n>2],u=(l&3)<<4,a=1;break;case 1:i[s++]=dn[u|l>>4],u=(l&15)<<2,a=2;break;case 2:i[s++]=dn[u|l>>6],i[s++]=dn[l&63],a=0;break}s>8191&&((o||(o=[])).push(String.fromCharCode.apply(String,i)),s=0)}return a&&(i[s++]=dn[u],i[s++]=61,a===1&&(i[s++]=61)),o?(s&&o.push(String.fromCharCode.apply(String,i.slice(0,s))),o.join("")):String.fromCharCode.apply(String,i.slice(0,s))};var kc="invalid encoding";Do.decode=function(e,n,t){for(var o=t,i=0,s,a=0;a1)break;if((u=Dc[u])===void 0)throw Error(kc);switch(i){case 0:s=u,i=1;break;case 1:n[t++]=s<<2|(u&48)>>4,s=u,i=2;break;case 2:n[t++]=(s&15)<<4|(u&60)>>2,s=u,i=3;break;case 3:n[t++]=(s&3)<<6|u,i=0;break}}if(i===1)throw Error(kc);return t-o};Do.test=function(e){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(e)}});var Nc=Je((jS,Rc)=>{"use strict";Rc.exports=Bo;function Bo(){this._listeners={}}Bo.prototype.on=function(e,n,t){return(this._listeners[e]||(this._listeners[e]=[])).push({fn:n,ctx:t||this}),this};Bo.prototype.off=function(e,n){if(e===void 0)this._listeners={};else if(n===void 0)this._listeners[e]=[];else for(var t=this._listeners[e],o=0;o{"use strict";Uc.exports=zc(zc);function zc(r){return typeof Float32Array<"u"?function(){var e=new Float32Array([-0]),n=new Uint8Array(e.buffer),t=n[3]===128;function o(u,l,f){e[0]=u,l[f]=n[0],l[f+1]=n[1],l[f+2]=n[2],l[f+3]=n[3]}function i(u,l,f){e[0]=u,l[f]=n[3],l[f+1]=n[2],l[f+2]=n[1],l[f+3]=n[0]}r.writeFloatLE=t?o:i,r.writeFloatBE=t?i:o;function s(u,l){return n[0]=u[l],n[1]=u[l+1],n[2]=u[l+2],n[3]=u[l+3],e[0]}function a(u,l){return n[3]=u[l],n[2]=u[l+1],n[1]=u[l+2],n[0]=u[l+3],e[0]}r.readFloatLE=t?s:a,r.readFloatBE=t?a:s}():function(){function e(t,o,i,s){var a=o<0?1:0;if(a&&(o=-o),o===0)t(1/o>0?0:2147483648,i,s);else if(isNaN(o))t(2143289344,i,s);else if(o>34028234663852886e22)t((a<<31|2139095040)>>>0,i,s);else if(o<11754943508222875e-54)t((a<<31|Math.round(o/1401298464324817e-60))>>>0,i,s);else{var u=Math.floor(Math.log(o)/Math.LN2),l=Math.round(o*Math.pow(2,-u)*8388608)&8388607;t((a<<31|u+127<<23|l)>>>0,i,s)}}r.writeFloatLE=e.bind(null,Fc),r.writeFloatBE=e.bind(null,Mc);function n(t,o,i){var s=t(o,i),a=(s>>31)*2+1,u=s>>>23&255,l=s&8388607;return u===255?l?NaN:a*(1/0):u===0?a*1401298464324817e-60*l:a*Math.pow(2,u-150)*(l+8388608)}r.readFloatLE=n.bind(null,Vc),r.readFloatBE=n.bind(null,Gc)}(),typeof Float64Array<"u"?function(){var e=new Float64Array([-0]),n=new Uint8Array(e.buffer),t=n[7]===128;function o(u,l,f){e[0]=u,l[f]=n[0],l[f+1]=n[1],l[f+2]=n[2],l[f+3]=n[3],l[f+4]=n[4],l[f+5]=n[5],l[f+6]=n[6],l[f+7]=n[7]}function i(u,l,f){e[0]=u,l[f]=n[7],l[f+1]=n[6],l[f+2]=n[5],l[f+3]=n[4],l[f+4]=n[3],l[f+5]=n[2],l[f+6]=n[1],l[f+7]=n[0]}r.writeDoubleLE=t?o:i,r.writeDoubleBE=t?i:o;function s(u,l){return n[0]=u[l],n[1]=u[l+1],n[2]=u[l+2],n[3]=u[l+3],n[4]=u[l+4],n[5]=u[l+5],n[6]=u[l+6],n[7]=u[l+7],e[0]}function a(u,l){return n[7]=u[l],n[6]=u[l+1],n[5]=u[l+2],n[4]=u[l+3],n[3]=u[l+4],n[2]=u[l+5],n[1]=u[l+6],n[0]=u[l+7],e[0]}r.readDoubleLE=t?s:a,r.readDoubleBE=t?a:s}():function(){function e(t,o,i,s,a,u){var l=s<0?1:0;if(l&&(s=-s),s===0)t(0,a,u+o),t(1/s>0?0:2147483648,a,u+i);else if(isNaN(s))t(0,a,u+o),t(2146959360,a,u+i);else if(s>17976931348623157e292)t(0,a,u+o),t((l<<31|2146435072)>>>0,a,u+i);else{var f;if(s<22250738585072014e-324)f=s/5e-324,t(f>>>0,a,u+o),t((l<<31|f/4294967296)>>>0,a,u+i);else{var c=Math.floor(Math.log(s)/Math.LN2);c===1024&&(c=1023),f=s*Math.pow(2,-c),t(f*4503599627370496>>>0,a,u+o),t((l<<31|c+1023<<20|f*1048576&1048575)>>>0,a,u+i)}}}r.writeDoubleLE=e.bind(null,Fc,0,4),r.writeDoubleBE=e.bind(null,Mc,4,0);function n(t,o,i,s,a){var u=t(s,a+o),l=t(s,a+i),f=(l>>31)*2+1,c=l>>>20&2047,p=4294967296*(l&1048575)+u;return c===2047?p?NaN:f*(1/0):c===0?f*5e-324*p:f*Math.pow(2,c-1075)*(p+4503599627370496)}r.readDoubleLE=n.bind(null,Vc,0,4),r.readDoubleBE=n.bind(null,Gc,4,0)}(),r}function Fc(r,e,n){e[n]=r&255,e[n+1]=r>>>8&255,e[n+2]=r>>>16&255,e[n+3]=r>>>24}function Mc(r,e,n){e[n]=r>>>24,e[n+1]=r>>>16&255,e[n+2]=r>>>8&255,e[n+3]=r&255}function Vc(r,e){return(r[e]|r[e+1]<<8|r[e+2]<<16|r[e+3]<<24)>>>0}function Gc(r,e){return(r[e]<<24|r[e+1]<<16|r[e+2]<<8|r[e+3])>>>0}});var Hc=Je((exports,module)=>{"use strict";module.exports=inquire;function inquire(moduleName){try{var mod=eval("quire".replace(/^/,"re"))(moduleName);if(mod&&(mod.length||Object.keys(mod).length))return mod}catch(r){}return null}});var jc=Je(qc=>{"use strict";var Ba=qc;Ba.length=function(e){for(var n=0,t=0,o=0;o191&&u<224?s[a++]=(u&31)<<6|e[n++]&63:u>239&&u<365?(u=((u&7)<<18|(e[n++]&63)<<12|(e[n++]&63)<<6|e[n++]&63)-65536,s[a++]=55296+(u>>10),s[a++]=56320+(u&1023)):s[a++]=(u&15)<<12|(e[n++]&63)<<6|e[n++]&63,a>8191&&((i||(i=[])).push(String.fromCharCode.apply(String,s)),a=0);return i?(a&&i.push(String.fromCharCode.apply(String,s.slice(0,a))),i.join("")):String.fromCharCode.apply(String,s.slice(0,a))};Ba.write=function(e,n,t){for(var o=t,i,s,a=0;a>6|192,n[t++]=i&63|128):(i&64512)===55296&&((s=e.charCodeAt(a+1))&64512)===56320?(i=65536+((i&1023)<<10)+(s&1023),++a,n[t++]=i>>18|240,n[t++]=i>>12&63|128,n[t++]=i>>6&63|128,n[t++]=i&63|128):(n[t++]=i>>12|224,n[t++]=i>>6&63|128,n[t++]=i&63|128);return t-o}});var Xc=Je((ZS,Kc)=>{"use strict";Kc.exports=hv;function hv(r,e,n){var t=n||8192,o=t>>>1,i=null,s=t;return function(u){if(u<1||u>o)return r(u);s+u>t&&(i=r(t),s=0);var l=e.call(i,s,s+=u);return s&7&&(s=(s|7)+1),l}}});var Yc=Je((YS,Zc)=>{"use strict";Zc.exports=at;var kn=_r();function at(r,e){this.lo=r>>>0,this.hi=e>>>0}var Rr=at.zero=new at(0,0);Rr.toNumber=function(){return 0};Rr.zzEncode=Rr.zzDecode=function(){return this};Rr.length=function(){return 1};var gv=at.zeroHash="\0\0\0\0\0\0\0\0";at.fromNumber=function(e){if(e===0)return Rr;var n=e<0;n&&(e=-e);var t=e>>>0,o=(e-t)/4294967296>>>0;return n&&(o=~o>>>0,t=~t>>>0,++t>4294967295&&(t=0,++o>4294967295&&(o=0))),new at(t,o)};at.from=function(e){if(typeof e=="number")return at.fromNumber(e);if(kn.isString(e))if(kn.Long)e=kn.Long.fromString(e);else return at.fromNumber(parseInt(e,10));return e.low||e.high?new at(e.low>>>0,e.high>>>0):Rr};at.prototype.toNumber=function(e){if(!e&&this.hi>>>31){var n=~this.lo+1>>>0,t=~this.hi>>>0;return n||(t=t+1>>>0),-(n+t*4294967296)}return this.lo+this.hi*4294967296};at.prototype.toLong=function(e){return kn.Long?new kn.Long(this.lo|0,this.hi|0,!!e):{low:this.lo|0,high:this.hi|0,unsigned:!!e}};var Tr=String.prototype.charCodeAt;at.fromHash=function(e){return e===gv?Rr:new at((Tr.call(e,0)|Tr.call(e,1)<<8|Tr.call(e,2)<<16|Tr.call(e,3)<<24)>>>0,(Tr.call(e,4)|Tr.call(e,5)<<8|Tr.call(e,6)<<16|Tr.call(e,7)<<24)>>>0)};at.prototype.toHash=function(){return String.fromCharCode(this.lo&255,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,this.hi&255,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)};at.prototype.zzEncode=function(){var e=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^e)>>>0,this.lo=(this.lo<<1^e)>>>0,this};at.prototype.zzDecode=function(){var e=-(this.lo&1);return this.lo=((this.lo>>>1|this.hi<<31)^e)>>>0,this.hi=(this.hi>>>1^e)>>>0,this};at.prototype.length=function(){var e=this.lo,n=(this.lo>>>28|this.hi<<4)>>>0,t=this.hi>>>24;return t===0?n===0?e<16384?e<128?1:2:e<2097152?3:4:n<16384?n<128?5:6:n<2097152?7:8:t<128?9:10}});var _r=Je(La=>{"use strict";var re=La;re.asPromise=Cc();re.base64=Lc();re.EventEmitter=Nc();re.float=Wc();re.inquire=Hc();re.utf8=jc();re.pool=Xc();re.LongBits=Yc();re.isNode=!!(typeof global<"u"&&global&&global.process&&global.process.versions&&global.process.versions.node);re.global=re.isNode&&global||typeof window<"u"&&window||typeof self<"u"&&self||La;re.emptyArray=Object.freeze?Object.freeze([]):[];re.emptyObject=Object.freeze?Object.freeze({}):{};re.isInteger=Number.isInteger||function(e){return typeof e=="number"&&isFinite(e)&&Math.floor(e)===e};re.isString=function(e){return typeof e=="string"||e instanceof String};re.isObject=function(e){return e&&typeof e=="object"};re.isset=re.isSet=function(e,n){var t=e[n];return t!=null&&e.hasOwnProperty(n)?typeof t!="object"||(Array.isArray(t)?t.length:Object.keys(t).length)>0:!1};re.Buffer=function(){try{var r=re.inquire("buffer").Buffer;return r.prototype.utf8Write?r:null}catch{return null}}();re._Buffer_from=null;re._Buffer_allocUnsafe=null;re.newBuffer=function(e){return typeof e=="number"?re.Buffer?re._Buffer_allocUnsafe(e):new re.Array(e):re.Buffer?re._Buffer_from(e):typeof Uint8Array>"u"?e:new Uint8Array(e)};re.Array=typeof Uint8Array<"u"?Uint8Array:Array;re.Long=re.global.dcodeIO&&re.global.dcodeIO.Long||re.global.Long||re.inquire("long");re.key2Re=/^true|false|0|1$/;re.key32Re=/^-?(?:0|[1-9][0-9]*)$/;re.key64Re=/^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;re.longToHash=function(e){return e?re.LongBits.from(e).toHash():re.LongBits.zeroHash};re.longFromHash=function(e,n){var t=re.LongBits.fromHash(e);return re.Long?re.Long.fromBits(t.lo,t.hi,n):t.toNumber(!!n)};function Jc(r,e,n){for(var t=Object.keys(e),o=0;o-1;--i)if(n[o[i]]===1&&this[o[i]]!==void 0&&this[o[i]]!==null)return o[i]}};re.oneOfSetter=function(e){return function(n){for(var t=0;t{"use strict";nf.exports=Pe;var Ct=_r(),Ra,Lo=Ct.LongBits,ef=Ct.base64,tf=Ct.utf8;function Dn(r,e,n){this.fn=r,this.len=e,this.next=void 0,this.val=n}function za(){}function bv(r){this.head=r.head,this.tail=r.tail,this.len=r.len,this.next=r.states}function Pe(){this.len=0,this.head=new Dn(za,0,0),this.tail=this.head,this.states=null}var rf=function(){return Ct.Buffer?function(){return(Pe.create=function(){return new Ra})()}:function(){return new Pe}};Pe.create=rf();Pe.alloc=function(e){return new Ct.Array(e)};Ct.Array!==Array&&(Pe.alloc=Ct.pool(Pe.alloc,Ct.Array.prototype.subarray));Pe.prototype._push=function(e,n,t){return this.tail=this.tail.next=new Dn(e,n,t),this.len+=n,this};function Fa(r,e,n){e[n]=r&255}function yv(r,e,n){for(;r>127;)e[n++]=r&127|128,r>>>=7;e[n]=r}function Ma(r,e){this.len=r,this.next=void 0,this.val=e}Ma.prototype=Object.create(Dn.prototype);Ma.prototype.fn=yv;Pe.prototype.uint32=function(e){return this.len+=(this.tail=this.tail.next=new Ma((e=e>>>0)<128?1:e<16384?2:e<2097152?3:e<268435456?4:5,e)).len,this};Pe.prototype.int32=function(e){return e<0?this._push(Va,10,Lo.fromNumber(e)):this.uint32(e)};Pe.prototype.sint32=function(e){return this.uint32((e<<1^e>>31)>>>0)};function Va(r,e,n){for(;r.hi;)e[n++]=r.lo&127|128,r.lo=(r.lo>>>7|r.hi<<25)>>>0,r.hi>>>=7;for(;r.lo>127;)e[n++]=r.lo&127|128,r.lo=r.lo>>>7;e[n++]=r.lo}Pe.prototype.uint64=function(e){var n=Lo.from(e);return this._push(Va,n.length(),n)};Pe.prototype.int64=Pe.prototype.uint64;Pe.prototype.sint64=function(e){var n=Lo.from(e).zzEncode();return this._push(Va,n.length(),n)};Pe.prototype.bool=function(e){return this._push(Fa,1,e?1:0)};function Na(r,e,n){e[n]=r&255,e[n+1]=r>>>8&255,e[n+2]=r>>>16&255,e[n+3]=r>>>24}Pe.prototype.fixed32=function(e){return this._push(Na,4,e>>>0)};Pe.prototype.sfixed32=Pe.prototype.fixed32;Pe.prototype.fixed64=function(e){var n=Lo.from(e);return this._push(Na,4,n.lo)._push(Na,4,n.hi)};Pe.prototype.sfixed64=Pe.prototype.fixed64;Pe.prototype.float=function(e){return this._push(Ct.float.writeFloatLE,4,e)};Pe.prototype.double=function(e){return this._push(Ct.float.writeDoubleLE,8,e)};var xv=Ct.Array.prototype.set?function(e,n,t){n.set(e,t)}:function(e,n,t){for(var o=0;o>>0;if(!n)return this._push(Fa,1,0);if(Ct.isString(e)){var t=Pe.alloc(n=ef.length(e));ef.decode(e,t,0),e=t}return this.uint32(n)._push(xv,n,e)};Pe.prototype.string=function(e){var n=tf.length(e);return n?this.uint32(n)._push(tf.write,n,e):this._push(Fa,1,0)};Pe.prototype.fork=function(){return this.states=new bv(this),this.head=this.tail=new Dn(za,0,0),this.len=0,this};Pe.prototype.reset=function(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new Dn(za,0,0),this.len=0),this};Pe.prototype.ldelim=function(){var e=this.head,n=this.tail,t=this.len;return this.reset().uint32(t),t&&(this.tail.next=e.next,this.tail=n,this.len+=t),this};Pe.prototype.finish=function(){for(var e=this.head.next,n=this.constructor.alloc(this.len),t=0;e;)e.fn(e.val,n,t),t+=e.len,e=e.next;return n};Pe._configure=function(r){Ra=r,Pe.create=rf(),Ra._configure()}});var sf=Je((e$,af)=>{"use strict";af.exports=Jt;var of=Ga();(Jt.prototype=Object.create(of.prototype)).constructor=Jt;var Ir=_r();function Jt(){of.call(this)}Jt._configure=function(){Jt.alloc=Ir._Buffer_allocUnsafe,Jt.writeBytesBuffer=Ir.Buffer&&Ir.Buffer.prototype instanceof Uint8Array&&Ir.Buffer.prototype.set.name==="set"?function(e,n,t){n.set(e,t)}:function(e,n,t){if(e.copy)e.copy(n,t,0,e.length);else for(var o=0;o>>0;return this.uint32(n),n&&this._push(Jt.writeBytesBuffer,n,e),this};function vv(r,e,n){r.length<40?Ir.utf8.write(r,e,n):e.utf8Write?e.utf8Write(r,n):e.write(r,n)}Jt.prototype.string=function(e){var n=Ir.Buffer.byteLength(e);return this.uint32(n),n&&this._push(vv,n,e),this};Jt._configure()});var Ha=Je((t$,df)=>{"use strict";df.exports=Ke;var Mt=_r(),Wa,cf=Mt.LongBits,wv=Mt.utf8;function Vt(r,e){return RangeError("index out of range: "+r.pos+" + "+(e||1)+" > "+r.len)}function Ke(r){this.buf=r,this.pos=0,this.len=r.length}var uf=typeof Uint8Array<"u"?function(e){if(e instanceof Uint8Array||Array.isArray(e))return new Ke(e);throw Error("illegal buffer")}:function(e){if(Array.isArray(e))return new Ke(e);throw Error("illegal buffer")},ff=function(){return Mt.Buffer?function(n){return(Ke.create=function(o){return Mt.Buffer.isBuffer(o)?new Wa(o):uf(o)})(n)}:uf};Ke.create=ff();Ke.prototype._slice=Mt.Array.prototype.subarray||Mt.Array.prototype.slice;Ke.prototype.uint32=function(){var e=4294967295;return function(){if(e=(this.buf[this.pos]&127)>>>0,this.buf[this.pos++]<128||(e=(e|(this.buf[this.pos]&127)<<7)>>>0,this.buf[this.pos++]<128)||(e=(e|(this.buf[this.pos]&127)<<14)>>>0,this.buf[this.pos++]<128)||(e=(e|(this.buf[this.pos]&127)<<21)>>>0,this.buf[this.pos++]<128)||(e=(e|(this.buf[this.pos]&15)<<28)>>>0,this.buf[this.pos++]<128))return e;if((this.pos+=5)>this.len)throw this.pos=this.len,Vt(this,10);return e}}();Ke.prototype.int32=function(){return this.uint32()|0};Ke.prototype.sint32=function(){var e=this.uint32();return e>>>1^-(e&1)|0};function Ua(){var r=new cf(0,0),e=0;if(this.len-this.pos>4){for(;e<4;++e)if(r.lo=(r.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return r;if(r.lo=(r.lo|(this.buf[this.pos]&127)<<28)>>>0,r.hi=(r.hi|(this.buf[this.pos]&127)>>4)>>>0,this.buf[this.pos++]<128)return r;e=0}else{for(;e<3;++e){if(this.pos>=this.len)throw Vt(this);if(r.lo=(r.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return r}return r.lo=(r.lo|(this.buf[this.pos++]&127)<>>0,r}if(this.len-this.pos>4){for(;e<5;++e)if(r.hi=(r.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return r}else for(;e<5;++e){if(this.pos>=this.len)throw Vt(this);if(r.hi=(r.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return r}throw Error("invalid varint encoding")}Ke.prototype.bool=function(){return this.uint32()!==0};function Ro(r,e){return(r[e-4]|r[e-3]<<8|r[e-2]<<16|r[e-1]<<24)>>>0}Ke.prototype.fixed32=function(){if(this.pos+4>this.len)throw Vt(this,4);return Ro(this.buf,this.pos+=4)};Ke.prototype.sfixed32=function(){if(this.pos+4>this.len)throw Vt(this,4);return Ro(this.buf,this.pos+=4)|0};function lf(){if(this.pos+8>this.len)throw Vt(this,8);return new cf(Ro(this.buf,this.pos+=4),Ro(this.buf,this.pos+=4))}Ke.prototype.float=function(){if(this.pos+4>this.len)throw Vt(this,4);var e=Mt.float.readFloatLE(this.buf,this.pos);return this.pos+=4,e};Ke.prototype.double=function(){if(this.pos+8>this.len)throw Vt(this,4);var e=Mt.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,e};Ke.prototype.bytes=function(){var e=this.uint32(),n=this.pos,t=this.pos+e;if(t>this.len)throw Vt(this,e);if(this.pos+=e,Array.isArray(this.buf))return this.buf.slice(n,t);if(n===t){var o=Mt.Buffer;return o?o.alloc(0):new this.buf.constructor(0)}return this._slice.call(this.buf,n,t)};Ke.prototype.string=function(){var e=this.bytes();return wv.read(e,0,e.length)};Ke.prototype.skip=function(e){if(typeof e=="number"){if(this.pos+e>this.len)throw Vt(this,e);this.pos+=e}else do if(this.pos>=this.len)throw Vt(this);while(this.buf[this.pos++]&128);return this};Ke.prototype.skipType=function(r){switch(r){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;(r=this.uint32()&7)!==4;)this.skipType(r);break;case 5:this.skip(4);break;default:throw Error("invalid wire type "+r+" at offset "+this.pos)}return this};Ke._configure=function(r){Wa=r,Ke.create=ff(),Wa._configure();var e=Mt.Long?"toLong":"toNumber";Mt.merge(Ke.prototype,{int64:function(){return Ua.call(this)[e](!1)},uint64:function(){return Ua.call(this)[e](!0)},sint64:function(){return Ua.call(this).zzDecode()[e](!1)},fixed64:function(){return lf.call(this)[e](!0)},sfixed64:function(){return lf.call(this)[e](!1)}})}});var gf=Je((r$,hf)=>{"use strict";hf.exports=Nr;var mf=Ha();(Nr.prototype=Object.create(mf.prototype)).constructor=Nr;var pf=_r();function Nr(r){mf.call(this,r)}Nr._configure=function(){pf.Buffer&&(Nr.prototype._slice=pf.Buffer.prototype.slice)};Nr.prototype.string=function(){var e=this.uint32();return this.buf.utf8Slice?this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+e,this.len)):this.buf.toString("utf-8",this.pos,this.pos=Math.min(this.pos+e,this.len))};Nr._configure()});var yf=Je((n$,bf)=>{"use strict";bf.exports=Bn;var qa=_r();(Bn.prototype=Object.create(qa.EventEmitter.prototype)).constructor=Bn;function Bn(r,e,n){if(typeof r!="function")throw TypeError("rpcImpl must be a function");qa.EventEmitter.call(this),this.rpcImpl=r,this.requestDelimited=!!e,this.responseDelimited=!!n}Bn.prototype.rpcCall=function r(e,n,t,o,i){if(!o)throw TypeError("request must be specified");var s=this;if(!i)return qa.asPromise(r,s,e,n,t,o);if(!s.rpcImpl){setTimeout(function(){i(Error("already ended"))},0);return}try{return s.rpcImpl(e,n[s.requestDelimited?"encodeDelimited":"encode"](o).finish(),function(u,l){if(u)return s.emit("error",u,e),i(u);if(l===null){s.end(!0);return}if(!(l instanceof t))try{l=t[s.responseDelimited?"decodeDelimited":"decode"](l)}catch(f){return s.emit("error",f,e),i(f)}return s.emit("data",l,e),i(null,l)})}catch(a){s.emit("error",a,e),setTimeout(function(){i(a)},0);return}};Bn.prototype.end=function(e){return this.rpcImpl&&(e||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit("end").off()),this}});var vf=Je(xf=>{"use strict";var Tv=xf;Tv.Service=yf()});var Tf=Je((i$,wf)=>{"use strict";wf.exports={}});var Sf=Je(If=>{"use strict";var vt=If;vt.build="minimal";vt.Writer=Ga();vt.BufferWriter=sf();vt.Reader=Ha();vt.BufferReader=gf();vt.util=_r();vt.rpc=vf();vt.roots=Tf();vt.configure=_f;function _f(){vt.util._configure(),vt.Writer._configure(vt.BufferWriter),vt.Reader._configure(vt.BufferReader)}_f()});var Af=Je((s$,$f)=>{"use strict";$f.exports=Sf()});var pn=Je((u$,Pf)=>{"use strict";var Ve=Af(),H=Ve.Reader,Xe=Ve.Writer,A=Ve.util,I=Ve.roots.default||(Ve.roots.default={});I.onnx=function(){var r={};return r.Version=function(){var e={},n=Object.create(e);return n[e[0]="_START_VERSION"]=0,n[e[1]="IR_VERSION_2017_10_10"]=1,n[e[2]="IR_VERSION_2017_10_30"]=2,n[e[3]="IR_VERSION_2017_11_3"]=3,n[e[4]="IR_VERSION_2019_1_22"]=4,n[e[5]="IR_VERSION_2019_3_18"]=5,n[e[6]="IR_VERSION_2019_9_19"]=6,n[e[7]="IR_VERSION_2020_5_8"]=7,n[e[8]="IR_VERSION_2021_7_30"]=8,n[e[9]="IR_VERSION"]=9,n}(),r.AttributeProto=function(){function e(n){if(this.floats=[],this.ints=[],this.strings=[],this.tensors=[],this.graphs=[],this.sparseTensors=[],this.typeProtos=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{s.name=t.string();break}case 21:{s.refAttrName=t.string();break}case 13:{s.docString=t.string();break}case 20:{s.type=t.int32();break}case 2:{s.f=t.float();break}case 3:{s.i=t.int64();break}case 4:{s.s=t.bytes();break}case 5:{s.t=I.onnx.TensorProto.decode(t,t.uint32());break}case 6:{s.g=I.onnx.GraphProto.decode(t,t.uint32());break}case 22:{s.sparseTensor=I.onnx.SparseTensorProto.decode(t,t.uint32());break}case 14:{s.tp=I.onnx.TypeProto.decode(t,t.uint32());break}case 7:{if(s.floats&&s.floats.length||(s.floats=[]),(a&7)===2)for(var u=t.uint32()+t.pos;t.pos>>0,t.i.high>>>0).toNumber())),t.s!=null&&(typeof t.s=="string"?A.base64.decode(t.s,o.s=A.newBuffer(A.base64.length(t.s)),0):t.s.length>=0&&(o.s=t.s)),t.t!=null){if(typeof t.t!="object")throw TypeError(".onnx.AttributeProto.t: object expected");o.t=I.onnx.TensorProto.fromObject(t.t)}if(t.g!=null){if(typeof t.g!="object")throw TypeError(".onnx.AttributeProto.g: object expected");o.g=I.onnx.GraphProto.fromObject(t.g)}if(t.sparseTensor!=null){if(typeof t.sparseTensor!="object")throw TypeError(".onnx.AttributeProto.sparseTensor: object expected");o.sparseTensor=I.onnx.SparseTensorProto.fromObject(t.sparseTensor)}if(t.tp!=null){if(typeof t.tp!="object")throw TypeError(".onnx.AttributeProto.tp: object expected");o.tp=I.onnx.TypeProto.fromObject(t.tp)}if(t.floats){if(!Array.isArray(t.floats))throw TypeError(".onnx.AttributeProto.floats: array expected");o.floats=[];for(var i=0;i>>0,t.ints[i].high>>>0).toNumber())}if(t.strings){if(!Array.isArray(t.strings))throw TypeError(".onnx.AttributeProto.strings: array expected");o.strings=[];for(var i=0;i=0&&(o.strings[i]=t.strings[i])}if(t.tensors){if(!Array.isArray(t.tensors))throw TypeError(".onnx.AttributeProto.tensors: array expected");o.tensors=[];for(var i=0;i>>0,t.i.high>>>0).toNumber():t.i),t.s!=null&&t.hasOwnProperty("s")&&(i.s=o.bytes===String?A.base64.encode(t.s,0,t.s.length):o.bytes===Array?Array.prototype.slice.call(t.s):t.s),t.t!=null&&t.hasOwnProperty("t")&&(i.t=I.onnx.TensorProto.toObject(t.t,o)),t.g!=null&&t.hasOwnProperty("g")&&(i.g=I.onnx.GraphProto.toObject(t.g,o)),t.floats&&t.floats.length){i.floats=[];for(var a=0;a>>0,t.ints[a].high>>>0).toNumber():t.ints[a]}if(t.strings&&t.strings.length){i.strings=[];for(var a=0;a>>3){case 1:{s.name=t.string();break}case 2:{s.type=I.onnx.TypeProto.decode(t,t.uint32());break}case 3:{s.docString=t.string();break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.name!=null&&t.hasOwnProperty("name")&&!A.isString(t.name))return"name: string expected";if(t.type!=null&&t.hasOwnProperty("type")){var o=I.onnx.TypeProto.verify(t.type);if(o)return"type."+o}return t.docString!=null&&t.hasOwnProperty("docString")&&!A.isString(t.docString)?"docString: string expected":null},e.fromObject=function(t){if(t instanceof I.onnx.ValueInfoProto)return t;var o=new I.onnx.ValueInfoProto;if(t.name!=null&&(o.name=String(t.name)),t.type!=null){if(typeof t.type!="object")throw TypeError(".onnx.ValueInfoProto.type: object expected");o.type=I.onnx.TypeProto.fromObject(t.type)}return t.docString!=null&&(o.docString=String(t.docString)),o},e.toObject=function(t,o){o||(o={});var i={};return o.defaults&&(i.name="",i.type=null,i.docString=""),t.name!=null&&t.hasOwnProperty("name")&&(i.name=t.name),t.type!=null&&t.hasOwnProperty("type")&&(i.type=I.onnx.TypeProto.toObject(t.type,o)),t.docString!=null&&t.hasOwnProperty("docString")&&(i.docString=t.docString),i},e.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},e.getTypeUrl=function(t){return t===void 0&&(t="type.googleapis.com"),t+"/onnx.ValueInfoProto"},e}(),r.NodeProto=function(){function e(n){if(this.input=[],this.output=[],this.attribute=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{s.input&&s.input.length||(s.input=[]),s.input.push(t.string());break}case 2:{s.output&&s.output.length||(s.output=[]),s.output.push(t.string());break}case 3:{s.name=t.string();break}case 4:{s.opType=t.string();break}case 7:{s.domain=t.string();break}case 5:{s.attribute&&s.attribute.length||(s.attribute=[]),s.attribute.push(I.onnx.AttributeProto.decode(t,t.uint32()));break}case 6:{s.docString=t.string();break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.input!=null&&t.hasOwnProperty("input")){if(!Array.isArray(t.input))return"input: array expected";for(var o=0;o>>3){case 1:{s.initialization=I.onnx.GraphProto.decode(t,t.uint32());break}case 2:{s.algorithm=I.onnx.GraphProto.decode(t,t.uint32());break}case 3:{s.initializationBinding&&s.initializationBinding.length||(s.initializationBinding=[]),s.initializationBinding.push(I.onnx.StringStringEntryProto.decode(t,t.uint32()));break}case 4:{s.updateBinding&&s.updateBinding.length||(s.updateBinding=[]),s.updateBinding.push(I.onnx.StringStringEntryProto.decode(t,t.uint32()));break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.initialization!=null&&t.hasOwnProperty("initialization")){var o=I.onnx.GraphProto.verify(t.initialization);if(o)return"initialization."+o}if(t.algorithm!=null&&t.hasOwnProperty("algorithm")){var o=I.onnx.GraphProto.verify(t.algorithm);if(o)return"algorithm."+o}if(t.initializationBinding!=null&&t.hasOwnProperty("initializationBinding")){if(!Array.isArray(t.initializationBinding))return"initializationBinding: array expected";for(var i=0;i>>3){case 1:{s.irVersion=t.int64();break}case 8:{s.opsetImport&&s.opsetImport.length||(s.opsetImport=[]),s.opsetImport.push(I.onnx.OperatorSetIdProto.decode(t,t.uint32()));break}case 2:{s.producerName=t.string();break}case 3:{s.producerVersion=t.string();break}case 4:{s.domain=t.string();break}case 5:{s.modelVersion=t.int64();break}case 6:{s.docString=t.string();break}case 7:{s.graph=I.onnx.GraphProto.decode(t,t.uint32());break}case 14:{s.metadataProps&&s.metadataProps.length||(s.metadataProps=[]),s.metadataProps.push(I.onnx.StringStringEntryProto.decode(t,t.uint32()));break}case 20:{s.trainingInfo&&s.trainingInfo.length||(s.trainingInfo=[]),s.trainingInfo.push(I.onnx.TrainingInfoProto.decode(t,t.uint32()));break}case 25:{s.functions&&s.functions.length||(s.functions=[]),s.functions.push(I.onnx.FunctionProto.decode(t,t.uint32()));break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.irVersion!=null&&t.hasOwnProperty("irVersion")&&!A.isInteger(t.irVersion)&&!(t.irVersion&&A.isInteger(t.irVersion.low)&&A.isInteger(t.irVersion.high)))return"irVersion: integer|Long expected";if(t.opsetImport!=null&&t.hasOwnProperty("opsetImport")){if(!Array.isArray(t.opsetImport))return"opsetImport: array expected";for(var o=0;o>>0,t.irVersion.high>>>0).toNumber())),t.opsetImport){if(!Array.isArray(t.opsetImport))throw TypeError(".onnx.ModelProto.opsetImport: array expected");o.opsetImport=[];for(var i=0;i>>0,t.modelVersion.high>>>0).toNumber())),t.docString!=null&&(o.docString=String(t.docString)),t.graph!=null){if(typeof t.graph!="object")throw TypeError(".onnx.ModelProto.graph: object expected");o.graph=I.onnx.GraphProto.fromObject(t.graph)}if(t.metadataProps){if(!Array.isArray(t.metadataProps))throw TypeError(".onnx.ModelProto.metadataProps: array expected");o.metadataProps=[];for(var i=0;i>>0,t.irVersion.high>>>0).toNumber():t.irVersion),t.producerName!=null&&t.hasOwnProperty("producerName")&&(i.producerName=t.producerName),t.producerVersion!=null&&t.hasOwnProperty("producerVersion")&&(i.producerVersion=t.producerVersion),t.domain!=null&&t.hasOwnProperty("domain")&&(i.domain=t.domain),t.modelVersion!=null&&t.hasOwnProperty("modelVersion")&&(typeof t.modelVersion=="number"?i.modelVersion=o.longs===String?String(t.modelVersion):t.modelVersion:i.modelVersion=o.longs===String?A.Long.prototype.toString.call(t.modelVersion):o.longs===Number?new A.LongBits(t.modelVersion.low>>>0,t.modelVersion.high>>>0).toNumber():t.modelVersion),t.docString!=null&&t.hasOwnProperty("docString")&&(i.docString=t.docString),t.graph!=null&&t.hasOwnProperty("graph")&&(i.graph=I.onnx.GraphProto.toObject(t.graph,o)),t.opsetImport&&t.opsetImport.length){i.opsetImport=[];for(var a=0;a>>3){case 1:{s.key=t.string();break}case 2:{s.value=t.string();break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){return typeof t!="object"||t===null?"object expected":t.key!=null&&t.hasOwnProperty("key")&&!A.isString(t.key)?"key: string expected":t.value!=null&&t.hasOwnProperty("value")&&!A.isString(t.value)?"value: string expected":null},e.fromObject=function(t){if(t instanceof I.onnx.StringStringEntryProto)return t;var o=new I.onnx.StringStringEntryProto;return t.key!=null&&(o.key=String(t.key)),t.value!=null&&(o.value=String(t.value)),o},e.toObject=function(t,o){o||(o={});var i={};return o.defaults&&(i.key="",i.value=""),t.key!=null&&t.hasOwnProperty("key")&&(i.key=t.key),t.value!=null&&t.hasOwnProperty("value")&&(i.value=t.value),i},e.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},e.getTypeUrl=function(t){return t===void 0&&(t="type.googleapis.com"),t+"/onnx.StringStringEntryProto"},e}(),r.TensorAnnotation=function(){function e(n){if(this.quantParameterTensorNames=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{s.tensorName=t.string();break}case 2:{s.quantParameterTensorNames&&s.quantParameterTensorNames.length||(s.quantParameterTensorNames=[]),s.quantParameterTensorNames.push(I.onnx.StringStringEntryProto.decode(t,t.uint32()));break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.tensorName!=null&&t.hasOwnProperty("tensorName")&&!A.isString(t.tensorName))return"tensorName: string expected";if(t.quantParameterTensorNames!=null&&t.hasOwnProperty("quantParameterTensorNames")){if(!Array.isArray(t.quantParameterTensorNames))return"quantParameterTensorNames: array expected";for(var o=0;o>>3){case 1:{s.node&&s.node.length||(s.node=[]),s.node.push(I.onnx.NodeProto.decode(t,t.uint32()));break}case 2:{s.name=t.string();break}case 5:{s.initializer&&s.initializer.length||(s.initializer=[]),s.initializer.push(I.onnx.TensorProto.decode(t,t.uint32()));break}case 15:{s.sparseInitializer&&s.sparseInitializer.length||(s.sparseInitializer=[]),s.sparseInitializer.push(I.onnx.SparseTensorProto.decode(t,t.uint32()));break}case 10:{s.docString=t.string();break}case 11:{s.input&&s.input.length||(s.input=[]),s.input.push(I.onnx.ValueInfoProto.decode(t,t.uint32()));break}case 12:{s.output&&s.output.length||(s.output=[]),s.output.push(I.onnx.ValueInfoProto.decode(t,t.uint32()));break}case 13:{s.valueInfo&&s.valueInfo.length||(s.valueInfo=[]),s.valueInfo.push(I.onnx.ValueInfoProto.decode(t,t.uint32()));break}case 14:{s.quantizationAnnotation&&s.quantizationAnnotation.length||(s.quantizationAnnotation=[]),s.quantizationAnnotation.push(I.onnx.TensorAnnotation.decode(t,t.uint32()));break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.node!=null&&t.hasOwnProperty("node")){if(!Array.isArray(t.node))return"node: array expected";for(var o=0;o>>3){case 1:{if(s.dims&&s.dims.length||(s.dims=[]),(a&7)===2)for(var u=t.uint32()+t.pos;t.pos>>0,t.dims[i].high>>>0).toNumber())}if(t.dataType!=null&&(o.dataType=t.dataType|0),t.segment!=null){if(typeof t.segment!="object")throw TypeError(".onnx.TensorProto.segment: object expected");o.segment=I.onnx.TensorProto.Segment.fromObject(t.segment)}if(t.floatData){if(!Array.isArray(t.floatData))throw TypeError(".onnx.TensorProto.floatData: array expected");o.floatData=[];for(var i=0;i=0&&(o.stringData[i]=t.stringData[i])}if(t.int64Data){if(!Array.isArray(t.int64Data))throw TypeError(".onnx.TensorProto.int64Data: array expected");o.int64Data=[];for(var i=0;i>>0,t.int64Data[i].high>>>0).toNumber())}if(t.name!=null&&(o.name=String(t.name)),t.docString!=null&&(o.docString=String(t.docString)),t.rawData!=null&&(typeof t.rawData=="string"?A.base64.decode(t.rawData,o.rawData=A.newBuffer(A.base64.length(t.rawData)),0):t.rawData.length>=0&&(o.rawData=t.rawData)),t.externalData){if(!Array.isArray(t.externalData))throw TypeError(".onnx.TensorProto.externalData: array expected");o.externalData=[];for(var i=0;i>>0,t.uint64Data[i].high>>>0).toNumber(!0))}return o},e.toObject=function(t,o){o||(o={});var i={};if((o.arrays||o.defaults)&&(i.dims=[],i.floatData=[],i.int32Data=[],i.stringData=[],i.int64Data=[],i.doubleData=[],i.uint64Data=[],i.externalData=[]),o.defaults&&(i.dataType=0,i.segment=null,i.name="",o.bytes===String?i.rawData="":(i.rawData=[],o.bytes!==Array&&(i.rawData=A.newBuffer(i.rawData))),i.docString="",i.dataLocation=o.enums===String?"DEFAULT":0),t.dims&&t.dims.length){i.dims=[];for(var s=0;s>>0,t.dims[s].high>>>0).toNumber():t.dims[s]}if(t.dataType!=null&&t.hasOwnProperty("dataType")&&(i.dataType=t.dataType),t.segment!=null&&t.hasOwnProperty("segment")&&(i.segment=I.onnx.TensorProto.Segment.toObject(t.segment,o)),t.floatData&&t.floatData.length){i.floatData=[];for(var s=0;s>>0,t.int64Data[s].high>>>0).toNumber():t.int64Data[s]}if(t.name!=null&&t.hasOwnProperty("name")&&(i.name=t.name),t.rawData!=null&&t.hasOwnProperty("rawData")&&(i.rawData=o.bytes===String?A.base64.encode(t.rawData,0,t.rawData.length):o.bytes===Array?Array.prototype.slice.call(t.rawData):t.rawData),t.doubleData&&t.doubleData.length){i.doubleData=[];for(var s=0;s>>0,t.uint64Data[s].high>>>0).toNumber(!0):t.uint64Data[s]}if(t.docString!=null&&t.hasOwnProperty("docString")&&(i.docString=t.docString),t.externalData&&t.externalData.length){i.externalData=[];for(var s=0;s>>3){case 1:{a.begin=o.int64();break}case 2:{a.end=o.int64();break}default:o.skipType(u&7);break}}return a},n.decodeDelimited=function(o){return o instanceof H||(o=new H(o)),this.decode(o,o.uint32())},n.verify=function(o){return typeof o!="object"||o===null?"object expected":o.begin!=null&&o.hasOwnProperty("begin")&&!A.isInteger(o.begin)&&!(o.begin&&A.isInteger(o.begin.low)&&A.isInteger(o.begin.high))?"begin: integer|Long expected":o.end!=null&&o.hasOwnProperty("end")&&!A.isInteger(o.end)&&!(o.end&&A.isInteger(o.end.low)&&A.isInteger(o.end.high))?"end: integer|Long expected":null},n.fromObject=function(o){if(o instanceof I.onnx.TensorProto.Segment)return o;var i=new I.onnx.TensorProto.Segment;return o.begin!=null&&(A.Long?(i.begin=A.Long.fromValue(o.begin)).unsigned=!1:typeof o.begin=="string"?i.begin=parseInt(o.begin,10):typeof o.begin=="number"?i.begin=o.begin:typeof o.begin=="object"&&(i.begin=new A.LongBits(o.begin.low>>>0,o.begin.high>>>0).toNumber())),o.end!=null&&(A.Long?(i.end=A.Long.fromValue(o.end)).unsigned=!1:typeof o.end=="string"?i.end=parseInt(o.end,10):typeof o.end=="number"?i.end=o.end:typeof o.end=="object"&&(i.end=new A.LongBits(o.end.low>>>0,o.end.high>>>0).toNumber())),i},n.toObject=function(o,i){i||(i={});var s={};if(i.defaults){if(A.Long){var a=new A.Long(0,0,!1);s.begin=i.longs===String?a.toString():i.longs===Number?a.toNumber():a}else s.begin=i.longs===String?"0":0;if(A.Long){var a=new A.Long(0,0,!1);s.end=i.longs===String?a.toString():i.longs===Number?a.toNumber():a}else s.end=i.longs===String?"0":0}return o.begin!=null&&o.hasOwnProperty("begin")&&(typeof o.begin=="number"?s.begin=i.longs===String?String(o.begin):o.begin:s.begin=i.longs===String?A.Long.prototype.toString.call(o.begin):i.longs===Number?new A.LongBits(o.begin.low>>>0,o.begin.high>>>0).toNumber():o.begin),o.end!=null&&o.hasOwnProperty("end")&&(typeof o.end=="number"?s.end=i.longs===String?String(o.end):o.end:s.end=i.longs===String?A.Long.prototype.toString.call(o.end):i.longs===Number?new A.LongBits(o.end.low>>>0,o.end.high>>>0).toNumber():o.end),s},n.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},n.getTypeUrl=function(o){return o===void 0&&(o="type.googleapis.com"),o+"/onnx.TensorProto.Segment"},n}(),e.DataLocation=function(){var n={},t=Object.create(n);return t[n[0]="DEFAULT"]=0,t[n[1]="EXTERNAL"]=1,t}(),e}(),r.SparseTensorProto=function(){function e(n){if(this.dims=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{s.values=I.onnx.TensorProto.decode(t,t.uint32());break}case 2:{s.indices=I.onnx.TensorProto.decode(t,t.uint32());break}case 3:{if(s.dims&&s.dims.length||(s.dims=[]),(a&7)===2)for(var u=t.uint32()+t.pos;t.pos>>0,t.dims[i].high>>>0).toNumber())}return o},e.toObject=function(t,o){o||(o={});var i={};if((o.arrays||o.defaults)&&(i.dims=[]),o.defaults&&(i.values=null,i.indices=null),t.values!=null&&t.hasOwnProperty("values")&&(i.values=I.onnx.TensorProto.toObject(t.values,o)),t.indices!=null&&t.hasOwnProperty("indices")&&(i.indices=I.onnx.TensorProto.toObject(t.indices,o)),t.dims&&t.dims.length){i.dims=[];for(var s=0;s>>0,t.dims[s].high>>>0).toNumber():t.dims[s]}return i},e.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},e.getTypeUrl=function(t){return t===void 0&&(t="type.googleapis.com"),t+"/onnx.SparseTensorProto"},e}(),r.TensorShapeProto=function(){function e(n){if(this.dim=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{s.dim&&s.dim.length||(s.dim=[]),s.dim.push(I.onnx.TensorShapeProto.Dimension.decode(t,t.uint32()));break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.dim!=null&&t.hasOwnProperty("dim")){if(!Array.isArray(t.dim))return"dim: array expected";for(var o=0;o>>3){case 1:{u.dimValue=i.int64();break}case 2:{u.dimParam=i.string();break}case 3:{u.denotation=i.string();break}default:i.skipType(l&7);break}}return u},n.decodeDelimited=function(i){return i instanceof H||(i=new H(i)),this.decode(i,i.uint32())},n.verify=function(i){if(typeof i!="object"||i===null)return"object expected";var s={};if(i.dimValue!=null&&i.hasOwnProperty("dimValue")&&(s.value=1,!A.isInteger(i.dimValue)&&!(i.dimValue&&A.isInteger(i.dimValue.low)&&A.isInteger(i.dimValue.high))))return"dimValue: integer|Long expected";if(i.dimParam!=null&&i.hasOwnProperty("dimParam")){if(s.value===1)return"value: multiple values";if(s.value=1,!A.isString(i.dimParam))return"dimParam: string expected"}return i.denotation!=null&&i.hasOwnProperty("denotation")&&!A.isString(i.denotation)?"denotation: string expected":null},n.fromObject=function(i){if(i instanceof I.onnx.TensorShapeProto.Dimension)return i;var s=new I.onnx.TensorShapeProto.Dimension;return i.dimValue!=null&&(A.Long?(s.dimValue=A.Long.fromValue(i.dimValue)).unsigned=!1:typeof i.dimValue=="string"?s.dimValue=parseInt(i.dimValue,10):typeof i.dimValue=="number"?s.dimValue=i.dimValue:typeof i.dimValue=="object"&&(s.dimValue=new A.LongBits(i.dimValue.low>>>0,i.dimValue.high>>>0).toNumber())),i.dimParam!=null&&(s.dimParam=String(i.dimParam)),i.denotation!=null&&(s.denotation=String(i.denotation)),s},n.toObject=function(i,s){s||(s={});var a={};return s.defaults&&(a.denotation=""),i.dimValue!=null&&i.hasOwnProperty("dimValue")&&(typeof i.dimValue=="number"?a.dimValue=s.longs===String?String(i.dimValue):i.dimValue:a.dimValue=s.longs===String?A.Long.prototype.toString.call(i.dimValue):s.longs===Number?new A.LongBits(i.dimValue.low>>>0,i.dimValue.high>>>0).toNumber():i.dimValue,s.oneofs&&(a.value="dimValue")),i.dimParam!=null&&i.hasOwnProperty("dimParam")&&(a.dimParam=i.dimParam,s.oneofs&&(a.value="dimParam")),i.denotation!=null&&i.hasOwnProperty("denotation")&&(a.denotation=i.denotation),a},n.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},n.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TensorShapeProto.Dimension"},n}(),e}(),r.TypeProto=function(){function e(t){if(t)for(var o=Object.keys(t),i=0;i>>3){case 1:{a.tensorType=I.onnx.TypeProto.Tensor.decode(o,o.uint32());break}case 4:{a.sequenceType=I.onnx.TypeProto.Sequence.decode(o,o.uint32());break}case 5:{a.mapType=I.onnx.TypeProto.Map.decode(o,o.uint32());break}case 9:{a.optionalType=I.onnx.TypeProto.Optional.decode(o,o.uint32());break}case 8:{a.sparseTensorType=I.onnx.TypeProto.SparseTensor.decode(o,o.uint32());break}case 6:{a.denotation=o.string();break}default:o.skipType(u&7);break}}return a},e.decodeDelimited=function(o){return o instanceof H||(o=new H(o)),this.decode(o,o.uint32())},e.verify=function(o){if(typeof o!="object"||o===null)return"object expected";var i={};if(o.tensorType!=null&&o.hasOwnProperty("tensorType")){i.value=1;{var s=I.onnx.TypeProto.Tensor.verify(o.tensorType);if(s)return"tensorType."+s}}if(o.sequenceType!=null&&o.hasOwnProperty("sequenceType")){if(i.value===1)return"value: multiple values";i.value=1;{var s=I.onnx.TypeProto.Sequence.verify(o.sequenceType);if(s)return"sequenceType."+s}}if(o.mapType!=null&&o.hasOwnProperty("mapType")){if(i.value===1)return"value: multiple values";i.value=1;{var s=I.onnx.TypeProto.Map.verify(o.mapType);if(s)return"mapType."+s}}if(o.optionalType!=null&&o.hasOwnProperty("optionalType")){if(i.value===1)return"value: multiple values";i.value=1;{var s=I.onnx.TypeProto.Optional.verify(o.optionalType);if(s)return"optionalType."+s}}if(o.sparseTensorType!=null&&o.hasOwnProperty("sparseTensorType")){if(i.value===1)return"value: multiple values";i.value=1;{var s=I.onnx.TypeProto.SparseTensor.verify(o.sparseTensorType);if(s)return"sparseTensorType."+s}}return o.denotation!=null&&o.hasOwnProperty("denotation")&&!A.isString(o.denotation)?"denotation: string expected":null},e.fromObject=function(o){if(o instanceof I.onnx.TypeProto)return o;var i=new I.onnx.TypeProto;if(o.tensorType!=null){if(typeof o.tensorType!="object")throw TypeError(".onnx.TypeProto.tensorType: object expected");i.tensorType=I.onnx.TypeProto.Tensor.fromObject(o.tensorType)}if(o.sequenceType!=null){if(typeof o.sequenceType!="object")throw TypeError(".onnx.TypeProto.sequenceType: object expected");i.sequenceType=I.onnx.TypeProto.Sequence.fromObject(o.sequenceType)}if(o.mapType!=null){if(typeof o.mapType!="object")throw TypeError(".onnx.TypeProto.mapType: object expected");i.mapType=I.onnx.TypeProto.Map.fromObject(o.mapType)}if(o.optionalType!=null){if(typeof o.optionalType!="object")throw TypeError(".onnx.TypeProto.optionalType: object expected");i.optionalType=I.onnx.TypeProto.Optional.fromObject(o.optionalType)}if(o.sparseTensorType!=null){if(typeof o.sparseTensorType!="object")throw TypeError(".onnx.TypeProto.sparseTensorType: object expected");i.sparseTensorType=I.onnx.TypeProto.SparseTensor.fromObject(o.sparseTensorType)}return o.denotation!=null&&(i.denotation=String(o.denotation)),i},e.toObject=function(o,i){i||(i={});var s={};return i.defaults&&(s.denotation=""),o.tensorType!=null&&o.hasOwnProperty("tensorType")&&(s.tensorType=I.onnx.TypeProto.Tensor.toObject(o.tensorType,i),i.oneofs&&(s.value="tensorType")),o.sequenceType!=null&&o.hasOwnProperty("sequenceType")&&(s.sequenceType=I.onnx.TypeProto.Sequence.toObject(o.sequenceType,i),i.oneofs&&(s.value="sequenceType")),o.mapType!=null&&o.hasOwnProperty("mapType")&&(s.mapType=I.onnx.TypeProto.Map.toObject(o.mapType,i),i.oneofs&&(s.value="mapType")),o.denotation!=null&&o.hasOwnProperty("denotation")&&(s.denotation=o.denotation),o.sparseTensorType!=null&&o.hasOwnProperty("sparseTensorType")&&(s.sparseTensorType=I.onnx.TypeProto.SparseTensor.toObject(o.sparseTensorType,i),i.oneofs&&(s.value="sparseTensorType")),o.optionalType!=null&&o.hasOwnProperty("optionalType")&&(s.optionalType=I.onnx.TypeProto.Optional.toObject(o.optionalType,i),i.oneofs&&(s.value="optionalType")),s},e.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},e.getTypeUrl=function(o){return o===void 0&&(o="type.googleapis.com"),o+"/onnx.TypeProto"},e.Tensor=function(){function t(o){if(o)for(var i=Object.keys(o),s=0;s>>3){case 1:{u.elemType=i.int32();break}case 2:{u.shape=I.onnx.TensorShapeProto.decode(i,i.uint32());break}default:i.skipType(l&7);break}}return u},t.decodeDelimited=function(i){return i instanceof H||(i=new H(i)),this.decode(i,i.uint32())},t.verify=function(i){if(typeof i!="object"||i===null)return"object expected";if(i.elemType!=null&&i.hasOwnProperty("elemType")&&!A.isInteger(i.elemType))return"elemType: integer expected";if(i.shape!=null&&i.hasOwnProperty("shape")){var s=I.onnx.TensorShapeProto.verify(i.shape);if(s)return"shape."+s}return null},t.fromObject=function(i){if(i instanceof I.onnx.TypeProto.Tensor)return i;var s=new I.onnx.TypeProto.Tensor;if(i.elemType!=null&&(s.elemType=i.elemType|0),i.shape!=null){if(typeof i.shape!="object")throw TypeError(".onnx.TypeProto.Tensor.shape: object expected");s.shape=I.onnx.TensorShapeProto.fromObject(i.shape)}return s},t.toObject=function(i,s){s||(s={});var a={};return s.defaults&&(a.elemType=0,a.shape=null),i.elemType!=null&&i.hasOwnProperty("elemType")&&(a.elemType=i.elemType),i.shape!=null&&i.hasOwnProperty("shape")&&(a.shape=I.onnx.TensorShapeProto.toObject(i.shape,s)),a},t.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},t.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TypeProto.Tensor"},t}(),e.Sequence=function(){function t(o){if(o)for(var i=Object.keys(o),s=0;s>>3){case 1:{u.elemType=I.onnx.TypeProto.decode(i,i.uint32());break}default:i.skipType(l&7);break}}return u},t.decodeDelimited=function(i){return i instanceof H||(i=new H(i)),this.decode(i,i.uint32())},t.verify=function(i){if(typeof i!="object"||i===null)return"object expected";if(i.elemType!=null&&i.hasOwnProperty("elemType")){var s=I.onnx.TypeProto.verify(i.elemType);if(s)return"elemType."+s}return null},t.fromObject=function(i){if(i instanceof I.onnx.TypeProto.Sequence)return i;var s=new I.onnx.TypeProto.Sequence;if(i.elemType!=null){if(typeof i.elemType!="object")throw TypeError(".onnx.TypeProto.Sequence.elemType: object expected");s.elemType=I.onnx.TypeProto.fromObject(i.elemType)}return s},t.toObject=function(i,s){s||(s={});var a={};return s.defaults&&(a.elemType=null),i.elemType!=null&&i.hasOwnProperty("elemType")&&(a.elemType=I.onnx.TypeProto.toObject(i.elemType,s)),a},t.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},t.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TypeProto.Sequence"},t}(),e.Map=function(){function t(o){if(o)for(var i=Object.keys(o),s=0;s>>3){case 1:{u.keyType=i.int32();break}case 2:{u.valueType=I.onnx.TypeProto.decode(i,i.uint32());break}default:i.skipType(l&7);break}}return u},t.decodeDelimited=function(i){return i instanceof H||(i=new H(i)),this.decode(i,i.uint32())},t.verify=function(i){if(typeof i!="object"||i===null)return"object expected";if(i.keyType!=null&&i.hasOwnProperty("keyType")&&!A.isInteger(i.keyType))return"keyType: integer expected";if(i.valueType!=null&&i.hasOwnProperty("valueType")){var s=I.onnx.TypeProto.verify(i.valueType);if(s)return"valueType."+s}return null},t.fromObject=function(i){if(i instanceof I.onnx.TypeProto.Map)return i;var s=new I.onnx.TypeProto.Map;if(i.keyType!=null&&(s.keyType=i.keyType|0),i.valueType!=null){if(typeof i.valueType!="object")throw TypeError(".onnx.TypeProto.Map.valueType: object expected");s.valueType=I.onnx.TypeProto.fromObject(i.valueType)}return s},t.toObject=function(i,s){s||(s={});var a={};return s.defaults&&(a.keyType=0,a.valueType=null),i.keyType!=null&&i.hasOwnProperty("keyType")&&(a.keyType=i.keyType),i.valueType!=null&&i.hasOwnProperty("valueType")&&(a.valueType=I.onnx.TypeProto.toObject(i.valueType,s)),a},t.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},t.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TypeProto.Map"},t}(),e.Optional=function(){function t(o){if(o)for(var i=Object.keys(o),s=0;s>>3){case 1:{u.elemType=I.onnx.TypeProto.decode(i,i.uint32());break}default:i.skipType(l&7);break}}return u},t.decodeDelimited=function(i){return i instanceof H||(i=new H(i)),this.decode(i,i.uint32())},t.verify=function(i){if(typeof i!="object"||i===null)return"object expected";if(i.elemType!=null&&i.hasOwnProperty("elemType")){var s=I.onnx.TypeProto.verify(i.elemType);if(s)return"elemType."+s}return null},t.fromObject=function(i){if(i instanceof I.onnx.TypeProto.Optional)return i;var s=new I.onnx.TypeProto.Optional;if(i.elemType!=null){if(typeof i.elemType!="object")throw TypeError(".onnx.TypeProto.Optional.elemType: object expected");s.elemType=I.onnx.TypeProto.fromObject(i.elemType)}return s},t.toObject=function(i,s){s||(s={});var a={};return s.defaults&&(a.elemType=null),i.elemType!=null&&i.hasOwnProperty("elemType")&&(a.elemType=I.onnx.TypeProto.toObject(i.elemType,s)),a},t.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},t.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TypeProto.Optional"},t}(),e.SparseTensor=function(){function t(o){if(o)for(var i=Object.keys(o),s=0;s>>3){case 1:{u.elemType=i.int32();break}case 2:{u.shape=I.onnx.TensorShapeProto.decode(i,i.uint32());break}default:i.skipType(l&7);break}}return u},t.decodeDelimited=function(i){return i instanceof H||(i=new H(i)),this.decode(i,i.uint32())},t.verify=function(i){if(typeof i!="object"||i===null)return"object expected";if(i.elemType!=null&&i.hasOwnProperty("elemType")&&!A.isInteger(i.elemType))return"elemType: integer expected";if(i.shape!=null&&i.hasOwnProperty("shape")){var s=I.onnx.TensorShapeProto.verify(i.shape);if(s)return"shape."+s}return null},t.fromObject=function(i){if(i instanceof I.onnx.TypeProto.SparseTensor)return i;var s=new I.onnx.TypeProto.SparseTensor;if(i.elemType!=null&&(s.elemType=i.elemType|0),i.shape!=null){if(typeof i.shape!="object")throw TypeError(".onnx.TypeProto.SparseTensor.shape: object expected");s.shape=I.onnx.TensorShapeProto.fromObject(i.shape)}return s},t.toObject=function(i,s){s||(s={});var a={};return s.defaults&&(a.elemType=0,a.shape=null),i.elemType!=null&&i.hasOwnProperty("elemType")&&(a.elemType=i.elemType),i.shape!=null&&i.hasOwnProperty("shape")&&(a.shape=I.onnx.TensorShapeProto.toObject(i.shape,s)),a},t.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},t.getTypeUrl=function(i){return i===void 0&&(i="type.googleapis.com"),i+"/onnx.TypeProto.SparseTensor"},t}(),e}(),r.OperatorSetIdProto=function(){function e(n){if(n)for(var t=Object.keys(n),o=0;o>>3){case 1:{s.domain=t.string();break}case 2:{s.version=t.int64();break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){return typeof t!="object"||t===null?"object expected":t.domain!=null&&t.hasOwnProperty("domain")&&!A.isString(t.domain)?"domain: string expected":t.version!=null&&t.hasOwnProperty("version")&&!A.isInteger(t.version)&&!(t.version&&A.isInteger(t.version.low)&&A.isInteger(t.version.high))?"version: integer|Long expected":null},e.fromObject=function(t){if(t instanceof I.onnx.OperatorSetIdProto)return t;var o=new I.onnx.OperatorSetIdProto;return t.domain!=null&&(o.domain=String(t.domain)),t.version!=null&&(A.Long?(o.version=A.Long.fromValue(t.version)).unsigned=!1:typeof t.version=="string"?o.version=parseInt(t.version,10):typeof t.version=="number"?o.version=t.version:typeof t.version=="object"&&(o.version=new A.LongBits(t.version.low>>>0,t.version.high>>>0).toNumber())),o},e.toObject=function(t,o){o||(o={});var i={};if(o.defaults)if(i.domain="",A.Long){var s=new A.Long(0,0,!1);i.version=o.longs===String?s.toString():o.longs===Number?s.toNumber():s}else i.version=o.longs===String?"0":0;return t.domain!=null&&t.hasOwnProperty("domain")&&(i.domain=t.domain),t.version!=null&&t.hasOwnProperty("version")&&(typeof t.version=="number"?i.version=o.longs===String?String(t.version):t.version:i.version=o.longs===String?A.Long.prototype.toString.call(t.version):o.longs===Number?new A.LongBits(t.version.low>>>0,t.version.high>>>0).toNumber():t.version),i},e.prototype.toJSON=function(){return this.constructor.toObject(this,Ve.util.toJSONOptions)},e.getTypeUrl=function(t){return t===void 0&&(t="type.googleapis.com"),t+"/onnx.OperatorSetIdProto"},e}(),r.OperatorStatus=function(){var e={},n=Object.create(e);return n[e[0]="EXPERIMENTAL"]=0,n[e[1]="STABLE"]=1,n}(),r.FunctionProto=function(){function e(n){if(this.input=[],this.output=[],this.attribute=[],this.attributeProto=[],this.node=[],this.opsetImport=[],n)for(var t=Object.keys(n),o=0;o>>3){case 1:{s.name=t.string();break}case 4:{s.input&&s.input.length||(s.input=[]),s.input.push(t.string());break}case 5:{s.output&&s.output.length||(s.output=[]),s.output.push(t.string());break}case 6:{s.attribute&&s.attribute.length||(s.attribute=[]),s.attribute.push(t.string());break}case 11:{s.attributeProto&&s.attributeProto.length||(s.attributeProto=[]),s.attributeProto.push(I.onnx.AttributeProto.decode(t,t.uint32()));break}case 7:{s.node&&s.node.length||(s.node=[]),s.node.push(I.onnx.NodeProto.decode(t,t.uint32()));break}case 8:{s.docString=t.string();break}case 9:{s.opsetImport&&s.opsetImport.length||(s.opsetImport=[]),s.opsetImport.push(I.onnx.OperatorSetIdProto.decode(t,t.uint32()));break}case 10:{s.domain=t.string();break}default:t.skipType(a&7);break}}return s},e.decodeDelimited=function(t){return t instanceof H||(t=new H(t)),this.decode(t,t.uint32())},e.verify=function(t){if(typeof t!="object"||t===null)return"object expected";if(t.name!=null&&t.hasOwnProperty("name")&&!A.isString(t.name))return"name: string expected";if(t.input!=null&&t.hasOwnProperty("input")){if(!Array.isArray(t.input))return"input: array expected";for(var o=0;o{"use strict";ko();Da();Ge=ln(pn());Gr();zr=class{static arraysEqual(e,n){if(e.length!==n.length)return!1;for(let t=0;t1&&f>1)return;a[s-u]=Math.max(l,f)}return a}static index(e,n){let t=new Array(n.length);return r.fillIndex(e,n,t),t}static fillIndex(e,n,t){let o=e.length-n.length;for(let i=0;i=0;v--)l[v]=T%s[v],T=Math.floor(T/s[v]);h||(r.fillIndex(l,e.dims,f),p=e.get(f)),g||(r.fillIndex(l,n.dims,c),b=n.get(c)),u.set(l,t(p,b))}}return u}}static isValidBroadcast(e,n){let t=e.length,o=n.length;if(t>o)return!1;for(let i=1;i<=t;i++)if(e[t-i]!==1&&e[t-i]!==n[o-i])return!1;return!0}static getBroadcastDims(e,n){let t=e.length,o=[];for(let i=0;i1&&a===1&&o.unshift(s)}return o}},No=class{static getShapeOfGemmResult(e,n,t,o,i){if(e.length!==2||t.length!==2)throw new Error("shape need to be of size 2");let s,a,u;n?(s=e[1],a=e[0]):(s=e[0],a=e[1]);let l=-1;if(o?(u=t[0],l=1):(u=t[1],l=0),t[l]!==a)throw new Error("dimension mismatch");if(s<=0||u<=0||a<=0)throw new Error("invalid shape specified");if(i&&!gt.isValidBroadcast(i,[s,u]))throw new Error("gemm: invalid bias shape for broadcast");return[s,u,a]}},lt=class r{static tensorDataTypeFromProto(e){switch(e){case Ge.onnx.TensorProto.DataType.INT8:return"int8";case Ge.onnx.TensorProto.DataType.UINT8:return"uint8";case Ge.onnx.TensorProto.DataType.BOOL:return"bool";case Ge.onnx.TensorProto.DataType.INT16:return"int16";case Ge.onnx.TensorProto.DataType.UINT16:return"uint16";case Ge.onnx.TensorProto.DataType.INT32:return"int32";case Ge.onnx.TensorProto.DataType.UINT32:return"uint32";case Ge.onnx.TensorProto.DataType.FLOAT:return"float32";case Ge.onnx.TensorProto.DataType.DOUBLE:return"float64";case Ge.onnx.TensorProto.DataType.STRING:return"string";case Ge.onnx.TensorProto.DataType.INT64:return"int32";case Ge.onnx.TensorProto.DataType.UINT64:return"uint32";default:throw new Error(`unsupported data type: ${Ge.onnx.TensorProto.DataType[e]}`)}}static tensorDataTypeStringToEnum(e){switch(e){case"int8":return Ge.onnx.TensorProto.DataType.INT8;case"uint8":return Ge.onnx.TensorProto.DataType.UINT8;case"bool":return Ge.onnx.TensorProto.DataType.BOOL;case"int16":return Ge.onnx.TensorProto.DataType.INT16;case"uint16":return Ge.onnx.TensorProto.DataType.UINT16;case"int32":return Ge.onnx.TensorProto.DataType.INT32;case"uint32":return Ge.onnx.TensorProto.DataType.UINT32;case"float32":return Ge.onnx.TensorProto.DataType.FLOAT;case"float64":return Ge.onnx.TensorProto.DataType.DOUBLE;case"string":return Ge.onnx.TensorProto.DataType.STRING;case"int64":return Ge.onnx.TensorProto.DataType.INT64;case"uint64":return Ge.onnx.TensorProto.DataType.UINT64;default:throw new Error(`unsupported data type: ${e}`)}}static tensorDimsFromProto(e){return e.map(n=>dr.isLong(n)?n.toNumber():n)}static tensorValueTypeFromProto(e){return{tensorType:r.tensorDataTypeFromProto(e.elemType),shape:{dims:r.tensorDimsFromProto(e.shape.dim.map(n=>n.dimValue))}}}static tensorDimsFromORTFormat(e){let n=[];for(let t=0;te.length)throw new Error(`invalid dimension of ${n} for sizeFromDimension as Tensor has ${e.length} dimensions.`);return r.getSizeFromDimensionRange(e,n,e.length)}static sizeToDimension(e,n){if(n<0||n>e.length)throw new Error(`invalid dimension of ${n} for sizeToDimension as Tensor has ${e.length} dimensions.`);return r.getSizeFromDimensionRange(e,0,n)}static getSizeFromDimensionRange(e,n,t){let o=1;for(let i=n;i=0;--o)t[o]=t[o+1]*e[o+1];return t}static transpose(e){return e.slice().reverse()}static indicesToOffset(e,n,t){t===void 0&&(t=e.length);let o=0;for(let i=0;i=n)throw new Error("unsupported axis for this operation.");return e<0?e+n:e}static normalizeAxes(e,n){return e.map(t=>this.normalizeAxis(t,n))}static incrementIndex(e,n,t){if(n.length===0||e.length===0)throw new Error("Index incrementing unsupported for scalar Tensor");if(t===void 0)t=n.length;else if(t<=0||t>n.length)throw new Error("Incorrect axis to increment on");for(let o=t-1;o>=0&&(e[o]++,!(e[o]=e.length)throw new Error("the dimension with value zero exceeds the dimension size of the input tensor");o[u]=e[u]}else o[u]=n[u];s*=o[u]}}let a=r.size(e);if(i!==-1){if(a%s!==0)throw new Error(`the input tensor cannot be reshaped to the requested shape. Input shape: [${e}] Output shape: [${n}]`);o[i]=a/s}else if(s!==a)throw new Error("reshapedDims and originalDims don't have matching sizes");return o}static sortBasedOnPerm(e,n){return n?n.map(t=>e[t]):e.slice().reverse()}static padShape(e,n){let t=e.length;return e.map((o,i)=>o+n[i]+n[i+t])}static areEqual(e,n){return e.length!==n.length?!1:e.every((t,o)=>t===n[o])}static validateDimsAndCalcSize(e){if(e.length>6)throw new TypeError("Only rank 0 to 6 is supported for tensor shape.");let n=1;for(let t of e){if(!Number.isInteger(t))throw new TypeError(`Invalid shape: ${t} is not an integer`);if(t<0||t>2147483647)throw new TypeError(`Invalid shape: length ${t} is not allowed`);n*=t}return n}static flattenShape(e,n){n<0&&(n+=e.length);let t=e.reduce((s,a)=>s*a,1),o=e.slice(n).reduce((s,a)=>s*a,1);return[t/o,o]}static squeezeShape(e,n){let t=new Array;n=r.normalizeAxes(n,e.length);for(let o=0;o=0;if(i&&e[o]!==1)throw new Error("squeeze an axis of size different than 1");(n.length===0&&e[o]>1||n.length>0&&!i)&&t.push(e[o])}return t}static unsqueezeShape(e,n){let t=new Array(e.length+n.length);t.fill(0);for(let i=0;i=t.length)throw new Error("'axes' has an out of range axis");if(t[s]!==0)throw new Error("'axes' has a duplicate axis");t[s]=1}let o=0;for(let i=0;i=t.length?t.push(n[a+2]):t[a]=n[a+2];for(let a=0;a=t[a]||s[a+t.length]>=t[a])throw new Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(e,n,t,o,i,s){if(s){if(i.length!==2*(e.length-2))throw new Error("length of pads should be twice the length of data dimensions");if(n.length!==e.length-2)throw new Error("length of strides should be the length of data dimensions");if(o.length!==e.length-2)throw new Error("length of kernel shapes should be the length of data dimensions");for(let a=0;a{"use strict";Cf=ln(xc());Da();Cn();ve=ln(pn());De();Ka=ee.experimental.fbs,Qe=class r{constructor(e,n,t,o,i,s=Cf.Guid.create()){this.dims=e;this.type=n;this.dataProvider=t;this.asyncDataProvider=o;this.cache=i;this.dataId=s;this.size=J.validateDimsAndCalcSize(e);let a=this.size,u=t===void 0&&o===void 0&&i===void 0;if(i!==void 0&&i.length!==a)throw new RangeError("Input dims doesn't match data length.");if(n==="string"){if(i!==void 0&&(!Array.isArray(i)||!i.every(l=>typeof l=="string")))throw new TypeError("cache should be a string array");u&&(this.cache=new Array(a))}else{if(i!==void 0){let l=kf(n);if(!(i instanceof l))throw new TypeError(`cache should be type ${l.name}`)}if(u){let l=new ArrayBuffer(a*_v(n));this.cache=Iv(l,n)}}}get data(){if(this.cache===void 0){let e=this.dataProvider(this.dataId);if(e.length!==this.size)throw new Error("Length of data provided by the Data Provider is inconsistent with the dims of this Tensor.");this.cache=e}return this.cache}get stringData(){if(this.type!=="string")throw new TypeError("data type is not string");return this.data}get integerData(){switch(this.type){case"uint8":case"int8":case"uint16":case"int16":case"int32":case"uint32":case"bool":return this.data;default:throw new TypeError("data type is not integer (uint8, int8, uint16, int16, int32, uint32, bool)")}}get floatData(){switch(this.type){case"float32":case"float64":return this.data;default:throw new TypeError("data type is not float (float32, float64)")}}get numberData(){if(this.type!=="string")return this.data;throw new TypeError("type cannot be non-number (string)")}get(e){return this.data[J.indicesToOffset(e,this.strides)]}set(e,n){this.data[J.indicesToOffset(e,this.strides)]=n}async getData(){return this.cache===void 0&&(this.cache=await this.asyncDataProvider(this.dataId)),this.cache}get strides(){return this._strides||(this._strides=J.computeStrides(this.dims)),this._strides}static fromProto(e){if(!e)throw new Error("cannot construct Value from an empty tensor");let n=lt.tensorDataTypeFromProto(e.dataType),t=lt.tensorDimsFromProto(e.dims),o=new r(t,n);if(n==="string")e.stringData.forEach((i,s)=>{o.data[s]=Rn(i)});else if(e.rawData&&typeof e.rawData.byteLength=="number"&&e.rawData.byteLength>0){let i=o.data,s=new DataView(e.rawData.buffer,e.rawData.byteOffset,e.rawData.byteLength),a=Of(e.dataType),u=e.rawData.byteLength/a;if(e.rawData.byteLength%a!==0)throw new Error("invalid buffer length");if(i.length!==u)throw new Error("buffer length mismatch");for(let l=0;l0){let i=o.data,s=new DataView(e.rawDataArray().buffer,e.rawDataArray().byteOffset,e.rawDataLength()),a=Of(e.dataType()),u=e.rawDataLength()/a;if(e.rawDataLength()%a!==0)throw new Error("invalid buffer length");if(i.length!==u)throw new Error("buffer length mismatch");for(let l=0;l{"use strict";_v={version:"",attribute:"attribute",varyingVertex:"varying",varyingFrag:"varying",texture2D:"texture2D",output:"gl_FragColor",outputDeclaration:""},Iv={version:"#version 300 es",attribute:"in",varyingVertex:"out",varyingFrag:"in",texture2D:"texture",output:"outputColor",outputDeclaration:"out vec4 outputColor;"}});var Se=C(()=>{"use strict"});async function Xa(r,e=t=>0,n){return new Promise((t,o)=>{let i=0,s=()=>{if(r()){t();return}i++;let a=e(i);if(n!=null&&i>=n){o();return}setTimeout(s,a)};s()})}function zo(r){return pn(typeof r<"u"&&r.length!==0,()=>"empty string found for sampler name"),"get"+r.charAt(0).toUpperCase()+r.slice(1)}function Rf(r){return pn(typeof r<"u"&&r.length!==0,()=>"empty string found for sampler name"),"get"+r.charAt(0).toUpperCase()+r.slice(1)+"AtOutCoords"}function mn(r,e){let n=JSON.parse(JSON.stringify(r));return n=e,n}function hn(r,e){return e.map(n=>r[n]).join(", ")}function bt(r){if(r<=1)return"int";if(r===2)return"ivec2";if(r===3)return"ivec3";if(r===4)return"ivec4";if(r===5)return"ivec5";if(r===6)return"ivec6";throw Error(`GPU for rank ${r} is not yet supported`)}function Gt(r=6){return["x","y","z","w","u","v"].slice(0,r)}var Qt=C(()=>{"use strict";De()});function Sv(r,e){return Gt(e).map(n=>`${r}.${n}`)}function gn(r,e){return e===1?[r]:Sv(r,e)}function er(){return` + `}var Sv,$v,He=C(()=>{"use strict";Sv={version:"",attribute:"attribute",varyingVertex:"varying",varyingFrag:"varying",texture2D:"texture2D",output:"gl_FragColor",outputDeclaration:""},$v={version:"#version 300 es",attribute:"in",varyingVertex:"out",varyingFrag:"in",texture2D:"texture",output:"outputColor",outputDeclaration:"out vec4 outputColor;"}});var Se=C(()=>{"use strict"});async function Za(r,e=t=>0,n){return new Promise((t,o)=>{let i=0,s=()=>{if(r()){t();return}i++;let a=e(i);if(n!=null&&i>=n){o();return}setTimeout(s,a)};s()})}function zo(r){return mn(typeof r<"u"&&r.length!==0,()=>"empty string found for sampler name"),"get"+r.charAt(0).toUpperCase()+r.slice(1)}function Rf(r){return mn(typeof r<"u"&&r.length!==0,()=>"empty string found for sampler name"),"get"+r.charAt(0).toUpperCase()+r.slice(1)+"AtOutCoords"}function hn(r,e){let n=JSON.parse(JSON.stringify(r));return n=e,n}function gn(r,e){return e.map(n=>r[n]).join(", ")}function bt(r){if(r<=1)return"int";if(r===2)return"ivec2";if(r===3)return"ivec3";if(r===4)return"ivec4";if(r===5)return"ivec5";if(r===6)return"ivec6";throw Error(`GPU for rank ${r} is not yet supported`)}function Gt(r=6){return["x","y","z","w","u","v"].slice(0,r)}var Qt=C(()=>{"use strict";De()});function Av(r,e){return Gt(e).map(n=>`${r}.${n}`)}function bn(r,e){return e===1?[r]:Av(r,e)}function er(){return` float getChannel(vec4 frag, int dim) { int modCoord = imod(dim, 2); return modCoord == 0 ? frag.r : frag.g; @@ -65,19 +65,19 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe (modCoord.y == 0. ? frag.r : frag.g) : (modCoord.y == 0. ? frag.b : frag.a); } - `}var Ur=C(()=>{"use strict";Qt()});function Av(r,e,n){if(r===0)return"false";if(r===1)return`rc > ${e[0]}`;let t="";for(let o=r-2;o= ${e[o-r+2]}`,o{"use strict";Qt()});function Ov(r,e,n){if(r===0)return"false";if(r===1)return`rc > ${e[0]}`;let t="";for(let o=r-2;o= ${e[o-r+2]}`,o= ${r[0]} ? 0. : getA(rc + 1), 0, 0`;let t="r, c",o="r, cp1",i="rp1, c",s="rp1, cp1",a="";if(n>2)for(let u=0;u= ${t}; bool cEdge = cp1 >= ${n}; - `}var Nf,$v,zf,Ff=C(()=>{"use strict";He();Se();Qt();Ur();Nf={name:"pack",inputNames:["A"],inputTypes:[1]},$v=(r,e)=>{let n=oe(r.session.backend.glContext.version),t=e.dims,o=t.length,i=e.dims.length,s=bt(i),a=gn("rc",i),u=Ov(i,a,t[t.length-2],t[t.length-1]),l;o===0?l=[1,1]:o===1?l=[t[0],1]:l=[t[i-1],t[i-2]];let f=Av(i,l,a),c=Pv(t,a),p=` + `}var Nf,Pv,zf,Ff=C(()=>{"use strict";He();Se();Qt();Ur();Nf={name:"pack",inputNames:["A"],inputTypes:[1]},Pv=(r,e)=>{let n=oe(r.session.backend.glContext.version),t=e.dims,o=t.length,i=e.dims.length,s=bt(i),a=bn("rc",i),u=Cv(i,a,t[t.length-2],t[t.length-1]),l;o===0?l=[1,1]:o===1?l=[t[0],1]:l=[t[i-1],t[i-2]];let f=Ov(i,l,a),c=Ev(t,a),p=` void main() { ${s} rc = getOutputCoords(); @@ -89,17 +89,17 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe ${n.output} = vec4(${c}); } } - `;return{...Nf,hasMain:!0,output:{dims:e.dims,type:e.type,textureType:2},shaderSource:p}},zf=(r,e)=>({...Nf,get:()=>$v(r,e)})});function Za(r){if(r.length===0)return[1,1,1];let e=1;for(let n=0;n1?r[r.length-2]:1,r[r.length-1]]}function Vf(r,e){let n=!1;return r.length===0||e.length===0?n=!0:r.length<2||e.length<2?n=r[r.length-1]===e[e.length-1]:n=r[r.length-1]===e[e.length-1]&&r[r.length-2]===e[e.length-2],n}function kv(r){let e=J.computeStrides(r),n=["b","r","c"],t="index";return` + `;return{...Nf,hasMain:!0,output:{dims:e.dims,type:e.type,textureType:2},shaderSource:p}},zf=(r,e)=>({...Nf,get:()=>Pv(r,e)})});function Ya(r){if(r.length===0)return[1,1,1];let e=1;for(let n=0;n1?r[r.length-2]:1,r[r.length-1]]}function Vf(r,e){let n=!1;return r.length===0||e.length===0?n=!0:r.length<2||e.length<2?n=r[r.length-1]===e[e.length-1]:n=r[r.length-1]===e[e.length-1]&&r[r.length-2]===e[e.length-2],n}function Bv(r){let e=J.computeStrides(r),n=["b","r","c"],t="index";return` ivec3 inputCoordsFromReshapedOutCoords(int index) { ${e.map((i,s)=>{let a=`int ${n[s]} = ${t} / ${i}`,u=s===e.length-1?`int ${n[s+1]} = ${t} - ${n[s]} * ${i}`:`index -= ${n[s]} * ${i}`;return`${a}; ${u};`}).join("")} return ivec3(b, r, c); } - `}function Dv(r){let e=J.computeStrides(r);return` + `}function Lv(r){let e=J.computeStrides(r);return` int getFlattenedIndex(ivec3 coords) { // reverse y, z order return coords.x * ${e[0]} + coords.z * ${e[1]} + coords.y; } -`}var Ev,Cv,Mf,Gf=C(()=>{"use strict";De();He();Se();Ur();Ev=r=>({name:"Reshape (packed)",inputTypes:[2],inputNames:["A"],cacheHint:`${r}`}),Cv=(r,e,n,t)=>{let o=e.dims,i=t,s="";for(let l=0;l<4;l++){let f="";switch(l){case 0:f="outputCoords = rc;";break;case 1:f="outputCoords = ivec3(rc.x, rc.y+1, rc.z);";break;case 2:f="outputCoords = ivec3(rc.x, rc.y, rc.z+1);";break;case 3:f="outputCoords = ivec3(rc.x, rc.y+1, rc.z+1);";break;default:throw new Error}s+=` +`}var kv,Dv,Mf,Gf=C(()=>{"use strict";De();He();Se();Ur();kv=r=>({name:"Reshape (packed)",inputTypes:[2],inputNames:["A"],cacheHint:`${r}`}),Dv=(r,e,n,t)=>{let o=e.dims,i=t,s="";for(let l=0;l<4;l++){let f="";switch(l){case 0:f="outputCoords = rc;";break;case 1:f="outputCoords = ivec3(rc.x, rc.y+1, rc.z);";break;case 2:f="outputCoords = ivec3(rc.x, rc.y, rc.z+1);";break;case 3:f="outputCoords = ivec3(rc.x, rc.y+1, rc.z+1);";break;default:throw new Error}s+=` ${f} ${l>0?"if(outputCoords.y < rows && outputCoords.z < cols){":""} int flattenedIndex = getFlattenedIndex(outputCoords); @@ -111,8 +111,8 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe ${l>0?"}":""} `}let a=oe(r.session.backend.glContext.version),u=` - ${kv(o)} - ${Dv(i)} + ${Bv(o)} + ${Lv(i)} ${er()} void main() { @@ -127,7 +127,7 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe ${s} ${a.output} = result; } - `;return{...n,output:{dims:i,type:e.type,textureType:2},shaderSource:u,hasMain:!0}},Mf=(r,e,n)=>{let t=Ev(n);return{...t,get:()=>Cv(r,e,t,n)}}});var Ya,Uf=C(()=>{"use strict";He();Se();Ya=(r,e)=>{let n=e.shape,t=oe(r.session.backend.glContext.version),o=` + `;return{...n,output:{dims:i,type:e.type,textureType:2},shaderSource:u,hasMain:!0}},Mf=(r,e,n)=>{let t=kv(n);return{...t,get:()=>Dv(r,e,t,n)}}});var Ja,Uf=C(()=>{"use strict";He();Se();Ja=(r,e)=>{let n=e.shape,t=oe(r.session.backend.glContext.version),o=` const float FLOAT_MAX = 1.70141184e38; const float FLOAT_MIN = 1.17549435e-38; @@ -174,7 +174,7 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe void main() { float value = ${t.texture2D}(X,TexCoords).r; ${t.output} = encodeAsUint8(value); - }`,i={name:"Uint8Encode",inputTypes:[0],inputNames:["X"],output:{dims:n,type:e.tensor.type,textureType:3},shaderSource:o,hasMain:!0};return r.executeProgram(i,[e.tensor])}});function Lv(r,e){if(r===1)return"rc";let n="";for(let t=0;t{"use strict";He();Se();Qt();Ur();Wf={name:"unpack",inputNames:["A"],inputTypes:[2]},Bv=(r,e)=>{let n=e.dims.length,t=gn("rc",n),o=t.slice(-2),i=bt(n),s=er(),u=e.dims.length===0?"":Lv(n,t),l=n<=1?"rc":`vec2(${o.join(",")})`,f=oe(r.session.backend.glContext.version),c=` + }`,i={name:"Uint8Encode",inputTypes:[0],inputNames:["X"],output:{dims:n,type:e.tensor.type,textureType:3},shaderSource:o,hasMain:!0};return r.executeProgram(i,[e.tensor])}});function Nv(r,e){if(r===1)return"rc";let n="";for(let t=0;t{"use strict";He();Se();Qt();Ur();Wf={name:"unpack",inputNames:["A"],inputTypes:[2]},Rv=(r,e)=>{let n=e.dims.length,t=bn("rc",n),o=t.slice(-2),i=bt(n),s=er(),u=e.dims.length===0?"":Nv(n,t),l=n<=1?"rc":`vec2(${o.join(",")})`,f=oe(r.session.backend.glContext.version),c=` ${s} void main() { ${i} rc = getOutputCoords(); @@ -184,7 +184,7 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe ${f.output} = vec4(getChannel(packedInput, ${l}), 0, 0, 0); } - `;return{...Wf,hasMain:!0,output:{dims:e.dims,type:e.type,textureType:0},shaderSource:c}},Hf=(r,e)=>({...Wf,get:()=>Bv(r,e)})});var Fo,Nn,Mo,zn=C(()=>{"use strict";Pt();Fo=class{constructor(e,n=1){if(n===1)this.internalFormat=e.R32F,this.format=e.RED,this.textureType=e.FLOAT,this.channelSize=n;else if(n===4)this.internalFormat=e.RGBA32F,this.format=e.RGBA,this.textureType=e.FLOAT,this.channelSize=n;else throw new Error(`Invalid number of channels: ${n}`)}encode(e,n){let t,o;return e.constructor!==Float32Array&&(Re.warning("Encoder","data was not of type Float32; creating new Float32Array"),o=new Float32Array(e)),n*this.channelSize>e.length?(Re.warning("Encoder","Source data too small. Allocating larger array"),o=e,t=this.allocate(n*this.channelSize),o.forEach((i,s)=>t[s]=i)):(o=e,t=o),t}allocate(e){return new Float32Array(e*4)}decode(e,n){return this.channelSize===1?e.filter((o,i)=>i%4===0).subarray(0,n):e.subarray(0,n)}},Nn=class{constructor(e,n=1,t){if(n!==1&&n!==4)throw new Error(`Invalid number of channels: ${n}`);this.internalFormat=e.RGBA,this.format=e.RGBA,this.channelSize=n,this.textureType=t||e.FLOAT}encode(e,n){let t=e;return this.channelSize===1&&(Re.verbose("Encoder","Exploding into a larger array"),t=this.allocate(n),e.forEach((o,i)=>t[i*4]=o)),t}allocate(e){return new Float32Array(e*4)}decode(e,n){return this.channelSize===1?e.filter((o,i)=>i%4===0).subarray(0,n):e.subarray(0,n)}},Mo=class{constructor(e,n=1){this.channelSize=4;if(n===1)this.internalFormat=e.ALPHA,this.format=e.ALPHA,this.textureType=e.UNSIGNED_BYTE,this.channelSize=n;else if(n===4)this.internalFormat=e.RGBA,this.format=e.RGBA,this.textureType=e.UNSIGNED_BYTE,this.channelSize=n;else throw new Error(`Invalid number of channels: ${n}`)}encode(e,n){return new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}allocate(e){return new Uint8Array(e*this.channelSize)}decode(e,n){if(e instanceof Uint8Array)return e.subarray(0,n);throw new Error(`Invalid array type: ${e.constructor}`)}}});var Fn,Kf,Ja,jf=C(()=>{"use strict";De();Se();Fn=(r,e,n)=>{let t=n===0||n===1?1:4,o=n===2,i=n===1||n===2,s=n===4?e.length-1:void 0,a=n===4?e.map((u,l)=>l===e.length-1?u*4:u):void 0;return Ja(r,e,t,a,{isPacked:o,reverseWH:i,breakAxis:s})},Kf=(r,e,n)=>{let t=Fn(r,e,n);return[t.width,t.height]},Ja=(r,e,n=1,t,o)=>{let i=!!(o&&o.isPacked),[s,a]=r.computeTextureWH(i&&t||e,o),u=e.length,l=e.slice(0);if(u===0&&(l=[1]),n===1)t=e;else if(i){if(n!==4)throw new Error("a packed texture must be 4-channel");t=e,u>0&&(l[u-1]=Math.ceil(l[u-1]/2)),u>1&&(l[u-2]=Math.ceil(l[u-2]/2))}else if(!t)throw new Error("Unpacked shape is needed when using channels > 1");return{width:s,height:a,channels:n,isPacked:i,shape:l,strides:J.computeStrides(l),unpackedShape:t,reversedWH:o&&o.reverseWH}}});var Nv,Vo,Zf=C(()=>{"use strict";Pt();Gr();De();Ff();Gf();Uf();qf();zn();jf();Se();Nv=(r,e)=>{let n=e.map(o=>`${o.unpackedShape.join(",")};${o.width}x${o.height}`).join("_"),t=r.name;return r.cacheHint&&(t+="["+r.cacheHint+"]"),t+=":"+n,t},Vo=class{constructor(e){this.session=e;this.packedTextureDataCache=new Map,this.unpackedTextureDataCache=new Map}calculateTextureWidthAndHeight(e,n){return Kf(this.session.layoutStrategy,e,n)}executeProgram(e,n){if(n.lengththis.readTexture(s),async a=>this.readTextureAsync(s),void 0,i),texture:t};return this.setTextureData(s.tensor.dataId,s,e.isPacked),s}getTextureData(e,n=!1){return this.session.isInitializer(e)?this.session.getTextureData(e,n):n?this.packedTextureDataCache.get(e):this.unpackedTextureDataCache.get(e)}setTextureData(e,n,t=!1){this.session.isInitializer(e)?this.session.setTextureData(e,n,t):(t?this.packedTextureDataCache:this.unpackedTextureDataCache).set(e,n)}isTextureLayoutCached(e,n=!1){return!!this.getTextureData(e.dataId,n)}dispose(){this.session.textureManager.clearActiveTextures(),this.packedTextureDataCache.forEach(e=>this.session.textureManager.releaseTexture(e)),this.packedTextureDataCache=new Map,this.unpackedTextureDataCache.forEach(e=>this.session.textureManager.releaseTexture(e)),this.unpackedTextureDataCache=new Map}readTexture(e){return e.isPacked?this.readTexture(this.unpack(e)):this.session.backend.glContext.isFloat32DownloadSupported?this.session.textureManager.readTexture(e,e.tensor.type,e.channels):this.session.textureManager.readUint8TextureAsFloat(Ya(this,e))}async readTextureAsync(e){return e.isPacked?this.readTextureAsync(this.unpack(e)):this.session.backend.glContext.isFloat32DownloadSupported?this.session.textureManager.readTextureAsync(e,e.tensor.type,e.channels):this.session.textureManager.readUint8TextureAsFloat(Ya(this,e))}pack(e){return this.executeProgram(zf(this,e.tensor),[e.tensor])}unpack(e){return this.executeProgram(Hf(this,e.tensor),[e.tensor])}}});var Qa,be,st=C(()=>{"use strict";Qa=class{constructor(e){Object.assign(this,e)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map(e=>`${this[e]}`).join(";")),this.key}},be=r=>new Qa(r)});var Yf,Jf,Qf,zv,Fv,ed=C(()=>{"use strict";st();He();Se();Yf={name:"BatchNormalization",inputNames:["A","Scale","B","Mean","Variance"],inputTypes:[0,0,0,0,0]},Jf=(r,e,n)=>(Fv(e),[r.run({...Yf,cacheHint:n.cacheKey,get:()=>zv(r,e,n)},e)]),Qf=r=>{let e=r.attributes.getFloat("epsilon",1e-5),n=r.attributes.getFloat("momentum",.9),t=r.attributes.getInt("spatial",1);return be({epsilon:e,momentum:n,spatial:t})},zv=(r,e,n)=>{let t=oe(r.session.backend.glContext.version),o=e[0].dims.length,[i,s]=r.calculateTextureWidthAndHeight(e[1].dims,0),a=` + `;return{...Wf,hasMain:!0,output:{dims:e.dims,type:e.type,textureType:0},shaderSource:c}},Hf=(r,e)=>({...Wf,get:()=>Rv(r,e)})});var Fo,Nn,Mo,zn=C(()=>{"use strict";Pt();Fo=class{constructor(e,n=1){if(n===1)this.internalFormat=e.R32F,this.format=e.RED,this.textureType=e.FLOAT,this.channelSize=n;else if(n===4)this.internalFormat=e.RGBA32F,this.format=e.RGBA,this.textureType=e.FLOAT,this.channelSize=n;else throw new Error(`Invalid number of channels: ${n}`)}encode(e,n){let t,o;return e.constructor!==Float32Array&&(Re.warning("Encoder","data was not of type Float32; creating new Float32Array"),o=new Float32Array(e)),n*this.channelSize>e.length?(Re.warning("Encoder","Source data too small. Allocating larger array"),o=e,t=this.allocate(n*this.channelSize),o.forEach((i,s)=>t[s]=i)):(o=e,t=o),t}allocate(e){return new Float32Array(e*4)}decode(e,n){return this.channelSize===1?e.filter((o,i)=>i%4===0).subarray(0,n):e.subarray(0,n)}},Nn=class{constructor(e,n=1,t){if(n!==1&&n!==4)throw new Error(`Invalid number of channels: ${n}`);this.internalFormat=e.RGBA,this.format=e.RGBA,this.channelSize=n,this.textureType=t||e.FLOAT}encode(e,n){let t=e;return this.channelSize===1&&(Re.verbose("Encoder","Exploding into a larger array"),t=this.allocate(n),e.forEach((o,i)=>t[i*4]=o)),t}allocate(e){return new Float32Array(e*4)}decode(e,n){return this.channelSize===1?e.filter((o,i)=>i%4===0).subarray(0,n):e.subarray(0,n)}},Mo=class{constructor(e,n=1){this.channelSize=4;if(n===1)this.internalFormat=e.ALPHA,this.format=e.ALPHA,this.textureType=e.UNSIGNED_BYTE,this.channelSize=n;else if(n===4)this.internalFormat=e.RGBA,this.format=e.RGBA,this.textureType=e.UNSIGNED_BYTE,this.channelSize=n;else throw new Error(`Invalid number of channels: ${n}`)}encode(e,n){return new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}allocate(e){return new Uint8Array(e*this.channelSize)}decode(e,n){if(e instanceof Uint8Array)return e.subarray(0,n);throw new Error(`Invalid array type: ${e.constructor}`)}}});var Fn,jf,Qa,Kf=C(()=>{"use strict";De();Se();Fn=(r,e,n)=>{let t=n===0||n===1?1:4,o=n===2,i=n===1||n===2,s=n===4?e.length-1:void 0,a=n===4?e.map((u,l)=>l===e.length-1?u*4:u):void 0;return Qa(r,e,t,a,{isPacked:o,reverseWH:i,breakAxis:s})},jf=(r,e,n)=>{let t=Fn(r,e,n);return[t.width,t.height]},Qa=(r,e,n=1,t,o)=>{let i=!!(o&&o.isPacked),[s,a]=r.computeTextureWH(i&&t||e,o),u=e.length,l=e.slice(0);if(u===0&&(l=[1]),n===1)t=e;else if(i){if(n!==4)throw new Error("a packed texture must be 4-channel");t=e,u>0&&(l[u-1]=Math.ceil(l[u-1]/2)),u>1&&(l[u-2]=Math.ceil(l[u-2]/2))}else if(!t)throw new Error("Unpacked shape is needed when using channels > 1");return{width:s,height:a,channels:n,isPacked:i,shape:l,strides:J.computeStrides(l),unpackedShape:t,reversedWH:o&&o.reverseWH}}});var Fv,Vo,Zf=C(()=>{"use strict";Pt();Gr();De();Ff();Gf();Uf();qf();zn();Kf();Se();Fv=(r,e)=>{let n=e.map(o=>`${o.unpackedShape.join(",")};${o.width}x${o.height}`).join("_"),t=r.name;return r.cacheHint&&(t+="["+r.cacheHint+"]"),t+=":"+n,t},Vo=class{constructor(e){this.session=e;this.packedTextureDataCache=new Map,this.unpackedTextureDataCache=new Map}calculateTextureWidthAndHeight(e,n){return jf(this.session.layoutStrategy,e,n)}executeProgram(e,n){if(n.lengththis.readTexture(s),async a=>this.readTextureAsync(s),void 0,i),texture:t};return this.setTextureData(s.tensor.dataId,s,e.isPacked),s}getTextureData(e,n=!1){return this.session.isInitializer(e)?this.session.getTextureData(e,n):n?this.packedTextureDataCache.get(e):this.unpackedTextureDataCache.get(e)}setTextureData(e,n,t=!1){this.session.isInitializer(e)?this.session.setTextureData(e,n,t):(t?this.packedTextureDataCache:this.unpackedTextureDataCache).set(e,n)}isTextureLayoutCached(e,n=!1){return!!this.getTextureData(e.dataId,n)}dispose(){this.session.textureManager.clearActiveTextures(),this.packedTextureDataCache.forEach(e=>this.session.textureManager.releaseTexture(e)),this.packedTextureDataCache=new Map,this.unpackedTextureDataCache.forEach(e=>this.session.textureManager.releaseTexture(e)),this.unpackedTextureDataCache=new Map}readTexture(e){return e.isPacked?this.readTexture(this.unpack(e)):this.session.backend.glContext.isFloat32DownloadSupported?this.session.textureManager.readTexture(e,e.tensor.type,e.channels):this.session.textureManager.readUint8TextureAsFloat(Ja(this,e))}async readTextureAsync(e){return e.isPacked?this.readTextureAsync(this.unpack(e)):this.session.backend.glContext.isFloat32DownloadSupported?this.session.textureManager.readTextureAsync(e,e.tensor.type,e.channels):this.session.textureManager.readUint8TextureAsFloat(Ja(this,e))}pack(e){return this.executeProgram(zf(this,e.tensor),[e.tensor])}unpack(e){return this.executeProgram(Hf(this,e.tensor),[e.tensor])}}});var es,be,st=C(()=>{"use strict";es=class{constructor(e){Object.assign(this,e)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map(e=>`${this[e]}`).join(";")),this.key}},be=r=>new es(r)});var Yf,Jf,Qf,Mv,Vv,ed=C(()=>{"use strict";st();He();Se();Yf={name:"BatchNormalization",inputNames:["A","Scale","B","Mean","Variance"],inputTypes:[0,0,0,0,0]},Jf=(r,e,n)=>(Vv(e),[r.run({...Yf,cacheHint:n.cacheKey,get:()=>Mv(r,e,n)},e)]),Qf=r=>{let e=r.attributes.getFloat("epsilon",1e-5),n=r.attributes.getFloat("momentum",.9),t=r.attributes.getInt("spatial",1);return be({epsilon:e,momentum:n,spatial:t})},Mv=(r,e,n)=>{let t=oe(r.session.backend.glContext.version),o=e[0].dims.length,[i,s]=r.calculateTextureWidthAndHeight(e[1].dims,0),a=` float process(int[${o}] indices) { vec2 position = offsetToCoords(indices[1], ${i}, ${s}); float scale = getColorAsFloat(${t.texture2D}(Scale, position)); @@ -193,42 +193,42 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe float b = getColorAsFloat(${t.texture2D}(B, position)); return scale * ( (_A(indices) - mean) / sqrt(variance + float(${n.epsilon})) ) + b; - }`;return{...Yf,output:{dims:e[0].dims,type:e[0].type,textureType:0},shaderSource:a}},Fv=r=>{if(!r||r.length!==5)throw new Error("BatchNormalization requires 5 inputs.");let e=r[0],n=r[1],t=r[2],o=r[3],i=r[4];if(e.dims.length<3||n.dims.length!==1||t.dims.length!==1||o.dims.length!==1||i.dims.length!==1)throw new Error("invalid input shape.");if(n.dims[0]!==e.dims[1]||t.dims[0]!==e.dims[1]||o.dims[0]!==e.dims[1]||i.dims[0]!==e.dims[1])throw new Error("invalid input shape.");if(e.type!=="float32"&&e.type!=="float64"||n.type!=="float32"&&n.type!=="float64"||t.type!=="float32"&&t.type!=="float64"||o.type!=="float32"&&o.type!=="float64"||i.type!=="float32"&&i.type!=="float64")throw new Error("invalid input tensor types.")}});var Go,kt,X,Mn,Uo,pr=C(()=>{"use strict";Go=class{constructor(e,n,t,o){this.glContext=e;this.programInfo=n;this.inputTextureLayouts=t;this.outputTextureLayout=o}},kt=class{constructor(e){this.context=e}},X=class{constructor(e,n){this.routineBody=e;this.dependencies=n}},Mn=class{constructor(e,n,t){this.name=e;t?this.dependencies=t:this.dependencies=[],n&&(this.routineBody=n)}addDependency(e){e&&this.dependencies.push(e)}},Uo=class{static returnOrderedNodes(e){if(!e||e.length===0)return[];if(e.length===1)return e;let n=new Set,t=new Set,o=new Array;return this.createOrderedNodes(e,n,t,o),o}static createOrderedNodes(e,n,t,o){for(let i=0;i0)for(let s=0;s{if(!r||r.length!==5)throw new Error("BatchNormalization requires 5 inputs.");let e=r[0],n=r[1],t=r[2],o=r[3],i=r[4];if(e.dims.length<3||n.dims.length!==1||t.dims.length!==1||o.dims.length!==1||i.dims.length!==1)throw new Error("invalid input shape.");if(n.dims[0]!==e.dims[1]||t.dims[0]!==e.dims[1]||o.dims[0]!==e.dims[1]||i.dims[0]!==e.dims[1])throw new Error("invalid input shape.");if(e.type!=="float32"&&e.type!=="float64"||n.type!=="float32"&&n.type!=="float64"||t.type!=="float32"&&t.type!=="float64"||o.type!=="float32"&&o.type!=="float64"||i.type!=="float32"&&i.type!=="float64")throw new Error("invalid input tensor types.")}});var Go,kt,X,Mn,Uo,pr=C(()=>{"use strict";Go=class{constructor(e,n,t,o){this.glContext=e;this.programInfo=n;this.inputTextureLayouts=t;this.outputTextureLayout=o}},kt=class{constructor(e){this.context=e}},X=class{constructor(e,n){this.routineBody=e;this.dependencies=n}},Mn=class{constructor(e,n,t){this.name=e;t?this.dependencies=t:this.dependencies=[],n&&(this.routineBody=n)}addDependency(e){e&&this.dependencies.push(e)}},Uo=class{static returnOrderedNodes(e){if(!e||e.length===0)return[];if(e.length===1)return e;let n=new Set,t=new Set,o=new Array;return this.createOrderedNodes(e,n,t,o),o}static createOrderedNodes(e,n,t,o){for(let i=0;i0)for(let s=0;s b); } @@ -238,7 +238,7 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe v1.b > v2.b, v1.a > v2.a ); } - `,name:r,type:0}}function Kv(){let r="less_";return{body:` + `,name:r,type:0}}function Xv(){let r="less_";return{body:` float ${r}(float a, float b) { return float(a < b); } @@ -248,7 +248,7 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe v1.b < v2.b, v1.a < v2.a ); } - `,name:r,type:0}}function jv(){let r="and_";return{body:` + `,name:r,type:0}}function Zv(){let r="and_";return{body:` float ${r}(float a, float b) { return float( bool(a) && bool(b) ); } @@ -260,7 +260,7 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe b1.b && b2.b, b1.a && b2.a ); } - `,name:r,type:0}}function Xv(){let r="or_";return{body:` + `,name:r,type:0}}function Yv(){let r="or_";return{body:` float ${r}(float a, float b) { return float( bool(a) || bool(b) ); } @@ -272,7 +272,7 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe b1.b || b2.b, b1.a || b2.a ); } - `,name:r,type:0}}function Zv(){let r="xor_";return{body:` + `,name:r,type:0}}function Jv(){let r="xor_";return{body:` float ${r}(float a, float b) { return float( bool(a) ^^ bool(b) ); } @@ -284,7 +284,7 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe b1.b ^^ b2.b, b1.a ^^ b2.a ); } - `,name:r,type:0}}function Yv(){return Qv("pow")}function Jv(){let r="prelu_";return{body:` + `,name:r,type:0}}function Qv(){return tw("pow")}function ew(){let r="prelu_";return{body:` float ${r}(float a, float b) { return a < 0.0 ? a * b: a; } @@ -296,14 +296,14 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe v1.a < 0.0 ? v1.a * v2.a: v1.a ); } - `,name:r,type:0}}function Qv(r){let e=`${r}_`;return{body:` + `,name:r,type:0}}function tw(r){let e=`${r}_`;return{body:` float ${e}(float a, float b) { return ${r}(a, b); } vec4 ${e}(vec4 v1, vec4 v2) { return ${r}(v1, v2); } - `,name:e,type:0}}var Dt,ew,td,rd,nd,od,id,ad,sd,ud,ld,cd,fd,dd,pd=C(()=>{"use strict";De();pr();He();Se();Dt=(r,e,n,t=e[0].type,o)=>{let i=r.session.pack?2:0;return{name:n.name,inputNames:["A","B"],inputTypes:[i,i],cacheHint:o,get:()=>ew(r,e,n,t)}},ew=(r,e,n,t=e[0].type)=>{let o=r.session.pack?2:0,i=!J.areEqual(e[0].dims,e[1].dims),s=e[0].dims,a=r.session.pack;if(i){let f=gt.calcShape(e[0].dims,e[1].dims,!1);if(!f)throw new Error("Can't perform binary op on the given tensors");s=f;let c=s.length,p=e[0].dims.length!==0?e[0].dims.length:1,b=e[1].dims.length!==0?e[1].dims.length:1,h=e[0].dims.length!==0?"bcastIndices_A(indices, aindices);":"aindices[0] = 0;",g=e[1].dims.length!==0?"bcastIndices_B(indices, bindices);":"bindices[0] = 0;",T=oe(r.session.backend.glContext.version),w=a?` + `,name:e,type:0}}var Dt,rw,td,rd,nd,od,id,ad,sd,ud,ld,cd,fd,dd,pd=C(()=>{"use strict";De();pr();He();Se();Dt=(r,e,n,t=e[0].type,o)=>{let i=r.session.pack?2:0;return{name:n.name,inputNames:["A","B"],inputTypes:[i,i],cacheHint:o,get:()=>rw(r,e,n,t)}},rw=(r,e,n,t=e[0].type)=>{let o=r.session.pack?2:0,i=!J.areEqual(e[0].dims,e[1].dims),s=e[0].dims,a=r.session.pack;if(i){let f=gt.calcShape(e[0].dims,e[1].dims,!1);if(!f)throw new Error("Can't perform binary op on the given tensors");s=f;let c=s.length,p=e[0].dims.length!==0?e[0].dims.length:1,b=e[1].dims.length!==0?e[1].dims.length:1,h=e[0].dims.length!==0?"bcastIndices_A(indices, aindices);":"aindices[0] = 0;",g=e[1].dims.length!==0?"bcastIndices_B(indices, bindices);":"bindices[0] = 0;",T=oe(r.session.backend.glContext.version),w=a?` ${n.body} void main() { vec4 a = getAAtOutCoords(); @@ -326,7 +326,7 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe vec4 result = ${n.name}(v1, v2); ${u.output} = result; } - `;return{name:n.name,inputNames:["A","B"],inputTypes:[o,o],output:{dims:e[0].dims,type:t,textureType:o},shaderSource:l,hasMain:!0}},td=(r,e)=>[r.run(Dt(r,e,Vv()),e)],rd=(r,e)=>[r.run(Dt(r,e,jv(),"bool"),e)],nd=(r,e)=>[r.run(Dt(r,e,Gv()),e)],od=(r,e)=>[r.run(Dt(r,e,Hv(),"bool"),e)],id=(r,e)=>[r.run(Dt(r,e,qv(),"bool"),e)],ad=(r,e)=>[r.run(Dt(r,e,Kv(),"bool"),e)],sd=(r,e)=>[r.run(Dt(r,e,Uv()),e)],ud=(r,e)=>[r.run(Dt(r,e,Xv(),"bool"),e)],ld=(r,e)=>[r.run(Dt(r,e,Yv()),e)],cd=(r,e)=>[r.run(Dt(r,e,Jv()),e)],fd=(r,e)=>[r.run(Dt(r,e,Wv()),e)],dd=(r,e)=>[r.run(Dt(r,e,Zv(),"bool"),e)]});var md,hd,rw,gd=C(()=>{"use strict";De();md=(r,e,n)=>(rw(e),[r.cast(e[0],n)]),hd=r=>lt.tensorDataTypeFromProto(r.attributes.getInt("to")),rw=r=>{if(!r||r.length!==1)throw new Error("Cast requires 1 input.");if(r[0].type==="string")throw new Error("Invalid input type.")}});var nw,ow,bd,Wo,yd=C(()=>{"use strict";He();Se();Qt();Ur();nw=(r,e)=>({name:"Concat (packed)",inputNames:Array.from({length:r},(n,t)=>`X${t}`),inputTypes:Array(r).fill(2),cacheHint:e}),ow=(r,e,n,t)=>{let o=n[0].dims.slice();if(t>=o.length||t<-1*o.length)throw new Error("axis specified for concat doesn't match input dimensionality");t<0&&(t=o.length+t);let i=o.slice(0);for(let P=1;PP.dims),c=Gt(s),p=new Array(f.length-1);p[0]=f[0][t];for(let P=1;P[r.run(Dt(r,e,Uv()),e)],rd=(r,e)=>[r.run(Dt(r,e,Zv(),"bool"),e)],nd=(r,e)=>[r.run(Dt(r,e,Wv()),e)],od=(r,e)=>[r.run(Dt(r,e,jv(),"bool"),e)],id=(r,e)=>[r.run(Dt(r,e,Kv(),"bool"),e)],ad=(r,e)=>[r.run(Dt(r,e,Xv(),"bool"),e)],sd=(r,e)=>[r.run(Dt(r,e,Hv()),e)],ud=(r,e)=>[r.run(Dt(r,e,Yv(),"bool"),e)],ld=(r,e)=>[r.run(Dt(r,e,Qv()),e)],cd=(r,e)=>[r.run(Dt(r,e,ew()),e)],fd=(r,e)=>[r.run(Dt(r,e,qv()),e)],dd=(r,e)=>[r.run(Dt(r,e,Jv(),"bool"),e)]});var md,hd,ow,gd=C(()=>{"use strict";De();md=(r,e,n)=>(ow(e),[r.cast(e[0],n)]),hd=r=>lt.tensorDataTypeFromProto(r.attributes.getInt("to")),ow=r=>{if(!r||r.length!==1)throw new Error("Cast requires 1 input.");if(r[0].type==="string")throw new Error("Invalid input type.")}});var iw,aw,bd,Wo,yd=C(()=>{"use strict";He();Se();Qt();Ur();iw=(r,e)=>({name:"Concat (packed)",inputNames:Array.from({length:r},(n,t)=>`X${t}`),inputTypes:Array(r).fill(2),cacheHint:e}),aw=(r,e,n,t)=>{let o=n[0].dims.slice();if(t>=o.length||t<-1*o.length)throw new Error("axis specified for concat doesn't match input dimensionality");t<0&&(t=o.length+t);let i=o.slice(0);for(let P=1;PP.dims),c=Gt(s),p=new Array(f.length-1);p[0]=f[0][t];for(let P=1;P{let t=nw(e.length,n.cacheKey);return{...t,get:()=>ow(r,t,e,n.axis)}},Wo=(r,e,n)=>{let t=r.indexOf(e);return r.map((i,s)=>s===t?`${i} - ${n}`:i).join()}});var xd,iw,aw,sw,vd,uw,lw,cw,wd,fw,Td=C(()=>{"use strict";st();Se();yd();xd=(r,e,n)=>(fw(e),r.session.pack&&e[0].dims.length>1?[r.run(bd(r,e,n),e)]:[r.run(sw(r,e,n),e)]),iw=(r,e)=>({name:"Concat",inputNames:Array.from({length:r},(n,t)=>`X${t}`),inputTypes:Array(r).fill(0),cacheHint:e}),aw=(r,e,n,t)=>{let o=n[0].dims.slice();if(t>=o.length||t<-1*o.length)throw new Error("axis specified for concat doesn't match input dimensionality");t<0&&(t=o.length+t);let i=o.slice(0);for(let b=1;b{let t=iw(e.length,n.cacheKey);return{...t,get:()=>aw(r,t,e,n.axis)}},Wo=(r,e,n)=>{let t=r.indexOf(e);return r.map((i,s)=>s===t?`${i} - ${n}`:i).join()}});var xd,sw,uw,lw,vd,cw,fw,dw,wd,pw,Td=C(()=>{"use strict";st();Se();yd();xd=(r,e,n)=>(pw(e),r.session.pack&&e[0].dims.length>1?[r.run(bd(r,e,n),e)]:[r.run(lw(r,e,n),e)]),sw=(r,e)=>({name:"Concat",inputNames:Array.from({length:r},(n,t)=>`X${t}`),inputTypes:Array(r).fill(0),cacheHint:e}),uw=(r,e,n,t)=>{let o=n[0].dims.slice();if(t>=o.length||t<-1*o.length)throw new Error("axis specified for concat doesn't match input dimensionality");t<0&&(t=o.length+t);let i=o.slice(0);for(let b=1;b{let t=iw(e.length,n.cacheKey);return{...t,get:()=>aw(r,t,e,n.axis)}},vd=r=>`int getTextureWhereDataResides(int index) { + }`;return{...e,output:{dims:i,type:n[0].type,textureType:0},shaderSource:p}},lw=(r,e,n)=>{let t=sw(e.length,n.cacheKey);return{...t,get:()=>uw(r,t,e,n.axis)}},vd=r=>`int getTextureWhereDataResides(int index) { ${r.map((n,t)=>`if(index<${n}) {return ${t};} `).join("")} - }`,uw=r=>vd(r),lw=(r,e)=>{let n=[`float fetchDataFromCorrectTexture(int textureIndex, int indices[${e}]) {`];for(let t=0;t{let e=["int getSizeInConcatAxisValueFromIndex(int index) {"];for(let n=0;nbe({axis:r.attributes.getInt("axis")}),fw=r=>{if(!r||r.length<1)throw new Error("too few inputs");let e=r[0].type,n=r[0].dims.length;if(e==="string")throw new Error("string tensor is not supported yet");for(let t of r){if(t.type!==e)throw new Error("input tensors should be one type");if(t.dims.length!==n)throw new Error("input tensors should have the same shape")}}});function dw(){return Bt("abs")}function pw(){return Bt("acos")}function mw(){return Bt("asin")}function hw(){return Bt("atan")}function gw(){return Bt("ceil")}function bw(){return Bt("cos")}function yw(r){let e="elu";return{body:` + }`,cw=r=>vd(r),fw=(r,e)=>{let n=[`float fetchDataFromCorrectTexture(int textureIndex, int indices[${e}]) {`];for(let t=0;t{let e=["int getSizeInConcatAxisValueFromIndex(int index) {"];for(let n=0;nbe({axis:r.attributes.getInt("axis")}),pw=r=>{if(!r||r.length<1)throw new Error("too few inputs");let e=r[0].type,n=r[0].dims.length;if(e==="string")throw new Error("string tensor is not supported yet");for(let t of r){if(t.type!==e)throw new Error("input tensors should be one type");if(t.dims.length!==n)throw new Error("input tensors should have the same shape")}}});function mw(){return Bt("abs")}function hw(){return Bt("acos")}function gw(){return Bt("asin")}function bw(){return Bt("atan")}function yw(){return Bt("ceil")}function xw(){return Bt("cos")}function vw(r){let e="elu";return{body:` const float alpha = float(${r}); float ${e}_(float a) { @@ -394,7 +394,7 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe vec4 ${e}_(vec4 v) { return vec4(${e}_(v.x), ${e}_(v.y), ${e}_(v.z), ${e}_(v.w)); } - `,name:e,type:0}}function xw(){return Bt("exp")}function vw(){return Bt("floor")}function es(r,e){let n="clip";return{body:` + `,name:e,type:0}}function ww(){return Bt("exp")}function Tw(){return Bt("floor")}function ts(r,e){let n="clip";return{body:` const float min = float(${r}); const float max = float(${e}); @@ -404,14 +404,14 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe vec4 ${n}_(vec4 v) { return clamp(v, min, max); } - `,name:n,type:0}}function ww(){let r="indentity";return{body:` + `,name:n,type:0}}function _w(){let r="indentity";return{body:` float ${r}_(float a) { return a; } vec4 ${r}_(vec4 v) { return v; } - `,name:r,type:0}}function Tw(r){let e="leakyRelu";return{body:` + `,name:r,type:0}}function Iw(r){let e="leakyRelu";return{body:` const float alpha = float(${r}); float ${e}_(float a) { @@ -420,14 +420,14 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe vec4 ${e}_(vec4 v) { return vec4(${e}_(v.x), ${e}_(v.y), ${e}_(v.z), ${e}_(v.w)); } - `,name:e,type:0}}function _w(){return Bt("log")}function Iw(){let r="neg";return{body:` + `,name:e,type:0}}function Sw(){return Bt("log")}function $w(){let r="neg";return{body:` float ${r}_(float a) { return -a; } vec4 ${r}_(vec4 v) { return -v; } - `,name:r,type:0}}function Sw(){let r="not";return{body:` + `,name:r,type:0}}function Aw(){let r="not";return{body:` float ${r}_(float a) { return float( ! bool(a) ); } @@ -440,21 +440,21 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe bvec4 ${r}_(bvec4 v) { return bvec4(!v.x, !v.y, !v.z, !v.w); } - `,name:r,type:0}}function $w(){return Bt("sin")}function ts(){let r="relu";return{body:` + `,name:r,type:0}}function Pw(){return Bt("sin")}function rs(){let r="relu";return{body:` float ${r}_(float a) { return max( a, 0.0 ); } vec4 ${r}_(vec4 v) { return max( v, 0.0 ); } - `,name:r,type:0}}function rs(){let r="sigmoid";return{body:` + `,name:r,type:0}}function ns(){let r="sigmoid";return{body:` float ${r}_(float a) { return 1.0 / (1.0 + exp(-a)); } vec4 ${r}_(vec4 v) { return 1.0 / (1.0 + exp(-v)); } - `,name:r,type:0}}function Aw(){return Bt("sqrt")}function Pw(){return Bt("tan")}function Ow(){let r="tanh";return{body:` + `,name:r,type:0}}function Ow(){return Bt("sqrt")}function Ew(){return Bt("tan")}function Cw(){let r="tanh";return{body:` float ${r}_(float a) { a = clamp(a, -10., 10.); a = exp(2.*a); @@ -472,14 +472,14 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe vec4 ${r}_(vec4 v) { return ${r}(v); } - `,name:r,type:0}}var Ew,Ze,_d,Id,Sd,$d,ns,Ad,Pd,Cw,Od,Ed,Cd,kd,Dd,Bd,os,Ld,Rd,Nd,zd,Fd,Md,Vd,Gd,Ud,Wd,Hd,is=C(()=>{"use strict";st();De();pr();He();Se();Ew=(r,e,n,t)=>{let o=r.session.pack?2:0,i=oe(r.session.backend.glContext.version);return{...e,output:{dims:n.dims,type:n.type,textureType:o},shaderSource:` + `,name:r,type:0}}var kw,Ze,_d,Id,Sd,$d,os,Ad,Pd,Dw,Od,Ed,Cd,kd,Dd,Bd,is,Ld,Rd,Nd,zd,Fd,Md,Vd,Gd,Ud,Wd,Hd,as=C(()=>{"use strict";st();De();pr();He();Se();kw=(r,e,n,t)=>{let o=r.session.pack?2:0,i=oe(r.session.backend.glContext.version);return{...e,output:{dims:n.dims,type:n.type,textureType:o},shaderSource:` ${t.body} void main() { vec4 v = ${i.texture2D}(A, TexCoords); v = ${t.name}_(v); ${i.output} = v; } - `,hasMain:!0}},Ze=(r,e,n,t)=>{let o=r.session.pack?2:0,i={name:n.name,inputTypes:[o],inputNames:["A"],cacheHint:t};return{...i,get:()=>Ew(r,i,e,n)}},_d=(r,e)=>[r.run(Ze(r,e[0],dw()),e)],Id=(r,e)=>[r.run(Ze(r,e[0],pw()),e)],Sd=(r,e)=>[r.run(Ze(r,e[0],mw()),e)],$d=(r,e)=>[r.run(Ze(r,e[0],hw()),e)],ns=(r,e,n)=>[r.run(Ze(r,e[0],es(n.min,n.max),n.cacheKey),e)],Ad=r=>be({min:r.attributes.getFloat("min",Mr),max:r.attributes.getFloat("max",Vr)}),Pd=(r,e)=>{let n=Cw(r,e);return ns(r,[e[0]],n)},Cw=(r,e)=>{if(e.length>=3&&(!r.session.isInitializer(e[1].dataId)||!r.session.isInitializer(e[2].dataId)))throw new Error("dynamic clip attributes are not allowed");let n=e.length>=3?e[1].numberData[0]:Mr,t=e.length>=3?e[2].numberData[0]:Vr;return be({min:n,max:t})},Od=(r,e)=>[r.run(Ze(r,e[0],gw()),e)],Ed=(r,e)=>[r.run(Ze(r,e[0],bw()),e)],Cd=(r,e,n)=>[r.run(Ze(r,e[0],yw(n.alpha),n.cacheKey),e)],kd=r=>be({alpha:r.attributes.getFloat("alpha",1)}),Dd=(r,e)=>[r.run(Ze(r,e[0],xw()),e)],Bd=(r,e)=>[r.run(Ze(r,e[0],vw()),e)],os=(r,e)=>[r.run(Ze(r,e[0],ww()),e)],Ld=(r,e,n)=>[r.run(Ze(r,e[0],Tw(n.alpha),n.cacheKey),e)],Rd=r=>be({alpha:r.attributes.getFloat("alpha",.01)}),Nd=(r,e)=>[r.run(Ze(r,e[0],_w()),e)],zd=(r,e)=>[r.run(Ze(r,e[0],Iw()),e)],Fd=(r,e)=>[r.run(Ze(r,e[0],Sw()),e)],Md=(r,e)=>[r.run(Ze(r,e[0],ts()),e)],Vd=(r,e)=>[r.run(Ze(r,e[0],rs()),e)],Gd=(r,e)=>[r.run(Ze(r,e[0],$w()),e)],Ud=(r,e)=>[r.run(Ze(r,e[0],Aw()),e)],Wd=(r,e)=>[r.run(Ze(r,e[0],Pw()),e)],Hd=(r,e)=>[r.run(Ze(r,e[0],Ow()),e)]});function tr(r){let e;switch(r.activation){case"Relu":e=ts();break;case"Sigmoid":e=rs();break;case"Clip":e=es(r.clipMin,r.clipMax);break;default:return{activationFunction:"",applyActivation:""}}let n=e.name,t=e.body,o=`value = ${n}_(value);`;return{activationFunction:t,applyActivation:o}}var bn,Wr=C(()=>{"use strict";De();is();bn=r=>{let e=r.getString("activation","");if(e==="Clip"){let[n,t]=r.getFloats("activation_params",[Mr,Vr]);return{activation:e,clipMax:t,clipMin:n,activationCacheKey:`${e}:${n},${t}`}}return{activation:e,activationCacheKey:e}}});var Dw,Bw,qd,Kd=C(()=>{"use strict";Pt();He();Se();Ho();Wr();Dw=(r,e)=>({name:"GroupedConv",inputNames:r?["X","W","Bias"]:["X","W"],inputTypes:r?[0,0,0]:[0,0],cacheHint:e}),Bw=(r,e,n,t)=>{let i=e.length>2?"value += getBias(output_channel);":"",s=e[0].dims.slice(),a=e[1].dims.slice(),u=a[0]/t.group;Re.verbose("GroupedConv",`autpPad:${t.autoPad}, dilations:${t.dilations}, group:${t.group}, kernelShape:${t.kernelShape}, pads:${t.pads}, strides:${t.strides}`);let l=yn(s,a,t.dilations,t.pads,t.strides),f=oe(r.session.backend.glContext.version),{activationFunction:c,applyActivation:p}=tr(t),b=` + `,hasMain:!0}},Ze=(r,e,n,t)=>{let o=r.session.pack?2:0,i={name:n.name,inputTypes:[o],inputNames:["A"],cacheHint:t};return{...i,get:()=>kw(r,i,e,n)}},_d=(r,e)=>[r.run(Ze(r,e[0],mw()),e)],Id=(r,e)=>[r.run(Ze(r,e[0],hw()),e)],Sd=(r,e)=>[r.run(Ze(r,e[0],gw()),e)],$d=(r,e)=>[r.run(Ze(r,e[0],bw()),e)],os=(r,e,n)=>[r.run(Ze(r,e[0],ts(n.min,n.max),n.cacheKey),e)],Ad=r=>be({min:r.attributes.getFloat("min",Mr),max:r.attributes.getFloat("max",Vr)}),Pd=(r,e)=>{let n=Dw(r,e);return os(r,[e[0]],n)},Dw=(r,e)=>{if(e.length>=3&&(!r.session.isInitializer(e[1].dataId)||!r.session.isInitializer(e[2].dataId)))throw new Error("dynamic clip attributes are not allowed");let n=e.length>=3?e[1].numberData[0]:Mr,t=e.length>=3?e[2].numberData[0]:Vr;return be({min:n,max:t})},Od=(r,e)=>[r.run(Ze(r,e[0],yw()),e)],Ed=(r,e)=>[r.run(Ze(r,e[0],xw()),e)],Cd=(r,e,n)=>[r.run(Ze(r,e[0],vw(n.alpha),n.cacheKey),e)],kd=r=>be({alpha:r.attributes.getFloat("alpha",1)}),Dd=(r,e)=>[r.run(Ze(r,e[0],ww()),e)],Bd=(r,e)=>[r.run(Ze(r,e[0],Tw()),e)],is=(r,e)=>[r.run(Ze(r,e[0],_w()),e)],Ld=(r,e,n)=>[r.run(Ze(r,e[0],Iw(n.alpha),n.cacheKey),e)],Rd=r=>be({alpha:r.attributes.getFloat("alpha",.01)}),Nd=(r,e)=>[r.run(Ze(r,e[0],Sw()),e)],zd=(r,e)=>[r.run(Ze(r,e[0],$w()),e)],Fd=(r,e)=>[r.run(Ze(r,e[0],Aw()),e)],Md=(r,e)=>[r.run(Ze(r,e[0],rs()),e)],Vd=(r,e)=>[r.run(Ze(r,e[0],ns()),e)],Gd=(r,e)=>[r.run(Ze(r,e[0],Pw()),e)],Ud=(r,e)=>[r.run(Ze(r,e[0],Ow()),e)],Wd=(r,e)=>[r.run(Ze(r,e[0],Ew()),e)],Hd=(r,e)=>[r.run(Ze(r,e[0],Cw()),e)]});function tr(r){let e;switch(r.activation){case"Relu":e=rs();break;case"Sigmoid":e=ns();break;case"Clip":e=ts(r.clipMin,r.clipMax);break;default:return{activationFunction:"",applyActivation:""}}let n=e.name,t=e.body,o=`value = ${n}_(value);`;return{activationFunction:t,applyActivation:o}}var yn,Wr=C(()=>{"use strict";De();as();yn=r=>{let e=r.getString("activation","");if(e==="Clip"){let[n,t]=r.getFloats("activation_params",[Mr,Vr]);return{activation:e,clipMax:t,clipMin:n,activationCacheKey:`${e}:${n},${t}`}}return{activation:e,activationCacheKey:e}}});var Lw,Rw,qd,jd=C(()=>{"use strict";Pt();He();Se();Ho();Wr();Lw=(r,e)=>({name:"GroupedConv",inputNames:r?["X","W","Bias"]:["X","W"],inputTypes:r?[0,0,0]:[0,0],cacheHint:e}),Rw=(r,e,n,t)=>{let i=e.length>2?"value += getBias(output_channel);":"",s=e[0].dims.slice(),a=e[1].dims.slice(),u=a[0]/t.group;Re.verbose("GroupedConv",`autpPad:${t.autoPad}, dilations:${t.dilations}, group:${t.group}, kernelShape:${t.kernelShape}, pads:${t.pads}, strides:${t.strides}`);let l=xn(s,a,t.dilations,t.pads,t.strides),f=oe(r.session.backend.glContext.version),{activationFunction:c,applyActivation:p}=tr(t),b=` const ivec2 strides = ivec2(${t.strides[0]}, ${t.strides[1]}); const ivec2 pads = ivec2(${t.pads[0]}, ${t.pads[1]}); ${c} @@ -516,7 +516,7 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe ${p} ${f.output} = vec4(value, .0, .0, .0); } -`;return{...n,output:{dims:l,type:e[0].type,textureType:0},shaderSource:b,hasMain:!0}},qd=(r,e,n)=>{let t=Dw(e.length>2,n.cacheKey);return{...t,get:()=>Bw(r,e,t,n)}}});var Lw,Rw,jd,Xd=C(()=>{"use strict";He();Se();Ur();Lw=r=>({name:"Im2Col (packed)",inputNames:["A"],inputTypes:[2],cacheHint:r}),Rw=(r,e,n,t,o,i)=>{let s=n.dims,a=t.dims,u=2,l=3,f=o.length,c=[a[1]*a[2]*a[3],o[2]*o[3]],p=a[2]*a[3],b=er(),h=oe(r.session.backend.glContext.version),g="";for(let w=0;w<=1;w++)for(let v=0;v<=1;v++)g+=` +`;return{...n,output:{dims:l,type:e[0].type,textureType:0},shaderSource:b,hasMain:!0}},qd=(r,e,n)=>{let t=Lw(e.length>2,n.cacheKey);return{...t,get:()=>Rw(r,e,t,n)}}});var Nw,zw,Kd,Xd=C(()=>{"use strict";He();Se();Ur();Nw=r=>({name:"Im2Col (packed)",inputNames:["A"],inputTypes:[2],cacheHint:r}),zw=(r,e,n,t,o,i)=>{let s=n.dims,a=t.dims,u=2,l=3,f=o.length,c=[a[1]*a[2]*a[3],o[2]*o[3]],p=a[2]*a[3],b=er(),h=oe(r.session.backend.glContext.version),g="";for(let w=0;w<=1;w++)for(let v=0;v<=1;v++)g+=` blockIndex = rc.x + ${v}; pos = rc.y + ${w}; @@ -552,7 +552,7 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe ${g} ${h.output} = result; } - `;return{...e,output:{dims:c,type:n.type,textureType:2},shaderSource:T,hasMain:!0}},jd=(r,e,n,t,o)=>{let i=Lw(o.cacheKey);return{...i,get:()=>Rw(r,i,e,n,t,o)}}});function zw(r,e,n){let t=e[0].dims,o=e[1].dims,i=gt.calcShape(t,o,!0);if(!i)throw new Error("Can't use matmul on the given tensors");let s=bt(i.length),a=Gt(),{activationFunction:u,applyActivation:l}=tr(n),f=e.length>2,c=f?"value += getBiasForMatmul();":"",p=f?`${ss(s,a,e[2].dims,i,!1)}`:"",b=i.length,h=t.length,g=o.length,T=t[t.length-1],w=` + `;return{...e,output:{dims:c,type:n.type,textureType:2},shaderSource:T,hasMain:!0}},Kd=(r,e,n,t,o)=>{let i=Nw(o.cacheKey);return{...i,get:()=>zw(r,i,e,n,t,o)}}});function Mw(r,e,n){let t=e[0].dims,o=e[1].dims,i=gt.calcShape(t,o,!0);if(!i)throw new Error("Can't use matmul on the given tensors");let s=bt(i.length),a=Gt(),{activationFunction:u,applyActivation:l}=tr(n),f=e.length>2,c=f?"value += getBiasForMatmul();":"",p=f?`${us(s,a,e[2].dims,i,!1)}`:"",b=i.length,h=t.length,g=o.length,T=t[t.length-1],w=` ${u} ${p} float process(int indices[${b}]) { @@ -570,7 +570,7 @@ var J0=Object.create;var bo=Object.defineProperty;var Q0=Object.getOwnPropertyDe ${c} ${l} return value; - }`;return{...r,output:{dims:i,type:e[0].type,textureType:0},shaderSource:w}}function as(r,e){let n=Nw(r.length>2,e.activationCacheKey);return{...n,get:()=>zw(n,r,e)}}function ss(r,e,n,t,o){let i="",s=n.length,a=t.length,u=a-s;a<2&&s>0?i="coords":i=n.map((g,T)=>`coords.${e[T+u]}`).join(", ");let f=gt.getBroadcastDims(n,t).map(g=>`coords.${e[g+u]} = 0;`).join(` + }`;return{...r,output:{dims:i,type:e[0].type,textureType:0},shaderSource:w}}function ss(r,e){let n=Fw(r.length>2,e.activationCacheKey);return{...n,get:()=>Mw(n,r,e)}}function us(r,e,n,t,o){let i="",s=n.length,a=t.length,u=a-s;a<2&&s>0?i="coords":i=n.map((g,T)=>`coords.${e[T+u]}`).join(", ");let f=gt.getBroadcastDims(n,t).map(g=>`coords.${e[g+u]} = 0;`).join(` `),p=J.size(n)===1,b="vec4(outputValue.xx, outputValue.yy)";return p&&(b="vec4(outputValue.x)"),o?` vec4 getBiasForMatmul() { ${r} coords = getOutputCoords(); @@ -582,7 +582,7 @@ float getBiasForMatmul() { ${r} coords = getOutputCoords(); ${f} return getBias(coords.x); -}`}var Zd,Yd,Nw,Fw,qo=C(()=>{"use strict";De();Se();Qt();Wr();us();Zd=(r,e,n)=>(Fw(e),r.session.pack?[r.run(Ko(r,e,n),e)]:[r.run(as(e,n),e)]),Yd=r=>bn(r.attributes),Nw=(r,e)=>({name:"MatMul",inputNames:r?["A","B","Bias"]:["A","B"],inputTypes:r?[0,0,0]:[0,0],cacheHint:e});Fw=r=>{if(!r||r.length!==2)throw new Error("MatMul requires 2 inputs.");if(r[0].dims[r[0].dims.length-1]!==r[1].dims[r[1].dims.length-2])throw new Error("shared dimension does not match.");if(r[0].type!=="float32"&&r[0].type!=="float64"||r[1].type!=="float32"&&r[1].type!=="float64")throw new Error("inputs should be float type");if(r[0].type!==r[1].type)throw new Error("inputs types should match")}});function Gw(r,e,n,t){let o=[],i=[],s=n[0].dims,a=n[1].dims,u=s.length,l=a.length,f=t.length,c=f-u,p=f-l;o=s.map((S,$)=>`coords.${e[$+c]}`),o[u-1]="i*2",o.join(", "),i=a.map((S,$)=>`coords.${e[$+p]}`),i[l-2]="i*2",i.join(", ");let b=gt.getBroadcastDims(s,t),h=gt.getBroadcastDims(a,t),g=b.map(S=>`coords.${e[S+c]} = 0;`).join(` +}`}var Zd,Yd,Fw,Vw,qo=C(()=>{"use strict";De();Se();Qt();Wr();ls();Zd=(r,e,n)=>(Vw(e),r.session.pack?[r.run(jo(r,e,n),e)]:[r.run(ss(e,n),e)]),Yd=r=>yn(r.attributes),Fw=(r,e)=>({name:"MatMul",inputNames:r?["A","B","Bias"]:["A","B"],inputTypes:r?[0,0,0]:[0,0],cacheHint:e});Vw=r=>{if(!r||r.length!==2)throw new Error("MatMul requires 2 inputs.");if(r[0].dims[r[0].dims.length-1]!==r[1].dims[r[1].dims.length-2])throw new Error("shared dimension does not match.");if(r[0].type!=="float32"&&r[0].type!=="float64"||r[1].type!=="float32"&&r[1].type!=="float64")throw new Error("inputs should be float type");if(r[0].type!==r[1].type)throw new Error("inputs types should match")}});function Ww(r,e,n,t){let o=[],i=[],s=n[0].dims,a=n[1].dims,u=s.length,l=a.length,f=t.length,c=f-u,p=f-l;o=s.map((S,$)=>`coords.${e[$+c]}`),o[u-1]="i*2",o.join(", "),i=a.map((S,$)=>`coords.${e[$+p]}`),i[l-2]="i*2",i.join(", ");let b=gt.getBroadcastDims(s,t),h=gt.getBroadcastDims(a,t),g=b.map(S=>`coords.${e[S+c]} = 0;`).join(` `),T=h.map(S=>`coords.${e[S+p]} = 0;`).join(` `),w=`int lastDim = coords.${e[f-1]}; coords.${e[f-1]} = coords.${e[f-2]}; @@ -601,7 +601,7 @@ vec4 getBAtOutCoordsMatmul(int i) { ${T} vec4 outputValue = getB(${i}); return outputValue; -}`}function Uw(r,e){let n="";for(let t=0;t{"use strict";De();He();Se();Qt();Wr();qo();Mw=(r,e)=>({name:"MatMul (packed)",inputNames:r?["A","B","Bias"]:["A","B"],inputTypes:r?[2,2,2]:[2,2],cacheHint:e}),Vw=(r,e,n,t)=>{let o=n.length>2,i=o?"value += getBiasForMatmul();":"",s=n[0].dims,a=n[1].dims,u=gt.calcShape(s,a,!0),l=!J.areEqual(n[0].dims,n[1].dims);if(!u)throw new Error("Can't use matmul on the given tensors");let f=s[s.length-1],c=Math.ceil(f/2),p=s.length,b=a.length,h=oe(r.session.backend.glContext.version),g=bt(u.length),T=u.length,w=Gt(),{activationFunction:v,applyActivation:S}=tr(t),$=o?`${ss(g,w,n[2].dims,u,!0)}`:"",P=l?`${Gw(g,w,n,u)}`:"",E=l?"getAAtOutCoordsMatmul(i)":`getA(${Uw(w,p)})`,N=l?"getBAtOutCoordsMatmul(i)":`getB(${Ww(w,b)})`,z=l?"":`${g} rc = +}`}function Hw(r,e){let n="";for(let t=0;t{"use strict";De();He();Se();Qt();Wr();qo();Gw=(r,e)=>({name:"MatMul (packed)",inputNames:r?["A","B","Bias"]:["A","B"],inputTypes:r?[2,2,2]:[2,2],cacheHint:e}),Uw=(r,e,n,t)=>{let o=n.length>2,i=o?"value += getBiasForMatmul();":"",s=n[0].dims,a=n[1].dims,u=gt.calcShape(s,a,!0),l=!J.areEqual(n[0].dims,n[1].dims);if(!u)throw new Error("Can't use matmul on the given tensors");let f=s[s.length-1],c=Math.ceil(f/2),p=s.length,b=a.length,h=oe(r.session.backend.glContext.version),g=bt(u.length),T=u.length,w=Gt(),{activationFunction:v,applyActivation:S}=tr(t),$=o?`${us(g,w,n[2].dims,u,!0)}`:"",P=l?`${Ww(g,w,n,u)}`:"",E=l?"getAAtOutCoordsMatmul(i)":`getA(${Hw(w,p)})`,N=l?"getBAtOutCoordsMatmul(i)":`getB(${qw(w,b)})`,z=l?"":`${g} rc = getOutputCoords(); int lastDim = rc.${w[T-1]}; rc.${w[T-1]} = rc.${w[T-2]}; rc.${w[T-2]} = lastDim; `,q=` @@ -622,7 +622,7 @@ vec4 getBAtOutCoordsMatmul(int i) { ${i} ${S} ${h.output} = value; - }`;return{...e,output:{dims:u,type:n[0].type,textureType:2},shaderSource:q,hasMain:!0}},Ko=(r,e,n)=>{let t=Mw(e.length>2,n.activationCacheKey);return{...t,get:()=>Vw(r,t,e,n)}}});var Jd,Qd=C(()=>{"use strict";Ho();Xd();us();Jd=(r,e,n)=>{let t=e[0].dims,o=e[1].dims,i=yn(t,o,n.dilations,n.pads,n.strides),s=r.run(jd(r,e[0],e[1],i,n),[e[0]]),a=r.reshapePacked(e[1],[o[0],o[1]*o[2]*o[3]]),u=e.length===3?[a,s,e[2]]:[a,s],l=r.run(Ko(r,u,n),u);return r.reshapePacked(l,i)}});var Hw,qw,ep,ls,cs=C(()=>{"use strict";Se();Hw=r=>({name:"Im2Col",inputNames:["X"],inputTypes:[0],cacheHint:r}),qw=(r,e,n,t,o,i)=>{let s=n.dims,a=t.dims,u=o.length,l=ls(s,a,o,4),f=` + }`;return{...e,output:{dims:u,type:n[0].type,textureType:2},shaderSource:q,hasMain:!0}},jo=(r,e,n)=>{let t=Gw(e.length>2,n.activationCacheKey);return{...t,get:()=>Uw(r,t,e,n)}}});var Jd,Qd=C(()=>{"use strict";Ho();Xd();ls();Jd=(r,e,n)=>{let t=e[0].dims,o=e[1].dims,i=xn(t,o,n.dilations,n.pads,n.strides),s=r.run(Kd(r,e[0],e[1],i,n),[e[0]]),a=r.reshapePacked(e[1],[o[0],o[1]*o[2]*o[3]]),u=e.length===3?[a,s,e[2]]:[a,s],l=r.run(jo(r,u,n),u);return r.reshapePacked(l,i)}});var jw,Kw,ep,cs,fs=C(()=>{"use strict";Se();jw=r=>({name:"Im2Col",inputNames:["X"],inputTypes:[0],cacheHint:r}),Kw=(r,e,n,t,o,i)=>{let s=n.dims,a=t.dims,u=o.length,l=cs(s,a,o,4),f=` const int XC = ${s[1]}; const int XH = ${s[2]}; const int XW = ${s[3]}; @@ -666,7 +666,7 @@ vec4 getBAtOutCoordsMatmul(int i) { } return value; } - `;return{...e,output:{dims:l,type:n.type,textureType:4},shaderSource:f}},ep=(r,e,n,t,o)=>{let i=Hw(o.cacheKey);return{...i,get:()=>qw(r,i,e,n,t,o)}},ls=(r,e,n,t=4)=>[n[0],n[2],n[3],Math.ceil(r[1]*e[2]*e[3]/t)]});var Kw,jw,tp,rp=C(()=>{"use strict";De();He();Se();Wr();cs();Kw=(r,e)=>({name:"ConvDotProduct",inputNames:r?["Im2Col","K","B"]:["Im2Col","K"],inputTypes:r?[0,4,0]:[0,4],cacheKey:e.activationCacheKey}),jw=(r,e,n,t,o)=>{let i=n[0].dims,s=n[1].dims,a=[s[0],Math.ceil(i[1]*s[2]*s[3]/4)],u=ls(i,s,t),[l,f]=r.calculateTextureWidthAndHeight(a,4),c=J.computeStrides(u),[p,b]=r.calculateTextureWidthAndHeight(u,4),h=t.length,g=n.length<3?"0.0":"_B(b)",T=Math.ceil(i[1]*s[2]*s[3]/4),{activationFunction:w,applyActivation:v}=tr(o),S=oe(r.session.backend.glContext.version),$=` + `;return{...e,output:{dims:l,type:n.type,textureType:4},shaderSource:f}},ep=(r,e,n,t,o)=>{let i=jw(o.cacheKey);return{...i,get:()=>Kw(r,i,e,n,t,o)}},cs=(r,e,n,t=4)=>[n[0],n[2],n[3],Math.ceil(r[1]*e[2]*e[3]/t)]});var Xw,Zw,tp,rp=C(()=>{"use strict";De();He();Se();Wr();fs();Xw=(r,e)=>({name:"ConvDotProduct",inputNames:r?["Im2Col","K","B"]:["Im2Col","K"],inputTypes:r?[0,4,0]:[0,4],cacheKey:e.activationCacheKey}),Zw=(r,e,n,t,o)=>{let i=n[0].dims,s=n[1].dims,a=[s[0],Math.ceil(i[1]*s[2]*s[3]/4)],u=cs(i,s,t),[l,f]=r.calculateTextureWidthAndHeight(a,4),c=J.computeStrides(u),[p,b]=r.calculateTextureWidthAndHeight(u,4),h=t.length,g=n.length<3?"0.0":"_B(b)",T=Math.ceil(i[1]*s[2]*s[3]/4),{activationFunction:w,applyActivation:v}=tr(o),S=oe(r.session.backend.glContext.version),$=` ${w} float process(int indices[${h}]) { int b[1]; @@ -687,7 +687,7 @@ float process(int indices[${h}]) { } ${v} return value; -}`;return{...e,output:{dims:t,type:n[0].type,textureType:0},shaderSource:$}},tp=(r,e,n,t)=>{let o=Kw(e.length>2,t);return{...o,get:()=>jw(r,o,e,n,t)}}});var yn,fs,Xw,Zw,Yw,Jw,ds,Qw,Ho=C(()=>{"use strict";st();De();Kd();Qd();rp();Wr();cs();qo();yn=(r,e,n,t,o)=>{let i=r[0],s=r.slice(2),a=s.length,u=e[0],f=e.slice(2).map((h,g)=>h+(h-1)*(n[g]-1)),p=s.map((h,g)=>h+t[g]+t[g+a]).map((h,g)=>Math.floor((h-f[g]+o[g])/o[g]));return[i,u].concat(...p)},fs=(r,e,n)=>(Qw(e,n),Xw(r,e,n)),Xw=(r,e,n)=>{let t=Jw(n,e),o=r.session.pack,i=t.kernelShape[0]===1&&t.kernelShape[1]===1;return t.group>1?[r.run(qd(r,e,t),e)]:i&&o?[Zw(r,e,t)]:o&&e[0].dims.length===4&&e[0].dims[0]===1&&!i?[Jd(r,e,t)]:[Yw(r,e,t)]},Zw=(r,e,n)=>{let t=e[0].dims,o=e[1].dims,i=yn(t,o,n.dilations,n.pads,n.strides),s=r.reshapeUnpacked(e[0],[t[1],t[2]*t[3]]),a=r.reshapeUnpacked(e[1],[o[0],o[1]]),u=e.length>2?[a,s,e[2]]:[a,s],l=r.run(as(u,n),u);return r.reshapeUnpacked(l,i)},Yw=(r,e,n)=>{let t=e[0].dims,o=e[1].dims,i=yn(t,o,n.dilations,n.pads,n.strides),s=r.run(ep(r,e[0],e[1],i,n),[e[0]]),a=e.length===3?[s,e[1],e[2]]:[s,e[1]];return r.run(tp(r,e,i,n),a)},Jw=(r,e)=>{let n=r.kernelShape.slice();if(r.kernelShape.length===0)for(let i=2;i{let e=r.attributes,n=bn(e),t=e.getString("auto_pad","NOTSET"),o=e.getInts("dilations",[1,1]),i=e.getInt("group",1),s=e.getInts("kernel_shape",[]),a=e.getInts("pads",[0,0,0,0]),u=e.getInts("strides",[1,1]);return be({autoPad:t,dilations:o,group:i,kernelShape:s,pads:a,strides:u,...n})},Qw=(r,e)=>{if(!r||r.length!==2&&r.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(r[0].dims.length!==4||r[1].dims.length!==4)throw new Error("currently only support 2-dimensional conv");let n=r[0].dims[1],t=r[1].dims[1]*e.group;if(n!==t)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if(r.length===3&&(r[2].dims.length!==1||r[1].dims[0]!==r[2].dims[0]))throw new Error("invalid bias");let o=r[0].dims.length-2;if(e.dilations.length!==o)throw new Error(`dilations should be ${o}D`);if(e.strides.length!==o)throw new Error(`strides should be ${o}D`);if(e.pads.length!==o*2)throw new Error(`pads should be ${o*2}D`);if(e.kernelShape.length!==0&&e.kernelShape.length!==r[1].dims.length-2)throw new Error("invalid kernel shape");if(r[0].type!=="float32"||r[1].type!=="float32")throw new Error("Conv input(X,W) should be float tensor");if(r.length===3&&r[2].type!=="float32")throw new Error("Conv input(bias) should be float tensor")}});var eT,tT,rT,np,nT,oT,iT,aT,sT,uT,op,lT,ip=C(()=>{"use strict";st();He();Se();Wr();eT=(r,e,n,t,o,i)=>(r-1)*e+n+(t-1)*o+1-i,tT=(r,e,n,t,o)=>{let i=Math.floor(r/2);e==="SAME_UPPER"?(n[t]=i,n[o]=r-i):e==="SAME_LOWER"&&(n[t]=r-i,n[o]=i)},rT=(r,e,n,t,o,i,s,a)=>{let u=r.length-2,l=a.length===0;for(let f=0;f(lT(e,n),nT(r,e,n)),nT=(r,e,n)=>{let t=uT(n,e);return[sT(r,e,t)]},oT=(r,e)=>({name:"ConvTranspose",inputNames:r?["X","W","B"]:["X","W"],inputTypes:r?[0,0,0]:[0,0],cacheHint:e}),iT=(r,e,n,t)=>{let i=e.length>2?"getB(output_channel)":"0.0",s=e[0].dims,a=e[1].dims,u=a[1],l=a[0]/t.group,f=[e[0].dims[0],e[1].dims[1]*t.group,...t.outputShape],c=oe(r.session.backend.glContext.version),{activationFunction:p,applyActivation:b}=tr(t),h=` +}`;return{...e,output:{dims:t,type:n[0].type,textureType:0},shaderSource:$}},tp=(r,e,n,t)=>{let o=Xw(e.length>2,t);return{...o,get:()=>Zw(r,o,e,n,t)}}});var xn,ds,Yw,Jw,Qw,eT,ps,tT,Ho=C(()=>{"use strict";st();De();jd();Qd();rp();Wr();fs();qo();xn=(r,e,n,t,o)=>{let i=r[0],s=r.slice(2),a=s.length,u=e[0],f=e.slice(2).map((h,g)=>h+(h-1)*(n[g]-1)),p=s.map((h,g)=>h+t[g]+t[g+a]).map((h,g)=>Math.floor((h-f[g]+o[g])/o[g]));return[i,u].concat(...p)},ds=(r,e,n)=>(tT(e,n),Yw(r,e,n)),Yw=(r,e,n)=>{let t=eT(n,e),o=r.session.pack,i=t.kernelShape[0]===1&&t.kernelShape[1]===1;return t.group>1?[r.run(qd(r,e,t),e)]:i&&o?[Jw(r,e,t)]:o&&e[0].dims.length===4&&e[0].dims[0]===1&&!i?[Jd(r,e,t)]:[Qw(r,e,t)]},Jw=(r,e,n)=>{let t=e[0].dims,o=e[1].dims,i=xn(t,o,n.dilations,n.pads,n.strides),s=r.reshapeUnpacked(e[0],[t[1],t[2]*t[3]]),a=r.reshapeUnpacked(e[1],[o[0],o[1]]),u=e.length>2?[a,s,e[2]]:[a,s],l=r.run(ss(u,n),u);return r.reshapeUnpacked(l,i)},Qw=(r,e,n)=>{let t=e[0].dims,o=e[1].dims,i=xn(t,o,n.dilations,n.pads,n.strides),s=r.run(ep(r,e[0],e[1],i,n),[e[0]]),a=e.length===3?[s,e[1],e[2]]:[s,e[1]];return r.run(tp(r,e,i,n),a)},eT=(r,e)=>{let n=r.kernelShape.slice();if(r.kernelShape.length===0)for(let i=2;i{let e=r.attributes,n=yn(e),t=e.getString("auto_pad","NOTSET"),o=e.getInts("dilations",[1,1]),i=e.getInt("group",1),s=e.getInts("kernel_shape",[]),a=e.getInts("pads",[0,0,0,0]),u=e.getInts("strides",[1,1]);return be({autoPad:t,dilations:o,group:i,kernelShape:s,pads:a,strides:u,...n})},tT=(r,e)=>{if(!r||r.length!==2&&r.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(r[0].dims.length!==4||r[1].dims.length!==4)throw new Error("currently only support 2-dimensional conv");let n=r[0].dims[1],t=r[1].dims[1]*e.group;if(n!==t)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if(r.length===3&&(r[2].dims.length!==1||r[1].dims[0]!==r[2].dims[0]))throw new Error("invalid bias");let o=r[0].dims.length-2;if(e.dilations.length!==o)throw new Error(`dilations should be ${o}D`);if(e.strides.length!==o)throw new Error(`strides should be ${o}D`);if(e.pads.length!==o*2)throw new Error(`pads should be ${o*2}D`);if(e.kernelShape.length!==0&&e.kernelShape.length!==r[1].dims.length-2)throw new Error("invalid kernel shape");if(r[0].type!=="float32"||r[1].type!=="float32")throw new Error("Conv input(X,W) should be float tensor");if(r.length===3&&r[2].type!=="float32")throw new Error("Conv input(bias) should be float tensor")}});var rT,nT,oT,np,iT,aT,sT,uT,lT,cT,op,fT,ip=C(()=>{"use strict";st();He();Se();Wr();rT=(r,e,n,t,o,i)=>(r-1)*e+n+(t-1)*o+1-i,nT=(r,e,n,t,o)=>{let i=Math.floor(r/2);e==="SAME_UPPER"?(n[t]=i,n[o]=r-i):e==="SAME_LOWER"&&(n[t]=r-i,n[o]=i)},oT=(r,e,n,t,o,i,s,a)=>{let u=r.length-2,l=a.length===0;for(let f=0;f(fT(e,n),iT(r,e,n)),iT=(r,e,n)=>{let t=cT(n,e);return[lT(r,e,t)]},aT=(r,e)=>({name:"ConvTranspose",inputNames:r?["X","W","B"]:["X","W"],inputTypes:r?[0,0,0]:[0,0],cacheHint:e}),sT=(r,e,n,t)=>{let i=e.length>2?"getB(output_channel)":"0.0",s=e[0].dims,a=e[1].dims,u=a[1],l=a[0]/t.group,f=[e[0].dims[0],e[1].dims[1]*t.group,...t.outputShape],c=oe(r.session.backend.glContext.version),{activationFunction:p,applyActivation:b}=tr(t),h=` const ivec2 strides = ivec2(${t.strides[0]}, ${t.strides[1]}); const ivec2 pads = ivec2(${t.pads[0]}, ${t.pads[1]}); ${p} @@ -724,14 +724,14 @@ float process(int indices[${h}]) { ${b} ${c.output} = vec4(value, .0, .0, .0); } -`;return{...n,output:{dims:f,type:e[0].type,textureType:0},shaderSource:h,hasMain:!0}},aT=(r,e,n)=>{let t=oT(e.length>2,n.cacheKey);return{...t,get:()=>iT(r,e,t,n)}},sT=(r,e,n)=>r.run(aT(r,e,n),e),uT=(r,e)=>{let n=r.kernelShape.slice();if(r.kernelShape.length===0)for(let a=2;a{let e=r.attributes,n=bn(e),t=e.getString("auto_pad","NOTSET"),o=e.getInts("dilations",[1,1]),i=e.getInt("group",1),s=e.getInts("kernel_shape",[]),a=e.getInts("output_padding",[0,0]),u=e.getInts("output_shape",[]),l=e.getInts("pads",[0,0,0,0]),f=e.getInts("strides",[1,1]);return be({autoPad:t,dilations:o,group:i,kernelShape:s,outputPadding:a,outputShape:u,pads:l,strides:f,...n})},lT=(r,e)=>{if(!r||r.length!==2&&r.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(r[0].dims.length!==4||r[1].dims.length!==4)throw new Error("currently only support 2-dimensional conv");let n=r[0].dims[1],t=r[1].dims[0];if(n!==t)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let o=r[1].dims[1]*e.group;if(r.length===3&&(r[2].dims.length!==1||r[2].dims[0]!==o))throw new Error("invalid bias");let i=r[0].dims.length-2;if(e.dilations.length!==i)throw new Error(`dilations should be ${i}D`);if(e.strides.length!==i)throw new Error(`strides should be ${i}D`);if(e.pads.length!==i*2)throw new Error(`pads should be ${i*2}D`);if(e.outputPadding.length!==i)throw new Error(`output_padding should be ${i}D`);if(e.kernelShape.length!==0&&e.kernelShape.length!==r[1].dims.length-2)throw new Error("invalid kernel shape");if(e.outputShape.length!==0&&e.outputShape.length!==r[0].dims.length-2)throw new Error("invalid output shape");if(r[0].type!=="float32"||r[1].type!=="float32")throw new Error("ConvTranspose input(X,W) should be float tensor");if(r.length===3&&r[2].type!=="float32")throw new Error("ConvTranspose input(bias) should be float tensor")}});var ap,Hr,sp,cT,up,fT,dT,pT,jo=C(()=>{"use strict";st();De();Se();ap={name:"Transpose",inputNames:["A"],inputTypes:[0]},Hr=(r,e,n)=>(pT(e),[r.run({...ap,cacheHint:n.cacheKey,get:()=>cT(r,e[0],n.perm)},e)]),sp=r=>be({perm:r.attributes.getInts("perm",[])}),cT=(r,e,n)=>{let t=e.dims;n=up(t,n);let o=fT(t,n),i=t.length,s=` - ${dT("perm",n,i)} +`;return{...n,output:{dims:f,type:e[0].type,textureType:0},shaderSource:h,hasMain:!0}},uT=(r,e,n)=>{let t=aT(e.length>2,n.cacheKey);return{...t,get:()=>sT(r,e,t,n)}},lT=(r,e,n)=>r.run(uT(r,e,n),e),cT=(r,e)=>{let n=r.kernelShape.slice();if(r.kernelShape.length===0)for(let a=2;a{let e=r.attributes,n=yn(e),t=e.getString("auto_pad","NOTSET"),o=e.getInts("dilations",[1,1]),i=e.getInt("group",1),s=e.getInts("kernel_shape",[]),a=e.getInts("output_padding",[0,0]),u=e.getInts("output_shape",[]),l=e.getInts("pads",[0,0,0,0]),f=e.getInts("strides",[1,1]);return be({autoPad:t,dilations:o,group:i,kernelShape:s,outputPadding:a,outputShape:u,pads:l,strides:f,...n})},fT=(r,e)=>{if(!r||r.length!==2&&r.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(r[0].dims.length!==4||r[1].dims.length!==4)throw new Error("currently only support 2-dimensional conv");let n=r[0].dims[1],t=r[1].dims[0];if(n!==t)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let o=r[1].dims[1]*e.group;if(r.length===3&&(r[2].dims.length!==1||r[2].dims[0]!==o))throw new Error("invalid bias");let i=r[0].dims.length-2;if(e.dilations.length!==i)throw new Error(`dilations should be ${i}D`);if(e.strides.length!==i)throw new Error(`strides should be ${i}D`);if(e.pads.length!==i*2)throw new Error(`pads should be ${i*2}D`);if(e.outputPadding.length!==i)throw new Error(`output_padding should be ${i}D`);if(e.kernelShape.length!==0&&e.kernelShape.length!==r[1].dims.length-2)throw new Error("invalid kernel shape");if(e.outputShape.length!==0&&e.outputShape.length!==r[0].dims.length-2)throw new Error("invalid output shape");if(r[0].type!=="float32"||r[1].type!=="float32")throw new Error("ConvTranspose input(X,W) should be float tensor");if(r.length===3&&r[2].type!=="float32")throw new Error("ConvTranspose input(bias) should be float tensor")}});var ap,Hr,sp,dT,up,pT,mT,hT,Ko=C(()=>{"use strict";st();De();Se();ap={name:"Transpose",inputNames:["A"],inputTypes:[0]},Hr=(r,e,n)=>(hT(e),[r.run({...ap,cacheHint:n.cacheKey,get:()=>dT(r,e[0],n.perm)},e)]),sp=r=>be({perm:r.attributes.getInts("perm",[])}),dT=(r,e,n)=>{let t=e.dims;n=up(t,n);let o=pT(t,n),i=t.length,s=` + ${mT("perm",n,i)} float process(int indices[${i}]) { int a[${i}]; perm(a, indices); return _A(a); - }`;return{...ap,output:{dims:o,type:e.type,textureType:0},shaderSource:s}},up=(r,e)=>(e&&e.length!==r.length&&(e=[...r.keys()].reverse()),e),fT=(r,e)=>(e=up(r,e),J.sortBasedOnPerm(r,e)),dT=(r,e,n)=>{let t=[];t.push(`void ${r}(out int a[${n}], int src[${n}]) {`);for(let o=0;o{if(!r||r.length!==1)throw new Error("Transpose requires 1 input.");if(r[0].type!=="float32"&&r[0].type!=="float64")throw new Error("input should be float tensor")}});var lp,cp,mT,fp=C(()=>{"use strict";jo();lp=(r,e,n)=>{mT(e);let t=n.blocksize,o=t*t,i=n.mode==="DCR"?[0,3,4,1,5,2]:[0,1,4,2,5,3],s=n.mode==="DCR"?[e[0].dims[0],t,t,e[0].dims[1]/o,e[0].dims[2],e[0].dims[3]]:[e[0].dims[0],e[0].dims[1]/o,t,t,e[0].dims[2],e[0].dims[3]],a=r.reshapeUnpacked(e[0],s),u={perm:i,cacheKey:`${i}`},[l]=Hr(r,[a],u),f=[e[0].dims[0],e[0].dims[1]/o,e[0].dims[2]*t,e[0].dims[3]*t];return[r.reshapeUnpacked(l,f)]},cp=r=>{let e=r.attributes.getInt("blocksize");if(e<1)throw new Error(`blocksize must be >= 1, but got : ${e} for DepthToSpace`);let n=r.attributes.getString("mode","DCR");if(n!=="DCR"&&n!=="CRD")throw new Error(`unrecognized mode: ${n} for DepthToSpace`);return{mode:n,blocksize:e}},mT=r=>{if(r.length!==1)throw new Error(`DepthToSpace expect 1 inputs, but got ${r.length}`);if(r[0].type==="string"||r[0].dims.length!==4)throw new TypeError("DepthToSpace input should be a 4-D numeric tensor")}});var dp,pp,hT,mp=C(()=>{"use strict";De();dp=(r,e,n)=>{hT(e,n);let t=J.flattenShape(e[0].dims,n);return[r.reshapeUnpacked(e[0],t)]},pp=r=>r.attributes.getInt("axis",1),hT=(r,e)=>{if(!r||r.length!==1)throw new Error("Flatten requires 1 input.");let n=r[0].dims.length;if(n===0)throw new Error("scalar tensor is not supported.");if(e<-n||e>n)throw new Error("Invalid axis");if(r[0].type==="string")throw new Error("string tensor is not supported.")}});var Sr,Vn=C(()=>{"use strict";Sr=["float32","float64","int32","int16","int8","uint16","uint32","uint8"]});var hp,gp,gT,bT,yT,xT,bp=C(()=>{"use strict";st();Vn();De();Se();hp=(r,e,n)=>(xT(e,n.axis),[r.run(yT(r,e,n),e)]),gp=r=>be({axis:r.attributes.getInt("axis",0)}),gT={name:"Gather",inputNames:["A","B"],inputTypes:[0,0]},bT=(r,e,n,t)=>{let o=n[0].dims.slice(),i=n[1].dims.slice(),s=new Array(o.length+i.length-1);t=J.normalizeAxis(t,o.length);let a=[];for(let p=0;p(e&&e.length!==r.length&&(e=[...r.keys()].reverse()),e),pT=(r,e)=>(e=up(r,e),J.sortBasedOnPerm(r,e)),mT=(r,e,n)=>{let t=[];t.push(`void ${r}(out int a[${n}], int src[${n}]) {`);for(let o=0;o{if(!r||r.length!==1)throw new Error("Transpose requires 1 input.");if(r[0].type!=="float32"&&r[0].type!=="float64")throw new Error("input should be float tensor")}});var lp,cp,gT,fp=C(()=>{"use strict";Ko();lp=(r,e,n)=>{gT(e);let t=n.blocksize,o=t*t,i=n.mode==="DCR"?[0,3,4,1,5,2]:[0,1,4,2,5,3],s=n.mode==="DCR"?[e[0].dims[0],t,t,e[0].dims[1]/o,e[0].dims[2],e[0].dims[3]]:[e[0].dims[0],e[0].dims[1]/o,t,t,e[0].dims[2],e[0].dims[3]],a=r.reshapeUnpacked(e[0],s),u={perm:i,cacheKey:`${i}`},[l]=Hr(r,[a],u),f=[e[0].dims[0],e[0].dims[1]/o,e[0].dims[2]*t,e[0].dims[3]*t];return[r.reshapeUnpacked(l,f)]},cp=r=>{let e=r.attributes.getInt("blocksize");if(e<1)throw new Error(`blocksize must be >= 1, but got : ${e} for DepthToSpace`);let n=r.attributes.getString("mode","DCR");if(n!=="DCR"&&n!=="CRD")throw new Error(`unrecognized mode: ${n} for DepthToSpace`);return{mode:n,blocksize:e}},gT=r=>{if(r.length!==1)throw new Error(`DepthToSpace expect 1 inputs, but got ${r.length}`);if(r[0].type==="string"||r[0].dims.length!==4)throw new TypeError("DepthToSpace input should be a 4-D numeric tensor")}});var dp,pp,bT,mp=C(()=>{"use strict";De();dp=(r,e,n)=>{bT(e,n);let t=J.flattenShape(e[0].dims,n);return[r.reshapeUnpacked(e[0],t)]},pp=r=>r.attributes.getInt("axis",1),bT=(r,e)=>{if(!r||r.length!==1)throw new Error("Flatten requires 1 input.");let n=r[0].dims.length;if(n===0)throw new Error("scalar tensor is not supported.");if(e<-n||e>n)throw new Error("Invalid axis");if(r[0].type==="string")throw new Error("string tensor is not supported.")}});var Sr,Vn=C(()=>{"use strict";Sr=["float32","float64","int32","int16","int8","uint16","uint32","uint8"]});var hp,gp,yT,xT,vT,wT,bp=C(()=>{"use strict";st();Vn();De();Se();hp=(r,e,n)=>(wT(e,n.axis),[r.run(vT(r,e,n),e)]),gp=r=>be({axis:r.attributes.getInt("axis",0)}),yT={name:"Gather",inputNames:["A","B"],inputTypes:[0,0]},xT=(r,e,n,t)=>{let o=n[0].dims.slice(),i=n[1].dims.slice(),s=new Array(o.length+i.length-1);t=J.normalizeAxis(t,o.length);let a=[];for(let p=0;p{let t={...gT,cacheHint:n.cacheKey};return{...t,get:()=>bT(r,t,e,n.axis)}},xT=(r,e)=>{if(!r||r.length!==2)throw new Error("Gather requires 2 inputs.");let n=r[0].dims.length;if(n<1)throw new Error("Invalid input shape.");if(e<-n||e>n-1)throw new Error("Invalid axis.");if(Sr.indexOf(r[0].type)===-1)throw new Error("Invaid input type.");if(r[1].type!=="int32"&&r[1].type!=="int16")throw new Error("Invaid input type.")}});var ps,yp,xp,vp,vT,wT,TT,wp=C(()=>{"use strict";st();De();Se();ps=(r,e,n)=>(TT(e,n),[r.run(vT(e,n),e)]),yp=(r,e)=>{let n=r.attributes.getInt("transA",0)!==0,t=r.attributes.getInt("transB",0)!==0,o=r.attributes.getFloat("alpha",1),i=r.attributes.getFloat("beta",1);return be({transA:n,transB:t,alpha:o,beta:i,isOptionalC:e})},xp=r=>yp(r,!1),vp=r=>yp(r,!0),vT=(r,e)=>{let n={name:"Gemm",inputNames:r.length===3?["A","B","C"]:["A","B"],inputTypes:r.length===3?[0,0,0]:[0,0],key:e.cacheKey};return{...n,get:()=>wT(n,r,e)}},wT=(r,e,n)=>{let t=e[0].dims.slice(),o=e[1].dims.slice(),[i,s]=No.getShapeOfGemmResult(t,n.transA,o,n.transB,e.length===3?e[2].dims:void 0),a=[i,s];if(!a)throw new Error("Can't use gemm on the given tensors");let u=t[t.length-1],l="";n.transA&&(u=t[0]),n.transA&&n.transB?l="value += _A_T(a) * _B_T(b);":n.transA&&!n.transB?l="value += _A_T(a) * _B(b);":!n.transA&&n.transB?l="value += _A(a) * _B_T(b);":!n.transA&&!n.transB&&(l="value += _A(a) * _B(b);");let f=a.length,c=e.length===3?`int c[${e[2].dims.length}];`:"",p=e.length===3?"bcastIndices_C(indices, c);":"",b=e.length===3?"value += beta * _C(c);":"",h=` + }`;return{...e,output:{dims:s,type:n[0].type,textureType:0},shaderSource:c}},vT=(r,e,n)=>{let t={...yT,cacheHint:n.cacheKey};return{...t,get:()=>xT(r,t,e,n.axis)}},wT=(r,e)=>{if(!r||r.length!==2)throw new Error("Gather requires 2 inputs.");let n=r[0].dims.length;if(n<1)throw new Error("Invalid input shape.");if(e<-n||e>n-1)throw new Error("Invalid axis.");if(Sr.indexOf(r[0].type)===-1)throw new Error("Invaid input type.");if(r[1].type!=="int32"&&r[1].type!=="int16")throw new Error("Invaid input type.")}});var ms,yp,xp,vp,TT,_T,IT,wp=C(()=>{"use strict";st();De();Se();ms=(r,e,n)=>(IT(e,n),[r.run(TT(e,n),e)]),yp=(r,e)=>{let n=r.attributes.getInt("transA",0)!==0,t=r.attributes.getInt("transB",0)!==0,o=r.attributes.getFloat("alpha",1),i=r.attributes.getFloat("beta",1);return be({transA:n,transB:t,alpha:o,beta:i,isOptionalC:e})},xp=r=>yp(r,!1),vp=r=>yp(r,!0),TT=(r,e)=>{let n={name:"Gemm",inputNames:r.length===3?["A","B","C"]:["A","B"],inputTypes:r.length===3?[0,0,0]:[0,0],key:e.cacheKey};return{...n,get:()=>_T(n,r,e)}},_T=(r,e,n)=>{let t=e[0].dims.slice(),o=e[1].dims.slice(),[i,s]=No.getShapeOfGemmResult(t,n.transA,o,n.transB,e.length===3?e[2].dims:void 0),a=[i,s];if(!a)throw new Error("Can't use gemm on the given tensors");let u=t[t.length-1],l="";n.transA&&(u=t[0]),n.transA&&n.transB?l="value += _A_T(a) * _B_T(b);":n.transA&&!n.transB?l="value += _A_T(a) * _B(b);":!n.transA&&n.transB?l="value += _A(a) * _B_T(b);":!n.transA&&!n.transB&&(l="value += _A(a) * _B(b);");let f=a.length,c=e.length===3?`int c[${e[2].dims.length}];`:"",p=e.length===3?"bcastIndices_C(indices, c);":"",b=e.length===3?"value += beta * _C(c);":"",h=` float process(int indices[${f}]) { int a[${f}]; int b[${f}]; @@ -761,12 +761,12 @@ float process(int indices[${h}]) { value = value * alpha; ${b} return value; - }`;return{...r,output:{dims:a,type:e[0].type,textureType:0},variables:[{name:"alpha",type:"float",data:n.alpha},{name:"beta",type:"float",data:n.beta}],shaderSource:h}},TT=(r,e)=>{if(!r)throw new Error("Input is missing");if(e.isOptionalC&&(r.length<2||r.length>3))throw new Error("Invaid input shape.");if(!e.isOptionalC&&r.length!==3)throw new Error("Gemm requires 3 inputs");if(r.length===3&&r[2].dims.length!==1&&r[2].dims.length!==2)throw new Error("Invalid input shape of C");if(r[0].type!=="float32"&&r[0].type!=="float64"||r[1].type!=="float32"&&r[1].type!=="float64"||r.length===3&&r[2].type!=="float32"&&r[2].type!=="float64")throw new Error("Invalid input type.");if(r[0].type!==r[1].type||r.length===3&&r[0].type!==r[2].type)throw new Error("Input types are mismatched")}});var Tp,_p,_T,IT,ST,$T,AT,Ip=C(()=>{"use strict";st();Se();Tp=(r,e,n)=>(AT(e),[r.run(ST(r,e,n),e)]),_p=r=>{let e=r.attributes.getFloat("scale"),n=r.attributes.getFloats("bias");return be({scale:e,bias:n})},_T={name:"ImageScaler",inputNames:["X"],inputTypes:[0]},IT=(r,e,n,t)=>{let o=n[0].dims.slice(),i=o.length,a=` - ${$T(t.bias.length)} + }`;return{...r,output:{dims:a,type:e[0].type,textureType:0},variables:[{name:"alpha",type:"float",data:n.alpha},{name:"beta",type:"float",data:n.beta}],shaderSource:h}},IT=(r,e)=>{if(!r)throw new Error("Input is missing");if(e.isOptionalC&&(r.length<2||r.length>3))throw new Error("Invaid input shape.");if(!e.isOptionalC&&r.length!==3)throw new Error("Gemm requires 3 inputs");if(r.length===3&&r[2].dims.length!==1&&r[2].dims.length!==2)throw new Error("Invalid input shape of C");if(r[0].type!=="float32"&&r[0].type!=="float64"||r[1].type!=="float32"&&r[1].type!=="float64"||r.length===3&&r[2].type!=="float32"&&r[2].type!=="float64")throw new Error("Invalid input type.");if(r[0].type!==r[1].type||r.length===3&&r[0].type!==r[2].type)throw new Error("Input types are mismatched")}});var Tp,_p,ST,$T,AT,PT,OT,Ip=C(()=>{"use strict";st();Se();Tp=(r,e,n)=>(OT(e),[r.run(AT(r,e,n),e)]),_p=r=>{let e=r.attributes.getFloat("scale"),n=r.attributes.getFloats("bias");return be({scale:e,bias:n})},ST={name:"ImageScaler",inputNames:["X"],inputTypes:[0]},$T=(r,e,n,t)=>{let o=n[0].dims.slice(),i=o.length,a=` + ${PT(t.bias.length)} float process(int indices[${i}]) { return _X(indices) * scale + getBias(bias, indices[1]); - }`;return{...e,output:{dims:o,type:n[0].type,textureType:0},variables:[{name:"bias",type:"float",arrayLength:t.bias.length,data:t.bias},{name:"scale",type:"float",data:t.scale}],shaderSource:a}},ST=(r,e,n)=>{let t={..._T,cacheHint:n.cacheKey};return{...t,get:()=>IT(r,t,e,n)}},$T=r=>{let e=[`float getBias(float bias[${r}], int channel) {`];for(let n=0;n{if(!r||r.length!==1)throw new Error("ImageScaler requires 1 input.");if(r[0].dims.length!==4)throw new Error("Invalid input shape.");if(r[0].type!=="float32"&&r[0].type!=="float64")throw new Error("Invalid input type.")}});var $p,Ap,Sp,PT,OT,ET,CT,kT,DT,Pp=C(()=>{"use strict";He();Se();$p=(r,e,n)=>{DT(e);let t=r.run(OT(e[0]),e);return[r.run(kT(r,e[0],n,t.dims),[e[0],t,e[1],e[2]])]},Ap=r=>r.attributes.getFloat("epsilon",1e-5),Sp={name:"InstanceNormalization_MeanAndVariance",inputNames:["X"],inputTypes:[0]},PT=(r,e)=>{let n=e.dims.slice(),t=n[1],o=n[2]*n[3],i=[n[0],t],s=` + }`;return{...e,output:{dims:o,type:n[0].type,textureType:0},variables:[{name:"bias",type:"float",arrayLength:t.bias.length,data:t.bias},{name:"scale",type:"float",data:t.scale}],shaderSource:a}},AT=(r,e,n)=>{let t={...ST,cacheHint:n.cacheKey};return{...t,get:()=>$T(r,t,e,n)}},PT=r=>{let e=[`float getBias(float bias[${r}], int channel) {`];for(let n=0;n{if(!r||r.length!==1)throw new Error("ImageScaler requires 1 input.");if(r[0].dims.length!==4)throw new Error("Invalid input shape.");if(r[0].type!=="float32"&&r[0].type!=="float64")throw new Error("Invalid input type.")}});var $p,Ap,Sp,ET,CT,kT,DT,BT,LT,Pp=C(()=>{"use strict";He();Se();$p=(r,e,n)=>{LT(e);let t=r.run(CT(e[0]),e);return[r.run(BT(r,e[0],n,t.dims),[e[0],t,e[1],e[2]])]},Ap=r=>r.attributes.getFloat("epsilon",1e-5),Sp={name:"InstanceNormalization_MeanAndVariance",inputNames:["X"],inputTypes:[0]},ET=(r,e)=>{let n=e.dims.slice(),t=n[1],o=n[2]*n[3],i=[n[0],t],s=` vec4 process(int[2] indices) { vec4 v = vec4(0.0); int a[4]; @@ -795,7 +795,7 @@ float process(int indices[${h}]) { v.g = temp / float(${o}); return v; - }`;return{...r,output:{dims:i,type:e.type,textureType:4},shaderSource:s}},OT=r=>({...Sp,get:()=>PT(Sp,r)}),ET={name:"InstanceNormalization_ComputeOutput",inputNames:["X","MeanAndVariance","Scale","B"],inputTypes:[0,4,0,0]},CT=(r,e,n,t,o)=>{let i=oe(r.session.backend.glContext.version),[s,a]=r.calculateTextureWidthAndHeight(o,4),[u,l]=[s/4,a],f=` + }`;return{...r,output:{dims:i,type:e.type,textureType:4},shaderSource:s}},CT=r=>({...Sp,get:()=>ET(Sp,r)}),kT={name:"InstanceNormalization_ComputeOutput",inputNames:["X","MeanAndVariance","Scale","B"],inputTypes:[0,4,0,0]},DT=(r,e,n,t,o)=>{let i=oe(r.session.backend.glContext.version),[s,a]=r.calculateTextureWidthAndHeight(o,4),[u,l]=[s/4,a],f=` vec4 get_MeanAndVariance(int[2] mv) { int offset = indicesToOffset_MeanAndVariance(mv); vec2 coords = offsetToCoords(offset, ${u}, ${l}); @@ -816,7 +816,7 @@ float process(int indices[${h}]) { float b = _B(sb); return scale * (_X(indices) - mean) / sqrt(variance + epsilon) + b; - }`;return{...e,output:{dims:n.dims,type:n.type,textureType:0},variables:[{name:"epsilon",type:"float",data:t}],shaderSource:f}},kT=(r,e,n,t)=>{let o={...ET,cacheHint:`${n}`};return{...o,get:()=>CT(r,o,e,n,t)}},DT=r=>{if(!r||r.length!==3)throw new Error("InstanceNormalization requires 3 inputs.");let e=r[0],n=r[1],t=r[2];if(e.dims.length<3||n.dims.length!==1||t.dims.length!==1)throw new Error("Invalid input shape.");if(n.dims[0]!==e.dims[1]||t.dims[0]!==e.dims[1])throw new Error("Input shapes are mismatched.");if(e.type!=="float32"&&e.type!=="float64"||n.type!=="float32"&&n.type!=="float64"||t.type!=="float32"&&t.type!=="float64")throw new Error("Invalid input type.");if(r[0].dims.length!==4)throw new Error("Only support 4-D input shape.")}});function BT(r,e){let n=r[0].dims[1],t=r[0].dims.length,o=-Math.floor((e.size-1)/2),i=Math.ceil((e.size-1)/2),s=`float(${e.alpha}) / float(${e.size})`,a=`float(${e.bias})`,u=`float(${e.beta})`,l=` + }`;return{...e,output:{dims:n.dims,type:n.type,textureType:0},variables:[{name:"epsilon",type:"float",data:t}],shaderSource:f}},BT=(r,e,n,t)=>{let o={...kT,cacheHint:`${n}`};return{...o,get:()=>DT(r,o,e,n,t)}},LT=r=>{if(!r||r.length!==3)throw new Error("InstanceNormalization requires 3 inputs.");let e=r[0],n=r[1],t=r[2];if(e.dims.length<3||n.dims.length!==1||t.dims.length!==1)throw new Error("Invalid input shape.");if(n.dims[0]!==e.dims[1]||t.dims[0]!==e.dims[1])throw new Error("Input shapes are mismatched.");if(e.type!=="float32"&&e.type!=="float64"||n.type!=="float32"&&n.type!=="float64"||t.type!=="float32"&&t.type!=="float64")throw new Error("Invalid input type.");if(r[0].dims.length!==4)throw new Error("Only support 4-D input shape.")}});function RT(r,e){let n=r[0].dims[1],t=r[0].dims.length,o=-Math.floor((e.size-1)/2),i=Math.ceil((e.size-1)/2),s=`float(${e.alpha}) / float(${e.size})`,a=`float(${e.bias})`,u=`float(${e.beta})`,l=` float process(int indices[${t}]) { int c = indices[1]; float x = _X(indices); @@ -831,11 +831,11 @@ float process(int indices[${h}]) { } } return x / pow(${a} + ${s} * square_sum, ${u}); - }`;return{...Cp,cacheHint:e.cacheKey,output:{dims:r[0].dims,type:r[0].type,textureType:0},shaderSource:l}}function LT(r,e){return{...Cp,cacheHint:e.cacheKey,get:()=>BT(r,e)}}var Op,Ep,Cp,RT,kp=C(()=>{"use strict";st();Se();Op=(r,e,n)=>(RT(e),[r.run(LT(e,n),e)]),Ep=r=>{let e=r.attributes.getFloat("alpha",1e-4),n=r.attributes.getFloat("beta",.75),t=r.attributes.getFloat("bias",1),o=r.attributes.getInt("size");return be({alpha:e,beta:n,bias:t,size:o})},Cp={name:"LRN",inputNames:["X"],inputTypes:[0]};RT=r=>{if(!r||r.length!==1)throw new Error("LRN requires 1 input.");if(r[0].dims.length!==4)throw new Error('currently only support LRN for input with "NCHW" format');if(r[0].type!=="float32")throw new Error("input should be float type")}});var NT,ms,Dp,Bp,Lp,zT,FT,MT,VT,GT,UT,WT,HT,Rp=C(()=>{"use strict";st();De();He();Se();NT={name:"Pad",inputNames:["A"],inputTypes:[0]},ms=(r,e,n)=>(MT(e),[r.run({...NT,cacheHint:n.cacheKey,get:()=>FT(r,e[0],n)},e)]),Dp=r=>{let e=r.attributes.getString("mode","constant"),n=r.attributes.getFloat("value",0),t=r.attributes.getInts("pads");return be({mode:e,value:n,pads:t})},Bp=(r,e,n)=>{VT(e);let t=zT(r,e,n);return ms(r,[e[0]],t)},Lp=r=>r.attributes.getString("mode","constant"),zT=(r,e,n)=>{if(!r.session.isInitializer(e[1].dataId)||e.length>=3&&!r.session.isInitializer(e[2].dataId))throw new Error("dynamic pad attributes are not allowed");let t=Array.from(e[1].integerData),o=e.length>=3?e[2].floatData[0]:0;return be({mode:n,pads:t,value:o})},FT=(r,e,n)=>{let t=J.padShape(e.dims.slice(),n.pads),o=t.length,s=` - ${GT(r,e,n)} + }`;return{...Cp,cacheHint:e.cacheKey,output:{dims:r[0].dims,type:r[0].type,textureType:0},shaderSource:l}}function NT(r,e){return{...Cp,cacheHint:e.cacheKey,get:()=>RT(r,e)}}var Op,Ep,Cp,zT,kp=C(()=>{"use strict";st();Se();Op=(r,e,n)=>(zT(e),[r.run(NT(e,n),e)]),Ep=r=>{let e=r.attributes.getFloat("alpha",1e-4),n=r.attributes.getFloat("beta",.75),t=r.attributes.getFloat("bias",1),o=r.attributes.getInt("size");return be({alpha:e,beta:n,bias:t,size:o})},Cp={name:"LRN",inputNames:["X"],inputTypes:[0]};zT=r=>{if(!r||r.length!==1)throw new Error("LRN requires 1 input.");if(r[0].dims.length!==4)throw new Error('currently only support LRN for input with "NCHW" format');if(r[0].type!=="float32")throw new Error("input should be float type")}});var FT,hs,Dp,Bp,Lp,MT,VT,GT,UT,WT,HT,qT,jT,Rp=C(()=>{"use strict";st();De();He();Se();FT={name:"Pad",inputNames:["A"],inputTypes:[0]},hs=(r,e,n)=>(GT(e),[r.run({...FT,cacheHint:n.cacheKey,get:()=>VT(r,e[0],n)},e)]),Dp=r=>{let e=r.attributes.getString("mode","constant"),n=r.attributes.getFloat("value",0),t=r.attributes.getInts("pads");return be({mode:e,value:n,pads:t})},Bp=(r,e,n)=>{UT(e);let t=MT(r,e,n);return hs(r,[e[0]],t)},Lp=r=>r.attributes.getString("mode","constant"),MT=(r,e,n)=>{if(!r.session.isInitializer(e[1].dataId)||e.length>=3&&!r.session.isInitializer(e[2].dataId))throw new Error("dynamic pad attributes are not allowed");let t=Array.from(e[1].integerData),o=e.length>=3?e[2].floatData[0]:0;return be({mode:n,pads:t,value:o})},VT=(r,e,n)=>{let t=J.padShape(e.dims.slice(),n.pads),o=t.length,s=` + ${WT(r,e,n)} float process(int[${o}] indices) { return padA(indices); - }`;return{name:"Pad",inputNames:["A"],inputTypes:[0],output:{dims:t,type:e.type,textureType:0},shaderSource:s}},MT=r=>{if(!r||r.length!==1)throw new Error("Pad requires 1 input");if(r[0].type!=="float32"&&r[0].type!=="float64")throw new Error("Invalid input type.")},VT=r=>{if(!r||r.length!==2&&r.length!==3)throw new Error("Pad requires 2 or 3 inputs");if(r[1].type!=="int32")throw new Error("Invalid input type.");if(r.length>=3&&r[2].type==="string")throw new Error("Invalid input type.")},GT=(r,e,n)=>{let t=oe(r.session.backend.glContext.version),[o,i]=r.calculateTextureWidthAndHeight(e.dims,0),s=J.computeStrides(e.dims);switch(n.mode){case"constant":return UT(t,e.dims,s,o,i,n.pads,n.value);case"reflect":return WT(t,e.dims,s,o,i,n.pads);case"edge":return HT(t,e.dims,s,o,i,n.pads);default:throw new Error("Invalid mode")}},UT=(r,e,n,t,o,i,s)=>{let a=e.length,u="";for(let l=a-1;l>=0;--l)u+=` + }`;return{name:"Pad",inputNames:["A"],inputTypes:[0],output:{dims:t,type:e.type,textureType:0},shaderSource:s}},GT=r=>{if(!r||r.length!==1)throw new Error("Pad requires 1 input");if(r[0].type!=="float32"&&r[0].type!=="float64")throw new Error("Invalid input type.")},UT=r=>{if(!r||r.length!==2&&r.length!==3)throw new Error("Pad requires 2 or 3 inputs");if(r[1].type!=="int32")throw new Error("Invalid input type.");if(r.length>=3&&r[2].type==="string")throw new Error("Invalid input type.")},WT=(r,e,n)=>{let t=oe(r.session.backend.glContext.version),[o,i]=r.calculateTextureWidthAndHeight(e.dims,0),s=J.computeStrides(e.dims);switch(n.mode){case"constant":return HT(t,e.dims,s,o,i,n.pads,n.value);case"reflect":return qT(t,e.dims,s,o,i,n.pads);case"edge":return jT(t,e.dims,s,o,i,n.pads);default:throw new Error("Invalid mode")}},HT=(r,e,n,t,o,i,s)=>{let a=e.length,u="";for(let l=a-1;l>=0;--l)u+=` k = m[${l}] - ${i[l]}; if (k < 0) return constant; if (k >= ${e[l]}) return constant; @@ -850,7 +850,7 @@ float process(int indices[${h}]) { float value = getColorAsFloat(${r.texture2D}(A, coords)); return value; } - `},WT=(r,e,n,t,o,i)=>{let s=e.length,a="";for(let u=s-1;u>=0;--u)a+=` + `},qT=(r,e,n,t,o,i)=>{let s=e.length,a="";for(let u=s-1;u>=0;--u)a+=` k = m[${u}] - ${i[u]}; if (k < 0) { k = -k; } { @@ -868,7 +868,7 @@ float process(int indices[${h}]) { float value = getColorAsFloat(${r.texture2D}(A, coords)); return value; } - `},HT=(r,e,n,t,o,i)=>{let s=e.length,a="";for(let u=s-1;u>=0;--u)a+=` + `},jT=(r,e,n,t,o,i)=>{let s=e.length,a="";for(let u=s-1;u>=0;--u)a+=` k = m[${u}] - ${i[u]}; if (k < 0) k = 0; if (k >= ${e[u]}) k = ${e[u]-1}; @@ -882,13 +882,13 @@ float process(int indices[${h}]) { float value = getColorAsFloat(${r.texture2D}(A, coords)); return value; } - `}});var zp,Fp,Mp,Vp,Gp,Up,Wp,Hp,qp,qT,Np,Kp,Zo,jp,Xo,KT,Xp=C(()=>{"use strict";st();De();Se();zp=(r,e,n)=>{Zo(e);let t={name:"AveragePool",inputNames:["X"],inputTypes:[0],cacheHint:n.cacheKey};return[r.run({...t,get:()=>Mp(e,t,!1,n)},e)]},Fp=r=>{let e=r.attributes.getString("auto_pad","NOTSET"),n=r.attributes.getInt("ceil_mode",0),t=r.attributes.getInt("count_include_pad",0)!==0,o=r.attributes.getInts("kernel_shape"),i=r.attributes.getInts("strides",[]),s=r.attributes.getInts("pads",[]);if(n!==0)throw new Error("using ceil() in shape computation is not yet supported for AveragePool");return be({autoPad:e,ceilMode:n,countIncludePad:t,kernelShape:o,strides:i,pads:s})},Mp=(r,e,n,t)=>{let[o,i]=qp(r,t,n),s=J.size(o.kernelShape),a="value += _X(x);",u="";o.countIncludePad?u+=`value /= float(${s});`:u+=`value /= float(${s} - pad);`;let f=` - ${jp(r[0].dims,o,a,u,"0.0")} + `}});var zp,Fp,Mp,Vp,Gp,Up,Wp,Hp,qp,KT,Np,jp,Zo,Kp,Xo,XT,Xp=C(()=>{"use strict";st();De();Se();zp=(r,e,n)=>{Zo(e);let t={name:"AveragePool",inputNames:["X"],inputTypes:[0],cacheHint:n.cacheKey};return[r.run({...t,get:()=>Mp(e,t,!1,n)},e)]},Fp=r=>{let e=r.attributes.getString("auto_pad","NOTSET"),n=r.attributes.getInt("ceil_mode",0),t=r.attributes.getInt("count_include_pad",0)!==0,o=r.attributes.getInts("kernel_shape"),i=r.attributes.getInts("strides",[]),s=r.attributes.getInts("pads",[]);if(n!==0)throw new Error("using ceil() in shape computation is not yet supported for AveragePool");return be({autoPad:e,ceilMode:n,countIncludePad:t,kernelShape:o,strides:i,pads:s})},Mp=(r,e,n,t)=>{let[o,i]=qp(r,t,n),s=J.size(o.kernelShape),a="value += _X(x);",u="";o.countIncludePad?u+=`value /= float(${s});`:u+=`value /= float(${s} - pad);`;let f=` + ${Kp(r[0].dims,o,a,u,"0.0")} `;return{...e,output:{dims:i,type:r[0].type,textureType:0},shaderSource:f}},Vp=(r,e,n)=>{Zo(e);let t={name:"GlobalAveragePool",inputNames:["X"],inputTypes:[0],cacheHint:`${n.countIncludePad}`};return[r.run({...t,get:()=>Mp(e,t,!0,n)},e)]},Gp=r=>{let e=r.attributes.getInt("count_include_pad",0)!==0;return be({autoPad:"",ceilMode:0,countIncludePad:e,kernelShape:[],strides:[],pads:[]})},Up=(r,e,n)=>{Zo(e);let t={name:"MaxPool",inputNames:["X"],inputTypes:[0],cacheHint:n.cacheKey};return[r.run({...t,get:()=>Hp(e,t,!1,n)},e)]},Wp=r=>{let e=r.attributes.getString("auto_pad","NOTSET"),n=r.attributes.getInt("ceil_mode",0),t=r.attributes.getInts("kernel_shape"),o=r.attributes.getInts("strides",[]),i=r.attributes.getInts("pads",[]),s=r.attributes.getInt("storage_order",0),a=r.attributes.getInts("dilations",[]);if(s!==0)throw new Error("column major storage order is not yet supported for MaxPool");if(n!==0)throw new Error("using ceil() in shape computation is not yet supported for MaxPool");return be({autoPad:e,ceilMode:n,countIncludePad:!1,kernelShape:t,strides:o,pads:i,storageOrder:s,dilations:a})},Hp=(r,e,n,t)=>{let[o,i]=qp(r,t,n),s=` value = max(_X(x), value); `,a="",l=` - ${jp(r[0].dims,o,s,a,"-1e5")} - `;return{...e,output:{dims:i,type:r[0].type,textureType:0},shaderSource:l}},qp=(r,e,n)=>{let t=r[0].dims.slice(),o=Object.hasOwnProperty.call(e,"dilations"),i=e.kernelShape.slice(),s=e.strides.slice(),a=o?e.dilations.slice():[],u=e.pads.slice();Fr.adjustPoolAttributes(n,t,i,s,a,u);let l=Fr.computePoolOutputShape(n,t,s,a,i,u,e.autoPad),f=Object.assign({},e);return o?Object.assign(f,{kernelShape:i,strides:s,pads:u,dilations:a,cacheKey:e.cacheKey}):Object.assign(f,{kernelShape:i,strides:s,pads:u,cacheKey:e.cacheKey}),[f,l]},qT={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[],cacheKey:""},Np={name:"GlobalMaxPool",inputNames:["X"],inputTypes:[0]},Kp=(r,e)=>(Zo(e),[r.run({...Np,get:()=>Hp(e,Np,!0,qT)},e)]),Zo=r=>{if(!r||r.length!==1)throw new Error("Pool ops requires 1 input.");if(r[0].type!=="float32"&&r[0].type!=="float64")throw new Error("Invalid input type.")},jp=(r,e,n,t,o)=>{let i=r.length;if(e.kernelShape.length<=2){let s=e.kernelShape[e.kernelShape.length-1],a=e.strides[e.strides.length-1],u=e.pads[e.pads.length/2-1],l=e.pads[e.pads.length-1],f=r[i-1],c="",p="",b="";if(u+l!==0?c=` + ${Kp(r[0].dims,o,s,a,"-1e5")} + `;return{...e,output:{dims:i,type:r[0].type,textureType:0},shaderSource:l}},qp=(r,e,n)=>{let t=r[0].dims.slice(),o=Object.hasOwnProperty.call(e,"dilations"),i=e.kernelShape.slice(),s=e.strides.slice(),a=o?e.dilations.slice():[],u=e.pads.slice();Fr.adjustPoolAttributes(n,t,i,s,a,u);let l=Fr.computePoolOutputShape(n,t,s,a,i,u,e.autoPad),f=Object.assign({},e);return o?Object.assign(f,{kernelShape:i,strides:s,pads:u,dilations:a,cacheKey:e.cacheKey}):Object.assign(f,{kernelShape:i,strides:s,pads:u,cacheKey:e.cacheKey}),[f,l]},KT={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[],cacheKey:""},Np={name:"GlobalMaxPool",inputNames:["X"],inputTypes:[0]},jp=(r,e)=>(Zo(e),[r.run({...Np,get:()=>Hp(e,Np,!0,KT)},e)]),Zo=r=>{if(!r||r.length!==1)throw new Error("Pool ops requires 1 input.");if(r[0].type!=="float32"&&r[0].type!=="float64")throw new Error("Invalid input type.")},Kp=(r,e,n,t,o)=>{let i=r.length;if(e.kernelShape.length<=2){let s=e.kernelShape[e.kernelShape.length-1],a=e.strides[e.strides.length-1],u=e.pads[e.pads.length/2-1],l=e.pads[e.pads.length-1],f=r[i-1],c="",p="",b="";if(u+l!==0?c=` for (int i = 0; i < ${s}; i++) { x[${i} - 1] = indices[${i} - 1] * ${a} - ${u} + i; if (x[${i} - 1] < 0 || x[${i} - 1] >= ${f}) { @@ -925,7 +925,7 @@ float process(int indices[${h}]) { ${t} return value; } - `}else{let s=J.size(e.kernelShape),a=J.computeStrides(e.kernelShape),u=a.length,l=e.pads.length,f=KT(u),c=Xo(r,"inputDims"),p=Xo(e.pads,"pads"),b=Xo(a,"kernelStrides"),h=Xo(e.strides,"strides"),g=e.pads.reduce((v,S)=>v+S),T="";return g?T=` + `}else{let s=J.size(e.kernelShape),a=J.computeStrides(e.kernelShape),u=a.length,l=e.pads.length,f=XT(u),c=Xo(r,"inputDims"),p=Xo(e.pads,"pads"),b=Xo(a,"kernelStrides"),h=Xo(e.strides,"strides"),g=e.pads.reduce((v,S)=>v+S),T="";return g?T=` if (x[j] >= inputDims[j] || x[j] < 0) { pad++; isPad = true; @@ -969,7 +969,7 @@ float process(int indices[${h}]) { } `}},Xo=(r,e)=>{let n="";for(let t=0;t` + `;return n},XT=r=>` void offsetToIndices(int offset, int[${r}] strides, out int[${r}] indices) { if (${r} == 0) { return; @@ -979,7 +979,7 @@ float process(int indices[${h}]) { offset -= indices[i] * strides[i]; } indices[${r} - 1] = offset; - }`});var qr,$r,jT,XT,Zp,Yp,Jp,Qp,em,tm,rm,nm=C(()=>{"use strict";st();Vn();De();Se();qr=(r,e,n,t,o)=>{XT(e);let i={name:t,inputNames:["A"],inputTypes:[0]};return[r.run({...i,cacheHint:n.cacheKey,get:()=>jT(r,e,n,t,o,i)},e)]},$r=r=>{let e=r.attributes.getInts("axes",[]),n=r.attributes.getInt("keepdims",1)===1;return be({axes:e,keepDims:n})},jT=(r,e,n,t,o,i)=>{let s=[],a=e[0].dims.length||1,u=[],l=J.normalizeAxes(n.axes,e[0].dims.length),f=o(e,l),c=f[1];for(let h=0;h=0||l.length===0?(n.keepDims&&s.push(1),c=` + }`});var qr,$r,ZT,YT,Zp,Yp,Jp,Qp,em,tm,rm,nm=C(()=>{"use strict";st();Vn();De();Se();qr=(r,e,n,t,o)=>{YT(e);let i={name:t,inputNames:["A"],inputTypes:[0]};return[r.run({...i,cacheHint:n.cacheKey,get:()=>ZT(r,e,n,t,o,i)},e)]},$r=r=>{let e=r.attributes.getInts("axes",[]),n=r.attributes.getInt("keepdims",1)===1;return be({axes:e,keepDims:n})},ZT=(r,e,n,t,o,i)=>{let s=[],a=e[0].dims.length||1,u=[],l=J.normalizeAxes(n.axes,e[0].dims.length),f=o(e,l),c=f[1];for(let h=0;h=0||l.length===0?(n.keepDims&&s.push(1),c=` for(int j${h} = 0; j${h} < ${e[0].dims[h]}; j${h}++) { inputIdx[${h}] = j${h}; ${c} @@ -993,11 +993,11 @@ float process(int indices[${h}]) { ${c} ${f[2]} // final computation for reduce mean return value; - }`;return{...i,output:{dims:s,type:e[0].type,textureType:0},shaderSource:b}},XT=r=>{if(!r||r.length!==1)throw new Error("Reduce op requires 1 input.");if(Sr.indexOf(r[0].type)===-1)throw new Error("Invalid input type.")},Zp=(r,e,n)=>qr(r,e,n,"ReduceSum",()=>["value = 0.0;","value += _A(inputIdx);",""]),Yp=(r,e,n)=>qr(r,e,n,"ReduceMean",(o,i)=>{let s=1;for(let a=0;a=0||i.length===0)&&(s*=o[0].dims[a]);return["value = 0.0;","value += _A(inputIdx);",`value /= ${s}.;`]}),Jp=(r,e,n)=>qr(r,e,n,"ReduceMax",(o,i)=>{let s=[];for(let a=0;a=0||i.length===0)&&s.push(`inputIdx[${a}] = 0;`);return[`${s.join(` + }`;return{...i,output:{dims:s,type:e[0].type,textureType:0},shaderSource:b}},YT=r=>{if(!r||r.length!==1)throw new Error("Reduce op requires 1 input.");if(Sr.indexOf(r[0].type)===-1)throw new Error("Invalid input type.")},Zp=(r,e,n)=>qr(r,e,n,"ReduceSum",()=>["value = 0.0;","value += _A(inputIdx);",""]),Yp=(r,e,n)=>qr(r,e,n,"ReduceMean",(o,i)=>{let s=1;for(let a=0;a=0||i.length===0)&&(s*=o[0].dims[a]);return["value = 0.0;","value += _A(inputIdx);",`value /= ${s}.;`]}),Jp=(r,e,n)=>qr(r,e,n,"ReduceMax",(o,i)=>{let s=[];for(let a=0;a=0||i.length===0)&&s.push(`inputIdx[${a}] = 0;`);return[`${s.join(` `)} value = _A(inputIdx);`,"value = max(value, _A(inputIdx));",""]}),Qp=(r,e,n)=>qr(r,e,n,"ReduceMin",(o,i)=>{let s=[];for(let a=0;a=0||i.length===0)&&s.push(`inputIdx[${a}] = 0;`);return[`${s.join(` `)} -value = _A(inputIdx);`,"value = min(value, _A(inputIdx));",""]}),em=(r,e,n)=>qr(r,e,n,"ReduceProd",()=>["value = 1.0;","value *= _A(inputIdx);",""]),tm=(r,e,n)=>qr(r,e,n,"ReduceLogSum",()=>["value = 0.0;","value += _A(inputIdx);","value = log(value);"]),rm=(r,e,n)=>qr(r,e,n,"ReduceLogSumSquare",()=>["float t; value = 0.0;","t = _A(inputIdx); value += t * t;",""])});var om,im=C(()=>{"use strict";De();om=(r,e)=>{let n=J.calculateReshapedDims(e[0].dims,e[1].integerData);return r.session.pack?[r.reshapePacked(e[0],n)]:[r.reshapeUnpacked(e[0],n)]}});var am,hs,sm,um,Gn,ZT,gs,Yo,bs=C(()=>{"use strict";st();He();Se();am={name:"Upsample",inputNames:["X"],inputTypes:[0]},hs=(r,e,n)=>(gs(e,n),[r.run({...am,cacheHint:n.cacheKey,get:()=>ZT(r,e,n)},e)]),sm=r=>Gn(r,7),um=r=>Gn(r,9),Gn=(r,e)=>{let n=e>=10,t=r.attributes.getString("mode","nearest");if(t!=="nearest"&&t!=="linear"&&(e<11||t!=="cubic"))throw new Error(`unrecognized mode: ${t}`);let o=[];e<9&&(o=r.attributes.getFloats("scales"),Yo(o,t,n));let i=r.attributes.getFloat("extrapolation_value",0),s=e>10?r.attributes.getString("coordinate_transformation_mode","half_pixel"):"asymmetric";if(["asymmetric","pytorch_half_pixel","tf_half_pixel_for_nn","align_corners","tf_crop_and_resize","half_pixel"].indexOf(s)===-1)throw new Error(`coordinate_transform_mode '${s}' is not supported`);let a=s==="tf_crop_and_resize",u=a,l=t==="nearest"&&e>=11?r.attributes.getString("nearest_mode","round_prefer_floor"):"";if(["round_prefer_floor","round_prefer_ceil","floor","ceil",""].indexOf(l)===-1)throw new Error(`nearest_mode '${l}' is not supported`);let f=r.attributes.getFloat("cubic_coeff_a",-.75),c=r.attributes.getInt("exclude_outside",0)!==0;if(c&&t!=="cubic")throw new Error("exclude_outside can be set to 1 only when mode is CUBIC.");let p=e<11?!0:t==="nearest"&&s==="asymmetric"&&l==="floor",b=0,h=0,g=0;return e>10?r.inputs.length>2?(b=1,h=2,g=3):(h=1,g=2):e===9&&(h=1),be({opset:e,isResize:n,mode:t,scales:o,extrapolationValue:i,coordinateTransformMode:s,useExtrapolation:u,needRoiInput:a,nearestMode:l,cubicCoefficientA:f,excludeOutside:c,useNearest2xOptimization:p,roiInputIdx:b,scalesInputIdx:h,sizesInputIdx:g})},ZT=(r,e,n)=>{let t=oe(r.session.backend.glContext.version),[o,i]=r.calculateTextureWidthAndHeight(e[0].dims,0),s=e[0].dims.map((g,T)=>Math.floor(g*n.scales[T])),[a,u]=r.calculateTextureWidthAndHeight(s,0),l=s.length,f=new Array(l),c=new Array(l),p=` +value = _A(inputIdx);`,"value = min(value, _A(inputIdx));",""]}),em=(r,e,n)=>qr(r,e,n,"ReduceProd",()=>["value = 1.0;","value *= _A(inputIdx);",""]),tm=(r,e,n)=>qr(r,e,n,"ReduceLogSum",()=>["value = 0.0;","value += _A(inputIdx);","value = log(value);"]),rm=(r,e,n)=>qr(r,e,n,"ReduceLogSumSquare",()=>["float t; value = 0.0;","t = _A(inputIdx); value += t * t;",""])});var om,im=C(()=>{"use strict";De();om=(r,e)=>{let n=J.calculateReshapedDims(e[0].dims,e[1].integerData);return r.session.pack?[r.reshapePacked(e[0],n)]:[r.reshapeUnpacked(e[0],n)]}});var am,gs,sm,um,Gn,JT,bs,Yo,ys=C(()=>{"use strict";st();He();Se();am={name:"Upsample",inputNames:["X"],inputTypes:[0]},gs=(r,e,n)=>(bs(e,n),[r.run({...am,cacheHint:n.cacheKey,get:()=>JT(r,e,n)},e)]),sm=r=>Gn(r,7),um=r=>Gn(r,9),Gn=(r,e)=>{let n=e>=10,t=r.attributes.getString("mode","nearest");if(t!=="nearest"&&t!=="linear"&&(e<11||t!=="cubic"))throw new Error(`unrecognized mode: ${t}`);let o=[];e<9&&(o=r.attributes.getFloats("scales"),Yo(o,t,n));let i=r.attributes.getFloat("extrapolation_value",0),s=e>10?r.attributes.getString("coordinate_transformation_mode","half_pixel"):"asymmetric";if(["asymmetric","pytorch_half_pixel","tf_half_pixel_for_nn","align_corners","tf_crop_and_resize","half_pixel"].indexOf(s)===-1)throw new Error(`coordinate_transform_mode '${s}' is not supported`);let a=s==="tf_crop_and_resize",u=a,l=t==="nearest"&&e>=11?r.attributes.getString("nearest_mode","round_prefer_floor"):"";if(["round_prefer_floor","round_prefer_ceil","floor","ceil",""].indexOf(l)===-1)throw new Error(`nearest_mode '${l}' is not supported`);let f=r.attributes.getFloat("cubic_coeff_a",-.75),c=r.attributes.getInt("exclude_outside",0)!==0;if(c&&t!=="cubic")throw new Error("exclude_outside can be set to 1 only when mode is CUBIC.");let p=e<11?!0:t==="nearest"&&s==="asymmetric"&&l==="floor",b=0,h=0,g=0;return e>10?r.inputs.length>2?(b=1,h=2,g=3):(h=1,g=2):e===9&&(h=1),be({opset:e,isResize:n,mode:t,scales:o,extrapolationValue:i,coordinateTransformMode:s,useExtrapolation:u,needRoiInput:a,nearestMode:l,cubicCoefficientA:f,excludeOutside:c,useNearest2xOptimization:p,roiInputIdx:b,scalesInputIdx:h,sizesInputIdx:g})},JT=(r,e,n)=>{let t=oe(r.session.backend.glContext.version),[o,i]=r.calculateTextureWidthAndHeight(e[0].dims,0),s=e[0].dims.map((g,T)=>Math.floor(g*n.scales[T])),[a,u]=r.calculateTextureWidthAndHeight(s,0),l=s.length,f=new Array(l),c=new Array(l),p=` int output_pitches[${l}]; int input_pitches[${l}]; `;for(let g=l-1;g>=0;g--)f[g]=g===l-1?1:f[g+1]*s[g+1],c[g]=g===l-1?1:c[g+1]*e[0].dims[g+1],p+=` @@ -1133,7 +1133,7 @@ value = _A(inputIdx);`,"value = min(value, _A(inputIdx));",""]}),em=(r,e,n)=>qr( float y0 = x00 + float(y_offset) * (x01 - x00) / float(scales[0]); float y1 = x10 + float(y_offset) * (x11 - x10) / float(scales[0]); return y0 + float(x_offset) * (y1 - y0) / float(scales[1]); - }`;return{...am,output:{dims:s,type:e[0].type,textureType:0},shaderSource:h,variables:[{name:"scales",type:"int",arrayLength:n.scales.length,data:n.scales.map(g=>Math.ceil(g))}]}},gs=(r,e)=>{if(!r||e.opset<9&&r.length!==1||e.opset>=9&&e.opset<11&&r.length!==2||e.opset>=11&&r.length<2)throw new Error("invalid inputs.");if(e.scales.length>0&&r[0].dims.length!==e.scales.length)throw new Error("Invalid input shape.");if(r[0].type==="string")throw new Error("Invalid input tensor types.")},Yo=(r,e,n)=>{if(n){for(let t of r)if(t<=0)throw new Error("Scale value should be greater than 0.")}else for(let t of r)if(t<1)throw new Error("Scale value should be greater than or equal to 1.");if((e==="linear"||e==="cubic")&&r.length!==2&&(r.length!==4||r[0]!==1||r[1]!==1))throw new Error(`'Linear' mode and 'Cubic' mode only support 2-D inputs ('Bilinear', 'Bicubic') or 4-D inputs with the corresponding outermost 2 scale values being 1 in the ${n?"Resize":"Upsample"} opeartor.`)}});var ys,xs,lm,cm,YT,JT,QT,e_,fm=C(()=>{"use strict";He();Se();Qt();Ur();bs();ys={name:"Resize",inputNames:["A"],inputTypes:[2]},xs=(r,e,n)=>(gs(e,n),[r.run({...ys,cacheHint:n.cacheKey,get:()=>YT(r,e,n)},e)]),lm=r=>Gn(r,10),cm=r=>Gn(r,11),YT=(r,e,n)=>{let t=oe(r.session.backend.glContext.version),[o,i]=JT(e,n);if(o.every(S=>S===1)&&n.coordinateTransformMode!=="tf_crop_and_resize")return{...ys,output:{dims:i,type:e[0].type,textureType:2},hasMain:!0,shaderSource:`void main() { + }`;return{...am,output:{dims:s,type:e[0].type,textureType:0},shaderSource:h,variables:[{name:"scales",type:"int",arrayLength:n.scales.length,data:n.scales.map(g=>Math.ceil(g))}]}},bs=(r,e)=>{if(!r||e.opset<9&&r.length!==1||e.opset>=9&&e.opset<11&&r.length!==2||e.opset>=11&&r.length<2)throw new Error("invalid inputs.");if(e.scales.length>0&&r[0].dims.length!==e.scales.length)throw new Error("Invalid input shape.");if(r[0].type==="string")throw new Error("Invalid input tensor types.")},Yo=(r,e,n)=>{if(n){for(let t of r)if(t<=0)throw new Error("Scale value should be greater than 0.")}else for(let t of r)if(t<1)throw new Error("Scale value should be greater than or equal to 1.");if((e==="linear"||e==="cubic")&&r.length!==2&&(r.length!==4||r[0]!==1||r[1]!==1))throw new Error(`'Linear' mode and 'Cubic' mode only support 2-D inputs ('Bilinear', 'Bicubic') or 4-D inputs with the corresponding outermost 2 scale values being 1 in the ${n?"Resize":"Upsample"} opeartor.`)}});var xs,vs,lm,cm,QT,e_,t_,r_,fm=C(()=>{"use strict";He();Se();Qt();Ur();ys();xs={name:"Resize",inputNames:["A"],inputTypes:[2]},vs=(r,e,n)=>(bs(e,n),[r.run({...xs,cacheHint:n.cacheKey,get:()=>QT(r,e,n)},e)]),lm=r=>Gn(r,10),cm=r=>Gn(r,11),QT=(r,e,n)=>{let t=oe(r.session.backend.glContext.version),[o,i]=e_(e,n);if(o.every(S=>S===1)&&n.coordinateTransformMode!=="tf_crop_and_resize")return{...xs,output:{dims:i,type:e[0].type,textureType:2},hasMain:!0,shaderSource:`void main() { vec4 v = ${t.texture2D}(X, TexCoords); ${t.output} = v; }`};let a=i.length;if(a<2)throw new Error(`output dimension should be at least 2, but got ${a}`);let u=i[a-2],l=i[a-1],f=e[0].dims;if(a!==f.length)throw new Error(`output dimension should match input ${f.length}, but got ${a}`);let c=f[a-2],p=f[a-1],b=o[a-2],h=o[a-1],g="";if(n.mode!=="linear")throw new Error(`resize (packed) does not support mode: '${n.mode}'`);switch(n.coordinateTransformMode){case"asymmetric":g=` @@ -1230,12 +1230,12 @@ value = _A(inputIdx);`,"value = min(value, _A(inputIdx));",""]}),em=(r,e,n)=>qr( ${t.output} = vec4(newValue); } - `;return{...ys,output:{dims:i,type:e[0].type,textureType:2},hasMain:!0,shaderSource:v}},JT=(r,e)=>{let t=r[0].dims,o=e.scales,i;if(o.length===0){let a=r[e.scalesInputIdx];if(a&&a.size!==0){if(r[e.sizesInputIdx])throw new Error("Only one of scales or sizes must be provided as input.");o=QT(a,e.mode,e.isResize)}else{let u=r[e.sizesInputIdx];if(!u||u.size===0)throw new Error("Either scales or sizes MUST be provided as input.");i=Array.from(u.integerData),o=e_(i,t,e.mode,e.isResize)}}else if(r[e.sizesInputIdx])throw new Error("Only one of scales or sizes must be provided as input.");let s=i||t.map((a,u)=>Math.floor(a*o[u]));return[o,s]},QT=(r,e,n)=>{let t=Array.from(r.floatData);return Yo(t,e,n),t},e_=(r,e,n,t)=>{let o=e.length,i=new Array(o);for(let s=0,a=o;s{"use strict";Gr();dm=(r,e)=>(t_(e),[new Qe([e[0].dims.length],"int32",void 0,void 0,new Int32Array(e[0].dims))]),t_=r=>{if(!r||r.length!==1)throw new Error("Shape requires 1 input.")}});var vs,mm,hm,gm,r_,bm,n_,o_,ym=C(()=>{"use strict";st();Vn();De();Se();vs={name:"Slice",inputNames:["A"],inputTypes:[0]},mm=(r,e,n)=>(r_(e),[r.run({...vs,cacheHint:n.cacheKey,get:()=>gm(r,e[0],n)},e)]),hm=r=>{let e=r.attributes.getInts("starts"),n=r.attributes.getInts("ends"),t=r.attributes.getInts("axes",[]);return be({starts:e,ends:n,axes:t})},gm=(r,e,n)=>{let t=n.axes.length===0?e.dims.slice(0).map((c,p)=>p):n.axes,o=J.normalizeAxes(t,e.dims.length),i=n.starts.map((c,p)=>c>e.dims[o[p]]-1?e.dims[o[p]]:J.normalizeAxis(c,e.dims[o[p]])),s=n.ends.map((c,p)=>c>e.dims[o[p]]-1?e.dims[o[p]]:J.normalizeAxis(c,e.dims[o[p]])),a=e.dims.slice(),u=[];for(let c=0;c0&&u.push(`outputIdx[${o[c]}] += ${i[c]};`);let f=` + `;return{...xs,output:{dims:i,type:e[0].type,textureType:2},hasMain:!0,shaderSource:v}},e_=(r,e)=>{let t=r[0].dims,o=e.scales,i;if(o.length===0){let a=r[e.scalesInputIdx];if(a&&a.size!==0){if(r[e.sizesInputIdx])throw new Error("Only one of scales or sizes must be provided as input.");o=t_(a,e.mode,e.isResize)}else{let u=r[e.sizesInputIdx];if(!u||u.size===0)throw new Error("Either scales or sizes MUST be provided as input.");i=Array.from(u.integerData),o=r_(i,t,e.mode,e.isResize)}}else if(r[e.sizesInputIdx])throw new Error("Only one of scales or sizes must be provided as input.");let s=i||t.map((a,u)=>Math.floor(a*o[u]));return[o,s]},t_=(r,e,n)=>{let t=Array.from(r.floatData);return Yo(t,e,n),t},r_=(r,e,n,t)=>{let o=e.length,i=new Array(o);for(let s=0,a=o;s{"use strict";Gr();dm=(r,e)=>(n_(e),[new Qe([e[0].dims.length],"int32",void 0,void 0,new Int32Array(e[0].dims))]),n_=r=>{if(!r||r.length!==1)throw new Error("Shape requires 1 input.")}});var ws,mm,hm,gm,o_,bm,i_,a_,ym=C(()=>{"use strict";st();Vn();De();Se();ws={name:"Slice",inputNames:["A"],inputTypes:[0]},mm=(r,e,n)=>(o_(e),[r.run({...ws,cacheHint:n.cacheKey,get:()=>gm(r,e[0],n)},e)]),hm=r=>{let e=r.attributes.getInts("starts"),n=r.attributes.getInts("ends"),t=r.attributes.getInts("axes",[]);return be({starts:e,ends:n,axes:t})},gm=(r,e,n)=>{let t=n.axes.length===0?e.dims.slice(0).map((c,p)=>p):n.axes,o=J.normalizeAxes(t,e.dims.length),i=n.starts.map((c,p)=>c>e.dims[o[p]]-1?e.dims[o[p]]:J.normalizeAxis(c,e.dims[o[p]])),s=n.ends.map((c,p)=>c>e.dims[o[p]]-1?e.dims[o[p]]:J.normalizeAxis(c,e.dims[o[p]])),a=e.dims.slice(),u=[];for(let c=0;c0&&u.push(`outputIdx[${o[c]}] += ${i[c]};`);let f=` float process(int outputIdx[${a.length}]) { ${u.join(` `)} return _A(outputIdx); - }`;return{...vs,output:{dims:a,type:e.type,textureType:0},shaderSource:f}},r_=r=>{if(!r||r.length!==1)throw new Error("Slice requires 1 input.");if(Sr.indexOf(r[0].type)===-1)throw new Error("Invalid input type.")},bm=(r,e)=>{o_(e);let n=n_(r,e);return[r.run({...vs,cacheHint:n.cacheKey,get:()=>gm(r,e[0],n)},[e[0]])]},n_=(r,e)=>{if(!r.session.isInitializer(e[1].dataId)||!r.session.isInitializer(e[2].dataId)||e.length>=4&&!r.session.isInitializer(e[3].dataId)||e.length>=5&&!r.session.isInitializer(e[4].dataId))throw new Error("dynamic slice attributes are not allowed");if(e.length>=5&&e[4].integerData.some(s=>s!==1))throw new Error("currently non-1 steps is not supported for Slice");let n=Array.from(e[1].integerData),t=Array.from(e[2].integerData),o=e.length>=4?Array.from(e[3].integerData):[],i=`${o};${n};${t}`;return{starts:n,ends:t,axes:o,cacheKey:i}},o_=r=>{if(!r||r.length<3||r.length>5)throw new Error("Invalid input number.");if(r[1].type!=="int32"||r[1].dims.length!==1)throw new Error("Invalid input type.");if(r[2].type!=="int32"||r[2].dims.length!==1)throw new Error("Invalid input type.");if(r.length>=4&&(r[3].type!=="int32"||r[3].dims.length!==1))throw new Error("Invalid input type.");if(r.length>=5&&(r[4].type!=="int32"||r[4].dims.length!==1))throw new Error("Invalid input type.")}});var xm,vm,wm,Tm,_m,Im,Sm,$m,i_,a_,s_,Am,Pm=C(()=>{"use strict";st();De();He();Se();jo();xm={name:"SoftmaxComputeMax",inputNames:["A"],inputTypes:[0]},vm={name:"SoftmaxComputeScale",inputNames:["A","Max"],inputTypes:[0,0]},wm={name:"SoftMax",inputNames:["A","Max","Norm"],inputTypes:[0,0,0]},Tm=(r,e,n)=>{Am(e);let t=e[0].dims.slice(),o=J.normalizeAxis(n.axis,t.length),i=J.sizeToDimension(t,o),s=J.sizeFromDimension(t,o);return $m(r,e,n,i,s)},_m=r=>be({axis:r.attributes.getInt("axis",1)}),Im=r=>be({axis:r.attributes.getInt("axis",-1)}),Sm=(r,e,n)=>{Am(e);let t=e[0].dims.slice(),o=J.normalizeAxis(n.axis,t.length),i=t.length,s=o!==i-1,a=[],u=[],l=[],f;s&&(u=Array.from({length:i}).map((h,g)=>g),u[o]=i-1,u[i-1]=o,u.map(h=>a.push(t[h])),f=be({perm:u}),l=Hr(r,e,f));let c=s?J.sizeToDimension(a,i-1):J.sizeToDimension(t,i-1),p=s?J.sizeFromDimension(a,i-1):J.sizeFromDimension(t,i-1),b=$m(r,s?l:e,n,c,p);return s?Hr(r,b,f):b},$m=(r,e,n,t,o)=>{let i=i_(r,e[0],t,o,[t]),s=r.run({...xm,cacheHint:n.cacheKey,get:()=>i},e),a=a_(r,e[0],t,o,i.output.dims,[t]),u=r.run({...vm,cacheHint:n.cacheKey,get:()=>a},[e[0],s]),l=s_(r,e[0],t,o,i.output.dims,a.output.dims);return[r.run({...wm,cacheHint:n.cacheKey,get:()=>l},[e[0],s,u])]},i_=(r,e,n,t,o)=>{let[i,s]=r.calculateTextureWidthAndHeight(e.dims,0),a=o.length;if(n<1||t<1)throw new Error("Logical row count N and feature count D must be greater than or equal to 1");if(o.length!==1)throw new Error("Dimensionality of the output should be 1");if(o[0]!==n)throw new Error("Shape of the output should be equal to logical row count");let u=oe(r.session.backend.glContext.version),l=` + }`;return{...ws,output:{dims:a,type:e.type,textureType:0},shaderSource:f}},o_=r=>{if(!r||r.length!==1)throw new Error("Slice requires 1 input.");if(Sr.indexOf(r[0].type)===-1)throw new Error("Invalid input type.")},bm=(r,e)=>{a_(e);let n=i_(r,e);return[r.run({...ws,cacheHint:n.cacheKey,get:()=>gm(r,e[0],n)},[e[0]])]},i_=(r,e)=>{if(!r.session.isInitializer(e[1].dataId)||!r.session.isInitializer(e[2].dataId)||e.length>=4&&!r.session.isInitializer(e[3].dataId)||e.length>=5&&!r.session.isInitializer(e[4].dataId))throw new Error("dynamic slice attributes are not allowed");if(e.length>=5&&e[4].integerData.some(s=>s!==1))throw new Error("currently non-1 steps is not supported for Slice");let n=Array.from(e[1].integerData),t=Array.from(e[2].integerData),o=e.length>=4?Array.from(e[3].integerData):[],i=`${o};${n};${t}`;return{starts:n,ends:t,axes:o,cacheKey:i}},a_=r=>{if(!r||r.length<3||r.length>5)throw new Error("Invalid input number.");if(r[1].type!=="int32"||r[1].dims.length!==1)throw new Error("Invalid input type.");if(r[2].type!=="int32"||r[2].dims.length!==1)throw new Error("Invalid input type.");if(r.length>=4&&(r[3].type!=="int32"||r[3].dims.length!==1))throw new Error("Invalid input type.");if(r.length>=5&&(r[4].type!=="int32"||r[4].dims.length!==1))throw new Error("Invalid input type.")}});var xm,vm,wm,Tm,_m,Im,Sm,$m,s_,u_,l_,Am,Pm=C(()=>{"use strict";st();De();He();Se();Ko();xm={name:"SoftmaxComputeMax",inputNames:["A"],inputTypes:[0]},vm={name:"SoftmaxComputeScale",inputNames:["A","Max"],inputTypes:[0,0]},wm={name:"SoftMax",inputNames:["A","Max","Norm"],inputTypes:[0,0,0]},Tm=(r,e,n)=>{Am(e);let t=e[0].dims.slice(),o=J.normalizeAxis(n.axis,t.length),i=J.sizeToDimension(t,o),s=J.sizeFromDimension(t,o);return $m(r,e,n,i,s)},_m=r=>be({axis:r.attributes.getInt("axis",1)}),Im=r=>be({axis:r.attributes.getInt("axis",-1)}),Sm=(r,e,n)=>{Am(e);let t=e[0].dims.slice(),o=J.normalizeAxis(n.axis,t.length),i=t.length,s=o!==i-1,a=[],u=[],l=[],f;s&&(u=Array.from({length:i}).map((h,g)=>g),u[o]=i-1,u[i-1]=o,u.map(h=>a.push(t[h])),f=be({perm:u}),l=Hr(r,e,f));let c=s?J.sizeToDimension(a,i-1):J.sizeToDimension(t,i-1),p=s?J.sizeFromDimension(a,i-1):J.sizeFromDimension(t,i-1),b=$m(r,s?l:e,n,c,p);return s?Hr(r,b,f):b},$m=(r,e,n,t,o)=>{let i=s_(r,e[0],t,o,[t]),s=r.run({...xm,cacheHint:n.cacheKey,get:()=>i},e),a=u_(r,e[0],t,o,i.output.dims,[t]),u=r.run({...vm,cacheHint:n.cacheKey,get:()=>a},[e[0],s]),l=l_(r,e[0],t,o,i.output.dims,a.output.dims);return[r.run({...wm,cacheHint:n.cacheKey,get:()=>l},[e[0],s,u])]},s_=(r,e,n,t,o)=>{let[i,s]=r.calculateTextureWidthAndHeight(e.dims,0),a=o.length;if(n<1||t<1)throw new Error("Logical row count N and feature count D must be greater than or equal to 1");if(o.length!==1)throw new Error("Dimensionality of the output should be 1");if(o[0]!==n)throw new Error("Shape of the output should be equal to logical row count");let u=oe(r.session.backend.glContext.version),l=` float process(int[${a}] indices) { int logical_row_start_offset = indices[0] * ${t}; @@ -1250,7 +1250,7 @@ value = _A(inputIdx);`,"value = min(value, _A(inputIdx));",""]}),em=(r,e,n)=>qr( } return max; - }`;return{...xm,output:{dims:o,type:e.type,textureType:0},shaderSource:l}},a_=(r,e,n,t,o,i)=>{let[s,a]=r.calculateTextureWidthAndHeight(e.dims,0),u=i.length;if(n<1||t<1)throw new Error("Logical row count N and feature count D must be greater than or equal to 1");if(i.length!==1)throw new Error("Dimensionality of the output should be 1");if(i[0]!==n)throw new Error("Shape of the output should be equal to logical row count");if(o.length!==1)throw new Error("Dimensionality of the intermediate results should be 1");if(o[0]!==n)throw new Error("Shape of the intermediate results should be equal to logical row count");let l=oe(r.session.backend.glContext.version),f=` + }`;return{...xm,output:{dims:o,type:e.type,textureType:0},shaderSource:l}},u_=(r,e,n,t,o,i)=>{let[s,a]=r.calculateTextureWidthAndHeight(e.dims,0),u=i.length;if(n<1||t<1)throw new Error("Logical row count N and feature count D must be greater than or equal to 1");if(i.length!==1)throw new Error("Dimensionality of the output should be 1");if(i[0]!==n)throw new Error("Shape of the output should be equal to logical row count");if(o.length!==1)throw new Error("Dimensionality of the intermediate results should be 1");if(o[0]!==n)throw new Error("Shape of the intermediate results should be equal to logical row count");let l=oe(r.session.backend.glContext.version),f=` float process(int[${u}] indices) { int logical_row_start_offset = indices[0] * ${t}; @@ -1263,7 +1263,7 @@ value = _A(inputIdx);`,"value = min(value, _A(inputIdx));",""]}),em=(r,e,n)=>qr( } return norm_factor; - }`;return{...vm,output:{dims:i,type:e.type,textureType:0},shaderSource:f}},s_=(r,e,n,t,o,i)=>{let[s,a]=r.calculateTextureWidthAndHeight(e.dims,0),u=e.dims.length;if(n<1||t<1)throw new Error("Logical row count N and feature count D must be greater than or equal to 1");if(o.length!==1||i.length!==1)throw new Error("Dimensionality of the intermediate results should be 1");if(o[0]!==n||i[0]!==n)throw new Error("Shape of the intermediate results should be equal to logical row count");let l=` + }`;return{...vm,output:{dims:i,type:e.type,textureType:0},shaderSource:f}},l_=(r,e,n,t,o,i)=>{let[s,a]=r.calculateTextureWidthAndHeight(e.dims,0),u=e.dims.length;if(n<1||t<1)throw new Error("Logical row count N and feature count D must be greater than or equal to 1");if(o.length!==1||i.length!==1)throw new Error("Dimensionality of the intermediate results should be 1");if(o[0]!==n||i[0]!==n)throw new Error("Shape of the intermediate results should be equal to logical row count");let l=` float process(int[${u}] indices) { // get offset of current logical tensor index from the 2-D texture coordinates (TexCoords) @@ -1282,31 +1282,31 @@ value = _A(inputIdx);`,"value = min(value, _A(inputIdx));",""]}),em=(r,e,n)=>qr( return 0.0; return exp(_A(indices) - _Max(logical_row_index)) / norm_factor; - }`;return{...wm,output:{dims:e.dims,type:e.type,textureType:0},shaderSource:l}},Am=r=>{if(!r||r.length!==1)throw new Error("Softmax requires 1 input.");if(r[0].type!=="float32"&&r[0].type!=="float64")throw new Error("Invalid input type")}});var Om,Em,Cm,u_,l_,c_,km=C(()=>{"use strict";st();De();Se();Om={name:"Split",inputNames:["A"],inputTypes:[0]},Em=(r,e,n)=>{c_(e);let t=J.normalizeAxis(n.axis,e[0].dims.length),o=u_(r,e,t,n),i=[];for(let s=0;sl_(r,e[0],n,t,s)},e));return i},Cm=r=>{let e=r.attributes.getInt("axis",0),n=r.attributes.getInts("split",[]),t=r.outputs.length;return be({axis:e,split:n,numOutputs:t})},u_=(r,e,n,t)=>{let[,o]=Ln.splitShape(e[0].dims,n,t.split,t.numOutputs);return o.length},l_=(r,e,n,t,o)=>{let[i,s]=Ln.splitShape(e.dims,t,n.split,n.numOutputs),a=s[o],u=i[o],f=` + }`;return{...wm,output:{dims:e.dims,type:e.type,textureType:0},shaderSource:l}},Am=r=>{if(!r||r.length!==1)throw new Error("Softmax requires 1 input.");if(r[0].type!=="float32"&&r[0].type!=="float64")throw new Error("Invalid input type")}});var Om,Em,Cm,c_,f_,d_,km=C(()=>{"use strict";st();De();Se();Om={name:"Split",inputNames:["A"],inputTypes:[0]},Em=(r,e,n)=>{d_(e);let t=J.normalizeAxis(n.axis,e[0].dims.length),o=c_(r,e,t,n),i=[];for(let s=0;sf_(r,e[0],n,t,s)},e));return i},Cm=r=>{let e=r.attributes.getInt("axis",0),n=r.attributes.getInts("split",[]),t=r.outputs.length;return be({axis:e,split:n,numOutputs:t})},c_=(r,e,n,t)=>{let[,o]=Ln.splitShape(e[0].dims,n,t.split,t.numOutputs);return o.length},f_=(r,e,n,t,o)=>{let[i,s]=Ln.splitShape(e.dims,t,n.split,n.numOutputs),a=s[o],u=i[o],f=` float process(int indices[${u.length}]) { indices[${t}] += ${a}; return _A(indices); } - `;return{...Om,cacheHint:`${n.cacheKey}:${o}`,output:{dims:u,type:e.type,textureType:0},shaderSource:f}},c_=r=>{if(!r||r.length!==1)throw new Error("Split requires one input.");if(r[0].type!=="int8"&&r[0].type!=="uint8"&&r[0].type!=="int16"&&r[0].type!=="uint16"&&r[0].type!=="int32"&&r[0].type!=="uint32"&&r[0].type!=="float32"&&r[0].type!=="float64"&&r[0].type!=="bool")throw new Error("Invalid input type.")}});var ws,Dm,Bm,f_,d_,Lm=C(()=>{"use strict";De();ws=(r,e,n)=>{f_(e);let t=J.squeezeShape(e[0].dims,n);return[r.reshapeUnpacked(e[0],t)]},Dm=(r,e)=>(d_(e),ws(r,[e[0]],Array.from(e[1].integerData))),Bm=r=>r.attributes.getInts("axes"),f_=r=>{if(!r||r.length!==1)throw new Error("Squeeze requires 1 input.");if(r[0].type==="string")throw new Error("invalid input tensor types.")},d_=r=>{if(!r||r.length!==2)throw new Error("Squeeze requires 2 inputs.");if(r[1].type!=="int32")throw new Error("Invalid input type.")}});var Rm,p_,m_,Nm=C(()=>{"use strict";He();Se();Rm=(r,e)=>{m_(e);let n={name:"Sum",inputNames:e.map((o,i)=>`X${i}`),inputTypes:new Array(e.length).fill(0)};return[r.run({...n,get:()=>p_(r,e,n)},e)]},p_=(r,e,n)=>{let t=oe(r.session.backend.glContext.version),o=e[0].dims.slice(),s=` + `;return{...Om,cacheHint:`${n.cacheKey}:${o}`,output:{dims:u,type:e.type,textureType:0},shaderSource:f}},d_=r=>{if(!r||r.length!==1)throw new Error("Split requires one input.");if(r[0].type!=="int8"&&r[0].type!=="uint8"&&r[0].type!=="int16"&&r[0].type!=="uint16"&&r[0].type!=="int32"&&r[0].type!=="uint32"&&r[0].type!=="float32"&&r[0].type!=="float64"&&r[0].type!=="bool")throw new Error("Invalid input type.")}});var Ts,Dm,Bm,p_,m_,Lm=C(()=>{"use strict";De();Ts=(r,e,n)=>{p_(e);let t=J.squeezeShape(e[0].dims,n);return[r.reshapeUnpacked(e[0],t)]},Dm=(r,e)=>(m_(e),Ts(r,[e[0]],Array.from(e[1].integerData))),Bm=r=>r.attributes.getInts("axes"),p_=r=>{if(!r||r.length!==1)throw new Error("Squeeze requires 1 input.");if(r[0].type==="string")throw new Error("invalid input tensor types.")},m_=r=>{if(!r||r.length!==2)throw new Error("Squeeze requires 2 inputs.");if(r[1].type!=="int32")throw new Error("Invalid input type.")}});var Rm,h_,g_,Nm=C(()=>{"use strict";He();Se();Rm=(r,e)=>{g_(e);let n={name:"Sum",inputNames:e.map((o,i)=>`X${i}`),inputTypes:new Array(e.length).fill(0)};return[r.run({...n,get:()=>h_(r,e,n)},e)]},h_=(r,e,n)=>{let t=oe(r.session.backend.glContext.version),o=e[0].dims.slice(),s=` void main() { vec4 result = ${e.map((a,u)=>`${t.texture2D}(X${u},TexCoords)`).join(" + ")}; ${t.output} = result; } - `;return{...n,output:{dims:o,type:e[0].type,textureType:0},hasMain:!0,shaderSource:s}},m_=r=>{if(!r||r.length===0)throw new Error("Sum requires inputs.");let e=r[0].dims.length;for(let n=1;n{"use strict";Vn();Se();zm=(r,e)=>{g_(e);let n={name:"Tile",inputNames:["A"],inputTypes:[0]};return[r.run({...n,get:()=>h_(r,e,n)},e)]},h_=(r,e,n)=>{let t=e[0].dims.slice(),o=new Array(t.length),i=[];for(let u=0;u{if(!r||r.length===0)throw new Error("Sum requires inputs.");let e=r[0].dims.length;for(let n=1;n{"use strict";Vn();Se();zm=(r,e)=>{y_(e);let n={name:"Tile",inputNames:["A"],inputTypes:[0]};return[r.run({...n,get:()=>b_(r,e,n)},e)]},b_=(r,e,n)=>{let t=e[0].dims.slice(),o=new Array(t.length),i=[];for(let u=0;u{if(!r||r.length!==2)throw new Error("Tile requires 2 input.");if(r[1].dims.length!==1)throw new Error("The second input shape must 1 dimension.");if(r[1].dims[0]!==r[0].dims.length)throw new Error("Invalid input shape.");if(Sr.indexOf(r[0].type)===-1)throw new Error("Invalid input type.");if(r[1].type!=="int32"&&r[1].type!=="int16")throw new Error("Invalid repeat type.")}});var Ts,Mm,Vm,b_,y_,Gm=C(()=>{"use strict";De();Ts=(r,e,n)=>{b_(e);let t=J.unsqueezeShape(e[0].dims,n);return[r.reshapeUnpacked(e[0],t)]},Mm=(r,e)=>(y_(e),Ts(r,[e[0]],Array.from(e[1].integerData))),Vm=r=>r.attributes.getInts("axes"),b_=r=>{if(!r||r.length!==1)throw new Error("Unsqueeze requires 1 input.");if(r[0].type==="string")throw new Error("invalid input tensor types.")},y_=r=>{if(!r||r.length!==2)throw new Error("Unsqueeze requires 2 inputs.");if(r[1].type!=="int32")throw new Error("Invalid input type.")}});var Um,Wm=C(()=>{"use strict";ed();pd();gd();Td();Ho();ip();fp();mp();bp();wp();Ip();Pp();kp();qo();Rp();Xp();nm();im();fm();pm();ym();Pm();km();Lm();Nm();Fm();jo();is();Gm();bs();Um=[["Abs","","6+",_d],["Acos","","7+",Id],["Add","","7+",td],["And","","7+",rd],["Asin","","7+",Sd],["Atan","","7+",$d],["AveragePool","","7+",zp,Fp],["BatchNormalization","","7+",Jf,Qf],["Cast","","6+",md,hd],["Ceil","","6+",Od],["Clip","","6-10",ns,Ad],["Clip","","11+",Pd],["Concat","","4+",xd,wd],["Conv","","1+",fs,ds],["ConvTranspose","","1+",np,op],["Cos","","7+",Ed],["Div","","7+",nd],["Dropout","","7+",os],["DepthToSpace","","1+",lp,cp],["Equal","","7+",od],["Elu","","6+",Cd,kd],["Exp","","6+",Dd],["Flatten","","1+",dp,pp],["Floor","","6+",Bd],["FusedConv","com.microsoft","1+",fs,ds],["Gather","","1+",hp,gp],["Gemm","","7-10",ps,xp],["Gemm","","11+",ps,vp],["GlobalAveragePool","","1+",Vp,Gp],["GlobalMaxPool","","1+",Kp],["Greater","","7+",id],["Identity","","1+",os],["ImageScaler","","1+",Tp,_p],["InstanceNormalization","","6+",$p,Ap],["LeakyRelu","","6+",Ld,Rd],["Less","","7+",ad],["LRN","","1+",Op,Ep],["Log","","6+",Nd],["MatMul","","1+",Zd,Yd],["MaxPool","","1+",Up,Wp],["Mul","","7+",sd],["Neg","","6+",zd],["Not","","1+",Fd],["Or","","7+",ud],["Pad","","2-10",ms,Dp],["Pad","","11+",Bp,Lp],["Pow","","7+",ld],["PRelu","","7+",cd],["ReduceLogSum","","1+",tm,$r],["ReduceMax","","1+",Jp,$r],["ReduceMean","","1+",Yp,$r],["ReduceMin","","1+",Qp,$r],["ReduceProd","","1+",em,$r],["ReduceSum","","1-12",Zp,$r],["ReduceSumSquare","","1+",rm,$r],["Relu","","6+",Md],["Reshape","","5+",om],["Resize","","10",xs,lm],["Resize","","11+",xs,cm],["Shape","","1+",dm],["Sigmoid","","6+",Vd],["Sin","","7+",Gd],["Slice","","10+",bm],["Slice","","1-9",mm,hm],["Softmax","","1-12",Tm,_m],["Softmax","","13+",Sm,Im],["Split","","2-12",Em,Cm],["Sqrt","","6+",Ud],["Squeeze","","1-12",ws,Bm],["Squeeze","","13+",Dm],["Sub","","7+",fd],["Sum","","6+",Rm],["Tan","","7+",Wd],["Tanh","","6+",Hd],["Tile","","6+",zm],["Transpose","","1+",Hr,sp],["Upsample","","7-8",hs,sm],["Upsample","","9",hs,um],["Unsqueeze","","1-12",Ts,Vm],["Unsqueeze","","13+",Mm],["Xor","","7+",dd]]});function qm(r){let e={},n;for(;(n=Hm.exec(r))!==null;){let t=n[3].split(",").map(o=>{let i=o.trim().split(" ");return i&&i.length===2?{type:i[0],name:i[1]}:null}).filter(o=>o!==null);e[n[2]]={params:t,body:n[4]}}for(let t in e){let o=x_.replace("__FUNC__",t),i=new RegExp(o,"gm");for(;(n=i.exec(r))!==null;){let s=n[1],a=n[2],u=n[3].split(","),l=s?`${s} ${a};`:"",f=e[t].body,c="";e[t].params.forEach((b,h)=>{b&&(c+=`${b.type} ${b.name} = ${u[h]}; + `;return{...n,output:{dims:o,type:e[0].type,textureType:0},shaderSource:a}},y_=r=>{if(!r||r.length!==2)throw new Error("Tile requires 2 input.");if(r[1].dims.length!==1)throw new Error("The second input shape must 1 dimension.");if(r[1].dims[0]!==r[0].dims.length)throw new Error("Invalid input shape.");if(Sr.indexOf(r[0].type)===-1)throw new Error("Invalid input type.");if(r[1].type!=="int32"&&r[1].type!=="int16")throw new Error("Invalid repeat type.")}});var _s,Mm,Vm,x_,v_,Gm=C(()=>{"use strict";De();_s=(r,e,n)=>{x_(e);let t=J.unsqueezeShape(e[0].dims,n);return[r.reshapeUnpacked(e[0],t)]},Mm=(r,e)=>(v_(e),_s(r,[e[0]],Array.from(e[1].integerData))),Vm=r=>r.attributes.getInts("axes"),x_=r=>{if(!r||r.length!==1)throw new Error("Unsqueeze requires 1 input.");if(r[0].type==="string")throw new Error("invalid input tensor types.")},v_=r=>{if(!r||r.length!==2)throw new Error("Unsqueeze requires 2 inputs.");if(r[1].type!=="int32")throw new Error("Invalid input type.")}});var Um,Wm=C(()=>{"use strict";ed();pd();gd();Td();Ho();ip();fp();mp();bp();wp();Ip();Pp();kp();qo();Rp();Xp();nm();im();fm();pm();ym();Pm();km();Lm();Nm();Fm();Ko();as();Gm();ys();Um=[["Abs","","6+",_d],["Acos","","7+",Id],["Add","","7+",td],["And","","7+",rd],["Asin","","7+",Sd],["Atan","","7+",$d],["AveragePool","","7+",zp,Fp],["BatchNormalization","","7+",Jf,Qf],["Cast","","6+",md,hd],["Ceil","","6+",Od],["Clip","","6-10",os,Ad],["Clip","","11+",Pd],["Concat","","4+",xd,wd],["Conv","","1+",ds,ps],["ConvTranspose","","1+",np,op],["Cos","","7+",Ed],["Div","","7+",nd],["Dropout","","7+",is],["DepthToSpace","","1+",lp,cp],["Equal","","7+",od],["Elu","","6+",Cd,kd],["Exp","","6+",Dd],["Flatten","","1+",dp,pp],["Floor","","6+",Bd],["FusedConv","com.microsoft","1+",ds,ps],["Gather","","1+",hp,gp],["Gemm","","7-10",ms,xp],["Gemm","","11+",ms,vp],["GlobalAveragePool","","1+",Vp,Gp],["GlobalMaxPool","","1+",jp],["Greater","","7+",id],["Identity","","1+",is],["ImageScaler","","1+",Tp,_p],["InstanceNormalization","","6+",$p,Ap],["LeakyRelu","","6+",Ld,Rd],["Less","","7+",ad],["LRN","","1+",Op,Ep],["Log","","6+",Nd],["MatMul","","1+",Zd,Yd],["MaxPool","","1+",Up,Wp],["Mul","","7+",sd],["Neg","","6+",zd],["Not","","1+",Fd],["Or","","7+",ud],["Pad","","2-10",hs,Dp],["Pad","","11+",Bp,Lp],["Pow","","7+",ld],["PRelu","","7+",cd],["ReduceLogSum","","1+",tm,$r],["ReduceMax","","1+",Jp,$r],["ReduceMean","","1+",Yp,$r],["ReduceMin","","1+",Qp,$r],["ReduceProd","","1+",em,$r],["ReduceSum","","1-12",Zp,$r],["ReduceSumSquare","","1+",rm,$r],["Relu","","6+",Md],["Reshape","","5+",om],["Resize","","10",vs,lm],["Resize","","11+",vs,cm],["Shape","","1+",dm],["Sigmoid","","6+",Vd],["Sin","","7+",Gd],["Slice","","10+",bm],["Slice","","1-9",mm,hm],["Softmax","","1-12",Tm,_m],["Softmax","","13+",Sm,Im],["Split","","2-12",Em,Cm],["Sqrt","","6+",Ud],["Squeeze","","1-12",Ts,Bm],["Squeeze","","13+",Dm],["Sub","","7+",fd],["Sum","","6+",Rm],["Tan","","7+",Wd],["Tanh","","6+",Hd],["Tile","","6+",zm],["Transpose","","1+",Hr,sp],["Upsample","","7-8",gs,sm],["Upsample","","9",gs,um],["Unsqueeze","","1-12",_s,Vm],["Unsqueeze","","13+",Mm],["Xor","","7+",dd]]});function qm(r){let e={},n;for(;(n=Hm.exec(r))!==null;){let t=n[3].split(",").map(o=>{let i=o.trim().split(" ");return i&&i.length===2?{type:i[0],name:i[1]}:null}).filter(o=>o!==null);e[n[2]]={params:t,body:n[4]}}for(let t in e){let o=w_.replace("__FUNC__",t),i=new RegExp(o,"gm");for(;(n=i.exec(r))!==null;){let s=n[1],a=n[2],u=n[3].split(","),l=s?`${s} ${a};`:"",f=e[t].body,c="";e[t].params.forEach((b,h)=>{b&&(c+=`${b.type} ${b.name} = ${u[h]}; `)}),f=`${c} ${f}`,f=f.replace("return",`${a} = `);let p=` ${l} { ${f} } - `;r=r.replace(n[0],p)}}return r=r.replace(Hm,""),r}var Hm,x_,Km=C(()=>{"use strict";Hm=/@inline[\s\n\r]+(\w+)[\s\n\r]+([0-9a-zA-Z_]+)\s*\(([^)]*)\)\s*{(([^}]|[\n\r])*)}/gm,x_="(\\w+)?\\s+([_0-9a-zA-Z]+)\\s+=\\s+__FUNC__\\((.*)\\)\\s*;"});function xn(r,e){let n=[],t=[],o=e!=null&&Array.isArray(e)&&e.length===0,i=e==null||o?null:v_(e,r).sort(),s=0;for(let a=0;aa)&&r[a]===1&&(n.push(r[a]),t.push(a)),i[s]<=a&&s++}r[a]!==1&&(n.push(r[a]),t.push(a))}return{newShape:n,keptDims:t}}function v_(r,e){let n=e.length;return r=r==null?e.map((t,o)=>o):[].concat(r),pn(r.every(t=>t>=-n&&t`All values in axis param must be in range [-${n}, ${n}) but got axis ${r}`),pn(r.every(w_),()=>`All values in axis param must be integers but got axis ${r}`),r.map(t=>t<0?n+t:t)}function w_(r){return r%1===0}function T_(r){if(r.length===0)return 1;let e=r[0];for(let n=1;n{"use strict";Pt();De();Jo=class{constructor(e){this.maxTextureSize=e}computeTextureWH(e,n){let t=this.computeTexture(e,n);return n&&n.isPacked&&(t[0]/=2,t[1]/=2),n&&n.reverseWH?[t[1],t[0]]:t}computeTexture(e,n){let t=n&&n.isPacked;if(e.length===0)return t?[2,2]:[1,1];let o=this.maxTextureSize;if(n&&n.breakAxis!==void 0){let a=n.breakAxis>=e.length?1:e.slice(n.breakAxis).reduce((l,f)=>l*f),u=n.breakAxis<=0?1:e.slice(0,n.breakAxis).reduce((l,f)=>l*f);if(a>o||u>o)Re.verbose("TextureLayout",`Given width/height preferences were unattainable: shape:${e}, breakAxis:${n.breakAxis}`);else return[a,u]}let i=e.slice(0);t&&(o=o*2,i=i.map((a,u)=>u>=i.length-2?i[u]%2===0?i[u]:i[u]+1:i[u]),i.length===1&&(i=[2,i[0]])),i.length!==2&&(i=xn(i).newShape);let s=T_(i);return i.length<=1&&s<=o?[1,s]:i.length===2&&i[0]<=o&&i[1]<=o?i:i.length===3&&i[0]*i[1]<=o&&i[2]<=o?[i[0]*i[1],i[2]]:i.length===3&&i[0]<=o&&i[1]*i[2]<=o?[i[0],i[1]*i[2]]:i.length===4&&i[0]*i[1]*i[2]<=o&&i[3]<=o?[i[0]*i[1]*i[2],i[3]]:i.length===4&&i[0]<=o&&i[1]*i[2]*i[3]<=o?[i[0],i[1]*i[2]*i[3]]:t?jm(s/4).map(a=>a*2):jm(s)}}});var Qo,Xm=C(()=>{"use strict";De();pr();He();_s();Qt();Qo=class extends kt{constructor(n){super(n)}getFunctions(){return{...this.offsetToCoords(),...this.coordsToOffset(),...this.toVec(),...this.valueFrom(),...this.getCommonUtilFuncs(),...this.getInputsSamplingSnippets(),...this.getOutputSamplingSnippet()}}getCustomTypes(){return{}}offsetToCoords(){let n="offsetToCoords";return{offsetToCoords:new X(` + `;r=r.replace(n[0],p)}}return r=r.replace(Hm,""),r}var Hm,w_,jm=C(()=>{"use strict";Hm=/@inline[\s\n\r]+(\w+)[\s\n\r]+([0-9a-zA-Z_]+)\s*\(([^)]*)\)\s*{(([^}]|[\n\r])*)}/gm,w_="(\\w+)?\\s+([_0-9a-zA-Z]+)\\s+=\\s+__FUNC__\\((.*)\\)\\s*;"});function vn(r,e){let n=[],t=[],o=e!=null&&Array.isArray(e)&&e.length===0,i=e==null||o?null:T_(e,r).sort(),s=0;for(let a=0;aa)&&r[a]===1&&(n.push(r[a]),t.push(a)),i[s]<=a&&s++}r[a]!==1&&(n.push(r[a]),t.push(a))}return{newShape:n,keptDims:t}}function T_(r,e){let n=e.length;return r=r==null?e.map((t,o)=>o):[].concat(r),mn(r.every(t=>t>=-n&&t`All values in axis param must be in range [-${n}, ${n}) but got axis ${r}`),mn(r.every(__),()=>`All values in axis param must be integers but got axis ${r}`),r.map(t=>t<0?n+t:t)}function __(r){return r%1===0}function I_(r){if(r.length===0)return 1;let e=r[0];for(let n=1;n{"use strict";Pt();De();Jo=class{constructor(e){this.maxTextureSize=e}computeTextureWH(e,n){let t=this.computeTexture(e,n);return n&&n.isPacked&&(t[0]/=2,t[1]/=2),n&&n.reverseWH?[t[1],t[0]]:t}computeTexture(e,n){let t=n&&n.isPacked;if(e.length===0)return t?[2,2]:[1,1];let o=this.maxTextureSize;if(n&&n.breakAxis!==void 0){let a=n.breakAxis>=e.length?1:e.slice(n.breakAxis).reduce((l,f)=>l*f),u=n.breakAxis<=0?1:e.slice(0,n.breakAxis).reduce((l,f)=>l*f);if(a>o||u>o)Re.verbose("TextureLayout",`Given width/height preferences were unattainable: shape:${e}, breakAxis:${n.breakAxis}`);else return[a,u]}let i=e.slice(0);t&&(o=o*2,i=i.map((a,u)=>u>=i.length-2?i[u]%2===0?i[u]:i[u]+1:i[u]),i.length===1&&(i=[2,i[0]])),i.length!==2&&(i=vn(i).newShape);let s=I_(i);return i.length<=1&&s<=o?[1,s]:i.length===2&&i[0]<=o&&i[1]<=o?i:i.length===3&&i[0]*i[1]<=o&&i[2]<=o?[i[0]*i[1],i[2]]:i.length===3&&i[0]<=o&&i[1]*i[2]<=o?[i[0],i[1]*i[2]]:i.length===4&&i[0]*i[1]*i[2]<=o&&i[3]<=o?[i[0]*i[1]*i[2],i[3]]:i.length===4&&i[0]<=o&&i[1]*i[2]*i[3]<=o?[i[0],i[1]*i[2]*i[3]]:t?Km(s/4).map(a=>a*2):Km(s)}}});var Qo,Xm=C(()=>{"use strict";De();pr();He();Is();Qt();Qo=class extends kt{constructor(n){super(n)}getFunctions(){return{...this.offsetToCoords(),...this.coordsToOffset(),...this.toVec(),...this.valueFrom(),...this.getCommonUtilFuncs(),...this.getInputsSamplingSnippets(),...this.getOutputSamplingSnippet()}}getCustomTypes(){return{}}offsetToCoords(){let n="offsetToCoords";return{offsetToCoords:new X(` vec2 ${n}(int offset, int width, int height) { int t = offset / width; int s = offset - t*width; @@ -1480,13 +1480,13 @@ value = _A(inputIdx);`,"value = min(value, _A(inputIdx));",""]}),em=(r,e,n)=>qr( float sampleTexture(sampler2D textureSampler, vec2 uv) { return ${o.texture2D}(textureSampler, uv).r; }`),n}getInputsSamplingSnippets(){let n={},t=this.context.outputTextureLayout;return this.context.programInfo.inputNames.forEach((o,i)=>{let s=this.context.inputTextureLayouts[i],a=zo(o);s.isPacked?n[a]=this.getPackedSamplerFromInput(a,o,s):n[a]=this.getUnpackedSamplerFromInput(a,o,s);let u=Rf(o);s.unpackedShape.length<=t.unpackedShape.length&&(s.isPacked?n[u]=this.getPackedSamplerAtOutputCoords(u,s,t,o):n[u]=this.getUnpackedSamplerAtOutputCoords(u,s,t,o))}),n}getPackedSamplerAtOutputCoords(n,t,o,i){let s=t.unpackedShape,a=o.unpackedShape,l=zo(i),f=s.length,c=a.length,p=gt.getBroadcastDims(s,a),b=bt(c),h=c-f,g,T=Gt();f===0?g="":c<2&&p.length>=1?g="coords = 0;":g=p.map(q=>`coords.${T[q+h]} = 0;`).join(` -`);let w="";c<2&&f>0?w="coords":w=s.map((q,K)=>`coords.${T[K+h]}`).join(", ");let v="return outputValue;",$=J.size(s)===1,E=J.size(a)===1;if(f===1&&!$&&!E)v=` +`);let w="";c<2&&f>0?w="coords":w=s.map((q,j)=>`coords.${T[j+h]}`).join(", ");let v="return outputValue;",$=J.size(s)===1,E=J.size(a)===1;if(f===1&&!$&&!E)v=` return vec4(outputValue.xy, outputValue.xy); `;else if($&&!E)c===1?v=` return vec4(outputValue.x, outputValue.x, 0., 0.); `:v=` return vec4(outputValue.x); - `;else if(p.length){let q=f-2,K=f-1;p.indexOf(q)>-1&&p.indexOf(K)>-1?v="return vec4(outputValue.x);":p.indexOf(q)>-1?v="return vec4(outputValue.x, outputValue.y, outputValue.x, outputValue.y);":p.indexOf(K)>-1&&(v="return vec4(outputValue.xx, outputValue.zz);")}let N=` + `;else if(p.length){let q=f-2,j=f-1;p.indexOf(q)>-1&&p.indexOf(j)>-1?v="return vec4(outputValue.x);":p.indexOf(q)>-1?v="return vec4(outputValue.x, outputValue.y, outputValue.x, outputValue.y);":p.indexOf(j)>-1&&(v="return vec4(outputValue.xx, outputValue.zz);")}let N=` int lastDim = coords.${T[c-1]}; coords.${T[c-1]} = coords.${T[c-2]}; coords.${T[c-2]} = lastDim; @@ -1523,9 +1523,9 @@ value = _A(inputIdx);`,"value = min(value, _A(inputIdx));",""]}),em=(r,e,n)=>qr( }`;return new X(h)}let f=s,c=Math.ceil(i[1]/2),b=`vec4 ${n}(int row, int col) { vec2 uv = packedUVfrom2D(${f[1]}, ${f[0]}, ${c}, row, col); return ${a.texture2D}(${t}, uv); - }`;return new X(b,["coordinates.packedUVfrom2D"])}getPackedSampler3D(n,t,o){let i=o.unpackedShape,s=[o.width,o.height],a=[s[0],s[1]],u=oe(this.context.glContext.version);if(i[0]===1){let g=i.slice(1),T=[1,2],w=mn(i,g),v=["b","row","col"],S=JSON.parse(JSON.stringify(o));S.unpackedShape=w;let $=this.getPackedSamplerFromInput(n,t,S),E=`${$.routineBody} + }`;return new X(b,["coordinates.packedUVfrom2D"])}getPackedSampler3D(n,t,o){let i=o.unpackedShape,s=[o.width,o.height],a=[s[0],s[1]],u=oe(this.context.glContext.version);if(i[0]===1){let g=i.slice(1),T=[1,2],w=hn(i,g),v=["b","row","col"],S=JSON.parse(JSON.stringify(o));S.unpackedShape=w;let $=this.getPackedSamplerFromInput(n,t,S),E=`${$.routineBody} vec4 ${n}(int b, int row, int col) { - return ${n}(${hn(v,T)}); + return ${n}(${gn(v,T)}); } `;return new X(E,$.dependencies)}let l=a[0],f=a[1],c=Math.ceil(i[2]/2),p=c*Math.ceil(i[1]/2),h=`vec4 ${n}(int b, int row, int col) { vec2 uv = packedUVfrom3D( ${f}, ${l}, ${p}, ${c}, b, row, col); @@ -1569,10 +1569,10 @@ value = _A(inputIdx);`,"value = min(value, _A(inputIdx));",""]}),em=(r,e,n)=>qr( vec2 uv = (vec2(row, col) + halfCR) / vec2(${b}.0, ${h}.0); return sampleTexture(${t}, uv); } - `;return new X(g,["coordinates.sampleTexture"])}let{newShape:a,keptDims:u}=xn(i),l=a;if(l.lengthqr( vec2 uv = uvFromFlat(${f}, ${c}, index); return sampleTexture(${t}, uv); } - `;return new X(p,["coordinates.uvFromFlat","coordinates.sampleTexture","coordinates.coordsToOffset"])}getUnpackedSampler3D(n,t,o){let i=o.unpackedShape,s=i[1]*i[2],a=i[2],{newShape:u,keptDims:l}=xn(i),f=u;if(f.lengthqr( vec2 uv = uvFromFlat(${l}, ${f}, index); return sampleTexture(${t}, uv); } - `;return new X(c,["coordinates.uvFromFlat","coordinates.sampleTexture"])}getUnpackedSampler5D(n,t,o){let i=o.unpackedShape,s=i[4],a=i[3]*s,u=i[2]*a,l=i[1]*u,{newShape:f,keptDims:c}=xn(i);if(f.lengthqr( vec2 uv = uvFromFlat(${p}, ${b}, index); return sampleTexture(${t}, uv); } - `;return new X(h,["coordinates.sampleTexture","coordinates.uvFromFlat"])}getUnpackedSampler6D(n,t,o){let i=o.unpackedShape,s=i[5],a=i[4]*s,u=i[3]*a,l=i[2]*u,f=i[1]*l,{newShape:c,keptDims:p}=xn(i);if(c.lengthqr( int getVecItem(int m[${n}], int index) { ${t} } - `;return{getVecItem:new X(o)}}}});var Is,eh=C(()=>{"use strict";Xm();Zm();Ym();Jm();Qm();Is={encoding:ei,fragcolor:ti,vec:ni,shapeUtils:ri,coordinates:Qo}});var oi,th=C(()=>{"use strict";pr();Km();eh();He();oi=class{constructor(e,n,t,o){this.libs={};this.glslLibRoutineDependencyGraph={};this.context=new Go(e,n,t,o),Object.keys(Is).forEach(s=>{let a=new Is[s](this.context);this.libs[s]=a});let i=this.glslLibRoutineDependencyGraph;for(let s in this.libs){let u=this.libs[s].getFunctions();for(let l in u){let f=s+"."+l,c;i[f]?(c=i[f],c.routineBody=u[l].routineBody):(c=new Mn(f,u[l].routineBody),i[f]=c);let p=u[l].dependencies;if(p)for(let b=0;b{"use strict";Xm();Zm();Ym();Jm();Qm();Ss={encoding:ei,fragcolor:ti,vec:ni,shapeUtils:ri,coordinates:Qo}});var oi,th=C(()=>{"use strict";pr();jm();eh();He();oi=class{constructor(e,n,t,o){this.libs={};this.glslLibRoutineDependencyGraph={};this.context=new Go(e,n,t,o),Object.keys(Ss).forEach(s=>{let a=new Ss[s](this.context);this.libs[s]=a});let i=this.glslLibRoutineDependencyGraph;for(let s in this.libs){let u=this.libs[s].getFunctions();for(let l in u){let f=s+"."+l,c;i[f]?(c=i[f],c.routineBody=u[l].routineBody):(c=new Mn(f,u[l].routineBody),i[f]=c);let p=u[l].dependencies;if(p)for(let b=0;bqr( `;else throw new Error(`Missing body for the Glsl Library routine: ${n[o].name}`);return t}selectGlslLibRoutinesToBeIncluded(e){let n=[];return Object.keys(this.glslLibRoutineDependencyGraph).forEach(t=>{let o=t.split(".")[1];e.indexOf(o)!==-1&&n.push(this.glslLibRoutineDependencyGraph[t])}),Uo.returnOrderedNodes(n)}getUniforms(e,n){let t=[];if(e)for(let o of e)t.push(`uniform sampler2D ${o};`);if(n)for(let o of n)t.push(`uniform ${o.type} ${o.name}${o.arrayLength?`[${o.arrayLength}]`:""};`);return t.join(` `)}}});var ii,rh=C(()=>{"use strict";ft();Pt();th();He();ii=class{constructor(e,n,t){this.profiler=e;this.glContext=n;this.textureLayoutStrategy=t;this.repo=new Map,this.attributesBound=!1}getArtifact(e){return this.repo.get(e)}setArtifact(e,n){this.repo.set(e,n)}run(e,n,t){this.profiler.event("op",`ProgramManager.run ${e.programInfo.name??"unknown kernel"}`,()=>{let o=this.glContext.gl,i=e.program;o.useProgram(i);try{this.bindOutput(t),this.attributesBound||this.bindAttributes(e.attribLocations),this.bindUniforms(e.uniformLocations,e.programInfo.variables??[],n)}catch(s){throw Re.error("ProgramManager",e.programInfo.shaderSource),s}this.profiler.event("backend","GlContext.draw()",()=>{this.glContext.draw()})},this.glContext)}dispose(){this.vertexShader&&this.glContext.deleteShader(this.vertexShader),this.repo.forEach(e=>this.glContext.deleteProgram(e.program))}build(e,n,t){return this.profiler.event("backend","ProgramManager.build",()=>{let o=new oi(this.glContext,e,n,t),i=o.preprocess(),s=this.compile(i);return{programInfo:e,program:s,uniformLocations:this.getUniformLocations(s,o.context.programInfo.inputNames,o.context.programInfo.variables),attribLocations:this.getAttribLocations(s)}})}compile(e){if(!this.vertexShader){Re.verbose("ProrgramManager","Compiling and caching Vertex shader for the first time");let o=Df(this.glContext.version);this.vertexShader=this.glContext.compileShader(o,this.glContext.gl.VERTEX_SHADER)}le.debug&&Re.verbose("ProrgramManager",`FragShader: ${e} -`);let n=this.glContext.compileShader(e,this.glContext.gl.FRAGMENT_SHADER),t=this.glContext.createProgram(this.vertexShader,n);return this.glContext.deleteShader(n),t}bindOutput(e){let n=e.width,t=e.height;Re.verbose("ProrgramManager",`Binding output texture to Framebuffer: w/h=${n}/${t}, shape=${e.shape}, type=${e.tensor.type}`),this.glContext.attachFramebuffer(e.texture,n,t)}bindAttributes(e){let n=e.position,t=e.textureCoord;this.glContext.setVertexAttributes(n,t),this.attributesBound=!0}bindUniforms(e,n,t){let o=this.glContext.gl,i=0;for(let{name:s,type:a,location:u,arrayLength:l}of e){let f=n.find(c=>c.name===s)?.data;if(a!=="sampler2D"&&!f)throw new Error(`variable '${s}' does not have data defined in program info`);switch(a){case"sampler2D":this.bindTexture(t[i],u,i),i++;break;case"float":l?o.uniform1fv(u,f):o.uniform1f(u,f);break;case"int":l?o.uniform1iv(u,f):o.uniform1i(u,f);break;default:throw new Error(`Uniform not implemented: ${a}`)}}}bindTexture(e,n,t){this.glContext.bindTextureToUniform(e.texture,t,n)}getAttribLocations(e){return{position:this.getAttribLocation(e,"position"),textureCoord:this.getAttribLocation(e,"textureCoord")}}getUniformLocations(e,n,t){let o=[];if(n)for(let i of n)o.push({name:i,type:"sampler2D",location:this.getUniformLocation(e,i)});if(t)for(let i of t)o.push({...i,location:this.getUniformLocation(e,i.name)});return o}getUniformLocation(e,n){let o=this.glContext.gl.getUniformLocation(e,n);if(o===null)throw new Error(`Uniform ${n} not found.`);return o}getAttribLocation(e,n){return this.glContext.gl.getAttribLocation(e,n)}}});var ai,nh=C(()=>{"use strict";Pt();zn();ai=class{constructor(e,n,t,o){this.glContext=e;this.layoutStrategy=n;this.profiler=t;this.config=o;this.pendingRead=new Map;o.reuseTextures&&(this.inUseTextures=new Map,this.idleTextures=new Map,this.textureLookup=new Map)}createTextureFromLayout(e,n,t,o){let i=this.toEncoderType(e),s=this.glContext.getEncoder(i,n.channels||1,o);if(n.isPacked&&o===1)throw new Error("not implemented");let a=n.width,u=n.height,l,f;if(this.config.reuseTextures){l=`${a}x${u}_${s.format}_${s.internalFormat}_${s.textureType}`,f=this.inUseTextures.get(l),f||(f=[],this.inUseTextures.set(l,f));let p=this.idleTextures.get(l);if(p&&p.length>0){let b=p.pop();return f.push(b),o===1&&this.glContext.updateTexture(b,a,u,s,this.toTextureData(e,t)),b}}Re.verbose("TextureManager",`Creating new texture of size ${n.width}x${n.height}`);let c=this.glContext.allocateTexture(a,u,s,this.toTextureData(e,t));return this.config.reuseTextures&&(f.push(c),this.textureLookup.set(c,l)),c}readTexture(e,n,t){return t||(t=1),this.profiler.event("backend","TextureManager.readTexture",()=>{let o=e.shape.reduce((s,a)=>s*a)*t,i=this.glContext.readTexture(e.texture,e.width,e.height,o,this.toEncoderType(n),t);return this.toTensorData(n,i)})}async readTextureAsync(e,n,t){let o=e.tensor.dataId;if(t||(t=1),this.pendingRead.has(o)){let i=this.pendingRead.get(o);return new Promise(s=>i?.push(s))}return this.profiler.event("backend","TextureManager.readTextureAsync",async()=>{this.pendingRead.set(o,[]);let i=e.shape.reduce((l,f)=>l*f)*t;await this.glContext.createAndWaitForFence();let s=this.glContext.readTexture(e.texture,e.width,e.height,i,this.toEncoderType(n),t),a=this.toTensorData(n,s),u=this.pendingRead.get(o);return this.pendingRead.delete(o),u?.forEach(l=>l(a)),a})}readUint8TextureAsFloat(e){return this.profiler.event("backend","TextureManager.readUint8TextureAsFloat",()=>{let n=e.shape.reduce((o,i)=>o*i),t=this.glContext.readTexture(e.texture,e.width,e.height,n*4,"byte",4);return new Float32Array(t.buffer,t.byteOffset,n)})}releaseTexture(e,n){let t;if(this.config.reuseTextures&&(t=this.textureLookup.get(e.texture),t)){n&&this.textureLookup.delete(t);let o=this.inUseTextures.get(t);if(o){let i=o.indexOf(e.texture);if(i!==-1){o.splice(i,1);let s=this.idleTextures.get(t);s||(s=[],this.idleTextures.set(t,s)),s.push(e.texture)}}}(!t||n)&&(Re.verbose("TextureManager",`Deleting texture of size ${e.width}x${e.height}`),this.glContext.deleteTexture(e.texture))}toTensorData(e,n){switch(e){case"int16":return n instanceof Int16Array?n:Int16Array.from(n);case"int32":return n instanceof Int32Array?n:Int32Array.from(n);case"int8":return n instanceof Int8Array?n:Int8Array.from(n);case"uint16":return n instanceof Uint16Array?n:Uint16Array.from(n);case"uint32":return n instanceof Uint32Array?n:Uint32Array.from(n);case"uint8":case"bool":return n instanceof Uint8Array?n:Uint8Array.from(n);case"float32":return n instanceof Float32Array?n:Float32Array.from(n);case"float64":return n instanceof Float64Array?n:Float64Array.from(n);default:throw new Error(`TensorData type ${e} is not supported`)}}toTextureData(e,n){if(n)return n instanceof Float32Array?n:new Float32Array(n)}toEncoderType(e){return"float"}clearActiveTextures(){this.glContext.clearActiveTextures()}}});var si,oh=C(()=>{"use strict";Pt();yc();Zf();Wm();rh();_s();nh();si=class{constructor(e,n){this.backend=e;this.context=n;this.layoutStrategy=new Jo(e.glContext.maxTextureSize),this.programManager=new ii(this.context.profiler,e.glContext,this.layoutStrategy),this.textureManager=new ai(e.glContext,this.layoutStrategy,this.context.profiler,{reuseTextures:e.textureCacheMode==="full"}),this.packedTextureDataCache=new Map,this.unpackedTextureDataCache=new Map,this.pack=e.pack,this.pack2unpackMap=new Map,this.unpack2packMap=new Map}createInferenceHandler(){return new Vo(this)}onGraphInitialized(e){let n=e.getValues().filter(t=>t.from===-1&&t.tensor).map(t=>t.tensor.dataId);this.initializers=new Set(n)}isInitializer(e){return this.initializers?this.initializers.has(e):!1}addInitializer(e){this.initializers.add(e)}getTextureData(e,n){return n?this.packedTextureDataCache.get(e):this.unpackedTextureDataCache.get(e)}setTextureData(e,n,t=!1){Re.verbose("WebGLSessionHandler","Storing Texture data in cache"),t?this.packedTextureDataCache.set(e,n):this.unpackedTextureDataCache.set(e,n)}dispose(){this.programManager.dispose(),this.textureManager.clearActiveTextures(),this.packedTextureDataCache.forEach(e=>this.textureManager.releaseTexture(e,!0)),this.packedTextureDataCache=new Map,this.unpackedTextureDataCache.forEach(e=>this.textureManager.releaseTexture(e,!0)),this.unpackedTextureDataCache=new Map}resolve(e,n,t){let o=bc(e,n,Um);return{impl:o.opImpl,context:o.opInit?o.opInit(e,t):e}}}});function __(r){let e=0;for(;e{"use strict";ft();zn();zn();Qt();Un=class{constructor(e,n){this.frameBufferBound=!1;this.itemsToPoll=[];this.gl=e,this.version=n,this.getExtensions(),this.vertexbuffer=this.createVertexbuffer(),this.framebuffer=this.createFramebuffer(),this.queryVitalParameters()}allocateTexture(e,n,t,o){let i=this.gl,s=i.createTexture();i.bindTexture(i.TEXTURE_2D,s),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE);let a=o?t.encode(o,e*n):null;return i.texImage2D(i.TEXTURE_2D,0,t.internalFormat,e,n,0,t.format,t.textureType,a),this.checkError(),s}updateTexture(e,n,t,o,i){let s=this.gl;s.bindTexture(s.TEXTURE_2D,e);let a=o.encode(i,n*t);s.texSubImage2D(s.TEXTURE_2D,0,0,0,n,t,o.format,o.textureType,a),this.checkError()}attachFramebuffer(e,n,t){let o=this.gl;o.bindTexture(o.TEXTURE_2D,e),o.bindFramebuffer(o.FRAMEBUFFER,this.framebuffer),o.framebufferTexture2D(o.FRAMEBUFFER,o.COLOR_ATTACHMENT0,o.TEXTURE_2D,e,0),this.checkError(),o.viewport(0,0,n,t),o.scissor(0,0,n,t)}readTexture(e,n,t,o,i,s){let a=this.gl;s||(s=1),this.frameBufferBound||this.attachFramebuffer(e,n,t);let u=this.getEncoder(i,s),l=u.allocate(n*t);return a.bindTexture(a.TEXTURE_2D,e),a.framebufferTexture2D(a.FRAMEBUFFER,a.COLOR_ATTACHMENT0,a.TEXTURE_2D,e,0),a.readPixels(0,0,n,t,a.RGBA,u.textureType,l),this.checkError(),u.decode(l,o)}isFramebufferReady(){return!0}getActiveTexture(){let e=this.gl;return`TEXTURE${e.getParameter(this.gl.ACTIVE_TEXTURE)-e.TEXTURE0}`}getTextureBinding(){return this.gl.getParameter(this.gl.TEXTURE_BINDING_2D)}getFramebufferBinding(){return this.gl.getParameter(this.gl.FRAMEBUFFER_BINDING)}setVertexAttributes(e,n){let t=this.gl;t.vertexAttribPointer(e,3,t.FLOAT,!1,20,0),t.enableVertexAttribArray(e),n!==-1&&(t.vertexAttribPointer(n,2,t.FLOAT,!1,20,12),t.enableVertexAttribArray(n)),this.checkError()}createProgram(e,n){let t=this.gl,o=t.createProgram();return t.attachShader(o,e),t.attachShader(o,n),t.linkProgram(o),o}compileShader(e,n){let t=this.gl,o=t.createShader(n);if(!o)throw new Error(`createShader() returned null with type ${n}`);if(t.shaderSource(o,e),t.compileShader(o),t.getShaderParameter(o,t.COMPILE_STATUS)===!1)throw new Error(`Failed to compile shader: ${t.getShaderInfoLog(o)} +`);let n=this.glContext.compileShader(e,this.glContext.gl.FRAGMENT_SHADER),t=this.glContext.createProgram(this.vertexShader,n);return this.glContext.deleteShader(n),t}bindOutput(e){let n=e.width,t=e.height;Re.verbose("ProrgramManager",`Binding output texture to Framebuffer: w/h=${n}/${t}, shape=${e.shape}, type=${e.tensor.type}`),this.glContext.attachFramebuffer(e.texture,n,t)}bindAttributes(e){let n=e.position,t=e.textureCoord;this.glContext.setVertexAttributes(n,t),this.attributesBound=!0}bindUniforms(e,n,t){let o=this.glContext.gl,i=0;for(let{name:s,type:a,location:u,arrayLength:l}of e){let f=n.find(c=>c.name===s)?.data;if(a!=="sampler2D"&&!f)throw new Error(`variable '${s}' does not have data defined in program info`);switch(a){case"sampler2D":this.bindTexture(t[i],u,i),i++;break;case"float":l?o.uniform1fv(u,f):o.uniform1f(u,f);break;case"int":l?o.uniform1iv(u,f):o.uniform1i(u,f);break;default:throw new Error(`Uniform not implemented: ${a}`)}}}bindTexture(e,n,t){this.glContext.bindTextureToUniform(e.texture,t,n)}getAttribLocations(e){return{position:this.getAttribLocation(e,"position"),textureCoord:this.getAttribLocation(e,"textureCoord")}}getUniformLocations(e,n,t){let o=[];if(n)for(let i of n)o.push({name:i,type:"sampler2D",location:this.getUniformLocation(e,i)});if(t)for(let i of t)o.push({...i,location:this.getUniformLocation(e,i.name)});return o}getUniformLocation(e,n){let o=this.glContext.gl.getUniformLocation(e,n);if(o===null)throw new Error(`Uniform ${n} not found.`);return o}getAttribLocation(e,n){return this.glContext.gl.getAttribLocation(e,n)}}});var ai,nh=C(()=>{"use strict";Pt();zn();ai=class{constructor(e,n,t,o){this.glContext=e;this.layoutStrategy=n;this.profiler=t;this.config=o;this.pendingRead=new Map;o.reuseTextures&&(this.inUseTextures=new Map,this.idleTextures=new Map,this.textureLookup=new Map)}createTextureFromLayout(e,n,t,o){let i=this.toEncoderType(e),s=this.glContext.getEncoder(i,n.channels||1,o);if(n.isPacked&&o===1)throw new Error("not implemented");let a=n.width,u=n.height,l,f;if(this.config.reuseTextures){l=`${a}x${u}_${s.format}_${s.internalFormat}_${s.textureType}`,f=this.inUseTextures.get(l),f||(f=[],this.inUseTextures.set(l,f));let p=this.idleTextures.get(l);if(p&&p.length>0){let b=p.pop();return f.push(b),o===1&&this.glContext.updateTexture(b,a,u,s,this.toTextureData(e,t)),b}}Re.verbose("TextureManager",`Creating new texture of size ${n.width}x${n.height}`);let c=this.glContext.allocateTexture(a,u,s,this.toTextureData(e,t));return this.config.reuseTextures&&(f.push(c),this.textureLookup.set(c,l)),c}readTexture(e,n,t){return t||(t=1),this.profiler.event("backend","TextureManager.readTexture",()=>{let o=e.shape.reduce((s,a)=>s*a)*t,i=this.glContext.readTexture(e.texture,e.width,e.height,o,this.toEncoderType(n),t);return this.toTensorData(n,i)})}async readTextureAsync(e,n,t){let o=e.tensor.dataId;if(t||(t=1),this.pendingRead.has(o)){let i=this.pendingRead.get(o);return new Promise(s=>i?.push(s))}return this.profiler.event("backend","TextureManager.readTextureAsync",async()=>{this.pendingRead.set(o,[]);let i=e.shape.reduce((l,f)=>l*f)*t;await this.glContext.createAndWaitForFence();let s=this.glContext.readTexture(e.texture,e.width,e.height,i,this.toEncoderType(n),t),a=this.toTensorData(n,s),u=this.pendingRead.get(o);return this.pendingRead.delete(o),u?.forEach(l=>l(a)),a})}readUint8TextureAsFloat(e){return this.profiler.event("backend","TextureManager.readUint8TextureAsFloat",()=>{let n=e.shape.reduce((o,i)=>o*i),t=this.glContext.readTexture(e.texture,e.width,e.height,n*4,"byte",4);return new Float32Array(t.buffer,t.byteOffset,n)})}releaseTexture(e,n){let t;if(this.config.reuseTextures&&(t=this.textureLookup.get(e.texture),t)){n&&this.textureLookup.delete(t);let o=this.inUseTextures.get(t);if(o){let i=o.indexOf(e.texture);if(i!==-1){o.splice(i,1);let s=this.idleTextures.get(t);s||(s=[],this.idleTextures.set(t,s)),s.push(e.texture)}}}(!t||n)&&(Re.verbose("TextureManager",`Deleting texture of size ${e.width}x${e.height}`),this.glContext.deleteTexture(e.texture))}toTensorData(e,n){switch(e){case"int16":return n instanceof Int16Array?n:Int16Array.from(n);case"int32":return n instanceof Int32Array?n:Int32Array.from(n);case"int8":return n instanceof Int8Array?n:Int8Array.from(n);case"uint16":return n instanceof Uint16Array?n:Uint16Array.from(n);case"uint32":return n instanceof Uint32Array?n:Uint32Array.from(n);case"uint8":case"bool":return n instanceof Uint8Array?n:Uint8Array.from(n);case"float32":return n instanceof Float32Array?n:Float32Array.from(n);case"float64":return n instanceof Float64Array?n:Float64Array.from(n);default:throw new Error(`TensorData type ${e} is not supported`)}}toTextureData(e,n){if(n)return n instanceof Float32Array?n:new Float32Array(n)}toEncoderType(e){return"float"}clearActiveTextures(){this.glContext.clearActiveTextures()}}});var si,oh=C(()=>{"use strict";Pt();yc();Zf();Wm();rh();Is();nh();si=class{constructor(e,n){this.backend=e;this.context=n;this.layoutStrategy=new Jo(e.glContext.maxTextureSize),this.programManager=new ii(this.context.profiler,e.glContext,this.layoutStrategy),this.textureManager=new ai(e.glContext,this.layoutStrategy,this.context.profiler,{reuseTextures:e.textureCacheMode==="full"}),this.packedTextureDataCache=new Map,this.unpackedTextureDataCache=new Map,this.pack=e.pack,this.pack2unpackMap=new Map,this.unpack2packMap=new Map}createInferenceHandler(){return new Vo(this)}onGraphInitialized(e){let n=e.getValues().filter(t=>t.from===-1&&t.tensor).map(t=>t.tensor.dataId);this.initializers=new Set(n)}isInitializer(e){return this.initializers?this.initializers.has(e):!1}addInitializer(e){this.initializers.add(e)}getTextureData(e,n){return n?this.packedTextureDataCache.get(e):this.unpackedTextureDataCache.get(e)}setTextureData(e,n,t=!1){Re.verbose("WebGLSessionHandler","Storing Texture data in cache"),t?this.packedTextureDataCache.set(e,n):this.unpackedTextureDataCache.set(e,n)}dispose(){this.programManager.dispose(),this.textureManager.clearActiveTextures(),this.packedTextureDataCache.forEach(e=>this.textureManager.releaseTexture(e,!0)),this.packedTextureDataCache=new Map,this.unpackedTextureDataCache.forEach(e=>this.textureManager.releaseTexture(e,!0)),this.unpackedTextureDataCache=new Map}resolve(e,n,t){let o=bc(e,n,Um);return{impl:o.opImpl,context:o.opInit?o.opInit(e,t):e}}}});function S_(r){let e=0;for(;e{"use strict";ft();zn();zn();Qt();Un=class{constructor(e,n){this.frameBufferBound=!1;this.itemsToPoll=[];this.gl=e,this.version=n,this.getExtensions(),this.vertexbuffer=this.createVertexbuffer(),this.framebuffer=this.createFramebuffer(),this.queryVitalParameters()}allocateTexture(e,n,t,o){let i=this.gl,s=i.createTexture();i.bindTexture(i.TEXTURE_2D,s),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE);let a=o?t.encode(o,e*n):null;return i.texImage2D(i.TEXTURE_2D,0,t.internalFormat,e,n,0,t.format,t.textureType,a),this.checkError(),s}updateTexture(e,n,t,o,i){let s=this.gl;s.bindTexture(s.TEXTURE_2D,e);let a=o.encode(i,n*t);s.texSubImage2D(s.TEXTURE_2D,0,0,0,n,t,o.format,o.textureType,a),this.checkError()}attachFramebuffer(e,n,t){let o=this.gl;o.bindTexture(o.TEXTURE_2D,e),o.bindFramebuffer(o.FRAMEBUFFER,this.framebuffer),o.framebufferTexture2D(o.FRAMEBUFFER,o.COLOR_ATTACHMENT0,o.TEXTURE_2D,e,0),this.checkError(),o.viewport(0,0,n,t),o.scissor(0,0,n,t)}readTexture(e,n,t,o,i,s){let a=this.gl;s||(s=1),this.frameBufferBound||this.attachFramebuffer(e,n,t);let u=this.getEncoder(i,s),l=u.allocate(n*t);return a.bindTexture(a.TEXTURE_2D,e),a.framebufferTexture2D(a.FRAMEBUFFER,a.COLOR_ATTACHMENT0,a.TEXTURE_2D,e,0),a.readPixels(0,0,n,t,a.RGBA,u.textureType,l),this.checkError(),u.decode(l,o)}isFramebufferReady(){return!0}getActiveTexture(){let e=this.gl;return`TEXTURE${e.getParameter(this.gl.ACTIVE_TEXTURE)-e.TEXTURE0}`}getTextureBinding(){return this.gl.getParameter(this.gl.TEXTURE_BINDING_2D)}getFramebufferBinding(){return this.gl.getParameter(this.gl.FRAMEBUFFER_BINDING)}setVertexAttributes(e,n){let t=this.gl;t.vertexAttribPointer(e,3,t.FLOAT,!1,20,0),t.enableVertexAttribArray(e),n!==-1&&(t.vertexAttribPointer(n,2,t.FLOAT,!1,20,12),t.enableVertexAttribArray(n)),this.checkError()}createProgram(e,n){let t=this.gl,o=t.createProgram();return t.attachShader(o,e),t.attachShader(o,n),t.linkProgram(o),o}compileShader(e,n){let t=this.gl,o=t.createShader(n);if(!o)throw new Error(`createShader() returned null with type ${n}`);if(t.shaderSource(o,e),t.compileShader(o),t.getShaderParameter(o,t.COMPILE_STATUS)===!1)throw new Error(`Failed to compile shader: ${t.getShaderInfoLog(o)} Shader source: -${e}`);return o}deleteShader(e){this.gl.deleteShader(e)}bindTextureToUniform(e,n,t){let o=this.gl;o.activeTexture(o.TEXTURE0+n),this.checkError(),o.bindTexture(o.TEXTURE_2D,e),this.checkError(),o.uniform1i(t,n),this.checkError()}draw(){this.gl.drawArrays(this.gl.TRIANGLE_STRIP,0,4),this.checkError()}checkError(){if(le.debug){let e=this.gl,n=e.getError(),t="";switch(n){case e.NO_ERROR:return;case e.INVALID_ENUM:t="INVALID_ENUM";break;case e.INVALID_VALUE:t="INVALID_VALUE";break;case e.INVALID_OPERATION:t="INVALID_OPERATION";break;case e.INVALID_FRAMEBUFFER_OPERATION:t="INVALID_FRAMEBUFFER_OPERATION";break;case e.OUT_OF_MEMORY:t="OUT_OF_MEMORY";break;case e.CONTEXT_LOST_WEBGL:t="CONTEXT_LOST_WEBGL";break;default:t=`Unknown WebGL Error: ${n.toString(16)}`}throw new Error(t)}}deleteTexture(e){this.gl.deleteTexture(e)}deleteProgram(e){this.gl.deleteProgram(e)}getEncoder(e,n,t=0){if(this.version===2)return new Fo(this.gl,n);switch(e){case"float":return t===1||this.isRenderFloat32Supported?new Nn(this.gl,n):new Nn(this.gl,n,this.textureHalfFloatExtension.HALF_FLOAT_OES);case"int":throw new Error("not implemented");case"byte":return new Mo(this.gl,n);default:throw new Error(`Invalid dataType: ${e}`)}}clearActiveTextures(){let e=this.gl;for(let n=0;nthis.isTimerResultAvailable(e)),this.getTimerResult(e)}async createAndWaitForFence(){let e=this.createFence(this.gl);return this.pollFence(e)}createFence(e){let n,t=e,o=t.fenceSync(t.SYNC_GPU_COMMANDS_COMPLETE,0);return e.flush(),o===null?n=()=>!0:n=()=>{let i=t.clientWaitSync(o,0,0);return i===t.ALREADY_SIGNALED||i===t.CONDITION_SATISFIED},{query:o,isFencePassed:n}}async pollFence(e){return new Promise(n=>{this.addItemToPoll(()=>e.isFencePassed(),()=>n())})}pollItems(){let e=__(this.itemsToPoll.map(n=>n.isDoneFn));for(let n=0;n<=e;++n){let{resolveFn:t}=this.itemsToPoll[n];t()}this.itemsToPoll=this.itemsToPoll.slice(e+1)}async addItemToPoll(e,n){this.itemsToPoll.push({isDoneFn:e,resolveFn:n}),!(this.itemsToPoll.length>1)&&await Xa(()=>(this.pollItems(),this.itemsToPoll.length===0))}}});function Ss(r){let e;if((!r||r==="webgl2")&&"webgl2"in vn?e=vn.webgl2:(!r||r==="webgl")&&"webgl"in vn&&(e=vn.webgl),!e)try{let t=S_();e=ah(t,r)}catch{let o=I_();e=ah(o,r)}r=r||e.version===1?"webgl":"webgl2";let n=e.gl;return vn[r]=e,n.isContextLost()?(delete vn[r],Ss(r)):(n.disable(n.DEPTH_TEST),n.disable(n.STENCIL_TEST),n.disable(n.BLEND),n.disable(n.DITHER),n.disable(n.POLYGON_OFFSET_FILL),n.disable(n.SAMPLE_COVERAGE),n.enable(n.SCISSOR_TEST),n.enable(n.CULL_FACE),n.cullFace(n.BACK),e)}function ah(r,e){let n={alpha:!1,depth:!1,antialias:!1,stencil:!1,preserveDrawingBuffer:!1,premultipliedAlpha:!1,failIfMajorPerformanceCaveat:!1},t,o=n;if((!e||e==="webgl2")&&(t=r.getContext("webgl2",o),t))try{return new Un(t,2)}catch(i){Re.warning("GlContextFactory",`failed to create WebGLContext using contextId 'webgl2'. Error: ${i}`)}if((!e||e==="webgl")&&(t=r.getContext("webgl",o)||r.getContext("experimental-webgl",o),t))try{return new Un(t,1)}catch(i){Re.warning("GlContextFactory",`failed to create WebGLContext using contextId 'webgl' or 'experimental-webgl'. Error: ${i}`)}throw new Error("WebGL is not supported")}function I_(){if(typeof document>"u")throw new TypeError("failed to create canvas: document is not supported");let r=document.createElement("canvas");return r.width=1,r.height=1,r}function S_(){if(typeof OffscreenCanvas>"u")throw new TypeError("failed to create offscreen canvas: OffscreenCanvas is not supported");return new OffscreenCanvas(1,1)}var vn,sh=C(()=>{"use strict";Pt();ih();vn={}});var ui,uh=C(()=>{"use strict";ft();Pt();oh();sh();ui=class{get contextId(){return le.webgl.contextId}set contextId(e){le.webgl.contextId=e}get matmulMaxBatchSize(){return le.webgl.matmulMaxBatchSize}set matmulMaxBatchSize(e){le.webgl.matmulMaxBatchSize=e}get textureCacheMode(){return le.webgl.textureCacheMode}set textureCacheMode(e){le.webgl.textureCacheMode=e}get pack(){return le.webgl.pack}set pack(e){le.webgl.pack=e}get async(){return le.webgl.async}set async(e){le.webgl.async=e}initialize(){try{return this.glContext=Ss(this.contextId),typeof this.matmulMaxBatchSize!="number"&&(this.matmulMaxBatchSize=16),typeof this.textureCacheMode!="string"&&(this.textureCacheMode="full"),typeof this.pack!="boolean"&&(this.pack=!1),typeof this.async!="boolean"&&(this.async=!1),Re.setWithEnv(le),le.webgl.context||Object.defineProperty(le.webgl,"context",{value:this.glContext.gl}),Re.verbose("WebGLBackend",`Created WebGLContext: ${typeof this.glContext} with matmulMaxBatchSize: ${this.matmulMaxBatchSize}; textureCacheMode: ${this.textureCacheMode}; pack: ${this.pack}; async: ${this.async}.`),!0}catch(e){return Re.warning("WebGLBackend",`Unable to initialize WebGLBackend. ${e}`),!1}}createSessionHandler(e){return new si(this,e)}dispose(){this.glContext.dispose()}}});async function $s(r){if(r){let e=typeof r=="string"?[r]:r;for(let n of e){let t=lh.get(n);if(t)return t;let o=await A_(n);if(o)return o}}else return $s(["webgl"]);throw new Error("no available backend to use")}async function A_(r){let e=$_;if(typeof e[r]<"u"&&P_(e[r])){let n=e[r],t=n.initialize();if(typeof t=="object"&&"then"in t&&(t=await t),t)return lh.set(r,n),n}}function P_(r){let e=r;return"initialize"in e&&typeof e.initialize=="function"&&"createSessionHandler"in e&&typeof e.createSessionHandler=="function"&&"dispose"in e&&typeof e.dispose=="function"}var lh,$_,ch=C(()=>{"use strict";uh();lh=new Map,$_={webgl:new ui}});var As,li,fh=C(()=>{"use strict";Pt();As=class{constructor(e,n){this.op=e;this.node=n}},li=class{constructor(e,n,t){this.graph=e;this.profiler=t;this.initialize(n)}initialize(e){this.profiler.event("session","ExecutionPlan.initialize",()=>{let n=this.graph.getNodes();if(n.length!==e.length)throw new Error("The size of nodes and OPs do not match.");this._ops=e.map((t,o)=>new As(t,n[o])),this.reset(),this._starter=[],this._ops.forEach((t,o)=>{let i=!0;for(let s of t.node.inputs)if(!this._values[s]&&this.graph.getInputIndices().indexOf(s)===-1){i=!1;break}i&&this._starter.push(o)})})}reset(){this._values=this.graph.getValues().map(e=>e.tensor)}async execute(e,n){return this.profiler.event("session","ExecutionPlan.execute",async()=>{this.reset();let t=e.createInferenceHandler(),o=this.graph.getInputIndices();if(n.length!==o.length)throw new Error(`number of input tensors don't match the number of inputs to the model: actual: ${n.length} expected: ${o.length}`);n.forEach((f,c)=>{let p=o[c];this._values[p]=f});let i=this._starter.slice(0),s=this.graph.getValues(),a=this.graph.getNodes(),u=0;for(;uthis._values[T]);if(p.indexOf(void 0)!==-1)throw new Error(`unresolved input detected: op: ${c.node}`);let b=p;Re.verbose("ExecPlan",`Running op:${c.node.name} (${b.map((T,w)=>`'${c.node.inputs[w]}': ${T.type}[${T.dims.join(",")}]`).join(", ")})`);let h=await this.profiler.event("node",c.node.name,async()=>c.op.impl(t,b,c.op.context));if(h.length!==c.node.outputs.length)throw new Error("the size of output does not match model definition.");h.forEach((T,w)=>{let v=c.node.outputs[w];if(this._values[v])throw new Error(`output [${v}] already has value: op:${c.node.name}`);this._values[v]=T});let g=new Set;h.forEach((T,w)=>{let v=c.node.outputs[w];for(let S of s[v].to){let $=a[S],P=!0;for(let E of $.inputs)if(!this._values[E]){P=!1;break}P&&g.add(S)}}),i.push(...g)}let l=[];for(let f=0;f{"use strict";Cn();we=un(dn());Gr();De();Lt=ee.experimental.fbs,Wn=class r{constructor(e){if(this._attributes=new Map,e!=null){for(let n of e)n instanceof we.onnx.AttributeProto?this._attributes.set(n.name,[r.getValue(n),r.getType(n)]):n instanceof Lt.Attribute&&this._attributes.set(n.name(),[r.getValue(n),r.getType(n)]);if(this._attributes.sizeQe.fromProto(i));if(e instanceof Lt.Attribute)return t.map(i=>Qe.fromOrtTensor(i))}return n===we.onnx.AttributeProto.AttributeType.STRING&&e instanceof we.onnx.AttributeProto?Rn(t):n===we.onnx.AttributeProto.AttributeType.STRINGS&&e instanceof we.onnx.AttributeProto?t.map(Rn):t}static getValueNoCheck(e){return e instanceof we.onnx.AttributeProto?this.getValueNoCheckFromOnnxFormat(e):this.getValueNoCheckFromOrtFormat(e)}static getValueNoCheckFromOnnxFormat(e){switch(e.type){case we.onnx.AttributeProto.AttributeType.FLOAT:return e.f;case we.onnx.AttributeProto.AttributeType.INT:return e.i;case we.onnx.AttributeProto.AttributeType.STRING:return e.s;case we.onnx.AttributeProto.AttributeType.TENSOR:return e.t;case we.onnx.AttributeProto.AttributeType.GRAPH:return e.g;case we.onnx.AttributeProto.AttributeType.FLOATS:return e.floats;case we.onnx.AttributeProto.AttributeType.INTS:return e.ints;case we.onnx.AttributeProto.AttributeType.STRINGS:return e.strings;case we.onnx.AttributeProto.AttributeType.TENSORS:return e.tensors;case we.onnx.AttributeProto.AttributeType.GRAPHS:return e.graphs;default:throw new Error(`unsupported attribute type: ${we.onnx.AttributeProto.AttributeType[e.type]}`)}}static getValueNoCheckFromOrtFormat(e){switch(e.type()){case Lt.AttributeType.FLOAT:return e.f();case Lt.AttributeType.INT:return e.i();case Lt.AttributeType.STRING:return e.s();case Lt.AttributeType.TENSOR:return e.t();case Lt.AttributeType.GRAPH:return e.g();case Lt.AttributeType.FLOATS:return e.floatsArray();case Lt.AttributeType.INTS:{let n=[];for(let t=0;t{"use strict";dh();Cn();Os=un(dn());Gr();De();ci=ee.experimental.fbs,Es={from:(r,e)=>new Ps(r,e)},rr=class{constructor(e){this._from=void 0,this._to=[],this.tensor=void 0,this.type=void 0,e&&(this.type=lt.tensorValueTypeFromProto(e.type.tensorType))}get from(){return this._from}get to(){return this._to}},fi=class{constructor(e,n){e instanceof Os.onnx.NodeProto?(this.name=e.name,this.opType=e.opType,this.attributes=new Wn(e.attribute)):e instanceof ci.Node&&(this.name=n??e.name(),this.opType=e.opType(),this.attributes=new Wn(lt.tensorAttributesFromORTFormat(e))),this.inputs=[],this.outputs=[],this.executeNode=!0}},Ps=class{constructor(e,n){if(!e)throw new TypeError("graph is empty");this.buildGraph(e),this.transformGraph(n),this.checkIsAcyclic()}getInputIndices(){return this._allInputIndices}getInputNames(){return this._allInputNames}getOutputIndices(){return this._allOutputIndices}getOutputNames(){return this._allOutputNames}getValues(){return this._allData}getNodes(){return this._nodes}buildGraph(e){if(e instanceof Os.onnx.GraphProto)this.buildGraphFromOnnxFormat(e);else if(e instanceof ci.Graph)this.buildGraphFromOrtFormat(e);else throw new TypeError("Graph type is not supported.")}buildGraphFromOnnxFormat(e){let n=new Map;this._allData=[],this._allInputIndices=[],this._allInputNames=[],this._allOutputIndices=[],this._allOutputNames=[],this._nodes=[];let t=new Map;if(!e.input)throw new Error("missing information in graph: input");let o=[];for(let i of e.input){if(n.has(i.name))throw new Error(`duplicated input name: ${i.name}`);let s=this._allData.push(new rr(i))-1;n.set(i.name,s),o.push(i.name)}if(!e.initializer)throw new Error("missing information in graph: initializer");for(let i of e.initializer){let s=n.get(i.name);if(s===void 0){let a=new rr;a.type={shape:{dims:lt.tensorDimsFromProto(i.dims)},tensorType:lt.tensorDataTypeFromProto(i.dataType)},s=this._allData.push(a)-1,n.set(i.name,s)}this._allData[s]._from=-1,this._allData[s].tensor=Qe.fromProto(i)}for(let i=0;i"u"&&(l=this._allData.push(new rr)-1,n.set(u,l)),s.outputs.push(l),this._allData[l]._from!==void 0)throw new Error(`multiple nodes output to one data value: ${l}`);if(this._allData[l]._from=i,a.opType==="Constant"){if(!a.attribute||a.attribute.length!==1||!a.attribute[0].t)throw new Error("missing attributes or missing tensor value in attributes for this Constant operator");if(!a.output||a.output.length!==1)throw new Error("missing output or incorrect number of outputs for this Constant operator");s.outputs.pop(),s.executeNode=!1,this._allData[l]._from=-1,this._allData[l].tensor=Qe.fromProto(a.attribute[0].t)}}}for(let i=0;i"u"){if(u===""&&(a.input.length===3||a.input.length===4)&&a.opType==="Resize")continue;throw new Error(`unrecognized input '${u}' for node: ${a.name}`)}s.inputs.push(l),this._allData[l]._to.push(i)}}return!0}buildGraphFromOrtFormat(e){let n=new Map;this._allData=[],this._allInputIndices=[],this._allInputNames=[],this._allOutputIndices=[],this._allOutputNames=[],this._nodes=[];let t=new Map,o=[];for(let i=0;i"u"&&(f=this._allData.push(new rr)-1,n.set(l,f)),s.outputs.push(f),this._allData[f]._from!==void 0)throw new Error(`multiple nodes output to one data value: ${f}`);if(this._allData[f]._from=i,a.opType()==="Constant"){if(a.attributesLength()!==1||!a.attributes(0).t())throw new Error("missing attributes or missing tensor value in attributes for this Constant operator");if(a.outputsLength()!==1)throw new Error("missing output or incorrect number of outputs for this Constant operator");s.outputs.pop(),s.executeNode=!1,this._allData[f]._from=-1,this._allData[f].tensor=Qe.fromOrtTensor(a.attributes(0).t())}}}for(let i=0;i"u")throw new Error(`unrecognized input '${l}' for node: ${a.name()}`);s.inputs.push(f),this._allData[f]._to.push(i)}}}checkIsAcyclic(){let e=new Set;this._allInputIndices.forEach(o=>{this._allData[o]._to.forEach(s=>{e.add(s)})});let n=Array.from(e),t=new Array(this._nodes.length).fill("white");for(;n.length>0;){let o=n.pop();t[o]==="gray"?t[o]="black":(n.push(o),t[o]="gray",this._nodes[o].outputs.forEach(i=>{let s=this._allData[i];if(typeof s.tensor<"u")throw new Error("node outputs should not be initialized");if(s._from!==o)throw new Error("from property of the Value object doesn't match index of Node being processed");s._to.forEach(a=>{if(t[a]==="gray")throw new Error("model graph is cyclic");t[a]==="white"&&n.push(a)})}))}}transformGraph(e){this.removeAllIdentityNodes(),this.removeAllDropoutNodes(),this.fuseConvActivationNodes(),e&&e.transformGraph(this),this.finalizeGraph()}finalizeGraph(){let e=0,n=new Array(this._nodes.length,0),t=0;for(let o=0;o{this._allData[i]._from=-2});this._nodes.splice(t,this._nodes.length-t);for(let o=0;o=0)i._to[s]=n[i._to[s]];else throw new Error("Trying to update a removed node")}e=0;for(let o=0;o0){let i=-1;this._allData[o].from!==void 0&&this._allData[o].from!==-1?(i=this._nodes[this._allData[o].from].outputs.indexOf(o+e),i!==-1&&(this._nodes[this._allData[o].from].outputs[i]=o)):(i=this._allInputIndices.indexOf(o+e),i!==-1&&(this._allInputIndices[i]=o)),this._allData[o].to.forEach(s=>{i=this._nodes[s].inputs.indexOf(o+e),i!==-1&&(this._nodes[s].inputs[i]=o)}),this._allData[o].to.length===0&&(i=this._allOutputIndices.indexOf(o+e),i!==-1&&(this._allOutputIndices[i]=o))}}}deleteNode(e){let n=this._nodes[e];if(n.outputs.length>1){for(let a=1;a0)throw new Error("Node deletion with more than one output connected to other nodes is not supported. ")}n.executeNode=!1;let t=n.inputs[0],o=n.outputs[0],i=this._allData[o].to;for(let a=0;a0)for(let a of i){let u=this._nodes[a].inputs.indexOf(o);if(u===-1)throw new Error("The Node object doesn't have the output Value in it's 'inputs' property ");this._nodes[a].inputs[u]=t,this._allData[t].to.push(a)}}removeAllDropoutNodes(){let e=0;for(let n of this._nodes){if(n.opType==="Dropout"){if(n.inputs.length!==1)throw new Error("Dropout nodes should only contain one input. ");if(n.outputs.length!==1&&n.outputs.length!==2)throw new Error("Dropout nodes should contain either 1 or 2 output(s)");if(n.outputs.length===2&&this._allData[n.outputs[1]]._to.length!==0)throw new Error("Dropout nodes's second output should not be referenced by other nodes");this.deleteNode(e)}e++}}removeAllIdentityNodes(){let e=0;for(let n of this._nodes)n.opType==="Identity"&&this.deleteNode(e),e++}isActivation(e){switch(e.opType){case"Relu":case"Sigmoid":case"Clip":return!0;default:return!1}}fuseConvActivationNodes(){for(let e of this._nodes)if(e.opType==="Conv"){let n=this._allData[e.outputs[0]]._to;if(n.length===1&&this.isActivation(this._nodes[n[0]])){let t=this._nodes[n[0]];if(t.opType==="Clip")if(t.inputs.length===1)try{e.attributes.set("activation_params","floats",[t.attributes.getFloat("min"),t.attributes.getFloat("max")])}catch{e.attributes.set("activation_params","floats",[Mr,Vr])}else if(t.inputs.length>=3&&this._allData[t.inputs[1]].tensor!==void 0&&this._allData[t.inputs[2]].tensor!==void 0)e.attributes.set("activation_params","floats",[this._allData[t.inputs[1]].tensor.floatData[0],this._allData[t.inputs[2]].tensor.floatData[0]]);else continue;e.attributes.set("activation","string",t.opType),this.deleteNode(n[0])}}}}});var mh,O_,di,hh=C(()=>{"use strict";ko();ph();Cn();mh=un(dn());De();O_=ee.experimental.fbs,di=class{constructor(){}load(e,n,t){let o;if(!t)try{this.loadFromOnnxFormat(e,n);return}catch(i){if(t!==void 0)throw i;o=i}try{this.loadFromOrtFormat(e,n)}catch(i){throw t!==void 0?i:new Error(`Failed to load model as ONNX format: ${o} -as ORT format: ${i}`)}}loadFromOnnxFormat(e,n){let t=mh.onnx.ModelProto.decode(e);if(wt.longToNumber(t.irVersion)<3)throw new Error("only support ONNX model with IR_VERSION>=3");this._opsets=t.opsetImport.map(i=>({domain:i.domain,version:wt.longToNumber(i.version)})),this._graph=Es.from(t.graph,n)}loadFromOrtFormat(e,n){let t=new k.ByteBuffer(e),o=O_.InferenceSession.getRootAsInferenceSession(t).model();if(wt.longToNumber(o.irVersion())<3)throw new Error("only support ONNX model with IR_VERSION>=3");this._opsets=[];for(let s=0;s{"use strict";ch();fh();Pt();hh();pi=class{constructor(e={}){this._initialized=!1,this.backendHint=e.backendHint,this.profiler=Eo.create(e.profiler),this.context={profiler:this.profiler,graphInputTypes:[],graphInputDims:[]}}get inputNames(){return this._model.graph.getInputNames()}get outputNames(){return this._model.graph.getOutputNames()}startProfiling(){this.profiler.start()}endProfiling(){this.profiler.stop()}async loadModel(e,n,t){await this.profiler.event("session","Session.loadModel",async()=>{let o=await $s(this.backendHint);if(this.sessionHandler=o.createSessionHandler(this.context),this._model=new di,typeof e=="string"){let i=e.endsWith(".ort");{let a=await(await fetch(e)).arrayBuffer();this.initialize(new Uint8Array(a),i)}}else if(ArrayBuffer.isView(e))this.initialize(e);else{let i=new Uint8Array(e,n||0,t||e.byteLength);this.initialize(i)}})}initialize(e,n){if(this._initialized)throw new Error("already initialized");this.profiler.event("session","Session.initialize",()=>{let t=this.sessionHandler.transformGraph?this.sessionHandler:void 0;this._model.load(e,t,n),this.sessionHandler.onGraphInitialized&&this.sessionHandler.onGraphInitialized(this._model.graph),this.initializeOps(this._model.graph),this._executionPlan=new li(this._model.graph,this._ops,this.profiler)}),this._initialized=!0}async run(e){if(!this._initialized)throw new Error("session not initialized yet");return this.profiler.event("session","Session.run",async()=>{let n=this.normalizeAndValidateInputs(e),t=await this._executionPlan.execute(this.sessionHandler,n);return this.createOutput(t)})}normalizeAndValidateInputs(e){let n=this._model.graph.getInputNames();if(Array.isArray(e)){if(e.length!==n.length)throw new Error(`incorrect input array length: expected ${n.length} but got ${e.length}`)}else{if(e.size!==n.length)throw new Error(`incorrect input map size: expected ${n.length} but got ${e.size}`);let t=new Array(e.size),o=0;for(let i=0;i{"use strict";ft();Gr();mi=class{constructor(e){this.session=e;this.inputNames=this.session.inputNames,this.outputNames=this.session.outputNames}async dispose(){}async run(e,n,t){let o=new Map;for(let a in e)if(Object.hasOwnProperty.call(e,a)){let u=e[a];o.set(a,new Qe(u.dims,u.type,void 0,void 0,u.data))}let i=await this.session.run(o),s={};return i.forEach((a,u)=>{s[u]=new it(a.type,a.data,a.dims)}),s}startProfiling(){this.session.startProfiling()}endProfiling(){this.session.endProfiling()}}});var yh={};sn(yh,{onnxjsBackend:()=>E_});var Cs,E_,xh=C(()=>{"use strict";gh();bh();Cs=class{async init(){}async createInferenceSessionHandler(e,n){let t=new pi(n);return typeof e=="string"?await t.loadModel(e):await t.loadModel(e),new mi(t)}},E_=new Cs});var hi=C(()=>{"use strict"});var Th={};sn(Th,{default:()=>C_});var vh,wh,C_,_h=C(()=>{"use strict";ks();Kr();Hn();vh="ort-wasm-proxy-worker",wh=globalThis.self?.name===vh;wh&&(self.onmessage=r=>{let{type:e,in:n}=r.data;try{switch(e){case"init-wasm":gi(n.wasm).then(()=>{bi(n).then(()=>{postMessage({type:e})},t=>{postMessage({type:e,err:t})})},t=>{postMessage({type:e,err:t})});break;case"init-ep":{let{epName:t,env:o}=n;yi(o,t).then(()=>{postMessage({type:e})},i=>{postMessage({type:e,err:i})});break}case"copy-from":{let{buffer:t}=n,o=qn(t);postMessage({type:e,out:o});break}case"create":{let{model:t,options:o}=n;xi(t,o).then(i=>{postMessage({type:e,out:i})},i=>{postMessage({type:e,err:i})});break}case"release":vi(n),postMessage({type:e});break;case"run":{let{sessionId:t,inputIndices:o,inputs:i,outputIndices:s,options:a}=n;wi(t,o,i,s,new Array(s.length).fill(null),a).then(u=>{u.some(l=>l[3]!=="cpu")?postMessage({type:e,err:"Proxy does not support non-cpu tensor location."}):postMessage({type:e,out:u},_i([...i,...u]))},u=>{postMessage({type:e,err:u})});break}case"end-profiling":Ti(n),postMessage({type:e});break;default:}}catch(t){postMessage({type:e,err:t})}});C_=wh?null:r=>new Worker(r??wn,{type:"module",name:vh})});var Sh={};sn(Sh,{default:()=>k_});var Ds,Ih,k_,$h=C(()=>{"use strict";Ih=(Ds=import.meta.url,async function(r={}){function e(){return ae.buffer!=ge.buffer&&Fe(),ge}function n(){return ae.buffer!=ge.buffer&&Fe(),Ie}function t(){return ae.buffer!=ge.buffer&&Fe(),xe}function o(){return ae.buffer!=ge.buffer&&Fe(),se}function i(){return ae.buffer!=ge.buffer&&Fe(),pe}function s(){return ae.buffer!=ge.buffer&&Fe(),ce}function a(){return ae.buffer!=ge.buffer&&Fe(),ut}function u(){return ae.buffer!=ge.buffer&&Fe(),Te}var l,f,c=Object.assign({},r),p=new Promise((d,m)=>{l=d,f=m}),b=typeof window=="object",h=typeof importScripts=="function",g=h&&self.name=="em-pthread";c.mountExternalData=(d,m)=>{(c.Cb||(c.Cb=new Map)).set(d,m)},c.unmountExternalData=()=>{delete c.Cb};var T=globalThis.SharedArrayBuffer??new WebAssembly.Memory({initial:0,maximum:0,shared:!0}).buffer.constructor;let w=()=>{let d=(y,x,_)=>(...O)=>{let R=Zt,M=x?.();O=y(...O);let j=x?.();return M!==j&&(y=j,_(M),x=_=null),Zt!=R?new Promise((Y,ne)=>{ma={resolve:Y,reject:ne}}):O},m=y=>async(...x)=>{try{if(c.Bb)throw Error("Session already started");let _=c.Bb={Zb:x[0],errors:[]},O=await y(...x);if(c.Bb!==_)throw Error("Session mismatch");c.Jb?.flush();let R=_.errors;if(0j),0c._OrtCreateSession,y=>c._OrtCreateSession=y),c._OrtRun=m(d(c._OrtRun,()=>c._OrtRun,y=>c._OrtRun=y)),c._OrtRunWithBinding=m(d(c._OrtRunWithBinding,()=>c._OrtRunWithBinding,y=>c._OrtRunWithBinding=y)),c._OrtBindInput=d(c._OrtBindInput,()=>c._OrtBindInput,y=>c._OrtBindInput=y),w=void 0};c.jsepInit=(d,m)=>{if(w?.(),d==="webgpu"){[c.Jb,c.Qb,c.Ub,c.Kb,c.Tb,c.gb,c.Vb,c.Xb,c.Rb,c.Sb,c.Wb]=m;let y=c.Jb;c.jsepRegisterBuffer=(x,_,O,R)=>y.registerBuffer(x,_,O,R),c.jsepGetBuffer=x=>y.getBuffer(x),c.jsepCreateDownloader=(x,_,O)=>y.createDownloader(x,_,O),c.jsepOnReleaseSession=x=>{y.onReleaseSession(x)},c.jsepOnRunStart=x=>y.onRunStart(x)}};var v,S,$=Object.assign({},c),P="./this.program",E=(d,m)=>{throw m},N="";(b||h)&&(h?N=self.location.href:typeof document<"u"&&document.currentScript&&(N=document.currentScript.src),Ds&&(N=Ds),N=N.startsWith("blob:")?"":N.substr(0,N.replace(/[?#].*/,"").lastIndexOf("/")+1),h&&(S=d=>{var m=new XMLHttpRequest;return m.open("GET",d,!1),m.responseType="arraybuffer",m.send(null),new Uint8Array(m.response)}),v=(d,m,y)=>{var x=new XMLHttpRequest;x.open("GET",d,!0),x.responseType="arraybuffer",x.onload=()=>{x.status==200||x.status==0&&x.response?m(x.response):y()},x.onerror=y,x.send(null)});var z=console.log.bind(console),q=console.error.bind(console),K=z,F=q;if(Object.assign(c,$),$=null,g){let d=function(m){try{var y=m.data,x=y.cmd;if(x==="load"){let _=[];self.onmessage=O=>_.push(O),self.startWorker=()=>{postMessage({cmd:"loaded"});for(let O of _)d(O);self.onmessage=d};for(let O of y.handlers)c[O]&&!c[O].proxy||(c[O]=(...R)=>{postMessage({Ib:"callHandler",hc:O,args:R})},O=="print"&&(K=c[O]),O=="printErr"&&(F=c[O]));ae=y.wasmMemory,Fe(),_e(y.wasmModule)}else if(x==="run"){ya(y.pthread_ptr,0,0,1,0,0),fa(y.pthread_ptr),Nx(),Eu(),$e||(Al(),$e=!0);try{zx(y.start_routine,y.arg)}catch(_){if(_!="unwind")throw _}}else x==="cancel"?an()&&ho(-1):y.target!=="setimmediate"&&(x==="checkMailbox"?$e&&io():x&&(F(`worker: received unknown command ${x}`),F(y)))}catch(_){throw Pl(),_}};var UI=d,_e,$e=!1;F=function(...m){m=m.join(" "),console.error(m)},self.alert=function(...m){postMessage({Ib:"alert",text:m.join(" "),jc:an()})},c.instantiateWasm=(m,y)=>new Promise(x=>{_e=_=>{_=new WebAssembly.Instance(_,Iu()),y(_),x()}}),self.onunhandledrejection=m=>{throw m.reason||m},self.onmessage=d}var ae,qe,Q,ge,Ie,xe,se,pe,ce,ut,V,ie,Te,tt=!1;function Fe(){var d=ae.buffer;c.HEAP8=ge=new Int8Array(d),c.HEAP16=xe=new Int16Array(d),c.HEAPU8=Ie=new Uint8Array(d),c.HEAPU16=se=new Uint16Array(d),c.HEAP32=pe=new Int32Array(d),c.HEAPU32=ce=new Uint32Array(d),c.HEAPF32=ut=new Float32Array(d),c.HEAPF64=Te=new Float64Array(d),c.HEAP64=V=new BigInt64Array(d),c.HEAPU64=ie=new BigUint64Array(d)}if(!g){if(c.wasmMemory)ae=c.wasmMemory;else if(!((ae=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0})).buffer instanceof T))throw F("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),Error("bad memory");Fe()}var Ke=[],tn=[],mt=[],rt=0,Kt=null,hr=null;function no(){if(--rt==0&&(Kt!==null&&(clearInterval(Kt),Kt=null),hr)){var d=hr;hr=null,d()}}function An(d){throw F(d="Aborted("+d+")"),tt=!0,Q=1,d=new WebAssembly.RuntimeError(d+". Build with -sASSERTIONS for more info."),f(d),d}var xu,vu=d=>d.startsWith("data:application/octet-stream;base64,"),wu=d=>d.startsWith("file://");function Tu(d){if(S)return S(d);throw"both async and sync fetching of the wasm failed"}function _u(d,m,y){return function(x){if(b||h){if(typeof fetch=="function"&&!wu(x))return fetch(x,{credentials:"same-origin"}).then(_=>{if(!_.ok)throw`failed to load wasm binary file at '${x}'`;return _.arrayBuffer()}).catch(()=>Tu(x));if(v)return new Promise((_,O)=>{v(x,R=>_(new Uint8Array(R)),O)})}return Promise.resolve().then(()=>Tu(x))}(d).then(x=>WebAssembly.instantiate(x,m)).then(y,x=>{F(`failed to asynchronously prepare wasm: ${x}`),An(x)})}function Iu(){return{a:{wa:Rx,b:Mx,Y:Bu,y:Nu,ma:zu,U:Mu,W:Vu,na:Gu,ka:Uu,da:Wu,ja:Hu,I:qu,V:Ku,S:ju,la:Xu,T:Zu,sa:Vx,C:Ux,M:Wx,L:qx,B:jx,s:Xx,p:Zx,D:Yx,x:o0,N:i0,ra:a0,ga:s0,Q:u0,Z:l0,E:c0,fa,pa:f0,u:d0,A:h0,o:g0,k:y0,c:la,n:x0,j:T0,xa:_0,r:I0,d:S0,v:$0,m:A0,g:P0,l:O0,i:E0,h:C0,e:k0,aa:D0,ba:B0,ca:L0,_:cl,$:fl,P:R0,f:N0,K:z0,F:F0,J:M0,ta:V0,oa:G0,R:U0,t:pl,w:W0,O:H0,va:q0,ua:K0,ha:gl,ia:bl,X:oa,z:yl,H:xl,ea:vl,G:wl,a:ae,qa:Il,q:Z0}}}var ta={1336340:(d,m,y,x)=>{if(c===void 0||!c.Cb)return 1;if((d=ot(d>>>0)).startsWith("./")&&(d=d.substring(2)),!(d=c.Cb.get(d)))return 2;if(x>>>=0,(m>>>=0)+(y>>>=0)>d.byteLength)return 3;try{return n().set(d.subarray(m,m+y),x>>>0),0}catch{return 4}},1336841:()=>{c.Rb()},1336872:()=>{c.Sb()},1336901:()=>{c.Wb()},1336926:d=>c.Qb(d),1336959:d=>c.Ub(d),1336991:(d,m,y)=>{c.Kb(d,m,y,!0)},1337030:(d,m,y)=>{c.Kb(d,m,y)},1337063:()=>typeof wasmOffsetConverter<"u",1337120:d=>{c.gb("Abs",d,void 0)},1337171:d=>{c.gb("Neg",d,void 0)},1337222:d=>{c.gb("Floor",d,void 0)},1337275:d=>{c.gb("Ceil",d,void 0)},1337327:d=>{c.gb("Reciprocal",d,void 0)},1337385:d=>{c.gb("Sqrt",d,void 0)},1337437:d=>{c.gb("Exp",d,void 0)},1337488:d=>{c.gb("Erf",d,void 0)},1337539:d=>{c.gb("Sigmoid",d,void 0)},1337594:(d,m,y)=>{c.gb("HardSigmoid",d,{alpha:m,beta:y})},1337673:d=>{c.gb("Log",d,void 0)},1337724:d=>{c.gb("Sin",d,void 0)},1337775:d=>{c.gb("Cos",d,void 0)},1337826:d=>{c.gb("Tan",d,void 0)},1337877:d=>{c.gb("Asin",d,void 0)},1337929:d=>{c.gb("Acos",d,void 0)},1337981:d=>{c.gb("Atan",d,void 0)},1338033:d=>{c.gb("Sinh",d,void 0)},1338085:d=>{c.gb("Cosh",d,void 0)},1338137:d=>{c.gb("Asinh",d,void 0)},1338190:d=>{c.gb("Acosh",d,void 0)},1338243:d=>{c.gb("Atanh",d,void 0)},1338296:d=>{c.gb("Tanh",d,void 0)},1338348:d=>{c.gb("Not",d,void 0)},1338399:(d,m,y)=>{c.gb("Clip",d,{min:m,max:y})},1338468:d=>{c.gb("Clip",d,void 0)},1338520:(d,m)=>{c.gb("Elu",d,{alpha:m})},1338578:d=>{c.gb("Relu",d,void 0)},1338630:(d,m)=>{c.gb("LeakyRelu",d,{alpha:m})},1338694:(d,m)=>{c.gb("ThresholdedRelu",d,{alpha:m})},1338764:(d,m)=>{c.gb("Cast",d,{to:m})},1338822:d=>{c.gb("Add",d,void 0)},1338873:d=>{c.gb("Sub",d,void 0)},1338924:d=>{c.gb("Mul",d,void 0)},1338975:d=>{c.gb("Div",d,void 0)},1339026:d=>{c.gb("Pow",d,void 0)},1339077:d=>{c.gb("Equal",d,void 0)},1339130:d=>{c.gb("Greater",d,void 0)},1339185:d=>{c.gb("GreaterOrEqual",d,void 0)},1339247:d=>{c.gb("Less",d,void 0)},1339299:d=>{c.gb("LessOrEqual",d,void 0)},1339358:(d,m,y,x,_)=>{c.gb("ReduceMean",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1339517:(d,m,y,x,_)=>{c.gb("ReduceMax",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1339675:(d,m,y,x,_)=>{c.gb("ReduceMin",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1339833:(d,m,y,x,_)=>{c.gb("ReduceProd",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1339992:(d,m,y,x,_)=>{c.gb("ReduceSum",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1340150:(d,m,y,x,_)=>{c.gb("ReduceL1",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1340307:(d,m,y,x,_)=>{c.gb("ReduceL2",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1340464:(d,m,y,x,_)=>{c.gb("ReduceLogSum",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1340625:(d,m,y,x,_)=>{c.gb("ReduceSumSquare",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1340789:(d,m,y,x,_)=>{c.gb("ReduceLogSumExp",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1340953:d=>{c.gb("Where",d,void 0)},1341006:(d,m,y)=>{c.gb("Transpose",d,{perm:m?Array.from(i().subarray(m>>>0,y>>>0)):[]})},1341114:(d,m,y,x)=>{c.gb("DepthToSpace",d,{blocksize:m,mode:ot(y),format:x?"NHWC":"NCHW"})},1341247:(d,m,y,x)=>{c.gb("DepthToSpace",d,{blocksize:m,mode:ot(y),format:x?"NHWC":"NCHW"})},1341380:(d,m,y,x,_,O,R,M,j,Y,ne,Ae,Ce,L,fe)=>{c.gb("ConvTranspose",d,{format:j?"NHWC":"NCHW",autoPad:m,dilations:[y],group:x,kernelShape:[_],pads:[O,R],strides:[M],wIsConst:()=>!!e()[Y>>>0],outputPadding:ne?Array.from(i().subarray(ne>>>0,Ae>>>0)):[],outputShape:Ce?Array.from(i().subarray(Ce>>>0,L>>>0)):[],activation:ot(fe)})},1341781:(d,m,y,x,_,O,R,M,j,Y,ne,Ae,Ce,L)=>{c.gb("ConvTranspose",d,{format:M?"NHWC":"NCHW",autoPad:m,dilations:Array.from(i().subarray(y>>>0,2+(y>>>0)>>>0)),group:x,kernelShape:Array.from(i().subarray(_>>>0,2+(_>>>0)>>>0)),pads:Array.from(i().subarray(O>>>0,4+(O>>>0)>>>0)),strides:Array.from(i().subarray(R>>>0,2+(R>>>0)>>>0)),wIsConst:()=>!!e()[j>>>0],outputPadding:Y?Array.from(i().subarray(Y>>>0,ne>>>0)):[],outputShape:Ae?Array.from(i().subarray(Ae>>>0,Ce>>>0)):[],activation:ot(L)})},1342346:(d,m,y,x,_,O,R,M,j,Y,ne,Ae,Ce,L,fe)=>{c.gb("ConvTranspose",d,{format:j?"NHWC":"NCHW",autoPad:m,dilations:[y],group:x,kernelShape:[_],pads:[O,R],strides:[M],wIsConst:()=>!!e()[Y>>>0],outputPadding:ne?Array.from(i().subarray(ne>>>0,Ae>>>0)):[],outputShape:Ce?Array.from(i().subarray(Ce>>>0,L>>>0)):[],activation:ot(fe)})},1342747:(d,m,y,x,_,O,R,M,j,Y,ne,Ae,Ce,L)=>{c.gb("ConvTranspose",d,{format:M?"NHWC":"NCHW",autoPad:m,dilations:Array.from(i().subarray(y>>>0,2+(y>>>0)>>>0)),group:x,kernelShape:Array.from(i().subarray(_>>>0,2+(_>>>0)>>>0)),pads:Array.from(i().subarray(O>>>0,4+(O>>>0)>>>0)),strides:Array.from(i().subarray(R>>>0,2+(R>>>0)>>>0)),wIsConst:()=>!!e()[j>>>0],outputPadding:Y?Array.from(i().subarray(Y>>>0,ne>>>0)):[],outputShape:Ae?Array.from(i().subarray(Ae>>>0,Ce>>>0)):[],activation:ot(L)})},1343312:(d,m)=>{c.gb("GlobalAveragePool",d,{format:m?"NHWC":"NCHW"})},1343403:(d,m,y,x,_,O,R,M,j,Y,ne,Ae,Ce,L,fe,Le)=>{c.gb("AveragePool",d,{format:Le?"NHWC":"NCHW",auto_pad:m,ceil_mode:y,count_include_pad:x,storage_order:_,dilations:[O,R],kernel_shape:[M,j],pads:[Y,ne,Ae,Ce],strides:[L,fe]})},1343687:(d,m)=>{c.gb("GlobalAveragePool",d,{format:m?"NHWC":"NCHW"})},1343778:(d,m,y,x,_,O,R,M,j,Y,ne,Ae,Ce,L,fe,Le)=>{c.gb("AveragePool",d,{format:Le?"NHWC":"NCHW",auto_pad:m,ceil_mode:y,count_include_pad:x,storage_order:_,dilations:[O,R],kernel_shape:[M,j],pads:[Y,ne,Ae,Ce],strides:[L,fe]})},1344062:(d,m)=>{c.gb("GlobalMaxPool",d,{format:m?"NHWC":"NCHW"})},1344149:(d,m,y,x,_,O,R,M,j,Y,ne,Ae,Ce,L,fe,Le)=>{c.gb("MaxPool",d,{format:Le?"NHWC":"NCHW",auto_pad:m,ceil_mode:y,count_include_pad:x,storage_order:_,dilations:[O,R],kernel_shape:[M,j],pads:[Y,ne,Ae,Ce],strides:[L,fe]})},1344429:(d,m)=>{c.gb("GlobalMaxPool",d,{format:m?"NHWC":"NCHW"})},1344516:(d,m,y,x,_,O,R,M,j,Y,ne,Ae,Ce,L,fe,Le)=>{c.gb("MaxPool",d,{format:Le?"NHWC":"NCHW",auto_pad:m,ceil_mode:y,count_include_pad:x,storage_order:_,dilations:[O,R],kernel_shape:[M,j],pads:[Y,ne,Ae,Ce],strides:[L,fe]})},1344796:(d,m,y,x,_)=>{c.gb("Gemm",d,{alpha:m,beta:y,transA:x,transB:_})},1344900:d=>{c.gb("MatMul",d,void 0)},1344954:(d,m,y,x)=>{c.gb("ArgMax",d,{keepDims:!!m,selectLastIndex:!!y,axis:x})},1345062:(d,m,y,x)=>{c.gb("ArgMin",d,{keepDims:!!m,selectLastIndex:!!y,axis:x})},1345170:(d,m)=>{c.gb("Softmax",d,{axis:m})},1345233:(d,m)=>{c.gb("Concat",d,{axis:m})},1345293:(d,m,y,x,_)=>{c.gb("Split",d,{axis:m,numOutputs:y,splitSizes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1345433:d=>{c.gb("Expand",d,void 0)},1345487:(d,m)=>{c.gb("Gather",d,{axis:Number(m)})},1345558:(d,m)=>{c.gb("GatherElements",d,{axis:Number(m)})},1345637:(d,m,y,x,_,O,R,M,j,Y,ne)=>{c.gb("Resize",d,{antialias:m,axes:y?Array.from(i().subarray(y>>>0,x>>>0)):[],coordinateTransformMode:ot(_),cubicCoeffA:O,excludeOutside:R,extrapolationValue:M,keepAspectRatioPolicy:ot(j),mode:ot(Y),nearestMode:ot(ne)})},1345983:(d,m,y,x,_,O,R)=>{c.gb("Slice",d,{starts:m?Array.from(i().subarray(m>>>0,y>>>0)):[],ends:x?Array.from(i().subarray(x>>>0,_>>>0)):[],axes:O?Array.from(i().subarray(O>>>0,R>>>0)):[]})},1346199:d=>{c.gb("Tile",d,void 0)},1346251:(d,m,y)=>{c.gb("InstanceNormalization",d,{epsilon:m,format:y?"NHWC":"NCHW"})},1346365:(d,m,y)=>{c.gb("InstanceNormalization",d,{epsilon:m,format:y?"NHWC":"NCHW"})},1346479:d=>{c.gb("Range",d,void 0)},1346532:(d,m)=>{c.gb("Einsum",d,{equation:ot(m)})},1346613:(d,m,y,x,_)=>{c.gb("Pad",d,{mode:m,value:y,pads:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1346740:(d,m,y,x,_,O)=>{c.gb("BatchNormalization",d,{epsilon:m,momentum:y,spatial:!!_,trainingMode:!!x,format:O?"NHWC":"NCHW"})},1346909:(d,m,y,x,_,O)=>{c.gb("BatchNormalization",d,{epsilon:m,momentum:y,spatial:!!_,trainingMode:!!x,format:O?"NHWC":"NCHW"})},1347078:(d,m,y)=>{c.gb("CumSum",d,{exclusive:Number(m),reverse:Number(y)})},1347175:(d,m,y,x,_,O,R,M,j)=>{c.gb("Attention",d,{numHeads:m,isUnidirectional:y,maskFilterValue:x,scale:_,doRotary:O,qkvHiddenSizes:R?Array.from(i().subarray(Number(M)>>>0,Number(M)+R>>>0)):[],pastPresentShareBuffer:!!j})},1347447:d=>{c.gb("BiasAdd",d,void 0)},1347502:d=>{c.gb("BiasSplitGelu",d,void 0)},1347563:d=>{c.gb("FastGelu",d,void 0)},1347619:(d,m,y,x,_,O,R,M,j,Y,ne,Ae,Ce,L,fe,Le)=>{c.gb("Conv",d,{format:Ae?"NHWC":"NCHW",auto_pad:m,dilations:y?Array.from(i().subarray(y>>>0,x>>>0)):[],group:_,kernel_shape:O?Array.from(i().subarray(O>>>0,R>>>0)):[],pads:M?Array.from(i().subarray(M>>>0,j>>>0)):[],strides:Y?Array.from(i().subarray(Y>>>0,ne>>>0)):[],w_is_const:()=>!!e()[Ce>>>0],activation:ot(L),activation_params:fe?Array.from(a().subarray(fe>>>0,Le>>>0)):[]})},1348115:d=>{c.gb("Gelu",d,void 0)},1348167:(d,m,y,x)=>{c.gb("GroupQueryAttention",d,{numHeads:m,kvNumHeads:y,scale:x})},1348280:(d,m,y,x)=>{c.gb("LayerNormalization",d,{axis:m,epsilon:y,simplified:!!x})},1348391:(d,m,y,x)=>{c.gb("LayerNormalization",d,{axis:m,epsilon:y,simplified:!!x})},1348502:(d,m,y,x,_,O)=>{c.gb("MatMulNBits",d,{k:m,n:y,accuracyLevel:x,bits:_,blockSize:O})},1348629:(d,m,y,x,_,O)=>{c.gb("MultiHeadAttention",d,{numHeads:m,isUnidirectional:y,maskFilterValue:x,scale:_,doRotary:O})},1348788:(d,m)=>{c.gb("QuickGelu",d,{alpha:m})},1348852:(d,m,y,x,_)=>{c.gb("RotaryEmbedding",d,{interleaved:!!m,numHeads:y,rotaryEmbeddingDim:x,scale:_})},1348991:(d,m,y)=>{c.gb("SkipLayerNormalization",d,{epsilon:m,simplified:!!y})},1349093:d=>{c.Vb(d)},1349127:(d,m)=>c.Xb(d,m,c.Bb.Zb,c.Bb.errors),1349239:(d,m,y)=>{c.gb("SkipLayerNormalization",d,{epsilon:m,simplified:!!y})}};function Rx(d,m,y){return il(async()=>{await c.Tb(d,m,y)})}function ra(d){this.name="ExitStatus",this.message=`Program terminated with exit(${d})`,this.status=d}var na=d=>{d.terminate(),d.onmessage=()=>{}},Su=d=>{gr.length==0&&(ku(),Cu(gr[0]));var m=gr.pop();if(!m)return 6;Cr.push(m),jt[d.xb]=m,m.xb=d.xb;var y={cmd:"run",start_routine:d.$b,arg:d.Mb,pthread_ptr:d.xb};return m.postMessage(y,d.ec),0},Er=0,We=(d,m,...y)=>{for(var x=2*y.length,_=wa(),O=va(8*x),R=O>>>3,M=0;M>>0]=j)}return d=Ol(d,0,x,O,m),go(_),d};function $u(d){if(g)return We(0,1,d);if(Q=d,!(0{if(Q=d,g)throw Au(d),"unwind";$u(d)},gr=[],Cr=[],Pu=[],jt={},Ou=d=>{var m=d.xb;delete jt[m],gr.push(d),Cr.splice(Cr.indexOf(d),1),d.xb=0,xa(m)};function Eu(){Pu.forEach(d=>d())}var Cu=d=>new Promise(m=>{d.onmessage=_=>{var O=(_=_.data).cmd;if(_.targetThread&&_.targetThread!=an()){var R=jt[_.targetThread];R?R.postMessage(_,_.transferList):F(`Internal error! Worker sent a message "${O}" to target pthread ${_.targetThread}, but that thread no longer exists!`)}else O==="checkMailbox"?io():O==="spawnThread"?Su(_):O==="cleanupThread"?Ou(jt[_.thread]):O==="killThread"?(_=_.thread,O=jt[_],delete jt[_],na(O),xa(_),Cr.splice(Cr.indexOf(O),1),O.xb=0):O==="cancelThread"?jt[_.thread].postMessage({cmd:"cancel"}):O==="loaded"?(d.loaded=!0,m(d)):O==="alert"?alert(`Thread ${_.threadId}: ${_.text}`):_.target==="setimmediate"?d.postMessage(_):O==="callHandler"?c[_.handler](..._.args):O&&F(`worker sent an unknown command ${O}`)},d.onerror=_=>{throw F(`worker sent an error! ${_.filename}:${_.lineno}: ${_.message}`),_};var y,x=[];for(y of["onExit"])c.hasOwnProperty(y)&&x.push(y);d.postMessage({cmd:"load",handlers:x,wasmMemory:ae,wasmModule:qe})});function ku(){var d=new Worker(new URL(import.meta.url),{type:"module",workerData:"em-pthread",name:"em-pthread"});gr.push(d)}var oo=d=>{for(;0{var d=an(),m=s()[d+52>>>2>>>0];d=s()[d+56>>>2>>>0],Cl(m,m-d),go(m)},zx=(d,m)=>{Er=0,d=kl(d,m),0>>=0);throw m>>>=0,y>>>=0,s()[x.Fb+16>>>2>>>0]=0,s()[x.Fb+4>>>2>>>0]=m,s()[x.Fb+8>>>2>>>0]=y,d}function Du(d,m,y,x){return g?We(2,1,d,m,y,x):Bu(d,m,y,x)}function Bu(d,m,y,x){if(d>>>=0,m>>>=0,y>>>=0,x>>>=0,T===void 0)return F("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;var _=[];return g&&_.length===0?Du(d,m,y,x):(d={$b:y,xb:d,Mb:x,ec:_},g?(d.Ib="spawnThread",postMessage(d,_),0):Su(d))}var Lu=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0,Ru=(d,m,y)=>{var x=(m>>>=0)+y;for(y=m;d[y]&&!(y>=x);)++y;if(16(_=(240&_)==224?(15&_)<<12|O<<6|R:(7&_)<<18|O<<12|R<<6|63&d[m++])?x+=String.fromCharCode(_):(_-=65536,x+=String.fromCharCode(55296|_>>10,56320|1023&_))}}else x+=String.fromCharCode(_)}return x},ot=(d,m)=>(d>>>=0)?Ru(n(),d,m):"";function Nu(d,m,y){return g?We(3,1,d,m,y):0}function zu(d,m){if(g)return We(4,1,d,m)}var ia=d=>{for(var m=0,y=0;y=x?m++:2047>=x?m+=2:55296<=x&&57343>=x?(m+=4,++y):m+=3}return m},Fu=(d,m,y,x)=>{if(!(0>>=0;x=y+x-1;for(var O=0;O=R&&(R=65536+((1023&R)<<10)|1023&d.charCodeAt(++O)),127>=R){if(y>=x)break;m[y++>>>0]=R}else{if(2047>=R){if(y+1>=x)break;m[y++>>>0]=192|R>>6}else{if(65535>=R){if(y+2>=x)break;m[y++>>>0]=224|R>>12}else{if(y+3>=x)break;m[y++>>>0]=240|R>>18,m[y++>>>0]=128|R>>12&63}m[y++>>>0]=128|R>>6&63}m[y++>>>0]=128|63&R}}return m[y>>>0]=0,y-_},rn=(d,m,y)=>Fu(d,n(),m,y);function Mu(d,m){if(g)return We(5,1,d,m)}function Vu(d,m,y){if(g)return We(6,1,d,m,y)}function Gu(d,m,y){return g?We(7,1,d,m,y):0}function Uu(d,m){if(g)return We(8,1,d,m)}function Wu(d,m,y){if(g)return We(9,1,d,m,y)}function Hu(d,m,y,x){if(g)return We(10,1,d,m,y,x)}function qu(d,m,y,x){if(g)return We(11,1,d,m,y,x)}function Ku(d,m,y,x){if(g)return We(12,1,d,m,y,x)}function ju(d){if(g)return We(13,1,d)}function Xu(d,m){if(g)return We(14,1,d,m)}function Zu(d,m,y){if(g)return We(15,1,d,m,y)}var Yu,br,Vx=()=>{An("")},Xt=d=>{for(var m="";n()[d>>>0];)m+=Yu[n()[d++>>>0]];return m},aa={},sa={},Gx={};function lr(d,m,y={}){if(!("argPackAdvance"in m))throw new TypeError("registerType registeredInstance requires argPackAdvance");return function(x,_,O={}){var R=_.name;if(!x)throw new br(`type "${R}" must have a positive integer typeid pointer`);if(sa.hasOwnProperty(x)){if(O.Ob)return;throw new br(`Cannot register type '${R}' twice`)}sa[x]=_,delete Gx[x],aa.hasOwnProperty(x)&&(_=aa[x],delete aa[x],_.forEach(M=>M()))}(d,m,y)}var Ju=(d,m,y)=>{switch(m){case 1:return y?x=>e()[x>>>0]:x=>n()[x>>>0];case 2:return y?x=>t()[x>>>1>>>0]:x=>o()[x>>>1>>>0];case 4:return y?x=>i()[x>>>2>>>0]:x=>s()[x>>>2>>>0];case 8:return y?x=>V[x>>>3]:x=>ie[x>>>3];default:throw new TypeError(`invalid integer width (${m}): ${d}`)}};function Ux(d,m,y){y>>>=0,lr(d>>>=0,{name:m=Xt(m>>>0),fromWireType:x=>x,toWireType:function(x,_){if(typeof _!="bigint"&&typeof _!="number")throw _=_===null?"null":(x=typeof _)=="object"||x==="array"||x==="function"?_.toString():""+_,new TypeError(`Cannot convert "${_}" to ${this.name}`);return typeof _=="number"&&(_=BigInt(_)),_},argPackAdvance:yr,readValueFromPointer:Ju(m,y,m.indexOf("u")==-1),Ab:null})}var yr=8;function Wx(d,m,y,x){lr(d>>>=0,{name:m=Xt(m>>>0),fromWireType:function(_){return!!_},toWireType:function(_,O){return O?y:x},argPackAdvance:yr,readValueFromPointer:function(_){return this.fromWireType(n()[_>>>0])},Ab:null})}var ua=[],cr=[];function la(d){9<(d>>>=0)&&--cr[d+1]==0&&(cr[d]=void 0,ua.push(d))}var $t=d=>{if(!d)throw new br("Cannot use deleted val. handle = "+d);return cr[d]},At=d=>{switch(d){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:let m=ua.pop()||cr.length;return cr[m]=d,cr[m+1]=1,m}};function ca(d){return this.fromWireType(s()[d>>>2>>>0])}var Hx={name:"emscripten::val",fromWireType:d=>{var m=$t(d);return la(d),m},toWireType:(d,m)=>At(m),argPackAdvance:yr,readValueFromPointer:ca,Ab:null};function qx(d){return lr(d>>>0,Hx)}var Kx=(d,m)=>{switch(m){case 4:return function(y){return this.fromWireType(a()[y>>>2>>>0])};case 8:return function(y){return this.fromWireType(u()[y>>>3>>>0])};default:throw new TypeError(`invalid float width (${m}): ${d}`)}};function jx(d,m,y){y>>>=0,lr(d>>>=0,{name:m=Xt(m>>>0),fromWireType:x=>x,toWireType:(x,_)=>_,argPackAdvance:yr,readValueFromPointer:Kx(m,y),Ab:null})}function Xx(d,m,y,x,_){if(d>>>=0,y>>>=0,m=Xt(m>>>0),_===-1&&(_=4294967295),_=M=>M,x===0){var O=32-8*y;_=M=>M<>>O}var R=m.includes("unsigned")?function(M,j){return j>>>0}:function(M,j){return j};lr(d,{name:m,fromWireType:_,toWireType:R,argPackAdvance:yr,readValueFromPointer:Ju(m,y,x!==0),Ab:null})}function Zx(d,m,y){function x(O){var R=s()[O>>>2>>>0];return O=s()[O+4>>>2>>>0],new _(e().buffer,O,R)}var _=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][m];lr(d>>>=0,{name:y=Xt(y>>>0),fromWireType:x,argPackAdvance:yr,readValueFromPointer:x},{Ob:!0})}function Yx(d,m){d>>>=0;var y=(m=Xt(m>>>0))==="std::string";lr(d,{name:m,fromWireType:function(x){var _=s()[x>>>2>>>0],O=x+4;if(y)for(var R=O,M=0;M<=_;++M){var j=O+M;if(M==_||n()[j>>>0]==0){if(R=ot(R,j-R),Y===void 0)var Y=R;else Y+=String.fromCharCode(0),Y+=R;R=j+1}}else{for(Y=Array(_),M=0;M<_;++M)Y[M]=String.fromCharCode(n()[O+M>>>0]);Y=Y.join("")}return Yt(x),Y},toWireType:function(x,_){_ instanceof ArrayBuffer&&(_=new Uint8Array(_));var O=typeof _=="string";if(!(O||_ instanceof Uint8Array||_ instanceof Uint8ClampedArray||_ instanceof Int8Array))throw new br("Cannot pass non-string to std::string");var R=y&&O?ia(_):_.length,M=mo(4+R+1),j=M+4;if(s()[M>>>2>>>0]=R,y&&O)rn(_,j,R+1);else if(O)for(O=0;O>>0]=Y}else for(O=0;O>>0]=_[O];return x!==null&&x.push(Yt,M),M},argPackAdvance:yr,readValueFromPointer:ca,Ab(x){Yt(x)}})}var Qu=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,Jx=(d,m)=>{for(var y=d>>1,x=y+m/2;!(y>=x)&&o()[y>>>0];)++y;if(32<(y<<=1)-d&&Qu)return Qu.decode(n().slice(d,y));for(y="",x=0;!(x>=m/2);++x){var _=t()[d+2*x>>>1>>>0];if(_==0)break;y+=String.fromCharCode(_)}return y},Qx=(d,m,y)=>{if(y??=2147483647,2>y)return 0;var x=m;y=(y-=2)<2*d.length?y/2:d.length;for(var _=0;_>>1>>>0]=O,m+=2}return t()[m>>>1>>>0]=0,m-x},e0=d=>2*d.length,t0=(d,m)=>{for(var y=0,x="";!(y>=m/4);){var _=i()[d+4*y>>>2>>>0];if(_==0)break;++y,65536<=_?(_-=65536,x+=String.fromCharCode(55296|_>>10,56320|1023&_)):x+=String.fromCharCode(_)}return x},r0=(d,m,y)=>{if(m>>>=0,y??=2147483647,4>y)return 0;var x=m;y=x+y-4;for(var _=0;_=O&&(O=65536+((1023&O)<<10)|1023&d.charCodeAt(++_)),i()[m>>>2>>>0]=O,(m+=4)+4>y)break}return i()[m>>>2>>>0]=0,m-x},n0=d=>{for(var m=0,y=0;y=x&&++y,m+=4}return m};function o0(d,m,y){if(d>>>=0,m>>>=0,y=Xt(y>>>=0),m===2)var x=Jx,_=Qx,O=e0,R=M=>o()[M>>>1>>>0];else m===4&&(x=t0,_=r0,O=n0,R=M=>s()[M>>>2>>>0]);lr(d,{name:y,fromWireType:M=>{for(var j,Y=s()[M>>>2>>>0],ne=M+4,Ae=0;Ae<=Y;++Ae){var Ce=M+4+Ae*m;Ae!=Y&&R(Ce)!=0||(ne=x(ne,Ce-ne),j===void 0?j=ne:(j+=String.fromCharCode(0),j+=ne),ne=Ce+m)}return Yt(M),j},toWireType:(M,j)=>{if(typeof j!="string")throw new br(`Cannot pass non-string to C++ string type ${y}`);var Y=O(j),ne=mo(4+Y+m);return s()[ne>>>2>>>0]=Y/m,_(j,ne+4,Y+m),M!==null&&M.push(Yt,ne),ne},argPackAdvance:yr,readValueFromPointer:ca,Ab(M){Yt(M)}})}function i0(d,m){lr(d>>>=0,{Pb:!0,name:m=Xt(m>>>0),argPackAdvance:0,fromWireType:()=>{},toWireType:()=>{}})}var a0=()=>1;function s0(d){ya(d>>>0,!h,1,!b,131072,!1),Eu()}var el=d=>{if(!tt)try{if(d(),!(0>>=0,typeof Atomics.fc=="function"&&(Atomics.fc(i(),d>>>2,d).value.then(io),d+=128,Atomics.store(i(),d>>>2,1))}var io=()=>{var d=an();d&&(fa(d),el(El))};function u0(d,m){(d>>>=0)==m>>>0?setTimeout(io):g?postMessage({targetThread:d,cmd:"checkMailbox"}):(d=jt[d])&&d.postMessage({cmd:"checkMailbox"})}var da=[];function l0(d,m,y,x,_){for(m>>>=0,x/=2,da.length=x,y=_>>>0>>>3,_=0;_>>0];return(m?ta[m]:Y0[d])(...da)}function c0(d){d>>>=0,g?postMessage({cmd:"cleanupThread",thread:d}):Ou(jt[d])}function f0(d){}var pa=(d,m)=>{var y=sa[d];if(y===void 0)throw d=$l(d),y=Xt(d),Yt(d),new br(`${m} has unknown type ${y}`);return y},tl=(d,m,y)=>{var x=[];return d=d.toWireType(x,y),x.length&&(s()[m>>>2>>>0]=At(x)),d};function d0(d,m,y){return m>>>=0,y>>>=0,d=$t(d>>>0),m=pa(m,"emval::as"),tl(m,y,d)}var ao=d=>{try{d()}catch(m){An(m)}},xr=0,Zt=null,rl=0,so=[],nl={},ol={},p0=0,ma=null,m0=[];function il(d){return function(m){if(!tt){if(xr===0){var y=!1,x=!1;m((_=0)=>{if(!tt&&(rl=_,y=!0,x)){xr=2,ao(()=>Ll(Zt)),typeof Browser<"u"&&Browser.Gb.Nb&&Browser.Gb.resume(),_=!1;try{var O=function(){var j=i()[Zt+8>>>2>>>0];return j=te[ol[j]],--Er,j()}()}catch(j){O=j,_=!0}var R=!1;if(!Zt){var M=ma;M&&(ma=null,(_?M.reject:M.resolve)(O),R=!0)}if(_&&!R)throw O}}),x=!0,y||(xr=1,Zt=function(){var _=mo(65548),O=_+12;s()[_>>>2>>>0]=O,s()[_+4>>>2>>>0]=O+65536,O=so[0];var R=nl[O];return R===void 0&&(R=p0++,nl[O]=R,ol[R]=O),O=R,i()[_+8>>>2>>>0]=O,_}(),typeof Browser<"u"&&Browser.Gb.Nb&&Browser.Gb.pause(),ao(()=>Dl(Zt)))}else xr===2?(xr=0,ao(Rl),Yt(Zt),Zt=null,m0.forEach(el)):An(`invalid state: ${xr}`);return rl}}(m=>{d().then(m)})}function h0(d){return d>>>=0,il(()=>(d=$t(d)).then(At))}var uo=[];function g0(d,m,y,x){return y>>>=0,x>>>=0,(d=uo[d>>>0])(null,m=$t(m>>>0),y,x)}var b0={},lo=d=>{var m=b0[d];return m===void 0?Xt(d):m};function y0(d,m,y,x,_){return y>>>=0,x>>>=0,_>>>=0,(d=uo[d>>>0])(m=$t(m>>>0),m[y=lo(y)],x,_)}var al=()=>typeof globalThis=="object"?globalThis:Function("return this")();function x0(d){return(d>>>=0)==0?At(al()):(d=lo(d),At(al()[d]))}var v0=d=>{var m=uo.length;return uo.push(d),m},w0=(d,m)=>{for(var y=Array(d),x=0;x>>2>>>0],"parameter "+x);return y},sl=(d,m)=>Object.defineProperty(m,"name",{value:d});function T0(d,m,y){var x=(m=w0(d,m>>>0)).shift();d--;var _=`return function (obj, func, destructorsRef, args) { -`,O=0,R=[];y===0&&R.push("obj");for(var M=["retType"],j=[x],Y=0;Ythis.isTimerResultAvailable(e)),this.getTimerResult(e)}async createAndWaitForFence(){let e=this.createFence(this.gl);return this.pollFence(e)}createFence(e){let n,t=e,o=t.fenceSync(t.SYNC_GPU_COMMANDS_COMPLETE,0);return e.flush(),o===null?n=()=>!0:n=()=>{let i=t.clientWaitSync(o,0,0);return i===t.ALREADY_SIGNALED||i===t.CONDITION_SATISFIED},{query:o,isFencePassed:n}}async pollFence(e){return new Promise(n=>{this.addItemToPoll(()=>e.isFencePassed(),()=>n())})}pollItems(){let e=S_(this.itemsToPoll.map(n=>n.isDoneFn));for(let n=0;n<=e;++n){let{resolveFn:t}=this.itemsToPoll[n];t()}this.itemsToPoll=this.itemsToPoll.slice(e+1)}async addItemToPoll(e,n){this.itemsToPoll.push({isDoneFn:e,resolveFn:n}),!(this.itemsToPoll.length>1)&&await Za(()=>(this.pollItems(),this.itemsToPoll.length===0))}}});function $s(r){let e;if((!r||r==="webgl2")&&"webgl2"in wn?e=wn.webgl2:(!r||r==="webgl")&&"webgl"in wn&&(e=wn.webgl),!e)try{let t=A_();e=ah(t,r)}catch{let o=$_();e=ah(o,r)}r=r||e.version===1?"webgl":"webgl2";let n=e.gl;return wn[r]=e,n.isContextLost()?(delete wn[r],$s(r)):(n.disable(n.DEPTH_TEST),n.disable(n.STENCIL_TEST),n.disable(n.BLEND),n.disable(n.DITHER),n.disable(n.POLYGON_OFFSET_FILL),n.disable(n.SAMPLE_COVERAGE),n.enable(n.SCISSOR_TEST),n.enable(n.CULL_FACE),n.cullFace(n.BACK),e)}function ah(r,e){let n={alpha:!1,depth:!1,antialias:!1,stencil:!1,preserveDrawingBuffer:!1,premultipliedAlpha:!1,failIfMajorPerformanceCaveat:!1},t,o=n;if((!e||e==="webgl2")&&(t=r.getContext("webgl2",o),t))try{return new Un(t,2)}catch(i){Re.warning("GlContextFactory",`failed to create WebGLContext using contextId 'webgl2'. Error: ${i}`)}if((!e||e==="webgl")&&(t=r.getContext("webgl",o)||r.getContext("experimental-webgl",o),t))try{return new Un(t,1)}catch(i){Re.warning("GlContextFactory",`failed to create WebGLContext using contextId 'webgl' or 'experimental-webgl'. Error: ${i}`)}throw new Error("WebGL is not supported")}function $_(){if(typeof document>"u")throw new TypeError("failed to create canvas: document is not supported");let r=document.createElement("canvas");return r.width=1,r.height=1,r}function A_(){if(typeof OffscreenCanvas>"u")throw new TypeError("failed to create offscreen canvas: OffscreenCanvas is not supported");return new OffscreenCanvas(1,1)}var wn,sh=C(()=>{"use strict";Pt();ih();wn={}});var ui,uh=C(()=>{"use strict";ft();Pt();oh();sh();ui=class{get contextId(){return le.webgl.contextId}set contextId(e){le.webgl.contextId=e}get matmulMaxBatchSize(){return le.webgl.matmulMaxBatchSize}set matmulMaxBatchSize(e){le.webgl.matmulMaxBatchSize=e}get textureCacheMode(){return le.webgl.textureCacheMode}set textureCacheMode(e){le.webgl.textureCacheMode=e}get pack(){return le.webgl.pack}set pack(e){le.webgl.pack=e}get async(){return le.webgl.async}set async(e){le.webgl.async=e}initialize(){try{return this.glContext=$s(this.contextId),typeof this.matmulMaxBatchSize!="number"&&(this.matmulMaxBatchSize=16),typeof this.textureCacheMode!="string"&&(this.textureCacheMode="full"),typeof this.pack!="boolean"&&(this.pack=!1),typeof this.async!="boolean"&&(this.async=!1),Re.setWithEnv(le),le.webgl.context||Object.defineProperty(le.webgl,"context",{value:this.glContext.gl}),Re.verbose("WebGLBackend",`Created WebGLContext: ${typeof this.glContext} with matmulMaxBatchSize: ${this.matmulMaxBatchSize}; textureCacheMode: ${this.textureCacheMode}; pack: ${this.pack}; async: ${this.async}.`),!0}catch(e){return Re.warning("WebGLBackend",`Unable to initialize WebGLBackend. ${e}`),!1}}createSessionHandler(e){return new si(this,e)}dispose(){this.glContext.dispose()}}});async function As(r){if(r){let e=typeof r=="string"?[r]:r;for(let n of e){let t=lh.get(n);if(t)return t;let o=await O_(n);if(o)return o}}else return As(["webgl"]);throw new Error("no available backend to use")}async function O_(r){let e=P_;if(typeof e[r]<"u"&&E_(e[r])){let n=e[r],t=n.initialize();if(typeof t=="object"&&"then"in t&&(t=await t),t)return lh.set(r,n),n}}function E_(r){let e=r;return"initialize"in e&&typeof e.initialize=="function"&&"createSessionHandler"in e&&typeof e.createSessionHandler=="function"&&"dispose"in e&&typeof e.dispose=="function"}var lh,P_,ch=C(()=>{"use strict";uh();lh=new Map,P_={webgl:new ui}});var Ps,li,fh=C(()=>{"use strict";Pt();Ps=class{constructor(e,n){this.op=e;this.node=n}},li=class{constructor(e,n,t){this.graph=e;this.profiler=t;this.initialize(n)}initialize(e){this.profiler.event("session","ExecutionPlan.initialize",()=>{let n=this.graph.getNodes();if(n.length!==e.length)throw new Error("The size of nodes and OPs do not match.");this._ops=e.map((t,o)=>new Ps(t,n[o])),this.reset(),this._starter=[],this._ops.forEach((t,o)=>{let i=!0;for(let s of t.node.inputs)if(!this._values[s]&&this.graph.getInputIndices().indexOf(s)===-1){i=!1;break}i&&this._starter.push(o)})})}reset(){this._values=this.graph.getValues().map(e=>e.tensor)}async execute(e,n){return this.profiler.event("session","ExecutionPlan.execute",async()=>{this.reset();let t=e.createInferenceHandler(),o=this.graph.getInputIndices();if(n.length!==o.length)throw new Error(`number of input tensors don't match the number of inputs to the model: actual: ${n.length} expected: ${o.length}`);n.forEach((f,c)=>{let p=o[c];this._values[p]=f});let i=this._starter.slice(0),s=this.graph.getValues(),a=this.graph.getNodes(),u=0;for(;uthis._values[T]);if(p.indexOf(void 0)!==-1)throw new Error(`unresolved input detected: op: ${c.node}`);let b=p;Re.verbose("ExecPlan",`Running op:${c.node.name} (${b.map((T,w)=>`'${c.node.inputs[w]}': ${T.type}[${T.dims.join(",")}]`).join(", ")})`);let h=await this.profiler.event("node",c.node.name,async()=>c.op.impl(t,b,c.op.context));if(h.length!==c.node.outputs.length)throw new Error("the size of output does not match model definition.");h.forEach((T,w)=>{let v=c.node.outputs[w];if(this._values[v])throw new Error(`output [${v}] already has value: op:${c.node.name}`);this._values[v]=T});let g=new Set;h.forEach((T,w)=>{let v=c.node.outputs[w];for(let S of s[v].to){let $=a[S],P=!0;for(let E of $.inputs)if(!this._values[E]){P=!1;break}P&&g.add(S)}}),i.push(...g)}let l=[];for(let f=0;f{"use strict";Cn();we=ln(pn());Gr();De();Lt=ee.experimental.fbs,Wn=class r{constructor(e){if(this._attributes=new Map,e!=null){for(let n of e)n instanceof we.onnx.AttributeProto?this._attributes.set(n.name,[r.getValue(n),r.getType(n)]):n instanceof Lt.Attribute&&this._attributes.set(n.name(),[r.getValue(n),r.getType(n)]);if(this._attributes.sizeQe.fromProto(i));if(e instanceof Lt.Attribute)return t.map(i=>Qe.fromOrtTensor(i))}return n===we.onnx.AttributeProto.AttributeType.STRING&&e instanceof we.onnx.AttributeProto?Rn(t):n===we.onnx.AttributeProto.AttributeType.STRINGS&&e instanceof we.onnx.AttributeProto?t.map(Rn):t}static getValueNoCheck(e){return e instanceof we.onnx.AttributeProto?this.getValueNoCheckFromOnnxFormat(e):this.getValueNoCheckFromOrtFormat(e)}static getValueNoCheckFromOnnxFormat(e){switch(e.type){case we.onnx.AttributeProto.AttributeType.FLOAT:return e.f;case we.onnx.AttributeProto.AttributeType.INT:return e.i;case we.onnx.AttributeProto.AttributeType.STRING:return e.s;case we.onnx.AttributeProto.AttributeType.TENSOR:return e.t;case we.onnx.AttributeProto.AttributeType.GRAPH:return e.g;case we.onnx.AttributeProto.AttributeType.FLOATS:return e.floats;case we.onnx.AttributeProto.AttributeType.INTS:return e.ints;case we.onnx.AttributeProto.AttributeType.STRINGS:return e.strings;case we.onnx.AttributeProto.AttributeType.TENSORS:return e.tensors;case we.onnx.AttributeProto.AttributeType.GRAPHS:return e.graphs;default:throw new Error(`unsupported attribute type: ${we.onnx.AttributeProto.AttributeType[e.type]}`)}}static getValueNoCheckFromOrtFormat(e){switch(e.type()){case Lt.AttributeType.FLOAT:return e.f();case Lt.AttributeType.INT:return e.i();case Lt.AttributeType.STRING:return e.s();case Lt.AttributeType.TENSOR:return e.t();case Lt.AttributeType.GRAPH:return e.g();case Lt.AttributeType.FLOATS:return e.floatsArray();case Lt.AttributeType.INTS:{let n=[];for(let t=0;t{"use strict";dh();Cn();Es=ln(pn());Gr();De();ci=ee.experimental.fbs,Cs={from:(r,e)=>new Os(r,e)},rr=class{constructor(e){this._from=void 0,this._to=[],this.tensor=void 0,this.type=void 0,e&&(this.type=lt.tensorValueTypeFromProto(e.type.tensorType))}get from(){return this._from}get to(){return this._to}},fi=class{constructor(e,n){e instanceof Es.onnx.NodeProto?(this.name=e.name,this.opType=e.opType,this.attributes=new Wn(e.attribute)):e instanceof ci.Node&&(this.name=n??e.name(),this.opType=e.opType(),this.attributes=new Wn(lt.tensorAttributesFromORTFormat(e))),this.inputs=[],this.outputs=[],this.executeNode=!0}},Os=class{constructor(e,n){if(!e)throw new TypeError("graph is empty");this.buildGraph(e),this.transformGraph(n),this.checkIsAcyclic()}getInputIndices(){return this._allInputIndices}getInputNames(){return this._allInputNames}getOutputIndices(){return this._allOutputIndices}getOutputNames(){return this._allOutputNames}getValues(){return this._allData}getNodes(){return this._nodes}buildGraph(e){if(e instanceof Es.onnx.GraphProto)this.buildGraphFromOnnxFormat(e);else if(e instanceof ci.Graph)this.buildGraphFromOrtFormat(e);else throw new TypeError("Graph type is not supported.")}buildGraphFromOnnxFormat(e){let n=new Map;this._allData=[],this._allInputIndices=[],this._allInputNames=[],this._allOutputIndices=[],this._allOutputNames=[],this._nodes=[];let t=new Map;if(!e.input)throw new Error("missing information in graph: input");let o=[];for(let i of e.input){if(n.has(i.name))throw new Error(`duplicated input name: ${i.name}`);let s=this._allData.push(new rr(i))-1;n.set(i.name,s),o.push(i.name)}if(!e.initializer)throw new Error("missing information in graph: initializer");for(let i of e.initializer){let s=n.get(i.name);if(s===void 0){let a=new rr;a.type={shape:{dims:lt.tensorDimsFromProto(i.dims)},tensorType:lt.tensorDataTypeFromProto(i.dataType)},s=this._allData.push(a)-1,n.set(i.name,s)}this._allData[s]._from=-1,this._allData[s].tensor=Qe.fromProto(i)}for(let i=0;i"u"&&(l=this._allData.push(new rr)-1,n.set(u,l)),s.outputs.push(l),this._allData[l]._from!==void 0)throw new Error(`multiple nodes output to one data value: ${l}`);if(this._allData[l]._from=i,a.opType==="Constant"){if(!a.attribute||a.attribute.length!==1||!a.attribute[0].t)throw new Error("missing attributes or missing tensor value in attributes for this Constant operator");if(!a.output||a.output.length!==1)throw new Error("missing output or incorrect number of outputs for this Constant operator");s.outputs.pop(),s.executeNode=!1,this._allData[l]._from=-1,this._allData[l].tensor=Qe.fromProto(a.attribute[0].t)}}}for(let i=0;i"u"){if(u===""&&(a.input.length===3||a.input.length===4)&&a.opType==="Resize")continue;throw new Error(`unrecognized input '${u}' for node: ${a.name}`)}s.inputs.push(l),this._allData[l]._to.push(i)}}return!0}buildGraphFromOrtFormat(e){let n=new Map;this._allData=[],this._allInputIndices=[],this._allInputNames=[],this._allOutputIndices=[],this._allOutputNames=[],this._nodes=[];let t=new Map,o=[];for(let i=0;i"u"&&(f=this._allData.push(new rr)-1,n.set(l,f)),s.outputs.push(f),this._allData[f]._from!==void 0)throw new Error(`multiple nodes output to one data value: ${f}`);if(this._allData[f]._from=i,a.opType()==="Constant"){if(a.attributesLength()!==1||!a.attributes(0).t())throw new Error("missing attributes or missing tensor value in attributes for this Constant operator");if(a.outputsLength()!==1)throw new Error("missing output or incorrect number of outputs for this Constant operator");s.outputs.pop(),s.executeNode=!1,this._allData[f]._from=-1,this._allData[f].tensor=Qe.fromOrtTensor(a.attributes(0).t())}}}for(let i=0;i"u")throw new Error(`unrecognized input '${l}' for node: ${a.name()}`);s.inputs.push(f),this._allData[f]._to.push(i)}}}checkIsAcyclic(){let e=new Set;this._allInputIndices.forEach(o=>{this._allData[o]._to.forEach(s=>{e.add(s)})});let n=Array.from(e),t=new Array(this._nodes.length).fill("white");for(;n.length>0;){let o=n.pop();t[o]==="gray"?t[o]="black":(n.push(o),t[o]="gray",this._nodes[o].outputs.forEach(i=>{let s=this._allData[i];if(typeof s.tensor<"u")throw new Error("node outputs should not be initialized");if(s._from!==o)throw new Error("from property of the Value object doesn't match index of Node being processed");s._to.forEach(a=>{if(t[a]==="gray")throw new Error("model graph is cyclic");t[a]==="white"&&n.push(a)})}))}}transformGraph(e){this.removeAllIdentityNodes(),this.removeAllDropoutNodes(),this.fuseConvActivationNodes(),e&&e.transformGraph(this),this.finalizeGraph()}finalizeGraph(){let e=0,n=new Array(this._nodes.length,0),t=0;for(let o=0;o{this._allData[i]._from=-2});this._nodes.splice(t,this._nodes.length-t);for(let o=0;o=0)i._to[s]=n[i._to[s]];else throw new Error("Trying to update a removed node")}e=0;for(let o=0;o0){let i=-1;this._allData[o].from!==void 0&&this._allData[o].from!==-1?(i=this._nodes[this._allData[o].from].outputs.indexOf(o+e),i!==-1&&(this._nodes[this._allData[o].from].outputs[i]=o)):(i=this._allInputIndices.indexOf(o+e),i!==-1&&(this._allInputIndices[i]=o)),this._allData[o].to.forEach(s=>{i=this._nodes[s].inputs.indexOf(o+e),i!==-1&&(this._nodes[s].inputs[i]=o)}),this._allData[o].to.length===0&&(i=this._allOutputIndices.indexOf(o+e),i!==-1&&(this._allOutputIndices[i]=o))}}}deleteNode(e){let n=this._nodes[e];if(n.outputs.length>1){for(let a=1;a0)throw new Error("Node deletion with more than one output connected to other nodes is not supported. ")}n.executeNode=!1;let t=n.inputs[0],o=n.outputs[0],i=this._allData[o].to;for(let a=0;a0)for(let a of i){let u=this._nodes[a].inputs.indexOf(o);if(u===-1)throw new Error("The Node object doesn't have the output Value in it's 'inputs' property ");this._nodes[a].inputs[u]=t,this._allData[t].to.push(a)}}removeAllDropoutNodes(){let e=0;for(let n of this._nodes){if(n.opType==="Dropout"){if(n.inputs.length!==1)throw new Error("Dropout nodes should only contain one input. ");if(n.outputs.length!==1&&n.outputs.length!==2)throw new Error("Dropout nodes should contain either 1 or 2 output(s)");if(n.outputs.length===2&&this._allData[n.outputs[1]]._to.length!==0)throw new Error("Dropout nodes's second output should not be referenced by other nodes");this.deleteNode(e)}e++}}removeAllIdentityNodes(){let e=0;for(let n of this._nodes)n.opType==="Identity"&&this.deleteNode(e),e++}isActivation(e){switch(e.opType){case"Relu":case"Sigmoid":case"Clip":return!0;default:return!1}}fuseConvActivationNodes(){for(let e of this._nodes)if(e.opType==="Conv"){let n=this._allData[e.outputs[0]]._to;if(n.length===1&&this.isActivation(this._nodes[n[0]])){let t=this._nodes[n[0]];if(t.opType==="Clip")if(t.inputs.length===1)try{e.attributes.set("activation_params","floats",[t.attributes.getFloat("min"),t.attributes.getFloat("max")])}catch{e.attributes.set("activation_params","floats",[Mr,Vr])}else if(t.inputs.length>=3&&this._allData[t.inputs[1]].tensor!==void 0&&this._allData[t.inputs[2]].tensor!==void 0)e.attributes.set("activation_params","floats",[this._allData[t.inputs[1]].tensor.floatData[0],this._allData[t.inputs[2]].tensor.floatData[0]]);else continue;e.attributes.set("activation","string",t.opType),this.deleteNode(n[0])}}}}});var mh,C_,di,hh=C(()=>{"use strict";ko();ph();Cn();mh=ln(pn());De();C_=ee.experimental.fbs,di=class{constructor(){}load(e,n,t){let o;if(!t)try{this.loadFromOnnxFormat(e,n);return}catch(i){if(t!==void 0)throw i;o=i}try{this.loadFromOrtFormat(e,n)}catch(i){throw t!==void 0?i:new Error(`Failed to load model as ONNX format: ${o} +as ORT format: ${i}`)}}loadFromOnnxFormat(e,n){let t=mh.onnx.ModelProto.decode(e);if(wt.longToNumber(t.irVersion)<3)throw new Error("only support ONNX model with IR_VERSION>=3");this._opsets=t.opsetImport.map(i=>({domain:i.domain,version:wt.longToNumber(i.version)})),this._graph=Cs.from(t.graph,n)}loadFromOrtFormat(e,n){let t=new k.ByteBuffer(e),o=C_.InferenceSession.getRootAsInferenceSession(t).model();if(wt.longToNumber(o.irVersion())<3)throw new Error("only support ONNX model with IR_VERSION>=3");this._opsets=[];for(let s=0;s{"use strict";ch();fh();Pt();hh();pi=class{constructor(e={}){this._initialized=!1,this.backendHint=e.backendHint,this.profiler=Eo.create(e.profiler),this.context={profiler:this.profiler,graphInputTypes:[],graphInputDims:[]}}get inputNames(){return this._model.graph.getInputNames()}get outputNames(){return this._model.graph.getOutputNames()}startProfiling(){this.profiler.start()}endProfiling(){this.profiler.stop()}async loadModel(e,n,t){await this.profiler.event("session","Session.loadModel",async()=>{let o=await As(this.backendHint);if(this.sessionHandler=o.createSessionHandler(this.context),this._model=new di,typeof e=="string"){let i=e.endsWith(".ort");{let a=await(await fetch(e)).arrayBuffer();this.initialize(new Uint8Array(a),i)}}else if(ArrayBuffer.isView(e))this.initialize(e);else{let i=new Uint8Array(e,n||0,t||e.byteLength);this.initialize(i)}})}initialize(e,n){if(this._initialized)throw new Error("already initialized");this.profiler.event("session","Session.initialize",()=>{let t=this.sessionHandler.transformGraph?this.sessionHandler:void 0;this._model.load(e,t,n),this.sessionHandler.onGraphInitialized&&this.sessionHandler.onGraphInitialized(this._model.graph),this.initializeOps(this._model.graph),this._executionPlan=new li(this._model.graph,this._ops,this.profiler)}),this._initialized=!0}async run(e){if(!this._initialized)throw new Error("session not initialized yet");return this.profiler.event("session","Session.run",async()=>{let n=this.normalizeAndValidateInputs(e),t=await this._executionPlan.execute(this.sessionHandler,n);return this.createOutput(t)})}normalizeAndValidateInputs(e){let n=this._model.graph.getInputNames();if(Array.isArray(e)){if(e.length!==n.length)throw new Error(`incorrect input array length: expected ${n.length} but got ${e.length}`)}else{if(e.size!==n.length)throw new Error(`incorrect input map size: expected ${n.length} but got ${e.size}`);let t=new Array(e.size),o=0;for(let i=0;i{"use strict";ft();Gr();mi=class{constructor(e){this.session=e;this.inputNames=this.session.inputNames,this.outputNames=this.session.outputNames}async dispose(){}async run(e,n,t){let o=new Map;for(let a in e)if(Object.hasOwnProperty.call(e,a)){let u=e[a];o.set(a,new Qe(u.dims,u.type,void 0,void 0,u.data))}let i=await this.session.run(o),s={};return i.forEach((a,u)=>{s[u]=new it(a.type,a.data,a.dims)}),s}startProfiling(){this.session.startProfiling()}endProfiling(){this.session.endProfiling()}}});var yh={};un(yh,{onnxjsBackend:()=>k_});var ks,k_,xh=C(()=>{"use strict";gh();bh();ks=class{async init(){}async createInferenceSessionHandler(e,n){let t=new pi(n);return typeof e=="string"?await t.loadModel(e):await t.loadModel(e),new mi(t)}},k_=new ks});var hi=C(()=>{"use strict"});var Th={};un(Th,{default:()=>D_});var vh,wh,D_,_h=C(()=>{"use strict";Ds();jr();Hn();vh="ort-wasm-proxy-worker",wh=globalThis.self?.name===vh;wh&&(self.onmessage=r=>{let{type:e,in:n}=r.data;try{switch(e){case"init-wasm":gi(n.wasm).then(()=>{bi(n).then(()=>{postMessage({type:e})},t=>{postMessage({type:e,err:t})})},t=>{postMessage({type:e,err:t})});break;case"init-ep":{let{epName:t,env:o}=n;yi(o,t).then(()=>{postMessage({type:e})},i=>{postMessage({type:e,err:i})});break}case"copy-from":{let{buffer:t}=n,o=qn(t);postMessage({type:e,out:o});break}case"create":{let{model:t,options:o}=n;xi(t,o).then(i=>{postMessage({type:e,out:i})},i=>{postMessage({type:e,err:i})});break}case"release":vi(n),postMessage({type:e});break;case"run":{let{sessionId:t,inputIndices:o,inputs:i,outputIndices:s,options:a}=n;wi(t,o,i,s,new Array(s.length).fill(null),a).then(u=>{u.some(l=>l[3]!=="cpu")?postMessage({type:e,err:"Proxy does not support non-cpu tensor location."}):postMessage({type:e,out:u},_i([...i,...u]))},u=>{postMessage({type:e,err:u})});break}case"end-profiling":Ti(n),postMessage({type:e});break;default:}}catch(t){postMessage({type:e,err:t})}});D_=wh?null:r=>new Worker(r??Tn,{type:"module",name:vh})});var Sh={};un(Sh,{default:()=>B_});var Bs,Ih,B_,$h=C(()=>{"use strict";Ih=(Bs=import.meta.url,async function(r={}){function e(){return ae.buffer!=ge.buffer&&Fe(),ge}function n(){return ae.buffer!=ge.buffer&&Fe(),Ie}function t(){return ae.buffer!=ge.buffer&&Fe(),xe}function o(){return ae.buffer!=ge.buffer&&Fe(),se}function i(){return ae.buffer!=ge.buffer&&Fe(),pe}function s(){return ae.buffer!=ge.buffer&&Fe(),ce}function a(){return ae.buffer!=ge.buffer&&Fe(),ut}function u(){return ae.buffer!=ge.buffer&&Fe(),Te}var l,f,c=Object.assign({},r),p=new Promise((d,m)=>{l=d,f=m}),b=typeof window=="object",h=typeof importScripts=="function",g=h&&self.name=="em-pthread";c.mountExternalData=(d,m)=>{(c.Fb||(c.Fb=new Map)).set(d,m)},c.unmountExternalData=()=>{delete c.Fb};var T=globalThis.SharedArrayBuffer??new WebAssembly.Memory({initial:0,maximum:0,shared:!0}).buffer.constructor;let w=()=>{let d=(y,x,_)=>(...O)=>{let R=Zt,M=x?.();O=y(...O);let K=x?.();return M!==K&&(y=K,_(M),x=_=null),Zt!=R?new Promise((Y,ne)=>{ha={resolve:Y,reject:ne}}):O},m=y=>async(...x)=>{try{if(c.Eb)throw Error("Session already started");let _=c.Eb={bc:x[0],errors:[]},O=await y(...x);if(c.Eb!==_)throw Error("Session mismatch");c.Mb?.flush();let R=_.errors;if(0K),0c._OrtCreateSession,y=>c._OrtCreateSession=y),c._OrtRun=m(d(c._OrtRun,()=>c._OrtRun,y=>c._OrtRun=y)),c._OrtRunWithBinding=m(d(c._OrtRunWithBinding,()=>c._OrtRunWithBinding,y=>c._OrtRunWithBinding=y)),c._OrtBindInput=d(c._OrtBindInput,()=>c._OrtBindInput,y=>c._OrtBindInput=y),w=void 0};c.jsepInit=(d,m)=>{if(w?.(),d==="webgpu"){[c.Mb,c.Tb,c.Xb,c.Nb,c.Wb,c.jb,c.Yb,c.$b,c.Ub,c.Vb,c.Zb]=m;let y=c.Mb;c.jsepRegisterBuffer=(x,_,O,R)=>y.registerBuffer(x,_,O,R),c.jsepGetBuffer=x=>y.getBuffer(x),c.jsepCreateDownloader=(x,_,O)=>y.createDownloader(x,_,O),c.jsepOnReleaseSession=x=>{y.onReleaseSession(x)},c.jsepOnRunStart=x=>y.onRunStart(x)}};var v,S,$=Object.assign({},c),P="./this.program",E=(d,m)=>{throw m},N="";(b||h)&&(h?N=self.location.href:typeof document<"u"&&document.currentScript&&(N=document.currentScript.src),Bs&&(N=Bs),N=N.startsWith("blob:")?"":N.substr(0,N.replace(/[?#].*/,"").lastIndexOf("/")+1),h&&(S=d=>{var m=new XMLHttpRequest;return m.open("GET",d,!1),m.responseType="arraybuffer",m.send(null),new Uint8Array(m.response)}),v=(d,m,y)=>{var x=new XMLHttpRequest;x.open("GET",d,!0),x.responseType="arraybuffer",x.onload=()=>{x.status==200||x.status==0&&x.response?m(x.response):y()},x.onerror=y,x.send(null)});var z=console.log.bind(console),q=console.error.bind(console),j=z,F=q;if(Object.assign(c,$),$=null,g){let d=function(m){try{var y=m.data,x=y.cmd;if(x==="load"){let _=[];self.onmessage=O=>_.push(O),self.startWorker=()=>{postMessage({cmd:"loaded"});for(let O of _)d(O);self.onmessage=d};for(let O of y.handlers)c[O]&&!c[O].proxy||(c[O]=(...R)=>{postMessage({Lb:"callHandler",kc:O,args:R})},O=="print"&&(j=c[O]),O=="printErr"&&(F=c[O]));ae=y.wasmMemory,Fe(),_e(y.wasmModule)}else if(x==="run"){xa(y.pthread_ptr,0,0,1,0,0),da(y.pthread_ptr),zx(),Eu(),$e||(Al(),$e=!0);try{Fx(y.start_routine,y.arg)}catch(_){if(_!="unwind")throw _}}else x==="cancel"?sn()&&ho(-1):y.target!=="setimmediate"&&(x==="checkMailbox"?$e&&io():x&&(F(`worker: received unknown command ${x}`),F(y)))}catch(_){throw Pl(),_}};var HI=d,_e,$e=!1;F=function(...m){m=m.join(" "),console.error(m)},self.alert=function(...m){postMessage({Lb:"alert",text:m.join(" "),mc:sn()})},c.instantiateWasm=(m,y)=>new Promise(x=>{_e=_=>{_=new WebAssembly.Instance(_,Su()),y(_),x()}}),self.onunhandledrejection=m=>{throw m.reason||m},self.onmessage=d}var ae,qe,Q,ge,Ie,xe,se,pe,ce,ut,V,ie,Te,tt=!1;function Fe(){var d=ae.buffer;c.HEAP8=ge=new Int8Array(d),c.HEAP16=xe=new Int16Array(d),c.HEAPU8=Ie=new Uint8Array(d),c.HEAPU16=se=new Uint16Array(d),c.HEAP32=pe=new Int32Array(d),c.HEAPU32=ce=new Uint32Array(d),c.HEAPF32=ut=new Float32Array(d),c.HEAPF64=Te=new Float64Array(d),c.HEAP64=V=new BigInt64Array(d),c.HEAPU64=ie=new BigUint64Array(d)}if(!g){if(c.wasmMemory)ae=c.wasmMemory;else if(!((ae=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0})).buffer instanceof T))throw F("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),Error("bad memory");Fe()}var je=[],tn=[],mt=[],rt=0,jt=null,hr=null;function no(){if(--rt==0&&(jt!==null&&(clearInterval(jt),jt=null),hr)){var d=hr;hr=null,d()}}function rn(d){throw F(d="Aborted("+d+")"),tt=!0,Q=1,d=new WebAssembly.RuntimeError(d+". Build with -sASSERTIONS for more info."),f(d),d}var vu,wu=d=>d.startsWith("data:application/octet-stream;base64,"),Tu=d=>d.startsWith("file://");function _u(d){if(S)return S(d);throw"both async and sync fetching of the wasm failed"}function Iu(d,m,y){return function(x){if(b||h){if(typeof fetch=="function"&&!Tu(x))return fetch(x,{credentials:"same-origin"}).then(_=>{if(!_.ok)throw`failed to load wasm binary file at '${x}'`;return _.arrayBuffer()}).catch(()=>_u(x));if(v)return new Promise((_,O)=>{v(x,R=>_(new Uint8Array(R)),O)})}return Promise.resolve().then(()=>_u(x))}(d).then(x=>WebAssembly.instantiate(x,m)).then(y,x=>{F(`failed to asynchronously prepare wasm: ${x}`),rn(x)})}function Su(){return{a:{M:Nx,za:Rx,b:Vx,$:Bu,z:Nu,pa:zu,X:Mu,Z:Vu,qa:Gu,na:Uu,ga:Wu,ma:Hu,J:qu,Y:ju,V:Ku,oa:Xu,W:Zu,va:Gx,D:Wx,P:Hx,O:jx,C:Xx,s:Zx,p:Yx,E:Jx,y:i0,Q:a0,ta:s0,ja:u0,T:l0,aa:c0,F:f0,ia:da,sa:d0,u:p0,B:g0,o:b0,k:x0,c:ca,n:v0,j:_0,Aa:I0,r:S0,d:$0,v:A0,m:P0,g:O0,l:E0,i:C0,h:k0,e:D0,da:B0,ea:L0,fa:R0,ba:cl,ca:fl,S:N0,f:z0,N:F0,G:M0,K:V0,w:G0,ra:U0,U:W0,t:pl,x:H0,L:q0,R:j0,ya:K0,xa:X0,ka:gl,la:bl,_:ia,A:yl,I:xl,ha:vl,H:wl,a:ae,wa:oa,ua:Il,q:J0}}}var ta={1337716:(d,m,y,x)=>{if(c===void 0||!c.Fb)return 1;if((d=ot(d>>>0)).startsWith("./")&&(d=d.substring(2)),!(d=c.Fb.get(d)))return 2;if(x>>>=0,(m>>>=0)+(y>>>=0)>d.byteLength)return 3;try{return n().set(d.subarray(m,m+y),x>>>0),0}catch{return 4}},1338217:()=>{c.Ub()},1338248:()=>{c.Vb()},1338277:()=>{c.Zb()},1338302:d=>c.Tb(d),1338335:d=>c.Xb(d),1338367:(d,m,y)=>{c.Nb(d,m,y,!0)},1338406:(d,m,y)=>{c.Nb(d,m,y)},1338439:()=>typeof wasmOffsetConverter<"u",1338496:d=>{c.jb("Abs",d,void 0)},1338547:d=>{c.jb("Neg",d,void 0)},1338598:d=>{c.jb("Floor",d,void 0)},1338651:d=>{c.jb("Ceil",d,void 0)},1338703:d=>{c.jb("Reciprocal",d,void 0)},1338761:d=>{c.jb("Sqrt",d,void 0)},1338813:d=>{c.jb("Exp",d,void 0)},1338864:d=>{c.jb("Erf",d,void 0)},1338915:d=>{c.jb("Sigmoid",d,void 0)},1338970:(d,m,y)=>{c.jb("HardSigmoid",d,{alpha:m,beta:y})},1339049:d=>{c.jb("Log",d,void 0)},1339100:d=>{c.jb("Sin",d,void 0)},1339151:d=>{c.jb("Cos",d,void 0)},1339202:d=>{c.jb("Tan",d,void 0)},1339253:d=>{c.jb("Asin",d,void 0)},1339305:d=>{c.jb("Acos",d,void 0)},1339357:d=>{c.jb("Atan",d,void 0)},1339409:d=>{c.jb("Sinh",d,void 0)},1339461:d=>{c.jb("Cosh",d,void 0)},1339513:d=>{c.jb("Asinh",d,void 0)},1339566:d=>{c.jb("Acosh",d,void 0)},1339619:d=>{c.jb("Atanh",d,void 0)},1339672:d=>{c.jb("Tanh",d,void 0)},1339724:d=>{c.jb("Not",d,void 0)},1339775:(d,m,y)=>{c.jb("Clip",d,{min:m,max:y})},1339844:d=>{c.jb("Clip",d,void 0)},1339896:(d,m)=>{c.jb("Elu",d,{alpha:m})},1339954:d=>{c.jb("Relu",d,void 0)},1340006:(d,m)=>{c.jb("LeakyRelu",d,{alpha:m})},1340070:(d,m)=>{c.jb("ThresholdedRelu",d,{alpha:m})},1340140:(d,m)=>{c.jb("Cast",d,{to:m})},1340198:d=>{c.jb("Add",d,void 0)},1340249:d=>{c.jb("Sub",d,void 0)},1340300:d=>{c.jb("Mul",d,void 0)},1340351:d=>{c.jb("Div",d,void 0)},1340402:d=>{c.jb("Pow",d,void 0)},1340453:d=>{c.jb("Equal",d,void 0)},1340506:d=>{c.jb("Greater",d,void 0)},1340561:d=>{c.jb("GreaterOrEqual",d,void 0)},1340623:d=>{c.jb("Less",d,void 0)},1340675:d=>{c.jb("LessOrEqual",d,void 0)},1340734:(d,m,y,x,_)=>{c.jb("ReduceMean",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1340893:(d,m,y,x,_)=>{c.jb("ReduceMax",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1341051:(d,m,y,x,_)=>{c.jb("ReduceMin",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1341209:(d,m,y,x,_)=>{c.jb("ReduceProd",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1341368:(d,m,y,x,_)=>{c.jb("ReduceSum",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1341526:(d,m,y,x,_)=>{c.jb("ReduceL1",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1341683:(d,m,y,x,_)=>{c.jb("ReduceL2",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1341840:(d,m,y,x,_)=>{c.jb("ReduceLogSum",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1342001:(d,m,y,x,_)=>{c.jb("ReduceSumSquare",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1342165:(d,m,y,x,_)=>{c.jb("ReduceLogSumExp",d,{keepDims:!!m,noopWithEmptyAxes:!!y,axes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1342329:d=>{c.jb("Where",d,void 0)},1342382:(d,m,y)=>{c.jb("Transpose",d,{perm:m?Array.from(i().subarray(m>>>0,y>>>0)):[]})},1342490:(d,m,y,x)=>{c.jb("DepthToSpace",d,{blocksize:m,mode:ot(y),format:x?"NHWC":"NCHW"})},1342623:(d,m,y,x)=>{c.jb("DepthToSpace",d,{blocksize:m,mode:ot(y),format:x?"NHWC":"NCHW"})},1342756:(d,m,y,x,_,O,R,M,K,Y,ne,Ae,Ce,L,fe)=>{c.jb("ConvTranspose",d,{format:K?"NHWC":"NCHW",autoPad:m,dilations:[y],group:x,kernelShape:[_],pads:[O,R],strides:[M],wIsConst:()=>!!e()[Y>>>0],outputPadding:ne?Array.from(i().subarray(ne>>>0,Ae>>>0)):[],outputShape:Ce?Array.from(i().subarray(Ce>>>0,L>>>0)):[],activation:ot(fe)})},1343157:(d,m,y,x,_,O,R,M,K,Y,ne,Ae,Ce,L)=>{c.jb("ConvTranspose",d,{format:M?"NHWC":"NCHW",autoPad:m,dilations:Array.from(i().subarray(y>>>0,2+(y>>>0)>>>0)),group:x,kernelShape:Array.from(i().subarray(_>>>0,2+(_>>>0)>>>0)),pads:Array.from(i().subarray(O>>>0,4+(O>>>0)>>>0)),strides:Array.from(i().subarray(R>>>0,2+(R>>>0)>>>0)),wIsConst:()=>!!e()[K>>>0],outputPadding:Y?Array.from(i().subarray(Y>>>0,ne>>>0)):[],outputShape:Ae?Array.from(i().subarray(Ae>>>0,Ce>>>0)):[],activation:ot(L)})},1343722:(d,m,y,x,_,O,R,M,K,Y,ne,Ae,Ce,L,fe)=>{c.jb("ConvTranspose",d,{format:K?"NHWC":"NCHW",autoPad:m,dilations:[y],group:x,kernelShape:[_],pads:[O,R],strides:[M],wIsConst:()=>!!e()[Y>>>0],outputPadding:ne?Array.from(i().subarray(ne>>>0,Ae>>>0)):[],outputShape:Ce?Array.from(i().subarray(Ce>>>0,L>>>0)):[],activation:ot(fe)})},1344123:(d,m,y,x,_,O,R,M,K,Y,ne,Ae,Ce,L)=>{c.jb("ConvTranspose",d,{format:M?"NHWC":"NCHW",autoPad:m,dilations:Array.from(i().subarray(y>>>0,2+(y>>>0)>>>0)),group:x,kernelShape:Array.from(i().subarray(_>>>0,2+(_>>>0)>>>0)),pads:Array.from(i().subarray(O>>>0,4+(O>>>0)>>>0)),strides:Array.from(i().subarray(R>>>0,2+(R>>>0)>>>0)),wIsConst:()=>!!e()[K>>>0],outputPadding:Y?Array.from(i().subarray(Y>>>0,ne>>>0)):[],outputShape:Ae?Array.from(i().subarray(Ae>>>0,Ce>>>0)):[],activation:ot(L)})},1344688:(d,m)=>{c.jb("GlobalAveragePool",d,{format:m?"NHWC":"NCHW"})},1344779:(d,m,y,x,_,O,R,M,K,Y,ne,Ae,Ce,L,fe,Le)=>{c.jb("AveragePool",d,{format:Le?"NHWC":"NCHW",auto_pad:m,ceil_mode:y,count_include_pad:x,storage_order:_,dilations:[O,R],kernel_shape:[M,K],pads:[Y,ne,Ae,Ce],strides:[L,fe]})},1345063:(d,m)=>{c.jb("GlobalAveragePool",d,{format:m?"NHWC":"NCHW"})},1345154:(d,m,y,x,_,O,R,M,K,Y,ne,Ae,Ce,L,fe,Le)=>{c.jb("AveragePool",d,{format:Le?"NHWC":"NCHW",auto_pad:m,ceil_mode:y,count_include_pad:x,storage_order:_,dilations:[O,R],kernel_shape:[M,K],pads:[Y,ne,Ae,Ce],strides:[L,fe]})},1345438:(d,m)=>{c.jb("GlobalMaxPool",d,{format:m?"NHWC":"NCHW"})},1345525:(d,m,y,x,_,O,R,M,K,Y,ne,Ae,Ce,L,fe,Le)=>{c.jb("MaxPool",d,{format:Le?"NHWC":"NCHW",auto_pad:m,ceil_mode:y,count_include_pad:x,storage_order:_,dilations:[O,R],kernel_shape:[M,K],pads:[Y,ne,Ae,Ce],strides:[L,fe]})},1345805:(d,m)=>{c.jb("GlobalMaxPool",d,{format:m?"NHWC":"NCHW"})},1345892:(d,m,y,x,_,O,R,M,K,Y,ne,Ae,Ce,L,fe,Le)=>{c.jb("MaxPool",d,{format:Le?"NHWC":"NCHW",auto_pad:m,ceil_mode:y,count_include_pad:x,storage_order:_,dilations:[O,R],kernel_shape:[M,K],pads:[Y,ne,Ae,Ce],strides:[L,fe]})},1346172:(d,m,y,x,_)=>{c.jb("Gemm",d,{alpha:m,beta:y,transA:x,transB:_})},1346276:d=>{c.jb("MatMul",d,void 0)},1346330:(d,m,y,x)=>{c.jb("ArgMax",d,{keepDims:!!m,selectLastIndex:!!y,axis:x})},1346438:(d,m,y,x)=>{c.jb("ArgMin",d,{keepDims:!!m,selectLastIndex:!!y,axis:x})},1346546:(d,m)=>{c.jb("Softmax",d,{axis:m})},1346609:(d,m)=>{c.jb("Concat",d,{axis:m})},1346669:(d,m,y,x,_)=>{c.jb("Split",d,{axis:m,numOutputs:y,splitSizes:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1346809:d=>{c.jb("Expand",d,void 0)},1346863:(d,m)=>{c.jb("Gather",d,{axis:Number(m)})},1346934:(d,m)=>{c.jb("GatherElements",d,{axis:Number(m)})},1347013:(d,m,y,x,_,O,R,M,K,Y,ne)=>{c.jb("Resize",d,{antialias:m,axes:y?Array.from(i().subarray(y>>>0,x>>>0)):[],coordinateTransformMode:ot(_),cubicCoeffA:O,excludeOutside:R,extrapolationValue:M,keepAspectRatioPolicy:ot(K),mode:ot(Y),nearestMode:ot(ne)})},1347359:(d,m,y,x,_,O,R)=>{c.jb("Slice",d,{starts:m?Array.from(i().subarray(m>>>0,y>>>0)):[],ends:x?Array.from(i().subarray(x>>>0,_>>>0)):[],axes:O?Array.from(i().subarray(O>>>0,R>>>0)):[]})},1347575:d=>{c.jb("Tile",d,void 0)},1347627:(d,m,y)=>{c.jb("InstanceNormalization",d,{epsilon:m,format:y?"NHWC":"NCHW"})},1347741:(d,m,y)=>{c.jb("InstanceNormalization",d,{epsilon:m,format:y?"NHWC":"NCHW"})},1347855:d=>{c.jb("Range",d,void 0)},1347908:(d,m)=>{c.jb("Einsum",d,{equation:ot(m)})},1347989:(d,m,y,x,_)=>{c.jb("Pad",d,{mode:m,value:y,pads:x?Array.from(i().subarray(x>>>0,_>>>0)):[]})},1348116:(d,m,y,x,_,O)=>{c.jb("BatchNormalization",d,{epsilon:m,momentum:y,spatial:!!_,trainingMode:!!x,format:O?"NHWC":"NCHW"})},1348285:(d,m,y,x,_,O)=>{c.jb("BatchNormalization",d,{epsilon:m,momentum:y,spatial:!!_,trainingMode:!!x,format:O?"NHWC":"NCHW"})},1348454:(d,m,y)=>{c.jb("CumSum",d,{exclusive:Number(m),reverse:Number(y)})},1348551:(d,m,y,x,_,O,R,M,K)=>{c.jb("Attention",d,{numHeads:m,isUnidirectional:y,maskFilterValue:x,scale:_,doRotary:O,qkvHiddenSizes:R?Array.from(i().subarray(Number(M)>>>0,Number(M)+R>>>0)):[],pastPresentShareBuffer:!!K})},1348823:d=>{c.jb("BiasAdd",d,void 0)},1348878:d=>{c.jb("BiasSplitGelu",d,void 0)},1348939:d=>{c.jb("FastGelu",d,void 0)},1348995:(d,m,y,x,_,O,R,M,K,Y,ne,Ae,Ce,L,fe,Le)=>{c.jb("Conv",d,{format:Ae?"NHWC":"NCHW",auto_pad:m,dilations:y?Array.from(i().subarray(y>>>0,x>>>0)):[],group:_,kernel_shape:O?Array.from(i().subarray(O>>>0,R>>>0)):[],pads:M?Array.from(i().subarray(M>>>0,K>>>0)):[],strides:Y?Array.from(i().subarray(Y>>>0,ne>>>0)):[],w_is_const:()=>!!e()[Ce>>>0],activation:ot(L),activation_params:fe?Array.from(a().subarray(fe>>>0,Le>>>0)):[]})},1349491:d=>{c.jb("Gelu",d,void 0)},1349543:(d,m,y,x)=>{c.jb("GroupQueryAttention",d,{numHeads:m,kvNumHeads:y,scale:x})},1349656:(d,m,y,x)=>{c.jb("LayerNormalization",d,{axis:m,epsilon:y,simplified:!!x})},1349767:(d,m,y,x)=>{c.jb("LayerNormalization",d,{axis:m,epsilon:y,simplified:!!x})},1349878:(d,m,y,x,_,O)=>{c.jb("MatMulNBits",d,{k:m,n:y,accuracyLevel:x,bits:_,blockSize:O})},1350005:(d,m,y,x,_,O)=>{c.jb("MultiHeadAttention",d,{numHeads:m,isUnidirectional:y,maskFilterValue:x,scale:_,doRotary:O})},1350164:(d,m)=>{c.jb("QuickGelu",d,{alpha:m})},1350228:(d,m,y,x,_)=>{c.jb("RotaryEmbedding",d,{interleaved:!!m,numHeads:y,rotaryEmbeddingDim:x,scale:_})},1350367:(d,m,y)=>{c.jb("SkipLayerNormalization",d,{epsilon:m,simplified:!!y})},1350469:d=>{c.Yb(d)},1350503:(d,m)=>c.$b(d,m,c.Eb.bc,c.Eb.errors),1350615:(d,m,y)=>{c.jb("SkipLayerNormalization",d,{epsilon:m,simplified:!!y})}};function Rx(d,m,y){return il(async()=>{await c.Wb(d,m,y)})}function Nx(){return typeof wasmOffsetConverter<"u"}function ra(d){this.name="ExitStatus",this.message=`Program terminated with exit(${d})`,this.status=d}var na=d=>{d.terminate(),d.onmessage=()=>{}},$u=d=>{gr.length==0&&(ku(),Cu(gr[0]));var m=gr.pop();if(!m)return 6;Cr.push(m),Kt[d.Ab]=m,m.Ab=d.Ab;var y={cmd:"run",start_routine:d.cc,arg:d.Pb,pthread_ptr:d.Ab};return m.postMessage(y,d.ic),0},Er=0,We=(d,m,...y)=>{for(var x=2*y.length,_=Ta(),O=wa(8*x),R=O>>>3,M=0;M>>0]=K)}return d=Ol(d,0,x,O,m),go(_),d};function oa(d){if(g)return We(0,1,d);if(Q=d,!(0{if(Q=d,g)throw Au(d),"unwind";oa(d)},gr=[],Cr=[],Pu=[],Kt={},Ou=d=>{var m=d.Ab;delete Kt[m],gr.push(d),Cr.splice(Cr.indexOf(d),1),d.Ab=0,va(m)};function Eu(){Pu.forEach(d=>d())}var Cu=d=>new Promise(m=>{d.onmessage=_=>{var O=(_=_.data).cmd;if(_.targetThread&&_.targetThread!=sn()){var R=Kt[_.targetThread];R?R.postMessage(_,_.transferList):F(`Internal error! Worker sent a message "${O}" to target pthread ${_.targetThread}, but that thread no longer exists!`)}else O==="checkMailbox"?io():O==="spawnThread"?$u(_):O==="cleanupThread"?Ou(Kt[_.thread]):O==="killThread"?(_=_.thread,O=Kt[_],delete Kt[_],na(O),va(_),Cr.splice(Cr.indexOf(O),1),O.Ab=0):O==="cancelThread"?Kt[_.thread].postMessage({cmd:"cancel"}):O==="loaded"?(d.loaded=!0,m(d)):O==="alert"?alert(`Thread ${_.threadId}: ${_.text}`):_.target==="setimmediate"?d.postMessage(_):O==="callHandler"?c[_.handler](..._.args):O&&F(`worker sent an unknown command ${O}`)},d.onerror=_=>{throw F(`worker sent an error! ${_.filename}:${_.lineno}: ${_.message}`),_};var y,x=[];for(y of["onExit"])c.hasOwnProperty(y)&&x.push(y);d.postMessage({cmd:"load",handlers:x,wasmMemory:ae,wasmModule:qe})});function ku(){var d=new Worker(new URL(import.meta.url),{type:"module",workerData:"em-pthread",name:"em-pthread"});gr.push(d)}var oo=d=>{for(;0{var d=sn(),m=s()[d+52>>>2>>>0];d=s()[d+56>>>2>>>0],Cl(m,m-d),go(m)},Fx=(d,m)=>{Er=0,d=kl(d,m),0>>=0);throw m>>>=0,y>>>=0,s()[x.Ib+16>>>2>>>0]=0,s()[x.Ib+4>>>2>>>0]=m,s()[x.Ib+8>>>2>>>0]=y,d}function Du(d,m,y,x){return g?We(2,1,d,m,y,x):Bu(d,m,y,x)}function Bu(d,m,y,x){if(d>>>=0,m>>>=0,y>>>=0,x>>>=0,T===void 0)return F("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;var _=[];return g&&_.length===0?Du(d,m,y,x):(d={cc:y,Ab:d,Pb:x,ic:_},g?(d.Lb="spawnThread",postMessage(d,_),0):$u(d))}var Lu=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0,Ru=(d,m,y)=>{var x=(m>>>=0)+y;for(y=m;d[y]&&!(y>=x);)++y;if(16(_=(240&_)==224?(15&_)<<12|O<<6|R:(7&_)<<18|O<<12|R<<6|63&d[m++])?x+=String.fromCharCode(_):(_-=65536,x+=String.fromCharCode(55296|_>>10,56320|1023&_))}}else x+=String.fromCharCode(_)}return x},ot=(d,m)=>(d>>>=0)?Ru(n(),d,m):"";function Nu(d,m,y){return g?We(3,1,d,m,y):0}function zu(d,m){if(g)return We(4,1,d,m)}var aa=d=>{for(var m=0,y=0;y=x?m++:2047>=x?m+=2:55296<=x&&57343>=x?(m+=4,++y):m+=3}return m},Fu=(d,m,y,x)=>{if(!(0>>=0;x=y+x-1;for(var O=0;O=R&&(R=65536+((1023&R)<<10)|1023&d.charCodeAt(++O)),127>=R){if(y>=x)break;m[y++>>>0]=R}else{if(2047>=R){if(y+1>=x)break;m[y++>>>0]=192|R>>6}else{if(65535>=R){if(y+2>=x)break;m[y++>>>0]=224|R>>12}else{if(y+3>=x)break;m[y++>>>0]=240|R>>18,m[y++>>>0]=128|R>>12&63}m[y++>>>0]=128|R>>6&63}m[y++>>>0]=128|63&R}}return m[y>>>0]=0,y-_},nn=(d,m,y)=>Fu(d,n(),m,y);function Mu(d,m){if(g)return We(5,1,d,m)}function Vu(d,m,y){if(g)return We(6,1,d,m,y)}function Gu(d,m,y){return g?We(7,1,d,m,y):0}function Uu(d,m){if(g)return We(8,1,d,m)}function Wu(d,m,y){if(g)return We(9,1,d,m,y)}function Hu(d,m,y,x){if(g)return We(10,1,d,m,y,x)}function qu(d,m,y,x){if(g)return We(11,1,d,m,y,x)}function ju(d,m,y,x){if(g)return We(12,1,d,m,y,x)}function Ku(d){if(g)return We(13,1,d)}function Xu(d,m){if(g)return We(14,1,d,m)}function Zu(d,m,y){if(g)return We(15,1,d,m,y)}var Yu,br,Gx=()=>{rn("")},Xt=d=>{for(var m="";n()[d>>>0];)m+=Yu[n()[d++>>>0]];return m},sa={},ua={},Ux={};function lr(d,m,y={}){if(!("argPackAdvance"in m))throw new TypeError("registerType registeredInstance requires argPackAdvance");return function(x,_,O={}){var R=_.name;if(!x)throw new br(`type "${R}" must have a positive integer typeid pointer`);if(ua.hasOwnProperty(x)){if(O.Rb)return;throw new br(`Cannot register type '${R}' twice`)}ua[x]=_,delete Ux[x],sa.hasOwnProperty(x)&&(_=sa[x],delete sa[x],_.forEach(M=>M()))}(d,m,y)}var Ju=(d,m,y)=>{switch(m){case 1:return y?x=>e()[x>>>0]:x=>n()[x>>>0];case 2:return y?x=>t()[x>>>1>>>0]:x=>o()[x>>>1>>>0];case 4:return y?x=>i()[x>>>2>>>0]:x=>s()[x>>>2>>>0];case 8:return y?x=>V[x>>>3]:x=>ie[x>>>3];default:throw new TypeError(`invalid integer width (${m}): ${d}`)}};function Wx(d,m,y){y>>>=0,lr(d>>>=0,{name:m=Xt(m>>>0),fromWireType:x=>x,toWireType:function(x,_){if(typeof _!="bigint"&&typeof _!="number")throw _=_===null?"null":(x=typeof _)=="object"||x==="array"||x==="function"?_.toString():""+_,new TypeError(`Cannot convert "${_}" to ${this.name}`);return typeof _=="number"&&(_=BigInt(_)),_},argPackAdvance:yr,readValueFromPointer:Ju(m,y,m.indexOf("u")==-1),Db:null})}var yr=8;function Hx(d,m,y,x){lr(d>>>=0,{name:m=Xt(m>>>0),fromWireType:function(_){return!!_},toWireType:function(_,O){return O?y:x},argPackAdvance:yr,readValueFromPointer:function(_){return this.fromWireType(n()[_>>>0])},Db:null})}var la=[],cr=[];function ca(d){9<(d>>>=0)&&--cr[d+1]==0&&(cr[d]=void 0,la.push(d))}var $t=d=>{if(!d)throw new br("Cannot use deleted val. handle = "+d);return cr[d]},At=d=>{switch(d){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:let m=la.pop()||cr.length;return cr[m]=d,cr[m+1]=1,m}};function fa(d){return this.fromWireType(s()[d>>>2>>>0])}var qx={name:"emscripten::val",fromWireType:d=>{var m=$t(d);return ca(d),m},toWireType:(d,m)=>At(m),argPackAdvance:yr,readValueFromPointer:fa,Db:null};function jx(d){return lr(d>>>0,qx)}var Kx=(d,m)=>{switch(m){case 4:return function(y){return this.fromWireType(a()[y>>>2>>>0])};case 8:return function(y){return this.fromWireType(u()[y>>>3>>>0])};default:throw new TypeError(`invalid float width (${m}): ${d}`)}};function Xx(d,m,y){y>>>=0,lr(d>>>=0,{name:m=Xt(m>>>0),fromWireType:x=>x,toWireType:(x,_)=>_,argPackAdvance:yr,readValueFromPointer:Kx(m,y),Db:null})}function Zx(d,m,y,x,_){if(d>>>=0,y>>>=0,m=Xt(m>>>0),_===-1&&(_=4294967295),_=M=>M,x===0){var O=32-8*y;_=M=>M<>>O}var R=m.includes("unsigned")?function(M,K){return K>>>0}:function(M,K){return K};lr(d,{name:m,fromWireType:_,toWireType:R,argPackAdvance:yr,readValueFromPointer:Ju(m,y,x!==0),Db:null})}function Yx(d,m,y){function x(O){var R=s()[O>>>2>>>0];return O=s()[O+4>>>2>>>0],new _(e().buffer,O,R)}var _=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][m];lr(d>>>=0,{name:y=Xt(y>>>0),fromWireType:x,argPackAdvance:yr,readValueFromPointer:x},{Rb:!0})}function Jx(d,m){d>>>=0;var y=(m=Xt(m>>>0))==="std::string";lr(d,{name:m,fromWireType:function(x){var _=s()[x>>>2>>>0],O=x+4;if(y)for(var R=O,M=0;M<=_;++M){var K=O+M;if(M==_||n()[K>>>0]==0){if(R=ot(R,K-R),Y===void 0)var Y=R;else Y+=String.fromCharCode(0),Y+=R;R=K+1}}else{for(Y=Array(_),M=0;M<_;++M)Y[M]=String.fromCharCode(n()[O+M>>>0]);Y=Y.join("")}return Yt(x),Y},toWireType:function(x,_){_ instanceof ArrayBuffer&&(_=new Uint8Array(_));var O=typeof _=="string";if(!(O||_ instanceof Uint8Array||_ instanceof Uint8ClampedArray||_ instanceof Int8Array))throw new br("Cannot pass non-string to std::string");var R=y&&O?aa(_):_.length,M=mo(4+R+1),K=M+4;if(s()[M>>>2>>>0]=R,y&&O)nn(_,K,R+1);else if(O)for(O=0;O>>0]=Y}else for(O=0;O>>0]=_[O];return x!==null&&x.push(Yt,M),M},argPackAdvance:yr,readValueFromPointer:fa,Db(x){Yt(x)}})}var Qu=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,Qx=(d,m)=>{for(var y=d>>1,x=y+m/2;!(y>=x)&&o()[y>>>0];)++y;if(32<(y<<=1)-d&&Qu)return Qu.decode(n().slice(d,y));for(y="",x=0;!(x>=m/2);++x){var _=t()[d+2*x>>>1>>>0];if(_==0)break;y+=String.fromCharCode(_)}return y},e0=(d,m,y)=>{if(y??=2147483647,2>y)return 0;var x=m;y=(y-=2)<2*d.length?y/2:d.length;for(var _=0;_>>1>>>0]=O,m+=2}return t()[m>>>1>>>0]=0,m-x},t0=d=>2*d.length,r0=(d,m)=>{for(var y=0,x="";!(y>=m/4);){var _=i()[d+4*y>>>2>>>0];if(_==0)break;++y,65536<=_?(_-=65536,x+=String.fromCharCode(55296|_>>10,56320|1023&_)):x+=String.fromCharCode(_)}return x},n0=(d,m,y)=>{if(m>>>=0,y??=2147483647,4>y)return 0;var x=m;y=x+y-4;for(var _=0;_=O&&(O=65536+((1023&O)<<10)|1023&d.charCodeAt(++_)),i()[m>>>2>>>0]=O,(m+=4)+4>y)break}return i()[m>>>2>>>0]=0,m-x},o0=d=>{for(var m=0,y=0;y=x&&++y,m+=4}return m};function i0(d,m,y){if(d>>>=0,m>>>=0,y=Xt(y>>>=0),m===2)var x=Qx,_=e0,O=t0,R=M=>o()[M>>>1>>>0];else m===4&&(x=r0,_=n0,O=o0,R=M=>s()[M>>>2>>>0]);lr(d,{name:y,fromWireType:M=>{for(var K,Y=s()[M>>>2>>>0],ne=M+4,Ae=0;Ae<=Y;++Ae){var Ce=M+4+Ae*m;Ae!=Y&&R(Ce)!=0||(ne=x(ne,Ce-ne),K===void 0?K=ne:(K+=String.fromCharCode(0),K+=ne),ne=Ce+m)}return Yt(M),K},toWireType:(M,K)=>{if(typeof K!="string")throw new br(`Cannot pass non-string to C++ string type ${y}`);var Y=O(K),ne=mo(4+Y+m);return s()[ne>>>2>>>0]=Y/m,_(K,ne+4,Y+m),M!==null&&M.push(Yt,ne),ne},argPackAdvance:yr,readValueFromPointer:fa,Db(M){Yt(M)}})}function a0(d,m){lr(d>>>=0,{Sb:!0,name:m=Xt(m>>>0),argPackAdvance:0,fromWireType:()=>{},toWireType:()=>{}})}var s0=()=>1;function u0(d){xa(d>>>0,!h,1,!b,131072,!1),Eu()}var el=d=>{if(!tt)try{if(d(),!(0>>=0,typeof Atomics.jc=="function"&&(Atomics.jc(i(),d>>>2,d).value.then(io),d+=128,Atomics.store(i(),d>>>2,1))}var io=()=>{var d=sn();d&&(da(d),el(El))};function l0(d,m){(d>>>=0)==m>>>0?setTimeout(io):g?postMessage({targetThread:d,cmd:"checkMailbox"}):(d=Kt[d])&&d.postMessage({cmd:"checkMailbox"})}var pa=[];function c0(d,m,y,x,_){for(m>>>=0,x/=2,pa.length=x,y=_>>>0>>>3,_=0;_>>0];return(m?ta[m]:Q0[d])(...pa)}function f0(d){d>>>=0,g?postMessage({cmd:"cleanupThread",thread:d}):Ou(Kt[d])}function d0(d){}var ma=(d,m)=>{var y=ua[d];if(y===void 0)throw d=$l(d),y=Xt(d),Yt(d),new br(`${m} has unknown type ${y}`);return y},tl=(d,m,y)=>{var x=[];return d=d.toWireType(x,y),x.length&&(s()[m>>>2>>>0]=At(x)),d};function p0(d,m,y){return m>>>=0,y>>>=0,d=$t(d>>>0),m=ma(m,"emval::as"),tl(m,y,d)}var ao=d=>{try{d()}catch(m){rn(m)}},xr=0,Zt=null,rl=0,so=[],nl={},ol={},m0=0,ha=null,h0=[];function il(d){return function(m){if(!tt){if(xr===0){var y=!1,x=!1;m((_=0)=>{if(!tt&&(rl=_,y=!0,x)){xr=2,ao(()=>Ll(Zt)),typeof Browser<"u"&&Browser.Jb.Qb&&Browser.Jb.resume(),_=!1;try{var O=function(){var K=i()[Zt+8>>>2>>>0];return K=te[ol[K]],--Er,K()}()}catch(K){O=K,_=!0}var R=!1;if(!Zt){var M=ha;M&&(ha=null,(_?M.reject:M.resolve)(O),R=!0)}if(_&&!R)throw O}}),x=!0,y||(xr=1,Zt=function(){var _=mo(65548),O=_+12;s()[_>>>2>>>0]=O,s()[_+4>>>2>>>0]=O+65536,O=so[0];var R=nl[O];return R===void 0&&(R=m0++,nl[O]=R,ol[R]=O),O=R,i()[_+8>>>2>>>0]=O,_}(),typeof Browser<"u"&&Browser.Jb.Qb&&Browser.Jb.pause(),ao(()=>Dl(Zt)))}else xr===2?(xr=0,ao(Rl),Yt(Zt),Zt=null,h0.forEach(el)):rn(`invalid state: ${xr}`);return rl}}(m=>{d().then(m)})}function g0(d){return d>>>=0,il(()=>(d=$t(d)).then(At))}var uo=[];function b0(d,m,y,x){return y>>>=0,x>>>=0,(d=uo[d>>>0])(null,m=$t(m>>>0),y,x)}var y0={},lo=d=>{var m=y0[d];return m===void 0?Xt(d):m};function x0(d,m,y,x,_){return y>>>=0,x>>>=0,_>>>=0,(d=uo[d>>>0])(m=$t(m>>>0),m[y=lo(y)],x,_)}var al=()=>typeof globalThis=="object"?globalThis:Function("return this")();function v0(d){return(d>>>=0)==0?At(al()):(d=lo(d),At(al()[d]))}var w0=d=>{var m=uo.length;return uo.push(d),m},T0=(d,m)=>{for(var y=Array(d),x=0;x>>2>>>0],"parameter "+x);return y},sl=(d,m)=>Object.defineProperty(m,"name",{value:d});function _0(d,m,y){var x=(m=T0(d,m>>>0)).shift();d--;var _=`return function (obj, func, destructorsRef, args) { +`,O=0,R=[];y===0&&R.push("obj");for(var M=["retType"],K=[x],Y=0;Yne.name).join(", ")}) => ${x.name}>`,v0(sl(y,d))}function _0(d){return d=lo(d>>>0),At(c[d])}function I0(d,m){return m>>>=0,d=$t(d>>>0),m=$t(m),At(d[m])}function S0(d){9<(d>>>=0)&&(cr[d+1]+=1)}function $0(){return At([])}function A0(d){d=$t(d>>>0);for(var m=Array(d.length),y=0;y>>0))}function O0(){return At({})}function E0(d){for(var m=$t(d>>>=0);m.length;){var y=m.pop();m.pop()(y)}la(d)}function C0(d,m,y){m>>>=0,y>>>=0,d=$t(d>>>0),m=$t(m),y=$t(y),d[m]=y}function k0(d,m){return m>>>=0,d=(d=pa(d>>>0,"_emval_take_value")).readValueFromPointer(m),At(d)}function D0(d,m){d=-9007199254740992>d||9007199254740992>>=0,d=new Date(1e3*d),i()[m>>>2>>>0]=d.getUTCSeconds(),i()[m+4>>>2>>>0]=d.getUTCMinutes(),i()[m+8>>>2>>>0]=d.getUTCHours(),i()[m+12>>>2>>>0]=d.getUTCDate(),i()[m+16>>>2>>>0]=d.getUTCMonth(),i()[m+20>>>2>>>0]=d.getUTCFullYear()-1900,i()[m+24>>>2>>>0]=d.getUTCDay(),d=(d.getTime()-Date.UTC(d.getUTCFullYear(),0,1,0,0,0,0))/864e5|0,i()[m+28>>>2>>>0]=d}var nn=d=>d%4==0&&(d%100!=0||d%400==0),ul=[0,31,60,91,121,152,182,213,244,274,305,335],ll=[0,31,59,90,120,151,181,212,243,273,304,334];function B0(d,m){d=-9007199254740992>d||9007199254740992>>=0,d=new Date(1e3*d),i()[m>>>2>>>0]=d.getSeconds(),i()[m+4>>>2>>>0]=d.getMinutes(),i()[m+8>>>2>>>0]=d.getHours(),i()[m+12>>>2>>>0]=d.getDate(),i()[m+16>>>2>>>0]=d.getMonth(),i()[m+20>>>2>>>0]=d.getFullYear()-1900,i()[m+24>>>2>>>0]=d.getDay();var y=(nn(d.getFullYear())?ul:ll)[d.getMonth()]+d.getDate()-1|0;i()[m+28>>>2>>>0]=y,i()[m+36>>>2>>>0]=-60*d.getTimezoneOffset(),y=new Date(d.getFullYear(),6,1).getTimezoneOffset();var x=new Date(d.getFullYear(),0,1).getTimezoneOffset();d=0|(y!=x&&d.getTimezoneOffset()==Math.min(x,y)),i()[m+32>>>2>>>0]=d}function L0(d){d>>>=0;var m=new Date(i()[d+20>>>2>>>0]+1900,i()[d+16>>>2>>>0],i()[d+12>>>2>>>0],i()[d+8>>>2>>>0],i()[d+4>>>2>>>0],i()[d>>>2>>>0],0),y=i()[d+32>>>2>>>0],x=m.getTimezoneOffset(),_=new Date(m.getFullYear(),6,1).getTimezoneOffset(),O=new Date(m.getFullYear(),0,1).getTimezoneOffset(),R=Math.min(O,_);return 0>y?i()[d+32>>>2>>>0]=+(_!=O&&R==x):0>>2>>>0]=m.getDay(),y=(nn(m.getFullYear())?ul:ll)[m.getMonth()]+m.getDate()-1|0,i()[d+28>>>2>>>0]=y,i()[d>>>2>>>0]=m.getSeconds(),i()[d+4>>>2>>>0]=m.getMinutes(),i()[d+8>>>2>>>0]=m.getHours(),i()[d+12>>>2>>>0]=m.getDate(),i()[d+16>>>2>>>0]=m.getMonth(),i()[d+20>>>2>>>0]=m.getYear(),d=m.getTime(),BigInt(isNaN(d)?-1:d/1e3)}function cl(d,m,y,x,_,O,R){return g?We(16,1,d,m,y,x,_,O,R):-52}function fl(d,m,y,x,_,O){if(g)return We(17,1,d,m,y,x,_,O)}function R0(d,m,y,x){d>>>=0,m>>>=0,y>>>=0,x>>>=0;var _=new Date().getFullYear(),O=new Date(_,0,1),R=new Date(_,6,1);_=O.getTimezoneOffset();var M=R.getTimezoneOffset(),j=Math.max(_,M);s()[d>>>2>>>0]=60*j,i()[m>>>2>>>0]=+(_!=M),O=(d=Y=>Y.toLocaleTimeString(void 0,{hour12:!1,timeZoneName:"short"}).split(" ")[1])(O),R=d(R),M<_?(rn(O,y,17),rn(R,x,17)):(rn(O,x,17),rn(R,y,17))}var ha=[],dl=(d,m)=>{ha.length=0;for(var y;y=n()[d++>>>0];){var x=y!=105;m+=(x&=y!=112)&&m%8?4:0,ha.push(y==112?s()[m>>>2>>>0]:y==106?V[m>>>3]:y==105?i()[m>>>2>>>0]:u()[m>>>3>>>0]),m+=x?8:4}return ha};function N0(d,m,y){return d>>>=0,m=dl(m>>>0,y>>>0),ta[d](...m)}function z0(d,m,y){return d>>>=0,m=dl(m>>>0,y>>>0),ta[d](...m)}var F0=()=>{},M0=()=>Date.now();function V0(d,m){return F(ot(d>>>0,m>>>0))}var pl,G0=()=>{throw Er+=1,"unwind"};function U0(){return 4294901760}pl=()=>performance.timeOrigin+performance.now();var W0=()=>navigator.hardwareConcurrency;function H0(d){d>>>=0;var m=n().length;if(d<=m||4294901760=y;y*=2){var x=m*(1+.2/y);x=Math.min(x,d+100663296);var _=Math;x=Math.max(d,x);e:{_=(_.min.call(_,4294901760,x+(65536-x%65536)%65536)-ae.buffer.byteLength+65535)/65536;try{ae.grow(_),Fe();var O=1;break e}catch{}O=void 0}if(O)return!0}return!1}var co=()=>(An("Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER"),0),on={},ml=d=>{d.forEach(m=>{var y=co();y&&(on[y]=m)})};function q0(){var d=Error().stack.toString().split(` -`);return d[0]=="Error"&&d.shift(),ml(d),on.Lb=co(),on.Yb=d,on.Lb}function K0(d,m,y){if(d>>>=0,m>>>=0,on.Lb==d)var x=on.Yb;else(x=Error().stack.toString().split(` -`))[0]=="Error"&&x.shift(),ml(x);for(var _=3;x[_]&&co()!=d;)++_;for(d=0;d>>2>>>0]=co();return d}var ga,ba={},hl=()=>{if(!ga){var d,m={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:P||"./this.program"};for(d in ba)ba[d]===void 0?delete m[d]:m[d]=ba[d];var y=[];for(d in m)y.push(`${d}=${m[d]}`);ga=y}return ga};function gl(d,m){if(g)return We(18,1,d,m);d>>>=0,m>>>=0;var y=0;return hl().forEach((x,_)=>{var O=m+y;for(_=s()[d+4*_>>>2>>>0]=O,O=0;O>>0]=x.charCodeAt(O);e()[_>>>0]=0,y+=x.length+1}),0}function bl(d,m){if(g)return We(19,1,d,m);d>>>=0,m>>>=0;var y=hl();s()[d>>>2>>>0]=y.length;var x=0;return y.forEach(_=>x+=_.length+1),s()[m>>>2>>>0]=x,0}function yl(d){return g?We(20,1,d):52}function xl(d,m,y,x){return g?We(21,1,d,m,y,x):52}function vl(d,m,y,x){return g?We(22,1,d,m,y,x):70}var j0=[null,[],[]];function wl(d,m,y,x){if(g)return We(23,1,d,m,y,x);m>>>=0,y>>>=0,x>>>=0;for(var _=0,O=0;O>>2>>>0],M=s()[m+4>>>2>>>0];m+=8;for(var j=0;j>>0],ne=j0[d];Y===0||Y===10?((d===1?K:F)(Ru(ne,0)),ne.length=0):ne.push(Y)}_+=M}return s()[x>>>2>>>0]=_,0}var Tl=[31,29,31,30,31,30,31,31,30,31,30,31],_l=[31,28,31,30,31,30,31,31,30,31,30,31],X0=(d,m)=>{e().set(d,m>>>0)};function Il(d,m,y,x){function _(L,fe,Le){for(L=typeof L=="number"?L.toString():L||"";L.lengthzl?-1:0kr-L.getDate())){L.setDate(L.getDate()+fe);break}fe-=kr-L.getDate()+1,L.setDate(1),11>Le?L.setMonth(Le+1):(L.setMonth(0),L.setFullYear(L.getFullYear()+1))}return Le=new Date(L.getFullYear()+1,0,4),fe=M(new Date(L.getFullYear(),0,4)),Le=M(Le),0>=R(fe,L)?0>=R(Le,L)?L.getFullYear()+1:L.getFullYear():L.getFullYear()-1}d>>>=0,m>>>=0,y>>>=0,x>>>=0;var Y=s()[x+40>>>2>>>0];for(var ne in x={cc:i()[x>>>2>>>0],bc:i()[x+4>>>2>>>0],Db:i()[x+8>>>2>>>0],Hb:i()[x+12>>>2>>>0],Eb:i()[x+16>>>2>>>0],zb:i()[x+20>>>2>>>0],rb:i()[x+24>>>2>>>0],yb:i()[x+28>>>2>>>0],kc:i()[x+32>>>2>>>0],ac:i()[x+36>>>2>>>0],dc:Y?ot(Y):""},y=ot(y),Y={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"})y=y.replace(new RegExp(ne,"g"),Y[ne]);var Ae="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),Ce="January February March April May June July August September October November December".split(" ");for(ne in Y={"%a":L=>Ae[L.rb].substring(0,3),"%A":L=>Ae[L.rb],"%b":L=>Ce[L.Eb].substring(0,3),"%B":L=>Ce[L.Eb],"%C":L=>O((L.zb+1900)/100|0,2),"%d":L=>O(L.Hb,2),"%e":L=>_(L.Hb,2," "),"%g":L=>j(L).toString().substring(2),"%G":j,"%H":L=>O(L.Db,2),"%I":L=>((L=L.Db)==0?L=12:12{for(var fe=0,Le=0;Le<=L.Eb-1;fe+=(nn(L.zb+1900)?Tl:_l)[Le++]);return O(L.Hb+fe,3)},"%m":L=>O(L.Eb+1,2),"%M":L=>O(L.bc,2),"%n":()=>` -`,"%p":L=>0<=L.Db&&12>L.Db?"AM":"PM","%S":L=>O(L.cc,2),"%t":()=>" ","%u":L=>L.rb||7,"%U":L=>O(Math.floor((L.yb+7-L.rb)/7),2),"%V":L=>{var fe=Math.floor((L.yb+7-(L.rb+6)%7)/7);if(2>=(L.rb+371-L.yb-2)%7&&fe++,fe)fe==53&&((Le=(L.rb+371-L.yb)%7)==4||Le==3&&nn(L.zb)||(fe=1));else{fe=52;var Le=(L.rb+7-L.yb-1)%7;(Le==4||Le==5&&nn(L.zb%400-1))&&fe++}return O(fe,2)},"%w":L=>L.rb,"%W":L=>O(Math.floor((L.yb+7-(L.rb+6)%7)/7),2),"%y":L=>(L.zb+1900).toString().substring(2),"%Y":L=>L.zb+1900,"%z":L=>{var fe=0<=(L=L.ac);return L=Math.abs(L)/60,(fe?"+":"-")+("0000"+(L/60*100+L%60)).slice(-4)},"%Z":L=>L.dc,"%%":()=>"%"},y=y.replace(/%%/g,"\0\0"),Y)y.includes(ne)&&(y=y.replace(new RegExp(ne,"g"),Y[ne](x)));return ne=function(L){var fe=Array(ia(L)+1);return Fu(L,fe,0,fe.length),fe}(y=y.replace(/\0\0/g,"%")),ne.length>m?0:(X0(ne,d),ne.length-1)}function Z0(d,m,y,x){return Il(d>>>0,m>>>0,y>>>0,x>>>0)}g||function(){for(var d=c.numThreads-1;d--;)ku();Ke.unshift(()=>{rt++,function(m){g?m():Promise.all(gr.map(Cu)).then(m)}(()=>no())})}();for(var Sl=Array(256),fo=0;256>fo;++fo)Sl[fo]=String.fromCharCode(fo);Yu=Sl,br=c.BindingError=class extends Error{constructor(d){super(d),this.name="BindingError"}},c.InternalError=class extends Error{constructor(d){super(d),this.name="InternalError"}},cr.push(0,1,void 0,1,null,1,!0,1,!1,1),c.count_emval_handles=()=>cr.length/2-5-ua.length;var Y0=[$u,Au,Du,Nu,zu,Mu,Vu,Gu,Uu,Wu,Hu,qu,Ku,ju,Xu,Zu,cl,fl,gl,bl,yl,xl,vl,wl],te=function(){function d(y,x){return te=y.exports,te=function(){var _=te,O={};for(let[R,M]of Object.entries(_))O[R]=typeof M=="function"?(...j)=>{so.push(R);try{return M(...j)}finally{tt||(so.pop(),Zt&&xr===1&&so.length===0&&(xr=0,Er+=1,ao(Bl),typeof Fibers<"u"&&Fibers.lc()))}}:M;return O}(),te=function(){var _=te,O=M=>j=>M(j)>>>0,R=M=>()=>M()>>>0;return(_=Object.assign({},_)).za=O(_.za),_.cb=R(_.cb),_.db=O(_.db),_.emscripten_main_runtime_thread_id=R(_.emscripten_main_runtime_thread_id),_.pb=O(_.pb),_.qb=R(_.qb),_}(),Pu.push(te.fb),tn.unshift(te.ya),qe=x,no(),te}var m=Iu();if(rt++,c.instantiateWasm)try{return c.instantiateWasm(m,d)}catch(y){F(`Module.instantiateWasm callback failed with error: ${y}`),f(y)}return xu||=c.locateFile?vu("ort-wasm-simd-threaded.jsep.wasm")?"ort-wasm-simd-threaded.jsep.wasm":c.locateFile?c.locateFile("ort-wasm-simd-threaded.jsep.wasm",N):N+"ort-wasm-simd-threaded.jsep.wasm":new URL("ort-wasm-simd-threaded.jsep.wasm",import.meta.url).href,function(y,x){var _=xu;return typeof WebAssembly.instantiateStreaming!="function"||vu(_)||wu(_)||typeof fetch!="function"?_u(_,y,x):fetch(_,{credentials:"same-origin"}).then(O=>WebAssembly.instantiateStreaming(O,y).then(x,function(R){return F(`wasm streaming compile failed: ${R}`),F("falling back to ArrayBuffer instantiation"),_u(_,y,x)}))}(m,function(y){d(y.instance,y.module)}).catch(f),{}}(),$l=d=>($l=te.za)(d),Al=()=>(Al=te.Aa)();c._OrtInit=(d,m)=>(c._OrtInit=te.Ba)(d,m),c._OrtGetLastError=(d,m)=>(c._OrtGetLastError=te.Ca)(d,m),c._OrtCreateSessionOptions=(d,m,y,x,_,O,R,M,j,Y)=>(c._OrtCreateSessionOptions=te.Da)(d,m,y,x,_,O,R,M,j,Y),c._OrtAppendExecutionProvider=(d,m)=>(c._OrtAppendExecutionProvider=te.Ea)(d,m),c._OrtAddFreeDimensionOverride=(d,m,y)=>(c._OrtAddFreeDimensionOverride=te.Fa)(d,m,y),c._OrtAddSessionConfigEntry=(d,m,y)=>(c._OrtAddSessionConfigEntry=te.Ga)(d,m,y),c._OrtReleaseSessionOptions=d=>(c._OrtReleaseSessionOptions=te.Ha)(d),c._OrtCreateSession=(d,m,y)=>(c._OrtCreateSession=te.Ia)(d,m,y),c._OrtReleaseSession=d=>(c._OrtReleaseSession=te.Ja)(d),c._OrtGetInputOutputCount=(d,m,y)=>(c._OrtGetInputOutputCount=te.Ka)(d,m,y),c._OrtGetInputName=(d,m)=>(c._OrtGetInputName=te.La)(d,m),c._OrtGetOutputName=(d,m)=>(c._OrtGetOutputName=te.Ma)(d,m),c._OrtFree=d=>(c._OrtFree=te.Na)(d),c._OrtCreateTensor=(d,m,y,x,_,O)=>(c._OrtCreateTensor=te.Oa)(d,m,y,x,_,O),c._OrtGetTensorData=(d,m,y,x,_)=>(c._OrtGetTensorData=te.Pa)(d,m,y,x,_),c._OrtReleaseTensor=d=>(c._OrtReleaseTensor=te.Qa)(d),c._OrtCreateRunOptions=(d,m,y,x)=>(c._OrtCreateRunOptions=te.Ra)(d,m,y,x),c._OrtAddRunConfigEntry=(d,m,y)=>(c._OrtAddRunConfigEntry=te.Sa)(d,m,y),c._OrtReleaseRunOptions=d=>(c._OrtReleaseRunOptions=te.Ta)(d),c._OrtCreateBinding=d=>(c._OrtCreateBinding=te.Ua)(d),c._OrtBindInput=(d,m,y)=>(c._OrtBindInput=te.Va)(d,m,y),c._OrtBindOutput=(d,m,y,x)=>(c._OrtBindOutput=te.Wa)(d,m,y,x),c._OrtClearBoundOutputs=d=>(c._OrtClearBoundOutputs=te.Xa)(d),c._OrtReleaseBinding=d=>(c._OrtReleaseBinding=te.Ya)(d),c._OrtRunWithBinding=(d,m,y,x,_)=>(c._OrtRunWithBinding=te.Za)(d,m,y,x,_),c._OrtRun=(d,m,y,x,_,O,R,M)=>(c._OrtRun=te._a)(d,m,y,x,_,O,R,M),c._OrtEndProfiling=d=>(c._OrtEndProfiling=te.$a)(d),c._JsepOutput=(d,m,y)=>(c._JsepOutput=te.ab)(d,m,y),c._JsepGetNodeName=d=>(c._JsepGetNodeName=te.bb)(d);var po,an=()=>(an=te.cb)(),mo=c._malloc=d=>(mo=c._malloc=te.db)(d),Yt=c._free=d=>(Yt=c._free=te.eb)(d),ya=(d,m,y,x,_,O)=>(ya=te.hb)(d,m,y,x,_,O),Pl=()=>(Pl=te.ib)(),Ol=(d,m,y,x,_)=>(Ol=te.jb)(d,m,y,x,_),xa=d=>(xa=te.kb)(d),ho=d=>(ho=te.lb)(d),El=()=>(El=te.mb)(),Cl=(d,m)=>(Cl=te.nb)(d,m),go=d=>(go=te.ob)(d),va=d=>(va=te.pb)(d),wa=()=>(wa=te.qb)(),kl=c.dynCall_ii=(d,m)=>(kl=c.dynCall_ii=te.sb)(d,m),Dl=d=>(Dl=te.tb)(d),Bl=()=>(Bl=te.ub)(),Ll=d=>(Ll=te.vb)(d),Rl=()=>(Rl=te.wb)();function Nl(){if(!(0wa(),c.stackRestore=d=>go(d),c.stackAlloc=d=>va(d),c.UTF8ToString=ot,c.stringToUTF8=rn,c.lengthBytesUTF8=ia,hr=function d(){po||Nl(),po||(hr=d)},Nl(),p}),k_=Ih;globalThis.self?.name==="em-pthread"&&Ih()});var wn,D_,B_,L_,Ah,Ph,R_,Oh,Hn=C(()=>{"use strict";hi();wn=!1?void 0:import.meta.url??(typeof document<"u"?document.currentScript?.src:typeof self<"u"?self.location?.href:void 0),D_=!1||typeof location>"u"?void 0:location.origin,B_=(r,e)=>{try{let n=e??wn;return(n?new URL(r,n):new URL(r)).origin===D_}catch{return!1}},L_=async r=>{let n=await(await fetch(r,{credentials:"same-origin"})).blob();return URL.createObjectURL(n)},Ah=(_h(),Pn(Th)).default,Ph=async()=>{if(!wn)throw new Error("Failed to load proxy worker: cannot determine the script source URL.");if(B_(wn))return[void 0,Ah()];let r=await L_(wn);return[r,Ah(r)]},R_=($h(),Pn(Sh)).default,Oh=async(r,e,n)=>[void 0,R_]});var Bs,Ls,Ii,Eh,N_,z_,gi,Ye,Kr=C(()=>{"use strict";Hn();Ls=!1,Ii=!1,Eh=!1,N_=()=>{if(typeof SharedArrayBuffer>"u")return!1;try{return typeof MessageChannel<"u"&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},z_=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},gi=async r=>{if(Ls)return Promise.resolve();if(Ii)throw new Error("multiple calls to 'initializeWebAssembly()' detected.");if(Eh)throw new Error("previous call to 'initializeWebAssembly()' failed.");Ii=!0;let e=r.initTimeout,n=r.numThreads;if(!z_())throw new Error("WebAssembly SIMD is not supported in the current environment.");let t=N_();n>1&&!t&&(typeof self<"u"&&!self.crossOriginIsolated&&console.warn("env.wasm.numThreads is set to "+n+", but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info."),console.warn("WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading."),r.numThreads=n=1);let o=r.wasmPaths,i=typeof o=="string"?o:void 0,s=o?.mjs,a=s?.href??s,u=o?.wasm,l=u?.href??u,[f,c]=await Oh(a,i,n>1),p=!1,b=[];if(e>0&&b.push(new Promise(h=>{setTimeout(()=>{p=!0,h()},e)})),b.push(new Promise((h,g)=>{let T={numThreads:n};(l||i)&&(T.locateFile=(w,v)=>l??(i??v)+w),c(T).then(w=>{Ii=!1,Ls=!0,Bs=w,h(),f&&URL.revokeObjectURL(f)},w=>{Ii=!1,Eh=!0,g(w)})})),await Promise.race(b),p)throw new Error(`WebAssembly backend initializing failed due to timeout: ${e}ms`)},Ye=()=>{if(Ls&&Bs)return Bs;throw new Error("WebAssembly is not initialized yet.")}});var nt,Kn,Ue,Si=C(()=>{"use strict";Kr();nt=(r,e)=>{let n=Ye(),t=n.lengthBytesUTF8(r)+1,o=n._malloc(t);return n.stringToUTF8(r,o,t),e.push(o),o},Kn=(r,e,n,t)=>{if(typeof r=="object"&&r!==null){if(n.has(r))throw new Error("Circular reference in options");n.add(r)}Object.entries(r).forEach(([o,i])=>{let s=e?e+o:o;if(typeof i=="object")Kn(i,s+".",n,t);else if(typeof i=="string"||typeof i=="number")t(s,i.toString());else if(typeof i=="boolean")t(s,i?"1":"0");else throw new Error(`Can't handle extra config type: ${typeof i}`)})},Ue=r=>{let e=Ye(),n=e.stackSave();try{let t=e.stackAlloc(8);e._OrtGetLastError(t,t+4);let o=e.HEAP32[t/4],i=e.HEAPU32[t/4+1],s=i?e.UTF8ToString(i):"";throw new Error(`${r} ERROR_CODE: ${o}, ERROR_MESSAGE: ${s}`)}finally{e.stackRestore(n)}}});var Ch,kh=C(()=>{"use strict";Kr();Si();Ch=r=>{let e=Ye(),n=0,t=[],o=r||{};try{if(r?.logSeverityLevel===void 0)o.logSeverityLevel=2;else if(typeof r.logSeverityLevel!="number"||!Number.isInteger(r.logSeverityLevel)||r.logSeverityLevel<0||r.logSeverityLevel>4)throw new Error(`log serverity level is not valid: ${r.logSeverityLevel}`);if(r?.logVerbosityLevel===void 0)o.logVerbosityLevel=0;else if(typeof r.logVerbosityLevel!="number"||!Number.isInteger(r.logVerbosityLevel))throw new Error(`log verbosity level is not valid: ${r.logVerbosityLevel}`);r?.terminate===void 0&&(o.terminate=!1);let i=0;return r?.tag!==void 0&&(i=nt(r.tag,t)),n=e._OrtCreateRunOptions(o.logSeverityLevel,o.logVerbosityLevel,!!o.terminate,i),n===0&&Ue("Can't create run options."),r?.extra!==void 0&&Kn(r.extra,"",new WeakSet,(s,a)=>{let u=nt(s,t),l=nt(a,t);e._OrtAddRunConfigEntry(n,u,l)!==0&&Ue(`Can't set a run config entry: ${s} - ${a}.`)}),[n,t]}catch(i){throw n!==0&&e._OrtReleaseRunOptions(n),t.forEach(s=>e._free(s)),i}}});var F_,M_,V_,G_,Dh,Bh=C(()=>{"use strict";Kr();Si();F_=r=>{switch(r){case"disabled":return 0;case"basic":return 1;case"extended":return 2;case"all":return 99;default:throw new Error(`unsupported graph optimization level: ${r}`)}},M_=r=>{switch(r){case"sequential":return 0;case"parallel":return 1;default:throw new Error(`unsupported execution mode: ${r}`)}},V_=r=>{r.extra||(r.extra={}),r.extra.session||(r.extra.session={});let e=r.extra.session;e.use_ort_model_bytes_directly||(e.use_ort_model_bytes_directly="1"),r.executionProviders&&r.executionProviders.some(n=>(typeof n=="string"?n:n.name)==="webgpu")&&(r.enableMemPattern=!1)},G_=(r,e,n)=>{for(let t of e){let o=typeof t=="string"?t:t.name;switch(o){case"webnn":if(o="WEBNN",typeof t!="string"){let a=t?.deviceType;if(a){let u=nt("deviceType",n),l=nt(a,n);Ye()._OrtAddSessionConfigEntry(r,u,l)!==0&&Ue(`Can't set a session config entry: 'deviceType' - ${a}.`)}}break;case"webgpu":if(o="JS",typeof t!="string"){let s=t;if(s?.preferredLayout){if(s.preferredLayout!=="NCHW"&&s.preferredLayout!=="NHWC")throw new Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${s.preferredLayout}`);let a=nt("preferredLayout",n),u=nt(s.preferredLayout,n);Ye()._OrtAddSessionConfigEntry(r,a,u)!==0&&Ue(`Can't set a session config entry: 'preferredLayout' - ${s.preferredLayout}.`)}}break;case"wasm":case"cpu":continue;default:throw new Error(`not supported execution provider: ${o}`)}let i=nt(o,n);Ye()._OrtAppendExecutionProvider(r,i)!==0&&Ue(`Can't append execution provider: ${o}.`)}},Dh=r=>{let e=Ye(),n=0,t=[],o=r||{};V_(o);try{let i=F_(o.graphOptimizationLevel??"all"),s=M_(o.executionMode??"sequential"),a=typeof o.logId=="string"?nt(o.logId,t):0,u=o.logSeverityLevel??2;if(!Number.isInteger(u)||u<0||u>4)throw new Error(`log serverity level is not valid: ${u}`);let l=o.logVerbosityLevel??0;if(!Number.isInteger(l)||l<0||l>4)throw new Error(`log verbosity level is not valid: ${l}`);let f=typeof o.optimizedModelFilePath=="string"?nt(o.optimizedModelFilePath,t):0;if(n=e._OrtCreateSessionOptions(i,!!o.enableCpuMemArena,!!o.enableMemPattern,s,!!o.enableProfiling,0,a,u,l,f),n===0&&Ue("Can't create session options."),o.executionProviders&&G_(n,o.executionProviders,t),o.enableGraphCapture!==void 0){if(typeof o.enableGraphCapture!="boolean")throw new Error(`enableGraphCapture must be a boolean value: ${o.enableGraphCapture}`);let c=nt("enableGraphCapture",t),p=nt(o.enableGraphCapture.toString(),t);e._OrtAddSessionConfigEntry(n,c,p)!==0&&Ue(`Can't set a session config entry: 'enableGraphCapture' - ${o.enableGraphCapture}.`)}if(o.freeDimensionOverrides)for(let[c,p]of Object.entries(o.freeDimensionOverrides)){if(typeof c!="string")throw new Error(`free dimension override name must be a string: ${c}`);if(typeof p!="number"||!Number.isInteger(p)||p<0)throw new Error(`free dimension override value must be a non-negative integer: ${p}`);let b=nt(c,t);e._OrtAddFreeDimensionOverride(n,b,p)!==0&&Ue(`Can't set a free dimension override: ${c} - ${p}.`)}return o.extra!==void 0&&Kn(o.extra,"",new WeakSet,(c,p)=>{let b=nt(c,t),h=nt(p,t);e._OrtAddSessionConfigEntry(n,b,h)!==0&&Ue(`Can't set a session config entry: ${c} - ${p}.`)}),[n,t]}catch(i){throw n!==0&&e._OrtReleaseSessionOptions(n),t.forEach(s=>e._free(s)),i}}});var Rs,Ar,jr,$i,jn,Ai,Ns,ue=C(()=>{"use strict";Rs=r=>{switch(r){case"int8":return 3;case"uint8":return 2;case"bool":return 9;case"int16":return 5;case"uint16":return 4;case"int32":return 6;case"uint32":return 12;case"float16":return 10;case"float32":return 1;case"float64":return 11;case"string":return 8;case"int64":return 7;case"uint64":return 13;default:throw new Error(`unsupported data type: ${r}`)}},Ar=r=>{switch(r){case 3:return"int8";case 2:return"uint8";case 9:return"bool";case 5:return"int16";case 4:return"uint16";case 6:return"int32";case 12:return"uint32";case 10:return"float16";case 1:return"float32";case 11:return"float64";case 8:return"string";case 7:return"int64";case 13:return"uint64";default:throw new Error(`unsupported data type: ${r}`)}},jr=r=>[void 0,4,1,1,2,2,4,8,void 0,1,2,8,4,8,void 0,void 0,void 0][r],$i=r=>{switch(r){case"float16":return typeof Float16Array<"u"&&Float16Array.from?Float16Array:Uint16Array;case"float32":return Float32Array;case"uint8":return Uint8Array;case"int8":return Int8Array;case"uint16":return Uint16Array;case"int16":return Int16Array;case"int32":return Int32Array;case"bool":return Uint8Array;case"float64":return Float64Array;case"uint32":return Uint32Array;case"int64":return BigInt64Array;case"uint64":return BigUint64Array;default:throw new Error(`unsupported type: ${r}`)}},jn=r=>{switch(r){case"verbose":return 0;case"info":return 1;case"warning":return 2;case"error":return 3;case"fatal":return 4;default:throw new Error(`unsupported logging level: ${r}`)}},Ai=r=>r==="float32"||r==="float16"||r==="int32"||r==="int64"||r==="uint32"||r==="uint8"||r==="bool",Ns=r=>{switch(r){case"none":return 0;case"cpu":return 1;case"cpu-pinned":return 2;case"texture":return 3;case"gpu-buffer":return 4;default:throw new Error(`unsupported data location: ${r}`)}}});var Xn,zs=C(()=>{"use strict";hi();Xn=async r=>{if(typeof r=="string")if(!1)try{let{readFile:e}=Ta("node:fs/promises");return new Uint8Array(await e(r))}catch(e){if(e.code==="ERR_FS_FILE_TOO_LARGE"){let{createReadStream:n}=Ta("node:fs"),t=n(r),o=[];for await(let i of t)o.push(i);return new Uint8Array(Buffer.concat(o))}throw e}else{let e=await fetch(r);if(!e.ok)throw new Error(`failed to load external data file: ${r}`);let n=e.headers.get("Content-Length"),t=n?parseInt(n,10):0;if(t<1073741824)return new Uint8Array(await e.arrayBuffer());{if(!e.body)throw new Error(`failed to load external data file: ${r}, no response body.`);let o=e.body.getReader(),i;try{i=new ArrayBuffer(t)}catch(a){if(a instanceof RangeError){let u=Math.ceil(t/65536);i=new WebAssembly.Memory({initial:u,maximum:u}).buffer}else throw a}let s=0;for(;;){let{done:a,value:u}=await o.read();if(a)break;let l=u.byteLength;new Uint8Array(i,s,l).set(u),s+=l}return new Uint8Array(i,0,t)}}else return r instanceof Blob?new Uint8Array(await r.arrayBuffer()):r instanceof Uint8Array?r:new Uint8Array(r)}});var U_,W_,Lh,Rh,Nh,H_,Ne,mr=C(()=>{"use strict";ue();U_=["V","I","W","E","F"],W_=(r,e)=>{console.log(`[${U_[r]},${new Date().toISOString()}]${e}`)},Nh=(r,e)=>{Lh=r,Rh=e},H_=(r,e)=>{let n=jn(r),t=jn(Lh);n>=t&&W_(n,typeof e=="function"?e():e)},Ne=(...r)=>{Rh&&H_(...r)}});var zh,Fh=C(()=>{"use strict";ue();zh=(r,e)=>new($i(e))(r)});var Pi=C(()=>{"use strict"});var Mh,Fs,Ms,q_,K_,Vh,Gs,Vs,Uh,Wh=C(()=>{"use strict";mr();Pi();Mh=new Map([[64,250],[128,200],[256,200],[512,200],[2048,230],[4096,200],[8192,50],[16384,50],[32768,50],[65536,50],[131072,50],[262144,50],[524288,50],[1048576,50],[2097152,30],[4194304,20],[8388608,10],[12582912,10],[16777216,10],[26214400,15],[33554432,22],[44236800,2],[58982400,6],[67108864,6],[134217728,6],[167772160,6]]),Fs=[],Ms=r=>Math.ceil(r/16)*16,q_=r=>{for(let e=0;eK_++,Gs=async(r,e,n,t)=>{let o=Ms(n),i=r.device.createBuffer({size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});try{let s=r.getCommandEncoder();r.endComputePass(),s.copyBufferToBuffer(e,0,i,0,o),r.flush(),await i.mapAsync(GPUMapMode.READ);let a=i.getMappedRange();if(t){let u=t();return u.set(new Uint8Array(a,0,n)),u}else return new Uint8Array(a.slice(0,n))}finally{i.destroy()}},Vs=class{constructor(e){this.backend=e;this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.buffersForUploadingPending=[],this.buffersPending=[],this.externalBuffers=new Map,this.capturedPendingBuffers=new Map;for(let[n]of Mh)Fs.push(n),this.freeBuffers.set(n,[]),this.freeUniformBuffers.set(n,[])}upload(e,n){let t=n.buffer,o=n.byteOffset,i=n.byteLength,s=Ms(i),a=this.storageCache.get(e);if(!a)throw new Error("gpu data for uploading does not exist");if(a.originalSize!==i)throw new Error(`inconsistent data size. gpu data size=${a.originalSize}, data size=${i}`);let u=this.backend.device.createBuffer({mappedAtCreation:!0,size:s,usage:GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC}),l=u.getMappedRange();new Uint8Array(l).set(new Uint8Array(t,o,i)),u.unmap();let f=this.backend.getCommandEncoder();this.backend.endComputePass(),f.copyBufferToBuffer(u,0,a.gpuData.buffer,0,s),Ne("verbose",()=>`[WebGPU] GpuDataManager.upload(id=${e})`),this.buffersForUploadingPending.push(u)}memcpy(e,n){let t=this.storageCache.get(e);if(!t)throw new Error("source gpu data for memcpy does not exist");let o=this.storageCache.get(n);if(!o)throw new Error("destination gpu data for memcpy does not exist");if(t.originalSize!==o.originalSize)throw new Error("inconsistent source and destination gpu data size");let i=Ms(t.originalSize),s=this.backend.getCommandEncoder();this.backend.endComputePass(),s.copyBufferToBuffer(t.gpuData.buffer,0,o.gpuData.buffer,0,i)}registerExternalBuffer(e,n,t){let o;if(t){if(o=this.externalBuffers.get(t),o===void 0)throw new Error("previous buffer is not registered");if(e===t)return Ne("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${n}) => id=${o}, buffer is the same, skip.`),o;if(this.backend.capturedCommandList.has(this.backend.currentSessionId))throw new Error(`Registering a different external buffer under graph capture mode is not supported yet. - Please use the previous external buffer!`);this.externalBuffers.delete(t)}else o=Vh();return this.storageCache.set(o,{gpuData:{id:o,type:0,buffer:e},originalSize:n}),this.externalBuffers.set(e,o),Ne("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${n}) => id=${o}, registered.`),o}unregisterExternalBuffer(e){let n=this.externalBuffers.get(e);n!==void 0&&(this.storageCache.delete(n),this.externalBuffers.delete(e),Ne("verbose",()=>`[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${n}`))}create(e,n=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST){let t=q_(e),o,i=(n&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE,s=(n&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM;if(i||s){let l=(i?this.freeBuffers:this.freeUniformBuffers).get(t);l?l.length>0?o=l.pop():o=this.backend.device.createBuffer({size:t,usage:n}):o=this.backend.device.createBuffer({size:t,usage:n})}else o=this.backend.device.createBuffer({size:t,usage:n});let a={id:Vh(),type:0,buffer:o};return this.storageCache.set(a.id,{gpuData:a,originalSize:e}),Ne("verbose",()=>`[WebGPU] GpuDataManager.create(size=${e}) => id=${a.id}`),a}get(e){return this.storageCache.get(e)?.gpuData}release(e){let n=this.storageCache.get(e);if(!n)throw new Error("releasing data does not exist");return Ne("verbose",()=>`[WebGPU] GpuDataManager.release(id=${e}), gpuDataId=${n.gpuData.id}`),this.storageCache.delete(e),this.buffersPending.push(n.gpuData.buffer),n.originalSize}async download(e,n){let t=this.storageCache.get(e);if(!t)throw new Error("data does not exist");await Gs(this.backend,t.gpuData.buffer,t.originalSize,n)}refreshPendingBuffers(){for(let e of this.buffersForUploadingPending)e.destroy();if(this.buffersForUploadingPending=[],this.buffersPending.length!==0)if(this.backend.sessionStatus==="default"){for(let e of this.buffersPending){let n=Mh.get(e.size);if((e.usage&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE){let t=this.freeBuffers.get(e.size)||[];n===void 0||t.length>=n?e.destroy():t.push(e)}else if((e.usage&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM){let t=this.freeUniformBuffers.get(e.size)||[];n===void 0||t.length>=n?e.destroy():t.push(e)}else e.destroy()}this.buffersPending=[]}else{let e=this.capturedPendingBuffers.get(this.backend.currentSessionId);e||(e=[],this.capturedPendingBuffers.set(this.backend.currentSessionId,e));for(let n of this.buffersPending)e.push(n);this.buffersPending=[]}}dispose(){this.freeBuffers.forEach(e=>{e.forEach(n=>{n.destroy()})}),this.freeUniformBuffers.forEach(e=>{e.forEach(n=>{n.destroy()})}),this.storageCache.forEach(e=>{e.gpuData.buffer.destroy()}),this.capturedPendingBuffers.forEach(e=>{e.forEach(n=>{n.destroy()})}),this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.capturedPendingBuffers=new Map}onReleaseSession(e){let n=this.capturedPendingBuffers.get(e);n&&(n.forEach(t=>{t.destroy()}),this.capturedPendingBuffers.delete(e))}},Uh=(...r)=>new Vs(...r)});var Us,de,et=C(()=>{"use strict";Us=class{constructor(e){Object.assign(this,e)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map(e=>`${this[e]}`).join(";")),this.key}},de=r=>new Us(r)});var Ws,nr,B,Xr,Oi,Ei,Ci,ye=C(()=>{"use strict";Ws=class{static calcMatMulShape(e,n){return e[1]!==n[0]?void 0:[e[0],n[1]]}},nr=class{static calcShape(e,n,t=!1){let o=e.length,i=n.length;if(o===0)return n;if(i===0)return e;let s=Math.max(e.length,n.length),a=new Array(s);if(t){if(o<2||i<2)return;let u=Ws.calcMatMulShape([e[o-2],e[o-1]],[n[i-2],n[i-1]]);if(u===void 0)return;[a[s-2],a[s-1]]=u}for(let u=t?3:1;u<=s;u++){let l=o-u<0?1:e[o-u],f=i-u<0?1:n[i-u];if(l!==f&&l>1&&f>1)return;let c=Math.max(l,f);if(l&&f)a[s-u]=Math.max(l,f);else{if(c>1)return;a[s-u]=0}}return a}static isValidBroadcast(e,n){let t=e.length,o=n.length;if(t>o)return!1;for(let i=1;i<=t;i++)if(e[t-i]!==1&&e[t-i]!==n[o-i])return!1;return!0}},B=class r{static size(e){return r.getSizeFromDimensionRange(e,0,e.length)}static convertShape(e,n=4){let t=e.length;if(t===0)return[];let o=new Array(t),i=t-1;for(;i>=0;){if(e[i]%n===0){o[i]=e[i]/n;break}if(n%e[i]!==0)throw new Error("cannot convert shape");o[i]=1,n/=e[i],i--}for(i--;i>=0;i--)o[i]=e[i];return o}static sizeFromDimension(e,n){if(n<0||n>e.length)throw new Error(`invalid dimension of ${n} for sizeFromDimension as Tensor has ${e.length} dimensions.`);return r.getSizeFromDimensionRange(e,n,e.length)}static sizeToDimension(e,n){if(n<0||n>e.length)throw new Error(`invalid dimension of ${n} for sizeToDimension as Tensor has ${e.length} dimensions.`);return r.getSizeFromDimensionRange(e,0,n)}static getSizeFromDimensionRange(e,n,t){let o=1;for(let i=n;i=0;--o)t[o]=t[o+1]*e[o+1];return t}static normalizeAxis(e,n){if(e<-n&&e>=n)throw new Error("unsupported axis for this operation.");return e<0?e+n:e}static normalizeAxes(e,n){return e.map(t=>this.normalizeAxis(t,n??e.length))}static sortBasedOnPerm(e,n){return n?n.map(t=>e[t]):e.slice().reverse()}static padShape(e,n){let t=e.length;return e.map((o,i)=>o+n[i]+n[i+t])}static areEqual(e,n){return e.length!==n.length?!1:e.every((t,o)=>t===n[o])}},Xr=class r{static adjustPoolAttributes(e,n,t,o,i,s){if(!e&&t.length!==n.length-2)throw new Error("length of specified kernel shapes should be 2 less than length of input dimensions");if(e)for(let a=0;a=t.length?t.push(n[a+2]):t[a]=n[a+2];for(let a=0;a=t[a]||s[a+t.length]>=t[a])throw new Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(e,n,t,o,i,s,a){if(a){if(i.length!==2*(e.length-2))throw new Error("length of pads should be twice the length of data dimensions");if(n.length!==e.length-2)throw new Error("length of strides should be the length of data dimensions");if(o.length!==e.length-2)throw new Error("length of kernel shapes should be the length of data dimensions");for(let u=0;u{"use strict";ue();ye();Zr=64,qs=(r,e)=>{if(e===3)throw new Error("vec3 has same alignment as vec4, use vec4 instead");switch(r){case 10:return e>1?`vec${e}`:"f16";case 1:return e>1?`vec${e}`:"f32";case 6:return e>1?`vec${e}`:"i32";case 12:return e>1?`vec${e}`:"u32";case 7:if(e>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","i32"];case 13:if(e>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","u32"];case 9:if(e!==4)throw new Error("bool must be vec4");return["u32","vec4"];default:throw new Error(`Unknown data type: ${r}`)}},Be=(r,e=1)=>{let n=qs(r,e);return typeof n=="string"?n:n[0]},ct=(r,e=1)=>{let n=qs(r,e);return typeof n=="string"?n:n[1]},W=(...r)=>{let e=[];return r.forEach(n=>{n.length!==0&&e.push({type:12,data:n},{type:12,data:B.computeStrides(n)})}),e},ze=r=>r%4===0?4:r%2===0?2:1,Pr=(r="f32",e,n="0")=>!e||e===1?`${r}(${n})`:`vec${e}<${r}>(${n})`,Yr=(r,e,n)=>r==="f32"?n:e===1?`f32(${n})`:`vec${e}(${n})`,Ut=(r,e)=>e===4?`(${r}.x + ${r}.y + ${r}.z + ${r}.w)`:e===2?`(${r}.x + ${r}.y)`:e===3?`(${r}.x + ${r}.y + ${r}.z)`:r,Z=(r,e,n,t)=>r.startsWith("uniforms.")&&n>4?typeof e=="string"?t==="f16"?`${r}[(${e}) / 8][(${e}) % 8 / 4][(${e}) % 8 % 4]`:`${r}[(${e}) / 4][(${e}) % 4]`:t==="f16"?`${r}[${Math.floor(e/8)}][${Math.floor(e%8/4)}][${e%8%4}]`:`${r}[${Math.floor(e/4)}][${e%4}]`:n>1?`${r}[${e}]`:r,Ks=(r,e,n,t,o)=>{let i=typeof n=="number",s=i?n:n.length,a=[...new Array(s).keys()],u=s<2?"u32":s<=4?`vec${s}`:`array`,l=qs(e,o),f=typeof l=="string"?l:l[1],c=typeof l=="string"?l:l[0],p={indices:u,value:f,storage:c,tensor:e},b=V=>typeof V=="string"?V:`${V}u`,h={offsetToIndices:!1,indicesToOffset:!1,broadcastedIndicesToOffset:!1,set:!1,setByIndices:!1,get:!1,getByIndices:!1},g=i?"uniforms.":"",T=`${g}${r}_shape`,w=`${g}${r}_strides`,v="";for(let V=0;Vne.name).join(", ")}) => ${x.name}>`,w0(sl(y,d))}function I0(d){return d=lo(d>>>0),At(c[d])}function S0(d,m){return m>>>=0,d=$t(d>>>0),m=$t(m),At(d[m])}function $0(d){9<(d>>>=0)&&(cr[d+1]+=1)}function A0(){return At([])}function P0(d){d=$t(d>>>0);for(var m=Array(d.length),y=0;y>>0))}function E0(){return At({})}function C0(d){for(var m=$t(d>>>=0);m.length;){var y=m.pop();m.pop()(y)}ca(d)}function k0(d,m,y){m>>>=0,y>>>=0,d=$t(d>>>0),m=$t(m),y=$t(y),d[m]=y}function D0(d,m){return m>>>=0,d=(d=ma(d>>>0,"_emval_take_value")).readValueFromPointer(m),At(d)}function B0(d,m){d=-9007199254740992>d||9007199254740992>>=0,d=new Date(1e3*d),i()[m>>>2>>>0]=d.getUTCSeconds(),i()[m+4>>>2>>>0]=d.getUTCMinutes(),i()[m+8>>>2>>>0]=d.getUTCHours(),i()[m+12>>>2>>>0]=d.getUTCDate(),i()[m+16>>>2>>>0]=d.getUTCMonth(),i()[m+20>>>2>>>0]=d.getUTCFullYear()-1900,i()[m+24>>>2>>>0]=d.getUTCDay(),d=(d.getTime()-Date.UTC(d.getUTCFullYear(),0,1,0,0,0,0))/864e5|0,i()[m+28>>>2>>>0]=d}var on=d=>d%4==0&&(d%100!=0||d%400==0),ul=[0,31,60,91,121,152,182,213,244,274,305,335],ll=[0,31,59,90,120,151,181,212,243,273,304,334];function L0(d,m){d=-9007199254740992>d||9007199254740992>>=0,d=new Date(1e3*d),i()[m>>>2>>>0]=d.getSeconds(),i()[m+4>>>2>>>0]=d.getMinutes(),i()[m+8>>>2>>>0]=d.getHours(),i()[m+12>>>2>>>0]=d.getDate(),i()[m+16>>>2>>>0]=d.getMonth(),i()[m+20>>>2>>>0]=d.getFullYear()-1900,i()[m+24>>>2>>>0]=d.getDay();var y=(on(d.getFullYear())?ul:ll)[d.getMonth()]+d.getDate()-1|0;i()[m+28>>>2>>>0]=y,i()[m+36>>>2>>>0]=-60*d.getTimezoneOffset(),y=new Date(d.getFullYear(),6,1).getTimezoneOffset();var x=new Date(d.getFullYear(),0,1).getTimezoneOffset();d=0|(y!=x&&d.getTimezoneOffset()==Math.min(x,y)),i()[m+32>>>2>>>0]=d}function R0(d){d>>>=0;var m=new Date(i()[d+20>>>2>>>0]+1900,i()[d+16>>>2>>>0],i()[d+12>>>2>>>0],i()[d+8>>>2>>>0],i()[d+4>>>2>>>0],i()[d>>>2>>>0],0),y=i()[d+32>>>2>>>0],x=m.getTimezoneOffset(),_=new Date(m.getFullYear(),6,1).getTimezoneOffset(),O=new Date(m.getFullYear(),0,1).getTimezoneOffset(),R=Math.min(O,_);return 0>y?i()[d+32>>>2>>>0]=+(_!=O&&R==x):0>>2>>>0]=m.getDay(),y=(on(m.getFullYear())?ul:ll)[m.getMonth()]+m.getDate()-1|0,i()[d+28>>>2>>>0]=y,i()[d>>>2>>>0]=m.getSeconds(),i()[d+4>>>2>>>0]=m.getMinutes(),i()[d+8>>>2>>>0]=m.getHours(),i()[d+12>>>2>>>0]=m.getDate(),i()[d+16>>>2>>>0]=m.getMonth(),i()[d+20>>>2>>>0]=m.getYear(),d=m.getTime(),BigInt(isNaN(d)?-1:d/1e3)}function cl(d,m,y,x,_,O,R){return g?We(16,1,d,m,y,x,_,O,R):-52}function fl(d,m,y,x,_,O){if(g)return We(17,1,d,m,y,x,_,O)}function N0(d,m,y,x){d>>>=0,m>>>=0,y>>>=0,x>>>=0;var _=new Date().getFullYear(),O=new Date(_,0,1),R=new Date(_,6,1);_=O.getTimezoneOffset();var M=R.getTimezoneOffset(),K=Math.max(_,M);s()[d>>>2>>>0]=60*K,i()[m>>>2>>>0]=+(_!=M),O=(d=Y=>Y.toLocaleTimeString(void 0,{hour12:!1,timeZoneName:"short"}).split(" ")[1])(O),R=d(R),M<_?(nn(O,y,17),nn(R,x,17)):(nn(O,x,17),nn(R,y,17))}var ga=[],dl=(d,m)=>{ga.length=0;for(var y;y=n()[d++>>>0];){var x=y!=105;m+=(x&=y!=112)&&m%8?4:0,ga.push(y==112?s()[m>>>2>>>0]:y==106?V[m>>>3]:y==105?i()[m>>>2>>>0]:u()[m>>>3>>>0]),m+=x?8:4}return ga};function z0(d,m,y){return d>>>=0,m=dl(m>>>0,y>>>0),ta[d](...m)}function F0(d,m,y){return d>>>=0,m=dl(m>>>0,y>>>0),ta[d](...m)}var M0=()=>{},V0=()=>Date.now();function G0(d,m){return F(ot(d>>>0,m>>>0))}var pl,U0=()=>{throw Er+=1,"unwind"};function W0(){return 4294901760}pl=()=>performance.timeOrigin+performance.now();var H0=()=>navigator.hardwareConcurrency;function q0(){return rn("Cannot use emscripten_pc_get_function without -sUSE_OFFSET_CONVERTER"),0}function j0(d){d>>>=0;var m=n().length;if(d<=m||4294901760=y;y*=2){var x=m*(1+.2/y);x=Math.min(x,d+100663296);var _=Math;x=Math.max(d,x);e:{_=(_.min.call(_,4294901760,x+(65536-x%65536)%65536)-ae.buffer.byteLength+65535)/65536;try{ae.grow(_),Fe();var O=1;break e}catch{}O=void 0}if(O)return!0}return!1}var co=()=>(rn("Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER"),0),an={},ml=d=>{d.forEach(m=>{var y=co();y&&(an[y]=m)})};function K0(){var d=Error().stack.toString().split(` +`);return d[0]=="Error"&&d.shift(),ml(d),an.Ob=co(),an.ac=d,an.Ob}function X0(d,m,y){if(d>>>=0,m>>>=0,an.Ob==d)var x=an.ac;else(x=Error().stack.toString().split(` +`))[0]=="Error"&&x.shift(),ml(x);for(var _=3;x[_]&&co()!=d;)++_;for(d=0;d>>2>>>0]=co();return d}var ba,ya={},hl=()=>{if(!ba){var d,m={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:P||"./this.program"};for(d in ya)ya[d]===void 0?delete m[d]:m[d]=ya[d];var y=[];for(d in m)y.push(`${d}=${m[d]}`);ba=y}return ba};function gl(d,m){if(g)return We(18,1,d,m);d>>>=0,m>>>=0;var y=0;return hl().forEach((x,_)=>{var O=m+y;for(_=s()[d+4*_>>>2>>>0]=O,O=0;O>>0]=x.charCodeAt(O);e()[_>>>0]=0,y+=x.length+1}),0}function bl(d,m){if(g)return We(19,1,d,m);d>>>=0,m>>>=0;var y=hl();s()[d>>>2>>>0]=y.length;var x=0;return y.forEach(_=>x+=_.length+1),s()[m>>>2>>>0]=x,0}function yl(d){return g?We(20,1,d):52}function xl(d,m,y,x){return g?We(21,1,d,m,y,x):52}function vl(d,m,y,x){return g?We(22,1,d,m,y,x):70}var Z0=[null,[],[]];function wl(d,m,y,x){if(g)return We(23,1,d,m,y,x);m>>>=0,y>>>=0,x>>>=0;for(var _=0,O=0;O>>2>>>0],M=s()[m+4>>>2>>>0];m+=8;for(var K=0;K>>0],ne=Z0[d];Y===0||Y===10?((d===1?j:F)(Ru(ne,0)),ne.length=0):ne.push(Y)}_+=M}return s()[x>>>2>>>0]=_,0}var Tl=[31,29,31,30,31,30,31,31,30,31,30,31],_l=[31,28,31,30,31,30,31,31,30,31,30,31],Y0=(d,m)=>{e().set(d,m>>>0)};function Il(d,m,y,x){function _(L,fe,Le){for(L=typeof L=="number"?L.toString():L||"";L.lengthzl?-1:0kr-L.getDate())){L.setDate(L.getDate()+fe);break}fe-=kr-L.getDate()+1,L.setDate(1),11>Le?L.setMonth(Le+1):(L.setMonth(0),L.setFullYear(L.getFullYear()+1))}return Le=new Date(L.getFullYear()+1,0,4),fe=M(new Date(L.getFullYear(),0,4)),Le=M(Le),0>=R(fe,L)?0>=R(Le,L)?L.getFullYear()+1:L.getFullYear():L.getFullYear()-1}d>>>=0,m>>>=0,y>>>=0,x>>>=0;var Y=s()[x+40>>>2>>>0];for(var ne in x={fc:i()[x>>>2>>>0],ec:i()[x+4>>>2>>>0],Gb:i()[x+8>>>2>>>0],Kb:i()[x+12>>>2>>>0],Hb:i()[x+16>>>2>>>0],Cb:i()[x+20>>>2>>>0],ub:i()[x+24>>>2>>>0],Bb:i()[x+28>>>2>>>0],nc:i()[x+32>>>2>>>0],dc:i()[x+36>>>2>>>0],hc:Y?ot(Y):""},y=ot(y),Y={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"})y=y.replace(new RegExp(ne,"g"),Y[ne]);var Ae="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),Ce="January February March April May June July August September October November December".split(" ");for(ne in Y={"%a":L=>Ae[L.ub].substring(0,3),"%A":L=>Ae[L.ub],"%b":L=>Ce[L.Hb].substring(0,3),"%B":L=>Ce[L.Hb],"%C":L=>O((L.Cb+1900)/100|0,2),"%d":L=>O(L.Kb,2),"%e":L=>_(L.Kb,2," "),"%g":L=>K(L).toString().substring(2),"%G":K,"%H":L=>O(L.Gb,2),"%I":L=>((L=L.Gb)==0?L=12:12{for(var fe=0,Le=0;Le<=L.Hb-1;fe+=(on(L.Cb+1900)?Tl:_l)[Le++]);return O(L.Kb+fe,3)},"%m":L=>O(L.Hb+1,2),"%M":L=>O(L.ec,2),"%n":()=>` +`,"%p":L=>0<=L.Gb&&12>L.Gb?"AM":"PM","%S":L=>O(L.fc,2),"%t":()=>" ","%u":L=>L.ub||7,"%U":L=>O(Math.floor((L.Bb+7-L.ub)/7),2),"%V":L=>{var fe=Math.floor((L.Bb+7-(L.ub+6)%7)/7);if(2>=(L.ub+371-L.Bb-2)%7&&fe++,fe)fe==53&&((Le=(L.ub+371-L.Bb)%7)==4||Le==3&&on(L.Cb)||(fe=1));else{fe=52;var Le=(L.ub+7-L.Bb-1)%7;(Le==4||Le==5&&on(L.Cb%400-1))&&fe++}return O(fe,2)},"%w":L=>L.ub,"%W":L=>O(Math.floor((L.Bb+7-(L.ub+6)%7)/7),2),"%y":L=>(L.Cb+1900).toString().substring(2),"%Y":L=>L.Cb+1900,"%z":L=>{var fe=0<=(L=L.dc);return L=Math.abs(L)/60,(fe?"+":"-")+("0000"+(L/60*100+L%60)).slice(-4)},"%Z":L=>L.hc,"%%":()=>"%"},y=y.replace(/%%/g,"\0\0"),Y)y.includes(ne)&&(y=y.replace(new RegExp(ne,"g"),Y[ne](x)));return ne=function(L){var fe=Array(aa(L)+1);return Fu(L,fe,0,fe.length),fe}(y=y.replace(/\0\0/g,"%")),ne.length>m?0:(Y0(ne,d),ne.length-1)}function J0(d,m,y,x){return Il(d>>>0,m>>>0,y>>>0,x>>>0)}g||function(){for(var d=c.numThreads-1;d--;)ku();je.unshift(()=>{rt++,function(m){g?m():Promise.all(gr.map(Cu)).then(m)}(()=>no())})}();for(var Sl=Array(256),fo=0;256>fo;++fo)Sl[fo]=String.fromCharCode(fo);Yu=Sl,br=c.BindingError=class extends Error{constructor(d){super(d),this.name="BindingError"}},c.InternalError=class extends Error{constructor(d){super(d),this.name="InternalError"}},cr.push(0,1,void 0,1,null,1,!0,1,!1,1),c.count_emval_handles=()=>cr.length/2-5-la.length;var Q0=[oa,Au,Du,Nu,zu,Mu,Vu,Gu,Uu,Wu,Hu,qu,ju,Ku,Xu,Zu,cl,fl,gl,bl,yl,xl,vl,wl],te=function(){function d(y,x){return te=y.exports,te=function(){var _=te,O={};for(let[R,M]of Object.entries(_))O[R]=typeof M=="function"?(...K)=>{so.push(R);try{return M(...K)}finally{tt||(so.pop(),Zt&&xr===1&&so.length===0&&(xr=0,Er+=1,ao(Bl),typeof Fibers<"u"&&Fibers.oc()))}}:M;return O}(),te=function(){var _=te,O=M=>K=>M(K)>>>0,R=M=>()=>M()>>>0;return(_=Object.assign({},_)).Ca=O(_.Ca),_.fb=R(_.fb),_.gb=O(_.gb),_.emscripten_main_runtime_thread_id=R(_.emscripten_main_runtime_thread_id),_.sb=O(_.sb),_.tb=R(_.tb),_}(),Pu.push(te.ib),tn.unshift(te.Ba),qe=x,no(),te}var m=Su();if(rt++,c.instantiateWasm)try{return c.instantiateWasm(m,d)}catch(y){F(`Module.instantiateWasm callback failed with error: ${y}`),f(y)}return vu||=c.locateFile?wu("ort-wasm-simd-threaded.jsep.wasm")?"ort-wasm-simd-threaded.jsep.wasm":c.locateFile?c.locateFile("ort-wasm-simd-threaded.jsep.wasm",N):N+"ort-wasm-simd-threaded.jsep.wasm":new URL("ort-wasm-simd-threaded.jsep.wasm",import.meta.url).href,function(y,x){var _=vu;return typeof WebAssembly.instantiateStreaming!="function"||wu(_)||Tu(_)||typeof fetch!="function"?Iu(_,y,x):fetch(_,{credentials:"same-origin"}).then(O=>WebAssembly.instantiateStreaming(O,y).then(x,function(R){return F(`wasm streaming compile failed: ${R}`),F("falling back to ArrayBuffer instantiation"),Iu(_,y,x)}))}(m,function(y){d(y.instance,y.module)}).catch(f),{}}(),$l=d=>($l=te.Ca)(d),Al=()=>(Al=te.Da)();c._OrtInit=(d,m)=>(c._OrtInit=te.Ea)(d,m),c._OrtGetLastError=(d,m)=>(c._OrtGetLastError=te.Fa)(d,m),c._OrtCreateSessionOptions=(d,m,y,x,_,O,R,M,K,Y)=>(c._OrtCreateSessionOptions=te.Ga)(d,m,y,x,_,O,R,M,K,Y),c._OrtAppendExecutionProvider=(d,m)=>(c._OrtAppendExecutionProvider=te.Ha)(d,m),c._OrtAddFreeDimensionOverride=(d,m,y)=>(c._OrtAddFreeDimensionOverride=te.Ia)(d,m,y),c._OrtAddSessionConfigEntry=(d,m,y)=>(c._OrtAddSessionConfigEntry=te.Ja)(d,m,y),c._OrtReleaseSessionOptions=d=>(c._OrtReleaseSessionOptions=te.Ka)(d),c._OrtCreateSession=(d,m,y)=>(c._OrtCreateSession=te.La)(d,m,y),c._OrtReleaseSession=d=>(c._OrtReleaseSession=te.Ma)(d),c._OrtGetInputOutputCount=(d,m,y)=>(c._OrtGetInputOutputCount=te.Na)(d,m,y),c._OrtGetInputName=(d,m)=>(c._OrtGetInputName=te.Oa)(d,m),c._OrtGetOutputName=(d,m)=>(c._OrtGetOutputName=te.Pa)(d,m),c._OrtFree=d=>(c._OrtFree=te.Qa)(d),c._OrtCreateTensor=(d,m,y,x,_,O)=>(c._OrtCreateTensor=te.Ra)(d,m,y,x,_,O),c._OrtGetTensorData=(d,m,y,x,_)=>(c._OrtGetTensorData=te.Sa)(d,m,y,x,_),c._OrtReleaseTensor=d=>(c._OrtReleaseTensor=te.Ta)(d),c._OrtCreateRunOptions=(d,m,y,x)=>(c._OrtCreateRunOptions=te.Ua)(d,m,y,x),c._OrtAddRunConfigEntry=(d,m,y)=>(c._OrtAddRunConfigEntry=te.Va)(d,m,y),c._OrtReleaseRunOptions=d=>(c._OrtReleaseRunOptions=te.Wa)(d),c._OrtCreateBinding=d=>(c._OrtCreateBinding=te.Xa)(d),c._OrtBindInput=(d,m,y)=>(c._OrtBindInput=te.Ya)(d,m,y),c._OrtBindOutput=(d,m,y,x)=>(c._OrtBindOutput=te.Za)(d,m,y,x),c._OrtClearBoundOutputs=d=>(c._OrtClearBoundOutputs=te._a)(d),c._OrtReleaseBinding=d=>(c._OrtReleaseBinding=te.$a)(d),c._OrtRunWithBinding=(d,m,y,x,_)=>(c._OrtRunWithBinding=te.ab)(d,m,y,x,_),c._OrtRun=(d,m,y,x,_,O,R,M)=>(c._OrtRun=te.bb)(d,m,y,x,_,O,R,M),c._OrtEndProfiling=d=>(c._OrtEndProfiling=te.cb)(d),c._JsepOutput=(d,m,y)=>(c._JsepOutput=te.db)(d,m,y),c._JsepGetNodeName=d=>(c._JsepGetNodeName=te.eb)(d);var po,sn=()=>(sn=te.fb)(),mo=c._malloc=d=>(mo=c._malloc=te.gb)(d),Yt=c._free=d=>(Yt=c._free=te.hb)(d),xa=(d,m,y,x,_,O)=>(xa=te.kb)(d,m,y,x,_,O),Pl=()=>(Pl=te.lb)(),Ol=(d,m,y,x,_)=>(Ol=te.mb)(d,m,y,x,_),va=d=>(va=te.nb)(d),ho=d=>(ho=te.ob)(d),El=()=>(El=te.pb)(),Cl=(d,m)=>(Cl=te.qb)(d,m),go=d=>(go=te.rb)(d),wa=d=>(wa=te.sb)(d),Ta=()=>(Ta=te.tb)(),kl=c.dynCall_ii=(d,m)=>(kl=c.dynCall_ii=te.vb)(d,m),Dl=d=>(Dl=te.wb)(d),Bl=()=>(Bl=te.xb)(),Ll=d=>(Ll=te.yb)(d),Rl=()=>(Rl=te.zb)();function Nl(){if(!(0Ta(),c.stackRestore=d=>go(d),c.stackAlloc=d=>wa(d),c.UTF8ToString=ot,c.stringToUTF8=nn,c.lengthBytesUTF8=aa,hr=function d(){po||Nl(),po||(hr=d)},Nl(),p}),B_=Ih;globalThis.self?.name==="em-pthread"&&Ih()});var Tn,L_,R_,N_,Ah,Ph,z_,Oh,Hn=C(()=>{"use strict";hi();Tn=!1?void 0:import.meta.url??(typeof document<"u"?document.currentScript?.src:typeof self<"u"?self.location?.href:void 0),L_=!1||typeof location>"u"?void 0:location.origin,R_=(r,e)=>{try{let n=e??Tn;return(n?new URL(r,n):new URL(r)).origin===L_}catch{return!1}},N_=async r=>{let n=await(await fetch(r,{credentials:"same-origin"})).blob();return URL.createObjectURL(n)},Ah=(_h(),Pn(Th)).default,Ph=async()=>{if(!Tn)throw new Error("Failed to load proxy worker: cannot determine the script source URL.");if(R_(Tn))return[void 0,Ah()];let r=await N_(Tn);return[r,Ah(r)]},z_=($h(),Pn(Sh)).default,Oh=async(r,e,n)=>[void 0,z_]});var Ls,Rs,Ii,Eh,F_,M_,gi,Ye,jr=C(()=>{"use strict";Hn();Rs=!1,Ii=!1,Eh=!1,F_=()=>{if(typeof SharedArrayBuffer>"u")return!1;try{return typeof MessageChannel<"u"&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},M_=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},gi=async r=>{if(Rs)return Promise.resolve();if(Ii)throw new Error("multiple calls to 'initializeWebAssembly()' detected.");if(Eh)throw new Error("previous call to 'initializeWebAssembly()' failed.");Ii=!0;let e=r.initTimeout,n=r.numThreads;if(!M_())throw new Error("WebAssembly SIMD is not supported in the current environment.");let t=F_();n>1&&!t&&(typeof self<"u"&&!self.crossOriginIsolated&&console.warn("env.wasm.numThreads is set to "+n+", but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info."),console.warn("WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading."),r.numThreads=n=1);let o=r.wasmPaths,i=typeof o=="string"?o:void 0,s=o?.mjs,a=s?.href??s,u=o?.wasm,l=u?.href??u,[f,c]=await Oh(a,i,n>1),p=!1,b=[];if(e>0&&b.push(new Promise(h=>{setTimeout(()=>{p=!0,h()},e)})),b.push(new Promise((h,g)=>{let T={numThreads:n};(l||i)&&(T.locateFile=(w,v)=>l??(i??v)+w),c(T).then(w=>{Ii=!1,Rs=!0,Ls=w,h(),f&&URL.revokeObjectURL(f)},w=>{Ii=!1,Eh=!0,g(w)})})),await Promise.race(b),p)throw new Error(`WebAssembly backend initializing failed due to timeout: ${e}ms`)},Ye=()=>{if(Rs&&Ls)return Ls;throw new Error("WebAssembly is not initialized yet.")}});var nt,jn,Ue,Si=C(()=>{"use strict";jr();nt=(r,e)=>{let n=Ye(),t=n.lengthBytesUTF8(r)+1,o=n._malloc(t);return n.stringToUTF8(r,o,t),e.push(o),o},jn=(r,e,n,t)=>{if(typeof r=="object"&&r!==null){if(n.has(r))throw new Error("Circular reference in options");n.add(r)}Object.entries(r).forEach(([o,i])=>{let s=e?e+o:o;if(typeof i=="object")jn(i,s+".",n,t);else if(typeof i=="string"||typeof i=="number")t(s,i.toString());else if(typeof i=="boolean")t(s,i?"1":"0");else throw new Error(`Can't handle extra config type: ${typeof i}`)})},Ue=r=>{let e=Ye(),n=e.stackSave();try{let t=e.stackAlloc(8);e._OrtGetLastError(t,t+4);let o=e.HEAP32[t/4],i=e.HEAPU32[t/4+1],s=i?e.UTF8ToString(i):"";throw new Error(`${r} ERROR_CODE: ${o}, ERROR_MESSAGE: ${s}`)}finally{e.stackRestore(n)}}});var Ch,kh=C(()=>{"use strict";jr();Si();Ch=r=>{let e=Ye(),n=0,t=[],o=r||{};try{if(r?.logSeverityLevel===void 0)o.logSeverityLevel=2;else if(typeof r.logSeverityLevel!="number"||!Number.isInteger(r.logSeverityLevel)||r.logSeverityLevel<0||r.logSeverityLevel>4)throw new Error(`log serverity level is not valid: ${r.logSeverityLevel}`);if(r?.logVerbosityLevel===void 0)o.logVerbosityLevel=0;else if(typeof r.logVerbosityLevel!="number"||!Number.isInteger(r.logVerbosityLevel))throw new Error(`log verbosity level is not valid: ${r.logVerbosityLevel}`);r?.terminate===void 0&&(o.terminate=!1);let i=0;return r?.tag!==void 0&&(i=nt(r.tag,t)),n=e._OrtCreateRunOptions(o.logSeverityLevel,o.logVerbosityLevel,!!o.terminate,i),n===0&&Ue("Can't create run options."),r?.extra!==void 0&&jn(r.extra,"",new WeakSet,(s,a)=>{let u=nt(s,t),l=nt(a,t);e._OrtAddRunConfigEntry(n,u,l)!==0&&Ue(`Can't set a run config entry: ${s} - ${a}.`)}),[n,t]}catch(i){throw n!==0&&e._OrtReleaseRunOptions(n),t.forEach(s=>e._free(s)),i}}});var V_,G_,U_,W_,Dh,Bh=C(()=>{"use strict";jr();Si();V_=r=>{switch(r){case"disabled":return 0;case"basic":return 1;case"extended":return 2;case"all":return 99;default:throw new Error(`unsupported graph optimization level: ${r}`)}},G_=r=>{switch(r){case"sequential":return 0;case"parallel":return 1;default:throw new Error(`unsupported execution mode: ${r}`)}},U_=r=>{r.extra||(r.extra={}),r.extra.session||(r.extra.session={});let e=r.extra.session;e.use_ort_model_bytes_directly||(e.use_ort_model_bytes_directly="1"),r.executionProviders&&r.executionProviders.some(n=>(typeof n=="string"?n:n.name)==="webgpu")&&(r.enableMemPattern=!1)},W_=(r,e,n)=>{for(let t of e){let o=typeof t=="string"?t:t.name;switch(o){case"webnn":if(o="WEBNN",typeof t!="string"){let a=t?.deviceType;if(a){let u=nt("deviceType",n),l=nt(a,n);Ye()._OrtAddSessionConfigEntry(r,u,l)!==0&&Ue(`Can't set a session config entry: 'deviceType' - ${a}.`)}}break;case"webgpu":if(o="JS",typeof t!="string"){let s=t;if(s?.preferredLayout){if(s.preferredLayout!=="NCHW"&&s.preferredLayout!=="NHWC")throw new Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${s.preferredLayout}`);let a=nt("preferredLayout",n),u=nt(s.preferredLayout,n);Ye()._OrtAddSessionConfigEntry(r,a,u)!==0&&Ue(`Can't set a session config entry: 'preferredLayout' - ${s.preferredLayout}.`)}}break;case"wasm":case"cpu":continue;default:throw new Error(`not supported execution provider: ${o}`)}let i=nt(o,n);Ye()._OrtAppendExecutionProvider(r,i)!==0&&Ue(`Can't append execution provider: ${o}.`)}},Dh=r=>{let e=Ye(),n=0,t=[],o=r||{};U_(o);try{let i=V_(o.graphOptimizationLevel??"all"),s=G_(o.executionMode??"sequential"),a=typeof o.logId=="string"?nt(o.logId,t):0,u=o.logSeverityLevel??2;if(!Number.isInteger(u)||u<0||u>4)throw new Error(`log serverity level is not valid: ${u}`);let l=o.logVerbosityLevel??0;if(!Number.isInteger(l)||l<0||l>4)throw new Error(`log verbosity level is not valid: ${l}`);let f=typeof o.optimizedModelFilePath=="string"?nt(o.optimizedModelFilePath,t):0;if(n=e._OrtCreateSessionOptions(i,!!o.enableCpuMemArena,!!o.enableMemPattern,s,!!o.enableProfiling,0,a,u,l,f),n===0&&Ue("Can't create session options."),o.executionProviders&&W_(n,o.executionProviders,t),o.enableGraphCapture!==void 0){if(typeof o.enableGraphCapture!="boolean")throw new Error(`enableGraphCapture must be a boolean value: ${o.enableGraphCapture}`);let c=nt("enableGraphCapture",t),p=nt(o.enableGraphCapture.toString(),t);e._OrtAddSessionConfigEntry(n,c,p)!==0&&Ue(`Can't set a session config entry: 'enableGraphCapture' - ${o.enableGraphCapture}.`)}if(o.freeDimensionOverrides)for(let[c,p]of Object.entries(o.freeDimensionOverrides)){if(typeof c!="string")throw new Error(`free dimension override name must be a string: ${c}`);if(typeof p!="number"||!Number.isInteger(p)||p<0)throw new Error(`free dimension override value must be a non-negative integer: ${p}`);let b=nt(c,t);e._OrtAddFreeDimensionOverride(n,b,p)!==0&&Ue(`Can't set a free dimension override: ${c} - ${p}.`)}return o.extra!==void 0&&jn(o.extra,"",new WeakSet,(c,p)=>{let b=nt(c,t),h=nt(p,t);e._OrtAddSessionConfigEntry(n,b,h)!==0&&Ue(`Can't set a session config entry: ${c} - ${p}.`)}),[n,t]}catch(i){throw n!==0&&e._OrtReleaseSessionOptions(n),t.forEach(s=>e._free(s)),i}}});var Ns,Ar,Kr,$i,Kn,Ai,zs,ue=C(()=>{"use strict";Ns=r=>{switch(r){case"int8":return 3;case"uint8":return 2;case"bool":return 9;case"int16":return 5;case"uint16":return 4;case"int32":return 6;case"uint32":return 12;case"float16":return 10;case"float32":return 1;case"float64":return 11;case"string":return 8;case"int64":return 7;case"uint64":return 13;default:throw new Error(`unsupported data type: ${r}`)}},Ar=r=>{switch(r){case 3:return"int8";case 2:return"uint8";case 9:return"bool";case 5:return"int16";case 4:return"uint16";case 6:return"int32";case 12:return"uint32";case 10:return"float16";case 1:return"float32";case 11:return"float64";case 8:return"string";case 7:return"int64";case 13:return"uint64";default:throw new Error(`unsupported data type: ${r}`)}},Kr=r=>[void 0,4,1,1,2,2,4,8,void 0,1,2,8,4,8,void 0,void 0,void 0][r],$i=r=>{switch(r){case"float16":return typeof Float16Array<"u"&&Float16Array.from?Float16Array:Uint16Array;case"float32":return Float32Array;case"uint8":return Uint8Array;case"int8":return Int8Array;case"uint16":return Uint16Array;case"int16":return Int16Array;case"int32":return Int32Array;case"bool":return Uint8Array;case"float64":return Float64Array;case"uint32":return Uint32Array;case"int64":return BigInt64Array;case"uint64":return BigUint64Array;default:throw new Error(`unsupported type: ${r}`)}},Kn=r=>{switch(r){case"verbose":return 0;case"info":return 1;case"warning":return 2;case"error":return 3;case"fatal":return 4;default:throw new Error(`unsupported logging level: ${r}`)}},Ai=r=>r==="float32"||r==="float16"||r==="int32"||r==="int64"||r==="uint32"||r==="uint8"||r==="bool",zs=r=>{switch(r){case"none":return 0;case"cpu":return 1;case"cpu-pinned":return 2;case"texture":return 3;case"gpu-buffer":return 4;default:throw new Error(`unsupported data location: ${r}`)}}});var Xn,Fs=C(()=>{"use strict";hi();Xn=async r=>{if(typeof r=="string")if(!1)try{let{readFile:e}=_a("node:fs/promises");return new Uint8Array(await e(r))}catch(e){if(e.code==="ERR_FS_FILE_TOO_LARGE"){let{createReadStream:n}=_a("node:fs"),t=n(r),o=[];for await(let i of t)o.push(i);return new Uint8Array(Buffer.concat(o))}throw e}else{let e=await fetch(r);if(!e.ok)throw new Error(`failed to load external data file: ${r}`);let n=e.headers.get("Content-Length"),t=n?parseInt(n,10):0;if(t<1073741824)return new Uint8Array(await e.arrayBuffer());{if(!e.body)throw new Error(`failed to load external data file: ${r}, no response body.`);let o=e.body.getReader(),i;try{i=new ArrayBuffer(t)}catch(a){if(a instanceof RangeError){let u=Math.ceil(t/65536);i=new WebAssembly.Memory({initial:u,maximum:u}).buffer}else throw a}let s=0;for(;;){let{done:a,value:u}=await o.read();if(a)break;let l=u.byteLength;new Uint8Array(i,s,l).set(u),s+=l}return new Uint8Array(i,0,t)}}else return r instanceof Blob?new Uint8Array(await r.arrayBuffer()):r instanceof Uint8Array?r:new Uint8Array(r)}});var H_,q_,Lh,Rh,Nh,j_,Ne,mr=C(()=>{"use strict";ue();H_=["V","I","W","E","F"],q_=(r,e)=>{console.log(`[${H_[r]},${new Date().toISOString()}]${e}`)},Nh=(r,e)=>{Lh=r,Rh=e},j_=(r,e)=>{let n=Kn(r),t=Kn(Lh);n>=t&&q_(n,typeof e=="function"?e():e)},Ne=(...r)=>{Rh&&j_(...r)}});var zh,Fh=C(()=>{"use strict";ue();zh=(r,e)=>new($i(e))(r)});var Pi=C(()=>{"use strict"});var Mh,Ms,Vs,K_,X_,Vh,Us,Gs,Uh,Wh=C(()=>{"use strict";mr();Pi();Mh=new Map([[64,250],[128,200],[256,200],[512,200],[2048,230],[4096,200],[8192,50],[16384,50],[32768,50],[65536,50],[131072,50],[262144,50],[524288,50],[1048576,50],[2097152,30],[4194304,20],[8388608,10],[12582912,10],[16777216,10],[26214400,15],[33554432,22],[44236800,2],[58982400,6],[67108864,6],[134217728,6],[167772160,6]]),Ms=[],Vs=r=>Math.ceil(r/16)*16,K_=r=>{for(let e=0;eX_++,Us=async(r,e,n,t)=>{let o=Vs(n),i=r.device.createBuffer({size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});try{let s=r.getCommandEncoder();r.endComputePass(),s.copyBufferToBuffer(e,0,i,0,o),r.flush(),await i.mapAsync(GPUMapMode.READ);let a=i.getMappedRange();if(t){let u=t();return u.set(new Uint8Array(a,0,n)),u}else return new Uint8Array(a.slice(0,n))}finally{i.destroy()}},Gs=class{constructor(e){this.backend=e;this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.buffersForUploadingPending=[],this.buffersPending=[],this.externalBuffers=new Map,this.capturedPendingBuffers=new Map;for(let[n]of Mh)Ms.push(n),this.freeBuffers.set(n,[]),this.freeUniformBuffers.set(n,[])}upload(e,n){let t=n.buffer,o=n.byteOffset,i=n.byteLength,s=Vs(i),a=this.storageCache.get(e);if(!a)throw new Error("gpu data for uploading does not exist");if(a.originalSize!==i)throw new Error(`inconsistent data size. gpu data size=${a.originalSize}, data size=${i}`);let u=this.backend.device.createBuffer({mappedAtCreation:!0,size:s,usage:GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC}),l=u.getMappedRange();new Uint8Array(l).set(new Uint8Array(t,o,i)),u.unmap();let f=this.backend.getCommandEncoder();this.backend.endComputePass(),f.copyBufferToBuffer(u,0,a.gpuData.buffer,0,s),Ne("verbose",()=>`[WebGPU] GpuDataManager.upload(id=${e})`),this.buffersForUploadingPending.push(u)}memcpy(e,n){let t=this.storageCache.get(e);if(!t)throw new Error("source gpu data for memcpy does not exist");let o=this.storageCache.get(n);if(!o)throw new Error("destination gpu data for memcpy does not exist");if(t.originalSize!==o.originalSize)throw new Error("inconsistent source and destination gpu data size");let i=Vs(t.originalSize),s=this.backend.getCommandEncoder();this.backend.endComputePass(),s.copyBufferToBuffer(t.gpuData.buffer,0,o.gpuData.buffer,0,i)}registerExternalBuffer(e,n,t){let o;if(t){if(o=this.externalBuffers.get(t),o===void 0)throw new Error("previous buffer is not registered");if(e===t)return Ne("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${n}) => id=${o}, buffer is the same, skip.`),o;if(this.backend.capturedCommandList.has(this.backend.currentSessionId))throw new Error(`Registering a different external buffer under graph capture mode is not supported yet. + Please use the previous external buffer!`);this.externalBuffers.delete(t)}else o=Vh();return this.storageCache.set(o,{gpuData:{id:o,type:0,buffer:e},originalSize:n}),this.externalBuffers.set(e,o),Ne("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${n}) => id=${o}, registered.`),o}unregisterExternalBuffer(e){let n=this.externalBuffers.get(e);n!==void 0&&(this.storageCache.delete(n),this.externalBuffers.delete(e),Ne("verbose",()=>`[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${n}`))}create(e,n=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST){let t=K_(e),o,i=(n&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE,s=(n&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM;if(i||s){let l=(i?this.freeBuffers:this.freeUniformBuffers).get(t);l?l.length>0?o=l.pop():o=this.backend.device.createBuffer({size:t,usage:n}):o=this.backend.device.createBuffer({size:t,usage:n})}else o=this.backend.device.createBuffer({size:t,usage:n});let a={id:Vh(),type:0,buffer:o};return this.storageCache.set(a.id,{gpuData:a,originalSize:e}),Ne("verbose",()=>`[WebGPU] GpuDataManager.create(size=${e}) => id=${a.id}`),a}get(e){return this.storageCache.get(e)?.gpuData}release(e){let n=this.storageCache.get(e);if(!n)throw new Error("releasing data does not exist");return Ne("verbose",()=>`[WebGPU] GpuDataManager.release(id=${e}), gpuDataId=${n.gpuData.id}`),this.storageCache.delete(e),this.buffersPending.push(n.gpuData.buffer),n.originalSize}async download(e,n){let t=this.storageCache.get(e);if(!t)throw new Error("data does not exist");await Us(this.backend,t.gpuData.buffer,t.originalSize,n)}refreshPendingBuffers(){for(let e of this.buffersForUploadingPending)e.destroy();if(this.buffersForUploadingPending=[],this.buffersPending.length!==0)if(this.backend.sessionStatus==="default"){for(let e of this.buffersPending){let n=Mh.get(e.size);if((e.usage&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE){let t=this.freeBuffers.get(e.size)||[];n===void 0||t.length>=n?e.destroy():t.push(e)}else if((e.usage&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM){let t=this.freeUniformBuffers.get(e.size)||[];n===void 0||t.length>=n?e.destroy():t.push(e)}else e.destroy()}this.buffersPending=[]}else{let e=this.capturedPendingBuffers.get(this.backend.currentSessionId);e||(e=[],this.capturedPendingBuffers.set(this.backend.currentSessionId,e));for(let n of this.buffersPending)e.push(n);this.buffersPending=[]}}dispose(){this.freeBuffers.forEach(e=>{e.forEach(n=>{n.destroy()})}),this.freeUniformBuffers.forEach(e=>{e.forEach(n=>{n.destroy()})}),this.storageCache.forEach(e=>{e.gpuData.buffer.destroy()}),this.capturedPendingBuffers.forEach(e=>{e.forEach(n=>{n.destroy()})}),this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.capturedPendingBuffers=new Map}onReleaseSession(e){let n=this.capturedPendingBuffers.get(e);n&&(n.forEach(t=>{t.destroy()}),this.capturedPendingBuffers.delete(e))}},Uh=(...r)=>new Gs(...r)});var Ws,de,et=C(()=>{"use strict";Ws=class{constructor(e){Object.assign(this,e)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map(e=>`${this[e]}`).join(";")),this.key}},de=r=>new Ws(r)});var Hs,nr,B,Xr,Oi,Ei,Ci,ye=C(()=>{"use strict";Hs=class{static calcMatMulShape(e,n){return e[1]!==n[0]?void 0:[e[0],n[1]]}},nr=class{static calcShape(e,n,t=!1){let o=e.length,i=n.length;if(o===0)return n;if(i===0)return e;let s=Math.max(e.length,n.length),a=new Array(s);if(t){if(o<2||i<2)return;let u=Hs.calcMatMulShape([e[o-2],e[o-1]],[n[i-2],n[i-1]]);if(u===void 0)return;[a[s-2],a[s-1]]=u}for(let u=t?3:1;u<=s;u++){let l=o-u<0?1:e[o-u],f=i-u<0?1:n[i-u];if(l!==f&&l>1&&f>1)return;let c=Math.max(l,f);if(l&&f)a[s-u]=Math.max(l,f);else{if(c>1)return;a[s-u]=0}}return a}static isValidBroadcast(e,n){let t=e.length,o=n.length;if(t>o)return!1;for(let i=1;i<=t;i++)if(e[t-i]!==1&&e[t-i]!==n[o-i])return!1;return!0}},B=class r{static size(e){return r.getSizeFromDimensionRange(e,0,e.length)}static convertShape(e,n=4){let t=e.length;if(t===0)return[];let o=new Array(t),i=t-1;for(;i>=0;){if(e[i]%n===0){o[i]=e[i]/n;break}if(n%e[i]!==0)throw new Error("cannot convert shape");o[i]=1,n/=e[i],i--}for(i--;i>=0;i--)o[i]=e[i];return o}static sizeFromDimension(e,n){if(n<0||n>e.length)throw new Error(`invalid dimension of ${n} for sizeFromDimension as Tensor has ${e.length} dimensions.`);return r.getSizeFromDimensionRange(e,n,e.length)}static sizeToDimension(e,n){if(n<0||n>e.length)throw new Error(`invalid dimension of ${n} for sizeToDimension as Tensor has ${e.length} dimensions.`);return r.getSizeFromDimensionRange(e,0,n)}static getSizeFromDimensionRange(e,n,t){let o=1;for(let i=n;i=0;--o)t[o]=t[o+1]*e[o+1];return t}static normalizeAxis(e,n){if(e<-n&&e>=n)throw new Error("unsupported axis for this operation.");return e<0?e+n:e}static normalizeAxes(e,n){return e.map(t=>this.normalizeAxis(t,n??e.length))}static sortBasedOnPerm(e,n){return n?n.map(t=>e[t]):e.slice().reverse()}static padShape(e,n){let t=e.length;return e.map((o,i)=>o+n[i]+n[i+t])}static areEqual(e,n){return e.length!==n.length?!1:e.every((t,o)=>t===n[o])}},Xr=class r{static adjustPoolAttributes(e,n,t,o,i,s){if(!e&&t.length!==n.length-2)throw new Error("length of specified kernel shapes should be 2 less than length of input dimensions");if(e)for(let a=0;a=t.length?t.push(n[a+2]):t[a]=n[a+2];for(let a=0;a=t[a]||s[a+t.length]>=t[a])throw new Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(e,n,t,o,i,s,a){if(a){if(i.length!==2*(e.length-2))throw new Error("length of pads should be twice the length of data dimensions");if(n.length!==e.length-2)throw new Error("length of strides should be the length of data dimensions");if(o.length!==e.length-2)throw new Error("length of kernel shapes should be the length of data dimensions");for(let u=0;u{"use strict";ue();ye();Zr=64,js=(r,e)=>{if(e===3)throw new Error("vec3 has same alignment as vec4, use vec4 instead");switch(r){case 10:return e>1?`vec${e}`:"f16";case 1:return e>1?`vec${e}`:"f32";case 6:return e>1?`vec${e}`:"i32";case 12:return e>1?`vec${e}`:"u32";case 7:if(e>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","i32"];case 13:if(e>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","u32"];case 9:if(e!==4)throw new Error("bool must be vec4");return["u32","vec4"];default:throw new Error(`Unknown data type: ${r}`)}},Be=(r,e=1)=>{let n=js(r,e);return typeof n=="string"?n:n[0]},ct=(r,e=1)=>{let n=js(r,e);return typeof n=="string"?n:n[1]},W=(...r)=>{let e=[];return r.forEach(n=>{n.length!==0&&e.push({type:12,data:n},{type:12,data:B.computeStrides(n)})}),e},ze=r=>r%4===0?4:r%2===0?2:1,Pr=(r="f32",e,n="0")=>!e||e===1?`${r}(${n})`:`vec${e}<${r}>(${n})`,Yr=(r,e,n)=>r==="f32"?n:e===1?`f32(${n})`:`vec${e}(${n})`,Ut=(r,e)=>e===4?`(${r}.x + ${r}.y + ${r}.z + ${r}.w)`:e===2?`(${r}.x + ${r}.y)`:e===3?`(${r}.x + ${r}.y + ${r}.z)`:r,Z=(r,e,n,t)=>r.startsWith("uniforms.")&&n>4?typeof e=="string"?t==="f16"?`${r}[(${e}) / 8][(${e}) % 8 / 4][(${e}) % 8 % 4]`:`${r}[(${e}) / 4][(${e}) % 4]`:t==="f16"?`${r}[${Math.floor(e/8)}][${Math.floor(e%8/4)}][${e%8%4}]`:`${r}[${Math.floor(e/4)}][${e%4}]`:n>1?`${r}[${e}]`:r,Ks=(r,e,n,t,o)=>{let i=typeof n=="number",s=i?n:n.length,a=[...new Array(s).keys()],u=s<2?"u32":s<=4?`vec${s}`:`array`,l=js(e,o),f=typeof l=="string"?l:l[1],c=typeof l=="string"?l:l[0],p={indices:u,value:f,storage:c,tensor:e},b=V=>typeof V=="string"?V:`${V}u`,h={offsetToIndices:!1,indicesToOffset:!1,broadcastedIndicesToOffset:!1,set:!1,setByIndices:!1,get:!1,getByIndices:!1},g=i?"uniforms.":"",T=`${g}${r}_shape`,w=`${g}${r}_strides`,v="";for(let V=0;V(h.offsetToIndices=!0,s<2?V:`o2i_${r}(${V})`),P=[];if(s>=2)for(let V=s-1;V>=0;V--)P.push(`${Z(w,V,s)} * (indices[${V}])`);let E=s<2?"":` fn i2o_${r}(indices: ${p.indices}) -> u32 { return ${P.join("+")}; - }`,N=V=>(h.indicesToOffset=!0,s<2?V:`i2o_${r}(${V})`),z=(...V)=>s===0?"0u":`${p.indices}(${V.map(b).join(",")})`,q=(V,ie)=>s<2?`${V}`:`${Z(V,ie,s)}`,K=(V,ie,Te)=>s<2?`${V}=${Te};`:`${Z(V,ie,s)}=${Te};`,F={},_e=(V,ie)=>{h.broadcastedIndicesToOffset=!0;let Te=`${ie.name}broadcastedIndicesTo${r}Offset`;if(Te in F)return`${Te}(${V})`;let tt=[];for(let Fe=s-1;Fe>=0;Fe--){let Ke=ie.indicesGet("outputIndices",Fe+ie.rank-s);tt.push(`${q(w,Fe)} * (${Ke} % ${q(T,Fe)})`)}return F[Te]=`fn ${Te}(outputIndices: ${ie.type.indices}) -> u32 { + }`,N=V=>(h.indicesToOffset=!0,s<2?V:`i2o_${r}(${V})`),z=(...V)=>s===0?"0u":`${p.indices}(${V.map(b).join(",")})`,q=(V,ie)=>s<2?`${V}`:`${Z(V,ie,s)}`,j=(V,ie,Te)=>s<2?`${V}=${Te};`:`${Z(V,ie,s)}=${Te};`,F={},_e=(V,ie)=>{h.broadcastedIndicesToOffset=!0;let Te=`${ie.name}broadcastedIndicesTo${r}Offset`;if(Te in F)return`${Te}(${V})`;let tt=[];for(let Fe=s-1;Fe>=0;Fe--){let je=ie.indicesGet("outputIndices",Fe+ie.rank-s);tt.push(`${q(w,Fe)} * (${je} % ${q(T,Fe)})`)}return F[Te]=`fn ${Te}(outputIndices: ${ie.type.indices}) -> u32 { return ${tt.length>0?tt.join("+"):"0u"}; }`,`${Te}(${V})`},$e=(V,ie)=>(()=>{if(p.storage===p.value)return`${r}[${V}]=${ie};`;if(p.storage==="vec2"&&p.value==="i32")return`${r}[${V}]=vec2(u32(${ie}), select(0u, 0xFFFFFFFFu, ${ie} < 0));`;if(p.storage==="vec2"&&p.value==="u32")return`${r}[${V}]=vec2(u32(${ie}), 0u);`;if(p.storage==="u32"&&p.value==="vec4")return`${r}[${V}]=dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(${ie}));`;throw new Error(`not supported combination of storage type ${p.storage} and value type ${p.value} yet`)})(),ae=V=>(()=>{if(p.storage===p.value)return`${r}[${V}]`;if(p.storage==="vec2"&&p.value==="i32")return`i32(${r}[${V}].x)`;if(p.storage==="vec2"&&p.value==="u32")return`u32(${r}[${V}].x)`;if(p.storage==="u32"&&p.value==="vec4")return`vec4(bool(${r}[${V}] & 0xFFu), bool(${r}[${V}] & 0xFF00u), bool(${r}[${V}] & 0xFF0000u), bool(${r}[${V}] & 0xFF000000u))`;throw new Error(`not supported combination of storage type ${p.storage} and value type ${p.value} yet`)})(),qe=s<2?"":` fn get_${r}ByIndices(indices: ${p.indices}) -> ${f} { @@ -1838,7 +1838,7 @@ as ORT format: ${i}`)}}loadFromOnnxFormat(e,n){let t=mh.onnx.ModelProto.decode(e fn set_${r}(${V}, value: ${f}) { set_${r}ByIndices(${z(ie)}, value); }`})();return{impl:()=>{let V=[],ie=!1;return h.offsetToIndices&&(V.push(S),ie=!0),h.indicesToOffset&&(V.push(E),ie=!0),h.broadcastedIndicesToOffset&&(Object.values(F).forEach(Te=>V.push(Te)),ie=!0),h.set&&(V.push(se),ie=!0),h.setByIndices&&(V.push(xe),ie=!0),h.get&&(V.push(Q),ie=!0),h.getByIndices&&(V.push(qe),ie=!0),!i&&ie&&V.unshift(`const ${T} = ${p.indices}(${n.join(",")});`,`const ${w} = ${p.indices}(${B.computeStrides(n).join(",")});`),V.join(` -`)},type:p,offsetToIndices:$,indicesToOffset:N,broadcastedIndicesToOffset:_e,indices:z,indicesGet:q,indicesSet:K,set:(...V)=>{if(V.length!==s+1)throw new Error(`indices length must be ${s}`);let ie=V[s];if(typeof ie!="string")throw new Error("value must be string");let Te=V.slice(0,s).map(b).join(",");return s===0?$e("0u",ie):s===1?$e(Te[0],ie):(h.set=!0,h.setByIndices=!0,h.indicesToOffset=!0,`set_${r}(${Te}, ${ie})`)},setByOffset:$e,setByIndices:(V,ie)=>s<2?$e(V,ie):(h.setByIndices=!0,h.indicesToOffset=!0,`set_${r}ByIndices(${V}, ${ie});`),get:ge,getByOffset:ae,getByIndices:Ie,usage:t,name:r,strides:w,shape:T,rank:s}},D=(r,e,n,t=1)=>Ks(r,e,n,"input",t),G=(r,e,n,t=1)=>Ks(r,e,n,"output",t),ki=(r,e,n,t=1)=>Ks(r,e,n,"internal",t),Hs=class{constructor(e,n){this.normalizedDispatchGroup=e;this.limits=n;this.internalVariables=[];this.variables=[];this.uniforms=[];this.variableIndex=0}guardAgainstOutOfBoundsWorkgroupSizes(e){return`if (global_idx >= ${typeof e=="number"?`${e}u`:e}) { return; }`}mainStart(e=Zr){let n=typeof e=="number"?e:e[0],t=typeof e=="number"?1:e[1],o=typeof e=="number"?1:e[2];if(n>this.limits.maxComputeWorkgroupSizeX||t>this.limits.maxComputeWorkgroupSizeY||o>this.limits.maxComputeWorkgroupSizeZ)throw new Error(`workgroup size [${n}, ${t}, ${o}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);if(n*t*o>this.limits.maxComputeInvocationsPerWorkgroup)throw new Error(`workgroup size [${n}, ${t}, ${o}] exceeds the maximum workgroup invocations ${this.limits.maxComputeInvocationsPerWorkgroup}.`);let i=this.normalizedDispatchGroup[1]===1&&this.normalizedDispatchGroup[2]===1,s=i?`@builtin(global_invocation_id) global_id : vec3, +`)},type:p,offsetToIndices:$,indicesToOffset:N,broadcastedIndicesToOffset:_e,indices:z,indicesGet:q,indicesSet:j,set:(...V)=>{if(V.length!==s+1)throw new Error(`indices length must be ${s}`);let ie=V[s];if(typeof ie!="string")throw new Error("value must be string");let Te=V.slice(0,s).map(b).join(",");return s===0?$e("0u",ie):s===1?$e(Te[0],ie):(h.set=!0,h.setByIndices=!0,h.indicesToOffset=!0,`set_${r}(${Te}, ${ie})`)},setByOffset:$e,setByIndices:(V,ie)=>s<2?$e(V,ie):(h.setByIndices=!0,h.indicesToOffset=!0,`set_${r}ByIndices(${V}, ${ie});`),get:ge,getByOffset:ae,getByIndices:Ie,usage:t,name:r,strides:w,shape:T,rank:s}},D=(r,e,n,t=1)=>Ks(r,e,n,"input",t),G=(r,e,n,t=1)=>Ks(r,e,n,"output",t),ki=(r,e,n,t=1)=>Ks(r,e,n,"internal",t),qs=class{constructor(e,n){this.normalizedDispatchGroup=e;this.limits=n;this.internalVariables=[];this.variables=[];this.uniforms=[];this.variableIndex=0}guardAgainstOutOfBoundsWorkgroupSizes(e){return`if (global_idx >= ${typeof e=="number"?`${e}u`:e}) { return; }`}mainStart(e=Zr){let n=typeof e=="number"?e:e[0],t=typeof e=="number"?1:e[1],o=typeof e=="number"?1:e[2];if(n>this.limits.maxComputeWorkgroupSizeX||t>this.limits.maxComputeWorkgroupSizeY||o>this.limits.maxComputeWorkgroupSizeZ)throw new Error(`workgroup size [${n}, ${t}, ${o}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);if(n*t*o>this.limits.maxComputeInvocationsPerWorkgroup)throw new Error(`workgroup size [${n}, ${t}, ${o}] exceeds the maximum workgroup invocations ${this.limits.maxComputeInvocationsPerWorkgroup}.`);let i=this.normalizedDispatchGroup[1]===1&&this.normalizedDispatchGroup[2]===1,s=i?`@builtin(global_invocation_id) global_id : vec3, @builtin(workgroup_id) workgroup_id : vec3, @builtin(local_invocation_id) local_id : vec3`:`@builtin(global_invocation_id) global_id : vec3, @builtin(local_invocation_id) local_id : vec3, @@ -1853,9 +1853,9 @@ as ORT format: ${i}`)}}loadFromOnnxFormat(e,n){let t=mh.onnx.ModelProto.decode(e struct Uniforms { ${e.join(", ")} }; @group(0) @binding(${this.variableIndex}) var uniforms: Uniforms;`}get additionalImplementations(){return this.uniformDeclaration()+this.variables.map(e=>e.impl()).join(` `)+this.internalVariables.map(e=>e.impl()).join(` -`)}get variablesInfo(){if(this.uniforms.length===0)return;let e=n=>[12,10,1,6][["u32","f16","f32","i32"].indexOf(n)];return this.uniforms.map(n=>[e(n.type),n.length??1])}},Hh=(r,e)=>new Hs(r,e),_n=(r,e)=>{let n=r.length,t=[];for(let o=0;o1&&s===1&&t.unshift(i)}return t}});var j_,qh,X_,Z_,Tt,Kh,jh,Jr=C(()=>{"use strict";ue();ye();et();he();j_=r=>{if(!r||r.length!==1)throw new Error("Transpose requires 1 input.")},qh=(r,e)=>e&&e.length!==r?[...new Array(r).keys()].reverse():e,X_=(r,e)=>B.sortBasedOnPerm(r,qh(r.length,e)),Z_=(r,e,n,t)=>{let o=[];o.push(`fn perm(i: ${t.type.indices}) -> ${n.type.indices} { +`)}get variablesInfo(){if(this.uniforms.length===0)return;let e=n=>[12,10,1,6][["u32","f16","f32","i32"].indexOf(n)];return this.uniforms.map(n=>[e(n.type),n.length??1])}},Hh=(r,e)=>new qs(r,e),In=(r,e)=>{let n=r.length,t=[];for(let o=0;o1&&s===1&&t.unshift(i)}return t}});var Z_,qh,Y_,J_,Tt,jh,Kh,Jr=C(()=>{"use strict";ue();ye();et();he();Z_=r=>{if(!r||r.length!==1)throw new Error("Transpose requires 1 input.")},qh=(r,e)=>e&&e.length!==r?[...new Array(r).keys()].reverse():e,Y_=(r,e)=>B.sortBasedOnPerm(r,qh(r.length,e)),J_=(r,e,n,t)=>{let o=[];o.push(`fn perm(i: ${t.type.indices}) -> ${n.type.indices} { var a: ${n.type.indices};`);for(let i=0;i{let n=r.dataType,t=r.dims.length,o=qh(t,e),i=X_(r.dims,o),s=G("output",n,i.length),a=D("a",n,t),u;if(o.length===2&&o[0]===1&&o[1]===0){let l=s.type.value,f=[16,16,1];u=c=>` +`)},Tt=(r,e)=>{let n=r.dataType,t=r.dims.length,o=qh(t,e),i=Y_(r.dims,o),s=G("output",n,i.length),a=D("a",n,t),u;if(o.length===2&&o[0]===1&&o[1]===0){let l=s.type.value,f=[16,16,1];u=c=>` ${c.registerUniform("output_size","u32").declareVariables(a,s)} var tile : array, ${f[0]}>; ${c.mainStart(f)} @@ -1875,7 +1875,7 @@ as ORT format: ${i}`)}}loadFromOnnxFormat(e,n){let t=mh.onnx.ModelProto.decode(e }`}else u=l=>` ${l.registerUniform("output_size","u32").declareVariables(a,s)} - ${Z_(o,t,a,s)} + ${J_(o,t,a,s)} ${l.mainStart()} ${l.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} @@ -1884,7 +1884,7 @@ as ORT format: ${i}`)}}loadFromOnnxFormat(e,n){let t=mh.onnx.ModelProto.decode(e let aIndices = perm(indices); ${s.setByOffset("global_idx",a.getByIndices("aIndices"))} - }`;return{name:"Transpose",shaderCache:{hint:`${e}`,inputDependencies:["rank"]},getRunData:l=>{let f=B.size(i);return{outputs:[{dims:i,dataType:l[0].dataType}],dispatchGroup:{x:Math.ceil(f/64)},programUniforms:[{type:12,data:f},...W(l[0].dims,i)]}},getShaderSource:u}},Kh=(r,e)=>{j_(r.inputs),r.compute(Tt(r.inputs[0],e.perm))},jh=r=>de({perm:r.perm})});var Y_,J_,Q_,e2,t2,r2,n2,o2,i2,a2,or,Xh,Zh,Yh,Jh,Qh,eg,tg,rg,ng,og,ig=C(()=>{"use strict";ue();ye();he();Di();Jr();Y_={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate * candidate",logSumExp:"bestValue + exp(candidate)",l1:"bestValue + abs(candidate)",l2:"bestValue + candidate * candidate",logSum:"bestValue + candidate"},J_={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate",logSumExp:"bestValue + candidate",l1:"bestValue + candidate",l2:"bestValue + candidate",logSum:"bestValue + candidate"},Q_={max:"_A[offset]",min:"_A[offset]",mean:"0",sum:"0",prod:"1",sumSquare:"0",logSumExp:"0",l1:"0",l2:"0",logSum:"0"},e2={max:"bestValue",min:"bestValue",sum:"bestValue",prod:"bestValue",sumSquare:"bestValue",logSumExp:"log(bestValue)",l1:"bestValue",l2:"sqrt(bestValue)",logSum:"log(bestValue)"},t2=(r,e)=>{let n=[];for(let t=e-r;t{let n=[],t=r.length;for(let i=0;ir[i]);return[n,o]},n2=(r,e)=>{let n=r.length+e.length,t=[],o=0;for(let i=0;i{for(let n=0;n{let n=[];if(!o2(r,e)){for(let t=0;tn.push(t))}return n},a2=(r,e,n,t,o,i,s)=>{let a=n[0].dims,u=B.size(i),l=B.size(s),f=D("_A",n[0].dataType,a),c=G("output",o,i),p=32,b=` + }`;return{name:"Transpose",shaderCache:{hint:`${e}`,inputDependencies:["rank"]},getRunData:l=>{let f=B.size(i);return{outputs:[{dims:i,dataType:l[0].dataType}],dispatchGroup:{x:Math.ceil(f/64)},programUniforms:[{type:12,data:f},...W(l[0].dims,i)]}},getShaderSource:u}},jh=(r,e)=>{Z_(r.inputs),r.compute(Tt(r.inputs[0],e.perm))},Kh=r=>de({perm:r.perm})});var Q_,e2,t2,r2,n2,o2,i2,a2,s2,u2,or,Xh,Zh,Yh,Jh,Qh,eg,tg,rg,ng,og,ig=C(()=>{"use strict";ue();ye();he();Di();Jr();Q_={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate * candidate",logSumExp:"bestValue + exp(candidate)",l1:"bestValue + abs(candidate)",l2:"bestValue + candidate * candidate",logSum:"bestValue + candidate"},e2={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate",logSumExp:"bestValue + candidate",l1:"bestValue + candidate",l2:"bestValue + candidate",logSum:"bestValue + candidate"},t2={max:"_A[offset]",min:"_A[offset]",mean:"0",sum:"0",prod:"1",sumSquare:"0",logSumExp:"0",l1:"0",l2:"0",logSum:"0"},r2={max:"bestValue",min:"bestValue",sum:"bestValue",prod:"bestValue",sumSquare:"bestValue",logSumExp:"log(bestValue)",l1:"bestValue",l2:"sqrt(bestValue)",logSum:"log(bestValue)"},n2=(r,e)=>{let n=[];for(let t=e-r;t{let n=[],t=r.length;for(let i=0;ir[i]);return[n,o]},i2=(r,e)=>{let n=r.length+e.length,t=[],o=0;for(let i=0;i{for(let n=0;n{let n=[];if(!a2(r,e)){for(let t=0;tn.push(t))}return n},u2=(r,e,n,t,o,i,s)=>{let a=n[0].dims,u=B.size(i),l=B.size(s),f=D("_A",n[0].dataType,a),c=G("output",o,i),p=32,b=` var aBestValues : array; `;return{name:r,shaderCache:e,getShaderSource:g=>` ${g.registerUniform("reduceSize","u32").declareVariables(f,c)} @@ -1897,11 +1897,11 @@ as ORT format: ${i}`)}}loadFromOnnxFormat(e,n){let t=mh.onnx.ModelProto.decode(e let outputIndex = global_idx / ${p}; let offset = outputIndex * uniforms.reduceSize; - var bestValue = f32(${Q_[t]}); + var bestValue = f32(${t2[t]}); let Length = uniforms.reduceSize; for (var k = local_idx; k < Length; k = k + ${p}) { let candidate = f32(${f.getByOffset("offset + k")}); - bestValue = ${Y_[t]}; + bestValue = ${Q_[t]}; } aBestValues[local_idx] = bestValue; workgroupBarrier(); @@ -1912,7 +1912,7 @@ as ORT format: ${i}`)}}loadFromOnnxFormat(e,n){let t=mh.onnx.ModelProto.decode(e let interval = DIV_CEIL(reduceSize, 2u); if (local_idx < currentSize) { let candidate = aBestValues[local_idx + interval]; - bestValue = ${J_[t]}; + bestValue = ${e2[t]}; aBestValues[local_idx] = bestValue; } reduceSize = interval; @@ -1920,9 +1920,9 @@ as ORT format: ${i}`)}}loadFromOnnxFormat(e,n){let t=mh.onnx.ModelProto.decode(e } if (local_idx == 0u) { - ${c.setByOffset("outputIndex",`${t==="mean"?`${c.type.storage}(bestValue / f32(uniforms.reduceSize))`:`${c.type.storage}(${e2[t]})`}`)}; + ${c.setByOffset("outputIndex",`${t==="mean"?`${c.type.storage}(bestValue / f32(uniforms.reduceSize))`:`${c.type.storage}(${r2[t]})`}`)}; } - }`,getRunData:()=>({outputs:[{dims:i,dataType:o}],dispatchGroup:{x:u},programUniforms:[{type:12,data:l}]})}},or=(r,e,n,t)=>{let o=r.inputs.length===1?n:js(r.inputs,n),i=o.axes;i.length===0&&!o.noopWithEmptyAxes&&(i=r.inputs[0].dims.map((b,h)=>h));let s=B.normalizeAxes(i,r.inputs[0].dims.length),a=s,u=r.inputs[0],l=i2(a,r.inputs[0].dims.length);l.length>0&&(u=r.compute(Tt(r.inputs[0],l),{inputs:[0],outputs:[-1]})[0],a=t2(a.length,u.dims.length));let[f,c]=r2(u.dims,a),p=f;o.keepDims&&(p=n2(f,s)),r.compute(a2(e,{hint:o.cacheKey,inputDependencies:["type"]},[u],t,r.inputs[0].dataType,p,c),{inputs:[u]})},Xh=(r,e)=>{or(r,"ReduceMeanShared",e,"mean")},Zh=(r,e)=>{or(r,"ReduceL1Shared",e,"l1")},Yh=(r,e)=>{or(r,"ReduceL2Shared",e,"l2")},Jh=(r,e)=>{or(r,"ReduceLogSumExpShared",e,"logSumExp")},Qh=(r,e)=>{or(r,"ReduceMaxShared",e,"max")},eg=(r,e)=>{or(r,"ReduceMinShared",e,"min")},tg=(r,e)=>{or(r,"ReduceProdShared",e,"prod")},rg=(r,e)=>{or(r,"ReduceSumShared",e,"sum")},ng=(r,e)=>{or(r,"ReduceSumSquareShared",e,"sumSquare")},og=(r,e)=>{or(r,"ReduceLogSumShared",e,"logSum")}});var ir,s2,Bi,js,ar,u2,l2,c2,f2,d2,p2,m2,h2,g2,b2,sr,ag,sg,ug,lg,cg,fg,dg,pg,mg,hg,Di=C(()=>{"use strict";ue();ye();et();he();ig();ir=r=>{if(!r||r.length===0||r.length>2)throw new Error("Reduce op requires 1 or 2 inputs.");if(r.length===2&&r[1].dims.length!==1)throw new Error("Invalid axes input dims.")},s2=r=>["","",`var value = ${r.getByIndices("input_indices")};`,""],Bi=(r,e,n,t,o,i,s=!1,a=!1)=>{let u=[],l=n[0].dims,f=l.length,c=B.normalizeAxes(o,f),p=!a&&c.length===0;l.forEach((T,w)=>{p||c.indexOf(w)>=0?s&&u.push(1):u.push(T)});let b=u.length,h=B.size(u);return{name:r,shaderCache:e,getShaderSource:T=>{let w=[],v=D("_A",n[0].dataType,f),S=G("output",i,b),$=t(v,S,c),P=$[2];for(let E=0,N=0;E=0?(s&&N++,P=`for(var j${E}: u32 = 0; j${E} < ${l[E]}; j${E}++) { + }`,getRunData:()=>({outputs:[{dims:i,dataType:o}],dispatchGroup:{x:u},programUniforms:[{type:12,data:l}]})}},or=(r,e,n,t)=>{let o=r.inputs.length===1?n:Xs(r.inputs,n),i=o.axes;i.length===0&&!o.noopWithEmptyAxes&&(i=r.inputs[0].dims.map((b,h)=>h));let s=B.normalizeAxes(i,r.inputs[0].dims.length),a=s,u=r.inputs[0],l=s2(a,r.inputs[0].dims.length);l.length>0&&(u=r.compute(Tt(r.inputs[0],l),{inputs:[0],outputs:[-1]})[0],a=n2(a.length,u.dims.length));let[f,c]=o2(u.dims,a),p=f;o.keepDims&&(p=i2(f,s)),r.compute(u2(e,{hint:o.cacheKey,inputDependencies:["type"]},[u],t,r.inputs[0].dataType,p,c),{inputs:[u]})},Xh=(r,e)=>{or(r,"ReduceMeanShared",e,"mean")},Zh=(r,e)=>{or(r,"ReduceL1Shared",e,"l1")},Yh=(r,e)=>{or(r,"ReduceL2Shared",e,"l2")},Jh=(r,e)=>{or(r,"ReduceLogSumExpShared",e,"logSumExp")},Qh=(r,e)=>{or(r,"ReduceMaxShared",e,"max")},eg=(r,e)=>{or(r,"ReduceMinShared",e,"min")},tg=(r,e)=>{or(r,"ReduceProdShared",e,"prod")},rg=(r,e)=>{or(r,"ReduceSumShared",e,"sum")},ng=(r,e)=>{or(r,"ReduceSumSquareShared",e,"sumSquare")},og=(r,e)=>{or(r,"ReduceLogSumShared",e,"logSum")}});var ir,l2,Bi,Xs,ar,c2,f2,d2,p2,m2,h2,g2,b2,y2,x2,sr,ag,sg,ug,lg,cg,fg,dg,pg,mg,hg,Di=C(()=>{"use strict";ue();ye();et();he();ig();ir=r=>{if(!r||r.length===0||r.length>2)throw new Error("Reduce op requires 1 or 2 inputs.");if(r.length===2&&r[1].dims.length!==1)throw new Error("Invalid axes input dims.")},l2=r=>["","",`var value = ${r.getByIndices("input_indices")};`,""],Bi=(r,e,n,t,o,i,s=!1,a=!1)=>{let u=[],l=n[0].dims,f=l.length,c=B.normalizeAxes(o,f),p=!a&&c.length===0;l.forEach((T,w)=>{p||c.indexOf(w)>=0?s&&u.push(1):u.push(T)});let b=u.length,h=B.size(u);return{name:r,shaderCache:e,getShaderSource:T=>{let w=[],v=D("_A",n[0].dataType,f),S=G("output",i,b),$=t(v,S,c),P=$[2];for(let E=0,N=0;E=0?(s&&N++,P=`for(var j${E}: u32 = 0; j${E} < ${l[E]}; j${E}++) { ${$[2].includes("last_index")?`let last_index = j${E};`:""} ${v.indicesSet("input_indices",E,`j${E}`)} ${P} @@ -1943,9 +1943,9 @@ as ORT format: ${i}`)}}loadFromOnnxFormat(e,n){let t=mh.onnx.ModelProto.decode(e ${$[3]} ${$.length===4?S.setByOffset("global_idx","value"):$.slice(4).join(` `)} - }`},getRunData:()=>({outputs:[{dims:u,dataType:i}],dispatchGroup:{x:Math.ceil(h/64)},programUniforms:[{type:12,data:h},...W(l,u)]})}},js=(r,e)=>{let n=[];return r[1].dims[0]>0&&r[1].getBigInt64Array().forEach(t=>n.push(Number(t))),de({axes:n,keepDims:e.keepDims,noopWithEmptyAxes:e.noopWithEmptyAxes})},ar=(r,e,n,t)=>{let o=r.inputs,i=o.length===1?n:js(o,n);r.compute(Bi(e,{hint:i.cacheKey,inputDependencies:["rank"]},[o[0]],i.noopWithEmptyAxes&&i.axes.length===0?s2:t,i.axes,o[0].dataType,i.keepDims,i.noopWithEmptyAxes),{inputs:[0]})},u2=(r,e)=>{ir(r.inputs),ar(r,"ReduceLogSum",e,(t,o)=>[`var value = ${o.type.storage}(0);`,"",`value += ${t.getByIndices("input_indices")};`,"value = log(value);"])},l2=(r,e)=>{ir(r.inputs),ar(r,"ReduceL1",e,(t,o)=>[`var value = ${o.type.storage}(0);`,"",`value += abs(${t.getByIndices("input_indices")});`,""])},c2=(r,e)=>{ir(r.inputs),ar(r,"ReduceL2",e,(t,o)=>[`var t = ${o.type.value}(0); var value = ${o.type.value}(0);`,"",`t = ${t.getByIndices("input_indices")}; value += (t * t);`,"value = sqrt(value);"])},f2=(r,e)=>{ir(r.inputs),ar(r,"ReduceLogSumExp",e,(t,o)=>[`var value = ${o.type.storage}(0);`,"",`value += exp(${t.getByIndices("input_indices")});`,"value = log(value);"])},d2=(r,e)=>{ir(r.inputs),ar(r,"ReduceMax",e,(t,o,i)=>{let s=[];for(let a=0;a=0||i.length===0)&&s.push(t.indicesSet("input_indices",a,0));return[`${s.join(` -`)}`,`var value = ${t.getByIndices("input_indices")};`,`value = max(value, ${t.getByIndices("input_indices")});`,""]})},p2=(r,e)=>{ir(r.inputs),ar(r,"ReduceMean",e,(t,o,i)=>{let s=1;for(let a=0;a=0||i.length===0)&&(s*=r.inputs[0].dims[a]);return["var sum = f32(0);","",`sum += f32(${t.getByIndices("input_indices")});`,`let value = ${o.type.value}(sum / ${s});`]})},m2=(r,e)=>{ir(r.inputs),ar(r,"ReduceMin",e,(t,o,i)=>{let s=[];for(let a=0;a=0||i.length===0)&&s.push(`input_indices[${a}] = 0;`);return[`${s.join(` -`)}`,`var value = ${t.getByIndices("input_indices")};`,`value = min(value, ${t.getByIndices("input_indices")});`,""]})},h2=(r,e)=>{ir(r.inputs),ar(r,"ReduceProd",e,(t,o)=>[`var value = ${o.type.storage}(1);`,"",`value *= ${t.getByIndices("input_indices")};`,""])},g2=(r,e)=>{ir(r.inputs),ar(r,"ReduceSum",e,(t,o)=>[`var value = ${o.type.storage}(0);`,"",`value += ${t.getByIndices("input_indices")};`,""])},b2=(r,e)=>{ir(r.inputs),ar(r,"ReduceSumSquare",e,(t,o)=>[`var t = ${o.type.value}(0); var value = ${o.type.value}(0);`,"",`t = ${t.getByIndices("input_indices")}; value += t * t;`,""])},sr=(r,e,n)=>{if(e.length===0)return n;let t=1,o=1;for(let i=0;i1024},ag=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?p2(r,e):Xh(r,e)},sg=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?l2(r,e):Zh(r,e)},ug=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?c2(r,e):Yh(r,e)},lg=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?f2(r,e):Jh(r,e)},cg=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?d2(r,e):Qh(r,e)},fg=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?m2(r,e):eg(r,e)},dg=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?h2(r,e):tg(r,e)},pg=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?g2(r,e):rg(r,e)},mg=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?b2(r,e):ng(r,e)},hg=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?u2(r,e):og(r,e)}});var gg,bg,yg,Xs,xg=C(()=>{"use strict";ue();et();Di();gg=r=>{if(!r||r.length===0||r.length>2)throw new Error("ArgMinMaxOp op requires 1 or 2 inputs.");if(r[0].dataType!==1)throw new Error("Invalid input type.")},bg=(r,e)=>{gg(r.inputs);let n=(t,o,i)=>{let s=[];for(let a=0;a=0||i.length===0)&&s.push(`input_indices[${a}] = 0;`);return[`${s.join(` + }`},getRunData:()=>({outputs:[{dims:u,dataType:i}],dispatchGroup:{x:Math.ceil(h/64)},programUniforms:[{type:12,data:h},...W(l,u)]})}},Xs=(r,e)=>{let n=[];return r[1].dims[0]>0&&r[1].getBigInt64Array().forEach(t=>n.push(Number(t))),de({axes:n,keepDims:e.keepDims,noopWithEmptyAxes:e.noopWithEmptyAxes})},ar=(r,e,n,t)=>{let o=r.inputs,i=o.length===1?n:Xs(o,n);r.compute(Bi(e,{hint:i.cacheKey,inputDependencies:["rank"]},[o[0]],i.noopWithEmptyAxes&&i.axes.length===0?l2:t,i.axes,o[0].dataType,i.keepDims,i.noopWithEmptyAxes),{inputs:[0]})},c2=(r,e)=>{ir(r.inputs),ar(r,"ReduceLogSum",e,(t,o)=>[`var value = ${o.type.storage}(0);`,"",`value += ${t.getByIndices("input_indices")};`,"value = log(value);"])},f2=(r,e)=>{ir(r.inputs),ar(r,"ReduceL1",e,(t,o)=>[`var value = ${o.type.storage}(0);`,"",`value += abs(${t.getByIndices("input_indices")});`,""])},d2=(r,e)=>{ir(r.inputs),ar(r,"ReduceL2",e,(t,o)=>[`var t = ${o.type.value}(0); var value = ${o.type.value}(0);`,"",`t = ${t.getByIndices("input_indices")}; value += (t * t);`,"value = sqrt(value);"])},p2=(r,e)=>{ir(r.inputs),ar(r,"ReduceLogSumExp",e,(t,o)=>[`var value = ${o.type.storage}(0);`,"",`value += exp(${t.getByIndices("input_indices")});`,"value = log(value);"])},m2=(r,e)=>{ir(r.inputs),ar(r,"ReduceMax",e,(t,o,i)=>{let s=[];for(let a=0;a=0||i.length===0)&&s.push(t.indicesSet("input_indices",a,0));return[`${s.join(` +`)}`,`var value = ${t.getByIndices("input_indices")};`,`value = max(value, ${t.getByIndices("input_indices")});`,""]})},h2=(r,e)=>{ir(r.inputs),ar(r,"ReduceMean",e,(t,o,i)=>{let s=1;for(let a=0;a=0||i.length===0)&&(s*=r.inputs[0].dims[a]);return["var sum = f32(0);","",`sum += f32(${t.getByIndices("input_indices")});`,`let value = ${o.type.value}(sum / ${s});`]})},g2=(r,e)=>{ir(r.inputs),ar(r,"ReduceMin",e,(t,o,i)=>{let s=[];for(let a=0;a=0||i.length===0)&&s.push(`input_indices[${a}] = 0;`);return[`${s.join(` +`)}`,`var value = ${t.getByIndices("input_indices")};`,`value = min(value, ${t.getByIndices("input_indices")});`,""]})},b2=(r,e)=>{ir(r.inputs),ar(r,"ReduceProd",e,(t,o)=>[`var value = ${o.type.storage}(1);`,"",`value *= ${t.getByIndices("input_indices")};`,""])},y2=(r,e)=>{ir(r.inputs),ar(r,"ReduceSum",e,(t,o)=>[`var value = ${o.type.storage}(0);`,"",`value += ${t.getByIndices("input_indices")};`,""])},x2=(r,e)=>{ir(r.inputs),ar(r,"ReduceSumSquare",e,(t,o)=>[`var t = ${o.type.value}(0); var value = ${o.type.value}(0);`,"",`t = ${t.getByIndices("input_indices")}; value += t * t;`,""])},sr=(r,e,n)=>{if(e.length===0)return n;let t=1,o=1;for(let i=0;i1024},ag=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?h2(r,e):Xh(r,e)},sg=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?f2(r,e):Zh(r,e)},ug=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?d2(r,e):Yh(r,e)},lg=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?p2(r,e):Jh(r,e)},cg=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?m2(r,e):Qh(r,e)},fg=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?g2(r,e):eg(r,e)},dg=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?b2(r,e):tg(r,e)},pg=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?y2(r,e):rg(r,e)},mg=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?x2(r,e):ng(r,e)},hg=(r,e)=>{sr(r.inputs[0].dims,e.axes,e.noopWithEmptyAxes)?c2(r,e):og(r,e)}});var gg,bg,yg,Zs,xg=C(()=>{"use strict";ue();et();Di();gg=r=>{if(!r||r.length===0||r.length>2)throw new Error("ArgMinMaxOp op requires 1 or 2 inputs.");if(r[0].dataType!==1)throw new Error("Invalid input type.")},bg=(r,e)=>{gg(r.inputs);let n=(t,o,i)=>{let s=[];for(let a=0;a=0||i.length===0)&&s.push(`input_indices[${a}] = 0;`);return[`${s.join(` `)}`,`var value = ${t.getByIndices("input_indices")}; var best_index : i32 = 0;`,`if (${t.getByIndices("input_indices")} ${e.selectLastIndex>0?"<=":"<"} value) { value = ${t.getByIndices("input_indices")}; @@ -1955,7 +1955,7 @@ var best_index : i32 = 0;`,`if (${t.getByIndices("input_indices")} ${e.selectLas var best_index : i32 = 0;`,`if (${t.getByIndices("input_indices")} ${e.selectLastIndex>0?">=":">"} value) { value = ${t.getByIndices("input_indices")}; best_index = i32(last_index); - }`,"",o.setByOffset("global_idx","best_index")]};r.compute(Bi("argMax",{hint:e.cacheKey,inputDependencies:["rank"]},[r.inputs[0]],n,[e.axis],7,e.keepDims),{inputs:[0]})},Xs=r=>de(r)});var y2,x2,v2,w2,In,T2,vg,Li=C(()=>{"use strict";ue();Pi();he();y2=(r,e)=>{let n=r[0],t=r[1],o=r[2],i=r[3],s=r[4],a=r[5];if(s&&a)throw new Error("Attention cannot have both past and relative_position_bias");if(n.dims.length!==3)throw new Error('Input "input" must have 3 dimensions');let u=n.dims[0],l=n.dims[1],f=n.dims[2];if(o.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimensions');if(t.dims.length!==2)throw new Error('Input "weights" is expected to have 2 dimensions');if(t.dims[0]!==f)throw new Error("Input 1 dimension 0 should have same length as dimension 2 of input 0");if(o.dims[0]!==t.dims[1])throw new Error('Input "bias" dimension 0 should have same length as dimension 1 of input "weights"');let c=o.dims[0]/3,p=c,b=p;if(e.qkvHiddenSizes.length>0){if(e.qkvHiddenSizes.length!==3)throw new Error("qkv_hidden_sizes attribute should have 3 elements");for(let S of e.qkvHiddenSizes)if(S%e.numHeads!==0)throw new Error("qkv_hidden_sizes should be divisible by num_heads");c=e.qkvHiddenSizes[0],p=e.qkvHiddenSizes[1],b=e.qkvHiddenSizes[2]}let h=l;if(c!==p)throw new Error("qkv_hidden_sizes first element should be same as the second");if(o.dims[0]!==c+p+b)throw new Error('Input "bias" dimension 0 should have same length as sum of Q/K/V hidden sizes');let g=0;if(s){if(p!==b)throw new Error('Input "past" expect k_hidden_size == v_hidden_size');if(s.dims.length!==5)throw new Error('Input "past" must have 5 dimensions');if(s.dims[0]!==2)throw new Error('Input "past" first dimension must be 2');if(s.dims[1]!==u)throw new Error('Input "past" second dimension must be batch_size');if(s.dims[2]!==e.numHeads)throw new Error('Input "past" third dimension must be num_heads');if(s.dims[4]!==p/e.numHeads)throw new Error('Input "past" fifth dimension must be k_hidden_size / num_heads');e.pastPresentShareBuffer||(g=s.dims[3])}let T=h+g,w=-1,v=0;if(i)throw new Error("Mask not supported");if(s)throw new Error("past is not supported");return{batchSize:u,sequenceLength:l,pastSequenceLength:g,kvSequenceLength:h,totalSequenceLength:T,maxSequenceLength:w,inputHiddenSize:f,hiddenSize:c,vHiddenSize:b,headSize:Math.floor(c/e.numHeads),vHeadSize:Math.floor(b/e.numHeads),numHeads:e.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:e.maskFilterValue,maskType:v,scale:e.scale,broadcastResPosBias:!1,passPastInKv:!1,qkvFormat:1}},x2=(r,e,n,t)=>{let o=ze(t),i=64,s=t/o;s{let b=G("x",e.dataType,e.dims,o),g=[{name:"d_inv",type:ct(e.dataType)},{name:"d_comp",type:"u32"},{name:"elements_per_thread",type:"u32"}];return` + }`,"",o.setByOffset("global_idx","best_index")]};r.compute(Bi("argMax",{hint:e.cacheKey,inputDependencies:["rank"]},[r.inputs[0]],n,[e.axis],7,e.keepDims),{inputs:[0]})},Zs=r=>de(r)});var v2,w2,T2,_2,Sn,I2,vg,Li=C(()=>{"use strict";ue();Pi();he();v2=(r,e)=>{let n=r[0],t=r[1],o=r[2],i=r[3],s=r[4],a=r[5];if(s&&a)throw new Error("Attention cannot have both past and relative_position_bias");if(n.dims.length!==3)throw new Error('Input "input" must have 3 dimensions');let u=n.dims[0],l=n.dims[1],f=n.dims[2];if(o.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimensions');if(t.dims.length!==2)throw new Error('Input "weights" is expected to have 2 dimensions');if(t.dims[0]!==f)throw new Error("Input 1 dimension 0 should have same length as dimension 2 of input 0");if(o.dims[0]!==t.dims[1])throw new Error('Input "bias" dimension 0 should have same length as dimension 1 of input "weights"');let c=o.dims[0]/3,p=c,b=p;if(e.qkvHiddenSizes.length>0){if(e.qkvHiddenSizes.length!==3)throw new Error("qkv_hidden_sizes attribute should have 3 elements");for(let S of e.qkvHiddenSizes)if(S%e.numHeads!==0)throw new Error("qkv_hidden_sizes should be divisible by num_heads");c=e.qkvHiddenSizes[0],p=e.qkvHiddenSizes[1],b=e.qkvHiddenSizes[2]}let h=l;if(c!==p)throw new Error("qkv_hidden_sizes first element should be same as the second");if(o.dims[0]!==c+p+b)throw new Error('Input "bias" dimension 0 should have same length as sum of Q/K/V hidden sizes');let g=0;if(s){if(p!==b)throw new Error('Input "past" expect k_hidden_size == v_hidden_size');if(s.dims.length!==5)throw new Error('Input "past" must have 5 dimensions');if(s.dims[0]!==2)throw new Error('Input "past" first dimension must be 2');if(s.dims[1]!==u)throw new Error('Input "past" second dimension must be batch_size');if(s.dims[2]!==e.numHeads)throw new Error('Input "past" third dimension must be num_heads');if(s.dims[4]!==p/e.numHeads)throw new Error('Input "past" fifth dimension must be k_hidden_size / num_heads');e.pastPresentShareBuffer||(g=s.dims[3])}let T=h+g,w=-1,v=0;if(i)throw new Error("Mask not supported");if(s)throw new Error("past is not supported");return{batchSize:u,sequenceLength:l,pastSequenceLength:g,kvSequenceLength:h,totalSequenceLength:T,maxSequenceLength:w,inputHiddenSize:f,hiddenSize:c,vHiddenSize:b,headSize:Math.floor(c/e.numHeads),vHeadSize:Math.floor(b/e.numHeads),numHeads:e.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:e.maskFilterValue,maskType:v,scale:e.scale,broadcastResPosBias:!1,passPastInKv:!1,qkvFormat:1}},w2=(r,e,n,t)=>{let o=ze(t),i=64,s=t/o;s{let b=G("x",e.dataType,e.dims,o),g=[{name:"d_inv",type:ct(e.dataType)},{name:"d_comp",type:"u32"},{name:"elements_per_thread",type:"u32"}];return` var thread_max: array; var thread_sum: array; ${p.registerUniforms(g).declareVariables(b)} @@ -1997,12 +1997,12 @@ var best_index : i32 = 0;`,`if (${t.getByIndices("input_indices")} ${e.selectLas x[offset + i] = ${b.type.value}(exp(f32input - max_value) / sum); } } - }`};return{name:"AttentionProbsSoftmax",shaderCache:{hint:`${i};${l};${o}`},getShaderSource:c,getRunData:()=>({outputs:[],dispatchGroup:{x:n},programUniforms:u})}},v2=(r,e,n,t,o,i,s,a)=>{let u=a+i.kvSequenceLength,l=[i.batchSize,i.numHeads,i.sequenceLength,u],f=i.kvNumHeads===void 0&&r.outputCount>1,c=f?[i.batchSize,i.numHeads,u,i.headSize]:void 0,p=s.scale===0?1/Math.sqrt(i.headSize):s.scale,b=ze(i.headSize),h=i.headSize/b,g=12,T={x:Math.ceil(u/g),y:Math.ceil(i.sequenceLength/g),z:i.batchSize*i.numHeads},w=[{type:12,data:i.sequenceLength},{type:12,data:h},{type:12,data:u},{type:12,data:i.numHeads},{type:1,data:p},{type:12,data:a},{type:12,data:i.kvSequenceLength}],v=["type","type"];t&&v.push("type"),o&&v.push("type");let S=[{dims:l,dataType:e.dataType,gpuDataType:0}];f&&S.push({dims:c,dataType:e.dataType,gpuDataType:0});let $=P=>{let E=D("q",e.dataType,e.dims,b),N=D("key",n.dataType,n.dims,b),z=[E,N];if(t){let $e=D("past_key",t.dataType,t.dims,b);z.push($e)}o&&z.push(D("relative_position_bias",o.dataType,o.dims));let q=G("output",e.dataType,l),K=[q];f&&K.push(G("present_key",e.dataType,c,b));let F=ct(1,b),_e=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"alpha",type:"f32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"}];return` + }`};return{name:"AttentionProbsSoftmax",shaderCache:{hint:`${i};${l};${o}`},getShaderSource:c,getRunData:()=>({outputs:[],dispatchGroup:{x:n},programUniforms:u})}},T2=(r,e,n,t,o,i,s,a)=>{let u=a+i.kvSequenceLength,l=[i.batchSize,i.numHeads,i.sequenceLength,u],f=i.kvNumHeads===void 0&&r.outputCount>1,c=f?[i.batchSize,i.numHeads,u,i.headSize]:void 0,p=s.scale===0?1/Math.sqrt(i.headSize):s.scale,b=ze(i.headSize),h=i.headSize/b,g=12,T={x:Math.ceil(u/g),y:Math.ceil(i.sequenceLength/g),z:i.batchSize*i.numHeads},w=[{type:12,data:i.sequenceLength},{type:12,data:h},{type:12,data:u},{type:12,data:i.numHeads},{type:1,data:p},{type:12,data:a},{type:12,data:i.kvSequenceLength}],v=["type","type"];t&&v.push("type"),o&&v.push("type");let S=[{dims:l,dataType:e.dataType,gpuDataType:0}];f&&S.push({dims:c,dataType:e.dataType,gpuDataType:0});let $=P=>{let E=D("q",e.dataType,e.dims,b),N=D("key",n.dataType,n.dims,b),z=[E,N];if(t){let $e=D("past_key",t.dataType,t.dims,b);z.push($e)}o&&z.push(D("relative_position_bias",o.dataType,o.dims));let q=G("output",e.dataType,l),j=[q];f&&j.push(G("present_key",e.dataType,c,b));let F=ct(1,b),_e=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"alpha",type:"f32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"}];return` const TILE_SIZE = ${g}u; var tileQ: array<${E.type.storage}, ${g*g}>; var tileK: array<${E.type.storage}, ${g*g}>; - ${P.registerUniforms(_e).declareVariables(...z,...K)} + ${P.registerUniforms(_e).declareVariables(...z,...j)} ${P.mainStart([g,g,1])} // x holds the N and y holds the M let headIdx = workgroup_id.z; @@ -2045,7 +2045,7 @@ var best_index : i32 = 0;`,`if (${t.getByIndices("input_indices")} ${e.selectLas var sum: f32 = ${(()=>{switch(b){case 1:return"value";case 2:return"value.x + value.y";case 4:return"value.x + value.y + value.z + value.w";default:throw new Error(`Unsupported components: ${b}`)}})()}; output[outputIdx] = ${q.type.value} (sum * uniforms.alpha) + ${o?"relative_position_bias[outputIdx]":"0.0"}; } - }`};return{name:"AttentionProbs",shaderCache:{hint:`${b};${o!==void 0};${t!==void 0};${r.outputCount}`,inputDependencies:v},getRunData:()=>({outputs:S,dispatchGroup:T,programUniforms:w}),getShaderSource:$}},w2=(r,e,n,t,o,i)=>{let s=i+o.kvSequenceLength,a=o.nReps?o.nReps:1,u=o.vHiddenSize*a,l=o.kvNumHeads==null&&r.outputCount>1,f=l?[o.batchSize,o.numHeads,s,o.headSize]:void 0,c=[o.batchSize,o.sequenceLength,u],p=12,b={x:Math.ceil(o.vHeadSize/p),y:Math.ceil(o.sequenceLength/p),z:o.batchSize*o.numHeads},h=[{type:12,data:o.sequenceLength},{type:12,data:s},{type:12,data:o.vHeadSize},{type:12,data:o.numHeads},{type:12,data:u},{type:12,data:i},{type:12,data:o.kvSequenceLength}],g=t?["type","type","type"]:["type","type"],T=[{dims:c,dataType:e.dataType,gpuDataType:0}];l&&T.push({dims:f,dataType:e.dataType,gpuDataType:0});let w=v=>{let S=D("probs",e.dataType,e.dims),$=D("v",n.dataType,n.dims),P=[S,$];t&&P.push(D("past_value",t.dataType,t.dims));let N=[G("output",e.dataType,c)];l&&N.push(G("present_value",e.dataType,f));let z=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"v_hidden_size",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"}];return` + }`};return{name:"AttentionProbs",shaderCache:{hint:`${b};${o!==void 0};${t!==void 0};${r.outputCount}`,inputDependencies:v},getRunData:()=>({outputs:S,dispatchGroup:T,programUniforms:w}),getShaderSource:$}},_2=(r,e,n,t,o,i)=>{let s=i+o.kvSequenceLength,a=o.nReps?o.nReps:1,u=o.vHiddenSize*a,l=o.kvNumHeads==null&&r.outputCount>1,f=l?[o.batchSize,o.numHeads,s,o.headSize]:void 0,c=[o.batchSize,o.sequenceLength,u],p=12,b={x:Math.ceil(o.vHeadSize/p),y:Math.ceil(o.sequenceLength/p),z:o.batchSize*o.numHeads},h=[{type:12,data:o.sequenceLength},{type:12,data:s},{type:12,data:o.vHeadSize},{type:12,data:o.numHeads},{type:12,data:u},{type:12,data:i},{type:12,data:o.kvSequenceLength}],g=t?["type","type","type"]:["type","type"],T=[{dims:c,dataType:e.dataType,gpuDataType:0}];l&&T.push({dims:f,dataType:e.dataType,gpuDataType:0});let w=v=>{let S=D("probs",e.dataType,e.dims),$=D("v",n.dataType,n.dims),P=[S,$];t&&P.push(D("past_value",t.dataType,t.dims));let N=[G("output",e.dataType,c)];l&&N.push(G("present_value",e.dataType,f));let z=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"v_hidden_size",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"}];return` const TILE_SIZE = ${p}u; var tileQ: array<${S.type.value}, ${p*p}>; var tileK: array<${S.type.value}, ${p*p}>; @@ -2096,7 +2096,7 @@ var best_index : i32 = 0;`,`if (${t.getByIndices("input_indices")} ${e.selectLas + currentBatchHeadNumber * uniforms.N + n; output[outputIdx] = value; } - }`};return{name:"AttentionScore",shaderCache:{hint:`${t!==void 0};${r.outputCount}`,inputDependencies:g},getRunData:()=>({outputs:T,dispatchGroup:b,programUniforms:h}),getShaderSource:w}},In=(r,e,n,t,o,i,s,a,u,l,f)=>{let c=r.outputCount,p=l.kvNumHeads!==void 0||c>1?l.pastSequenceLength:0,b=p+l.kvSequenceLength,h=l.kvNumHeads===void 0&&c>1&&s?[e,n,s]:[e,n];u&&h.push(u);let g=r.compute(v2(r,e,n,c>1?s:void 0,u,l,f,p),{inputs:h,outputs:l.kvNumHeads===void 0&&c>1?[-1,1]:[-1]})[0];r.compute(x2(r,g,l.batchSize*l.numHeads*l.sequenceLength,b),{inputs:[g],outputs:[]});let T=l.kvNumHeads===void 0&&c>1&&a?[g,t,a]:[g,t];r.compute(w2(r,g,t,c>1&&a?a:void 0,l,p),{inputs:T,outputs:l.kvNumHeads===void 0&&c>1?[0,2]:[0]})},T2=(r,e)=>{let n=[e.batchSize,e.numHeads,e.sequenceLength,e.headSize],t=e.sequenceLength,o=e.inputHiddenSize,i=e.headSize,s=12,a={x:Math.ceil(e.headSize/s),y:Math.ceil(e.sequenceLength/s),z:e.batchSize*e.numHeads},u=[r.inputs[0],r.inputs[1],r.inputs[2]],l=[{type:12,data:t},{type:12,data:o},{type:12,data:i},{type:12,data:e.numHeads},{type:12,data:e.headSize},{type:12,data:e.hiddenSize},{type:12,data:e.hiddenSize+e.hiddenSize+e.vHiddenSize}],f=c=>{let p=G("output_q",u[0].dataType,n),b=G("output_k",u[0].dataType,n),h=G("output_v",u[0].dataType,n),g=D("input",u[0].dataType,u[0].dims),T=D("weight",u[1].dataType,u[1].dims),w=D("bias",u[2].dataType,u[2].dims),v=g.type.storage,S=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"hidden_size",type:"u32"},{name:"ldb",type:"u32"}];return` + }`};return{name:"AttentionScore",shaderCache:{hint:`${t!==void 0};${r.outputCount}`,inputDependencies:g},getRunData:()=>({outputs:T,dispatchGroup:b,programUniforms:h}),getShaderSource:w}},Sn=(r,e,n,t,o,i,s,a,u,l,f)=>{let c=r.outputCount,p=l.kvNumHeads!==void 0||c>1?l.pastSequenceLength:0,b=p+l.kvSequenceLength,h=l.kvNumHeads===void 0&&c>1&&s?[e,n,s]:[e,n];u&&h.push(u);let g=r.compute(T2(r,e,n,c>1?s:void 0,u,l,f,p),{inputs:h,outputs:l.kvNumHeads===void 0&&c>1?[-1,1]:[-1]})[0];r.compute(w2(r,g,l.batchSize*l.numHeads*l.sequenceLength,b),{inputs:[g],outputs:[]});let T=l.kvNumHeads===void 0&&c>1&&a?[g,t,a]:[g,t];r.compute(_2(r,g,t,c>1&&a?a:void 0,l,p),{inputs:T,outputs:l.kvNumHeads===void 0&&c>1?[0,2]:[0]})},I2=(r,e)=>{let n=[e.batchSize,e.numHeads,e.sequenceLength,e.headSize],t=e.sequenceLength,o=e.inputHiddenSize,i=e.headSize,s=12,a={x:Math.ceil(e.headSize/s),y:Math.ceil(e.sequenceLength/s),z:e.batchSize*e.numHeads},u=[r.inputs[0],r.inputs[1],r.inputs[2]],l=[{type:12,data:t},{type:12,data:o},{type:12,data:i},{type:12,data:e.numHeads},{type:12,data:e.headSize},{type:12,data:e.hiddenSize},{type:12,data:e.hiddenSize+e.hiddenSize+e.vHiddenSize}],f=c=>{let p=G("output_q",u[0].dataType,n),b=G("output_k",u[0].dataType,n),h=G("output_v",u[0].dataType,n),g=D("input",u[0].dataType,u[0].dims),T=D("weight",u[1].dataType,u[1].dims),w=D("bias",u[2].dataType,u[2].dims),v=g.type.storage,S=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"hidden_size",type:"u32"},{name:"ldb",type:"u32"}];return` const TILE_SIZE = ${s}u; var tileInput: array<${v}, ${s*s}>; var tileWeightQ: array<${v}, ${s*s}>; @@ -2151,7 +2151,7 @@ var best_index : i32 = 0;`,`if (${t.getByIndices("input_indices")} ${e.selectLas output_k[outputIdx] = valueK; output_v[outputIdx] = valueV; } - }`};return r.compute({name:"AttentionPrepare",shaderCache:{inputDependencies:["type","type","type"]},getRunData:()=>({outputs:[{dims:n,dataType:r.inputs[0].dataType,gpuDataType:0},{dims:n,dataType:r.inputs[0].dataType,gpuDataType:0},{dims:n,dataType:r.inputs[0].dataType,gpuDataType:0}],dispatchGroup:a,programUniforms:l}),getShaderSource:f},{inputs:u,outputs:[-1,-1,-1]})},vg=(r,e)=>{let n=y2(r.inputs,e),[t,o,i]=T2(r,n);return In(r,t,o,i,r.inputs[4],void 0,void 0,void 0,r.inputs[5],n,e)}});var _2,I2,S2,wg,Tg=C(()=>{"use strict";ft();ue();ye();et();he();_2=(r,e)=>{if(!r||r.length!==5)throw new Error("BatchNormalization requires 5 inputs");let n=(t,o,i)=>{let s=o.length;if(s!==t.length)throw new Error(`${i}: num dimensions != ${s}`);o.forEach((a,u)=>{if(a!==t[u])throw new Error(`${i}: dim[${u}] do not match`)})};if(r[0].dims.length>1){let t=e.format==="NHWC"?e.spatial?r[0].dims.slice(-1):r[0].dims.slice(-1).concat(r[0].dims.slice(1,r[0].dims.length-1)):r[0].dims.slice(1,e.spatial?2:void 0);n(r[1].dims,t,"Invalid input scale"),n(r[2].dims,t,"Invalid input B"),n(r[3].dims,t,"Invalid input mean"),n(r[4].dims,t,"Invalid input var")}else n(r[1].dims,[1],"Invalid input scale"),n(r[2].dims,[1],"Invalid input B"),n(r[3].dims,[1],"Invalid input mean"),n(r[4].dims,[1],"Invalid input var")},I2=(r,e)=>{let{epsilon:n,spatial:t,format:o}=e,i=r[0].dims,s=t?ze(i[i.length-1]):1,a=o==="NHWC"&&i.length>1?s:1,u=B.size(i)/s,l=t,f=l?i.length:i,c=D("x",r[0].dataType,r[0].dims,s),p=D("scale",r[1].dataType,r[1].dims,a),b=D("bias",r[2].dataType,r[2].dims,a),h=D("inputMean",r[3].dataType,r[3].dims,a),g=D("inputVar",r[4].dataType,r[4].dims,a),T=G("y",r[0].dataType,f,s),w=()=>{let S="";if(t)S=`let cOffset = ${i.length===1?"0u":o==="NHWC"?`outputIndices[${i.length-1}] / ${s}`:"outputIndices[1]"};`;else if(o==="NCHW")S=` + }`};return r.compute({name:"AttentionPrepare",shaderCache:{inputDependencies:["type","type","type"]},getRunData:()=>({outputs:[{dims:n,dataType:r.inputs[0].dataType,gpuDataType:0},{dims:n,dataType:r.inputs[0].dataType,gpuDataType:0},{dims:n,dataType:r.inputs[0].dataType,gpuDataType:0}],dispatchGroup:a,programUniforms:l}),getShaderSource:f},{inputs:u,outputs:[-1,-1,-1]})},vg=(r,e)=>{let n=v2(r.inputs,e),[t,o,i]=I2(r,n);return Sn(r,t,o,i,r.inputs[4],void 0,void 0,void 0,r.inputs[5],n,e)}});var S2,$2,A2,wg,Tg=C(()=>{"use strict";ft();ue();ye();et();he();S2=(r,e)=>{if(!r||r.length!==5)throw new Error("BatchNormalization requires 5 inputs");let n=(t,o,i)=>{let s=o.length;if(s!==t.length)throw new Error(`${i}: num dimensions != ${s}`);o.forEach((a,u)=>{if(a!==t[u])throw new Error(`${i}: dim[${u}] do not match`)})};if(r[0].dims.length>1){let t=e.format==="NHWC"?e.spatial?r[0].dims.slice(-1):r[0].dims.slice(-1).concat(r[0].dims.slice(1,r[0].dims.length-1)):r[0].dims.slice(1,e.spatial?2:void 0);n(r[1].dims,t,"Invalid input scale"),n(r[2].dims,t,"Invalid input B"),n(r[3].dims,t,"Invalid input mean"),n(r[4].dims,t,"Invalid input var")}else n(r[1].dims,[1],"Invalid input scale"),n(r[2].dims,[1],"Invalid input B"),n(r[3].dims,[1],"Invalid input mean"),n(r[4].dims,[1],"Invalid input var")},$2=(r,e)=>{let{epsilon:n,spatial:t,format:o}=e,i=r[0].dims,s=t?ze(i[i.length-1]):1,a=o==="NHWC"&&i.length>1?s:1,u=B.size(i)/s,l=t,f=l?i.length:i,c=D("x",r[0].dataType,r[0].dims,s),p=D("scale",r[1].dataType,r[1].dims,a),b=D("bias",r[2].dataType,r[2].dims,a),h=D("inputMean",r[3].dataType,r[3].dims,a),g=D("inputVar",r[4].dataType,r[4].dims,a),T=G("y",r[0].dataType,f,s),w=()=>{let S="";if(t)S=`let cOffset = ${i.length===1?"0u":o==="NHWC"?`outputIndices[${i.length-1}] / ${s}`:"outputIndices[1]"};`;else if(o==="NCHW")S=` ${T.indicesSet("outputIndices","0","0")} let cOffset = ${T.indicesToOffset("outputIndices")};`;else{S=`var cIndices = ${p.type.indices}(0); cIndices[0] = outputIndices[${i.length-1}];`;for(let $=1;$` @@ -2168,7 +2168,7 @@ var best_index : i32 = 0;`,`if (${t.getByIndices("input_indices")} ${e.selectLas let x = ${c.getByOffset("global_idx")}; let value = (x - inputMean) * inverseSqrt(inputVar + epsilon) * scale + bias; ${T.setByOffset("global_idx","value")} - }`;return{name:"BatchNormalization",shaderCache:{hint:`${e.epsilon}_${e.format}_${t}_${s}`,inputDependencies:l?["rank","type","type","type","type"]:void 0},getShaderSource:v,getRunData:()=>({outputs:[{dims:r[0].dims,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:l?[{type:12,data:u},...W(i)]:[{type:12,data:u}]})}},S2=r=>de(r),wg=(r,e)=>{let{inputs:n,outputCount:t}=r,o=S2({...e,outputCount:t});if(le.webgpu.validateInputContent&&_2(n,o),e.trainingMode)throw new Error("BatchNormalization trainingMode is not supported yet.");r.compute(I2(n,o))}});var $2,A2,_g,Ig=C(()=>{"use strict";ye();he();$2=r=>{if(r[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![320,640,1280].includes(r[0].dims[2]))throw new Error("number of channels should be 320, 640 or 1280");if(r[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(r[0].dims[2]!==r[1].dims[0])throw new Error("last dimension of input and bias are not the same")},A2=r=>{let e=r[0].dims,n=r[0].dims[2],t=B.size(e)/4,o=r[0].dataType,i=D("input",o,e,4),s=D("bias",o,[n],4),a=D("residual",o,e,4),u=G("output",o,e,4);return{name:"BiasAdd",getRunData:()=>({outputs:[{dims:e,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(t/64)}}),getShaderSource:f=>` + }`;return{name:"BatchNormalization",shaderCache:{hint:`${e.epsilon}_${e.format}_${t}_${s}`,inputDependencies:l?["rank","type","type","type","type"]:void 0},getShaderSource:v,getRunData:()=>({outputs:[{dims:r[0].dims,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:l?[{type:12,data:u},...W(i)]:[{type:12,data:u}]})}},A2=r=>de(r),wg=(r,e)=>{let{inputs:n,outputCount:t}=r,o=A2({...e,outputCount:t});if(le.webgpu.validateInputContent&&S2(n,o),e.trainingMode)throw new Error("BatchNormalization trainingMode is not supported yet.");r.compute($2(n,o))}});var P2,O2,_g,Ig=C(()=>{"use strict";ye();he();P2=r=>{if(r[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![320,640,1280].includes(r[0].dims[2]))throw new Error("number of channels should be 320, 640 or 1280");if(r[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(r[0].dims[2]!==r[1].dims[0])throw new Error("last dimension of input and bias are not the same")},O2=r=>{let e=r[0].dims,n=r[0].dims[2],t=B.size(e)/4,o=r[0].dataType,i=D("input",o,e,4),s=D("bias",o,[n],4),a=D("residual",o,e,4),u=G("output",o,e,4);return{name:"BiasAdd",getRunData:()=>({outputs:[{dims:e,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(t/64)}}),getShaderSource:f=>` const channels = ${n}u / 4; ${f.declareVariables(i,s,a,u)} @@ -2177,7 +2177,7 @@ var best_index : i32 = 0;`,`if (${t.getByIndices("input_indices")} ${e.selectLas let value = ${i.getByOffset("global_idx")} + ${s.getByOffset("global_idx % channels")} + ${a.getByOffset("global_idx")}; ${u.setByOffset("global_idx","value")} - }`}},_g=r=>{$2(r.inputs),r.compute(A2(r.inputs))}});var P2,Ee,Sg,$g,Ag,Pg,Og,Eg,Cg,kg,Dg,O2,Bg,Lg,Rg,Ng,Zn,zg,Ri,Fg,Mg,Vg,Gg,Ug,Wg,Hg,qg,Kg,jg,Xg,Zg,Yg,Jg,Qg,eb,tb,rb,Zs,Ys,nb,ob,ib,E2,C2,ab,Ni=C(()=>{"use strict";ue();ye();et();he();P2=(r,e,n,t,o,i)=>{let s=Math.ceil(e/4),a="";typeof o=="string"?a=`${o}(a)`:a=o("a");let u=D("inputData",n,[s],4),l=G("outputData",t,[s],4);return` + }`}},_g=r=>{P2(r.inputs),r.compute(O2(r.inputs))}});var E2,Ee,Sg,$g,Ag,Pg,Og,Eg,Cg,kg,Dg,C2,Bg,Lg,Rg,Ng,Zn,zg,Ri,Fg,Mg,Vg,Gg,Ug,Wg,Hg,qg,jg,Kg,Xg,Zg,Yg,Jg,Qg,eb,tb,rb,Ys,Js,nb,ob,ib,k2,D2,ab,Ni=C(()=>{"use strict";ue();ye();et();he();E2=(r,e,n,t,o,i)=>{let s=Math.ceil(e/4),a="";typeof o=="string"?a=`${o}(a)`:a=o("a");let u=D("inputData",n,[s],4),l=G("outputData",t,[s],4);return` ${r.registerUniform("vec_size","u32").declareVariables(u,l)} ${i??""} @@ -2187,7 +2187,7 @@ var best_index : i32 = 0;`,`if (${t.getByIndices("input_indices")} ${e.selectLas let a = ${u.getByOffset("global_idx")}; ${l.setByOffset("global_idx",a)} - }`},Ee=(r,e,n,t,o,i=r.dataType)=>({name:e,shaderCache:{hint:o,inputDependencies:["type"]},getShaderSource:s=>P2(s,B.size(r.dims),r.dataType,i,n,t),getRunData:s=>({outputs:[{dims:r.dims,dataType:i}],dispatchGroup:{x:Math.ceil(B.size(s[0].dims)/64/4)},programUniforms:[{type:12,data:Math.ceil(B.size(r.dims)/4)}]})}),Sg=r=>{r.compute(Ee(r.inputs[0],"Abs","abs"))},$g=r=>{r.compute(Ee(r.inputs[0],"Acos","acos"))},Ag=r=>{r.compute(Ee(r.inputs[0],"Acosh","acosh"))},Pg=r=>{r.compute(Ee(r.inputs[0],"Asin","asin"))},Og=r=>{r.compute(Ee(r.inputs[0],"Asinh","asinh"))},Eg=r=>{r.compute(Ee(r.inputs[0],"Atan","atan"))},Cg=r=>{r.compute(Ee(r.inputs[0],"Atanh","atanh"))},kg=r=>de(r),Dg=(r,e)=>{let n;switch(e.to){case 10:n="vec4";break;case 1:n="vec4";break;case 12:n="vec4";break;case 6:n="vec4";break;case 9:n="vec4";break;default:throw new RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${e.to}`)}r.compute(Ee(r.inputs[0],"Cast",n,void 0,e.cacheKey,e.to))},O2=r=>{let e=r.length>=2&&r[1].data!==0?r[1].getFloat32Array()[0]:Ei,n=r.length>=3&&r[2].data!==0?r[2].getFloat32Array()[0]:Ci;return de({min:e,max:n})},Bg=(r,e)=>{let n=r.inputs.length===1?e:O2(r.inputs),t=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"Clip",o=>`clamp(${o}, clip_min_, clip_max_)`,` + }`},Ee=(r,e,n,t,o,i=r.dataType)=>({name:e,shaderCache:{hint:o,inputDependencies:["type"]},getShaderSource:s=>E2(s,B.size(r.dims),r.dataType,i,n,t),getRunData:s=>({outputs:[{dims:r.dims,dataType:i}],dispatchGroup:{x:Math.ceil(B.size(s[0].dims)/64/4)},programUniforms:[{type:12,data:Math.ceil(B.size(r.dims)/4)}]})}),Sg=r=>{r.compute(Ee(r.inputs[0],"Abs","abs"))},$g=r=>{r.compute(Ee(r.inputs[0],"Acos","acos"))},Ag=r=>{r.compute(Ee(r.inputs[0],"Acosh","acosh"))},Pg=r=>{r.compute(Ee(r.inputs[0],"Asin","asin"))},Og=r=>{r.compute(Ee(r.inputs[0],"Asinh","asinh"))},Eg=r=>{r.compute(Ee(r.inputs[0],"Atan","atan"))},Cg=r=>{r.compute(Ee(r.inputs[0],"Atanh","atanh"))},kg=r=>de(r),Dg=(r,e)=>{let n;switch(e.to){case 10:n="vec4";break;case 1:n="vec4";break;case 12:n="vec4";break;case 6:n="vec4";break;case 9:n="vec4";break;default:throw new RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${e.to}`)}r.compute(Ee(r.inputs[0],"Cast",n,void 0,e.cacheKey,e.to))},C2=r=>{let e=r.length>=2&&r[1].data!==0?r[1].getFloat32Array()[0]:Ei,n=r.length>=3&&r[2].data!==0?r[2].getFloat32Array()[0]:Ci;return de({min:e,max:n})},Bg=(r,e)=>{let n=r.inputs.length===1?e:C2(r.inputs),t=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"Clip",o=>`clamp(${o}, clip_min_, clip_max_)`,` const clip_min_: vec4<${t}> = vec4(${t}(${n.min})); const clip_max_: vec4<${t}> = vec4(${t}(${n.max})); `,n.cacheKey),{inputs:[0]})},Lg=r=>{r.compute(Ee(r.inputs[0],"Ceil","ceil"))},Rg=r=>{r.compute(Ee(r.inputs[0],"Cos","cos"))},Ng=r=>{r.compute(Ee(r.inputs[0],"Cosh","cosh"))},Zn=r=>de(r),zg=(r,e)=>{let n=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"Elu",t=>`elu_vf32(${t})`,` @@ -2211,7 +2211,7 @@ fn erf_vf32(v: vec4<${r}>) -> vec4<${r}> { let absv = abs(v); let x = 1.0 / (1.0 + r0 * absv); return sign(v) * (1.0 - ((((r5 * x + r4) * x + r3) * x + r2) * x + r1) * x * exp(-absv * absv)); -}`,Fg=r=>{let e=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"Erf",n=>`erf_vf32(${n})`,Ri(e)))},Mg=r=>{r.compute(Ee(r.inputs[0],"Exp","exp"))},Vg=r=>{r.compute(Ee(r.inputs[0],"Floor","floor"))},Gg=r=>{let e=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"Gelu",n=>`0.5 * ${n} * (1.0 + erf_vf32(${n} * 0.7071067811865475))`,Ri(e)))},Ug=(r,e)=>{let n=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"LeakyRelu",t=>`select(leaky_relu_alpha_ * ${t}, ${t}, ${t} >= vec4<${n}>(0.0))`,`const leaky_relu_alpha_ = ${n}(${e.alpha});`,e.cacheKey))},Wg=r=>{r.compute(Ee(r.inputs[0],"Not",e=>`!${e}`))},Hg=r=>{r.compute(Ee(r.inputs[0],"Neg",e=>`-${e}`))},qg=r=>{r.compute(Ee(r.inputs[0],"Reciprocal",e=>`1.0/${e}`))},Kg=r=>{let e=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"Relu",n=>`select(vec4<${e}>(0.0), ${n}, ${n} > vec4<${e}>(0.0))`))},jg=r=>{r.compute(Ee(r.inputs[0],"Sigmoid",e=>`(1.0 / (1.0 + exp(-${e})))`))},Xg=r=>de(r),Zg=(r,e)=>{let n=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"HardSigmoid",t=>`max(vec4<${n}>(0.0), min(vec4<${n}>(1.0), ${e.alpha} * ${t} + vec4<${n}>(${e.beta})))`,void 0,e.cacheKey))},Yg=r=>{r.compute(Ee(r.inputs[0],"Sin","sin"))},Jg=r=>{r.compute(Ee(r.inputs[0],"Sinh","sinh"))},Qg=r=>{r.compute(Ee(r.inputs[0],"Sqrt","sqrt"))},eb=r=>{r.compute(Ee(r.inputs[0],"Tan","tan"))},tb=r=>`sign(${r}) * (1 - exp(-2 * abs(${r}))) / (1 + exp(-2 * abs(${r})))`,rb=r=>{r.compute(Ee(r.inputs[0],"Tanh",tb))},Zs=(r="f32")=>` +}`,Fg=r=>{let e=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"Erf",n=>`erf_vf32(${n})`,Ri(e)))},Mg=r=>{r.compute(Ee(r.inputs[0],"Exp","exp"))},Vg=r=>{r.compute(Ee(r.inputs[0],"Floor","floor"))},Gg=r=>{let e=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"Gelu",n=>`0.5 * ${n} * (1.0 + erf_vf32(${n} * 0.7071067811865475))`,Ri(e)))},Ug=(r,e)=>{let n=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"LeakyRelu",t=>`select(leaky_relu_alpha_ * ${t}, ${t}, ${t} >= vec4<${n}>(0.0))`,`const leaky_relu_alpha_ = ${n}(${e.alpha});`,e.cacheKey))},Wg=r=>{r.compute(Ee(r.inputs[0],"Not",e=>`!${e}`))},Hg=r=>{r.compute(Ee(r.inputs[0],"Neg",e=>`-${e}`))},qg=r=>{r.compute(Ee(r.inputs[0],"Reciprocal",e=>`1.0/${e}`))},jg=r=>{let e=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"Relu",n=>`select(vec4<${e}>(0.0), ${n}, ${n} > vec4<${e}>(0.0))`))},Kg=r=>{r.compute(Ee(r.inputs[0],"Sigmoid",e=>`(1.0 / (1.0 + exp(-${e})))`))},Xg=r=>de(r),Zg=(r,e)=>{let n=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"HardSigmoid",t=>`max(vec4<${n}>(0.0), min(vec4<${n}>(1.0), ${e.alpha} * ${t} + vec4<${n}>(${e.beta})))`,void 0,e.cacheKey))},Yg=r=>{r.compute(Ee(r.inputs[0],"Sin","sin"))},Jg=r=>{r.compute(Ee(r.inputs[0],"Sinh","sinh"))},Qg=r=>{r.compute(Ee(r.inputs[0],"Sqrt","sqrt"))},eb=r=>{r.compute(Ee(r.inputs[0],"Tan","tan"))},tb=r=>`sign(${r}) * (1 - exp(-2 * abs(${r}))) / (1 + exp(-2 * abs(${r})))`,rb=r=>{r.compute(Ee(r.inputs[0],"Tanh",tb))},Ys=(r="f32")=>` const fast_gelu_a: ${r} = 0.5; const fast_gelu_b: ${r} = 0.7978845608028654; const fast_gelu_c: ${r} = 0.035677408136300125; @@ -2219,7 +2219,7 @@ const fast_gelu_c: ${r} = 0.035677408136300125; fn tanh_v(v: vec4<${r}>) -> vec4<${r}> { return ${tb("v")}; } -`,Ys=r=>`(fast_gelu_a + fast_gelu_a * tanh_v(${r} * (fast_gelu_c * ${r} * ${r} + fast_gelu_b))) * ${r}`,nb=r=>{let e=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"FastGelu",Ys,Zs(e),void 0,r.inputs[0].dataType))},ob=(r,e)=>{let n=ct(r.inputs[0].dataType);return r.compute(Ee(r.inputs[0],"ThresholdedRelu",t=>`select(vec4<${n}>(0.0), ${t}, ${t} > thresholded_relu_alpha_)`,`const thresholded_relu_alpha_ = vec4<${n}>(${e.alpha});`,e.cacheKey)),0},ib=r=>{r.compute(Ee(r.inputs[0],"Log","log"))},E2=(r,e)=>` +`,Js=r=>`(fast_gelu_a + fast_gelu_a * tanh_v(${r} * (fast_gelu_c * ${r} * ${r} + fast_gelu_b))) * ${r}`,nb=r=>{let e=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"FastGelu",Js,Ys(e),void 0,r.inputs[0].dataType))},ob=(r,e)=>{let n=ct(r.inputs[0].dataType);return r.compute(Ee(r.inputs[0],"ThresholdedRelu",t=>`select(vec4<${n}>(0.0), ${t}, ${t} > thresholded_relu_alpha_)`,`const thresholded_relu_alpha_ = vec4<${n}>(${e.alpha});`,e.cacheKey)),0},ib=r=>{r.compute(Ee(r.inputs[0],"Log","log"))},k2=(r,e)=>` const alpha = vec4<${r}>(${e}); const one = ${r}(1.0); const zero = ${r}(0.0); @@ -2236,7 +2236,7 @@ fn quick_gelu_impl(x: vec4<${r}>) -> vec4<${r}> { } return x * x1; } -`,C2=r=>`quick_gelu_impl(${r})`,ab=(r,e)=>{let n=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"QuickGelu",C2,E2(n,e.alpha),e.cacheKey,r.inputs[0].dataType))}});var k2,D2,ub,lb=C(()=>{"use strict";ye();he();Ni();k2=r=>{if(r[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![2560,5120,10240].includes(r[0].dims[2]))throw new Error("hidden state should be 2560, 5120 or 10240");if(r[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(r[0].dims[2]!==r[1].dims[0])throw new Error("last dimension of input and bias are not the same")},D2=r=>{let e=r[0].dims.slice();e[2]=e[2]/2;let n=D("input",r[0].dataType,r[0].dims,4),t=D("bias",r[0].dataType,[r[0].dims[2]],4),o=G("output",r[0].dataType,e,4),i=B.size(e)/4,s=Be(r[0].dataType);return{name:"BiasSplitGelu",getRunData:()=>({outputs:[{dims:e,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(i/64)}}),getShaderSource:u=>` +`,D2=r=>`quick_gelu_impl(${r})`,ab=(r,e)=>{let n=ct(r.inputs[0].dataType);r.compute(Ee(r.inputs[0],"QuickGelu",D2,k2(n,e.alpha),e.cacheKey,r.inputs[0].dataType))}});var B2,L2,ub,lb=C(()=>{"use strict";ye();he();Ni();B2=r=>{if(r[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![2560,5120,10240].includes(r[0].dims[2]))throw new Error("hidden state should be 2560, 5120 or 10240");if(r[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(r[0].dims[2]!==r[1].dims[0])throw new Error("last dimension of input and bias are not the same")},L2=r=>{let e=r[0].dims.slice();e[2]=e[2]/2;let n=D("input",r[0].dataType,r[0].dims,4),t=D("bias",r[0].dataType,[r[0].dims[2]],4),o=G("output",r[0].dataType,e,4),i=B.size(e)/4,s=Be(r[0].dataType);return{name:"BiasSplitGelu",getRunData:()=>({outputs:[{dims:e,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(i/64)}}),getShaderSource:u=>` const M_SQRT2 = sqrt(2.0); const halfChannels = ${r[0].dims[2]/4/2}u; @@ -2254,7 +2254,7 @@ fn quick_gelu_impl(x: vec4<${r}>) -> vec4<${r}> { let geluRight = valueRight * 0.5 * (erf_vf32(valueRight / M_SQRT2) + 1); ${o.setByOffset("global_idx","valueLeft * geluRight")} - }`}},ub=r=>{k2(r.inputs),r.compute(D2(r.inputs))}});var B2,L2,ur,cb,fb,db,pb,mb,hb,gb,bb,yb,xb,vb=C(()=>{"use strict";ue();ye();he();B2=(r,e,n,t,o,i,s,a,u,l,f,c)=>{let p,b;typeof a=="string"?p=b=(v,S)=>`${a}((${v}),(${S}))`:typeof a=="function"?p=b=a:(p=a.scalar,b=a.vector);let h=G("outputData",f,t.length,4),g=D("aData",u,e.length,4),T=D("bData",l,n.length,4),w;if(o)if(i){let v=B.size(e)===1,S=B.size(n)===1,$=e.length>0&&e[e.length-1]%4===0,P=n.length>0&&n[n.length-1]%4===0;v||S?w=h.setByOffset("global_idx",b(v?`${g.type.value}(${g.getByOffset("0")}.x)`:g.getByOffset("global_idx"),S?`${T.type.value}(${T.getByOffset("0")}.x)`:T.getByOffset("global_idx"))):w=` + }`}},ub=r=>{B2(r.inputs),r.compute(L2(r.inputs))}});var R2,N2,ur,cb,fb,db,pb,mb,hb,gb,bb,yb,xb,vb=C(()=>{"use strict";ue();ye();he();R2=(r,e,n,t,o,i,s,a,u,l,f,c)=>{let p,b;typeof a=="string"?p=b=(v,S)=>`${a}((${v}),(${S}))`:typeof a=="function"?p=b=a:(p=a.scalar,b=a.vector);let h=G("outputData",f,t.length,4),g=D("aData",u,e.length,4),T=D("bData",l,n.length,4),w;if(o)if(i){let v=B.size(e)===1,S=B.size(n)===1,$=e.length>0&&e[e.length-1]%4===0,P=n.length>0&&n[n.length-1]%4===0;v||S?w=h.setByOffset("global_idx",b(v?`${g.type.value}(${g.getByOffset("0")}.x)`:g.getByOffset("global_idx"),S?`${T.type.value}(${T.getByOffset("0")}.x)`:T.getByOffset("global_idx"))):w=` let outputIndices = ${h.offsetToIndices("global_idx * 4u")}; let offsetA = ${g.broadcastedIndicesToOffset("outputIndices",h)}; let offsetB = ${T.broadcastedIndicesToOffset("outputIndices",h)}; @@ -2287,7 +2287,7 @@ fn quick_gelu_impl(x: vec4<${r}>) -> vec4<${r}> { ${r.mainStart()} ${r.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} ${w} - }`},L2=(r,e,n,t,o,i,s=n.dataType)=>{let a=!B.areEqual(n.dims,t.dims),u=n.dims,l=B.size(n.dims),f=!1,c=!1,p=[a];if(a){let b=nr.calcShape(n.dims,t.dims,!1);if(!b)throw new Error("Can't perform binary op on the given tensors");u=b,l=B.size(u);let h=B.size(n.dims)===1,g=B.size(t.dims)===1,T=n.dims.length>0&&n.dims[n.dims.length-1]%4===0,w=t.dims.length>0&&t.dims[t.dims.length-1]%4===0;p.push(h),p.push(g),p.push(T),p.push(w);let v=1;for(let S=1;Sb.toString()).join("_"),inputDependencies:["rank","rank"]},getShaderSource:b=>B2(b,n.dims,t.dims,u,f,a,c,o,n.dataType,t.dataType,s,i),getRunData:()=>({outputs:[{dims:u,dataType:s}],dispatchGroup:{x:Math.ceil(l/64/4)},programUniforms:[{type:12,data:Math.ceil(B.size(u)/4)},...W(n.dims,t.dims,u)]})}},ur=(r,e,n,t,o,i)=>{r.compute(L2(e,o??"",r.inputs[0],r.inputs[1],n,t,i))},cb=r=>{ur(r,"Add",(e,n)=>`${e}+${n}`)},fb=r=>{ur(r,"Div",(e,n)=>`${e}/${n}`)},db=r=>{ur(r,"Equal",{scalar:(e,n)=>`u32(${e}==${n})`,vector:(e,n)=>`vec4(${e}==${n})`},void 0,void 0,9)},pb=r=>{ur(r,"Mul",(e,n)=>`${e}*${n}`)},mb=r=>{let e=D("input",r.inputs[0].dataType,r.inputs[0].dims).type.value;ur(r,"Pow",{scalar:(t,o)=>`pow_custom(${t},${o})`,vector:(t,o)=>`pow_vector_custom(${t},${o})`},` + }`},N2=(r,e,n,t,o,i,s=n.dataType)=>{let a=!B.areEqual(n.dims,t.dims),u=n.dims,l=B.size(n.dims),f=!1,c=!1,p=[a];if(a){let b=nr.calcShape(n.dims,t.dims,!1);if(!b)throw new Error("Can't perform binary op on the given tensors");u=b,l=B.size(u);let h=B.size(n.dims)===1,g=B.size(t.dims)===1,T=n.dims.length>0&&n.dims[n.dims.length-1]%4===0,w=t.dims.length>0&&t.dims[t.dims.length-1]%4===0;p.push(h),p.push(g),p.push(T),p.push(w);let v=1;for(let S=1;Sb.toString()).join("_"),inputDependencies:["rank","rank"]},getShaderSource:b=>R2(b,n.dims,t.dims,u,f,a,c,o,n.dataType,t.dataType,s,i),getRunData:()=>({outputs:[{dims:u,dataType:s}],dispatchGroup:{x:Math.ceil(l/64/4)},programUniforms:[{type:12,data:Math.ceil(B.size(u)/4)},...W(n.dims,t.dims,u)]})}},ur=(r,e,n,t,o,i)=>{r.compute(N2(e,o??"",r.inputs[0],r.inputs[1],n,t,i))},cb=r=>{ur(r,"Add",(e,n)=>`${e}+${n}`)},fb=r=>{ur(r,"Div",(e,n)=>`${e}/${n}`)},db=r=>{ur(r,"Equal",{scalar:(e,n)=>`u32(${e}==${n})`,vector:(e,n)=>`vec4(${e}==${n})`},void 0,void 0,9)},pb=r=>{ur(r,"Mul",(e,n)=>`${e}*${n}`)},mb=r=>{let e=D("input",r.inputs[0].dataType,r.inputs[0].dims).type.value;ur(r,"Pow",{scalar:(t,o)=>`pow_custom(${t},${o})`,vector:(t,o)=>`pow_vector_custom(${t},${o})`},` fn pow_custom(a : ${e}, b : ${e}) -> ${e} { if (b == ${e}(0.0)) { return ${e}(1.0); @@ -2300,7 +2300,7 @@ fn quick_gelu_impl(x: vec4<${r}>) -> vec4<${r}> { // TODO: implement vectorized pow return vec4<${e}>(pow_custom(a.x, b.x), pow_custom(a.y, b.y), pow_custom(a.z, b.z), pow_custom(a.w, b.w)); } - `)},hb=r=>{ur(r,"Sub",(e,n)=>`${e}-${n}`)},gb=r=>{ur(r,"Greater",{scalar:(e,n)=>`u32(${e}>${n})`,vector:(e,n)=>`vec4(${e}>${n})`},void 0,void 0,9)},bb=r=>{ur(r,"Less",{scalar:(e,n)=>`u32(${e}<${n})`,vector:(e,n)=>`vec4(${e}<${n})`},void 0,void 0,9)},yb=r=>{ur(r,"GreaterOrEqual",{scalar:(e,n)=>`u32(${e}>=${n})`,vector:(e,n)=>`vec4(${e}>=${n})`},void 0,void 0,9)},xb=r=>{ur(r,"LessOrEqual",{scalar:(e,n)=>`u32(${e}<=${n})`,vector:(e,n)=>`vec4(${e}<=${n})`},void 0,void 0,9)}});var N2,z2,F2,M2,wb,Tb,_b=C(()=>{"use strict";ue();ye();et();he();N2=(r,e)=>{if(!r||r.length<1)throw new Error("too few inputs");let n=0,t=r[n],o=t.dataType,i=t.dims.length;r.forEach((s,a)=>{if(a!==n){if(s.dataType!==o)throw new Error("input tensors should be one type");if(s.dims.length!==i)throw new Error("input tensors should have the same shape");s.dims.forEach((u,l)=>{if(l!==e&&u!==t.dims[l])throw new Error("non concat dimensions must match")})}})},z2=(r,e)=>` + `)},hb=r=>{ur(r,"Sub",(e,n)=>`${e}-${n}`)},gb=r=>{ur(r,"Greater",{scalar:(e,n)=>`u32(${e}>${n})`,vector:(e,n)=>`vec4(${e}>${n})`},void 0,void 0,9)},bb=r=>{ur(r,"Less",{scalar:(e,n)=>`u32(${e}<${n})`,vector:(e,n)=>`vec4(${e}<${n})`},void 0,void 0,9)},yb=r=>{ur(r,"GreaterOrEqual",{scalar:(e,n)=>`u32(${e}>=${n})`,vector:(e,n)=>`vec4(${e}>=${n})`},void 0,void 0,9)},xb=r=>{ur(r,"LessOrEqual",{scalar:(e,n)=>`u32(${e}<=${n})`,vector:(e,n)=>`vec4(${e}<=${n})`},void 0,void 0,9)}});var F2,M2,V2,G2,wb,Tb,_b=C(()=>{"use strict";ue();ye();et();he();F2=(r,e)=>{if(!r||r.length<1)throw new Error("too few inputs");let n=0,t=r[n],o=t.dataType,i=t.dims.length;r.forEach((s,a)=>{if(a!==n){if(s.dataType!==o)throw new Error("input tensors should be one type");if(s.dims.length!==i)throw new Error("input tensors should have the same shape");s.dims.forEach((u,l)=>{if(l!==e&&u!==t.dims[l])throw new Error("non concat dimensions must match")})}})},M2=(r,e)=>` fn calculateInputIndex(index: u32) -> u32 { let sizeInConcatAxis = array(${e}); for (var i: u32 = 0u; i < ${r}; i += 1u ) { @@ -2309,12 +2309,12 @@ fn quick_gelu_impl(x: vec4<${r}>) -> vec4<${r}> { } } return ${r}u; - }`,F2=(r,e)=>{let n=r.length,t=[];for(let o=0;o{let o=B.size(n),i=new Array(r.length),s=new Array(r.length),a=0,u=[],l=[],f=[{type:12,data:o}];for(let g=0;g`uniforms.sizeInConcatAxis${g}`).join(","),h=g=>` + }`,V2=(r,e)=>{let n=r.length,t=[];for(let o=0;o{let o=B.size(n),i=new Array(r.length),s=new Array(r.length),a=0,u=[],l=[],f=[{type:12,data:o}];for(let g=0;g`uniforms.sizeInConcatAxis${g}`).join(","),h=g=>` ${(()=>{g.registerUniform("outputSize","u32");for(let T=0;T) -> vec4<${r}> { ${p} -= sizeInConcatAxis[inputIndex - 1u]; } - ${F2(s,c)} - }`;return{name:"Concat",shaderCache:{hint:`${e}`,inputDependencies:u},getRunData:()=>({outputs:[{dims:n,dataType:t}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:f}),getShaderSource:h}},wb=(r,e)=>{let n=r.inputs,t=n[0].dims,o=B.normalizeAxis(e.axis,t.length);N2(n,o);let i=t.slice();i[o]=n.reduce((a,u)=>a+(u.dims.length>o?u.dims[o]:0),0);let s=n.filter(a=>B.size(a.dims)>0);r.compute(M2(s,o,i,n[0].dataType),{inputs:s})},Tb=r=>de({axis:r.axis})});var Wt,Ht,qt,zi,Or=C(()=>{"use strict";ue();ye();Wt=(r,e,n="f32")=>{switch(r.activation){case"Relu":return`value = max(value, ${e}(0.0));`;case"Sigmoid":return`value = (${e}(1.0) / (${e}(1.0) + exp(-value)));`;case"Clip":return`value = clamp(value, ${e}(${n}(uniforms.clip_min)), ${e}(${n}(uniforms.clip_max)));`;case"HardSigmoid":return`value = max(${e}(0.0), min(${e}(1.0), ${n}(uniforms.alpha) * value + ${n}(uniforms.beta)));`;case"LeakyRelu":return`value = select(${n}(uniforms.alpha) * value, value, value >= ${e}(0.0));`;case"":return"";default:throw new Error(`Unsupported activation ${r.activation}`)}},Ht=(r,e)=>{r.activation==="Clip"?e.push({type:1,data:r.clipMax},{type:1,data:r.clipMin}):r.activation==="HardSigmoid"?e.push({type:1,data:r.alpha},{type:1,data:r.beta}):r.activation==="LeakyRelu"&&e.push({type:1,data:r.alpha})},qt=(r,e)=>{r.activation==="Clip"?e.push({name:"clip_max",type:"f32"},{name:"clip_min",type:"f32"}):r.activation==="HardSigmoid"?e.push({name:"alpha",type:"f32"},{name:"beta",type:"f32"}):r.activation==="LeakyRelu"&&e.push({name:"alpha",type:"f32"})},zi=r=>{let e=r?.activation||"";if(e==="HardSigmoid"){let[n,t]=r?.activation_params||[.2,.5];return{activation:e,alpha:n,beta:t}}else if(e==="Clip"){let[n,t]=r?.activation_params||[Ei,Ci];return{activation:e,clipMax:t,clipMin:n}}else if(e==="LeakyRelu"){let[n]=r?.activation_params||[.01];return{activation:e,alpha:n}}return{activation:e}}});var pt,Fi,Mi=C(()=>{"use strict";pt=(r,e)=>{switch(r){case 1:return e;case 2:return`vec2<${e}>`;case 3:return`vec3<${e}>`;case 4:return`vec4<${e}>`;default:throw new Error(`${r}-component is not supported.`)}},Fi=r=>` + ${V2(s,c)} + }`;return{name:"Concat",shaderCache:{hint:`${e}`,inputDependencies:u},getRunData:()=>({outputs:[{dims:n,dataType:t}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:f}),getShaderSource:h}},wb=(r,e)=>{let n=r.inputs,t=n[0].dims,o=B.normalizeAxis(e.axis,t.length);F2(n,o);let i=t.slice();i[o]=n.reduce((a,u)=>a+(u.dims.length>o?u.dims[o]:0),0);let s=n.filter(a=>B.size(a.dims)>0);r.compute(G2(s,o,i,n[0].dataType),{inputs:s})},Tb=r=>de({axis:r.axis})});var Wt,Ht,qt,zi,Or=C(()=>{"use strict";ue();ye();Wt=(r,e,n="f32")=>{switch(r.activation){case"Relu":return`value = max(value, ${e}(0.0));`;case"Sigmoid":return`value = (${e}(1.0) / (${e}(1.0) + exp(-value)));`;case"Clip":return`value = clamp(value, ${e}(${n}(uniforms.clip_min)), ${e}(${n}(uniforms.clip_max)));`;case"HardSigmoid":return`value = max(${e}(0.0), min(${e}(1.0), ${n}(uniforms.alpha) * value + ${n}(uniforms.beta)));`;case"LeakyRelu":return`value = select(${n}(uniforms.alpha) * value, value, value >= ${e}(0.0));`;case"":return"";default:throw new Error(`Unsupported activation ${r.activation}`)}},Ht=(r,e)=>{r.activation==="Clip"?e.push({type:1,data:r.clipMax},{type:1,data:r.clipMin}):r.activation==="HardSigmoid"?e.push({type:1,data:r.alpha},{type:1,data:r.beta}):r.activation==="LeakyRelu"&&e.push({type:1,data:r.alpha})},qt=(r,e)=>{r.activation==="Clip"?e.push({name:"clip_max",type:"f32"},{name:"clip_min",type:"f32"}):r.activation==="HardSigmoid"?e.push({name:"alpha",type:"f32"},{name:"beta",type:"f32"}):r.activation==="LeakyRelu"&&e.push({name:"alpha",type:"f32"})},zi=r=>{let e=r?.activation||"";if(e==="HardSigmoid"){let[n,t]=r?.activation_params||[.2,.5];return{activation:e,alpha:n,beta:t}}else if(e==="Clip"){let[n,t]=r?.activation_params||[Ei,Ci];return{activation:e,clipMax:t,clipMin:n}}else if(e==="LeakyRelu"){let[n]=r?.activation_params||[.01];return{activation:e,alpha:n}}return{activation:e}}});var pt,Fi,Mi=C(()=>{"use strict";pt=(r,e)=>{switch(r){case 1:return e;case 2:return`vec2<${e}>`;case 3:return`vec3<${e}>`;case 4:return`vec4<${e}>`;default:throw new Error(`${r}-component is not supported.`)}},Fi=r=>` ${r?"value = value + getBiasByOutputCoords(coords);":""} - `});var Vi,Js=C(()=>{"use strict";Vi=r=>` + `});var Vi,Qs=C(()=>{"use strict";Vi=r=>` fn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 { return dot(coords, vec4( shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1)); @@ -2339,7 +2339,7 @@ fn getOutputIndexFromCoords(coords : vec4) -> i32 { return dot(coords, vec4( i32(${r}.x), i32(${r}.y), i32(${r}.z), 1)); } -`});var V2,G2,Yn,Ib,U2,Jn,W2,Gi,Qn=C(()=>{"use strict";ue();ye();he();Or();Mi();V2=(r,e)=>r?` +`});var U2,W2,Yn,Ib,H2,Jn,q2,Gi,Qn=C(()=>{"use strict";ue();ye();he();Or();Mi();U2=(r,e)=>r?` mm_Asub[inputRow][inputCol] = mm_readA(batch, kStart + inputRow, globalRowStart / innerElementSize + inputCol${e?", batchIndices":""}); @@ -2347,7 +2347,7 @@ fn getOutputIndexFromCoords(coords : vec4) -> i32 { mm_Asub[inputRow][inputCol] = mm_readA(batch, globalRow + innerRow, kStart / innerElementSize + inputCol${e?", batchIndices":""}); - `,G2=(r,e)=>r?` + `,W2=(r,e)=>r?` let ACached0 = mm_Asub[k * innerElementSize][localRow]; let ACached1 = mm_Asub[k * innerElementSize + 1][localRow]; let ACached2 = mm_Asub[k * innerElementSize + 2][localRow]; @@ -2401,7 +2401,7 @@ fn main(@builtin(local_invocation_id) localId : vec3, for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { let inputRow = tileRow + innerRow; let inputCol = tileCol; - ${V2(o,t)} + ${U2(o,t)} } // Load one tile of B into local memory. @@ -2420,7 +2420,7 @@ fn main(@builtin(local_invocation_id) localId : vec3, let BCached2 = mm_Bsub[k * innerElementSize + 2][tileCol]; ${p===3?"":"let BCached3 = mm_Bsub[k * innerElementSize + 3][tileCol];"} - ${G2(o,p)} + ${W2(o,p)} } workgroupBarrier(); @@ -2437,7 +2437,7 @@ fn main(@builtin(local_invocation_id) localId : vec3, mm_Asub[inputRow][inputCol] = mm_readA(batch, globalRowStart + inputRow, kStart + inputCol${e?", batchIndices":""}); - `,U2=r=>r?"let ACached = mm_Asub[k][tileRow + innerRow];":"let ACached = mm_Asub[tileRow + innerRow][k];",Jn=(r,e,n="f32",t,o=!1,i=32,s=!1,a=32,u=!1)=>{let l=r[1]*e[1],f=r[0]*e[0],c=o?l:i,p=o?i:l;if(!(p%e[1]===0&&c%e[0]===0&&i%e[1]===0))throw new Error(`tileAHight ${p} must be divisible by workgroupSize[1]${e[1]}, tileAWidth ${c} must be divisible by workgroupSize[0]${e[0]}, tileInner ${i} must be divisible by workgroupSize[1]${e[1]}`);let b=p/e[1],h=c/e[0],g=i/e[1],T=u?` + `,H2=r=>r?"let ACached = mm_Asub[k][tileRow + innerRow];":"let ACached = mm_Asub[tileRow + innerRow][k];",Jn=(r,e,n="f32",t,o=!1,i=32,s=!1,a=32,u=!1)=>{let l=r[1]*e[1],f=r[0]*e[0],c=o?l:i,p=o?i:l;if(!(p%e[1]===0&&c%e[0]===0&&i%e[1]===0))throw new Error(`tileAHight ${p} must be divisible by workgroupSize[1]${e[1]}, tileAWidth ${c} must be divisible by workgroupSize[0]${e[0]}, tileInner ${i} must be divisible by workgroupSize[1]${e[1]}`);let b=p/e[1],h=c/e[0],g=i/e[1],T=u?` let localRow = i32(localId.y); let localCol = i32(localId.x); let globalRowStart = i32(workgroupId.y) * ${l}; @@ -2528,7 +2528,7 @@ for (var t = 0; t < num_tiles; t = t + 1) { } for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { - ${U2(o)} + ${H2(o)} for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol]; } @@ -2563,7 +2563,7 @@ fn main(@builtin(local_invocation_id) localId : vec3, var acc : array, rowPerThread>; ${T} } -`},W2=(r,e,n,t,o,i=!1)=>{let[s,a,u]=o,[l,f,c,p]=t,b=_n(s,u),h=_n(a,u),g=Be(t[0].type.tensor),T=()=>{let S=f.rank,$=l.rank,P=`var aIndices: ${f.type.indices};`;for(let E=S-2-1,N=$-1;E>=0;E--,N--)P+=` +`},q2=(r,e,n,t,o,i=!1)=>{let[s,a,u]=o,[l,f,c,p]=t,b=In(s,u),h=In(a,u),g=Be(t[0].type.tensor),T=()=>{let S=f.rank,$=l.rank,P=`var aIndices: ${f.type.indices};`;for(let E=S-2-1,N=$-1;E>=0;E--,N--)P+=` aIndices[${E}] = ${$>1?`batchIndices[${N}]`:"batchIndices"};`;return b.forEach(E=>{P+=` aIndices[${E}] = 0;`}),P+=` aIndices[${S-2}] = u32(row); @@ -2604,11 +2604,11 @@ bIndices[${S-2}] = u32(row); ${p.setByIndices("vec3(coords)","value")} } } - `},Gi=(r,e,n,t,o=!1)=>{let i=r[0].dims,s=r[1].dims,a=i.slice(0,-2),u=s.slice(0,-2),l=t?t.slice(0,-2):n.slice(0,-2),f=B.size(l),c=i[i.length-2],p=i[i.length-1],b=s[s.length-1],h=p%4===0&&b%4===0,g=c<=8?[4,1,1]:[4,4,1],T=[8,8,1],w=[Math.ceil(b/T[0]/g[0]),Math.ceil(c/T[1]/g[1]),Math.ceil(f/T[2]/g[2])],v=h?4:1,S=[...a,c,p/v],$=S.length,P=[...u,p,b/v],E=P.length,N=[f,c,b/v],z=[{type:6,data:c},{type:6,data:b},{type:6,data:p}];Ht(e,z),z.push(...W(l,S,P));let q=["rank","rank"],K=r.length>2;K&&(z.push(...W(r[2].dims)),q.push("rank")),z.push(...W(N));let F=_e=>{let $e=l.length,ae=ki("batchDims",r[0].dataType,$e,1),qe=Be(r[0].dataType),Q=D("a",r[0].dataType,$,v),ge=D("b",r[1].dataType,E,v),Ie=G("result",r[0].dataType,N.length,v),xe=[Q,ge];if(K){let V=o?v:1;xe.push(D("bias",r[2].dataType,r[2].dims.length,V))}let se=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"}];qt(e,se);let pe=Be(Ie.type.tensor),ce=Wt(e,Ie.type.value,pe),ut=W2(v,K,ce,[ae,Q,ge,Ie],[a,u,l],o);return` + `},Gi=(r,e,n,t,o=!1)=>{let i=r[0].dims,s=r[1].dims,a=i.slice(0,-2),u=s.slice(0,-2),l=t?t.slice(0,-2):n.slice(0,-2),f=B.size(l),c=i[i.length-2],p=i[i.length-1],b=s[s.length-1],h=p%4===0&&b%4===0,g=c<=8?[4,1,1]:[4,4,1],T=[8,8,1],w=[Math.ceil(b/T[0]/g[0]),Math.ceil(c/T[1]/g[1]),Math.ceil(f/T[2]/g[2])],v=h?4:1,S=[...a,c,p/v],$=S.length,P=[...u,p,b/v],E=P.length,N=[f,c,b/v],z=[{type:6,data:c},{type:6,data:b},{type:6,data:p}];Ht(e,z),z.push(...W(l,S,P));let q=["rank","rank"],j=r.length>2;j&&(z.push(...W(r[2].dims)),q.push("rank")),z.push(...W(N));let F=_e=>{let $e=l.length,ae=ki("batchDims",r[0].dataType,$e,1),qe=Be(r[0].dataType),Q=D("a",r[0].dataType,$,v),ge=D("b",r[1].dataType,E,v),Ie=G("result",r[0].dataType,N.length,v),xe=[Q,ge];if(j){let V=o?v:1;xe.push(D("bias",r[2].dataType,r[2].dims.length,V))}let se=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"}];qt(e,se);let pe=Be(Ie.type.tensor),ce=Wt(e,Ie.type.value,pe),ut=q2(v,j,ce,[ae,Q,ge,Ie],[a,u,l],o);return` ${_e.registerUniforms(se).registerInternalVariables(ae).declareVariables(...xe,Ie)} ${ut} ${h?Yn(g,T,qe,ae):Jn(g,T,qe,ae)} - `};return{name:"MatMul",shaderCache:{hint:`${g};${e.activation};${h};${o}`,inputDependencies:q},getRunData:()=>({outputs:[{dims:n,dataType:r[0].dataType}],dispatchGroup:{x:w[0],y:w[1],z:w[2]},programUniforms:z}),getShaderSource:F}}});var H2,Sb,$b=C(()=>{"use strict";ue();mr();he();Or();Mi();Js();Qn();H2=(r,e,n,t,o=!1,i,s=4,a=4,u=4,l="f32")=>{let f=K=>{switch(K){case 1:return"resData = x[xIndex];";case 3:return`resData = vec3<${l}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;case 4:return"resData = x[xIndex / 4];";default:throw new Error(`innerElementSize ${K} is not supported.`)}},c=K=>{switch(K){case 1:return"return w[row * i32(uniforms.w_shape[3]) + colIn];";case 4:return"return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];";default:throw new Error(`innerElementSize ${K} is not supported.`)}},p=r?` + `};return{name:"MatMul",shaderCache:{hint:`${g};${e.activation};${h};${o}`,inputDependencies:q},getRunData:()=>({outputs:[{dims:n,dataType:r[0].dataType}],dispatchGroup:{x:w[0],y:w[1],z:w[2]},programUniforms:z}),getShaderSource:F}}});var j2,Sb,$b=C(()=>{"use strict";ue();mr();he();Or();Mi();Qs();Qn();j2=(r,e,n,t,o=!1,i,s=4,a=4,u=4,l="f32")=>{let f=j=>{switch(j){case 1:return"resData = x[xIndex];";case 3:return`resData = vec3<${l}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;case 4:return"resData = x[xIndex / 4];";default:throw new Error(`innerElementSize ${j} is not supported.`)}},c=j=>{switch(j){case 1:return"return w[row * i32(uniforms.w_shape[3]) + colIn];";case 4:return"return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];";default:throw new Error(`innerElementSize ${j} is not supported.`)}},p=r?` let coord = vec4(batch, xRow, xCol, xCh); `:` let coord = vec4(batch, xCh, xRow, xCol); @@ -2677,7 +2677,7 @@ bIndices[${S-2}] = u32(row); ${z} setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); } - }`},Sb=(r,e,n,t,o,i,s,a)=>{let u=e.format==="NHWC",l=u?r[0].dims[3]:r[0].dims[1],f=n[0],c=u?n[2]:n[3],p=u?n[1]:n[2],b=u?n[3]:n[1],h=u&&(l%4===0||l%3===0)&&b%4===0,g=u?b:c*p,T=u?c*p:b,w=[8,8,1],v=t<=8?[4,1,1]:[4,4,1],S=[Math.ceil(g/w[0]/v[0]),Math.ceil(T/w[1]/v[1]),Math.ceil(f/w[2]/v[2])];Ne("verbose",()=>`[conv2d_mm_webgpu] dispatch = ${S}`);let $=h?u&&l%4!==0?3:4:1,P=w[1]*v[1],E=w[0]*v[0],N=Math.max(w[0]*$,w[1]),z=t%P===0,q=o%E===0,K=i%N===0,F=h?[$,4,4]:[1,1,1],_e=[{type:6,data:t},{type:6,data:o},{type:6,data:i},{type:6,data:[e.pads[0],e.pads[1]]},{type:6,data:e.strides},{type:6,data:e.dilations}];Ht(e,_e),_e.push(...W(r[0].dims,r[1].dims));let $e=["rank","rank"];s&&(_e.push(...W(r[2].dims)),$e.push("rank")),_e.push(...W(n));let ae=qe=>{let Q=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"},{name:"pad",type:"i32",length:2},{name:"stride",type:"i32",length:2},{name:"dilation",type:"i32",length:2}];qt(e,Q);let ge=h?4:1,Ie=Be(r[0].dataType),xe=` + }`},Sb=(r,e,n,t,o,i,s,a)=>{let u=e.format==="NHWC",l=u?r[0].dims[3]:r[0].dims[1],f=n[0],c=u?n[2]:n[3],p=u?n[1]:n[2],b=u?n[3]:n[1],h=u&&(l%4===0||l%3===0)&&b%4===0,g=u?b:c*p,T=u?c*p:b,w=[8,8,1],v=t<=8?[4,1,1]:[4,4,1],S=[Math.ceil(g/w[0]/v[0]),Math.ceil(T/w[1]/v[1]),Math.ceil(f/w[2]/v[2])];Ne("verbose",()=>`[conv2d_mm_webgpu] dispatch = ${S}`);let $=h?u&&l%4!==0?3:4:1,P=w[1]*v[1],E=w[0]*v[0],N=Math.max(w[0]*$,w[1]),z=t%P===0,q=o%E===0,j=i%N===0,F=h?[$,4,4]:[1,1,1],_e=[{type:6,data:t},{type:6,data:o},{type:6,data:i},{type:6,data:[e.pads[0],e.pads[1]]},{type:6,data:e.strides},{type:6,data:e.dilations}];Ht(e,_e),_e.push(...W(r[0].dims,r[1].dims));let $e=["rank","rank"];s&&(_e.push(...W(r[2].dims)),$e.push("rank")),_e.push(...W(n));let ae=qe=>{let Q=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"},{name:"pad",type:"i32",length:2},{name:"stride",type:"i32",length:2},{name:"dilation",type:"i32",length:2}];qt(e,Q);let ge=h?4:1,Ie=Be(r[0].dataType),xe=` fn setOutputAtIndex(flatIndex : i32, value : ${h?`vec4<${Ie}>`:Ie}) { result[flatIndex] = ${h?`vec4<${Ie}>`:Ie}(value); } @@ -2694,12 +2694,12 @@ bIndices[${S-2}] = u32(row); // dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32 }; ${qe.registerUniforms(Q).declareVariables(...ce,ut)} ${xe} - ${H2(u,z,q,K,s,e,F[0],F[1],F[2],Ie)} - ${h?Yn(v,w,Ie,void 0,!u,N):Jn(v,w,Ie,void 0,!u,N,!1,void 0,a)}`};return{name:"Conv2DMatMul",shaderCache:{hint:`${e.cacheKey};${$};${h};${z};${q};${K};${P};${E};${N}`,inputDependencies:$e},getRunData:()=>({outputs:[{dims:n,dataType:r[0].dataType}],dispatchGroup:{x:S[0],y:S[1],z:S[2]},programUniforms:_e}),getShaderSource:ae}}});var q2,Ab,Ui,K2,Pb,j2,Ob,Eb,Cb=C(()=>{"use strict";ue();mr();ye();he();q2=r=>{let e=1;for(let n=0;ntypeof r=="number"?[r,r,r]:r,Ui=(r,e)=>e<=1?r:r+(r-1)*(e-1),K2=(r,e,n,t=1)=>{let o=Ui(e,t);return Math.floor((r[0]*(n-1)-n+o)/2)},Pb=(r,e,n,t,o)=>{o==null&&(o=K2(r,e[0],t[0]));let i=[0,0,0,n];for(let s=0;s<3;s++)r[s]+2*o>=e[s]&&(i[s]=Math.trunc((r[s]-e[s]+2*o)/t[s]+1));return i},j2=(r,e,n,t,o,i,s,a,u,l)=>{let f,c,p,b;if(r==="VALID"&&(r=0),typeof r=="number"){f={top:r,bottom:r,left:r,right:r,front:r,back:r};let h=Pb([e,n,t,1],[a,u,l],1,[o,i,s],r);c=h[0],p=h[1],b=h[2]}else if(Array.isArray(r)){if(!r.every((g,T,w)=>g===w[0]))throw Error(`Unsupported padding parameter: ${r}`);f={top:r[0],bottom:r[1],left:r[2],right:r[3],front:r[4],back:r[5]};let h=Pb([e,n,t,1],[a,u,l],1,[o,i,s],r[0]);c=h[0],p=h[1],b=h[2]}else if(r==="SAME_UPPER"){c=Math.ceil(e/o),p=Math.ceil(n/i),b=Math.ceil(t/s);let h=(c-1)*o+a-e,g=(p-1)*i+u-n,T=(b-1)*s+l-t,w=Math.floor(h/2),v=h-w,S=Math.floor(g/2),$=g-S,P=Math.floor(T/2),E=T-P;f={top:S,bottom:$,left:P,right:E,front:w,back:v}}else throw Error(`Unknown padding parameter: ${r}`);return{padInfo:f,outDepth:c,outHeight:p,outWidth:b}},Ob=(r,e,n,t,o,i=!1,s="channelsLast")=>{let a,u,l,f,c;if(s==="channelsLast")[a,u,l,f,c]=r;else if(s==="channelsFirst")[a,c,u,l,f]=r;else throw new Error(`Unknown dataFormat ${s}`);let[p,,b,h,g]=e,[T,w,v]=Ab(n),[S,$,P]=Ab(t),E=Ui(b,S),N=Ui(h,$),z=Ui(g,P),{padInfo:q,outDepth:K,outHeight:F,outWidth:_e}=j2(o,u,l,f,T,w,v,E,N,z),$e=i?p*c:p,ae=[0,0,0,0,0];return s==="channelsFirst"?ae=[a,$e,K,F,_e]:s==="channelsLast"&&(ae=[a,K,F,_e,$e]),{batchSize:a,dataFormat:s,inDepth:u,inHeight:l,inWidth:f,inChannels:c,outDepth:K,outHeight:F,outWidth:_e,outChannels:$e,padInfo:q,strideDepth:T,strideHeight:w,strideWidth:v,filterDepth:b,filterHeight:h,filterWidth:g,effectiveFilterDepth:E,effectiveFilterHeight:N,effectiveFilterWidth:z,dilationDepth:S,dilationHeight:$,dilationWidth:P,inShape:r,outShape:ae,filterShape:e}},Eb=(r,e,n,t,o,i)=>{let s=i==="channelsLast",a=s?r[0].dims[3]:r[0].dims[1],u=!1,l=[64,1,1],f={x:n.map((v,S)=>S)},c=[Math.ceil(q2(f.x.map(v=>n[v]))/l[0]),1,1];Ne("verbose",()=>`[conv3d_naive_webgpu] dispatch = ${c}`);let p=u?s&&a%4!==0?3:4:1,b=B.size(n),h=[{type:12,data:b},{type:12,data:t},{type:12,data:o},{type:12,data:e.strides},{type:12,data:e.dilations}];h.push(...W(r[0].dims,r[1].dims));let g=["rank","rank"],T=r.length===3;T&&(h.push(...W(r[2].dims)),g.push("rank")),h.push(...W(n));let w=v=>{let S=[{name:"output_size",type:"u32"},{name:"filter_dims",type:"u32",length:t.length},{name:"pads",type:"u32",length:o.length},{name:"strides",type:"u32",length:e.strides.length},{name:"dilations",type:"u32",length:e.dilations.length}],$=u?4:1,P=Be(r[0].dataType),E=D("x",r[0].dataType,r[0].dims.length,p===3?1:p),N=D("W",r[1].dataType,r[1].dims.length,$),z=[E,N],q=G("result",r[0].dataType,n.length,$),K="";if(T){let F=D("bias",r[2].dataType,r[2].dims.length,$);z.push(F),K+=` + ${j2(u,z,q,j,s,e,F[0],F[1],F[2],Ie)} + ${h?Yn(v,w,Ie,void 0,!u,N):Jn(v,w,Ie,void 0,!u,N,!1,void 0,a)}`};return{name:"Conv2DMatMul",shaderCache:{hint:`${e.cacheKey};${$};${h};${z};${q};${j};${P};${E};${N}`,inputDependencies:$e},getRunData:()=>({outputs:[{dims:n,dataType:r[0].dataType}],dispatchGroup:{x:S[0],y:S[1],z:S[2]},programUniforms:_e}),getShaderSource:ae}}});var K2,Ab,Ui,X2,Pb,Z2,Ob,Eb,Cb=C(()=>{"use strict";ue();mr();ye();he();K2=r=>{let e=1;for(let n=0;ntypeof r=="number"?[r,r,r]:r,Ui=(r,e)=>e<=1?r:r+(r-1)*(e-1),X2=(r,e,n,t=1)=>{let o=Ui(e,t);return Math.floor((r[0]*(n-1)-n+o)/2)},Pb=(r,e,n,t,o)=>{o==null&&(o=X2(r,e[0],t[0]));let i=[0,0,0,n];for(let s=0;s<3;s++)r[s]+2*o>=e[s]&&(i[s]=Math.trunc((r[s]-e[s]+2*o)/t[s]+1));return i},Z2=(r,e,n,t,o,i,s,a,u,l)=>{let f,c,p,b;if(r==="VALID"&&(r=0),typeof r=="number"){f={top:r,bottom:r,left:r,right:r,front:r,back:r};let h=Pb([e,n,t,1],[a,u,l],1,[o,i,s],r);c=h[0],p=h[1],b=h[2]}else if(Array.isArray(r)){if(!r.every((g,T,w)=>g===w[0]))throw Error(`Unsupported padding parameter: ${r}`);f={top:r[0],bottom:r[1],left:r[2],right:r[3],front:r[4],back:r[5]};let h=Pb([e,n,t,1],[a,u,l],1,[o,i,s],r[0]);c=h[0],p=h[1],b=h[2]}else if(r==="SAME_UPPER"){c=Math.ceil(e/o),p=Math.ceil(n/i),b=Math.ceil(t/s);let h=(c-1)*o+a-e,g=(p-1)*i+u-n,T=(b-1)*s+l-t,w=Math.floor(h/2),v=h-w,S=Math.floor(g/2),$=g-S,P=Math.floor(T/2),E=T-P;f={top:S,bottom:$,left:P,right:E,front:w,back:v}}else throw Error(`Unknown padding parameter: ${r}`);return{padInfo:f,outDepth:c,outHeight:p,outWidth:b}},Ob=(r,e,n,t,o,i=!1,s="channelsLast")=>{let a,u,l,f,c;if(s==="channelsLast")[a,u,l,f,c]=r;else if(s==="channelsFirst")[a,c,u,l,f]=r;else throw new Error(`Unknown dataFormat ${s}`);let[p,,b,h,g]=e,[T,w,v]=Ab(n),[S,$,P]=Ab(t),E=Ui(b,S),N=Ui(h,$),z=Ui(g,P),{padInfo:q,outDepth:j,outHeight:F,outWidth:_e}=Z2(o,u,l,f,T,w,v,E,N,z),$e=i?p*c:p,ae=[0,0,0,0,0];return s==="channelsFirst"?ae=[a,$e,j,F,_e]:s==="channelsLast"&&(ae=[a,j,F,_e,$e]),{batchSize:a,dataFormat:s,inDepth:u,inHeight:l,inWidth:f,inChannels:c,outDepth:j,outHeight:F,outWidth:_e,outChannels:$e,padInfo:q,strideDepth:T,strideHeight:w,strideWidth:v,filterDepth:b,filterHeight:h,filterWidth:g,effectiveFilterDepth:E,effectiveFilterHeight:N,effectiveFilterWidth:z,dilationDepth:S,dilationHeight:$,dilationWidth:P,inShape:r,outShape:ae,filterShape:e}},Eb=(r,e,n,t,o,i)=>{let s=i==="channelsLast",a=s?r[0].dims[3]:r[0].dims[1],u=!1,l=[64,1,1],f={x:n.map((v,S)=>S)},c=[Math.ceil(K2(f.x.map(v=>n[v]))/l[0]),1,1];Ne("verbose",()=>`[conv3d_naive_webgpu] dispatch = ${c}`);let p=u?s&&a%4!==0?3:4:1,b=B.size(n),h=[{type:12,data:b},{type:12,data:t},{type:12,data:o},{type:12,data:e.strides},{type:12,data:e.dilations}];h.push(...W(r[0].dims,r[1].dims));let g=["rank","rank"],T=r.length===3;T&&(h.push(...W(r[2].dims)),g.push("rank")),h.push(...W(n));let w=v=>{let S=[{name:"output_size",type:"u32"},{name:"filter_dims",type:"u32",length:t.length},{name:"pads",type:"u32",length:o.length},{name:"strides",type:"u32",length:e.strides.length},{name:"dilations",type:"u32",length:e.dilations.length}],$=u?4:1,P=Be(r[0].dataType),E=D("x",r[0].dataType,r[0].dims.length,p===3?1:p),N=D("W",r[1].dataType,r[1].dims.length,$),z=[E,N],q=G("result",r[0].dataType,n.length,$),j="";if(T){let F=D("bias",r[2].dataType,r[2].dims.length,$);z.push(F),j+=` fn getBiasByOutputCoords(coords : array) -> ${u?`vec4<${P}>`:P} { return bias[${s?Z("coords",4,5):Z("coords",1,5)}${u?"/ 4":""}]; }`}return` - ${K} + ${j} fn getX(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { let aIndices = array(d0, d1, d2, d3, d4); return ${E.getByIndices("aIndices")}; @@ -2802,7 +2802,7 @@ bIndices[${S-2}] = u32(row); } ${T?"dotProd = dotProd + getBiasByOutputCoords(coords)":""}; result[global_idx] = f32(dotProd); - }`};return{name:"Conv3DNaive",shaderCache:{hint:`${e.cacheKey};${s};${p};${T}`,inputDependencies:g},getRunData:()=>({outputs:[{dims:n,dataType:r[0].dataType}],dispatchGroup:{x:c[0],y:c[1],z:c[2]},programUniforms:h}),getShaderSource:w}}});var Qs,kb,Db=C(()=>{"use strict";ue();ye();he();eu();Or();Qs=(r,e,n)=>{let t=r.length>2,o=t?"value += b[output_channel];":"",i=r[0].dims,s=r[1].dims,a=s[0]/e.group,u=e.format==="NHWC",l=Wi(i,s,e.dilations,e.pads,e.strides,u),f=B.size(l),c=[{type:12,data:f},{type:12,data:e.dilations},{type:12,data:[e.strides[0],e.strides[1]]},{type:12,data:[e.pads[0],e.pads[1]]},{type:12,data:a}];Ht(e,c),c.push(...W(i,s));let p=["rank","rank"];t&&(c.push(...W(r[2].dims)),p.push("rank")),c.push(...W(l));let b=h=>{let g=G("output",r[0].dataType,l.length),T=Be(g.type.tensor),w=Wt(e,g.type.value,T),v=D("x",r[0].dataType,i.length),S=D("w",r[1].dataType,s.length),$=[v,S];t&&$.push(D("b",r[2].dataType,r[2].dims.length));let P=[{name:"output_size",type:"u32"},{name:"dilations",type:"u32",length:e.dilations.length},{name:"strides",type:"u32",length:2},{name:"pads",type:"u32",length:2},{name:"output_channels_per_group",type:"u32"}];return qt(e,P),` + }`};return{name:"Conv3DNaive",shaderCache:{hint:`${e.cacheKey};${s};${p};${T}`,inputDependencies:g},getRunData:()=>({outputs:[{dims:n,dataType:r[0].dataType}],dispatchGroup:{x:c[0],y:c[1],z:c[2]},programUniforms:h}),getShaderSource:w}}});var eu,kb,Db=C(()=>{"use strict";ue();ye();he();tu();Or();eu=(r,e,n)=>{let t=r.length>2,o=t?"value += b[output_channel];":"",i=r[0].dims,s=r[1].dims,a=s[0]/e.group,u=e.format==="NHWC",l=Wi(i,s,e.dilations,e.pads,e.strides,u),f=B.size(l),c=[{type:12,data:f},{type:12,data:e.dilations},{type:12,data:[e.strides[0],e.strides[1]]},{type:12,data:[e.pads[0],e.pads[1]]},{type:12,data:a}];Ht(e,c),c.push(...W(i,s));let p=["rank","rank"];t&&(c.push(...W(r[2].dims)),p.push("rank")),c.push(...W(l));let b=h=>{let g=G("output",r[0].dataType,l.length),T=Be(g.type.tensor),w=Wt(e,g.type.value,T),v=D("x",r[0].dataType,i.length),S=D("w",r[1].dataType,s.length),$=[v,S];t&&$.push(D("b",r[2].dataType,r[2].dims.length));let P=[{name:"output_size",type:"u32"},{name:"dilations",type:"u32",length:e.dilations.length},{name:"strides",type:"u32",length:2},{name:"pads",type:"u32",length:2},{name:"output_channels_per_group",type:"u32"}];return qt(e,P),` ${h.registerUniforms(P).declareVariables(...$,g)} ${h.mainStart()} @@ -2884,7 +2884,7 @@ bIndices[${S-2}] = u32(row); ${T} ${h.set("batch","row","col + i","output_channel","value")}; } - }`};return{name:"GroupedConv-Vectorize",shaderCache:{hint:`${e.cacheKey};${o};${i};${c};${u[0]};${u[1]}`,inputDependencies:t?["rank","rank","type"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:n,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:f}),getShaderSource:p}}});var tu,X2,Bb,ru=C(()=>{"use strict";ue();ye();Qn();he();Or();tu=(r,e,n,t,o=!1)=>{let i=r[0].dims,s=r[1].dims,a=i[i.length-2],u=s[s.length-1],l=i[i.length-1],f=ze(u),c=ze(l),p=ze(a),b=B.size(n)/f/p,h=r.length>2,g=t?t.slice(0,-2):n.slice(0,-2),w=[B.size(g),a,u],v=[{type:12,data:b},{type:12,data:a},{type:12,data:u},{type:12,data:l}];Ht(e,v),v.push(...W(g,i,s)),h&&v.push(...W(r[2].dims)),v.push(...W(w));let S=$=>{let P=ki("batch_dims",r[0].dataType,g.length),E=D("a",r[0].dataType,i.length,c),N=D("b",r[1].dataType,s.length,f),z=G("output",r[0].dataType,w.length,f),q=Be(z.type.tensor),K=Wt(e,z.type.value,q),F=[E,N],_e="";if(h){let se=o?f:1;F.push(D("bias",r[2].dataType,r[2].dims.length,se)),_e=`${o?`value += bias[col / ${se}];`:`value += ${z.type.value}(bias[row + i]);`}`}let $e=i.slice(0,-2),ae=s.slice(0,-2),qe=_n($e,g),Q=_n(ae,g),ge=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"}];qt(e,ge);let Ie=(se,pe)=>{let ce=se.rank,ut=se.name;if(ce===2)return`var ${ut}_indices = ${se.type.indices}(0u, 0u);`;let V=P.rank,ie=`var ${ut}_indices: ${se.type.indices};`;for(let Te=ce-2-1,tt=V-1;Te>=0;Te--,tt--)ie+=` + }`};return{name:"GroupedConv-Vectorize",shaderCache:{hint:`${e.cacheKey};${o};${i};${c};${u[0]};${u[1]}`,inputDependencies:t?["rank","rank","type"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:n,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:f}),getShaderSource:p}}});var ru,Y2,Bb,nu=C(()=>{"use strict";ue();ye();Qn();he();Or();ru=(r,e,n,t,o=!1)=>{let i=r[0].dims,s=r[1].dims,a=i[i.length-2],u=s[s.length-1],l=i[i.length-1],f=ze(u),c=ze(l),p=ze(a),b=B.size(n)/f/p,h=r.length>2,g=t?t.slice(0,-2):n.slice(0,-2),w=[B.size(g),a,u],v=[{type:12,data:b},{type:12,data:a},{type:12,data:u},{type:12,data:l}];Ht(e,v),v.push(...W(g,i,s)),h&&v.push(...W(r[2].dims)),v.push(...W(w));let S=$=>{let P=ki("batch_dims",r[0].dataType,g.length),E=D("a",r[0].dataType,i.length,c),N=D("b",r[1].dataType,s.length,f),z=G("output",r[0].dataType,w.length,f),q=Be(z.type.tensor),j=Wt(e,z.type.value,q),F=[E,N],_e="";if(h){let se=o?f:1;F.push(D("bias",r[2].dataType,r[2].dims.length,se)),_e=`${o?`value += bias[col / ${se}];`:`value += ${z.type.value}(bias[row + i]);`}`}let $e=i.slice(0,-2),ae=s.slice(0,-2),qe=In($e,g),Q=In(ae,g),ge=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"}];qt(e,ge);let Ie=(se,pe)=>{let ce=se.rank,ut=se.name;if(ce===2)return`var ${ut}_indices = ${se.type.indices}(0u, 0u);`;let V=P.rank,ie=`var ${ut}_indices: ${se.type.indices};`;for(let Te=ce-2-1,tt=V-1;Te>=0;Te--,tt--)ie+=` ${ut}_indices[${Te}] = ${V>1?`batch_indices[${tt}]`:"batch_indices"};`;return pe.forEach(Te=>{ie+=` ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; ${ut}_indices[${ce-1}] = 0u;`,ie},xe=()=>{let se=`var a_data: ${E.type.value};`;for(let pe=0;pe({outputs:[{dims:n,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(b/64)},programUniforms:v}),getShaderSource:S}},X2=r=>{if(!r||r.length!==2)throw new Error("MatMul requires 2 inputs.");if(r[0].dims[r[0].dims.length-1]!==r[1].dims[r[1].dims.length-2])throw new Error("shared dimension does not match.")},Bb=r=>{X2(r.inputs);let e=nr.calcShape(r.inputs[0].dims,r.inputs[1].dims,!0);if(!e)throw new Error("Can't use matmul on the given tensors");let n=e[e.length-1],t=r.inputs[0].dims[r.inputs[0].dims.length-1];n<8&&t<8?r.compute(tu(r.inputs,{activation:""},e)):r.compute(Gi(r.inputs,{activation:""},e))}});var Wi,nu,Z2,ou,iu,Y2,J2,Q2,au,eu=C(()=>{"use strict";ye();$b();Cb();Qn();Db();Or();ru();Jr();Wi=(r,e,n,t,o,i)=>{let s=r[0],a=r.slice(i?1:2,i?3:4),u=a.length,l=e[0],c=e.slice(2).map((h,g)=>h+(h-1)*(n[g]-1)),b=a.map((h,g)=>h+t[g]+t[g+u]).map((h,g)=>Math.floor((h-c[g]+o[g])/o[g]));return b.splice(0,0,s),b.splice(i?3:1,0,l),b},nu=[2,3,1,0],Z2=(r,e)=>{if(!r||r.length!==2&&r.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(r[0].dims.length>5)throw new Error("greater than 5D is not supported");if(r[0].dims.length!==r[1].dims.length)throw new Error("filter does not have same dimension as input");let n=r[0].dims[e.format==="NHWC"?r[0].dims.length-1:1],t=r[1].dims[1]*e.group;if(n!==t)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if(r.length===3&&(r[2].dims.length!==1||r[1].dims[0]!==r[2].dims[0]))throw new Error("invalid bias");let o=r[0].dims.length-2;if(e.dilations.length!==o)throw new Error(`dilations should be ${o}D`);if(e.strides.length!==o)throw new Error(`strides should be ${o}D`);if(e.pads.length!==o*2)throw new Error(`pads should be ${o*2}D`);if(e.kernelShape.length!==0&&e.kernelShape.length!==r[1].dims.length-2)throw new Error("invalid kernel shape")},ou=(r,e)=>{let n=r.kernelShape.slice();for(let i=2;i{let e=zi(r),n=r.format,t=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][r.auto_pad],o=r.dilations,i=r.group,s=r.kernel_shape,a=r.pads,u=r.strides,l=r.w_is_const();return{autoPad:t,format:n,dilations:o,group:i,kernelShape:s,pads:a,strides:u,wIsConst:l,...e,cacheKey:`${r.format};${e.activation};`}},Y2=(r,e,n)=>{let t=ou(n,e),o=n.format==="NHWC";if(n.group!==1){if(!r.adapterInfo.isArchitecture("ampere")&&o&&e[1].dims[0]===n.group&&e[1].dims[1]===1&&n.dilations[0]===1&&n.dilations[1]===1){let N=Wi(e[0].dims,e[1].dims,n.dilations,t.pads,n.strides,o),z=r.kernelCustomData.wT??r.compute(Tt(e[1],nu),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!r.kernelCustomData.wT&&(r.kernelCustomData.wT=z);let q=[e[0],z];e.length===3&&q.push(e[2]),r.compute(kb(q,t,N),{inputs:q})}else r.compute(Qs(e,t));return}let i=e.length===3,s=e[0].dims[o?1:2],a=e[0].dims[o?2:3],u=e[0].dims[o?3:1],l=e[1].dims[2],f=e[1].dims[3],c=Wi(e[0].dims,e[1].dims,n.dilations,t.pads,n.strides,o),p=c[o?1:2],b=c[o?2:3],h=c[o?3:1],g=o&&l===s&&f===a&&n.pads[0]===0&&n.pads[1]===0;if(g||l===1&&f===1&&n.dilations[0]===1&&n.dilations[1]===1&&n.strides[0]===1&&n.strides[1]===1&&n.pads[0]===0&&n.pads[1]===0){let E=c[0],N,z,q,K=[];if(o){let $e=r.kernelCustomData.wT??r.compute(Tt(e[1],nu),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];if(n.wIsConst&&!r.kernelCustomData.wT&&(r.kernelCustomData.wT=$e),g){let ae=s*a*u;N=e[0].reshape([1,E,ae]),z=$e.reshape([1,ae,h]),q=[1,E,h]}else N=e[0].reshape([E,s*a,u]),z=$e.reshape([1,u,h]),q=[E,p*b,h];K.push(N),K.push(z)}else N=e[0].reshape([E,u,s*a]),z=e[1].reshape([1,h,u]),q=[E,h,p*b],K.push(z),K.push(N);i&&K.push(e[2]);let F=q[2],_e=K[0].dims[K[0].dims.length-1];F<8&&_e<8?r.compute(tu(K,t,c,q,o),{inputs:K}):r.compute(Gi(K,t,c,q,o),{inputs:K});return}let T=!0,w=r.kernelCustomData.wT??r.compute(Tt(e[1],nu),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!r.kernelCustomData.wT&&(r.kernelCustomData.wT=w);let v=[e[0],w];i&&v.push(e[2]);let S=o?p*b:h,$=o?h:p*b,P=l*f*u;r.compute(Sb(v,t,c,S,$,P,i,T),{inputs:v})},J2=(r,e)=>{let n=e.format==="NHWC",t=[r.inputs[0].reshape(n?[r.inputs[0].dims[0],1,r.inputs[0].dims[1],r.inputs[0].dims[2]]:[r.inputs[0].dims[0],r.inputs[0].dims[1],1,r.inputs[0].dims[2]]),r.inputs[1].reshape([r.inputs[1].dims[0],r.inputs[1].dims[1],1,r.inputs[1].dims[2]])];r.inputs.length===3&&t.push(r.inputs[2]);let o=[0,e.pads[0],0,e.pads[1]],i=[1].concat(e.strides),s=[1].concat(e.dilations),a=[1].concat(e.kernelShape),u=ou({...e,pads:o,strides:i,dilations:s,kernelShape:a},t);r.compute(Qs(t,u,l=>n?[l[0],l[2],l[3]]:[]))},Q2=(r,e,n)=>{let t=n.format==="NHWC"?"channelsLast":"channelsFirst",o=ou(n,e),i=n.autoPad==="NOTSET"?n.pads:n.autoPad,s=Ob(e[0].dims,e[1].dims,n.strides,n.dilations,i,!1,t);r.compute(Eb(e,o,s.outShape,[s.filterDepth,s.filterHeight,s.filterWidth],[s.padInfo.front,s.padInfo.top,s.padInfo.left],t))},au=(r,e)=>{Z2(r.inputs,e),r.inputs[0].dims.length===3?J2(r,e):r.inputs[0].dims.length===5?Q2(r,r.inputs,e):Y2(r,r.inputs,e)}});var e1,Lb,Rb=C(()=>{"use strict";ue();mr();he();Or();Mi();Js();Qn();e1=(r,e=!1,n,t,o=4)=>{let i=w=>{switch(w){case 1:return"return w[getIndexFromCoords4D(coord, vec4(uniforms.w_shape))];";case 4:return` + `};return{name:"MatMulNaive",shaderCache:{hint:`${e.activation};${f};${c};${p};${o}`,inputDependencies:h?["rank","rank","rank"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:n,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(b/64)},programUniforms:v}),getShaderSource:S}},Y2=r=>{if(!r||r.length!==2)throw new Error("MatMul requires 2 inputs.");if(r[0].dims[r[0].dims.length-1]!==r[1].dims[r[1].dims.length-2])throw new Error("shared dimension does not match.")},Bb=r=>{Y2(r.inputs);let e=nr.calcShape(r.inputs[0].dims,r.inputs[1].dims,!0);if(!e)throw new Error("Can't use matmul on the given tensors");let n=e[e.length-1],t=r.inputs[0].dims[r.inputs[0].dims.length-1];n<8&&t<8?r.compute(ru(r.inputs,{activation:""},e)):r.compute(Gi(r.inputs,{activation:""},e))}});var Wi,ou,J2,iu,au,Q2,e1,t1,su,tu=C(()=>{"use strict";ye();$b();Cb();Qn();Db();Or();nu();Jr();Wi=(r,e,n,t,o,i)=>{let s=r[0],a=r.slice(i?1:2,i?3:4),u=a.length,l=e[0],c=e.slice(2).map((h,g)=>h+(h-1)*(n[g]-1)),b=a.map((h,g)=>h+t[g]+t[g+u]).map((h,g)=>Math.floor((h-c[g]+o[g])/o[g]));return b.splice(0,0,s),b.splice(i?3:1,0,l),b},ou=[2,3,1,0],J2=(r,e)=>{if(!r||r.length!==2&&r.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(r[0].dims.length>5)throw new Error("greater than 5D is not supported");if(r[0].dims.length!==r[1].dims.length)throw new Error("filter does not have same dimension as input");let n=r[0].dims[e.format==="NHWC"?r[0].dims.length-1:1],t=r[1].dims[1]*e.group;if(n!==t)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if(r.length===3&&(r[2].dims.length!==1||r[1].dims[0]!==r[2].dims[0]))throw new Error("invalid bias");let o=r[0].dims.length-2;if(e.dilations.length!==o)throw new Error(`dilations should be ${o}D`);if(e.strides.length!==o)throw new Error(`strides should be ${o}D`);if(e.pads.length!==o*2)throw new Error(`pads should be ${o*2}D`);if(e.kernelShape.length!==0&&e.kernelShape.length!==r[1].dims.length-2)throw new Error("invalid kernel shape")},iu=(r,e)=>{let n=r.kernelShape.slice();for(let i=2;i{let e=zi(r),n=r.format,t=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][r.auto_pad],o=r.dilations,i=r.group,s=r.kernel_shape,a=r.pads,u=r.strides,l=r.w_is_const();return{autoPad:t,format:n,dilations:o,group:i,kernelShape:s,pads:a,strides:u,wIsConst:l,...e,cacheKey:`${r.format};${e.activation};`}},Q2=(r,e,n)=>{let t=iu(n,e),o=n.format==="NHWC";if(n.group!==1){if(!r.adapterInfo.isArchitecture("ampere")&&o&&e[1].dims[0]===n.group&&e[1].dims[1]===1&&n.dilations[0]===1&&n.dilations[1]===1){let N=Wi(e[0].dims,e[1].dims,n.dilations,t.pads,n.strides,o),z=r.kernelCustomData.wT??r.compute(Tt(e[1],ou),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!r.kernelCustomData.wT&&(r.kernelCustomData.wT=z);let q=[e[0],z];e.length===3&&q.push(e[2]),r.compute(kb(q,t,N),{inputs:q})}else r.compute(eu(e,t));return}let i=e.length===3,s=e[0].dims[o?1:2],a=e[0].dims[o?2:3],u=e[0].dims[o?3:1],l=e[1].dims[2],f=e[1].dims[3],c=Wi(e[0].dims,e[1].dims,n.dilations,t.pads,n.strides,o),p=c[o?1:2],b=c[o?2:3],h=c[o?3:1],g=o&&l===s&&f===a&&n.pads[0]===0&&n.pads[1]===0;if(g||l===1&&f===1&&n.dilations[0]===1&&n.dilations[1]===1&&n.strides[0]===1&&n.strides[1]===1&&n.pads[0]===0&&n.pads[1]===0){let E=c[0],N,z,q,j=[];if(o){let $e=r.kernelCustomData.wT??r.compute(Tt(e[1],ou),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];if(n.wIsConst&&!r.kernelCustomData.wT&&(r.kernelCustomData.wT=$e),g){let ae=s*a*u;N=e[0].reshape([1,E,ae]),z=$e.reshape([1,ae,h]),q=[1,E,h]}else N=e[0].reshape([E,s*a,u]),z=$e.reshape([1,u,h]),q=[E,p*b,h];j.push(N),j.push(z)}else N=e[0].reshape([E,u,s*a]),z=e[1].reshape([1,h,u]),q=[E,h,p*b],j.push(z),j.push(N);i&&j.push(e[2]);let F=q[2],_e=j[0].dims[j[0].dims.length-1];F<8&&_e<8?r.compute(ru(j,t,c,q,o),{inputs:j}):r.compute(Gi(j,t,c,q,o),{inputs:j});return}let T=!0,w=r.kernelCustomData.wT??r.compute(Tt(e[1],ou),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!r.kernelCustomData.wT&&(r.kernelCustomData.wT=w);let v=[e[0],w];i&&v.push(e[2]);let S=o?p*b:h,$=o?h:p*b,P=l*f*u;r.compute(Sb(v,t,c,S,$,P,i,T),{inputs:v})},e1=(r,e)=>{let n=e.format==="NHWC",t=[r.inputs[0].reshape(n?[r.inputs[0].dims[0],1,r.inputs[0].dims[1],r.inputs[0].dims[2]]:[r.inputs[0].dims[0],r.inputs[0].dims[1],1,r.inputs[0].dims[2]]),r.inputs[1].reshape([r.inputs[1].dims[0],r.inputs[1].dims[1],1,r.inputs[1].dims[2]])];r.inputs.length===3&&t.push(r.inputs[2]);let o=[0,e.pads[0],0,e.pads[1]],i=[1].concat(e.strides),s=[1].concat(e.dilations),a=[1].concat(e.kernelShape),u=iu({...e,pads:o,strides:i,dilations:s,kernelShape:a},t);r.compute(eu(t,u,l=>n?[l[0],l[2],l[3]]:[]))},t1=(r,e,n)=>{let t=n.format==="NHWC"?"channelsLast":"channelsFirst",o=iu(n,e),i=n.autoPad==="NOTSET"?n.pads:n.autoPad,s=Ob(e[0].dims,e[1].dims,n.strides,n.dilations,i,!1,t);r.compute(Eb(e,o,s.outShape,[s.filterDepth,s.filterHeight,s.filterWidth],[s.padInfo.front,s.padInfo.top,s.padInfo.left],t))},su=(r,e)=>{J2(r.inputs,e),r.inputs[0].dims.length===3?e1(r,e):r.inputs[0].dims.length===5?t1(r,r.inputs,e):Q2(r,r.inputs,e)}});var r1,Lb,Rb=C(()=>{"use strict";ue();mr();he();Or();Mi();Qs();Qn();r1=(r,e=!1,n,t,o=4)=>{let i=w=>{switch(w){case 1:return"return w[getIndexFromCoords4D(coord, vec4(uniforms.w_shape))];";case 4:return` let coord1 = vec4(coordX, coordY, col + 1, rowInner); let coord2 = vec4(coordX, coordY, col + 2, rowInner); let coord3 = vec4(coordX, coordY, col + 3, rowInner); @@ -3003,15 +3003,15 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; ${g} result[getIndexFromCoords4D(coords, vec4(uniforms.result_shape))/${o}] = value; } - }`},Lb=(r,e,n,t,o,i,s,a)=>{let u=e.format==="NHWC",l=u?r[0].dims[3]:r[0].dims[1],f=n[0],c=u?n[2]:n[3],p=u?n[1]:n[2],b=u?n[3]:n[1],h=u&&l%4===0&&l%3&&b%4===0,g=u?b:c*p,T=u?c*p:b,w=[8,8,1],v=t<=8?[4,1,1]:[4,4,1],S=[Math.ceil(g/w[0]/v[0]),Math.ceil(T/w[1]/v[1]),Math.ceil(f/w[2]/v[2])];Ne("verbose",()=>`[conv_backprop_mm_webgpu] dispatch = ${S}`);let $=h?4:1,P=Math.max(w[0]*$,w[1]),E=h?4:1,N=[e.kernelShape[u?1:2],e.kernelShape[u?2:3]],z=[N[0]+(e.dilations[0]<=1?0:(N[0]-1)*(e.dilations[0]-1)),N[1]+(e.dilations[1]<=1?0:(N[1]-1)*(e.dilations[1]-1))],q=[z[0]-1-Math.floor((e.pads[0]+e.pads[2])/2),z[1]-1-Math.floor((e.pads[1]+e.pads[3])/2)],K=[{type:6,data:t},{type:6,data:o},{type:6,data:i},{type:6,data:e.strides},{type:6,data:e.dilations},{type:6,data:N},{type:6,data:q}];Ht(e,K),K.push(...W(r[0].dims,r[1].dims));let F=["rank","rank"];s&&(K.push(...W(r[2].dims)),F.push("rank")),K.push(...W(n));let _e=$e=>{let ae=D("x",r[0].dataType,r[0].dims.length,E),qe=D("w",r[1].dataType,r[1].dims.length,1),Q=G("result",r[0].dataType,n.length,E),ge=[ae,qe],Ie="";if(s){let pe=D("bias",r[2].dataType,r[2].dims.length,E);ge.push(pe),Ie+=` + }`},Lb=(r,e,n,t,o,i,s,a)=>{let u=e.format==="NHWC",l=u?r[0].dims[3]:r[0].dims[1],f=n[0],c=u?n[2]:n[3],p=u?n[1]:n[2],b=u?n[3]:n[1],h=u&&l%4===0&&l%3&&b%4===0,g=u?b:c*p,T=u?c*p:b,w=[8,8,1],v=t<=8?[4,1,1]:[4,4,1],S=[Math.ceil(g/w[0]/v[0]),Math.ceil(T/w[1]/v[1]),Math.ceil(f/w[2]/v[2])];Ne("verbose",()=>`[conv_backprop_mm_webgpu] dispatch = ${S}`);let $=h?4:1,P=Math.max(w[0]*$,w[1]),E=h?4:1,N=[e.kernelShape[u?1:2],e.kernelShape[u?2:3]],z=[N[0]+(e.dilations[0]<=1?0:(N[0]-1)*(e.dilations[0]-1)),N[1]+(e.dilations[1]<=1?0:(N[1]-1)*(e.dilations[1]-1))],q=[z[0]-1-Math.floor((e.pads[0]+e.pads[2])/2),z[1]-1-Math.floor((e.pads[1]+e.pads[3])/2)],j=[{type:6,data:t},{type:6,data:o},{type:6,data:i},{type:6,data:e.strides},{type:6,data:e.dilations},{type:6,data:N},{type:6,data:q}];Ht(e,j),j.push(...W(r[0].dims,r[1].dims));let F=["rank","rank"];s&&(j.push(...W(r[2].dims)),F.push("rank")),j.push(...W(n));let _e=$e=>{let ae=D("x",r[0].dataType,r[0].dims.length,E),qe=D("w",r[1].dataType,r[1].dims.length,1),Q=G("result",r[0].dataType,n.length,E),ge=[ae,qe],Ie="";if(s){let pe=D("bias",r[2].dataType,r[2].dims.length,E);ge.push(pe),Ie+=` fn getBiasByOutputCoords(coords : vec4) -> ${pe.type.value} { return bias[coords.${u?"w":"y"}${h?"/ 4":""}]; }`}let xe=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"},{name:"strides",type:"i32",length:2},{name:"dilations",type:"i32",length:2},{name:"filter_dims",type:"i32",length:N.length},{name:"pads",type:"i32",length:q.length}];qt(e,xe);let se=Be(r[0].dataType,1);if(se!=="f16"&&se!=="f32")throw new Error(`elemType ${se} is not supported.`);return` ${Vi("uniforms.result_strides")} ${$e.registerUniforms(xe).declareVariables(...ge,Q)}; ${Ie} - ${e1(u,s,e,ae.type.value,$)} - ${h?Yn(v,w,se,void 0,!u,P):Jn(v,w,se,void 0,!u,P,!1,void 0,a)}`};return{name:"Conv2DTransposeMatMul",shaderCache:{hint:`${e.cacheKey};${v};${w};${h}`,inputDependencies:F},getRunData:()=>({outputs:[{dims:n,dataType:r[0].dataType}],dispatchGroup:{x:S[0],y:S[1],z:S[2]},programUniforms:K}),getShaderSource:_e}}});var t1,su,Nb=C(()=>{"use strict";ue();mr();ye();he();t1=(r,e,n,t,o,i=!1,s,a,u=!1)=>{let l=u?1:2,f=u?2:3,c=u?3:1,p=i?2:1,b=` + ${r1(u,s,e,ae.type.value,$)} + ${h?Yn(v,w,se,void 0,!u,P):Jn(v,w,se,void 0,!u,P,!1,void 0,a)}`};return{name:"Conv2DTransposeMatMul",shaderCache:{hint:`${e.cacheKey};${v};${w};${h}`,inputDependencies:F},getRunData:()=>({outputs:[{dims:n,dataType:r[0].dataType}],dispatchGroup:{x:S[0],y:S[1],z:S[2]},programUniforms:j}),getShaderSource:_e}}});var n1,uu,Nb=C(()=>{"use strict";ue();mr();ye();he();n1=(r,e,n,t,o,i=!1,s,a,u=!1)=>{let l=u?1:2,f=u?2:3,c=u?3:1,p=i?2:1,b=` fn setOutputAtIndex(flatIndex : u32, value : ${i?`vec4<${s}>`:s}) { result[flatIndex] = ${i?`vec4<${s}>`:s}(value); }`;t&&(b+=` @@ -3174,7 +3174,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; ${r.mainStart()} ${r.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")}; - ${i?S:$}}`},su=(r,e,n)=>{let t=r.length>2,o=e.outputShape,i=B.size(o),s=[Math.ceil(i/64),1,1];Ne("verbose",()=>`[conv2d_backprop_webgpu] dispatch = ${s}`);let a=e.format==="NHWC",u=["rank","rank"],l=[e.strides[0],e.strides[1]],f=[e.kernelShape[a?1:2],e.kernelShape[a?2:3]],c=[e.dilations[0],e.dilations[1]],p=[f[0]+(e.dilations[0]<=1?0:(e.kernelShape[a?1:2]-1)*(e.dilations[0]-1)),f[1]+(e.dilations[1]<=1?0:(e.kernelShape[a?2:3]-1)*(e.dilations[1]-1))],b=[p[0]-1-Math.floor((e.pads[0]+e.pads[2])/2),p[1]-1-Math.floor(e.pads[1]+e.pads[3])/2],h=!1,g=e.group,T=r[1].dims,w=T[0]/g,v=T[1],S=[{type:12,data:i},{type:12,data:l},{type:12,data:f},{type:12,data:c},{type:12,data:p},{type:6,data:b},{type:12,data:w},{type:12,data:v},...W(r[0].dims,r[1].dims)];t&&(S.push(...W(r[2].dims)),u.push("rank")),S.push(...W(o));let $=s[1]===1&&s[2]===1,P=E=>{let N=[{name:"output_size",type:"u32"},{name:"strides",type:"u32",length:l.length},{name:"filter_dims",type:"u32",length:f.length},{name:"dilations",type:"u32",length:f.length},{name:"effective_filter_dims",type:"u32",length:p.length},{name:"pads",type:"i32",length:b.length},{name:"input_channels_per_group",type:"u32"},{name:"output_channels_per_group",type:"u32"}],z=Be(r[0].dataType);return`${t1(E,r,o,t,$,h,z,N,a)}`};return{name:"ConvTranspose2D",shaderCache:{hint:`${e.cacheKey};`,inputDependencies:u},getRunData:()=>({dispatchGroup:{x:s[0],y:s[1],z:s[2]},outputs:[{dims:n?n(o):o,dataType:r[0].dataType}],programUniforms:S}),getShaderSource:P}}});var r1,n1,o1,zb,Fb,i1,a1,s1,u1,Mb,Vb=C(()=>{"use strict";Rb();Nb();Or();Jr();r1=(r,e,n,t,o,i)=>(r-1)*e+n+(t-1)*o+1-i,n1=(r,e,n,t,o)=>{let i=Math.floor(r/2);e==="SAME_UPPER"?(n[t]=i,n[o]=r-i):e==="SAME_LOWER"&&(n[t]=r-i,n[o]=i)},o1=(r,e,n,t,o,i,s,a,u,l)=>{let f=r.length-2,c=l.length===0;if(u.length===0)for(let h=0;h{let n=r.kernelShape.slice();if(r.kernelShape.length===0||r.kernelShape.reduce((c,p)=>c*p,1)===0){n.length=0;for(let c=2;cc+p,0)===0){let c=e[0].dims.length-2;u=new Array(c).fill(1)}let l=r.strides.slice();if(l.reduce((c,p)=>c+p,0)===0){let c=e[0].dims.length-2;l=new Array(c).fill(1)}o1(a,n,u,r.autoPad,r.group,o,l,t,s,i);let f=Object.assign({},r);return Object.assign(f,{kernelShape:n,pads:o,outputPadding:s,outputShape:i,dilations:u,strides:l}),f},Fb=r=>{let e=zi(r),n=r.format,t=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][typeof r.autoPad>"u"?0:r.autoPad],o=r.dilations,i=r.group,s=r.kernelShape,a=r.pads,u=r.strides,l=r.wIsConst(),f=r.outputPadding,c=r.outputShape;return{autoPad:t,format:n,dilations:o,group:i,kernelShape:s,outputPadding:f,outputShape:c,pads:a,strides:u,wIsConst:l,...e,cacheKey:`${r.format};${e.activation};`}},i1=(r,e)=>{if(!r||r.length!==2&&r.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(r[0].dims.length!==4&&r[0].dims.length!==3)throw new Error("currently only support 2-dimensional conv");if(r[0].dims.length!==r[1].dims.length)throw new Error("filter does not have same dimension as input");let n=r[0].dims[e.format==="NHWC"?r[0].dims.length-1:1],t=r[1].dims[0];if(n!==t)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let o=r[1].dims[1]*e.group;if(r.length===3&&(r[2].dims.length!==1||r[2].dims[0]!==o))throw new Error("invalid bias");let i=r[0].dims.length-2;if(e.dilations.reduce((f,c)=>f+c,0)>0&&e.dilations.length!==i)throw new Error(`dilations should be ${i}D`);if(e.strides.reduce((f,c)=>f+c,0)>0&&e.strides.length!==i)throw new Error(`strides should be ${i}D`);if(e.pads.reduce((f,c)=>f+c,0)>0&&e.pads.length!==i*2)throw new Error(`pads should be ${i*2}D`);if(e.outputPadding.length!==i&&e.outputPadding.length!==0)throw new Error(`output_padding should be ${i}D`);if(e.kernelShape.reduce((f,c)=>f+c,0)>0&&e.kernelShape.length!==0&&e.kernelShape.length!==r[1].dims.length-2)throw new Error("invalid kernel shape");if(e.outputShape.length!==0&&e.outputShape.length!==r[0].dims.length-2)throw new Error("invalid output shape")},a1=[2,3,1,0],s1=(r,e,n)=>{let t=zb(n,e),o=n.format==="NHWC",i=t.outputShape,s=i[o?3:1],a=e[0].dims[o?3:1];if(t.group!==1||s===1&&a===1){r.compute(su(e,t));return}let u=i[o?1:2],l=i[o?2:3],f=e[1].dims[2],c=e[1].dims[3],p=o?u*l:s,b=o?s:u*l,h=f*c*a,g=!0,T=r.kernelCustomData.wT??r.compute(Tt(e[1],a1),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!r.kernelCustomData.wT&&(r.kernelCustomData.wT=T);let w=[e[0],T],v=e.length===3;v&&(!o&&e[2].dims.length===1?w.push(e[2].reshape([e[2].dims[0],1,1])):w.push(e[2])),r.compute(Lb(w,t,i,p,b,h,v,g),{inputs:w})},u1=(r,e)=>{let n=e.format==="NHWC",t=[r.inputs[0].reshape(n?[r.inputs[0].dims[0],1,r.inputs[0].dims[1],r.inputs[0].dims[2]]:[r.inputs[0].dims[0],r.inputs[0].dims[1],1,r.inputs[0].dims[2]]),r.inputs[1].reshape([r.inputs[1].dims[0],r.inputs[1].dims[1],1,r.inputs[1].dims[2]])];r.inputs.length===3&&t.push(r.inputs[2]);let o=e.kernelShape;(o.length===0||o[0]===0)&&(o=[r.inputs[1].dims[2]]);let i=e.dilations;(i.length===0||i[0]===0)&&(i=[1]);let s=e.strides;(s.length===0||s[0]===0)&&(s=[1]);let a=e.pads;a.length===0&&(a=[0,0]),a=[0,a[0],0,a[1]],s=[1].concat(s),i=[1].concat(i),o=[1].concat(o);let u=zb({...e,pads:a,strides:s,dilations:i,kernelShape:o},t);r.compute(su(t,u,l=>n?[l[0],l[2],l[3]]:[l[0],l[1],l[3]]))},Mb=(r,e)=>{i1(r.inputs,e),r.inputs[0].dims.length===3?u1(r,e):s1(r,r.inputs,e)}});var l1,Gb,Ub,Wb=C(()=>{"use strict";ue();ye();et();he();l1=(r,e,n,t)=>{let o=B.size(e),i=e.length,s=D("input",r,i),a=G("output",r,i),u=n.dataType===6?n.getInt32Array()[0]:Number(n.getBigInt64Array()[0]),l=B.normalizeAxis(u,i),f=c=>{let p=` i32(${s.indicesGet("inputIndices","uniforms.axis")}) `,b=Z("uniforms.input_shape","uniforms.axis",i),h=t.reverse?p+(t.exclusive?" + 1":""):"0",g=t.reverse?b:p+(t.exclusive?"":" + 1");return` + ${i?S:$}}`},uu=(r,e,n)=>{let t=r.length>2,o=e.outputShape,i=B.size(o),s=[Math.ceil(i/64),1,1];Ne("verbose",()=>`[conv2d_backprop_webgpu] dispatch = ${s}`);let a=e.format==="NHWC",u=["rank","rank"],l=[e.strides[0],e.strides[1]],f=[e.kernelShape[a?1:2],e.kernelShape[a?2:3]],c=[e.dilations[0],e.dilations[1]],p=[f[0]+(e.dilations[0]<=1?0:(e.kernelShape[a?1:2]-1)*(e.dilations[0]-1)),f[1]+(e.dilations[1]<=1?0:(e.kernelShape[a?2:3]-1)*(e.dilations[1]-1))],b=[p[0]-1-Math.floor((e.pads[0]+e.pads[2])/2),p[1]-1-Math.floor(e.pads[1]+e.pads[3])/2],h=!1,g=e.group,T=r[1].dims,w=T[0]/g,v=T[1],S=[{type:12,data:i},{type:12,data:l},{type:12,data:f},{type:12,data:c},{type:12,data:p},{type:6,data:b},{type:12,data:w},{type:12,data:v},...W(r[0].dims,r[1].dims)];t&&(S.push(...W(r[2].dims)),u.push("rank")),S.push(...W(o));let $=s[1]===1&&s[2]===1,P=E=>{let N=[{name:"output_size",type:"u32"},{name:"strides",type:"u32",length:l.length},{name:"filter_dims",type:"u32",length:f.length},{name:"dilations",type:"u32",length:f.length},{name:"effective_filter_dims",type:"u32",length:p.length},{name:"pads",type:"i32",length:b.length},{name:"input_channels_per_group",type:"u32"},{name:"output_channels_per_group",type:"u32"}],z=Be(r[0].dataType);return`${n1(E,r,o,t,$,h,z,N,a)}`};return{name:"ConvTranspose2D",shaderCache:{hint:`${e.cacheKey};`,inputDependencies:u},getRunData:()=>({dispatchGroup:{x:s[0],y:s[1],z:s[2]},outputs:[{dims:n?n(o):o,dataType:r[0].dataType}],programUniforms:S}),getShaderSource:P}}});var o1,i1,a1,zb,Fb,s1,u1,l1,c1,Mb,Vb=C(()=>{"use strict";Rb();Nb();Or();Jr();o1=(r,e,n,t,o,i)=>(r-1)*e+n+(t-1)*o+1-i,i1=(r,e,n,t,o)=>{let i=Math.floor(r/2);e==="SAME_UPPER"?(n[t]=i,n[o]=r-i):e==="SAME_LOWER"&&(n[t]=r-i,n[o]=i)},a1=(r,e,n,t,o,i,s,a,u,l)=>{let f=r.length-2,c=l.length===0;if(u.length===0)for(let h=0;h{let n=r.kernelShape.slice();if(r.kernelShape.length===0||r.kernelShape.reduce((c,p)=>c*p,1)===0){n.length=0;for(let c=2;cc+p,0)===0){let c=e[0].dims.length-2;u=new Array(c).fill(1)}let l=r.strides.slice();if(l.reduce((c,p)=>c+p,0)===0){let c=e[0].dims.length-2;l=new Array(c).fill(1)}a1(a,n,u,r.autoPad,r.group,o,l,t,s,i);let f=Object.assign({},r);return Object.assign(f,{kernelShape:n,pads:o,outputPadding:s,outputShape:i,dilations:u,strides:l}),f},Fb=r=>{let e=zi(r),n=r.format,t=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][typeof r.autoPad>"u"?0:r.autoPad],o=r.dilations,i=r.group,s=r.kernelShape,a=r.pads,u=r.strides,l=r.wIsConst(),f=r.outputPadding,c=r.outputShape;return{autoPad:t,format:n,dilations:o,group:i,kernelShape:s,outputPadding:f,outputShape:c,pads:a,strides:u,wIsConst:l,...e,cacheKey:`${r.format};${e.activation};`}},s1=(r,e)=>{if(!r||r.length!==2&&r.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(r[0].dims.length!==4&&r[0].dims.length!==3)throw new Error("currently only support 2-dimensional conv");if(r[0].dims.length!==r[1].dims.length)throw new Error("filter does not have same dimension as input");let n=r[0].dims[e.format==="NHWC"?r[0].dims.length-1:1],t=r[1].dims[0];if(n!==t)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let o=r[1].dims[1]*e.group;if(r.length===3&&(r[2].dims.length!==1||r[2].dims[0]!==o))throw new Error("invalid bias");let i=r[0].dims.length-2;if(e.dilations.reduce((f,c)=>f+c,0)>0&&e.dilations.length!==i)throw new Error(`dilations should be ${i}D`);if(e.strides.reduce((f,c)=>f+c,0)>0&&e.strides.length!==i)throw new Error(`strides should be ${i}D`);if(e.pads.reduce((f,c)=>f+c,0)>0&&e.pads.length!==i*2)throw new Error(`pads should be ${i*2}D`);if(e.outputPadding.length!==i&&e.outputPadding.length!==0)throw new Error(`output_padding should be ${i}D`);if(e.kernelShape.reduce((f,c)=>f+c,0)>0&&e.kernelShape.length!==0&&e.kernelShape.length!==r[1].dims.length-2)throw new Error("invalid kernel shape");if(e.outputShape.length!==0&&e.outputShape.length!==r[0].dims.length-2)throw new Error("invalid output shape")},u1=[2,3,1,0],l1=(r,e,n)=>{let t=zb(n,e),o=n.format==="NHWC",i=t.outputShape,s=i[o?3:1],a=e[0].dims[o?3:1];if(t.group!==1||s===1&&a===1){r.compute(uu(e,t));return}let u=i[o?1:2],l=i[o?2:3],f=e[1].dims[2],c=e[1].dims[3],p=o?u*l:s,b=o?s:u*l,h=f*c*a,g=!0,T=r.kernelCustomData.wT??r.compute(Tt(e[1],u1),{inputs:[1],outputs:[n.wIsConst?-2:-1]})[0];n.wIsConst&&!r.kernelCustomData.wT&&(r.kernelCustomData.wT=T);let w=[e[0],T],v=e.length===3;v&&(!o&&e[2].dims.length===1?w.push(e[2].reshape([e[2].dims[0],1,1])):w.push(e[2])),r.compute(Lb(w,t,i,p,b,h,v,g),{inputs:w})},c1=(r,e)=>{let n=e.format==="NHWC",t=[r.inputs[0].reshape(n?[r.inputs[0].dims[0],1,r.inputs[0].dims[1],r.inputs[0].dims[2]]:[r.inputs[0].dims[0],r.inputs[0].dims[1],1,r.inputs[0].dims[2]]),r.inputs[1].reshape([r.inputs[1].dims[0],r.inputs[1].dims[1],1,r.inputs[1].dims[2]])];r.inputs.length===3&&t.push(r.inputs[2]);let o=e.kernelShape;(o.length===0||o[0]===0)&&(o=[r.inputs[1].dims[2]]);let i=e.dilations;(i.length===0||i[0]===0)&&(i=[1]);let s=e.strides;(s.length===0||s[0]===0)&&(s=[1]);let a=e.pads;a.length===0&&(a=[0,0]),a=[0,a[0],0,a[1]],s=[1].concat(s),i=[1].concat(i),o=[1].concat(o);let u=zb({...e,pads:a,strides:s,dilations:i,kernelShape:o},t);r.compute(uu(t,u,l=>n?[l[0],l[2],l[3]]:[l[0],l[1],l[3]]))},Mb=(r,e)=>{s1(r.inputs,e),r.inputs[0].dims.length===3?c1(r,e):l1(r,r.inputs,e)}});var f1,Gb,Ub,Wb=C(()=>{"use strict";ue();ye();et();he();f1=(r,e,n,t)=>{let o=B.size(e),i=e.length,s=D("input",r,i),a=G("output",r,i),u=n.dataType===6?n.getInt32Array()[0]:Number(n.getBigInt64Array()[0]),l=B.normalizeAxis(u,i),f=c=>{let p=` i32(${s.indicesGet("inputIndices","uniforms.axis")}) `,b=Z("uniforms.input_shape","uniforms.axis",i),h=t.reverse?p+(t.exclusive?" + 1":""):"0",g=t.reverse?b:p+(t.exclusive?"":" + 1");return` ${c.registerUniform("outputSize","u32").registerUniform("axis","u32").declareVariables(s,a)} ${c.mainStart()} ${c.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} @@ -3187,12 +3187,12 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; sum = sum + ${s.getByIndices("inputIndices")}; } ${a.setByOffset("global_idx","sum")}; - }`};return{name:"CumSum",shaderCache:{hint:t.cacheKey,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:e,dataType:r}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:[{type:12,data:o},{type:12,data:l},...W(e,e)]}),getShaderSource:f}},Gb=(r,e)=>{let n=r.inputs[0].dims,t=r.inputs[0].dataType,o=r.inputs[1];r.compute(l1(t,n,o,e),{inputs:[0]})},Ub=r=>{let e=r.exclusive===1,n=r.reverse===1;return de({exclusive:e,reverse:n})}});var c1,f1,d1,Hb,qb,Kb=C(()=>{"use strict";ue();ye();et();he();c1=r=>{if(!r||r.length!==1)throw new Error("DepthToSpace requires 1 input.");if(r[0].dims.length!==4)throw new Error("DepthToSpace requires 4D input.")},f1=(r,e,n,t)=>{let o=[];o.push(`fn perm(i: ${t.type.indices}) -> ${n.type.indices} { + }`};return{name:"CumSum",shaderCache:{hint:t.cacheKey,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:e,dataType:r}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:[{type:12,data:o},{type:12,data:l},...W(e,e)]}),getShaderSource:f}},Gb=(r,e)=>{let n=r.inputs[0].dims,t=r.inputs[0].dataType,o=r.inputs[1];r.compute(f1(t,n,o,e),{inputs:[0]})},Ub=r=>{let e=r.exclusive===1,n=r.reverse===1;return de({exclusive:e,reverse:n})}});var d1,p1,m1,Hb,qb,jb=C(()=>{"use strict";ue();ye();et();he();d1=r=>{if(!r||r.length!==1)throw new Error("DepthToSpace requires 1 input.");if(r[0].dims.length!==4)throw new Error("DepthToSpace requires 4D input.")},p1=(r,e,n,t)=>{let o=[];o.push(`fn perm(i: ${t.type.indices}) -> ${n.type.indices} { var a: ${n.type.indices};`);for(let i=0;i{let n,t,o,i,s,a,u=e.format==="NHWC",l=e.blocksize,f=e.mode==="DCR";u?([n,t,o,i]=r.dims,s=f?[n,t,o,l,l,i/l**2]:[n,t,o,i/l**2,l,l],a=f?[0,1,3,2,4,5]:[0,1,4,2,5,3]):([n,t,o,i]=[r.dims[0],r.dims[2],r.dims[3],r.dims[1]],s=f?[n,l,l,i/l**2,t,o]:[n,i/l**2,l,l,t,o],a=f?[0,3,4,1,5,2]:[0,1,4,2,5,3]);let c=r.reshape(s),p=c.dims.length,b=r.dataType,h=D("a",b,p),g=G("output",b,p),T=w=>` +`)},m1=(r,e)=>{let n,t,o,i,s,a,u=e.format==="NHWC",l=e.blocksize,f=e.mode==="DCR";u?([n,t,o,i]=r.dims,s=f?[n,t,o,l,l,i/l**2]:[n,t,o,i/l**2,l,l],a=f?[0,1,3,2,4,5]:[0,1,4,2,5,3]):([n,t,o,i]=[r.dims[0],r.dims[2],r.dims[3],r.dims[1]],s=f?[n,l,l,i/l**2,t,o]:[n,i/l**2,l,l,t,o],a=f?[0,3,4,1,5,2]:[0,1,4,2,5,3]);let c=r.reshape(s),p=c.dims.length,b=r.dataType,h=D("a",b,p),g=G("output",b,p),T=w=>` ${w.registerUniform("output_size","u32").declareVariables(h,g)} - ${f1(a,p,h,g)} + ${p1(a,p,h,g)} ${w.mainStart()} ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} @@ -3201,7 +3201,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; let aIndices = perm(indices); ${g.setByOffset("global_idx",h.getByIndices("aIndices"))} - }`;return{name:"DepthToSpace",shaderCache:{hint:`${r.dims};${e.blocksize};${e.mode}`,inputDependencies:["rank"]},getRunData:w=>{let v=u?[n,t*l,o*l,i/l**2]:[n,i/l**2,t*l,o*l],S=B.size(v),$=c.dims,P=B.sortBasedOnPerm($,a);return{outputs:[{dims:v,dataType:w[0].dataType}],dispatchGroup:{x:Math.ceil(S/64)},programUniforms:[{type:12,data:S},...W($,P)]}},getShaderSource:T}},Hb=(r,e)=>{c1(r.inputs),r.compute(d1(r.inputs[0],e))},qb=r=>de({blocksize:r.blocksize,mode:r.mode,format:r.format})});var uu,Hi,jb,p1,m1,lu,cu,Xb,h1,Zb,Yb,Jb=C(()=>{"use strict";ue();ye();et();he();uu="[a-zA-Z]|\\.\\.\\.",Hi="("+uu+")+",jb="^"+Hi+"$",p1="("+Hi+",)*"+Hi,m1="^"+p1+"$",lu=class{constructor(e=-1){this.symbolToIndices=new Map,this.inputIndex=e}addSymbol(e,n){let t=this.symbolToIndices.get(e);t===void 0?t=[n]:t.push(n),this.symbolToIndices.set(e,t)}},cu=class{constructor(e,n){this.equation=n;this.hasEllipsis=!1,this.symbolToInfo=new Map,this.lhs=new Array,this.outputDims=[];let[t,o]=n.includes("->")?n.split("->",2):[n,""];if(!t.match(RegExp(m1)))throw new Error("Invalid LHS term");if(t.split(",").forEach((a,u)=>{let l=e[u].dims.slice();if(!a.match(RegExp(jb)))throw new Error("Invalid LHS term");let f=this.processTerm(a,!0,l,u);this.lhs.push(f)}),o==="")o+=[...this.symbolToInfo.entries()].filter(([a,u])=>u.count===1||a==="...").map(([a])=>a).join("");else if(!o.match(RegExp(Hi)))throw new Error("Invalid RHS");o.match(RegExp(uu,"g"))?.forEach(a=>{if(a==="...")this.outputDims=this.outputDims.concat(this.ellipsisDims);else{let u=this.symbolToInfo.get(a);if(u===void 0)throw new Error("Invalid RHS symbol");this.outputDims.push(u.dimValue)}}),this.rhs=this.processTerm(o,!1,this.outputDims)}addSymbol(e,n,t){let o=this.symbolToInfo.get(e);if(o!==void 0){if(o.dimValue!==n&&o.count!==1)throw new Error("Dimension mismatch");o.count++,o.inputIndices.push(t)}else o={count:1,dimValue:n,inputIndices:[t]};this.symbolToInfo.set(e,o)}processTerm(e,n,t,o=-1){let i=t.length,s=!1,a=[],u=0;if(!e.match(RegExp(jb))&&!n&&e!=="")throw new Error("Invalid LHS term");let l=e.match(RegExp(uu,"g")),f=new lu(o);return l?.forEach((c,p)=>{if(c==="..."){if(s)throw new Error("Only one ellipsis is allowed per input term");s=!0;let b=i-l.length+1;if(b<0)throw new Error("Ellipsis out of bounds");if(a=t.slice(u,u+b),this.hasEllipsis){if(this.ellipsisDims.length!==a.length||this.ellipsisDims.toString()!==a.toString())throw new Error("Ellipsis dimensions mismatch")}else if(n)this.hasEllipsis=!0,this.ellipsisDims=a;else throw new Error("Ellipsis must be specified in the LHS");for(let h=0;hr+"_max",h1=(r,e,n,t)=>{let i=r.map(f=>f.length).map((f,c)=>D(`input${c}`,e,f)),s=B.size(t),a=G("output",e,t.length),u=[...n.symbolToInfo.keys()].filter(f=>!n.rhs.symbolToIndices.has(f)),l=f=>{let c=[],p="var prod = 1.0;",b="var sum = 0.0;",h="sum += prod;",g=[],T=[],w=[],v=[],S=n.symbolToInfo.size===n.rhs.symbolToIndices.size;n.symbolToInfo.forEach((P,E)=>{if(n.rhs.symbolToIndices.has(E)){let N=n.rhs.symbolToIndices.get(E)?.[0];N!==void 0&&n.lhs.forEach((z,q)=>{if(P.inputIndices.includes(q)){let K=z.symbolToIndices.get(E);if(K===void 0)throw new Error("Invalid symbol error");K.forEach(F=>{c.push(`${i[q].indicesSet(`input${q}Indices`,F,a.indicesGet("outputIndices",N))}`)})}})}else n.lhs.forEach((N,z)=>{if(P.inputIndices.includes(z)){let q=N.symbolToIndices.get(E);if(q===void 0)throw new Error("Invalid symbol error");q.forEach(K=>{g.push(`${i[z].indicesSet(`input${z}Indices`,K,`${E}`)}`)}),v.push(`prod *= ${i[z].getByIndices(`input${z}Indices`)};`)}}),T.push(`for(var ${E}: u32 = 0; ${E} < uniforms.${Xb(E)}; ${E}++) {`),w.push("}")});let $=S?[...c,`let sum = ${i.map((P,E)=>P.getByIndices(`input${E}Indices`)).join(" * ")};`]:[...c,b,...T,...g,p,...v,h,...w];return` + }`;return{name:"DepthToSpace",shaderCache:{hint:`${r.dims};${e.blocksize};${e.mode}`,inputDependencies:["rank"]},getRunData:w=>{let v=u?[n,t*l,o*l,i/l**2]:[n,i/l**2,t*l,o*l],S=B.size(v),$=c.dims,P=B.sortBasedOnPerm($,a);return{outputs:[{dims:v,dataType:w[0].dataType}],dispatchGroup:{x:Math.ceil(S/64)},programUniforms:[{type:12,data:S},...W($,P)]}},getShaderSource:T}},Hb=(r,e)=>{d1(r.inputs),r.compute(m1(r.inputs[0],e))},qb=r=>de({blocksize:r.blocksize,mode:r.mode,format:r.format})});var lu,Hi,Kb,h1,g1,cu,fu,Xb,b1,Zb,Yb,Jb=C(()=>{"use strict";ue();ye();et();he();lu="[a-zA-Z]|\\.\\.\\.",Hi="("+lu+")+",Kb="^"+Hi+"$",h1="("+Hi+",)*"+Hi,g1="^"+h1+"$",cu=class{constructor(e=-1){this.symbolToIndices=new Map,this.inputIndex=e}addSymbol(e,n){let t=this.symbolToIndices.get(e);t===void 0?t=[n]:t.push(n),this.symbolToIndices.set(e,t)}},fu=class{constructor(e,n){this.equation=n;this.hasEllipsis=!1,this.symbolToInfo=new Map,this.lhs=new Array,this.outputDims=[];let[t,o]=n.includes("->")?n.split("->",2):[n,""];if(!t.match(RegExp(g1)))throw new Error("Invalid LHS term");if(t.split(",").forEach((a,u)=>{let l=e[u].dims.slice();if(!a.match(RegExp(Kb)))throw new Error("Invalid LHS term");let f=this.processTerm(a,!0,l,u);this.lhs.push(f)}),o==="")o+=[...this.symbolToInfo.entries()].filter(([a,u])=>u.count===1||a==="...").map(([a])=>a).join("");else if(!o.match(RegExp(Hi)))throw new Error("Invalid RHS");o.match(RegExp(lu,"g"))?.forEach(a=>{if(a==="...")this.outputDims=this.outputDims.concat(this.ellipsisDims);else{let u=this.symbolToInfo.get(a);if(u===void 0)throw new Error("Invalid RHS symbol");this.outputDims.push(u.dimValue)}}),this.rhs=this.processTerm(o,!1,this.outputDims)}addSymbol(e,n,t){let o=this.symbolToInfo.get(e);if(o!==void 0){if(o.dimValue!==n&&o.count!==1)throw new Error("Dimension mismatch");o.count++,o.inputIndices.push(t)}else o={count:1,dimValue:n,inputIndices:[t]};this.symbolToInfo.set(e,o)}processTerm(e,n,t,o=-1){let i=t.length,s=!1,a=[],u=0;if(!e.match(RegExp(Kb))&&!n&&e!=="")throw new Error("Invalid LHS term");let l=e.match(RegExp(lu,"g")),f=new cu(o);return l?.forEach((c,p)=>{if(c==="..."){if(s)throw new Error("Only one ellipsis is allowed per input term");s=!0;let b=i-l.length+1;if(b<0)throw new Error("Ellipsis out of bounds");if(a=t.slice(u,u+b),this.hasEllipsis){if(this.ellipsisDims.length!==a.length||this.ellipsisDims.toString()!==a.toString())throw new Error("Ellipsis dimensions mismatch")}else if(n)this.hasEllipsis=!0,this.ellipsisDims=a;else throw new Error("Ellipsis must be specified in the LHS");for(let h=0;hr+"_max",b1=(r,e,n,t)=>{let i=r.map(f=>f.length).map((f,c)=>D(`input${c}`,e,f)),s=B.size(t),a=G("output",e,t.length),u=[...n.symbolToInfo.keys()].filter(f=>!n.rhs.symbolToIndices.has(f)),l=f=>{let c=[],p="var prod = 1.0;",b="var sum = 0.0;",h="sum += prod;",g=[],T=[],w=[],v=[],S=n.symbolToInfo.size===n.rhs.symbolToIndices.size;n.symbolToInfo.forEach((P,E)=>{if(n.rhs.symbolToIndices.has(E)){let N=n.rhs.symbolToIndices.get(E)?.[0];N!==void 0&&n.lhs.forEach((z,q)=>{if(P.inputIndices.includes(q)){let j=z.symbolToIndices.get(E);if(j===void 0)throw new Error("Invalid symbol error");j.forEach(F=>{c.push(`${i[q].indicesSet(`input${q}Indices`,F,a.indicesGet("outputIndices",N))}`)})}})}else n.lhs.forEach((N,z)=>{if(P.inputIndices.includes(z)){let q=N.symbolToIndices.get(E);if(q===void 0)throw new Error("Invalid symbol error");q.forEach(j=>{g.push(`${i[z].indicesSet(`input${z}Indices`,j,`${E}`)}`)}),v.push(`prod *= ${i[z].getByIndices(`input${z}Indices`)};`)}}),T.push(`for(var ${E}: u32 = 0; ${E} < uniforms.${Xb(E)}; ${E}++) {`),w.push("}")});let $=S?[...c,`let sum = ${i.map((P,E)=>P.getByIndices(`input${E}Indices`)).join(" * ")};`]:[...c,b,...T,...g,p,...v,h,...w];return` ${f.registerUniforms(u.map(P=>({name:`${Xb(P)}`,type:"u32"}))).registerUniform("outputSize","u32").declareVariables(...i,a)} ${f.mainStart()} @@ -3212,7 +3212,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; ${$.join(` `)}; ${a.setByOffset("global_idx","sum")}; - }`};return{name:"Einsum",shaderCache:{hint:n.equation,inputDependencies:r.map(()=>"rank")},getRunData:()=>{let f=u.filter(p=>n.symbolToInfo.has(p)).map(p=>({type:12,data:n.symbolToInfo.get(p)?.dimValue||0}));f.push({type:12,data:s});let c=r.map((p,b)=>[...W(p)]).reduce((p,b)=>p.concat(b),f);return c.push(...W(t)),{outputs:[{dims:t,dataType:e}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:c}},getShaderSource:l}},Zb=(r,e)=>{let n=new cu(r.inputs,e.equation),t=n.outputDims,o=r.inputs.map((i,s)=>i.dims);r.compute(h1(o,r.inputs[0].dataType,n,t))},Yb=r=>{let e=r.equation.replace(/\s+/g,"");return de({equation:e})}});var g1,Qb,b1,y1,ey,ty=C(()=>{"use strict";ue();ye();he();g1=r=>{if(!r||r.length!==2)throw new Error("Expand requires 2 input.");let e=r[0].dims,n=Array.from(r[1].getBigInt64Array(),Number),t=n.length{let n=r.length-e.length,t=[];for(let o=0;or.length>e.length?Qb(r,e):Qb(e,r),y1=r=>{let e=r[0].dims,n=Array.from(r[1].getBigInt64Array(),Number),t=b1(e,n),o=r[0].dataType,i=o===9?4:1,s=Math.ceil(B.size(t)/i),a=l=>{let f=D("input",o,e.length,i),c=G("output",o,t.length,i),p;if(o===9){let b=(h,g,T="")=>` + }`};return{name:"Einsum",shaderCache:{hint:n.equation,inputDependencies:r.map(()=>"rank")},getRunData:()=>{let f=u.filter(p=>n.symbolToInfo.has(p)).map(p=>({type:12,data:n.symbolToInfo.get(p)?.dimValue||0}));f.push({type:12,data:s});let c=r.map((p,b)=>[...W(p)]).reduce((p,b)=>p.concat(b),f);return c.push(...W(t)),{outputs:[{dims:t,dataType:e}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:c}},getShaderSource:l}},Zb=(r,e)=>{let n=new fu(r.inputs,e.equation),t=n.outputDims,o=r.inputs.map((i,s)=>i.dims);r.compute(b1(o,r.inputs[0].dataType,n,t))},Yb=r=>{let e=r.equation.replace(/\s+/g,"");return de({equation:e})}});var y1,Qb,x1,v1,ey,ty=C(()=>{"use strict";ue();ye();he();y1=r=>{if(!r||r.length!==2)throw new Error("Expand requires 2 input.");let e=r[0].dims,n=Array.from(r[1].getBigInt64Array(),Number),t=n.length{let n=r.length-e.length,t=[];for(let o=0;or.length>e.length?Qb(r,e):Qb(e,r),v1=r=>{let e=r[0].dims,n=Array.from(r[1].getBigInt64Array(),Number),t=x1(e,n),o=r[0].dataType,i=o===9?4:1,s=Math.ceil(B.size(t)/i),a=l=>{let f=D("input",o,e.length,i),c=G("output",o,t.length,i),p;if(o===9){let b=(h,g,T="")=>` let outputIndices${g} = ${c.offsetToIndices(`outputOffset + ${g}u`)}; let offset${g} = ${f.broadcastedIndicesToOffset(`outputIndices${g}`,c)}; let index${g} = offset${g} / 4u; @@ -3234,13 +3234,13 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; ${l.registerUniform("vec_size","u32").declareVariables(f,c)} ${l.mainStart()} ${l.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} - ${p}`},u=[{type:12,data:s},...W(e,t)];return{name:"Expand",shaderCache:{hint:`${t.length}`,inputDependencies:["rank"]},getShaderSource:a,getRunData:()=>({outputs:[{dims:t,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:u})}},ey=r=>{g1(r.inputs),r.compute(y1(r.inputs),{inputs:[0]})}});var x1,ry,ny=C(()=>{"use strict";ue();ye();he();Ni();x1=r=>{let e=r[0].dataType,n=B.size(r[0].dims),t=B.size(r[1].dims),o=t%4===0,i=s=>{let a=D("x",e,[1],4),u=D("bias",e,[1],4),l=G("y",e,[1],4),f=[{name:"output_vec_size",type:"u32"},{name:"bias_size",type:"u32"}],c=b=>` + ${p}`},u=[{type:12,data:s},...W(e,t)];return{name:"Expand",shaderCache:{hint:`${t.length}`,inputDependencies:["rank"]},getShaderSource:a,getRunData:()=>({outputs:[{dims:t,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:u})}},ey=r=>{y1(r.inputs),r.compute(v1(r.inputs),{inputs:[0]})}});var w1,ry,ny=C(()=>{"use strict";ue();ye();he();Ni();w1=r=>{let e=r[0].dataType,n=B.size(r[0].dims),t=B.size(r[1].dims),o=t%4===0,i=s=>{let a=D("x",e,[1],4),u=D("bias",e,[1],4),l=G("y",e,[1],4),f=[{name:"output_vec_size",type:"u32"},{name:"bias_size",type:"u32"}],c=b=>` let bias${b}_offset: u32 = (global_idx * 4 + ${b}) % uniforms.bias_size; let bias${b} = ${u.getByOffset(`bias${b}_offset / 4`)}[bias${b}_offset % 4];`,p=o?` let bias = ${u.getByOffset("global_idx % (uniforms.bias_size / 4)")};`:`${c(0)}${c(1)}${c(2)}${c(3)} let bias = ${a.type.value}(bias0, bias1, bias2, bias3);`;return`${s.registerUniforms(f).declareVariables(a,u,l)} - ${Zs(ct(e))} + ${Ys(ct(e))} ${s.mainStart(Zr)} ${s.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_vec_size")} @@ -3248,8 +3248,8 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; let x = ${a.getByOffset("global_idx")}; ${p} let x_in = x + bias; - ${l.setByOffset("global_idx",Ys("x_in"))} - }`};return{name:"FastGeluWithBias",shaderCache:{hint:`${o}`,inputDependencies:["type","type"]},getShaderSource:i,getRunData:s=>({outputs:[{dims:s[0].dims,dataType:s[0].dataType}],programUniforms:[{type:12,data:Math.ceil(n/4)},{type:12,data:t}],dispatchGroup:{x:Math.ceil(n/Zr/4)}})}},ry=r=>{r.inputs.length<2||B.size(r.inputs[1].dims)===0?nb(r):r.compute(x1(r.inputs))}});var v1,w1,oy,iy,ay=C(()=>{"use strict";ue();ye();et();he();v1=r=>{if(!r||r.length!==2)throw new Error("Gather requires 2 inputs.")},w1=(r,e)=>{let n=r[0].dims,t=r[1].dims,o=n.length,i=B.normalizeAxis(e.axis,o),s=n.slice(0);s.splice(i,1,...t);let a=n[i],u=r[0].dataType===9?4:1,l=Math.ceil(B.size(s)/u),f=[{type:12,data:l},{type:6,data:a},{type:12,data:i},...W(r[0].dims,r[1].dims,s)],c=p=>{let b=D("data",r[0].dataType,r[0].dims.length,u),h=D("inputIndices",r[1].dataType,r[1].dims.length),g=G("output",r[0].dataType,s.length,u),T=v=>{let S=t.length,$=`var indicesIndices${v} = ${h.type.indices}(0);`;for(let P=0;P1?`indicesIndices${v}[${P}]`:`indicesIndices${v}`} = ${s.length>1?`outputIndices${v}[uniforms.axis + ${P}]`:`outputIndices${v}`};`;$+=` + ${l.setByOffset("global_idx",Js("x_in"))} + }`};return{name:"FastGeluWithBias",shaderCache:{hint:`${o}`,inputDependencies:["type","type"]},getShaderSource:i,getRunData:s=>({outputs:[{dims:s[0].dims,dataType:s[0].dataType}],programUniforms:[{type:12,data:Math.ceil(n/4)},{type:12,data:t}],dispatchGroup:{x:Math.ceil(n/Zr/4)}})}},ry=r=>{r.inputs.length<2||B.size(r.inputs[1].dims)===0?nb(r):r.compute(w1(r.inputs))}});var T1,_1,oy,iy,ay=C(()=>{"use strict";ue();ye();et();he();T1=r=>{if(!r||r.length!==2)throw new Error("Gather requires 2 inputs.")},_1=(r,e)=>{let n=r[0].dims,t=r[1].dims,o=n.length,i=B.normalizeAxis(e.axis,o),s=n.slice(0);s.splice(i,1,...t);let a=n[i],u=r[0].dataType===9?4:1,l=Math.ceil(B.size(s)/u),f=[{type:12,data:l},{type:6,data:a},{type:12,data:i},...W(r[0].dims,r[1].dims,s)],c=p=>{let b=D("data",r[0].dataType,r[0].dims.length,u),h=D("inputIndices",r[1].dataType,r[1].dims.length),g=G("output",r[0].dataType,s.length,u),T=v=>{let S=t.length,$=`var indicesIndices${v} = ${h.type.indices}(0);`;for(let P=0;P1?`indicesIndices${v}[${P}]`:`indicesIndices${v}`} = ${s.length>1?`outputIndices${v}[uniforms.axis + ${P}]`:`outputIndices${v}`};`;$+=` var idx${v} = ${h.getByIndices(`indicesIndices${v}`)}; if (idx${v} < 0) { idx${v} = idx${v} + uniforms.axisDimLimit; @@ -3280,8 +3280,8 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; ${p.mainStart()} ${p.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} ${w} - }`};return{name:"Gather",shaderCache:{hint:e.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:s,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:f}),getShaderSource:c}},oy=r=>de({axis:r.axis}),iy=(r,e)=>{let n=r.inputs;v1(n),r.compute(w1(r.inputs,e))}});var T1,_1,sy,uy,ly=C(()=>{"use strict";ue();ye();et();he();T1=r=>{if(!r||r.length!==2)throw new Error("GatherElements requires 2 inputs.");if(r[0].dims.length<1)throw new Error("GatherElements requires that the data input be rank >= 1.");if(r[0].dims.length!==r[1].dims.length)throw new Error(`GatherElements requires that the data input and - indices input tensors be of same rank.`)},_1=(r,e)=>{let n=r[0].dims,t=r[0].dataType,o=n.length,i=r[1].dims,s=r[1].dataType,a=B.normalizeAxis(e.axis,o),u=n[a],l=i.slice(0),f=B.size(l),c=D("input",t,o),p=D("indicesInput",s,i.length),b=G("output",t,l.length),h=[{type:12,data:f},{type:6,data:u},{type:12,data:a}];return h.push(...W(n,i,l)),{name:"GatherElements",shaderCache:{inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:l,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(f/64)},programUniforms:h}),getShaderSource:w=>` + }`};return{name:"Gather",shaderCache:{hint:e.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:s,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:f}),getShaderSource:c}},oy=r=>de({axis:r.axis}),iy=(r,e)=>{let n=r.inputs;T1(n),r.compute(_1(r.inputs,e))}});var I1,S1,sy,uy,ly=C(()=>{"use strict";ue();ye();et();he();I1=r=>{if(!r||r.length!==2)throw new Error("GatherElements requires 2 inputs.");if(r[0].dims.length<1)throw new Error("GatherElements requires that the data input be rank >= 1.");if(r[0].dims.length!==r[1].dims.length)throw new Error(`GatherElements requires that the data input and + indices input tensors be of same rank.`)},S1=(r,e)=>{let n=r[0].dims,t=r[0].dataType,o=n.length,i=r[1].dims,s=r[1].dataType,a=B.normalizeAxis(e.axis,o),u=n[a],l=i.slice(0),f=B.size(l),c=D("input",t,o),p=D("indicesInput",s,i.length),b=G("output",t,l.length),h=[{type:12,data:f},{type:6,data:u},{type:12,data:a}];return h.push(...W(n,i,l)),{name:"GatherElements",shaderCache:{inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:l,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(f/64)},programUniforms:h}),getShaderSource:w=>` ${w.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(c,p,b)} ${w.mainStart()} ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} @@ -3297,7 +3297,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; let value = ${c.getByIndices("inputIndices")}; ${b.setByOffset("global_idx","value")}; - }`}},sy=r=>de({axis:r.axis}),uy=(r,e)=>{let n=r.inputs;T1(n),r.compute(_1(r.inputs,e))}});var I1,S1,cy,fy,dy=C(()=>{"use strict";ue();ye();he();I1=r=>{if(!r)throw new Error("Input is missing");if(r.length<2||r.length>3)throw new Error("Invaid input number.");if(r.length===3&&r[2].dims.length>2)throw new Error("Invalid input shape of C");if(r[0].dataType!==r[1].dataType||r.length===3&&r[0].dataType!==r[2].dataType)throw new Error("Input types are mismatched")},S1=(r,e)=>{let n=r[0].dims.slice(),t=r[1].dims.slice(),[o,i,s]=Oi.getShapeOfGemmResult(n,e.transA,t,e.transB,r.length===3?r[2].dims:void 0),a=[o,i];if(!a)throw new Error("Can't use gemm on the given tensors");let u=B.size(a),l=[{type:12,data:u},{type:12,data:o},{type:12,data:i},{type:12,data:s},{type:1,data:e.alpha},{type:1,data:e.beta}],f=["type","type"];r.length===3&&(l.push(...W(r[2].dims)),f.push("rank")),l.push(...W(a));let c=p=>{let b="";e.transA&&e.transB?b="value += a[k * uniforms.M + m] * b[n * uniforms.K + k];":e.transA&&!e.transB?b="value += a[k * uniforms.M + m] * b[k * uniforms.N + n];":!e.transA&&e.transB?b="value += a[m * uniforms.K + k] * b[n * uniforms.K + k];":!e.transA&&!e.transB&&(b="value += a[m * uniforms.K + k] * b[k * uniforms.N + n];");let h=e.alpha===1?"":"value *= uniforms.alpha;",g=D("a",r[0].dataType,r[0].dims),T=D("b",r[1].dataType,r[1].dims),w=g.type.value,v=null,S=[g,T];r.length===3&&(v=D("c",r[2].dataType,r[2].dims.length),S.push(v));let $=G("output",r[0].dataType,a.length);S.push($);let P=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}];return` + }`}},sy=r=>de({axis:r.axis}),uy=(r,e)=>{let n=r.inputs;I1(n),r.compute(S1(r.inputs,e))}});var $1,A1,cy,fy,dy=C(()=>{"use strict";ue();ye();he();$1=r=>{if(!r)throw new Error("Input is missing");if(r.length<2||r.length>3)throw new Error("Invaid input number.");if(r.length===3&&r[2].dims.length>2)throw new Error("Invalid input shape of C");if(r[0].dataType!==r[1].dataType||r.length===3&&r[0].dataType!==r[2].dataType)throw new Error("Input types are mismatched")},A1=(r,e)=>{let n=r[0].dims.slice(),t=r[1].dims.slice(),[o,i,s]=Oi.getShapeOfGemmResult(n,e.transA,t,e.transB,r.length===3?r[2].dims:void 0),a=[o,i];if(!a)throw new Error("Can't use gemm on the given tensors");let u=B.size(a),l=[{type:12,data:u},{type:12,data:o},{type:12,data:i},{type:12,data:s},{type:1,data:e.alpha},{type:1,data:e.beta}],f=["type","type"];r.length===3&&(l.push(...W(r[2].dims)),f.push("rank")),l.push(...W(a));let c=p=>{let b="";e.transA&&e.transB?b="value += a[k * uniforms.M + m] * b[n * uniforms.K + k];":e.transA&&!e.transB?b="value += a[k * uniforms.M + m] * b[k * uniforms.N + n];":!e.transA&&e.transB?b="value += a[m * uniforms.K + k] * b[n * uniforms.K + k];":!e.transA&&!e.transB&&(b="value += a[m * uniforms.K + k] * b[k * uniforms.N + n];");let h=e.alpha===1?"":"value *= uniforms.alpha;",g=D("a",r[0].dataType,r[0].dims),T=D("b",r[1].dataType,r[1].dims),w=g.type.value,v=null,S=[g,T];r.length===3&&(v=D("c",r[2].dataType,r[2].dims.length),S.push(v));let $=G("output",r[0].dataType,a.length);S.push($);let P=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}];return` ${p.registerUniforms(P).declareVariables(...S)} ${p.mainStart()} @@ -3314,14 +3314,14 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; ${h} ${(()=>v!=null?`let cOffset = ${v.broadcastedIndicesToOffset("vec2(m, n)",$)}; value += ${w}(uniforms.beta) * ${v.getByOffset("cOffset")};`:"")()} output[global_idx] = value; - }`};return{name:"Gemm",shaderCache:{hint:`${e.cacheKey}`,inputDependencies:f},getRunData:()=>({outputs:[{dims:a,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:l}),getShaderSource:c}},cy=r=>{let e=r.transA,n=r.transB,t=r.alpha,o=r.beta;return{transA:e,transB:n,alpha:t,beta:o,cacheKey:`${r.transA};${r.transB};${r.alpha===1}`}},fy=(r,e)=>{I1(r.inputs),r.compute(S1(r.inputs,e))}});var _t,P1,my,py,O1,eo,hy,fu=C(()=>{"use strict";ue();ye();et();Pi();Li();he();Jr();_t=(r,e)=>r.length>e&&r[e].dims.length>0&&B.size(r[e].dims)>0?r[e]:void 0,P1=(r,e)=>{let n=r[0],t=_t(r,1),o=_t(r,2),i=_t(r,3),s=_t(r,4),a=_t(r,5),u=_t(r,6),l=_t(r,7);if(n.dims.length!==3&&n.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let f=!1,c=n.dims[0],p=n.dims[1],b=n.dims.length===3?f?n.dims[2]/3:n.dims[2]:e.numHeads*n.dims[4],h=p,g=0,T=0,w=Math.floor(b/e.numHeads);if(u&&l){if(u.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(u.dims[0]!==c||u.dims[1]!==e.numHeads||u.dims[3]!==w)throw new Error('Input "past_key" shape (batch_size, num_heads, past_sequence_length, head_size)');if(l.dims[0]!==c||l.dims[1]!==e.numHeads||l.dims[3]!==w)throw new Error('Input "past_value" shape (batch_size, num_heads, past_sequence_length, head_size)');if(u.dims[2]!==l.dims[2])throw new Error('Input "past_key" and "past_value" shall have same dim 2 (past_sequence_length)');if(l.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');g=u.dims[2],T=u.dims[2]}else if(u||l)throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let v;if(t){if(n.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(t.dims.length<3||t.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(n.dims[0]!==t.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(t.dims.length===3){if(t.dims[2]!==n.dims[2])throw new Error('Input "query" and "key" shall have same dim 2 (hidden_size)');v=2,h=t.dims[1]}else if(t.dims.length===5){if(t.dims[2]!==e.numHeads||t.dims[3]!==2||t.dims[4]!==w)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(o)throw new Error('Expect "value" be none when "key" has packed kv format.');v=5,h=t.dims[1]}else{if(t.dims[1]!==e.numHeads||t.dims[3]!==w)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');v=0,h=t.dims[2]}}else{if(n.dims.length!==3&&n.dims.length!==5)throw new Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(n.dims.length===5&&(n.dims[2]!==e.numHeads||n.dims[3]!==3))throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');v=3}if(i){if(i.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimension');if(o&&n.dims.length===5&&n.dims[3]===2)throw new Error("bias is not allowed for packed kv.")}let S=0;if(s){S=8;let z=s.dims;throw z.length===1?z[0]===c?S=1:z[0]===3*c+2&&(S=3):z.length===2&&z[0]===c&&z[1]===h&&(S=5),S===8?new Error('Input "key_padding_mask" shape shall be (batch_size) or (batch_size, kv_sequence_length)'):new Error("Mask not supported")}let $=!1,P=b;if(o){if(o.dims.length!==3&&o.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(n.dims[0]!==o.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(o.dims.length===3){if(h!==o.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');P=o.dims[2]}else{if(h!==o.dims[2])throw new Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');P=o.dims[1]*o.dims[3],$=!0}}let E=g+h,N=!1;if(s)throw new Error("Key padding mask is not supported");if(a){if(a.dims.length!==4)throw new Error('Input "relative_position_bias" is expected to have 4 dimensions');if(a.dims[0]!==c&&a.dims[0]!==1||a.dims[1]!==e.numHeads||a.dims[2]!==p||a.dims[3]!==E)throw new Error('Input "relative_position_bias" shape (batch_size, 1, sequence_length, kv_sequence_length)')}return{batchSize:c,sequenceLength:p,pastSequenceLength:g,kvSequenceLength:h,totalSequenceLength:E,maxSequenceLength:T,inputHiddenSize:0,hiddenSize:b,vHiddenSize:P,headSize:w,vHeadSize:Math.floor(P/e.numHeads),numHeads:e.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:e.maskFilterValue,maskType:S,scale:e.scale,broadcastResPosBias:N,passPastInKv:$,qkvFormat:v}},my=r=>de({...r}),py=de({perm:[0,2,1,3]}),O1=(r,e,n,t,o,i,s)=>{let a=[t,o,i],u=B.size(a),l=[{type:12,data:u},{type:12,data:s},{type:12,data:i}],f=c=>{let p=G("qkv_with_bias",e.dataType,a),b=D("qkv",e.dataType,a),h=D("bias",n.dataType,a),g=[{name:"output_size",type:"u32"},{name:"bias_offset",type:"u32"},{name:"hidden_size",type:"u32"}];return` + }`};return{name:"Gemm",shaderCache:{hint:`${e.cacheKey}`,inputDependencies:f},getRunData:()=>({outputs:[{dims:a,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:l}),getShaderSource:c}},cy=r=>{let e=r.transA,n=r.transB,t=r.alpha,o=r.beta;return{transA:e,transB:n,alpha:t,beta:o,cacheKey:`${r.transA};${r.transB};${r.alpha===1}`}},fy=(r,e)=>{$1(r.inputs),r.compute(A1(r.inputs,e))}});var _t,E1,my,py,C1,eo,hy,du=C(()=>{"use strict";ue();ye();et();Pi();Li();he();Jr();_t=(r,e)=>r.length>e&&r[e].dims.length>0&&B.size(r[e].dims)>0?r[e]:void 0,E1=(r,e)=>{let n=r[0],t=_t(r,1),o=_t(r,2),i=_t(r,3),s=_t(r,4),a=_t(r,5),u=_t(r,6),l=_t(r,7);if(n.dims.length!==3&&n.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let f=!1,c=n.dims[0],p=n.dims[1],b=n.dims.length===3?f?n.dims[2]/3:n.dims[2]:e.numHeads*n.dims[4],h=p,g=0,T=0,w=Math.floor(b/e.numHeads);if(u&&l){if(u.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(u.dims[0]!==c||u.dims[1]!==e.numHeads||u.dims[3]!==w)throw new Error('Input "past_key" shape (batch_size, num_heads, past_sequence_length, head_size)');if(l.dims[0]!==c||l.dims[1]!==e.numHeads||l.dims[3]!==w)throw new Error('Input "past_value" shape (batch_size, num_heads, past_sequence_length, head_size)');if(u.dims[2]!==l.dims[2])throw new Error('Input "past_key" and "past_value" shall have same dim 2 (past_sequence_length)');if(l.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');g=u.dims[2],T=u.dims[2]}else if(u||l)throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let v;if(t){if(n.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(t.dims.length<3||t.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(n.dims[0]!==t.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(t.dims.length===3){if(t.dims[2]!==n.dims[2])throw new Error('Input "query" and "key" shall have same dim 2 (hidden_size)');v=2,h=t.dims[1]}else if(t.dims.length===5){if(t.dims[2]!==e.numHeads||t.dims[3]!==2||t.dims[4]!==w)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(o)throw new Error('Expect "value" be none when "key" has packed kv format.');v=5,h=t.dims[1]}else{if(t.dims[1]!==e.numHeads||t.dims[3]!==w)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');v=0,h=t.dims[2]}}else{if(n.dims.length!==3&&n.dims.length!==5)throw new Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(n.dims.length===5&&(n.dims[2]!==e.numHeads||n.dims[3]!==3))throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');v=3}if(i){if(i.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimension');if(o&&n.dims.length===5&&n.dims[3]===2)throw new Error("bias is not allowed for packed kv.")}let S=0;if(s){S=8;let z=s.dims;throw z.length===1?z[0]===c?S=1:z[0]===3*c+2&&(S=3):z.length===2&&z[0]===c&&z[1]===h&&(S=5),S===8?new Error('Input "key_padding_mask" shape shall be (batch_size) or (batch_size, kv_sequence_length)'):new Error("Mask not supported")}let $=!1,P=b;if(o){if(o.dims.length!==3&&o.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(n.dims[0]!==o.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(o.dims.length===3){if(h!==o.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');P=o.dims[2]}else{if(h!==o.dims[2])throw new Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');P=o.dims[1]*o.dims[3],$=!0}}let E=g+h,N=!1;if(s)throw new Error("Key padding mask is not supported");if(a){if(a.dims.length!==4)throw new Error('Input "relative_position_bias" is expected to have 4 dimensions');if(a.dims[0]!==c&&a.dims[0]!==1||a.dims[1]!==e.numHeads||a.dims[2]!==p||a.dims[3]!==E)throw new Error('Input "relative_position_bias" shape (batch_size, 1, sequence_length, kv_sequence_length)')}return{batchSize:c,sequenceLength:p,pastSequenceLength:g,kvSequenceLength:h,totalSequenceLength:E,maxSequenceLength:T,inputHiddenSize:0,hiddenSize:b,vHiddenSize:P,headSize:w,vHeadSize:Math.floor(P/e.numHeads),numHeads:e.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:e.maskFilterValue,maskType:S,scale:e.scale,broadcastResPosBias:N,passPastInKv:$,qkvFormat:v}},my=r=>de({...r}),py=de({perm:[0,2,1,3]}),C1=(r,e,n,t,o,i,s)=>{let a=[t,o,i],u=B.size(a),l=[{type:12,data:u},{type:12,data:s},{type:12,data:i}],f=c=>{let p=G("qkv_with_bias",e.dataType,a),b=D("qkv",e.dataType,a),h=D("bias",n.dataType,a),g=[{name:"output_size",type:"u32"},{name:"bias_offset",type:"u32"},{name:"hidden_size",type:"u32"}];return` ${c.registerUniforms(g).declareVariables(b,h,p)} ${c.mainStart()} ${c.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} let bias_offset_idx = (global_idx % uniforms.hidden_size) + uniforms.bias_offset; qkv_with_bias[global_idx] = qkv[global_idx] + bias[bias_offset_idx]; - }`};return r.compute({name:"MultiHeadAttentionAddBias",shaderCache:{inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:a,dataType:e.dataType,gpuDataType:0}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:l}),getShaderSource:f},{inputs:[e,n],outputs:[-1]})[0]},eo=(r,e,n,t,o,i,s,a)=>{let u=i;if(s){if(t===1)throw new Error("AddBiasReshape is not implemented. Please export your model with packed QKV or KV");return u=O1(r,i,s,e,t,n*o,a),u=u.reshape([e,t,n,o]),r.compute(Tt(u,py.perm),{inputs:[u],outputs:[-1]})[0]}else return i.dims.length===3&&(u=i.reshape([e,t,n,o])),r.compute(Tt(u,py.perm),{inputs:[u],outputs:[-1]})[0]},hy=(r,e)=>{let n=P1(r.inputs,e),t=r.inputs[0],o=_t(r.inputs,1),i=_t(r.inputs,2),s=_t(r.inputs,3),a=_t(r.inputs,4),u=_t(r.inputs,5),l=_t(r.inputs,6),f=_t(r.inputs,7);if(t.dims.length===5)throw new Error("Packed QKV is not implemented");if(o?.dims.length===5)throw new Error("Packed KV is not implemented");let c=o&&i&&o.dims.length===4&&i.dims.length===4,p=eo(r,n.batchSize,n.numHeads,n.sequenceLength,n.headSize,t,s,0);if(c)return In(r,p,o,i,a,void 0,l,f,u,n,e);if(!o||!i)throw new Error("key and value must be provided");let b=eo(r,n.batchSize,n.numHeads,n.kvSequenceLength,n.headSize,o,s,n.hiddenSize),h=eo(r,n.batchSize,n.numHeads,n.kvSequenceLength,n.vHeadSize,i,s,2*n.hiddenSize);In(r,p,b,h,a,void 0,l,f,u,n,e)}});var gy,E1,C1,du,by,pu=C(()=>{"use strict";ue();ye();he();gy=r=>Array.from(r.getBigInt64Array(),Number),E1=r=>{if(!r||r.length!==2)throw new Error("Tile requires 2 inputs.");if(r[0].dataType!==1&&r[0].dataType!==10&&r[0].dataType!==6&&r[0].dataType!==12)throw new Error("Tile only support float, float16, int32, and uint32 data types");if(r[1].dataType!==7)throw new Error("Tile `repeats` input should be of int64 data type");if(r[1].dims.length!==1)throw new Error("Tile `repeats` input should be 1-D");if(gy(r[1]).length!==r[0].dims.length)throw new Error("Tile `repeats` input should have same number of elements as rank of input data tensor")},C1=(r,e)=>{let n=[];for(let t=0;t{let n=r[0].dims,t=e??gy(r[1]),o=C1(n,t),i=B.size(o),s=r[0].dataType,a=D("input",s,n.length),u=G("output",s,o.length),l=f=>` + }`};return r.compute({name:"MultiHeadAttentionAddBias",shaderCache:{inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:a,dataType:e.dataType,gpuDataType:0}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:l}),getShaderSource:f},{inputs:[e,n],outputs:[-1]})[0]},eo=(r,e,n,t,o,i,s,a)=>{let u=i;if(s){if(t===1)throw new Error("AddBiasReshape is not implemented. Please export your model with packed QKV or KV");return u=C1(r,i,s,e,t,n*o,a),u=u.reshape([e,t,n,o]),r.compute(Tt(u,py.perm),{inputs:[u],outputs:[-1]})[0]}else return i.dims.length===3&&(u=i.reshape([e,t,n,o])),r.compute(Tt(u,py.perm),{inputs:[u],outputs:[-1]})[0]},hy=(r,e)=>{let n=E1(r.inputs,e),t=r.inputs[0],o=_t(r.inputs,1),i=_t(r.inputs,2),s=_t(r.inputs,3),a=_t(r.inputs,4),u=_t(r.inputs,5),l=_t(r.inputs,6),f=_t(r.inputs,7);if(t.dims.length===5)throw new Error("Packed QKV is not implemented");if(o?.dims.length===5)throw new Error("Packed KV is not implemented");let c=o&&i&&o.dims.length===4&&i.dims.length===4,p=eo(r,n.batchSize,n.numHeads,n.sequenceLength,n.headSize,t,s,0);if(c)return Sn(r,p,o,i,a,void 0,l,f,u,n,e);if(!o||!i)throw new Error("key and value must be provided");let b=eo(r,n.batchSize,n.numHeads,n.kvSequenceLength,n.headSize,o,s,n.hiddenSize),h=eo(r,n.batchSize,n.numHeads,n.kvSequenceLength,n.vHeadSize,i,s,2*n.hiddenSize);Sn(r,p,b,h,a,void 0,l,f,u,n,e)}});var gy,k1,D1,pu,by,mu=C(()=>{"use strict";ue();ye();he();gy=r=>Array.from(r.getBigInt64Array(),Number),k1=r=>{if(!r||r.length!==2)throw new Error("Tile requires 2 inputs.");if(r[0].dataType!==1&&r[0].dataType!==10&&r[0].dataType!==6&&r[0].dataType!==12)throw new Error("Tile only support float, float16, int32, and uint32 data types");if(r[1].dataType!==7)throw new Error("Tile `repeats` input should be of int64 data type");if(r[1].dims.length!==1)throw new Error("Tile `repeats` input should be 1-D");if(gy(r[1]).length!==r[0].dims.length)throw new Error("Tile `repeats` input should have same number of elements as rank of input data tensor")},D1=(r,e)=>{let n=[];for(let t=0;t{let n=r[0].dims,t=e??gy(r[1]),o=D1(n,t),i=B.size(o),s=r[0].dataType,a=D("input",s,n.length),u=G("output",s,o.length),l=f=>` const inputShape = ${a.indices(...n)}; ${f.registerUniform("output_size","u32").declareVariables(a,u)} ${f.mainStart()} @@ -3335,7 +3335,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; ${a.indicesSet("input_indices","i","input_dim_value")} } ${u.setByOffset("global_idx",a.getByIndices("input_indices"))} - }`;return{name:"Tile",shaderCache:{hint:`${t}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:o,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(i/64)},programUniforms:[{type:12,data:i},...W(r[0].dims,o)]}),getShaderSource:l}},by=r=>{E1(r.inputs),r.compute(du(r.inputs),{inputs:[0]})}});var k1,yy,vy,D1,xy,wy,Ty=C(()=>{"use strict";ue();ye();et();Li();he();fu();pu();Jr();k1=(r,e)=>{let n=r[0],t=r[1],o=r[2],i=r[3],s=r[4];if(n.dims.length!==3&&n.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let a=!1,u=n.dims[0],l=n.dims[1],f=n.dims.length===3?a?n.dims[2]/3:n.dims[2]:e.numHeads*n.dims[4],c=l,p=0,b=0,h=Math.floor(f/e.numHeads),g=i&&i.dims.length!==0,T=s&&s.dims.length!==0,w=!0;if(g&&T){if(i.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(s.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');w?(p=i.dims[1],b=i.dims[1]):(p=i.dims[2],b=i.dims[2])}else if(g||T)throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let v;if(t){if(n.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(t.dims.length<3||t.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(n.dims[0]!==t.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(t.dims.length===3){if(n.dims[2]%t.dims[2]!==0)throw new Error('Dimension 2 of "query" should be a multiple of "key"');v=2,c=t.dims[1]}else if(t.dims.length===5){if(t.dims[2]!==e.numHeads||t.dims[3]!==2||t.dims[4]!==h)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(o)throw new Error('Expect "value" be none when "key" has packed kv format.');v=5,c=t.dims[1]}else{if(t.dims[1]!==e.numHeads||t.dims[3]!==h)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');v=0,c=t.dims[2]}}else{if(n.dims.length!==3&&n.dims.length!==5)throw new Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(n.dims.length===5&&(n.dims[2]!==e.numHeads||n.dims[3]!==3))throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');v=3}let S=0,$=!1,P=f;if(o){if(o.dims.length!==3&&o.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(n.dims[0]!==o.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(o.dims.length===3){if(c!==o.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');P=o.dims[2]}else{if(c!==o.dims[2])throw new Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');P=o.dims[1]*o.dims[3],$=!0}}let E=p+c,N=!1;return{batchSize:u,sequenceLength:l,pastSequenceLength:p,kvSequenceLength:c,totalSequenceLength:E,maxSequenceLength:b,inputHiddenSize:0,hiddenSize:f,vHiddenSize:P,headSize:h,vHeadSize:Math.floor(P/e.kvNumHeads),numHeads:e.numHeads,kvNumHeads:e.kvNumHeads,nReps:e.numHeads/e.kvNumHeads,pastPresentShareBuffer:!1,maskType:S,scale:e.scale,broadcastResPosBias:N,passPastInKv:$,qkvFormat:v,isPastkvBSNH:w}},yy=(r,e,n,t)=>{let o=[t.batchSize,t.totalSequenceLength,t.kvNumHeads,t.headSize],i=4,s=B.size(o)/i,a=t.totalSequenceLength,u=G("present_kv",n,o.length,i),l=D("new_kv",r.dataType,r.dims.length,i),f=e?D("past_kv",e.dataType,e.dims.length,i):void 0,c=Math.ceil(t.headSize/i),p={x:a,y:r.dims[0],z:1},b=e?["rank","rank"]:["rank"],h=[{type:12,data:s},{type:12,data:t.pastSequenceLength},{type:12,data:t.kvSequenceLength},{type:12,data:t.totalSequenceLength}],g=[l];f?(h.push(...W(r.dims),...W(e.dims),...W(o)),g.push(f)):h.push(...W(r.dims),...W(o));let T=[{name:"output_size",type:"u32"},{name:"past_seqlen",type:"u32"},{name:"new_seqlen",type:"u32"},{name:"present_seqlen",type:"u32"}],w=` let past_batch_stride = uniforms.past_seqlen * num_heads * H; + }`;return{name:"Tile",shaderCache:{hint:`${t}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:o,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(i/64)},programUniforms:[{type:12,data:i},...W(r[0].dims,o)]}),getShaderSource:l}},by=r=>{k1(r.inputs),r.compute(pu(r.inputs),{inputs:[0]})}});var B1,yy,vy,L1,xy,wy,Ty=C(()=>{"use strict";ue();ye();et();Li();he();du();mu();Jr();B1=(r,e)=>{let n=r[0],t=r[1],o=r[2],i=r[3],s=r[4];if(n.dims.length!==3&&n.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let a=!1,u=n.dims[0],l=n.dims[1],f=n.dims.length===3?a?n.dims[2]/3:n.dims[2]:e.numHeads*n.dims[4],c=l,p=0,b=0,h=Math.floor(f/e.numHeads),g=i&&i.dims.length!==0,T=s&&s.dims.length!==0,w=!0;if(g&&T){if(i.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(s.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');w?(p=i.dims[1],b=i.dims[1]):(p=i.dims[2],b=i.dims[2])}else if(g||T)throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let v;if(t){if(n.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(t.dims.length<3||t.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(n.dims[0]!==t.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(t.dims.length===3){if(n.dims[2]%t.dims[2]!==0)throw new Error('Dimension 2 of "query" should be a multiple of "key"');v=2,c=t.dims[1]}else if(t.dims.length===5){if(t.dims[2]!==e.numHeads||t.dims[3]!==2||t.dims[4]!==h)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(o)throw new Error('Expect "value" be none when "key" has packed kv format.');v=5,c=t.dims[1]}else{if(t.dims[1]!==e.numHeads||t.dims[3]!==h)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');v=0,c=t.dims[2]}}else{if(n.dims.length!==3&&n.dims.length!==5)throw new Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(n.dims.length===5&&(n.dims[2]!==e.numHeads||n.dims[3]!==3))throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');v=3}let S=0,$=!1,P=f;if(o){if(o.dims.length!==3&&o.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(n.dims[0]!==o.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(o.dims.length===3){if(c!==o.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');P=o.dims[2]}else{if(c!==o.dims[2])throw new Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');P=o.dims[1]*o.dims[3],$=!0}}let E=p+c,N=!1;return{batchSize:u,sequenceLength:l,pastSequenceLength:p,kvSequenceLength:c,totalSequenceLength:E,maxSequenceLength:b,inputHiddenSize:0,hiddenSize:f,vHiddenSize:P,headSize:h,vHeadSize:Math.floor(P/e.kvNumHeads),numHeads:e.numHeads,kvNumHeads:e.kvNumHeads,nReps:e.numHeads/e.kvNumHeads,pastPresentShareBuffer:!1,maskType:S,scale:e.scale,broadcastResPosBias:N,passPastInKv:$,qkvFormat:v,isPastkvBSNH:w}},yy=(r,e,n,t)=>{let o=[t.batchSize,t.totalSequenceLength,t.kvNumHeads,t.headSize],i=4,s=B.size(o)/i,a=t.totalSequenceLength,u=G("present_kv",n,o.length,i),l=D("new_kv",r.dataType,r.dims.length,i),f=e?D("past_kv",e.dataType,e.dims.length,i):void 0,c=Math.ceil(t.headSize/i),p={x:a,y:r.dims[0],z:1},b=e?["rank","rank"]:["rank"],h=[{type:12,data:s},{type:12,data:t.pastSequenceLength},{type:12,data:t.kvSequenceLength},{type:12,data:t.totalSequenceLength}],g=[l];f?(h.push(...W(r.dims),...W(e.dims),...W(o)),g.push(f)):h.push(...W(r.dims),...W(o));let T=[{name:"output_size",type:"u32"},{name:"past_seqlen",type:"u32"},{name:"new_seqlen",type:"u32"},{name:"present_seqlen",type:"u32"}],w=` let past_batch_stride = uniforms.past_seqlen * num_heads * H; var past_head_stride = uniforms.past_seqlen * H; if (is_bsnh) { past_head_stride = H; @@ -3381,7 +3381,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; let out_offset = b * present_batch_stride + s * row_stride + n * present_head_stride + h; ${S} - }`;return{name:"ConcatPastNew",shaderCache:{hint:`${t.kvNumHeads}${c}${!!e}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:o,dataType:n}],dispatchGroup:p,programUniforms:h}),getShaderSource:$}},vy=r=>de({...r}),D1=de({perm:[0,2,1,3]}),xy=(r,e,n,t,o)=>{let i=e,s=t.kvNumHeads,a=t.nReps;return e.dims.length===3&&t.kvSequenceLength!==0&&(i=e.reshape([t.batchSize,t.kvSequenceLength,s,t.headSize])),n?i=r.compute(yy(i,n,i.dataType,t),{inputs:[i,n],outputs:[t.isPastkvBSNH?o:-1]})[0]:i=r.compute(yy(i,void 0,i.dataType,t),{inputs:[i],outputs:[t.isPastkvBSNH?o:-1]})[0],a!==1&&(i=r.compute(du([i],[1,1,1,a]),{inputs:[i],outputs:[-1]})[0],i=i.reshape([t.batchSize,t.totalSequenceLength,s*a,t.headSize])),r.compute(Tt(i,D1.perm),{inputs:[i],outputs:[-1]})[0]},wy=(r,e)=>{let n=k1(r.inputs,e);if(r.inputs[0].dims.length===5)throw new Error("Packed QKV is not implemented");if(r.inputs[1]?.dims.length===5)throw new Error("Packed KV is not implemented");let t=eo(r,n.batchSize,n.numHeads,n.sequenceLength,n.headSize,r.inputs[0],void 0,0),o=r.inputs[3]&&r.inputs[3].dims.length!==0?r.inputs[3]:void 0,i=r.inputs[4]&&r.inputs[4].dims.length!==0?r.inputs[4]:void 0,s=xy(r,r.inputs[1],o,n,1),a=xy(r,r.inputs[2],i,n,2);In(r,t,s,a,void 0,void 0,void 0,void 0,void 0,n,e)}});var B1,L1,R1,_y,Iy=C(()=>{"use strict";ue();ye();he();B1=(r,e)=>{let n=r[0].dims,t=n,o=2,i=B.sizeToDimension(n,o),s=B.sizeFromDimension(n,o),a=ze(s),u=s/a,l=[n[0],n[1],u],f=["rank","type","type"],c=[{type:12,data:s},{type:12,data:u}];c.push(...W(l,l));let p=b=>{let h=D("x",r[0].dataType,l.length,a),g=D("scale",r[1].dataType,r[1].dims),T=D("bias",r[2].dataType,r[2].dims),w=G("output",r[0].dataType,l.length,a),v=[h,g,T,w],S=h.type.value,$=a===1?"f32":`vec${a}`,P=64,E=[{name:"normSize",type:"u32"},{name:"normPackedSize",type:"u32"}];return` + }`;return{name:"ConcatPastNew",shaderCache:{hint:`${t.kvNumHeads}${c}${!!e}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:o,dataType:n}],dispatchGroup:p,programUniforms:h}),getShaderSource:$}},vy=r=>de({...r}),L1=de({perm:[0,2,1,3]}),xy=(r,e,n,t,o)=>{let i=e,s=t.kvNumHeads,a=t.nReps;return e.dims.length===3&&t.kvSequenceLength!==0&&(i=e.reshape([t.batchSize,t.kvSequenceLength,s,t.headSize])),n?i=r.compute(yy(i,n,i.dataType,t),{inputs:[i,n],outputs:[t.isPastkvBSNH?o:-1]})[0]:i=r.compute(yy(i,void 0,i.dataType,t),{inputs:[i],outputs:[t.isPastkvBSNH?o:-1]})[0],a!==1&&(i=r.compute(pu([i],[1,1,1,a]),{inputs:[i],outputs:[-1]})[0],i=i.reshape([t.batchSize,t.totalSequenceLength,s*a,t.headSize])),r.compute(Tt(i,L1.perm),{inputs:[i],outputs:[-1]})[0]},wy=(r,e)=>{let n=B1(r.inputs,e);if(r.inputs[0].dims.length===5)throw new Error("Packed QKV is not implemented");if(r.inputs[1]?.dims.length===5)throw new Error("Packed KV is not implemented");let t=eo(r,n.batchSize,n.numHeads,n.sequenceLength,n.headSize,r.inputs[0],void 0,0),o=r.inputs[3]&&r.inputs[3].dims.length!==0?r.inputs[3]:void 0,i=r.inputs[4]&&r.inputs[4].dims.length!==0?r.inputs[4]:void 0,s=xy(r,r.inputs[1],o,n,1),a=xy(r,r.inputs[2],i,n,2);Sn(r,t,s,a,void 0,void 0,void 0,void 0,void 0,n,e)}});var R1,N1,z1,_y,Iy=C(()=>{"use strict";ue();ye();he();R1=(r,e)=>{let n=r[0].dims,t=n,o=2,i=B.sizeToDimension(n,o),s=B.sizeFromDimension(n,o),a=ze(s),u=s/a,l=[n[0],n[1],u],f=["rank","type","type"],c=[{type:12,data:s},{type:12,data:u}];c.push(...W(l,l));let p=b=>{let h=D("x",r[0].dataType,l.length,a),g=D("scale",r[1].dataType,r[1].dims),T=D("bias",r[2].dataType,r[2].dims),w=G("output",r[0].dataType,l.length,a),v=[h,g,T,w],S=h.type.value,$=a===1?"f32":`vec${a}`,P=64,E=[{name:"normSize",type:"u32"},{name:"normPackedSize",type:"u32"}];return` var meanShared : f32; var squaredNormShared : f32; var workgroupShared : array<${$}, ${P}>; @@ -3441,7 +3441,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; let value = ${h.get("batch","channel","h")} * ${S}(${$}(channelScale)) + ${S}(${$}(channelShift)); ${w.set("batch","channel","h","value")}; } - }`};return{name:"InstanceNormalization",shaderCache:{hint:`${e.epsilon};${a}`,inputDependencies:f},getRunData:()=>({outputs:[{dims:t,dataType:r[0].dataType}],dispatchGroup:{x:i},programUniforms:c}),getShaderSource:p}},L1=(r,e,n,t,o,i,s,a)=>{let u=ze(s),l=64,f=u===1?"vec2f":`mat2x${u}f`,c=u===1?"f32":`vec${u}f`,p=(E,N)=>`${f}(${E}, ${N})`,b=o*s/u,h=Math.ceil(i/l),g=["type"],T=[{type:12,data:h},{type:12,data:i},{type:12,data:Math.floor(s/u)},{type:12,data:Math.floor(i*s/u)}],w=E=>{let N=D("input",e.dataType,e.dims,u);return` + }`};return{name:"InstanceNormalization",shaderCache:{hint:`${e.epsilon};${a}`,inputDependencies:f},getRunData:()=>({outputs:[{dims:t,dataType:r[0].dataType}],dispatchGroup:{x:i},programUniforms:c}),getShaderSource:p}},N1=(r,e,n,t,o,i,s,a)=>{let u=ze(s),l=64,f=u===1?"vec2f":`mat2x${u}f`,c=u===1?"f32":`vec${u}f`,p=(E,N)=>`${f}(${E}, ${N})`,b=o*s/u,h=Math.ceil(i/l),g=["type"],T=[{type:12,data:h},{type:12,data:i},{type:12,data:Math.floor(s/u)},{type:12,data:Math.floor(i*s/u)}],w=E=>{let N=D("input",e.dataType,e.dims,u);return` ${E.declareVariables(N)} @group(0) @binding(1) var output : array<${f}>; struct Uniforms {wg_size:u32, H:u32, C:u32, image_size:u32}; @@ -3493,7 +3493,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; let channelShift = ${c}(bias[currentChannelNumber]) - sum * channelScale; output[global_idx] = ${p("channelScale","channelShift")}; - }`};return r.compute({name:"InstanceNormComputeChannelScaleShift",shaderCache:{hint:`${u};${a}`,inputDependencies:$},getRunData:()=>({outputs:[{dims:[o,s,2],dataType:1}],dispatchGroup:{x:Math.ceil(b/64)},programUniforms:S}),getShaderSource:P},{inputs:[v,n,t],outputs:[-1]})[0]},R1=(r,e,n)=>{let t=e[0].dims,o=t,i=t[0],s=t[t.length-1],a=B.sizeFromDimension(t,1)/s,u=ze(s),l=B.size(o)/u,f=[{type:12,data:a},{type:12,data:Math.floor(s/u)}],c=["type","type"],p=L1(r,e[0],e[1],e[2],i,a,s,n.epsilon),b=h=>{let g=Be(e[0].dataType),T=u===1?"vec2f":`mat2x${u}f`,w=u===1?g:`vec${u}<${g}>`,v=D("input",e[0].dataType,e[0].dims,u),S=G("output",e[0].dataType,o,u);return` + }`};return r.compute({name:"InstanceNormComputeChannelScaleShift",shaderCache:{hint:`${u};${a}`,inputDependencies:$},getRunData:()=>({outputs:[{dims:[o,s,2],dataType:1}],dispatchGroup:{x:Math.ceil(b/64)},programUniforms:S}),getShaderSource:P},{inputs:[v,n,t],outputs:[-1]})[0]},z1=(r,e,n)=>{let t=e[0].dims,o=t,i=t[0],s=t[t.length-1],a=B.sizeFromDimension(t,1)/s,u=ze(s),l=B.size(o)/u,f=[{type:12,data:a},{type:12,data:Math.floor(s/u)}],c=["type","type"],p=N1(r,e[0],e[1],e[2],i,a,s,n.epsilon),b=h=>{let g=Be(e[0].dataType),T=u===1?"vec2f":`mat2x${u}f`,w=u===1?g:`vec${u}<${g}>`,v=D("input",e[0].dataType,e[0].dims,u),S=G("output",e[0].dataType,o,u);return` @group(0) @binding(0) var input : array<${v.type.storage}>; @group(0) @binding(1) var scaleInput : array<${T}>; @group(0) @binding(2) var output : array<${S.type.storage}>; @@ -3507,7 +3507,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; let scaleOffset = currentImageNumber * uniforms.C + currentChannelNumber; let scale = scaleInput[scaleOffset]; output[global_idx] = fma(input[global_idx], ${w}(scale[0]), ${w}(scale[1])); - }`};r.compute({name:"InstanceNormalizationNHWC",shaderCache:{hint:`${u}`,inputDependencies:c},getRunData:()=>({outputs:[{dims:o,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:f}),getShaderSource:b},{inputs:[e[0],p]})},_y=(r,e)=>{e.format==="NHWC"?R1(r,r.inputs,e):r.compute(B1(r.inputs,e))}});var N1,z1,Sy,$y=C(()=>{"use strict";ue();ye();he();N1=r=>{if(!r||r.length<2)throw new Error("layerNorm requires at least 2 inputs.")},z1=(r,e,n)=>{let t=e.simplified,o=r[0].dims,i=r[1],s=!t&&r[2],a=o,u=B.normalizeAxis(e.axis,o.length),l=B.sizeToDimension(o,u),f=B.sizeFromDimension(o,u),c=B.size(i.dims),p=s?B.size(s.dims):0;if(c!==f||s&&p!==f)throw new Error(`Size of X.shape()[axis:] == ${f}. + }`};r.compute({name:"InstanceNormalizationNHWC",shaderCache:{hint:`${u}`,inputDependencies:c},getRunData:()=>({outputs:[{dims:o,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(l/64)},programUniforms:f}),getShaderSource:b},{inputs:[e[0],p]})},_y=(r,e)=>{e.format==="NHWC"?z1(r,r.inputs,e):r.compute(R1(r.inputs,e))}});var F1,M1,Sy,$y=C(()=>{"use strict";ue();ye();he();F1=r=>{if(!r||r.length<2)throw new Error("layerNorm requires at least 2 inputs.")},M1=(r,e,n)=>{let t=e.simplified,o=r[0].dims,i=r[1],s=!t&&r[2],a=o,u=B.normalizeAxis(e.axis,o.length),l=B.sizeToDimension(o,u),f=B.sizeFromDimension(o,u),c=B.size(i.dims),p=s?B.size(s.dims):0;if(c!==f||s&&p!==f)throw new Error(`Size of X.shape()[axis:] == ${f}. Size of scale and bias (if provided) must match this. Got scale size of ${c} and bias size of ${p}`);let b=[];for(let P=0;P1,v=n>2,S=P=>{let E=Be(r[0].dataType),N=[D("x",r[0].dataType,r[0].dims,h),D("scale",i.dataType,i.dims,h)];s&&N.push(D("bias",s.dataType,s.dims,h)),N.push(G("output",r[0].dataType,a,h)),w&&N.push(G("mean_data_output",1,b)),v&&N.push(G("inv_std_output",1,b));let z=[{name:"norm_count",type:"u32"},{name:"norm_size",type:"f32"},{name:"norm_size_vectorized",type:"u32"},{name:"epsilon",type:"f32"}];return` ${P.registerUniforms(z).declareVariables(...N)} @@ -3535,7 +3535,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; ${w?"mean_data_output[global_idx] = mean":""}; ${v?"inv_std_output[global_idx] = inv_std_dev":""}; - }`},$=[{dims:a,dataType:r[0].dataType}];return w&&$.push({dims:b,dataType:1}),v&&$.push({dims:b,dataType:1}),{name:"LayerNormalization",shaderCache:{hint:`${h};${n};${t}`,inputDependencies:g},getRunData:()=>({outputs:$,dispatchGroup:{x:Math.ceil(l/64)},programUniforms:T}),getShaderSource:S}},Sy=(r,e)=>{N1(r.inputs),r.compute(z1(r.inputs,e,r.outputCount))}});var F1,M1,Ay,Py,Oy=C(()=>{"use strict";ue();ye();et();he();F1=(r,e)=>{if(r.length<3||r.length>4)throw new Error("MatMulNBits requires 3 or 4 inputs");let n=r[0],t=n.dims.length;if(n.dims[t-1]!==e.k)throw new Error("The last dim of input shape does not match the k value");let o=Math.floor((e.k+e.blockSize-1)/e.blockSize),i=e.blockSize/8*e.bits,s=r[1];if(!B.areEqual(s.dims,[e.n,o,i]))throw new Error("The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize");let u=r[2].dims;if(B.size(u)!==e.n*o)throw new Error("scales input size error.");if(r.length===4){let f=r[3].dims,c=e.bits>4?e.n*o:e.n*Math.floor((o+1)/2);if(B.size(f)!==c)throw new Error("zeroPoints input size error.")}},M1=(r,e,n,t)=>{let o=r[0].dims,i=o.length,s=Math.floor((e.k+e.blockSize-1)/e.blockSize),a=o[i-2],u=e.k,l=e.n,f=o.slice(0,i-2),c=B.size(f),b=e.blockSize/8*e.bits/4,h=r[0].dataType,g=ze(a),T=ze(e.k),w=ze(b),v=jr(h),S=a*s*v,$=Math.floor(t/S),P=s<=n[0]&&$>0,E=!P||$>=4?ze(l):$>=2&&ze(l)>=2?2:1,N=f.concat([a,l]),z=B.size(N)/E/g,q=P?[]:[{type:12,data:z},{type:12,data:e.blockSize}],K=[c,a,u/T],F=B.convertShape(r[1].dims).slice();F.splice(-1,1,b/w),q.push(...W(K)),q.push(...W(F)),q.push(...W(r[2].dims)),r.length===4&&q.push(...W(B.convertShape(r[3].dims)));let _e=[c,a,l/E];q.push(...W(_e));let $e=ae=>{let qe=K.length,Q=D("a",r[0].dataType,qe,T),ge=D("b",12,F.length,w),Ie=D("scales",r[2].dataType,r[2].dims.length),xe=[Q,ge,Ie],se=r.length===4?D("zero_points",12,r[3].dims.length):void 0;se&&xe.push(se);let pe=_e.length,ce=G("output",r[0].dataType,pe,E),ut=[{name:"output_size",type:"u32"},{name:"block_size",type:"u32"}],V=Be(r[0].dataType),ie=(()=>{switch(T){case 1:return`array<${V}, 8>`;case 2:return`mat4x2<${V}>`;case 4:return`mat2x4<${V}>`;default:throw new Error(`${T}-component is not supported.`)}})(),Te=` + }`},$=[{dims:a,dataType:r[0].dataType}];return w&&$.push({dims:b,dataType:1}),v&&$.push({dims:b,dataType:1}),{name:"LayerNormalization",shaderCache:{hint:`${h};${n};${t}`,inputDependencies:g},getRunData:()=>({outputs:$,dispatchGroup:{x:Math.ceil(l/64)},programUniforms:T}),getShaderSource:S}},Sy=(r,e)=>{F1(r.inputs),r.compute(M1(r.inputs,e,r.outputCount))}});var V1,G1,Ay,Py,Oy=C(()=>{"use strict";ue();ye();et();he();V1=(r,e)=>{if(r.length<3||r.length>4)throw new Error("MatMulNBits requires 3 or 4 inputs");let n=r[0],t=n.dims.length;if(n.dims[t-1]!==e.k)throw new Error("The last dim of input shape does not match the k value");let o=Math.floor((e.k+e.blockSize-1)/e.blockSize),i=e.blockSize/8*e.bits,s=r[1];if(!B.areEqual(s.dims,[e.n,o,i]))throw new Error("The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize");let u=r[2].dims;if(B.size(u)!==e.n*o)throw new Error("scales input size error.");if(r.length===4){let f=r[3].dims,c=e.bits>4?e.n*o:e.n*Math.floor((o+1)/2);if(B.size(f)!==c)throw new Error("zeroPoints input size error.")}},G1=(r,e,n,t)=>{let o=r[0].dims,i=o.length,s=Math.floor((e.k+e.blockSize-1)/e.blockSize),a=o[i-2],u=e.k,l=e.n,f=o.slice(0,i-2),c=B.size(f),b=e.blockSize/8*e.bits/4,h=r[0].dataType,g=ze(a),T=ze(e.k),w=ze(b),v=Kr(h),S=a*s*v,$=Math.floor(t/S),P=s<=n[0]&&$>0,E=!P||$>=4?ze(l):$>=2&&ze(l)>=2?2:1,N=f.concat([a,l]),z=B.size(N)/E/g,q=P?[]:[{type:12,data:z},{type:12,data:e.blockSize}],j=[c,a,u/T],F=B.convertShape(r[1].dims).slice();F.splice(-1,1,b/w),q.push(...W(j)),q.push(...W(F)),q.push(...W(r[2].dims)),r.length===4&&q.push(...W(B.convertShape(r[3].dims)));let _e=[c,a,l/E];q.push(...W(_e));let $e=ae=>{let qe=j.length,Q=D("a",r[0].dataType,qe,T),ge=D("b",12,F.length,w),Ie=D("scales",r[2].dataType,r[2].dims.length),xe=[Q,ge,Ie],se=r.length===4?D("zero_points",12,r[3].dims.length):void 0;se&&xe.push(se);let pe=_e.length,ce=G("output",r[0].dataType,pe,E),ut=[{name:"output_size",type:"u32"},{name:"block_size",type:"u32"}],V=Be(r[0].dataType),ie=(()=>{switch(T){case 1:return`array<${V}, 8>`;case 2:return`mat4x2<${V}>`;case 4:return`mat2x4<${V}>`;default:throw new Error(`${T}-component is not supported.`)}})(),Te=` for (var word: u32 = 0; word < ${b}; word += ${w}) { ${ge.indicesSet("b_indices","2","word")}; let b_data = ${ge.getByIndices("b_indices")}; @@ -3544,8 +3544,8 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; let b_mask: u32 = 0x0F0F0F0Fu; let b_value_lower: vec4 = unpack4xU8(b_value & b_mask); let b_value_upper: vec4 = unpack4xU8((b_value >> 4) & b_mask); - let b_quantized_values = ${ie}(${Array.from({length:4},(Fe,Ke)=>`${V}(b_value_lower[${Ke}]), ${V}(b_value_upper[${Ke}])`).join(", ")}); - let b_dequantized_values = ${(()=>T===1?`${ie}(${Array.from({length:8},(Fe,Ke)=>`(b_quantized_values[${Ke}] - zero_point) * scale`).join(", ")});`:`(b_quantized_values - ${ie}(${Array(8).fill("zero_point").join(",")})) * scale;`)()}; + let b_quantized_values = ${ie}(${Array.from({length:4},(Fe,je)=>`${V}(b_value_lower[${je}]), ${V}(b_value_upper[${je}])`).join(", ")}); + let b_dequantized_values = ${(()=>T===1?`${ie}(${Array.from({length:8},(Fe,je)=>`(b_quantized_values[${je}] - zero_point) * scale`).join(", ")});`:`(b_quantized_values - ${ie}(${Array(8).fill("zero_point").join(",")})) * scale;`)()}; // Number of B elements per 32-bit word is 32/bits = 32/4 = 8 for (var m: u32 = 0; m < ${P?a:g}u; m++) { ${Q.indicesSet("a_indices",qe-2,P?"m":`row * ${g} + m`)}; @@ -3556,7 +3556,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; a_data[j] = ${Q.getByOffset("input_offset")}; input_offset++; } - ${P?"workgroup_shared[workgroup_shared_offset + m]":"output_values[m]"}${E>1?"[c]":""} += ${Array.from({length:8/T},(Fe,Ke)=>`${T===1?`a_data[${Ke}] * b_dequantized_values[${Ke}]`:`dot(a_data[${Ke}], b_dequantized_values[${Ke}])`}`).join(" + ")}; + ${P?"workgroup_shared[workgroup_shared_offset + m]":"output_values[m]"}${E>1?"[c]":""} += ${Array.from({length:8/T},(Fe,je)=>`${T===1?`a_data[${je}] * b_dequantized_values[${je}]`:`dot(a_data[${je}], b_dequantized_values[${je}])`}`).join(" + ")}; } word_offset += ${8/T}; } @@ -3661,7 +3661,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; ${ce.indicesSet("output_indices",pe-2,`${g} * row + k`)}; ${ce.setByIndices("output_indices","output_values[k]")} } - }`};return{name:P?"BlockwiseMatMulNBits":"MatMulNBits",shaderCache:{hint:`${e.cacheKey};${a};${h};${r.length}`,inputDependencies:Array(r.length).fill("rank")},getRunData:()=>({outputs:[{dims:N,dataType:h}],name:P?"BlockwiseMatMulNBits":"MatMulNBits",dispatchGroup:P?{x:1,y:Math.ceil(l/E),z:c}:{x:Math.ceil(z/64)},programUniforms:q}),getShaderSource:$e}},Ay=(r,e)=>{F1(r.inputs,e);let n=r.getMaxComputeWorkgroupSizes(),t=r.getMaxComputeWorkgroupStoragesize();r.compute(M1(r.inputs,e,n,t))},Py=r=>de(r)});var V1,G1,U1,W1,H1,q1,K1,j1,Ey,Cy=C(()=>{"use strict";ue();ye();he();V1=r=>{if(!r||r.length<1)throw new Error("Too few inputs");if(r[0].dataType!==1&&r[0].dataType!==10)throw new Error("Input type must be float or float16.");if(r.length>=2){let e=r[0].dims.length*2===r[1].dims[0];if(r.length===4&&(e=r[3].dims[0]*2===r[1].dims[0]),!e)throw new Error("The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].")}},G1=(r,e,n)=>{let t="";for(let o=e-1;o>=0;--o)t+=` + }`};return{name:P?"BlockwiseMatMulNBits":"MatMulNBits",shaderCache:{hint:`${e.cacheKey};${a};${h};${r.length}`,inputDependencies:Array(r.length).fill("rank")},getRunData:()=>({outputs:[{dims:N,dataType:h}],name:P?"BlockwiseMatMulNBits":"MatMulNBits",dispatchGroup:P?{x:1,y:Math.ceil(l/E),z:c}:{x:Math.ceil(z/64)},programUniforms:q}),getShaderSource:$e}},Ay=(r,e)=>{V1(r.inputs,e);let n=r.getMaxComputeWorkgroupSizes(),t=r.getMaxComputeWorkgroupStoragesize();r.compute(G1(r.inputs,e,n,t))},Py=r=>de(r)});var U1,W1,H1,q1,j1,K1,X1,Z1,Ey,Cy=C(()=>{"use strict";ue();ye();he();U1=r=>{if(!r||r.length<1)throw new Error("Too few inputs");if(r[0].dataType!==1&&r[0].dataType!==10)throw new Error("Input type must be float or float16.");if(r.length>=2){let e=r[0].dims.length*2===r[1].dims[0];if(r.length===4&&(e=r[3].dims[0]*2===r[1].dims[0]),!e)throw new Error("The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].")}},W1=(r,e,n)=>{let t="";for(let o=e-1;o>=0;--o)t+=` k = i32(${r.indicesGet("indices",o)}) - ${Z("uniforms.pads",o,n)}; if (k < 0) { break; @@ -3678,7 +3678,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; ${t} value = x[offset]; } - `},U1=(r,e,n)=>{let t="";for(let o=e-1;o>=0;--o)t+=` + `},H1=(r,e,n)=>{let t="";for(let o=e-1;o>=0;--o)t+=` k = i32(${r.indicesGet("indices",o)}) - ${Z("uniforms.pads",o,n)}; if (k < 0) { k = -k; @@ -3696,7 +3696,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; var k = 0; ${t} value = x[offset]; - `},W1=(r,e,n)=>{let t="";for(let o=e-1;o>=0;--o)t+=` + `},q1=(r,e,n)=>{let t="";for(let o=e-1;o>=0;--o)t+=` k = i32(${r.indicesGet("indices",o)}) - ${Z("uniforms.pads",o,n)}; if (k < 0) { k = 0; @@ -3710,7 +3710,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; var k = 0; ${t} value = x[offset]; - `},H1=(r,e,n)=>{let t="";for(let o=e-1;o>=0;--o)t+=` + `},j1=(r,e,n)=>{let t="";for(let o=e-1;o>=0;--o)t+=` k = i32(${r.indicesGet("indices",o)}) - ${Z("uniforms.pads",o,n)}; if (k < 0) { k += i32(${Z("uniforms.x_shape",o,e)}]); @@ -3724,7 +3724,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; var k = 0; ${t} value = x[offset]; - `},q1=(r,e,n)=>{switch(n.mode){case 0:return G1(r,e,n.pads.length);case 1:return U1(r,e,n.pads.length);case 2:return W1(r,e,n.pads.length);case 3:return H1(r,e,n.pads.length);default:throw new Error("Invalid mode")}},K1=(r,e)=>{let n=B.padShape(r[0].dims.slice(),e.pads),t=r[0].dims,o=B.size(n),i=[{type:12,data:o},{type:6,data:e.pads}];e.mode===0&&i.push({type:r[0].dataType,data:e.value}),i.push(...W(r[0].dims,n));let s=["rank"],a=u=>{let l=G("output",r[0].dataType,n.length),f=D("x",r[0].dataType,t.length),c=f.type.value,p=q1(l,t.length,e),b=[{name:"output_size",type:"u32"},{name:"pads",type:"i32",length:e.pads.length}];return e.mode===0&&b.push({name:"constant_value",type:c}),` + `},K1=(r,e,n)=>{switch(n.mode){case 0:return W1(r,e,n.pads.length);case 1:return H1(r,e,n.pads.length);case 2:return q1(r,e,n.pads.length);case 3:return j1(r,e,n.pads.length);default:throw new Error("Invalid mode")}},X1=(r,e)=>{let n=B.padShape(r[0].dims.slice(),e.pads),t=r[0].dims,o=B.size(n),i=[{type:12,data:o},{type:6,data:e.pads}];e.mode===0&&i.push({type:r[0].dataType,data:e.value}),i.push(...W(r[0].dims,n));let s=["rank"],a=u=>{let l=G("output",r[0].dataType,n.length),f=D("x",r[0].dataType,t.length),c=f.type.value,p=K1(l,t.length,e),b=[{name:"output_size",type:"u32"},{name:"pads",type:"i32",length:e.pads.length}];return e.mode===0&&b.push({name:"constant_value",type:c}),` ${u.registerUniforms(b).declareVariables(f,l)} ${u.mainStart()} ${u.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} @@ -3734,7 +3734,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; var value = ${c}(0); ${p} output[global_idx] = value; - }`};return{name:"Pad",shaderCache:{hint:`${e.mode}`,inputDependencies:s},getRunData:()=>({outputs:[{dims:n,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(B.size(n)/64)},programUniforms:i}),getShaderSource:a}},j1=(r,e)=>{if(r.length>1){let n=r[1].getBigInt64Array(),t=r.length>=3&&r[2].data?r[2].getFloat32Array()[0]:0,o=r[0].dims.length,i=new Int32Array(2*o).fill(0);if(r.length>=4){let a=r[3].getBigInt64Array();for(let u=0;ui[Number(u)]=Number(a));let s=[];return i.forEach(a=>s.push(a)),{mode:e.mode,value:t,pads:s}}else return e},Ey=(r,e)=>{V1(r.inputs);let n=j1(r.inputs,e);r.compute(K1(r.inputs,n),{inputs:[0]})}});var qi,ky,Dy,By,Ly,X1,Z1,Ry,Ny,zy,Fy,My,Vy,Gy,Uy,Wy,Hy,qy,Ky,jy=C(()=>{"use strict";ft();ue();ye();he();qi=r=>{if(le.webgpu.validateInputContent&&(!r||r.length!==1))throw new Error("Pool ops requires 1 input.")},ky=(r,e,n)=>{let t=e.format==="NHWC",o=r.dims.slice();t&&o.splice(1,0,o.pop());let i=Object.hasOwnProperty.call(e,"dilations"),s=e.kernelShape.slice(),a=e.strides.slice(),u=i?e.dilations.slice():[],l=e.pads.slice();Xr.adjustPoolAttributes(n,o,s,a,u,l);let f=Xr.computePoolOutputShape(n,o,a,u,s,l,e.autoPad),c=Object.assign({},e);i?Object.assign(c,{kernelShape:s,strides:a,pads:l,dilations:u,cacheKey:e.cacheKey}):Object.assign(c,{kernelShape:s,strides:a,pads:l,cacheKey:e.cacheKey});let p=f.slice();return p.push(p.splice(1,1)[0]),[c,t?p:f]},Dy=(r,e)=>{let n=e.format==="NHWC",t=B.size(r),o=B.size(e.kernelShape),i=[{type:12,data:t},{type:12,data:o}],s=[{name:"outputSize",type:"u32"},{name:"kernelSize",type:"u32"}];if(e.kernelShape.length<=2){let a=e.kernelShape[e.kernelShape.length-1],u=e.strides[e.strides.length-1],l=e.pads[e.pads.length/2-1],f=e.pads[e.pads.length-1],c=!!(l+f);i.push({type:12,data:a},{type:12,data:u},{type:12,data:l},{type:12,data:f}),s.push({name:"kw",type:"u32"},{name:"sw",type:"u32"},{name:"pwStart",type:"u32"},{name:"pwEnd",type:"u32"});let p=!1;if(e.kernelShape.length===2){let b=e.kernelShape[e.kernelShape.length-2],h=e.strides[e.strides.length-2],g=e.pads[e.pads.length/2-2],T=e.pads[e.pads.length-2];p=!!(g+T),i.push({type:12,data:b},{type:12,data:h},{type:12,data:g},{type:12,data:T}),s.push({name:"kh",type:"u32"},{name:"sh",type:"u32"},{name:"phStart",type:"u32"},{name:"phEnd",type:"u32"})}return[i,s,!0,c,p]}else{if(n)throw new Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let a=B.computeStrides(e.kernelShape);i.push({type:12,data:a},{type:12,data:e.pads},{type:12,data:e.strides}),s.push({name:"kernelStrides",type:"u32",length:a.length},{name:"pads",type:"u32",length:e.pads.length},{name:"strides",type:"u32",length:e.strides.length});let u=e.pads.reduce((l,f)=>l+f);return[i,s,!!u,!1,!1]}},By=(r,e,n,t,o,i,s,a,u,l,f,c)=>{let p=o.format==="NHWC",b=e.type.value,h=G("output",e.type.tensor,t);if(o.kernelShape.length<=2){let g="",T="",w="",v=n-(p?2:1);if(f?g=` + }`};return{name:"Pad",shaderCache:{hint:`${e.mode}`,inputDependencies:s},getRunData:()=>({outputs:[{dims:n,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(B.size(n)/64)},programUniforms:i}),getShaderSource:a}},Z1=(r,e)=>{if(r.length>1){let n=r[1].getBigInt64Array(),t=r.length>=3&&r[2].data?r[2].getFloat32Array()[0]:0,o=r[0].dims.length,i=new Int32Array(2*o).fill(0);if(r.length>=4){let a=r[3].getBigInt64Array();for(let u=0;ui[Number(u)]=Number(a));let s=[];return i.forEach(a=>s.push(a)),{mode:e.mode,value:t,pads:s}}else return e},Ey=(r,e)=>{U1(r.inputs);let n=Z1(r.inputs,e);r.compute(X1(r.inputs,n),{inputs:[0]})}});var qi,ky,Dy,By,Ly,Y1,J1,Ry,Ny,zy,Fy,My,Vy,Gy,Uy,Wy,Hy,qy,jy,Ky=C(()=>{"use strict";ft();ue();ye();he();qi=r=>{if(le.webgpu.validateInputContent&&(!r||r.length!==1))throw new Error("Pool ops requires 1 input.")},ky=(r,e,n)=>{let t=e.format==="NHWC",o=r.dims.slice();t&&o.splice(1,0,o.pop());let i=Object.hasOwnProperty.call(e,"dilations"),s=e.kernelShape.slice(),a=e.strides.slice(),u=i?e.dilations.slice():[],l=e.pads.slice();Xr.adjustPoolAttributes(n,o,s,a,u,l);let f=Xr.computePoolOutputShape(n,o,a,u,s,l,e.autoPad),c=Object.assign({},e);i?Object.assign(c,{kernelShape:s,strides:a,pads:l,dilations:u,cacheKey:e.cacheKey}):Object.assign(c,{kernelShape:s,strides:a,pads:l,cacheKey:e.cacheKey});let p=f.slice();return p.push(p.splice(1,1)[0]),[c,t?p:f]},Dy=(r,e)=>{let n=e.format==="NHWC",t=B.size(r),o=B.size(e.kernelShape),i=[{type:12,data:t},{type:12,data:o}],s=[{name:"outputSize",type:"u32"},{name:"kernelSize",type:"u32"}];if(e.kernelShape.length<=2){let a=e.kernelShape[e.kernelShape.length-1],u=e.strides[e.strides.length-1],l=e.pads[e.pads.length/2-1],f=e.pads[e.pads.length-1],c=!!(l+f);i.push({type:12,data:a},{type:12,data:u},{type:12,data:l},{type:12,data:f}),s.push({name:"kw",type:"u32"},{name:"sw",type:"u32"},{name:"pwStart",type:"u32"},{name:"pwEnd",type:"u32"});let p=!1;if(e.kernelShape.length===2){let b=e.kernelShape[e.kernelShape.length-2],h=e.strides[e.strides.length-2],g=e.pads[e.pads.length/2-2],T=e.pads[e.pads.length-2];p=!!(g+T),i.push({type:12,data:b},{type:12,data:h},{type:12,data:g},{type:12,data:T}),s.push({name:"kh",type:"u32"},{name:"sh",type:"u32"},{name:"phStart",type:"u32"},{name:"phEnd",type:"u32"})}return[i,s,!0,c,p]}else{if(n)throw new Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let a=B.computeStrides(e.kernelShape);i.push({type:12,data:a},{type:12,data:e.pads},{type:12,data:e.strides}),s.push({name:"kernelStrides",type:"u32",length:a.length},{name:"pads",type:"u32",length:e.pads.length},{name:"strides",type:"u32",length:e.strides.length});let u=e.pads.reduce((l,f)=>l+f);return[i,s,!!u,!1,!1]}},By=(r,e,n,t,o,i,s,a,u,l,f,c)=>{let p=o.format==="NHWC",b=e.type.value,h=G("output",e.type.tensor,t);if(o.kernelShape.length<=2){let g="",T="",w="",v=n-(p?2:1);if(f?g=` for (var i: u32 = 0u; i < uniforms.kw; i++) { xIndices[${v}] = indices[${v}] * uniforms.sw - uniforms.pwStart + i; if (xIndices[${v}] < 0 || xIndices[${v}] @@ -3823,15 +3823,15 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; ${s} output[global_idx] = value; - }`}},Ly=r=>`${r.format};${r.ceilMode};${r.autoPad};${r.kernelShape.length}`,X1=r=>`${Ly(r)};${r.countIncludePad}`,Z1=r=>`${Ly(r)};${r.storageOrder};${r.dilations}`,Ry=r=>({format:r.format,autoPad:["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][r.auto_pad],ceilMode:r.ceil_mode,kernelShape:r.kernel_shape,strides:r.strides,pads:r.pads}),Ny=(r,e,n,t)=>{let[o,i]=ky(e,t,n),s=D("x",e.dataType,e.dims.length),a=s.type.value,u="value += x_val;",l="";o.countIncludePad?l+=`value /= ${a}(uniforms.kernelSize);`:l+=`value /= ${a}(i32(uniforms.kernelSize) - pad);`;let[f,c,p,b,h]=Dy(i,o);f.push(...W(e.dims,i));let g=["rank"];return{name:r,shaderCache:{hint:`${t.cacheKey};${p};${b};${h}`,inputDependencies:g},getRunData:()=>({outputs:[{dims:i,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(B.size(i)/64)},programUniforms:f}),getShaderSource:T=>By(T,s,e.dims.length,i.length,o,u,l,0,c,p,b,h)}},zy=r=>{let e=r.count_include_pad!==0,n=Ry(r);if(n.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for AveragePool");let t={countIncludePad:e,...n,cacheKey:""};return{...t,cacheKey:X1(t)}},Fy=(r,e)=>{qi(r.inputs),r.compute(Ny("AveragePool",r.inputs[0],!1,e))},My={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[]},Vy=r=>{let e=r.format;return{format:e,...My,cacheKey:e}},Gy=(r,e)=>{qi(r.inputs),r.compute(Ny("GlobalAveragePool",r.inputs[0],!0,e))},Uy=(r,e,n,t)=>{let[o,i]=ky(e,t,n),s=` + }`}},Ly=r=>`${r.format};${r.ceilMode};${r.autoPad};${r.kernelShape.length}`,Y1=r=>`${Ly(r)};${r.countIncludePad}`,J1=r=>`${Ly(r)};${r.storageOrder};${r.dilations}`,Ry=r=>({format:r.format,autoPad:["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][r.auto_pad],ceilMode:r.ceil_mode,kernelShape:r.kernel_shape,strides:r.strides,pads:r.pads}),Ny=(r,e,n,t)=>{let[o,i]=ky(e,t,n),s=D("x",e.dataType,e.dims.length),a=s.type.value,u="value += x_val;",l="";o.countIncludePad?l+=`value /= ${a}(uniforms.kernelSize);`:l+=`value /= ${a}(i32(uniforms.kernelSize) - pad);`;let[f,c,p,b,h]=Dy(i,o);f.push(...W(e.dims,i));let g=["rank"];return{name:r,shaderCache:{hint:`${t.cacheKey};${p};${b};${h}`,inputDependencies:g},getRunData:()=>({outputs:[{dims:i,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(B.size(i)/64)},programUniforms:f}),getShaderSource:T=>By(T,s,e.dims.length,i.length,o,u,l,0,c,p,b,h)}},zy=r=>{let e=r.count_include_pad!==0,n=Ry(r);if(n.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for AveragePool");let t={countIncludePad:e,...n,cacheKey:""};return{...t,cacheKey:Y1(t)}},Fy=(r,e)=>{qi(r.inputs),r.compute(Ny("AveragePool",r.inputs[0],!1,e))},My={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[]},Vy=r=>{let e=r.format;return{format:e,...My,cacheKey:e}},Gy=(r,e)=>{qi(r.inputs),r.compute(Ny("GlobalAveragePool",r.inputs[0],!0,e))},Uy=(r,e,n,t)=>{let[o,i]=ky(e,t,n),s=` value = max(x_val, value); - `,a="",u=D("x",e.dataType,e.dims.length),l=["rank"],[f,c,p,b,h]=Dy(i,o);return f.push(...W(e.dims,i)),{name:r,shaderCache:{hint:`${t.cacheKey};${p};${b};${h}`,inputDependencies:l},getRunData:()=>({outputs:[{dims:i,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(B.size(i)/64)},programUniforms:f}),getShaderSource:g=>By(g,u,e.dims.length,i.length,o,s,a,e.dataType===10?-65504:-1e5,c,p,b,h)}},Wy=(r,e)=>{qi(r.inputs),r.compute(Uy("MaxPool",r.inputs[0],!1,e))},Hy=r=>{let e=r.storage_order,n=r.dilations,t=Ry(r);if(e!==0)throw new Error("column major storage order is not yet supported for MaxPool");if(t.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for MaxPool");let o={storageOrder:e,dilations:n,...t,cacheKey:""};return{...o,cacheKey:Z1(o)}},qy=r=>{let e=r.format;return{format:e,...My,cacheKey:e}},Ky=(r,e)=>{qi(r.inputs),r.compute(Uy("GlobalMaxPool",r.inputs[0],!0,e))}});var J1,Q1,Xy,Zy=C(()=>{"use strict";ft();ue();he();J1=(r,e,n)=>{let t=r===e,o=re&&n>0;if(t||o||i)throw new Error("Range these inputs' contents are invalid.")},Q1=(r,e,n,t)=>{let o=Math.abs(Math.ceil((e-r)/n)),i=[o],s=o,a=[{type:12,data:s},{type:t,data:r},{type:t,data:n},...W(i)],u=l=>{let f=G("output",t,i.length),c=f.type.value,p=[{name:"outputSize",type:"u32"},{name:"start",type:c},{name:"delta",type:c}];return` + `,a="",u=D("x",e.dataType,e.dims.length),l=["rank"],[f,c,p,b,h]=Dy(i,o);return f.push(...W(e.dims,i)),{name:r,shaderCache:{hint:`${t.cacheKey};${p};${b};${h}`,inputDependencies:l},getRunData:()=>({outputs:[{dims:i,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(B.size(i)/64)},programUniforms:f}),getShaderSource:g=>By(g,u,e.dims.length,i.length,o,s,a,e.dataType===10?-65504:-1e5,c,p,b,h)}},Wy=(r,e)=>{qi(r.inputs),r.compute(Uy("MaxPool",r.inputs[0],!1,e))},Hy=r=>{let e=r.storage_order,n=r.dilations,t=Ry(r);if(e!==0)throw new Error("column major storage order is not yet supported for MaxPool");if(t.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for MaxPool");let o={storageOrder:e,dilations:n,...t,cacheKey:""};return{...o,cacheKey:J1(o)}},qy=r=>{let e=r.format;return{format:e,...My,cacheKey:e}},jy=(r,e)=>{qi(r.inputs),r.compute(Uy("GlobalMaxPool",r.inputs[0],!0,e))}});var eI,tI,Xy,Zy=C(()=>{"use strict";ft();ue();he();eI=(r,e,n)=>{let t=r===e,o=re&&n>0;if(t||o||i)throw new Error("Range these inputs' contents are invalid.")},tI=(r,e,n,t)=>{let o=Math.abs(Math.ceil((e-r)/n)),i=[o],s=o,a=[{type:12,data:s},{type:t,data:r},{type:t,data:n},...W(i)],u=l=>{let f=G("output",t,i.length),c=f.type.value,p=[{name:"outputSize",type:"u32"},{name:"start",type:c},{name:"delta",type:c}];return` ${l.registerUniforms(p).declareVariables(f)} ${l.mainStart()} ${l.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} output[global_idx] = uniforms.start + ${c}(global_idx) * uniforms.delta; - }`};return{name:"Range",shaderCache:{hint:`${t}`},getShaderSource:u,getRunData:()=>({outputs:[{dims:i,dataType:t}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:a})}},Xy=r=>{let e=0,n=0,t=0;r.inputs[0].dataType===6?(e=r.inputs[0].getInt32Array()[0],n=r.inputs[1].getInt32Array()[0],t=r.inputs[2].getInt32Array()[0]):r.inputs[0].dataType===1&&(e=r.inputs[0].getFloat32Array()[0],n=r.inputs[1].getFloat32Array()[0],t=r.inputs[2].getFloat32Array()[0]),le.webgpu.validateInputContent&&J1(e,n,t),r.compute(Q1(e,n,t,r.inputs[0].dataType),{inputs:[]})}});var eI,tI,rI,nI,oI,iI,aI,sI,uI,lI,cI,Yy,fI,dI,pI,mI,hI,Jy,Qy,ex=C(()=>{"use strict";ue();ye();et();he();eI=(r,e)=>{if(r.every(n=>n>0||(()=>{throw new Error("Resize requires scales input values to be positive")})),r.length>0){if(e.mode==="linear"){if(!(r.length===2||r.length===3||r.length===4&&r[0]===1&&r[1]===1||r.length===4&&r[0]===1&&r[3]===1||r.length===5&&r[0]===1&&r[1]===1))throw new Error(`For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and - one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`)}else if(e.mode==="cubic"&&!(r.length===2||r.length===4&&r[0]===1&&r[1]===1||r.length===4&&r[0]===1&&r[3]===1))throw new Error("Resize requires scales input size to be 2 or 4 for cubic mode")}},tI=(r,e,n)=>{e.every(o=>o>=0&&o{throw new Error("Resize requires axes input values to be positive and less than rank")}));let t=new Array(n).fill(1);return e.forEach((o,i)=>t[o]=r[i]),t},rI=(r,e,n,t,o,i)=>{let[s,a,u]=n>10?[1,2,3]:[-1,r.length>1?1:-1,-1],l=r[0].dims.length;if(s>0&&r.length>s&&r[s].dims.length>0)r[s].getFloat32Array().forEach(f=>i.push(f));else if(e.coordinateTransformMode==="tf_crop_and_resize")throw new Error("Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize");if(a>0&&r.length>a&&r[a].dims.length>0){if(r[a].getFloat32Array().forEach(f=>t.push(f)),t.length!==0&&t.length!==l&&n>=18&&t.length!==e.axes.length)throw new Error("Resize requires scales input size to be same as input rank or axes size for opset 18 and up");eI(t,e),e.axes.length>0&&tI(t,e.axes,l).forEach((f,c)=>t[c]=f)}if(u>0&&r.length>u&&(r[u].getBigInt64Array().forEach(f=>o.push(Number(f))),o.length!==l||n>=18&&o.length===e.axes.length))throw new Error("Resize requires sizes input size to be same as input rank or axes size for opset 18 and up");if(e.axes.length>0){if(t.length!==e.axes.length)throw new Error('Resize requires "scales" input size to be of axes rank when axes attributes is specified');if(o.length!==e.axes.length)throw new Error('Resize requires "sizes" input size to be of rank axes rank when axes attributes is specified')}if(typeof t<"u"&&typeof o<"u"&&t.length>0&&o.length>l)throw new Error("Resize requires only of scales or sizes to be specified")},nI=(r,e)=>`fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32, + }`};return{name:"Range",shaderCache:{hint:`${t}`},getShaderSource:u,getRunData:()=>({outputs:[{dims:i,dataType:t}],dispatchGroup:{x:Math.ceil(s/64)},programUniforms:a})}},Xy=r=>{let e=0,n=0,t=0;r.inputs[0].dataType===6?(e=r.inputs[0].getInt32Array()[0],n=r.inputs[1].getInt32Array()[0],t=r.inputs[2].getInt32Array()[0]):r.inputs[0].dataType===1&&(e=r.inputs[0].getFloat32Array()[0],n=r.inputs[1].getFloat32Array()[0],t=r.inputs[2].getFloat32Array()[0]),le.webgpu.validateInputContent&&eI(e,n,t),r.compute(tI(e,n,t,r.inputs[0].dataType),{inputs:[]})}});var rI,nI,oI,iI,aI,sI,uI,lI,cI,fI,dI,Yy,pI,mI,hI,gI,bI,Jy,Qy,ex=C(()=>{"use strict";ue();ye();et();he();rI=(r,e)=>{if(r.every(n=>n>0||(()=>{throw new Error("Resize requires scales input values to be positive")})),r.length>0){if(e.mode==="linear"){if(!(r.length===2||r.length===3||r.length===4&&r[0]===1&&r[1]===1||r.length===4&&r[0]===1&&r[3]===1||r.length===5&&r[0]===1&&r[1]===1))throw new Error(`For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and + one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`)}else if(e.mode==="cubic"&&!(r.length===2||r.length===4&&r[0]===1&&r[1]===1||r.length===4&&r[0]===1&&r[3]===1))throw new Error("Resize requires scales input size to be 2 or 4 for cubic mode")}},nI=(r,e,n)=>{e.every(o=>o>=0&&o{throw new Error("Resize requires axes input values to be positive and less than rank")}));let t=new Array(n).fill(1);return e.forEach((o,i)=>t[o]=r[i]),t},oI=(r,e,n,t,o,i)=>{let[s,a,u]=n>10?[1,2,3]:[-1,r.length>1?1:-1,-1],l=r[0].dims.length;if(s>0&&r.length>s&&r[s].dims.length>0)r[s].getFloat32Array().forEach(f=>i.push(f));else if(e.coordinateTransformMode==="tf_crop_and_resize")throw new Error("Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize");if(a>0&&r.length>a&&r[a].dims.length>0){if(r[a].getFloat32Array().forEach(f=>t.push(f)),t.length!==0&&t.length!==l&&n>=18&&t.length!==e.axes.length)throw new Error("Resize requires scales input size to be same as input rank or axes size for opset 18 and up");rI(t,e),e.axes.length>0&&nI(t,e.axes,l).forEach((f,c)=>t[c]=f)}if(u>0&&r.length>u&&(r[u].getBigInt64Array().forEach(f=>o.push(Number(f))),o.length!==l||n>=18&&o.length===e.axes.length))throw new Error("Resize requires sizes input size to be same as input rank or axes size for opset 18 and up");if(e.axes.length>0){if(t.length!==e.axes.length)throw new Error('Resize requires "scales" input size to be of axes rank when axes attributes is specified');if(o.length!==e.axes.length)throw new Error('Resize requires "sizes" input size to be of rank axes rank when axes attributes is specified')}if(typeof t<"u"&&typeof o<"u"&&t.length>0&&o.length>l)throw new Error("Resize requires only of scales or sizes to be specified")},iI=(r,e)=>`fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32, lengthOriginal: u32, roiStart: f32, roiEnd: f32) -> ${e} { `+(()=>{switch(r){case"asymmetric":return`return ${e}(xResized) / ${e}(xScale);`;case"pytorch_half_pixel":return`if (lengthResized > 1) { return (${e}(xResized) + 0.5) / ${e}(xScale) - 0.5; } else { @@ -3856,7 +3856,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; const adjustment = ${e}(lengthResized) / outputWidth; const center = ${e}(lengthOriginal) / 2; const offset = center * (1 - adjustment); - return offset + ((${e}(xResized) + 0.5) / ${e}(xScale)) - 0.5;`;case"half_pixel":return`return ((${e}(xResized) + 0.5) / ${e}(xScale)) - 0.5;`;default:throw new Error(`Coordinate transform mode ${r} is not supported`)}})()+"}",oI=(r,e,n)=>`fn getNearestPixelFromOriginal(xOriginal: ${n}, isDownSample: bool) -> ${n} {`+(()=>{switch(r){case"round_prefer_ceil":return"if (fract(xOriginal) == 0.5) { return ceil(xOriginal); } else { return round(xOriginal); }";case"floor":return"return floor(xOriginal);";case"ceil":return"return ceil(xOriginal);";case"round_prefer_floor":return"if (fract(xOriginal) == 0.5) { return floor(xOriginal); } else { return round(xOriginal); }";case"simple":default:if(e<11)return"if (isDownSample) { return ceil(xOriginal); } else { return xOriginal; }";throw new Error(`Nearest mode ${r} is not supported`)}})()+"}",iI=(r,e,n)=>{let t=new Array(n).fill(0).concat(new Array(n).fill(1)),o=r.length===0?t:r.slice();return e.length>0?(e.forEach((i,s)=>{t[i]=o[s],t[s+n]=o[e.length+s]}),t):o},aI=(r,e,n,t)=>{let o=[];if(n.length>0)if(t.length>0){if(r.forEach(i=>o.push(i)),Math.max(...t)>r.length)throw new Error("axes is out of bound");t.forEach((i,s)=>o[i]=n[s])}else n.forEach(i=>o.push(i));else{if(e.length===0)throw new Error("Resize requires either scales or sizes.");o=r.map((i,s)=>Math.round(i*e[s]))}return o},sI=(r,e,n)=>{let t=(()=>{switch(n.keepAspectRatioPolicy){case"not_larger":return n.axes.length>0?Math.min(...n.axes.map(i=>e[i]),Number.MAX_VALUE):Math.min(...e,Number.MAX_VALUE);case"not_smaller":return n.axes.length>0?Math.max(...n.axes.map(i=>e[i]),Number.MIN_VALUE):Math.max(...e,Number.MIN_VALUE);default:throw new Error(`Keep aspect ratio policy ${n.keepAspectRatioPolicy} is not supported`)}})();e.fill(1,0,e.length);let o=r.slice();return n.axes.length>0?(n.axes.forEach(i=>e[i]=t),n.axes.forEach(i=>o[i]=Math.round(r[i]*e[i]))):(e.fill(t,0,e.length),o.forEach((i,s)=>o[s]=Math.round(i*e[s]))),o},uI=(r,e,n,t,o)=>` + return offset + ((${e}(xResized) + 0.5) / ${e}(xScale)) - 0.5;`;case"half_pixel":return`return ((${e}(xResized) + 0.5) / ${e}(xScale)) - 0.5;`;default:throw new Error(`Coordinate transform mode ${r} is not supported`)}})()+"}",aI=(r,e,n)=>`fn getNearestPixelFromOriginal(xOriginal: ${n}, isDownSample: bool) -> ${n} {`+(()=>{switch(r){case"round_prefer_ceil":return"if (fract(xOriginal) == 0.5) { return ceil(xOriginal); } else { return round(xOriginal); }";case"floor":return"return floor(xOriginal);";case"ceil":return"return ceil(xOriginal);";case"round_prefer_floor":return"if (fract(xOriginal) == 0.5) { return floor(xOriginal); } else { return round(xOriginal); }";case"simple":default:if(e<11)return"if (isDownSample) { return ceil(xOriginal); } else { return xOriginal; }";throw new Error(`Nearest mode ${r} is not supported`)}})()+"}",sI=(r,e,n)=>{let t=new Array(n).fill(0).concat(new Array(n).fill(1)),o=r.length===0?t:r.slice();return e.length>0?(e.forEach((i,s)=>{t[i]=o[s],t[s+n]=o[e.length+s]}),t):o},uI=(r,e,n,t)=>{let o=[];if(n.length>0)if(t.length>0){if(r.forEach(i=>o.push(i)),Math.max(...t)>r.length)throw new Error("axes is out of bound");t.forEach((i,s)=>o[i]=n[s])}else n.forEach(i=>o.push(i));else{if(e.length===0)throw new Error("Resize requires either scales or sizes.");o=r.map((i,s)=>Math.round(i*e[s]))}return o},lI=(r,e,n)=>{let t=(()=>{switch(n.keepAspectRatioPolicy){case"not_larger":return n.axes.length>0?Math.min(...n.axes.map(i=>e[i]),Number.MAX_VALUE):Math.min(...e,Number.MAX_VALUE);case"not_smaller":return n.axes.length>0?Math.max(...n.axes.map(i=>e[i]),Number.MIN_VALUE):Math.max(...e,Number.MIN_VALUE);default:throw new Error(`Keep aspect ratio policy ${n.keepAspectRatioPolicy} is not supported`)}})();e.fill(1,0,e.length);let o=r.slice();return n.axes.length>0?(n.axes.forEach(i=>e[i]=t),n.axes.forEach(i=>o[i]=Math.round(r[i]*e[i]))):(e.fill(t,0,e.length),o.forEach((i,s)=>o[s]=Math.round(i*e[s]))),o},cI=(r,e,n,t,o)=>` fn calculateOriginalIndicesFromOutputIndices(output_indices: ${r.type.indices}) -> array<${r.type.value}, ${n.length}> { var original_indices: array<${r.type.value}, ${n.length}>; for (var i:u32 = 0; i < ${n.length}; i++) { @@ -3874,7 +3874,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; } } return original_indices; - }`,lI=(r,e,n,t,o,i,s)=>` + }`,fI=(r,e,n,t,o,i,s)=>` fn calculateInputIndicesFromOutputIndices(output_indices: ${e.type.indices}) -> ${r.type.indices} { var input_indices: ${r.type.indices}; for (var i:u32 = 0; i < ${t.length}; i++) { @@ -3905,7 +3905,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; ${r.indicesSet("input_indices","i"," input_index")} } return input_indices; - }`,cI=(r,e)=>` + }`,dI=(r,e)=>` fn checkInputIndices(input_indices: ${r.type.indices}) -> bool { for (var i:u32 = 0; i < ${e.length}; i++) { var input_index = ${r.indicesGet("input_indices","i")}; @@ -3917,7 +3917,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; }`,Yy=(r,e,n,t)=>r.rank>t?` ${r.indicesSet("input_indices",e,"channel")}; ${r.indicesSet("input_indices",n,"batch")}; -`:"",fI=(r,e,n,t,o)=>{let[s,a,u,l]=n.length===2?[-1,0,1,-1]:[0,2,3,1],f=r.type.value;return` +`:"",pI=(r,e,n,t,o)=>{let[s,a,u,l]=n.length===2?[-1,0,1,-1]:[0,2,3,1],f=r.type.value;return` fn getInputValue(batch: u32, channel: u32, row: u32, col: u32) -> ${f} { var input_indices: ${r.type.indices}; ${r.indicesSet("input_indices",a,`max(0, min(row, ${n[a]} - 1))`)}; @@ -3958,7 +3958,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; dy2 = 0.5; } return (x11 * dx2 * dy2 + x12 * dx2 * dy1 + x21 * dx1 * dy2 + x22 * dx1 * dy1); - }`},dI=(r,e,n,t,o,i,s,a,u,l)=>{let f=n.length===2,c=!0,[p,b]=f?[0,1]:c?[2,3]:[1,2],h=r.type.value,g=T=>{let w=T===p?"row":"col";return` + }`},mI=(r,e,n,t,o,i,s,a,u,l)=>{let f=n.length===2,c=!0,[p,b]=f?[0,1]:c?[2,3]:[1,2],h=r.type.value,g=T=>{let w=T===p?"row":"col";return` fn ${w}CubicInterpolation(input_indices: ${r.type.indices}, output_indices: ${e.type.indices}) -> ${h} { var output_index = ${e.indicesGet("output_indices",T)}; var originalIdx: ${h} = getOriginalCoordinateFromResizedCoordinate(output_index, ${o[T]}, @@ -4006,7 +4006,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; var input_indices: ${r.type.indices} = output_indices; return colCubicInterpolation(input_indices, output_indices); } - `},pI=(r,e,n,t,o)=>{let[s,a,u,l,f]=n.length===3?[-1,0,1,2,-1]:[0,2,3,4,1],c=r.type.value;return` + `},hI=(r,e,n,t,o)=>{let[s,a,u,l,f]=n.length===3?[-1,0,1,2,-1]:[0,2,3,4,1],c=r.type.value;return` fn getInputValue(batch: u32, channel: u32, depth:u32, height: u32, width: u32) -> ${c} { var input_indices: ${r.type.indices}; ${r.indicesSet("input_indices",a,`max(0, min(depth, ${n[a]} - 1))`)}; @@ -4065,18 +4065,18 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; } return (x111 * dx2 * dy2 * dz2 + x112 * dx2 * dy2 * dz1 + x121 * dx2 * dy1 *dz2 + x122 * dx2 * dy1 * dz1 + x211 * dx1 * dy2 * dz2 + x212 * dx1 * dy2 * dz1 + x221 * dx1 * dy1 *dz2 + x222 * dx1 * dy1 * dz1); - }`},mI=(r,e,n,t,o,i)=>{let s=r.dims,a=iI(i,e.axes,s.length),u=aI(s,t,o,e.axes),l=t.slice();t.length===0&&(l=s.map((v,S)=>v===0?1:u[S]/v),e.keepAspectRatioPolicy!=="stretch"&&(u=sI(s,l,e)));let f=G("output",r.dataType,u.length),c=D("input",r.dataType,s.length),p=B.size(u),b=s.length===u.length&&s.every((v,S)=>v===u[S]),h=e.coordinateTransformMode==="tf_crop_and_resize",g=e.extrapolationValue,T=c.type.value,w=v=>` + }`},gI=(r,e,n,t,o,i)=>{let s=r.dims,a=sI(i,e.axes,s.length),u=uI(s,t,o,e.axes),l=t.slice();t.length===0&&(l=s.map((v,S)=>v===0?1:u[S]/v),e.keepAspectRatioPolicy!=="stretch"&&(u=lI(s,l,e)));let f=G("output",r.dataType,u.length),c=D("input",r.dataType,s.length),p=B.size(u),b=s.length===u.length&&s.every((v,S)=>v===u[S]),h=e.coordinateTransformMode==="tf_crop_and_resize",g=e.extrapolationValue,T=c.type.value,w=v=>` ${b?"":` - ${nI(e.coordinateTransformMode,T)}; + ${iI(e.coordinateTransformMode,T)}; ${(()=>{switch(e.mode){case"nearest":return` - ${cI(c,s)}; - ${oI(e.nearestMode,n,T)}; - ${lI(c,f,s,u,l.length,a.length,h)}; + ${dI(c,s)}; + ${aI(e.nearestMode,n,T)}; + ${fI(c,f,s,u,l.length,a.length,h)}; `;case"linear":return` - ${uI(f,s,u,l.length,a.length)}; - ${(()=>{if(s.length===2||s.length===4)return`${fI(c,f,s,h,g)}`;if(s.length===3||s.length===5)return`${pI(c,f,s,h,g)}`;throw Error("Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.")})()}; + ${cI(f,s,u,l.length,a.length)}; + ${(()=>{if(s.length===2||s.length===4)return`${pI(c,f,s,h,g)}`;if(s.length===3||s.length===5)return`${hI(c,f,s,h,g)}`;throw Error("Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.")})()}; `;case"cubic":return` - ${(()=>{if(s.length===2||s.length===4)return`${dI(c,f,s,u,l,a,e.cubicCoeffA,h,e.extrapolationValue,e.excludeOutside)}`;throw Error("Cubic mode only supports input dims 2 and 4 are supported in linear mode.")})()}; + ${(()=>{if(s.length===2||s.length===4)return`${mI(c,f,s,u,l,a,e.cubicCoeffA,h,e.extrapolationValue,e.excludeOutside)}`;throw Error("Cubic mode only supports input dims 2 and 4 are supported in linear mode.")})()}; `;default:throw Error("Invalid resize mode")}})()}; `} ${v.registerUniform("output_size","u32").registerUniform("scales","f32",l.length).registerUniform("roi","f32",a.length).declareVariables(c,f)} @@ -4092,7 +4092,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; output[global_idx] = ${e.extrapolationValue}; }`;case"linear":return`output[global_idx] = ${s.length===2||s.length===4?"bilinearInterpolation":"trilinearInterpolation"}(output_indices);`;case"cubic":return"output[global_idx] = bicubicInterpolation(output_indices);";default:throw Error(`Unsupported resize mode: ${e.mode}`)}})()}; `} - }`;return{name:"Resize",shaderCache:{hint:`${e.cacheKey}|${n}|${l.length>0?l:""}|${o.length>0?o:""}|${a.length>0?a:""}|${b}|${s}`,inputDependencies:["rank"]},getShaderSource:w,getRunData:()=>({outputs:[{dims:u,dataType:r.dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:[{type:12,data:p},{type:1,data:l},{type:1,data:a},...W(s,u)]})}},hI=r=>{let e=r.customDataBuffer;return new Uint32Array(e,e.byteOffset,1)[0]},Jy=(r,e)=>{let n=[],t=[],o=[],i=hI(r);if(e.antialias!==0)throw Error("Only default value (0) for Antialias attribute is supported");rI(r.inputs,e,i,n,t,o),r.compute(mI(r.inputs[0],e,i,n,t,o),{inputs:[0]})},Qy=r=>{let e=r.antialias,n=r.axes,t=r.coordinateTransformMode,o=r.cubicCoeffA,i=r.excludeOutside!==0,s=r.extrapolationValue,a=r.keepAspectRatioPolicy,u=r.mode,l=r.nearestMode===""?"simple":r.nearestMode;return de({antialias:e,axes:n,coordinateTransformMode:t,cubicCoeffA:o,excludeOutside:i,extrapolationValue:s,keepAspectRatioPolicy:a,mode:u,nearestMode:l})}});var gI,bI,tx,rx=C(()=>{"use strict";ue();ye();et();he();gI=(r,e)=>{let[n,t,o,i]=r,{numHeads:s,rotaryEmbeddingDim:a}=e;if(n.dims.length!==3&&n.dims.length!==4)throw new Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${n.dims.length}`);if(!B.areEqual(t.dims,[])&&!B.areEqual(t.dims,[1])&&t.dims.length!==2)throw new Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${t.dims.length}`);if(o.dims.length!==2)throw new Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${o.dims.length}`);if(i.dims.length!==2)throw new Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${i.dims.length}`);if(!B.areEqual(o.dims,i.dims))throw new Error("Inputs 'cos_cache' and 'sin_cache' are expected to have the same shape");if(a>0&&s===0)throw new Error("num_heads must be provided if rotary_embedding_dim is specified");let u=n.dims[0],l=n.dims[n.dims.length-2],f=o.dims[0],c=B.sizeFromDimension(n.dims,1)/l,p=a===0?o.dims[1]*2:c/s;if(a>p)throw new Error("rotary_embedding_dim must be less than or equal to head_size");if(t.dims.length===2){if(u!==t.dims[0])throw new Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${t.dims[0]}`);if(l!==t.dims[1])throw new Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${t.dims[1]}`)}if(p/2!==o.dims[1]&&a/2!==o.dims[1])throw new Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${o.dims[1]}`);if(l>f)throw new Error("Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported")},bI=(r,e)=>{let{interleaved:n,numHeads:t,rotaryEmbeddingDim:o,scale:i}=e,s=r[0].dims[0],a=B.sizeFromDimension(r[0].dims,1),u=r[0].dims[r[0].dims.length-2],l=a/u,f=r[2].dims[1],c=o===0?f*2:l/t,p=new Array(s,u,l/c,c-f),b=B.computeStrides(p),h=[{type:1,data:i},{type:12,data:p},{type:12,data:b},...r[0].dims.length===3?new Array({type:12,data:[a,l,c,1]}):[],...r[0].dims.length===4?new Array({type:12,data:[a,c,u*c,1]}):[],...W(r[0].dims,r[1].dims,r[2].dims,r[3].dims,r[0].dims)],g=T=>{let w=D("input",r[0].dataType,r[0].dims.length),v=D("position_ids",r[1].dataType,r[1].dims.length),S=D("cos_cache",r[2].dataType,r[2].dims.length),$=D("sin_cache",r[3].dataType,r[3].dims.length),P=G("output",r[0].dataType,r[0].dims.length);return T.registerUniforms([{name:"scale",type:"f32"},{name:"global_shape",type:"u32",length:p.length},{name:"global_strides",type:"u32",length:b.length},{name:"input_output_strides",type:"u32",length:b.length}]),` + }`;return{name:"Resize",shaderCache:{hint:`${e.cacheKey}|${n}|${l.length>0?l:""}|${o.length>0?o:""}|${a.length>0?a:""}|${b}|${s}`,inputDependencies:["rank"]},getShaderSource:w,getRunData:()=>({outputs:[{dims:u,dataType:r.dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:[{type:12,data:p},{type:1,data:l},{type:1,data:a},...W(s,u)]})}},bI=r=>{let e=r.customDataBuffer;return new Uint32Array(e,e.byteOffset,1)[0]},Jy=(r,e)=>{let n=[],t=[],o=[],i=bI(r);if(e.antialias!==0)throw Error("Only default value (0) for Antialias attribute is supported");oI(r.inputs,e,i,n,t,o),r.compute(gI(r.inputs[0],e,i,n,t,o),{inputs:[0]})},Qy=r=>{let e=r.antialias,n=r.axes,t=r.coordinateTransformMode,o=r.cubicCoeffA,i=r.excludeOutside!==0,s=r.extrapolationValue,a=r.keepAspectRatioPolicy,u=r.mode,l=r.nearestMode===""?"simple":r.nearestMode;return de({antialias:e,axes:n,coordinateTransformMode:t,cubicCoeffA:o,excludeOutside:i,extrapolationValue:s,keepAspectRatioPolicy:a,mode:u,nearestMode:l})}});var yI,xI,tx,rx=C(()=>{"use strict";ue();ye();et();he();yI=(r,e)=>{let[n,t,o,i]=r,{numHeads:s,rotaryEmbeddingDim:a}=e;if(n.dims.length!==3&&n.dims.length!==4)throw new Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${n.dims.length}`);if(!B.areEqual(t.dims,[])&&!B.areEqual(t.dims,[1])&&t.dims.length!==2)throw new Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${t.dims.length}`);if(o.dims.length!==2)throw new Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${o.dims.length}`);if(i.dims.length!==2)throw new Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${i.dims.length}`);if(!B.areEqual(o.dims,i.dims))throw new Error("Inputs 'cos_cache' and 'sin_cache' are expected to have the same shape");if(a>0&&s===0)throw new Error("num_heads must be provided if rotary_embedding_dim is specified");let u=n.dims[0],l=n.dims[n.dims.length-2],f=o.dims[0],c=B.sizeFromDimension(n.dims,1)/l,p=a===0?o.dims[1]*2:c/s;if(a>p)throw new Error("rotary_embedding_dim must be less than or equal to head_size");if(t.dims.length===2){if(u!==t.dims[0])throw new Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${t.dims[0]}`);if(l!==t.dims[1])throw new Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${t.dims[1]}`)}if(p/2!==o.dims[1]&&a/2!==o.dims[1])throw new Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${o.dims[1]}`);if(l>f)throw new Error("Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported")},xI=(r,e)=>{let{interleaved:n,numHeads:t,rotaryEmbeddingDim:o,scale:i}=e,s=r[0].dims[0],a=B.sizeFromDimension(r[0].dims,1),u=r[0].dims[r[0].dims.length-2],l=a/u,f=r[2].dims[1],c=o===0?f*2:l/t,p=new Array(s,u,l/c,c-f),b=B.computeStrides(p),h=[{type:1,data:i},{type:12,data:p},{type:12,data:b},...r[0].dims.length===3?new Array({type:12,data:[a,l,c,1]}):[],...r[0].dims.length===4?new Array({type:12,data:[a,c,u*c,1]}):[],...W(r[0].dims,r[1].dims,r[2].dims,r[3].dims,r[0].dims)],g=T=>{let w=D("input",r[0].dataType,r[0].dims.length),v=D("position_ids",r[1].dataType,r[1].dims.length),S=D("cos_cache",r[2].dataType,r[2].dims.length),$=D("sin_cache",r[3].dataType,r[3].dims.length),P=G("output",r[0].dataType,r[0].dims.length);return T.registerUniforms([{name:"scale",type:"f32"},{name:"global_shape",type:"u32",length:p.length},{name:"global_strides",type:"u32",length:b.length},{name:"input_output_strides",type:"u32",length:b.length}]),` ${T.declareVariables(w,v,S,$,P)} ${T.mainStart(Zr)} @@ -4118,7 +4118,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; let k = dot(bsnh, uniforms.input_output_strides) + half_rotary_emb_dim; ${P.setByOffset("k",w.getByOffset("k"))} } - }`};return{name:"RotaryEmbedding",shaderCache:{hint:de({interleaved:n}).cacheKey,inputDependencies:["rank","rank","rank","rank"]},getShaderSource:g,getRunData:()=>({outputs:[{dims:r[0].dims,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(B.size(p)/Zr)},programUniforms:h})}},tx=(r,e)=>{gI(r.inputs,e),r.compute(bI(r.inputs,e))}});var yI,xI,nx,ox=C(()=>{"use strict";ue();ye();he();yI=r=>{if(!r||r.length<3)throw new Error("layerNorm requires at least 3 inputs.");let e=r[0],n=r[1],t=r[2];if(e.dataType!==n.dataType||e.dataType!==t.dataType)throw new Error("All inputs must have the same data type");if(e.dims.length!==3&&e.dims.length!==2)throw new Error("Input must be 2D or 3D");if(n.dims.length!==3&&n.dims.length!==2)throw new Error("Skip must be 2D or 3D");let o=e.dims[e.dims.length-1],i=e.dims[e.dims.length-2];if(n.dims[n.dims.length-1]!==o)throw new Error("Skip must have the same hidden size as input");if(n.dims[n.dims.length-2]!==i)throw new Error("Skip must have the same sequence length as input");if(t.dims.length!==1)throw new Error("Gamma must be 1D");if(t.dims[t.dims.length-1]!==o)throw new Error("Gamma must have the same hidden size as input");if(r.length>3){let s=r[3];if(s.dims.length!==1)throw new Error("Beta must be 1D");if(s.dims[s.dims.length-1]!==o)throw new Error("Beta must have the same hidden size as input")}if(r.length>4){let s=r[4];if(s.dims.length!==1)throw new Error("Bias must be 1D");if(s.dims[s.dims.length-1]!==o)throw new Error("Bias must have the same hidden size as input")}},xI=(r,e,n,t)=>{let o=e.simplified,i=r[0].dims,s=B.size(i),a=i,u=s,l=i.slice(-1)[0],f=t?i.slice(0,-1).concat(1):[],c=!o&&r.length>3,p=r.length>4,b=t&&n>1,h=t&&n>2,g=n>3,T=64,w=ze(l),v=[{type:12,data:u},{type:12,data:w},{type:12,data:l},{type:1,data:e.epsilon}],S=P=>{let E=[{name:"output_size",type:"u32"},{name:"components",type:"u32"},{name:"hidden_size",type:"u32"},{name:"epsilon",type:"f32"}],N=[D("x",r[0].dataType,r[0].dims,w),D("skip",r[1].dataType,r[1].dims,w),D("gamma",r[2].dataType,r[2].dims,w)];c&&N.push(D("beta",r[3].dataType,r[3].dims,w)),p&&N.push(D("bias",r[4].dataType,r[4].dims,w)),N.push(G("output",r[0].dataType,a,w)),b&&N.push(G("mean_output",1,f)),h&&N.push(G("inv_std_output",1,f)),g&&N.push(G("input_skip_bias_sum",r[0].dataType,a,w));let z=Be(r[0].dataType),q=Be(1,w);return` + }`};return{name:"RotaryEmbedding",shaderCache:{hint:de({interleaved:n}).cacheKey,inputDependencies:["rank","rank","rank","rank"]},getShaderSource:g,getRunData:()=>({outputs:[{dims:r[0].dims,dataType:r[0].dataType}],dispatchGroup:{x:Math.ceil(B.size(p)/Zr)},programUniforms:h})}},tx=(r,e)=>{yI(r.inputs,e),r.compute(xI(r.inputs,e))}});var vI,wI,nx,ox=C(()=>{"use strict";ue();ye();he();vI=r=>{if(!r||r.length<3)throw new Error("layerNorm requires at least 3 inputs.");let e=r[0],n=r[1],t=r[2];if(e.dataType!==n.dataType||e.dataType!==t.dataType)throw new Error("All inputs must have the same data type");if(e.dims.length!==3&&e.dims.length!==2)throw new Error("Input must be 2D or 3D");if(n.dims.length!==3&&n.dims.length!==2)throw new Error("Skip must be 2D or 3D");let o=e.dims[e.dims.length-1],i=e.dims[e.dims.length-2];if(n.dims[n.dims.length-1]!==o)throw new Error("Skip must have the same hidden size as input");if(n.dims[n.dims.length-2]!==i)throw new Error("Skip must have the same sequence length as input");if(t.dims.length!==1)throw new Error("Gamma must be 1D");if(t.dims[t.dims.length-1]!==o)throw new Error("Gamma must have the same hidden size as input");if(r.length>3){let s=r[3];if(s.dims.length!==1)throw new Error("Beta must be 1D");if(s.dims[s.dims.length-1]!==o)throw new Error("Beta must have the same hidden size as input")}if(r.length>4){let s=r[4];if(s.dims.length!==1)throw new Error("Bias must be 1D");if(s.dims[s.dims.length-1]!==o)throw new Error("Bias must have the same hidden size as input")}},wI=(r,e,n,t)=>{let o=e.simplified,i=r[0].dims,s=B.size(i),a=i,u=s,l=i.slice(-1)[0],f=t?i.slice(0,-1).concat(1):[],c=!o&&r.length>3,p=r.length>4,b=t&&n>1,h=t&&n>2,g=n>3,T=64,w=ze(l),v=[{type:12,data:u},{type:12,data:w},{type:12,data:l},{type:1,data:e.epsilon}],S=P=>{let E=[{name:"output_size",type:"u32"},{name:"components",type:"u32"},{name:"hidden_size",type:"u32"},{name:"epsilon",type:"f32"}],N=[D("x",r[0].dataType,r[0].dims,w),D("skip",r[1].dataType,r[1].dims,w),D("gamma",r[2].dataType,r[2].dims,w)];c&&N.push(D("beta",r[3].dataType,r[3].dims,w)),p&&N.push(D("bias",r[4].dataType,r[4].dims,w)),N.push(G("output",r[0].dataType,a,w)),b&&N.push(G("mean_output",1,f)),h&&N.push(G("inv_std_output",1,f)),g&&N.push(G("input_skip_bias_sum",r[0].dataType,a,w));let z=Be(r[0].dataType),q=Be(1,w);return` ${P.registerUniforms(E).declareVariables(...N)} var sum_shared : array<${q}, ${T}>; @@ -4170,7 +4170,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; ${z}(inv_std_dev) * gamma[offset1d + i] ${c?"+ beta[offset1d + i]":""}; } - }`},$=[{dims:a,dataType:r[0].dataType}];return n>1&&$.push({dims:f,dataType:1}),n>2&&$.push({dims:f,dataType:1}),n>3&&$.push({dims:i,dataType:r[0].dataType}),{name:"SkipLayerNormalization",shaderCache:{hint:`${w};${b};${h};${g}`,inputDependencies:r.map((P,E)=>"type")},getShaderSource:S,getRunData:()=>({outputs:$,dispatchGroup:{x:Math.ceil(u/l)},programUniforms:v})}},nx=(r,e)=>{yI(r.inputs);let t=[0];r.outputCount>1&&t.push(-3),r.outputCount>2&&t.push(-3),r.outputCount>3&&t.push(3),r.compute(xI(r.inputs,e,r.outputCount,!1),{outputs:t})}});var vI,Ki,wI,ix,TI,_I,ax,sx,ux=C(()=>{"use strict";ue();ye();et();he();vI=(r,e)=>{if(!r||r.length<1)throw new Error("too few inputs");if(e.axes.length!==0){if(e.axes.length!==e.starts.length||e.axes.length!==e.ends.length)throw new Error("axes, starts and ends must have the same length")}else if(e.starts.length!==e.ends.length)throw new Error("starts and ends must have the same length");r.slice(1).forEach((n,t)=>{if(r[t+1].dataType!==6&&r[t+1].dataType!==7)throw new Error(`Input ${t} must be an array of int32 or int64`)})},Ki=(r,e)=>{let n=[];if(r.length>e)if(r[e].dataType===7)r[e].getBigInt64Array().forEach(t=>n.push(Number(t)));else if(r[e].dataType===6)r[e].getInt32Array().forEach(t=>n.push(Number(t)));else throw new Error(`Input ${e} must be an array of int32 or int64`);return n},wI=(r,e)=>{if(r.length>1){let n=Ki(r,1),t=Ki(r,2),o=Ki(r,3);return o.length===0&&(o=[...Array(r[0].dims.length).keys()]),de({starts:n,ends:t,axes:o})}else return e},ix=(r,e,n,t,o)=>{let i=r;return r<0&&(i+=n[t[e]]),o[e]<0?Math.max(0,Math.min(i,n[t[e]]-1)):Math.max(0,Math.min(i,n[t[e]]))},TI=(r,e,n)=>`fn calculateInputIndices(output_indices: ${e.type.indices}) -> ${r.type.indices} { + }`},$=[{dims:a,dataType:r[0].dataType}];return n>1&&$.push({dims:f,dataType:1}),n>2&&$.push({dims:f,dataType:1}),n>3&&$.push({dims:i,dataType:r[0].dataType}),{name:"SkipLayerNormalization",shaderCache:{hint:`${w};${b};${h};${g}`,inputDependencies:r.map((P,E)=>"type")},getShaderSource:S,getRunData:()=>({outputs:$,dispatchGroup:{x:Math.ceil(u/l)},programUniforms:v})}},nx=(r,e)=>{vI(r.inputs);let t=[0];r.outputCount>1&&t.push(-3),r.outputCount>2&&t.push(-3),r.outputCount>3&&t.push(3),r.compute(wI(r.inputs,e,r.outputCount,!1),{outputs:t})}});var TI,ji,_I,ix,II,SI,ax,sx,ux=C(()=>{"use strict";ue();ye();et();he();TI=(r,e)=>{if(!r||r.length<1)throw new Error("too few inputs");if(e.axes.length!==0){if(e.axes.length!==e.starts.length||e.axes.length!==e.ends.length)throw new Error("axes, starts and ends must have the same length")}else if(e.starts.length!==e.ends.length)throw new Error("starts and ends must have the same length");r.slice(1).forEach((n,t)=>{if(r[t+1].dataType!==6&&r[t+1].dataType!==7)throw new Error(`Input ${t} must be an array of int32 or int64`)})},ji=(r,e)=>{let n=[];if(r.length>e)if(r[e].dataType===7)r[e].getBigInt64Array().forEach(t=>n.push(Number(t)));else if(r[e].dataType===6)r[e].getInt32Array().forEach(t=>n.push(Number(t)));else throw new Error(`Input ${e} must be an array of int32 or int64`);return n},_I=(r,e)=>{if(r.length>1){let n=ji(r,1),t=ji(r,2),o=ji(r,3);return o.length===0&&(o=[...Array(r[0].dims.length).keys()]),de({starts:n,ends:t,axes:o})}else return e},ix=(r,e,n,t,o)=>{let i=r;return r<0&&(i+=n[t[e]]),o[e]<0?Math.max(0,Math.min(i,n[t[e]]-1)):Math.max(0,Math.min(i,n[t[e]]))},II=(r,e,n)=>`fn calculateInputIndices(output_indices: ${e.type.indices}) -> ${r.type.indices} { var input_indices: ${r.type.indices}; var carry = 0u; for (var i = ${n.length}; i >= 0; i--) { @@ -4188,15 +4188,15 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; ${r.indicesSet("input_indices","i","input_index")}; } return input_indices; - }`,_I=(r,e)=>{let n=r[0].dims,t=B.size(n),o=e.axes.length>0?B.normalizeAxes(e.axes,n.length):[...Array(n.length).keys()],i=Ki(r,4);i.forEach(w=>w!==0||(()=>{throw new Error("step cannot be 0")})),i.length===0&&(i=Array(o.length).fill(1));let s=e.starts.map((w,v)=>ix(w,v,n,o,i)),a=e.ends.map((w,v)=>ix(w,v,n,o,i));if(o.length!==s.length||o.length!==a.length)throw new Error("start, ends and axes should have the same number of elements");if(o.length!==n.length)for(let w=0;wMath.sign(w));i.forEach((w,v,S)=>{if(w<0){let $=(a[v]-s[v])/w,P=s[v],E=P+$*i[v];s[v]=E,a[v]=P,S[v]=-w}});let l=n.slice(0);o.forEach((w,v)=>{l[w]=Math.ceil((a[w]-s[w])/i[w])});let f={dims:l,dataType:r[0].dataType},c=G("output",r[0].dataType,l.length),p=D("input",r[0].dataType,r[0].dims.length),b=B.size(l),h=[{name:"outputSize",type:"u32"},{name:"starts",type:"u32",length:s.length},{name:"signs",type:"i32",length:u.length},{name:"steps",type:"u32",length:i.length}],g=[{type:12,data:b},{type:12,data:s},{type:6,data:u},{type:12,data:i},...W(r[0].dims,l)],T=w=>` + }`,SI=(r,e)=>{let n=r[0].dims,t=B.size(n),o=e.axes.length>0?B.normalizeAxes(e.axes,n.length):[...Array(n.length).keys()],i=ji(r,4);i.forEach(w=>w!==0||(()=>{throw new Error("step cannot be 0")})),i.length===0&&(i=Array(o.length).fill(1));let s=e.starts.map((w,v)=>ix(w,v,n,o,i)),a=e.ends.map((w,v)=>ix(w,v,n,o,i));if(o.length!==s.length||o.length!==a.length)throw new Error("start, ends and axes should have the same number of elements");if(o.length!==n.length)for(let w=0;wMath.sign(w));i.forEach((w,v,S)=>{if(w<0){let $=(a[v]-s[v])/w,P=s[v],E=P+$*i[v];s[v]=E,a[v]=P,S[v]=-w}});let l=n.slice(0);o.forEach((w,v)=>{l[w]=Math.ceil((a[w]-s[w])/i[w])});let f={dims:l,dataType:r[0].dataType},c=G("output",r[0].dataType,l.length),p=D("input",r[0].dataType,r[0].dims.length),b=B.size(l),h=[{name:"outputSize",type:"u32"},{name:"starts",type:"u32",length:s.length},{name:"signs",type:"i32",length:u.length},{name:"steps",type:"u32",length:i.length}],g=[{type:12,data:b},{type:12,data:s},{type:6,data:u},{type:12,data:i},...W(r[0].dims,l)],T=w=>` ${w.registerUniforms(h).declareVariables(p,c)} - ${TI(p,c,n)} + ${II(p,c,n)} ${w.mainStart()} ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} let output_indices = ${c.offsetToIndices("global_idx")}; let input_indices = calculateInputIndices(output_indices); ${c.setByOffset("global_idx",p.getByIndices("input_indices"))} - }`;return{name:"Slice",shaderCache:{hint:`${u.length}_${s.length}_${i.length}`,inputDependencies:["rank"]},getShaderSource:T,getRunData:()=>({outputs:[f],dispatchGroup:{x:Math.ceil(t/64)},programUniforms:g})}},ax=(r,e)=>{vI(r.inputs,e);let n=wI(r.inputs,e);r.compute(_I(r.inputs,n),{inputs:[0]})},sx=r=>{let e=r.starts,n=r.ends,t=r.axes;return de({starts:e,ends:n,axes:t})}});var II,SI,lx,cx,fx=C(()=>{"use strict";ue();ye();et();he();II=r=>{if(!r||r.length!==1)throw new Error("Softmax op requires 1 input.")},SI=(r,e)=>{let n=r.dims,t=B.size(n),o=64,i=e.axis;if(i<0&&(i=n.length+i),iw===4?`max(max(${T}.x, ${T}.y), max(${T}.z, ${T}.w))`:w===2?`max(${T}.x, ${T}.y)`:w===3?`max(max(${T}.x, ${T}.y), ${T}.z)`:T,c=D("x",r.dataType,r.dims,u),p=G("result",r.dataType,r.dims,u),b=c.type.value,h=Be(r.dataType)==="f32"?`var threadMax = ${b}(-3.402823e+38f);`:`var threadMax = ${b}(-65504.0h);`,g=T=>` + }`;return{name:"Slice",shaderCache:{hint:`${u.length}_${s.length}_${i.length}`,inputDependencies:["rank"]},getShaderSource:T,getRunData:()=>({outputs:[f],dispatchGroup:{x:Math.ceil(t/64)},programUniforms:g})}},ax=(r,e)=>{TI(r.inputs,e);let n=_I(r.inputs,e);r.compute(SI(r.inputs,n),{inputs:[0]})},sx=r=>{let e=r.starts,n=r.ends,t=r.axes;return de({starts:e,ends:n,axes:t})}});var $I,AI,lx,cx,fx=C(()=>{"use strict";ue();ye();et();he();$I=r=>{if(!r||r.length!==1)throw new Error("Softmax op requires 1 input.")},AI=(r,e)=>{let n=r.dims,t=B.size(n),o=64,i=e.axis;if(i<0&&(i=n.length+i),iw===4?`max(max(${T}.x, ${T}.y), max(${T}.z, ${T}.w))`:w===2?`max(${T}.x, ${T}.y)`:w===3?`max(max(${T}.x, ${T}.y), ${T}.z)`:T,c=D("x",r.dataType,r.dims,u),p=G("result",r.dataType,r.dims,u),b=c.type.value,h=Be(r.dataType)==="f32"?`var threadMax = ${b}(-3.402823e+38f);`:`var threadMax = ${b}(-65504.0h);`,g=T=>` var rowMaxShared : ${b}; var rowSumShared : ${b}; var threadShared : array<${b}, ${o}>; @@ -4268,7 +4268,7 @@ ${ut}_indices[${Te}] = 0;`}),ie+=`${ut}_indices[${ce-2}] = 0u; let value = exp(getValue(row, col, row_stride) - rowMaxShared) / rowSumShared; setValue(row, col, row_stride, value); } - }`;return{name:"Softmax",shaderCache:{hint:`${u}`,inputDependencies:["type"]},getRunData:()=>({outputs:[{dims:n,dataType:r.dataType}],dispatchGroup:{x:a},programUniforms:[{type:6,data:l}]}),getShaderSource:g}},lx=(r,e)=>{II(r.inputs),r.compute(SI(r.inputs[0],e))},cx=r=>de({axis:r.axis})});var $I,AI,PI,OI,EI,dx,px,mx=C(()=>{"use strict";ue();ye();et();he();$I=r=>{if(!r||r.length<1)throw new Error("too few inputs")},AI=(r,e)=>{let n=[],t=e.numOutputs;return r[1].dims[0]>0&&(r[1].getBigInt64Array().forEach(o=>n.push(Number(o))),t=n.length),de({numOutputs:t,axis:e.axis,splitSizes:n})},PI=r=>` + }`;return{name:"Softmax",shaderCache:{hint:`${u}`,inputDependencies:["type"]},getRunData:()=>({outputs:[{dims:n,dataType:r.dataType}],dispatchGroup:{x:a},programUniforms:[{type:6,data:l}]}),getShaderSource:g}},lx=(r,e)=>{$I(r.inputs),r.compute(AI(r.inputs[0],e))},cx=r=>de({axis:r.axis})});var PI,OI,EI,CI,kI,dx,px,mx=C(()=>{"use strict";ue();ye();et();he();PI=r=>{if(!r||r.length<1)throw new Error("too few inputs")},OI=(r,e)=>{let n=[],t=e.numOutputs;return r[1].dims[0]>0&&(r[1].getBigInt64Array().forEach(o=>n.push(Number(o))),t=n.length),de({numOutputs:t,axis:e.axis,splitSizes:n})},EI=r=>` fn calculateOutputIndex(index: u32) -> u32 { for (var i: u32 = 0u; i < ${r}u; i += 1u ) { if (index < ${Z("uniforms.size_in_split_axis","i",r)}) { @@ -4276,14 +4276,14 @@ fn calculateOutputIndex(index: u32) -> u32 { } } return ${r}u; -}`,OI=r=>{let e=r.length,n=[];for(let t=0;t{let e=r.length,n=[];for(let t=0;t{let n=r[0].dims,t=B.size(n),o=r[0].dataType,i=B.normalizeAxis(e.axis,n.length),s=new Array(e.numOutputs),a=D("input",o,n.length),u=new Array(e.numOutputs),l=[],f=[],c=0,p=[{type:12,data:t}];for(let h=0;h` + }`},kI=(r,e)=>{let n=r[0].dims,t=B.size(n),o=r[0].dataType,i=B.normalizeAxis(e.axis,n.length),s=new Array(e.numOutputs),a=D("input",o,n.length),u=new Array(e.numOutputs),l=[],f=[],c=0,p=[{type:12,data:t}];for(let h=0;h` ${h.registerUniform("input_size","u32").registerUniform("size_in_split_axis","u32",u.length).declareVariables(a,...s)} - ${PI(u.length)} - ${OI(s)} + ${EI(u.length)} + ${CI(s)} ${h.mainStart()} ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.input_size")} @@ -4296,7 +4296,7 @@ fn calculateOutputIndex(index: u32) -> u32 { ${a.indicesSet("indices",i,"index")}; } writeBufferData(output_number, indices, global_idx); - }`;return{name:"Split",shaderCache:{hint:e.cacheKey,inputDependencies:["rank"]},getShaderSource:b,getRunData:()=>({outputs:l,dispatchGroup:{x:Math.ceil(t/64)},programUniforms:p})}},dx=(r,e)=>{$I(r.inputs);let n=r.inputs.length===1?e:AI(r.inputs,e);r.compute(EI(r.inputs,n),{inputs:[0]})},px=r=>{let e=r.axis,n=r.splitSizes,t=r.numOutputs<0?n.length:r.numOutputs;if(t!==n.length)throw new Error("numOutputs and splitSizes lengh must be equal");return de({axis:e,numOutputs:t,splitSizes:n})}});var CI,kI,hx,gx=C(()=>{"use strict";ue();ye();he();CI=(r,e,n,t,o)=>{let i=G("output_data",o,n.length,4),s=D("a_data",e[1].dataType,e[1].dims.length,4),a=D("b_data",e[2].dataType,e[2].dims.length,4),u=D("c_data",e[0].dataType,e[0].dims.length,4),l,f=(c,p,b)=>`select(${p}, ${c}, ${b})`;if(!t)l=i.setByOffset("global_idx",f(s.getByOffset("global_idx"),a.getByOffset("global_idx"),u.getByOffset("global_idx")));else{let c=(p,b,h="")=>{let g=`a_data[index_a${b}][component_a${b}]`,T=`b_data[index_b${b}][component_b${b}]`,w=`bool(c_data[index_c${b}] & (0xffu << (component_c${b} * 8)))`;return` + }`;return{name:"Split",shaderCache:{hint:e.cacheKey,inputDependencies:["rank"]},getShaderSource:b,getRunData:()=>({outputs:l,dispatchGroup:{x:Math.ceil(t/64)},programUniforms:p})}},dx=(r,e)=>{PI(r.inputs);let n=r.inputs.length===1?e:OI(r.inputs,e);r.compute(kI(r.inputs,n),{inputs:[0]})},px=r=>{let e=r.axis,n=r.splitSizes,t=r.numOutputs<0?n.length:r.numOutputs;if(t!==n.length)throw new Error("numOutputs and splitSizes lengh must be equal");return de({axis:e,numOutputs:t,splitSizes:n})}});var DI,BI,hx,gx=C(()=>{"use strict";ue();ye();he();DI=(r,e,n,t,o)=>{let i=G("output_data",o,n.length,4),s=D("a_data",e[1].dataType,e[1].dims.length,4),a=D("b_data",e[2].dataType,e[2].dims.length,4),u=D("c_data",e[0].dataType,e[0].dims.length,4),l,f=(c,p,b)=>`select(${p}, ${c}, ${b})`;if(!t)l=i.setByOffset("global_idx",f(s.getByOffset("global_idx"),a.getByOffset("global_idx"),u.getByOffset("global_idx")));else{let c=(p,b,h="")=>{let g=`a_data[index_a${b}][component_a${b}]`,T=`b_data[index_b${b}][component_b${b}]`,w=`bool(c_data[index_c${b}] & (0xffu << (component_c${b} * 8)))`;return` let output_indices${b} = ${i.offsetToIndices(`global_idx * 4u + ${b}u`)}; let offset_a${b} = ${s.broadcastedIndicesToOffset(`output_indices${b}`,i)}; let offset_b${b} = ${a.broadcastedIndicesToOffset(`output_indices${b}`,i)}; @@ -4324,10 +4324,10 @@ fn calculateOutputIndex(index: u32) -> u32 { ${r.mainStart()} ${r.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} ${l} - }`},kI=r=>{let e=r[1].dims,n=r[2].dims,t=r[0].dims,o=r[1].dataType,i=!(B.areEqual(e,n)&&B.areEqual(n,t)),s=e,a=B.size(e);if(i){let l=nr.calcShape(nr.calcShape(e,n,!1),t,!1);if(!l)throw new Error("Can't perform where op on the given tensors");s=l,a=B.size(s)}let u=Math.ceil(a/4);return{name:"Where",shaderCache:{inputDependencies:["rank","rank","rank"]},getShaderSource:l=>CI(l,r,s,i,o),getRunData:()=>({outputs:[{dims:s,dataType:o}],dispatchGroup:{x:Math.ceil(a/64/4)},programUniforms:[{type:12,data:u},...W(t,e,n,s)]})}},hx=r=>{r.compute(kI(r.inputs))}});var bx,yx=C(()=>{"use strict";xg();Li();Tg();Ig();lb();vb();_b();eu();Vb();Wb();Kb();Jb();ty();ny();ay();ly();dy();Ty();Iy();$y();ru();Oy();fu();Cy();jy();Zy();Di();ex();rx();ox();ux();fx();mx();pu();Jr();Ni();gx();bx=new Map([["Abs",[Sg]],["Acos",[$g]],["Acosh",[Ag]],["Add",[cb]],["ArgMax",[yg,Xs]],["ArgMin",[bg,Xs]],["Asin",[Pg]],["Asinh",[Og]],["Atan",[Eg]],["Atanh",[Cg]],["Attention",[vg]],["AveragePool",[Fy,zy]],["BatchNormalization",[wg]],["BiasAdd",[_g]],["BiasSplitGelu",[ub]],["Cast",[Dg,kg]],["Ceil",[Lg]],["Clip",[Bg]],["Concat",[wb,Tb]],["Conv",[au,iu]],["ConvTranspose",[Mb,Fb]],["Cos",[Rg]],["Cosh",[Ng]],["CumSum",[Gb,Ub]],["DepthToSpace",[Hb,qb]],["Div",[fb]],["Einsum",[Zb,Yb]],["Elu",[zg,Zn]],["Equal",[db]],["Erf",[Fg]],["Exp",[Mg]],["Expand",[ey]],["FastGelu",[ry]],["Floor",[Vg]],["FusedConv",[au,iu]],["Gather",[iy,oy]],["GatherElements",[uy,sy]],["Gelu",[Gg]],["Gemm",[fy,cy]],["GlobalAveragePool",[Gy,Vy]],["GlobalMaxPool",[Ky,qy]],["Greater",[gb]],["GreaterOrEqual",[yb]],["GroupQueryAttention",[wy,vy]],["HardSigmoid",[Zg,Xg]],["InstanceNormalization",[_y]],["LayerNormalization",[Sy]],["LeakyRelu",[Ug,Zn]],["Less",[bb]],["LessOrEqual",[xb]],["Log",[ib]],["MatMul",[Bb]],["MatMulNBits",[Ay,Py]],["MaxPool",[Wy,Hy]],["Mul",[pb]],["MultiHeadAttention",[hy,my]],["Neg",[Hg]],["Not",[Wg]],["Pad",[Ey]],["Pow",[mb]],["QuickGelu",[ab,Zn]],["Range",[Xy]],["Reciprocal",[qg]],["ReduceMin",[fg]],["ReduceMean",[ag]],["ReduceMax",[cg]],["ReduceSum",[pg]],["ReduceProd",[dg]],["ReduceL1",[sg]],["ReduceL2",[ug]],["ReduceLogSum",[hg]],["ReduceLogSumExp",[lg]],["ReduceSumSquare",[mg]],["Relu",[Kg]],["Resize",[Jy,Qy]],["RotaryEmbedding",[tx]],["Sigmoid",[jg]],["Sin",[Yg]],["Sinh",[Jg]],["Slice",[ax,sx]],["SkipLayerNormalization",[nx]],["Split",[dx,px]],["Sqrt",[Qg]],["Softmax",[lx,cx]],["Sub",[hb]],["Tan",[eb]],["Tanh",[rb]],["ThresholdedRelu",[ob,Zn]],["Tile",[by]],["Transpose",[Kh,jh]],["Where",[hx]]])});var ji,xx=C(()=>{"use strict";ft();mr();he();ji=class{constructor(e){this.backend=e;this.repo=new Map,this.attributesBound=!1}getArtifact(e){return this.repo.get(e)}setArtifact(e,n){this.repo.set(e,n)}run(e,n,t,o,i){St(e.programInfo.name);let s=this.backend.device,a=this.backend.getComputePassEncoder();this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2);let u=[];for(let f of n)u.push({binding:u.length,resource:{buffer:f.buffer}});for(let f of t)u.push({binding:u.length,resource:{buffer:f.buffer}});i&&u.push({binding:u.length,resource:i});let l=s.createBindGroup({layout:e.computePipeline.getBindGroupLayout(0),entries:u,label:e.programInfo.name});if(this.backend.sessionStatus==="capturing"){let f={kernelId:this.backend.currentKernelId,computePipeline:e.computePipeline,bindGroup:l,dispatchGroup:o};this.backend.capturedCommandList.get(this.backend.currentSessionId).push(f)}a.setPipeline(e.computePipeline),a.setBindGroup(0,l),a.dispatchWorkgroups(...o),this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2+1),this.backend.pendingDispatchNumber++,(this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber||this.backend.queryType==="at-passes")&&this.backend.endComputePass(),this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber&&this.backend.flush(),yt(e.programInfo.name)}dispose(){}build(e,n){St(e.name);let t=this.backend.device,o=[];t.features.has("shader-f16")&&o.push("enable f16;");let i=Hh(n,this.backend.device.limits),s=e.getShaderSource(i),a=`${o.join(` + }`},BI=r=>{let e=r[1].dims,n=r[2].dims,t=r[0].dims,o=r[1].dataType,i=!(B.areEqual(e,n)&&B.areEqual(n,t)),s=e,a=B.size(e);if(i){let l=nr.calcShape(nr.calcShape(e,n,!1),t,!1);if(!l)throw new Error("Can't perform where op on the given tensors");s=l,a=B.size(s)}let u=Math.ceil(a/4);return{name:"Where",shaderCache:{inputDependencies:["rank","rank","rank"]},getShaderSource:l=>DI(l,r,s,i,o),getRunData:()=>({outputs:[{dims:s,dataType:o}],dispatchGroup:{x:Math.ceil(a/64/4)},programUniforms:[{type:12,data:u},...W(t,e,n,s)]})}},hx=r=>{r.compute(BI(r.inputs))}});var bx,yx=C(()=>{"use strict";xg();Li();Tg();Ig();lb();vb();_b();tu();Vb();Wb();jb();Jb();ty();ny();ay();ly();dy();Ty();Iy();$y();nu();Oy();du();Cy();Ky();Zy();Di();ex();rx();ox();ux();fx();mx();mu();Jr();Ni();gx();bx=new Map([["Abs",[Sg]],["Acos",[$g]],["Acosh",[Ag]],["Add",[cb]],["ArgMax",[yg,Zs]],["ArgMin",[bg,Zs]],["Asin",[Pg]],["Asinh",[Og]],["Atan",[Eg]],["Atanh",[Cg]],["Attention",[vg]],["AveragePool",[Fy,zy]],["BatchNormalization",[wg]],["BiasAdd",[_g]],["BiasSplitGelu",[ub]],["Cast",[Dg,kg]],["Ceil",[Lg]],["Clip",[Bg]],["Concat",[wb,Tb]],["Conv",[su,au]],["ConvTranspose",[Mb,Fb]],["Cos",[Rg]],["Cosh",[Ng]],["CumSum",[Gb,Ub]],["DepthToSpace",[Hb,qb]],["Div",[fb]],["Einsum",[Zb,Yb]],["Elu",[zg,Zn]],["Equal",[db]],["Erf",[Fg]],["Exp",[Mg]],["Expand",[ey]],["FastGelu",[ry]],["Floor",[Vg]],["FusedConv",[su,au]],["Gather",[iy,oy]],["GatherElements",[uy,sy]],["Gelu",[Gg]],["Gemm",[fy,cy]],["GlobalAveragePool",[Gy,Vy]],["GlobalMaxPool",[jy,qy]],["Greater",[gb]],["GreaterOrEqual",[yb]],["GroupQueryAttention",[wy,vy]],["HardSigmoid",[Zg,Xg]],["InstanceNormalization",[_y]],["LayerNormalization",[Sy]],["LeakyRelu",[Ug,Zn]],["Less",[bb]],["LessOrEqual",[xb]],["Log",[ib]],["MatMul",[Bb]],["MatMulNBits",[Ay,Py]],["MaxPool",[Wy,Hy]],["Mul",[pb]],["MultiHeadAttention",[hy,my]],["Neg",[Hg]],["Not",[Wg]],["Pad",[Ey]],["Pow",[mb]],["QuickGelu",[ab,Zn]],["Range",[Xy]],["Reciprocal",[qg]],["ReduceMin",[fg]],["ReduceMean",[ag]],["ReduceMax",[cg]],["ReduceSum",[pg]],["ReduceProd",[dg]],["ReduceL1",[sg]],["ReduceL2",[ug]],["ReduceLogSum",[hg]],["ReduceLogSumExp",[lg]],["ReduceSumSquare",[mg]],["Relu",[jg]],["Resize",[Jy,Qy]],["RotaryEmbedding",[tx]],["Sigmoid",[Kg]],["Sin",[Yg]],["Sinh",[Jg]],["Slice",[ax,sx]],["SkipLayerNormalization",[nx]],["Split",[dx,px]],["Sqrt",[Qg]],["Softmax",[lx,cx]],["Sub",[hb]],["Tan",[eb]],["Tanh",[rb]],["ThresholdedRelu",[ob,Zn]],["Tile",[by]],["Transpose",[jh,Kh]],["Where",[hx]]])});var Ki,xx=C(()=>{"use strict";ft();mr();he();Ki=class{constructor(e){this.backend=e;this.repo=new Map,this.attributesBound=!1}getArtifact(e){return this.repo.get(e)}setArtifact(e,n){this.repo.set(e,n)}run(e,n,t,o,i){St(e.programInfo.name);let s=this.backend.device,a=this.backend.getComputePassEncoder();this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2);let u=[];for(let f of n)u.push({binding:u.length,resource:{buffer:f.buffer}});for(let f of t)u.push({binding:u.length,resource:{buffer:f.buffer}});i&&u.push({binding:u.length,resource:i});let l=s.createBindGroup({layout:e.computePipeline.getBindGroupLayout(0),entries:u,label:e.programInfo.name});if(this.backend.sessionStatus==="capturing"){let f={kernelId:this.backend.currentKernelId,computePipeline:e.computePipeline,bindGroup:l,dispatchGroup:o};this.backend.capturedCommandList.get(this.backend.currentSessionId).push(f)}a.setPipeline(e.computePipeline),a.setBindGroup(0,l),a.dispatchWorkgroups(...o),this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2+1),this.backend.pendingDispatchNumber++,(this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber||this.backend.queryType==="at-passes")&&this.backend.endComputePass(),this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber&&this.backend.flush(),yt(e.programInfo.name)}dispose(){}build(e,n){St(e.name);let t=this.backend.device,o=[];t.features.has("shader-f16")&&o.push("enable f16;");let i=Hh(n,this.backend.device.limits),s=e.getShaderSource(i),a=`${o.join(` `)} ${i.additionalImplementations} -${s}`,u=t.createShaderModule({code:a,label:e.name});Ne("verbose",()=>`[WebGPU] ${e.name} shader code: ${a}`);let l=t.createComputePipeline({compute:{module:u,entryPoint:"main"},layout:"auto",label:e.name});return yt(e.name),{programInfo:e,computePipeline:l,uniformVariablesInfo:i.variablesInfo}}normalizeDispatchGroupSize(e){let n=typeof e=="number"?e:e.x,t=typeof e=="number"?1:e.y||1,o=typeof e=="number"?1:e.z||1,i=this.backend.device.limits.maxComputeWorkgroupsPerDimension;if(n<=i&&t<=i&&o<=i)return[n,t,o];let s=n*t*o,a=Math.ceil(Math.sqrt(s));if(a>i){if(a=Math.ceil(Math.cbrt(s)),a>i)throw new Error("Total dispatch size exceeds WebGPU maximum.");return[a,a,a]}else return[a,a,1]}}});var DI,BI,mu,Xi,vx=C(()=>{"use strict";ft();ue();mr();Fh();Wh();yx();xx();DI=(r,e)=>{if(e.length!==r.length)throw new Error(`inputDependencies length ${e.length} is not equal to inputTensors length ${r.length}.`);let n=[];for(let t=0;t{let t=r.name;return r.shaderCache?.hint&&(t+="["+r.shaderCache.hint+"]"),t+=":"+n+`:${DI(e,r.shaderCache?.inputDependencies??new Array(e.length).fill("dims"))}`,t},mu=class{constructor(e){e&&(this.architecture=e.architecture,this.vendor=e.vendor)}isArchitecture(e){return this.architecture===e}isVendor(e){return this.vendor===e}},Xi=class{constructor(){this.currentSessionId=null;this.currentKernelId=null;this.commandEncoder=null;this.computePassEncoder=null;this.maxDispatchNumber=16;this.pendingDispatchNumber=0;this.pendingKernels=[];this.pendingQueries=new Map;this.sessionStatus="default";this.capturedCommandList=new Map;this.capturedPendingKernels=new Map;this.sessionExternalDataMapping=new Map}get currentKernelCustomData(){if(this.currentKernelId===null)throw new Error("currentKernelCustomData(): currentKernelId is null. (should not happen)");let e=this.kernelCustomData.get(this.currentKernelId);return e||(e={},this.kernelCustomData.set(this.currentKernelId,e)),e}async initialize(e,n){this.env=e;let t=[],o={requiredLimits:{maxComputeWorkgroupStorageSize:n.limits.maxComputeWorkgroupStorageSize,maxComputeWorkgroupsPerDimension:n.limits.maxComputeWorkgroupsPerDimension,maxStorageBufferBindingSize:n.limits.maxStorageBufferBindingSize,maxBufferSize:n.limits.maxBufferSize,maxComputeInvocationsPerWorkgroup:n.limits.maxComputeInvocationsPerWorkgroup,maxComputeWorkgroupSizeX:n.limits.maxComputeWorkgroupSizeX,maxComputeWorkgroupSizeY:n.limits.maxComputeWorkgroupSizeY,maxComputeWorkgroupSizeZ:n.limits.maxComputeWorkgroupSizeZ},requiredFeatures:t};n.features.has("chromium-experimental-timestamp-query-inside-passes")?t.push("chromium-experimental-timestamp-query-inside-passes"):n.features.has("timestamp-query")&&t.push("timestamp-query"),n.features.has("shader-f16")&&t.push("shader-f16"),this.device=await n.requestDevice(o),this.adapterInfo=new mu(n.info||await n.requestAdapterInfo()),this.gpuDataManager=Uh(this),this.programManager=new ji(this),this.kernels=new Map,this.kernelPersistentData=new Map,this.kernelCustomData=new Map,Nh(e.logLevel,!!e.debug),this.device.onuncapturederror=i=>{i.error instanceof GPUValidationError&&console.error(`An uncaught WebGPU validation error was raised: ${i.error.message}`)},Object.defineProperty(this.env.webgpu,"device",{value:this.device,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(this.env.webgpu,"adapter",{value:n,writable:!1,enumerable:!0,configurable:!1}),this.setQueryType()}dispose(){typeof this.querySet<"u"&&this.querySet.destroy(),this.gpuDataManager.dispose()}getCommandEncoder(){return this.commandEncoder||(this.commandEncoder=this.device.createCommandEncoder()),this.commandEncoder}getComputePassEncoder(){if(!this.computePassEncoder){let e=this.getCommandEncoder(),n={};this.queryType==="at-passes"&&(n.timestampWrites={querySet:this.querySet,beginningOfPassWriteIndex:this.pendingDispatchNumber*2,endOfPassWriteIndex:this.pendingDispatchNumber*2+1}),this.computePassEncoder=e.beginComputePass(n)}return this.computePassEncoder}endComputePass(){this.computePassEncoder&&(this.computePassEncoder.end(),this.computePassEncoder=null)}flush(){if(!this.commandEncoder)return;St(),this.endComputePass();let e;this.queryType!=="none"&&(this.commandEncoder.resolveQuerySet(this.querySet,0,this.pendingDispatchNumber*2,this.queryResolveBuffer,0),e=this.device.createBuffer({size:this.pendingDispatchNumber*2*8,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),this.pendingQueries.set(e,this.pendingKernels),this.pendingKernels=[],this.commandEncoder.copyBufferToBuffer(this.queryResolveBuffer,0,e,0,this.pendingDispatchNumber*2*8)),this.device.queue.submit([this.commandEncoder.finish()]),this.gpuDataManager.refreshPendingBuffers(),this.commandEncoder=null,this.pendingDispatchNumber=0,this.queryType!=="none"&&e.mapAsync(GPUMapMode.READ).then(()=>{let n=new BigUint64Array(e.getMappedRange()),t=this.pendingQueries.get(e);for(let o=0;o"u"&&(this.queryTimeBase=b);let g=Number(b-this.queryTimeBase),T=Number(h-this.queryTimeBase);if(!Number.isSafeInteger(g)||!Number.isSafeInteger(T))throw new RangeError("incorrect timestamp range");if(this.env.webgpu.profiling?.ondata)this.env.webgpu.profiling.ondata({version:1,inputsMetadata:c.map(w=>({dims:w.dims,dataType:Ar(w.dataType)})),outputsMetadata:p.map(w=>({dims:w.dims,dataType:Ar(w.dataType)})),kernelId:s,kernelType:u,kernelName:l,programName:f,startTime:g,endTime:T});else{let w="";c.forEach((S,$)=>{w+=`input[${$}]: [${S.dims}] | ${Ar(S.dataType)}, `});let v="";p.forEach((S,$)=>{v+=`output[${$}]: [${S.dims}] | ${Ar(S.dataType)}, `}),console.log(`[profiling] kernel "${s}|${u}|${l}|${f}" ${w}${v}execution time: ${T-g} ns`)}_o("GPU",`${f}::${b}::${h}`)}e.unmap(),this.pendingQueries.delete(e)}),yt()}run(e,n,t,o,i,s){St(e.name);let a=[];for(let S=0;S$):t;if(c.length!==u.length)throw new Error(`Output size ${c.length} must be equal to ${u.length}.`);let p=[],b=[];for(let S=0;S=s)throw new Error(`Invalid output index: ${c[S]}`);if(c[S]===-3)continue;let $=c[S]===-1,P=c[S]===-2,E=$||P?i(u[S].dataType,u[S].dims):o(c[S],u[S].dataType,u[S].dims);if(p.push(E),E.data===0)continue;let N=this.gpuDataManager.get(E.data);if(!N)throw new Error(`no GPU data for output: ${E.data}`);if($&&this.temporaryData.push(N),P){let z=this.kernelPersistentData.get(this.currentKernelId);z||(z=[],this.kernelPersistentData.set(this.currentKernelId,z)),z.push(N)}b.push(N)}if(a.length!==n.length||b.length!==p.length){if(b.length===0)return yt(e.name),p;throw new Error(`Program ${e.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`)}let h;if(f){let S=0,$=[];f.forEach(z=>{let q=typeof z.data=="number"?[z.data]:z.data;if(q.length===0)return;let K=z.type===10?2:4,F,_e;z.type===10?(_e=q.length>4?16:q.length>2?8:q.length*K,F=q.length>4?16:K*q.length):(_e=q.length<=2?q.length*K:16,F=16),S=Math.ceil(S/_e)*_e,$.push(S);let $e=z.type===10?8:4;S+=q.length>4?Math.ceil(q.length/$e)*F:q.length*K});let P=16;S=Math.ceil(S/P)*P;let E=new ArrayBuffer(S);f.forEach((z,q)=>{let K=$[q],F=typeof z.data=="number"?[z.data]:z.data;if(z.type===6)new Int32Array(E,K,F.length).set(F);else if(z.type===12)new Uint32Array(E,K,F.length).set(F);else if(z.type===10)new Uint16Array(E,K,F.length).set(F);else if(z.type===1)new Float32Array(E,K,F.length).set(F);else throw new Error(`Unsupported uniform type: ${Ar(z.type)}`)});let N=this.gpuDataManager.create(S,GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM);this.device.queue.writeBuffer(N.buffer,0,E,0,S),this.gpuDataManager.release(N.id),h={offset:0,size:S,buffer:N.buffer}}let g=this.programManager.normalizeDispatchGroupSize(l),T=g[1]===1&&g[2]===1,w=BI(e,n,T),v=this.programManager.getArtifact(w);if(v||(v=this.programManager.build(e,g),this.programManager.setArtifact(w,v),Ne("info",()=>`[artifact] key: ${w}, programName: ${e.name}`)),f&&v.uniformVariablesInfo){if(f.length!==v.uniformVariablesInfo.length)throw new Error(`Uniform variables count mismatch: expect ${v.uniformVariablesInfo.length}, got ${f.length} in program "${v.programInfo.name}".`);for(let S=0;S`[ProgramManager] run "${e.name}" (key=${w}) with ${g[0]}x${g[1]}x${g[2]}`),this.queryType!=="none"||this.sessionStatus==="capturing"){let S={kernelId:this.currentKernelId,programName:v.programInfo.name,inputTensorViews:n,outputTensorViews:p};this.pendingKernels.push(S),this.sessionStatus==="capturing"&&this.capturedPendingKernels.get(this.currentSessionId).push(S)}return this.programManager.run(v,a,b,g,h),yt(e.name),p}upload(e,n){this.gpuDataManager.upload(e,n)}memcpy(e,n){this.gpuDataManager.memcpy(e,n)}async download(e,n){await this.gpuDataManager.download(e,n)}alloc(e){return this.gpuDataManager.create(e).id}free(e){return this.gpuDataManager.release(e)}createKernel(e,n,t,o){let i=bx.get(e);if(!i)throw new Error(`kernel not implemented: ${e}`);let s={kernelType:e,kernelName:o,kernelEntry:i[0],attributes:[i[1],t]};this.kernels.set(n,s)}releaseKernel(e){let n=this.kernelPersistentData.get(e);if(n){for(let t of n)this.gpuDataManager.release(t.id);this.kernelPersistentData.delete(e)}this.kernelCustomData.delete(e),this.kernels.delete(e)}computeKernel(e,n,t){let o=this.kernels.get(e);if(!o)throw new Error(`kernel not created: ${e}`);let i=o.kernelType,s=o.kernelName,a=o.kernelEntry,u=o.attributes;if(this.currentKernelId!==null)throw new Error(`kernel "[${i}] ${s}" is not allowed to be called recursively`);this.currentKernelId=e,u[0]&&(u[1]=u[0](u[1]),u[0]=void 0),Ne("info",()=>`[WebGPU] Start to run kernel "[${i}] ${s}"...`);let l=this.env.debug;this.temporaryData=[];try{return l&&this.device.pushErrorScope("validation"),a(n,u[1]),0}catch(f){return t.push(Promise.resolve(`[WebGPU] Kernel "[${i}] ${s}" failed. ${f}`)),1}finally{l&&t.push(this.device.popErrorScope().then(f=>f?`GPU validation error for kernel "[${i}] ${s}": ${f.message}`:null));for(let f of this.temporaryData)this.gpuDataManager.release(f.id);this.temporaryData=[],this.currentKernelId=null}}registerBuffer(e,n,t,o){let i=this.sessionExternalDataMapping.get(e);i||(i=new Map,this.sessionExternalDataMapping.set(e,i));let s=i.get(n),a=this.gpuDataManager.registerExternalBuffer(t,o,s?.[1]);return i.set(n,[a,t]),a}unregisterBuffers(e){let n=this.sessionExternalDataMapping.get(e);n&&(n.forEach(t=>this.gpuDataManager.unregisterExternalBuffer(t[1])),this.sessionExternalDataMapping.delete(e))}getBuffer(e){let n=this.gpuDataManager.get(e);if(!n)throw new Error(`no GPU data for buffer: ${e}`);return n.buffer}createDownloader(e,n,t){return async()=>{let o=await Gs(this,e,n);return zh(o.buffer,t)}}writeTimestamp(e){this.queryType==="inside-passes"&&this.computePassEncoder.writeTimestamp(this.querySet,e)}setQueryType(){this.queryType="none",(this.env.webgpu.profiling?.mode==="default"||(typeof this.env.trace>"u"?this.env.wasm.trace:this.env.trace))&&(this.device.features.has("chromium-experimental-timestamp-query-inside-passes")?this.queryType="inside-passes":this.device.features.has("timestamp-query")&&(this.queryType="at-passes"),this.queryType!=="none"&&typeof this.querySet>"u"&&(this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxDispatchNumber*2}),this.queryResolveBuffer=this.device.createBuffer({size:this.maxDispatchNumber*2*8,usage:GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE})))}captureBegin(){Ne("info","captureBegin"),this.capturedCommandList.get(this.currentSessionId)||this.capturedCommandList.set(this.currentSessionId,[]),this.capturedPendingKernels.get(this.currentSessionId)||this.capturedPendingKernels.set(this.currentSessionId,[]),this.flush(),this.sessionStatus="capturing"}captureEnd(){Ne("info","captureEnd"),this.flush(),this.sessionStatus="default"}replay(){Ne("info","replay"),this.sessionStatus="replaying";let e=this.capturedCommandList.get(this.currentSessionId),n=this.capturedPendingKernels.get(this.currentSessionId),t=e.length;this.pendingKernels=[];for(let o=0;o=this.maxDispatchNumber||this.queryType==="at-passes")&&this.endComputePass(),this.pendingDispatchNumber>=this.maxDispatchNumber&&this.flush()}this.flush(),this.sessionStatus="default"}onReleaseSession(e){this.unregisterBuffers(e),this.capturedCommandList.has(e)&&this.capturedCommandList.delete(e),this.capturedPendingKernels.has(e)&&this.capturedPendingKernels.delete(e),this.gpuDataManager.onReleaseSession(e)}onRunStart(e){this.currentSessionId=e,this.setQueryType()}}});var wx={};sn(wx,{init:()=>LI});var to,hu,LI,Tx=C(()=>{"use strict";ue();vx();mr();ye();to=class r{constructor(e,n,t,o){this.module=e;this.dataType=n;this.data=t;this.dims=o}getFloat32Array(){if(this.dataType!==1)throw new Error("Invalid data type");let e=B.size(this.dims);return e===0?new Float32Array:new Float32Array(this.module.HEAP8.buffer,this.data,e)}getBigInt64Array(){if(this.dataType!==7)throw new Error("Invalid data type");let e=B.size(this.dims);return e===0?new BigInt64Array:new BigInt64Array(this.module.HEAP8.buffer,this.data,e)}getInt32Array(){if(this.dataType!==6)throw new Error("Invalid data type");let e=B.size(this.dims);return e===0?new Int32Array:new Int32Array(this.module.HEAP8.buffer,this.data,e)}reshape(e){if(B.size(e)!==B.size(this.dims))throw new Error("Invalid new shape");return new r(this.module,this.dataType,this.data,e)}},hu=class{constructor(e,n,t){this.module=e;this.backend=n;this.customDataOffset=0;this.customDataSize=0;this.adapterInfo=n.adapterInfo;let o=e.HEAPU32,i=t>>>2;this.opKernelContext=o[i++];let s=o[i++];this.outputCount=o[i++],this.customDataOffset=o[i++],this.customDataSize=o[i++];let a=[];for(let u=0;utypeof a=="number"?this.inputs[a]:a)??this.inputs,o=n?.outputs??[],i=(a,u,l)=>new to(this.module,u,this.output(a,l),l),s=(a,u)=>{let l=jr(a);if(!l)throw new Error(`Unsupported data type: ${a}`);let f=l*B.size(u),c=f>0?this.backend.gpuDataManager.create(f).id:0;return new to(this.module,a,c,u)};return this.backend.run(e,t,o,i,s,this.outputCount)}output(e,n){let t=this.module.stackSave();try{let o=this.module.stackAlloc((1+n.length)*4),i=o>>2;this.module.HEAPU32[i++]=n.length;for(let s=0;s{let o=e.jsepInit;if(!o)throw new Error("Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.");if(r==="webgpu"){let i=new Xi;await i.initialize(n,t),o("webgpu",[i,s=>i.alloc(s),s=>i.free(s),(s,a,u,l=!1)=>{if(l)Ne("verbose",()=>`[WebGPU] jsepCopyGpuToGpu: src=${s}, dst=${a}, size=${u}`),i.memcpy(s,a);else{Ne("verbose",()=>`[WebGPU] jsepCopyCpuToGpu: dataOffset=${s}, gpuDataId=${a}, size=${u}`);let f=e.HEAPU8.subarray(s>>>0,(s>>>0)+u);i.upload(a,f)}},async(s,a,u)=>{Ne("verbose",()=>`[WebGPU] jsepCopyGpuToCpu: gpuDataId=${s}, dataOffset=${a}, size=${u}`),await i.download(s,()=>e.HEAPU8.subarray(a>>>0,(a>>>0)+u))},(s,a,u)=>i.createKernel(s,a,u,e.UTF8ToString(e._JsepGetNodeName(a))),s=>i.releaseKernel(s),(s,a,u,l)=>{Ne("verbose",()=>`[WebGPU] jsepRun: sessionHandle=${u}, kernel=${s}, contextDataOffset=${a}`);let f=new hu(e,i,a);return i.computeKernel(s,f,l)},()=>i.captureBegin(),()=>i.captureEnd(),()=>i.replay()])}else o("webnn")}});var RI,bi,yi,Qr,NI,qn,xi,vi,_x,wi,Ti,_i,ks=C(()=>{"use strict";kh();Bh();ue();Kr();Si();zs();RI=(r,e)=>{Ye()._OrtInit(r,e)!==0&&Ue("Can't initialize onnxruntime.")},bi=async r=>{RI(r.wasm.numThreads,jn(r.logLevel))},yi=async(r,e)=>{{let n=(Tx(),Pn(wx)).init;if(e==="webgpu"){if(typeof navigator>"u"||!navigator.gpu)throw new Error("WebGPU is not supported in current environment");let t=r.webgpu.adapter;if(t){if(typeof t.limits!="object"||typeof t.features!="object"||typeof t.requestDevice!="function")throw new Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let o=r.webgpu.powerPreference;if(o!==void 0&&o!=="low-power"&&o!=="high-performance")throw new Error(`Invalid powerPreference setting: "${o}"`);let i=r.webgpu.forceFallbackAdapter;if(i!==void 0&&typeof i!="boolean")throw new Error(`Invalid forceFallbackAdapter setting: "${i}"`);if(t=await navigator.gpu.requestAdapter({powerPreference:o,forceFallbackAdapter:i}),!t)throw new Error('Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.')}await n("webgpu",Ye(),r,t)}if(e==="webnn"){if(typeof navigator>"u"||!navigator.ml)throw new Error("WebNN is not supported in current environment");await n("webnn",Ye(),r)}}},Qr=new Map,NI=r=>{let e=Ye(),n=e.stackSave();try{let t=e.stackAlloc(8);return e._OrtGetInputOutputCount(r,t,t+4)!==0&&Ue("Can't get session input/output count."),[e.HEAP32[t/4],e.HEAP32[t/4+1]]}finally{e.stackRestore(n)}},qn=r=>{let e=Ye(),n=e._malloc(r.byteLength);if(n===0)throw new Error(`Can't create a session. failed to allocate a buffer of size ${r.byteLength}.`);return e.HEAPU8.set(r,n),[n,r.byteLength]},xi=async(r,e)=>{let n,t,o=Ye();Array.isArray(r)?[n,t]=r:r.buffer===o.HEAPU8.buffer?[n,t]=[r.byteOffset,r.byteLength]:[n,t]=qn(r);let i=0,s=0,a=0,u=[],l=[],f=[];try{if([s,u]=Dh(e),e?.externalData&&o.mountExternalData){let v=[];for(let S of e.externalData){let $=typeof S=="string"?S:S.path;v.push(Xn(typeof S=="string"?S:S.data).then(P=>{o.mountExternalData($,P)}))}await Promise.all(v)}for(let v of e?.executionProviders??[])if((typeof v=="string"?v:v.name)==="webnn"){if(o.currentContext)throw new Error("WebNN execution provider is already set.");if(typeof v!="string"){let $=v,P=$?.context,E=$?.gpuDevice,N=$?.deviceType,z=$?.numThreads,q=$?.powerPreference;P?o.currentContext=P:E?o.currentContext=await navigator.ml.createContext(E):o.currentContext=await navigator.ml.createContext({deviceType:N,numThreads:z,powerPreference:q})}else o.currentContext=await navigator.ml.createContext();break}i=await o._OrtCreateSession(n,t,s),i===0&&Ue("Can't create a session."),o.currentContext&&(o.currentContext=void 0);let[c,p]=NI(i),b=!!e?.enableGraphCapture,h=[],g=[],T=[];for(let v=0;vv==="gpu-buffer")&&(a=o._OrtCreateBinding(i),a===0&&Ue("Can't create IO binding."),w={handle:a,outputPreferredLocations:T,outputPreferredLocationsEncoded:T.map(v=>Ns(v))}),Qr.set(i,[i,l,f,w,b,!1]),[i,h,g]}catch(c){throw l.forEach(p=>o._OrtFree(p)),f.forEach(p=>o._OrtFree(p)),a!==0&&o._OrtReleaseBinding(a),i!==0&&o._OrtReleaseSession(i),c}finally{o._free(n),s!==0&&o._OrtReleaseSessionOptions(s),u.forEach(c=>o._free(c)),o.unmountExternalData?.()}},vi=r=>{let e=Ye(),n=Qr.get(r);if(!n)throw new Error(`cannot release session. invalid session id: ${r}`);let[t,o,i,s,a]=n;s&&(a&&e._OrtClearBoundOutputs(s.handle),e._OrtReleaseBinding(s.handle)),e.jsepOnReleaseSession?.(r),o.forEach(u=>e._OrtFree(u)),i.forEach(u=>e._OrtFree(u)),e._OrtReleaseSession(t),Qr.delete(r)},_x=(r,e,n,t,o,i=!1)=>{if(!r){e.push(0);return}let s=Ye(),a=r[0],u=r[1],l=r[3],f,c;if(a==="string"&&l==="gpu-buffer")throw new Error("String tensor is not supported on GPU.");if(i&&l!=="gpu-buffer")throw new Error(`External buffer must be provided for input/output index ${o} when enableGraphCapture is true.`);if(l==="gpu-buffer"){let h=r[2].gpuBuffer,g=jr(Rs(a));c=u.reduce((w,v)=>w*v,1)*g;let T=s.jsepRegisterBuffer;if(!T)throw new Error('Tensor location "gpu-buffer" is not supported without using WebGPU.');f=T(t,o,h,c)}else{let h=r[2];if(Array.isArray(h)){c=4*h.length,f=s._malloc(c),n.push(f);let g=f/4;for(let T=0;Ts.HEAP32[h++]=T);let g=s._OrtCreateTensor(Rs(a),f,c,b,u.length,Ns(l));g===0&&Ue(`Can't create tensor for input/output. session=${t}, index=${o}.`),e.push(g)}finally{s.stackRestore(p)}},wi=async(r,e,n,t,o,i)=>{let s=Ye(),a=Qr.get(r);if(!a)throw new Error(`cannot run inference. invalid session id: ${r}`);let u=a[0],l=a[1],f=a[2],c=a[3],p=a[4],b=a[5],h=e.length,g=t.length,T=0,w=[],v=[],S=[],$=[],P=s.stackSave(),E=s.stackAlloc(h*4),N=s.stackAlloc(h*4),z=s.stackAlloc(g*4),q=s.stackAlloc(g*4);try{[T,w]=Ch(i);for(let Q=0;Qmt*rt,1);pe=Ar(ie);let tn=c?.outputPreferredLocations[t[Q]];if(pe==="string"){if(tn==="gpu-buffer")throw new Error("String tensor is not supported on GPU.");let mt=[],rt=ce/4;for(let Kt=0;Kt0){let mt=s.jsepGetBuffer;if(!mt)throw new Error('preferredLocation "gpu-buffer" is not supported without using WebGPU.');let rt=mt(ce),Kt=jr(ie);if(Kt===void 0||!Ai(pe))throw new Error(`Unsupported data type: ${pe}`);se=!0,qe.push([pe,Fe,{gpuBuffer:rt,download:s.jsepCreateDownloader(rt,Ke*Kt,pe),dispose:()=>{s._OrtReleaseTensor(ge)}},"gpu-buffer"])}else{let mt=$i(pe),rt=new mt(Ke);new Uint8Array(rt.buffer,rt.byteOffset,rt.byteLength).set(s.HEAPU8.subarray(ce,ce+rt.byteLength)),qe.push([pe,Fe,rt,"cpu"])}}finally{s.stackRestore(Ie),pe==="string"&&ce&&s._free(ce),se||s._OrtReleaseTensor(ge)}}return c&&!p&&(s._OrtClearBoundOutputs(c.handle),Qr.set(r,[u,l,f,c,p,!1])),qe}finally{s.stackRestore(P),v.forEach(K=>s._OrtReleaseTensor(K)),S.forEach(K=>s._OrtReleaseTensor(K)),$.forEach(K=>s._free(K)),T!==0&&s._OrtReleaseRunOptions(T),w.forEach(K=>s._free(K))}},Ti=r=>{let e=Ye(),n=Qr.get(r);if(!n)throw new Error("invalid session id");let t=n[0],o=e._OrtEndProfiling(t);o===0&&Ue("Can't get an profile file name."),e._OrtFree(o)},_i=r=>{let e=[];for(let n of r){let t=n[2];!Array.isArray(t)&&"buffer"in t&&e.push(t.buffer)}return e}});var en,Rt,ro,Yi,Ji,Zi,gu,bu,Sn,$n,FI,Ix,Sx,$x,Ax,Px,Ox,Ex,yu=C(()=>{"use strict";ft();ks();Kr();Hn();en=()=>!!le.wasm.proxy&&typeof document<"u",ro=!1,Yi=!1,Ji=!1,bu=new Map,Sn=(r,e)=>{let n=bu.get(r);n?n.push(e):bu.set(r,[e])},$n=()=>{if(ro||!Yi||Ji||!Rt)throw new Error("worker not ready")},FI=r=>{switch(r.data.type){case"init-wasm":ro=!1,r.data.err?(Ji=!0,gu[1](r.data.err)):(Yi=!0,gu[0]()),Zi&&(URL.revokeObjectURL(Zi),Zi=void 0);break;case"init-ep":case"copy-from":case"create":case"release":case"run":case"end-profiling":{let e=bu.get(r.data.type);r.data.err?e.shift()[1](r.data.err):e.shift()[0](r.data.out);break}default:}},Ix=async()=>{if(!Yi){if(ro)throw new Error("multiple calls to 'initWasm()' detected.");if(Ji)throw new Error("previous call to 'initWasm()' failed.");if(ro=!0,en())return new Promise((r,e)=>{Rt?.terminate(),Ph().then(([n,t])=>{try{Rt=t,Rt.onerror=i=>e(i),Rt.onmessage=FI,gu=[r,e];let o={type:"init-wasm",in:le};Rt.postMessage(o),Zi=n}catch(o){e(o)}},e)});try{await gi(le.wasm),await bi(le),Yi=!0}catch(r){throw Ji=!0,r}finally{ro=!1}}},Sx=async r=>{if(en())return $n(),new Promise((e,n)=>{Sn("init-ep",[e,n]);let t={type:"init-ep",in:{epName:r,env:le}};Rt.postMessage(t)});await yi(le,r)},$x=async r=>en()?($n(),new Promise((e,n)=>{Sn("copy-from",[e,n]);let t={type:"copy-from",in:{buffer:r}};Rt.postMessage(t,[r.buffer])})):qn(r),Ax=async(r,e)=>{if(en()){if(e?.preferredOutputLocation)throw new Error('session option "preferredOutputLocation" is not supported for proxy.');return $n(),new Promise((n,t)=>{Sn("create",[n,t]);let o={type:"create",in:{model:r,options:{...e}}},i=[];r instanceof Uint8Array&&i.push(r.buffer),Rt.postMessage(o,i)})}else return xi(r,e)},Px=async r=>{if(en())return $n(),new Promise((e,n)=>{Sn("release",[e,n]);let t={type:"release",in:r};Rt.postMessage(t)});vi(r)},Ox=async(r,e,n,t,o,i)=>{if(en()){if(n.some(s=>s[3]!=="cpu"))throw new Error("input tensor on GPU is not supported for proxy.");if(o.some(s=>s))throw new Error("pre-allocated output tensor is not supported for proxy.");return $n(),new Promise((s,a)=>{Sn("run",[s,a]);let u=n,l={type:"run",in:{sessionId:r,inputIndices:e,inputs:u,outputIndices:t,options:i}};Rt.postMessage(l,_i(u))})}else return wi(r,e,n,t,o,i)},Ex=async r=>{if(en())return $n(),new Promise((e,n)=>{Sn("end-profiling",[e,n]);let t={type:"end-profiling",in:r};Rt.postMessage(t)});Ti(r)}});var Cx,MI,Qi,kx=C(()=>{"use strict";ft();yu();ue();hi();zs();Cx=(r,e)=>{switch(r.location){case"cpu":return[r.type,r.dims,r.data,"cpu"];case"gpu-buffer":return[r.type,r.dims,{gpuBuffer:r.gpuBuffer},"gpu-buffer"];default:throw new Error(`invalid data location: ${r.location} for ${e()}`)}},MI=r=>{switch(r[3]){case"cpu":return new it(r[0],r[2],r[1]);case"gpu-buffer":{let e=r[0];if(!Ai(e))throw new Error(`not supported data type: ${e} for deserializing GPU tensor`);let{gpuBuffer:n,download:t,dispose:o}=r[2];return it.fromGpuBuffer(n,{dataType:e,dims:r[1],download:t,dispose:o})}default:throw new Error(`invalid data location: ${r[3]}`)}},Qi=class{async fetchModelAndCopyToWasmMemory(e){return $x(await Xn(e))}async loadModel(e,n){St();let t;typeof e=="string"?!1?t=await Xn(e):t=await this.fetchModelAndCopyToWasmMemory(e):t=e,[this.sessionId,this.inputNames,this.outputNames]=await Ax(t,n),yt()}async dispose(){return Px(this.sessionId)}async run(e,n,t){St();let o=[],i=[];Object.entries(e).forEach(p=>{let b=p[0],h=p[1],g=this.inputNames.indexOf(b);if(g===-1)throw new Error(`invalid input '${b}'`);o.push(h),i.push(g)});let s=[],a=[];Object.entries(n).forEach(p=>{let b=p[0],h=p[1],g=this.outputNames.indexOf(b);if(g===-1)throw new Error(`invalid output '${b}'`);s.push(h),a.push(g)});let u=o.map((p,b)=>Cx(p,()=>`input "${this.inputNames[i[b]]}"`)),l=s.map((p,b)=>p?Cx(p,()=>`output "${this.outputNames[a[b]]}"`):null),f=await Ox(this.sessionId,i,u,a,l,t),c={};for(let p=0;p{"use strict";ft();yu();kx();Hn();VI=()=>{if((typeof le.wasm.initTimeout!="number"||le.wasm.initTimeout<0)&&(le.wasm.initTimeout=0),le.wasm.simd===!1&&console.warn('Deprecated property "env.wasm.simd" is set to false. non-SIMD build is no longer provided, and this setting will be ignored.'),typeof le.wasm.proxy!="boolean"&&(le.wasm.proxy=!1),typeof le.wasm.trace!="boolean"&&(le.wasm.trace=!1),typeof le.wasm.numThreads!="number"||!Number.isInteger(le.wasm.numThreads)||le.wasm.numThreads<=0)if(typeof self<"u"&&!self.crossOriginIsolated)le.wasm.numThreads=1;else{let r=typeof navigator>"u"?Ta("node:os").cpus().length:navigator.hardwareConcurrency;le.wasm.numThreads=Math.min(4,Math.ceil((r||1)/2))}},ea=class{async init(e){VI(),await Ix(),await Sx(e)}async createInferenceSessionHandler(e,n){let t=new Qi;return await t.loadModel(e,n),Promise.resolve(t)}}});var Bx={};sn(Bx,{wasmBackend:()=>GI});var GI,Lx=C(()=>{"use strict";Dx();GI=new ea});ft();ft();ft();var mc="1.19.0";var YM=$a;{let r=(xh(),Pn(yh)).onnxjsBackend;vr("webgl",r,-10)}{let r=(Lx(),Pn(Bx)).wasmBackend;vr("webgpu",r,5),vr("webnn",r,5),vr("cpu",r,10),vr("wasm",r,10)}Object.defineProperty(le.versions,"web",{value:mc,enumerable:!0});export{ov as InferenceSession,_o as TRACE,St as TRACE_FUNC_BEGIN,yt as TRACE_FUNC_END,it as Tensor,av as TrainingSession,YM as default,le as env,vr as registerBackend}; +${s}`,u=t.createShaderModule({code:a,label:e.name});Ne("verbose",()=>`[WebGPU] ${e.name} shader code: ${a}`);let l=t.createComputePipeline({compute:{module:u,entryPoint:"main"},layout:"auto",label:e.name});return yt(e.name),{programInfo:e,computePipeline:l,uniformVariablesInfo:i.variablesInfo}}normalizeDispatchGroupSize(e){let n=typeof e=="number"?e:e.x,t=typeof e=="number"?1:e.y||1,o=typeof e=="number"?1:e.z||1,i=this.backend.device.limits.maxComputeWorkgroupsPerDimension;if(n<=i&&t<=i&&o<=i)return[n,t,o];let s=n*t*o,a=Math.ceil(Math.sqrt(s));if(a>i){if(a=Math.ceil(Math.cbrt(s)),a>i)throw new Error("Total dispatch size exceeds WebGPU maximum.");return[a,a,a]}else return[a,a,1]}}});var LI,RI,hu,Xi,vx=C(()=>{"use strict";ft();ue();mr();Fh();Wh();yx();xx();LI=(r,e)=>{if(e.length!==r.length)throw new Error(`inputDependencies length ${e.length} is not equal to inputTensors length ${r.length}.`);let n=[];for(let t=0;t{let t=r.name;return r.shaderCache?.hint&&(t+="["+r.shaderCache.hint+"]"),t+=":"+n+`:${LI(e,r.shaderCache?.inputDependencies??new Array(e.length).fill("dims"))}`,t},hu=class{constructor(e){e&&(this.architecture=e.architecture,this.vendor=e.vendor)}isArchitecture(e){return this.architecture===e}isVendor(e){return this.vendor===e}},Xi=class{constructor(){this.currentSessionId=null;this.currentKernelId=null;this.commandEncoder=null;this.computePassEncoder=null;this.maxDispatchNumber=16;this.pendingDispatchNumber=0;this.pendingKernels=[];this.pendingQueries=new Map;this.sessionStatus="default";this.capturedCommandList=new Map;this.capturedPendingKernels=new Map;this.sessionExternalDataMapping=new Map}get currentKernelCustomData(){if(this.currentKernelId===null)throw new Error("currentKernelCustomData(): currentKernelId is null. (should not happen)");let e=this.kernelCustomData.get(this.currentKernelId);return e||(e={},this.kernelCustomData.set(this.currentKernelId,e)),e}async initialize(e,n){this.env=e;let t=[],o={requiredLimits:{maxComputeWorkgroupStorageSize:n.limits.maxComputeWorkgroupStorageSize,maxComputeWorkgroupsPerDimension:n.limits.maxComputeWorkgroupsPerDimension,maxStorageBufferBindingSize:n.limits.maxStorageBufferBindingSize,maxBufferSize:n.limits.maxBufferSize,maxComputeInvocationsPerWorkgroup:n.limits.maxComputeInvocationsPerWorkgroup,maxComputeWorkgroupSizeX:n.limits.maxComputeWorkgroupSizeX,maxComputeWorkgroupSizeY:n.limits.maxComputeWorkgroupSizeY,maxComputeWorkgroupSizeZ:n.limits.maxComputeWorkgroupSizeZ},requiredFeatures:t};n.features.has("chromium-experimental-timestamp-query-inside-passes")?t.push("chromium-experimental-timestamp-query-inside-passes"):n.features.has("timestamp-query")&&t.push("timestamp-query"),n.features.has("shader-f16")&&t.push("shader-f16"),this.device=await n.requestDevice(o),this.adapterInfo=new hu(n.info||await n.requestAdapterInfo()),this.gpuDataManager=Uh(this),this.programManager=new Ki(this),this.kernels=new Map,this.kernelPersistentData=new Map,this.kernelCustomData=new Map,Nh(e.logLevel,!!e.debug),this.device.onuncapturederror=i=>{i.error instanceof GPUValidationError&&console.error(`An uncaught WebGPU validation error was raised: ${i.error.message}`)},Object.defineProperty(this.env.webgpu,"device",{value:this.device,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(this.env.webgpu,"adapter",{value:n,writable:!1,enumerable:!0,configurable:!1}),this.setQueryType()}dispose(){typeof this.querySet<"u"&&this.querySet.destroy(),this.gpuDataManager.dispose()}getCommandEncoder(){return this.commandEncoder||(this.commandEncoder=this.device.createCommandEncoder()),this.commandEncoder}getComputePassEncoder(){if(!this.computePassEncoder){let e=this.getCommandEncoder(),n={};this.queryType==="at-passes"&&(n.timestampWrites={querySet:this.querySet,beginningOfPassWriteIndex:this.pendingDispatchNumber*2,endOfPassWriteIndex:this.pendingDispatchNumber*2+1}),this.computePassEncoder=e.beginComputePass(n)}return this.computePassEncoder}endComputePass(){this.computePassEncoder&&(this.computePassEncoder.end(),this.computePassEncoder=null)}flush(){if(!this.commandEncoder)return;St(),this.endComputePass();let e;this.queryType!=="none"&&(this.commandEncoder.resolveQuerySet(this.querySet,0,this.pendingDispatchNumber*2,this.queryResolveBuffer,0),e=this.device.createBuffer({size:this.pendingDispatchNumber*2*8,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),this.pendingQueries.set(e,this.pendingKernels),this.pendingKernels=[],this.commandEncoder.copyBufferToBuffer(this.queryResolveBuffer,0,e,0,this.pendingDispatchNumber*2*8)),this.device.queue.submit([this.commandEncoder.finish()]),this.gpuDataManager.refreshPendingBuffers(),this.commandEncoder=null,this.pendingDispatchNumber=0,this.queryType!=="none"&&e.mapAsync(GPUMapMode.READ).then(()=>{let n=new BigUint64Array(e.getMappedRange()),t=this.pendingQueries.get(e);for(let o=0;o"u"&&(this.queryTimeBase=b);let g=Number(b-this.queryTimeBase),T=Number(h-this.queryTimeBase);if(!Number.isSafeInteger(g)||!Number.isSafeInteger(T))throw new RangeError("incorrect timestamp range");if(this.env.webgpu.profiling?.ondata)this.env.webgpu.profiling.ondata({version:1,inputsMetadata:c.map(w=>({dims:w.dims,dataType:Ar(w.dataType)})),outputsMetadata:p.map(w=>({dims:w.dims,dataType:Ar(w.dataType)})),kernelId:s,kernelType:u,kernelName:l,programName:f,startTime:g,endTime:T});else{let w="";c.forEach((S,$)=>{w+=`input[${$}]: [${S.dims}] | ${Ar(S.dataType)}, `});let v="";p.forEach((S,$)=>{v+=`output[${$}]: [${S.dims}] | ${Ar(S.dataType)}, `}),console.log(`[profiling] kernel "${s}|${u}|${l}|${f}" ${w}${v}execution time: ${T-g} ns`)}_o("GPU",`${f}::${b}::${h}`)}e.unmap(),this.pendingQueries.delete(e)}),yt()}run(e,n,t,o,i,s){St(e.name);let a=[];for(let S=0;S$):t;if(c.length!==u.length)throw new Error(`Output size ${c.length} must be equal to ${u.length}.`);let p=[],b=[];for(let S=0;S=s)throw new Error(`Invalid output index: ${c[S]}`);if(c[S]===-3)continue;let $=c[S]===-1,P=c[S]===-2,E=$||P?i(u[S].dataType,u[S].dims):o(c[S],u[S].dataType,u[S].dims);if(p.push(E),E.data===0)continue;let N=this.gpuDataManager.get(E.data);if(!N)throw new Error(`no GPU data for output: ${E.data}`);if($&&this.temporaryData.push(N),P){let z=this.kernelPersistentData.get(this.currentKernelId);z||(z=[],this.kernelPersistentData.set(this.currentKernelId,z)),z.push(N)}b.push(N)}if(a.length!==n.length||b.length!==p.length){if(b.length===0)return yt(e.name),p;throw new Error(`Program ${e.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`)}let h;if(f){let S=0,$=[];f.forEach(z=>{let q=typeof z.data=="number"?[z.data]:z.data;if(q.length===0)return;let j=z.type===10?2:4,F,_e;z.type===10?(_e=q.length>4?16:q.length>2?8:q.length*j,F=q.length>4?16:j*q.length):(_e=q.length<=2?q.length*j:16,F=16),S=Math.ceil(S/_e)*_e,$.push(S);let $e=z.type===10?8:4;S+=q.length>4?Math.ceil(q.length/$e)*F:q.length*j});let P=16;S=Math.ceil(S/P)*P;let E=new ArrayBuffer(S);f.forEach((z,q)=>{let j=$[q],F=typeof z.data=="number"?[z.data]:z.data;if(z.type===6)new Int32Array(E,j,F.length).set(F);else if(z.type===12)new Uint32Array(E,j,F.length).set(F);else if(z.type===10)new Uint16Array(E,j,F.length).set(F);else if(z.type===1)new Float32Array(E,j,F.length).set(F);else throw new Error(`Unsupported uniform type: ${Ar(z.type)}`)});let N=this.gpuDataManager.create(S,GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM);this.device.queue.writeBuffer(N.buffer,0,E,0,S),this.gpuDataManager.release(N.id),h={offset:0,size:S,buffer:N.buffer}}let g=this.programManager.normalizeDispatchGroupSize(l),T=g[1]===1&&g[2]===1,w=RI(e,n,T),v=this.programManager.getArtifact(w);if(v||(v=this.programManager.build(e,g),this.programManager.setArtifact(w,v),Ne("info",()=>`[artifact] key: ${w}, programName: ${e.name}`)),f&&v.uniformVariablesInfo){if(f.length!==v.uniformVariablesInfo.length)throw new Error(`Uniform variables count mismatch: expect ${v.uniformVariablesInfo.length}, got ${f.length} in program "${v.programInfo.name}".`);for(let S=0;S`[ProgramManager] run "${e.name}" (key=${w}) with ${g[0]}x${g[1]}x${g[2]}`),this.queryType!=="none"||this.sessionStatus==="capturing"){let S={kernelId:this.currentKernelId,programName:v.programInfo.name,inputTensorViews:n,outputTensorViews:p};this.pendingKernels.push(S),this.sessionStatus==="capturing"&&this.capturedPendingKernels.get(this.currentSessionId).push(S)}return this.programManager.run(v,a,b,g,h),yt(e.name),p}upload(e,n){this.gpuDataManager.upload(e,n)}memcpy(e,n){this.gpuDataManager.memcpy(e,n)}async download(e,n){await this.gpuDataManager.download(e,n)}alloc(e){return this.gpuDataManager.create(e).id}free(e){return this.gpuDataManager.release(e)}createKernel(e,n,t,o){let i=bx.get(e);if(!i)throw new Error(`kernel not implemented: ${e}`);let s={kernelType:e,kernelName:o,kernelEntry:i[0],attributes:[i[1],t]};this.kernels.set(n,s)}releaseKernel(e){let n=this.kernelPersistentData.get(e);if(n){for(let t of n)this.gpuDataManager.release(t.id);this.kernelPersistentData.delete(e)}this.kernelCustomData.delete(e),this.kernels.delete(e)}computeKernel(e,n,t){let o=this.kernels.get(e);if(!o)throw new Error(`kernel not created: ${e}`);let i=o.kernelType,s=o.kernelName,a=o.kernelEntry,u=o.attributes;if(this.currentKernelId!==null)throw new Error(`kernel "[${i}] ${s}" is not allowed to be called recursively`);this.currentKernelId=e,u[0]&&(u[1]=u[0](u[1]),u[0]=void 0),Ne("info",()=>`[WebGPU] Start to run kernel "[${i}] ${s}"...`);let l=this.env.debug;this.temporaryData=[];try{return l&&this.device.pushErrorScope("validation"),a(n,u[1]),0}catch(f){return t.push(Promise.resolve(`[WebGPU] Kernel "[${i}] ${s}" failed. ${f}`)),1}finally{l&&t.push(this.device.popErrorScope().then(f=>f?`GPU validation error for kernel "[${i}] ${s}": ${f.message}`:null));for(let f of this.temporaryData)this.gpuDataManager.release(f.id);this.temporaryData=[],this.currentKernelId=null}}registerBuffer(e,n,t,o){let i=this.sessionExternalDataMapping.get(e);i||(i=new Map,this.sessionExternalDataMapping.set(e,i));let s=i.get(n),a=this.gpuDataManager.registerExternalBuffer(t,o,s?.[1]);return i.set(n,[a,t]),a}unregisterBuffers(e){let n=this.sessionExternalDataMapping.get(e);n&&(n.forEach(t=>this.gpuDataManager.unregisterExternalBuffer(t[1])),this.sessionExternalDataMapping.delete(e))}getBuffer(e){let n=this.gpuDataManager.get(e);if(!n)throw new Error(`no GPU data for buffer: ${e}`);return n.buffer}createDownloader(e,n,t){return async()=>{let o=await Us(this,e,n);return zh(o.buffer,t)}}writeTimestamp(e){this.queryType==="inside-passes"&&this.computePassEncoder.writeTimestamp(this.querySet,e)}setQueryType(){this.queryType="none",(this.env.webgpu.profiling?.mode==="default"||(typeof this.env.trace>"u"?this.env.wasm.trace:this.env.trace))&&(this.device.features.has("chromium-experimental-timestamp-query-inside-passes")?this.queryType="inside-passes":this.device.features.has("timestamp-query")&&(this.queryType="at-passes"),this.queryType!=="none"&&typeof this.querySet>"u"&&(this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxDispatchNumber*2}),this.queryResolveBuffer=this.device.createBuffer({size:this.maxDispatchNumber*2*8,usage:GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE})))}captureBegin(){Ne("info","captureBegin"),this.capturedCommandList.get(this.currentSessionId)||this.capturedCommandList.set(this.currentSessionId,[]),this.capturedPendingKernels.get(this.currentSessionId)||this.capturedPendingKernels.set(this.currentSessionId,[]),this.flush(),this.sessionStatus="capturing"}captureEnd(){Ne("info","captureEnd"),this.flush(),this.sessionStatus="default"}replay(){Ne("info","replay"),this.sessionStatus="replaying";let e=this.capturedCommandList.get(this.currentSessionId),n=this.capturedPendingKernels.get(this.currentSessionId),t=e.length;this.pendingKernels=[];for(let o=0;o=this.maxDispatchNumber||this.queryType==="at-passes")&&this.endComputePass(),this.pendingDispatchNumber>=this.maxDispatchNumber&&this.flush()}this.flush(),this.sessionStatus="default"}onReleaseSession(e){this.unregisterBuffers(e),this.capturedCommandList.has(e)&&this.capturedCommandList.delete(e),this.capturedPendingKernels.has(e)&&this.capturedPendingKernels.delete(e),this.gpuDataManager.onReleaseSession(e)}onRunStart(e){this.currentSessionId=e,this.setQueryType()}}});var wx={};un(wx,{init:()=>NI});var to,gu,NI,Tx=C(()=>{"use strict";ue();vx();mr();ye();to=class r{constructor(e,n,t,o){this.module=e;this.dataType=n;this.data=t;this.dims=o}getFloat32Array(){if(this.dataType!==1)throw new Error("Invalid data type");let e=B.size(this.dims);return e===0?new Float32Array:new Float32Array(this.module.HEAP8.buffer,this.data,e)}getBigInt64Array(){if(this.dataType!==7)throw new Error("Invalid data type");let e=B.size(this.dims);return e===0?new BigInt64Array:new BigInt64Array(this.module.HEAP8.buffer,this.data,e)}getInt32Array(){if(this.dataType!==6)throw new Error("Invalid data type");let e=B.size(this.dims);return e===0?new Int32Array:new Int32Array(this.module.HEAP8.buffer,this.data,e)}reshape(e){if(B.size(e)!==B.size(this.dims))throw new Error("Invalid new shape");return new r(this.module,this.dataType,this.data,e)}},gu=class{constructor(e,n,t){this.module=e;this.backend=n;this.customDataOffset=0;this.customDataSize=0;this.adapterInfo=n.adapterInfo;let o=e.HEAPU32,i=t>>>2;this.opKernelContext=o[i++];let s=o[i++];this.outputCount=o[i++],this.customDataOffset=o[i++],this.customDataSize=o[i++];let a=[];for(let u=0;utypeof a=="number"?this.inputs[a]:a)??this.inputs,o=n?.outputs??[],i=(a,u,l)=>new to(this.module,u,this.output(a,l),l),s=(a,u)=>{let l=Kr(a);if(!l)throw new Error(`Unsupported data type: ${a}`);let f=l*B.size(u),c=f>0?this.backend.gpuDataManager.create(f).id:0;return new to(this.module,a,c,u)};return this.backend.run(e,t,o,i,s,this.outputCount)}output(e,n){let t=this.module.stackSave();try{let o=this.module.stackAlloc((1+n.length)*4),i=o>>2;this.module.HEAPU32[i++]=n.length;for(let s=0;s{let o=e.jsepInit;if(!o)throw new Error("Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.");if(r==="webgpu"){let i=new Xi;await i.initialize(n,t),o("webgpu",[i,s=>i.alloc(s),s=>i.free(s),(s,a,u,l=!1)=>{if(l)Ne("verbose",()=>`[WebGPU] jsepCopyGpuToGpu: src=${s}, dst=${a}, size=${u}`),i.memcpy(s,a);else{Ne("verbose",()=>`[WebGPU] jsepCopyCpuToGpu: dataOffset=${s}, gpuDataId=${a}, size=${u}`);let f=e.HEAPU8.subarray(s>>>0,(s>>>0)+u);i.upload(a,f)}},async(s,a,u)=>{Ne("verbose",()=>`[WebGPU] jsepCopyGpuToCpu: gpuDataId=${s}, dataOffset=${a}, size=${u}`),await i.download(s,()=>e.HEAPU8.subarray(a>>>0,(a>>>0)+u))},(s,a,u)=>i.createKernel(s,a,u,e.UTF8ToString(e._JsepGetNodeName(a))),s=>i.releaseKernel(s),(s,a,u,l)=>{Ne("verbose",()=>`[WebGPU] jsepRun: sessionHandle=${u}, kernel=${s}, contextDataOffset=${a}`);let f=new gu(e,i,a);return i.computeKernel(s,f,l)},()=>i.captureBegin(),()=>i.captureEnd(),()=>i.replay()])}else o("webnn")}});var zI,bi,yi,Qr,FI,qn,xi,vi,_x,wi,Ti,_i,Ds=C(()=>{"use strict";kh();Bh();ue();jr();Si();Fs();zI=(r,e)=>{Ye()._OrtInit(r,e)!==0&&Ue("Can't initialize onnxruntime.")},bi=async r=>{zI(r.wasm.numThreads,Kn(r.logLevel))},yi=async(r,e)=>{{let n=(Tx(),Pn(wx)).init;if(e==="webgpu"){if(typeof navigator>"u"||!navigator.gpu)throw new Error("WebGPU is not supported in current environment");let t=r.webgpu.adapter;if(t){if(typeof t.limits!="object"||typeof t.features!="object"||typeof t.requestDevice!="function")throw new Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let o=r.webgpu.powerPreference;if(o!==void 0&&o!=="low-power"&&o!=="high-performance")throw new Error(`Invalid powerPreference setting: "${o}"`);let i=r.webgpu.forceFallbackAdapter;if(i!==void 0&&typeof i!="boolean")throw new Error(`Invalid forceFallbackAdapter setting: "${i}"`);if(t=await navigator.gpu.requestAdapter({powerPreference:o,forceFallbackAdapter:i}),!t)throw new Error('Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.')}await n("webgpu",Ye(),r,t)}if(e==="webnn"){if(typeof navigator>"u"||!navigator.ml)throw new Error("WebNN is not supported in current environment");await n("webnn",Ye(),r)}}},Qr=new Map,FI=r=>{let e=Ye(),n=e.stackSave();try{let t=e.stackAlloc(8);return e._OrtGetInputOutputCount(r,t,t+4)!==0&&Ue("Can't get session input/output count."),[e.HEAP32[t/4],e.HEAP32[t/4+1]]}finally{e.stackRestore(n)}},qn=r=>{let e=Ye(),n=e._malloc(r.byteLength);if(n===0)throw new Error(`Can't create a session. failed to allocate a buffer of size ${r.byteLength}.`);return e.HEAPU8.set(r,n),[n,r.byteLength]},xi=async(r,e)=>{let n,t,o=Ye();Array.isArray(r)?[n,t]=r:r.buffer===o.HEAPU8.buffer?[n,t]=[r.byteOffset,r.byteLength]:[n,t]=qn(r);let i=0,s=0,a=0,u=[],l=[],f=[];try{if([s,u]=Dh(e),e?.externalData&&o.mountExternalData){let v=[];for(let S of e.externalData){let $=typeof S=="string"?S:S.path;v.push(Xn(typeof S=="string"?S:S.data).then(P=>{o.mountExternalData($,P)}))}await Promise.all(v)}for(let v of e?.executionProviders??[])if((typeof v=="string"?v:v.name)==="webnn"){if(o.currentContext)throw new Error("WebNN execution provider is already set.");if(typeof v!="string"){let $=v,P=$?.context,E=$?.gpuDevice,N=$?.deviceType,z=$?.numThreads,q=$?.powerPreference;P?o.currentContext=P:E?o.currentContext=await navigator.ml.createContext(E):o.currentContext=await navigator.ml.createContext({deviceType:N,numThreads:z,powerPreference:q})}else o.currentContext=await navigator.ml.createContext();break}i=await o._OrtCreateSession(n,t,s),i===0&&Ue("Can't create a session."),o.currentContext&&(o.currentContext=void 0);let[c,p]=FI(i),b=!!e?.enableGraphCapture,h=[],g=[],T=[];for(let v=0;vv==="gpu-buffer")&&(a=o._OrtCreateBinding(i),a===0&&Ue("Can't create IO binding."),w={handle:a,outputPreferredLocations:T,outputPreferredLocationsEncoded:T.map(v=>zs(v))}),Qr.set(i,[i,l,f,w,b,!1]),[i,h,g]}catch(c){throw l.forEach(p=>o._OrtFree(p)),f.forEach(p=>o._OrtFree(p)),a!==0&&o._OrtReleaseBinding(a),i!==0&&o._OrtReleaseSession(i),c}finally{o._free(n),s!==0&&o._OrtReleaseSessionOptions(s),u.forEach(c=>o._free(c)),o.unmountExternalData?.()}},vi=r=>{let e=Ye(),n=Qr.get(r);if(!n)throw new Error(`cannot release session. invalid session id: ${r}`);let[t,o,i,s,a]=n;s&&(a&&e._OrtClearBoundOutputs(s.handle),e._OrtReleaseBinding(s.handle)),e.jsepOnReleaseSession?.(r),o.forEach(u=>e._OrtFree(u)),i.forEach(u=>e._OrtFree(u)),e._OrtReleaseSession(t),Qr.delete(r)},_x=(r,e,n,t,o,i=!1)=>{if(!r){e.push(0);return}let s=Ye(),a=r[0],u=r[1],l=r[3],f,c;if(a==="string"&&l==="gpu-buffer")throw new Error("String tensor is not supported on GPU.");if(i&&l!=="gpu-buffer")throw new Error(`External buffer must be provided for input/output index ${o} when enableGraphCapture is true.`);if(l==="gpu-buffer"){let h=r[2].gpuBuffer,g=Kr(Ns(a));c=u.reduce((w,v)=>w*v,1)*g;let T=s.jsepRegisterBuffer;if(!T)throw new Error('Tensor location "gpu-buffer" is not supported without using WebGPU.');f=T(t,o,h,c)}else{let h=r[2];if(Array.isArray(h)){c=4*h.length,f=s._malloc(c),n.push(f);let g=f/4;for(let T=0;Ts.HEAP32[h++]=T);let g=s._OrtCreateTensor(Ns(a),f,c,b,u.length,zs(l));g===0&&Ue(`Can't create tensor for input/output. session=${t}, index=${o}.`),e.push(g)}finally{s.stackRestore(p)}},wi=async(r,e,n,t,o,i)=>{let s=Ye(),a=Qr.get(r);if(!a)throw new Error(`cannot run inference. invalid session id: ${r}`);let u=a[0],l=a[1],f=a[2],c=a[3],p=a[4],b=a[5],h=e.length,g=t.length,T=0,w=[],v=[],S=[],$=[],P=s.stackSave(),E=s.stackAlloc(h*4),N=s.stackAlloc(h*4),z=s.stackAlloc(g*4),q=s.stackAlloc(g*4);try{[T,w]=Ch(i);for(let Q=0;Qmt*rt,1);pe=Ar(ie);let tn=c?.outputPreferredLocations[t[Q]];if(pe==="string"){if(tn==="gpu-buffer")throw new Error("String tensor is not supported on GPU.");let mt=[],rt=ce/4;for(let jt=0;jt0){let mt=s.jsepGetBuffer;if(!mt)throw new Error('preferredLocation "gpu-buffer" is not supported without using WebGPU.');let rt=mt(ce),jt=Kr(ie);if(jt===void 0||!Ai(pe))throw new Error(`Unsupported data type: ${pe}`);se=!0,qe.push([pe,Fe,{gpuBuffer:rt,download:s.jsepCreateDownloader(rt,je*jt,pe),dispose:()=>{s._OrtReleaseTensor(ge)}},"gpu-buffer"])}else{let mt=$i(pe),rt=new mt(je);new Uint8Array(rt.buffer,rt.byteOffset,rt.byteLength).set(s.HEAPU8.subarray(ce,ce+rt.byteLength)),qe.push([pe,Fe,rt,"cpu"])}}finally{s.stackRestore(Ie),pe==="string"&&ce&&s._free(ce),se||s._OrtReleaseTensor(ge)}}return c&&!p&&(s._OrtClearBoundOutputs(c.handle),Qr.set(r,[u,l,f,c,p,!1])),qe}finally{s.stackRestore(P),v.forEach(j=>s._OrtReleaseTensor(j)),S.forEach(j=>s._OrtReleaseTensor(j)),$.forEach(j=>s._free(j)),T!==0&&s._OrtReleaseRunOptions(T),w.forEach(j=>s._free(j))}},Ti=r=>{let e=Ye(),n=Qr.get(r);if(!n)throw new Error("invalid session id");let t=n[0],o=e._OrtEndProfiling(t);o===0&&Ue("Can't get an profile file name."),e._OrtFree(o)},_i=r=>{let e=[];for(let n of r){let t=n[2];!Array.isArray(t)&&"buffer"in t&&e.push(t.buffer)}return e}});var en,Rt,ro,Yi,Ji,Zi,bu,yu,$n,An,VI,Ix,Sx,$x,Ax,Px,Ox,Ex,xu=C(()=>{"use strict";ft();Ds();jr();Hn();en=()=>!!le.wasm.proxy&&typeof document<"u",ro=!1,Yi=!1,Ji=!1,yu=new Map,$n=(r,e)=>{let n=yu.get(r);n?n.push(e):yu.set(r,[e])},An=()=>{if(ro||!Yi||Ji||!Rt)throw new Error("worker not ready")},VI=r=>{switch(r.data.type){case"init-wasm":ro=!1,r.data.err?(Ji=!0,bu[1](r.data.err)):(Yi=!0,bu[0]()),Zi&&(URL.revokeObjectURL(Zi),Zi=void 0);break;case"init-ep":case"copy-from":case"create":case"release":case"run":case"end-profiling":{let e=yu.get(r.data.type);r.data.err?e.shift()[1](r.data.err):e.shift()[0](r.data.out);break}default:}},Ix=async()=>{if(!Yi){if(ro)throw new Error("multiple calls to 'initWasm()' detected.");if(Ji)throw new Error("previous call to 'initWasm()' failed.");if(ro=!0,en())return new Promise((r,e)=>{Rt?.terminate(),Ph().then(([n,t])=>{try{Rt=t,Rt.onerror=i=>e(i),Rt.onmessage=VI,bu=[r,e];let o={type:"init-wasm",in:le};Rt.postMessage(o),Zi=n}catch(o){e(o)}},e)});try{await gi(le.wasm),await bi(le),Yi=!0}catch(r){throw Ji=!0,r}finally{ro=!1}}},Sx=async r=>{if(en())return An(),new Promise((e,n)=>{$n("init-ep",[e,n]);let t={type:"init-ep",in:{epName:r,env:le}};Rt.postMessage(t)});await yi(le,r)},$x=async r=>en()?(An(),new Promise((e,n)=>{$n("copy-from",[e,n]);let t={type:"copy-from",in:{buffer:r}};Rt.postMessage(t,[r.buffer])})):qn(r),Ax=async(r,e)=>{if(en()){if(e?.preferredOutputLocation)throw new Error('session option "preferredOutputLocation" is not supported for proxy.');return An(),new Promise((n,t)=>{$n("create",[n,t]);let o={type:"create",in:{model:r,options:{...e}}},i=[];r instanceof Uint8Array&&i.push(r.buffer),Rt.postMessage(o,i)})}else return xi(r,e)},Px=async r=>{if(en())return An(),new Promise((e,n)=>{$n("release",[e,n]);let t={type:"release",in:r};Rt.postMessage(t)});vi(r)},Ox=async(r,e,n,t,o,i)=>{if(en()){if(n.some(s=>s[3]!=="cpu"))throw new Error("input tensor on GPU is not supported for proxy.");if(o.some(s=>s))throw new Error("pre-allocated output tensor is not supported for proxy.");return An(),new Promise((s,a)=>{$n("run",[s,a]);let u=n,l={type:"run",in:{sessionId:r,inputIndices:e,inputs:u,outputIndices:t,options:i}};Rt.postMessage(l,_i(u))})}else return wi(r,e,n,t,o,i)},Ex=async r=>{if(en())return An(),new Promise((e,n)=>{$n("end-profiling",[e,n]);let t={type:"end-profiling",in:r};Rt.postMessage(t)});Ti(r)}});var Cx,GI,Qi,kx=C(()=>{"use strict";ft();xu();ue();hi();Fs();Cx=(r,e)=>{switch(r.location){case"cpu":return[r.type,r.dims,r.data,"cpu"];case"gpu-buffer":return[r.type,r.dims,{gpuBuffer:r.gpuBuffer},"gpu-buffer"];default:throw new Error(`invalid data location: ${r.location} for ${e()}`)}},GI=r=>{switch(r[3]){case"cpu":return new it(r[0],r[2],r[1]);case"gpu-buffer":{let e=r[0];if(!Ai(e))throw new Error(`not supported data type: ${e} for deserializing GPU tensor`);let{gpuBuffer:n,download:t,dispose:o}=r[2];return it.fromGpuBuffer(n,{dataType:e,dims:r[1],download:t,dispose:o})}default:throw new Error(`invalid data location: ${r[3]}`)}},Qi=class{async fetchModelAndCopyToWasmMemory(e){return $x(await Xn(e))}async loadModel(e,n){St();let t;typeof e=="string"?!1?t=await Xn(e):t=await this.fetchModelAndCopyToWasmMemory(e):t=e,[this.sessionId,this.inputNames,this.outputNames]=await Ax(t,n),yt()}async dispose(){return Px(this.sessionId)}async run(e,n,t){St();let o=[],i=[];Object.entries(e).forEach(p=>{let b=p[0],h=p[1],g=this.inputNames.indexOf(b);if(g===-1)throw new Error(`invalid input '${b}'`);o.push(h),i.push(g)});let s=[],a=[];Object.entries(n).forEach(p=>{let b=p[0],h=p[1],g=this.outputNames.indexOf(b);if(g===-1)throw new Error(`invalid output '${b}'`);s.push(h),a.push(g)});let u=o.map((p,b)=>Cx(p,()=>`input "${this.inputNames[i[b]]}"`)),l=s.map((p,b)=>p?Cx(p,()=>`output "${this.outputNames[a[b]]}"`):null),f=await Ox(this.sessionId,i,u,a,l,t),c={};for(let p=0;p{"use strict";ft();xu();kx();Hn();UI=()=>{if((typeof le.wasm.initTimeout!="number"||le.wasm.initTimeout<0)&&(le.wasm.initTimeout=0),le.wasm.simd===!1&&console.warn('Deprecated property "env.wasm.simd" is set to false. non-SIMD build is no longer provided, and this setting will be ignored.'),typeof le.wasm.proxy!="boolean"&&(le.wasm.proxy=!1),typeof le.wasm.trace!="boolean"&&(le.wasm.trace=!1),typeof le.wasm.numThreads!="number"||!Number.isInteger(le.wasm.numThreads)||le.wasm.numThreads<=0)if(typeof self<"u"&&!self.crossOriginIsolated)le.wasm.numThreads=1;else{let r=typeof navigator>"u"?_a("node:os").cpus().length:navigator.hardwareConcurrency;le.wasm.numThreads=Math.min(4,Math.ceil((r||1)/2))}},ea=class{async init(e){UI(),await Ix(),await Sx(e)}async createInferenceSessionHandler(e,n){let t=new Qi;return await t.loadModel(e,n),Promise.resolve(t)}}});var Bx={};un(Bx,{wasmBackend:()=>WI});var WI,Lx=C(()=>{"use strict";Dx();WI=new ea});ft();ft();ft();var mc="1.19.0";var QM=Aa;{let r=(xh(),Pn(yh)).onnxjsBackend;vr("webgl",r,-10)}{let r=(Lx(),Pn(Bx)).wasmBackend;vr("webgpu",r,5),vr("webnn",r,5),vr("cpu",r,10),vr("wasm",r,10)}Object.defineProperty(le.versions,"web",{value:mc,enumerable:!0});export{av as InferenceSession,_o as TRACE,St as TRACE_FUNC_BEGIN,yt as TRACE_FUNC_END,it as Tensor,uv as TrainingSession,QM as default,le as env,vr as registerBackend}; /** * @license * Copyright 2021 Google LLC. All Rights Reserved. diff --git a/assets/dist/ort.all.bundle.min.mjs.map b/assets/dist/ort.all.bundle.min.mjs.map index 6272ec8..eccbc1e 100644 --- a/assets/dist/ort.all.bundle.min.mjs.map +++ b/assets/dist/ort.all.bundle.min.mjs.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../common/lib/backend-impl.ts", "../../common/lib/backend.ts", "../../common/lib/version.ts", "../../common/lib/env-impl.ts", "../../common/lib/env.ts", "../../common/lib/tensor-conversion-impl.ts", "../../common/lib/tensor-factory-impl.ts", "../../common/lib/tensor-impl-type-mapping.ts", "../../common/lib/tensor-utils-impl.ts", "../../common/lib/tensor-impl.ts", "../../common/lib/tensor.ts", "../../common/lib/trace.ts", "../../common/lib/inference-session-impl.ts", "../../common/lib/inference-session.ts", "../../common/lib/tensor-conversion.ts", "../../common/lib/tensor-factory.ts", "../../common/lib/onnx-model.ts", "../../common/lib/onnx-value.ts", "../../common/lib/training-session-impl.ts", "../../common/lib/training-session.ts", "../../common/lib/index.ts", "../lib/onnxjs/instrument.ts", "../lib/onnxjs/opset.ts", "../node_modules/guid-typescript/dist/guid.js", "../node_modules/long/index.js", "../node_modules/flatbuffers/js/flatbuffers.mjs", "../lib/onnxjs/ort-schema/flatbuffers/ort-generated.ts", "../node_modules/@protobufjs/aspromise/index.js", "../node_modules/@protobufjs/base64/index.js", "../node_modules/@protobufjs/eventemitter/index.js", "../node_modules/@protobufjs/float/index.js", "../node_modules/@protobufjs/inquire/index.js", "../node_modules/@protobufjs/utf8/index.js", "../node_modules/@protobufjs/pool/index.js", "../node_modules/protobufjs/src/util/longbits.js", "../node_modules/protobufjs/src/util/minimal.js", "../node_modules/protobufjs/src/writer.js", "../node_modules/protobufjs/src/writer_buffer.js", "../node_modules/protobufjs/src/reader.js", "../node_modules/protobufjs/src/reader_buffer.js", "../node_modules/protobufjs/src/rpc/service.js", "../node_modules/protobufjs/src/rpc.js", "../node_modules/protobufjs/src/roots.js", "../node_modules/protobufjs/src/index-minimal.js", "../node_modules/protobufjs/minimal.js", "../lib/onnxjs/ort-schema/protobuf/onnx.js", "../lib/onnxjs/util.ts", "../lib/onnxjs/tensor.ts", "../lib/onnxjs/backends/webgl/glsl-source.ts", "../lib/onnxjs/backends/webgl/types.ts", "../lib/onnxjs/backends/webgl/utils.ts", "../lib/onnxjs/backends/webgl/ops/packing-utils.ts", "../lib/onnxjs/backends/webgl/ops/pack.ts", "../lib/onnxjs/backends/webgl/ops/reshape-packed.ts", "../lib/onnxjs/backends/webgl/ops/uint8-encode.ts", "../lib/onnxjs/backends/webgl/ops/unpack.ts", "../lib/onnxjs/backends/webgl/texture-data-encoder.ts", "../lib/onnxjs/backends/webgl/texture-layout.ts", "../lib/onnxjs/backends/webgl/inference-handler.ts", "../lib/onnxjs/attribute-with-cache-key.ts", "../lib/onnxjs/backends/webgl/ops/batch-normalization.ts", "../lib/onnxjs/backends/webgl/glsl-definitions.ts", "../lib/onnxjs/backends/webgl/ops/binary-op.ts", "../lib/onnxjs/backends/webgl/ops/cast.ts", "../lib/onnxjs/backends/webgl/ops/concat-packed.ts", "../lib/onnxjs/backends/webgl/ops/concat.ts", "../lib/onnxjs/backends/webgl/ops/unary-op.ts", "../lib/onnxjs/backends/webgl/ops/fuse-utils.ts", "../lib/onnxjs/backends/webgl/ops/conv-grouped.ts", "../lib/onnxjs/backends/webgl/ops/im2col-pack.ts", "../lib/onnxjs/backends/webgl/ops/matmul.ts", "../lib/onnxjs/backends/webgl/ops/matmul-pack.ts", "../lib/onnxjs/backends/webgl/ops/conv-pack.ts", "../lib/onnxjs/backends/webgl/ops/im2col.ts", "../lib/onnxjs/backends/webgl/ops/dot-product.ts", "../lib/onnxjs/backends/webgl/ops/conv.ts", "../lib/onnxjs/backends/webgl/ops/conv-transpose.ts", "../lib/onnxjs/backends/webgl/ops/transpose.ts", "../lib/onnxjs/backends/webgl/ops/depth-to-space.ts", "../lib/onnxjs/backends/webgl/ops/flatten.ts", "../lib/onnxjs/operators.ts", "../lib/onnxjs/backends/webgl/ops/gather.ts", "../lib/onnxjs/backends/webgl/ops/gemm.ts", "../lib/onnxjs/backends/webgl/ops/image-scaler.ts", "../lib/onnxjs/backends/webgl/ops/instance-normalization.ts", "../lib/onnxjs/backends/webgl/ops/lrn.ts", "../lib/onnxjs/backends/webgl/ops/pad.ts", "../lib/onnxjs/backends/webgl/ops/pool.ts", "../lib/onnxjs/backends/webgl/ops/reduce.ts", "../lib/onnxjs/backends/webgl/ops/reshape.ts", "../lib/onnxjs/backends/webgl/ops/upsample.ts", "../lib/onnxjs/backends/webgl/ops/resize-packed.ts", "../lib/onnxjs/backends/webgl/ops/shape.ts", "../lib/onnxjs/backends/webgl/ops/slice.ts", "../lib/onnxjs/backends/webgl/ops/softmax.ts", "../lib/onnxjs/backends/webgl/ops/split.ts", "../lib/onnxjs/backends/webgl/ops/squeeze.ts", "../lib/onnxjs/backends/webgl/ops/sum.ts", "../lib/onnxjs/backends/webgl/ops/tile.ts", "../lib/onnxjs/backends/webgl/ops/unsqueeze.ts", "../lib/onnxjs/backends/webgl/op-resolve-rules.ts", "../lib/onnxjs/backends/webgl/glsl-function-inliner.ts", "../lib/onnxjs/backends/webgl/texture-layout-strategy.ts", "../lib/onnxjs/backends/webgl/glsl-coordinate-lib.ts", "../lib/onnxjs/backends/webgl/glsl-encoding-lib.ts", "../lib/onnxjs/backends/webgl/glsl-fragcolor-lib.ts", "../lib/onnxjs/backends/webgl/glsl-shape-utils-lib.ts", "../lib/onnxjs/backends/webgl/glsl-vec-lib.ts", "../lib/onnxjs/backends/webgl/glsl-registered-libs.ts", "../lib/onnxjs/backends/webgl/glsl-preprocessor.ts", "../lib/onnxjs/backends/webgl/program-manager.ts", "../lib/onnxjs/backends/webgl/texture-manager.ts", "../lib/onnxjs/backends/webgl/session-handler.ts", "../lib/onnxjs/backends/webgl/webgl-context.ts", "../lib/onnxjs/backends/webgl/webgl-context-factory.ts", "../lib/onnxjs/backends/backend-webgl.ts", "../lib/onnxjs/backend.ts", "../lib/onnxjs/execution-plan.ts", "../lib/onnxjs/attribute.ts", "../lib/onnxjs/graph.ts", "../lib/onnxjs/model.ts", "../lib/onnxjs/session.ts", "../lib/onnxjs/session-handler-inference.ts", "../lib/backend-onnxjs.ts", "../lib/wasm/wasm-utils-env.ts", "../lib/wasm/proxy-worker/main.ts", "ort-wasm-simd-threaded.jsep.mjs", "../lib/wasm/wasm-utils-import.ts", "../lib/wasm/wasm-factory.ts", "../lib/wasm/wasm-utils.ts", "../lib/wasm/run-options.ts", "../lib/wasm/session-options.ts", "../lib/wasm/wasm-common.ts", "../lib/wasm/wasm-utils-load-file.ts", "../lib/wasm/jsep/log.ts", "../lib/wasm/jsep/tensor-view.ts", "../lib/wasm/jsep/webgpu/types.ts", "../lib/wasm/jsep/webgpu/gpu-data-manager.ts", "../lib/wasm/jsep/webgpu/attribute-with-cache-key.ts", "../lib/wasm/jsep/util.ts", "../lib/wasm/jsep/webgpu/ops/common.ts", "../lib/wasm/jsep/webgpu/ops/transpose.ts", "../lib/wasm/jsep/webgpu/ops/reduce-shared.ts", "../lib/wasm/jsep/webgpu/ops/reduce.ts", "../lib/wasm/jsep/webgpu/ops/argminmax.ts", "../lib/wasm/jsep/webgpu/ops/attention.ts", "../lib/wasm/jsep/webgpu/ops/batch-norm.ts", "../lib/wasm/jsep/webgpu/ops/bias-add.ts", "../lib/wasm/jsep/webgpu/ops/unary-op.ts", "../lib/wasm/jsep/webgpu/ops/bias-split-gelu.ts", "../lib/wasm/jsep/webgpu/ops/binary-op.ts", "../lib/wasm/jsep/webgpu/ops/concat.ts", "../lib/wasm/jsep/webgpu/ops/fuse-utils.ts", "../lib/wasm/jsep/webgpu/ops/3rd-party/activation_util.ts", "../lib/wasm/jsep/webgpu/ops/3rd-party/conv_util.ts", "../lib/wasm/jsep/webgpu/ops/3rd-party/matmul_packed_webgpu.ts", "../lib/wasm/jsep/webgpu/ops/3rd-party/conv2d_mm_webgpu.ts", "../lib/wasm/jsep/webgpu/ops/3rd-party/conv3d_naive_webgpu.ts", "../lib/wasm/jsep/webgpu/ops/conv-grouped.ts", "../lib/wasm/jsep/webgpu/ops/matmul.ts", "../lib/wasm/jsep/webgpu/ops/conv.ts", "../lib/wasm/jsep/webgpu/ops/3rd-party/conv_backprop_mm_webgpu.ts", "../lib/wasm/jsep/webgpu/ops/3rd-party/conv_backprop_webgpu.ts", "../lib/wasm/jsep/webgpu/ops/conv-transpose.ts", "../lib/wasm/jsep/webgpu/ops/cumsum.ts", "../lib/wasm/jsep/webgpu/ops/depth-to-space.ts", "../lib/wasm/jsep/webgpu/ops/einsum.ts", "../lib/wasm/jsep/webgpu/ops/expand.ts", "../lib/wasm/jsep/webgpu/ops/fast-gelu.ts", "../lib/wasm/jsep/webgpu/ops/gather.ts", "../lib/wasm/jsep/webgpu/ops/gather-elements.ts", "../lib/wasm/jsep/webgpu/ops/gemm.ts", "../lib/wasm/jsep/webgpu/ops/multihead-attention.ts", "../lib/wasm/jsep/webgpu/ops/tile.ts", "../lib/wasm/jsep/webgpu/ops/group-query-attention.ts", "../lib/wasm/jsep/webgpu/ops/instance-norm.ts", "../lib/wasm/jsep/webgpu/ops/layer-norm.ts", "../lib/wasm/jsep/webgpu/ops/matmulnbits.ts", "../lib/wasm/jsep/webgpu/ops/pad.ts", "../lib/wasm/jsep/webgpu/ops/pool.ts", "../lib/wasm/jsep/webgpu/ops/range.ts", "../lib/wasm/jsep/webgpu/ops/resize.ts", "../lib/wasm/jsep/webgpu/ops/rotary-embedding.ts", "../lib/wasm/jsep/webgpu/ops/skip-layer-norm.ts", "../lib/wasm/jsep/webgpu/ops/slice.ts", "../lib/wasm/jsep/webgpu/ops/softmax.ts", "../lib/wasm/jsep/webgpu/ops/split.ts", "../lib/wasm/jsep/webgpu/ops/where.ts", "../lib/wasm/jsep/webgpu/op-resolve-rules.ts", "../lib/wasm/jsep/webgpu/program-manager.ts", "../lib/wasm/jsep/backend-webgpu.ts", "../lib/wasm/jsep/init.ts", "../lib/wasm/wasm-core-impl.ts", "../lib/wasm/proxy-wrapper.ts", "../lib/wasm/session-handler-inference.ts", "../lib/backend-wasm.ts", "../lib/backend-wasm-inference.ts", "../lib/index.ts", "../lib/version.ts"], - "sourcesContent": ["// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Backend} from './backend.js';\nimport {InferenceSession} from './inference-session.js';\n\ninterface BackendInfo {\n backend: Backend;\n priority: number;\n\n initPromise?: Promise;\n initialized?: boolean;\n aborted?: boolean;\n error?: string;\n}\n\nconst backends: Map = new Map();\nconst backendsSortedByPriority: string[] = [];\n\n/**\n * Register a backend.\n *\n * @param name - the name as a key to lookup as an execution provider.\n * @param backend - the backend object.\n * @param priority - an integer indicating the priority of the backend. Higher number means higher priority. if priority\n * < 0, it will be considered as a 'beta' version and will not be used as a fallback backend by default.\n *\n * @ignore\n */\nexport const registerBackend = (name: string, backend: Backend, priority: number): void => {\n if (backend && typeof backend.init === 'function' && typeof backend.createInferenceSessionHandler === 'function') {\n const currentBackend = backends.get(name);\n if (currentBackend === undefined) {\n backends.set(name, {backend, priority});\n } else if (currentBackend.priority > priority) {\n // same name is already registered with a higher priority. skip registeration.\n return;\n } else if (currentBackend.priority === priority) {\n if (currentBackend.backend !== backend) {\n throw new Error(`cannot register backend \"${name}\" using priority ${priority}`);\n }\n }\n\n if (priority >= 0) {\n const i = backendsSortedByPriority.indexOf(name);\n if (i !== -1) {\n backendsSortedByPriority.splice(i, 1);\n }\n\n for (let i = 0; i < backendsSortedByPriority.length; i++) {\n if (backends.get(backendsSortedByPriority[i])!.priority <= priority) {\n backendsSortedByPriority.splice(i, 0, name);\n return;\n }\n }\n backendsSortedByPriority.push(name);\n }\n return;\n }\n\n throw new TypeError('not a valid backend');\n};\n\n/**\n * Try to resolve and initialize a backend.\n *\n * @param backendName - the name of the backend.\n * @returns the backend instance if resolved and initialized successfully, or an error message if failed.\n */\nconst tryResolveAndInitializeBackend = async(backendName: string): Promise => {\n const backendInfo = backends.get(backendName);\n if (!backendInfo) {\n return 'backend not found.';\n }\n\n if (backendInfo.initialized) {\n return backendInfo.backend;\n } else if (backendInfo.aborted) {\n return backendInfo.error!;\n } else {\n const isInitializing = !!backendInfo.initPromise;\n try {\n if (!isInitializing) {\n backendInfo.initPromise = backendInfo.backend.init(backendName);\n }\n await backendInfo.initPromise;\n backendInfo.initialized = true;\n return backendInfo.backend;\n } catch (e) {\n if (!isInitializing) {\n backendInfo.error = `${e}`;\n backendInfo.aborted = true;\n }\n return backendInfo.error!;\n } finally {\n delete backendInfo.initPromise;\n }\n }\n};\n\n/**\n * Resolve execution providers from the specific session options.\n *\n * @param options - the session options object.\n * @returns a promise that resolves to a tuple of an initialized backend instance and a session options object with\n * filtered EP list.\n *\n * @ignore\n */\nexport const resolveBackendAndExecutionProviders = async(options: InferenceSession.SessionOptions):\n Promise<[backend: Backend, options: InferenceSession.SessionOptions]> => {\n // extract backend hints from session options\n const eps = options.executionProviders || [];\n const backendHints = eps.map(i => typeof i === 'string' ? i : i.name);\n const backendNames = backendHints.length === 0 ? backendsSortedByPriority : backendHints;\n\n // try to resolve and initialize all requested backends\n let backend: Backend|undefined;\n const errors = [];\n const availableBackendNames = new Set();\n for (const backendName of backendNames) {\n const resolveResult = await tryResolveAndInitializeBackend(backendName);\n if (typeof resolveResult === 'string') {\n errors.push({name: backendName, err: resolveResult});\n } else {\n if (!backend) {\n backend = resolveResult;\n }\n if (backend === resolveResult) {\n availableBackendNames.add(backendName);\n }\n }\n }\n\n // if no backend is available, throw error.\n if (!backend) {\n throw new Error(`no available backend found. ERR: ${errors.map(e => `[${e.name}] ${e.err}`).join(', ')}`);\n }\n\n // for each explicitly requested backend, if it's not available, output warning message.\n for (const {name, err} of errors) {\n if (backendHints.includes(name)) {\n // eslint-disable-next-line no-console\n console.warn(`removing requested execution provider \"${\n name}\" from session options because it is not available: ${err}`);\n }\n }\n\n const filteredEps = eps.filter(i => availableBackendNames.has(typeof i === 'string' ? i : i.name));\n\n return [\n backend, new Proxy(options, {\n get: (target, prop) => {\n if (prop === 'executionProviders') {\n return filteredEps;\n }\n return Reflect.get(target, prop);\n }\n })\n ];\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession} from './inference-session.js';\nimport {OnnxValue} from './onnx-value.js';\nimport {TrainingSession} from './training-session.js';\n\n/**\n * @ignore\n */\nexport declare namespace SessionHandler {\n type FeedsType = {[name: string]: OnnxValue};\n type FetchesType = {[name: string]: OnnxValue | null};\n type ReturnType = {[name: string]: OnnxValue};\n}\n\n/**\n * Represents shared SessionHandler functionality\n *\n * @ignore\n */\ninterface SessionHandler {\n dispose(): Promise;\n\n readonly inputNames: readonly string[];\n readonly outputNames: readonly string[];\n}\n\n/**\n * Represent a handler instance of an inference session.\n *\n * @ignore\n */\nexport interface InferenceSessionHandler extends SessionHandler {\n startProfiling(): void;\n endProfiling(): void;\n\n run(feeds: SessionHandler.FeedsType, fetches: SessionHandler.FetchesType,\n options: InferenceSession.RunOptions): Promise;\n}\n\n/**\n * Represent a handler instance of a training inference session.\n *\n * @ignore\n */\nexport interface TrainingSessionHandler extends SessionHandler {\n readonly evalInputNames: readonly string[];\n readonly evalOutputNames: readonly string[];\n\n lazyResetGrad(): Promise;\n runTrainStep(\n feeds: SessionHandler.FeedsType, fetches: SessionHandler.FetchesType,\n options: InferenceSession.RunOptions): Promise;\n runOptimizerStep(options: InferenceSession.RunOptions): Promise;\n runEvalStep(\n feeds: SessionHandler.FeedsType, fetches: SessionHandler.FetchesType,\n options: InferenceSession.RunOptions): Promise;\n\n getParametersSize(trainableOnly: boolean): Promise;\n loadParametersBuffer(buffer: Uint8Array, trainableOnly: boolean): Promise;\n getContiguousParameters(trainableOnly: boolean): Promise;\n}\n\n/**\n * Represent a backend that provides implementation of model inferencing.\n *\n * @ignore\n */\nexport interface Backend {\n /**\n * Initialize the backend asynchronously. Should throw when failed.\n */\n init(backendName: string): Promise;\n\n createInferenceSessionHandler(uriOrBuffer: string|Uint8Array, options?: InferenceSession.SessionOptions):\n Promise;\n\n createTrainingSessionHandler?\n (checkpointStateUriOrBuffer: TrainingSession.UriOrBuffer, trainModelUriOrBuffer: TrainingSession.UriOrBuffer,\n evalModelUriOrBuffer: TrainingSession.UriOrBuffer, optimizerModelUriOrBuffer: TrainingSession.UriOrBuffer,\n options: InferenceSession.SessionOptions): Promise;\n}\n\nexport {registerBackend} from './backend-impl.js';\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// This file is generated by /js/scripts/update-version.ts\n// Do not modify file content manually.\n\nexport const version = '1.19.0';\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from './env.js';\nimport {version} from './version.js';\n\ntype LogLevelType = Env['logLevel'];\n\nlet logLevelValue: Required = 'warning';\n\nexport const env: Env = {\n wasm: {} as Env.WebAssemblyFlags,\n webgl: {} as Env.WebGLFlags,\n webgpu: {} as Env.WebGpuFlags,\n versions: {common: version},\n\n set logLevel(value: LogLevelType) {\n if (value === undefined) {\n return;\n }\n if (typeof value !== 'string' || ['verbose', 'info', 'warning', 'error', 'fatal'].indexOf(value) === -1) {\n throw new Error(`Unsupported logging level: ${value}`);\n }\n logLevelValue = value;\n },\n get logLevel(): Required {\n return logLevelValue;\n },\n};\n\n// set property 'logLevel' so that they can be correctly transferred to worker by `postMessage()`.\nObject.defineProperty(env, 'logLevel', {enumerable: true});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env as envImpl} from './env-impl.js';\n\nexport declare namespace Env {\n export type WasmPathPrefix = string;\n export interface WasmFilePaths {\n /**\n * Specify the override path for the main .wasm file.\n *\n * This path should be an absolute path.\n *\n * If not modified, the filename of the .wasm file is:\n * - `ort-wasm-simd-threaded.wasm` for default build\n * - `ort-wasm-simd-threaded.jsep.wasm` for JSEP build (with WebGPU and WebNN)\n * - `ort-training-wasm-simd-threaded.wasm` for training build\n */\n wasm?: URL|string;\n /**\n * Specify the override path for the main .mjs file.\n *\n * This path should be an absolute path.\n *\n * If not modified, the filename of the .mjs file is:\n * - `ort-wasm-simd-threaded.mjs` for default build\n * - `ort-wasm-simd-threaded.jsep.mjs` for JSEP build (with WebGPU and WebNN)\n * - `ort-training-wasm-simd-threaded.mjs` for training build\n */\n mjs?: URL|string;\n }\n export type WasmPrefixOrFilePaths = WasmPathPrefix|WasmFilePaths;\n export interface WebAssemblyFlags {\n /**\n * set or get number of thread(s). If omitted or set to 0, number of thread(s) will be determined by system. If set\n * to 1, no worker thread will be spawned.\n *\n * This setting is available only when WebAssembly multithread feature is available in current context.\n *\n * @defaultValue `0`\n */\n numThreads?: number;\n\n /**\n * set or get a boolean value indicating whether to enable SIMD. If set to false, SIMD will be forcely disabled.\n *\n * This setting is available only when WebAssembly SIMD feature is available in current context.\n *\n * @deprecated This property is deprecated. Since SIMD is supported by all major JavaScript engines, non-SIMD\n * build is no longer provided. This property will be removed in future release.\n * @defaultValue `true`\n */\n simd?: boolean;\n\n /**\n * set or get a boolean value indicating whether to enable trace.\n *\n * @deprecated Use `env.trace` instead. If `env.trace` is set, this property will be ignored.\n * @defaultValue `false`\n */\n trace?: boolean;\n\n /**\n * Set or get a number specifying the timeout for initialization of WebAssembly backend, in milliseconds. A zero\n * value indicates no timeout is set.\n *\n * @defaultValue `0`\n */\n initTimeout?: number;\n\n /**\n * Set a custom URL prefix to the .wasm/.mjs files, or an object of overrides for both .wasm/.mjs file. The override\n * path should be an absolute path.\n */\n wasmPaths?: WasmPrefixOrFilePaths;\n\n /**\n * Set or get a boolean value indicating whether to proxy the execution of main thread to a worker thread.\n *\n * @defaultValue `false`\n */\n proxy?: boolean;\n }\n\n export interface WebGLFlags {\n /**\n * Set or get the WebGL Context ID (webgl or webgl2).\n *\n * @defaultValue `'webgl2'`\n */\n contextId?: 'webgl'|'webgl2';\n /**\n * Get the WebGL rendering context.\n */\n readonly context: WebGLRenderingContext;\n /**\n * Set or get the maximum batch size for matmul. 0 means to disable batching.\n *\n * @deprecated\n */\n matmulMaxBatchSize?: number;\n /**\n * Set or get the texture cache mode.\n *\n * @defaultValue `'full'`\n */\n textureCacheMode?: 'initializerOnly'|'full';\n /**\n * Set or get the packed texture mode\n *\n * @defaultValue `false`\n */\n pack?: boolean;\n /**\n * Set or get whether enable async download.\n *\n * @defaultValue `false`\n */\n async?: boolean;\n }\n\n export interface WebGpuProfilingDataV1TensorMetadata {\n dims: readonly number[];\n dataType: string;\n }\n export interface WebGpuProfilingDataV1 {\n version: 1;\n inputsMetadata: readonly WebGpuProfilingDataV1TensorMetadata[];\n outputsMetadata: readonly WebGpuProfilingDataV1TensorMetadata[];\n kernelId: number;\n kernelType: string;\n kernelName: string;\n programName: string;\n startTime: number;\n endTime: number;\n }\n\n export type WebGpuProfilingData = WebGpuProfilingDataV1;\n\n export interface WebGpuFlags {\n /**\n * Set or get the profiling mode.\n *\n * @deprecated Use `env.webgpu.profiling.mode` instead. If `env.webgpu.profiling.mode` is set, this property will be\n * ignored.\n */\n profilingMode?: 'off'|'default';\n /**\n * Set or get the profiling configuration.\n */\n profiling?: {\n /**\n * Set or get the profiling mode.\n *\n * @defaultValue `'off'`\n */\n mode?: 'off'|'default';\n\n /**\n * Set or get a callback function when a profiling data is received. If not set, the profiling data will be\n * printed to console.\n */\n ondata?: (data: WebGpuProfilingData) => void;\n };\n /**\n * Set or get the power preference.\n *\n * Setting this property only has effect before the first WebGPU inference session is created. The value will be\n * used as options for `navigator.gpu.requestAdapter()`.\n *\n * See {@link https://gpuweb.github.io/gpuweb/#dictdef-gpurequestadapteroptions} for more details.\n *\n * @defaultValue `undefined`\n */\n powerPreference?: 'low-power'|'high-performance';\n /**\n * Set or get the force fallback adapter flag.\n *\n * Setting this property only has effect before the first WebGPU inference session is created. The value will be\n * used as options for `navigator.gpu.requestAdapter()`.\n *\n * See {@link https://gpuweb.github.io/gpuweb/#dictdef-gpurequestadapteroptions} for more details.\n *\n * @defaultValue `undefined`\n */\n forceFallbackAdapter?: boolean;\n /**\n * Set or get the adapter for WebGPU.\n *\n * Setting this property only has effect before the first WebGPU inference session is created. The value will be\n * used as the GPU adapter for the underlying WebGPU backend to create GPU device.\n *\n * If this property is not set, it will be available to get after the first WebGPU inference session is created. The\n * value will be the GPU adapter that created by the underlying WebGPU backend.\n *\n * When use with TypeScript, the type of this property is `GPUAdapter` defined in \"@webgpu/types\".\n * Use `const adapter = env.webgpu.adapter as GPUAdapter;` in TypeScript to access this property with correct type.\n *\n * see comments on {@link Tensor.GpuBufferType}\n */\n adapter: unknown;\n /**\n * Get the device for WebGPU.\n *\n * This property is only available after the first WebGPU inference session is created.\n *\n * When use with TypeScript, the type of this property is `GPUDevice` defined in \"@webgpu/types\".\n * Use `const device = env.webgpu.device as GPUDevice;` in TypeScript to access this property with correct type.\n *\n * see comments on {@link Tensor.GpuBufferType} for more details about why not use types defined in \"@webgpu/types\".\n */\n readonly device: unknown;\n /**\n * Set or get whether validate input content.\n *\n * @defaultValue `false`\n */\n validateInputContent?: boolean;\n }\n}\n\nexport interface Env {\n /**\n * set the severity level for logging.\n *\n * @defaultValue `'warning'`\n */\n logLevel?: 'verbose'|'info'|'warning'|'error'|'fatal';\n\n /**\n * Indicate whether run in debug mode.\n *\n * @defaultValue `false`\n */\n debug?: boolean;\n\n /**\n * set or get a boolean value indicating whether to enable trace.\n *\n * @defaultValue `false`\n */\n trace?: boolean;\n\n /**\n * Get version of the current package.\n */\n readonly versions: {\n readonly common: string;\n readonly web?: string;\n readonly node?: string;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n readonly 'react-native'?: string;\n };\n\n /**\n * Represent a set of flags for WebAssembly\n */\n readonly wasm: Env.WebAssemblyFlags;\n\n /**\n * Represent a set of flags for WebGL\n */\n readonly webgl: Env.WebGLFlags;\n\n /**\n * Represent a set of flags for WebGPU\n */\n readonly webgpu: Env.WebGpuFlags;\n\n [name: string]: unknown;\n}\n\n/**\n * Represent a set of flags as a global singleton.\n */\nexport const env: Env = envImpl;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorToDataUrlOptions, TensorToImageDataOptions} from './tensor-conversion.js';\nimport {Tensor} from './tensor.js';\n\n/**\n * implementation of Tensor.toDataURL()\n */\nexport const tensorToDataURL = (tensor: Tensor, options?: TensorToDataUrlOptions): string => {\n const canvas = typeof document !== 'undefined' ? document.createElement('canvas') : (new OffscreenCanvas(1, 1));\n canvas.width = tensor.dims[3];\n canvas.height = tensor.dims[2];\n const pixels2DContext =\n canvas.getContext('2d') as (CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null);\n\n if (pixels2DContext != null) {\n // Default values for height and width & format\n let width: number;\n let height: number;\n if (options?.tensorLayout !== undefined && options.tensorLayout === 'NHWC') {\n width = tensor.dims[2];\n height = tensor.dims[3];\n } else { // Default layout is NCWH\n width = tensor.dims[3];\n height = tensor.dims[2];\n }\n\n const inputformat = options?.format !== undefined ? options.format : 'RGB';\n\n const norm = options?.norm;\n let normMean: [number, number, number, number];\n let normBias: [number, number, number, number];\n if (norm === undefined || norm.mean === undefined) {\n normMean = [255, 255, 255, 255];\n } else {\n if (typeof (norm.mean) === 'number') {\n normMean = [norm.mean, norm.mean, norm.mean, norm.mean];\n } else {\n normMean = [norm.mean[0], norm.mean[1], norm.mean[2], 0];\n if (norm.mean[3] !== undefined) {\n normMean[3] = norm.mean[3];\n }\n }\n }\n if (norm === undefined || norm.bias === undefined) {\n normBias = [0, 0, 0, 0];\n } else {\n if (typeof (norm.bias) === 'number') {\n normBias = [norm.bias, norm.bias, norm.bias, norm.bias];\n } else {\n normBias = [norm.bias[0], norm.bias[1], norm.bias[2], 0];\n if (norm.bias[3] !== undefined) {\n normBias[3] = norm.bias[3];\n }\n }\n }\n\n const stride = height * width;\n // Default pointer assignments\n let rTensorPointer = 0, gTensorPointer = stride, bTensorPointer = stride * 2, aTensorPointer = -1;\n\n // Updating the pointer assignments based on the input image format\n if (inputformat === 'RGBA') {\n rTensorPointer = 0;\n gTensorPointer = stride;\n bTensorPointer = stride * 2;\n aTensorPointer = stride * 3;\n } else if (inputformat === 'RGB') {\n rTensorPointer = 0;\n gTensorPointer = stride;\n bTensorPointer = stride * 2;\n } else if (inputformat === 'RBG') {\n rTensorPointer = 0;\n bTensorPointer = stride;\n gTensorPointer = stride * 2;\n }\n\n for (let i = 0; i < height; i++) {\n for (let j = 0; j < width; j++) {\n const R = ((tensor.data[rTensorPointer++] as number) - normBias[0]) * normMean[0]; // R value\n const G = ((tensor.data[gTensorPointer++] as number) - normBias[1]) * normMean[1]; // G value\n const B = ((tensor.data[bTensorPointer++] as number) - normBias[2]) * normMean[2]; // B value\n const A = aTensorPointer === -1 ?\n 255 :\n ((tensor.data[aTensorPointer++] as number) - normBias[3]) * normMean[3]; // A value\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n pixels2DContext.fillStyle = 'rgba(' + R + ',' + G + ',' + B + ',' + A + ')';\n pixels2DContext.fillRect(j, i, 1, 1);\n }\n }\n if ('toDataURL' in canvas) {\n return canvas.toDataURL();\n } else {\n throw new Error('toDataURL is not supported');\n }\n } else {\n throw new Error('Can not access image data');\n }\n};\n\n/**\n * implementation of Tensor.toImageData()\n */\nexport const tensorToImageData = (tensor: Tensor, options?: TensorToImageDataOptions): ImageData => {\n const pixels2DContext = typeof document !== 'undefined' ?\n document.createElement('canvas').getContext('2d') :\n new OffscreenCanvas(1, 1).getContext('2d') as OffscreenCanvasRenderingContext2D;\n let image: ImageData;\n if (pixels2DContext != null) {\n // Default values for height and width & format\n let width: number;\n let height: number;\n let channels: number;\n if (options?.tensorLayout !== undefined && options.tensorLayout === 'NHWC') {\n width = tensor.dims[2];\n height = tensor.dims[1];\n channels = tensor.dims[3];\n } else { // Default layout is NCWH\n width = tensor.dims[3];\n height = tensor.dims[2];\n channels = tensor.dims[1];\n }\n const inputformat = options !== undefined ? (options.format !== undefined ? options.format : 'RGB') : 'RGB';\n\n const norm = options?.norm;\n let normMean: [number, number, number, number];\n let normBias: [number, number, number, number];\n if (norm === undefined || norm.mean === undefined) {\n normMean = [255, 255, 255, 255];\n } else {\n if (typeof (norm.mean) === 'number') {\n normMean = [norm.mean, norm.mean, norm.mean, norm.mean];\n } else {\n normMean = [norm.mean[0], norm.mean[1], norm.mean[2], 255];\n if (norm.mean[3] !== undefined) {\n normMean[3] = norm.mean[3];\n }\n }\n }\n if (norm === undefined || norm.bias === undefined) {\n normBias = [0, 0, 0, 0];\n } else {\n if (typeof (norm.bias) === 'number') {\n normBias = [norm.bias, norm.bias, norm.bias, norm.bias];\n } else {\n normBias = [norm.bias[0], norm.bias[1], norm.bias[2], 0];\n if (norm.bias[3] !== undefined) {\n normBias[3] = norm.bias[3];\n }\n }\n }\n\n const stride = height * width;\n if (options !== undefined) {\n if (options.format !== undefined && (channels === 4 && options.format !== 'RGBA') ||\n (channels === 3 && (options.format !== 'RGB' && options.format !== 'BGR'))) {\n throw new Error('Tensor format doesn\\'t match input tensor dims');\n }\n }\n\n // Default pointer assignments\n const step = 4;\n let rImagePointer = 0, gImagePointer = 1, bImagePointer = 2, aImagePointer = 3;\n let rTensorPointer = 0, gTensorPointer = stride, bTensorPointer = stride * 2, aTensorPointer = -1;\n\n // Updating the pointer assignments based on the input image format\n if (inputformat === 'RGBA') {\n rTensorPointer = 0;\n gTensorPointer = stride;\n bTensorPointer = stride * 2;\n aTensorPointer = stride * 3;\n } else if (inputformat === 'RGB') {\n rTensorPointer = 0;\n gTensorPointer = stride;\n bTensorPointer = stride * 2;\n } else if (inputformat === 'RBG') {\n rTensorPointer = 0;\n bTensorPointer = stride;\n gTensorPointer = stride * 2;\n }\n\n image = pixels2DContext.createImageData(width, height);\n\n for (let i = 0; i < height * width;\n rImagePointer += step, gImagePointer += step, bImagePointer += step, aImagePointer += step, i++) {\n image.data[rImagePointer] = ((tensor.data[rTensorPointer++] as number) - normBias[0]) * normMean[0]; // R value\n image.data[gImagePointer] = ((tensor.data[gTensorPointer++] as number) - normBias[1]) * normMean[1]; // G value\n image.data[bImagePointer] = ((tensor.data[bTensorPointer++] as number) - normBias[2]) * normMean[2]; // B value\n image.data[aImagePointer] = aTensorPointer === -1 ?\n 255 :\n ((tensor.data[aTensorPointer++] as number) - normBias[3]) * normMean[3]; // A value\n }\n\n } else {\n throw new Error('Can not access image data');\n }\n return image;\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {OptionsDimensions, OptionsFormat, OptionsNormalizationParameters, OptionsTensorFormat, OptionsTensorLayout, TensorFromGpuBufferOptions, TensorFromImageBitmapOptions, TensorFromImageDataOptions, TensorFromImageElementOptions, TensorFromTextureOptions, TensorFromUrlOptions} from './tensor-factory.js';\nimport {Tensor} from './tensor-impl.js';\nimport {Tensor as TensorInterface} from './tensor.js';\n\ninterface BufferToTensorOptions extends OptionsDimensions, OptionsTensorLayout, OptionsNormalizationParameters,\n OptionsFormat, OptionsTensorFormat {}\n\n/**\n * Create a new tensor object from image object\n *\n * @param buffer - Extracted image buffer data - assuming RGBA format\n * @param imageFormat - input image configuration - required configurations height, width, format\n * @param tensorFormat - output tensor configuration - Default is RGB format\n */\nexport const bufferToTensor = (buffer: Uint8ClampedArray|undefined, options: BufferToTensorOptions): Tensor => {\n if (buffer === undefined) {\n throw new Error('Image buffer must be defined');\n }\n if (options.height === undefined || options.width === undefined) {\n throw new Error('Image height and width must be defined');\n }\n if (options.tensorLayout === 'NHWC') {\n throw new Error('NHWC Tensor layout is not supported yet');\n }\n\n const {height, width} = options;\n\n const norm = options.norm ?? {mean: 255, bias: 0};\n let normMean: [number, number, number, number];\n let normBias: [number, number, number, number];\n\n if (typeof (norm.mean) === 'number') {\n normMean = [norm.mean, norm.mean, norm.mean, norm.mean];\n } else {\n normMean = [norm.mean![0], norm.mean![1], norm.mean![2], norm.mean![3] ?? 255];\n }\n\n if (typeof (norm.bias) === 'number') {\n normBias = [norm.bias, norm.bias, norm.bias, norm.bias];\n } else {\n normBias = [norm.bias![0], norm.bias![1], norm.bias![2], norm.bias![3] ?? 0];\n }\n\n const inputformat = options.format !== undefined ? options.format : 'RGBA';\n // default value is RGBA since imagedata and HTMLImageElement uses it\n\n const outputformat =\n options.tensorFormat !== undefined ? (options.tensorFormat !== undefined ? options.tensorFormat : 'RGB') : 'RGB';\n const stride = height * width;\n const float32Data = outputformat === 'RGBA' ? new Float32Array(stride * 4) : new Float32Array(stride * 3);\n\n // Default pointer assignments\n let step = 4, rImagePointer = 0, gImagePointer = 1, bImagePointer = 2, aImagePointer = 3;\n let rTensorPointer = 0, gTensorPointer = stride, bTensorPointer = stride * 2, aTensorPointer = -1;\n\n // Updating the pointer assignments based on the input image format\n if (inputformat === 'RGB') {\n step = 3;\n rImagePointer = 0;\n gImagePointer = 1;\n bImagePointer = 2;\n aImagePointer = -1;\n }\n\n // Updating the pointer assignments based on the output tensor format\n if (outputformat === 'RGBA') {\n aTensorPointer = stride * 3;\n } else if (outputformat === 'RBG') {\n rTensorPointer = 0;\n bTensorPointer = stride;\n gTensorPointer = stride * 2;\n } else if (outputformat === 'BGR') {\n bTensorPointer = 0;\n gTensorPointer = stride;\n rTensorPointer = stride * 2;\n }\n\n for (let i = 0; i < stride;\n i++, rImagePointer += step, bImagePointer += step, gImagePointer += step, aImagePointer += step) {\n float32Data[rTensorPointer++] = (buffer[rImagePointer] + normBias[0]) / normMean[0];\n float32Data[gTensorPointer++] = (buffer[gImagePointer] + normBias[1]) / normMean[1];\n float32Data[bTensorPointer++] = (buffer[bImagePointer] + normBias[2]) / normMean[2];\n if (aTensorPointer !== -1 && aImagePointer !== -1) {\n float32Data[aTensorPointer++] = (buffer[aImagePointer] + normBias[3]) / normMean[3];\n }\n }\n\n // Float32Array -> ort.Tensor\n const outputTensor = outputformat === 'RGBA' ? new Tensor('float32', float32Data, [1, 4, height, width]) :\n new Tensor('float32', float32Data, [1, 3, height, width]);\n return outputTensor;\n};\n\n/**\n * implementation of Tensor.fromImage().\n */\nexport const tensorFromImage = async(\n image: ImageData|HTMLImageElement|ImageBitmap|string,\n options?: TensorFromImageDataOptions|TensorFromImageElementOptions|TensorFromImageBitmapOptions|\n TensorFromUrlOptions): Promise => {\n // checking the type of image object\n const isHTMLImageEle = typeof (HTMLImageElement) !== 'undefined' && image instanceof HTMLImageElement;\n const isImageDataEle = typeof (ImageData) !== 'undefined' && image instanceof ImageData;\n const isImageBitmap = typeof (ImageBitmap) !== 'undefined' && image instanceof ImageBitmap;\n const isString = typeof image === 'string';\n\n let data: Uint8ClampedArray|undefined;\n let bufferToTensorOptions: BufferToTensorOptions = options ?? {};\n\n const createCanvas = () => {\n if (typeof document !== 'undefined') {\n return document.createElement('canvas');\n } else if (typeof OffscreenCanvas !== 'undefined') {\n return new OffscreenCanvas(1, 1);\n } else {\n throw new Error('Canvas is not supported');\n }\n };\n const createCanvasContext = (canvas: HTMLCanvasElement|OffscreenCanvas) => {\n if (canvas instanceof HTMLCanvasElement) {\n return canvas.getContext('2d');\n } else if (canvas instanceof OffscreenCanvas) {\n return canvas.getContext('2d') as OffscreenCanvasRenderingContext2D;\n } else {\n return null;\n }\n };\n // filling and checking image configuration options\n if (isHTMLImageEle) {\n // HTMLImageElement - image object - format is RGBA by default\n const canvas = createCanvas();\n canvas.width = image.width;\n canvas.height = image.height;\n const pixels2DContext = createCanvasContext(canvas);\n\n if (pixels2DContext != null) {\n let height = image.height;\n let width = image.width;\n if (options !== undefined && options.resizedHeight !== undefined && options.resizedWidth !== undefined) {\n height = options.resizedHeight;\n width = options.resizedWidth;\n }\n\n if (options !== undefined) {\n bufferToTensorOptions = options;\n if (options.tensorFormat !== undefined) {\n throw new Error('Image input config format must be RGBA for HTMLImageElement');\n } else {\n bufferToTensorOptions.tensorFormat = 'RGBA';\n }\n bufferToTensorOptions.height = height;\n bufferToTensorOptions.width = width;\n } else {\n bufferToTensorOptions.tensorFormat = 'RGBA';\n bufferToTensorOptions.height = height;\n bufferToTensorOptions.width = width;\n }\n\n pixels2DContext.drawImage(image, 0, 0);\n data = pixels2DContext.getImageData(0, 0, width, height).data;\n } else {\n throw new Error('Can not access image data');\n }\n } else if (isImageDataEle) {\n let height: number;\n let width: number;\n\n if (options !== undefined && options.resizedWidth !== undefined && options.resizedHeight !== undefined) {\n height = options.resizedHeight;\n width = options.resizedWidth;\n } else {\n height = image.height;\n width = image.width;\n }\n\n if (options !== undefined) {\n bufferToTensorOptions = options;\n }\n bufferToTensorOptions.format = 'RGBA';\n bufferToTensorOptions.height = height;\n bufferToTensorOptions.width = width;\n\n if (options !== undefined) {\n const tempCanvas = createCanvas();\n\n tempCanvas.width = width;\n tempCanvas.height = height;\n\n const pixels2DContext = createCanvasContext(tempCanvas);\n\n if (pixels2DContext != null) {\n pixels2DContext.putImageData(image, 0, 0);\n data = pixels2DContext.getImageData(0, 0, width, height).data;\n } else {\n throw new Error('Can not access image data');\n }\n } else {\n data = image.data;\n }\n } else if (isImageBitmap) {\n // ImageBitmap - image object - format must be provided by user\n if (options === undefined) {\n throw new Error('Please provide image config with format for Imagebitmap');\n }\n\n const canvas = createCanvas();\n canvas.width = image.width;\n canvas.height = image.height;\n const pixels2DContext = createCanvasContext(canvas);\n\n if (pixels2DContext != null) {\n const height = image.height;\n const width = image.width;\n pixels2DContext.drawImage(image, 0, 0, width, height);\n data = pixels2DContext.getImageData(0, 0, width, height).data;\n bufferToTensorOptions.height = height;\n bufferToTensorOptions.width = width;\n return bufferToTensor(data, bufferToTensorOptions);\n } else {\n throw new Error('Can not access image data');\n }\n } else if (isString) {\n return new Promise((resolve, reject) => {\n const canvas = createCanvas();\n const context = createCanvasContext(canvas);\n if (!image || !context) {\n return reject();\n }\n const newImage = new Image();\n newImage.crossOrigin = 'Anonymous';\n newImage.src = image;\n newImage.onload = () => {\n canvas.width = newImage.width;\n canvas.height = newImage.height;\n context.drawImage(newImage, 0, 0, canvas.width, canvas.height);\n const img = context.getImageData(0, 0, canvas.width, canvas.height);\n\n bufferToTensorOptions.height = canvas.height;\n bufferToTensorOptions.width = canvas.width;\n resolve(bufferToTensor(img.data, bufferToTensorOptions));\n };\n });\n } else {\n throw new Error('Input data provided is not supported - aborted tensor creation');\n }\n\n if (data !== undefined) {\n return bufferToTensor(data, bufferToTensorOptions);\n } else {\n throw new Error('Input data provided is not supported - aborted tensor creation');\n }\n};\n\n/**\n * implementation of Tensor.fromTexture().\n */\nexport const tensorFromTexture = (\n texture: TensorInterface.TextureType, options: TensorFromTextureOptions): Tensor => {\n const {width, height, download, dispose} = options;\n // Always assume RGBAF32. TODO: support different texture format\n const dims = [1, height, width, 4];\n return new Tensor({location: 'texture', type: 'float32', texture, dims, download, dispose});\n};\n\n/**\n * implementation of Tensor.fromGpuBuffer().\n */\nexport const tensorFromGpuBuffer = (\n gpuBuffer: TensorInterface.GpuBufferType, options: TensorFromGpuBufferOptions): Tensor => {\n const {dataType, dims, download, dispose} = options;\n return new Tensor({location: 'gpu-buffer', type: dataType ?? 'float32', gpuBuffer, dims, download, dispose});\n};\n\n/**\n * implementation of Tensor.fromPinnedBuffer().\n */\nexport const tensorFromPinnedBuffer = (\n type: T, buffer: TensorInterface.DataTypeMap[T], dims?: readonly number[]): Tensor =>\n new Tensor({location: 'cpu-pinned', type, data: buffer, dims: dims ?? [buffer.length]});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from './tensor.js';\n\nexport type SupportedTypedArrayConstructors = Float32ArrayConstructor|Uint8ArrayConstructor|Int8ArrayConstructor|\n Uint16ArrayConstructor|Int16ArrayConstructor|Int32ArrayConstructor|BigInt64ArrayConstructor|Uint8ArrayConstructor|\n Float64ArrayConstructor|Uint32ArrayConstructor|BigUint64ArrayConstructor;\nexport type SupportedTypedArray = InstanceType;\n\n// a runtime map that maps type string to TypedArray constructor. Should match Tensor.DataTypeMap.\nexport const NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP = new Map([\n ['float32', Float32Array],\n ['uint8', Uint8Array],\n ['int8', Int8Array],\n ['uint16', Uint16Array],\n ['int16', Int16Array],\n ['int32', Int32Array],\n ['bool', Uint8Array],\n ['float64', Float64Array],\n ['uint32', Uint32Array],\n]);\n\n// a runtime map that maps type string to TypedArray constructor. Should match Tensor.DataTypeMap.\nexport const NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP = new Map([\n [Float32Array, 'float32'],\n [Uint8Array, 'uint8'],\n [Int8Array, 'int8'],\n [Uint16Array, 'uint16'],\n [Int16Array, 'int16'],\n [Int32Array, 'int32'],\n [Float64Array, 'float64'],\n [Uint32Array, 'uint32'],\n]);\n\n// a dummy type declaration for Float16Array in case any polyfill is available.\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-explicit-any\n const Float16Array: any;\n}\n\n// the following code allows delaying execution of BigInt/Float16Array checking. This allows lazy initialization for\n// NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP and NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP, which allows BigInt/Float16Array\n// polyfill if available.\nlet isTypedArrayChecked = false;\nexport const checkTypedArray = () => {\n if (!isTypedArrayChecked) {\n isTypedArrayChecked = true;\n const isBigInt64ArrayAvailable = typeof BigInt64Array !== 'undefined' && BigInt64Array.from;\n const isBigUint64ArrayAvailable = typeof BigUint64Array !== 'undefined' && BigUint64Array.from;\n const isFloat16ArrayAvailable = typeof Float16Array !== 'undefined' && Float16Array.from;\n\n if (isBigInt64ArrayAvailable) {\n NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('int64', BigInt64Array);\n NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(BigInt64Array, 'int64');\n }\n if (isBigUint64ArrayAvailable) {\n NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('uint64', BigUint64Array);\n NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(BigUint64Array, 'uint64');\n }\n if (isFloat16ArrayAvailable) {\n NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('float16', Float16Array);\n NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(Float16Array, 'float16');\n } else {\n // if Float16Array is not available, use 'Uint16Array' to store the data.\n NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('float16', Uint16Array);\n }\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {CpuPinnedConstructorParameters, GpuBufferConstructorParameters, TextureConstructorParameters} from './tensor-factory.js';\nimport {Tensor} from './tensor-impl.js';\n\n/**\n * calculate size from dims.\n *\n * @param dims the dims array. May be an illegal input.\n */\nexport const calculateSize = (dims: readonly unknown[]): number => {\n let size = 1;\n for (let i = 0; i < dims.length; i++) {\n const dim = dims[i];\n if (typeof dim !== 'number' || !Number.isSafeInteger(dim)) {\n throw new TypeError(`dims[${i}] must be an integer, got: ${dim}`);\n }\n if (dim < 0) {\n throw new RangeError(`dims[${i}] must be a non-negative integer, got: ${dim}`);\n }\n size *= dim;\n }\n return size;\n};\n\n/**\n * implementation of Tensor.reshape()\n */\nexport const tensorReshape = (tensor: Tensor, dims: readonly number[]): Tensor => {\n switch (tensor.location) {\n case 'cpu':\n return new Tensor(tensor.type, tensor.data, dims);\n case 'cpu-pinned':\n return new Tensor({\n location: 'cpu-pinned',\n data: tensor.data as CpuPinnedConstructorParameters['data'],\n type: tensor.type as CpuPinnedConstructorParameters['type'],\n dims,\n });\n case 'texture':\n return new Tensor({\n location: 'texture',\n texture: tensor.texture,\n type: tensor.type as TextureConstructorParameters['type'],\n dims,\n });\n case 'gpu-buffer':\n return new Tensor({\n location: 'gpu-buffer',\n gpuBuffer: tensor.gpuBuffer,\n type: tensor.type as GpuBufferConstructorParameters['type'],\n dims,\n });\n default:\n throw new Error(`tensorReshape: tensor location ${tensor.location} is not supported`);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {tensorToDataURL, tensorToImageData} from './tensor-conversion-impl.js';\nimport {TensorToDataUrlOptions, TensorToImageDataOptions} from './tensor-conversion.js';\nimport {tensorFromGpuBuffer, tensorFromImage, tensorFromPinnedBuffer, tensorFromTexture} from './tensor-factory-impl.js';\nimport {CpuPinnedConstructorParameters, GpuBufferConstructorParameters, TensorFromGpuBufferOptions, TensorFromImageBitmapOptions, TensorFromImageDataOptions, TensorFromImageElementOptions, TensorFromTextureOptions, TensorFromUrlOptions, TextureConstructorParameters} from './tensor-factory.js';\nimport {checkTypedArray, NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP, NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP, SupportedTypedArray, SupportedTypedArrayConstructors} from './tensor-impl-type-mapping.js';\nimport {calculateSize, tensorReshape} from './tensor-utils-impl.js';\nimport {Tensor as TensorInterface} from './tensor.js';\n\n// type aliases for those exported from Tensor interface\n\ntype TensorType = TensorInterface.Type;\ntype TensorDataType = TensorInterface.DataType;\ntype TensorDataLocation = TensorInterface.DataLocation;\ntype TensorTextureType = TensorInterface.TextureType;\ntype TensorGpuBufferType = TensorInterface.GpuBufferType;\n\n/**\n * the implementation of Tensor interface.\n *\n * @ignore\n */\nexport class Tensor implements TensorInterface {\n // #region constructors\n\n /**\n * Construct a new CPU tensor object from the given type, data and dims.\n */\n constructor(\n type: TensorType, data: TensorDataType|readonly string[]|readonly number[]|readonly boolean[],\n dims?: readonly number[]);\n /**\n * Construct a new CPU tensor object from the given data and dims. Type is inferred from data.\n */\n constructor(data: TensorDataType|readonly string[]|readonly boolean[], dims?: readonly number[]);\n /**\n * Construct a new tensor object from the pinned CPU data with the given type and dims.\n *\n * Tensor's location will be set to 'cpu-pinned'.\n *\n * @param params - Specify the parameters to construct the tensor.\n */\n constructor(params: CpuPinnedConstructorParameters);\n /**\n * Construct a new tensor object from the WebGL texture with the given type and dims.\n *\n * Tensor's location will be set to 'texture'.\n *\n * @param params - Specify the parameters to construct the tensor.\n */\n constructor(params: TextureConstructorParameters);\n /**\n * Construct a new tensor object from the WebGPU buffer with the given type and dims.\n *\n * Tensor's location will be set to 'gpu-buffer'.\n *\n * @param params - Specify the parameters to construct the tensor.\n */\n constructor(params: GpuBufferConstructorParameters);\n\n /**\n * implementation.\n */\n constructor(\n arg0: TensorType|TensorDataType|readonly string[]|readonly boolean[]|CpuPinnedConstructorParameters|\n TextureConstructorParameters|GpuBufferConstructorParameters,\n arg1?: TensorDataType|readonly number[]|readonly string[]|readonly boolean[], arg2?: readonly number[]) {\n // perform one-time check for BigInt/Float16Array support\n checkTypedArray();\n\n let type: TensorType;\n let dims: readonly number[];\n\n if (typeof arg0 === 'object' && 'location' in arg0) {\n //\n // constructing tensor from specific location\n //\n this.dataLocation = arg0.location;\n type = arg0.type;\n dims = arg0.dims;\n switch (arg0.location) {\n case 'cpu-pinned': {\n const expectedTypedArrayConstructor = NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.get(type);\n if (!expectedTypedArrayConstructor) {\n throw new TypeError(`unsupported type \"${type}\" to create tensor from pinned buffer`);\n }\n if (!(arg0.data instanceof expectedTypedArrayConstructor)) {\n throw new TypeError(`buffer should be of type ${expectedTypedArrayConstructor.name}`);\n }\n this.cpuData = arg0.data;\n break;\n }\n case 'texture': {\n if (type !== 'float32') {\n throw new TypeError(`unsupported type \"${type}\" to create tensor from texture`);\n }\n this.gpuTextureData = arg0.texture;\n this.downloader = arg0.download;\n this.disposer = arg0.dispose;\n break;\n }\n case 'gpu-buffer': {\n if ((type !== 'float32' && type !== 'float16' && type !== 'int32' && type !== 'int64' && type !== 'uint32' &&\n type !== 'uint8' && type !== 'bool')) {\n throw new TypeError(`unsupported type \"${type}\" to create tensor from gpu buffer`);\n }\n this.gpuBufferData = arg0.gpuBuffer;\n this.downloader = arg0.download;\n this.disposer = arg0.dispose;\n break;\n }\n default:\n throw new Error(`Tensor constructor: unsupported location '${this.dataLocation}'`);\n }\n } else {\n //\n // constructing tensor of location 'cpu'\n //\n let data: TensorDataType;\n let maybeDims: typeof arg1|typeof arg2;\n // check whether arg0 is type or data\n if (typeof arg0 === 'string') {\n //\n // Override: constructor(type, data, ...)\n //\n type = arg0;\n maybeDims = arg2;\n if (arg0 === 'string') {\n // string tensor\n if (!Array.isArray(arg1)) {\n throw new TypeError('A string tensor\\'s data must be a string array.');\n }\n // we don't check whether every element in the array is string; this is too slow. we assume it's correct and\n // error will be populated at inference\n data = arg1;\n } else {\n // numeric tensor\n const typedArrayConstructor = NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.get(arg0);\n if (typedArrayConstructor === undefined) {\n throw new TypeError(`Unsupported tensor type: ${arg0}.`);\n }\n if (Array.isArray(arg1)) {\n if (arg0 === 'float16' && typedArrayConstructor === Uint16Array) {\n // When no Float16Array polyfill is used, we cannot create 'float16' tensor from number array.\n //\n // Throw error here because when user try to use number array as data,\n // e.g. new Tensor('float16', [1, 2, 3, 4], dims)), it will actually call\n // Uint16Array.from(arg1) which generates wrong data.\n throw new TypeError(\n 'Creating a float16 tensor from number array is not supported. Please use Uint16Array as data.');\n } else if (arg0 === 'uint64' || arg0 === 'int64') {\n // use 'as any' here because:\n // 1. TypeScript's check on type of 'Array.isArray()' does not work with readonly arrays.\n // see https://github.com/microsoft/TypeScript/issues/17002\n // 2. TypeScript's check on union type of '(BigInt64ArrayConstructor|BigUint64ArrayConstructor).from()'\n // does not accept parameter mapFn.\n // 3. parameters of 'SupportedTypedArrayConstructors.from()' does not match the requirement of the union\n // type.\n\n // assume 'arg1' is of type \"readonly number[]|readonly bigint[]\" here.\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data = (typedArrayConstructor as any).from(arg1, BigInt);\n } else {\n // assume 'arg1' is of type \"readonly number[]\" here.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data = (typedArrayConstructor as any).from(arg1);\n }\n } else if (arg1 instanceof typedArrayConstructor) {\n data = arg1;\n } else {\n throw new TypeError(`A ${type} tensor's data must be type of ${typedArrayConstructor}`);\n }\n }\n } else {\n //\n // Override: constructor(data, ...)\n //\n maybeDims = arg1;\n if (Array.isArray(arg0)) {\n // only boolean[] and string[] is supported\n if (arg0.length === 0) {\n throw new TypeError('Tensor type cannot be inferred from an empty array.');\n }\n const firstElementType = typeof arg0[0];\n if (firstElementType === 'string') {\n type = 'string';\n data = arg0;\n } else if (firstElementType === 'boolean') {\n type = 'bool';\n // 'arg0' is of type 'boolean[]'. Uint8Array.from(boolean[]) actually works, but typescript thinks this is\n // wrong type. We use 'as any' to make it happy.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data = Uint8Array.from(arg0 as any[]);\n } else {\n throw new TypeError(`Invalid element type of data array: ${firstElementType}.`);\n }\n } else {\n // get tensor type from TypedArray\n const mappedType =\n NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.get(arg0.constructor as SupportedTypedArrayConstructors);\n if (mappedType === undefined) {\n throw new TypeError(`Unsupported type for tensor data: ${arg0.constructor}.`);\n }\n type = mappedType;\n data = arg0 as SupportedTypedArray;\n }\n }\n\n // type and data is processed, now processing dims\n if (maybeDims === undefined) {\n // assume 1-D tensor if dims omitted\n maybeDims = [data.length];\n } else if (!Array.isArray(maybeDims)) {\n throw new TypeError('A tensor\\'s dims must be a number array');\n }\n dims = maybeDims as readonly number[];\n\n this.cpuData = data;\n this.dataLocation = 'cpu';\n }\n\n // perform check on dims\n const size = calculateSize(dims);\n // if data is on CPU, check whether data length matches tensor size\n if (this.cpuData && size !== this.cpuData.length) {\n throw new Error(`Tensor's size(${size}) does not match data length(${this.cpuData.length}).`);\n }\n\n this.type = type;\n this.dims = dims;\n this.size = size;\n }\n // #endregion\n\n // #region factory\n static async fromImage(\n image: ImageData|HTMLImageElement|ImageBitmap|string,\n options?: TensorFromImageDataOptions|TensorFromImageElementOptions|TensorFromImageBitmapOptions|\n TensorFromUrlOptions): Promise {\n return tensorFromImage(image, options);\n }\n\n static fromTexture(\n texture: TensorTextureType, options: TensorFromTextureOptions): TensorInterface {\n return tensorFromTexture(texture, options);\n }\n\n static fromGpuBuffer(\n gpuBuffer: TensorGpuBufferType, options: TensorFromGpuBufferOptions): TensorInterface {\n return tensorFromGpuBuffer(gpuBuffer, options);\n }\n\n static fromPinnedBuffer(\n type: T, buffer: TensorInterface.DataTypeMap[T], dims?: readonly number[]): Tensor {\n return tensorFromPinnedBuffer(type, buffer, dims);\n }\n\n // #endregion\n\n // #region conversions\n toDataURL(options?: TensorToDataUrlOptions): string {\n return tensorToDataURL(this, options);\n }\n\n toImageData(options?: TensorToImageDataOptions): ImageData {\n return tensorToImageData(this, options);\n }\n // #endregion\n\n // #region public fields\n readonly dims: readonly number[];\n readonly type: TensorType;\n readonly size: number;\n // #endregion\n\n // #region private fields\n\n /**\n * stores the location of the data.\n */\n private dataLocation: TensorDataLocation;\n\n /**\n * stores the data on CPU, if location is 'cpu' or 'cpu-pinned'. otherwise empty.\n */\n private cpuData?: TensorDataType;\n\n /**\n * stores the underlying texture when location is 'texture'. otherwise empty.\n */\n private gpuTextureData?: TensorTextureType;\n\n /**\n * stores the underlying GPU buffer when location is 'gpu-buffer'. otherwise empty.\n */\n private gpuBufferData?: TensorGpuBufferType;\n\n /**\n * stores an optional downloader function to download data from GPU to CPU.\n */\n private downloader?(): Promise;\n\n /**\n * a flag indicating whether the data is being downloaded from GPU to CPU.\n */\n private isDownloading?: boolean;\n\n /**\n * stores an optional disposer function to dispose the underlying data.\n */\n private disposer?(): void;\n // #endregion\n\n // #region properties\n get data(): TensorDataType {\n this.ensureValid();\n if (!this.cpuData) {\n throw new Error(\n 'The data is not on CPU. Use `getData()` to download GPU data to CPU, ' +\n 'or use `texture` or `gpuBuffer` property to access the GPU data directly.');\n }\n return this.cpuData;\n }\n\n get location(): TensorDataLocation {\n return this.dataLocation;\n }\n\n get texture(): TensorTextureType {\n this.ensureValid();\n if (!this.gpuTextureData) {\n throw new Error('The data is not stored as a WebGL texture.');\n }\n return this.gpuTextureData;\n }\n\n get gpuBuffer(): TensorGpuBufferType {\n this.ensureValid();\n if (!this.gpuBufferData) {\n throw new Error('The data is not stored as a WebGPU buffer.');\n }\n return this.gpuBufferData;\n }\n // #endregion\n\n // #region methods\n\n async getData(releaseData?: boolean): Promise {\n this.ensureValid();\n switch (this.dataLocation) {\n case 'cpu':\n case 'cpu-pinned':\n return this.data;\n case 'texture':\n case 'gpu-buffer': {\n if (!this.downloader) {\n throw new Error('The current tensor is not created with a specified data downloader.');\n }\n if (this.isDownloading) {\n throw new Error('The current tensor is being downloaded.');\n }\n try {\n this.isDownloading = true;\n const data = await this.downloader();\n this.downloader = undefined;\n this.dataLocation = 'cpu';\n this.cpuData = data;\n\n if (releaseData && this.disposer) {\n this.disposer();\n this.disposer = undefined;\n }\n\n return data;\n\n } finally {\n this.isDownloading = false;\n }\n }\n default:\n throw new Error(`cannot get data from location: ${this.dataLocation}`);\n }\n }\n\n dispose(): void {\n if (this.isDownloading) {\n throw new Error('The current tensor is being downloaded.');\n }\n\n if (this.disposer) {\n this.disposer();\n this.disposer = undefined;\n }\n this.cpuData = undefined;\n this.gpuTextureData = undefined;\n this.gpuBufferData = undefined;\n this.downloader = undefined;\n this.isDownloading = undefined;\n\n this.dataLocation = 'none';\n }\n\n // #endregion\n\n // #region tensor utilities\n private ensureValid(): void {\n if (this.dataLocation === 'none') {\n throw new Error('The tensor is disposed.');\n }\n }\n\n reshape(dims: readonly number[]): TensorInterface {\n this.ensureValid();\n if (this.downloader || this.disposer) {\n throw new Error('Cannot reshape a tensor that owns GPU resource.');\n }\n return tensorReshape(this, dims);\n }\n // #endregion\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorFactory} from './tensor-factory.js';\nimport {Tensor as TensorImpl} from './tensor-impl.js';\nimport {TypedTensorUtils} from './tensor-utils.js';\n\n/* eslint-disable @typescript-eslint/no-redeclare */\n\n/**\n * represent a basic tensor with specified dimensions and data type.\n */\ninterface TypedTensorBase {\n /**\n * Get the dimensions of the tensor.\n */\n readonly dims: readonly number[];\n /**\n * Get the data type of the tensor.\n */\n readonly type: T;\n /**\n * Get the buffer data of the tensor.\n *\n * If the data is not on CPU (eg. it's in the form of WebGL texture or WebGPU buffer), throw error.\n */\n readonly data: Tensor.DataTypeMap[T];\n /**\n * Get the location of the data.\n */\n readonly location: Tensor.DataLocation;\n /**\n * Get the WebGL texture that holds the tensor data.\n *\n * If the data is not on GPU as WebGL texture, throw error.\n */\n readonly texture: Tensor.TextureType;\n /**\n * Get the WebGPU buffer that holds the tensor data.\n *\n * If the data is not on GPU as WebGPU buffer, throw error.\n */\n readonly gpuBuffer: Tensor.GpuBufferType;\n\n /**\n * Get the buffer data of the tensor.\n *\n * If the data is on CPU, returns the data immediately.\n * If the data is on GPU, downloads the data and returns the promise.\n *\n * @param releaseData - whether release the data on GPU. Ignore if data is already on CPU.\n */\n getData(releaseData?: boolean): Promise;\n\n /**\n * Dispose the tensor data.\n *\n * If the data is on CPU, remove its internal reference to the underlying data.\n * If the data is on GPU, release the data on GPU.\n *\n * After calling this function, the tensor is considered no longer valid. Its location will be set to 'none'.\n */\n dispose(): void;\n}\n\nexport declare namespace Tensor {\n interface DataTypeMap {\n float32: Float32Array;\n uint8: Uint8Array;\n int8: Int8Array;\n uint16: Uint16Array;\n int16: Int16Array;\n int32: Int32Array;\n int64: BigInt64Array;\n string: string[];\n bool: Uint8Array;\n float16: Uint16Array; // Keep using Uint16Array until we have a concrete solution for float 16.\n float64: Float64Array;\n uint32: Uint32Array;\n uint64: BigUint64Array;\n // complex64: never;\n // complex128: never;\n // bfloat16: never;\n }\n\n interface ElementTypeMap {\n float32: number;\n uint8: number;\n int8: number;\n uint16: number;\n int16: number;\n int32: number;\n int64: bigint;\n string: string;\n bool: boolean;\n float16: number; // Keep using Uint16Array until we have a concrete solution for float 16.\n float64: number;\n uint32: number;\n uint64: bigint;\n // complex64: never;\n // complex128: never;\n // bfloat16: never;\n }\n\n type DataType = DataTypeMap[Type];\n type ElementType = ElementTypeMap[Type];\n\n /**\n * supported data types for constructing a tensor from a pinned CPU buffer\n */\n export type CpuPinnedDataTypes = Exclude;\n\n /**\n * type alias for WebGL texture\n */\n export type TextureType = WebGLTexture;\n\n /**\n * supported data types for constructing a tensor from a WebGL texture\n */\n export type TextureDataTypes = 'float32';\n\n /**\n * type alias for WebGPU buffer\n *\n * The reason why we don't use type \"GPUBuffer\" defined in webgpu.d.ts from @webgpu/types is because \"@webgpu/types\"\n * requires \"@types/dom-webcodecs\" as peer dependency when using TypeScript < v5.1 and its version need to be chosen\n * carefully according to the TypeScript version being used. This means so far there is not a way to keep every\n * TypeScript version happy. It turns out that we will easily broke users on some TypeScript version.\n *\n * for more info see https://github.com/gpuweb/types/issues/127\n */\n export type GpuBufferType = {size: number; mapState: 'unmapped' | 'pending' | 'mapped'};\n\n /**\n * supported data types for constructing a tensor from a WebGPU buffer\n */\n export type GpuBufferDataTypes = 'float32'|'float16'|'int32'|'int64'|'uint32'|'uint8'|'bool';\n\n /**\n * represent where the tensor data is stored\n */\n export type DataLocation = 'none'|'cpu'|'cpu-pinned'|'texture'|'gpu-buffer';\n\n /**\n * represent the data type of a tensor\n */\n export type Type = keyof DataTypeMap;\n}\n\n/**\n * Represent multi-dimensional arrays to feed to or fetch from model inferencing.\n */\nexport interface TypedTensor extends TypedTensorBase, TypedTensorUtils {}\n/**\n * Represent multi-dimensional arrays to feed to or fetch from model inferencing.\n */\nexport interface Tensor extends TypedTensorBase, TypedTensorUtils {}\n\n/**\n * type TensorConstructor defines the constructors of 'Tensor' to create CPU tensor instances.\n */\nexport interface TensorConstructor extends TensorFactory {\n // #region CPU tensor - specify element type\n /**\n * Construct a new string tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(type: 'string', data: Tensor.DataTypeMap['string']|readonly string[],\n dims?: readonly number[]): TypedTensor<'string'>;\n\n /**\n * Construct a new bool tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(type: 'bool', data: Tensor.DataTypeMap['bool']|readonly boolean[], dims?: readonly number[]): TypedTensor<'bool'>;\n\n /**\n * Construct a new 64-bit integer typed tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(\n type: T, data: Tensor.DataTypeMap[T]|readonly bigint[]|readonly number[],\n dims?: readonly number[]): TypedTensor;\n\n /**\n * Construct a new numeric tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new>(\n type: T, data: Tensor.DataTypeMap[T]|readonly number[], dims?: readonly number[]): TypedTensor;\n // #endregion\n\n // #region CPU tensor - infer element types\n\n /**\n * Construct a new float32 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Float32Array, dims?: readonly number[]): TypedTensor<'float32'>;\n\n /**\n * Construct a new int8 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Int8Array, dims?: readonly number[]): TypedTensor<'int8'>;\n\n /**\n * Construct a new uint8 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Uint8Array, dims?: readonly number[]): TypedTensor<'uint8'>;\n\n /**\n * Construct a new uint16 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Uint16Array, dims?: readonly number[]): TypedTensor<'uint16'>;\n\n /**\n * Construct a new int16 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Int16Array, dims?: readonly number[]): TypedTensor<'int16'>;\n\n /**\n * Construct a new int32 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Int32Array, dims?: readonly number[]): TypedTensor<'int32'>;\n\n /**\n * Construct a new int64 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: BigInt64Array, dims?: readonly number[]): TypedTensor<'int64'>;\n\n /**\n * Construct a new string tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: readonly string[], dims?: readonly number[]): TypedTensor<'string'>;\n\n /**\n * Construct a new bool tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: readonly boolean[], dims?: readonly number[]): TypedTensor<'bool'>;\n\n /**\n * Construct a new float64 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Float64Array, dims?: readonly number[]): TypedTensor<'float64'>;\n\n /**\n * Construct a new uint32 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Uint32Array, dims?: readonly number[]): TypedTensor<'uint32'>;\n\n /**\n * Construct a new uint64 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: BigUint64Array, dims?: readonly number[]): TypedTensor<'uint64'>;\n\n // #endregion\n\n // #region CPU tensor - fall back to non-generic tensor type declaration\n\n /**\n * Construct a new tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(type: Tensor.Type, data: Tensor.DataType|readonly number[]|readonly string[]|readonly bigint[]|readonly boolean[],\n dims?: readonly number[]): Tensor;\n\n /**\n * Construct a new tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Tensor.DataType, dims?: readonly number[]): Tensor;\n // #endregion\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const Tensor = TensorImpl as TensorConstructor;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from './env-impl.js';\n\n/**\n * @ignore\n */\nexport const TRACE = (deviceType: string, label: string) => {\n if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {\n return;\n }\n // eslint-disable-next-line no-console\n console.timeStamp(`${deviceType}::ORT::${label}`);\n};\n\nconst TRACE_FUNC = (msg: string, extraMsg?: string) => {\n const stack = new Error().stack?.split(/\\r\\n|\\r|\\n/g) || [];\n let hasTraceFunc = false;\n for (let i = 0; i < stack.length; i++) {\n if (hasTraceFunc && !stack[i].includes('TRACE_FUNC')) {\n let label = `FUNC_${msg}::${stack[i].trim().split(' ')[1]}`;\n if (extraMsg) {\n label += `::${extraMsg}`;\n }\n TRACE('CPU', label);\n return;\n }\n if (stack[i].includes('TRACE_FUNC')) {\n hasTraceFunc = true;\n }\n }\n};\n\n/**\n * @ignore\n */\nexport const TRACE_FUNC_BEGIN = (extraMsg?: string) => {\n if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {\n return;\n }\n TRACE_FUNC('BEGIN', extraMsg);\n};\n\n/**\n * @ignore\n */\nexport const TRACE_FUNC_END = (extraMsg?: string) => {\n if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {\n return;\n }\n TRACE_FUNC('END', extraMsg);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {resolveBackendAndExecutionProviders} from './backend-impl.js';\nimport {InferenceSessionHandler} from './backend.js';\nimport {InferenceSession as InferenceSessionInterface} from './inference-session.js';\nimport {OnnxValue} from './onnx-value.js';\nimport {Tensor} from './tensor.js';\nimport {TRACE_FUNC_BEGIN, TRACE_FUNC_END} from './trace.js';\n\ntype SessionOptions = InferenceSessionInterface.SessionOptions;\ntype RunOptions = InferenceSessionInterface.RunOptions;\ntype FeedsType = InferenceSessionInterface.FeedsType;\ntype FetchesType = InferenceSessionInterface.FetchesType;\ntype ReturnType = InferenceSessionInterface.ReturnType;\n\nexport class InferenceSession implements InferenceSessionInterface {\n private constructor(handler: InferenceSessionHandler) {\n this.handler = handler;\n }\n run(feeds: FeedsType, options?: RunOptions): Promise;\n run(feeds: FeedsType, fetches: FetchesType, options?: RunOptions): Promise;\n async run(feeds: FeedsType, arg1?: FetchesType|RunOptions, arg2?: RunOptions): Promise {\n TRACE_FUNC_BEGIN();\n const fetches: {[name: string]: OnnxValue|null} = {};\n let options: RunOptions = {};\n // check inputs\n if (typeof feeds !== 'object' || feeds === null || feeds instanceof Tensor || Array.isArray(feeds)) {\n throw new TypeError(\n '\\'feeds\\' must be an object that use input names as keys and OnnxValue as corresponding values.');\n }\n\n let isFetchesEmpty = true;\n // determine which override is being used\n if (typeof arg1 === 'object') {\n if (arg1 === null) {\n throw new TypeError('Unexpected argument[1]: cannot be null.');\n }\n if (arg1 instanceof Tensor) {\n throw new TypeError('\\'fetches\\' cannot be a Tensor');\n }\n\n if (Array.isArray(arg1)) {\n if (arg1.length === 0) {\n throw new TypeError('\\'fetches\\' cannot be an empty array.');\n }\n isFetchesEmpty = false;\n // output names\n for (const name of arg1) {\n if (typeof name !== 'string') {\n throw new TypeError('\\'fetches\\' must be a string array or an object.');\n }\n if (this.outputNames.indexOf(name) === -1) {\n throw new RangeError(`'fetches' contains invalid output name: ${name}.`);\n }\n fetches[name] = null;\n }\n\n if (typeof arg2 === 'object' && arg2 !== null) {\n options = arg2;\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else {\n // decide whether arg1 is fetches or options\n // if any output name is present and its value is valid OnnxValue, we consider it fetches\n let isFetches = false;\n const arg1Keys = Object.getOwnPropertyNames(arg1);\n for (const name of this.outputNames) {\n if (arg1Keys.indexOf(name) !== -1) {\n const v = (arg1 as InferenceSessionInterface.NullableOnnxValueMapType)[name];\n if (v === null || v instanceof Tensor) {\n isFetches = true;\n isFetchesEmpty = false;\n fetches[name] = v;\n }\n }\n }\n\n if (isFetches) {\n if (typeof arg2 === 'object' && arg2 !== null) {\n options = arg2;\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else {\n options = arg1 as RunOptions;\n }\n }\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('Unexpected argument[1]: must be \\'fetches\\' or \\'options\\'.');\n }\n\n // check if all inputs are in feed\n for (const name of this.inputNames) {\n if (typeof feeds[name] === 'undefined') {\n throw new Error(`input '${name}' is missing in 'feeds'.`);\n }\n }\n\n // if no fetches is specified, we use the full output names list\n if (isFetchesEmpty) {\n for (const name of this.outputNames) {\n fetches[name] = null;\n }\n }\n\n // feeds, fetches and options are prepared\n\n const results = await this.handler.run(feeds, fetches, options);\n const returnValue: {[name: string]: OnnxValue} = {};\n for (const key in results) {\n if (Object.hasOwnProperty.call(results, key)) {\n const result = results[key];\n if (result instanceof Tensor) {\n returnValue[key] = result;\n } else {\n returnValue[key] = new Tensor(result.type, result.data, result.dims);\n }\n }\n }\n TRACE_FUNC_END();\n return returnValue;\n }\n\n async release(): Promise {\n return this.handler.dispose();\n }\n\n static create(path: string, options?: SessionOptions): Promise;\n static create(buffer: ArrayBufferLike, options?: SessionOptions): Promise;\n static create(buffer: ArrayBufferLike, byteOffset: number, byteLength?: number, options?: SessionOptions):\n Promise;\n static create(buffer: Uint8Array, options?: SessionOptions): Promise;\n static async create(\n arg0: string|ArrayBufferLike|Uint8Array, arg1?: SessionOptions|number, arg2?: number,\n arg3?: SessionOptions): Promise {\n TRACE_FUNC_BEGIN();\n // either load from a file or buffer\n let filePathOrUint8Array: string|Uint8Array;\n let options: SessionOptions = {};\n\n if (typeof arg0 === 'string') {\n filePathOrUint8Array = arg0;\n if (typeof arg1 === 'object' && arg1 !== null) {\n options = arg1;\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else if (arg0 instanceof Uint8Array) {\n filePathOrUint8Array = arg0;\n if (typeof arg1 === 'object' && arg1 !== null) {\n options = arg1;\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else if (\n arg0 instanceof ArrayBuffer ||\n (typeof SharedArrayBuffer !== 'undefined' && arg0 instanceof SharedArrayBuffer)) {\n const buffer = arg0;\n let byteOffset = 0;\n let byteLength = arg0.byteLength;\n if (typeof arg1 === 'object' && arg1 !== null) {\n options = arg1;\n } else if (typeof arg1 === 'number') {\n byteOffset = arg1;\n if (!Number.isSafeInteger(byteOffset)) {\n throw new RangeError('\\'byteOffset\\' must be an integer.');\n }\n if (byteOffset < 0 || byteOffset >= buffer.byteLength) {\n throw new RangeError(`'byteOffset' is out of range [0, ${buffer.byteLength}).`);\n }\n byteLength = arg0.byteLength - byteOffset;\n if (typeof arg2 === 'number') {\n byteLength = arg2;\n if (!Number.isSafeInteger(byteLength)) {\n throw new RangeError('\\'byteLength\\' must be an integer.');\n }\n if (byteLength <= 0 || byteOffset + byteLength > buffer.byteLength) {\n throw new RangeError(`'byteLength' is out of range (0, ${buffer.byteLength - byteOffset}].`);\n }\n if (typeof arg3 === 'object' && arg3 !== null) {\n options = arg3;\n } else if (typeof arg3 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'byteLength\\' must be a number.');\n }\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n filePathOrUint8Array = new Uint8Array(buffer, byteOffset, byteLength);\n } else {\n throw new TypeError('Unexpected argument[0]: must be \\'path\\' or \\'buffer\\'.');\n }\n\n // resolve backend, update session options with validated EPs, and create session handler\n const [backend, optionsWithValidatedEPs] = await resolveBackendAndExecutionProviders(options);\n const handler = await backend.createInferenceSessionHandler(filePathOrUint8Array, optionsWithValidatedEPs);\n TRACE_FUNC_END();\n return new InferenceSession(handler);\n }\n\n startProfiling(): void {\n this.handler.startProfiling();\n }\n endProfiling(): void {\n this.handler.endProfiling();\n }\n\n get inputNames(): readonly string[] {\n return this.handler.inputNames;\n }\n get outputNames(): readonly string[] {\n return this.handler.outputNames;\n }\n\n private handler: InferenceSessionHandler;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession as InferenceSessionImpl} from './inference-session-impl.js';\nimport {OnnxModelOptions} from './onnx-model.js';\nimport {OnnxValue, OnnxValueDataLocation} from './onnx-value.js';\n\n/* eslint-disable @typescript-eslint/no-redeclare */\n\nexport declare namespace InferenceSession {\n // #region input/output types\n\n type OnnxValueMapType = {readonly [name: string]: OnnxValue};\n type NullableOnnxValueMapType = {readonly [name: string]: OnnxValue | null};\n\n /**\n * A feeds (model inputs) is an object that uses input names as keys and OnnxValue as corresponding values.\n */\n type FeedsType = OnnxValueMapType;\n\n /**\n * A fetches (model outputs) could be one of the following:\n *\n * - Omitted. Use model's output names definition.\n * - An array of string indicating the output names.\n * - An object that use output names as keys and OnnxValue or null as corresponding values.\n *\n * @remark\n * different from input argument, in output, OnnxValue is optional. If an OnnxValue is present it will be\n * used as a pre-allocated value by the inference engine; if omitted, inference engine will allocate buffer\n * internally.\n */\n type FetchesType = readonly string[]|NullableOnnxValueMapType;\n\n /**\n * A inferencing return type is an object that uses output names as keys and OnnxValue as corresponding values.\n */\n type ReturnType = OnnxValueMapType;\n\n // #endregion\n\n // #region session options\n\n /**\n * A set of configurations for session behavior.\n */\n export interface SessionOptions extends OnnxModelOptions {\n /**\n * An array of execution provider options.\n *\n * An execution provider option can be a string indicating the name of the execution provider,\n * or an object of corresponding type.\n */\n executionProviders?: readonly ExecutionProviderConfig[];\n\n /**\n * The intra OP threads number.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native).\n */\n intraOpNumThreads?: number;\n\n /**\n * The inter OP threads number.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native).\n */\n interOpNumThreads?: number;\n\n /**\n * The free dimension override.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n freeDimensionOverrides?: {readonly [dimensionName: string]: number};\n\n /**\n * The optimization level.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n graphOptimizationLevel?: 'disabled'|'basic'|'extended'|'all';\n\n /**\n * Whether enable CPU memory arena.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n enableCpuMemArena?: boolean;\n\n /**\n * Whether enable memory pattern.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n enableMemPattern?: boolean;\n\n /**\n * Execution mode.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n executionMode?: 'sequential'|'parallel';\n\n /**\n * Optimized model file path.\n *\n * If this setting is specified, the optimized model will be dumped. In browser, a blob will be created\n * with a pop-up window.\n */\n optimizedModelFilePath?: string;\n\n /**\n * Whether enable profiling.\n *\n * This setting is a placeholder for a future use.\n */\n enableProfiling?: boolean;\n\n /**\n * File prefix for profiling.\n *\n * This setting is a placeholder for a future use.\n */\n profileFilePrefix?: string;\n\n /**\n * Log ID.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n logId?: string;\n\n /**\n * Log severity level. See\n * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/common/logging/severity.h\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n logSeverityLevel?: 0|1|2|3|4;\n\n /**\n * Log verbosity level.\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n */\n logVerbosityLevel?: number;\n\n /**\n * Specify string as a preferred data location for all outputs, or an object that use output names as keys and a\n * preferred data location as corresponding values.\n *\n * This setting is available only in ONNXRuntime Web for WebGL and WebGPU EP.\n */\n preferredOutputLocation?: OnnxValueDataLocation|{readonly [outputName: string]: OnnxValueDataLocation};\n\n /**\n * Whether enable graph capture.\n * This setting is available only in ONNXRuntime Web for WebGPU EP.\n */\n enableGraphCapture?: boolean;\n\n /**\n * Store configurations for a session. See\n * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/session/\n * onnxruntime_session_options_config_keys.h\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n *\n * @example\n * ```js\n * extra: {\n * session: {\n * set_denormal_as_zero: \"1\",\n * disable_prepacking: \"1\"\n * },\n * optimization: {\n * enable_gelu_approximation: \"1\"\n * }\n * }\n * ```\n */\n extra?: Record;\n }\n\n // #region execution providers\n\n // Currently, we have the following backends to support execution providers:\n // Backend Node.js binding: supports 'cpu', 'dml' (win32), 'coreml' (macOS) and 'cuda' (linux).\n // Backend WebAssembly: supports 'cpu', 'wasm', 'webgpu' and 'webnn'.\n // Backend ONNX.js: supports 'webgl'.\n // Backend React Native: supports 'cpu', 'xnnpack', 'coreml' (iOS), 'nnapi' (Android).\n interface ExecutionProviderOptionMap {\n coreml: CoreMLExecutionProviderOption;\n cpu: CpuExecutionProviderOption;\n cuda: CudaExecutionProviderOption;\n dml: DmlExecutionProviderOption;\n nnapi: NnapiExecutionProviderOption;\n tensorrt: TensorRtExecutionProviderOption;\n wasm: WebAssemblyExecutionProviderOption;\n webgl: WebGLExecutionProviderOption;\n webgpu: WebGpuExecutionProviderOption;\n webnn: WebNNExecutionProviderOption;\n qnn: QnnExecutionProviderOption;\n xnnpack: XnnpackExecutionProviderOption;\n }\n\n type ExecutionProviderName = keyof ExecutionProviderOptionMap;\n type ExecutionProviderConfig =\n ExecutionProviderOptionMap[ExecutionProviderName]|ExecutionProviderOption|ExecutionProviderName|string;\n\n export interface ExecutionProviderOption {\n readonly name: string;\n }\n export interface CpuExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'cpu';\n useArena?: boolean;\n }\n export interface CudaExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'cuda';\n deviceId?: number;\n }\n export interface DmlExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'dml';\n deviceId?: number;\n }\n export interface TensorRtExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'tensorrt';\n deviceId?: number;\n }\n export interface WebAssemblyExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'wasm';\n }\n export interface WebGLExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'webgl';\n // TODO: add flags\n }\n export interface XnnpackExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'xnnpack';\n }\n export interface WebGpuExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'webgpu';\n preferredLayout?: 'NCHW'|'NHWC';\n }\n\n // #region WebNN options\n\n interface WebNNExecutionProviderName extends ExecutionProviderOption {\n readonly name: 'webnn';\n }\n\n /**\n * Represents a set of options for creating a WebNN MLContext.\n *\n * @see https://www.w3.org/TR/webnn/#dictdef-mlcontextoptions\n */\n export interface WebNNContextOptions {\n deviceType?: 'cpu'|'gpu'|'npu';\n numThreads?: number;\n powerPreference?: 'default'|'low-power'|'high-performance';\n }\n\n /**\n * Represents a set of options for WebNN execution provider without MLContext.\n */\n export interface WebNNOptionsWithoutMLContext extends WebNNExecutionProviderName, WebNNContextOptions {\n context?: never;\n }\n\n /**\n * Represents a set of options for WebNN execution provider with MLContext.\n *\n * When MLContext is provided, the deviceType is also required so that the WebNN EP can determine the preferred\n * channel layout.\n *\n * @see https://www.w3.org/TR/webnn/#dom-ml-createcontext\n */\n export interface WebNNOptionsWithMLContext extends WebNNExecutionProviderName,\n Omit,\n Required> {\n context: unknown /* MLContext */;\n }\n\n /**\n * Represents a set of options for WebNN execution provider with MLContext which is created from GPUDevice.\n *\n * @see https://www.w3.org/TR/webnn/#dom-ml-createcontext-gpudevice\n */\n export interface WebNNOptionsWebGpu extends WebNNExecutionProviderName {\n context: unknown /* MLContext */;\n gpuDevice: unknown /* GPUDevice */;\n }\n\n /**\n * Options for WebNN execution provider.\n */\n export type WebNNExecutionProviderOption = WebNNOptionsWithoutMLContext|WebNNOptionsWithMLContext|WebNNOptionsWebGpu;\n\n // #endregion\n\n export interface QnnExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'qnn';\n // TODO add flags\n }\n export interface CoreMLExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'coreml';\n /**\n * The bit flags for CoreML execution provider.\n *\n * ```\n * COREML_FLAG_USE_CPU_ONLY = 0x001\n * COREML_FLAG_ENABLE_ON_SUBGRAPH = 0x002\n * COREML_FLAG_ONLY_ENABLE_DEVICE_WITH_ANE = 0x004\n * COREML_FLAG_ONLY_ALLOW_STATIC_INPUT_SHAPES = 0x008\n * COREML_FLAG_CREATE_MLPROGRAM = 0x010\n * ```\n *\n * See include/onnxruntime/core/providers/coreml/coreml_provider_factory.h for more details.\n *\n * This flag is available only in ONNXRuntime (Node.js binding).\n */\n coreMlFlags?: number;\n /**\n * Specify whether to use CPU only in CoreML EP.\n *\n * This setting is available only in ONNXRuntime (react-native).\n */\n useCPUOnly?: boolean;\n /**\n * Specify whether to enable CoreML EP on subgraph.\n *\n * This setting is available only in ONNXRuntime (react-native).\n */\n enableOnSubgraph?: boolean;\n /**\n * Specify whether to only enable CoreML EP for Apple devices with ANE (Apple Neural Engine).\n *\n * This setting is available only in ONNXRuntime (react-native).\n */\n onlyEnableDeviceWithANE?: boolean;\n }\n export interface NnapiExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'nnapi';\n useFP16?: boolean;\n useNCHW?: boolean;\n cpuDisabled?: boolean;\n cpuOnly?: boolean;\n }\n // #endregion\n\n // #endregion\n\n // #region run options\n\n /**\n * A set of configurations for inference run behavior\n */\n export interface RunOptions {\n /**\n * Log severity level. See\n * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/common/logging/severity.h\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n logSeverityLevel?: 0|1|2|3|4;\n\n /**\n * Log verbosity level.\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n */\n logVerbosityLevel?: number;\n\n /**\n * Terminate all incomplete OrtRun calls as soon as possible if true\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n */\n terminate?: boolean;\n\n /**\n * A tag for the Run() calls using this\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n tag?: string;\n\n /**\n * Set a single run configuration entry. See\n * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/session/\n * onnxruntime_run_options_config_keys.h\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n *\n * @example\n *\n * ```js\n * extra: {\n * memory: {\n * enable_memory_arena_shrinkage: \"1\",\n * }\n * }\n * ```\n */\n extra?: Record;\n }\n\n // #endregion\n\n // #region value metadata\n\n // eslint-disable-next-line @typescript-eslint/no-empty-interface\n interface ValueMetadata {\n // TBD\n }\n\n // #endregion\n}\n\n/**\n * Represent a runtime instance of an ONNX model.\n */\nexport interface InferenceSession {\n // #region run()\n\n /**\n * Execute the model asynchronously with the given feeds and options.\n *\n * @param feeds - Representation of the model input. See type description of `InferenceSession.InputType` for detail.\n * @param options - Optional. A set of options that controls the behavior of model inference.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding values.\n */\n run(feeds: InferenceSession.FeedsType, options?: InferenceSession.RunOptions): Promise;\n\n /**\n * Execute the model asynchronously with the given feeds, fetches and options.\n *\n * @param feeds - Representation of the model input. See type description of `InferenceSession.InputType` for detail.\n * @param fetches - Representation of the model output. See type description of `InferenceSession.OutputType` for\n * detail.\n * @param options - Optional. A set of options that controls the behavior of model inference.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding values.\n */\n run(feeds: InferenceSession.FeedsType, fetches: InferenceSession.FetchesType,\n options?: InferenceSession.RunOptions): Promise;\n\n // #endregion\n\n // #region release()\n\n /**\n * Release the inference session and the underlying resources.\n */\n release(): Promise;\n\n // #endregion\n\n // #region profiling\n\n /**\n * Start profiling.\n */\n startProfiling(): void;\n\n /**\n * End profiling.\n */\n endProfiling(): void;\n\n // #endregion\n\n // #region metadata\n\n /**\n * Get input names of the loaded model.\n */\n readonly inputNames: readonly string[];\n\n /**\n * Get output names of the loaded model.\n */\n readonly outputNames: readonly string[];\n\n // /**\n // * Get input metadata of the loaded model.\n // */\n // readonly inputMetadata: ReadonlyArray>;\n\n // /**\n // * Get output metadata of the loaded model.\n // */\n // readonly outputMetadata: ReadonlyArray>;\n\n // #endregion\n}\n\nexport interface InferenceSessionFactory {\n // #region create()\n\n /**\n * Create a new inference session and load model asynchronously from an ONNX model file.\n *\n * @param uri - The URI or file path of the model to load.\n * @param options - specify configuration for creating a new inference session.\n * @returns A promise that resolves to an InferenceSession object.\n */\n create(uri: string, options?: InferenceSession.SessionOptions): Promise;\n\n /**\n * Create a new inference session and load model asynchronously from an array bufer.\n *\n * @param buffer - An ArrayBuffer representation of an ONNX model.\n * @param options - specify configuration for creating a new inference session.\n * @returns A promise that resolves to an InferenceSession object.\n */\n create(buffer: ArrayBufferLike, options?: InferenceSession.SessionOptions): Promise;\n\n /**\n * Create a new inference session and load model asynchronously from segment of an array bufer.\n *\n * @param buffer - An ArrayBuffer representation of an ONNX model.\n * @param byteOffset - The beginning of the specified portion of the array buffer.\n * @param byteLength - The length in bytes of the array buffer.\n * @param options - specify configuration for creating a new inference session.\n * @returns A promise that resolves to an InferenceSession object.\n */\n create(buffer: ArrayBufferLike, byteOffset: number, byteLength?: number, options?: InferenceSession.SessionOptions):\n Promise;\n\n /**\n * Create a new inference session and load model asynchronously from a Uint8Array.\n *\n * @param buffer - A Uint8Array representation of an ONNX model.\n * @param options - specify configuration for creating a new inference session.\n * @returns A promise that resolves to an InferenceSession object.\n */\n create(buffer: Uint8Array, options?: InferenceSession.SessionOptions): Promise;\n\n // #endregion\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const InferenceSession: InferenceSessionFactory = InferenceSessionImpl;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {OptionsFormat, OptionsNormalizationParameters, OptionsTensorLayout} from './tensor-factory.js';\n\nexport interface TensorToDataUrlOptions extends OptionsTensorLayout, OptionsFormat, OptionsNormalizationParameters {}\n\nexport interface TensorToImageDataOptions extends OptionsTensorLayout, OptionsFormat, OptionsNormalizationParameters {}\n\nexport interface ConversionUtils {\n /**\n * creates a DataURL instance from tensor\n *\n * @param options - An optional object representing options for creating a DataURL instance from the tensor.\n *\n * The following default settings will be applied:\n * - `format`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * @returns a DataURL string representing the image converted from tensor data\n */\n toDataURL(options?: TensorToDataUrlOptions): string;\n\n /**\n * creates an ImageData instance from tensor\n *\n * @param options - An optional object representing options for creating an ImageData instance from the tensor.\n *\n * The following default settings will be applied:\n * - `format`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * @returns an ImageData instance representing the image converted from tensor data\n */\n toImageData(options?: TensorToImageDataOptions): ImageData;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor, TypedTensor} from './tensor.js';\n\nexport type ImageFormat = 'RGB'|'RGBA'|'BGR'|'RBG';\nexport type ImageTensorLayout = 'NHWC'|'NCHW';\n\n// the following region contains type definitions for constructing tensor from a specific location.\n\n// #region types for constructing a tensor from a specific location\n\n/**\n * represent common properties of the parameter for constructing a tensor from a specific location.\n */\ninterface CommonConstructorParameters extends Pick {\n /**\n * Specify the data type of the tensor.\n */\n readonly type: T;\n}\n\n/**\n * represent the parameter for constructing a tensor from a GPU resource.\n */\ninterface GpuResourceConstructorParameters {\n /**\n * an optional callback function to download data from GPU to CPU.\n *\n * If not provided, the tensor treat the GPU data as external resource.\n */\n download?(): Promise;\n\n /**\n * an optional callback function that will be called when the tensor is disposed.\n *\n * If not provided, the tensor treat the GPU data as external resource.\n */\n dispose?(): void;\n}\n\n/**\n * represent the parameter for constructing a tensor from a pinned CPU buffer\n */\nexport interface CpuPinnedConstructorParameters extends\n CommonConstructorParameters {\n /**\n * Specify the location of the data to be 'cpu-pinned'.\n */\n readonly location: 'cpu-pinned';\n /**\n * Specify the CPU pinned buffer that holds the tensor data.\n */\n readonly data: Tensor.DataTypeMap[T];\n}\n\n/**\n * represent the parameter for constructing a tensor from a WebGL texture\n */\nexport interface TextureConstructorParameters extends\n CommonConstructorParameters, GpuResourceConstructorParameters {\n /**\n * Specify the location of the data to be 'texture'.\n */\n readonly location: 'texture';\n /**\n * Specify the WebGL texture that holds the tensor data.\n */\n readonly texture: Tensor.TextureType;\n}\n\n/**\n * represent the parameter for constructing a tensor from a WebGPU buffer\n */\nexport interface GpuBufferConstructorParameters extends\n CommonConstructorParameters, GpuResourceConstructorParameters {\n /**\n * Specify the location of the data to be 'gpu-buffer'.\n */\n readonly location: 'gpu-buffer';\n /**\n * Specify the WebGPU buffer that holds the tensor data.\n */\n readonly gpuBuffer: Tensor.GpuBufferType;\n}\n\n// #endregion\n\n// the following region contains type definitions of each individual options.\n// the tensor factory functions use a composition of those options as the parameter type.\n\n// #region Options fields\n\nexport interface OptionsFormat {\n /**\n * Describes the image format represented in RGBA color space.\n */\n format?: ImageFormat;\n}\n\nexport interface OptionsTensorFormat {\n /**\n * Describes the image format of the tensor.\n *\n * NOTE: this is different from option 'format'. While option 'format' represents the original image, 'tensorFormat'\n * represents the target format of the tensor. A transpose will be performed if they are different.\n */\n tensorFormat?: ImageFormat;\n}\n\nexport interface OptionsTensorDataType {\n /**\n * Describes the data type of the tensor.\n */\n dataType?: 'float32'|'uint8';\n}\n\nexport interface OptionsTensorLayout {\n /**\n * Describes the tensor layout when representing data of one or more image(s).\n */\n tensorLayout?: ImageTensorLayout;\n}\n\nexport interface OptionsDimensions {\n /**\n * Describes the image height in pixel\n */\n height?: number;\n /**\n * Describes the image width in pixel\n */\n width?: number;\n}\n\nexport interface OptionResizedDimensions {\n /**\n * Describes the resized height. If omitted, original height will be used.\n */\n resizedHeight?: number;\n /**\n * Describes resized width - can be accessed via tensor dimensions as well\n */\n resizedWidth?: number;\n}\n\nexport interface OptionsNormalizationParameters {\n /**\n * Describes normalization parameters when preprocessing the image as model input.\n *\n * Data element are ranged from 0 to 255.\n */\n norm?: {\n /**\n * The 'bias' value for image normalization.\n * - If omitted, use default value 0.\n * - If it's a single number, apply to each channel\n * - If it's an array of 3 or 4 numbers, apply element-wise. Number of elements need to match the number of channels\n * for the corresponding image format\n */\n bias?: number|[number, number, number]|[number, number, number, number];\n /**\n * The 'mean' value for image normalization.\n * - If omitted, use default value 255.\n * - If it's a single number, apply to each channel\n * - If it's an array of 3 or 4 numbers, apply element-wise. Number of elements need to match the number of channels\n * for the corresponding image format\n */\n mean?: number | [number, number, number] | [number, number, number, number];\n };\n}\n\n// #endregion\n\n// #region Options composition\n\nexport interface TensorFromImageDataOptions extends OptionResizedDimensions, OptionsTensorFormat, OptionsTensorLayout,\n OptionsTensorDataType, OptionsNormalizationParameters {}\n\nexport interface TensorFromImageElementOptions extends OptionResizedDimensions, OptionsTensorFormat,\n OptionsTensorLayout, OptionsTensorDataType,\n OptionsNormalizationParameters {}\n\nexport interface TensorFromUrlOptions extends OptionsDimensions, OptionResizedDimensions, OptionsTensorFormat,\n OptionsTensorLayout, OptionsTensorDataType,\n OptionsNormalizationParameters {}\n\nexport interface TensorFromImageBitmapOptions extends OptionResizedDimensions, OptionsTensorFormat, OptionsTensorLayout,\n OptionsTensorDataType, OptionsNormalizationParameters {}\n\nexport interface TensorFromTextureOptions extends\n Required, OptionsFormat, GpuResourceConstructorParameters/* TODO: add more */ {}\n\nexport interface TensorFromGpuBufferOptions extends\n Pick, GpuResourceConstructorParameters {\n /**\n * Describes the data type of the tensor.\n */\n dataType?: T;\n}\n\n// #endregion\n\n/**\n * type TensorFactory defines the factory functions of 'Tensor' to create tensor instances from existing data or\n * resources.\n */\nexport interface TensorFactory {\n /**\n * create a tensor from an ImageData object\n *\n * @param imageData - the ImageData object to create tensor from\n * @param options - An optional object representing options for creating tensor from ImageData.\n *\n * The following default settings will be applied:\n * - `tensorFormat`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * - `dataType`: `'float32'`\n * @returns A promise that resolves to a tensor object\n */\n fromImage(imageData: ImageData, options?: TensorFromImageDataOptions):\n Promise|TypedTensor<'uint8'>>;\n\n /**\n * create a tensor from a HTMLImageElement object\n *\n * @param imageElement - the HTMLImageElement object to create tensor from\n * @param options - An optional object representing options for creating tensor from HTMLImageElement.\n *\n * The following default settings will be applied:\n * - `tensorFormat`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * - `dataType`: `'float32'`\n * @returns A promise that resolves to a tensor object\n */\n fromImage(imageElement: HTMLImageElement, options?: TensorFromImageElementOptions):\n Promise|TypedTensor<'uint8'>>;\n\n /**\n * create a tensor from URL\n *\n * @param urlSource - a string as a URL to the image or a data URL containing the image data.\n * @param options - An optional object representing options for creating tensor from URL.\n *\n * The following default settings will be applied:\n * - `tensorFormat`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * - `dataType`: `'float32'`\n * @returns A promise that resolves to a tensor object\n */\n fromImage(urlSource: string, options?: TensorFromUrlOptions): Promise|TypedTensor<'uint8'>>;\n\n /**\n * create a tensor from an ImageBitmap object\n *\n * @param bitmap - the ImageBitmap object to create tensor from\n * @param options - An optional object representing options for creating tensor from URL.\n *\n * The following default settings will be applied:\n * - `tensorFormat`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * - `dataType`: `'float32'`\n * @returns A promise that resolves to a tensor object\n */\n fromImage(bitmap: ImageBitmap, options: TensorFromImageBitmapOptions):\n Promise|TypedTensor<'uint8'>>;\n\n /**\n * create a tensor from a WebGL texture\n *\n * @param texture - the WebGLTexture object to create tensor from\n * @param options - An optional object representing options for creating tensor from WebGL texture.\n *\n * The options include following properties:\n * - `width`: the width of the texture. Required.\n * - `height`: the height of the texture. Required.\n * - `format`: the format of the texture. If omitted, assume 'RGBA'.\n * - `download`: an optional function to download the tensor data from GPU to CPU. If omitted, the GPU data\n * will not be able to download. Usually, this is provided by a GPU backend for the inference outputs. Users don't\n * need to provide this function.\n * - `dispose`: an optional function to dispose the tensor data on GPU. If omitted, the GPU data will not be disposed.\n * Usually, this is provided by a GPU backend for the inference outputs. Users don't need to provide this function.\n *\n * @returns a tensor object\n */\n fromTexture(\n texture: Tensor.TextureType, options: TensorFromTextureOptions): TypedTensor<'float32'>;\n\n /**\n * create a tensor from a WebGPU buffer\n *\n * @param buffer - the GPUBuffer object to create tensor from\n * @param options - An optional object representing options for creating tensor from WebGPU buffer.\n *\n * The options include following properties:\n * - `dataType`: the data type of the tensor. If omitted, assume 'float32'.\n * - `dims`: the dimension of the tensor. Required.\n * - `download`: an optional function to download the tensor data from GPU to CPU. If omitted, the GPU data\n * will not be able to download. Usually, this is provided by a GPU backend for the inference outputs. Users don't\n * need to provide this function.\n * - `dispose`: an optional function to dispose the tensor data on GPU. If omitted, the GPU data will not be disposed.\n * Usually, this is provided by a GPU backend for the inference outputs. Users don't need to provide this function.\n *\n * @returns a tensor object\n */\n fromGpuBuffer(\n buffer: Tensor.GpuBufferType, options: TensorFromGpuBufferOptions): TypedTensor;\n\n /**\n * create a tensor from a pre-allocated buffer. The buffer will be used as a pinned buffer.\n *\n * @param type - the tensor element type.\n * @param buffer - a TypedArray corresponding to the type.\n * @param dims - specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n *\n * @returns a tensor object\n */\n fromPinnedBuffer>(\n type: T, buffer: Tensor.DataTypeMap[T], dims?: readonly number[]): TypedTensor;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * A string that represents a file's URL or path.\n *\n * Path is vailable only in onnxruntime-node or onnxruntime-web running in Node.js.\n */\nexport type FileUrlOrPath = string;\n\n/**\n * A Blob object that represents a file.\n */\nexport type FileBlob = Blob;\n\n/**\n * A Uint8Array, ArrayBuffer or SharedArrayBuffer object that represents a file content.\n *\n * When it is an ArrayBuffer or SharedArrayBuffer, the whole buffer is assumed to be the file content.\n */\nexport type FileData = Uint8Array|ArrayBufferLike;\n\n/**\n * Represents a file that can be loaded by the ONNX Runtime JavaScript API.\n */\nexport type FileType = FileUrlOrPath|FileBlob|FileData;\n\n/**\n * Represents an external data file.\n */\nexport interface ExternalDataFileDescription {\n /**\n * Specify the external data file.\n */\n data: FileType;\n /**\n * Specify the file path.\n */\n path: string;\n}\n\n/**\n * Represents an external data file.\n *\n * When using a string, it should be a file URL or path that in the same directory as the model file.\n */\nexport type ExternalDataFileType = ExternalDataFileDescription|FileUrlOrPath;\n\n/**\n * Options for model loading.\n */\nexport interface OnnxModelOptions {\n /**\n * Specifying a list of files that represents the external data.\n */\n externalData?: readonly ExternalDataFileType[];\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from './tensor.js';\n\nexport type NonTensorType = never;\n\n/**\n * Type OnnxValue Represents both tensors and non-tensors value for model's inputs/outputs.\n *\n * NOTE: currently not support non-tensor\n */\nexport type OnnxValue = Tensor|NonTensorType;\n\n/**\n * Type OnnxValueDataLocation represents the location of the data of an OnnxValue.\n */\nexport type OnnxValueDataLocation = Tensor.DataLocation;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {resolveBackendAndExecutionProviders} from './backend-impl.js';\nimport {SessionHandler, TrainingSessionHandler} from './backend.js';\nimport {InferenceSession as InferenceSession} from './inference-session.js';\nimport {OnnxValue} from './onnx-value.js';\nimport {Tensor} from './tensor.js';\nimport {TrainingSession as TrainingSessionInterface, TrainingSessionCreateOptions} from './training-session.js';\n\ntype SessionOptions = InferenceSession.SessionOptions;\ntype FeedsType = InferenceSession.FeedsType;\ntype FetchesType = InferenceSession.FetchesType;\ntype ReturnType = InferenceSession.ReturnType;\ntype RunOptions = InferenceSession.RunOptions;\n\nconst noBackendErrMsg: string = 'Training backend could not be resolved. ' +\n 'Make sure you\\'re using the correct configuration & WebAssembly files.';\n\nexport class TrainingSession implements TrainingSessionInterface {\n private constructor(handler: TrainingSessionHandler, hasOptimizerModel: boolean, hasEvalModel: boolean) {\n this.handler = handler;\n this.hasOptimizerModel = hasOptimizerModel;\n this.hasEvalModel = hasEvalModel;\n }\n private handler: TrainingSessionHandler;\n private hasOptimizerModel: boolean;\n private hasEvalModel: boolean;\n\n get trainingInputNames(): readonly string[] {\n return this.handler.inputNames;\n }\n get trainingOutputNames(): readonly string[] {\n return this.handler.outputNames;\n }\n\n get evalInputNames(): readonly string[] {\n if (this.hasEvalModel) {\n return this.handler.evalInputNames;\n } else {\n throw new Error('This training session has no evalModel loaded.');\n }\n }\n get evalOutputNames(): readonly string[] {\n if (this.hasEvalModel) {\n return this.handler.evalOutputNames;\n } else {\n throw new Error('This training session has no evalModel loaded.');\n }\n }\n\n static async create(trainingOptions: TrainingSessionCreateOptions, sessionOptions?: SessionOptions):\n Promise {\n const evalModel: string|Uint8Array = trainingOptions.evalModel || '';\n const optimizerModel: string|Uint8Array = trainingOptions.optimizerModel || '';\n const options: SessionOptions = sessionOptions || {};\n\n // resolve backend, update session options with validated EPs, and create session handler\n const [backend, optionsWithValidatedEPs] = await resolveBackendAndExecutionProviders(options);\n if (backend.createTrainingSessionHandler) {\n const handler = await backend.createTrainingSessionHandler(\n trainingOptions.checkpointState, trainingOptions.trainModel, evalModel, optimizerModel,\n optionsWithValidatedEPs);\n return new TrainingSession(handler, !!trainingOptions.optimizerModel, !!trainingOptions.evalModel);\n } else {\n throw new Error(noBackendErrMsg);\n }\n }\n\n /**\n * Helper function for runTrainStep and future runStep methods that handles the type-narrowing conversion from\n * the given parameters to SessionHandler.FetchesType and RunOptions.\n *\n * @param inputNames the feeds object is checked that they contain all input names in the provided list of input\n * names.\n * @param outputNames the fetches object is checked that their keys match up with valid names in the list of output\n * names.\n * @param feeds the required input\n * @param arg1 narrowed & converted into the SessionHandler.FetchesType or RunOptions object\n * @param arg2 optional RunOptions object.\n * @returns\n */\n typeNarrowingForRunStep(\n inputNames: readonly string[], outputNames: readonly string[], feeds: FeedsType, arg1?: FetchesType|RunOptions,\n arg2?: RunOptions): [SessionHandler.FetchesType, RunOptions] {\n const fetches: {[name: string]: OnnxValue|null} = {};\n let options: RunOptions = {};\n // check inputs\n if (typeof feeds !== 'object' || feeds === null || feeds instanceof Tensor || Array.isArray(feeds)) {\n throw new TypeError(\n '\\'feeds\\' must be an object that use input names as keys and OnnxValue as corresponding values.');\n }\n\n let isFetchesEmpty = true;\n // determine which override is being used\n if (typeof arg1 === 'object') {\n if (arg1 === null) {\n throw new TypeError('Unexpected argument[1]: cannot be null.');\n }\n if (arg1 instanceof Tensor) {\n throw new TypeError('\\'fetches\\' cannot be a Tensor');\n }\n\n if (Array.isArray(arg1)) {\n if (arg1.length === 0) {\n throw new TypeError('\\'fetches\\' cannot be an empty array.');\n }\n isFetchesEmpty = false;\n // output names\n for (const name of arg1) {\n if (typeof name !== 'string') {\n throw new TypeError('\\'fetches\\' must be a string array or an object.');\n }\n if (outputNames.indexOf(name) === -1) {\n throw new RangeError(`'fetches' contains invalid output name: ${name}.`);\n }\n fetches[name] = null;\n }\n\n if (typeof arg2 === 'object' && arg2 !== null) {\n options = arg2;\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else {\n // decide whether arg1 is fetches or options\n // if any output name is present and its value is valid OnnxValue, we consider it fetches\n let isFetches = false;\n const arg1Keys = Object.getOwnPropertyNames(arg1);\n for (const name of outputNames) {\n if (arg1Keys.indexOf(name) !== -1) {\n const v = (arg1 as InferenceSession.NullableOnnxValueMapType)[name];\n if (v === null || v instanceof Tensor) {\n isFetches = true;\n isFetchesEmpty = false;\n fetches[name] = v;\n }\n }\n }\n\n if (isFetches) {\n if (typeof arg2 === 'object' && arg2 !== null) {\n options = arg2;\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else {\n options = arg1 as RunOptions;\n }\n }\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('Unexpected argument[1]: must be \\'fetches\\' or \\'options\\'.');\n }\n\n // check if all inputs are in feed\n for (const name of inputNames) {\n if (typeof feeds[name] === 'undefined') {\n throw new Error(`input '${name}' is missing in 'feeds'.`);\n }\n }\n\n // if no fetches is specified, we use the full output names list\n if (isFetchesEmpty) {\n for (const name of outputNames) {\n fetches[name] = null;\n }\n }\n\n return [fetches, options];\n }\n\n /**\n * Helper method for runTrainStep and any other runStep methods. Takes the ReturnType result from the SessionHandler\n * and changes it into a map of Tensors.\n *\n * @param results\n * @returns\n */\n convertHandlerReturnTypeToMapOfTensors(results: SessionHandler.ReturnType): ReturnType {\n const returnValue: {[name: string]: OnnxValue} = {};\n for (const key in results) {\n if (Object.hasOwnProperty.call(results, key)) {\n const result = results[key];\n if (result instanceof Tensor) {\n returnValue[key] = result;\n } else {\n returnValue[key] = new Tensor(result.type, result.data, result.dims);\n }\n }\n }\n return returnValue;\n }\n\n async lazyResetGrad(): Promise {\n await this.handler.lazyResetGrad();\n }\n\n runTrainStep(feeds: FeedsType, options?: RunOptions): Promise;\n runTrainStep(feeds: FeedsType, fetches: FetchesType, options?: RunOptions): Promise;\n async runTrainStep(feeds: FeedsType, arg1?: FetchesType|RunOptions, arg2?: RunOptions): Promise {\n const [fetches, options] =\n this.typeNarrowingForRunStep(this.trainingInputNames, this.trainingOutputNames, feeds, arg1, arg2);\n const results = await this.handler.runTrainStep(feeds, fetches, options);\n return this.convertHandlerReturnTypeToMapOfTensors(results);\n }\n\n async runOptimizerStep(options?: InferenceSession.RunOptions|undefined): Promise {\n if (this.hasOptimizerModel) {\n await this.handler.runOptimizerStep(options || {});\n } else {\n throw new Error('This TrainingSession has no OptimizerModel loaded.');\n }\n }\n\n runEvalStep(feeds: FeedsType, options?: RunOptions|undefined): Promise;\n runEvalStep(feeds: FeedsType, fetches: FetchesType, options?: RunOptions|undefined): Promise;\n async runEvalStep(feeds: FeedsType, arg1?: FetchesType|RunOptions, arg2?: RunOptions): Promise {\n if (this.hasEvalModel) {\n const [fetches, options] =\n this.typeNarrowingForRunStep(this.evalInputNames, this.evalOutputNames, feeds, arg1, arg2);\n const results = await this.handler.runEvalStep(feeds, fetches, options);\n return this.convertHandlerReturnTypeToMapOfTensors(results);\n } else {\n throw new Error('This TrainingSession has no EvalModel loaded.');\n }\n }\n\n async getParametersSize(trainableOnly = true): Promise {\n return this.handler.getParametersSize(trainableOnly);\n }\n\n async loadParametersBuffer(array: Uint8Array, trainableOnly = true): Promise {\n const paramsSize = await this.getParametersSize(trainableOnly);\n // checking that the size of the Uint8Array is equivalent to the byte length of a Float32Array of the number\n // of parameters\n if (array.length !== 4 * paramsSize) {\n throw new Error(\n 'Size of the buffer passed into loadParametersBuffer must match the number of parameters in ' +\n 'the model. Please use getParametersSize method to check.');\n }\n return this.handler.loadParametersBuffer(array, trainableOnly);\n }\n\n async getContiguousParameters(trainableOnly = true): Promise {\n return this.handler.getContiguousParameters(trainableOnly);\n }\n\n async release(): Promise {\n return this.handler.dispose();\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession} from './inference-session.js';\nimport {OnnxValue} from './onnx-value.js';\nimport {TrainingSession as TrainingSessionImpl} from './training-session-impl.js';\n\n/* eslint-disable @typescript-eslint/no-redeclare */\n\nexport declare namespace TrainingSession {\n /**\n * Either URI file path (string) or Uint8Array containing model or checkpoint information.\n */\n type UriOrBuffer = string|Uint8Array;\n}\n\n/**\n * Represent a runtime instance of an ONNX training session,\n * which contains a model that can be trained, and, optionally,\n * an eval and optimizer model.\n */\nexport interface TrainingSession {\n // #region run()\n\n /**\n * Lazily resets the gradients of all trainable parameters to zero. Should happen after the invocation of\n * runOptimizerStep.\n */\n lazyResetGrad(): Promise;\n\n /**\n * Run TrainStep asynchronously with the given feeds and options.\n *\n * @param feeds - Representation of the model input. See type description of `InferenceSession.InputType` for\n detail.\n * @param options - Optional. A set of options that controls the behavior of model training.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding values.\n */\n runTrainStep(feeds: InferenceSession.FeedsType, options?: InferenceSession.RunOptions):\n Promise;\n\n /**\n * Run a single train step with the given inputs and options.\n *\n * @param feeds - Representation of the model input.\n * @param fetches - Representation of the model output.\n * detail.\n * @param options - Optional. A set of options that controls the behavior of model training.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding\n values.\n */\n runTrainStep(\n feeds: InferenceSession.FeedsType, fetches: InferenceSession.FetchesType,\n options?: InferenceSession.RunOptions): Promise;\n\n /**\n * Runs a single optimizer step, which performs weight updates for the trainable parameters using the optimizer model.\n *\n * @param options - Optional. A set of options that controls the behavior of model optimizing.\n */\n runOptimizerStep(options?: InferenceSession.RunOptions): Promise;\n\n /**\n * Run a single eval step with the given inputs and options using the eval model.\n *\n * @param feeds - Representation of the model input.\n * @param options - Optional. A set of options that controls the behavior of model eval step.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding\n values.\n */\n runEvalStep(feeds: InferenceSession.FeedsType, options?: InferenceSession.RunOptions):\n Promise;\n\n /**\n * Run a single eval step with the given inputs and options using the eval model.\n *\n * @param feeds - Representation of the model input.\n * @param fetches - Representation of the model output.\n * detail.\n * @param options - Optional. A set of options that controls the behavior of model eval step.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding\n values.\n */\n runEvalStep(\n feeds: InferenceSession.FeedsType, fetches: InferenceSession.FetchesType,\n options?: InferenceSession.RunOptions): Promise;\n\n // #endregion\n\n // #region copy parameters\n\n /**\n * Retrieves the size of all parameters for the training state. Calculates the total number of primitive (datatype of\n * the parameters) elements of all the parameters in the training state.\n *\n * @param trainableOnly - When set to true, the size is calculated for trainable params only. Default value is true.\n */\n getParametersSize(trainableOnly: boolean): Promise;\n\n /**\n * Copies parameter values from the given buffer to the training state. Currently, only supporting models with\n * parameters of type Float32.\n *\n * @param buffer - A Uint8Array representation of Float32 parameters.\n * @param trainableOnly - True if trainable parameters only to be modified, false otherwise. Default value is true.\n */\n loadParametersBuffer(buffer: Uint8Array, trainableOnly: boolean): Promise;\n\n /**\n * Copies the model parameters to a contiguous buffer. Usually used in the context of Federated Learning.\n * Currently, only supporting models with parameters of type Float32.\n *\n * @param trainableOnly - When set to true, only trainable parameters are copied. Trainable parameters are parameters\n * for which requires_grad is set to true. Default value is true.\n * @returns A promise that resolves to a Float32 OnnxValue of the requested parameters.\n */\n getContiguousParameters(trainableOnly: boolean): Promise;\n // #endregion\n\n // #region release()\n\n /**\n * Release the inference session and the underlying resources.\n */\n release(): Promise;\n // #endregion\n\n // #region metadata\n\n /**\n * Get input names of the loaded training model.\n */\n readonly trainingInputNames: readonly string[];\n\n /**\n * Get output names of the loaded training model.\n */\n readonly trainingOutputNames: readonly string[];\n\n /**\n * Get input names of the loaded eval model. Is an empty array if no eval model is loaded.\n */\n readonly evalInputNames: readonly string[];\n\n /**\n * Get output names of the loaded eval model. Is an empty array if no eval model is loaded.\n */\n readonly evalOutputNames: readonly string[];\n\n // #endregion\n}\n\n/**\n * Represents the optional parameters that can be passed into the TrainingSessionFactory.\n */\nexport interface TrainingSessionCreateOptions {\n /**\n * URI or buffer for a .ckpt file that contains the checkpoint for the training model.\n */\n checkpointState: TrainingSession.UriOrBuffer;\n /**\n * URI or buffer for the .onnx training file.\n */\n trainModel: TrainingSession.UriOrBuffer;\n /**\n * Optional. URI or buffer for the .onnx optimizer model file.\n */\n optimizerModel?: TrainingSession.UriOrBuffer;\n /**\n * Optional. URI or buffer for the .onnx eval model file.\n */\n evalModel?: TrainingSession.UriOrBuffer;\n}\n\n/**\n * Defines method overload possibilities for creating a TrainingSession.\n */\nexport interface TrainingSessionFactory {\n // #region create()\n\n /**\n * Creates a new TrainingSession and asynchronously loads any models passed in through trainingOptions\n *\n * @param trainingOptions specify models and checkpoints to load into the Training Session\n * @param sessionOptions specify configuration for training session behavior\n *\n * @returns Promise that resolves to a TrainingSession object\n */\n create(trainingOptions: TrainingSessionCreateOptions, sessionOptions?: InferenceSession.SessionOptions):\n Promise;\n\n // #endregion\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const TrainingSession: TrainingSessionFactory = TrainingSessionImpl;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * # ONNX Runtime JavaScript API\n *\n * ONNX Runtime JavaScript API is a unified API for all JavaScript usages, including the following NPM packages:\n *\n * - [onnxruntime-node](https://www.npmjs.com/package/onnxruntime-node)\n * - [onnxruntime-web](https://www.npmjs.com/package/onnxruntime-web)\n * - [onnxruntime-react-native](https://www.npmjs.com/package/onnxruntime-react-native)\n *\n * See also:\n * - [Get Started](https://onnxruntime.ai/docs/get-started/with-javascript/)\n * - [Inference examples](https://github.com/microsoft/onnxruntime-inference-examples/tree/main/js)\n *\n * @packageDocumentation\n */\n\nexport * from './backend.js';\nexport * from './env.js';\nexport * from './inference-session.js';\nexport * from './tensor.js';\nexport * from './tensor-conversion.js';\nexport * from './tensor-factory.js';\nexport * from './trace.js';\nexport * from './onnx-model.js';\nexport * from './onnx-value.js';\nexport * from './training-session.js';\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from 'onnxruntime-common';\n\nimport {WebGLContext} from './backends/webgl/webgl-context';\n\nexport declare namespace Logger {\n export interface SeverityTypeMap {\n verbose: 'v';\n info: 'i';\n warning: 'w';\n error: 'e';\n fatal: 'f';\n }\n\n export type Severity = keyof SeverityTypeMap;\n\n export type Provider = 'none'|'console';\n\n /**\n * Logging config that used to control the behavior of logger\n */\n export interface Config {\n /**\n * Specify the logging provider. 'console' by default\n */\n provider?: Provider;\n /**\n * Specify the minimal logger serverity. 'warning' by default\n */\n minimalSeverity?: Logger.Severity;\n /**\n * Whether to output date time in log. true by default\n */\n logDateTime?: boolean;\n /**\n * Whether to output source information (Not yet supported). false by default\n */\n logSourceLocation?: boolean;\n }\n\n export interface CategorizedLogger {\n verbose(content: string): void;\n info(content: string): void;\n warning(content: string): void;\n error(content: string): void;\n fatal(content: string): void;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport interface Logger {\n (category: string): Logger.CategorizedLogger;\n\n verbose(content: string): void;\n verbose(category: string, content: string): void;\n info(content: string): void;\n info(category: string, content: string): void;\n warning(content: string): void;\n warning(category: string, content: string): void;\n error(content: string): void;\n error(category: string, content: string): void;\n fatal(content: string): void;\n fatal(category: string, content: string): void;\n\n /**\n * Reset the logger configuration.\n * @param config specify an optional default config\n */\n reset(config?: Logger.Config): void;\n /**\n * Set the logger's behavior on the given category\n * @param category specify a category string. If '*' is specified, all previous configuration will be overwritten. If\n * '' is specified, the default behavior will be updated.\n * @param config the config object to indicate the logger's behavior\n */\n set(category: string, config: Logger.Config): void;\n\n /**\n * Set the logger's behavior from ort-common env\n * @param env the env used to set logger. Currently only setting loglevel is supported through Env.\n */\n setWithEnv(env: Env): void;\n}\n\ninterface LoggerProvider {\n log(severity: Logger.Severity, content: string, category?: string): void;\n}\nclass NoOpLoggerProvider implements LoggerProvider {\n log(_severity: Logger.Severity, _content: string, _category?: string) {\n // do nothing\n }\n}\nclass ConsoleLoggerProvider implements LoggerProvider {\n log(severity: Logger.Severity, content: string, category?: string) {\n // eslint-disable-next-line no-console\n console.log(`${this.color(severity)} ${category ? '\\x1b[35m' + category + '\\x1b[0m ' : ''}${content}`);\n }\n\n private color(severity: Logger.Severity) {\n switch (severity) {\n case 'verbose':\n return '\\x1b[34;40mv\\x1b[0m';\n case 'info':\n return '\\x1b[32mi\\x1b[0m';\n case 'warning':\n return '\\x1b[30;43mw\\x1b[0m';\n case 'error':\n return '\\x1b[31;40me\\x1b[0m';\n case 'fatal':\n return '\\x1b[101mf\\x1b[0m';\n default:\n throw new Error(`unsupported severity: ${severity}`);\n }\n }\n}\n\nconst SEVERITY_VALUE = {\n verbose: 1000,\n info: 2000,\n warning: 4000,\n error: 5000,\n fatal: 6000\n};\n\nconst LOGGER_PROVIDER_MAP: {readonly [provider: string]: Readonly} = {\n ['none']: new NoOpLoggerProvider(),\n ['console']: new ConsoleLoggerProvider()\n};\nconst LOGGER_DEFAULT_CONFIG = {\n provider: 'console',\n minimalSeverity: 'warning',\n logDateTime: true,\n logSourceLocation: false\n};\nlet LOGGER_CONFIG_MAP:\n {[category: string]: Readonly>} = {['']: LOGGER_DEFAULT_CONFIG as Required};\n\nfunction log(category: string): Logger.CategorizedLogger;\nfunction log(severity: Logger.Severity, content: string): void;\nfunction log(severity: Logger.Severity, category: string, content: string): void;\nfunction log(severity: Logger.Severity, arg1: string, arg2?: string): void;\nfunction log(\n arg0: string|Logger.Severity, arg1?: string, arg2?: string|number, arg3?: number): Logger.CategorizedLogger|void {\n if (arg1 === undefined) {\n // log(category: string): Logger.CategorizedLogger;\n return createCategorizedLogger(arg0);\n } else if (arg2 === undefined) {\n // log(severity, content);\n logInternal(arg0 as Logger.Severity, arg1, 1);\n } else if (typeof arg2 === 'number' && arg3 === undefined) {\n // log(severity, content, stack)\n logInternal(arg0 as Logger.Severity, arg1, arg2);\n } else if (typeof arg2 === 'string' && arg3 === undefined) {\n // log(severity, category, content)\n logInternal(arg0 as Logger.Severity, arg2, 1, arg1);\n } else if (typeof arg2 === 'string' && typeof arg3 === 'number') {\n // log(severity, category, content, stack)\n logInternal(arg0 as Logger.Severity, arg2, arg3, arg1);\n } else {\n throw new TypeError('input is valid');\n }\n}\n\nfunction createCategorizedLogger(category: string): Logger.CategorizedLogger {\n return {\n verbose: log.verbose.bind(null, category),\n info: log.info.bind(null, category),\n warning: log.warning.bind(null, category),\n error: log.error.bind(null, category),\n fatal: log.fatal.bind(null, category)\n };\n}\n\n// NOTE: argument 'category' is put the last parameter beacause typescript\n// doesn't allow optional argument put in front of required argument. This\n// order is different from a usual logging API.\nfunction logInternal(severity: Logger.Severity, content: string, _stack: number, category?: string) {\n const config = LOGGER_CONFIG_MAP[category || ''] || LOGGER_CONFIG_MAP[''];\n if (SEVERITY_VALUE[severity] < SEVERITY_VALUE[config.minimalSeverity]) {\n return;\n }\n\n if (config.logDateTime) {\n content = `${new Date().toISOString()}|${content}`;\n }\n\n if (config.logSourceLocation) {\n // TODO: calculate source location from 'stack'\n }\n\n LOGGER_PROVIDER_MAP[config.provider].log(severity, content, category);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace log {\n export function verbose(content: string): void;\n export function verbose(category: string, content: string): void;\n export function verbose(arg0: string, arg1?: string) {\n log('verbose', arg0, arg1);\n }\n export function info(content: string): void;\n export function info(category: string, content: string): void;\n export function info(arg0: string, arg1?: string) {\n log('info', arg0, arg1);\n }\n export function warning(content: string): void;\n export function warning(category: string, content: string): void;\n export function warning(arg0: string, arg1?: string) {\n log('warning', arg0, arg1);\n }\n export function error(content: string): void;\n export function error(category: string, content: string): void;\n export function error(arg0: string, arg1?: string) {\n log('error', arg0, arg1);\n }\n export function fatal(content: string): void;\n export function fatal(category: string, content: string): void;\n export function fatal(arg0: string, arg1?: string) {\n log('fatal', arg0, arg1);\n }\n\n export function reset(config?: Logger.Config): void {\n LOGGER_CONFIG_MAP = {};\n set('', config || {});\n }\n export function set(category: string, config: Logger.Config): void {\n if (category === '*') {\n reset(config);\n } else {\n const previousConfig = LOGGER_CONFIG_MAP[category] || LOGGER_DEFAULT_CONFIG;\n LOGGER_CONFIG_MAP[category] = {\n provider: config.provider || previousConfig.provider,\n minimalSeverity: config.minimalSeverity || previousConfig.minimalSeverity,\n logDateTime: (config.logDateTime === undefined) ? previousConfig.logDateTime : config.logDateTime,\n logSourceLocation: (config.logSourceLocation === undefined) ? previousConfig.logSourceLocation :\n config.logSourceLocation\n };\n }\n\n // TODO: we want to support wildcard or regex?\n }\n\n export function setWithEnv(env: Env): void {\n const config: Logger.Config = {};\n if (env.logLevel) {\n config.minimalSeverity = env.logLevel as Logger.Severity;\n }\n set('', config);\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare, @typescript-eslint/naming-convention\nexport const Logger: Logger = log;\n\nexport declare namespace Profiler {\n export interface Config {\n maxNumberEvents?: number;\n flushBatchSize?: number;\n flushIntervalInMilliseconds?: number;\n }\n\n export type EventCategory = 'session'|'node'|'op'|'backend';\n\n export interface Event {\n end(): void|Promise;\n }\n}\n// TODO\n// class WebGLEvent implements Profiler.Event {}\n\nclass Event implements Profiler.Event {\n constructor(\n public category: Profiler.EventCategory, public name: string, public startTime: number,\n private endCallback: (e: Event) => void|Promise, public timer?: WebGLQuery, public ctx?: WebGLContext) {}\n\n async end() {\n return this.endCallback(this);\n }\n\n async checkTimer(): Promise {\n if (this.ctx === undefined || this.timer === undefined) {\n throw new Error('No webgl timer found');\n } else {\n this.ctx.endTimer();\n return this.ctx.waitForQueryAndGetTime(this.timer);\n }\n }\n}\n\nclass EventRecord {\n constructor(\n public category: Profiler.EventCategory, public name: string, public startTime: number, public endTime: number) {}\n}\n\nexport class Profiler {\n static create(config?: Profiler.Config): Profiler {\n if (config === undefined) {\n return new this();\n }\n return new this(config.maxNumberEvents, config.flushBatchSize, config.flushIntervalInMilliseconds);\n }\n\n private constructor(maxNumberEvents?: number, flushBatchSize?: number, flushIntervalInMilliseconds?: number) {\n this._started = false;\n this._maxNumberEvents = maxNumberEvents === undefined ? 10000 : maxNumberEvents;\n this._flushBatchSize = flushBatchSize === undefined ? 10 : flushBatchSize;\n this._flushIntervalInMilliseconds = flushIntervalInMilliseconds === undefined ? 5000 : flushIntervalInMilliseconds;\n }\n\n // start profiling\n start() {\n this._started = true;\n this._timingEvents = [];\n this._flushTime = now();\n this._flushPointer = 0;\n }\n\n // stop profiling\n stop() {\n this._started = false;\n for (; this._flushPointer < this._timingEvents.length; this._flushPointer++) {\n this.logOneEvent(this._timingEvents[this._flushPointer]);\n }\n }\n\n // create an event scope for the specific function\n event(category: Profiler.EventCategory, name: string, func: () => T, ctx?: WebGLContext): T;\n event(category: Profiler.EventCategory, name: string, func: () => Promise, ctx?: WebGLContext): Promise;\n\n event(category: Profiler.EventCategory, name: string, func: () => T | Promise, ctx?: WebGLContext): T\n |Promise {\n const event = this._started ? this.begin(category, name, ctx) : undefined;\n let isPromise = false;\n\n const res = func();\n\n // we consider a then-able object is a promise\n if (res && typeof (res as Promise).then === 'function') {\n isPromise = true;\n return new Promise((resolve, reject) => {\n (res as Promise)\n .then(\n async value => { // fulfilled\n if (event) {\n await event.end();\n }\n resolve(value);\n },\n async reason => { // rejected\n if (event) {\n await event.end();\n }\n reject(reason);\n });\n });\n }\n if (!isPromise && event) {\n const eventRes = event.end();\n if (eventRes && typeof eventRes.then === 'function') {\n return new Promise((resolve, reject) => {\n (eventRes).then(\n () => { // fulfilled\n resolve(res);\n },\n (reason) => { // rejected\n reject(reason);\n });\n });\n }\n }\n return res;\n }\n\n // begin an event\n begin(category: Profiler.EventCategory, name: string, ctx?: WebGLContext): Event {\n if (!this._started) {\n throw new Error('profiler is not started yet');\n }\n if (ctx === undefined) {\n const startTime = now();\n this.flush(startTime);\n return new Event(category, name, startTime, e => this.endSync(e));\n } else {\n const timer: WebGLQuery = ctx.beginTimer();\n return new Event(category, name, 0, async e => this.end(e), timer, ctx);\n }\n }\n\n // end the specific event\n private async end(event: Event): Promise {\n const endTime: number = await event.checkTimer();\n if (this._timingEvents.length < this._maxNumberEvents) {\n this._timingEvents.push(new EventRecord(event.category, event.name, event.startTime, endTime));\n this.flush(endTime);\n }\n }\n\n private endSync(event: Event): void {\n const endTime: number = now();\n if (this._timingEvents.length < this._maxNumberEvents) {\n this._timingEvents.push(new EventRecord(event.category, event.name, event.startTime, endTime));\n this.flush(endTime);\n }\n }\n\n private logOneEvent(event: EventRecord) {\n Logger.verbose(\n `Profiler.${event.category}`,\n `${(event.endTime - event.startTime).toFixed(2)}ms on event '${event.name}' at ${event.endTime.toFixed(2)}`);\n }\n\n private flush(currentTime: number) {\n if (this._timingEvents.length - this._flushPointer >= this._flushBatchSize ||\n currentTime - this._flushTime >= this._flushIntervalInMilliseconds) {\n // should flush when either batch size accumlated or interval elepsed\n\n for (const previousPointer = this._flushPointer; this._flushPointer < previousPointer + this._flushBatchSize &&\n this._flushPointer < this._timingEvents.length;\n this._flushPointer++) {\n this.logOneEvent(this._timingEvents[this._flushPointer]);\n }\n\n this._flushTime = now();\n }\n }\n\n get started() {\n return this._started;\n }\n private _started = false;\n private _timingEvents: EventRecord[];\n\n private readonly _maxNumberEvents: number;\n\n private readonly _flushBatchSize: number;\n private readonly _flushIntervalInMilliseconds: number;\n\n private _flushTime: number;\n private _flushPointer = 0;\n}\n\n/**\n * returns a number to represent the current timestamp in a resolution as high as possible.\n */\nexport const now = (typeof performance !== 'undefined' && performance.now) ? () => performance.now() : Date.now;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from './graph';\nimport {OperatorImplementation, OperatorInitialization} from './operators';\n\nexport interface OpSet {\n domain: string;\n version: number;\n}\nexport declare namespace OpSet {\n /**\n * Domain of an opset, it can be an empty string(default value, represent for ai.onnx), or 'ai.onnx.ml'\n */\n type Domain = ''|'ai.onnx.ml'|'com.microsoft';\n /**\n * A resolve rule consists of 4 or 5 items: opType, opSetDomain, versionSelector, operatorImplementation and\n * operatorInitialization (optional)\n */\n type ResolveRule = [\n string, Domain, string, OperatorImplementation\n ]|[string, Domain, string, OperatorImplementation, OperatorInitialization];\n}\n\nexport function resolveOperator(node: Graph.Node, opsets: readonly OpSet[], rules: readonly OpSet.ResolveRule[]) {\n for (const rule of rules) {\n const opType = rule[0];\n const domain = rule[1];\n const versionSelector = rule[2];\n const opImpl = rule[3];\n const opInit = rule[4];\n\n if (node.opType === opType) { // operator type matches\n for (const opset of opsets) {\n // opset '' and 'ai.onnx' are considered the same.\n if (opset.domain === domain || (opset.domain === 'ai.onnx' && domain === '')) { // opset domain found\n if (matchSelector(opset.version, versionSelector)) {\n return {opImpl, opInit};\n }\n }\n }\n }\n }\n\n throw new TypeError(`cannot resolve operator '${node.opType}' with opsets: ${\n opsets.map(set => `${set.domain || 'ai.onnx'} v${set.version}`).join(', ')}`);\n}\n\nfunction matchSelector(version: number, selector: string): boolean {\n if (selector.endsWith('+')) {\n // minimum version match ('7+' expects version>=7)\n const rangeStart = Number.parseInt(selector.substring(0, selector.length - 1), 10);\n return !isNaN(rangeStart) && rangeStart <= version;\n } else if (selector.split('-').length === 2) {\n // range match ('6-8' expects 6<=version<=8)\n const pair = selector.split('-');\n const rangeStart = Number.parseInt(pair[0], 10);\n const rangeEnd = Number.parseInt(pair[1], 10);\n return !isNaN(rangeStart) && !isNaN(rangeEnd) && rangeStart <= version && version <= rangeEnd;\n } else {\n // exact match ('7' expects version===7)\n return Number.parseInt(selector, 10) === version;\n }\n}\n", "\"use strict\";\r\nexports.__esModule = true;\r\nvar Guid = /** @class */ (function () {\r\n function Guid(guid) {\r\n if (!guid) {\r\n throw new TypeError(\"Invalid argument; `value` has no value.\");\r\n }\r\n this.value = Guid.EMPTY;\r\n if (guid && Guid.isGuid(guid)) {\r\n this.value = guid;\r\n }\r\n }\r\n Guid.isGuid = function (guid) {\r\n var value = guid.toString();\r\n return guid && (guid instanceof Guid || Guid.validator.test(value));\r\n };\r\n Guid.create = function () {\r\n return new Guid([Guid.gen(2), Guid.gen(1), Guid.gen(1), Guid.gen(1), Guid.gen(3)].join(\"-\"));\r\n };\r\n Guid.createEmpty = function () {\r\n return new Guid(\"emptyguid\");\r\n };\r\n Guid.parse = function (guid) {\r\n return new Guid(guid);\r\n };\r\n Guid.raw = function () {\r\n return [Guid.gen(2), Guid.gen(1), Guid.gen(1), Guid.gen(1), Guid.gen(3)].join(\"-\");\r\n };\r\n Guid.gen = function (count) {\r\n var out = \"\";\r\n for (var i = 0; i < count; i++) {\r\n // tslint:disable-next-line:no-bitwise\r\n out += (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);\r\n }\r\n return out;\r\n };\r\n Guid.prototype.equals = function (other) {\r\n // Comparing string `value` against provided `guid` will auto-call\r\n // toString on `guid` for comparison\r\n return Guid.isGuid(other) && this.value === other.toString();\r\n };\r\n Guid.prototype.isEmpty = function () {\r\n return this.value === Guid.EMPTY;\r\n };\r\n Guid.prototype.toString = function () {\r\n return this.value;\r\n };\r\n Guid.prototype.toJSON = function () {\r\n return {\r\n value: this.value\r\n };\r\n };\r\n Guid.validator = new RegExp(\"^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$\", \"i\");\r\n Guid.EMPTY = \"00000000-0000-0000-0000-000000000000\";\r\n return Guid;\r\n}());\r\nexports.Guid = Guid;\r\n", "/**\n * @license\n * Copyright 2009 The Closure Library Authors\n * Copyright 2020 Daniel Wirtz / The long.js Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// WebAssembly optimizations to do native i64 multiplication and divide\nvar wasm = null;\ntry {\n wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\n ])), {}).exports;\n} catch (e) {\n // no wasm support :(\n}\n\n/**\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\n * See the from* functions below for more convenient ways of constructing Longs.\n * @exports Long\n * @class A Long class for representing a 64 bit two's-complement integer value.\n * @param {number} low The low (signed) 32 bits of the long\n * @param {number} high The high (signed) 32 bits of the long\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @constructor\n */\nfunction Long(low, high, unsigned) {\n\n /**\n * The low 32 bits as a signed value.\n * @type {number}\n */\n this.low = low | 0;\n\n /**\n * The high 32 bits as a signed value.\n * @type {number}\n */\n this.high = high | 0;\n\n /**\n * Whether unsigned or not.\n * @type {boolean}\n */\n this.unsigned = !!unsigned;\n}\n\n// The internal representation of a long is the two given signed, 32-bit values.\n// We use 32-bit pieces because these are the size of integers on which\n// Javascript performs bit-operations. For operations like addition and\n// multiplication, we split each number into 16 bit pieces, which can easily be\n// multiplied within Javascript's floating-point representation without overflow\n// or change in sign.\n//\n// In the algorithms below, we frequently reduce the negative case to the\n// positive case by negating the input(s) and then post-processing the result.\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\n// a positive number, it overflows back into a negative). Not handling this\n// case would often result in infinite recursion.\n//\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\n// methods on which they depend.\n\n/**\n * An indicator used to reliably determine if an object is a Long or not.\n * @type {boolean}\n * @const\n * @private\n */\nLong.prototype.__isLong__;\n\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\n\n/**\n * @function\n * @param {*} obj Object\n * @returns {boolean}\n * @inner\n */\nfunction isLong(obj) {\n return (obj && obj[\"__isLong__\"]) === true;\n}\n\n/**\n * @function\n * @param {*} value number\n * @returns {number}\n * @inner\n */\nfunction ctz32(value) {\n var c = Math.clz32(value & -value);\n return value ? 31 - c : c;\n}\n\n/**\n * Tests if the specified object is a Long.\n * @function\n * @param {*} obj Object\n * @returns {boolean}\n */\nLong.isLong = isLong;\n\n/**\n * A cache of the Long representations of small integer values.\n * @type {!Object}\n * @inner\n */\nvar INT_CACHE = {};\n\n/**\n * A cache of the Long representations of small unsigned integer values.\n * @type {!Object}\n * @inner\n */\nvar UINT_CACHE = {};\n\n/**\n * @param {number} value\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nfunction fromInt(value, unsigned) {\n var obj, cachedObj, cache;\n if (unsigned) {\n value >>>= 0;\n if (cache = (0 <= value && value < 256)) {\n cachedObj = UINT_CACHE[value];\n if (cachedObj)\n return cachedObj;\n }\n obj = fromBits(value, 0, true);\n if (cache)\n UINT_CACHE[value] = obj;\n return obj;\n } else {\n value |= 0;\n if (cache = (-128 <= value && value < 128)) {\n cachedObj = INT_CACHE[value];\n if (cachedObj)\n return cachedObj;\n }\n obj = fromBits(value, value < 0 ? -1 : 0, false);\n if (cache)\n INT_CACHE[value] = obj;\n return obj;\n }\n}\n\n/**\n * Returns a Long representing the given 32 bit integer value.\n * @function\n * @param {number} value The 32 bit integer in question\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\nLong.fromInt = fromInt;\n\n/**\n * @param {number} value\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nfunction fromNumber(value, unsigned) {\n if (isNaN(value))\n return unsigned ? UZERO : ZERO;\n if (unsigned) {\n if (value < 0)\n return UZERO;\n if (value >= TWO_PWR_64_DBL)\n return MAX_UNSIGNED_VALUE;\n } else {\n if (value <= -TWO_PWR_63_DBL)\n return MIN_VALUE;\n if (value + 1 >= TWO_PWR_63_DBL)\n return MAX_VALUE;\n }\n if (value < 0)\n return fromNumber(-value, unsigned).neg();\n return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\n}\n\n/**\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\n * @function\n * @param {number} value The number in question\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\nLong.fromNumber = fromNumber;\n\n/**\n * @param {number} lowBits\n * @param {number} highBits\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nfunction fromBits(lowBits, highBits, unsigned) {\n return new Long(lowBits, highBits, unsigned);\n}\n\n/**\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\n * assumed to use 32 bits.\n * @function\n * @param {number} lowBits The low 32 bits\n * @param {number} highBits The high 32 bits\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\nLong.fromBits = fromBits;\n\n/**\n * @function\n * @param {number} base\n * @param {number} exponent\n * @returns {number}\n * @inner\n */\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\n\n/**\n * @param {string} str\n * @param {(boolean|number)=} unsigned\n * @param {number=} radix\n * @returns {!Long}\n * @inner\n */\nfunction fromString(str, unsigned, radix) {\n if (str.length === 0)\n throw Error('empty string');\n if (typeof unsigned === 'number') {\n // For goog.math.long compatibility\n radix = unsigned;\n unsigned = false;\n } else {\n unsigned = !!unsigned;\n }\n if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\n return unsigned ? UZERO : ZERO;\n radix = radix || 10;\n if (radix < 2 || 36 < radix)\n throw RangeError('radix');\n\n var p;\n if ((p = str.indexOf('-')) > 0)\n throw Error('interior hyphen');\n else if (p === 0) {\n return fromString(str.substring(1), unsigned, radix).neg();\n }\n\n // Do several (8) digits each time through the loop, so as to\n // minimize the calls to the very expensive emulated div.\n var radixToPower = fromNumber(pow_dbl(radix, 8));\n\n var result = ZERO;\n for (var i = 0; i < str.length; i += 8) {\n var size = Math.min(8, str.length - i),\n value = parseInt(str.substring(i, i + size), radix);\n if (size < 8) {\n var power = fromNumber(pow_dbl(radix, size));\n result = result.mul(power).add(fromNumber(value));\n } else {\n result = result.mul(radixToPower);\n result = result.add(fromNumber(value));\n }\n }\n result.unsigned = unsigned;\n return result;\n}\n\n/**\n * Returns a Long representation of the given string, written using the specified radix.\n * @function\n * @param {string} str The textual representation of the Long\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\n * @returns {!Long} The corresponding Long value\n */\nLong.fromString = fromString;\n\n/**\n * @function\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nfunction fromValue(val, unsigned) {\n if (typeof val === 'number')\n return fromNumber(val, unsigned);\n if (typeof val === 'string')\n return fromString(val, unsigned);\n // Throws for non-objects, converts non-instanceof Long:\n return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\n}\n\n/**\n * Converts the specified value to a Long using the appropriate from* function for its type.\n * @function\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long}\n */\nLong.fromValue = fromValue;\n\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\n// no runtime penalty for these.\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_16_DBL = 1 << 16;\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_24_DBL = 1 << 24;\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\n\n/**\n * @type {!Long}\n * @const\n * @inner\n */\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\n\n/**\n * @type {!Long}\n * @inner\n */\nvar ZERO = fromInt(0);\n\n/**\n * Signed zero.\n * @type {!Long}\n */\nLong.ZERO = ZERO;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar UZERO = fromInt(0, true);\n\n/**\n * Unsigned zero.\n * @type {!Long}\n */\nLong.UZERO = UZERO;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar ONE = fromInt(1);\n\n/**\n * Signed one.\n * @type {!Long}\n */\nLong.ONE = ONE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar UONE = fromInt(1, true);\n\n/**\n * Unsigned one.\n * @type {!Long}\n */\nLong.UONE = UONE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar NEG_ONE = fromInt(-1);\n\n/**\n * Signed negative one.\n * @type {!Long}\n */\nLong.NEG_ONE = NEG_ONE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar MAX_VALUE = fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0, false);\n\n/**\n * Maximum signed value.\n * @type {!Long}\n */\nLong.MAX_VALUE = MAX_VALUE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF | 0, 0xFFFFFFFF | 0, true);\n\n/**\n * Maximum unsigned value.\n * @type {!Long}\n */\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar MIN_VALUE = fromBits(0, 0x80000000 | 0, false);\n\n/**\n * Minimum signed value.\n * @type {!Long}\n */\nLong.MIN_VALUE = MIN_VALUE;\n\n/**\n * @alias Long.prototype\n * @inner\n */\nvar LongPrototype = Long.prototype;\n\n/**\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\n * @this {!Long}\n * @returns {number}\n */\nLongPrototype.toInt = function toInt() {\n return this.unsigned ? this.low >>> 0 : this.low;\n};\n\n/**\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\n * @this {!Long}\n * @returns {number}\n */\nLongPrototype.toNumber = function toNumber() {\n if (this.unsigned)\n return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\n return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\n};\n\n/**\n * Converts the Long to a string written in the specified radix.\n * @this {!Long}\n * @param {number=} radix Radix (2-36), defaults to 10\n * @returns {string}\n * @override\n * @throws {RangeError} If `radix` is out of range\n */\nLongPrototype.toString = function toString(radix) {\n radix = radix || 10;\n if (radix < 2 || 36 < radix)\n throw RangeError('radix');\n if (this.isZero())\n return '0';\n if (this.isNegative()) { // Unsigned Longs are never negative\n if (this.eq(MIN_VALUE)) {\n // We need to change the Long value before it can be negated, so we remove\n // the bottom-most digit in this base and then recurse to do the rest.\n var radixLong = fromNumber(radix),\n div = this.div(radixLong),\n rem1 = div.mul(radixLong).sub(this);\n return div.toString(radix) + rem1.toInt().toString(radix);\n } else\n return '-' + this.neg().toString(radix);\n }\n\n // Do several (6) digits each time through the loop, so as to\n // minimize the calls to the very expensive emulated div.\n var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\n rem = this;\n var result = '';\n while (true) {\n var remDiv = rem.div(radixToPower),\n intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\n digits = intval.toString(radix);\n rem = remDiv;\n if (rem.isZero())\n return digits + result;\n else {\n while (digits.length < 6)\n digits = '0' + digits;\n result = '' + digits + result;\n }\n }\n};\n\n/**\n * Gets the high 32 bits as a signed integer.\n * @this {!Long}\n * @returns {number} Signed high bits\n */\nLongPrototype.getHighBits = function getHighBits() {\n return this.high;\n};\n\n/**\n * Gets the high 32 bits as an unsigned integer.\n * @this {!Long}\n * @returns {number} Unsigned high bits\n */\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\n return this.high >>> 0;\n};\n\n/**\n * Gets the low 32 bits as a signed integer.\n * @this {!Long}\n * @returns {number} Signed low bits\n */\nLongPrototype.getLowBits = function getLowBits() {\n return this.low;\n};\n\n/**\n * Gets the low 32 bits as an unsigned integer.\n * @this {!Long}\n * @returns {number} Unsigned low bits\n */\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\n return this.low >>> 0;\n};\n\n/**\n * Gets the number of bits needed to represent the absolute value of this Long.\n * @this {!Long}\n * @returns {number}\n */\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\n if (this.isNegative()) // Unsigned Longs are never negative\n return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\n var val = this.high != 0 ? this.high : this.low;\n for (var bit = 31; bit > 0; bit--)\n if ((val & (1 << bit)) != 0)\n break;\n return this.high != 0 ? bit + 33 : bit + 1;\n};\n\n/**\n * Tests if this Long's value equals zero.\n * @this {!Long}\n * @returns {boolean}\n */\nLongPrototype.isZero = function isZero() {\n return this.high === 0 && this.low === 0;\n};\n\n/**\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\n * @returns {boolean}\n */\nLongPrototype.eqz = LongPrototype.isZero;\n\n/**\n * Tests if this Long's value is negative.\n * @this {!Long}\n * @returns {boolean}\n */\nLongPrototype.isNegative = function isNegative() {\n return !this.unsigned && this.high < 0;\n};\n\n/**\n * Tests if this Long's value is positive or zero.\n * @this {!Long}\n * @returns {boolean}\n */\nLongPrototype.isPositive = function isPositive() {\n return this.unsigned || this.high >= 0;\n};\n\n/**\n * Tests if this Long's value is odd.\n * @this {!Long}\n * @returns {boolean}\n */\nLongPrototype.isOdd = function isOdd() {\n return (this.low & 1) === 1;\n};\n\n/**\n * Tests if this Long's value is even.\n * @this {!Long}\n * @returns {boolean}\n */\nLongPrototype.isEven = function isEven() {\n return (this.low & 1) === 0;\n};\n\n/**\n * Tests if this Long's value equals the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.equals = function equals(other) {\n if (!isLong(other))\n other = fromValue(other);\n if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\n return false;\n return this.high === other.high && this.low === other.low;\n};\n\n/**\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.eq = LongPrototype.equals;\n\n/**\n * Tests if this Long's value differs from the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.notEquals = function notEquals(other) {\n return !this.eq(/* validates */ other);\n};\n\n/**\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.neq = LongPrototype.notEquals;\n\n/**\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.ne = LongPrototype.notEquals;\n\n/**\n * Tests if this Long's value is less than the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.lessThan = function lessThan(other) {\n return this.comp(/* validates */ other) < 0;\n};\n\n/**\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.lt = LongPrototype.lessThan;\n\n/**\n * Tests if this Long's value is less than or equal the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\n return this.comp(/* validates */ other) <= 0;\n};\n\n/**\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\n\n/**\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.le = LongPrototype.lessThanOrEqual;\n\n/**\n * Tests if this Long's value is greater than the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.greaterThan = function greaterThan(other) {\n return this.comp(/* validates */ other) > 0;\n};\n\n/**\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.gt = LongPrototype.greaterThan;\n\n/**\n * Tests if this Long's value is greater than or equal the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\n return this.comp(/* validates */ other) >= 0;\n};\n\n/**\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\n\n/**\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\n\n/**\n * Compares this Long's value with the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\n * if the given one is greater\n */\nLongPrototype.compare = function compare(other) {\n if (!isLong(other))\n other = fromValue(other);\n if (this.eq(other))\n return 0;\n var thisNeg = this.isNegative(),\n otherNeg = other.isNegative();\n if (thisNeg && !otherNeg)\n return -1;\n if (!thisNeg && otherNeg)\n return 1;\n // At this point the sign bits are the same\n if (!this.unsigned)\n return this.sub(other).isNegative() ? -1 : 1;\n // Both are positive if at least one is unsigned\n return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\n};\n\n/**\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\n * if the given one is greater\n */\nLongPrototype.comp = LongPrototype.compare;\n\n/**\n * Negates this Long's value.\n * @this {!Long}\n * @returns {!Long} Negated Long\n */\nLongPrototype.negate = function negate() {\n if (!this.unsigned && this.eq(MIN_VALUE))\n return MIN_VALUE;\n return this.not().add(ONE);\n};\n\n/**\n * Negates this Long's value. This is an alias of {@link Long#negate}.\n * @function\n * @returns {!Long} Negated Long\n */\nLongPrototype.neg = LongPrototype.negate;\n\n/**\n * Returns the sum of this and the specified Long.\n * @this {!Long}\n * @param {!Long|number|string} addend Addend\n * @returns {!Long} Sum\n */\nLongPrototype.add = function add(addend) {\n if (!isLong(addend))\n addend = fromValue(addend);\n\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\n\n var a48 = this.high >>> 16;\n var a32 = this.high & 0xFFFF;\n var a16 = this.low >>> 16;\n var a00 = this.low & 0xFFFF;\n\n var b48 = addend.high >>> 16;\n var b32 = addend.high & 0xFFFF;\n var b16 = addend.low >>> 16;\n var b00 = addend.low & 0xFFFF;\n\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n c00 += a00 + b00;\n c16 += c00 >>> 16;\n c00 &= 0xFFFF;\n c16 += a16 + b16;\n c32 += c16 >>> 16;\n c16 &= 0xFFFF;\n c32 += a32 + b32;\n c48 += c32 >>> 16;\n c32 &= 0xFFFF;\n c48 += a48 + b48;\n c48 &= 0xFFFF;\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\n};\n\n/**\n * Returns the difference of this and the specified Long.\n * @this {!Long}\n * @param {!Long|number|string} subtrahend Subtrahend\n * @returns {!Long} Difference\n */\nLongPrototype.subtract = function subtract(subtrahend) {\n if (!isLong(subtrahend))\n subtrahend = fromValue(subtrahend);\n return this.add(subtrahend.neg());\n};\n\n/**\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\n * @function\n * @param {!Long|number|string} subtrahend Subtrahend\n * @returns {!Long} Difference\n */\nLongPrototype.sub = LongPrototype.subtract;\n\n/**\n * Returns the product of this and the specified Long.\n * @this {!Long}\n * @param {!Long|number|string} multiplier Multiplier\n * @returns {!Long} Product\n */\nLongPrototype.multiply = function multiply(multiplier) {\n if (this.isZero())\n return this;\n if (!isLong(multiplier))\n multiplier = fromValue(multiplier);\n\n // use wasm support if present\n if (wasm) {\n var low = wasm[\"mul\"](this.low,\n this.high,\n multiplier.low,\n multiplier.high);\n return fromBits(low, wasm[\"get_high\"](), this.unsigned);\n }\n\n if (multiplier.isZero())\n return this.unsigned ? UZERO : ZERO;\n if (this.eq(MIN_VALUE))\n return multiplier.isOdd() ? MIN_VALUE : ZERO;\n if (multiplier.eq(MIN_VALUE))\n return this.isOdd() ? MIN_VALUE : ZERO;\n\n if (this.isNegative()) {\n if (multiplier.isNegative())\n return this.neg().mul(multiplier.neg());\n else\n return this.neg().mul(multiplier).neg();\n } else if (multiplier.isNegative())\n return this.mul(multiplier.neg()).neg();\n\n // If both longs are small, use float multiplication\n if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\n return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\n\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\n // We can skip products that would overflow.\n\n var a48 = this.high >>> 16;\n var a32 = this.high & 0xFFFF;\n var a16 = this.low >>> 16;\n var a00 = this.low & 0xFFFF;\n\n var b48 = multiplier.high >>> 16;\n var b32 = multiplier.high & 0xFFFF;\n var b16 = multiplier.low >>> 16;\n var b00 = multiplier.low & 0xFFFF;\n\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n c00 += a00 * b00;\n c16 += c00 >>> 16;\n c00 &= 0xFFFF;\n c16 += a16 * b00;\n c32 += c16 >>> 16;\n c16 &= 0xFFFF;\n c16 += a00 * b16;\n c32 += c16 >>> 16;\n c16 &= 0xFFFF;\n c32 += a32 * b00;\n c48 += c32 >>> 16;\n c32 &= 0xFFFF;\n c32 += a16 * b16;\n c48 += c32 >>> 16;\n c32 &= 0xFFFF;\n c32 += a00 * b32;\n c48 += c32 >>> 16;\n c32 &= 0xFFFF;\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\n c48 &= 0xFFFF;\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\n};\n\n/**\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\n * @function\n * @param {!Long|number|string} multiplier Multiplier\n * @returns {!Long} Product\n */\nLongPrototype.mul = LongPrototype.multiply;\n\n/**\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\n * unsigned if this Long is unsigned.\n * @this {!Long}\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Quotient\n */\nLongPrototype.divide = function divide(divisor) {\n if (!isLong(divisor))\n divisor = fromValue(divisor);\n if (divisor.isZero())\n throw Error('division by zero');\n\n // use wasm support if present\n if (wasm) {\n // guard against signed division overflow: the largest\n // negative number / -1 would be 1 larger than the largest\n // positive number, due to two's complement.\n if (!this.unsigned &&\n this.high === -0x80000000 &&\n divisor.low === -1 && divisor.high === -1) {\n // be consistent with non-wasm code path\n return this;\n }\n var low = (this.unsigned ? wasm[\"div_u\"] : wasm[\"div_s\"])(\n this.low,\n this.high,\n divisor.low,\n divisor.high\n );\n return fromBits(low, wasm[\"get_high\"](), this.unsigned);\n }\n\n if (this.isZero())\n return this.unsigned ? UZERO : ZERO;\n var approx, rem, res;\n if (!this.unsigned) {\n // This section is only relevant for signed longs and is derived from the\n // closure library as a whole.\n if (this.eq(MIN_VALUE)) {\n if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\n return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\n else if (divisor.eq(MIN_VALUE))\n return ONE;\n else {\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\n var halfThis = this.shr(1);\n approx = halfThis.div(divisor).shl(1);\n if (approx.eq(ZERO)) {\n return divisor.isNegative() ? ONE : NEG_ONE;\n } else {\n rem = this.sub(divisor.mul(approx));\n res = approx.add(rem.div(divisor));\n return res;\n }\n }\n } else if (divisor.eq(MIN_VALUE))\n return this.unsigned ? UZERO : ZERO;\n if (this.isNegative()) {\n if (divisor.isNegative())\n return this.neg().div(divisor.neg());\n return this.neg().div(divisor).neg();\n } else if (divisor.isNegative())\n return this.div(divisor.neg()).neg();\n res = ZERO;\n } else {\n // The algorithm below has not been made for unsigned longs. It's therefore\n // required to take special care of the MSB prior to running it.\n if (!divisor.unsigned)\n divisor = divisor.toUnsigned();\n if (divisor.gt(this))\n return UZERO;\n if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\n return UONE;\n res = UZERO;\n }\n\n // Repeat the following until the remainder is less than other: find a\n // floating-point that approximates remainder / other *from below*, add this\n // into the result, and subtract it from the remainder. It is critical that\n // the approximate value is less than or equal to the real value so that the\n // remainder never becomes negative.\n rem = this;\n while (rem.gte(divisor)) {\n // Approximate the result of division. This may be a little greater or\n // smaller than the actual value.\n approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\n\n // We will tweak the approximate result by changing it in the 48-th digit or\n // the smallest non-fractional digit, whichever is larger.\n var log2 = Math.ceil(Math.log(approx) / Math.LN2),\n delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\n\n // Decrease the approximation until it is smaller than the remainder. Note\n // that if it is too large, the product overflows and is negative.\n approxRes = fromNumber(approx),\n approxRem = approxRes.mul(divisor);\n while (approxRem.isNegative() || approxRem.gt(rem)) {\n approx -= delta;\n approxRes = fromNumber(approx, this.unsigned);\n approxRem = approxRes.mul(divisor);\n }\n\n // We know the answer can't be zero... and actually, zero would cause\n // infinite recursion since we would make no progress.\n if (approxRes.isZero())\n approxRes = ONE;\n\n res = res.add(approxRes);\n rem = rem.sub(approxRem);\n }\n return res;\n};\n\n/**\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\n * @function\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Quotient\n */\nLongPrototype.div = LongPrototype.divide;\n\n/**\n * Returns this Long modulo the specified.\n * @this {!Long}\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Remainder\n */\nLongPrototype.modulo = function modulo(divisor) {\n if (!isLong(divisor))\n divisor = fromValue(divisor);\n\n // use wasm support if present\n if (wasm) {\n var low = (this.unsigned ? wasm[\"rem_u\"] : wasm[\"rem_s\"])(\n this.low,\n this.high,\n divisor.low,\n divisor.high\n );\n return fromBits(low, wasm[\"get_high\"](), this.unsigned);\n }\n\n return this.sub(this.div(divisor).mul(divisor));\n};\n\n/**\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\n * @function\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Remainder\n */\nLongPrototype.mod = LongPrototype.modulo;\n\n/**\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\n * @function\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Remainder\n */\nLongPrototype.rem = LongPrototype.modulo;\n\n/**\n * Returns the bitwise NOT of this Long.\n * @this {!Long}\n * @returns {!Long}\n */\nLongPrototype.not = function not() {\n return fromBits(~this.low, ~this.high, this.unsigned);\n};\n\n/**\n * Returns count leading zeros of this Long.\n * @this {!Long}\n * @returns {!number}\n */\nLongPrototype.countLeadingZeros = function countLeadingZeros() {\n return this.high ? Math.clz32(this.high) : Math.clz32(this.low) + 32;\n};\n\n/**\n * Returns count leading zeros. This is an alias of {@link Long#countLeadingZeros}.\n * @function\n * @param {!Long}\n * @returns {!number}\n */\nLongPrototype.clz = LongPrototype.countLeadingZeros;\n\n/**\n * Returns count trailing zeros of this Long.\n * @this {!Long}\n * @returns {!number}\n */\nLongPrototype.countTrailingZeros = function countTrailingZeros() {\n return this.low ? ctz32(this.low) : ctz32(this.high) + 32;\n};\n\n/**\n * Returns count trailing zeros. This is an alias of {@link Long#countTrailingZeros}.\n * @function\n * @param {!Long}\n * @returns {!number}\n */\nLongPrototype.ctz = LongPrototype.countTrailingZeros;\n\n/**\n * Returns the bitwise AND of this Long and the specified.\n * @this {!Long}\n * @param {!Long|number|string} other Other Long\n * @returns {!Long}\n */\nLongPrototype.and = function and(other) {\n if (!isLong(other))\n other = fromValue(other);\n return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\n};\n\n/**\n * Returns the bitwise OR of this Long and the specified.\n * @this {!Long}\n * @param {!Long|number|string} other Other Long\n * @returns {!Long}\n */\nLongPrototype.or = function or(other) {\n if (!isLong(other))\n other = fromValue(other);\n return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\n};\n\n/**\n * Returns the bitwise XOR of this Long and the given one.\n * @this {!Long}\n * @param {!Long|number|string} other Other Long\n * @returns {!Long}\n */\nLongPrototype.xor = function xor(other) {\n if (!isLong(other))\n other = fromValue(other);\n return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\n};\n\n/**\n * Returns this Long with bits shifted to the left by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\n if (isLong(numBits))\n numBits = numBits.toInt();\n if ((numBits &= 63) === 0)\n return this;\n else if (numBits < 32)\n return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\n else\n return fromBits(0, this.low << (numBits - 32), this.unsigned);\n};\n\n/**\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shl = LongPrototype.shiftLeft;\n\n/**\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shiftRight = function shiftRight(numBits) {\n if (isLong(numBits))\n numBits = numBits.toInt();\n if ((numBits &= 63) === 0)\n return this;\n else if (numBits < 32)\n return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\n else\n return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\n};\n\n/**\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shr = LongPrototype.shiftRight;\n\n/**\n * Returns this Long with bits logically shifted to the right by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\n if (isLong(numBits)) numBits = numBits.toInt();\n if ((numBits &= 63) === 0) return this;\n if (numBits < 32) return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >>> numBits, this.unsigned);\n if (numBits === 32) return fromBits(this.high, 0, this.unsigned);\n return fromBits(this.high >>> (numBits - 32), 0, this.unsigned);\n};\n\n/**\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\n\n/**\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\n\n/**\n * Returns this Long with bits rotated to the left by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\nLongPrototype.rotateLeft = function rotateLeft(numBits) {\n var b;\n if (isLong(numBits)) numBits = numBits.toInt();\n if ((numBits &= 63) === 0) return this;\n if (numBits === 32) return fromBits(this.high, this.low, this.unsigned);\n if (numBits < 32) {\n b = (32 - numBits);\n return fromBits(((this.low << numBits) | (this.high >>> b)), ((this.high << numBits) | (this.low >>> b)), this.unsigned);\n }\n numBits -= 32;\n b = (32 - numBits);\n return fromBits(((this.high << numBits) | (this.low >>> b)), ((this.low << numBits) | (this.high >>> b)), this.unsigned);\n}\n/**\n * Returns this Long with bits rotated to the left by the given amount. This is an alias of {@link Long#rotateLeft}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\nLongPrototype.rotl = LongPrototype.rotateLeft;\n\n/**\n * Returns this Long with bits rotated to the right by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\nLongPrototype.rotateRight = function rotateRight(numBits) {\n var b;\n if (isLong(numBits)) numBits = numBits.toInt();\n if ((numBits &= 63) === 0) return this;\n if (numBits === 32) return fromBits(this.high, this.low, this.unsigned);\n if (numBits < 32) {\n b = (32 - numBits);\n return fromBits(((this.high << b) | (this.low >>> numBits)), ((this.low << b) | (this.high >>> numBits)), this.unsigned);\n }\n numBits -= 32;\n b = (32 - numBits);\n return fromBits(((this.low << b) | (this.high >>> numBits)), ((this.high << b) | (this.low >>> numBits)), this.unsigned);\n}\n/**\n * Returns this Long with bits rotated to the right by the given amount. This is an alias of {@link Long#rotateRight}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\nLongPrototype.rotr = LongPrototype.rotateRight;\n\n/**\n * Converts this Long to signed.\n * @this {!Long}\n * @returns {!Long} Signed long\n */\nLongPrototype.toSigned = function toSigned() {\n if (!this.unsigned)\n return this;\n return fromBits(this.low, this.high, false);\n};\n\n/**\n * Converts this Long to unsigned.\n * @this {!Long}\n * @returns {!Long} Unsigned long\n */\nLongPrototype.toUnsigned = function toUnsigned() {\n if (this.unsigned)\n return this;\n return fromBits(this.low, this.high, true);\n};\n\n/**\n * Converts this Long to its byte representation.\n * @param {boolean=} le Whether little or big endian, defaults to big endian\n * @this {!Long}\n * @returns {!Array.} Byte representation\n */\nLongPrototype.toBytes = function toBytes(le) {\n return le ? this.toBytesLE() : this.toBytesBE();\n};\n\n/**\n * Converts this Long to its little endian byte representation.\n * @this {!Long}\n * @returns {!Array.} Little endian byte representation\n */\nLongPrototype.toBytesLE = function toBytesLE() {\n var hi = this.high,\n lo = this.low;\n return [\n lo & 0xff,\n lo >>> 8 & 0xff,\n lo >>> 16 & 0xff,\n lo >>> 24,\n hi & 0xff,\n hi >>> 8 & 0xff,\n hi >>> 16 & 0xff,\n hi >>> 24\n ];\n};\n\n/**\n * Converts this Long to its big endian byte representation.\n * @this {!Long}\n * @returns {!Array.} Big endian byte representation\n */\nLongPrototype.toBytesBE = function toBytesBE() {\n var hi = this.high,\n lo = this.low;\n return [\n hi >>> 24,\n hi >>> 16 & 0xff,\n hi >>> 8 & 0xff,\n hi & 0xff,\n lo >>> 24,\n lo >>> 16 & 0xff,\n lo >>> 8 & 0xff,\n lo & 0xff\n ];\n};\n\n/**\n * Creates a Long from its byte representation.\n * @param {!Array.} bytes Byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @param {boolean=} le Whether little or big endian, defaults to big endian\n * @returns {Long} The corresponding Long value\n */\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\n return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\n};\n\n/**\n * Creates a Long from its little endian byte representation.\n * @param {!Array.} bytes Little endian byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {Long} The corresponding Long value\n */\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\n return new Long(\n bytes[0] |\n bytes[1] << 8 |\n bytes[2] << 16 |\n bytes[3] << 24,\n bytes[4] |\n bytes[5] << 8 |\n bytes[6] << 16 |\n bytes[7] << 24,\n unsigned\n );\n};\n\n/**\n * Creates a Long from its big endian byte representation.\n * @param {!Array.} bytes Big endian byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {Long} The corresponding Long value\n */\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\n return new Long(\n bytes[4] << 24 |\n bytes[5] << 16 |\n bytes[6] << 8 |\n bytes[7],\n bytes[0] << 24 |\n bytes[1] << 16 |\n bytes[2] << 8 |\n bytes[3],\n unsigned\n );\n};\n\nexport default Long;\n", "/// @file\n/// @addtogroup flatbuffers_javascript_api\n/// @{\n/// @cond FLATBUFFERS_INTERNAL\n\n/**\n * @fileoverview\n *\n * Need to suppress 'global this' error so the Node.js export line doesn't cause\n * closure compile to error out.\n * @suppress {globalThis}\n */\n\n/**\n * @const\n * @namespace\n */\nvar flatbuffers = {};\n\n/**\n * @typedef {number}\n */\nflatbuffers.Offset;\n\n/**\n * @typedef {{\n * bb: flatbuffers.ByteBuffer,\n * bb_pos: number\n * }}\n */\nflatbuffers.Table;\n\n/**\n * @type {number}\n * @const\n */\nflatbuffers.SIZEOF_SHORT = 2;\n\n/**\n * @type {number}\n * @const\n */\nflatbuffers.SIZEOF_INT = 4;\n\n/**\n * @type {number}\n * @const\n */\nflatbuffers.FILE_IDENTIFIER_LENGTH = 4;\n\n/**\n * @type {number}\n * @const\n */\nflatbuffers.SIZE_PREFIX_LENGTH = 4;\n\n/**\n * @enum {number}\n */\nflatbuffers.Encoding = {\n UTF8_BYTES: 1,\n UTF16_STRING: 2\n};\n\n/**\n * @type {Int32Array}\n * @const\n */\nflatbuffers.int32 = new Int32Array(2);\n\n/**\n * @type {Float32Array}\n * @const\n */\nflatbuffers.float32 = new Float32Array(flatbuffers.int32.buffer);\n\n/**\n * @type {Float64Array}\n * @const\n */\nflatbuffers.float64 = new Float64Array(flatbuffers.int32.buffer);\n\n/**\n * @type {boolean}\n * @const\n */\nflatbuffers.isLittleEndian = new Uint16Array(new Uint8Array([1, 0]).buffer)[0] === 1;\n\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * @constructor\n * @param {number} low\n * @param {number} high\n */\nflatbuffers.Long = function(low, high) {\n /**\n * @type {number}\n * @const\n */\n this.low = low | 0;\n\n /**\n * @type {number}\n * @const\n */\n this.high = high | 0;\n};\n\n/**\n * @param {number} low\n * @param {number} high\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.Long.create = function(low, high) {\n // Special-case zero to avoid GC overhead for default values\n return low == 0 && high == 0 ? flatbuffers.Long.ZERO : new flatbuffers.Long(low, high);\n};\n\n/**\n * @returns {number}\n */\nflatbuffers.Long.prototype.toFloat64 = function() {\n return (this.low >>> 0) + this.high * 0x100000000;\n};\n\n/**\n * @param {flatbuffers.Long} other\n * @returns {boolean}\n */\nflatbuffers.Long.prototype.equals = function(other) {\n return this.low == other.low && this.high == other.high;\n};\n\n/**\n * @type {!flatbuffers.Long}\n * @const\n */\nflatbuffers.Long.ZERO = new flatbuffers.Long(0, 0);\n\n/// @endcond\n////////////////////////////////////////////////////////////////////////////////\n/**\n * Create a FlatBufferBuilder.\n *\n * @constructor\n * @param {number=} opt_initial_size\n */\nflatbuffers.Builder = function(opt_initial_size) {\n if (!opt_initial_size) {\n var initial_size = 1024;\n } else {\n var initial_size = opt_initial_size;\n }\n\n /**\n * @type {flatbuffers.ByteBuffer}\n * @private\n */\n this.bb = flatbuffers.ByteBuffer.allocate(initial_size);\n\n /**\n * Remaining space in the ByteBuffer.\n *\n * @type {number}\n * @private\n */\n this.space = initial_size;\n\n /**\n * Minimum alignment encountered so far.\n *\n * @type {number}\n * @private\n */\n this.minalign = 1;\n\n /**\n * The vtable for the current table.\n *\n * @type {Array.}\n * @private\n */\n this.vtable = null;\n\n /**\n * The amount of fields we're actually using.\n *\n * @type {number}\n * @private\n */\n this.vtable_in_use = 0;\n\n /**\n * Whether we are currently serializing a table.\n *\n * @type {boolean}\n * @private\n */\n this.isNested = false;\n\n /**\n * Starting offset of the current struct/table.\n *\n * @type {number}\n * @private\n */\n this.object_start = 0;\n\n /**\n * List of offsets of all vtables.\n *\n * @type {Array.}\n * @private\n */\n this.vtables = [];\n\n /**\n * For the current vector being built.\n *\n * @type {number}\n * @private\n */\n this.vector_num_elems = 0;\n\n /**\n * False omits default values from the serialized data\n *\n * @type {boolean}\n * @private\n */\n this.force_defaults = false;\n};\n\nflatbuffers.Builder.prototype.clear = function() {\n this.bb.clear();\n this.space = this.bb.capacity();\n this.minalign = 1;\n this.vtable = null;\n this.vtable_in_use = 0;\n this.isNested = false;\n this.object_start = 0;\n this.vtables = [];\n this.vector_num_elems = 0;\n this.force_defaults = false;\n};\n\n/**\n * In order to save space, fields that are set to their default value\n * don't get serialized into the buffer. Forcing defaults provides a\n * way to manually disable this optimization.\n *\n * @param {boolean} forceDefaults true always serializes default values\n */\nflatbuffers.Builder.prototype.forceDefaults = function(forceDefaults) {\n this.force_defaults = forceDefaults;\n};\n\n/**\n * Get the ByteBuffer representing the FlatBuffer. Only call this after you've\n * called finish(). The actual data starts at the ByteBuffer's current position,\n * not necessarily at 0.\n *\n * @returns {flatbuffers.ByteBuffer}\n */\nflatbuffers.Builder.prototype.dataBuffer = function() {\n return this.bb;\n};\n\n/**\n * Get the bytes representing the FlatBuffer. Only call this after you've\n * called finish().\n *\n * @returns {!Uint8Array}\n */\nflatbuffers.Builder.prototype.asUint8Array = function() {\n return this.bb.bytes().subarray(this.bb.position(), this.bb.position() + this.offset());\n};\n\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * Prepare to write an element of `size` after `additional_bytes` have been\n * written, e.g. if you write a string, you need to align such the int length\n * field is aligned to 4 bytes, and the string data follows it directly. If all\n * you need to do is alignment, `additional_bytes` will be 0.\n *\n * @param {number} size This is the of the new element to write\n * @param {number} additional_bytes The padding size\n */\nflatbuffers.Builder.prototype.prep = function(size, additional_bytes) {\n // Track the biggest thing we've ever aligned to.\n if (size > this.minalign) {\n this.minalign = size;\n }\n\n // Find the amount of alignment needed such that `size` is properly\n // aligned after `additional_bytes`\n var align_size = ((~(this.bb.capacity() - this.space + additional_bytes)) + 1) & (size - 1);\n\n // Reallocate the buffer if needed.\n while (this.space < align_size + size + additional_bytes) {\n var old_buf_size = this.bb.capacity();\n this.bb = flatbuffers.Builder.growByteBuffer(this.bb);\n this.space += this.bb.capacity() - old_buf_size;\n }\n\n this.pad(align_size);\n};\n\n/**\n * @param {number} byte_size\n */\nflatbuffers.Builder.prototype.pad = function(byte_size) {\n for (var i = 0; i < byte_size; i++) {\n this.bb.writeInt8(--this.space, 0);\n }\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeInt8 = function(value) {\n this.bb.writeInt8(this.space -= 1, value);\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeInt16 = function(value) {\n this.bb.writeInt16(this.space -= 2, value);\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeInt32 = function(value) {\n this.bb.writeInt32(this.space -= 4, value);\n};\n\n/**\n * @param {flatbuffers.Long} value\n */\nflatbuffers.Builder.prototype.writeInt64 = function(value) {\n this.bb.writeInt64(this.space -= 8, value);\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeFloat32 = function(value) {\n this.bb.writeFloat32(this.space -= 4, value);\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeFloat64 = function(value) {\n this.bb.writeFloat64(this.space -= 8, value);\n};\n/// @endcond\n\n/**\n * Add an `int8` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `int8` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addInt8 = function(value) {\n this.prep(1, 0);\n this.writeInt8(value);\n};\n\n/**\n * Add an `int16` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `int16` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addInt16 = function(value) {\n this.prep(2, 0);\n this.writeInt16(value);\n};\n\n/**\n * Add an `int32` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `int32` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addInt32 = function(value) {\n this.prep(4, 0);\n this.writeInt32(value);\n};\n\n/**\n * Add an `int64` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {flatbuffers.Long} value The `int64` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addInt64 = function(value) {\n this.prep(8, 0);\n this.writeInt64(value);\n};\n\n/**\n * Add a `float32` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `float32` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addFloat32 = function(value) {\n this.prep(4, 0);\n this.writeFloat32(value);\n};\n\n/**\n * Add a `float64` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `float64` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addFloat64 = function(value) {\n this.prep(8, 0);\n this.writeFloat64(value);\n};\n\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldInt8 = function(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addInt8(value);\n this.slot(voffset);\n }\n};\n\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldInt16 = function(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addInt16(value);\n this.slot(voffset);\n }\n};\n\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldInt32 = function(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addInt32(value);\n this.slot(voffset);\n }\n};\n\n/**\n * @param {number} voffset\n * @param {flatbuffers.Long} value\n * @param {flatbuffers.Long} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldInt64 = function(voffset, value, defaultValue) {\n if (this.force_defaults || !value.equals(defaultValue)) {\n this.addInt64(value);\n this.slot(voffset);\n }\n};\n\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldFloat32 = function(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addFloat32(value);\n this.slot(voffset);\n }\n};\n\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldFloat64 = function(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addFloat64(value);\n this.slot(voffset);\n }\n};\n\n/**\n * @param {number} voffset\n * @param {flatbuffers.Offset} value\n * @param {flatbuffers.Offset} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldOffset = function(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addOffset(value);\n this.slot(voffset);\n }\n};\n\n/**\n * Structs are stored inline, so nothing additional is being added. `d` is always 0.\n *\n * @param {number} voffset\n * @param {flatbuffers.Offset} value\n * @param {flatbuffers.Offset} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldStruct = function(voffset, value, defaultValue) {\n if (value != defaultValue) {\n this.nested(value);\n this.slot(voffset);\n }\n};\n\n/**\n * Structures are always stored inline, they need to be created right\n * where they're used. You'll get this assertion failure if you\n * created it elsewhere.\n *\n * @param {flatbuffers.Offset} obj The offset of the created object\n */\nflatbuffers.Builder.prototype.nested = function(obj) {\n if (obj != this.offset()) {\n throw new Error('FlatBuffers: struct must be serialized inline.');\n }\n};\n\n/**\n * Should not be creating any other object, string or vector\n * while an object is being constructed\n */\nflatbuffers.Builder.prototype.notNested = function() {\n if (this.isNested) {\n throw new Error('FlatBuffers: object serialization must not be nested.');\n }\n};\n\n/**\n * Set the current vtable at `voffset` to the current location in the buffer.\n *\n * @param {number} voffset\n */\nflatbuffers.Builder.prototype.slot = function(voffset) {\n this.vtable[voffset] = this.offset();\n};\n\n/**\n * @returns {flatbuffers.Offset} Offset relative to the end of the buffer.\n */\nflatbuffers.Builder.prototype.offset = function() {\n return this.bb.capacity() - this.space;\n};\n\n/**\n * Doubles the size of the backing ByteBuffer and copies the old data towards\n * the end of the new buffer (since we build the buffer backwards).\n *\n * @param {flatbuffers.ByteBuffer} bb The current buffer with the existing data\n * @returns {!flatbuffers.ByteBuffer} A new byte buffer with the old data copied\n * to it. The data is located at the end of the buffer.\n *\n * uint8Array.set() formally takes {Array|ArrayBufferView}, so to pass\n * it a uint8Array we need to suppress the type check:\n * @suppress {checkTypes}\n */\nflatbuffers.Builder.growByteBuffer = function(bb) {\n var old_buf_size = bb.capacity();\n\n // Ensure we don't grow beyond what fits in an int.\n if (old_buf_size & 0xC0000000) {\n throw new Error('FlatBuffers: cannot grow buffer beyond 2 gigabytes.');\n }\n\n var new_buf_size = old_buf_size << 1;\n var nbb = flatbuffers.ByteBuffer.allocate(new_buf_size);\n nbb.setPosition(new_buf_size - old_buf_size);\n nbb.bytes().set(bb.bytes(), new_buf_size - old_buf_size);\n return nbb;\n};\n/// @endcond\n\n/**\n * Adds on offset, relative to where it will be written.\n *\n * @param {flatbuffers.Offset} offset The offset to add.\n */\nflatbuffers.Builder.prototype.addOffset = function(offset) {\n this.prep(flatbuffers.SIZEOF_INT, 0); // Ensure alignment is already done.\n this.writeInt32(this.offset() - offset + flatbuffers.SIZEOF_INT);\n};\n\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * Start encoding a new object in the buffer. Users will not usually need to\n * call this directly. The FlatBuffers compiler will generate helper methods\n * that call this method internally.\n *\n * @param {number} numfields\n */\nflatbuffers.Builder.prototype.startObject = function(numfields) {\n this.notNested();\n if (this.vtable == null) {\n this.vtable = [];\n }\n this.vtable_in_use = numfields;\n for (var i = 0; i < numfields; i++) {\n this.vtable[i] = 0; // This will push additional elements as needed\n }\n this.isNested = true;\n this.object_start = this.offset();\n};\n\n/**\n * Finish off writing the object that is under construction.\n *\n * @returns {flatbuffers.Offset} The offset to the object inside `dataBuffer`\n */\nflatbuffers.Builder.prototype.endObject = function() {\n if (this.vtable == null || !this.isNested) {\n throw new Error('FlatBuffers: endObject called without startObject');\n }\n\n this.addInt32(0);\n var vtableloc = this.offset();\n\n // Trim trailing zeroes.\n var i = this.vtable_in_use - 1;\n for (; i >= 0 && this.vtable[i] == 0; i--) {}\n var trimmed_size = i + 1;\n\n // Write out the current vtable.\n for (; i >= 0; i--) {\n // Offset relative to the start of the table.\n this.addInt16(this.vtable[i] != 0 ? vtableloc - this.vtable[i] : 0);\n }\n\n var standard_fields = 2; // The fields below:\n this.addInt16(vtableloc - this.object_start);\n var len = (trimmed_size + standard_fields) * flatbuffers.SIZEOF_SHORT;\n this.addInt16(len);\n\n // Search for an existing vtable that matches the current one.\n var existing_vtable = 0;\n var vt1 = this.space;\nouter_loop:\n for (i = 0; i < this.vtables.length; i++) {\n var vt2 = this.bb.capacity() - this.vtables[i];\n if (len == this.bb.readInt16(vt2)) {\n for (var j = flatbuffers.SIZEOF_SHORT; j < len; j += flatbuffers.SIZEOF_SHORT) {\n if (this.bb.readInt16(vt1 + j) != this.bb.readInt16(vt2 + j)) {\n continue outer_loop;\n }\n }\n existing_vtable = this.vtables[i];\n break;\n }\n }\n\n if (existing_vtable) {\n // Found a match:\n // Remove the current vtable.\n this.space = this.bb.capacity() - vtableloc;\n\n // Point table to existing vtable.\n this.bb.writeInt32(this.space, existing_vtable - vtableloc);\n } else {\n // No match:\n // Add the location of the current vtable to the list of vtables.\n this.vtables.push(this.offset());\n\n // Point table to current vtable.\n this.bb.writeInt32(this.bb.capacity() - vtableloc, this.offset() - vtableloc);\n }\n\n this.isNested = false;\n return vtableloc;\n};\n/// @endcond\n\n/**\n * Finalize a buffer, poiting to the given `root_table`.\n *\n * @param {flatbuffers.Offset} root_table\n * @param {string=} opt_file_identifier\n * @param {boolean=} opt_size_prefix\n */\nflatbuffers.Builder.prototype.finish = function(root_table, opt_file_identifier, opt_size_prefix) {\n var size_prefix = opt_size_prefix ? flatbuffers.SIZE_PREFIX_LENGTH : 0;\n if (opt_file_identifier) {\n var file_identifier = opt_file_identifier;\n this.prep(this.minalign, flatbuffers.SIZEOF_INT +\n flatbuffers.FILE_IDENTIFIER_LENGTH + size_prefix);\n if (file_identifier.length != flatbuffers.FILE_IDENTIFIER_LENGTH) {\n throw new Error('FlatBuffers: file identifier must be length ' +\n flatbuffers.FILE_IDENTIFIER_LENGTH);\n }\n for (var i = flatbuffers.FILE_IDENTIFIER_LENGTH - 1; i >= 0; i--) {\n this.writeInt8(file_identifier.charCodeAt(i));\n }\n }\n this.prep(this.minalign, flatbuffers.SIZEOF_INT + size_prefix);\n this.addOffset(root_table);\n if (size_prefix) {\n this.addInt32(this.bb.capacity() - this.space);\n }\n this.bb.setPosition(this.space);\n};\n\n/**\n * Finalize a size prefixed buffer, pointing to the given `root_table`.\n *\n * @param {flatbuffers.Offset} root_table\n * @param {string=} opt_file_identifier\n */\nflatbuffers.Builder.prototype.finishSizePrefixed = function (root_table, opt_file_identifier) {\n this.finish(root_table, opt_file_identifier, true);\n};\n\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * This checks a required field has been set in a given table that has\n * just been constructed.\n *\n * @param {flatbuffers.Offset} table\n * @param {number} field\n */\nflatbuffers.Builder.prototype.requiredField = function(table, field) {\n var table_start = this.bb.capacity() - table;\n var vtable_start = table_start - this.bb.readInt32(table_start);\n var ok = this.bb.readInt16(vtable_start + field) != 0;\n\n // If this fails, the caller will show what field needs to be set.\n if (!ok) {\n throw new Error('FlatBuffers: field ' + field + ' must be set');\n }\n};\n\n/**\n * Start a new array/vector of objects. Users usually will not call\n * this directly. The FlatBuffers compiler will create a start/end\n * method for vector types in generated code.\n *\n * @param {number} elem_size The size of each element in the array\n * @param {number} num_elems The number of elements in the array\n * @param {number} alignment The alignment of the array\n */\nflatbuffers.Builder.prototype.startVector = function(elem_size, num_elems, alignment) {\n this.notNested();\n this.vector_num_elems = num_elems;\n this.prep(flatbuffers.SIZEOF_INT, elem_size * num_elems);\n this.prep(alignment, elem_size * num_elems); // Just in case alignment > int.\n};\n\n/**\n * Finish off the creation of an array and all its elements. The array must be\n * created with `startVector`.\n *\n * @returns {flatbuffers.Offset} The offset at which the newly created array\n * starts.\n */\nflatbuffers.Builder.prototype.endVector = function() {\n this.writeInt32(this.vector_num_elems);\n return this.offset();\n};\n/// @endcond\n\n/**\n * Encode the string `s` in the buffer using UTF-8. If a Uint8Array is passed\n * instead of a string, it is assumed to contain valid UTF-8 encoded data.\n *\n * @param {string|Uint8Array} s The string to encode\n * @return {flatbuffers.Offset} The offset in the buffer where the encoded string starts\n */\nflatbuffers.Builder.prototype.createString = function(s) {\n if (s instanceof Uint8Array) {\n var utf8 = s;\n } else {\n var utf8 = [];\n var i = 0;\n\n while (i < s.length) {\n var codePoint;\n\n // Decode UTF-16\n var a = s.charCodeAt(i++);\n if (a < 0xD800 || a >= 0xDC00) {\n codePoint = a;\n } else {\n var b = s.charCodeAt(i++);\n codePoint = (a << 10) + b + (0x10000 - (0xD800 << 10) - 0xDC00);\n }\n\n // Encode UTF-8\n if (codePoint < 0x80) {\n utf8.push(codePoint);\n } else {\n if (codePoint < 0x800) {\n utf8.push(((codePoint >> 6) & 0x1F) | 0xC0);\n } else {\n if (codePoint < 0x10000) {\n utf8.push(((codePoint >> 12) & 0x0F) | 0xE0);\n } else {\n utf8.push(\n ((codePoint >> 18) & 0x07) | 0xF0,\n ((codePoint >> 12) & 0x3F) | 0x80);\n }\n utf8.push(((codePoint >> 6) & 0x3F) | 0x80);\n }\n utf8.push((codePoint & 0x3F) | 0x80);\n }\n }\n }\n\n this.addInt8(0);\n this.startVector(1, utf8.length, 1);\n this.bb.setPosition(this.space -= utf8.length);\n for (var i = 0, offset = this.space, bytes = this.bb.bytes(); i < utf8.length; i++) {\n bytes[offset++] = utf8[i];\n }\n return this.endVector();\n};\n\n/**\n * A helper function to avoid generated code depending on this file directly.\n *\n * @param {number} low\n * @param {number} high\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.Builder.prototype.createLong = function(low, high) {\n return flatbuffers.Long.create(low, high);\n};\n////////////////////////////////////////////////////////////////////////////////\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * Create a new ByteBuffer with a given array of bytes (`Uint8Array`).\n *\n * @constructor\n * @param {Uint8Array} bytes\n */\nflatbuffers.ByteBuffer = function(bytes) {\n /**\n * @type {Uint8Array}\n * @private\n */\n this.bytes_ = bytes;\n\n /**\n * @type {number}\n * @private\n */\n this.position_ = 0;\n};\n\n/**\n * Create and allocate a new ByteBuffer with a given size.\n *\n * @param {number} byte_size\n * @returns {!flatbuffers.ByteBuffer}\n */\nflatbuffers.ByteBuffer.allocate = function(byte_size) {\n return new flatbuffers.ByteBuffer(new Uint8Array(byte_size));\n};\n\nflatbuffers.ByteBuffer.prototype.clear = function() {\n this.position_ = 0;\n};\n\n/**\n * Get the underlying `Uint8Array`.\n *\n * @returns {Uint8Array}\n */\nflatbuffers.ByteBuffer.prototype.bytes = function() {\n return this.bytes_;\n};\n\n/**\n * Get the buffer's position.\n *\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.position = function() {\n return this.position_;\n};\n\n/**\n * Set the buffer's position.\n *\n * @param {number} position\n */\nflatbuffers.ByteBuffer.prototype.setPosition = function(position) {\n this.position_ = position;\n};\n\n/**\n * Get the buffer's capacity.\n *\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.capacity = function() {\n return this.bytes_.length;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readInt8 = function(offset) {\n return this.readUint8(offset) << 24 >> 24;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readUint8 = function(offset) {\n return this.bytes_[offset];\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readInt16 = function(offset) {\n return this.readUint16(offset) << 16 >> 16;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readUint16 = function(offset) {\n return this.bytes_[offset] | this.bytes_[offset + 1] << 8;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readInt32 = function(offset) {\n return this.bytes_[offset] | this.bytes_[offset + 1] << 8 | this.bytes_[offset + 2] << 16 | this.bytes_[offset + 3] << 24;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readUint32 = function(offset) {\n return this.readInt32(offset) >>> 0;\n};\n\n/**\n * @param {number} offset\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.ByteBuffer.prototype.readInt64 = function(offset) {\n return new flatbuffers.Long(this.readInt32(offset), this.readInt32(offset + 4));\n};\n\n/**\n * @param {number} offset\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.ByteBuffer.prototype.readUint64 = function(offset) {\n return new flatbuffers.Long(this.readUint32(offset), this.readUint32(offset + 4));\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readFloat32 = function(offset) {\n flatbuffers.int32[0] = this.readInt32(offset);\n return flatbuffers.float32[0];\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readFloat64 = function(offset) {\n flatbuffers.int32[flatbuffers.isLittleEndian ? 0 : 1] = this.readInt32(offset);\n flatbuffers.int32[flatbuffers.isLittleEndian ? 1 : 0] = this.readInt32(offset + 4);\n return flatbuffers.float64[0];\n};\n\n/**\n * @param {number} offset\n * @param {number|boolean} value\n */\nflatbuffers.ByteBuffer.prototype.writeInt8 = function(offset, value) {\n this.bytes_[offset] = /** @type {number} */(value);\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeUint8 = function(offset, value) {\n this.bytes_[offset] = value;\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeInt16 = function(offset, value) {\n this.bytes_[offset] = value;\n this.bytes_[offset + 1] = value >> 8;\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeUint16 = function(offset, value) {\n this.bytes_[offset] = value;\n this.bytes_[offset + 1] = value >> 8;\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeInt32 = function(offset, value) {\n this.bytes_[offset] = value;\n this.bytes_[offset + 1] = value >> 8;\n this.bytes_[offset + 2] = value >> 16;\n this.bytes_[offset + 3] = value >> 24;\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeUint32 = function(offset, value) {\n this.bytes_[offset] = value;\n this.bytes_[offset + 1] = value >> 8;\n this.bytes_[offset + 2] = value >> 16;\n this.bytes_[offset + 3] = value >> 24;\n};\n\n/**\n * @param {number} offset\n * @param {flatbuffers.Long} value\n */\nflatbuffers.ByteBuffer.prototype.writeInt64 = function(offset, value) {\n this.writeInt32(offset, value.low);\n this.writeInt32(offset + 4, value.high);\n};\n\n/**\n * @param {number} offset\n * @param {flatbuffers.Long} value\n */\nflatbuffers.ByteBuffer.prototype.writeUint64 = function(offset, value) {\n this.writeUint32(offset, value.low);\n this.writeUint32(offset + 4, value.high);\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeFloat32 = function(offset, value) {\n flatbuffers.float32[0] = value;\n this.writeInt32(offset, flatbuffers.int32[0]);\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeFloat64 = function(offset, value) {\n flatbuffers.float64[0] = value;\n this.writeInt32(offset, flatbuffers.int32[flatbuffers.isLittleEndian ? 0 : 1]);\n this.writeInt32(offset + 4, flatbuffers.int32[flatbuffers.isLittleEndian ? 1 : 0]);\n};\n\n/**\n * Return the file identifier. Behavior is undefined for FlatBuffers whose\n * schema does not include a file_identifier (likely points at padding or the\n * start of a the root vtable).\n * @returns {string}\n */\nflatbuffers.ByteBuffer.prototype.getBufferIdentifier = function() {\n if (this.bytes_.length < this.position_ + flatbuffers.SIZEOF_INT +\n flatbuffers.FILE_IDENTIFIER_LENGTH) {\n throw new Error(\n 'FlatBuffers: ByteBuffer is too short to contain an identifier.');\n }\n var result = \"\";\n for (var i = 0; i < flatbuffers.FILE_IDENTIFIER_LENGTH; i++) {\n result += String.fromCharCode(\n this.readInt8(this.position_ + flatbuffers.SIZEOF_INT + i));\n }\n return result;\n};\n\n/**\n * Look up a field in the vtable, return an offset into the object, or 0 if the\n * field is not present.\n *\n * @param {number} bb_pos\n * @param {number} vtable_offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.__offset = function(bb_pos, vtable_offset) {\n var vtable = bb_pos - this.readInt32(bb_pos);\n return vtable_offset < this.readInt16(vtable) ? this.readInt16(vtable + vtable_offset) : 0;\n};\n\n/**\n * Initialize any Table-derived type to point to the union at the given offset.\n *\n * @param {flatbuffers.Table} t\n * @param {number} offset\n * @returns {flatbuffers.Table}\n */\nflatbuffers.ByteBuffer.prototype.__union = function(t, offset) {\n t.bb_pos = offset + this.readInt32(offset);\n t.bb = this;\n return t;\n};\n\n/**\n * Create a JavaScript string from UTF-8 data stored inside the FlatBuffer.\n * This allocates a new string and converts to wide chars upon each access.\n *\n * To avoid the conversion to UTF-16, pass flatbuffers.Encoding.UTF8_BYTES as\n * the \"optionalEncoding\" argument. This is useful for avoiding conversion to\n * and from UTF-16 when the data will just be packaged back up in another\n * FlatBuffer later on.\n *\n * @param {number} offset\n * @param {flatbuffers.Encoding=} opt_encoding Defaults to UTF16_STRING\n * @returns {string|!Uint8Array}\n */\nflatbuffers.ByteBuffer.prototype.__string = function(offset, opt_encoding) {\n offset += this.readInt32(offset);\n\n var length = this.readInt32(offset);\n var result = '';\n var i = 0;\n\n offset += flatbuffers.SIZEOF_INT;\n\n if (opt_encoding === flatbuffers.Encoding.UTF8_BYTES) {\n return this.bytes_.subarray(offset, offset + length);\n }\n\n while (i < length) {\n var codePoint;\n\n // Decode UTF-8\n var a = this.readUint8(offset + i++);\n if (a < 0xC0) {\n codePoint = a;\n } else {\n var b = this.readUint8(offset + i++);\n if (a < 0xE0) {\n codePoint =\n ((a & 0x1F) << 6) |\n (b & 0x3F);\n } else {\n var c = this.readUint8(offset + i++);\n if (a < 0xF0) {\n codePoint =\n ((a & 0x0F) << 12) |\n ((b & 0x3F) << 6) |\n (c & 0x3F);\n } else {\n var d = this.readUint8(offset + i++);\n codePoint =\n ((a & 0x07) << 18) |\n ((b & 0x3F) << 12) |\n ((c & 0x3F) << 6) |\n (d & 0x3F);\n }\n }\n }\n\n // Encode UTF-16\n if (codePoint < 0x10000) {\n result += String.fromCharCode(codePoint);\n } else {\n codePoint -= 0x10000;\n result += String.fromCharCode(\n (codePoint >> 10) + 0xD800,\n (codePoint & ((1 << 10) - 1)) + 0xDC00);\n }\n }\n\n return result;\n};\n\n/**\n * Retrieve the relative offset stored at \"offset\"\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.__indirect = function(offset) {\n return offset + this.readInt32(offset);\n};\n\n/**\n * Get the start of data of a vector whose offset is stored at \"offset\" in this object.\n *\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.__vector = function(offset) {\n return offset + this.readInt32(offset) + flatbuffers.SIZEOF_INT; // data starts after the length\n};\n\n/**\n * Get the length of a vector whose offset is stored at \"offset\" in this object.\n *\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.__vector_len = function(offset) {\n return this.readInt32(offset + this.readInt32(offset));\n};\n\n/**\n * @param {string} ident\n * @returns {boolean}\n */\nflatbuffers.ByteBuffer.prototype.__has_identifier = function(ident) {\n if (ident.length != flatbuffers.FILE_IDENTIFIER_LENGTH) {\n throw new Error('FlatBuffers: file identifier must be length ' +\n flatbuffers.FILE_IDENTIFIER_LENGTH);\n }\n for (var i = 0; i < flatbuffers.FILE_IDENTIFIER_LENGTH; i++) {\n if (ident.charCodeAt(i) != this.readInt8(this.position_ + flatbuffers.SIZEOF_INT + i)) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * A helper function to avoid generated code depending on this file directly.\n *\n * @param {number} low\n * @param {number} high\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.ByteBuffer.prototype.createLong = function(low, high) {\n return flatbuffers.Long.create(low, high);\n};\n\n// Exports for Node.js and RequireJS\nexport { flatbuffers };\n\n/// @endcond\n/// @}\n", "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable */\n\nimport {flatbuffers} from 'flatbuffers';\n\n/**\n * @enum {number}\n */\nexport namespace onnxruntime.experimental.fbs {\n export enum AttributeType {\n UNDEFINED = 0,\n FLOAT = 1,\n INT = 2,\n STRING = 3,\n TENSOR = 4,\n GRAPH = 5,\n FLOATS = 6,\n INTS = 7,\n STRINGS = 8,\n TENSORS = 9,\n GRAPHS = 10,\n SPARSE_TENSOR = 11,\n SPARSE_TENSORS = 12\n }\n}\n\n/**\n * @enum {number}\n */\nexport namespace onnxruntime.experimental.fbs {\n export enum DimensionValueType {UNKNOWN = 0, VALUE = 1, PARAM = 2}\n}\n\n/**\n * @enum {number}\n */\nexport namespace onnxruntime.experimental.fbs {\n export enum TensorDataType {\n UNDEFINED = 0,\n FLOAT = 1,\n UINT8 = 2,\n INT8 = 3,\n UINT16 = 4,\n INT16 = 5,\n INT32 = 6,\n INT64 = 7,\n STRING = 8,\n BOOL = 9,\n FLOAT16 = 10,\n DOUBLE = 11,\n UINT32 = 12,\n UINT64 = 13,\n COMPLEX64 = 14,\n COMPLEX128 = 15,\n BFLOAT16 = 16,\n FLOAT8E4M3FN = 17,\n FLOAT8E4M3FNUZ = 18,\n FLOAT8E5M2 = 19,\n FLOAT8E5M2FNUZ = 20,\n }\n}\n\n/**\n * @enum {number}\n */\nexport namespace onnxruntime.experimental.fbs {\n export enum NodeType {Primitive = 0, Fused = 1}\n}\n\n/**\n * @enum {number}\n */\nexport namespace onnxruntime.experimental.fbs {\n export enum TypeInfoValue {NONE = 0, tensor_type = 1, sequence_type = 2, map_type = 3}\n}\n\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class Shape {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns Shape\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): Shape {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Shape= obj\n * @returns Shape\n */\n static getRootAsShape(bb: flatbuffers.ByteBuffer, obj?: Shape): Shape {\n return (obj || new Shape()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Shape= obj\n * @returns Shape\n */\n static getSizePrefixedRootAsShape(bb: flatbuffers.ByteBuffer, obj?: Shape): Shape {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Shape()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.Dimension= obj\n * @returns onnxruntime.experimental.fbs.Dimension\n */\n dim(index: number, obj?: onnxruntime.experimental.fbs.Dimension): onnxruntime.experimental.fbs.Dimension|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? (obj || new onnxruntime.experimental.fbs.Dimension())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n dimLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startShape(builder: flatbuffers.Builder) {\n builder.startObject(1);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset dimOffset\n */\n static addDim(builder: flatbuffers.Builder, dimOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, dimOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createDimVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startDimVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endShape(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createShape(builder: flatbuffers.Builder, dimOffset: flatbuffers.Offset): flatbuffers.Offset {\n Shape.startShape(builder);\n Shape.addDim(builder, dimOffset);\n return Shape.endShape(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class Dimension {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns Dimension\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): Dimension {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Dimension= obj\n * @returns Dimension\n */\n static getRootAsDimension(bb: flatbuffers.ByteBuffer, obj?: Dimension): Dimension {\n return (obj || new Dimension()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Dimension= obj\n * @returns Dimension\n */\n static getSizePrefixedRootAsDimension(bb: flatbuffers.ByteBuffer, obj?: Dimension): Dimension {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Dimension()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param onnxruntime.experimental.fbs.DimensionValue= obj\n * @returns onnxruntime.experimental.fbs.DimensionValue|null\n */\n value(obj?: onnxruntime.experimental.fbs.DimensionValue): onnxruntime.experimental.fbs.DimensionValue|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? (obj || new onnxruntime.experimental.fbs.DimensionValue())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n denotation(): string|null;\n denotation(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n denotation(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startDimension(builder: flatbuffers.Builder) {\n builder.startObject(2);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset valueOffset\n */\n static addValue(builder: flatbuffers.Builder, valueOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, valueOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset denotationOffset\n */\n static addDenotation(builder: flatbuffers.Builder, denotationOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, denotationOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endDimension(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createDimension(\n builder: flatbuffers.Builder, valueOffset: flatbuffers.Offset,\n denotationOffset: flatbuffers.Offset): flatbuffers.Offset {\n Dimension.startDimension(builder);\n Dimension.addValue(builder, valueOffset);\n Dimension.addDenotation(builder, denotationOffset);\n return Dimension.endDimension(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class DimensionValue {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns DimensionValue\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): DimensionValue {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param DimensionValue= obj\n * @returns DimensionValue\n */\n static getRootAsDimensionValue(bb: flatbuffers.ByteBuffer, obj?: DimensionValue): DimensionValue {\n return (obj || new DimensionValue()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param DimensionValue= obj\n * @returns DimensionValue\n */\n static getSizePrefixedRootAsDimensionValue(bb: flatbuffers.ByteBuffer, obj?: DimensionValue): DimensionValue {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new DimensionValue()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @returns onnxruntime.experimental.fbs.DimensionValueType\n */\n dimType(): onnxruntime.experimental.fbs.DimensionValueType {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? /** */ (this.bb!.readInt8(this.bb_pos + offset)) :\n onnxruntime.experimental.fbs.DimensionValueType.UNKNOWN;\n }\n\n /**\n * @returns flatbuffers.Long\n */\n dimValue(): flatbuffers.Long {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(0, 0);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n dimParam(): string|null;\n dimParam(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n dimParam(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startDimensionValue(builder: flatbuffers.Builder) {\n builder.startObject(3);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param onnxruntime.experimental.fbs.DimensionValueType dimType\n */\n static addDimType(builder: flatbuffers.Builder, dimType: onnxruntime.experimental.fbs.DimensionValueType) {\n builder.addFieldInt8(0, dimType, onnxruntime.experimental.fbs.DimensionValueType.UNKNOWN);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Long dimValue\n */\n static addDimValue(builder: flatbuffers.Builder, dimValue: flatbuffers.Long) {\n builder.addFieldInt64(1, dimValue, builder.createLong(0, 0));\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset dimParamOffset\n */\n static addDimParam(builder: flatbuffers.Builder, dimParamOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, dimParamOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endDimensionValue(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createDimensionValue(\n builder: flatbuffers.Builder, dimType: onnxruntime.experimental.fbs.DimensionValueType,\n dimValue: flatbuffers.Long, dimParamOffset: flatbuffers.Offset): flatbuffers.Offset {\n DimensionValue.startDimensionValue(builder);\n DimensionValue.addDimType(builder, dimType);\n DimensionValue.addDimValue(builder, dimValue);\n DimensionValue.addDimParam(builder, dimParamOffset);\n return DimensionValue.endDimensionValue(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class TensorTypeAndShape {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns TensorTypeAndShape\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): TensorTypeAndShape {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param TensorTypeAndShape= obj\n * @returns TensorTypeAndShape\n */\n static getRootAsTensorTypeAndShape(bb: flatbuffers.ByteBuffer, obj?: TensorTypeAndShape): TensorTypeAndShape {\n return (obj || new TensorTypeAndShape()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param TensorTypeAndShape= obj\n * @returns TensorTypeAndShape\n */\n static getSizePrefixedRootAsTensorTypeAndShape(bb: flatbuffers.ByteBuffer, obj?: TensorTypeAndShape):\n TensorTypeAndShape {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new TensorTypeAndShape()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @returns onnxruntime.experimental.fbs.TensorDataType\n */\n elemType(): onnxruntime.experimental.fbs.TensorDataType {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? /** */ (this.bb!.readInt32(this.bb_pos + offset)) :\n onnxruntime.experimental.fbs.TensorDataType.UNDEFINED;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.Shape= obj\n * @returns onnxruntime.experimental.fbs.Shape|null\n */\n shape(obj?: onnxruntime.experimental.fbs.Shape): onnxruntime.experimental.fbs.Shape|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.Shape())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startTensorTypeAndShape(builder: flatbuffers.Builder) {\n builder.startObject(2);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param onnxruntime.experimental.fbs.TensorDataType elemType\n */\n static addElemType(builder: flatbuffers.Builder, elemType: onnxruntime.experimental.fbs.TensorDataType) {\n builder.addFieldInt32(0, elemType, onnxruntime.experimental.fbs.TensorDataType.UNDEFINED);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset shapeOffset\n */\n static addShape(builder: flatbuffers.Builder, shapeOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, shapeOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endTensorTypeAndShape(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createTensorTypeAndShape(\n builder: flatbuffers.Builder, elemType: onnxruntime.experimental.fbs.TensorDataType,\n shapeOffset: flatbuffers.Offset): flatbuffers.Offset {\n TensorTypeAndShape.startTensorTypeAndShape(builder);\n TensorTypeAndShape.addElemType(builder, elemType);\n TensorTypeAndShape.addShape(builder, shapeOffset);\n return TensorTypeAndShape.endTensorTypeAndShape(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class MapType {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns MapType\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): MapType {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param MapType= obj\n * @returns MapType\n */\n static getRootAsMapType(bb: flatbuffers.ByteBuffer, obj?: MapType): MapType {\n return (obj || new MapType()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param MapType= obj\n * @returns MapType\n */\n static getSizePrefixedRootAsMapType(bb: flatbuffers.ByteBuffer, obj?: MapType): MapType {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new MapType()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @returns onnxruntime.experimental.fbs.TensorDataType\n */\n keyType(): onnxruntime.experimental.fbs.TensorDataType {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? /** */ (this.bb!.readInt32(this.bb_pos + offset)) :\n onnxruntime.experimental.fbs.TensorDataType.UNDEFINED;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.TypeInfo= obj\n * @returns onnxruntime.experimental.fbs.TypeInfo|null\n */\n valueType(obj?: onnxruntime.experimental.fbs.TypeInfo): onnxruntime.experimental.fbs.TypeInfo|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.TypeInfo())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startMapType(builder: flatbuffers.Builder) {\n builder.startObject(2);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param onnxruntime.experimental.fbs.TensorDataType keyType\n */\n static addKeyType(builder: flatbuffers.Builder, keyType: onnxruntime.experimental.fbs.TensorDataType) {\n builder.addFieldInt32(0, keyType, onnxruntime.experimental.fbs.TensorDataType.UNDEFINED);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset valueTypeOffset\n */\n static addValueType(builder: flatbuffers.Builder, valueTypeOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, valueTypeOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endMapType(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createMapType(\n builder: flatbuffers.Builder, keyType: onnxruntime.experimental.fbs.TensorDataType,\n valueTypeOffset: flatbuffers.Offset): flatbuffers.Offset {\n MapType.startMapType(builder);\n MapType.addKeyType(builder, keyType);\n MapType.addValueType(builder, valueTypeOffset);\n return MapType.endMapType(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class SequenceType {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns SequenceType\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): SequenceType {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param SequenceType= obj\n * @returns SequenceType\n */\n static getRootAsSequenceType(bb: flatbuffers.ByteBuffer, obj?: SequenceType): SequenceType {\n return (obj || new SequenceType()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param SequenceType= obj\n * @returns SequenceType\n */\n static getSizePrefixedRootAsSequenceType(bb: flatbuffers.ByteBuffer, obj?: SequenceType): SequenceType {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new SequenceType()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param onnxruntime.experimental.fbs.TypeInfo= obj\n * @returns onnxruntime.experimental.fbs.TypeInfo|null\n */\n elemType(obj?: onnxruntime.experimental.fbs.TypeInfo): onnxruntime.experimental.fbs.TypeInfo|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? (obj || new onnxruntime.experimental.fbs.TypeInfo())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startSequenceType(builder: flatbuffers.Builder) {\n builder.startObject(1);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset elemTypeOffset\n */\n static addElemType(builder: flatbuffers.Builder, elemTypeOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, elemTypeOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endSequenceType(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createSequenceType(builder: flatbuffers.Builder, elemTypeOffset: flatbuffers.Offset): flatbuffers.Offset {\n SequenceType.startSequenceType(builder);\n SequenceType.addElemType(builder, elemTypeOffset);\n return SequenceType.endSequenceType(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class EdgeEnd {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns EdgeEnd\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): EdgeEnd {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @returns number\n */\n nodeIndex(): number {\n return this.bb!.readUint32(this.bb_pos);\n }\n\n /**\n * @returns number\n */\n srcArgIndex(): number {\n return this.bb!.readInt32(this.bb_pos + 4);\n }\n\n /**\n * @returns number\n */\n dstArgIndex(): number {\n return this.bb!.readInt32(this.bb_pos + 8);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number node_index\n * @param number src_arg_index\n * @param number dst_arg_index\n * @returns flatbuffers.Offset\n */\n static createEdgeEnd(\n builder: flatbuffers.Builder, node_index: number, src_arg_index: number,\n dst_arg_index: number): flatbuffers.Offset {\n builder.prep(4, 12);\n builder.writeInt32(dst_arg_index);\n builder.writeInt32(src_arg_index);\n builder.writeInt32(node_index);\n return builder.offset();\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class NodeEdge {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns NodeEdge\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): NodeEdge {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param NodeEdge= obj\n * @returns NodeEdge\n */\n static getRootAsNodeEdge(bb: flatbuffers.ByteBuffer, obj?: NodeEdge): NodeEdge {\n return (obj || new NodeEdge()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param NodeEdge= obj\n * @returns NodeEdge\n */\n static getSizePrefixedRootAsNodeEdge(bb: flatbuffers.ByteBuffer, obj?: NodeEdge): NodeEdge {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new NodeEdge()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @returns number\n */\n nodeIndex(): number {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.EdgeEnd= obj\n * @returns onnxruntime.experimental.fbs.EdgeEnd\n */\n inputEdges(index: number, obj?: onnxruntime.experimental.fbs.EdgeEnd): onnxruntime.experimental.fbs.EdgeEnd|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.EdgeEnd())\n .__init(this.bb!.__vector(this.bb_pos + offset) + index * 12, this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n inputEdgesLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.EdgeEnd= obj\n * @returns onnxruntime.experimental.fbs.EdgeEnd\n */\n outputEdges(index: number, obj?: onnxruntime.experimental.fbs.EdgeEnd): onnxruntime.experimental.fbs.EdgeEnd|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? (obj || new onnxruntime.experimental.fbs.EdgeEnd())\n .__init(this.bb!.__vector(this.bb_pos + offset) + index * 12, this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n outputEdgesLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startNodeEdge(builder: flatbuffers.Builder) {\n builder.startObject(3);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number nodeIndex\n */\n static addNodeIndex(builder: flatbuffers.Builder, nodeIndex: number) {\n builder.addFieldInt32(0, nodeIndex, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset inputEdgesOffset\n */\n static addInputEdges(builder: flatbuffers.Builder, inputEdgesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, inputEdgesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startInputEdgesVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(12, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset outputEdgesOffset\n */\n static addOutputEdges(builder: flatbuffers.Builder, outputEdgesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, outputEdgesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startOutputEdgesVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(12, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endNodeEdge(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createNodeEdge(\n builder: flatbuffers.Builder, nodeIndex: number, inputEdgesOffset: flatbuffers.Offset,\n outputEdgesOffset: flatbuffers.Offset): flatbuffers.Offset {\n NodeEdge.startNodeEdge(builder);\n NodeEdge.addNodeIndex(builder, nodeIndex);\n NodeEdge.addInputEdges(builder, inputEdgesOffset);\n NodeEdge.addOutputEdges(builder, outputEdgesOffset);\n return NodeEdge.endNodeEdge(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class Node {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns Node\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): Node {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Node= obj\n * @returns Node\n */\n static getRootAsNode(bb: flatbuffers.ByteBuffer, obj?: Node): Node {\n return (obj || new Node()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Node= obj\n * @returns Node\n */\n static getSizePrefixedRootAsNode(bb: flatbuffers.ByteBuffer, obj?: Node): Node {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Node()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n name(): string|null;\n name(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n name(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n docString(): string|null;\n docString(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n docString(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n domain(): string|null;\n domain(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n domain(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @returns number\n */\n sinceVersion(): number {\n let offset = this.bb!.__offset(this.bb_pos, 10);\n return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n }\n\n /**\n * @returns number\n */\n index(): number {\n let offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n opType(): string|null;\n opType(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n opType(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 14);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @returns onnxruntime.experimental.fbs.NodeType\n */\n type(): onnxruntime.experimental.fbs.NodeType {\n let offset = this.bb!.__offset(this.bb_pos, 16);\n return offset ? /** */ (this.bb!.readInt32(this.bb_pos + offset)) :\n onnxruntime.experimental.fbs.NodeType.Primitive;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n executionProviderType(): string|null;\n executionProviderType(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n executionProviderType(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 18);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param number index\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array\n */\n inputs(index: number): string;\n inputs(index: number, optionalEncoding: flatbuffers.Encoding): string|Uint8Array;\n inputs(index: number, optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 20);\n return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n }\n\n /**\n * @returns number\n */\n inputsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 20);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array\n */\n outputs(index: number): string;\n outputs(index: number, optionalEncoding: flatbuffers.Encoding): string|Uint8Array;\n outputs(index: number, optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 22);\n return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n }\n\n /**\n * @returns number\n */\n outputsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 22);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.Attribute= obj\n * @returns onnxruntime.experimental.fbs.Attribute\n */\n attributes(index: number, obj?: onnxruntime.experimental.fbs.Attribute): onnxruntime.experimental.fbs.Attribute\n |null {\n let offset = this.bb!.__offset(this.bb_pos, 24);\n return offset ? (obj || new onnxruntime.experimental.fbs.Attribute())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n attributesLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 24);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @returns number\n */\n inputArgCounts(index: number): number|null {\n let offset = this.bb!.__offset(this.bb_pos, 26);\n return offset ? this.bb!.readInt32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\n }\n\n /**\n * @returns number\n */\n inputArgCountsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 26);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @returns Int32Array\n */\n inputArgCountsArray(): Int32Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 26);\n return offset ?\n new Int32Array(\n this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset),\n this.bb!.__vector_len(this.bb_pos + offset)) :\n null;\n }\n\n /**\n * @param number index\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array\n */\n implicitInputs(index: number): string;\n implicitInputs(index: number, optionalEncoding: flatbuffers.Encoding): string|Uint8Array;\n implicitInputs(index: number, optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 28);\n return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n }\n\n /**\n * @returns number\n */\n implicitInputsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 28);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startNode(builder: flatbuffers.Builder) {\n builder.startObject(13);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset nameOffset\n */\n static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, nameOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset docStringOffset\n */\n static addDocString(builder: flatbuffers.Builder, docStringOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, docStringOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset domainOffset\n */\n static addDomain(builder: flatbuffers.Builder, domainOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, domainOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number sinceVersion\n */\n static addSinceVersion(builder: flatbuffers.Builder, sinceVersion: number) {\n builder.addFieldInt32(3, sinceVersion, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number index\n */\n static addIndex(builder: flatbuffers.Builder, index: number) {\n builder.addFieldInt32(4, index, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset opTypeOffset\n */\n static addOpType(builder: flatbuffers.Builder, opTypeOffset: flatbuffers.Offset) {\n builder.addFieldOffset(5, opTypeOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param onnxruntime.experimental.fbs.NodeType type\n */\n static addType(builder: flatbuffers.Builder, type: onnxruntime.experimental.fbs.NodeType) {\n builder.addFieldInt32(6, type, onnxruntime.experimental.fbs.NodeType.Primitive);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset executionProviderTypeOffset\n */\n static addExecutionProviderType(builder: flatbuffers.Builder, executionProviderTypeOffset: flatbuffers.Offset) {\n builder.addFieldOffset(7, executionProviderTypeOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset inputsOffset\n */\n static addInputs(builder: flatbuffers.Builder, inputsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(8, inputsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createInputsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startInputsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset outputsOffset\n */\n static addOutputs(builder: flatbuffers.Builder, outputsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(9, outputsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createOutputsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startOutputsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset attributesOffset\n */\n static addAttributes(builder: flatbuffers.Builder, attributesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(10, attributesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createAttributesVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startAttributesVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset inputArgCountsOffset\n */\n static addInputArgCounts(builder: flatbuffers.Builder, inputArgCountsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(11, inputArgCountsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createInputArgCountsVector(builder: flatbuffers.Builder, data: number[]|Uint8Array): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt32(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startInputArgCountsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset implicitInputsOffset\n */\n static addImplicitInputs(builder: flatbuffers.Builder, implicitInputsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(12, implicitInputsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createImplicitInputsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startImplicitInputsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endNode(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createNode(\n builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset, docStringOffset: flatbuffers.Offset,\n domainOffset: flatbuffers.Offset, sinceVersion: number, index: number, opTypeOffset: flatbuffers.Offset,\n type: onnxruntime.experimental.fbs.NodeType, executionProviderTypeOffset: flatbuffers.Offset,\n inputsOffset: flatbuffers.Offset, outputsOffset: flatbuffers.Offset, attributesOffset: flatbuffers.Offset,\n inputArgCountsOffset: flatbuffers.Offset, implicitInputsOffset: flatbuffers.Offset): flatbuffers.Offset {\n Node.startNode(builder);\n Node.addName(builder, nameOffset);\n Node.addDocString(builder, docStringOffset);\n Node.addDomain(builder, domainOffset);\n Node.addSinceVersion(builder, sinceVersion);\n Node.addIndex(builder, index);\n Node.addOpType(builder, opTypeOffset);\n Node.addType(builder, type);\n Node.addExecutionProviderType(builder, executionProviderTypeOffset);\n Node.addInputs(builder, inputsOffset);\n Node.addOutputs(builder, outputsOffset);\n Node.addAttributes(builder, attributesOffset);\n Node.addInputArgCounts(builder, inputArgCountsOffset);\n Node.addImplicitInputs(builder, implicitInputsOffset);\n return Node.endNode(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class ValueInfo {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns ValueInfo\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): ValueInfo {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param ValueInfo= obj\n * @returns ValueInfo\n */\n static getRootAsValueInfo(bb: flatbuffers.ByteBuffer, obj?: ValueInfo): ValueInfo {\n return (obj || new ValueInfo()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param ValueInfo= obj\n * @returns ValueInfo\n */\n static getSizePrefixedRootAsValueInfo(bb: flatbuffers.ByteBuffer, obj?: ValueInfo): ValueInfo {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new ValueInfo()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n name(): string|null;\n name(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n name(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n docString(): string|null;\n docString(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n docString(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.TypeInfo= obj\n * @returns onnxruntime.experimental.fbs.TypeInfo|null\n */\n type(obj?: onnxruntime.experimental.fbs.TypeInfo): onnxruntime.experimental.fbs.TypeInfo|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? (obj || new onnxruntime.experimental.fbs.TypeInfo())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startValueInfo(builder: flatbuffers.Builder) {\n builder.startObject(3);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset nameOffset\n */\n static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, nameOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset docStringOffset\n */\n static addDocString(builder: flatbuffers.Builder, docStringOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, docStringOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset typeOffset\n */\n static addType(builder: flatbuffers.Builder, typeOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, typeOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endValueInfo(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createValueInfo(\n builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset, docStringOffset: flatbuffers.Offset,\n typeOffset: flatbuffers.Offset): flatbuffers.Offset {\n ValueInfo.startValueInfo(builder);\n ValueInfo.addName(builder, nameOffset);\n ValueInfo.addDocString(builder, docStringOffset);\n ValueInfo.addType(builder, typeOffset);\n return ValueInfo.endValueInfo(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class TypeInfo {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns TypeInfo\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): TypeInfo {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param TypeInfo= obj\n * @returns TypeInfo\n */\n static getRootAsTypeInfo(bb: flatbuffers.ByteBuffer, obj?: TypeInfo): TypeInfo {\n return (obj || new TypeInfo()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param TypeInfo= obj\n * @returns TypeInfo\n */\n static getSizePrefixedRootAsTypeInfo(bb: flatbuffers.ByteBuffer, obj?: TypeInfo): TypeInfo {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new TypeInfo()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n denotation(): string|null;\n denotation(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n denotation(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @returns onnxruntime.experimental.fbs.TypeInfoValue\n */\n valueType(): onnxruntime.experimental.fbs.TypeInfoValue {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? /** */ (this.bb!.readUint8(this.bb_pos + offset)) :\n onnxruntime.experimental.fbs.TypeInfoValue.NONE;\n }\n\n /**\n * @param flatbuffers.Table obj\n * @returns ?flatbuffers.Table\n */\n value(obj: T): T|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startTypeInfo(builder: flatbuffers.Builder) {\n builder.startObject(3);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset denotationOffset\n */\n static addDenotation(builder: flatbuffers.Builder, denotationOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, denotationOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param onnxruntime.experimental.fbs.TypeInfoValue valueType\n */\n static addValueType(builder: flatbuffers.Builder, valueType: onnxruntime.experimental.fbs.TypeInfoValue) {\n builder.addFieldInt8(1, valueType, onnxruntime.experimental.fbs.TypeInfoValue.NONE);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset valueOffset\n */\n static addValue(builder: flatbuffers.Builder, valueOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, valueOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endTypeInfo(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createTypeInfo(\n builder: flatbuffers.Builder, denotationOffset: flatbuffers.Offset,\n valueType: onnxruntime.experimental.fbs.TypeInfoValue, valueOffset: flatbuffers.Offset): flatbuffers.Offset {\n TypeInfo.startTypeInfo(builder);\n TypeInfo.addDenotation(builder, denotationOffset);\n TypeInfo.addValueType(builder, valueType);\n TypeInfo.addValue(builder, valueOffset);\n return TypeInfo.endTypeInfo(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class OperatorSetId {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns OperatorSetId\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): OperatorSetId {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param OperatorSetId= obj\n * @returns OperatorSetId\n */\n static getRootAsOperatorSetId(bb: flatbuffers.ByteBuffer, obj?: OperatorSetId): OperatorSetId {\n return (obj || new OperatorSetId()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param OperatorSetId= obj\n * @returns OperatorSetId\n */\n static getSizePrefixedRootAsOperatorSetId(bb: flatbuffers.ByteBuffer, obj?: OperatorSetId): OperatorSetId {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new OperatorSetId()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n domain(): string|null;\n domain(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n domain(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @returns flatbuffers.Long\n */\n version(): flatbuffers.Long {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(0, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startOperatorSetId(builder: flatbuffers.Builder) {\n builder.startObject(2);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset domainOffset\n */\n static addDomain(builder: flatbuffers.Builder, domainOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, domainOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Long version\n */\n static addVersion(builder: flatbuffers.Builder, version: flatbuffers.Long) {\n builder.addFieldInt64(1, version, builder.createLong(0, 0));\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endOperatorSetId(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createOperatorSetId(\n builder: flatbuffers.Builder, domainOffset: flatbuffers.Offset, version: flatbuffers.Long): flatbuffers.Offset {\n OperatorSetId.startOperatorSetId(builder);\n OperatorSetId.addDomain(builder, domainOffset);\n OperatorSetId.addVersion(builder, version);\n return OperatorSetId.endOperatorSetId(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class Tensor {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns Tensor\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): Tensor {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Tensor= obj\n * @returns Tensor\n */\n static getRootAsTensor(bb: flatbuffers.ByteBuffer, obj?: Tensor): Tensor {\n return (obj || new Tensor()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Tensor= obj\n * @returns Tensor\n */\n static getSizePrefixedRootAsTensor(bb: flatbuffers.ByteBuffer, obj?: Tensor): Tensor {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Tensor()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n name(): string|null;\n name(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n name(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n docString(): string|null;\n docString(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n docString(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param number index\n * @returns flatbuffers.Long\n */\n dims(index: number): flatbuffers.Long|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.readInt64(this.bb!.__vector(this.bb_pos + offset) + index * 8) :\n this.bb!.createLong(0, 0);\n }\n\n /**\n * @returns number\n */\n dimsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @returns onnxruntime.experimental.fbs.TensorDataType\n */\n dataType(): onnxruntime.experimental.fbs.TensorDataType {\n let offset = this.bb!.__offset(this.bb_pos, 10);\n return offset ? /** */ (this.bb!.readInt32(this.bb_pos + offset)) :\n onnxruntime.experimental.fbs.TensorDataType.UNDEFINED;\n }\n\n /**\n * @param number index\n * @returns number\n */\n rawData(index: number): number|null {\n let offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ? this.bb!.readUint8(this.bb!.__vector(this.bb_pos + offset) + index) : 0;\n }\n\n /**\n * @returns number\n */\n rawDataLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @returns Uint8Array\n */\n rawDataArray(): Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ?\n new Uint8Array(\n this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset),\n this.bb!.__vector_len(this.bb_pos + offset)) :\n null;\n }\n\n /**\n * @param number index\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array\n */\n stringData(index: number): string;\n stringData(index: number, optionalEncoding: flatbuffers.Encoding): string|Uint8Array;\n stringData(index: number, optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 14);\n return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n }\n\n /**\n * @returns number\n */\n stringDataLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 14);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startTensor(builder: flatbuffers.Builder) {\n builder.startObject(6);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset nameOffset\n */\n static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, nameOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset docStringOffset\n */\n static addDocString(builder: flatbuffers.Builder, docStringOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, docStringOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset dimsOffset\n */\n static addDims(builder: flatbuffers.Builder, dimsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, dimsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createDimsVector(builder: flatbuffers.Builder, data: flatbuffers.Long[]): flatbuffers.Offset {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt64(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startDimsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(8, numElems, 8);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param onnxruntime.experimental.fbs.TensorDataType dataType\n */\n static addDataType(builder: flatbuffers.Builder, dataType: onnxruntime.experimental.fbs.TensorDataType) {\n builder.addFieldInt32(3, dataType, onnxruntime.experimental.fbs.TensorDataType.UNDEFINED);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset rawDataOffset\n */\n static addRawData(builder: flatbuffers.Builder, rawDataOffset: flatbuffers.Offset) {\n builder.addFieldOffset(4, rawDataOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createRawDataVector(builder: flatbuffers.Builder, data: number[]|Uint8Array): flatbuffers.Offset {\n builder.startVector(1, data.length, 1);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt8(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startRawDataVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(1, numElems, 1);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset stringDataOffset\n */\n static addStringData(builder: flatbuffers.Builder, stringDataOffset: flatbuffers.Offset) {\n builder.addFieldOffset(5, stringDataOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createStringDataVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startStringDataVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endTensor(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createTensor(\n builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset, docStringOffset: flatbuffers.Offset,\n dimsOffset: flatbuffers.Offset, dataType: onnxruntime.experimental.fbs.TensorDataType,\n rawDataOffset: flatbuffers.Offset, stringDataOffset: flatbuffers.Offset): flatbuffers.Offset {\n Tensor.startTensor(builder);\n Tensor.addName(builder, nameOffset);\n Tensor.addDocString(builder, docStringOffset);\n Tensor.addDims(builder, dimsOffset);\n Tensor.addDataType(builder, dataType);\n Tensor.addRawData(builder, rawDataOffset);\n Tensor.addStringData(builder, stringDataOffset);\n return Tensor.endTensor(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class SparseTensor {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns SparseTensor\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): SparseTensor {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param SparseTensor= obj\n * @returns SparseTensor\n */\n static getRootAsSparseTensor(bb: flatbuffers.ByteBuffer, obj?: SparseTensor): SparseTensor {\n return (obj || new SparseTensor()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param SparseTensor= obj\n * @returns SparseTensor\n */\n static getSizePrefixedRootAsSparseTensor(bb: flatbuffers.ByteBuffer, obj?: SparseTensor): SparseTensor {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new SparseTensor()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param onnxruntime.experimental.fbs.Tensor= obj\n * @returns onnxruntime.experimental.fbs.Tensor|null\n */\n values(obj?: onnxruntime.experimental.fbs.Tensor): onnxruntime.experimental.fbs.Tensor|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? (obj || new onnxruntime.experimental.fbs.Tensor())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.Tensor= obj\n * @returns onnxruntime.experimental.fbs.Tensor|null\n */\n indices(obj?: onnxruntime.experimental.fbs.Tensor): onnxruntime.experimental.fbs.Tensor|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.Tensor())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param number index\n * @returns flatbuffers.Long\n */\n dims(index: number): flatbuffers.Long|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.readInt64(this.bb!.__vector(this.bb_pos + offset) + index * 8) :\n this.bb!.createLong(0, 0);\n }\n\n /**\n * @returns number\n */\n dimsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startSparseTensor(builder: flatbuffers.Builder) {\n builder.startObject(3);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset valuesOffset\n */\n static addValues(builder: flatbuffers.Builder, valuesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, valuesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset indicesOffset\n */\n static addIndices(builder: flatbuffers.Builder, indicesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, indicesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset dimsOffset\n */\n static addDims(builder: flatbuffers.Builder, dimsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, dimsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createDimsVector(builder: flatbuffers.Builder, data: flatbuffers.Long[]): flatbuffers.Offset {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt64(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startDimsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(8, numElems, 8);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endSparseTensor(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createSparseTensor(\n builder: flatbuffers.Builder, valuesOffset: flatbuffers.Offset, indicesOffset: flatbuffers.Offset,\n dimsOffset: flatbuffers.Offset): flatbuffers.Offset {\n SparseTensor.startSparseTensor(builder);\n SparseTensor.addValues(builder, valuesOffset);\n SparseTensor.addIndices(builder, indicesOffset);\n SparseTensor.addDims(builder, dimsOffset);\n return SparseTensor.endSparseTensor(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class Attribute {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns Attribute\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): Attribute {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Attribute= obj\n * @returns Attribute\n */\n static getRootAsAttribute(bb: flatbuffers.ByteBuffer, obj?: Attribute): Attribute {\n return (obj || new Attribute()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Attribute= obj\n * @returns Attribute\n */\n static getSizePrefixedRootAsAttribute(bb: flatbuffers.ByteBuffer, obj?: Attribute): Attribute {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Attribute()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n name(): string|null;\n name(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n name(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n docString(): string|null;\n docString(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n docString(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @returns onnxruntime.experimental.fbs.AttributeType\n */\n type(): onnxruntime.experimental.fbs.AttributeType {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? /** */ (this.bb!.readInt32(this.bb_pos + offset)) :\n onnxruntime.experimental.fbs.AttributeType.UNDEFINED;\n }\n\n /**\n * @returns number\n */\n f(): number {\n let offset = this.bb!.__offset(this.bb_pos, 10);\n return offset ? this.bb!.readFloat32(this.bb_pos + offset) : 0.0;\n }\n\n /**\n * @returns flatbuffers.Long\n */\n i(): flatbuffers.Long {\n let offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(0, 0);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n s(): string|null;\n s(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n s(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 14);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.Tensor= obj\n * @returns onnxruntime.experimental.fbs.Tensor|null\n */\n t(obj?: onnxruntime.experimental.fbs.Tensor): onnxruntime.experimental.fbs.Tensor|null {\n let offset = this.bb!.__offset(this.bb_pos, 16);\n return offset ? (obj || new onnxruntime.experimental.fbs.Tensor())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.Graph= obj\n * @returns onnxruntime.experimental.fbs.Graph|null\n */\n g(obj?: onnxruntime.experimental.fbs.Graph): onnxruntime.experimental.fbs.Graph|null {\n let offset = this.bb!.__offset(this.bb_pos, 18);\n return offset ? (obj || new onnxruntime.experimental.fbs.Graph())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param number index\n * @returns number\n */\n floats(index: number): number|null {\n let offset = this.bb!.__offset(this.bb_pos, 20);\n return offset ? this.bb!.readFloat32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\n }\n\n /**\n * @returns number\n */\n floatsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 20);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @returns Float32Array\n */\n floatsArray(): Float32Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 20);\n return offset ?\n new Float32Array(\n this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset),\n this.bb!.__vector_len(this.bb_pos + offset)) :\n null;\n }\n\n /**\n * @param number index\n * @returns flatbuffers.Long\n */\n ints(index: number): flatbuffers.Long|null {\n let offset = this.bb!.__offset(this.bb_pos, 22);\n return offset ? this.bb!.readInt64(this.bb!.__vector(this.bb_pos + offset) + index * 8) :\n this.bb!.createLong(0, 0);\n }\n\n /**\n * @returns number\n */\n intsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 22);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array\n */\n strings(index: number): string;\n strings(index: number, optionalEncoding: flatbuffers.Encoding): string|Uint8Array;\n strings(index: number, optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 24);\n return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n }\n\n /**\n * @returns number\n */\n stringsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 24);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.Tensor= obj\n * @returns onnxruntime.experimental.fbs.Tensor\n */\n tensors(index: number, obj?: onnxruntime.experimental.fbs.Tensor): onnxruntime.experimental.fbs.Tensor|null {\n let offset = this.bb!.__offset(this.bb_pos, 26);\n return offset ? (obj || new onnxruntime.experimental.fbs.Tensor())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n tensorsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 26);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.Graph= obj\n * @returns onnxruntime.experimental.fbs.Graph\n */\n graphs(index: number, obj?: onnxruntime.experimental.fbs.Graph): onnxruntime.experimental.fbs.Graph|null {\n let offset = this.bb!.__offset(this.bb_pos, 28);\n return offset ? (obj || new onnxruntime.experimental.fbs.Graph())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n graphsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 28);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startAttribute(builder: flatbuffers.Builder) {\n builder.startObject(13);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset nameOffset\n */\n static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, nameOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset docStringOffset\n */\n static addDocString(builder: flatbuffers.Builder, docStringOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, docStringOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param onnxruntime.experimental.fbs.AttributeType type\n */\n static addType(builder: flatbuffers.Builder, type: onnxruntime.experimental.fbs.AttributeType) {\n builder.addFieldInt32(2, type, onnxruntime.experimental.fbs.AttributeType.UNDEFINED);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number f\n */\n static addF(builder: flatbuffers.Builder, f: number) {\n builder.addFieldFloat32(3, f, 0.0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Long i\n */\n static addI(builder: flatbuffers.Builder, i: flatbuffers.Long) {\n builder.addFieldInt64(4, i, builder.createLong(0, 0));\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset sOffset\n */\n static addS(builder: flatbuffers.Builder, sOffset: flatbuffers.Offset) {\n builder.addFieldOffset(5, sOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset tOffset\n */\n static addT(builder: flatbuffers.Builder, tOffset: flatbuffers.Offset) {\n builder.addFieldOffset(6, tOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset gOffset\n */\n static addG(builder: flatbuffers.Builder, gOffset: flatbuffers.Offset) {\n builder.addFieldOffset(7, gOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset floatsOffset\n */\n static addFloats(builder: flatbuffers.Builder, floatsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(8, floatsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createFloatsVector(builder: flatbuffers.Builder, data: number[]|Uint8Array): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addFloat32(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startFloatsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset intsOffset\n */\n static addInts(builder: flatbuffers.Builder, intsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(9, intsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createIntsVector(builder: flatbuffers.Builder, data: flatbuffers.Long[]): flatbuffers.Offset {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt64(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startIntsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(8, numElems, 8);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset stringsOffset\n */\n static addStrings(builder: flatbuffers.Builder, stringsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(10, stringsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createStringsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startStringsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset tensorsOffset\n */\n static addTensors(builder: flatbuffers.Builder, tensorsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(11, tensorsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createTensorsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startTensorsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset graphsOffset\n */\n static addGraphs(builder: flatbuffers.Builder, graphsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(12, graphsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createGraphsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startGraphsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endAttribute(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createAttribute(\n builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset, docStringOffset: flatbuffers.Offset,\n type: onnxruntime.experimental.fbs.AttributeType, f: number, i: flatbuffers.Long, sOffset: flatbuffers.Offset,\n tOffset: flatbuffers.Offset, gOffset: flatbuffers.Offset, floatsOffset: flatbuffers.Offset,\n intsOffset: flatbuffers.Offset, stringsOffset: flatbuffers.Offset, tensorsOffset: flatbuffers.Offset,\n graphsOffset: flatbuffers.Offset): flatbuffers.Offset {\n Attribute.startAttribute(builder);\n Attribute.addName(builder, nameOffset);\n Attribute.addDocString(builder, docStringOffset);\n Attribute.addType(builder, type);\n Attribute.addF(builder, f);\n Attribute.addI(builder, i);\n Attribute.addS(builder, sOffset);\n Attribute.addT(builder, tOffset);\n Attribute.addG(builder, gOffset);\n Attribute.addFloats(builder, floatsOffset);\n Attribute.addInts(builder, intsOffset);\n Attribute.addStrings(builder, stringsOffset);\n Attribute.addTensors(builder, tensorsOffset);\n Attribute.addGraphs(builder, graphsOffset);\n return Attribute.endAttribute(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class Graph {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns Graph\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): Graph {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Graph= obj\n * @returns Graph\n */\n static getRootAsGraph(bb: flatbuffers.ByteBuffer, obj?: Graph): Graph {\n return (obj || new Graph()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Graph= obj\n * @returns Graph\n */\n static getSizePrefixedRootAsGraph(bb: flatbuffers.ByteBuffer, obj?: Graph): Graph {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Graph()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.Tensor= obj\n * @returns onnxruntime.experimental.fbs.Tensor\n */\n initializers(index: number, obj?: onnxruntime.experimental.fbs.Tensor): onnxruntime.experimental.fbs.Tensor|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? (obj || new onnxruntime.experimental.fbs.Tensor())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n initializersLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.ValueInfo= obj\n * @returns onnxruntime.experimental.fbs.ValueInfo\n */\n nodeArgs(index: number, obj?: onnxruntime.experimental.fbs.ValueInfo): onnxruntime.experimental.fbs.ValueInfo|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.ValueInfo())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n nodeArgsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.Node= obj\n * @returns onnxruntime.experimental.fbs.Node\n */\n nodes(index: number, obj?: onnxruntime.experimental.fbs.Node): onnxruntime.experimental.fbs.Node|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? (obj || new onnxruntime.experimental.fbs.Node())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n nodesLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @returns number\n */\n maxNodeIndex(): number {\n let offset = this.bb!.__offset(this.bb_pos, 10);\n return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.NodeEdge= obj\n * @returns onnxruntime.experimental.fbs.NodeEdge\n */\n nodeEdges(index: number, obj?: onnxruntime.experimental.fbs.NodeEdge): onnxruntime.experimental.fbs.NodeEdge|null {\n let offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ? (obj || new onnxruntime.experimental.fbs.NodeEdge())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n nodeEdgesLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array\n */\n inputs(index: number): string;\n inputs(index: number, optionalEncoding: flatbuffers.Encoding): string|Uint8Array;\n inputs(index: number, optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 14);\n return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n }\n\n /**\n * @returns number\n */\n inputsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 14);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array\n */\n outputs(index: number): string;\n outputs(index: number, optionalEncoding: flatbuffers.Encoding): string|Uint8Array;\n outputs(index: number, optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 16);\n return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n }\n\n /**\n * @returns number\n */\n outputsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 16);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.SparseTensor= obj\n * @returns onnxruntime.experimental.fbs.SparseTensor\n */\n sparseInitializers(index: number, obj?: onnxruntime.experimental.fbs.SparseTensor):\n onnxruntime.experimental.fbs.SparseTensor|null {\n let offset = this.bb!.__offset(this.bb_pos, 18);\n return offset ? (obj || new onnxruntime.experimental.fbs.SparseTensor())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n sparseInitializersLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 18);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startGraph(builder: flatbuffers.Builder) {\n builder.startObject(8);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset initializersOffset\n */\n static addInitializers(builder: flatbuffers.Builder, initializersOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, initializersOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createInitializersVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startInitializersVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset nodeArgsOffset\n */\n static addNodeArgs(builder: flatbuffers.Builder, nodeArgsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, nodeArgsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createNodeArgsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startNodeArgsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset nodesOffset\n */\n static addNodes(builder: flatbuffers.Builder, nodesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, nodesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createNodesVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startNodesVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number maxNodeIndex\n */\n static addMaxNodeIndex(builder: flatbuffers.Builder, maxNodeIndex: number) {\n builder.addFieldInt32(3, maxNodeIndex, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset nodeEdgesOffset\n */\n static addNodeEdges(builder: flatbuffers.Builder, nodeEdgesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(4, nodeEdgesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createNodeEdgesVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startNodeEdgesVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset inputsOffset\n */\n static addInputs(builder: flatbuffers.Builder, inputsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(5, inputsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createInputsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startInputsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset outputsOffset\n */\n static addOutputs(builder: flatbuffers.Builder, outputsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(6, outputsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createOutputsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startOutputsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset sparseInitializersOffset\n */\n static addSparseInitializers(builder: flatbuffers.Builder, sparseInitializersOffset: flatbuffers.Offset) {\n builder.addFieldOffset(7, sparseInitializersOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createSparseInitializersVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]):\n flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startSparseInitializersVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endGraph(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createGraph(\n builder: flatbuffers.Builder, initializersOffset: flatbuffers.Offset, nodeArgsOffset: flatbuffers.Offset,\n nodesOffset: flatbuffers.Offset, maxNodeIndex: number, nodeEdgesOffset: flatbuffers.Offset,\n inputsOffset: flatbuffers.Offset, outputsOffset: flatbuffers.Offset,\n sparseInitializersOffset: flatbuffers.Offset): flatbuffers.Offset {\n Graph.startGraph(builder);\n Graph.addInitializers(builder, initializersOffset);\n Graph.addNodeArgs(builder, nodeArgsOffset);\n Graph.addNodes(builder, nodesOffset);\n Graph.addMaxNodeIndex(builder, maxNodeIndex);\n Graph.addNodeEdges(builder, nodeEdgesOffset);\n Graph.addInputs(builder, inputsOffset);\n Graph.addOutputs(builder, outputsOffset);\n Graph.addSparseInitializers(builder, sparseInitializersOffset);\n return Graph.endGraph(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class Model {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns Model\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): Model {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Model= obj\n * @returns Model\n */\n static getRootAsModel(bb: flatbuffers.ByteBuffer, obj?: Model): Model {\n return (obj || new Model()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Model= obj\n * @returns Model\n */\n static getSizePrefixedRootAsModel(bb: flatbuffers.ByteBuffer, obj?: Model): Model {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Model()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @returns flatbuffers.Long\n */\n irVersion(): flatbuffers.Long {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(0, 0);\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.OperatorSetId= obj\n * @returns onnxruntime.experimental.fbs.OperatorSetId\n */\n opsetImport(index: number, obj?: onnxruntime.experimental.fbs.OperatorSetId):\n onnxruntime.experimental.fbs.OperatorSetId|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.OperatorSetId())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n opsetImportLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n producerName(): string|null;\n producerName(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n producerName(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n producerVersion(): string|null;\n producerVersion(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n producerVersion(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 10);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n domain(): string|null;\n domain(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n domain(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @returns flatbuffers.Long\n */\n modelVersion(): flatbuffers.Long {\n let offset = this.bb!.__offset(this.bb_pos, 14);\n return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(0, 0);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n docString(): string|null;\n docString(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n docString(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 16);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.Graph= obj\n * @returns onnxruntime.experimental.fbs.Graph|null\n */\n graph(obj?: onnxruntime.experimental.fbs.Graph): onnxruntime.experimental.fbs.Graph|null {\n let offset = this.bb!.__offset(this.bb_pos, 18);\n return offset ? (obj || new onnxruntime.experimental.fbs.Graph())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n graphDocString(): string|null;\n graphDocString(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n graphDocString(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 20);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startModel(builder: flatbuffers.Builder) {\n builder.startObject(9);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Long irVersion\n */\n static addIrVersion(builder: flatbuffers.Builder, irVersion: flatbuffers.Long) {\n builder.addFieldInt64(0, irVersion, builder.createLong(0, 0));\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset opsetImportOffset\n */\n static addOpsetImport(builder: flatbuffers.Builder, opsetImportOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, opsetImportOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createOpsetImportVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startOpsetImportVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset producerNameOffset\n */\n static addProducerName(builder: flatbuffers.Builder, producerNameOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, producerNameOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset producerVersionOffset\n */\n static addProducerVersion(builder: flatbuffers.Builder, producerVersionOffset: flatbuffers.Offset) {\n builder.addFieldOffset(3, producerVersionOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset domainOffset\n */\n static addDomain(builder: flatbuffers.Builder, domainOffset: flatbuffers.Offset) {\n builder.addFieldOffset(4, domainOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Long modelVersion\n */\n static addModelVersion(builder: flatbuffers.Builder, modelVersion: flatbuffers.Long) {\n builder.addFieldInt64(5, modelVersion, builder.createLong(0, 0));\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset docStringOffset\n */\n static addDocString(builder: flatbuffers.Builder, docStringOffset: flatbuffers.Offset) {\n builder.addFieldOffset(6, docStringOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset graphOffset\n */\n static addGraph(builder: flatbuffers.Builder, graphOffset: flatbuffers.Offset) {\n builder.addFieldOffset(7, graphOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset graphDocStringOffset\n */\n static addGraphDocString(builder: flatbuffers.Builder, graphDocStringOffset: flatbuffers.Offset) {\n builder.addFieldOffset(8, graphDocStringOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endModel(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createModel(\n builder: flatbuffers.Builder, irVersion: flatbuffers.Long, opsetImportOffset: flatbuffers.Offset,\n producerNameOffset: flatbuffers.Offset, producerVersionOffset: flatbuffers.Offset,\n domainOffset: flatbuffers.Offset, modelVersion: flatbuffers.Long, docStringOffset: flatbuffers.Offset,\n graphOffset: flatbuffers.Offset, graphDocStringOffset: flatbuffers.Offset): flatbuffers.Offset {\n Model.startModel(builder);\n Model.addIrVersion(builder, irVersion);\n Model.addOpsetImport(builder, opsetImportOffset);\n Model.addProducerName(builder, producerNameOffset);\n Model.addProducerVersion(builder, producerVersionOffset);\n Model.addDomain(builder, domainOffset);\n Model.addModelVersion(builder, modelVersion);\n Model.addDocString(builder, docStringOffset);\n Model.addGraph(builder, graphOffset);\n Model.addGraphDocString(builder, graphDocStringOffset);\n return Model.endModel(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class KernelCreateInfos {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns KernelCreateInfos\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): KernelCreateInfos {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param KernelCreateInfos= obj\n * @returns KernelCreateInfos\n */\n static getRootAsKernelCreateInfos(bb: flatbuffers.ByteBuffer, obj?: KernelCreateInfos): KernelCreateInfos {\n return (obj || new KernelCreateInfos()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param KernelCreateInfos= obj\n * @returns KernelCreateInfos\n */\n static getSizePrefixedRootAsKernelCreateInfos(bb: flatbuffers.ByteBuffer, obj?: KernelCreateInfos):\n KernelCreateInfos {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new KernelCreateInfos()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param number index\n * @returns number\n */\n nodeIndices(index: number): number|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.readUint32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\n }\n\n /**\n * @returns number\n */\n nodeIndicesLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @returns Uint32Array\n */\n nodeIndicesArray(): Uint32Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ?\n new Uint32Array(\n this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset),\n this.bb!.__vector_len(this.bb_pos + offset)) :\n null;\n }\n\n /**\n * @param number index\n * @returns flatbuffers.Long\n */\n kernelDefHashes(index: number): flatbuffers.Long|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.readUint64(this.bb!.__vector(this.bb_pos + offset) + index * 8) :\n this.bb!.createLong(0, 0);\n }\n\n /**\n * @returns number\n */\n kernelDefHashesLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startKernelCreateInfos(builder: flatbuffers.Builder) {\n builder.startObject(2);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset nodeIndicesOffset\n */\n static addNodeIndices(builder: flatbuffers.Builder, nodeIndicesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, nodeIndicesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createNodeIndicesVector(builder: flatbuffers.Builder, data: number[]|Uint8Array): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt32(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startNodeIndicesVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset kernelDefHashesOffset\n */\n static addKernelDefHashes(builder: flatbuffers.Builder, kernelDefHashesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, kernelDefHashesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createKernelDefHashesVector(builder: flatbuffers.Builder, data: flatbuffers.Long[]): flatbuffers.Offset {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt64(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startKernelDefHashesVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(8, numElems, 8);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endKernelCreateInfos(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createKernelCreateInfos(\n builder: flatbuffers.Builder, nodeIndicesOffset: flatbuffers.Offset,\n kernelDefHashesOffset: flatbuffers.Offset): flatbuffers.Offset {\n KernelCreateInfos.startKernelCreateInfos(builder);\n KernelCreateInfos.addNodeIndices(builder, nodeIndicesOffset);\n KernelCreateInfos.addKernelDefHashes(builder, kernelDefHashesOffset);\n return KernelCreateInfos.endKernelCreateInfos(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class SubGraphSessionState {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns SubGraphSessionState\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): SubGraphSessionState {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param SubGraphSessionState= obj\n * @returns SubGraphSessionState\n */\n static getRootAsSubGraphSessionState(bb: flatbuffers.ByteBuffer, obj?: SubGraphSessionState): SubGraphSessionState {\n return (obj || new SubGraphSessionState()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param SubGraphSessionState= obj\n * @returns SubGraphSessionState\n */\n static getSizePrefixedRootAsSubGraphSessionState(bb: flatbuffers.ByteBuffer, obj?: SubGraphSessionState):\n SubGraphSessionState {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new SubGraphSessionState()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n graphId(): string|null;\n graphId(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n graphId(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.SessionState= obj\n * @returns onnxruntime.experimental.fbs.SessionState|null\n */\n sessionState(obj?: onnxruntime.experimental.fbs.SessionState): onnxruntime.experimental.fbs.SessionState|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.SessionState())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startSubGraphSessionState(builder: flatbuffers.Builder) {\n builder.startObject(2);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset graphIdOffset\n */\n static addGraphId(builder: flatbuffers.Builder, graphIdOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, graphIdOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset sessionStateOffset\n */\n static addSessionState(builder: flatbuffers.Builder, sessionStateOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, sessionStateOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endSubGraphSessionState(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n builder.requiredField(offset, 4); // graph_id\n return offset;\n }\n\n static createSubGraphSessionState(\n builder: flatbuffers.Builder, graphIdOffset: flatbuffers.Offset,\n sessionStateOffset: flatbuffers.Offset): flatbuffers.Offset {\n SubGraphSessionState.startSubGraphSessionState(builder);\n SubGraphSessionState.addGraphId(builder, graphIdOffset);\n SubGraphSessionState.addSessionState(builder, sessionStateOffset);\n return SubGraphSessionState.endSubGraphSessionState(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class SessionState {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns SessionState\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): SessionState {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param SessionState= obj\n * @returns SessionState\n */\n static getRootAsSessionState(bb: flatbuffers.ByteBuffer, obj?: SessionState): SessionState {\n return (obj || new SessionState()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param SessionState= obj\n * @returns SessionState\n */\n static getSizePrefixedRootAsSessionState(bb: flatbuffers.ByteBuffer, obj?: SessionState): SessionState {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new SessionState()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param onnxruntime.experimental.fbs.KernelCreateInfos= obj\n * @returns onnxruntime.experimental.fbs.KernelCreateInfos|null\n */\n kernels(obj?: onnxruntime.experimental.fbs.KernelCreateInfos): onnxruntime.experimental.fbs.KernelCreateInfos|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? (obj || new onnxruntime.experimental.fbs.KernelCreateInfos())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.SubGraphSessionState= obj\n * @returns onnxruntime.experimental.fbs.SubGraphSessionState\n */\n subGraphSessionStates(index: number, obj?: onnxruntime.experimental.fbs.SubGraphSessionState):\n onnxruntime.experimental.fbs.SubGraphSessionState|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.SubGraphSessionState())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n subGraphSessionStatesLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startSessionState(builder: flatbuffers.Builder) {\n builder.startObject(2);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset kernelsOffset\n */\n static addKernels(builder: flatbuffers.Builder, kernelsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, kernelsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset subGraphSessionStatesOffset\n */\n static addSubGraphSessionStates(builder: flatbuffers.Builder, subGraphSessionStatesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, subGraphSessionStatesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createSubGraphSessionStatesVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]):\n flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startSubGraphSessionStatesVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endSessionState(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createSessionState(\n builder: flatbuffers.Builder, kernelsOffset: flatbuffers.Offset,\n subGraphSessionStatesOffset: flatbuffers.Offset): flatbuffers.Offset {\n SessionState.startSessionState(builder);\n SessionState.addKernels(builder, kernelsOffset);\n SessionState.addSubGraphSessionStates(builder, subGraphSessionStatesOffset);\n return SessionState.endSessionState(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class InferenceSession {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns InferenceSession\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): InferenceSession {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param InferenceSession= obj\n * @returns InferenceSession\n */\n static getRootAsInferenceSession(bb: flatbuffers.ByteBuffer, obj?: InferenceSession): InferenceSession {\n return (obj || new InferenceSession()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param InferenceSession= obj\n * @returns InferenceSession\n */\n static getSizePrefixedRootAsInferenceSession(bb: flatbuffers.ByteBuffer, obj?: InferenceSession): InferenceSession {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new InferenceSession()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @returns boolean\n */\n static bufferHasIdentifier(bb: flatbuffers.ByteBuffer): boolean {\n return bb.__has_identifier('ORTM');\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n ortVersion(): string|null;\n ortVersion(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n ortVersion(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.Model= obj\n * @returns onnxruntime.experimental.fbs.Model|null\n */\n model(obj?: onnxruntime.experimental.fbs.Model): onnxruntime.experimental.fbs.Model|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.Model())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.SessionState= obj\n * @returns onnxruntime.experimental.fbs.SessionState|null\n */\n sessionState(obj?: onnxruntime.experimental.fbs.SessionState): onnxruntime.experimental.fbs.SessionState|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? (obj || new onnxruntime.experimental.fbs.SessionState())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startInferenceSession(builder: flatbuffers.Builder) {\n builder.startObject(3);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset ortVersionOffset\n */\n static addOrtVersion(builder: flatbuffers.Builder, ortVersionOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, ortVersionOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset modelOffset\n */\n static addModel(builder: flatbuffers.Builder, modelOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, modelOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset sessionStateOffset\n */\n static addSessionState(builder: flatbuffers.Builder, sessionStateOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, sessionStateOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endInferenceSession(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset offset\n */\n static finishInferenceSessionBuffer(builder: flatbuffers.Builder, offset: flatbuffers.Offset) {\n builder.finish(offset, 'ORTM');\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset offset\n */\n static finishSizePrefixedInferenceSessionBuffer(builder: flatbuffers.Builder, offset: flatbuffers.Offset) {\n builder.finish(offset, 'ORTM', true);\n }\n\n static createInferenceSession(\n builder: flatbuffers.Builder, ortVersionOffset: flatbuffers.Offset, modelOffset: flatbuffers.Offset,\n sessionStateOffset: flatbuffers.Offset): flatbuffers.Offset {\n InferenceSession.startInferenceSession(builder);\n InferenceSession.addOrtVersion(builder, ortVersionOffset);\n InferenceSession.addModel(builder, modelOffset);\n InferenceSession.addSessionState(builder, sessionStateOffset);\n return InferenceSession.endInferenceSession(builder);\n }\n }\n}\n", "\"use strict\";\r\nmodule.exports = asPromise;\r\n\r\n/**\r\n * Callback as used by {@link util.asPromise}.\r\n * @typedef asPromiseCallback\r\n * @type {function}\r\n * @param {Error|null} error Error, if any\r\n * @param {...*} params Additional arguments\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Returns a promise from a node-style callback function.\r\n * @memberof util\r\n * @param {asPromiseCallback} fn Function to call\r\n * @param {*} ctx Function context\r\n * @param {...*} params Function arguments\r\n * @returns {Promise<*>} Promisified function\r\n */\r\nfunction asPromise(fn, ctx/*, varargs */) {\r\n var params = new Array(arguments.length - 1),\r\n offset = 0,\r\n index = 2,\r\n pending = true;\r\n while (index < arguments.length)\r\n params[offset++] = arguments[index++];\r\n return new Promise(function executor(resolve, reject) {\r\n params[offset] = function callback(err/*, varargs */) {\r\n if (pending) {\r\n pending = false;\r\n if (err)\r\n reject(err);\r\n else {\r\n var params = new Array(arguments.length - 1),\r\n offset = 0;\r\n while (offset < params.length)\r\n params[offset++] = arguments[offset];\r\n resolve.apply(null, params);\r\n }\r\n }\r\n };\r\n try {\r\n fn.apply(ctx || null, params);\r\n } catch (err) {\r\n if (pending) {\r\n pending = false;\r\n reject(err);\r\n }\r\n }\r\n });\r\n}\r\n", "\"use strict\";\r\n\r\n/**\r\n * A minimal base64 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar base64 = exports;\r\n\r\n/**\r\n * Calculates the byte length of a base64 encoded string.\r\n * @param {string} string Base64 encoded string\r\n * @returns {number} Byte length\r\n */\r\nbase64.length = function length(string) {\r\n var p = string.length;\r\n if (!p)\r\n return 0;\r\n var n = 0;\r\n while (--p % 4 > 1 && string.charAt(p) === \"=\")\r\n ++n;\r\n return Math.ceil(string.length * 3) / 4 - n;\r\n};\r\n\r\n// Base64 encoding table\r\nvar b64 = new Array(64);\r\n\r\n// Base64 decoding table\r\nvar s64 = new Array(123);\r\n\r\n// 65..90, 97..122, 48..57, 43, 47\r\nfor (var i = 0; i < 64;)\r\n s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\r\n\r\n/**\r\n * Encodes a buffer to a base64 encoded string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} Base64 encoded string\r\n */\r\nbase64.encode = function encode(buffer, start, end) {\r\n var parts = null,\r\n chunk = [];\r\n var i = 0, // output index\r\n j = 0, // goto index\r\n t; // temporary\r\n while (start < end) {\r\n var b = buffer[start++];\r\n switch (j) {\r\n case 0:\r\n chunk[i++] = b64[b >> 2];\r\n t = (b & 3) << 4;\r\n j = 1;\r\n break;\r\n case 1:\r\n chunk[i++] = b64[t | b >> 4];\r\n t = (b & 15) << 2;\r\n j = 2;\r\n break;\r\n case 2:\r\n chunk[i++] = b64[t | b >> 6];\r\n chunk[i++] = b64[b & 63];\r\n j = 0;\r\n break;\r\n }\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (j) {\r\n chunk[i++] = b64[t];\r\n chunk[i++] = 61;\r\n if (j === 1)\r\n chunk[i++] = 61;\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\nvar invalidEncoding = \"invalid encoding\";\r\n\r\n/**\r\n * Decodes a base64 encoded string to a buffer.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Number of bytes written\r\n * @throws {Error} If encoding is invalid\r\n */\r\nbase64.decode = function decode(string, buffer, offset) {\r\n var start = offset;\r\n var j = 0, // goto index\r\n t; // temporary\r\n for (var i = 0; i < string.length;) {\r\n var c = string.charCodeAt(i++);\r\n if (c === 61 && j > 1)\r\n break;\r\n if ((c = s64[c]) === undefined)\r\n throw Error(invalidEncoding);\r\n switch (j) {\r\n case 0:\r\n t = c;\r\n j = 1;\r\n break;\r\n case 1:\r\n buffer[offset++] = t << 2 | (c & 48) >> 4;\r\n t = c;\r\n j = 2;\r\n break;\r\n case 2:\r\n buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2;\r\n t = c;\r\n j = 3;\r\n break;\r\n case 3:\r\n buffer[offset++] = (t & 3) << 6 | c;\r\n j = 0;\r\n break;\r\n }\r\n }\r\n if (j === 1)\r\n throw Error(invalidEncoding);\r\n return offset - start;\r\n};\r\n\r\n/**\r\n * Tests if the specified string appears to be base64 encoded.\r\n * @param {string} string String to test\r\n * @returns {boolean} `true` if probably base64 encoded, otherwise false\r\n */\r\nbase64.test = function test(string) {\r\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string);\r\n};\r\n", "\"use strict\";\r\nmodule.exports = EventEmitter;\r\n\r\n/**\r\n * Constructs a new event emitter instance.\r\n * @classdesc A minimal event emitter.\r\n * @memberof util\r\n * @constructor\r\n */\r\nfunction EventEmitter() {\r\n\r\n /**\r\n * Registered listeners.\r\n * @type {Object.}\r\n * @private\r\n */\r\n this._listeners = {};\r\n}\r\n\r\n/**\r\n * Registers an event listener.\r\n * @param {string} evt Event name\r\n * @param {function} fn Listener\r\n * @param {*} [ctx] Listener context\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.on = function on(evt, fn, ctx) {\r\n (this._listeners[evt] || (this._listeners[evt] = [])).push({\r\n fn : fn,\r\n ctx : ctx || this\r\n });\r\n return this;\r\n};\r\n\r\n/**\r\n * Removes an event listener or any matching listeners if arguments are omitted.\r\n * @param {string} [evt] Event name. Removes all listeners if omitted.\r\n * @param {function} [fn] Listener to remove. Removes all listeners of `evt` if omitted.\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.off = function off(evt, fn) {\r\n if (evt === undefined)\r\n this._listeners = {};\r\n else {\r\n if (fn === undefined)\r\n this._listeners[evt] = [];\r\n else {\r\n var listeners = this._listeners[evt];\r\n for (var i = 0; i < listeners.length;)\r\n if (listeners[i].fn === fn)\r\n listeners.splice(i, 1);\r\n else\r\n ++i;\r\n }\r\n }\r\n return this;\r\n};\r\n\r\n/**\r\n * Emits an event by calling its listeners with the specified arguments.\r\n * @param {string} evt Event name\r\n * @param {...*} args Arguments\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.emit = function emit(evt) {\r\n var listeners = this._listeners[evt];\r\n if (listeners) {\r\n var args = [],\r\n i = 1;\r\n for (; i < arguments.length;)\r\n args.push(arguments[i++]);\r\n for (i = 0; i < listeners.length;)\r\n listeners[i].fn.apply(listeners[i++].ctx, args);\r\n }\r\n return this;\r\n};\r\n", "\"use strict\";\r\n\r\nmodule.exports = factory(factory);\r\n\r\n/**\r\n * Reads / writes floats / doubles from / to buffers.\r\n * @name util.float\r\n * @namespace\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using little endian byte order.\r\n * @name util.float.writeFloatLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using big endian byte order.\r\n * @name util.float.writeFloatBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using little endian byte order.\r\n * @name util.float.readFloatLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using big endian byte order.\r\n * @name util.float.readFloatBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using little endian byte order.\r\n * @name util.float.writeDoubleLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using big endian byte order.\r\n * @name util.float.writeDoubleBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using little endian byte order.\r\n * @name util.float.readDoubleLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using big endian byte order.\r\n * @name util.float.readDoubleBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n// Factory function for the purpose of node-based testing in modified global environments\r\nfunction factory(exports) {\r\n\r\n // float: typed array\r\n if (typeof Float32Array !== \"undefined\") (function() {\r\n\r\n var f32 = new Float32Array([ -0 ]),\r\n f8b = new Uint8Array(f32.buffer),\r\n le = f8b[3] === 128;\r\n\r\n function writeFloat_f32_cpy(val, buf, pos) {\r\n f32[0] = val;\r\n buf[pos ] = f8b[0];\r\n buf[pos + 1] = f8b[1];\r\n buf[pos + 2] = f8b[2];\r\n buf[pos + 3] = f8b[3];\r\n }\r\n\r\n function writeFloat_f32_rev(val, buf, pos) {\r\n f32[0] = val;\r\n buf[pos ] = f8b[3];\r\n buf[pos + 1] = f8b[2];\r\n buf[pos + 2] = f8b[1];\r\n buf[pos + 3] = f8b[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev;\r\n /* istanbul ignore next */\r\n exports.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy;\r\n\r\n function readFloat_f32_cpy(buf, pos) {\r\n f8b[0] = buf[pos ];\r\n f8b[1] = buf[pos + 1];\r\n f8b[2] = buf[pos + 2];\r\n f8b[3] = buf[pos + 3];\r\n return f32[0];\r\n }\r\n\r\n function readFloat_f32_rev(buf, pos) {\r\n f8b[3] = buf[pos ];\r\n f8b[2] = buf[pos + 1];\r\n f8b[1] = buf[pos + 2];\r\n f8b[0] = buf[pos + 3];\r\n return f32[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev;\r\n /* istanbul ignore next */\r\n exports.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy;\r\n\r\n // float: ieee754\r\n })(); else (function() {\r\n\r\n function writeFloat_ieee754(writeUint, val, buf, pos) {\r\n var sign = val < 0 ? 1 : 0;\r\n if (sign)\r\n val = -val;\r\n if (val === 0)\r\n writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos);\r\n else if (isNaN(val))\r\n writeUint(2143289344, buf, pos);\r\n else if (val > 3.4028234663852886e+38) // +-Infinity\r\n writeUint((sign << 31 | 2139095040) >>> 0, buf, pos);\r\n else if (val < 1.1754943508222875e-38) // denormal\r\n writeUint((sign << 31 | Math.round(val / 1.401298464324817e-45)) >>> 0, buf, pos);\r\n else {\r\n var exponent = Math.floor(Math.log(val) / Math.LN2),\r\n mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607;\r\n writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos);\r\n }\r\n }\r\n\r\n exports.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE);\r\n exports.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE);\r\n\r\n function readFloat_ieee754(readUint, buf, pos) {\r\n var uint = readUint(buf, pos),\r\n sign = (uint >> 31) * 2 + 1,\r\n exponent = uint >>> 23 & 255,\r\n mantissa = uint & 8388607;\r\n return exponent === 255\r\n ? mantissa\r\n ? NaN\r\n : sign * Infinity\r\n : exponent === 0 // denormal\r\n ? sign * 1.401298464324817e-45 * mantissa\r\n : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608);\r\n }\r\n\r\n exports.readFloatLE = readFloat_ieee754.bind(null, readUintLE);\r\n exports.readFloatBE = readFloat_ieee754.bind(null, readUintBE);\r\n\r\n })();\r\n\r\n // double: typed array\r\n if (typeof Float64Array !== \"undefined\") (function() {\r\n\r\n var f64 = new Float64Array([-0]),\r\n f8b = new Uint8Array(f64.buffer),\r\n le = f8b[7] === 128;\r\n\r\n function writeDouble_f64_cpy(val, buf, pos) {\r\n f64[0] = val;\r\n buf[pos ] = f8b[0];\r\n buf[pos + 1] = f8b[1];\r\n buf[pos + 2] = f8b[2];\r\n buf[pos + 3] = f8b[3];\r\n buf[pos + 4] = f8b[4];\r\n buf[pos + 5] = f8b[5];\r\n buf[pos + 6] = f8b[6];\r\n buf[pos + 7] = f8b[7];\r\n }\r\n\r\n function writeDouble_f64_rev(val, buf, pos) {\r\n f64[0] = val;\r\n buf[pos ] = f8b[7];\r\n buf[pos + 1] = f8b[6];\r\n buf[pos + 2] = f8b[5];\r\n buf[pos + 3] = f8b[4];\r\n buf[pos + 4] = f8b[3];\r\n buf[pos + 5] = f8b[2];\r\n buf[pos + 6] = f8b[1];\r\n buf[pos + 7] = f8b[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev;\r\n /* istanbul ignore next */\r\n exports.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy;\r\n\r\n function readDouble_f64_cpy(buf, pos) {\r\n f8b[0] = buf[pos ];\r\n f8b[1] = buf[pos + 1];\r\n f8b[2] = buf[pos + 2];\r\n f8b[3] = buf[pos + 3];\r\n f8b[4] = buf[pos + 4];\r\n f8b[5] = buf[pos + 5];\r\n f8b[6] = buf[pos + 6];\r\n f8b[7] = buf[pos + 7];\r\n return f64[0];\r\n }\r\n\r\n function readDouble_f64_rev(buf, pos) {\r\n f8b[7] = buf[pos ];\r\n f8b[6] = buf[pos + 1];\r\n f8b[5] = buf[pos + 2];\r\n f8b[4] = buf[pos + 3];\r\n f8b[3] = buf[pos + 4];\r\n f8b[2] = buf[pos + 5];\r\n f8b[1] = buf[pos + 6];\r\n f8b[0] = buf[pos + 7];\r\n return f64[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev;\r\n /* istanbul ignore next */\r\n exports.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy;\r\n\r\n // double: ieee754\r\n })(); else (function() {\r\n\r\n function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) {\r\n var sign = val < 0 ? 1 : 0;\r\n if (sign)\r\n val = -val;\r\n if (val === 0) {\r\n writeUint(0, buf, pos + off0);\r\n writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos + off1);\r\n } else if (isNaN(val)) {\r\n writeUint(0, buf, pos + off0);\r\n writeUint(2146959360, buf, pos + off1);\r\n } else if (val > 1.7976931348623157e+308) { // +-Infinity\r\n writeUint(0, buf, pos + off0);\r\n writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1);\r\n } else {\r\n var mantissa;\r\n if (val < 2.2250738585072014e-308) { // denormal\r\n mantissa = val / 5e-324;\r\n writeUint(mantissa >>> 0, buf, pos + off0);\r\n writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1);\r\n } else {\r\n var exponent = Math.floor(Math.log(val) / Math.LN2);\r\n if (exponent === 1024)\r\n exponent = 1023;\r\n mantissa = val * Math.pow(2, -exponent);\r\n writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0);\r\n writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1);\r\n }\r\n }\r\n }\r\n\r\n exports.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4);\r\n exports.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0);\r\n\r\n function readDouble_ieee754(readUint, off0, off1, buf, pos) {\r\n var lo = readUint(buf, pos + off0),\r\n hi = readUint(buf, pos + off1);\r\n var sign = (hi >> 31) * 2 + 1,\r\n exponent = hi >>> 20 & 2047,\r\n mantissa = 4294967296 * (hi & 1048575) + lo;\r\n return exponent === 2047\r\n ? mantissa\r\n ? NaN\r\n : sign * Infinity\r\n : exponent === 0 // denormal\r\n ? sign * 5e-324 * mantissa\r\n : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496);\r\n }\r\n\r\n exports.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4);\r\n exports.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0);\r\n\r\n })();\r\n\r\n return exports;\r\n}\r\n\r\n// uint helpers\r\n\r\nfunction writeUintLE(val, buf, pos) {\r\n buf[pos ] = val & 255;\r\n buf[pos + 1] = val >>> 8 & 255;\r\n buf[pos + 2] = val >>> 16 & 255;\r\n buf[pos + 3] = val >>> 24;\r\n}\r\n\r\nfunction writeUintBE(val, buf, pos) {\r\n buf[pos ] = val >>> 24;\r\n buf[pos + 1] = val >>> 16 & 255;\r\n buf[pos + 2] = val >>> 8 & 255;\r\n buf[pos + 3] = val & 255;\r\n}\r\n\r\nfunction readUintLE(buf, pos) {\r\n return (buf[pos ]\r\n | buf[pos + 1] << 8\r\n | buf[pos + 2] << 16\r\n | buf[pos + 3] << 24) >>> 0;\r\n}\r\n\r\nfunction readUintBE(buf, pos) {\r\n return (buf[pos ] << 24\r\n | buf[pos + 1] << 16\r\n | buf[pos + 2] << 8\r\n | buf[pos + 3]) >>> 0;\r\n}\r\n", "\"use strict\";\r\nmodule.exports = inquire;\r\n\r\n/**\r\n * Requires a module only if available.\r\n * @memberof util\r\n * @param {string} moduleName Module to require\r\n * @returns {?Object} Required module if available and not empty, otherwise `null`\r\n */\r\nfunction inquire(moduleName) {\r\n try {\r\n var mod = eval(\"quire\".replace(/^/,\"re\"))(moduleName); // eslint-disable-line no-eval\r\n if (mod && (mod.length || Object.keys(mod).length))\r\n return mod;\r\n } catch (e) {} // eslint-disable-line no-empty\r\n return null;\r\n}\r\n", "\"use strict\";\r\n\r\n/**\r\n * A minimal UTF8 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar utf8 = exports;\r\n\r\n/**\r\n * Calculates the UTF8 byte length of a string.\r\n * @param {string} string String\r\n * @returns {number} Byte length\r\n */\r\nutf8.length = function utf8_length(string) {\r\n var len = 0,\r\n c = 0;\r\n for (var i = 0; i < string.length; ++i) {\r\n c = string.charCodeAt(i);\r\n if (c < 128)\r\n len += 1;\r\n else if (c < 2048)\r\n len += 2;\r\n else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\r\n ++i;\r\n len += 4;\r\n } else\r\n len += 3;\r\n }\r\n return len;\r\n};\r\n\r\n/**\r\n * Reads UTF8 bytes as a string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} String read\r\n */\r\nutf8.read = function utf8_read(buffer, start, end) {\r\n var len = end - start;\r\n if (len < 1)\r\n return \"\";\r\n var parts = null,\r\n chunk = [],\r\n i = 0, // char offset\r\n t; // temporary\r\n while (start < end) {\r\n t = buffer[start++];\r\n if (t < 128)\r\n chunk[i++] = t;\r\n else if (t > 191 && t < 224)\r\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n else if (t > 239 && t < 365) {\r\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n chunk[i++] = 0xD800 + (t >> 10);\r\n chunk[i++] = 0xDC00 + (t & 1023);\r\n } else\r\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\n/**\r\n * Writes a string as UTF8 bytes.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Bytes written\r\n */\r\nutf8.write = function utf8_write(string, buffer, offset) {\r\n var start = offset,\r\n c1, // character 1\r\n c2; // character 2\r\n for (var i = 0; i < string.length; ++i) {\r\n c1 = string.charCodeAt(i);\r\n if (c1 < 128) {\r\n buffer[offset++] = c1;\r\n } else if (c1 < 2048) {\r\n buffer[offset++] = c1 >> 6 | 192;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\r\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\r\n ++i;\r\n buffer[offset++] = c1 >> 18 | 240;\r\n buffer[offset++] = c1 >> 12 & 63 | 128;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else {\r\n buffer[offset++] = c1 >> 12 | 224;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n }\r\n }\r\n return offset - start;\r\n};\r\n", "\"use strict\";\r\nmodule.exports = pool;\r\n\r\n/**\r\n * An allocator as used by {@link util.pool}.\r\n * @typedef PoolAllocator\r\n * @type {function}\r\n * @param {number} size Buffer size\r\n * @returns {Uint8Array} Buffer\r\n */\r\n\r\n/**\r\n * A slicer as used by {@link util.pool}.\r\n * @typedef PoolSlicer\r\n * @type {function}\r\n * @param {number} start Start offset\r\n * @param {number} end End offset\r\n * @returns {Uint8Array} Buffer slice\r\n * @this {Uint8Array}\r\n */\r\n\r\n/**\r\n * A general purpose buffer pool.\r\n * @memberof util\r\n * @function\r\n * @param {PoolAllocator} alloc Allocator\r\n * @param {PoolSlicer} slice Slicer\r\n * @param {number} [size=8192] Slab size\r\n * @returns {PoolAllocator} Pooled allocator\r\n */\r\nfunction pool(alloc, slice, size) {\r\n var SIZE = size || 8192;\r\n var MAX = SIZE >>> 1;\r\n var slab = null;\r\n var offset = SIZE;\r\n return function pool_alloc(size) {\r\n if (size < 1 || size > MAX)\r\n return alloc(size);\r\n if (offset + size > SIZE) {\r\n slab = alloc(SIZE);\r\n offset = 0;\r\n }\r\n var buf = slice.call(slab, offset, offset += size);\r\n if (offset & 7) // align to 32 bit\r\n offset = (offset | 7) + 1;\r\n return buf;\r\n };\r\n}\r\n", "\"use strict\";\nmodule.exports = LongBits;\n\nvar util = require(\"../util/minimal\");\n\n/**\n * Constructs new long bits.\n * @classdesc Helper class for working with the low and high bits of a 64 bit value.\n * @memberof util\n * @constructor\n * @param {number} lo Low 32 bits, unsigned\n * @param {number} hi High 32 bits, unsigned\n */\nfunction LongBits(lo, hi) {\n\n // note that the casts below are theoretically unnecessary as of today, but older statically\n // generated converter code might still call the ctor with signed 32bits. kept for compat.\n\n /**\n * Low bits.\n * @type {number}\n */\n this.lo = lo >>> 0;\n\n /**\n * High bits.\n * @type {number}\n */\n this.hi = hi >>> 0;\n}\n\n/**\n * Zero bits.\n * @memberof util.LongBits\n * @type {util.LongBits}\n */\nvar zero = LongBits.zero = new LongBits(0, 0);\n\nzero.toNumber = function() { return 0; };\nzero.zzEncode = zero.zzDecode = function() { return this; };\nzero.length = function() { return 1; };\n\n/**\n * Zero hash.\n * @memberof util.LongBits\n * @type {string}\n */\nvar zeroHash = LongBits.zeroHash = \"\\0\\0\\0\\0\\0\\0\\0\\0\";\n\n/**\n * Constructs new long bits from the specified number.\n * @param {number} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.fromNumber = function fromNumber(value) {\n if (value === 0)\n return zero;\n var sign = value < 0;\n if (sign)\n value = -value;\n var lo = value >>> 0,\n hi = (value - lo) / 4294967296 >>> 0;\n if (sign) {\n hi = ~hi >>> 0;\n lo = ~lo >>> 0;\n if (++lo > 4294967295) {\n lo = 0;\n if (++hi > 4294967295)\n hi = 0;\n }\n }\n return new LongBits(lo, hi);\n};\n\n/**\n * Constructs new long bits from a number, long or string.\n * @param {Long|number|string} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.from = function from(value) {\n if (typeof value === \"number\")\n return LongBits.fromNumber(value);\n if (util.isString(value)) {\n /* istanbul ignore else */\n if (util.Long)\n value = util.Long.fromString(value);\n else\n return LongBits.fromNumber(parseInt(value, 10));\n }\n return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero;\n};\n\n/**\n * Converts this long bits to a possibly unsafe JavaScript number.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {number} Possibly unsafe number\n */\nLongBits.prototype.toNumber = function toNumber(unsigned) {\n if (!unsigned && this.hi >>> 31) {\n var lo = ~this.lo + 1 >>> 0,\n hi = ~this.hi >>> 0;\n if (!lo)\n hi = hi + 1 >>> 0;\n return -(lo + hi * 4294967296);\n }\n return this.lo + this.hi * 4294967296;\n};\n\n/**\n * Converts this long bits to a long.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long} Long\n */\nLongBits.prototype.toLong = function toLong(unsigned) {\n return util.Long\n ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned))\n /* istanbul ignore next */\n : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) };\n};\n\nvar charCodeAt = String.prototype.charCodeAt;\n\n/**\n * Constructs new long bits from the specified 8 characters long hash.\n * @param {string} hash Hash\n * @returns {util.LongBits} Bits\n */\nLongBits.fromHash = function fromHash(hash) {\n if (hash === zeroHash)\n return zero;\n return new LongBits(\n ( charCodeAt.call(hash, 0)\n | charCodeAt.call(hash, 1) << 8\n | charCodeAt.call(hash, 2) << 16\n | charCodeAt.call(hash, 3) << 24) >>> 0\n ,\n ( charCodeAt.call(hash, 4)\n | charCodeAt.call(hash, 5) << 8\n | charCodeAt.call(hash, 6) << 16\n | charCodeAt.call(hash, 7) << 24) >>> 0\n );\n};\n\n/**\n * Converts this long bits to a 8 characters long hash.\n * @returns {string} Hash\n */\nLongBits.prototype.toHash = function toHash() {\n return String.fromCharCode(\n this.lo & 255,\n this.lo >>> 8 & 255,\n this.lo >>> 16 & 255,\n this.lo >>> 24 ,\n this.hi & 255,\n this.hi >>> 8 & 255,\n this.hi >>> 16 & 255,\n this.hi >>> 24\n );\n};\n\n/**\n * Zig-zag encodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzEncode = function zzEncode() {\n var mask = this.hi >> 31;\n this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0;\n this.lo = ( this.lo << 1 ^ mask) >>> 0;\n return this;\n};\n\n/**\n * Zig-zag decodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzDecode = function zzDecode() {\n var mask = -(this.lo & 1);\n this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0;\n this.hi = ( this.hi >>> 1 ^ mask) >>> 0;\n return this;\n};\n\n/**\n * Calculates the length of this longbits when encoded as a varint.\n * @returns {number} Length\n */\nLongBits.prototype.length = function length() {\n var part0 = this.lo,\n part1 = (this.lo >>> 28 | this.hi << 4) >>> 0,\n part2 = this.hi >>> 24;\n return part2 === 0\n ? part1 === 0\n ? part0 < 16384\n ? part0 < 128 ? 1 : 2\n : part0 < 2097152 ? 3 : 4\n : part1 < 16384\n ? part1 < 128 ? 5 : 6\n : part1 < 2097152 ? 7 : 8\n : part2 < 128 ? 9 : 10;\n};\n", "\"use strict\";\nvar util = exports;\n\n// used to return a Promise where callback is omitted\nutil.asPromise = require(\"@protobufjs/aspromise\");\n\n// converts to / from base64 encoded strings\nutil.base64 = require(\"@protobufjs/base64\");\n\n// base class of rpc.Service\nutil.EventEmitter = require(\"@protobufjs/eventemitter\");\n\n// float handling accross browsers\nutil.float = require(\"@protobufjs/float\");\n\n// requires modules optionally and hides the call from bundlers\nutil.inquire = require(\"@protobufjs/inquire\");\n\n// converts to / from utf8 encoded strings\nutil.utf8 = require(\"@protobufjs/utf8\");\n\n// provides a node-like buffer pool in the browser\nutil.pool = require(\"@protobufjs/pool\");\n\n// utility to work with the low and high bits of a 64 bit value\nutil.LongBits = require(\"./longbits\");\n\n/**\n * Whether running within node or not.\n * @memberof util\n * @type {boolean}\n */\nutil.isNode = Boolean(typeof global !== \"undefined\"\n && global\n && global.process\n && global.process.versions\n && global.process.versions.node);\n\n/**\n * Global object reference.\n * @memberof util\n * @type {Object}\n */\nutil.global = util.isNode && global\n || typeof window !== \"undefined\" && window\n || typeof self !== \"undefined\" && self\n || this; // eslint-disable-line no-invalid-this\n\n/**\n * An immuable empty array.\n * @memberof util\n * @type {Array.<*>}\n * @const\n */\nutil.emptyArray = Object.freeze ? Object.freeze([]) : /* istanbul ignore next */ []; // used on prototypes\n\n/**\n * An immutable empty object.\n * @type {Object}\n * @const\n */\nutil.emptyObject = Object.freeze ? Object.freeze({}) : /* istanbul ignore next */ {}; // used on prototypes\n\n/**\n * Tests if the specified value is an integer.\n * @function\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is an integer\n */\nutil.isInteger = Number.isInteger || /* istanbul ignore next */ function isInteger(value) {\n return typeof value === \"number\" && isFinite(value) && Math.floor(value) === value;\n};\n\n/**\n * Tests if the specified value is a string.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a string\n */\nutil.isString = function isString(value) {\n return typeof value === \"string\" || value instanceof String;\n};\n\n/**\n * Tests if the specified value is a non-null object.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a non-null object\n */\nutil.isObject = function isObject(value) {\n return value && typeof value === \"object\";\n};\n\n/**\n * Checks if a property on a message is considered to be present.\n * This is an alias of {@link util.isSet}.\n * @function\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isset =\n\n/**\n * Checks if a property on a message is considered to be present.\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isSet = function isSet(obj, prop) {\n var value = obj[prop];\n if (value != null && obj.hasOwnProperty(prop)) // eslint-disable-line eqeqeq, no-prototype-builtins\n return typeof value !== \"object\" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0;\n return false;\n};\n\n/**\n * Any compatible Buffer instance.\n * This is a minimal stand-alone definition of a Buffer instance. The actual type is that exported by node's typings.\n * @interface Buffer\n * @extends Uint8Array\n */\n\n/**\n * Node's Buffer class if available.\n * @type {Constructor}\n */\nutil.Buffer = (function() {\n try {\n var Buffer = util.inquire(\"buffer\").Buffer;\n // refuse to use non-node buffers if not explicitly assigned (perf reasons):\n return Buffer.prototype.utf8Write ? Buffer : /* istanbul ignore next */ null;\n } catch (e) {\n /* istanbul ignore next */\n return null;\n }\n})();\n\n// Internal alias of or polyfull for Buffer.from.\nutil._Buffer_from = null;\n\n// Internal alias of or polyfill for Buffer.allocUnsafe.\nutil._Buffer_allocUnsafe = null;\n\n/**\n * Creates a new buffer of whatever type supported by the environment.\n * @param {number|number[]} [sizeOrArray=0] Buffer size or number array\n * @returns {Uint8Array|Buffer} Buffer\n */\nutil.newBuffer = function newBuffer(sizeOrArray) {\n /* istanbul ignore next */\n return typeof sizeOrArray === \"number\"\n ? util.Buffer\n ? util._Buffer_allocUnsafe(sizeOrArray)\n : new util.Array(sizeOrArray)\n : util.Buffer\n ? util._Buffer_from(sizeOrArray)\n : typeof Uint8Array === \"undefined\"\n ? sizeOrArray\n : new Uint8Array(sizeOrArray);\n};\n\n/**\n * Array implementation used in the browser. `Uint8Array` if supported, otherwise `Array`.\n * @type {Constructor}\n */\nutil.Array = typeof Uint8Array !== \"undefined\" ? Uint8Array /* istanbul ignore next */ : Array;\n\n/**\n * Any compatible Long instance.\n * This is a minimal stand-alone definition of a Long instance. The actual type is that exported by long.js.\n * @interface Long\n * @property {number} low Low bits\n * @property {number} high High bits\n * @property {boolean} unsigned Whether unsigned or not\n */\n\n/**\n * Long.js's Long class if available.\n * @type {Constructor}\n */\nutil.Long = /* istanbul ignore next */ util.global.dcodeIO && /* istanbul ignore next */ util.global.dcodeIO.Long\n || /* istanbul ignore next */ util.global.Long\n || util.inquire(\"long\");\n\n/**\n * Regular expression used to verify 2 bit (`bool`) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key2Re = /^true|false|0|1$/;\n\n/**\n * Regular expression used to verify 32 bit (`int32` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key32Re = /^-?(?:0|[1-9][0-9]*)$/;\n\n/**\n * Regular expression used to verify 64 bit (`int64` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key64Re = /^(?:[\\\\x00-\\\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;\n\n/**\n * Converts a number or long to an 8 characters long hash string.\n * @param {Long|number} value Value to convert\n * @returns {string} Hash\n */\nutil.longToHash = function longToHash(value) {\n return value\n ? util.LongBits.from(value).toHash()\n : util.LongBits.zeroHash;\n};\n\n/**\n * Converts an 8 characters long hash string to a long or number.\n * @param {string} hash Hash\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long|number} Original value\n */\nutil.longFromHash = function longFromHash(hash, unsigned) {\n var bits = util.LongBits.fromHash(hash);\n if (util.Long)\n return util.Long.fromBits(bits.lo, bits.hi, unsigned);\n return bits.toNumber(Boolean(unsigned));\n};\n\n/**\n * Merges the properties of the source object into the destination object.\n * @memberof util\n * @param {Object.} dst Destination object\n * @param {Object.} src Source object\n * @param {boolean} [ifNotSet=false] Merges only if the key is not already set\n * @returns {Object.} Destination object\n */\nfunction merge(dst, src, ifNotSet) { // used by converters\n for (var keys = Object.keys(src), i = 0; i < keys.length; ++i)\n if (dst[keys[i]] === undefined || !ifNotSet)\n dst[keys[i]] = src[keys[i]];\n return dst;\n}\n\nutil.merge = merge;\n\n/**\n * Converts the first character of a string to lower case.\n * @param {string} str String to convert\n * @returns {string} Converted string\n */\nutil.lcFirst = function lcFirst(str) {\n return str.charAt(0).toLowerCase() + str.substring(1);\n};\n\n/**\n * Creates a custom error constructor.\n * @memberof util\n * @param {string} name Error name\n * @returns {Constructor} Custom error constructor\n */\nfunction newError(name) {\n\n function CustomError(message, properties) {\n\n if (!(this instanceof CustomError))\n return new CustomError(message, properties);\n\n // Error.call(this, message);\n // ^ just returns a new error instance because the ctor can be called as a function\n\n Object.defineProperty(this, \"message\", { get: function() { return message; } });\n\n /* istanbul ignore next */\n if (Error.captureStackTrace) // node\n Error.captureStackTrace(this, CustomError);\n else\n Object.defineProperty(this, \"stack\", { value: new Error().stack || \"\" });\n\n if (properties)\n merge(this, properties);\n }\n\n CustomError.prototype = Object.create(Error.prototype, {\n constructor: {\n value: CustomError,\n writable: true,\n enumerable: false,\n configurable: true,\n },\n name: {\n get: function get() { return name; },\n set: undefined,\n enumerable: false,\n // configurable: false would accurately preserve the behavior of\n // the original, but I'm guessing that was not intentional.\n // For an actual error subclass, this property would\n // be configurable.\n configurable: true,\n },\n toString: {\n value: function value() { return this.name + \": \" + this.message; },\n writable: true,\n enumerable: false,\n configurable: true,\n },\n });\n\n return CustomError;\n}\n\nutil.newError = newError;\n\n/**\n * Constructs a new protocol error.\n * @classdesc Error subclass indicating a protocol specifc error.\n * @memberof util\n * @extends Error\n * @template T extends Message\n * @constructor\n * @param {string} message Error message\n * @param {Object.} [properties] Additional properties\n * @example\n * try {\n * MyMessage.decode(someBuffer); // throws if required fields are missing\n * } catch (e) {\n * if (e instanceof ProtocolError && e.instance)\n * console.log(\"decoded so far: \" + JSON.stringify(e.instance));\n * }\n */\nutil.ProtocolError = newError(\"ProtocolError\");\n\n/**\n * So far decoded message instance.\n * @name util.ProtocolError#instance\n * @type {Message}\n */\n\n/**\n * A OneOf getter as returned by {@link util.oneOfGetter}.\n * @typedef OneOfGetter\n * @type {function}\n * @returns {string|undefined} Set field name, if any\n */\n\n/**\n * Builds a getter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfGetter} Unbound getter\n */\nutil.oneOfGetter = function getOneOf(fieldNames) {\n var fieldMap = {};\n for (var i = 0; i < fieldNames.length; ++i)\n fieldMap[fieldNames[i]] = 1;\n\n /**\n * @returns {string|undefined} Set field name, if any\n * @this Object\n * @ignore\n */\n return function() { // eslint-disable-line consistent-return\n for (var keys = Object.keys(this), i = keys.length - 1; i > -1; --i)\n if (fieldMap[keys[i]] === 1 && this[keys[i]] !== undefined && this[keys[i]] !== null)\n return keys[i];\n };\n};\n\n/**\n * A OneOf setter as returned by {@link util.oneOfSetter}.\n * @typedef OneOfSetter\n * @type {function}\n * @param {string|undefined} value Field name\n * @returns {undefined}\n */\n\n/**\n * Builds a setter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfSetter} Unbound setter\n */\nutil.oneOfSetter = function setOneOf(fieldNames) {\n\n /**\n * @param {string} name Field name\n * @returns {undefined}\n * @this Object\n * @ignore\n */\n return function(name) {\n for (var i = 0; i < fieldNames.length; ++i)\n if (fieldNames[i] !== name)\n delete this[fieldNames[i]];\n };\n};\n\n/**\n * Default conversion options used for {@link Message#toJSON} implementations.\n *\n * These options are close to proto3's JSON mapping with the exception that internal types like Any are handled just like messages. More precisely:\n *\n * - Longs become strings\n * - Enums become string keys\n * - Bytes become base64 encoded strings\n * - (Sub-)Messages become plain objects\n * - Maps become plain objects with all string keys\n * - Repeated fields become arrays\n * - NaN and Infinity for float and double fields become strings\n *\n * @type {IConversionOptions}\n * @see https://developers.google.com/protocol-buffers/docs/proto3?hl=en#json\n */\nutil.toJSONOptions = {\n longs: String,\n enums: String,\n bytes: String,\n json: true\n};\n\n// Sets up buffer utility according to the environment (called in index-minimal)\nutil._configure = function() {\n var Buffer = util.Buffer;\n /* istanbul ignore if */\n if (!Buffer) {\n util._Buffer_from = util._Buffer_allocUnsafe = null;\n return;\n }\n // because node 4.x buffers are incompatible & immutable\n // see: https://github.com/dcodeIO/protobuf.js/pull/665\n util._Buffer_from = Buffer.from !== Uint8Array.from && Buffer.from ||\n /* istanbul ignore next */\n function Buffer_from(value, encoding) {\n return new Buffer(value, encoding);\n };\n util._Buffer_allocUnsafe = Buffer.allocUnsafe ||\n /* istanbul ignore next */\n function Buffer_allocUnsafe(size) {\n return new Buffer(size);\n };\n};\n", "\"use strict\";\nmodule.exports = Writer;\n\nvar util = require(\"./util/minimal\");\n\nvar BufferWriter; // cyclic\n\nvar LongBits = util.LongBits,\n base64 = util.base64,\n utf8 = util.utf8;\n\n/**\n * Constructs a new writer operation instance.\n * @classdesc Scheduled writer operation.\n * @constructor\n * @param {function(*, Uint8Array, number)} fn Function to call\n * @param {number} len Value byte length\n * @param {*} val Value to write\n * @ignore\n */\nfunction Op(fn, len, val) {\n\n /**\n * Function to call.\n * @type {function(Uint8Array, number, *)}\n */\n this.fn = fn;\n\n /**\n * Value byte length.\n * @type {number}\n */\n this.len = len;\n\n /**\n * Next operation.\n * @type {Writer.Op|undefined}\n */\n this.next = undefined;\n\n /**\n * Value to write.\n * @type {*}\n */\n this.val = val; // type varies\n}\n\n/* istanbul ignore next */\nfunction noop() {} // eslint-disable-line no-empty-function\n\n/**\n * Constructs a new writer state instance.\n * @classdesc Copied writer state.\n * @memberof Writer\n * @constructor\n * @param {Writer} writer Writer to copy state from\n * @ignore\n */\nfunction State(writer) {\n\n /**\n * Current head.\n * @type {Writer.Op}\n */\n this.head = writer.head;\n\n /**\n * Current tail.\n * @type {Writer.Op}\n */\n this.tail = writer.tail;\n\n /**\n * Current buffer length.\n * @type {number}\n */\n this.len = writer.len;\n\n /**\n * Next state.\n * @type {State|null}\n */\n this.next = writer.states;\n}\n\n/**\n * Constructs a new writer instance.\n * @classdesc Wire format writer using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n */\nfunction Writer() {\n\n /**\n * Current length.\n * @type {number}\n */\n this.len = 0;\n\n /**\n * Operations head.\n * @type {Object}\n */\n this.head = new Op(noop, 0, 0);\n\n /**\n * Operations tail\n * @type {Object}\n */\n this.tail = this.head;\n\n /**\n * Linked forked states.\n * @type {Object|null}\n */\n this.states = null;\n\n // When a value is written, the writer calculates its byte length and puts it into a linked\n // list of operations to perform when finish() is called. This both allows us to allocate\n // buffers of the exact required size and reduces the amount of work we have to do compared\n // to first calculating over objects and then encoding over objects. In our case, the encoding\n // part is just a linked list walk calling operations with already prepared values.\n}\n\nvar create = function create() {\n return util.Buffer\n ? function create_buffer_setup() {\n return (Writer.create = function create_buffer() {\n return new BufferWriter();\n })();\n }\n /* istanbul ignore next */\n : function create_array() {\n return new Writer();\n };\n};\n\n/**\n * Creates a new writer.\n * @function\n * @returns {BufferWriter|Writer} A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer}\n */\nWriter.create = create();\n\n/**\n * Allocates a buffer of the specified size.\n * @param {number} size Buffer size\n * @returns {Uint8Array} Buffer\n */\nWriter.alloc = function alloc(size) {\n return new util.Array(size);\n};\n\n// Use Uint8Array buffer pool in the browser, just like node does with buffers\n/* istanbul ignore else */\nif (util.Array !== Array)\n Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray);\n\n/**\n * Pushes a new operation to the queue.\n * @param {function(Uint8Array, number, *)} fn Function to call\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @returns {Writer} `this`\n * @private\n */\nWriter.prototype._push = function push(fn, len, val) {\n this.tail = this.tail.next = new Op(fn, len, val);\n this.len += len;\n return this;\n};\n\nfunction writeByte(val, buf, pos) {\n buf[pos] = val & 255;\n}\n\nfunction writeVarint32(val, buf, pos) {\n while (val > 127) {\n buf[pos++] = val & 127 | 128;\n val >>>= 7;\n }\n buf[pos] = val;\n}\n\n/**\n * Constructs a new varint writer operation instance.\n * @classdesc Scheduled varint writer operation.\n * @extends Op\n * @constructor\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @ignore\n */\nfunction VarintOp(len, val) {\n this.len = len;\n this.next = undefined;\n this.val = val;\n}\n\nVarintOp.prototype = Object.create(Op.prototype);\nVarintOp.prototype.fn = writeVarint32;\n\n/**\n * Writes an unsigned 32 bit value as a varint.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.uint32 = function write_uint32(value) {\n // here, the call to this.push has been inlined and a varint specific Op subclass is used.\n // uint32 is by far the most frequently used operation and benefits significantly from this.\n this.len += (this.tail = this.tail.next = new VarintOp(\n (value = value >>> 0)\n < 128 ? 1\n : value < 16384 ? 2\n : value < 2097152 ? 3\n : value < 268435456 ? 4\n : 5,\n value)).len;\n return this;\n};\n\n/**\n * Writes a signed 32 bit value as a varint.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.int32 = function write_int32(value) {\n return value < 0\n ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) // 10 bytes per spec\n : this.uint32(value);\n};\n\n/**\n * Writes a 32 bit value as a varint, zig-zag encoded.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sint32 = function write_sint32(value) {\n return this.uint32((value << 1 ^ value >> 31) >>> 0);\n};\n\nfunction writeVarint64(val, buf, pos) {\n while (val.hi) {\n buf[pos++] = val.lo & 127 | 128;\n val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0;\n val.hi >>>= 7;\n }\n while (val.lo > 127) {\n buf[pos++] = val.lo & 127 | 128;\n val.lo = val.lo >>> 7;\n }\n buf[pos++] = val.lo;\n}\n\n/**\n * Writes an unsigned 64 bit value as a varint.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.uint64 = function write_uint64(value) {\n var bits = LongBits.from(value);\n return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a signed 64 bit value as a varint.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.int64 = Writer.prototype.uint64;\n\n/**\n * Writes a signed 64 bit value as a varint, zig-zag encoded.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sint64 = function write_sint64(value) {\n var bits = LongBits.from(value).zzEncode();\n return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a boolish value as a varint.\n * @param {boolean} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bool = function write_bool(value) {\n return this._push(writeByte, 1, value ? 1 : 0);\n};\n\nfunction writeFixed32(val, buf, pos) {\n buf[pos ] = val & 255;\n buf[pos + 1] = val >>> 8 & 255;\n buf[pos + 2] = val >>> 16 & 255;\n buf[pos + 3] = val >>> 24;\n}\n\n/**\n * Writes an unsigned 32 bit value as fixed 32 bits.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.fixed32 = function write_fixed32(value) {\n return this._push(writeFixed32, 4, value >>> 0);\n};\n\n/**\n * Writes a signed 32 bit value as fixed 32 bits.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sfixed32 = Writer.prototype.fixed32;\n\n/**\n * Writes an unsigned 64 bit value as fixed 64 bits.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.fixed64 = function write_fixed64(value) {\n var bits = LongBits.from(value);\n return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi);\n};\n\n/**\n * Writes a signed 64 bit value as fixed 64 bits.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sfixed64 = Writer.prototype.fixed64;\n\n/**\n * Writes a float (32 bit).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.float = function write_float(value) {\n return this._push(util.float.writeFloatLE, 4, value);\n};\n\n/**\n * Writes a double (64 bit float).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.double = function write_double(value) {\n return this._push(util.float.writeDoubleLE, 8, value);\n};\n\nvar writeBytes = util.Array.prototype.set\n ? function writeBytes_set(val, buf, pos) {\n buf.set(val, pos); // also works for plain array values\n }\n /* istanbul ignore next */\n : function writeBytes_for(val, buf, pos) {\n for (var i = 0; i < val.length; ++i)\n buf[pos + i] = val[i];\n };\n\n/**\n * Writes a sequence of bytes.\n * @param {Uint8Array|string} value Buffer or base64 encoded string to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bytes = function write_bytes(value) {\n var len = value.length >>> 0;\n if (!len)\n return this._push(writeByte, 1, 0);\n if (util.isString(value)) {\n var buf = Writer.alloc(len = base64.length(value));\n base64.decode(value, buf, 0);\n value = buf;\n }\n return this.uint32(len)._push(writeBytes, len, value);\n};\n\n/**\n * Writes a string.\n * @param {string} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.string = function write_string(value) {\n var len = utf8.length(value);\n return len\n ? this.uint32(len)._push(utf8.write, len, value)\n : this._push(writeByte, 1, 0);\n};\n\n/**\n * Forks this writer's state by pushing it to a stack.\n * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state.\n * @returns {Writer} `this`\n */\nWriter.prototype.fork = function fork() {\n this.states = new State(this);\n this.head = this.tail = new Op(noop, 0, 0);\n this.len = 0;\n return this;\n};\n\n/**\n * Resets this instance to the last state.\n * @returns {Writer} `this`\n */\nWriter.prototype.reset = function reset() {\n if (this.states) {\n this.head = this.states.head;\n this.tail = this.states.tail;\n this.len = this.states.len;\n this.states = this.states.next;\n } else {\n this.head = this.tail = new Op(noop, 0, 0);\n this.len = 0;\n }\n return this;\n};\n\n/**\n * Resets to the last state and appends the fork state's current write length as a varint followed by its operations.\n * @returns {Writer} `this`\n */\nWriter.prototype.ldelim = function ldelim() {\n var head = this.head,\n tail = this.tail,\n len = this.len;\n this.reset().uint32(len);\n if (len) {\n this.tail.next = head.next; // skip noop\n this.tail = tail;\n this.len += len;\n }\n return this;\n};\n\n/**\n * Finishes the write operation.\n * @returns {Uint8Array} Finished buffer\n */\nWriter.prototype.finish = function finish() {\n var head = this.head.next, // skip noop\n buf = this.constructor.alloc(this.len),\n pos = 0;\n while (head) {\n head.fn(head.val, buf, pos);\n pos += head.len;\n head = head.next;\n }\n // this.head = this.tail = null;\n return buf;\n};\n\nWriter._configure = function(BufferWriter_) {\n BufferWriter = BufferWriter_;\n Writer.create = create();\n BufferWriter._configure();\n};\n", "\"use strict\";\nmodule.exports = BufferWriter;\n\n// extends Writer\nvar Writer = require(\"./writer\");\n(BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter;\n\nvar util = require(\"./util/minimal\");\n\n/**\n * Constructs a new buffer writer instance.\n * @classdesc Wire format writer using node buffers.\n * @extends Writer\n * @constructor\n */\nfunction BufferWriter() {\n Writer.call(this);\n}\n\nBufferWriter._configure = function () {\n /**\n * Allocates a buffer of the specified size.\n * @function\n * @param {number} size Buffer size\n * @returns {Buffer} Buffer\n */\n BufferWriter.alloc = util._Buffer_allocUnsafe;\n\n BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === \"set\"\n ? function writeBytesBuffer_set(val, buf, pos) {\n buf.set(val, pos); // faster than copy (requires node >= 4 where Buffers extend Uint8Array and set is properly inherited)\n // also works for plain array values\n }\n /* istanbul ignore next */\n : function writeBytesBuffer_copy(val, buf, pos) {\n if (val.copy) // Buffer values\n val.copy(buf, pos, 0, val.length);\n else for (var i = 0; i < val.length;) // plain array values\n buf[pos++] = val[i++];\n };\n};\n\n\n/**\n * @override\n */\nBufferWriter.prototype.bytes = function write_bytes_buffer(value) {\n if (util.isString(value))\n value = util._Buffer_from(value, \"base64\");\n var len = value.length >>> 0;\n this.uint32(len);\n if (len)\n this._push(BufferWriter.writeBytesBuffer, len, value);\n return this;\n};\n\nfunction writeStringBuffer(val, buf, pos) {\n if (val.length < 40) // plain js is faster for short strings (probably due to redundant assertions)\n util.utf8.write(val, buf, pos);\n else if (buf.utf8Write)\n buf.utf8Write(val, pos);\n else\n buf.write(val, pos);\n}\n\n/**\n * @override\n */\nBufferWriter.prototype.string = function write_string_buffer(value) {\n var len = util.Buffer.byteLength(value);\n this.uint32(len);\n if (len)\n this._push(writeStringBuffer, len, value);\n return this;\n};\n\n\n/**\n * Finishes the write operation.\n * @name BufferWriter#finish\n * @function\n * @returns {Buffer} Finished buffer\n */\n\nBufferWriter._configure();\n", "\"use strict\";\nmodule.exports = Reader;\n\nvar util = require(\"./util/minimal\");\n\nvar BufferReader; // cyclic\n\nvar LongBits = util.LongBits,\n utf8 = util.utf8;\n\n/* istanbul ignore next */\nfunction indexOutOfRange(reader, writeLength) {\n return RangeError(\"index out of range: \" + reader.pos + \" + \" + (writeLength || 1) + \" > \" + reader.len);\n}\n\n/**\n * Constructs a new reader instance using the specified buffer.\n * @classdesc Wire format reader using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n * @param {Uint8Array} buffer Buffer to read from\n */\nfunction Reader(buffer) {\n\n /**\n * Read buffer.\n * @type {Uint8Array}\n */\n this.buf = buffer;\n\n /**\n * Read buffer position.\n * @type {number}\n */\n this.pos = 0;\n\n /**\n * Read buffer length.\n * @type {number}\n */\n this.len = buffer.length;\n}\n\nvar create_array = typeof Uint8Array !== \"undefined\"\n ? function create_typed_array(buffer) {\n if (buffer instanceof Uint8Array || Array.isArray(buffer))\n return new Reader(buffer);\n throw Error(\"illegal buffer\");\n }\n /* istanbul ignore next */\n : function create_array(buffer) {\n if (Array.isArray(buffer))\n return new Reader(buffer);\n throw Error(\"illegal buffer\");\n };\n\nvar create = function create() {\n return util.Buffer\n ? function create_buffer_setup(buffer) {\n return (Reader.create = function create_buffer(buffer) {\n return util.Buffer.isBuffer(buffer)\n ? new BufferReader(buffer)\n /* istanbul ignore next */\n : create_array(buffer);\n })(buffer);\n }\n /* istanbul ignore next */\n : create_array;\n};\n\n/**\n * Creates a new reader using the specified buffer.\n * @function\n * @param {Uint8Array|Buffer} buffer Buffer to read from\n * @returns {Reader|BufferReader} A {@link BufferReader} if `buffer` is a Buffer, otherwise a {@link Reader}\n * @throws {Error} If `buffer` is not a valid buffer\n */\nReader.create = create();\n\nReader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */ util.Array.prototype.slice;\n\n/**\n * Reads a varint as an unsigned 32 bit value.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.uint32 = (function read_uint32_setup() {\n var value = 4294967295; // optimizer type-hint, tends to deopt otherwise (?!)\n return function read_uint32() {\n value = ( this.buf[this.pos] & 127 ) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 7) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 15) << 28) >>> 0; if (this.buf[this.pos++] < 128) return value;\n\n /* istanbul ignore if */\n if ((this.pos += 5) > this.len) {\n this.pos = this.len;\n throw indexOutOfRange(this, 10);\n }\n return value;\n };\n})();\n\n/**\n * Reads a varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.int32 = function read_int32() {\n return this.uint32() | 0;\n};\n\n/**\n * Reads a zig-zag encoded varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.sint32 = function read_sint32() {\n var value = this.uint32();\n return value >>> 1 ^ -(value & 1) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readLongVarint() {\n // tends to deopt with local vars for octet etc.\n var bits = new LongBits(0, 0);\n var i = 0;\n if (this.len - this.pos > 4) { // fast route (lo)\n for (; i < 4; ++i) {\n // 1st..4th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n // 5th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0;\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) >> 4) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n i = 0;\n } else {\n for (; i < 3; ++i) {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n // 1st..3th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n // 4th\n bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0;\n return bits;\n }\n if (this.len - this.pos > 4) { // fast route (hi)\n for (; i < 5; ++i) {\n // 6th..10th\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n } else {\n for (; i < 5; ++i) {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n // 6th..10th\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n }\n /* istanbul ignore next */\n throw Error(\"invalid varint encoding\");\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads a varint as a signed 64 bit value.\n * @name Reader#int64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as an unsigned 64 bit value.\n * @name Reader#uint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a zig-zag encoded varint as a signed 64 bit value.\n * @name Reader#sint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as a boolean.\n * @returns {boolean} Value read\n */\nReader.prototype.bool = function read_bool() {\n return this.uint32() !== 0;\n};\n\nfunction readFixed32_end(buf, end) { // note that this uses `end`, not `pos`\n return (buf[end - 4]\n | buf[end - 3] << 8\n | buf[end - 2] << 16\n | buf[end - 1] << 24) >>> 0;\n}\n\n/**\n * Reads fixed 32 bits as an unsigned 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.fixed32 = function read_fixed32() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n return readFixed32_end(this.buf, this.pos += 4);\n};\n\n/**\n * Reads fixed 32 bits as a signed 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.sfixed32 = function read_sfixed32() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n return readFixed32_end(this.buf, this.pos += 4) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readFixed64(/* this: Reader */) {\n\n /* istanbul ignore if */\n if (this.pos + 8 > this.len)\n throw indexOutOfRange(this, 8);\n\n return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4));\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads fixed 64 bits.\n * @name Reader#fixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads zig-zag encoded fixed 64 bits.\n * @name Reader#sfixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a float (32 bit) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.float = function read_float() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n var value = util.float.readFloatLE(this.buf, this.pos);\n this.pos += 4;\n return value;\n};\n\n/**\n * Reads a double (64 bit float) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.double = function read_double() {\n\n /* istanbul ignore if */\n if (this.pos + 8 > this.len)\n throw indexOutOfRange(this, 4);\n\n var value = util.float.readDoubleLE(this.buf, this.pos);\n this.pos += 8;\n return value;\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @returns {Uint8Array} Value read\n */\nReader.prototype.bytes = function read_bytes() {\n var length = this.uint32(),\n start = this.pos,\n end = this.pos + length;\n\n /* istanbul ignore if */\n if (end > this.len)\n throw indexOutOfRange(this, length);\n\n this.pos += length;\n if (Array.isArray(this.buf)) // plain array\n return this.buf.slice(start, end);\n\n if (start === end) { // fix for IE 10/Win8 and others' subarray returning array of size 1\n var nativeBuffer = util.Buffer;\n return nativeBuffer\n ? nativeBuffer.alloc(0)\n : new this.buf.constructor(0);\n }\n return this._slice.call(this.buf, start, end);\n};\n\n/**\n * Reads a string preceeded by its byte length as a varint.\n * @returns {string} Value read\n */\nReader.prototype.string = function read_string() {\n var bytes = this.bytes();\n return utf8.read(bytes, 0, bytes.length);\n};\n\n/**\n * Skips the specified number of bytes if specified, otherwise skips a varint.\n * @param {number} [length] Length if known, otherwise a varint is assumed\n * @returns {Reader} `this`\n */\nReader.prototype.skip = function skip(length) {\n if (typeof length === \"number\") {\n /* istanbul ignore if */\n if (this.pos + length > this.len)\n throw indexOutOfRange(this, length);\n this.pos += length;\n } else {\n do {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n } while (this.buf[this.pos++] & 128);\n }\n return this;\n};\n\n/**\n * Skips the next element of the specified wire type.\n * @param {number} wireType Wire type received\n * @returns {Reader} `this`\n */\nReader.prototype.skipType = function(wireType) {\n switch (wireType) {\n case 0:\n this.skip();\n break;\n case 1:\n this.skip(8);\n break;\n case 2:\n this.skip(this.uint32());\n break;\n case 3:\n while ((wireType = this.uint32() & 7) !== 4) {\n this.skipType(wireType);\n }\n break;\n case 5:\n this.skip(4);\n break;\n\n /* istanbul ignore next */\n default:\n throw Error(\"invalid wire type \" + wireType + \" at offset \" + this.pos);\n }\n return this;\n};\n\nReader._configure = function(BufferReader_) {\n BufferReader = BufferReader_;\n Reader.create = create();\n BufferReader._configure();\n\n var fn = util.Long ? \"toLong\" : /* istanbul ignore next */ \"toNumber\";\n util.merge(Reader.prototype, {\n\n int64: function read_int64() {\n return readLongVarint.call(this)[fn](false);\n },\n\n uint64: function read_uint64() {\n return readLongVarint.call(this)[fn](true);\n },\n\n sint64: function read_sint64() {\n return readLongVarint.call(this).zzDecode()[fn](false);\n },\n\n fixed64: function read_fixed64() {\n return readFixed64.call(this)[fn](true);\n },\n\n sfixed64: function read_sfixed64() {\n return readFixed64.call(this)[fn](false);\n }\n\n });\n};\n", "\"use strict\";\nmodule.exports = BufferReader;\n\n// extends Reader\nvar Reader = require(\"./reader\");\n(BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader;\n\nvar util = require(\"./util/minimal\");\n\n/**\n * Constructs a new buffer reader instance.\n * @classdesc Wire format reader using node buffers.\n * @extends Reader\n * @constructor\n * @param {Buffer} buffer Buffer to read from\n */\nfunction BufferReader(buffer) {\n Reader.call(this, buffer);\n\n /**\n * Read buffer.\n * @name BufferReader#buf\n * @type {Buffer}\n */\n}\n\nBufferReader._configure = function () {\n /* istanbul ignore else */\n if (util.Buffer)\n BufferReader.prototype._slice = util.Buffer.prototype.slice;\n};\n\n\n/**\n * @override\n */\nBufferReader.prototype.string = function read_string_buffer() {\n var len = this.uint32(); // modifies pos\n return this.buf.utf8Slice\n ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len))\n : this.buf.toString(\"utf-8\", this.pos, this.pos = Math.min(this.pos + len, this.len));\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @name BufferReader#bytes\n * @function\n * @returns {Buffer} Value read\n */\n\nBufferReader._configure();\n", "\"use strict\";\nmodule.exports = Service;\n\nvar util = require(\"../util/minimal\");\n\n// Extends EventEmitter\n(Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service;\n\n/**\n * A service method callback as used by {@link rpc.ServiceMethod|ServiceMethod}.\n *\n * Differs from {@link RPCImplCallback} in that it is an actual callback of a service method which may not return `response = null`.\n * @typedef rpc.ServiceMethodCallback\n * @template TRes extends Message\n * @type {function}\n * @param {Error|null} error Error, if any\n * @param {TRes} [response] Response message\n * @returns {undefined}\n */\n\n/**\n * A service method part of a {@link rpc.Service} as created by {@link Service.create}.\n * @typedef rpc.ServiceMethod\n * @template TReq extends Message\n * @template TRes extends Message\n * @type {function}\n * @param {TReq|Properties} request Request message or plain object\n * @param {rpc.ServiceMethodCallback} [callback] Node-style callback called with the error, if any, and the response message\n * @returns {Promise>} Promise if `callback` has been omitted, otherwise `undefined`\n */\n\n/**\n * Constructs a new RPC service instance.\n * @classdesc An RPC service as returned by {@link Service#create}.\n * @exports rpc.Service\n * @extends util.EventEmitter\n * @constructor\n * @param {RPCImpl} rpcImpl RPC implementation\n * @param {boolean} [requestDelimited=false] Whether requests are length-delimited\n * @param {boolean} [responseDelimited=false] Whether responses are length-delimited\n */\nfunction Service(rpcImpl, requestDelimited, responseDelimited) {\n\n if (typeof rpcImpl !== \"function\")\n throw TypeError(\"rpcImpl must be a function\");\n\n util.EventEmitter.call(this);\n\n /**\n * RPC implementation. Becomes `null` once the service is ended.\n * @type {RPCImpl|null}\n */\n this.rpcImpl = rpcImpl;\n\n /**\n * Whether requests are length-delimited.\n * @type {boolean}\n */\n this.requestDelimited = Boolean(requestDelimited);\n\n /**\n * Whether responses are length-delimited.\n * @type {boolean}\n */\n this.responseDelimited = Boolean(responseDelimited);\n}\n\n/**\n * Calls a service method through {@link rpc.Service#rpcImpl|rpcImpl}.\n * @param {Method|rpc.ServiceMethod} method Reflected or static method\n * @param {Constructor} requestCtor Request constructor\n * @param {Constructor} responseCtor Response constructor\n * @param {TReq|Properties} request Request message or plain object\n * @param {rpc.ServiceMethodCallback} callback Service callback\n * @returns {undefined}\n * @template TReq extends Message\n * @template TRes extends Message\n */\nService.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) {\n\n if (!request)\n throw TypeError(\"request must be specified\");\n\n var self = this;\n if (!callback)\n return util.asPromise(rpcCall, self, method, requestCtor, responseCtor, request);\n\n if (!self.rpcImpl) {\n setTimeout(function() { callback(Error(\"already ended\")); }, 0);\n return undefined;\n }\n\n try {\n return self.rpcImpl(\n method,\n requestCtor[self.requestDelimited ? \"encodeDelimited\" : \"encode\"](request).finish(),\n function rpcCallback(err, response) {\n\n if (err) {\n self.emit(\"error\", err, method);\n return callback(err);\n }\n\n if (response === null) {\n self.end(/* endedByRPC */ true);\n return undefined;\n }\n\n if (!(response instanceof responseCtor)) {\n try {\n response = responseCtor[self.responseDelimited ? \"decodeDelimited\" : \"decode\"](response);\n } catch (err) {\n self.emit(\"error\", err, method);\n return callback(err);\n }\n }\n\n self.emit(\"data\", response, method);\n return callback(null, response);\n }\n );\n } catch (err) {\n self.emit(\"error\", err, method);\n setTimeout(function() { callback(err); }, 0);\n return undefined;\n }\n};\n\n/**\n * Ends this service and emits the `end` event.\n * @param {boolean} [endedByRPC=false] Whether the service has been ended by the RPC implementation.\n * @returns {rpc.Service} `this`\n */\nService.prototype.end = function end(endedByRPC) {\n if (this.rpcImpl) {\n if (!endedByRPC) // signal end to rpcImpl\n this.rpcImpl(null, null, null);\n this.rpcImpl = null;\n this.emit(\"end\").off();\n }\n return this;\n};\n", "\"use strict\";\n\n/**\n * Streaming RPC helpers.\n * @namespace\n */\nvar rpc = exports;\n\n/**\n * RPC implementation passed to {@link Service#create} performing a service request on network level, i.e. by utilizing http requests or websockets.\n * @typedef RPCImpl\n * @type {function}\n * @param {Method|rpc.ServiceMethod,Message<{}>>} method Reflected or static method being called\n * @param {Uint8Array} requestData Request data\n * @param {RPCImplCallback} callback Callback function\n * @returns {undefined}\n * @example\n * function rpcImpl(method, requestData, callback) {\n * if (protobuf.util.lcFirst(method.name) !== \"myMethod\") // compatible with static code\n * throw Error(\"no such method\");\n * asynchronouslyObtainAResponse(requestData, function(err, responseData) {\n * callback(err, responseData);\n * });\n * }\n */\n\n/**\n * Node-style callback as used by {@link RPCImpl}.\n * @typedef RPCImplCallback\n * @type {function}\n * @param {Error|null} error Error, if any, otherwise `null`\n * @param {Uint8Array|null} [response] Response data or `null` to signal end of stream, if there hasn't been an error\n * @returns {undefined}\n */\n\nrpc.Service = require(\"./rpc/service\");\n", "\"use strict\";\nmodule.exports = {};\n\n/**\n * Named roots.\n * This is where pbjs stores generated structures (the option `-r, --root` specifies a name).\n * Can also be used manually to make roots available across modules.\n * @name roots\n * @type {Object.}\n * @example\n * // pbjs -r myroot -o compiled.js ...\n *\n * // in another module:\n * require(\"./compiled.js\");\n *\n * // in any subsequent module:\n * var root = protobuf.roots[\"myroot\"];\n */\n", "\"use strict\";\nvar protobuf = exports;\n\n/**\n * Build type, one of `\"full\"`, `\"light\"` or `\"minimal\"`.\n * @name build\n * @type {string}\n * @const\n */\nprotobuf.build = \"minimal\";\n\n// Serialization\nprotobuf.Writer = require(\"./writer\");\nprotobuf.BufferWriter = require(\"./writer_buffer\");\nprotobuf.Reader = require(\"./reader\");\nprotobuf.BufferReader = require(\"./reader_buffer\");\n\n// Utility\nprotobuf.util = require(\"./util/minimal\");\nprotobuf.rpc = require(\"./rpc\");\nprotobuf.roots = require(\"./roots\");\nprotobuf.configure = configure;\n\n/* istanbul ignore next */\n/**\n * Reconfigures the library according to the environment.\n * @returns {undefined}\n */\nfunction configure() {\n protobuf.util._configure();\n protobuf.Writer._configure(protobuf.BufferWriter);\n protobuf.Reader._configure(protobuf.BufferReader);\n}\n\n// Set up buffer utility according to the environment\nconfigure();\n", "// minimal library entry point.\n\n\"use strict\";\nmodule.exports = require(\"./src/index-minimal\");\n", "/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/\n\"use strict\";\n\nvar $protobuf = require(\"protobufjs/minimal\");\n\n// Common aliases\nvar $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;\n\n// Exported root namespace\nvar $root = $protobuf.roots[\"default\"] || ($protobuf.roots[\"default\"] = {});\n\n$root.onnx = (function() {\n\n /**\n * Namespace onnx.\n * @exports onnx\n * @namespace\n */\n var onnx = {};\n\n /**\n * Version enum.\n * @name onnx.Version\n * @enum {number}\n * @property {number} _START_VERSION=0 _START_VERSION value\n * @property {number} IR_VERSION_2017_10_10=1 IR_VERSION_2017_10_10 value\n * @property {number} IR_VERSION_2017_10_30=2 IR_VERSION_2017_10_30 value\n * @property {number} IR_VERSION_2017_11_3=3 IR_VERSION_2017_11_3 value\n * @property {number} IR_VERSION_2019_1_22=4 IR_VERSION_2019_1_22 value\n * @property {number} IR_VERSION_2019_3_18=5 IR_VERSION_2019_3_18 value\n * @property {number} IR_VERSION_2019_9_19=6 IR_VERSION_2019_9_19 value\n * @property {number} IR_VERSION_2020_5_8=7 IR_VERSION_2020_5_8 value\n * @property {number} IR_VERSION_2021_7_30=8 IR_VERSION_2021_7_30 value\n * @property {number} IR_VERSION=9 IR_VERSION value\n */\n onnx.Version = (function() {\n var valuesById = {}, values = Object.create(valuesById);\n values[valuesById[0] = \"_START_VERSION\"] = 0;\n values[valuesById[1] = \"IR_VERSION_2017_10_10\"] = 1;\n values[valuesById[2] = \"IR_VERSION_2017_10_30\"] = 2;\n values[valuesById[3] = \"IR_VERSION_2017_11_3\"] = 3;\n values[valuesById[4] = \"IR_VERSION_2019_1_22\"] = 4;\n values[valuesById[5] = \"IR_VERSION_2019_3_18\"] = 5;\n values[valuesById[6] = \"IR_VERSION_2019_9_19\"] = 6;\n values[valuesById[7] = \"IR_VERSION_2020_5_8\"] = 7;\n values[valuesById[8] = \"IR_VERSION_2021_7_30\"] = 8;\n values[valuesById[9] = \"IR_VERSION\"] = 9;\n return values;\n })();\n\n onnx.AttributeProto = (function() {\n\n /**\n * Properties of an AttributeProto.\n * @memberof onnx\n * @interface IAttributeProto\n * @property {string|null} [name] AttributeProto name\n * @property {string|null} [refAttrName] AttributeProto refAttrName\n * @property {string|null} [docString] AttributeProto docString\n * @property {onnx.AttributeProto.AttributeType|null} [type] AttributeProto type\n * @property {number|null} [f] AttributeProto f\n * @property {number|Long|null} [i] AttributeProto i\n * @property {Uint8Array|null} [s] AttributeProto s\n * @property {onnx.ITensorProto|null} [t] AttributeProto t\n * @property {onnx.IGraphProto|null} [g] AttributeProto g\n * @property {onnx.ISparseTensorProto|null} [sparseTensor] AttributeProto sparseTensor\n * @property {onnx.ITypeProto|null} [tp] AttributeProto tp\n * @property {Array.|null} [floats] AttributeProto floats\n * @property {Array.|null} [ints] AttributeProto ints\n * @property {Array.|null} [strings] AttributeProto strings\n * @property {Array.|null} [tensors] AttributeProto tensors\n * @property {Array.|null} [graphs] AttributeProto graphs\n * @property {Array.|null} [sparseTensors] AttributeProto sparseTensors\n * @property {Array.|null} [typeProtos] AttributeProto typeProtos\n */\n\n /**\n * Constructs a new AttributeProto.\n * @memberof onnx\n * @classdesc Represents an AttributeProto.\n * @implements IAttributeProto\n * @constructor\n * @param {onnx.IAttributeProto=} [properties] Properties to set\n */\n function AttributeProto(properties) {\n this.floats = [];\n this.ints = [];\n this.strings = [];\n this.tensors = [];\n this.graphs = [];\n this.sparseTensors = [];\n this.typeProtos = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * AttributeProto name.\n * @member {string} name\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.name = \"\";\n\n /**\n * AttributeProto refAttrName.\n * @member {string} refAttrName\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.refAttrName = \"\";\n\n /**\n * AttributeProto docString.\n * @member {string} docString\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.docString = \"\";\n\n /**\n * AttributeProto type.\n * @member {onnx.AttributeProto.AttributeType} type\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.type = 0;\n\n /**\n * AttributeProto f.\n * @member {number} f\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.f = 0;\n\n /**\n * AttributeProto i.\n * @member {number|Long} i\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.i = $util.Long ? $util.Long.fromBits(0,0,false) : 0;\n\n /**\n * AttributeProto s.\n * @member {Uint8Array} s\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.s = $util.newBuffer([]);\n\n /**\n * AttributeProto t.\n * @member {onnx.ITensorProto|null|undefined} t\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.t = null;\n\n /**\n * AttributeProto g.\n * @member {onnx.IGraphProto|null|undefined} g\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.g = null;\n\n /**\n * AttributeProto sparseTensor.\n * @member {onnx.ISparseTensorProto|null|undefined} sparseTensor\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.sparseTensor = null;\n\n /**\n * AttributeProto tp.\n * @member {onnx.ITypeProto|null|undefined} tp\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.tp = null;\n\n /**\n * AttributeProto floats.\n * @member {Array.} floats\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.floats = $util.emptyArray;\n\n /**\n * AttributeProto ints.\n * @member {Array.} ints\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.ints = $util.emptyArray;\n\n /**\n * AttributeProto strings.\n * @member {Array.} strings\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.strings = $util.emptyArray;\n\n /**\n * AttributeProto tensors.\n * @member {Array.} tensors\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.tensors = $util.emptyArray;\n\n /**\n * AttributeProto graphs.\n * @member {Array.} graphs\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.graphs = $util.emptyArray;\n\n /**\n * AttributeProto sparseTensors.\n * @member {Array.} sparseTensors\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.sparseTensors = $util.emptyArray;\n\n /**\n * AttributeProto typeProtos.\n * @member {Array.} typeProtos\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.typeProtos = $util.emptyArray;\n\n /**\n * Creates a new AttributeProto instance using the specified properties.\n * @function create\n * @memberof onnx.AttributeProto\n * @static\n * @param {onnx.IAttributeProto=} [properties] Properties to set\n * @returns {onnx.AttributeProto} AttributeProto instance\n */\n AttributeProto.create = function create(properties) {\n return new AttributeProto(properties);\n };\n\n /**\n * Encodes the specified AttributeProto message. Does not implicitly {@link onnx.AttributeProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.AttributeProto\n * @static\n * @param {onnx.IAttributeProto} message AttributeProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n AttributeProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);\n if (message.f != null && Object.hasOwnProperty.call(message, \"f\"))\n writer.uint32(/* id 2, wireType 5 =*/21).float(message.f);\n if (message.i != null && Object.hasOwnProperty.call(message, \"i\"))\n writer.uint32(/* id 3, wireType 0 =*/24).int64(message.i);\n if (message.s != null && Object.hasOwnProperty.call(message, \"s\"))\n writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.s);\n if (message.t != null && Object.hasOwnProperty.call(message, \"t\"))\n $root.onnx.TensorProto.encode(message.t, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\n if (message.g != null && Object.hasOwnProperty.call(message, \"g\"))\n $root.onnx.GraphProto.encode(message.g, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();\n if (message.floats != null && message.floats.length) {\n writer.uint32(/* id 7, wireType 2 =*/58).fork();\n for (var i = 0; i < message.floats.length; ++i)\n writer.float(message.floats[i]);\n writer.ldelim();\n }\n if (message.ints != null && message.ints.length) {\n writer.uint32(/* id 8, wireType 2 =*/66).fork();\n for (var i = 0; i < message.ints.length; ++i)\n writer.int64(message.ints[i]);\n writer.ldelim();\n }\n if (message.strings != null && message.strings.length)\n for (var i = 0; i < message.strings.length; ++i)\n writer.uint32(/* id 9, wireType 2 =*/74).bytes(message.strings[i]);\n if (message.tensors != null && message.tensors.length)\n for (var i = 0; i < message.tensors.length; ++i)\n $root.onnx.TensorProto.encode(message.tensors[i], writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();\n if (message.graphs != null && message.graphs.length)\n for (var i = 0; i < message.graphs.length; ++i)\n $root.onnx.GraphProto.encode(message.graphs[i], writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();\n if (message.docString != null && Object.hasOwnProperty.call(message, \"docString\"))\n writer.uint32(/* id 13, wireType 2 =*/106).string(message.docString);\n if (message.tp != null && Object.hasOwnProperty.call(message, \"tp\"))\n $root.onnx.TypeProto.encode(message.tp, writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim();\n if (message.typeProtos != null && message.typeProtos.length)\n for (var i = 0; i < message.typeProtos.length; ++i)\n $root.onnx.TypeProto.encode(message.typeProtos[i], writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim();\n if (message.type != null && Object.hasOwnProperty.call(message, \"type\"))\n writer.uint32(/* id 20, wireType 0 =*/160).int32(message.type);\n if (message.refAttrName != null && Object.hasOwnProperty.call(message, \"refAttrName\"))\n writer.uint32(/* id 21, wireType 2 =*/170).string(message.refAttrName);\n if (message.sparseTensor != null && Object.hasOwnProperty.call(message, \"sparseTensor\"))\n $root.onnx.SparseTensorProto.encode(message.sparseTensor, writer.uint32(/* id 22, wireType 2 =*/178).fork()).ldelim();\n if (message.sparseTensors != null && message.sparseTensors.length)\n for (var i = 0; i < message.sparseTensors.length; ++i)\n $root.onnx.SparseTensorProto.encode(message.sparseTensors[i], writer.uint32(/* id 23, wireType 2 =*/186).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified AttributeProto message, length delimited. Does not implicitly {@link onnx.AttributeProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.AttributeProto\n * @static\n * @param {onnx.IAttributeProto} message AttributeProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n AttributeProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes an AttributeProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.AttributeProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.AttributeProto} AttributeProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n AttributeProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.AttributeProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.name = reader.string();\n break;\n }\n case 21: {\n message.refAttrName = reader.string();\n break;\n }\n case 13: {\n message.docString = reader.string();\n break;\n }\n case 20: {\n message.type = reader.int32();\n break;\n }\n case 2: {\n message.f = reader.float();\n break;\n }\n case 3: {\n message.i = reader.int64();\n break;\n }\n case 4: {\n message.s = reader.bytes();\n break;\n }\n case 5: {\n message.t = $root.onnx.TensorProto.decode(reader, reader.uint32());\n break;\n }\n case 6: {\n message.g = $root.onnx.GraphProto.decode(reader, reader.uint32());\n break;\n }\n case 22: {\n message.sparseTensor = $root.onnx.SparseTensorProto.decode(reader, reader.uint32());\n break;\n }\n case 14: {\n message.tp = $root.onnx.TypeProto.decode(reader, reader.uint32());\n break;\n }\n case 7: {\n if (!(message.floats && message.floats.length))\n message.floats = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.floats.push(reader.float());\n } else\n message.floats.push(reader.float());\n break;\n }\n case 8: {\n if (!(message.ints && message.ints.length))\n message.ints = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.ints.push(reader.int64());\n } else\n message.ints.push(reader.int64());\n break;\n }\n case 9: {\n if (!(message.strings && message.strings.length))\n message.strings = [];\n message.strings.push(reader.bytes());\n break;\n }\n case 10: {\n if (!(message.tensors && message.tensors.length))\n message.tensors = [];\n message.tensors.push($root.onnx.TensorProto.decode(reader, reader.uint32()));\n break;\n }\n case 11: {\n if (!(message.graphs && message.graphs.length))\n message.graphs = [];\n message.graphs.push($root.onnx.GraphProto.decode(reader, reader.uint32()));\n break;\n }\n case 23: {\n if (!(message.sparseTensors && message.sparseTensors.length))\n message.sparseTensors = [];\n message.sparseTensors.push($root.onnx.SparseTensorProto.decode(reader, reader.uint32()));\n break;\n }\n case 15: {\n if (!(message.typeProtos && message.typeProtos.length))\n message.typeProtos = [];\n message.typeProtos.push($root.onnx.TypeProto.decode(reader, reader.uint32()));\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes an AttributeProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.AttributeProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.AttributeProto} AttributeProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n AttributeProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies an AttributeProto message.\n * @function verify\n * @memberof onnx.AttributeProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n AttributeProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.name != null && message.hasOwnProperty(\"name\"))\n if (!$util.isString(message.name))\n return \"name: string expected\";\n if (message.refAttrName != null && message.hasOwnProperty(\"refAttrName\"))\n if (!$util.isString(message.refAttrName))\n return \"refAttrName: string expected\";\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n if (!$util.isString(message.docString))\n return \"docString: string expected\";\n if (message.type != null && message.hasOwnProperty(\"type\"))\n switch (message.type) {\n default:\n return \"type: enum value expected\";\n case 0:\n case 1:\n case 2:\n case 3:\n case 4:\n case 5:\n case 11:\n case 13:\n case 6:\n case 7:\n case 8:\n case 9:\n case 10:\n case 12:\n case 14:\n break;\n }\n if (message.f != null && message.hasOwnProperty(\"f\"))\n if (typeof message.f !== \"number\")\n return \"f: number expected\";\n if (message.i != null && message.hasOwnProperty(\"i\"))\n if (!$util.isInteger(message.i) && !(message.i && $util.isInteger(message.i.low) && $util.isInteger(message.i.high)))\n return \"i: integer|Long expected\";\n if (message.s != null && message.hasOwnProperty(\"s\"))\n if (!(message.s && typeof message.s.length === \"number\" || $util.isString(message.s)))\n return \"s: buffer expected\";\n if (message.t != null && message.hasOwnProperty(\"t\")) {\n var error = $root.onnx.TensorProto.verify(message.t);\n if (error)\n return \"t.\" + error;\n }\n if (message.g != null && message.hasOwnProperty(\"g\")) {\n var error = $root.onnx.GraphProto.verify(message.g);\n if (error)\n return \"g.\" + error;\n }\n if (message.sparseTensor != null && message.hasOwnProperty(\"sparseTensor\")) {\n var error = $root.onnx.SparseTensorProto.verify(message.sparseTensor);\n if (error)\n return \"sparseTensor.\" + error;\n }\n if (message.tp != null && message.hasOwnProperty(\"tp\")) {\n var error = $root.onnx.TypeProto.verify(message.tp);\n if (error)\n return \"tp.\" + error;\n }\n if (message.floats != null && message.hasOwnProperty(\"floats\")) {\n if (!Array.isArray(message.floats))\n return \"floats: array expected\";\n for (var i = 0; i < message.floats.length; ++i)\n if (typeof message.floats[i] !== \"number\")\n return \"floats: number[] expected\";\n }\n if (message.ints != null && message.hasOwnProperty(\"ints\")) {\n if (!Array.isArray(message.ints))\n return \"ints: array expected\";\n for (var i = 0; i < message.ints.length; ++i)\n if (!$util.isInteger(message.ints[i]) && !(message.ints[i] && $util.isInteger(message.ints[i].low) && $util.isInteger(message.ints[i].high)))\n return \"ints: integer|Long[] expected\";\n }\n if (message.strings != null && message.hasOwnProperty(\"strings\")) {\n if (!Array.isArray(message.strings))\n return \"strings: array expected\";\n for (var i = 0; i < message.strings.length; ++i)\n if (!(message.strings[i] && typeof message.strings[i].length === \"number\" || $util.isString(message.strings[i])))\n return \"strings: buffer[] expected\";\n }\n if (message.tensors != null && message.hasOwnProperty(\"tensors\")) {\n if (!Array.isArray(message.tensors))\n return \"tensors: array expected\";\n for (var i = 0; i < message.tensors.length; ++i) {\n var error = $root.onnx.TensorProto.verify(message.tensors[i]);\n if (error)\n return \"tensors.\" + error;\n }\n }\n if (message.graphs != null && message.hasOwnProperty(\"graphs\")) {\n if (!Array.isArray(message.graphs))\n return \"graphs: array expected\";\n for (var i = 0; i < message.graphs.length; ++i) {\n var error = $root.onnx.GraphProto.verify(message.graphs[i]);\n if (error)\n return \"graphs.\" + error;\n }\n }\n if (message.sparseTensors != null && message.hasOwnProperty(\"sparseTensors\")) {\n if (!Array.isArray(message.sparseTensors))\n return \"sparseTensors: array expected\";\n for (var i = 0; i < message.sparseTensors.length; ++i) {\n var error = $root.onnx.SparseTensorProto.verify(message.sparseTensors[i]);\n if (error)\n return \"sparseTensors.\" + error;\n }\n }\n if (message.typeProtos != null && message.hasOwnProperty(\"typeProtos\")) {\n if (!Array.isArray(message.typeProtos))\n return \"typeProtos: array expected\";\n for (var i = 0; i < message.typeProtos.length; ++i) {\n var error = $root.onnx.TypeProto.verify(message.typeProtos[i]);\n if (error)\n return \"typeProtos.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates an AttributeProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.AttributeProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.AttributeProto} AttributeProto\n */\n AttributeProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.AttributeProto)\n return object;\n var message = new $root.onnx.AttributeProto();\n if (object.name != null)\n message.name = String(object.name);\n if (object.refAttrName != null)\n message.refAttrName = String(object.refAttrName);\n if (object.docString != null)\n message.docString = String(object.docString);\n switch (object.type) {\n default:\n if (typeof object.type === \"number\") {\n message.type = object.type;\n break;\n }\n break;\n case \"UNDEFINED\":\n case 0:\n message.type = 0;\n break;\n case \"FLOAT\":\n case 1:\n message.type = 1;\n break;\n case \"INT\":\n case 2:\n message.type = 2;\n break;\n case \"STRING\":\n case 3:\n message.type = 3;\n break;\n case \"TENSOR\":\n case 4:\n message.type = 4;\n break;\n case \"GRAPH\":\n case 5:\n message.type = 5;\n break;\n case \"SPARSE_TENSOR\":\n case 11:\n message.type = 11;\n break;\n case \"TYPE_PROTO\":\n case 13:\n message.type = 13;\n break;\n case \"FLOATS\":\n case 6:\n message.type = 6;\n break;\n case \"INTS\":\n case 7:\n message.type = 7;\n break;\n case \"STRINGS\":\n case 8:\n message.type = 8;\n break;\n case \"TENSORS\":\n case 9:\n message.type = 9;\n break;\n case \"GRAPHS\":\n case 10:\n message.type = 10;\n break;\n case \"SPARSE_TENSORS\":\n case 12:\n message.type = 12;\n break;\n case \"TYPE_PROTOS\":\n case 14:\n message.type = 14;\n break;\n }\n if (object.f != null)\n message.f = Number(object.f);\n if (object.i != null)\n if ($util.Long)\n (message.i = $util.Long.fromValue(object.i)).unsigned = false;\n else if (typeof object.i === \"string\")\n message.i = parseInt(object.i, 10);\n else if (typeof object.i === \"number\")\n message.i = object.i;\n else if (typeof object.i === \"object\")\n message.i = new $util.LongBits(object.i.low >>> 0, object.i.high >>> 0).toNumber();\n if (object.s != null)\n if (typeof object.s === \"string\")\n $util.base64.decode(object.s, message.s = $util.newBuffer($util.base64.length(object.s)), 0);\n else if (object.s.length >= 0)\n message.s = object.s;\n if (object.t != null) {\n if (typeof object.t !== \"object\")\n throw TypeError(\".onnx.AttributeProto.t: object expected\");\n message.t = $root.onnx.TensorProto.fromObject(object.t);\n }\n if (object.g != null) {\n if (typeof object.g !== \"object\")\n throw TypeError(\".onnx.AttributeProto.g: object expected\");\n message.g = $root.onnx.GraphProto.fromObject(object.g);\n }\n if (object.sparseTensor != null) {\n if (typeof object.sparseTensor !== \"object\")\n throw TypeError(\".onnx.AttributeProto.sparseTensor: object expected\");\n message.sparseTensor = $root.onnx.SparseTensorProto.fromObject(object.sparseTensor);\n }\n if (object.tp != null) {\n if (typeof object.tp !== \"object\")\n throw TypeError(\".onnx.AttributeProto.tp: object expected\");\n message.tp = $root.onnx.TypeProto.fromObject(object.tp);\n }\n if (object.floats) {\n if (!Array.isArray(object.floats))\n throw TypeError(\".onnx.AttributeProto.floats: array expected\");\n message.floats = [];\n for (var i = 0; i < object.floats.length; ++i)\n message.floats[i] = Number(object.floats[i]);\n }\n if (object.ints) {\n if (!Array.isArray(object.ints))\n throw TypeError(\".onnx.AttributeProto.ints: array expected\");\n message.ints = [];\n for (var i = 0; i < object.ints.length; ++i)\n if ($util.Long)\n (message.ints[i] = $util.Long.fromValue(object.ints[i])).unsigned = false;\n else if (typeof object.ints[i] === \"string\")\n message.ints[i] = parseInt(object.ints[i], 10);\n else if (typeof object.ints[i] === \"number\")\n message.ints[i] = object.ints[i];\n else if (typeof object.ints[i] === \"object\")\n message.ints[i] = new $util.LongBits(object.ints[i].low >>> 0, object.ints[i].high >>> 0).toNumber();\n }\n if (object.strings) {\n if (!Array.isArray(object.strings))\n throw TypeError(\".onnx.AttributeProto.strings: array expected\");\n message.strings = [];\n for (var i = 0; i < object.strings.length; ++i)\n if (typeof object.strings[i] === \"string\")\n $util.base64.decode(object.strings[i], message.strings[i] = $util.newBuffer($util.base64.length(object.strings[i])), 0);\n else if (object.strings[i].length >= 0)\n message.strings[i] = object.strings[i];\n }\n if (object.tensors) {\n if (!Array.isArray(object.tensors))\n throw TypeError(\".onnx.AttributeProto.tensors: array expected\");\n message.tensors = [];\n for (var i = 0; i < object.tensors.length; ++i) {\n if (typeof object.tensors[i] !== \"object\")\n throw TypeError(\".onnx.AttributeProto.tensors: object expected\");\n message.tensors[i] = $root.onnx.TensorProto.fromObject(object.tensors[i]);\n }\n }\n if (object.graphs) {\n if (!Array.isArray(object.graphs))\n throw TypeError(\".onnx.AttributeProto.graphs: array expected\");\n message.graphs = [];\n for (var i = 0; i < object.graphs.length; ++i) {\n if (typeof object.graphs[i] !== \"object\")\n throw TypeError(\".onnx.AttributeProto.graphs: object expected\");\n message.graphs[i] = $root.onnx.GraphProto.fromObject(object.graphs[i]);\n }\n }\n if (object.sparseTensors) {\n if (!Array.isArray(object.sparseTensors))\n throw TypeError(\".onnx.AttributeProto.sparseTensors: array expected\");\n message.sparseTensors = [];\n for (var i = 0; i < object.sparseTensors.length; ++i) {\n if (typeof object.sparseTensors[i] !== \"object\")\n throw TypeError(\".onnx.AttributeProto.sparseTensors: object expected\");\n message.sparseTensors[i] = $root.onnx.SparseTensorProto.fromObject(object.sparseTensors[i]);\n }\n }\n if (object.typeProtos) {\n if (!Array.isArray(object.typeProtos))\n throw TypeError(\".onnx.AttributeProto.typeProtos: array expected\");\n message.typeProtos = [];\n for (var i = 0; i < object.typeProtos.length; ++i) {\n if (typeof object.typeProtos[i] !== \"object\")\n throw TypeError(\".onnx.AttributeProto.typeProtos: object expected\");\n message.typeProtos[i] = $root.onnx.TypeProto.fromObject(object.typeProtos[i]);\n }\n }\n return message;\n };\n\n /**\n * Creates a plain object from an AttributeProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.AttributeProto\n * @static\n * @param {onnx.AttributeProto} message AttributeProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n AttributeProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults) {\n object.floats = [];\n object.ints = [];\n object.strings = [];\n object.tensors = [];\n object.graphs = [];\n object.typeProtos = [];\n object.sparseTensors = [];\n }\n if (options.defaults) {\n object.name = \"\";\n object.f = 0;\n if ($util.Long) {\n var long = new $util.Long(0, 0, false);\n object.i = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.i = options.longs === String ? \"0\" : 0;\n if (options.bytes === String)\n object.s = \"\";\n else {\n object.s = [];\n if (options.bytes !== Array)\n object.s = $util.newBuffer(object.s);\n }\n object.t = null;\n object.g = null;\n object.docString = \"\";\n object.tp = null;\n object.type = options.enums === String ? \"UNDEFINED\" : 0;\n object.refAttrName = \"\";\n object.sparseTensor = null;\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n object.name = message.name;\n if (message.f != null && message.hasOwnProperty(\"f\"))\n object.f = options.json && !isFinite(message.f) ? String(message.f) : message.f;\n if (message.i != null && message.hasOwnProperty(\"i\"))\n if (typeof message.i === \"number\")\n object.i = options.longs === String ? String(message.i) : message.i;\n else\n object.i = options.longs === String ? $util.Long.prototype.toString.call(message.i) : options.longs === Number ? new $util.LongBits(message.i.low >>> 0, message.i.high >>> 0).toNumber() : message.i;\n if (message.s != null && message.hasOwnProperty(\"s\"))\n object.s = options.bytes === String ? $util.base64.encode(message.s, 0, message.s.length) : options.bytes === Array ? Array.prototype.slice.call(message.s) : message.s;\n if (message.t != null && message.hasOwnProperty(\"t\"))\n object.t = $root.onnx.TensorProto.toObject(message.t, options);\n if (message.g != null && message.hasOwnProperty(\"g\"))\n object.g = $root.onnx.GraphProto.toObject(message.g, options);\n if (message.floats && message.floats.length) {\n object.floats = [];\n for (var j = 0; j < message.floats.length; ++j)\n object.floats[j] = options.json && !isFinite(message.floats[j]) ? String(message.floats[j]) : message.floats[j];\n }\n if (message.ints && message.ints.length) {\n object.ints = [];\n for (var j = 0; j < message.ints.length; ++j)\n if (typeof message.ints[j] === \"number\")\n object.ints[j] = options.longs === String ? String(message.ints[j]) : message.ints[j];\n else\n object.ints[j] = options.longs === String ? $util.Long.prototype.toString.call(message.ints[j]) : options.longs === Number ? new $util.LongBits(message.ints[j].low >>> 0, message.ints[j].high >>> 0).toNumber() : message.ints[j];\n }\n if (message.strings && message.strings.length) {\n object.strings = [];\n for (var j = 0; j < message.strings.length; ++j)\n object.strings[j] = options.bytes === String ? $util.base64.encode(message.strings[j], 0, message.strings[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.strings[j]) : message.strings[j];\n }\n if (message.tensors && message.tensors.length) {\n object.tensors = [];\n for (var j = 0; j < message.tensors.length; ++j)\n object.tensors[j] = $root.onnx.TensorProto.toObject(message.tensors[j], options);\n }\n if (message.graphs && message.graphs.length) {\n object.graphs = [];\n for (var j = 0; j < message.graphs.length; ++j)\n object.graphs[j] = $root.onnx.GraphProto.toObject(message.graphs[j], options);\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n object.docString = message.docString;\n if (message.tp != null && message.hasOwnProperty(\"tp\"))\n object.tp = $root.onnx.TypeProto.toObject(message.tp, options);\n if (message.typeProtos && message.typeProtos.length) {\n object.typeProtos = [];\n for (var j = 0; j < message.typeProtos.length; ++j)\n object.typeProtos[j] = $root.onnx.TypeProto.toObject(message.typeProtos[j], options);\n }\n if (message.type != null && message.hasOwnProperty(\"type\"))\n object.type = options.enums === String ? $root.onnx.AttributeProto.AttributeType[message.type] === undefined ? message.type : $root.onnx.AttributeProto.AttributeType[message.type] : message.type;\n if (message.refAttrName != null && message.hasOwnProperty(\"refAttrName\"))\n object.refAttrName = message.refAttrName;\n if (message.sparseTensor != null && message.hasOwnProperty(\"sparseTensor\"))\n object.sparseTensor = $root.onnx.SparseTensorProto.toObject(message.sparseTensor, options);\n if (message.sparseTensors && message.sparseTensors.length) {\n object.sparseTensors = [];\n for (var j = 0; j < message.sparseTensors.length; ++j)\n object.sparseTensors[j] = $root.onnx.SparseTensorProto.toObject(message.sparseTensors[j], options);\n }\n return object;\n };\n\n /**\n * Converts this AttributeProto to JSON.\n * @function toJSON\n * @memberof onnx.AttributeProto\n * @instance\n * @returns {Object.} JSON object\n */\n AttributeProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for AttributeProto\n * @function getTypeUrl\n * @memberof onnx.AttributeProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n AttributeProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.AttributeProto\";\n };\n\n /**\n * AttributeType enum.\n * @name onnx.AttributeProto.AttributeType\n * @enum {number}\n * @property {number} UNDEFINED=0 UNDEFINED value\n * @property {number} FLOAT=1 FLOAT value\n * @property {number} INT=2 INT value\n * @property {number} STRING=3 STRING value\n * @property {number} TENSOR=4 TENSOR value\n * @property {number} GRAPH=5 GRAPH value\n * @property {number} SPARSE_TENSOR=11 SPARSE_TENSOR value\n * @property {number} TYPE_PROTO=13 TYPE_PROTO value\n * @property {number} FLOATS=6 FLOATS value\n * @property {number} INTS=7 INTS value\n * @property {number} STRINGS=8 STRINGS value\n * @property {number} TENSORS=9 TENSORS value\n * @property {number} GRAPHS=10 GRAPHS value\n * @property {number} SPARSE_TENSORS=12 SPARSE_TENSORS value\n * @property {number} TYPE_PROTOS=14 TYPE_PROTOS value\n */\n AttributeProto.AttributeType = (function() {\n var valuesById = {}, values = Object.create(valuesById);\n values[valuesById[0] = \"UNDEFINED\"] = 0;\n values[valuesById[1] = \"FLOAT\"] = 1;\n values[valuesById[2] = \"INT\"] = 2;\n values[valuesById[3] = \"STRING\"] = 3;\n values[valuesById[4] = \"TENSOR\"] = 4;\n values[valuesById[5] = \"GRAPH\"] = 5;\n values[valuesById[11] = \"SPARSE_TENSOR\"] = 11;\n values[valuesById[13] = \"TYPE_PROTO\"] = 13;\n values[valuesById[6] = \"FLOATS\"] = 6;\n values[valuesById[7] = \"INTS\"] = 7;\n values[valuesById[8] = \"STRINGS\"] = 8;\n values[valuesById[9] = \"TENSORS\"] = 9;\n values[valuesById[10] = \"GRAPHS\"] = 10;\n values[valuesById[12] = \"SPARSE_TENSORS\"] = 12;\n values[valuesById[14] = \"TYPE_PROTOS\"] = 14;\n return values;\n })();\n\n return AttributeProto;\n })();\n\n onnx.ValueInfoProto = (function() {\n\n /**\n * Properties of a ValueInfoProto.\n * @memberof onnx\n * @interface IValueInfoProto\n * @property {string|null} [name] ValueInfoProto name\n * @property {onnx.ITypeProto|null} [type] ValueInfoProto type\n * @property {string|null} [docString] ValueInfoProto docString\n */\n\n /**\n * Constructs a new ValueInfoProto.\n * @memberof onnx\n * @classdesc Represents a ValueInfoProto.\n * @implements IValueInfoProto\n * @constructor\n * @param {onnx.IValueInfoProto=} [properties] Properties to set\n */\n function ValueInfoProto(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * ValueInfoProto name.\n * @member {string} name\n * @memberof onnx.ValueInfoProto\n * @instance\n */\n ValueInfoProto.prototype.name = \"\";\n\n /**\n * ValueInfoProto type.\n * @member {onnx.ITypeProto|null|undefined} type\n * @memberof onnx.ValueInfoProto\n * @instance\n */\n ValueInfoProto.prototype.type = null;\n\n /**\n * ValueInfoProto docString.\n * @member {string} docString\n * @memberof onnx.ValueInfoProto\n * @instance\n */\n ValueInfoProto.prototype.docString = \"\";\n\n /**\n * Creates a new ValueInfoProto instance using the specified properties.\n * @function create\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {onnx.IValueInfoProto=} [properties] Properties to set\n * @returns {onnx.ValueInfoProto} ValueInfoProto instance\n */\n ValueInfoProto.create = function create(properties) {\n return new ValueInfoProto(properties);\n };\n\n /**\n * Encodes the specified ValueInfoProto message. Does not implicitly {@link onnx.ValueInfoProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {onnx.IValueInfoProto} message ValueInfoProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ValueInfoProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);\n if (message.type != null && Object.hasOwnProperty.call(message, \"type\"))\n $root.onnx.TypeProto.encode(message.type, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\n if (message.docString != null && Object.hasOwnProperty.call(message, \"docString\"))\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.docString);\n return writer;\n };\n\n /**\n * Encodes the specified ValueInfoProto message, length delimited. Does not implicitly {@link onnx.ValueInfoProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {onnx.IValueInfoProto} message ValueInfoProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ValueInfoProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a ValueInfoProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.ValueInfoProto} ValueInfoProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ValueInfoProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.ValueInfoProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.name = reader.string();\n break;\n }\n case 2: {\n message.type = $root.onnx.TypeProto.decode(reader, reader.uint32());\n break;\n }\n case 3: {\n message.docString = reader.string();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a ValueInfoProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.ValueInfoProto} ValueInfoProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ValueInfoProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a ValueInfoProto message.\n * @function verify\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n ValueInfoProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.name != null && message.hasOwnProperty(\"name\"))\n if (!$util.isString(message.name))\n return \"name: string expected\";\n if (message.type != null && message.hasOwnProperty(\"type\")) {\n var error = $root.onnx.TypeProto.verify(message.type);\n if (error)\n return \"type.\" + error;\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n if (!$util.isString(message.docString))\n return \"docString: string expected\";\n return null;\n };\n\n /**\n * Creates a ValueInfoProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.ValueInfoProto} ValueInfoProto\n */\n ValueInfoProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.ValueInfoProto)\n return object;\n var message = new $root.onnx.ValueInfoProto();\n if (object.name != null)\n message.name = String(object.name);\n if (object.type != null) {\n if (typeof object.type !== \"object\")\n throw TypeError(\".onnx.ValueInfoProto.type: object expected\");\n message.type = $root.onnx.TypeProto.fromObject(object.type);\n }\n if (object.docString != null)\n message.docString = String(object.docString);\n return message;\n };\n\n /**\n * Creates a plain object from a ValueInfoProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {onnx.ValueInfoProto} message ValueInfoProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n ValueInfoProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults) {\n object.name = \"\";\n object.type = null;\n object.docString = \"\";\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n object.name = message.name;\n if (message.type != null && message.hasOwnProperty(\"type\"))\n object.type = $root.onnx.TypeProto.toObject(message.type, options);\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n object.docString = message.docString;\n return object;\n };\n\n /**\n * Converts this ValueInfoProto to JSON.\n * @function toJSON\n * @memberof onnx.ValueInfoProto\n * @instance\n * @returns {Object.} JSON object\n */\n ValueInfoProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for ValueInfoProto\n * @function getTypeUrl\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n ValueInfoProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.ValueInfoProto\";\n };\n\n return ValueInfoProto;\n })();\n\n onnx.NodeProto = (function() {\n\n /**\n * Properties of a NodeProto.\n * @memberof onnx\n * @interface INodeProto\n * @property {Array.|null} [input] NodeProto input\n * @property {Array.|null} [output] NodeProto output\n * @property {string|null} [name] NodeProto name\n * @property {string|null} [opType] NodeProto opType\n * @property {string|null} [domain] NodeProto domain\n * @property {Array.|null} [attribute] NodeProto attribute\n * @property {string|null} [docString] NodeProto docString\n */\n\n /**\n * Constructs a new NodeProto.\n * @memberof onnx\n * @classdesc Represents a NodeProto.\n * @implements INodeProto\n * @constructor\n * @param {onnx.INodeProto=} [properties] Properties to set\n */\n function NodeProto(properties) {\n this.input = [];\n this.output = [];\n this.attribute = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * NodeProto input.\n * @member {Array.} input\n * @memberof onnx.NodeProto\n * @instance\n */\n NodeProto.prototype.input = $util.emptyArray;\n\n /**\n * NodeProto output.\n * @member {Array.} output\n * @memberof onnx.NodeProto\n * @instance\n */\n NodeProto.prototype.output = $util.emptyArray;\n\n /**\n * NodeProto name.\n * @member {string} name\n * @memberof onnx.NodeProto\n * @instance\n */\n NodeProto.prototype.name = \"\";\n\n /**\n * NodeProto opType.\n * @member {string} opType\n * @memberof onnx.NodeProto\n * @instance\n */\n NodeProto.prototype.opType = \"\";\n\n /**\n * NodeProto domain.\n * @member {string} domain\n * @memberof onnx.NodeProto\n * @instance\n */\n NodeProto.prototype.domain = \"\";\n\n /**\n * NodeProto attribute.\n * @member {Array.} attribute\n * @memberof onnx.NodeProto\n * @instance\n */\n NodeProto.prototype.attribute = $util.emptyArray;\n\n /**\n * NodeProto docString.\n * @member {string} docString\n * @memberof onnx.NodeProto\n * @instance\n */\n NodeProto.prototype.docString = \"\";\n\n /**\n * Creates a new NodeProto instance using the specified properties.\n * @function create\n * @memberof onnx.NodeProto\n * @static\n * @param {onnx.INodeProto=} [properties] Properties to set\n * @returns {onnx.NodeProto} NodeProto instance\n */\n NodeProto.create = function create(properties) {\n return new NodeProto(properties);\n };\n\n /**\n * Encodes the specified NodeProto message. Does not implicitly {@link onnx.NodeProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.NodeProto\n * @static\n * @param {onnx.INodeProto} message NodeProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n NodeProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.input != null && message.input.length)\n for (var i = 0; i < message.input.length; ++i)\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.input[i]);\n if (message.output != null && message.output.length)\n for (var i = 0; i < message.output.length; ++i)\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.output[i]);\n if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.name);\n if (message.opType != null && Object.hasOwnProperty.call(message, \"opType\"))\n writer.uint32(/* id 4, wireType 2 =*/34).string(message.opType);\n if (message.attribute != null && message.attribute.length)\n for (var i = 0; i < message.attribute.length; ++i)\n $root.onnx.AttributeProto.encode(message.attribute[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\n if (message.docString != null && Object.hasOwnProperty.call(message, \"docString\"))\n writer.uint32(/* id 6, wireType 2 =*/50).string(message.docString);\n if (message.domain != null && Object.hasOwnProperty.call(message, \"domain\"))\n writer.uint32(/* id 7, wireType 2 =*/58).string(message.domain);\n return writer;\n };\n\n /**\n * Encodes the specified NodeProto message, length delimited. Does not implicitly {@link onnx.NodeProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.NodeProto\n * @static\n * @param {onnx.INodeProto} message NodeProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n NodeProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a NodeProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.NodeProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.NodeProto} NodeProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n NodeProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.NodeProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n if (!(message.input && message.input.length))\n message.input = [];\n message.input.push(reader.string());\n break;\n }\n case 2: {\n if (!(message.output && message.output.length))\n message.output = [];\n message.output.push(reader.string());\n break;\n }\n case 3: {\n message.name = reader.string();\n break;\n }\n case 4: {\n message.opType = reader.string();\n break;\n }\n case 7: {\n message.domain = reader.string();\n break;\n }\n case 5: {\n if (!(message.attribute && message.attribute.length))\n message.attribute = [];\n message.attribute.push($root.onnx.AttributeProto.decode(reader, reader.uint32()));\n break;\n }\n case 6: {\n message.docString = reader.string();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a NodeProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.NodeProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.NodeProto} NodeProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n NodeProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a NodeProto message.\n * @function verify\n * @memberof onnx.NodeProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n NodeProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.input != null && message.hasOwnProperty(\"input\")) {\n if (!Array.isArray(message.input))\n return \"input: array expected\";\n for (var i = 0; i < message.input.length; ++i)\n if (!$util.isString(message.input[i]))\n return \"input: string[] expected\";\n }\n if (message.output != null && message.hasOwnProperty(\"output\")) {\n if (!Array.isArray(message.output))\n return \"output: array expected\";\n for (var i = 0; i < message.output.length; ++i)\n if (!$util.isString(message.output[i]))\n return \"output: string[] expected\";\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n if (!$util.isString(message.name))\n return \"name: string expected\";\n if (message.opType != null && message.hasOwnProperty(\"opType\"))\n if (!$util.isString(message.opType))\n return \"opType: string expected\";\n if (message.domain != null && message.hasOwnProperty(\"domain\"))\n if (!$util.isString(message.domain))\n return \"domain: string expected\";\n if (message.attribute != null && message.hasOwnProperty(\"attribute\")) {\n if (!Array.isArray(message.attribute))\n return \"attribute: array expected\";\n for (var i = 0; i < message.attribute.length; ++i) {\n var error = $root.onnx.AttributeProto.verify(message.attribute[i]);\n if (error)\n return \"attribute.\" + error;\n }\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n if (!$util.isString(message.docString))\n return \"docString: string expected\";\n return null;\n };\n\n /**\n * Creates a NodeProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.NodeProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.NodeProto} NodeProto\n */\n NodeProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.NodeProto)\n return object;\n var message = new $root.onnx.NodeProto();\n if (object.input) {\n if (!Array.isArray(object.input))\n throw TypeError(\".onnx.NodeProto.input: array expected\");\n message.input = [];\n for (var i = 0; i < object.input.length; ++i)\n message.input[i] = String(object.input[i]);\n }\n if (object.output) {\n if (!Array.isArray(object.output))\n throw TypeError(\".onnx.NodeProto.output: array expected\");\n message.output = [];\n for (var i = 0; i < object.output.length; ++i)\n message.output[i] = String(object.output[i]);\n }\n if (object.name != null)\n message.name = String(object.name);\n if (object.opType != null)\n message.opType = String(object.opType);\n if (object.domain != null)\n message.domain = String(object.domain);\n if (object.attribute) {\n if (!Array.isArray(object.attribute))\n throw TypeError(\".onnx.NodeProto.attribute: array expected\");\n message.attribute = [];\n for (var i = 0; i < object.attribute.length; ++i) {\n if (typeof object.attribute[i] !== \"object\")\n throw TypeError(\".onnx.NodeProto.attribute: object expected\");\n message.attribute[i] = $root.onnx.AttributeProto.fromObject(object.attribute[i]);\n }\n }\n if (object.docString != null)\n message.docString = String(object.docString);\n return message;\n };\n\n /**\n * Creates a plain object from a NodeProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.NodeProto\n * @static\n * @param {onnx.NodeProto} message NodeProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n NodeProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults) {\n object.input = [];\n object.output = [];\n object.attribute = [];\n }\n if (options.defaults) {\n object.name = \"\";\n object.opType = \"\";\n object.docString = \"\";\n object.domain = \"\";\n }\n if (message.input && message.input.length) {\n object.input = [];\n for (var j = 0; j < message.input.length; ++j)\n object.input[j] = message.input[j];\n }\n if (message.output && message.output.length) {\n object.output = [];\n for (var j = 0; j < message.output.length; ++j)\n object.output[j] = message.output[j];\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n object.name = message.name;\n if (message.opType != null && message.hasOwnProperty(\"opType\"))\n object.opType = message.opType;\n if (message.attribute && message.attribute.length) {\n object.attribute = [];\n for (var j = 0; j < message.attribute.length; ++j)\n object.attribute[j] = $root.onnx.AttributeProto.toObject(message.attribute[j], options);\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n object.docString = message.docString;\n if (message.domain != null && message.hasOwnProperty(\"domain\"))\n object.domain = message.domain;\n return object;\n };\n\n /**\n * Converts this NodeProto to JSON.\n * @function toJSON\n * @memberof onnx.NodeProto\n * @instance\n * @returns {Object.} JSON object\n */\n NodeProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for NodeProto\n * @function getTypeUrl\n * @memberof onnx.NodeProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n NodeProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.NodeProto\";\n };\n\n return NodeProto;\n })();\n\n onnx.TrainingInfoProto = (function() {\n\n /**\n * Properties of a TrainingInfoProto.\n * @memberof onnx\n * @interface ITrainingInfoProto\n * @property {onnx.IGraphProto|null} [initialization] TrainingInfoProto initialization\n * @property {onnx.IGraphProto|null} [algorithm] TrainingInfoProto algorithm\n * @property {Array.|null} [initializationBinding] TrainingInfoProto initializationBinding\n * @property {Array.|null} [updateBinding] TrainingInfoProto updateBinding\n */\n\n /**\n * Constructs a new TrainingInfoProto.\n * @memberof onnx\n * @classdesc Represents a TrainingInfoProto.\n * @implements ITrainingInfoProto\n * @constructor\n * @param {onnx.ITrainingInfoProto=} [properties] Properties to set\n */\n function TrainingInfoProto(properties) {\n this.initializationBinding = [];\n this.updateBinding = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * TrainingInfoProto initialization.\n * @member {onnx.IGraphProto|null|undefined} initialization\n * @memberof onnx.TrainingInfoProto\n * @instance\n */\n TrainingInfoProto.prototype.initialization = null;\n\n /**\n * TrainingInfoProto algorithm.\n * @member {onnx.IGraphProto|null|undefined} algorithm\n * @memberof onnx.TrainingInfoProto\n * @instance\n */\n TrainingInfoProto.prototype.algorithm = null;\n\n /**\n * TrainingInfoProto initializationBinding.\n * @member {Array.} initializationBinding\n * @memberof onnx.TrainingInfoProto\n * @instance\n */\n TrainingInfoProto.prototype.initializationBinding = $util.emptyArray;\n\n /**\n * TrainingInfoProto updateBinding.\n * @member {Array.} updateBinding\n * @memberof onnx.TrainingInfoProto\n * @instance\n */\n TrainingInfoProto.prototype.updateBinding = $util.emptyArray;\n\n /**\n * Creates a new TrainingInfoProto instance using the specified properties.\n * @function create\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {onnx.ITrainingInfoProto=} [properties] Properties to set\n * @returns {onnx.TrainingInfoProto} TrainingInfoProto instance\n */\n TrainingInfoProto.create = function create(properties) {\n return new TrainingInfoProto(properties);\n };\n\n /**\n * Encodes the specified TrainingInfoProto message. Does not implicitly {@link onnx.TrainingInfoProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {onnx.ITrainingInfoProto} message TrainingInfoProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TrainingInfoProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.initialization != null && Object.hasOwnProperty.call(message, \"initialization\"))\n $root.onnx.GraphProto.encode(message.initialization, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n if (message.algorithm != null && Object.hasOwnProperty.call(message, \"algorithm\"))\n $root.onnx.GraphProto.encode(message.algorithm, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\n if (message.initializationBinding != null && message.initializationBinding.length)\n for (var i = 0; i < message.initializationBinding.length; ++i)\n $root.onnx.StringStringEntryProto.encode(message.initializationBinding[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\n if (message.updateBinding != null && message.updateBinding.length)\n for (var i = 0; i < message.updateBinding.length; ++i)\n $root.onnx.StringStringEntryProto.encode(message.updateBinding[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified TrainingInfoProto message, length delimited. Does not implicitly {@link onnx.TrainingInfoProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {onnx.ITrainingInfoProto} message TrainingInfoProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TrainingInfoProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a TrainingInfoProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TrainingInfoProto} TrainingInfoProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TrainingInfoProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TrainingInfoProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.initialization = $root.onnx.GraphProto.decode(reader, reader.uint32());\n break;\n }\n case 2: {\n message.algorithm = $root.onnx.GraphProto.decode(reader, reader.uint32());\n break;\n }\n case 3: {\n if (!(message.initializationBinding && message.initializationBinding.length))\n message.initializationBinding = [];\n message.initializationBinding.push($root.onnx.StringStringEntryProto.decode(reader, reader.uint32()));\n break;\n }\n case 4: {\n if (!(message.updateBinding && message.updateBinding.length))\n message.updateBinding = [];\n message.updateBinding.push($root.onnx.StringStringEntryProto.decode(reader, reader.uint32()));\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a TrainingInfoProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TrainingInfoProto} TrainingInfoProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TrainingInfoProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a TrainingInfoProto message.\n * @function verify\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n TrainingInfoProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.initialization != null && message.hasOwnProperty(\"initialization\")) {\n var error = $root.onnx.GraphProto.verify(message.initialization);\n if (error)\n return \"initialization.\" + error;\n }\n if (message.algorithm != null && message.hasOwnProperty(\"algorithm\")) {\n var error = $root.onnx.GraphProto.verify(message.algorithm);\n if (error)\n return \"algorithm.\" + error;\n }\n if (message.initializationBinding != null && message.hasOwnProperty(\"initializationBinding\")) {\n if (!Array.isArray(message.initializationBinding))\n return \"initializationBinding: array expected\";\n for (var i = 0; i < message.initializationBinding.length; ++i) {\n var error = $root.onnx.StringStringEntryProto.verify(message.initializationBinding[i]);\n if (error)\n return \"initializationBinding.\" + error;\n }\n }\n if (message.updateBinding != null && message.hasOwnProperty(\"updateBinding\")) {\n if (!Array.isArray(message.updateBinding))\n return \"updateBinding: array expected\";\n for (var i = 0; i < message.updateBinding.length; ++i) {\n var error = $root.onnx.StringStringEntryProto.verify(message.updateBinding[i]);\n if (error)\n return \"updateBinding.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates a TrainingInfoProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TrainingInfoProto} TrainingInfoProto\n */\n TrainingInfoProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TrainingInfoProto)\n return object;\n var message = new $root.onnx.TrainingInfoProto();\n if (object.initialization != null) {\n if (typeof object.initialization !== \"object\")\n throw TypeError(\".onnx.TrainingInfoProto.initialization: object expected\");\n message.initialization = $root.onnx.GraphProto.fromObject(object.initialization);\n }\n if (object.algorithm != null) {\n if (typeof object.algorithm !== \"object\")\n throw TypeError(\".onnx.TrainingInfoProto.algorithm: object expected\");\n message.algorithm = $root.onnx.GraphProto.fromObject(object.algorithm);\n }\n if (object.initializationBinding) {\n if (!Array.isArray(object.initializationBinding))\n throw TypeError(\".onnx.TrainingInfoProto.initializationBinding: array expected\");\n message.initializationBinding = [];\n for (var i = 0; i < object.initializationBinding.length; ++i) {\n if (typeof object.initializationBinding[i] !== \"object\")\n throw TypeError(\".onnx.TrainingInfoProto.initializationBinding: object expected\");\n message.initializationBinding[i] = $root.onnx.StringStringEntryProto.fromObject(object.initializationBinding[i]);\n }\n }\n if (object.updateBinding) {\n if (!Array.isArray(object.updateBinding))\n throw TypeError(\".onnx.TrainingInfoProto.updateBinding: array expected\");\n message.updateBinding = [];\n for (var i = 0; i < object.updateBinding.length; ++i) {\n if (typeof object.updateBinding[i] !== \"object\")\n throw TypeError(\".onnx.TrainingInfoProto.updateBinding: object expected\");\n message.updateBinding[i] = $root.onnx.StringStringEntryProto.fromObject(object.updateBinding[i]);\n }\n }\n return message;\n };\n\n /**\n * Creates a plain object from a TrainingInfoProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {onnx.TrainingInfoProto} message TrainingInfoProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n TrainingInfoProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults) {\n object.initializationBinding = [];\n object.updateBinding = [];\n }\n if (options.defaults) {\n object.initialization = null;\n object.algorithm = null;\n }\n if (message.initialization != null && message.hasOwnProperty(\"initialization\"))\n object.initialization = $root.onnx.GraphProto.toObject(message.initialization, options);\n if (message.algorithm != null && message.hasOwnProperty(\"algorithm\"))\n object.algorithm = $root.onnx.GraphProto.toObject(message.algorithm, options);\n if (message.initializationBinding && message.initializationBinding.length) {\n object.initializationBinding = [];\n for (var j = 0; j < message.initializationBinding.length; ++j)\n object.initializationBinding[j] = $root.onnx.StringStringEntryProto.toObject(message.initializationBinding[j], options);\n }\n if (message.updateBinding && message.updateBinding.length) {\n object.updateBinding = [];\n for (var j = 0; j < message.updateBinding.length; ++j)\n object.updateBinding[j] = $root.onnx.StringStringEntryProto.toObject(message.updateBinding[j], options);\n }\n return object;\n };\n\n /**\n * Converts this TrainingInfoProto to JSON.\n * @function toJSON\n * @memberof onnx.TrainingInfoProto\n * @instance\n * @returns {Object.} JSON object\n */\n TrainingInfoProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for TrainingInfoProto\n * @function getTypeUrl\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n TrainingInfoProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TrainingInfoProto\";\n };\n\n return TrainingInfoProto;\n })();\n\n onnx.ModelProto = (function() {\n\n /**\n * Properties of a ModelProto.\n * @memberof onnx\n * @interface IModelProto\n * @property {number|Long|null} [irVersion] ModelProto irVersion\n * @property {Array.|null} [opsetImport] ModelProto opsetImport\n * @property {string|null} [producerName] ModelProto producerName\n * @property {string|null} [producerVersion] ModelProto producerVersion\n * @property {string|null} [domain] ModelProto domain\n * @property {number|Long|null} [modelVersion] ModelProto modelVersion\n * @property {string|null} [docString] ModelProto docString\n * @property {onnx.IGraphProto|null} [graph] ModelProto graph\n * @property {Array.|null} [metadataProps] ModelProto metadataProps\n * @property {Array.|null} [trainingInfo] ModelProto trainingInfo\n * @property {Array.|null} [functions] ModelProto functions\n */\n\n /**\n * Constructs a new ModelProto.\n * @memberof onnx\n * @classdesc Represents a ModelProto.\n * @implements IModelProto\n * @constructor\n * @param {onnx.IModelProto=} [properties] Properties to set\n */\n function ModelProto(properties) {\n this.opsetImport = [];\n this.metadataProps = [];\n this.trainingInfo = [];\n this.functions = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * ModelProto irVersion.\n * @member {number|Long} irVersion\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.irVersion = $util.Long ? $util.Long.fromBits(0,0,false) : 0;\n\n /**\n * ModelProto opsetImport.\n * @member {Array.} opsetImport\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.opsetImport = $util.emptyArray;\n\n /**\n * ModelProto producerName.\n * @member {string} producerName\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.producerName = \"\";\n\n /**\n * ModelProto producerVersion.\n * @member {string} producerVersion\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.producerVersion = \"\";\n\n /**\n * ModelProto domain.\n * @member {string} domain\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.domain = \"\";\n\n /**\n * ModelProto modelVersion.\n * @member {number|Long} modelVersion\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.modelVersion = $util.Long ? $util.Long.fromBits(0,0,false) : 0;\n\n /**\n * ModelProto docString.\n * @member {string} docString\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.docString = \"\";\n\n /**\n * ModelProto graph.\n * @member {onnx.IGraphProto|null|undefined} graph\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.graph = null;\n\n /**\n * ModelProto metadataProps.\n * @member {Array.} metadataProps\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.metadataProps = $util.emptyArray;\n\n /**\n * ModelProto trainingInfo.\n * @member {Array.} trainingInfo\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.trainingInfo = $util.emptyArray;\n\n /**\n * ModelProto functions.\n * @member {Array.} functions\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.functions = $util.emptyArray;\n\n /**\n * Creates a new ModelProto instance using the specified properties.\n * @function create\n * @memberof onnx.ModelProto\n * @static\n * @param {onnx.IModelProto=} [properties] Properties to set\n * @returns {onnx.ModelProto} ModelProto instance\n */\n ModelProto.create = function create(properties) {\n return new ModelProto(properties);\n };\n\n /**\n * Encodes the specified ModelProto message. Does not implicitly {@link onnx.ModelProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.ModelProto\n * @static\n * @param {onnx.IModelProto} message ModelProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ModelProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.irVersion != null && Object.hasOwnProperty.call(message, \"irVersion\"))\n writer.uint32(/* id 1, wireType 0 =*/8).int64(message.irVersion);\n if (message.producerName != null && Object.hasOwnProperty.call(message, \"producerName\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.producerName);\n if (message.producerVersion != null && Object.hasOwnProperty.call(message, \"producerVersion\"))\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.producerVersion);\n if (message.domain != null && Object.hasOwnProperty.call(message, \"domain\"))\n writer.uint32(/* id 4, wireType 2 =*/34).string(message.domain);\n if (message.modelVersion != null && Object.hasOwnProperty.call(message, \"modelVersion\"))\n writer.uint32(/* id 5, wireType 0 =*/40).int64(message.modelVersion);\n if (message.docString != null && Object.hasOwnProperty.call(message, \"docString\"))\n writer.uint32(/* id 6, wireType 2 =*/50).string(message.docString);\n if (message.graph != null && Object.hasOwnProperty.call(message, \"graph\"))\n $root.onnx.GraphProto.encode(message.graph, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();\n if (message.opsetImport != null && message.opsetImport.length)\n for (var i = 0; i < message.opsetImport.length; ++i)\n $root.onnx.OperatorSetIdProto.encode(message.opsetImport[i], writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();\n if (message.metadataProps != null && message.metadataProps.length)\n for (var i = 0; i < message.metadataProps.length; ++i)\n $root.onnx.StringStringEntryProto.encode(message.metadataProps[i], writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim();\n if (message.trainingInfo != null && message.trainingInfo.length)\n for (var i = 0; i < message.trainingInfo.length; ++i)\n $root.onnx.TrainingInfoProto.encode(message.trainingInfo[i], writer.uint32(/* id 20, wireType 2 =*/162).fork()).ldelim();\n if (message.functions != null && message.functions.length)\n for (var i = 0; i < message.functions.length; ++i)\n $root.onnx.FunctionProto.encode(message.functions[i], writer.uint32(/* id 25, wireType 2 =*/202).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified ModelProto message, length delimited. Does not implicitly {@link onnx.ModelProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.ModelProto\n * @static\n * @param {onnx.IModelProto} message ModelProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ModelProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a ModelProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.ModelProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.ModelProto} ModelProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ModelProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.ModelProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.irVersion = reader.int64();\n break;\n }\n case 8: {\n if (!(message.opsetImport && message.opsetImport.length))\n message.opsetImport = [];\n message.opsetImport.push($root.onnx.OperatorSetIdProto.decode(reader, reader.uint32()));\n break;\n }\n case 2: {\n message.producerName = reader.string();\n break;\n }\n case 3: {\n message.producerVersion = reader.string();\n break;\n }\n case 4: {\n message.domain = reader.string();\n break;\n }\n case 5: {\n message.modelVersion = reader.int64();\n break;\n }\n case 6: {\n message.docString = reader.string();\n break;\n }\n case 7: {\n message.graph = $root.onnx.GraphProto.decode(reader, reader.uint32());\n break;\n }\n case 14: {\n if (!(message.metadataProps && message.metadataProps.length))\n message.metadataProps = [];\n message.metadataProps.push($root.onnx.StringStringEntryProto.decode(reader, reader.uint32()));\n break;\n }\n case 20: {\n if (!(message.trainingInfo && message.trainingInfo.length))\n message.trainingInfo = [];\n message.trainingInfo.push($root.onnx.TrainingInfoProto.decode(reader, reader.uint32()));\n break;\n }\n case 25: {\n if (!(message.functions && message.functions.length))\n message.functions = [];\n message.functions.push($root.onnx.FunctionProto.decode(reader, reader.uint32()));\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a ModelProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.ModelProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.ModelProto} ModelProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ModelProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a ModelProto message.\n * @function verify\n * @memberof onnx.ModelProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n ModelProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.irVersion != null && message.hasOwnProperty(\"irVersion\"))\n if (!$util.isInteger(message.irVersion) && !(message.irVersion && $util.isInteger(message.irVersion.low) && $util.isInteger(message.irVersion.high)))\n return \"irVersion: integer|Long expected\";\n if (message.opsetImport != null && message.hasOwnProperty(\"opsetImport\")) {\n if (!Array.isArray(message.opsetImport))\n return \"opsetImport: array expected\";\n for (var i = 0; i < message.opsetImport.length; ++i) {\n var error = $root.onnx.OperatorSetIdProto.verify(message.opsetImport[i]);\n if (error)\n return \"opsetImport.\" + error;\n }\n }\n if (message.producerName != null && message.hasOwnProperty(\"producerName\"))\n if (!$util.isString(message.producerName))\n return \"producerName: string expected\";\n if (message.producerVersion != null && message.hasOwnProperty(\"producerVersion\"))\n if (!$util.isString(message.producerVersion))\n return \"producerVersion: string expected\";\n if (message.domain != null && message.hasOwnProperty(\"domain\"))\n if (!$util.isString(message.domain))\n return \"domain: string expected\";\n if (message.modelVersion != null && message.hasOwnProperty(\"modelVersion\"))\n if (!$util.isInteger(message.modelVersion) && !(message.modelVersion && $util.isInteger(message.modelVersion.low) && $util.isInteger(message.modelVersion.high)))\n return \"modelVersion: integer|Long expected\";\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n if (!$util.isString(message.docString))\n return \"docString: string expected\";\n if (message.graph != null && message.hasOwnProperty(\"graph\")) {\n var error = $root.onnx.GraphProto.verify(message.graph);\n if (error)\n return \"graph.\" + error;\n }\n if (message.metadataProps != null && message.hasOwnProperty(\"metadataProps\")) {\n if (!Array.isArray(message.metadataProps))\n return \"metadataProps: array expected\";\n for (var i = 0; i < message.metadataProps.length; ++i) {\n var error = $root.onnx.StringStringEntryProto.verify(message.metadataProps[i]);\n if (error)\n return \"metadataProps.\" + error;\n }\n }\n if (message.trainingInfo != null && message.hasOwnProperty(\"trainingInfo\")) {\n if (!Array.isArray(message.trainingInfo))\n return \"trainingInfo: array expected\";\n for (var i = 0; i < message.trainingInfo.length; ++i) {\n var error = $root.onnx.TrainingInfoProto.verify(message.trainingInfo[i]);\n if (error)\n return \"trainingInfo.\" + error;\n }\n }\n if (message.functions != null && message.hasOwnProperty(\"functions\")) {\n if (!Array.isArray(message.functions))\n return \"functions: array expected\";\n for (var i = 0; i < message.functions.length; ++i) {\n var error = $root.onnx.FunctionProto.verify(message.functions[i]);\n if (error)\n return \"functions.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates a ModelProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.ModelProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.ModelProto} ModelProto\n */\n ModelProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.ModelProto)\n return object;\n var message = new $root.onnx.ModelProto();\n if (object.irVersion != null)\n if ($util.Long)\n (message.irVersion = $util.Long.fromValue(object.irVersion)).unsigned = false;\n else if (typeof object.irVersion === \"string\")\n message.irVersion = parseInt(object.irVersion, 10);\n else if (typeof object.irVersion === \"number\")\n message.irVersion = object.irVersion;\n else if (typeof object.irVersion === \"object\")\n message.irVersion = new $util.LongBits(object.irVersion.low >>> 0, object.irVersion.high >>> 0).toNumber();\n if (object.opsetImport) {\n if (!Array.isArray(object.opsetImport))\n throw TypeError(\".onnx.ModelProto.opsetImport: array expected\");\n message.opsetImport = [];\n for (var i = 0; i < object.opsetImport.length; ++i) {\n if (typeof object.opsetImport[i] !== \"object\")\n throw TypeError(\".onnx.ModelProto.opsetImport: object expected\");\n message.opsetImport[i] = $root.onnx.OperatorSetIdProto.fromObject(object.opsetImport[i]);\n }\n }\n if (object.producerName != null)\n message.producerName = String(object.producerName);\n if (object.producerVersion != null)\n message.producerVersion = String(object.producerVersion);\n if (object.domain != null)\n message.domain = String(object.domain);\n if (object.modelVersion != null)\n if ($util.Long)\n (message.modelVersion = $util.Long.fromValue(object.modelVersion)).unsigned = false;\n else if (typeof object.modelVersion === \"string\")\n message.modelVersion = parseInt(object.modelVersion, 10);\n else if (typeof object.modelVersion === \"number\")\n message.modelVersion = object.modelVersion;\n else if (typeof object.modelVersion === \"object\")\n message.modelVersion = new $util.LongBits(object.modelVersion.low >>> 0, object.modelVersion.high >>> 0).toNumber();\n if (object.docString != null)\n message.docString = String(object.docString);\n if (object.graph != null) {\n if (typeof object.graph !== \"object\")\n throw TypeError(\".onnx.ModelProto.graph: object expected\");\n message.graph = $root.onnx.GraphProto.fromObject(object.graph);\n }\n if (object.metadataProps) {\n if (!Array.isArray(object.metadataProps))\n throw TypeError(\".onnx.ModelProto.metadataProps: array expected\");\n message.metadataProps = [];\n for (var i = 0; i < object.metadataProps.length; ++i) {\n if (typeof object.metadataProps[i] !== \"object\")\n throw TypeError(\".onnx.ModelProto.metadataProps: object expected\");\n message.metadataProps[i] = $root.onnx.StringStringEntryProto.fromObject(object.metadataProps[i]);\n }\n }\n if (object.trainingInfo) {\n if (!Array.isArray(object.trainingInfo))\n throw TypeError(\".onnx.ModelProto.trainingInfo: array expected\");\n message.trainingInfo = [];\n for (var i = 0; i < object.trainingInfo.length; ++i) {\n if (typeof object.trainingInfo[i] !== \"object\")\n throw TypeError(\".onnx.ModelProto.trainingInfo: object expected\");\n message.trainingInfo[i] = $root.onnx.TrainingInfoProto.fromObject(object.trainingInfo[i]);\n }\n }\n if (object.functions) {\n if (!Array.isArray(object.functions))\n throw TypeError(\".onnx.ModelProto.functions: array expected\");\n message.functions = [];\n for (var i = 0; i < object.functions.length; ++i) {\n if (typeof object.functions[i] !== \"object\")\n throw TypeError(\".onnx.ModelProto.functions: object expected\");\n message.functions[i] = $root.onnx.FunctionProto.fromObject(object.functions[i]);\n }\n }\n return message;\n };\n\n /**\n * Creates a plain object from a ModelProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.ModelProto\n * @static\n * @param {onnx.ModelProto} message ModelProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n ModelProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults) {\n object.opsetImport = [];\n object.metadataProps = [];\n object.trainingInfo = [];\n object.functions = [];\n }\n if (options.defaults) {\n if ($util.Long) {\n var long = new $util.Long(0, 0, false);\n object.irVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.irVersion = options.longs === String ? \"0\" : 0;\n object.producerName = \"\";\n object.producerVersion = \"\";\n object.domain = \"\";\n if ($util.Long) {\n var long = new $util.Long(0, 0, false);\n object.modelVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.modelVersion = options.longs === String ? \"0\" : 0;\n object.docString = \"\";\n object.graph = null;\n }\n if (message.irVersion != null && message.hasOwnProperty(\"irVersion\"))\n if (typeof message.irVersion === \"number\")\n object.irVersion = options.longs === String ? String(message.irVersion) : message.irVersion;\n else\n object.irVersion = options.longs === String ? $util.Long.prototype.toString.call(message.irVersion) : options.longs === Number ? new $util.LongBits(message.irVersion.low >>> 0, message.irVersion.high >>> 0).toNumber() : message.irVersion;\n if (message.producerName != null && message.hasOwnProperty(\"producerName\"))\n object.producerName = message.producerName;\n if (message.producerVersion != null && message.hasOwnProperty(\"producerVersion\"))\n object.producerVersion = message.producerVersion;\n if (message.domain != null && message.hasOwnProperty(\"domain\"))\n object.domain = message.domain;\n if (message.modelVersion != null && message.hasOwnProperty(\"modelVersion\"))\n if (typeof message.modelVersion === \"number\")\n object.modelVersion = options.longs === String ? String(message.modelVersion) : message.modelVersion;\n else\n object.modelVersion = options.longs === String ? $util.Long.prototype.toString.call(message.modelVersion) : options.longs === Number ? new $util.LongBits(message.modelVersion.low >>> 0, message.modelVersion.high >>> 0).toNumber() : message.modelVersion;\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n object.docString = message.docString;\n if (message.graph != null && message.hasOwnProperty(\"graph\"))\n object.graph = $root.onnx.GraphProto.toObject(message.graph, options);\n if (message.opsetImport && message.opsetImport.length) {\n object.opsetImport = [];\n for (var j = 0; j < message.opsetImport.length; ++j)\n object.opsetImport[j] = $root.onnx.OperatorSetIdProto.toObject(message.opsetImport[j], options);\n }\n if (message.metadataProps && message.metadataProps.length) {\n object.metadataProps = [];\n for (var j = 0; j < message.metadataProps.length; ++j)\n object.metadataProps[j] = $root.onnx.StringStringEntryProto.toObject(message.metadataProps[j], options);\n }\n if (message.trainingInfo && message.trainingInfo.length) {\n object.trainingInfo = [];\n for (var j = 0; j < message.trainingInfo.length; ++j)\n object.trainingInfo[j] = $root.onnx.TrainingInfoProto.toObject(message.trainingInfo[j], options);\n }\n if (message.functions && message.functions.length) {\n object.functions = [];\n for (var j = 0; j < message.functions.length; ++j)\n object.functions[j] = $root.onnx.FunctionProto.toObject(message.functions[j], options);\n }\n return object;\n };\n\n /**\n * Converts this ModelProto to JSON.\n * @function toJSON\n * @memberof onnx.ModelProto\n * @instance\n * @returns {Object.} JSON object\n */\n ModelProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for ModelProto\n * @function getTypeUrl\n * @memberof onnx.ModelProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n ModelProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.ModelProto\";\n };\n\n return ModelProto;\n })();\n\n onnx.StringStringEntryProto = (function() {\n\n /**\n * Properties of a StringStringEntryProto.\n * @memberof onnx\n * @interface IStringStringEntryProto\n * @property {string|null} [key] StringStringEntryProto key\n * @property {string|null} [value] StringStringEntryProto value\n */\n\n /**\n * Constructs a new StringStringEntryProto.\n * @memberof onnx\n * @classdesc Represents a StringStringEntryProto.\n * @implements IStringStringEntryProto\n * @constructor\n * @param {onnx.IStringStringEntryProto=} [properties] Properties to set\n */\n function StringStringEntryProto(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * StringStringEntryProto key.\n * @member {string} key\n * @memberof onnx.StringStringEntryProto\n * @instance\n */\n StringStringEntryProto.prototype.key = \"\";\n\n /**\n * StringStringEntryProto value.\n * @member {string} value\n * @memberof onnx.StringStringEntryProto\n * @instance\n */\n StringStringEntryProto.prototype.value = \"\";\n\n /**\n * Creates a new StringStringEntryProto instance using the specified properties.\n * @function create\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {onnx.IStringStringEntryProto=} [properties] Properties to set\n * @returns {onnx.StringStringEntryProto} StringStringEntryProto instance\n */\n StringStringEntryProto.create = function create(properties) {\n return new StringStringEntryProto(properties);\n };\n\n /**\n * Encodes the specified StringStringEntryProto message. Does not implicitly {@link onnx.StringStringEntryProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {onnx.IStringStringEntryProto} message StringStringEntryProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n StringStringEntryProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.key != null && Object.hasOwnProperty.call(message, \"key\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.key);\n if (message.value != null && Object.hasOwnProperty.call(message, \"value\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.value);\n return writer;\n };\n\n /**\n * Encodes the specified StringStringEntryProto message, length delimited. Does not implicitly {@link onnx.StringStringEntryProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {onnx.IStringStringEntryProto} message StringStringEntryProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n StringStringEntryProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a StringStringEntryProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.StringStringEntryProto} StringStringEntryProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n StringStringEntryProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.StringStringEntryProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.key = reader.string();\n break;\n }\n case 2: {\n message.value = reader.string();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a StringStringEntryProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.StringStringEntryProto} StringStringEntryProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n StringStringEntryProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a StringStringEntryProto message.\n * @function verify\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n StringStringEntryProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.key != null && message.hasOwnProperty(\"key\"))\n if (!$util.isString(message.key))\n return \"key: string expected\";\n if (message.value != null && message.hasOwnProperty(\"value\"))\n if (!$util.isString(message.value))\n return \"value: string expected\";\n return null;\n };\n\n /**\n * Creates a StringStringEntryProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.StringStringEntryProto} StringStringEntryProto\n */\n StringStringEntryProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.StringStringEntryProto)\n return object;\n var message = new $root.onnx.StringStringEntryProto();\n if (object.key != null)\n message.key = String(object.key);\n if (object.value != null)\n message.value = String(object.value);\n return message;\n };\n\n /**\n * Creates a plain object from a StringStringEntryProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {onnx.StringStringEntryProto} message StringStringEntryProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n StringStringEntryProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults) {\n object.key = \"\";\n object.value = \"\";\n }\n if (message.key != null && message.hasOwnProperty(\"key\"))\n object.key = message.key;\n if (message.value != null && message.hasOwnProperty(\"value\"))\n object.value = message.value;\n return object;\n };\n\n /**\n * Converts this StringStringEntryProto to JSON.\n * @function toJSON\n * @memberof onnx.StringStringEntryProto\n * @instance\n * @returns {Object.} JSON object\n */\n StringStringEntryProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for StringStringEntryProto\n * @function getTypeUrl\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n StringStringEntryProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.StringStringEntryProto\";\n };\n\n return StringStringEntryProto;\n })();\n\n onnx.TensorAnnotation = (function() {\n\n /**\n * Properties of a TensorAnnotation.\n * @memberof onnx\n * @interface ITensorAnnotation\n * @property {string|null} [tensorName] TensorAnnotation tensorName\n * @property {Array.|null} [quantParameterTensorNames] TensorAnnotation quantParameterTensorNames\n */\n\n /**\n * Constructs a new TensorAnnotation.\n * @memberof onnx\n * @classdesc Represents a TensorAnnotation.\n * @implements ITensorAnnotation\n * @constructor\n * @param {onnx.ITensorAnnotation=} [properties] Properties to set\n */\n function TensorAnnotation(properties) {\n this.quantParameterTensorNames = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * TensorAnnotation tensorName.\n * @member {string} tensorName\n * @memberof onnx.TensorAnnotation\n * @instance\n */\n TensorAnnotation.prototype.tensorName = \"\";\n\n /**\n * TensorAnnotation quantParameterTensorNames.\n * @member {Array.} quantParameterTensorNames\n * @memberof onnx.TensorAnnotation\n * @instance\n */\n TensorAnnotation.prototype.quantParameterTensorNames = $util.emptyArray;\n\n /**\n * Creates a new TensorAnnotation instance using the specified properties.\n * @function create\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {onnx.ITensorAnnotation=} [properties] Properties to set\n * @returns {onnx.TensorAnnotation} TensorAnnotation instance\n */\n TensorAnnotation.create = function create(properties) {\n return new TensorAnnotation(properties);\n };\n\n /**\n * Encodes the specified TensorAnnotation message. Does not implicitly {@link onnx.TensorAnnotation.verify|verify} messages.\n * @function encode\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {onnx.ITensorAnnotation} message TensorAnnotation message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TensorAnnotation.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.tensorName != null && Object.hasOwnProperty.call(message, \"tensorName\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.tensorName);\n if (message.quantParameterTensorNames != null && message.quantParameterTensorNames.length)\n for (var i = 0; i < message.quantParameterTensorNames.length; ++i)\n $root.onnx.StringStringEntryProto.encode(message.quantParameterTensorNames[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified TensorAnnotation message, length delimited. Does not implicitly {@link onnx.TensorAnnotation.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {onnx.ITensorAnnotation} message TensorAnnotation message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TensorAnnotation.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a TensorAnnotation message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TensorAnnotation} TensorAnnotation\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TensorAnnotation.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TensorAnnotation();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.tensorName = reader.string();\n break;\n }\n case 2: {\n if (!(message.quantParameterTensorNames && message.quantParameterTensorNames.length))\n message.quantParameterTensorNames = [];\n message.quantParameterTensorNames.push($root.onnx.StringStringEntryProto.decode(reader, reader.uint32()));\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a TensorAnnotation message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TensorAnnotation} TensorAnnotation\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TensorAnnotation.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a TensorAnnotation message.\n * @function verify\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n TensorAnnotation.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.tensorName != null && message.hasOwnProperty(\"tensorName\"))\n if (!$util.isString(message.tensorName))\n return \"tensorName: string expected\";\n if (message.quantParameterTensorNames != null && message.hasOwnProperty(\"quantParameterTensorNames\")) {\n if (!Array.isArray(message.quantParameterTensorNames))\n return \"quantParameterTensorNames: array expected\";\n for (var i = 0; i < message.quantParameterTensorNames.length; ++i) {\n var error = $root.onnx.StringStringEntryProto.verify(message.quantParameterTensorNames[i]);\n if (error)\n return \"quantParameterTensorNames.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates a TensorAnnotation message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TensorAnnotation} TensorAnnotation\n */\n TensorAnnotation.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TensorAnnotation)\n return object;\n var message = new $root.onnx.TensorAnnotation();\n if (object.tensorName != null)\n message.tensorName = String(object.tensorName);\n if (object.quantParameterTensorNames) {\n if (!Array.isArray(object.quantParameterTensorNames))\n throw TypeError(\".onnx.TensorAnnotation.quantParameterTensorNames: array expected\");\n message.quantParameterTensorNames = [];\n for (var i = 0; i < object.quantParameterTensorNames.length; ++i) {\n if (typeof object.quantParameterTensorNames[i] !== \"object\")\n throw TypeError(\".onnx.TensorAnnotation.quantParameterTensorNames: object expected\");\n message.quantParameterTensorNames[i] = $root.onnx.StringStringEntryProto.fromObject(object.quantParameterTensorNames[i]);\n }\n }\n return message;\n };\n\n /**\n * Creates a plain object from a TensorAnnotation message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {onnx.TensorAnnotation} message TensorAnnotation\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n TensorAnnotation.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.quantParameterTensorNames = [];\n if (options.defaults)\n object.tensorName = \"\";\n if (message.tensorName != null && message.hasOwnProperty(\"tensorName\"))\n object.tensorName = message.tensorName;\n if (message.quantParameterTensorNames && message.quantParameterTensorNames.length) {\n object.quantParameterTensorNames = [];\n for (var j = 0; j < message.quantParameterTensorNames.length; ++j)\n object.quantParameterTensorNames[j] = $root.onnx.StringStringEntryProto.toObject(message.quantParameterTensorNames[j], options);\n }\n return object;\n };\n\n /**\n * Converts this TensorAnnotation to JSON.\n * @function toJSON\n * @memberof onnx.TensorAnnotation\n * @instance\n * @returns {Object.} JSON object\n */\n TensorAnnotation.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for TensorAnnotation\n * @function getTypeUrl\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n TensorAnnotation.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TensorAnnotation\";\n };\n\n return TensorAnnotation;\n })();\n\n onnx.GraphProto = (function() {\n\n /**\n * Properties of a GraphProto.\n * @memberof onnx\n * @interface IGraphProto\n * @property {Array.|null} [node] GraphProto node\n * @property {string|null} [name] GraphProto name\n * @property {Array.|null} [initializer] GraphProto initializer\n * @property {Array.|null} [sparseInitializer] GraphProto sparseInitializer\n * @property {string|null} [docString] GraphProto docString\n * @property {Array.|null} [input] GraphProto input\n * @property {Array.|null} [output] GraphProto output\n * @property {Array.|null} [valueInfo] GraphProto valueInfo\n * @property {Array.|null} [quantizationAnnotation] GraphProto quantizationAnnotation\n */\n\n /**\n * Constructs a new GraphProto.\n * @memberof onnx\n * @classdesc Represents a GraphProto.\n * @implements IGraphProto\n * @constructor\n * @param {onnx.IGraphProto=} [properties] Properties to set\n */\n function GraphProto(properties) {\n this.node = [];\n this.initializer = [];\n this.sparseInitializer = [];\n this.input = [];\n this.output = [];\n this.valueInfo = [];\n this.quantizationAnnotation = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * GraphProto node.\n * @member {Array.} node\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.node = $util.emptyArray;\n\n /**\n * GraphProto name.\n * @member {string} name\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.name = \"\";\n\n /**\n * GraphProto initializer.\n * @member {Array.} initializer\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.initializer = $util.emptyArray;\n\n /**\n * GraphProto sparseInitializer.\n * @member {Array.} sparseInitializer\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.sparseInitializer = $util.emptyArray;\n\n /**\n * GraphProto docString.\n * @member {string} docString\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.docString = \"\";\n\n /**\n * GraphProto input.\n * @member {Array.} input\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.input = $util.emptyArray;\n\n /**\n * GraphProto output.\n * @member {Array.} output\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.output = $util.emptyArray;\n\n /**\n * GraphProto valueInfo.\n * @member {Array.} valueInfo\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.valueInfo = $util.emptyArray;\n\n /**\n * GraphProto quantizationAnnotation.\n * @member {Array.} quantizationAnnotation\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.quantizationAnnotation = $util.emptyArray;\n\n /**\n * Creates a new GraphProto instance using the specified properties.\n * @function create\n * @memberof onnx.GraphProto\n * @static\n * @param {onnx.IGraphProto=} [properties] Properties to set\n * @returns {onnx.GraphProto} GraphProto instance\n */\n GraphProto.create = function create(properties) {\n return new GraphProto(properties);\n };\n\n /**\n * Encodes the specified GraphProto message. Does not implicitly {@link onnx.GraphProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.GraphProto\n * @static\n * @param {onnx.IGraphProto} message GraphProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n GraphProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.node != null && message.node.length)\n for (var i = 0; i < message.node.length; ++i)\n $root.onnx.NodeProto.encode(message.node[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.name);\n if (message.initializer != null && message.initializer.length)\n for (var i = 0; i < message.initializer.length; ++i)\n $root.onnx.TensorProto.encode(message.initializer[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\n if (message.docString != null && Object.hasOwnProperty.call(message, \"docString\"))\n writer.uint32(/* id 10, wireType 2 =*/82).string(message.docString);\n if (message.input != null && message.input.length)\n for (var i = 0; i < message.input.length; ++i)\n $root.onnx.ValueInfoProto.encode(message.input[i], writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();\n if (message.output != null && message.output.length)\n for (var i = 0; i < message.output.length; ++i)\n $root.onnx.ValueInfoProto.encode(message.output[i], writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim();\n if (message.valueInfo != null && message.valueInfo.length)\n for (var i = 0; i < message.valueInfo.length; ++i)\n $root.onnx.ValueInfoProto.encode(message.valueInfo[i], writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim();\n if (message.quantizationAnnotation != null && message.quantizationAnnotation.length)\n for (var i = 0; i < message.quantizationAnnotation.length; ++i)\n $root.onnx.TensorAnnotation.encode(message.quantizationAnnotation[i], writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim();\n if (message.sparseInitializer != null && message.sparseInitializer.length)\n for (var i = 0; i < message.sparseInitializer.length; ++i)\n $root.onnx.SparseTensorProto.encode(message.sparseInitializer[i], writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified GraphProto message, length delimited. Does not implicitly {@link onnx.GraphProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.GraphProto\n * @static\n * @param {onnx.IGraphProto} message GraphProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n GraphProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a GraphProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.GraphProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.GraphProto} GraphProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n GraphProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.GraphProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n if (!(message.node && message.node.length))\n message.node = [];\n message.node.push($root.onnx.NodeProto.decode(reader, reader.uint32()));\n break;\n }\n case 2: {\n message.name = reader.string();\n break;\n }\n case 5: {\n if (!(message.initializer && message.initializer.length))\n message.initializer = [];\n message.initializer.push($root.onnx.TensorProto.decode(reader, reader.uint32()));\n break;\n }\n case 15: {\n if (!(message.sparseInitializer && message.sparseInitializer.length))\n message.sparseInitializer = [];\n message.sparseInitializer.push($root.onnx.SparseTensorProto.decode(reader, reader.uint32()));\n break;\n }\n case 10: {\n message.docString = reader.string();\n break;\n }\n case 11: {\n if (!(message.input && message.input.length))\n message.input = [];\n message.input.push($root.onnx.ValueInfoProto.decode(reader, reader.uint32()));\n break;\n }\n case 12: {\n if (!(message.output && message.output.length))\n message.output = [];\n message.output.push($root.onnx.ValueInfoProto.decode(reader, reader.uint32()));\n break;\n }\n case 13: {\n if (!(message.valueInfo && message.valueInfo.length))\n message.valueInfo = [];\n message.valueInfo.push($root.onnx.ValueInfoProto.decode(reader, reader.uint32()));\n break;\n }\n case 14: {\n if (!(message.quantizationAnnotation && message.quantizationAnnotation.length))\n message.quantizationAnnotation = [];\n message.quantizationAnnotation.push($root.onnx.TensorAnnotation.decode(reader, reader.uint32()));\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a GraphProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.GraphProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.GraphProto} GraphProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n GraphProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a GraphProto message.\n * @function verify\n * @memberof onnx.GraphProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n GraphProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.node != null && message.hasOwnProperty(\"node\")) {\n if (!Array.isArray(message.node))\n return \"node: array expected\";\n for (var i = 0; i < message.node.length; ++i) {\n var error = $root.onnx.NodeProto.verify(message.node[i]);\n if (error)\n return \"node.\" + error;\n }\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n if (!$util.isString(message.name))\n return \"name: string expected\";\n if (message.initializer != null && message.hasOwnProperty(\"initializer\")) {\n if (!Array.isArray(message.initializer))\n return \"initializer: array expected\";\n for (var i = 0; i < message.initializer.length; ++i) {\n var error = $root.onnx.TensorProto.verify(message.initializer[i]);\n if (error)\n return \"initializer.\" + error;\n }\n }\n if (message.sparseInitializer != null && message.hasOwnProperty(\"sparseInitializer\")) {\n if (!Array.isArray(message.sparseInitializer))\n return \"sparseInitializer: array expected\";\n for (var i = 0; i < message.sparseInitializer.length; ++i) {\n var error = $root.onnx.SparseTensorProto.verify(message.sparseInitializer[i]);\n if (error)\n return \"sparseInitializer.\" + error;\n }\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n if (!$util.isString(message.docString))\n return \"docString: string expected\";\n if (message.input != null && message.hasOwnProperty(\"input\")) {\n if (!Array.isArray(message.input))\n return \"input: array expected\";\n for (var i = 0; i < message.input.length; ++i) {\n var error = $root.onnx.ValueInfoProto.verify(message.input[i]);\n if (error)\n return \"input.\" + error;\n }\n }\n if (message.output != null && message.hasOwnProperty(\"output\")) {\n if (!Array.isArray(message.output))\n return \"output: array expected\";\n for (var i = 0; i < message.output.length; ++i) {\n var error = $root.onnx.ValueInfoProto.verify(message.output[i]);\n if (error)\n return \"output.\" + error;\n }\n }\n if (message.valueInfo != null && message.hasOwnProperty(\"valueInfo\")) {\n if (!Array.isArray(message.valueInfo))\n return \"valueInfo: array expected\";\n for (var i = 0; i < message.valueInfo.length; ++i) {\n var error = $root.onnx.ValueInfoProto.verify(message.valueInfo[i]);\n if (error)\n return \"valueInfo.\" + error;\n }\n }\n if (message.quantizationAnnotation != null && message.hasOwnProperty(\"quantizationAnnotation\")) {\n if (!Array.isArray(message.quantizationAnnotation))\n return \"quantizationAnnotation: array expected\";\n for (var i = 0; i < message.quantizationAnnotation.length; ++i) {\n var error = $root.onnx.TensorAnnotation.verify(message.quantizationAnnotation[i]);\n if (error)\n return \"quantizationAnnotation.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates a GraphProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.GraphProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.GraphProto} GraphProto\n */\n GraphProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.GraphProto)\n return object;\n var message = new $root.onnx.GraphProto();\n if (object.node) {\n if (!Array.isArray(object.node))\n throw TypeError(\".onnx.GraphProto.node: array expected\");\n message.node = [];\n for (var i = 0; i < object.node.length; ++i) {\n if (typeof object.node[i] !== \"object\")\n throw TypeError(\".onnx.GraphProto.node: object expected\");\n message.node[i] = $root.onnx.NodeProto.fromObject(object.node[i]);\n }\n }\n if (object.name != null)\n message.name = String(object.name);\n if (object.initializer) {\n if (!Array.isArray(object.initializer))\n throw TypeError(\".onnx.GraphProto.initializer: array expected\");\n message.initializer = [];\n for (var i = 0; i < object.initializer.length; ++i) {\n if (typeof object.initializer[i] !== \"object\")\n throw TypeError(\".onnx.GraphProto.initializer: object expected\");\n message.initializer[i] = $root.onnx.TensorProto.fromObject(object.initializer[i]);\n }\n }\n if (object.sparseInitializer) {\n if (!Array.isArray(object.sparseInitializer))\n throw TypeError(\".onnx.GraphProto.sparseInitializer: array expected\");\n message.sparseInitializer = [];\n for (var i = 0; i < object.sparseInitializer.length; ++i) {\n if (typeof object.sparseInitializer[i] !== \"object\")\n throw TypeError(\".onnx.GraphProto.sparseInitializer: object expected\");\n message.sparseInitializer[i] = $root.onnx.SparseTensorProto.fromObject(object.sparseInitializer[i]);\n }\n }\n if (object.docString != null)\n message.docString = String(object.docString);\n if (object.input) {\n if (!Array.isArray(object.input))\n throw TypeError(\".onnx.GraphProto.input: array expected\");\n message.input = [];\n for (var i = 0; i < object.input.length; ++i) {\n if (typeof object.input[i] !== \"object\")\n throw TypeError(\".onnx.GraphProto.input: object expected\");\n message.input[i] = $root.onnx.ValueInfoProto.fromObject(object.input[i]);\n }\n }\n if (object.output) {\n if (!Array.isArray(object.output))\n throw TypeError(\".onnx.GraphProto.output: array expected\");\n message.output = [];\n for (var i = 0; i < object.output.length; ++i) {\n if (typeof object.output[i] !== \"object\")\n throw TypeError(\".onnx.GraphProto.output: object expected\");\n message.output[i] = $root.onnx.ValueInfoProto.fromObject(object.output[i]);\n }\n }\n if (object.valueInfo) {\n if (!Array.isArray(object.valueInfo))\n throw TypeError(\".onnx.GraphProto.valueInfo: array expected\");\n message.valueInfo = [];\n for (var i = 0; i < object.valueInfo.length; ++i) {\n if (typeof object.valueInfo[i] !== \"object\")\n throw TypeError(\".onnx.GraphProto.valueInfo: object expected\");\n message.valueInfo[i] = $root.onnx.ValueInfoProto.fromObject(object.valueInfo[i]);\n }\n }\n if (object.quantizationAnnotation) {\n if (!Array.isArray(object.quantizationAnnotation))\n throw TypeError(\".onnx.GraphProto.quantizationAnnotation: array expected\");\n message.quantizationAnnotation = [];\n for (var i = 0; i < object.quantizationAnnotation.length; ++i) {\n if (typeof object.quantizationAnnotation[i] !== \"object\")\n throw TypeError(\".onnx.GraphProto.quantizationAnnotation: object expected\");\n message.quantizationAnnotation[i] = $root.onnx.TensorAnnotation.fromObject(object.quantizationAnnotation[i]);\n }\n }\n return message;\n };\n\n /**\n * Creates a plain object from a GraphProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.GraphProto\n * @static\n * @param {onnx.GraphProto} message GraphProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n GraphProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults) {\n object.node = [];\n object.initializer = [];\n object.input = [];\n object.output = [];\n object.valueInfo = [];\n object.quantizationAnnotation = [];\n object.sparseInitializer = [];\n }\n if (options.defaults) {\n object.name = \"\";\n object.docString = \"\";\n }\n if (message.node && message.node.length) {\n object.node = [];\n for (var j = 0; j < message.node.length; ++j)\n object.node[j] = $root.onnx.NodeProto.toObject(message.node[j], options);\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n object.name = message.name;\n if (message.initializer && message.initializer.length) {\n object.initializer = [];\n for (var j = 0; j < message.initializer.length; ++j)\n object.initializer[j] = $root.onnx.TensorProto.toObject(message.initializer[j], options);\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n object.docString = message.docString;\n if (message.input && message.input.length) {\n object.input = [];\n for (var j = 0; j < message.input.length; ++j)\n object.input[j] = $root.onnx.ValueInfoProto.toObject(message.input[j], options);\n }\n if (message.output && message.output.length) {\n object.output = [];\n for (var j = 0; j < message.output.length; ++j)\n object.output[j] = $root.onnx.ValueInfoProto.toObject(message.output[j], options);\n }\n if (message.valueInfo && message.valueInfo.length) {\n object.valueInfo = [];\n for (var j = 0; j < message.valueInfo.length; ++j)\n object.valueInfo[j] = $root.onnx.ValueInfoProto.toObject(message.valueInfo[j], options);\n }\n if (message.quantizationAnnotation && message.quantizationAnnotation.length) {\n object.quantizationAnnotation = [];\n for (var j = 0; j < message.quantizationAnnotation.length; ++j)\n object.quantizationAnnotation[j] = $root.onnx.TensorAnnotation.toObject(message.quantizationAnnotation[j], options);\n }\n if (message.sparseInitializer && message.sparseInitializer.length) {\n object.sparseInitializer = [];\n for (var j = 0; j < message.sparseInitializer.length; ++j)\n object.sparseInitializer[j] = $root.onnx.SparseTensorProto.toObject(message.sparseInitializer[j], options);\n }\n return object;\n };\n\n /**\n * Converts this GraphProto to JSON.\n * @function toJSON\n * @memberof onnx.GraphProto\n * @instance\n * @returns {Object.} JSON object\n */\n GraphProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for GraphProto\n * @function getTypeUrl\n * @memberof onnx.GraphProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n GraphProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.GraphProto\";\n };\n\n return GraphProto;\n })();\n\n onnx.TensorProto = (function() {\n\n /**\n * Properties of a TensorProto.\n * @memberof onnx\n * @interface ITensorProto\n * @property {Array.|null} [dims] TensorProto dims\n * @property {number|null} [dataType] TensorProto dataType\n * @property {onnx.TensorProto.ISegment|null} [segment] TensorProto segment\n * @property {Array.|null} [floatData] TensorProto floatData\n * @property {Array.|null} [int32Data] TensorProto int32Data\n * @property {Array.|null} [stringData] TensorProto stringData\n * @property {Array.|null} [int64Data] TensorProto int64Data\n * @property {string|null} [name] TensorProto name\n * @property {string|null} [docString] TensorProto docString\n * @property {Uint8Array|null} [rawData] TensorProto rawData\n * @property {Array.|null} [externalData] TensorProto externalData\n * @property {onnx.TensorProto.DataLocation|null} [dataLocation] TensorProto dataLocation\n * @property {Array.|null} [doubleData] TensorProto doubleData\n * @property {Array.|null} [uint64Data] TensorProto uint64Data\n */\n\n /**\n * Constructs a new TensorProto.\n * @memberof onnx\n * @classdesc Represents a TensorProto.\n * @implements ITensorProto\n * @constructor\n * @param {onnx.ITensorProto=} [properties] Properties to set\n */\n function TensorProto(properties) {\n this.dims = [];\n this.floatData = [];\n this.int32Data = [];\n this.stringData = [];\n this.int64Data = [];\n this.externalData = [];\n this.doubleData = [];\n this.uint64Data = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * TensorProto dims.\n * @member {Array.} dims\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.dims = $util.emptyArray;\n\n /**\n * TensorProto dataType.\n * @member {number} dataType\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.dataType = 0;\n\n /**\n * TensorProto segment.\n * @member {onnx.TensorProto.ISegment|null|undefined} segment\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.segment = null;\n\n /**\n * TensorProto floatData.\n * @member {Array.} floatData\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.floatData = $util.emptyArray;\n\n /**\n * TensorProto int32Data.\n * @member {Array.} int32Data\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.int32Data = $util.emptyArray;\n\n /**\n * TensorProto stringData.\n * @member {Array.} stringData\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.stringData = $util.emptyArray;\n\n /**\n * TensorProto int64Data.\n * @member {Array.} int64Data\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.int64Data = $util.emptyArray;\n\n /**\n * TensorProto name.\n * @member {string} name\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.name = \"\";\n\n /**\n * TensorProto docString.\n * @member {string} docString\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.docString = \"\";\n\n /**\n * TensorProto rawData.\n * @member {Uint8Array} rawData\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.rawData = $util.newBuffer([]);\n\n /**\n * TensorProto externalData.\n * @member {Array.} externalData\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.externalData = $util.emptyArray;\n\n /**\n * TensorProto dataLocation.\n * @member {onnx.TensorProto.DataLocation} dataLocation\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.dataLocation = 0;\n\n /**\n * TensorProto doubleData.\n * @member {Array.} doubleData\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.doubleData = $util.emptyArray;\n\n /**\n * TensorProto uint64Data.\n * @member {Array.} uint64Data\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.uint64Data = $util.emptyArray;\n\n /**\n * Creates a new TensorProto instance using the specified properties.\n * @function create\n * @memberof onnx.TensorProto\n * @static\n * @param {onnx.ITensorProto=} [properties] Properties to set\n * @returns {onnx.TensorProto} TensorProto instance\n */\n TensorProto.create = function create(properties) {\n return new TensorProto(properties);\n };\n\n /**\n * Encodes the specified TensorProto message. Does not implicitly {@link onnx.TensorProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.TensorProto\n * @static\n * @param {onnx.ITensorProto} message TensorProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TensorProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.dims != null && message.dims.length) {\n writer.uint32(/* id 1, wireType 2 =*/10).fork();\n for (var i = 0; i < message.dims.length; ++i)\n writer.int64(message.dims[i]);\n writer.ldelim();\n }\n if (message.dataType != null && Object.hasOwnProperty.call(message, \"dataType\"))\n writer.uint32(/* id 2, wireType 0 =*/16).int32(message.dataType);\n if (message.segment != null && Object.hasOwnProperty.call(message, \"segment\"))\n $root.onnx.TensorProto.Segment.encode(message.segment, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\n if (message.floatData != null && message.floatData.length) {\n writer.uint32(/* id 4, wireType 2 =*/34).fork();\n for (var i = 0; i < message.floatData.length; ++i)\n writer.float(message.floatData[i]);\n writer.ldelim();\n }\n if (message.int32Data != null && message.int32Data.length) {\n writer.uint32(/* id 5, wireType 2 =*/42).fork();\n for (var i = 0; i < message.int32Data.length; ++i)\n writer.int32(message.int32Data[i]);\n writer.ldelim();\n }\n if (message.stringData != null && message.stringData.length)\n for (var i = 0; i < message.stringData.length; ++i)\n writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.stringData[i]);\n if (message.int64Data != null && message.int64Data.length) {\n writer.uint32(/* id 7, wireType 2 =*/58).fork();\n for (var i = 0; i < message.int64Data.length; ++i)\n writer.int64(message.int64Data[i]);\n writer.ldelim();\n }\n if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\n writer.uint32(/* id 8, wireType 2 =*/66).string(message.name);\n if (message.rawData != null && Object.hasOwnProperty.call(message, \"rawData\"))\n writer.uint32(/* id 9, wireType 2 =*/74).bytes(message.rawData);\n if (message.doubleData != null && message.doubleData.length) {\n writer.uint32(/* id 10, wireType 2 =*/82).fork();\n for (var i = 0; i < message.doubleData.length; ++i)\n writer.double(message.doubleData[i]);\n writer.ldelim();\n }\n if (message.uint64Data != null && message.uint64Data.length) {\n writer.uint32(/* id 11, wireType 2 =*/90).fork();\n for (var i = 0; i < message.uint64Data.length; ++i)\n writer.uint64(message.uint64Data[i]);\n writer.ldelim();\n }\n if (message.docString != null && Object.hasOwnProperty.call(message, \"docString\"))\n writer.uint32(/* id 12, wireType 2 =*/98).string(message.docString);\n if (message.externalData != null && message.externalData.length)\n for (var i = 0; i < message.externalData.length; ++i)\n $root.onnx.StringStringEntryProto.encode(message.externalData[i], writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim();\n if (message.dataLocation != null && Object.hasOwnProperty.call(message, \"dataLocation\"))\n writer.uint32(/* id 14, wireType 0 =*/112).int32(message.dataLocation);\n return writer;\n };\n\n /**\n * Encodes the specified TensorProto message, length delimited. Does not implicitly {@link onnx.TensorProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TensorProto\n * @static\n * @param {onnx.ITensorProto} message TensorProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TensorProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a TensorProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TensorProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TensorProto} TensorProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TensorProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TensorProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n if (!(message.dims && message.dims.length))\n message.dims = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.dims.push(reader.int64());\n } else\n message.dims.push(reader.int64());\n break;\n }\n case 2: {\n message.dataType = reader.int32();\n break;\n }\n case 3: {\n message.segment = $root.onnx.TensorProto.Segment.decode(reader, reader.uint32());\n break;\n }\n case 4: {\n if (!(message.floatData && message.floatData.length))\n message.floatData = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.floatData.push(reader.float());\n } else\n message.floatData.push(reader.float());\n break;\n }\n case 5: {\n if (!(message.int32Data && message.int32Data.length))\n message.int32Data = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.int32Data.push(reader.int32());\n } else\n message.int32Data.push(reader.int32());\n break;\n }\n case 6: {\n if (!(message.stringData && message.stringData.length))\n message.stringData = [];\n message.stringData.push(reader.bytes());\n break;\n }\n case 7: {\n if (!(message.int64Data && message.int64Data.length))\n message.int64Data = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.int64Data.push(reader.int64());\n } else\n message.int64Data.push(reader.int64());\n break;\n }\n case 8: {\n message.name = reader.string();\n break;\n }\n case 12: {\n message.docString = reader.string();\n break;\n }\n case 9: {\n message.rawData = reader.bytes();\n break;\n }\n case 13: {\n if (!(message.externalData && message.externalData.length))\n message.externalData = [];\n message.externalData.push($root.onnx.StringStringEntryProto.decode(reader, reader.uint32()));\n break;\n }\n case 14: {\n message.dataLocation = reader.int32();\n break;\n }\n case 10: {\n if (!(message.doubleData && message.doubleData.length))\n message.doubleData = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.doubleData.push(reader.double());\n } else\n message.doubleData.push(reader.double());\n break;\n }\n case 11: {\n if (!(message.uint64Data && message.uint64Data.length))\n message.uint64Data = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.uint64Data.push(reader.uint64());\n } else\n message.uint64Data.push(reader.uint64());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a TensorProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TensorProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TensorProto} TensorProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TensorProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a TensorProto message.\n * @function verify\n * @memberof onnx.TensorProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n TensorProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.dims != null && message.hasOwnProperty(\"dims\")) {\n if (!Array.isArray(message.dims))\n return \"dims: array expected\";\n for (var i = 0; i < message.dims.length; ++i)\n if (!$util.isInteger(message.dims[i]) && !(message.dims[i] && $util.isInteger(message.dims[i].low) && $util.isInteger(message.dims[i].high)))\n return \"dims: integer|Long[] expected\";\n }\n if (message.dataType != null && message.hasOwnProperty(\"dataType\"))\n if (!$util.isInteger(message.dataType))\n return \"dataType: integer expected\";\n if (message.segment != null && message.hasOwnProperty(\"segment\")) {\n var error = $root.onnx.TensorProto.Segment.verify(message.segment);\n if (error)\n return \"segment.\" + error;\n }\n if (message.floatData != null && message.hasOwnProperty(\"floatData\")) {\n if (!Array.isArray(message.floatData))\n return \"floatData: array expected\";\n for (var i = 0; i < message.floatData.length; ++i)\n if (typeof message.floatData[i] !== \"number\")\n return \"floatData: number[] expected\";\n }\n if (message.int32Data != null && message.hasOwnProperty(\"int32Data\")) {\n if (!Array.isArray(message.int32Data))\n return \"int32Data: array expected\";\n for (var i = 0; i < message.int32Data.length; ++i)\n if (!$util.isInteger(message.int32Data[i]))\n return \"int32Data: integer[] expected\";\n }\n if (message.stringData != null && message.hasOwnProperty(\"stringData\")) {\n if (!Array.isArray(message.stringData))\n return \"stringData: array expected\";\n for (var i = 0; i < message.stringData.length; ++i)\n if (!(message.stringData[i] && typeof message.stringData[i].length === \"number\" || $util.isString(message.stringData[i])))\n return \"stringData: buffer[] expected\";\n }\n if (message.int64Data != null && message.hasOwnProperty(\"int64Data\")) {\n if (!Array.isArray(message.int64Data))\n return \"int64Data: array expected\";\n for (var i = 0; i < message.int64Data.length; ++i)\n if (!$util.isInteger(message.int64Data[i]) && !(message.int64Data[i] && $util.isInteger(message.int64Data[i].low) && $util.isInteger(message.int64Data[i].high)))\n return \"int64Data: integer|Long[] expected\";\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n if (!$util.isString(message.name))\n return \"name: string expected\";\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n if (!$util.isString(message.docString))\n return \"docString: string expected\";\n if (message.rawData != null && message.hasOwnProperty(\"rawData\"))\n if (!(message.rawData && typeof message.rawData.length === \"number\" || $util.isString(message.rawData)))\n return \"rawData: buffer expected\";\n if (message.externalData != null && message.hasOwnProperty(\"externalData\")) {\n if (!Array.isArray(message.externalData))\n return \"externalData: array expected\";\n for (var i = 0; i < message.externalData.length; ++i) {\n var error = $root.onnx.StringStringEntryProto.verify(message.externalData[i]);\n if (error)\n return \"externalData.\" + error;\n }\n }\n if (message.dataLocation != null && message.hasOwnProperty(\"dataLocation\"))\n switch (message.dataLocation) {\n default:\n return \"dataLocation: enum value expected\";\n case 0:\n case 1:\n break;\n }\n if (message.doubleData != null && message.hasOwnProperty(\"doubleData\")) {\n if (!Array.isArray(message.doubleData))\n return \"doubleData: array expected\";\n for (var i = 0; i < message.doubleData.length; ++i)\n if (typeof message.doubleData[i] !== \"number\")\n return \"doubleData: number[] expected\";\n }\n if (message.uint64Data != null && message.hasOwnProperty(\"uint64Data\")) {\n if (!Array.isArray(message.uint64Data))\n return \"uint64Data: array expected\";\n for (var i = 0; i < message.uint64Data.length; ++i)\n if (!$util.isInteger(message.uint64Data[i]) && !(message.uint64Data[i] && $util.isInteger(message.uint64Data[i].low) && $util.isInteger(message.uint64Data[i].high)))\n return \"uint64Data: integer|Long[] expected\";\n }\n return null;\n };\n\n /**\n * Creates a TensorProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TensorProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TensorProto} TensorProto\n */\n TensorProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TensorProto)\n return object;\n var message = new $root.onnx.TensorProto();\n if (object.dims) {\n if (!Array.isArray(object.dims))\n throw TypeError(\".onnx.TensorProto.dims: array expected\");\n message.dims = [];\n for (var i = 0; i < object.dims.length; ++i)\n if ($util.Long)\n (message.dims[i] = $util.Long.fromValue(object.dims[i])).unsigned = false;\n else if (typeof object.dims[i] === \"string\")\n message.dims[i] = parseInt(object.dims[i], 10);\n else if (typeof object.dims[i] === \"number\")\n message.dims[i] = object.dims[i];\n else if (typeof object.dims[i] === \"object\")\n message.dims[i] = new $util.LongBits(object.dims[i].low >>> 0, object.dims[i].high >>> 0).toNumber();\n }\n if (object.dataType != null)\n message.dataType = object.dataType | 0;\n if (object.segment != null) {\n if (typeof object.segment !== \"object\")\n throw TypeError(\".onnx.TensorProto.segment: object expected\");\n message.segment = $root.onnx.TensorProto.Segment.fromObject(object.segment);\n }\n if (object.floatData) {\n if (!Array.isArray(object.floatData))\n throw TypeError(\".onnx.TensorProto.floatData: array expected\");\n message.floatData = [];\n for (var i = 0; i < object.floatData.length; ++i)\n message.floatData[i] = Number(object.floatData[i]);\n }\n if (object.int32Data) {\n if (!Array.isArray(object.int32Data))\n throw TypeError(\".onnx.TensorProto.int32Data: array expected\");\n message.int32Data = [];\n for (var i = 0; i < object.int32Data.length; ++i)\n message.int32Data[i] = object.int32Data[i] | 0;\n }\n if (object.stringData) {\n if (!Array.isArray(object.stringData))\n throw TypeError(\".onnx.TensorProto.stringData: array expected\");\n message.stringData = [];\n for (var i = 0; i < object.stringData.length; ++i)\n if (typeof object.stringData[i] === \"string\")\n $util.base64.decode(object.stringData[i], message.stringData[i] = $util.newBuffer($util.base64.length(object.stringData[i])), 0);\n else if (object.stringData[i].length >= 0)\n message.stringData[i] = object.stringData[i];\n }\n if (object.int64Data) {\n if (!Array.isArray(object.int64Data))\n throw TypeError(\".onnx.TensorProto.int64Data: array expected\");\n message.int64Data = [];\n for (var i = 0; i < object.int64Data.length; ++i)\n if ($util.Long)\n (message.int64Data[i] = $util.Long.fromValue(object.int64Data[i])).unsigned = false;\n else if (typeof object.int64Data[i] === \"string\")\n message.int64Data[i] = parseInt(object.int64Data[i], 10);\n else if (typeof object.int64Data[i] === \"number\")\n message.int64Data[i] = object.int64Data[i];\n else if (typeof object.int64Data[i] === \"object\")\n message.int64Data[i] = new $util.LongBits(object.int64Data[i].low >>> 0, object.int64Data[i].high >>> 0).toNumber();\n }\n if (object.name != null)\n message.name = String(object.name);\n if (object.docString != null)\n message.docString = String(object.docString);\n if (object.rawData != null)\n if (typeof object.rawData === \"string\")\n $util.base64.decode(object.rawData, message.rawData = $util.newBuffer($util.base64.length(object.rawData)), 0);\n else if (object.rawData.length >= 0)\n message.rawData = object.rawData;\n if (object.externalData) {\n if (!Array.isArray(object.externalData))\n throw TypeError(\".onnx.TensorProto.externalData: array expected\");\n message.externalData = [];\n for (var i = 0; i < object.externalData.length; ++i) {\n if (typeof object.externalData[i] !== \"object\")\n throw TypeError(\".onnx.TensorProto.externalData: object expected\");\n message.externalData[i] = $root.onnx.StringStringEntryProto.fromObject(object.externalData[i]);\n }\n }\n switch (object.dataLocation) {\n default:\n if (typeof object.dataLocation === \"number\") {\n message.dataLocation = object.dataLocation;\n break;\n }\n break;\n case \"DEFAULT\":\n case 0:\n message.dataLocation = 0;\n break;\n case \"EXTERNAL\":\n case 1:\n message.dataLocation = 1;\n break;\n }\n if (object.doubleData) {\n if (!Array.isArray(object.doubleData))\n throw TypeError(\".onnx.TensorProto.doubleData: array expected\");\n message.doubleData = [];\n for (var i = 0; i < object.doubleData.length; ++i)\n message.doubleData[i] = Number(object.doubleData[i]);\n }\n if (object.uint64Data) {\n if (!Array.isArray(object.uint64Data))\n throw TypeError(\".onnx.TensorProto.uint64Data: array expected\");\n message.uint64Data = [];\n for (var i = 0; i < object.uint64Data.length; ++i)\n if ($util.Long)\n (message.uint64Data[i] = $util.Long.fromValue(object.uint64Data[i])).unsigned = true;\n else if (typeof object.uint64Data[i] === \"string\")\n message.uint64Data[i] = parseInt(object.uint64Data[i], 10);\n else if (typeof object.uint64Data[i] === \"number\")\n message.uint64Data[i] = object.uint64Data[i];\n else if (typeof object.uint64Data[i] === \"object\")\n message.uint64Data[i] = new $util.LongBits(object.uint64Data[i].low >>> 0, object.uint64Data[i].high >>> 0).toNumber(true);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a TensorProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TensorProto\n * @static\n * @param {onnx.TensorProto} message TensorProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n TensorProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults) {\n object.dims = [];\n object.floatData = [];\n object.int32Data = [];\n object.stringData = [];\n object.int64Data = [];\n object.doubleData = [];\n object.uint64Data = [];\n object.externalData = [];\n }\n if (options.defaults) {\n object.dataType = 0;\n object.segment = null;\n object.name = \"\";\n if (options.bytes === String)\n object.rawData = \"\";\n else {\n object.rawData = [];\n if (options.bytes !== Array)\n object.rawData = $util.newBuffer(object.rawData);\n }\n object.docString = \"\";\n object.dataLocation = options.enums === String ? \"DEFAULT\" : 0;\n }\n if (message.dims && message.dims.length) {\n object.dims = [];\n for (var j = 0; j < message.dims.length; ++j)\n if (typeof message.dims[j] === \"number\")\n object.dims[j] = options.longs === String ? String(message.dims[j]) : message.dims[j];\n else\n object.dims[j] = options.longs === String ? $util.Long.prototype.toString.call(message.dims[j]) : options.longs === Number ? new $util.LongBits(message.dims[j].low >>> 0, message.dims[j].high >>> 0).toNumber() : message.dims[j];\n }\n if (message.dataType != null && message.hasOwnProperty(\"dataType\"))\n object.dataType = message.dataType;\n if (message.segment != null && message.hasOwnProperty(\"segment\"))\n object.segment = $root.onnx.TensorProto.Segment.toObject(message.segment, options);\n if (message.floatData && message.floatData.length) {\n object.floatData = [];\n for (var j = 0; j < message.floatData.length; ++j)\n object.floatData[j] = options.json && !isFinite(message.floatData[j]) ? String(message.floatData[j]) : message.floatData[j];\n }\n if (message.int32Data && message.int32Data.length) {\n object.int32Data = [];\n for (var j = 0; j < message.int32Data.length; ++j)\n object.int32Data[j] = message.int32Data[j];\n }\n if (message.stringData && message.stringData.length) {\n object.stringData = [];\n for (var j = 0; j < message.stringData.length; ++j)\n object.stringData[j] = options.bytes === String ? $util.base64.encode(message.stringData[j], 0, message.stringData[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.stringData[j]) : message.stringData[j];\n }\n if (message.int64Data && message.int64Data.length) {\n object.int64Data = [];\n for (var j = 0; j < message.int64Data.length; ++j)\n if (typeof message.int64Data[j] === \"number\")\n object.int64Data[j] = options.longs === String ? String(message.int64Data[j]) : message.int64Data[j];\n else\n object.int64Data[j] = options.longs === String ? $util.Long.prototype.toString.call(message.int64Data[j]) : options.longs === Number ? new $util.LongBits(message.int64Data[j].low >>> 0, message.int64Data[j].high >>> 0).toNumber() : message.int64Data[j];\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n object.name = message.name;\n if (message.rawData != null && message.hasOwnProperty(\"rawData\"))\n object.rawData = options.bytes === String ? $util.base64.encode(message.rawData, 0, message.rawData.length) : options.bytes === Array ? Array.prototype.slice.call(message.rawData) : message.rawData;\n if (message.doubleData && message.doubleData.length) {\n object.doubleData = [];\n for (var j = 0; j < message.doubleData.length; ++j)\n object.doubleData[j] = options.json && !isFinite(message.doubleData[j]) ? String(message.doubleData[j]) : message.doubleData[j];\n }\n if (message.uint64Data && message.uint64Data.length) {\n object.uint64Data = [];\n for (var j = 0; j < message.uint64Data.length; ++j)\n if (typeof message.uint64Data[j] === \"number\")\n object.uint64Data[j] = options.longs === String ? String(message.uint64Data[j]) : message.uint64Data[j];\n else\n object.uint64Data[j] = options.longs === String ? $util.Long.prototype.toString.call(message.uint64Data[j]) : options.longs === Number ? new $util.LongBits(message.uint64Data[j].low >>> 0, message.uint64Data[j].high >>> 0).toNumber(true) : message.uint64Data[j];\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n object.docString = message.docString;\n if (message.externalData && message.externalData.length) {\n object.externalData = [];\n for (var j = 0; j < message.externalData.length; ++j)\n object.externalData[j] = $root.onnx.StringStringEntryProto.toObject(message.externalData[j], options);\n }\n if (message.dataLocation != null && message.hasOwnProperty(\"dataLocation\"))\n object.dataLocation = options.enums === String ? $root.onnx.TensorProto.DataLocation[message.dataLocation] === undefined ? message.dataLocation : $root.onnx.TensorProto.DataLocation[message.dataLocation] : message.dataLocation;\n return object;\n };\n\n /**\n * Converts this TensorProto to JSON.\n * @function toJSON\n * @memberof onnx.TensorProto\n * @instance\n * @returns {Object.} JSON object\n */\n TensorProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for TensorProto\n * @function getTypeUrl\n * @memberof onnx.TensorProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n TensorProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TensorProto\";\n };\n\n /**\n * DataType enum.\n * @name onnx.TensorProto.DataType\n * @enum {number}\n * @property {number} UNDEFINED=0 UNDEFINED value\n * @property {number} FLOAT=1 FLOAT value\n * @property {number} UINT8=2 UINT8 value\n * @property {number} INT8=3 INT8 value\n * @property {number} UINT16=4 UINT16 value\n * @property {number} INT16=5 INT16 value\n * @property {number} INT32=6 INT32 value\n * @property {number} INT64=7 INT64 value\n * @property {number} STRING=8 STRING value\n * @property {number} BOOL=9 BOOL value\n * @property {number} FLOAT16=10 FLOAT16 value\n * @property {number} DOUBLE=11 DOUBLE value\n * @property {number} UINT32=12 UINT32 value\n * @property {number} UINT64=13 UINT64 value\n * @property {number} COMPLEX64=14 COMPLEX64 value\n * @property {number} COMPLEX128=15 COMPLEX128 value\n * @property {number} BFLOAT16=16 BFLOAT16 value\n * @property {number} FLOAT8E4M3FN=17 FLOAT8E4M3FN value\n * @property {number} FLOAT8E4M3FNUZ=18 FLOAT8E4M3FNUZ value\n * @property {number} FLOAT8E5M2=19 FLOAT8E5M2 value\n * @property {number} FLOAT8E5M2FNUZ=20 FLOAT8E5M2FNUZ value\n */\n TensorProto.DataType = (function() {\n var valuesById = {}, values = Object.create(valuesById);\n values[valuesById[0] = \"UNDEFINED\"] = 0;\n values[valuesById[1] = \"FLOAT\"] = 1;\n values[valuesById[2] = \"UINT8\"] = 2;\n values[valuesById[3] = \"INT8\"] = 3;\n values[valuesById[4] = \"UINT16\"] = 4;\n values[valuesById[5] = \"INT16\"] = 5;\n values[valuesById[6] = \"INT32\"] = 6;\n values[valuesById[7] = \"INT64\"] = 7;\n values[valuesById[8] = \"STRING\"] = 8;\n values[valuesById[9] = \"BOOL\"] = 9;\n values[valuesById[10] = \"FLOAT16\"] = 10;\n values[valuesById[11] = \"DOUBLE\"] = 11;\n values[valuesById[12] = \"UINT32\"] = 12;\n values[valuesById[13] = \"UINT64\"] = 13;\n values[valuesById[14] = \"COMPLEX64\"] = 14;\n values[valuesById[15] = \"COMPLEX128\"] = 15;\n values[valuesById[16] = \"BFLOAT16\"] = 16;\n values[valuesById[17] = \"FLOAT8E4M3FN\"] = 17;\n values[valuesById[18] = \"FLOAT8E4M3FNUZ\"] = 18;\n values[valuesById[19] = \"FLOAT8E5M2\"] = 19;\n values[valuesById[20] = \"FLOAT8E5M2FNUZ\"] = 20;\n return values;\n })();\n\n TensorProto.Segment = (function() {\n\n /**\n * Properties of a Segment.\n * @memberof onnx.TensorProto\n * @interface ISegment\n * @property {number|Long|null} [begin] Segment begin\n * @property {number|Long|null} [end] Segment end\n */\n\n /**\n * Constructs a new Segment.\n * @memberof onnx.TensorProto\n * @classdesc Represents a Segment.\n * @implements ISegment\n * @constructor\n * @param {onnx.TensorProto.ISegment=} [properties] Properties to set\n */\n function Segment(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Segment begin.\n * @member {number|Long} begin\n * @memberof onnx.TensorProto.Segment\n * @instance\n */\n Segment.prototype.begin = $util.Long ? $util.Long.fromBits(0,0,false) : 0;\n\n /**\n * Segment end.\n * @member {number|Long} end\n * @memberof onnx.TensorProto.Segment\n * @instance\n */\n Segment.prototype.end = $util.Long ? $util.Long.fromBits(0,0,false) : 0;\n\n /**\n * Creates a new Segment instance using the specified properties.\n * @function create\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {onnx.TensorProto.ISegment=} [properties] Properties to set\n * @returns {onnx.TensorProto.Segment} Segment instance\n */\n Segment.create = function create(properties) {\n return new Segment(properties);\n };\n\n /**\n * Encodes the specified Segment message. Does not implicitly {@link onnx.TensorProto.Segment.verify|verify} messages.\n * @function encode\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {onnx.TensorProto.ISegment} message Segment message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Segment.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.begin != null && Object.hasOwnProperty.call(message, \"begin\"))\n writer.uint32(/* id 1, wireType 0 =*/8).int64(message.begin);\n if (message.end != null && Object.hasOwnProperty.call(message, \"end\"))\n writer.uint32(/* id 2, wireType 0 =*/16).int64(message.end);\n return writer;\n };\n\n /**\n * Encodes the specified Segment message, length delimited. Does not implicitly {@link onnx.TensorProto.Segment.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {onnx.TensorProto.ISegment} message Segment message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Segment.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Segment message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TensorProto.Segment} Segment\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Segment.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TensorProto.Segment();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.begin = reader.int64();\n break;\n }\n case 2: {\n message.end = reader.int64();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Segment message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TensorProto.Segment} Segment\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Segment.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Segment message.\n * @function verify\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Segment.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.begin != null && message.hasOwnProperty(\"begin\"))\n if (!$util.isInteger(message.begin) && !(message.begin && $util.isInteger(message.begin.low) && $util.isInteger(message.begin.high)))\n return \"begin: integer|Long expected\";\n if (message.end != null && message.hasOwnProperty(\"end\"))\n if (!$util.isInteger(message.end) && !(message.end && $util.isInteger(message.end.low) && $util.isInteger(message.end.high)))\n return \"end: integer|Long expected\";\n return null;\n };\n\n /**\n * Creates a Segment message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TensorProto.Segment} Segment\n */\n Segment.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TensorProto.Segment)\n return object;\n var message = new $root.onnx.TensorProto.Segment();\n if (object.begin != null)\n if ($util.Long)\n (message.begin = $util.Long.fromValue(object.begin)).unsigned = false;\n else if (typeof object.begin === \"string\")\n message.begin = parseInt(object.begin, 10);\n else if (typeof object.begin === \"number\")\n message.begin = object.begin;\n else if (typeof object.begin === \"object\")\n message.begin = new $util.LongBits(object.begin.low >>> 0, object.begin.high >>> 0).toNumber();\n if (object.end != null)\n if ($util.Long)\n (message.end = $util.Long.fromValue(object.end)).unsigned = false;\n else if (typeof object.end === \"string\")\n message.end = parseInt(object.end, 10);\n else if (typeof object.end === \"number\")\n message.end = object.end;\n else if (typeof object.end === \"object\")\n message.end = new $util.LongBits(object.end.low >>> 0, object.end.high >>> 0).toNumber();\n return message;\n };\n\n /**\n * Creates a plain object from a Segment message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {onnx.TensorProto.Segment} message Segment\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Segment.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults) {\n if ($util.Long) {\n var long = new $util.Long(0, 0, false);\n object.begin = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.begin = options.longs === String ? \"0\" : 0;\n if ($util.Long) {\n var long = new $util.Long(0, 0, false);\n object.end = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.end = options.longs === String ? \"0\" : 0;\n }\n if (message.begin != null && message.hasOwnProperty(\"begin\"))\n if (typeof message.begin === \"number\")\n object.begin = options.longs === String ? String(message.begin) : message.begin;\n else\n object.begin = options.longs === String ? $util.Long.prototype.toString.call(message.begin) : options.longs === Number ? new $util.LongBits(message.begin.low >>> 0, message.begin.high >>> 0).toNumber() : message.begin;\n if (message.end != null && message.hasOwnProperty(\"end\"))\n if (typeof message.end === \"number\")\n object.end = options.longs === String ? String(message.end) : message.end;\n else\n object.end = options.longs === String ? $util.Long.prototype.toString.call(message.end) : options.longs === Number ? new $util.LongBits(message.end.low >>> 0, message.end.high >>> 0).toNumber() : message.end;\n return object;\n };\n\n /**\n * Converts this Segment to JSON.\n * @function toJSON\n * @memberof onnx.TensorProto.Segment\n * @instance\n * @returns {Object.} JSON object\n */\n Segment.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for Segment\n * @function getTypeUrl\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n Segment.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TensorProto.Segment\";\n };\n\n return Segment;\n })();\n\n /**\n * DataLocation enum.\n * @name onnx.TensorProto.DataLocation\n * @enum {number}\n * @property {number} DEFAULT=0 DEFAULT value\n * @property {number} EXTERNAL=1 EXTERNAL value\n */\n TensorProto.DataLocation = (function() {\n var valuesById = {}, values = Object.create(valuesById);\n values[valuesById[0] = \"DEFAULT\"] = 0;\n values[valuesById[1] = \"EXTERNAL\"] = 1;\n return values;\n })();\n\n return TensorProto;\n })();\n\n onnx.SparseTensorProto = (function() {\n\n /**\n * Properties of a SparseTensorProto.\n * @memberof onnx\n * @interface ISparseTensorProto\n * @property {onnx.ITensorProto|null} [values] SparseTensorProto values\n * @property {onnx.ITensorProto|null} [indices] SparseTensorProto indices\n * @property {Array.|null} [dims] SparseTensorProto dims\n */\n\n /**\n * Constructs a new SparseTensorProto.\n * @memberof onnx\n * @classdesc Represents a SparseTensorProto.\n * @implements ISparseTensorProto\n * @constructor\n * @param {onnx.ISparseTensorProto=} [properties] Properties to set\n */\n function SparseTensorProto(properties) {\n this.dims = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * SparseTensorProto values.\n * @member {onnx.ITensorProto|null|undefined} values\n * @memberof onnx.SparseTensorProto\n * @instance\n */\n SparseTensorProto.prototype.values = null;\n\n /**\n * SparseTensorProto indices.\n * @member {onnx.ITensorProto|null|undefined} indices\n * @memberof onnx.SparseTensorProto\n * @instance\n */\n SparseTensorProto.prototype.indices = null;\n\n /**\n * SparseTensorProto dims.\n * @member {Array.} dims\n * @memberof onnx.SparseTensorProto\n * @instance\n */\n SparseTensorProto.prototype.dims = $util.emptyArray;\n\n /**\n * Creates a new SparseTensorProto instance using the specified properties.\n * @function create\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {onnx.ISparseTensorProto=} [properties] Properties to set\n * @returns {onnx.SparseTensorProto} SparseTensorProto instance\n */\n SparseTensorProto.create = function create(properties) {\n return new SparseTensorProto(properties);\n };\n\n /**\n * Encodes the specified SparseTensorProto message. Does not implicitly {@link onnx.SparseTensorProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {onnx.ISparseTensorProto} message SparseTensorProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n SparseTensorProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.values != null && Object.hasOwnProperty.call(message, \"values\"))\n $root.onnx.TensorProto.encode(message.values, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n if (message.indices != null && Object.hasOwnProperty.call(message, \"indices\"))\n $root.onnx.TensorProto.encode(message.indices, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\n if (message.dims != null && message.dims.length) {\n writer.uint32(/* id 3, wireType 2 =*/26).fork();\n for (var i = 0; i < message.dims.length; ++i)\n writer.int64(message.dims[i]);\n writer.ldelim();\n }\n return writer;\n };\n\n /**\n * Encodes the specified SparseTensorProto message, length delimited. Does not implicitly {@link onnx.SparseTensorProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {onnx.ISparseTensorProto} message SparseTensorProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n SparseTensorProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a SparseTensorProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.SparseTensorProto} SparseTensorProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n SparseTensorProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.SparseTensorProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.values = $root.onnx.TensorProto.decode(reader, reader.uint32());\n break;\n }\n case 2: {\n message.indices = $root.onnx.TensorProto.decode(reader, reader.uint32());\n break;\n }\n case 3: {\n if (!(message.dims && message.dims.length))\n message.dims = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.dims.push(reader.int64());\n } else\n message.dims.push(reader.int64());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a SparseTensorProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.SparseTensorProto} SparseTensorProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n SparseTensorProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a SparseTensorProto message.\n * @function verify\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n SparseTensorProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.values != null && message.hasOwnProperty(\"values\")) {\n var error = $root.onnx.TensorProto.verify(message.values);\n if (error)\n return \"values.\" + error;\n }\n if (message.indices != null && message.hasOwnProperty(\"indices\")) {\n var error = $root.onnx.TensorProto.verify(message.indices);\n if (error)\n return \"indices.\" + error;\n }\n if (message.dims != null && message.hasOwnProperty(\"dims\")) {\n if (!Array.isArray(message.dims))\n return \"dims: array expected\";\n for (var i = 0; i < message.dims.length; ++i)\n if (!$util.isInteger(message.dims[i]) && !(message.dims[i] && $util.isInteger(message.dims[i].low) && $util.isInteger(message.dims[i].high)))\n return \"dims: integer|Long[] expected\";\n }\n return null;\n };\n\n /**\n * Creates a SparseTensorProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.SparseTensorProto} SparseTensorProto\n */\n SparseTensorProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.SparseTensorProto)\n return object;\n var message = new $root.onnx.SparseTensorProto();\n if (object.values != null) {\n if (typeof object.values !== \"object\")\n throw TypeError(\".onnx.SparseTensorProto.values: object expected\");\n message.values = $root.onnx.TensorProto.fromObject(object.values);\n }\n if (object.indices != null) {\n if (typeof object.indices !== \"object\")\n throw TypeError(\".onnx.SparseTensorProto.indices: object expected\");\n message.indices = $root.onnx.TensorProto.fromObject(object.indices);\n }\n if (object.dims) {\n if (!Array.isArray(object.dims))\n throw TypeError(\".onnx.SparseTensorProto.dims: array expected\");\n message.dims = [];\n for (var i = 0; i < object.dims.length; ++i)\n if ($util.Long)\n (message.dims[i] = $util.Long.fromValue(object.dims[i])).unsigned = false;\n else if (typeof object.dims[i] === \"string\")\n message.dims[i] = parseInt(object.dims[i], 10);\n else if (typeof object.dims[i] === \"number\")\n message.dims[i] = object.dims[i];\n else if (typeof object.dims[i] === \"object\")\n message.dims[i] = new $util.LongBits(object.dims[i].low >>> 0, object.dims[i].high >>> 0).toNumber();\n }\n return message;\n };\n\n /**\n * Creates a plain object from a SparseTensorProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {onnx.SparseTensorProto} message SparseTensorProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n SparseTensorProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.dims = [];\n if (options.defaults) {\n object.values = null;\n object.indices = null;\n }\n if (message.values != null && message.hasOwnProperty(\"values\"))\n object.values = $root.onnx.TensorProto.toObject(message.values, options);\n if (message.indices != null && message.hasOwnProperty(\"indices\"))\n object.indices = $root.onnx.TensorProto.toObject(message.indices, options);\n if (message.dims && message.dims.length) {\n object.dims = [];\n for (var j = 0; j < message.dims.length; ++j)\n if (typeof message.dims[j] === \"number\")\n object.dims[j] = options.longs === String ? String(message.dims[j]) : message.dims[j];\n else\n object.dims[j] = options.longs === String ? $util.Long.prototype.toString.call(message.dims[j]) : options.longs === Number ? new $util.LongBits(message.dims[j].low >>> 0, message.dims[j].high >>> 0).toNumber() : message.dims[j];\n }\n return object;\n };\n\n /**\n * Converts this SparseTensorProto to JSON.\n * @function toJSON\n * @memberof onnx.SparseTensorProto\n * @instance\n * @returns {Object.} JSON object\n */\n SparseTensorProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for SparseTensorProto\n * @function getTypeUrl\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n SparseTensorProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.SparseTensorProto\";\n };\n\n return SparseTensorProto;\n })();\n\n onnx.TensorShapeProto = (function() {\n\n /**\n * Properties of a TensorShapeProto.\n * @memberof onnx\n * @interface ITensorShapeProto\n * @property {Array.|null} [dim] TensorShapeProto dim\n */\n\n /**\n * Constructs a new TensorShapeProto.\n * @memberof onnx\n * @classdesc Represents a TensorShapeProto.\n * @implements ITensorShapeProto\n * @constructor\n * @param {onnx.ITensorShapeProto=} [properties] Properties to set\n */\n function TensorShapeProto(properties) {\n this.dim = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * TensorShapeProto dim.\n * @member {Array.} dim\n * @memberof onnx.TensorShapeProto\n * @instance\n */\n TensorShapeProto.prototype.dim = $util.emptyArray;\n\n /**\n * Creates a new TensorShapeProto instance using the specified properties.\n * @function create\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {onnx.ITensorShapeProto=} [properties] Properties to set\n * @returns {onnx.TensorShapeProto} TensorShapeProto instance\n */\n TensorShapeProto.create = function create(properties) {\n return new TensorShapeProto(properties);\n };\n\n /**\n * Encodes the specified TensorShapeProto message. Does not implicitly {@link onnx.TensorShapeProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {onnx.ITensorShapeProto} message TensorShapeProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TensorShapeProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.dim != null && message.dim.length)\n for (var i = 0; i < message.dim.length; ++i)\n $root.onnx.TensorShapeProto.Dimension.encode(message.dim[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified TensorShapeProto message, length delimited. Does not implicitly {@link onnx.TensorShapeProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {onnx.ITensorShapeProto} message TensorShapeProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TensorShapeProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a TensorShapeProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TensorShapeProto} TensorShapeProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TensorShapeProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TensorShapeProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n if (!(message.dim && message.dim.length))\n message.dim = [];\n message.dim.push($root.onnx.TensorShapeProto.Dimension.decode(reader, reader.uint32()));\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a TensorShapeProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TensorShapeProto} TensorShapeProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TensorShapeProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a TensorShapeProto message.\n * @function verify\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n TensorShapeProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.dim != null && message.hasOwnProperty(\"dim\")) {\n if (!Array.isArray(message.dim))\n return \"dim: array expected\";\n for (var i = 0; i < message.dim.length; ++i) {\n var error = $root.onnx.TensorShapeProto.Dimension.verify(message.dim[i]);\n if (error)\n return \"dim.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates a TensorShapeProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TensorShapeProto} TensorShapeProto\n */\n TensorShapeProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TensorShapeProto)\n return object;\n var message = new $root.onnx.TensorShapeProto();\n if (object.dim) {\n if (!Array.isArray(object.dim))\n throw TypeError(\".onnx.TensorShapeProto.dim: array expected\");\n message.dim = [];\n for (var i = 0; i < object.dim.length; ++i) {\n if (typeof object.dim[i] !== \"object\")\n throw TypeError(\".onnx.TensorShapeProto.dim: object expected\");\n message.dim[i] = $root.onnx.TensorShapeProto.Dimension.fromObject(object.dim[i]);\n }\n }\n return message;\n };\n\n /**\n * Creates a plain object from a TensorShapeProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {onnx.TensorShapeProto} message TensorShapeProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n TensorShapeProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.dim = [];\n if (message.dim && message.dim.length) {\n object.dim = [];\n for (var j = 0; j < message.dim.length; ++j)\n object.dim[j] = $root.onnx.TensorShapeProto.Dimension.toObject(message.dim[j], options);\n }\n return object;\n };\n\n /**\n * Converts this TensorShapeProto to JSON.\n * @function toJSON\n * @memberof onnx.TensorShapeProto\n * @instance\n * @returns {Object.} JSON object\n */\n TensorShapeProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for TensorShapeProto\n * @function getTypeUrl\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n TensorShapeProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TensorShapeProto\";\n };\n\n TensorShapeProto.Dimension = (function() {\n\n /**\n * Properties of a Dimension.\n * @memberof onnx.TensorShapeProto\n * @interface IDimension\n * @property {number|Long|null} [dimValue] Dimension dimValue\n * @property {string|null} [dimParam] Dimension dimParam\n * @property {string|null} [denotation] Dimension denotation\n */\n\n /**\n * Constructs a new Dimension.\n * @memberof onnx.TensorShapeProto\n * @classdesc Represents a Dimension.\n * @implements IDimension\n * @constructor\n * @param {onnx.TensorShapeProto.IDimension=} [properties] Properties to set\n */\n function Dimension(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Dimension dimValue.\n * @member {number|Long|null|undefined} dimValue\n * @memberof onnx.TensorShapeProto.Dimension\n * @instance\n */\n Dimension.prototype.dimValue = null;\n\n /**\n * Dimension dimParam.\n * @member {string|null|undefined} dimParam\n * @memberof onnx.TensorShapeProto.Dimension\n * @instance\n */\n Dimension.prototype.dimParam = null;\n\n /**\n * Dimension denotation.\n * @member {string} denotation\n * @memberof onnx.TensorShapeProto.Dimension\n * @instance\n */\n Dimension.prototype.denotation = \"\";\n\n // OneOf field names bound to virtual getters and setters\n var $oneOfFields;\n\n /**\n * Dimension value.\n * @member {\"dimValue\"|\"dimParam\"|undefined} value\n * @memberof onnx.TensorShapeProto.Dimension\n * @instance\n */\n Object.defineProperty(Dimension.prototype, \"value\", {\n get: $util.oneOfGetter($oneOfFields = [\"dimValue\", \"dimParam\"]),\n set: $util.oneOfSetter($oneOfFields)\n });\n\n /**\n * Creates a new Dimension instance using the specified properties.\n * @function create\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {onnx.TensorShapeProto.IDimension=} [properties] Properties to set\n * @returns {onnx.TensorShapeProto.Dimension} Dimension instance\n */\n Dimension.create = function create(properties) {\n return new Dimension(properties);\n };\n\n /**\n * Encodes the specified Dimension message. Does not implicitly {@link onnx.TensorShapeProto.Dimension.verify|verify} messages.\n * @function encode\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {onnx.TensorShapeProto.IDimension} message Dimension message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Dimension.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.dimValue != null && Object.hasOwnProperty.call(message, \"dimValue\"))\n writer.uint32(/* id 1, wireType 0 =*/8).int64(message.dimValue);\n if (message.dimParam != null && Object.hasOwnProperty.call(message, \"dimParam\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.dimParam);\n if (message.denotation != null && Object.hasOwnProperty.call(message, \"denotation\"))\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.denotation);\n return writer;\n };\n\n /**\n * Encodes the specified Dimension message, length delimited. Does not implicitly {@link onnx.TensorShapeProto.Dimension.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {onnx.TensorShapeProto.IDimension} message Dimension message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Dimension.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Dimension message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TensorShapeProto.Dimension} Dimension\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Dimension.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TensorShapeProto.Dimension();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.dimValue = reader.int64();\n break;\n }\n case 2: {\n message.dimParam = reader.string();\n break;\n }\n case 3: {\n message.denotation = reader.string();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Dimension message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TensorShapeProto.Dimension} Dimension\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Dimension.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Dimension message.\n * @function verify\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Dimension.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n var properties = {};\n if (message.dimValue != null && message.hasOwnProperty(\"dimValue\")) {\n properties.value = 1;\n if (!$util.isInteger(message.dimValue) && !(message.dimValue && $util.isInteger(message.dimValue.low) && $util.isInteger(message.dimValue.high)))\n return \"dimValue: integer|Long expected\";\n }\n if (message.dimParam != null && message.hasOwnProperty(\"dimParam\")) {\n if (properties.value === 1)\n return \"value: multiple values\";\n properties.value = 1;\n if (!$util.isString(message.dimParam))\n return \"dimParam: string expected\";\n }\n if (message.denotation != null && message.hasOwnProperty(\"denotation\"))\n if (!$util.isString(message.denotation))\n return \"denotation: string expected\";\n return null;\n };\n\n /**\n * Creates a Dimension message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TensorShapeProto.Dimension} Dimension\n */\n Dimension.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TensorShapeProto.Dimension)\n return object;\n var message = new $root.onnx.TensorShapeProto.Dimension();\n if (object.dimValue != null)\n if ($util.Long)\n (message.dimValue = $util.Long.fromValue(object.dimValue)).unsigned = false;\n else if (typeof object.dimValue === \"string\")\n message.dimValue = parseInt(object.dimValue, 10);\n else if (typeof object.dimValue === \"number\")\n message.dimValue = object.dimValue;\n else if (typeof object.dimValue === \"object\")\n message.dimValue = new $util.LongBits(object.dimValue.low >>> 0, object.dimValue.high >>> 0).toNumber();\n if (object.dimParam != null)\n message.dimParam = String(object.dimParam);\n if (object.denotation != null)\n message.denotation = String(object.denotation);\n return message;\n };\n\n /**\n * Creates a plain object from a Dimension message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {onnx.TensorShapeProto.Dimension} message Dimension\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Dimension.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults)\n object.denotation = \"\";\n if (message.dimValue != null && message.hasOwnProperty(\"dimValue\")) {\n if (typeof message.dimValue === \"number\")\n object.dimValue = options.longs === String ? String(message.dimValue) : message.dimValue;\n else\n object.dimValue = options.longs === String ? $util.Long.prototype.toString.call(message.dimValue) : options.longs === Number ? new $util.LongBits(message.dimValue.low >>> 0, message.dimValue.high >>> 0).toNumber() : message.dimValue;\n if (options.oneofs)\n object.value = \"dimValue\";\n }\n if (message.dimParam != null && message.hasOwnProperty(\"dimParam\")) {\n object.dimParam = message.dimParam;\n if (options.oneofs)\n object.value = \"dimParam\";\n }\n if (message.denotation != null && message.hasOwnProperty(\"denotation\"))\n object.denotation = message.denotation;\n return object;\n };\n\n /**\n * Converts this Dimension to JSON.\n * @function toJSON\n * @memberof onnx.TensorShapeProto.Dimension\n * @instance\n * @returns {Object.} JSON object\n */\n Dimension.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for Dimension\n * @function getTypeUrl\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n Dimension.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TensorShapeProto.Dimension\";\n };\n\n return Dimension;\n })();\n\n return TensorShapeProto;\n })();\n\n onnx.TypeProto = (function() {\n\n /**\n * Properties of a TypeProto.\n * @memberof onnx\n * @interface ITypeProto\n * @property {onnx.TypeProto.ITensor|null} [tensorType] TypeProto tensorType\n * @property {onnx.TypeProto.ISequence|null} [sequenceType] TypeProto sequenceType\n * @property {onnx.TypeProto.IMap|null} [mapType] TypeProto mapType\n * @property {onnx.TypeProto.IOptional|null} [optionalType] TypeProto optionalType\n * @property {onnx.TypeProto.ISparseTensor|null} [sparseTensorType] TypeProto sparseTensorType\n * @property {string|null} [denotation] TypeProto denotation\n */\n\n /**\n * Constructs a new TypeProto.\n * @memberof onnx\n * @classdesc Represents a TypeProto.\n * @implements ITypeProto\n * @constructor\n * @param {onnx.ITypeProto=} [properties] Properties to set\n */\n function TypeProto(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * TypeProto tensorType.\n * @member {onnx.TypeProto.ITensor|null|undefined} tensorType\n * @memberof onnx.TypeProto\n * @instance\n */\n TypeProto.prototype.tensorType = null;\n\n /**\n * TypeProto sequenceType.\n * @member {onnx.TypeProto.ISequence|null|undefined} sequenceType\n * @memberof onnx.TypeProto\n * @instance\n */\n TypeProto.prototype.sequenceType = null;\n\n /**\n * TypeProto mapType.\n * @member {onnx.TypeProto.IMap|null|undefined} mapType\n * @memberof onnx.TypeProto\n * @instance\n */\n TypeProto.prototype.mapType = null;\n\n /**\n * TypeProto optionalType.\n * @member {onnx.TypeProto.IOptional|null|undefined} optionalType\n * @memberof onnx.TypeProto\n * @instance\n */\n TypeProto.prototype.optionalType = null;\n\n /**\n * TypeProto sparseTensorType.\n * @member {onnx.TypeProto.ISparseTensor|null|undefined} sparseTensorType\n * @memberof onnx.TypeProto\n * @instance\n */\n TypeProto.prototype.sparseTensorType = null;\n\n /**\n * TypeProto denotation.\n * @member {string} denotation\n * @memberof onnx.TypeProto\n * @instance\n */\n TypeProto.prototype.denotation = \"\";\n\n // OneOf field names bound to virtual getters and setters\n var $oneOfFields;\n\n /**\n * TypeProto value.\n * @member {\"tensorType\"|\"sequenceType\"|\"mapType\"|\"optionalType\"|\"sparseTensorType\"|undefined} value\n * @memberof onnx.TypeProto\n * @instance\n */\n Object.defineProperty(TypeProto.prototype, \"value\", {\n get: $util.oneOfGetter($oneOfFields = [\"tensorType\", \"sequenceType\", \"mapType\", \"optionalType\", \"sparseTensorType\"]),\n set: $util.oneOfSetter($oneOfFields)\n });\n\n /**\n * Creates a new TypeProto instance using the specified properties.\n * @function create\n * @memberof onnx.TypeProto\n * @static\n * @param {onnx.ITypeProto=} [properties] Properties to set\n * @returns {onnx.TypeProto} TypeProto instance\n */\n TypeProto.create = function create(properties) {\n return new TypeProto(properties);\n };\n\n /**\n * Encodes the specified TypeProto message. Does not implicitly {@link onnx.TypeProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.TypeProto\n * @static\n * @param {onnx.ITypeProto} message TypeProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TypeProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.tensorType != null && Object.hasOwnProperty.call(message, \"tensorType\"))\n $root.onnx.TypeProto.Tensor.encode(message.tensorType, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n if (message.sequenceType != null && Object.hasOwnProperty.call(message, \"sequenceType\"))\n $root.onnx.TypeProto.Sequence.encode(message.sequenceType, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();\n if (message.mapType != null && Object.hasOwnProperty.call(message, \"mapType\"))\n $root.onnx.TypeProto.Map.encode(message.mapType, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\n if (message.denotation != null && Object.hasOwnProperty.call(message, \"denotation\"))\n writer.uint32(/* id 6, wireType 2 =*/50).string(message.denotation);\n if (message.sparseTensorType != null && Object.hasOwnProperty.call(message, \"sparseTensorType\"))\n $root.onnx.TypeProto.SparseTensor.encode(message.sparseTensorType, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();\n if (message.optionalType != null && Object.hasOwnProperty.call(message, \"optionalType\"))\n $root.onnx.TypeProto.Optional.encode(message.optionalType, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified TypeProto message, length delimited. Does not implicitly {@link onnx.TypeProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TypeProto\n * @static\n * @param {onnx.ITypeProto} message TypeProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TypeProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a TypeProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TypeProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TypeProto} TypeProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TypeProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TypeProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.tensorType = $root.onnx.TypeProto.Tensor.decode(reader, reader.uint32());\n break;\n }\n case 4: {\n message.sequenceType = $root.onnx.TypeProto.Sequence.decode(reader, reader.uint32());\n break;\n }\n case 5: {\n message.mapType = $root.onnx.TypeProto.Map.decode(reader, reader.uint32());\n break;\n }\n case 9: {\n message.optionalType = $root.onnx.TypeProto.Optional.decode(reader, reader.uint32());\n break;\n }\n case 8: {\n message.sparseTensorType = $root.onnx.TypeProto.SparseTensor.decode(reader, reader.uint32());\n break;\n }\n case 6: {\n message.denotation = reader.string();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a TypeProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TypeProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TypeProto} TypeProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TypeProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a TypeProto message.\n * @function verify\n * @memberof onnx.TypeProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n TypeProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n var properties = {};\n if (message.tensorType != null && message.hasOwnProperty(\"tensorType\")) {\n properties.value = 1;\n {\n var error = $root.onnx.TypeProto.Tensor.verify(message.tensorType);\n if (error)\n return \"tensorType.\" + error;\n }\n }\n if (message.sequenceType != null && message.hasOwnProperty(\"sequenceType\")) {\n if (properties.value === 1)\n return \"value: multiple values\";\n properties.value = 1;\n {\n var error = $root.onnx.TypeProto.Sequence.verify(message.sequenceType);\n if (error)\n return \"sequenceType.\" + error;\n }\n }\n if (message.mapType != null && message.hasOwnProperty(\"mapType\")) {\n if (properties.value === 1)\n return \"value: multiple values\";\n properties.value = 1;\n {\n var error = $root.onnx.TypeProto.Map.verify(message.mapType);\n if (error)\n return \"mapType.\" + error;\n }\n }\n if (message.optionalType != null && message.hasOwnProperty(\"optionalType\")) {\n if (properties.value === 1)\n return \"value: multiple values\";\n properties.value = 1;\n {\n var error = $root.onnx.TypeProto.Optional.verify(message.optionalType);\n if (error)\n return \"optionalType.\" + error;\n }\n }\n if (message.sparseTensorType != null && message.hasOwnProperty(\"sparseTensorType\")) {\n if (properties.value === 1)\n return \"value: multiple values\";\n properties.value = 1;\n {\n var error = $root.onnx.TypeProto.SparseTensor.verify(message.sparseTensorType);\n if (error)\n return \"sparseTensorType.\" + error;\n }\n }\n if (message.denotation != null && message.hasOwnProperty(\"denotation\"))\n if (!$util.isString(message.denotation))\n return \"denotation: string expected\";\n return null;\n };\n\n /**\n * Creates a TypeProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TypeProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TypeProto} TypeProto\n */\n TypeProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TypeProto)\n return object;\n var message = new $root.onnx.TypeProto();\n if (object.tensorType != null) {\n if (typeof object.tensorType !== \"object\")\n throw TypeError(\".onnx.TypeProto.tensorType: object expected\");\n message.tensorType = $root.onnx.TypeProto.Tensor.fromObject(object.tensorType);\n }\n if (object.sequenceType != null) {\n if (typeof object.sequenceType !== \"object\")\n throw TypeError(\".onnx.TypeProto.sequenceType: object expected\");\n message.sequenceType = $root.onnx.TypeProto.Sequence.fromObject(object.sequenceType);\n }\n if (object.mapType != null) {\n if (typeof object.mapType !== \"object\")\n throw TypeError(\".onnx.TypeProto.mapType: object expected\");\n message.mapType = $root.onnx.TypeProto.Map.fromObject(object.mapType);\n }\n if (object.optionalType != null) {\n if (typeof object.optionalType !== \"object\")\n throw TypeError(\".onnx.TypeProto.optionalType: object expected\");\n message.optionalType = $root.onnx.TypeProto.Optional.fromObject(object.optionalType);\n }\n if (object.sparseTensorType != null) {\n if (typeof object.sparseTensorType !== \"object\")\n throw TypeError(\".onnx.TypeProto.sparseTensorType: object expected\");\n message.sparseTensorType = $root.onnx.TypeProto.SparseTensor.fromObject(object.sparseTensorType);\n }\n if (object.denotation != null)\n message.denotation = String(object.denotation);\n return message;\n };\n\n /**\n * Creates a plain object from a TypeProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TypeProto\n * @static\n * @param {onnx.TypeProto} message TypeProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n TypeProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults)\n object.denotation = \"\";\n if (message.tensorType != null && message.hasOwnProperty(\"tensorType\")) {\n object.tensorType = $root.onnx.TypeProto.Tensor.toObject(message.tensorType, options);\n if (options.oneofs)\n object.value = \"tensorType\";\n }\n if (message.sequenceType != null && message.hasOwnProperty(\"sequenceType\")) {\n object.sequenceType = $root.onnx.TypeProto.Sequence.toObject(message.sequenceType, options);\n if (options.oneofs)\n object.value = \"sequenceType\";\n }\n if (message.mapType != null && message.hasOwnProperty(\"mapType\")) {\n object.mapType = $root.onnx.TypeProto.Map.toObject(message.mapType, options);\n if (options.oneofs)\n object.value = \"mapType\";\n }\n if (message.denotation != null && message.hasOwnProperty(\"denotation\"))\n object.denotation = message.denotation;\n if (message.sparseTensorType != null && message.hasOwnProperty(\"sparseTensorType\")) {\n object.sparseTensorType = $root.onnx.TypeProto.SparseTensor.toObject(message.sparseTensorType, options);\n if (options.oneofs)\n object.value = \"sparseTensorType\";\n }\n if (message.optionalType != null && message.hasOwnProperty(\"optionalType\")) {\n object.optionalType = $root.onnx.TypeProto.Optional.toObject(message.optionalType, options);\n if (options.oneofs)\n object.value = \"optionalType\";\n }\n return object;\n };\n\n /**\n * Converts this TypeProto to JSON.\n * @function toJSON\n * @memberof onnx.TypeProto\n * @instance\n * @returns {Object.} JSON object\n */\n TypeProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for TypeProto\n * @function getTypeUrl\n * @memberof onnx.TypeProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n TypeProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TypeProto\";\n };\n\n TypeProto.Tensor = (function() {\n\n /**\n * Properties of a Tensor.\n * @memberof onnx.TypeProto\n * @interface ITensor\n * @property {number|null} [elemType] Tensor elemType\n * @property {onnx.ITensorShapeProto|null} [shape] Tensor shape\n */\n\n /**\n * Constructs a new Tensor.\n * @memberof onnx.TypeProto\n * @classdesc Represents a Tensor.\n * @implements ITensor\n * @constructor\n * @param {onnx.TypeProto.ITensor=} [properties] Properties to set\n */\n function Tensor(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Tensor elemType.\n * @member {number} elemType\n * @memberof onnx.TypeProto.Tensor\n * @instance\n */\n Tensor.prototype.elemType = 0;\n\n /**\n * Tensor shape.\n * @member {onnx.ITensorShapeProto|null|undefined} shape\n * @memberof onnx.TypeProto.Tensor\n * @instance\n */\n Tensor.prototype.shape = null;\n\n /**\n * Creates a new Tensor instance using the specified properties.\n * @function create\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {onnx.TypeProto.ITensor=} [properties] Properties to set\n * @returns {onnx.TypeProto.Tensor} Tensor instance\n */\n Tensor.create = function create(properties) {\n return new Tensor(properties);\n };\n\n /**\n * Encodes the specified Tensor message. Does not implicitly {@link onnx.TypeProto.Tensor.verify|verify} messages.\n * @function encode\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {onnx.TypeProto.ITensor} message Tensor message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Tensor.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.elemType != null && Object.hasOwnProperty.call(message, \"elemType\"))\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.elemType);\n if (message.shape != null && Object.hasOwnProperty.call(message, \"shape\"))\n $root.onnx.TensorShapeProto.encode(message.shape, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified Tensor message, length delimited. Does not implicitly {@link onnx.TypeProto.Tensor.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {onnx.TypeProto.ITensor} message Tensor message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Tensor.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Tensor message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TypeProto.Tensor} Tensor\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Tensor.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TypeProto.Tensor();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.elemType = reader.int32();\n break;\n }\n case 2: {\n message.shape = $root.onnx.TensorShapeProto.decode(reader, reader.uint32());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Tensor message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TypeProto.Tensor} Tensor\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Tensor.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Tensor message.\n * @function verify\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Tensor.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.elemType != null && message.hasOwnProperty(\"elemType\"))\n if (!$util.isInteger(message.elemType))\n return \"elemType: integer expected\";\n if (message.shape != null && message.hasOwnProperty(\"shape\")) {\n var error = $root.onnx.TensorShapeProto.verify(message.shape);\n if (error)\n return \"shape.\" + error;\n }\n return null;\n };\n\n /**\n * Creates a Tensor message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TypeProto.Tensor} Tensor\n */\n Tensor.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TypeProto.Tensor)\n return object;\n var message = new $root.onnx.TypeProto.Tensor();\n if (object.elemType != null)\n message.elemType = object.elemType | 0;\n if (object.shape != null) {\n if (typeof object.shape !== \"object\")\n throw TypeError(\".onnx.TypeProto.Tensor.shape: object expected\");\n message.shape = $root.onnx.TensorShapeProto.fromObject(object.shape);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a Tensor message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {onnx.TypeProto.Tensor} message Tensor\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Tensor.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults) {\n object.elemType = 0;\n object.shape = null;\n }\n if (message.elemType != null && message.hasOwnProperty(\"elemType\"))\n object.elemType = message.elemType;\n if (message.shape != null && message.hasOwnProperty(\"shape\"))\n object.shape = $root.onnx.TensorShapeProto.toObject(message.shape, options);\n return object;\n };\n\n /**\n * Converts this Tensor to JSON.\n * @function toJSON\n * @memberof onnx.TypeProto.Tensor\n * @instance\n * @returns {Object.} JSON object\n */\n Tensor.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for Tensor\n * @function getTypeUrl\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n Tensor.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TypeProto.Tensor\";\n };\n\n return Tensor;\n })();\n\n TypeProto.Sequence = (function() {\n\n /**\n * Properties of a Sequence.\n * @memberof onnx.TypeProto\n * @interface ISequence\n * @property {onnx.ITypeProto|null} [elemType] Sequence elemType\n */\n\n /**\n * Constructs a new Sequence.\n * @memberof onnx.TypeProto\n * @classdesc Represents a Sequence.\n * @implements ISequence\n * @constructor\n * @param {onnx.TypeProto.ISequence=} [properties] Properties to set\n */\n function Sequence(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Sequence elemType.\n * @member {onnx.ITypeProto|null|undefined} elemType\n * @memberof onnx.TypeProto.Sequence\n * @instance\n */\n Sequence.prototype.elemType = null;\n\n /**\n * Creates a new Sequence instance using the specified properties.\n * @function create\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {onnx.TypeProto.ISequence=} [properties] Properties to set\n * @returns {onnx.TypeProto.Sequence} Sequence instance\n */\n Sequence.create = function create(properties) {\n return new Sequence(properties);\n };\n\n /**\n * Encodes the specified Sequence message. Does not implicitly {@link onnx.TypeProto.Sequence.verify|verify} messages.\n * @function encode\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {onnx.TypeProto.ISequence} message Sequence message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Sequence.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.elemType != null && Object.hasOwnProperty.call(message, \"elemType\"))\n $root.onnx.TypeProto.encode(message.elemType, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified Sequence message, length delimited. Does not implicitly {@link onnx.TypeProto.Sequence.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {onnx.TypeProto.ISequence} message Sequence message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Sequence.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Sequence message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TypeProto.Sequence} Sequence\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Sequence.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TypeProto.Sequence();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.elemType = $root.onnx.TypeProto.decode(reader, reader.uint32());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Sequence message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TypeProto.Sequence} Sequence\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Sequence.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Sequence message.\n * @function verify\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Sequence.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.elemType != null && message.hasOwnProperty(\"elemType\")) {\n var error = $root.onnx.TypeProto.verify(message.elemType);\n if (error)\n return \"elemType.\" + error;\n }\n return null;\n };\n\n /**\n * Creates a Sequence message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TypeProto.Sequence} Sequence\n */\n Sequence.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TypeProto.Sequence)\n return object;\n var message = new $root.onnx.TypeProto.Sequence();\n if (object.elemType != null) {\n if (typeof object.elemType !== \"object\")\n throw TypeError(\".onnx.TypeProto.Sequence.elemType: object expected\");\n message.elemType = $root.onnx.TypeProto.fromObject(object.elemType);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a Sequence message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {onnx.TypeProto.Sequence} message Sequence\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Sequence.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults)\n object.elemType = null;\n if (message.elemType != null && message.hasOwnProperty(\"elemType\"))\n object.elemType = $root.onnx.TypeProto.toObject(message.elemType, options);\n return object;\n };\n\n /**\n * Converts this Sequence to JSON.\n * @function toJSON\n * @memberof onnx.TypeProto.Sequence\n * @instance\n * @returns {Object.} JSON object\n */\n Sequence.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for Sequence\n * @function getTypeUrl\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n Sequence.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TypeProto.Sequence\";\n };\n\n return Sequence;\n })();\n\n TypeProto.Map = (function() {\n\n /**\n * Properties of a Map.\n * @memberof onnx.TypeProto\n * @interface IMap\n * @property {number|null} [keyType] Map keyType\n * @property {onnx.ITypeProto|null} [valueType] Map valueType\n */\n\n /**\n * Constructs a new Map.\n * @memberof onnx.TypeProto\n * @classdesc Represents a Map.\n * @implements IMap\n * @constructor\n * @param {onnx.TypeProto.IMap=} [properties] Properties to set\n */\n function Map(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Map keyType.\n * @member {number} keyType\n * @memberof onnx.TypeProto.Map\n * @instance\n */\n Map.prototype.keyType = 0;\n\n /**\n * Map valueType.\n * @member {onnx.ITypeProto|null|undefined} valueType\n * @memberof onnx.TypeProto.Map\n * @instance\n */\n Map.prototype.valueType = null;\n\n /**\n * Creates a new Map instance using the specified properties.\n * @function create\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {onnx.TypeProto.IMap=} [properties] Properties to set\n * @returns {onnx.TypeProto.Map} Map instance\n */\n Map.create = function create(properties) {\n return new Map(properties);\n };\n\n /**\n * Encodes the specified Map message. Does not implicitly {@link onnx.TypeProto.Map.verify|verify} messages.\n * @function encode\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {onnx.TypeProto.IMap} message Map message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Map.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.keyType != null && Object.hasOwnProperty.call(message, \"keyType\"))\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.keyType);\n if (message.valueType != null && Object.hasOwnProperty.call(message, \"valueType\"))\n $root.onnx.TypeProto.encode(message.valueType, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified Map message, length delimited. Does not implicitly {@link onnx.TypeProto.Map.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {onnx.TypeProto.IMap} message Map message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Map.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Map message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TypeProto.Map} Map\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Map.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TypeProto.Map();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.keyType = reader.int32();\n break;\n }\n case 2: {\n message.valueType = $root.onnx.TypeProto.decode(reader, reader.uint32());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Map message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TypeProto.Map} Map\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Map.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Map message.\n * @function verify\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Map.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.keyType != null && message.hasOwnProperty(\"keyType\"))\n if (!$util.isInteger(message.keyType))\n return \"keyType: integer expected\";\n if (message.valueType != null && message.hasOwnProperty(\"valueType\")) {\n var error = $root.onnx.TypeProto.verify(message.valueType);\n if (error)\n return \"valueType.\" + error;\n }\n return null;\n };\n\n /**\n * Creates a Map message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TypeProto.Map} Map\n */\n Map.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TypeProto.Map)\n return object;\n var message = new $root.onnx.TypeProto.Map();\n if (object.keyType != null)\n message.keyType = object.keyType | 0;\n if (object.valueType != null) {\n if (typeof object.valueType !== \"object\")\n throw TypeError(\".onnx.TypeProto.Map.valueType: object expected\");\n message.valueType = $root.onnx.TypeProto.fromObject(object.valueType);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a Map message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {onnx.TypeProto.Map} message Map\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Map.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults) {\n object.keyType = 0;\n object.valueType = null;\n }\n if (message.keyType != null && message.hasOwnProperty(\"keyType\"))\n object.keyType = message.keyType;\n if (message.valueType != null && message.hasOwnProperty(\"valueType\"))\n object.valueType = $root.onnx.TypeProto.toObject(message.valueType, options);\n return object;\n };\n\n /**\n * Converts this Map to JSON.\n * @function toJSON\n * @memberof onnx.TypeProto.Map\n * @instance\n * @returns {Object.} JSON object\n */\n Map.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for Map\n * @function getTypeUrl\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n Map.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TypeProto.Map\";\n };\n\n return Map;\n })();\n\n TypeProto.Optional = (function() {\n\n /**\n * Properties of an Optional.\n * @memberof onnx.TypeProto\n * @interface IOptional\n * @property {onnx.ITypeProto|null} [elemType] Optional elemType\n */\n\n /**\n * Constructs a new Optional.\n * @memberof onnx.TypeProto\n * @classdesc Represents an Optional.\n * @implements IOptional\n * @constructor\n * @param {onnx.TypeProto.IOptional=} [properties] Properties to set\n */\n function Optional(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Optional elemType.\n * @member {onnx.ITypeProto|null|undefined} elemType\n * @memberof onnx.TypeProto.Optional\n * @instance\n */\n Optional.prototype.elemType = null;\n\n /**\n * Creates a new Optional instance using the specified properties.\n * @function create\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {onnx.TypeProto.IOptional=} [properties] Properties to set\n * @returns {onnx.TypeProto.Optional} Optional instance\n */\n Optional.create = function create(properties) {\n return new Optional(properties);\n };\n\n /**\n * Encodes the specified Optional message. Does not implicitly {@link onnx.TypeProto.Optional.verify|verify} messages.\n * @function encode\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {onnx.TypeProto.IOptional} message Optional message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Optional.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.elemType != null && Object.hasOwnProperty.call(message, \"elemType\"))\n $root.onnx.TypeProto.encode(message.elemType, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified Optional message, length delimited. Does not implicitly {@link onnx.TypeProto.Optional.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {onnx.TypeProto.IOptional} message Optional message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Optional.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes an Optional message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TypeProto.Optional} Optional\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Optional.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TypeProto.Optional();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.elemType = $root.onnx.TypeProto.decode(reader, reader.uint32());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes an Optional message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TypeProto.Optional} Optional\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Optional.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies an Optional message.\n * @function verify\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Optional.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.elemType != null && message.hasOwnProperty(\"elemType\")) {\n var error = $root.onnx.TypeProto.verify(message.elemType);\n if (error)\n return \"elemType.\" + error;\n }\n return null;\n };\n\n /**\n * Creates an Optional message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TypeProto.Optional} Optional\n */\n Optional.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TypeProto.Optional)\n return object;\n var message = new $root.onnx.TypeProto.Optional();\n if (object.elemType != null) {\n if (typeof object.elemType !== \"object\")\n throw TypeError(\".onnx.TypeProto.Optional.elemType: object expected\");\n message.elemType = $root.onnx.TypeProto.fromObject(object.elemType);\n }\n return message;\n };\n\n /**\n * Creates a plain object from an Optional message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {onnx.TypeProto.Optional} message Optional\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Optional.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults)\n object.elemType = null;\n if (message.elemType != null && message.hasOwnProperty(\"elemType\"))\n object.elemType = $root.onnx.TypeProto.toObject(message.elemType, options);\n return object;\n };\n\n /**\n * Converts this Optional to JSON.\n * @function toJSON\n * @memberof onnx.TypeProto.Optional\n * @instance\n * @returns {Object.} JSON object\n */\n Optional.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for Optional\n * @function getTypeUrl\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n Optional.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TypeProto.Optional\";\n };\n\n return Optional;\n })();\n\n TypeProto.SparseTensor = (function() {\n\n /**\n * Properties of a SparseTensor.\n * @memberof onnx.TypeProto\n * @interface ISparseTensor\n * @property {number|null} [elemType] SparseTensor elemType\n * @property {onnx.ITensorShapeProto|null} [shape] SparseTensor shape\n */\n\n /**\n * Constructs a new SparseTensor.\n * @memberof onnx.TypeProto\n * @classdesc Represents a SparseTensor.\n * @implements ISparseTensor\n * @constructor\n * @param {onnx.TypeProto.ISparseTensor=} [properties] Properties to set\n */\n function SparseTensor(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * SparseTensor elemType.\n * @member {number} elemType\n * @memberof onnx.TypeProto.SparseTensor\n * @instance\n */\n SparseTensor.prototype.elemType = 0;\n\n /**\n * SparseTensor shape.\n * @member {onnx.ITensorShapeProto|null|undefined} shape\n * @memberof onnx.TypeProto.SparseTensor\n * @instance\n */\n SparseTensor.prototype.shape = null;\n\n /**\n * Creates a new SparseTensor instance using the specified properties.\n * @function create\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {onnx.TypeProto.ISparseTensor=} [properties] Properties to set\n * @returns {onnx.TypeProto.SparseTensor} SparseTensor instance\n */\n SparseTensor.create = function create(properties) {\n return new SparseTensor(properties);\n };\n\n /**\n * Encodes the specified SparseTensor message. Does not implicitly {@link onnx.TypeProto.SparseTensor.verify|verify} messages.\n * @function encode\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {onnx.TypeProto.ISparseTensor} message SparseTensor message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n SparseTensor.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.elemType != null && Object.hasOwnProperty.call(message, \"elemType\"))\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.elemType);\n if (message.shape != null && Object.hasOwnProperty.call(message, \"shape\"))\n $root.onnx.TensorShapeProto.encode(message.shape, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified SparseTensor message, length delimited. Does not implicitly {@link onnx.TypeProto.SparseTensor.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {onnx.TypeProto.ISparseTensor} message SparseTensor message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n SparseTensor.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a SparseTensor message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TypeProto.SparseTensor} SparseTensor\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n SparseTensor.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TypeProto.SparseTensor();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.elemType = reader.int32();\n break;\n }\n case 2: {\n message.shape = $root.onnx.TensorShapeProto.decode(reader, reader.uint32());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a SparseTensor message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TypeProto.SparseTensor} SparseTensor\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n SparseTensor.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a SparseTensor message.\n * @function verify\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n SparseTensor.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.elemType != null && message.hasOwnProperty(\"elemType\"))\n if (!$util.isInteger(message.elemType))\n return \"elemType: integer expected\";\n if (message.shape != null && message.hasOwnProperty(\"shape\")) {\n var error = $root.onnx.TensorShapeProto.verify(message.shape);\n if (error)\n return \"shape.\" + error;\n }\n return null;\n };\n\n /**\n * Creates a SparseTensor message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TypeProto.SparseTensor} SparseTensor\n */\n SparseTensor.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TypeProto.SparseTensor)\n return object;\n var message = new $root.onnx.TypeProto.SparseTensor();\n if (object.elemType != null)\n message.elemType = object.elemType | 0;\n if (object.shape != null) {\n if (typeof object.shape !== \"object\")\n throw TypeError(\".onnx.TypeProto.SparseTensor.shape: object expected\");\n message.shape = $root.onnx.TensorShapeProto.fromObject(object.shape);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a SparseTensor message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {onnx.TypeProto.SparseTensor} message SparseTensor\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n SparseTensor.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults) {\n object.elemType = 0;\n object.shape = null;\n }\n if (message.elemType != null && message.hasOwnProperty(\"elemType\"))\n object.elemType = message.elemType;\n if (message.shape != null && message.hasOwnProperty(\"shape\"))\n object.shape = $root.onnx.TensorShapeProto.toObject(message.shape, options);\n return object;\n };\n\n /**\n * Converts this SparseTensor to JSON.\n * @function toJSON\n * @memberof onnx.TypeProto.SparseTensor\n * @instance\n * @returns {Object.} JSON object\n */\n SparseTensor.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for SparseTensor\n * @function getTypeUrl\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n SparseTensor.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TypeProto.SparseTensor\";\n };\n\n return SparseTensor;\n })();\n\n return TypeProto;\n })();\n\n onnx.OperatorSetIdProto = (function() {\n\n /**\n * Properties of an OperatorSetIdProto.\n * @memberof onnx\n * @interface IOperatorSetIdProto\n * @property {string|null} [domain] OperatorSetIdProto domain\n * @property {number|Long|null} [version] OperatorSetIdProto version\n */\n\n /**\n * Constructs a new OperatorSetIdProto.\n * @memberof onnx\n * @classdesc Represents an OperatorSetIdProto.\n * @implements IOperatorSetIdProto\n * @constructor\n * @param {onnx.IOperatorSetIdProto=} [properties] Properties to set\n */\n function OperatorSetIdProto(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * OperatorSetIdProto domain.\n * @member {string} domain\n * @memberof onnx.OperatorSetIdProto\n * @instance\n */\n OperatorSetIdProto.prototype.domain = \"\";\n\n /**\n * OperatorSetIdProto version.\n * @member {number|Long} version\n * @memberof onnx.OperatorSetIdProto\n * @instance\n */\n OperatorSetIdProto.prototype.version = $util.Long ? $util.Long.fromBits(0,0,false) : 0;\n\n /**\n * Creates a new OperatorSetIdProto instance using the specified properties.\n * @function create\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {onnx.IOperatorSetIdProto=} [properties] Properties to set\n * @returns {onnx.OperatorSetIdProto} OperatorSetIdProto instance\n */\n OperatorSetIdProto.create = function create(properties) {\n return new OperatorSetIdProto(properties);\n };\n\n /**\n * Encodes the specified OperatorSetIdProto message. Does not implicitly {@link onnx.OperatorSetIdProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {onnx.IOperatorSetIdProto} message OperatorSetIdProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n OperatorSetIdProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.domain != null && Object.hasOwnProperty.call(message, \"domain\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.domain);\n if (message.version != null && Object.hasOwnProperty.call(message, \"version\"))\n writer.uint32(/* id 2, wireType 0 =*/16).int64(message.version);\n return writer;\n };\n\n /**\n * Encodes the specified OperatorSetIdProto message, length delimited. Does not implicitly {@link onnx.OperatorSetIdProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {onnx.IOperatorSetIdProto} message OperatorSetIdProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n OperatorSetIdProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes an OperatorSetIdProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.OperatorSetIdProto} OperatorSetIdProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n OperatorSetIdProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.OperatorSetIdProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.domain = reader.string();\n break;\n }\n case 2: {\n message.version = reader.int64();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes an OperatorSetIdProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.OperatorSetIdProto} OperatorSetIdProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n OperatorSetIdProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies an OperatorSetIdProto message.\n * @function verify\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n OperatorSetIdProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.domain != null && message.hasOwnProperty(\"domain\"))\n if (!$util.isString(message.domain))\n return \"domain: string expected\";\n if (message.version != null && message.hasOwnProperty(\"version\"))\n if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))\n return \"version: integer|Long expected\";\n return null;\n };\n\n /**\n * Creates an OperatorSetIdProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.OperatorSetIdProto} OperatorSetIdProto\n */\n OperatorSetIdProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.OperatorSetIdProto)\n return object;\n var message = new $root.onnx.OperatorSetIdProto();\n if (object.domain != null)\n message.domain = String(object.domain);\n if (object.version != null)\n if ($util.Long)\n (message.version = $util.Long.fromValue(object.version)).unsigned = false;\n else if (typeof object.version === \"string\")\n message.version = parseInt(object.version, 10);\n else if (typeof object.version === \"number\")\n message.version = object.version;\n else if (typeof object.version === \"object\")\n message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber();\n return message;\n };\n\n /**\n * Creates a plain object from an OperatorSetIdProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {onnx.OperatorSetIdProto} message OperatorSetIdProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n OperatorSetIdProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults) {\n object.domain = \"\";\n if ($util.Long) {\n var long = new $util.Long(0, 0, false);\n object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.version = options.longs === String ? \"0\" : 0;\n }\n if (message.domain != null && message.hasOwnProperty(\"domain\"))\n object.domain = message.domain;\n if (message.version != null && message.hasOwnProperty(\"version\"))\n if (typeof message.version === \"number\")\n object.version = options.longs === String ? String(message.version) : message.version;\n else\n object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber() : message.version;\n return object;\n };\n\n /**\n * Converts this OperatorSetIdProto to JSON.\n * @function toJSON\n * @memberof onnx.OperatorSetIdProto\n * @instance\n * @returns {Object.} JSON object\n */\n OperatorSetIdProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for OperatorSetIdProto\n * @function getTypeUrl\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n OperatorSetIdProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.OperatorSetIdProto\";\n };\n\n return OperatorSetIdProto;\n })();\n\n /**\n * OperatorStatus enum.\n * @name onnx.OperatorStatus\n * @enum {number}\n * @property {number} EXPERIMENTAL=0 EXPERIMENTAL value\n * @property {number} STABLE=1 STABLE value\n */\n onnx.OperatorStatus = (function() {\n var valuesById = {}, values = Object.create(valuesById);\n values[valuesById[0] = \"EXPERIMENTAL\"] = 0;\n values[valuesById[1] = \"STABLE\"] = 1;\n return values;\n })();\n\n onnx.FunctionProto = (function() {\n\n /**\n * Properties of a FunctionProto.\n * @memberof onnx\n * @interface IFunctionProto\n * @property {string|null} [name] FunctionProto name\n * @property {Array.|null} [input] FunctionProto input\n * @property {Array.|null} [output] FunctionProto output\n * @property {Array.|null} [attribute] FunctionProto attribute\n * @property {Array.|null} [attributeProto] FunctionProto attributeProto\n * @property {Array.|null} [node] FunctionProto node\n * @property {string|null} [docString] FunctionProto docString\n * @property {Array.|null} [opsetImport] FunctionProto opsetImport\n * @property {string|null} [domain] FunctionProto domain\n */\n\n /**\n * Constructs a new FunctionProto.\n * @memberof onnx\n * @classdesc Represents a FunctionProto.\n * @implements IFunctionProto\n * @constructor\n * @param {onnx.IFunctionProto=} [properties] Properties to set\n */\n function FunctionProto(properties) {\n this.input = [];\n this.output = [];\n this.attribute = [];\n this.attributeProto = [];\n this.node = [];\n this.opsetImport = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * FunctionProto name.\n * @member {string} name\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.name = \"\";\n\n /**\n * FunctionProto input.\n * @member {Array.} input\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.input = $util.emptyArray;\n\n /**\n * FunctionProto output.\n * @member {Array.} output\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.output = $util.emptyArray;\n\n /**\n * FunctionProto attribute.\n * @member {Array.} attribute\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.attribute = $util.emptyArray;\n\n /**\n * FunctionProto attributeProto.\n * @member {Array.} attributeProto\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.attributeProto = $util.emptyArray;\n\n /**\n * FunctionProto node.\n * @member {Array.} node\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.node = $util.emptyArray;\n\n /**\n * FunctionProto docString.\n * @member {string} docString\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.docString = \"\";\n\n /**\n * FunctionProto opsetImport.\n * @member {Array.} opsetImport\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.opsetImport = $util.emptyArray;\n\n /**\n * FunctionProto domain.\n * @member {string} domain\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.domain = \"\";\n\n /**\n * Creates a new FunctionProto instance using the specified properties.\n * @function create\n * @memberof onnx.FunctionProto\n * @static\n * @param {onnx.IFunctionProto=} [properties] Properties to set\n * @returns {onnx.FunctionProto} FunctionProto instance\n */\n FunctionProto.create = function create(properties) {\n return new FunctionProto(properties);\n };\n\n /**\n * Encodes the specified FunctionProto message. Does not implicitly {@link onnx.FunctionProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.FunctionProto\n * @static\n * @param {onnx.IFunctionProto} message FunctionProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n FunctionProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);\n if (message.input != null && message.input.length)\n for (var i = 0; i < message.input.length; ++i)\n writer.uint32(/* id 4, wireType 2 =*/34).string(message.input[i]);\n if (message.output != null && message.output.length)\n for (var i = 0; i < message.output.length; ++i)\n writer.uint32(/* id 5, wireType 2 =*/42).string(message.output[i]);\n if (message.attribute != null && message.attribute.length)\n for (var i = 0; i < message.attribute.length; ++i)\n writer.uint32(/* id 6, wireType 2 =*/50).string(message.attribute[i]);\n if (message.node != null && message.node.length)\n for (var i = 0; i < message.node.length; ++i)\n $root.onnx.NodeProto.encode(message.node[i], writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();\n if (message.docString != null && Object.hasOwnProperty.call(message, \"docString\"))\n writer.uint32(/* id 8, wireType 2 =*/66).string(message.docString);\n if (message.opsetImport != null && message.opsetImport.length)\n for (var i = 0; i < message.opsetImport.length; ++i)\n $root.onnx.OperatorSetIdProto.encode(message.opsetImport[i], writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();\n if (message.domain != null && Object.hasOwnProperty.call(message, \"domain\"))\n writer.uint32(/* id 10, wireType 2 =*/82).string(message.domain);\n if (message.attributeProto != null && message.attributeProto.length)\n for (var i = 0; i < message.attributeProto.length; ++i)\n $root.onnx.AttributeProto.encode(message.attributeProto[i], writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified FunctionProto message, length delimited. Does not implicitly {@link onnx.FunctionProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.FunctionProto\n * @static\n * @param {onnx.IFunctionProto} message FunctionProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n FunctionProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a FunctionProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.FunctionProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.FunctionProto} FunctionProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n FunctionProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.FunctionProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.name = reader.string();\n break;\n }\n case 4: {\n if (!(message.input && message.input.length))\n message.input = [];\n message.input.push(reader.string());\n break;\n }\n case 5: {\n if (!(message.output && message.output.length))\n message.output = [];\n message.output.push(reader.string());\n break;\n }\n case 6: {\n if (!(message.attribute && message.attribute.length))\n message.attribute = [];\n message.attribute.push(reader.string());\n break;\n }\n case 11: {\n if (!(message.attributeProto && message.attributeProto.length))\n message.attributeProto = [];\n message.attributeProto.push($root.onnx.AttributeProto.decode(reader, reader.uint32()));\n break;\n }\n case 7: {\n if (!(message.node && message.node.length))\n message.node = [];\n message.node.push($root.onnx.NodeProto.decode(reader, reader.uint32()));\n break;\n }\n case 8: {\n message.docString = reader.string();\n break;\n }\n case 9: {\n if (!(message.opsetImport && message.opsetImport.length))\n message.opsetImport = [];\n message.opsetImport.push($root.onnx.OperatorSetIdProto.decode(reader, reader.uint32()));\n break;\n }\n case 10: {\n message.domain = reader.string();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a FunctionProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.FunctionProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.FunctionProto} FunctionProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n FunctionProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a FunctionProto message.\n * @function verify\n * @memberof onnx.FunctionProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n FunctionProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.name != null && message.hasOwnProperty(\"name\"))\n if (!$util.isString(message.name))\n return \"name: string expected\";\n if (message.input != null && message.hasOwnProperty(\"input\")) {\n if (!Array.isArray(message.input))\n return \"input: array expected\";\n for (var i = 0; i < message.input.length; ++i)\n if (!$util.isString(message.input[i]))\n return \"input: string[] expected\";\n }\n if (message.output != null && message.hasOwnProperty(\"output\")) {\n if (!Array.isArray(message.output))\n return \"output: array expected\";\n for (var i = 0; i < message.output.length; ++i)\n if (!$util.isString(message.output[i]))\n return \"output: string[] expected\";\n }\n if (message.attribute != null && message.hasOwnProperty(\"attribute\")) {\n if (!Array.isArray(message.attribute))\n return \"attribute: array expected\";\n for (var i = 0; i < message.attribute.length; ++i)\n if (!$util.isString(message.attribute[i]))\n return \"attribute: string[] expected\";\n }\n if (message.attributeProto != null && message.hasOwnProperty(\"attributeProto\")) {\n if (!Array.isArray(message.attributeProto))\n return \"attributeProto: array expected\";\n for (var i = 0; i < message.attributeProto.length; ++i) {\n var error = $root.onnx.AttributeProto.verify(message.attributeProto[i]);\n if (error)\n return \"attributeProto.\" + error;\n }\n }\n if (message.node != null && message.hasOwnProperty(\"node\")) {\n if (!Array.isArray(message.node))\n return \"node: array expected\";\n for (var i = 0; i < message.node.length; ++i) {\n var error = $root.onnx.NodeProto.verify(message.node[i]);\n if (error)\n return \"node.\" + error;\n }\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n if (!$util.isString(message.docString))\n return \"docString: string expected\";\n if (message.opsetImport != null && message.hasOwnProperty(\"opsetImport\")) {\n if (!Array.isArray(message.opsetImport))\n return \"opsetImport: array expected\";\n for (var i = 0; i < message.opsetImport.length; ++i) {\n var error = $root.onnx.OperatorSetIdProto.verify(message.opsetImport[i]);\n if (error)\n return \"opsetImport.\" + error;\n }\n }\n if (message.domain != null && message.hasOwnProperty(\"domain\"))\n if (!$util.isString(message.domain))\n return \"domain: string expected\";\n return null;\n };\n\n /**\n * Creates a FunctionProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.FunctionProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.FunctionProto} FunctionProto\n */\n FunctionProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.FunctionProto)\n return object;\n var message = new $root.onnx.FunctionProto();\n if (object.name != null)\n message.name = String(object.name);\n if (object.input) {\n if (!Array.isArray(object.input))\n throw TypeError(\".onnx.FunctionProto.input: array expected\");\n message.input = [];\n for (var i = 0; i < object.input.length; ++i)\n message.input[i] = String(object.input[i]);\n }\n if (object.output) {\n if (!Array.isArray(object.output))\n throw TypeError(\".onnx.FunctionProto.output: array expected\");\n message.output = [];\n for (var i = 0; i < object.output.length; ++i)\n message.output[i] = String(object.output[i]);\n }\n if (object.attribute) {\n if (!Array.isArray(object.attribute))\n throw TypeError(\".onnx.FunctionProto.attribute: array expected\");\n message.attribute = [];\n for (var i = 0; i < object.attribute.length; ++i)\n message.attribute[i] = String(object.attribute[i]);\n }\n if (object.attributeProto) {\n if (!Array.isArray(object.attributeProto))\n throw TypeError(\".onnx.FunctionProto.attributeProto: array expected\");\n message.attributeProto = [];\n for (var i = 0; i < object.attributeProto.length; ++i) {\n if (typeof object.attributeProto[i] !== \"object\")\n throw TypeError(\".onnx.FunctionProto.attributeProto: object expected\");\n message.attributeProto[i] = $root.onnx.AttributeProto.fromObject(object.attributeProto[i]);\n }\n }\n if (object.node) {\n if (!Array.isArray(object.node))\n throw TypeError(\".onnx.FunctionProto.node: array expected\");\n message.node = [];\n for (var i = 0; i < object.node.length; ++i) {\n if (typeof object.node[i] !== \"object\")\n throw TypeError(\".onnx.FunctionProto.node: object expected\");\n message.node[i] = $root.onnx.NodeProto.fromObject(object.node[i]);\n }\n }\n if (object.docString != null)\n message.docString = String(object.docString);\n if (object.opsetImport) {\n if (!Array.isArray(object.opsetImport))\n throw TypeError(\".onnx.FunctionProto.opsetImport: array expected\");\n message.opsetImport = [];\n for (var i = 0; i < object.opsetImport.length; ++i) {\n if (typeof object.opsetImport[i] !== \"object\")\n throw TypeError(\".onnx.FunctionProto.opsetImport: object expected\");\n message.opsetImport[i] = $root.onnx.OperatorSetIdProto.fromObject(object.opsetImport[i]);\n }\n }\n if (object.domain != null)\n message.domain = String(object.domain);\n return message;\n };\n\n /**\n * Creates a plain object from a FunctionProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.FunctionProto\n * @static\n * @param {onnx.FunctionProto} message FunctionProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n FunctionProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults) {\n object.input = [];\n object.output = [];\n object.attribute = [];\n object.node = [];\n object.opsetImport = [];\n object.attributeProto = [];\n }\n if (options.defaults) {\n object.name = \"\";\n object.docString = \"\";\n object.domain = \"\";\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n object.name = message.name;\n if (message.input && message.input.length) {\n object.input = [];\n for (var j = 0; j < message.input.length; ++j)\n object.input[j] = message.input[j];\n }\n if (message.output && message.output.length) {\n object.output = [];\n for (var j = 0; j < message.output.length; ++j)\n object.output[j] = message.output[j];\n }\n if (message.attribute && message.attribute.length) {\n object.attribute = [];\n for (var j = 0; j < message.attribute.length; ++j)\n object.attribute[j] = message.attribute[j];\n }\n if (message.node && message.node.length) {\n object.node = [];\n for (var j = 0; j < message.node.length; ++j)\n object.node[j] = $root.onnx.NodeProto.toObject(message.node[j], options);\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n object.docString = message.docString;\n if (message.opsetImport && message.opsetImport.length) {\n object.opsetImport = [];\n for (var j = 0; j < message.opsetImport.length; ++j)\n object.opsetImport[j] = $root.onnx.OperatorSetIdProto.toObject(message.opsetImport[j], options);\n }\n if (message.domain != null && message.hasOwnProperty(\"domain\"))\n object.domain = message.domain;\n if (message.attributeProto && message.attributeProto.length) {\n object.attributeProto = [];\n for (var j = 0; j < message.attributeProto.length; ++j)\n object.attributeProto[j] = $root.onnx.AttributeProto.toObject(message.attributeProto[j], options);\n }\n return object;\n };\n\n /**\n * Converts this FunctionProto to JSON.\n * @function toJSON\n * @memberof onnx.FunctionProto\n * @instance\n * @returns {Object.} JSON object\n */\n FunctionProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for FunctionProto\n * @function getTypeUrl\n * @memberof onnx.FunctionProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n FunctionProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.FunctionProto\";\n };\n\n return FunctionProto;\n })();\n\n return onnx;\n})();\n\nmodule.exports = $root;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {flatbuffers} from 'flatbuffers';\nimport Long from 'long';\n\nimport {Graph} from './graph';\nimport {onnxruntime} from './ort-schema/flatbuffers/ort-generated';\nimport {onnx} from './ort-schema/protobuf/onnx';\nimport {Tensor} from './tensor';\n\n// check the inputs shape before running an OP.\n// return true when the inputs pass the check\n// return false when the inputs do not fit the requirement\n// throw exception when fatal error or not implemented\nexport function checkInputsShape(inputs: Tensor[], ...expectedDimensions: number[]): boolean {\n if (!inputs || inputs.length !== expectedDimensions.length) {\n return false;\n }\n for (let i = 0; i < inputs.length; i++) {\n if (!inputs[i].dims || inputs[i].dims.length !== expectedDimensions[i]) {\n return false;\n }\n }\n return true;\n}\n\n// Evaluates the given expression and asserts error message if condition is unmet.\nexport function assert(expr: boolean, msg: () => string) {\n if (!expr) {\n throw new Error(typeof msg === 'string' ? msg : msg());\n }\n}\n\nexport class ArrayUtil {\n /**\n * Verifies if 2 input arrays contain the same elements.\n * @param n1 Array 1\n * @param n2 Array 2\n * @returns Whether these 2 are equal\n */\n static arraysEqual(\n n1: readonly number[]|Int8Array|Uint8Array|Int16Array|Uint16Array|Int32Array|Uint32Array|Uint8ClampedArray|\n Float32Array|Float64Array,\n n2: readonly number[]|Int8Array|Uint8Array|Int16Array|Uint16Array|Int32Array|Uint32Array|Uint8ClampedArray|\n Float32Array|Float64Array) {\n if (n1.length !== n2.length) {\n return false;\n }\n for (let i = 0; i < n1.length; i++) {\n if (n1[i] !== n2[i]) {\n return false;\n }\n }\n return true;\n }\n}\n\nexport class MatMulUtil {\n /**\n * Fix the input shapes for MatMul operation if they need fixing\n * @param dimsA The shape of tensor A. Should be an array of positive integers\n * @param dimsB The shape of tensor B. Should be an array of positive integers\n * @returns A tuple containing the preprocessed input shapes as required by ONNX specifications\n */\n static preprocessInputShapes(dimsA: readonly number[], dimsB: readonly number[]):\n [readonly number[], readonly number[]] {\n // If the first argument is 1-D, it is promoted to a matrix by prepending\n // a 1 to its dimensions. After matrix multiplication the prepended 1 is\n // removed.\n const a = (dimsA.length === 1) ? [1, dimsA[0]] : dimsA;\n\n // If the second argument is 1-D, it is promoted to a matrix by appending\n // a 1 to its dimensions. After matrix multiplication the appended 1 is\n // removed.\n const b = (dimsB.length === 1) ? [dimsB[0], 1] : dimsB;\n\n return [a, b];\n }\n\n /**\n * Fix the output shape computed for MatMul operation if it needs fixing\n * @param outputShape The computed outputShape. Should be an array (atleast of length 2) of positive integers.\n * This will be mutated.\n * @param aRank The rank of tensor A.\n * @param bRank The rank of tensor B.\n */\n static postprocessOutputShape(outputShape: number[], aRank: number, bRank: number) {\n // Remove prepended dimension if first input is 1d\n if (aRank === 1) {\n // outputShape = outputShape.slice(0, outputShape.length - 2).concat(outputShape.slice(outputShape.length - 1));\n outputShape.splice(outputShape.length - 2, 1);\n }\n // Remove appended dimension if second input is 1d\n if (bRank === 1) {\n outputShape.pop();\n }\n }\n\n /**\n * Calculate the expected shape when matrix multiplication\n * @param a The shape of tensor A. Should be a tuple of 2 positive integers\n * @param b The shape of tensor B. Should be a tuple of 2 positive integers\n * @returns The expected shape of the result, or undefined if N/A\n */\n static calcMatMulShape(a: [number, number], b: [number, number]): [number, number]|undefined {\n return (a[1] !== b[0]) ? undefined : [a[0], b[1]];\n }\n}\n\nexport class BroadcastUtil {\n /**\n * Calculate the expected shape when broadcasting 2 tensors\n * @param a The shape of tensor A. Should be an array of positive integers\n * @param b The shape of tensor B. Should be an array of positive integers\n * @param isMatMul Whether the operation is MatMul\n * @returns The expected shape of the result, or undefined if N/A\n */\n static calcShape(adims: readonly number[], bdims: readonly number[], isMatMul = false): readonly number[]|undefined {\n const arank = adims.length;\n const brank = bdims.length;\n if (arank === 0) {\n return bdims;\n }\n if (brank === 0) {\n return adims;\n }\n const crank = Math.max(adims.length, bdims.length);\n const cdims = new Array(crank);\n\n // calculate the last 2 dimension if it is MatMul\n if (isMatMul) {\n if (arank < 2 || brank < 2) {\n return undefined;\n }\n const cShapeMatMul =\n MatMulUtil.calcMatMulShape([adims[arank - 2], adims[arank - 1]], [bdims[brank - 2], bdims[brank - 1]]);\n if (cShapeMatMul === undefined) {\n return undefined;\n }\n [cdims[crank - 2], cdims[crank - 1]] = cShapeMatMul;\n }\n\n for (let i = isMatMul ? 3 : 1; i <= crank; i++) {\n const aLen = arank - i < 0 ? 1 : adims[arank - i];\n const bLen = brank - i < 0 ? 1 : bdims[brank - i];\n\n if (aLen !== bLen && aLen > 1 && bLen > 1) {\n return undefined;\n }\n cdims[crank - i] = Math.max(aLen, bLen);\n }\n\n return cdims;\n }\n\n /**\n * Given the indices of a broadcasted tensor, calculate the original indices\n * @param broadcastedIndices The given indices of the broadcasted tensor.\n * @param originalShape The original shape of the tensor before broadcas\n * @returns The calculated indices that maps to the original tensor.\n */\n static index(broadcastedIndices: readonly number[], originalShape: readonly number[]): number[] {\n // NOTE 1: we assume the parameter broadcastedIndices is valid. ie. it should have the same\n // length as the broadcasted shape, and for each dimension the index should\n // not be out of range.\n const originalIndices = new Array(originalShape.length);\n BroadcastUtil.fillIndex(broadcastedIndices, originalShape, originalIndices);\n return originalIndices;\n }\n\n /**\n * Given the indices of a broadcasted tensor, calculate the original indices\n * @param broadcastedIndices The given indices of the broadcasted tensor.\n * @param originalShape The original shape of the tensor before broadcast\n * @param originalIndices The mapping of broadcastedIndices to the originalIndices (output parameter - will be\n * mutated).\n */\n static fillIndex(broadcastedIndices: readonly number[], originalShape: readonly number[], originalIndices: number[]) {\n // NOTE 1: we assume the parameter broadcastedIndices is valid. ie. it should have the same length as the\n // broadcasted shape, and for each dimension the index should not be out of range.\n // NOTE 2: we assume the parameter originalIndices has the same length as the originalShape\n const dimOffset = broadcastedIndices.length - originalShape.length;\n for (let i = 0; i < originalShape.length; i++) {\n originalIndices[i] = broadcastedIndices[dimOffset + i] % originalShape[i];\n }\n }\n\n /**\n * Perform the broadcasting operation on the specific operator\n * @param a The input tensor A\n * @param b The input tensor B\n * @param op The operator lambda function\n * @param inplace Whether to write the result back to A.\n * @returns The result tensor, or undefined if input not broadcastable.\n */\n static calc(\n a: Tensor, b: Tensor, op: (a: string|number, b: string|number) => (string | number), inplace: boolean,\n resultType?: Tensor.DataType): Tensor|undefined {\n const outputShape = BroadcastUtil.calcShape(a.dims, b.dims);\n\n if (outputShape) {\n if (inplace && !ShapeUtil.areEqual(outputShape, a.dims)) {\n // B is not broadcastable to A, failed to calculate inplace.\n return undefined;\n }\n\n const size = ShapeUtil.size(outputShape);\n const c = inplace ? a : new Tensor(outputShape, resultType || a.type);\n\n // both inputs are scalars\n if (outputShape.length === 0) {\n c.set([], op(a.get([]) as number, b.get([]) as number));\n }\n\n // atleast one input is a non-scalar\n else {\n const outputIndices = new Array(outputShape.length);\n const originalIndicesA = new Array(a.dims.length);\n const originalIndicesB = new Array(b.dims.length);\n let valA: string|number = 0;\n let valB: string|number = 0;\n let isAScalar = false;\n let isBScalar = false;\n if (a.dims.length === 0) {\n valA = a.get([]) as number;\n isAScalar = true;\n }\n if (b.dims.length === 0) {\n valB = b.get([]) as number;\n isBScalar = true;\n }\n let rest: number;\n for (let i = 0; i < size; i++) {\n // traversal indices\n rest = i;\n for (let j = outputShape.length - 1; j >= 0; j--) {\n outputIndices[j] = rest % outputShape[j];\n rest = Math.floor(rest / outputShape[j]);\n }\n\n if (!isAScalar) {\n // map outputIndices (which is actually broadcasted) to the originalIndices\n BroadcastUtil.fillIndex(outputIndices, a.dims, originalIndicesA);\n valA = a.get(originalIndicesA) as number;\n }\n if (!isBScalar) {\n BroadcastUtil.fillIndex(outputIndices, b.dims, originalIndicesB);\n valB = b.get(originalIndicesB) as number;\n }\n\n c.set(outputIndices, op(valA, valB));\n }\n }\n\n return c;\n }\n\n return undefined;\n }\n\n /**\n * Determine if a shape is unidirectional broadcastable to another shape\n * @param shape The input shape\n * @param finalShape The desired shape after broadcasting\n */\n static isValidBroadcast(shape: readonly number[], finalShape: readonly number[]): boolean {\n // align shape to the right\n const inputRank = shape.length;\n const finalRank = finalShape.length;\n if (inputRank > finalRank) {\n return false;\n }\n for (let i = 1; i <= inputRank; i++) {\n if (shape[inputRank - i] !== 1 && shape[inputRank - i] !== finalShape[finalRank - i]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Determine the broadcasted dims in input shape based on the given output shape.\n * Note that this function only returns the broadcasted dims.\n * @param inputShape The input shape\n * @param outputShape The output shape\n * @returns The broadcasted dims in input shape.\n */\n static getBroadcastDims(inputShape: readonly number[], outputShape: readonly number[]): number[] {\n const inRank = inputShape.length;\n const dims: number[] = [];\n for (let i = 0; i < inRank; i++) {\n const dim = inRank - 1 - i;\n const a = inputShape[dim] || 1;\n const b = outputShape[outputShape.length - 1 - i] || 1;\n if (b > 1 && a === 1) {\n dims.unshift(dim);\n }\n }\n return dims;\n }\n}\n\n// copy array helper\n// mimics memcpy as much as possible\nexport function arrayCopyHelper(\n target: number[]|Tensor.NumberType, source: number[]|Tensor.NumberType, targetIndex: number, sourceIndex: number,\n blockSize: number) {\n if (sourceIndex < 0 || sourceIndex >= source.length) {\n throw new Error('sourceIndex out of bounds');\n }\n if (targetIndex < 0 || targetIndex >= target.length) {\n throw new Error('targetIndex out of bounds');\n }\n if (sourceIndex + blockSize > source.length) {\n throw new Error('source indices to be copied are outside bounds');\n }\n if (targetIndex + blockSize > target.length) {\n throw new Error('target array is too small to hold result');\n }\n\n for (let offset = 0; offset < blockSize; offset++) {\n target[targetIndex + offset] = source[sourceIndex + offset];\n }\n}\n\nexport class GemmUtil {\n // will make sure input shapes are compatible for this op\n // and return back the shape of the output in the form of a tuple\n // will throw exception if the input shapes are not compatible\n static getShapeOfGemmResult(\n leftShape: readonly number[], transLeft: boolean, rightShape: readonly number[], transRight: boolean,\n biasShape?: readonly number[]): readonly number[] {\n if (leftShape.length !== 2 || rightShape.length !== 2) {\n throw new Error('shape need to be of size 2');\n }\n\n let M: number;\n let K: number;\n let N: number;\n\n if (transLeft) {\n M = leftShape[1];\n K = leftShape[0];\n } else {\n M = leftShape[0];\n K = leftShape[1];\n }\n\n let kDim = -1;\n\n if (transRight) {\n N = rightShape[0];\n kDim = 1;\n } else {\n N = rightShape[1];\n kDim = 0;\n }\n\n if (rightShape[kDim] !== K) {\n throw new Error('dimension mismatch');\n }\n\n if (M <= 0 || N <= 0 || K <= 0) {\n throw new Error('invalid shape specified');\n }\n\n if (biasShape && !BroadcastUtil.isValidBroadcast(biasShape, [M, N])) {\n throw new Error('gemm: invalid bias shape for broadcast');\n }\n\n return [M, N, K];\n }\n}\n\nexport class ProtoUtil {\n static tensorDataTypeFromProto(typeProto: onnx.TensorProto.DataType|\n onnxruntime.experimental.fbs.TensorDataType): Tensor.DataType {\n switch (typeProto) {\n case onnx.TensorProto.DataType.INT8:\n return 'int8';\n case onnx.TensorProto.DataType.UINT8:\n return 'uint8';\n case onnx.TensorProto.DataType.BOOL:\n return 'bool';\n case onnx.TensorProto.DataType.INT16:\n return 'int16';\n case onnx.TensorProto.DataType.UINT16:\n return 'uint16';\n case onnx.TensorProto.DataType.INT32:\n return 'int32';\n case onnx.TensorProto.DataType.UINT32:\n return 'uint32';\n case onnx.TensorProto.DataType.FLOAT:\n return 'float32';\n case onnx.TensorProto.DataType.DOUBLE:\n return 'float64';\n case onnx.TensorProto.DataType.STRING:\n return 'string';\n\n // For INT64/UINT64, reduce their value to 32-bits.\n // Should throw exception when overflow\n case onnx.TensorProto.DataType.INT64:\n return 'int32';\n case onnx.TensorProto.DataType.UINT64:\n return 'uint32';\n\n default:\n throw new Error(`unsupported data type: ${onnx.TensorProto.DataType[typeProto]}`);\n }\n }\n\n static tensorDataTypeStringToEnum(type: string): onnx.TensorProto.DataType {\n switch (type) {\n case 'int8':\n return onnx.TensorProto.DataType.INT8;\n case 'uint8':\n return onnx.TensorProto.DataType.UINT8;\n case 'bool':\n return onnx.TensorProto.DataType.BOOL;\n case 'int16':\n return onnx.TensorProto.DataType.INT16;\n case 'uint16':\n return onnx.TensorProto.DataType.UINT16;\n case 'int32':\n return onnx.TensorProto.DataType.INT32;\n case 'uint32':\n return onnx.TensorProto.DataType.UINT32;\n case 'float32':\n return onnx.TensorProto.DataType.FLOAT;\n case 'float64':\n return onnx.TensorProto.DataType.DOUBLE;\n case 'string':\n return onnx.TensorProto.DataType.STRING;\n case 'int64':\n return onnx.TensorProto.DataType.INT64;\n case 'uint64':\n return onnx.TensorProto.DataType.UINT64;\n\n default:\n throw new Error(`unsupported data type: ${type}`);\n }\n }\n\n static tensorDimsFromProto(dims: Array): number[] {\n // get rid of Long type for dims\n return dims.map(d => Long.isLong(d) ? d.toNumber() : d);\n }\n\n static tensorValueTypeFromProto(valueType: onnx.TypeProto.ITensor): Graph.ValueType {\n return {\n tensorType: ProtoUtil.tensorDataTypeFromProto(valueType.elemType!),\n shape: {dims: ProtoUtil.tensorDimsFromProto(valueType.shape!.dim!.map(d => d.dimValue!))}\n };\n }\n\n static tensorDimsFromORTFormat(tensor: onnxruntime.experimental.fbs.Tensor) {\n const dims = [];\n for (let i = 0; i < tensor.dimsLength(); i++) {\n dims.push(LongUtil.longToNumber(tensor.dims(i)!));\n }\n return dims;\n }\n\n static tensorAttributesFromORTFormat(node: onnxruntime.experimental.fbs.Node) {\n const attributes = [];\n for (let i = 0; i < node.attributesLength(); i++) {\n attributes.push(node.attributes(i)!);\n }\n return attributes;\n }\n}\n\nexport class LongUtil {\n // This function is called to get a number from long type of data for attribute, dim, and ir version,\n // which values are signed integers.\n // To make it more generic, add an optional parameter to convert to a unsigned number.\n static longToNumber(n: Long|flatbuffers.Long|number, unsigned?: boolean) {\n if (Long.isLong(n)) {\n return n.toNumber();\n } else if (n instanceof flatbuffers.Long) {\n return Long.fromValue({low: n.low, high: n.high, unsigned: unsigned ?? false}).toNumber();\n }\n return n;\n }\n static isLong(n: unknown) {\n return Long.isLong(n) || n instanceof flatbuffers.Long;\n }\n}\n\nexport class ShapeUtil {\n static size(dims: readonly number[]): number {\n return ShapeUtil.getSizeFromDimensionRange(dims, 0, dims.length);\n }\n\n // `axis` inclusive\n static sizeFromDimension(dims: readonly number[], axis: number): number {\n if (axis < 0 || axis > dims.length) {\n throw new Error(`invalid dimension of ${axis} for sizeFromDimension as Tensor has ${dims.length} dimensions.`);\n }\n return ShapeUtil.getSizeFromDimensionRange(dims, axis, dims.length);\n }\n\n // `axis` exclusive\n static sizeToDimension(dims: readonly number[], axis: number): number {\n if (axis < 0 || axis > dims.length) {\n throw new Error(`invalid dimension of ${axis} for sizeToDimension as Tensor has ${dims.length} dimensions.`);\n }\n return ShapeUtil.getSizeFromDimensionRange(dims, 0, axis);\n }\n\n static getSizeFromDimensionRange(dims: readonly number[], start: number, end: number): number {\n let size = 1;\n for (let i = start; i < end; i++) {\n // safety check as this method is called by multiple other methods requiring size.\n // size cannot be 0 or negative.\n if (dims[i] <= 0) {\n throw new Error(\n // eslint-disable-next-line max-len\n 'cannot get valid size from specified dimension range. Most likely the range contains 0 or negative values in them.');\n }\n size *= dims[i];\n }\n return size;\n }\n\n static computeStrides(dims: readonly number[]): readonly number[] {\n const rank = dims.length;\n if (rank === 0) {\n return [];\n } else if (rank === 1) {\n return [1];\n }\n const strides = new Array(rank);\n strides[rank - 1] = 1;\n strides[rank - 2] = dims[rank - 1];\n for (let i = rank - 3; i >= 0; --i) {\n strides[i] = strides[i + 1] * dims[i + 1];\n }\n return strides;\n }\n\n static transpose(dims: readonly number[]): readonly number[] {\n const copy = dims.slice();\n return copy.reverse();\n }\n\n static indicesToOffset(indices: readonly number[], strides: readonly number[], axis?: number): number {\n if (axis === undefined) {\n axis = indices.length;\n }\n let offset = 0;\n for (let i = 0; i < axis; ++i) {\n offset += strides[i] * indices[i];\n }\n return offset;\n }\n\n static offsetToIndices(offset: number, strides: readonly number[]): readonly number[] {\n const rank = strides.length;\n if (rank === 0) {\n return [];\n } else if (rank === 1) {\n return [offset * strides[0]];\n }\n const indices: number[] = new Array(strides.length);\n for (let i = 0; i < indices.length - 1; ++i) {\n indices[i] = Math.floor(offset / strides[i]);\n offset -= indices[i] * strides[i];\n }\n indices[indices.length - 1] = offset;\n return indices;\n }\n\n /**\n * normailze axis of range [-r, r) into [0, r).\n */\n static normalizeAxis(axis: number, tensorRank: number): number {\n if (axis < -tensorRank && axis >= tensorRank) {\n throw new Error('unsupported axis for this operation.');\n }\n return axis < 0 ? axis + tensorRank : axis;\n }\n\n static normalizeAxes(axes: readonly number[], tensorRank: number): number[] {\n return axes.map(x => this.normalizeAxis(x, tensorRank));\n }\n\n // Increment an index into a tensor (in lexicographic\n // ordering), wrapping around the specified upper_bound.\n /**\n * Increment an index into a tensor (in lexicographic ordering), wrapping around the specified upper_bound.\n * @param index Given index to increment (Will be mutated)\n * @param dims The dimensions of the tensor for which the given index corresponds to\n * @param axisToIncrementOn The 1-indexed axis to increment on. If undefined, axisToIncrementOn == rank\n */\n static incrementIndex(index: number[], dims: readonly number[], axisToIncrementOn?: number) {\n if (dims.length === 0 || index.length === 0) {\n throw new Error('Index incrementing unsupported for scalar Tensor');\n }\n if (axisToIncrementOn === undefined) {\n axisToIncrementOn = dims.length;\n } else {\n if (axisToIncrementOn <= 0 || axisToIncrementOn > dims.length) {\n throw new Error('Incorrect axis to increment on');\n }\n }\n\n for (let k = axisToIncrementOn - 1; k >= 0; --k) {\n index[k]++;\n if (index[k] < dims[k]) {\n break;\n }\n index[k] = 0;\n }\n }\n\n /**\n * Produces a new dimensions array based on the values in the 'originalDimensions' and 'shape' array\n * Used in Reshape\n * @param originalDims Original Shape array\n * @param shapeHints array containing values to compute the new dimensions\n * For example:\n * originalDims = [2,2] and shapeHints = [0,-1] will return [2,2]\n * originalDims = [2,2] and shapeHints = [4] will return [4]\n * originalDims = [2,2] and shapeHints = [5] will throw an exception\n * https://github.com/onnx/onnx/blob/main/docs/Operators.md#Reshape\n */\n\n static calculateReshapedDims(originalDims: readonly number[], shapeHints: ArrayLike): number[] {\n // reshape to a Scalar Tensor\n if (shapeHints.length === 0) {\n if (originalDims.length === 0 || ShapeUtil.size(originalDims) === 1) {\n return [];\n } else {\n throw new Error('cannot reshape to a scalar Tensor');\n }\n }\n\n const nDims = shapeHints.length;\n const reshapedDims = new Array(nDims);\n let unknownDimension = -1;\n let newTensorSize = 1;\n for (let i = 0; i < nDims; i++) {\n if (shapeHints[i] < -1) {\n throw new Error('a dimension in shape hints cannot be less than -1');\n }\n if (shapeHints[i] === -1) {\n if (unknownDimension !== -1) {\n throw new Error('at most one dimension in shape hints can be -1');\n }\n unknownDimension = i;\n } else {\n if (shapeHints[i] === 0) {\n if (i >= originalDims.length) {\n throw new Error('the dimension with value zero exceeds the dimension size of the input tensor');\n }\n reshapedDims[i] = originalDims[i];\n } else {\n reshapedDims[i] = shapeHints[i];\n }\n newTensorSize *= reshapedDims[i];\n }\n }\n\n const oldTensorSize = ShapeUtil.size(originalDims);\n if (unknownDimension !== -1) {\n if (oldTensorSize % newTensorSize !== 0) {\n throw new Error(`the input tensor cannot be reshaped to the requested shape. Input shape: [${\n originalDims}] Output shape: [${shapeHints}]`);\n }\n reshapedDims[unknownDimension] = oldTensorSize / newTensorSize;\n }\n // validate sizes from originalDims and reshapedDims match\n else {\n if (newTensorSize !== oldTensorSize) {\n throw new Error('reshapedDims and originalDims don\\'t have matching sizes');\n }\n }\n return reshapedDims;\n }\n\n /**\n * Sorts a given array based on the indices in the Perm array\n * Used in Transpose\n * @param a Array to be sorted such as dims or strides\n * @param perm Perm given; if null a will be reversed\n */\n static sortBasedOnPerm(a: readonly number[], perm?: readonly number[]): readonly number[] {\n if (perm) {\n return perm.map((v) => a[v]);\n } else {\n return a.slice().reverse();\n }\n }\n\n /**\n * Pads a given shape according to the padding values\n * @param dims shape of the Tensor to be padded\n * @param pad pad values\n */\n static padShape(dims: readonly number[], pad: readonly number[]): readonly number[] {\n const rank = dims.length;\n return dims.map((v, i) => v + pad[i] + pad[i + rank]);\n }\n\n /**\n * Determines if the two shapes are identical\n * @param shape1\n * @param shape2\n */\n static areEqual(shape1: readonly number[], shape2: readonly number[]): boolean {\n if (shape1.length !== shape2.length) {\n return false;\n }\n return shape1.every((v, i) => v === shape2[i]);\n }\n\n /**\n * Validates if the given `dims` or `shape` is valid in ONNX.js context and returns data size\n * @param dims - input `dims` that needs to be checked\n */\n static validateDimsAndCalcSize(dims: readonly number[]): number {\n if (dims.length > 6) {\n throw new TypeError('Only rank 0 to 6 is supported for tensor shape.');\n }\n let size = 1;\n for (const n of dims) {\n if (!Number.isInteger(n)) {\n throw new TypeError(`Invalid shape: ${n} is not an integer`);\n }\n if (n < 0 || n > 2147483647) {\n throw new TypeError(`Invalid shape: length ${n} is not allowed`);\n }\n size *= n;\n }\n return size;\n }\n\n /**\n * Determines the shape of output tensor y = flatten(x, axis)\n * @param dims - shape of input tensor\n * @param axis - flatten axis, in the range [-r, r]\n */\n static flattenShape(dims: readonly number[], axis: number): readonly number[] {\n if (axis < 0) {\n axis += dims.length;\n }\n const total = dims.reduce((x, y) => x * y, 1);\n const right = dims.slice(axis).reduce((x, y) => x * y, 1);\n const outputDims = [total / right, right];\n\n return outputDims;\n }\n\n /**\n * Determines the shape of output tensor y = squeeze(x, axes)\n * @param dims - shape of input tensor\n * @param axes - squeeze axes\n */\n static squeezeShape(dims: readonly number[], axes: readonly number[]): readonly number[] {\n const outputDims = new Array();\n\n // sanity check\n axes = ShapeUtil.normalizeAxes(axes, dims.length);\n\n for (let i = 0; i < dims.length; i++) {\n const inSqueezeList = axes.indexOf(i) >= 0;\n if (inSqueezeList && dims[i] !== 1) {\n throw new Error('squeeze an axis of size different than 1');\n }\n\n if ((axes.length === 0 && dims[i] > 1) || (axes.length > 0 && !inSqueezeList)) {\n outputDims.push(dims[i]);\n }\n }\n\n return outputDims;\n }\n\n /**\n * Determines the shape of output tensor y = unsqueeze(x, axes)\n * @param dims - shape of input tensor\n * @param axes - unsqueeze axes\n */\n static unsqueezeShape(dims: readonly number[], axes: readonly number[]): readonly number[] {\n const outputDims = new Array(dims.length + axes.length);\n\n // initialize the array elements to 0\n outputDims.fill(0);\n\n // set all axes indices to 1 in outputDims and check for duplicates\n for (let i = 0; i < axes.length; i++) {\n const axis = ShapeUtil.normalizeAxis(axes[i], outputDims.length);\n if (axis >= outputDims.length) {\n throw new Error('\\'axes\\' has an out of range axis');\n }\n if (outputDims[axis] !== 0) {\n throw new Error('\\'axes\\' has a duplicate axis');\n }\n\n outputDims[axis] = 1;\n }\n\n // fill in the zero entries of outputDims with the input tensor's shape\n let inputDimsIterator = 0;\n for (let i = 0; i < outputDims.length; i++) {\n if (outputDims[i] === 0) {\n outputDims[i] = dims[inputDimsIterator++];\n }\n }\n\n // sanity check assertion. 'inputDimsIterator'\n // should be equal to the length of 'dims'\n if (inputDimsIterator !== dims.length) {\n throw new Error('the unsqueezed dimension could not be established');\n }\n\n return outputDims;\n }\n}\n\n// bunch of helper methods that do a variety of math operations\nexport class MathUtil {\n // y = (x*x) + y\n static sqr(\n target: number[]|Tensor.NumberType, source: number[]|Tensor.NumberType, targetIndex: number, sourceIndex: number,\n blockSize: number) {\n if (sourceIndex < 0 || sourceIndex >= source.length) {\n throw new Error('sourceIndex out of bounds');\n }\n if (targetIndex < 0 || targetIndex >= target.length) {\n throw new Error('targetIndex out of bounds');\n }\n if (sourceIndex + blockSize > source.length) {\n throw new Error('source indices to be copied are outside bounds');\n }\n if (targetIndex + blockSize > target.length) {\n throw new Error('target array is too small to hold result');\n }\n\n for (let offset = 0; offset < blockSize; offset++) {\n target[targetIndex + offset] += Math.pow(source[sourceIndex + offset], 2);\n }\n }\n\n // y = ax + y\n static axpy(\n target: number[]|Tensor.NumberType, source: number[]|Tensor.NumberType, targetIndex: number, sourceIndex: number,\n blockSize: number, alpha: number) {\n if (sourceIndex < 0 || sourceIndex >= source.length) {\n throw new Error('sourceIndex out of bounds');\n }\n if (targetIndex < 0 || targetIndex >= target.length) {\n throw new Error('targetIndex out of bounds');\n }\n if (sourceIndex + blockSize > source.length) {\n throw new Error('source indices to be copied are outside bounds');\n }\n if (targetIndex + blockSize > target.length) {\n throw new Error('target array is too small to hold result');\n }\n\n for (let offset = 0; offset < blockSize; offset++) {\n target[targetIndex + offset] += (alpha * source[sourceIndex + offset]);\n }\n }\n\n // y = pow(x, b)\n static powx(\n target: number[]|Tensor.NumberType, source: number[]|Tensor.NumberType, targetIndex: number, sourceIndex: number,\n blockSize: number, b: number) {\n if (sourceIndex < 0 || sourceIndex >= source.length) {\n throw new Error('sourceIndex out of bounds');\n }\n if (targetIndex < 0 || targetIndex >= target.length) {\n throw new Error('targetIndex out of bounds');\n }\n if (sourceIndex + blockSize > source.length) {\n throw new Error('source indices to be copied are outside bounds');\n }\n if (targetIndex + blockSize > target.length) {\n throw new Error('target array is too small to hold result');\n }\n\n for (let offset = 0; offset < blockSize; offset++) {\n target[targetIndex + offset] = Math.pow(source[sourceIndex + offset], b);\n }\n }\n\n // y = x * y\n static mul(\n target: number[]|Tensor.NumberType, source: number[]|Tensor.NumberType, targetIndex: number, sourceIndex: number,\n blockSize: number) {\n if (sourceIndex < 0 || sourceIndex >= source.length) {\n throw new Error('sourceIndex out of bounds');\n }\n if (targetIndex < 0 || targetIndex >= target.length) {\n throw new Error('targetIndex out of bounds');\n }\n if (sourceIndex + blockSize > source.length) {\n throw new Error('source indices to be copied are outside bounds');\n }\n if (targetIndex + blockSize > target.length) {\n throw new Error('target array is too small to hold result');\n }\n\n for (let offset = 0; offset < blockSize; offset++) {\n target[targetIndex + offset] = (source[sourceIndex + offset] * target[targetIndex + offset]);\n }\n }\n}\n\nexport class SplitUtil {\n /**\n * Calculates new Shapes from existing one and the splits given along the axis provides\n * @param dims Shape of the Tensor to be splitted into two or more Shapes\n * @param axis The dimension along which the Tensor will be split\n * @param splits Offsets for the start of each split\n */\n static splitShape(dims: readonly number[], axis: number, split: number[], numOutputs?: number):\n [number[][], number[]] {\n if (split.length === 0) {\n if (!numOutputs) {\n throw new Error('need to know number of outputs when the \\'split\\' attribute is not specified');\n }\n SplitUtil.determineSplit(dims[axis], numOutputs, split);\n }\n\n const shapes: number[][] = [];\n const offsets = [0];\n for (let i = 0; i < split.length; ++i) {\n if (i !== 0) {\n offsets.push(offsets[i - 1] + split[i - 1]);\n }\n const shape = dims.slice();\n shape[axis] = split[i];\n shapes.push(shape);\n }\n return [shapes, offsets];\n }\n\n static determineSplit(numElementsAlongAxis: number, numOutputs: number, split: number[]) {\n // If 'split' is not specified by the user, we need to partition the number of elements equally among the outputs\n if (numElementsAlongAxis % numOutputs !== 0) {\n throw new Error('cannot split tensor to equal sized parts');\n }\n for (let i = 0; i < numOutputs; ++i) {\n split.push(numElementsAlongAxis / numOutputs);\n }\n }\n}\n\nexport class ReduceUtil {\n /**\n * Perform reduce operations on the specific operator\n * @param a Input tensor data\n * @param axes The dimensions along which the Tensor will be reduced\n * @param keepdims If set to true, the axes which are reduced are left in the\n * result as dimensions with size one.\n * @param op1 The operation to be performed on each element in the tensor\n * @param op2 The operation to be performed between elements in the tensor\n */\n static calcReduce(\n a: Tensor, axes: number[], keepdims: boolean, op1: (b: number) => number,\n op2: (a: number, b: number) => number): Tensor {\n const dims = a.dims.slice(0);\n // if axes is not set, perform reduce on all axes\n if (axes.length === 0) {\n dims.forEach((_d, ind) => axes.push(ind));\n }\n // get a temporary broadcastable output shape\n const outputDims = ReduceUtil.calcReduceShape(dims, axes, true);\n\n // loop through the output and calculate result one by one\n const size = ShapeUtil.size(outputDims);\n const y = new Tensor(outputDims, a.type);\n const strides = ShapeUtil.computeStrides(outputDims);\n const inputStrides = ShapeUtil.computeStrides(dims);\n const indicesY = new Array(dims.length);\n for (let i = 0; i < size; i++) {\n const indices = ShapeUtil.offsetToIndices(i, strides);\n // map index\n BroadcastUtil.fillIndex(indices, dims, indicesY);\n y.set(\n indices,\n ReduceUtil.calcReduceByAxis(\n a.numberData, axes, dims, 0, ShapeUtil.indicesToOffset(indicesY, inputStrides), op1, op2));\n }\n\n if (keepdims) {\n return y;\n } else {\n // keepdims == 0, calculate the expected shape\n return new Tensor(\n ReduceUtil.calcReduceShape(dims, axes, keepdims), y.type, undefined, undefined, y.data, y.dataId);\n }\n }\n\n /**\n * Perform reduce operations on the specific operator on specific axes\n * @param a Input tensor data\n * @param axes The dimensions along which the Tensor will be reduced\n * @param dims The input dimension.\n * @param curAxisInd Index in axes specifying the current dimension along\n * which the tensor will be reduced\n * @param pos The current index of element to perform operation\n * @param op1 The operation to be performed on each element in the tensor\n * @param op2 The operation to be performed between elements in the tensor\n */\n static calcReduceByAxis(\n input: Tensor.NumberType, axes: number[], dims: number[], curAxisInd: number, pos: number,\n op1: (b: number) => number, op2: (a: number, b: number) => number): number {\n let res = 0;\n if (curAxisInd >= axes.length) {\n return op1(input[pos]);\n }\n const axis = axes[curAxisInd];\n const step = axis >= dims.length ? 1 : ShapeUtil.size(dims.slice(axis + 1));\n for (let i = 0; i < dims[axis]; i++) {\n res = i === 0 ? ReduceUtil.calcReduceByAxis(input, axes, dims, curAxisInd + 1, pos, op1, op2) :\n op2(res, ReduceUtil.calcReduceByAxis(input, axes, dims, curAxisInd + 1, pos, op1, op2));\n pos += step;\n }\n return res;\n }\n\n /**\n * Calculate the expected shape of a reduce operation\n * @param dims The input tensor dimension\n * @param axes The dimensions along which the Tensor will be reduced\n * @param keepdims If set to true, the axes which are reduced are left in the\n * result as dimensions with size one.\n */\n static calcReduceShape(dims: readonly number[], axes: readonly number[], keepDims: boolean): number[] {\n const outputDims = dims.slice();\n for (let i = 0; i < axes.length; i++) {\n if (keepDims) {\n outputDims[axes[i]] = 1;\n } else {\n outputDims[axes[i]] = 0;\n }\n }\n return outputDims.filter(dim => dim !== 0);\n }\n}\n\nexport class PoolConvUtil {\n /**\n * Adjust the kernel, strides, pads to correct rank. Set to default value if not present\n * @param isGlobalOperator If true, perform global pooling.\n * @param inputDims The input tensor dimension.\n * @param kernelShape The size of the kernel along each axis.\n * @param strides Stride along each axis.\n * @param dilations Dilation along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n */\n static adjustPoolAttributes(\n isGlobalOperator: boolean, inputDims: readonly number[], kernelShape: number[], strides: number[],\n dilations: number[], pads: number[]) {\n if (!isGlobalOperator && kernelShape.length !== inputDims.length - 2) {\n throw new Error('length of specified kernel shapes should be 2 less than length of input dimensions');\n }\n\n if (isGlobalOperator) {\n // adjust kernel shape to cover the input dims\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n if (dim >= kernelShape.length) {\n kernelShape.push(inputDims[dim + 2]);\n } else {\n kernelShape[dim] = inputDims[dim + 2];\n }\n }\n }\n\n // adjust strides length to match kernel shape length\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (dim < strides.length) {\n if (strides[dim] < 0) {\n throw new Error('strides should be greater than or equal to 1');\n }\n } else {\n strides.push(1);\n }\n }\n\n // adjust dilation value\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (dim < dilations.length) {\n if (dilations[dim] < 0) {\n throw new Error('dilations should be greater than or equal to 1');\n }\n } else {\n dilations.push(1);\n }\n }\n\n // adjust pads length to match 2 * kernel shape length\n for (let dim = 0; dim < kernelShape.length * 2; dim++) {\n if (dim < pads.length) {\n if (pads[dim] < 0) {\n throw new Error('pad should be greater than or equal to 1');\n }\n } else {\n pads.push(0);\n }\n }\n\n // sanity checks for values in kernel shapes and pads\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (kernelShape[dim] <= 0) {\n throw new Error('kernel shapes need to be greater than 0');\n }\n\n if (pads[dim] >= kernelShape[dim] || pads[dim + kernelShape.length] >= kernelShape[dim]) {\n throw new Error('pads should be smaller than kernel');\n }\n }\n }\n\n // adjust pad values based on 'autoPad' attribute\n static adjustPadsBasedOnAutoPad(\n inputDims: readonly number[], strides: readonly number[], dilations: readonly number[],\n kernelShape: readonly number[], pads: number[], autoPad?: string) {\n if (!autoPad) {\n return;\n }\n\n if (pads.length !== 2 * (inputDims.length - 2)) {\n throw new Error('length of pads should be twice the length of data dimensions');\n }\n\n if (strides.length !== (inputDims.length - 2)) {\n throw new Error('length of strides should be the length of data dimensions');\n }\n\n if (kernelShape.length !== (inputDims.length - 2)) {\n throw new Error('length of kernel shapes should be the length of data dimensions');\n }\n\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n PoolConvUtil.adjustPadAndReturnShape(\n inputDims[dim + 2], strides[dim], dilations[dim], kernelShape[dim], pads, dim, dim + inputDims.length - 2,\n autoPad);\n }\n }\n\n /**\n * Calculate the output shape for Pool ops based on input attributes. (Should be used only for Pool ops)\n * @param isGlobalOperator If true, perform global pooling.\n * @param inputDims The input tensor dimension. (inputs[0].dims)\n * @param strides Stride along each axis.\n * @param dilations Dilation along each axis.\n * @param kernelShape The size of the kernel along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n * @param autoPad DEPRECATED attribute supported for legacy models. Specifies how to implicitly calculate pads in each\n * dimension. Can take values NOTSET, SAME_UPPER, SAME_LOWER, or VALID.\n */\n static computePoolOutputShape(\n isGlobalOperator: boolean, inputDims: readonly number[], strides: number[], dilations: number[],\n kernelShape: number[], pads: number[], autoPad?: string): number[] {\n if (inputDims.length <= 0) {\n throw new Error('input shape must be of size greater than 0');\n }\n\n // Add batch size and number of channels of output\n const outputDims = [inputDims[0], inputDims[1]];\n\n PoolConvUtil.computeShapeHelper(\n isGlobalOperator, inputDims, outputDims, strides, dilations, kernelShape, pads, autoPad);\n return outputDims;\n }\n\n /**\n * Calculate the output shape for Conv op based on input attributes. (Should be used only for Conv op)\n * @param inputDims The input tensor dimension. (inputs[0].dims)\n * @param filterDims The filter tensor dimension. (inputs[1].dims)\n * @param strides Stride along each axis.\n * @param kernelShape The size of the kernel along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n * @param autoPad DEPRECATED attribute supported for legacy models. Specifies how to implicitly calculate pads in each\n * dimension. Can take values NOTSET, SAME_UPPER, SAME_LOWER, or VALID.\n */\n static computeConvOutputShape(\n inputDims: readonly number[], filterDims: readonly number[], strides: number[], dilations: number[],\n kernelShape: number[], pads: number[], autoPad?: string): number[] {\n if (inputDims.length <= 0 || filterDims.length <= 0) {\n throw new Error('invalid input tensor dims or invalid filter tensor dims');\n }\n\n // Add batch size and number of channels of output\n const outputDims = [inputDims[0], filterDims[0]];\n\n PoolConvUtil.computeShapeHelper(false, inputDims, outputDims, strides, dilations, kernelShape, pads, autoPad);\n return outputDims;\n }\n\n // will compute output shapes for data dimensions ONLY (i.e.) no batch size and channels\n // called by computePoolOutputShape() and computeConvOutputShape()\n // adjust pads based on 'autoPad' attribute prior to shape computation\n private static computeShapeHelper(\n isGlobalOperator: boolean, inputDims: readonly number[], outputDims: number[], strides: readonly number[],\n dilations: readonly number[], kernelShape: readonly number[], pads: number[], autoPad?: string) {\n if (isGlobalOperator) {\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n outputDims.push(1);\n }\n } else {\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n outputDims.push(PoolConvUtil.adjustPadAndReturnShape(\n inputDims[dim + 2], strides[dim], dilations[dim], kernelShape[dim], pads, dim, dim + inputDims.length - 2,\n autoPad));\n }\n }\n }\n\n // helper for computeShapeHelper() and adjustPadsBasedOnAutoPad()\n // adjusts pad value for given 'autoPad' string and computes output shape along a particular dimension\n private static adjustPadAndReturnShape(\n inSize: number, stride: number, dilation: number, kernel: number, pads: number[], padHeadIndex: number,\n padTailIndex: number, autoPad?: string): number {\n const dkernel = dilation * (kernel - 1) + 1;\n if (autoPad && autoPad !== 'NOTSET') {\n switch (autoPad) {\n case 'VALID':\n pads[padHeadIndex] = 0;\n pads[padTailIndex] = 0;\n return Math.floor(((inSize - dkernel) / stride) + 1);\n case 'SAME_LOWER':\n case 'SAME_UPPER':\n if (dilation !== 1) {\n throw new Error('Dilation not supported for SAME_UPPER or SAME_LOWER');\n } else {\n const legacyTargetSize = (inSize + stride - 1) / stride;\n const padNeeded = (legacyTargetSize - 1) * stride + kernel - inSize;\n pads[padHeadIndex] =\n (autoPad === 'SAME_LOWER') ? Math.floor((padNeeded + 1) / 2) : Math.floor(padNeeded / 2);\n pads[padTailIndex] = padNeeded - pads[padHeadIndex];\n return Math.floor(((inSize + padNeeded - kernel) / stride) + 1);\n }\n default:\n throw new Error('Unsupported AutoPad type');\n }\n } else {\n return Math.floor(((inSize + pads[padHeadIndex] + pads[padTailIndex] - dkernel) / stride) + 1);\n }\n }\n}\n\nexport const MIN_CLIP = -3.4028234663852886e+38;\nexport const MAX_CLIP = 3.4028234663852886e+38;\n\nexport function decodeUtf8String(buffer: Uint8Array): string {\n return new TextDecoder().decode(buffer);\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Guid} from 'guid-typescript';\nimport Long from 'long';\n\nimport {onnxruntime} from './ort-schema/flatbuffers/ort-generated';\nimport {onnx} from './ort-schema/protobuf/onnx';\nimport {decodeUtf8String, ProtoUtil, ShapeUtil} from './util';\n\nimport ortFbs = onnxruntime.experimental.fbs;\n\nexport declare namespace Tensor {\n export interface DataTypeMap {\n bool: Uint8Array;\n float32: Float32Array;\n float64: Float64Array;\n string: string[];\n int8: Int8Array;\n uint8: Uint8Array;\n int16: Int16Array;\n uint16: Uint16Array;\n int32: Int32Array;\n uint32: Uint32Array;\n int64: BigInt64Array;\n }\n\n export type DataType = keyof DataTypeMap;\n\n export type StringType = Tensor.DataTypeMap['string'];\n export type BooleanType = Tensor.DataTypeMap['bool'];\n export type IntegerType = Tensor.DataTypeMap['int8']|Tensor.DataTypeMap['uint8']|Tensor.DataTypeMap['int16']|\n Tensor.DataTypeMap['uint16']|Tensor.DataTypeMap['int32']|Tensor.DataTypeMap['uint32'];\n export type FloatType = Tensor.DataTypeMap['float32']|Tensor.DataTypeMap['float64'];\n export type NumberType = BooleanType|IntegerType|FloatType;\n\n export type Id = Guid;\n}\n\ntype TensorData = Tensor.DataTypeMap[Tensor.DataType];\n\ntype DataProvider = (id: Tensor.Id) => TensorData;\ntype AsyncDataProvider = (id: Tensor.Id) => Promise;\n\nexport class Tensor {\n /**\n * get the underlying tensor data\n */\n get data(): TensorData {\n if (this.cache === undefined) {\n const data = this.dataProvider!(this.dataId);\n if (data.length !== this.size) {\n throw new Error('Length of data provided by the Data Provider is inconsistent with the dims of this Tensor.');\n }\n this.cache = data;\n }\n return this.cache;\n }\n\n /**\n * get the underlying string tensor data. Should only use when type is STRING\n */\n get stringData() {\n if (this.type !== 'string') {\n throw new TypeError('data type is not string');\n }\n\n return this.data as Tensor.StringType;\n }\n\n /**\n * get the underlying integer tensor data. Should only use when type is one of the following: (UINT8, INT8, UINT16,\n * INT16, INT32, UINT32, BOOL)\n */\n get integerData() {\n switch (this.type) {\n case 'uint8':\n case 'int8':\n case 'uint16':\n case 'int16':\n case 'int32':\n case 'uint32':\n case 'bool':\n return this.data as Tensor.IntegerType;\n\n default:\n throw new TypeError('data type is not integer (uint8, int8, uint16, int16, int32, uint32, bool)');\n }\n }\n\n /**\n * get the underlying float tensor data. Should only use when type is one of the following: (FLOAT, DOUBLE)\n */\n get floatData() {\n switch (this.type) {\n case 'float32':\n case 'float64':\n return this.data as Tensor.FloatType;\n\n default:\n throw new TypeError('data type is not float (float32, float64)');\n }\n }\n\n /**\n * get the underlying number tensor data. Should only use when type is one of the following: (UINT8, INT8, UINT16,\n * INT16, INT32, UINT32, BOOL, FLOAT, DOUBLE)\n */\n get numberData() {\n if (this.type !== 'string') {\n return this.data as Tensor.NumberType;\n }\n throw new TypeError('type cannot be non-number (string)');\n }\n\n /**\n * get value of an element at the given indices\n */\n get(indices: readonly number[]): Tensor.DataTypeMap[Tensor.DataType][number] {\n return this.data[ShapeUtil.indicesToOffset(indices, this.strides)];\n }\n\n /**\n * set value of an element at the given indices\n */\n set(indices: readonly number[], value: Tensor.DataTypeMap[Tensor.DataType][number]) {\n this.data[ShapeUtil.indicesToOffset(indices, this.strides)] = value;\n }\n\n /**\n * get the underlying tensor data asynchronously\n */\n async getData(): Promise {\n if (this.cache === undefined) {\n this.cache = await this.asyncDataProvider!(this.dataId);\n }\n return this.cache;\n }\n\n /**\n * get the number of elements in the tensor\n */\n public readonly size: number;\n\n private _strides: readonly number[];\n /**\n * get the strides for each dimension\n */\n get strides(): readonly number[] {\n if (!this._strides) {\n this._strides = ShapeUtil.computeStrides(this.dims);\n }\n return this._strides;\n }\n\n constructor(\n /**\n * get the dimensions of the tensor\n */\n public readonly dims: readonly number[],\n /**\n * get the type of the tensor\n */\n public readonly type: Tensor.DataType, private dataProvider?: DataProvider,\n private asyncDataProvider?: AsyncDataProvider, private cache?: TensorData,\n /**\n * get the data ID that used to map to a tensor data\n */\n public readonly dataId: Guid = Guid.create()) {\n this.size = ShapeUtil.validateDimsAndCalcSize(dims);\n const size = this.size;\n const empty = (dataProvider === undefined && asyncDataProvider === undefined && cache === undefined);\n\n if (cache !== undefined) {\n if (cache.length !== size) {\n throw new RangeError('Input dims doesn\\'t match data length.');\n }\n }\n\n if (type === 'string') {\n if (cache !== undefined && (!Array.isArray(cache) || !cache.every(i => typeof i === 'string'))) {\n throw new TypeError('cache should be a string array');\n }\n\n if (empty) {\n this.cache = new Array(size);\n }\n } else {\n if (cache !== undefined) {\n const constructor = dataviewConstructor(type);\n if (!(cache instanceof constructor)) {\n throw new TypeError(`cache should be type ${constructor.name}`);\n }\n }\n\n if (empty) {\n const buf = new ArrayBuffer(size * sizeof(type));\n this.cache = createView(buf, type);\n }\n }\n }\n\n /**\n * Construct new Tensor from a ONNX Tensor object\n * @param tensorProto the ONNX Tensor\n */\n static fromProto(tensorProto: onnx.ITensorProto): Tensor {\n if (!tensorProto) {\n throw new Error('cannot construct Value from an empty tensor');\n }\n const type = ProtoUtil.tensorDataTypeFromProto(tensorProto.dataType!);\n const dims = ProtoUtil.tensorDimsFromProto(tensorProto.dims!);\n\n const value = new Tensor(dims, type);\n\n if (type === 'string') {\n // When it's STRING type, the value should always be stored in field\n // 'stringData'\n tensorProto.stringData!.forEach((str, i) => {\n value.data[i] = decodeUtf8String(str);\n });\n\n } else if (\n tensorProto.rawData && typeof tensorProto.rawData.byteLength === 'number' &&\n tensorProto.rawData.byteLength > 0) {\n // NOT considering segment for now (IMPORTANT)\n\n // populate value from rawData\n const dataDest = value.data;\n const dataSource =\n new DataView(tensorProto.rawData.buffer, tensorProto.rawData.byteOffset, tensorProto.rawData.byteLength);\n const elementSize = sizeofProto(tensorProto.dataType!);\n const length = tensorProto.rawData.byteLength / elementSize;\n\n if (tensorProto.rawData.byteLength % elementSize !== 0) {\n throw new Error('invalid buffer length');\n }\n if (dataDest.length !== length) {\n throw new Error('buffer length mismatch');\n }\n\n for (let i = 0; i < length; i++) {\n const n = readProto(dataSource, tensorProto.dataType!, i * elementSize);\n dataDest[i] = n;\n }\n } else {\n // populate value from array\n let array: Array;\n switch (tensorProto.dataType) {\n case onnx.TensorProto.DataType.FLOAT:\n array = tensorProto.floatData!;\n break;\n case onnx.TensorProto.DataType.INT32:\n case onnx.TensorProto.DataType.INT16:\n case onnx.TensorProto.DataType.UINT16:\n case onnx.TensorProto.DataType.INT8:\n case onnx.TensorProto.DataType.UINT8:\n case onnx.TensorProto.DataType.BOOL:\n array = tensorProto.int32Data!;\n break;\n case onnx.TensorProto.DataType.INT64:\n array = tensorProto.int64Data!;\n break;\n case onnx.TensorProto.DataType.DOUBLE:\n array = tensorProto.doubleData!;\n break;\n case onnx.TensorProto.DataType.UINT32:\n case onnx.TensorProto.DataType.UINT64:\n array = tensorProto.uint64Data!;\n break;\n default:\n // should never run here\n throw new Error('unspecific error');\n }\n\n if (array === null || array === undefined) {\n throw new Error('failed to populate data from a tensorproto value');\n }\n\n const data = value.data;\n if (data.length !== array.length) {\n throw new Error('array length mismatch');\n }\n\n for (let i = 0; i < array.length; i++) {\n const element = array[i];\n if (Long.isLong(element)) {\n data[i] = longToNumber(element, tensorProto.dataType);\n } else {\n data[i] = element;\n }\n }\n }\n\n return value;\n }\n\n /**\n * Construct new Tensor from raw data\n * @param data the raw data object. Should be a string array for 'string' tensor, and the corresponding typed array\n * for other types of tensor.\n * @param dims the dimensions of the tensor\n * @param type the type of the tensor\n */\n static fromData(data: Tensor.DataTypeMap[Tensor.DataType], dims: readonly number[], type: Tensor.DataType) {\n return new Tensor(dims, type, undefined, undefined, data);\n }\n\n static fromOrtTensor(ortTensor: ortFbs.Tensor) {\n if (!ortTensor) {\n throw new Error('cannot construct Value from an empty tensor');\n }\n const dims = ProtoUtil.tensorDimsFromORTFormat(ortTensor);\n const type = ProtoUtil.tensorDataTypeFromProto(ortTensor.dataType());\n\n const value = new Tensor(dims, type);\n\n if (type === 'string') {\n // When it's STRING type, the value should always be stored in field\n // 'stringData'\n for (let i = 0; i < ortTensor.stringDataLength(); i++) {\n value.data[i] = ortTensor.stringData(i);\n }\n\n } else if (\n ortTensor.rawDataArray() && typeof ortTensor.rawDataLength() === 'number' && ortTensor.rawDataLength() > 0) {\n // NOT considering segment for now (IMPORTANT)\n\n // populate value from rawData\n const dataDest = value.data;\n const dataSource = new DataView(\n ortTensor.rawDataArray()!.buffer, ortTensor.rawDataArray()!.byteOffset, ortTensor.rawDataLength());\n const elementSize = sizeofProto(ortTensor.dataType());\n const length = ortTensor.rawDataLength() / elementSize;\n\n if (ortTensor.rawDataLength() % elementSize !== 0) {\n throw new Error('invalid buffer length');\n }\n if (dataDest.length !== length) {\n throw new Error('buffer length mismatch');\n }\n\n for (let i = 0; i < length; i++) {\n const n = readProto(dataSource, ortTensor.dataType(), i * elementSize);\n dataDest[i] = n;\n }\n }\n return value;\n }\n}\n\nfunction sizeof(type: Tensor.DataType): number {\n switch (type) {\n case 'bool':\n case 'int8':\n case 'uint8':\n return 1;\n case 'int16':\n case 'uint16':\n return 2;\n case 'int32':\n case 'uint32':\n case 'float32':\n return 4;\n case 'float64':\n return 8;\n default:\n throw new Error(`cannot calculate sizeof() on type ${type}`);\n }\n}\n\nfunction sizeofProto(type: onnx.TensorProto.DataType|ortFbs.TensorDataType): number {\n switch (type) {\n case onnx.TensorProto.DataType.UINT8:\n case onnx.TensorProto.DataType.INT8:\n case onnx.TensorProto.DataType.BOOL:\n return 1;\n case onnx.TensorProto.DataType.UINT16:\n case onnx.TensorProto.DataType.INT16:\n return 2;\n case onnx.TensorProto.DataType.FLOAT:\n case onnx.TensorProto.DataType.INT32:\n case onnx.TensorProto.DataType.UINT32:\n return 4;\n case onnx.TensorProto.DataType.INT64:\n case onnx.TensorProto.DataType.DOUBLE:\n case onnx.TensorProto.DataType.UINT64:\n return 8;\n default:\n throw new Error(`cannot calculate sizeof() on type ${onnx.TensorProto.DataType[type]}`);\n }\n}\n\nfunction createView(dataBuffer: ArrayBuffer, type: Tensor.DataType) {\n return new (dataviewConstructor(type))(dataBuffer);\n}\n\nfunction dataviewConstructor(type: Tensor.DataType) {\n switch (type) {\n case 'bool':\n case 'uint8':\n return Uint8Array;\n case 'int8':\n return Int8Array;\n case 'int16':\n return Int16Array;\n case 'uint16':\n return Uint16Array;\n case 'int32':\n return Int32Array;\n case 'uint32':\n return Uint32Array;\n case 'int64':\n return BigInt64Array;\n case 'float32':\n return Float32Array;\n case 'float64':\n return Float64Array;\n default:\n // should never run to here\n throw new Error('unspecified error');\n }\n}\n\n// convert a long number to a 32-bit integer (cast-down)\nfunction longToNumber(i: Long, type: onnx.TensorProto.DataType|ortFbs.TensorDataType): number {\n // INT64, UINT32, UINT64\n if (type === onnx.TensorProto.DataType.INT64 || type === ortFbs.TensorDataType.INT64) {\n if (i.greaterThanOrEqual(2147483648) || i.lessThan(-2147483648)) {\n throw new TypeError('int64 is not supported');\n }\n } else if (\n type === onnx.TensorProto.DataType.UINT32 || type === ortFbs.TensorDataType.UINT32 ||\n type === onnx.TensorProto.DataType.UINT64 || type === ortFbs.TensorDataType.UINT64) {\n if (i.greaterThanOrEqual(4294967296) || i.lessThan(0)) {\n throw new TypeError('uint64 is not supported');\n }\n } else {\n throw new TypeError(`not a LONG type: ${onnx.TensorProto.DataType[type]}`);\n }\n\n return i.toNumber();\n}\n\n// read one value from TensorProto\nfunction readProto(view: DataView, type: onnx.TensorProto.DataType|ortFbs.TensorDataType, byteOffset: number): number {\n switch (type) {\n case onnx.TensorProto.DataType.BOOL:\n case onnx.TensorProto.DataType.UINT8:\n return view.getUint8(byteOffset);\n case onnx.TensorProto.DataType.INT8:\n return view.getInt8(byteOffset);\n case onnx.TensorProto.DataType.UINT16:\n return view.getUint16(byteOffset, true);\n case onnx.TensorProto.DataType.INT16:\n return view.getInt16(byteOffset, true);\n case onnx.TensorProto.DataType.FLOAT:\n return view.getFloat32(byteOffset, true);\n case onnx.TensorProto.DataType.INT32:\n return view.getInt32(byteOffset, true);\n case onnx.TensorProto.DataType.UINT32:\n return view.getUint32(byteOffset, true);\n case onnx.TensorProto.DataType.INT64:\n return longToNumber(\n Long.fromBits(view.getUint32(byteOffset, true), view.getUint32(byteOffset + 4, true), false), type);\n case onnx.TensorProto.DataType.DOUBLE:\n return view.getFloat64(byteOffset, true);\n case onnx.TensorProto.DataType.UINT64:\n return longToNumber(\n Long.fromBits(view.getUint32(byteOffset, true), view.getUint32(byteOffset + 4, true), true), type);\n default:\n throw new Error(`cannot read from DataView for type ${onnx.TensorProto.DataType[type]}`);\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * represent a version irrelevant abstraction of for GLSL source code\n */\nexport interface Glsl {\n readonly version: string;\n readonly attribute: string;\n readonly varyingVertex: string;\n readonly varyingFrag: string;\n readonly texture2D: string;\n readonly output: string;\n readonly outputDeclaration: string;\n}\n\nconst GLSL_ES_2_0: Glsl = {\n version: '',\n attribute: 'attribute',\n varyingVertex: 'varying',\n varyingFrag: 'varying',\n texture2D: 'texture2D',\n output: 'gl_FragColor',\n outputDeclaration: '',\n};\nconst GLSL_ES_3_0: Glsl = {\n version: '#version 300 es',\n attribute: 'in',\n varyingVertex: 'out',\n varyingFrag: 'in',\n texture2D: 'texture',\n output: 'outputColor',\n outputDeclaration: 'out vec4 outputColor;',\n};\n\nexport function getGlsl(version: 1|2) {\n return version === 1 ? GLSL_ES_2_0 : GLSL_ES_3_0;\n}\n\nexport function getVertexShaderSource(version: 1|2): string {\n const glsl = getGlsl(version);\n return `${glsl.version}\n precision highp float;\n ${glsl.attribute} vec3 position;\n ${glsl.attribute} vec2 textureCoord;\n\n ${glsl.varyingVertex} vec2 TexCoords;\n\n void main()\n {\n gl_Position = vec4(position, 1.0);\n TexCoords = textureCoord;\n }`;\n}\n\nexport function getFragShaderPreamble(version: 1|2): string {\n const glsl = getGlsl(version);\n return `${glsl.version}\n precision highp float;\n precision highp int;\n precision highp sampler2D;\n ${glsl.varyingFrag} vec2 TexCoords;\n ${glsl.outputDeclaration}\n const vec2 halfCR = vec2(0.5, 0.5);\n\n // Custom vector types to handle higher dimenalities.\n struct ivec5\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n };\n\n struct ivec6\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n int v;\n };\n\n int imod(int x, int y) {\n return x - y * (x / y);\n }\n\n `;\n}\n\nexport function getDefaultFragShaderMain(version: 1|2, outputShapeLength: number): string {\n const glsl = getGlsl(version);\n return `\n void main() {\n int indices[${outputShapeLength}];\n toVec(TexCoords, indices);\n vec4 result = vec4(process(indices));\n ${glsl.output} = result;\n }\n `;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../tensor';\n\n/**\n * Layout info is used for mapping n-dimensional array to 2D textures\n * The layout is created by the TextureLayoutStrategy based on\n * the Tensor's dimensions and strides\n */\nexport interface TextureLayout {\n width: number;\n height: number;\n /**\n * specify the number of value that encoded in a single pixel\n */\n channels: 1|2|3|4;\n /**\n * whether in packed mode or not\n */\n isPacked?: boolean;\n /**\n * the normalized shape\n */\n shape: readonly number[];\n /**\n * the stride of each dimensions, calculated according to shape\n */\n strides: readonly number[];\n /**\n * the original shape(dims) of the corresponding tensor\n */\n unpackedShape: readonly number[];\n\n reversedWH?: boolean;\n}\nexport interface TextureData extends TextureLayout {\n tensor: Tensor;\n texture: WebGLTexture;\n}\n\nexport enum TextureType {\n unpacked, // <-- normal unpacked texture\n unpackedReversed, // <-- unpacked texture used in old ONNX.js implementation (deprecated)\n packed, // <-- normal packed texture\n downloadUint8AsFloat, // <-- ONLY used in texture downloading for iOS devices\n packedLastDimension // <-- ONLY used in old ONNX.js Conv implementation for input W (deprecated)\n}\n\nexport interface TensorInfo {\n id?: Tensor.Id;\n dims: readonly number[];\n type: Tensor.DataType;\n textureType: TextureType;\n}\n\nexport interface ProgramVariable {\n type: 'float'|'int';\n name: string;\n arrayLength?: number;\n data: number|number[];\n}\n\n/**\n * A set of metadata of a shader program.\n */\nexport interface ProgramMetadata {\n /**\n * the name of the program. used for debugging and profiling\n */\n name: string;\n /**\n * texture types for each input\n */\n inputTypes: TextureType[];\n /**\n * names of each input\n */\n inputNames: string[];\n /**\n * an optional string as a cache hint in the artifact cache\n */\n cacheHint?: string;\n}\n\n/**\n * A ProgramInfoLoader allows\n */\nexport interface ProgramInfoLoader extends ProgramMetadata {\n /**\n * a function to get the program info\n */\n get(): ProgramInfo;\n}\n\n/**\n * A set of data that represent a shader program\n */\nexport interface ProgramInfo extends ProgramMetadata {\n /**\n * information of uniform variables\n */\n variables?: ProgramVariable[];\n /**\n * tensor info for output\n */\n output: TensorInfo;\n /**\n * the shader's processing source code\n */\n shaderSource: string;\n /**\n * whether the shader source contains a customized main function implementation\n */\n hasMain?: boolean;\n}\n\nexport interface VariableInfo {\n type: 'float'|'int';\n name: string;\n arrayLength?: number;\n}\n\nexport interface ProgramVariable {\n type: 'float'|'int';\n name: string;\n arrayLength?: number;\n data: number|number[];\n}\n\n/**\n * Information of uniforms that shader uses\n */\nexport interface UniformInfo {\n type: 'sampler2D'|VariableInfo['type'];\n name: string;\n arrayLength?: number;\n}\n\nexport interface UniformLocation extends UniformInfo {\n location: WebGLUniformLocation;\n}\n\n/**\n * Artifact is the result of compilation\n * It does not contain input of output data\n * However anything that could be run as a \"program\"\n */\nexport interface Artifact {\n programInfo: ProgramInfo;\n program: WebGLProgram;\n uniformLocations: UniformLocation[];\n attribLocations: {position: number; textureCoord: number};\n}\nexport declare namespace Artifact {\n type UniformLocations = Artifact['uniformLocations'];\n type AttribLocations = Artifact['attribLocations'];\n}\n\nexport interface UniformData {\n [name: string]: number|number[];\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {assert} from '../../util';\n/**\n * Given a non RGBA shape calculate the R version\n * It is assumed that the dimensions are multiples of given channels\n * NOTE: it is always the last dim that gets packed.\n * @param unpackedShape original shape to create a packed version from\n */\nexport function getPackedShape(unpackedShape: readonly number[]): readonly number[] {\n const len = unpackedShape.length;\n return unpackedShape.slice(0, len - 1).concat(unpackedShape[len - 1] / 4);\n}\n\nexport async function repeatedTry(\n checkFn: () => boolean, delayFn = (_counter: number) => 0, maxCounter?: number): Promise {\n return new Promise((resolve, reject) => {\n let tryCount = 0;\n\n const tryFn = () => {\n if (checkFn()) {\n resolve();\n return;\n }\n\n tryCount++;\n\n const nextBackoff = delayFn(tryCount);\n\n if (maxCounter != null && tryCount >= maxCounter) {\n reject();\n return;\n }\n setTimeout(tryFn, nextBackoff);\n };\n\n tryFn();\n });\n}\n\n/**\n * Generates the function name from an input sampler name.\n * @param samplerName Name of the sampler.\n */\nexport function generateShaderFuncNameFromInputSamplerName(samplerName: string): string {\n assert(typeof samplerName !== 'undefined' && samplerName.length !== 0, () => 'empty string found for sampler name');\n return 'get' + samplerName.charAt(0).toUpperCase() + samplerName.slice(1);\n}\n\n/**\n * Generates the function name from an input sampler name at output coordinates.\n * @param samplerName Name of the sampler.\n */\nexport function generateShaderFuncNameFromInputSamplerNameAtOutCoords(samplerName: string): string {\n assert(typeof samplerName !== 'undefined' && samplerName.length !== 0, () => 'empty string found for sampler name');\n return 'get' + samplerName.charAt(0).toUpperCase() + samplerName.slice(1) + 'AtOutCoords';\n}\n\n/** Returns a new input shape (a copy) that has a squeezed logical shape. */\nexport function squeezeInputShape(inputShape: readonly number[], squeezedShape: number[]): number[] {\n // Deep copy.\n let newInputShape: number[] = JSON.parse(JSON.stringify(inputShape));\n newInputShape = squeezedShape;\n return newInputShape;\n}\n\n/** Returns a list of squeezed parameters for shader functions */\nexport function getSqueezedParams(params: string[], keptDims: number[]): string {\n return keptDims.map(d => params[d]).join(', ');\n}\n\n/** Returns the data type for different ranks. */\nexport function getCoordsDataType(rank: number): string {\n if (rank <= 1) {\n return 'int';\n } else if (rank === 2) {\n return 'ivec2';\n } else if (rank === 3) {\n return 'ivec3';\n } else if (rank === 4) {\n return 'ivec4';\n } else if (rank === 5) {\n return 'ivec5';\n } else if (rank === 6) {\n return 'ivec6';\n } else {\n throw Error(`GPU for rank ${rank} is not yet supported`);\n }\n}\n\nexport function getGlChannels(rank = 6): string[] {\n return ['x', 'y', 'z', 'w', 'u', 'v'].slice(0, rank);\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {getGlChannels} from '../utils';\n\nexport function getVecChannels(name: string, rank: number): string[] {\n return getGlChannels(rank).map(d => `${name}.${d}`);\n}\n\nexport function getChannels(name: string, rank: number): string[] {\n if (rank === 1) {\n return [name];\n }\n return getVecChannels(name, rank);\n}\n\nexport function unpackFromChannel(): string {\n return `\n float getChannel(vec4 frag, int dim) {\n int modCoord = imod(dim, 2);\n return modCoord == 0 ? frag.r : frag.g;\n }\n\n float getChannel(vec4 frag, vec2 innerDims) {\n vec2 modCoord = mod(innerDims, 2.);\n return modCoord.x == 0. ?\n (modCoord.y == 0. ? frag.r : frag.g) :\n (modCoord.y == 0. ? frag.b : frag.a);\n }\n `;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, TextureType} from '../types';\nimport {getCoordsDataType} from '../utils';\n\nimport {getChannels} from './packing-utils';\n\nconst packProgramMetadata = {\n name: 'pack',\n inputNames: ['A'],\n inputTypes: [TextureType.unpackedReversed]\n};\n\nconst createPackProgramInfo = (handler: WebGLInferenceHandler, input: Tensor): ProgramInfo => {\n const glsl = getGlsl(handler.session.backend.glContext.version);\n const inputShape = input.dims;\n\n const inputRank = inputShape.length;\n // createTextureLayoutFromShape won't change output rank. Need to verify by running tests\n const outputRank = input.dims.length;\n\n const coordsDataType = getCoordsDataType(outputRank);\n const channels = getChannels('rc', outputRank);\n const setup = getSetup(outputRank, channels, inputShape[inputShape.length - 2], inputShape[inputShape.length - 1]);\n\n let reversedInputWH;\n if (inputRank === 0) {\n reversedInputWH = [1, 1];\n } else if (inputRank === 1) {\n reversedInputWH = [inputShape[0], 1];\n } else {\n reversedInputWH = [inputShape[outputRank - 1], inputShape[outputRank - 2]];\n }\n const outOfBoundsCondition = getOutOfBoundsCondition(outputRank, reversedInputWH, channels);\n const output = getOutput(inputShape, channels);\n\n const shaderSource = `\n void main() {\n ${coordsDataType} rc = getOutputCoords();\n\n if(${outOfBoundsCondition}) {\n ${glsl.output} = vec4(0);\n } else {\n ${setup}\n\n ${glsl.output} = vec4(${output});\n }\n }\n `;\n return {\n ...packProgramMetadata,\n hasMain: true,\n output: {dims: input.dims, type: input.type, textureType: TextureType.packed},\n shaderSource\n };\n};\n\nexport const createPackProgramInfoLoader = (handler: WebGLInferenceHandler, input: Tensor): ProgramInfoLoader =>\n ({...packProgramMetadata, get: () => createPackProgramInfo(handler, input)});\n\n/**\n * check output coordinate location and return false if it is outside input's width/height boundary\n */\nfunction getOutOfBoundsCondition(rank: number, shape: readonly number[], dims: string[]): string {\n if (rank === 0) {\n return 'false';\n }\n if (rank === 1) {\n return `rc > ${shape[0]}`;\n }\n\n let cond = '';\n for (let i = rank - 2; i < rank; i++) {\n cond += `${dims[i]} >= ${shape[i - rank + 2]}`;\n if (i < rank - 1) {\n cond += '||';\n }\n }\n\n return cond;\n}\n\n/**\n * code snippet to sample input texture with output coordinates\n */\nfunction getOutput(shape: readonly number[], dims: string[]): string {\n const rank = shape.length;\n\n if (rank === 0) {\n return 'getA(), 0, 0, 0';\n }\n\n if (rank === 1) {\n return `getA(rc),\n rc + 1 >= ${shape[0]} ? 0. : getA(rc + 1),\n 0, 0`;\n }\n\n const coord00 = 'r, c';\n const coord01 = 'r, cp1';\n const coord10 = 'rp1, c';\n const coord11 = 'rp1, cp1';\n let D = '';\n if (rank > 2) {\n for (let i = 0; i < rank - 2; ++i) {\n D = D + `${dims[i]},`;\n }\n }\n return `getA(${D}${coord00}),\n rEdge ? 0. : getA(${D}${coord10}),\n cEdge ? 0. : getA(${D}${coord01}),\n rEdge || cEdge ? 0. : getA(${D}${coord11})`;\n}\n\n/**\n * code snippet to setup 4 coordinates and edge conditions\n */\nfunction getSetup(rank: number, dims: string[], rows: number, cols: number): string {\n if (rank === 0 || rank === 1) {\n return '';\n }\n // rank >= 2 for width+height pack.\n else {\n const setup = `\n int r = ${dims[rank - 2]};\n int c = ${dims[rank - 1]};\n int rp1 = ${dims[rank - 2]} + 1;\n int cp1 = ${dims[rank - 1]} + 1;\n bool rEdge = rp1 >= ${cols};\n bool cEdge = cp1 >= ${rows};\n `;\n return setup;\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nimport {unpackFromChannel} from './packing-utils';\n\nconst createPackedReshape3DProgramMetadata = (outputShape3D: readonly number[]) =>\n ({name: 'Reshape (packed)', inputTypes: [TextureType.packed], inputNames: ['A'], cacheHint: `${outputShape3D}`});\n\nconst createPackedReshape3DProgramInfo =\n (handler: WebGLInferenceHandler, input3D: Tensor, metadata: ProgramMetadata, outputShape3D: readonly number[]):\n ProgramInfo => {\n const inputShape3D = input3D.dims as [number, number, number];\n const squeezedOutputShape = outputShape3D as [number, number, number];\n\n let mainLoop = '';\n for (let i = 0; i < 4; i++) {\n let outputCoords = '';\n switch (i) {\n case 0:\n outputCoords = 'outputCoords = rc;';\n break;\n case 1:\n outputCoords = 'outputCoords = ivec3(rc.x, rc.y+1, rc.z);';\n break;\n case 2:\n outputCoords = 'outputCoords = ivec3(rc.x, rc.y, rc.z+1);';\n break;\n case 3:\n outputCoords = 'outputCoords = ivec3(rc.x, rc.y+1, rc.z+1);';\n break;\n default:\n throw new Error();\n }\n\n mainLoop += `\n ${outputCoords}\n ${i > 0 ? 'if(outputCoords.y < rows && outputCoords.z < cols){' : ''}\n int flattenedIndex = getFlattenedIndex(outputCoords);\n\n ivec3 inputRC = inputCoordsFromReshapedOutCoords(flattenedIndex);\n vec2 innerDims = vec2(float(inputRC.y),float(inputRC.z));\n\n result[${i}] = getChannel(getA(inputRC.x, inputRC.y, inputRC.z), innerDims);\n\n ${i > 0 ? '}' : ''}\n `;\n }\n const glsl = getGlsl(handler.session.backend.glContext.version);\n\n const shaderSource = `\n ${getReshapedInputCoords(inputShape3D)}\n ${getFlattenedIndexFrom3D(squeezedOutputShape)}\n ${unpackFromChannel()}\n\n void main() {\n ivec3 rc = getOutputCoords();\n\n vec4 result = vec4(0.0);\n\n ivec3 outputCoords;\n int rows = ${squeezedOutputShape[2]};\n int cols = ${squeezedOutputShape[1]};\n\n ${mainLoop}\n ${glsl.output} = result;\n }\n `;\n\n return {\n ...metadata,\n output: {dims: squeezedOutputShape, type: input3D.type, textureType: TextureType.packed},\n shaderSource,\n hasMain: true\n };\n };\n\nexport const createPackedReshape3DProgramInfoLoader =\n (handler: WebGLInferenceHandler, input3D: Tensor, outputShape3D: readonly number[]): ProgramInfoLoader => {\n const metadata = createPackedReshape3DProgramMetadata(outputShape3D);\n return {...metadata, get: () => createPackedReshape3DProgramInfo(handler, input3D, metadata, outputShape3D)};\n };\n\nexport function processDims3D(shape: ArrayLike): [number, number, number] {\n if (shape.length === 0) {\n return [1, 1, 1];\n }\n // TODO: squeeze other shapes to 2D case\n let batch = 1;\n for (let i = 0; i < shape.length - 2; ++i) {\n batch *= shape[i];\n }\n return [batch, shape.length > 1 ? shape[shape.length - 2] : 1, shape[shape.length - 1]];\n}\n\n// For packed reshape, we need to re-arrange texel data for output shape.\n// Our pack is designed to pack a 2x2 tile in last h and w dimension, so\n// for the reshaped new tensor, we just need to re-arrange the last h and\n// w dimension. For any shape that is not in 3D, i.e. [batch, W, H], we\n// first convert it to 3D by collapsing other dimension to batch dim, then\n// process with the last two dimensions.\n// Note: we only need the shape tensor to calculate output shape, so the\n// content in shape tensor is never uploaded to GPU. It is always kept in CPU.\n// TODO: optimize the algorithm -- in some cases, if the last two dims are\n// the same between input shape and output shape, the packed reshape can be\n// treated as no-op.\nexport function isReshapeCheap(dims: readonly number[], reshapedDims: readonly number[]) {\n let isCheapReshape = false;\n if (dims.length === 0 || reshapedDims.length === 0) { // scalar\n isCheapReshape = true;\n } else if (dims.length < 2 || reshapedDims.length < 2) { // 1D\n isCheapReshape = dims[dims.length - 1] === reshapedDims[reshapedDims.length - 1];\n } else { // 2D +\n isCheapReshape = dims[dims.length - 1] === reshapedDims[reshapedDims.length - 1] &&\n dims[dims.length - 2] === reshapedDims[reshapedDims.length - 2];\n }\n\n return isCheapReshape;\n}\n\nfunction getReshapedInputCoords(shape: [number, number, number]): string {\n const strides = ShapeUtil.computeStrides(shape);\n const coords = ['b', 'r', 'c'];\n const index = 'index';\n const coordsFromIndexSnippet = strides\n .map((stride, i) => {\n const line1 = `int ${coords[i]} = ${index} / ${stride}`;\n const line2 = i === strides.length - 1 ?\n `int ${coords[i + 1]} = ${index} - ${coords[i]} * ${stride}` :\n `index -= ${coords[i]} * ${stride}`;\n return `${line1}; ${line2};`;\n })\n .join('');\n\n return `\n ivec3 inputCoordsFromReshapedOutCoords(int index) {\n ${coordsFromIndexSnippet}\n return ivec3(b, r, c);\n }\n `;\n}\n\nfunction getFlattenedIndexFrom3D(shape: [number, number, number]): string {\n const strides = ShapeUtil.computeStrides(shape);\n\n return `\n int getFlattenedIndex(ivec3 coords) {\n // reverse y, z order\n return coords.x * ${strides[0]} + coords.z * ${strides[1]} + coords.y;\n }\n`;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {TextureData, TextureType} from '../types';\n\nexport const encodeAsUint8 = (inferenceHandler: WebGLInferenceHandler, input: TextureData): TextureData => {\n const outputShape = input.shape;\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n /**\n * https://github.com/tensorflow/tfjs-core/blob/master/src/kernels/webgl/encode_float_gpu.ts\n */\n const shaderSource = `\n const float FLOAT_MAX = 1.70141184e38;\n const float FLOAT_MIN = 1.17549435e-38;\n\n bool isNaN(float val) {\n return (val < 1.0 || 0.0 < val || val == 0.0) ? false : true;\n }\n\n highp vec4 encodeAsUint8(highp float v) {\n if (isNaN(v)) {\n return vec4(255, 255, 255, 255);\n }\n\n highp float av = abs(v);\n\n if(av < FLOAT_MIN) {\n return vec4(0.0, 0.0, 0.0, 0.0);\n } else if(v > FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\n } else if(v < -FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 255.0) / 255.0;\n }\n\n highp vec4 c = vec4(0,0,0,0);\n\n highp float e = floor(log2(av));\n highp float m = exp2(fract(log2(av))) - 1.0;\n\n c[2] = floor(128.0 * m);\n m -= c[2] / 128.0;\n c[1] = floor(32768.0 * m);\n m -= c[1] / 32768.0;\n c[0] = floor(8388608.0 * m);\n\n highp float ebias = e + 127.0;\n c[3] = floor(ebias / 2.0);\n ebias -= c[3] * 2.0;\n c[2] += floor(ebias) * 128.0;\n\n c[3] += 128.0 * step(0.0, -v);\n\n return c / 255.0;\n }\n\n void main() {\n float value = ${glsl.texture2D}(X,TexCoords).r;\n ${glsl.output} = encodeAsUint8(value);\n }`;\n const programInfo = {\n name: 'Uint8Encode',\n inputTypes: [TextureType.unpacked],\n inputNames: ['X'],\n output: {dims: outputShape, type: input.tensor.type, textureType: TextureType.downloadUint8AsFloat},\n shaderSource,\n hasMain: true\n };\n return inferenceHandler.executeProgram(programInfo, [input.tensor]);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, TextureType} from '../types';\nimport {getCoordsDataType} from '../utils';\n\nimport {getChannels, unpackFromChannel} from './packing-utils';\n\nconst unpackProgramMetadata = {\n name: 'unpack',\n inputNames: ['A'],\n inputTypes: [TextureType.packed]\n};\n\nexport const createUnpackProgramInfo = (handler: WebGLInferenceHandler, input: Tensor): ProgramInfo => {\n const rank = input.dims.length;\n\n const channels = getChannels('rc', rank);\n const innerDims = channels.slice(-2);\n const coordsDataType = getCoordsDataType(rank);\n const unpackChannel = unpackFromChannel();\n const isScalar = (input.dims.length === 0);\n const sourceCoords = isScalar ? '' : getSourceCoords(rank, channels);\n const coords = rank <= 1 ? 'rc' : `vec2(${innerDims.join(',')})`;\n const glsl = getGlsl(handler.session.backend.glContext.version);\n const shaderSource = `\n ${unpackChannel}\n void main() {\n ${coordsDataType} rc = getOutputCoords();\n\n // Sample the texture with the coords to get the rgba channel value.\n vec4 packedInput = getA(${sourceCoords});\n\n ${glsl.output} = vec4(getChannel(packedInput, ${coords}), 0, 0, 0);\n }\n `;\n\n return {\n ...unpackProgramMetadata,\n hasMain: true,\n output: {dims: input.dims, type: input.type, textureType: TextureType.unpacked},\n shaderSource\n };\n};\n\nexport const createUnpackProgramInfoLoader = (handler: WebGLInferenceHandler, input: Tensor): ProgramInfoLoader =>\n ({...unpackProgramMetadata, get: () => createUnpackProgramInfo(handler, input)});\n\nfunction getSourceCoords(rank: number, dims: string[]): string {\n if (rank === 1) {\n return 'rc';\n }\n\n let coords = '';\n for (let i = 0; i < rank; i++) {\n coords += dims[i];\n if (i < rank - 1) {\n coords += ',';\n }\n }\n return coords;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Logger} from '../../instrument';\n\nexport declare namespace Encoder {\n export interface DataTypeMap {\n float: Float32Array;\n byte: Uint8Array;\n int: Uint32Array;\n }\n export type DataType = keyof DataTypeMap;\n type DataArrayType = DataTypeMap[DataType];\n}\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport const enum EncoderUsage {\n Default = 0,\n UploadOnly,\n Download4BytesAsFloat32,\n}\n/* eslint-enable @typescript-eslint/naming-convention */\n\n/**\n * Abstraction for mapping data types to texture texlets\n * Encoding means how a Float32 is mapped to 1 or 4 channels for each texlet\n * Decoding means how a texlet's channels are mapped to a resulting Float32\n */\nexport interface DataEncoder {\n internalFormat: number;\n format: number;\n textureType: number;\n channelSize: number;\n encode(src: Encoder.DataArrayType, textureSize: number): Encoder.DataArrayType;\n allocate(size: number): Encoder.DataArrayType;\n decode(buffer: Encoder.DataArrayType, dataSize: number): Encoder.DataArrayType;\n}\n/**\n * WebGL2 data encoder\n * Uses R32F as the format for texlet\n */\nexport class RedFloat32DataEncoder implements DataEncoder {\n internalFormat: number;\n format: number;\n textureType: number;\n channelSize: number;\n constructor(gl: WebGL2RenderingContext, channels = 1) {\n if (channels === 1) {\n this.internalFormat = gl.R32F;\n this.format = gl.RED;\n this.textureType = gl.FLOAT;\n this.channelSize = channels;\n } else if (channels === 4) {\n this.internalFormat = gl.RGBA32F;\n this.format = gl.RGBA;\n this.textureType = gl.FLOAT;\n this.channelSize = channels;\n } else {\n throw new Error(`Invalid number of channels: ${channels}`);\n }\n }\n encode(src: Encoder.DataArrayType, textureSize: number): Encoder.DataArrayType {\n let result: Float32Array;\n let source: Float32Array;\n if (src.constructor !== Float32Array) {\n Logger.warning('Encoder', 'data was not of type Float32; creating new Float32Array');\n source = new Float32Array(src);\n }\n if (textureSize * this.channelSize > src.length) {\n Logger.warning('Encoder', 'Source data too small. Allocating larger array');\n source = src as Float32Array;\n result = this.allocate(textureSize * this.channelSize) as Float32Array;\n source.forEach((v, i) => result[i] = v);\n } else {\n source = src as Float32Array;\n result = source;\n }\n return result;\n }\n allocate(size: number): Encoder.DataArrayType {\n return new Float32Array(size * 4);\n }\n decode(buffer: Encoder.DataArrayType, dataSize: number): Float32Array {\n if (this.channelSize === 1) {\n const filteredData = (buffer as Float32Array).filter((_value, index) => index % 4 === 0).subarray(0, dataSize);\n return filteredData;\n }\n return buffer.subarray(0, dataSize) as Float32Array;\n }\n}\n/**\n * Data encoder for WebGL 1 with support for floating point texture\n */\nexport class RGBAFloatDataEncoder implements DataEncoder {\n internalFormat: number;\n format: number;\n textureType: number;\n channelSize: number;\n constructor(gl: WebGLRenderingContext, channels = 1, textureType?: number) {\n if (channels !== 1 && channels !== 4) {\n throw new Error(`Invalid number of channels: ${channels}`);\n }\n this.internalFormat = gl.RGBA;\n this.format = gl.RGBA;\n this.channelSize = channels;\n this.textureType = textureType || gl.FLOAT;\n }\n encode(src: Float32Array, textureSize: number): Encoder.DataArrayType {\n let dest = src;\n if (this.channelSize === 1) {\n Logger.verbose('Encoder', 'Exploding into a larger array');\n dest = this.allocate(textureSize) as Float32Array;\n src.forEach((v, i) => dest[i * 4] = v);\n }\n return dest;\n }\n allocate(size: number): Encoder.DataArrayType {\n return new Float32Array(size * 4);\n }\n decode(buffer: Encoder.DataArrayType, dataSize: number): Float32Array {\n if (this.channelSize === 1) {\n const filteredData = (buffer as Float32Array).filter((_value, index) => index % 4 === 0).subarray(0, dataSize);\n return filteredData;\n }\n return buffer.subarray(0, dataSize) as Float32Array;\n }\n}\n\nexport class Uint8DataEncoder implements DataEncoder {\n internalFormat: number;\n format: number;\n textureType: number;\n channelSize = 4;\n constructor(gl: WebGLRenderingContext, channels = 1) {\n if (channels === 1) {\n this.internalFormat = gl.ALPHA;\n this.format = gl.ALPHA; // not tested\n this.textureType = gl.UNSIGNED_BYTE;\n this.channelSize = channels;\n } else if (channels === 4) {\n this.internalFormat = gl.RGBA;\n this.format = gl.RGBA;\n this.textureType = gl.UNSIGNED_BYTE;\n this.channelSize = channels;\n } else {\n throw new Error(`Invalid number of channels: ${channels}`);\n }\n }\n encode(src: Uint8Array, _textureSize: number): Encoder.DataArrayType {\n return new Uint8Array(src.buffer, src.byteOffset, src.byteLength);\n }\n allocate(size: number): Encoder.DataArrayType {\n return new Uint8Array(size * this.channelSize);\n }\n decode(buffer: Encoder.DataArrayType, dataSize: number): Uint8Array {\n if (buffer instanceof Uint8Array) {\n return buffer.subarray(0, dataSize);\n }\n throw new Error(`Invalid array type: ${buffer.constructor}`);\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {ShapeUtil} from '../../util';\n\nimport {TextureLayoutStrategy, WidthHeightPrefs} from './texture-layout-strategy';\nimport {TextureLayout, TextureType} from './types';\n\nexport const createTextureLayoutFromTextureType =\n (textureLayoutStrategy: TextureLayoutStrategy, shape: readonly number[],\n textureType: TextureType): TextureLayout => {\n const channel = (textureType === TextureType.unpacked || textureType === TextureType.unpackedReversed) ? 1 : 4;\n const isPacked = textureType === TextureType.packed;\n const reverseWH = (textureType === TextureType.unpackedReversed || textureType === TextureType.packed);\n const breakAxis = textureType === TextureType.packedLastDimension ? shape.length - 1 : undefined;\n const unpackedShape = textureType === TextureType.packedLastDimension ?\n shape.map((d, i) => i === shape.length - 1 ? d * 4 : d) :\n undefined;\n return createTextureLayoutFromShape(\n textureLayoutStrategy, shape, channel, unpackedShape, {isPacked, reverseWH, breakAxis});\n };\n\nexport const calculateTextureWidthAndHeight =\n (textureLayoutStrategy: TextureLayoutStrategy, shape: readonly number[], textureType: TextureType):\n [number, number] => {\n const layout = createTextureLayoutFromTextureType(textureLayoutStrategy, shape, textureType);\n return [layout.width, layout.height];\n };\n\n/**\n * Create a TextureLayout object from shape.\n */\nexport const createTextureLayoutFromShape =\n (textureLayoutStrategy: TextureLayoutStrategy, shape: readonly number[], channels: 1|4 = 1,\n unpackedShape?: readonly number[], prefs?: WidthHeightPrefs): TextureLayout => {\n const isPacked = !!(prefs && prefs.isPacked);\n const [width, height] = textureLayoutStrategy.computeTextureWH(isPacked ? unpackedShape || shape : shape, prefs);\n const rank = shape.length;\n let inferredDims = shape.slice(0);\n if (rank === 0) {\n inferredDims = [1];\n }\n if (channels === 1) {\n // unpackedShape will take `shape` and not `inferredDims` so as to create a scalar Tensor if need be\n unpackedShape = shape;\n } else if (isPacked) {\n if (channels !== 4) {\n throw new Error('a packed texture must be 4-channel');\n }\n unpackedShape = shape;\n if (rank > 0) {\n inferredDims[rank - 1] = Math.ceil(inferredDims[rank - 1] / 2);\n }\n if (rank > 1) {\n inferredDims[rank - 2] = Math.ceil(inferredDims[rank - 2] / 2);\n }\n } else if (!unpackedShape) {\n throw new Error('Unpacked shape is needed when using channels > 1');\n }\n return {\n width,\n height,\n channels,\n isPacked,\n shape: inferredDims,\n strides: ShapeUtil.computeStrides(inferredDims),\n unpackedShape,\n reversedWH: (prefs && prefs.reverseWH)\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceHandler} from '../../backend';\nimport {Logger} from '../../instrument';\nimport {Tensor} from '../../tensor';\nimport {ShapeUtil} from '../../util';\n\nimport {createPackProgramInfoLoader} from './ops/pack';\nimport {createPackedReshape3DProgramInfoLoader, isReshapeCheap, processDims3D} from './ops/reshape-packed';\nimport {encodeAsUint8} from './ops/uint8-encode';\nimport {createUnpackProgramInfoLoader} from './ops/unpack';\nimport {WebGLSessionHandler} from './session-handler';\nimport {EncoderUsage} from './texture-data-encoder';\nimport {calculateTextureWidthAndHeight, createTextureLayoutFromShape, createTextureLayoutFromTextureType} from './texture-layout';\nimport {Artifact, ProgramInfo, ProgramInfoLoader, TextureData, TextureLayout, TextureType} from './types';\n\nconst getProgramInfoUniqueKey =\n (programInfo: ProgramInfo|ProgramInfoLoader, inputTextureDatas: TextureData[]): string => {\n const inputs =\n inputTextureDatas.map(texture => `${texture.unpackedShape.join(',')};${texture.width}x${texture.height}`)\n .join('_');\n let key = programInfo.name;\n if (programInfo.cacheHint) {\n key += '[' + programInfo.cacheHint + ']';\n }\n key += ':' + inputs;\n return key;\n };\n\nexport class WebGLInferenceHandler implements InferenceHandler {\n private packedTextureDataCache: Map;\n private unpackedTextureDataCache: Map;\n constructor(public session: WebGLSessionHandler) {\n this.packedTextureDataCache = new Map();\n this.unpackedTextureDataCache = new Map();\n }\n\n /**\n * @returns [width, height]\n */\n calculateTextureWidthAndHeight(shape: readonly number[], textureType: TextureType): [number, number] {\n return calculateTextureWidthAndHeight(this.session.layoutStrategy, shape, textureType);\n }\n\n executeProgram(program: ProgramInfo|ProgramInfoLoader, inputs: readonly Tensor[]): TextureData {\n if (inputs.length < program.inputNames.length) {\n throw new Error(`Input size mustn't be less than ${program.inputNames.length}.`);\n }\n if (program.inputNames.length !== program.inputTypes.length) {\n throw new Error('input names size does not match input types');\n }\n\n // create texture info for input\n const inputTextureDatas: TextureData[] = [];\n for (let i = 0; i < program.inputNames.length; ++i) {\n inputTextureDatas[i] = this.getOrCreateTextureData(inputs[i], program.inputTypes[i]);\n }\n\n const key = getProgramInfoUniqueKey(program, inputTextureDatas);\n let artifact = this.session.programManager.getArtifact(key);\n const programInfo = artifact ?\n artifact.programInfo :\n (typeof (program as ProgramInfoLoader).get === 'function' ? (program as ProgramInfoLoader).get() :\n (program as ProgramInfo));\n\n // create texture info for output\n const outputTextureLayout = createTextureLayoutFromTextureType(\n this.session.layoutStrategy, programInfo.output.dims, programInfo.output.textureType);\n const outputTextureData = this.createTextureData(outputTextureLayout, programInfo.output.type);\n\n if (!artifact) {\n artifact = this.session.programManager.build(programInfo, inputTextureDatas, outputTextureData);\n this.session.programManager.setArtifact(key, artifact);\n }\n\n this.runProgram(artifact, inputTextureDatas, outputTextureData);\n return outputTextureData;\n }\n\n run(program: ProgramInfoLoader, inputs: readonly Tensor[]): Tensor {\n const outputTextureData = this.executeProgram(program, inputs);\n return outputTextureData.tensor;\n }\n\n private runProgram(artifact: Artifact, inputs: TextureData[], output: TextureData): void {\n // input should match\n for (let i = 0; i < inputs.length; ++i) {\n if (!!inputs[i].isPacked !== (artifact.programInfo.inputTypes[i] === TextureType.packed)) {\n throw new Error(`input[${i}] property packed inconsistent`);\n }\n }\n\n // output should match\n if (!!output.isPacked !== (artifact.programInfo.output.textureType === TextureType.packed)) {\n throw new Error('output property packed inconsistent');\n }\n\n this.session.programManager.run(artifact, inputs, output);\n }\n\n /**\n * Create a TextureData object from a tensor.\n * Usage = EncoderUsage.UploadOnly.\n * If a related texture data is found in cache, returns it;\n * Otherwise:\n * Creates a new texture layout if not provided;\n * Creates WebGLTexture with the layout;\n * Upload tensor data to the texture;\n * Creates a texture data object associated with the given tensor.\n * @param tensor the tensor with data to upload\n */\n private getOrCreateTextureData(tensor: Tensor, textureType: TextureType) {\n let td = this.getTextureData(tensor.dataId, textureType === TextureType.packed);\n\n if (!td) {\n // check if we have texture data in different type\n td = this.getTextureData(tensor.dataId, textureType !== TextureType.packed);\n if (td) {\n if (textureType === TextureType.packed) {\n return this.pack(td);\n } else {\n return this.unpack(td);\n }\n }\n }\n\n if (!td) {\n const layout = createTextureLayoutFromTextureType(this.session.layoutStrategy, tensor.dims, textureType);\n\n if (textureType === TextureType.packedLastDimension) {\n const group = 1;\n const channels = 4;\n const shape = tensor.dims;\n if (shape.length === 4) {\n // pre-processing for kernel data of Conv.\n //\n // TODO: currently this is a hacking to overwrite Conv's weight. The correct way to do this should be:\n // 1. implement texture based const-folding\n // 2. create a WebGL program \"preprocessConvWeight\" to do the same work as below\n // 3. run the program before dotProduct.\n //\n const adjustedKernelShape = [shape[0], Math.ceil((shape[1] * shape[2] * shape[3]) / channels)];\n const adjustedLayout =\n createTextureLayoutFromTextureType(this.session.layoutStrategy, adjustedKernelShape, textureType);\n let buffer = tensor.numberData;\n if (shape[1] * shape[2] * shape[3] % channels !== 0) {\n const numFeatureMaps = shape[0];\n const oldRowSize = shape[1] * shape[2] * shape[3];\n const newRowSize = Math.ceil(oldRowSize * group / channels) * channels;\n const newSize = numFeatureMaps * newRowSize;\n buffer = new Float32Array(newSize);\n for (let f = 0; f < numFeatureMaps; ++f) {\n const oldOffset = f * oldRowSize;\n const newOffset = f * newRowSize + f % group * oldRowSize;\n buffer.set(tensor.numberData.subarray(oldOffset, oldOffset + oldRowSize), newOffset);\n }\n }\n return this.createTextureData(adjustedLayout, tensor.type, buffer, tensor, EncoderUsage.UploadOnly);\n }\n }\n\n if (textureType === TextureType.packed) {\n const unpackedTextureLayout =\n createTextureLayoutFromShape(this.session.layoutStrategy, tensor.dims, 1, [], {reverseWH: true});\n const unpackedTextureData = this.createTextureData(\n unpackedTextureLayout, tensor.type, tensor.numberData, tensor, EncoderUsage.UploadOnly);\n td = this.pack(unpackedTextureData);\n } else {\n td = this.createTextureData(layout, tensor.type, tensor.numberData, tensor, EncoderUsage.UploadOnly);\n }\n }\n return td;\n }\n\n /**\n * Create a TextureData object using the given data and bind to the given tensor.\n * Usage = EncoderUsage.UploadOnly.\n * NOTE: this function is a hack for Conv implementation. should remove this function, after rewriting Conv\n * implementation by Graph.Transformer\n * @param dataType the tensor data type\n * @param data the actual data to upload\n * @param tensor the tensor to bind. tensor's data is ignored.\n */\n createTextureDataFromLayoutBindTensor(\n layout: TextureLayout, dataType: Tensor.DataType, data: Tensor.NumberType, tensor: Tensor): TextureData {\n return this.createTextureData(layout, dataType, data, tensor, EncoderUsage.UploadOnly);\n }\n\n private createTextureData(\n layout: TextureLayout, dataType: Tensor.DataType, data?: Tensor.NumberType, tensor?: Tensor,\n usage?: EncoderUsage): TextureData {\n Logger.verbose('InferenceHandler', `Creating TextureData: layout:[${JSON.stringify(layout)}]`);\n const texture = this.session.textureManager.createTextureFromLayout(dataType, layout, data, usage);\n return this.createTextureDataFromTexture(layout, dataType, texture, tensor);\n }\n\n reshapeUnpacked(input: Tensor, reshapedDims: readonly number[]): Tensor {\n const inputTD = this.getOrCreateTextureData(input, TextureType.unpacked);\n const newTextureLayout: TextureLayout = {\n channels: inputTD.channels,\n height: inputTD.height,\n width: inputTD.width,\n // handle reshaping into scalar Tensors\n shape: reshapedDims.length !== 0 ? reshapedDims : [1],\n strides: ShapeUtil.computeStrides(reshapedDims),\n unpackedShape: reshapedDims,\n };\n const newTextureData = this.createTextureDataFromTexture(newTextureLayout, input.type, inputTD.texture);\n return newTextureData.tensor;\n }\n\n reshapePacked(input: Tensor, reshapedDims: readonly number[]): Tensor {\n const inputTD = this.getOrCreateTextureData(input, TextureType.packed);\n\n // check if the reshape is 'cheap'\n if (isReshapeCheap(input.dims, reshapedDims)) {\n const newTextureLayout: TextureLayout = {\n channels: inputTD.channels,\n height: inputTD.height,\n width: inputTD.width,\n // handle reshaping into scalar Tensors\n shape: reshapedDims.length !== 0 ? reshapedDims : [1],\n strides: ShapeUtil.computeStrides(reshapedDims),\n unpackedShape: reshapedDims,\n isPacked: true\n };\n const newTextureData = this.createTextureDataFromTexture(newTextureLayout, input.type, inputTD.texture);\n return newTextureData.tensor;\n }\n\n const squeezedInputShape = processDims3D(input.dims);\n const squeezedOutputShape = processDims3D(reshapedDims);\n\n const squeezedInputTensor = this.reshapePacked(input, squeezedInputShape);\n const squeezedOutputTensor = this.run(\n createPackedReshape3DProgramInfoLoader(this, squeezedInputTensor, squeezedOutputShape), [squeezedInputTensor]);\n const outputTensor = this.reshapePacked(squeezedOutputTensor, reshapedDims);\n return outputTensor;\n }\n\n cast(input: Tensor, type: Tensor.DataType): Tensor {\n const inputTD = this.getOrCreateTextureData(input, TextureType.unpacked);\n const newTextureData = this.createTextureDataFromTexture(inputTD as TextureLayout, type, inputTD.texture);\n return newTextureData.tensor;\n }\n\n private createTextureDataFromTexture(\n layout: TextureLayout, dataType: Tensor.DataType, texture: WebGLTexture, tensor?: Tensor, tensorId?: Tensor.Id) {\n const textureData: TextureData = {\n ...layout,\n tensor: tensor ||\n new Tensor(\n layout.unpackedShape, dataType, (_id: Tensor.Id) => this.readTexture(textureData),\n async (_id: Tensor.Id) => this.readTextureAsync(textureData), undefined, tensorId),\n texture\n };\n this.setTextureData(textureData.tensor.dataId, textureData, layout.isPacked);\n return textureData;\n }\n\n private getTextureData(tensorId: Tensor.Id, isPacked = false): TextureData|undefined {\n return this.session.isInitializer(tensorId) ? this.session.getTextureData(tensorId, isPacked) :\n isPacked ? this.packedTextureDataCache.get(tensorId) :\n this.unpackedTextureDataCache.get(tensorId);\n }\n setTextureData(tensorId: Tensor.Id, td: TextureData, isPacked = false): void {\n if (this.session.isInitializer(tensorId)) {\n this.session.setTextureData(tensorId, td, isPacked);\n } else {\n (isPacked ? this.packedTextureDataCache : this.unpackedTextureDataCache).set(tensorId, td);\n }\n }\n isTextureLayoutCached(tensor: Tensor, isPacked = false): boolean {\n return !!this.getTextureData(tensor.dataId, isPacked);\n }\n\n dispose(): void {\n this.session.textureManager.clearActiveTextures();\n this.packedTextureDataCache.forEach(td => this.session.textureManager.releaseTexture(td));\n this.packedTextureDataCache = new Map();\n this.unpackedTextureDataCache.forEach(td => this.session.textureManager.releaseTexture(td));\n this.unpackedTextureDataCache = new Map();\n }\n\n readTexture(textureData: TextureData): Tensor.NumberType {\n if (textureData.isPacked) {\n return this.readTexture(this.unpack(textureData));\n }\n if (!this.session.backend.glContext.isFloat32DownloadSupported) {\n return this.session.textureManager.readUint8TextureAsFloat(encodeAsUint8(this, textureData));\n }\n return this.session.textureManager.readTexture(textureData, textureData.tensor.type, textureData.channels);\n }\n\n async readTextureAsync(textureData: TextureData): Promise {\n if (textureData.isPacked) {\n return this.readTextureAsync(this.unpack(textureData));\n }\n if (!this.session.backend.glContext.isFloat32DownloadSupported) {\n return this.session.textureManager.readUint8TextureAsFloat(encodeAsUint8(this, textureData));\n }\n return this.session.textureManager.readTextureAsync(textureData, textureData.tensor.type, textureData.channels);\n }\n\n pack(input: TextureData): TextureData {\n const outputTextureData = this.executeProgram(createPackProgramInfoLoader(this, input.tensor), [input.tensor]);\n return outputTextureData;\n }\n\n unpack(input: TextureData): TextureData {\n const outputTextureData = this.executeProgram(createUnpackProgramInfoLoader(this, input.tensor), [input.tensor]);\n return outputTextureData;\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nclass AttributeWithCacheKeyImpl {\n constructor(attribute: Record) {\n Object.assign(this, attribute);\n }\n\n private key: string;\n public get cacheKey(): string {\n if (!this.key) {\n this.key =\n Object.getOwnPropertyNames(this).sort().map(name => `${(this as Record)[name]}`).join(';');\n }\n return this.key;\n }\n}\n\nexport interface AttributeWithCacheKey {\n readonly cacheKey: string;\n}\n\nexport const createAttributeWithCacheKey = >(attribute: T): T&AttributeWithCacheKey =>\n new AttributeWithCacheKeyImpl(attribute) as unknown as T & AttributeWithCacheKey;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, TextureType} from '../types';\n\nexport interface BatchNormalizationAttributes extends AttributeWithCacheKey {\n epsilon: number;\n momentum: number;\n spatial: number;\n}\n\nconst batchNormalizationProgramMetadata = {\n name: 'BatchNormalization',\n inputNames: ['A', 'Scale', 'B', 'Mean', 'Variance'],\n inputTypes:\n [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked, TextureType.unpacked, TextureType.unpacked]\n};\n\nexport const batchNormalization: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: BatchNormalizationAttributes): Tensor[] => {\n validateInputs(inputs);\n const output = inferenceHandler.run(\n {\n ...batchNormalizationProgramMetadata,\n cacheHint: attributes.cacheKey,\n get: () => createBatchNormalizationProgramInfo(inferenceHandler, inputs, attributes)\n },\n inputs);\n return [output];\n };\n\nexport const parseBatchNormalizationAttributes: OperatorInitialization =\n (node: Graph.Node): BatchNormalizationAttributes => {\n const epsilon = node.attributes.getFloat('epsilon', 1e-5);\n const momentum = node.attributes.getFloat('momentum', 0.9);\n const spatial = node.attributes.getInt('spatial', 1);\n return createAttributeWithCacheKey({epsilon, momentum, spatial});\n };\n\nconst createBatchNormalizationProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: BatchNormalizationAttributes):\n ProgramInfo => {\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const rank = inputs[0].dims.length;\n const [scaleWidth, scaleHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(inputs[1].dims, TextureType.unpacked);\n const shaderSource = `\n float process(int[${rank}] indices) {\n vec2 position = offsetToCoords(indices[1], ${scaleWidth}, ${scaleHeight});\n float scale = getColorAsFloat(${glsl.texture2D}(Scale, position));\n float mean = getColorAsFloat(${glsl.texture2D}(Mean, position));\n float variance = getColorAsFloat(${glsl.texture2D}(Variance, position));\n float b = getColorAsFloat(${glsl.texture2D}(B, position));\n\n return scale * ( (_A(indices) - mean) / sqrt(variance + float(${attributes.epsilon})) ) + b;\n }`;\n return {\n ...batchNormalizationProgramMetadata,\n output: {dims: inputs[0].dims, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 5) {\n throw new Error('BatchNormalization requires 5 inputs.');\n }\n\n const X = inputs[0];\n const scale = inputs[1];\n const B = inputs[2];\n const mean = inputs[3];\n const var_ = inputs[4];\n\n // input should atleast have three dimensions - N,C,dim1,...,dimn\n // other inputs can have only one dimensions\n if (X.dims.length < 3 || scale.dims.length !== 1 || B.dims.length !== 1 || mean.dims.length !== 1 ||\n var_.dims.length !== 1) {\n throw new Error('invalid input shape.');\n }\n if (scale.dims[0] !== X.dims[1] || B.dims[0] !== X.dims[1] || mean.dims[0] !== X.dims[1] ||\n var_.dims[0] !== X.dims[1]) {\n throw new Error('invalid input shape.');\n }\n if ((X.type !== 'float32' && X.type !== 'float64') || (scale.type !== 'float32' && scale.type !== 'float64') ||\n (B.type !== 'float32' && B.type !== 'float64') || (mean.type !== 'float32' && mean.type !== 'float64') ||\n (var_.type !== 'float32' && var_.type !== 'float64')) {\n throw new Error('invalid input tensor types.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {ProgramInfo, TextureLayout} from './types';\nimport {WebGLContext} from './webgl-context';\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport enum FunctionType {\n ValueBased,\n Positional\n}\nexport interface GlslFunction {\n body: string;\n name: string;\n type: T;\n}\nexport type GlslValueFunction = GlslFunction;\nexport interface GlslPositionalFunction extends GlslFunction {\n inputShape: readonly number[];\n outputShape: readonly number[];\n}\n\nexport class GlslContext {\n constructor(\n public glContext: WebGLContext, public programInfo: ProgramInfo, public inputTextureLayouts: TextureLayout[],\n public outputTextureLayout: TextureLayout) {}\n}\nexport abstract class GlslLib {\n constructor(public context: GlslContext) {}\n abstract getFunctions(): {[name: string]: GlslLibRoutine};\n abstract getCustomTypes(): {[name: string]: string};\n}\n\n// abstraction to represent a GLSL library routine and it's dependencies\nexport class GlslLibRoutine {\n constructor(public routineBody: string, public dependencies?: string[]) {}\n}\n\n// abstraction to represent a GLSL library routine and it's dependencies AS GRAPH Nodes\n// this level of abstraction is used to topologically sort routines before fragment shade inclusion\nexport class GlslLibRoutineNode {\n dependencies: GlslLibRoutineNode[];\n routineBody: string;\n constructor(public name: string, routineBody?: string, dependencies?: GlslLibRoutineNode[]) {\n if (dependencies) {\n this.dependencies = dependencies;\n } else {\n this.dependencies = [];\n }\n\n if (routineBody) {\n this.routineBody = routineBody;\n }\n }\n addDependency(node: GlslLibRoutineNode) {\n if (node) {\n this.dependencies.push(node);\n }\n }\n}\n\n// topologically sort GLSL library routines (graph nodes abstraction) before shader script inclusion\nexport class TopologicalSortGlslRoutines {\n static returnOrderedNodes(nodes: GlslLibRoutineNode[]): GlslLibRoutineNode[] {\n if (!nodes || nodes.length === 0) {\n return [];\n }\n\n if (nodes.length === 1) {\n return nodes;\n }\n\n const cycleCheck = new Set();\n const alreadyTraversed = new Set();\n const result = new Array();\n\n this.createOrderedNodes(nodes, cycleCheck, alreadyTraversed, result);\n return result;\n }\n\n private static createOrderedNodes(\n graphNodes: GlslLibRoutineNode[], cycleCheck: Set, alreadyTraversed: Set,\n result: GlslLibRoutineNode[]) {\n for (let i = 0; i < graphNodes.length; ++i) {\n this.dfsTraverse(graphNodes[i], cycleCheck, alreadyTraversed, result);\n }\n }\n\n private static dfsTraverse(\n root: GlslLibRoutineNode, cycleCheck: Set, alreadyTraversed: Set, result: GlslLibRoutineNode[]) {\n // if this root has already been traversed return\n if (!root || alreadyTraversed.has(root.name)) {\n return;\n }\n\n // cyclic dependency has been detected\n if (cycleCheck.has(root.name)) {\n throw new Error('Cyclic dependency detected. Can\\'t topologically sort routines needed for shader.');\n }\n\n // hold this node to detect cycles if any\n cycleCheck.add(root.name);\n\n // traverse children in a dfs fashion\n const dependencies = root.dependencies;\n if (dependencies && dependencies.length > 0) {\n for (let i = 0; i < dependencies.length; ++i) {\n this.dfsTraverse(dependencies[i], cycleCheck, alreadyTraversed, result);\n }\n }\n\n // add to result holder\n result.push(root);\n\n // mark this node as traversed so that we don't traverse from this again\n alreadyTraversed.add(root.name);\n\n // release the hold\n cycleCheck.delete(root.name);\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {BroadcastUtil, ShapeUtil} from '../../../util';\nimport {FunctionType, GlslValueFunction} from '../glsl-definitions';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, TextureType} from '../types';\n\nexport function glslAdd(): GlslValueFunction {\n const name = 'add_';\n const body = `\n float ${name}(float a, float b) {\n return a + b;\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return v1 + v2;\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslDiv(): GlslValueFunction {\n const name = 'div_';\n const body = `\n float ${name}(float a, float b) {\n return a / b;\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return v1 / v2;\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslMul(): GlslValueFunction {\n const name = 'mul_';\n const body = `\n float ${name}(float a, float b) {\n return a * b;\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return v1 * v2;\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslSub(): GlslValueFunction {\n const name = 'sub_';\n const body = `\n float ${name}(float a, float b) {\n return a - b;\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return v1 - v2;\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslEqual(): GlslValueFunction {\n const name = 'equal_';\n const body = `\n float ${name}(float a, float b) {\n return float(a == b);\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return vec4(equal(v1, v2));\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslGreater(): GlslValueFunction {\n const name = 'greater_';\n const body = `\n float ${name}(float a, float b) {\n return float(a > b);\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return vec4( v1.r > v2.r ,\n v1.g > v2.g,\n v1.b > v2.b,\n v1.a > v2.a );\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslLess(): GlslValueFunction {\n const name = 'less_';\n const body = `\n float ${name}(float a, float b) {\n return float(a < b);\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return vec4( v1.r < v2.r ,\n v1.g < v2.g,\n v1.b < v2.b,\n v1.a < v2.a );\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslAnd(): GlslValueFunction {\n const name = 'and_';\n const body = `\n float ${name}(float a, float b) {\n return float( bool(a) && bool(b) );\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n bvec4 b1 = bvec4(v1);\n bvec4 b2 = bvec4(v2);\n return vec4( b1.r && b2.r ,\n b1.g && b2.g,\n b1.b && b2.b,\n b1.a && b2.a );\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslOr(): GlslValueFunction {\n const name = 'or_';\n const body = `\n float ${name}(float a, float b) {\n return float( bool(a) || bool(b) );\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n bvec4 b1 = bvec4(v1);\n bvec4 b2 = bvec4(v2);\n return vec4( b1.r || b2.r ,\n b1.g || b2.g,\n b1.b || b2.b,\n b1.a || b2.a );\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslXor(): GlslValueFunction {\n const name = 'xor_';\n const body = `\n float ${name}(float a, float b) {\n return float( bool(a) ^^ bool(b) );\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n bvec4 b1 = bvec4(v1);\n bvec4 b2 = bvec4(v2);\n return vec4( b1.r ^^ b2.r ,\n b1.g ^^ b2.g,\n b1.b ^^ b2.b,\n b1.a ^^ b2.a );\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslPow(): GlslValueFunction {\n return glslBuiltinBinary('pow');\n}\nexport function glslPRelu(): GlslValueFunction {\n const name = 'prelu_';\n const body = `\n float ${name}(float a, float b) {\n return a < 0.0 ? a * b: a;\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return vec4(\n v1.r < 0.0 ? v1.r * v2.r: v1.r,\n v1.g < 0.0 ? v1.g * v2.g: v1.g,\n v1.b < 0.0 ? v1.b * v2.b: v1.b,\n v1.a < 0.0 ? v1.a * v2.a: v1.a\n );\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\n\nfunction glslBuiltinBinary(fname: string): GlslValueFunction {\n const name = `${fname}_`;\n const body = `\n float ${name}(float a, float b) {\n return ${fname}(a, b);\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return ${fname}(v1, v2);\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\n\nconst createBinaryProgramInfoLoader =\n (handler: WebGLInferenceHandler, inputs: Tensor[], glslFunc: GlslValueFunction,\n outputTensorType: Tensor.DataType = inputs[0].type, cacheKey?: string): ProgramInfoLoader => {\n const textureType = handler.session.pack ? TextureType.packed : TextureType.unpacked;\n return {\n name: glslFunc.name,\n inputNames: ['A', 'B'],\n inputTypes: [textureType, textureType],\n cacheHint: cacheKey,\n get: () => createBinaryProgramInfo(handler, inputs, glslFunc, outputTensorType)\n };\n };\n\nconst createBinaryProgramInfo =\n (handler: WebGLInferenceHandler, inputs: Tensor[], glslFunc: GlslValueFunction,\n outputTensorType: Tensor.DataType = inputs[0].type): ProgramInfo => {\n const textureType = handler.session.pack ? TextureType.packed : TextureType.unpacked;\n const isBroadcast = !ShapeUtil.areEqual(inputs[0].dims, inputs[1].dims);\n let outputShape = inputs[0].dims;\n\n const usePackedTexture = handler.session.pack;\n\n if (isBroadcast) {\n const calculatedShape = BroadcastUtil.calcShape(inputs[0].dims, inputs[1].dims, false);\n if (!calculatedShape) {\n throw new Error('Can\\'t perform binary op on the given tensors');\n }\n outputShape = calculatedShape;\n const outputRank = outputShape.length;\n const aRank = inputs[0].dims.length !== 0 ? inputs[0].dims.length : 1;\n const bRank = inputs[1].dims.length !== 0 ? inputs[1].dims.length : 1;\n const aBcast = inputs[0].dims.length !== 0 ? 'bcastIndices_A(indices, aindices);' : 'aindices[0] = 0;';\n const bBcast = inputs[1].dims.length !== 0 ? 'bcastIndices_B(indices, bindices);' : 'bindices[0] = 0;';\n\n const glsl = getGlsl(handler.session.backend.glContext.version);\n const shaderSource = usePackedTexture ? `\n ${glslFunc.body}\n void main() {\n vec4 a = getAAtOutCoords();\n vec4 b = getBAtOutCoords();\n vec4 result = ${glslFunc.name}(a, b);\n ${glsl.output} = result;\n }` :\n `\n ${glslFunc.body}\n float process(int indices[${outputRank}]) {\n int aindices[${aRank}];\n int bindices[${bRank}];\n ${aBcast}\n ${bBcast}\n return ${glslFunc.name}(_A(aindices), _B(bindices));\n }`;\n\n return {\n name: glslFunc.name,\n inputNames: ['A', 'B'],\n inputTypes: [textureType, textureType],\n output: {dims: outputShape, type: outputTensorType, textureType},\n shaderSource,\n hasMain: usePackedTexture\n };\n }\n const glsl = getGlsl(handler.session.backend.glContext.version);\n const shaderSource = `\n ${glslFunc.body}\n void main() {\n vec4 v1 = ${glsl.texture2D}(A, TexCoords);\n vec4 v2 = ${glsl.texture2D}(B, TexCoords);\n vec4 result = ${glslFunc.name}(v1, v2);\n ${glsl.output} = result;\n }\n `;\n\n return {\n name: glslFunc.name,\n inputNames: ['A', 'B'],\n inputTypes: [textureType, textureType],\n output: {dims: inputs[0].dims, type: outputTensorType, textureType},\n shaderSource,\n hasMain: true\n };\n };\n\nexport const add = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslAdd()), inputs)];\n\nexport const and = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslAnd(), 'bool'), inputs)];\n\nexport const div = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslDiv()), inputs)];\n\nexport const equal = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslEqual(), 'bool'), inputs)];\n\nexport const greater = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslGreater(), 'bool'), inputs)];\n\nexport const less = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslLess(), 'bool'), inputs)];\n\nexport const mul = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslMul()), inputs)];\n\nexport const or = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslOr(), 'bool'), inputs)];\n\nexport const pow = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslPow()), inputs)];\n\nexport const pRelu = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslPRelu()), inputs)];\n\nexport const sub = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslSub()), inputs)];\n\nexport const xor = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslXor(), 'bool'), inputs)];\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ProtoUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nexport const cast: OperatorImplementation =\n (handler: WebGLInferenceHandler, inputs: Tensor[], to: Tensor.DataType): Tensor[] => {\n validateInputs(inputs);\n return [handler.cast(inputs[0], to)];\n };\n\nexport const parseCastAttributes: OperatorInitialization = (node: Graph.Node): Tensor.DataType =>\n ProtoUtil.tensorDataTypeFromProto(node.attributes.getInt('to'));\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Cast requires 1 input.');\n }\n\n if (inputs[0].type === 'string') {\n throw new Error('Invalid input type.');\n }\n};", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\nimport {getCoordsDataType, getGlChannels} from '../utils';\n\nimport {ConcatAttributes} from './concat';\nimport {getChannels, unpackFromChannel} from './packing-utils';\n\nconst createPackedConcatProgramMetadata = (inputCount: number, cacheHint: string) => ({\n name: 'Concat (packed)',\n inputNames: Array.from({length: inputCount}, (_v, i) => `X${i}`),\n inputTypes: Array(inputCount).fill(TextureType.packed),\n cacheHint\n});\n\nconst createPackedConcatProgramInfo =\n (handler: WebGLInferenceHandler, metadata: ProgramMetadata, inputs: Tensor[], axis: number): ProgramInfo => {\n const inputShape = inputs[0].dims.slice();\n if (axis >= inputShape.length || axis < (-1 * inputShape.length)) {\n throw new Error('axis specified for concat doesn\\'t match input dimensionality');\n }\n if (axis < 0) {\n axis = inputShape.length + axis;\n }\n // ensure all of the non-concatenated axes match each other\n // calculate the shape of the output tensor while we do that\n const outputShape = inputShape.slice(0);\n for (let i = 1; i < inputs.length; i++) {\n const dataNShape = inputs[i].dims.slice();\n for (let axisIndex = 0; axisIndex < inputShape.length; axisIndex++) {\n // add to the placeholder for computing output shape\n if (axisIndex === axis) {\n outputShape[axis] += dataNShape[axisIndex];\n }\n // ensure all non-cancatenated axes match each other\n else if (inputShape[axisIndex] !== dataNShape[axisIndex]) {\n throw new Error('non concat dimensions must match');\n }\n }\n }\n\n const rank = outputShape.length;\n const coords = getChannels('coords', rank);\n const dtype = getCoordsDataType(rank);\n const unpackChannel = unpackFromChannel();\n\n const shapes = inputs.map(i => i.dims);\n const channels = getGlChannels(rank);\n const offsets: number[] = new Array(shapes.length - 1);\n\n offsets[0] = shapes[0][axis];\n for (let i = 1; i < offsets.length; i++) {\n offsets[i] = offsets[i - 1] + shapes[i][axis];\n }\n\n const channel = channels[axis];\n const lastChannels = channels.slice(-2);\n const allChannels = channels.join();\n\n let getValueSnippet = `if (${channel} < ${offsets[0]}) {\n return getChannel(\n getX0(${allChannels}), vec2(${lastChannels.join()}));\n }`;\n for (let i = 1; i < offsets.length; i++) {\n const shift = offsets[i - 1];\n getValueSnippet += `\n if (${channel} < ${offsets[i]} && ${channel} >= ${offsets[i - 1]}) {\n return getChannel(\n getX${i}(${getShiftedChannelsSnippet(channels, channel, shift)}),\n vec2(${getShiftedChannelsSnippet(lastChannels, channel, shift)}));\n }`;\n }\n const lastIndex = offsets.length;\n const shift = offsets[offsets.length - 1];\n getValueSnippet += `\n return getChannel(\n getX${lastIndex}(${getShiftedChannelsSnippet(channels, channel, shift)}),\n vec2(${getShiftedChannelsSnippet(lastChannels, channel, shift)}));`;\n\n const glsl = getGlsl(handler.session.backend.glContext.version);\n\n const shaderSource = `\n ${unpackChannel}\n float getValue(${channels.map(x => 'int ' + x)}) {\n ${getValueSnippet}\n }\n\n void main() {\n ${dtype} coords = getOutputCoords();\n int lastDim = coords.${channels[rank - 1]};\n coords.${channels[rank - 1]} = coords.${channels[rank - 2]};\n coords.${channels[rank - 2]} = lastDim;\n\n vec4 result = vec4(getValue(${coords}), 0., 0., 0.);\n\n ${coords[rank - 1]} = ${coords[rank - 1]} + 1;\n if (${coords[rank - 1]} < ${outputShape[rank - 1]}) {\n result.g = getValue(${coords});\n }\n\n ${coords[rank - 2]} = ${coords[rank - 2]} + 1;\n if (${coords[rank - 2]} < ${outputShape[rank - 2]}) {\n result.a = getValue(${coords});\n }\n\n ${coords[rank - 1]} = ${coords[rank - 1]} - 1;\n if (${coords[rank - 2]} < ${outputShape[rank - 2]} &&\n ${coords[rank - 1]} < ${outputShape[rank - 1]}) {\n result.b = getValue(${coords});\n }\n ${glsl.output} = result;\n }\n `;\n\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.packed},\n shaderSource,\n hasMain: true,\n };\n };\n\nexport const createPackedConcatProgramInfoLoader =\n (handler: WebGLInferenceHandler, inputs: Tensor[], attributes: ConcatAttributes): ProgramInfoLoader => {\n const metadata = createPackedConcatProgramMetadata(inputs.length, attributes.cacheKey);\n return {...metadata, get: () => createPackedConcatProgramInfo(handler, metadata, inputs, attributes.axis)};\n };\n\nconst getShiftedChannelsSnippet = (channels: string[], channel: string, shift: number): string => {\n const channelIdx = channels.indexOf(channel);\n const res = channels.map((c, idx) => {\n if (idx === channelIdx) {\n return `${c} - ${shift}`;\n } else {\n return c;\n }\n });\n return res.join();\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nimport {createPackedConcatProgramInfoLoader} from './concat-packed';\n\nexport interface ConcatAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n}\n\nexport const concat: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ConcatAttributes): Tensor[] => {\n validateInputs(inputs);\n if (inferenceHandler.session.pack && inputs[0].dims.length > 1) {\n const output =\n inferenceHandler.run(createPackedConcatProgramInfoLoader(inferenceHandler, inputs, attributes), inputs);\n return [output];\n } else {\n const output =\n inferenceHandler.run(createUnpackedConcatProgramInfoLoader(inferenceHandler, inputs, attributes), inputs);\n return [output];\n }\n };\n\nconst createUnpackedConcatProgramMetadata = (inputCount: number, cacheHint: string) => ({\n name: 'Concat',\n inputNames: Array.from({length: inputCount}, (_v, i) => `X${i}`),\n inputTypes: Array(inputCount).fill(TextureType.unpacked),\n cacheHint\n});\n\nconst createUnpackedConcatProgramInfo =\n (_handler: WebGLInferenceHandler, metadata: ProgramMetadata, inputs: Tensor[], axis: number): ProgramInfo => {\n const inputShape = inputs[0].dims.slice();\n if (axis >= inputShape.length || axis < (-1 * inputShape.length)) {\n throw new Error('axis specified for concat doesn\\'t match input dimensionality');\n }\n if (axis < 0) {\n axis = inputShape.length + axis;\n }\n // ensure all of the non-concatenated axes match each other\n // calculate the shape of the output tensor while we do that\n const outputShape = inputShape.slice(0);\n for (let i = 1; i < inputs.length; i++) {\n const dataNShape = inputs[i].dims.slice();\n for (let axisIndex = 0; axisIndex < inputShape.length; axisIndex++) {\n // add to the placeholder for computing output shape\n if (axisIndex === axis) {\n outputShape[axis] += dataNShape[axisIndex];\n }\n // ensure all non-cancatenated axes match each other\n else if (inputShape[axisIndex] !== dataNShape[axisIndex]) {\n throw new Error('non concat dimensions must match');\n }\n }\n }\n\n const rank = outputShape.length;\n\n const sizeInConcatAxis = new Array(inputs.length);\n let previousSum = 0;\n for (let i = 0; i < sizeInConcatAxis.length; ++i) {\n previousSum += inputs[i].dims[axis];\n sizeInConcatAxis[i] = previousSum;\n }\n\n let getTextureIndexWhereDataResidesMethod = '';\n // in most cases linear search is sufficient, as in most scenarios, only 2 tensors are concatenated\n if (inputs.length < 5) {\n getTextureIndexWhereDataResidesMethod = getTextureIndexWhereDataResidesLinearSearch(sizeInConcatAxis);\n } else {\n getTextureIndexWhereDataResidesMethod = getTextureIndexWhereDataResidesBinarySearch(sizeInConcatAxis);\n }\n\n const fetchDataFromCorrectTextureMethod = getFetchDataFromCorrectTextureMethod(inputs.length, rank);\n const getSizeInConcatAxisValueFromIndexMethod = getGetSizeInConcatAxisValueFromIndexMethod(sizeInConcatAxis);\n const shaderSource = `\n ${fetchDataFromCorrectTextureMethod}\n ${getSizeInConcatAxisValueFromIndexMethod}\n ${getTextureIndexWhereDataResidesMethod}\n float process(int indices[${rank}]) {\n int textureIndex = getTextureWhereDataResides (indices[${axis}]);\n\n if(textureIndex != 0) {\n indices[${axis}] = indices[${axis}] - int(getSizeInConcatAxisValueFromIndex(textureIndex-int(1)));\n }\n\n return fetchDataFromCorrectTexture(textureIndex, indices);\n }`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource,\n };\n };\n\nconst createUnpackedConcatProgramInfoLoader =\n (handler: WebGLInferenceHandler, inputs: Tensor[], attributes: ConcatAttributes): ProgramInfoLoader => {\n const metadata = createUnpackedConcatProgramMetadata(inputs.length, attributes.cacheKey);\n return {...metadata, get: () => createUnpackedConcatProgramInfo(handler, metadata, inputs, attributes.axis)};\n };\n\nconst getTextureIndexWhereDataResidesLinearSearch = (sizeInConcatAxis: number[]): string => {\n const searchAxis = sizeInConcatAxis.map((size, i) => `if(index<${size}) {return ${i};}\n`);\n return `int getTextureWhereDataResides(int index) {\n ${searchAxis.join('')}\n }`;\n};\n\n// TODO: Implement BinarySearch in GLSL\nconst getTextureIndexWhereDataResidesBinarySearch = (sizeInConcatAxis: number[]): string =>\n getTextureIndexWhereDataResidesLinearSearch(sizeInConcatAxis);\n\nconst getFetchDataFromCorrectTextureMethod = (numberOfTensors: number, tensorRank: number) => {\n const codeLines: string[] = [`float fetchDataFromCorrectTexture(int textureIndex, int indices[${tensorRank}]) {`];\n for (let i = 0; i < numberOfTensors; ++i) {\n if (i === 0) {\n codeLines.push(\n '\\t' +\n `if (textureIndex == ${i}) { return _X${i}(indices); }`);\n } else if (i === numberOfTensors - 1) {\n codeLines.push(\n '\\t' +\n `else { return _X${i}(indices); }`);\n } else {\n codeLines.push(\n '\\t' +\n `else if (textureIndex == ${i}) { return _X${i}(indices); }`);\n }\n }\n codeLines.push(\n '\\t' +\n '}');\n return codeLines.join('\\n');\n};\n\nconst getGetSizeInConcatAxisValueFromIndexMethod = (sizeInConcatAxis: number[]): string => {\n const codeLines: string[] = ['int getSizeInConcatAxisValueFromIndex(int index) {'];\n for (let i = 0; i < sizeInConcatAxis.length; ++i) {\n if (i === 0) {\n codeLines.push(\n '\\t' +\n `if (index == ${i}) { return ${sizeInConcatAxis[i]}; }`);\n } else if (i === sizeInConcatAxis.length - 1) {\n codeLines.push(\n '\\t' +\n `else { return ${sizeInConcatAxis[i]}; }`);\n } else {\n codeLines.push(\n '\\t' +\n `else if (index == ${i}) { return ${sizeInConcatAxis[i]}; }`);\n }\n }\n codeLines.push(\n '\\t' +\n '}');\n\n return codeLines.join('\\n');\n};\n\nexport const parseConcatAttributes: OperatorInitialization = (node: Graph.Node): ConcatAttributes =>\n createAttributeWithCacheKey({axis: node.attributes.getInt('axis')});\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('too few inputs');\n }\n\n const inputType = inputs[0].type;\n const inputDimensionality = inputs[0].dims.length;\n\n // TODO: Support string concat\n if (inputType === 'string') {\n throw new Error('string tensor is not supported yet');\n }\n\n for (const input of inputs) {\n // make sure types of all inputs match\n if (input.type !== inputType) {\n throw new Error('input tensors should be one type');\n }\n\n // make sure the dimensionality of all inputs are the same\n if (input.dims.length !== inputDimensionality) {\n throw new Error('input tensors should have the same shape');\n }\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {Tensor} from '../../../tensor';\nimport {MAX_CLIP, MIN_CLIP} from '../../../util';\nimport {FunctionType, GlslValueFunction} from '../glsl-definitions';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nexport function glslAbs(): GlslValueFunction {\n return glslBuiltinUnary('abs');\n}\nexport function glslAcos(): GlslValueFunction {\n return glslBuiltinUnary('acos');\n}\nexport function glslAsin(): GlslValueFunction {\n return glslBuiltinUnary('asin');\n}\nexport function glslAtan(): GlslValueFunction {\n return glslBuiltinUnary('atan');\n}\nexport function glslCeil(): GlslValueFunction {\n return glslBuiltinUnary('ceil');\n}\nexport function glslCos(): GlslValueFunction {\n return glslBuiltinUnary('cos');\n}\nexport function glslElu(alpha: number): GlslValueFunction {\n const name = 'elu';\n const body = `\n const float alpha = float(${alpha});\n\n float ${name}_(float a) {\n return a >= 0.0 ? a: (exp(a) - 1.0) * alpha;\n }\n vec4 ${name}_(vec4 v) {\n return vec4(${name}_(v.x), ${name}_(v.y), ${name}_(v.z), ${name}_(v.w));\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslExp(): GlslValueFunction {\n return glslBuiltinUnary('exp');\n}\nexport function glslFloor(): GlslValueFunction {\n return glslBuiltinUnary('floor');\n}\nexport function glslClip(min: number, max: number): GlslValueFunction {\n const name = 'clip';\n const body = `\n const float min = float(${min});\n const float max = float(${max});\n\n float ${name}_(float a) {\n return clamp(a, min, max);\n }\n vec4 ${name}_(vec4 v) {\n return clamp(v, min, max);\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslIdentity(): GlslValueFunction {\n const name = 'indentity';\n const body = `\n float ${name}_(float a) {\n return a;\n }\n vec4 ${name}_(vec4 v) {\n return v;\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslLeakyRelu(alpha: number): GlslValueFunction {\n const name = 'leakyRelu';\n const body = `\n const float alpha = float(${alpha});\n\n float ${name}_(float a) {\n return a < 0.0 ? a * alpha : a;\n }\n vec4 ${name}_(vec4 v) {\n return vec4(${name}_(v.x), ${name}_(v.y), ${name}_(v.z), ${name}_(v.w));\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslLog(): GlslValueFunction {\n return glslBuiltinUnary('log');\n}\nexport function glslNeg(): GlslValueFunction {\n const name = 'neg';\n const body = `\n float ${name}_(float a) {\n return -a;\n }\n vec4 ${name}_(vec4 v) {\n return -v;\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslNot(): GlslValueFunction {\n const name = 'not';\n const body = `\n float ${name}_(float a) {\n return float( ! bool(a) );\n }\n bool ${name}_(bool a) {\n return !a;\n }\n vec4 ${name}_(vec4 v) {\n return vec4(!bool(v.x), !bool(v.y), !bool(v.z), !bool(v.w));\n }\n bvec4 ${name}_(bvec4 v) {\n return bvec4(!v.x, !v.y, !v.z, !v.w);\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslSin(): GlslValueFunction {\n return glslBuiltinUnary('sin');\n}\nexport function glslRelu(): GlslValueFunction {\n const name = 'relu';\n const body = `\n float ${name}_(float a) {\n return max( a, 0.0 );\n }\n vec4 ${name}_(vec4 v) {\n return max( v, 0.0 );\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslSigmoid(): GlslValueFunction {\n const name = 'sigmoid';\n const body = `\n float ${name}_(float a) {\n return 1.0 / (1.0 + exp(-a));\n }\n vec4 ${name}_(vec4 v) {\n return 1.0 / (1.0 + exp(-v));\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslSqrt(): GlslValueFunction {\n return glslBuiltinUnary('sqrt');\n}\nexport function glslTan(): GlslValueFunction {\n return glslBuiltinUnary('tan');\n}\nexport function glslTanh(): GlslValueFunction {\n const name = 'tanh';\n const body = `\n float ${name}_(float a) {\n a = clamp(a, -10., 10.);\n a = exp(2.*a);\n return (a - 1.) / (a + 1.);\n }\n vec4 ${name}_(vec4 v) {\n v = clamp(v, -10., 10.);\n v = exp(2.*v);\n return (v - 1.) / (v + 1.);\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nfunction glslBuiltinUnary(name: string): GlslValueFunction {\n const body = `\n float ${name}_(float a) {\n return ${name}(a);\n }\n vec4 ${name}_(vec4 v) {\n return ${name}(v);\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\n\n/////\n/////\n/////\n\nconst createElementwiseProgramInfo =\n (handler: WebGLInferenceHandler, metadata: ProgramMetadata, input: Tensor, glslFunc: GlslValueFunction):\n ProgramInfo => {\n const textureType = handler.session.pack ? TextureType.packed : TextureType.unpacked;\n const glsl = getGlsl(handler.session.backend.glContext.version);\n return {\n ...metadata,\n output: {dims: input.dims, type: input.type, textureType},\n shaderSource: `\n ${glslFunc.body}\n void main() {\n vec4 v = ${glsl.texture2D}(A, TexCoords);\n v = ${glslFunc.name}_(v);\n ${glsl.output} = v;\n }\n `,\n hasMain: true\n };\n };\n\nconst createElementwiseProgramInfoLoader =\n (handler: WebGLInferenceHandler, input: Tensor, glslFunc: GlslValueFunction, cacheKey?: string):\n ProgramInfoLoader => {\n const textureType = handler.session.pack ? TextureType.packed : TextureType.unpacked;\n const metadata = {name: glslFunc.name, inputTypes: [textureType], inputNames: ['A'], cacheHint: cacheKey};\n return {...metadata, get: () => createElementwiseProgramInfo(handler, metadata, input, glslFunc)};\n };\n\nexport const abs = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslAbs()), inputs)];\n\nexport const acos = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslAcos()), inputs)];\n\nexport const asin = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslAsin()), inputs)];\n\nexport const atan = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslAtan()), inputs)];\n\nexport interface ClipAttributes extends AttributeWithCacheKey {\n readonly min: number;\n readonly max: number;\n}\n\nexport const clip =\n (handler: WebGLInferenceHandler, inputs: Tensor[], attributes: ClipAttributes): Tensor[] => [handler.run(\n createElementwiseProgramInfoLoader(\n handler, inputs[0], glslClip(attributes.min, attributes.max), attributes.cacheKey),\n inputs)];\n\nexport const parseClipAttributes = (node: Graph.Node): ClipAttributes => createAttributeWithCacheKey(\n {min: node.attributes.getFloat('min', MIN_CLIP), max: node.attributes.getFloat('max', MAX_CLIP)});\n\nexport const clipV11 = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n const attributes = generateClipAttributesFromInputs(handler, inputs);\n return clip(handler, [inputs[0]], attributes);\n};\n\nconst generateClipAttributesFromInputs = (handler: WebGLInferenceHandler, inputs: Tensor[]): ClipAttributes => {\n if (inputs.length >= 3 &&\n (!handler.session.isInitializer(inputs[1].dataId) || !handler.session.isInitializer(inputs[2].dataId))) {\n throw new Error('dynamic clip attributes are not allowed');\n }\n\n const min = (inputs.length >= 3) ? inputs[1].numberData[0] : MIN_CLIP;\n const max = (inputs.length >= 3) ? inputs[2].numberData[0] : MAX_CLIP;\n return createAttributeWithCacheKey({min, max});\n};\n\nexport const ceil = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslCeil()), inputs)];\n\nexport const cos = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslCos()), inputs)];\n\nexport interface EluAttributes extends AttributeWithCacheKey {\n readonly alpha: number;\n}\n\nexport const elu =\n (handler: WebGLInferenceHandler, inputs: Tensor[], attributes: EluAttributes): Tensor[] => [handler.run(\n createElementwiseProgramInfoLoader(handler, inputs[0], glslElu(attributes.alpha), attributes.cacheKey),\n inputs)];\n\nexport const parseEluAttributes = (node: Graph.Node): EluAttributes =>\n createAttributeWithCacheKey({alpha: node.attributes.getFloat('alpha', 1.0)});\n\nexport const exp = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslExp()), inputs)];\n\nexport const floor = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslFloor()), inputs)];\n\nexport const identity = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslIdentity()), inputs)];\n\nexport interface LeakyReluAttributes extends AttributeWithCacheKey {\n readonly alpha: number;\n}\n\nexport const leakyRelu =\n (handler: WebGLInferenceHandler, inputs: Tensor[], attributes: LeakyReluAttributes): Tensor[] => [handler.run(\n createElementwiseProgramInfoLoader(handler, inputs[0], glslLeakyRelu(attributes.alpha), attributes.cacheKey),\n inputs)];\n\nexport const parseLeakyReluAttributes = (node: Graph.Node): LeakyReluAttributes =>\n createAttributeWithCacheKey({alpha: node.attributes.getFloat('alpha', 0.01)});\n\nexport const log = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslLog()), inputs)];\n\nexport const neg = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslNeg()), inputs)];\n\nexport const not = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslNot()), inputs)];\n\nexport const relu = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslRelu()), inputs)];\n\nexport const sigmoid = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslSigmoid()), inputs)];\n\nexport const sin = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslSin()), inputs)];\n\nexport const sqrt = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslSqrt()), inputs)];\n\nexport const tan = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslTan()), inputs)];\n\nexport const tanh = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslTanh()), inputs)];\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Attribute} from '../../../attribute';\nimport {MAX_CLIP, MIN_CLIP} from '../../../util';\nimport {GlslValueFunction} from '../glsl-definitions';\n\nimport {glslClip, glslRelu, glslSigmoid} from './unary-op';\n\nexport interface InternalActivationAttributes {\n readonly activation: string;\n readonly clipMin?: number;\n readonly clipMax?: number;\n readonly activationCacheKey: string;\n}\n\nexport function getActivationSnippet(attributes: InternalActivationAttributes) {\n let func: GlslValueFunction;\n switch (attributes.activation) {\n case 'Relu':\n func = glslRelu();\n break;\n case 'Sigmoid':\n func = glslSigmoid();\n break;\n case 'Clip':\n func = glslClip(attributes.clipMin!, attributes.clipMax!);\n break;\n // TODO: adding other activations that can be fused.\n default:\n return {activationFunction: '', applyActivation: ''};\n }\n\n const activationName = func.name;\n const activationFunction = func.body;\n const applyActivation = `value = ${activationName}_(value);`;\n return {activationFunction, applyActivation};\n}\n\nexport const parseInternalActivationAttributes = (attributes: Attribute): InternalActivationAttributes => {\n const activation = attributes.getString('activation', '');\n\n if (activation === 'Clip') {\n const [clipMin, clipMax] = attributes.getFloats('activation_params', [MIN_CLIP, MAX_CLIP]);\n return {activation, clipMax, clipMin, activationCacheKey: `${activation}:${clipMin},${clipMax}`};\n }\n return {activation, activationCacheKey: activation};\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Logger} from '../../../instrument';\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nimport {calculateOutputShape, ConvAttributes} from './conv';\nimport {getActivationSnippet} from './fuse-utils';\n\nconst createUnpackedGroupedConvProgramMetadata = (hasBias: boolean, cacheHint: string): ProgramMetadata => ({\n name: 'GroupedConv',\n inputNames: hasBias ? ['X', 'W', 'Bias'] : ['X', 'W'],\n inputTypes: hasBias ? [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked] :\n [TextureType.unpacked, TextureType.unpacked],\n cacheHint\n});\n\nconst createUnpackedGroupedConvProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], metadata: ProgramMetadata,\n attributes: ConvAttributes): ProgramInfo => {\n const hasBias = inputs.length > 2;\n const processBias = hasBias ? 'value += getBias(output_channel);' : '';\n const xShape = inputs[0].dims.slice();\n const wShape = inputs[1].dims.slice();\n const outputChannelsPerGroup = wShape[0] / attributes.group;\n Logger.verbose(\n 'GroupedConv',\n `autpPad:${attributes.autoPad}, dilations:${attributes.dilations}, group:${attributes.group}, kernelShape:${\n attributes.kernelShape}, pads:${attributes.pads}, strides:${attributes.strides}`);\n const outputShape =\n calculateOutputShape(xShape, wShape, attributes.dilations, attributes.pads, attributes.strides);\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const {activationFunction, applyActivation} = getActivationSnippet(attributes);\n\n const shaderSource = `\n const ivec2 strides = ivec2(${attributes.strides[0]}, ${attributes.strides[1]});\n const ivec2 pads = ivec2(${attributes.pads[0]}, ${attributes.pads[1]});\n ${activationFunction}\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n int output_channel = coords.y;\n ivec2 xRCCorner = coords.zw * strides - pads;\n int group_id = output_channel / ${outputChannelsPerGroup};\n\n float value = 0.0;\n for (int wInChannel = 0; wInChannel < ${wShape[1]}; wInChannel++) {\n int input_channel = group_id * ${wShape[1]} + wInChannel;\n for (int wHeight = 0; wHeight < ${wShape[2]}; wHeight++) {\n int xHeight = xRCCorner.x + wHeight * ${attributes.dilations[0]};\n\n if (xHeight < 0 || xHeight >= ${xShape[2]}) {\n continue;\n }\n\n for (int wWidth = 0; wWidth < ${wShape[3]}; wWidth++) {\n int xWidth = xRCCorner.y + wWidth * ${attributes.dilations[1]};\n if (xWidth < 0 || xWidth >= ${xShape[3]}) {\n continue;\n }\n\n float xVal = getX(batch, input_channel, xWidth, xHeight);\n float wVal = getW(output_channel, wInChannel, wWidth, wHeight);\n value += xVal*wVal;\n }\n }\n }\n ${processBias}\n ${applyActivation}\n ${glsl.output} = vec4(value, .0, .0, .0);\n }\n`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource,\n hasMain: true,\n };\n };\n\nexport const createUnpackedGroupedConvProgramInfoLoader =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], attributes: ConvAttributes):\n ProgramInfoLoader => {\n const metadata = createUnpackedGroupedConvProgramMetadata(inputs.length > 2, attributes.cacheKey);\n return {\n ...metadata,\n get: () => createUnpackedGroupedConvProgramInfo(inferenceHandler, inputs, metadata, attributes)\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nimport {ConvAttributes} from './conv';\nimport {unpackFromChannel} from './packing-utils';\n\nconst createPackedIm2ColProgramMetadata = (cacheHint: string) => ({\n name: 'Im2Col (packed)',\n inputNames: ['A'],\n inputTypes: [TextureType.packed],\n cacheHint,\n});\n\nconst createPackedIm2ColProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, metadata: ProgramMetadata, x: Tensor, w: Tensor,\n outputShape: readonly number[], attributes: ConvAttributes): ProgramInfo => {\n const xshape = x.dims;\n const wshape = w.dims;\n const rowDim = 2;\n const colDim = 3;\n const rank = outputShape.length;\n const im2colShape = [wshape[1] * wshape[2] * wshape[3], outputShape[2] * outputShape[3]];\n const kernelSize = wshape[2] * wshape[3];\n const unpackChannel = unpackFromChannel();\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n let unrolled = '';\n\n for (let row = 0; row <= 1; row++) {\n for (let col = 0; col <= 1; col++) {\n unrolled += `\n blockIndex = rc.x + ${col};\n pos = rc.y + ${row};\n\n if(blockIndex < ${im2colShape[1]} && pos < ${im2colShape[0]}) {\n offsetY = int(blockIndex / (${outputShape[rank - 1]})) * ${attributes.strides[0]} -\n ${attributes.pads[0]};\n d0 = offsetY + ${attributes.dilations[0]} * (imod(pos, ${kernelSize}) / ${wshape[2]});\n\n if(d0 < ${xshape[rowDim]} && d0 >= 0) {\n offsetX = imod(blockIndex, ${outputShape[rank - 1]}) * ${attributes.strides[1]} -\n ${attributes.pads[1]};\n d1 = offsetX + ${attributes.dilations[1]} * imod(imod(pos, ${kernelSize}), ${wshape[2]});\n\n if(d1 < ${xshape[colDim]} && d1 >= 0) {\n\n ch = int(float(pos)/ ${kernelSize}.);\n innerDims = vec2(d0, d1);\n result[${row * 2 + col}] = getChannel(\n getA(0, ch, int(innerDims.x),\n int(innerDims.y)), innerDims);\n }\n }\n }\n\n `;\n }\n }\n\n const shaderSource = `\n ${unpackChannel}\n\n void main() {\n ivec2 rc = getOutputCoords();\n vec4 result = vec4(0.0);\n int blockIndex, pos, offsetY, d0, offsetX, d1, ch;\n vec2 innerDims;\n ${unrolled}\n ${glsl.output} = result;\n }\n `;\n return {\n ...metadata,\n output: {dims: im2colShape, type: x.type, textureType: TextureType.packed},\n shaderSource,\n hasMain: true\n };\n };\n\nexport const createPackedIm2ColProgramInfoLoader =\n (inferenceHandler: WebGLInferenceHandler, x: Tensor, w: Tensor, outputShape: readonly number[],\n attributes: ConvAttributes): ProgramInfoLoader => {\n const metadata = createPackedIm2ColProgramMetadata(attributes.cacheKey);\n return {\n ...metadata,\n get: () => createPackedIm2ColProgramInfo(inferenceHandler, metadata, x, w, outputShape, attributes)\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {BroadcastUtil, ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\nimport {getCoordsDataType, getGlChannels} from '../utils';\n\nimport {getActivationSnippet, InternalActivationAttributes, parseInternalActivationAttributes} from './fuse-utils';\nimport {createPackedMatmulProgramInfoLoader} from './matmul-pack';\n\nexport const matMul: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: InternalActivationAttributes): Tensor[] => {\n validateInputs(inputs);\n\n if (inferenceHandler.session.pack) {\n return [inferenceHandler.run(\n createPackedMatmulProgramInfoLoader(inferenceHandler, inputs, attributes), inputs)];\n } else {\n return [inferenceHandler.run(createMatmulProgramInfoLoader(inputs, attributes), inputs)];\n }\n };\n\nexport const parseMatMulAttributes: OperatorInitialization =\n (node: Graph.Node): InternalActivationAttributes => parseInternalActivationAttributes(node.attributes);\n\nconst createMatmulProgramMetadata = (hasBias: boolean, cacheHint: string) => ({\n name: 'MatMul',\n inputNames: hasBias ? ['A', 'B', 'Bias'] : ['A', 'B'],\n inputTypes: hasBias ? [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked] :\n [TextureType.unpacked, TextureType.unpacked],\n cacheHint\n});\n\nfunction createMatmulProgramInfo(\n metadata: ProgramMetadata, inputs: Tensor[], activationAttributes: InternalActivationAttributes): ProgramInfo {\n const aShape = inputs[0].dims;\n const bShape = inputs[1].dims;\n const outputShape = BroadcastUtil.calcShape(aShape, bShape, true);\n if (!outputShape) {\n throw new Error('Can\\'t use matmul on the given tensors');\n }\n const coordsDataType = getCoordsDataType(outputShape.length);\n const allGlChannels = getGlChannels();\n const {activationFunction, applyActivation} = getActivationSnippet(activationAttributes);\n\n const hasBias = inputs.length > 2;\n const processBias = hasBias ? 'value += getBiasForMatmul();' : '';\n const getBiasForMatmulSnippet =\n hasBias ? `${getBiasForMatmul(coordsDataType, allGlChannels, inputs[2].dims, outputShape, false)}` : '';\n\n const rank = outputShape.length;\n const arank = aShape.length;\n const brank = bShape.length;\n const sharedDim = aShape[aShape.length - 1];\n const shaderSource = `\n ${activationFunction}\n ${getBiasForMatmulSnippet}\n float process(int indices[${rank}]) {\n int a[${arank}];\n int b[${brank}];\n bcastMatmulIndices_A(indices, a);\n bcastMatmulIndices_B(indices, b);\n\n float value;\n for (int k=0; k<${sharedDim}; ++k) {\n a[${arank - 1}] = k;\n b[${brank - 2}] = k;\n value += _A(a) * _B(b);\n }\n ${processBias}\n ${applyActivation}\n return value;\n }`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource,\n };\n}\n\nexport function createMatmulProgramInfoLoader(\n inputs: Tensor[], activationAttributes: InternalActivationAttributes): ProgramInfoLoader {\n const metadata = createMatmulProgramMetadata(inputs.length > 2, activationAttributes.activationCacheKey);\n return {...metadata, get: () => createMatmulProgramInfo(metadata, inputs, activationAttributes)};\n}\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('MatMul requires 2 inputs.');\n }\n\n if (inputs[0].dims[inputs[0].dims.length - 1] !== inputs[1].dims[inputs[1].dims.length - 2]) {\n throw new Error('shared dimension does not match.');\n }\n\n if ((inputs[0].type !== 'float32' && inputs[0].type !== 'float64') ||\n (inputs[1].type !== 'float32' && inputs[1].type !== 'float64')) {\n throw new Error('inputs should be float type');\n }\n\n if (inputs[0].type !== inputs[1].type) {\n throw new Error('inputs types should match');\n }\n};\n\nexport function getBiasForMatmul(\n coordsDataType: string, allGlChannels: readonly string[], inShape: readonly number[], outShape: readonly number[],\n isPacked: boolean): string {\n let unpackedCoordsSnippet = '';\n const inRank = inShape.length;\n const outRank = outShape.length;\n const rankDiff = outRank - inRank;\n if (outRank < 2 && inRank > 0) {\n unpackedCoordsSnippet = 'coords';\n } else {\n unpackedCoordsSnippet = inShape.map((_s, i) => `coords.${allGlChannels[i + rankDiff]}`).join(', ');\n }\n const broadcastDims = BroadcastUtil.getBroadcastDims(inShape, outShape);\n const coordsSnippet = broadcastDims.map(d => `coords.${allGlChannels[d + rankDiff]} = 0;`).join('\\n');\n const inSize = ShapeUtil.size(inShape);\n const isInputScalar = inSize === 1;\n let output = 'vec4(outputValue.xx, outputValue.yy)';\n if (isInputScalar) {\n output = 'vec4(outputValue.x)';\n }\n const getBiasForMatmulSource = isPacked ? `\nvec4 getBiasForMatmul() {\n ${coordsDataType} coords = getOutputCoords();\n ${coordsSnippet}\n vec4 outputValue = getBias(${unpackedCoordsSnippet});\n return ${output};\n}` :\n `\nfloat getBiasForMatmul() {\n ${coordsDataType} coords = getOutputCoords();\n ${coordsSnippet}\n return getBias(coords.x);\n}`;\n\n return getBiasForMatmulSource;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {BroadcastUtil, ShapeUtil} from '../../../util';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\nimport {getCoordsDataType, getGlChannels} from '../utils';\n\nimport {getActivationSnippet, InternalActivationAttributes} from './fuse-utils';\nimport {getBiasForMatmul} from './matmul';\n\nconst createPackedMatmulProgramMetadata = (hasBias: boolean, cacheHint: string) => ({\n name: 'MatMul (packed)',\n inputNames: hasBias ? ['A', 'B', 'Bias'] : ['A', 'B'],\n inputTypes: hasBias ? [TextureType.packed, TextureType.packed, TextureType.packed] :\n [TextureType.packed, TextureType.packed],\n cacheHint\n});\n\nconst createPackedMatmulProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, metadata: ProgramMetadata, inputs: Tensor[],\n activationAttributes: InternalActivationAttributes): ProgramInfo => {\n const hasBias = inputs.length > 2;\n const processBias = hasBias ? 'value += getBiasForMatmul();' : '';\n const aShape = inputs[0].dims;\n const bShape = inputs[1].dims;\n const outputShape = BroadcastUtil.calcShape(aShape, bShape, true);\n const isBroadcast = !ShapeUtil.areEqual(inputs[0].dims, inputs[1].dims);\n\n if (!outputShape) {\n throw new Error('Can\\'t use matmul on the given tensors');\n }\n const sharedDim = aShape[aShape.length - 1];\n const sharedDimIndex = Math.ceil(sharedDim / 2);\n const aRank = aShape.length;\n const bRank = bShape.length;\n\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const coordsDataType = getCoordsDataType(outputShape.length);\n const outRank = outputShape.length;\n const allGlChannels = getGlChannels();\n const {activationFunction, applyActivation} = getActivationSnippet(activationAttributes);\n\n const getBiasForMatmulSnippet =\n hasBias ? `${getBiasForMatmul(coordsDataType, allGlChannels, inputs[2].dims, outputShape, true)}` : '';\n\n const getBcastedSamplerForMatmulSnippet =\n isBroadcast ? `${getBcastSamplerForMatmul(coordsDataType, allGlChannels, inputs, outputShape)}` : '';\n\n const getSamplerAInLoopSnippet = isBroadcast ? 'getAAtOutCoordsMatmul(i)' : `getA(${getA(allGlChannels, aRank)})`;\n const getSamplerBInLoopSnippet = isBroadcast ? 'getBAtOutCoordsMatmul(i)' : `getB(${getB(allGlChannels, bRank)})`;\n const getOutputCoordsSnippet = isBroadcast ? '' : `${coordsDataType} rc =\n getOutputCoords(); int lastDim = rc.${allGlChannels[outRank - 1]}; rc.${allGlChannels[outRank - 1]} =\n rc.${allGlChannels[outRank - 2]}; rc.${allGlChannels[outRank - 2]} = lastDim;\n `;\n const shaderSource = `\n ${getBcastedSamplerForMatmulSnippet}\n ${getBiasForMatmulSnippet}\n ${activationFunction}\n void main() {\n ${getOutputCoordsSnippet}\n\n vec4 value = vec4(0);\n for (int i = 0; i < ${sharedDimIndex}; i++) {\n vec4 a = ${getSamplerAInLoopSnippet};\n vec4 b = ${getSamplerBInLoopSnippet};\n\n value += (a.rrbb * b.rgrg);\n value += (a.ggaa * b.baba);\n }\n ${processBias}\n ${applyActivation}\n ${glsl.output} = value;\n }`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.packed},\n shaderSource,\n hasMain: true\n };\n };\n\nexport const createPackedMatmulProgramInfoLoader =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[],\n activationAttributes: InternalActivationAttributes): ProgramInfoLoader => {\n const metadata = createPackedMatmulProgramMetadata(inputs.length > 2, activationAttributes.activationCacheKey);\n return {\n ...metadata,\n get: () => createPackedMatmulProgramInfo(inferenceHandler, metadata, inputs, activationAttributes)\n };\n };\n\nfunction getBcastSamplerForMatmul(\n coordsDataType: string, allGlChannels: readonly string[], inputs: Tensor[], outShape: readonly number[]): string {\n let unpackedACoordsSnippet = [];\n let unpackedBCoordsSnippet = [];\n\n const inAShape = inputs[0].dims;\n const inBShape = inputs[1].dims;\n\n const inARank = inAShape.length;\n const inBRank = inBShape.length;\n\n const outRank = outShape.length;\n const rankADiff = outRank - inARank;\n const rankBDiff = outRank - inBRank;\n\n unpackedACoordsSnippet = inAShape.map((_s, i) => `coords.${allGlChannels[i + rankADiff]}`);\n unpackedACoordsSnippet[inARank - 1] = 'i*2';\n unpackedACoordsSnippet.join(', ');\n unpackedBCoordsSnippet = inBShape.map((_s, i) => `coords.${allGlChannels[i + rankBDiff]}`);\n unpackedBCoordsSnippet[inBRank - 2] = 'i*2';\n unpackedBCoordsSnippet.join(', ');\n\n const broadcastADims = BroadcastUtil.getBroadcastDims(inAShape, outShape);\n const broadcastBDims = BroadcastUtil.getBroadcastDims(inBShape, outShape);\n\n const coordsASnippet = broadcastADims.map(d => `coords.${allGlChannels[d + rankADiff]} = 0;`).join('\\n');\n const coordsBSnippet = broadcastBDims.map(d => `coords.${allGlChannels[d + rankBDiff]} = 0;`).join('\\n');\n const swapDimSnippet = `int lastDim = coords.${allGlChannels[outRank - 1]};\n coords.${allGlChannels[outRank - 1]} = coords.${allGlChannels[outRank - 2]};\n coords.${allGlChannels[outRank - 2]} = lastDim;`;\n\n const getBcastSamplerMatmulSource = `\nvec4 getAAtOutCoordsMatmul(int i) {\n ${coordsDataType} coords = getOutputCoords();\n ${swapDimSnippet}\n ${coordsASnippet}\n vec4 outputValue = getA(${unpackedACoordsSnippet});\n return outputValue;\n}\n\nvec4 getBAtOutCoordsMatmul(int i) {\n ${coordsDataType} coords = getOutputCoords();\n ${swapDimSnippet}\n ${coordsBSnippet}\n vec4 outputValue = getB(${unpackedBCoordsSnippet});\n return outputValue;\n}`;\n\n return getBcastSamplerMatmulSource;\n}\n\nfunction getA(allGlChannels: string[], rank: number): string {\n let res = '';\n for (let i = 0; i < rank - 2; i++) {\n res += `rc.${allGlChannels[i]}, `;\n }\n res += `rc.${allGlChannels[rank - 2]}, ` +\n 'i*2';\n return res;\n}\n\nfunction getB(allGlChannels: string[], rank: number): string {\n let res = '';\n for (let i = 0; i < rank - 2; i++) {\n res += `rc.${allGlChannels[i]}, `;\n }\n res += 'i*2, ' +\n `rc.${allGlChannels[rank - 1]}`;\n return res;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nimport {calculateOutputShape, ConvAttributes} from './conv';\nimport {createPackedIm2ColProgramInfoLoader} from './im2col-pack';\nimport {createPackedMatmulProgramInfoLoader} from './matmul-pack';\n\nexport const conv2DPackedPointwise =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], attributes: ConvAttributes): Tensor => {\n const xshape = inputs[0].dims;\n const kshape = inputs[1].dims;\n const outputShape =\n calculateOutputShape(xshape, kshape, attributes.dilations, attributes.pads, attributes.strides);\n const reshapedX = inferenceHandler.reshapePacked(inputs[0], [xshape[1], xshape[2] * xshape[3]]);\n const reshapedK = inferenceHandler.reshapePacked(inputs[1], [kshape[0], kshape[1]]);\n\n const matmulInputs = inputs.length > 2 ? [reshapedK, reshapedX, inputs[2]] : [reshapedK, reshapedX];\n const matmulOutput = inferenceHandler.run(\n createPackedMatmulProgramInfoLoader(inferenceHandler, matmulInputs, attributes), matmulInputs);\n return inferenceHandler.reshapePacked(matmulOutput, outputShape);\n };\n\nexport const conv2DPacked =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], attributes: ConvAttributes): Tensor => {\n const xshape = inputs[0].dims;\n const kshape = inputs[1].dims;\n const outputShape =\n calculateOutputShape(xshape, kshape, attributes.dilations, attributes.pads, attributes.strides);\n\n // run im2col\n const im2colOutput = inferenceHandler.run(\n createPackedIm2ColProgramInfoLoader(inferenceHandler, inputs[0], inputs[1], outputShape, attributes),\n [inputs[0]]);\n\n // reshape kernel\n const kernelReshaped = inferenceHandler.reshapePacked(inputs[1], [kshape[0], kshape[1] * kshape[2] * kshape[3]]);\n\n // run matmul\n const matmulInputs =\n (inputs.length === 3) ? [kernelReshaped, im2colOutput, inputs[2]] : [kernelReshaped, im2colOutput];\n const matmulOutput = inferenceHandler.run(\n createPackedMatmulProgramInfoLoader(inferenceHandler, matmulInputs, attributes), matmulInputs);\n\n // reshape output\n const outputReshaped = inferenceHandler.reshapePacked(matmulOutput, outputShape);\n return outputReshaped;\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nimport {ConvAttributes} from './conv';\n\nconst createIm2ColProgramMetadata = (cacheHint: string) => ({\n name: 'Im2Col',\n inputNames: ['X'],\n inputTypes: [TextureType.unpacked],\n cacheHint,\n});\n\nconst createIm2ColProgramInfo =\n (_inferenceHandler: WebGLInferenceHandler, metadata: ProgramMetadata, x: Tensor, w: Tensor,\n outputShape: readonly number[], attributes: ConvAttributes): ProgramInfo => {\n const xshape = x.dims;\n const wshape = w.dims;\n\n const rank = outputShape.length;\n const im2colDims = calculateIm2ColDims(xshape, wshape, outputShape, 4);\n\n const shaderSource = `\n const int XC = ${xshape[1]};\n const int XH = ${xshape[2]};\n const int XW = ${xshape[3]};\n const int KH = ${attributes.kernelShape[0]};\n const int KW = ${attributes.kernelShape[1]};\n const int dilationH = ${attributes.dilations[0]};\n const int dilationW = ${attributes.dilations[1]};\n const int strideH = ${attributes.strides[0]};\n const int strideW = ${attributes.strides[1]};\n const int padH = ${attributes.pads[0]};\n const int padW = ${attributes.pads[1]};\n const int KHKW = KH*KW;\n const int XCKHKW = XC * KHKW;\n const int outputChannels = 4;\n vec4 process(int indices[${rank}]) {\n int b = indices[0]; // batch size\n int oh = indices[1] * strideH - padH; //output height\n int ow = indices[2] * strideW - padW; //output width\n int p = indices[3] * outputChannels; //patch\n vec4 value = vec4(0.0);\n for(int i=0; i < outputChannels; ++i) {\n if(p < XCKHKW) {\n int patchC = p / KHKW;\n int patchH = (p - patchC*KHKW) / KW;\n int patchW = (p - patchC*KHKW) - patchH * KW;\n int xh2 = oh + patchH * dilationH;\n int xw2 = ow + patchW * dilationW;\n int x[${xshape.length}];\n x[0] = b;\n x[1] = patchC;\n x[2] = xh2;\n x[3] = xw2;\n if(xh2 >= 0 &&\n xh2 < XH &&\n xw2 >= 0 &&\n xw2 < XW) {\n value[i] = _X(x);\n }\n }\n ++p;\n }\n return value;\n }\n `;\n return {\n ...metadata,\n output: {dims: im2colDims, type: x.type, textureType: TextureType.packedLastDimension},\n shaderSource\n };\n };\n\nexport const createIm2ColProgramInfoLoader =\n (inferenceHandler: WebGLInferenceHandler, x: Tensor, w: Tensor, outputShape: readonly number[],\n attributes: ConvAttributes): ProgramInfoLoader => {\n const metadata = createIm2ColProgramMetadata(attributes.cacheKey);\n return {\n ...metadata,\n get: () => createIm2ColProgramInfo(inferenceHandler, metadata, x, w, outputShape, attributes)\n };\n };\n\n\nexport const calculateIm2ColDims =\n (inputShape: readonly number[], kernelShape: readonly number[], outputShape: readonly number[], channels = 4):\n number[] =>\n [outputShape[0], outputShape[2], outputShape[3],\n Math.ceil(inputShape[1] * kernelShape[2] * kernelShape[3] / channels)];\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nimport {getActivationSnippet, InternalActivationAttributes} from './fuse-utils';\nimport {calculateIm2ColDims} from './im2col';\n\nconst createDotProductProgramMetadata = (hasBias: boolean, attributes: InternalActivationAttributes) => ({\n name: 'ConvDotProduct',\n inputNames: hasBias ? ['Im2Col', 'K', 'B'] : ['Im2Col', 'K'],\n inputTypes: hasBias ? [TextureType.unpacked, TextureType.packedLastDimension, TextureType.unpacked] :\n [TextureType.unpacked, TextureType.packedLastDimension],\n cacheKey: attributes.activationCacheKey\n});\n\nconst createDotProductProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, metadata: ProgramMetadata, inputs: readonly Tensor[],\n outputShape: number[], attributes: InternalActivationAttributes): ProgramInfo => {\n const xshape = inputs[0].dims;\n const kshape = inputs[1].dims;\n const adjustedKernelShape = [kshape[0], Math.ceil((xshape[1] * kshape[2] * kshape[3]) / 4)];\n const im2colShape = calculateIm2ColDims(xshape, kshape, outputShape);\n const [kWidth, kHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(adjustedKernelShape, TextureType.packedLastDimension);\n\n const im2colStrides = ShapeUtil.computeStrides(im2colShape);\n const [im2colWidth, im2colHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(im2colShape, TextureType.packedLastDimension);\n const rank = outputShape.length;\n\n const initValue = (inputs.length < 3) ? '0.0' : '_B(b)';\n const sharedDim = Math.ceil(xshape[1] * kshape[2] * kshape[3] / 4);\n const {activationFunction, applyActivation} = getActivationSnippet(attributes);\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const shaderSource = `\n${activationFunction}\nfloat process(int indices[${rank}]) {\n int b[1];\n b[0] = indices[1];\n int im2col[4];\n im2col[0] = indices[0];\n im2col[1] = indices[2];\n im2col[2] = indices[3];\n int im2colOffset = im2col[0] * ${im2colStrides[0]} + im2col[1] * ${im2colStrides[1]} + im2col[2] * ${\n im2colStrides[2]};\n int kernelOffset = indices[1] * ${adjustedKernelShape[1]};\n float value = ${initValue};\n for (int i = 0; i < ${sharedDim}; ++i) {\n vec2 im2colCoords = offsetToCoords(im2colOffset, ${im2colWidth}, ${im2colHeight});\n vec2 kernelCoords = offsetToCoords(kernelOffset, ${kWidth}, ${kHeight});\n value += dot(${glsl.texture2D}(Im2Col, im2colCoords), ${glsl.texture2D}(K, kernelCoords));\n ++im2colOffset;\n ++kernelOffset;\n }\n ${applyActivation}\n return value;\n}`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nexport const createDotProductProgramInfoLoader =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], outputShape: number[],\n attributes: InternalActivationAttributes): ProgramInfoLoader => {\n const metadata = createDotProductProgramMetadata(inputs.length > 2, attributes);\n return {\n ...metadata,\n get: () => createDotProductProgramInfo(inferenceHandler, metadata, inputs, outputShape, attributes)\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {InferenceHandler} from '../../../backend';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {PoolConvUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nimport {createUnpackedGroupedConvProgramInfoLoader} from './conv-grouped';\nimport {conv2DPacked} from './conv-pack';\nimport {createDotProductProgramInfoLoader} from './dot-product';\nimport {InternalActivationAttributes, parseInternalActivationAttributes} from './fuse-utils';\nimport {createIm2ColProgramInfoLoader} from './im2col';\nimport {createMatmulProgramInfoLoader} from './matmul';\n\n\nexport const calculateOutputShape =\n (inputShape: readonly number[], kernelShape: readonly number[], dilations: readonly number[],\n adjustPads: readonly number[], strides: readonly number[]): number[] => {\n const batchSize = inputShape[0];\n const inputSpatialShape = inputShape.slice(2);\n const spatialRank = inputSpatialShape.length;\n const outChannels = kernelShape[0];\n const kernelSpatialShape = kernelShape.slice(2);\n const dilatedKernelShape = kernelSpatialShape.map((v, i) => v + (v - 1) * (dilations[i] - 1));\n const inputSpatialShapeWithPad = inputSpatialShape.map((v, i) => v + adjustPads[i] + adjustPads[i + spatialRank]);\n const outputSpatialShape =\n inputSpatialShapeWithPad.map((v, i) => Math.floor((v - dilatedKernelShape[i] + strides[i]) / strides[i]));\n const outputShape = [batchSize, outChannels].concat(...outputSpatialShape);\n return outputShape;\n };\n\nexport interface ConvAttributes extends InternalActivationAttributes, AttributeWithCacheKey {\n readonly autoPad: string;\n readonly dilations: readonly number[];\n readonly group: number;\n readonly kernelShape: readonly number[];\n readonly pads: readonly number[];\n readonly strides: readonly number[];\n}\n\nexport const conv: OperatorImplementation =\n (inferenceHandler: InferenceHandler, inputs: Tensor[], attributes: ConvAttributes): Tensor[] => {\n validateInputs(inputs, attributes); // currently will fail if not conv2D\n return conv2d(inferenceHandler, inputs, attributes);\n };\n\nconst conv2d: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ConvAttributes): Tensor[] => {\n const adjustedAttributes = getAdjustedConvAttributes(attributes, inputs);\n const packMode = inferenceHandler.session.pack;\n const isPointwise = adjustedAttributes.kernelShape[0] === 1 && adjustedAttributes.kernelShape[1] === 1;\n if (adjustedAttributes.group > 1) {\n const result = inferenceHandler.run(\n createUnpackedGroupedConvProgramInfoLoader(inferenceHandler, inputs, adjustedAttributes), inputs);\n return [result];\n } else if (isPointwise && packMode) {\n return [conv2DUnpackedPointwise(inferenceHandler, inputs, adjustedAttributes)];\n } else if (packMode && inputs[0].dims.length === 4 && inputs[0].dims[0] === 1 && !isPointwise) {\n return [conv2DPacked(inferenceHandler, inputs, adjustedAttributes)];\n } else {\n return [conv2DUnpacked(inferenceHandler, inputs, adjustedAttributes)];\n }\n };\n\nconst conv2DUnpackedPointwise =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], attributes: ConvAttributes): Tensor => {\n const xshape = inputs[0].dims;\n const kshape = inputs[1].dims;\n const outputShape =\n calculateOutputShape(xshape, kshape, attributes.dilations, attributes.pads, attributes.strides);\n const reshapedX = inferenceHandler.reshapeUnpacked(inputs[0], [xshape[1], xshape[2] * xshape[3]]);\n const reshapedK = inferenceHandler.reshapeUnpacked(inputs[1], [kshape[0], kshape[1]]);\n\n const matmulInputs = inputs.length > 2 ? [reshapedK, reshapedX, inputs[2]] : [reshapedK, reshapedX];\n const matmulOutput = inferenceHandler.run(createMatmulProgramInfoLoader(matmulInputs, attributes), matmulInputs);\n return inferenceHandler.reshapeUnpacked(matmulOutput, outputShape);\n };\n\nconst conv2DUnpacked =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], attributes: ConvAttributes): Tensor => {\n const xshape = inputs[0].dims;\n const kshape = inputs[1].dims;\n const outputShape =\n calculateOutputShape(xshape, kshape, attributes.dilations, attributes.pads, attributes.strides);\n const xIm2Col = inferenceHandler.run(\n createIm2ColProgramInfoLoader(inferenceHandler, inputs[0], inputs[1], outputShape, attributes), [inputs[0]]);\n\n const dotProductInputs = inputs.length === 3 ? [xIm2Col, inputs[1], inputs[2]] : [xIm2Col, inputs[1]];\n const output = inferenceHandler.run(\n createDotProductProgramInfoLoader(inferenceHandler, inputs, outputShape, attributes), dotProductInputs);\n return output;\n };\n\nconst getAdjustedConvAttributes = (attributes: T, inputs: Tensor[]): T => {\n const kernelShape = attributes.kernelShape.slice();\n // if kernelShape is not specified in the attributes of this op, infer it from the weight tensor dims\n if (attributes.kernelShape.length === 0) {\n for (let i = 2; i < inputs[1].dims.length; ++i) {\n kernelShape.push(inputs[1].dims[i]);\n }\n }\n const pads = attributes.pads.slice();\n PoolConvUtil.adjustPadsBasedOnAutoPad(\n inputs[0].dims, attributes.strides, attributes.dilations, kernelShape, pads, attributes.autoPad);\n\n // always return a new object so does not modify the original attributes\n const newAttributes: T = Object.assign({}, attributes);\n Object.assign(newAttributes, {kernelShape, pads, cacheKey: attributes.cacheKey});\n return newAttributes;\n};\n\nexport const parseConvAttributes: OperatorInitialization = (node: Graph.Node): ConvAttributes => {\n const attributes = node.attributes;\n const activationAttributes = parseInternalActivationAttributes(attributes);\n // TODO : Make this generic enough to compute default attributes for multi-dimensional conv\n const autoPad = attributes.getString('auto_pad', 'NOTSET');\n const dilations = attributes.getInts('dilations', [1, 1]);\n const group = attributes.getInt('group', 1);\n const kernelShape = attributes.getInts('kernel_shape', []);\n const pads = attributes.getInts('pads', [0, 0, 0, 0]);\n const strides = attributes.getInts('strides', [1, 1]);\n\n return createAttributeWithCacheKey({autoPad, dilations, group, kernelShape, pads, strides, ...activationAttributes});\n};\n\nconst validateInputs = (inputs: Tensor[], attributes: ConvAttributes): void => {\n // Refer to the below link for all input checks\n // https://github.com/onnx/onnx/blob/main/docs/Operators.md#Conv\n if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n throw new Error('Conv requires 2 or 3 inputs');\n }\n\n // TODO : Need to add support for multi-dimensional conv\n if (inputs[0].dims.length !== 4 || inputs[1].dims.length !== 4) {\n throw new Error('currently only support 2-dimensional conv');\n }\n\n // FILTER_IN_CHANNEL should be equal to DATA_CHANNEL\n const dataChannel = inputs[0].dims[1];\n const filterInChannel = inputs[1].dims[1] * attributes.group;\n if (dataChannel !== filterInChannel) {\n throw new Error('FILTER_IN_CHANNEL should be equal to DATA_CHANNEL');\n }\n\n // if bias is provided it should be 1D and the number of elements should be equal to the number of feature maps\n if (inputs.length === 3 && (inputs[2].dims.length !== 1 || inputs[1].dims[0] !== inputs[2].dims[0])) {\n throw new Error('invalid bias');\n }\n\n const spatialRank = inputs[0].dims.length - 2;\n // wrong dilations dimension\n if (attributes.dilations.length !== spatialRank) {\n throw new Error(`dilations should be ${spatialRank}D`);\n }\n\n // Wrong strides dimension\n if (attributes.strides.length !== spatialRank) {\n throw new Error(`strides should be ${spatialRank}D`);\n }\n\n // Wrong pads dimension\n if (attributes.pads.length !== spatialRank * 2) {\n throw new Error(`pads should be ${spatialRank * 2}D`);\n }\n\n // if kernelShape is specified, it's data length must be 2 less than dims length of the weights tensor\n // (the first 2 dims are batch_size and channels)\n if (attributes.kernelShape.length !== 0 && attributes.kernelShape.length !== inputs[1].dims.length - 2) {\n throw new Error('invalid kernel shape');\n }\n\n // TODO : Need to add support for float64\n if (inputs[0].type !== 'float32' || inputs[1].type !== 'float32') {\n throw new Error('Conv input(X,W) should be float tensor');\n }\n\n if (inputs.length === 3 && inputs[2].type !== 'float32') {\n throw new Error('Conv input(bias) should be float tensor');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {InferenceHandler} from '../../../backend';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nimport {ConvAttributes} from './conv';\nimport {getActivationSnippet, parseInternalActivationAttributes} from './fuse-utils';\n\nconst computeTotalPad =\n (inDim: number, stride: number, adj: number, kernel: number, dilation: number, outSize: number) =>\n (inDim - 1) * stride + adj + (kernel - 1) * dilation + 1 - outSize;\n\nconst distributePadding = (totalPad: number, autoPad: string, pads: number[], head: number, tail: number) => {\n const smallPad = Math.floor(totalPad / 2);\n if (autoPad === 'SAME_UPPER') {\n pads[head] = smallPad;\n pads[tail] = totalPad - smallPad;\n } else if (autoPad === 'SAME_LOWER') {\n pads[head] = totalPad - smallPad;\n pads[tail] = smallPad;\n }\n};\n\nconst calculateOutputShapeAndPads =\n (inputShape: readonly number[], kernelShape: readonly number[], dilations: readonly number[], autoPad: string,\n pads: number[], strides: readonly number[], outputPadding: readonly number[], outputShape: number[]) => {\n const spatialRank = inputShape.length - 2;\n const updateShape = outputShape.length === 0;\n for (let i = 0; i < spatialRank; ++i) {\n const outSize = updateShape ? inputShape[i + 2] * strides[i] : outputShape[i];\n const totalPad = computeTotalPad(inputShape[i + 2], strides[i], pads[i], kernelShape[i], dilations[i], outSize);\n distributePadding(totalPad, autoPad, pads, i, i + spatialRank);\n if (updateShape) {\n outputShape.push(\n strides[i] * (inputShape[i + 2] - 1) + outputPadding[i] + (kernelShape[i] - 1) * dilations[i] + 1 -\n pads[i] - pads[i + spatialRank]);\n }\n }\n };\n\nexport interface ConvTransposeAttributes extends ConvAttributes {\n readonly outputPadding: readonly number[];\n readonly outputShape: readonly number[];\n}\n\nexport const convTranspose: OperatorImplementation =\n (inferenceHandler: InferenceHandler, inputs: Tensor[], attributes: ConvTransposeAttributes): Tensor[] => {\n validateInputs(inputs, attributes); // currently will fail if not convTranspose2D\n return convTranspose2d(inferenceHandler, inputs, attributes);\n };\n\nconst convTranspose2d: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ConvTransposeAttributes): Tensor[] => {\n const adjustedAttributes = getAdjustedConvTransposeAttributes(attributes, inputs);\n return [convTranspose2DUnpacked(inferenceHandler, inputs, adjustedAttributes)];\n };\n\nconst createConvTransposeProgramMetadata = (hasBias: boolean, cacheHint: string) => ({\n name: 'ConvTranspose',\n inputNames: hasBias ? ['X', 'W', 'B'] : ['X', 'W'],\n inputTypes: hasBias ? [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked] :\n [TextureType.unpacked, TextureType.unpacked],\n cacheHint\n});\n\nconst createUnpackedConvTransposeProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], metadata: ProgramMetadata,\n attributes: ConvTransposeAttributes): ProgramInfo => {\n const hasBias = inputs.length > 2;\n const valueInit = hasBias ? 'getB(output_channel)' : '0.0';\n const xShape = inputs[0].dims;\n const wShape = inputs[1].dims;\n const outputChannelsPerGroup = wShape[1];\n const inputChannelsPerGroup = wShape[0] / attributes.group;\n const outputShape = [inputs[0].dims[0], inputs[1].dims[1] * attributes.group, ...attributes.outputShape];\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const {activationFunction, applyActivation} = getActivationSnippet(attributes);\n\n const shaderSource = `\n const ivec2 strides = ivec2(${attributes.strides[0]}, ${attributes.strides[1]});\n const ivec2 pads = ivec2(${attributes.pads[0]}, ${attributes.pads[1]});\n ${activationFunction}\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n int output_channel = coords.y;\n\n ivec2 loc = coords.zw + pads;\n\n int group_id = output_channel / ${outputChannelsPerGroup};\n int wOutChannel = output_channel - group_id * ${outputChannelsPerGroup};\n\n float value = ${valueInit};\n for (int inChannelOffset = 0; inChannelOffset < ${inputChannelsPerGroup}; inChannelOffset++) {\n int input_channel = group_id * ${inputChannelsPerGroup} + inChannelOffset;\n for (int wWOff = 0; wWOff < ${wShape[2]}; wWOff++) {\n for (int wHOff = 0; wHOff < ${wShape[3]}; wHOff++) {\n ivec2 wOff = ivec2(wWOff * ${attributes.dilations[0]}, wHOff * ${attributes.dilations[1]});\n ivec2 wLoc = loc - wOff;\n ivec2 wLocIn = wLoc / strides;\n if (\n wLocIn * strides == wLoc &&\n wLocIn.x >= 0 && wLocIn.x < ${xShape[2]} &&\n wLocIn.y >= 0 && wLocIn.y < ${xShape[3]}\n ) {\n float xVal = getX(batch, input_channel, wLocIn.y, wLocIn.x);\n float wVal = getW(input_channel, wOutChannel, wHOff, wWOff);\n value += xVal * wVal;\n }\n }\n }\n }\n ${applyActivation}\n ${glsl.output} = vec4(value, .0, .0, .0);\n }\n`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource,\n hasMain: true,\n };\n };\n\nconst createUnpackedConvTransposeProgramInfoLoader =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], attributes: ConvTransposeAttributes):\n ProgramInfoLoader => {\n const metadata = createConvTransposeProgramMetadata(inputs.length > 2, attributes.cacheKey);\n return {\n ...metadata,\n get: () => createUnpackedConvTransposeProgramInfo(inferenceHandler, inputs, metadata, attributes)\n };\n };\n\n\nconst convTranspose2DUnpacked =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], attributes: ConvTransposeAttributes):\n Tensor => {\n const result = inferenceHandler.run(\n createUnpackedConvTransposeProgramInfoLoader(inferenceHandler, inputs, attributes), inputs);\n return result;\n };\n\nconst getAdjustedConvTransposeAttributes = (attributes: T, inputs: Tensor[]): T => {\n const kernelShape = attributes.kernelShape.slice();\n // if kernelShape is not specified in the attributes of this op, infer it from the weight tensor dims\n if (attributes.kernelShape.length === 0) {\n for (let i = 2; i < inputs[1].dims.length; ++i) {\n kernelShape.push(inputs[1].dims[i]);\n }\n }\n\n const pads = attributes.pads.slice();\n const outputShape = attributes.outputShape.slice();\n const inputShape = inputs[0].dims;\n // If outputShape is not specified in the attributes of this op, infer it from the parameters\n // Similarly, automatically infer pads if not specified\n calculateOutputShapeAndPads(\n inputShape, kernelShape, attributes.dilations, attributes.autoPad, pads, attributes.strides,\n attributes.outputPadding, outputShape);\n\n // always return a new object so does not modify the original attributes\n const newAttributes: T = Object.assign({}, attributes);\n Object.assign(newAttributes, {kernelShape, pads, outputShape, cacheKey: attributes.cacheKey});\n return newAttributes;\n};\n\nexport const parseConvTransposeAttributes: OperatorInitialization =\n (node: Graph.Node): ConvTransposeAttributes => {\n const attributes = node.attributes;\n const activationAttributes = parseInternalActivationAttributes(attributes);\n // TODO : Make this generic enough to compute default attributes for multi-dimensional conv\n const autoPad = attributes.getString('auto_pad', 'NOTSET');\n const dilations = attributes.getInts('dilations', [1, 1]);\n const group = attributes.getInt('group', 1);\n const kernelShape = attributes.getInts('kernel_shape', []);\n const outputPadding = attributes.getInts('output_padding', [0, 0]);\n const outputShape = attributes.getInts('output_shape', []);\n const pads = attributes.getInts('pads', [0, 0, 0, 0]);\n const strides = attributes.getInts('strides', [1, 1]);\n\n return createAttributeWithCacheKey(\n {autoPad, dilations, group, kernelShape, outputPadding, outputShape, pads, strides, ...activationAttributes});\n };\n\nconst validateInputs = (inputs: Tensor[], attributes: ConvTransposeAttributes): void => {\n // Refer to the below link for all input checks\n // https://github.com/onnx/onnx/blob/main/docs/Operators.md#Conv\n if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n throw new Error('Conv requires 2 or 3 inputs');\n }\n\n // TODO : Need to add support for multi-dimensional conv\n if (inputs[0].dims.length !== 4 || inputs[1].dims.length !== 4) {\n throw new Error('currently only support 2-dimensional conv');\n }\n\n // FILTER_IN_CHANNEL should be equal to DATA_CHANNEL\n const dataChannel = inputs[0].dims[1];\n const filterInChannel = inputs[1].dims[0];\n if (dataChannel !== filterInChannel) {\n throw new Error('FILTER_IN_CHANNEL should be equal to DATA_CHANNEL');\n }\n\n const featureMaps = inputs[1].dims[1] * attributes.group;\n\n // if bias is provided it should be 1D and the number of elements should be equal to the number of feature maps\n if (inputs.length === 3 && (inputs[2].dims.length !== 1 || inputs[2].dims[0] !== featureMaps)) {\n throw new Error('invalid bias');\n }\n\n const spatialRank = inputs[0].dims.length - 2;\n // wrong dilations dimension\n if (attributes.dilations.length !== spatialRank) {\n throw new Error(`dilations should be ${spatialRank}D`);\n }\n\n // Wrong strides dimension\n if (attributes.strides.length !== spatialRank) {\n throw new Error(`strides should be ${spatialRank}D`);\n }\n\n // Wrong pads dimension\n if (attributes.pads.length !== spatialRank * 2) {\n throw new Error(`pads should be ${spatialRank * 2}D`);\n }\n\n // Wrong output padding dimension\n if (attributes.outputPadding.length !== spatialRank) {\n throw new Error(`output_padding should be ${spatialRank}D`);\n }\n\n // if kernelShape is specified, it's data length must be 2 less than dims length of the weights tensor\n // (the first 2 dims are batch_size and channels)\n if (attributes.kernelShape.length !== 0 && attributes.kernelShape.length !== inputs[1].dims.length - 2) {\n throw new Error('invalid kernel shape');\n }\n\n // as with kernelShape, must have same number of spatial dims as input\n if (attributes.outputShape.length !== 0 && attributes.outputShape.length !== inputs[0].dims.length - 2) {\n throw new Error('invalid output shape');\n }\n\n // TODO : Need to add support for float64\n if (inputs[0].type !== 'float32' || inputs[1].type !== 'float32') {\n throw new Error('ConvTranspose input(X,W) should be float tensor');\n }\n\n if (inputs.length === 3 && inputs[2].type !== 'float32') {\n throw new Error('ConvTranspose input(bias) should be float tensor');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, TextureType} from '../types';\n\nexport interface TransposeAttributes extends AttributeWithCacheKey {\n readonly perm: number[];\n}\n\nconst transposeProgramMetadata = {\n name: 'Transpose',\n inputNames: ['A'],\n inputTypes: [TextureType.unpacked]\n};\n\nexport const transpose: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: TransposeAttributes): Tensor[] => {\n validateInputs(inputs);\n const output = inferenceHandler.run(\n {\n ...transposeProgramMetadata,\n cacheHint: attributes.cacheKey,\n get: () => createTransposeProgramInfo(inferenceHandler, inputs[0], attributes.perm)\n },\n inputs);\n return [output];\n };\n\nexport const parseTransposeAttributes: OperatorInitialization =\n (node: Graph.Node): TransposeAttributes => createAttributeWithCacheKey({perm: node.attributes.getInts('perm', [])});\n\nconst createTransposeProgramInfo =\n (_inferenceHandler: WebGLInferenceHandler, input: Tensor, perm: number[]): ProgramInfo => {\n const inputShape = input.dims;\n perm = getAdjustedPerm(inputShape, perm);\n const unpackedOutputShape = getOutputShape(inputShape, perm);\n const rank = inputShape.length;\n // A dims=[${inputs[0].dims.toString()}]\n // out Dims=[${unpackedOutputShape.toString()}]\n // based on perm=[${perm.toString()}]\n const shaderSource = `\n ${getPermFunctionBody('perm', perm, rank)}\n float process(int indices[${rank}]) {\n int a[${rank}];\n perm(a, indices);\n return _A(a);\n }`;\n return {\n ...transposeProgramMetadata,\n output: {dims: unpackedOutputShape, type: input.type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst getAdjustedPerm = (inputShape: readonly number[], perm: number[]): number[] => {\n if (perm && perm.length !== inputShape.length) {\n perm = [...(inputShape.keys())].reverse();\n }\n return perm;\n};\n\nconst getOutputShape = (inputShape: readonly number[], perm: number[]): readonly number[] => {\n perm = getAdjustedPerm(inputShape, perm);\n return ShapeUtil.sortBasedOnPerm(inputShape, perm);\n};\n\nconst getPermFunctionBody = (name: string, perm: number[], rank: number): string => {\n const reverseFunc = [];\n reverseFunc.push(`void ${name}(out int a[${rank}], int src[${rank}]) {`);\n for (let i = 0; i < rank; ++i) {\n reverseFunc.push(`\\ta[${perm[i]}]=src[${i}];`);\n }\n reverseFunc.push('\\t}');\n return reverseFunc.join('\\n');\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Transpose requires 1 input.');\n }\n\n if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n throw new Error('input should be float tensor');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nimport {transpose, TransposeAttributes} from './transpose';\n\nexport interface DepthToSpaceAttributes {\n mode: 'DCR'|'CRD';\n blocksize: number;\n}\n\nexport const depthToSpace: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: DepthToSpaceAttributes): Tensor[] => {\n validateInputs(inputs);\n const blocksize = attributes.blocksize;\n const blocksizeSqr = blocksize * blocksize;\n const transposePerm = attributes.mode === 'DCR' ? [0, 3, 4, 1, 5, 2] : [0, 1, 4, 2, 5, 3];\n const firstReshapeShape = attributes.mode === 'DCR' ?\n [\n inputs[0].dims[0], blocksize, blocksize, inputs[0].dims[1] / blocksizeSqr, inputs[0].dims[2],\n inputs[0].dims[3]\n ] :\n [\n inputs[0].dims[0], inputs[0].dims[1] / blocksizeSqr, blocksize, blocksize, inputs[0].dims[2],\n inputs[0].dims[3]\n ];\n\n // const transpose = new WebGLTranspose();\n // const attributes = new Attribute(undefined);\n // attributes.set('perm', 'ints', transposePerm);\n // transpose.initialize(attributes);\n\n // First reshape\n const firstReshapedTensor = inferenceHandler.reshapeUnpacked(inputs[0], firstReshapeShape);\n\n // transpose\n const transposeAttributes: TransposeAttributes = {perm: transposePerm, cacheKey: `${transposePerm}`};\n const [transposeOutput] = transpose(inferenceHandler, [firstReshapedTensor], transposeAttributes);\n\n // Second reshape\n const secondReshapeShape = [\n inputs[0].dims[0], inputs[0].dims[1] / blocksizeSqr, inputs[0].dims[2] * blocksize,\n inputs[0].dims[3] * blocksize\n ];\n const result = inferenceHandler.reshapeUnpacked(transposeOutput, secondReshapeShape);\n return [result];\n };\n\nexport const parseDepthToSpaceAttributes: OperatorInitialization =\n (node: Graph.Node): DepthToSpaceAttributes => {\n // processing node attributes\n const blocksize = node.attributes.getInt('blocksize');\n if (blocksize < 1) {\n throw new Error(`blocksize must be >= 1, but got : ${blocksize} for DepthToSpace`);\n }\n const mode = node.attributes.getString('mode', 'DCR');\n if (mode !== 'DCR' && mode !== 'CRD') {\n throw new Error(`unrecognized mode: ${mode} for DepthToSpace`);\n }\n return {mode, blocksize};\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (inputs.length !== 1) {\n throw new Error(`DepthToSpace expect 1 inputs, but got ${inputs.length}`);\n }\n\n // Input has to be a 4-D tensor\n // TODO: Support string depth-to-space.\n if (inputs[0].type === 'string' || inputs[0].dims.length !== 4) {\n throw new TypeError('DepthToSpace input should be a 4-D numeric tensor');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nexport const flatten: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], axis: number): Tensor[] => {\n validateInputs(inputs, axis);\n\n const outputDims = ShapeUtil.flattenShape(inputs[0].dims, axis);\n return [inferenceHandler.reshapeUnpacked(inputs[0], outputDims)];\n };\n\nexport const parseFlattenAttributes: OperatorInitialization = (node: Graph.Node): number =>\n node.attributes.getInt('axis', 1); // default axis is 1\n\nconst validateInputs = (inputs: Tensor[], axis: number): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Flatten requires 1 input.');\n }\n\n const r = inputs[0].dims.length;\n if (r === 0) {\n throw new Error('scalar tensor is not supported.');\n }\n\n if (axis < -r || axis > r) {\n throw new Error('Invalid axis');\n }\n\n // TODO: Support string type\n if (inputs[0].type === 'string') {\n throw new Error('string tensor is not supported.');\n }\n};", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceHandler} from './backend';\nimport {Graph} from './graph';\nimport {Tensor} from './tensor';\n\nexport type OperatorImplementation = (inferenceHandler: InferenceHandler, inputs: Tensor[], context: T) => Tensor[];\nexport type OperatorInitialization = (node: Graph.Node, graph: Graph) => T;\n\nexport interface Operator {\n readonly impl: OperatorImplementation;\n readonly context: Graph.Node|unknown;\n}\n\nexport const NUMBER_TYPES: readonly Tensor.DataType[] =\n ['float32', 'float64', 'int32', 'int16', 'int8', 'uint16', 'uint32', 'uint8'];\nexport const INT_TYPES: readonly Tensor.DataType[] = ['int32', 'int16', 'int8', 'uint16', 'uint32', 'uint8'];\nexport const FLOAT_TYPES: readonly Tensor.DataType[] = ['float32', 'float64'];\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {NUMBER_TYPES, OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\ninterface GatherAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n}\n\nexport const gather: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: GatherAttributes): Tensor[] => {\n validateInputs(inputs, attributes.axis);\n const output = inferenceHandler.run(createGatherProgramInfoLoader(inferenceHandler, inputs, attributes), inputs);\n return [output];\n };\n\nexport const parseGatherAttributes: OperatorInitialization = (node: Graph.Node): GatherAttributes =>\n createAttributeWithCacheKey({axis: node.attributes.getInt('axis', 0)});\n\nconst gatherProgramMetadata = {\n name: 'Gather',\n inputNames: ['A', 'B'],\n inputTypes: [TextureType.unpacked, TextureType.unpacked],\n};\n\nconst createGatherProgramInfo =\n (_handler: WebGLInferenceHandler, metadata: ProgramMetadata, inputs: Tensor[], axis: number): ProgramInfo => {\n const inputShape = inputs[0].dims.slice();\n const indexDataShape = inputs[1].dims.slice();\n const outputShape = new Array(inputShape.length + indexDataShape.length - 1);\n\n axis = ShapeUtil.normalizeAxis(axis, inputShape.length);\n const indexCopyOps: string[] = [];\n for (let i = 0; i < outputShape.length; i++) {\n // outputShape is divided into three parts: A, B, C\n // |0 axis| axis + indexDataShape.length | end|\n // | A | B | C |\n //\n // inputIdx: [A, inputs[1][B], C]\n if (i < axis) { // A\n outputShape[i] = inputShape[i];\n indexCopyOps.push(`inputIdx[${i}] = outputIdx[${i}];`);\n } else {\n if (i < axis + indexDataShape.length) { // B\n outputShape[i] = indexDataShape[i - axis];\n indexCopyOps.push(`indexDataIdx[${i - axis}] = outputIdx[${i}];`);\n } else { // C\n outputShape[i] = inputShape[i - indexDataShape.length + 1]; // skip 1 for axis\n indexCopyOps.push(`inputIdx[${i - indexDataShape.length + 1}] = outputIdx[${i}];`);\n }\n }\n }\n\n const orank = outputShape.length || 1;\n const irank = inputShape.length;\n const iDrank = indexDataShape.length || 1;\n const shaderSource = `\n float process(int outputIdx[${orank}]) {\n int inputIdx[${irank}];\n int indexDataIdx[${iDrank}];\n indexDataIdx[0] = 0;\n ${indexCopyOps.join('\\n ')}\n int idx = int(_B(indexDataIdx));\n inputIdx[${axis}] = idx < 0 ? idx + ${inputShape[axis]} : idx;\n return _A(inputIdx);\n }`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst createGatherProgramInfoLoader =\n (handler: WebGLInferenceHandler, inputs: Tensor[], attributes: GatherAttributes): ProgramInfoLoader => {\n const metadata = {...gatherProgramMetadata, cacheHint: attributes.cacheKey};\n return {...metadata, get: () => createGatherProgramInfo(handler, metadata, inputs, attributes.axis)};\n };\n\nconst validateInputs = (inputs: Tensor[], axis: number): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Gather requires 2 inputs.');\n }\n const tensorRank = inputs[0].dims.length;\n if (tensorRank < 1) {\n throw new Error('Invalid input shape.');\n }\n if (axis < -tensorRank || axis > tensorRank - 1) {\n throw new Error('Invalid axis.');\n }\n if (NUMBER_TYPES.indexOf(inputs[0].type) === -1) {\n throw new Error('Invaid input type.');\n }\n if (inputs[1].type !== 'int32' && inputs[1].type !== 'int16') {\n throw new Error('Invaid input type.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {GemmUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nexport interface GemmAttributes extends AttributeWithCacheKey {\n transA: boolean;\n transB: boolean;\n alpha: number;\n beta: number;\n isOptionalC: boolean; // in opset 11, C becomes optional\n}\n\nexport const gemm: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: GemmAttributes): Tensor[] => {\n validateInputs(inputs, attributes);\n const output = inferenceHandler.run(createGemmProgramInfoLoader(inputs, attributes), inputs);\n return [output];\n };\n\nconst parseGemmAttributes = (node: Graph.Node, isOptionalC: boolean): GemmAttributes => {\n const transA = node.attributes.getInt('transA', 0) !== 0;\n const transB = node.attributes.getInt('transB', 0) !== 0;\n const alpha = node.attributes.getFloat('alpha', 1.0);\n const beta = node.attributes.getFloat('beta', 1.0);\n return createAttributeWithCacheKey({transA, transB, alpha, beta, isOptionalC});\n};\n\nexport const parseGemmAttributesV7: OperatorInitialization = (node: Graph.Node): GemmAttributes =>\n parseGemmAttributes(node, false);\n\nexport const parseGemmAttributesV11: OperatorInitialization = (node: Graph.Node): GemmAttributes =>\n parseGemmAttributes(node, true);\n\nconst createGemmProgramInfoLoader = (inputs: Tensor[], attributes: GemmAttributes): ProgramInfoLoader => {\n const metadata = {\n name: 'Gemm',\n inputNames: inputs.length === 3 ? ['A', 'B', 'C'] : ['A', 'B'],\n inputTypes: inputs.length === 3 ? [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked] :\n [TextureType.unpacked, TextureType.unpacked],\n key: attributes.cacheKey\n };\n\n return {...metadata, get: () => createGemmProgramInfo(metadata, inputs, attributes)};\n};\n\nconst createGemmProgramInfo =\n (metadata: ProgramMetadata, inputs: Tensor[], attributes: GemmAttributes): ProgramInfo => {\n const aShape = inputs[0].dims.slice();\n const bShape = inputs[1].dims.slice();\n const [M, N] = GemmUtil.getShapeOfGemmResult(\n aShape, attributes.transA, bShape, attributes.transB, inputs.length === 3 ? inputs[2].dims : undefined);\n const outputShape = [M, N];\n if (!outputShape) {\n throw new Error('Can\\'t use gemm on the given tensors');\n }\n let sharedDim = aShape[aShape.length - 1];\n let line = '';\n if (attributes.transA) {\n sharedDim = aShape[0];\n }\n if (attributes.transA && attributes.transB) {\n line = 'value += _A_T(a) * _B_T(b);';\n } else if (attributes.transA && !attributes.transB) {\n line = 'value += _A_T(a) * _B(b);';\n } else if (!attributes.transA && attributes.transB) {\n line = 'value += _A(a) * _B_T(b);';\n } else if (!attributes.transA && !attributes.transB) {\n line = 'value += _A(a) * _B(b);';\n }\n const rank = outputShape.length;\n const declareC = inputs.length === 3 ? `int c[${inputs[2].dims.length}];` : '';\n const broadcastC = inputs.length === 3 ? 'bcastIndices_C(indices, c);' : '';\n const calculateC = inputs.length === 3 ? 'value += beta * _C(c);' : '';\n const shaderSource = `\n float process(int indices[${rank}]) {\n int a[${rank}];\n int b[${rank}];\n ${declareC}\n\n copyVec(indices, a);\n copyVec(indices, b);\n ${broadcastC}\n\n float value = 0.0;\n for (int k=0; k<${sharedDim}; ++k) {\n a[${rank - 1}] = k;\n b[${rank - 2}] = k;\n ${line}\n }\n\n value = value * alpha;\n ${calculateC}\n return value;\n }`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n variables: [\n {name: 'alpha', type: 'float', data: attributes.alpha}, {name: 'beta', type: 'float', data: attributes.beta}\n ],\n shaderSource\n };\n };\n\nconst validateInputs = (inputs: Tensor[], attributes: GemmAttributes): void => {\n if (!inputs) {\n throw new Error('Input is missing');\n }\n if (attributes.isOptionalC && (inputs.length < 2 || inputs.length > 3)) {\n throw new Error('Invaid input shape.');\n }\n if (!attributes.isOptionalC && inputs.length !== 3) {\n throw new Error('Gemm requires 3 inputs');\n }\n\n // 'C' can be of dimensionality 1 or 2 only\n if (inputs.length === 3 && inputs[2].dims.length !== 1 && inputs[2].dims.length !== 2) {\n throw new Error('Invalid input shape of C');\n }\n\n if ((inputs[0].type !== 'float32' && inputs[0].type !== 'float64') ||\n (inputs[1].type !== 'float32' && inputs[1].type !== 'float64') ||\n (inputs.length === 3 && inputs[2].type !== 'float32' && inputs[2].type !== 'float64')) {\n throw new Error('Invalid input type.');\n }\n\n if ((inputs[0].type !== inputs[1].type) || (inputs.length === 3 && inputs[0].type !== inputs[2].type)) {\n throw new Error('Input types are mismatched');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nexport interface ImageScalerAttributes extends AttributeWithCacheKey {\n scale: number;\n bias: number[];\n}\n\nexport const imageScaler: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ImageScalerAttributes): Tensor[] => {\n validateInputs(inputs);\n const output =\n inferenceHandler.run(createImageScalerProgramInfoLoader(inferenceHandler, inputs, attributes), inputs);\n return [output];\n };\n\nexport const parseImageScalerAttributes: OperatorInitialization =\n (node: Graph.Node): ImageScalerAttributes => {\n const scale = node.attributes.getFloat('scale');\n const bias = node.attributes.getFloats('bias');\n return createAttributeWithCacheKey({scale, bias});\n };\n\nconst imageScalerProgramMetadata = {\n name: 'ImageScaler',\n inputNames: ['X'],\n inputTypes: [TextureType.unpacked],\n};\n\nconst createImageScalerProgramInfo =\n (_handler: WebGLInferenceHandler, metadata: ProgramMetadata, inputs: Tensor[], attributes: ImageScalerAttributes):\n ProgramInfo => {\n const outputShape = inputs[0].dims.slice();\n const rank = outputShape.length;\n const getBiasMethod = createGetBiasMethod(attributes.bias.length);\n const shaderSource = `\n ${getBiasMethod}\n float process(int indices[${rank}]) {\n return _X(indices) * scale + getBias(bias, indices[1]);\n }`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n variables: [\n {name: 'bias', type: 'float', arrayLength: attributes.bias.length, data: attributes.bias},\n {name: 'scale', type: 'float', data: attributes.scale}\n ],\n shaderSource\n };\n };\n\nconst createImageScalerProgramInfoLoader =\n (handler: WebGLInferenceHandler, inputs: Tensor[], attributes: ImageScalerAttributes): ProgramInfoLoader => {\n const metadata = {...imageScalerProgramMetadata, cacheHint: attributes.cacheKey};\n return {...metadata, get: () => createImageScalerProgramInfo(handler, metadata, inputs, attributes)};\n };\n\nconst createGetBiasMethod = (numChannels: number): string => {\n const codeLines: string[] = [`float getBias(float bias[${numChannels}], int channel) {`];\n for (let i = 0; i < numChannels; ++i) {\n if (i === 0) {\n codeLines.push(\n '\\t' +\n `if (channel == ${i}) { return bias[${i}]; }`);\n } else if (i === numChannels - 1) {\n codeLines.push(\n '\\t' +\n `else { return bias[${i}]; }`);\n } else {\n codeLines.push(\n '\\t' +\n `else if (channel == ${i}) { return bias[${i}]; }`);\n }\n }\n codeLines.push(\n '\\t' +\n '}');\n return codeLines.join('\\n');\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('ImageScaler requires 1 input.');\n }\n if (inputs[0].dims.length !== 4) {\n throw new Error('Invalid input shape.');\n }\n if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n throw new Error('Invalid input type.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nexport const instanceNormalization: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], epsilon: number): Tensor[] => {\n validateInputs(inputs);\n\n const meanAndVariance = inferenceHandler.run(createMeanAndVarianceProgramInfoLoader(inputs[0]), inputs);\n const output = inferenceHandler.run(\n createComputeOutputProgramInfoLoader(inferenceHandler, inputs[0], epsilon, meanAndVariance.dims),\n [inputs[0], meanAndVariance, inputs[1], inputs[2]]);\n return [output];\n };\n\nexport const parseInstanceNormalizationAttributes: OperatorInitialization = (node: Graph.Node): number =>\n node.attributes.getFloat('epsilon', 1e-5);\n\nconst meanAndVarianceProgramMetadata = {\n name: 'InstanceNormalization_MeanAndVariance',\n inputNames: ['X'],\n inputTypes: [TextureType.unpacked],\n};\n\nconst createMeanAndVarianceProgramInfo = (metadata: ProgramMetadata, input: Tensor): ProgramInfo => {\n const xDims = input.dims.slice();\n const channel = xDims[1];\n const channelSize = xDims[2] * xDims[3];\n const outputShape = [xDims[0], channel];\n\n const shaderSource = `\n vec4 process(int[2] indices) {\n vec4 v = vec4(0.0);\n int a[4];\n a[0] = indices[0];\n a[1] = indices[1];\n float temp = 0.0;\n for(int a2=0; a2<${xDims[2]}; a2++) {\n a[2] = a2;\n for(int a3=0; a3<${xDims[3]}; a3++) {\n a[3] = a3;\n float x = _X(a);\n temp += x;\n }\n }\n float mean = temp / float(${channelSize});\n temp = 0.0;\n for(int a2=0; a2<${xDims[2]}; a2++) {\n a[2] = a2;\n for(int a3=0; a3<${xDims[3]}; a3++) {\n a[3] = a3;\n float x = _X(a);\n temp += (x - mean) * (x - mean);\n }\n }\n v.r = mean;\n v.g = temp / float(${channelSize});\n\n return v;\n }`;\n return {\n ...metadata,\n output: {dims: outputShape, type: input.type, textureType: TextureType.packedLastDimension},\n shaderSource\n };\n};\n\nconst createMeanAndVarianceProgramInfoLoader = (input: Tensor): ProgramInfoLoader => ({\n ...meanAndVarianceProgramMetadata,\n get: () => createMeanAndVarianceProgramInfo(meanAndVarianceProgramMetadata, input)\n});\n\nconst computeOutputProgramMetadata = {\n name: 'InstanceNormalization_ComputeOutput',\n inputNames: ['X', 'MeanAndVariance', 'Scale', 'B'],\n inputTypes: [TextureType.unpacked, TextureType.packedLastDimension, TextureType.unpacked, TextureType.unpacked],\n};\n\nconst createComputeOutputProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, metadata: ProgramMetadata, input: Tensor, epsilon: number,\n meanAndVarianceShape: readonly number[]): ProgramInfo => {\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const [textureWidth, textureHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(meanAndVarianceShape, TextureType.packedLastDimension);\n const [meanAndVarianceWidth, meanAndVarianceHeight] = [textureWidth / 4, textureHeight];\n const shaderSource = `\n vec4 get_MeanAndVariance(int[2] mv) {\n int offset = indicesToOffset_MeanAndVariance(mv);\n vec2 coords = offsetToCoords(offset, ${meanAndVarianceWidth}, ${meanAndVarianceHeight});\n return ${glsl.texture2D}(MeanAndVariance, coords);\n }\n\n float process(int[4] indices) {\n int mv[2];\n mv[0] = indices[0];\n mv[1] = indices[1];\n vec4 mean_and_variance = get_MeanAndVariance(mv);\n float mean = mean_and_variance.r;\n float variance = mean_and_variance.g;\n\n int sb[1];\n sb[0] = indices[1];\n float scale = _Scale(sb);\n float b = _B(sb);\n\n return scale * (_X(indices) - mean) / sqrt(variance + epsilon) + b;\n }`;\n return {\n ...metadata,\n output: {dims: input.dims, type: input.type, textureType: TextureType.unpacked},\n variables: [{name: 'epsilon', type: 'float', data: epsilon}],\n shaderSource\n };\n };\n\nconst createComputeOutputProgramInfoLoader =\n (inferenceHandler: WebGLInferenceHandler, input: Tensor, epsilon: number, meanAndVarianceShape: readonly number[]):\n ProgramInfoLoader => {\n const metadata = {...computeOutputProgramMetadata, cacheHint: `${epsilon}`};\n return {\n ...metadata,\n get: () => createComputeOutputProgramInfo(inferenceHandler, metadata, input, epsilon, meanAndVarianceShape)\n };\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 3) {\n throw new Error('InstanceNormalization requires 3 inputs.');\n }\n\n const X = inputs[0];\n const scale = inputs[1];\n const B = inputs[2];\n\n // input should at least have three dimensions - N,C,dim1,...,dimn\n // other inputs can have only one dimensions\n if (X.dims.length < 3 || scale.dims.length !== 1 || B.dims.length !== 1) {\n throw new Error('Invalid input shape.');\n }\n if (scale.dims[0] !== X.dims[1] || B.dims[0] !== X.dims[1]) {\n throw new Error('Input shapes are mismatched.');\n }\n if ((X.type !== 'float32' && X.type !== 'float64') || (scale.type !== 'float32' && scale.type !== 'float64') ||\n (B.type !== 'float32' && B.type !== 'float64')) {\n throw new Error('Invalid input type.');\n }\n if (inputs[0].dims.length !== 4) {\n throw new Error('Only support 4-D input shape.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, TextureType} from '../types';\n\nexport interface LrnAttributes extends AttributeWithCacheKey {\n alpha: number;\n beta: number;\n bias: number;\n size: number;\n}\n\nexport const lrn: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: LrnAttributes): Tensor[] => {\n validateInputs(inputs);\n\n // if (inferenceHandler.session.pack) {\n // return [inferenceHandler.run(createPackedLrnProgramInfoLoader(inferenceHandler, inputs, attributes),\n // inputs)];\n // } else {\n return [inferenceHandler.run(createLrnProgramInfoLoader(inputs, attributes), inputs)];\n //}\n };\n\nexport const parseLrnAttributes: OperatorInitialization = (node: Graph.Node): LrnAttributes => {\n const alpha = node.attributes.getFloat('alpha', 0.0001);\n const beta = node.attributes.getFloat('beta', 0.75);\n const bias = node.attributes.getFloat('bias', 1.0);\n const size = node.attributes.getInt('size');\n\n return createAttributeWithCacheKey({alpha, beta, bias, size});\n};\n\nconst lrnProgramMetadata = {\n name: 'LRN',\n inputNames: ['X'],\n inputTypes: [TextureType.unpacked]\n};\n\nfunction createLrnProgramInfo(inputs: Tensor[], attributes: LrnAttributes): ProgramInfo {\n const C = inputs[0].dims[1];\n const rank = inputs[0].dims.length;\n const from = -Math.floor((attributes.size - 1) / 2);\n const to = Math.ceil((attributes.size - 1) / 2);\n const alpha = `float(${attributes.alpha}) / float(${attributes.size})`;\n const bias = `float(${attributes.bias})`;\n const beta = `float(${attributes.beta})`;\n\n const shaderSource = `\n float process(int indices[${rank}]) {\n int c = indices[1];\n float x = _X(indices);\n float square_sum = 0.0;\n\n for (int i = ${from}; i <= ${to}; i++) {\n int idx = c + i;\n if (c >= 0 && c < ${C}) {\n indices[1] = idx;\n float j = _X(indices);\n square_sum += j * j;\n }\n }\n return x / pow(${bias} + ${alpha} * square_sum, ${beta});\n }`;\n return {\n ...lrnProgramMetadata,\n cacheHint: attributes.cacheKey,\n output: {dims: inputs[0].dims, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource,\n };\n}\n\nexport function createLrnProgramInfoLoader(inputs: Tensor[], attributes: LrnAttributes): ProgramInfoLoader {\n return {...lrnProgramMetadata, cacheHint: attributes.cacheKey, get: () => createLrnProgramInfo(inputs, attributes)};\n}\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('LRN requires 1 input.');\n }\n if (inputs[0].dims.length !== 4) {\n throw new Error('currently only support LRN for input with \"NCHW\" format');\n }\n if (inputs[0].type !== 'float32') {\n throw new Error('input should be float type');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {getGlsl, Glsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, TextureType} from '../types';\n\nexport interface PadAttributes extends AttributeWithCacheKey {\n readonly mode: string;\n readonly pads: number[];\n readonly value: number;\n}\n\nconst padProgramMetadata = {\n name: 'Pad',\n inputNames: ['A'],\n inputTypes: [TextureType.unpacked],\n};\n\nexport const padV2: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: PadAttributes): Tensor[] => {\n validateInputsV2(inputs);\n const output = inferenceHandler.run(\n {\n ...padProgramMetadata,\n cacheHint: attributes.cacheKey,\n get: () => createPadProgramInfo(inferenceHandler, inputs[0], attributes)\n },\n inputs);\n return [output];\n };\n\nexport const parsePadAttributesV2: OperatorInitialization = (node: Graph.Node): PadAttributes => {\n const mode = node.attributes.getString('mode', 'constant');\n const value = node.attributes.getFloat('value', 0.0);\n const pads = node.attributes.getInts('pads');\n return createAttributeWithCacheKey({mode, value, pads});\n};\n\nexport const padV11: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], mode: string): Tensor[] => {\n validateInputsV11(inputs);\n const attrubutes = generatePadAttributesFromInputs(inferenceHandler, inputs, mode);\n return padV2(inferenceHandler, [inputs[0]], attrubutes);\n };\n\nexport const parsePadAttributesV11: OperatorInitialization = (node: Graph.Node): string =>\n node.attributes.getString('mode', 'constant');\n\nconst generatePadAttributesFromInputs =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], mode: string): PadAttributes => {\n if (!inferenceHandler.session.isInitializer(inputs[1].dataId) ||\n (inputs.length >= 3 && !inferenceHandler.session.isInitializer(inputs[2].dataId))) {\n throw new Error('dynamic pad attributes are not allowed');\n }\n\n const pads = Array.from(inputs[1].integerData);\n const value = (inputs.length >= 3) ? inputs[2].floatData[0] : 0.0;\n\n return createAttributeWithCacheKey({mode, pads, value});\n };\n\nconst createPadProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, input: Tensor, attributes: PadAttributes): ProgramInfo => {\n const outputShape = ShapeUtil.padShape(input.dims.slice(), attributes.pads);\n const rank = outputShape.length;\n const padFunction = getPadFunction(inferenceHandler, input, attributes);\n const shaderSource = `\n ${padFunction}\n float process(int[${rank}] indices) {\n return padA(indices);\n }`;\n return {\n name: 'Pad',\n inputNames: ['A'],\n inputTypes: [TextureType.unpacked],\n output: {dims: outputShape, type: input.type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst validateInputsV2 = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Pad requires 1 input');\n }\n if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n throw new Error('Invalid input type.');\n }\n};\n\nconst validateInputsV11 = (inputs: Tensor[]): void => {\n if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n throw new Error('Pad requires 2 or 3 inputs');\n }\n if (inputs[1].type !== 'int32') {\n throw new Error('Invalid input type.');\n }\n if (inputs.length >= 3 && inputs[2].type === 'string') {\n throw new Error('Invalid input type.');\n }\n};\n\nconst getPadFunction = (inferenceHandler: WebGLInferenceHandler, input: Tensor, attributes: PadAttributes): string => {\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const [width, height] = inferenceHandler.calculateTextureWidthAndHeight(input.dims, TextureType.unpacked);\n const strides = ShapeUtil.computeStrides(input.dims);\n\n switch (attributes.mode) {\n case 'constant':\n return getPadConstant(glsl, input.dims, strides, width, height, attributes.pads, attributes.value);\n case 'reflect':\n return getPadReflect(glsl, input.dims, strides, width, height, attributes.pads);\n case 'edge':\n return getPadEdge(glsl, input.dims, strides, width, height, attributes.pads);\n default:\n throw new Error('Invalid mode');\n }\n};\n\nconst getPadConstant =\n (glsl: Glsl, shape: readonly number[], strides: readonly number[], width: number, height: number, pads: number[],\n value: number): string => {\n const rank = shape.length;\n let block = '';\n for (let i = rank - 1; i >= 0; --i) {\n block += `\n k = m[${i}] - ${pads[i]};\n if (k < 0) return constant;\n if (k >= ${shape[i]}) return constant;\n offset += k * ${strides[i]};\n `;\n }\n return `\n float padA(int m[${rank}]) {\n const float constant = float(${value});\n int offset = 0;\n int k = 0;\n ${block}\n vec2 coords = offsetToCoords(offset, ${width}, ${height});\n float value = getColorAsFloat(${glsl.texture2D}(A, coords));\n return value;\n }\n `;\n };\n\nconst getPadReflect =\n (glsl: Glsl, shape: readonly number[], strides: readonly number[], width: number, height: number, pads: number[]):\n string => {\n const rank = shape.length;\n\n let block = '';\n for (let i = rank - 1; i >= 0; --i) {\n block += `\n k = m[${i}] - ${pads[i]};\n if (k < 0) { k = -k; }\n {\n const int _2n_1 = ${2 * (shape[i] - 1)};\n k = int( mod( float(k), float(_2n_1) ) ) ;\n if(k >= ${shape[i]}) { k = _2n_1 - k; }\n }\n offset += k * ${strides[i]};\n `;\n }\n return `\n float padA(int m[${rank}]) {\n int offset = 0;\n int k = 0;\n ${block}\n vec2 coords = offsetToCoords(offset, ${width}, ${height});\n float value = getColorAsFloat(${glsl.texture2D}(A, coords));\n return value;\n }\n `;\n };\n\nconst getPadEdge =\n (glsl: Glsl, shape: readonly number[], strides: readonly number[], width: number, height: number, pads: number[]):\n string => {\n const rank = shape.length;\n\n let block = '';\n for (let i = rank - 1; i >= 0; --i) {\n block += `\n k = m[${i}] - ${pads[i]};\n if (k < 0) k = 0;\n if (k >= ${shape[i]}) k = ${shape[i] - 1};\n offset += k * ${strides[i]};\n `;\n }\n return `\n float padA(int m[${rank}]) {\n int offset = 0;\n int k = 0;\n ${block}\n vec2 coords = offsetToCoords(offset, ${width}, ${height});\n float value = getColorAsFloat(${glsl.texture2D}(A, coords));\n return value;\n }\n `;\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {PoolConvUtil, ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramMetadata, TextureType} from '../types';\n\nexport interface AveragePoolAttributes extends AttributeWithCacheKey {\n readonly autoPad: string;\n readonly ceilMode: number;\n readonly countIncludePad: boolean;\n readonly kernelShape: readonly number[];\n readonly strides: readonly number[];\n readonly pads: readonly number[];\n}\n\nexport const averagePool: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: AveragePoolAttributes): Tensor[] => {\n validateInputs(inputs);\n const metadata =\n {name: 'AveragePool', inputNames: ['X'], inputTypes: [TextureType.unpacked], cacheHint: attributes.cacheKey};\n const output = inferenceHandler.run(\n {...metadata, get: () => createAveragePoolProgramInfo(inputs, metadata, false, attributes)}, inputs);\n return [output];\n };\n\nexport const parseAveragePoolAttributes: OperatorInitialization =\n (node: Graph.Node): AveragePoolAttributes => {\n const autoPad = node.attributes.getString('auto_pad', 'NOTSET');\n const ceilMode = node.attributes.getInt('ceil_mode', 0);\n const countIncludePad = (node.attributes.getInt('count_include_pad', 0) === 0 ? false : true);\n const kernelShape = node.attributes.getInts('kernel_shape');\n const strides = node.attributes.getInts('strides', []);\n const pads = node.attributes.getInts('pads', []);\n\n // TODO: support attribute 'ceil_mode'\n if (ceilMode !== 0) {\n throw new Error('using ceil() in shape computation is not yet supported for AveragePool');\n }\n\n return createAttributeWithCacheKey({autoPad, ceilMode, countIncludePad, kernelShape, strides, pads});\n };\n\nconst createAveragePoolProgramInfo =\n (inputs: Tensor[], metadata: ProgramMetadata, isGlobalOperator: boolean, attributes: AveragePoolAttributes):\n ProgramInfo => {\n const [adjustedAttributes, outputShape] =\n getAdjustedPoolAttributesAndOutputShape(inputs, attributes, isGlobalOperator);\n const kernelSize = ShapeUtil.size(adjustedAttributes.kernelShape);\n const op1 = 'value += _X(x);';\n let op2 = '';\n if (adjustedAttributes.countIncludePad) {\n op2 += `value /= float(${kernelSize});`;\n } else {\n op2 += `value /= float(${kernelSize} - pad);`;\n }\n const poolingCode = generatePoolingCode(inputs[0].dims, adjustedAttributes, op1, op2, '0.0');\n const shaderSource = `\n ${poolingCode}\n `;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nexport const globalAveragePool: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: AveragePoolAttributes): Tensor[] => {\n validateInputs(inputs);\n const metadata = {\n name: 'GlobalAveragePool',\n inputNames: ['X'],\n inputTypes: [TextureType.unpacked],\n cacheHint: `${attributes.countIncludePad}`\n };\n const output = inferenceHandler.run(\n {...metadata, get: () => createAveragePoolProgramInfo(inputs, metadata, true, attributes)}, inputs);\n return [output];\n };\n\nexport const parseGlobalAveragePoolAttributes: OperatorInitialization =\n (node: Graph.Node): AveragePoolAttributes => {\n const countIncludePad = (node.attributes.getInt('count_include_pad', 0) === 0 ? false : true);\n return createAttributeWithCacheKey(\n {autoPad: '', ceilMode: 0, countIncludePad, kernelShape: [], strides: [], pads: []});\n };\n\nexport interface MaxPoolAttributes extends AveragePoolAttributes {\n readonly storageOrder: number;\n readonly dilations: number[];\n}\n\nexport const maxPool: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: MaxPoolAttributes): Tensor[] => {\n validateInputs(inputs);\n const metadata =\n {name: 'MaxPool', inputNames: ['X'], inputTypes: [TextureType.unpacked], cacheHint: attributes.cacheKey};\n const output = inferenceHandler.run(\n {...metadata, get: () => createMaxPoolProgramInfo(inputs, metadata, false, attributes)}, inputs);\n return [output];\n };\n\nexport const parseMaxPoolAttributes: OperatorInitialization =\n (node: Graph.Node): MaxPoolAttributes => {\n const autoPad = node.attributes.getString('auto_pad', 'NOTSET');\n const ceilMode = node.attributes.getInt('ceil_mode', 0);\n const kernelShape = node.attributes.getInts('kernel_shape');\n const strides = node.attributes.getInts('strides', []);\n const pads = node.attributes.getInts('pads', []);\n const storageOrder = node.attributes.getInt('storage_order', 0);\n const dilations = node.attributes.getInts('dilations', []);\n\n // TODO: support attribute 'ceil_mode' and 'storage_order'\n if (storageOrder !== 0) {\n throw new Error('column major storage order is not yet supported for MaxPool');\n }\n if (ceilMode !== 0) {\n throw new Error('using ceil() in shape computation is not yet supported for MaxPool');\n }\n\n return createAttributeWithCacheKey(\n {autoPad, ceilMode, countIncludePad: false, kernelShape, strides, pads, storageOrder, dilations});\n };\n\nconst createMaxPoolProgramInfo =\n (inputs: Tensor[], metadata: ProgramMetadata, isGlobalOperator: boolean, attributes: MaxPoolAttributes):\n ProgramInfo => {\n const [adjustedAttributes, outputShape] =\n getAdjustedPoolAttributesAndOutputShape(inputs, attributes, isGlobalOperator);\n const op1 = `\n value = max(_X(x), value);\n `;\n const op2 = '';\n const poolingCode = generatePoolingCode(inputs[0].dims, adjustedAttributes, op1, op2, '-1e5');\n const shaderSource = `\n ${poolingCode}\n `;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst getAdjustedPoolAttributesAndOutputShape =\n (inputs: Tensor[], attributes: AveragePoolAttributes|MaxPoolAttributes, isGlobalOperator: boolean):\n [AveragePoolAttributes|MaxPoolAttributes, number[]] => {\n const inputShape = inputs[0].dims.slice();\n const hasDilations = Object.hasOwnProperty.call(attributes, 'dilations');\n const kernelShape = attributes.kernelShape.slice();\n const strides = attributes.strides.slice();\n const dilations: number[] = hasDilations ? (attributes as MaxPoolAttributes).dilations.slice() : [];\n const pads = attributes.pads.slice();\n PoolConvUtil.adjustPoolAttributes(isGlobalOperator, inputShape, kernelShape, strides, dilations, pads);\n\n const outputShape = PoolConvUtil.computePoolOutputShape(\n isGlobalOperator, inputShape, strides, dilations, kernelShape, pads, attributes.autoPad);\n\n const newAttributes = Object.assign({}, attributes);\n if (hasDilations) {\n Object.assign(newAttributes, {kernelShape, strides, pads, dilations, cacheKey: attributes.cacheKey});\n } else {\n Object.assign(newAttributes, {kernelShape, strides, pads, cacheKey: attributes.cacheKey});\n }\n return [newAttributes, outputShape];\n };\n\nconst globalMaxPoolAttributes = {\n autoPad: '',\n ceilMode: 0,\n countIncludePad: false,\n kernelShape: [],\n strides: [],\n pads: [],\n storageOrder: 0,\n dilations: [],\n cacheKey: ''\n};\n\nconst globalMaxPoolMetadata = {\n name: 'GlobalMaxPool',\n inputNames: ['X'],\n inputTypes: [TextureType.unpacked]\n};\n\nexport const globalMaxPool = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n validateInputs(inputs);\n const output = inferenceHandler.run(\n {\n ...globalMaxPoolMetadata,\n get: () => createMaxPoolProgramInfo(inputs, globalMaxPoolMetadata, true, globalMaxPoolAttributes)\n },\n inputs);\n return [output];\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Pool ops requires 1 input.');\n }\n if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n throw new Error('Invalid input type.');\n }\n};\n\nconst generatePoolingCode =\n (inputDims: readonly number[], attributes: AveragePoolAttributes, op1: string, op2: string, start: string):\n string => {\n const rank = inputDims.length;\n if (attributes.kernelShape.length <= 2) {\n const kw = attributes.kernelShape[attributes.kernelShape.length - 1];\n const sw = attributes.strides[attributes.strides.length - 1];\n const pwStart = attributes.pads[attributes.pads.length / 2 - 1];\n const pwEnd = attributes.pads[attributes.pads.length - 1];\n const dimW = inputDims[rank - 1];\n let codeW = '';\n let codeH = '';\n let codeHEnd = '';\n if (pwStart + pwEnd !== 0) {\n codeW = `\n for (int i = 0; i < ${kw}; i++) {\n x[${rank} - 1] = indices[${rank} - 1] * ${sw} - ${pwStart} + i;\n if (x[${rank} - 1] < 0 || x[${rank} - 1] >= ${dimW}) {\n pad++;\n continue;\n }\n ${op1}\n }`;\n } else {\n codeW = `\n for (int i = 0; i < ${kw}; i++) {\n x[${rank} - 1] = indices[${rank} - 1] * ${sw} - ${pwStart} + i;\n ${op1}\n }`;\n }\n\n if (attributes.kernelShape.length === 2) {\n const kh = attributes.kernelShape[attributes.kernelShape.length - 2];\n const sh = attributes.strides[attributes.strides.length - 2];\n const phStart = attributes.pads[attributes.pads.length / 2 - 2];\n const phEnd = attributes.pads[attributes.pads.length - 2];\n const dimH = inputDims[rank - 2];\n if (phStart + phEnd !== 0) {\n codeH = `\n for (int j = 0; j < ${kh}; j++) {\n x[${rank} - 2] = indices[${rank} - 2] * ${sh} - ${phStart} + j;\n if (x[${rank} - 2] < 0 || x[${rank} - 2] >= ${dimH}) {\n pad+= ${kw};\n continue;\n }\n `;\n } else {\n codeH = `\n for (int j = 0; j < ${kh}; j++) {\n x[${rank} - 2] = indices[${rank} - 2] * ${sh} - ${phStart} + j;\n `;\n }\n codeHEnd = `\n }\n `;\n }\n\n const poolingCode = `\n float process(int indices[${rank}]) {\n int x[${rank}];\n copyVec(indices, x);\n\n float value = ${start};\n int pad = 0;\n ${codeH}\n ${codeW}\n ${codeHEnd}\n ${op2}\n return value;\n }\n `;\n return poolingCode;\n } else {\n const kernelSize = ShapeUtil.size(attributes.kernelShape);\n const kernelStrides = ShapeUtil.computeStrides(attributes.kernelShape);\n const stridesRank = kernelStrides.length;\n const padsRank = attributes.pads.length;\n const offsetToIndicesFunction = offsetToIndices(stridesRank);\n const copyInputDims = copyArray(inputDims, 'inputDims');\n const copyPads = copyArray(attributes.pads, 'pads');\n const copyKernelStrides = copyArray(kernelStrides, 'kernelStrides');\n const copyStrides = copyArray(attributes.strides, 'strides');\n const hasPads = attributes.pads.reduce((sum, cur) => sum + cur);\n let padCode = '';\n if (hasPads) {\n padCode = `\n if (x[j] >= inputDims[j] || x[j] < 0) {\n pad++;\n isPad = true;\n break;\n }\n }\n if (!isPad) {\n ${op1}\n }`;\n } else {\n padCode = `\n }\n ${op1}\n `;\n }\n const poolingCode = `\n ${offsetToIndicesFunction}\n float process(int indices[${rank}]) {\n int x[${rank}];\n copyVec(indices, x);\n int offset[${stridesRank}];\n int pads[${padsRank}];\n int inputDims[${rank}];\n int kernelStrides[${stridesRank}];\n int strides[${stridesRank}];\n ${copyPads}\n ${copyInputDims}\n ${copyStrides}\n ${copyKernelStrides}\n\n float value = ${start};\n int pad = 0;\n bool isPad = false;\n for (int i = 0; i < ${kernelSize}; i++) {\n offsetToIndices(i, kernelStrides, offset);\n isPad = false;\n for (int j = ${rank} - ${stridesRank}; j < ${rank}; j++) {\n x[j] = indices[j] * strides[j - ${rank} + ${stridesRank}]\n + offset[j - ${rank} + ${stridesRank}] - pads[j - 2];\n ${padCode}\n }\n ${op2}\n\n return value;\n }\n `;\n return poolingCode;\n }\n };\n\nconst copyArray = (array: readonly number[], arrayName: string): string => {\n let block = '';\n for (let i = 0; i < array.length; i++) {\n block += `\n ${arrayName}[${i}] = ${array[i]};\n `;\n }\n return block;\n};\n\nconst offsetToIndices = (rank: number): string => `\n void offsetToIndices(int offset, int[${rank}] strides, out int[${rank}] indices) {\n if (${rank} == 0) {\n return;\n }\n for (int i = 0; i < ${rank} - 1; ++i) {\n indices[i] = offset / strides[i];\n offset -= indices[i] * strides[i];\n }\n indices[${rank} - 1] = offset;\n }`;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {NUMBER_TYPES, OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramMetadata, TextureType} from '../types';\n\nexport interface ReduceAttributes extends AttributeWithCacheKey {\n readonly axes: number[];\n readonly keepDims: boolean;\n}\n\n// return [init ops, reduce ops, final ops]\ntype ReduceOp = (inputs: Tensor[], axes: number[]) => string[];\n\nconst reduce =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes, name: string,\n reduceOp: ReduceOp): Tensor[] => {\n validateInputs(inputs);\n\n const reduceProgramMetadata = {\n name,\n inputNames: ['A'],\n inputTypes: [TextureType.unpacked],\n };\n\n const output = inferenceHandler.run(\n {\n ...reduceProgramMetadata,\n cacheHint: attributes.cacheKey,\n get: () =>\n createReduceProgramInfo(inferenceHandler, inputs, attributes, name, reduceOp, reduceProgramMetadata)\n },\n inputs);\n return [output];\n };\n\nexport const parseReduceAttributes: OperatorInitialization = (node: Graph.Node): ReduceAttributes => {\n const axes = node.attributes.getInts('axes', []);\n const keepDims = node.attributes.getInt('keepdims', 1) === 1;\n return createAttributeWithCacheKey({axes, keepDims});\n};\n\nconst createReduceProgramInfo =\n (_handler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes, _name: string, reduceOp: ReduceOp,\n reduceProgramMetadata: ProgramMetadata): ProgramInfo => {\n const outputShape: number[] = [];\n const iRank = inputs[0].dims.length || 1;\n\n const idxCopy = []; // copy output indexes to input indexes\n\n const axes = ShapeUtil.normalizeAxes(attributes.axes, inputs[0].dims.length);\n const ops = reduceOp(inputs, axes);\n let reduceOps = ops[1];\n\n for (let k = 0; k < inputs[0].dims.length; k++) {\n // if this axis is reduced\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n if (attributes.keepDims) {\n outputShape.push(1);\n } // else { remove the axis from outputShape; }\n\n // loop over the d-th axis\n reduceOps = `\n for(int j${k} = 0; j${k} < ${inputs[0].dims[k]}; j${k}++) {\n inputIdx[${k}] = j${k};\n ${reduceOps}\n }`;\n } else {\n idxCopy.push(`inputIdx[${k}] = outputIdx[${outputShape.length}];`);\n\n outputShape.push(inputs[0].dims[k]);\n }\n }\n\n const oRank = outputShape.length || 1;\n\n const shaderSource = `\n float process(int outputIdx[${oRank}]) {\n float value; // final result\n int inputIdx[${iRank}]; // addressing input data\n ${idxCopy.join('\\n')}\n ${ops[0]} // init ops for reduce max/min\n ${reduceOps}\n ${ops[2]} // final computation for reduce mean\n return value;\n }`;\n\n return {\n ...reduceProgramMetadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n // TODO: support Reduce* operators with 2 inputs.\n if (!inputs || inputs.length !== 1) {\n throw new Error('Reduce op requires 1 input.');\n }\n\n if (NUMBER_TYPES.indexOf(inputs[0].type) === -1) {\n throw new Error('Invalid input type.');\n }\n};\n\nexport const reduceSum: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes): Tensor[] => {\n const reduceOp: ReduceOp = (): string[] => ['value = 0.0;', 'value += _A(inputIdx);', ''];\n return reduce(inferenceHandler, inputs, attributes, 'ReduceSum', reduceOp);\n };\n\nexport const reduceMean: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes): Tensor[] => {\n const reduceOp: ReduceOp = (inputs: Tensor[], axes: number[]): string[] => {\n let size = 1.0;\n for (let k = 0; k < inputs[0].dims.length; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n size *= inputs[0].dims[k];\n }\n }\n\n return ['value = 0.0;', 'value += _A(inputIdx);', `value /= ${size}.;`]; // ensure real number with `.`\n };\n return reduce(inferenceHandler, inputs, attributes, 'ReduceMean', reduceOp);\n };\n\nexport const reduceMax: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes): Tensor[] => {\n const reduceOp: ReduceOp = (inputs: Tensor[], axes: number[]): string[] => {\n const idxZero = [];\n for (let k = 0; k < inputs[0].dims.length; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(`inputIdx[${k}] = 0;`); // first element\n }\n }\n\n return [`${idxZero.join('\\n')}\\nvalue = _A(inputIdx);`, 'value = max(value, _A(inputIdx));', ''];\n };\n return reduce(inferenceHandler, inputs, attributes, 'ReduceMax', reduceOp);\n };\n\nexport const reduceMin: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes): Tensor[] => {\n const reduceOp: ReduceOp = (inputs: Tensor[], axes: number[]): string[] => {\n const idxZero = [];\n for (let k = 0; k < inputs[0].dims.length; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(`inputIdx[${k}] = 0;`); // first element\n }\n }\n\n return [`${idxZero.join('\\n')}\\nvalue = _A(inputIdx);`, 'value = min(value, _A(inputIdx));', ''];\n };\n return reduce(inferenceHandler, inputs, attributes, 'ReduceMin', reduceOp);\n };\n\nexport const reduceProd: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes): Tensor[] => {\n const reduceOp: ReduceOp = (): string[] => ['value = 1.0;', 'value *= _A(inputIdx);', ''];\n return reduce(inferenceHandler, inputs, attributes, 'ReduceProd', reduceOp);\n };\n\nexport const reduceLogSum: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes): Tensor[] => {\n const reduceOp: ReduceOp = (): string[] => ['value = 0.0;', 'value += _A(inputIdx);', 'value = log(value);'];\n return reduce(inferenceHandler, inputs, attributes, 'ReduceLogSum', reduceOp);\n };\n\nexport const reduceLogSumSquare: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes): Tensor[] => {\n const reduceOp: ReduceOp = (): string[] => ['float t; value = 0.0;', 't = _A(inputIdx); value += t * t;', ''];\n return reduce(inferenceHandler, inputs, attributes, 'ReduceLogSumSquare', reduceOp);\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nexport const reshape = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n const reshapedDims = ShapeUtil.calculateReshapedDims(inputs[0].dims, inputs[1].integerData);\n if (handler.session.pack) {\n return [handler.reshapePacked(inputs[0], reshapedDims)];\n } else {\n return [handler.reshapeUnpacked(inputs[0], reshapedDims)];\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, TextureType} from '../types';\n\nexport interface UpsampleAttributes extends AttributeWithCacheKey {\n readonly opset: number;\n readonly isResize: boolean;\n readonly mode: string;\n readonly scales: number[];\n readonly extrapolationValue: number;\n readonly coordinateTransformMode: string;\n readonly useExtrapolation: boolean;\n readonly needRoiInput: boolean;\n readonly nearestMode: string;\n readonly cubicCoefficientA: number;\n readonly excludeOutside: boolean;\n readonly useNearest2xOptimization: boolean;\n readonly roiInputIdx: number;\n readonly scalesInputIdx: number;\n readonly sizesInputIdx: number;\n}\n\nconst upsampleProgramMetadata = {\n name: 'Upsample',\n inputNames: ['X'],\n inputTypes: [TextureType.unpacked],\n};\n\nexport const upsample: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: UpsampleAttributes): Tensor[] => {\n validateInputs(inputs, attributes);\n const output = inferenceHandler.run(\n {\n ...upsampleProgramMetadata,\n cacheHint: attributes.cacheKey,\n get: () => createUpsampleProgramInfo(inferenceHandler, inputs, attributes)\n },\n inputs);\n return [output];\n };\n\nexport const parseUpsampleAttributesV7: OperatorInitialization =\n (node: Graph.Node): UpsampleAttributes => parseUpsampleAttributes(node, 7);\n\nexport const parseUpsampleAttributesV9: OperatorInitialization =\n (node: Graph.Node): UpsampleAttributes => parseUpsampleAttributes(node, 9);\n\nexport const parseUpsampleAttributes = (node: Graph.Node, opset: number): UpsampleAttributes => {\n const isResize = (opset >= 10);\n\n // processing node attributes\n const mode = node.attributes.getString('mode', 'nearest');\n if (mode !== 'nearest' && mode !== 'linear' && (opset < 11 || mode !== 'cubic')) {\n throw new Error(`unrecognized mode: ${mode}`);\n }\n\n let scales: number[] = [];\n if (opset < 9) {\n scales = node.attributes.getFloats('scales');\n scalesValidation(scales, mode, isResize);\n }\n\n const extrapolationValue = node.attributes.getFloat('extrapolation_value', 0.0);\n\n const coordinateTransformMode =\n opset > 10 ? node.attributes.getString('coordinate_transformation_mode', 'half_pixel') : 'asymmetric';\n if ([\n 'asymmetric', 'pytorch_half_pixel', 'tf_half_pixel_for_nn', 'align_corners', 'tf_crop_and_resize', 'half_pixel'\n ].indexOf(coordinateTransformMode) === -1) {\n throw new Error(`coordinate_transform_mode '${coordinateTransformMode}' is not supported`);\n }\n const needRoiInput = (coordinateTransformMode === 'tf_crop_and_resize');\n const useExtrapolation = needRoiInput;\n\n const nearestMode =\n (mode === 'nearest' && opset >= 11) ? node.attributes.getString('nearest_mode', 'round_prefer_floor') : '';\n if (['round_prefer_floor', 'round_prefer_ceil', 'floor', 'ceil', ''].indexOf(nearestMode) === -1) {\n throw new Error(`nearest_mode '${nearestMode}' is not supported`);\n }\n\n const cubicCoefficientA = node.attributes.getFloat('cubic_coeff_a', -0.75);\n const excludeOutside = node.attributes.getInt('exclude_outside', 0) !== 0;\n if (excludeOutside && mode !== 'cubic') {\n throw new Error('exclude_outside can be set to 1 only when mode is CUBIC.');\n }\n\n const useNearest2xOptimization =\n (opset < 11) ? true : (mode === 'nearest' && coordinateTransformMode === 'asymmetric' && nearestMode === 'floor');\n\n let roiInputIdx = 0;\n let scalesInputIdx = 0;\n let sizesInputIdx = 0;\n\n if (opset > 10) {\n // handle when roiInput is not given\n if (node.inputs.length > 2) {\n roiInputIdx = 1;\n scalesInputIdx = 2;\n sizesInputIdx = 3;\n } else {\n scalesInputIdx = 1;\n sizesInputIdx = 2;\n }\n } else if (opset === 9) {\n scalesInputIdx = 1;\n }\n\n return createAttributeWithCacheKey({\n opset,\n isResize,\n mode,\n scales,\n extrapolationValue,\n coordinateTransformMode,\n useExtrapolation,\n needRoiInput,\n nearestMode,\n cubicCoefficientA,\n excludeOutside,\n useNearest2xOptimization,\n roiInputIdx,\n scalesInputIdx,\n sizesInputIdx\n });\n};\n\nconst createUpsampleProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: UpsampleAttributes): ProgramInfo => {\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const [inputWidth, inputHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(inputs[0].dims, TextureType.unpacked);\n\n const outputShape = inputs[0].dims.map((dim, i) => Math.floor(dim * attributes.scales[i]));\n const [outputWidth, outputHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(outputShape, TextureType.unpacked);\n const dim = outputShape.length;\n\n const outputPitches = new Array(dim);\n const inputPitches = new Array(dim);\n let precalculatedPitches = `\n int output_pitches[${dim}];\n int input_pitches[${dim}];\n `;\n for (let d = dim - 1; d >= 0; d--) {\n outputPitches[d] = (d === dim - 1) ? 1 : outputPitches[d + 1] * outputShape[d + 1];\n inputPitches[d] = (d === dim - 1) ? 1 : inputPitches[d + 1] * inputs[0].dims[d + 1];\n\n precalculatedPitches += `\n output_pitches[${d}] = ${outputPitches[d]};\n input_pitches[${d}] = ${inputPitches[d]};\n `;\n }\n const getInputFloatFunction = `\n float getInputFloat(int index) {\n vec2 coords = offsetToCoords(index, ${inputWidth}, ${inputHeight});\n float value = getColorAsFloat(${glsl.texture2D}(X, coords));\n return value;\n }\n `;\n\n const shaderSource = attributes.mode === 'nearest' ?\n // nearest\n `\n ${getInputFloatFunction}\n float process(int indices[${dim}]) {\n int input_index = 0;\n int output_index = coordsToOffset(TexCoords, ${outputWidth}, ${outputHeight});\n\n ${precalculatedPitches}\n\n int d, m;\n for (int dim = 0; dim < ${dim}; ++dim) {\n d = output_index / output_pitches[dim];\n m = output_index - d * output_pitches[dim];\n output_index = m;\n\n if (scales[dim] != 1 && d > 0) {\n int d2 = d / scales[dim];\n m = d - d2 * scales[dim];\n d = d2;\n }\n input_index += input_pitches[dim] * d;\n }\n\n return getInputFloat(input_index);\n }` :\n dim === 4 ?\n // bilinear 4D\n `\n ${getInputFloatFunction}\n float process(int indices[4]) {\n int input_index = 0;\n int output_index = coordsToOffset(TexCoords, ${outputWidth}, ${outputHeight});\n\n ${precalculatedPitches}\n\n int m;\n int index_of_dim0, index_of_dim1, index_of_dim2, index_of_dim3;\n index_of_dim0 = output_index / output_pitches[0];\n m = output_index - index_of_dim0 * output_pitches[0];\n index_of_dim1 = m / output_pitches[1];\n m = m - index_of_dim1 * output_pitches[1];\n index_of_dim2 = m / output_pitches[2];\n m = m - index_of_dim2 * output_pitches[2];\n index_of_dim3 = m;\n\n int index_of_input_dim2, index_of_input_dim3, x_offset, y_offset;\n index_of_input_dim2 = index_of_dim2 / scales[2];\n y_offset = index_of_dim2 - index_of_input_dim2 * scales[2];\n index_of_input_dim3 = index_of_dim3 / scales[3];\n x_offset = index_of_dim3 - index_of_input_dim3 * scales[3];\n\n input_index = index_of_dim0 * input_pitches[0] +\n index_of_dim1 * input_pitches[1] +\n index_of_input_dim2 * input_pitches[2] +\n index_of_input_dim3;\n\n float x00 = getInputFloat(input_index);\n float x10, x01, x11;\n\n bool end_of_dim2 = false;\n if (index_of_input_dim2 == (${inputs[0].dims[2]} - 1)) {\n // It's the end in dimension 2\n x01 = x00;\n end_of_dim2 = true;\n } else {\n x01 = getInputFloat(input_index + input_pitches[2]);\n }\n\n if (index_of_input_dim3 == (input_pitches[2] - 1)) {\n // It's the end in dimension 3\n x10 = x00;\n x11 = x01;\n }\n else {\n x10 = getInputFloat(input_index + 1);\n x11 = end_of_dim2 ? x10 : getInputFloat(input_index + input_pitches[2] + 1);\n }\n\n float y0 = x00 + float(y_offset) * (x01 - x00) / float(scales[2]);\n float y1 = x10 + float(y_offset) * (x11 - x10) / float(scales[2]);\n return y0 + float(x_offset) * (y1 - y0) / float(scales[3]);\n }` :\n // bilinear 2D\n `\n ${getInputFloatFunction}\n float process(int indices[2]) {\n int input_index = 0;\n int output_index = coordsToOffset(TexCoords, ${outputWidth}, ${outputHeight});\n\n ${precalculatedPitches}\n\n int m;\n int index_of_dim0, index_of_dim1;\n index_of_dim0 = output_index / output_pitches[0];\n m = output_index - index_of_dim0 * output_pitches[0];\n index_of_dim1 = m;\n\n int index_of_input_dim0, index_of_input_dim1, x_offset, y_offset;\n index_of_input_dim0 = index_of_dim0 / scales[0];\n y_offset = index_of_dim0 - index_of_input_dim0 * scales[0];\n index_of_input_dim1 = index_of_dim1 / scales[1];\n x_offset = index_of_dim1 - index_of_input_dim1 * scales[1];\n\n input_index = index_of_input_dim0 * input_pitches[0] + index_of_input_dim1;\n\n float x00 = getInputFloat(input_index);\n float x10, x01, x11;\n\n bool end_of_dim0 = false;\n if (index_of_input_dim0 == (${inputs[0].dims[0]} - 1)) {\n // It's the end in dimension 0\n x01 = x00;\n end_of_dim0 = true;\n } else {\n x01 = getInputFloat(input_index + input_pitches[0]);\n }\n\n if (index_of_input_dim1 == (input_pitches[0] - 1)) {\n // It's the end in dimension 1\n x10 = x00;\n x11 = x01;\n }\n else {\n x10 = getInputFloat(input_index + 1);\n x11 = end_of_dim0 ? x10 : getInputFloat(input_index + input_pitches[0] + 1);\n }\n\n float y0 = x00 + float(y_offset) * (x01 - x00) / float(scales[0]);\n float y1 = x10 + float(y_offset) * (x11 - x10) / float(scales[0]);\n return y0 + float(x_offset) * (y1 - y0) / float(scales[1]);\n }`;\n return {\n ...upsampleProgramMetadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource,\n variables: [{\n name: 'scales',\n type: 'int',\n arrayLength: attributes.scales.length,\n data: attributes.scales.map(x => Math.ceil(x))\n }]\n };\n };\n\nexport const validateInputs = (inputs: Tensor[], attribute: UpsampleAttributes): void => {\n if (!inputs || (attribute.opset < 9 && inputs.length !== 1) ||\n (attribute.opset >= 9 && attribute.opset < 11 && inputs.length !== 2) ||\n (attribute.opset >= 11 && inputs.length < 2)) {\n throw new Error('invalid inputs.');\n }\n\n if (attribute.scales.length > 0 && inputs[0].dims.length !== attribute.scales.length) {\n throw new Error('Invalid input shape.');\n }\n\n if (inputs[0].type === 'string') {\n throw new Error('Invalid input tensor types.');\n }\n};\n\nexport const scalesValidation = (scales: number[], mode: string, isResize: boolean): void => {\n if (!isResize) {\n for (const scale of scales) {\n if (scale < 1) {\n throw new Error('Scale value should be greater than or equal to 1.');\n }\n }\n } else {\n for (const scale of scales) {\n if (scale <= 0) {\n throw new Error('Scale value should be greater than 0.');\n }\n }\n }\n if (mode === 'linear' || mode === 'cubic') {\n if (scales.length !== 2 && (scales.length !== 4 || scales[0] !== 1 || scales[1] !== 1)) {\n throw new Error(`'Linear' mode and 'Cubic' mode only support 2-D inputs ('Bilinear', 'Bicubic') \\\n or 4-D inputs with the corresponding outermost 2 scale values being 1 \\\n in the ${isResize ? 'Resize' : 'Upsample'} opeartor.`);\n }\n }\n};", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, TextureType} from '../types';\nimport {getCoordsDataType} from '../utils';\n\nimport {unpackFromChannel} from './packing-utils';\nimport {parseUpsampleAttributes, scalesValidation, UpsampleAttributes, validateInputs} from './upsample';\n\nconst resizeProgramMetadata = {\n name: 'Resize',\n inputNames: ['A'],\n inputTypes: [TextureType.packed]\n};\n\nexport const resize: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: UpsampleAttributes): Tensor[] => {\n validateInputs(inputs, attributes);\n const output = inferenceHandler.run(\n {\n ...resizeProgramMetadata,\n cacheHint: attributes.cacheKey,\n get: () => createPackedResizeProgramInfo(inferenceHandler, inputs, attributes)\n },\n inputs);\n return [output];\n };\n\nexport const parseResizeAttributesV10: OperatorInitialization =\n (node: Graph.Node): UpsampleAttributes => parseUpsampleAttributes(node, 10);\n\nexport const parseResizeAttributesV11: OperatorInitialization =\n (node: Graph.Node): UpsampleAttributes => parseUpsampleAttributes(node, 11);\n\nconst createPackedResizeProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: UpsampleAttributes): ProgramInfo => {\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const [scales, outputShape] = prepareInputs(inputs, attributes);\n\n const isSame =\n scales.every((s: number) => s === 1) && attributes.coordinateTransformMode !== 'tf_crop_and_resize';\n if (isSame) {\n return {\n ...resizeProgramMetadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.packed},\n hasMain: true,\n shaderSource: `void main() {\n vec4 v = ${glsl.texture2D}(X, TexCoords);\n ${glsl.output} = v;\n }`\n };\n }\n\n const dim = outputShape.length;\n if (dim < 2) {\n throw new Error(`output dimension should be at least 2, but got ${dim}`);\n }\n\n const outputHeight = outputShape[dim - 2];\n const outputWidth = outputShape[dim - 1];\n\n const inputShape = inputs[0].dims;\n if (dim !== inputShape.length) {\n throw new Error(`output dimension should match input ${inputShape.length}, but got ${dim}`);\n }\n const inputHeight = inputShape[dim - 2];\n const inputWidth = inputShape[dim - 1];\n\n const scalesHeight = scales[dim - 2];\n const scalesWidth = scales[dim - 1];\n\n let getSourceFracIndex = '';\n\n if (attributes.mode !== 'linear') {\n // TODO: support other modes\n throw new Error(`resize (packed) does not support mode: '${attributes.mode}'`);\n }\n switch (attributes.coordinateTransformMode) {\n case 'asymmetric':\n getSourceFracIndex = `\n vec4 getSourceFracIndex(ivec4 coords) {\n return vec4(coords) / scaleWHWH;\n }\n `;\n break;\n case 'half_pixel':\n getSourceFracIndex = `\n vec4 getSourceFracIndex(ivec4 coords) {\n return (vec4(coords) + 0.5) / scaleWHWH - 0.5;\n }\n `;\n break;\n case 'pytorch_half_pixel':\n getSourceFracIndex = `\n vec4 getSourceFracIndex(ivec4 coords) {\n vec4 fcoords = vec4(coords);\n return vec4(\n ${outputWidth}.0 > 1.0 ? (fcoords.x + 0.5) / scaleWHWH.x - 0.5 : 0.0,\n ${outputHeight}.0 > 1.0 ? (fcoords.y + 0.5) / scaleWHWH.y - 0.5 : 0.0,\n ${outputWidth}.0 > 1.0 ? (fcoords.z + 0.5) / scaleWHWH.z - 0.5 : 0.0,\n ${outputHeight}.0 > 1.0 ? (fcoords.w + 0.5) / scaleWHWH.w - 0.5 : 0.0\n );\n }\n `;\n break;\n case 'align_corners':\n getSourceFracIndex = `\n vec4 getSourceFracIndex(ivec4 coords) {\n vec4 resized = vec4(${outputWidth}.0 - 1.0, ${outputHeight}.0 - 1.0, ${outputWidth}.0 - 1.0,\n ${outputHeight}.0 - 1.0);\n vec4 original = vec4(${inputWidth}.0 - 1.0, ${inputHeight}.0 - 1.0, ${inputWidth}.0 - 1.0,\n ${inputHeight}.0 - 1.0);\n vec4 new_scale = original / resized;\n return vec4(coords) * new_scale;\n }\n `;\n break;\n default:\n // TODO:supporting other coordinateTransformModes\n throw new Error(`resize (packed) does not support coordinateTransformMode: \\\n '${attributes.coordinateTransformMode}'`);\n }\n\n const coordsDataType = getCoordsDataType(dim);\n const unpackChannel = unpackFromChannel();\n const shaderSource = `\n const vec2 inputWH = vec2(${inputHeight}.0, ${inputWidth}.0);\n const vec4 scaleWHWH = vec4(float(${scalesHeight}), float(${scalesWidth}), float(${scalesHeight}), float(${\n scalesWidth}));\n ${unpackChannel}\n ${getSourceFracIndex}\n float getAValue(int x10, int r, int c, int d) {\n return getChannel(getA(x10, r, c, d), vec2(c, d));\n }\n void main() {\n ${coordsDataType} rc = getOutputCoords();\n\n int batch = rc[0];\n int depth = rc[1];\n\n // retrieve the 4 coordinates that is used in the 4 packed output values.\n ivec4 coords = ivec4(rc.wz, rc.w + 1, rc.z + 1);\n\n // calculate the source index in fraction\n vec4 sourceFrac = getSourceFracIndex(coords);\n\n // get the lower and upper bound of the 4 values that will be packed into one texel.\n ivec4 x00 = ivec4(max(sourceFrac.xy, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.xy)));\n ivec4 x01 = ivec4(max(sourceFrac.xw, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.xw)));\n ivec4 x10 = ivec4(max(sourceFrac.zy, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.zy)));\n ivec4 x11 = ivec4(max(sourceFrac.zw, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.zw)));\n\n bool hasNextRow = rc.w < ${outputHeight - 1};\n bool hasNextCol = rc.z < ${outputWidth - 1};\n\n // pack x00, x01, x10, x11's top-left corner into one vec4 structure\n vec4 topLeft = vec4(\n getAValue(batch, depth, x00.x, x00.y),\n hasNextCol ? getAValue(batch, depth, x01.x, x01.y) : 0.0,\n hasNextRow ? getAValue(batch, depth, x10.x, x10.y) : 0.0,\n (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.x, x11.y) : 0.0);\n\n // pack x00, x01, x10, x11's top-right corner into one vec4 structure\n vec4 topRight = vec4(\n getAValue(batch, depth, x00.x, x00.w),\n hasNextCol ? getAValue(batch, depth, x01.x, x01.w) : 0.0,\n hasNextRow ? getAValue(batch, depth, x10.x, x10.w) : 0.0,\n (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.x, x11.w) : 0.0);\n\n // pack x00, x01, x10, x11's bottom-left corner into one vec4 structure\n vec4 bottomLeft = vec4(\n getAValue(batch, depth, x00.z, x00.y),\n hasNextCol ? getAValue(batch, depth, x01.z, x01.y) : 0.0,\n hasNextRow ? getAValue(batch, depth, x10.z, x10.y) : 0.0,\n (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.z, x11.y) : 0.0);\n\n // pack x00, x01, x10, x11's bottom-right corner into one vec4 structure\n vec4 bottomRight = vec4(\n getAValue(batch, depth, x00.z, x00.w),\n hasNextCol ? getAValue(batch, depth, x01.z, x01.w) : 0.0,\n hasNextRow ? getAValue(batch, depth, x10.z, x10.w) : 0.0,\n (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.z, x11.w) : 0.0);\n\n // calculate the interpolation fraction on u and v direction\n vec4 frac = vec4(sourceFrac) - floor(sourceFrac);\n vec4 clampFrac = clamp(frac, vec4(0.0), vec4(1.0));\n\n vec4 top = mix(topLeft, topRight, clampFrac.ywyw);\n vec4 bottom = mix(bottomLeft, bottomRight, clampFrac.ywyw);\n vec4 newValue = mix(top, bottom, clampFrac.xxzz);\n\n ${glsl.output} = vec4(newValue);\n }\n `;\n return {\n ...resizeProgramMetadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.packed},\n hasMain: true,\n shaderSource\n };\n };\n\n\nconst prepareInputs = (inputs: Tensor[], attributes: UpsampleAttributes): [readonly number[], readonly number[]] => {\n const x = inputs[0];\n const xDims = x.dims;\n\n let scales = attributes.scales;\n let outputSizes: number[]|undefined;\n if (scales.length === 0) {\n const scalesTensor = inputs[attributes.scalesInputIdx];\n if (scalesTensor && scalesTensor.size !== 0) {\n if (inputs[attributes.sizesInputIdx]) {\n throw new Error('Only one of scales or sizes must be provided as input.');\n }\n scales = parseScalesData(scalesTensor, attributes.mode, attributes.isResize);\n } else {\n const sizesTensor = inputs[attributes.sizesInputIdx];\n if (!sizesTensor || sizesTensor.size === 0) {\n throw new Error('Either scales or sizes MUST be provided as input.');\n }\n\n outputSizes = Array.from(sizesTensor.integerData);\n scales = parseScalesDataFromOutputSize(outputSizes, xDims, attributes.mode, attributes.isResize);\n }\n } else {\n if (inputs[attributes.sizesInputIdx]) {\n throw new Error('Only one of scales or sizes must be provided as input.');\n }\n }\n\n const yDims = outputSizes || (xDims.map((dim, i) => Math.floor(dim * scales[i])));\n\n return [scales, yDims];\n};\n\nconst parseScalesData = (scale: Tensor, mode: string, isResize: boolean): number[] => {\n const scales = Array.from(scale.floatData);\n scalesValidation(scales, mode, isResize);\n return scales;\n};\n\nconst parseScalesDataFromOutputSize =\n (yDims: readonly number[], xDims: readonly number[], mode: string, isResize: boolean): number[] => {\n const length = xDims.length;\n const scales = new Array(length);\n\n for (let i = 0, end = length; i < end; i++) {\n if (xDims[i] === 0) {\n if (yDims[i] !== 0) {\n throw new Error('Input dim is zero but required output dim is non-zero.');\n }\n scales[i] = 1;\n } else {\n scales[i] = yDims[i] / xDims[i];\n }\n }\n scalesValidation(scales, mode, isResize);\n return scales;\n };\n\n// roi data is not used yet. but leave here for future usage.\n// const getRoi = (inputs: Tensor[], attributes: UpsampleAttributes) : number[] => {\n// let roi: number[] = [];\n// if (attributes.needRoiInput) {\n// if (attributes.roiInputIdx <= 0) {\n// throw new Error('Invalid roi input index.');\n// }\n// const roiTensor = inputs[attributes.roiInputIdx];\n// roi = roiTensor.size > 0 ? Array.from(roiTensor.floatData) : [];\n// } else {\n// roi = new Array(inputs[0].dims.length * 2).fill(0);\n// }\n// return roi;\n// };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nexport const shape = (_inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n validateInputs(inputs);\n return [new Tensor([inputs[0].dims.length], 'int32', undefined, undefined, new Int32Array(inputs[0].dims))];\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Shape requires 1 input.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {NUMBER_TYPES, OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, TextureType} from '../types';\n\nexport interface SliceAttributes extends AttributeWithCacheKey {\n readonly axes: number[];\n readonly ends: number[];\n readonly starts: number[];\n}\n\nconst sliceProgramMetadata = {\n name: 'Slice',\n inputNames: ['A'],\n inputTypes: [TextureType.unpacked]\n};\n\nexport const slice: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: SliceAttributes): Tensor[] => {\n validateInputs(inputs);\n const output = inferenceHandler.run(\n {\n ...sliceProgramMetadata,\n cacheHint: attributes.cacheKey,\n get: () => createSliceProgramInfo(inferenceHandler, inputs[0], attributes)\n },\n inputs);\n return [output];\n };\n\nexport const parseSliceAttributes: OperatorInitialization = (node: Graph.Node): SliceAttributes => {\n const starts = node.attributes.getInts('starts');\n const ends = node.attributes.getInts('ends');\n const axes = node.attributes.getInts('axes', []);\n return createAttributeWithCacheKey({starts, ends, axes});\n};\n\nconst createSliceProgramInfo =\n (_inferenceHandler: WebGLInferenceHandler, input: Tensor, attributes: SliceAttributes): ProgramInfo => {\n const axes = (attributes.axes.length === 0) ? input.dims.slice(0).map((_val, i) => i) : attributes.axes;\n const normalizedAxes = ShapeUtil.normalizeAxes(axes, input.dims.length);\n const starts = attributes.starts.map((start, i) => {\n if (start > input.dims[normalizedAxes[i]] - 1) {\n return input.dims[normalizedAxes[i]];\n }\n return ShapeUtil.normalizeAxis(start, input.dims[normalizedAxes[i]]);\n });\n const ends = attributes.ends.map((end, i) => {\n if (end > input.dims[normalizedAxes[i]] - 1) {\n return input.dims[normalizedAxes[i]];\n }\n return ShapeUtil.normalizeAxis(end, input.dims[normalizedAxes[i]]);\n });\n\n const outputShape = input.dims.slice();\n\n const sliceOps: string[] = [];\n for (let i = 0; i < normalizedAxes.length; i++) {\n outputShape[normalizedAxes[i]] = ends[i] - starts[i];\n if (starts[i] > 0) {\n sliceOps.push(`outputIdx[${normalizedAxes[i]}] += ${starts[i]};`);\n } // else { sliceOps.push(`outputIdx[${normalizedAxes[i]}] += 0;`); }\n }\n\n const rank = outputShape.length;\n const shaderSource = `\n float process(int outputIdx[${rank}]) {\n ${sliceOps.join('\\n ')}\n return _A(outputIdx);\n }`;\n return {\n ...sliceProgramMetadata,\n output: {dims: outputShape, type: input.type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Slice requires 1 input.');\n }\n if (NUMBER_TYPES.indexOf(inputs[0].type) === -1) {\n throw new Error('Invalid input type.');\n }\n};\n\nexport const sliceV10 = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n validateInputsV10(inputs);\n const attributes = generateSliceAttributesFromInputs(inferenceHandler, inputs);\n const output = inferenceHandler.run(\n {\n ...sliceProgramMetadata,\n cacheHint: attributes.cacheKey,\n get: () => createSliceProgramInfo(inferenceHandler, inputs[0], attributes)\n },\n [inputs[0]]);\n return [output];\n};\n\nconst generateSliceAttributesFromInputs =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): SliceAttributes => {\n if (!inferenceHandler.session.isInitializer(inputs[1].dataId) ||\n !inferenceHandler.session.isInitializer(inputs[2].dataId) ||\n (inputs.length >= 4 && !inferenceHandler.session.isInitializer(inputs[3].dataId)) ||\n (inputs.length >= 5 && !inferenceHandler.session.isInitializer(inputs[4].dataId))) {\n throw new Error('dynamic slice attributes are not allowed');\n }\n\n if (inputs.length >= 5 && inputs[4].integerData.some((i: number) => i !== 1)) {\n throw new Error('currently non-1 steps is not supported for Slice');\n }\n\n const starts = Array.from(inputs[1].integerData);\n const ends = Array.from(inputs[2].integerData);\n const axes = inputs.length >= 4 ? Array.from(inputs[3].integerData) : [];\n const cacheKey = `${axes};${starts};${ends}`;\n return {starts, ends, axes, cacheKey};\n };\n\nconst validateInputsV10 = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length < 3 || inputs.length > 5) {\n throw new Error('Invalid input number.');\n }\n if (inputs[1].type !== 'int32' || inputs[1].dims.length !== 1) {\n throw new Error('Invalid input type.');\n }\n if (inputs[2].type !== 'int32' || inputs[2].dims.length !== 1) {\n throw new Error('Invalid input type.');\n }\n if (inputs.length >= 4 && (inputs[3].type !== 'int32' || inputs[3].dims.length !== 1)) {\n throw new Error('Invalid input type.');\n }\n if (inputs.length >= 5 && (inputs[4].type !== 'int32' || inputs[4].dims.length !== 1)) {\n throw new Error('Invalid input type.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, TextureType} from '../types';\n\nimport {transpose, TransposeAttributes} from './transpose';\n\nexport interface SoftmaxAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n}\n\nconst softmaxComputeMaxProgramMetadata = {\n name: 'SoftmaxComputeMax',\n inputNames: ['A'],\n inputTypes: [TextureType.unpacked],\n};\n\nconst softmaxComputeScaleProgramMetadata = {\n name: 'SoftmaxComputeScale',\n inputNames: ['A', 'Max'],\n inputTypes: [TextureType.unpacked, TextureType.unpacked],\n};\n\nconst softmaxProgramMetadata = {\n name: 'SoftMax',\n inputNames: ['A', 'Max', 'Norm'],\n inputTypes: [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked],\n};\n\nexport const softmax: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: SoftmaxAttributes): Tensor[] => {\n validateInputs(inputs);\n\n const inputShape = inputs[0].dims.slice();\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputShape.length);\n const logicalRowCount = ShapeUtil.sizeToDimension(inputShape, axis);\n const featureCount = ShapeUtil.sizeFromDimension(inputShape, axis);\n\n const output = computeSoftmax(inferenceHandler, inputs, attributes, logicalRowCount, featureCount);\n return output;\n };\n\nexport const parseSoftmaxAttributes: OperatorInitialization =\n (node: Graph.Node): SoftmaxAttributes => createAttributeWithCacheKey({axis: node.attributes.getInt('axis', 1)});\n\nexport const parseSoftmaxAttributesV13: OperatorInitialization =\n (node: Graph.Node): SoftmaxAttributes => createAttributeWithCacheKey({axis: node.attributes.getInt('axis', -1)});\n\n// The \"semantic\" meaning of axis has changed in opset-13.\n// Please compare: https://github.com/onnx/onnx/blob/main/docs/Operators.md#Softmax\n// with https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Softmax-11 for detailed explanations\n// To account for the opset-13 behavior, our plan will be to transpose the \"axis\" dim to the innermost dim\n// and perform softmax and then reverse the transpose. We can skip the transposing aspect if the axis is already\n// the innermost dim\nexport const softmaxV13: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: SoftmaxAttributes): Tensor[] => {\n validateInputs(inputs);\n\n const inputShape = inputs[0].dims.slice();\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputShape.length);\n const rank = inputShape.length;\n\n const isTransposeRequired = (axis !== rank - 1) ? true : false;\n const transposedInputShape: number[] = [];\n let perm: number[] = [];\n let transposedInputs: Tensor[] = [];\n let transposeAttribute: TransposeAttributes;\n\n if (isTransposeRequired) {\n perm = Array.from({length: rank}).map((_, i) => i);\n\n // swap the innermost dim with the dim corresponding to axis\n perm[axis] = rank - 1;\n perm[rank - 1] = axis;\n\n perm.map(p => transposedInputShape.push(inputShape[p]));\n\n transposeAttribute = createAttributeWithCacheKey({perm});\n transposedInputs = transpose(inferenceHandler, inputs, transposeAttribute);\n }\n\n const logicalRowCount = isTransposeRequired ? ShapeUtil.sizeToDimension(transposedInputShape, rank - 1) :\n ShapeUtil.sizeToDimension(inputShape, rank - 1);\n const featureCount = isTransposeRequired ? ShapeUtil.sizeFromDimension(transposedInputShape, rank - 1) :\n ShapeUtil.sizeFromDimension(inputShape, rank - 1);\n\n const output = computeSoftmax(\n inferenceHandler, isTransposeRequired ? transposedInputs : inputs, attributes, logicalRowCount, featureCount);\n\n if (isTransposeRequired) {\n const reversedOutput = transpose(inferenceHandler, output, transposeAttribute!);\n return reversedOutput;\n } else {\n return output;\n }\n };\n\nconst computeSoftmax =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: SoftmaxAttributes, logicalRowCount: number,\n featureCount: number): Tensor[] => {\n const computeMaxProgramInfo =\n createComputeMaxProgramInfo(inferenceHandler, inputs[0], logicalRowCount, featureCount, [logicalRowCount]);\n const max = inferenceHandler.run(\n {...softmaxComputeMaxProgramMetadata, cacheHint: attributes.cacheKey, get: () => computeMaxProgramInfo},\n inputs);\n\n const computeScaleProgramInfo = createComputScaleProgramInfo(\n inferenceHandler, inputs[0], logicalRowCount, featureCount, computeMaxProgramInfo.output.dims,\n [logicalRowCount]);\n const scale = inferenceHandler.run(\n {...softmaxComputeScaleProgramMetadata, cacheHint: attributes.cacheKey, get: () => computeScaleProgramInfo},\n [inputs[0], max]);\n\n const softMaxProgramInfo = createSoftMaxProgramInfo(\n inferenceHandler, inputs[0], logicalRowCount, featureCount, computeMaxProgramInfo.output.dims,\n computeScaleProgramInfo.output.dims);\n const output = inferenceHandler.run(\n {...softmaxProgramMetadata, cacheHint: attributes.cacheKey, get: () => softMaxProgramInfo},\n [inputs[0], max, scale]);\n return [output];\n };\n\n/**\n * Create a texture that contains the maximum value of each of the 'N' rows\n */\nconst createComputeMaxProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, input: Tensor, logicalRowCount: number, featureCount: number,\n outputShape: number[]): ProgramInfo => {\n const [textureWidth, textureHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(input.dims, TextureType.unpacked);\n const rank = outputShape.length;\n\n if (logicalRowCount < 1 || featureCount < 1) {\n throw new Error('Logical row count N and feature count D must be greater than or equal to 1');\n }\n\n if (outputShape.length !== 1) {\n throw new Error('Dimensionality of the output should be 1');\n }\n\n if (outputShape[0] !== logicalRowCount) {\n throw new Error('Shape of the output should be equal to logical row count');\n }\n\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const shaderSource = `\n float process(int[${rank}] indices) {\n int logical_row_start_offset = indices[0] * ${featureCount};\n\n float max = getColorAsFloat(${glsl.texture2D}(A, offsetToCoords(logical_row_start_offset, ${textureWidth},\n ${textureHeight} )));\n for(int i=1; i<${featureCount}; ++i)\n {\n float current = getColorAsFloat(${glsl.texture2D}(A, offsetToCoords(logical_row_start_offset + i,\n ${textureWidth}, ${textureHeight})));\n if(current > max)\n max = current;\n }\n\n return max;\n }`;\n return {\n ...softmaxComputeMaxProgramMetadata,\n output: {dims: outputShape, type: input.type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\n/**\n * Create a texture that contains the normalization factor for each of the 'N' rows\n */\nconst createComputScaleProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, input: Tensor, logicalRowCount: number, featureCount: number,\n maxElementPerLogicalRow: readonly number[], outputShape: number[]): ProgramInfo => {\n const [textureWidth, textureHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(input.dims, TextureType.unpacked);\n const rank = outputShape.length;\n\n if (logicalRowCount < 1 || featureCount < 1) {\n throw new Error('Logical row count N and feature count D must be greater than or equal to 1');\n }\n\n if (outputShape.length !== 1) {\n throw new Error('Dimensionality of the output should be 1');\n }\n\n if (outputShape[0] !== logicalRowCount) {\n throw new Error('Shape of the output should be equal to logical row count');\n }\n\n if (maxElementPerLogicalRow.length !== 1) {\n throw new Error('Dimensionality of the intermediate results should be 1');\n }\n\n if (maxElementPerLogicalRow[0] !== logicalRowCount) {\n throw new Error('Shape of the intermediate results should be equal to logical row count');\n }\n\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const shaderSource = `\n float process(int[${rank}] indices) {\n int logical_row_start_offset = indices[0] * ${featureCount};\n\n float norm_factor = 0.0;\n float max = _Max(indices);\n for(int i=0; i<${featureCount}; ++i)\n {\n norm_factor += exp(getColorAsFloat(${glsl.texture2D}(A, offsetToCoords(logical_row_start_offset + i,\n ${textureWidth}, ${textureHeight}))) - max);\n }\n\n return norm_factor;\n }`;\n return {\n ...softmaxComputeScaleProgramMetadata,\n output: {dims: outputShape, type: input.type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst createSoftMaxProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, input: Tensor, logicalRowCount: number, featureCount: number,\n maxElementPerLogicalRow: readonly number[], normalizationPerLogicalRow: readonly number[]): ProgramInfo => {\n const [textureWidth, textureHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(input.dims, TextureType.unpacked);\n const rank = input.dims.length;\n\n if (logicalRowCount < 1 || featureCount < 1) {\n throw new Error('Logical row count N and feature count D must be greater than or equal to 1');\n }\n\n if (maxElementPerLogicalRow.length !== 1 || normalizationPerLogicalRow.length !== 1) {\n throw new Error('Dimensionality of the intermediate results should be 1');\n }\n\n if (maxElementPerLogicalRow[0] !== logicalRowCount || normalizationPerLogicalRow[0] !== logicalRowCount) {\n throw new Error('Shape of the intermediate results should be equal to logical row count');\n }\n\n const shaderSource = `\n float process(int[${rank}] indices) {\n\n // get offset of current logical tensor index from the 2-D texture coordinates (TexCoords)\n int offset = coordsToOffset(TexCoords, ${textureWidth}, ${textureHeight});\n\n //determine the logical row for this index\n int logical_row_index[1];\n logical_row_index[0] = offset / ${featureCount};\n\n float norm_factor = _Norm(logical_row_index);\n\n // avoid possible division by 0\n // if norm_facor is 0, all elements are zero\n // if so, return 0\n if(norm_factor == 0.0)\n return 0.0;\n\n return exp(_A(indices) - _Max(logical_row_index)) / norm_factor;\n }`;\n return {\n ...softmaxProgramMetadata,\n output: {dims: input.dims, type: input.type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Softmax requires 1 input.');\n }\n\n if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n throw new Error('Invalid input type');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil, SplitUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, TextureType} from '../types';\n\nexport interface SplitAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n readonly split: number[];\n readonly numOutputs: number;\n}\n\nconst splitProgramMetadata = {\n name: 'Split',\n inputNames: ['A'],\n inputTypes: [TextureType.unpacked],\n};\n\nexport const split: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: SplitAttributes): Tensor[] => {\n validateInputs(inputs);\n\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputs[0].dims.length);\n const count = getProgramCount(inferenceHandler, inputs, axis, attributes);\n const output: Tensor[] = [];\n for (let i = 0; i < count; ++i) {\n output.push(inferenceHandler.run(\n {\n ...splitProgramMetadata,\n cacheHint: `${attributes.cacheKey};${i}`,\n get: () => createSplitProgramInfo(inferenceHandler, inputs[0], attributes, axis, i)\n },\n inputs));\n }\n\n return output;\n };\n\nexport const parseSplitAttributes: OperatorInitialization = (node: Graph.Node): SplitAttributes => {\n const axis = node.attributes.getInt('axis', 0);\n const split = node.attributes.getInts('split', []);\n const numOutputs = node.outputs.length;\n return createAttributeWithCacheKey({axis, split, numOutputs});\n};\n\nconst getProgramCount =\n (_inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], axis: number, attributes: SplitAttributes): number => {\n const [, offsets] = SplitUtil.splitShape(inputs[0].dims, axis, attributes.split, attributes.numOutputs);\n return offsets.length;\n };\n\nconst createSplitProgramInfo =\n (_inferenceHandler: WebGLInferenceHandler, input: Tensor, attributes: SplitAttributes, axis: number, index: number):\n ProgramInfo => {\n const [shapes, offsets] = SplitUtil.splitShape(input.dims, axis, attributes.split, attributes.numOutputs);\n const offset = offsets[index];\n const outputShape = shapes[index];\n const rank = outputShape.length;\n const shaderSource = `\n float process(int indices[${rank}]) {\n indices[${axis}] += ${offset};\n return _A(indices);\n }\n `;\n return {\n ...splitProgramMetadata,\n cacheHint: `${attributes.cacheKey}:${index}`,\n output: {dims: outputShape, type: input.type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Split requires one input.');\n }\n\n if (inputs[0].type !== 'int8' && inputs[0].type !== 'uint8' && inputs[0].type !== 'int16' &&\n inputs[0].type !== 'uint16' && inputs[0].type !== 'int32' && inputs[0].type !== 'uint32' &&\n inputs[0].type !== 'float32' && inputs[0].type !== 'float64' && inputs[0].type !== 'bool') {\n throw new Error('Invalid input type.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nexport const squeeze: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], axes: number[]): Tensor[] => {\n validateInputs(inputs);\n const outputShape = ShapeUtil.squeezeShape(inputs[0].dims, axes);\n const output = inferenceHandler.reshapeUnpacked(inputs[0], outputShape);\n return [output];\n };\n\nexport const squeezeV13 = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n validateInputsV13(inputs);\n return squeeze(inferenceHandler, [inputs[0]], Array.from(inputs[1].integerData));\n};\n\nexport const parseSqueezeAttributes: OperatorInitialization = (node: Graph.Node): number[] =>\n node.attributes.getInts('axes');\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Squeeze requires 1 input.');\n }\n\n if (inputs[0].type === 'string') {\n throw new Error('invalid input tensor types.');\n }\n};\n\nconst validateInputsV13 = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Squeeze requires 2 inputs.');\n }\n\n if (inputs[1].type !== 'int32') {\n throw new Error('Invalid input type.');\n }\n};", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramMetadata, TextureType} from '../types';\n\nexport const sum = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n validateInputs(inputs);\n\n const sumProgramMetadata = {\n name: 'Sum',\n inputNames: inputs.map((_v, i) => `X${i}`),\n inputTypes: new Array(inputs.length).fill(TextureType.unpacked)\n };\n\n const output = inferenceHandler.run(\n {...sumProgramMetadata, get: () => createSumProgramInfo(inferenceHandler, inputs, sumProgramMetadata)}, inputs);\n return [output];\n};\n\nconst createSumProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], sumProgramMetadata: ProgramMetadata): ProgramInfo => {\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const outputShape = inputs[0].dims.slice();\n const sumLine = inputs.map((_v, i) => `${glsl.texture2D}(X${i},TexCoords)`).join(' + ');\n const shaderSource = `\n void main() {\n vec4 result = ${sumLine};\n ${glsl.output} = result;\n }\n `;\n return {\n ...sumProgramMetadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n hasMain: true,\n shaderSource\n };\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length === 0) {\n throw new Error('Sum requires inputs.');\n }\n\n const length = inputs[0].dims.length;\n for (let i = 1; i < inputs.length; i++) {\n if (length !== inputs[i].dims.length) {\n throw new Error('Input shapes are mismatched.');\n }\n\n for (let j = 0; j < length; j++) {\n if (inputs[0].dims[j] !== inputs[i].dims[j]) {\n throw new Error('Input shapes are not matched.');\n }\n }\n }\n\n if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n throw new Error('Invalid input type.');\n }\n for (let i = 1; i < inputs.length; i++) {\n if (inputs[0].type !== inputs[i].type) {\n throw new Error('Input types are not matched.');\n }\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {NUMBER_TYPES} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramMetadata, TextureType} from '../types';\n\nexport const tile = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n validateInputs(inputs);\n\n const tileProgramMetadata = {\n name: 'Tile',\n inputNames: ['A'],\n inputTypes: [TextureType.unpacked],\n };\n\n const output = inferenceHandler.run(\n {...tileProgramMetadata, get: () => createTileProgramInfo(inferenceHandler, inputs, tileProgramMetadata)},\n inputs);\n return [output];\n};\n\nconst createTileProgramInfo =\n (_handler: WebGLInferenceHandler, inputs: Tensor[], tileProgramMetadata: ProgramMetadata): ProgramInfo => {\n const inputShape = inputs[0].dims.slice();\n const outputShape = new Array(inputShape.length);\n\n const tileOps: string[] = [];\n for (let i = 0; i < inputShape.length; i++) {\n outputShape[i] = inputShape[i] * inputs[1].numberData[i];\n tileOps.push(`inputIdx[${i}] = int(mod(float(outputIdx[${i}]), ${inputShape[i]}.));`);\n }\n\n const rank = outputShape.length;\n const shaderSource = `\n float process(int outputIdx[${rank}]) {\n int inputIdx[${rank}];\n ${tileOps.join('\\n')}\n return _A(inputIdx);\n }\n `;\n return {\n ...tileProgramMetadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Tile requires 2 input.');\n }\n if (inputs[1].dims.length !== 1) {\n throw new Error('The second input shape must 1 dimension.');\n }\n if (inputs[1].dims[0] !== inputs[0].dims.length) {\n throw new Error('Invalid input shape.');\n }\n if (NUMBER_TYPES.indexOf(inputs[0].type) === -1) {\n throw new Error('Invalid input type.');\n }\n if (inputs[1].type !== 'int32' && inputs[1].type !== 'int16') {\n throw new Error('Invalid repeat type.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nexport const unsqueeze: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], axes: number[]): Tensor[] => {\n validateInputs(inputs);\n const outputShape = ShapeUtil.unsqueezeShape(inputs[0].dims, axes);\n const output = inferenceHandler.reshapeUnpacked(inputs[0], outputShape);\n return [output];\n };\n\nexport const unsqueezeV13 = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n validateInputsV13(inputs);\n return unsqueeze(inferenceHandler, [inputs[0]], Array.from(inputs[1].integerData));\n};\n\nexport const parseUnsqueezeAttributes: OperatorInitialization = (node: Graph.Node): number[] =>\n node.attributes.getInts('axes');\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Unsqueeze requires 1 input.');\n }\n\n if (inputs[0].type === 'string') {\n throw new Error('invalid input tensor types.');\n }\n};\n\nconst validateInputsV13 = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Unsqueeze requires 2 inputs.');\n }\n\n if (inputs[1].type !== 'int32') {\n throw new Error('Invalid input type.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {OpSet} from '../../opset';\n\nimport {batchNormalization, parseBatchNormalizationAttributes} from './ops/batch-normalization';\nimport * as binaryOps from './ops/binary-op';\nimport {cast, parseCastAttributes} from './ops/cast';\nimport {concat, parseConcatAttributes} from './ops/concat';\nimport {conv, parseConvAttributes} from './ops/conv';\nimport {convTranspose, parseConvTransposeAttributes} from './ops/conv-transpose';\nimport {depthToSpace, parseDepthToSpaceAttributes} from './ops/depth-to-space';\nimport {flatten, parseFlattenAttributes} from './ops/flatten';\nimport {gather, parseGatherAttributes} from './ops/gather';\nimport {gemm, parseGemmAttributesV11, parseGemmAttributesV7} from './ops/gemm';\nimport {imageScaler, parseImageScalerAttributes} from './ops/image-scaler';\nimport {instanceNormalization, parseInstanceNormalizationAttributes} from './ops/instance-normalization';\nimport {lrn, parseLrnAttributes} from './ops/lrn';\nimport {matMul, parseMatMulAttributes} from './ops/matmul';\nimport {padV11, padV2, parsePadAttributesV11, parsePadAttributesV2} from './ops/pad';\nimport {averagePool, globalAveragePool, globalMaxPool, maxPool, parseAveragePoolAttributes, parseGlobalAveragePoolAttributes, parseMaxPoolAttributes} from './ops/pool';\nimport {parseReduceAttributes, reduceLogSum, reduceLogSumSquare, reduceMax, reduceMean, reduceMin, reduceProd, reduceSum} from './ops/reduce';\nimport {reshape} from './ops/reshape';\nimport {parseResizeAttributesV10, parseResizeAttributesV11, resize} from './ops/resize-packed';\nimport {shape} from './ops/shape';\nimport {parseSliceAttributes, slice, sliceV10} from './ops/slice';\nimport {parseSoftmaxAttributes, parseSoftmaxAttributesV13, softmax, softmaxV13} from './ops/softmax';\nimport {parseSplitAttributes, split} from './ops/split';\nimport {parseSqueezeAttributes, squeeze, squeezeV13} from './ops/squeeze';\nimport {sum} from './ops/sum';\nimport {tile} from './ops/tile';\nimport {parseTransposeAttributes, transpose} from './ops/transpose';\nimport * as unaryOps from './ops/unary-op';\nimport {parseUnsqueezeAttributes, unsqueeze, unsqueezeV13} from './ops/unsqueeze';\nimport {parseUpsampleAttributesV7, parseUpsampleAttributesV9, upsample} from './ops/upsample';\n\nexport const WEBGL_OP_RESOLVE_RULES: readonly OpSet.ResolveRule[] = [\n ['Abs', '', '6+', unaryOps.abs],\n ['Acos', '', '7+', unaryOps.acos],\n ['Add', '', '7+', binaryOps.add],\n ['And', '', '7+', binaryOps.and],\n ['Asin', '', '7+', unaryOps.asin],\n ['Atan', '', '7+', unaryOps.atan],\n // TODO: support new attributes for AveragePool-10\n ['AveragePool', '', '7+', averagePool, parseAveragePoolAttributes],\n ['BatchNormalization', '', '7+', batchNormalization, parseBatchNormalizationAttributes],\n ['Cast', '', '6+', cast, parseCastAttributes],\n ['Ceil', '', '6+', unaryOps.ceil],\n ['Clip', '', '6-10', unaryOps.clip, unaryOps.parseClipAttributes],\n ['Clip', '', '11+', unaryOps.clipV11],\n ['Concat', '', '4+', concat, parseConcatAttributes],\n ['Conv', '', '1+', conv, parseConvAttributes],\n ['ConvTranspose', '', '1+', convTranspose, parseConvTransposeAttributes],\n ['Cos', '', '7+', unaryOps.cos],\n ['Div', '', '7+', binaryOps.div],\n ['Dropout', '', '7+', unaryOps.identity],\n ['DepthToSpace', '', '1+', depthToSpace, parseDepthToSpaceAttributes],\n ['Equal', '', '7+', binaryOps.equal],\n ['Elu', '', '6+', unaryOps.elu, unaryOps.parseEluAttributes],\n ['Exp', '', '6+', unaryOps.exp],\n ['Flatten', '', '1+', flatten, parseFlattenAttributes],\n ['Floor', '', '6+', unaryOps.floor],\n ['FusedConv', 'com.microsoft', '1+', conv, parseConvAttributes],\n ['Gather', '', '1+', gather, parseGatherAttributes],\n ['Gemm', '', '7-10', gemm, parseGemmAttributesV7],\n ['Gemm', '', '11+', gemm, parseGemmAttributesV11],\n ['GlobalAveragePool', '', '1+', globalAveragePool, parseGlobalAveragePoolAttributes],\n ['GlobalMaxPool', '', '1+', globalMaxPool],\n ['Greater', '', '7+', binaryOps.greater],\n ['Identity', '', '1+', unaryOps.identity],\n ['ImageScaler', '', '1+', imageScaler, parseImageScalerAttributes],\n ['InstanceNormalization', '', '6+', instanceNormalization, parseInstanceNormalizationAttributes],\n ['LeakyRelu', '', '6+', unaryOps.leakyRelu, unaryOps.parseLeakyReluAttributes],\n ['Less', '', '7+', binaryOps.less],\n ['LRN', '', '1+', lrn, parseLrnAttributes],\n ['Log', '', '6+', unaryOps.log],\n ['MatMul', '', '1+', matMul, parseMatMulAttributes],\n // TODO: support new attributes for MaxPool-8 and MaxPool-10\n ['MaxPool', '', '1+', maxPool, parseMaxPoolAttributes],\n ['Mul', '', '7+', binaryOps.mul],\n ['Neg', '', '6+', unaryOps.neg],\n ['Not', '', '1+', unaryOps.not],\n ['Or', '', '7+', binaryOps.or],\n ['Pad', '', '2-10', padV2, parsePadAttributesV2],\n ['Pad', '', '11+', padV11, parsePadAttributesV11],\n ['Pow', '', '7+', binaryOps.pow],\n ['PRelu', '', '7+', binaryOps.pRelu],\n ['ReduceLogSum', '', '1+', reduceLogSum, parseReduceAttributes],\n ['ReduceMax', '', '1+', reduceMax, parseReduceAttributes],\n ['ReduceMean', '', '1+', reduceMean, parseReduceAttributes],\n ['ReduceMin', '', '1+', reduceMin, parseReduceAttributes],\n ['ReduceProd', '', '1+', reduceProd, parseReduceAttributes],\n ['ReduceSum', '', '1-12', reduceSum, parseReduceAttributes],\n ['ReduceSumSquare', '', '1+', reduceLogSumSquare, parseReduceAttributes],\n ['Relu', '', '6+', unaryOps.relu],\n ['Reshape', '', '5+', reshape],\n ['Resize', '', '10', resize, parseResizeAttributesV10],\n ['Resize', '', '11+', resize, parseResizeAttributesV11],\n ['Shape', '', '1+', shape],\n ['Sigmoid', '', '6+', unaryOps.sigmoid],\n ['Sin', '', '7+', unaryOps.sin],\n ['Slice', '', '10+', sliceV10], // TODO: support 'steps' for Slice-10\n ['Slice', '', '1-9', slice, parseSliceAttributes],\n // The \"semantic\" meaning of axis has changed in opset-13.\n ['Softmax', '', '1-12', softmax, parseSoftmaxAttributes],\n ['Softmax', '', '13+', softmaxV13, parseSoftmaxAttributesV13],\n // 'Split' operator has an optional attribute 'split'\n // this attribute determines how the specified axis of input data is split.\n // When the attribute is missing, we need the count of number of outputs\n // so that we can determine the 'split' attribute from the runtime input to the Operator\n ['Split', '', '2-12', split, parseSplitAttributes],\n ['Sqrt', '', '6+', unaryOps.sqrt],\n ['Squeeze', '', '1-12', squeeze, parseSqueezeAttributes],\n ['Squeeze', '', '13+', squeezeV13],\n ['Sub', '', '7+', binaryOps.sub],\n ['Sum', '', '6+', sum],\n ['Tan', '', '7+', unaryOps.tan],\n ['Tanh', '', '6+', unaryOps.tanh],\n ['Tile', '', '6+', tile],\n ['Transpose', '', '1+', transpose, parseTransposeAttributes],\n ['Upsample', '', '7-8', upsample, parseUpsampleAttributesV7],\n ['Upsample', '', '9', upsample, parseUpsampleAttributesV9],\n ['Unsqueeze', '', '1-12', unsqueeze, parseUnsqueezeAttributes],\n ['Unsqueeze', '', '13+', unsqueezeV13],\n ['Xor', '', '7+', binaryOps.xor],\n];\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nconst INLINE_FUNC_DEF_REGEX = /@inline[\\s\\n\\r]+(\\w+)[\\s\\n\\r]+([0-9a-zA-Z_]+)\\s*\\(([^)]*)\\)\\s*{(([^}]|[\\n\\r])*)}/gm;\nconst FUNC_CALL_REGEX = '(\\\\w+)?\\\\s+([_0-9a-zA-Z]+)\\\\s+=\\\\s+__FUNC__\\\\((.*)\\\\)\\\\s*;';\n/**\n * GLSL preprocessor responsible for resolving @inline directives\n */\nexport function replaceInlines(script: string): string {\n const inlineDefs: {[name: string]: {params: Array<{type: string; name: string}|null>; body: string}} = {};\n let match;\n while ((match = INLINE_FUNC_DEF_REGEX.exec(script)) !== null) {\n const params = match[3]\n .split(',')\n .map(s => {\n const tokens = s.trim().split(' ');\n if (tokens && tokens.length === 2) {\n return {type: tokens[0], name: tokens[1]};\n }\n return null;\n })\n .filter(v => v !== null);\n inlineDefs[match[2]] = {params, body: match[4]};\n }\n for (const name in inlineDefs) {\n const regexString = FUNC_CALL_REGEX.replace('__FUNC__', name);\n const regex = new RegExp(regexString, 'gm');\n while ((match = regex.exec(script)) !== null) {\n const type = match[1];\n const variable = match[2];\n const params = match[3].split(',');\n const declLine = (type) ? `${type} ${variable};` : '';\n let newBody: string = inlineDefs[name].body;\n let paramRedecLine = '';\n inlineDefs[name].params.forEach((v, i) => {\n if (v) {\n paramRedecLine += `${v.type} ${v.name} = ${params[i]};\\n`;\n }\n });\n newBody = `${paramRedecLine}\\n ${newBody}`;\n newBody = newBody.replace('return', `${variable} = `);\n const replacement = `\n ${declLine}\n {\n ${newBody}\n }\n `;\n script = script.replace(match[0], replacement);\n }\n }\n script = script.replace(INLINE_FUNC_DEF_REGEX, '');\n return script;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Logger} from '../../instrument';\nimport {assert} from '../../util';\n\n/** Layout preferences */\nexport interface WidthHeightPrefs {\n breakAxis?: number;\n isPacked?: boolean;\n reverseWH?: boolean;\n}\n/**\n * TextureLayoutStrategy is an abstraction for different plans\n * for mapping n-dimensional arrays to 2D textures (and back)\n */\nexport interface TextureLayoutStrategy {\n computeTextureWH(shape: readonly number[], prefs?: WidthHeightPrefs): [number, number];\n}\n\n/**\n * This strategy try to find the minimal max(W,H) that fulfills (W * H == totalSize)\n */\nexport class AlwaysKeepOriginalSizeStrategy implements TextureLayoutStrategy {\n constructor(public maxTextureSize: number) {}\n computeTextureWH(shape: readonly number[], prefs?: WidthHeightPrefs): [number, number] {\n // scalar tensor\n if (shape.length === 0) {\n return [1, 1];\n }\n const maxTextureSize = this.maxTextureSize;\n if (prefs && prefs.breakAxis !== undefined) {\n // check to see if dims fit\n const wsize = prefs.breakAxis >= shape.length ? 1 : shape.slice(prefs.breakAxis).reduce((a, b) => a * b);\n const hsize = prefs.breakAxis <= 0 ? 1 : shape.slice(0, prefs.breakAxis).reduce((a, b) => a * b);\n if (wsize > maxTextureSize || hsize > maxTextureSize) {\n // ignore preferences\n // continue with default layout\n Logger.verbose(\n 'TextureLayout',\n `Given width/height preferences were unattainable: shape:${shape}, breakAxis:${prefs.breakAxis}`);\n } else {\n return [wsize, hsize];\n }\n }\n const totalSize = shape.reduce((a, b) => a * b);\n\n let width = Math.floor(Math.sqrt(totalSize));\n\n for (; width < maxTextureSize && width < totalSize; width++) {\n if (totalSize % width === 0) {\n break;\n }\n }\n\n if (width >= maxTextureSize || totalSize % width !== 0) {\n throw new Error(`The given dimensions are outside this GPU's boundaries: ${shape}`);\n }\n return [width, totalSize / width];\n }\n}\n\nexport class PreferLogicalStrategy implements TextureLayoutStrategy {\n constructor(public maxTextureSize: number) {}\n computeTextureWH(shape: readonly number[], prefs?: WidthHeightPrefs): [number, number] {\n const wh = this.computeTexture(shape, prefs);\n if (prefs && prefs.isPacked) {\n wh[0] /= 2;\n wh[1] /= 2;\n }\n if (prefs && prefs.reverseWH) {\n return [wh[1], wh[0]];\n }\n return wh;\n }\n\n computeTexture(shape: readonly number[], prefs?: WidthHeightPrefs): [number, number] {\n const isPacked = prefs && prefs.isPacked;\n // scalar tensor\n if (shape.length === 0) {\n return isPacked ? [2, 2] : [1, 1];\n }\n let maxTextureSize = this.maxTextureSize;\n if (prefs && prefs.breakAxis !== undefined) {\n // check to see if dims fit\n const wsize = prefs.breakAxis >= shape.length ? 1 : shape.slice(prefs.breakAxis).reduce((a, b) => a * b);\n const hsize = prefs.breakAxis <= 0 ? 1 : shape.slice(0, prefs.breakAxis).reduce((a, b) => a * b);\n if (wsize > maxTextureSize || hsize > maxTextureSize) {\n // ignore preferences\n // continue with default layout\n Logger.verbose(\n 'TextureLayout',\n `Given width/height preferences were unattainable: shape:${shape}, breakAxis:${prefs.breakAxis}`);\n } else {\n return [wsize, hsize];\n }\n }\n let logShape = shape.slice(0);\n if (isPacked) {\n maxTextureSize = maxTextureSize * 2;\n\n // This logic ensures we accurately count the number of packed texels needed\n // to accommodate the tensor. We can only pack values in the same texel if\n // they are from adjacent pairs of rows/cols within the same batch. So if a\n // tensor has 3 rows, we pretend it has 4 rows in order to account for the\n // fact that the texels containing the third row are half empty.\n logShape = logShape.map(\n (_d, i) => i >= logShape.length - 2 ? (logShape[i] % 2 === 0 ? logShape[i] : logShape[i] + 1) : logShape[i]);\n\n // Packed texture height is at least 2 (the channel height of a single\n // texel).\n if (logShape.length === 1) {\n logShape = [2, logShape[0]];\n }\n }\n\n // If logical shape is 2, we don't squeeze, since we want to match physical.\n if (logShape.length !== 2) {\n const squeezeResult = squeezeShape(logShape);\n logShape = squeezeResult.newShape;\n }\n\n const size = sizeFromShape(logShape);\n if (logShape.length <= 1 && size <= maxTextureSize) {\n return [1, size];\n } else if (logShape.length === 2 && logShape[0] <= maxTextureSize && logShape[1] <= maxTextureSize) {\n return logShape as [number, number];\n } else if (logShape.length === 3 && logShape[0] * logShape[1] <= maxTextureSize && logShape[2] <= maxTextureSize) {\n return [logShape[0] * logShape[1], logShape[2]];\n } else if (logShape.length === 3 && logShape[0] <= maxTextureSize && logShape[1] * logShape[2] <= maxTextureSize) {\n return [logShape[0], logShape[1] * logShape[2]];\n } else if (\n logShape.length === 4 && logShape[0] * logShape[1] * logShape[2] <= maxTextureSize &&\n logShape[3] <= maxTextureSize) {\n return [logShape[0] * logShape[1] * logShape[2], logShape[3]];\n } else if (\n logShape.length === 4 && logShape[0] <= maxTextureSize &&\n logShape[1] * logShape[2] * logShape[3] <= maxTextureSize) {\n return [logShape[0], logShape[1] * logShape[2] * logShape[3]];\n } else {\n if (isPacked) {\n // For packed textures size equals the number of channels required to\n // accommodate the texture data. However in order to squarify such that\n // inner dimensions stay even, we rewrite size to equal the number of\n // texels. Then in the return statement we rehydrate the squarified\n // dimensions to channel units.\n return sizeToSquarishShape(size / 4).map(d => d * 2) as [number, number];\n }\n return sizeToSquarishShape(size);\n }\n }\n}\n\nexport function squeezeShape(shape: number[], axis?: number[]): {newShape: number[]; keptDims: number[]} {\n const newShape: number[] = [];\n const keptDims: number[] = [];\n const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0;\n const axes = (axis == null || isEmptyArray) ? null : parseAxisParam(axis, shape).sort();\n let j = 0;\n for (let i = 0; i < shape.length; ++i) {\n if (axes != null) {\n if (axes[j] === i && shape[i] !== 1) {\n throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`);\n }\n if ((axes[j] == null || axes[j] > i) && shape[i] === 1) {\n newShape.push(shape[i]);\n keptDims.push(i);\n }\n if (axes[j] <= i) {\n j++;\n }\n }\n if (shape[i] !== 1) {\n newShape.push(shape[i]);\n keptDims.push(i);\n }\n }\n return {newShape, keptDims};\n}\n\nexport function parseAxisParam(axis: number|number[], shape: number[]): number[] {\n const rank = shape.length;\n\n // Normalize input\n axis = axis == null ? shape.map((_s, i) => i) : ([] as number[]).concat(axis);\n\n // Check for valid range\n assert(\n axis.every(ax => ax >= -rank && ax < rank),\n () => `All values in axis param must be in range [-${rank}, ${rank}) but ` +\n `got axis ${axis}`);\n\n // Check for only integers\n assert(\n axis.every(isInt),\n () => 'All values in axis param must be integers but ' +\n `got axis ${axis}`);\n\n // Handle negative axis.\n return axis.map(a => a < 0 ? rank + a : a);\n}\nexport function isInt(a: number): boolean {\n return a % 1 === 0;\n}\nexport function sizeFromShape(shape: number[]): number {\n if (shape.length === 0) {\n // Scalar.\n return 1;\n }\n let size = shape[0];\n for (let i = 1; i < shape.length; i++) {\n size *= shape[i];\n }\n return size;\n}\nexport function getRowsCols(shape: number[]): [number, number] {\n if (shape.length === 0) {\n throw Error('Cannot get rows and columns of an empty shape array.');\n }\n\n return [shape.length > 1 ? shape[shape.length - 2] : 1, shape[shape.length - 1]];\n}\nexport function sizeToSquarishShape(size: number): [number, number] {\n const width = Math.ceil(Math.sqrt(size));\n return [width, Math.ceil(size / width)];\n}\nexport function getBatchDim(shape: number[], dimsToSkip = 2): number {\n return sizeFromShape(shape.slice(0, shape.length - dimsToSkip));\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {ArrayUtil, BroadcastUtil, ShapeUtil} from '../../util';\n\nimport {GlslContext, GlslLib, GlslLibRoutine} from './glsl-definitions';\nimport {getGlsl} from './glsl-source';\nimport {squeezeShape} from './texture-layout-strategy';\nimport {TextureLayout} from './types';\nimport {generateShaderFuncNameFromInputSamplerName, generateShaderFuncNameFromInputSamplerNameAtOutCoords, getCoordsDataType, getGlChannels, getSqueezedParams, squeezeInputShape} from './utils';\n\n/**\n * GLSL Library responsible for data types and routines for manipulating\n * coordinates and mapping to/from tensor indices\n */\nexport class CoordsGlslLib extends GlslLib {\n returnType: string;\n\n constructor(context: GlslContext) {\n super(context);\n }\n getFunctions(): {[name: string]: GlslLibRoutine} {\n return {\n ...this.offsetToCoords(),\n ...this.coordsToOffset(),\n ...this.toVec(),\n ...this.valueFrom(),\n // TODO return these only when packing is enabled.\n ...this.getCommonUtilFuncs(),\n ...this.getInputsSamplingSnippets(),\n ...this.getOutputSamplingSnippet()\n };\n }\n getCustomTypes() {\n return {};\n }\n /**\n * Produces a function that can map from\n * 2D normalzied coordinates (s,t) to a flat offset\n */\n protected offsetToCoords(): {[name: string]: GlslLibRoutine} {\n const funcName = 'offsetToCoords';\n return {\n offsetToCoords: new GlslLibRoutine(`\n vec2 ${funcName}(int offset, int width, int height) {\n int t = offset / width;\n int s = offset - t*width;\n vec2 coords = (vec2(s,t) + vec2(0.5,0.5)) / vec2(width, height);\n return coords;\n }\n `)\n };\n }\n\n /**\n * Produces a function that can map from\n * 2D normalzied coordinates (s,t) to a flat offset\n */\n protected coordsToOffset(): {[name: string]: GlslLibRoutine} {\n const funcName = 'coordsToOffset';\n return {\n coordsToOffset: new GlslLibRoutine(`\n int ${funcName}(vec2 coords, int width, int height) {\n float s = coords.s * float(width);\n float t = coords.t * float(height);\n int offset = int(t) * width + int(s);\n return offset;\n }\n `)\n };\n }\n\n /**\n * Generates code for output sampler.\n */\n\n protected getOutputSamplingSnippet(): {[name: string]: GlslLibRoutine} {\n const outputLayout = this.context.outputTextureLayout;\n if (outputLayout.isPacked) {\n return this.getPackedOutputSamplingSnippet(outputLayout);\n } else {\n return this.getUnpackedOutputSamplingSnippet(outputLayout);\n }\n }\n\n /**\n * Generates code for packed output sampler.\n */\n protected getPackedOutputSamplingSnippet(outputLayout: TextureLayout): {[name: string]: GlslLibRoutine} {\n const outShape = outputLayout.unpackedShape;\n const outTexShape = [outputLayout.width, outputLayout.height];\n const result: {[name: string]: GlslLibRoutine} = {};\n const funcName = 'getOutputCoords';\n switch (outShape.length) {\n case 0:\n result[funcName] = this.getOutputScalarCoords();\n break;\n case 1:\n result[funcName] = this.getOutputPacked1DCoords(outShape as [number], outTexShape as [number, number]);\n break;\n case 2:\n result[funcName] = this.getOutputPacked2DCoords(outShape as [number, number], outTexShape as [number, number]);\n break;\n case 3:\n result[funcName] =\n this.getOutputPacked3DCoords(outShape as [number, number, number], outTexShape as [number, number]);\n break;\n default:\n result[funcName] = this.getOutputPackedNDCoords(outShape, outTexShape as [number, number]);\n }\n const glsl = getGlsl(this.context.glContext.version);\n // TODO we need this to properly return a packed vec4 from kernels.\n // Replace all '{glsl.output} = result' with 'setOutput(result)' in all kernels.\n const floatTextureSetRGBASource = `\n void setOutput(vec4 val) {\n ${glsl.output} = val;\n }\n `;\n const floatTextureSetRGBAFuncName = 'floatTextureSetRGBA';\n result[floatTextureSetRGBAFuncName] = new GlslLibRoutine(floatTextureSetRGBASource);\n return result;\n }\n\n /**\n * Generates code for unpacked output sampler.\n */\n protected getUnpackedOutputSamplingSnippet(outputLayout: TextureLayout): {[name: string]: GlslLibRoutine} {\n const outShape = outputLayout.unpackedShape;\n const outTexShape = [outputLayout.width, outputLayout.height];\n const result: {[name: string]: GlslLibRoutine} = {};\n const funcName = 'getOutputCoords';\n switch (outShape.length) {\n case 0:\n result[funcName] = this.getOutputScalarCoords();\n break;\n case 1:\n result[funcName] = this.getOutputUnpacked1DCoords(outShape as [number], outTexShape as [number, number]);\n break;\n case 2:\n result[funcName] =\n this.getOutputUnpacked2DCoords(outShape as [number, number], outTexShape as [number, number]);\n break;\n case 3:\n result[funcName] =\n this.getOutputUnpacked3DCoords(outShape as [number, number, number], outTexShape as [number, number]);\n break;\n case 4:\n result[funcName] = this.getOutputUnpacked4DCoords(\n outShape as [number, number, number, number], outTexShape as [number, number]);\n break;\n case 5:\n result[funcName] = this.getOutputUnpacked5DCoords(\n outShape as [number, number, number, number, number], outTexShape as [number, number]);\n break;\n case 6:\n result[funcName] = this.getOutputUnpacked6DCoords(\n outShape as [number, number, number, number, number, number], outTexShape as [number, number]);\n break;\n default:\n throw new Error(`Unsupported output dimensionality: ${outShape.length}`);\n }\n const glsl = getGlsl(this.context.glContext.version);\n // TODO we need this to properly return a packed vec4 from kernels.\n // Replace all '{glsl.output} = result' with 'setOutput(result)' in all kernels.\n const floatTextureSetRSource = `\n void setOutput(float val) {\n ${glsl.output} = vec4(val, 0, 0, 0);\n }\n `;\n const floatTextureSetRFuncName = 'floatTextureSetR';\n result[floatTextureSetRFuncName] = new GlslLibRoutine(floatTextureSetRSource);\n return result;\n }\n\n /**\n * Scalar output coordinates.\n */\n protected getOutputScalarCoords(): GlslLibRoutine {\n return new GlslLibRoutine(`\n int getOutputCoords() {\n return 0;\n }\n `);\n }\n\n /**\n * 1D packed output coordinates.\n */\n protected getOutputPacked1DCoords(_shape: [number], texShape: [number, number]): GlslLibRoutine {\n const packedTexShape = texShape;\n let source = '';\n if (packedTexShape[0] === 1) {\n source = `\n int getOutputCoords() {\n return 2 * int(TexCoords.y * ${packedTexShape[1]}.0);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n if (packedTexShape[1] === 1) {\n source = `\n int getOutputCoords() {\n return 2 * int(TexCoords.x * ${packedTexShape[0]}.0);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n source = `\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n return 2 * (resTexRC.y * ${packedTexShape[0]} + resTexRC.x);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * 2D packed output coordinates.\n */\n protected getOutputPacked2DCoords(shape: [number, number], texShape: [number, number]): GlslLibRoutine {\n let source = '';\n if (ArrayUtil.arraysEqual(shape, texShape)) {\n source = `\n ivec2 getOutputCoords() {\n return 2 * ivec2(TexCoords.xy * vec2(${texShape[0]}, ${texShape[1]}));\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n const packedTexShape = texShape;\n // texels needed to accommodate a logical row\n const texelsInLogicalRow = Math.ceil(shape[1] / 2);\n\n /**\n * getOutputCoords\n *\n * resTexRC: The rows and columns of the texels. If you move over one\n * texel to the right in the packed texture, you are moving over one column\n * (not two).\n *\n * index: The texel index\n */\n source = `\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n\n int index = resTexRC.y * ${packedTexShape[0]} + resTexRC.x;\n\n // reverse r and c order for packed texture\n int r = imod(index, ${texelsInLogicalRow}) * 2;\n int c = 2 * (index / ${texelsInLogicalRow});\n\n return ivec2(r, c);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * 3D packed output coordinates.\n */\n protected getOutputPacked3DCoords(shape: [number, number, number], texShape: [number, number]): GlslLibRoutine {\n const packedTexShape = [texShape[0], texShape[1]];\n const texelsInLogicalRow = Math.ceil(shape[2] / 2);\n const texelsInBatch = texelsInLogicalRow * Math.ceil(shape[1] / 2);\n const source = `\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n int index = resTexRC.y * ${packedTexShape[0]} + resTexRC.x;\n\n int b = index / ${texelsInBatch};\n index -= b * ${texelsInBatch};\n\n // reverse r and c order for packed texture\n int r = imod(index, ${texelsInLogicalRow}) * 2;\n int c = 2 * (index / ${texelsInLogicalRow});\n\n return ivec3(b, r, c);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * ND packed output coordinates.\n */\n protected getOutputPackedNDCoords(shape: readonly number[], texShape: [number, number]): GlslLibRoutine {\n const packedTexShape = [texShape[0], texShape[1]];\n\n const texelsInLogicalRow = Math.ceil(shape[shape.length - 1] / 2);\n const texelsInBatch = texelsInLogicalRow * Math.ceil(shape[shape.length - 2] / 2);\n let texelsInBatchN = texelsInBatch;\n let batches = '';\n let coords = 'b, r, c';\n\n for (let b = 2; b < shape.length - 1; b++) {\n texelsInBatchN *= shape[shape.length - b - 1];\n batches = `\n int b${b} = index / ${texelsInBatchN};\n index -= b${b} * ${texelsInBatchN};\n ` + batches;\n coords = `b${b}, ` + coords;\n }\n const source = `\n ivec${shape.length} getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n int index = resTexRC.y * ${packedTexShape[0]} + resTexRC.x;\n\n ${batches}\n\n int b = index / ${texelsInBatch};\n index -= b * ${texelsInBatch};\n\n // reverse r and c order for packed texture\n int r = imod(index, ${texelsInLogicalRow}) * 2;\n int c = 2 * (index / ${texelsInLogicalRow});\n\n return ivec${shape.length}(${coords});\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Unpacked 1D output coordinates.\n */\n protected getOutputUnpacked1DCoords(_shape: [number], texShape: [number, number]): GlslLibRoutine {\n const source = `\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${texShape[0]}, ${texShape[1]}));\n return resTexRC.y * ${texShape[0]} + resTexRC.x;\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Unpacked 2D output coordinates.\n */\n protected getOutputUnpacked2DCoords(shape: [number, number], texShape: [number, number]): GlslLibRoutine {\n const source = `\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${texShape[0]}, ${texShape[1]}));\n int index = resTexRC.y * ${texShape[0]} + resTexRC.x;\n int r = index / ${shape[1]};\n int c = index - r * ${shape[1]};\n return ivec2(r, c);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Unpacked 3D output coordinates.\n */\n protected getOutputUnpacked3DCoords(shape: [number, number, number], texShape: [number, number]): GlslLibRoutine {\n let source = '';\n const rank = shape.length;\n\n let strides = null;\n if (rank < 2) {\n strides = [];\n }\n\n strides = new Array(rank - 1);\n strides[rank - 2] = shape[rank - 1];\n for (let i = rank - 3; i >= 0; --i) {\n strides[i] = strides[i + 1] * shape[i + 1];\n }\n const coordsToCompute = ['r', 'c', 'd'];\n const coordsFromIndexSnippet =\n strides\n .map((stride, i) => {\n const line1 = `int ${coordsToCompute[i]} = index / ${stride}`;\n const line2 = i === strides.length - 1 ?\n `int ${coordsToCompute[i + 1]} = index - ${coordsToCompute[i]} * ${stride}` :\n `index -= ${coordsToCompute[i]} * ${stride}`;\n return `${line1}; ${line2};`;\n })\n .join('');\n\n source = `\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${texShape[0]}, ${texShape[1]}));\n int index = resTexRC.y * ${texShape[0]} + resTexRC.x;\n ${coordsFromIndexSnippet}\n return ivec3(r, c, d);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Unpacked 4D output coordinates.\n */\n protected getOutputUnpacked4DCoords(shape: [number, number, number, number], texShape: [number, number]):\n GlslLibRoutine {\n let source = '';\n const rank = shape.length;\n\n let strides = null;\n if (rank < 2) {\n strides = [];\n }\n\n strides = new Array(rank - 1);\n strides[rank - 2] = shape[rank - 1];\n for (let i = rank - 3; i >= 0; --i) {\n strides[i] = strides[i + 1] * shape[i + 1];\n }\n const coordsToCompute = ['r', 'c', 'd', 'd2'];\n const coordsFromIndexSnippet =\n strides\n .map((stride, i) => {\n const line1 = `int ${coordsToCompute[i]} = index / ${stride}`;\n const line2 = i === strides.length - 1 ?\n `int ${coordsToCompute[i + 1]} = index - ${coordsToCompute[i]} * ${stride}` :\n `index -= ${coordsToCompute[i]} * ${stride}`;\n return `${line1}; ${line2};`;\n })\n .join('');\n\n source = `\n ivec4 getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${texShape[0]}, ${texShape[1]}));\n int index = resTexRC.y * ${texShape[0]} + resTexRC.x;\n ${coordsFromIndexSnippet}\n return ivec4(r, c, d, d2);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Unpacked 5D output coordinates.\n */\n protected getOutputUnpacked5DCoords(shape: [number, number, number, number, number], texShape: [number, number]):\n GlslLibRoutine {\n let source = '';\n const rank = shape.length;\n\n let strides = null;\n if (rank < 2) {\n strides = [];\n }\n\n strides = new Array(rank - 1);\n strides[rank - 2] = shape[rank - 1];\n for (let i = rank - 3; i >= 0; --i) {\n strides[i] = strides[i + 1] * shape[i + 1];\n }\n const coordsToCompute = ['r', 'c', 'd', 'd2', 'd3'];\n const coordsFromIndexSnippet =\n strides\n .map((stride, i) => {\n const line1 = `int ${coordsToCompute[i]} = index / ${stride}`;\n const line2 = i === strides.length - 1 ?\n `int ${coordsToCompute[i + 1]} = index - ${coordsToCompute[i]} * ${stride}` :\n `index -= ${coordsToCompute[i]} * ${stride}`;\n return `${line1}; ${line2};`;\n })\n .join('');\n\n source = `\n ivec5 getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${texShape[0]}, ${texShape[1]}));\n int index = resTexRC.y * ${texShape[0]} + resTexRC.x;\n ${coordsFromIndexSnippet}\n return ivec5(r, c, d, d2, d3);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Unpacked 6D output coordinates.\n */\n protected getOutputUnpacked6DCoords(shape: [number, number, number, number, number, number], texShape: [\n number, number\n ]): GlslLibRoutine {\n let source = '';\n const rank = shape.length;\n\n let strides = null;\n if (rank < 2) {\n strides = [];\n }\n\n strides = new Array(rank - 1);\n strides[rank - 2] = shape[rank - 1];\n for (let i = rank - 3; i >= 0; --i) {\n strides[i] = strides[i + 1] * shape[i + 1];\n }\n const coordsToCompute = ['r', 'c', 'd', 'd2', 'd3', 'd4'];\n const coordsFromIndexSnippet =\n strides\n .map((stride, i) => {\n const line1 = `int ${coordsToCompute[i]} = index / ${stride}`;\n const line2 = i === strides.length - 1 ?\n `int ${coordsToCompute[i + 1]} = index - ${coordsToCompute[i]} * ${stride}` :\n `index -= ${coordsToCompute[i]} * ${stride}`;\n return `${line1}; ${line2};`;\n })\n .join('');\n\n source = `\n ivec6 getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${texShape[0]}, ${texShape[1]}));\n int index = resTexRC.y * ${texShape[0]} + resTexRC.x;\n ${coordsFromIndexSnippet}\n return ivec6(r, c, d, d2, d3, d4);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Generates code for common UV coords computation utility functions.\n */\n protected getCommonUtilFuncs(): {[name: string]: GlslLibRoutine} {\n const result: {[name: string]: GlslLibRoutine} = {};\n let funcName = 'uvFromFlat';\n result[funcName] = new GlslLibRoutine(`\n vec2 uvFromFlat(int texNumR, int texNumC, int index) {\n int texC = index / texNumR;\n int texR = index - texC * texNumR;\n // TODO: swap texR, texC order in following function so row is corresponding to u and column is corresponding to\n // v.\n return (vec2(texR, texC) + halfCR) / vec2(texNumR, texNumC);\n }\n `);\n funcName = 'packedUVfrom1D';\n result[funcName] = new GlslLibRoutine(`\n vec2 packedUVfrom1D(int texNumR, int texNumC, int index) {\n int texelIndex = index / 2;\n int texR = texelIndex / texNumC;\n int texC = texelIndex - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n }\n `);\n funcName = 'packedUVfrom2D';\n result[funcName] = new GlslLibRoutine(`\n vec2 packedUVfrom2D(int texNumR, int texNumC, int texelsInLogicalRow, int row, int col) {\n int texelIndex = (row / 2) * texelsInLogicalRow + (col / 2);\n int texR = texelIndex / texNumC;\n int texC = texelIndex - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n }\n `);\n funcName = 'packedUVfrom3D';\n result[funcName] = new GlslLibRoutine(`\n vec2 packedUVfrom3D(int texNumR, int texNumC,\n int texelsInBatch, int texelsInLogicalRow, int b,\n int row, int col) {\n int index = b * texelsInBatch + (row / 2) * texelsInLogicalRow + (col / 2);\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n }\n `);\n funcName = 'sampleTexture';\n const glsl = getGlsl(this.context.glContext.version);\n result[funcName] = new GlslLibRoutine(`\n float sampleTexture(sampler2D textureSampler, vec2 uv) {\n return ${glsl.texture2D}(textureSampler, uv).r;\n }`);\n return result;\n }\n\n /**\n * Constructing snippets for inputs\n */\n protected getInputsSamplingSnippets(): {[name: string]: GlslLibRoutine} {\n const result: {[name: string]: GlslLibRoutine} = {};\n const outputLayout = this.context.outputTextureLayout;\n this.context.programInfo.inputNames.forEach((samplerName, i) => {\n const inputLayout = this.context.inputTextureLayouts[i];\n const funcName = generateShaderFuncNameFromInputSamplerName(samplerName);\n if (inputLayout.isPacked) {\n result[funcName] = this.getPackedSamplerFromInput(funcName, samplerName, inputLayout);\n } else {\n result[funcName] = this.getUnpackedSamplerFromInput(funcName, samplerName, inputLayout);\n }\n\n const outCoordFuncName = generateShaderFuncNameFromInputSamplerNameAtOutCoords(samplerName);\n if (inputLayout.unpackedShape.length <= outputLayout.unpackedShape.length) {\n if (inputLayout.isPacked) {\n result[outCoordFuncName] =\n this.getPackedSamplerAtOutputCoords(outCoordFuncName, inputLayout, outputLayout, samplerName);\n } else {\n result[outCoordFuncName] =\n this.getUnpackedSamplerAtOutputCoords(outCoordFuncName, inputLayout, outputLayout, samplerName);\n }\n }\n });\n\n return result;\n }\n\n /**\n * Constructing snippets for output coordinates of samplers\n */\n protected getPackedSamplerAtOutputCoords(\n funcName: string, inputLayout: TextureLayout, outputLayout: TextureLayout, name: string): GlslLibRoutine {\n const inShape = inputLayout.unpackedShape;\n const outShape = outputLayout.unpackedShape;\n const texName = name;\n const texFuncSnippet = generateShaderFuncNameFromInputSamplerName(texName);\n\n const inRank = inShape.length;\n const outRank = outShape.length;\n\n const broadcastDims = BroadcastUtil.getBroadcastDims(inShape, outShape);\n\n const type = getCoordsDataType(outRank);\n const rankDiff = outRank - inRank;\n let coordsSnippet: string;\n const fields = getGlChannels();\n\n if (inRank === 0) {\n coordsSnippet = '';\n } else if (outRank < 2 && broadcastDims.length >= 1) {\n coordsSnippet = 'coords = 0;';\n } else {\n coordsSnippet = broadcastDims.map(d => `coords.${fields[d + rankDiff]} = 0;`).join('\\n');\n }\n let unpackedCoordsSnippet = '';\n if (outRank < 2 && inRank > 0) {\n unpackedCoordsSnippet = 'coords';\n } else {\n unpackedCoordsSnippet = inShape.map((_s, i) => `coords.${fields[i + rankDiff]}`).join(', ');\n }\n\n let output = 'return outputValue;';\n const inSize = ShapeUtil.size(inShape);\n const isInputScalar = inSize === 1;\n const outSize = ShapeUtil.size(outShape);\n const isOutputScalar = outSize === 1;\n\n if (inRank === 1 && !isInputScalar && !isOutputScalar) {\n output = `\n return vec4(outputValue.xy, outputValue.xy);\n `;\n } else if (isInputScalar && !isOutputScalar) {\n if (outRank === 1) {\n output = `\n return vec4(outputValue.x, outputValue.x, 0., 0.);\n `;\n } else {\n output = `\n return vec4(outputValue.x);\n `;\n }\n } else if (broadcastDims.length) {\n const rows = inRank - 2;\n const cols = inRank - 1;\n\n if (broadcastDims.indexOf(rows) > -1 && broadcastDims.indexOf(cols) > -1) {\n output = 'return vec4(outputValue.x);';\n } else if (broadcastDims.indexOf(rows) > -1) {\n output = 'return vec4(outputValue.x, outputValue.y, ' +\n 'outputValue.x, outputValue.y);';\n } else if (broadcastDims.indexOf(cols) > -1) {\n output = 'return vec4(outputValue.xx, outputValue.zz);';\n }\n }\n\n const swapLastDimsSnippet = `\n int lastDim = coords.${fields[outRank - 1]};\n coords.${fields[outRank - 1]} = coords.${fields[outRank - 2]};\n coords.${fields[outRank - 2]} = lastDim;\n `;\n const source = `\n vec4 ${funcName}() {\n ${type} coords = getOutputCoords();\n ${swapLastDimsSnippet}\n ${coordsSnippet}\n vec4 outputValue = ${texFuncSnippet}(${unpackedCoordsSnippet});\n ${output}\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.getOutputCoords']);\n }\n\n /**\n * Constructing snippets for unpacked output coordinates of samplers\n */\n protected getUnpackedSamplerAtOutputCoords(\n funcName: string, inputLayout: TextureLayout, outputLayout: TextureLayout, name: string): GlslLibRoutine {\n const outTexShape = [outputLayout.width, outputLayout.height];\n const inTexShape = [inputLayout.width, inputLayout.height];\n const inRank = inputLayout.unpackedShape.length;\n const outRank = outputLayout.unpackedShape.length;\n const inShape = inputLayout.unpackedShape;\n const outShape = outputLayout.unpackedShape;\n const texFuncSnippet = generateShaderFuncNameFromInputSamplerName(name);\n\n if (inRank === outRank && ArrayUtil.arraysEqual(inTexShape, outTexShape)) {\n const source = `\n float ${funcName}() {\n return sampleTexture(${name}, TexCoords);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n }\n\n const type = getCoordsDataType(outRank);\n const broadcastDims = BroadcastUtil.getBroadcastDims(inShape, outShape);\n const rankDiff = outRank - inRank;\n let coordsSnippet: string;\n const fields = getGlChannels();\n\n if (inRank === 0) {\n coordsSnippet = '';\n } else if (outRank < 2 && broadcastDims.length >= 1) {\n coordsSnippet = 'coords = 0;';\n } else {\n coordsSnippet = broadcastDims.map(d => `coords.${fields[d + rankDiff]} = 0;`).join('\\n');\n }\n let unpackedCoordsSnippet = '';\n if (outRank < 2 && inRank > 0) {\n unpackedCoordsSnippet = 'coords';\n } else {\n unpackedCoordsSnippet = inputLayout.unpackedShape.map((_s, i) => `coords.${fields[i + rankDiff]}`).join(', ');\n }\n const source = `\n float ${funcName}() {\n ${type} coords = getOutputCoords();\n ${coordsSnippet}\n return ${texFuncSnippet}(${unpackedCoordsSnippet});\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.getOutputCoords']);\n }\n\n /**\n * Constructing snippets for packed operations.\n */\n protected getPackedSamplerFromInput(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n switch (inputLayout.unpackedShape.length) {\n case 0:\n return this.getPackedSamplerScalar(funcName, name);\n case 1:\n return this.getPackedSampler1D(funcName, name, inputLayout);\n case 2:\n return this.getPackedSampler2D(funcName, name, inputLayout);\n case 3:\n return this.getPackedSampler3D(funcName, name, inputLayout);\n default:\n return this.getPackedSamplerND(funcName, name, inputLayout);\n }\n }\n\n /**\n * Constructing snippets for unpacked operations.\n */\n protected getUnpackedSamplerFromInput(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n switch (shape.length) {\n case 0:\n return this.getUnpackedSamplerScalar(funcName, name, inputLayout);\n case 1:\n return this.getUnpackedSampler1D(funcName, name, inputLayout);\n case 2:\n return this.getUnpackedSampler2D(funcName, name, inputLayout);\n case 3:\n return this.getUnpackedSampler3D(funcName, name, inputLayout);\n case 4:\n return this.getUnpackedSampler4D(funcName, name, inputLayout);\n case 5:\n return this.getUnpackedSampler5D(funcName, name, inputLayout);\n case 6:\n return this.getUnpackedSampler6D(funcName, name, inputLayout);\n default:\n // TODO support more dimensionalities\n throw new Error(`Unsupported dimension ${shape.length}-D`);\n }\n }\n\n /**\n * Packed scalar snippet.\n */\n protected getPackedSamplerScalar(funcName: string, name: string): GlslLibRoutine {\n const glsl = getGlsl(this.context.glContext.version);\n const source = `\n vec4 ${funcName}() {\n return ${glsl.texture2D}(${name}, halfCR);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Packed 1D snippet.\n */\n protected getPackedSampler1D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const texShape = [inputLayout.width, inputLayout.height];\n const packedTexShape = [texShape[1], texShape[0]];\n const glsl = getGlsl(this.context.glContext.version);\n\n const packedSampler = `vec4 ${funcName}(int index) {\n vec2 uv = packedUVfrom1D(\n ${packedTexShape[0]}, ${packedTexShape[1]}, index);\n return ${glsl.texture2D}(${name}, uv);\n }`;\n const source = packedSampler;\n return new GlslLibRoutine(source, ['coordinates.packedUVfrom1D']);\n }\n\n /**\n * Packed 2D snippet.\n */\n protected getPackedSampler2D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n const texShape = [inputLayout.width, inputLayout.height];\n const glsl = getGlsl(this.context.glContext.version);\n const texNumR = texShape[0];\n const texNumC = texShape[1];\n\n if (texShape != null && ArrayUtil.arraysEqual(shape, texShape)) {\n const packedSampler = `vec4 ${funcName}(int row, int col) {\n vec2 uv = (vec2(col, row) + halfCR) / vec2(${texNumC}.0, ${texNumR}.0);\n return ${glsl.texture2D}(${name}, uv);\n }`;\n\n return new GlslLibRoutine(packedSampler);\n }\n const packedTexShape = texShape;\n const valuesPerRow = Math.ceil(shape[1] / 2);\n const packedSampler = `vec4 ${funcName}(int row, int col) {\n vec2 uv = packedUVfrom2D(${packedTexShape[1]}, ${packedTexShape[0]}, ${valuesPerRow}, row, col);\n return ${glsl.texture2D}(${name}, uv);\n }`;\n const source = packedSampler;\n return new GlslLibRoutine(source, ['coordinates.packedUVfrom2D']);\n }\n\n /**\n * Packed 3D snippet.\n */\n protected getPackedSampler3D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n const texShape = [inputLayout.width, inputLayout.height];\n const packedTexShape = [texShape[0], texShape[1]];\n const glsl = getGlsl(this.context.glContext.version);\n\n if (shape[0] === 1) {\n const squeezedShape = shape.slice(1);\n const keptDims = [1, 2];\n const newInputShape = squeezeInputShape(shape, squeezedShape);\n const params = ['b', 'row', 'col'];\n // Deep copy of input texture layout.\n const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n newInputLayout.unpackedShape = newInputShape;\n const samplerRoutine = this.getPackedSamplerFromInput(funcName, name, newInputLayout);\n const packedSampler = `${samplerRoutine.routineBody}\n vec4 ${funcName}(int b, int row, int col) {\n return ${funcName}(${getSqueezedParams(params, keptDims)});\n } `;\n const source = packedSampler;\n return new GlslLibRoutine(source, samplerRoutine.dependencies);\n }\n const texNumR = packedTexShape[0];\n const texNumC = packedTexShape[1];\n\n const valuesPerRow = Math.ceil(shape[2] / 2);\n const texelsInBatch = valuesPerRow * Math.ceil(shape[1] / 2);\n\n const packedSampler = `vec4 ${funcName}(int b, int row, int col) {\n vec2 uv = packedUVfrom3D(\n ${texNumC}, ${texNumR}, ${texelsInBatch}, ${valuesPerRow}, b, row, col);\n return ${glsl.texture2D}(${name}, uv);}`;\n const source = packedSampler;\n return new GlslLibRoutine(source, ['coordinates.packedUVfrom3D']);\n }\n /*\n * Packed ND snippet.\n */\n protected getPackedSamplerND(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n const rank = shape.length;\n const texShape = [inputLayout.width, inputLayout.height];\n const glsl = getGlsl(this.context.glContext.version);\n\n const packedTexShape = [texShape[0], texShape[1]];\n const texNumR = packedTexShape[1];\n const texNumC = packedTexShape[0];\n const valuesPerRow = Math.ceil(shape[rank - 1] / 2);\n let texelsInBatch = valuesPerRow * Math.ceil(shape[rank - 2] / 2);\n let params = 'int b, int row, int col';\n let index = `b * ${texelsInBatch} + (row / 2) * ${valuesPerRow} + (col / 2)`;\n for (let b = 2; b < rank - 1; b++) {\n params = `int b${b}, ` + params;\n texelsInBatch *= shape[rank - b - 1];\n index = `b${b} * ${texelsInBatch} + ` + index;\n }\n const packedSampler = `vec4 ${funcName}(${params}) {\n int index = ${index};\n int texR = index / ${texNumC};\n int texC = index - texR * ${texNumC};\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${texNumC}, ${texNumR});\n return ${glsl.texture2D}(${name}, uv);\n }`;\n const source = packedSampler;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Unpacked scalar snippet.\n */\n protected getUnpackedSamplerScalar(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const [texNumR, texNumC] = [inputLayout.width, inputLayout.height];\n if (texNumR === 1 && texNumC === 1) {\n const source = `\n float ${funcName}() {\n return sampleTexture(${name}, halfCR);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n }\n\n const source = `\n float ${funcName}() {\n int offset_${name} = coordsToOffset(TexCoords, ${texNumR}, ${texNumC});\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, offset_${name});\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(\n source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n }\n\n /**\n * Unpacked 1D snippet.\n */\n protected getUnpackedSampler1D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const tNumR = inputLayout.width;\n const tNumC = inputLayout.height;\n\n if (tNumC === 1 && tNumR === 1) {\n const source = `\n float ${funcName}(int index) {\n return sampleTexture(${name}, halfCR);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n }\n\n if (tNumC === 1) {\n const source = `\n float ${funcName}(int index) {\n vec2 uv = vec2((float(index) + 0.5) / ${tNumR}.0, 0.5);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n }\n if (tNumR === 1) {\n const source = `\n float ${funcName}(int index) {\n vec2 uv = vec2(0.5, (float(index) + 0.5) / ${tNumC}.0);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n }\n const source = `\n float ${funcName}(int index) {\n vec2 uv = uvFromFlat(${tNumR}, ${tNumC}, index);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture']);\n }\n\n /**\n * Unpacked 2D snippet.\n */\n\n protected getUnpackedSampler2D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n\n // TODO: modify row/col order for other dimensions.\n const texShape = [inputLayout.height, inputLayout.width];\n\n if (texShape != null && ArrayUtil.arraysEqual(shape, texShape)) {\n const texNumR = texShape[1];\n const texNumC = texShape[0];\n const source = `\n float ${funcName}(int row, int col) {\n vec2 uv = (vec2(row, col) + halfCR) / vec2(${texNumR}.0, ${texNumC}.0);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n }\n\n const {newShape, keptDims} = squeezeShape(shape as number[]);\n const squeezedShape = newShape;\n if (squeezedShape.length < shape.length) {\n const newInputShape = squeezeInputShape(shape, squeezedShape);\n // Deep copy of input texture layout.\n const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n newInputLayout.unpackedShape = newInputShape;\n\n const params = ['col', 'row'];\n const source = `\n ${this.getUnpackedSamplerFromInput(funcName, name, newInputLayout).routineBody}\n float ${funcName}(int row, int col) {\n return ${funcName}(${getSqueezedParams(params, keptDims)});\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n }\n\n const texNumR = texShape[1];\n const texNumC = texShape[0];\n if (texNumC === 1) {\n const source = `\n float ${funcName}(int row, int col) {\n int offset_${name} = coordsToOffset(TexCoords, ${texNumR}, ${texNumC});\n float index = dot(vec3(row, col, offset_${name}), vec3(${shape[1]}, 1, 1));\n vec2 uv = vec2(0.5, (index + 0.5) / ${texNumR}.0);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n }\n\n if (texNumR === 1) {\n const source = `\n float ${funcName}(int row, int col) {\n int offset_${name} = coordsToOffset(TexCoords, ${texNumR}, ${texNumC});\n float index = dot(vec3(row, col, offset_${name}), vec3(${shape[1]}, 1, 1));\n vec2 uv = vec2((index + 0.5) / ${texNumC}.0, 0.5);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n }\n\n const source = `\n float ${funcName}(int row, int col) {\n int index = col * ${shape[1]} + row;\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(\n source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n }\n\n /**\n * Unpacked 3D snippet.\n */\n\n protected getUnpackedSampler3D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n const stride0 = shape[1] * shape[2];\n const stride1 = shape[2];\n\n const {newShape, keptDims} = squeezeShape(shape as number[]);\n const squeezedShape = newShape;\n if (squeezedShape.length < shape.length) {\n const newInputShape = squeezeInputShape(shape, squeezedShape);\n const params = ['batch', 'col', 'row'];\n // Deep copy of input texture layout.\n const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n newInputLayout.unpackedShape = newInputShape;\n const routine = this.getUnpackedSamplerFromInput(funcName, name, newInputLayout);\n // TODO: revisit the logic here to make it simpler\n const revDims = keptDims.reverse();\n const source = `\n ${routine.routineBody}\n float ${funcName}(int batch, int row, int col) {\n return ${funcName}(${getSqueezedParams(params, revDims)});\n }\n `;\n return new GlslLibRoutine(source, routine.dependencies);\n }\n\n const texNumR = inputLayout.width;\n const texNumC = inputLayout.height;\n const source = `\n float ${funcName}(int depth, int row, int col) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = depth * ${stride0} + col * ${stride1} + row;\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(\n source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n }\n\n /**\n * Unpacked 4D snippet.\n */\n\n protected getUnpackedSampler4D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n const stride2 = shape[3];\n const stride1 = shape[2] * stride2;\n const stride0 = shape[1] * stride1;\n\n //\n // TODO: re-enable this shortcut once the index calculation bug is fixed.\n //\n // const {newShape, keptDims} = squeezeShape(shape as number[]);\n // if (newShape.length < shape.length) {\n // const newInputShape = squeezeInputShape(shape, newShape);\n // const params = ['row', 'col', 'depth', 'depth2'];\n // // Deep copy of input texture layout.\n // const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n // newInputLayout.unpackedShape = newInputShape;\n // const source = `\n // ${this.getUnpackedSamplerFromInput(funcName, name, newInputLayout).routineBody}\n // float ${funcName}(int row, int col, int depth, int depth2) {\n // return ${funcName}(${getSqueezedParams(params, keptDims)});\n // }\n // `;\n // return new GlslLibRoutine(\n // source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n // }\n\n const texNumR = inputLayout.width;\n const texNumC = inputLayout.height;\n const source = `\n float ${funcName}(int row, int col, int depth, int depth2) {\n int index = row * ${stride0} + col * ${stride1} +\n depth2 * ${stride2} + depth;\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture']);\n }\n\n /**\n * Unpacked 5D snippet.\n */\n protected getUnpackedSampler5D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n const stride3 = shape[4];\n const stride2 = shape[3] * stride3;\n const stride1 = shape[2] * stride2;\n const stride0 = shape[1] * stride1;\n\n const {newShape, keptDims} = squeezeShape(shape as number[]);\n if (newShape.length < shape.length) {\n const newInputShape = squeezeInputShape(shape, newShape);\n const params = ['row', 'col', 'depth', 'depth2', 'depth3'];\n // Deep copy of input texture layout.\n const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n newInputLayout.unpackedShape = newInputShape;\n\n const source = `\n ${this.getUnpackedSamplerFromInput(funcName, name, newInputLayout).routineBody}\n float ${funcName}(int row, int col, int depth, int depth2, int depth3) {\n return ${funcName}(${getSqueezedParams(params, keptDims)});\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture', 'coordinates.uvFromFlat']);\n }\n\n const texNumR = inputLayout.width;\n const texNumC = inputLayout.height;\n const source = `\n float ${funcName}(int row, int col, int depth, int depth2, int depth3) {\n int index = row * ${stride0} + col * ${stride1} + depth * ${stride2} +\n depth3 * ${stride3} + depth2;\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture', 'coordinates.uvFromFlat']);\n }\n\n /**\n * Unpacked 6D snippet.\n */\n protected getUnpackedSampler6D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n const stride4 = shape[5];\n const stride3 = shape[4] * stride4;\n const stride2 = shape[3] * stride3;\n const stride1 = shape[2] * stride2;\n const stride0 = shape[1] * stride1;\n\n const {newShape, keptDims} = squeezeShape(shape as number[]);\n if (newShape.length < shape.length) {\n const newInputShape = squeezeInputShape(shape, newShape);\n const params = ['row', 'col', 'depth', 'depth2', 'depth3', 'depth4'];\n // Deep copy of input texture layout.\n const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n newInputLayout.unpackedShape = newInputShape;\n\n const source = `\n ${this.getUnpackedSamplerFromInput(funcName, name, newInputLayout).routineBody}\n float ${funcName}(int row, int col, int depth,\n int depth2, int depth3, int depth4) {\n return ${funcName}(${getSqueezedParams(params, keptDims)});\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture', 'coordinates.uvFromFlat']);\n }\n\n const texNumR = inputLayout.width;\n const texNumC = inputLayout.height;\n const source = `\n float ${funcName}(int row, int col, int depth,\n int depth2, int depth3, int depth4) {\n int index = row * ${stride0} + col * ${stride1} + depth * ${stride2} +\n depth2 * ${stride3} + depth3 * ${stride4} + depth4;\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(\n source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n }\n\n /**\n * This is the main function to map from the given texture coordinates (s,t)\n * to logical indices for the output\n * There will only be one single variation of this\n * Also see coordsToOffset and offsetToIndices for input-specific versions\n */\n protected toVec(): {[name: string]: GlslLibRoutine} {\n const output = this.context.outputTextureLayout;\n const rank = output.shape.length;\n const strides = output.strides;\n const xScale = output.width;\n const yScale = output.height;\n\n const stridesBlock = [];\n for (let i = 0; i < rank - 1; ++i) {\n stridesBlock.push(`\n c[${i}] = offset / ${strides[i]};`);\n stridesBlock.push(`\n offset -= c[${i}] * ${strides[i]};`);\n }\n stridesBlock.push(`\n c[${rank - 1}] = offset;`);\n const body = `\n void toVec(vec2 texCoords, out int c[${rank}]) {\n int offset = coordsToOffset(texCoords, ${xScale}, ${yScale});\n ${stridesBlock.join('')}\n }\n void toVec(int offset, out int c[${rank}]) {\n ${stridesBlock.join('')}\n }\n `;\n return {toVec: new GlslLibRoutine(body, ['coordinates.coordsToOffset'])};\n }\n /**\n * These are value getter functions generated for each input\n * Each function is hardwired to the name and dimensions of the input\n * An '_T' variation is also produced which accesses values as if the\n * input was transposed\n */\n protected valueFrom(): {[name: string]: GlslLibRoutine} {\n const result: {[name: string]: GlslLibRoutine} = {};\n this.context.programInfo.inputNames.forEach((name, i) => {\n const layout = this.context.inputTextureLayouts[i];\n const shape = layout.unpackedShape.length > 0 ? layout.unpackedShape : layout.shape;\n const rank = shape.length;\n let funcName = `_${name}`;\n result[funcName] = new GlslLibRoutine(\n this.getValueFromSingle(name, rank, layout.width, layout.height, false),\n [`shapeUtils.indicesToOffset${funcName}`, 'coordinates.offsetToCoords', 'fragcolor.getColorAsFloat']);\n funcName = funcName + '_T';\n result[funcName] = new GlslLibRoutine(\n this.getValueFromSingle(name, rank, layout.width, layout.height, true),\n [`shapeUtils.indicesToOffset${funcName}`, 'coordinates.offsetToCoords', 'fragcolor.getColorAsFloat']);\n });\n return result;\n }\n /**\n * Produces one value getter function for the name and rank given\n * If a transpose is set proper offsetToCoords mapping will be used\n * @param name name of the function\n * @param rank rank of the input\n * @param transpose whether or not should generate a transpose variation\n */\n protected getValueFromSingle(varName: string, rank: number, width: number, height: number, transpose: boolean):\n string {\n let name = `_${varName}`;\n if (transpose) {\n name = name + '_T';\n }\n const glsl = getGlsl(this.context.glContext.version);\n return `\n float ${name}(int m[${rank}]) {\n int offset = indicesToOffset${name}(m);\n vec2 coords = offsetToCoords(offset, ${width}, ${height});\n float value = getColorAsFloat(${glsl.texture2D}(${varName}, coords));\n return value;\n }\n `;\n }\n\n /**\n * Produces a packed value getter function for the name and rank given\n * If a transpose is set proper offsetToCoords mapping will be used\n * @param name name of the function\n * @param rank rank of the input\n * @param transpose whether or not should generate a transpose variation\n */\n protected getPackedValueFrom(varName: string, rank: number, width: number, height: number, transpose: boolean):\n string {\n let name = `_${varName}_Pack`;\n if (transpose) {\n name = name + '_T';\n }\n const glsl = getGlsl(this.context.glContext.version);\n return `\n vec4 ${name}(int m[${rank}]) {\n int offset = indicesToOffset_${varName}(m);\n vec2 coords = offsetToCoords(offset, ${width}, ${height});\n return ${glsl.texture2D}(${varName}, coords);\n }\n `;\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {GlslContext, GlslLib, GlslLibRoutine} from './glsl-definitions';\n\n/**\n * This GLSL library handles routines converting\n * float32 to/from Unsigned byte or float 16\n */\nexport class EncodingGlslLib extends GlslLib {\n constructor(context: GlslContext) {\n super(context);\n }\n getFunctions(): {[name: string]: GlslLibRoutine} {\n return {...this.encodeFloat32(), ...this.decodeFloat32()};\n }\n getCustomTypes(): {[name: string]: string} {\n return {};\n }\n protected encodeFloat32(): {[name: string]: GlslLibRoutine} {\n return {\n encode: new GlslLibRoutine(`highp vec4 encode(highp float f) {\n return vec4(f, 0.0, 0.0, 0.0);\n }\n `)\n };\n }\n protected decodeFloat32(): {[name: string]: GlslLibRoutine} {\n return {\n decode: new GlslLibRoutine(`highp float decode(highp vec4 rgba) {\n return rgba.r;\n }\n `)\n };\n }\n /**\n * returns the routine to encode encode a 32bit float to a vec4 (of unsigned bytes)\n * @credit: https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float\n */\n protected encodeUint8(): {[name: string]: GlslLibRoutine} {\n const endianness = EncodingGlslLib.isLittleEndian() ? 'rgba.rgba=rgba.abgr;' : '';\n return {\n encode: new GlslLibRoutine(`\n highp vec4 encode(highp float f) {\n highp float F = abs(f);\n highp float Sign = step(0.0,-f);\n highp float Exponent = floor(log2(F));\n highp float Mantissa = (exp2(- Exponent) * F);\n Exponent = floor(log2(F) + 127.0) + floor(log2(Mantissa));\n highp vec4 rgba;\n rgba[0] = 128.0 * Sign + floor(Exponent*exp2(-1.0));\n rgba[1] = 128.0 * mod(Exponent,2.0) + mod(floor(Mantissa*128.0),128.0);\n rgba[2] = floor(mod(floor(Mantissa*exp2(23.0 -8.0)),exp2(8.0)));\n rgba[3] = floor(exp2(23.0)*mod(Mantissa,exp2(-15.0)));\n ${endianness}\n rgba = rgba / 255.0; // values need to be normalized to [0,1]\n return rgba;\n }\n `)\n };\n }\n /**\n * returns the routine to encode a vec4 of unsigned bytes to float32\n * @credit: https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float\n */\n protected decodeUint8(): {[name: string]: GlslLibRoutine} {\n const endianness = EncodingGlslLib.isLittleEndian() ? 'rgba.rgba=rgba.abgr;' : '';\n return {\n decode: new GlslLibRoutine(`\n highp float decode(highp vec4 rgba) {\n rgba = rgba * 255.0; // values need to be de-normalized from [0,1] to [0,255]\n ${endianness}\n highp float Sign = 1.0 - step(128.0,rgba[0])*2.0;\n highp float Exponent = 2.0 * mod(rgba[0],128.0) + step(128.0,rgba[1]) - 127.0;\n highp float Mantissa = mod(rgba[1],128.0)*65536.0 + rgba[2]*256.0 +rgba[3] + float(0x800000);\n highp float Result = Sign * exp2(Exponent) * (Mantissa * exp2(-23.0 ));\n return Result;\n }\n `)\n };\n }\n /**\n * Determines if the machine is little endian or not\n * @credit: https://gist.github.com/TooTallNate/4750953\n */\n static isLittleEndian(): boolean {\n const b = new ArrayBuffer(4);\n const a = new Uint32Array(b);\n const c = new Uint8Array(b);\n a[0] = 0xdeadbeef;\n if (c[0] === 0xef) {\n return true;\n }\n if (c[0] === 0xde) {\n return false;\n }\n throw new Error('unknown endianness');\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {GlslContext, GlslLib, GlslLibRoutine} from './glsl-definitions';\nimport {getGlsl} from './glsl-source';\n\n/**\n * This GLSL library handles routines around reading a texlet and writing to it\n * Reading and writing could be more than just dealing with one channel\n * It may require encoding/decoding to/from 4 channels into one\n */\nexport class FragColorGlslLib extends GlslLib {\n constructor(context: GlslContext) {\n super(context);\n }\n getFunctions(): {[name: string]: GlslLibRoutine} {\n return {...this.setFragColor(), ...this.getColorAsFloat()};\n }\n getCustomTypes(): {[name: string]: string} {\n return {};\n }\n protected setFragColor(): {[name: string]: GlslLibRoutine} {\n const glsl = getGlsl(this.context.glContext.version);\n return {\n setFragColor: new GlslLibRoutine(\n `\n void setFragColor(float value) {\n ${glsl.output} = encode(value);\n }\n `,\n ['encoding.encode'])\n };\n }\n protected getColorAsFloat(): {[name: string]: GlslLibRoutine} {\n return {\n getColorAsFloat: new GlslLibRoutine(\n `\n float getColorAsFloat(vec4 color) {\n return decode(color);\n }\n `,\n ['encoding.decode'])\n };\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {GlslContext, GlslLib, GlslLibRoutine} from './glsl-definitions';\n\n/**\n * GLSL Library responsible for data types and routines for manipulating\n * coordinates and mapping to/from tensor indices\n */\nexport class ShapeUtilsGlslLib extends GlslLib {\n constructor(context: GlslContext) {\n super(context);\n }\n getFunctions(): {[name: string]: GlslLibRoutine} {\n return {\n ...this.bcastIndex(),\n ...this.bcastMatmulIndex(),\n ...this.offsetToIndices(),\n ...this.indicesToOffset(),\n ...this.incrementIndices()\n };\n }\n getCustomTypes() {\n return {};\n }\n protected bcastIndex(): {[name: string]: GlslLibRoutine} {\n const outputRank = this.context.outputTextureLayout.shape.length;\n const result: {[name: string]: GlslLibRoutine} = {};\n this.context.programInfo.inputNames.forEach((name, i) => {\n const shape = this.context.inputTextureLayouts[i].unpackedShape;\n if (shape.length <= outputRank) {\n const rank = shape.length;\n const dimOffset = outputRank - rank;\n const funcName = `bcastIndices_${name}`;\n let block = '';\n for (let i = 0; i < rank; ++i) {\n block += `\n realIndices[${i}] = int( mod(float(bcastedIndices[${dimOffset + i}]), ${shape[i]}.0) );\n `;\n }\n const body = `\n void ${funcName} (int bcastedIndices[${outputRank}], out int realIndices[${rank}]) {\n ${block}\n }\n `;\n result[funcName] = new GlslLibRoutine(body);\n }\n });\n return result;\n }\n protected bcastMatmulIndex(): {[name: string]: GlslLibRoutine} {\n const outputRank = this.context.outputTextureLayout.shape.length;\n const result: {[name: string]: GlslLibRoutine} = {};\n this.context.programInfo.inputNames.forEach((name, i) => {\n const shape = this.context.inputTextureLayouts[i].shape;\n if (!(shape.length < 2 || shape.length > outputRank)) {\n const rank = shape.length;\n const dimOffset = outputRank - rank;\n const funcName = `bcastMatmulIndices_${name}`;\n let block = '';\n for (let i = 0; i < rank - 2; ++i) {\n block += `\n realIndices[${i}] = int( mod(float(bcastedIndices[${dimOffset + i}]), ${shape[i]}.0) );\n `;\n }\n const body = `\n void ${funcName}(int bcastedIndices[${outputRank}], out int realIndices[${rank}]) {\n ${block}\n realIndices[${rank - 1}] = bcastedIndices[${outputRank - 1}];\n realIndices[${rank - 2}] = bcastedIndices[${outputRank - 2}];\n }\n `;\n result[funcName] = new GlslLibRoutine(body);\n }\n });\n return result;\n }\n protected indicesToOffset(): {[name: string]: GlslLibRoutine} {\n const result: {[name: string]: GlslLibRoutine} = {};\n this.context.programInfo.inputNames.forEach((name, i) => {\n const shape = this.context.inputTextureLayouts[i].shape;\n const strides = this.context.inputTextureLayouts[i].strides;\n const rank = shape.length;\n let funcName = `indicesToOffset_${name}`;\n result[funcName] = new GlslLibRoutine(ShapeUtilsGlslLib.indexToOffsetSingle(funcName, rank, strides));\n funcName = `indicesToOffset_${name}_T`;\n result[funcName] =\n new GlslLibRoutine(ShapeUtilsGlslLib.indexToOffsetSingle(funcName, rank, strides.slice().reverse()));\n });\n return result;\n }\n static indexToOffsetSingle(name: string, rank: number, strides: readonly number[]): string {\n let block = '';\n for (let i = rank - 1; i >= 0; --i) {\n block += `\n offset += indices[${i}] * ${strides[i]};\n `;\n }\n return `\n int ${name}(int indices[${rank}]) {\n int offset = 0;\n ${block}\n return offset;\n }\n `;\n }\n protected offsetToIndices(): {[name: string]: GlslLibRoutine} {\n const result: {[name: string]: GlslLibRoutine} = {};\n this.context.programInfo.inputNames.forEach((name, i) => {\n const shape = this.context.inputTextureLayouts[i].shape;\n const strides = this.context.inputTextureLayouts[i].strides;\n const rank = shape.length;\n let funcName = `offsetToIndices_${name}`;\n result[funcName] = new GlslLibRoutine(ShapeUtilsGlslLib.offsetToIndicesSingle(funcName, rank, strides));\n funcName = `offsetToIndices_${name}_T`;\n result[funcName] =\n new GlslLibRoutine(ShapeUtilsGlslLib.offsetToIndicesSingle(funcName, rank, strides.slice().reverse()));\n });\n return result;\n }\n static offsetToIndicesSingle(name: string, rank: number, strides: readonly number[]): string {\n const stridesBlock = [];\n for (let i = 0; i < rank - 1; ++i) {\n stridesBlock.push(`\n indices[${i}] = offset / ${strides[i]};`);\n stridesBlock.push(`\n offset -= indices[${i}] * ${strides[i]};`);\n }\n stridesBlock.push(`\n indices[${rank - 1}] = offset;`);\n return `\n void ${name}(int offset, out int indices[${rank}]) {\n ${stridesBlock.join('')}\n }\n `;\n }\n protected incrementIndices(): {[name: string]: GlslLibRoutine} {\n const result: {[name: string]: GlslLibRoutine} = {};\n this.context.programInfo.inputNames.forEach((name, i) => {\n const shape = this.context.inputTextureLayouts[i].shape;\n const rank = shape.length;\n const funcName = `incrementIndices_${name}`;\n let shapeInit = '';\n for (let i = 0; i < rank; ++i) {\n shapeInit += `\n shape[${i}] = ${shape[i]};`;\n }\n const body = `\n void ${funcName}(int axis, out int indices[${rank}]) {\n int shape[${rank}];\n ${shapeInit};\n for(int i = ${rank} -1 ; i >= 0; --i) {\n if(i > axis) continue;\n indices[i] += 1;\n if(indices[i] < shape[i]) {\n break;\n }\n indices[i] = 0;\n }\n }\n `;\n result[funcName] = new GlslLibRoutine(body);\n });\n return result;\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {GlslContext, GlslLib, GlslLibRoutine} from './glsl-definitions';\n\n/**\n * GLSL Library responsible for vec routines\n * Vec is an varible length int array. The length is fixed at the time of\n * generating the library functions from the dimensions of the output.\n */\nexport class VecGlslLib extends GlslLib {\n constructor(context: GlslContext) {\n super(context);\n }\n getCustomTypes(): {[name: string]: string} {\n return {};\n }\n getFunctions(): {[name: string]: GlslLibRoutine} {\n return {...this.binaryVecFunctions(), ...this.copyVec(), ...this.setVecItem(), ...this.getVecItem()};\n }\n protected binaryVecFunctions(): {[name: string]: GlslLibRoutine} {\n const outputLayout = this.context.outputTextureLayout;\n const rank = outputLayout.shape.length;\n const nameOp: {[name: string]: string} = {add: '+=', sub: '-=', mul: '*=', div: '/='};\n const result: {[name: string]: GlslLibRoutine} = {};\n for (const name in nameOp) {\n const fname = `${name}Vec`;\n let assignmentBlock = '';\n for (let i = 0; i < rank; ++i) {\n assignmentBlock += `\n dest[${i}] ${nameOp[name]} src[${i}];\n `;\n }\n const body = `\n void ${fname}(int src[${rank}], out int dest[${rank}]) {\n ${assignmentBlock}\n }\n `;\n result[fname] = new GlslLibRoutine(body);\n }\n\n return result;\n }\n protected copyVec(): {[name: string]: GlslLibRoutine} {\n const outputLayout = this.context.outputTextureLayout;\n const rank = outputLayout.shape.length;\n let assignmentBlock = '';\n for (let i = 0; i < rank; ++i) {\n assignmentBlock += `\n dest[${i}] = src[${i}];\n `;\n }\n const body = `\n void copyVec(int src[${rank}], out int dest[${rank}]) {\n ${assignmentBlock}\n }\n `;\n return {copyVec: new GlslLibRoutine(body)};\n }\n\n protected setVecItem(): {[name: string]: GlslLibRoutine} {\n const outputLayout = this.context.outputTextureLayout;\n const rank = outputLayout.shape.length;\n let block = `\n if(index < 0)\n index =${rank} + index;\n if (index == 0)\n m[0] = value;\n `;\n for (let i = 1; i < rank - 1; ++i) {\n block += `\n else if (index == ${i})\n m[${i}] = value;\n `;\n }\n block += `\n else\n m[${rank - 1}] = value;\n `;\n const body = `\n void setVecItem(out int m[${rank}], int index, int value) {\n ${block}\n }\n `;\n return {setVecItem: new GlslLibRoutine(body)};\n }\n protected getVecItem(): {[name: string]: GlslLibRoutine} {\n const outputLayout = this.context.outputTextureLayout;\n const rank = outputLayout.shape.length;\n let block = `\n if(index < 0)\n index = ${rank} + index;\n if (index == 0)\n return m[0];\n `;\n for (let i = 1; i < rank - 1; ++i) {\n block += `\n else if (index == ${i})\n return m[${i}];\n `;\n }\n block += `\n else\n return m[${rank - 1}];\n `;\n const body = `\n int getVecItem(int m[${rank}], int index) {\n ${block}\n }\n `;\n return {getVecItem: new GlslLibRoutine(body)};\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {CoordsGlslLib} from './glsl-coordinate-lib';\nimport {GlslContext, GlslLib} from './glsl-definitions';\nimport {EncodingGlslLib} from './glsl-encoding-lib';\nimport {FragColorGlslLib} from './glsl-fragcolor-lib';\nimport {ShapeUtilsGlslLib} from './glsl-shape-utils-lib';\nimport {VecGlslLib} from './glsl-vec-lib';\n\nexport const glslRegistry: {[name: string]: new (context: GlslContext) => GlslLib} = {\n 'encoding': EncodingGlslLib,\n 'fragcolor': FragColorGlslLib,\n 'vec': VecGlslLib,\n 'shapeUtils': ShapeUtilsGlslLib,\n 'coordinates': CoordsGlslLib,\n // 'arrays': ArrayGlslSLib\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {GlslContext, GlslLib, GlslLibRoutineNode, TopologicalSortGlslRoutines} from './glsl-definitions';\nimport {replaceInlines} from './glsl-function-inliner';\nimport {glslRegistry} from './glsl-registered-libs';\nimport {getDefaultFragShaderMain, getFragShaderPreamble} from './glsl-source';\nimport {ProgramInfo, TextureLayout, VariableInfo} from './types';\nimport {WebGLContext} from './webgl-context';\n\n/**\n * Preprocessor for the additions to the GLSL language\n * It deals with:\n * @include directives\n * @inline\n * Loop unrolling (not implemented)\n * Macro resolution (not implemented)\n */\nexport class GlslPreprocessor {\n readonly context: GlslContext;\n readonly libs: {[name: string]: GlslLib} = {};\n readonly glslLibRoutineDependencyGraph: {[routineName: string]: GlslLibRoutineNode} = {};\n\n constructor(\n glContext: WebGLContext, programInfo: ProgramInfo, inputTextureLayouts: TextureLayout[],\n outputTextureLayout: TextureLayout) {\n this.context = new GlslContext(glContext, programInfo, inputTextureLayouts, outputTextureLayout);\n\n // construct GlslLibs\n Object.keys(glslRegistry).forEach((name: string) => {\n const lib = new glslRegistry[name](this.context);\n this.libs[name] = lib;\n });\n\n // construct GlslRoutineDependencyGraph\n const map = this.glslLibRoutineDependencyGraph;\n for (const libName in this.libs) {\n const lib = this.libs[libName];\n const routinesInLib = lib.getFunctions();\n for (const routine in routinesInLib) {\n const key = libName + '.' + routine;\n let currentNode: GlslLibRoutineNode;\n if (map[key]) {\n currentNode = map[key];\n currentNode.routineBody = routinesInLib[routine].routineBody;\n } else {\n currentNode = new GlslLibRoutineNode(key, routinesInLib[routine].routineBody);\n map[key] = currentNode;\n }\n const dependencies = routinesInLib[routine].dependencies;\n if (dependencies) {\n for (let i = 0; i < dependencies.length; ++i) {\n if (!map[dependencies[i]]) {\n const node = new GlslLibRoutineNode(dependencies[i]);\n map[dependencies[i]] = node;\n currentNode.addDependency(node);\n } else {\n currentNode.addDependency(map[dependencies[i]]);\n }\n }\n }\n }\n }\n }\n\n preprocess(): string {\n const programInfo = this.context.programInfo;\n let source = programInfo.shaderSource;\n\n // append main() function\n if (!this.context.programInfo.hasMain) {\n source = `${source}\n ${getDefaultFragShaderMain(this.context.glContext.version, this.context.outputTextureLayout.shape.length)}`;\n }\n // replace inlines\n source = replaceInlines(source);\n\n // concat final source string\n return `${getFragShaderPreamble(this.context.glContext.version)}\n ${this.getUniforms(programInfo.inputNames, programInfo.variables)}\n ${this.getImports(source)}\n ${source}`;\n }\n\n protected getImports(script: string): string {\n const routinesIncluded = this.selectGlslLibRoutinesToBeIncluded(script);\n\n if (routinesIncluded.length === 0) {\n return '';\n }\n\n let routines = '';\n for (let i = 0; i < routinesIncluded.length; ++i) {\n if (routinesIncluded[i].routineBody) {\n routines += routinesIncluded[i].routineBody + '\\n';\n } else {\n throw new Error(`Missing body for the Glsl Library routine: ${routinesIncluded[i].name}`);\n }\n }\n\n return routines;\n }\n private selectGlslLibRoutinesToBeIncluded(script: string): GlslLibRoutineNode[] {\n const nodes: GlslLibRoutineNode[] = [];\n\n Object.keys(this.glslLibRoutineDependencyGraph).forEach(classAndRoutine => {\n const routine = classAndRoutine.split('.')[1];\n if (script.indexOf(routine) !== -1) {\n nodes.push(this.glslLibRoutineDependencyGraph[classAndRoutine]);\n }\n });\n\n return TopologicalSortGlslRoutines.returnOrderedNodes(nodes);\n }\n\n protected getUniforms(samplers?: string[], variables?: VariableInfo[]): string {\n const uniformLines: string[] = [];\n if (samplers) {\n for (const sampler of samplers) {\n uniformLines.push(`uniform sampler2D ${sampler};`);\n }\n }\n if (variables) {\n for (const variable of variables) {\n uniformLines.push(\n `uniform ${variable.type} ${variable.name}${variable.arrayLength ? `[${variable.arrayLength}]` : ''};`);\n }\n }\n return uniformLines.join('\\n');\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport {Logger, Profiler} from '../../instrument';\n\nimport {GlslPreprocessor} from './glsl-preprocessor';\nimport {getVertexShaderSource} from './glsl-source';\nimport {TextureLayoutStrategy} from './texture-layout-strategy';\nimport {Artifact, ProgramInfo, ProgramVariable, TextureData, TextureLayout, VariableInfo} from './types';\nimport {WebGLContext} from './webgl-context';\n\n/**\n * ProgramManager is the main class behind running computations\n * It builds ProgramInfo's into Artifacts\n * It compiles given ProgramInfo's into WebGL Prorams (cached as Artifacts)\n * Uses the artifact to run the computation by calling Draw on\n * the WebGL drawing buffer\n * ProgramManager automatically maps (binds) input variables to their\n * corresponding Location's in the binary program\n */\nexport class ProgramManager {\n repo: Map; // this should be per-session object\n vertexShader: WebGLShader;\n attributesBound: boolean;\n\n constructor(\n public profiler: Readonly, public glContext: WebGLContext,\n public textureLayoutStrategy: TextureLayoutStrategy) {\n this.repo = new Map();\n this.attributesBound = false;\n }\n getArtifact(key: unknown): Artifact|undefined {\n return this.repo.get(key);\n }\n setArtifact(key: unknown, artifact: Artifact): void {\n this.repo.set(key, artifact);\n }\n run(buildArtifact: Artifact, inputs: TextureData[], output: TextureData): void {\n this.profiler.event('op', `ProgramManager.run ${buildArtifact.programInfo.name ?? 'unknown kernel'}`, () => {\n const gl = this.glContext.gl;\n const program = buildArtifact.program;\n gl.useProgram(program);\n try {\n this.bindOutput(output);\n if (!this.attributesBound) {\n this.bindAttributes(buildArtifact.attribLocations);\n }\n this.bindUniforms(buildArtifact.uniformLocations, buildArtifact.programInfo.variables ?? [], inputs);\n } catch (err) {\n Logger.error('ProgramManager', buildArtifact.programInfo.shaderSource);\n throw err;\n }\n this.profiler.event('backend', 'GlContext.draw()', () => {\n this.glContext.draw();\n });\n }, this.glContext);\n }\n dispose(): void {\n if (this.vertexShader) {\n this.glContext.deleteShader(this.vertexShader);\n }\n this.repo.forEach(a => this.glContext.deleteProgram(a.program));\n }\n build(programInfo: ProgramInfo, inputTextureLayouts: TextureLayout[], outputTextureLayout: TextureLayout): Artifact {\n return this.profiler.event('backend', 'ProgramManager.build', () => {\n const preprocessor = new GlslPreprocessor(this.glContext, programInfo, inputTextureLayouts, outputTextureLayout);\n const fragScript = preprocessor.preprocess();\n const program = this.compile(fragScript);\n const artifact = {\n programInfo,\n program,\n uniformLocations: this.getUniformLocations(\n program, preprocessor.context.programInfo.inputNames, preprocessor.context.programInfo.variables),\n attribLocations: this.getAttribLocations(program)\n };\n return artifact;\n });\n }\n protected compile(fragShaderScript: string): WebGLProgram {\n if (!this.vertexShader) {\n Logger.verbose('ProrgramManager', 'Compiling and caching Vertex shader for the first time');\n const vertexShaderScript = getVertexShaderSource(this.glContext.version);\n this.vertexShader = this.glContext.compileShader(vertexShaderScript, this.glContext.gl.VERTEX_SHADER);\n }\n if (env.debug) {\n Logger.verbose('ProrgramManager', `FragShader:\n${fragShaderScript}\n`);\n }\n const fragShader = this.glContext.compileShader(fragShaderScript, this.glContext.gl.FRAGMENT_SHADER);\n const program = this.glContext.createProgram(this.vertexShader, fragShader);\n this.glContext.deleteShader(fragShader);\n return program;\n }\n bindOutput(td: TextureData): void {\n const width = td.width;\n const height = td.height;\n Logger.verbose(\n 'ProrgramManager',\n `Binding output texture to Framebuffer: w/h=${width}/${height}, shape=${td.shape}, type=${td.tensor.type}`);\n this.glContext.attachFramebuffer(td.texture, width, height);\n }\n bindAttributes(attribLocations: Artifact.AttribLocations): void {\n const positionHandle = attribLocations.position;\n const textureCoordHandle = attribLocations.textureCoord;\n this.glContext.setVertexAttributes(positionHandle, textureCoordHandle);\n this.attributesBound = true;\n }\n bindUniforms(uniformLocations: Artifact.UniformLocations, variables: ProgramVariable[], textures: TextureData[]):\n void {\n const gl = this.glContext.gl;\n let texturePosition = 0;\n for (const {name, type, location, arrayLength} of uniformLocations) {\n const value = variables.find(v => v.name === name)?.data;\n if (type !== 'sampler2D' && !value) {\n throw new Error(`variable '${name}' does not have data defined in program info`);\n }\n switch (type) {\n case 'sampler2D':\n this.bindTexture(textures[texturePosition], location, texturePosition);\n texturePosition++;\n break;\n case 'float':\n if (arrayLength) {\n gl.uniform1fv(location, value as number[]);\n } else {\n gl.uniform1f(location, value as number);\n }\n break;\n case 'int':\n if (arrayLength) {\n gl.uniform1iv(location, value as number[]);\n } else {\n gl.uniform1i(location, value as number);\n }\n break;\n default:\n throw new Error(`Uniform not implemented: ${type}`);\n }\n }\n }\n bindTexture(td: TextureData, uniformHandle: WebGLUniformLocation, position: number): void {\n this.glContext.bindTextureToUniform(td.texture, position, uniformHandle);\n }\n getAttribLocations(program: WebGLProgram): Artifact.AttribLocations {\n return {\n position: this.getAttribLocation(program, 'position'),\n textureCoord: this.getAttribLocation(program, 'textureCoord')\n };\n }\n getUniformLocations(program: WebGLProgram, samplers?: string[], variables?: VariableInfo[]):\n Artifact.UniformLocations {\n const uniformLocations: Artifact.UniformLocations = [];\n if (samplers) {\n for (const sampler of samplers) {\n uniformLocations.push({name: sampler, type: 'sampler2D', location: this.getUniformLocation(program, sampler)});\n }\n }\n if (variables) {\n for (const variable of variables) {\n uniformLocations.push({...variable, location: this.getUniformLocation(program, variable.name)});\n }\n }\n return uniformLocations;\n }\n getUniformLocation(program: WebGLProgram, name: string): WebGLUniformLocation {\n const gl = this.glContext.gl;\n const reference = gl.getUniformLocation(program, name);\n if (reference === null) {\n throw new Error(`Uniform ${name} not found.`);\n }\n return reference;\n }\n getAttribLocation(program: WebGLProgram, name: string): number {\n const gl = this.glContext.gl;\n const attributeLocation: number = gl.getAttribLocation(program, name);\n return attributeLocation;\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Logger, Profiler} from '../../instrument';\nimport {Tensor} from '../../tensor';\n\nimport {Encoder, EncoderUsage} from './texture-data-encoder';\nimport {TextureLayoutStrategy} from './texture-layout-strategy';\nimport {TextureData, TextureLayout} from './types';\nimport {WebGLContext} from './webgl-context';\n\nexport interface TextureManagerConfig {\n reuseTextures?: boolean;\n}\n\n/**\n * TextureManager is the mainly responsible for caching Textures\n * Textures are cached in 2 levels:\n * 1. the texures which are associated with a dataId (from Tensor)\n * Caching these is crucial to performance. These are In-use Textures\n * 2. textures which are not in use by any current ProgramInfo/Tensor\n * These are called Free Textures\n * TextureManager is also used to help creating textures. For this it\n * uses WebGLContext and TextureLayoutStrategy\n */\nexport class TextureManager {\n private readonly inUseTextures: Map;\n private readonly idleTextures: Map;\n private readonly textureLookup: Map;\n private readonly pendingRead: Map void>> = new Map();\n\n constructor(\n public glContext: WebGLContext, public layoutStrategy: TextureLayoutStrategy, public profiler: Readonly,\n private config: TextureManagerConfig) {\n if (config.reuseTextures) {\n this.inUseTextures = new Map();\n this.idleTextures = new Map();\n this.textureLookup = new Map();\n }\n }\n createTextureFromLayout(\n dataType: Tensor.DataType, layout: TextureLayout, data?: Tensor.NumberType, usage?: EncoderUsage) {\n const textureDataType = this.toEncoderType(dataType);\n\n const encoder = this.glContext.getEncoder(textureDataType, layout.channels || 1, usage);\n if (layout.isPacked && usage === EncoderUsage.UploadOnly) {\n throw new Error('not implemented');\n }\n const width = layout.width;\n const height = layout.height;\n\n let key: string|undefined;\n let inUseTextures: WebGLTexture[]|undefined;\n if (this.config.reuseTextures) {\n key = `${width}x${height}_${encoder.format}_${encoder.internalFormat}_${encoder.textureType}`;\n inUseTextures = this.inUseTextures.get(key);\n if (!inUseTextures) {\n inUseTextures = [];\n this.inUseTextures.set(key, inUseTextures);\n }\n\n const idleTextures = this.idleTextures.get(key);\n if (idleTextures && idleTextures.length > 0) {\n const texture = idleTextures.pop()!;\n inUseTextures.push(texture);\n if (usage === EncoderUsage.UploadOnly) {\n this.glContext.updateTexture(texture, width, height, encoder, this.toTextureData(dataType, data)!);\n }\n return texture;\n }\n }\n\n Logger.verbose('TextureManager', `Creating new texture of size ${layout.width}x${layout.height}`);\n const texture = this.glContext.allocateTexture(width, height, encoder, this.toTextureData(dataType, data));\n\n if (this.config.reuseTextures) {\n inUseTextures!.push(texture);\n this.textureLookup.set(texture, key!);\n }\n return texture;\n }\n readTexture(td: TextureData, dataType: Tensor.DataType, channels?: number): Tensor.NumberType {\n if (!channels) {\n channels = 1;\n }\n return this.profiler.event('backend', 'TextureManager.readTexture', () => {\n const dataSize = td.shape.reduce((a, b) => a * b) * channels!;\n const data = this.glContext.readTexture(\n td.texture, td.width, td.height, dataSize, this.toEncoderType(dataType), channels!);\n return this.toTensorData(dataType, data);\n });\n }\n async readTextureAsync(td: TextureData, dataType: Tensor.DataType, channels?: number): Promise {\n const dataId = td.tensor.dataId;\n if (!channels) {\n channels = 1;\n }\n if (this.pendingRead.has(dataId)) {\n const subscribers = this.pendingRead.get(dataId);\n return new Promise(resolve => subscribers?.push(resolve));\n }\n return this.profiler.event('backend', 'TextureManager.readTextureAsync', async () => {\n this.pendingRead.set(dataId, []);\n const dataSize = td.shape.reduce((a, b) => a * b) * channels!;\n // add a fence waiting for the data to be ready\n await this.glContext.createAndWaitForFence();\n const data = this.glContext.readTexture(\n td.texture, td.width, td.height, dataSize, this.toEncoderType(dataType), channels!);\n const tensorData = this.toTensorData(dataType, data);\n const subscribers = this.pendingRead.get(dataId);\n this.pendingRead.delete(dataId);\n subscribers?.forEach(resolve => resolve(tensorData));\n return tensorData;\n });\n }\n readUint8TextureAsFloat(td: TextureData): Float32Array {\n return this.profiler.event('backend', 'TextureManager.readUint8TextureAsFloat', () => {\n const dataSize = td.shape.reduce((a, b) => a * b);\n const data = this.glContext.readTexture(td.texture, td.width, td.height, dataSize * 4, 'byte', 4);\n return new Float32Array(data.buffer, data.byteOffset, dataSize);\n });\n }\n releaseTexture(textureData: TextureData, deleteTexture?: boolean): void {\n let key: string|undefined;\n if (this.config.reuseTextures) {\n key = this.textureLookup.get(textureData.texture);\n if (key) {\n if (deleteTexture) {\n this.textureLookup.delete(key);\n }\n const inUseTextures = this.inUseTextures.get(key);\n if (inUseTextures) {\n const index = inUseTextures.indexOf(textureData.texture);\n if (index !== -1) {\n inUseTextures.splice(index, 1);\n let idleTextures = this.idleTextures.get(key);\n if (!idleTextures) {\n idleTextures = [];\n this.idleTextures.set(key, idleTextures);\n }\n idleTextures.push(textureData.texture);\n }\n }\n }\n }\n\n if (!key || deleteTexture) {\n Logger.verbose('TextureManager', `Deleting texture of size ${textureData.width}x${textureData.height}`);\n this.glContext.deleteTexture(textureData.texture);\n }\n }\n toTensorData(dataType: Tensor.DataType, data: Encoder.DataArrayType): Tensor.NumberType {\n switch (dataType) {\n case 'int16':\n return data instanceof Int16Array ? data : Int16Array.from(data);\n case 'int32':\n return data instanceof Int32Array ? data : Int32Array.from(data);\n case 'int8':\n return data instanceof Int8Array ? data : Int8Array.from(data);\n case 'uint16':\n return data instanceof Uint16Array ? data : Uint16Array.from(data);\n case 'uint32':\n return data instanceof Uint32Array ? data : Uint32Array.from(data);\n case 'uint8':\n case 'bool':\n return data instanceof Uint8Array ? data : Uint8Array.from(data);\n case 'float32':\n return data instanceof Float32Array ? data : Float32Array.from(data);\n case 'float64':\n return data instanceof Float64Array ? data : Float64Array.from(data);\n default:\n throw new Error(`TensorData type ${dataType} is not supported`);\n }\n }\n toTextureData(_dataType: Tensor.DataType, data: Tensor.NumberType|undefined): Encoder.DataArrayType|undefined {\n if (!data) {\n return undefined;\n }\n return (data instanceof Float32Array) ? data : new Float32Array(data);\n /*\n switch (dataType) {\n case 'int16':\n case 'int32':\n case 'uint16':\n case 'uint32':\n return (data.constructor === Uint32Array) ? data as Uint32Array : new Uint32Array(data);\n case 'int8':\n case 'uint8':\n case 'bool':\n return (data.constructor === Uint8Array) ? data as Uint8Array : new Uint8Array(data);\n case 'float32':\n case 'float64':\n return (data.constructor === Float32Array) ? data as Float32Array : new Float32Array(data);\n default:\n throw new Error(`TensorData type ${dataType} is not supported`);\n }\n */\n }\n toEncoderType(_dataType: Tensor.DataType): Encoder.DataType {\n return 'float';\n // switch (dataType) {\n // case 'int16':\n // case 'int32':\n // case 'uint16':\n // case 'uint32':\n // return 'int';\n // case 'uint8':\n // case 'bool':\n // return 'byte';\n // case 'float32':\n // case 'float64':\n // return 'float';\n // default:\n // throw new Error(`TensorData type ${dataType} is not supported`);\n // }\n }\n clearActiveTextures(): void {\n this.glContext.clearActiveTextures();\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {SessionHandler} from '../../backend';\nimport {Graph} from '../../graph';\nimport {Logger} from '../../instrument';\nimport {Operator} from '../../operators';\nimport {OpSet, resolveOperator} from '../../opset';\nimport {Session} from '../../session';\nimport {Tensor} from '../../tensor';\nimport {WebGLBackend} from '../backend-webgl';\n\nimport {WebGLInferenceHandler} from './inference-handler';\nimport {WEBGL_OP_RESOLVE_RULES} from './op-resolve-rules';\nimport {ProgramManager} from './program-manager';\nimport {PreferLogicalStrategy, TextureLayoutStrategy} from './texture-layout-strategy';\nimport {TextureManager} from './texture-manager';\nimport {TextureData} from './types';\n\nexport class WebGLSessionHandler implements SessionHandler {\n programManager: ProgramManager;\n textureManager: TextureManager;\n layoutStrategy: TextureLayoutStrategy;\n packedTextureDataCache: Map;\n unpackedTextureDataCache: Map;\n pack2unpackMap: Map;\n unpack2packMap: Map;\n initializers: Set;\n pack?: boolean;\n\n constructor(public readonly backend: WebGLBackend, public readonly context: Session.Context) {\n this.layoutStrategy = new PreferLogicalStrategy(backend.glContext.maxTextureSize);\n this.programManager = new ProgramManager(this.context.profiler, backend.glContext, this.layoutStrategy);\n this.textureManager = new TextureManager(\n backend.glContext, this.layoutStrategy, this.context.profiler,\n {reuseTextures: backend.textureCacheMode === 'full'});\n this.packedTextureDataCache = new Map();\n this.unpackedTextureDataCache = new Map();\n this.pack = backend.pack;\n this.pack2unpackMap = new Map();\n this.unpack2packMap = new Map();\n }\n\n createInferenceHandler() {\n return new WebGLInferenceHandler(this);\n }\n onGraphInitialized(graph: Graph): void {\n const initializers = graph.getValues().filter(v => v.from === -1 && v.tensor).map(v => v.tensor!.dataId);\n this.initializers = new Set(initializers);\n }\n isInitializer(tensorId: Tensor.Id): boolean {\n return this.initializers ? this.initializers.has(tensorId) : false;\n }\n addInitializer(tensorId: Tensor.Id): void {\n this.initializers.add(tensorId);\n }\n getTextureData(tensorId: Tensor.Id, isPacked: boolean): TextureData|undefined {\n if (isPacked) {\n return this.packedTextureDataCache.get(tensorId);\n } else {\n return this.unpackedTextureDataCache.get(tensorId);\n }\n }\n setTextureData(tensorId: Tensor.Id, textureData: TextureData, isPacked = false): void {\n Logger.verbose('WebGLSessionHandler', 'Storing Texture data in cache');\n if (isPacked) {\n this.packedTextureDataCache.set(tensorId, textureData);\n } else {\n this.unpackedTextureDataCache.set(tensorId, textureData);\n }\n }\n dispose(): void {\n this.programManager.dispose();\n this.textureManager.clearActiveTextures();\n this.packedTextureDataCache.forEach(td => this.textureManager.releaseTexture(td, true));\n this.packedTextureDataCache = new Map();\n this.unpackedTextureDataCache.forEach(td => this.textureManager.releaseTexture(td, true));\n this.unpackedTextureDataCache = new Map();\n }\n resolve(node: Graph.Node, opsets: readonly OpSet[], graph: Graph): Operator {\n const op = resolveOperator(node, opsets, WEBGL_OP_RESOLVE_RULES);\n return {impl: op.opImpl, context: op.opInit ? op.opInit(node, graph) : node};\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport * as DataEncoders from './texture-data-encoder';\nimport {DataEncoder, Encoder, EncoderUsage} from './texture-data-encoder';\nimport {repeatedTry} from './utils';\n\nexport interface FenceContext {\n query: WebGLSync|null;\n isFencePassed(): boolean;\n}\n\ntype PollItem = {\n isDoneFn: () => boolean; resolveFn: () => void;\n};\n\nexport function linearSearchLastTrue(arr: Array<() => boolean>): number {\n let i = 0;\n for (; i < arr.length; ++i) {\n const isDone = arr[i]();\n if (!isDone) {\n break;\n }\n }\n return i - 1;\n}\n\n/**\n * Abstraction and wrapper around WebGLRenderingContext and its operations\n */\nexport class WebGLContext {\n gl: WebGLRenderingContext;\n version: 1|2;\n\n private vertexbuffer: WebGLBuffer;\n private framebuffer: WebGLFramebuffer;\n\n // WebGL flags and vital parameters\n private isFloatTextureAttachableToFrameBuffer: boolean;\n isFloat32DownloadSupported: boolean;\n isRenderFloat32Supported: boolean;\n isBlendSupported: boolean;\n maxTextureSize: number;\n // private maxCombinedTextureImageUnits: number;\n private maxTextureImageUnits: number;\n // private maxCubeMapTextureSize: number;\n // private shadingLanguageVersion: string;\n // private webglVendor: string;\n // private webglVersion: string;\n\n // WebGL2 flags and vital parameters\n // private max3DTextureSize: number;\n // private maxArrayTextureLayers: number;\n // private maxColorAttachments: number;\n // private maxDrawBuffers: number;\n\n // WebGL extensions\n // eslint-disable-next-line camelcase\n textureFloatExtension: OES_texture_float|null;\n // eslint-disable-next-line camelcase\n textureHalfFloatExtension: OES_texture_half_float|null;\n\n // WebGL2 extensions\n colorBufferFloatExtension: unknown|null;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n disjointTimerQueryWebgl2Extension: {TIME_ELAPSED_EXT: GLenum; GPU_DISJOINT_EXT: GLenum}|null;\n\n private disposed: boolean;\n private frameBufferBound = false;\n\n constructor(gl: WebGLRenderingContext, version: 1|2) {\n this.gl = gl;\n this.version = version;\n\n this.getExtensions();\n this.vertexbuffer = this.createVertexbuffer();\n this.framebuffer = this.createFramebuffer();\n this.queryVitalParameters();\n }\n\n allocateTexture(width: number, height: number, encoder: DataEncoder, data?: Encoder.DataArrayType): WebGLTexture {\n const gl = this.gl;\n // create the texture\n const texture = gl.createTexture();\n // bind the texture so the following methods effect this texture.\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n const buffer = data ? encoder.encode(data, width * height) : null;\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0, // Level of detail.\n encoder.internalFormat, width, height,\n 0, // Always 0 in OpenGL ES.\n encoder.format, encoder.textureType, buffer);\n this.checkError();\n return texture as WebGLTexture;\n }\n updateTexture(\n texture: WebGLTexture, width: number, height: number, encoder: DataEncoder, data: Encoder.DataArrayType): void {\n const gl = this.gl;\n gl.bindTexture(gl.TEXTURE_2D, texture);\n const buffer = encoder.encode(data, width * height);\n gl.texSubImage2D(\n gl.TEXTURE_2D,\n 0, // level\n 0, // xoffset\n 0, // yoffset\n width, height, encoder.format, encoder.textureType, buffer);\n this.checkError();\n }\n attachFramebuffer(texture: WebGLTexture, width: number, height: number): void {\n const gl = this.gl;\n // Make it the target for framebuffer operations - including rendering.\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture,\n 0); // 0, we aren't using MIPMAPs\n this.checkError();\n gl.viewport(0, 0, width, height);\n gl.scissor(0, 0, width, height);\n }\n readTexture(\n texture: WebGLTexture, width: number, height: number, dataSize: number, dataType: Encoder.DataType,\n channels: number): Encoder.DataArrayType {\n const gl = this.gl;\n if (!channels) {\n channels = 1;\n }\n if (!this.frameBufferBound) {\n this.attachFramebuffer(texture, width, height);\n }\n const encoder = this.getEncoder(dataType, channels);\n const buffer = encoder.allocate(width * height);\n // bind texture to framebuffer\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture,\n 0); // 0, we aren't using MIPMAPs\n // TODO: Check if framebuffer is ready\n gl.readPixels(0, 0, width, height, gl.RGBA, encoder.textureType, buffer);\n this.checkError();\n // unbind FB\n return encoder.decode(buffer, dataSize);\n }\n\n isFramebufferReady(): boolean {\n // TODO: Implement logic to check if the framebuffer is ready\n return true;\n }\n getActiveTexture(): string {\n const gl = this.gl;\n const n = gl.getParameter(this.gl.ACTIVE_TEXTURE);\n return `TEXTURE${(n - gl.TEXTURE0)}`;\n }\n getTextureBinding(): WebGLTexture {\n return this.gl.getParameter(this.gl.TEXTURE_BINDING_2D);\n }\n getFramebufferBinding(): WebGLFramebuffer {\n return this.gl.getParameter(this.gl.FRAMEBUFFER_BINDING);\n }\n setVertexAttributes(positionHandle: number, textureCoordHandle: number): void {\n const gl = this.gl;\n gl.vertexAttribPointer(positionHandle, 3, gl.FLOAT, false, 20, 0);\n gl.enableVertexAttribArray(positionHandle);\n if (textureCoordHandle !== -1) {\n gl.vertexAttribPointer(textureCoordHandle, 2, gl.FLOAT, false, 20, 12);\n gl.enableVertexAttribArray(textureCoordHandle);\n }\n this.checkError();\n }\n createProgram(\n vertexShader: WebGLShader,\n fragShader: WebGLShader,\n ): WebGLProgram {\n const gl = this.gl;\n const program = gl.createProgram()!;\n\n // the program consists of our shaders\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragShader);\n gl.linkProgram(program);\n return program;\n }\n compileShader(shaderSource: string, shaderType: number): WebGLShader {\n const gl = this.gl;\n const shader = gl.createShader(shaderType);\n if (!shader) {\n throw new Error(`createShader() returned null with type ${shaderType}`);\n }\n\n gl.shaderSource(shader, shaderSource);\n gl.compileShader(shader);\n if (gl.getShaderParameter(shader, gl.COMPILE_STATUS) === false) {\n throw new Error(`Failed to compile shader: ${gl.getShaderInfoLog(shader)}\nShader source:\n${shaderSource}`);\n }\n return shader;\n }\n deleteShader(shader: WebGLShader): void {\n this.gl.deleteShader(shader);\n }\n bindTextureToUniform(texture: WebGLTexture, position: number, uniformHandle: WebGLUniformLocation): void {\n const gl = this.gl;\n gl.activeTexture(gl.TEXTURE0 + position);\n this.checkError();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n this.checkError();\n gl.uniform1i(uniformHandle, position);\n this.checkError();\n }\n draw(): void {\n this.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);\n this.checkError();\n }\n checkError(): void {\n if (env.debug) {\n const gl = this.gl;\n const error = gl.getError();\n let label = '';\n switch (error) {\n case (gl.NO_ERROR):\n return;\n case (gl.INVALID_ENUM):\n label = 'INVALID_ENUM';\n break;\n case (gl.INVALID_VALUE):\n label = 'INVALID_VALUE';\n break;\n case (gl.INVALID_OPERATION):\n label = 'INVALID_OPERATION';\n break;\n case (gl.INVALID_FRAMEBUFFER_OPERATION):\n label = 'INVALID_FRAMEBUFFER_OPERATION';\n break;\n case (gl.OUT_OF_MEMORY):\n label = 'OUT_OF_MEMORY';\n break;\n case (gl.CONTEXT_LOST_WEBGL):\n label = 'CONTEXT_LOST_WEBGL';\n break;\n default:\n label = `Unknown WebGL Error: ${error.toString(16)}`;\n }\n throw new Error(label);\n }\n }\n deleteTexture(texture: WebGLTexture): void {\n this.gl.deleteTexture(texture);\n }\n deleteProgram(program: WebGLProgram): void {\n this.gl.deleteProgram(program);\n }\n getEncoder(dataType: Encoder.DataType, channels: number, usage: EncoderUsage = EncoderUsage.Default): DataEncoder {\n if (this.version === 2) {\n return new DataEncoders.RedFloat32DataEncoder(this.gl as WebGL2RenderingContext, channels);\n }\n\n switch (dataType) {\n case 'float':\n if (usage === EncoderUsage.UploadOnly || this.isRenderFloat32Supported) {\n return new DataEncoders.RGBAFloatDataEncoder(this.gl, channels);\n } else {\n return new DataEncoders.RGBAFloatDataEncoder(\n this.gl, channels, this.textureHalfFloatExtension!.HALF_FLOAT_OES);\n }\n case 'int':\n throw new Error('not implemented');\n case 'byte':\n return new DataEncoders.Uint8DataEncoder(this.gl, channels);\n default:\n throw new Error(`Invalid dataType: ${dataType}`);\n }\n }\n clearActiveTextures(): void {\n const gl = this.gl;\n for (let unit = 0; unit < this.maxTextureImageUnits; ++unit) {\n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n }\n dispose(): void {\n if (this.disposed) {\n return;\n }\n const gl = this.gl;\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteFramebuffer(this.framebuffer);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n gl.deleteBuffer(this.vertexbuffer);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);\n gl.finish();\n this.disposed = true;\n }\n\n private createDefaultGeometry(): Float32Array {\n // Sets of x,y,z(=0),s,t coordinates.\n return new Float32Array([\n -1.0, 1.0, 0.0, 0.0, 1.0, // upper left\n -1.0, -1.0, 0.0, 0.0, 0.0, // lower left\n 1.0, 1.0, 0.0, 1.0, 1.0, // upper right\n 1.0, -1.0, 0.0, 1.0, 0.0 // lower right\n ]);\n }\n private createVertexbuffer(): WebGLBuffer {\n const gl = this.gl;\n const buffer = gl.createBuffer();\n if (!buffer) {\n throw new Error('createBuffer() returned null');\n }\n const geometry = this.createDefaultGeometry();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry, gl.STATIC_DRAW);\n this.checkError();\n return buffer;\n }\n private createFramebuffer(): WebGLFramebuffer {\n const fb = this.gl.createFramebuffer();\n if (!fb) {\n throw new Error('createFramebuffer returned null');\n }\n return fb;\n }\n\n private queryVitalParameters(): void {\n const gl = this.gl;\n\n this.isFloatTextureAttachableToFrameBuffer = this.checkFloatTextureAttachableToFrameBuffer();\n this.isRenderFloat32Supported = this.checkRenderFloat32();\n this.isFloat32DownloadSupported = this.checkFloat32Download();\n\n if (this.version === 1 && !this.textureHalfFloatExtension && !this.isRenderFloat32Supported) {\n throw new Error('both float32 and float16 TextureType are not supported');\n }\n\n this.isBlendSupported = !this.isRenderFloat32Supported || this.checkFloat32Blend();\n\n // this.maxCombinedTextureImageUnits = gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS);\n this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n this.maxTextureImageUnits = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n // this.maxCubeMapTextureSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);\n // this.shadingLanguageVersion = gl.getParameter(gl.SHADING_LANGUAGE_VERSION);\n // this.webglVendor = gl.getParameter(gl.VENDOR);\n // this.webglVersion = gl.getParameter(gl.VERSION);\n\n if (this.version === 2) {\n // this.max3DTextureSize = gl.getParameter(WebGL2RenderingContext.MAX_3D_TEXTURE_SIZE);\n // this.maxArrayTextureLayers = gl.getParameter(WebGL2RenderingContext.MAX_ARRAY_TEXTURE_LAYERS);\n // this.maxColorAttachments = gl.getParameter(WebGL2RenderingContext.MAX_COLOR_ATTACHMENTS);\n // this.maxDrawBuffers = gl.getParameter(WebGL2RenderingContext.MAX_DRAW_BUFFERS);\n }\n }\n private getExtensions(): void {\n if (this.version === 2) {\n this.colorBufferFloatExtension = this.gl.getExtension('EXT_color_buffer_float');\n this.disjointTimerQueryWebgl2Extension = this.gl.getExtension('EXT_disjoint_timer_query_webgl2');\n } else {\n this.textureFloatExtension = this.gl.getExtension('OES_texture_float');\n this.textureHalfFloatExtension = this.gl.getExtension('OES_texture_half_float');\n }\n }\n\n private checkFloatTextureAttachableToFrameBuffer(): boolean {\n // test whether Float32 texture is supported:\n // STEP.1 create a float texture\n const gl = this.gl;\n const texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const internalFormat = this.version === 2 ? (gl as unknown as {RGBA32F: number}).RGBA32F : gl.RGBA;\n gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, 1, 1, 0, gl.RGBA, gl.FLOAT, null);\n // STEP.2 bind a frame buffer\n const frameBuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n // STEP.3 attach texture to framebuffer\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n // STEP.4 test whether framebuffer is complete\n const isComplete = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteTexture(texture);\n gl.deleteFramebuffer(frameBuffer);\n return isComplete;\n }\n\n private checkRenderFloat32(): boolean {\n if (this.version === 2) {\n if (!this.colorBufferFloatExtension) {\n return false;\n }\n } else {\n if (!this.textureFloatExtension) {\n return false;\n }\n }\n return this.isFloatTextureAttachableToFrameBuffer;\n }\n\n private checkFloat32Download(): boolean {\n if (this.version === 2) {\n if (!this.colorBufferFloatExtension) {\n return false;\n }\n } else {\n if (!this.textureFloatExtension) {\n return false;\n }\n if (!this.gl.getExtension('WEBGL_color_buffer_float')) {\n return false;\n }\n }\n return this.isFloatTextureAttachableToFrameBuffer;\n }\n\n /**\n * Check whether GL_BLEND is supported\n */\n private checkFloat32Blend(): boolean {\n // it looks like currently (2019-05-08) there is no easy way to detect whether BLEND is supported\n // https://github.com/microsoft/onnxjs/issues/145\n\n const gl = this.gl;\n\n let texture: WebGLTexture|null|undefined;\n let frameBuffer: WebGLFramebuffer|null|undefined;\n let vertexShader: WebGLShader|null|undefined;\n let fragmentShader: WebGLShader|null|undefined;\n let program: WebGLProgram|null|undefined;\n\n try {\n texture = gl.createTexture();\n frameBuffer = gl.createFramebuffer();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const internalFormat = this.version === 2 ? (gl as unknown as {RGBA32F: number}).RGBA32F : gl.RGBA;\n gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, 1, 1, 0, gl.RGBA, gl.FLOAT, null);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n\n gl.enable(gl.BLEND);\n\n vertexShader = gl.createShader(gl.VERTEX_SHADER);\n if (!vertexShader) {\n return false;\n }\n gl.shaderSource(vertexShader, 'void main(){}');\n gl.compileShader(vertexShader);\n\n fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n if (!fragmentShader) {\n return false;\n }\n gl.shaderSource(fragmentShader, 'precision highp float;void main(){gl_FragColor=vec4(0.5);}');\n gl.compileShader(fragmentShader);\n\n program = gl.createProgram();\n if (!program) {\n return false;\n }\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n gl.useProgram(program);\n\n gl.drawArrays(gl.POINTS, 0, 1);\n return gl.getError() === gl.NO_ERROR;\n\n } finally {\n gl.disable(gl.BLEND);\n\n if (program) {\n gl.deleteProgram(program);\n }\n if (vertexShader) {\n gl.deleteShader(vertexShader);\n }\n if (fragmentShader) {\n gl.deleteShader(fragmentShader);\n }\n if (frameBuffer) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteFramebuffer(frameBuffer);\n }\n if (texture) {\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(texture);\n }\n }\n }\n\n beginTimer(): WebGLQuery {\n if (this.version === 2 && this.disjointTimerQueryWebgl2Extension) {\n const gl2 = this.gl as WebGL2RenderingContext;\n const ext = this.disjointTimerQueryWebgl2Extension;\n\n const query = gl2.createQuery() as WebGLQuery;\n gl2.beginQuery(ext.TIME_ELAPSED_EXT, query);\n return query;\n } else {\n // TODO: add webgl 1 handling.\n throw new Error('WebGL1 profiling currently not supported.');\n }\n }\n\n endTimer() {\n if (this.version === 2 && this.disjointTimerQueryWebgl2Extension) {\n const gl2 = this.gl as WebGL2RenderingContext;\n const ext = this.disjointTimerQueryWebgl2Extension;\n gl2.endQuery(ext.TIME_ELAPSED_EXT);\n return;\n } else {\n // TODO: add webgl 1 handling.\n throw new Error('WebGL1 profiling currently not supported');\n }\n }\n\n isTimerResultAvailable(query: WebGLQuery): boolean {\n let available = false, disjoint = false;\n if (this.version === 2 && this.disjointTimerQueryWebgl2Extension) {\n const gl2 = this.gl as WebGL2RenderingContext;\n const ext = this.disjointTimerQueryWebgl2Extension;\n\n available = gl2.getQueryParameter(query, gl2.QUERY_RESULT_AVAILABLE);\n disjoint = gl2.getParameter(ext.GPU_DISJOINT_EXT);\n } else {\n // TODO: add webgl 1 handling.\n throw new Error('WebGL1 profiling currently not supported');\n }\n\n return available && !disjoint;\n }\n\n getTimerResult(query: WebGLQuery): number {\n let timeElapsed = 0;\n if (this.version === 2) {\n const gl2 = this.gl as WebGL2RenderingContext;\n timeElapsed = gl2.getQueryParameter(query, gl2.QUERY_RESULT);\n gl2.deleteQuery(query);\n } else {\n // TODO: add webgl 1 handling.\n throw new Error('WebGL1 profiling currently not supported');\n }\n // return miliseconds\n return timeElapsed / 1000000;\n }\n\n async waitForQueryAndGetTime(query: WebGLQuery): Promise {\n await repeatedTry(() => this.isTimerResultAvailable(query));\n return this.getTimerResult(query);\n }\n\n public async createAndWaitForFence(): Promise {\n const fenceContext = this.createFence(this.gl);\n return this.pollFence(fenceContext);\n }\n\n private createFence(gl: WebGLRenderingContext): FenceContext {\n let isFencePassed: () => boolean;\n const gl2 = gl as WebGL2RenderingContext;\n const query = gl2.fenceSync(gl2.SYNC_GPU_COMMANDS_COMPLETE, 0);\n gl.flush();\n if (query === null) {\n isFencePassed = () => true;\n } else {\n isFencePassed = () => {\n const status = gl2.clientWaitSync(query, 0, 0);\n return status === gl2.ALREADY_SIGNALED || status === gl2.CONDITION_SATISFIED;\n };\n }\n return {query, isFencePassed};\n }\n\n async pollFence(fenceContext: FenceContext) {\n return new Promise(resolve => {\n void this.addItemToPoll(() => fenceContext.isFencePassed(), () => resolve());\n });\n }\n\n private itemsToPoll: PollItem[] = [];\n\n pollItems(): void {\n // Find the last query that has finished.\n const index = linearSearchLastTrue(this.itemsToPoll.map(x => x.isDoneFn));\n for (let i = 0; i <= index; ++i) {\n const {resolveFn} = this.itemsToPoll[i];\n resolveFn();\n }\n this.itemsToPoll = this.itemsToPoll.slice(index + 1);\n }\n\n private async addItemToPoll(isDoneFn: () => boolean, resolveFn: () => void) {\n this.itemsToPoll.push({isDoneFn, resolveFn});\n if (this.itemsToPoll.length > 1) {\n // We already have a running loop that polls.\n return;\n }\n // Start a new loop that polls.\n await repeatedTry(() => {\n this.pollItems();\n // End the loop if no more items to poll.\n return this.itemsToPoll.length === 0;\n });\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Logger} from '../../instrument';\n\nimport {WebGLContext} from './webgl-context';\n\nconst cache: {[contextId: string]: WebGLContext} = {};\n\n/**\n * This factory function creates proper WebGLRenderingContext based on\n * the current browsers capabilities\n * The order is from higher/most recent versions to most basic\n */\nexport function createWebGLContext(contextId?: 'webgl'|'webgl2'): WebGLContext {\n let context: WebGLContext|undefined;\n if ((!contextId || contextId === 'webgl2') && 'webgl2' in cache) {\n context = cache.webgl2;\n } else if ((!contextId || contextId === 'webgl') && 'webgl' in cache) {\n context = cache.webgl;\n }\n\n if (!context) {\n try {\n // try to create webgl context from an offscreen canvas\n const offscreenCanvas = createOffscreenCanvas();\n context = createNewWebGLContext(offscreenCanvas, contextId);\n } catch (e) {\n // if failed, fallback to try to use a normal canvas element\n const canvas = createCanvas();\n context = createNewWebGLContext(canvas, contextId);\n }\n }\n\n contextId = contextId || context.version === 1 ? 'webgl' : 'webgl2';\n const gl = context.gl;\n\n cache[contextId] = context;\n\n if (gl.isContextLost()) {\n delete cache[contextId];\n return createWebGLContext(contextId);\n }\n\n gl.disable(gl.DEPTH_TEST);\n gl.disable(gl.STENCIL_TEST);\n gl.disable(gl.BLEND);\n gl.disable(gl.DITHER);\n gl.disable(gl.POLYGON_OFFSET_FILL);\n gl.disable(gl.SAMPLE_COVERAGE);\n gl.enable(gl.SCISSOR_TEST);\n gl.enable(gl.CULL_FACE);\n gl.cullFace(gl.BACK);\n\n return context;\n}\n\nexport function createNewWebGLContext(canvas: HTMLCanvasElement, contextId?: 'webgl'|'webgl2'): WebGLContext {\n const contextAttributes: WebGLContextAttributes = {\n alpha: false,\n depth: false,\n antialias: false,\n stencil: false,\n preserveDrawingBuffer: false,\n premultipliedAlpha: false,\n failIfMajorPerformanceCaveat: false\n };\n let gl: WebGLRenderingContext|null;\n const ca = contextAttributes;\n if (!contextId || contextId === 'webgl2') {\n gl = canvas.getContext('webgl2', ca);\n if (gl) {\n try {\n return new WebGLContext(gl, 2);\n } catch (err) {\n Logger.warning('GlContextFactory', `failed to create WebGLContext using contextId 'webgl2'. Error: ${err}`);\n }\n }\n }\n if (!contextId || contextId === 'webgl') {\n gl = canvas.getContext('webgl', ca) || canvas.getContext('experimental-webgl', ca) as WebGLRenderingContext;\n if (gl) {\n try {\n return new WebGLContext(gl, 1);\n } catch (err) {\n Logger.warning(\n 'GlContextFactory',\n `failed to create WebGLContext using contextId 'webgl' or 'experimental-webgl'. Error: ${err}`);\n }\n }\n }\n\n throw new Error('WebGL is not supported');\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ndeclare let OffscreenCanvas: {new (width: number, height: number): HTMLCanvasElement};\n\nfunction createCanvas(): HTMLCanvasElement {\n if (typeof document === 'undefined') {\n throw new TypeError('failed to create canvas: document is not supported');\n }\n const canvas: HTMLCanvasElement = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n return canvas;\n}\n\nfunction createOffscreenCanvas(): HTMLCanvasElement {\n if (typeof OffscreenCanvas === 'undefined') {\n throw new TypeError('failed to create offscreen canvas: OffscreenCanvas is not supported');\n }\n return new OffscreenCanvas(1, 1);\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport {Backend, SessionHandler} from '../backend';\nimport {Logger} from '../instrument';\nimport {Session} from '../session';\n\nimport {WebGLSessionHandler} from './webgl/session-handler';\nimport {WebGLContext} from './webgl/webgl-context';\nimport {createWebGLContext} from './webgl/webgl-context-factory';\n\n/**\n * WebGLBackend is the entry point for all WebGL opeartions\n * When it starts it created the WebGLRenderingContext\n * and other main framework components such as Program and Texture Managers\n */\nexport class WebGLBackend implements Backend {\n glContext: WebGLContext;\n\n get contextId(): 'webgl'|'webgl2'|undefined {\n return env.webgl.contextId;\n }\n set contextId(value: 'webgl'|'webgl2'|undefined) {\n env.webgl.contextId = value;\n }\n\n get matmulMaxBatchSize(): number|undefined {\n return env.webgl.matmulMaxBatchSize;\n }\n set matmulMaxBatchSize(value: number|undefined) {\n env.webgl.matmulMaxBatchSize = value;\n }\n\n get textureCacheMode(): 'initializerOnly'|'full'|undefined {\n return env.webgl.textureCacheMode;\n }\n set textureCacheMode(value: 'initializerOnly'|'full'|undefined) {\n env.webgl.textureCacheMode = value;\n }\n\n get pack(): boolean|undefined {\n return env.webgl.pack;\n }\n set pack(value: boolean|undefined) {\n env.webgl.pack = value;\n }\n\n get async(): boolean|undefined {\n return env.webgl.async;\n }\n set async(value: boolean|undefined) {\n env.webgl.async = value;\n }\n\n initialize(): boolean {\n try {\n this.glContext = createWebGLContext(this.contextId);\n if (typeof this.matmulMaxBatchSize !== 'number') {\n this.matmulMaxBatchSize = 16;\n }\n if (typeof this.textureCacheMode !== 'string') {\n this.textureCacheMode = 'full';\n }\n if (typeof this.pack !== 'boolean') {\n this.pack = false;\n }\n if (typeof this.async !== 'boolean') {\n this.async = false;\n }\n\n Logger.setWithEnv(env);\n\n if (!env.webgl.context) {\n Object.defineProperty(env.webgl, 'context', {value: this.glContext.gl});\n }\n\n Logger.verbose(\n 'WebGLBackend',\n `Created WebGLContext: ${typeof this.glContext} with matmulMaxBatchSize: ${\n this.matmulMaxBatchSize}; textureCacheMode: ${this.textureCacheMode}; pack: ${this.pack}; async: ${\n this.async}.`);\n return true;\n } catch (e) {\n Logger.warning('WebGLBackend', `Unable to initialize WebGLBackend. ${e}`);\n return false;\n }\n }\n createSessionHandler(context: Session.Context): SessionHandler {\n return new WebGLSessionHandler(this, context);\n }\n dispose(): void {\n this.glContext.dispose();\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {WebGLBackend} from './backends/backend-webgl';\nimport {Graph} from './graph';\nimport {Operator} from './operators';\nimport {OpSet} from './opset';\nimport {Session} from './session';\n\nexport interface InferenceHandler {\n /**\n * dispose the inference handler. it will be called as the last step in Session.run()\n */\n dispose(): void;\n}\n\nexport interface SessionHandler {\n /**\n * transform the graph at initialization time\n * @param graphTransformer the graph transformer to manipulate the model graph\n */\n transformGraph?(graphTransformer: Graph.Transformer): void;\n\n /**\n * create an instance of InferenceHandler to use in a Session.run() call\n */\n createInferenceHandler(): InferenceHandler;\n\n /**\n * dispose the session handler. it will be called when a session is being disposed explicitly\n */\n dispose(): void;\n\n /**\n * Resolves the operator from the name and opset version; backend specific\n * @param node the node to resolve\n * @param opsets a list of opsets that exported from the model\n * @param graph the completely initialized graph\n */\n resolve(node: Graph.Node, opsets: readonly OpSet[], graph: Graph): Operator;\n\n /**\n * This method let's the sessionHandler know that the graph initialization is complete\n * @param graph the completely initialized graph\n */\n onGraphInitialized?(graph: Graph): void;\n\n /**\n * a reference to the corresponding backend\n */\n readonly backend: Backend;\n\n /**\n * a reference to the session context\n */\n readonly context: Session.Context;\n}\n\nexport interface Backend {\n /**\n * initialize the backend. will be called only once, when the first time the\n * backend it to be used\n */\n initialize(): boolean|Promise;\n\n /**\n * create an instance of SessionHandler to use in a Session object's lifecycle\n */\n createSessionHandler(context: Session.Context): SessionHandler;\n\n /**\n * dispose the backend. currently this will not be called\n */\n dispose(): void;\n}\n\n// caches all initialized backend instances\nconst backendsCache: Map = new Map();\n\nexport const backend: {[name: string]: Backend} = {\n webgl: new WebGLBackend()\n};\n\n/**\n * Resolve a reference to the backend. If a hint is specified, the corresponding\n * backend will be used.\n */\nexport async function resolveBackend(hint?: string|readonly string[]): Promise {\n if (!hint) {\n return resolveBackend(['webgl']);\n } else {\n const hints = typeof hint === 'string' ? [hint] : hint;\n\n for (const backendHint of hints) {\n const cache = backendsCache.get(backendHint);\n if (cache) {\n return cache;\n }\n\n const backend = await tryLoadBackend(backendHint);\n if (backend) {\n return backend;\n }\n }\n }\n\n throw new Error('no available backend to use');\n}\n\nasync function tryLoadBackend(backendHint: string): Promise {\n const backendObj = backend;\n\n if (typeof backendObj[backendHint] !== 'undefined' && isBackend(backendObj[backendHint])) {\n const backend = backendObj[backendHint];\n let init = backend.initialize();\n if (typeof init === 'object' && 'then' in init) {\n init = await init;\n }\n if (init) {\n backendsCache.set(backendHint, backend);\n return backend;\n }\n }\n\n return undefined;\n}\n\nfunction isBackend(obj: unknown) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const o = obj as any;\n\n // check if an object is a Backend instance\n if (\n 'initialize' in o && typeof o.initialize === 'function' && // initialize()\n 'createSessionHandler' in o && typeof o.createSessionHandler === 'function' && // createSessionHandler()\n 'dispose' in o && typeof o.dispose === 'function' // dispose()\n ) {\n return true;\n }\n\n return false;\n}\n\nexport type BackendType = Backend;\nexport type SessionHandlerType = ReturnType;\nexport type InferenceHandlerType = ReturnType;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {SessionHandler} from './backend';\nimport {Graph} from './graph';\nimport {Logger, Profiler} from './instrument';\nimport {Operator} from './operators';\nimport {Tensor} from './tensor';\n\nclass KernelOp {\n constructor(public op: Operator, public node: Graph.Node) {}\n}\n\nexport class ExecutionPlan {\n constructor(private graph: Graph, ops: Operator[], private profiler: Readonly) {\n this.initialize(ops);\n }\n\n initialize(ops: Operator[]) {\n this.profiler.event('session', 'ExecutionPlan.initialize', () => {\n const graphNodes = this.graph.getNodes();\n if (graphNodes.length !== ops.length) {\n throw new Error('The size of nodes and OPs do not match.');\n }\n\n this._ops = ops.map((op, i) => new KernelOp(op, graphNodes[i]));\n this.reset();\n\n // look for starter node(s)\n this._starter = [];\n this._ops.forEach((op, i) => {\n let resolved = true;\n for (const input of op.node.inputs) {\n if (\n !this._values[input] // not an initialized input\n && this.graph.getInputIndices().indexOf(input) === -1 // not model input\n ) {\n resolved = false;\n break;\n }\n }\n if (resolved) {\n this._starter.push(i);\n }\n });\n });\n }\n\n reset() {\n this._values = this.graph.getValues().map(i => i.tensor);\n }\n\n async execute(sessionHandler: SessionHandler, modelInputs: Tensor[]): Promise {\n return this.profiler.event('session', 'ExecutionPlan.execute', async () => {\n // reset mediem result\n this.reset();\n\n // create inference handler\n const inferenceHandler = sessionHandler.createInferenceHandler();\n\n // populate inputs value\n const graphInputs = this.graph.getInputIndices();\n if (modelInputs.length !== graphInputs.length) {\n throw new Error(`number of input tensors don't match the number of inputs to the model: actual: ${\n modelInputs.length} expected: ${graphInputs.length}`);\n }\n\n modelInputs.forEach((input, i) => {\n const index = graphInputs[i];\n this._values[index] = input;\n });\n\n // prepare running sequence\n const sequence: number[] = this._starter.slice(0);\n\n // execution iterations\n const graphValues = this.graph.getValues();\n const graphNodes = this.graph.getNodes();\n\n let rear = 0;\n while (rear < sequence.length) {\n const thisOpIndex = sequence[rear++];\n const thisOp = this._ops[thisOpIndex];\n\n // check input\n const inputList = thisOp.node.inputs.map(i => this._values[i]);\n if (inputList.indexOf(undefined) !== -1) {\n throw new Error(`unresolved input detected: op: ${thisOp.node}`);\n }\n\n // run\n const inputTensors = inputList as Tensor[];\n Logger.verbose(\n 'ExecPlan',\n `Running op:${thisOp.node.name} (${\n inputTensors.map((t, i) => `'${thisOp.node.inputs[i]}': ${t.type}[${t.dims.join(',')}]`).join(', ')})`);\n\n const outputList = await this.profiler.event(\n 'node', thisOp.node.name, async () => thisOp.op.impl(inferenceHandler, inputTensors, thisOp.op.context));\n\n // check output\n if (outputList.length !== thisOp.node.outputs.length) {\n throw new Error('the size of output does not match model definition.');\n }\n\n // fill value\n outputList.forEach((output, i) => {\n const j = thisOp.node.outputs[i];\n if (this._values[j]) {\n throw new Error(`output [${j}] already has value: op:${thisOp.node.name}`);\n }\n this._values[j] = output;\n });\n\n // resolve downstream nodes\n const downstreamNodes = new Set();\n outputList.forEach((_output, i) => {\n const j = thisOp.node.outputs[i];\n for (const currentDownstreamNodeIndex of graphValues[j].to) {\n const currentDownstreamNode = graphNodes[currentDownstreamNodeIndex];\n let resolved = true;\n for (const k of currentDownstreamNode.inputs) {\n if (!this._values[k]) {\n resolved = false;\n break;\n }\n }\n if (resolved) {\n downstreamNodes.add(currentDownstreamNodeIndex);\n }\n }\n });\n sequence.push(...downstreamNodes);\n }\n\n const output: Tensor[] = [];\n for (let i = 0; i < this.graph.getOutputIndices().length; i++) {\n const outputIndex = this.graph.getOutputIndices()[i];\n const outputTensor = this._values[outputIndex];\n if (outputTensor === undefined) {\n throw new Error(`required output [${outputIndex}] does not have value`);\n }\n if (outputIndex === 0) {\n await outputTensor.getData();\n } else {\n // eslint-disable-next-line no-unused-expressions\n outputTensor.data;\n }\n output.push(outputTensor);\n }\n Logger.verbose('ExecPlan', 'disposing of inferenceHandler');\n inferenceHandler.dispose();\n return output;\n });\n }\n\n _values: Array;\n _ops: KernelOp[];\n _starter: number[];\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport Long from 'long';\n\nimport {onnxruntime} from './ort-schema/flatbuffers/ort-generated';\nimport {onnx} from './ort-schema/protobuf/onnx';\nimport {Tensor} from './tensor';\nimport {decodeUtf8String, LongUtil} from './util';\n\nimport ortFbs = onnxruntime.experimental.fbs;\n\nexport declare namespace Attribute {\n export interface DataTypeMap {\n float: number;\n int: number;\n string: string;\n tensor: Tensor;\n floats: number[];\n ints: number[];\n strings: string[];\n tensors: Tensor[];\n }\n\n export type DataType = keyof DataTypeMap;\n}\n\ntype ValueTypes = Attribute.DataTypeMap[Attribute.DataType];\n\ntype Value = [ValueTypes, Attribute.DataType];\n\nexport class Attribute {\n constructor(attributes: onnx.IAttributeProto[]|ortFbs.Attribute[]|null|undefined) {\n this._attributes = new Map();\n if (attributes !== null && attributes !== undefined) {\n for (const attr of attributes) {\n if (attr instanceof onnx.AttributeProto) {\n this._attributes.set(attr.name, [Attribute.getValue(attr), Attribute.getType(attr)]);\n } else if (attr instanceof ortFbs.Attribute) {\n this._attributes.set(attr.name()!, [Attribute.getValue(attr), Attribute.getType(attr)]);\n }\n }\n if (this._attributes.size < attributes.length) {\n throw new Error('duplicated attribute names');\n }\n }\n }\n\n set(key: string, type: Attribute.DataType, value: ValueTypes): void {\n this._attributes.set(key, [value, type]);\n }\n delete(key: string): void {\n this._attributes.delete(key);\n }\n getFloat(key: string, defaultValue?: Attribute.DataTypeMap['float']) {\n return this.get(key, 'float', defaultValue);\n }\n\n getInt(key: string, defaultValue?: Attribute.DataTypeMap['int']) {\n return this.get(key, 'int', defaultValue);\n }\n\n getString(key: string, defaultValue?: Attribute.DataTypeMap['string']) {\n return this.get(key, 'string', defaultValue);\n }\n\n getTensor(key: string, defaultValue?: Attribute.DataTypeMap['tensor']) {\n return this.get(key, 'tensor', defaultValue);\n }\n\n getFloats(key: string, defaultValue?: Attribute.DataTypeMap['floats']) {\n return this.get(key, 'floats', defaultValue);\n }\n\n getInts(key: string, defaultValue?: Attribute.DataTypeMap['ints']) {\n return this.get(key, 'ints', defaultValue);\n }\n\n getStrings(key: string, defaultValue?: Attribute.DataTypeMap['strings']) {\n return this.get(key, 'strings', defaultValue);\n }\n\n getTensors(key: string, defaultValue?: Attribute.DataTypeMap['tensors']) {\n return this.get(key, 'tensors', defaultValue);\n }\n\n private get(\n key: string, type: Attribute.DataType, defaultValue?: V): V {\n const valueAndType = this._attributes.get(key);\n if (valueAndType === undefined) {\n if (defaultValue !== undefined) {\n return defaultValue;\n }\n throw new Error(`required attribute not found: ${key}`);\n }\n if (valueAndType[1] !== type) {\n throw new Error(`type mismatch: expected ${type} but got ${valueAndType[1]}`);\n }\n return valueAndType[0] as V;\n }\n\n private static getType(attr: onnx.IAttributeProto|ortFbs.Attribute): Attribute.DataType {\n const type = attr instanceof onnx.AttributeProto ? (attr).type : (attr as ortFbs.Attribute).type();\n switch (type) {\n case onnx.AttributeProto.AttributeType.FLOAT:\n return 'float';\n case onnx.AttributeProto.AttributeType.INT:\n return 'int';\n case onnx.AttributeProto.AttributeType.STRING:\n return 'string';\n case onnx.AttributeProto.AttributeType.TENSOR:\n return 'tensor';\n case onnx.AttributeProto.AttributeType.FLOATS:\n return 'floats';\n case onnx.AttributeProto.AttributeType.INTS:\n return 'ints';\n case onnx.AttributeProto.AttributeType.STRINGS:\n return 'strings';\n case onnx.AttributeProto.AttributeType.TENSORS:\n return 'tensors';\n default:\n throw new Error(`attribute type is not supported yet: ${onnx.AttributeProto.AttributeType[type]}`);\n }\n }\n\n private static getValue(attr: onnx.IAttributeProto|ortFbs.Attribute) {\n const attrType = attr instanceof onnx.AttributeProto ? attr.type : (attr as ortFbs.Attribute).type();\n if (attrType === onnx.AttributeProto.AttributeType.GRAPH || attrType === onnx.AttributeProto.AttributeType.GRAPHS) {\n throw new Error('graph attribute is not supported yet');\n }\n\n const value = this.getValueNoCheck(attr);\n\n // cast LONG to number\n if (attrType === onnx.AttributeProto.AttributeType.INT && LongUtil.isLong(value)) {\n return LongUtil.longToNumber(value as Long | flatbuffers.Long);\n }\n\n // cast LONG[] to number[]\n if (attrType === onnx.AttributeProto.AttributeType.INTS) {\n const arr = (value as Array);\n const numberValue: number[] = new Array(arr.length);\n\n for (let i = 0; i < arr.length; i++) {\n const maybeLong = arr[i];\n numberValue[i] = LongUtil.longToNumber(maybeLong);\n }\n\n return numberValue;\n }\n\n // cast onnx.TensorProto to onnxjs.Tensor\n if (attrType === onnx.AttributeProto.AttributeType.TENSOR) {\n return attr instanceof onnx.AttributeProto ? Tensor.fromProto(value as onnx.ITensorProto) :\n Tensor.fromOrtTensor(value as ortFbs.Tensor);\n }\n\n // cast onnx.TensorProto[] to onnxjs.Tensor[]\n if (attrType === onnx.AttributeProto.AttributeType.TENSORS) {\n if (attr instanceof onnx.AttributeProto) {\n const tensorProtos = value as onnx.ITensorProto[];\n return tensorProtos.map(value => Tensor.fromProto(value));\n } else if (attr instanceof ortFbs.Attribute) {\n const tensorProtos = value as ortFbs.Tensor[];\n return tensorProtos.map(value => Tensor.fromOrtTensor(value));\n }\n }\n\n // cast Uint8Array to string\n if (attrType === onnx.AttributeProto.AttributeType.STRING) {\n // string in onnx attribute is of uint8array type, so we need to convert it to string below. While in ort format,\n // string attributes are returned as string, so no conversion is needed.\n if (attr instanceof onnx.AttributeProto) {\n const utf8String = value as Uint8Array;\n return decodeUtf8String(utf8String);\n }\n }\n\n // cast Uint8Array[] to string[]\n if (attrType === onnx.AttributeProto.AttributeType.STRINGS) {\n // strings in onnx attribute is returned as uint8array[], so we need to convert it to string[] below. While in ort\n // format strings attributes are returned as string[], so no conversion is needed.\n if (attr instanceof onnx.AttributeProto) {\n const utf8Strings = value as Uint8Array[];\n return utf8Strings.map(decodeUtf8String);\n }\n }\n\n return value as ValueTypes;\n }\n\n private static getValueNoCheck(attr: onnx.IAttributeProto|ortFbs.Attribute) {\n return attr instanceof (onnx.AttributeProto) ? this.getValueNoCheckFromOnnxFormat(attr) :\n this.getValueNoCheckFromOrtFormat(attr as ortFbs.Attribute);\n }\n\n private static getValueNoCheckFromOnnxFormat(attr: onnx.IAttributeProto) {\n switch (attr.type!) {\n case onnx.AttributeProto.AttributeType.FLOAT:\n return attr.f;\n case onnx.AttributeProto.AttributeType.INT:\n return attr.i;\n case onnx.AttributeProto.AttributeType.STRING:\n return attr.s;\n case onnx.AttributeProto.AttributeType.TENSOR:\n return attr.t;\n case onnx.AttributeProto.AttributeType.GRAPH:\n return attr.g;\n case onnx.AttributeProto.AttributeType.FLOATS:\n return attr.floats;\n case onnx.AttributeProto.AttributeType.INTS:\n return attr.ints;\n case onnx.AttributeProto.AttributeType.STRINGS:\n return attr.strings;\n case onnx.AttributeProto.AttributeType.TENSORS:\n return attr.tensors;\n case onnx.AttributeProto.AttributeType.GRAPHS:\n return attr.graphs;\n default:\n throw new Error(`unsupported attribute type: ${onnx.AttributeProto.AttributeType[attr.type!]}`);\n }\n }\n\n private static getValueNoCheckFromOrtFormat(attr: ortFbs.Attribute) {\n switch (attr.type()) {\n case ortFbs.AttributeType.FLOAT:\n return attr.f();\n case ortFbs.AttributeType.INT:\n return attr.i();\n case ortFbs.AttributeType.STRING:\n return attr.s();\n case ortFbs.AttributeType.TENSOR:\n return attr.t();\n case ortFbs.AttributeType.GRAPH:\n return attr.g();\n case ortFbs.AttributeType.FLOATS:\n return attr.floatsArray();\n case ortFbs.AttributeType.INTS: {\n const ints = [];\n for (let i = 0; i < attr.intsLength(); i++) {\n ints.push(attr.ints(i)!);\n }\n return ints;\n }\n case ortFbs.AttributeType.STRINGS: {\n const strings = [];\n for (let i = 0; i < attr.stringsLength(); i++) {\n strings.push(attr.strings(i));\n }\n return strings;\n }\n case ortFbs.AttributeType.TENSORS: {\n const tensors = [];\n for (let i = 0; i < attr.tensorsLength(); i++) {\n tensors.push(attr.tensors(i)!);\n }\n return tensors;\n }\n // case ortFbs.AttributeType.GRAPHS:\n // TODO: Subgraph not supported yet.\n // const graphs = [];\n // for (let i = 0; i < attr.graphsLength(); i++) {\n // graphs.push(attr.graphs(i)!);\n // }\n // return graphs;\n default:\n throw new Error(`unsupported attribute type: ${ortFbs.AttributeType[attr.type()]}`);\n }\n }\n\n protected _attributes: Map;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Attribute} from './attribute';\nimport {onnxruntime} from './ort-schema/flatbuffers/ort-generated';\nimport {onnx} from './ort-schema/protobuf/onnx';\nimport {Tensor} from './tensor';\nimport {LongUtil, MAX_CLIP, MIN_CLIP, ProtoUtil} from './util';\n\nimport ortFbs = onnxruntime.experimental.fbs;\n\nexport declare namespace Graph {\n export interface Shape {\n readonly dims: readonly number[];\n }\n export interface ValueType {\n readonly tensorType: Tensor.DataType;\n readonly shape: Shape;\n }\n export interface Value {\n // the tensor data. empty for non-initialized inputs\n readonly tensor?: Tensor;\n\n // index to the Node where the value comes from. -1 for initializer.\n readonly from: number;\n\n // indices to the Nodes where the values go to.\n readonly to: readonly number[];\n\n // value type specification. empty for non-input values.\n readonly type?: ValueType;\n }\n export interface Node {\n // name of the node\n readonly name: string;\n\n // the operator type\n readonly opType: string;\n\n // indices to the Values where the inputs come from.\n readonly inputs: readonly number[];\n\n // indices to the Values where the outpus go to.\n readonly outputs: readonly number[];\n\n // the attributes that used by the operator\n readonly attributes: Attribute;\n }\n\n /**\n * a Transformer is an instance that allows all possible transformation operations that applied to a graph\n */\n export interface Transformer {\n removeAllIdentityNodes(): void;\n removeAllDropoutNodes(): void;\n fuseConvActivationNodes(): void;\n // TODO: add generic functions to manipulate the graph\n }\n\n // an initializer can use transformer to transform the graph\n export interface Initializer {\n transformGraph(transformer: Transformer): void;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport interface Graph {\n getInputIndices(): readonly number[];\n getInputNames(): readonly string[];\n getOutputIndices(): readonly number[];\n getOutputNames(): readonly string[];\n getValues(): readonly Graph.Value[];\n getNodes(): readonly Graph.Node[];\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-redeclare\nexport const Graph = {\n /**\n * construct a graph from a graph protobuf type\n */\n from: (graphProto: onnx.IGraphProto|ortFbs.Graph, initializer?: Graph.Initializer) =>\n new GraphImpl(graphProto, initializer),\n};\n\nclass Value implements Graph.Value {\n constructor(valueInfo?: onnx.IValueInfoProto) {\n this._from = undefined;\n this._to = [];\n this.tensor = undefined;\n this.type = undefined;\n\n if (valueInfo) {\n this.type = ProtoUtil.tensorValueTypeFromProto(valueInfo.type!.tensorType!);\n }\n }\n\n _from?: number; // -1 represent from initializer\n get from() {\n return this._from!;\n }\n _to: number[];\n get to() {\n return this._to;\n }\n type?: Graph.ValueType;\n tensor?: Tensor;\n}\n\nclass Node implements Graph.Node {\n constructor(_nodeProto: onnx.INodeProto|ortFbs.Node, name?: string) {\n if (_nodeProto instanceof onnx.NodeProto) {\n this.name = _nodeProto.name;\n this.opType = _nodeProto.opType;\n this.attributes = new Attribute(_nodeProto.attribute);\n } else if (_nodeProto instanceof ortFbs.Node) {\n this.name = name ?? _nodeProto.name()!;\n this.opType = _nodeProto.opType()!;\n this.attributes = new Attribute(ProtoUtil.tensorAttributesFromORTFormat(_nodeProto));\n }\n\n this.inputs = [];\n this.outputs = [];\n this.executeNode = true;\n }\n\n name: string;\n opType: string;\n inputs: number[];\n outputs: number[];\n attributes: Attribute;\n executeNode: boolean;\n}\n\nclass GraphImpl implements Graph, Graph.Transformer {\n private _allData: Value[];\n\n private _allInputIndices: number[];\n private _allInputNames: string[];\n\n private _allOutputIndices: number[];\n private _allOutputNames: string[];\n\n private _nodes: Node[];\n\n constructor(graph: onnx.IGraphProto|ortFbs.Graph, graphInitializer?: Graph.Initializer) {\n if (!graph) {\n throw new TypeError('graph is empty');\n }\n\n // build the graph - will throw exceptions if something fatal is detected\n this.buildGraph(graph);\n\n // execute any transformation logic for the graph (if applicable)\n this.transformGraph(graphInitializer);\n\n // check for cycles and other inconsistencies - will throw exceptions if something fatal is detected\n this.checkIsAcyclic();\n }\n\n getInputIndices(): readonly number[] {\n return this._allInputIndices;\n }\n\n getInputNames(): readonly string[] {\n return this._allInputNames;\n }\n\n getOutputIndices(): readonly number[] {\n return this._allOutputIndices;\n }\n\n getOutputNames(): readonly string[] {\n return this._allOutputNames;\n }\n\n getValues(): readonly Graph.Value[] {\n return this._allData;\n }\n\n getNodes(): readonly Graph.Node[] {\n return this._nodes;\n }\n\n private buildGraph(graph: onnx.IGraphProto|ortFbs.Graph) {\n // build the graph - will throw exceptions if something fatal is detected\n if (graph instanceof onnx.GraphProto) {\n this.buildGraphFromOnnxFormat(graph);\n } else if (graph instanceof ortFbs.Graph) {\n this.buildGraphFromOrtFormat(graph);\n } else {\n throw new TypeError('Graph type is not supported.');\n }\n }\n private buildGraphFromOnnxFormat(graph: onnx.IGraphProto) {\n const dataIndices = new Map();\n this._allData = [];\n\n this._allInputIndices = [];\n this._allInputNames = [];\n\n this._allOutputIndices = [];\n this._allOutputNames = [];\n\n this._nodes = [];\n\n const nodesIndices = new Map();\n\n // scan all inputs\n if (!graph.input) {\n throw new Error('missing information in graph: input');\n }\n const inputValueNames = [];\n for (const i of graph.input) {\n if (dataIndices.has(i.name!)) {\n throw new Error(`duplicated input name: ${i.name}`);\n }\n const currentIndex = this._allData.push(new Value(i)) - 1;\n dataIndices.set(i.name!, currentIndex);\n inputValueNames.push(i.name!);\n }\n\n // scan all initializers\n if (!graph.initializer) {\n throw new Error('missing information in graph: initializer');\n }\n for (const i of graph.initializer) {\n let index = dataIndices.get(i.name!);\n if (index === undefined) {\n const value = new Value();\n value.type = {\n shape: {dims: ProtoUtil.tensorDimsFromProto(i.dims!)},\n tensorType: ProtoUtil.tensorDataTypeFromProto(i.dataType!)\n };\n index = this._allData.push(value) - 1;\n dataIndices.set(i.name!, index);\n }\n this._allData[index]._from = -1;\n this._allData[index].tensor = Tensor.fromProto(i);\n }\n\n // filter out input indices\n for (let i = 0; i < this._allData.length; i++) {\n if (!this._allData[i].tensor) {\n this._allInputIndices.push(i);\n this._allInputNames.push(inputValueNames[i]);\n }\n }\n\n // scan all outputs\n if (!graph.output) {\n throw new Error('missing information in graph: output');\n }\n for (const i of graph.output) {\n if (dataIndices.has(i.name!)) {\n throw new Error(`duplicated output name: ${i.name}`);\n }\n const currentIndex = this._allData.push(new Value(i)) - 1;\n dataIndices.set(i.name!, currentIndex);\n this._allOutputIndices.push(currentIndex);\n this._allOutputNames.push(i.name!);\n }\n\n // scan all nodes\n if (!graph.node) {\n throw new Error('missing information in graph: node');\n }\n for (const nodeProto of graph.node) {\n if (!nodeProto.name) {\n // assign a name to the node if it doesn't have one\n for (let pick = 0;; pick++) {\n const name = `unnamed_${nodeProto.opType}_${pick}`;\n if (!nodesIndices.has(name)) {\n nodeProto.name = name;\n break;\n }\n }\n }\n\n if (nodesIndices.has(nodeProto.name)) {\n throw new Error(`duplicated node name: ${nodeProto.name}`);\n }\n const currentIndex = this._nodes.push(new Node(nodeProto)) - 1;\n nodesIndices.set(nodeProto.name, currentIndex);\n }\n\n // scan node's outputs\n for (let i = 0; i < this._nodes.length; i++) {\n const node = this._nodes[i];\n const nodeProto = graph.node[i];\n if (!nodeProto.output) {\n throw new Error(`missing output for node: ${nodeProto.name}`);\n }\n for (const output of nodeProto.output) {\n let dataIndex = dataIndices.get(output);\n if (typeof dataIndex === 'undefined') {\n dataIndex = this._allData.push(new Value()) - 1;\n dataIndices.set(output, dataIndex);\n }\n node.outputs.push(dataIndex);\n\n if (this._allData[dataIndex]._from !== undefined) {\n throw new Error(`multiple nodes output to one data value: ${dataIndex}`);\n }\n this._allData[dataIndex]._from = i;\n\n // for the 'Constant' operator, just create a new edge in the graph corresponding to the 'output' of the\n // operator and ignore the node from the graph\n if (nodeProto.opType === 'Constant') {\n if (!nodeProto.attribute || nodeProto.attribute.length !== 1 || !nodeProto.attribute[0].t) {\n throw new Error('missing attributes or missing tensor value in attributes for this Constant operator');\n }\n if (!nodeProto.output || nodeProto.output.length !== 1) {\n throw new Error('missing output or incorrect number of outputs for this Constant operator');\n }\n node.outputs.pop();\n node.executeNode = false;\n\n this._allData[dataIndex]._from = -1;\n this._allData[dataIndex].tensor = Tensor.fromProto(nodeProto.attribute[0].t);\n }\n }\n }\n\n // scan node's inputs\n for (let i = 0; i < this._nodes.length; i++) {\n const node = this._nodes[i];\n const nodeProto = graph.node[i];\n\n if (!nodeProto.input) {\n throw new Error(`missing input for node: ${nodeProto.name}`);\n }\n for (const input of nodeProto.input) {\n const dataIndex = dataIndices.get(input);\n if (typeof dataIndex === 'undefined') {\n // handle exception when opset > 9 and roi / scales not given\n if (input === '' && (nodeProto.input.length === 3 || nodeProto.input.length === 4) &&\n nodeProto.opType === 'Resize') {\n continue;\n }\n throw new Error(`unrecognized input '${input}' for node: ${nodeProto.name}`);\n }\n node.inputs.push(dataIndex);\n\n this._allData[dataIndex]._to.push(i);\n }\n }\n\n return true;\n }\n\n private buildGraphFromOrtFormat(graph: ortFbs.Graph) {\n const dataIndices = new Map();\n this._allData = [];\n\n this._allInputIndices = [];\n this._allInputNames = [];\n\n this._allOutputIndices = [];\n this._allOutputNames = [];\n\n this._nodes = [];\n\n const nodesIndices = new Map();\n\n // scan all inputs\n const inputValueNames = [];\n for (let i = 0; i < graph.inputsLength(); i++) {\n const inputName = graph.inputs(i);\n if (dataIndices.has(inputName)) {\n throw new Error(`duplicated input name: ${inputName}`);\n }\n // Find the input typeInfo from nodeargs\n for (let j = 0; j < graph.nodeArgsLength(); j++) {\n if (graph.nodeArgs(j)?.name() === inputName) {\n const value = new Value();\n const valueType = graph.nodeArgs(j)?.type()?.valueType();\n if (valueType !== ortFbs.TypeInfoValue.tensor_type) {\n throw new Error('Unexpected value type for the nodeArg.');\n }\n const valueInfo = graph.nodeArgs(j)!.type()!.value(new ortFbs.TensorTypeAndShape())!;\n const type = ProtoUtil.tensorDataTypeFromProto(valueInfo.elemType());\n const shape = valueInfo.shape()!;\n const dims = [];\n for (let k = 0; k < shape.dimLength()!; k++) {\n dims.push(LongUtil.longToNumber(shape.dim(k)!.value()!.dimValue()!));\n }\n value.type = {shape: {dims}, tensorType: type};\n const currentIndex = this._allData.push(value) - 1;\n dataIndices.set(inputName, currentIndex);\n inputValueNames.push(inputName);\n }\n }\n }\n // check initializers\n for (let i = 0; i < graph.initializersLength(); i++) {\n const initializer = graph.initializers(i)!;\n let index = dataIndices.get(initializer.name()!);\n if (index === undefined) {\n const value = new Value();\n const dims = ProtoUtil.tensorDimsFromORTFormat(initializer);\n const type = ProtoUtil.tensorDataTypeFromProto(initializer.dataType());\n value.type = {shape: {dims}, tensorType: type};\n index = this._allData.push(value) - 1;\n dataIndices.set(initializer.name()!, index);\n }\n this._allData[index]._from = -1;\n this._allData[index].tensor = Tensor.fromOrtTensor(initializer);\n }\n\n // filter out input indices\n for (let i = 0; i < this._allData.length; i++) {\n if (!this._allData[i].tensor) {\n this._allInputIndices.push(i);\n this._allInputNames.push(inputValueNames[i]);\n }\n }\n\n // scan all outputs\n for (let i = 0; i < graph.outputsLength(); i++) {\n const outputName = graph.outputs(i);\n if (dataIndices.has(outputName)) {\n throw new Error(`duplicated output name: ${outputName}`);\n }\n const currentIndex = this._allData.push(new Value()) - 1;\n dataIndices.set(outputName, currentIndex);\n this._allOutputIndices.push(currentIndex);\n this._allOutputNames.push(outputName);\n }\n\n // scan all nodes\n if (!graph.nodes) {\n throw new Error('missing information in graph: node');\n }\n for (let i = 0; i < graph.nodesLength(); i++) {\n const nodeProto = graph.nodes(i);\n let name = nodeProto!.name();\n if (!name) {\n // assign a name to the node if it doesn't have one\n for (let pick = 0;; pick++) {\n name = `unnamed_${nodeProto!.opType()}_${pick}`;\n if (!nodesIndices.has(name)) {\n // an unique name is found. break.\n break;\n }\n }\n }\n\n if (nodesIndices.has(name)) {\n throw new Error(`duplicated node name: ${name}`);\n }\n const currentIndex = this._nodes.push(new Node(nodeProto!, name)) - 1;\n nodesIndices.set(name, currentIndex);\n }\n\n // scan node's outputs\n for (let i = 0; i < this._nodes.length; i++) {\n const node = this._nodes[i];\n const nodeProto = graph.nodes(i);\n if (nodeProto == null) {\n throw new Error(`No node exists at index ${i}`);\n }\n if (nodeProto?.outputsLength() === 0) {\n throw new Error(`missing output for node: ${nodeProto.name}`);\n }\n for (let j = 0; j < nodeProto?.outputsLength(); j++) {\n const output = nodeProto?.outputs(j);\n let dataIndex = dataIndices.get(output);\n if (typeof dataIndex === 'undefined') {\n dataIndex = this._allData.push(new Value()) - 1;\n dataIndices.set(output, dataIndex);\n }\n node.outputs.push(dataIndex);\n\n if (this._allData[dataIndex]._from !== undefined) {\n throw new Error(`multiple nodes output to one data value: ${dataIndex}`);\n }\n this._allData[dataIndex]._from = i;\n\n // for the 'Constant' operator, just create a new edge in the graph corresponding to the 'output' of the\n // operator and ignore the node from the graph\n if (nodeProto.opType() === 'Constant') {\n if (nodeProto.attributesLength() !== 1 || !nodeProto.attributes(0)!.t()) {\n throw new Error('missing attributes or missing tensor value in attributes for this Constant operator');\n }\n if (nodeProto.outputsLength() !== 1) {\n throw new Error('missing output or incorrect number of outputs for this Constant operator');\n }\n node.outputs.pop();\n node.executeNode = false;\n\n this._allData[dataIndex]._from = -1;\n this._allData[dataIndex].tensor = Tensor.fromOrtTensor(nodeProto.attributes(0)!.t()!);\n }\n }\n }\n\n // scan node's inputs\n for (let i = 0; i < this._nodes.length; i++) {\n const node = this._nodes[i];\n const nodeProto = graph.nodes(i)!;\n\n if (nodeProto.inputsLength() === 0) {\n throw new Error(`missing input for node: ${nodeProto.name}`);\n }\n for (let j = 0; j < nodeProto.inputsLength()!; j++) {\n const input = nodeProto.inputs(j)!;\n const dataIndex = dataIndices.get(input);\n if (typeof dataIndex === 'undefined') {\n throw new Error(`unrecognized input '${input}' for node: ${nodeProto!.name()}`);\n }\n node.inputs.push(dataIndex);\n\n this._allData[dataIndex]._to.push(i);\n }\n }\n }\n\n private checkIsAcyclic() {\n // go through the graph and check for cycles or other fatal inconsistencies\n const starters: Set = new Set();\n this._allInputIndices.forEach(i => {\n const data = this._allData[i];\n data._to.forEach(j => {\n starters.add(j);\n });\n });\n\n // Iterative DFS to check for cycles\n const nodesStack = Array.from(starters);\n const nodesState = new Array(this._nodes.length).fill('white');\n\n while (nodesStack.length > 0) {\n const nodeIndex = nodesStack.pop()!;\n // this node has now been processed completely. Mark this node 'black' to denote this.\n if (nodesState[nodeIndex] === 'gray') {\n nodesState[nodeIndex] = 'black';\n } else {\n // this node is under processing stage. mark this node 'gray' to denote this.\n nodesStack.push(nodeIndex);\n nodesState[nodeIndex] = 'gray';\n\n this._nodes[nodeIndex].outputs.forEach((outgoingEdgeIndex) => {\n const data = this._allData[outgoingEdgeIndex];\n if (typeof data.tensor !== 'undefined') {\n throw new Error('node outputs should not be initialized');\n }\n if (data._from !== nodeIndex) {\n throw new Error('from property of the Value object doesn\\'t match index of Node being processed');\n }\n data._to.forEach((downstreamNodeIndex) => {\n // back edge found - cyclic\n if (nodesState[downstreamNodeIndex] === 'gray') {\n throw new Error('model graph is cyclic');\n }\n // tree edge found - continue processing by adding it to stack\n else if (nodesState[downstreamNodeIndex] === 'white') {\n nodesStack.push(downstreamNodeIndex);\n }\n });\n });\n }\n }\n }\n\n private transformGraph(graphInitializer?: Graph.Initializer): void {\n // apply common transform\n this.removeAllIdentityNodes();\n this.removeAllDropoutNodes();\n this.fuseConvActivationNodes();\n // apply initializer specific transform\n if (graphInitializer) {\n graphInitializer.transformGraph(this);\n }\n\n // finalize graph\n this.finalizeGraph();\n }\n\n /**\n * finalize the graph.\n *\n * this function should be called after all the transformation completed.\n * this function removes all unnecessary nodes and values from the graph\n */\n finalizeGraph() {\n let offset = 0;\n // delete all nodes that are not being executed\n // The graph is represented using these two arrays\n // this._nodes - Array holding the kernels to execute - each entry is a kernel pointing to this._allData\n // this._allData - hold 2 fields - to [] & from - these feileds hold the graph map for inputs and outputs per node\n // newIndices - remapping the graph after reading the flag 'executeNode'\n const newIndices = new Array(this._nodes.length, 0);\n let nodePossition = 0;\n\n for (let i = 0; i < this._nodes.length; i++) {\n // giving new indexes to the nodes based on execution flag\n newIndices[i] = nodePossition;\n if (this._nodes[i].executeNode) {\n if (nodePossition !== i) {\n this._nodes[nodePossition] = this._nodes[i];\n }\n nodePossition++;\n\n } else {\n // delete all output values\n this._nodes[i].outputs.forEach(ind => {\n this._allData[ind]._from = -2;\n });\n }\n }\n\n // removing the unused nodes\n this._nodes.splice(nodePossition, this._nodes.length - nodePossition);\n\n // Updating this._allData according to the new this._nodes\n for (let i = 0; i < this._allData.length; i++) {\n const currentData = this._allData[i];\n if (currentData._from !== undefined && currentData._from !== -1 && currentData._from !== -2) {\n currentData._from = newIndices[currentData._from];\n }\n\n for (let j = 0; j < currentData._to.length; j++) {\n if (currentData._to[j] >= 0) {\n currentData._to[j] = newIndices[currentData._to[j]];\n } else {\n throw new Error('Trying to update a removed node');\n }\n }\n }\n\n offset = 0;\n // delete all values that are not being referenced\n for (let i = 0; i < this._allData.length; i++) {\n // if current value is neither linked to next node, nor an output value, remove it.\n if (this._allData[i].from === -2 && this._allOutputIndices.indexOf(i + offset) === -1) {\n offset++;\n this._allData.splice(i, 1);\n i--;\n continue;\n }\n if (offset > 0) {\n let ind = -1;\n // if current value is neither an input value nor an initializer, find the node it's\n // coming from and update the corresponding node output\n if (this._allData[i].from !== undefined && this._allData[i].from !== -1) {\n ind = this._nodes[this._allData[i].from].outputs.indexOf(i + offset);\n if (ind !== -1) {\n this._nodes[this._allData[i].from].outputs[ind] = i;\n }\n } else {\n // if current value is an input value, update its reference in inputIndices\n ind = this._allInputIndices.indexOf(i + offset);\n if (ind !== -1) {\n this._allInputIndices[ind] = i;\n }\n }\n\n // find the node that the current value is linking to and update its input reference\n this._allData[i].to.forEach(node => {\n ind = this._nodes[node].inputs.indexOf(i + offset);\n if (ind !== -1) {\n this._nodes[node].inputs[ind] = i;\n }\n });\n if (this._allData[i].to.length === 0) {\n // if current value is a graph output, update its reference in outputIndices\n ind = this._allOutputIndices.indexOf(i + offset);\n if (ind !== -1) {\n this._allOutputIndices[ind] = i;\n }\n }\n }\n }\n }\n\n /**\n * Delete the specified node. Assume the node has one incoming input and the first output connected to other nodes.\n * An input validation must be done before calling this function.\n * @param nodeIndex The index of node to be deleted\n */\n private deleteNode(nodeIndex: number) {\n const node = this._nodes[nodeIndex];\n if (node.outputs.length > 1) {\n for (let i = 1; i < node.outputs.length; i++) {\n if (this._allData[node.outputs[i]].to.length > 0) {\n throw new Error('Node deletion with more than one output connected to other nodes is not supported. ');\n }\n }\n }\n\n // this node wil not be executed\n node.executeNode = false;\n const inputValueIndex = node.inputs[0];\n const outputValueIndex = node.outputs[0];\n const nodesConsumingOutput = this._allData[outputValueIndex].to;\n\n // remove this node from the to property of the input Value\n for (let i = 0; i < node.inputs.length; i++) {\n const delIndex = this._allData[node.inputs[i]].to.indexOf(nodeIndex);\n // should not happen\n if (delIndex === -1) {\n throw new Error('The Value object doesn\\'t have the current Node in it\\'s \\'to\\' property ');\n }\n this._allData[node.inputs[i]].to.splice(delIndex, 1);\n }\n\n // clear node indices consuming this output Value\n this._allData[outputValueIndex]._to = [];\n\n // if the output of this node is a graph output, adjust the index appropriately\n const index = this._allOutputIndices.indexOf(outputValueIndex);\n if (index !== -1) {\n this._allOutputIndices[index] = inputValueIndex;\n }\n\n // override the inputs for nodes consuming this node's output with the input to this node\n if (nodesConsumingOutput && nodesConsumingOutput.length > 0) {\n for (const nodeIndex of nodesConsumingOutput) {\n const replaceIndex = this._nodes[nodeIndex].inputs.indexOf(outputValueIndex);\n // should not happen\n if (replaceIndex === -1) {\n throw new Error('The Node object doesn\\'t have the output Value in it\\'s \\'inputs\\' property ');\n }\n this._nodes[nodeIndex].inputs[replaceIndex] = inputValueIndex;\n this._allData[inputValueIndex].to.push(nodeIndex);\n }\n }\n }\n\n removeAllDropoutNodes() {\n let nodeIndex = 0;\n for (const node of this._nodes) {\n // weed out 'Dropout' nodes so that no time is wasted in execution\n if (node.opType === 'Dropout') {\n // the node should have exactly 1 input and 1 or 2 outputs\n if (node.inputs.length !== 1) {\n throw new Error('Dropout nodes should only contain one input. ');\n }\n if (node.outputs.length !== 1 && node.outputs.length !== 2) {\n throw new Error('Dropout nodes should contain either 1 or 2 output(s)');\n }\n // the second output should not be referenced by any other node\n if (node.outputs.length === 2 && this._allData[node.outputs[1]]._to.length !== 0) {\n throw new Error('Dropout nodes\\'s second output should not be referenced by other nodes');\n }\n this.deleteNode(nodeIndex);\n }\n nodeIndex++;\n }\n }\n\n removeAllIdentityNodes() {\n let nodeIndex = 0;\n for (const node of this._nodes) {\n // weed out 'Identity' nodes so that no time is wasted in execution\n if (node.opType === 'Identity') {\n this.deleteNode(nodeIndex);\n }\n nodeIndex++;\n }\n }\n\n isActivation(n: Node): boolean {\n switch (n.opType) {\n // TODO: add other activation methods\n case 'Relu':\n case 'Sigmoid':\n case 'Clip':\n return true;\n default:\n return false;\n }\n }\n\n fuseConvActivationNodes() {\n for (const node of this._nodes) {\n if (node.opType === 'Conv') {\n const next = this._allData[node.outputs[0]]._to;\n if (next.length === 1 && this.isActivation(this._nodes[next[0]])) {\n const child = this._nodes[next[0]];\n if (child.opType === 'Clip') {\n if (child.inputs.length === 1) {\n try {\n node.attributes.set(\n 'activation_params', 'floats',\n [child.attributes.getFloat('min'), child.attributes.getFloat('max')]);\n } catch (e) {\n node.attributes.set('activation_params', 'floats', [MIN_CLIP, MAX_CLIP]);\n }\n } else if (\n child.inputs.length >= 3 && this._allData[child.inputs[1]].tensor !== undefined &&\n this._allData[child.inputs[2]].tensor !== undefined) {\n node.attributes.set('activation_params', 'floats', [\n this._allData[child.inputs[1]].tensor!.floatData[0], this._allData[child.inputs[2]].tensor!.floatData[0]\n ]);\n } else {\n // Skip fusion with clip node since clip min and clip max are not coming from initializer\n continue;\n }\n }\n node.attributes.set('activation', 'string', (child.opType));\n this.deleteNode(next[0]);\n }\n }\n }\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {flatbuffers} from 'flatbuffers';\n\nimport {Graph} from './graph';\nimport {OpSet} from './opset';\nimport {onnxruntime} from './ort-schema/flatbuffers/ort-generated';\nimport {onnx} from './ort-schema/protobuf/onnx';\nimport {LongUtil} from './util';\n\nimport ortFbs = onnxruntime.experimental.fbs;\n\nexport class Model {\n // empty model\n constructor() {}\n\n load(buf: Uint8Array, graphInitializer?: Graph.Initializer, isOrtFormat?: boolean): void {\n let onnxError: Error|undefined;\n if (!isOrtFormat) {\n // isOrtFormat === false || isOrtFormat === undefined\n try {\n this.loadFromOnnxFormat(buf, graphInitializer);\n return;\n } catch (e) {\n if (isOrtFormat !== undefined) {\n throw e;\n }\n onnxError = e;\n }\n }\n\n try {\n this.loadFromOrtFormat(buf, graphInitializer);\n } catch (e) {\n if (isOrtFormat !== undefined) {\n throw e;\n }\n // Tried both formats and failed (when isOrtFormat === undefined)\n throw new Error(`Failed to load model as ONNX format: ${onnxError}\\nas ORT format: ${e}`);\n }\n }\n\n private loadFromOnnxFormat(buf: Uint8Array, graphInitializer?: Graph.Initializer): void {\n const modelProto = onnx.ModelProto.decode(buf);\n const irVersion = LongUtil.longToNumber(modelProto.irVersion);\n if (irVersion < 3) {\n throw new Error('only support ONNX model with IR_VERSION>=3');\n }\n\n this._opsets =\n modelProto.opsetImport.map(i => ({domain: i.domain as string, version: LongUtil.longToNumber(i.version!)}));\n\n this._graph = Graph.from(modelProto.graph!, graphInitializer);\n }\n\n private loadFromOrtFormat(buf: Uint8Array, graphInitializer?: Graph.Initializer): void {\n const fb = new flatbuffers.ByteBuffer(buf);\n const ortModel = ortFbs.InferenceSession.getRootAsInferenceSession(fb).model()!;\n const irVersion = LongUtil.longToNumber(ortModel.irVersion());\n if (irVersion < 3) {\n throw new Error('only support ONNX model with IR_VERSION>=3');\n }\n this._opsets = [];\n for (let i = 0; i < ortModel.opsetImportLength(); i++) {\n const opsetId = ortModel.opsetImport(i)!;\n this._opsets.push({domain: opsetId?.domain() as string, version: LongUtil.longToNumber(opsetId.version()!)});\n }\n\n this._graph = Graph.from(ortModel.graph()!, graphInitializer);\n }\n\n private _graph: Graph;\n get graph(): Graph {\n return this._graph;\n }\n\n private _opsets: OpSet[];\n get opsets(): readonly OpSet[] {\n return this._opsets;\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {resolveBackend, SessionHandlerType} from './backend';\nimport {ExecutionPlan} from './execution-plan';\nimport {Graph} from './graph';\nimport {Profiler} from './instrument';\nimport {Model} from './model';\nimport {Operator} from './operators';\nimport {Tensor} from './tensor';\n\nexport declare namespace Session {\n export interface Config {\n backendHint?: string;\n profiler?: Profiler.Config;\n }\n\n export interface Context {\n profiler: Readonly;\n graphInputTypes?: Tensor.DataType[];\n graphInputDims?: Array;\n }\n}\n\nexport class Session {\n constructor(config: Session.Config = {}) {\n this._initialized = false;\n this.backendHint = config.backendHint;\n this.profiler = Profiler.create(config.profiler);\n this.context = {profiler: this.profiler, graphInputTypes: [], graphInputDims: []};\n }\n\n get inputNames(): readonly string[] {\n return this._model.graph.getInputNames();\n }\n get outputNames(): readonly string[] {\n return this._model.graph.getOutputNames();\n }\n\n startProfiling() {\n this.profiler.start();\n }\n\n endProfiling() {\n this.profiler.stop();\n }\n\n async loadModel(uri: string): Promise;\n async loadModel(buffer: ArrayBuffer, byteOffset?: number, length?: number): Promise;\n async loadModel(buffer: Uint8Array): Promise;\n async loadModel(arg: string|ArrayBuffer|Uint8Array, byteOffset?: number, length?: number): Promise {\n await this.profiler.event('session', 'Session.loadModel', async () => {\n // resolve backend and session handler\n const backend = await resolveBackend(this.backendHint);\n this.sessionHandler = backend.createSessionHandler(this.context);\n\n this._model = new Model();\n if (typeof arg === 'string') {\n const isOrtFormat = arg.endsWith('.ort');\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n // node\n const {readFile} = require('node:fs/promises');\n const buf = await readFile(arg);\n this.initialize(buf, isOrtFormat);\n } else {\n // browser\n const response = await fetch(arg);\n const buf = await response.arrayBuffer();\n this.initialize(new Uint8Array(buf), isOrtFormat);\n }\n } else if (!ArrayBuffer.isView(arg)) {\n // load model from ArrayBuffer\n const arr = new Uint8Array(arg, byteOffset || 0, length || arg.byteLength);\n this.initialize(arr);\n } else {\n // load model from Uint8array\n this.initialize(arg);\n }\n });\n }\n\n private initialize(modelProtoBlob: Uint8Array, isOrtFormat?: boolean): void {\n if (this._initialized) {\n throw new Error('already initialized');\n }\n\n this.profiler.event('session', 'Session.initialize', () => {\n // load graph\n const graphInitializer =\n this.sessionHandler.transformGraph ? this.sessionHandler as Graph.Initializer : undefined;\n this._model.load(modelProtoBlob, graphInitializer, isOrtFormat);\n\n // graph is completely initialzied at this stage , let the interested handlers know\n if (this.sessionHandler.onGraphInitialized) {\n this.sessionHandler.onGraphInitialized(this._model.graph);\n }\n // initialize each operator in the graph\n this.initializeOps(this._model.graph);\n\n // instantiate an ExecutionPlan object to be used by the Session object\n this._executionPlan = new ExecutionPlan(this._model.graph, this._ops, this.profiler);\n });\n\n this._initialized = true;\n }\n\n async run(inputs: Map|Tensor[]): Promise> {\n if (!this._initialized) {\n throw new Error('session not initialized yet');\n }\n\n return this.profiler.event('session', 'Session.run', async () => {\n const inputTensors = this.normalizeAndValidateInputs(inputs);\n\n const outputTensors = await this._executionPlan.execute(this.sessionHandler, inputTensors);\n\n return this.createOutput(outputTensors);\n });\n }\n\n private normalizeAndValidateInputs(inputs: Map|Tensor[]): Tensor[] {\n const modelInputNames = this._model.graph.getInputNames();\n\n // normalize inputs\n // inputs: Tensor[]\n if (Array.isArray(inputs)) {\n if (inputs.length !== modelInputNames.length) {\n throw new Error(`incorrect input array length: expected ${modelInputNames.length} but got ${inputs.length}`);\n }\n }\n // convert map to array\n // inputs: Map\n else {\n if (inputs.size !== modelInputNames.length) {\n throw new Error(`incorrect input map size: expected ${modelInputNames.length} but got ${inputs.size}`);\n }\n\n const sortedInputs = new Array(inputs.size);\n let sortedInputsIndex = 0;\n for (let i = 0; i < modelInputNames.length; ++i) {\n const tensor = inputs.get(modelInputNames[i]);\n if (!tensor) {\n throw new Error(`missing input tensor for: '${name}'`);\n }\n sortedInputs[sortedInputsIndex++] = tensor;\n }\n\n inputs = sortedInputs;\n }\n\n // validate dims requirements\n // First session run - graph input data is not cached for the session\n if (!this.context.graphInputTypes || this.context.graphInputTypes.length === 0 || !this.context.graphInputDims ||\n this.context.graphInputDims.length === 0) {\n const modelInputIndices = this._model.graph.getInputIndices();\n const modelValues = this._model.graph.getValues();\n\n const graphInputDims = new Array(modelInputIndices.length);\n\n for (let i = 0; i < modelInputIndices.length; ++i) {\n const graphInput = modelValues[modelInputIndices[i]];\n graphInputDims[i] = graphInput.type!.shape.dims;\n\n // cached for second and subsequent runs.\n // Some parts of the framework works on the assumption that the graph and types and shapes are static\n this.context.graphInputTypes!.push(graphInput.type!.tensorType);\n this.context.graphInputDims!.push(inputs[i].dims);\n }\n\n this.validateInputTensorDims(graphInputDims, inputs, true);\n }\n\n // Second and subsequent session runs - graph input data is cached for the session\n else {\n this.validateInputTensorDims(this.context.graphInputDims, inputs, false);\n }\n\n // validate types requirement\n this.validateInputTensorTypes(this.context.graphInputTypes!, inputs);\n\n return inputs;\n }\n\n private validateInputTensorTypes(graphInputTypes: Tensor.DataType[], givenInputs: Tensor[]) {\n for (let i = 0; i < givenInputs.length; i++) {\n const expectedType = graphInputTypes[i];\n const actualType = givenInputs[i].type;\n if (expectedType !== actualType) {\n throw new Error(`input tensor[${i}] check failed: expected type '${expectedType}' but got ${actualType}`);\n }\n }\n }\n\n private validateInputTensorDims(\n graphInputDims: Array, givenInputs: Tensor[], noneDimSupported: boolean) {\n for (let i = 0; i < givenInputs.length; i++) {\n const expectedDims = graphInputDims[i];\n const actualDims = givenInputs[i].dims;\n if (!this.compareTensorDims(expectedDims, actualDims, noneDimSupported)) {\n throw new Error(`input tensor[${i}] check failed: expected shape '[${expectedDims.join(',')}]' but got [${\n actualDims.join(',')}]`);\n }\n }\n }\n\n private compareTensorDims(expectedDims: readonly number[], actualDims: readonly number[], noneDimSupported: boolean):\n boolean {\n if (expectedDims.length !== actualDims.length) {\n return false;\n }\n\n for (let i = 0; i < expectedDims.length; ++i) {\n if (expectedDims[i] !== actualDims[i] && (!noneDimSupported || expectedDims[i] !== 0)) {\n // data shape mis-match AND not a 'None' dimension.\n return false;\n }\n }\n\n return true;\n }\n\n private createOutput(outputTensors: Tensor[]): Map {\n const modelOutputNames = this._model.graph.getOutputNames();\n if (outputTensors.length !== modelOutputNames.length) {\n throw new Error('expected number of outputs do not match number of generated outputs');\n }\n\n const output = new Map();\n for (let i = 0; i < modelOutputNames.length; ++i) {\n output.set(modelOutputNames[i], outputTensors[i]);\n }\n\n return output;\n }\n\n private initializeOps(graph: Graph): void {\n const nodes = graph.getNodes();\n this._ops = new Array(nodes.length);\n\n for (let i = 0; i < nodes.length; i++) {\n this._ops[i] = this.sessionHandler.resolve(nodes[i], this._model.opsets, graph);\n }\n }\n\n private _model: Model;\n private _initialized: boolean;\n\n private _ops: Operator[];\n private _executionPlan: ExecutionPlan;\n\n private backendHint?: string;\n\n private sessionHandler: SessionHandlerType;\n private context: Session.Context;\n private profiler: Readonly;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession, InferenceSessionHandler, SessionHandler, Tensor} from 'onnxruntime-common';\n\nimport {Session} from './session';\nimport {Tensor as OnnxjsTensor} from './tensor';\n\nexport class OnnxjsSessionHandler implements InferenceSessionHandler {\n constructor(private session: Session) {\n this.inputNames = this.session.inputNames;\n this.outputNames = this.session.outputNames;\n }\n\n async dispose(): Promise {}\n inputNames: readonly string[];\n outputNames: readonly string[];\n async run(\n feeds: SessionHandler.FeedsType, _fetches: SessionHandler.FetchesType,\n _options: InferenceSession.RunOptions): Promise {\n const inputMap = new Map();\n for (const name in feeds) {\n if (Object.hasOwnProperty.call(feeds, name)) {\n const feed = feeds[name];\n inputMap.set(\n name,\n new OnnxjsTensor(\n feed.dims, feed.type as OnnxjsTensor.DataType, undefined, undefined,\n feed.data as OnnxjsTensor.NumberType));\n }\n }\n const outputMap = await this.session.run(inputMap);\n const output: SessionHandler.ReturnType = {};\n outputMap.forEach((tensor, name) => {\n output[name] = new Tensor(tensor.type, tensor.data, tensor.dims);\n });\n return output;\n }\n startProfiling(): void {\n this.session.startProfiling();\n }\n endProfiling(): void {\n this.session.endProfiling();\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/* eslint-disable import/no-internal-modules */\nimport {Backend, InferenceSession, InferenceSessionHandler} from 'onnxruntime-common';\n\nimport {Session} from './onnxjs/session';\nimport {OnnxjsSessionHandler} from './onnxjs/session-handler-inference';\n\nclass OnnxjsBackend implements Backend {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n async init(): Promise {}\n\n async createInferenceSessionHandler(pathOrBuffer: string|Uint8Array, options?: InferenceSession.SessionOptions):\n Promise {\n // NOTE: Session.Config(from onnx.js) is not compatible with InferenceSession.SessionOptions(from\n // onnxruntime-common).\n // In future we should remove Session.Config and use InferenceSession.SessionOptions.\n // Currently we allow this to happen to make test runner work.\n const session = new Session(options as unknown as Session.Config);\n\n // typescript cannot merge method override correctly (so far in 4.2.3). need if-else to call the method.\n if (typeof pathOrBuffer === 'string') {\n await session.loadModel(pathOrBuffer);\n } else {\n await session.loadModel(pathOrBuffer);\n }\n\n return new OnnxjsSessionHandler(session);\n }\n}\n\nexport const onnxjsBackend = new OnnxjsBackend();\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport const isNode = !!(typeof process !== 'undefined' && process.versions && process.versions.node);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/// \n\n//\n// * type hack for \"HTMLImageElement\"\n//\n// in typescript, the type of \"HTMLImageElement\" is defined in lib.dom.d.ts, which is conflict with lib.webworker.d.ts.\n// when we use webworker, the lib.webworker.d.ts will be used, which does not have HTMLImageElement defined.\n//\n// we will get the following errors complaining that HTMLImageElement is not defined:\n//\n// ====================================================================================================================\n//\n// ../common/dist/cjs/tensor-factory.d.ts:187:29 - error TS2552: Cannot find name 'HTMLImageElement'. Did you mean\n// 'HTMLLIElement'?\n//\n// 187 fromImage(imageElement: HTMLImageElement, options?: TensorFromImageElementOptions):\n// Promise | TypedTensor<'uint8'>>;\n// ~~~~~~~~~~~~~~~~\n//\n// node_modules/@webgpu/types/dist/index.d.ts:83:7 - error TS2552: Cannot find name 'HTMLImageElement'. Did you mean\n// 'HTMLLIElement'?\n//\n// 83 | HTMLImageElement\n// ~~~~~~~~~~~~~~~~\n//\n// ====================================================================================================================\n//\n// `HTMLImageElement` is only used in type declaration and not in real code. So we define it as `unknown` here to\n// bypass the type check.\n\n//\n// * type hack for \"document\"\n//\n// in typescript, the type of \"document\" is defined in lib.dom.d.ts, so it's not available in webworker.\n//\n// we will get the following errors complaining that document is not defined:\n//\n// ====================================================================================================================\n//\n// lib/wasm/wasm-utils-import.ts:7:33 - error TS2584: Cannot find name 'document'. Do you need to change your target\n// library? Try changing the 'lib' compiler option to include 'dom'.\n//\n// 7 export const scriptSrc = typeof document !== 'undefined' ? (document?.currentScript as HTMLScriptElement)?.src :\n// ~~~~~~~~\n//\n// lib/wasm/wasm-utils-import.ts:7:61 - error TS2584: Cannot find name 'document'. Do you need to change your target\n// library? Try changing the 'lib' compiler option to include 'dom'.\n//\n// 7 export const scriptSrc = typeof document !== 'undefined' ? (document?.currentScript as HTMLScriptElement)?.src :\n// ~~~~~~~~\n//\n// lib/wasm/wasm-utils-import.ts:7:88 - error TS2552: Cannot find name 'HTMLScriptElement'. Did you mean\n// 'HTMLLIElement'?\n//\n// 7 export const scriptSrc = typeof document !== 'undefined' ? (document?.currentScript as HTMLScriptElement)?.src :\n// ~~~~~~~~~~~~~~~~~\n// ====================================================================================================================\n//\n// `document` is used to get the current script URL, which is not available in webworker. This file is served as a\n// \"dual\" file for entries of both webworker and the esm module.\n//\ndeclare global {\n type HTMLImageElement = unknown;\n type HTMLScriptElement = {src?: string};\n const document: undefined|{currentScript?: HTMLScriptElement};\n}\n\n/**\n * @summary\n *\n * This file is served as a \"dual\" file for both entries of the following:\n * - The proxy worker itself.\n * - When used as a worker, it listens to the messages from the main thread and performs the corresponding operations.\n * - Should be imported directly using `new Worker()` in the main thread.\n *\n * - The ESM module that creates the proxy worker (as a worker launcher).\n * - When used as a worker launcher, it creates the proxy worker and returns it.\n * - Should be imported using `import()` in the main thread, with the query parameter `import=1`.\n *\n * This file will be always compiling into ESM format.\n */\n\nimport type {OrtWasmMessage, SerializableTensorMetadata} from '../proxy-messages.js';\nimport {createSession, copyFromExternalBuffer, endProfiling, extractTransferableBuffers, initEp, initRuntime, releaseSession, run} from '../wasm-core-impl.js';\nimport {initializeWebAssembly} from '../wasm-factory.js';\nimport {scriptSrc} from '../wasm-utils-import.js';\n\nconst WORKER_NAME = 'ort-wasm-proxy-worker';\nconst isProxyWorker = globalThis.self?.name === WORKER_NAME;\n\nif (isProxyWorker) {\n // Worker thread\n self.onmessage = (ev: MessageEvent): void => {\n const {type, in : message} = ev.data;\n try {\n switch (type) {\n case 'init-wasm':\n initializeWebAssembly(message!.wasm)\n .then(\n () => {\n initRuntime(message!).then(\n () => {\n postMessage({type});\n },\n err => {\n postMessage({type, err});\n });\n },\n err => {\n postMessage({type, err});\n });\n break;\n case 'init-ep': {\n const {epName, env} = message!;\n initEp(env, epName)\n .then(\n () => {\n postMessage({type});\n },\n err => {\n postMessage({type, err});\n });\n break;\n }\n case 'copy-from': {\n const {buffer} = message!;\n const bufferData = copyFromExternalBuffer(buffer);\n postMessage({type, out: bufferData} as OrtWasmMessage);\n break;\n }\n case 'create': {\n const {model, options} = message!;\n createSession(model, options)\n .then(\n sessionMetadata => {\n postMessage({type, out: sessionMetadata} as OrtWasmMessage);\n },\n err => {\n postMessage({type, err});\n });\n break;\n }\n case 'release':\n releaseSession(message!);\n postMessage({type});\n break;\n case 'run': {\n const {sessionId, inputIndices, inputs, outputIndices, options} = message!;\n run(sessionId, inputIndices, inputs, outputIndices, new Array(outputIndices.length).fill(null), options)\n .then(\n outputs => {\n if (outputs.some(o => o[3] !== 'cpu')) {\n postMessage({type, err: 'Proxy does not support non-cpu tensor location.'});\n } else {\n postMessage(\n {type, out: outputs} as OrtWasmMessage,\n extractTransferableBuffers([...inputs, ...outputs] as SerializableTensorMetadata[]));\n }\n },\n err => {\n postMessage({type, err});\n });\n break;\n }\n case 'end-profiling':\n endProfiling(message!);\n postMessage({type});\n break;\n default:\n }\n } catch (err) {\n postMessage({type, err} as OrtWasmMessage);\n }\n };\n}\n\nexport default isProxyWorker ?\n null :\n (urlOverride?: string) =>\n new Worker(urlOverride ?? scriptSrc!, {type: BUILD_DEFS.IS_ESM ? 'module' : 'classic', name: WORKER_NAME});\n", "var r,e=(r=import.meta.url,async function(e={}){function t(){return k.buffer!=R.buffer&&Y(),R}function n(){return k.buffer!=R.buffer&&Y(),P}function a(){return k.buffer!=R.buffer&&Y(),D}function o(){return k.buffer!=R.buffer&&Y(),F}function i(){return k.buffer!=R.buffer&&Y(),B}function s(){return k.buffer!=R.buffer&&Y(),I}function u(){return k.buffer!=R.buffer&&Y(),U}function f(){return k.buffer!=R.buffer&&Y(),G}var l,c,d=Object.assign({},e),b=new Promise(((r,e)=>{l=r,c=e})),g=\"object\"==typeof window,m=\"function\"==typeof importScripts,p=m&&\"em-pthread\"==self.name;d.mountExternalData=(r,e)=>{(d.Cb||(d.Cb=new Map)).set(r,e)},d.unmountExternalData=()=>{delete d.Cb};var h=globalThis.SharedArrayBuffer??new WebAssembly.Memory({initial:0,maximum:0,shared:!0}).buffer.constructor;let v=()=>{const r=(r,e,t)=>(...n)=>{const a=Ye,o=e?.();n=r(...n);const i=e?.();return o!==i&&(r=i,t(o),e=t=null),Ye!=a?new Promise(((r,e)=>{Qe={resolve:r,reject:e}})):n},e=r=>async(...e)=>{try{if(d.Bb)throw Error(\"Session already started\");const t=d.Bb={Zb:e[0],errors:[]},n=await r(...e);if(d.Bb!==t)throw Error(\"Session mismatch\");d.Jb?.flush();const a=t.errors;if(0r)),0d._OrtCreateSession),(r=>d._OrtCreateSession=r)),d._OrtRun=e(r(d._OrtRun,(()=>d._OrtRun),(r=>d._OrtRun=r))),d._OrtRunWithBinding=e(r(d._OrtRunWithBinding,(()=>d._OrtRunWithBinding),(r=>d._OrtRunWithBinding=r))),d._OrtBindInput=r(d._OrtBindInput,(()=>d._OrtBindInput),(r=>d._OrtBindInput=r)),v=void 0};d.jsepInit=(r,e)=>{if(v?.(),\"webgpu\"===r){[d.Jb,d.Qb,d.Ub,d.Kb,d.Tb,d.gb,d.Vb,d.Xb,d.Rb,d.Sb,d.Wb]=e;const r=d.Jb;d.jsepRegisterBuffer=(e,t,n,a)=>r.registerBuffer(e,t,n,a),d.jsepGetBuffer=e=>r.getBuffer(e),d.jsepCreateDownloader=(e,t,n)=>r.createDownloader(e,t,n),d.jsepOnReleaseSession=e=>{r.onReleaseSession(e)},d.jsepOnRunStart=e=>r.onRunStart(e)}};var y,w,A=Object.assign({},d),_=\"./this.program\",C=(r,e)=>{throw e},O=\"\";(g||m)&&(m?O=self.location.href:\"undefined\"!=typeof document&&document.currentScript&&(O=document.currentScript.src),r&&(O=r),O=O.startsWith(\"blob:\")?\"\":O.substr(0,O.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1),r=>{var e=new XMLHttpRequest;return e.open(\"GET\",r,!1),e.send(null),e.responseText},m&&(w=r=>{var e=new XMLHttpRequest;return e.open(\"GET\",r,!1),e.responseType=\"arraybuffer\",e.send(null),new Uint8Array(e.response)}),y=(r,e,t)=>{var n=new XMLHttpRequest;n.open(\"GET\",r,!0),n.responseType=\"arraybuffer\",n.onload=()=>{200==n.status||0==n.status&&n.response?e(n.response):t()},n.onerror=t,n.send(null)});var T=console.log.bind(console),S=console.error.bind(console),W=T,E=S;if(Object.assign(d,A),A=null,p){var x,M=!1;function Dn(r){try{var e=r.data,t=e.cmd;if(\"load\"===t){let r=[];self.onmessage=e=>r.push(e),self.startWorker=()=>{postMessage({cmd:\"loaded\"});for(let e of r)Dn(e);self.onmessage=Dn};for(const r of e.handlers)d[r]&&!d[r].proxy||(d[r]=(...e)=>{postMessage({Ib:\"callHandler\",hc:r,args:e})},\"print\"==r&&(W=d[r]),\"printErr\"==r&&(E=d[r]));k=e.wasmMemory,Y(),x(e.wasmModule)}else if(\"run\"===t){wn(e.pthread_ptr,0,0,1,0,0),He(e.pthread_ptr),Tr(),Ar(),M||(mn(),M=!0);try{Sr(e.start_routine,e.arg)}catch(r){if(\"unwind\"!=r)throw r}}else\"cancel\"===t?hn()&&On(-1):\"setimmediate\"!==e.target&&(\"checkMailbox\"===t?M&&Re():t&&(E(`worker: received unknown command ${t}`),E(e)))}catch(r){throw An(),r}}E=function(...r){r=r.join(\" \"),console.error(r)},self.alert=function(...r){postMessage({Ib:\"alert\",text:r.join(\" \"),jc:hn()})},d.instantiateWasm=(r,e)=>new Promise((r=>{x=t=>{t=new WebAssembly.Instance(t,or()),e(t),r()}})),self.onunhandledrejection=r=>{throw r.reason||r},self.onmessage=Dn}var k,N,H,R,P,D,F,B,I,U,j,$,G,z=!1;function Y(){var r=k.buffer;d.HEAP8=R=new Int8Array(r),d.HEAP16=D=new Int16Array(r),d.HEAPU8=P=new Uint8Array(r),d.HEAPU16=F=new Uint16Array(r),d.HEAP32=B=new Int32Array(r),d.HEAPU32=I=new Uint32Array(r),d.HEAPF32=U=new Float32Array(r),d.HEAPF64=G=new Float64Array(r),d.HEAP64=j=new BigInt64Array(r),d.HEAPU64=$=new BigUint64Array(r)}if(!p){if(d.wasmMemory)k=d.wasmMemory;else if(!((k=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0})).buffer instanceof h))throw E(\"requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag\"),Error(\"bad memory\");Y()}var L=[],V=[],q=[],J=0,X=null,Q=null;function Z(){if(0==--J&&(null!==X&&(clearInterval(X),X=null),Q)){var r=Q;Q=null,r()}}function K(r){throw E(r=\"Aborted(\"+r+\")\"),z=!0,H=1,r=new WebAssembly.RuntimeError(r+\". Build with -sASSERTIONS for more info.\"),c(r),r}var rr,er=r=>r.startsWith(\"data:application/octet-stream;base64,\"),tr=r=>r.startsWith(\"file://\");function nr(r){if(w)return w(r);throw\"both async and sync fetching of the wasm failed\"}function ar(r,e,t){return function(r){if(g||m){if(\"function\"==typeof fetch&&!tr(r))return fetch(r,{credentials:\"same-origin\"}).then((e=>{if(!e.ok)throw`failed to load wasm binary file at '${r}'`;return e.arrayBuffer()})).catch((()=>nr(r)));if(y)return new Promise(((e,t)=>{y(r,(r=>e(new Uint8Array(r))),t)}))}return Promise.resolve().then((()=>nr(r)))}(r).then((r=>WebAssembly.instantiate(r,e))).then(t,(r=>{E(`failed to asynchronously prepare wasm: ${r}`),K(r)}))}function or(){return{a:{wa:sr,b:Er,Y:Mr,y:Rr,ma:Pr,U:Ir,W:Ur,na:jr,ka:$r,da:Gr,ja:zr,I:Yr,V:Lr,S:Vr,la:qr,T:Jr,sa:Zr,C:oe,M:se,L:me,B:he,s:ve,p:ye,D:we,x:Ee,N:xe,ra:Me,ga:ke,Q:Pe,Z:Fe,E:Be,fa:He,pa:Ie,u:$e,A:rt,o:tt,k:ot,c:le,n:st,j:ct,xa:dt,r:bt,d:gt,v:mt,m:pt,g:ht,l:vt,i:yt,h:wt,e:At,aa:_t,ba:St,ca:Wt,_:Et,$:xt,P:Mt,f:Ht,K:Rt,F:Pt,J:Dt,ta:Ft,oa:It,R:Ut,t:Bt,w:jt,O:$t,va:Lt,ua:Vt,ha:Qt,ia:Zt,X:mr,z:Kt,H:rn,ea:en,G:nn,a:k,qa:un,q:fn}}}var ir={1336340:(r,e,t,a)=>{if(void 0===d||!d.Cb)return 1;if((r=Hr(r>>>0)).startsWith(\"./\")&&(r=r.substring(2)),!(r=d.Cb.get(r)))return 2;if(a>>>=0,(e>>>=0)+(t>>>=0)>r.byteLength)return 3;try{return n().set(r.subarray(e,e+t),a>>>0),0}catch{return 4}},1336841:()=>{d.Rb()},1336872:()=>{d.Sb()},1336901:()=>{d.Wb()},1336926:r=>d.Qb(r),1336959:r=>d.Ub(r),1336991:(r,e,t)=>{d.Kb(r,e,t,!0)},1337030:(r,e,t)=>{d.Kb(r,e,t)},1337063:()=>\"undefined\"!=typeof wasmOffsetConverter,1337120:r=>{d.gb(\"Abs\",r,void 0)},1337171:r=>{d.gb(\"Neg\",r,void 0)},1337222:r=>{d.gb(\"Floor\",r,void 0)},1337275:r=>{d.gb(\"Ceil\",r,void 0)},1337327:r=>{d.gb(\"Reciprocal\",r,void 0)},1337385:r=>{d.gb(\"Sqrt\",r,void 0)},1337437:r=>{d.gb(\"Exp\",r,void 0)},1337488:r=>{d.gb(\"Erf\",r,void 0)},1337539:r=>{d.gb(\"Sigmoid\",r,void 0)},1337594:(r,e,t)=>{d.gb(\"HardSigmoid\",r,{alpha:e,beta:t})},1337673:r=>{d.gb(\"Log\",r,void 0)},1337724:r=>{d.gb(\"Sin\",r,void 0)},1337775:r=>{d.gb(\"Cos\",r,void 0)},1337826:r=>{d.gb(\"Tan\",r,void 0)},1337877:r=>{d.gb(\"Asin\",r,void 0)},1337929:r=>{d.gb(\"Acos\",r,void 0)},1337981:r=>{d.gb(\"Atan\",r,void 0)},1338033:r=>{d.gb(\"Sinh\",r,void 0)},1338085:r=>{d.gb(\"Cosh\",r,void 0)},1338137:r=>{d.gb(\"Asinh\",r,void 0)},1338190:r=>{d.gb(\"Acosh\",r,void 0)},1338243:r=>{d.gb(\"Atanh\",r,void 0)},1338296:r=>{d.gb(\"Tanh\",r,void 0)},1338348:r=>{d.gb(\"Not\",r,void 0)},1338399:(r,e,t)=>{d.gb(\"Clip\",r,{min:e,max:t})},1338468:r=>{d.gb(\"Clip\",r,void 0)},1338520:(r,e)=>{d.gb(\"Elu\",r,{alpha:e})},1338578:r=>{d.gb(\"Relu\",r,void 0)},1338630:(r,e)=>{d.gb(\"LeakyRelu\",r,{alpha:e})},1338694:(r,e)=>{d.gb(\"ThresholdedRelu\",r,{alpha:e})},1338764:(r,e)=>{d.gb(\"Cast\",r,{to:e})},1338822:r=>{d.gb(\"Add\",r,void 0)},1338873:r=>{d.gb(\"Sub\",r,void 0)},1338924:r=>{d.gb(\"Mul\",r,void 0)},1338975:r=>{d.gb(\"Div\",r,void 0)},1339026:r=>{d.gb(\"Pow\",r,void 0)},1339077:r=>{d.gb(\"Equal\",r,void 0)},1339130:r=>{d.gb(\"Greater\",r,void 0)},1339185:r=>{d.gb(\"GreaterOrEqual\",r,void 0)},1339247:r=>{d.gb(\"Less\",r,void 0)},1339299:r=>{d.gb(\"LessOrEqual\",r,void 0)},1339358:(r,e,t,n,a)=>{d.gb(\"ReduceMean\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1339517:(r,e,t,n,a)=>{d.gb(\"ReduceMax\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1339675:(r,e,t,n,a)=>{d.gb(\"ReduceMin\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1339833:(r,e,t,n,a)=>{d.gb(\"ReduceProd\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1339992:(r,e,t,n,a)=>{d.gb(\"ReduceSum\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1340150:(r,e,t,n,a)=>{d.gb(\"ReduceL1\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1340307:(r,e,t,n,a)=>{d.gb(\"ReduceL2\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1340464:(r,e,t,n,a)=>{d.gb(\"ReduceLogSum\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1340625:(r,e,t,n,a)=>{d.gb(\"ReduceSumSquare\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1340789:(r,e,t,n,a)=>{d.gb(\"ReduceLogSumExp\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1340953:r=>{d.gb(\"Where\",r,void 0)},1341006:(r,e,t)=>{d.gb(\"Transpose\",r,{perm:e?Array.from(i().subarray(e>>>0,t>>>0)):[]})},1341114:(r,e,t,n)=>{d.gb(\"DepthToSpace\",r,{blocksize:e,mode:Hr(t),format:n?\"NHWC\":\"NCHW\"})},1341247:(r,e,t,n)=>{d.gb(\"DepthToSpace\",r,{blocksize:e,mode:Hr(t),format:n?\"NHWC\":\"NCHW\"})},1341380:(r,e,n,a,o,s,u,f,l,c,b,g,m,p,h)=>{d.gb(\"ConvTranspose\",r,{format:l?\"NHWC\":\"NCHW\",autoPad:e,dilations:[n],group:a,kernelShape:[o],pads:[s,u],strides:[f],wIsConst:()=>!!t()[c>>>0],outputPadding:b?Array.from(i().subarray(b>>>0,g>>>0)):[],outputShape:m?Array.from(i().subarray(m>>>0,p>>>0)):[],activation:Hr(h)})},1341781:(r,e,n,a,o,s,u,f,l,c,b,g,m,p)=>{d.gb(\"ConvTranspose\",r,{format:f?\"NHWC\":\"NCHW\",autoPad:e,dilations:Array.from(i().subarray(n>>>0,2+(n>>>0)>>>0)),group:a,kernelShape:Array.from(i().subarray(o>>>0,2+(o>>>0)>>>0)),pads:Array.from(i().subarray(s>>>0,4+(s>>>0)>>>0)),strides:Array.from(i().subarray(u>>>0,2+(u>>>0)>>>0)),wIsConst:()=>!!t()[l>>>0],outputPadding:c?Array.from(i().subarray(c>>>0,b>>>0)):[],outputShape:g?Array.from(i().subarray(g>>>0,m>>>0)):[],activation:Hr(p)})},1342346:(r,e,n,a,o,s,u,f,l,c,b,g,m,p,h)=>{d.gb(\"ConvTranspose\",r,{format:l?\"NHWC\":\"NCHW\",autoPad:e,dilations:[n],group:a,kernelShape:[o],pads:[s,u],strides:[f],wIsConst:()=>!!t()[c>>>0],outputPadding:b?Array.from(i().subarray(b>>>0,g>>>0)):[],outputShape:m?Array.from(i().subarray(m>>>0,p>>>0)):[],activation:Hr(h)})},1342747:(r,e,n,a,o,s,u,f,l,c,b,g,m,p)=>{d.gb(\"ConvTranspose\",r,{format:f?\"NHWC\":\"NCHW\",autoPad:e,dilations:Array.from(i().subarray(n>>>0,2+(n>>>0)>>>0)),group:a,kernelShape:Array.from(i().subarray(o>>>0,2+(o>>>0)>>>0)),pads:Array.from(i().subarray(s>>>0,4+(s>>>0)>>>0)),strides:Array.from(i().subarray(u>>>0,2+(u>>>0)>>>0)),wIsConst:()=>!!t()[l>>>0],outputPadding:c?Array.from(i().subarray(c>>>0,b>>>0)):[],outputShape:g?Array.from(i().subarray(g>>>0,m>>>0)):[],activation:Hr(p)})},1343312:(r,e)=>{d.gb(\"GlobalAveragePool\",r,{format:e?\"NHWC\":\"NCHW\"})},1343403:(r,e,t,n,a,o,i,s,u,f,l,c,b,g,m,p)=>{d.gb(\"AveragePool\",r,{format:p?\"NHWC\":\"NCHW\",auto_pad:e,ceil_mode:t,count_include_pad:n,storage_order:a,dilations:[o,i],kernel_shape:[s,u],pads:[f,l,c,b],strides:[g,m]})},1343687:(r,e)=>{d.gb(\"GlobalAveragePool\",r,{format:e?\"NHWC\":\"NCHW\"})},1343778:(r,e,t,n,a,o,i,s,u,f,l,c,b,g,m,p)=>{d.gb(\"AveragePool\",r,{format:p?\"NHWC\":\"NCHW\",auto_pad:e,ceil_mode:t,count_include_pad:n,storage_order:a,dilations:[o,i],kernel_shape:[s,u],pads:[f,l,c,b],strides:[g,m]})},1344062:(r,e)=>{d.gb(\"GlobalMaxPool\",r,{format:e?\"NHWC\":\"NCHW\"})},1344149:(r,e,t,n,a,o,i,s,u,f,l,c,b,g,m,p)=>{d.gb(\"MaxPool\",r,{format:p?\"NHWC\":\"NCHW\",auto_pad:e,ceil_mode:t,count_include_pad:n,storage_order:a,dilations:[o,i],kernel_shape:[s,u],pads:[f,l,c,b],strides:[g,m]})},1344429:(r,e)=>{d.gb(\"GlobalMaxPool\",r,{format:e?\"NHWC\":\"NCHW\"})},1344516:(r,e,t,n,a,o,i,s,u,f,l,c,b,g,m,p)=>{d.gb(\"MaxPool\",r,{format:p?\"NHWC\":\"NCHW\",auto_pad:e,ceil_mode:t,count_include_pad:n,storage_order:a,dilations:[o,i],kernel_shape:[s,u],pads:[f,l,c,b],strides:[g,m]})},1344796:(r,e,t,n,a)=>{d.gb(\"Gemm\",r,{alpha:e,beta:t,transA:n,transB:a})},1344900:r=>{d.gb(\"MatMul\",r,void 0)},1344954:(r,e,t,n)=>{d.gb(\"ArgMax\",r,{keepDims:!!e,selectLastIndex:!!t,axis:n})},1345062:(r,e,t,n)=>{d.gb(\"ArgMin\",r,{keepDims:!!e,selectLastIndex:!!t,axis:n})},1345170:(r,e)=>{d.gb(\"Softmax\",r,{axis:e})},1345233:(r,e)=>{d.gb(\"Concat\",r,{axis:e})},1345293:(r,e,t,n,a)=>{d.gb(\"Split\",r,{axis:e,numOutputs:t,splitSizes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1345433:r=>{d.gb(\"Expand\",r,void 0)},1345487:(r,e)=>{d.gb(\"Gather\",r,{axis:Number(e)})},1345558:(r,e)=>{d.gb(\"GatherElements\",r,{axis:Number(e)})},1345637:(r,e,t,n,a,o,s,u,f,l,c)=>{d.gb(\"Resize\",r,{antialias:e,axes:t?Array.from(i().subarray(t>>>0,n>>>0)):[],coordinateTransformMode:Hr(a),cubicCoeffA:o,excludeOutside:s,extrapolationValue:u,keepAspectRatioPolicy:Hr(f),mode:Hr(l),nearestMode:Hr(c)})},1345983:(r,e,t,n,a,o,s)=>{d.gb(\"Slice\",r,{starts:e?Array.from(i().subarray(e>>>0,t>>>0)):[],ends:n?Array.from(i().subarray(n>>>0,a>>>0)):[],axes:o?Array.from(i().subarray(o>>>0,s>>>0)):[]})},1346199:r=>{d.gb(\"Tile\",r,void 0)},1346251:(r,e,t)=>{d.gb(\"InstanceNormalization\",r,{epsilon:e,format:t?\"NHWC\":\"NCHW\"})},1346365:(r,e,t)=>{d.gb(\"InstanceNormalization\",r,{epsilon:e,format:t?\"NHWC\":\"NCHW\"})},1346479:r=>{d.gb(\"Range\",r,void 0)},1346532:(r,e)=>{d.gb(\"Einsum\",r,{equation:Hr(e)})},1346613:(r,e,t,n,a)=>{d.gb(\"Pad\",r,{mode:e,value:t,pads:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1346740:(r,e,t,n,a,o)=>{d.gb(\"BatchNormalization\",r,{epsilon:e,momentum:t,spatial:!!a,trainingMode:!!n,format:o?\"NHWC\":\"NCHW\"})},1346909:(r,e,t,n,a,o)=>{d.gb(\"BatchNormalization\",r,{epsilon:e,momentum:t,spatial:!!a,trainingMode:!!n,format:o?\"NHWC\":\"NCHW\"})},1347078:(r,e,t)=>{d.gb(\"CumSum\",r,{exclusive:Number(e),reverse:Number(t)})},1347175:(r,e,t,n,a,o,s,u,f)=>{d.gb(\"Attention\",r,{numHeads:e,isUnidirectional:t,maskFilterValue:n,scale:a,doRotary:o,qkvHiddenSizes:s?Array.from(i().subarray(Number(u)>>>0,Number(u)+s>>>0)):[],pastPresentShareBuffer:!!f})},1347447:r=>{d.gb(\"BiasAdd\",r,void 0)},1347502:r=>{d.gb(\"BiasSplitGelu\",r,void 0)},1347563:r=>{d.gb(\"FastGelu\",r,void 0)},1347619:(r,e,n,a,o,s,f,l,c,b,g,m,p,h,v,y)=>{d.gb(\"Conv\",r,{format:m?\"NHWC\":\"NCHW\",auto_pad:e,dilations:n?Array.from(i().subarray(n>>>0,a>>>0)):[],group:o,kernel_shape:s?Array.from(i().subarray(s>>>0,f>>>0)):[],pads:l?Array.from(i().subarray(l>>>0,c>>>0)):[],strides:b?Array.from(i().subarray(b>>>0,g>>>0)):[],w_is_const:()=>!!t()[p>>>0],activation:Hr(h),activation_params:v?Array.from(u().subarray(v>>>0,y>>>0)):[]})},1348115:r=>{d.gb(\"Gelu\",r,void 0)},1348167:(r,e,t,n)=>{d.gb(\"GroupQueryAttention\",r,{numHeads:e,kvNumHeads:t,scale:n})},1348280:(r,e,t,n)=>{d.gb(\"LayerNormalization\",r,{axis:e,epsilon:t,simplified:!!n})},1348391:(r,e,t,n)=>{d.gb(\"LayerNormalization\",r,{axis:e,epsilon:t,simplified:!!n})},1348502:(r,e,t,n,a,o)=>{d.gb(\"MatMulNBits\",r,{k:e,n:t,accuracyLevel:n,bits:a,blockSize:o})},1348629:(r,e,t,n,a,o)=>{d.gb(\"MultiHeadAttention\",r,{numHeads:e,isUnidirectional:t,maskFilterValue:n,scale:a,doRotary:o})},1348788:(r,e)=>{d.gb(\"QuickGelu\",r,{alpha:e})},1348852:(r,e,t,n,a)=>{d.gb(\"RotaryEmbedding\",r,{interleaved:!!e,numHeads:t,rotaryEmbeddingDim:n,scale:a})},1348991:(r,e,t)=>{d.gb(\"SkipLayerNormalization\",r,{epsilon:e,simplified:!!t})},1349093:r=>{d.Vb(r)},1349127:(r,e)=>d.Xb(r,e,d.Bb.Zb,d.Bb.errors),1349239:(r,e,t)=>{d.gb(\"SkipLayerNormalization\",r,{epsilon:e,simplified:!!t})}};function sr(r,e,t){return Ke((async()=>{await d.Tb(r,e,t)}))}function ur(r){this.name=\"ExitStatus\",this.message=`Program terminated with exit(${r})`,this.status=r}var fr=r=>{r.terminate(),r.onmessage=()=>{}},lr=r=>{0==pr.length&&(Cr(),_r(pr[0]));var e=pr.pop();if(!e)return 6;hr.push(e),yr[r.xb]=e,e.xb=r.xb;var t={cmd:\"run\",start_routine:r.$b,arg:r.Mb,pthread_ptr:r.xb};return e.postMessage(t,r.ec),0},cr=0,dr=(r,e,...t)=>{for(var n=2*t.length,a=xn(),o=En(8*n),i=o>>>3,s=0;s>>0]=u)}return r=_n(r,0,n,o,e),Wn(a),r};function br(r){if(p)return dr(0,1,r);if(H=r,!(0{if(H=r,p)throw gr(r),\"unwind\";br(r)},pr=[],hr=[],vr=[],yr={},wr=r=>{var e=r.xb;delete yr[e],pr.push(r),hr.splice(hr.indexOf(r),1),r.xb=0,Cn(e)};function Ar(){vr.forEach((r=>r()))}var _r=r=>new Promise((e=>{r.onmessage=t=>{var n=(t=t.data).cmd;if(t.targetThread&&t.targetThread!=hn()){var a=yr[t.targetThread];a?a.postMessage(t,t.transferList):E(`Internal error! Worker sent a message \"${n}\" to target pthread ${t.targetThread}, but that thread no longer exists!`)}else\"checkMailbox\"===n?Re():\"spawnThread\"===n?lr(t):\"cleanupThread\"===n?wr(yr[t.thread]):\"killThread\"===n?(t=t.thread,n=yr[t],delete yr[t],fr(n),Cn(t),hr.splice(hr.indexOf(n),1),n.xb=0):\"cancelThread\"===n?yr[t.thread].postMessage({cmd:\"cancel\"}):\"loaded\"===n?(r.loaded=!0,e(r)):\"alert\"===n?alert(`Thread ${t.threadId}: ${t.text}`):\"setimmediate\"===t.target?r.postMessage(t):\"callHandler\"===n?d[t.handler](...t.args):n&&E(`worker sent an unknown command ${n}`)},r.onerror=r=>{throw E(`worker sent an error! ${r.filename}:${r.lineno}: ${r.message}`),r};var t,n=[];for(t of[\"onExit\"])d.hasOwnProperty(t)&&n.push(t);r.postMessage({cmd:\"load\",handlers:n,wasmMemory:k,wasmModule:N})}));function Cr(){var r=new Worker(new URL(import.meta.url),{type:\"module\",workerData:\"em-pthread\",name:\"em-pthread\"});pr.push(r)}var Or=r=>{for(;0{var r=hn(),e=s()[r+52>>>2>>>0];r=s()[r+56>>>2>>>0],Sn(e,e-r),Wn(e)},Sr=(r,e)=>{cr=0,r=Mn(r,e),0>>=0);throw e>>>=0,t>>>=0,s()[n.Fb+16>>>2>>>0]=0,s()[n.Fb+4>>>2>>>0]=e,s()[n.Fb+8>>>2>>>0]=t,r}function xr(r,e,t,n){return p?dr(2,1,r,e,t,n):Mr(r,e,t,n)}function Mr(r,e,t,n){if(r>>>=0,e>>>=0,t>>>=0,n>>>=0,void 0===h)return E(\"Current environment does not support SharedArrayBuffer, pthreads are not available!\"),6;var a=[];return p&&0===a.length?xr(r,e,t,n):(r={$b:t,xb:r,Mb:n,ec:a},p?(r.Ib=\"spawnThread\",postMessage(r,a),0):lr(r))}var kr=\"undefined\"!=typeof TextDecoder?new TextDecoder(\"utf8\"):void 0,Nr=(r,e,t)=>{var n=(e>>>=0)+t;for(t=e;r[t]&&!(t>=n);)++t;if(16(a=224==(240&a)?(15&a)<<12|o<<6|i:(7&a)<<18|o<<12|i<<6|63&r[e++])?n+=String.fromCharCode(a):(a-=65536,n+=String.fromCharCode(55296|a>>10,56320|1023&a))}}else n+=String.fromCharCode(a)}return n},Hr=(r,e)=>(r>>>=0)?Nr(n(),r,e):\"\";function Rr(r,e,t){return p?dr(3,1,r,e,t):0}function Pr(r,e){if(p)return dr(4,1,r,e)}var Dr=r=>{for(var e=0,t=0;t=n?e++:2047>=n?e+=2:55296<=n&&57343>=n?(e+=4,++t):e+=3}return e},Fr=(r,e,t,n)=>{if(!(0>>=0;n=t+n-1;for(var o=0;o=i&&(i=65536+((1023&i)<<10)|1023&r.charCodeAt(++o)),127>=i){if(t>=n)break;e[t++>>>0]=i}else{if(2047>=i){if(t+1>=n)break;e[t++>>>0]=192|i>>6}else{if(65535>=i){if(t+2>=n)break;e[t++>>>0]=224|i>>12}else{if(t+3>=n)break;e[t++>>>0]=240|i>>18,e[t++>>>0]=128|i>>12&63}e[t++>>>0]=128|i>>6&63}e[t++>>>0]=128|63&i}}return e[t>>>0]=0,t-a},Br=(r,e,t)=>Fr(r,n(),e,t);function Ir(r,e){if(p)return dr(5,1,r,e)}function Ur(r,e,t){if(p)return dr(6,1,r,e,t)}function jr(r,e,t){return p?dr(7,1,r,e,t):0}function $r(r,e){if(p)return dr(8,1,r,e)}function Gr(r,e,t){if(p)return dr(9,1,r,e,t)}function zr(r,e,t,n){if(p)return dr(10,1,r,e,t,n)}function Yr(r,e,t,n){if(p)return dr(11,1,r,e,t,n)}function Lr(r,e,t,n){if(p)return dr(12,1,r,e,t,n)}function Vr(r){if(p)return dr(13,1,r)}function qr(r,e){if(p)return dr(14,1,r,e)}function Jr(r,e,t){if(p)return dr(15,1,r,e,t)}var Xr,Qr,Zr=()=>{K(\"\")},Kr=r=>{for(var e=\"\";n()[r>>>0];)e+=Xr[n()[r++>>>0]];return e},re={},ee={},te={};function ne(r,e,t={}){if(!(\"argPackAdvance\"in e))throw new TypeError(\"registerType registeredInstance requires argPackAdvance\");return function(r,e,t={}){var n=e.name;if(!r)throw new Qr(`type \"${n}\" must have a positive integer typeid pointer`);if(ee.hasOwnProperty(r)){if(t.Ob)return;throw new Qr(`Cannot register type '${n}' twice`)}ee[r]=e,delete te[r],re.hasOwnProperty(r)&&(e=re[r],delete re[r],e.forEach((r=>r())))}(r,e,t)}var ae=(r,e,u)=>{switch(e){case 1:return u?r=>t()[r>>>0]:r=>n()[r>>>0];case 2:return u?r=>a()[r>>>1>>>0]:r=>o()[r>>>1>>>0];case 4:return u?r=>i()[r>>>2>>>0]:r=>s()[r>>>2>>>0];case 8:return u?r=>j[r>>>3]:r=>$[r>>>3];default:throw new TypeError(`invalid integer width (${e}): ${r}`)}};function oe(r,e,t){t>>>=0,ne(r>>>=0,{name:e=Kr(e>>>0),fromWireType:r=>r,toWireType:function(r,e){if(\"bigint\"!=typeof e&&\"number\"!=typeof e)throw e=null===e?\"null\":\"object\"==(r=typeof e)||\"array\"===r||\"function\"===r?e.toString():\"\"+e,new TypeError(`Cannot convert \"${e}\" to ${this.name}`);return\"number\"==typeof e&&(e=BigInt(e)),e},argPackAdvance:ie,readValueFromPointer:ae(e,t,-1==e.indexOf(\"u\")),Ab:null})}var ie=8;function se(r,e,t,a){ne(r>>>=0,{name:e=Kr(e>>>0),fromWireType:function(r){return!!r},toWireType:function(r,e){return e?t:a},argPackAdvance:ie,readValueFromPointer:function(r){return this.fromWireType(n()[r>>>0])},Ab:null})}var ue=[],fe=[];function le(r){9<(r>>>=0)&&0==--fe[r+1]&&(fe[r]=void 0,ue.push(r))}var ce=r=>{if(!r)throw new Qr(\"Cannot use deleted val. handle = \"+r);return fe[r]},de=r=>{switch(r){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:const e=ue.pop()||fe.length;return fe[e]=r,fe[e+1]=1,e}};function be(r){return this.fromWireType(s()[r>>>2>>>0])}var ge={name:\"emscripten::val\",fromWireType:r=>{var e=ce(r);return le(r),e},toWireType:(r,e)=>de(e),argPackAdvance:ie,readValueFromPointer:be,Ab:null};function me(r){return ne(r>>>0,ge)}var pe=(r,e)=>{switch(e){case 4:return function(r){return this.fromWireType(u()[r>>>2>>>0])};case 8:return function(r){return this.fromWireType(f()[r>>>3>>>0])};default:throw new TypeError(`invalid float width (${e}): ${r}`)}};function he(r,e,t){t>>>=0,ne(r>>>=0,{name:e=Kr(e>>>0),fromWireType:r=>r,toWireType:(r,e)=>e,argPackAdvance:ie,readValueFromPointer:pe(e,t),Ab:null})}function ve(r,e,t,n,a){if(r>>>=0,t>>>=0,e=Kr(e>>>0),-1===a&&(a=4294967295),a=r=>r,0===n){var o=32-8*t;a=r=>r<>>o}var i=e.includes(\"unsigned\")?function(r,e){return e>>>0}:function(r,e){return e};ne(r,{name:e,fromWireType:a,toWireType:i,argPackAdvance:ie,readValueFromPointer:ae(e,t,0!==n),Ab:null})}function ye(r,e,n){function a(r){var e=s()[r>>>2>>>0];return r=s()[r+4>>>2>>>0],new o(t().buffer,r,e)}var o=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][e];ne(r>>>=0,{name:n=Kr(n>>>0),fromWireType:a,argPackAdvance:ie,readValueFromPointer:a},{Ob:!0})}function we(r,e){r>>>=0;var t=\"std::string\"===(e=Kr(e>>>0));ne(r,{name:e,fromWireType:function(r){var e=s()[r>>>2>>>0],a=r+4;if(t)for(var o=a,i=0;i<=e;++i){var u=a+i;if(i==e||0==n()[u>>>0]){if(o=Hr(o,u-o),void 0===f)var f=o;else f+=String.fromCharCode(0),f+=o;o=u+1}}else{for(f=Array(e),i=0;i>>0]);f=f.join(\"\")}return yn(r),f},toWireType:function(r,e){e instanceof ArrayBuffer&&(e=new Uint8Array(e));var a=\"string\"==typeof e;if(!(a||e instanceof Uint8Array||e instanceof Uint8ClampedArray||e instanceof Int8Array))throw new Qr(\"Cannot pass non-string to std::string\");var o=t&&a?Dr(e):e.length,i=vn(4+o+1),u=i+4;if(s()[i>>>2>>>0]=o,t&&a)Br(e,u,o+1);else if(a)for(a=0;a>>0]=f}else for(a=0;a>>0]=e[a];return null!==r&&r.push(yn,i),i},argPackAdvance:ie,readValueFromPointer:be,Ab(r){yn(r)}})}var Ae=\"undefined\"!=typeof TextDecoder?new TextDecoder(\"utf-16le\"):void 0,_e=(r,e)=>{for(var t=r>>1,i=t+e/2;!(t>=i)&&o()[t>>>0];)++t;if(32<(t<<=1)-r&&Ae)return Ae.decode(n().slice(r,t));for(t=\"\",i=0;!(i>=e/2);++i){var s=a()[r+2*i>>>1>>>0];if(0==s)break;t+=String.fromCharCode(s)}return t},Ce=(r,e,t)=>{if(t??=2147483647,2>t)return 0;var n=e;t=(t-=2)<2*r.length?t/2:r.length;for(var o=0;o>>1>>>0]=i,e+=2}return a()[e>>>1>>>0]=0,e-n},Oe=r=>2*r.length,Te=(r,e)=>{for(var t=0,n=\"\";!(t>=e/4);){var a=i()[r+4*t>>>2>>>0];if(0==a)break;++t,65536<=a?(a-=65536,n+=String.fromCharCode(55296|a>>10,56320|1023&a)):n+=String.fromCharCode(a)}return n},Se=(r,e,t)=>{if(e>>>=0,t??=2147483647,4>t)return 0;var n=e;t=n+t-4;for(var a=0;a=o&&(o=65536+((1023&o)<<10)|1023&r.charCodeAt(++a)),i()[e>>>2>>>0]=o,(e+=4)+4>t)break}return i()[e>>>2>>>0]=0,e-n},We=r=>{for(var e=0,t=0;t=n&&++t,e+=4}return e};function Ee(r,e,t){if(r>>>=0,e>>>=0,t=Kr(t>>>=0),2===e)var n=_e,a=Ce,i=Oe,u=r=>o()[r>>>1>>>0];else 4===e&&(n=Te,a=Se,i=We,u=r=>s()[r>>>2>>>0]);ne(r,{name:t,fromWireType:r=>{for(var t,a=s()[r>>>2>>>0],o=r+4,i=0;i<=a;++i){var f=r+4+i*e;i!=a&&0!=u(f)||(o=n(o,f-o),void 0===t?t=o:(t+=String.fromCharCode(0),t+=o),o=f+e)}return yn(r),t},toWireType:(r,n)=>{if(\"string\"!=typeof n)throw new Qr(`Cannot pass non-string to C++ string type ${t}`);var o=i(n),u=vn(4+o+e);return s()[u>>>2>>>0]=o/e,a(n,u+4,o+e),null!==r&&r.push(yn,u),u},argPackAdvance:ie,readValueFromPointer:be,Ab(r){yn(r)}})}function xe(r,e){ne(r>>>=0,{Pb:!0,name:e=Kr(e>>>0),argPackAdvance:0,fromWireType:()=>{},toWireType:()=>{}})}var Me=()=>1;function ke(r){wn(r>>>0,!m,1,!g,131072,!1),Ar()}var Ne=r=>{if(!z)try{if(r(),!(0>>=0,\"function\"==typeof Atomics.fc&&(Atomics.fc(i(),r>>>2,r).value.then(Re),r+=128,Atomics.store(i(),r>>>2,1))}var Re=()=>{var r=hn();r&&(He(r),Ne(Tn))};function Pe(r,e){(r>>>=0)==e>>>0?setTimeout(Re):p?postMessage({targetThread:r,cmd:\"checkMailbox\"}):(r=yr[r])&&r.postMessage({cmd:\"checkMailbox\"})}var De=[];function Fe(r,e,t,n,a){for(e>>>=0,n/=2,De.length=n,t=a>>>0>>>3,a=0;a>>0];return(e?ir[e]:dn[r])(...De)}function Be(r){r>>>=0,p?postMessage({cmd:\"cleanupThread\",thread:r}):wr(yr[r])}function Ie(r){}var Ue=(r,e)=>{var t=ee[r];if(void 0===t)throw r=gn(r),t=Kr(r),yn(r),new Qr(`${e} has unknown type ${t}`);return t},je=(r,e,t)=>{var n=[];return r=r.toWireType(n,t),n.length&&(s()[e>>>2>>>0]=de(n)),r};function $e(r,e,t){return e>>>=0,t>>>=0,r=ce(r>>>0),e=Ue(e,\"emval::as\"),je(e,t,r)}var Ge=r=>{try{r()}catch(r){K(r)}},ze=0,Ye=null,Le=0,Ve=[],qe={},Je={},Xe=0,Qe=null,Ze=[];function Ke(r){return function(r){if(!z){if(0===ze){var e=!1,t=!1;r(((r=0)=>{if(!z&&(Le=r,e=!0,t)){ze=2,Ge((()=>Hn(Ye))),\"undefined\"!=typeof Browser&&Browser.Gb.Nb&&Browser.Gb.resume(),r=!1;try{var n=function(){var r=i()[Ye+8>>>2>>>0];return r=bn[Je[r]],--cr,r()}()}catch(e){n=e,r=!0}var a=!1;if(!Ye){var o=Qe;o&&(Qe=null,(r?o.reject:o.resolve)(n),a=!0)}if(r&&!a)throw n}})),t=!0,e||(ze=1,Ye=function(){var r=vn(65548),e=r+12;s()[r>>>2>>>0]=e,s()[r+4>>>2>>>0]=e+65536,e=Ve[0];var t=qe[e];return void 0===t&&(t=Xe++,qe[e]=t,Je[t]=e),e=t,i()[r+8>>>2>>>0]=e,r}(),\"undefined\"!=typeof Browser&&Browser.Gb.Nb&&Browser.Gb.pause(),Ge((()=>kn(Ye))))}else 2===ze?(ze=0,Ge(Rn),yn(Ye),Ye=null,Ze.forEach(Ne)):K(`invalid state: ${ze}`);return Le}}((e=>{r().then(e)}))}function rt(r){return r>>>=0,Ke((()=>(r=ce(r)).then(de)))}var et=[];function tt(r,e,t,n){return t>>>=0,n>>>=0,(r=et[r>>>0])(null,e=ce(e>>>0),t,n)}var nt={},at=r=>{var e=nt[r];return void 0===e?Kr(r):e};function ot(r,e,t,n,a){return t>>>=0,n>>>=0,a>>>=0,(r=et[r>>>0])(e=ce(e>>>0),e[t=at(t)],n,a)}var it=()=>\"object\"==typeof globalThis?globalThis:Function(\"return this\")();function st(r){return 0==(r>>>=0)?de(it()):(r=at(r),de(it()[r]))}var ut=r=>{var e=et.length;return et.push(r),e},ft=(r,e)=>{for(var t=Array(r),n=0;n>>2>>>0],\"parameter \"+n);return t},lt=(r,e)=>Object.defineProperty(e,\"name\",{value:r});function ct(r,e,t){var n=(e=ft(r,e>>>0)).shift();r--;var a=\"return function (obj, func, destructorsRef, args) {\\n\",o=0,i=[];0===t&&i.push(\"obj\");for(var s=[\"retType\"],u=[n],f=0;fr.name)).join(\", \")}) => ${n.name}>`,ut(lt(t,r))}function dt(r){return r=at(r>>>0),de(d[r])}function bt(r,e){return e>>>=0,r=ce(r>>>0),e=ce(e),de(r[e])}function gt(r){9<(r>>>=0)&&(fe[r+1]+=1)}function mt(){return de([])}function pt(r){r=ce(r>>>0);for(var e=Array(r.length),t=0;t>>0))}function vt(){return de({})}function yt(r){for(var e=ce(r>>>=0);e.length;){var t=e.pop();e.pop()(t)}le(r)}function wt(r,e,t){e>>>=0,t>>>=0,r=ce(r>>>0),e=ce(e),t=ce(t),r[e]=t}function At(r,e){return e>>>=0,r=(r=Ue(r>>>0,\"_emval_take_value\")).readValueFromPointer(e),de(r)}function _t(r,e){r=-9007199254740992>r||9007199254740992>>=0,r=new Date(1e3*r),i()[e>>>2>>>0]=r.getUTCSeconds(),i()[e+4>>>2>>>0]=r.getUTCMinutes(),i()[e+8>>>2>>>0]=r.getUTCHours(),i()[e+12>>>2>>>0]=r.getUTCDate(),i()[e+16>>>2>>>0]=r.getUTCMonth(),i()[e+20>>>2>>>0]=r.getUTCFullYear()-1900,i()[e+24>>>2>>>0]=r.getUTCDay(),r=(r.getTime()-Date.UTC(r.getUTCFullYear(),0,1,0,0,0,0))/864e5|0,i()[e+28>>>2>>>0]=r}var Ct=r=>0==r%4&&(0!=r%100||0==r%400),Ot=[0,31,60,91,121,152,182,213,244,274,305,335],Tt=[0,31,59,90,120,151,181,212,243,273,304,334];function St(r,e){r=-9007199254740992>r||9007199254740992>>=0,r=new Date(1e3*r),i()[e>>>2>>>0]=r.getSeconds(),i()[e+4>>>2>>>0]=r.getMinutes(),i()[e+8>>>2>>>0]=r.getHours(),i()[e+12>>>2>>>0]=r.getDate(),i()[e+16>>>2>>>0]=r.getMonth(),i()[e+20>>>2>>>0]=r.getFullYear()-1900,i()[e+24>>>2>>>0]=r.getDay();var t=(Ct(r.getFullYear())?Ot:Tt)[r.getMonth()]+r.getDate()-1|0;i()[e+28>>>2>>>0]=t,i()[e+36>>>2>>>0]=-60*r.getTimezoneOffset(),t=new Date(r.getFullYear(),6,1).getTimezoneOffset();var n=new Date(r.getFullYear(),0,1).getTimezoneOffset();r=0|(t!=n&&r.getTimezoneOffset()==Math.min(n,t)),i()[e+32>>>2>>>0]=r}function Wt(r){r>>>=0;var e=new Date(i()[r+20>>>2>>>0]+1900,i()[r+16>>>2>>>0],i()[r+12>>>2>>>0],i()[r+8>>>2>>>0],i()[r+4>>>2>>>0],i()[r>>>2>>>0],0),t=i()[r+32>>>2>>>0],n=e.getTimezoneOffset(),a=new Date(e.getFullYear(),6,1).getTimezoneOffset(),o=new Date(e.getFullYear(),0,1).getTimezoneOffset(),s=Math.min(o,a);return 0>t?i()[r+32>>>2>>>0]=Number(a!=o&&s==n):0>>2>>>0]=e.getDay(),t=(Ct(e.getFullYear())?Ot:Tt)[e.getMonth()]+e.getDate()-1|0,i()[r+28>>>2>>>0]=t,i()[r>>>2>>>0]=e.getSeconds(),i()[r+4>>>2>>>0]=e.getMinutes(),i()[r+8>>>2>>>0]=e.getHours(),i()[r+12>>>2>>>0]=e.getDate(),i()[r+16>>>2>>>0]=e.getMonth(),i()[r+20>>>2>>>0]=e.getYear(),r=e.getTime(),BigInt(isNaN(r)?-1:r/1e3)}function Et(r,e,t,n,a,o,i){return p?dr(16,1,r,e,t,n,a,o,i):-52}function xt(r,e,t,n,a,o){if(p)return dr(17,1,r,e,t,n,a,o)}function Mt(r,e,t,n){r>>>=0,e>>>=0,t>>>=0,n>>>=0;var a=(new Date).getFullYear(),o=new Date(a,0,1),u=new Date(a,6,1);a=o.getTimezoneOffset();var f=u.getTimezoneOffset(),l=Math.max(a,f);s()[r>>>2>>>0]=60*l,i()[e>>>2>>>0]=Number(a!=f),o=(r=r=>r.toLocaleTimeString(void 0,{hour12:!1,timeZoneName:\"short\"}).split(\" \")[1])(o),u=r(u),f{kt.length=0;for(var t;t=n()[r++>>>0];){var a=105!=t;e+=(a&=112!=t)&&e%8?4:0,kt.push(112==t?s()[e>>>2>>>0]:106==t?j[e>>>3]:105==t?i()[e>>>2>>>0]:f()[e>>>3>>>0]),e+=a?8:4}return kt};function Ht(r,e,t){return r>>>=0,e=Nt(e>>>0,t>>>0),ir[r](...e)}function Rt(r,e,t){return r>>>=0,e=Nt(e>>>0,t>>>0),ir[r](...e)}var Pt=()=>{},Dt=()=>Date.now();function Ft(r,e){return E(Hr(r>>>0,e>>>0))}var Bt,It=()=>{throw cr+=1,\"unwind\"};function Ut(){return 4294901760}Bt=()=>performance.timeOrigin+performance.now();var jt=()=>navigator.hardwareConcurrency;function $t(r){r>>>=0;var e=n().length;if(r<=e||4294901760=t;t*=2){var a=e*(1+.2/t);a=Math.min(a,r+100663296);var o=Math;a=Math.max(r,a);r:{o=(o.min.call(o,4294901760,a+(65536-a%65536)%65536)-k.buffer.byteLength+65535)/65536;try{k.grow(o),Y();var i=1;break r}catch(r){}i=void 0}if(i)return!0}return!1}var Gt=()=>(K(\"Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER\"),0),zt={},Yt=r=>{r.forEach((r=>{var e=Gt();e&&(zt[e]=r)}))};function Lt(){var r=Error().stack.toString().split(\"\\n\");return\"Error\"==r[0]&&r.shift(),Yt(r),zt.Lb=Gt(),zt.Yb=r,zt.Lb}function Vt(r,e,t){if(r>>>=0,e>>>=0,zt.Lb==r)var n=zt.Yb;else\"Error\"==(n=Error().stack.toString().split(\"\\n\"))[0]&&n.shift(),Yt(n);for(var a=3;n[a]&&Gt()!=r;)++a;for(r=0;r>>2>>>0]=Gt();return r}var qt,Jt={},Xt=()=>{if(!qt){var r,e={USER:\"web_user\",LOGNAME:\"web_user\",PATH:\"/\",PWD:\"/\",HOME:\"/home/web_user\",LANG:(\"object\"==typeof navigator&&navigator.languages&&navigator.languages[0]||\"C\").replace(\"-\",\"_\")+\".UTF-8\",_:_||\"./this.program\"};for(r in Jt)void 0===Jt[r]?delete e[r]:e[r]=Jt[r];var t=[];for(r in e)t.push(`${r}=${e[r]}`);qt=t}return qt};function Qt(r,e){if(p)return dr(18,1,r,e);r>>>=0,e>>>=0;var n=0;return Xt().forEach(((a,o)=>{var i=e+n;for(o=s()[r+4*o>>>2>>>0]=i,i=0;i>>0]=a.charCodeAt(i);t()[o>>>0]=0,n+=a.length+1})),0}function Zt(r,e){if(p)return dr(19,1,r,e);r>>>=0,e>>>=0;var t=Xt();s()[r>>>2>>>0]=t.length;var n=0;return t.forEach((r=>n+=r.length+1)),s()[e>>>2>>>0]=n,0}function Kt(r){return p?dr(20,1,r):52}function rn(r,e,t,n){return p?dr(21,1,r,e,t,n):52}function en(r,e,t,n){return p?dr(22,1,r,e,t,n):70}var tn=[null,[],[]];function nn(r,e,t,a){if(p)return dr(23,1,r,e,t,a);e>>>=0,t>>>=0,a>>>=0;for(var o=0,i=0;i>>2>>>0],f=s()[e+4>>>2>>>0];e+=8;for(var l=0;l>>0],d=tn[r];0===c||10===c?((1===r?W:E)(Nr(d,0)),d.length=0):d.push(c)}o+=f}return s()[a>>>2>>>0]=o,0}var an=[31,29,31,30,31,30,31,31,30,31,30,31],on=[31,28,31,30,31,30,31,31,30,31,30,31],sn=(r,e)=>{t().set(r,e>>>0)};function un(r,e,t,n){function a(r,e,t){for(r=\"number\"==typeof r?r.toString():r||\"\";r.lengthr?-1:0n-r.getDate())){r.setDate(r.getDate()+e);break}e-=n-r.getDate()+1,r.setDate(1),11>t?r.setMonth(t+1):(r.setMonth(0),r.setFullYear(r.getFullYear()+1))}return t=new Date(r.getFullYear()+1,0,4),e=f(new Date(r.getFullYear(),0,4)),t=f(t),0>=u(e,r)?0>=u(t,r)?r.getFullYear()+1:r.getFullYear():r.getFullYear()-1}r>>>=0,e>>>=0,t>>>=0,n>>>=0;var c=s()[n+40>>>2>>>0];for(var d in n={cc:i()[n>>>2>>>0],bc:i()[n+4>>>2>>>0],Db:i()[n+8>>>2>>>0],Hb:i()[n+12>>>2>>>0],Eb:i()[n+16>>>2>>>0],zb:i()[n+20>>>2>>>0],rb:i()[n+24>>>2>>>0],yb:i()[n+28>>>2>>>0],kc:i()[n+32>>>2>>>0],ac:i()[n+36>>>2>>>0],dc:c?Hr(c):\"\"},t=Hr(t),c={\"%c\":\"%a %b %d %H:%M:%S %Y\",\"%D\":\"%m/%d/%y\",\"%F\":\"%Y-%m-%d\",\"%h\":\"%b\",\"%r\":\"%I:%M:%S %p\",\"%R\":\"%H:%M\",\"%T\":\"%H:%M:%S\",\"%x\":\"%m/%d/%y\",\"%X\":\"%H:%M:%S\",\"%Ec\":\"%c\",\"%EC\":\"%C\",\"%Ex\":\"%m/%d/%y\",\"%EX\":\"%H:%M:%S\",\"%Ey\":\"%y\",\"%EY\":\"%Y\",\"%Od\":\"%d\",\"%Oe\":\"%e\",\"%OH\":\"%H\",\"%OI\":\"%I\",\"%Om\":\"%m\",\"%OM\":\"%M\",\"%OS\":\"%S\",\"%Ou\":\"%u\",\"%OU\":\"%U\",\"%OV\":\"%V\",\"%Ow\":\"%w\",\"%OW\":\"%W\",\"%Oy\":\"%y\"})t=t.replace(new RegExp(d,\"g\"),c[d]);var b=\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),g=\"January February March April May June July August September October November December\".split(\" \");for(d in c={\"%a\":r=>b[r.rb].substring(0,3),\"%A\":r=>b[r.rb],\"%b\":r=>g[r.Eb].substring(0,3),\"%B\":r=>g[r.Eb],\"%C\":r=>o((r.zb+1900)/100|0,2),\"%d\":r=>o(r.Hb,2),\"%e\":r=>a(r.Hb,2,\" \"),\"%g\":r=>l(r).toString().substring(2),\"%G\":l,\"%H\":r=>o(r.Db,2),\"%I\":r=>(0==(r=r.Db)?r=12:12{for(var e=0,t=0;t<=r.Eb-1;e+=(Ct(r.zb+1900)?an:on)[t++]);return o(r.Hb+e,3)},\"%m\":r=>o(r.Eb+1,2),\"%M\":r=>o(r.bc,2),\"%n\":()=>\"\\n\",\"%p\":r=>0<=r.Db&&12>r.Db?\"AM\":\"PM\",\"%S\":r=>o(r.cc,2),\"%t\":()=>\"\\t\",\"%u\":r=>r.rb||7,\"%U\":r=>o(Math.floor((r.yb+7-r.rb)/7),2),\"%V\":r=>{var e=Math.floor((r.yb+7-(r.rb+6)%7)/7);if(2>=(r.rb+371-r.yb-2)%7&&e++,e)53==e&&(4==(t=(r.rb+371-r.yb)%7)||3==t&&Ct(r.zb)||(e=1));else{e=52;var t=(r.rb+7-r.yb-1)%7;(4==t||5==t&&Ct(r.zb%400-1))&&e++}return o(e,2)},\"%w\":r=>r.rb,\"%W\":r=>o(Math.floor((r.yb+7-(r.rb+6)%7)/7),2),\"%y\":r=>(r.zb+1900).toString().substring(2),\"%Y\":r=>r.zb+1900,\"%z\":r=>{var e=0<=(r=r.ac);return r=Math.abs(r)/60,(e?\"+\":\"-\")+String(\"0000\"+(r/60*100+r%60)).slice(-4)},\"%Z\":r=>r.dc,\"%%\":()=>\"%\"},t=t.replace(/%%/g,\"\\0\\0\"),c)t.includes(d)&&(t=t.replace(new RegExp(d,\"g\"),c[d](n)));return d=function(r){var e=Array(Dr(r)+1);return Fr(r,e,0,e.length),e}(t=t.replace(/\\0\\0/g,\"%\")),d.length>e?0:(sn(d,r),d.length-1)}function fn(r,e,t,n){return un(r>>>0,e>>>0,t>>>0,n>>>0)}p||function(){for(var r=d.numThreads-1;r--;)Cr();L.unshift((()=>{J++,function(r){p?r():Promise.all(pr.map(_r)).then(r)}((()=>Z()))}))}();for(var ln=Array(256),cn=0;256>cn;++cn)ln[cn]=String.fromCharCode(cn);Xr=ln,Qr=d.BindingError=class extends Error{constructor(r){super(r),this.name=\"BindingError\"}},d.InternalError=class extends Error{constructor(r){super(r),this.name=\"InternalError\"}},fe.push(0,1,void 0,1,null,1,!0,1,!1,1),d.count_emval_handles=()=>fe.length/2-5-ue.length;var dn=[br,gr,xr,Rr,Pr,Ir,Ur,jr,$r,Gr,zr,Yr,Lr,Vr,qr,Jr,Et,xt,Qt,Zt,Kt,rn,en,nn],bn=function(){function r(r,e){return bn=r.exports,bn=function(){var r=bn,e={};for(let[t,n]of Object.entries(r))e[t]=\"function\"==typeof n?(...r)=>{Ve.push(t);try{return n(...r)}finally{z||(Ve.pop(),Ye&&1===ze&&0===Ve.length&&(ze=0,cr+=1,Ge(Nn),\"undefined\"!=typeof Fibers&&Fibers.lc()))}}:n;return e}(),bn=function(){var r=bn,e=r=>e=>r(e)>>>0,t=r=>()=>r()>>>0;return(r=Object.assign({},r)).za=e(r.za),r.cb=t(r.cb),r.db=e(r.db),r.emscripten_main_runtime_thread_id=t(r.emscripten_main_runtime_thread_id),r.pb=e(r.pb),r.qb=t(r.qb),r}(),vr.push(bn.fb),V.unshift(bn.ya),N=e,Z(),bn}var e=or();if(J++,d.instantiateWasm)try{return d.instantiateWasm(e,r)}catch(r){E(`Module.instantiateWasm callback failed with error: ${r}`),c(r)}return rr||=d.locateFile?er(\"ort-wasm-simd-threaded.jsep.wasm\")?\"ort-wasm-simd-threaded.jsep.wasm\":d.locateFile?d.locateFile(\"ort-wasm-simd-threaded.jsep.wasm\",O):O+\"ort-wasm-simd-threaded.jsep.wasm\":new URL(\"ort-wasm-simd-threaded.jsep.wasm\",import.meta.url).href,function(r,e){var t=rr;return\"function\"!=typeof WebAssembly.instantiateStreaming||er(t)||tr(t)||\"function\"!=typeof fetch?ar(t,r,e):fetch(t,{credentials:\"same-origin\"}).then((n=>WebAssembly.instantiateStreaming(n,r).then(e,(function(n){return E(`wasm streaming compile failed: ${n}`),E(\"falling back to ArrayBuffer instantiation\"),ar(t,r,e)}))))}(e,(function(e){r(e.instance,e.module)})).catch(c),{}}(),gn=r=>(gn=bn.za)(r),mn=()=>(mn=bn.Aa)();d._OrtInit=(r,e)=>(d._OrtInit=bn.Ba)(r,e),d._OrtGetLastError=(r,e)=>(d._OrtGetLastError=bn.Ca)(r,e),d._OrtCreateSessionOptions=(r,e,t,n,a,o,i,s,u,f)=>(d._OrtCreateSessionOptions=bn.Da)(r,e,t,n,a,o,i,s,u,f),d._OrtAppendExecutionProvider=(r,e)=>(d._OrtAppendExecutionProvider=bn.Ea)(r,e),d._OrtAddFreeDimensionOverride=(r,e,t)=>(d._OrtAddFreeDimensionOverride=bn.Fa)(r,e,t),d._OrtAddSessionConfigEntry=(r,e,t)=>(d._OrtAddSessionConfigEntry=bn.Ga)(r,e,t),d._OrtReleaseSessionOptions=r=>(d._OrtReleaseSessionOptions=bn.Ha)(r),d._OrtCreateSession=(r,e,t)=>(d._OrtCreateSession=bn.Ia)(r,e,t),d._OrtReleaseSession=r=>(d._OrtReleaseSession=bn.Ja)(r),d._OrtGetInputOutputCount=(r,e,t)=>(d._OrtGetInputOutputCount=bn.Ka)(r,e,t),d._OrtGetInputName=(r,e)=>(d._OrtGetInputName=bn.La)(r,e),d._OrtGetOutputName=(r,e)=>(d._OrtGetOutputName=bn.Ma)(r,e),d._OrtFree=r=>(d._OrtFree=bn.Na)(r),d._OrtCreateTensor=(r,e,t,n,a,o)=>(d._OrtCreateTensor=bn.Oa)(r,e,t,n,a,o),d._OrtGetTensorData=(r,e,t,n,a)=>(d._OrtGetTensorData=bn.Pa)(r,e,t,n,a),d._OrtReleaseTensor=r=>(d._OrtReleaseTensor=bn.Qa)(r),d._OrtCreateRunOptions=(r,e,t,n)=>(d._OrtCreateRunOptions=bn.Ra)(r,e,t,n),d._OrtAddRunConfigEntry=(r,e,t)=>(d._OrtAddRunConfigEntry=bn.Sa)(r,e,t),d._OrtReleaseRunOptions=r=>(d._OrtReleaseRunOptions=bn.Ta)(r),d._OrtCreateBinding=r=>(d._OrtCreateBinding=bn.Ua)(r),d._OrtBindInput=(r,e,t)=>(d._OrtBindInput=bn.Va)(r,e,t),d._OrtBindOutput=(r,e,t,n)=>(d._OrtBindOutput=bn.Wa)(r,e,t,n),d._OrtClearBoundOutputs=r=>(d._OrtClearBoundOutputs=bn.Xa)(r),d._OrtReleaseBinding=r=>(d._OrtReleaseBinding=bn.Ya)(r),d._OrtRunWithBinding=(r,e,t,n,a)=>(d._OrtRunWithBinding=bn.Za)(r,e,t,n,a),d._OrtRun=(r,e,t,n,a,o,i,s)=>(d._OrtRun=bn._a)(r,e,t,n,a,o,i,s),d._OrtEndProfiling=r=>(d._OrtEndProfiling=bn.$a)(r),d._JsepOutput=(r,e,t)=>(d._JsepOutput=bn.ab)(r,e,t),d._JsepGetNodeName=r=>(d._JsepGetNodeName=bn.bb)(r);var pn,hn=()=>(hn=bn.cb)(),vn=d._malloc=r=>(vn=d._malloc=bn.db)(r),yn=d._free=r=>(yn=d._free=bn.eb)(r),wn=(r,e,t,n,a,o)=>(wn=bn.hb)(r,e,t,n,a,o),An=()=>(An=bn.ib)(),_n=(r,e,t,n,a)=>(_n=bn.jb)(r,e,t,n,a),Cn=r=>(Cn=bn.kb)(r),On=r=>(On=bn.lb)(r),Tn=()=>(Tn=bn.mb)(),Sn=(r,e)=>(Sn=bn.nb)(r,e),Wn=r=>(Wn=bn.ob)(r),En=r=>(En=bn.pb)(r),xn=()=>(xn=bn.qb)(),Mn=d.dynCall_ii=(r,e)=>(Mn=d.dynCall_ii=bn.sb)(r,e),kn=r=>(kn=bn.tb)(r),Nn=()=>(Nn=bn.ub)(),Hn=r=>(Hn=bn.vb)(r),Rn=()=>(Rn=bn.wb)();function Pn(){if(!(0xn(),d.stackRestore=r=>Wn(r),d.stackAlloc=r=>En(r),d.UTF8ToString=Hr,d.stringToUTF8=Br,d.lengthBytesUTF8=Dr,Q=function r(){pn||Pn(),pn||(Q=r)},Pn(),b});export default e;\"em-pthread\"===globalThis.self?.name&&e();", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport type {OrtWasmModule} from './wasm-types';\nimport {isNode} from './wasm-utils-env';\n\n/**\n * The classic script source URL. This is not always available in non ESModule environments.\n *\n * In Node.js, this is undefined.\n */\nexport const scriptSrc =\n // if Nodejs, return undefined\n isNode ? undefined :\n // if It's ESM, use import.meta.url\n BUILD_DEFS.ESM_IMPORT_META_URL ??\n // use `document.currentScript.src` if available\n (typeof document !== 'undefined' ? (document.currentScript as HTMLScriptElement)?.src :\n // use `self.location.href` if available\n (typeof self !== 'undefined' ? self.location?.href : undefined));\n\n/**\n * The origin of the current location.\n *\n * In Node.js, this is undefined.\n */\nconst origin = isNode || typeof location === 'undefined' ? undefined : location.origin;\n\n/**\n * Check if the given filename with prefix is from the same origin.\n */\nconst isSameOrigin = (filename: string, prefixOverride?: string) => {\n try {\n const baseUrl = prefixOverride ?? scriptSrc;\n const url = baseUrl ? new URL(filename, baseUrl) : new URL(filename);\n return url.origin === origin;\n } catch {\n return false;\n }\n};\n\n/**\n * Normalize the inputs to an absolute URL with the given prefix override. If failed, return undefined.\n */\nconst normalizeUrl = (filename: string, prefixOverride?: string) => {\n const baseUrl = prefixOverride ?? scriptSrc;\n try {\n const url = baseUrl ? new URL(filename, baseUrl) : new URL(filename);\n return url.href;\n } catch {\n return undefined;\n }\n};\n\n/**\n * Create a fallback URL if an absolute URL cannot be created by the normalizeUrl function.\n */\nconst fallbackUrl = (filename: string, prefixOverride?: string) => `${prefixOverride ?? './'}${filename}`;\n\n/**\n * This helper function is used to preload a module from a URL.\n *\n * If the origin of the worker URL is different from the current origin, the worker cannot be loaded directly.\n * See discussions in https://github.com/webpack-contrib/worker-loader/issues/154\n *\n * In this case, we will fetch the worker URL and create a new Blob URL with the same origin as a workaround.\n *\n * @param absoluteUrl - The absolute URL to preload.\n *\n * @returns - A promise that resolves to a new Blob URL\n */\nconst preload = async(absoluteUrl: string): Promise => {\n const response = await fetch(absoluteUrl, {credentials: 'same-origin'});\n const blob = await response.blob();\n return URL.createObjectURL(blob);\n};\n\n/**\n * This helper function is used to dynamically import a module from a URL.\n *\n * The build script has special handling for this function to ensure that the URL is not bundled into the final output.\n *\n * @param url - The URL to import.\n *\n * @returns - A promise that resolves to the default export of the module.\n */\nconst dynamicImportDefault = async(url: string): Promise => (await import(/* webpackIgnore: true */ url)).default;\n\n/**\n * The proxy worker factory imported from the proxy worker module.\n *\n * This is only available when the WebAssembly proxy is not disabled.\n */\nconst createProxyWorker: ((urlOverride?: string) => Worker)|undefined =\n // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires\n BUILD_DEFS.DISABLE_WASM_PROXY ? undefined : require('./proxy-worker/main').default;\n\n/**\n * Import the proxy worker.\n *\n * This function will perform the following steps:\n * 1. If a preload is needed, it will preload the module and return the object URL.\n * 2. Use the proxy worker factory to create the proxy worker.\n *\n * @returns - A promise that resolves to a tuple of 2 elements:\n * - The object URL of the preloaded module, or undefined if no preload is needed.\n * - The proxy worker.\n */\nexport const importProxyWorker = async(): Promise<[undefined | string, Worker]> => {\n if (!scriptSrc) {\n throw new Error('Failed to load proxy worker: cannot determine the script source URL.');\n }\n\n // If the script source is from the same origin, we can use the embedded proxy module directly.\n if (isSameOrigin(scriptSrc)) {\n return [undefined, createProxyWorker!()];\n }\n\n // Otherwise, need to preload\n const url = await preload(scriptSrc);\n return [url, createProxyWorker!(url)];\n};\n\n/**\n * The embedded WebAssembly module.\n *\n * This is only available in ESM and when embedding is not disabled.\n */\nconst embeddedWasmModule: EmscriptenModuleFactory|undefined =\n BUILD_DEFS.IS_ESM && BUILD_DEFS.DISABLE_DYNAMIC_IMPORT ?\n // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires\n require(\n !BUILD_DEFS.DISABLE_TRAINING ? '../../dist/ort-training-wasm-simd-threaded.mjs' :\n !BUILD_DEFS.DISABLE_JSEP ? '../../dist/ort-wasm-simd-threaded.jsep.mjs' :\n '../../dist/ort-wasm-simd-threaded.mjs')\n .default :\n undefined;\n\n/**\n * Import the WebAssembly module.\n *\n * This function will perform the following steps:\n * 1. If BUILD_DEFS.DISABLE_DYNAMIC_IMPORT is true, use the embedded module.\n * 2. If a preload is needed, it will preload the module and return the object URL.\n * 3. Otherwise, it will perform a dynamic import of the module.\n *\n * @returns - A promise that resolves to a tuple of 2 elements:\n * - The object URL of the preloaded module, or undefined if no preload is needed.\n * - The default export of the module, which is a factory function to create the WebAssembly module.\n */\nexport const importWasmModule = async(\n urlOverride: string|undefined, prefixOverride: string|undefined,\n isMultiThreaded: boolean): Promise<[undefined | string, EmscriptenModuleFactory]> => {\n if (BUILD_DEFS.DISABLE_DYNAMIC_IMPORT) {\n return [undefined, embeddedWasmModule!];\n } else {\n const wasmModuleFilename = !BUILD_DEFS.DISABLE_TRAINING ? 'ort-training-wasm-simd-threaded.mjs' :\n !BUILD_DEFS.DISABLE_JSEP ? 'ort-wasm-simd-threaded.jsep.mjs' :\n 'ort-wasm-simd-threaded.mjs';\n const wasmModuleUrl = urlOverride ?? normalizeUrl(wasmModuleFilename, prefixOverride);\n // need to preload if all of the following conditions are met:\n // 1. not in Node.js.\n // - Node.js does not have the same origin policy for creating workers.\n // 2. multi-threaded is enabled.\n // - If multi-threaded is disabled, no worker will be created. So we don't need to preload the module.\n // 3. the absolute URL is available.\n // - If the absolute URL is failed to be created, the origin cannot be determined. In this case, we will not\n // preload the module.\n // 4. the worker URL is not from the same origin.\n // - If the worker URL is from the same origin, we can create the worker directly.\n const needPreload = !isNode && isMultiThreaded && wasmModuleUrl && !isSameOrigin(wasmModuleUrl, prefixOverride);\n const url = needPreload ? (await preload(wasmModuleUrl)) :\n (wasmModuleUrl ?? fallbackUrl(wasmModuleFilename, prefixOverride));\n return [needPreload ? url : undefined, await dynamicImportDefault>(url)];\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from 'onnxruntime-common';\n\nimport type {OrtWasmModule} from './wasm-types';\nimport {importWasmModule} from './wasm-utils-import';\n\nlet wasm: OrtWasmModule|undefined;\nlet initialized = false;\nlet initializing = false;\nlet aborted = false;\n\nconst isMultiThreadSupported = (): boolean => {\n // If 'SharedArrayBuffer' is not available, WebAssembly threads will not work.\n if (typeof SharedArrayBuffer === 'undefined') {\n return false;\n }\n\n try {\n // Test for transferability of SABs (for browsers. needed for Firefox)\n // https://groups.google.com/forum/#!msg/mozilla.dev.platform/IHkBZlHETpA/dwsMNchWEQAJ\n if (typeof MessageChannel !== 'undefined') {\n new MessageChannel().port1.postMessage(new SharedArrayBuffer(1));\n }\n\n // Test for WebAssembly threads capability (for both browsers and Node.js)\n // This typed array is a WebAssembly program containing threaded instructions.\n return WebAssembly.validate(new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 5,\n 4, 1, 3, 1, 1, 10, 11, 1, 9, 0, 65, 0, 254, 16, 2, 0, 26, 11\n ]));\n } catch (e) {\n return false;\n }\n};\n\nconst isSimdSupported = (): boolean => {\n try {\n // Test for WebAssembly SIMD capability (for both browsers and Node.js)\n // This typed array is a WebAssembly program containing SIMD instructions.\n\n // The binary data is generated from the following code by wat2wasm:\n //\n // (module\n // (type $t0 (func))\n // (func $f0 (type $t0)\n // (drop\n // (i32x4.dot_i16x8_s\n // (i8x16.splat\n // (i32.const 0))\n // (v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000)))))\n\n return WebAssembly.validate(new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 10, 30, 1, 28, 0, 65, 0,\n 253, 15, 253, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 186, 1, 26, 11\n ]));\n } catch (e) {\n return false;\n }\n};\n\nexport const initializeWebAssembly = async(flags: Env.WebAssemblyFlags): Promise => {\n if (initialized) {\n return Promise.resolve();\n }\n if (initializing) {\n throw new Error('multiple calls to \\'initializeWebAssembly()\\' detected.');\n }\n if (aborted) {\n throw new Error('previous call to \\'initializeWebAssembly()\\' failed.');\n }\n\n initializing = true;\n\n // wasm flags are already initialized\n const timeout = flags.initTimeout!;\n let numThreads = flags.numThreads!;\n\n // ensure SIMD is supported\n if (!isSimdSupported()) {\n throw new Error('WebAssembly SIMD is not supported in the current environment.');\n }\n\n // check if multi-threading is supported\n const multiThreadSupported = isMultiThreadSupported();\n if (numThreads > 1 && !multiThreadSupported) {\n if (typeof self !== 'undefined' && !self.crossOriginIsolated) {\n // eslint-disable-next-line no-console\n console.warn(\n 'env.wasm.numThreads is set to ' + numThreads +\n ', but this will not work unless you enable crossOriginIsolated mode. ' +\n 'See https://web.dev/cross-origin-isolation-guide/ for more info.');\n }\n\n // eslint-disable-next-line no-console\n console.warn(\n 'WebAssembly multi-threading is not supported in the current environment. ' +\n 'Falling back to single-threading.');\n\n // set flags.numThreads to 1 so that OrtInit() will not create a global thread pool.\n flags.numThreads = numThreads = 1;\n }\n\n const wasmPaths = flags.wasmPaths;\n const wasmPrefixOverride = typeof wasmPaths === 'string' ? wasmPaths : undefined;\n const mjsPathOverrideFlag = (wasmPaths as Env.WasmFilePaths)?.mjs;\n const mjsPathOverride = (mjsPathOverrideFlag as URL)?.href ?? mjsPathOverrideFlag;\n const wasmPathOverrideFlag = (wasmPaths as Env.WasmFilePaths)?.wasm;\n const wasmPathOverride = (wasmPathOverrideFlag as URL)?.href ?? wasmPathOverrideFlag;\n\n const [objectUrl, ortWasmFactory] = (await importWasmModule(mjsPathOverride, wasmPrefixOverride, numThreads > 1));\n\n let isTimeout = false;\n\n const tasks: Array> = [];\n\n // promise for timeout\n if (timeout > 0) {\n tasks.push(new Promise((resolve) => {\n setTimeout(() => {\n isTimeout = true;\n resolve();\n }, timeout);\n }));\n }\n\n // promise for module initialization\n tasks.push(new Promise((resolve, reject) => {\n const config: Partial = {\n /**\n * The number of threads. WebAssembly will create (Module.numThreads - 1) workers. If it is 1, no worker will be\n * created.\n */\n numThreads,\n };\n\n if (wasmPathOverride || wasmPrefixOverride) {\n /**\n * A callback function to locate the WebAssembly file. The function should return the full path of the file.\n *\n * Since Emscripten 3.1.58, this function is only called for the .wasm file.\n */\n config.locateFile = (fileName, scriptDirectory) =>\n wasmPathOverride ?? (wasmPrefixOverride ?? scriptDirectory) + fileName;\n }\n\n ortWasmFactory(config).then(\n // wasm module initialized successfully\n module => {\n initializing = false;\n initialized = true;\n wasm = module;\n resolve();\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n }\n },\n // wasm module failed to initialize\n (what) => {\n initializing = false;\n aborted = true;\n reject(what);\n });\n }));\n\n await Promise.race(tasks);\n\n if (isTimeout) {\n throw new Error(`WebAssembly backend initializing failed due to timeout: ${timeout}ms`);\n }\n};\n\nexport const getInstance = (): OrtWasmModule => {\n if (initialized && wasm) {\n return wasm;\n }\n\n throw new Error('WebAssembly is not initialized yet.');\n};\n\nexport const dispose = (): void => {\n if (initialized && !initializing && !aborted) {\n // TODO: currently \"PThread.terminateAllThreads()\" is not exposed in the wasm module.\n // And this function is not yet called by any code.\n // If it is needed in the future, we should expose it in the wasm module and uncomment the following line.\n\n // wasm?.PThread?.terminateAllThreads();\n wasm = undefined;\n\n initializing = false;\n initialized = false;\n aborted = true;\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {getInstance} from './wasm-factory';\n\nexport const allocWasmString = (data: string, allocs: number[]): number => {\n const wasm = getInstance();\n\n const dataLength = wasm.lengthBytesUTF8(data) + 1;\n const dataOffset = wasm._malloc(dataLength);\n wasm.stringToUTF8(data, dataOffset, dataLength);\n allocs.push(dataOffset);\n\n return dataOffset;\n};\n\ninterface ExtraOptionsHandler {\n (name: string, value: string): void;\n}\n\nexport const iterateExtraOptions =\n (options: Record, prefix: string, seen: WeakSet>,\n handler: ExtraOptionsHandler): void => {\n if (typeof options == 'object' && options !== null) {\n if (seen.has(options)) {\n throw new Error('Circular reference in options');\n } else {\n seen.add(options);\n }\n }\n\n Object.entries(options).forEach(([key, value]) => {\n const name = (prefix) ? prefix + key : key;\n if (typeof value === 'object') {\n iterateExtraOptions(value as Record, name + '.', seen, handler);\n } else if (typeof value === 'string' || typeof value === 'number') {\n handler(name, value.toString());\n } else if (typeof value === 'boolean') {\n handler(name, (value) ? '1' : '0');\n } else {\n throw new Error(`Can't handle extra config type: ${typeof value}`);\n }\n });\n };\n\n/**\n * check web assembly API's last error and throw error if any error occurred.\n * @param message a message used when an error occurred.\n */\nexport const checkLastError = (message: string): void => {\n const wasm = getInstance();\n\n const stack = wasm.stackSave();\n try {\n const paramsOffset = wasm.stackAlloc(8);\n wasm._OrtGetLastError(paramsOffset, paramsOffset + 4);\n const errorCode = wasm.HEAP32[paramsOffset / 4];\n const errorMessagePointer = wasm.HEAPU32[paramsOffset / 4 + 1];\n const errorMessage = errorMessagePointer ? wasm.UTF8ToString(errorMessagePointer) : '';\n throw new Error(`${message} ERROR_CODE: ${errorCode}, ERROR_MESSAGE: ${errorMessage}`);\n } finally {\n wasm.stackRestore(stack);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession} from 'onnxruntime-common';\n\nimport {getInstance} from './wasm-factory';\nimport {allocWasmString, checkLastError, iterateExtraOptions} from './wasm-utils';\n\nexport const setRunOptions = (options: InferenceSession.RunOptions): [number, number[]] => {\n const wasm = getInstance();\n let runOptionsHandle = 0;\n const allocs: number[] = [];\n\n const runOptions: InferenceSession.RunOptions = options || {};\n\n try {\n if (options?.logSeverityLevel === undefined) {\n runOptions.logSeverityLevel = 2; // Default to warning\n } else if (\n typeof options.logSeverityLevel !== 'number' || !Number.isInteger(options.logSeverityLevel) ||\n options.logSeverityLevel < 0 || options.logSeverityLevel > 4) {\n throw new Error(`log serverity level is not valid: ${options.logSeverityLevel}`);\n }\n\n if (options?.logVerbosityLevel === undefined) {\n runOptions.logVerbosityLevel = 0; // Default to 0\n } else if (typeof options.logVerbosityLevel !== 'number' || !Number.isInteger(options.logVerbosityLevel)) {\n throw new Error(`log verbosity level is not valid: ${options.logVerbosityLevel}`);\n }\n\n if (options?.terminate === undefined) {\n runOptions.terminate = false;\n }\n\n let tagDataOffset = 0;\n if (options?.tag !== undefined) {\n tagDataOffset = allocWasmString(options.tag, allocs);\n }\n\n runOptionsHandle = wasm._OrtCreateRunOptions(\n runOptions.logSeverityLevel!, runOptions.logVerbosityLevel!, !!runOptions.terminate!, tagDataOffset);\n if (runOptionsHandle === 0) {\n checkLastError('Can\\'t create run options.');\n }\n\n if (options?.extra !== undefined) {\n iterateExtraOptions(options.extra, '', new WeakSet>(), (key, value) => {\n const keyDataOffset = allocWasmString(key, allocs);\n const valueDataOffset = allocWasmString(value, allocs);\n\n if (wasm._OrtAddRunConfigEntry(runOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n checkLastError(`Can't set a run config entry: ${key} - ${value}.`);\n }\n });\n }\n\n return [runOptionsHandle, allocs];\n } catch (e) {\n if (runOptionsHandle !== 0) {\n wasm._OrtReleaseRunOptions(runOptionsHandle);\n }\n allocs.forEach(alloc => wasm._free(alloc));\n throw e;\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession} from 'onnxruntime-common';\n\nimport {getInstance} from './wasm-factory';\nimport {allocWasmString, checkLastError, iterateExtraOptions} from './wasm-utils';\n\nconst getGraphOptimzationLevel = (graphOptimizationLevel: string|unknown): number => {\n switch (graphOptimizationLevel) {\n case 'disabled':\n return 0;\n case 'basic':\n return 1;\n case 'extended':\n return 2;\n case 'all':\n return 99;\n default:\n throw new Error(`unsupported graph optimization level: ${graphOptimizationLevel}`);\n }\n};\n\nconst getExecutionMode = (executionMode: 'sequential'|'parallel'): number => {\n switch (executionMode) {\n case 'sequential':\n return 0;\n case 'parallel':\n return 1;\n default:\n throw new Error(`unsupported execution mode: ${executionMode}`);\n }\n};\n\nconst appendDefaultOptions = (options: InferenceSession.SessionOptions): void => {\n if (!options.extra) {\n options.extra = {};\n }\n if (!options.extra.session) {\n options.extra.session = {};\n }\n const session = options.extra.session as Record;\n if (!session.use_ort_model_bytes_directly) {\n // eslint-disable-next-line camelcase\n session.use_ort_model_bytes_directly = '1';\n }\n\n // if using JSEP with WebGPU, always disable memory pattern\n if (options.executionProviders &&\n options.executionProviders.some(ep => (typeof ep === 'string' ? ep : ep.name) === 'webgpu')) {\n options.enableMemPattern = false;\n }\n};\n\nconst setExecutionProviders =\n (sessionOptionsHandle: number, executionProviders: readonly InferenceSession.ExecutionProviderConfig[],\n allocs: number[]): void => {\n for (const ep of executionProviders) {\n let epName = typeof ep === 'string' ? ep : ep.name;\n\n // check EP name\n switch (epName) {\n case 'webnn':\n epName = 'WEBNN';\n if (typeof ep !== 'string') {\n const webnnOptions = ep as InferenceSession.WebNNExecutionProviderOption;\n // const context = (webnnOptions as InferenceSession.WebNNOptionsWithMLContext)?.context;\n const deviceType = (webnnOptions as InferenceSession.WebNNContextOptions)?.deviceType;\n if (deviceType) {\n const keyDataOffset = allocWasmString('deviceType', allocs);\n const valueDataOffset = allocWasmString(deviceType, allocs);\n if (getInstance()._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !==\n 0) {\n checkLastError(`Can't set a session config entry: 'deviceType' - ${deviceType}.`);\n }\n }\n }\n break;\n case 'webgpu':\n epName = 'JS';\n if (typeof ep !== 'string') {\n const webgpuOptions = ep as InferenceSession.WebGpuExecutionProviderOption;\n if (webgpuOptions?.preferredLayout) {\n if (webgpuOptions.preferredLayout !== 'NCHW' && webgpuOptions.preferredLayout !== 'NHWC') {\n throw new Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${webgpuOptions.preferredLayout}`);\n }\n const keyDataOffset = allocWasmString('preferredLayout', allocs);\n const valueDataOffset = allocWasmString(webgpuOptions.preferredLayout, allocs);\n if (getInstance()._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !==\n 0) {\n checkLastError(\n `Can't set a session config entry: 'preferredLayout' - ${webgpuOptions.preferredLayout}.`);\n }\n }\n }\n break;\n case 'wasm':\n case 'cpu':\n continue;\n default:\n throw new Error(`not supported execution provider: ${epName}`);\n }\n\n const epNameDataOffset = allocWasmString(epName, allocs);\n if (getInstance()._OrtAppendExecutionProvider(sessionOptionsHandle, epNameDataOffset) !== 0) {\n checkLastError(`Can't append execution provider: ${epName}.`);\n }\n }\n };\n\nexport const setSessionOptions = (options?: InferenceSession.SessionOptions): [number, number[]] => {\n const wasm = getInstance();\n let sessionOptionsHandle = 0;\n const allocs: number[] = [];\n\n const sessionOptions: InferenceSession.SessionOptions = options || {};\n appendDefaultOptions(sessionOptions);\n\n try {\n const graphOptimizationLevel = getGraphOptimzationLevel(sessionOptions.graphOptimizationLevel ?? 'all');\n const executionMode = getExecutionMode(sessionOptions.executionMode ?? 'sequential');\n const logIdDataOffset =\n typeof sessionOptions.logId === 'string' ? allocWasmString(sessionOptions.logId, allocs) : 0;\n\n const logSeverityLevel = sessionOptions.logSeverityLevel ?? 2; // Default to 2 - warning\n if (!Number.isInteger(logSeverityLevel) || logSeverityLevel < 0 || logSeverityLevel > 4) {\n throw new Error(`log serverity level is not valid: ${logSeverityLevel}`);\n }\n\n const logVerbosityLevel = sessionOptions.logVerbosityLevel ?? 0; // Default to 0 - verbose\n if (!Number.isInteger(logVerbosityLevel) || logVerbosityLevel < 0 || logVerbosityLevel > 4) {\n throw new Error(`log verbosity level is not valid: ${logVerbosityLevel}`);\n }\n\n const optimizedModelFilePathOffset = typeof sessionOptions.optimizedModelFilePath === 'string' ?\n allocWasmString(sessionOptions.optimizedModelFilePath, allocs) :\n 0;\n\n sessionOptionsHandle = wasm._OrtCreateSessionOptions(\n graphOptimizationLevel, !!sessionOptions.enableCpuMemArena, !!sessionOptions.enableMemPattern, executionMode,\n !!sessionOptions.enableProfiling, 0, logIdDataOffset, logSeverityLevel, logVerbosityLevel,\n optimizedModelFilePathOffset);\n if (sessionOptionsHandle === 0) {\n checkLastError('Can\\'t create session options.');\n }\n\n if (sessionOptions.executionProviders) {\n setExecutionProviders(sessionOptionsHandle, sessionOptions.executionProviders, allocs);\n }\n\n if (sessionOptions.enableGraphCapture !== undefined) {\n if (typeof sessionOptions.enableGraphCapture !== 'boolean') {\n throw new Error(`enableGraphCapture must be a boolean value: ${sessionOptions.enableGraphCapture}`);\n }\n const keyDataOffset = allocWasmString('enableGraphCapture', allocs);\n const valueDataOffset = allocWasmString(sessionOptions.enableGraphCapture.toString(), allocs);\n if (wasm._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n checkLastError(\n `Can't set a session config entry: 'enableGraphCapture' - ${sessionOptions.enableGraphCapture}.`);\n }\n }\n\n if (sessionOptions.freeDimensionOverrides) {\n for (const [name, value] of Object.entries(sessionOptions.freeDimensionOverrides)) {\n if (typeof name !== 'string') {\n throw new Error(`free dimension override name must be a string: ${name}`);\n }\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {\n throw new Error(`free dimension override value must be a non-negative integer: ${value}`);\n }\n const nameOffset = allocWasmString(name, allocs);\n if (wasm._OrtAddFreeDimensionOverride(sessionOptionsHandle, nameOffset, value) !== 0) {\n checkLastError(`Can't set a free dimension override: ${name} - ${value}.`);\n }\n }\n }\n\n if (sessionOptions.extra !== undefined) {\n iterateExtraOptions(sessionOptions.extra, '', new WeakSet>(), (key, value) => {\n const keyDataOffset = allocWasmString(key, allocs);\n const valueDataOffset = allocWasmString(value, allocs);\n\n if (wasm._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n checkLastError(`Can't set a session config entry: ${key} - ${value}.`);\n }\n });\n }\n\n return [sessionOptionsHandle, allocs];\n } catch (e) {\n if (sessionOptionsHandle !== 0) {\n wasm._OrtReleaseSessionOptions(sessionOptionsHandle);\n }\n allocs.forEach(alloc => wasm._free(alloc));\n throw e;\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from 'onnxruntime-common';\n\n// a dummy type declaration for Float16Array in case any polyfill is available.\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-explicit-any\n const Float16Array: any;\n}\n\n// This file includes common definitions. They do NOT have dependency on the WebAssembly instance.\n\n/**\n * Copied from ONNX definition. Use this to drop dependency 'onnx_proto' to decrease compiled .js file size.\n */\nexport const enum DataType {\n undefined = 0,\n float = 1,\n uint8 = 2,\n int8 = 3,\n uint16 = 4,\n int16 = 5,\n int32 = 6,\n int64 = 7,\n string = 8,\n bool = 9,\n float16 = 10,\n double = 11,\n uint32 = 12,\n uint64 = 13,\n complex64 = 14,\n complex128 = 15,\n bfloat16 = 16\n}\n\n/**\n * Map string tensor data to enum value\n */\nexport const tensorDataTypeStringToEnum = (type: string): DataType => {\n switch (type) {\n case 'int8':\n return DataType.int8;\n case 'uint8':\n return DataType.uint8;\n case 'bool':\n return DataType.bool;\n case 'int16':\n return DataType.int16;\n case 'uint16':\n return DataType.uint16;\n case 'int32':\n return DataType.int32;\n case 'uint32':\n return DataType.uint32;\n case 'float16':\n return DataType.float16;\n case 'float32':\n return DataType.float;\n case 'float64':\n return DataType.double;\n case 'string':\n return DataType.string;\n case 'int64':\n return DataType.int64;\n case 'uint64':\n return DataType.uint64;\n\n default:\n throw new Error(`unsupported data type: ${type}`);\n }\n};\n\n/**\n * Map enum value to string tensor data\n */\nexport const tensorDataTypeEnumToString = (typeProto: DataType): Tensor.Type => {\n switch (typeProto) {\n case DataType.int8:\n return 'int8';\n case DataType.uint8:\n return 'uint8';\n case DataType.bool:\n return 'bool';\n case DataType.int16:\n return 'int16';\n case DataType.uint16:\n return 'uint16';\n case DataType.int32:\n return 'int32';\n case DataType.uint32:\n return 'uint32';\n case DataType.float16:\n return 'float16';\n case DataType.float:\n return 'float32';\n case DataType.double:\n return 'float64';\n case DataType.string:\n return 'string';\n case DataType.int64:\n return 'int64';\n case DataType.uint64:\n return 'uint64';\n\n default:\n throw new Error(`unsupported data type: ${typeProto}`);\n }\n};\n\n/**\n * get tensor element size in bytes by the given data type\n * @returns size in integer or undefined if the data type is not supported\n */\nexport const getTensorElementSize = (dateType: number): number|\n undefined => [undefined, 4, 1, 1, 2, 2, 4, 8, undefined, 1, 2, 8, 4, 8, undefined, undefined, undefined][dateType];\n\n/**\n * get typed array constructor by the given tensor type\n */\nexport const tensorTypeToTypedArrayConstructor = (type: Tensor.Type): Float32ArrayConstructor|Uint8ArrayConstructor|\n Int8ArrayConstructor|Uint16ArrayConstructor|Int16ArrayConstructor|Int32ArrayConstructor|BigInt64ArrayConstructor|\n Uint8ArrayConstructor|Float64ArrayConstructor|Uint32ArrayConstructor|BigUint64ArrayConstructor => {\n switch (type) {\n case 'float16':\n // allow Float16Array polyfill.\n return typeof Float16Array !== 'undefined' && Float16Array.from ? Float16Array : Uint16Array;\n case 'float32':\n return Float32Array;\n case 'uint8':\n return Uint8Array;\n case 'int8':\n return Int8Array;\n case 'uint16':\n return Uint16Array;\n case 'int16':\n return Int16Array;\n case 'int32':\n return Int32Array;\n case 'bool':\n return Uint8Array;\n case 'float64':\n return Float64Array;\n case 'uint32':\n return Uint32Array;\n case 'int64':\n return BigInt64Array;\n case 'uint64':\n return BigUint64Array;\n default:\n throw new Error(`unsupported type: ${type}`);\n }\n };\n\n/**\n * Map string log level to integer value\n */\nexport const logLevelStringToEnum = (logLevel?: 'verbose'|'info'|'warning'|'error'|'fatal'): number => {\n switch (logLevel) {\n case 'verbose':\n return 0;\n case 'info':\n return 1;\n case 'warning':\n return 2;\n case 'error':\n return 3;\n case 'fatal':\n return 4;\n default:\n throw new Error(`unsupported logging level: ${logLevel}`);\n }\n};\n\n/**\n * Check whether the given tensor type is supported by GPU buffer\n */\nexport const isGpuBufferSupportedType = (type: Tensor.Type): type is Tensor.GpuBufferDataTypes => type === 'float32' ||\n type === 'float16' || type === 'int32' || type === 'int64' || type === 'uint32' || type === 'uint8' ||\n type === 'bool';\n\n/**\n * Map string data location to integer value\n */\nexport const dataLocationStringToEnum = (location: Tensor.DataLocation): number => {\n switch (location) {\n case 'none':\n return 0;\n case 'cpu':\n return 1;\n case 'cpu-pinned':\n return 2;\n case 'texture':\n return 3;\n case 'gpu-buffer':\n return 4;\n default:\n throw new Error(`unsupported data location: ${location}`);\n }\n};\n\n/**\n * Map integer data location to string value\n */\nexport const dataLocationEnumToString = (location: number): Tensor.DataLocation|undefined =>\n (['none', 'cpu', 'cpu-pinned', 'texture', 'gpu-buffer'] as const)[location];\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {isNode} from './wasm-utils-env';\n\n/**\n * Load a file into a Uint8Array.\n *\n * @param file - the file to load. Can be a URL/path, a Blob, an ArrayBuffer, or a Uint8Array.\n * @returns a Uint8Array containing the file data.\n */\nexport const loadFile = async(file: string|Blob|ArrayBufferLike|Uint8Array): Promise => {\n if (typeof file === 'string') {\n if (isNode) {\n // load file into ArrayBuffer in Node.js\n try {\n const {readFile} = require('node:fs/promises');\n return new Uint8Array(await readFile(file));\n } catch (e) {\n if (e.code === 'ERR_FS_FILE_TOO_LARGE') {\n // file is too large, use fs.createReadStream instead\n const {createReadStream} = require('node:fs');\n const stream = createReadStream(file);\n const chunks: Uint8Array[] = [];\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n return new Uint8Array(Buffer.concat(chunks));\n }\n throw e;\n }\n } else {\n // load file into ArrayBuffer in browsers\n const response = await fetch(file);\n if (!response.ok) {\n throw new Error(`failed to load external data file: ${file}`);\n }\n const contentLengthHeader = response.headers.get('Content-Length');\n const fileSize = contentLengthHeader ? parseInt(contentLengthHeader, 10) : 0;\n if (fileSize < 1073741824 /* 1GB */) {\n // when Content-Length header is not set, we cannot determine the file size. We assume it is small enough to\n // load into memory.\n return new Uint8Array(await response.arrayBuffer());\n } else {\n // file is too large, use stream instead\n if (!response.body) {\n throw new Error(`failed to load external data file: ${file}, no response body.`);\n }\n const reader = response.body.getReader();\n\n let buffer;\n try {\n // try to create ArrayBuffer directly\n buffer = new ArrayBuffer(fileSize);\n } catch (e) {\n if (e instanceof RangeError) {\n // use WebAssembly Memory to allocate larger ArrayBuffer\n const pages = Math.ceil(fileSize / 65536);\n buffer = new WebAssembly.Memory({initial: pages, maximum: pages}).buffer;\n } else {\n throw e;\n }\n }\n\n let offset = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n const chunkSize = value.byteLength;\n const chunk = new Uint8Array(buffer, offset, chunkSize);\n chunk.set(value);\n offset += chunkSize;\n }\n return new Uint8Array(buffer, 0, fileSize);\n }\n }\n\n } else if (file instanceof Blob) {\n return new Uint8Array(await file.arrayBuffer());\n } else if (file instanceof Uint8Array) {\n return file;\n } else {\n return new Uint8Array(file);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from 'onnxruntime-common';\n\nimport {logLevelStringToEnum} from '../wasm-common';\n\ntype LogLevel = NonNullable;\ntype MessageString = string;\ntype MessageFunction = () => string;\ntype Message = MessageString|MessageFunction;\n\nconst logLevelPrefix = ['V', 'I', 'W', 'E', 'F'];\n\nconst doLog = (level: number, message: string): void => {\n // eslint-disable-next-line no-console\n console.log(`[${logLevelPrefix[level]},${new Date().toISOString()}]${message}`);\n};\n\nlet configLogLevel: LogLevel|undefined;\nlet debug: boolean|undefined;\n\nexport const configureLogger = ($configLogLevel: LogLevel, $debug: boolean): void => {\n configLogLevel = $configLogLevel;\n debug = $debug;\n};\n\n/**\n * A simple logging utility to log messages to the console.\n */\nexport const LOG = (logLevel: LogLevel, msg: Message): void => {\n const messageLevel = logLevelStringToEnum(logLevel);\n const configLevel = logLevelStringToEnum(configLogLevel);\n if (messageLevel >= configLevel) {\n doLog(messageLevel, typeof msg === 'function' ? msg() : msg);\n }\n};\n\n/**\n * A simple logging utility to log messages to the console. Only logs when debug is enabled.\n */\nexport const LOG_DEBUG: typeof LOG = (...args: Parameters) => {\n if (debug) {\n LOG(...args);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from 'onnxruntime-common';\n\nimport {tensorTypeToTypedArrayConstructor} from '../wasm-common';\n\nexport const createView = (dataBuffer: ArrayBuffer, type: Tensor.Type): Int32Array|Uint32Array|BigInt64Array|\n BigUint64Array|Uint8Array|Float32Array|Float64Array|Int8Array|Int16Array|Uint16Array =>\n new (tensorTypeToTypedArrayConstructor(type))(dataBuffer);\n\n/**\n * a TensorView does not own the data.\n */\nexport interface TensorView {\n readonly data: number;\n readonly dataType: number;\n readonly dims: readonly number[];\n\n /**\n * get a Float32Array data view of the tensor data. tensor data must be on CPU.\n */\n getFloat32Array(): Float32Array;\n\n /**\n * get a BigInt64Array data view of the tensor data. tensor data must be on CPU.\n */\n getBigInt64Array(): BigInt64Array;\n\n /**\n * get a Int32Array data view of the tensor data. tensor data must be on CPU.\n */\n getInt32Array(): Int32Array;\n\n /**\n * create a new tensor view with the same data but different dimensions.\n */\n reshape(newDims: readonly number[]): TensorView;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../wasm-common';\nimport {TensorView} from '../tensor-view';\n\nimport {ShaderHelper} from './ops/common';\n\nexport type SessionState = 'default'|'capturing'|'replaying';\n\nexport enum GpuDataType {\n default = 0,\n upload = 1,\n profile = 2\n}\nexport type GpuDataId = number;\n\nexport type GpuArchitecture = 'ampere';\nexport type GpuVendor = 'amd'|'intel'|'nvidia';\nexport interface AdapterInfo {\n isArchitecture: (architecture: GpuArchitecture) => boolean;\n isVendor: (vendor: GpuVendor) => boolean;\n}\n\nexport interface GpuData {\n type: GpuDataType;\n id: GpuDataId;\n buffer: GPUBuffer;\n}\n\nexport interface TensorInfo {\n dims: readonly number[];\n dataType: number;\n}\n\nexport interface ProgramUniform {\n type: DataType;\n data: number|readonly number[];\n}\n\nexport type ProgramUniformVariableInfo = [type: DataType, length: number];\n\n/**\n * Represent the dependency of a program on a specific input tensor.\n *\n * - 'none': the shader/uniform does not depend on this input's info\n * - 'type': the shader/uniform depends on data type of this input\n * - 'rank': the shader/uniform depends on data type and the rank of this input\n * - 'dims': the shader/uniform depends on data type and the dims of this input\n * - 'data': the shader/uniform depends on data type, the dims and the data of this input\n */\nexport type ProgramInputTensorInfoDependency = 'none'|'type'|'rank'|'dims'|'data';\n\n/**\n * Represent information about a program's cache for shader.\n */\nexport interface ProgramShaderCacheInfo {\n /**\n * an optional string as a cache hint in the artifact cache. If this is not specified, the cache hint will be empty.\n *\n * This hint string should only contains initializing-time information, such as the attributes or any information of\n * initializers. It should NOT contain any runtime information, such as the shape of inputs.\n */\n hint?: string;\n\n /**\n * an optional list of dependencies of the program on the input tensors. If this is not specified, the program depends\n * on 'dims' of all inputs.\n */\n inputDependencies?: ProgramInputTensorInfoDependency[];\n}\n\n/**\n * Represent information about a program's cache for uniform.\n */\nexport interface ProgramUniformCacheInfo {\n /**\n * an optional string as a cache hint in the uniform cache. If this is not specified, the cache hint will be empty.\n *\n * This hint string should only contains runtime information, such as the shape of inputs.\n */\n hint?: string;\n\n /**\n * an optional list of dependencies of the program on the input tensors. If this is not specified, the program depends\n * on 'none' of all inputs.\n */\n inputDependencies?: ProgramInputTensorInfoDependency[];\n}\n\n\n/**\n * A set of data that represent a shader program\n */\nexport interface ProgramInfo {\n /**\n * the name of the program. used for debugging and profiling\n */\n name: string;\n\n /**\n * an optional object describing the cache information of the program shader.\n *\n * If this is not specified, assume hint is empty and inputDependencies are ['dims'] for all inputs.\n */\n shaderCache?: ProgramShaderCacheInfo;\n\n /**\n * the shader's processing source code.\n *\n * This function will be called when shader cache missed.\n */\n getShaderSource: (shaderHelper: ShaderHelper) => string;\n\n /**\n * A function to get run data required to run the program.\n *\n * This function will be called every time the program is executed. Should keep this function as simple as possible.\n */\n getRunData: (inputs: readonly TensorView[]) => {\n outputs: readonly TensorInfo[];\n dispatchGroup: {x: number; y?: number; z?: number};\n programUniforms?: readonly ProgramUniform[];\n };\n}\n\nexport interface Artifact {\n programInfo: ProgramInfo;\n computePipeline: GPUComputePipeline;\n uniformVariablesInfo: readonly ProgramUniformVariableInfo[]|undefined;\n}\n\nexport interface ComputeContextInputsOutputsMapping {\n /**\n * specify the mapping to the program's inputs. the value can be a number or a tensor view.\n * - if it's a number, it's the index of the kernel's input\n * - if it's a tensor view, it's an existing tensor view that will be used as the input\n *\n * if inputs is not specified, the mapping will be the kernel's inputs in order.\n */\n readonly inputs?: ReadonlyArray;\n /**\n * specify the mapping to the program's outputs. the value must be a number.\n * - if it's a non-negative number, it's the index of the kernel's output\n * - if it's -1, it's an output that will be created as a temporary value. this value will be released after\n * the kernel is executed.\n * - if it's -2, it's an output that will be created as a persistent value. this value will be released when the\n * kernel is released.\n *\n * if outputs is not specified, the mapping will be the kernel's outputs in order.\n */\n readonly outputs?: readonly number[];\n}\n\n/**\n * A ComputeContext instance carries the states that representing the current running of a kernel.\n */\nexport interface ComputeContext {\n /**\n * gpu adapter info\n */\n readonly adapterInfo: AdapterInfo;\n\n /**\n * stores the pointer to OpKernelContext\n */\n readonly opKernelContext: number;\n\n /**\n * a list of inputs, each input is an instance of TensorView\n */\n readonly inputs: readonly TensorView[];\n\n /**\n * a custom data object that can be used to store any data that is needed by the kernel\n */\n readonly kernelCustomData: {[key: string]: unknown};\n\n /**\n * a buffer that can be used to access custom data created each time the kernel is executed\n */\n readonly customDataBuffer: Uint8Array;\n\n /**\n * a number of outputs for the node\n */\n readonly outputCount: number;\n\n compute(program: ProgramInfo, inputsOutputsMapping?: ComputeContextInputsOutputsMapping): TensorView[];\n output(index: number, dims: readonly number[]): number;\n getMaxComputeWorkgroupSizes(): [number, number, number];\n getMaxComputeWorkgroupStoragesize(): number;\n}\n\nexport type TimestampQuery = 'none'|'inside-passes'|'at-passes';\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {WebGpuBackend} from '../backend-webgpu';\nimport {LOG_DEBUG} from '../log';\n\nimport {GpuData, GpuDataId, GpuDataType} from './types';\n\n/**\n * manages GpuDataId -> GpuBuffer\n */\nexport interface GpuDataManager {\n /**\n * copy data from CPU to GPU.\n */\n upload(id: GpuDataId, data: Uint8Array): void;\n /**\n * copy data from GPU to GPU.\n */\n memcpy(sourceId: GpuDataId, destinationId: GpuDataId): void;\n /**\n * create new data on GPU.\n */\n create(size: number, usage?: number): GpuData;\n /**\n * get GPU data by ID.\n */\n get(id: GpuDataId): GpuData|undefined;\n /**\n * release the data on GPU by ID.\n *\n * @return size of the data released\n */\n release(id: GpuDataId): number;\n /**\n * copy data from GPU to CPU.\n */\n download(id: GpuDataId, getTargetBuffer: () => Uint8Array): Promise;\n\n /**\n * refresh the buffers that marked for release.\n *\n * when release() is called, the buffer is not released immediately. this is because we need to wait for the commands\n * to be submitted to the GPU. this function is called after the commands are submitted so that the buffers can be\n * actually released.\n */\n refreshPendingBuffers(): void;\n\n /**\n * register an external buffer for IO Binding. If the buffer is already registered, return the existing GPU data ID.\n *\n * GPU data manager only manages a mapping between the buffer and the GPU data ID. It will not manage the lifecycle of\n * the external buffer.\n */\n registerExternalBuffer(buffer: GPUBuffer, originalSize: number, previousBuffer?: GPUBuffer): number;\n\n /**\n * unregister an external buffer for IO Binding.\n */\n unregisterExternalBuffer(buffer: GPUBuffer): void;\n\n /**\n * destroy all gpu buffers.\n */\n dispose(): void;\n\n /**\n * release session related data.\n * @param sessionId - specify the session ID.\n */\n onReleaseSession(sessionId: number): void;\n}\n\ninterface StorageCacheValue {\n gpuData: GpuData;\n originalSize: number;\n}\n\nconst bucketFreelist: Map = new Map([\n [64, 250],\n [128, 200],\n [256, 200],\n [512, 200],\n [2048, 230],\n [4096, 200],\n [8192, 50],\n [16384, 50],\n [32768, 50],\n [65536, 50],\n [131072, 50],\n [262144, 50],\n [524288, 50],\n [1048576, 50],\n [2097152, 30],\n [4194304, 20],\n [8388608, 10],\n [12582912, 10],\n [16777216, 10],\n [26214400, 15],\n [33554432, 22],\n [44236800, 2],\n [58982400, 6],\n // we don't want to cache the bucket sizes below but not caching them\n // results in some major performance hits for models like sd-turbo.\n [67108864, 6],\n [134217728, 6],\n [167772160, 6],\n]);\n\nconst bucketArr: number[] = [];\n\n/**\n * normalize the buffer size so that it fits the 128-bits (16 bytes) alignment.\n */\nconst calcNormalizedBufferSize = (size: number) => Math.ceil(size / 16) * 16;\n\n/**\n * calculate the buffer size so that it fits into buckets.\n */\nconst calcBucketBufferSize = (size: number) => {\n for (let idx = 0; idx < bucketArr.length; idx++) {\n const sizeForBucket = bucketArr[idx];\n if (size <= sizeForBucket) {\n return sizeForBucket;\n }\n }\n // not in bucket list -> caller will not cache, round up to 16.\n return Math.ceil(size / 16) * 16;\n};\n\nlet guid = 1;\nconst createNewGpuDataId = () => guid++;\n\n/**\n * exported standard download function. This function is used by the session to download the data from GPU, and also by\n * factory to create GPU tensors with the capacity of downloading data from GPU.\n *\n * @param backend - the WebGPU backend\n * @param gpuBuffer - the GPU buffer to download\n * @param originalSize - the original size of the data\n * @param getTargetBuffer - optional. If provided, the data will be copied to the target buffer. Otherwise, a new buffer\n * will be created and returned.\n */\nexport const downloadGpuData =\n async(backend: WebGpuBackend, gpuBuffer: GPUBuffer, originalSize: number, getTargetBuffer?: () => Uint8Array):\n Promise => {\n const bufferSize = calcNormalizedBufferSize(originalSize);\n const gpuReadBuffer = backend.device.createBuffer(\n // eslint-disable-next-line no-bitwise\n {size: bufferSize, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});\n try {\n const commandEncoder = backend.getCommandEncoder();\n backend.endComputePass();\n commandEncoder.copyBufferToBuffer(\n gpuBuffer /* source buffer */, 0 /* source offset */, gpuReadBuffer /* destination buffer */,\n 0 /* destination offset */, bufferSize /* size */\n );\n backend.flush();\n\n await gpuReadBuffer.mapAsync(GPUMapMode.READ);\n\n const arrayBuffer = gpuReadBuffer.getMappedRange();\n if (getTargetBuffer) {\n // if we already have a CPU buffer to accept the data, no need to clone the ArrayBuffer.\n const targetBuffer = getTargetBuffer();\n targetBuffer.set(new Uint8Array(arrayBuffer, 0, originalSize));\n return targetBuffer;\n } else {\n // the mapped ArrayBuffer will be released when the GPU buffer is destroyed. Need to clone the\n // ArrayBuffer.\n return new Uint8Array(arrayBuffer.slice(0, originalSize));\n }\n } finally {\n gpuReadBuffer.destroy();\n }\n };\n\nclass GpuDataManagerImpl implements GpuDataManager {\n // GPU Data ID => GPU Data ( storage buffer )\n private storageCache: Map;\n\n // pending buffers for uploading ( data is unmapped )\n private buffersForUploadingPending: GPUBuffer[];\n // pending buffers for computing\n private buffersPending: GPUBuffer[];\n\n // The reusable storage buffers for computing.\n private freeBuffers: Map;\n // The reusable uniform buffers\n private freeUniformBuffers: Map;\n\n // The external buffers registered users for IO Binding.\n private externalBuffers: Map;\n\n // The pendingBuffers for capture graph.\n // a SessionID -> GPUBuffer[] mapping.\n private capturedPendingBuffers: Map;\n\n constructor(private backend: WebGpuBackend) {\n this.storageCache = new Map();\n this.freeBuffers = new Map();\n this.freeUniformBuffers = new Map();\n this.buffersForUploadingPending = [];\n this.buffersPending = [];\n this.externalBuffers = new Map();\n this.capturedPendingBuffers = new Map();\n\n for (const [key, ] of bucketFreelist) {\n bucketArr.push(key);\n this.freeBuffers.set(key, []);\n this.freeUniformBuffers.set(key, []);\n }\n }\n\n upload(id: GpuDataId, data: Uint8Array): void {\n const srcArrayBuffer = data.buffer;\n const srcOffset = data.byteOffset;\n const srcLength = data.byteLength;\n const size = calcNormalizedBufferSize(srcLength);\n\n // get destination gpu buffer\n const gpuDataCache = this.storageCache.get(id);\n if (!gpuDataCache) {\n throw new Error('gpu data for uploading does not exist');\n }\n if (gpuDataCache.originalSize !== srcLength) {\n throw new Error(`inconsistent data size. gpu data size=${gpuDataCache.originalSize}, data size=${srcLength}`);\n }\n\n // create gpu buffer\n const gpuBufferForUploading = this.backend.device.createBuffer(\n // eslint-disable-next-line no-bitwise\n {mappedAtCreation: true, size, usage: GPUBufferUsage.MAP_WRITE | GPUBufferUsage.COPY_SRC});\n\n // copy (upload) data\n const arrayBuffer = gpuBufferForUploading.getMappedRange();\n new Uint8Array(arrayBuffer).set(new Uint8Array(srcArrayBuffer, srcOffset, srcLength));\n gpuBufferForUploading.unmap();\n\n\n // GPU copy\n const commandEncoder = this.backend.getCommandEncoder();\n this.backend.endComputePass();\n commandEncoder.copyBufferToBuffer(gpuBufferForUploading, 0, gpuDataCache.gpuData.buffer, 0, size);\n\n LOG_DEBUG('verbose', () => `[WebGPU] GpuDataManager.upload(id=${id})`);\n\n this.buffersForUploadingPending.push(gpuBufferForUploading);\n }\n\n memcpy(sourceId: GpuDataId, destinationId: GpuDataId): void {\n // get source gpu buffer\n const sourceGpuDataCache = this.storageCache.get(sourceId);\n if (!sourceGpuDataCache) {\n throw new Error('source gpu data for memcpy does not exist');\n }\n // get destination gpu buffer\n const destinationGpuDataCache = this.storageCache.get(destinationId);\n if (!destinationGpuDataCache) {\n throw new Error('destination gpu data for memcpy does not exist');\n }\n if (sourceGpuDataCache.originalSize !== destinationGpuDataCache.originalSize) {\n throw new Error('inconsistent source and destination gpu data size');\n }\n\n const size = calcNormalizedBufferSize(sourceGpuDataCache.originalSize);\n\n // GPU copy\n const commandEncoder = this.backend.getCommandEncoder();\n this.backend.endComputePass();\n commandEncoder.copyBufferToBuffer(\n sourceGpuDataCache.gpuData.buffer, 0, destinationGpuDataCache.gpuData.buffer, 0, size);\n }\n\n registerExternalBuffer(buffer: GPUBuffer, originalSize: number, previousBuffer?: GPUBuffer): number {\n let id: number|undefined;\n if (previousBuffer) {\n id = this.externalBuffers.get(previousBuffer);\n if (id === undefined) {\n throw new Error('previous buffer is not registered');\n }\n if (buffer === previousBuffer) {\n LOG_DEBUG(\n 'verbose',\n () => `[WebGPU] GpuDataManager.registerExternalBuffer(size=${originalSize}) => id=${\n id}, buffer is the same, skip.`);\n return id;\n } else if (this.backend.capturedCommandList.has(this.backend.currentSessionId!)) {\n throw new Error(`Registering a different external buffer under graph capture mode is not supported yet.\n Please use the previous external buffer!`);\n }\n this.externalBuffers.delete(previousBuffer);\n } else {\n id = createNewGpuDataId();\n }\n\n this.storageCache.set(id, {gpuData: {id, type: GpuDataType.default, buffer}, originalSize});\n this.externalBuffers.set(buffer, id);\n LOG_DEBUG(\n 'verbose',\n () => `[WebGPU] GpuDataManager.registerExternalBuffer(size=${originalSize}) => id=${id}, registered.`);\n return id;\n }\n\n unregisterExternalBuffer(buffer: GPUBuffer): void {\n const id = this.externalBuffers.get(buffer);\n if (id !== undefined) {\n this.storageCache.delete(id);\n this.externalBuffers.delete(buffer);\n LOG_DEBUG('verbose', () => `[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${id}`);\n }\n }\n\n // eslint-disable-next-line no-bitwise\n create(size: number, usage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST): GpuData {\n const bufferSize = calcBucketBufferSize(size);\n\n let gpuBuffer;\n // Currently, only storage buffers are reused.\n // eslint-disable-next-line no-bitwise\n const isStorage = (usage & GPUBufferUsage.STORAGE) === GPUBufferUsage.STORAGE;\n // eslint-disable-next-line no-bitwise\n const isUniform = (usage & GPUBufferUsage.UNIFORM) === GPUBufferUsage.UNIFORM;\n if (isStorage || isUniform) {\n const freeBuffers = isStorage ? this.freeBuffers : this.freeUniformBuffers;\n const buffers = freeBuffers.get(bufferSize);\n if (!buffers) {\n // no such bucket/freelist - create gpu buffer\n gpuBuffer = this.backend.device.createBuffer({size: bufferSize, usage});\n } else {\n if (buffers.length > 0) {\n // in freelist, use it\n gpuBuffer = buffers.pop() as GPUBuffer;\n } else {\n // bucket empty, create gpu buffer\n gpuBuffer = this.backend.device.createBuffer({size: bufferSize, usage});\n }\n }\n } else {\n // create gpu buffer\n gpuBuffer = this.backend.device.createBuffer({size: bufferSize, usage});\n }\n\n const gpuData = {id: createNewGpuDataId(), type: GpuDataType.default, buffer: gpuBuffer};\n this.storageCache.set(gpuData.id, {gpuData, originalSize: size});\n\n LOG_DEBUG('verbose', () => `[WebGPU] GpuDataManager.create(size=${size}) => id=${gpuData.id}`);\n return gpuData;\n }\n\n get(id: GpuDataId): GpuData|undefined {\n return this.storageCache.get(id)?.gpuData;\n }\n\n release(id: GpuDataId): number {\n const cachedData = this.storageCache.get(id);\n if (!cachedData) {\n throw new Error('releasing data does not exist');\n }\n\n LOG_DEBUG('verbose', () => `[WebGPU] GpuDataManager.release(id=${id}), gpuDataId=${cachedData.gpuData.id}`);\n\n this.storageCache.delete(id);\n this.buffersPending.push(cachedData.gpuData.buffer);\n // cachedData.gpuData.buffer.destroy();\n\n return cachedData.originalSize;\n }\n\n async download(id: GpuDataId, getTargetBuffer: () => Uint8Array): Promise {\n const cachedData = this.storageCache.get(id);\n if (!cachedData) {\n throw new Error('data does not exist');\n }\n await downloadGpuData(this.backend, cachedData.gpuData.buffer, cachedData.originalSize, getTargetBuffer);\n }\n\n refreshPendingBuffers(): void {\n for (const buffer of this.buffersForUploadingPending) {\n // upload buffer is only useful in the session creation time. So we don't need to reuse them in session running.\n buffer.destroy();\n }\n this.buffersForUploadingPending = [];\n\n if (this.buffersPending.length === 0) {\n return;\n }\n\n if (this.backend.sessionStatus === 'default') {\n for (const buffer of this.buffersPending) {\n const maxInFreeList = bucketFreelist.get(buffer.size);\n\n // eslint-disable-next-line no-bitwise\n if ((buffer.usage & GPUBufferUsage.STORAGE) === GPUBufferUsage.STORAGE) {\n // Put the pending buffer to freeBuffers list instead of really destroying it for buffer reusing.\n const freelist = this.freeBuffers.get(buffer.size) || [];\n if (maxInFreeList === undefined || freelist.length >= maxInFreeList) {\n buffer.destroy();\n } else {\n freelist.push(buffer);\n }\n // eslint-disable-next-line no-bitwise\n } else if ((buffer.usage & GPUBufferUsage.UNIFORM) === GPUBufferUsage.UNIFORM) {\n // Put the pending buffer to freeUniformBuffers list instead of really destroying it for buffer reusing.\n const freelist = this.freeUniformBuffers.get(buffer.size) || [];\n if (maxInFreeList === undefined || freelist.length >= maxInFreeList) {\n buffer.destroy();\n } else {\n freelist.push(buffer);\n }\n } else {\n buffer.destroy();\n }\n }\n this.buffersPending = [];\n } else {\n // Don't release intermediate tensors in non-default mode.\n // TODO: reuse the storage buffers in non-default mode.\n let capturedBuffers = this.capturedPendingBuffers.get(this.backend.currentSessionId!);\n if (!capturedBuffers) {\n capturedBuffers = [];\n this.capturedPendingBuffers.set(this.backend.currentSessionId!, capturedBuffers);\n }\n for (const buffer of this.buffersPending) {\n capturedBuffers.push(buffer);\n }\n this.buffersPending = [];\n }\n }\n\n dispose() {\n this.freeBuffers.forEach((buffers) => {\n buffers.forEach(buffer => {\n buffer.destroy();\n });\n });\n this.freeUniformBuffers.forEach((buffers) => {\n buffers.forEach(buffer => {\n buffer.destroy();\n });\n });\n\n this.storageCache.forEach((storage) => {\n storage.gpuData.buffer.destroy();\n });\n\n this.capturedPendingBuffers.forEach((buffers) => {\n buffers.forEach(buffer => {\n buffer.destroy();\n });\n });\n this.storageCache = new Map();\n this.freeBuffers = new Map();\n this.freeUniformBuffers = new Map();\n this.capturedPendingBuffers = new Map();\n }\n\n onReleaseSession(sessionId: number) {\n // release the captured pending buffers.\n const pendingBuffers = this.capturedPendingBuffers.get(sessionId);\n if (pendingBuffers) {\n pendingBuffers.forEach(buffer => {\n buffer.destroy();\n });\n this.capturedPendingBuffers.delete(sessionId);\n }\n }\n}\n\nexport const createGpuDataManager = (...args: ConstructorParameters): GpuDataManager =>\n new GpuDataManagerImpl(...args);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nclass AttributeWithCacheKeyImpl {\n constructor(attribute: Record) {\n Object.assign(this, attribute);\n }\n\n private key: string;\n public get cacheKey(): string {\n if (!this.key) {\n this.key =\n Object.getOwnPropertyNames(this).sort().map(name => `${(this as Record)[name]}`).join(';');\n }\n return this.key;\n }\n}\n\nexport interface AttributeWithCacheKey {\n readonly cacheKey: string;\n}\n\n/**\n * create a new object from the given attribute, and add a cacheKey property to it\n */\nexport const createAttributeWithCacheKey = >(attribute: T): T&AttributeWithCacheKey =>\n new AttributeWithCacheKeyImpl(attribute) as unknown as T & AttributeWithCacheKey;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/* eslint-disable no-param-reassign */\n\nexport class MatMulUtil {\n /**\n * Calculate the expected shape when matrix multiplication\n * @param a The shape of tensor A. Should be a tuple of 2 positive integers\n * @param b The shape of tensor B. Should be a tuple of 2 positive integers\n * @returns The expected shape of the result, or undefined if N/A\n */\n static calcMatMulShape(a: [number, number], b: [number, number]): [number, number]|undefined {\n return (a[1] !== b[0]) ? undefined : [a[0], b[1]];\n }\n}\n\n\nexport class BroadcastUtil {\n /**\n * Calculate the expected shape when broadcasting 2 tensors\n * @param a The shape of tensor A. Should be an array of positive integers\n * @param b The shape of tensor B. Should be an array of positive integers\n * @param isMatMul Whether the operation is MatMul\n * @returns The expected shape of the result, or undefined if N/A\n */\n static calcShape(adims: readonly number[], bdims: readonly number[], isMatMul = false): readonly number[]|undefined {\n const arank = adims.length;\n const brank = bdims.length;\n if (arank === 0) {\n return bdims;\n }\n if (brank === 0) {\n return adims;\n }\n const crank = Math.max(adims.length, bdims.length);\n const cdims = new Array(crank);\n\n // calculate the last 2 dimension if it is MatMul\n if (isMatMul) {\n if (arank < 2 || brank < 2) {\n return undefined;\n }\n const cShapeMatMul =\n MatMulUtil.calcMatMulShape([adims[arank - 2], adims[arank - 1]], [bdims[brank - 2], bdims[brank - 1]]);\n if (cShapeMatMul === undefined) {\n return undefined;\n }\n [cdims[crank - 2], cdims[crank - 1]] = cShapeMatMul;\n }\n\n for (let i = isMatMul ? 3 : 1; i <= crank; i++) {\n const aLen = arank - i < 0 ? 1 : adims[arank - i];\n const bLen = brank - i < 0 ? 1 : bdims[brank - i];\n\n if (aLen !== bLen && aLen > 1 && bLen > 1) {\n return undefined;\n }\n const max = Math.max(aLen, bLen);\n if (aLen && bLen) {\n cdims[crank - i] = Math.max(aLen, bLen);\n } else {\n // when either aLen or bLen is 0, the other should be either 0 or 1, otherwise it is not broadcastable.\n if (max > 1) {\n return undefined;\n }\n cdims[crank - i] = 0;\n }\n }\n\n return cdims;\n }\n\n /**\n * Determine if a shape is unidirectional broadcastable to another shape\n * @param shape The input shape\n * @param finalShape The desired shape after broadcasting\n */\n static isValidBroadcast(shape: readonly number[], finalShape: readonly number[]): boolean {\n // align shape to the right\n const inputRank = shape.length;\n const finalRank = finalShape.length;\n if (inputRank > finalRank) {\n return false;\n }\n for (let i = 1; i <= inputRank; i++) {\n if (shape[inputRank - i] !== 1 && shape[inputRank - i] !== finalShape[finalRank - i]) {\n return false;\n }\n }\n return true;\n }\n}\n\n\nexport class ShapeUtil {\n /**\n * calculate the size (number of elements)\n */\n static size(dims: readonly number[]): number {\n return ShapeUtil.getSizeFromDimensionRange(dims, 0, dims.length);\n }\n\n /**\n * convert dims corresponding to type change to pack. ex. uint8 data to uint32\n */\n static convertShape(dims: readonly number[], size = 4): readonly number[] {\n const rank = dims.length;\n if (rank === 0) {\n return [];\n }\n const newDims = new Array(rank);\n let i = rank - 1;\n while (i >= 0) {\n if (dims[i] % size === 0) {\n newDims[i] = dims[i] / size;\n break;\n }\n if (size % dims[i] !== 0) {\n throw new Error('cannot convert shape');\n }\n newDims[i] = 1;\n size /= dims[i];\n i--;\n }\n for (i--; i >= 0; i--) {\n newDims[i] = dims[i];\n }\n return newDims;\n }\n\n /**\n * calculate the size (number of elements) from the given axis (inclusive)\n */\n static sizeFromDimension(dims: readonly number[], axis: number): number {\n if (axis < 0 || axis > dims.length) {\n throw new Error(`invalid dimension of ${axis} for sizeFromDimension as Tensor has ${dims.length} dimensions.`);\n }\n return ShapeUtil.getSizeFromDimensionRange(dims, axis, dims.length);\n }\n\n /**\n * calculate the size (number of elements) to the given axis (exclusive)\n */\n static sizeToDimension(dims: readonly number[], axis: number): number {\n if (axis < 0 || axis > dims.length) {\n throw new Error(`invalid dimension of ${axis} for sizeToDimension as Tensor has ${dims.length} dimensions.`);\n }\n return ShapeUtil.getSizeFromDimensionRange(dims, 0, axis);\n }\n\n /**\n * calculate the size (number of elements) from and to the given axis [start, end)\n */\n static getSizeFromDimensionRange(dims: readonly number[], start: number, end: number): number {\n let size = 1;\n for (let i = start; i < end; i++) {\n // safety check as this method is called by multiple other methods requiring size.\n // size cannot be negative.\n if (dims[i] < 0) {\n throw new Error(\n // eslint-disable-next-line max-len\n 'cannot get valid size from specified dimension range. Most likely the range contains negative values in them.');\n }\n size *= dims[i];\n }\n return size;\n }\n\n static computeStrides(dims: readonly number[]): readonly number[] {\n const rank = dims.length;\n if (rank === 0) {\n return [];\n } else if (rank === 1) {\n return [1];\n }\n const strides = new Array(rank);\n strides[rank - 1] = 1;\n strides[rank - 2] = dims[rank - 1];\n for (let i = rank - 3; i >= 0; --i) {\n strides[i] = strides[i + 1] * dims[i + 1];\n }\n return strides;\n }\n\n /**\n * normailze axis of range [-r, r) into [0, r).\n */\n static normalizeAxis(axis: number, tensorRank: number): number {\n if (axis < -tensorRank && axis >= tensorRank) {\n throw new Error('unsupported axis for this operation.');\n }\n return axis < 0 ? axis + tensorRank : axis;\n }\n\n static normalizeAxes(axes: readonly number[], tensorRank?: number): number[] {\n return axes.map(x => this.normalizeAxis(x, tensorRank ?? axes.length));\n }\n\n /**\n * Sorts a given array based on the indices in the Perm array\n * Used in Transpose\n * @param a Array to be sorted such as dims or strides\n * @param perm Perm given; if null a will be reversed\n */\n static sortBasedOnPerm(a: readonly number[], perm?: readonly number[]): readonly number[] {\n if (perm) {\n return perm.map((v) => a[v]);\n } else {\n return a.slice().reverse();\n }\n }\n\n /**\n * Pads a given shape according to the padding values\n * @param dims shape of the Tensor to be padded\n * @param pad pad values\n */\n static padShape(dims: readonly number[], pad: readonly number[]): readonly number[] {\n const rank = dims.length;\n return dims.map((v, i) => v + pad[i] + pad[i + rank]);\n }\n\n /**\n * Determines if the two shapes are identical\n * @param shape1\n * @param shape2\n */\n static areEqual(shape1: readonly number[], shape2: readonly number[]): boolean {\n if (shape1.length !== shape2.length) {\n return false;\n }\n return shape1.every((v, i) => v === shape2[i]);\n }\n}\n\nexport class PoolConvUtil {\n /**\n * Adjust the kernel, strides, pads to correct rank. Set to default value if not present\n * @param isGlobalOperator If true, perform global pooling.\n * @param inputDims The input tensor dimension.\n * @param kernelShape The size of the kernel along each axis.\n * @param strides Stride along each axis.\n * @param dilations Dilation along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n */\n static adjustPoolAttributes(\n isGlobalOperator: boolean, inputDims: readonly number[], kernelShape: number[], strides: number[],\n dilations: number[], pads: number[]): void {\n if (!isGlobalOperator && kernelShape.length !== inputDims.length - 2) {\n throw new Error('length of specified kernel shapes should be 2 less than length of input dimensions');\n }\n\n if (isGlobalOperator) {\n // adjust kernel shape to cover the input dims\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n if (dim >= kernelShape.length) {\n kernelShape.push(inputDims[dim + 2]);\n } else {\n kernelShape[dim] = inputDims[dim + 2];\n }\n }\n }\n\n // adjust strides length to match kernel shape length\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (dim < strides.length) {\n if (strides[dim] < 0) {\n throw new Error('strides should be greater than or equal to 1');\n }\n } else {\n strides.push(1);\n }\n }\n\n // adjust dilation value\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (dim < dilations.length) {\n if (dilations[dim] < 0) {\n throw new Error('dilations should be greater than or equal to 1');\n }\n } else {\n dilations.push(1);\n }\n }\n\n // adjust pads length to match 2 * kernel shape length\n for (let dim = 0; dim < kernelShape.length * 2; dim++) {\n if (dim < pads.length) {\n if (pads[dim] < 0) {\n throw new Error('pad should be greater than or equal to 1');\n }\n } else {\n pads.push(0);\n }\n }\n\n // sanity checks for values in kernel shapes and pads\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (kernelShape[dim] <= 0) {\n throw new Error('kernel shapes need to be greater than 0');\n }\n\n if (pads[dim] >= kernelShape[dim] || pads[dim + kernelShape.length] >= kernelShape[dim]) {\n throw new Error('pads should be smaller than kernel');\n }\n }\n }\n\n // adjust pad values based on 'autoPad' attribute\n static adjustPadsBasedOnAutoPad(\n inputDims: readonly number[], strides: readonly number[], dilations: readonly number[],\n kernelShape: readonly number[], pads: number[], isChannelLast: boolean, autoPad?: string): void {\n if (!autoPad) {\n return;\n }\n\n if (pads.length !== 2 * (inputDims.length - 2)) {\n throw new Error('length of pads should be twice the length of data dimensions');\n }\n\n if (strides.length !== (inputDims.length - 2)) {\n throw new Error('length of strides should be the length of data dimensions');\n }\n\n if (kernelShape.length !== (inputDims.length - 2)) {\n throw new Error('length of kernel shapes should be the length of data dimensions');\n }\n\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n PoolConvUtil.adjustPadAndReturnShape(\n inputDims[dim + (isChannelLast ? 1 : 2)], strides[dim], dilations[dim], kernelShape[dim], pads, dim,\n dim + inputDims.length - 2, autoPad);\n }\n }\n\n /**\n * Calculate the output shape for Pool ops based on input attributes. (Should be used only for Pool ops)\n * @param isGlobalOperator If true, perform global pooling.\n * @param inputDims The input tensor dimension. (inputs[0].dims)\n * @param strides Stride along each axis.\n * @param dilations Dilation along each axis.\n * @param kernelShape The size of the kernel along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n * @param autoPad DEPRECATED attribute supported for legacy models. Specifies how to implicitly calculate pads in each\n * dimension. Can take values NOTSET, SAME_UPPER, SAME_LOWER, or VALID.\n */\n static computePoolOutputShape(\n isGlobalOperator: boolean, inputDims: readonly number[], strides: number[], dilations: number[],\n kernelShape: number[], pads: number[], autoPad?: string): number[] {\n if (inputDims.length <= 0) {\n throw new Error('input shape must be of size greater than 0');\n }\n\n // Add batch size and number of channels of output\n const outputDims = [inputDims[0], inputDims[1]];\n\n PoolConvUtil.computeShapeHelper(\n isGlobalOperator, inputDims, outputDims, strides, dilations, kernelShape, pads, autoPad);\n return outputDims;\n }\n\n /**\n * Calculate the output shape for Conv op based on input attributes. (Should be used only for Conv op)\n * @param inputDims The input tensor dimension. (inputs[0].dims)\n * @param filterDims The filter tensor dimension. (inputs[1].dims)\n * @param strides Stride along each axis.\n * @param kernelShape The size of the kernel along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n * @param autoPad DEPRECATED attribute supported for legacy models. Specifies how to implicitly calculate pads in each\n * dimension. Can take values NOTSET, SAME_UPPER, SAME_LOWER, or VALID.\n */\n static computeConvOutputShape(\n inputDims: readonly number[], filterDims: readonly number[], strides: number[], dilations: number[],\n kernelShape: number[], pads: number[], autoPad?: string): number[] {\n if (inputDims.length <= 0 || filterDims.length <= 0) {\n throw new Error('invalid input tensor dims or invalid filter tensor dims');\n }\n\n // Add batch size and number of channels of output\n const outputDims = [inputDims[0], filterDims[0]];\n\n PoolConvUtil.computeShapeHelper(false, inputDims, outputDims, strides, dilations, kernelShape, pads, autoPad);\n return outputDims;\n }\n\n // will compute output shapes for data dimensions ONLY (i.e.) no batch size and channels\n // called by computePoolOutputShape() and computeConvOutputShape()\n // adjust pads based on 'autoPad' attribute prior to shape computation\n private static computeShapeHelper(\n isGlobalOperator: boolean, inputDims: readonly number[], outputDims: number[], strides: readonly number[],\n dilations: readonly number[], kernelShape: readonly number[], pads: number[], autoPad?: string) {\n if (isGlobalOperator) {\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n outputDims.push(1);\n }\n } else {\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n outputDims.push(PoolConvUtil.adjustPadAndReturnShape(\n inputDims[dim + 2], strides[dim], dilations[dim], kernelShape[dim], pads, dim, dim + inputDims.length - 2,\n autoPad));\n }\n }\n }\n\n // helper for computeShapeHelper() and adjustPadsBasedOnAutoPad()\n // adjusts pad value for given 'autoPad' string and computes output shape along a particular dimension\n private static adjustPadAndReturnShape(\n inSize: number, stride: number, dilation: number, kernel: number, pads: number[], padHeadIndex: number,\n padTailIndex: number, autoPad?: string): number {\n const dkernel = dilation * (kernel - 1) + 1;\n if (autoPad && autoPad !== 'NOTSET') {\n switch (autoPad) {\n case 'VALID':\n pads[padHeadIndex] = 0;\n pads[padTailIndex] = 0;\n return Math.floor(((inSize - dkernel) / stride) + 1);\n case 'SAME_LOWER':\n case 'SAME_UPPER':\n if (dilation !== 1) {\n throw new Error('Dilation not supported for SAME_UPPER or SAME_LOWER');\n } else {\n const legacyTargetSize = (inSize + stride - 1) / stride;\n const padNeeded = (legacyTargetSize - 1) * stride + kernel - inSize;\n pads[padHeadIndex] =\n (autoPad === 'SAME_LOWER') ? Math.floor((padNeeded + 1) / 2) : Math.floor(padNeeded / 2);\n pads[padTailIndex] = padNeeded - pads[padHeadIndex];\n return Math.floor(((inSize + padNeeded - kernel) / stride) + 1);\n }\n default:\n throw new Error('Unsupported AutoPad type');\n }\n } else {\n return Math.floor(((inSize + pads[padHeadIndex] + pads[padTailIndex] - dkernel) / stride) + 1);\n }\n }\n}\n\nexport class GemmUtil {\n // will make sure input shapes are compatible for this op\n // and return back the shape of the output in the form of a tuple\n // will throw exception if the input shapes are not compatible\n static getShapeOfGemmResult(\n leftShape: readonly number[], transLeft: boolean, rightShape: readonly number[], transRight: boolean,\n biasShape?: readonly number[]): readonly number[] {\n if (leftShape.length !== 2 || rightShape.length !== 2) {\n throw new Error('shape need to be of size 2');\n }\n\n let M: number;\n let K: number;\n let N: number;\n\n if (transLeft) {\n M = leftShape[1];\n K = leftShape[0];\n } else {\n M = leftShape[0];\n K = leftShape[1];\n }\n\n let kDim = -1;\n\n if (transRight) {\n N = rightShape[0];\n kDim = 1;\n } else {\n N = rightShape[1];\n kDim = 0;\n }\n\n if (rightShape[kDim] !== K) {\n throw new Error('dimension mismatch');\n }\n\n if (M <= 0 || N <= 0 || K <= 0) {\n throw new Error('invalid shape specified');\n }\n\n if (biasShape && !BroadcastUtil.isValidBroadcast(biasShape, [M, N])) {\n throw new Error('gemm: invalid bias shape for broadcast');\n }\n\n return [M, N, K];\n }\n}\n\n\nexport const MIN_CLIP = -3.4028234663852886e+38;\nexport const MAX_CLIP = 3.4028234663852886e+38;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {ShapeUtil} from '../../util';\nimport {ProgramUniform, ProgramUniformVariableInfo} from '../types';\n\n/**\n * constant value for a workgroup size.\n *\n * We definitely can do further optimization in future, but for now we use 64.\n *\n * rule of thumb: Use [a workgroup size of] 64 unless you know what GPU you are targeting or that your workload\n * needs something different.\n *\n * from: https://surma.dev/things/webgpu/\n **/\nexport const WORKGROUP_SIZE = 64;\n\ninterface IndicesHelperTypes {\n /**\n * WGSL type of indices expression\n */\n readonly indices: string;\n\n /**\n * WGSL type of a value\n */\n readonly value: string;\n\n /**\n * WGSL type of storage type representing a value\n *\n * This is usually the same to `value`, but for some type (eg. bool), we need to use `u32` as storage type for\n * value type `vec4`\n */\n readonly storage: string;\n\n /**\n * tensor type as represented in TensorView\n */\n readonly tensor: number;\n}\n\n/**\n * A helper class for generating WGSL code for manipulating indices and data for a shader's input or output.\n *\n * This class is designed to offer a unified way to generate WGSL code for manipulating indices and data for a shader's\n * input or output.\n *\n * The following is a list of terminologies used in this class:\n * - `offset`: a uint32 value representing the offset of an element in the data buffer.\n * - `indices`: an abstraction of a multi-dimensional array's indices representing the data's index on each dimension.\n * - `value`: a value of a data element.\n *\n * Users are expected to create an instance of this class for each shader's input or output, and use the instance to\n * generate WGSL code for manipulating indices and data. The following 2 exported functions are for users to call to\n * create an instance of an indices helper:\n * - `inputVariable()`: create an indices helper instance for an input.\n * - `outputVariable()`: create an indices helper instance for an output.\n * - `internalVariable()`: create an indices helper instance for an internal variable.\n *\n * An indices helper instance contains helper functions for the following operations:\n * - access readonly basic information, including: `name`(the name of the input or output), `usage`(whether it's an\n * input, an output or an internal variable) and `shape`(the passed in shape).\n * - `type`: access readonly type information, including: `indices`(the type of indices), `value`(the type of value at\n * runtime), `storage`(the type of value at storage) and `tensor`(the tensor type as represented in TensorView).\n * - generate WGSL code for getting indices from offset. Use `offsetToIndices()` for WGSL code snippet to calculate\n * indices from offset, and use `indicesToOffset()` for WGSL code snippet to calculate offset from indices.\n * - to manipulate an instance of indices, use `setIndices()` and `getIndices()` to set and get the indices on an\n * indices variable.\n * - to manipulate data, use `set()`/`get()` to access data at the given indices from parameter list, use\n * `setByIndices()`/`getByIndices()` to access data at the given indices from an indices variable, and use\n * `setByOffset()`/`getByOffset()` to access data at the given offset.\n * - `impl`: get WGSL code of function implementation for the util functions mentioned above.\n */\nexport interface IndicesHelper {\n /**\n * get WGSL code of function implementation for the util functions.\n *\n */\n readonly impl: () => string;\n\n /**\n * get type info\n */\n readonly type: IndicesHelperTypes;\n\n /**\n * WGSL code of a expression for getting indices from offset.\n *\n * @param varOffset - a u32 expression representing the offset.\n *\n * @returns an `type.indices` expression\n */\n readonly offsetToIndices: (varOffset: string) => string;\n\n /**\n * WGSL code of an `u32` expression for getting offset from indices.\n *\n * @param varIndices - a `type.indices` expression representing the indices.\n *\n * @returns an `u32` expression\n */\n readonly indicesToOffset: (varIndices: string) => string;\n\n /**\n * WGSL code of an `u32` expression for getting original offset from broadcasted indices.\n *\n * @param varIndices - a `type.indices` expression representing the output indices.\n * @param output - output IndicesHelper.\n *\n * @returns an `u32` expression\n */\n readonly broadcastedIndicesToOffset: (varIndices: string, output: IndicesHelper) => string;\n\n /**\n * WGSL code of generating an indices literal\n *\n * @param init - initial value.\n */\n readonly indices: (...init: ReadonlyArray) => string;\n\n /**\n * WGSL code of a statement for setting indices.\n *\n * @param varIndices - a variable name for the indices.\n * @param idx - the index of the indices to set. can be a number or a string (WGSL `u32` expression).\n * @param value - the value to set. can be a number or a string (WGSL `u32` expression).\n *\n * @returns a WGSL statement\n */\n readonly indicesSet: (varIndices: string, idx: number|string, value: number|string) => void;\n\n /**\n * WGSL code of an `u32` expression for getting indices.\n *\n * @param varIndices - a variable name for the indices.\n * @param idx - the index of the indices to get. can be a number or a string (WGSL `u32` expression).\n *\n * @returns an `u32` expression\n */\n readonly indicesGet: (varIndices: string, idx: number|string) => string;\n\n /**\n * WGSL code for a statement for setting data at the given indices.\n *\n * @param indicesAndValue - an array of numbers or strings (WGSL `u32` expression) representing the indices, followed\n * by the value to set. This array should have exactly `shape.length + 1` elements.\n */\n readonly set: (...indicesAndValue: ReadonlyArray) => string;\n\n /**\n * WGSL code for a statement for setting data at the given indices variable.\n *\n * @param varIndices - a variable name for the indices.\n * @param value - the value to set. should be a WGSL expression.\n */\n readonly setByIndices: (varIndices: string, value: string) => string;\n\n /**\n * WGSL code for a statement for setting data at the given offset.\n *\n * @param offset - a number or a string (WGSL `u32` expression) representing the offset.\n * @param value - the value to set. should be a WGSL expression.\n */\n readonly setByOffset: (offset: number|string, value: string) => string;\n\n /**\n * WGSL code for an expression for getting data at the given indices.\n *\n * @param indices - an array of numbers or strings (WGSL `u32` expression) representing the indices.\n */\n readonly get: (...indices: ReadonlyArray) => string;\n\n /**\n * WGSL code for an expression for getting data at the given indices variable.\n *\n * @param varIndices - a variable name for the indices.\n */\n readonly getByIndices: (varIndices: string) => string;\n\n /**\n * WGSL code for an expression for getting data at the given offset.\n *\n * @param offset - a number or a string (WGSL `u32` expression) representing the offset.\n */\n readonly getByOffset: (offset: number|string) => string;\n\n /**\n * name of the data variable\n */\n readonly name: string;\n\n /**\n * whether the helper is for an input, an output or an internal variable.\n */\n readonly usage: 'input'|'output'|'internal';\n\n /**\n * the rank of the input or output.\n */\n readonly rank: number;\n\n /**\n * a string representing the variable name for the shape of the input or output.\n */\n readonly shape: string;\n\n /**\n * a string representing the variable name for the strides of the input or output.\n */\n readonly strides: string;\n}\n\nconst getWgslMappedType = (type: number, components: 1|2|3|4): string|[string, string] => {\n if (components === 3) {\n throw new Error('vec3 has same alignment as vec4, use vec4 instead');\n }\n\n // return type is [ storage type, runtime type ] or a single string for both\n switch (type) {\n case DataType.float16:\n return components > 1 ? `vec${components}` : 'f16';\n case DataType.float:\n return components > 1 ? `vec${components}` : 'f32';\n case DataType.int32:\n return components > 1 ? `vec${components}` : 'i32';\n case DataType.uint32:\n return components > 1 ? `vec${components}` : 'u32';\n case DataType.int64:\n if (components > 1) {\n throw new Error('currently not supported vecX of uint64 yet');\n }\n return ['vec2', 'i32'];\n case DataType.uint64:\n if (components > 1) {\n throw new Error('currently not supported vecX of uint64 yet');\n }\n return ['vec2', 'u32'];\n case DataType.bool:\n if (components !== 4) {\n throw new Error('bool must be vec4');\n }\n return ['u32', 'vec4'];\n\n default:\n throw new Error(`Unknown data type: ${type}`);\n }\n};\n\nexport const tensorTypeToWsglStorageType = (type: DataType, components: 1|2|3|4 = 1) => {\n const mappedType = getWgslMappedType(type, components);\n return typeof mappedType === 'string' ? mappedType : mappedType[0];\n};\n\nexport const tensorTypeToWsglValueType = (type: DataType, components: 1|2|3|4 = 1) => {\n const mappedType = getWgslMappedType(type, components);\n return typeof mappedType === 'string' ? mappedType : mappedType[1];\n};\n\nexport const createTensorShapeVariables = (...dims: ReadonlyArray): ProgramUniform[] => {\n const programUniforms: ProgramUniform[] = [];\n dims.forEach(dim => {\n if (dim.length !== 0) {\n programUniforms.push(\n {type: DataType.uint32, data: dim}, {type: DataType.uint32, data: ShapeUtil.computeStrides(dim)});\n }\n });\n return programUniforms;\n};\n\n/**\n * A helper function to get maximum vector size for specified data length\n * @param size\n */\nexport const getMaxComponents = (size: number) => {\n // we cannot use vec3 type since it has alignment of 16 bytes\n if (size % 4 === 0) {\n return 4;\n } else if (size % 2 === 0) {\n return 2;\n }\n\n return 1;\n};\n\n/**\n * A helper function that initializes variable as a scalar or vector. e.g. f32(0) or vec4f(0,0,0,0)\n * @param dataType\n * @param components\n * @param value\n */\nexport const fillVector = (dataType = 'f32', components?: number, value = '0') => {\n if (!components || components === 1) {\n return `${dataType}(${value})`;\n }\n\n return `vec${components}<${dataType}>(${value})`;\n};\n\n/**\n * A helper function that casts value or vector to f32\n * @param dataType\n * @param components\n * @param value\n */\nexport const castToF32 = (dataType: string, components: number, value: string) => {\n if (dataType === 'f32') {\n return value;\n }\n if (components === 1) {\n return `f32(${value})`;\n }\n\n return `vec${components}(${value})`;\n};\n\n/**\n * A helper function that returns scalar or sums all components of a vector\n * @param name\n * @param components\n */\nexport const sumVector = (name: string, components: number) => {\n if (components === 4) {\n return `(${name}.x + ${name}.y + ${name}.z + ${name}.w)`;\n } else if (components === 2) {\n return `(${name}.x + ${name}.y)`;\n } else if (components === 3) {\n return `(${name}.x + ${name}.y + ${name}.z)`;\n }\n\n return name;\n};\n\n/**\n * A helper function that returns variable element at index.\n * @param name - the name of variable.\n * @param index - the index of variable element.\n * @param length - the length of variable.\n * @param type - the type of variable, optional.\n */\nexport const getElementAt =\n (name: string, index: number|string, length: number, type?: UniformDataElementType): string => {\n if (name.startsWith('uniforms.') && length > 4) {\n if (typeof (index) === 'string') {\n if (type === 'f16') {\n return `${name}[(${index}) / 8][(${index}) % 8 / 4][(${index}) % 8 % 4]`;\n } else {\n return `${name}[(${index}) / 4][(${index}) % 4]`;\n }\n } else {\n if (type === 'f16') {\n return `${name}[${Math.floor(index / 8)}][${Math.floor(index % 8 / 4)}][${index % 8 % 4}]`;\n } else {\n return `${name}[${Math.floor(index / 4)}][${index % 4}]`;\n }\n }\n } else {\n return length > 1 ? `${name}[${index}]` : name;\n }\n };\n\n/**\n * A helper function to get a IndicesHelper for a given input or output.\n *\n * @param name - the name of the input or output.\n * @param tensorType - the tensor type of the input or output.\n * @param shapeOrRank - the tensor shape or the rank of the input or output.\n * @param usage - the usage of the indices helper.\n * @param components - indicates the number of components of each element. 1 for scalar, 2 for vec2, 3 for vec3, 4 for\n * vec4.\n */\nconst createIndicesHelper =\n (name: string, tensorType: number, shapeOrRank: number|readonly number[], usage: IndicesHelper['usage'],\n components: 1|2|3|4): IndicesHelper => {\n const useUniform = typeof shapeOrRank === 'number';\n const rank = useUniform ? shapeOrRank : shapeOrRank.length;\n const rankIdentity = [...new Array(rank).keys()];\n const indicesType = rank < 2 ? 'u32' : rank <= 4 ? `vec${rank}` : `array`;\n const mappedType = getWgslMappedType(tensorType, components);\n const valueType = typeof mappedType === 'string' ? mappedType : mappedType[1];\n const storageType = typeof mappedType === 'string' ? mappedType : mappedType[0];\n const type = {indices: indicesType, value: valueType, storage: storageType, tensor: tensorType};\n\n const normalizeDim = (dim: number|string): string => typeof dim === 'string' ? dim : `${dim}u`;\n\n const implementationUsed = {\n offsetToIndices: false,\n indicesToOffset: false,\n broadcastedIndicesToOffset: false,\n set: false,\n setByIndices: false,\n get: false,\n getByIndices: false,\n };\n\n const uniformPrefix = useUniform ? 'uniforms.' : '';\n const shape = `${uniformPrefix}${name}_shape`;\n const strides = `${uniformPrefix}${name}_strides`;\n\n let o2iSnippet = '';\n for (let i = 0; i < rank - 1; i++) {\n o2iSnippet += `\n let dim${i} = current / ${getElementAt(strides, i, rank)};\n let rest${i} = current % ${getElementAt(strides, i, rank)};\n indices[${i}] = dim${i};\n current = rest${i};\n `;\n }\n o2iSnippet += `indices[${rank - 1}] = current;`;\n\n const offsetToIndicesImplementation = rank < 2 ? '' : `\n fn o2i_${name}(offset: u32) -> ${type.indices} {\n var indices: ${type.indices};\n var current = offset;\n ${o2iSnippet}\n return indices;\n }`;\n\n const offsetToIndices = (varOffset: string) => {\n implementationUsed.offsetToIndices = true;\n return rank < 2 ? varOffset : `o2i_${name}(${varOffset})`;\n };\n\n const offsets: string[] = [];\n if (rank >= 2) {\n for (let i = rank - 1; i >= 0; i--) {\n offsets.push(`${getElementAt(strides, i, rank)} * (indices[${i}])`);\n }\n }\n\n const indicesToOffsetImplementation = rank < 2 ? '' : `\n fn i2o_${name}(indices: ${type.indices}) -> u32 {\n return ${offsets.join('+')};\n }`;\n\n const indicesToOffset = (varIndices: string) => {\n implementationUsed.indicesToOffset = true;\n return rank < 2 ? varIndices : `i2o_${name}(${varIndices})`;\n };\n\n const indices = (...init: ReadonlyArray) =>\n rank === 0 ? '0u' : `${type.indices}(${init.map(normalizeDim).join(',')})`;\n\n const indicesGet = (varIndices: string, idx: number|string) => {\n if (rank < 2) {\n return `${varIndices}`;\n } else {\n return `${getElementAt(varIndices, idx, rank)}`;\n }\n };\n\n const indicesSet = (varIndices: string, idx: number|string, value: string) => {\n if (rank < 2) {\n return `${varIndices}=${value};`;\n } else {\n return `${getElementAt(varIndices, idx, rank)}=${value};`;\n }\n };\n\n const broadcastedIndicesToOffsetImplementation: {[key: string]: string} = {};\n const broadcastedIndicesToOffset = (varIndices: string, output: IndicesHelper) => {\n implementationUsed.broadcastedIndicesToOffset = true;\n const implKey = `${output.name}broadcastedIndicesTo${name}Offset`;\n if (implKey in broadcastedIndicesToOffsetImplementation) {\n return `${implKey}(${varIndices})`;\n }\n const offsets = [];\n for (let i = rank - 1; i >= 0; i--) {\n const idx = output.indicesGet('outputIndices', i + output.rank - rank);\n offsets.push(`${indicesGet(strides, i)} * (${idx} % ${indicesGet(shape, i)})`);\n }\n broadcastedIndicesToOffsetImplementation[implKey] =\n `fn ${implKey}(outputIndices: ${output.type.indices}) -> u32 {\n return ${offsets.length > 0 ? offsets.join('+') : '0u'};\n }`;\n\n return `${implKey}(${varIndices})`;\n };\n\n const setByOffset = (offset: number|string, value: string) => (() => {\n if (type.storage === type.value) {\n return `${name}[${offset}]=${value};`;\n } else if (type.storage === 'vec2' && type.value === 'i32') {\n // int64, components === 1\n return `${name}[${offset}]=vec2(u32(${value}), select(0u, 0xFFFFFFFFu, ${value} < 0));`;\n } else if (type.storage === 'vec2' && type.value === 'u32') {\n // uint64, components === 1\n return `${name}[${offset}]=vec2(u32(${value}), 0u);`;\n } else if (type.storage === 'u32' && type.value === 'vec4') {\n // bool, components === 4\n return `${name}[${offset}]=dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(${value}));`;\n } else {\n throw new Error(`not supported combination of storage type ${type.storage} and value type ${type.value} yet`);\n }\n })();\n\n const getByOffset = (offset: number|string) => (() => {\n if (type.storage === type.value) {\n return `${name}[${offset}]`;\n } else if (type.storage === 'vec2' && type.value === 'i32') {\n // int64, components === 1\n return `i32(${name}[${offset}].x)`;\n } else if (type.storage === 'vec2' && type.value === 'u32') {\n // uint64, components === 1\n return `u32(${name}[${offset}].x)`;\n } else if (type.storage === 'u32' && type.value === 'vec4') {\n // bool, components === 4\n return `vec4(bool(${name}[${offset}] & 0xFFu), bool(${name}[${offset}] & 0xFF00u), bool(${name}[${\n offset}] & 0xFF0000u), bool(${name}[${offset}] & 0xFF000000u))`;\n } else {\n throw new Error(`not supported combination of storage type ${type.storage} and value type ${type.value} yet`);\n }\n })();\n\n const getByIndicesImplementation = rank < 2 ? '' : `\n fn get_${name}ByIndices(indices: ${type.indices}) -> ${valueType} {\n return ${getByOffset(`i2o_${name}(indices)`)};\n }`;\n\n const getImplementation = rank < 2 ? '' : (() => {\n const functionParams = rankIdentity.map(i => `d${i}: u32`).join(', ');\n const dimsParams = rankIdentity.map(i => `d${i}`).join(', ');\n return `\n fn get_${name}(${functionParams}) -> ${valueType} {\n return get_${name}ByIndices(${indices(dimsParams)});\n }`;\n })();\n\n const get = (...indices: ReadonlyArray) => {\n if (indices.length !== rank) {\n throw new Error(`indices length must be ${rank}`);\n }\n\n const normalizedIndices = indices.map(normalizeDim).join(',');\n\n if (rank === 0) {\n return getByOffset('0u');\n } else if (rank === 1) {\n return getByOffset(normalizedIndices[0]);\n } else {\n implementationUsed.get = true;\n implementationUsed.getByIndices = true;\n implementationUsed.indicesToOffset = true;\n return `get_${name}(${normalizedIndices})`;\n }\n };\n\n const getByIndices = (varIndices: string) => {\n if (rank < 2) {\n return getByOffset(varIndices);\n } else {\n implementationUsed.getByIndices = true;\n implementationUsed.indicesToOffset = true;\n return `get_${name}ByIndices(${varIndices})`;\n }\n };\n\n const setByIndicesImplementation = rank < 2 ? '' : `\n fn set_${name}ByIndices(indices: ${type.indices}, value: ${valueType}) {\n ${setByOffset(`i2o_${name}(indices)`, 'value')}\n }`;\n\n const setImplementation = rank < 2 ? '' : (() => {\n const functionParams = rankIdentity.map(i => `d${i}: u32`).join(', ');\n const dimsParams = rankIdentity.map(i => `d${i}`).join(', ');\n return `\n fn set_${name}(${functionParams}, value: ${valueType}) {\n set_${name}ByIndices(${indices(dimsParams)}, value);\n }`;\n })();\n\n const set = (...indicesAndValue: ReadonlyArray) => {\n if (indicesAndValue.length !== rank + 1) {\n throw new Error(`indices length must be ${rank}`);\n }\n const value = indicesAndValue[rank];\n if (typeof value !== 'string') {\n throw new Error('value must be string');\n }\n\n const normalizedIndices = indicesAndValue.slice(0, rank).map(normalizeDim).join(',');\n\n if (rank === 0) {\n return setByOffset('0u', value);\n } else if (rank === 1) {\n return setByOffset(normalizedIndices[0], value);\n } else {\n implementationUsed.set = true;\n implementationUsed.setByIndices = true;\n implementationUsed.indicesToOffset = true;\n return `set_${name}(${normalizedIndices}, ${value})`;\n }\n };\n\n const setByIndices = (varIndices: string, value: string) => {\n if (rank < 2) {\n return setByOffset(varIndices, value);\n } else {\n implementationUsed.setByIndices = true;\n implementationUsed.indicesToOffset = true;\n return `set_${name}ByIndices(${varIndices}, ${value});`;\n }\n };\n\n const impl = () => {\n const impls = [];\n let needShapeStrides = false;\n if (implementationUsed.offsetToIndices) {\n impls.push(offsetToIndicesImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.indicesToOffset) {\n impls.push(indicesToOffsetImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.broadcastedIndicesToOffset) {\n Object.values(broadcastedIndicesToOffsetImplementation).forEach(impl => impls.push(impl));\n needShapeStrides = true;\n }\n if (implementationUsed.set) {\n impls.push(setImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.setByIndices) {\n impls.push(setByIndicesImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.get) {\n impls.push(getImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.getByIndices) {\n impls.push(getByIndicesImplementation);\n needShapeStrides = true;\n }\n if (!useUniform && needShapeStrides) {\n impls.unshift(\n `const ${shape} = ${type.indices}(${shapeOrRank.join(',')});`,\n `const ${strides} = ${type.indices}(${ShapeUtil.computeStrides(shapeOrRank).join(',')});`);\n }\n return impls.join('\\n');\n };\n\n return {\n impl,\n type,\n offsetToIndices,\n indicesToOffset,\n broadcastedIndicesToOffset,\n indices,\n indicesGet,\n indicesSet,\n set,\n setByOffset,\n setByIndices,\n get,\n getByOffset,\n getByIndices,\n // isVec4,\n usage,\n name,\n strides,\n shape,\n rank\n };\n };\n\n/**\n * Create a IndicesHelper for an input.\n *\n * @param name - the name of the input.\n * @param type - the tensor type of the input.\n * @param shapeOrRank - the tensor shape or the rank of the input.\n * @param components - the number of components of the input. available values are 1, 2, 3, 4. default is 1.\n * @returns an IndicesHelper for the input.\n */\nexport const inputVariable =\n (name: string, type: number, shapeOrRank: number|readonly number[], components: 1|2|3|4 = 1): IndicesHelper =>\n createIndicesHelper(name, type, shapeOrRank, 'input', components);\n\n/**\n * Create a IndicesHelper for an output.\n *\n * @param name - the name of the output.\n * @param type - the tensor type of the output.\n * @param shapeOrRank - the tensor shape or the rank of the output.\n * @param components - the number of components of the output. available values are 1, 2, 3, 4. default is 1.\n * @returns an IndicesHelper for the output.\n */\nexport const outputVariable =\n (name: string, type: number, shapeOrRank: number|readonly number[], components: 1|2|3|4 = 1): IndicesHelper =>\n createIndicesHelper(name, type, shapeOrRank, 'output', components);\n\n/**\n * Create a IndicesHelper for an internal variable.\n *\n * @param name - the name of the variable.\n * @param type - the tensor type of the variable.\n * @param shapeOrRank - the tensor shape or the rank of the variable.\n * @param components - the number of components of the variable. available values are 1, 2, 3, 4. default is 1.\n * @returns an IndicesHelper for the variable.\n */\nexport const internalVariable =\n (name: string, type: number, shapeOrRank: number|readonly number[], components: 1|2|3|4 = 1): IndicesHelper =>\n createIndicesHelper(name, type, shapeOrRank, 'internal', components);\n\nexport type UniformDataElementType = 'u32'|'f16'|'f32'|'i32';\nexport type UniformsArrayType = Array<{name: string; type: UniformDataElementType; length?: number}>;\n\n/**\n * A ShaderHelper is a helper class for generating WGSL code.\n */\nexport interface ShaderHelper {\n /**\n * A helper function to generate the start of main function in WGSL source code.\n *\n * @example\n * const getShaderSource = (shaderHelper: ShaderHelper) => `\n * ...\n *\n * ${shaderHelper.mainStart()}\n * // your code here inside main() function\n * ...\n * }\n * `;\n *\n * @param workgroupSize - an optional workgroup size. default is WORKGROUP_SIZE.\n */\n mainStart(workgroupSize?: number|[number, number, number]): string;\n\n /**\n * A helper function to generate the code snippet for guarding against out-of-bounds size.\n *\n * @example\n * const getShaderSource = (shaderHelper: ShaderHelper) => `\n * ...\n *\n * ${shaderHelper.mainStart()}\n * ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes(outputSize)}\n *\n * // your code here inside main() function\n * ...\n * }\n * `;\n *\n * @param size - the size of the data to guard against. can be a number or a string (WGSL `u32` expression).\n */\n guardAgainstOutOfBoundsWorkgroupSizes(size: unknown): string;\n\n /**\n * A helper function to generate the code snippet for declaring multiple inputs or outputs.\n *\n * @param variables - an array of IndicesHelper for the variables.\n */\n declareVariables(...variables: IndicesHelper[]): string;\n\n /**\n * A helper function to register one uniform. Can be called multiple times to register multiple uniforms.\n *\n * @param name - the name of the uniform.\n * @param type - the type of the uniform.\n * @param length - the length of the uniform, default to 1 when it is not provided.\n */\n registerUniform(name: string, type: string, length?: number): ShaderHelper;\n\n /**\n * A helper function to register multiple uniforms. Can be called multiple times to register multiple uniforms.\n *\n * @param uniforms - an array of uniforms. Each element of the array is an object with 2 properties: `name` and\n * `type`.\n */\n registerUniforms(uniforms: UniformsArrayType): ShaderHelper;\n\n /**\n * A helper function to register multiple internal variables. Can be called multiple times to register multiple\n * internal variables.\n *\n * @param variables - an array of IndicesHelper for the variables.\n */\n registerInternalVariables(...variables: IndicesHelper[]): ShaderHelper;\n}\n\nclass ShaderHelperImpl implements ShaderHelper {\n constructor(private normalizedDispatchGroup: [number, number, number], private limits: GPUSupportedLimits) {}\n\n guardAgainstOutOfBoundsWorkgroupSizes(size: number|string): string {\n // Guard against out-of-bounds work group sizes\n const sizeInCode = typeof size === 'number' ? `${size}u` : size;\n return `if (global_idx >= ${sizeInCode}) { return; }`;\n }\n\n mainStart(workgroupSize: number|[number, number, number] = WORKGROUP_SIZE) {\n const workgroupSizeX = typeof workgroupSize === 'number' ? workgroupSize : workgroupSize[0];\n const workgroupSizeY = typeof workgroupSize === 'number' ? 1 : workgroupSize[1];\n const workgroupSizeZ = typeof workgroupSize === 'number' ? 1 : workgroupSize[2];\n\n if (workgroupSizeX > this.limits.maxComputeWorkgroupSizeX ||\n workgroupSizeY > this.limits.maxComputeWorkgroupSizeY ||\n workgroupSizeZ > this.limits.maxComputeWorkgroupSizeZ) {\n throw new Error(`workgroup size [${workgroupSizeX}, ${workgroupSizeY}, ${\n workgroupSizeZ}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${\n this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);\n }\n\n if (workgroupSizeX * workgroupSizeY * workgroupSizeZ > this.limits.maxComputeInvocationsPerWorkgroup) {\n throw new Error(`workgroup size [${workgroupSizeX}, ${workgroupSizeY}, ${\n workgroupSizeZ}] exceeds the maximum workgroup invocations ${\n this.limits.maxComputeInvocationsPerWorkgroup}.`);\n }\n\n const is1DimensionDispatch = this.normalizedDispatchGroup[1] === 1 && this.normalizedDispatchGroup[2] === 1;\n const paramList = is1DimensionDispatch ? `@builtin(global_invocation_id) global_id : vec3,\n @builtin(workgroup_id) workgroup_id : vec3,\n @builtin(local_invocation_id) local_id : vec3` :\n `@builtin(global_invocation_id) global_id : vec3,\n @builtin(local_invocation_id) local_id : vec3,\n @builtin(local_invocation_index) local_idx : u32,\n @builtin(workgroup_id) workgroup_id : vec3,\n @builtin(num_workgroups) num_workgroups : vec3`;\n const globalIdxDefinition = is1DimensionDispatch ?\n 'let global_idx = global_id.x; let local_idx = local_id.x;' :\n `let global_idx = (workgroup_id.z * num_workgroups[0] * num_workgroups[1] +\n workgroup_id.y * num_workgroups[0] + workgroup_id.x) * ${\n workgroupSizeX * workgroupSizeY * workgroupSizeZ}u + local_idx;`;\n\n return `@compute @workgroup_size(${workgroupSizeX}, ${workgroupSizeY}, ${workgroupSizeZ})\n fn main(${paramList}) {\n ${globalIdxDefinition}\n `;\n }\n\n private appendVariableUniforms(variable: IndicesHelper): void {\n if (variable.rank !== 0) {\n if (variable.shape.startsWith('uniforms.')) {\n this.uniforms.push({name: variable.shape.replace('uniforms.', ''), type: 'u32', length: variable.rank});\n }\n if (variable.strides.startsWith('uniforms.')) {\n this.uniforms.push({name: variable.strides.replace('uniforms.', ''), type: 'u32', length: variable.rank});\n }\n }\n }\n\n private declareVariable(variable: IndicesHelper, bindingIndex: number): string {\n if (variable.usage === 'internal') {\n throw new Error('cannot use internal variable with declareVariable(). use registerInternalVariables() instead.');\n }\n this.variables.push(variable);\n this.appendVariableUniforms(variable);\n\n const access = variable.usage === 'input' ? 'read' : 'read_write';\n const storageType = variable.type.storage;\n return `@group(0) @binding(${bindingIndex}) var ${variable.name}: array<${storageType}>;`;\n }\n\n declareVariables(...variables: IndicesHelper[]): string {\n return variables.map(v => this.declareVariable(v, this.variableIndex++)).join('\\n');\n }\n\n private registerInternalVariable(variable: IndicesHelper): void {\n if (variable.usage !== 'internal') {\n throw new Error(\n 'cannot use input or output variable with registerInternalVariable(). use declareVariables() instead.');\n }\n\n this.internalVariables.push(variable);\n this.appendVariableUniforms(variable);\n }\n\n registerInternalVariables(...variables: IndicesHelper[]): ShaderHelper {\n variables.forEach(v => this.registerInternalVariable(v));\n return this;\n }\n\n registerUniform(name: string, type: UniformDataElementType, length = 1): ShaderHelper {\n this.uniforms.push({name, type, length});\n return this;\n }\n\n registerUniforms(additionalUniforms: UniformsArrayType): ShaderHelper {\n this.uniforms = this.uniforms.concat(additionalUniforms);\n return this;\n }\n\n private internalVariables: IndicesHelper[] = [];\n private variables: IndicesHelper[] = [];\n private uniforms: UniformsArrayType = [];\n private uniformDeclaration(): string {\n if (this.uniforms.length === 0) {\n return '';\n }\n\n const uniformSnippets: string[] = [];\n for (const {name, type, length} of this.uniforms) {\n if (length && length > 4) {\n if (type === 'f16') {\n uniformSnippets.push(`@align(16) ${name}:array, ${Math.ceil(length / 8)}>`);\n } else {\n uniformSnippets.push(`${name}:array, ${Math.ceil(length / 4)}>`);\n }\n } else {\n const typeTemp = length == null || length === 1 ? type : `vec${length}<${type}>`;\n uniformSnippets.push(`${name}:${typeTemp}`);\n }\n }\n\n return `\n struct Uniforms { ${uniformSnippets.join(', ')} };\n @group(0) @binding(${this.variableIndex}) var uniforms: Uniforms;`;\n }\n private variableIndex = 0;\n\n /**\n * Get additional implementation that needs to be added to the shader source.\n */\n get additionalImplementations(): string {\n return this.uniformDeclaration() + this.variables.map(i => i.impl()).join('\\n') +\n this.internalVariables.map(i => i.impl()).join('\\n');\n }\n\n /**\n * Get the variable info of the shader program.\n */\n get variablesInfo(): ProgramUniformVariableInfo[]|undefined {\n if (this.uniforms.length === 0) {\n return undefined;\n }\n\n const uniformWgslTypeToDataType = (type: UniformDataElementType) =>\n ([DataType.uint32, DataType.float16, DataType.float,\n DataType.int32][['u32', 'f16', 'f32', 'i32'].indexOf(type)]);\n return this.uniforms.map(u => ([uniformWgslTypeToDataType(u.type), u.length ?? 1]));\n }\n}\n\nexport const createShaderHelper = (dispatchGroup: [number, number, number], limits: GPUSupportedLimits) =>\n new ShaderHelperImpl(dispatchGroup, limits);\n\n/**\n * This function comes from https://github.com/tensorflow/tfjs/blob/master/tfjs-core/src/ops/broadcast_util.ts#L18-L40\n * Returns the dimensions in the input shape that are broadcasted to\n * produce the provided output shape.\n *\n * The returned dimensions are 0-indexed and sorted. An example:\n * inShape = [4, 1, 3]\n * outShape = [5, 4, 3, 3]\n * result = [1]. Dimension 1 (2nd dimension of input) gets broadcasted 1 => 3.\n */\nexport const getBroadcastDims = (inShape: readonly number[], outShape: readonly number[]): number[] => {\n const inRank = inShape.length;\n const dims: number[] = [];\n for (let i = 0; i < inRank; i++) {\n const dim = inRank - 1 - i;\n const a = inShape[dim] || 1;\n const b = outShape[outShape.length - 1 - i] || 1;\n if (b > 1 && a === 1) {\n dims.unshift(dim);\n }\n }\n return dims;\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface TransposeAttributes extends AttributeWithCacheKey {\n readonly perm: number[];\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Transpose requires 1 input.');\n }\n};\n\nconst getAdjustedPerm = (inputRank: number, perm: number[]): number[] =>\n (perm && perm.length !== inputRank) ? [...(new Array(inputRank).keys())].reverse() : perm;\n\nconst getOutputShape = (inputShape: readonly number[], perm: number[]): readonly number[] =>\n ShapeUtil.sortBasedOnPerm(inputShape, getAdjustedPerm(inputShape.length, perm));\n\nconst permFunctionBody = (perm: number[], rank: number, input: IndicesHelper, output: IndicesHelper): string => {\n const reverseFunc = [];\n reverseFunc.push(`fn perm(i: ${output.type.indices}) -> ${input.type.indices} {\n var a: ${input.type.indices};`);\n for (let i = 0; i < rank; ++i) {\n reverseFunc.push(input.indicesSet('a', perm[i], `i[${i}]`));\n }\n reverseFunc.push('return a;}');\n return reverseFunc.join('\\n');\n};\n\nexport const createTransposeProgramInfo = (inputTensor: TensorView, permAttr: number[]): ProgramInfo => {\n const inputDataType = inputTensor.dataType;\n const inputRank = inputTensor.dims.length;\n const perm = getAdjustedPerm(inputRank, permAttr);\n const outputShape = getOutputShape(inputTensor.dims, perm);\n const output = outputVariable('output', inputDataType, outputShape.length);\n const input = inputVariable('a', inputDataType, inputRank);\n let getShaderSource;\n if (perm.length === 2 && perm[0] === 1 && perm[1] === 0) {\n const wgslType = output.type.value;\n const workgroupSize: [number, number, number] = [16, 16, 1];\n getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(input, output)}\n var tile : array, ${workgroupSize[0]}>;\n ${shaderHelper.mainStart(workgroupSize)}\n var x = workgroup_id.x * ${workgroupSize[0]}u + local_id.x;\n var y = workgroup_id.y * ${workgroupSize[0]}u + local_id.y;\n let width = uniforms.output_shape[0];\n let height = uniforms.output_shape[1];\n if (x < width && y < height) {\n tile[local_id.y][local_id.x] = ${input.getByOffset('y * width + x')};\n }\n workgroupBarrier();\n x = workgroup_id.y * ${workgroupSize[0]}u + local_id.x;\n y = workgroup_id.x * ${workgroupSize[0]}u + local_id.y;\n if (x < height && y < width) {\n ${output.setByOffset('y * height + x', 'tile[local_id.x][local_id.y]')}\n }\n }`;\n } else {\n getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(input, output)}\n\n ${permFunctionBody(perm, inputRank, input, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let indices = ${output.offsetToIndices('global_idx')};\n let aIndices = perm(indices);\n\n ${output.setByOffset('global_idx', input.getByIndices('aIndices'))}\n }`;\n }\n return {\n name: 'Transpose',\n shaderCache: {hint: `${permAttr}`, inputDependencies: ['rank']},\n getRunData: (inputs) => {\n const outputSize = ShapeUtil.size(outputShape);\n return {\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms:\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(inputs[0].dims, outputShape)],\n };\n },\n getShaderSource,\n };\n};\n\nexport const transpose = (context: ComputeContext, attributes: TransposeAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createTransposeProgramInfo(context.inputs[0], attributes.perm));\n};\n\nexport const parseTransposeAttributes = (attributes: Record): TransposeAttributes =>\n createAttributeWithCacheKey({perm: attributes.perm as number[]});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramShaderCacheInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper} from './common';\nimport {createReduceAttributesFromInputs, ReduceAttributes} from './reduce';\nimport {createTransposeProgramInfo} from './transpose';\n\nconst reduceOps: {[key: string]: string} = {\n max: 'select(bestValue, candidate, candidate > bestValue)',\n min: 'select(bestValue, candidate, candidate < bestValue)',\n mean: 'bestValue + candidate',\n sum: 'bestValue + candidate',\n prod: 'bestValue * candidate',\n sumSquare: 'bestValue + candidate * candidate',\n logSumExp: 'bestValue + exp(candidate)',\n l1: 'bestValue + abs(candidate)',\n l2: 'bestValue + candidate * candidate',\n logSum: 'bestValue + candidate'\n};\n\nconst reduceSharedOps: {[key: string]: string} = {\n max: 'select(bestValue, candidate, candidate > bestValue)',\n min: 'select(bestValue, candidate, candidate < bestValue)',\n mean: 'bestValue + candidate',\n sum: 'bestValue + candidate',\n prod: 'bestValue * candidate',\n sumSquare: 'bestValue + candidate',\n logSumExp: 'bestValue + candidate',\n l1: 'bestValue + candidate',\n l2: 'bestValue + candidate',\n logSum: 'bestValue + candidate'\n};\n\nconst reduceInitValues: {[key: string]: string} = {\n max: '_A[offset]',\n min: '_A[offset]',\n mean: '0',\n sum: '0',\n prod: '1',\n sumSquare: '0',\n logSumExp: '0',\n l1: '0',\n l2: '0',\n logSum: '0'\n};\n\nconst reduceOutputValues: {[key: string]: string} = {\n max: 'bestValue',\n min: 'bestValue',\n sum: 'bestValue',\n prod: 'bestValue',\n sumSquare: 'bestValue',\n logSumExp: 'log(bestValue)',\n l1: 'bestValue',\n l2: 'sqrt(bestValue)',\n logSum: 'log(bestValue)'\n};\n\nconst getInnerMostAxes = (numInnerAxes: number, rank: number): number[] => {\n const res = [];\n for (let i = rank - numInnerAxes; i < rank; ++i) {\n res.push(i);\n }\n return res;\n};\n\nconst computeOutAndReduceShapes = (shape: readonly number[], axes: readonly number[]): [number[], number[]] => {\n const outputShape = [];\n const rank = shape.length;\n for (let dim = 0; dim < rank; dim++) {\n if (axes.indexOf(dim) === -1) {\n outputShape.push(shape[dim]);\n }\n }\n const reduceShape = axes.map(dim => shape[dim]);\n return [outputShape, reduceShape];\n};\n\nconst expandShapeToKeepDim = (shape: number[], axes: number[]): number[] => {\n const rank = shape.length + axes.length;\n const expandShape = [];\n let shapeIdx = 0;\n for (let dim = 0; dim < rank; dim++) {\n if (axes.indexOf(dim) === -1) {\n expandShape.push(shape[shapeIdx++]);\n } else {\n expandShape.push(1);\n }\n }\n return expandShape;\n};\n\nconst areAxesInnerMostDims = (axes: number[], rank: number): boolean => {\n for (let i = 0; i < axes.length; ++i) {\n if (axes[axes.length - i - 1] !== rank - 1 - i) {\n return false;\n }\n }\n return true;\n};\n\nconst getAxesPermutation = (axes: number[], rank: number): number[] => {\n const res = [];\n if (!areAxesInnerMostDims(axes, rank)) {\n for (let i = 0; i < rank; ++i) {\n if (axes.indexOf(i) === -1) {\n res.push(i);\n }\n }\n axes.forEach(axis => res.push(axis));\n }\n return res;\n};\n\nexport const createReduceSharedProgramInfo =\n (name: string, shaderCache: ProgramShaderCacheInfo, inputs: readonly TensorView[], reduceType: string,\n outputDataType: DataType, outputShape: number[], reduceShape: number[]): ProgramInfo => {\n const inputShape = inputs[0].dims;\n\n const outputSize = ShapeUtil.size(outputShape);\n const reduceSize = ShapeUtil.size(reduceShape);\n\n const input = inputVariable('_A', inputs[0].dataType, inputShape);\n const output = outputVariable('output', outputDataType, outputShape);\n\n const workgroupSize = 32;\n\n const sharedMemorySnippet = `\n var aBestValues : array;\n `;\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniform('reduceSize', 'u32').declareVariables(input, output)}\n ${sharedMemorySnippet}\n fn DIV_CEIL(a : u32, b : u32) -> u32 {\n return ((a - 1u) / b + 1u);\n }\n ${shaderHelper.mainStart(workgroupSize)}\n\n let outputIndex = global_idx / ${workgroupSize};\n let offset = outputIndex * uniforms.reduceSize;\n\n var bestValue = f32(${reduceInitValues[reduceType]});\n let Length = uniforms.reduceSize;\n for (var k = local_idx; k < Length; k = k + ${workgroupSize}) {\n let candidate = f32(${input.getByOffset('offset + k')});\n bestValue = ${reduceOps[reduceType]};\n }\n aBestValues[local_idx] = bestValue;\n workgroupBarrier();\n\n var reduceSize = min(Length, ${workgroupSize}u);\n for (var currentSize = reduceSize / 2u; reduceSize > 1u;\n currentSize = reduceSize / 2u) {\n let interval = DIV_CEIL(reduceSize, 2u);\n if (local_idx < currentSize) {\n let candidate = aBestValues[local_idx + interval];\n bestValue = ${reduceSharedOps[reduceType]};\n aBestValues[local_idx] = bestValue;\n }\n reduceSize = interval;\n workgroupBarrier();\n }\n\n if (local_idx == 0u) {\n ${\n output.setByOffset(\n 'outputIndex',\n `${\n reduceType === 'mean' ? `${output.type.storage}(bestValue / f32(uniforms.reduceSize))` :\n `${output.type.storage}(${reduceOutputValues[reduceType]})`}`)};\n }\n }`;\n\n // One work group is responsible for only one element of output.\n return {\n name,\n shaderCache,\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: outputDataType}],\n dispatchGroup: {x: outputSize},\n programUniforms: [{type: DataType.uint32, data: reduceSize}]\n }),\n };\n };\n\nconst reduceCommon =\n (context: ComputeContext, name: string, attributes: ReduceAttributes,\n reduceType: 'sum'|'sumSquare'|'prod'|'min'|'max'|'mean'|'logSumExp'|'l1'|'l2'|'logSum'): void => {\n const updatedAttributes: ReduceAttributes =\n context.inputs.length === 1 ? attributes : createReduceAttributesFromInputs(context.inputs, attributes);\n\n let updatedAxes = updatedAttributes.axes;\n if (updatedAxes.length === 0 && !updatedAttributes.noopWithEmptyAxes) {\n updatedAxes = context.inputs[0].dims.map((_dim, i) => i);\n }\n const normalizeAxes = ShapeUtil.normalizeAxes(updatedAxes, context.inputs[0].dims.length);\n\n let axes = normalizeAxes;\n let input = context.inputs[0];\n const permutedAxes = getAxesPermutation(axes, context.inputs[0].dims.length);\n if (permutedAxes.length > 0) {\n input = context.compute(\n createTransposeProgramInfo(context.inputs[0], permutedAxes), {inputs: [0], outputs: [-1]})[0];\n axes = getInnerMostAxes(axes.length, input.dims.length);\n }\n\n const [outputShape, reduceShape] = computeOutAndReduceShapes(input.dims, axes);\n let finalOutputShape = outputShape;\n if (updatedAttributes.keepDims) {\n finalOutputShape = expandShapeToKeepDim(outputShape, normalizeAxes);\n }\n\n context.compute(\n createReduceSharedProgramInfo(\n name, {hint: updatedAttributes.cacheKey, inputDependencies: ['type']}, [input], reduceType,\n context.inputs[0].dataType, finalOutputShape, reduceShape),\n {inputs: [input]});\n };\n\nexport const reduceMeanShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceMeanShared', attributes, 'mean');\n};\n\nexport const reduceL1Shared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceL1Shared', attributes, 'l1');\n};\n\nexport const reduceL2Shared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceL2Shared', attributes, 'l2');\n};\n\nexport const reduceLogSumExpShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceLogSumExpShared', attributes, 'logSumExp');\n};\n\nexport const reduceMaxShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceMaxShared', attributes, 'max');\n};\n\nexport const reduceMinShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceMinShared', attributes, 'min');\n};\n\nexport const reduceProdShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceProdShared', attributes, 'prod');\n};\n\nexport const reduceSumShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceSumShared', attributes, 'sum');\n};\n\nexport const reduceSumSquareShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceSumSquareShared', attributes, 'sumSquare');\n};\n\nexport const reduceLogSumShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceLogSumShared', attributes, 'logSum');\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramShaderCacheInfo} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\nimport {reduceL1Shared, reduceL2Shared, reduceLogSumExpShared, reduceLogSumShared, reduceMaxShared, reduceMeanShared, reduceMinShared, reduceProdShared, reduceSumShared, reduceSumSquareShared} from './reduce-shared';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length === 0 || inputs.length > 2) {\n throw new Error('Reduce op requires 1 or 2 inputs.');\n }\n\n if (inputs.length === 2 && inputs[1].dims.length !== 1) {\n throw new Error('Invalid axes input dims.');\n }\n};\n\nexport interface ReduceAttributes extends AttributeWithCacheKey {\n keepDims: boolean;\n noopWithEmptyAxes: boolean;\n axes: number[];\n}\n\nexport type ReduceOp =\n (input: IndicesHelper, output: IndicesHelper,\n axes: readonly number[]) => [string, string, string, string, ...string[]];\n\nconst noOp: ReduceOp = (input) => ['', '', `var value = ${input.getByIndices('input_indices')};`, ''];\nexport const createReduceProgramInfo =\n (name: string, shaderCache: ProgramShaderCacheInfo, inputs: readonly TensorView[], reduceOp: ReduceOp,\n axesInput: number[], outputDataType: DataType, keepDims = false, noopWithEmptyAxes = false): ProgramInfo => {\n const outputShape: number[] = [];\n const inputShape = inputs[0].dims;\n const inputRank = inputShape.length;\n const axes = ShapeUtil.normalizeAxes(axesInput, inputRank);\n const reduceOnAllAxes = !noopWithEmptyAxes && axes.length === 0;\n inputShape.forEach((d, i) => {\n if (reduceOnAllAxes || axes.indexOf(i) >= 0) {\n if (keepDims) {\n outputShape.push(1);\n } // else { // skip this axis}\n } else {\n outputShape.push(d);\n }\n });\n const outputRank = outputShape.length;\n const outputSize = ShapeUtil.size(outputShape);\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const idxCopy: string[] = []; // copy output indexes to input indexes\n\n const input = inputVariable('_A', inputs[0].dataType, inputRank);\n const output = outputVariable('output', outputDataType, outputRank);\n const ops = reduceOp(input, output, axes);\n let reduceOps = ops[2];\n\n for (let k = 0, l = 0; k < inputRank; k++) {\n // if this axis is reduced\n if (reduceOnAllAxes || axes.indexOf(k) >= 0) {\n if (keepDims) {\n l++;\n }\n // loop over the d-th axis\n reduceOps = `for(var j${k}: u32 = 0; j${k} < ${inputShape[k]}; j${k}++) {\n ${ops[2].includes('last_index') ? `let last_index = j${k};` : ''}\n ${input.indicesSet('input_indices', k, `j${k}`)}\n ${reduceOps}\n }`;\n } else {\n idxCopy.push(`${input.indicesSet('input_indices', k, output.indicesGet('output_indices', l))};`);\n l++;\n }\n }\n return `\n\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(input, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n var input_indices: ${input.type.indices};\n let output_indices = ${output.offsetToIndices('global_idx')};\n\n ${idxCopy.join('\\n')}\n ${ops[0]} // init ops for reduce max/min\n ${ops[1]}\n ${reduceOps}\n ${ops[3]}\n ${ops.length === 4 ? output.setByOffset('global_idx', 'value') : ops.slice(4).join('\\n')}\n }`;\n };\n\n return {\n name,\n shaderCache,\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: outputDataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms:\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(inputShape, outputShape)]\n }),\n };\n };\n\nexport const createReduceAttributesFromInputs =\n (inputs: readonly TensorView[], attributes: ReduceAttributes): ReduceAttributes => {\n const axes: number[] = [];\n if (inputs[1].dims[0] > 0) {\n inputs[1].getBigInt64Array().forEach(v => axes.push(Number(v)));\n }\n return createAttributeWithCacheKey(\n {axes, keepDims: attributes.keepDims, noopWithEmptyAxes: attributes.noopWithEmptyAxes});\n };\n\nconst runReduceProgram =\n (context: ComputeContext, name: string, attributes: ReduceAttributes, reduceOp: ReduceOp): void => {\n const inputs = context.inputs;\n const updatedAttributes: ReduceAttributes =\n inputs.length === 1 ? attributes : createReduceAttributesFromInputs(inputs, attributes);\n\n context.compute(\n createReduceProgramInfo(\n name, {hint: updatedAttributes.cacheKey, inputDependencies: ['rank']}, [inputs[0]],\n updatedAttributes.noopWithEmptyAxes && updatedAttributes.axes.length === 0 ? noOp : reduceOp,\n updatedAttributes.axes, inputs[0].dataType, updatedAttributes.keepDims,\n updatedAttributes.noopWithEmptyAxes),\n {inputs: [0]});\n };\n\nconst reduceLogSumNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(0);`,\n '',\n `value += ${input.getByIndices('input_indices')};`,\n 'value = log(value);',\n ];\n runReduceProgram(context, 'ReduceLogSum', attributes, reduceOp);\n};\n\nconst reduceL1Naive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(0);`,\n '',\n `value += abs(${input.getByIndices('input_indices')});`,\n '',\n ];\n runReduceProgram(context, 'ReduceL1', attributes, reduceOp);\n};\n\nconst reduceL2Naive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var t = ${output.type.value}(0); var value = ${output.type.value}(0);`,\n '',\n `t = ${input.getByIndices('input_indices')}; value += (t * t);`,\n 'value = sqrt(value);',\n ];\n runReduceProgram(context, 'ReduceL2', attributes, reduceOp);\n};\n\nconst reduceLogSumExpNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(0);`,\n '',\n `value += exp(${input.getByIndices('input_indices')});`,\n 'value = log(value);',\n ];\n runReduceProgram(context, 'ReduceLogSumExp', attributes, reduceOp);\n};\n\nconst reduceMaxNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, _output, axes) => {\n const idxZero = [];\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(input.indicesSet('input_indices', k, 0));\n }\n }\n\n return [\n `${idxZero.join('\\n')}`,\n `var value = ${input.getByIndices('input_indices')};`,\n `value = max(value, ${input.getByIndices('input_indices')});`,\n '',\n ];\n };\n runReduceProgram(context, 'ReduceMax', attributes, reduceOp);\n};\n\nconst reduceMeanNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output, axes) => {\n let size = 1.0;\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n // TODO: this depends on the input dims. If we want to use uniform, this need to be updated.\n size *= context.inputs[0].dims[k];\n }\n }\n\n return [\n 'var sum = f32(0);',\n '',\n `sum += f32(${input.getByIndices('input_indices')});`,\n `let value = ${output.type.value}(sum / ${size});`,\n ];\n };\n runReduceProgram(context, 'ReduceMean', attributes, reduceOp);\n};\n\nconst reduceMinNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, _output, axes) => {\n const idxZero = [];\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(`input_indices[${k}] = 0;`); // first element\n }\n }\n\n return [\n `${idxZero.join('\\n')}`,\n `var value = ${input.getByIndices('input_indices')};`,\n `value = min(value, ${input.getByIndices('input_indices')});`,\n '',\n ];\n };\n runReduceProgram(context, 'ReduceMin', attributes, reduceOp);\n};\n\nconst reduceProdNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(1);`,\n '',\n `value *= ${input.getByIndices('input_indices')};`,\n '',\n ];\n runReduceProgram(context, 'ReduceProd', attributes, reduceOp);\n};\n\nconst reduceSumNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(0);`,\n '',\n `value += ${input.getByIndices('input_indices')};`,\n '',\n ];\n runReduceProgram(context, 'ReduceSum', attributes, reduceOp);\n};\n\nconst reduceSumSquareNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var t = ${output.type.value}(0); var value = ${output.type.value}(0);`,\n '',\n `t = ${input.getByIndices('input_indices')}; value += t * t;`,\n '',\n ];\n runReduceProgram(context, 'ReduceSumSquare', attributes, reduceOp);\n};\n\nconst useNaiveReduceMethod =\n (shape: readonly number[], axes: readonly number[], noopWithEmptyAxes: boolean): boolean => {\n if (axes.length === 0) {\n return noopWithEmptyAxes;\n }\n\n let outputSize = 1;\n let reduceSize = 1;\n for (let dim = 0; dim < axes.length; dim++) {\n if (axes.indexOf(dim) === -1) {\n outputSize *= shape[dim];\n } else {\n reduceSize *= shape[dim];\n }\n }\n\n // The condition data is very rough, although considering the count of Execution Unit (EU), the potential\n // work groups in a EU and the counts of loops in the naive and shared methods, also doing experiments\n // on some machines.\n return reduceSize < 32 && outputSize > 1024;\n };\n\nexport const reduceMean = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceMeanNaive(context, attributes);\n } else {\n reduceMeanShared(context, attributes);\n }\n};\n\nexport const reduceL1 = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceL1Naive(context, attributes);\n } else {\n reduceL1Shared(context, attributes);\n }\n};\n\nexport const reduceL2 = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceL2Naive(context, attributes);\n } else {\n reduceL2Shared(context, attributes);\n }\n};\n\nexport const reduceLogSumExp = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceLogSumExpNaive(context, attributes);\n } else {\n reduceLogSumExpShared(context, attributes);\n }\n};\n\nexport const reduceMax = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceMaxNaive(context, attributes);\n } else {\n reduceMaxShared(context, attributes);\n }\n};\n\nexport const reduceMin = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceMinNaive(context, attributes);\n } else {\n reduceMinShared(context, attributes);\n }\n};\n\nexport const reduceProd = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceProdNaive(context, attributes);\n } else {\n reduceProdShared(context, attributes);\n }\n};\n\nexport const reduceSum = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceSumNaive(context, attributes);\n } else {\n reduceSumShared(context, attributes);\n }\n};\n\nexport const reduceSumSquare = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceSumSquareNaive(context, attributes);\n } else {\n reduceSumSquareShared(context, attributes);\n }\n};\n\nexport const reduceLogSum = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceLogSumNaive(context, attributes);\n } else {\n reduceLogSumShared(context, attributes);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// TODO: this is the same naive implementation we use for reduce that has\n// performance limitations when the reduced axis is long. Need to add\n// a optimized codepath for this.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext} from '../types';\n\nimport {createReduceProgramInfo, ReduceOp} from './reduce';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length === 0 || inputs.length > 2) {\n throw new Error('ArgMinMaxOp op requires 1 or 2 inputs.');\n }\n if (inputs[0].dataType !== DataType.float) {\n throw new Error('Invalid input type.');\n }\n};\n\nexport interface ArgMinMaxAttributes extends AttributeWithCacheKey {\n keepDims: boolean;\n axis: number;\n selectLastIndex: number;\n}\n\nexport const argMin = (context: ComputeContext, attributes: ArgMinMaxAttributes): void => {\n validateInputs(context.inputs);\n const argMinMaxOp: ReduceOp = (input, output, axes) => {\n const idxZero = [];\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(`input_indices[${k}] = 0;`); // first element\n }\n }\n return [\n `${idxZero.join('\\n')}`, `var value = ${input.getByIndices('input_indices')};\\nvar best_index : i32 = 0;`,\n `if (${input.getByIndices('input_indices')} ${attributes.selectLastIndex > 0 ? '<=' : '<'} value) {\n value = ${input.getByIndices('input_indices')};\n best_index = i32(last_index);\n }`,\n '', output.setByOffset('global_idx', 'best_index')\n ];\n };\n\n context.compute(\n createReduceProgramInfo(\n 'ArgMin', {hint: attributes.cacheKey, inputDependencies: ['rank']}, [context.inputs[0]], argMinMaxOp,\n [attributes.axis], DataType.int64, attributes.keepDims),\n {inputs: [0]});\n};\n\nexport const argMax = (context: ComputeContext, attributes: ArgMinMaxAttributes): void => {\n validateInputs(context.inputs);\n const argMinMaxOp: ReduceOp = (input, output, axes) => {\n const idxZero = [];\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(`input_indices[${k}] = 0;`); // first element\n }\n }\n return [\n `${idxZero.join('\\n')}`, `var value = ${input.getByIndices('input_indices')};\\nvar best_index : i32 = 0;`,\n `if (${input.getByIndices('input_indices')} ${attributes.selectLastIndex > 0 ? '>=' : '>'} value) {\n value = ${input.getByIndices('input_indices')};\n best_index = i32(last_index);\n }`,\n '', output.setByOffset('global_idx', 'best_index')\n ];\n };\n\n context.compute(\n createReduceProgramInfo(\n 'argMax', {hint: attributes.cacheKey, inputDependencies: ['rank']}, [context.inputs[0]], argMinMaxOp,\n [attributes.axis], DataType.int64, attributes.keepDims),\n {inputs: [0]});\n};\n\nexport const parseArgMinMaxAttributes = (attributes: Record): ArgMinMaxAttributes =>\n createAttributeWithCacheKey(attributes as Omit);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ComputeContext, GpuDataType, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {getMaxComponents, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, tensorTypeToWsglValueType, UniformDataElementType, UniformsArrayType} from './common';\n\nexport const enum AttentionQkvFormat {\n unknown, // enum value not set, or depends on qkv projection implementation details\n qkvBNSH, // for non-packed qkv, permuted\n qkvBSNH, // for non-packed qkv, not permuted, used by memory efficient attention or MultiHeadAttention\n qkvBSN3H, // for TRT fused attention, qkv are packed\n qkvBNSHqkvBS3NH, // for TRT fused causal attention, data has two formats (qkv is 3BNSH, gemm_buffer is BS3NH)\n qKvBSNHxBSN2H, // for TRT fused cross attention, kv are packed\n qkvTNH, // for memory efficient attention, qkv are not packed, and paddings are removed.\n qkvTN3H, // for TRT fused attention, qkv are packed and paddings are removed\n}\n\nexport const enum AttentionMaskType {\n none, // No mask\n mask1dKeySeqLen, // [batch_size], key sequence length\n mask1dEndStart, // [2 * batch_size] with end positions and start positions\n mask1DKeySeqLenStart, // [3 * batch_size + 2] with [key_len[0], ..., key_len[batch_size - 1], query_start[0],\n // ..., query_start[batch_size - 1], query_end[batch_size - 1], key_start[0], ...,\n // key_start[batch_size - 1], key_end[batch_size - 1]]\n mask2dDummy, // dummy mask with shape [1, 1] or [batch_size, 1]. It has same effect as no mask.\n mask2dKeyPadding, // [batch_size, total_sequence_length]\n mask3dAttention, // [batch_size, sequence_length, total_sequence_length]\n mask4dMegatron, // Megatron causal mask with shape [batch_size, 1, max_sequence_length, max_sequence_length]\n maskUnknown\n}\n\nexport interface AttentionParameters {\n batchSize: number;\n sequenceLength: number;\n pastSequenceLength: number;\n kvSequenceLength: number;\n totalSequenceLength: number;\n maxSequenceLength: number;\n inputHiddenSize: number;\n hiddenSize: number;\n vHiddenSize: number;\n headSize: number;\n vHeadSize: number;\n numHeads: number;\n kvNumHeads?: number;\n nReps?: number;\n isUnidirectional?: boolean;\n pastPresentShareBuffer: boolean;\n maskFilterValue?: number;\n maskType: AttentionMaskType;\n scale: number;\n broadcastResPosBias: boolean;\n passPastInKv: boolean;\n qkvFormat: AttentionQkvFormat;\n isPastkvBSNH?: boolean;\n}\n\nexport interface AttentionAttrs {\n numHeads: number;\n kvNumHeads?: number;\n isUnidirectional?: number;\n maskFilterValue?: number;\n scale: number;\n doRotary: number;\n qkvHiddenSizes: number[];\n pastPresentShareBuffer: boolean;\n}\n\nconst validateAttentionInputs = (inputs: readonly TensorView[], attributes: AttentionAttrs): AttentionParameters => {\n // Abbreviation and Meanings:\n // B: batch_size\n // S: sequence_length (input sequence length of query)\n // P: past_sequence_length (past sequence length of key or value)\n // L: kv_sequence_length (input sequence length of key or value)\n // M: max_sequence_length\n // T: total_sequence_length = past_sequence_length + kv_sequence_length\n // N: num_heads\n // H: head size for Q and K, aka q_head_size or k_head_size or qk_head_size\n // H_v: v_head_size\n // D_i: input hidden size\n // D: hidden size for Q and K (D = N * H), aka q_hidden_size or k_hidden_size or qk_hidden_size\n // D_v: v_hidden_size = num_heads * v_head_size\n\n // When past state is used, Q, K and V should have same hidden size (unless we split it into past_key and past_value).\n\n // Input shapes:\n // input (Q/K/V) : (B, S, D_i)\n // weights (Q/K/V) : (D_i, D + D + D_v)\n // bias (Q/K/V) : (D + D + D_v)\n // mask_index : see below\n // past (K/V) : (2, B, N, P, H) or NULL\n // relative_position_bias : (B, N, S, T) or NULL\n\n // For mask_index, the following shapes are supported:\n // NULL, (B, 1), (1, 1)\n // (B), (2 * B), (3 * B + 2)\n // (B, T)\n // (B, S, T)\n // (B, 1, M, M)\n //\n // When a model is pruned (like some attention heads are removed in Q/K/V), input_hidden_size could be larger\n // than hidden dimension of Q, K and V.\n\n const input = inputs[0];\n const weights = inputs[1];\n const bias = inputs[2];\n const maskIndex = inputs[3];\n const past = inputs[4];\n const relativePositionBias = inputs[5];\n\n if (past && relativePositionBias) {\n throw new Error('Attention cannot have both past and relative_position_bias');\n }\n\n if (input.dims.length !== 3) {\n throw new Error('Input \"input\" must have 3 dimensions');\n }\n\n const batchSize = input.dims[0];\n const sequenceLength = input.dims[1];\n const inputHiddenSize = input.dims[2];\n\n if (bias.dims.length !== 1) {\n throw new Error('Input \"bias\" is expected to have 1 dimensions');\n }\n\n if (weights.dims.length !== 2) {\n throw new Error('Input \"weights\" is expected to have 2 dimensions');\n }\n\n if (weights.dims[0] !== inputHiddenSize) {\n throw new Error('Input 1 dimension 0 should have same length as dimension 2 of input 0');\n }\n\n if (bias.dims[0] !== weights.dims[1]) {\n throw new Error('Input \"bias\" dimension 0 should have same length as dimension 1 of input \"weights\"');\n }\n\n let qHiddenSize = bias.dims[0] / 3;\n let kHiddenSize = qHiddenSize;\n let vHiddenSize = kHiddenSize;\n if (attributes.qkvHiddenSizes.length > 0) {\n if (attributes.qkvHiddenSizes.length !== 3) {\n throw new Error('qkv_hidden_sizes attribute should have 3 elements');\n }\n for (const sz of attributes.qkvHiddenSizes) {\n if (sz % attributes.numHeads !== 0) {\n throw new Error('qkv_hidden_sizes should be divisible by num_heads');\n }\n }\n\n qHiddenSize = attributes.qkvHiddenSizes[0];\n kHiddenSize = attributes.qkvHiddenSizes[1];\n vHiddenSize = attributes.qkvHiddenSizes[2];\n }\n\n const kvSequenceLength = sequenceLength;\n\n if (qHiddenSize !== kHiddenSize) {\n throw new Error('qkv_hidden_sizes first element should be same as the second');\n }\n\n if (bias.dims[0] !== qHiddenSize + kHiddenSize + vHiddenSize) {\n throw new Error('Input \"bias\" dimension 0 should have same length as sum of Q/K/V hidden sizes');\n }\n\n let pastSequenceLength = 0;\n if (past) {\n if (kHiddenSize !== vHiddenSize) {\n throw new Error('Input \"past\" expect k_hidden_size == v_hidden_size');\n }\n if (past.dims.length !== 5) {\n throw new Error('Input \"past\" must have 5 dimensions');\n }\n if (past.dims[0] !== 2) {\n throw new Error('Input \"past\" first dimension must be 2');\n }\n if (past.dims[1] !== batchSize) {\n throw new Error('Input \"past\" second dimension must be batch_size');\n }\n if (past.dims[2] !== attributes.numHeads) {\n throw new Error('Input \"past\" third dimension must be num_heads');\n }\n if (past.dims[4] !== kHiddenSize / attributes.numHeads) {\n throw new Error('Input \"past\" fifth dimension must be k_hidden_size / num_heads');\n }\n\n if (!attributes.pastPresentShareBuffer) {\n pastSequenceLength = past.dims[3];\n }\n // TODO: handle past_seq_len\n }\n\n const totalSequenceLength = kvSequenceLength + pastSequenceLength;\n const maxSequenceLength = -1;\n\n const maskType = AttentionMaskType.none;\n if (maskIndex) {\n // maskType = AttentionMaskType.MASK_UNKNOWN;\n // TODO: handle mask\n throw new Error('Mask not supported');\n }\n\n if (past) {\n throw new Error('past is not supported');\n }\n\n return {\n batchSize,\n sequenceLength,\n pastSequenceLength,\n kvSequenceLength,\n totalSequenceLength,\n maxSequenceLength,\n inputHiddenSize,\n hiddenSize: qHiddenSize,\n vHiddenSize,\n headSize: Math.floor(qHiddenSize / attributes.numHeads),\n vHeadSize: Math.floor(vHiddenSize / attributes.numHeads),\n numHeads: attributes.numHeads,\n isUnidirectional: false,\n pastPresentShareBuffer: false,\n maskFilterValue: attributes.maskFilterValue,\n maskType,\n scale: attributes.scale,\n broadcastResPosBias: false,\n passPastInKv: false,\n qkvFormat: AttentionQkvFormat.qkvBNSH,\n };\n};\n\nconst createInPlaceSoftmaxProgramInfo = (_context: ComputeContext, input: TensorView, n: number, d: number) => {\n const components = getMaxComponents(d);\n let WG = 64;\n const dComp = d / components;\n if (dComp < WG) {\n WG = 1;\n } else if (dComp / 8 < 64) {\n WG = Math.ceil(dComp / 8);\n }\n const elementsPerThread = Math.ceil(d / components / WG);\n const programUniforms: ProgramUniform[] = [\n {type: input.dataType, data: 1 / d}, {type: DataType.uint32, data: dComp},\n {type: DataType.uint32, data: elementsPerThread}\n ];\n const dataType = tensorTypeToWsglStorageType(input.dataType, components);\n const f32Type = tensorTypeToWsglValueType(DataType.float, components);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const inputHelper = outputVariable('x', input.dataType, input.dims, components);\n const elemValueType = tensorTypeToWsglValueType(input.dataType);\n const uniforms: UniformsArrayType = [\n {name: 'd_inv', type: elemValueType as UniformDataElementType}, {name: 'd_comp', type: 'u32'},\n {name: 'elements_per_thread', type: 'u32'}\n ];\n\n return `\n var thread_max: array;\n var thread_sum: array;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(inputHelper)}\n ${shaderHelper.mainStart([\n WG, 1, 1\n ])}\n let local_offset = local_idx * uniforms.elements_per_thread;\n let offset = workgroup_id.x * uniforms.d_comp + local_offset;\n\n var thread_max_vector = ${f32Type}(-3.402823e+38f);\n for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < uniforms.d_comp; i++) {\n thread_max_vector = max(${f32Type}(x[offset + i]), thread_max_vector);\n }\n thread_max[local_idx] = ${(() => {\n switch (components) {\n case 1:\n return 'thread_max_vector';\n case 2:\n return 'max(thread_max_vector.x, thread_max_vector.y)';\n case 4:\n return 'max(max(thread_max_vector.x, thread_max_vector.y), max(thread_max_vector.z, thread_max_vector.w))';\n default:\n throw new Error(`Unsupported components: ${components}`);\n }\n })()};\n workgroupBarrier();\n\n var max_value = f32(-3.402823e+38f);\n for (var i = 0u; i < ${WG}; i++) {\n max_value = max(thread_max[i], max_value);\n }\n\n var sum_vector = ${f32Type}(0);\n for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < uniforms.d_comp; i++) {\n sum_vector += exp(${f32Type}(x[offset + i]) - max_value);\n }\n thread_sum[local_idx] = ${(() => {\n switch (components) {\n case 1:\n return 'sum_vector';\n case 2:\n return 'sum_vector.x + sum_vector.y';\n case 4:\n return 'sum_vector.x + sum_vector.y + sum_vector.z + sum_vector.w';\n default:\n throw new Error(`Unsupported components: ${components}`);\n }\n })()};\n workgroupBarrier();\n\n var sum: f32 = 0;\n for (var i = 0u; i < ${WG}; i++) {\n sum += thread_sum[i];\n }\n\n if (sum == 0) {\n for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < uniforms.d_comp; i++) {\n x[offset + i] = ${inputHelper.type.value}(uniforms.d_inv);\n }\n } else {\n for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < uniforms.d_comp; i++) {\n var f32input = ${f32Type}(x[offset + i]);\n x[offset + i] = ${inputHelper.type.value}(exp(f32input - max_value) / sum);\n }\n }\n }`;\n };\n\n return {\n name: 'AttentionProbsSoftmax',\n shaderCache: {hint: `${WG};${dataType};${components}`},\n getShaderSource,\n getRunData: () => ({outputs: [], dispatchGroup: {x: n}, programUniforms}),\n };\n};\n\nconst createAttentionProbsProgramInfo =\n (context: ComputeContext, q: TensorView, key: TensorView, pastKey: TensorView|undefined,\n relativePositionBias: TensorView|undefined, parameters: AttentionParameters, attributes: AttentionAttrs,\n pastSequenceLength: number) => {\n const totalSequenceLength = pastSequenceLength + parameters.kvSequenceLength;\n const probsShape = [parameters.batchSize, parameters.numHeads, parameters.sequenceLength, totalSequenceLength];\n const presentKey = parameters.kvNumHeads === undefined && context.outputCount > 1;\n const presentKeyShape = presentKey ?\n [parameters.batchSize, parameters.numHeads, totalSequenceLength, parameters.headSize] :\n undefined;\n\n // TODO: handle mask\n\n const alpha = attributes.scale === 0 ? 1.0 / Math.sqrt(parameters.headSize) : attributes.scale;\n const components = getMaxComponents(parameters.headSize);\n const vectorizedHeadSize = parameters.headSize / components;\n const TILE_SIZE = 12;\n const dispatch = {\n x: Math.ceil(totalSequenceLength / TILE_SIZE),\n y: Math.ceil(parameters.sequenceLength / TILE_SIZE),\n z: parameters.batchSize * parameters.numHeads\n };\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: parameters.sequenceLength}, {type: DataType.uint32, data: vectorizedHeadSize},\n {type: DataType.uint32, data: totalSequenceLength}, {type: DataType.uint32, data: parameters.numHeads},\n {type: DataType.float, data: alpha}, {type: DataType.uint32, data: pastSequenceLength},\n {type: DataType.uint32, data: parameters.kvSequenceLength}\n ];\n\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type'];\n if (pastKey) {\n inputDependencies.push('type');\n }\n if (relativePositionBias) {\n inputDependencies.push('type');\n }\n const outputs = [{dims: probsShape, dataType: q.dataType, gpuDataType: GpuDataType.default}];\n if (presentKey) {\n outputs.push({dims: presentKeyShape!, dataType: q.dataType, gpuDataType: GpuDataType.default});\n }\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const qInput = inputVariable('q', q.dataType, q.dims, components);\n const kInput = inputVariable('key', key.dataType, key.dims, components);\n const inputVars = [qInput, kInput];\n if (pastKey) {\n const pastKeyInput = inputVariable('past_key', pastKey.dataType, pastKey.dims, components);\n inputVars.push(pastKeyInput);\n }\n if (relativePositionBias) {\n inputVars.push(\n inputVariable('relative_position_bias', relativePositionBias.dataType, relativePositionBias.dims));\n }\n const output = outputVariable('output', q.dataType, probsShape);\n const outputVars = [output];\n if (presentKey) {\n outputVars.push(outputVariable('present_key', q.dataType, presentKeyShape!, components));\n }\n const f32Type = tensorTypeToWsglValueType(DataType.float, components);\n\n const uniforms: UniformsArrayType = [\n {name: 'M', type: 'u32'}, {name: 'K', type: 'u32'}, {name: 'N', type: 'u32'},\n {name: 'num_heads', type: 'u32'}, {name: 'alpha', type: 'f32' as UniformDataElementType},\n {name: 'past_sequence_length', type: 'u32'}, {name: 'kv_sequence_length', type: 'u32'}\n ];\n return `\n const TILE_SIZE = ${TILE_SIZE}u;\n\n var tileQ: array<${qInput.type.storage}, ${TILE_SIZE * TILE_SIZE}>;\n var tileK: array<${qInput.type.storage}, ${TILE_SIZE * TILE_SIZE}>;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVars, ...outputVars)}\n ${shaderHelper.mainStart([\n TILE_SIZE, TILE_SIZE, 1\n ])}\n // x holds the N and y holds the M\n let headIdx = workgroup_id.z;\n let m = workgroup_id.y * TILE_SIZE;\n let n = workgroup_id.x * TILE_SIZE;\n let qOffset = uniforms.M * uniforms.K * headIdx + m * uniforms.K;\n ${(() => {\n if (pastKey && presentKey) {\n return `\n let kOffset = uniforms.kv_sequence_length * uniforms.K * headIdx;\n let pastKeyOffset = uniforms.past_sequence_length * uniforms.K * headIdx;`;\n } else {\n return `\n let kOffset = uniforms.N * uniforms.K * headIdx + n * uniforms.K;`;\n }\n })()}\n ${presentKey ? 'let presentKeyOffset = headIdx * uniforms.N * uniforms.K;' : ''}\n var value = ${f32Type}(0);\n for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) {\n if (global_id.y < uniforms.M && w + local_id.x < uniforms.K) {\n tileQ[TILE_SIZE * local_id.y + local_id.x] = q[qOffset + local_id.y * uniforms.K + w + local_id.x];\n }\n if (n + local_id.y < uniforms.N && w + local_id.x < uniforms.K) {\n var idx = TILE_SIZE * local_id.y + local_id.x;\n ${(() => {\n if (pastKey && presentKey) {\n return `\n if (n + local_id.y < uniforms.past_sequence_length) {\n tileK[idx] = past_key[pastKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x];\n } else {\n tileK[idx] =\n key[kOffset + (n + local_id.y - uniforms.past_sequence_length) * uniforms.K + w + local_id.x];\n }`;\n } else {\n return 'tileK[idx] = key[kOffset + local_id.y * uniforms.K + w + local_id.x];';\n }\n })()}\n ${\n presentKey ?\n 'present_key[presentKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x] = tileK[idx];' :\n ''}\n }\n workgroupBarrier();\n\n for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) {\n value += ${f32Type}(tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * local_id.x + k]);\n }\n\n workgroupBarrier();\n }\n\n let headOffset = headIdx * uniforms.M * uniforms.N;\n if (global_id.y < uniforms.M && global_id.x < uniforms.N) {\n let outputIdx = headOffset + global_id.y * uniforms.N + global_id.x;\n var sum: f32 = ${(() => {\n switch (components) {\n case 1:\n return 'value';\n case 2:\n return 'value.x + value.y';\n case 4:\n return 'value.x + value.y + value.z + value.w';\n default:\n throw new Error(`Unsupported components: ${components}`);\n }\n })()};\n output[outputIdx] = ${output.type.value} (sum * uniforms.alpha) + ${\n relativePositionBias ? 'relative_position_bias[outputIdx]' : '0.0'};\n }\n }`;\n };\n return {\n name: 'AttentionProbs',\n shaderCache: {\n hint: `${components};${relativePositionBias !== undefined};${pastKey !== undefined};${context.outputCount}`,\n inputDependencies\n },\n getRunData: () => ({outputs, dispatchGroup: dispatch, programUniforms}),\n getShaderSource,\n };\n };\n\n\nconst createVxAttentionScoreProgramInfo =\n (context: ComputeContext, probs: TensorView, v: TensorView, pastValue: TensorView|undefined,\n params: AttentionParameters, pastSequenceLength: number) => {\n const totalSequenceLength = pastSequenceLength + params.kvSequenceLength;\n const nReps = params.nReps ? params.nReps : 1;\n const repeatedVHiddenSize = params.vHiddenSize * nReps;\n const presentValue = params.kvNumHeads == null && context.outputCount > 1;\n const presentValueShape =\n presentValue ? [params.batchSize, params.numHeads, totalSequenceLength, params.headSize] : undefined;\n const outputShape = [params.batchSize, params.sequenceLength, repeatedVHiddenSize];\n const TILE_SIZE = 12;\n const dispatch = {\n x: Math.ceil(params.vHeadSize / TILE_SIZE),\n y: Math.ceil(params.sequenceLength / TILE_SIZE),\n z: params.batchSize * params.numHeads\n };\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: params.sequenceLength}, {type: DataType.uint32, data: totalSequenceLength},\n {type: DataType.uint32, data: params.vHeadSize}, {type: DataType.uint32, data: params.numHeads},\n {type: DataType.uint32, data: repeatedVHiddenSize}, {type: DataType.uint32, data: pastSequenceLength},\n {type: DataType.uint32, data: params.kvSequenceLength}\n ];\n const inputDependencies: ProgramInputTensorInfoDependency[] =\n pastValue ? ['type', 'type', 'type'] : ['type', 'type'];\n const outputs = [{dims: outputShape, dataType: probs.dataType, gpuDataType: GpuDataType.default}];\n if (presentValue) {\n outputs.push({dims: presentValueShape!, dataType: probs.dataType, gpuDataType: GpuDataType.default});\n }\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const probsHelper = inputVariable('probs', probs.dataType, probs.dims);\n const vHelper = inputVariable('v', v.dataType, v.dims);\n const inputVars = [probsHelper, vHelper];\n if (pastValue) {\n inputVars.push(inputVariable('past_value', pastValue.dataType, pastValue.dims));\n }\n const output = outputVariable('output', probs.dataType, outputShape);\n const outputVars = [output];\n if (presentValue) {\n outputVars.push(outputVariable('present_value', probs.dataType, presentValueShape!));\n }\n const uniforms: UniformsArrayType = [\n {name: 'M', type: 'u32'}, {name: 'K', type: 'u32'}, {name: 'N', type: 'u32'},\n {name: 'num_heads', type: 'u32'}, {name: 'v_hidden_size', type: 'u32'},\n {name: 'past_sequence_length', type: 'u32'}, {name: 'kv_sequence_length', type: 'u32'}\n ];\n return `\n const TILE_SIZE = ${TILE_SIZE}u;\n var tileQ: array<${probsHelper.type.value}, ${TILE_SIZE * TILE_SIZE}>;\n var tileK: array<${probsHelper.type.value}, ${TILE_SIZE * TILE_SIZE}>;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVars, ...outputVars)}\n ${shaderHelper.mainStart([\n TILE_SIZE, TILE_SIZE, 1\n ])}\n let headIdx = workgroup_id.z;\n let m = global_id.y;\n let n = global_id.x;\n\n let offsetA = headIdx * (uniforms.M * uniforms.K) + m * uniforms.K;\n ${(() => {\n if (pastValue && presentValue) {\n return `\n let pastValueOffset = headIdx * uniforms.N * uniforms.past_sequence_length + n;\n let vOffset = headIdx * uniforms.N * uniforms.kv_sequence_length + n;\n `;\n } else {\n return `\n let offsetB = headIdx * uniforms.N * uniforms.K + n;\n `;\n }\n })()}\n ${presentValue ? 'let presentValueOffset = headIdx * uniforms.N * uniforms.K + n;' : ''}\n var value = ${probsHelper.type.storage}(0);\n for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) {\n if (m < uniforms.M && w + local_id.x < uniforms.K) {\n tileQ[TILE_SIZE * local_id.y + local_id.x] = probs[offsetA + w + local_id.x];\n }\n if (n < uniforms.N && w + local_id.y < uniforms.K) {\n var idx = TILE_SIZE * local_id.y + local_id.x;\n ${(() => {\n if (pastValue && presentValue) {\n return `\n if (w + local_id.y < uniforms.past_sequence_length) {\n tileK[idx] = past_value[pastValueOffset + (w + local_id.y) * uniforms.N];\n } else {\n tileK[idx] = v[vOffset + (w + local_id.y - uniforms.past_sequence_length) * uniforms.N];\n }\n `;\n } else {\n return `\n tileK[idx] = v[offsetB + (w + local_id.y) * uniforms.N];\n `;\n }\n })()}\n ${presentValue ? 'present_value[presentValueOffset + (w + local_id.y) * uniforms.N] = tileK[idx];' : ''}\n }\n workgroupBarrier();\n for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) {\n value += tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * k + local_id.x];\n }\n workgroupBarrier();\n }\n\n // we need to transpose output from BNSH_v to BSND_v\n let batchIdx = workgroup_id.z / uniforms.num_heads;\n let currentBatchHeadNumber = workgroup_id.z % uniforms.num_heads;\n if (m < uniforms.M && n < uniforms.N) {\n let outputIdx = batchIdx * uniforms.M * uniforms.v_hidden_size + m * uniforms.v_hidden_size\n + currentBatchHeadNumber * uniforms.N + n;\n output[outputIdx] = value;\n }\n }`;\n };\n\n return {\n name: 'AttentionScore',\n shaderCache: {hint: `${pastValue !== undefined};${context.outputCount}`, inputDependencies},\n getRunData: () => ({outputs, dispatchGroup: dispatch, programUniforms}),\n getShaderSource,\n };\n };\n\nexport const applyAttention =\n (context: ComputeContext, q: TensorView, k: TensorView, v: TensorView, _maskIndex: TensorView|undefined,\n _past: TensorView|undefined, pastKey: TensorView|undefined, pastValue: TensorView|undefined,\n relativePositionBias: TensorView|undefined, parameters: AttentionParameters, attributes: AttentionAttrs) => {\n const outputCount = context.outputCount;\n const pastSequenceLength =\n parameters.kvNumHeads !== undefined || outputCount > 1 ? parameters.pastSequenceLength : 0;\n const totalSequenceLength = pastSequenceLength + parameters.kvSequenceLength;\n\n const inputsK = (parameters.kvNumHeads === undefined && outputCount > 1 && pastKey) ? [q, k, pastKey] : [q, k];\n if (relativePositionBias) {\n inputsK.push(relativePositionBias);\n }\n\n // Run AttentionProbs\n const probs = context.compute(\n createAttentionProbsProgramInfo(\n context, q, k, outputCount > 1 ? pastKey : undefined, relativePositionBias, parameters, attributes,\n pastSequenceLength),\n {inputs: inputsK, outputs: (parameters.kvNumHeads === undefined && outputCount > 1) ? [-1, 1] : [-1]})[0];\n\n // Run Softmax\n context.compute(\n createInPlaceSoftmaxProgramInfo(\n context, probs, parameters.batchSize * parameters.numHeads * parameters.sequenceLength,\n totalSequenceLength),\n {inputs: [probs], outputs: []});\n\n // Run AttrionScore\n const inputsV =\n (parameters.kvNumHeads === undefined && outputCount > 1 && pastValue) ? [probs, v, pastValue] : [probs, v];\n context.compute(\n createVxAttentionScoreProgramInfo(\n context, probs, v, outputCount > 1 && pastValue ? pastValue : undefined, parameters, pastSequenceLength),\n {inputs: inputsV, outputs: (parameters.kvNumHeads === undefined && outputCount > 1) ? [0, 2] : [0]});\n };\n\nconst prepare = (context: ComputeContext, parameters: AttentionParameters) => {\n const outputShape = [\n parameters.batchSize,\n parameters.numHeads,\n parameters.sequenceLength,\n parameters.headSize,\n ];\n const M = parameters.sequenceLength;\n const K = parameters.inputHiddenSize;\n const N = parameters.headSize;\n const TILE_SIZE = 12;\n const dispatch = {\n x: Math.ceil(parameters.headSize / TILE_SIZE),\n y: Math.ceil(parameters.sequenceLength / TILE_SIZE),\n z: parameters.batchSize * parameters.numHeads\n };\n const inputs = [context.inputs[0], context.inputs[1], context.inputs[2]];\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: M}, {type: DataType.uint32, data: K}, {type: DataType.uint32, data: N},\n {type: DataType.uint32, data: parameters.numHeads}, {type: DataType.uint32, data: parameters.headSize},\n {type: DataType.uint32, data: parameters.hiddenSize},\n {type: DataType.uint32, data: parameters.hiddenSize + parameters.hiddenSize + parameters.vHiddenSize}\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const outputQ = outputVariable('output_q', inputs[0].dataType, outputShape);\n const outputK = outputVariable('output_k', inputs[0].dataType, outputShape);\n const outputV = outputVariable('output_v', inputs[0].dataType, outputShape);\n const input = inputVariable('input', inputs[0].dataType, inputs[0].dims);\n const weight = inputVariable('weight', inputs[1].dataType, inputs[1].dims);\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims);\n const dataType = input.type.storage;\n\n const uniforms: UniformsArrayType = [\n {name: 'M', type: 'u32'}, {name: 'K', type: 'u32'}, {name: 'N', type: 'u32'}, {name: 'num_heads', type: 'u32'},\n {name: 'head_size', type: 'u32'}, {name: 'hidden_size', type: 'u32'}, {name: 'ldb', type: 'u32'}\n ];\n return `\n const TILE_SIZE = ${TILE_SIZE}u;\n var tileInput: array<${dataType}, ${TILE_SIZE * TILE_SIZE}>;\n var tileWeightQ: array<${dataType}, ${TILE_SIZE * TILE_SIZE}>;\n var tileWeightK: array<${dataType}, ${TILE_SIZE * TILE_SIZE}>;\n var tileWeightV: array<${dataType}, ${TILE_SIZE * TILE_SIZE}>;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(input, weight, bias, outputQ, outputK, outputV)}\n ${shaderHelper.mainStart([\n TILE_SIZE, TILE_SIZE, 1\n ])}\n let batchIndex = workgroup_id.z / uniforms.num_heads;\n let headNumber = workgroup_id.z % uniforms.num_heads;\n let m = global_id.y;\n let n = global_id.x;\n\n let inputOffset = batchIndex * (uniforms.M * uniforms.K) + m * uniforms.K;\n let biasOffsetQ = headNumber * uniforms.head_size;\n let biasOffsetK = uniforms.hidden_size + biasOffsetQ;\n let biasOffsetV = uniforms.hidden_size + biasOffsetK;\n\n var valueQ = ${dataType}(0);\n var valueK = ${dataType}(0);\n var valueV = ${dataType}(0);\n for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) {\n if (m < uniforms.M && w + local_id.x < uniforms.K) {\n tileInput[TILE_SIZE * local_id.y + local_id.x] = input[inputOffset + w + local_id.x];\n }\n if (n < uniforms.N && w + local_id.y < uniforms.K) {\n let offset = n + (w + local_id.y) * uniforms.ldb;\n tileWeightQ[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetQ + offset];\n tileWeightK[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetK + offset];\n tileWeightV[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetV + offset];\n }\n workgroupBarrier();\n for (var k: u32 = 0u; k ({\n outputs: [\n {dims: outputShape, dataType: context.inputs[0].dataType, gpuDataType: GpuDataType.default},\n {dims: outputShape, dataType: context.inputs[0].dataType, gpuDataType: GpuDataType.default},\n {dims: outputShape, dataType: context.inputs[0].dataType, gpuDataType: GpuDataType.default},\n ],\n dispatchGroup: dispatch,\n programUniforms\n }),\n getShaderSource,\n },\n {inputs, outputs: [-1, -1, -1]});\n};\n\nexport const attention = (context: ComputeContext, attributes: AttentionAttrs): void => {\n const params = validateAttentionInputs(context.inputs, attributes);\n\n const [q, k, v] = prepare(context, params);\n\n return applyAttention(\n context, q, k, v, context.inputs[4], undefined, undefined, undefined, context.inputs[5], params, attributes);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, getMaxComponents, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface BatchNormAttributes extends AttributeWithCacheKey {\n readonly epsilon: number;\n readonly momentum: number;\n readonly spatial: boolean;\n readonly trainingMode: boolean;\n readonly format: 'NHWC'|'NCHW';\n readonly outputCount: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: BatchNormAttributes): void => {\n if (!inputs || inputs.length !== 5) {\n throw new Error('BatchNormalization requires 5 inputs');\n }\n\n const checkShapeEqual = (actual: readonly number[], expected: readonly number[], message: string) => {\n const r = expected.length;\n if (r !== actual.length) {\n throw new Error(`${message}: num dimensions != ${r}`);\n }\n expected.forEach((v, i) => {\n if (v !== actual[i]) {\n throw new Error(`${message}: dim[${i}] do not match`);\n }\n });\n };\n\n if (inputs[0].dims.length > 1) {\n const shape = attributes.format === 'NHWC' ?\n (attributes.spatial ? inputs[0].dims.slice(-1) :\n inputs[0].dims.slice(-1).concat(inputs[0].dims.slice(1, inputs[0].dims.length - 1))) :\n inputs[0].dims.slice(1, attributes.spatial ? 2 : undefined);\n checkShapeEqual(inputs[1].dims, shape, 'Invalid input scale');\n checkShapeEqual(inputs[2].dims, shape, 'Invalid input B');\n checkShapeEqual(inputs[3].dims, shape, 'Invalid input mean');\n checkShapeEqual(inputs[4].dims, shape, 'Invalid input var');\n } else {\n checkShapeEqual(inputs[1].dims, [1], 'Invalid input scale');\n checkShapeEqual(inputs[2].dims, [1], 'Invalid input B');\n checkShapeEqual(inputs[3].dims, [1], 'Invalid input mean');\n checkShapeEqual(inputs[4].dims, [1], 'Invalid input var');\n }\n};\n\nconst createBatchNormInferenceProgramInfo =\n (inputs: readonly TensorView[], attributes: BatchNormAttributes): ProgramInfo => {\n const {epsilon, spatial, format} = attributes;\n const yShape = inputs[0].dims;\n const components = spatial ? getMaxComponents(yShape[yShape.length - 1]) : 1;\n const cComponents = format === 'NHWC' && yShape.length > 1 ? components : 1;\n const outputSize = ShapeUtil.size(yShape) / components;\n // Only support uniforms for opset version >= 9 (spatial = true).\n const useShapesUniforms = spatial;\n const shapeOrRank = useShapesUniforms ? yShape.length : yShape;\n const x = inputVariable('x', inputs[0].dataType, inputs[0].dims, components);\n const scale = inputVariable('scale', inputs[1].dataType, inputs[1].dims, cComponents);\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims, cComponents);\n const inputMean = inputVariable('inputMean', inputs[3].dataType, inputs[3].dims, cComponents);\n const inputVar = inputVariable('inputVar', inputs[4].dataType, inputs[4].dims, cComponents);\n const y = outputVariable('y', inputs[0].dataType, shapeOrRank, components);\n // TODO: support inputs with different data type. Current we need to make sure all inputs have the same data type.\n // Otherwise, the shader compilation will fail.\n const calcCOffset = (): string => {\n let cOffset = '';\n if (spatial) {\n cOffset = `let cOffset = ${\n yShape.length === 1 ? '0u' :\n format === 'NHWC' ? `outputIndices[${yShape.length - 1}] / ${components}` :\n 'outputIndices[1]'};`;\n } else {\n if (format === 'NCHW') {\n cOffset = `\n ${y.indicesSet('outputIndices', '0', '0')}\n let cOffset = ${y.indicesToOffset('outputIndices')};`;\n } else {\n // update C channel.\n cOffset = `var cIndices = ${scale.type.indices}(0);\n cIndices[0] = outputIndices[${yShape.length - 1}];`;\n // update D1 x ... x Dn channels.\n for (let i = 1; i < scale.rank; i++) {\n cOffset += `cIndices[${i}] = outputIndices[${i}];`;\n }\n cOffset += `let cOffset = ${scale.indicesToOffset('cIndices')};`;\n }\n }\n return cOffset;\n };\n const getInferenceModeShaderSource = (helper: ShaderHelper) => `\n const epsilon = ${epsilon};\n ${helper.registerUniform('outputSize', 'u32').declareVariables(x, scale, bias, inputMean, inputVar, y)}\n ${helper.mainStart()}\n ${helper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n var outputIndices = ${y.offsetToIndices(`global_idx * ${components}`)};\n ${calcCOffset()}\n let scale = ${scale.getByOffset('cOffset')};\n let bias = ${bias.getByOffset('cOffset')};\n let inputMean = ${inputMean.getByOffset('cOffset')};\n let inputVar = ${inputVar.getByOffset('cOffset')};\n let x = ${x.getByOffset('global_idx')};\n let value = (x - inputMean) * inverseSqrt(inputVar + epsilon) * scale + bias;\n ${y.setByOffset('global_idx', 'value')}\n }`;\n return {\n name: 'BatchNormalization',\n shaderCache: {\n hint: `${attributes.epsilon}_${attributes.format}_${spatial}_${components}`,\n inputDependencies: useShapesUniforms ? ['rank', 'type', 'type', 'type', 'type'] : undefined,\n },\n getShaderSource: getInferenceModeShaderSource,\n getRunData: () => ({\n outputs: [{dims: inputs[0].dims, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms: useShapesUniforms ?\n [\n {type: DataType.uint32, data: outputSize},\n ...createTensorShapeVariables(yShape),\n ] :\n [\n {type: DataType.uint32, data: outputSize},\n ],\n }),\n };\n };\n\nexport const parseBatchNormAttributes = (attributes: Record): BatchNormAttributes =>\n createAttributeWithCacheKey(attributes as Omit);\n\nexport const batchNorm = (context: ComputeContext, attributes: Record): void => {\n const {inputs, outputCount} = context;\n const updatedAttributes = parseBatchNormAttributes({...attributes, outputCount});\n if (env.webgpu.validateInputContent) {\n validateInputs(inputs, updatedAttributes);\n }\n if (attributes.trainingMode) {\n throw new Error('BatchNormalization trainingMode is not supported yet.');\n } else {\n context.compute(createBatchNormInferenceProgramInfo(inputs, updatedAttributes));\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper} from './common';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (inputs[0].dims.length !== 3) {\n throw new Error('input should have 3 dimensions');\n }\n\n if (![320, 640, 1280].includes(inputs[0].dims[2])) {\n throw new Error('number of channels should be 320, 640 or 1280');\n }\n\n if (inputs[1].dims.length !== 1) {\n throw new Error('bias is expected to have 1 dimensions');\n }\n\n if (inputs[0].dims[2] !== inputs[1].dims[0]) {\n throw new Error('last dimension of input and bias are not the same');\n }\n};\n\nconst createBiasAddProgramInfo = (inputs: readonly TensorView[]): ProgramInfo => {\n const outputShape = inputs[0].dims;\n\n const channels = inputs[0].dims[2];\n // since channel number can be only 320/640/1280, it's always divisable by 4\n const outputSize = ShapeUtil.size(outputShape) / 4;\n\n const dataType = inputs[0].dataType;\n const input = inputVariable('input', dataType, outputShape, 4);\n const bias = inputVariable('bias', dataType, [channels], 4);\n const residual = inputVariable('residual', dataType, outputShape, 4);\n const output = outputVariable('output', dataType, outputShape, 4);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n const channels = ${channels}u / 4;\n ${shaderHelper.declareVariables(input, bias, residual, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes(outputSize)}\n let value = ${input.getByOffset('global_idx')}\n + ${bias.getByOffset('global_idx % channels')} + ${residual.getByOffset('global_idx')};\n ${output.setByOffset('global_idx', 'value')}\n }`;\n\n return {\n name: 'BiasAdd',\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)}\n }),\n getShaderSource,\n };\n};\n\nexport const biasAdd = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n context.compute(createBiasAddProgramInfo(context.inputs));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {MAX_CLIP, MIN_CLIP, ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglValueType} from './common';\n\ntype BuiltinFunctionName = string;\ntype ElementwiseCustomExpression = (expression: string) => string;\ntype ElementwiseFunctionCall = BuiltinFunctionName|ElementwiseCustomExpression;\n\nconst createElementwiseProgramShader =\n (shaderHelper: ShaderHelper, datasize: number, inputDataType: number, outputDataType: number,\n funcCall: ElementwiseFunctionCall, additionalImplementation?: string): string => {\n const vecSize = Math.ceil(datasize / 4);\n\n let expression = '';\n if (typeof funcCall === 'string') {\n expression = `${funcCall}(a)`;\n } else {\n expression = funcCall('a');\n }\n\n const input = inputVariable('inputData', inputDataType, [vecSize], 4);\n const output = outputVariable('outputData', outputDataType, [vecSize], 4);\n\n return `\n ${shaderHelper.registerUniform('vec_size', 'u32').declareVariables(input, output)}\n\n ${additionalImplementation ?? ''}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.vec_size')}\n\n let a = ${input.getByOffset('global_idx')};\n ${output.setByOffset('global_idx', expression)}\n }`;\n };\n\nconst createElementwiseProgramInfo =\n (input: TensorView, name: string, funcCall: ElementwiseFunctionCall, additionalImplementation?: string,\n cacheKey?: string, outputDataType: number = input.dataType): ProgramInfo => ({\n name,\n shaderCache: {hint: cacheKey, inputDependencies: ['type']},\n getShaderSource: shaderHelper => createElementwiseProgramShader(\n shaderHelper, ShapeUtil.size(input.dims), input.dataType, outputDataType, funcCall, additionalImplementation),\n getRunData: (inputTensors) => ({\n outputs: [{dims: input.dims, dataType: outputDataType}],\n dispatchGroup:\n {x: Math.ceil(ShapeUtil.size(inputTensors[0].dims) / 64 /* workgroup size */ / 4 /* vec size */)},\n programUniforms: [\n {type: DataType.uint32, data: Math.ceil(ShapeUtil.size(input.dims) / 4)},\n ],\n })\n });\n\nexport const abs = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Abs', 'abs'));\n};\n\nexport const acos = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Acos', 'acos'));\n};\n\nexport const acosh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Acosh', 'acosh'));\n};\n\nexport const asin = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Asin', 'asin'));\n};\n\nexport const asinh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Asinh', 'asinh'));\n};\n\nexport const atan = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Atan', 'atan'));\n};\nexport const atanh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Atanh', 'atanh'));\n};\n\nexport interface CastAttributes extends AttributeWithCacheKey {\n readonly to: number;\n readonly saturate?: boolean;\n}\n\nexport const parseCastAttributes = (attributes: Record): CastAttributes =>\n createAttributeWithCacheKey(attributes as {to: number});\n\n\nexport const cast = (context: ComputeContext, attributes: CastAttributes): void => {\n let func: ElementwiseFunctionCall;\n switch (attributes.to) {\n case DataType.float16:\n func = 'vec4';\n break;\n case DataType.float:\n func = 'vec4';\n break;\n case DataType.uint32:\n func = 'vec4';\n break;\n case DataType.int32:\n func = 'vec4';\n break;\n case DataType.bool:\n func = 'vec4';\n break;\n default:\n throw new RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${attributes.to}`);\n }\n context.compute(\n createElementwiseProgramInfo(context.inputs[0], 'Cast', func, undefined, attributes.cacheKey, attributes.to));\n};\n\nexport interface ClipAttributes extends AttributeWithCacheKey {\n readonly min: number;\n readonly max: number;\n}\n\nconst generateClipAttributesFromInputs = (inputs: readonly TensorView[]): ClipAttributes => {\n const min = (inputs.length >= 2 && inputs[1].data !== 0) ? inputs[1].getFloat32Array()[0] : MIN_CLIP;\n const max = (inputs.length >= 3 && inputs[2].data !== 0) ? inputs[2].getFloat32Array()[0] : MAX_CLIP;\n return createAttributeWithCacheKey({min, max});\n};\n\nexport const clip = (context: ComputeContext, clipAttributes: ClipAttributes): void => {\n const attributes = context.inputs.length === 1 ? clipAttributes : generateClipAttributesFromInputs(context.inputs);\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(\n createElementwiseProgramInfo(\n context.inputs[0], 'Clip', a => `clamp(${a}, clip_min_, clip_max_)`, `\n const clip_min_: vec4<${dataType}> = vec4(${dataType}(${attributes.min}));\n const clip_max_: vec4<${dataType}> = vec4(${dataType}(${attributes.max}));\n`,\n attributes.cacheKey),\n {inputs: [0]});\n};\n\nexport const ceil = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Ceil', 'ceil'));\n};\n\nexport const cos = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Cos', 'cos'));\n};\n\nexport const cosh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Cosh', 'cosh'));\n};\n\nexport interface AlphaAttributes extends AttributeWithCacheKey {\n readonly alpha: number;\n}\n\nexport const parseAlphaAttributes = (attributes: Record): AlphaAttributes =>\n createAttributeWithCacheKey(attributes as {alpha: number});\n\nexport const elu = (context: ComputeContext, attributes: AlphaAttributes): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'Elu', a => `elu_vf32(${a})`, `\n const elu_alpha_ = ${dataType}(${attributes.alpha});\n\n fn elu_f32(a: ${dataType}) -> ${dataType} {\n return select((exp(a) - 1.0) * elu_alpha_, a, a >= 0.0);\n }\n\n fn elu_vf32(v: vec4<${dataType}>) -> vec4<${dataType}> {\n return vec4(elu_f32(v.x), elu_f32(v.y), elu_f32(v.z), elu_f32(v.w));\n }`,\n attributes.cacheKey));\n};\n\nexport const erfImpl = (varType = 'f32') => `\nconst r0: ${varType} = 0.3275911;\nconst r1: ${varType} = 0.254829592;\nconst r2: ${varType} = -0.284496736;\nconst r3: ${varType} = 1.421413741;\nconst r4: ${varType} = -1.453152027;\nconst r5: ${varType} = 1.061405429;\n\nfn erf_vf32(v: vec4<${varType}>) -> vec4<${varType}> {\n let absv = abs(v);\n let x = 1.0 / (1.0 + r0 * absv);\n return sign(v) * (1.0 - ((((r5 * x + r4) * x + r3) * x + r2) * x + r1) * x * exp(-absv * absv));\n}`;\n\nexport const erf = (context: ComputeContext): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Erf', a => `erf_vf32(${a})`, erfImpl(dataType)));\n};\n\nexport const exp = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Exp', 'exp'));\n};\n\nexport const floor = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Floor', 'floor'));\n};\n\nexport const gelu = (context: ComputeContext): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'Gelu', a => `0.5 * ${a} * (1.0 + erf_vf32(${a} * 0.7071067811865475))`, erfImpl(dataType)));\n};\n\nexport const leakyRelu = (context: ComputeContext, attributes: AlphaAttributes): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'LeakyRelu', a => `select(leaky_relu_alpha_ * ${a}, ${a}, ${a} >= vec4<${dataType}>(0.0))`,\n `const leaky_relu_alpha_ = ${dataType}(${attributes.alpha});`, attributes.cacheKey));\n};\n\nexport const not = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Not', a => `!${a}`));\n};\n\nexport const neg = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Neg', a => `-${a}`));\n};\n\nexport const reciprocal = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Reciprocal', a => `1.0/${a}`));\n};\n\nexport const relu = (context: ComputeContext): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'Relu', a => `select(vec4<${dataType}>(0.0), ${a}, ${a} > vec4<${dataType}>(0.0))`));\n};\n\nexport const sigmoid = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Sigmoid', a => `(1.0 / (1.0 + exp(-${a})))`));\n};\n\nexport interface HardSigmoidAttributes extends AttributeWithCacheKey {\n readonly alpha: number;\n readonly beta: number;\n}\n\nexport const parseHardSigmoidAttributes = (attributes: Record): HardSigmoidAttributes =>\n createAttributeWithCacheKey(attributes as {\n alpha: number;\n beta: number;\n });\n\nexport const hardSigmoid = (context: ComputeContext, attributes: HardSigmoidAttributes): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'HardSigmoid',\n a => `max(vec4<${dataType}>(0.0), min(vec4<${dataType}>(1.0), ${attributes.alpha} * ${a} + vec4<${dataType}>(${\n attributes.beta})))`,\n undefined, attributes.cacheKey));\n};\n\nexport const sin = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Sin', 'sin'));\n};\n\nexport const sinh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Sinh', 'sinh'));\n};\n\nexport const sqrt = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Sqrt', 'sqrt'));\n};\n\nexport const tan = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Tan', 'tan'));\n};\n\nexport const tanhExpression = (a: string) => `sign(${a}) * (1 - exp(-2 * abs(${a}))) / (1 + exp(-2 * abs(${a})))`;\n\nexport const tanh = (context: ComputeContext): void => {\n // TODO: revisit after https://github.com/gpuweb/gpuweb/issues/4458 is resolved\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Tanh', tanhExpression));\n};\n\nexport const fastGeluImpl = (varType = 'f32') => `\nconst fast_gelu_a: ${varType} = 0.5;\nconst fast_gelu_b: ${varType} = 0.7978845608028654;\nconst fast_gelu_c: ${varType} = 0.035677408136300125;\n\nfn tanh_v(v: vec4<${varType}>) -> vec4<${varType}> {\n return ${tanhExpression('v')};\n}\n`;\n\nexport const fastGeluExpression = (x: string) =>\n `(fast_gelu_a + fast_gelu_a * tanh_v(${x} * (fast_gelu_c * ${x} * ${x} + fast_gelu_b))) * ${x}`;\n\nexport const fastGelu = (context: ComputeContext): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'FastGelu', fastGeluExpression, fastGeluImpl(dataType), undefined,\n context.inputs[0].dataType));\n};\n\nexport const thresholdedRelu = (context: ComputeContext, attributes: AlphaAttributes): number => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'ThresholdedRelu', a => `select(vec4<${dataType}>(0.0), ${a}, ${a} > thresholded_relu_alpha_)`,\n `const thresholded_relu_alpha_ = vec4<${dataType}>(${attributes.alpha});`, attributes.cacheKey));\n return 0;\n};\n\nexport const log = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Log', 'log'));\n};\n\nexport const quickGeluImpl = (varType: string, alpha: number) => `\nconst alpha = vec4<${varType}>(${alpha});\nconst one = ${varType}(1.0);\nconst zero = ${varType}(0.0);\n\nfn quick_gelu_impl(x: vec4<${varType}>) -> vec4<${varType}> {\n let v = x *alpha;\n var x1 : vec4<${varType}>;\n for (var i = 0; i < 4; i = i + 1) {\n if (v[i] >= zero) {\n x1[i] = one / (one + exp(-v[i]));\n } else {\n x1[i] = one - one / (one + exp(v[i]));\n }\n }\n return x * x1;\n}\n`;\n\nexport const quickGeluExpression = (x: string) => `quick_gelu_impl(${x})`;\n\nexport const quickgelu = (context: ComputeContext, attributes: AlphaAttributes): void => {\n const dType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'QuickGelu', quickGeluExpression, quickGeluImpl(dType, attributes.alpha), attributes.cacheKey,\n context.inputs[0].dataType));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType} from './common';\nimport {erfImpl} from './unary-op';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (inputs[0].dims.length !== 3) {\n throw new Error('input should have 3 dimensions');\n }\n\n if (![2560, 5120, 10240].includes(inputs[0].dims[2])) {\n throw new Error('hidden state should be 2560, 5120 or 10240');\n }\n\n if (inputs[1].dims.length !== 1) {\n throw new Error('bias is expected to have 1 dimensions');\n }\n\n if (inputs[0].dims[2] !== inputs[1].dims[0]) {\n throw new Error('last dimension of input and bias are not the same');\n }\n};\n\nconst createBiasSplitGeluProgramInfo = (inputs: readonly TensorView[]): ProgramInfo => {\n const outputShape = inputs[0].dims.slice();\n outputShape[2] = outputShape[2] / 2;\n\n const input = inputVariable('input', inputs[0].dataType, inputs[0].dims, 4);\n const bias = inputVariable('bias', inputs[0].dataType, [inputs[0].dims[2]], 4);\n const output = outputVariable('output', inputs[0].dataType, outputShape, 4);\n\n const outputSize = ShapeUtil.size(outputShape) / 4;\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n const M_SQRT2 = sqrt(2.0);\n const halfChannels = ${inputs[0].dims[2] / 4 / 2}u;\n\n ${shaderHelper.declareVariables(input, bias, output)}\n\n ${erfImpl(dataType)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes(outputSize)}\n let biasIdx = global_idx % halfChannels;\n let batchIndex = global_idx / halfChannels;\n let inputOffset = biasIdx + batchIndex * halfChannels * 2;\n let valueLeft = input[inputOffset] + bias[biasIdx];\n let valueRight = input[inputOffset + halfChannels] + bias[biasIdx + halfChannels];\n let geluRight = valueRight * 0.5 * (erf_vf32(valueRight / M_SQRT2) + 1);\n\n ${output.setByOffset('global_idx', 'valueLeft * geluRight')}\n }`;\n\n return {\n name: 'BiasSplitGelu',\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)}\n }),\n getShaderSource,\n };\n};\n\nexport const biasSplitGelu = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n context.compute(createBiasSplitGeluProgramInfo(context.inputs));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {BroadcastUtil, ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\ntype BuiltinFunctionName = string;\ntype BinaryCustomExpression = (expressionA: string, expressionB: string) => string;\ntype BinaryFunctionCall = BuiltinFunctionName|BinaryCustomExpression|{\n scalar: BinaryCustomExpression;\n vector: BinaryCustomExpression;\n};\n\nconst createBinaryOpProgramShader =\n (shaderHelper: ShaderHelper, dimsA: readonly number[], dimsB: readonly number[], dimsOutput: readonly number[],\n vectorize: boolean, doBroadcast: boolean, sharedDimensionDivisibleBy4: boolean, funcCall: BinaryFunctionCall,\n typeA: number, typeB: number, typeOutput: number, additionalImplementation?: string) => {\n let expressionScalar: BinaryCustomExpression;\n let expressionVector: BinaryCustomExpression;\n if (typeof funcCall === 'string') {\n expressionScalar = expressionVector = (a, b) => `${funcCall}((${a}),(${b}))`;\n } else if (typeof funcCall === 'function') {\n expressionScalar = expressionVector = funcCall;\n } else {\n expressionScalar = funcCall.scalar;\n expressionVector = funcCall.vector;\n }\n\n const output = outputVariable('outputData', typeOutput, dimsOutput.length, 4);\n const a = inputVariable('aData', typeA, dimsA.length, 4);\n const b = inputVariable('bData', typeB, dimsB.length, 4);\n\n let assignment: string;\n if (vectorize) {\n if (doBroadcast) {\n const isAOneElement = ShapeUtil.size(dimsA) === 1;\n const isBOneElement = ShapeUtil.size(dimsB) === 1;\n const aLastDimDivisibleBy4 = dimsA.length > 0 && dimsA[dimsA.length - 1] % 4 === 0;\n const bLastDimDivisibleBy4 = dimsB.length > 0 && dimsB[dimsB.length - 1] % 4 === 0;\n if (isAOneElement || isBOneElement) {\n assignment = output.setByOffset(\n 'global_idx',\n expressionVector(\n isAOneElement ? `${a.type.value}(${a.getByOffset('0')}.x)` : a.getByOffset('global_idx'),\n isBOneElement ? `${b.type.value}(${b.getByOffset('0')}.x)` : b.getByOffset('global_idx')));\n } else {\n assignment = `\n let outputIndices = ${output.offsetToIndices('global_idx * 4u')};\n let offsetA = ${a.broadcastedIndicesToOffset('outputIndices', output)};\n let offsetB = ${b.broadcastedIndicesToOffset('outputIndices', output)};\n ${\n output.setByOffset(\n 'global_idx',\n expressionVector(\n sharedDimensionDivisibleBy4 || aLastDimDivisibleBy4 ?\n a.getByOffset('offsetA / 4u') :\n `${a.type.value}(${a.getByOffset('offsetA / 4u')}[offsetA % 4u])`,\n sharedDimensionDivisibleBy4 || bLastDimDivisibleBy4 ?\n b.getByOffset('offsetB / 4u') :\n `${b.type.value}(${b.getByOffset('offsetB / 4u')}[offsetB % 4u])`))}\n `;\n }\n } else {\n assignment = output.setByOffset(\n 'global_idx', expressionVector(a.getByOffset('global_idx'), b.getByOffset('global_idx')));\n }\n } else {\n if (!doBroadcast) {\n throw new Error('no necessary to use scalar implementation for element-wise binary op implementation.');\n }\n\n const singleAssignment = (resStr: string, x: number, typeCast = '') => {\n const expressionA = `aData[indexA${x}][componentA${x}]`;\n const expressionB = `bData[indexB${x}][componentB${x}]`;\n return `\n let outputIndices${x} = ${output.offsetToIndices(`global_idx * 4u + ${x}u`)};\n let offsetA${x} = ${a.broadcastedIndicesToOffset(`outputIndices${x}`, output)};\n let offsetB${x} = ${b.broadcastedIndicesToOffset(`outputIndices${x}`, output)};\n let indexA${x} = offsetA${x} / 4u;\n let indexB${x} = offsetB${x} / 4u;\n let componentA${x} = offsetA${x} % 4u;\n let componentB${x} = offsetB${x} % 4u;\n ${resStr}[${x}] = ${typeCast}(${expressionScalar(expressionA, expressionB)});\n `;\n };\n if (typeOutput === DataType.bool) {\n assignment = `\n var data = vec4(0);\n ${singleAssignment('data', 0, 'u32')}\n ${singleAssignment('data', 1, 'u32')}\n ${singleAssignment('data', 2, 'u32')}\n ${singleAssignment('data', 3, 'u32')}\n outputData[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`;\n } else {\n assignment = `\n ${singleAssignment('outputData[global_idx]', 0)}\n ${singleAssignment('outputData[global_idx]', 1)}\n ${singleAssignment('outputData[global_idx]', 2)}\n ${singleAssignment('outputData[global_idx]', 3)}\n `;\n }\n }\n\n return `\n ${shaderHelper.registerUniform('vec_size', 'u32').declareVariables(a, b, output)}\n\n ${additionalImplementation ?? ''}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.vec_size')}\n ${assignment}\n }`;\n };\n\nconst createBinaryOpProgramInfo =\n (name: string, cacheKey: string, a: TensorView, b: TensorView, funcCall: BinaryFunctionCall,\n additionalImplementation?: string, outputDataType: number = a.dataType): ProgramInfo => {\n const isBroadcast = !ShapeUtil.areEqual(a.dims, b.dims);\n let outputShape = a.dims;\n let outputSize = ShapeUtil.size(a.dims);\n\n let vectorize = false;\n let sharedDimensionDivisibleBy4 = false;\n\n // TODO: deal with zero-sized tensors (eg. dims=[1,0])\n const cacheKeyAux = [isBroadcast];\n if (isBroadcast) {\n const calculatedShape = BroadcastUtil.calcShape(a.dims, b.dims, false);\n if (!calculatedShape) {\n throw new Error('Can\\'t perform binary op on the given tensors');\n }\n outputShape = calculatedShape;\n outputSize = ShapeUtil.size(outputShape);\n const isAOneElement = ShapeUtil.size(a.dims) === 1;\n const isBOneElement = ShapeUtil.size(b.dims) === 1;\n const aLastDimDivisibleBy4 = a.dims.length > 0 && a.dims[a.dims.length - 1] % 4 === 0;\n const bLastDimDivisibleBy4 = b.dims.length > 0 && b.dims[b.dims.length - 1] % 4 === 0;\n cacheKeyAux.push(isAOneElement);\n cacheKeyAux.push(isBOneElement);\n cacheKeyAux.push(aLastDimDivisibleBy4);\n cacheKeyAux.push(bLastDimDivisibleBy4);\n // check whether vectorize can be enabled\n let sharedDimension = 1;\n for (let i = 1; i < outputShape.length; i++) {\n const dimA = a.dims[a.dims.length - i] ?? 1;\n const dimB = b.dims[b.dims.length - i] ?? 1;\n if (dimA === dimB) {\n sharedDimension *= dimA;\n } else {\n break;\n }\n }\n if (sharedDimension % 4 === 0) {\n sharedDimensionDivisibleBy4 = true;\n vectorize = true;\n } else if (isAOneElement || isBOneElement || aLastDimDivisibleBy4 || bLastDimDivisibleBy4) {\n vectorize = true;\n }\n } else {\n // element-wise\n vectorize = true;\n }\n cacheKeyAux.push(vectorize);\n\n return {\n name,\n shaderCache: {\n hint: cacheKey + cacheKeyAux.map((x) => x.toString()).join('_'),\n inputDependencies: ['rank', 'rank'],\n },\n getShaderSource: (shaderHelper) => createBinaryOpProgramShader(\n shaderHelper, a.dims, b.dims, outputShape, vectorize, isBroadcast, sharedDimensionDivisibleBy4, funcCall,\n a.dataType, b.dataType, outputDataType, additionalImplementation),\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: outputDataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */ / 4 /* component size */)},\n programUniforms: [\n {type: DataType.uint32, data: Math.ceil(ShapeUtil.size(outputShape) / 4)},\n ...createTensorShapeVariables(a.dims, b.dims, outputShape)\n ],\n }),\n };\n };\n\nconst runBinaryOp =\n (context: ComputeContext, name: string, funcCall: BinaryFunctionCall, additionalImplementation?: string,\n cacheKey?: string, outputDataType?: number): void => {\n context.compute(createBinaryOpProgramInfo(\n name, cacheKey ?? '', context.inputs[0], context.inputs[1], funcCall, additionalImplementation,\n outputDataType));\n };\n\nexport const add = (context: ComputeContext): void => {\n runBinaryOp(context, 'Add', (a, b) => `${a}+${b}`);\n};\n\nexport const div = (context: ComputeContext): void => {\n runBinaryOp(context, 'Div', (a, b) => `${a}/${b}`);\n};\n\nexport const equal = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'Equal', ({scalar: (a, b) => `u32(${a}==${b})`, vector: (a, b) => `vec4(${a}==${b})`}), undefined,\n undefined, DataType.bool);\n};\n\nexport const mul = (context: ComputeContext): void => {\n runBinaryOp(context, 'Mul', (a, b) => `${a}*${b}`);\n};\n\nexport const pow = (context: ComputeContext): void => {\n const type = inputVariable('input', context.inputs[0].dataType, context.inputs[0].dims).type.value;\n const roundStr = type === 'i32' ? 'round' : '';\n runBinaryOp(\n context, 'Pow', ({scalar: (a, b) => `pow_custom(${a},${b})`, vector: (a, b) => `pow_vector_custom(${a},${b})`}),\n `\n fn pow_custom(a : ${type}, b : ${type}) -> ${type} {\n if (b == ${type}(0.0)) {\n return ${type}(1.0);\n } else if (a < ${type}(0.0) && f32(b) != floor(f32(b))) {\n return ${type}(pow(f32(a), f32(b))); // NaN\n }\n return select(sign(a), ${type}(1.0), round(f32(abs(b) % ${type}(2.0))) != 1.0) * ${type}(${\n roundStr}(pow(f32(abs(a)), f32(b))));\n }\n fn pow_vector_custom(a : vec4<${type}>, b : vec4<${type}>) -> vec4<${type}> {\n // TODO: implement vectorized pow\n return vec4<${type}>(pow_custom(a.x, b.x), pow_custom(a.y, b.y), pow_custom(a.z, b.z), pow_custom(a.w, b.w));\n }\n `);\n};\n\nexport const sub = (context: ComputeContext): void => {\n runBinaryOp(context, 'Sub', (a, b) => `${a}-${b}`);\n};\n\nexport const greater = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'Greater', ({scalar: (a, b) => `u32(${a}>${b})`, vector: (a, b) => `vec4(${a}>${b})`}), undefined,\n undefined, DataType.bool);\n};\n\nexport const less = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'Less', ({scalar: (a, b) => `u32(${a}<${b})`, vector: (a, b) => `vec4(${a}<${b})`}), undefined,\n undefined, DataType.bool);\n};\n\nexport const greaterOrEqual = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'GreaterOrEqual', ({scalar: (a, b) => `u32(${a}>=${b})`, vector: (a, b) => `vec4(${a}>=${b})`}),\n undefined, undefined, DataType.bool);\n};\n\nexport const lessOrEqual = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'LessOrEqual', ({scalar: (a, b) => `u32(${a}<=${b})`, vector: (a, b) => `vec4(${a}<=${b})`}),\n undefined, undefined, DataType.bool);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface ConcatAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[], axis: number): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('too few inputs');\n }\n const referenceIndex = 0;\n const referenceInput = inputs[referenceIndex];\n const inputType = referenceInput.dataType;\n const inputRank = referenceInput.dims.length;\n inputs.forEach((input, i) => {\n if (i === referenceIndex) {\n return;\n }\n // make sure types of all inputs match\n if (input.dataType !== inputType) {\n throw new Error('input tensors should be one type');\n }\n // make sure the dimensionality of all inputs are the same\n if (input.dims.length !== inputRank) {\n throw new Error('input tensors should have the same shape');\n }\n input.dims.forEach((dim, i) => {\n if (i !== axis && dim !== referenceInput.dims[i]) {\n throw new Error('non concat dimensions must match');\n }\n });\n });\n};\n\nconst calculateInputIndexImpl = (numberOfTensors: number, sizeInConcatAxisStr: string): string => `\n fn calculateInputIndex(index: u32) -> u32 {\n let sizeInConcatAxis = array(${sizeInConcatAxisStr});\n for (var i: u32 = 0u; i < ${numberOfTensors}; i += 1u ) {\n if (index < sizeInConcatAxis[i]) {\n return i;\n }\n }\n return ${numberOfTensors}u;\n }`;\n\nconst assignOutputData = (inputs: readonly IndicesHelper[], output: IndicesHelper) => {\n const numberOfTensors = inputs.length;\n\n const codeLines: string[] = [];\n for (let i = 0; i < numberOfTensors; ++i) {\n const returnSnippet = output.setByOffset('global_idx', inputs[i].getByIndices('indices'));\n if (numberOfTensors === 1) {\n codeLines.push(returnSnippet);\n } else if (i === 0) {\n codeLines.push(`if (inputIndex == ${i}u) { ${returnSnippet} }`);\n } else if (i === numberOfTensors - 1) {\n codeLines.push(`else { ${returnSnippet} }`);\n } else {\n codeLines.push(`else if (inputIndex == ${i}) { ${returnSnippet} }`);\n }\n }\n return codeLines.join('\\n');\n};\n\nconst createConcatProgramInfo =\n (inputs: readonly TensorView[], adjustedAxis: number, outputShape: number[], dataType: DataType): ProgramInfo => {\n const outputSize = ShapeUtil.size(outputShape);\n\n const sizeInConcatAxis = new Array(inputs.length);\n const inputVars = new Array(inputs.length);\n\n let previousSum = 0;\n const inputDependencies: ProgramInputTensorInfoDependency[] = [];\n const inputRanks = [];\n const programUniforms: ProgramUniform[] = [{type: DataType.uint32, data: outputSize}];\n for (let i = 0; i < inputs.length; ++i) {\n previousSum += inputs[i].dims[adjustedAxis];\n sizeInConcatAxis[i] = previousSum;\n inputRanks.push(inputs[i].dims.length);\n inputVars[i] = inputVariable(`input${i}`, dataType, inputRanks[i]);\n inputDependencies.push('rank');\n programUniforms.push({type: DataType.uint32, data: sizeInConcatAxis[i]});\n }\n for (let i = 0; i < inputs.length; ++i) {\n programUniforms.push(...createTensorShapeVariables(inputs[i].dims));\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const output = outputVariable('output', dataType, outputShape.length);\n const indicesAxis = output.indicesGet('indices', adjustedAxis);\n const sizeInConcatAxisStr =\n Array.from(Array(sizeInConcatAxis.length).keys()).map(i => `uniforms.sizeInConcatAxis${i}`).join(',');\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n\n ${(() => {\n shaderHelper.registerUniform('outputSize', 'u32');\n for (let i = 0; i < inputs.length; i++) {\n shaderHelper.registerUniform(`sizeInConcatAxis${i}`, 'u32');\n }\n return shaderHelper.declareVariables(...inputVars, output);\n })()}\n\n ${calculateInputIndexImpl(sizeInConcatAxis.length, sizeInConcatAxisStr)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n\n var indices = ${output.offsetToIndices('global_idx')};\n\n let inputIndex = calculateInputIndex(${indicesAxis});\n if (inputIndex != 0u) {\n let sizeInConcatAxis = array(${sizeInConcatAxisStr});\n ${indicesAxis} -= sizeInConcatAxis[inputIndex - 1u];\n }\n\n ${assignOutputData(inputVars, output)}\n }`;\n\n return {\n name: 'Concat',\n shaderCache: {hint: `${adjustedAxis}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms,\n }),\n getShaderSource,\n };\n };\n\nexport const concat = (context: ComputeContext, attributes: ConcatAttributes): void => {\n const inputs = context.inputs;\n const inputShape = inputs[0].dims;\n const adjustedAxis = ShapeUtil.normalizeAxis(attributes.axis, inputShape.length);\n validateInputs(inputs, adjustedAxis);\n const outputShape = inputShape.slice();\n outputShape[adjustedAxis] =\n inputs.reduce((sum, input) => sum + (input.dims.length > adjustedAxis ? input.dims[adjustedAxis] : 0), 0);\n // 0 length tensors are valid for concat, remove them\n const nonEmptyInputs = inputs.filter(input => ShapeUtil.size(input.dims) > 0);\n context.compute(\n createConcatProgramInfo(nonEmptyInputs, adjustedAxis, outputShape, inputs[0].dataType), {inputs: nonEmptyInputs});\n};\n\nexport const parseConcatAttributes = (attributes: Record): ConcatAttributes =>\n createAttributeWithCacheKey({axis: attributes.axis as number});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {MAX_CLIP, MIN_CLIP} from '../../util';\nimport {ProgramUniform} from '../types';\n\nimport {UniformsArrayType} from './common';\n\nexport interface InternalActivationAttributes {\n readonly activation: string;\n readonly clipMin?: number;\n readonly clipMax?: number;\n readonly alpha?: number;\n readonly beta?: number;\n}\n\nexport const getActivationSnippet =\n (attributes: InternalActivationAttributes, valueType: string, baseType = 'f32'): string => {\n switch (attributes.activation) {\n case 'Relu':\n return `value = max(value, ${valueType}(0.0));`;\n case 'Sigmoid':\n return `value = (${valueType}(1.0) / (${valueType}(1.0) + exp(-value)));`;\n case 'Clip':\n return `value = clamp(value, ${valueType}(${baseType}(uniforms.clip_min)), ${valueType}(${\n baseType}(uniforms.clip_max)));`;\n case 'HardSigmoid':\n return `value = max(${valueType}(0.0), min(${valueType}(1.0), ${baseType}(uniforms.alpha) * value + ${\n baseType}(uniforms.beta)));`;\n case 'LeakyRelu':\n return `value = select(${baseType}(uniforms.alpha) * value, value, value >= ${valueType}(0.0));`;\n case '':\n return '';\n // TODO: adding other activations that can be fused.\n default:\n throw new Error(`Unsupported activation ${attributes.activation}`);\n }\n };\n\nexport const appendActivationUniformsData =\n (attributes: InternalActivationAttributes, programUniform: ProgramUniform[]) => {\n if (attributes.activation === 'Clip') {\n programUniform.push(\n {type: DataType.float, data: attributes.clipMax!}, {type: DataType.float, data: attributes.clipMin!});\n } else if (attributes.activation === 'HardSigmoid') {\n programUniform.push(\n {type: DataType.float, data: attributes.alpha!}, {type: DataType.float, data: attributes.beta!});\n } else if (attributes.activation === 'LeakyRelu') {\n programUniform.push({type: DataType.float, data: attributes.alpha!});\n }\n };\n\nexport const appendActivationUniforms = (attributes: InternalActivationAttributes, uniforms: UniformsArrayType) => {\n if (attributes.activation === 'Clip') {\n uniforms.push({name: 'clip_max', type: 'f32'}, {name: 'clip_min', type: 'f32'});\n } else if (attributes.activation === 'HardSigmoid') {\n uniforms.push({name: 'alpha', type: 'f32'}, {name: 'beta', type: 'f32'});\n } else if (attributes.activation === 'LeakyRelu') {\n uniforms.push({name: 'alpha', type: 'f32'});\n }\n};\n\nexport const parseInternalActivationAttributes =\n (attributes: Record|undefined): InternalActivationAttributes => {\n const activation = attributes?.activation as string || '';\n if (activation === 'HardSigmoid') {\n const [alpha, beta] = attributes?.activation_params as [number, number] || [0.2, 0.5];\n return {activation, alpha, beta};\n } else if (activation === 'Clip') {\n const [clipMin, clipMax] = attributes?.activation_params as [number, number] || [MIN_CLIP, MAX_CLIP];\n return {activation, clipMax, clipMin};\n } else if (activation === 'LeakyRelu') {\n const [alpha] = attributes?.activation_params as [number] || [0.01];\n return {activation, alpha};\n }\n return {activation};\n };\n", "/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/activation_util.ts\n//\n// modified to fit the needs of the project\n\nexport const typeSnippet = (component: number, dataType: string) => {\n switch (component) {\n case 1:\n return dataType;\n case 2:\n return `vec2<${dataType}>`;\n case 3:\n return `vec3<${dataType}>`;\n case 4:\n return `vec4<${dataType}>`;\n default:\n throw new Error(`${component}-component is not supported.`);\n }\n};\n\nexport const biasSnippet = (hasBias: boolean): string => `\n ${hasBias ? 'value = value + getBiasByOutputCoords(coords);' : ''}\n `;\n", "/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-core/src/ops/conv_util.ts\n//\n// modified to fit the needs of the project\n\nexport const utilFunctions = (strideStr: string) => (`\nfn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 {\n return dot(coords, vec4(\n shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1));\n}\nfn getOutputIndexFromCoords(coords : vec4) -> i32 {\n return dot(coords, vec4(\n i32(${strideStr}.x), i32(${strideStr}.y), i32(${strideStr}.z), 1));\n}\n`);\n", "/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/matmul_packed_webgpu.ts\n//\n// modified to fit the needs of the project\n\nimport {DataType} from '../../../../wasm-common';\nimport {TensorView} from '../../../tensor-view';\nimport {ShapeUtil} from '../../../util';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, getBroadcastDims, IndicesHelper, inputVariable, internalVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet, InternalActivationAttributes} from '../fuse-utils';\n\nimport {typeSnippet} from './activation_util';\n\nconst writeDataToSubAVec4Snippet = (transpose: boolean, batchDims?: IndicesHelper) => {\n if (transpose) {\n return `\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n kStart + inputRow,\n globalRowStart / innerElementSize + inputCol${batchDims ? ', batchIndices' : ''});\n `;\n\n } else {\n return `\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n globalRow + innerRow,\n kStart / innerElementSize + inputCol${batchDims ? ', batchIndices' : ''});\n `;\n }\n};\n\nconst calculateResultSnippet = (transposeA: boolean, innerElementSize: number) => {\n if (transposeA) {\n return `\n let ACached0 = mm_Asub[k * innerElementSize][localRow];\n let ACached1 = mm_Asub[k * innerElementSize + 1][localRow];\n let ACached2 = mm_Asub[k * innerElementSize + 2][localRow];\n ${innerElementSize === 3 ? '' : 'let ACached3 = mm_Asub[k * innerElementSize + 3][localRow];'}\n for (var i = 0; i < rowPerThread; i = i + 1) {\n acc[i] = BCached0 * ACached0[i] + acc[i];\n acc[i] = BCached1 * ACached1[i] + acc[i];\n acc[i] = BCached2 * ACached2[i] + acc[i];\n ${innerElementSize === 3 ? '' : 'acc[i] = BCached3 * ACached3[i] + acc[i];'}\n }`;\n } else {\n return `\n for (var i = 0; i < rowPerThread; i = i + 1) {\n let ACached = mm_Asub[tileRow + i][k];\n acc[i] = BCached0 * ACached.x + acc[i];\n acc[i] = BCached1 * ACached.y + acc[i];\n acc[i] = BCached2 * ACached.z + acc[i];\n ${innerElementSize === 3 ? '' : 'acc[i] = BCached3 * ACached.w + acc[i];'}\n }`;\n }\n};\n\nexport const makeMatMulPackedVec4Source =\n (workPerThread: number[], workgroupSize: [number, number, number], type = 'f32', batchDims?: IndicesHelper,\n transposeA = false, tileInner = 32, splitK = false, splitedDimInner = 32): string => {\n const tileAOuter = workgroupSize[1] * workPerThread[1];\n const tileBOuter = workgroupSize[0] * workPerThread[0];\n const tileAWidth = transposeA ? tileAOuter : tileInner;\n const tileAHight = transposeA ? tileInner : tileAOuter;\n const innerElementSize = tileAWidth / workgroupSize[0];\n const rowPerThreadB = tileInner / workgroupSize[1];\n\n if (!(((transposeA && innerElementSize === 4 && workPerThread[1] === 4) ||\n (!transposeA && (innerElementSize === 3 || innerElementSize === 4))) &&\n tileAWidth % workgroupSize[0] === 0 && tileInner % workgroupSize[1] === 0 && workPerThread[0] === 4)) {\n throw new Error(`If transposeA ${transposeA} is true, innerElementSize ${\n innerElementSize} and workPerThread[1] ${workPerThread[1]} must be 4.\n Otherwise, innerElementSize ${innerElementSize} must be 3 or 4.\n tileAWidth ${tileAWidth} must be divisible by workgroupSize[0]${workgroupSize[0]}. tileInner ${\n tileInner} must be divisible by workgroupSize[1] ${workgroupSize[1]}. colPerThread ${\n workPerThread[0]} must be 4.`);\n }\n return `\nvar mm_Asub: array, ${tileAWidth / innerElementSize}>, ${tileAHight}>;\nvar mm_Bsub: array, ${tileBOuter / workPerThread[0]}>, ${tileInner}>;\n\nconst rowPerThread = ${workPerThread[1]};\nconst colPerThread = ${workPerThread[0]};\nconst innerElementSize = ${innerElementSize};\nconst tileInner = ${tileInner};\n\n@compute @workgroup_size(${workgroupSize[0]}, ${workgroupSize[1]}, ${workgroupSize[2]})\nfn main(@builtin(local_invocation_id) localId : vec3,\n @builtin(global_invocation_id) globalId : vec3,\n @builtin(workgroup_id) workgroupId : vec3) {\n let localRow = i32(localId.y);\n let tileRow = localRow * rowPerThread;\n let tileCol = i32(localId.x);\n\n let globalRow =i32(globalId.y) * rowPerThread;\n let globalCol = i32(globalId.x);\n let batch = ${splitK ? '0' : 'i32(globalId.z)'};\n ${batchDims ? `let batchIndices = ${batchDims.offsetToIndices('u32(batch)')};` : ''}\n let globalRowStart = i32(workgroupId.y) * ${tileAOuter};\n\n let num_tiles = ${splitK ? `${Math.ceil(splitedDimInner / tileInner)}` : '(uniforms.dim_inner - 1) / tileInner + 1'};\n var kStart = ${splitK ? `i32(globalId.z) * ${splitedDimInner}` : '0'};\n\n var acc: array, rowPerThread>;\n\n // Loop over shared dimension.\n let tileRowB = localRow * ${rowPerThreadB};\n for (var t = 0; t < num_tiles; t = t + 1) {\n // Load one tile of A into local memory.\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n let inputRow = tileRow + innerRow;\n let inputCol = tileCol;\n ${writeDataToSubAVec4Snippet(transposeA, batchDims)}\n }\n\n // Load one tile of B into local memory.\n for (var innerRow = 0; innerRow < ${rowPerThreadB}; innerRow = innerRow + 1) {\n let inputRow = tileRowB + innerRow;\n let inputCol = tileCol;\n mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol${\n batchDims ? ', batchIndices' : ''});\n }\n kStart = kStart + tileInner;\n workgroupBarrier();\n\n // Compute acc values for a single thread.\n for (var k = 0; k < tileInner / innerElementSize; k = k + 1) {\n let BCached0 = mm_Bsub[k * innerElementSize][tileCol];\n let BCached1 = mm_Bsub[k * innerElementSize + 1][tileCol];\n let BCached2 = mm_Bsub[k * innerElementSize + 2][tileCol];\n ${innerElementSize === 3 ? '' : 'let BCached3 = mm_Bsub[k * innerElementSize + 3][tileCol];'}\n\n ${calculateResultSnippet(transposeA, innerElementSize)}\n }\n\n workgroupBarrier();\n }\n\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]);\n }\n}`;\n };\n\nconst writeDataToSubASnippet = (transpose: boolean, batchDims?: IndicesHelper) => {\n if (transpose) {\n return `\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n kStart + inputRow,\n globalRowStart + inputCol${batchDims ? ', batchIndices' : ''});\n `;\n\n } else {\n return `\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n globalRowStart + inputRow,\n kStart + inputCol${batchDims ? ', batchIndices' : ''});\n `;\n }\n};\n\nconst readDataFromSubASnippet = (transposeA: boolean) =>\n transposeA ? 'let ACached = mm_Asub[k][tileRow + innerRow];' : 'let ACached = mm_Asub[tileRow + innerRow][k];';\n\n// sequentialAccessByThreads means sequential data in memory is accessed by\n// threads, instead of a single thread (default behavior).\nexport const makeMatMulPackedSource =\n (workPerThread: number[], workgroupSize: [number, number, number], type = 'f32', batchDims?: IndicesHelper,\n transposeA = false, tileInner = 32, splitK = false, splitedDimInner = 32,\n sequentialAccessByThreads = false): string => {\n const tileAOuter = workPerThread[1] * workgroupSize[1];\n const tileBOuter = workPerThread[0] * workgroupSize[0];\n const tileAWidth = transposeA ? tileAOuter : tileInner;\n const tileAHight = transposeA ? tileInner : tileAOuter;\n\n if (!(tileAHight % workgroupSize[1] === 0 && tileAWidth % workgroupSize[0] === 0 &&\n tileInner % workgroupSize[1] === 0)) {\n throw new Error(`tileAHight ${tileAHight} must be divisible by workgroupSize[1]${\n workgroupSize[1]}, tileAWidth ${tileAWidth} must be divisible by workgroupSize[0]${\n workgroupSize[0]}, tileInner ${tileInner} must be divisible by workgroupSize[1]${workgroupSize[1]}`);\n }\n const rowPerThreadA = tileAHight / workgroupSize[1];\n const colPerThreadA = tileAWidth / workgroupSize[0];\n const rowPerThreadB = tileInner / workgroupSize[1];\n const matmulSnippet = sequentialAccessByThreads ?\n `\n let localRow = i32(localId.y);\n let localCol = i32(localId.x);\n let globalRowStart = i32(workgroupId.y) * ${tileAOuter};\n let globalColStart = i32(workgroupId.x) * ${tileBOuter};\n\n // Loop over shared dimension.\n for (var t = 0; t < num_tiles; t = t + 1) {\n // Load one tile of A into local memory.\n for (var inputRow = localRow; inputRow < ${tileAHight}; inputRow = inputRow + ${workgroupSize[1]}) {\n for (var inputCol = localCol; inputCol < ${tileAWidth}; inputCol = inputCol + ${workgroupSize[0]}) {\n ${writeDataToSubASnippet(transposeA, batchDims)}\n }\n }\n // Load one tile of B into local memory.\n for (var inputRow = localRow; inputRow < ${tileInner}; inputRow = inputRow + ${workgroupSize[1]}) {\n for (var inputCol = localCol; inputCol < ${tileBOuter}; inputCol = inputCol + ${workgroupSize[0]}) {\n mm_Bsub[inputRow][inputCol] = mm_readB(batch,\n kStart + inputRow,\n globalColStart + inputCol${batchDims ? ', batchIndices' : ''});\n }\n }\n kStart = kStart + tileInner;\n workgroupBarrier();\n\n // Compute acc values for a single thread.\n var BCached : array<${type}, colPerThread>;\n for (var k = 0; k < tileInner; k = k + 1) {\n for (var inner = 0; inner < colPerThread; inner = inner + 1) {\n BCached[inner] = mm_Bsub[k][localCol + inner * ${workgroupSize[0]}];\n }\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n let ACached = ${\n transposeA ? `mm_Asub[k][localRow + innerRow * ${workgroupSize[1]}];` :\n `mm_Asub[localRow + innerRow * ${workgroupSize[1]}][k];`}\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n acc[innerRow][innerCol] = acc[innerRow][innerCol] +\n ACached * BCached[innerCol];\n }\n }\n }\n workgroupBarrier();\n }\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n let gRow = globalRowStart + localRow + innerRow * ${workgroupSize[1]};\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n let gCol = globalColStart + localCol + innerCol * ${workgroupSize[0]};\n mm_write(batch, gRow, gCol, acc[innerRow][innerCol]);\n }\n }\n ` :\n `\nlet tileRow = i32(localId.y) * rowPerThread;\nlet tileCol = i32(localId.x) * colPerThread;\n\nlet globalRow = i32(globalId.y) * rowPerThread;\nlet globalCol = i32(globalId.x) * colPerThread;\nlet globalRowStart = i32(workgroupId.y) * ${tileAOuter};\n\nlet tileRowA = i32(localId.y) * ${rowPerThreadA};\nlet tileColA = i32(localId.x) * ${colPerThreadA};\nlet tileRowB = i32(localId.y) * ${rowPerThreadB};\n// Loop over shared dimension.\nfor (var t = 0; t < num_tiles; t = t + 1) {\n // Load one tile of A into local memory.\n for (var innerRow = 0; innerRow < ${rowPerThreadA}; innerRow = innerRow + 1) {\n for (var innerCol = 0; innerCol < ${colPerThreadA}; innerCol = innerCol + 1) {\n let inputRow = tileRowA + innerRow;\n let inputCol = tileColA + innerCol;\n ${writeDataToSubASnippet(transposeA, batchDims)}\n }\n }\n\n // Load one tile of B into local memory.\n for (var innerRow = 0; innerRow < ${rowPerThreadB}; innerRow = innerRow + 1) {\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n let inputRow = tileRowB + innerRow;\n let inputCol = tileCol + innerCol;\n mm_Bsub[inputRow][inputCol] = mm_readB(batch,\n kStart + inputRow,\n globalCol + innerCol${batchDims ? ', batchIndices' : ''});\n }\n }\n kStart = kStart + tileInner;\n workgroupBarrier();\n\n // Compute acc values for a single thread.\n var BCached : array<${type}, colPerThread>;\n for (var k = 0; k < tileInner; k = k + 1) {\n for (var inner = 0; inner < colPerThread; inner = inner + 1) {\n BCached[inner] = mm_Bsub[k][tileCol + inner];\n }\n\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n ${readDataFromSubASnippet(transposeA)}\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol];\n }\n }\n }\n\n workgroupBarrier();\n}\n\nfor (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n mm_write(batch, globalRow + innerRow, globalCol + innerCol,\n acc[innerRow][innerCol]);\n }\n}\n`;\n\n return `\n var mm_Asub : array, ${tileAHight}>;\n var mm_Bsub : array, ${tileInner}>;\n const rowPerThread = ${workPerThread[1]};\n const colPerThread = ${workPerThread[0]};\n const tileInner = ${tileInner};\n\n@compute @workgroup_size(${workgroupSize[0]}, ${workgroupSize[1]}, ${workgroupSize[2]})\nfn main(@builtin(local_invocation_id) localId : vec3,\n @builtin(global_invocation_id) globalId : vec3,\n @builtin(workgroup_id) workgroupId : vec3) {\n let batch = ${splitK ? '0' : 'i32(globalId.z)'};\n ${batchDims ? `let batchIndices = ${batchDims.offsetToIndices('u32(batch)')};` : ''}\n let num_tiles = ${\n splitK ? `${Math.ceil(splitedDimInner / tileInner)}` : '(uniforms.dim_inner - 1) / tileInner + 1'};\n var kStart = ${splitK ? `i32(globalId.z) * ${splitedDimInner}` : '0'};\n\n var acc : array, rowPerThread>;\n ${matmulSnippet}\n }\n`;\n };\n\nconst matMulReadWriteFnSource =\n (component: number, hasBias: boolean, applyActivation: string, variables: IndicesHelper[],\n batchShapes: Array, isChannelsLast = false): string => {\n const [batchAShape, batchBShape, batchShape] = batchShapes;\n const [batchVariable, aVariable, bVariable, outputVariable] = variables;\n const broadCastADims = getBroadcastDims(batchAShape, batchShape);\n const broadCastBDims = getBroadcastDims(batchBShape, batchShape);\n const dataType = tensorTypeToWsglStorageType(variables[0].type.tensor);\n const getAIndices = () => {\n const aRank = aVariable.rank;\n const batchRank = batchVariable.rank;\n let resStr = `var aIndices: ${aVariable.type.indices};`;\n for (let i = aRank - 2 - 1, j = batchRank - 1; i >= 0; i--, j--) {\n resStr += `\\naIndices[${i}] = ${batchRank > 1 ? `batchIndices[${j}]` : 'batchIndices'};`;\n }\n broadCastADims.forEach(i => {\n resStr += `\\naIndices[${i}] = 0;`;\n });\n resStr += `\\naIndices[${aRank - 2}] = u32(row);\n aIndices[${aRank - 1}] = u32(colIn);`;\n return resStr;\n };\n const getBIndices = () => {\n const bRank = bVariable.rank;\n const batchRank = batchVariable.rank;\n let resStr = `var bIndices: ${bVariable.type.indices};`;\n for (let i = bRank - 2 - 1, j = batchRank - 1; i >= 0; i--, j--) {\n resStr += `\\nbIndices[${i}] = ${batchRank > 1 ? `batchIndices[${j}]` : 'batchIndices'};`;\n }\n broadCastBDims.forEach(i => {\n resStr += `\\nbIndices[${i}] = 0;`;\n });\n resStr += `\\nbIndices[${bRank - 2}] = u32(row);\n bIndices[${bRank - 1}] = u32(colIn);`;\n return resStr;\n };\n const source = `\n fn mm_readA(batch: i32, row: i32, colIn: i32, batchIndices: ${batchVariable.type.indices}) -> ${\n typeSnippet(component, dataType)} {\n var value = ${typeSnippet(component, dataType)}(0.0);\n let col = colIn * ${component};\n if(row < uniforms.dim_a_outer && col < uniforms.dim_inner)\n {\n ${getAIndices()}\n value = ${aVariable.getByIndices('aIndices')};\n }\n return value;\n }\n\n fn mm_readB(batch: i32, row: i32, colIn: i32, batchIndices: ${batchVariable.type.indices}) -> ${\n typeSnippet(component, dataType)} {\n var value = ${typeSnippet(component, dataType)}(0.0);\n let col = colIn * ${component};\n if(row < uniforms.dim_inner && col < uniforms.dim_b_outer)\n {\n ${getBIndices()}\n value = ${bVariable.getByIndices('bIndices')};\n }\n return value;\n }\n\n fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${typeSnippet(component, dataType)}) {\n let col = colIn * ${component};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) {\n var value = valueIn;\n let coords = vec3(batch, row, colIn);\n ${\n hasBias ?\n `value = value + ${isChannelsLast ? 'bias[colIn]' : `${typeSnippet(component, dataType)}(bias[row])`};` :\n '' }\n ${applyActivation}\n ${outputVariable.setByIndices('vec3(coords)', 'value')}\n }\n }\n `;\n return source;\n };\n\nexport const createMatmulProgramInfo =\n (inputs: readonly TensorView[], activationAttributes: InternalActivationAttributes, outputShape: readonly number[],\n reshapedOutputShape?: readonly number[],\n isChannelsLast = false /* only used for conv2dByMatMul*/): ProgramInfo => {\n const aShape = inputs[0].dims;\n const bShape = inputs[1].dims;\n const outerDimsA = aShape.slice(0, -2);\n const outerDimsB = bShape.slice(0, -2);\n const outerDims = reshapedOutputShape ? reshapedOutputShape.slice(0, -2) : outputShape.slice(0, -2);\n const batchSize = ShapeUtil.size(outerDims);\n const dimAOuter = aShape[aShape.length - 2];\n const dimInner = aShape[aShape.length - 1];\n const dimBOuter = bShape[bShape.length - 1];\n const isVec4 = dimInner % 4 === 0 && dimBOuter % 4 === 0;\n\n // TODO: fine tune size\n const elementsPerThread = dimAOuter <= 8 ? [4, 1, 1] : [4, 4, 1];\n const workgroupSize: [number, number, number] = [8, 8, 1];\n const dispatch = [\n Math.ceil(dimBOuter / workgroupSize[0] / elementsPerThread[0]),\n Math.ceil(dimAOuter / workgroupSize[1] / elementsPerThread[1]),\n Math.ceil(batchSize / workgroupSize[2] / elementsPerThread[2])\n ];\n\n const components = isVec4 ? 4 : 1;\n const aShapeTemp = [...outerDimsA, dimAOuter, dimInner / components];\n const aRank = aShapeTemp.length;\n const bShapeTemp = [...outerDimsB, dimInner, dimBOuter / components];\n const bRank = bShapeTemp.length;\n const outputShapeTemp = [batchSize, dimAOuter, dimBOuter / components];\n const programUniforms: ProgramUniform[] = [\n {type: DataType.int32, data: dimAOuter}, {type: DataType.int32, data: dimBOuter},\n {type: DataType.int32, data: dimInner}\n ];\n appendActivationUniformsData(activationAttributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(outerDims, aShapeTemp, bShapeTemp));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n\n const hasBias = inputs.length > 2;\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShapeTemp));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const batchRank = outerDims.length;\n const batchDims = internalVariable('batchDims', inputs[0].dataType, batchRank, 1);\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n\n const A = inputVariable('a', inputs[0].dataType, aRank, components);\n const B = inputVariable('b', inputs[1].dataType, bRank, components);\n const output = outputVariable('result', inputs[0].dataType, outputShapeTemp.length, components);\n const inputVariables = [A, B];\n if (hasBias) {\n const biasComponents = isChannelsLast ? components : 1;\n inputVariables.push(inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, biasComponents));\n }\n const uniforms: UniformsArrayType =\n [{name: 'dim_a_outer', type: 'i32'}, {name: 'dim_b_outer', type: 'i32'}, {name: 'dim_inner', type: 'i32'}];\n appendActivationUniforms(activationAttributes, uniforms);\n const baseType = tensorTypeToWsglStorageType(output.type.tensor);\n const applyActivation = getActivationSnippet(activationAttributes, output.type.value, baseType);\n const declareFunctions = matMulReadWriteFnSource(\n components, hasBias, applyActivation, [batchDims, A, B, output], [outerDimsA, outerDimsB, outerDims],\n isChannelsLast);\n return `\n ${\n shaderHelper.registerUniforms(uniforms).registerInternalVariables(batchDims).declareVariables(\n ...inputVariables, output)}\n ${declareFunctions}\n ${\n isVec4 ? makeMatMulPackedVec4Source(elementsPerThread, workgroupSize, dataType, batchDims) :\n makeMatMulPackedSource(elementsPerThread, workgroupSize, dataType, batchDims)}\n `;\n };\n return {\n name: 'MatMul',\n shaderCache: {\n hint: `${elementsPerThread};${activationAttributes.activation};${isVec4};${isChannelsLast}`,\n inputDependencies\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n programUniforms\n }),\n getShaderSource,\n };\n };\n", "/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/conv2d_mm_webgpu.ts\n//\n// modified to fit the needs of the project\n\nimport {DataType} from '../../../../wasm-common';\nimport {LOG_DEBUG} from '../../../log';\nimport {TensorView} from '../../../tensor-view';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {ConvAttributes} from '../conv';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet} from '../fuse-utils';\n\nimport {biasSnippet, typeSnippet} from './activation_util';\nimport {utilFunctions} from './conv_util';\nimport {makeMatMulPackedSource, makeMatMulPackedVec4Source} from './matmul_packed_webgpu';\n\nconst conv2dCommonSnippet =\n (isChannelsLast: boolean, fitAOuter: boolean, fitBOuter: boolean, fitInner: boolean, addBias = false,\n attributes: ConvAttributes, innerElementSizeX = 4, innerElementSizeW = 4, innerElementSize = 4,\n dataType = 'f32'): string => {\n const getXSnippet = (innerElementSize: number) => {\n switch (innerElementSize) {\n case 1:\n return 'resData = x[xIndex];';\n case 3:\n return `resData = vec3<${dataType}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;\n case 4:\n return 'resData = x[xIndex / 4];';\n default:\n throw new Error(`innerElementSize ${innerElementSize} is not supported.`);\n }\n };\n const getWSnippet = (innerElementSize: number) => {\n switch (innerElementSize) {\n case 1:\n return 'return w[row * i32(uniforms.w_shape[3]) + colIn];';\n case 4:\n return 'return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];';\n default:\n throw new Error(`innerElementSize ${innerElementSize} is not supported.`);\n }\n };\n const coordASnippet = isChannelsLast ? `\n let coord = vec4(batch, xRow, xCol, xCh);\n ` :\n `\n let coord = vec4(batch, xCh, xRow, xCol);\n `;\n\n const coordResSnippet = isChannelsLast ? `\n let coords = vec4(\n batch,\n row / outWidth,\n row % outWidth,\n col);\n ` :\n `\n let coords = vec4(\n batch,\n row,\n col / outWidth,\n col % outWidth);\n `;\n\n const xHeight = isChannelsLast ? 'i32(uniforms.x_shape[1])' : 'i32(uniforms.x_shape[2])';\n const xWidth = isChannelsLast ? 'i32(uniforms.x_shape[2])' : 'i32(uniforms.x_shape[3])';\n const row = isChannelsLast ? 'row' : 'col';\n const col = isChannelsLast ? 'col' : 'row';\n const readXSnippet = `\n let inChannels = i32(uniforms.w_shape[2]);\n let outWidth = ${isChannelsLast ? 'i32(uniforms.result_shape[2])' : 'i32(uniforms.result_shape[3])'};\n let outRow = ${row} / outWidth;\n let outCol = ${row} % outWidth;\n\n let WRow = ${col} / (i32(uniforms.w_shape[1]) * inChannels);\n let WCol = ${col} / inChannels % i32(uniforms.w_shape[1]);\n let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0];\n let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1];\n let xCh = ${col} % inChannels;\n var resData = ${typeSnippet(innerElementSizeX, dataType)}(0.0);\n // The bounds checking is always needed since we use it to pad zero for\n // the 'same' padding type.\n if (xRow >= 0 && xRow < ${xHeight} && xCol >= 0 && xCol < ${xWidth}) {\n ${coordASnippet}\n let xIndex = getIndexFromCoords4D(coord, vec4(uniforms.x_shape));\n ${getXSnippet(innerElementSizeX)}\n }\n return resData;`;\n\n const sampleX = isChannelsLast ? (fitAOuter && fitInner ? `\n let col = colIn * ${innerElementSizeX};\n ${readXSnippet}` :\n `\n let col = colIn * ${innerElementSizeX};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) {\n ${readXSnippet}\n }\n return ${typeSnippet(innerElementSizeX, dataType)}(0.0);`) :\n (fitInner && fitBOuter ? `\n let col = colIn * ${innerElementSizeX};\n ${readXSnippet}` :\n `\n let col = colIn * ${innerElementSizeX};\n if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) {\n ${readXSnippet}\n }\n return ${typeSnippet(innerElementSizeX, dataType)}(0.0);`);\n\n const sampleW = `${getWSnippet(innerElementSizeW)}`;\n\n const resType = typeSnippet(innerElementSize, dataType);\n const aType =\n isChannelsLast ? typeSnippet(innerElementSizeX, dataType) : typeSnippet(innerElementSizeW, dataType);\n const bType =\n isChannelsLast ? typeSnippet(innerElementSizeW, dataType) : typeSnippet(innerElementSizeX, dataType);\n const applyActivation = getActivationSnippet(attributes, resType, dataType);\n const userCode = `\n fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${aType} {\n ${isChannelsLast ? sampleX : sampleW}\n }\n\n fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${bType} {\n ${isChannelsLast ? sampleW : sampleX}\n }\n\n fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${resType}) {\n let col = colIn * ${innerElementSize};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer)\n {\n var value = valueIn;\n let outWidth = ${isChannelsLast ? 'i32(uniforms.result_shape[2])' : 'i32(uniforms.result_shape[3])'};\n ${coordResSnippet}\n ${biasSnippet(addBias)}\n ${applyActivation}\n setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value);\n }\n }`;\n return userCode;\n };\n\nexport const createConv2DMatMulProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvAttributes, outputShape: readonly number[], dimAOuter: number,\n dimBOuter: number, dimInner: number, hasBias: boolean, sequentialAccessByThreads: boolean): ProgramInfo => {\n const isChannelsLast = attributes.format === 'NHWC';\n const inChannels = isChannelsLast ? inputs[0].dims[3] : inputs[0].dims[1];\n const batchSize = outputShape[0];\n const outWidth = isChannelsLast ? outputShape[2] : outputShape[3];\n const outHeight = isChannelsLast ? outputShape[1] : outputShape[2];\n const outChannels = isChannelsLast ? outputShape[3] : outputShape[1];\n // TODO: enable vec4 for NCHW\n const isVec4 = isChannelsLast && (inChannels % 4 === 0 || inChannels % 3 === 0) && outChannels % 4 === 0;\n\n // TODO: fine tune size\n const dispatchX = isChannelsLast ? outChannels : outWidth * outHeight;\n const dispatchY = isChannelsLast ? outWidth * outHeight : outChannels;\n const workGroupSize: [number, number, number] = [8, 8, 1];\n const elementsPerThread = dimAOuter <= 8 ? [4, 1, 1] : [4, 4, 1];\n const dispatch = [\n Math.ceil(dispatchX / workGroupSize[0] / elementsPerThread[0]),\n Math.ceil(dispatchY / workGroupSize[1] / elementsPerThread[1]),\n Math.ceil(batchSize / workGroupSize[2] / elementsPerThread[2])\n ];\n\n LOG_DEBUG('verbose', () => `[conv2d_mm_webgpu] dispatch = ${dispatch}`);\n\n const innerElementSize = isVec4 ? (isChannelsLast && inChannels % 4 !== 0 ? 3 : 4) : 1;\n const tileAOuter = workGroupSize[1] * elementsPerThread[1];\n const tileBOuter = workGroupSize[0] * elementsPerThread[0];\n const tileInner = Math.max(workGroupSize[0] * innerElementSize, workGroupSize[1]);\n const fitAOuter = dimAOuter % tileAOuter === 0;\n const fitBOuter = dimBOuter % tileBOuter === 0;\n const fitInner = dimInner % tileInner === 0;\n const elementsSize = isVec4 ? [innerElementSize, 4, 4] : [1, 1, 1];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.int32, data: dimAOuter}, {type: DataType.int32, data: dimBOuter},\n {type: DataType.int32, data: dimInner}, {type: DataType.int32, data: [attributes.pads[0], attributes.pads[1]]},\n {type: DataType.int32, data: attributes.strides}, {type: DataType.int32, data: attributes.dilations}\n ];\n appendActivationUniformsData(attributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(inputs[0].dims, inputs[1].dims));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const uniforms: UniformsArrayType = [\n {name: 'dim_a_outer', type: 'i32'}, {name: 'dim_b_outer', type: 'i32'}, {name: 'dim_inner', type: 'i32'},\n {name: 'pad', type: 'i32', length: 2}, {name: 'stride', type: 'i32', length: 2},\n {name: 'dilation', type: 'i32', length: 2}\n ];\n appendActivationUniforms(attributes, uniforms);\n\n // TODO: support component 2, 3.\n const components = isVec4 ? 4 : 1;\n const t = tensorTypeToWsglStorageType(inputs[0].dataType);\n let declareFunctions = `\n fn setOutputAtIndex(flatIndex : i32, value : ${isVec4 ? `vec4<${t}>` : t}) {\n result[flatIndex] = ${isVec4 ? `vec4<${t}>` : t}(value);\n }\n fn setOutputAtCoords(d0 : i32, d1 : i32, d2 : i32, d3 : i32, value : ${isVec4 ? `vec4<${t}>` : t}) {\n let flatIndex = getOutputIndexFromCoords(vec4(d0, d1, d2, d3));\n setOutputAtIndex(flatIndex ${isVec4 ? '/ 4' : ''}, value);\n }`;\n const x = inputVariable(\n 'x', inputs[0].dataType, inputs[0].dims.length, innerElementSize === 3 ? 1 : innerElementSize);\n const w = inputVariable('w', inputs[1].dataType, inputs[1].dims.length, components);\n const inputVariables = [x, w];\n const output = outputVariable('result', inputs[0].dataType, outputShape.length, components);\n if (hasBias) {\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, components);\n inputVariables.push(bias);\n declareFunctions += `\n fn getBiasByOutputCoords(coords : vec4) -> ${isVec4 ? `vec4<${t}>` : t} {\n return bias[coords.${isChannelsLast ? 'w' : 'y'}${isVec4 ? '/ 4' : ''}];\n }`;\n }\n\n return `\n ${utilFunctions('uniforms.result_strides')}\n //struct Uniforms { xShape : vec4, wShape : vec4, outShape : vec4,\n // outShapeStrides: vec3, filterDims : vec2, pad : vec2, stride : vec2,\n // dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32 };\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)}\n ${declareFunctions}\n ${\n conv2dCommonSnippet(\n isChannelsLast, fitAOuter, fitBOuter, fitInner, hasBias, attributes, elementsSize[0], elementsSize[1],\n elementsSize[2], t)}\n ${\n isVec4 ?\n makeMatMulPackedVec4Source(elementsPerThread, workGroupSize, t, undefined, !isChannelsLast, tileInner) :\n makeMatMulPackedSource(\n elementsPerThread, workGroupSize, t, undefined, !isChannelsLast, tileInner, false, undefined,\n sequentialAccessByThreads)}`;\n };\n return {\n name: 'Conv2DMatMul',\n shaderCache: {\n hint: `${attributes.cacheKey};${innerElementSize};${isVec4};${fitAOuter};${fitBOuter};${fitInner};${\n tileAOuter};${tileBOuter};${tileInner}`,\n inputDependencies\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n programUniforms,\n }),\n getShaderSource\n };\n };\n", "/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/conv3d_naive_webgpu.ts\n//\n// modified to fit the needs of the project\n\nimport {DataType} from '../../../../wasm-common';\nimport {LOG_DEBUG} from '../../../log';\nimport {TensorView} from '../../../tensor-view';\nimport {ShapeUtil} from '../../../util';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, getElementAt, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {ConvAttributes} from '../conv';\n\nconst arrayProduct = (arr: number[]) => {\n let product = 1;\n for (let i = 0; i < arr.length; i++) {\n product *= arr[i];\n }\n return product;\n};\n\nconst parse3TupleParam = (param: number|[number, number, number]): [number, number, number] =>\n typeof param === 'number' ? [param, param, param] : param;\n\nconst getEffectiveFilterSize = (filterSize: number, dilation: number): number => {\n if (dilation <= 1) {\n return filterSize;\n }\n\n return filterSize + (filterSize - 1) * (dilation - 1);\n};\n\nconst computeDefaultPad =\n (inputShape: [number, number]|[number, number, number, number], fieldSize: number, stride: number, dilation = 1):\n number => {\n const effectiveFieldSize = getEffectiveFilterSize(fieldSize, dilation);\n return Math.floor((inputShape[0] * (stride - 1) - stride + effectiveFieldSize) / 2);\n };\n\nconst computeOutputShape4D =\n (inShape: [number, number, number, number], filterShape: [number, number, number], outChannels: number,\n strides: [number, number, number], zeroPad?: number): [number, number, number, number] => {\n if (zeroPad == null) {\n // eslint-disable-next-line no-param-reassign\n zeroPad = computeDefaultPad(inShape, filterShape[0], strides[0]);\n }\n const outShape: [number, number, number, number] = [0, 0, 0, outChannels];\n for (let index = 0; index < 3; index++) {\n if (inShape[index] + 2 * zeroPad >= filterShape[index]) {\n outShape[index] = Math.trunc((inShape[index] - filterShape[index] + 2 * zeroPad) / strides[index] + 1);\n }\n }\n return outShape;\n };\n\nconst get3DPadAndOutInfo =\n (pad: number|string|number[], inDepth: number, inHeight: number, inWidth: number, strideDepth: number,\n strideHeight: number, strideWidth: number, filterDepth: number, filterHeight: number,\n filterWidth: number): {padInfo: PadInfo3D; outDepth: number; outHeight: number; outWidth: number} => {\n let padInfo: PadInfo3D;\n let outDepth: number;\n let outHeight: number;\n let outWidth: number;\n\n if (pad === 'VALID') {\n // eslint-disable-next-line no-param-reassign\n pad = 0;\n }\n\n if (typeof pad === 'number') {\n padInfo = {top: pad, bottom: pad, left: pad, right: pad, front: pad, back: pad};\n const outShape = computeOutputShape4D(\n [inDepth, inHeight, inWidth, 1], [filterDepth, filterHeight, filterWidth], 1,\n [strideDepth, strideHeight, strideWidth], pad);\n outDepth = outShape[0];\n outHeight = outShape[1];\n outWidth = outShape[2];\n } else if (Array.isArray(pad)) {\n if (!pad.every((val, _, arr) => val === arr[0])) {\n throw Error(`Unsupported padding parameter: ${pad}`);\n }\n padInfo = {top: pad[0], bottom: pad[1], left: pad[2], right: pad[3], front: pad[4], back: pad[5]};\n const outShape = computeOutputShape4D(\n [inDepth, inHeight, inWidth, 1], [filterDepth, filterHeight, filterWidth], 1,\n [strideDepth, strideHeight, strideWidth], pad[0]);\n outDepth = outShape[0];\n outHeight = outShape[1];\n outWidth = outShape[2];\n } else if (pad === 'SAME_UPPER') {\n // TODO: support 'SAME_LOWER'.\n outDepth = Math.ceil(inDepth / strideDepth);\n outHeight = Math.ceil(inHeight / strideHeight);\n outWidth = Math.ceil(inWidth / strideWidth);\n const padAlongDepth = (outDepth - 1) * strideDepth + filterDepth - inDepth;\n const padAlongHeight = (outHeight - 1) * strideHeight + filterHeight - inHeight;\n const padAlongWidth = (outWidth - 1) * strideWidth + filterWidth - inWidth;\n const front = Math.floor(padAlongDepth / 2);\n const back = padAlongDepth - front;\n const top = Math.floor(padAlongHeight / 2);\n const bottom = padAlongHeight - top;\n const left = Math.floor(padAlongWidth / 2);\n const right = padAlongWidth - left;\n\n padInfo = {top, bottom, left, right, front, back};\n } else {\n throw Error(`Unknown padding parameter: ${pad}`);\n }\n return {padInfo, outDepth, outHeight, outWidth};\n };\n\ntype PadInfo3D = {\n top: number; left: number; right: number; bottom: number; front: number; back: number;\n};\n\nexport type Conv3DInfo = {\n batchSize: number; inDepth: number; inHeight: number; inWidth: number; inChannels: number; outDepth: number;\n outHeight: number;\n outWidth: number;\n outChannels: number;\n dataFormat: 'channelsFirst' | 'channelsLast';\n strideDepth: number;\n strideHeight: number;\n strideWidth: number;\n dilationDepth: number;\n dilationHeight: number;\n dilationWidth: number;\n filterDepth: number;\n filterHeight: number;\n filterWidth: number;\n effectiveFilterDepth: number;\n effectiveFilterHeight: number;\n effectiveFilterWidth: number;\n padInfo: PadInfo3D;\n inShape: [number, number, number, number, number];\n outShape: [number, number, number, number, number];\n filterShape: [number, number, number, number, number];\n};\n\nexport const computeConv3DInfo =\n (inShape: [number, number, number, number, number], filterShape: [number, number, number, number, number],\n strides: number|[number, number, number], dilations: number|[number, number, number], pad: number|string|number[],\n depthwise = false, dataFormat: 'channelsFirst'|'channelsLast' = 'channelsLast'): Conv3DInfo => {\n let batchSize, inDepth, inHeight, inWidth, inChannels;\n if (dataFormat === 'channelsLast') {\n [batchSize, inDepth, inHeight, inWidth, inChannels] = inShape;\n } else if (dataFormat === 'channelsFirst') {\n [batchSize, inChannels, inDepth, inHeight, inWidth] = inShape;\n } else {\n throw new Error(`Unknown dataFormat ${dataFormat}`);\n }\n const [filterChannels, , filterDepth, filterHeight, filterWidth] = filterShape;\n\n const [strideDepth, strideHeight, strideWidth] = parse3TupleParam(strides);\n const [dilationDepth, dilationHeight, dilationWidth] = parse3TupleParam(dilations);\n\n const effectiveFilterDepth = getEffectiveFilterSize(filterDepth, dilationDepth);\n const effectiveFilterHeight = getEffectiveFilterSize(filterHeight, dilationHeight);\n const effectiveFilterWidth = getEffectiveFilterSize(filterWidth, dilationWidth);\n const {padInfo, outDepth, outHeight, outWidth} = get3DPadAndOutInfo(\n pad, inDepth, inHeight, inWidth, strideDepth, strideHeight, strideWidth, effectiveFilterDepth,\n effectiveFilterHeight, effectiveFilterWidth);\n\n const outChannels = depthwise ? filterChannels * inChannels : filterChannels;\n\n let outShape: [number, number, number, number, number] = [0, 0, 0, 0, 0];\n if (dataFormat === 'channelsFirst') {\n outShape = [batchSize, outChannels, outDepth, outHeight, outWidth];\n } else if (dataFormat === 'channelsLast') {\n outShape = [batchSize, outDepth, outHeight, outWidth, outChannels];\n }\n\n return {\n batchSize,\n dataFormat,\n inDepth,\n inHeight,\n inWidth,\n inChannels,\n outDepth,\n outHeight,\n outWidth,\n outChannels,\n padInfo,\n strideDepth,\n strideHeight,\n strideWidth,\n filterDepth,\n filterHeight,\n filterWidth,\n effectiveFilterDepth,\n effectiveFilterHeight,\n effectiveFilterWidth,\n dilationDepth,\n dilationHeight,\n dilationWidth,\n inShape,\n outShape,\n filterShape\n };\n };\n\nexport const createConv3DNaiveProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvAttributes, outputShape: readonly number[],\n filterDims: readonly number[], pads: readonly number[], dataFormat: string): ProgramInfo => {\n const isChannelsLast = dataFormat === 'channelsLast';\n const inChannels = isChannelsLast ? inputs[0].dims[3] : inputs[0].dims[1];\n // TODO: enable vec4.\n const isVec4 = false;\n const workGroupSize: [number, number, number] = [64, 1, 1];\n const dispatchLayout = {x: outputShape.map((_, i) => i)};\n const dispatch = [Math.ceil(arrayProduct(dispatchLayout.x.map(d => outputShape[d])) / (workGroupSize[0])), 1, 1];\n\n LOG_DEBUG('verbose', () => `[conv3d_naive_webgpu] dispatch = ${dispatch}`);\n\n const innerElementSize = isVec4 ? (isChannelsLast && inChannels % 4 !== 0 ? 3 : 4) : 1;\n const outputSize = ShapeUtil.size(outputShape);\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: filterDims},\n {type: DataType.uint32, data: pads}, {type: DataType.uint32, data: attributes.strides},\n {type: DataType.uint32, data: attributes.dilations}\n ];\n programUniforms.push(...createTensorShapeVariables(inputs[0].dims, inputs[1].dims));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n const hasBias = inputs.length === 3;\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'filter_dims', type: 'u32', length: filterDims.length},\n {name: 'pads', type: 'u32', length: pads.length},\n {name: 'strides', type: 'u32', length: attributes.strides.length},\n {name: 'dilations', type: 'u32', length: attributes.dilations.length}\n ];\n // TODO: support component 2, 3.\n const components = isVec4 ? 4 : 1;\n const t = tensorTypeToWsglStorageType(inputs[0].dataType);\n\n const x = inputVariable(\n 'x', inputs[0].dataType, inputs[0].dims.length, innerElementSize === 3 ? 1 : innerElementSize);\n const w = inputVariable('W', inputs[1].dataType, inputs[1].dims.length, components);\n const inputVariables = [x, w];\n const output = outputVariable('result', inputs[0].dataType, outputShape.length, components);\n let declareFunctions = '';\n if (hasBias) {\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, components);\n inputVariables.push(bias);\n declareFunctions += `\n fn getBiasByOutputCoords(coords : array) -> ${isVec4 ? `vec4<${t}>` : t} {\n return bias[${isChannelsLast ? getElementAt('coords', 4, 5) : getElementAt('coords', 1, 5)}${\n isVec4 ? '/ 4' : ''}];\n }`;\n }\n\n return `\n ${declareFunctions}\n fn getX(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 {\n let aIndices = array(d0, d1, d2, d3, d4);\n return ${x.getByIndices('aIndices')};\n }\n fn getW(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 {\n let aIndices = array(d0, d1, d2, d3, d4);\n return ${w.getByIndices('aIndices')};\n }\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let coords = ${output.offsetToIndices('global_idx')};\n let batch = ${getElementAt('coords', 0, x.rank)};\n let d2 = ${\n isChannelsLast ? getElementAt('coords', x.rank - 1, x.rank) : getElementAt('coords', 1, x.rank)};\n let xFRCCorner = vec3(${\n isChannelsLast ? getElementAt('coords', 1, x.rank) : getElementAt('coords', 2, x.rank)},\n ${isChannelsLast ? getElementAt('coords', 2, x.rank) : getElementAt('coords', 3, x.rank)},\n ${\n isChannelsLast ? getElementAt('coords', 3, x.rank) :\n getElementAt('coords', 4, x.rank)}) * uniforms.strides - uniforms.pads;\n let xFCorner = xFRCCorner.x;\n let xRCorner = xFRCCorner.y;\n let xCCorner = xFRCCorner.z;\n let xShapeY = ${\n isChannelsLast ? getElementAt('uniforms.x_shape', 1, x.rank) : getElementAt('uniforms.x_shape', 2, x.rank)};\n let xShapeZ = ${\n isChannelsLast ? getElementAt('uniforms.x_shape', 2, x.rank) : getElementAt('uniforms.x_shape', 3, x.rank)};\n let xShapeW = ${\n isChannelsLast ? getElementAt('uniforms.x_shape', 3, x.rank) : getElementAt('uniforms.x_shape', 4, x.rank)};\n let xShapeU = ${\n isChannelsLast ? getElementAt('uniforms.x_shape', 4, x.rank) : getElementAt('uniforms.x_shape', 1, x.rank)};\n let inputDepthNearestVec4 = (xShapeU / 4) * 4;\n let inputDepthVec4Remainder = xShapeU % 4;\n\n var dotProd = 0.0;\n for (var wF = 0u; wF < uniforms.filter_dims[0]; wF++) {\n let xF = xFCorner + wF * uniforms.dilations[0];\n if (xF < 0 || xF >= xShapeY) {\n continue;\n }\n\n for (var wR = 0u; wR < uniforms.filter_dims[1]; wR++) {\n let xR = xRCorner + wR * uniforms.dilations[1];\n if (xR < 0 || xR >= xShapeZ) {\n continue;\n }\n\n for (var wC = 0u; wC < uniforms.filter_dims[2]; wC++) {\n let xC = xCCorner + wC * uniforms.dilations[2];\n if (xC < 0 || xC >= xShapeW) {\n continue;\n }\n\n for (var d1 = 0u; d1 < inputDepthNearestVec4; d1 += 4) {\n ${\n isChannelsLast ? `let xValues = vec4(\n getX(batch, xF, xR, xC, d1),\n getX(batch, xF, xR, xC, d1 + 1),\n getX(batch, xF, xR, xC, d1 + 2),\n getX(batch, xF, xR, xC, d1 + 3));\n ` :\n `let xValues = vec4(\n getX(batch, d1, xF, xR, xC),\n getX(batch, d1 + 1, xF, xR, xC),\n getX(batch, d1 + 2, xF, xR, xC),\n getX(batch, d1 + 3, xF, xR, xC));\n `}\n let wValues = vec4(\n getW(d2, d1, wF, wR, wC),\n getW(d2, d1 + 1, wF, wR, wC),\n getW(d2, d1 + 2, wF, wR, wC),\n getW(d2, d1 + 3, wF, wR, wC));\n dotProd += dot(xValues, wValues);\n }\n if (inputDepthVec4Remainder == 1) {\n ${\n isChannelsLast ? `dotProd += getX(batch, xF, xR, xC, inputDepthNearestVec4)\n * getW(d2, inputDepthNearestVec4, wF, wR, wC);` :\n `dotProd += getX(batch, inputDepthNearestVec4, xF, xR, xC)\n * getW(d2, inputDepthNearestVec4, wF, wR, wC);`}\n } else if (inputDepthVec4Remainder == 2) {\n ${\n isChannelsLast ? `let xValues = vec2(\n getX(batch, xF, xR, xC, inputDepthNearestVec4),\n getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1));\n ` :\n `let xValues = vec2(\n getX(batch, inputDepthNearestVec4, xF, xR, xC),\n getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC));\n `}\n let wValues = vec2(\n getW(d2, inputDepthNearestVec4, wF, wR, wC),\n getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC));\n dotProd += dot(xValues, wValues);\n } else if (inputDepthVec4Remainder == 3) {\n ${\n isChannelsLast ? `let xValues = vec3(\n getX(batch, xF, xR, xC, inputDepthNearestVec4),\n getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1),\n getX(batch, xF, xR, xC, inputDepthNearestVec4 + 2));\n ` :\n `let xValues = vec3(\n getX(batch, inputDepthNearestVec4, xF, xR, xC),\n getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC),\n getX(batch, inputDepthNearestVec4 + 2, xF, xR, xC));\n `}\n let wValues = vec3(\n getW(d2, inputDepthNearestVec4, wF, wR, wC),\n getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC),\n getW(d2, inputDepthNearestVec4 + 2, wF, wR, wC));\n dotProd += dot(xValues, wValues);\n }\n }\n }\n }\n ${hasBias ? 'dotProd = dotProd + getBiasByOutputCoords(coords)' : ''};\n result[global_idx] = f32(dotProd);\n }`;\n };\n return {\n name: 'Conv3DNaive',\n shaderCache:\n {hint: `${attributes.cacheKey};${isChannelsLast};${innerElementSize};${hasBias}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n programUniforms,\n }),\n getShaderSource\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, getMaxComponents, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\nimport {calculateOutputShape, ConvAttributes} from './conv';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet} from './fuse-utils';\n\n/**\n * naive grouped conv implementation, supports 1d/2d conv\n * @param squeezeOutputShapeFunction - an optional function to squeeze the output shape, only used in conv1d\n */\nexport const createGroupedConvProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvAttributes,\n squeezeOutputShapeFunction?: (shape: readonly number[]) => number[]): ProgramInfo => {\n const hasBias = inputs.length > 2;\n const processBias = hasBias ? 'value += b[output_channel];' : '';\n const xShape = inputs[0].dims;\n const wShape = inputs[1].dims;\n const outputChannelsPerGroup = wShape[0] / attributes.group;\n\n const isChannelLast = attributes.format === 'NHWC';\n const outputShape = calculateOutputShape(\n xShape, wShape, attributes.dilations, attributes.pads, attributes.strides, isChannelLast);\n const outputSize = ShapeUtil.size(outputShape);\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: attributes.dilations},\n {type: DataType.uint32, data: [attributes.strides[0], attributes.strides[1]]},\n {type: DataType.uint32, data: [attributes.pads[0], attributes.pads[1]]},\n {type: DataType.uint32, data: outputChannelsPerGroup}\n ];\n appendActivationUniformsData(attributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(xShape, wShape));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('output', inputs[0].dataType, outputShape.length);\n const baseType = tensorTypeToWsglStorageType(output.type.tensor);\n const applyActivation = getActivationSnippet(attributes, output.type.value, baseType);\n const x = inputVariable('x', inputs[0].dataType, xShape.length);\n const w = inputVariable('w', inputs[1].dataType, wShape.length);\n const inputVars = [x, w];\n if (hasBias) {\n inputVars.push(inputVariable('b', inputs[2].dataType, inputs[2].dims.length));\n }\n\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'dilations', type: 'u32', length: attributes.dilations.length},\n {name: 'strides', type: 'u32', length: 2}, {name: 'pads', type: 'u32', length: 2},\n {name: 'output_channels_per_group', type: 'u32'}\n ];\n appendActivationUniforms(attributes, uniforms);\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVars, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let outputIndices = ${output.offsetToIndices('global_idx')};\n let batch: u32 = outputIndices[0];\n let output_channel: u32 = outputIndices[${isChannelLast ? 3 : 1}];\n let xRCCorner: vec2 = vec2(outputIndices[${isChannelLast ? 1 : 2}], outputIndices[${\n isChannelLast ? 2 : 3}]) * uniforms.strides - uniforms.pads;\n let group_id: u32 = output_channel / uniforms.output_channels_per_group;\n\n var value: ${output.type.value} = ${output.type.value}(0);\n for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[1]; wInChannel++) {\n let input_channel = group_id * uniforms.w_shape[1] + wInChannel;\n for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[2]; wHeight++) {\n let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0];\n\n if (xHeight < 0u || xHeight >= uniforms.x_shape[${isChannelLast ? 1 : 2}]) {\n continue;\n }\n\n for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[3]; wWidth++) {\n let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1];\n if (xWidth < 0u || xWidth >= uniforms.x_shape[${isChannelLast ? 2 : 3}]) {\n continue;\n }\n\n let xVal = ${\n isChannelLast ? x.get('batch', 'xHeight', 'xWidth', 'input_channel') :\n x.get('batch', 'input_channel', 'xHeight', 'xWidth')};\n let wVal = ${w.get('output_channel', 'wInChannel', 'wHeight', 'wWidth')};\n value += xVal*wVal;\n }\n }\n }\n ${processBias}\n ${applyActivation}\n ${output.setByOffset('global_idx', 'value')}\n }`;\n };\n return {\n name: 'GroupedConv',\n shaderCache: {hint: attributes.cacheKey, inputDependencies},\n getRunData: () => ({\n outputs: [{\n dims: squeezeOutputShapeFunction ? squeezeOutputShapeFunction(outputShape) : outputShape,\n dataType: inputs[0].dataType\n }],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n };\n\nexport const createGroupedConvVectorizeProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvAttributes, outputShape: readonly number[]): ProgramInfo => {\n const hasBias = inputs.length > 2;\n const components = getMaxComponents(outputShape[3]);\n const outputNumber = getMaxComponents(outputShape[2]);\n const outputSize = ShapeUtil.size(outputShape) / components / outputNumber;\n const xShape = [inputs[0].dims[0], inputs[0].dims[1], inputs[0].dims[2], inputs[0].dims[3] / components];\n const wShape = [inputs[1].dims[0], inputs[1].dims[1], inputs[1].dims[2], inputs[1].dims[3] / components];\n const outputShapeInShader = [outputShape[0], outputShape[1], outputShape[2], outputShape[3] / components];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize},\n {type: DataType.int32, data: [attributes.strides[0], attributes.strides[1]]},\n {type: DataType.int32, data: [attributes.pads[0], attributes.pads[1]]}\n ];\n appendActivationUniformsData(attributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(xShape, wShape, outputShapeInShader));\n const xNumber = (outputNumber - 1) * attributes.strides[1] + wShape[1];\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('output', inputs[0].dataType, outputShapeInShader.length, components);\n const baseType = tensorTypeToWsglStorageType(output.type.tensor);\n const applyActivation = getActivationSnippet(attributes, output.type.value, baseType);\n const x = inputVariable('x', inputs[0].dataType, xShape.length, components);\n const w = inputVariable('w', inputs[1].dataType, wShape.length, components);\n const inputVars = [x, w];\n if (hasBias) {\n inputVars.push(inputVariable('b', inputs[2].dataType, inputs[2].dims, components));\n }\n const processBias = hasBias ? 'value += b[output_channel];' : '';\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'},\n {name: 'strides', type: 'i32', length: 2},\n {name: 'pads', type: 'i32', length: 2},\n ];\n appendActivationUniforms(attributes, uniforms);\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVars, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let width0 = uniforms.output_shape[3];\n let output_channel = global_idx % width0;\n var index1 = global_idx / width0;\n let width1 = uniforms.output_shape[2] / ${outputNumber}u;\n let col = (index1 % width1) * ${outputNumber}u;\n index1 = index1 / width1;\n let row = index1 % uniforms.output_shape[1];\n let batch = index1 / uniforms.output_shape[1];\n\n let x_corner = vec2(i32(row), i32(col)) * uniforms.strides - uniforms.pads;\n\n var x_vals: array<${x.type.value}, ${xNumber}>;\n var values: array<${output.type.value}, ${outputNumber}>;\n let input_channel = output_channel;\n // Use constant instead of uniform can give better performance for w's height/width.\n for (var w_height: u32 = 0u; w_height < ${wShape[0]}; w_height++) {\n let x_height = x_corner.x + i32(w_height);\n if (x_height >= 0 && u32(x_height) < uniforms.x_shape[1]) {\n for (var i = 0; i < ${xNumber}; i++) {\n let x_width = x_corner.y + i;\n if (x_width >= 0 && u32(x_width) < uniforms.x_shape[2]) {\n x_vals[i] = ${x.get('batch', 'u32(x_height)', 'u32(x_width)', 'input_channel')};\n } else {\n x_vals[i] = ${x.type.value}(0);\n }\n }\n for (var w_width: u32 = 0u; w_width < ${wShape[1]}; w_width++) {\n let w_val = ${w.get('w_height', 'w_width', '0', 'output_channel')};\n for (var i = 0u; i < ${outputNumber}u; i++) {\n values[i] = fma(x_vals[i * u32(uniforms.strides[1]) + w_width], w_val, values[i]);\n }\n }\n }\n }\n\n for (var i = 0u; i < ${outputNumber}u; i++) {\n var value = values[i];\n ${processBias}\n ${applyActivation}\n ${output.set('batch', 'row', 'col + i', 'output_channel', 'value')};\n }\n }`;\n };\n\n return {\n name: 'GroupedConv-Vectorize',\n shaderCache: {\n hint: `${attributes.cacheKey};${components};${outputNumber};${xNumber};${wShape[0]};${wShape[1]}`,\n inputDependencies: hasBias ? ['rank', 'rank', 'type'] : ['rank', 'rank']\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {BroadcastUtil, ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createMatmulProgramInfo} from './3rd-party/matmul_packed_webgpu';\nimport {createTensorShapeVariables, getBroadcastDims, getMaxComponents, IndicesHelper, inputVariable, internalVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet, InternalActivationAttributes} from './fuse-utils';\n\nexport const createNaiveMatmulProgramInfo =\n (inputs: readonly TensorView[], activationAttributes: InternalActivationAttributes, outputShape: readonly number[],\n reshapedOutputShape?: readonly number[],\n isChannelsLast = false /* only used for conv2dByMatMul*/): ProgramInfo => {\n const aShape = inputs[0].dims;\n const bShape = inputs[1].dims;\n\n const M = aShape[aShape.length - 2];\n const N = bShape[bShape.length - 1];\n const K = aShape[aShape.length - 1];\n const components = getMaxComponents(N);\n const aComponents = getMaxComponents(K);\n const outputNumber = getMaxComponents(M);\n const outputSize = ShapeUtil.size(outputShape) / components / outputNumber;\n const hasBias = inputs.length > 2;\n const outerDims = reshapedOutputShape ? reshapedOutputShape.slice(0, -2) : outputShape.slice(0, -2);\n const batchSize = ShapeUtil.size(outerDims);\n const outputShapeInShader = [batchSize, M, N];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: M}, {type: DataType.uint32, data: N},\n {type: DataType.uint32, data: K}\n ];\n appendActivationUniformsData(activationAttributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(outerDims, aShape, bShape));\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n }\n programUniforms.push(...createTensorShapeVariables(outputShapeInShader));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const batchDims = internalVariable('batch_dims', inputs[0].dataType, outerDims.length);\n const a = inputVariable('a', inputs[0].dataType, aShape.length, aComponents);\n const b = inputVariable('b', inputs[1].dataType, bShape.length, components);\n const output = outputVariable('output', inputs[0].dataType, outputShapeInShader.length, components);\n const baseType = tensorTypeToWsglStorageType(output.type.tensor);\n const applyActivation = getActivationSnippet(activationAttributes, output.type.value, baseType);\n const inputVariables = [a, b];\n let processBias = '';\n if (hasBias) {\n const biasComponents = isChannelsLast ? components : 1;\n inputVariables.push(inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, biasComponents));\n processBias = `${\n isChannelsLast ? `value += bias[col / ${biasComponents}];` :\n `value += ${output.type.value}(bias[row + i]);`}`;\n }\n\n const outerDimsA = aShape.slice(0, -2);\n const outerDimsB = bShape.slice(0, -2);\n const broadCastADims = getBroadcastDims(outerDimsA, outerDims);\n const broadCastBDims = getBroadcastDims(outerDimsB, outerDims);\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'M', type: 'u32'}, {name: 'N', type: 'u32'},\n {name: 'K', type: 'u32'}\n ];\n appendActivationUniforms(activationAttributes, uniforms);\n\n const getIndices = (variable: IndicesHelper, broadCastDims: number[]) => {\n const rank = variable.rank;\n const name = variable.name;\n if (rank === 2) {\n return `var ${name}_indices = ${variable.type.indices}(0u, 0u);`;\n }\n const batchRank = batchDims.rank;\n let resStr = `var ${name}_indices: ${variable.type.indices};`;\n for (let i = rank - 2 - 1, j = batchRank - 1; i >= 0; i--, j--) {\n resStr += `\\n${name}_indices[${i}] = ${batchRank > 1 ? `batch_indices[${j}]` : 'batch_indices'};`;\n }\n broadCastDims.forEach(i => {\n resStr += `\\n${name}_indices[${i}] = 0;`;\n });\n resStr += `${name}_indices[${rank - 2}] = 0u;\n ${name}_indices[${rank - 1}] = 0u;`;\n return resStr;\n };\n\n const calcResult = (): string => {\n let calcStr = `var a_data: ${a.type.value};`;\n for (let i = 0; i < aComponents; i++) {\n calcStr += `\n let b_data${i} = b[(b_offset + (k + ${i}) * uniforms.N + col) / ${components}];`;\n }\n for (let i = 0; i < outputNumber; i++) {\n calcStr += `a_data = a[(a_offset + (row + ${i}) * uniforms.K + k) / ${aComponents}];`;\n\n for (let j = 0; j < aComponents; j++) {\n calcStr += `\n values[${i}] = fma(${b.type.value}(a_data${aComponents === 1 ? '' : `[${j}]`}), b_data${j}, values[${\n i}]);\\n`;\n }\n }\n return calcStr;\n };\n\n return `\n ${\n shaderHelper.registerUniforms(uniforms).registerInternalVariables(batchDims).declareVariables(\n ...inputVariables, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let col = (global_idx % (uniforms.N / ${components})) * ${components};\n var index1 = global_idx / (uniforms.N / ${components});\n let stride1 = uniforms.M / ${outputNumber};\n let row = (index1 % stride1) * ${outputNumber};\n let batch = index1 / stride1;\n\n ${outputShape.length === 2 ? '' : `let batch_indices = ${batchDims.offsetToIndices('batch')};`}\n ${getIndices(a, broadCastADims)}\n let a_offset = ${a.indicesToOffset('a_indices')};\n ${getIndices(b, broadCastBDims)}\n let b_offset = ${b.indicesToOffset('b_indices')};\n var values: array<${output.type.value}, ${outputNumber}>;\n for (var k: u32 = 0u; k < uniforms.K; k = k + ${aComponents}) {\n ${calcResult()}\n }\n for (var i = 0u; i < ${outputNumber}u; i++) {\n var value = values[i];\n ${processBias}\n ${applyActivation}\n let cur_indices = ${output.type.indices}(batch, row + i, col);\n let offset = ${output.indicesToOffset('cur_indices')};\n ${output.setByOffset(`offset / ${components}`, 'value')};\n }\n }\n `;\n };\n return {\n name: 'MatMulNaive',\n shaderCache: {\n hint: `${activationAttributes.activation};${components};${aComponents};${outputNumber};${isChannelsLast}`,\n inputDependencies: hasBias ? ['rank', 'rank', 'rank'] : ['rank', 'rank']\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource\n };\n };\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('MatMul requires 2 inputs.');\n }\n\n if (inputs[0].dims[inputs[0].dims.length - 1] !== inputs[1].dims[inputs[1].dims.length - 2]) {\n throw new Error('shared dimension does not match.');\n }\n};\n\nexport const matMul = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n const outputShape = BroadcastUtil.calcShape(context.inputs[0].dims, context.inputs[1].dims, true);\n if (!outputShape) {\n throw new Error('Can\\'t use matmul on the given tensors');\n }\n const N = outputShape[outputShape.length - 1];\n const K = context.inputs[0].dims[context.inputs[0].dims.length - 1];\n if (N < 8 && K < 8) {\n context.compute(createNaiveMatmulProgramInfo(context.inputs, {activation: ''}, outputShape));\n } else {\n context.compute(createMatmulProgramInfo(context.inputs, {activation: ''}, outputShape));\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorView} from '../../tensor-view';\nimport {PoolConvUtil} from '../../util';\nimport {AttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext} from '../types';\n\nimport {createConv2DMatMulProgramInfo} from './3rd-party/conv2d_mm_webgpu';\nimport {computeConv3DInfo, createConv3DNaiveProgramInfo} from './3rd-party/conv3d_naive_webgpu';\nimport {createMatmulProgramInfo} from './3rd-party/matmul_packed_webgpu';\nimport {createGroupedConvProgramInfo, createGroupedConvVectorizeProgramInfo} from './conv-grouped';\nimport {InternalActivationAttributes, parseInternalActivationAttributes} from './fuse-utils';\nimport {createNaiveMatmulProgramInfo} from './matmul';\nimport {createTransposeProgramInfo} from './transpose';\n\nexport const calculateOutputShape =\n (inputShape: readonly number[], kernelShape: readonly number[], dilations: readonly number[],\n adjustPads: readonly number[], strides: readonly number[], isChannelLast: boolean): number[] => {\n const batchSize = inputShape[0];\n const inputSpatialShape = inputShape.slice(isChannelLast ? 1 : 2, isChannelLast ? 3 : 4);\n const spatialRank = inputSpatialShape.length;\n const outChannels = kernelShape[0];\n const kernelSpatialShape = kernelShape.slice(2);\n const dilatedKernelShape = kernelSpatialShape.map((v, i) => v + (v - 1) * (dilations[i] - 1));\n const inputSpatialShapeWithPad = inputSpatialShape.map((v, i) => v + adjustPads[i] + adjustPads[i + spatialRank]);\n const outputShape =\n inputSpatialShapeWithPad.map((v, i) => Math.floor((v - dilatedKernelShape[i] + strides[i]) / strides[i]));\n outputShape.splice(0, 0, batchSize);\n outputShape.splice(isChannelLast ? 3 : 1, 0, outChannels);\n return outputShape;\n };\n\nexport interface ConvAttributes extends InternalActivationAttributes, AttributeWithCacheKey {\n readonly autoPad: string;\n readonly dilations: readonly number[];\n readonly format: 'NHWC'|'NCHW';\n readonly group: number;\n readonly kernelShape: readonly number[];\n readonly pads: readonly number[];\n readonly strides: readonly number[];\n readonly wIsConst: boolean;\n}\n\n// for transposing weight tensor from [M, C/group, KH, KW] to [KH, KW, C/group, M]\nconst weightTransposeAttribute = [2, 3, 1, 0];\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: ConvAttributes): void => {\n // Refer to the below link for all input checks\n // https://github.com/onnx/onnx/blob/master/docs/Operators.md#Conv\n if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n throw new Error('Conv requires 2 or 3 inputs');\n }\n\n if (inputs[0].dims.length > 5) {\n throw new Error('greater than 5D is not supported');\n }\n\n if (inputs[0].dims.length !== inputs[1].dims.length) {\n throw new Error('filter does not have same dimension as input');\n }\n\n // FILTER_IN_CHANNEL should be equal to DATA_CHANNEL\n const dataChannel = inputs[0].dims[attributes.format === 'NHWC' ? inputs[0].dims.length - 1 : 1];\n const filterInChannel = inputs[1].dims[1] * attributes.group;\n if (dataChannel !== filterInChannel) {\n throw new Error('FILTER_IN_CHANNEL should be equal to DATA_CHANNEL');\n }\n\n // if bias is provided it should be 1D and the number of elements should be equal to the number of feature maps\n if (inputs.length === 3 && (inputs[2].dims.length !== 1 || inputs[1].dims[0] !== inputs[2].dims[0])) {\n throw new Error('invalid bias');\n }\n\n const spatialRank = inputs[0].dims.length - 2;\n // wrong dilations dimension\n if (attributes.dilations.length !== spatialRank) {\n throw new Error(`dilations should be ${spatialRank}D`);\n }\n\n // Wrong strides dimension\n if (attributes.strides.length !== spatialRank) {\n throw new Error(`strides should be ${spatialRank}D`);\n }\n\n // Wrong pads dimension\n if (attributes.pads.length !== spatialRank * 2) {\n throw new Error(`pads should be ${spatialRank * 2}D`);\n }\n\n // if kernelShape is specified, it's data length must be 2 less than dims length of the weights tensor\n // (the first 2 dims are batch_size and channels)\n if (attributes.kernelShape.length !== 0 && attributes.kernelShape.length !== inputs[1].dims.length - 2) {\n throw new Error('invalid kernel shape');\n }\n};\n\nconst getAdjustedConvAttributes = (attributes: T, inputs: readonly TensorView[]): T => {\n const kernelShape = attributes.kernelShape.slice();\n // if kernelShape is not specified in the attributes of this op, infer it from the weight tensor dims\n for (let i = 2; i < inputs[1].dims.length; ++i) {\n if (kernelShape[i - 2] === 0) {\n kernelShape[i - 2] = inputs[1].dims[i];\n }\n }\n const pads = attributes.pads.slice();\n PoolConvUtil.adjustPadsBasedOnAutoPad(\n inputs[0].dims, attributes.strides, attributes.dilations, kernelShape, pads, attributes.format === 'NHWC',\n attributes.autoPad);\n\n // always return a new object so does not modify the original attributes\n const newAttributes: T = Object.assign({}, attributes);\n Object.assign(newAttributes, {kernelShape, pads});\n return newAttributes;\n};\n\nexport const parseConvAttributes = (attributes: Record): ConvAttributes => {\n const activationAttributes = parseInternalActivationAttributes(attributes);\n // TODO : Make this generic enough to compute default attributes for multi-dimensional conv\n const format = attributes.format as 'NHWC' | 'NCHW';\n const autoPad = ['NOTSET', 'VALID', 'SAME_UPPER', 'SAME_LOWER'][attributes.auto_pad as number];\n const dilations = attributes.dilations as number[];\n const group = attributes.group as number;\n const kernelShape = attributes.kernel_shape as number[];\n const pads = attributes.pads as number[];\n const strides = attributes.strides as number[];\n const wIsConst = (attributes.w_is_const as () => boolean)();\n\n return {\n autoPad,\n format,\n dilations,\n group,\n kernelShape,\n pads,\n strides,\n wIsConst,\n ...activationAttributes,\n cacheKey: `${attributes.format};${activationAttributes.activation};`\n };\n};\n\nconst conv2d = (context: ComputeContext, inputs: readonly TensorView[], attributes: ConvAttributes): void => {\n const adjustedAttributes = getAdjustedConvAttributes(attributes, inputs);\n\n // check attributes\n\n // const hasPreluActivationWeights = false; /* TODO: add support for prelu activation weights */\n const isChannelsLast = attributes.format === 'NHWC';\n if (attributes.group !== 1) {\n // NVIDIA GPU with ampere architecture fails with below 2 cases, but we couldn't repro them with any other\n // GPUs. So just disable vectorize on NVIDIA ampere to ensure always correct outputs.\n // [webgpu]Conv - conv - vectorize group - B\n // [webgpu]Conv - conv - vectorize group - D\n const enableGroupedConvVectorize = !context.adapterInfo.isArchitecture('ampere');\n if (enableGroupedConvVectorize && isChannelsLast && inputs[1].dims[0] === attributes.group &&\n inputs[1].dims[1] === 1 && attributes.dilations[0] === 1 && attributes.dilations[1] === 1) {\n const outputShape = calculateOutputShape(\n inputs[0].dims, inputs[1].dims, attributes.dilations, adjustedAttributes.pads, attributes.strides,\n isChannelsLast);\n const transposedWeight = (context.kernelCustomData.wT as TensorView | undefined) ??\n context.compute(\n createTransposeProgramInfo(inputs[1], weightTransposeAttribute),\n {inputs: [1], outputs: [attributes.wIsConst ? -2 : -1]})[0];\n if (attributes.wIsConst && !context.kernelCustomData.wT) {\n context.kernelCustomData.wT = transposedWeight;\n }\n const convInputs = [inputs[0], transposedWeight];\n if (inputs.length === 3) {\n convInputs.push(inputs[2]);\n }\n context.compute(\n createGroupedConvVectorizeProgramInfo(convInputs, adjustedAttributes, outputShape), {inputs: convInputs});\n } else {\n context.compute(createGroupedConvProgramInfo(inputs, adjustedAttributes));\n }\n return;\n }\n\n const hasBias = inputs.length === 3;\n const inputHeight = inputs[0].dims[isChannelsLast ? 1 : 2];\n const inputWidth = inputs[0].dims[isChannelsLast ? 2 : 3];\n const inputChannels = inputs[0].dims[isChannelsLast ? 3 : 1];\n const weightHeight = inputs[1].dims[2];\n const weightWidth = inputs[1].dims[3];\n\n const outputShape = calculateOutputShape(\n inputs[0].dims, inputs[1].dims, attributes.dilations, adjustedAttributes.pads, attributes.strides,\n isChannelsLast);\n const outHeight = outputShape[isChannelsLast ? 1 : 2];\n const outWidth = outputShape[isChannelsLast ? 2 : 3];\n const outChannels = outputShape[isChannelsLast ? 3 : 1];\n\n const sameSize = isChannelsLast && weightHeight === inputHeight && weightWidth === inputWidth &&\n attributes.pads[0] === 0 && attributes.pads[1] === 0;\n if (sameSize ||\n (weightHeight === 1 && weightWidth === 1 && attributes.dilations[0] === 1 && attributes.dilations[1] === 1 &&\n attributes.strides[0] === 1 && attributes.strides[1] === 1 && attributes.pads[0] === 0 &&\n attributes.pads[1] === 0)) {\n // conv2dByMatMul\n const batch = outputShape[0];\n let xReshaped, wReshaped, matmulOutputShape;\n const matmulInputs = [];\n if (isChannelsLast) {\n const transposedWeight = (context.kernelCustomData.wT as TensorView | undefined) ??\n context.compute(\n createTransposeProgramInfo(inputs[1], weightTransposeAttribute),\n {inputs: [1], outputs: [attributes.wIsConst ? -2 : -1]})[0];\n if (attributes.wIsConst && !context.kernelCustomData.wT) {\n context.kernelCustomData.wT = transposedWeight;\n }\n if (sameSize) {\n const sharedDim = inputHeight * inputWidth * inputChannels;\n xReshaped = inputs[0].reshape([1, batch, sharedDim]);\n wReshaped = transposedWeight.reshape([1, sharedDim, outChannels]);\n matmulOutputShape = [1, batch, outChannels];\n } else {\n xReshaped = inputs[0].reshape([batch, inputHeight * inputWidth, inputChannels]);\n wReshaped = transposedWeight.reshape([1, inputChannels, outChannels]);\n matmulOutputShape = [batch, outHeight * outWidth, outChannels];\n }\n matmulInputs.push(xReshaped);\n matmulInputs.push(wReshaped);\n } else {\n xReshaped = inputs[0].reshape([batch, inputChannels, inputHeight * inputWidth]);\n wReshaped = inputs[1].reshape([1, outChannels, inputChannels]);\n matmulOutputShape = [batch, outChannels, outHeight * outWidth];\n matmulInputs.push(wReshaped);\n matmulInputs.push(xReshaped);\n }\n if (hasBias) {\n matmulInputs.push(inputs[2]);\n }\n const N = matmulOutputShape[2];\n const K = matmulInputs[0].dims[matmulInputs[0].dims.length - 1];\n // Tune the threshold.\n if (N < 8 && K < 8) {\n context.compute(\n createNaiveMatmulProgramInfo(\n matmulInputs, adjustedAttributes, outputShape, matmulOutputShape, isChannelsLast),\n {inputs: matmulInputs});\n } else {\n context.compute(\n createMatmulProgramInfo(matmulInputs, adjustedAttributes, outputShape, matmulOutputShape, isChannelsLast),\n {inputs: matmulInputs});\n }\n return;\n }\n\n // TODO: implement conv2dWithIm2Col()\n\n const sequentialAccessByThreads = /* backend.adapterInfo.isIntel() */ true;\n\n // STEP.1: transpose weight\n const transposedWeight = (context.kernelCustomData.wT as TensorView | undefined) ??\n context.compute(\n createTransposeProgramInfo(inputs[1], weightTransposeAttribute),\n {inputs: [1], outputs: [attributes.wIsConst ? -2 : -1]})[0];\n if (attributes.wIsConst && !context.kernelCustomData.wT) {\n context.kernelCustomData.wT = transposedWeight;\n }\n\n // STEP.2: prepare reshaped inputs\n const convInputs = [inputs[0], transposedWeight];\n if (hasBias) {\n convInputs.push(inputs[2]);\n }\n\n // STEP.3: compute matmul\n const dimAOuter = isChannelsLast ? outHeight * outWidth : outChannels;\n const dimBOuter = isChannelsLast ? outChannels : outHeight * outWidth;\n const dimInner = weightHeight * weightWidth * inputChannels;\n context.compute(\n createConv2DMatMulProgramInfo(\n convInputs, adjustedAttributes, outputShape, dimAOuter, dimBOuter, dimInner, hasBias,\n sequentialAccessByThreads),\n {inputs: convInputs});\n};\n\nconst conv1d = (context: ComputeContext, attributes: ConvAttributes): void => {\n // extend the input to 2D by adding H dimension\n const isChannelLast = attributes.format === 'NHWC';\n const inputs = [\n context.inputs[0].reshape(\n isChannelLast ?\n // [N, W, C] -> [N, H=1, W, C]\n [context.inputs[0].dims[0], 1, context.inputs[0].dims[1], context.inputs[0].dims[2]] :\n // [N, C, W] -> [N, C, H=1, W]\n [context.inputs[0].dims[0], context.inputs[0].dims[1], 1, context.inputs[0].dims[2]]),\n //[FILTER_OUT_CHANNEL, FILTER_IN_CHANNEL, kW] -> [FILTER_OUT_CHANNEL, FILTER_IN_CHANNEL, kH=1, kW]\n context.inputs[1].reshape([context.inputs[1].dims[0], context.inputs[1].dims[1], 1, context.inputs[1].dims[2]])\n ];\n if (context.inputs.length === 3) {\n inputs.push(context.inputs[2]);\n }\n const pads = [0, attributes.pads[0], 0, attributes.pads[1]];\n const strides = [1].concat(attributes.strides);\n const dilations = [1].concat(attributes.dilations);\n const kernelShape = [1].concat(attributes.kernelShape);\n const adjustedAttributes = getAdjustedConvAttributes({...attributes, pads, strides, dilations, kernelShape}, inputs);\n context.compute(createGroupedConvProgramInfo(\n inputs, adjustedAttributes,\n outputShape => isChannelLast ? [outputShape[0], outputShape[2], outputShape[3]] : []));\n};\n\nconst conv3d = (context: ComputeContext, inputs: readonly TensorView[], attributes: ConvAttributes): void => {\n const format = attributes.format === 'NHWC' ? 'channelsLast' : 'channelsFirst';\n const adjustedAttributes = getAdjustedConvAttributes(attributes, inputs);\n const pads = attributes.autoPad === 'NOTSET' ? attributes.pads : attributes.autoPad;\n const convInfo = computeConv3DInfo(\n inputs[0].dims as [number, number, number, number, number],\n inputs[1].dims as [number, number, number, number, number],\n attributes.strides as number | [number, number, number],\n attributes.dilations as number | [number, number, number], pads as string | number[], false, format);\n context.compute(createConv3DNaiveProgramInfo(\n inputs, adjustedAttributes, convInfo.outShape,\n [convInfo.filterDepth, convInfo.filterHeight, convInfo.filterWidth],\n [convInfo.padInfo.front, convInfo.padInfo.top, convInfo.padInfo.left], format));\n};\n\nexport const conv = (context: ComputeContext, attributes: ConvAttributes): void => {\n validateInputs(context.inputs, attributes);\n if (context.inputs[0].dims.length === 3) {\n conv1d(context, attributes);\n } else if (context.inputs[0].dims.length === 5) {\n conv3d(context, context.inputs, attributes);\n } else {\n conv2d(context, context.inputs, attributes);\n }\n};\n", "/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/conv_backprop_mm_webgpu.ts\n//\n// modified to fit the needs of the project\n\nimport {DataType} from '../../../../wasm-common';\nimport {LOG_DEBUG} from '../../../log';\nimport {TensorView} from '../../../tensor-view';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {ConvTransposeAttributes} from '../conv-transpose';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet} from '../fuse-utils';\n\nimport {biasSnippet} from './activation_util';\nimport {utilFunctions} from './conv_util';\nimport {makeMatMulPackedSource, makeMatMulPackedVec4Source} from './matmul_packed_webgpu';\n\nconst conv2dTransposeCommonSnippet =\n (isChannelsLast: boolean, addBias = false, attributes: ConvTransposeAttributes, type: string,\n innerElementSize = 4): string => {\n const getWSnippet = (innerElementSize: number) => {\n switch (innerElementSize) {\n case 1:\n return 'return w[getIndexFromCoords4D(coord, vec4(uniforms.w_shape))];';\n case 4:\n return `\n let coord1 = vec4(coordX, coordY, col + 1, rowInner);\n let coord2 = vec4(coordX, coordY, col + 2, rowInner);\n let coord3 = vec4(coordX, coordY, col + 3, rowInner);\n let v0 = w[getIndexFromCoords4D(coord, vec4(uniforms.w_shape))];\n let v1 = w[getIndexFromCoords4D(coord1, vec4(uniforms.w_shape))];\n let v2 = w[getIndexFromCoords4D(coord2, vec4(uniforms.w_shape))];\n let v3 = w[getIndexFromCoords4D(coord3, vec4(uniforms.w_shape))];\n return ${type}(v0, v1, v2, v3);\n `;\n default:\n throw new Error(`innerElementSize ${innerElementSize} is not supported.`);\n }\n };\n const coordASnippet = isChannelsLast ? `\n let coord = vec4(batch, iXR, iXC, xCh);\n ` :\n `\n let coord = vec4(batch, xCh, iXR, iXC);\n `;\n\n const coordResSnippet = isChannelsLast ? `\n let coords = vec4(\n batch,\n row / outWidth,\n row % outWidth,\n col);\n ` :\n `\n let coords = vec4(\n batch,\n row,\n col / outWidth,\n col % outWidth);\n `;\n\n const xHeight = isChannelsLast ? 'i32(uniforms.x_shape[1])' : 'i32(uniforms.x_shape[2])';\n const xWidth = isChannelsLast ? 'i32(uniforms.x_shape[2])' : 'i32(uniforms.x_shape[3])';\n const row = isChannelsLast ? 'row' : 'col';\n const col = isChannelsLast ? 'col' : 'row';\n\n const readASnippet = `\n let inChannels = ${isChannelsLast ? 'i32(uniforms.x_shape[3])' : 'i32(uniforms.x_shape[1])'};\n let outWidth = ${isChannelsLast ? 'i32(uniforms.result_shape[2])' : 'i32(uniforms.result_shape[3])'};\n let outRow = ${row} / outWidth;\n let outCol = ${row} % outWidth;\n\n let WRow = ${col} / (uniforms.filter_dims[1] * inChannels);\n let WCol = ${col} / inChannels % uniforms.filter_dims[1];\n let xR = f32(outRow - uniforms.pads[0] + uniforms.dilations[0] * WRow) / f32(uniforms.strides[0]);\n let xC = f32(outCol - uniforms.pads[1] + uniforms.dilations[1] * WCol) / f32(uniforms.strides[1]);\n if (xR < 0.0 || xR >= f32(${xHeight}) || fract(xR) > 0.0) {\n return ${type}(0.0);\n }\n if (xC < 0.0 || xC >= f32(${xWidth}) || fract(xC) > 0.0) {\n return ${type}(0.0);\n }\n let iXR = i32(xR);\n let iXC = i32(xC);\n let xCh = ${col} % inChannels;\n ${coordASnippet}\n return x[getIndexFromCoords4D(coord, vec4(uniforms.x_shape))/${innerElementSize}];`;\n\n const sampleA = isChannelsLast ? `\n let col = colIn * ${innerElementSize};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) {\n ${readASnippet}\n }\n return ${type}(0.0);` :\n `\n let col = colIn * ${innerElementSize};\n if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) {\n ${readASnippet}\n }\n return ${type}(0.0);`;\n\n const sampleW = `\n let col = colIn * ${innerElementSize};\n let inChannels = ${isChannelsLast ? 'i32(uniforms.x_shape[3])' : 'i32(uniforms.x_shape[1])'};\n let coordX = uniforms.filter_dims[0] - 1 - row / (uniforms.filter_dims[1] * inChannels);\n let coordY = uniforms.filter_dims[1] - 1 - (row / inChannels) % uniforms.filter_dims[1];\n if (${\n isChannelsLast ? 'row < uniforms.dim_inner && col < uniforms.dim_b_outer' :\n 'row < uniforms.dim_inner && col < uniforms.dim_a_outer'} && coordX >= 0 && coordY >= 0) {\n let rowInner = row % inChannels;\n let coord = vec4(coordX, coordY, col, rowInner);\n ${getWSnippet(innerElementSize)}\n }\n return ${type}(0.0);\n `;\n\n const applyActivation = getActivationSnippet(attributes, type);\n const userCode = `\n fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${type} {\n ${isChannelsLast ? sampleA : sampleW}\n }\n\n fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${type} {\n ${isChannelsLast ? sampleW : sampleA}\n }\n\n fn mm_write(batch: i32, row : i32, colIn : i32, valueInput : ${type}) {\n let col = colIn * ${innerElementSize};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) {\n var value = valueInput;\n let outWidth = ${isChannelsLast ? 'i32(uniforms.result_shape[2])' : 'i32(uniforms.result_shape[3])'};\n ${coordResSnippet}\n ${biasSnippet(addBias)}\n ${applyActivation}\n result[getIndexFromCoords4D(coords, vec4(uniforms.result_shape))/${innerElementSize}] = value;\n }\n }`;\n return userCode;\n };\n\nexport const createConv2DTransposeMatMulProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvTransposeAttributes, outputShape: readonly number[],\n dimAOuter: number, dimBOuter: number, dimInner: number, hasBias: boolean,\n sequentialAccessByThreads: boolean): ProgramInfo => {\n const isChannelsLast = attributes.format === 'NHWC';\n const inChannels = isChannelsLast ? inputs[0].dims[3] : inputs[0].dims[1];\n const batchSize = outputShape[0];\n const outWidth = isChannelsLast ? outputShape[2] : outputShape[3];\n const outHeight = isChannelsLast ? outputShape[1] : outputShape[2];\n const outChannels = isChannelsLast ? outputShape[3] : outputShape[1];\n // TODO: enable vec4 for NCHW\n const isVec4 = isChannelsLast && (inChannels % 4 === 0 && inChannels % 3) && outChannels % 4 === 0;\n\n // TODO: fine tune size\n const dispatchX = isChannelsLast ? outChannels : outWidth * outHeight;\n const dispatchY = isChannelsLast ? outWidth * outHeight : outChannels;\n const workGroupSize: [number, number, number] = [8, 8, 1];\n const elementsPerThread = dimAOuter <= 8 ? [4, 1, 1] : [4, 4, 1];\n const dispatch = [\n Math.ceil(dispatchX / workGroupSize[0] / elementsPerThread[0]),\n Math.ceil(dispatchY / workGroupSize[1] / elementsPerThread[1]),\n Math.ceil(batchSize / workGroupSize[2] / elementsPerThread[2])\n ];\n\n LOG_DEBUG('verbose', () => `[conv_backprop_mm_webgpu] dispatch = ${dispatch}`);\n\n const innerElementSize = isVec4 ? 4 : 1;\n const tileInner = Math.max(workGroupSize[0] * innerElementSize, workGroupSize[1]);\n const components = isVec4 ? 4 : 1;\n const filterDims =\n [attributes.kernelShape[isChannelsLast ? 1 : 2], attributes.kernelShape[isChannelsLast ? 2 : 3]];\n const effectiveFilterDims = [\n filterDims[0] + (attributes.dilations[0] <= 1 ? 0 : (filterDims[0] - 1) * (attributes.dilations[0] - 1)),\n filterDims[1] + (attributes.dilations[1] <= 1 ? 0 : (filterDims[1] - 1) * (attributes.dilations[1] - 1))\n ];\n const pads = [\n effectiveFilterDims[0] - 1 - Math.floor((attributes.pads[0] + attributes.pads[2]) / 2),\n effectiveFilterDims[1] - 1 - Math.floor((attributes.pads[1] + attributes.pads[3]) / 2)\n ];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.int32, data: dimAOuter}, {type: DataType.int32, data: dimBOuter},\n {type: DataType.int32, data: dimInner}, {type: DataType.int32, data: attributes.strides},\n {type: DataType.int32, data: attributes.dilations}, {type: DataType.int32, data: filterDims},\n {type: DataType.int32, data: pads}\n ];\n appendActivationUniformsData(attributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(inputs[0].dims, inputs[1].dims));\n\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const x = inputVariable('x', inputs[0].dataType, inputs[0].dims.length, components);\n const w = inputVariable('w', inputs[1].dataType, inputs[1].dims.length, 1);\n const output = outputVariable('result', inputs[0].dataType, outputShape.length, components);\n const inputVariables = [x, w];\n\n let declareFunctions = '';\n if (hasBias) {\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, components);\n inputVariables.push(bias);\n declareFunctions += `\n fn getBiasByOutputCoords(coords : vec4) -> ${bias.type.value} {\n return bias[coords.${isChannelsLast ? 'w' : 'y'}${isVec4 ? '/ 4' : ''}];\n }`;\n }\n\n const uniforms: UniformsArrayType = [\n {name: 'dim_a_outer', type: 'i32'}, {name: 'dim_b_outer', type: 'i32'}, {name: 'dim_inner', type: 'i32'},\n {name: 'strides', type: 'i32', length: 2}, {name: 'dilations', type: 'i32', length: 2},\n {name: 'filter_dims', type: 'i32', length: filterDims.length},\n {name: 'pads', type: 'i32', length: pads.length}\n ];\n appendActivationUniforms(attributes, uniforms);\n const elemType = tensorTypeToWsglStorageType(inputs[0].dataType, 1);\n if (elemType !== 'f16' && elemType !== 'f32') {\n throw new Error(`elemType ${elemType} is not supported.`);\n }\n return `\n ${utilFunctions('uniforms.result_strides')}\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)};\n ${declareFunctions}\n ${conv2dTransposeCommonSnippet(isChannelsLast, hasBias, attributes, x.type.value, innerElementSize)}\n ${\n isVec4 ? makeMatMulPackedVec4Source(\n elementsPerThread, workGroupSize, elemType, undefined, !isChannelsLast, tileInner) :\n makeMatMulPackedSource(\n elementsPerThread, workGroupSize, elemType, undefined, !isChannelsLast, tileInner, false,\n undefined, sequentialAccessByThreads)}`;\n };\n\n return {\n name: 'Conv2DTransposeMatMul',\n shaderCache:\n {hint: `${attributes.cacheKey};${elementsPerThread};${workGroupSize};${isVec4}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n programUniforms\n }),\n getShaderSource\n };\n };\n", "/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/conv_backprop_webgpu.ts\n\nimport {DataType} from '../../../../wasm-common';\nimport {LOG_DEBUG} from '../../../log';\nimport {TensorView} from '../../../tensor-view';\nimport {ShapeUtil} from '../../../util';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {ConvTransposeAttributes} from '../conv-transpose';\n\nconst createConvTranspose2DOpProgramShaderSource =\n (shaderHelper: ShaderHelper, inputs: readonly TensorView[], outputShape: readonly number[], hasBias: boolean,\n is1DimensionDispatch: boolean, isVec4 = false, dataType: string, uniforms: UniformsArrayType,\n isChannelsLast = false): string => {\n const rowDim = isChannelsLast ? 1 : 2;\n const colDim = isChannelsLast ? 2 : 3;\n const channelDim = isChannelsLast ? 3 : 1;\n const workPerThread = isVec4 ? 2 : 1;\n\n let declareFunctions = `\n fn setOutputAtIndex(flatIndex : u32, value : ${isVec4 ? `vec4<${dataType}>` : dataType}) {\n result[flatIndex] = ${isVec4 ? `vec4<${dataType}>` : dataType}(value);\n }`;\n if (hasBias) {\n declareFunctions += `\n fn getBiasByOutputCoords(coords : vec4) -> ${isVec4 ? `vec4<${dataType}>` : dataType} {\n return bias[coords.${isChannelsLast ? 'w' : 'y'}${isVec4 ? '/ 4' : ''}];\n }`;\n }\n const components = isVec4 ? 4 : 1;\n const w = inputVariable('W', inputs[1].dataType, inputs[1].dims.length, components);\n const dy = inputVariable('Dy', inputs[0].dataType, inputs[0].dims.length, components);\n const inputVariables = [dy, w];\n if (hasBias) {\n inputVariables.push(inputVariable('bias', inputs[2].dataType, [outputShape[channelDim]].length, components));\n }\n const output = outputVariable('result', inputs[0].dataType, outputShape.length, components);\n\n const codeSnippet4 = `{\n let batch: u32 = ${is1DimensionDispatch ? 'global_id.z' : 'workgroup_id.z'} / uniforms.result_shape[1];\n let r = ${is1DimensionDispatch ? 'global_id.z' : 'workgroup_id.z'} % uniforms.result_shape[1];\n let c = ${is1DimensionDispatch ? 'global_id.y' : 'workgroup_id.y'} * ${workPerThread};\n let d1: u32 = ${is1DimensionDispatch ? 'global_id.x' : 'workgroup_id.x'} * 4;\n\n let dyCorner = vec2(i32(r), i32(c)) - vec2(uniforms.pads);\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n var dotProd: array, ${workPerThread}>;\n for (var i = 0; i < ${workPerThread}; i++) {\n dotProd[i] = vec4<${dataType}>(0.0);\n }\n for (var wR: u32 = 0; wR < uniforms.filter_dims[0]; wR = wR + 1) {\n var dyR = (${dataType}(dyCorner.x) + ${dataType}(wR)) / ${dataType}(uniforms.strides.x);\n let wRPerm = uniforms.filter_dims[0] - 1 - wR;\n if (dyR < 0.0 || dyR >= ${dataType}(uniforms.Dy_shape[1]) ||\n fract(dyR) > 0.0 || wRPerm < 0) {\n continue;\n }\n let idyR: u32 = u32(dyR);\n\n for (var wC: u32 = 0; wC < uniforms.filter_dims[1]; wC = wC + 1) {\n let dyC = (${dataType}(dyCorner.y) + ${dataType}(wC)) / ${dataType}(uniforms.strides.y);\n let dyC2 = (${dataType}(dyCorner.y) + 1.0 + ${dataType}(wC)) / ${dataType}(uniforms.strides.y);\n let wCPerm = uniforms.filter_dims[1] - 1 - wC;\n if (wCPerm < 0) {\n continue;\n }\n var bDyCVal = true;\n var bDyCVal2 = true;\n if (dyC < 0.0 || dyC >= ${dataType}(uniforms.Dy_shape[2]) ||\n fract(dyC) > 0.0) {\n bDyCVal = false;\n }\n if (dyC2 < 0.0 || dyC2 >= ${dataType}(uniforms.Dy_shape[2]) ||\n fract(dyC2) > 0.0) {\n bDyCVal2 = false;\n }\n\n let idyC: u32 = u32(dyC);\n let idyC2: u32 = u32(dyC2);\n if (bDyCVal && bDyCVal2) {\n let d2Length = uniforms.Dy_shape[3];\n for (var d2 :u32 = 0; d2 < d2Length; d2 = d2 + 4) {\n let wValue0 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1', 'd2')};\n let wValue1 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 1', 'd2')};\n let wValue2 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 2', 'd2')};\n let wValue3 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 3', 'd2')};\n\n var xValue = ${dy.get('batch', 'idyR', 'idyC', 'd2')};\n let tmpval = vec4<${dataType}>(dot(xValue, wValue0),\n dot(xValue, wValue1),\n dot(xValue, wValue2),\n dot(xValue, wValue3));\n dotProd[0] = dotProd[0] + tmpval;\n\n xValue = ${dy.get('batch', 'idyR', 'idyC2', 'd2')};\n\n dotProd[1] = dotProd[1] + vec4<${dataType}>(dot(xValue, wValue0),\n dot(xValue, wValue1),\n dot(xValue, wValue2),\n dot(xValue, wValue3));\n }\n } else if (bDyCVal) {\n let d2Length = uniforms.Dy_shape[${channelDim}];\n for (var d2: u32 = 0; d2 < d2Length; d2 = d2 + 4) {\n let wValue0 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1', 'd2')};\n let wValue1 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 1', 'd2')};\n let wValue2 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 2', 'd2')};\n let wValue3 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 3', 'd2')};\n\n var xValue = ${dy.get('batch', 'idyR', 'idyC', 'd2')};\n let tmpval = vec4<${dataType}>(dot(xValue, wValue0),\n dot(xValue, wValue1),\n dot(xValue, wValue2),\n dot(xValue, wValue3));\n dotProd[0] = dotProd[0] + tmpval;\n }\n } else if (bDyCVal2) {\n let d2Length = uniforms.Dy_shape[3];\n for (var d2: u32 = 0; d2 < d2Length; d2 = d2 + 4) {\n let wValue0 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1', 'd2')};\n let wValue1 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 1', 'd2')};\n let wValue2 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 2', 'd2')};\n let wValue3 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 3', 'd2')};\n\n var xValue = ${dy.get('batch', 'idyR', 'idyC2', 'd2')};\n let tmpval = vec4<${dataType}>(dot(xValue, wValue0),\n dot(xValue, wValue1),\n dot(xValue, wValue2),\n dot(xValue, wValue3));\n dotProd[1] = dotProd[1] + tmpval;\n }\n }\n }\n }\n\n for (var i: u32 = 0; i < ${workPerThread}; i = i + 1) {\n let value = dotProd[i] + ${hasBias ? 'bias[c+i]' : `vec4<${dataType}>(0.0)`};\n ${output.set('batch', 'r', 'c + i', 'd1', 'value')};\n }\n }`;\n const codeSnippet = `\n let outputIndices = ${output.offsetToIndices('global_idx')};\n let batch = ${output.indicesGet('outputIndices', 0)};\n let d1 = ${output.indicesGet('outputIndices', channelDim)};\n let r = ${output.indicesGet('outputIndices', rowDim)};\n let c = ${output.indicesGet('outputIndices', colDim)};\n let dyCorner = vec2(i32(r), i32(c)) - uniforms.pads;\n let dyRCorner = dyCorner.x;\n let dyCCorner = dyCorner.y;\n let groupId = d1 / uniforms.output_channels_per_group;\n let wOutChannel = d1 - groupId * uniforms.output_channels_per_group;\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n var dotProd = ${dataType}(0.0);\n for (var wR: u32 = 0; wR < uniforms.effective_filter_dims.x; wR = wR + 1) {\n if (wR % uniforms.dilations.x != 0) {\n continue;\n }\n let dyR = (${dataType}(dyRCorner) + ${dataType}(wR)) / ${dataType}(uniforms.strides[0]);\n let wRPerm = uniforms.filter_dims.x - 1 - wR / uniforms.dilations.x;\n if (dyR < 0.0 || dyR >= ${dataType}(uniforms.Dy_shape[${rowDim}]) || fract(dyR) > 0.0 ||\n wRPerm < 0) {\n continue;\n }\n let idyR: u32 = u32(dyR);\n\n for (var wC: u32 = 0; wC < uniforms.effective_filter_dims.y; wC = wC + 1) {\n if (wC % uniforms.dilations.y != 0) {\n continue;\n }\n let dyC = (${dataType}(dyCCorner) + ${dataType}(wC)) / ${dataType}(uniforms.strides.y);\n let wCPerm = uniforms.filter_dims.y - 1 - wC / uniforms.dilations.y;\n if (dyC < 0.0 || dyC >= ${dataType}(uniforms.Dy_shape[${colDim}]) ||\n fract(dyC) > 0.0 || wCPerm < 0) {\n continue;\n }\n let idyC: u32 = u32(dyC);\n var inputChannel = groupId * uniforms.input_channels_per_group;\n for (var d2: u32 = 0; d2 < uniforms.input_channels_per_group; d2 = d2 + 1) {\n let xValue = ${\n isChannelsLast ? dy.get('batch', 'idyR', 'idyC', 'inputChannel') :\n dy.get('batch', 'inputChannel', 'idyR', 'idyC')};\n let wValue = ${w.get('inputChannel', 'wOutChannel', 'u32(wRPerm)', 'u32(wCPerm)')};\n dotProd = dotProd + xValue * wValue;\n inputChannel = inputChannel + 1;\n }\n }\n }\n let value = dotProd + ${hasBias ? 'bias[d1]' : `${dataType}(0.0)`};\n ${output.setByOffset('global_idx', 'value')};\n `;\n\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)}\n ${declareFunctions}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')};\n ${isVec4 ? codeSnippet4 : codeSnippet}}`;\n };\n\nexport const createConvTranspose2DProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvTransposeAttributes,\n squeezeOutputShapeFunction?: (shape: readonly number[]) => number[]): ProgramInfo => {\n const hasBias = inputs.length > 2;\n // const isChannelsLast = attributes.format === 'NHWC';\n const outputShape = attributes.outputShape;\n const outputSize = ShapeUtil.size(outputShape);\n\n // const inChannels = inputs[0].dims[isChannelsLast ? 3 : 1];\n // TODO Enable isVec4 for performance\n // Disabled due to weight matrix layout issue\n // const isVec4 = attributes.group === 1 && isChannelsLast && inChannels % 4 === 0 && outChannels % 4 === 0;\n const dispatch = [\n Math.ceil(outputSize / 64),\n 1,\n 1,\n ];\n LOG_DEBUG('verbose', () => `[conv2d_backprop_webgpu] dispatch = ${dispatch}`);\n\n const isChannelsLast = attributes.format === 'NHWC';\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n const strides = [attributes.strides[0], attributes.strides[1]];\n const filterDims =\n [attributes.kernelShape[isChannelsLast ? 1 : 2], attributes.kernelShape[isChannelsLast ? 2 : 3]];\n const dilations = [attributes.dilations[0], attributes.dilations[1]];\n const effectiveFilterDims = [\n filterDims[0] +\n (attributes.dilations[0] <= 1 ?\n 0 :\n (attributes.kernelShape[isChannelsLast ? 1 : 2] - 1) * (attributes.dilations[0] - 1)),\n filterDims[1] +\n (attributes.dilations[1] <= 1 ?\n 0 :\n (attributes.kernelShape[isChannelsLast ? 2 : 3] - 1) * (attributes.dilations[1] - 1))\n ];\n const pads = [\n effectiveFilterDims[0] - 1 - Math.floor((attributes.pads[0] + attributes.pads[2]) / 2),\n effectiveFilterDims[1] - 1 - Math.floor(attributes.pads[1] + attributes.pads[3]) / 2\n ];\n\n const isVec4 = false;\n const group = attributes.group;\n const wShape = inputs[1].dims;\n const inputChannelsPerGroup = wShape[0] / group;\n const outputChannelsPerGroup = wShape[1];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: strides},\n {type: DataType.uint32, data: filterDims}, {type: DataType.uint32, data: dilations},\n {type: DataType.uint32, data: effectiveFilterDims}, {type: DataType.int32, data: pads},\n {type: DataType.uint32, data: inputChannelsPerGroup}, {type: DataType.uint32, data: outputChannelsPerGroup},\n ...createTensorShapeVariables(inputs[0].dims, inputs[1].dims)\n ];\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const is1DimensionDispatch = dispatch[1] === 1 && dispatch[2] === 1;\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'strides', type: 'u32', length: strides.length},\n {name: 'filter_dims', type: 'u32', length: filterDims.length},\n {name: 'dilations', type: 'u32', length: filterDims.length},\n {name: 'effective_filter_dims', type: 'u32', length: effectiveFilterDims.length},\n {name: 'pads', type: 'i32', length: pads.length}, {name: 'input_channels_per_group', type: 'u32'},\n {name: 'output_channels_per_group', type: 'u32'}\n ];\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n return `${\n createConvTranspose2DOpProgramShaderSource(\n shaderHelper, inputs, outputShape, hasBias, is1DimensionDispatch, isVec4, dataType, uniforms,\n isChannelsLast)}`;\n };\n return {\n name: 'ConvTranspose2D',\n shaderCache: {hint: `${attributes.cacheKey};`, inputDependencies},\n getRunData: () => ({\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n outputs: [{\n dims: squeezeOutputShapeFunction ? squeezeOutputShapeFunction(outputShape) : outputShape,\n dataType: inputs[0].dataType\n }],\n programUniforms\n }),\n getShaderSource\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorView} from '../../tensor-view';\nimport {ComputeContext} from '../types';\n\nimport {createConv2DTransposeMatMulProgramInfo} from './3rd-party/conv_backprop_mm_webgpu';\nimport {createConvTranspose2DProgramInfo} from './3rd-party/conv_backprop_webgpu';\nimport {ConvAttributes} from './conv';\nimport {parseInternalActivationAttributes} from './fuse-utils';\nimport {createTransposeProgramInfo} from './transpose';\n\nconst computeTotalPad =\n (inDim: number, stride: number, adj: number, kernel: number, dilation: number, outSize: number) =>\n (inDim - 1) * stride + adj + (kernel - 1) * dilation + 1 - outSize;\n\nconst distributePadding = (totalPad: number, autoPad: string, pads: number[], head: number, tail: number) => {\n const smallPad = Math.floor(totalPad / 2);\n if (autoPad === 'SAME_UPPER') {\n pads[head] = smallPad;\n pads[tail] = totalPad - smallPad;\n } else if (autoPad === 'SAME_LOWER') {\n pads[head] = totalPad - smallPad;\n pads[tail] = smallPad;\n }\n};\n\nconst calculateOutputShapeAndPads =\n (inputShape: readonly number[], kernelShape: readonly number[], dilations: readonly number[], autoPad: string,\n group: number, pads: number[], strides: readonly number[], isChannelLast: boolean, outputPadding: number[],\n outputShape: number[]) => {\n const spatialRank = inputShape.length - 2;\n const updateOutputShape = outputShape.length === 0;\n if (outputPadding.length === 0) {\n for (let i = 0; i < spatialRank; ++i) {\n outputPadding.push(0);\n }\n }\n const batchSize = inputShape[0];\n const outChannels = kernelShape[isChannelLast ? 3 : 1] * group;\n for (let i = 0, j = inputShape.length - spatialRank - (isChannelLast ? 1 : 0); i < spatialRank; ++i, ++j) {\n const inSize = inputShape[j];\n const outSize = updateOutputShape ? inSize * strides[i] : outputShape[i];\n const totalPad = computeTotalPad(inSize, strides[i], pads[i], kernelShape[j], dilations[i], outSize);\n distributePadding(totalPad, autoPad, pads, i, i + spatialRank);\n if (updateOutputShape) {\n outputShape.push(\n strides[i] * (inSize - 1) + outputPadding[i] + (kernelShape[j] - 1) * dilations[i] + 1 - pads[i] -\n pads[i + spatialRank]);\n }\n }\n outputShape.splice(0, 0, batchSize);\n outputShape.splice(isChannelLast ? 3 : 1, 0, outChannels);\n };\n\nexport interface ConvTransposeAttributes extends ConvAttributes {\n readonly outputPadding: readonly number[];\n readonly outputShape: readonly number[];\n}\n\nconst getAdjustedConvTransposeAttributes =\n (attributes: T, inputs: readonly TensorView[]): T => {\n const kernelShape = attributes.kernelShape.slice();\n // if kernelShape is not specified in the attributes of this op, infer it from the weight tensor dims\n if (attributes.kernelShape.length === 0 || attributes.kernelShape.reduce((a, b) => a * b, 1) === 0) {\n kernelShape.length = 0;\n for (let i = 2; i < inputs[1].dims.length; ++i) {\n kernelShape.push(inputs[1].dims[i]);\n }\n }\n const isChannelsLast = attributes.format === 'NHWC';\n kernelShape.splice(0, 0, inputs[1].dims[0]);\n kernelShape.splice(isChannelsLast ? 3 : 1, 0, inputs[1].dims[1]);\n\n const pads = attributes.pads.slice();\n const outputShape = attributes.outputShape.slice();\n const outputPadding = attributes.outputPadding.slice();\n const inputShape = inputs[0].dims;\n let dilations = attributes.dilations.slice();\n if (dilations.reduce((a, b) => a + b, 0) === 0) {\n const spatialRank = inputs[0].dims.length - 2;\n dilations = new Array(spatialRank).fill(1);\n }\n let strides = attributes.strides.slice();\n if (strides.reduce((a, b) => a + b, 0) === 0) {\n const spatialRank = inputs[0].dims.length - 2;\n strides = new Array(spatialRank).fill(1);\n }\n // If outputShape is not specified in the attributes of this op, infer it from the parameters\n // Similarly, automatically infer pads if not specified\n calculateOutputShapeAndPads(\n inputShape, kernelShape, dilations, attributes.autoPad, attributes.group, pads, strides, isChannelsLast,\n outputPadding, outputShape);\n\n // always return a new object so does not modify the original attributes\n const newAttributes: T = Object.assign({}, attributes);\n Object.assign(newAttributes, {kernelShape, pads, outputPadding, outputShape, dilations, strides});\n return newAttributes;\n };\n\nexport const parseConvTransposeAttributes = (attributes: Record): ConvTransposeAttributes => {\n const activationAttributes = parseInternalActivationAttributes(attributes);\n // TODO : Make this generic enough to compute default attributes for multi-dimensional conv\n const format = attributes.format as 'NHWC' | 'NCHW';\n const autoPad =\n ['NOTSET', 'VALID', 'SAME_UPPER',\n 'SAME_LOWER'][typeof attributes.autoPad == 'undefined' ? 0 : attributes.autoPad as number];\n const dilations = attributes.dilations as [number, number];\n const group = attributes.group as number;\n const kernelShape = attributes.kernelShape as [number, number];\n const pads = attributes.pads as [number, number, number, number];\n const strides = attributes.strides as [number, number];\n const wIsConst = (attributes.wIsConst as () => boolean)();\n const outputPadding = attributes.outputPadding as [number, number, number, number];\n const outputShape = attributes.outputShape as [number, number];\n return {\n autoPad,\n format,\n dilations,\n group,\n kernelShape,\n outputPadding,\n outputShape,\n pads,\n strides,\n wIsConst,\n ...activationAttributes,\n cacheKey: `${attributes.format};${activationAttributes.activation};`\n };\n};\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: ConvTransposeAttributes): void => {\n // Refer to the below link for all input checks\n // https://github.com/onnx/onnx/blob/main/docs/Operators.md#ConvTranspose\n if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n throw new Error('Conv requires 2 or 3 inputs');\n }\n\n // TODO : Need to add support for multi-dimensional conv\n if (inputs[0].dims.length !== 4 && inputs[0].dims.length !== 3) {\n throw new Error('currently only support 2-dimensional conv');\n }\n\n if (inputs[0].dims.length !== inputs[1].dims.length) {\n throw new Error('filter does not have same dimension as input');\n }\n\n // FILTER_IN_CHANNEL should be equal to DATA_CHANNEL\n const dataChannel = inputs[0].dims[attributes.format === 'NHWC' ? inputs[0].dims.length - 1 : 1];\n const filterInChannel = inputs[1].dims[0];\n if (dataChannel !== filterInChannel) {\n throw new Error('FILTER_IN_CHANNEL should be equal to DATA_CHANNEL');\n }\n\n const featureMaps = inputs[1].dims[1] * attributes.group;\n\n // if bias is provided it should be 1D and the number of elements should be equal to the number of feature maps\n if (inputs.length === 3 && (inputs[2].dims.length !== 1 || inputs[2].dims[0] !== featureMaps)) {\n throw new Error('invalid bias');\n }\n\n const spatialRank = inputs[0].dims.length - 2;\n const dilationsSet = attributes.dilations.reduce((a, b) => a + b, 0) > 0;\n // wrong dilations dimension\n if (dilationsSet && attributes.dilations.length !== spatialRank) {\n throw new Error(`dilations should be ${spatialRank}D`);\n }\n\n const stridesSet = attributes.strides.reduce((a, b) => a + b, 0) > 0;\n // Wrong strides dimension\n if (stridesSet && attributes.strides.length !== spatialRank) {\n throw new Error(`strides should be ${spatialRank}D`);\n }\n\n // Wrong pads dimension\n const padsSet = attributes.pads.reduce((a, b) => a + b, 0) > 0;\n if (padsSet && attributes.pads.length !== spatialRank * 2) {\n throw new Error(`pads should be ${spatialRank * 2}D`);\n }\n\n // Wrong output padding dimension\n if (attributes.outputPadding.length !== spatialRank && attributes.outputPadding.length !== 0) {\n throw new Error(`output_padding should be ${spatialRank}D`);\n }\n\n // if kernelShape is specified, it's data length must be 2 less than dims length of the weights tensor\n // (the first 2 dims are batch_size and channels)\n const kernelShapeSet = attributes.kernelShape.reduce((a, b) => a + b, 0) > 0;\n if (kernelShapeSet && attributes.kernelShape.length !== 0 &&\n attributes.kernelShape.length !== inputs[1].dims.length - 2) {\n throw new Error('invalid kernel shape');\n }\n\n // as with kernelShape, must have same number of spatial dims as input\n if (attributes.outputShape.length !== 0 && attributes.outputShape.length !== inputs[0].dims.length - 2) {\n throw new Error('invalid output shape');\n }\n};\n\n// for transposing weight tensor from [C, M/group, KH, KW] to [KH, KW, M/group, C]\nconst weightTransposePerm = [2, 3, 1, 0];\n\nconst convTranspose2d =\n (context: ComputeContext, inputs: readonly TensorView[], attributes: ConvTransposeAttributes): void => {\n const adjustedAttributes = getAdjustedConvTransposeAttributes(attributes, inputs);\n const isChannelsLast = attributes.format === 'NHWC';\n const outputShape = adjustedAttributes.outputShape;\n const outChannels = outputShape[isChannelsLast ? 3 : 1];\n const inputChannels = inputs[0].dims[isChannelsLast ? 3 : 1];\n // Switch to naive method when outChannels and inputChannels are very small. It's because that in this case it's\n // not suitable for matmul version since matmul uses tile size 32x32 resulting the underlying execution unit\n // utilization rate is very low.\n if (adjustedAttributes.group !== 1 || (outChannels === 1 && inputChannels === 1)) {\n context.compute(createConvTranspose2DProgramInfo(inputs, adjustedAttributes));\n return;\n }\n const outHeight = outputShape[isChannelsLast ? 1 : 2];\n const outWidth = outputShape[isChannelsLast ? 2 : 3];\n const weightHeight = inputs[1].dims[2];\n const weightWidth = inputs[1].dims[3];\n\n const dimAOuter = isChannelsLast ? outHeight * outWidth : outChannels;\n const dimBOuter = isChannelsLast ? outChannels : outHeight * outWidth;\n const dimInner = weightHeight * weightWidth * inputChannels;\n\n const sequentialAccessByThreads = /* backend.adapterInfo.isIntel() */ true;\n\n\n // STEP.1: transpose weight\n const transposedWeight = (context.kernelCustomData.wT as TensorView | undefined) ??\n context.compute(\n createTransposeProgramInfo(inputs[1], weightTransposePerm),\n {inputs: [1], outputs: [attributes.wIsConst ? -2 : -1]})[0];\n if (attributes.wIsConst && !context.kernelCustomData.wT) {\n context.kernelCustomData.wT = transposedWeight;\n }\n\n // STEP.2: prepare reshaped inputs\n const convTransposeInputs = [inputs[0], transposedWeight];\n const hasBias = inputs.length === 3;\n if (hasBias) {\n if (!isChannelsLast && inputs[2].dims.length === 1) {\n convTransposeInputs.push(inputs[2].reshape([inputs[2].dims[0], 1, 1]));\n } else {\n convTransposeInputs.push(inputs[2]);\n }\n }\n\n // STEP.3: compute matmul\n context.compute(\n createConv2DTransposeMatMulProgramInfo(\n convTransposeInputs, adjustedAttributes, outputShape, dimAOuter, dimBOuter, dimInner, hasBias,\n sequentialAccessByThreads),\n {inputs: convTransposeInputs});\n };\n\nconst convTranspose1d = (context: ComputeContext, attributes: ConvTransposeAttributes): void => {\n // extend the input to 2D by adding H dimension\n const isChannelLast = attributes.format === 'NHWC';\n\n const inputs = [\n context.inputs[0].reshape(\n isChannelLast ?\n // [N, W, C] -> [N, H=1, W, C]\n [context.inputs[0].dims[0], 1, context.inputs[0].dims[1], context.inputs[0].dims[2]] :\n // [N, C, W] -> [N, C, H=1, W]\n [context.inputs[0].dims[0], context.inputs[0].dims[1], 1, context.inputs[0].dims[2]]),\n //[FILTER_OUT_CHANNEL, FILTER_IN_CHANNEL, kW] -> [FILTER_OUT_CHANNEL, FILTER_IN_CHANNEL, kH=1, kW]\n context.inputs[1].reshape([context.inputs[1].dims[0], context.inputs[1].dims[1], 1, context.inputs[1].dims[2]])\n ];\n if (context.inputs.length === 3) {\n inputs.push(context.inputs[2]);\n }\n let kernelShape = attributes.kernelShape;\n if (kernelShape.length === 0 || kernelShape[0] === 0) {\n kernelShape = [context.inputs[1].dims[2]];\n }\n let dilations = attributes.dilations;\n if (dilations.length === 0 || dilations[0] === 0) {\n dilations = [1];\n }\n let strides = attributes.strides;\n if (strides.length === 0 || strides[0] === 0) {\n strides = [1];\n }\n let pads = attributes.pads;\n if (pads.length === 0) {\n pads = [0, 0];\n }\n pads = [0, pads[0], 0, pads[1]];\n strides = [1].concat(strides);\n dilations = [1].concat(dilations);\n kernelShape = [1].concat(kernelShape);\n const adjustedAttributes =\n getAdjustedConvTransposeAttributes({...attributes, pads, strides, dilations, kernelShape}, inputs);\n context.compute(createConvTranspose2DProgramInfo(\n inputs, adjustedAttributes,\n outputShape => isChannelLast ? [outputShape[0], outputShape[2], outputShape[3]] :\n [outputShape[0], outputShape[1], outputShape[3]]));\n};\n\nexport const convTranspose = (context: ComputeContext, attributes: ConvTransposeAttributes): void => {\n validateInputs(context.inputs, attributes);\n if (context.inputs[0].dims.length === 3) {\n convTranspose1d(context, attributes);\n } else {\n convTranspose2d(context, context.inputs, attributes);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, inputVariable, outputVariable, ShaderHelper} from './common';\n\n\nexport interface CumSumAttributes extends AttributeWithCacheKey {\n readonly exclusive: boolean;\n readonly reverse: boolean;\n}\nconst createCumsumProgramInfo =\n (inputType: number, inputShape: readonly number[], axisInput: TensorView, attributes: CumSumAttributes):\n ProgramInfo => {\n const outputSize = ShapeUtil.size(inputShape); // outputShape is same as inputShape.\n const rank = inputShape.length; // input/output rank\n const input = inputVariable('input', inputType, rank);\n const output = outputVariable('output', inputType, rank);\n const axisValue = axisInput.dataType === DataType.int32 ? axisInput.getInt32Array()[0] :\n Number(axisInput.getBigInt64Array()[0]);\n const axis = ShapeUtil.normalizeAxis(axisValue, rank);\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const index = ` i32(${input.indicesGet('inputIndices', 'uniforms.axis')}) `;\n const max = getElementAt('uniforms.input_shape', 'uniforms.axis', rank);\n const lowerLimit = attributes.reverse ? index + (attributes.exclusive ? ' + 1' : '') : '0';\n const upperLimit = attributes.reverse ? max : index + (attributes.exclusive ? '' : ' + 1');\n return `\n ${\n shaderHelper.registerUniform('outputSize', 'u32')\n .registerUniform('axis', 'u32')\n .declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n var inputIndices = ${output.offsetToIndices('global_idx')};\n var sum = ${output.type.value}(0);\n let first : i32 = ${lowerLimit};\n let last : i32 = ${upperLimit};\n for (var i : i32 = first; i < last; i++) {\n ${input.indicesSet('inputIndices', 'uniforms.axis', 'u32(i)')};\n sum = sum + ${input.getByIndices('inputIndices')};\n }\n ${output.setByOffset('global_idx', 'sum')};\n }`;\n };\n return {\n name: 'CumSum',\n shaderCache: {hint: attributes.cacheKey, inputDependencies: ['rank']},\n getRunData: () => ({\n outputs: [{dims: inputShape, dataType: inputType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms: [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: axis},\n ...createTensorShapeVariables(inputShape, inputShape)\n ]\n\n }),\n getShaderSource\n };\n };\n\n\nexport const cumsum = (context: ComputeContext, attributes: CumSumAttributes): void => {\n const inputShape = context.inputs[0].dims;\n const inputType = context.inputs[0].dataType;\n const axis = context.inputs[1];\n context.compute(createCumsumProgramInfo(inputType, inputShape, axis, attributes), {inputs: [0]});\n};\n\nexport const parseCumSumAttributes = (attributes: Record): CumSumAttributes => {\n const exclusive = attributes.exclusive as number === 1;\n const reverse = attributes.reverse as number === 1;\n return createAttributeWithCacheKey({exclusive, reverse});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface FormatAttributes {\n readonly format: 'NHWC'|'NCHW';\n}\n\nexport interface DepthToSpaceAttributes extends FormatAttributes, AttributeWithCacheKey {\n readonly blocksize: number;\n readonly mode: string;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('DepthToSpace requires 1 input.');\n }\n if (inputs[0].dims.length !== 4) {\n throw new Error('DepthToSpace requires 4D input.');\n }\n};\n\nconst permFunctionBody = (perm: number[], rank: number, input: IndicesHelper, output: IndicesHelper): string => {\n const reverseFunc = [];\n reverseFunc.push(`fn perm(i: ${output.type.indices}) -> ${input.type.indices} {\n var a: ${input.type.indices};`);\n for (let i = 0; i < rank; ++i) {\n reverseFunc.push(input.indicesSet('a', perm[i], `i[${i}]`));\n }\n reverseFunc.push('return a;}');\n return reverseFunc.join('\\n');\n};\n\nconst createDepthToSpaceProgramInfo = (inputTensor: TensorView, attributes: DepthToSpaceAttributes): ProgramInfo => {\n let n: number, h: number, w: number, c: number;\n let shape: number[];\n let perm: number[];\n const isChannelLast = attributes.format === 'NHWC';\n const blocksize = attributes.blocksize;\n const isDCRmode = attributes.mode === 'DCR';\n if (isChannelLast) {\n [n, h, w, c] = inputTensor.dims;\n shape = isDCRmode ? [n, h, w, blocksize, blocksize, c / (blocksize ** 2)] :\n [n, h, w, c / (blocksize ** 2), blocksize, blocksize];\n perm = isDCRmode ? [0, 1, 3, 2, 4, 5] : [0, 1, 4, 2, 5, 3];\n } else {\n [n, h, w, c] = [inputTensor.dims[0], inputTensor.dims[2], inputTensor.dims[3], inputTensor.dims[1]];\n shape = isDCRmode ? [n, blocksize, blocksize, c / (blocksize ** 2), h, w] :\n [n, c / (blocksize ** 2), blocksize, blocksize, h, w];\n perm = isDCRmode ? [0, 3, 4, 1, 5, 2] : [0, 1, 4, 2, 5, 3];\n }\n const reshapedInputTensor = inputTensor.reshape(shape);\n const reshapedInputRank = reshapedInputTensor.dims.length;\n const inputDataType = inputTensor.dataType;\n\n const reshapedInput = inputVariable('a', inputDataType, reshapedInputRank);\n const permedOutput = outputVariable('output', inputDataType, reshapedInputRank);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(reshapedInput, permedOutput)}\n\n ${permFunctionBody(perm, reshapedInputRank, reshapedInput, permedOutput)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let indices = ${permedOutput.offsetToIndices('global_idx')};\n let aIndices = perm(indices);\n\n ${permedOutput.setByOffset('global_idx', reshapedInput.getByIndices('aIndices'))}\n }`;\n\n return {\n name: 'DepthToSpace',\n shaderCache: {hint: `${inputTensor.dims};${attributes.blocksize};${attributes.mode}`, inputDependencies: ['rank']},\n getRunData: (inputs) => {\n const outputShape = isChannelLast ? [n, h * blocksize, w * blocksize, c / (blocksize ** 2)] :\n [n, c / (blocksize ** 2), h * blocksize, w * blocksize];\n const outputSize = ShapeUtil.size(outputShape);\n const shapeBeforePerm = reshapedInputTensor.dims;\n const shapeAfterPerm = ShapeUtil.sortBasedOnPerm(shapeBeforePerm, perm);\n return {\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms:\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(shapeBeforePerm, shapeAfterPerm)],\n };\n },\n getShaderSource,\n };\n};\n\nexport const depthToSpace = (context: ComputeContext, attributes: DepthToSpaceAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createDepthToSpaceProgramInfo(context.inputs[0], attributes));\n};\n\nexport const parseDepthToSpaceAttributes = (attributes: Record): DepthToSpaceAttributes =>\n createAttributeWithCacheKey({\n blocksize: attributes.blocksize as number,\n mode: attributes.mode as string,\n format: attributes.format as 'NHWC' | 'NCHW'\n });\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface EinsumAttributes extends AttributeWithCacheKey {\n readonly equation: string;\n}\n// The equation attribute value is a string which consists of left hand side (LHS) and optionally right hand side (RHS)\n// separated by '->'. Ex. \"ij,jk -> ik\" expresses matrix multiplication\n// \"ij->ji\" expresses matrix transpose\n// \"ii->i\" diagonal elements of a square matrix\n// LHS consists of a sequence of terms separated by commas. Each term corresponds to an input variable.\n// Each symbol corresponds to a dimension in the input variable. The symbol can be either a letter, 'a' to 'z' or 'A' to\n// 'Z' or '...' to represent arbitrary dimensions.\n\nconst symbolPattern =\n '[a-zA-Z]|\\\\.\\\\.\\\\.'; // The pattern each symbol in each term in the symbolic equation should match\nconst termPattern = '(' + symbolPattern + ')+'; // The pattern each term in the symbolic equation should match\nconst termPatternOnly = '^' + termPattern + '$'; // The patterns only matchs a term begin to end.\nconst lhsPattern = '(' + termPattern + ',)*' + termPattern; // The pattern the LHS should match\nconst lhsPatternOnly = '^' + lhsPattern + '$'; // The patterns only matchs a LHS begin to end.\n\ninterface SymbolInfo {\n count: number; // Symbol corresponding to a dimmension of an input\n inputIndices: number[]; // Number of input variables the symbol corresponds to\n dimValue: number; // Number of dimensions the symbol corresponds to\n}\n\nclass EinsumTerm {\n constructor(inputIndex = -1) {\n this.symbolToIndices = new Map();\n this.inputIndex = inputIndex;\n }\n\n // Add a symbol to the term\n addSymbol(symbol: string, index: number) {\n let value = this.symbolToIndices.get(symbol);\n if (value === undefined) {\n value = [index];\n } else {\n value.push(index);\n }\n this.symbolToIndices.set(symbol, value);\n }\n\n symbolToIndices: Map; // Map from symbol to dimensions of the input corresponding to the term\n inputIndex: number; // -1 for output and 0, 1, 2, ... for inputs\n}\n\nclass EinsumEquation {\n constructor(inputs: readonly TensorView[], public readonly equation: string) {\n this.hasEllipsis = false;\n this.symbolToInfo = new Map();\n this.lhs = new Array();\n this.outputDims = [];\n // As rhs needs to be updated allow using let instead of const for both lhs and rhs.\n // eslint-disable-next-line prefer-const\n let [lhs, rhs] = equation.includes('->') ? equation.split('->', 2) : [equation, ''];\n if (!lhs.match(RegExp(lhsPatternOnly))) {\n throw new Error('Invalid LHS term');\n }\n const inputTerms = lhs.split(',');\n inputTerms.forEach((inputTerm, index) => {\n const dims = inputs[index].dims.slice();\n if (!inputTerm.match(RegExp(termPatternOnly))) {\n throw new Error('Invalid LHS term');\n }\n const einsumTerm = this.processTerm(inputTerm, true, dims, index);\n this.lhs.push(einsumTerm);\n });\n\n // Initialize the RHS if not specified\n if (rhs === '') {\n // Construct RHS from LHS terms/symbols\n rhs += [...this.symbolToInfo.entries()]\n .filter(([sym, info]) => (info.count === 1 || sym === '...'))\n .map(([sym]) => sym)\n .join('');\n } else {\n if (!rhs.match(RegExp(termPattern))) {\n throw new Error('Invalid RHS');\n }\n }\n\n // Compute output dims\n const rhsSymbols = rhs.match(RegExp(symbolPattern, 'g'));\n rhsSymbols?.forEach((symbol) => {\n if (symbol === '...') {\n this.outputDims = this.outputDims.concat(this.ellipsisDims);\n } else {\n const info = this.symbolToInfo.get(symbol);\n if (info === undefined) {\n throw new Error('Invalid RHS symbol');\n }\n this.outputDims.push(info.dimValue);\n }\n });\n this.rhs = this.processTerm(rhs, false, this.outputDims);\n } // End of EinsumEqation constructor\n\n // Add a symbol to the equation\n addSymbol(symbol: string, dimValue: number, inputIndex: number) {\n let info = this.symbolToInfo.get(symbol);\n if (info !== undefined) {\n if (info.dimValue !== dimValue && info.count !== 1) {\n throw new Error('Dimension mismatch');\n } else {\n info.count++;\n info.inputIndices.push(inputIndex);\n }\n } else {\n info = {count: 1, dimValue, inputIndices: [inputIndex]};\n }\n this.symbolToInfo.set(symbol, info);\n }\n\n // Process one input/output term\n processTerm(term: string, isInput: boolean, dims: readonly number[], index = -1): EinsumTerm {\n const rank = dims.length;\n let ellipsis = false;\n let ellipsisDims = [];\n let nextDim = 0;\n // For output empty string is allowed because the output may be reduced to a scalar value\n if (!term.match(RegExp(termPatternOnly)) && (!isInput && term !== '')) {\n throw new Error('Invalid LHS term');\n }\n const indexSymbols = term.match(RegExp(symbolPattern, 'g'));\n const einsumTerm = new EinsumTerm(index);\n // symbol can be either a lettre, 'a' to 'z' or 'A' to 'Z', or '...'\n indexSymbols?.forEach((symbol: string, i: number) => {\n if (symbol === '...') {\n if (ellipsis) {\n throw new Error('Only one ellipsis is allowed per input term');\n }\n ellipsis = true;\n const ellipsisDimLength = rank - indexSymbols.length + 1;\n if (ellipsisDimLength < 0) {\n throw new Error('Ellipsis out of bounds');\n }\n ellipsisDims = dims.slice(nextDim, nextDim + ellipsisDimLength);\n if (this.hasEllipsis) {\n if (this.ellipsisDims.length !== ellipsisDims.length ||\n this.ellipsisDims.toString() !== ellipsisDims.toString()) {\n throw new Error('Ellipsis dimensions mismatch');\n }\n } else if (isInput) {\n this.hasEllipsis = true;\n this.ellipsisDims = ellipsisDims;\n } else {\n throw new Error('Ellipsis must be specified in the LHS');\n }\n // Add '0', '1', '2', '3', '4', etc to represent ellipsis dimensions to avoid special handling\n for (let j = 0; j < ellipsisDims.length; j++) {\n const symbol = String.fromCharCode('0'.charCodeAt(0) + j);\n einsumTerm.addSymbol(symbol, i + j);\n this.addSymbol(symbol, dims[nextDim++], index);\n }\n } else {\n einsumTerm.addSymbol(symbol, i + (this.hasEllipsis ? this.ellipsisDims.length - 1 : 0));\n this.addSymbol(symbol, dims[nextDim++], index);\n }\n });\n return einsumTerm;\n }\n\n symbolToInfo: Map; // All symbols in the equation\n hasEllipsis: boolean; // The equation has ellipsis or not\n ellipsisDims: number[]; // The dimensions of the equation ellipsis corresponds to.\n lhs: EinsumTerm[]; // Terms on the left-hand side of the equation\n rhs: EinsumTerm; // Term on the right-hand side of the equation\n outputDims: number[]; // Output dimensions of the equation\n} // End of class EinsumEquation\n\nconst appendMax = (name: string): string => name + '_max';\n\nconst createEinsumProgramInfo =\n (inputShapes: Array, dataType: number, einsumEquation: EinsumEquation,\n outputShape: readonly number[]): ProgramInfo => {\n const ranks = inputShapes.map((dims) => dims.length);\n const inputVars = ranks.map((rank, index) => inputVariable(`input${index}`, dataType, rank));\n const outputSize = ShapeUtil.size(outputShape);\n const output = outputVariable('output', dataType, outputShape.length);\n const uniformsSymbols =\n [...einsumEquation.symbolToInfo.keys()].filter((symbol) => !einsumEquation.rhs.symbolToIndices.has(symbol));\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const idxCopy: string[] = [];\n const initProd = 'var prod = 1.0;';\n const initSum = 'var sum = 0.0;';\n const updateSum = 'sum += prod;';\n const reduceOpsSetIndices: string[] = [];\n const reduceOpsLoopHeaders: string[] = [];\n const reduceOpsLoopFooters: string[] = [];\n const reduceOpCompute: string[] = [];\n const isReduceOpsWithoutLoop = einsumEquation.symbolToInfo.size === einsumEquation.rhs.symbolToIndices.size;\n einsumEquation.symbolToInfo.forEach((info, symbol) => {\n if (einsumEquation.rhs.symbolToIndices.has(symbol)) {\n const outputIndex = einsumEquation.rhs.symbolToIndices.get(symbol)?.[0];\n if (outputIndex !== undefined) {\n einsumEquation.lhs.forEach((term, i) => {\n if (info.inputIndices.includes(i)) {\n const indices = term.symbolToIndices.get(symbol);\n if (indices === undefined) {\n throw new Error('Invalid symbol error');\n }\n indices.forEach((index) => {\n idxCopy.push(`${\n inputVars[i].indicesSet(\n `input${i}Indices`, index, output.indicesGet('outputIndices', outputIndex))}`);\n });\n }\n });\n }\n } else {\n einsumEquation.lhs.forEach((term, i) => {\n if (info.inputIndices.includes(i)) {\n const indices = term.symbolToIndices.get(symbol);\n if (indices === undefined) {\n throw new Error('Invalid symbol error');\n }\n indices.forEach((index) => {\n reduceOpsSetIndices.push(`${inputVars[i].indicesSet(`input${i}Indices`, index, `${symbol}`)}`);\n });\n reduceOpCompute.push(`prod *= ${inputVars[i].getByIndices(`input${i}Indices`)};`);\n }\n });\n reduceOpsLoopHeaders.push(\n `for(var ${symbol}: u32 = 0; ${symbol} < uniforms.${appendMax(symbol)}; ${symbol}++) {`);\n reduceOpsLoopFooters.push('}');\n }\n });\n const reduceOps = isReduceOpsWithoutLoop ?\n [\n ...idxCopy,\n `let sum = ${inputVars.map((inputVar, i) => inputVar.getByIndices(`input${i}Indices`)).join(' * ')};`\n ] :\n [\n ...idxCopy,\n initSum,\n ...reduceOpsLoopHeaders,\n ...reduceOpsSetIndices,\n initProd,\n ...reduceOpCompute,\n updateSum,\n ...reduceOpsLoopFooters,\n ];\n return `\n ${\n shaderHelper\n .registerUniforms(uniformsSymbols.map((symbol) => ({name: `${appendMax(symbol)}`, type: 'u32'})))\n .registerUniform('outputSize', 'u32')\n .declareVariables(...inputVars, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n var outputIndices = ${output.offsetToIndices('global_idx')};\n ${inputVars.map((_var, i) => `var input${i}Indices: ${inputVars[i].type.indices};`).join('\\n')}\n ${reduceOps.join('\\n')};\n ${output.setByOffset('global_idx', 'sum')};\n }`;\n };\n return {\n name: 'Einsum',\n shaderCache: {hint: einsumEquation.equation, inputDependencies: inputShapes.map(() => 'rank')},\n getRunData: () => {\n // The symbols from uniformSymbols array are guaranteed to exist in einsumEquations.symbolToInfo map. The\n // filter is added to make sure that dimValue is never 0.\n const programUniformsInit: ProgramUniform[] =\n uniformsSymbols.filter((symbol) => einsumEquation.symbolToInfo.has(symbol))\n .map(\n (symbol) =>\n ({type: DataType.uint32, data: einsumEquation.symbolToInfo.get(symbol)?.dimValue || 0}));\n programUniformsInit.push({type: DataType.uint32, data: outputSize});\n const programUniforms: ProgramUniform[] =\n inputShapes.map((dims, _) => [...createTensorShapeVariables(dims)])\n .reduce((acc, inputProgramUniforms) => acc.concat(inputProgramUniforms), programUniformsInit);\n programUniforms.push(...createTensorShapeVariables(outputShape));\n return ({\n outputs: [{dims: outputShape, dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n });\n },\n getShaderSource,\n };\n };\n\nexport const einsum = (context: ComputeContext, attributes: EinsumAttributes): void => {\n const einsumEquation = new EinsumEquation(context.inputs, attributes.equation);\n const outputShape = einsumEquation.outputDims;\n const inputShapes = context.inputs.map((input, _) => input.dims);\n context.compute(createEinsumProgramInfo(inputShapes, context.inputs[0].dataType, einsumEquation, outputShape));\n};\n\nexport const parseEinsumAttributes = (attributes: Record): EinsumAttributes => {\n const equation = (attributes.equation as string).replace(/\\s+/g, '');\n return createAttributeWithCacheKey({equation});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Expand requires 2 input.');\n }\n const inputShape = inputs[0].dims;\n const shape = Array.from(inputs[1].getBigInt64Array(), Number);\n\n let shapeIndex = shape.length < inputShape.length ? 0 : shape.length - inputShape.length;\n let inputShapeIndex = inputShape.length < shape.length ? 0 : inputShape.length - shape.length;\n for (; shapeIndex < shape.length && inputShapeIndex < inputShape.length; ++shapeIndex, ++inputShapeIndex) {\n if (shape[shapeIndex] !== inputShape[inputShapeIndex] && shape[shapeIndex] !== 1 &&\n inputShape[inputShapeIndex] !== 1) {\n throw new Error('Expand requires shape to be broadcastable to input');\n }\n }\n};\n\nconst getAdjustedShape = (shape1: readonly number[], shape2: readonly number[]): number[] => {\n const diff = shape1.length - shape2.length;\n const shape: number[] = [];\n for (let i = 0; i < diff; ++i) {\n shape.push(shape1[i]);\n }\n for (let i = 0; i < shape2.length; ++i) {\n shape.push(shape2[i] === 1 ? shape1[i + diff] : shape2[i]);\n }\n return shape;\n};\n\nconst calculateOutputShape = (inputShape: readonly number[], shape: readonly number[]): number[] =>\n (inputShape.length > shape.length) ? getAdjustedShape(inputShape, shape) : getAdjustedShape(shape, inputShape);\n\n\nconst createExpandProgramInfo = (inputs: readonly TensorView[]): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const shape = Array.from(inputs[1].getBigInt64Array(), Number);\n const outputShape: number[] = calculateOutputShape(inputShape, shape);\n const dataType = inputs[0].dataType;\n const components = dataType === DataType.bool ? 4 : 1;\n const outputSize = Math.ceil(ShapeUtil.size(outputShape) / components);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const input = inputVariable('input', dataType, inputShape.length, components);\n const output = outputVariable('output', dataType, outputShape.length, components);\n let assignment: string;\n if (dataType === DataType.bool) {\n const singleAssignment = (resStr: string, x: number, typeCast = '') => `\n let outputIndices${x} = ${output.offsetToIndices(`outputOffset + ${x}u`)};\n let offset${x} = ${input.broadcastedIndicesToOffset(`outputIndices${x}`, output)};\n let index${x} = offset${x} / 4u;\n let component${x} = offset${x} % 4u;\n ${resStr}[${x}] = ${typeCast}(${input.getByOffset(`index${x}`)}[component${x}]);\n `;\n assignment = `\n let outputOffset = global_idx * ${components};\n var data = vec4(0);\n ${singleAssignment('data', 0, 'u32')}\n ${singleAssignment('data', 1, 'u32')}\n ${singleAssignment('data', 2, 'u32')}\n ${singleAssignment('data', 3, 'u32')}\n ${output.setByOffset('global_idx', 'data')}\n }`;\n } else {\n assignment = `\n let outputIndices = ${output.offsetToIndices('global_idx')};\n let inputOffset = ${input.broadcastedIndicesToOffset('outputIndices', output)};\n ${output.setByOffset('global_idx', input.getByOffset('inputOffset'))}\n }`;\n }\n return `\n ${shaderHelper.registerUniform('vec_size', 'u32').declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.vec_size')}\n ${assignment}`;\n };\n\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(inputShape, outputShape)];\n return {\n name: 'Expand',\n shaderCache: {hint: `${outputShape.length}`, inputDependencies: ['rank']},\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n })\n };\n};\n\nexport const expand = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n context.compute(createExpandProgramInfo(context.inputs), {inputs: [0]});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglValueType, UniformsArrayType, WORKGROUP_SIZE} from './common';\nimport * as unary from './unary-op';\n\n// GELU is defined as Y=0.5*X*(1+tanh(0.797885*X+0.035677*X*X*X)), where X may pre-add a bias.\n\nconst createFastGeluProgramInfo = (inputTensors: readonly TensorView[]): ProgramInfo => {\n const dataType = inputTensors[0].dataType;\n const outputSize = ShapeUtil.size(inputTensors[0].dims);\n const biasLength = ShapeUtil.size(inputTensors[1].dims);\n // can only use vec4 when bias length is multiple of 4\n const useVec4 = biasLength % 4 === 0;\n const getShaderSource = (shaderHelper: ShaderHelper): string => {\n const x = inputVariable('x', dataType, [1], 4);\n const bias = inputVariable('bias', dataType, [1], 4);\n const y = outputVariable('y', dataType, [1], 4);\n\n const uniforms: UniformsArrayType = [{name: 'output_vec_size', type: 'u32'}, {name: 'bias_size', type: 'u32'}];\n\n const singleElementBias = (i: 0|1|2|3) => `\n let bias${i}_offset: u32 = (global_idx * 4 + ${i}) % uniforms.bias_size;\n let bias${i} = ${bias.getByOffset(`bias${i}_offset / 4`)}[bias${i}_offset % 4];`;\n const biasGetExpression = useVec4 ?\n `\n let bias = ${bias.getByOffset('global_idx % (uniforms.bias_size / 4)')};` :\n `${singleElementBias(0)}${singleElementBias(1)}${singleElementBias(2)}${singleElementBias(3)}\n let bias = ${x.type.value}(bias0, bias1, bias2, bias3);`;\n\n return `${shaderHelper.registerUniforms(uniforms).declareVariables(x, bias, y)}\n\n ${unary.fastGeluImpl(tensorTypeToWsglValueType(dataType))}\n\n ${shaderHelper.mainStart(WORKGROUP_SIZE)}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_vec_size')}\n\n let x = ${x.getByOffset('global_idx')};\n ${biasGetExpression}\n let x_in = x + bias;\n ${y.setByOffset('global_idx', unary.fastGeluExpression('x_in'))}\n }`;\n };\n\n return {\n name: 'FastGeluWithBias',\n shaderCache: {hint: `${useVec4}`, inputDependencies: ['type', 'type']},\n getShaderSource,\n getRunData: (inputs) => ({\n outputs: [{dims: inputs[0].dims, dataType: inputs[0].dataType}],\n programUniforms:\n [{type: DataType.uint32, data: Math.ceil(outputSize / 4)}, {type: DataType.uint32, data: biasLength}],\n dispatchGroup: {x: Math.ceil(outputSize / WORKGROUP_SIZE / 4)}\n })\n };\n};\n\nexport const fastGelu = (context: ComputeContext): void => {\n if (context.inputs.length < 2 || ShapeUtil.size(context.inputs[1].dims) === 0) {\n unary.fastGelu(context);\n } else {\n context.compute(createFastGeluProgramInfo(context.inputs));\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface GatherAttributes extends AttributeWithCacheKey {\n axis: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Gather requires 2 inputs.');\n }\n};\n\nconst createGatherProgramInfo = (inputs: readonly TensorView[], attributes: GatherAttributes): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const indicesShape = inputs[1].dims;\n\n const inputRank = inputShape.length;\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputRank);\n\n const outputShape = inputShape.slice(0);\n outputShape.splice(axis, 1, ...indicesShape);\n\n const axisDimLimit = inputShape[axis];\n const components = inputs[0].dataType === DataType.bool ? 4 : 1;\n const outputSize = Math.ceil(ShapeUtil.size(outputShape) / components);\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.int32, data: axisDimLimit},\n {type: DataType.uint32, data: axis}, ...createTensorShapeVariables(inputs[0].dims, inputs[1].dims, outputShape)\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const data = inputVariable('data', inputs[0].dataType, inputs[0].dims.length, components);\n const indices = inputVariable('inputIndices', inputs[1].dataType, inputs[1].dims.length);\n const output = outputVariable('output', inputs[0].dataType, outputShape.length, components);\n\n const calcDataIndices = (x: number|string): string => {\n const indicesRank = indicesShape.length;\n let calcStr = `var indicesIndices${x} = ${indices.type.indices}(0);`;\n for (let i = 0; i < indicesRank; i++) {\n calcStr += `${indicesRank > 1 ? `indicesIndices${x}[${i}]` : `indicesIndices${x}`} = ${\n outputShape.length > 1 ? `outputIndices${x}[uniforms.axis + ${i}]` : `outputIndices${x}`};`;\n }\n calcStr += `\n var idx${x} = ${indices.getByIndices(`indicesIndices${x}`)};\n if (idx${x} < 0) {\n idx${x} = idx${x} + uniforms.axisDimLimit;\n }\n var dataIndices${x} : ${data.type.indices};\n `;\n for (let i = 0, j = 0; i < inputRank; i++) {\n if (i === axis) {\n calcStr += `${inputRank > 1 ? `dataIndices${x}[${i}]` : `dataIndices${x}`} = u32(idx${x});`;\n j += indicesRank;\n } else {\n calcStr += `${inputRank > 1 ? `dataIndices${x}[${i}]` : `dataIndices${x}`} = ${\n outputShape.length > 1 ? `outputIndices${x}[${j}]` : `outputIndices${x}`};`;\n j++;\n }\n }\n return calcStr;\n };\n let assignment: string;\n if (inputs[0].dataType === DataType.bool) {\n const singleAssignment = (resStr: string, x: number, typeCast = '') => `\n let outputIndices${x} = ${output.offsetToIndices(`outputOffset + ${x}u`)};\n ${calcDataIndices(x)};\n let offset${x} = ${data.indicesToOffset(`dataIndices${x}`)};\n let index${x} = offset${x} / 4u;\n let component${x} = offset${x} % 4u;\n ${resStr}[${x}] = ${typeCast}(${data.getByOffset(`index${x}`)}[component${x}]);\n `;\n assignment = `\n let outputOffset = global_idx * ${components};\n var value = vec4(0);\n ${singleAssignment('value', 0, 'u32')}\n ${singleAssignment('value', 1, 'u32')}\n ${singleAssignment('value', 2, 'u32')}\n ${singleAssignment('value', 3, 'u32')}\n ${output.setByOffset('global_idx', 'value')}\n `;\n } else {\n assignment = `\n let outputIndices = ${output.offsetToIndices('global_idx')};\n ${calcDataIndices('')};\n let value = ${data.getByIndices('dataIndices')};\n ${output.setByOffset('global_idx', 'value')};\n `;\n }\n return `\n ${\n shaderHelper.registerUniform('outputSize', 'u32')\n .registerUniform('axisDimLimit', 'i32')\n .registerUniform('axis', 'u32')\n .declareVariables(data, indices, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n ${assignment}\n }`;\n };\n return {\n name: 'Gather',\n shaderCache: {hint: attributes.cacheKey, inputDependencies: ['rank', 'rank']},\n getRunData: () => ({\n outputs: [\n {dims: outputShape, dataType: inputs[0].dataType},\n ],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n};\n\nexport const parseGatherAttributes = (attributes: Record): GatherAttributes =>\n createAttributeWithCacheKey({axis: attributes.axis as number});\n\nexport const gather = (context: ComputeContext, attributes: GatherAttributes): void => {\n const inputs = context.inputs;\n validateInputs(inputs);\n context.compute(createGatherProgramInfo(context.inputs, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface GatherElementsAttributes extends AttributeWithCacheKey {\n axis: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('GatherElements requires 2 inputs.');\n }\n\n if (inputs[0].dims.length < 1) {\n throw new Error('GatherElements requires that the data input be rank >= 1.');\n }\n\n if (inputs[0].dims.length !== inputs[1].dims.length) {\n throw new Error(`GatherElements requires that the data input and\n indices input tensors be of same rank.`);\n }\n};\n\nconst createGatherElementsProgramInfo =\n (inputs: readonly TensorView[], attributes: GatherElementsAttributes): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const inputOutputDataType = inputs[0].dataType;\n const inputRank = inputShape.length;\n\n const indicesShape = inputs[1].dims;\n const indicesDataType = inputs[1].dataType;\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputRank);\n const axisDimLimit = inputShape[axis];\n\n const outputShape = indicesShape.slice(0);\n const outputSize = ShapeUtil.size(outputShape);\n\n const input = inputVariable('input', inputOutputDataType, inputRank);\n const indices = inputVariable('indicesInput', indicesDataType, indicesShape.length);\n const output = outputVariable('output', inputOutputDataType, outputShape.length);\n\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.int32, data: axisDimLimit},\n {type: DataType.uint32, data: axis}\n ];\n programUniforms.push(...createTensorShapeVariables(inputShape, indicesShape, outputShape));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n\n // int64 indices would be treated as little endian i32 with assumption they fall in i32 limits\n // That assumption is safe as it's not possible to allocate >2gb buffer for input tensor\n // Input data will be treated as u32 or two u32 for 8-byte tensors\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${\n shaderHelper.registerUniform('outputSize', 'u32')\n .registerUniform('axisDimLimit', 'i32')\n .registerUniform('axis', 'u32')\n .declareVariables(input, indices, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n\n let outputIndices = ${output.offsetToIndices('global_idx')};\n\n var idx = ${indices.getByOffset('global_idx')};\n if (idx < 0) {\n idx = idx + uniforms.axisDimLimit;\n }\n var inputIndices = ${input.type.indices}(outputIndices);\n ${input.indicesSet('inputIndices', 'uniforms.axis', 'u32(idx)')};\n let value = ${input.getByIndices('inputIndices')};\n\n ${output.setByOffset('global_idx', 'value')};\n }`;\n\n return {\n name: 'GatherElements',\n shaderCache: {inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n };\n\nexport const parseGatherElementsAttributes = (attributes: Record): GatherElementsAttributes =>\n createAttributeWithCacheKey({axis: attributes.axis as number});\n\nexport const gatherElements = (context: ComputeContext, attributes: GatherElementsAttributes): void => {\n const inputs = context.inputs;\n validateInputs(inputs);\n context.compute(createGatherElementsProgramInfo(context.inputs, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {GemmUtil, ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs) {\n throw new Error('Input is missing');\n }\n if (inputs.length < 2 || inputs.length > 3) {\n throw new Error('Invaid input number.');\n }\n\n // 'C' can be of dimensionality 0, 1 or 2 only\n if (inputs.length === 3 && inputs[2].dims.length > 2) {\n throw new Error('Invalid input shape of C');\n }\n\n if ((inputs[0].dataType !== inputs[1].dataType) ||\n (inputs.length === 3 && inputs[0].dataType !== inputs[2].dataType)) {\n throw new Error('Input types are mismatched');\n }\n};\n\nexport interface GemmAttributes extends AttributeWithCacheKey {\n transA: boolean;\n transB: boolean;\n alpha: number;\n beta: number;\n}\n\nconst createGemmProgramInfo = (inputs: readonly TensorView[], attributes: GemmAttributes): ProgramInfo => {\n const aShape = inputs[0].dims.slice();\n const bShape = inputs[1].dims.slice();\n const [M, N, K] = GemmUtil.getShapeOfGemmResult(\n aShape, attributes.transA, bShape, attributes.transB, inputs.length === 3 ? inputs[2].dims : undefined);\n const outputShape = [M, N];\n if (!outputShape) {\n throw new Error('Can\\'t use gemm on the given tensors');\n }\n const outputSize = ShapeUtil.size(outputShape);\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: M}, {type: DataType.uint32, data: N},\n {type: DataType.uint32, data: K}, {type: DataType.float, data: attributes.alpha},\n {type: DataType.float, data: attributes.beta}\n ];\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type'];\n if (inputs.length === 3) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n let line = '';\n if (attributes.transA && attributes.transB) {\n line = 'value += a[k * uniforms.M + m] * b[n * uniforms.K + k];';\n } else if (attributes.transA && !attributes.transB) {\n line = 'value += a[k * uniforms.M + m] * b[k * uniforms.N + n];';\n } else if (!attributes.transA && attributes.transB) {\n line = 'value += a[m * uniforms.K + k] * b[n * uniforms.K + k];';\n } else if (!attributes.transA && !attributes.transB) {\n line = 'value += a[m * uniforms.K + k] * b[k * uniforms.N + n];';\n }\n\n const calculateAlpha = attributes.alpha === 1 ? '' : 'value *= uniforms.alpha;';\n const a = inputVariable('a', inputs[0].dataType, inputs[0].dims);\n const b = inputVariable('b', inputs[1].dataType, inputs[1].dims);\n const dataType = a.type.value;\n let c: IndicesHelper|null = null;\n const variables = [a, b];\n if (inputs.length === 3) {\n c = inputVariable('c', inputs[2].dataType, inputs[2].dims.length);\n variables.push(c);\n }\n const output = outputVariable('output', inputs[0].dataType, outputShape.length);\n variables.push(output);\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'M', type: 'u32'}, {name: 'N', type: 'u32'}, {name: 'K', type: 'u32'},\n {name: 'alpha', type: 'f32'}, {name: 'beta', type: 'f32'}\n ];\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...variables)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let m = global_idx / uniforms.N;\n let n = global_idx % uniforms.N;\n\n var value = ${dataType}(0);\n for (var k: u32 = 0u; k < uniforms.K; k++) {\n ${line}\n }\n\n ${calculateAlpha}\n ${(() => {\n if (c != null) {\n return `let cOffset = ${c.broadcastedIndicesToOffset('vec2(m, n)', output)}; value += ${\n dataType}(uniforms.beta) * ${c.getByOffset('cOffset')};`;\n }\n return '';\n })()}\n output[global_idx] = value;\n }`;\n };\n\n return {\n name: 'Gemm',\n shaderCache: {hint: `${attributes.cacheKey}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n};\n\nexport const parseGemmAttributes = (attributes: Record): GemmAttributes => {\n const transA = attributes.transA as boolean;\n const transB = attributes.transB as boolean;\n const alpha = attributes.alpha as number;\n const beta = attributes.beta as number;\n return {transA, transB, alpha, beta, cacheKey: `${attributes.transA};${attributes.transB};${attributes.alpha === 1}`};\n};\n\nexport const gemm = (context: ComputeContext, attributes: GemmAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createGemmProgramInfo(context.inputs, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, GpuDataType, ProgramUniform} from '../types';\n\nimport {applyAttention, AttentionAttrs, AttentionMaskType, AttentionParameters, AttentionQkvFormat} from './attention';\nimport {inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\nimport {createTransposeProgramInfo, TransposeAttributes} from './transpose';\n\nconst getInput = (inputs: readonly TensorView[], i: number) =>\n (inputs.length > i) && (inputs[i].dims.length > 0) && (ShapeUtil.size(inputs[i].dims)) > 0 ? inputs[i] : undefined;\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: AttentionAttrs): AttentionParameters => {\n const query = inputs[0];\n const key = getInput(inputs, 1);\n const value = getInput(inputs, 2);\n const bias = getInput(inputs, 3);\n const keyPaddingMask = getInput(inputs, 4);\n const relativePositionBias = getInput(inputs, 5);\n const pastKey = getInput(inputs, 6);\n const pastValue = getInput(inputs, 7);\n\n // Abbreviation and Meanings:\n // B: batch_size\n // S: sequence_length (input sequence length of query)\n // P: past_sequence_length (past sequence length of key or value)\n // L: kv_sequence_length (input sequence length of key or value)\n // M: max_sequence_length\n // T: total_sequence_length = past_sequence_length + kv_sequence_length\n // N: num_heads\n // H: head size for Q and K, aka q_head_size or k_head_size or qk_head_size\n // H_v: v_head_size\n // D_i: input hidden size\n // D: hidden size for Q and K (D = N * H), aka q_hidden_size or k_hidden_size or qk_hidden_size\n // D_v: v_hidden_size = num_heads * v_head_size\n\n // key_padding_mask (K/V) : (B) or (2*B + 1) or (B, L) or None\n // relative_position_bias : (B, 1, S, L)\n // past_key : (B, N, S*, H)\n // past_value : (B, N, S*, H)\n // When no packing for q/k/v:\n // query (Q) : (B, S, D)\n // key (K) : (B, L, D) or (B, N, S*, H)\n // value (V) : (B, L, D_v) or (B, N, S*, H)\n // bias (Q/K/V) : (D + D + D_v)\n // When packed kv is used:\n // query (Q) : (B, S, D)\n // key (K) : (B, L, N, 2, H)\n // value (V) : None\n // bias (Q/K/V) : None\n // When packed qkv is used:\n // query (Q) : (B, L, N, 3, H) or (B, S, 3*D)\n // key (K) : None\n // value (V) : None\n // bias (Q/K/V) : None or (D + D + D_v)\n\n if (query.dims.length !== 3 && query.dims.length !== 5) {\n throw new Error('Input query is expected to have 3 or 5 dimensions');\n }\n\n const dmmhaPacking = false;\n const batchSize = query.dims[0];\n const sequenceLength = query.dims[1];\n const hiddenSize = query.dims.length === 3 ? (dmmhaPacking ? query.dims[2] / 3 : query.dims[2]) :\n attributes.numHeads * query.dims[4];\n let kvSequenceLength = sequenceLength;\n\n let pastSequenceLength = 0;\n let maxSequenceLength = 0;\n const headSize = Math.floor(hiddenSize / attributes.numHeads);\n if (pastKey && pastValue) {\n if (pastKey.dims.length !== 4) {\n throw new Error('Input \"past_key\" is expected to have 4 dimensions');\n }\n if (pastKey.dims[0] !== batchSize || pastKey.dims[1] !== attributes.numHeads || pastKey.dims[3] !== headSize) {\n throw new Error('Input \"past_key\" shape (batch_size, num_heads, past_sequence_length, head_size)');\n }\n if (pastValue.dims[0] !== batchSize || pastValue.dims[1] !== attributes.numHeads ||\n pastValue.dims[3] !== headSize) {\n throw new Error('Input \"past_value\" shape (batch_size, num_heads, past_sequence_length, head_size)');\n }\n if (pastKey.dims[2] !== pastValue.dims[2]) {\n throw new Error('Input \"past_key\" and \"past_value\" shall have same dim 2 (past_sequence_length)');\n }\n if (pastValue.dims.length !== 4) {\n throw new Error('Input \"past_value\" is expected to have 4 dimensions');\n }\n pastSequenceLength = pastKey.dims[2];\n maxSequenceLength = pastKey.dims[2];\n } else if (pastKey || pastValue) {\n throw new Error('Input \"past_key\" and \"past_value\" shall be both present or both absent');\n }\n\n let qkvFormat: AttentionQkvFormat;\n if (key) {\n if (query.dims.length !== 3) {\n throw new Error('Input \"query\" is expected to have 3 dimensions when key is given');\n }\n if (key.dims.length < 3 || key.dims.length > 5) {\n throw new Error('Input \"key\" is expected to have 3, 4, or 5 dimensions');\n }\n if (query.dims[0] !== key.dims[0]) {\n throw new Error('Input \"query\" and \"key\" shall have same dim 0 (batch size)');\n }\n\n if (key.dims.length === 3) {\n if (key.dims[2] !== query.dims[2]) {\n throw new Error('Input \"query\" and \"key\" shall have same dim 2 (hidden_size)');\n }\n qkvFormat = AttentionQkvFormat.qkvBSNH;\n kvSequenceLength = key.dims[1];\n } else if (key.dims.length === 5) {\n if (key.dims[2] !== attributes.numHeads || key.dims[3] !== 2 || key.dims[4] !== headSize) {\n throw new Error('Expect \"key\" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');\n }\n if (value) {\n throw new Error('Expect \"value\" be none when \"key\" has packed kv format.');\n }\n qkvFormat = AttentionQkvFormat.qKvBSNHxBSN2H;\n kvSequenceLength = key.dims[1];\n } else { // key_dims.size() == 4 (cross-attention with past_key)\n if (key.dims[1] !== attributes.numHeads || key.dims[3] !== headSize) {\n throw new Error('Expect \"key\" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');\n }\n\n qkvFormat = AttentionQkvFormat.unknown;\n kvSequenceLength = key.dims[2];\n }\n } else { // packed QKV\n if (query.dims.length !== 3 && query.dims.length !== 5) {\n throw new Error('Input \"query\" is expected to have 3 or 5 dimensions when key is empty');\n }\n if (query.dims.length === 5 && (query.dims[2] !== attributes.numHeads || query.dims[3] !== 3)) {\n throw new Error('Expect \"query\" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');\n }\n\n qkvFormat = AttentionQkvFormat.qkvBSN3H;\n }\n\n if (bias) {\n if (bias.dims.length !== 1) {\n throw new Error('Input \"bias\" is expected to have 1 dimension');\n }\n\n if (value) {\n if (query.dims.length === 5 && query.dims[3] === 2) {\n throw new Error('bias is not allowed for packed kv.');\n }\n }\n }\n\n let maskType: AttentionMaskType = AttentionMaskType.none;\n if (keyPaddingMask) {\n maskType = AttentionMaskType.maskUnknown;\n const maskDims = keyPaddingMask.dims;\n if (maskDims.length === 1) {\n if (maskDims[0] === batchSize) {\n maskType = AttentionMaskType.mask1dKeySeqLen;\n } else if (maskDims[0] === 3 * batchSize + 2) {\n maskType = AttentionMaskType.mask1DKeySeqLenStart;\n }\n } else if (maskDims.length === 2 && maskDims[0] === batchSize && maskDims[1] === kvSequenceLength) {\n maskType = AttentionMaskType.mask2dKeyPadding;\n }\n if (maskType === AttentionMaskType.maskUnknown) {\n throw new Error('Input \"key_padding_mask\" shape shall be (batch_size) or (batch_size, kv_sequence_length)');\n }\n throw new Error('Mask not supported');\n }\n\n let passPastInKv = false;\n let vHiddenSize = hiddenSize;\n if (value) {\n if (value.dims.length !== 3 && value.dims.length !== 4) {\n throw new Error('Input \"value\" is expected to have 3 or 4 dimensions');\n }\n\n if (query.dims[0] !== value.dims[0]) {\n throw new Error('Input \"query\" and \"value\" shall have same dim 0 (batch_size)');\n }\n\n if (value.dims.length === 3) {\n if (kvSequenceLength !== value.dims[1]) {\n throw new Error('Input \"key\" and \"value\" shall have the same dim 1 (kv_sequence_length)');\n }\n vHiddenSize = value.dims[2];\n } else {\n if (kvSequenceLength !== value.dims[2]) {\n throw new Error('Input \"past_key\" and \"past_value\" shall have the same dim 2 (kv_sequence_length)');\n }\n vHiddenSize = value.dims[1] * value.dims[3];\n passPastInKv = true;\n }\n }\n\n const totalSequenceLength = pastSequenceLength + kvSequenceLength;\n const broadcastResPosBias = false;\n\n if (keyPaddingMask) {\n throw new Error('Key padding mask is not supported');\n }\n\n if (relativePositionBias) {\n if (relativePositionBias.dims.length !== 4) {\n throw new Error('Input \"relative_position_bias\" is expected to have 4 dimensions');\n }\n if ((relativePositionBias.dims[0] !== batchSize && relativePositionBias.dims[0] !== 1) ||\n relativePositionBias.dims[1] !== attributes.numHeads || relativePositionBias.dims[2] !== sequenceLength ||\n relativePositionBias.dims[3] !== totalSequenceLength) {\n throw new Error('Input \"relative_position_bias\" shape (batch_size, 1, sequence_length, kv_sequence_length)');\n }\n }\n\n return {\n batchSize,\n sequenceLength,\n pastSequenceLength,\n kvSequenceLength,\n totalSequenceLength,\n maxSequenceLength,\n inputHiddenSize: 0,\n hiddenSize,\n vHiddenSize,\n headSize,\n vHeadSize: Math.floor(vHiddenSize / attributes.numHeads),\n numHeads: attributes.numHeads,\n isUnidirectional: false,\n pastPresentShareBuffer: false,\n maskFilterValue: attributes.maskFilterValue,\n maskType,\n scale: attributes.scale,\n broadcastResPosBias,\n passPastInKv,\n qkvFormat,\n };\n};\n\nexport const parseMultiHeadAttentionAttributes = (attributes: AttentionAttrs): AttentionAttrs =>\n createAttributeWithCacheKey({...attributes});\n\nconst weightTransposeAttribute: TransposeAttributes = createAttributeWithCacheKey({perm: [0, 2, 1, 3]});\n\nconst addBiasTranspose =\n (context: ComputeContext, qkv: TensorView, bias: TensorView, batchSize: number, sequenceLength: number,\n hiddenSize: number, biasOffset: number) => {\n const outputShape = [batchSize, sequenceLength, hiddenSize];\n const outputSize = ShapeUtil.size(outputShape);\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: biasOffset},\n {type: DataType.uint32, data: hiddenSize}\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('qkv_with_bias', qkv.dataType, outputShape);\n const qkvInput = inputVariable('qkv', qkv.dataType, outputShape);\n const biasInput = inputVariable('bias', bias.dataType, outputShape);\n\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'bias_offset', type: 'u32'}, {name: 'hidden_size', type: 'u32'}\n ];\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(qkvInput, biasInput, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let bias_offset_idx = (global_idx % uniforms.hidden_size) + uniforms.bias_offset;\n\n qkv_with_bias[global_idx] = qkv[global_idx] + bias[bias_offset_idx];\n }`;\n };\n\n return context.compute(\n {\n name: 'MultiHeadAttentionAddBias',\n shaderCache: {inputDependencies: ['type', 'type']},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: qkv.dataType, gpuDataType: GpuDataType.default}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n },\n {inputs: [qkv, bias], outputs: [-1]})[0];\n };\n\nexport const maybeTransposeToBNSHAndAddBias =\n (context: ComputeContext, batchSize: number, numHeads: number, sequenceLength: number, headSize: number,\n input: TensorView, bias?: TensorView, biasOffset?: number) => {\n // const newDims = [];\n\n let reshapedInput = input;\n if (!bias) {\n if (input.dims.length === 3) {\n reshapedInput = input.reshape([batchSize, sequenceLength, numHeads, headSize]);\n }\n return context.compute(\n createTransposeProgramInfo(reshapedInput, weightTransposeAttribute.perm),\n {inputs: [reshapedInput], outputs: [-1]})[0];\n } else {\n if (sequenceLength === 1) {\n throw new Error('AddBiasReshape is not implemented. Please export your model with packed QKV or KV');\n } else {\n reshapedInput =\n addBiasTranspose(context, input, bias, batchSize, sequenceLength, numHeads * headSize, biasOffset!);\n reshapedInput = reshapedInput.reshape([batchSize, sequenceLength, numHeads, headSize]);\n return context.compute(\n createTransposeProgramInfo(reshapedInput, weightTransposeAttribute.perm),\n {inputs: [reshapedInput], outputs: [-1]})[0];\n }\n }\n };\n\nexport const multiHeadAttention = (context: ComputeContext, attributes: AttentionAttrs): void => {\n const params = validateInputs(context.inputs, attributes);\n const query = context.inputs[0];\n const key = getInput(context.inputs, 1);\n const value = getInput(context.inputs, 2);\n const bias = getInput(context.inputs, 3);\n const keyPaddingMask = getInput(context.inputs, 4);\n const relativePositionBias = getInput(context.inputs, 5);\n const pastKey = getInput(context.inputs, 6);\n const pastValue = getInput(context.inputs, 7);\n if (query.dims.length === 5) {\n throw new Error('Packed QKV is not implemented');\n }\n\n if (key?.dims.length === 5) {\n throw new Error('Packed KV is not implemented');\n }\n\n // applyAttention expects BNSH inputs\n const kvBNSH = key && value && key.dims.length === 4 && value.dims.length === 4;\n\n const Q = maybeTransposeToBNSHAndAddBias(\n context, params.batchSize, params.numHeads, params.sequenceLength, params.headSize, query, bias, 0);\n\n if (kvBNSH) {\n return applyAttention(\n context, Q, key, value, keyPaddingMask, undefined, pastKey, pastValue, relativePositionBias, params,\n attributes);\n }\n if (!key || !value) {\n throw new Error('key and value must be provided');\n }\n const K = maybeTransposeToBNSHAndAddBias(\n context, params.batchSize, params.numHeads, params.kvSequenceLength, params.headSize, key, bias,\n params.hiddenSize);\n\n const V = maybeTransposeToBNSHAndAddBias(\n context, params.batchSize, params.numHeads, params.kvSequenceLength, params.vHeadSize, value, bias,\n 2 * params.hiddenSize);\n\n applyAttention(\n context, Q, K, V, keyPaddingMask, undefined, pastKey, pastValue, relativePositionBias, params, attributes);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nconst getRepeats = (repeatsTensorView: TensorView): readonly number[] =>\n Array.from(repeatsTensorView.getBigInt64Array(), Number);\n\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Tile requires 2 inputs.');\n }\n\n if (inputs[0].dataType !== DataType.float && inputs[0].dataType !== DataType.float16 &&\n inputs[0].dataType !== DataType.int32 && inputs[0].dataType !== DataType.uint32) {\n throw new Error('Tile only support float, float16, int32, and uint32 data types');\n }\n\n if (inputs[1].dataType !== DataType.int64) {\n throw new Error('Tile `repeats` input should be of int64 data type');\n }\n\n if (inputs[1].dims.length !== 1) {\n throw new Error('Tile `repeats` input should be 1-D');\n }\n\n const repeats: readonly number[] = getRepeats(inputs[1]);\n\n if (repeats.length !== inputs[0].dims.length) {\n throw new Error('Tile `repeats` input should have same number of elements as rank of input data tensor');\n }\n};\n\nconst getOutputShape = (inputShape: readonly number[], repeats: readonly number[]): readonly number[] => {\n const outputShape: number[] = [];\n\n for (let i = 0; i < inputShape.length; ++i) {\n outputShape.push(inputShape[i] * repeats[i]);\n }\n\n return outputShape;\n};\n\nexport const createTileProgramInfo = (inputs: readonly TensorView[], shape?: number[]): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const repeats: readonly number[] = shape == null ? getRepeats(inputs[1]) : shape;\n const outputShape = getOutputShape(inputShape, repeats);\n const outputSize = ShapeUtil.size(outputShape);\n\n const dataType = inputs[0].dataType;\n const input = inputVariable('input', dataType, inputShape.length);\n const output = outputVariable('output', dataType, outputShape.length);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n const inputShape = ${input.indices(...inputShape)};\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let output_indices = ${output.offsetToIndices('global_idx')};\n var input_indices: ${input.type.indices};\n for (var i = 0; i < ${inputShape.length}; i++) {\n let input_dim_i = ${input.indicesGet('uniforms.input_shape', 'i')};\n let input_dim_value = ${output.indicesGet('output_indices', 'i')} % input_dim_i;\n\n ${input.indicesSet('input_indices', 'i', 'input_dim_value')}\n }\n ${output.setByOffset('global_idx', input.getByIndices('input_indices'))}\n }`;\n\n return {\n name: 'Tile',\n shaderCache: {hint: `${repeats}`, inputDependencies: ['rank']},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms:\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(inputs[0].dims, outputShape)],\n }),\n getShaderSource,\n };\n};\n\nexport const tile = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n context.compute(createTileProgramInfo(context.inputs), {inputs: [0]});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {applyAttention, AttentionAttrs, AttentionMaskType, AttentionParameters, AttentionQkvFormat} from './attention';\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\nimport {maybeTransposeToBNSHAndAddBias} from './multihead-attention';\nimport {createTileProgramInfo} from './tile';\nimport {createTransposeProgramInfo, TransposeAttributes} from './transpose';\n\nexport const validateInputs = (inputs: readonly TensorView[], attributes: AttentionAttrs): AttentionParameters => {\n const query = inputs[0];\n const key = inputs[1];\n const value = inputs[2];\n const pastKey = inputs[3];\n const pastValue = inputs[4];\n\n // Abbreviation and Meanings:\n // B: batch_size\n // S: sequence_length (input sequence length of query)\n // P: past_sequence_length (past sequence length of key or value)\n // L: kv_sequence_length (input sequence length of key or value)\n // M: max_sequence_length\n // T: total_sequence_length = past_sequence_length + kv_sequence_length\n // N: num_heads\n // H: head size for Q and K, aka q_head_size or k_head_size or qk_head_size\n // H_v: v_head_size\n // D_i: input hidden size\n // D: hidden size for Q and K (D = N * H), aka q_hidden_size or k_hidden_size or qk_hidden_size\n // D_v: v_hidden_size = num_heads * v_head_size\n\n // past_key : (B, N, S*, H)\n // past_value : (B, N, S*, H)\n // When no packing for q/k/v:\n // query (Q) : (B, S, D)\n // key (K) : (B, L, D) or (B, N, S*, H)\n // value (V) : (B, L, D_v) or (B, N, S*, H)\n // When packed kv is used:\n // query (Q) : (B, S, D)\n // key (K) : (B, L, N, 2, H)\n // value (V) : None\n // When packed qkv is used:\n // query (Q) : (B, L, N, 3, H) or (B, S, 3*D)\n // key (K) : None\n // value (V) : None\n\n if (query.dims.length !== 3 && query.dims.length !== 5) {\n throw new Error('Input query is expected to have 3 or 5 dimensions');\n }\n\n const dmmhaPacking = false;\n const batchSize = query.dims[0];\n const sequenceLength = query.dims[1];\n const hiddenSize = query.dims.length === 3 ? (dmmhaPacking ? query.dims[2] / 3 : query.dims[2]) :\n attributes.numHeads * query.dims[4];\n let kvSequenceLength = sequenceLength;\n\n let pastSequenceLength = 0;\n let maxSequenceLength = 0;\n const headSize = Math.floor(hiddenSize / attributes.numHeads);\n const hasPastKey = pastKey && pastKey.dims.length !== 0;\n const hasPastValue = pastValue && pastValue.dims.length !== 0;\n // TODO : this should be from attributes.\n const isPastkvBSNH = true;\n if (hasPastKey && hasPastValue) {\n if (pastKey.dims.length !== 4) {\n throw new Error('Input \"past_key\" is expected to have 4 dimensions');\n }\n if (pastValue.dims.length !== 4) {\n throw new Error('Input \"past_value\" is expected to have 4 dimensions');\n }\n if (isPastkvBSNH) {\n // For BSNH\n pastSequenceLength = pastKey.dims[1];\n maxSequenceLength = pastKey.dims[1];\n } else {\n // For BNSH\n pastSequenceLength = pastKey.dims[2];\n maxSequenceLength = pastKey.dims[2];\n }\n } else if (hasPastKey || hasPastValue) {\n throw new Error('Input \"past_key\" and \"past_value\" shall be both present or both absent');\n }\n\n let qkvFormat: AttentionQkvFormat;\n if (key) {\n if (query.dims.length !== 3) {\n throw new Error('Input \"query\" is expected to have 3 dimensions when key is given');\n }\n if (key.dims.length < 3 || key.dims.length > 5) {\n throw new Error('Input \"key\" is expected to have 3, 4, or 5 dimensions');\n }\n if (query.dims[0] !== key.dims[0]) {\n throw new Error('Input \"query\" and \"key\" shall have same dim 0 (batch size)');\n }\n\n if (key.dims.length === 3) {\n if (query.dims[2] % key.dims[2] !== 0) {\n throw new Error('Dimension 2 of \"query\" should be a multiple of \"key\"');\n }\n qkvFormat = AttentionQkvFormat.qkvBSNH;\n kvSequenceLength = key.dims[1];\n } else if (key.dims.length === 5) {\n if (key.dims[2] !== attributes.numHeads || key.dims[3] !== 2 || key.dims[4] !== headSize) {\n throw new Error('Expect \"key\" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');\n }\n if (value) {\n throw new Error('Expect \"value\" be none when \"key\" has packed kv format.');\n }\n qkvFormat = AttentionQkvFormat.qKvBSNHxBSN2H;\n kvSequenceLength = key.dims[1];\n } else { // key_dims.size() == 4 (cross-attention with past_key)\n if (key.dims[1] !== attributes.numHeads || key.dims[3] !== headSize) {\n throw new Error('Expect \"key\" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');\n }\n\n qkvFormat = AttentionQkvFormat.unknown;\n kvSequenceLength = key.dims[2];\n }\n } else { // packed QKV\n if (query.dims.length !== 3 && query.dims.length !== 5) {\n throw new Error('Input \"query\" is expected to have 3 or 5 dimensions when key is empty');\n }\n if (query.dims.length === 5 && (query.dims[2] !== attributes.numHeads || query.dims[3] !== 3)) {\n throw new Error('Expect \"query\" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');\n }\n\n qkvFormat = AttentionQkvFormat.qkvBSN3H;\n }\n\n const maskType: AttentionMaskType = AttentionMaskType.none;\n let passPastInKv = false;\n let vHiddenSize = hiddenSize;\n if (value) {\n if (value.dims.length !== 3 && value.dims.length !== 4) {\n throw new Error('Input \"value\" is expected to have 3 or 4 dimensions');\n }\n\n if (query.dims[0] !== value.dims[0]) {\n throw new Error('Input \"query\" and \"value\" shall have same dim 0 (batch_size)');\n }\n\n if (value.dims.length === 3) {\n if (kvSequenceLength !== value.dims[1]) {\n throw new Error('Input \"key\" and \"value\" shall have the same dim 1 (kv_sequence_length)');\n }\n vHiddenSize = value.dims[2];\n } else {\n if (kvSequenceLength !== value.dims[2]) {\n throw new Error('Input \"past_key\" and \"past_value\" shall have the same dim 2 (kv_sequence_length)');\n }\n vHiddenSize = value.dims[1] * value.dims[3];\n passPastInKv = true;\n }\n }\n const totalSequenceLength = pastSequenceLength + kvSequenceLength;\n const broadcastResPosBias = false;\n\n return {\n batchSize,\n sequenceLength,\n pastSequenceLength,\n kvSequenceLength,\n totalSequenceLength,\n maxSequenceLength,\n inputHiddenSize: 0,\n hiddenSize,\n vHiddenSize,\n headSize,\n vHeadSize: Math.floor(vHiddenSize / attributes.kvNumHeads!),\n numHeads: attributes.numHeads,\n kvNumHeads: attributes.kvNumHeads,\n nReps: attributes.numHeads / attributes.kvNumHeads!,\n pastPresentShareBuffer: false,\n maskType,\n scale: attributes.scale,\n broadcastResPosBias,\n passPastInKv,\n qkvFormat,\n isPastkvBSNH,\n };\n};\n\nconst createConcatProgramInfo =\n (a: TensorView, b: TensorView|undefined, dataType: DataType, params: AttentionParameters): ProgramInfo => {\n const outputShape = [params.batchSize, params.totalSequenceLength, params.kvNumHeads!, params.headSize];\n const component = 4;\n const outputSize = ShapeUtil.size(outputShape) / component;\n const presentSequenceLength = params.totalSequenceLength;\n const output = outputVariable('present_kv', dataType, outputShape.length, component);\n const inputA = inputVariable('new_kv', a.dataType, a.dims.length, component);\n const inputB = b ? inputVariable('past_kv', b.dataType, b.dims.length, component) : undefined;\n\n const H = Math.ceil(params.headSize / component);\n const dispatch = {x: presentSequenceLength, y: a.dims[0], z: 1};\n\n const inputDependencies: ProgramInputTensorInfoDependency[] = b ? ['rank', 'rank'] : ['rank'];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: params.pastSequenceLength},\n {type: DataType.uint32, data: params.kvSequenceLength},\n {type: DataType.uint32, data: params.totalSequenceLength}\n ];\n\n const inputs = [inputA];\n if (inputB) {\n programUniforms.push(\n ...createTensorShapeVariables(a.dims), ...createTensorShapeVariables(b!.dims),\n ...createTensorShapeVariables(outputShape));\n inputs.push(inputB);\n } else {\n programUniforms.push(...createTensorShapeVariables(a.dims), ...createTensorShapeVariables(outputShape));\n }\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'past_seqlen', type: 'u32'}, {name: 'new_seqlen', type: 'u32'},\n {name: 'present_seqlen', type: 'u32'}\n ];\n\n const pastStr = ` let past_batch_stride = uniforms.past_seqlen * num_heads * H;\n var past_head_stride = uniforms.past_seqlen * H;\n if (is_bsnh) {\n past_head_stride = H;\n }\n let in_offset = b * past_batch_stride + s * row_stride + n * past_head_stride + h;\n present_kv[out_offset] = past_kv[in_offset];`;\n const newStr = ` let new_batch_stride = uniforms.new_seqlen * num_heads * H;\n let new_row_stride = num_heads * H;\n let new_head_stride = H;\n let in_offset = b * new_batch_stride + (s - past_seqlen) * new_row_stride + n * new_head_stride + h;\n present_kv[out_offset] = new_kv[in_offset];`;\n const concatStr = b ? `if (s < past_seqlen) {\n ${pastStr}\n } else if (s < past_seqlen + uniforms.new_seqlen) {\n ${newStr}\n }` :\n `if (s < past_seqlen + uniforms.new_seqlen) {\n ${newStr}\n }`;\n\n // TODO: handle H * params.kvNumHeads greater than maxComputeInvocationsPerWorkgroup limit.\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputs, output)}\n ${shaderHelper.mainStart([\n H, params.kvNumHeads!, 1\n ])}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n var indices = ${output.offsetToIndices('global_idx')};\n let h = local_id.x;\n let n = local_id.y;\n let s = workgroup_id.x;\n let b = workgroup_id.y;\n let num_heads = ${params.kvNumHeads!}u;\n let H = ${H}u;\n\n let present_seqlen = uniforms.present_seqlen;\n let present_batch_stride = present_seqlen * num_heads * H;\n var row_stride = H;\n let is_bsnh = ${params.isPastkvBSNH};\n\n if (is_bsnh) {\n row_stride = num_heads * H;\n }\n var present_head_stride = present_seqlen * H;\n if (is_bsnh) {\n present_head_stride = H;\n }\n\n let past_seqlen = uniforms.past_seqlen;\n\n let out_offset = b * present_batch_stride + s * row_stride + n * present_head_stride + h;\n ${concatStr}\n }`;\n\n return {\n name: 'ConcatPastNew',\n shaderCache: {hint: `${params.kvNumHeads!}${H}${!!b}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType}],\n dispatchGroup: dispatch,\n programUniforms,\n }),\n getShaderSource,\n };\n };\n\nexport const parseGroupQueryAttentionAttributes = (attributes: AttentionAttrs): AttentionAttrs =>\n createAttributeWithCacheKey({...attributes});\n\nconst weightTransposeAttribute: TransposeAttributes = createAttributeWithCacheKey({perm: [0, 2, 1, 3]});\n\nconst maybeExpandAndTransposeToBNSH =\n (context: ComputeContext, input: TensorView, pastKV: TensorView|undefined, params: AttentionParameters,\n outputIndex: number) => {\n let reshapedInput = input;\n const numHeads = params.kvNumHeads!;\n const nReps = params.nReps!;\n if (input.dims.length === 3 && params.kvSequenceLength !== 0) {\n reshapedInput = input.reshape([params.batchSize, params.kvSequenceLength, numHeads, params.headSize]);\n }\n\n if (pastKV) {\n reshapedInput = context.compute(\n createConcatProgramInfo(reshapedInput, pastKV, reshapedInput.dataType, params),\n {inputs: [reshapedInput, pastKV], outputs: [params.isPastkvBSNH ? outputIndex : -1]})[0];\n } else {\n reshapedInput = context.compute(\n createConcatProgramInfo(reshapedInput, undefined, reshapedInput.dataType, params),\n {inputs: [reshapedInput], outputs: [params.isPastkvBSNH ? outputIndex : -1]})[0];\n }\n if (nReps !== 1) {\n reshapedInput = context.compute(\n createTileProgramInfo([reshapedInput], [1, 1, 1, nReps]), {inputs: [reshapedInput], outputs: [-1]})[0];\n reshapedInput =\n reshapedInput.reshape([params.batchSize, params.totalSequenceLength, numHeads * nReps, params.headSize]);\n }\n\n return context.compute(\n createTransposeProgramInfo(reshapedInput, weightTransposeAttribute.perm),\n {inputs: [reshapedInput], outputs: [-1]})[0];\n };\n\nexport const groupQueryAttention = (context: ComputeContext, attributes: AttentionAttrs): void => {\n const params = validateInputs(context.inputs, attributes);\n if (context.inputs[0].dims.length === 5) {\n throw new Error('Packed QKV is not implemented');\n }\n\n if (context.inputs[1]?.dims.length === 5) {\n throw new Error('Packed KV is not implemented');\n }\n\n const Q = maybeTransposeToBNSHAndAddBias(\n context, params.batchSize, params.numHeads, params.sequenceLength, params.headSize, context.inputs[0], undefined,\n 0);\n const pastKey = context.inputs[3] && context.inputs[3].dims.length !== 0 ? context.inputs[3] : undefined;\n const pastValue = context.inputs[4] && context.inputs[4].dims.length !== 0 ? context.inputs[4] : undefined;\n const K = maybeExpandAndTransposeToBNSH(context, context.inputs[1], pastKey, params, 1);\n const V = maybeExpandAndTransposeToBNSH(context, context.inputs[2], pastValue, params, 2);\n applyAttention(context, Q, K, V, undefined, undefined, undefined, undefined, undefined, params, attributes);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, fillVector, getMaxComponents, inputVariable, outputVariable, ShaderHelper, sumVector, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\n\nexport interface InstanceNormAttributes {\n epsilon: number;\n format: 'NHWC'|'NCHW';\n}\n\nconst createInstanceNormProgramInfo =\n (inputs: readonly TensorView[], attributes: InstanceNormAttributes): ProgramInfo => {\n const xShape = inputs[0].dims;\n const outputShape = xShape;\n const axis = 2;\n const normCount = ShapeUtil.sizeToDimension(xShape, axis);\n const normSize = ShapeUtil.sizeFromDimension(xShape, axis);\n const components = getMaxComponents(normSize);\n const normPackedSize = normSize / components;\n const inputShape = [xShape[0], xShape[1], normPackedSize];\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'type', 'type'];\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: normSize}, {type: DataType.uint32, data: normPackedSize}];\n programUniforms.push(...createTensorShapeVariables(inputShape, inputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const x = inputVariable('x', inputs[0].dataType, inputShape.length, components);\n const scale = inputVariable('scale', inputs[1].dataType, inputs[1].dims);\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims);\n const output = outputVariable('output', inputs[0].dataType, inputShape.length, components);\n const variables = [x, scale, bias, output];\n const dataType = x.type.value;\n const f32Type = components === 1 ? 'f32' : `vec${components}`;\n const workgroupSize = 64;\n\n const uniforms: UniformsArrayType = [{name: 'normSize', type: 'u32'}, {name: 'normPackedSize', type: 'u32'}];\n return `\n var meanShared : f32;\n var squaredNormShared : f32;\n var workgroupShared : array<${f32Type}, ${workgroupSize}>;\n const workgroupSize = ${workgroupSize}u;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...variables)}\n ${shaderHelper.mainStart(workgroupSize)}\n let norm = global_idx / workgroupSize;\n let batch = norm / uniforms.x_shape[1];\n let channel = norm % uniforms.x_shape[1];\n let localIndex = local_id.x;\n\n // initialize workgroup memory\n var initial = ${f32Type}(0);\n for (var h = localIndex; h < uniforms.normPackedSize; h += workgroupSize) {\n initial = initial + ${f32Type}(${x.get('batch', 'channel', 'h')});\n }\n workgroupShared[localIndex] = initial;\n workgroupBarrier();\n\n // Calculate the mean of current channel data.\n for (var currSize = workgroupSize >> 1; currSize > 0; currSize = currSize >> 1) {\n if (localIndex < currSize) {\n workgroupShared[localIndex] = workgroupShared[localIndex] + workgroupShared[localIndex + currSize];\n }\n workgroupBarrier();\n }\n if (localIndex == 0) {\n meanShared = ${sumVector('workgroupShared[0]', components)} / f32(uniforms.normSize);\n }\n workgroupBarrier();\n\n // reinitialize workgroup memory.\n initial = ${f32Type}(0);\n for (var h = localIndex; h < uniforms.normPackedSize; h += workgroupSize) {\n let deviation = ${f32Type}(${x.get('batch', 'channel', 'h')}) - ${f32Type}(meanShared);\n initial = initial + deviation * deviation;\n }\n workgroupShared[localIndex] = initial;\n workgroupBarrier();\n\n // Calculate the sum of square of deviation of current channel data.\n for (var currSize = workgroupSize >> 1; currSize > 0; currSize = currSize >> 1) {\n if (localIndex < currSize) {\n workgroupShared[localIndex] = workgroupShared[localIndex] + workgroupShared[localIndex + currSize];\n }\n workgroupBarrier();\n }\n if (localIndex == 0) {\n squaredNormShared = ${sumVector('workgroupShared[0]', components)};\n }\n workgroupBarrier();\n\n let invStdDev = inverseSqrt(squaredNormShared / f32(uniforms.normSize) + f32(${attributes.epsilon}));\n let channelScale = invStdDev * f32(${scale.getByOffset('channel')});\n let channelShift = f32(${bias.getByOffset('channel')}) - meanShared * channelScale;\n for (var h = localIndex; h < uniforms.normPackedSize; h += workgroupSize) {\n let value = ${x.get('batch', 'channel', 'h')} * ${dataType}(${f32Type}(channelScale)) + ${dataType}(${\n f32Type}(channelShift));\n ${output.set('batch', 'channel', 'h', 'value')};\n }\n }`;\n };\n return {\n ...{name: 'InstanceNormalization'},\n // TODO: use epsilon as uniform. Currently epsilon as uniform fails test_instancenorm_epsilon.\n shaderCache: {hint: `${attributes.epsilon};${components}`, inputDependencies},\n getRunData: () => ({\n outputs: [\n {dims: outputShape, dataType: inputs[0].dataType},\n ],\n dispatchGroup: {x: normCount},\n programUniforms\n }),\n getShaderSource,\n };\n };\n\nconst computeMean =\n (context: ComputeContext, input: TensorView, scale: TensorView, bias: TensorView, n: number, h: number, c: number,\n epsilon: number) => {\n const components = getMaxComponents(c);\n const WG = 64;\n // we will store channel scale and channel shift in [2, components] matrix\n // or in vec2 when components == 1\n const outputType = components === 1 ? 'vec2f' : `mat2x${components}f`;\n const sumCastType = components === 1 ? 'f32' : `vec${components}f`;\n const setOutputValue = (var1: string, var2: string) => `${outputType}(${var1}, ${var2})`;\n const unitsOfWork = n * c / components;\n const wgSize = Math.ceil(h / WG);\n\n const meanInputDependencies: ProgramInputTensorInfoDependency[] = ['type'];\n const meanProgramUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: wgSize}, {type: DataType.uint32, data: h},\n {type: DataType.uint32, data: Math.floor(c / components)},\n {type: DataType.uint32, data: Math.floor(h * c / components)}\n ];\n\n const getMeanShaderSource = (shaderHelper: ShaderHelper) => {\n const inputHelper = inputVariable('input', input.dataType, input.dims, components);\n return `\n ${shaderHelper.declareVariables(inputHelper)}\n @group(0) @binding(1) var output : array<${outputType}>;\n struct Uniforms {wg_size:u32, H:u32, C:u32, image_size:u32};\n @group(0) @binding(2) var uniforms: Uniforms;\n\n ${shaderHelper.mainStart(WG)}\n let currentImageNumber = global_idx / ${WG} / uniforms.C;\n let currentChannelNumber = (global_idx / ${WG}) % uniforms.C;\n let wgOffset = local_id.x * uniforms.wg_size;\n if (wgOffset >= uniforms.H) {\n return;\n }\n let wgMax = min(wgOffset + uniforms.wg_size, uniforms.H);\n\n let offset = currentImageNumber * uniforms.image_size + currentChannelNumber;\n var sum = ${fillVector('f32', components)};\n var squaredSum = ${fillVector('f32', components)};\n for (var i: u32 = wgOffset; i < wgMax; i++) {\n let value = ${sumCastType}(input[offset + i * uniforms.C]);\n sum += value;\n squaredSum += value * value;\n }\n output[global_idx] = ${setOutputValue('sum', 'squaredSum')};\n }`;\n };\n\n const meanValues = context.compute(\n {\n name: 'InstanceNormComputeMean',\n shaderCache: {hint: `${components}`, inputDependencies: meanInputDependencies},\n getRunData: () => ({\n outputs: [\n {dims: [n, c, WG, 2], dataType: DataType.float},\n ],\n dispatchGroup: {x: n * c / components},\n programUniforms: meanProgramUniforms\n }),\n getShaderSource: getMeanShaderSource,\n },\n {inputs: [input], outputs: [-1]})[0];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: unitsOfWork}, {type: DataType.uint32, data: h},\n {type: DataType.uint32, data: Math.floor(c / components)},\n {type: DataType.uint32, data: Math.floor(WG * c / components)}\n ];\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type', 'type'];\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const scaleHelper = inputVariable('scale', scale.dataType, scale.dims, components);\n const biasHelper = inputVariable('bias', bias.dataType, bias.dims, components);\n return `\n @group(0) @binding(0) var input : array<${outputType}>;\n @group(0) @binding(1) var scale : array<${scaleHelper.type.storage}>;\n @group(0) @binding(2) var bias : array<${biasHelper.type.storage}>;\n @group(0) @binding(3) var output : array<${outputType}>;\n struct Uniforms {units_of_work : u32, H: u32, C : u32, image_size : u32};\n @group(0) @binding(4) var uniforms: Uniforms;\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.units_of_work')}\n let currentImageNumber = global_idx / uniforms.C;\n let currentChannelNumber = global_idx % uniforms.C;\n\n let offset = currentImageNumber * uniforms.image_size;\n var sum = ${fillVector('f32', components)};\n var squaredSum = ${fillVector('f32', components)};\n for (var i: u32 = 0; i < min(${WG}, uniforms.H); i++) {\n let value = input[offset + i + currentChannelNumber * ${WG}];\n sum += value[0];\n squaredSum += value[1];\n }\n sum = sum / f32(uniforms.H);\n squaredSum = squaredSum / f32(uniforms.H);\n let invStdDev = inverseSqrt(squaredSum - sum * sum + f32(${epsilon}));\n let channelScale = invStdDev * ${sumCastType}(scale[currentChannelNumber]);\n let channelShift = ${sumCastType}(bias[currentChannelNumber]) - sum * channelScale;\n\n output[global_idx] = ${setOutputValue('channelScale', 'channelShift')};\n }`;\n };\n return context.compute(\n {\n name: 'InstanceNormComputeChannelScaleShift',\n // TODO: use epsilon as uniform. Currently epsilon as uniform fails test_instancenorm_epsilon.\n shaderCache: {hint: `${components};${epsilon}`, inputDependencies},\n getRunData: () => ({\n outputs: [\n {dims: [n, c, 2], dataType: DataType.float},\n ],\n dispatchGroup: {x: Math.ceil(unitsOfWork / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n },\n {inputs: [meanValues, scale, bias], outputs: [-1]})[0];\n };\n\nconst createInstanceNormNHWCProgramInfo =\n (context: ComputeContext, inputs: readonly TensorView[], attributes: InstanceNormAttributes) => {\n const xShape = inputs[0].dims;\n const outputShape = xShape;\n const N = xShape[0];\n const C = xShape[xShape.length - 1];\n const H = ShapeUtil.sizeFromDimension(xShape, 1) / C;\n const components = getMaxComponents(C);\n const outputSize = ShapeUtil.size(outputShape) / components;\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: H}, {type: DataType.uint32, data: Math.floor(C / components)}];\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type'];\n // first compute mean\n const channelScaleShift = computeMean(context, inputs[0], inputs[1], inputs[2], N, H, C, attributes.epsilon);\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n const scaleType = components === 1 ? 'vec2f' : `mat2x${components}f`;\n const scaleCastType = components === 1 ? dataType : `vec${components}<${dataType}>`;\n\n const inputHelper = inputVariable('input', inputs[0].dataType, inputs[0].dims, components);\n const outputHelper = outputVariable('output', inputs[0].dataType, outputShape, components);\n\n return `\n @group(0) @binding(0) var input : array<${inputHelper.type.storage}>;\n @group(0) @binding(1) var scaleInput : array<${scaleType}>;\n @group(0) @binding(2) var output : array<${outputHelper.type.storage}>;\n struct Uniforms {H: u32, C : u32};\n @group(0) @binding(3) var uniforms: Uniforms;\n\n ${shaderHelper.mainStart()}\n let currentImageNumber = global_idx / (uniforms.C * uniforms.H);\n let currentChannelNumber = global_idx % uniforms.C;\n\n let scaleOffset = currentImageNumber * uniforms.C + currentChannelNumber;\n let scale = scaleInput[scaleOffset];\n output[global_idx] = fma(input[global_idx], ${scaleCastType}(scale[0]), ${scaleCastType}(scale[1]));\n }`;\n };\n context.compute(\n {\n name: 'InstanceNormalizationNHWC',\n shaderCache: {hint: `${components}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n },\n {inputs: [inputs[0], channelScaleShift]});\n };\n\nexport const instanceNorm = (context: ComputeContext, attributes: InstanceNormAttributes): void => {\n if (attributes.format === 'NHWC') {\n createInstanceNormNHWCProgramInfo(context, context.inputs, attributes);\n } else {\n context.compute(createInstanceNormProgramInfo(context.inputs, attributes));\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {castToF32, fillVector, getMaxComponents, inputVariable, outputVariable, ShaderHelper, sumVector, tensorTypeToWsglStorageType, UniformsArrayType,} from './common';\n\ninterface LayerNormAttributes {\n simplified: boolean;\n axis: number;\n epsilon: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length < 2) {\n throw new Error('layerNorm requires at least 2 inputs.');\n }\n};\n\nconst createLayerNormProgramInfo =\n (inputs: readonly TensorView[], attributes: LayerNormAttributes, outputCount: number): ProgramInfo => {\n const simplified = attributes.simplified;\n\n const xShape = inputs[0].dims;\n const scale = inputs[1];\n const bias = !simplified && inputs[2];\n\n const outputShape = xShape;\n const axis = ShapeUtil.normalizeAxis(attributes.axis, xShape.length);\n const normCount = ShapeUtil.sizeToDimension(xShape, axis);\n const normSize = ShapeUtil.sizeFromDimension(xShape, axis);\n\n const scaleSize = ShapeUtil.size(scale.dims);\n const biasSize = bias ? ShapeUtil.size(bias.dims) : 0;\n if (scaleSize !== normSize || (bias && biasSize !== normSize)) {\n throw new Error(`Size of X.shape()[axis:] == ${normSize}.\n Size of scale and bias (if provided) must match this.\n Got scale size of ${scaleSize} and bias size of ${biasSize}`);\n }\n\n const meanInvStdDevDim: number[] = [];\n for (let i = 0; i < xShape.length; ++i) {\n if (i < axis) {\n meanInvStdDevDim.push(xShape[i]);\n } else {\n meanInvStdDevDim.push(1);\n }\n }\n const components = getMaxComponents(normSize);\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type'];\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: normCount}, {type: DataType.float, data: normSize},\n {type: DataType.uint32, data: Math.floor(normSize / components)},\n {type: DataType.float, data: attributes.epsilon}\n ];\n if (bias) {\n inputDependencies.push('type');\n }\n const hasMeanDataOutput = outputCount > 1;\n const hasInvStdOutput = outputCount > 2;\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n const variables = [\n inputVariable('x', inputs[0].dataType, inputs[0].dims, components),\n inputVariable('scale', scale.dataType, scale.dims, components),\n ];\n if (bias) {\n variables.push(inputVariable('bias', bias.dataType, bias.dims, components));\n }\n variables.push(outputVariable('output', inputs[0].dataType, outputShape, components));\n if (hasMeanDataOutput) {\n variables.push(outputVariable('mean_data_output', DataType.float, meanInvStdDevDim));\n }\n if (hasInvStdOutput) {\n variables.push(outputVariable('inv_std_output', DataType.float, meanInvStdDevDim));\n }\n\n const uniforms: UniformsArrayType = [\n {name: 'norm_count', type: 'u32'}, {name: 'norm_size', type: 'f32'},\n {name: 'norm_size_vectorized', type: 'u32'}, {name: 'epsilon', type: 'f32'}\n ];\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...variables)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.norm_count')}\n let offset = global_idx * uniforms.norm_size_vectorized;\n var mean_vector = ${fillVector('f32', components)};\n var mean_square_vector = ${fillVector('f32', components)};\n\n for (var h: u32 = 0u; h < uniforms.norm_size_vectorized; h++) {\n let value = ${castToF32(dataType, components, 'x[h + offset]')};\n mean_vector += value;\n mean_square_vector += value * value;\n }\n let mean = ${sumVector('mean_vector', components)} / uniforms.norm_size;\n let inv_std_dev = inverseSqrt(${sumVector('mean_square_vector', components)} / uniforms.norm_size ${\n simplified ? '' : '- mean * mean'} + uniforms.epsilon);\n\n for (var j: u32 = 0; j < uniforms.norm_size_vectorized; j++) {\n let f32input = ${castToF32(dataType, components, 'x[j + offset]')};\n let f32scale = ${castToF32(dataType, components, 'scale[j]')};\n output[j + offset] = ${variables[0].type.value}((f32input ${simplified ? '' : '- mean'}) * inv_std_dev * f32scale\n ${bias ? `+ ${castToF32(dataType, components, 'bias[j]')}` : ''}\n );\n }\n\n ${hasMeanDataOutput ? 'mean_data_output[global_idx] = mean' : ''};\n ${hasInvStdOutput ? 'inv_std_output[global_idx] = inv_std_dev' : ''};\n }`;\n };\n const outputs = [{dims: outputShape, dataType: inputs[0].dataType}];\n if (hasMeanDataOutput) {\n outputs.push({dims: meanInvStdDevDim, dataType: DataType.float});\n }\n if (hasInvStdOutput) {\n outputs.push({dims: meanInvStdDevDim, dataType: DataType.float});\n }\n\n return {\n name: 'LayerNormalization',\n shaderCache: {hint: `${components};${outputCount};${simplified}`, inputDependencies},\n getRunData: () =>\n ({outputs, dispatchGroup: {x: Math.ceil(normCount / 64 /* workgroup size */)}, programUniforms}),\n getShaderSource,\n };\n };\n\nexport const layerNorm = (context: ComputeContext, attributes: LayerNormAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createLayerNormProgramInfo(context.inputs, attributes, context.outputCount));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType, getTensorElementSize} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, getMaxComponents, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\n\n// TODO support quantization bits not equal to 4\nexport interface MatMulNBitsAttributes extends AttributeWithCacheKey {\n k: number;\n n: number;\n accuracyLevel: number;\n bits: number;\n blockSize: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: MatMulNBitsAttributes): void => {\n if (inputs.length < 3 || inputs.length > 4) {\n throw new Error('MatMulNBits requires 3 or 4 inputs');\n }\n const a = inputs[0];\n const aRank = a.dims.length;\n if (a.dims[aRank - 1] !== attributes.k) {\n throw new Error('The last dim of input shape does not match the k value');\n }\n const nBlocksPerCol = Math.floor((attributes.k + attributes.blockSize - 1) / attributes.blockSize);\n const blobSize = attributes.blockSize / 8 * attributes.bits;\n const b = inputs[1];\n if (!ShapeUtil.areEqual(b.dims, [attributes.n, nBlocksPerCol, blobSize])) {\n throw new Error('The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize');\n }\n const scales = inputs[2];\n const scalesShape = scales.dims;\n if (ShapeUtil.size(scalesShape) !== attributes.n * nBlocksPerCol) {\n throw new Error('scales input size error.');\n }\n if (inputs.length === 4) {\n const zeroPoints = inputs[3];\n const zeroPointsShape = zeroPoints.dims;\n const expectedZeroPointsSize =\n attributes.bits > 4 ? (attributes.n * nBlocksPerCol) : attributes.n * Math.floor((nBlocksPerCol + 1) / 2);\n if (ShapeUtil.size(zeroPointsShape) !== expectedZeroPointsSize) {\n throw new Error('zeroPoints input size error.');\n }\n }\n};\n\nexport const createMatMulNBitsProgramInfo =\n (inputs: readonly TensorView[], attributes: MatMulNBitsAttributes,\n maxComputeWorkgroupSizes: [number, number, number], maxComputeWorkgroupStorageSize: number): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const aRank = inputShape.length;\n const nBlocksPerCol = Math.floor((attributes.k + attributes.blockSize - 1) / attributes.blockSize);\n const dimAOuter = inputShape[aRank - 2];\n const dimInner = attributes.k;\n const dimBOuter = attributes.n;\n const batchDims = inputShape.slice(0, aRank - 2);\n const batchSize = ShapeUtil.size(batchDims);\n const blobSize = attributes.blockSize / 8 * attributes.bits;\n const blobSizeInWords = blobSize / 4;\n const dataType = inputs[0].dataType;\n const outputNumber = getMaxComponents(dimAOuter);\n const aComponents = getMaxComponents(attributes.k);\n const bComponents = getMaxComponents(blobSizeInWords);\n const elementSize = getTensorElementSize(dataType)!;\n const workgroupOutputSize = dimAOuter * nBlocksPerCol * elementSize;\n const maxNumberOfComponents = Math.floor(maxComputeWorkgroupStorageSize / workgroupOutputSize);\n const useBlockwiseMatMulNBits = nBlocksPerCol <= maxComputeWorkgroupSizes[0] && maxNumberOfComponents > 0;\n const components = (!useBlockwiseMatMulNBits || maxNumberOfComponents >= 4) ? getMaxComponents(dimBOuter) :\n ((maxNumberOfComponents >= 2) && getMaxComponents(dimBOuter) >= 2) ? 2 :\n 1;\n const outputShape = batchDims.concat([dimAOuter, dimBOuter]);\n const outputSize = ShapeUtil.size(outputShape) / components / outputNumber;\n\n const programUniforms: ProgramUniform[] = useBlockwiseMatMulNBits ?\n [] :\n [{type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: attributes.blockSize}];\n const inputShapeTemp = [batchSize, dimAOuter, dimInner / aComponents];\n const bShape = ShapeUtil.convertShape(inputs[1].dims).slice();\n bShape.splice(-1, 1, blobSizeInWords / bComponents);\n programUniforms.push(...createTensorShapeVariables(inputShapeTemp));\n programUniforms.push(...createTensorShapeVariables(bShape));\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n if (inputs.length === 4) {\n programUniforms.push(...createTensorShapeVariables(ShapeUtil.convertShape(inputs[3].dims)));\n }\n const outputShapeTemp = [batchSize, dimAOuter, dimBOuter / components];\n programUniforms.push(...createTensorShapeVariables(outputShapeTemp));\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const inputRank = inputShapeTemp.length;\n const a = inputVariable('a', inputs[0].dataType, inputRank, aComponents);\n const b = inputVariable('b', DataType.uint32, bShape.length, bComponents);\n const scales = inputVariable('scales', inputs[2].dataType, inputs[2].dims.length);\n const inputVariables = [a, b, scales];\n const zeroPoints =\n inputs.length === 4 ? inputVariable('zero_points', DataType.uint32, inputs[3].dims.length) : undefined;\n if (zeroPoints) {\n inputVariables.push(zeroPoints);\n }\n const outputRank = outputShapeTemp.length;\n const output = outputVariable('output', inputs[0].dataType, outputRank, components);\n const uniforms: UniformsArrayType = [{name: 'output_size', type: 'u32'}, {name: 'block_size', type: 'u32'}];\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n\n const qDqDataType = (() => {\n switch (aComponents) {\n case 1:\n return `array<${dataType}, 8>`;\n case 2:\n return `mat4x2<${dataType}>`;\n case 4:\n return `mat2x4<${dataType}>`;\n default:\n throw new Error(`${aComponents}-component is not supported.`);\n }\n })();\n\n const processOneBlock = `\n for (var word: u32 = 0; word < ${blobSizeInWords}; word += ${bComponents}) {\n ${b.indicesSet('b_indices', '2', 'word')};\n let b_data = ${b.getByIndices('b_indices')};\n for (var i: u32 = 0; i < ${bComponents}; i++) {\n let b_value: u32 = ${bComponents === 1 ? 'b_data' : 'b_data[word + i]'};\n let b_mask: u32 = 0x0F0F0F0Fu;\n let b_value_lower: vec4 = unpack4xU8(b_value & b_mask);\n let b_value_upper: vec4 = unpack4xU8((b_value >> 4) & b_mask);\n let b_quantized_values = ${qDqDataType}(${\n Array.from({length: 4}, (_, i) => `${dataType}(b_value_lower[${i}]), ${dataType}(b_value_upper[${i}])`)\n .join(', ')});\n let b_dequantized_values = ${(() => {\n if (aComponents === 1) {\n return `${qDqDataType}(${\n Array.from({length: 8}, (_, i) => `(b_quantized_values[${i}] - zero_point) * scale`).join(', ')});`;\n } else {\n return `(b_quantized_values - ${qDqDataType}(${Array(8).fill('zero_point').join(',')})) * scale;`;\n }\n })()};\n // Number of B elements per 32-bit word is 32/bits = 32/4 = 8\n for (var m: u32 = 0; m < ${useBlockwiseMatMulNBits ? dimAOuter : outputNumber}u; m++) {\n ${a.indicesSet('a_indices', inputRank - 2, useBlockwiseMatMulNBits ? 'm' : `row * ${outputNumber} + m`)};\n ${a.indicesSet('a_indices', inputRank - 1, 'word_offset')};\n var input_offset = ${a.indicesToOffset('a_indices')};\n var a_data: ${qDqDataType};\n for (var j: u32 = 0; j < ${8 / aComponents}; j++) {\n a_data[j] = ${a.getByOffset('input_offset')};\n input_offset++;\n }\n ${useBlockwiseMatMulNBits ? 'workgroup_shared[workgroup_shared_offset + m]' : 'output_values[m]'}${\n components > 1 ? '[c]' : ''} += ${\n Array\n .from(\n {length: 8 / aComponents},\n (_, i) => `${\n aComponents === 1 ? `a_data[${i}] * b_dequantized_values[${i}]` :\n `dot(a_data[${i}], b_dequantized_values[${i}])`}`)\n .join(' + ')};\n }\n word_offset += ${8 / aComponents};\n }\n }`;\n const updateZeroPointIndex = zeroPoints ? `\n zero_point_offset += 4;\n if (zero_point_offset == 32) {\n zero_point_offset = 0;\n zero_point_index++;\n zero_point_word = ${zeroPoints.getByOffset('zero_point_index')};\n }` :\n '';\n\n return useBlockwiseMatMulNBits ? `\n var workgroup_shared: array<${output.type.value}, ${dimAOuter * nBlocksPerCol}>;\n ${shaderHelper.declareVariables(...inputVariables, output)}\n ${shaderHelper.mainStart([\n nBlocksPerCol, 1, 1\n ])}\n var a_indices: ${a.type.indices};\n var block = local_id.x;\n var col = workgroup_id.y;\n var batch = workgroup_id.z;\n ${a.indicesSet('a_indices', '0', 'batch')};\n // Two zero points are packed into one byte when uniforms.bits is 4.\n for (var c: u32 = 0; c < ${components}; c++) {\n let col_times_components_plus_c = col * ${components} + c;\n ${\n zeroPoints ? `\n var zero_point_bytes_per_col: u32 = (${nBlocksPerCol} + 1) / 2;\n var zero_point_byte_count: u32 = col_times_components_plus_c * zero_point_bytes_per_col + (block >> 0x1u);\n var zero_point_word_index: u32 = zero_point_byte_count >> 0x2u;\n var zero_point_byte_offset: u32 = zero_point_byte_count & 0x3u;\n var zero_point_nibble_offset: u32 = block & 0x1u;\n var zero_point_bits_offset: u32 = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2);\n var zero_point_word: u32 = ${zeroPoints.getByOffset('zero_point_word_index')} >> zero_point_bits_offset;` :\n ''}\n var b_indices: ${b.type.indices};\n ${b.indicesSet('b_indices', '0', 'col_times_components_plus_c')};\n // The scale and zero points are computed per block.\n var scales_index = col_times_components_plus_c * ${nBlocksPerCol} + block;\n let scale = ${scales.getByOffset('scales_index')};\n // The default zero point is 8 for unsigned 4-bit quantization.\n let zero_point = ${dataType}(${zeroPoints ? '(zero_point_word) & 0xFu' : 8.0});\n ${b.indicesSet('b_indices', '1', 'block')};\n var word_offset: u32 = block * ${attributes.blockSize / aComponents};\n var workgroup_shared_offset: u32 = block * ${dimAOuter};\n ${processOneBlock}\n }\n workgroupBarrier();\n var output_indices: ${output.type.indices};\n var elements_per_thread: u32 = ${Math.ceil(dimAOuter / nBlocksPerCol)};\n ${output.indicesSet('output_indices', '0', 'batch')};\n ${output.indicesSet('output_indices', outputRank - 1, 'col')};\n ${output.indicesSet('output_indices', outputRank - 2, 'local_id.x * elements_per_thread')};\n var output_offset = ${output.indicesToOffset('output_indices')};\n for (var m: u32 = 0u; m < elements_per_thread; m++) {\n var row = m + local_id.x * elements_per_thread;\n if (row < ${dimAOuter}) {\n var output_value: ${output.type.value} = ${output.type.value}(0);\n var workgroup_shared_offset: u32 = row;\n for (var b: u32 = 0u; b < ${nBlocksPerCol}u; b++) {\n output_value += workgroup_shared[workgroup_shared_offset];\n workgroup_shared_offset += ${dimAOuter};\n }\n ${output.setByOffset('output_offset', 'output_value')};\n output_offset += ${dimBOuter / components};\n }\n }\n }` :\n `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n var output_values: array<${output.type.value}, ${outputNumber}>;\n var output_indices = ${output.offsetToIndices('global_idx')};\n var col = ${output.indicesGet('output_indices', outputRank - 1)};\n var row = ${output.indicesGet('output_indices', outputRank - 2)};\n var a_indices: ${a.type.indices} = output_indices;\n // Two zero points are packed into one byte because uniforms.bits <= 4.\n // zero_point_offset is either 0 or 4. It is bit offset within one byte.\n // TODO support zero_point_offset for bits > 4\n ${\n zeroPoints ? `\n var zero_point_abs_offset = col * ${components} * ((${nBlocksPerCol} + 1) / 2);\n var zero_point_index: u32 = zero_point_abs_offset / 4;\n var zero_point_word: u32 = ${zeroPoints.getByOffset('zero_point_index')};\n var zero_point_offset: u32 = (zero_point_abs_offset % 4) * 8;` :\n ''}\n var scale_index = col * ${nBlocksPerCol * components};\n var b_indices: ${b.type.indices};\n for (var c: u32 = 0; c < ${components}; c++) {\n ${b.indicesSet('b_indices', '0', `col * ${components} + c`)};\n var block_offset: u32 = 0;\n for (var block: u32 = 0; block < ${nBlocksPerCol}; block++) {\n // The scale and zero points are computed per block.\n let scale = ${scales.getByOffset('scale_index')};\n // The default zero point is 8 for unsigned 4-bit quantization.\n let zero_point = ${dataType}(${zeroPoints ? 'extractBits(zero_point_word, zero_point_offset, 4)' : 8.0});\n ${b.indicesSet('b_indices', '1', 'block')};\n var word_offset: u32 = block_offset;\n ${processOneBlock}\n scale_index++;\n ${updateZeroPointIndex}\n block_offset += uniforms.block_size / ${aComponents};\n }\n // Drop the trailing 4 bits if the zero_poit_offset is not a byte boundary to align with the next byte.\n ${\n zeroPoints ? `if (zero_point_offset % 8 > 0) {\n ${updateZeroPointIndex}\n }` :\n ''}\n }\n for (var k: u32 = 0u; k < ${outputNumber}u; k++) {\n ${output.indicesSet('output_indices', outputRank - 2, `${outputNumber} * row + k`)};\n ${output.setByIndices('output_indices', 'output_values[k]')}\n }\n }`;\n };\n return {\n name: useBlockwiseMatMulNBits ? 'BlockwiseMatMulNBits' : 'MatMulNBits',\n shaderCache: {\n hint: `${attributes.cacheKey};${dimAOuter};${dataType};${inputs.length}`,\n inputDependencies: Array(inputs.length).fill('rank')\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType}],\n name: useBlockwiseMatMulNBits ? 'BlockwiseMatMulNBits' : 'MatMulNBits',\n dispatchGroup: useBlockwiseMatMulNBits ? {x: 1, y: Math.ceil(dimBOuter / components), z: batchSize} :\n {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource\n };\n };\n\nexport const matMulNBits = (context: ComputeContext, attributes: MatMulNBitsAttributes): void => {\n validateInputs(context.inputs, attributes);\n const maxComputeWorkgroupSizes: [number, number, number] = context.getMaxComputeWorkgroupSizes();\n const maxComputeWorkgroupStorageSize = context.getMaxComputeWorkgroupStoragesize();\n context.compute(createMatMulNBitsProgramInfo(\n context.inputs, attributes, maxComputeWorkgroupSizes, maxComputeWorkgroupStorageSize));\n};\n\nexport const parseMatMulNBitsAttributes = (attributes: Record): MatMulNBitsAttributes =>\n createAttributeWithCacheKey(attributes as Omit);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper, UniformDataElementType, UniformsArrayType} from './common';\n\ninterface PadAttributes {\n // 0-constant, 1-reflect, 2-edge, 3-wrap\n readonly mode: number;\n readonly value: number;\n readonly pads: number[];\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('Too few inputs');\n }\n if (inputs[0].dataType !== DataType.float && inputs[0].dataType !== DataType.float16) {\n throw new Error('Input type must be float or float16.');\n }\n\n if (inputs.length >= 2) {\n let validPads = inputs[0].dims.length * 2 === inputs[1].dims[0];\n if (inputs.length === 4) {\n validPads = inputs[3].dims[0] * 2 === inputs[1].dims[0];\n }\n if (!validPads) {\n throw new Error('The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].');\n }\n }\n};\n\nconst getPadConstant = (output: IndicesHelper, inputRank: number, padsLength: number): string => {\n let block = '';\n for (let i = inputRank - 1; i >= 0; --i) {\n block += `\n k = i32(${output.indicesGet('indices', i)}) - ${getElementAt('uniforms.pads', i, padsLength)};\n if (k < 0) {\n break;\n }\n if (k >= i32(${getElementAt('uniforms.x_shape', i, inputRank)})) {\n break;\n }\n offset += k * i32(${getElementAt('uniforms.x_strides', i, inputRank)});\n `;\n }\n\n return `\n value = ${output.type.value}(uniforms.constant_value);\n for (var i = 0; i < 1; i++) {\n var offset = 0;\n var k = 0;\n ${block}\n value = x[offset];\n }\n `;\n};\n\nconst getPadReflect = (output: IndicesHelper, inputRank: number, padsLength: number): string => {\n let block = '';\n for (let i = inputRank - 1; i >= 0; --i) {\n block += `\n k = i32(${output.indicesGet('indices', i)}) - ${getElementAt('uniforms.pads', i, padsLength)};\n if (k < 0) {\n k = -k;\n }\n {\n let _2n_1 = 2 * (i32(${getElementAt('uniforms.x_shape', i, inputRank)}) - 1);\n k = k % _2n_1;\n if(k >= i32(${getElementAt('uniforms.x_shape', i, inputRank)})) {\n k = _2n_1 - k;\n }\n }\n offset += k * i32(${getElementAt('uniforms.x_strides', i, inputRank)});\n `;\n }\n\n return `\n var offset = 0;\n var k = 0;\n ${block}\n value = x[offset];\n `;\n};\n\nconst getPadEdge = (output: IndicesHelper, inputRank: number, padsLength: number): string => {\n let block = '';\n for (let i = inputRank - 1; i >= 0; --i) {\n block += `\n k = i32(${output.indicesGet('indices', i)}) - ${getElementAt('uniforms.pads', i, padsLength)};\n if (k < 0) {\n k = 0;\n }\n if (k >= i32(${getElementAt('uniforms.x_shape', i, inputRank)})) {\n k = i32(${getElementAt('uniforms.x_shape', i, inputRank)}) - 1;\n }\n offset += k * i32(${getElementAt('uniforms.x_strides', i, inputRank)});\n `;\n }\n\n return `\n var offset = 0;\n var k = 0;\n ${block}\n value = x[offset];\n `;\n};\n\nconst getPadWrap = (output: IndicesHelper, inputRank: number, padsLength: number): string => {\n let block = '';\n for (let i = inputRank - 1; i >= 0; --i) {\n block += `\n k = i32(${output.indicesGet('indices', i)}) - ${getElementAt('uniforms.pads', i, padsLength)};\n if (k < 0) {\n k += i32(${getElementAt('uniforms.x_shape', i, inputRank)}]);\n }\n if (k >= i32(${getElementAt('uniforms.x_shape', i, inputRank)})) {\n k -= i32(${getElementAt('uniforms.x_shape', i, inputRank)});\n }\n offset += k * i32(${getElementAt('uniforms.x_strides', i, inputRank)});\n `;\n }\n\n return `\n var offset = 0;\n var k = 0;\n ${block}\n value = x[offset];\n `;\n};\n\nconst getPadSnippet = (output: IndicesHelper, inputRank: number, attributes: PadAttributes): string => {\n switch (attributes.mode) {\n case 0:\n return getPadConstant(output, inputRank, attributes.pads.length);\n case 1:\n return getPadReflect(output, inputRank, attributes.pads.length);\n case 2:\n return getPadEdge(output, inputRank, attributes.pads.length);\n case 3:\n return getPadWrap(output, inputRank, attributes.pads.length);\n default:\n throw new Error('Invalid mode');\n }\n};\n\nconst createPadProgramInfo = (inputs: readonly TensorView[], attributes: PadAttributes): ProgramInfo => {\n const outputShape = ShapeUtil.padShape(inputs[0].dims.slice(), attributes.pads);\n const inputDims = inputs[0].dims;\n const outputSize = ShapeUtil.size(outputShape);\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: outputSize}, {type: DataType.int32, data: attributes.pads}];\n if (attributes.mode === 0) {\n programUniforms.push({type: inputs[0].dataType, data: attributes.value});\n }\n\n programUniforms.push(...createTensorShapeVariables(inputs[0].dims, outputShape));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank'];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('output', inputs[0].dataType, outputShape.length);\n const input = inputVariable('x', inputs[0].dataType, inputDims.length);\n const dataType = input.type.value;\n const padSnippet = getPadSnippet(output, inputDims.length, attributes);\n const uniforms: UniformsArrayType =\n [{name: 'output_size', type: 'u32'}, {name: 'pads', type: 'i32', length: attributes.pads.length}];\n if (attributes.mode === 0) {\n uniforms.push({name: 'constant_value', type: dataType as UniformDataElementType});\n }\n\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let indices = ${output.offsetToIndices('global_idx')};\n\n var value = ${dataType}(0);\n ${padSnippet}\n output[global_idx] = value;\n }`;\n };\n\n return {\n name: 'Pad',\n shaderCache: {hint: `${attributes.mode}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(ShapeUtil.size(outputShape) / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n};\n\nconst createPadAttributesFromInputs = (inputs: readonly TensorView[], attributes: PadAttributes): PadAttributes => {\n if (inputs.length > 1) {\n const bigInt64Pads = inputs[1].getBigInt64Array();\n const value = (inputs.length >= 3 && inputs[2].data) ? inputs[2].getFloat32Array()[0] : 0.0;\n\n const inputRank = inputs[0].dims.length;\n const updatePads = new Int32Array(2 * inputRank).fill(0);\n if (inputs.length >= 4) {\n const axes = inputs[3].getBigInt64Array();\n for (let i = 0; i < axes.length; i++) {\n updatePads[Number(axes[i])] = Number(bigInt64Pads[i]);\n updatePads[Number(axes[i]) + inputRank] = Number(bigInt64Pads[i + axes.length]);\n }\n } else {\n bigInt64Pads.forEach((v, i) => updatePads[Number(i)] = (Number(v)));\n }\n\n const pads: number[] = [];\n updatePads.forEach(v => pads.push(v));\n\n return {mode: attributes.mode, value, pads};\n } else {\n return attributes;\n }\n};\n\nexport const pad = (context: ComputeContext, attributes: PadAttributes): void => {\n validateInputs(context.inputs);\n const updatedAttributes = createPadAttributesFromInputs(context.inputs, attributes);\n context.compute(createPadProgramInfo(context.inputs, updatedAttributes), {inputs: [0]});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {PoolConvUtil, ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\n\n// TODO: support:\n// - ceil_mode \"test_maxpool_2d_ceil\"\n// - storage_order \"test_maxpool_with_argmax_2d_precomputed_strides\"\n// - [MaxPool] dilations \"test_maxpool_2d_dilations\"\n// - [MaxPool] output[1] \"test_maxpool_with_argmax_2d_precomputed_pads\"\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (env.webgpu.validateInputContent && (!inputs || inputs.length !== 1)) {\n throw new Error('Pool ops requires 1 input.');\n }\n};\n\nconst getAdjustedPoolAttributesAndOutputShape = (\n input: TensorView, attributes: AttributeType, isGlobalOperator: boolean): [AttributeType, number[]] => {\n const isChannelsLast = attributes.format === 'NHWC';\n const inputShapeAsChannelFirst = input.dims.slice();\n if (isChannelsLast) {\n inputShapeAsChannelFirst.splice(1, 0, inputShapeAsChannelFirst.pop()!); // Move channel to the second position.\n }\n const hasDilations = Object.hasOwnProperty.call(attributes, 'dilations');\n const kernelShape = attributes.kernelShape.slice();\n const strides = attributes.strides.slice();\n const dilations: number[] = hasDilations ? (attributes as MaxPoolAttributes).dilations.slice() : [];\n const pads = attributes.pads.slice();\n PoolConvUtil.adjustPoolAttributes(isGlobalOperator, inputShapeAsChannelFirst, kernelShape, strides, dilations, pads);\n\n const outputShapeAsChannelFirst = PoolConvUtil.computePoolOutputShape(\n isGlobalOperator, inputShapeAsChannelFirst, strides, dilations, kernelShape, pads, attributes.autoPad);\n\n const newAttributes = Object.assign({}, attributes);\n if (hasDilations) {\n Object.assign(newAttributes, {kernelShape, strides, pads, dilations, cacheKey: attributes.cacheKey});\n } else {\n Object.assign(newAttributes, {kernelShape, strides, pads, cacheKey: attributes.cacheKey});\n }\n const outputShapeAsChannelLast = outputShapeAsChannelFirst.slice();\n outputShapeAsChannelLast.push(outputShapeAsChannelLast.splice(1, 1)[0]);\n return [newAttributes, isChannelsLast ? outputShapeAsChannelLast : outputShapeAsChannelFirst];\n};\n\nconst getUniformAndPadInfo = (\n outputShape: readonly number[],\n attributes: AttributeType): [ProgramUniform[], UniformsArrayType, boolean, boolean, boolean] => {\n const isChannelsLast = attributes.format === 'NHWC';\n const outputSize = ShapeUtil.size(outputShape);\n const kernelSize = ShapeUtil.size(attributes.kernelShape);\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: kernelSize}];\n const uniforms: UniformsArrayType = [{name: 'outputSize', type: 'u32'}, {name: 'kernelSize', type: 'u32'}];\n if (attributes.kernelShape.length <= 2) {\n const kw = attributes.kernelShape[attributes.kernelShape.length - 1];\n const sw = attributes.strides[attributes.strides.length - 1];\n const pwStart = attributes.pads[attributes.pads.length / 2 - 1];\n const pwEnd = attributes.pads[attributes.pads.length - 1];\n const pwStartEndNotZero = !!(pwStart + pwEnd);\n programUniforms.push(\n {type: DataType.uint32, data: kw},\n {type: DataType.uint32, data: sw},\n {type: DataType.uint32, data: pwStart},\n {type: DataType.uint32, data: pwEnd},\n );\n uniforms.push(\n {name: 'kw', type: 'u32'}, {name: 'sw', type: 'u32'}, {name: 'pwStart', type: 'u32'},\n {name: 'pwEnd', type: 'u32'});\n\n let phStartEndNotZero = false;\n if (attributes.kernelShape.length === 2) {\n const kh = attributes.kernelShape[attributes.kernelShape.length - 2];\n const sh = attributes.strides[attributes.strides.length - 2];\n const phStart = attributes.pads[attributes.pads.length / 2 - 2];\n const phEnd = attributes.pads[attributes.pads.length - 2];\n phStartEndNotZero = !!(phStart + phEnd);\n programUniforms.push(\n {type: DataType.uint32, data: kh}, {type: DataType.uint32, data: sh}, {type: DataType.uint32, data: phStart},\n {type: DataType.uint32, data: phEnd});\n\n uniforms.push(\n {name: 'kh', type: 'u32'}, {name: 'sh', type: 'u32'}, {name: 'phStart', type: 'u32'},\n {name: 'phEnd', type: 'u32'});\n }\n return [programUniforms, uniforms, true, pwStartEndNotZero, phStartEndNotZero];\n } else {\n if (isChannelsLast) {\n throw new Error('Pooling with kernelShape.length > 2 is not supported for NHWC format.');\n }\n const kernelStrides = ShapeUtil.computeStrides(attributes.kernelShape);\n programUniforms.push(\n {type: DataType.uint32, data: kernelStrides}, {type: DataType.uint32, data: attributes.pads},\n {type: DataType.uint32, data: attributes.strides});\n uniforms.push(\n {name: 'kernelStrides', type: 'u32', length: kernelStrides.length},\n {name: 'pads', type: 'u32', length: attributes.pads.length},\n {name: 'strides', type: 'u32', length: attributes.strides.length});\n\n const hasPads = attributes.pads.reduce((sum, cur) => sum + cur);\n return [programUniforms, uniforms, !!hasPads, false, false];\n }\n};\n\nconst generatePoolingCode = (\n shaderHelper: ShaderHelper, x: IndicesHelper, rank: number, outputShapeRank: number, attributes: AttributeType,\n op1: string, op2: string, start: number, uniforms: UniformsArrayType, hasPads: boolean, pwStartEndNotZero: boolean,\n phStartEndNotZero: boolean): string => {\n const isChannelsLast = attributes.format === 'NHWC';\n const dataType = x.type.value;\n const output = outputVariable('output', x.type.tensor, outputShapeRank);\n\n if (attributes.kernelShape.length <= 2) {\n let codeW = '';\n let codeH = '';\n let codeHEnd = '';\n const dimIdxW = rank - (isChannelsLast ? 2 : 1);\n if (pwStartEndNotZero) {\n codeW = `\n for (var i: u32 = 0u; i < uniforms.kw; i++) {\n xIndices[${dimIdxW}] = indices[${dimIdxW}] * uniforms.sw - uniforms.pwStart + i;\n if (xIndices[${dimIdxW}] < 0 || xIndices[${dimIdxW}]\n >= uniforms.x_shape[${dimIdxW}]) {\n pad++;\n continue;\n }\n let x_val = x[${x.indicesToOffset('xIndices')}];\n ${op1}\n }`;\n } else {\n codeW = `\n for (var i: u32 = 0u; i < uniforms.kw; i++) {\n xIndices[${dimIdxW}] = indices[${dimIdxW}] * uniforms.sw - uniforms.pwStart + i;\n let x_val = x[${x.indicesToOffset('xIndices')}];\n ${op1}\n }`;\n }\n\n if (attributes.kernelShape.length === 2) {\n const dimIdxH = rank - (isChannelsLast ? 3 : 2);\n if (phStartEndNotZero) {\n codeH = `\n for (var j: u32 = 0u; j < uniforms.kh; j++) {\n xIndices[${dimIdxH}] = indices[${dimIdxH}] * uniforms.sh - uniforms.phStart + j;\n if (xIndices[${dimIdxH}] < 0 || xIndices[${dimIdxH}] >= uniforms.x_shape[${dimIdxH}]) {\n pad += i32(uniforms.kw);\n continue;\n }\n `;\n } else {\n codeH = `\n for (var j: u32 = 0u; j < uniforms.kh; j++) {\n xIndices[${dimIdxH}] = indices[${dimIdxH}] * uniforms.sh - uniforms.phStart + j;\n `;\n }\n codeHEnd = `\n }\n `;\n }\n\n const poolingCode = `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(x, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n\n let indices = ${output.offsetToIndices('global_idx')};\n var xIndices = ${output.offsetToIndices('global_idx')};\n\n var value = ${dataType}(${start});\n var pad = 0;\n ${codeH}\n ${codeW}\n ${codeHEnd}\n ${op2}\n\n output[global_idx] = value;\n }`;\n return poolingCode;\n } else {\n if (isChannelsLast) {\n throw new Error('Pooling with kernelShape.length > 2 is not supported for NHWC format.');\n }\n const stridesRank = attributes.kernelShape.length;\n const padsRank = attributes.pads.length;\n let padCode = '';\n if (hasPads) {\n padCode = `\n if (xIndices[j] >= uniforms.x_shape[j]) {\n pad++;\n isPad = true;\n break;\n }\n }\n if (!isPad) {\n let x_val = x[${x.indicesToOffset('xIndices')}];\n ${op1}\n }`;\n } else {\n padCode = `\n }\n let x_val = x[${x.indicesToOffset('xIndices')}];\n ${op1}\n `;\n }\n const poolingCode = `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(x, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n let indices = ${output.offsetToIndices('global_idx')};\n var xIndices = ${output.offsetToIndices('global_idx')};\n\n var offsets: array;\n\n var value = ${dataType}(${start});\n var pad = 0;\n var isPad = false;\n\n for (var i: u32 = 0u; i < uniforms.kernelSize; i++) {\n var offset = i;\n for (var j = 0u; j < ${stridesRank - 1}u; j++) {\n offsets[j] = offset / ${getElementAt('uniforms.kernelStrides', 'j', stridesRank)};\n offset -= offsets[j] * ${getElementAt('uniforms.kernelStrides', 'j', stridesRank)};\n }\n offsets[${stridesRank - 1}] = offset;\n\n isPad = false;\n for (var j = ${rank - stridesRank}u; j < ${rank}u; j++) {\n xIndices[j] = indices[j] * ${\n getElementAt('uniforms.strides', `j - ${rank - stridesRank}u`, stridesRank)}\n + offsets[j - ${rank - stridesRank}u] - ${getElementAt('uniforms.pads', 'j - 2u', padsRank)};\n ${padCode}\n }\n ${op2}\n\n output[global_idx] = value;\n }`;\n return poolingCode;\n }\n};\n\nexport interface FormatAttributes {\n readonly format: 'NHWC'|'NCHW';\n}\n\nexport interface PoolCommonAttributes extends FormatAttributes {\n readonly autoPad: string;\n readonly ceilMode: number;\n readonly kernelShape: readonly number[];\n readonly strides: readonly number[];\n readonly pads: readonly number[];\n}\n\nconst createShaderKeyFromAttributes = (attributes: PoolCommonAttributes): string =>\n (`${attributes.format};${attributes.ceilMode};${attributes.autoPad};${attributes.kernelShape.length}`);\n\nconst createAveragePoolShaderKeyFromAttributes = (attributes: AveragePoolAttributes): string =>\n (`${createShaderKeyFromAttributes(attributes)};${attributes.countIncludePad}`);\n\nconst createMaxPoolShaderKeyFromAttributes = (attributes: MaxPoolAttributes): string =>\n (`${createShaderKeyFromAttributes(attributes)};${attributes.storageOrder};${attributes.dilations}`);\n\nconst parsePoolCommonAttributes = (attributes: Record): PoolCommonAttributes => ({\n format: attributes.format as FormatAttributes['format'],\n autoPad: ['NOTSET', 'VALID', 'SAME_UPPER', 'SAME_LOWER'][attributes.auto_pad as number],\n ceilMode: attributes.ceil_mode as number,\n kernelShape: attributes.kernel_shape as [number, number],\n strides: attributes.strides as [number, number],\n pads: attributes.pads as [number, number, number, number]\n});\n\nexport interface AveragePoolAttributes extends PoolCommonAttributes, AttributeWithCacheKey {\n readonly countIncludePad: boolean;\n}\n\nconst createAveragePoolProgramInfo =\n (name: string, input: TensorView, isGlobalOperator: boolean, attributes: AveragePoolAttributes): ProgramInfo => {\n const [adjustedAttributes, outputShape] =\n getAdjustedPoolAttributesAndOutputShape(input, attributes, isGlobalOperator);\n const x = inputVariable('x', input.dataType, input.dims.length);\n const dataType = x.type.value;\n\n const op1 = 'value += x_val;';\n let op2 = '';\n if (adjustedAttributes.countIncludePad) {\n op2 += `value /= ${dataType}(uniforms.kernelSize);`;\n } else {\n op2 += `value /= ${dataType}(i32(uniforms.kernelSize) - pad);`;\n }\n const [programUniforms, uniforms, hasPads, pwStartEndNotZero, phStartEndNotZero] =\n getUniformAndPadInfo(outputShape, adjustedAttributes);\n programUniforms.push(...createTensorShapeVariables(input.dims, outputShape));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank'];\n return {\n name,\n shaderCache:\n {hint: `${attributes.cacheKey};${hasPads};${pwStartEndNotZero};${phStartEndNotZero}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: input.dataType}],\n dispatchGroup: {x: Math.ceil(ShapeUtil.size(outputShape) / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource: shaderHelper => generatePoolingCode(\n shaderHelper, x, input.dims.length, outputShape.length, adjustedAttributes, op1, op2, 0.0, uniforms,\n hasPads, pwStartEndNotZero, phStartEndNotZero),\n };\n };\n\nexport const parseAveragePoolAttributes = (attributes: Record): AveragePoolAttributes => {\n const countIncludePad = (attributes.count_include_pad as number) === 0 ? false : true;\n\n const attr = parsePoolCommonAttributes(attributes);\n // TODO: support attribute 'ceil_mode'\n if (attr.ceilMode !== 0) {\n throw new Error('using ceil() in shape computation is not yet supported for AveragePool');\n }\n const averagePoolAttributes = {countIncludePad, ...attr, cacheKey: ''};\n return {...averagePoolAttributes, cacheKey: createAveragePoolShaderKeyFromAttributes(averagePoolAttributes)};\n};\n\nexport const averagePool = (context: ComputeContext, attributes: AveragePoolAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createAveragePoolProgramInfo('AveragePool', context.inputs[0], false, attributes));\n};\n\nconst globalPoolAttributes = {\n autoPad: '',\n ceilMode: 0,\n countIncludePad: false,\n kernelShape: [],\n strides: [],\n pads: [],\n storageOrder: 0,\n dilations: []\n};\n\nexport const parseGlobalAveragePoolAttributes = (attributes: Record): AveragePoolAttributes => {\n const format = attributes.format as FormatAttributes['format'];\n return {format, ...globalPoolAttributes, cacheKey: format};\n};\n\nexport const globalAveragePool = (context: ComputeContext, attributes: AveragePoolAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createAveragePoolProgramInfo('GlobalAveragePool', context.inputs[0], true, attributes));\n};\n\nexport interface MaxPoolAttributes extends PoolCommonAttributes, AttributeWithCacheKey {\n readonly storageOrder: number;\n readonly dilations: number[];\n}\n\nconst createMaxPoolProgramInfo =\n (name: string, input: TensorView, isGlobalOperator: boolean, attributes: MaxPoolAttributes): ProgramInfo => {\n const [adjustedAttributes, outputShape] =\n getAdjustedPoolAttributesAndOutputShape(input, attributes, isGlobalOperator);\n const op1 = `\n value = max(x_val, value);\n `;\n const op2 = '';\n const x = inputVariable('x', input.dataType, input.dims.length);\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank'];\n const [programUniforms, uniforms, hasPads, pwStartEndNotZero, phStartEndNotZero] =\n getUniformAndPadInfo(outputShape, adjustedAttributes);\n programUniforms.push(...createTensorShapeVariables(input.dims, outputShape));\n return {\n name,\n shaderCache:\n {hint: `${attributes.cacheKey};${hasPads};${pwStartEndNotZero};${phStartEndNotZero}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: input.dataType}],\n dispatchGroup: {x: Math.ceil(ShapeUtil.size(outputShape) / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource: shaderHelper => generatePoolingCode(\n shaderHelper, x, input.dims.length, outputShape.length, adjustedAttributes, op1, op2,\n (input.dataType === DataType.float16) ? -65504 : -1e5, uniforms, hasPads, pwStartEndNotZero,\n phStartEndNotZero),\n };\n };\n\nexport const maxPool = (context: ComputeContext, attributes: MaxPoolAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createMaxPoolProgramInfo('MaxPool', context.inputs[0], false, attributes));\n};\n\nexport const parseMaxPoolAttributes = (attributes: Record): MaxPoolAttributes => {\n const storageOrder = attributes.storage_order as number;\n const dilations = attributes.dilations as [number, number];\n\n const attr = parsePoolCommonAttributes(attributes);\n // TODO: support attribute 'ceil_mode' and 'storage_order'\n if (storageOrder !== 0) {\n throw new Error('column major storage order is not yet supported for MaxPool');\n }\n if (attr.ceilMode !== 0) {\n throw new Error('using ceil() in shape computation is not yet supported for MaxPool');\n }\n const maxPoolAttributes = {storageOrder, dilations, ...attr, cacheKey: ''};\n return {...maxPoolAttributes, cacheKey: createMaxPoolShaderKeyFromAttributes(maxPoolAttributes)};\n};\n\nexport const parseGlobalMaxPoolAttributes = (attributes: Record): MaxPoolAttributes => {\n const format = attributes.format as FormatAttributes['format'];\n return {format, ...globalPoolAttributes, cacheKey: format};\n};\n\nexport const globalMaxPool = (context: ComputeContext, attributes: MaxPoolAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createMaxPoolProgramInfo('GlobalMaxPool', context.inputs[0], true, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport {DataType} from '../../../wasm-common';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, outputVariable, ShaderHelper, UniformDataElementType, UniformsArrayType} from './common';\n\nconst validateInputsContent = (start: number, limit: number, delta: number): void => {\n const sameStartLimit = start === limit;\n const increasingRangeNegativeStep = start < limit && delta < 0;\n const decreasingRangePositiveStep = start > limit && delta > 0;\n\n if (sameStartLimit || increasingRangeNegativeStep || decreasingRangePositiveStep) {\n throw new Error('Range these inputs\\' contents are invalid.');\n }\n};\n\nconst createRangeProgramInfo = (start: number, limit: number, delta: number, dataType: DataType): ProgramInfo => {\n const numElements = Math.abs(Math.ceil((limit - start) / delta));\n const outputShape: number[] = [numElements];\n const outputSize = numElements;\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: dataType, data: start}, {type: dataType, data: delta},\n ...createTensorShapeVariables(outputShape)\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('output', dataType, outputShape.length);\n const wgslType = output.type.value;\n const uniforms: UniformsArrayType = [\n {name: 'outputSize', type: 'u32'}, {name: 'start', type: wgslType as UniformDataElementType},\n {name: 'delta', type: wgslType as UniformDataElementType}\n ];\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n output[global_idx] = uniforms.start + ${wgslType}(global_idx) * uniforms.delta;\n }`;\n };\n\n return {\n name: 'Range',\n shaderCache: {hint: `${dataType}`},\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n })\n };\n};\n\nexport const range = (context: ComputeContext): void => {\n let start = 0;\n let limit = 0;\n let delta = 0;\n if (context.inputs[0].dataType === DataType.int32) {\n start = context.inputs[0].getInt32Array()[0];\n limit = context.inputs[1].getInt32Array()[0];\n delta = context.inputs[2].getInt32Array()[0];\n } else if (context.inputs[0].dataType === DataType.float) {\n start = context.inputs[0].getFloat32Array()[0];\n limit = context.inputs[1].getFloat32Array()[0];\n delta = context.inputs[2].getFloat32Array()[0];\n }\n if (env.webgpu.validateInputContent) {\n validateInputsContent(start, limit, delta);\n }\n\n context.compute(createRangeProgramInfo(start, limit, delta, context.inputs[0].dataType), {inputs: []});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\ntype CoordinateTransformMode = 'half_pixel'|'asymmetric'|'pytorch_half_pixel'|'tf_half_pixel_for_nn'|'align_corners'|\n 'tf_crop_and_resize'|'half_pixel_symmetric';\n\ntype KeepAspectRatioPolicy = 'stretch'|'not_smaller'|'not_larger';\n\ntype Mode = 'nearest'|'linear'|'cubic';\n\ntype NearestMode = 'round_prefer_floor'|'round_prefer_ceil'|'floor'|'ceil'|'simple';\n\nexport interface ResizeAttributes extends AttributeWithCacheKey {\n antialias: number;\n axes: number[];\n coordinateTransformMode: CoordinateTransformMode;\n cubicCoeffA: number;\n excludeOutside: boolean;\n extrapolationValue: number;\n keepAspectRatioPolicy: KeepAspectRatioPolicy;\n mode: Mode;\n nearestMode: NearestMode;\n}\n\nconst validateScales = (scales: number[], attributes: ResizeAttributes): void => {\n scales.every((value) => value > 0 || (() => {\n throw new Error('Resize requires scales input values to be positive');\n }));\n // Check scales dims based on mode: LINEAR, CUBIC\n if (scales.length > 0) {\n if (attributes.mode === 'linear') {\n if (!(scales.length === 2 || scales.length === 3 || (scales.length === 4 && scales[0] === 1 && scales[1] === 1) ||\n (scales.length === 4 && scales[0] === 1 && scales[3] === 1) ||\n (scales.length === 5 && scales[0] === 1 && scales[1] === 1))) {\n throw new Error(\n `For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and\n one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`);\n }\n } else if (attributes.mode === 'cubic') {\n if (!(scales.length === 2 || (scales.length === 4 && scales[0] === 1 && scales[1] === 1) ||\n (scales.length === 4 && scales[0] === 1 && scales[3] === 1))) {\n throw new Error('Resize requires scales input size to be 2 or 4 for cubic mode');\n }\n }\n }\n};\n\nconst updateScales = (scales: readonly number[], axes: readonly number[], rank: number): number[] => {\n axes.every((value) => value >= 0 && value < rank || (() => {\n throw new Error('Resize requires axes input values to be positive and less than rank');\n }));\n const newScales = new Array(rank).fill(1.0);\n axes.forEach((value, index) => newScales[value] = scales[index]);\n return newScales;\n};\n\nconst validateInputs =\n (inputs: readonly TensorView[], attributes: ResizeAttributes, opsetVersion: number, scales: number[],\n sizes: number[], roi: number[]): void => {\n const [roiInputIndex, scalesInputIndex, sizesInputIndex] =\n (opsetVersion > 10) ? [1, 2, 3] : [-1, (inputs.length > 1) ? 1 : -1, -1];\n const rank = inputs[0].dims.length;\n if (roiInputIndex > 0 && inputs.length > roiInputIndex && inputs[roiInputIndex].dims.length > 0) {\n inputs[roiInputIndex].getFloat32Array().forEach((value) => roi.push(value));\n } else if (attributes.coordinateTransformMode === 'tf_crop_and_resize') {\n throw new Error('Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize');\n }\n\n if (scalesInputIndex > 0 && inputs.length > scalesInputIndex && inputs[scalesInputIndex].dims.length > 0) {\n inputs[scalesInputIndex].getFloat32Array().forEach((value) => scales.push(value));\n if (scales.length !== 0 &&\n (scales.length !== rank && (opsetVersion >= 18 && scales.length !== attributes.axes.length))) {\n throw new Error(\n 'Resize requires scales input size to be same as input rank or axes size for opset 18 and up');\n }\n validateScales(scales, attributes);\n if (attributes.axes.length > 0) {\n updateScales(scales, attributes.axes, rank).forEach((value, index) => scales[index] = value);\n }\n }\n if (sizesInputIndex > 0 && inputs.length > sizesInputIndex) {\n inputs[sizesInputIndex].getBigInt64Array().forEach((value) => sizes.push(Number(value)));\n if (sizes.length !== rank || (opsetVersion >= 18 && sizes.length === attributes.axes.length)) {\n throw new Error('Resize requires sizes input size to be same as input rank or axes size for opset 18 and up');\n }\n }\n\n if (attributes.axes.length > 0) {\n if (scales.length !== attributes.axes.length) {\n throw new Error('Resize requires \"scales\" input size to be of axes rank when axes attributes is specified');\n }\n if (sizes.length !== attributes.axes.length) {\n throw new Error(\n 'Resize requires \"sizes\" input size to be of rank axes rank when axes attributes is specified');\n }\n }\n if (typeof scales !== 'undefined' && typeof sizes !== 'undefined' && scales.length > 0 && sizes.length > rank) {\n throw new Error('Resize requires only of scales or sizes to be specified');\n }\n };\n\nconst getOriginalCoordinateFromResizedCoordinate =\n (coordinateTransferMode: CoordinateTransformMode, dType: string): string =>\n `fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32,\n lengthOriginal: u32, roiStart: f32, roiEnd: f32) -> ${dType} { ` +\n (() => {\n switch (coordinateTransferMode) {\n case 'asymmetric':\n return `return ${dType}(xResized) / ${dType}(xScale);`;\n case 'pytorch_half_pixel':\n return `if (lengthResized > 1) {\n return (${dType}(xResized) + 0.5) / ${dType}(xScale) - 0.5;\n } else {\n return 0.0;\n }`;\n case 'tf_half_pixel_for_nn':\n return `return (${dType}(xResized) + 0.5) / ${dType}(xScale);`;\n case 'align_corners':\n return `if (lengthResized == 1) {\n return 0.0;\n } else {\n // The whole part and the fractional part are calculated separately due to inaccuracy of floating\n // point division. As an example, f32(21) / f32(7) may evaluate to 2.99... instead of 3, causing an\n // offset-by-one error later in floor().\n let whole = ${dType}(xResized * (lengthOriginal - 1) / (lengthResized - 1));\n let fract =\n ${dType}(xResized * (lengthOriginal - 1) % (lengthResized - 1)) / ${dType}(lengthResized - 1);\n return whole + fract;\n }`;\n case 'tf_crop_and_resize':\n return `if (lengthResized > 1) {\n return ${dType}(roiStart) * ${dType}(lengthOriginal - 1) +\n (${dType}(xResized) * ${dType}(roiEnd - roiStart) * ${dType}(lengthOriginal - 1)) /\n ${dType}(lengthResized - 1);\n } else {\n return 0.5 * ${dType}(roiStart + roiEnd) * ${dType}(lengthOriginal - 1);\n }`;\n case 'half_pixel_symmetric':\n return `const outputWidth = ${dType}xScale * ${dType}(lengthResized);\n const adjustment = ${dType}(lengthResized) / outputWidth;\n const center = ${dType}(lengthOriginal) / 2;\n const offset = center * (1 - adjustment);\n return offset + ((${dType}(xResized) + 0.5) / ${dType}(xScale)) - 0.5;`;\n case 'half_pixel':\n return `return ((${dType}(xResized) + 0.5) / ${dType}(xScale)) - 0.5;`;\n default:\n throw new Error(`Coordinate transform mode ${coordinateTransferMode} is not supported`);\n }\n })() +\n '}';\n\nconst getNearestPixelFromOriginal = (nearestMode: NearestMode, opsetVersion: number, dType: string): string =>\n `fn getNearestPixelFromOriginal(xOriginal: ${dType}, isDownSample: bool) -> ${dType} {` + (() => {\n switch (nearestMode) {\n case 'round_prefer_ceil':\n return 'if (fract(xOriginal) == 0.5) { \\\n return ceil(xOriginal); \\\n } else { \\\n return round(xOriginal); \\\n }';\n case 'floor':\n return 'return floor(xOriginal);';\n case 'ceil':\n return 'return ceil(xOriginal);';\n case 'round_prefer_floor':\n return 'if (fract(xOriginal) == 0.5) { \\\n return floor(xOriginal); \\\n } else { \\\n return round(xOriginal); \\\n }';\n case 'simple':\n default:\n if (opsetVersion < 11) {\n return 'if (isDownSample) \\\n { \\\n return ceil(xOriginal); \\\n } else { \\\n return xOriginal; \\\n }';\n }\n throw new Error(`Nearest mode ${nearestMode} is not supported`);\n }\n })() +\n '}';\n\nconst updateRoI = (roi: readonly number[], axes: readonly number[], rank: number): number[] => {\n const roiTmp = new Array(rank).fill(0).concat(new Array(rank).fill(1));\n const roiLocal = roi.length === 0 ? roiTmp : roi.slice();\n if (axes.length > 0) {\n axes.forEach((v, i) => {\n roiTmp[v] = roiLocal[i];\n roiTmp[i + rank] = roiLocal[axes.length + i];\n });\n return roiTmp;\n }\n return roiLocal;\n};\n\nconst initOutputShape =\n (inputShape: readonly number[], scales: readonly number[], sizes: readonly number[], axes: readonly number[]):\n number[] => {\n let outputShape: number[] = [];\n if (sizes.length > 0) {\n if (axes.length > 0) {\n inputShape.forEach((v) => outputShape.push(v));\n if (Math.max(...axes) > inputShape.length) {\n throw new Error('axes is out of bound');\n }\n axes.forEach((v, i) => outputShape[v] = sizes[i]);\n } else {\n sizes.forEach((v) => outputShape.push(v));\n }\n } else {\n if (scales.length === 0) {\n throw new Error('Resize requires either scales or sizes.');\n } else {\n outputShape = inputShape.map((value, index) => Math.round(value * scales[index]));\n }\n }\n return outputShape;\n };\n\nconst adjustOutputShape = (inputShape: readonly number[], scales: number[], attributes: ResizeAttributes) => {\n const scaleInPolicy = (() => {\n switch (attributes.keepAspectRatioPolicy) {\n case 'not_larger':\n return attributes.axes.length > 0 ? Math.min(...attributes.axes.map(i => scales[i]), Number.MAX_VALUE) :\n Math.min(...scales, Number.MAX_VALUE);\n case 'not_smaller':\n return attributes.axes.length > 0 ? Math.max(...attributes.axes.map(i => scales[i]), Number.MIN_VALUE) :\n Math.max(...scales, Number.MIN_VALUE);\n default:\n throw new Error(`Keep aspect ratio policy ${attributes.keepAspectRatioPolicy} is not supported`);\n }\n })();\n scales.fill(1.0, 0, scales.length);\n const adjustedOutputShape = inputShape.slice();\n if (attributes.axes.length > 0) {\n attributes.axes.forEach((v) => scales[v] = scaleInPolicy);\n attributes.axes.forEach((v) => adjustedOutputShape[v] = Math.round(inputShape[v] * scales[v]));\n } else {\n scales.fill(scaleInPolicy, 0, scales.length);\n adjustedOutputShape.forEach((v, i) => adjustedOutputShape[i] = Math.round(v * scales[i]));\n }\n return adjustedOutputShape;\n};\n\nconst calculateOriginalIndicesFromOutputIndices =\n (output: IndicesHelper, inputShape: readonly number[], outputShape: readonly number[], scalesLength: number,\n roiLength: number): string => `\n fn calculateOriginalIndicesFromOutputIndices(output_indices: ${output.type.indices}) -> array<${\n output.type.value}, ${outputShape.length}> {\n var original_indices: array<${output.type.value}, ${outputShape.length}>;\n for (var i:u32 = 0; i < ${outputShape.length}; i++) {\n var output_index = ${output.indicesGet('output_indices', 'i')};\n var scale = ${getElementAt('uniforms.scales', 'i', scalesLength)};\n var roi_low = ${getElementAt('uniforms.roi', 'i', roiLength)};\n var roi_hi = ${getElementAt('uniforms.roi', `i + ${inputShape.length}`, roiLength)};\n if (scale == 1.0) {\n original_indices[i] = ${output.type.value}(output_index);\n } else {\n var input_shape_i = ${getElementAt('uniforms.input_shape', 'i', inputShape.length)};\n var output_shape_i = ${getElementAt('uniforms.output_shape', 'i', outputShape.length)};\n original_indices[i] = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i,\n input_shape_i, roi_low, roi_hi);\n }\n }\n return original_indices;\n }`;\n\nconst calculateInputIndicesFromOutputIndices =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[], outputShape: readonly number[],\n scalesLength: number, roiLength: number, useExtrapolation: boolean): string => `\n fn calculateInputIndicesFromOutputIndices(output_indices: ${output.type.indices}) -> ${input.type.indices} {\n var input_indices: ${input.type.indices};\n for (var i:u32 = 0; i < ${outputShape.length}; i++) {\n var output_index = ${output.indicesGet('output_indices', 'i')};\n var input_index: u32;\n var scale = ${getElementAt('uniforms.scales', 'i', scalesLength)};\n if (scale == 1.0) {\n input_index = output_index;\n } else {\n var roi_low = ${getElementAt('uniforms.roi', 'i', roiLength)};\n var roi_hi = ${getElementAt('uniforms.roi', `i + ${inputShape.length}`, roiLength)};\n var input_shape_i = ${getElementAt('uniforms.input_shape', 'i', inputShape.length)};\n var output_shape_i = ${getElementAt('uniforms.output_shape', 'i', outputShape.length)};\n var original_idx = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i,\n input_shape_i, roi_low, roi_hi);\n if (!${useExtrapolation} || (original_idx >= 0 && original_idx < ${output.type.value}(input_shape_i))) {\n if (original_idx < 0) {\n input_index = 0;\n } else if (original_idx > ${output.type.value}(input_shape_i - 1)) {\n input_index = input_shape_i - 1;\n } else {\n input_index = u32(getNearestPixelFromOriginal(original_idx, scale < 1));\n }\n } else {\n input_index = u32(original_idx);\n }\n }\n ${input.indicesSet('input_indices', 'i', ' input_index')}\n }\n return input_indices;\n }`;\nconst checkInputIndices = (input: IndicesHelper, inputShape: readonly number[]): string => `\n fn checkInputIndices(input_indices: ${input.type.indices}) -> bool {\n for (var i:u32 = 0; i < ${inputShape.length}; i++) {\n var input_index = ${input.indicesGet('input_indices', 'i')};\n if (input_index < 0 || input_index >= ${getElementAt('uniforms.input_shape', 'i', inputShape.length)}) {\n return false;\n }\n }\n return true;\n }`;\n\nconst setChannelAndBatchIndices =\n (input: IndicesHelper, channelIdx: number, batchIdx: number, spacialDims: number): string =>\n input.rank > spacialDims ? `\n ${input.indicesSet('input_indices', channelIdx, 'channel')};\n ${input.indicesSet('input_indices', batchIdx, 'batch')};\n` :\n '';\n\nconst bilinearInterpolation =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[], useExtrapolation: boolean,\n extrapolationValue: number): string => {\n const isNchw = true;\n const [batchIdx, heightIdx, widthIdx, channelIdx] =\n inputShape.length === 2 ? [-1, 0, 1, -1] : (isNchw ? [0, 2, 3, 1] : [0, 1, 2, 3]);\n const dType = input.type.value;\n return `\n fn getInputValue(batch: u32, channel: u32, row: u32, col: u32) -> ${dType} {\n var input_indices: ${input.type.indices};\n ${input.indicesSet('input_indices', heightIdx, `max(0, min(row, ${inputShape[heightIdx]} - 1))`)};\n ${input.indicesSet('input_indices', widthIdx, `max(0, min(col, ${inputShape[widthIdx]} - 1))`)};\n ${setChannelAndBatchIndices(input, channelIdx, batchIdx, 2)}\n return ${input.getByIndices('input_indices')};\n }\n\n fn bilinearInterpolation(output_indices: ${output.type.indices}) -> ${dType} {\n var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices);\n var row:${dType} = originalIndices[${heightIdx}];\n var col:${dType} = originalIndices[${widthIdx}];\n ${\n useExtrapolation ?\n `if (row < 0 || row > (${inputShape[heightIdx]} - 1) || col < 0 || col > (${inputShape[widthIdx]} - 1)) {\n return ${extrapolationValue};\n }` :\n ''};\n row = max(0, min(row, ${inputShape[heightIdx]} - 1));\n col = max(0, min(col, ${inputShape[widthIdx]} - 1));\n var row1: u32 = u32(row);\n var col1: u32 = u32(col);\n var row2: u32 = u32(row + 1);\n var col2: u32 = u32(col + 1);\n var channel: u32 = ${inputShape.length > 2 ? `u32(originalIndices[${channelIdx}])` : '0'};\n var batch: u32 = ${inputShape.length > 2 ? `u32(originalIndices[${batchIdx}])` : '0'};\n var x11: ${dType} = getInputValue(batch, channel, row1, col1);\n var x12: ${dType} = getInputValue(batch, channel, row1, col2);\n var x21: ${dType} = getInputValue(batch, channel, row2, col1);\n var x22: ${dType} = getInputValue(batch, channel, row2, col2);\n var dx1: ${dType} = abs(row - ${dType}(row1));\n var dx2: ${dType} = abs(${dType}(row2) - row);\n var dy1: ${dType} = abs(col - ${dType}(col1));\n var dy2: ${dType} = abs(${dType}(col2) - col);\n if (row1 == row2) {\n dx1 = 0.5;\n dx2 = 0.5;\n }\n if (col1 == col2) {\n dy1 = 0.5;\n dy2 = 0.5;\n }\n return (x11 * dx2 * dy2 + x12 * dx2 * dy1 + x21 * dx1 * dy2 + x22 * dx1 * dy1);\n }`;\n };\n\nconst bicubicInterpolation =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[], outputShape: readonly number[],\n scales: readonly number[], roi: readonly number[], cubicCoeffA: number, useExtrapolation: boolean,\n extrapolationValue: number, excludeOutside: boolean): string => {\n const is2D = inputShape.length === 2;\n const isNchw = true;\n const [heightIdx, widthIdx] = is2D ? [0, 1] : isNchw ? [2, 3] : [1, 2];\n const dType = input.type.value;\n const createCubicInterpolationFunction = (idx: number): string => {\n const direction = idx === heightIdx ? 'row' : 'col';\n return `\n fn ${direction}CubicInterpolation(input_indices: ${input.type.indices}, output_indices: ${\n output.type.indices}) -> ${dType} {\n var output_index = ${output.indicesGet('output_indices', idx)};\n var originalIdx: ${dType} = getOriginalCoordinateFromResizedCoordinate(output_index, ${scales[idx]},\n ${outputShape[idx]}, ${inputShape[idx]}, ${roi[idx]}, ${roi[idx]} + ${inputShape.length});\n var fractOriginalIdx: ${dType} = originalIdx - floor(originalIdx);\n var coefs = getCubicInterpolationCoefs(fractOriginalIdx);\n\n if (${useExtrapolation} && (originalIdx < 0 || originalIdx > (${inputShape[idx]} - 1))) {\n return ${extrapolationValue};\n }\n var data: array<${dType}, 4> = array<${dType}, 4>(0.0, 0.0, 0.0, 0.0);\n for (var i: i32 = -1; i < 3; i++) {\n var ${direction}: ${dType} = originalIdx + ${dType}(i);\n if (${direction} < 0 || ${direction} >= ${inputShape[idx]}) {\n ${(() => {\n if (excludeOutside) {\n return `coefs[i + 1] = 0.0;\n continue;`;\n } else if (useExtrapolation) {\n return `return ${extrapolationValue};`;\n } else {\n return `${direction} = max(0, min(${direction}, ${inputShape[idx]} - 1));`;\n }\n })()};\n }\n var input_indices_copy: ${input.type.indices} = input_indices;\n ${input.indicesSet('input_indices_copy', idx, `u32(${direction})`)};\n data[i + 1] = ${\n idx === heightIdx ? input.getByIndices('input_indices_copy') :\n 'rowCubicInterpolation(input_indices_copy, output_indices)'};\n }\n return cubicInterpolation1D(data, coefs);\n }`;\n };\n\n return `\n ${createCubicInterpolationFunction(heightIdx)};\n ${createCubicInterpolationFunction(widthIdx)};\n fn getCubicInterpolationCoefs(s: ${dType}) -> array<${dType}, 4> {\n var absS = abs(s);\n var coeffs: array<${dType}, 4> = array<${dType}, 4>(0.0, 0.0, 0.0, 0.0);\n var oneMinusAbsS: ${dType} = 1.0 - absS;\n var twoMinusAbsS: ${dType} = 2.0 - absS;\n var onePlusAbsS: ${dType} = 1.0 + absS;\n coeffs[0] = ((${cubicCoeffA} * onePlusAbsS - 5 * ${cubicCoeffA}) * onePlusAbsS + 8 * ${\n cubicCoeffA}) * onePlusAbsS - 4 * ${cubicCoeffA};\n coeffs[1] = ((${cubicCoeffA} + 2) * absS - (${cubicCoeffA} + 3)) * absS * absS + 1;\n coeffs[2] = ((${cubicCoeffA} + 2) * oneMinusAbsS - (${cubicCoeffA} + 3)) * oneMinusAbsS * oneMinusAbsS + 1;\n coeffs[3] = ((${cubicCoeffA} * twoMinusAbsS - 5 * ${cubicCoeffA}) * twoMinusAbsS + 8 * ${\n cubicCoeffA}) * twoMinusAbsS - 4 * ${cubicCoeffA};\n return coeffs;\n }\n\n fn cubicInterpolation1D(x: array<${dType}, 4>, coefs: array<${dType}, 4>) -> ${dType} {\n var coefsSum: ${dType} = coefs[0] + coefs[1] + coefs[2] + coefs[3];\n return (x[0] * coefs[0] + x[1] * coefs[1]+ x[2] * coefs[2]+ x[3] * coefs[3]) / coefsSum;\n }\n\n fn bicubicInterpolation(output_indices: ${output.type.indices}) -> ${dType} {\n var input_indices: ${input.type.indices} = output_indices;\n return colCubicInterpolation(input_indices, output_indices);\n }\n `;\n };\n\nconst trilinearInterpolation =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[], useExtrapolation: boolean,\n extrapolationValue: number): string => {\n const isNchw = true;\n const [batchIdx, depthIdx, heightIdx, widthIdx, channelIdx] =\n inputShape.length === 3 ? [-1, 0, 1, 2, -1] : (isNchw ? [0, 2, 3, 4, 1] : [0, 1, 2, 3, 4]);\n const dType = input.type.value;\n return `\n fn getInputValue(batch: u32, channel: u32, depth:u32, height: u32, width: u32) -> ${dType} {\n var input_indices: ${input.type.indices};\n ${input.indicesSet('input_indices', depthIdx, `max(0, min(depth, ${inputShape[depthIdx]} - 1))`)};\n ${input.indicesSet('input_indices', heightIdx, `max(0, min(height, ${inputShape[heightIdx]} - 1))`)};\n ${input.indicesSet('input_indices', widthIdx, `max(0, min(width, ${inputShape[widthIdx]} - 1))`)};\n ${setChannelAndBatchIndices(input, channelIdx, batchIdx, 3)}\n return ${input.getByIndices('input_indices')};\n }\n\n fn trilinearInterpolation(output_indices: ${output.type.indices}) -> ${dType} {\n var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices);\n var depth:${dType} = originalIndices[${depthIdx}];\n var height:${dType} = originalIndices[${heightIdx}];\n var width:${dType} = originalIndices[${widthIdx}];\n ${\n useExtrapolation ? `if (depth < 0 || depth > (${inputShape[depthIdx]} - 1) || height < 0 || height > (${\n inputShape[heightIdx]} - 1) || width < 0 || (width > ${inputShape[widthIdx]} - 1)) {\n return ${extrapolationValue};\n }` :\n ''};\n\n depth = max(0, min(depth, ${inputShape[depthIdx]} - 1));\n height = max(0, min(height, ${inputShape[heightIdx]} - 1));\n width = max(0, min(width, ${inputShape[widthIdx]} - 1));\n var depth1: u32 = u32(depth);\n var height1: u32 = u32(height);\n var width1: u32 = u32(width);\n var depth2: u32 = u32(depth + 1);\n var height2: u32 = u32(height + 1);\n var width2: u32 = u32(width + 1);\n var channel: u32 = ${inputShape.length > 3 ? `u32(originalIndices[${channelIdx}])` : '0'};\n var batch: u32 = ${inputShape.length > 3 ? `u32(originalIndices[${batchIdx}])` : '0'};\n\n var x111: ${dType} = getInputValue(batch, channel, depth1, height1, width1);\n var x112: ${dType} = getInputValue(batch, channel, depth1, height1, width2);\n var x121: ${dType} = getInputValue(batch, channel, depth1, height2, width1);\n var x122: ${dType} = getInputValue(batch, channel, depth1, height2, width2);\n var x211: ${dType} = getInputValue(batch, channel, depth2, height1, width1);\n var x212: ${dType} = getInputValue(batch, channel, depth2, height1, width2);\n var x221: ${dType} = getInputValue(batch, channel, depth2, height2, width1);\n var x222: ${dType} = getInputValue(batch, channel, depth2, height2, width2);\n var dx1: ${dType} = abs(depth - ${dType}(depth1));\n var dx2: ${dType} = abs(${dType}(depth2) - depth);\n var dy1: ${dType} = abs(height - ${dType}(height1));\n var dy2: ${dType} = abs(${dType}(height2) - height);\n var dz1: ${dType} = abs(width - ${dType}(width1));\n var dz2: ${dType} = abs(${dType}(width2) - width);\n if (depth1 == depth2) {\n dx1 = 0.5;\n dx2 = 0.5;\n }\n if (height1 == height2) {\n dy1 = 0.5;\n dy2 = 0.5;\n }\n if (width1 == width2) {\n dz1 = 0.5;\n dz2 = 0.5;\n }\n return (x111 * dx2 * dy2 * dz2 + x112 * dx2 * dy2 * dz1 + x121 * dx2 * dy1 *dz2 + x122 * dx2 * dy1 * dz1 +\n x211 * dx1 * dy2 * dz2 + x212 * dx1 * dy2 * dz1 + x221 * dx1 * dy1 *dz2 + x222 * dx1 * dy1 * dz1);\n }`;\n };\n\nconst createResizeProgramInfo =\n (inputTensor: TensorView, attributes: ResizeAttributes, opsetVersion: number, scalesInput: readonly number[],\n sizes: readonly number[], roiInput: readonly number[]): ProgramInfo => {\n const inputShape = inputTensor.dims;\n const roi = updateRoI(roiInput, attributes.axes, inputShape.length);\n\n let outputShape = initOutputShape(inputShape, scalesInput, sizes, attributes.axes);\n let scales = scalesInput.slice();\n if (scalesInput.length === 0) {\n scales = inputShape.map((value, index) => value === 0 ? 1.0 : outputShape[index] / value);\n if (attributes.keepAspectRatioPolicy !== 'stretch') {\n outputShape = adjustOutputShape(inputShape, scales, attributes);\n }\n }\n const output = outputVariable('output', inputTensor.dataType, outputShape.length);\n const input = inputVariable('input', inputTensor.dataType, inputShape.length);\n const outputSize = ShapeUtil.size(outputShape);\n const noScale = inputShape.length === outputShape.length && inputShape.every((d, i) => d === outputShape[i]);\n const useExtrapolation = attributes.coordinateTransformMode === 'tf_crop_and_resize';\n const extrapolationValue = attributes.extrapolationValue;\n const dataType = input.type.value;\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${noScale ? '' : `\n ${getOriginalCoordinateFromResizedCoordinate(attributes.coordinateTransformMode, dataType)};\n ${(() => {\n switch (attributes.mode) {\n case 'nearest':\n return `\n ${checkInputIndices(input, inputShape)};\n ${getNearestPixelFromOriginal(attributes.nearestMode, opsetVersion, dataType)};\n ${\n calculateInputIndicesFromOutputIndices(\n input, output, inputShape, outputShape, scales.length, roi.length, useExtrapolation)};\n `;\n case 'linear':\n return `\n ${calculateOriginalIndicesFromOutputIndices(output, inputShape, outputShape, scales.length, roi.length)};\n ${(() => {\n if (inputShape.length === 2 || inputShape.length === 4) {\n return `${bilinearInterpolation(input, output, inputShape, useExtrapolation, extrapolationValue)}`;\n } else if (inputShape.length === 3 || inputShape.length === 5) {\n return `${trilinearInterpolation(input, output, inputShape, useExtrapolation, extrapolationValue)}`;\n } else {\n throw Error('Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.');\n }\n })()};\n `;\n case 'cubic':\n return `\n ${(() => {\n if (inputShape.length === 2 || inputShape.length === 4) {\n return `${\n bicubicInterpolation(\n input, output, inputShape, outputShape, scales, roi, attributes.cubicCoeffA, useExtrapolation,\n attributes.extrapolationValue, attributes.excludeOutside)}`;\n } else {\n throw Error('Cubic mode only supports input dims 2 and 4 are supported in linear mode.');\n }\n })()};\n `;\n default:\n throw Error('Invalid resize mode');\n }\n })()};\n `}\n ${\n shaderHelper.registerUniform('output_size', 'u32')\n .registerUniform('scales', 'f32', scales.length)\n .registerUniform('roi', 'f32', roi.length)\n .declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n ${noScale ? 'output[global_idx] = input[global_idx];' : `\n let output_indices = ${output.offsetToIndices('global_idx')};\n var input_indices: ${input.type.indices};\n ${(() => {\n switch (attributes.mode) {\n case 'nearest':\n return `input_indices = calculateInputIndicesFromOutputIndices(output_indices);\n if (checkInputIndices(input_indices)) {\n output[global_idx] = ${input.getByIndices('input_indices')};\n } else {\n output[global_idx] = ${attributes.extrapolationValue};\n }`;\n case 'linear':\n return `output[global_idx] = ${\n (inputShape.length === 2 || inputShape.length === 4) ? 'bilinearInterpolation' :\n 'trilinearInterpolation'}(output_indices);`;\n case 'cubic':\n return 'output[global_idx] = bicubicInterpolation(output_indices);';\n default:\n throw Error(`Unsupported resize mode: ${attributes.mode}`);\n }\n })()};\n`}\n }`;\n\n return {\n name: 'Resize',\n shaderCache: {\n hint: `${attributes.cacheKey}|${opsetVersion}|${scales.length > 0 ? scales : ''}|${\n sizes.length > 0 ? sizes : ''}|${roi.length > 0 ? roi : ''}|${noScale}|${inputShape}`,\n inputDependencies: ['rank']\n },\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputTensor.dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms: [\n {type: DataType.uint32, data: outputSize}, {type: DataType.float, data: scales},\n {type: DataType.float, data: roi}, ...createTensorShapeVariables(inputShape, outputShape)\n ]\n })\n };\n };\n\nconst getOpsetVersionFromCustomDataBuffer = (context: ComputeContext): number => {\n const customDataBuffer = context.customDataBuffer;\n const customDataBuffer32 = new Uint32Array(customDataBuffer, customDataBuffer.byteOffset, 1);\n const opsetVersion = customDataBuffer32[0];\n return opsetVersion;\n};\n\nexport const resize = (context: ComputeContext, attributes: ResizeAttributes): void => {\n const scales: number[] = [];\n const sizes: number[] = [];\n const roi: number[] = [];\n\n // Note that scales in resize are always f32. roi can be f32 or f16.\n // TODO: Currently this code does not support f16 for roi when passed as optional input.\n\n const opsetVersion = getOpsetVersionFromCustomDataBuffer(context);\n if (attributes.antialias !== 0) {\n throw Error('Only default value (0) for Antialias attribute is supported');\n }\n validateInputs(context.inputs, attributes, opsetVersion, scales, sizes, roi);\n context.compute(\n createResizeProgramInfo(context.inputs[0], attributes, opsetVersion, scales, sizes, roi), {inputs: [0]});\n};\n\nexport const parseResizeAttributes = (attributes: Record): ResizeAttributes => {\n const antialias = attributes.antialias as number;\n const axes = attributes.axes as number[];\n const coordinateTransformMode: CoordinateTransformMode =\n attributes.coordinateTransformMode as CoordinateTransformMode;\n const cubicCoeffA = attributes.cubicCoeffA as number;\n const excludeOutside = attributes.excludeOutside as number !== 0;\n const extrapolationValue = attributes.extrapolationValue as number;\n const keepAspectRatioPolicy: KeepAspectRatioPolicy = attributes.keepAspectRatioPolicy as KeepAspectRatioPolicy;\n const mode: Mode = attributes.mode as Mode;\n // If nearestMode is not specified, use simple mode.\n const nearestMode: NearestMode = (attributes.nearestMode === '' ? 'simple' : attributes.nearestMode) as NearestMode;\n return createAttributeWithCacheKey({\n antialias,\n axes,\n coordinateTransformMode,\n cubicCoeffA,\n excludeOutside,\n extrapolationValue,\n keepAspectRatioPolicy,\n mode,\n nearestMode\n });\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, WORKGROUP_SIZE} from './common';\n\nexport interface RotaryEmbeddingAttributes {\n readonly interleaved: boolean;\n readonly numHeads: number;\n readonly rotaryEmbeddingDim: number;\n readonly scale: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: RotaryEmbeddingAttributes): void => {\n const [input, positionIds, cosCache, sinCache] = inputs;\n const {numHeads, rotaryEmbeddingDim} = attributes;\n\n if (input.dims.length !== 3 && input.dims.length !== 4) {\n throw new Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${input.dims.length}`);\n }\n if (!ShapeUtil.areEqual(positionIds.dims, []) && !ShapeUtil.areEqual(positionIds.dims, [1]) &&\n positionIds.dims.length !== 2) {\n throw new Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${positionIds.dims.length}`);\n }\n if (cosCache.dims.length !== 2) {\n throw new Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${cosCache.dims.length}`);\n }\n if (sinCache.dims.length !== 2) {\n throw new Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${sinCache.dims.length}`);\n }\n if (!ShapeUtil.areEqual(cosCache.dims, sinCache.dims)) {\n throw new Error('Inputs \\'cos_cache\\' and \\'sin_cache\\' are expected to have the same shape');\n }\n\n if (rotaryEmbeddingDim > 0 && numHeads === 0) {\n throw new Error('num_heads must be provided if rotary_embedding_dim is specified');\n }\n\n const batchSize = input.dims[0];\n const sequenceLength = input.dims[input.dims.length - 2];\n const maxSequenceLength = cosCache.dims[0];\n const hiddenSize = ShapeUtil.sizeFromDimension(input.dims, 1) / sequenceLength;\n const headSize = rotaryEmbeddingDim === 0 ? cosCache.dims[1] * 2 : hiddenSize / numHeads;\n if (rotaryEmbeddingDim > headSize) {\n throw new Error('rotary_embedding_dim must be less than or equal to head_size');\n }\n\n if (positionIds.dims.length === 2) {\n if (batchSize !== positionIds.dims[0]) {\n throw new Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${positionIds.dims[0]}`);\n }\n if (sequenceLength !== positionIds.dims[1]) {\n throw new Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${positionIds.dims[1]}`);\n }\n }\n\n if (headSize / 2 !== cosCache.dims[1] && rotaryEmbeddingDim / 2 !== cosCache.dims[1]) {\n throw new Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${\n cosCache.dims[1]}`);\n }\n\n if (sequenceLength > maxSequenceLength) {\n throw new Error('Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported');\n }\n};\n\nconst createRotaryEmbeddingProgramInfo =\n (inputs: readonly TensorView[], attributes: RotaryEmbeddingAttributes): ProgramInfo => {\n const {interleaved, numHeads, rotaryEmbeddingDim, scale} = attributes;\n const batchSize = inputs[0].dims[0];\n const batchStride = ShapeUtil.sizeFromDimension(inputs[0].dims, 1);\n const sequenceLength = inputs[0].dims[inputs[0].dims.length - 2];\n const hiddenSize = batchStride / sequenceLength;\n const halfRotaryEmbeddingDim = inputs[2].dims[1];\n const headSize = rotaryEmbeddingDim === 0 ? halfRotaryEmbeddingDim * 2 : hiddenSize / numHeads;\n\n // Rotary embeddings will be calculated in a pair-wise fashion. In accordance, use the shape\n // [batch size, sequence length, num of heads, num of pairs to rotate + num of dims to copy]\n // to unfold the global index in shader.\n const globalShape =\n new Array(batchSize, sequenceLength, hiddenSize / headSize, headSize - halfRotaryEmbeddingDim);\n const globalStrides = ShapeUtil.computeStrides(globalShape);\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.float, data: scale},\n {type: DataType.uint32, data: globalShape},\n {type: DataType.uint32, data: globalStrides},\n\n // strides for addressing the input/output tensor, in permutated order to align with the unfolded global index,\n // i.e. BSNH\n ...(inputs[0].dims.length === 3 ?\n new Array({type: DataType.uint32, data: [batchStride, hiddenSize, headSize, 1]}) :\n []),\n ...(inputs[0].dims.length === 4 ?\n new Array(\n {type: DataType.uint32, data: [batchStride, headSize, sequenceLength * headSize, 1]}) :\n []),\n\n ...createTensorShapeVariables(inputs[0].dims, inputs[1].dims, inputs[2].dims, inputs[3].dims, inputs[0].dims),\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const input = inputVariable('input', inputs[0].dataType, inputs[0].dims.length);\n const positionIds = inputVariable('position_ids', inputs[1].dataType, inputs[1].dims.length);\n const cosCache = inputVariable('cos_cache', inputs[2].dataType, inputs[2].dims.length);\n const sinCache = inputVariable('sin_cache', inputs[3].dataType, inputs[3].dims.length);\n const output = outputVariable('output', inputs[0].dataType, inputs[0].dims.length);\n\n shaderHelper.registerUniforms([\n {name: 'scale', type: 'f32'},\n {name: 'global_shape', type: 'u32', length: globalShape.length},\n {name: 'global_strides', type: 'u32', length: globalStrides.length},\n {name: 'input_output_strides', type: 'u32', length: globalStrides.length},\n ]);\n\n return `\n ${shaderHelper.declareVariables(input, positionIds, cosCache, sinCache, output)}\n\n ${shaderHelper.mainStart(WORKGROUP_SIZE)}\n let half_rotary_emb_dim = uniforms.${cosCache.name}_shape[1];\n let bsnh = global_idx / uniforms.global_strides % uniforms.global_shape;\n let size = uniforms.global_shape[0] * uniforms.global_strides[0];\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('size')}\n\n if (bsnh[3] < half_rotary_emb_dim) {\n let position_ids_idx =\n ${positionIds.broadcastedIndicesToOffset('bsnh.xy', outputVariable('', positionIds.type.tensor, 2))};\n let position_id =\n u32(${positionIds.getByOffset('position_ids_idx')}) + select(0, bsnh[1], position_ids_idx == 0);\n let i = dot(bsnh, uniforms.input_output_strides) + select(0, bsnh[3], ${interleaved});\n let j = i + select(half_rotary_emb_dim, 1, ${interleaved});\n let re = ${input.getByOffset('i')} * ${cosCache.get('position_id', 'bsnh[3]')} -\n ${input.getByOffset('j')} * ${sinCache.get('position_id', 'bsnh[3]')};\n ${output.setByOffset('i', 're')}\n let im = ${input.getByOffset('i')} * ${sinCache.get('position_id', 'bsnh[3]')} +\n ${input.getByOffset('j')} * ${cosCache.get('position_id', 'bsnh[3]')};\n ${output.setByOffset('j', 'im')}\n } else {\n let k = dot(bsnh, uniforms.input_output_strides) + half_rotary_emb_dim;\n ${output.setByOffset('k', input.getByOffset('k'))}\n }\n }`;\n };\n\n return {\n name: 'RotaryEmbedding',\n shaderCache: {\n hint: createAttributeWithCacheKey({\n interleaved,\n }).cacheKey,\n inputDependencies: ['rank', 'rank', 'rank', 'rank'],\n },\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: inputs[0].dims, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(ShapeUtil.size(globalShape) / WORKGROUP_SIZE)},\n programUniforms,\n }),\n };\n };\n\nexport const rotaryEmbedding = (context: ComputeContext, attributes: RotaryEmbeddingAttributes): void => {\n validateInputs(context.inputs, attributes);\n context.compute(createRotaryEmbeddingProgramInfo(context.inputs, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {castToF32, getMaxComponents, inputVariable, outputVariable, ShaderHelper, sumVector, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\n\nexport interface SkipLayerNormAttributes {\n simplified: boolean;\n epsilon: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length < 3) {\n throw new Error('layerNorm requires at least 3 inputs.');\n }\n\n const input: TensorView = inputs[0];\n const skip: TensorView = inputs[1];\n const gamma: TensorView = inputs[2];\n\n if (input.dataType !== skip.dataType || input.dataType !== gamma.dataType) {\n throw new Error('All inputs must have the same data type');\n }\n\n if (input.dims.length !== 3 && input.dims.length !== 2) {\n throw new Error('Input must be 2D or 3D');\n }\n\n if (skip.dims.length !== 3 && skip.dims.length !== 2) {\n throw new Error('Skip must be 2D or 3D');\n }\n\n const hiddenSize = input.dims[input.dims.length - 1];\n const sequenceLength = input.dims[input.dims.length - 2];\n if (skip.dims[skip.dims.length - 1] !== hiddenSize) {\n throw new Error('Skip must have the same hidden size as input');\n }\n if (skip.dims[skip.dims.length - 2] !== sequenceLength) {\n throw new Error('Skip must have the same sequence length as input');\n }\n\n if (gamma.dims.length !== 1) {\n throw new Error('Gamma must be 1D');\n }\n if (gamma.dims[gamma.dims.length - 1] !== hiddenSize) {\n throw new Error('Gamma must have the same hidden size as input');\n }\n if (inputs.length > 3) {\n const beta: TensorView = inputs[3];\n if (beta.dims.length !== 1) {\n throw new Error('Beta must be 1D');\n }\n if (beta.dims[beta.dims.length - 1] !== hiddenSize) {\n throw new Error('Beta must have the same hidden size as input');\n }\n }\n if (inputs.length > 4) {\n const bias: TensorView = inputs[4];\n if (bias.dims.length !== 1) {\n throw new Error('Bias must be 1D');\n }\n if (bias.dims[bias.dims.length - 1] !== hiddenSize) {\n throw new Error('Bias must have the same hidden size as input');\n }\n }\n};\n\nconst createSkipLayerNormProgramInfo =\n (inputs: readonly TensorView[], attributes: SkipLayerNormAttributes, outputCount: number, isTraining: boolean):\n ProgramInfo => {\n const simplified = attributes.simplified;\n\n const inputShape = inputs[0].dims;\n const inputSize = ShapeUtil.size(inputShape);\n const outputShape = inputShape;\n const outputSize = inputSize;\n const hiddenSize = inputShape.slice(-1)[0];\n const meanInvStdDevDim = isTraining ? inputShape.slice(0, -1).concat(1) : [];\n const hasBetaInput = !simplified && inputs.length > 3;\n const hasBiasInput = inputs.length > 4;\n const hasMeanOutput = isTraining && outputCount > 1;\n const hasInvStdDevOutput = isTraining && outputCount > 2;\n const hasInputSkipBiasSumOutput = outputCount > 3;\n const workgroupSize = 64;\n\n const components = getMaxComponents(hiddenSize);\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize},\n {type: DataType.uint32, data: components},\n {type: DataType.uint32, data: hiddenSize},\n {type: DataType.float, data: attributes.epsilon},\n ];\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const uniformsArray: UniformsArrayType = [\n {name: 'output_size', type: 'u32'},\n {name: 'components', type: 'u32'},\n {name: 'hidden_size', type: 'u32'},\n {name: 'epsilon', type: 'f32'},\n ];\n const variables = [\n inputVariable('x', inputs[0].dataType, inputs[0].dims, components),\n inputVariable('skip', inputs[1].dataType, inputs[1].dims, components),\n inputVariable('gamma', inputs[2].dataType, inputs[2].dims, components),\n ];\n if (hasBetaInput) {\n variables.push(inputVariable('beta', inputs[3].dataType, inputs[3].dims, components));\n }\n if (hasBiasInput) {\n variables.push(inputVariable('bias', inputs[4].dataType, inputs[4].dims, components));\n }\n variables.push(outputVariable('output', inputs[0].dataType, outputShape, components));\n if (hasMeanOutput) {\n variables.push(outputVariable('mean_output', DataType.float, meanInvStdDevDim));\n }\n if (hasInvStdDevOutput) {\n variables.push(outputVariable('inv_std_output', DataType.float, meanInvStdDevDim));\n }\n if (hasInputSkipBiasSumOutput) {\n variables.push(outputVariable('input_skip_bias_sum', inputs[0].dataType, outputShape, components));\n }\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n const vecDataType = tensorTypeToWsglStorageType(DataType.float, components);\n return `\n\n ${shaderHelper.registerUniforms(uniformsArray).declareVariables(...variables)}\n var sum_shared : array<${vecDataType}, ${workgroupSize}>;\n var sum_squared_shared : array<${vecDataType}, ${workgroupSize}>;\n\n ${shaderHelper.mainStart([\n workgroupSize, 1, 1\n ])}\n let ix = local_id.x;\n let iy = global_id.x / ${workgroupSize};\n\n let hidden_size_vectorized: u32 = uniforms.hidden_size / uniforms.components;\n var stride = hidden_size_vectorized / ${workgroupSize};\n let offset = ix * stride + iy * hidden_size_vectorized;\n let offset1d = stride * ix;\n if (ix == ${workgroupSize - 1}) {\n stride = hidden_size_vectorized - stride * ix;\n }\n for (var i: u32 = 0; i < stride; i++) {\n let skip_value = skip[offset + i];\n let bias_value = ${hasBiasInput ? 'bias[offset1d + i]' : dataType + '(0.0)'};\n let input_value = x[offset + i];\n let value = input_value + skip_value + bias_value;\n ${hasInputSkipBiasSumOutput ? 'input_skip_bias_sum[offset + i] = value;' : ''}\n output[offset + i] = value;\n let f32_value = ${castToF32(dataType, components, 'value')};\n sum_shared[ix] += f32_value;\n sum_squared_shared[ix] += f32_value * f32_value;\n }\n workgroupBarrier();\n\n var reduce_size : u32 = ${workgroupSize};\n for (var curr_size = reduce_size >> 1; curr_size > 0; curr_size = reduce_size >> 1) {\n reduce_size = curr_size + (reduce_size & 1);\n if (ix < curr_size) {\n sum_shared[ix] += sum_shared[ix + reduce_size];\n sum_squared_shared[ix] += sum_squared_shared[ix + reduce_size];\n }\n workgroupBarrier();\n }\n\n let sum = sum_shared[0];\n let square_sum = sum_squared_shared[0];\n let mean = ${sumVector('sum', components)} / f32(uniforms.hidden_size);\n let inv_std_dev = inverseSqrt(${sumVector('square_sum', components)} / f32(uniforms.hidden_size) ${\n simplified ? '' : '- mean * mean'} + uniforms.epsilon);\n ${hasMeanOutput ? 'mean_output[global_idx] = mean;' : ''}\n ${hasInvStdDevOutput ? 'inv_std_output[global_idx] = inv_std_dev;' : ''}\n\n for (var i: u32 = 0; i < stride; i++) {\n output[offset + i] = (output[offset + i] ${simplified ? '' : `- ${dataType}(mean)`}) *\n ${dataType}(inv_std_dev) * gamma[offset1d + i]\n ${hasBetaInput ? '+ beta[offset1d + i]' : ''};\n }\n }`;\n };\n const outputs = [{dims: outputShape, dataType: inputs[0].dataType}];\n if (outputCount > 1) {\n outputs.push({dims: meanInvStdDevDim, dataType: DataType.float});\n }\n if (outputCount > 2) {\n outputs.push({dims: meanInvStdDevDim, dataType: DataType.float});\n }\n if (outputCount > 3) {\n outputs.push({dims: inputShape, dataType: inputs[0].dataType});\n }\n return {\n name: 'SkipLayerNormalization',\n shaderCache: {\n hint: `${components};${hasMeanOutput};${hasInvStdDevOutput};${hasInputSkipBiasSumOutput}`,\n inputDependencies: inputs.map((_input, _index) => 'type')\n },\n getShaderSource,\n getRunData: () => ({\n outputs,\n dispatchGroup: {\n x: Math.ceil(outputSize / hiddenSize),\n },\n programUniforms\n }),\n };\n };\n\nexport const skipLayerNorm = (context: ComputeContext, attributes: SkipLayerNormAttributes): void => {\n // TODO: initialize isTraining from ComputeContext\n const isTraining = false;\n validateInputs(context.inputs);\n // Mean and InvStdDev are only used in training mode and are not required for inference.\n // They are added here for completeness only.\n const outputs = [0];\n if (context.outputCount > 1) {\n outputs.push(isTraining ? 1 : -3);\n }\n if (context.outputCount > 2) {\n outputs.push(isTraining ? 2 : -3);\n }\n if (context.outputCount > 3) {\n outputs.push(3);\n }\n context.compute(\n createSkipLayerNormProgramInfo(context.inputs, attributes, context.outputCount, isTraining), {outputs});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform, TensorInfo} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\n\nexport interface SliceAttributes extends AttributeWithCacheKey {\n readonly starts: number[];\n readonly ends: number[];\n readonly axes: number[];\n}\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: SliceAttributes): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('too few inputs');\n }\n if (attributes.axes.length !== 0) {\n if (attributes.axes.length !== attributes.starts.length || attributes.axes.length !== attributes.ends.length) {\n throw new Error('axes, starts and ends must have the same length');\n }\n } else if (attributes.starts.length !== attributes.ends.length) {\n throw new Error('starts and ends must have the same length');\n }\n inputs.slice(1).forEach((_, idx) => {\n if (inputs[idx + 1].dataType !== DataType.int32 && inputs[idx + 1].dataType !== DataType.int64) {\n throw new Error(`Input ${idx} must be an array of int32 or int64`);\n }\n });\n};\n\nconst readInput = (inputs: readonly TensorView[], idx: number): number[] => {\n const input: number[] = [];\n if (inputs.length > idx) {\n if (inputs[idx].dataType === DataType.int64) {\n inputs[idx].getBigInt64Array().forEach(v => input.push(Number(v)));\n } else if (inputs[idx].dataType === DataType.int32) {\n inputs[idx].getInt32Array().forEach(v => input.push(Number(v)));\n } else {\n throw new Error(`Input ${idx} must be an array of int32 or int64`);\n }\n }\n return input;\n};\n\nconst createSliceAttributesFromInputs =\n (inputs: readonly TensorView[], attributes: SliceAttributes): SliceAttributes => {\n if (inputs.length > 1) {\n const starts: number[] = readInput(inputs, 1);\n const ends: number[] = readInput(inputs, 2);\n let axes: number[] = readInput(inputs, 3);\n if (axes.length === 0) {\n axes = [...Array(inputs[0].dims.length).keys()];\n }\n return createAttributeWithCacheKey({starts, ends, axes});\n } else {\n return attributes;\n }\n };\n\nconst fixStartEndValues =\n (value: number, index: number, inputShape: readonly number[], axes: readonly number[], steps: readonly number[]):\n number => {\n let newValue = value;\n if (value < 0) {\n newValue += inputShape[axes[index]];\n }\n if (steps[index] < 0) {\n return Math.max(0, Math.min(newValue, inputShape[axes[index]] - 1));\n } else {\n return Math.max(0, Math.min(newValue, inputShape[axes[index]]));\n }\n };\n\nconst calculateInputIndicesImpl =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[]): string =>\n `fn calculateInputIndices(output_indices: ${output.type.indices}) -> ${input.type.indices} {\n var input_indices: ${input.type.indices};\n var carry = 0u;\n for (var i = ${inputShape.length}; i >= 0; i--) {\n let input_shape_i = ${getElementAt('uniforms.input_shape', 'i', inputShape.length)};\n let steps_i = ${getElementAt('uniforms.steps', 'i', inputShape.length)};\n let signs_i = ${getElementAt('uniforms.signs', 'i', inputShape.length)};\n let starts_i = ${getElementAt('uniforms.starts', 'i', inputShape.length)};\n var output_index = ${output.indicesGet('output_indices', 'i')};\n var input_index = output_index * steps_i + starts_i + carry;\n carry = input_index / input_shape_i;\n input_index = input_index % input_shape_i;\n if (signs_i < 0) {\n input_index = input_shape_i - input_index - 1u + starts_i;\n }\n ${input.indicesSet('input_indices', 'i', 'input_index')};\n }\n return input_indices;\n }`;\n\nconst createSliceProgramInfo = (inputs: readonly TensorView[], attributes: SliceAttributes): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const inputSize = ShapeUtil.size(inputShape);\n const axes = (attributes.axes.length > 0) ? ShapeUtil.normalizeAxes(attributes.axes, inputShape.length) :\n [...Array(inputShape.length).keys()];\n let steps = readInput(inputs, 4);\n steps.forEach((step) => step !== 0 || (() => {\n throw new Error('step cannot be 0');\n }));\n if (steps.length === 0) {\n steps = Array(axes.length).fill(1);\n }\n const starts = attributes.starts.map((start, i) => fixStartEndValues(start, i, inputShape, axes, steps));\n\n const ends = attributes.ends.map((end, i) => fixStartEndValues(end, i, inputShape, axes, steps));\n\n if (axes.length !== starts.length || axes.length !== ends.length) {\n throw new Error('start, ends and axes should have the same number of elements');\n }\n\n if (axes.length !== inputShape.length) {\n for (let i = 0; i < inputShape.length; ++i) {\n if (!axes.includes(i)) {\n starts.splice(i, 0, 0);\n ends.splice(i, 0, inputShape[i]);\n steps.splice(i, 0, 1);\n }\n }\n }\n const signs = steps.map(step => Math.sign(step));\n // Convert negative steps to positive steps and reverse starts and ends\n steps.forEach((step, i, array) => {\n if (step < 0) {\n const numSteps = (ends[i] - starts[i]) / step;\n const newEnd = starts[i];\n const newStart = newEnd + numSteps * steps[i];\n starts[i] = newStart;\n ends[i] = newEnd;\n array[i] = -step;\n }\n });\n // Output rank is expected to be less than or equal to the input rank.\n const outputShape = inputShape.slice(0);\n axes.forEach((axis, _) => {\n outputShape[axis] = Math.ceil((ends[axis] - starts[axis]) / steps[axis]);\n });\n const outputTensorInfo: TensorInfo = {dims: outputShape, dataType: inputs[0].dataType};\n\n const output = outputVariable('output', inputs[0].dataType, outputShape.length);\n const input = inputVariable('input', inputs[0].dataType, inputs[0].dims.length);\n const outputSize = ShapeUtil.size(outputShape);\n const uniforms: UniformsArrayType = [\n {name: 'outputSize', type: 'u32'}, {name: 'starts', type: 'u32', length: starts.length},\n {name: 'signs', type: 'i32', length: signs.length}, {name: 'steps', type: 'u32', length: steps.length}\n ];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: starts},\n {type: DataType.int32, data: signs}, {type: DataType.uint32, data: steps},\n ...createTensorShapeVariables(inputs[0].dims, outputShape)\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(input, output)}\n ${calculateInputIndicesImpl(input, output, inputShape)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n let output_indices = ${output.offsetToIndices('global_idx')};\n let input_indices = calculateInputIndices(output_indices);\n ${output.setByOffset('global_idx', input.getByIndices('input_indices'))}\n }`;\n return {\n name: 'Slice',\n shaderCache: {hint: `${signs.length}_${starts.length}_${steps.length}`, inputDependencies: ['rank']},\n getShaderSource,\n getRunData: () => ({\n outputs: [outputTensorInfo],\n dispatchGroup: {x: Math.ceil(inputSize / 64 /* workgroup size */)},\n programUniforms\n })\n };\n};\n\nexport const slice = (context: ComputeContext, attributes: SliceAttributes): void => {\n validateInputs(context.inputs, attributes);\n const updatedAttributes = createSliceAttributesFromInputs(context.inputs, attributes);\n context.compute(createSliceProgramInfo(context.inputs, updatedAttributes), {inputs: [0]});\n // if (ShapeUtil.size(program.outputs[0].dims) > 0) {\n // context.compute(programInfoLoader, {inputs: [0]});\n // } else {\n // // TODO: support empty output\n // throw new Error('slice: output size is 0');\n // }\n};\n\nexport const parseSliceAttributes = (attributes: Record): SliceAttributes => {\n const starts = attributes.starts as number[];\n const ends = attributes.ends as number[];\n const axes = attributes.axes as number[];\n return createAttributeWithCacheKey({starts, ends, axes});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// TODO: this is the same naive implementation we use for reduce that has\n// performance limitations when the reduced axis is long. Need to add\n// a optimized codepath for this.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {getMaxComponents, inputVariable, outputVariable, ShaderHelper, sumVector, tensorTypeToWsglStorageType} from './common';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Softmax op requires 1 input.');\n }\n};\n\nexport interface SoftmaxAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n}\n\nconst createSoftmaxProgramInfo = (input: TensorView, attributes: SoftmaxAttributes): ProgramInfo => {\n const shape = input.dims;\n const outputSize = ShapeUtil.size(shape);\n const WG = 64;\n let axis = attributes.axis;\n if (axis < 0) {\n axis = shape.length + axis;\n }\n if (axis < shape.length - 1) {\n throw new Error('softmax only supports last axis for now.');\n }\n\n const cols = shape[axis];\n const rows = outputSize / cols;\n const components = getMaxComponents(cols);\n const packedCols = cols / components;\n\n const maxVector = (name: string, components: number) => {\n if (components === 4) {\n return `max(max(${name}.x, ${name}.y), max(${name}.z, ${name}.w))`;\n } else if (components === 2) {\n return `max(${name}.x, ${name}.y)`;\n } else if (components === 3) {\n return `max(max(${name}.x, ${name}.y), ${name}.z)`;\n }\n\n return name;\n };\n const x = inputVariable('x', input.dataType, input.dims, components);\n const output = outputVariable('result', input.dataType, input.dims, components);\n const valueType = x.type.value;\n // 6.2.4 in wgsl spec\n const threadMaxDecl = tensorTypeToWsglStorageType(input.dataType) === 'f32' ?\n `var threadMax = ${valueType}(-3.402823e+38f);` :\n `var threadMax = ${valueType}(-65504.0h);`;\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n var rowMaxShared : ${valueType};\n var rowSumShared : ${valueType};\n var threadShared : array<${valueType}, ${WG}>;\n\n fn getValue(row: i32, col: i32, row_stride: i32) -> ${valueType} {\n let index = row * row_stride + col;\n return x[index];\n }\n\n fn setValue(row: i32, col: i32, row_stride: i32, value: ${valueType}) {\n let index = row * row_stride + col;\n result[index] = value;\n }\n ${shaderHelper.registerUniform('packedCols', 'i32').declareVariables(x, output)}\n ${shaderHelper.mainStart()}\n let gindex = i32(global_idx);\n let lindex = i32(local_idx);\n const wg = ${WG};\n let row = gindex / wg;\n let cols = uniforms.packedCols;\n let row_stride : i32 = uniforms.packedCols;\n\n // find the rows max\n ${threadMaxDecl}\n for (var col = lindex; col < cols; col += wg) {\n let value = getValue(row, col, row_stride);\n threadMax = max(threadMax, value);\n }\n if (lindex < cols) {\n threadShared[lindex] = threadMax;\n }\n workgroupBarrier();\n\n var reduceSize = min(cols, wg);\n for (var currSize = reduceSize >> 1; currSize > 0; currSize = reduceSize >> 1) {\n reduceSize = currSize + (reduceSize & 1);\n if (lindex < currSize) {\n threadShared[lindex] = max(threadShared[lindex], threadShared[lindex + reduceSize]);\n }\n workgroupBarrier();\n }\n if (lindex == 0) {\n rowMaxShared = ${valueType}(${maxVector('threadShared[0]', components)});\n }\n workgroupBarrier();\n\n // find the rows sum\n var threadSum = ${valueType}(0.0);\n for (var col = lindex; col < cols; col += wg) {\n let subExp = exp(getValue(row, col, row_stride) - rowMaxShared);\n threadSum += subExp;\n }\n threadShared[lindex] = threadSum;\n workgroupBarrier();\n\n for (var currSize = wg >> 1; currSize > 0; currSize = currSize >> 1) {\n if (lindex < currSize) {\n threadShared[lindex] = threadShared[lindex] + threadShared[lindex + currSize];\n }\n workgroupBarrier();\n }\n if (lindex == 0) {\n rowSumShared = ${valueType}(${sumVector('threadShared[0]', components)});\n }\n workgroupBarrier();\n\n // calculate final value for each element in the row\n for (var col = lindex; col < cols; col += wg) {\n let value = exp(getValue(row, col, row_stride) - rowMaxShared) / rowSumShared;\n setValue(row, col, row_stride, value);\n }\n }`;\n return {\n name: 'Softmax',\n shaderCache: {hint: `${components}`, inputDependencies: ['type']},\n getRunData: () => ({\n outputs: [{dims: shape, dataType: input.dataType}],\n dispatchGroup: {x: rows},\n programUniforms: [{type: DataType.int32, data: packedCols}]\n }),\n getShaderSource,\n };\n};\n\nexport const softmax = (context: ComputeContext, attributes: SoftmaxAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createSoftmaxProgramInfo(context.inputs[0], attributes));\n};\n\nexport const parseSoftmaxAttributes = (attributes: Record): SoftmaxAttributes =>\n createAttributeWithCacheKey({axis: attributes.axis as number});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform, TensorInfo} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface SplitAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n readonly numOutputs: number;\n readonly splitSizes: number[];\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('too few inputs');\n }\n};\n\nconst createSplitAttributesFromInputs =\n (inputs: readonly TensorView[], attributes: SplitAttributes): SplitAttributes => {\n const splitSizes: number[] = [];\n let numOutputs: number = attributes.numOutputs;\n if (inputs[1].dims[0] > 0) {\n inputs[1].getBigInt64Array().forEach(v => splitSizes.push(Number(v)));\n numOutputs = splitSizes.length;\n }\n return createAttributeWithCacheKey({numOutputs, axis: attributes.axis, splitSizes});\n };\n\nconst calculateOutputIndexImpl = (numberOfTensors: number): string => `\nfn calculateOutputIndex(index: u32) -> u32 {\n for (var i: u32 = 0u; i < ${numberOfTensors}u; i += 1u ) {\n if (index < ${getElementAt('uniforms.size_in_split_axis', 'i', numberOfTensors)}) {\n return i;\n }\n }\n return ${numberOfTensors}u;\n}`;\nconst writeBufferDataImpl = (outputs: readonly IndicesHelper[]) => {\n const numberOfTensors = outputs.length;\n const codeLines: string[] = [];\n for (let i = 0; i < numberOfTensors; ++i) {\n const returnSnippet = outputs[i].setByIndices('indices', 'input[global_idx]');\n if (numberOfTensors === 1) {\n codeLines.push(returnSnippet);\n } else if (i === 0) {\n codeLines.push(`if (output_number == ${i}u) { ${returnSnippet} }`);\n } else if (i === numberOfTensors - 1) {\n codeLines.push(`else { ${returnSnippet} }`);\n } else {\n codeLines.push(`else if (output_number == ${i}) { ${returnSnippet} }`);\n }\n }\n return `\n fn writeBufferData(output_number: u32, indices: ${outputs[0].type.indices}, global_idx: u32) {\n ${codeLines.join('\\n')}\n }`;\n};\n\nconst createSplitProgramInfo = (inputs: readonly TensorView[], attributes: SplitAttributes): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const inputSize = ShapeUtil.size(inputShape);\n const dataType = inputs[0].dataType;\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputShape.length);\n const outputs = new Array(attributes.numOutputs);\n const input = inputVariable('input', dataType, inputShape.length);\n const sizeInSplitAxis = new Array(attributes.numOutputs);\n const outputsTensorInfo: TensorInfo[] = [];\n const outputShapes: number[][] = [];\n let previousSum = 0;\n const programUniforms: ProgramUniform[] = [{type: DataType.uint32, data: inputSize}];\n for (let i = 0; i < attributes.numOutputs; i++) {\n previousSum += attributes.splitSizes[i];\n sizeInSplitAxis[i] = previousSum;\n const outputShape = inputShape.slice();\n outputShape[attributes.axis] = attributes.splitSizes[i];\n outputShapes.push(outputShape);\n outputs[i] = outputVariable(`output${i}`, dataType, outputShape.length);\n outputsTensorInfo.push({dims: outputShapes[i], dataType: inputs[0].dataType});\n }\n programUniforms.push(\n {type: DataType.uint32, data: sizeInSplitAxis}, ...createTensorShapeVariables(inputShape, ...outputShapes));\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${\n shaderHelper.registerUniform('input_size', 'u32')\n .registerUniform('size_in_split_axis', 'u32', sizeInSplitAxis.length)\n .declareVariables(input, ...outputs)}\n ${calculateOutputIndexImpl(sizeInSplitAxis.length)}\n ${writeBufferDataImpl(outputs)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.input_size')}\n\n var indices = ${input.offsetToIndices('global_idx')};\n var index = ${input.indicesGet('indices', axis)};\n let output_number = calculateOutputIndex(index);\n if (output_number != 0) {\n index -= ${getElementAt('uniforms.size_in_split_axis', 'output_number - 1u', sizeInSplitAxis.length)};\n ${input.indicesSet('indices', axis, 'index')};\n }\n writeBufferData(output_number, indices, global_idx);\n }`;\n return {\n name: 'Split',\n shaderCache: {hint: attributes.cacheKey, inputDependencies: ['rank']},\n getShaderSource,\n getRunData: () => ({\n outputs: outputsTensorInfo,\n dispatchGroup: {x: Math.ceil(inputSize / 64 /* workgroup size */)},\n programUniforms\n })\n };\n};\n\nexport const split = (context: ComputeContext, attributes: SplitAttributes): void => {\n validateInputs(context.inputs);\n const updatedAttributes =\n context.inputs.length === 1 ? attributes : createSplitAttributesFromInputs(context.inputs, attributes);\n context.compute(createSplitProgramInfo(context.inputs, updatedAttributes), {inputs: [0]});\n};\n\nexport const parseSplitAttributes = (attributes: Record): SplitAttributes => {\n const axis = attributes.axis as number;\n const splitSizes: number[] = attributes.splitSizes as number[];\n const numOutputs = attributes.numOutputs as number < 0 ? splitSizes.length : attributes.numOutputs as number;\n if (numOutputs !== splitSizes.length) {\n throw new Error('numOutputs and splitSizes lengh must be equal');\n }\n return createAttributeWithCacheKey({axis, numOutputs, splitSizes});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {BroadcastUtil, ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nconst createWhereOpProgramShader =\n (shaderHelper: ShaderHelper, inputs: readonly TensorView[], dimsOutput: readonly number[], isBroadcast: boolean,\n typeOutput: number) => {\n const output = outputVariable('output_data', typeOutput, dimsOutput.length, 4);\n const a = inputVariable('a_data', inputs[1].dataType, inputs[1].dims.length, 4);\n const b = inputVariable('b_data', inputs[2].dataType, inputs[2].dims.length, 4);\n const c = inputVariable('c_data', inputs[0].dataType, inputs[0].dims.length, 4);\n\n let assignment: string;\n const expression = (a: string, b: string, c: string) => `select(${b}, ${a}, ${c})`;\n if (!isBroadcast) {\n assignment = output.setByOffset(\n 'global_idx',\n expression(a.getByOffset('global_idx'), b.getByOffset('global_idx'), c.getByOffset('global_idx')));\n } else {\n const singleAssignment = (resStr: string, x: number, typeCast = '') => {\n const expressionA = `a_data[index_a${x}][component_a${x}]`;\n const expressionB = `b_data[index_b${x}][component_b${x}]`;\n // eslint-disable-next-line no-bitwise\n const expressionC = `bool(c_data[index_c${x}] & (0xffu << (component_c${x} * 8)))`;\n return `\n let output_indices${x} = ${output.offsetToIndices(`global_idx * 4u + ${x}u`)};\n let offset_a${x} = ${a.broadcastedIndicesToOffset(`output_indices${x}`, output)};\n let offset_b${x} = ${b.broadcastedIndicesToOffset(`output_indices${x}`, output)};\n let offset_c${x} = ${c.broadcastedIndicesToOffset(`output_indices${x}`, output)};\n let index_a${x} = offset_a${x} / 4u;\n let index_b${x} = offset_b${x} / 4u;\n let index_c${x} = offset_c${x} / 4u;\n let component_a${x} = offset_a${x} % 4u;\n let component_b${x} = offset_b${x} % 4u;\n let component_c${x} = offset_c${x} % 4u;\n ${resStr}[${x}] = ${typeCast}(${expression(expressionA, expressionB, expressionC)});\n `;\n };\n if (typeOutput === DataType.bool) {\n assignment = `\n var data = vec4(0);\n ${singleAssignment('data', 0, 'u32')}\n ${singleAssignment('data', 1, 'u32')}\n ${singleAssignment('data', 2, 'u32')}\n ${singleAssignment('data', 3, 'u32')}\n output_data[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`;\n } else {\n assignment = `\n ${singleAssignment('output_data[global_idx]', 0)}\n ${singleAssignment('output_data[global_idx]', 1)}\n ${singleAssignment('output_data[global_idx]', 2)}\n ${singleAssignment('output_data[global_idx]', 3)}\n `;\n }\n }\n\n return `\n ${shaderHelper.registerUniform('vec_size', 'u32').declareVariables(c, a, b, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.vec_size')}\n ${assignment}\n }`;\n };\n\nconst createWhereOpProgramInfo = (inputs: readonly TensorView[]): ProgramInfo => {\n const dimsA = inputs[1].dims;\n const dimsB = inputs[2].dims;\n const dimsC = inputs[0].dims;\n const outputDataType = inputs[1].dataType;\n\n const isBroadcast = !(ShapeUtil.areEqual(dimsA, dimsB) && ShapeUtil.areEqual(dimsB, dimsC));\n let outputShape = dimsA;\n let outputSize = ShapeUtil.size(dimsA);\n // TODO: deal with zero-sized tensors (eg. dims=[1,0])\n\n if (isBroadcast) {\n const calculatedShape = BroadcastUtil.calcShape(BroadcastUtil.calcShape(dimsA, dimsB, false)!, dimsC, false);\n if (!calculatedShape) {\n throw new Error('Can\\'t perform where op on the given tensors');\n }\n outputShape = calculatedShape;\n outputSize = ShapeUtil.size(outputShape);\n }\n\n const vecSize = Math.ceil(outputSize / 4);\n\n return {\n name: 'Where',\n shaderCache: {inputDependencies: ['rank', 'rank', 'rank']},\n getShaderSource: (shaderHelper) =>\n createWhereOpProgramShader(shaderHelper, inputs, outputShape, isBroadcast, outputDataType),\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: outputDataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */ / 4 /* vec size */)},\n programUniforms:\n [{type: DataType.uint32, data: vecSize}, ...createTensorShapeVariables(dimsC, dimsA, dimsB, outputShape)],\n }),\n };\n};\n\nexport const where = (context: ComputeContext): void => {\n context.compute(createWhereOpProgramInfo(context.inputs));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {argMax, argMin, parseArgMinMaxAttributes} from './ops/argminmax';\nimport {attention} from './ops/attention';\nimport {batchNorm} from './ops/batch-norm';\nimport {biasAdd} from './ops/bias-add';\nimport {biasSplitGelu} from './ops/bias-split-gelu';\nimport * as binaryOps from './ops/binary-op';\nimport {concat, parseConcatAttributes} from './ops/concat';\nimport {conv, parseConvAttributes} from './ops/conv';\nimport {convTranspose, parseConvTransposeAttributes} from './ops/conv-transpose';\nimport {cumsum, parseCumSumAttributes} from './ops/cumsum';\nimport {depthToSpace, parseDepthToSpaceAttributes} from './ops/depth-to-space';\nimport {einsum, parseEinsumAttributes} from './ops/einsum';\nimport {expand} from './ops/expand';\nimport {fastGelu} from './ops/fast-gelu';\nimport {gather, parseGatherAttributes} from './ops/gather';\nimport {gatherElements, parseGatherElementsAttributes} from './ops/gather-elements';\nimport {gemm, parseGemmAttributes} from './ops/gemm';\nimport {groupQueryAttention, parseGroupQueryAttentionAttributes} from './ops/group-query-attention';\nimport {instanceNorm} from './ops/instance-norm';\nimport {layerNorm} from './ops/layer-norm';\nimport {matMul} from './ops/matmul';\nimport {matMulNBits, parseMatMulNBitsAttributes} from './ops/matmulnbits';\nimport {multiHeadAttention, parseMultiHeadAttentionAttributes} from './ops/multihead-attention';\nimport {pad} from './ops/pad';\nimport * as pool from './ops/pool';\nimport {range} from './ops/range';\nimport {reduceL1, reduceL2, reduceLogSum, reduceLogSumExp, reduceMax, reduceMean, reduceMin, reduceProd, reduceSum, reduceSumSquare} from './ops/reduce';\nimport {parseResizeAttributes, resize} from './ops/resize';\nimport {rotaryEmbedding} from './ops/rotary-embedding';\nimport {skipLayerNorm} from './ops/skip-layer-norm';\nimport {parseSliceAttributes, slice} from './ops/slice';\nimport {parseSoftmaxAttributes, softmax} from './ops/softmax';\nimport {parseSplitAttributes, split} from './ops/split';\nimport {tile} from './ops/tile';\nimport {parseTransposeAttributes, transpose} from './ops/transpose';\nimport * as unaryOps from './ops/unary-op';\nimport {where} from './ops/where';\nimport {ComputeContext} from './types';\n\nexport type RunFunction = (context: ComputeContext, attribute?: unknown) => void;\nexport type ParseAttributeFunction = (attributeRaw: unknown) => unknown;\nexport type OperatorImplementation = [RunFunction]|[RunFunction, ParseAttributeFunction];\n\nexport const WEBGPU_OP_RESOLVE_RULES: Map = new Map([\n ['Abs', [unaryOps.abs]],\n ['Acos', [unaryOps.acos]],\n ['Acosh', [unaryOps.acosh]],\n ['Add', [binaryOps.add]],\n ['ArgMax', [argMax, parseArgMinMaxAttributes]],\n ['ArgMin', [argMin, parseArgMinMaxAttributes]],\n ['Asin', [unaryOps.asin]],\n ['Asinh', [unaryOps.asinh]],\n ['Atan', [unaryOps.atan]],\n ['Atanh', [unaryOps.atanh]],\n ['Attention', [attention]],\n // TODO: support new attributes for AveragePool-10\n ['AveragePool', [pool.averagePool, pool.parseAveragePoolAttributes]],\n ['BatchNormalization', [batchNorm]],\n ['BiasAdd', [biasAdd]],\n ['BiasSplitGelu', [biasSplitGelu]],\n ['Cast', [unaryOps.cast, unaryOps.parseCastAttributes]],\n ['Ceil', [unaryOps.ceil]],\n ['Clip', [unaryOps.clip]],\n ['Concat', [concat, parseConcatAttributes]],\n ['Conv', [conv, parseConvAttributes]],\n ['ConvTranspose', [convTranspose, parseConvTransposeAttributes]],\n ['Cos', [unaryOps.cos]],\n ['Cosh', [unaryOps.cosh]],\n ['CumSum', [cumsum, parseCumSumAttributes]],\n ['DepthToSpace', [depthToSpace, parseDepthToSpaceAttributes]],\n ['Div', [binaryOps.div]],\n ['Einsum', [einsum, parseEinsumAttributes]],\n ['Elu', [unaryOps.elu, unaryOps.parseAlphaAttributes]],\n ['Equal', [binaryOps.equal]],\n ['Erf', [unaryOps.erf]],\n ['Exp', [unaryOps.exp]],\n ['Expand', [expand]],\n ['FastGelu', [fastGelu]],\n ['Floor', [unaryOps.floor]],\n ['FusedConv', [conv, parseConvAttributes]],\n ['Gather', [gather, parseGatherAttributes]],\n ['GatherElements', [gatherElements, parseGatherElementsAttributes]],\n ['Gelu', [unaryOps.gelu]],\n ['Gemm', [gemm, parseGemmAttributes]],\n ['GlobalAveragePool', [pool.globalAveragePool, pool.parseGlobalAveragePoolAttributes]],\n ['GlobalMaxPool', [pool.globalMaxPool, pool.parseGlobalMaxPoolAttributes]],\n ['Greater', [binaryOps.greater]],\n ['GreaterOrEqual', [binaryOps.greaterOrEqual]],\n ['GroupQueryAttention', [groupQueryAttention, parseGroupQueryAttentionAttributes]],\n ['HardSigmoid', [unaryOps.hardSigmoid, unaryOps.parseHardSigmoidAttributes]],\n ['InstanceNormalization', [instanceNorm]],\n ['LayerNormalization', [layerNorm]],\n ['LeakyRelu', [unaryOps.leakyRelu, unaryOps.parseAlphaAttributes]],\n ['Less', [binaryOps.less]],\n ['LessOrEqual', [binaryOps.lessOrEqual]],\n ['Log', [unaryOps.log]],\n ['MatMul', [matMul]],\n ['MatMulNBits', [matMulNBits, parseMatMulNBitsAttributes]],\n // TODO: support new attributes for MaxPool-8 and MaxPool-10\n ['MaxPool', [pool.maxPool, pool.parseMaxPoolAttributes]],\n ['Mul', [binaryOps.mul]],\n ['MultiHeadAttention', [multiHeadAttention, parseMultiHeadAttentionAttributes]],\n ['Neg', [unaryOps.neg]],\n ['Not', [unaryOps.not]],\n ['Pad', [pad]],\n ['Pow', [binaryOps.pow]],\n ['QuickGelu', [unaryOps.quickgelu, unaryOps.parseAlphaAttributes]],\n ['Range', [range]],\n ['Reciprocal', [unaryOps.reciprocal]],\n ['ReduceMin', [reduceMin]],\n ['ReduceMean', [reduceMean]],\n ['ReduceMax', [reduceMax]],\n ['ReduceSum', [reduceSum]],\n ['ReduceProd', [reduceProd]],\n ['ReduceL1', [reduceL1]],\n ['ReduceL2', [reduceL2]],\n ['ReduceLogSum', [reduceLogSum]],\n ['ReduceLogSumExp', [reduceLogSumExp]],\n ['ReduceSumSquare', [reduceSumSquare]],\n ['Relu', [unaryOps.relu]],\n ['Resize', [resize, parseResizeAttributes]],\n ['RotaryEmbedding', [rotaryEmbedding]],\n ['Sigmoid', [unaryOps.sigmoid]],\n ['Sin', [unaryOps.sin]],\n ['Sinh', [unaryOps.sinh]],\n ['Slice', [slice, parseSliceAttributes]],\n ['SkipLayerNormalization', [skipLayerNorm]],\n ['Split', [split, parseSplitAttributes]],\n ['Sqrt', [unaryOps.sqrt]],\n ['Softmax', [softmax, parseSoftmaxAttributes]],\n ['Sub', [binaryOps.sub]],\n ['Tan', [unaryOps.tan]],\n ['Tanh', [unaryOps.tanh]],\n ['ThresholdedRelu', [unaryOps.thresholdedRelu, unaryOps.parseAlphaAttributes]],\n ['Tile', [tile]],\n ['Transpose', [transpose, parseTransposeAttributes]],\n ['Where', [where]],\n]);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TRACE_FUNC_BEGIN, TRACE_FUNC_END} from 'onnxruntime-common';\n\nimport {WebGpuBackend} from '../backend-webgpu';\nimport {LOG_DEBUG} from '../log';\n\nimport {createShaderHelper} from './ops/common';\nimport {Artifact, GpuData, ProgramInfo} from './types';\n\n/**\n * ProgramManager is the main class behind running computations\n * It builds ProgramInfo's into Artifacts\n * It compiles given ProgramInfo's into WebGL Prorams (cached as Artifacts)\n * Uses the artifact to run the computation by calling Draw on\n * the WebGL drawing buffer\n * ProgramManager automatically maps (binds) input variables to their\n * corresponding Location's in the binary program\n */\nexport class ProgramManager {\n repo: Map; // this should be per-session object\n attributesBound: boolean;\n\n constructor(private backend: WebGpuBackend) {\n this.repo = new Map();\n this.attributesBound = false;\n }\n getArtifact(key: unknown): Artifact|undefined {\n return this.repo.get(key);\n }\n setArtifact(key: unknown, artifact: Artifact): void {\n this.repo.set(key, artifact);\n }\n run(buildArtifact: Artifact, inputs: GpuData[], outputs: GpuData[], dispatchGroup: [number, number, number],\n uniformBufferBinding: GPUBindingResource|undefined): void {\n TRACE_FUNC_BEGIN(buildArtifact.programInfo.name);\n const device = this.backend.device;\n const computePassEncoder = this.backend.getComputePassEncoder();\n this.backend.writeTimestamp(this.backend.pendingDispatchNumber * 2);\n const entries = [];\n for (const input of inputs) {\n entries.push({binding: entries.length, resource: {buffer: input.buffer}});\n }\n for (const output of outputs) {\n entries.push({binding: entries.length, resource: {buffer: output.buffer}});\n }\n if (uniformBufferBinding) {\n entries.push({binding: entries.length, resource: uniformBufferBinding});\n }\n const bindGroup = device.createBindGroup(\n {layout: buildArtifact.computePipeline.getBindGroupLayout(0), entries, label: buildArtifact.programInfo.name});\n\n if (this.backend.sessionStatus === 'capturing') {\n const commandInfo = {\n kernelId: this.backend.currentKernelId!,\n computePipeline: buildArtifact.computePipeline,\n bindGroup,\n dispatchGroup\n };\n const sessionCommandList = this.backend.capturedCommandList.get(this.backend.currentSessionId!);\n sessionCommandList!.push(commandInfo);\n }\n\n computePassEncoder.setPipeline(buildArtifact.computePipeline);\n computePassEncoder.setBindGroup(0, bindGroup);\n computePassEncoder.dispatchWorkgroups(...dispatchGroup);\n this.backend.writeTimestamp(this.backend.pendingDispatchNumber * 2 + 1);\n this.backend.pendingDispatchNumber++;\n\n if (this.backend.pendingDispatchNumber >= this.backend.maxDispatchNumber ||\n this.backend.queryType === 'at-passes') {\n this.backend.endComputePass();\n }\n if (this.backend.pendingDispatchNumber >= this.backend.maxDispatchNumber) {\n this.backend.flush();\n }\n TRACE_FUNC_END(buildArtifact.programInfo.name);\n }\n dispose(): void {\n // this.repo.forEach(a => this.glContext.deleteProgram(a.program));\n }\n build(programInfo: ProgramInfo, normalizedDispatchGroupSize: [number, number, number]): Artifact {\n TRACE_FUNC_BEGIN(programInfo.name);\n const device = this.backend.device;\n const extensions: string[] = [];\n if (device.features.has('shader-f16')) {\n extensions.push('enable f16;');\n }\n const shaderHelper = createShaderHelper(normalizedDispatchGroupSize, this.backend.device.limits);\n const userCode = programInfo.getShaderSource(shaderHelper);\n const code = `${extensions.join('\\n')}\\n${shaderHelper.additionalImplementations}\\n${userCode}`;\n const shaderModule = device.createShaderModule({code, label: programInfo.name});\n LOG_DEBUG('verbose', () => `[WebGPU] ${programInfo.name} shader code: ${code}`);\n\n const computePipeline = device.createComputePipeline(\n {compute: {module: shaderModule, entryPoint: 'main'}, layout: 'auto', label: programInfo.name});\n\n TRACE_FUNC_END(programInfo.name);\n return {programInfo, computePipeline, uniformVariablesInfo: shaderHelper.variablesInfo};\n }\n\n normalizeDispatchGroupSize(dispatchGroup: ReturnType['dispatchGroup']):\n [number, number, number] {\n const x = typeof dispatchGroup === 'number' ? dispatchGroup : dispatchGroup.x;\n const y = typeof dispatchGroup === 'number' ? 1 : (dispatchGroup.y || 1);\n const z = typeof dispatchGroup === 'number' ? 1 : (dispatchGroup.z || 1);\n const limitPerDimension = this.backend.device.limits.maxComputeWorkgroupsPerDimension;\n if (x <= limitPerDimension && y <= limitPerDimension && z <= limitPerDimension) {\n return [x, y, z];\n }\n const size = x * y * z;\n let dispatchAverage = Math.ceil(Math.sqrt(size));\n if (dispatchAverage > limitPerDimension) {\n dispatchAverage = Math.ceil(Math.cbrt(size));\n if (dispatchAverage > limitPerDimension) {\n throw new Error('Total dispatch size exceeds WebGPU maximum.');\n }\n return [dispatchAverage, dispatchAverage, dispatchAverage];\n } else {\n return [dispatchAverage, dispatchAverage, 1];\n }\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env, Tensor, TRACE, TRACE_FUNC_BEGIN, TRACE_FUNC_END} from 'onnxruntime-common';\n\nimport {DataType, tensorDataTypeEnumToString} from '../wasm-common';\n\nimport {configureLogger, LOG_DEBUG} from './log';\nimport {createView, TensorView} from './tensor-view';\nimport {createGpuDataManager, downloadGpuData, GpuDataManager} from './webgpu/gpu-data-manager';\nimport {RunFunction, WEBGPU_OP_RESOLVE_RULES} from './webgpu/op-resolve-rules';\nimport {ProgramManager} from './webgpu/program-manager';\nimport {AdapterInfo, ComputeContext, GpuArchitecture, GpuData, GpuVendor, ProgramInfo, ProgramInputTensorInfoDependency, SessionState, TimestampQuery} from './webgpu/types';\n\ninterface CommandInfo {\n readonly kernelId: number;\n readonly computePipeline: GPUComputePipeline;\n readonly bindGroup: GPUBindGroup;\n readonly dispatchGroup: [number, number, number];\n}\n\ninterface KernelInfo {\n readonly kernelType: string;\n readonly kernelName: string;\n readonly kernelEntry: RunFunction;\n readonly attributes: [((attribute: unknown) => unknown)|undefined, unknown];\n}\n\ninterface PendingKernelInfo {\n readonly kernelId: number;\n readonly programName: string;\n readonly inputTensorViews: readonly TensorView[];\n readonly outputTensorViews: readonly TensorView[];\n}\n\nconst getProgramInputTensorInfoDependencyKey =\n (inputTensors: readonly TensorView[], inputDependencies: readonly ProgramInputTensorInfoDependency[]): string => {\n if (inputDependencies.length !== inputTensors.length) {\n throw new Error(`inputDependencies length ${inputDependencies.length} is not equal to inputTensors length ${\n inputTensors.length}.`);\n }\n\n const inputInfos: string[] = [];\n for (let i = 0; i < inputTensors.length; ++i) {\n const type = inputTensors[i].dataType;\n switch (inputDependencies[i]) {\n case 'none': {\n inputInfos.push('');\n break;\n }\n case 'type': {\n inputInfos.push(`${type}`);\n break;\n }\n case 'rank': {\n const rank = inputTensors[i].dims.length;\n inputInfos.push(`${type};${rank}`);\n break;\n }\n case 'dims': {\n const dims = inputTensors[i].dims.join(',');\n inputInfos.push(`${type};${dims}`);\n break;\n }\n default:\n throw new Error(`unsupported input dependency: ${inputDependencies[i]}`);\n }\n }\n\n return inputInfos.join('|');\n };\n\n/**\n * get a unique key representing the program from the program info, input shapes and types.\n *\n * @returns a unique key is a shorter string than the shader source, which contains all the information to identify a\n * program. if the key is the same, the program shader source should be the same, so we can reuse the program.\n *\n */\nconst getProgramInfoUniqueKey =\n (programInfo: ProgramInfo, inputTensors: readonly TensorView[], is1DimensionDispatch: boolean): string => {\n // final key format:\n // []:is1DimensionDispatch:||...\n let key = programInfo.name;\n if (programInfo.shaderCache?.hint) {\n key += '[' + programInfo.shaderCache.hint + ']';\n }\n key += ':' + is1DimensionDispatch +\n `:${\n getProgramInputTensorInfoDependencyKey(\n inputTensors,\n programInfo.shaderCache?.inputDependencies ??\n new Array(inputTensors.length).fill('dims'))}`;\n return key;\n };\n\nclass AdapterInfoImpl implements AdapterInfo {\n readonly architecture?: string;\n readonly vendor?: string;\n\n constructor(adapterInfo: GPUAdapterInfo) {\n if (adapterInfo) {\n this.architecture = adapterInfo.architecture;\n this.vendor = adapterInfo.vendor;\n }\n }\n\n isArchitecture(architecture: GpuArchitecture): boolean {\n return this.architecture === architecture;\n }\n\n isVendor(vendor: GpuVendor): boolean {\n return this.vendor === vendor;\n }\n}\n\n/**\n * this class is designed to store status and being used as a singleton for JSEP. It will be passed to jsepInit() as\n * the first parameter so that it is stored for future use.\n */\nexport class WebGpuBackend {\n adapterInfo: AdapterInfoImpl;\n device: GPUDevice;\n /**\n * an instance of GpuDataManager to manage a GpuDataId -> GpuBuffer mapping\n */\n gpuDataManager: GpuDataManager;\n /**\n * an instance of ProgramManager to build and run WebGPU compute shader program, and manage a ProgramKey -> Program\n * artifacts mapping\n */\n programManager: ProgramManager;\n\n /**\n * representing the session ID of which is currently being run.\n * `null` means no session is being run.\n * only valid when session.run is executed.\n */\n currentSessionId: number|null = null;\n\n /**\n * representing the kernel ID of which is currently being computed (CPU code perspective).\n * `null` means no kernel is being computed.\n * only one kernel can be computed at a moment.\n */\n currentKernelId: number|null = null;\n /**\n * a list of temporary GPU data for the current kernel. should release when the kernel done computation.\n */\n private temporaryData: GpuData[];\n /**\n * a KernelID -> a GPU data list, which stores persistent GPU data owned by the specific kernel.\n */\n private kernelPersistentData: Map;\n /**\n * a KernelID -> a custom data, which stores custom data owned by the specific kernel.\n */\n private kernelCustomData: Map;\n /**\n * get the custom data of the current kernel\n */\n get currentKernelCustomData(): {[key: string]: unknown} {\n if (this.currentKernelId === null) {\n throw new Error('currentKernelCustomData(): currentKernelId is null. (should not happen)');\n }\n\n let data = this.kernelCustomData.get(this.currentKernelId);\n if (!data) {\n data = {};\n this.kernelCustomData.set(this.currentKernelId, data);\n }\n\n return data;\n }\n\n // KernelID -> kernelInfo mapping\n kernels: Map;\n private commandEncoder: GPUCommandEncoder|null = null;\n private computePassEncoder: GPUComputePassEncoder|null = null;\n maxDispatchNumber = 16;\n pendingDispatchNumber = 0;\n\n // info of kernels pending submission for a single batch\n private pendingKernels: PendingKernelInfo[] = [];\n // queryReadBuffer -> pendingKernels mapping for all the batches\n private pendingQueries: Map = new Map();\n private queryResolveBuffer?: GPUBuffer;\n private querySet?: GPUQuerySet;\n private queryTimeBase?: bigint;\n queryType: TimestampQuery;\n\n env: Env;\n sessionStatus: SessionState = 'default';\n /**\n * a SessionID -> CommandInfo[] mapping. It's used to record all GPU commands for corresponding session.\n */\n capturedCommandList: Map = new Map();\n\n /**\n * a SessionID -> PendingKernelInfo[] mapping for profiling.\n */\n private capturedPendingKernels: Map = new Map();\n\n /**\n * a SessionID -> a Map of (InputOutputIndex -> [ID, GPUBuffer]) mapping.\n */\n sessionExternalDataMapping: Map> = new Map();\n\n async initialize(env: Env, adapter: GPUAdapter): Promise {\n this.env = env;\n const requiredFeatures: GPUFeatureName[] = [];\n const deviceDescriptor: GPUDeviceDescriptor = {\n requiredLimits: {\n maxComputeWorkgroupStorageSize: adapter.limits.maxComputeWorkgroupStorageSize,\n maxComputeWorkgroupsPerDimension: adapter.limits.maxComputeWorkgroupsPerDimension,\n maxStorageBufferBindingSize: adapter.limits.maxStorageBufferBindingSize,\n maxBufferSize: adapter.limits.maxBufferSize,\n maxComputeInvocationsPerWorkgroup: adapter.limits.maxComputeInvocationsPerWorkgroup,\n maxComputeWorkgroupSizeX: adapter.limits.maxComputeWorkgroupSizeX,\n maxComputeWorkgroupSizeY: adapter.limits.maxComputeWorkgroupSizeY,\n maxComputeWorkgroupSizeZ: adapter.limits.maxComputeWorkgroupSizeZ,\n },\n requiredFeatures,\n };\n\n if (adapter.features.has('chromium-experimental-timestamp-query-inside-passes')) {\n requiredFeatures.push('chromium-experimental-timestamp-query-inside-passes' as GPUFeatureName);\n } else if (adapter.features.has('timestamp-query')) {\n requiredFeatures.push('timestamp-query');\n }\n if (adapter.features.has('shader-f16')) {\n requiredFeatures.push('shader-f16');\n }\n\n this.device = await adapter.requestDevice(deviceDescriptor);\n this.adapterInfo = new AdapterInfoImpl(adapter.info || await adapter.requestAdapterInfo());\n this.gpuDataManager = createGpuDataManager(this);\n this.programManager = new ProgramManager(this);\n this.kernels = new Map();\n this.kernelPersistentData = new Map();\n this.kernelCustomData = new Map();\n\n // set up flags for logger\n configureLogger(env.logLevel!, !!env.debug);\n\n // TODO: set up flags\n\n this.device.onuncapturederror = ev => {\n if (ev.error instanceof GPUValidationError) {\n // eslint-disable-next-line no-console\n console.error(`An uncaught WebGPU validation error was raised: ${ev.error.message}`);\n }\n };\n\n Object.defineProperty(\n this.env.webgpu, 'device', {value: this.device, writable: false, enumerable: true, configurable: false});\n Object.defineProperty(\n this.env.webgpu, 'adapter', {value: adapter, writable: false, enumerable: true, configurable: false});\n\n // init queryType, which is necessary for InferenceSession.create\n this.setQueryType();\n }\n\n dispose(): void {\n if (typeof this.querySet !== 'undefined') {\n this.querySet.destroy();\n }\n this.gpuDataManager.dispose();\n }\n\n getCommandEncoder(): GPUCommandEncoder {\n if (!this.commandEncoder) {\n this.commandEncoder = this.device.createCommandEncoder();\n }\n return this.commandEncoder;\n }\n\n getComputePassEncoder(): GPUComputePassEncoder {\n if (!this.computePassEncoder) {\n const commandEncoder = this.getCommandEncoder();\n const computePassDescriptor: GPUComputePassDescriptor = {};\n\n if (this.queryType === 'at-passes') {\n computePassDescriptor.timestampWrites = {\n querySet: this.querySet!,\n beginningOfPassWriteIndex: this.pendingDispatchNumber * 2,\n endOfPassWriteIndex: this.pendingDispatchNumber * 2 + 1,\n };\n }\n\n this.computePassEncoder = commandEncoder.beginComputePass(computePassDescriptor);\n }\n return this.computePassEncoder;\n }\n\n endComputePass(): void {\n if (this.computePassEncoder) {\n this.computePassEncoder.end();\n this.computePassEncoder = null;\n }\n }\n\n flush(): void {\n if (!this.commandEncoder) {\n return;\n }\n\n TRACE_FUNC_BEGIN();\n\n this.endComputePass();\n let queryReadBuffer: GPUBuffer;\n if (this.queryType !== 'none') {\n this.commandEncoder.resolveQuerySet(\n this.querySet!, 0, this.pendingDispatchNumber * 2, this.queryResolveBuffer!, 0);\n\n queryReadBuffer = this.device.createBuffer(\n // eslint-disable-next-line no-bitwise\n {size: this.pendingDispatchNumber * 2 * 8, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST});\n\n this.pendingQueries.set(queryReadBuffer, this.pendingKernels);\n this.pendingKernels = [];\n this.commandEncoder.copyBufferToBuffer(\n this.queryResolveBuffer!, 0, queryReadBuffer, 0, this.pendingDispatchNumber * 2 * 8);\n }\n\n this.device.queue.submit([this.commandEncoder.finish()]);\n this.gpuDataManager.refreshPendingBuffers();\n this.commandEncoder = null;\n this.pendingDispatchNumber = 0;\n\n if (this.queryType !== 'none') {\n void queryReadBuffer!.mapAsync(GPUMapMode.READ).then(() => {\n const mappedData = new BigUint64Array(queryReadBuffer.getMappedRange());\n const pendingKernels = this.pendingQueries.get(queryReadBuffer)!;\n for (let i = 0; i < mappedData.length / 2; i++) {\n const pendingKernelInfo = pendingKernels[i];\n const kernelId = pendingKernelInfo.kernelId;\n const kernelInfo = this.kernels.get(kernelId)!;\n const kernelType = kernelInfo.kernelType;\n const kernelName = kernelInfo.kernelName;\n const programName = pendingKernelInfo.programName;\n const inputTensorViews = pendingKernelInfo.inputTensorViews;\n const outputTensorViews = pendingKernelInfo.outputTensorViews;\n const startTimeU64 = mappedData[i * 2];\n const endTimeU64 = mappedData[i * 2 + 1];\n\n if (typeof this.queryTimeBase === 'undefined') {\n this.queryTimeBase = startTimeU64;\n }\n\n const startTime = Number(startTimeU64 - this.queryTimeBase);\n const endTime = Number(endTimeU64 - this.queryTimeBase);\n\n if (!Number.isSafeInteger(startTime) || !Number.isSafeInteger(endTime)) {\n throw new RangeError('incorrect timestamp range');\n }\n\n if (this.env.webgpu.profiling?.ondata) {\n this.env.webgpu.profiling.ondata({\n version: 1,\n inputsMetadata: inputTensorViews.map(\n value => ({dims: value.dims, dataType: tensorDataTypeEnumToString(value.dataType)})),\n outputsMetadata: outputTensorViews.map(\n value => ({dims: value.dims, dataType: tensorDataTypeEnumToString(value.dataType)})),\n kernelId,\n kernelType,\n kernelName,\n programName,\n startTime,\n endTime,\n });\n } else {\n // if no callback is provided, print the profiling message to console\n let inputShapes = '';\n inputTensorViews.forEach((value, i) => {\n inputShapes += `input[${i}]: [${value.dims}] | ${tensorDataTypeEnumToString(value.dataType)}, `;\n });\n let outputShapes = '';\n outputTensorViews.forEach((value, i) => {\n outputShapes += `output[${i}]: [${value.dims}] | ${tensorDataTypeEnumToString(value.dataType)}, `;\n });\n // eslint-disable-next-line no-console\n console.log(`[profiling] kernel \"${kernelId}|${kernelType}|${kernelName}|${programName}\" ${inputShapes}${\n outputShapes}execution time: ${endTime - startTime} ns`);\n }\n TRACE('GPU', `${programName}::${startTimeU64}::${endTimeU64}`);\n }\n queryReadBuffer.unmap();\n this.pendingQueries.delete(queryReadBuffer);\n });\n }\n TRACE_FUNC_END();\n }\n\n /**\n * run a WebGPU program.\n * @param program a ProgramInfo instance\n * @param inputTensorViews a TensorView array. each element represents a value already exists in GPU.\n * @param outputIndices an indices array. each element can be either -1 (temporary data), -2 (persistent data) or an\n * index to the kernel's output.\n * @param createKernelOutput a callback function that create a value to kernel's output with the given index\n * @param createIntermediateOutput a callback function that create a value as a intermediate value, either temporary\n * or persistent (owned by the current kernel)\n * @returns a TensorView array representing the result.\n */\n run(program: ProgramInfo, inputTensorViews: readonly TensorView[], outputIndices: readonly number[],\n createKernelOutput: (index: number, dataType: number, dims: readonly number[]) => TensorView,\n createIntermediateOutput: (dataType: number, dims: readonly number[]) => TensorView,\n outputCount: number): TensorView[] {\n TRACE_FUNC_BEGIN(program.name);\n // create info for inputs\n const inputDatas: GpuData[] = [];\n for (let i = 0; i < inputTensorViews.length; ++i) {\n const data = inputTensorViews[i].data;\n // if tensor view data is 0, it means the output is zero-sized tensor, and there is no GPU data for it.\n if (data === 0) {\n continue;\n }\n const gpuData = this.gpuDataManager.get(data);\n if (!gpuData) {\n throw new Error(`no GPU data for input: ${data}`);\n }\n inputDatas.push(gpuData);\n }\n\n const {outputs, dispatchGroup, programUniforms} = program.getRunData(inputTensorViews);\n\n // check output indices\n const validatedOutputIndices = outputIndices.length === 0 ? outputs.map((_, i) => i) : outputIndices;\n if (validatedOutputIndices.length !== outputs.length) {\n throw new Error(`Output size ${validatedOutputIndices.length} must be equal to ${outputs.length}.`);\n }\n\n // create info for outputs\n const outputTensorViews: TensorView[] = [];\n const outputDatas: GpuData[] = [];\n for (let i = 0; i < outputs.length; ++i) {\n // value -1 and -2 are used for creating temporary and persistent outputs.\n // value -3 is used for placeholder output. So -3, -2, -1 and 0, 1, 2, ... are valid\n // output indices. see type definition of ComputeContextInputsOutputsMapping for more details.\n if (!Number.isInteger(validatedOutputIndices[i]) || validatedOutputIndices[i] < -3 ||\n validatedOutputIndices[i] >= outputCount) {\n throw new Error(`Invalid output index: ${validatedOutputIndices[i]}`);\n }\n if (validatedOutputIndices[i] === -3) {\n continue;\n }\n const isTemporary = validatedOutputIndices[i] === -1;\n const isPersistent = validatedOutputIndices[i] === -2;\n const tensorView = (isTemporary || isPersistent) ?\n createIntermediateOutput(outputs[i].dataType, outputs[i].dims) :\n createKernelOutput(validatedOutputIndices[i], outputs[i].dataType, outputs[i].dims);\n outputTensorViews.push(tensorView);\n // if tensor view data is 0, it means the output is zero-sized tensor, and there is no GPU data for it.\n if (tensorView.data === 0) {\n continue;\n }\n const gpuData = this.gpuDataManager.get(tensorView.data);\n if (!gpuData) {\n throw new Error(`no GPU data for output: ${tensorView.data}`);\n }\n if (isTemporary) {\n this.temporaryData.push(gpuData);\n }\n if (isPersistent) {\n let persistentData = this.kernelPersistentData.get(this.currentKernelId!);\n if (!persistentData) {\n persistentData = [];\n this.kernelPersistentData.set(this.currentKernelId!, persistentData);\n }\n persistentData.push(gpuData);\n }\n outputDatas.push(gpuData);\n }\n\n // when there are any zero-sized tensor in the inputs or outputs, we should report error unless all outputs are\n // zero-sized tensors.\n if (inputDatas.length !== inputTensorViews.length || outputDatas.length !== outputTensorViews.length) {\n // if all outputs are zero-sized tensors, there is no need to run the program.\n if (outputDatas.length === 0) {\n TRACE_FUNC_END(program.name);\n return outputTensorViews;\n }\n // if some outputs are zero-sized tensors, report an error.\n //\n // TODO: so far we don't see any use case that outputs include both zero-sized tensors and non-zero-sized tensors.\n // If we see such use case, we need to make a change here to support it.\n throw new Error(\n `Program ${program.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`);\n }\n\n // load uniforms\n // TODO: add cache for uniform (is it necessary?)\n //\n let uniformBufferBinding: GPUBindingResource|undefined;\n if (programUniforms) {\n let currentOffset = 0;\n const offsets: number[] = [];\n\n programUniforms.forEach(v => {\n const data = typeof v.data === 'number' ? [v.data] : v.data;\n if (data.length === 0) {\n return;\n }\n // https://www.w3.org/TR/WGSL/#alignof\n const sizeOfElement = v.type === DataType.float16 ? 2 : 4;\n let sizeOfVecOrMat;\n let baseAlignment;\n if (v.type === DataType.float16) {\n baseAlignment = data.length > 4 ? 16 : (data.length > 2 ? 8 : data.length * sizeOfElement);\n sizeOfVecOrMat = data.length > 4 ? 16 : sizeOfElement * data.length;\n } else {\n baseAlignment = data.length <= 2 ? data.length * sizeOfElement : 16;\n sizeOfVecOrMat = 16;\n }\n currentOffset = Math.ceil(currentOffset / baseAlignment) * baseAlignment;\n offsets.push(currentOffset);\n // For non-float16 type, when data.length > 4, the uniform variable is of type array,N>, where\n // N = Math.ceil(data.length / 4) and SizeOf(vec4) = 16. The total byte length is N *\n // SizeOf(vec4). For float16 type, when data.length > 4, the uniform variable is of type\n // array,N>, where N = Math.ceil(data.length / 8) and SizeOf(mat2x4) = 16. The total byte\n // length is N * SizeOf(mat2x4).\n const elementPerVecOrMat = v.type === DataType.float16 ? 8 : 4;\n currentOffset += data.length > 4 ? Math.ceil(data.length / elementPerVecOrMat) * sizeOfVecOrMat :\n data.length * sizeOfElement;\n });\n\n // Meet alignment of struct here: https://www.w3.org/TR/WGSL/#alignment-and-size. For simplicity, set\n // maxAlignmentOfField to 16 since the underlying buffer has been rounded up to 16.\n const maxAlignmentOfField = 16;\n currentOffset = Math.ceil(currentOffset / maxAlignmentOfField) * maxAlignmentOfField;\n const arrayBuffer = new ArrayBuffer(currentOffset);\n programUniforms.forEach((v, i) => {\n const offset = offsets[i];\n const data = typeof v.data === 'number' ? [v.data] : v.data;\n if (v.type === DataType.int32) {\n new Int32Array(arrayBuffer, offset, data.length).set(data);\n } else if (v.type === DataType.uint32) {\n new Uint32Array(arrayBuffer, offset, data.length).set(data);\n } else if (v.type === DataType.float16) {\n // TODO: use Float16Array.\n new Uint16Array(arrayBuffer, offset, data.length).set(data);\n } else if (v.type === DataType.float) {\n new Float32Array(arrayBuffer, offset, data.length).set(data);\n } else {\n throw new Error(`Unsupported uniform type: ${tensorDataTypeEnumToString(v.type)}`);\n }\n });\n\n const uniformBufferData =\n // eslint-disable-next-line no-bitwise\n this.gpuDataManager.create(currentOffset, GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM);\n this.device.queue.writeBuffer(uniformBufferData.buffer, 0, arrayBuffer, 0, currentOffset);\n this.gpuDataManager.release(uniformBufferData.id);\n uniformBufferBinding = {offset: 0, size: currentOffset, buffer: uniformBufferData.buffer};\n }\n\n const normalizedDispatchGroup = this.programManager.normalizeDispatchGroupSize(dispatchGroup);\n const is1DimensionDispatch = normalizedDispatchGroup[1] === 1 && normalizedDispatchGroup[2] === 1;\n // get program info\n const key = getProgramInfoUniqueKey(program, inputTensorViews, is1DimensionDispatch);\n let artifact = this.programManager.getArtifact(key);\n if (!artifact) {\n artifact = this.programManager.build(program, normalizedDispatchGroup);\n this.programManager.setArtifact(key, artifact);\n LOG_DEBUG('info', () => `[artifact] key: ${key}, programName: ${program.name}`);\n }\n\n // validate uniform variables\n if (programUniforms && artifact.uniformVariablesInfo) {\n if (programUniforms.length !== artifact.uniformVariablesInfo.length) {\n throw new Error(`Uniform variables count mismatch: expect ${artifact.uniformVariablesInfo.length}, got ${\n programUniforms.length} in program \"${artifact.programInfo.name}\".`);\n }\n for (let i = 0; i < programUniforms.length; i++) {\n const uniform = programUniforms[i];\n const actualType = uniform.type;\n const actualLength = typeof uniform.data === 'number' ? 1 : uniform.data.length;\n const [type, length] = artifact.uniformVariablesInfo[i];\n if (actualType !== type || actualLength !== length) {\n throw new Error(`Uniform variable ${i} mismatch: expect type ${type} with size ${length}, got type ${\n actualType} with size ${actualLength} in program \"${artifact.programInfo.name}\".`);\n }\n }\n }\n\n LOG_DEBUG(\n 'info',\n () => `[ProgramManager] run \"${program.name}\" (key=${key}) with ${normalizedDispatchGroup[0]}x${\n normalizedDispatchGroup[1]}x${normalizedDispatchGroup[2]}`);\n\n if (this.queryType !== 'none' || this.sessionStatus === 'capturing') {\n const pendingKernelInfo: PendingKernelInfo = {\n kernelId: this.currentKernelId!,\n programName: artifact.programInfo.name,\n inputTensorViews,\n outputTensorViews,\n };\n this.pendingKernels.push(pendingKernelInfo);\n\n if (this.sessionStatus === 'capturing') {\n const sessionPendingKernels = this.capturedPendingKernels.get(this.currentSessionId!);\n sessionPendingKernels!.push(pendingKernelInfo);\n }\n }\n\n this.programManager.run(artifact, inputDatas, outputDatas, normalizedDispatchGroup, uniformBufferBinding);\n\n TRACE_FUNC_END(program.name);\n return outputTensorViews;\n }\n\n upload(gpuDataId: number, data: Uint8Array): void {\n this.gpuDataManager.upload(gpuDataId, data);\n }\n\n memcpy(src: number, dst: number): void {\n this.gpuDataManager.memcpy(src, dst);\n }\n\n async download(gpuDataId: number, getTargetBuffer: () => Uint8Array): Promise {\n // the underlying buffer may be changed after the async function is called. so we use a getter function to make sure\n // the buffer is up-to-date.\n await this.gpuDataManager.download(gpuDataId, getTargetBuffer);\n }\n\n alloc(size: number): number {\n return this.gpuDataManager.create(size).id;\n }\n\n free(ptr: number): number {\n return this.gpuDataManager.release(ptr);\n }\n\n createKernel(kernelType: string, kernelId: number, attribute: unknown, kernelName: string): void {\n const op = WEBGPU_OP_RESOLVE_RULES.get(kernelType);\n if (!op) {\n throw new Error(`kernel not implemented: ${kernelType}`);\n }\n\n const kernelInfo: KernelInfo = {\n kernelType,\n kernelName,\n kernelEntry: op[0],\n attributes: [op[1], attribute],\n };\n this.kernels.set(kernelId, kernelInfo);\n }\n\n releaseKernel(kernelId: number): void {\n const persistentData = this.kernelPersistentData.get(kernelId);\n if (persistentData) {\n for (const data of persistentData) {\n this.gpuDataManager.release(data.id);\n }\n this.kernelPersistentData.delete(kernelId);\n }\n\n this.kernelCustomData.delete(kernelId);\n this.kernels.delete(kernelId);\n }\n\n computeKernel(kernelId: number, context: ComputeContext, errors: Array>): number {\n const kernel = this.kernels.get(kernelId);\n if (!kernel) {\n throw new Error(`kernel not created: ${kernelId}`);\n }\n const kernelType = kernel.kernelType;\n const kernelName = kernel.kernelName;\n const kernelEntry = kernel.kernelEntry;\n const attributes = kernel.attributes;\n if (this.currentKernelId !== null) {\n throw new Error(`kernel \"[${kernelType}] ${kernelName}\" is not allowed to be called recursively`);\n }\n this.currentKernelId = kernelId;\n\n // parse attributes if necessary\n if (attributes[0]) {\n attributes[1] = attributes[0](attributes[1]);\n attributes[0] = undefined;\n }\n\n LOG_DEBUG('info', () => `[WebGPU] Start to run kernel \"[${kernelType}] ${kernelName}\"...`);\n\n const useErrorScope = this.env.debug;\n\n this.temporaryData = [];\n try {\n if (useErrorScope) {\n this.device.pushErrorScope('validation');\n }\n\n kernelEntry(context, attributes[1]);\n return 0; // ORT_OK\n } catch (e) {\n errors.push(Promise.resolve(`[WebGPU] Kernel \"[${kernelType}] ${kernelName}\" failed. ${e}`));\n return 1; // ORT_FAIL\n } finally {\n if (useErrorScope) {\n errors.push(this.device.popErrorScope().then(\n err => err ? `GPU validation error for kernel \"[${kernelType}] ${kernelName}\": ${err.message}` : null));\n }\n\n for (const data of this.temporaryData) {\n this.gpuDataManager.release(data.id);\n }\n this.temporaryData = [];\n this.currentKernelId = null;\n }\n }\n\n // #region external buffer\n registerBuffer(sessionId: number, index: number, buffer: GPUBuffer, size: number): number {\n let sessionInputOutputMapping = this.sessionExternalDataMapping.get(sessionId);\n if (!sessionInputOutputMapping) {\n sessionInputOutputMapping = new Map();\n this.sessionExternalDataMapping.set(sessionId, sessionInputOutputMapping);\n }\n\n const previousBuffer = sessionInputOutputMapping.get(index);\n const id = this.gpuDataManager.registerExternalBuffer(buffer, size, previousBuffer?.[1]);\n sessionInputOutputMapping.set(index, [id, buffer]);\n return id;\n }\n unregisterBuffers(sessionId: number): void {\n const sessionInputOutputMapping = this.sessionExternalDataMapping.get(sessionId);\n if (sessionInputOutputMapping) {\n sessionInputOutputMapping.forEach(bufferInfo => this.gpuDataManager.unregisterExternalBuffer(bufferInfo[1]));\n this.sessionExternalDataMapping.delete(sessionId);\n }\n }\n getBuffer(gpuDataId: number): GPUBuffer {\n const gpuData = this.gpuDataManager.get(gpuDataId);\n if (!gpuData) {\n throw new Error(`no GPU data for buffer: ${gpuDataId}`);\n }\n return gpuData.buffer;\n }\n createDownloader(gpuBuffer: GPUBuffer, size: number, type: Tensor.GpuBufferDataTypes):\n () => Promise {\n return async () => {\n const data = await downloadGpuData(this, gpuBuffer, size);\n return createView(data.buffer, type);\n };\n }\n // #endregion\n writeTimestamp(index: number): void {\n if (this.queryType !== 'inside-passes') {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.computePassEncoder as any).writeTimestamp(this.querySet, index);\n }\n setQueryType(): void {\n this.queryType = 'none';\n if (this.env.webgpu.profiling?.mode === 'default' ||\n (typeof this.env.trace === 'undefined' ? this.env.wasm.trace : this.env.trace)) {\n if (this.device.features.has('chromium-experimental-timestamp-query-inside-passes')) {\n this.queryType = 'inside-passes';\n } else if (this.device.features.has('timestamp-query')) {\n this.queryType = 'at-passes';\n }\n\n if (this.queryType !== 'none' && typeof this.querySet === 'undefined') {\n this.querySet = this.device.createQuerySet({\n type: 'timestamp',\n count: this.maxDispatchNumber * 2,\n });\n this.queryResolveBuffer = this.device.createBuffer(\n // eslint-disable-next-line no-bitwise\n {size: this.maxDispatchNumber * 2 * 8, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE});\n }\n }\n }\n\n captureBegin(): void {\n LOG_DEBUG('info', 'captureBegin');\n if (!this.capturedCommandList.get(this.currentSessionId!)) {\n this.capturedCommandList.set(this.currentSessionId!, []);\n }\n if (!this.capturedPendingKernels.get(this.currentSessionId!)) {\n this.capturedPendingKernels.set(this.currentSessionId!, []);\n }\n // flush the left commands before we change the status.\n this.flush();\n this.sessionStatus = 'capturing';\n }\n captureEnd(): void {\n LOG_DEBUG('info', 'captureEnd');\n // flush the left commands before we change the status.\n this.flush();\n this.sessionStatus = 'default';\n }\n replay(): void {\n LOG_DEBUG('info', 'replay');\n this.sessionStatus = 'replaying';\n const sessionCommandList = this.capturedCommandList.get(this.currentSessionId!);\n const sessionPendingKernels = this.capturedPendingKernels.get(this.currentSessionId!);\n const length = sessionCommandList!.length;\n this.pendingKernels = [];\n for (let i = 0; i < length; i++) {\n const computePassEncoder = this.getComputePassEncoder();\n const command = sessionCommandList![i];\n this.writeTimestamp(this.pendingDispatchNumber * 2);\n computePassEncoder.setPipeline(command.computePipeline);\n computePassEncoder.setBindGroup(0, command.bindGroup);\n computePassEncoder.dispatchWorkgroups(...command.dispatchGroup);\n this.writeTimestamp(this.pendingDispatchNumber * 2 + 1);\n this.pendingDispatchNumber++;\n if (this.queryType !== 'none') {\n this.pendingKernels.push(sessionPendingKernels![i]);\n }\n if (this.pendingDispatchNumber >= this.maxDispatchNumber || this.queryType === 'at-passes') {\n this.endComputePass();\n }\n if (this.pendingDispatchNumber >= this.maxDispatchNumber) {\n this.flush();\n }\n }\n // flush the left commands before we change the status.\n this.flush();\n this.sessionStatus = 'default';\n }\n\n onReleaseSession(sessionId: number): void {\n this.unregisterBuffers(sessionId);\n if (this.capturedCommandList.has(sessionId)) {\n this.capturedCommandList.delete(sessionId);\n }\n if (this.capturedPendingKernels.has(sessionId)) {\n this.capturedPendingKernels.delete(sessionId);\n }\n this.gpuDataManager.onReleaseSession(sessionId);\n }\n\n onRunStart(sessionId: number): void {\n this.currentSessionId = sessionId;\n this.setQueryType();\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from 'onnxruntime-common';\n\nimport type {OrtWasmModule} from '../wasm-types';\nimport {DataType, getTensorElementSize} from '../wasm-common';\n\nimport {WebGpuBackend} from './backend-webgpu';\nimport {LOG_DEBUG} from './log';\nimport {TensorView} from './tensor-view';\nimport {ShapeUtil} from './util';\nimport {AdapterInfo, ComputeContext, ComputeContextInputsOutputsMapping, ProgramInfo} from './webgpu/types';\n\n/* eslint-disable no-bitwise */\n\nclass TensorViewImpl implements TensorView {\n constructor(\n private module: OrtWasmModule, public readonly dataType: number, public readonly data: number,\n public readonly dims: readonly number[]) {}\n\n getFloat32Array(): Float32Array {\n if (this.dataType !== DataType.float) {\n throw new Error('Invalid data type');\n }\n const elementCount = ShapeUtil.size(this.dims);\n return elementCount === 0 ? new Float32Array() :\n new Float32Array(this.module.HEAP8.buffer, this.data, elementCount);\n }\n\n getBigInt64Array(): BigInt64Array {\n if (this.dataType !== DataType.int64) {\n throw new Error('Invalid data type');\n }\n const elementCount = ShapeUtil.size(this.dims);\n return elementCount === 0 ? new BigInt64Array() :\n new BigInt64Array(this.module.HEAP8.buffer, this.data, elementCount);\n }\n\n getInt32Array(): Int32Array {\n if (this.dataType !== DataType.int32) {\n throw new Error('Invalid data type');\n }\n const elementCount = ShapeUtil.size(this.dims);\n return elementCount === 0 ? new Int32Array() : new Int32Array(this.module.HEAP8.buffer, this.data, elementCount);\n }\n\n reshape(newDims: readonly number[]): TensorView {\n if (ShapeUtil.size(newDims) !== ShapeUtil.size(this.dims)) {\n throw new Error('Invalid new shape');\n }\n return new TensorViewImpl(this.module, this.dataType, this.data, newDims);\n }\n}\n\nclass ComputeContextImpl implements ComputeContext {\n readonly adapterInfo: AdapterInfo;\n readonly opKernelContext: number;\n readonly inputs: readonly TensorView[];\n readonly outputCount: number;\n get kernelCustomData(): {[key: string]: unknown} {\n return this.backend.currentKernelCustomData;\n }\n get customDataBuffer(): Uint8Array {\n return this.module.HEAPU8.subarray(this.customDataOffset, this.customDataOffset + this.customDataSize);\n }\n private customDataOffset = 0;\n private customDataSize = 0;\n constructor(private module: OrtWasmModule, private backend: WebGpuBackend, contextDataOffset: number) {\n this.adapterInfo = backend.adapterInfo;\n const heapU32 = module.HEAPU32;\n\n // extract context data\n let dataIndex = (contextDataOffset >>> 2);\n this.opKernelContext = heapU32[dataIndex++];\n const inputCount = heapU32[dataIndex++];\n this.outputCount = heapU32[dataIndex++];\n this.customDataOffset = heapU32[dataIndex++];\n this.customDataSize = heapU32[dataIndex++];\n\n const inputs: TensorView[] = [];\n for (let i = 0; i < inputCount; i++) {\n const dataType = heapU32[dataIndex++];\n const data = heapU32[dataIndex++];\n const dim = heapU32[dataIndex++];\n const dims: number[] = [];\n for (let d = 0; d < dim; d++) {\n dims.push(heapU32[dataIndex++]);\n }\n inputs.push(new TensorViewImpl(module, dataType, data, dims));\n }\n this.inputs = inputs;\n }\n\n getMaxComputeWorkgroupSizes(): [number, number, number] {\n return [\n this.backend.device.limits.maxComputeWorkgroupSizeX, this.backend.device.limits.maxComputeWorkgroupSizeY,\n this.backend.device.limits.maxComputeWorkgroupSizeZ\n ];\n }\n\n getMaxComputeWorkgroupStoragesize(): number {\n return this.backend.device.limits.maxComputeWorkgroupStorageSize;\n }\n\n compute(program: ProgramInfo, inputsOutputsMapping?: ComputeContextInputsOutputsMapping): TensorView[] {\n // prepare inputs. inputs should always be valid data.\n const mappedInputs =\n inputsOutputsMapping?.inputs?.map(i => typeof i === 'number' ? this.inputs[i] : i) ?? this.inputs;\n // prepare outputs.\n const outputIndices = inputsOutputsMapping?.outputs ?? [];\n const createKernelOutput = (index: number, dataType: number, dims: readonly number[]): TensorView =>\n new TensorViewImpl(this.module, dataType, this.output(index, dims), dims);\n const createTemporaryOutput = (dataType: number, dims: readonly number[]): TensorView => {\n const elementSize = getTensorElementSize(dataType);\n if (!elementSize) {\n throw new Error(`Unsupported data type: ${dataType}`);\n }\n const bufferSize = elementSize * ShapeUtil.size(dims);\n const gpuDataId = bufferSize > 0 ? this.backend.gpuDataManager.create(bufferSize).id : 0;\n return new TensorViewImpl(this.module, dataType, gpuDataId, dims);\n };\n return this.backend.run(\n program, mappedInputs, outputIndices, createKernelOutput, createTemporaryOutput, this.outputCount);\n }\n\n output(index: number, dims: readonly number[]): number {\n const stack = this.module.stackSave();\n try {\n const data = this.module.stackAlloc((1 + dims.length) * 4 /* sizeof(size_t) */);\n let offset = data >> 2;\n this.module.HEAPU32[offset++] = dims.length;\n for (let i = 0; i < dims.length; i++) {\n this.module.HEAPU32[offset++] = dims[i];\n }\n return this.module._JsepOutput!(this.opKernelContext, index, data);\n } catch (e) {\n throw new Error(\n `Failed to generate kernel's output[${index}] with dims [${dims}]. ` +\n 'If you are running with pre-allocated output, please make sure the output type/dims are correct. ' +\n `Error: ${e}`);\n } finally {\n this.module.stackRestore(stack);\n }\n }\n}\n\n/**\n * Initialize JSEP with WebGPU backend.\n *\n * This function will be called after the WebAssembly module is loaded and initialized (\"_OrtInit\" is called), once for\n * each of the following EPs if they are specified:\n * - \"webgpu\"\n * - \"webnn\"\n *\n * For WebGPU, this function expects:\n * - WebGPU is enabled in build (BUILD_DEFS.DISABLE_JSEP === false).\n * - WebGPU is available in current environment. (a valid GPUAdapter is passed in)\n *\n * For WebNN, this function expects:\n * - WebNN is enabled in build (BUILD_DEFS.DISABLE_JSEP === false).\n * - WebNN is available in current environment. (navigator.ml is not undefined)\n *\n * If the WebAssembly module is not built with JSEP support, this function will throw an error. This will invalidate\n * 'webgpu'/'webnn' backend.\n *\n * @param name - the name of the EP, either \"webgpu\" or \"webnn\"\n * @param module - the ORT WebAssembly module\n * @param env - the ORT environment variable (ort.env)\n * @param gpuAdapter - the pre-created GPU adapter\n */\nexport const init =\n async(name: 'webgpu'|'webnn', module: OrtWasmModule, env: Env, gpuAdapter?: GPUAdapter): Promise => {\n const jsepInit = module.jsepInit;\n if (!jsepInit) {\n throw new Error('Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.');\n }\n\n if (name === 'webgpu') {\n const backend = new WebGpuBackend();\n await backend.initialize(env, gpuAdapter!);\n\n jsepInit('webgpu', [\n // backend\n backend,\n\n // jsepAlloc()\n (size: number) => backend.alloc(size),\n\n // jsepFree()\n (ptr: number) => backend.free(ptr),\n\n // jsepCopy(src, dst, size, isSourceGpu)\n (src: number, dst: number, size: number, isSourceGpu = false) => {\n if (isSourceGpu) {\n LOG_DEBUG('verbose', () => `[WebGPU] jsepCopyGpuToGpu: src=${src}, dst=${dst}, size=${size}`);\n backend.memcpy(src, dst);\n } else {\n LOG_DEBUG('verbose', () => `[WebGPU] jsepCopyCpuToGpu: dataOffset=${src}, gpuDataId=${dst}, size=${size}`);\n const data = module.HEAPU8.subarray(src >>> 0, (src >>> 0) + size);\n backend.upload(dst, data);\n }\n },\n\n // jsepCopyAsync(src, dst, size)\n async(gpuDataId: number, dataOffset: number, size: number):\n Promise => {\n LOG_DEBUG(\n 'verbose',\n () => `[WebGPU] jsepCopyGpuToCpu: gpuDataId=${gpuDataId}, dataOffset=${dataOffset}, size=${size}`);\n\n await backend.download(\n gpuDataId, () => module.HEAPU8.subarray(dataOffset >>> 0, (dataOffset >>> 0) + size));\n },\n\n // jsepCreateKernel\n (kernelType: string, kernelId: number, attribute: unknown) => backend.createKernel(\n kernelType, kernelId, attribute, module.UTF8ToString(module._JsepGetNodeName!(kernelId))),\n\n // jsepReleaseKernel\n (kernel: number) => backend.releaseKernel(kernel),\n\n // jsepRun\n (kernel: number, contextDataOffset: number, sessionHandle: number, errors: Array>) => {\n LOG_DEBUG(\n 'verbose',\n () => `[WebGPU] jsepRun: sessionHandle=${sessionHandle}, kernel=${kernel}, contextDataOffset=${\n contextDataOffset}`);\n const context = new ComputeContextImpl(module, backend, contextDataOffset);\n return backend.computeKernel(kernel, context, errors);\n },\n // jsepCaptureBegin\n () => backend.captureBegin(),\n // jsepCaptureEnd\n () => backend.captureEnd(),\n // jsepReplay\n () => backend.replay()\n ]);\n } else {\n jsepInit('webnn');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// WebNN API currently does not have a TypeScript definition file. This file is a workaround with types generated from\n// WebNN API specification.\n// https://github.com/webmachinelearning/webnn/issues/677\n/// \n\nimport {Env, InferenceSession, Tensor} from 'onnxruntime-common';\n\nimport {SerializableInternalBuffer, SerializableSessionMetadata, SerializableTensorMetadata, TensorMetadata} from './proxy-messages';\nimport {setRunOptions} from './run-options';\nimport {setSessionOptions} from './session-options';\nimport {dataLocationStringToEnum, getTensorElementSize, isGpuBufferSupportedType, logLevelStringToEnum, tensorDataTypeEnumToString, tensorDataTypeStringToEnum, tensorTypeToTypedArrayConstructor} from './wasm-common';\nimport {getInstance} from './wasm-factory';\nimport {allocWasmString, checkLastError} from './wasm-utils';\nimport {loadFile} from './wasm-utils-load-file';\n\n// #region Initializations\n\n/**\n * There are 4 different \"initialization\" steps for ORT. They happen in different places and different time.\n *\n * 1. JavaScript initialization for onnxruntime-common and onnxruntime-web.\n * This is the first initialization step. In this step, onnxruntime-web calls onnxruntime-common's registerBackend()\n * function multiple times to register all the available backends. The backend registration is very fast. It only\n * registers the backend name with the uninitialized backend object. No heavy initialization is done in this step.\n * Refer to web/lib/index.ts for the backend registration.\n *\n * 2. WebAssembly artifact initialization.\n * This happens when any registered wasm backend is used for the first time (ie. `ort.InferenceSession.create()` or\n * `ort.TrainingSession.create()` is called). In this step, onnxruntime-web does the followings:\n * - create a proxy worker and make sure the proxy worker is ready to receive messages, if proxy is enabled.\n * - perform feature detection, locate correct WebAssembly artifact path and call the Emscripten generated\n * JavaScript code to initialize the WebAssembly runtime.\n * - if proxy is enabled, this step happens in the proxy worker using message 'init-wasm'.\n * - downloading the 'ort-wasm{...}.wasm' file is done in this step.\n * - if multi-thread is enabled, one or more webworker will be created to initialize the PThread threadpool.\n *\n * 3. ORT environment initialization.\n * This happens after step 2. In this step, onnxruntime-web performs ONNX Runtime environment initialization.\n * Function `_OrtInit()` is called in this step.\n * - if proxy is enabled, this step happens in the proxy worker using message 'init-ort'.\n * - logging level (ort.env.logLevel) and thread number (ort.env.wasm.numThreads) are set in this step.\n *\n * 4. Session initialization.\n * This happens when `ort.InferenceSession.create()` or `ort.TrainingSession.create()` is called. Unlike the first 3\n * steps (they only called once), this step will be done for each session. In this step, onnxruntime-web does the\n * followings:\n * If the parameter is a URL:\n * - download the model data from the URL.\n * - copy the model data to the WASM heap. (proxy: 'copy-from')\n * - dereference the model buffer. This step allows the original ArrayBuffer to be garbage collected.\n * - call `_OrtCreateSession()` to create the session. (proxy: 'create')\n *\n * If the parameter is a Uint8Array object:\n * - copy the model data to the WASM heap. (proxy: 'copy-from')\n * - call `_OrtCreateSession()` to create the session. (proxy: 'create')\n *\n *\n */\n\n/**\n * initialize ORT environment.\n *\n * @param numThreads SetGlobalIntraOpNumThreads(numThreads)\n * @param loggingLevel CreateEnv(static_cast(logging_level))\n */\nconst initOrt = (numThreads: number, loggingLevel: number): void => {\n const errorCode = getInstance()._OrtInit(numThreads, loggingLevel);\n if (errorCode !== 0) {\n checkLastError('Can\\'t initialize onnxruntime.');\n }\n};\n\n/**\n * initialize runtime environment.\n * @param env passed in the environment config object.\n */\nexport const initRuntime = async(env: Env): Promise => {\n // init ORT\n initOrt(env.wasm.numThreads!, logLevelStringToEnum(env.logLevel));\n};\n\n/**\n * perform EP specific initialization.\n *\n * @param env\n * @param epName\n */\nexport const initEp = async(env: Env, epName: string): Promise => {\n if (!BUILD_DEFS.DISABLE_JSEP) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires\n const initJsep = require('./jsep/init').init;\n\n if (epName === 'webgpu') {\n // perform WebGPU availability check\n if (typeof navigator === 'undefined' || !navigator.gpu) {\n throw new Error('WebGPU is not supported in current environment');\n }\n\n let adapter = env.webgpu.adapter as GPUAdapter | null;\n if (!adapter) {\n // if adapter is not set, request a new adapter.\n const powerPreference = env.webgpu.powerPreference;\n if (powerPreference !== undefined && powerPreference !== 'low-power' &&\n powerPreference !== 'high-performance') {\n throw new Error(`Invalid powerPreference setting: \"${powerPreference}\"`);\n }\n const forceFallbackAdapter = env.webgpu.forceFallbackAdapter;\n if (forceFallbackAdapter !== undefined && typeof forceFallbackAdapter !== 'boolean') {\n throw new Error(`Invalid forceFallbackAdapter setting: \"${forceFallbackAdapter}\"`);\n }\n adapter = await navigator.gpu.requestAdapter({powerPreference, forceFallbackAdapter});\n if (!adapter) {\n throw new Error(\n 'Failed to get GPU adapter. ' +\n 'You may need to enable flag \"--enable-unsafe-webgpu\" if you are using Chrome.');\n }\n } else {\n // if adapter is set, validate it.\n if (typeof adapter.limits !== 'object' || typeof adapter.features !== 'object' ||\n typeof adapter.requestDevice !== 'function') {\n throw new Error('Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.');\n }\n }\n\n await initJsep('webgpu', getInstance(), env, adapter);\n }\n if (epName === 'webnn') {\n // perform WebNN availability check\n if (typeof navigator === 'undefined' || !(navigator as unknown as {ml: unknown}).ml) {\n throw new Error('WebNN is not supported in current environment');\n }\n\n await initJsep('webnn', getInstance(), env);\n }\n }\n};\n\n// #endregion Initializations\n\n/**\n * valid data locations for input/output tensors.\n */\ntype SupportedTensorDataLocationForInputOutput = 'cpu'|'cpu-pinned'|'gpu-buffer';\n\ntype IOBindingState = {\n /**\n * the handle of IO binding.\n */\n readonly handle: number;\n\n /**\n * the preferred location for each output tensor.\n *\n * value is one of 'cpu', 'cpu-pinned', 'gpu-buffer'.\n */\n readonly outputPreferredLocations: readonly SupportedTensorDataLocationForInputOutput[];\n\n /**\n * enum value of the preferred location for each output tensor.\n */\n readonly outputPreferredLocationsEncoded: readonly number[];\n};\n\n/**\n * tuple elements are: InferenceSession ID; inputNamesUTF8Encoded; outputNamesUTF8Encoded; bindingState\n */\ntype SessionMetadata = [\n inferenceSessionId: number, inputNamesUTF8Encoded: number[], outputNamesUTF8Encoded: number[],\n bindingState: IOBindingState|null, enableGraphCapture: boolean, inputOutputBound: boolean\n];\n\nconst activeSessions = new Map();\n\n/**\n * get the input/output count of the session.\n * @param sessionHandle the handle representing the session. should be non-zero.\n * @returns a tuple including 2 numbers, representing the input count and output count.\n */\nconst getSessionInputOutputCount = (sessionHandle: number): [number, number] => {\n const wasm = getInstance();\n const stack = wasm.stackSave();\n try {\n const dataOffset = wasm.stackAlloc(8);\n const errorCode = wasm._OrtGetInputOutputCount(sessionHandle, dataOffset, dataOffset + 4);\n if (errorCode !== 0) {\n checkLastError('Can\\'t get session input/output count.');\n }\n return [wasm.HEAP32[dataOffset / 4], wasm.HEAP32[dataOffset / 4 + 1]];\n } finally {\n wasm.stackRestore(stack);\n }\n};\n\n/**\n * allocate the memory and memcpy the external buffer.\n *\n * @param model - the external buffer containing the model data. Must not be the same buffer as the WASM heap.\n * @returns a 2-elements tuple - the pointer and size of the allocated buffer\n */\nexport const copyFromExternalBuffer = (model: Uint8Array): [number, number] => {\n const wasm = getInstance();\n const modelDataOffset = wasm._malloc(model.byteLength);\n if (modelDataOffset === 0) {\n throw new Error(`Can't create a session. failed to allocate a buffer of size ${model.byteLength}.`);\n }\n wasm.HEAPU8.set(model, modelDataOffset);\n return [modelDataOffset, model.byteLength];\n};\n\n/**\n * create an inference session from a model data buffer.\n *\n * @param modelData - either a Uint8Array object representing the model data, or a 2-elements tuple containing the\n * pointer and size of the model data buffer.\n * @param options an optional session options object.\n * @returns a 3-elements tuple containing [session handle, input names, output names]\n */\nexport const createSession = async(\n modelData: Uint8Array|SerializableInternalBuffer,\n options?: InferenceSession.SessionOptions): Promise => {\n let modelDataOffset: number, modelDataLength: number;\n const wasm = getInstance();\n\n if (Array.isArray(modelData)) {\n // if model data is an array, it must be a 2-elements tuple containing the pointer and size of the model data\n [modelDataOffset, modelDataLength] = modelData;\n } else if (modelData.buffer === wasm.HEAPU8.buffer) {\n // if model data uses the same buffer as the WASM heap, we don't need to copy it.\n [modelDataOffset, modelDataLength] = [modelData.byteOffset, modelData.byteLength];\n } else {\n // otherwise, copy the model data to the WASM heap.\n [modelDataOffset, modelDataLength] = copyFromExternalBuffer(modelData);\n }\n\n let sessionHandle = 0;\n let sessionOptionsHandle = 0;\n let ioBindingHandle = 0;\n let allocs: number[] = [];\n const inputNamesUTF8Encoded = [];\n const outputNamesUTF8Encoded = [];\n\n try {\n [sessionOptionsHandle, allocs] = setSessionOptions(options);\n\n if (options?.externalData && wasm.mountExternalData) {\n const loadingPromises = [];\n for (const file of options.externalData) {\n const path = typeof file === 'string' ? file : file.path;\n loadingPromises.push(loadFile(typeof file === 'string' ? file : file.data).then(data => {\n wasm.mountExternalData!(path, data);\n }));\n }\n\n // wait for all external data files to be loaded\n await Promise.all(loadingPromises);\n }\n\n for (const provider of options?.executionProviders ?? []) {\n const providerName = typeof provider === 'string' ? provider : provider.name;\n if (providerName === 'webnn') {\n if (wasm.currentContext) {\n throw new Error('WebNN execution provider is already set.');\n }\n if (typeof provider !== 'string') {\n const webnnOptions = provider as InferenceSession.WebNNExecutionProviderOption;\n const context = (webnnOptions as InferenceSession.WebNNOptionsWithMLContext)?.context;\n const gpuDevice = (webnnOptions as InferenceSession.WebNNOptionsWebGpu)?.gpuDevice;\n const deviceType = (webnnOptions as InferenceSession.WebNNContextOptions)?.deviceType;\n const numThreads = (webnnOptions as InferenceSession.WebNNContextOptions)?.numThreads;\n const powerPreference = (webnnOptions as InferenceSession.WebNNContextOptions)?.powerPreference;\n if (context) {\n wasm.currentContext = context as MLContext;\n } else if (gpuDevice) {\n wasm.currentContext = await navigator.ml.createContext(gpuDevice);\n } else {\n wasm.currentContext = await navigator.ml.createContext({deviceType, numThreads, powerPreference});\n }\n } else {\n wasm.currentContext = await navigator.ml.createContext();\n }\n break;\n }\n }\n\n sessionHandle = await wasm._OrtCreateSession(modelDataOffset, modelDataLength, sessionOptionsHandle);\n if (sessionHandle === 0) {\n checkLastError('Can\\'t create a session.');\n }\n\n // clear current MLContext after session creation\n if (wasm.currentContext) {\n wasm.currentContext = undefined;\n }\n\n const [inputCount, outputCount] = getSessionInputOutputCount(sessionHandle);\n\n const enableGraphCapture = !!options?.enableGraphCapture;\n\n const inputNames = [];\n const outputNames = [];\n const outputPreferredLocations: SupportedTensorDataLocationForInputOutput[] = [];\n for (let i = 0; i < inputCount; i++) {\n const name = wasm._OrtGetInputName(sessionHandle, i);\n if (name === 0) {\n checkLastError('Can\\'t get an input name.');\n }\n inputNamesUTF8Encoded.push(name);\n inputNames.push(wasm.UTF8ToString(name));\n }\n for (let i = 0; i < outputCount; i++) {\n const name = wasm._OrtGetOutputName(sessionHandle, i);\n if (name === 0) {\n checkLastError('Can\\'t get an output name.');\n }\n outputNamesUTF8Encoded.push(name);\n const nameString = wasm.UTF8ToString(name);\n outputNames.push(nameString);\n\n if (!BUILD_DEFS.DISABLE_JSEP) {\n if (enableGraphCapture && options?.preferredOutputLocation === undefined) {\n outputPreferredLocations.push('gpu-buffer');\n continue;\n }\n const location = typeof options?.preferredOutputLocation === 'string' ?\n options.preferredOutputLocation :\n options?.preferredOutputLocation?.[nameString] ?? 'cpu';\n if (location !== 'cpu' && location !== 'cpu-pinned' && location !== 'gpu-buffer') {\n throw new Error(`Not supported preferred output location: ${location}.`);\n }\n if (enableGraphCapture && location !== 'gpu-buffer') {\n throw new Error(`Not supported preferred output location: ${\n location}. Only 'gpu-buffer' location is supported when enableGraphCapture is true.`);\n }\n outputPreferredLocations.push(location);\n }\n }\n\n // use IO binding only when at least one output is preffered to be on GPU.\n let bindingState: IOBindingState|null = null;\n if (!BUILD_DEFS.DISABLE_JSEP && outputPreferredLocations.some(l => l === 'gpu-buffer')) {\n ioBindingHandle = wasm._OrtCreateBinding(sessionHandle);\n if (ioBindingHandle === 0) {\n checkLastError('Can\\'t create IO binding.');\n }\n\n bindingState = {\n handle: ioBindingHandle,\n outputPreferredLocations,\n outputPreferredLocationsEncoded: outputPreferredLocations.map(l => dataLocationStringToEnum(l)),\n };\n }\n\n activeSessions.set(\n sessionHandle,\n [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, bindingState, enableGraphCapture, false]);\n return [sessionHandle, inputNames, outputNames];\n } catch (e) {\n inputNamesUTF8Encoded.forEach(buf => wasm._OrtFree(buf));\n outputNamesUTF8Encoded.forEach(buf => wasm._OrtFree(buf));\n\n if (ioBindingHandle !== 0) {\n wasm._OrtReleaseBinding(ioBindingHandle);\n }\n\n if (sessionHandle !== 0) {\n wasm._OrtReleaseSession(sessionHandle);\n }\n throw e;\n } finally {\n wasm._free(modelDataOffset);\n if (sessionOptionsHandle !== 0) {\n wasm._OrtReleaseSessionOptions(sessionOptionsHandle);\n }\n allocs.forEach(alloc => wasm._free(alloc));\n\n // unmount external data if necessary\n wasm.unmountExternalData?.();\n }\n};\n\nexport const releaseSession = (sessionId: number): void => {\n const wasm = getInstance();\n const session = activeSessions.get(sessionId);\n if (!session) {\n throw new Error(`cannot release session. invalid session id: ${sessionId}`);\n }\n const [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, ioBindingState, enableGraphCapture] = session;\n\n if (ioBindingState) {\n if (enableGraphCapture) {\n wasm._OrtClearBoundOutputs(ioBindingState.handle);\n }\n wasm._OrtReleaseBinding(ioBindingState.handle);\n }\n\n wasm.jsepOnReleaseSession?.(sessionId);\n\n inputNamesUTF8Encoded.forEach(buf => wasm._OrtFree(buf));\n outputNamesUTF8Encoded.forEach(buf => wasm._OrtFree(buf));\n wasm._OrtReleaseSession(sessionHandle);\n activeSessions.delete(sessionId);\n};\n\nexport const prepareInputOutputTensor =\n (tensor: TensorMetadata|null, tensorHandles: number[], allocs: number[], sessionId: number, index: number,\n enableGraphCapture = false): void => {\n if (!tensor) {\n tensorHandles.push(0);\n return;\n }\n\n const wasm = getInstance();\n\n const dataType = tensor[0];\n const dims = tensor[1];\n const location = tensor[3];\n\n let rawData: number;\n let dataByteLength: number;\n\n if (dataType === 'string' && location === 'gpu-buffer') {\n throw new Error('String tensor is not supported on GPU.');\n }\n\n if (enableGraphCapture && location !== 'gpu-buffer') {\n throw new Error(\n `External buffer must be provided for input/output index ${index} when enableGraphCapture is true.`);\n }\n\n if (location === 'gpu-buffer') {\n const gpuBuffer = tensor[2].gpuBuffer as GPUBuffer;\n const elementSizeInBytes = getTensorElementSize(tensorDataTypeStringToEnum(dataType))!;\n dataByteLength = dims.reduce((a, b) => a * b, 1) * elementSizeInBytes;\n\n const registerBuffer = wasm.jsepRegisterBuffer;\n if (!registerBuffer) {\n throw new Error('Tensor location \"gpu-buffer\" is not supported without using WebGPU.');\n }\n rawData = registerBuffer(sessionId, index, gpuBuffer, dataByteLength);\n } else {\n const data = tensor[2];\n\n if (Array.isArray(data)) {\n // string tensor\n dataByteLength = 4 * data.length;\n rawData = wasm._malloc(dataByteLength);\n allocs.push(rawData);\n let dataIndex = rawData / 4;\n for (let i = 0; i < data.length; i++) {\n if (typeof data[i] !== 'string') {\n throw new TypeError(`tensor data at index ${i} is not a string`);\n }\n wasm.HEAPU32[dataIndex++] = allocWasmString(data[i], allocs);\n }\n } else {\n dataByteLength = data.byteLength;\n rawData = wasm._malloc(dataByteLength);\n allocs.push(rawData);\n wasm.HEAPU8.set(new Uint8Array(data.buffer, data.byteOffset, dataByteLength), rawData);\n }\n }\n\n const stack = wasm.stackSave();\n const dimsOffset = wasm.stackAlloc(4 * dims.length);\n try {\n let dimIndex = dimsOffset / 4;\n dims.forEach(d => wasm.HEAP32[dimIndex++] = d);\n const tensor = wasm._OrtCreateTensor(\n tensorDataTypeStringToEnum(dataType), rawData, dataByteLength, dimsOffset, dims.length,\n dataLocationStringToEnum(location));\n if (tensor === 0) {\n checkLastError(`Can't create tensor for input/output. session=${sessionId}, index=${index}.`);\n }\n tensorHandles.push(tensor);\n } finally {\n wasm.stackRestore(stack);\n }\n };\n\n/**\n * perform inference run\n */\nexport const run = async(\n sessionId: number, inputIndices: number[], inputTensors: TensorMetadata[], outputIndices: number[],\n outputTensors: Array, options: InferenceSession.RunOptions): Promise => {\n const wasm = getInstance();\n const session = activeSessions.get(sessionId);\n if (!session) {\n throw new Error(`cannot run inference. invalid session id: ${sessionId}`);\n }\n const sessionHandle = session[0];\n const inputNamesUTF8Encoded = session[1];\n const outputNamesUTF8Encoded = session[2];\n const ioBindingState = session[3];\n const enableGraphCapture = session[4];\n const inputOutputBound = session[5];\n\n const inputCount = inputIndices.length;\n const outputCount = outputIndices.length;\n\n let runOptionsHandle = 0;\n let runOptionsAllocs: number[] = [];\n\n const inputTensorHandles: number[] = [];\n const outputTensorHandles: number[] = [];\n const inputOutputAllocs: number[] = [];\n\n const beforeRunStack = wasm.stackSave();\n const inputValuesOffset = wasm.stackAlloc(inputCount * 4);\n const inputNamesOffset = wasm.stackAlloc(inputCount * 4);\n const outputValuesOffset = wasm.stackAlloc(outputCount * 4);\n const outputNamesOffset = wasm.stackAlloc(outputCount * 4);\n\n try {\n [runOptionsHandle, runOptionsAllocs] = setRunOptions(options);\n\n // create input tensors\n for (let i = 0; i < inputCount; i++) {\n prepareInputOutputTensor(\n inputTensors[i], inputTensorHandles, inputOutputAllocs, sessionId, inputIndices[i], enableGraphCapture);\n }\n\n // create output tensors\n for (let i = 0; i < outputCount; i++) {\n prepareInputOutputTensor(\n outputTensors[i], outputTensorHandles, inputOutputAllocs, sessionId, inputCount + outputIndices[i],\n enableGraphCapture);\n }\n\n let inputValuesIndex = inputValuesOffset / 4;\n let inputNamesIndex = inputNamesOffset / 4;\n let outputValuesIndex = outputValuesOffset / 4;\n let outputNamesIndex = outputNamesOffset / 4;\n for (let i = 0; i < inputCount; i++) {\n wasm.HEAPU32[inputValuesIndex++] = inputTensorHandles[i];\n wasm.HEAPU32[inputNamesIndex++] = inputNamesUTF8Encoded[inputIndices[i]];\n }\n for (let i = 0; i < outputCount; i++) {\n wasm.HEAPU32[outputValuesIndex++] = outputTensorHandles[i];\n wasm.HEAPU32[outputNamesIndex++] = outputNamesUTF8Encoded[outputIndices[i]];\n }\n\n if (!BUILD_DEFS.DISABLE_JSEP && ioBindingState && !inputOutputBound) {\n const {handle, outputPreferredLocations, outputPreferredLocationsEncoded} = ioBindingState;\n\n if (inputNamesUTF8Encoded.length !== inputCount) {\n throw new Error(`input count from feeds (${\n inputCount}) is expected to be always equal to model's input count (${inputNamesUTF8Encoded.length}).`);\n }\n\n // process inputs\n for (let i = 0; i < inputCount; i++) {\n const index = inputIndices[i];\n const errorCode = await wasm._OrtBindInput(handle, inputNamesUTF8Encoded[index], inputTensorHandles[i]);\n if (errorCode !== 0) {\n checkLastError(`Can't bind input[${i}] for session=${sessionId}.`);\n }\n }\n\n // process pre-allocated outputs\n for (let i = 0; i < outputCount; i++) {\n const index = outputIndices[i];\n const location = outputTensors[i]?.[3]; // undefined means output is not pre-allocated.\n\n if (location) {\n // output is pre-allocated. bind the tensor.\n const errorCode = wasm._OrtBindOutput(handle, outputNamesUTF8Encoded[index], outputTensorHandles[i], 0);\n if (errorCode !== 0) {\n checkLastError(`Can't bind pre-allocated output[${i}] for session=${sessionId}.`);\n }\n } else {\n // output is not pre-allocated. reset preferred location.\n const errorCode =\n wasm._OrtBindOutput(handle, outputNamesUTF8Encoded[index], 0, outputPreferredLocationsEncoded[index]);\n if (errorCode !== 0) {\n checkLastError(`Can't bind output[${i}] to ${outputPreferredLocations[i]} for session=${sessionId}.`);\n }\n }\n }\n activeSessions.set(\n sessionId,\n [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, ioBindingState, enableGraphCapture, true]);\n }\n\n wasm.jsepOnRunStart?.(sessionHandle);\n let errorCode: number;\n if (!BUILD_DEFS.DISABLE_JSEP && ioBindingState) {\n errorCode = await wasm._OrtRunWithBinding(\n sessionHandle, ioBindingState.handle, outputCount, outputValuesOffset, runOptionsHandle);\n } else {\n errorCode = await wasm._OrtRun(\n sessionHandle, inputNamesOffset, inputValuesOffset, inputCount, outputNamesOffset, outputCount,\n outputValuesOffset, runOptionsHandle);\n }\n\n if (errorCode !== 0) {\n checkLastError('failed to call OrtRun().');\n }\n\n const output: TensorMetadata[] = [];\n\n for (let i = 0; i < outputCount; i++) {\n const tensor = wasm.HEAPU32[outputValuesOffset / 4 + i];\n if (tensor === outputTensorHandles[i]) {\n // output tensor is pre-allocated. no need to copy data.\n output.push(outputTensors[i]!);\n continue;\n }\n\n const beforeGetTensorDataStack = wasm.stackSave();\n // stack allocate 4 pointer value\n const tensorDataOffset = wasm.stackAlloc(4 * 4);\n\n let keepOutputTensor = false;\n let type: Tensor.Type|undefined, dataOffset = 0;\n try {\n const errorCode = wasm._OrtGetTensorData(\n tensor, tensorDataOffset, tensorDataOffset + 4, tensorDataOffset + 8, tensorDataOffset + 12);\n if (errorCode !== 0) {\n checkLastError(`Can't access output tensor data on index ${i}.`);\n }\n let tensorDataIndex = tensorDataOffset / 4;\n const dataType = wasm.HEAPU32[tensorDataIndex++];\n dataOffset = wasm.HEAPU32[tensorDataIndex++];\n const dimsOffset = wasm.HEAPU32[tensorDataIndex++];\n const dimsLength = wasm.HEAPU32[tensorDataIndex++];\n const dims = [];\n for (let i = 0; i < dimsLength; i++) {\n dims.push(wasm.HEAPU32[dimsOffset / 4 + i]);\n }\n wasm._OrtFree(dimsOffset);\n\n const size = dims.reduce((a, b) => a * b, 1);\n type = tensorDataTypeEnumToString(dataType);\n\n const preferredLocation = ioBindingState?.outputPreferredLocations[outputIndices[i]];\n\n if (type === 'string') {\n if (preferredLocation === 'gpu-buffer') {\n throw new Error('String tensor is not supported on GPU.');\n }\n const stringData: string[] = [];\n let dataIndex = dataOffset / 4;\n for (let i = 0; i < size; i++) {\n const offset = wasm.HEAPU32[dataIndex++];\n const maxBytesToRead = i === size - 1 ? undefined : wasm.HEAPU32[dataIndex] - offset;\n stringData.push(wasm.UTF8ToString(offset, maxBytesToRead));\n }\n output.push([type, dims, stringData, 'cpu']);\n } else {\n // If a certain output's preferred location is GPU but the tensor is empty, we still need to create a CPU\n // tensor for it. There is no mapping GPU buffer for an empty tensor.\n if (preferredLocation === 'gpu-buffer' && size > 0) {\n const getBuffer = wasm.jsepGetBuffer;\n if (!getBuffer) {\n throw new Error('preferredLocation \"gpu-buffer\" is not supported without using WebGPU.');\n }\n const gpuBuffer = getBuffer(dataOffset);\n const elementSize = getTensorElementSize(dataType);\n if (elementSize === undefined || !isGpuBufferSupportedType(type)) {\n throw new Error(`Unsupported data type: ${type}`);\n }\n\n // do not release the tensor right now. it will be released when user calls tensor.dispose().\n keepOutputTensor = true;\n\n output.push([\n type, dims, {\n gpuBuffer,\n download: wasm.jsepCreateDownloader!(gpuBuffer, size * elementSize, type),\n dispose: () => {\n wasm._OrtReleaseTensor(tensor);\n }\n },\n 'gpu-buffer'\n ]);\n } else {\n const typedArrayConstructor = tensorTypeToTypedArrayConstructor(type);\n const data = new typedArrayConstructor(size);\n new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n .set(wasm.HEAPU8.subarray(dataOffset, dataOffset + data.byteLength));\n output.push([type, dims, data, 'cpu']);\n }\n }\n } finally {\n wasm.stackRestore(beforeGetTensorDataStack);\n if (type === 'string' && dataOffset) {\n wasm._free(dataOffset);\n }\n if (!keepOutputTensor) {\n wasm._OrtReleaseTensor(tensor);\n }\n }\n }\n\n if (ioBindingState && !enableGraphCapture) {\n wasm._OrtClearBoundOutputs(ioBindingState.handle);\n activeSessions.set(\n sessionId,\n [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, ioBindingState, enableGraphCapture, false]);\n }\n return output;\n } finally {\n wasm.stackRestore(beforeRunStack);\n\n inputTensorHandles.forEach(v => wasm._OrtReleaseTensor(v));\n outputTensorHandles.forEach(v => wasm._OrtReleaseTensor(v));\n inputOutputAllocs.forEach(p => wasm._free(p));\n\n if (runOptionsHandle !== 0) {\n wasm._OrtReleaseRunOptions(runOptionsHandle);\n }\n runOptionsAllocs.forEach(p => wasm._free(p));\n }\n};\n\n/**\n * end profiling\n */\nexport const endProfiling = (sessionId: number): void => {\n const wasm = getInstance();\n const session = activeSessions.get(sessionId);\n if (!session) {\n throw new Error('invalid session id');\n }\n const sessionHandle = session[0];\n\n // profile file name is not used yet, but it must be freed.\n const profileFileName = wasm._OrtEndProfiling(sessionHandle);\n if (profileFileName === 0) {\n checkLastError('Can\\'t get an profile file name.');\n }\n wasm._OrtFree(profileFileName);\n};\n\nexport const extractTransferableBuffers = (tensors: readonly SerializableTensorMetadata[]): ArrayBufferLike[] => {\n const buffers: ArrayBufferLike[] = [];\n for (const tensor of tensors) {\n const data = tensor[2];\n if (!Array.isArray(data) && 'buffer' in data) {\n buffers.push(data.buffer);\n }\n }\n return buffers;\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env, InferenceSession} from 'onnxruntime-common';\n\nimport {OrtWasmMessage, SerializableInternalBuffer, SerializableSessionMetadata, SerializableTensorMetadata, TensorMetadata} from './proxy-messages';\nimport * as core from './wasm-core-impl';\nimport {initializeWebAssembly} from './wasm-factory';\nimport {importProxyWorker} from './wasm-utils-import';\n\nconst isProxy = (): boolean => !!env.wasm.proxy && typeof document !== 'undefined';\nlet proxyWorker: Worker|undefined;\nlet initializing = false;\nlet initialized = false;\nlet aborted = false;\nlet temporaryObjectUrl: string|undefined;\n\ntype PromiseCallbacks = [resolve: (result: T) => void, reject: (reason: unknown) => void];\nlet initWasmCallbacks: PromiseCallbacks;\nconst queuedCallbacks: Map>> = new Map();\n\nconst enqueueCallbacks = (type: OrtWasmMessage['type'], callbacks: PromiseCallbacks): void => {\n const queue = queuedCallbacks.get(type);\n if (queue) {\n queue.push(callbacks);\n } else {\n queuedCallbacks.set(type, [callbacks]);\n }\n};\n\nconst ensureWorker = (): void => {\n if (initializing || !initialized || aborted || !proxyWorker) {\n throw new Error('worker not ready');\n }\n};\n\nconst onProxyWorkerMessage = (ev: MessageEvent): void => {\n switch (ev.data.type) {\n case 'init-wasm':\n initializing = false;\n if (ev.data.err) {\n aborted = true;\n initWasmCallbacks[1](ev.data.err);\n } else {\n initialized = true;\n initWasmCallbacks[0]();\n }\n if (temporaryObjectUrl) {\n URL.revokeObjectURL(temporaryObjectUrl);\n temporaryObjectUrl = undefined;\n }\n break;\n case 'init-ep':\n case 'copy-from':\n case 'create':\n case 'release':\n case 'run':\n case 'end-profiling': {\n const callbacks = queuedCallbacks.get(ev.data.type)!;\n if (ev.data.err) {\n callbacks.shift()![1](ev.data.err);\n } else {\n callbacks.shift()![0](ev.data.out!);\n }\n break;\n }\n default:\n }\n};\n\n\nexport const initializeWebAssemblyAndOrtRuntime = async(): Promise => {\n if (initialized) {\n return;\n }\n if (initializing) {\n throw new Error('multiple calls to \\'initWasm()\\' detected.');\n }\n if (aborted) {\n throw new Error('previous call to \\'initWasm()\\' failed.');\n }\n\n initializing = true;\n\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n return new Promise((resolve, reject) => {\n proxyWorker?.terminate();\n\n void importProxyWorker().then(([objectUrl, worker]) => {\n try {\n proxyWorker = worker;\n proxyWorker.onerror = (ev: ErrorEvent) => reject(ev);\n proxyWorker.onmessage = onProxyWorkerMessage;\n initWasmCallbacks = [resolve, reject];\n const message: OrtWasmMessage = {type: 'init-wasm', in : env};\n proxyWorker.postMessage(message);\n temporaryObjectUrl = objectUrl;\n } catch (e) {\n reject(e);\n }\n }, reject);\n });\n\n } else {\n try {\n await initializeWebAssembly(env.wasm);\n await core.initRuntime(env);\n initialized = true;\n } catch (e) {\n aborted = true;\n throw e;\n } finally {\n initializing = false;\n }\n }\n};\n\nexport const initializeOrtEp = async(epName: string): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('init-ep', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'init-ep', in : {epName, env}};\n proxyWorker!.postMessage(message);\n });\n } else {\n await core.initEp(env, epName);\n }\n};\n\nexport const copyFromExternalBuffer = async(buffer: Uint8Array): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('copy-from', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'copy-from', in : {buffer}};\n proxyWorker!.postMessage(message, [buffer.buffer]);\n });\n } else {\n return core.copyFromExternalBuffer(buffer);\n }\n};\n\nexport const createSession =\n async(model: SerializableInternalBuffer|Uint8Array, options?: InferenceSession.SessionOptions):\n Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n // check unsupported options\n if (options?.preferredOutputLocation) {\n throw new Error('session option \"preferredOutputLocation\" is not supported for proxy.');\n }\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('create', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'create', in : {model, options: {...options}}};\n const transferable: Transferable[] = [];\n if (model instanceof Uint8Array) {\n transferable.push(model.buffer);\n }\n proxyWorker!.postMessage(message, transferable);\n });\n } else {\n return core.createSession(model, options);\n }\n };\n\nexport const releaseSession = async(sessionId: number): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('release', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'release', in : sessionId};\n proxyWorker!.postMessage(message);\n });\n } else {\n core.releaseSession(sessionId);\n }\n};\n\nexport const run = async(\n sessionId: number, inputIndices: number[], inputs: TensorMetadata[], outputIndices: number[],\n outputs: Array, options: InferenceSession.RunOptions): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n // check inputs location\n if (inputs.some(t => t[3] !== 'cpu')) {\n throw new Error('input tensor on GPU is not supported for proxy.');\n }\n // check outputs location\n if (outputs.some(t => t)) {\n throw new Error('pre-allocated output tensor is not supported for proxy.');\n }\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('run', [resolve, reject]);\n const serializableInputs = inputs as SerializableTensorMetadata[]; // every input is on CPU.\n const message: OrtWasmMessage =\n {type: 'run', in : {sessionId, inputIndices, inputs: serializableInputs, outputIndices, options}};\n proxyWorker!.postMessage(message, core.extractTransferableBuffers(serializableInputs));\n });\n } else {\n return core.run(sessionId, inputIndices, inputs, outputIndices, outputs, options);\n }\n};\n\nexport const endProfiling = async(sessionId: number): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('end-profiling', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'end-profiling', in : sessionId};\n proxyWorker!.postMessage(message);\n });\n } else {\n core.endProfiling(sessionId);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession, InferenceSessionHandler, SessionHandler, Tensor, TRACE_FUNC_BEGIN, TRACE_FUNC_END} from 'onnxruntime-common';\n\nimport {SerializableInternalBuffer, TensorMetadata} from './proxy-messages';\nimport {copyFromExternalBuffer, createSession, endProfiling, releaseSession, run} from './proxy-wrapper';\nimport {isGpuBufferSupportedType} from './wasm-common';\nimport {isNode} from './wasm-utils-env';\nimport {loadFile} from './wasm-utils-load-file';\n\nexport const encodeTensorMetadata = (tensor: Tensor, getName: () => string): TensorMetadata => {\n switch (tensor.location) {\n case 'cpu':\n return [tensor.type, tensor.dims, tensor.data, 'cpu'];\n case 'gpu-buffer':\n return [tensor.type, tensor.dims, {gpuBuffer: tensor.gpuBuffer}, 'gpu-buffer'];\n default:\n throw new Error(`invalid data location: ${tensor.location} for ${getName()}`);\n }\n};\n\nexport const decodeTensorMetadata = (tensor: TensorMetadata): Tensor => {\n switch (tensor[3]) {\n case 'cpu':\n return new Tensor(tensor[0], tensor[2], tensor[1]);\n case 'gpu-buffer': {\n const dataType = tensor[0];\n if (!isGpuBufferSupportedType(dataType)) {\n throw new Error(`not supported data type: ${dataType} for deserializing GPU tensor`);\n }\n const {gpuBuffer, download, dispose} = tensor[2];\n return Tensor.fromGpuBuffer(gpuBuffer, {dataType, dims: tensor[1], download, dispose});\n }\n default:\n throw new Error(`invalid data location: ${tensor[3]}`);\n }\n};\n\nexport class OnnxruntimeWebAssemblySessionHandler implements InferenceSessionHandler {\n private sessionId: number;\n\n inputNames: string[];\n outputNames: string[];\n\n async fetchModelAndCopyToWasmMemory(path: string): Promise {\n // fetch model from url and move to wasm heap.\n return copyFromExternalBuffer(await loadFile(path));\n }\n\n async loadModel(pathOrBuffer: string|Uint8Array, options?: InferenceSession.SessionOptions): Promise {\n TRACE_FUNC_BEGIN();\n let model: Parameters[0];\n\n if (typeof pathOrBuffer === 'string') {\n if (isNode) {\n // node\n model = await loadFile(pathOrBuffer);\n } else {\n // browser\n // fetch model and copy to wasm heap.\n model = await this.fetchModelAndCopyToWasmMemory(pathOrBuffer);\n }\n } else {\n model = pathOrBuffer;\n }\n\n [this.sessionId, this.inputNames, this.outputNames] = await createSession(model, options);\n TRACE_FUNC_END();\n }\n\n async dispose(): Promise {\n return releaseSession(this.sessionId);\n }\n\n async run(feeds: SessionHandler.FeedsType, fetches: SessionHandler.FetchesType, options: InferenceSession.RunOptions):\n Promise {\n TRACE_FUNC_BEGIN();\n const inputArray: Tensor[] = [];\n const inputIndices: number[] = [];\n Object.entries(feeds).forEach(kvp => {\n const name = kvp[0];\n const tensor = kvp[1];\n const index = this.inputNames.indexOf(name);\n if (index === -1) {\n throw new Error(`invalid input '${name}'`);\n }\n inputArray.push(tensor);\n inputIndices.push(index);\n });\n\n const outputArray: Array = [];\n const outputIndices: number[] = [];\n Object.entries(fetches).forEach(kvp => {\n const name = kvp[0];\n const tensor = kvp[1];\n const index = this.outputNames.indexOf(name);\n if (index === -1) {\n throw new Error(`invalid output '${name}'`);\n }\n outputArray.push(tensor);\n outputIndices.push(index);\n });\n\n const inputs =\n inputArray.map((t, i) => encodeTensorMetadata(t, () => `input \"${this.inputNames[inputIndices[i]]}\"`));\n const outputs = outputArray.map(\n (t, i) => t ? encodeTensorMetadata(t, () => `output \"${this.outputNames[outputIndices[i]]}\"`) : null);\n\n const results = await run(this.sessionId, inputIndices, inputs, outputIndices, outputs, options);\n\n const resultMap: SessionHandler.ReturnType = {};\n for (let i = 0; i < results.length; i++) {\n resultMap[this.outputNames[outputIndices[i]]] = outputArray[i] ?? decodeTensorMetadata(results[i]);\n }\n TRACE_FUNC_END();\n return resultMap;\n }\n\n startProfiling(): void {\n // TODO: implement profiling\n }\n\n endProfiling(): void {\n void endProfiling(this.sessionId);\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Backend, env, InferenceSession, InferenceSessionHandler} from 'onnxruntime-common';\n\nimport {initializeOrtEp, initializeWebAssemblyAndOrtRuntime} from './wasm/proxy-wrapper';\nimport {OnnxruntimeWebAssemblySessionHandler} from './wasm/session-handler-inference';\nimport {scriptSrc} from './wasm/wasm-utils-import';\n\n/**\n * This function initializes all flags for WebAssembly.\n *\n * Those flags are accessible from `ort.env.wasm`. Users are allow to set those flags before the first inference session\n * being created, to override default value.\n */\nexport const initializeFlags = (): void => {\n if (typeof env.wasm.initTimeout !== 'number' || env.wasm.initTimeout < 0) {\n env.wasm.initTimeout = 0;\n }\n\n if (env.wasm.simd === false) {\n // eslint-disable-next-line no-console\n console.warn(\n 'Deprecated property \"env.wasm.simd\" is set to false. ' +\n 'non-SIMD build is no longer provided, and this setting will be ignored.');\n }\n\n if (typeof env.wasm.proxy !== 'boolean') {\n env.wasm.proxy = false;\n }\n\n if (typeof env.wasm.trace !== 'boolean') {\n env.wasm.trace = false;\n }\n\n if (typeof env.wasm.numThreads !== 'number' || !Number.isInteger(env.wasm.numThreads) || env.wasm.numThreads <= 0) {\n // The following logic only applies when `ort.env.wasm.numThreads` is not set by user. We will always honor user's\n // setting if it is provided.\n\n // Browser: when crossOriginIsolated is false, SharedArrayBuffer is not available so WebAssembly threads will not\n // work. In this case, we will set numThreads to 1.\n //\n // There is an exception: when the browser is configured to force-enable SharedArrayBuffer (e.g. Chromuim with\n // --enable-features=SharedArrayBuffer), it is possible that `self.crossOriginIsolated` is false and\n // SharedArrayBuffer is available at the same time. This is usually for testing. In this case, we will still set\n // numThreads to 1 here. If we want to enable multi-threading in test, we should set `ort.env.wasm.numThreads` to a\n // value greater than 1.\n if (typeof self !== 'undefined' && !self.crossOriginIsolated) {\n env.wasm.numThreads = 1;\n } else {\n const numCpuLogicalCores =\n typeof navigator === 'undefined' ? require('node:os').cpus().length : navigator.hardwareConcurrency;\n env.wasm.numThreads = Math.min(4, Math.ceil((numCpuLogicalCores || 1) / 2));\n }\n }\n\n if (!BUILD_DEFS.DISABLE_DYNAMIC_IMPORT) {\n // overwrite wasm paths override if not set\n if (env.wasm.wasmPaths === undefined && scriptSrc && scriptSrc.indexOf('blob:') !== 0) {\n env.wasm.wasmPaths = scriptSrc.substring(0, scriptSrc.lastIndexOf('/') + 1);\n }\n }\n};\n\nexport class OnnxruntimeWebAssemblyBackend implements Backend {\n /**\n * This function initializes the WebAssembly backend.\n *\n * This function will be called only once for each backend name. It will be called the first time when\n * `ort.InferenceSession.create()` is called with a registered backend name.\n *\n * @param backendName - the registered backend name.\n */\n async init(backendName: string): Promise {\n // populate wasm flags\n initializeFlags();\n\n // init wasm\n await initializeWebAssemblyAndOrtRuntime();\n\n // performe EP specific initialization\n await initializeOrtEp(backendName);\n }\n createInferenceSessionHandler(path: string, options?: InferenceSession.SessionOptions):\n Promise;\n createInferenceSessionHandler(buffer: Uint8Array, options?: InferenceSession.SessionOptions):\n Promise;\n async createInferenceSessionHandler(pathOrBuffer: string|Uint8Array, options?: InferenceSession.SessionOptions):\n Promise {\n const handler = new OnnxruntimeWebAssemblySessionHandler();\n await handler.loadModel(pathOrBuffer, options);\n return Promise.resolve(handler);\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {OnnxruntimeWebAssemblyBackend} from './backend-wasm';\nexport const wasmBackend = new OnnxruntimeWebAssemblyBackend();\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/* eslint-disable @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports */\n\n// We use \"require\" instead of \"import\" here because import statement must be put in top level. Our current code does\n// not allow bundler to tree-shaking code as expected because some codes are treated as having side effects.\n// So we import code inside the if-clause to allow bundler remove the code safely.\n\nexport * from 'onnxruntime-common';\nimport * as ort from 'onnxruntime-common';\nexport default ort;\n\nimport {registerBackend, env} from 'onnxruntime-common';\nimport {version} from './version';\n\nif (!BUILD_DEFS.DISABLE_WEBGL) {\n const onnxjsBackend = require('./backend-onnxjs').onnxjsBackend;\n registerBackend('webgl', onnxjsBackend, -10);\n}\n\nif (!BUILD_DEFS.DISABLE_WASM) {\n const wasmBackend = BUILD_DEFS.DISABLE_TRAINING ? require('./backend-wasm-inference').wasmBackend :\n require('./backend-wasm-training').wasmBackend;\n if (!BUILD_DEFS.DISABLE_JSEP) {\n registerBackend('webgpu', wasmBackend, 5);\n registerBackend('webnn', wasmBackend, 5);\n }\n registerBackend('cpu', wasmBackend, 10);\n registerBackend('wasm', wasmBackend, 10);\n}\n\nObject.defineProperty(env.versions, 'web', {value: version, enumerable: true});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// This file is generated by /js/scripts/update-version.ts\n// Do not modify file content manually.\n\nexport const version = '1.19.0';\n"], - "mappings": "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", - "names": ["backends", "backendsSortedByPriority", "registerBackend", "tryResolveAndInitializeBackend", "resolveBackendAndExecutionProviders", "init_backend_impl", "__esmMin", "name", "backend", "priority", "currentBackend", "i", "backendName", "backendInfo", "isInitializing", "e", "options", "eps", "backendHints", "backendNames", "errors", "availableBackendNames", "resolveResult", "err", "filteredEps", "target", "prop", "init_backend", "__esmMin", "init_backend_impl", "version", "init_version", "__esmMin", "logLevelValue", "env", "init_env_impl", "__esmMin", "init_version", "version", "value", "env", "init_env", "__esmMin", "init_env_impl", "tensorToDataURL", "tensorToImageData", "init_tensor_conversion_impl", "__esmMin", "tensor", "options", "canvas", "pixels2DContext", "width", "height", "inputformat", "norm", "normMean", "normBias", "stride", "rTensorPointer", "gTensorPointer", "bTensorPointer", "aTensorPointer", "i", "j", "R", "G", "B", "A", "image", "channels", "step", "rImagePointer", "gImagePointer", "bImagePointer", "aImagePointer", "bufferToTensor", "tensorFromImage", "tensorFromTexture", "tensorFromGpuBuffer", "tensorFromPinnedBuffer", "init_tensor_factory_impl", "__esmMin", "init_tensor_impl", "buffer", "options", "height", "width", "norm", "normMean", "normBias", "inputformat", "outputformat", "stride", "float32Data", "step", "rImagePointer", "gImagePointer", "bImagePointer", "aImagePointer", "rTensorPointer", "gTensorPointer", "bTensorPointer", "aTensorPointer", "i", "Tensor", "image", "isHTMLImageEle", "isImageDataEle", "isImageBitmap", "isString", "data", "bufferToTensorOptions", "createCanvas", "createCanvasContext", "canvas", "pixels2DContext", "tempCanvas", "resolve", "reject", "context", "newImage", "img", "texture", "download", "dispose", "dims", "gpuBuffer", "dataType", "type", "NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP", "NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP", "isTypedArrayChecked", "checkTypedArray", "init_tensor_impl_type_mapping", "__esmMin", "isBigInt64ArrayAvailable", "isBigUint64ArrayAvailable", "isFloat16ArrayAvailable", "calculateSize", "tensorReshape", "init_tensor_utils_impl", "__esmMin", "init_tensor_impl", "dims", "size", "i", "dim", "tensor", "Tensor", "Tensor", "init_tensor_impl", "__esmMin", "init_tensor_conversion_impl", "init_tensor_factory_impl", "init_tensor_impl_type_mapping", "init_tensor_utils_impl", "arg0", "arg1", "arg2", "checkTypedArray", "type", "dims", "expectedTypedArrayConstructor", "NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP", "data", "maybeDims", "typedArrayConstructor", "firstElementType", "mappedType", "NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP", "size", "calculateSize", "image", "options", "tensorFromImage", "texture", "tensorFromTexture", "gpuBuffer", "tensorFromGpuBuffer", "buffer", "tensorFromPinnedBuffer", "tensorToDataURL", "tensorToImageData", "releaseData", "tensorReshape", "Tensor", "init_tensor", "__esmMin", "init_tensor_impl", "TRACE", "TRACE_FUNC", "TRACE_FUNC_BEGIN", "TRACE_FUNC_END", "init_trace", "__esmMin", "init_env_impl", "deviceType", "label", "env", "msg", "extraMsg", "stack", "hasTraceFunc", "i", "InferenceSession", "init_inference_session_impl", "__esmMin", "init_backend_impl", "init_tensor", "init_trace", "_InferenceSession", "handler", "feeds", "arg1", "arg2", "TRACE_FUNC_BEGIN", "fetches", "options", "Tensor", "isFetchesEmpty", "name", "isFetches", "arg1Keys", "v", "results", "returnValue", "key", "result", "TRACE_FUNC_END", "arg0", "arg3", "filePathOrUint8Array", "buffer", "byteOffset", "byteLength", "backend", "optionsWithValidatedEPs", "resolveBackendAndExecutionProviders", "InferenceSession", "init_inference_session", "__esmMin", "init_inference_session_impl", "init_tensor_conversion", "__esmMin", "init_tensor_factory", "__esmMin", "init_onnx_model", "__esmMin", "init_onnx_value", "__esmMin", "noBackendErrMsg", "TrainingSession", "init_training_session_impl", "__esmMin", "init_backend_impl", "init_tensor", "_TrainingSession", "handler", "hasOptimizerModel", "hasEvalModel", "trainingOptions", "sessionOptions", "evalModel", "optimizerModel", "options", "backend", "optionsWithValidatedEPs", "resolveBackendAndExecutionProviders", "inputNames", "outputNames", "feeds", "arg1", "arg2", "fetches", "Tensor", "isFetchesEmpty", "name", "isFetches", "arg1Keys", "v", "results", "returnValue", "key", "result", "trainableOnly", "array", "paramsSize", "TrainingSession", "init_training_session", "__esmMin", "init_training_session_impl", "esm_exports", "__export", "InferenceSession", "TRACE", "TRACE_FUNC_BEGIN", "TRACE_FUNC_END", "Tensor", "TrainingSession", "env", "registerBackend", "init_esm", "__esmMin", "init_backend", "init_env", "init_inference_session", "init_tensor", "init_tensor_conversion", "init_tensor_factory", "init_trace", "init_onnx_model", "init_onnx_value", "init_training_session", "log", "arg0", "arg1", "arg2", "arg3", "createCategorizedLogger", "logInternal", "category", "severity", "content", "_stack", "config", "LOGGER_CONFIG_MAP", "SEVERITY_VALUE", "LOGGER_PROVIDER_MAP", "NoOpLoggerProvider", "ConsoleLoggerProvider", "LOGGER_DEFAULT_CONFIG", "Logger", "Event", "EventRecord", "Profiler", "now", "init_instrument", "__esmMin", "_severity", "_content", "_category", "verbose", "info", "warning", "error", "fatal", "reset", "set", "previousConfig", "setWithEnv", "env", "name", "startTime", "endCallback", "timer", "ctx", "endTime", "maxNumberEvents", "flushBatchSize", "flushIntervalInMilliseconds", "func", "event", "isPromise", "res", "resolve", "reject", "value", "reason", "eventRes", "e", "currentTime", "previousPointer", "resolveOperator", "node", "opsets", "rules", "rule", "opType", "domain", "versionSelector", "opImpl", "opInit", "opset", "matchSelector", "set", "version", "selector", "rangeStart", "pair", "rangeEnd", "init_opset", "__esmMin", "require_guid", "__commonJSMin", "exports", "Guid", "guid", "value", "count", "out", "i", "other", "Long", "low", "high", "unsigned", "isLong", "obj", "ctz32", "value", "c", "fromInt", "cachedObj", "cache", "UINT_CACHE", "fromBits", "INT_CACHE", "fromNumber", "UZERO", "ZERO", "TWO_PWR_64_DBL", "MAX_UNSIGNED_VALUE", "TWO_PWR_63_DBL", "MIN_VALUE", "MAX_VALUE", "TWO_PWR_32_DBL", "lowBits", "highBits", "fromString", "str", "radix", "p", "radixToPower", "pow_dbl", "result", "i", "size", "power", "fromValue", "val", "wasm", "TWO_PWR_16_DBL", "TWO_PWR_24_DBL", "TWO_PWR_24", "ONE", "UONE", "NEG_ONE", "LongPrototype", "long_default", "init_long", "__esmMin", "radixLong", "div", "rem1", "rem", "remDiv", "intval", "digits", "bit", "other", "thisNeg", "otherNeg", "addend", "a48", "a32", "a16", "a00", "b48", "b32", "b16", "b00", "c48", "c32", "c16", "c00", "subtrahend", "multiplier", "divisor", "approx", "res", "halfThis", "log2", "delta", "approxRes", "approxRem", "numBits", "b", "le", "hi", "lo", "bytes", "flatbuffers", "init_flatbuffers", "__esmMin", "low", "high", "other", "opt_initial_size", "initial_size", "forceDefaults", "size", "additional_bytes", "align_size", "old_buf_size", "byte_size", "i", "value", "voffset", "defaultValue", "obj", "bb", "new_buf_size", "nbb", "offset", "numfields", "vtableloc", "trimmed_size", "standard_fields", "len", "existing_vtable", "vt1", "outer_loop", "vt2", "j", "root_table", "opt_file_identifier", "opt_size_prefix", "size_prefix", "file_identifier", "table", "field", "table_start", "vtable_start", "ok", "elem_size", "num_elems", "alignment", "s", "utf8", "codePoint", "a", "b", "bytes", "position", "result", "bb_pos", "vtable_offset", "vtable", "t", "opt_encoding", "length", "c", "d", "ident", "onnxruntime", "init_ort_generated", "__esmMin", "init_flatbuffers", "experimental", "fbs", "AttributeType", "DimensionValueType", "TensorDataType", "NodeType", "TypeInfoValue", "Shape", "i", "bb", "obj", "flatbuffers", "index", "offset", "builder", "dimOffset", "data", "numElems", "Dimension", "optionalEncoding", "valueOffset", "denotationOffset", "DimensionValue", "dimType", "dimValue", "dimParamOffset", "TensorTypeAndShape", "elemType", "shapeOffset", "MapType", "keyType", "valueTypeOffset", "SequenceType", "elemTypeOffset", "EdgeEnd", "node_index", "src_arg_index", "dst_arg_index", "NodeEdge", "nodeIndex", "inputEdgesOffset", "outputEdgesOffset", "Node", "nameOffset", "docStringOffset", "domainOffset", "sinceVersion", "opTypeOffset", "type", "executionProviderTypeOffset", "inputsOffset", "outputsOffset", "attributesOffset", "inputArgCountsOffset", "implicitInputsOffset", "ValueInfo", "typeOffset", "TypeInfo", "valueType", "OperatorSetId", "version", "Tensor", "dimsOffset", "dataType", "rawDataOffset", "stringDataOffset", "SparseTensor", "valuesOffset", "indicesOffset", "Attribute", "f", "sOffset", "tOffset", "gOffset", "floatsOffset", "intsOffset", "stringsOffset", "tensorsOffset", "graphsOffset", "Graph", "initializersOffset", "nodeArgsOffset", "nodesOffset", "maxNodeIndex", "nodeEdgesOffset", "sparseInitializersOffset", "Model", "irVersion", "opsetImportOffset", "producerNameOffset", "producerVersionOffset", "modelVersion", "graphOffset", "graphDocStringOffset", "KernelCreateInfos", "nodeIndicesOffset", "kernelDefHashesOffset", "SubGraphSessionState", "graphIdOffset", "sessionStateOffset", "SessionState", "kernelsOffset", "subGraphSessionStatesOffset", "InferenceSession", "ortVersionOffset", "modelOffset", "require_aspromise", "__commonJSMin", "exports", "module", "asPromise", "fn", "ctx", "params", "offset", "index", "pending", "resolve", "reject", "err", "require_base64", "__commonJSMin", "exports", "base64", "string", "p", "n", "b64", "s64", "i", "buffer", "start", "end", "parts", "chunk", "j", "t", "b", "invalidEncoding", "offset", "c", "require_eventemitter", "__commonJSMin", "exports", "module", "EventEmitter", "evt", "fn", "ctx", "listeners", "i", "args", "require_float", "__commonJSMin", "exports", "module", "factory", "f32", "f8b", "le", "writeFloat_f32_cpy", "val", "buf", "pos", "writeFloat_f32_rev", "readFloat_f32_cpy", "readFloat_f32_rev", "writeFloat_ieee754", "writeUint", "sign", "exponent", "mantissa", "writeUintLE", "writeUintBE", "readFloat_ieee754", "readUint", "uint", "readUintLE", "readUintBE", "f64", "writeDouble_f64_cpy", "writeDouble_f64_rev", "readDouble_f64_cpy", "readDouble_f64_rev", "writeDouble_ieee754", "off0", "off1", "readDouble_ieee754", "lo", "hi", "require_inquire", "__commonJSMin", "e", "require_utf8", "__commonJSMin", "exports", "utf8", "string", "len", "c", "i", "buffer", "start", "end", "parts", "chunk", "t", "offset", "c1", "c2", "require_pool", "__commonJSMin", "exports", "module", "pool", "alloc", "slice", "size", "SIZE", "MAX", "slab", "offset", "buf", "require_longbits", "__commonJSMin", "exports", "module", "LongBits", "util", "lo", "hi", "zero", "zeroHash", "value", "sign", "unsigned", "charCodeAt", "hash", "mask", "part0", "part1", "part2", "require_minimal", "__commonJSMin", "exports", "util", "value", "obj", "prop", "Buffer", "sizeOrArray", "hash", "unsigned", "bits", "merge", "dst", "src", "ifNotSet", "keys", "i", "str", "newError", "name", "CustomError", "message", "properties", "fieldNames", "fieldMap", "encoding", "size", "require_writer", "__commonJSMin", "exports", "module", "Writer", "util", "BufferWriter", "LongBits", "base64", "utf8", "Op", "fn", "len", "val", "noop", "State", "writer", "create", "size", "writeByte", "buf", "pos", "writeVarint32", "VarintOp", "value", "writeVarint64", "bits", "writeFixed32", "writeBytes", "i", "head", "tail", "BufferWriter_", "require_writer_buffer", "__commonJSMin", "exports", "module", "BufferWriter", "Writer", "util", "val", "buf", "pos", "i", "value", "len", "writeStringBuffer", "require_reader", "__commonJSMin", "exports", "module", "Reader", "util", "BufferReader", "LongBits", "utf8", "indexOutOfRange", "reader", "writeLength", "buffer", "create_array", "create", "value", "readLongVarint", "bits", "i", "readFixed32_end", "buf", "end", "readFixed64", "length", "start", "nativeBuffer", "bytes", "wireType", "BufferReader_", "fn", "require_reader_buffer", "__commonJSMin", "exports", "module", "BufferReader", "Reader", "util", "buffer", "len", "require_service", "__commonJSMin", "exports", "module", "Service", "util", "rpcImpl", "requestDelimited", "responseDelimited", "rpcCall", "method", "requestCtor", "responseCtor", "request", "callback", "self", "err", "response", "endedByRPC", "require_rpc", "__commonJSMin", "exports", "rpc", "require_roots", "__commonJSMin", "exports", "module", "require_index_minimal", "__commonJSMin", "exports", "protobuf", "configure", "require_minimal", "__commonJSMin", "exports", "module", "require_onnx", "__commonJSMin", "exports", "module", "$protobuf", "$Reader", "$Writer", "$util", "$root", "onnx", "valuesById", "values", "AttributeProto", "properties", "keys", "i", "message", "writer", "reader", "length", "end", "tag", "end2", "error", "object", "options", "long", "j", "typeUrlPrefix", "ValueInfoProto", "NodeProto", "TrainingInfoProto", "ModelProto", "StringStringEntryProto", "TensorAnnotation", "GraphProto", "TensorProto", "Segment", "SparseTensorProto", "TensorShapeProto", "Dimension", "$oneOfFields", "TypeProto", "Tensor", "Sequence", "Map", "Optional", "SparseTensor", "OperatorSetIdProto", "FunctionProto", "assert", "expr", "msg", "decodeUtf8String", "buffer", "import_onnx", "ArrayUtil", "MatMulUtil", "BroadcastUtil", "GemmUtil", "ProtoUtil", "LongUtil", "ShapeUtil", "SplitUtil", "PoolConvUtil", "MIN_CLIP", "MAX_CLIP", "init_util", "__esmMin", "init_flatbuffers", "init_long", "init_tensor", "n1", "n2", "i", "dimsA", "dimsB", "a", "b", "outputShape", "aRank", "bRank", "_BroadcastUtil", "adims", "bdims", "isMatMul", "arank", "brank", "crank", "cdims", "cShapeMatMul", "aLen", "bLen", "broadcastedIndices", "originalShape", "originalIndices", "dimOffset", "op", "inplace", "resultType", "size", "c", "Tensor", "outputIndices", "originalIndicesA", "originalIndicesB", "valA", "valB", "isAScalar", "isBScalar", "rest", "j", "shape", "finalShape", "inputRank", "finalRank", "inputShape", "inRank", "dims", "dim", "leftShape", "transLeft", "rightShape", "transRight", "biasShape", "M", "K", "N", "kDim", "_ProtoUtil", "typeProto", "type", "d", "long_default", "valueType", "tensor", "node", "attributes", "n", "unsigned", "flatbuffers", "_ShapeUtil", "axis", "start", "end", "rank", "strides", "indices", "offset", "tensorRank", "axes", "x", "index", "axisToIncrementOn", "k", "originalDims", "shapeHints", "nDims", "reshapedDims", "unknownDimension", "newTensorSize", "oldTensorSize", "perm", "v", "pad", "shape1", "shape2", "total", "y", "right", "outputDims", "inSqueezeList", "inputDimsIterator", "_SplitUtil", "split", "numOutputs", "shapes", "offsets", "numElementsAlongAxis", "_PoolConvUtil", "isGlobalOperator", "inputDims", "kernelShape", "dilations", "pads", "autoPad", "filterDims", "inSize", "stride", "dilation", "kernel", "padHeadIndex", "padTailIndex", "dkernel", "padNeeded", "sizeof", "type", "sizeofProto", "createView", "dataBuffer", "dataviewConstructor", "longToNumber", "i", "ortFbs", "readProto", "view", "byteOffset", "long_default", "import_guid_typescript", "import_onnx", "Tensor", "init_tensor", "__esmMin", "init_long", "init_ort_generated", "init_util", "onnxruntime", "_Tensor", "dims", "dataProvider", "asyncDataProvider", "cache", "dataId", "ShapeUtil", "size", "empty", "constructor", "buf", "data", "indices", "value", "tensorProto", "ProtoUtil", "str", "decodeUtf8String", "dataDest", "dataSource", "elementSize", "length", "n", "array", "element", "ortTensor", "getGlsl", "version", "GLSL_ES_2_0", "GLSL_ES_3_0", "getVertexShaderSource", "glsl", "getFragShaderPreamble", "getDefaultFragShaderMain", "outputShapeLength", "init_glsl_source", "__esmMin", "init_types", "__esmMin", "repeatedTry", "checkFn", "delayFn", "_counter", "maxCounter", "resolve", "reject", "tryCount", "tryFn", "nextBackoff", "generateShaderFuncNameFromInputSamplerName", "samplerName", "assert", "generateShaderFuncNameFromInputSamplerNameAtOutCoords", "squeezeInputShape", "inputShape", "squeezedShape", "newInputShape", "getSqueezedParams", "params", "keptDims", "d", "getCoordsDataType", "rank", "getGlChannels", "init_utils", "__esmMin", "init_util", "getVecChannels", "name", "rank", "getGlChannels", "d", "getChannels", "unpackFromChannel", "init_packing_utils", "__esmMin", "init_utils", "getOutOfBoundsCondition", "rank", "shape", "dims", "cond", "i", "getOutput", "coord00", "coord01", "coord10", "coord11", "D", "getSetup", "rows", "cols", "packProgramMetadata", "createPackProgramInfo", "createPackProgramInfoLoader", "init_pack", "__esmMin", "init_glsl_source", "init_types", "init_utils", "init_packing_utils", "handler", "input", "glsl", "getGlsl", "inputShape", "inputRank", "outputRank", "coordsDataType", "getCoordsDataType", "channels", "getChannels", "setup", "reversedInputWH", "outOfBoundsCondition", "output", "shaderSource", "processDims3D", "shape", "batch", "i", "isReshapeCheap", "dims", "reshapedDims", "isCheapReshape", "getReshapedInputCoords", "strides", "ShapeUtil", "coords", "index", "stride", "line1", "line2", "getFlattenedIndexFrom3D", "createPackedReshape3DProgramMetadata", "createPackedReshape3DProgramInfo", "createPackedReshape3DProgramInfoLoader", "init_reshape_packed", "__esmMin", "init_util", "init_glsl_source", "init_types", "init_packing_utils", "outputShape3D", "handler", "input3D", "metadata", "inputShape3D", "squeezedOutputShape", "mainLoop", "outputCoords", "glsl", "getGlsl", "shaderSource", "unpackFromChannel", "encodeAsUint8", "init_uint8_encode", "__esmMin", "init_glsl_source", "init_types", "inferenceHandler", "input", "outputShape", "glsl", "getGlsl", "shaderSource", "programInfo", "getSourceCoords", "rank", "dims", "coords", "i", "unpackProgramMetadata", "createUnpackProgramInfo", "createUnpackProgramInfoLoader", "init_unpack", "__esmMin", "init_glsl_source", "init_types", "init_utils", "init_packing_utils", "handler", "input", "channels", "getChannels", "innerDims", "coordsDataType", "getCoordsDataType", "unpackChannel", "unpackFromChannel", "sourceCoords", "glsl", "getGlsl", "shaderSource", "RedFloat32DataEncoder", "RGBAFloatDataEncoder", "Uint8DataEncoder", "init_texture_data_encoder", "__esmMin", "init_instrument", "gl", "channels", "src", "textureSize", "result", "source", "Logger", "v", "i", "size", "buffer", "dataSize", "_value", "index", "textureType", "dest", "_textureSize", "createTextureLayoutFromTextureType", "calculateTextureWidthAndHeight", "createTextureLayoutFromShape", "init_texture_layout", "__esmMin", "init_util", "init_types", "textureLayoutStrategy", "shape", "textureType", "channel", "isPacked", "reverseWH", "breakAxis", "unpackedShape", "d", "i", "layout", "channels", "prefs", "width", "height", "rank", "inferredDims", "ShapeUtil", "getProgramInfoUniqueKey", "WebGLInferenceHandler", "init_inference_handler", "__esmMin", "init_instrument", "init_tensor", "init_util", "init_pack", "init_reshape_packed", "init_uint8_encode", "init_unpack", "init_texture_data_encoder", "init_texture_layout", "init_types", "programInfo", "inputTextureDatas", "inputs", "texture", "key", "session", "shape", "textureType", "calculateTextureWidthAndHeight", "program", "i", "artifact", "outputTextureLayout", "createTextureLayoutFromTextureType", "outputTextureData", "output", "tensor", "td", "layout", "adjustedKernelShape", "adjustedLayout", "buffer", "numFeatureMaps", "oldRowSize", "newRowSize", "newSize", "f", "oldOffset", "newOffset", "unpackedTextureLayout", "createTextureLayoutFromShape", "unpackedTextureData", "dataType", "data", "usage", "Logger", "input", "reshapedDims", "inputTD", "newTextureLayout", "ShapeUtil", "isReshapeCheap", "squeezedInputShape", "processDims3D", "squeezedOutputShape", "squeezedInputTensor", "squeezedOutputTensor", "createPackedReshape3DProgramInfoLoader", "type", "tensorId", "textureData", "Tensor", "_id", "isPacked", "encodeAsUint8", "createPackProgramInfoLoader", "createUnpackProgramInfoLoader", "AttributeWithCacheKeyImpl", "createAttributeWithCacheKey", "init_attribute_with_cache_key", "__esmMin", "attribute", "name", "batchNormalizationProgramMetadata", "batchNormalization", "parseBatchNormalizationAttributes", "createBatchNormalizationProgramInfo", "validateInputs", "init_batch_normalization", "__esmMin", "init_attribute_with_cache_key", "init_glsl_source", "init_types", "inferenceHandler", "inputs", "attributes", "node", "epsilon", "momentum", "spatial", "createAttributeWithCacheKey", "glsl", "getGlsl", "rank", "scaleWidth", "scaleHeight", "shaderSource", "X", "scale", "B", "mean", "var_", "GlslContext", "GlslLib", "GlslLibRoutine", "GlslLibRoutineNode", "TopologicalSortGlslRoutines", "init_glsl_definitions", "__esmMin", "glContext", "programInfo", "inputTextureLayouts", "outputTextureLayout", "context", "routineBody", "dependencies", "name", "node", "nodes", "cycleCheck", "alreadyTraversed", "result", "graphNodes", "root", "i", "glslAdd", "name", "glslDiv", "glslMul", "glslSub", "glslEqual", "glslGreater", "glslLess", "glslAnd", "glslOr", "glslXor", "glslPow", "glslBuiltinBinary", "glslPRelu", "fname", "createBinaryProgramInfoLoader", "createBinaryProgramInfo", "add", "and", "div", "equal", "greater", "less", "mul", "or", "pow", "pRelu", "sub", "xor", "init_binary_op", "__esmMin", "init_util", "init_glsl_definitions", "init_glsl_source", "init_types", "handler", "inputs", "glslFunc", "outputTensorType", "cacheKey", "textureType", "isBroadcast", "ShapeUtil", "outputShape", "usePackedTexture", "calculatedShape", "BroadcastUtil", "outputRank", "aRank", "bRank", "aBcast", "bBcast", "glsl", "getGlsl", "shaderSource", "cast", "parseCastAttributes", "validateInputs", "init_cast", "__esmMin", "init_util", "handler", "inputs", "to", "node", "ProtoUtil", "createPackedConcatProgramMetadata", "createPackedConcatProgramInfo", "createPackedConcatProgramInfoLoader", "getShiftedChannelsSnippet", "init_concat_packed", "__esmMin", "init_glsl_source", "init_types", "init_utils", "init_packing_utils", "inputCount", "cacheHint", "_v", "i", "handler", "metadata", "inputs", "axis", "inputShape", "outputShape", "dataNShape", "axisIndex", "rank", "coords", "getChannels", "dtype", "getCoordsDataType", "unpackChannel", "unpackFromChannel", "shapes", "channels", "getGlChannels", "offsets", "channel", "lastChannels", "allChannels", "getValueSnippet", "shift", "lastIndex", "glsl", "getGlsl", "shaderSource", "x", "attributes", "channelIdx", "c", "idx", "concat", "createUnpackedConcatProgramMetadata", "createUnpackedConcatProgramInfo", "createUnpackedConcatProgramInfoLoader", "getTextureIndexWhereDataResidesLinearSearch", "getTextureIndexWhereDataResidesBinarySearch", "getFetchDataFromCorrectTextureMethod", "getGetSizeInConcatAxisValueFromIndexMethod", "parseConcatAttributes", "validateInputs", "init_concat", "__esmMin", "init_attribute_with_cache_key", "init_types", "init_concat_packed", "inferenceHandler", "inputs", "attributes", "createPackedConcatProgramInfoLoader", "inputCount", "cacheHint", "_v", "i", "_handler", "metadata", "axis", "inputShape", "outputShape", "dataNShape", "axisIndex", "rank", "sizeInConcatAxis", "previousSum", "getTextureIndexWhereDataResidesMethod", "fetchDataFromCorrectTextureMethod", "getSizeInConcatAxisValueFromIndexMethod", "shaderSource", "handler", "size", "numberOfTensors", "tensorRank", "codeLines", "node", "createAttributeWithCacheKey", "inputType", "inputDimensionality", "input", "glslAbs", "glslBuiltinUnary", "glslAcos", "glslAsin", "glslAtan", "glslCeil", "glslCos", "glslElu", "alpha", "name", "glslExp", "glslFloor", "glslClip", "min", "max", "glslIdentity", "glslLeakyRelu", "glslLog", "glslNeg", "glslNot", "glslSin", "glslRelu", "glslSigmoid", "glslSqrt", "glslTan", "glslTanh", "createElementwiseProgramInfo", "createElementwiseProgramInfoLoader", "abs", "acos", "asin", "atan", "clip", "parseClipAttributes", "clipV11", "generateClipAttributesFromInputs", "ceil", "cos", "elu", "parseEluAttributes", "exp", "floor", "identity", "leakyRelu", "parseLeakyReluAttributes", "log", "neg", "not", "relu", "sigmoid", "sin", "sqrt", "tan", "tanh", "init_unary_op", "__esmMin", "init_attribute_with_cache_key", "init_util", "init_glsl_definitions", "init_glsl_source", "init_types", "handler", "metadata", "input", "glslFunc", "textureType", "glsl", "getGlsl", "cacheKey", "inputs", "attributes", "node", "createAttributeWithCacheKey", "MIN_CLIP", "MAX_CLIP", "getActivationSnippet", "attributes", "func", "glslRelu", "glslSigmoid", "glslClip", "activationName", "activationFunction", "applyActivation", "parseInternalActivationAttributes", "init_fuse_utils", "__esmMin", "init_util", "init_unary_op", "activation", "clipMin", "clipMax", "MIN_CLIP", "MAX_CLIP", "createUnpackedGroupedConvProgramMetadata", "createUnpackedGroupedConvProgramInfo", "createUnpackedGroupedConvProgramInfoLoader", "init_conv_grouped", "__esmMin", "init_instrument", "init_glsl_source", "init_types", "init_conv", "init_fuse_utils", "hasBias", "cacheHint", "inferenceHandler", "inputs", "metadata", "attributes", "processBias", "xShape", "wShape", "outputChannelsPerGroup", "Logger", "outputShape", "calculateOutputShape", "glsl", "getGlsl", "activationFunction", "applyActivation", "getActivationSnippet", "shaderSource", "createPackedIm2ColProgramMetadata", "createPackedIm2ColProgramInfo", "createPackedIm2ColProgramInfoLoader", "init_im2col_pack", "__esmMin", "init_glsl_source", "init_types", "init_packing_utils", "cacheHint", "inferenceHandler", "metadata", "x", "w", "outputShape", "attributes", "xshape", "wshape", "rowDim", "colDim", "rank", "im2colShape", "kernelSize", "unpackChannel", "unpackFromChannel", "glsl", "getGlsl", "unrolled", "row", "col", "shaderSource", "createMatmulProgramInfo", "metadata", "inputs", "activationAttributes", "aShape", "bShape", "outputShape", "BroadcastUtil", "coordsDataType", "getCoordsDataType", "allGlChannels", "getGlChannels", "activationFunction", "applyActivation", "getActivationSnippet", "hasBias", "processBias", "getBiasForMatmulSnippet", "getBiasForMatmul", "rank", "arank", "brank", "sharedDim", "shaderSource", "createMatmulProgramInfoLoader", "createMatmulProgramMetadata", "inShape", "outShape", "isPacked", "unpackedCoordsSnippet", "inRank", "outRank", "rankDiff", "_s", "i", "coordsSnippet", "d", "isInputScalar", "ShapeUtil", "output", "matMul", "parseMatMulAttributes", "validateInputs", "init_matmul", "__esmMin", "init_util", "init_types", "init_utils", "init_fuse_utils", "init_matmul_pack", "inferenceHandler", "attributes", "createPackedMatmulProgramInfoLoader", "node", "parseInternalActivationAttributes", "cacheHint", "getBcastSamplerForMatmul", "coordsDataType", "allGlChannels", "inputs", "outShape", "unpackedACoordsSnippet", "unpackedBCoordsSnippet", "inAShape", "inBShape", "inARank", "inBRank", "outRank", "rankADiff", "rankBDiff", "_s", "i", "broadcastADims", "BroadcastUtil", "broadcastBDims", "coordsASnippet", "d", "coordsBSnippet", "swapDimSnippet", "getA", "rank", "res", "getB", "createPackedMatmulProgramMetadata", "createPackedMatmulProgramInfo", "createPackedMatmulProgramInfoLoader", "init_matmul_pack", "__esmMin", "init_util", "init_glsl_source", "init_types", "init_utils", "init_fuse_utils", "init_matmul", "hasBias", "cacheHint", "inferenceHandler", "metadata", "activationAttributes", "processBias", "aShape", "bShape", "outputShape", "isBroadcast", "ShapeUtil", "sharedDim", "sharedDimIndex", "aRank", "bRank", "glsl", "getGlsl", "getCoordsDataType", "getGlChannels", "activationFunction", "applyActivation", "getActivationSnippet", "getBiasForMatmulSnippet", "getBiasForMatmul", "getBcastedSamplerForMatmulSnippet", "getSamplerAInLoopSnippet", "getSamplerBInLoopSnippet", "getOutputCoordsSnippet", "shaderSource", "conv2DPacked", "init_conv_pack", "__esmMin", "init_conv", "init_im2col_pack", "init_matmul_pack", "inferenceHandler", "inputs", "attributes", "xshape", "kshape", "outputShape", "calculateOutputShape", "im2colOutput", "createPackedIm2ColProgramInfoLoader", "kernelReshaped", "matmulInputs", "matmulOutput", "createPackedMatmulProgramInfoLoader", "createIm2ColProgramMetadata", "createIm2ColProgramInfo", "createIm2ColProgramInfoLoader", "calculateIm2ColDims", "init_im2col", "__esmMin", "init_types", "cacheHint", "_inferenceHandler", "metadata", "x", "w", "outputShape", "attributes", "xshape", "wshape", "rank", "im2colDims", "shaderSource", "inferenceHandler", "inputShape", "kernelShape", "channels", "createDotProductProgramMetadata", "createDotProductProgramInfo", "createDotProductProgramInfoLoader", "init_dot_product", "__esmMin", "init_util", "init_glsl_source", "init_types", "init_fuse_utils", "init_im2col", "hasBias", "attributes", "inferenceHandler", "metadata", "inputs", "outputShape", "xshape", "kshape", "adjustedKernelShape", "im2colShape", "calculateIm2ColDims", "kWidth", "kHeight", "im2colStrides", "ShapeUtil", "im2colWidth", "im2colHeight", "rank", "initValue", "sharedDim", "activationFunction", "applyActivation", "getActivationSnippet", "glsl", "getGlsl", "shaderSource", "calculateOutputShape", "conv", "conv2d", "conv2DUnpackedPointwise", "conv2DUnpacked", "getAdjustedConvAttributes", "parseConvAttributes", "validateInputs", "init_conv", "__esmMin", "init_attribute_with_cache_key", "init_util", "init_conv_grouped", "init_conv_pack", "init_dot_product", "init_fuse_utils", "init_im2col", "init_matmul", "inputShape", "kernelShape", "dilations", "adjustPads", "strides", "batchSize", "inputSpatialShape", "spatialRank", "outChannels", "dilatedKernelShape", "v", "i", "outputSpatialShape", "inferenceHandler", "inputs", "attributes", "adjustedAttributes", "packMode", "isPointwise", "createUnpackedGroupedConvProgramInfoLoader", "conv2DPacked", "xshape", "kshape", "outputShape", "reshapedX", "reshapedK", "matmulInputs", "matmulOutput", "createMatmulProgramInfoLoader", "xIm2Col", "createIm2ColProgramInfoLoader", "dotProductInputs", "createDotProductProgramInfoLoader", "pads", "PoolConvUtil", "newAttributes", "node", "activationAttributes", "parseInternalActivationAttributes", "autoPad", "group", "createAttributeWithCacheKey", "dataChannel", "filterInChannel", "computeTotalPad", "distributePadding", "calculateOutputShapeAndPads", "convTranspose", "convTranspose2d", "createConvTransposeProgramMetadata", "createUnpackedConvTransposeProgramInfo", "createUnpackedConvTransposeProgramInfoLoader", "convTranspose2DUnpacked", "getAdjustedConvTransposeAttributes", "parseConvTransposeAttributes", "validateInputs", "init_conv_transpose", "__esmMin", "init_attribute_with_cache_key", "init_glsl_source", "init_types", "init_fuse_utils", "inDim", "stride", "adj", "kernel", "dilation", "outSize", "totalPad", "autoPad", "pads", "head", "tail", "smallPad", "inputShape", "kernelShape", "dilations", "strides", "outputPadding", "outputShape", "spatialRank", "updateShape", "i", "inferenceHandler", "inputs", "attributes", "adjustedAttributes", "hasBias", "cacheHint", "metadata", "valueInit", "xShape", "wShape", "outputChannelsPerGroup", "inputChannelsPerGroup", "glsl", "getGlsl", "activationFunction", "applyActivation", "getActivationSnippet", "shaderSource", "newAttributes", "node", "activationAttributes", "parseInternalActivationAttributes", "group", "createAttributeWithCacheKey", "dataChannel", "filterInChannel", "featureMaps", "transposeProgramMetadata", "transpose", "parseTransposeAttributes", "createTransposeProgramInfo", "getAdjustedPerm", "getOutputShape", "getPermFunctionBody", "validateInputs", "init_transpose", "__esmMin", "init_attribute_with_cache_key", "init_util", "init_types", "inferenceHandler", "inputs", "attributes", "node", "createAttributeWithCacheKey", "_inferenceHandler", "input", "perm", "inputShape", "unpackedOutputShape", "rank", "shaderSource", "ShapeUtil", "name", "reverseFunc", "i", "depthToSpace", "parseDepthToSpaceAttributes", "validateInputs", "init_depth_to_space", "__esmMin", "init_transpose", "inferenceHandler", "inputs", "attributes", "blocksize", "blocksizeSqr", "transposePerm", "firstReshapeShape", "firstReshapedTensor", "transposeAttributes", "transposeOutput", "transpose", "secondReshapeShape", "node", "mode", "flatten", "parseFlattenAttributes", "validateInputs", "init_flatten", "__esmMin", "init_util", "inferenceHandler", "inputs", "axis", "outputDims", "ShapeUtil", "node", "r", "NUMBER_TYPES", "init_operators", "__esmMin", "gather", "parseGatherAttributes", "gatherProgramMetadata", "createGatherProgramInfo", "createGatherProgramInfoLoader", "validateInputs", "init_gather", "__esmMin", "init_attribute_with_cache_key", "init_operators", "init_util", "init_types", "inferenceHandler", "inputs", "attributes", "node", "createAttributeWithCacheKey", "_handler", "metadata", "axis", "inputShape", "indexDataShape", "outputShape", "ShapeUtil", "indexCopyOps", "i", "orank", "irank", "iDrank", "shaderSource", "handler", "tensorRank", "NUMBER_TYPES", "gemm", "parseGemmAttributes", "parseGemmAttributesV7", "parseGemmAttributesV11", "createGemmProgramInfoLoader", "createGemmProgramInfo", "validateInputs", "init_gemm", "__esmMin", "init_attribute_with_cache_key", "init_util", "init_types", "inferenceHandler", "inputs", "attributes", "node", "isOptionalC", "transA", "transB", "alpha", "beta", "createAttributeWithCacheKey", "metadata", "aShape", "bShape", "M", "N", "GemmUtil", "outputShape", "sharedDim", "line", "rank", "declareC", "broadcastC", "calculateC", "shaderSource", "imageScaler", "parseImageScalerAttributes", "imageScalerProgramMetadata", "createImageScalerProgramInfo", "createImageScalerProgramInfoLoader", "createGetBiasMethod", "validateInputs", "init_image_scaler", "__esmMin", "init_attribute_with_cache_key", "init_types", "inferenceHandler", "inputs", "attributes", "node", "scale", "bias", "createAttributeWithCacheKey", "_handler", "metadata", "outputShape", "rank", "shaderSource", "handler", "numChannels", "codeLines", "i", "instanceNormalization", "parseInstanceNormalizationAttributes", "meanAndVarianceProgramMetadata", "createMeanAndVarianceProgramInfo", "createMeanAndVarianceProgramInfoLoader", "computeOutputProgramMetadata", "createComputeOutputProgramInfo", "createComputeOutputProgramInfoLoader", "validateInputs", "init_instance_normalization", "__esmMin", "init_glsl_source", "init_types", "inferenceHandler", "inputs", "epsilon", "meanAndVariance", "node", "metadata", "input", "xDims", "channel", "channelSize", "outputShape", "shaderSource", "meanAndVarianceShape", "glsl", "getGlsl", "textureWidth", "textureHeight", "meanAndVarianceWidth", "meanAndVarianceHeight", "X", "scale", "B", "createLrnProgramInfo", "inputs", "attributes", "C", "rank", "from", "to", "alpha", "bias", "beta", "shaderSource", "lrnProgramMetadata", "createLrnProgramInfoLoader", "lrn", "parseLrnAttributes", "validateInputs", "init_lrn", "__esmMin", "init_attribute_with_cache_key", "init_types", "inferenceHandler", "node", "size", "createAttributeWithCacheKey", "padProgramMetadata", "padV2", "parsePadAttributesV2", "padV11", "parsePadAttributesV11", "generatePadAttributesFromInputs", "createPadProgramInfo", "validateInputsV2", "validateInputsV11", "getPadFunction", "getPadConstant", "getPadReflect", "getPadEdge", "init_pad", "__esmMin", "init_attribute_with_cache_key", "init_util", "init_glsl_source", "init_types", "inferenceHandler", "inputs", "attributes", "node", "mode", "value", "pads", "createAttributeWithCacheKey", "attrubutes", "input", "outputShape", "ShapeUtil", "rank", "shaderSource", "glsl", "getGlsl", "width", "height", "strides", "shape", "block", "i", "averagePool", "parseAveragePoolAttributes", "createAveragePoolProgramInfo", "globalAveragePool", "parseGlobalAveragePoolAttributes", "maxPool", "parseMaxPoolAttributes", "createMaxPoolProgramInfo", "getAdjustedPoolAttributesAndOutputShape", "globalMaxPoolAttributes", "globalMaxPoolMetadata", "globalMaxPool", "validateInputs", "generatePoolingCode", "copyArray", "offsetToIndices", "init_pool", "__esmMin", "init_attribute_with_cache_key", "init_util", "init_types", "inferenceHandler", "inputs", "attributes", "metadata", "node", "autoPad", "ceilMode", "countIncludePad", "kernelShape", "strides", "pads", "createAttributeWithCacheKey", "isGlobalOperator", "adjustedAttributes", "outputShape", "kernelSize", "ShapeUtil", "op1", "op2", "shaderSource", "storageOrder", "dilations", "inputShape", "hasDilations", "PoolConvUtil", "newAttributes", "inputDims", "start", "rank", "kw", "sw", "pwStart", "pwEnd", "dimW", "codeW", "codeH", "codeHEnd", "kh", "sh", "phStart", "phEnd", "dimH", "kernelStrides", "stridesRank", "padsRank", "offsetToIndicesFunction", "copyInputDims", "copyPads", "copyKernelStrides", "copyStrides", "hasPads", "sum", "cur", "padCode", "array", "arrayName", "block", "i", "reduce", "parseReduceAttributes", "createReduceProgramInfo", "validateInputs", "reduceSum", "reduceMean", "reduceMax", "reduceMin", "reduceProd", "reduceLogSum", "reduceLogSumSquare", "init_reduce", "__esmMin", "init_attribute_with_cache_key", "init_operators", "init_util", "init_types", "inferenceHandler", "inputs", "attributes", "name", "reduceOp", "reduceProgramMetadata", "node", "axes", "keepDims", "createAttributeWithCacheKey", "_handler", "_name", "outputShape", "iRank", "idxCopy", "ShapeUtil", "ops", "reduceOps", "k", "shaderSource", "NUMBER_TYPES", "size", "idxZero", "reshape", "init_reshape", "__esmMin", "init_util", "handler", "inputs", "reshapedDims", "ShapeUtil", "upsampleProgramMetadata", "upsample", "parseUpsampleAttributesV7", "parseUpsampleAttributesV9", "parseUpsampleAttributes", "createUpsampleProgramInfo", "validateInputs", "scalesValidation", "init_upsample", "__esmMin", "init_attribute_with_cache_key", "init_glsl_source", "init_types", "inferenceHandler", "inputs", "attributes", "node", "opset", "isResize", "mode", "scales", "extrapolationValue", "coordinateTransformMode", "needRoiInput", "useExtrapolation", "nearestMode", "cubicCoefficientA", "excludeOutside", "useNearest2xOptimization", "roiInputIdx", "scalesInputIdx", "sizesInputIdx", "createAttributeWithCacheKey", "glsl", "getGlsl", "inputWidth", "inputHeight", "outputShape", "dim", "i", "outputWidth", "outputHeight", "outputPitches", "inputPitches", "precalculatedPitches", "d", "getInputFloatFunction", "shaderSource", "x", "attribute", "scale", "resizeProgramMetadata", "resize", "parseResizeAttributesV10", "parseResizeAttributesV11", "createPackedResizeProgramInfo", "prepareInputs", "parseScalesData", "parseScalesDataFromOutputSize", "init_resize_packed", "__esmMin", "init_glsl_source", "init_types", "init_utils", "init_packing_utils", "init_upsample", "inferenceHandler", "inputs", "attributes", "validateInputs", "node", "parseUpsampleAttributes", "glsl", "getGlsl", "scales", "outputShape", "s", "dim", "outputHeight", "outputWidth", "inputShape", "inputHeight", "inputWidth", "scalesHeight", "scalesWidth", "getSourceFracIndex", "coordsDataType", "getCoordsDataType", "unpackChannel", "unpackFromChannel", "shaderSource", "xDims", "outputSizes", "scalesTensor", "sizesTensor", "yDims", "i", "scale", "mode", "isResize", "scalesValidation", "length", "end", "shape", "validateInputs", "init_shape", "__esmMin", "init_tensor", "_inferenceHandler", "inputs", "Tensor", "sliceProgramMetadata", "slice", "parseSliceAttributes", "createSliceProgramInfo", "validateInputs", "sliceV10", "generateSliceAttributesFromInputs", "validateInputsV10", "init_slice", "__esmMin", "init_attribute_with_cache_key", "init_operators", "init_util", "init_types", "inferenceHandler", "inputs", "attributes", "node", "starts", "ends", "axes", "createAttributeWithCacheKey", "_inferenceHandler", "input", "_val", "i", "normalizedAxes", "ShapeUtil", "start", "end", "outputShape", "sliceOps", "shaderSource", "NUMBER_TYPES", "cacheKey", "softmaxComputeMaxProgramMetadata", "softmaxComputeScaleProgramMetadata", "softmaxProgramMetadata", "softmax", "parseSoftmaxAttributes", "parseSoftmaxAttributesV13", "softmaxV13", "computeSoftmax", "createComputeMaxProgramInfo", "createComputScaleProgramInfo", "createSoftMaxProgramInfo", "validateInputs", "init_softmax", "__esmMin", "init_attribute_with_cache_key", "init_util", "init_glsl_source", "init_types", "init_transpose", "inferenceHandler", "inputs", "attributes", "inputShape", "axis", "ShapeUtil", "logicalRowCount", "featureCount", "node", "createAttributeWithCacheKey", "rank", "isTransposeRequired", "transposedInputShape", "perm", "transposedInputs", "transposeAttribute", "_", "i", "p", "transpose", "output", "computeMaxProgramInfo", "max", "computeScaleProgramInfo", "scale", "softMaxProgramInfo", "input", "outputShape", "textureWidth", "textureHeight", "glsl", "getGlsl", "shaderSource", "maxElementPerLogicalRow", "normalizationPerLogicalRow", "splitProgramMetadata", "split", "parseSplitAttributes", "getProgramCount", "createSplitProgramInfo", "validateInputs", "init_split", "__esmMin", "init_attribute_with_cache_key", "init_util", "init_types", "inferenceHandler", "inputs", "attributes", "axis", "ShapeUtil", "count", "output", "i", "node", "numOutputs", "createAttributeWithCacheKey", "_inferenceHandler", "offsets", "SplitUtil", "input", "index", "shapes", "offset", "outputShape", "shaderSource", "squeeze", "squeezeV13", "parseSqueezeAttributes", "validateInputs", "validateInputsV13", "init_squeeze", "__esmMin", "init_util", "inferenceHandler", "inputs", "axes", "outputShape", "ShapeUtil", "node", "sum", "createSumProgramInfo", "validateInputs", "init_sum", "__esmMin", "init_glsl_source", "init_types", "inferenceHandler", "inputs", "sumProgramMetadata", "_v", "glsl", "getGlsl", "outputShape", "shaderSource", "i", "length", "j", "tile", "createTileProgramInfo", "validateInputs", "init_tile", "__esmMin", "init_operators", "init_types", "inferenceHandler", "inputs", "tileProgramMetadata", "_handler", "inputShape", "outputShape", "tileOps", "i", "rank", "shaderSource", "NUMBER_TYPES", "unsqueeze", "unsqueezeV13", "parseUnsqueezeAttributes", "validateInputs", "validateInputsV13", "init_unsqueeze", "__esmMin", "init_util", "inferenceHandler", "inputs", "axes", "outputShape", "ShapeUtil", "node", "WEBGL_OP_RESOLVE_RULES", "init_op_resolve_rules", "__esmMin", "init_batch_normalization", "init_binary_op", "init_cast", "init_concat", "init_conv", "init_conv_transpose", "init_depth_to_space", "init_flatten", "init_gather", "init_gemm", "init_image_scaler", "init_instance_normalization", "init_lrn", "init_matmul", "init_pad", "init_pool", "init_reduce", "init_reshape", "init_resize_packed", "init_shape", "init_slice", "init_softmax", "init_split", "init_squeeze", "init_sum", "init_tile", "init_transpose", "init_unary_op", "init_unsqueeze", "init_upsample", "abs", "acos", "add", "and", "asin", "atan", "averagePool", "parseAveragePoolAttributes", "batchNormalization", "parseBatchNormalizationAttributes", "cast", "parseCastAttributes", "ceil", "clip", "parseClipAttributes", "clipV11", "concat", "parseConcatAttributes", "conv", "parseConvAttributes", "convTranspose", "parseConvTransposeAttributes", "cos", "div", "identity", "depthToSpace", "parseDepthToSpaceAttributes", "equal", "elu", "parseEluAttributes", "exp", "flatten", "parseFlattenAttributes", "floor", "gather", "parseGatherAttributes", "gemm", "parseGemmAttributesV7", "parseGemmAttributesV11", "globalAveragePool", "parseGlobalAveragePoolAttributes", "globalMaxPool", "greater", "imageScaler", "parseImageScalerAttributes", "instanceNormalization", "parseInstanceNormalizationAttributes", "leakyRelu", "parseLeakyReluAttributes", "less", "lrn", "parseLrnAttributes", "log", "matMul", "parseMatMulAttributes", "maxPool", "parseMaxPoolAttributes", "mul", "neg", "not", "or", "padV2", "parsePadAttributesV2", "padV11", "parsePadAttributesV11", "pow", "pRelu", "reduceLogSum", "parseReduceAttributes", "reduceMax", "reduceMean", "reduceMin", "reduceProd", "reduceSum", "reduceLogSumSquare", "relu", "reshape", "resize", "parseResizeAttributesV10", "parseResizeAttributesV11", "shape", "sigmoid", "sin", "sliceV10", "slice", "parseSliceAttributes", "softmax", "parseSoftmaxAttributes", "softmaxV13", "parseSoftmaxAttributesV13", "split", "parseSplitAttributes", "sqrt", "squeeze", "parseSqueezeAttributes", "squeezeV13", "sub", "sum", "tan", "tanh", "tile", "transpose", "parseTransposeAttributes", "upsample", "parseUpsampleAttributesV7", "parseUpsampleAttributesV9", "unsqueeze", "parseUnsqueezeAttributes", "unsqueezeV13", "xor", "replaceInlines", "script", "inlineDefs", "match", "INLINE_FUNC_DEF_REGEX", "params", "s", "tokens", "v", "name", "regexString", "FUNC_CALL_REGEX", "regex", "type", "variable", "declLine", "newBody", "paramRedecLine", "i", "replacement", "init_glsl_function_inliner", "__esmMin", "squeezeShape", "shape", "axis", "newShape", "keptDims", "isEmptyArray", "axes", "parseAxisParam", "j", "i", "rank", "_s", "assert", "ax", "isInt", "a", "sizeFromShape", "size", "sizeToSquarishShape", "width", "PreferLogicalStrategy", "init_texture_layout_strategy", "__esmMin", "init_instrument", "init_util", "maxTextureSize", "prefs", "wh", "isPacked", "wsize", "b", "hsize", "Logger", "logShape", "_d", "d", "CoordsGlslLib", "init_glsl_coordinate_lib", "__esmMin", "init_util", "init_glsl_definitions", "init_glsl_source", "init_texture_layout_strategy", "init_utils", "GlslLib", "context", "funcName", "GlslLibRoutine", "outputLayout", "outShape", "outTexShape", "result", "floatTextureSetRGBASource", "getGlsl", "floatTextureSetRGBAFuncName", "floatTextureSetRSource", "floatTextureSetRFuncName", "_shape", "texShape", "packedTexShape", "source", "shape", "ArrayUtil", "texelsInLogicalRow", "texelsInBatch", "texelsInBatchN", "batches", "coords", "b", "rank", "strides", "i", "coordsToCompute", "coordsFromIndexSnippet", "stride", "line1", "line2", "glsl", "samplerName", "inputLayout", "generateShaderFuncNameFromInputSamplerName", "outCoordFuncName", "generateShaderFuncNameFromInputSamplerNameAtOutCoords", "name", "inShape", "texFuncSnippet", "inRank", "outRank", "broadcastDims", "BroadcastUtil", "type", "getCoordsDataType", "rankDiff", "coordsSnippet", "fields", "getGlChannels", "d", "unpackedCoordsSnippet", "_s", "output", "isInputScalar", "ShapeUtil", "isOutputScalar", "rows", "cols", "swapLastDimsSnippet", "inTexShape", "texNumR", "texNumC", "packedSampler", "valuesPerRow", "squeezedShape", "keptDims", "newInputShape", "squeezeInputShape", "params", "newInputLayout", "samplerRoutine", "getSqueezedParams", "index", "tNumR", "tNumC", "newShape", "squeezeShape", "stride0", "stride1", "routine", "revDims", "stride2", "stride3", "stride4", "xScale", "yScale", "stridesBlock", "body", "layout", "varName", "width", "height", "transpose", "EncodingGlslLib", "init_glsl_encoding_lib", "__esmMin", "init_glsl_definitions", "_EncodingGlslLib", "GlslLib", "context", "GlslLibRoutine", "endianness", "b", "a", "c", "FragColorGlslLib", "init_glsl_fragcolor_lib", "__esmMin", "init_glsl_definitions", "init_glsl_source", "GlslLib", "context", "glsl", "getGlsl", "GlslLibRoutine", "ShapeUtilsGlslLib", "init_glsl_shape_utils_lib", "__esmMin", "init_glsl_definitions", "_ShapeUtilsGlslLib", "GlslLib", "context", "outputRank", "result", "name", "i", "shape", "rank", "dimOffset", "funcName", "block", "body", "GlslLibRoutine", "strides", "stridesBlock", "shapeInit", "VecGlslLib", "init_glsl_vec_lib", "__esmMin", "init_glsl_definitions", "GlslLib", "context", "rank", "nameOp", "result", "name", "fname", "assignmentBlock", "i", "body", "GlslLibRoutine", "block", "glslRegistry", "init_glsl_registered_libs", "__esmMin", "init_glsl_coordinate_lib", "init_glsl_encoding_lib", "init_glsl_fragcolor_lib", "init_glsl_shape_utils_lib", "init_glsl_vec_lib", "EncodingGlslLib", "FragColorGlslLib", "VecGlslLib", "ShapeUtilsGlslLib", "CoordsGlslLib", "GlslPreprocessor", "init_glsl_preprocessor", "__esmMin", "init_glsl_definitions", "init_glsl_function_inliner", "init_glsl_registered_libs", "init_glsl_source", "glContext", "programInfo", "inputTextureLayouts", "outputTextureLayout", "GlslContext", "glslRegistry", "name", "lib", "map", "libName", "routinesInLib", "routine", "key", "currentNode", "GlslLibRoutineNode", "dependencies", "i", "node", "source", "getDefaultFragShaderMain", "replaceInlines", "getFragShaderPreamble", "script", "routinesIncluded", "routines", "nodes", "classAndRoutine", "TopologicalSortGlslRoutines", "samplers", "variables", "uniformLines", "sampler", "variable", "ProgramManager", "init_program_manager", "__esmMin", "init_esm", "init_instrument", "init_glsl_preprocessor", "init_glsl_source", "profiler", "glContext", "textureLayoutStrategy", "key", "artifact", "buildArtifact", "inputs", "output", "gl", "program", "err", "Logger", "a", "programInfo", "inputTextureLayouts", "outputTextureLayout", "preprocessor", "GlslPreprocessor", "fragScript", "fragShaderScript", "vertexShaderScript", "getVertexShaderSource", "env", "fragShader", "td", "width", "height", "attribLocations", "positionHandle", "textureCoordHandle", "uniformLocations", "variables", "textures", "texturePosition", "name", "type", "location", "arrayLength", "value", "v", "uniformHandle", "position", "samplers", "sampler", "variable", "reference", "TextureManager", "init_texture_manager", "__esmMin", "init_instrument", "init_texture_data_encoder", "glContext", "layoutStrategy", "profiler", "config", "dataType", "layout", "data", "usage", "textureDataType", "encoder", "width", "height", "key", "inUseTextures", "idleTextures", "texture", "Logger", "td", "channels", "dataSize", "a", "b", "dataId", "subscribers", "resolve", "tensorData", "textureData", "deleteTexture", "index", "_dataType", "WebGLSessionHandler", "init_session_handler", "__esmMin", "init_instrument", "init_opset", "init_inference_handler", "init_op_resolve_rules", "init_program_manager", "init_texture_layout_strategy", "init_texture_manager", "backend", "context", "PreferLogicalStrategy", "ProgramManager", "TextureManager", "WebGLInferenceHandler", "graph", "initializers", "v", "tensorId", "isPacked", "textureData", "Logger", "td", "node", "opsets", "op", "resolveOperator", "WEBGL_OP_RESOLVE_RULES", "linearSearchLastTrue", "arr", "i", "WebGLContext", "init_webgl_context", "__esmMin", "init_esm", "init_texture_data_encoder", "init_utils", "gl", "version", "width", "height", "encoder", "data", "texture", "buffer", "dataSize", "dataType", "channels", "positionHandle", "textureCoordHandle", "vertexShader", "fragShader", "program", "shaderSource", "shaderType", "shader", "position", "uniformHandle", "env", "error", "label", "usage", "RedFloat32DataEncoder", "RGBAFloatDataEncoder", "Uint8DataEncoder", "unit", "geometry", "fb", "internalFormat", "frameBuffer", "isComplete", "fragmentShader", "gl2", "ext", "query", "available", "disjoint", "timeElapsed", "repeatedTry", "fenceContext", "isFencePassed", "status", "resolve", "index", "x", "resolveFn", "isDoneFn", "createWebGLContext", "contextId", "context", "cache", "offscreenCanvas", "createOffscreenCanvas", "createNewWebGLContext", "canvas", "createCanvas", "gl", "contextAttributes", "ca", "WebGLContext", "err", "Logger", "init_webgl_context_factory", "__esmMin", "init_instrument", "init_webgl_context", "WebGLBackend", "init_backend_webgl", "__esmMin", "init_esm", "init_instrument", "init_session_handler", "init_webgl_context_factory", "env", "value", "createWebGLContext", "Logger", "context", "WebGLSessionHandler", "resolveBackend", "hint", "hints", "backendHint", "cache", "backendsCache", "backend", "tryLoadBackend", "backendObj", "isBackend", "init", "obj", "o", "init_backend", "__esmMin", "init_backend_webgl", "WebGLBackend", "KernelOp", "ExecutionPlan", "init_execution_plan", "__esmMin", "init_instrument", "op", "node", "graph", "ops", "profiler", "graphNodes", "i", "resolved", "input", "sessionHandler", "modelInputs", "inferenceHandler", "graphInputs", "index", "sequence", "graphValues", "rear", "thisOpIndex", "thisOp", "inputList", "inputTensors", "Logger", "t", "outputList", "output", "j", "downstreamNodes", "_output", "currentDownstreamNodeIndex", "currentDownstreamNode", "k", "outputIndex", "outputTensor", "import_onnx", "ortFbs", "Attribute", "init_attribute", "__esmMin", "init_ort_generated", "init_tensor", "init_util", "onnxruntime", "_Attribute", "attributes", "attr", "key", "type", "value", "defaultValue", "valueAndType", "attrType", "LongUtil", "arr", "numberValue", "i", "maybeLong", "Tensor", "decodeUtf8String", "ints", "strings", "tensors", "import_onnx", "ortFbs", "Graph", "Value", "Node", "GraphImpl", "init_graph", "__esmMin", "init_attribute", "init_ort_generated", "init_tensor", "init_util", "onnxruntime", "graphProto", "initializer", "valueInfo", "ProtoUtil", "_nodeProto", "name", "Attribute", "graph", "graphInitializer", "dataIndices", "nodesIndices", "inputValueNames", "currentIndex", "index", "value", "Tensor", "nodeProto", "pick", "node", "output", "dataIndex", "input", "inputName", "j", "type", "shape", "dims", "k", "LongUtil", "outputName", "starters", "i", "nodesStack", "nodesState", "nodeIndex", "outgoingEdgeIndex", "data", "downstreamNodeIndex", "offset", "newIndices", "nodePossition", "ind", "currentData", "inputValueIndex", "outputValueIndex", "nodesConsumingOutput", "delIndex", "replaceIndex", "n", "next", "child", "MIN_CLIP", "MAX_CLIP", "import_onnx", "ortFbs", "Model", "init_model", "__esmMin", "init_flatbuffers", "init_graph", "init_ort_generated", "init_util", "onnxruntime", "buf", "graphInitializer", "isOrtFormat", "onnxError", "e", "modelProto", "LongUtil", "Graph", "fb", "flatbuffers", "ortModel", "i", "opsetId", "Session", "init_session", "__esmMin", "init_backend", "init_execution_plan", "init_instrument", "init_model", "config", "Profiler", "arg", "byteOffset", "length", "backend", "resolveBackend", "Model", "isOrtFormat", "buf", "arr", "modelProtoBlob", "graphInitializer", "ExecutionPlan", "inputs", "inputTensors", "outputTensors", "modelInputNames", "sortedInputs", "sortedInputsIndex", "tensor", "modelInputIndices", "modelValues", "graphInputDims", "i", "graphInput", "graphInputTypes", "givenInputs", "expectedType", "actualType", "noneDimSupported", "expectedDims", "actualDims", "modelOutputNames", "output", "graph", "nodes", "OnnxjsSessionHandler", "init_session_handler_inference", "__esmMin", "init_esm", "init_tensor", "session", "feeds", "_fetches", "_options", "inputMap", "name", "feed", "Tensor", "outputMap", "output", "tensor", "backend_onnxjs_exports", "__export", "onnxjsBackend", "OnnxjsBackend", "init_backend_onnxjs", "__esmMin", "init_session", "init_session_handler_inference", "pathOrBuffer", "options", "session", "Session", "OnnxjsSessionHandler", "init_wasm_utils_env", "__esmMin", "main_exports", "__export", "main_default", "WORKER_NAME", "isProxyWorker", "init_main", "__esmMin", "init_wasm_core_impl", "init_wasm_factory", "init_wasm_utils_import", "ev", "type", "message", "initializeWebAssembly", "initRuntime", "err", "epName", "env", "initEp", "buffer", "bufferData", "copyFromExternalBuffer", "model", "options", "createSession", "sessionMetadata", "releaseSession", "sessionId", "inputIndices", "inputs", "outputIndices", "run", "outputs", "o", "extractTransferableBuffers", "endProfiling", "urlOverride", "scriptSrc", "ort_wasm_simd_threaded_jsep_exports", "__export", "ort_wasm_simd_threaded_jsep_default", "r", "e", "init_ort_wasm_simd_threaded_jsep", "__esmMin", "t", "k", "R", "Y", "P", "a", "D", "F", "B", "I", "u", "U", "f", "G", "c", "d", "b", "g", "m", "p", "h", "v", "n", "Ye", "o", "i", "Qe", "y", "w", "A", "_", "C", "O", "T", "S", "W", "E", "Dn", "x", "wn", "He", "Tr", "Ar", "M", "mn", "Sr", "hn", "On", "Re", "An", "or", "N", "H", "j", "$", "z", "L", "V", "q", "J", "X", "Q", "Z", "K", "rr", "er", "tr", "nr", "ar", "sr", "Er", "Mr", "Rr", "Pr", "Ir", "Ur", "jr", "$r", "Gr", "zr", "Yr", "Lr", "Vr", "qr", "Jr", "Zr", "oe", "se", "me", "he", "ve", "ye", "we", "Ee", "xe", "Me", "ke", "Pe", "Fe", "Be", "Ie", "$e", "rt", "tt", "ot", "le", "st", "ct", "dt", "bt", "gt", "mt", "pt", "ht", "vt", "yt", "wt", "At", "_t", "St", "Wt", "Et", "xt", "Mt", "Ht", "Rt", "Pt", "Dt", "Ft", "It", "Ut", "Bt", "jt", "$t", "Lt", "Vt", "Qt", "Zt", "mr", "Kt", "rn", "en", "nn", "un", "fn", "ir", "Hr", "s", "l", "Ke", "ur", "fr", "lr", "pr", "Cr", "_r", "hr", "yr", "cr", "dr", "xn", "En", "_n", "Wn", "br", "gr", "vr", "wr", "Cn", "Or", "Sn", "Mn", "Wr", "xr", "kr", "Nr", "Dr", "Fr", "Br", "Xr", "Qr", "Kr", "re", "ee", "te", "ne", "ae", "ie", "ue", "fe", "ce", "de", "be", "ge", "pe", "yn", "vn", "Ae", "_e", "Ce", "Oe", "Te", "Se", "We", "Ne", "Tn", "De", "dn", "Ue", "gn", "je", "Ge", "ze", "Le", "Ve", "qe", "Je", "Xe", "Ze", "Hn", "bn", "kn", "Rn", "et", "nt", "at", "it", "ut", "ft", "lt", "Ct", "Ot", "Tt", "kt", "Nt", "Gt", "zt", "Yt", "qt", "Jt", "Xt", "tn", "an", "on", "sn", "ln", "cn", "Nn", "pn", "Pn", "scriptSrc", "origin", "isSameOrigin", "preload", "createProxyWorker", "importProxyWorker", "embeddedWasmModule", "importWasmModule", "init_wasm_utils_import", "__esmMin", "init_wasm_utils_env", "filename", "prefixOverride", "baseUrl", "absoluteUrl", "blob", "url", "urlOverride", "isMultiThreaded", "wasm", "initialized", "initializing", "aborted", "isMultiThreadSupported", "isSimdSupported", "initializeWebAssembly", "getInstance", "init_wasm_factory", "__esmMin", "init_wasm_utils_import", "flags", "timeout", "numThreads", "multiThreadSupported", "wasmPaths", "wasmPrefixOverride", "mjsPathOverrideFlag", "mjsPathOverride", "wasmPathOverrideFlag", "wasmPathOverride", "objectUrl", "ortWasmFactory", "importWasmModule", "isTimeout", "tasks", "resolve", "reject", "config", "fileName", "scriptDirectory", "module", "what", "allocWasmString", "iterateExtraOptions", "checkLastError", "init_wasm_utils", "__esmMin", "init_wasm_factory", "data", "allocs", "wasm", "getInstance", "dataLength", "dataOffset", "options", "prefix", "seen", "handler", "key", "value", "name", "message", "stack", "paramsOffset", "errorCode", "errorMessagePointer", "errorMessage", "setRunOptions", "init_run_options", "__esmMin", "init_wasm_factory", "init_wasm_utils", "options", "wasm", "getInstance", "runOptionsHandle", "allocs", "runOptions", "tagDataOffset", "allocWasmString", "checkLastError", "iterateExtraOptions", "key", "value", "keyDataOffset", "valueDataOffset", "e", "alloc", "getGraphOptimzationLevel", "getExecutionMode", "appendDefaultOptions", "setExecutionProviders", "setSessionOptions", "init_session_options", "__esmMin", "init_wasm_factory", "init_wasm_utils", "graphOptimizationLevel", "executionMode", "options", "session", "ep", "sessionOptionsHandle", "executionProviders", "allocs", "epName", "deviceType", "keyDataOffset", "allocWasmString", "valueDataOffset", "getInstance", "checkLastError", "webgpuOptions", "epNameDataOffset", "wasm", "sessionOptions", "logIdDataOffset", "logSeverityLevel", "logVerbosityLevel", "optimizedModelFilePathOffset", "name", "value", "nameOffset", "iterateExtraOptions", "key", "e", "alloc", "tensorDataTypeStringToEnum", "tensorDataTypeEnumToString", "getTensorElementSize", "tensorTypeToTypedArrayConstructor", "logLevelStringToEnum", "isGpuBufferSupportedType", "dataLocationStringToEnum", "init_wasm_common", "__esmMin", "type", "typeProto", "dateType", "logLevel", "location", "loadFile", "init_wasm_utils_load_file", "__esmMin", "init_wasm_utils_env", "file", "readFile", "createReadStream", "stream", "chunks", "chunk", "response", "contentLengthHeader", "fileSize", "reader", "buffer", "e", "pages", "offset", "done", "value", "chunkSize", "logLevelPrefix", "doLog", "configLogLevel", "debug", "configureLogger", "LOG", "LOG_DEBUG", "init_log", "__esmMin", "init_wasm_common", "level", "message", "$configLogLevel", "$debug", "logLevel", "msg", "messageLevel", "logLevelStringToEnum", "configLevel", "args", "createView", "init_tensor_view", "__esmMin", "init_wasm_common", "dataBuffer", "type", "tensorTypeToTypedArrayConstructor", "init_types", "__esmMin", "bucketFreelist", "bucketArr", "calcNormalizedBufferSize", "calcBucketBufferSize", "guid", "createNewGpuDataId", "downloadGpuData", "GpuDataManagerImpl", "createGpuDataManager", "init_gpu_data_manager", "__esmMin", "init_log", "init_types", "size", "idx", "sizeForBucket", "backend", "gpuBuffer", "originalSize", "getTargetBuffer", "bufferSize", "gpuReadBuffer", "commandEncoder", "arrayBuffer", "targetBuffer", "key", "id", "data", "srcArrayBuffer", "srcOffset", "srcLength", "gpuDataCache", "gpuBufferForUploading", "LOG_DEBUG", "sourceId", "destinationId", "sourceGpuDataCache", "destinationGpuDataCache", "buffer", "previousBuffer", "usage", "isStorage", "isUniform", "buffers", "gpuData", "cachedData", "maxInFreeList", "freelist", "capturedBuffers", "storage", "sessionId", "pendingBuffers", "args", "AttributeWithCacheKeyImpl", "createAttributeWithCacheKey", "init_attribute_with_cache_key", "__esmMin", "attribute", "name", "MatMulUtil", "BroadcastUtil", "ShapeUtil", "PoolConvUtil", "GemmUtil", "MIN_CLIP", "MAX_CLIP", "init_util", "__esmMin", "a", "b", "adims", "bdims", "isMatMul", "arank", "brank", "crank", "cdims", "cShapeMatMul", "i", "aLen", "bLen", "max", "shape", "finalShape", "inputRank", "finalRank", "_ShapeUtil", "dims", "size", "rank", "newDims", "axis", "start", "end", "strides", "tensorRank", "axes", "x", "perm", "v", "pad", "shape1", "shape2", "_PoolConvUtil", "isGlobalOperator", "inputDims", "kernelShape", "dilations", "pads", "dim", "isChannelLast", "autoPad", "outputDims", "filterDims", "inSize", "stride", "dilation", "kernel", "padHeadIndex", "padTailIndex", "dkernel", "padNeeded", "leftShape", "transLeft", "rightShape", "transRight", "biasShape", "M", "K", "N", "kDim", "WORKGROUP_SIZE", "getWgslMappedType", "tensorTypeToWsglStorageType", "tensorTypeToWsglValueType", "createTensorShapeVariables", "getMaxComponents", "fillVector", "castToF32", "sumVector", "getElementAt", "createIndicesHelper", "inputVariable", "outputVariable", "internalVariable", "ShaderHelperImpl", "createShaderHelper", "getBroadcastDims", "init_common", "__esmMin", "init_wasm_common", "init_util", "type", "components", "mappedType", "dims", "programUniforms", "dim", "ShapeUtil", "size", "dataType", "value", "name", "index", "length", "tensorType", "shapeOrRank", "usage", "useUniform", "rank", "rankIdentity", "indicesType", "valueType", "storageType", "normalizeDim", "implementationUsed", "uniformPrefix", "shape", "strides", "o2iSnippet", "i", "offsetToIndicesImplementation", "offsetToIndices", "varOffset", "offsets", "indicesToOffsetImplementation", "indicesToOffset", "varIndices", "indices", "init", "indicesGet", "idx", "indicesSet", "broadcastedIndicesToOffsetImplementation", "broadcastedIndicesToOffset", "output", "implKey", "setByOffset", "offset", "getByOffset", "getByIndicesImplementation", "getImplementation", "functionParams", "dimsParams", "get", "normalizedIndices", "getByIndices", "setByIndicesImplementation", "setImplementation", "impls", "needShapeStrides", "impl", "indicesAndValue", "normalizedDispatchGroup", "limits", "workgroupSize", "workgroupSizeX", "workgroupSizeY", "workgroupSizeZ", "is1DimensionDispatch", "paramList", "globalIdxDefinition", "variable", "bindingIndex", "access", "variables", "v", "additionalUniforms", "uniformSnippets", "typeTemp", "uniformWgslTypeToDataType", "u", "dispatchGroup", "inShape", "outShape", "inRank", "a", "validateInputs", "getAdjustedPerm", "getOutputShape", "permFunctionBody", "createTransposeProgramInfo", "transpose", "parseTransposeAttributes", "init_transpose", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "inputRank", "perm", "inputShape", "ShapeUtil", "rank", "input", "output", "reverseFunc", "inputTensor", "permAttr", "inputDataType", "outputShape", "outputVariable", "inputVariable", "getShaderSource", "wgslType", "workgroupSize", "shaderHelper", "outputSize", "createTensorShapeVariables", "context", "attributes", "createAttributeWithCacheKey", "reduceOps", "reduceSharedOps", "reduceInitValues", "reduceOutputValues", "getInnerMostAxes", "computeOutAndReduceShapes", "expandShapeToKeepDim", "areAxesInnerMostDims", "getAxesPermutation", "createReduceSharedProgramInfo", "reduceCommon", "reduceMeanShared", "reduceL1Shared", "reduceL2Shared", "reduceLogSumExpShared", "reduceMaxShared", "reduceMinShared", "reduceProdShared", "reduceSumShared", "reduceSumSquareShared", "reduceLogSumShared", "init_reduce_shared", "__esmMin", "init_wasm_common", "init_util", "init_common", "init_reduce", "init_transpose", "numInnerAxes", "rank", "res", "i", "shape", "axes", "outputShape", "dim", "reduceShape", "expandShape", "shapeIdx", "axis", "name", "shaderCache", "inputs", "reduceType", "outputDataType", "inputShape", "outputSize", "ShapeUtil", "reduceSize", "input", "inputVariable", "output", "outputVariable", "workgroupSize", "sharedMemorySnippet", "shaderHelper", "context", "attributes", "updatedAttributes", "createReduceAttributesFromInputs", "updatedAxes", "_dim", "normalizeAxes", "permutedAxes", "createTransposeProgramInfo", "finalOutputShape", "validateInputs", "noOp", "createReduceProgramInfo", "createReduceAttributesFromInputs", "runReduceProgram", "reduceLogSumNaive", "reduceL1Naive", "reduceL2Naive", "reduceLogSumExpNaive", "reduceMaxNaive", "reduceMeanNaive", "reduceMinNaive", "reduceProdNaive", "reduceSumNaive", "reduceSumSquareNaive", "useNaiveReduceMethod", "reduceMean", "reduceL1", "reduceL2", "reduceLogSumExp", "reduceMax", "reduceMin", "reduceProd", "reduceSum", "reduceSumSquare", "reduceLogSum", "init_reduce", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "init_reduce_shared", "inputs", "input", "name", "shaderCache", "reduceOp", "axesInput", "outputDataType", "keepDims", "noopWithEmptyAxes", "outputShape", "inputShape", "inputRank", "axes", "ShapeUtil", "reduceOnAllAxes", "d", "i", "outputRank", "outputSize", "shaderHelper", "idxCopy", "inputVariable", "output", "outputVariable", "ops", "reduceOps", "k", "l", "createTensorShapeVariables", "attributes", "v", "createAttributeWithCacheKey", "context", "updatedAttributes", "_output", "idxZero", "size", "shape", "reduceSize", "dim", "reduceMeanShared", "reduceL1Shared", "reduceL2Shared", "reduceLogSumExpShared", "reduceMaxShared", "reduceMinShared", "reduceProdShared", "reduceSumShared", "reduceSumSquareShared", "reduceLogSumShared", "validateInputs", "argMin", "argMax", "parseArgMinMaxAttributes", "init_argminmax", "__esmMin", "init_wasm_common", "init_attribute_with_cache_key", "init_reduce", "inputs", "context", "attributes", "argMinMaxOp", "input", "output", "axes", "idxZero", "k", "createReduceProgramInfo", "createAttributeWithCacheKey", "validateAttentionInputs", "createInPlaceSoftmaxProgramInfo", "createAttentionProbsProgramInfo", "createVxAttentionScoreProgramInfo", "applyAttention", "prepare", "attention", "init_attention", "__esmMin", "init_wasm_common", "init_types", "init_common", "inputs", "attributes", "input", "weights", "bias", "maskIndex", "past", "relativePositionBias", "batchSize", "sequenceLength", "inputHiddenSize", "qHiddenSize", "kHiddenSize", "vHiddenSize", "sz", "kvSequenceLength", "pastSequenceLength", "totalSequenceLength", "maxSequenceLength", "maskType", "_context", "d", "components", "getMaxComponents", "WG", "dComp", "elementsPerThread", "programUniforms", "dataType", "tensorTypeToWsglStorageType", "f32Type", "tensorTypeToWsglValueType", "getShaderSource", "shaderHelper", "inputHelper", "outputVariable", "uniforms", "context", "q", "key", "pastKey", "parameters", "probsShape", "presentKey", "presentKeyShape", "alpha", "vectorizedHeadSize", "TILE_SIZE", "dispatch", "inputDependencies", "outputs", "qInput", "inputVariable", "kInput", "inputVars", "pastKeyInput", "output", "outputVars", "probs", "v", "pastValue", "params", "nReps", "repeatedVHiddenSize", "presentValue", "presentValueShape", "outputShape", "probsHelper", "vHelper", "k", "_maskIndex", "_past", "outputCount", "inputsK", "inputsV", "M", "K", "N", "outputQ", "outputK", "outputV", "weight", "validateInputs", "createBatchNormInferenceProgramInfo", "parseBatchNormAttributes", "batchNorm", "init_batch_norm", "__esmMin", "init_esm", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "checkShapeEqual", "actual", "expected", "message", "r", "v", "i", "shape", "epsilon", "spatial", "format", "yShape", "components", "getMaxComponents", "cComponents", "outputSize", "ShapeUtil", "useShapesUniforms", "shapeOrRank", "x", "inputVariable", "scale", "bias", "inputMean", "inputVar", "y", "outputVariable", "calcCOffset", "cOffset", "getInferenceModeShaderSource", "helper", "createTensorShapeVariables", "createAttributeWithCacheKey", "context", "outputCount", "updatedAttributes", "env", "validateInputs", "createBiasAddProgramInfo", "biasAdd", "init_bias_add", "__esmMin", "init_util", "init_common", "inputs", "outputShape", "channels", "outputSize", "ShapeUtil", "dataType", "input", "inputVariable", "bias", "residual", "output", "outputVariable", "shaderHelper", "context", "createElementwiseProgramShader", "createElementwiseProgramInfo", "abs", "acos", "acosh", "asin", "asinh", "atan", "atanh", "parseCastAttributes", "cast", "generateClipAttributesFromInputs", "clip", "ceil", "cos", "cosh", "parseAlphaAttributes", "elu", "erfImpl", "erf", "exp", "floor", "gelu", "leakyRelu", "not", "neg", "reciprocal", "relu", "sigmoid", "parseHardSigmoidAttributes", "hardSigmoid", "sin", "sinh", "sqrt", "tan", "tanhExpression", "tanh", "fastGeluImpl", "fastGeluExpression", "fastGelu", "thresholdedRelu", "log", "quickGeluImpl", "quickGeluExpression", "quickgelu", "init_unary_op", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "shaderHelper", "datasize", "inputDataType", "outputDataType", "funcCall", "additionalImplementation", "vecSize", "expression", "input", "inputVariable", "output", "outputVariable", "name", "cacheKey", "ShapeUtil", "inputTensors", "context", "attributes", "createAttributeWithCacheKey", "func", "inputs", "min", "MIN_CLIP", "max", "MAX_CLIP", "clipAttributes", "dataType", "tensorTypeToWsglValueType", "a", "varType", "x", "alpha", "dType", "validateInputs", "createBiasSplitGeluProgramInfo", "biasSplitGelu", "init_bias_split_gelu", "__esmMin", "init_util", "init_common", "init_unary_op", "inputs", "outputShape", "input", "inputVariable", "bias", "output", "outputVariable", "outputSize", "ShapeUtil", "dataType", "tensorTypeToWsglStorageType", "shaderHelper", "erfImpl", "context", "createBinaryOpProgramShader", "createBinaryOpProgramInfo", "runBinaryOp", "add", "div", "equal", "mul", "pow", "sub", "greater", "less", "greaterOrEqual", "lessOrEqual", "init_binary_op", "__esmMin", "init_wasm_common", "init_util", "init_common", "shaderHelper", "dimsA", "dimsB", "dimsOutput", "vectorize", "doBroadcast", "sharedDimensionDivisibleBy4", "funcCall", "typeA", "typeB", "typeOutput", "additionalImplementation", "expressionScalar", "expressionVector", "a", "b", "output", "outputVariable", "inputVariable", "assignment", "isAOneElement", "ShapeUtil", "isBOneElement", "aLastDimDivisibleBy4", "bLastDimDivisibleBy4", "singleAssignment", "resStr", "x", "typeCast", "expressionA", "expressionB", "name", "cacheKey", "outputDataType", "isBroadcast", "outputShape", "outputSize", "cacheKeyAux", "calculatedShape", "BroadcastUtil", "sharedDimension", "i", "dimA", "dimB", "createTensorShapeVariables", "context", "type", "validateInputs", "calculateInputIndexImpl", "assignOutputData", "createConcatProgramInfo", "concat", "parseConcatAttributes", "init_concat", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "axis", "referenceIndex", "referenceInput", "inputType", "inputRank", "input", "i", "dim", "numberOfTensors", "sizeInConcatAxisStr", "output", "codeLines", "returnSnippet", "adjustedAxis", "outputShape", "dataType", "outputSize", "ShapeUtil", "sizeInConcatAxis", "inputVars", "previousSum", "inputDependencies", "inputRanks", "programUniforms", "inputVariable", "createTensorShapeVariables", "outputVariable", "indicesAxis", "getShaderSource", "shaderHelper", "context", "attributes", "inputShape", "sum", "nonEmptyInputs", "createAttributeWithCacheKey", "getActivationSnippet", "appendActivationUniformsData", "appendActivationUniforms", "parseInternalActivationAttributes", "init_fuse_utils", "__esmMin", "init_wasm_common", "init_util", "attributes", "valueType", "baseType", "programUniform", "uniforms", "activation", "alpha", "beta", "clipMin", "clipMax", "MIN_CLIP", "MAX_CLIP", "typeSnippet", "biasSnippet", "init_activation_util", "__esmMin", "component", "dataType", "hasBias", "utilFunctions", "init_conv_util", "__esmMin", "strideStr", "writeDataToSubAVec4Snippet", "calculateResultSnippet", "makeMatMulPackedVec4Source", "writeDataToSubASnippet", "readDataFromSubASnippet", "makeMatMulPackedSource", "matMulReadWriteFnSource", "createMatmulProgramInfo", "init_matmul_packed_webgpu", "__esmMin", "init_wasm_common", "init_util", "init_common", "init_fuse_utils", "init_activation_util", "transpose", "batchDims", "transposeA", "innerElementSize", "workPerThread", "workgroupSize", "type", "tileInner", "splitK", "splitedDimInner", "tileAOuter", "tileBOuter", "tileAWidth", "tileAHight", "rowPerThreadB", "sequentialAccessByThreads", "rowPerThreadA", "colPerThreadA", "matmulSnippet", "component", "hasBias", "applyActivation", "variables", "batchShapes", "isChannelsLast", "batchAShape", "batchBShape", "batchShape", "batchVariable", "aVariable", "bVariable", "outputVariable", "broadCastADims", "getBroadcastDims", "broadCastBDims", "dataType", "tensorTypeToWsglStorageType", "getAIndices", "aRank", "batchRank", "resStr", "i", "j", "getBIndices", "bRank", "typeSnippet", "inputs", "activationAttributes", "outputShape", "reshapedOutputShape", "aShape", "bShape", "outerDimsA", "outerDimsB", "outerDims", "batchSize", "ShapeUtil", "dimAOuter", "dimInner", "dimBOuter", "isVec4", "elementsPerThread", "dispatch", "components", "aShapeTemp", "bShapeTemp", "outputShapeTemp", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "internalVariable", "A", "inputVariable", "B", "output", "inputVariables", "biasComponents", "uniforms", "appendActivationUniforms", "baseType", "getActivationSnippet", "declareFunctions", "conv2dCommonSnippet", "createConv2DMatMulProgramInfo", "init_conv2d_mm_webgpu", "__esmMin", "init_wasm_common", "init_log", "init_common", "init_fuse_utils", "init_activation_util", "init_conv_util", "init_matmul_packed_webgpu", "isChannelsLast", "fitAOuter", "fitBOuter", "fitInner", "addBias", "attributes", "innerElementSizeX", "innerElementSizeW", "innerElementSize", "dataType", "getXSnippet", "getWSnippet", "coordASnippet", "coordResSnippet", "xHeight", "xWidth", "row", "col", "readXSnippet", "typeSnippet", "sampleX", "sampleW", "resType", "aType", "bType", "applyActivation", "getActivationSnippet", "biasSnippet", "inputs", "outputShape", "dimAOuter", "dimBOuter", "dimInner", "hasBias", "sequentialAccessByThreads", "inChannels", "batchSize", "outWidth", "outHeight", "outChannels", "isVec4", "dispatchX", "dispatchY", "workGroupSize", "elementsPerThread", "dispatch", "LOG_DEBUG", "tileAOuter", "tileBOuter", "tileInner", "elementsSize", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "uniforms", "appendActivationUniforms", "components", "t", "tensorTypeToWsglStorageType", "declareFunctions", "x", "inputVariable", "w", "inputVariables", "output", "outputVariable", "bias", "utilFunctions", "makeMatMulPackedVec4Source", "makeMatMulPackedSource", "arrayProduct", "parse3TupleParam", "getEffectiveFilterSize", "computeDefaultPad", "computeOutputShape4D", "get3DPadAndOutInfo", "computeConv3DInfo", "createConv3DNaiveProgramInfo", "init_conv3d_naive_webgpu", "__esmMin", "init_wasm_common", "init_log", "init_util", "init_common", "arr", "product", "i", "param", "filterSize", "dilation", "inputShape", "fieldSize", "stride", "effectiveFieldSize", "inShape", "filterShape", "outChannels", "strides", "zeroPad", "outShape", "index", "pad", "inDepth", "inHeight", "inWidth", "strideDepth", "strideHeight", "strideWidth", "filterDepth", "filterHeight", "filterWidth", "padInfo", "outDepth", "outHeight", "outWidth", "val", "_", "padAlongDepth", "padAlongHeight", "padAlongWidth", "front", "back", "top", "bottom", "left", "right", "dilations", "depthwise", "dataFormat", "batchSize", "inChannels", "filterChannels", "dilationDepth", "dilationHeight", "dilationWidth", "effectiveFilterDepth", "effectiveFilterHeight", "effectiveFilterWidth", "inputs", "attributes", "outputShape", "filterDims", "pads", "isChannelsLast", "isVec4", "workGroupSize", "dispatchLayout", "dispatch", "d", "LOG_DEBUG", "innerElementSize", "outputSize", "ShapeUtil", "programUniforms", "createTensorShapeVariables", "inputDependencies", "hasBias", "getShaderSource", "shaderHelper", "uniforms", "components", "t", "tensorTypeToWsglStorageType", "x", "inputVariable", "w", "inputVariables", "output", "outputVariable", "declareFunctions", "bias", "getElementAt", "createGroupedConvProgramInfo", "createGroupedConvVectorizeProgramInfo", "init_conv_grouped", "__esmMin", "init_wasm_common", "init_util", "init_common", "init_conv", "init_fuse_utils", "inputs", "attributes", "squeezeOutputShapeFunction", "hasBias", "processBias", "xShape", "wShape", "outputChannelsPerGroup", "isChannelLast", "outputShape", "calculateOutputShape", "outputSize", "ShapeUtil", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "output", "outputVariable", "baseType", "tensorTypeToWsglStorageType", "applyActivation", "getActivationSnippet", "x", "inputVariable", "w", "inputVars", "uniforms", "appendActivationUniforms", "components", "getMaxComponents", "outputNumber", "outputShapeInShader", "xNumber", "createNaiveMatmulProgramInfo", "validateInputs", "matMul", "init_matmul", "__esmMin", "init_wasm_common", "init_util", "init_matmul_packed_webgpu", "init_common", "init_fuse_utils", "inputs", "activationAttributes", "outputShape", "reshapedOutputShape", "isChannelsLast", "aShape", "bShape", "M", "N", "K", "components", "getMaxComponents", "aComponents", "outputNumber", "outputSize", "ShapeUtil", "hasBias", "outerDims", "outputShapeInShader", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "batchDims", "internalVariable", "a", "inputVariable", "b", "output", "outputVariable", "baseType", "tensorTypeToWsglStorageType", "applyActivation", "getActivationSnippet", "inputVariables", "processBias", "biasComponents", "outerDimsA", "outerDimsB", "broadCastADims", "getBroadcastDims", "broadCastBDims", "uniforms", "appendActivationUniforms", "getIndices", "variable", "broadCastDims", "rank", "name", "batchRank", "resStr", "i", "j", "calcResult", "calcStr", "context", "BroadcastUtil", "createMatmulProgramInfo", "calculateOutputShape", "weightTransposeAttribute", "validateInputs", "getAdjustedConvAttributes", "parseConvAttributes", "conv2d", "conv1d", "conv3d", "conv", "init_conv", "__esmMin", "init_util", "init_conv2d_mm_webgpu", "init_conv3d_naive_webgpu", "init_matmul_packed_webgpu", "init_conv_grouped", "init_fuse_utils", "init_matmul", "init_transpose", "inputShape", "kernelShape", "dilations", "adjustPads", "strides", "isChannelLast", "batchSize", "inputSpatialShape", "spatialRank", "outChannels", "dilatedKernelShape", "v", "i", "outputShape", "inputs", "attributes", "dataChannel", "filterInChannel", "pads", "PoolConvUtil", "newAttributes", "activationAttributes", "parseInternalActivationAttributes", "format", "autoPad", "group", "wIsConst", "context", "adjustedAttributes", "isChannelsLast", "transposedWeight", "createTransposeProgramInfo", "convInputs", "createGroupedConvVectorizeProgramInfo", "createGroupedConvProgramInfo", "hasBias", "inputHeight", "inputWidth", "inputChannels", "weightHeight", "weightWidth", "outHeight", "outWidth", "sameSize", "batch", "xReshaped", "wReshaped", "matmulOutputShape", "matmulInputs", "sharedDim", "N", "K", "createNaiveMatmulProgramInfo", "createMatmulProgramInfo", "sequentialAccessByThreads", "dimAOuter", "dimBOuter", "dimInner", "createConv2DMatMulProgramInfo", "convInfo", "computeConv3DInfo", "createConv3DNaiveProgramInfo", "conv2dTransposeCommonSnippet", "createConv2DTransposeMatMulProgramInfo", "init_conv_backprop_mm_webgpu", "__esmMin", "init_wasm_common", "init_log", "init_common", "init_fuse_utils", "init_activation_util", "init_conv_util", "init_matmul_packed_webgpu", "isChannelsLast", "addBias", "attributes", "type", "innerElementSize", "getWSnippet", "coordASnippet", "coordResSnippet", "xHeight", "xWidth", "row", "col", "readASnippet", "sampleA", "sampleW", "applyActivation", "getActivationSnippet", "biasSnippet", "inputs", "outputShape", "dimAOuter", "dimBOuter", "dimInner", "hasBias", "sequentialAccessByThreads", "inChannels", "batchSize", "outWidth", "outHeight", "outChannels", "isVec4", "dispatchX", "dispatchY", "workGroupSize", "elementsPerThread", "dispatch", "LOG_DEBUG", "tileInner", "components", "filterDims", "effectiveFilterDims", "pads", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "x", "inputVariable", "w", "output", "outputVariable", "inputVariables", "declareFunctions", "bias", "uniforms", "appendActivationUniforms", "elemType", "tensorTypeToWsglStorageType", "utilFunctions", "makeMatMulPackedVec4Source", "makeMatMulPackedSource", "createConvTranspose2DOpProgramShaderSource", "createConvTranspose2DProgramInfo", "init_conv_backprop_webgpu", "__esmMin", "init_wasm_common", "init_log", "init_util", "init_common", "shaderHelper", "inputs", "outputShape", "hasBias", "is1DimensionDispatch", "isVec4", "dataType", "uniforms", "isChannelsLast", "rowDim", "colDim", "channelDim", "workPerThread", "declareFunctions", "components", "w", "inputVariable", "dy", "inputVariables", "output", "outputVariable", "codeSnippet4", "codeSnippet", "attributes", "squeezeOutputShapeFunction", "outputSize", "ShapeUtil", "dispatch", "LOG_DEBUG", "inputDependencies", "strides", "filterDims", "dilations", "effectiveFilterDims", "pads", "group", "wShape", "inputChannelsPerGroup", "outputChannelsPerGroup", "programUniforms", "createTensorShapeVariables", "getShaderSource", "tensorTypeToWsglStorageType", "computeTotalPad", "distributePadding", "calculateOutputShapeAndPads", "getAdjustedConvTransposeAttributes", "parseConvTransposeAttributes", "validateInputs", "weightTransposePerm", "convTranspose2d", "convTranspose1d", "convTranspose", "init_conv_transpose", "__esmMin", "init_conv_backprop_mm_webgpu", "init_conv_backprop_webgpu", "init_fuse_utils", "init_transpose", "inDim", "stride", "adj", "kernel", "dilation", "outSize", "totalPad", "autoPad", "pads", "head", "tail", "smallPad", "inputShape", "kernelShape", "dilations", "group", "strides", "isChannelLast", "outputPadding", "outputShape", "spatialRank", "updateOutputShape", "i", "batchSize", "outChannels", "j", "inSize", "attributes", "inputs", "a", "b", "isChannelsLast", "newAttributes", "activationAttributes", "parseInternalActivationAttributes", "format", "wIsConst", "dataChannel", "filterInChannel", "featureMaps", "context", "adjustedAttributes", "inputChannels", "createConvTranspose2DProgramInfo", "outHeight", "outWidth", "weightHeight", "weightWidth", "dimAOuter", "dimBOuter", "dimInner", "sequentialAccessByThreads", "transposedWeight", "createTransposeProgramInfo", "convTransposeInputs", "hasBias", "createConv2DTransposeMatMulProgramInfo", "createCumsumProgramInfo", "cumsum", "parseCumSumAttributes", "init_cumsum", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputType", "inputShape", "axisInput", "attributes", "outputSize", "ShapeUtil", "rank", "input", "inputVariable", "output", "outputVariable", "axisValue", "axis", "getShaderSource", "shaderHelper", "index", "max", "getElementAt", "lowerLimit", "upperLimit", "createTensorShapeVariables", "context", "exclusive", "reverse", "createAttributeWithCacheKey", "validateInputs", "permFunctionBody", "createDepthToSpaceProgramInfo", "depthToSpace", "parseDepthToSpaceAttributes", "init_depth_to_space", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "perm", "rank", "input", "output", "reverseFunc", "inputTensor", "attributes", "h", "w", "c", "shape", "isChannelLast", "blocksize", "isDCRmode", "reshapedInputTensor", "reshapedInputRank", "inputDataType", "reshapedInput", "inputVariable", "permedOutput", "outputVariable", "getShaderSource", "shaderHelper", "outputShape", "outputSize", "ShapeUtil", "shapeBeforePerm", "shapeAfterPerm", "createTensorShapeVariables", "context", "createAttributeWithCacheKey", "symbolPattern", "termPattern", "termPatternOnly", "lhsPattern", "lhsPatternOnly", "EinsumTerm", "EinsumEquation", "appendMax", "createEinsumProgramInfo", "einsum", "parseEinsumAttributes", "init_einsum", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputIndex", "symbol", "index", "value", "inputs", "equation", "lhs", "rhs", "inputTerm", "dims", "einsumTerm", "sym", "info", "dimValue", "term", "isInput", "rank", "ellipsis", "ellipsisDims", "nextDim", "indexSymbols", "i", "ellipsisDimLength", "j", "name", "inputShapes", "dataType", "einsumEquation", "outputShape", "inputVars", "inputVariable", "outputSize", "ShapeUtil", "output", "outputVariable", "uniformsSymbols", "getShaderSource", "shaderHelper", "idxCopy", "initProd", "initSum", "updateSum", "reduceOpsSetIndices", "reduceOpsLoopHeaders", "reduceOpsLoopFooters", "reduceOpCompute", "isReduceOpsWithoutLoop", "outputIndex", "indices", "reduceOps", "inputVar", "_var", "programUniformsInit", "programUniforms", "_", "createTensorShapeVariables", "acc", "inputProgramUniforms", "context", "attributes", "input", "createAttributeWithCacheKey", "validateInputs", "getAdjustedShape", "calculateOutputShape", "createExpandProgramInfo", "expand", "init_expand", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "inputShape", "shape", "shapeIndex", "inputShapeIndex", "shape1", "shape2", "diff", "i", "outputShape", "dataType", "components", "outputSize", "ShapeUtil", "getShaderSource", "shaderHelper", "input", "inputVariable", "output", "outputVariable", "assignment", "singleAssignment", "resStr", "x", "typeCast", "programUniforms", "createTensorShapeVariables", "context", "createFastGeluProgramInfo", "fastGelu", "init_fast_gelu", "__esmMin", "init_wasm_common", "init_util", "init_common", "init_unary_op", "inputTensors", "dataType", "outputSize", "ShapeUtil", "biasLength", "useVec4", "getShaderSource", "shaderHelper", "x", "inputVariable", "bias", "y", "outputVariable", "uniforms", "singleElementBias", "i", "biasGetExpression", "fastGeluImpl", "tensorTypeToWsglValueType", "WORKGROUP_SIZE", "fastGeluExpression", "inputs", "context", "validateInputs", "createGatherProgramInfo", "parseGatherAttributes", "gather", "init_gather", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "inputShape", "indicesShape", "inputRank", "axis", "ShapeUtil", "outputShape", "axisDimLimit", "components", "outputSize", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "data", "inputVariable", "indices", "output", "outputVariable", "calcDataIndices", "x", "indicesRank", "calcStr", "i", "j", "assignment", "singleAssignment", "resStr", "typeCast", "createAttributeWithCacheKey", "context", "validateInputs", "createGatherElementsProgramInfo", "parseGatherElementsAttributes", "gatherElements", "init_gather_elements", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "inputShape", "inputOutputDataType", "inputRank", "indicesShape", "indicesDataType", "axis", "ShapeUtil", "axisDimLimit", "outputShape", "outputSize", "input", "inputVariable", "indices", "output", "outputVariable", "programUniforms", "createTensorShapeVariables", "shaderHelper", "createAttributeWithCacheKey", "context", "validateInputs", "createGemmProgramInfo", "parseGemmAttributes", "gemm", "init_gemm", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "attributes", "aShape", "bShape", "M", "N", "K", "GemmUtil", "outputShape", "outputSize", "ShapeUtil", "programUniforms", "inputDependencies", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "line", "calculateAlpha", "a", "inputVariable", "b", "dataType", "c", "variables", "output", "outputVariable", "uniforms", "transA", "transB", "alpha", "beta", "context", "getInput", "validateInputs", "parseMultiHeadAttentionAttributes", "weightTransposeAttribute", "addBiasTranspose", "maybeTransposeToBNSHAndAddBias", "multiHeadAttention", "init_multihead_attention", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_types", "init_attention", "init_common", "init_transpose", "inputs", "i", "ShapeUtil", "attributes", "query", "key", "value", "bias", "keyPaddingMask", "relativePositionBias", "pastKey", "pastValue", "dmmhaPacking", "batchSize", "sequenceLength", "hiddenSize", "kvSequenceLength", "pastSequenceLength", "maxSequenceLength", "headSize", "qkvFormat", "maskType", "maskDims", "passPastInKv", "vHiddenSize", "totalSequenceLength", "broadcastResPosBias", "createAttributeWithCacheKey", "context", "qkv", "biasOffset", "outputShape", "outputSize", "programUniforms", "getShaderSource", "shaderHelper", "output", "outputVariable", "qkvInput", "inputVariable", "biasInput", "uniforms", "numHeads", "input", "reshapedInput", "createTransposeProgramInfo", "params", "kvBNSH", "Q", "applyAttention", "K", "V", "getRepeats", "validateInputs", "getOutputShape", "createTileProgramInfo", "tile", "init_tile", "__esmMin", "init_wasm_common", "init_util", "init_common", "repeatsTensorView", "inputs", "inputShape", "repeats", "outputShape", "i", "shape", "outputSize", "ShapeUtil", "dataType", "input", "inputVariable", "output", "outputVariable", "getShaderSource", "shaderHelper", "createTensorShapeVariables", "context", "validateInputs", "createConcatProgramInfo", "parseGroupQueryAttentionAttributes", "weightTransposeAttribute", "maybeExpandAndTransposeToBNSH", "groupQueryAttention", "init_group_query_attention", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_attention", "init_common", "init_multihead_attention", "init_tile", "init_transpose", "inputs", "attributes", "query", "key", "value", "pastKey", "pastValue", "dmmhaPacking", "batchSize", "sequenceLength", "hiddenSize", "kvSequenceLength", "pastSequenceLength", "maxSequenceLength", "headSize", "hasPastKey", "hasPastValue", "isPastkvBSNH", "qkvFormat", "maskType", "passPastInKv", "vHiddenSize", "totalSequenceLength", "broadcastResPosBias", "a", "b", "dataType", "params", "outputShape", "component", "outputSize", "ShapeUtil", "presentSequenceLength", "output", "outputVariable", "inputA", "inputVariable", "inputB", "H", "dispatch", "inputDependencies", "programUniforms", "createTensorShapeVariables", "uniforms", "pastStr", "newStr", "concatStr", "getShaderSource", "shaderHelper", "createAttributeWithCacheKey", "context", "input", "pastKV", "outputIndex", "reshapedInput", "numHeads", "nReps", "createTileProgramInfo", "createTransposeProgramInfo", "Q", "maybeTransposeToBNSHAndAddBias", "K", "V", "applyAttention", "createInstanceNormProgramInfo", "computeMean", "createInstanceNormNHWCProgramInfo", "instanceNorm", "init_instance_norm", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "attributes", "xShape", "outputShape", "axis", "normCount", "ShapeUtil", "normSize", "components", "getMaxComponents", "normPackedSize", "inputShape", "inputDependencies", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "x", "inputVariable", "scale", "bias", "output", "outputVariable", "variables", "dataType", "f32Type", "workgroupSize", "uniforms", "sumVector", "context", "input", "n", "h", "c", "epsilon", "WG", "outputType", "sumCastType", "setOutputValue", "var1", "var2", "unitsOfWork", "wgSize", "meanInputDependencies", "meanProgramUniforms", "getMeanShaderSource", "inputHelper", "fillVector", "meanValues", "scaleHelper", "biasHelper", "N", "C", "H", "outputSize", "channelScaleShift", "tensorTypeToWsglStorageType", "scaleType", "scaleCastType", "outputHelper", "validateInputs", "createLayerNormProgramInfo", "layerNorm", "init_layer_norm", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "attributes", "outputCount", "simplified", "xShape", "scale", "bias", "outputShape", "axis", "ShapeUtil", "normCount", "normSize", "scaleSize", "biasSize", "meanInvStdDevDim", "i", "components", "getMaxComponents", "inputDependencies", "programUniforms", "hasMeanDataOutput", "hasInvStdOutput", "getShaderSource", "shaderHelper", "dataType", "tensorTypeToWsglStorageType", "variables", "inputVariable", "outputVariable", "uniforms", "fillVector", "castToF32", "sumVector", "outputs", "context", "validateInputs", "createMatMulNBitsProgramInfo", "matMulNBits", "parseMatMulNBitsAttributes", "init_matmulnbits", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "a", "aRank", "nBlocksPerCol", "blobSize", "b", "ShapeUtil", "scalesShape", "zeroPointsShape", "expectedZeroPointsSize", "maxComputeWorkgroupSizes", "maxComputeWorkgroupStorageSize", "inputShape", "dimAOuter", "dimInner", "dimBOuter", "batchDims", "batchSize", "blobSizeInWords", "dataType", "outputNumber", "getMaxComponents", "aComponents", "bComponents", "elementSize", "getTensorElementSize", "workgroupOutputSize", "maxNumberOfComponents", "useBlockwiseMatMulNBits", "components", "outputShape", "outputSize", "programUniforms", "inputShapeTemp", "bShape", "createTensorShapeVariables", "outputShapeTemp", "getShaderSource", "shaderHelper", "inputRank", "inputVariable", "scales", "inputVariables", "zeroPoints", "outputRank", "output", "outputVariable", "uniforms", "tensorTypeToWsglStorageType", "qDqDataType", "processOneBlock", "_", "i", "updateZeroPointIndex", "context", "createAttributeWithCacheKey", "validateInputs", "getPadConstant", "getPadReflect", "getPadEdge", "getPadWrap", "getPadSnippet", "createPadProgramInfo", "createPadAttributesFromInputs", "pad", "init_pad", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "validPads", "output", "inputRank", "padsLength", "block", "i", "getElementAt", "attributes", "outputShape", "ShapeUtil", "inputDims", "outputSize", "programUniforms", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "outputVariable", "input", "inputVariable", "dataType", "padSnippet", "uniforms", "bigInt64Pads", "value", "updatePads", "axes", "v", "pads", "context", "updatedAttributes", "validateInputs", "getAdjustedPoolAttributesAndOutputShape", "getUniformAndPadInfo", "generatePoolingCode", "createShaderKeyFromAttributes", "createAveragePoolShaderKeyFromAttributes", "createMaxPoolShaderKeyFromAttributes", "parsePoolCommonAttributes", "createAveragePoolProgramInfo", "parseAveragePoolAttributes", "averagePool", "globalPoolAttributes", "parseGlobalAveragePoolAttributes", "globalAveragePool", "createMaxPoolProgramInfo", "maxPool", "parseMaxPoolAttributes", "parseGlobalMaxPoolAttributes", "globalMaxPool", "init_pool", "__esmMin", "init_esm", "init_wasm_common", "init_util", "init_common", "inputs", "env", "input", "attributes", "isGlobalOperator", "isChannelsLast", "inputShapeAsChannelFirst", "hasDilations", "kernelShape", "strides", "dilations", "pads", "PoolConvUtil", "outputShapeAsChannelFirst", "newAttributes", "outputShapeAsChannelLast", "outputShape", "outputSize", "ShapeUtil", "kernelSize", "programUniforms", "uniforms", "kw", "sw", "pwStart", "pwEnd", "pwStartEndNotZero", "phStartEndNotZero", "kh", "sh", "phStart", "phEnd", "kernelStrides", "hasPads", "sum", "cur", "shaderHelper", "x", "rank", "outputShapeRank", "op1", "op2", "start", "dataType", "output", "outputVariable", "codeW", "codeH", "codeHEnd", "dimIdxW", "dimIdxH", "stridesRank", "padsRank", "padCode", "getElementAt", "name", "adjustedAttributes", "inputVariable", "createTensorShapeVariables", "inputDependencies", "countIncludePad", "attr", "averagePoolAttributes", "context", "format", "storageOrder", "maxPoolAttributes", "validateInputsContent", "createRangeProgramInfo", "range", "init_range", "__esmMin", "init_esm", "init_wasm_common", "init_common", "start", "limit", "delta", "sameStartLimit", "increasingRangeNegativeStep", "decreasingRangePositiveStep", "dataType", "numElements", "outputShape", "outputSize", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "output", "outputVariable", "wgslType", "uniforms", "context", "env", "validateScales", "updateScales", "validateInputs", "getOriginalCoordinateFromResizedCoordinate", "getNearestPixelFromOriginal", "updateRoI", "initOutputShape", "adjustOutputShape", "calculateOriginalIndicesFromOutputIndices", "calculateInputIndicesFromOutputIndices", "checkInputIndices", "setChannelAndBatchIndices", "bilinearInterpolation", "bicubicInterpolation", "trilinearInterpolation", "createResizeProgramInfo", "getOpsetVersionFromCustomDataBuffer", "resize", "parseResizeAttributes", "init_resize", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "scales", "attributes", "value", "axes", "rank", "newScales", "index", "inputs", "opsetVersion", "sizes", "roi", "roiInputIndex", "scalesInputIndex", "sizesInputIndex", "coordinateTransferMode", "dType", "nearestMode", "roiTmp", "roiLocal", "v", "i", "inputShape", "outputShape", "scaleInPolicy", "adjustedOutputShape", "output", "scalesLength", "roiLength", "getElementAt", "input", "useExtrapolation", "channelIdx", "batchIdx", "spacialDims", "extrapolationValue", "heightIdx", "widthIdx", "cubicCoeffA", "excludeOutside", "is2D", "isNchw", "createCubicInterpolationFunction", "idx", "direction", "depthIdx", "inputTensor", "scalesInput", "roiInput", "outputVariable", "inputVariable", "outputSize", "ShapeUtil", "noScale", "d", "dataType", "getShaderSource", "shaderHelper", "createTensorShapeVariables", "context", "customDataBuffer", "antialias", "coordinateTransformMode", "keepAspectRatioPolicy", "mode", "createAttributeWithCacheKey", "validateInputs", "createRotaryEmbeddingProgramInfo", "rotaryEmbedding", "init_rotary_embedding", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "input", "positionIds", "cosCache", "sinCache", "numHeads", "rotaryEmbeddingDim", "ShapeUtil", "batchSize", "sequenceLength", "maxSequenceLength", "hiddenSize", "headSize", "interleaved", "scale", "batchStride", "halfRotaryEmbeddingDim", "globalShape", "globalStrides", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "inputVariable", "output", "outputVariable", "WORKGROUP_SIZE", "createAttributeWithCacheKey", "context", "validateInputs", "createSkipLayerNormProgramInfo", "skipLayerNorm", "init_skip_layer_norm", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "input", "skip", "gamma", "hiddenSize", "sequenceLength", "beta", "bias", "attributes", "outputCount", "isTraining", "simplified", "inputShape", "inputSize", "ShapeUtil", "outputShape", "outputSize", "meanInvStdDevDim", "hasBetaInput", "hasBiasInput", "hasMeanOutput", "hasInvStdDevOutput", "hasInputSkipBiasSumOutput", "workgroupSize", "components", "getMaxComponents", "programUniforms", "getShaderSource", "shaderHelper", "uniformsArray", "variables", "inputVariable", "outputVariable", "dataType", "tensorTypeToWsglStorageType", "vecDataType", "castToF32", "sumVector", "outputs", "_input", "_index", "context", "validateInputs", "readInput", "createSliceAttributesFromInputs", "fixStartEndValues", "calculateInputIndicesImpl", "createSliceProgramInfo", "slice", "parseSliceAttributes", "init_slice", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "_", "idx", "input", "v", "starts", "ends", "axes", "createAttributeWithCacheKey", "value", "index", "inputShape", "steps", "newValue", "output", "getElementAt", "inputSize", "ShapeUtil", "step", "start", "i", "end", "signs", "array", "numSteps", "newEnd", "newStart", "outputShape", "axis", "outputTensorInfo", "outputVariable", "inputVariable", "outputSize", "uniforms", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "context", "updatedAttributes", "validateInputs", "createSoftmaxProgramInfo", "softmax", "parseSoftmaxAttributes", "init_softmax", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "input", "attributes", "shape", "outputSize", "ShapeUtil", "WG", "axis", "cols", "rows", "components", "getMaxComponents", "packedCols", "maxVector", "name", "x", "inputVariable", "output", "outputVariable", "valueType", "threadMaxDecl", "tensorTypeToWsglStorageType", "getShaderSource", "shaderHelper", "sumVector", "context", "createAttributeWithCacheKey", "validateInputs", "createSplitAttributesFromInputs", "calculateOutputIndexImpl", "writeBufferDataImpl", "createSplitProgramInfo", "split", "parseSplitAttributes", "init_split", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "splitSizes", "numOutputs", "v", "createAttributeWithCacheKey", "numberOfTensors", "getElementAt", "outputs", "codeLines", "i", "returnSnippet", "inputShape", "inputSize", "ShapeUtil", "dataType", "axis", "input", "inputVariable", "sizeInSplitAxis", "outputsTensorInfo", "outputShapes", "previousSum", "programUniforms", "outputShape", "outputVariable", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "context", "updatedAttributes", "createWhereOpProgramShader", "createWhereOpProgramInfo", "where", "init_where", "__esmMin", "init_wasm_common", "init_util", "init_common", "shaderHelper", "inputs", "dimsOutput", "isBroadcast", "typeOutput", "output", "outputVariable", "a", "inputVariable", "b", "c", "assignment", "expression", "singleAssignment", "resStr", "x", "typeCast", "expressionA", "expressionB", "expressionC", "dimsA", "dimsB", "dimsC", "outputDataType", "ShapeUtil", "outputShape", "outputSize", "calculatedShape", "BroadcastUtil", "vecSize", "createTensorShapeVariables", "context", "WEBGPU_OP_RESOLVE_RULES", "init_op_resolve_rules", "__esmMin", "init_argminmax", "init_attention", "init_batch_norm", "init_bias_add", "init_bias_split_gelu", "init_binary_op", "init_concat", "init_conv", "init_conv_transpose", "init_cumsum", "init_depth_to_space", "init_einsum", "init_expand", "init_fast_gelu", "init_gather", "init_gather_elements", "init_gemm", "init_group_query_attention", "init_instance_norm", "init_layer_norm", "init_matmul", "init_matmulnbits", "init_multihead_attention", "init_pad", "init_pool", "init_range", "init_reduce", "init_resize", "init_rotary_embedding", "init_skip_layer_norm", "init_slice", "init_softmax", "init_split", "init_tile", "init_transpose", "init_unary_op", "init_where", "abs", "acos", "acosh", "add", "argMax", "parseArgMinMaxAttributes", "argMin", "asin", "asinh", "atan", "atanh", "attention", "averagePool", "parseAveragePoolAttributes", "batchNorm", "biasAdd", "biasSplitGelu", "cast", "parseCastAttributes", "ceil", "clip", "concat", "parseConcatAttributes", "conv", "parseConvAttributes", "convTranspose", "parseConvTransposeAttributes", "cos", "cosh", "cumsum", "parseCumSumAttributes", "depthToSpace", "parseDepthToSpaceAttributes", "div", "einsum", "parseEinsumAttributes", "elu", "parseAlphaAttributes", "equal", "erf", "exp", "expand", "fastGelu", "floor", "gather", "parseGatherAttributes", "gatherElements", "parseGatherElementsAttributes", "gelu", "gemm", "parseGemmAttributes", "globalAveragePool", "parseGlobalAveragePoolAttributes", "globalMaxPool", "parseGlobalMaxPoolAttributes", "greater", "greaterOrEqual", "groupQueryAttention", "parseGroupQueryAttentionAttributes", "hardSigmoid", "parseHardSigmoidAttributes", "instanceNorm", "layerNorm", "leakyRelu", "less", "lessOrEqual", "log", "matMul", "matMulNBits", "parseMatMulNBitsAttributes", "maxPool", "parseMaxPoolAttributes", "mul", "multiHeadAttention", "parseMultiHeadAttentionAttributes", "neg", "not", "pad", "pow", "quickgelu", "range", "reciprocal", "reduceMin", "reduceMean", "reduceMax", "reduceSum", "reduceProd", "reduceL1", "reduceL2", "reduceLogSum", "reduceLogSumExp", "reduceSumSquare", "relu", "resize", "parseResizeAttributes", "rotaryEmbedding", "sigmoid", "sin", "sinh", "slice", "parseSliceAttributes", "skipLayerNorm", "split", "parseSplitAttributes", "sqrt", "softmax", "parseSoftmaxAttributes", "sub", "tan", "tanh", "thresholdedRelu", "tile", "transpose", "parseTransposeAttributes", "where", "ProgramManager", "init_program_manager", "__esmMin", "init_esm", "init_log", "init_common", "backend", "key", "artifact", "buildArtifact", "inputs", "outputs", "dispatchGroup", "uniformBufferBinding", "TRACE_FUNC_BEGIN", "device", "computePassEncoder", "entries", "input", "output", "bindGroup", "commandInfo", "TRACE_FUNC_END", "programInfo", "normalizedDispatchGroupSize", "extensions", "shaderHelper", "createShaderHelper", "userCode", "code", "shaderModule", "LOG_DEBUG", "computePipeline", "x", "y", "z", "limitPerDimension", "size", "dispatchAverage", "getProgramInputTensorInfoDependencyKey", "getProgramInfoUniqueKey", "AdapterInfoImpl", "WebGpuBackend", "init_backend_webgpu", "__esmMin", "init_esm", "init_wasm_common", "init_log", "init_tensor_view", "init_gpu_data_manager", "init_op_resolve_rules", "init_program_manager", "inputTensors", "inputDependencies", "inputInfos", "i", "type", "rank", "dims", "programInfo", "is1DimensionDispatch", "key", "adapterInfo", "architecture", "vendor", "data", "env", "adapter", "requiredFeatures", "deviceDescriptor", "createGpuDataManager", "ProgramManager", "configureLogger", "ev", "commandEncoder", "computePassDescriptor", "TRACE_FUNC_BEGIN", "queryReadBuffer", "mappedData", "pendingKernels", "pendingKernelInfo", "kernelId", "kernelInfo", "kernelType", "kernelName", "programName", "inputTensorViews", "outputTensorViews", "startTimeU64", "endTimeU64", "startTime", "endTime", "value", "tensorDataTypeEnumToString", "inputShapes", "outputShapes", "TRACE", "TRACE_FUNC_END", "program", "outputIndices", "createKernelOutput", "createIntermediateOutput", "outputCount", "inputDatas", "gpuData", "outputs", "dispatchGroup", "programUniforms", "validatedOutputIndices", "_", "outputDatas", "isTemporary", "isPersistent", "tensorView", "persistentData", "uniformBufferBinding", "currentOffset", "offsets", "v", "sizeOfElement", "sizeOfVecOrMat", "baseAlignment", "elementPerVecOrMat", "maxAlignmentOfField", "arrayBuffer", "offset", "uniformBufferData", "normalizedDispatchGroup", "artifact", "LOG_DEBUG", "uniform", "actualType", "actualLength", "length", "gpuDataId", "src", "dst", "getTargetBuffer", "size", "ptr", "attribute", "op", "WEBGPU_OP_RESOLVE_RULES", "context", "errors", "kernel", "kernelEntry", "attributes", "useErrorScope", "e", "err", "sessionId", "index", "buffer", "sessionInputOutputMapping", "previousBuffer", "id", "bufferInfo", "gpuBuffer", "downloadGpuData", "createView", "sessionCommandList", "sessionPendingKernels", "computePassEncoder", "command", "init_exports", "__export", "init", "TensorViewImpl", "ComputeContextImpl", "init_init", "__esmMin", "init_wasm_common", "init_backend_webgpu", "init_log", "init_util", "_TensorViewImpl", "module", "dataType", "data", "dims", "elementCount", "ShapeUtil", "newDims", "backend", "contextDataOffset", "heapU32", "dataIndex", "inputCount", "inputs", "i", "dim", "d", "program", "inputsOutputsMapping", "mappedInputs", "outputIndices", "createKernelOutput", "index", "createTemporaryOutput", "elementSize", "getTensorElementSize", "bufferSize", "gpuDataId", "stack", "offset", "e", "name", "env", "gpuAdapter", "jsepInit", "WebGpuBackend", "size", "ptr", "src", "dst", "isSourceGpu", "LOG_DEBUG", "dataOffset", "kernelType", "kernelId", "attribute", "kernel", "sessionHandle", "errors", "context", "initOrt", "initRuntime", "initEp", "activeSessions", "getSessionInputOutputCount", "copyFromExternalBuffer", "createSession", "releaseSession", "prepareInputOutputTensor", "run", "endProfiling", "extractTransferableBuffers", "init_wasm_core_impl", "__esmMin", "init_run_options", "init_session_options", "init_wasm_common", "init_wasm_factory", "init_wasm_utils", "init_wasm_utils_load_file", "numThreads", "loggingLevel", "getInstance", "checkLastError", "env", "logLevelStringToEnum", "epName", "initJsep", "adapter", "powerPreference", "forceFallbackAdapter", "sessionHandle", "wasm", "stack", "dataOffset", "model", "modelDataOffset", "modelData", "options", "modelDataLength", "sessionOptionsHandle", "ioBindingHandle", "allocs", "inputNamesUTF8Encoded", "outputNamesUTF8Encoded", "setSessionOptions", "loadingPromises", "file", "path", "loadFile", "data", "provider", "webnnOptions", "context", "gpuDevice", "deviceType", "inputCount", "outputCount", "enableGraphCapture", "inputNames", "outputNames", "outputPreferredLocations", "i", "name", "nameString", "location", "bindingState", "l", "dataLocationStringToEnum", "e", "buf", "alloc", "sessionId", "session", "ioBindingState", "tensor", "tensorHandles", "index", "dataType", "dims", "rawData", "dataByteLength", "gpuBuffer", "elementSizeInBytes", "getTensorElementSize", "tensorDataTypeStringToEnum", "a", "b", "registerBuffer", "dataIndex", "allocWasmString", "dimsOffset", "dimIndex", "d", "inputIndices", "inputTensors", "outputIndices", "outputTensors", "inputOutputBound", "runOptionsHandle", "runOptionsAllocs", "inputTensorHandles", "outputTensorHandles", "inputOutputAllocs", "beforeRunStack", "inputValuesOffset", "inputNamesOffset", "outputValuesOffset", "outputNamesOffset", "setRunOptions", "inputValuesIndex", "inputNamesIndex", "outputValuesIndex", "outputNamesIndex", "handle", "outputPreferredLocationsEncoded", "errorCode", "output", "beforeGetTensorDataStack", "tensorDataOffset", "keepOutputTensor", "type", "tensorDataIndex", "dimsLength", "size", "tensorDataTypeEnumToString", "preferredLocation", "stringData", "offset", "maxBytesToRead", "getBuffer", "elementSize", "isGpuBufferSupportedType", "typedArrayConstructor", "tensorTypeToTypedArrayConstructor", "v", "p", "profileFileName", "tensors", "buffers", "isProxy", "proxyWorker", "initializing", "initialized", "aborted", "temporaryObjectUrl", "initWasmCallbacks", "queuedCallbacks", "enqueueCallbacks", "ensureWorker", "onProxyWorkerMessage", "initializeWebAssemblyAndOrtRuntime", "initializeOrtEp", "copyFromExternalBuffer", "createSession", "releaseSession", "run", "endProfiling", "init_proxy_wrapper", "__esmMin", "init_esm", "init_wasm_core_impl", "init_wasm_factory", "init_wasm_utils_import", "env", "type", "callbacks", "queue", "ev", "resolve", "reject", "importProxyWorker", "objectUrl", "worker", "message", "e", "initializeWebAssembly", "initRuntime", "epName", "initEp", "buffer", "model", "options", "transferable", "sessionId", "inputIndices", "inputs", "outputIndices", "outputs", "t", "serializableInputs", "extractTransferableBuffers", "encodeTensorMetadata", "decodeTensorMetadata", "OnnxruntimeWebAssemblySessionHandler", "init_session_handler_inference", "__esmMin", "init_esm", "init_proxy_wrapper", "init_wasm_common", "init_wasm_utils_env", "init_wasm_utils_load_file", "tensor", "getName", "Tensor", "dataType", "isGpuBufferSupportedType", "gpuBuffer", "download", "dispose", "path", "copyFromExternalBuffer", "loadFile", "pathOrBuffer", "options", "TRACE_FUNC_BEGIN", "model", "createSession", "TRACE_FUNC_END", "releaseSession", "feeds", "fetches", "inputArray", "inputIndices", "kvp", "name", "index", "outputArray", "outputIndices", "inputs", "t", "i", "outputs", "results", "run", "resultMap", "endProfiling", "initializeFlags", "OnnxruntimeWebAssemblyBackend", "init_backend_wasm", "__esmMin", "init_esm", "init_proxy_wrapper", "init_session_handler_inference", "init_wasm_utils_import", "env", "numCpuLogicalCores", "backendName", "initializeWebAssemblyAndOrtRuntime", "initializeOrtEp", "pathOrBuffer", "options", "handler", "OnnxruntimeWebAssemblySessionHandler", "backend_wasm_inference_exports", "__export", "wasmBackend", "init_backend_wasm_inference", "__esmMin", "init_backend_wasm", "OnnxruntimeWebAssemblyBackend", "init_esm", "version", "lib_default", "esm_exports", "onnxjsBackend", "registerBackend", "wasmBackend", "env", "version"] + "sourcesContent": ["// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Backend} from './backend.js';\nimport {InferenceSession} from './inference-session.js';\n\ninterface BackendInfo {\n backend: Backend;\n priority: number;\n\n initPromise?: Promise;\n initialized?: boolean;\n aborted?: boolean;\n error?: string;\n}\n\nconst backends: Map = new Map();\nconst backendsSortedByPriority: string[] = [];\n\n/**\n * Register a backend.\n *\n * @param name - the name as a key to lookup as an execution provider.\n * @param backend - the backend object.\n * @param priority - an integer indicating the priority of the backend. Higher number means higher priority. if priority\n * < 0, it will be considered as a 'beta' version and will not be used as a fallback backend by default.\n *\n * @ignore\n */\nexport const registerBackend = (name: string, backend: Backend, priority: number): void => {\n if (backend && typeof backend.init === 'function' && typeof backend.createInferenceSessionHandler === 'function') {\n const currentBackend = backends.get(name);\n if (currentBackend === undefined) {\n backends.set(name, {backend, priority});\n } else if (currentBackend.priority > priority) {\n // same name is already registered with a higher priority. skip registeration.\n return;\n } else if (currentBackend.priority === priority) {\n if (currentBackend.backend !== backend) {\n throw new Error(`cannot register backend \"${name}\" using priority ${priority}`);\n }\n }\n\n if (priority >= 0) {\n const i = backendsSortedByPriority.indexOf(name);\n if (i !== -1) {\n backendsSortedByPriority.splice(i, 1);\n }\n\n for (let i = 0; i < backendsSortedByPriority.length; i++) {\n if (backends.get(backendsSortedByPriority[i])!.priority <= priority) {\n backendsSortedByPriority.splice(i, 0, name);\n return;\n }\n }\n backendsSortedByPriority.push(name);\n }\n return;\n }\n\n throw new TypeError('not a valid backend');\n};\n\n/**\n * Try to resolve and initialize a backend.\n *\n * @param backendName - the name of the backend.\n * @returns the backend instance if resolved and initialized successfully, or an error message if failed.\n */\nconst tryResolveAndInitializeBackend = async(backendName: string): Promise => {\n const backendInfo = backends.get(backendName);\n if (!backendInfo) {\n return 'backend not found.';\n }\n\n if (backendInfo.initialized) {\n return backendInfo.backend;\n } else if (backendInfo.aborted) {\n return backendInfo.error!;\n } else {\n const isInitializing = !!backendInfo.initPromise;\n try {\n if (!isInitializing) {\n backendInfo.initPromise = backendInfo.backend.init(backendName);\n }\n await backendInfo.initPromise;\n backendInfo.initialized = true;\n return backendInfo.backend;\n } catch (e) {\n if (!isInitializing) {\n backendInfo.error = `${e}`;\n backendInfo.aborted = true;\n }\n return backendInfo.error!;\n } finally {\n delete backendInfo.initPromise;\n }\n }\n};\n\n/**\n * Resolve execution providers from the specific session options.\n *\n * @param options - the session options object.\n * @returns a promise that resolves to a tuple of an initialized backend instance and a session options object with\n * filtered EP list.\n *\n * @ignore\n */\nexport const resolveBackendAndExecutionProviders = async(options: InferenceSession.SessionOptions):\n Promise<[backend: Backend, options: InferenceSession.SessionOptions]> => {\n // extract backend hints from session options\n const eps = options.executionProviders || [];\n const backendHints = eps.map(i => typeof i === 'string' ? i : i.name);\n const backendNames = backendHints.length === 0 ? backendsSortedByPriority : backendHints;\n\n // try to resolve and initialize all requested backends\n let backend: Backend|undefined;\n const errors = [];\n const availableBackendNames = new Set();\n for (const backendName of backendNames) {\n const resolveResult = await tryResolveAndInitializeBackend(backendName);\n if (typeof resolveResult === 'string') {\n errors.push({name: backendName, err: resolveResult});\n } else {\n if (!backend) {\n backend = resolveResult;\n }\n if (backend === resolveResult) {\n availableBackendNames.add(backendName);\n }\n }\n }\n\n // if no backend is available, throw error.\n if (!backend) {\n throw new Error(`no available backend found. ERR: ${errors.map(e => `[${e.name}] ${e.err}`).join(', ')}`);\n }\n\n // for each explicitly requested backend, if it's not available, output warning message.\n for (const {name, err} of errors) {\n if (backendHints.includes(name)) {\n // eslint-disable-next-line no-console\n console.warn(`removing requested execution provider \"${\n name}\" from session options because it is not available: ${err}`);\n }\n }\n\n const filteredEps = eps.filter(i => availableBackendNames.has(typeof i === 'string' ? i : i.name));\n\n return [\n backend, new Proxy(options, {\n get: (target, prop) => {\n if (prop === 'executionProviders') {\n return filteredEps;\n }\n return Reflect.get(target, prop);\n }\n })\n ];\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession} from './inference-session.js';\nimport {OnnxValue} from './onnx-value.js';\nimport {TrainingSession} from './training-session.js';\n\n/**\n * @ignore\n */\nexport declare namespace SessionHandler {\n type FeedsType = {[name: string]: OnnxValue};\n type FetchesType = {[name: string]: OnnxValue | null};\n type ReturnType = {[name: string]: OnnxValue};\n}\n\n/**\n * Represents shared SessionHandler functionality\n *\n * @ignore\n */\ninterface SessionHandler {\n dispose(): Promise;\n\n readonly inputNames: readonly string[];\n readonly outputNames: readonly string[];\n}\n\n/**\n * Represent a handler instance of an inference session.\n *\n * @ignore\n */\nexport interface InferenceSessionHandler extends SessionHandler {\n startProfiling(): void;\n endProfiling(): void;\n\n run(feeds: SessionHandler.FeedsType, fetches: SessionHandler.FetchesType,\n options: InferenceSession.RunOptions): Promise;\n}\n\n/**\n * Represent a handler instance of a training inference session.\n *\n * @ignore\n */\nexport interface TrainingSessionHandler extends SessionHandler {\n readonly evalInputNames: readonly string[];\n readonly evalOutputNames: readonly string[];\n\n lazyResetGrad(): Promise;\n runTrainStep(\n feeds: SessionHandler.FeedsType, fetches: SessionHandler.FetchesType,\n options: InferenceSession.RunOptions): Promise;\n runOptimizerStep(options: InferenceSession.RunOptions): Promise;\n runEvalStep(\n feeds: SessionHandler.FeedsType, fetches: SessionHandler.FetchesType,\n options: InferenceSession.RunOptions): Promise;\n\n getParametersSize(trainableOnly: boolean): Promise;\n loadParametersBuffer(buffer: Uint8Array, trainableOnly: boolean): Promise;\n getContiguousParameters(trainableOnly: boolean): Promise;\n}\n\n/**\n * Represent a backend that provides implementation of model inferencing.\n *\n * @ignore\n */\nexport interface Backend {\n /**\n * Initialize the backend asynchronously. Should throw when failed.\n */\n init(backendName: string): Promise;\n\n createInferenceSessionHandler(uriOrBuffer: string|Uint8Array, options?: InferenceSession.SessionOptions):\n Promise;\n\n createTrainingSessionHandler?\n (checkpointStateUriOrBuffer: TrainingSession.UriOrBuffer, trainModelUriOrBuffer: TrainingSession.UriOrBuffer,\n evalModelUriOrBuffer: TrainingSession.UriOrBuffer, optimizerModelUriOrBuffer: TrainingSession.UriOrBuffer,\n options: InferenceSession.SessionOptions): Promise;\n}\n\nexport {registerBackend} from './backend-impl.js';\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// This file is generated by /js/scripts/update-version.ts\n// Do not modify file content manually.\n\nexport const version = '1.19.0';\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from './env.js';\nimport {version} from './version.js';\n\ntype LogLevelType = Env['logLevel'];\n\nlet logLevelValue: Required = 'warning';\n\nexport const env: Env = {\n wasm: {} as Env.WebAssemblyFlags,\n webgl: {} as Env.WebGLFlags,\n webgpu: {} as Env.WebGpuFlags,\n versions: {common: version},\n\n set logLevel(value: LogLevelType) {\n if (value === undefined) {\n return;\n }\n if (typeof value !== 'string' || ['verbose', 'info', 'warning', 'error', 'fatal'].indexOf(value) === -1) {\n throw new Error(`Unsupported logging level: ${value}`);\n }\n logLevelValue = value;\n },\n get logLevel(): Required {\n return logLevelValue;\n },\n};\n\n// set property 'logLevel' so that they can be correctly transferred to worker by `postMessage()`.\nObject.defineProperty(env, 'logLevel', {enumerable: true});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env as envImpl} from './env-impl.js';\n\nexport declare namespace Env {\n export type WasmPathPrefix = string;\n export interface WasmFilePaths {\n /**\n * Specify the override path for the main .wasm file.\n *\n * This path should be an absolute path.\n *\n * If not modified, the filename of the .wasm file is:\n * - `ort-wasm-simd-threaded.wasm` for default build\n * - `ort-wasm-simd-threaded.jsep.wasm` for JSEP build (with WebGPU and WebNN)\n * - `ort-training-wasm-simd-threaded.wasm` for training build\n */\n wasm?: URL|string;\n /**\n * Specify the override path for the main .mjs file.\n *\n * This path should be an absolute path.\n *\n * If not modified, the filename of the .mjs file is:\n * - `ort-wasm-simd-threaded.mjs` for default build\n * - `ort-wasm-simd-threaded.jsep.mjs` for JSEP build (with WebGPU and WebNN)\n * - `ort-training-wasm-simd-threaded.mjs` for training build\n */\n mjs?: URL|string;\n }\n export type WasmPrefixOrFilePaths = WasmPathPrefix|WasmFilePaths;\n export interface WebAssemblyFlags {\n /**\n * set or get number of thread(s). If omitted or set to 0, number of thread(s) will be determined by system. If set\n * to 1, no worker thread will be spawned.\n *\n * This setting is available only when WebAssembly multithread feature is available in current context.\n *\n * @defaultValue `0`\n */\n numThreads?: number;\n\n /**\n * set or get a boolean value indicating whether to enable SIMD. If set to false, SIMD will be forcely disabled.\n *\n * This setting is available only when WebAssembly SIMD feature is available in current context.\n *\n * @deprecated This property is deprecated. Since SIMD is supported by all major JavaScript engines, non-SIMD\n * build is no longer provided. This property will be removed in future release.\n * @defaultValue `true`\n */\n simd?: boolean;\n\n /**\n * set or get a boolean value indicating whether to enable trace.\n *\n * @deprecated Use `env.trace` instead. If `env.trace` is set, this property will be ignored.\n * @defaultValue `false`\n */\n trace?: boolean;\n\n /**\n * Set or get a number specifying the timeout for initialization of WebAssembly backend, in milliseconds. A zero\n * value indicates no timeout is set.\n *\n * @defaultValue `0`\n */\n initTimeout?: number;\n\n /**\n * Set a custom URL prefix to the .wasm/.mjs files, or an object of overrides for both .wasm/.mjs file. The override\n * path should be an absolute path.\n */\n wasmPaths?: WasmPrefixOrFilePaths;\n\n /**\n * Set or get a boolean value indicating whether to proxy the execution of main thread to a worker thread.\n *\n * @defaultValue `false`\n */\n proxy?: boolean;\n }\n\n export interface WebGLFlags {\n /**\n * Set or get the WebGL Context ID (webgl or webgl2).\n *\n * @defaultValue `'webgl2'`\n */\n contextId?: 'webgl'|'webgl2';\n /**\n * Get the WebGL rendering context.\n */\n readonly context: WebGLRenderingContext;\n /**\n * Set or get the maximum batch size for matmul. 0 means to disable batching.\n *\n * @deprecated\n */\n matmulMaxBatchSize?: number;\n /**\n * Set or get the texture cache mode.\n *\n * @defaultValue `'full'`\n */\n textureCacheMode?: 'initializerOnly'|'full';\n /**\n * Set or get the packed texture mode\n *\n * @defaultValue `false`\n */\n pack?: boolean;\n /**\n * Set or get whether enable async download.\n *\n * @defaultValue `false`\n */\n async?: boolean;\n }\n\n export interface WebGpuProfilingDataV1TensorMetadata {\n dims: readonly number[];\n dataType: string;\n }\n export interface WebGpuProfilingDataV1 {\n version: 1;\n inputsMetadata: readonly WebGpuProfilingDataV1TensorMetadata[];\n outputsMetadata: readonly WebGpuProfilingDataV1TensorMetadata[];\n kernelId: number;\n kernelType: string;\n kernelName: string;\n programName: string;\n startTime: number;\n endTime: number;\n }\n\n export type WebGpuProfilingData = WebGpuProfilingDataV1;\n\n export interface WebGpuFlags {\n /**\n * Set or get the profiling mode.\n *\n * @deprecated Use `env.webgpu.profiling.mode` instead. If `env.webgpu.profiling.mode` is set, this property will be\n * ignored.\n */\n profilingMode?: 'off'|'default';\n /**\n * Set or get the profiling configuration.\n */\n profiling?: {\n /**\n * Set or get the profiling mode.\n *\n * @defaultValue `'off'`\n */\n mode?: 'off'|'default';\n\n /**\n * Set or get a callback function when a profiling data is received. If not set, the profiling data will be\n * printed to console.\n */\n ondata?: (data: WebGpuProfilingData) => void;\n };\n /**\n * Set or get the power preference.\n *\n * Setting this property only has effect before the first WebGPU inference session is created. The value will be\n * used as options for `navigator.gpu.requestAdapter()`.\n *\n * See {@link https://gpuweb.github.io/gpuweb/#dictdef-gpurequestadapteroptions} for more details.\n *\n * @defaultValue `undefined`\n */\n powerPreference?: 'low-power'|'high-performance';\n /**\n * Set or get the force fallback adapter flag.\n *\n * Setting this property only has effect before the first WebGPU inference session is created. The value will be\n * used as options for `navigator.gpu.requestAdapter()`.\n *\n * See {@link https://gpuweb.github.io/gpuweb/#dictdef-gpurequestadapteroptions} for more details.\n *\n * @defaultValue `undefined`\n */\n forceFallbackAdapter?: boolean;\n /**\n * Set or get the adapter for WebGPU.\n *\n * Setting this property only has effect before the first WebGPU inference session is created. The value will be\n * used as the GPU adapter for the underlying WebGPU backend to create GPU device.\n *\n * If this property is not set, it will be available to get after the first WebGPU inference session is created. The\n * value will be the GPU adapter that created by the underlying WebGPU backend.\n *\n * When use with TypeScript, the type of this property is `GPUAdapter` defined in \"@webgpu/types\".\n * Use `const adapter = env.webgpu.adapter as GPUAdapter;` in TypeScript to access this property with correct type.\n *\n * see comments on {@link Tensor.GpuBufferType}\n */\n adapter: unknown;\n /**\n * Get the device for WebGPU.\n *\n * This property is only available after the first WebGPU inference session is created.\n *\n * When use with TypeScript, the type of this property is `GPUDevice` defined in \"@webgpu/types\".\n * Use `const device = env.webgpu.device as GPUDevice;` in TypeScript to access this property with correct type.\n *\n * see comments on {@link Tensor.GpuBufferType} for more details about why not use types defined in \"@webgpu/types\".\n */\n readonly device: unknown;\n /**\n * Set or get whether validate input content.\n *\n * @defaultValue `false`\n */\n validateInputContent?: boolean;\n }\n}\n\nexport interface Env {\n /**\n * set the severity level for logging.\n *\n * @defaultValue `'warning'`\n */\n logLevel?: 'verbose'|'info'|'warning'|'error'|'fatal';\n\n /**\n * Indicate whether run in debug mode.\n *\n * @defaultValue `false`\n */\n debug?: boolean;\n\n /**\n * set or get a boolean value indicating whether to enable trace.\n *\n * @defaultValue `false`\n */\n trace?: boolean;\n\n /**\n * Get version of the current package.\n */\n readonly versions: {\n readonly common: string;\n readonly web?: string;\n readonly node?: string;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n readonly 'react-native'?: string;\n };\n\n /**\n * Represent a set of flags for WebAssembly\n */\n readonly wasm: Env.WebAssemblyFlags;\n\n /**\n * Represent a set of flags for WebGL\n */\n readonly webgl: Env.WebGLFlags;\n\n /**\n * Represent a set of flags for WebGPU\n */\n readonly webgpu: Env.WebGpuFlags;\n\n [name: string]: unknown;\n}\n\n/**\n * Represent a set of flags as a global singleton.\n */\nexport const env: Env = envImpl;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorToDataUrlOptions, TensorToImageDataOptions} from './tensor-conversion.js';\nimport {Tensor} from './tensor.js';\n\n/**\n * implementation of Tensor.toDataURL()\n */\nexport const tensorToDataURL = (tensor: Tensor, options?: TensorToDataUrlOptions): string => {\n const canvas = typeof document !== 'undefined' ? document.createElement('canvas') : (new OffscreenCanvas(1, 1));\n canvas.width = tensor.dims[3];\n canvas.height = tensor.dims[2];\n const pixels2DContext =\n canvas.getContext('2d') as (CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null);\n\n if (pixels2DContext != null) {\n // Default values for height and width & format\n let width: number;\n let height: number;\n if (options?.tensorLayout !== undefined && options.tensorLayout === 'NHWC') {\n width = tensor.dims[2];\n height = tensor.dims[3];\n } else { // Default layout is NCWH\n width = tensor.dims[3];\n height = tensor.dims[2];\n }\n\n const inputformat = options?.format !== undefined ? options.format : 'RGB';\n\n const norm = options?.norm;\n let normMean: [number, number, number, number];\n let normBias: [number, number, number, number];\n if (norm === undefined || norm.mean === undefined) {\n normMean = [255, 255, 255, 255];\n } else {\n if (typeof (norm.mean) === 'number') {\n normMean = [norm.mean, norm.mean, norm.mean, norm.mean];\n } else {\n normMean = [norm.mean[0], norm.mean[1], norm.mean[2], 0];\n if (norm.mean[3] !== undefined) {\n normMean[3] = norm.mean[3];\n }\n }\n }\n if (norm === undefined || norm.bias === undefined) {\n normBias = [0, 0, 0, 0];\n } else {\n if (typeof (norm.bias) === 'number') {\n normBias = [norm.bias, norm.bias, norm.bias, norm.bias];\n } else {\n normBias = [norm.bias[0], norm.bias[1], norm.bias[2], 0];\n if (norm.bias[3] !== undefined) {\n normBias[3] = norm.bias[3];\n }\n }\n }\n\n const stride = height * width;\n // Default pointer assignments\n let rTensorPointer = 0, gTensorPointer = stride, bTensorPointer = stride * 2, aTensorPointer = -1;\n\n // Updating the pointer assignments based on the input image format\n if (inputformat === 'RGBA') {\n rTensorPointer = 0;\n gTensorPointer = stride;\n bTensorPointer = stride * 2;\n aTensorPointer = stride * 3;\n } else if (inputformat === 'RGB') {\n rTensorPointer = 0;\n gTensorPointer = stride;\n bTensorPointer = stride * 2;\n } else if (inputformat === 'RBG') {\n rTensorPointer = 0;\n bTensorPointer = stride;\n gTensorPointer = stride * 2;\n }\n\n for (let i = 0; i < height; i++) {\n for (let j = 0; j < width; j++) {\n const R = ((tensor.data[rTensorPointer++] as number) - normBias[0]) * normMean[0]; // R value\n const G = ((tensor.data[gTensorPointer++] as number) - normBias[1]) * normMean[1]; // G value\n const B = ((tensor.data[bTensorPointer++] as number) - normBias[2]) * normMean[2]; // B value\n const A = aTensorPointer === -1 ?\n 255 :\n ((tensor.data[aTensorPointer++] as number) - normBias[3]) * normMean[3]; // A value\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n pixels2DContext.fillStyle = 'rgba(' + R + ',' + G + ',' + B + ',' + A + ')';\n pixels2DContext.fillRect(j, i, 1, 1);\n }\n }\n if ('toDataURL' in canvas) {\n return canvas.toDataURL();\n } else {\n throw new Error('toDataURL is not supported');\n }\n } else {\n throw new Error('Can not access image data');\n }\n};\n\n/**\n * implementation of Tensor.toImageData()\n */\nexport const tensorToImageData = (tensor: Tensor, options?: TensorToImageDataOptions): ImageData => {\n const pixels2DContext = typeof document !== 'undefined' ?\n document.createElement('canvas').getContext('2d') :\n new OffscreenCanvas(1, 1).getContext('2d') as OffscreenCanvasRenderingContext2D;\n let image: ImageData;\n if (pixels2DContext != null) {\n // Default values for height and width & format\n let width: number;\n let height: number;\n let channels: number;\n if (options?.tensorLayout !== undefined && options.tensorLayout === 'NHWC') {\n width = tensor.dims[2];\n height = tensor.dims[1];\n channels = tensor.dims[3];\n } else { // Default layout is NCWH\n width = tensor.dims[3];\n height = tensor.dims[2];\n channels = tensor.dims[1];\n }\n const inputformat = options !== undefined ? (options.format !== undefined ? options.format : 'RGB') : 'RGB';\n\n const norm = options?.norm;\n let normMean: [number, number, number, number];\n let normBias: [number, number, number, number];\n if (norm === undefined || norm.mean === undefined) {\n normMean = [255, 255, 255, 255];\n } else {\n if (typeof (norm.mean) === 'number') {\n normMean = [norm.mean, norm.mean, norm.mean, norm.mean];\n } else {\n normMean = [norm.mean[0], norm.mean[1], norm.mean[2], 255];\n if (norm.mean[3] !== undefined) {\n normMean[3] = norm.mean[3];\n }\n }\n }\n if (norm === undefined || norm.bias === undefined) {\n normBias = [0, 0, 0, 0];\n } else {\n if (typeof (norm.bias) === 'number') {\n normBias = [norm.bias, norm.bias, norm.bias, norm.bias];\n } else {\n normBias = [norm.bias[0], norm.bias[1], norm.bias[2], 0];\n if (norm.bias[3] !== undefined) {\n normBias[3] = norm.bias[3];\n }\n }\n }\n\n const stride = height * width;\n if (options !== undefined) {\n if (options.format !== undefined && (channels === 4 && options.format !== 'RGBA') ||\n (channels === 3 && (options.format !== 'RGB' && options.format !== 'BGR'))) {\n throw new Error('Tensor format doesn\\'t match input tensor dims');\n }\n }\n\n // Default pointer assignments\n const step = 4;\n let rImagePointer = 0, gImagePointer = 1, bImagePointer = 2, aImagePointer = 3;\n let rTensorPointer = 0, gTensorPointer = stride, bTensorPointer = stride * 2, aTensorPointer = -1;\n\n // Updating the pointer assignments based on the input image format\n if (inputformat === 'RGBA') {\n rTensorPointer = 0;\n gTensorPointer = stride;\n bTensorPointer = stride * 2;\n aTensorPointer = stride * 3;\n } else if (inputformat === 'RGB') {\n rTensorPointer = 0;\n gTensorPointer = stride;\n bTensorPointer = stride * 2;\n } else if (inputformat === 'RBG') {\n rTensorPointer = 0;\n bTensorPointer = stride;\n gTensorPointer = stride * 2;\n }\n\n image = pixels2DContext.createImageData(width, height);\n\n for (let i = 0; i < height * width;\n rImagePointer += step, gImagePointer += step, bImagePointer += step, aImagePointer += step, i++) {\n image.data[rImagePointer] = ((tensor.data[rTensorPointer++] as number) - normBias[0]) * normMean[0]; // R value\n image.data[gImagePointer] = ((tensor.data[gTensorPointer++] as number) - normBias[1]) * normMean[1]; // G value\n image.data[bImagePointer] = ((tensor.data[bTensorPointer++] as number) - normBias[2]) * normMean[2]; // B value\n image.data[aImagePointer] = aTensorPointer === -1 ?\n 255 :\n ((tensor.data[aTensorPointer++] as number) - normBias[3]) * normMean[3]; // A value\n }\n\n } else {\n throw new Error('Can not access image data');\n }\n return image;\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {OptionsDimensions, OptionsFormat, OptionsNormalizationParameters, OptionsTensorFormat, OptionsTensorLayout, TensorFromGpuBufferOptions, TensorFromImageBitmapOptions, TensorFromImageDataOptions, TensorFromImageElementOptions, TensorFromTextureOptions, TensorFromUrlOptions} from './tensor-factory.js';\nimport {Tensor} from './tensor-impl.js';\nimport {Tensor as TensorInterface} from './tensor.js';\n\ninterface BufferToTensorOptions extends OptionsDimensions, OptionsTensorLayout, OptionsNormalizationParameters,\n OptionsFormat, OptionsTensorFormat {}\n\n/**\n * Create a new tensor object from image object\n *\n * @param buffer - Extracted image buffer data - assuming RGBA format\n * @param imageFormat - input image configuration - required configurations height, width, format\n * @param tensorFormat - output tensor configuration - Default is RGB format\n */\nexport const bufferToTensor = (buffer: Uint8ClampedArray|undefined, options: BufferToTensorOptions): Tensor => {\n if (buffer === undefined) {\n throw new Error('Image buffer must be defined');\n }\n if (options.height === undefined || options.width === undefined) {\n throw new Error('Image height and width must be defined');\n }\n if (options.tensorLayout === 'NHWC') {\n throw new Error('NHWC Tensor layout is not supported yet');\n }\n\n const {height, width} = options;\n\n const norm = options.norm ?? {mean: 255, bias: 0};\n let normMean: [number, number, number, number];\n let normBias: [number, number, number, number];\n\n if (typeof (norm.mean) === 'number') {\n normMean = [norm.mean, norm.mean, norm.mean, norm.mean];\n } else {\n normMean = [norm.mean![0], norm.mean![1], norm.mean![2], norm.mean![3] ?? 255];\n }\n\n if (typeof (norm.bias) === 'number') {\n normBias = [norm.bias, norm.bias, norm.bias, norm.bias];\n } else {\n normBias = [norm.bias![0], norm.bias![1], norm.bias![2], norm.bias![3] ?? 0];\n }\n\n const inputformat = options.format !== undefined ? options.format : 'RGBA';\n // default value is RGBA since imagedata and HTMLImageElement uses it\n\n const outputformat =\n options.tensorFormat !== undefined ? (options.tensorFormat !== undefined ? options.tensorFormat : 'RGB') : 'RGB';\n const stride = height * width;\n const float32Data = outputformat === 'RGBA' ? new Float32Array(stride * 4) : new Float32Array(stride * 3);\n\n // Default pointer assignments\n let step = 4, rImagePointer = 0, gImagePointer = 1, bImagePointer = 2, aImagePointer = 3;\n let rTensorPointer = 0, gTensorPointer = stride, bTensorPointer = stride * 2, aTensorPointer = -1;\n\n // Updating the pointer assignments based on the input image format\n if (inputformat === 'RGB') {\n step = 3;\n rImagePointer = 0;\n gImagePointer = 1;\n bImagePointer = 2;\n aImagePointer = -1;\n }\n\n // Updating the pointer assignments based on the output tensor format\n if (outputformat === 'RGBA') {\n aTensorPointer = stride * 3;\n } else if (outputformat === 'RBG') {\n rTensorPointer = 0;\n bTensorPointer = stride;\n gTensorPointer = stride * 2;\n } else if (outputformat === 'BGR') {\n bTensorPointer = 0;\n gTensorPointer = stride;\n rTensorPointer = stride * 2;\n }\n\n for (let i = 0; i < stride;\n i++, rImagePointer += step, bImagePointer += step, gImagePointer += step, aImagePointer += step) {\n float32Data[rTensorPointer++] = (buffer[rImagePointer] + normBias[0]) / normMean[0];\n float32Data[gTensorPointer++] = (buffer[gImagePointer] + normBias[1]) / normMean[1];\n float32Data[bTensorPointer++] = (buffer[bImagePointer] + normBias[2]) / normMean[2];\n if (aTensorPointer !== -1 && aImagePointer !== -1) {\n float32Data[aTensorPointer++] = (buffer[aImagePointer] + normBias[3]) / normMean[3];\n }\n }\n\n // Float32Array -> ort.Tensor\n const outputTensor = outputformat === 'RGBA' ? new Tensor('float32', float32Data, [1, 4, height, width]) :\n new Tensor('float32', float32Data, [1, 3, height, width]);\n return outputTensor;\n};\n\n/**\n * implementation of Tensor.fromImage().\n */\nexport const tensorFromImage = async(\n image: ImageData|HTMLImageElement|ImageBitmap|string,\n options?: TensorFromImageDataOptions|TensorFromImageElementOptions|TensorFromImageBitmapOptions|\n TensorFromUrlOptions): Promise => {\n // checking the type of image object\n const isHTMLImageEle = typeof (HTMLImageElement) !== 'undefined' && image instanceof HTMLImageElement;\n const isImageDataEle = typeof (ImageData) !== 'undefined' && image instanceof ImageData;\n const isImageBitmap = typeof (ImageBitmap) !== 'undefined' && image instanceof ImageBitmap;\n const isString = typeof image === 'string';\n\n let data: Uint8ClampedArray|undefined;\n let bufferToTensorOptions: BufferToTensorOptions = options ?? {};\n\n const createCanvas = () => {\n if (typeof document !== 'undefined') {\n return document.createElement('canvas');\n } else if (typeof OffscreenCanvas !== 'undefined') {\n return new OffscreenCanvas(1, 1);\n } else {\n throw new Error('Canvas is not supported');\n }\n };\n const createCanvasContext = (canvas: HTMLCanvasElement|OffscreenCanvas) => {\n if (canvas instanceof HTMLCanvasElement) {\n return canvas.getContext('2d');\n } else if (canvas instanceof OffscreenCanvas) {\n return canvas.getContext('2d') as OffscreenCanvasRenderingContext2D;\n } else {\n return null;\n }\n };\n // filling and checking image configuration options\n if (isHTMLImageEle) {\n // HTMLImageElement - image object - format is RGBA by default\n const canvas = createCanvas();\n canvas.width = image.width;\n canvas.height = image.height;\n const pixels2DContext = createCanvasContext(canvas);\n\n if (pixels2DContext != null) {\n let height = image.height;\n let width = image.width;\n if (options !== undefined && options.resizedHeight !== undefined && options.resizedWidth !== undefined) {\n height = options.resizedHeight;\n width = options.resizedWidth;\n }\n\n if (options !== undefined) {\n bufferToTensorOptions = options;\n if (options.tensorFormat !== undefined) {\n throw new Error('Image input config format must be RGBA for HTMLImageElement');\n } else {\n bufferToTensorOptions.tensorFormat = 'RGBA';\n }\n bufferToTensorOptions.height = height;\n bufferToTensorOptions.width = width;\n } else {\n bufferToTensorOptions.tensorFormat = 'RGBA';\n bufferToTensorOptions.height = height;\n bufferToTensorOptions.width = width;\n }\n\n pixels2DContext.drawImage(image, 0, 0);\n data = pixels2DContext.getImageData(0, 0, width, height).data;\n } else {\n throw new Error('Can not access image data');\n }\n } else if (isImageDataEle) {\n let height: number;\n let width: number;\n\n if (options !== undefined && options.resizedWidth !== undefined && options.resizedHeight !== undefined) {\n height = options.resizedHeight;\n width = options.resizedWidth;\n } else {\n height = image.height;\n width = image.width;\n }\n\n if (options !== undefined) {\n bufferToTensorOptions = options;\n }\n bufferToTensorOptions.format = 'RGBA';\n bufferToTensorOptions.height = height;\n bufferToTensorOptions.width = width;\n\n if (options !== undefined) {\n const tempCanvas = createCanvas();\n\n tempCanvas.width = width;\n tempCanvas.height = height;\n\n const pixels2DContext = createCanvasContext(tempCanvas);\n\n if (pixels2DContext != null) {\n pixels2DContext.putImageData(image, 0, 0);\n data = pixels2DContext.getImageData(0, 0, width, height).data;\n } else {\n throw new Error('Can not access image data');\n }\n } else {\n data = image.data;\n }\n } else if (isImageBitmap) {\n // ImageBitmap - image object - format must be provided by user\n if (options === undefined) {\n throw new Error('Please provide image config with format for Imagebitmap');\n }\n\n const canvas = createCanvas();\n canvas.width = image.width;\n canvas.height = image.height;\n const pixels2DContext = createCanvasContext(canvas);\n\n if (pixels2DContext != null) {\n const height = image.height;\n const width = image.width;\n pixels2DContext.drawImage(image, 0, 0, width, height);\n data = pixels2DContext.getImageData(0, 0, width, height).data;\n bufferToTensorOptions.height = height;\n bufferToTensorOptions.width = width;\n return bufferToTensor(data, bufferToTensorOptions);\n } else {\n throw new Error('Can not access image data');\n }\n } else if (isString) {\n return new Promise((resolve, reject) => {\n const canvas = createCanvas();\n const context = createCanvasContext(canvas);\n if (!image || !context) {\n return reject();\n }\n const newImage = new Image();\n newImage.crossOrigin = 'Anonymous';\n newImage.src = image;\n newImage.onload = () => {\n canvas.width = newImage.width;\n canvas.height = newImage.height;\n context.drawImage(newImage, 0, 0, canvas.width, canvas.height);\n const img = context.getImageData(0, 0, canvas.width, canvas.height);\n\n bufferToTensorOptions.height = canvas.height;\n bufferToTensorOptions.width = canvas.width;\n resolve(bufferToTensor(img.data, bufferToTensorOptions));\n };\n });\n } else {\n throw new Error('Input data provided is not supported - aborted tensor creation');\n }\n\n if (data !== undefined) {\n return bufferToTensor(data, bufferToTensorOptions);\n } else {\n throw new Error('Input data provided is not supported - aborted tensor creation');\n }\n};\n\n/**\n * implementation of Tensor.fromTexture().\n */\nexport const tensorFromTexture = (\n texture: TensorInterface.TextureType, options: TensorFromTextureOptions): Tensor => {\n const {width, height, download, dispose} = options;\n // Always assume RGBAF32. TODO: support different texture format\n const dims = [1, height, width, 4];\n return new Tensor({location: 'texture', type: 'float32', texture, dims, download, dispose});\n};\n\n/**\n * implementation of Tensor.fromGpuBuffer().\n */\nexport const tensorFromGpuBuffer = (\n gpuBuffer: TensorInterface.GpuBufferType, options: TensorFromGpuBufferOptions): Tensor => {\n const {dataType, dims, download, dispose} = options;\n return new Tensor({location: 'gpu-buffer', type: dataType ?? 'float32', gpuBuffer, dims, download, dispose});\n};\n\n/**\n * implementation of Tensor.fromPinnedBuffer().\n */\nexport const tensorFromPinnedBuffer = (\n type: T, buffer: TensorInterface.DataTypeMap[T], dims?: readonly number[]): Tensor =>\n new Tensor({location: 'cpu-pinned', type, data: buffer, dims: dims ?? [buffer.length]});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from './tensor.js';\n\nexport type SupportedTypedArrayConstructors = Float32ArrayConstructor|Uint8ArrayConstructor|Int8ArrayConstructor|\n Uint16ArrayConstructor|Int16ArrayConstructor|Int32ArrayConstructor|BigInt64ArrayConstructor|Uint8ArrayConstructor|\n Float64ArrayConstructor|Uint32ArrayConstructor|BigUint64ArrayConstructor;\nexport type SupportedTypedArray = InstanceType;\n\n// a runtime map that maps type string to TypedArray constructor. Should match Tensor.DataTypeMap.\nexport const NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP = new Map([\n ['float32', Float32Array],\n ['uint8', Uint8Array],\n ['int8', Int8Array],\n ['uint16', Uint16Array],\n ['int16', Int16Array],\n ['int32', Int32Array],\n ['bool', Uint8Array],\n ['float64', Float64Array],\n ['uint32', Uint32Array],\n]);\n\n// a runtime map that maps type string to TypedArray constructor. Should match Tensor.DataTypeMap.\nexport const NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP = new Map([\n [Float32Array, 'float32'],\n [Uint8Array, 'uint8'],\n [Int8Array, 'int8'],\n [Uint16Array, 'uint16'],\n [Int16Array, 'int16'],\n [Int32Array, 'int32'],\n [Float64Array, 'float64'],\n [Uint32Array, 'uint32'],\n]);\n\n// a dummy type declaration for Float16Array in case any polyfill is available.\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-explicit-any\n const Float16Array: any;\n}\n\n// the following code allows delaying execution of BigInt/Float16Array checking. This allows lazy initialization for\n// NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP and NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP, which allows BigInt/Float16Array\n// polyfill if available.\nlet isTypedArrayChecked = false;\nexport const checkTypedArray = () => {\n if (!isTypedArrayChecked) {\n isTypedArrayChecked = true;\n const isBigInt64ArrayAvailable = typeof BigInt64Array !== 'undefined' && BigInt64Array.from;\n const isBigUint64ArrayAvailable = typeof BigUint64Array !== 'undefined' && BigUint64Array.from;\n const isFloat16ArrayAvailable = typeof Float16Array !== 'undefined' && Float16Array.from;\n\n if (isBigInt64ArrayAvailable) {\n NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('int64', BigInt64Array);\n NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(BigInt64Array, 'int64');\n }\n if (isBigUint64ArrayAvailable) {\n NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('uint64', BigUint64Array);\n NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(BigUint64Array, 'uint64');\n }\n if (isFloat16ArrayAvailable) {\n NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('float16', Float16Array);\n NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(Float16Array, 'float16');\n } else {\n // if Float16Array is not available, use 'Uint16Array' to store the data.\n NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('float16', Uint16Array);\n }\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {CpuPinnedConstructorParameters, GpuBufferConstructorParameters, TextureConstructorParameters} from './tensor-factory.js';\nimport {Tensor} from './tensor-impl.js';\n\n/**\n * calculate size from dims.\n *\n * @param dims the dims array. May be an illegal input.\n */\nexport const calculateSize = (dims: readonly unknown[]): number => {\n let size = 1;\n for (let i = 0; i < dims.length; i++) {\n const dim = dims[i];\n if (typeof dim !== 'number' || !Number.isSafeInteger(dim)) {\n throw new TypeError(`dims[${i}] must be an integer, got: ${dim}`);\n }\n if (dim < 0) {\n throw new RangeError(`dims[${i}] must be a non-negative integer, got: ${dim}`);\n }\n size *= dim;\n }\n return size;\n};\n\n/**\n * implementation of Tensor.reshape()\n */\nexport const tensorReshape = (tensor: Tensor, dims: readonly number[]): Tensor => {\n switch (tensor.location) {\n case 'cpu':\n return new Tensor(tensor.type, tensor.data, dims);\n case 'cpu-pinned':\n return new Tensor({\n location: 'cpu-pinned',\n data: tensor.data as CpuPinnedConstructorParameters['data'],\n type: tensor.type as CpuPinnedConstructorParameters['type'],\n dims,\n });\n case 'texture':\n return new Tensor({\n location: 'texture',\n texture: tensor.texture,\n type: tensor.type as TextureConstructorParameters['type'],\n dims,\n });\n case 'gpu-buffer':\n return new Tensor({\n location: 'gpu-buffer',\n gpuBuffer: tensor.gpuBuffer,\n type: tensor.type as GpuBufferConstructorParameters['type'],\n dims,\n });\n default:\n throw new Error(`tensorReshape: tensor location ${tensor.location} is not supported`);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {tensorToDataURL, tensorToImageData} from './tensor-conversion-impl.js';\nimport {TensorToDataUrlOptions, TensorToImageDataOptions} from './tensor-conversion.js';\nimport {tensorFromGpuBuffer, tensorFromImage, tensorFromPinnedBuffer, tensorFromTexture} from './tensor-factory-impl.js';\nimport {CpuPinnedConstructorParameters, GpuBufferConstructorParameters, TensorFromGpuBufferOptions, TensorFromImageBitmapOptions, TensorFromImageDataOptions, TensorFromImageElementOptions, TensorFromTextureOptions, TensorFromUrlOptions, TextureConstructorParameters} from './tensor-factory.js';\nimport {checkTypedArray, NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP, NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP, SupportedTypedArray, SupportedTypedArrayConstructors} from './tensor-impl-type-mapping.js';\nimport {calculateSize, tensorReshape} from './tensor-utils-impl.js';\nimport {Tensor as TensorInterface} from './tensor.js';\n\n// type aliases for those exported from Tensor interface\n\ntype TensorType = TensorInterface.Type;\ntype TensorDataType = TensorInterface.DataType;\ntype TensorDataLocation = TensorInterface.DataLocation;\ntype TensorTextureType = TensorInterface.TextureType;\ntype TensorGpuBufferType = TensorInterface.GpuBufferType;\n\n/**\n * the implementation of Tensor interface.\n *\n * @ignore\n */\nexport class Tensor implements TensorInterface {\n // #region constructors\n\n /**\n * Construct a new CPU tensor object from the given type, data and dims.\n */\n constructor(\n type: TensorType, data: TensorDataType|readonly string[]|readonly number[]|readonly boolean[],\n dims?: readonly number[]);\n /**\n * Construct a new CPU tensor object from the given data and dims. Type is inferred from data.\n */\n constructor(data: TensorDataType|readonly string[]|readonly boolean[], dims?: readonly number[]);\n /**\n * Construct a new tensor object from the pinned CPU data with the given type and dims.\n *\n * Tensor's location will be set to 'cpu-pinned'.\n *\n * @param params - Specify the parameters to construct the tensor.\n */\n constructor(params: CpuPinnedConstructorParameters);\n /**\n * Construct a new tensor object from the WebGL texture with the given type and dims.\n *\n * Tensor's location will be set to 'texture'.\n *\n * @param params - Specify the parameters to construct the tensor.\n */\n constructor(params: TextureConstructorParameters);\n /**\n * Construct a new tensor object from the WebGPU buffer with the given type and dims.\n *\n * Tensor's location will be set to 'gpu-buffer'.\n *\n * @param params - Specify the parameters to construct the tensor.\n */\n constructor(params: GpuBufferConstructorParameters);\n\n /**\n * implementation.\n */\n constructor(\n arg0: TensorType|TensorDataType|readonly string[]|readonly boolean[]|CpuPinnedConstructorParameters|\n TextureConstructorParameters|GpuBufferConstructorParameters,\n arg1?: TensorDataType|readonly number[]|readonly string[]|readonly boolean[], arg2?: readonly number[]) {\n // perform one-time check for BigInt/Float16Array support\n checkTypedArray();\n\n let type: TensorType;\n let dims: readonly number[];\n\n if (typeof arg0 === 'object' && 'location' in arg0) {\n //\n // constructing tensor from specific location\n //\n this.dataLocation = arg0.location;\n type = arg0.type;\n dims = arg0.dims;\n switch (arg0.location) {\n case 'cpu-pinned': {\n const expectedTypedArrayConstructor = NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.get(type);\n if (!expectedTypedArrayConstructor) {\n throw new TypeError(`unsupported type \"${type}\" to create tensor from pinned buffer`);\n }\n if (!(arg0.data instanceof expectedTypedArrayConstructor)) {\n throw new TypeError(`buffer should be of type ${expectedTypedArrayConstructor.name}`);\n }\n this.cpuData = arg0.data;\n break;\n }\n case 'texture': {\n if (type !== 'float32') {\n throw new TypeError(`unsupported type \"${type}\" to create tensor from texture`);\n }\n this.gpuTextureData = arg0.texture;\n this.downloader = arg0.download;\n this.disposer = arg0.dispose;\n break;\n }\n case 'gpu-buffer': {\n if ((type !== 'float32' && type !== 'float16' && type !== 'int32' && type !== 'int64' && type !== 'uint32' &&\n type !== 'uint8' && type !== 'bool')) {\n throw new TypeError(`unsupported type \"${type}\" to create tensor from gpu buffer`);\n }\n this.gpuBufferData = arg0.gpuBuffer;\n this.downloader = arg0.download;\n this.disposer = arg0.dispose;\n break;\n }\n default:\n throw new Error(`Tensor constructor: unsupported location '${this.dataLocation}'`);\n }\n } else {\n //\n // constructing tensor of location 'cpu'\n //\n let data: TensorDataType;\n let maybeDims: typeof arg1|typeof arg2;\n // check whether arg0 is type or data\n if (typeof arg0 === 'string') {\n //\n // Override: constructor(type, data, ...)\n //\n type = arg0;\n maybeDims = arg2;\n if (arg0 === 'string') {\n // string tensor\n if (!Array.isArray(arg1)) {\n throw new TypeError('A string tensor\\'s data must be a string array.');\n }\n // we don't check whether every element in the array is string; this is too slow. we assume it's correct and\n // error will be populated at inference\n data = arg1;\n } else {\n // numeric tensor\n const typedArrayConstructor = NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.get(arg0);\n if (typedArrayConstructor === undefined) {\n throw new TypeError(`Unsupported tensor type: ${arg0}.`);\n }\n if (Array.isArray(arg1)) {\n if (arg0 === 'float16' && typedArrayConstructor === Uint16Array) {\n // When no Float16Array polyfill is used, we cannot create 'float16' tensor from number array.\n //\n // Throw error here because when user try to use number array as data,\n // e.g. new Tensor('float16', [1, 2, 3, 4], dims)), it will actually call\n // Uint16Array.from(arg1) which generates wrong data.\n throw new TypeError(\n 'Creating a float16 tensor from number array is not supported. Please use Uint16Array as data.');\n } else if (arg0 === 'uint64' || arg0 === 'int64') {\n // use 'as any' here because:\n // 1. TypeScript's check on type of 'Array.isArray()' does not work with readonly arrays.\n // see https://github.com/microsoft/TypeScript/issues/17002\n // 2. TypeScript's check on union type of '(BigInt64ArrayConstructor|BigUint64ArrayConstructor).from()'\n // does not accept parameter mapFn.\n // 3. parameters of 'SupportedTypedArrayConstructors.from()' does not match the requirement of the union\n // type.\n\n // assume 'arg1' is of type \"readonly number[]|readonly bigint[]\" here.\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data = (typedArrayConstructor as any).from(arg1, BigInt);\n } else {\n // assume 'arg1' is of type \"readonly number[]\" here.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data = (typedArrayConstructor as any).from(arg1);\n }\n } else if (arg1 instanceof typedArrayConstructor) {\n data = arg1;\n } else {\n throw new TypeError(`A ${type} tensor's data must be type of ${typedArrayConstructor}`);\n }\n }\n } else {\n //\n // Override: constructor(data, ...)\n //\n maybeDims = arg1;\n if (Array.isArray(arg0)) {\n // only boolean[] and string[] is supported\n if (arg0.length === 0) {\n throw new TypeError('Tensor type cannot be inferred from an empty array.');\n }\n const firstElementType = typeof arg0[0];\n if (firstElementType === 'string') {\n type = 'string';\n data = arg0;\n } else if (firstElementType === 'boolean') {\n type = 'bool';\n // 'arg0' is of type 'boolean[]'. Uint8Array.from(boolean[]) actually works, but typescript thinks this is\n // wrong type. We use 'as any' to make it happy.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data = Uint8Array.from(arg0 as any[]);\n } else {\n throw new TypeError(`Invalid element type of data array: ${firstElementType}.`);\n }\n } else {\n // get tensor type from TypedArray\n const mappedType =\n NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.get(arg0.constructor as SupportedTypedArrayConstructors);\n if (mappedType === undefined) {\n throw new TypeError(`Unsupported type for tensor data: ${arg0.constructor}.`);\n }\n type = mappedType;\n data = arg0 as SupportedTypedArray;\n }\n }\n\n // type and data is processed, now processing dims\n if (maybeDims === undefined) {\n // assume 1-D tensor if dims omitted\n maybeDims = [data.length];\n } else if (!Array.isArray(maybeDims)) {\n throw new TypeError('A tensor\\'s dims must be a number array');\n }\n dims = maybeDims as readonly number[];\n\n this.cpuData = data;\n this.dataLocation = 'cpu';\n }\n\n // perform check on dims\n const size = calculateSize(dims);\n // if data is on CPU, check whether data length matches tensor size\n if (this.cpuData && size !== this.cpuData.length) {\n throw new Error(`Tensor's size(${size}) does not match data length(${this.cpuData.length}).`);\n }\n\n this.type = type;\n this.dims = dims;\n this.size = size;\n }\n // #endregion\n\n // #region factory\n static async fromImage(\n image: ImageData|HTMLImageElement|ImageBitmap|string,\n options?: TensorFromImageDataOptions|TensorFromImageElementOptions|TensorFromImageBitmapOptions|\n TensorFromUrlOptions): Promise {\n return tensorFromImage(image, options);\n }\n\n static fromTexture(\n texture: TensorTextureType, options: TensorFromTextureOptions): TensorInterface {\n return tensorFromTexture(texture, options);\n }\n\n static fromGpuBuffer(\n gpuBuffer: TensorGpuBufferType, options: TensorFromGpuBufferOptions): TensorInterface {\n return tensorFromGpuBuffer(gpuBuffer, options);\n }\n\n static fromPinnedBuffer(\n type: T, buffer: TensorInterface.DataTypeMap[T], dims?: readonly number[]): Tensor {\n return tensorFromPinnedBuffer(type, buffer, dims);\n }\n\n // #endregion\n\n // #region conversions\n toDataURL(options?: TensorToDataUrlOptions): string {\n return tensorToDataURL(this, options);\n }\n\n toImageData(options?: TensorToImageDataOptions): ImageData {\n return tensorToImageData(this, options);\n }\n // #endregion\n\n // #region public fields\n readonly dims: readonly number[];\n readonly type: TensorType;\n readonly size: number;\n // #endregion\n\n // #region private fields\n\n /**\n * stores the location of the data.\n */\n private dataLocation: TensorDataLocation;\n\n /**\n * stores the data on CPU, if location is 'cpu' or 'cpu-pinned'. otherwise empty.\n */\n private cpuData?: TensorDataType;\n\n /**\n * stores the underlying texture when location is 'texture'. otherwise empty.\n */\n private gpuTextureData?: TensorTextureType;\n\n /**\n * stores the underlying GPU buffer when location is 'gpu-buffer'. otherwise empty.\n */\n private gpuBufferData?: TensorGpuBufferType;\n\n /**\n * stores an optional downloader function to download data from GPU to CPU.\n */\n private downloader?(): Promise;\n\n /**\n * a flag indicating whether the data is being downloaded from GPU to CPU.\n */\n private isDownloading?: boolean;\n\n /**\n * stores an optional disposer function to dispose the underlying data.\n */\n private disposer?(): void;\n // #endregion\n\n // #region properties\n get data(): TensorDataType {\n this.ensureValid();\n if (!this.cpuData) {\n throw new Error(\n 'The data is not on CPU. Use `getData()` to download GPU data to CPU, ' +\n 'or use `texture` or `gpuBuffer` property to access the GPU data directly.');\n }\n return this.cpuData;\n }\n\n get location(): TensorDataLocation {\n return this.dataLocation;\n }\n\n get texture(): TensorTextureType {\n this.ensureValid();\n if (!this.gpuTextureData) {\n throw new Error('The data is not stored as a WebGL texture.');\n }\n return this.gpuTextureData;\n }\n\n get gpuBuffer(): TensorGpuBufferType {\n this.ensureValid();\n if (!this.gpuBufferData) {\n throw new Error('The data is not stored as a WebGPU buffer.');\n }\n return this.gpuBufferData;\n }\n // #endregion\n\n // #region methods\n\n async getData(releaseData?: boolean): Promise {\n this.ensureValid();\n switch (this.dataLocation) {\n case 'cpu':\n case 'cpu-pinned':\n return this.data;\n case 'texture':\n case 'gpu-buffer': {\n if (!this.downloader) {\n throw new Error('The current tensor is not created with a specified data downloader.');\n }\n if (this.isDownloading) {\n throw new Error('The current tensor is being downloaded.');\n }\n try {\n this.isDownloading = true;\n const data = await this.downloader();\n this.downloader = undefined;\n this.dataLocation = 'cpu';\n this.cpuData = data;\n\n if (releaseData && this.disposer) {\n this.disposer();\n this.disposer = undefined;\n }\n\n return data;\n\n } finally {\n this.isDownloading = false;\n }\n }\n default:\n throw new Error(`cannot get data from location: ${this.dataLocation}`);\n }\n }\n\n dispose(): void {\n if (this.isDownloading) {\n throw new Error('The current tensor is being downloaded.');\n }\n\n if (this.disposer) {\n this.disposer();\n this.disposer = undefined;\n }\n this.cpuData = undefined;\n this.gpuTextureData = undefined;\n this.gpuBufferData = undefined;\n this.downloader = undefined;\n this.isDownloading = undefined;\n\n this.dataLocation = 'none';\n }\n\n // #endregion\n\n // #region tensor utilities\n private ensureValid(): void {\n if (this.dataLocation === 'none') {\n throw new Error('The tensor is disposed.');\n }\n }\n\n reshape(dims: readonly number[]): TensorInterface {\n this.ensureValid();\n if (this.downloader || this.disposer) {\n throw new Error('Cannot reshape a tensor that owns GPU resource.');\n }\n return tensorReshape(this, dims);\n }\n // #endregion\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorFactory} from './tensor-factory.js';\nimport {Tensor as TensorImpl} from './tensor-impl.js';\nimport {TypedTensorUtils} from './tensor-utils.js';\n\n/* eslint-disable @typescript-eslint/no-redeclare */\n\n/**\n * represent a basic tensor with specified dimensions and data type.\n */\ninterface TypedTensorBase {\n /**\n * Get the dimensions of the tensor.\n */\n readonly dims: readonly number[];\n /**\n * Get the data type of the tensor.\n */\n readonly type: T;\n /**\n * Get the buffer data of the tensor.\n *\n * If the data is not on CPU (eg. it's in the form of WebGL texture or WebGPU buffer), throw error.\n */\n readonly data: Tensor.DataTypeMap[T];\n /**\n * Get the location of the data.\n */\n readonly location: Tensor.DataLocation;\n /**\n * Get the WebGL texture that holds the tensor data.\n *\n * If the data is not on GPU as WebGL texture, throw error.\n */\n readonly texture: Tensor.TextureType;\n /**\n * Get the WebGPU buffer that holds the tensor data.\n *\n * If the data is not on GPU as WebGPU buffer, throw error.\n */\n readonly gpuBuffer: Tensor.GpuBufferType;\n\n /**\n * Get the buffer data of the tensor.\n *\n * If the data is on CPU, returns the data immediately.\n * If the data is on GPU, downloads the data and returns the promise.\n *\n * @param releaseData - whether release the data on GPU. Ignore if data is already on CPU.\n */\n getData(releaseData?: boolean): Promise;\n\n /**\n * Dispose the tensor data.\n *\n * If the data is on CPU, remove its internal reference to the underlying data.\n * If the data is on GPU, release the data on GPU.\n *\n * After calling this function, the tensor is considered no longer valid. Its location will be set to 'none'.\n */\n dispose(): void;\n}\n\nexport declare namespace Tensor {\n interface DataTypeMap {\n float32: Float32Array;\n uint8: Uint8Array;\n int8: Int8Array;\n uint16: Uint16Array;\n int16: Int16Array;\n int32: Int32Array;\n int64: BigInt64Array;\n string: string[];\n bool: Uint8Array;\n float16: Uint16Array; // Keep using Uint16Array until we have a concrete solution for float 16.\n float64: Float64Array;\n uint32: Uint32Array;\n uint64: BigUint64Array;\n // complex64: never;\n // complex128: never;\n // bfloat16: never;\n }\n\n interface ElementTypeMap {\n float32: number;\n uint8: number;\n int8: number;\n uint16: number;\n int16: number;\n int32: number;\n int64: bigint;\n string: string;\n bool: boolean;\n float16: number; // Keep using Uint16Array until we have a concrete solution for float 16.\n float64: number;\n uint32: number;\n uint64: bigint;\n // complex64: never;\n // complex128: never;\n // bfloat16: never;\n }\n\n type DataType = DataTypeMap[Type];\n type ElementType = ElementTypeMap[Type];\n\n /**\n * supported data types for constructing a tensor from a pinned CPU buffer\n */\n export type CpuPinnedDataTypes = Exclude;\n\n /**\n * type alias for WebGL texture\n */\n export type TextureType = WebGLTexture;\n\n /**\n * supported data types for constructing a tensor from a WebGL texture\n */\n export type TextureDataTypes = 'float32';\n\n /**\n * type alias for WebGPU buffer\n *\n * The reason why we don't use type \"GPUBuffer\" defined in webgpu.d.ts from @webgpu/types is because \"@webgpu/types\"\n * requires \"@types/dom-webcodecs\" as peer dependency when using TypeScript < v5.1 and its version need to be chosen\n * carefully according to the TypeScript version being used. This means so far there is not a way to keep every\n * TypeScript version happy. It turns out that we will easily broke users on some TypeScript version.\n *\n * for more info see https://github.com/gpuweb/types/issues/127\n */\n export type GpuBufferType = {size: number; mapState: 'unmapped' | 'pending' | 'mapped'};\n\n /**\n * supported data types for constructing a tensor from a WebGPU buffer\n */\n export type GpuBufferDataTypes = 'float32'|'float16'|'int32'|'int64'|'uint32'|'uint8'|'bool';\n\n /**\n * represent where the tensor data is stored\n */\n export type DataLocation = 'none'|'cpu'|'cpu-pinned'|'texture'|'gpu-buffer';\n\n /**\n * represent the data type of a tensor\n */\n export type Type = keyof DataTypeMap;\n}\n\n/**\n * Represent multi-dimensional arrays to feed to or fetch from model inferencing.\n */\nexport interface TypedTensor extends TypedTensorBase, TypedTensorUtils {}\n/**\n * Represent multi-dimensional arrays to feed to or fetch from model inferencing.\n */\nexport interface Tensor extends TypedTensorBase, TypedTensorUtils {}\n\n/**\n * type TensorConstructor defines the constructors of 'Tensor' to create CPU tensor instances.\n */\nexport interface TensorConstructor extends TensorFactory {\n // #region CPU tensor - specify element type\n /**\n * Construct a new string tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(type: 'string', data: Tensor.DataTypeMap['string']|readonly string[],\n dims?: readonly number[]): TypedTensor<'string'>;\n\n /**\n * Construct a new bool tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(type: 'bool', data: Tensor.DataTypeMap['bool']|readonly boolean[], dims?: readonly number[]): TypedTensor<'bool'>;\n\n /**\n * Construct a new 64-bit integer typed tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(\n type: T, data: Tensor.DataTypeMap[T]|readonly bigint[]|readonly number[],\n dims?: readonly number[]): TypedTensor;\n\n /**\n * Construct a new numeric tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new>(\n type: T, data: Tensor.DataTypeMap[T]|readonly number[], dims?: readonly number[]): TypedTensor;\n // #endregion\n\n // #region CPU tensor - infer element types\n\n /**\n * Construct a new float32 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Float32Array, dims?: readonly number[]): TypedTensor<'float32'>;\n\n /**\n * Construct a new int8 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Int8Array, dims?: readonly number[]): TypedTensor<'int8'>;\n\n /**\n * Construct a new uint8 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Uint8Array, dims?: readonly number[]): TypedTensor<'uint8'>;\n\n /**\n * Construct a new uint16 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Uint16Array, dims?: readonly number[]): TypedTensor<'uint16'>;\n\n /**\n * Construct a new int16 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Int16Array, dims?: readonly number[]): TypedTensor<'int16'>;\n\n /**\n * Construct a new int32 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Int32Array, dims?: readonly number[]): TypedTensor<'int32'>;\n\n /**\n * Construct a new int64 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: BigInt64Array, dims?: readonly number[]): TypedTensor<'int64'>;\n\n /**\n * Construct a new string tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: readonly string[], dims?: readonly number[]): TypedTensor<'string'>;\n\n /**\n * Construct a new bool tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: readonly boolean[], dims?: readonly number[]): TypedTensor<'bool'>;\n\n /**\n * Construct a new float64 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Float64Array, dims?: readonly number[]): TypedTensor<'float64'>;\n\n /**\n * Construct a new uint32 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Uint32Array, dims?: readonly number[]): TypedTensor<'uint32'>;\n\n /**\n * Construct a new uint64 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: BigUint64Array, dims?: readonly number[]): TypedTensor<'uint64'>;\n\n // #endregion\n\n // #region CPU tensor - fall back to non-generic tensor type declaration\n\n /**\n * Construct a new tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(type: Tensor.Type, data: Tensor.DataType|readonly number[]|readonly string[]|readonly bigint[]|readonly boolean[],\n dims?: readonly number[]): Tensor;\n\n /**\n * Construct a new tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Tensor.DataType, dims?: readonly number[]): Tensor;\n // #endregion\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const Tensor = TensorImpl as TensorConstructor;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from './env-impl.js';\n\n/**\n * @ignore\n */\nexport const TRACE = (deviceType: string, label: string) => {\n if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {\n return;\n }\n // eslint-disable-next-line no-console\n console.timeStamp(`${deviceType}::ORT::${label}`);\n};\n\nconst TRACE_FUNC = (msg: string, extraMsg?: string) => {\n const stack = new Error().stack?.split(/\\r\\n|\\r|\\n/g) || [];\n let hasTraceFunc = false;\n for (let i = 0; i < stack.length; i++) {\n if (hasTraceFunc && !stack[i].includes('TRACE_FUNC')) {\n let label = `FUNC_${msg}::${stack[i].trim().split(' ')[1]}`;\n if (extraMsg) {\n label += `::${extraMsg}`;\n }\n TRACE('CPU', label);\n return;\n }\n if (stack[i].includes('TRACE_FUNC')) {\n hasTraceFunc = true;\n }\n }\n};\n\n/**\n * @ignore\n */\nexport const TRACE_FUNC_BEGIN = (extraMsg?: string) => {\n if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {\n return;\n }\n TRACE_FUNC('BEGIN', extraMsg);\n};\n\n/**\n * @ignore\n */\nexport const TRACE_FUNC_END = (extraMsg?: string) => {\n if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {\n return;\n }\n TRACE_FUNC('END', extraMsg);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {resolveBackendAndExecutionProviders} from './backend-impl.js';\nimport {InferenceSessionHandler} from './backend.js';\nimport {InferenceSession as InferenceSessionInterface} from './inference-session.js';\nimport {OnnxValue} from './onnx-value.js';\nimport {Tensor} from './tensor.js';\nimport {TRACE_FUNC_BEGIN, TRACE_FUNC_END} from './trace.js';\n\ntype SessionOptions = InferenceSessionInterface.SessionOptions;\ntype RunOptions = InferenceSessionInterface.RunOptions;\ntype FeedsType = InferenceSessionInterface.FeedsType;\ntype FetchesType = InferenceSessionInterface.FetchesType;\ntype ReturnType = InferenceSessionInterface.ReturnType;\n\nexport class InferenceSession implements InferenceSessionInterface {\n private constructor(handler: InferenceSessionHandler) {\n this.handler = handler;\n }\n run(feeds: FeedsType, options?: RunOptions): Promise;\n run(feeds: FeedsType, fetches: FetchesType, options?: RunOptions): Promise;\n async run(feeds: FeedsType, arg1?: FetchesType|RunOptions, arg2?: RunOptions): Promise {\n TRACE_FUNC_BEGIN();\n const fetches: {[name: string]: OnnxValue|null} = {};\n let options: RunOptions = {};\n // check inputs\n if (typeof feeds !== 'object' || feeds === null || feeds instanceof Tensor || Array.isArray(feeds)) {\n throw new TypeError(\n '\\'feeds\\' must be an object that use input names as keys and OnnxValue as corresponding values.');\n }\n\n let isFetchesEmpty = true;\n // determine which override is being used\n if (typeof arg1 === 'object') {\n if (arg1 === null) {\n throw new TypeError('Unexpected argument[1]: cannot be null.');\n }\n if (arg1 instanceof Tensor) {\n throw new TypeError('\\'fetches\\' cannot be a Tensor');\n }\n\n if (Array.isArray(arg1)) {\n if (arg1.length === 0) {\n throw new TypeError('\\'fetches\\' cannot be an empty array.');\n }\n isFetchesEmpty = false;\n // output names\n for (const name of arg1) {\n if (typeof name !== 'string') {\n throw new TypeError('\\'fetches\\' must be a string array or an object.');\n }\n if (this.outputNames.indexOf(name) === -1) {\n throw new RangeError(`'fetches' contains invalid output name: ${name}.`);\n }\n fetches[name] = null;\n }\n\n if (typeof arg2 === 'object' && arg2 !== null) {\n options = arg2;\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else {\n // decide whether arg1 is fetches or options\n // if any output name is present and its value is valid OnnxValue, we consider it fetches\n let isFetches = false;\n const arg1Keys = Object.getOwnPropertyNames(arg1);\n for (const name of this.outputNames) {\n if (arg1Keys.indexOf(name) !== -1) {\n const v = (arg1 as InferenceSessionInterface.NullableOnnxValueMapType)[name];\n if (v === null || v instanceof Tensor) {\n isFetches = true;\n isFetchesEmpty = false;\n fetches[name] = v;\n }\n }\n }\n\n if (isFetches) {\n if (typeof arg2 === 'object' && arg2 !== null) {\n options = arg2;\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else {\n options = arg1 as RunOptions;\n }\n }\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('Unexpected argument[1]: must be \\'fetches\\' or \\'options\\'.');\n }\n\n // check if all inputs are in feed\n for (const name of this.inputNames) {\n if (typeof feeds[name] === 'undefined') {\n throw new Error(`input '${name}' is missing in 'feeds'.`);\n }\n }\n\n // if no fetches is specified, we use the full output names list\n if (isFetchesEmpty) {\n for (const name of this.outputNames) {\n fetches[name] = null;\n }\n }\n\n // feeds, fetches and options are prepared\n\n const results = await this.handler.run(feeds, fetches, options);\n const returnValue: {[name: string]: OnnxValue} = {};\n for (const key in results) {\n if (Object.hasOwnProperty.call(results, key)) {\n const result = results[key];\n if (result instanceof Tensor) {\n returnValue[key] = result;\n } else {\n returnValue[key] = new Tensor(result.type, result.data, result.dims);\n }\n }\n }\n TRACE_FUNC_END();\n return returnValue;\n }\n\n async release(): Promise {\n return this.handler.dispose();\n }\n\n static create(path: string, options?: SessionOptions): Promise;\n static create(buffer: ArrayBufferLike, options?: SessionOptions): Promise;\n static create(buffer: ArrayBufferLike, byteOffset: number, byteLength?: number, options?: SessionOptions):\n Promise;\n static create(buffer: Uint8Array, options?: SessionOptions): Promise;\n static async create(\n arg0: string|ArrayBufferLike|Uint8Array, arg1?: SessionOptions|number, arg2?: number,\n arg3?: SessionOptions): Promise {\n TRACE_FUNC_BEGIN();\n // either load from a file or buffer\n let filePathOrUint8Array: string|Uint8Array;\n let options: SessionOptions = {};\n\n if (typeof arg0 === 'string') {\n filePathOrUint8Array = arg0;\n if (typeof arg1 === 'object' && arg1 !== null) {\n options = arg1;\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else if (arg0 instanceof Uint8Array) {\n filePathOrUint8Array = arg0;\n if (typeof arg1 === 'object' && arg1 !== null) {\n options = arg1;\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else if (\n arg0 instanceof ArrayBuffer ||\n (typeof SharedArrayBuffer !== 'undefined' && arg0 instanceof SharedArrayBuffer)) {\n const buffer = arg0;\n let byteOffset = 0;\n let byteLength = arg0.byteLength;\n if (typeof arg1 === 'object' && arg1 !== null) {\n options = arg1;\n } else if (typeof arg1 === 'number') {\n byteOffset = arg1;\n if (!Number.isSafeInteger(byteOffset)) {\n throw new RangeError('\\'byteOffset\\' must be an integer.');\n }\n if (byteOffset < 0 || byteOffset >= buffer.byteLength) {\n throw new RangeError(`'byteOffset' is out of range [0, ${buffer.byteLength}).`);\n }\n byteLength = arg0.byteLength - byteOffset;\n if (typeof arg2 === 'number') {\n byteLength = arg2;\n if (!Number.isSafeInteger(byteLength)) {\n throw new RangeError('\\'byteLength\\' must be an integer.');\n }\n if (byteLength <= 0 || byteOffset + byteLength > buffer.byteLength) {\n throw new RangeError(`'byteLength' is out of range (0, ${buffer.byteLength - byteOffset}].`);\n }\n if (typeof arg3 === 'object' && arg3 !== null) {\n options = arg3;\n } else if (typeof arg3 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'byteLength\\' must be a number.');\n }\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n filePathOrUint8Array = new Uint8Array(buffer, byteOffset, byteLength);\n } else {\n throw new TypeError('Unexpected argument[0]: must be \\'path\\' or \\'buffer\\'.');\n }\n\n // resolve backend, update session options with validated EPs, and create session handler\n const [backend, optionsWithValidatedEPs] = await resolveBackendAndExecutionProviders(options);\n const handler = await backend.createInferenceSessionHandler(filePathOrUint8Array, optionsWithValidatedEPs);\n TRACE_FUNC_END();\n return new InferenceSession(handler);\n }\n\n startProfiling(): void {\n this.handler.startProfiling();\n }\n endProfiling(): void {\n this.handler.endProfiling();\n }\n\n get inputNames(): readonly string[] {\n return this.handler.inputNames;\n }\n get outputNames(): readonly string[] {\n return this.handler.outputNames;\n }\n\n private handler: InferenceSessionHandler;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession as InferenceSessionImpl} from './inference-session-impl.js';\nimport {OnnxModelOptions} from './onnx-model.js';\nimport {OnnxValue, OnnxValueDataLocation} from './onnx-value.js';\n\n/* eslint-disable @typescript-eslint/no-redeclare */\n\nexport declare namespace InferenceSession {\n // #region input/output types\n\n type OnnxValueMapType = {readonly [name: string]: OnnxValue};\n type NullableOnnxValueMapType = {readonly [name: string]: OnnxValue | null};\n\n /**\n * A feeds (model inputs) is an object that uses input names as keys and OnnxValue as corresponding values.\n */\n type FeedsType = OnnxValueMapType;\n\n /**\n * A fetches (model outputs) could be one of the following:\n *\n * - Omitted. Use model's output names definition.\n * - An array of string indicating the output names.\n * - An object that use output names as keys and OnnxValue or null as corresponding values.\n *\n * @remark\n * different from input argument, in output, OnnxValue is optional. If an OnnxValue is present it will be\n * used as a pre-allocated value by the inference engine; if omitted, inference engine will allocate buffer\n * internally.\n */\n type FetchesType = readonly string[]|NullableOnnxValueMapType;\n\n /**\n * A inferencing return type is an object that uses output names as keys and OnnxValue as corresponding values.\n */\n type ReturnType = OnnxValueMapType;\n\n // #endregion\n\n // #region session options\n\n /**\n * A set of configurations for session behavior.\n */\n export interface SessionOptions extends OnnxModelOptions {\n /**\n * An array of execution provider options.\n *\n * An execution provider option can be a string indicating the name of the execution provider,\n * or an object of corresponding type.\n */\n executionProviders?: readonly ExecutionProviderConfig[];\n\n /**\n * The intra OP threads number.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native).\n */\n intraOpNumThreads?: number;\n\n /**\n * The inter OP threads number.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native).\n */\n interOpNumThreads?: number;\n\n /**\n * The free dimension override.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n freeDimensionOverrides?: {readonly [dimensionName: string]: number};\n\n /**\n * The optimization level.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n graphOptimizationLevel?: 'disabled'|'basic'|'extended'|'all';\n\n /**\n * Whether enable CPU memory arena.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n enableCpuMemArena?: boolean;\n\n /**\n * Whether enable memory pattern.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n enableMemPattern?: boolean;\n\n /**\n * Execution mode.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n executionMode?: 'sequential'|'parallel';\n\n /**\n * Optimized model file path.\n *\n * If this setting is specified, the optimized model will be dumped. In browser, a blob will be created\n * with a pop-up window.\n */\n optimizedModelFilePath?: string;\n\n /**\n * Whether enable profiling.\n *\n * This setting is a placeholder for a future use.\n */\n enableProfiling?: boolean;\n\n /**\n * File prefix for profiling.\n *\n * This setting is a placeholder for a future use.\n */\n profileFilePrefix?: string;\n\n /**\n * Log ID.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n logId?: string;\n\n /**\n * Log severity level. See\n * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/common/logging/severity.h\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n logSeverityLevel?: 0|1|2|3|4;\n\n /**\n * Log verbosity level.\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n */\n logVerbosityLevel?: number;\n\n /**\n * Specify string as a preferred data location for all outputs, or an object that use output names as keys and a\n * preferred data location as corresponding values.\n *\n * This setting is available only in ONNXRuntime Web for WebGL and WebGPU EP.\n */\n preferredOutputLocation?: OnnxValueDataLocation|{readonly [outputName: string]: OnnxValueDataLocation};\n\n /**\n * Whether enable graph capture.\n * This setting is available only in ONNXRuntime Web for WebGPU EP.\n */\n enableGraphCapture?: boolean;\n\n /**\n * Store configurations for a session. See\n * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/session/\n * onnxruntime_session_options_config_keys.h\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n *\n * @example\n * ```js\n * extra: {\n * session: {\n * set_denormal_as_zero: \"1\",\n * disable_prepacking: \"1\"\n * },\n * optimization: {\n * enable_gelu_approximation: \"1\"\n * }\n * }\n * ```\n */\n extra?: Record;\n }\n\n // #region execution providers\n\n // Currently, we have the following backends to support execution providers:\n // Backend Node.js binding: supports 'cpu', 'dml' (win32), 'coreml' (macOS) and 'cuda' (linux).\n // Backend WebAssembly: supports 'cpu', 'wasm', 'webgpu' and 'webnn'.\n // Backend ONNX.js: supports 'webgl'.\n // Backend React Native: supports 'cpu', 'xnnpack', 'coreml' (iOS), 'nnapi' (Android).\n interface ExecutionProviderOptionMap {\n coreml: CoreMLExecutionProviderOption;\n cpu: CpuExecutionProviderOption;\n cuda: CudaExecutionProviderOption;\n dml: DmlExecutionProviderOption;\n nnapi: NnapiExecutionProviderOption;\n tensorrt: TensorRtExecutionProviderOption;\n wasm: WebAssemblyExecutionProviderOption;\n webgl: WebGLExecutionProviderOption;\n webgpu: WebGpuExecutionProviderOption;\n webnn: WebNNExecutionProviderOption;\n qnn: QnnExecutionProviderOption;\n xnnpack: XnnpackExecutionProviderOption;\n }\n\n type ExecutionProviderName = keyof ExecutionProviderOptionMap;\n type ExecutionProviderConfig =\n ExecutionProviderOptionMap[ExecutionProviderName]|ExecutionProviderOption|ExecutionProviderName|string;\n\n export interface ExecutionProviderOption {\n readonly name: string;\n }\n export interface CpuExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'cpu';\n useArena?: boolean;\n }\n export interface CudaExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'cuda';\n deviceId?: number;\n }\n export interface DmlExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'dml';\n deviceId?: number;\n }\n export interface TensorRtExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'tensorrt';\n deviceId?: number;\n }\n export interface WebAssemblyExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'wasm';\n }\n export interface WebGLExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'webgl';\n // TODO: add flags\n }\n export interface XnnpackExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'xnnpack';\n }\n export interface WebGpuExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'webgpu';\n preferredLayout?: 'NCHW'|'NHWC';\n }\n\n // #region WebNN options\n\n interface WebNNExecutionProviderName extends ExecutionProviderOption {\n readonly name: 'webnn';\n }\n\n /**\n * Represents a set of options for creating a WebNN MLContext.\n *\n * @see https://www.w3.org/TR/webnn/#dictdef-mlcontextoptions\n */\n export interface WebNNContextOptions {\n deviceType?: 'cpu'|'gpu'|'npu';\n numThreads?: number;\n powerPreference?: 'default'|'low-power'|'high-performance';\n }\n\n /**\n * Represents a set of options for WebNN execution provider without MLContext.\n */\n export interface WebNNOptionsWithoutMLContext extends WebNNExecutionProviderName, WebNNContextOptions {\n context?: never;\n }\n\n /**\n * Represents a set of options for WebNN execution provider with MLContext.\n *\n * When MLContext is provided, the deviceType is also required so that the WebNN EP can determine the preferred\n * channel layout.\n *\n * @see https://www.w3.org/TR/webnn/#dom-ml-createcontext\n */\n export interface WebNNOptionsWithMLContext extends WebNNExecutionProviderName,\n Omit,\n Required> {\n context: unknown /* MLContext */;\n }\n\n /**\n * Represents a set of options for WebNN execution provider with MLContext which is created from GPUDevice.\n *\n * @see https://www.w3.org/TR/webnn/#dom-ml-createcontext-gpudevice\n */\n export interface WebNNOptionsWebGpu extends WebNNExecutionProviderName {\n context: unknown /* MLContext */;\n gpuDevice: unknown /* GPUDevice */;\n }\n\n /**\n * Options for WebNN execution provider.\n */\n export type WebNNExecutionProviderOption = WebNNOptionsWithoutMLContext|WebNNOptionsWithMLContext|WebNNOptionsWebGpu;\n\n // #endregion\n\n export interface QnnExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'qnn';\n // TODO add flags\n }\n export interface CoreMLExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'coreml';\n /**\n * The bit flags for CoreML execution provider.\n *\n * ```\n * COREML_FLAG_USE_CPU_ONLY = 0x001\n * COREML_FLAG_ENABLE_ON_SUBGRAPH = 0x002\n * COREML_FLAG_ONLY_ENABLE_DEVICE_WITH_ANE = 0x004\n * COREML_FLAG_ONLY_ALLOW_STATIC_INPUT_SHAPES = 0x008\n * COREML_FLAG_CREATE_MLPROGRAM = 0x010\n * ```\n *\n * See include/onnxruntime/core/providers/coreml/coreml_provider_factory.h for more details.\n *\n * This flag is available only in ONNXRuntime (Node.js binding).\n */\n coreMlFlags?: number;\n /**\n * Specify whether to use CPU only in CoreML EP.\n *\n * This setting is available only in ONNXRuntime (react-native).\n */\n useCPUOnly?: boolean;\n /**\n * Specify whether to enable CoreML EP on subgraph.\n *\n * This setting is available only in ONNXRuntime (react-native).\n */\n enableOnSubgraph?: boolean;\n /**\n * Specify whether to only enable CoreML EP for Apple devices with ANE (Apple Neural Engine).\n *\n * This setting is available only in ONNXRuntime (react-native).\n */\n onlyEnableDeviceWithANE?: boolean;\n }\n export interface NnapiExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'nnapi';\n useFP16?: boolean;\n useNCHW?: boolean;\n cpuDisabled?: boolean;\n cpuOnly?: boolean;\n }\n // #endregion\n\n // #endregion\n\n // #region run options\n\n /**\n * A set of configurations for inference run behavior\n */\n export interface RunOptions {\n /**\n * Log severity level. See\n * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/common/logging/severity.h\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n logSeverityLevel?: 0|1|2|3|4;\n\n /**\n * Log verbosity level.\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n */\n logVerbosityLevel?: number;\n\n /**\n * Terminate all incomplete OrtRun calls as soon as possible if true\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n */\n terminate?: boolean;\n\n /**\n * A tag for the Run() calls using this\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n tag?: string;\n\n /**\n * Set a single run configuration entry. See\n * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/session/\n * onnxruntime_run_options_config_keys.h\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n *\n * @example\n *\n * ```js\n * extra: {\n * memory: {\n * enable_memory_arena_shrinkage: \"1\",\n * }\n * }\n * ```\n */\n extra?: Record;\n }\n\n // #endregion\n\n // #region value metadata\n\n // eslint-disable-next-line @typescript-eslint/no-empty-interface\n interface ValueMetadata {\n // TBD\n }\n\n // #endregion\n}\n\n/**\n * Represent a runtime instance of an ONNX model.\n */\nexport interface InferenceSession {\n // #region run()\n\n /**\n * Execute the model asynchronously with the given feeds and options.\n *\n * @param feeds - Representation of the model input. See type description of `InferenceSession.InputType` for detail.\n * @param options - Optional. A set of options that controls the behavior of model inference.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding values.\n */\n run(feeds: InferenceSession.FeedsType, options?: InferenceSession.RunOptions): Promise;\n\n /**\n * Execute the model asynchronously with the given feeds, fetches and options.\n *\n * @param feeds - Representation of the model input. See type description of `InferenceSession.InputType` for detail.\n * @param fetches - Representation of the model output. See type description of `InferenceSession.OutputType` for\n * detail.\n * @param options - Optional. A set of options that controls the behavior of model inference.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding values.\n */\n run(feeds: InferenceSession.FeedsType, fetches: InferenceSession.FetchesType,\n options?: InferenceSession.RunOptions): Promise;\n\n // #endregion\n\n // #region release()\n\n /**\n * Release the inference session and the underlying resources.\n */\n release(): Promise;\n\n // #endregion\n\n // #region profiling\n\n /**\n * Start profiling.\n */\n startProfiling(): void;\n\n /**\n * End profiling.\n */\n endProfiling(): void;\n\n // #endregion\n\n // #region metadata\n\n /**\n * Get input names of the loaded model.\n */\n readonly inputNames: readonly string[];\n\n /**\n * Get output names of the loaded model.\n */\n readonly outputNames: readonly string[];\n\n // /**\n // * Get input metadata of the loaded model.\n // */\n // readonly inputMetadata: ReadonlyArray>;\n\n // /**\n // * Get output metadata of the loaded model.\n // */\n // readonly outputMetadata: ReadonlyArray>;\n\n // #endregion\n}\n\nexport interface InferenceSessionFactory {\n // #region create()\n\n /**\n * Create a new inference session and load model asynchronously from an ONNX model file.\n *\n * @param uri - The URI or file path of the model to load.\n * @param options - specify configuration for creating a new inference session.\n * @returns A promise that resolves to an InferenceSession object.\n */\n create(uri: string, options?: InferenceSession.SessionOptions): Promise;\n\n /**\n * Create a new inference session and load model asynchronously from an array bufer.\n *\n * @param buffer - An ArrayBuffer representation of an ONNX model.\n * @param options - specify configuration for creating a new inference session.\n * @returns A promise that resolves to an InferenceSession object.\n */\n create(buffer: ArrayBufferLike, options?: InferenceSession.SessionOptions): Promise;\n\n /**\n * Create a new inference session and load model asynchronously from segment of an array bufer.\n *\n * @param buffer - An ArrayBuffer representation of an ONNX model.\n * @param byteOffset - The beginning of the specified portion of the array buffer.\n * @param byteLength - The length in bytes of the array buffer.\n * @param options - specify configuration for creating a new inference session.\n * @returns A promise that resolves to an InferenceSession object.\n */\n create(buffer: ArrayBufferLike, byteOffset: number, byteLength?: number, options?: InferenceSession.SessionOptions):\n Promise;\n\n /**\n * Create a new inference session and load model asynchronously from a Uint8Array.\n *\n * @param buffer - A Uint8Array representation of an ONNX model.\n * @param options - specify configuration for creating a new inference session.\n * @returns A promise that resolves to an InferenceSession object.\n */\n create(buffer: Uint8Array, options?: InferenceSession.SessionOptions): Promise;\n\n // #endregion\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const InferenceSession: InferenceSessionFactory = InferenceSessionImpl;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {OptionsFormat, OptionsNormalizationParameters, OptionsTensorLayout} from './tensor-factory.js';\n\nexport interface TensorToDataUrlOptions extends OptionsTensorLayout, OptionsFormat, OptionsNormalizationParameters {}\n\nexport interface TensorToImageDataOptions extends OptionsTensorLayout, OptionsFormat, OptionsNormalizationParameters {}\n\nexport interface ConversionUtils {\n /**\n * creates a DataURL instance from tensor\n *\n * @param options - An optional object representing options for creating a DataURL instance from the tensor.\n *\n * The following default settings will be applied:\n * - `format`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * @returns a DataURL string representing the image converted from tensor data\n */\n toDataURL(options?: TensorToDataUrlOptions): string;\n\n /**\n * creates an ImageData instance from tensor\n *\n * @param options - An optional object representing options for creating an ImageData instance from the tensor.\n *\n * The following default settings will be applied:\n * - `format`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * @returns an ImageData instance representing the image converted from tensor data\n */\n toImageData(options?: TensorToImageDataOptions): ImageData;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor, TypedTensor} from './tensor.js';\n\nexport type ImageFormat = 'RGB'|'RGBA'|'BGR'|'RBG';\nexport type ImageTensorLayout = 'NHWC'|'NCHW';\n\n// the following region contains type definitions for constructing tensor from a specific location.\n\n// #region types for constructing a tensor from a specific location\n\n/**\n * represent common properties of the parameter for constructing a tensor from a specific location.\n */\ninterface CommonConstructorParameters extends Pick {\n /**\n * Specify the data type of the tensor.\n */\n readonly type: T;\n}\n\n/**\n * represent the parameter for constructing a tensor from a GPU resource.\n */\ninterface GpuResourceConstructorParameters {\n /**\n * an optional callback function to download data from GPU to CPU.\n *\n * If not provided, the tensor treat the GPU data as external resource.\n */\n download?(): Promise;\n\n /**\n * an optional callback function that will be called when the tensor is disposed.\n *\n * If not provided, the tensor treat the GPU data as external resource.\n */\n dispose?(): void;\n}\n\n/**\n * represent the parameter for constructing a tensor from a pinned CPU buffer\n */\nexport interface CpuPinnedConstructorParameters extends\n CommonConstructorParameters {\n /**\n * Specify the location of the data to be 'cpu-pinned'.\n */\n readonly location: 'cpu-pinned';\n /**\n * Specify the CPU pinned buffer that holds the tensor data.\n */\n readonly data: Tensor.DataTypeMap[T];\n}\n\n/**\n * represent the parameter for constructing a tensor from a WebGL texture\n */\nexport interface TextureConstructorParameters extends\n CommonConstructorParameters, GpuResourceConstructorParameters {\n /**\n * Specify the location of the data to be 'texture'.\n */\n readonly location: 'texture';\n /**\n * Specify the WebGL texture that holds the tensor data.\n */\n readonly texture: Tensor.TextureType;\n}\n\n/**\n * represent the parameter for constructing a tensor from a WebGPU buffer\n */\nexport interface GpuBufferConstructorParameters extends\n CommonConstructorParameters, GpuResourceConstructorParameters {\n /**\n * Specify the location of the data to be 'gpu-buffer'.\n */\n readonly location: 'gpu-buffer';\n /**\n * Specify the WebGPU buffer that holds the tensor data.\n */\n readonly gpuBuffer: Tensor.GpuBufferType;\n}\n\n// #endregion\n\n// the following region contains type definitions of each individual options.\n// the tensor factory functions use a composition of those options as the parameter type.\n\n// #region Options fields\n\nexport interface OptionsFormat {\n /**\n * Describes the image format represented in RGBA color space.\n */\n format?: ImageFormat;\n}\n\nexport interface OptionsTensorFormat {\n /**\n * Describes the image format of the tensor.\n *\n * NOTE: this is different from option 'format'. While option 'format' represents the original image, 'tensorFormat'\n * represents the target format of the tensor. A transpose will be performed if they are different.\n */\n tensorFormat?: ImageFormat;\n}\n\nexport interface OptionsTensorDataType {\n /**\n * Describes the data type of the tensor.\n */\n dataType?: 'float32'|'uint8';\n}\n\nexport interface OptionsTensorLayout {\n /**\n * Describes the tensor layout when representing data of one or more image(s).\n */\n tensorLayout?: ImageTensorLayout;\n}\n\nexport interface OptionsDimensions {\n /**\n * Describes the image height in pixel\n */\n height?: number;\n /**\n * Describes the image width in pixel\n */\n width?: number;\n}\n\nexport interface OptionResizedDimensions {\n /**\n * Describes the resized height. If omitted, original height will be used.\n */\n resizedHeight?: number;\n /**\n * Describes resized width - can be accessed via tensor dimensions as well\n */\n resizedWidth?: number;\n}\n\nexport interface OptionsNormalizationParameters {\n /**\n * Describes normalization parameters when preprocessing the image as model input.\n *\n * Data element are ranged from 0 to 255.\n */\n norm?: {\n /**\n * The 'bias' value for image normalization.\n * - If omitted, use default value 0.\n * - If it's a single number, apply to each channel\n * - If it's an array of 3 or 4 numbers, apply element-wise. Number of elements need to match the number of channels\n * for the corresponding image format\n */\n bias?: number|[number, number, number]|[number, number, number, number];\n /**\n * The 'mean' value for image normalization.\n * - If omitted, use default value 255.\n * - If it's a single number, apply to each channel\n * - If it's an array of 3 or 4 numbers, apply element-wise. Number of elements need to match the number of channels\n * for the corresponding image format\n */\n mean?: number | [number, number, number] | [number, number, number, number];\n };\n}\n\n// #endregion\n\n// #region Options composition\n\nexport interface TensorFromImageDataOptions extends OptionResizedDimensions, OptionsTensorFormat, OptionsTensorLayout,\n OptionsTensorDataType, OptionsNormalizationParameters {}\n\nexport interface TensorFromImageElementOptions extends OptionResizedDimensions, OptionsTensorFormat,\n OptionsTensorLayout, OptionsTensorDataType,\n OptionsNormalizationParameters {}\n\nexport interface TensorFromUrlOptions extends OptionsDimensions, OptionResizedDimensions, OptionsTensorFormat,\n OptionsTensorLayout, OptionsTensorDataType,\n OptionsNormalizationParameters {}\n\nexport interface TensorFromImageBitmapOptions extends OptionResizedDimensions, OptionsTensorFormat, OptionsTensorLayout,\n OptionsTensorDataType, OptionsNormalizationParameters {}\n\nexport interface TensorFromTextureOptions extends\n Required, OptionsFormat, GpuResourceConstructorParameters/* TODO: add more */ {}\n\nexport interface TensorFromGpuBufferOptions extends\n Pick, GpuResourceConstructorParameters {\n /**\n * Describes the data type of the tensor.\n */\n dataType?: T;\n}\n\n// #endregion\n\n/**\n * type TensorFactory defines the factory functions of 'Tensor' to create tensor instances from existing data or\n * resources.\n */\nexport interface TensorFactory {\n /**\n * create a tensor from an ImageData object\n *\n * @param imageData - the ImageData object to create tensor from\n * @param options - An optional object representing options for creating tensor from ImageData.\n *\n * The following default settings will be applied:\n * - `tensorFormat`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * - `dataType`: `'float32'`\n * @returns A promise that resolves to a tensor object\n */\n fromImage(imageData: ImageData, options?: TensorFromImageDataOptions):\n Promise|TypedTensor<'uint8'>>;\n\n /**\n * create a tensor from a HTMLImageElement object\n *\n * @param imageElement - the HTMLImageElement object to create tensor from\n * @param options - An optional object representing options for creating tensor from HTMLImageElement.\n *\n * The following default settings will be applied:\n * - `tensorFormat`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * - `dataType`: `'float32'`\n * @returns A promise that resolves to a tensor object\n */\n fromImage(imageElement: HTMLImageElement, options?: TensorFromImageElementOptions):\n Promise|TypedTensor<'uint8'>>;\n\n /**\n * create a tensor from URL\n *\n * @param urlSource - a string as a URL to the image or a data URL containing the image data.\n * @param options - An optional object representing options for creating tensor from URL.\n *\n * The following default settings will be applied:\n * - `tensorFormat`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * - `dataType`: `'float32'`\n * @returns A promise that resolves to a tensor object\n */\n fromImage(urlSource: string, options?: TensorFromUrlOptions): Promise|TypedTensor<'uint8'>>;\n\n /**\n * create a tensor from an ImageBitmap object\n *\n * @param bitmap - the ImageBitmap object to create tensor from\n * @param options - An optional object representing options for creating tensor from URL.\n *\n * The following default settings will be applied:\n * - `tensorFormat`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * - `dataType`: `'float32'`\n * @returns A promise that resolves to a tensor object\n */\n fromImage(bitmap: ImageBitmap, options: TensorFromImageBitmapOptions):\n Promise|TypedTensor<'uint8'>>;\n\n /**\n * create a tensor from a WebGL texture\n *\n * @param texture - the WebGLTexture object to create tensor from\n * @param options - An optional object representing options for creating tensor from WebGL texture.\n *\n * The options include following properties:\n * - `width`: the width of the texture. Required.\n * - `height`: the height of the texture. Required.\n * - `format`: the format of the texture. If omitted, assume 'RGBA'.\n * - `download`: an optional function to download the tensor data from GPU to CPU. If omitted, the GPU data\n * will not be able to download. Usually, this is provided by a GPU backend for the inference outputs. Users don't\n * need to provide this function.\n * - `dispose`: an optional function to dispose the tensor data on GPU. If omitted, the GPU data will not be disposed.\n * Usually, this is provided by a GPU backend for the inference outputs. Users don't need to provide this function.\n *\n * @returns a tensor object\n */\n fromTexture(\n texture: Tensor.TextureType, options: TensorFromTextureOptions): TypedTensor<'float32'>;\n\n /**\n * create a tensor from a WebGPU buffer\n *\n * @param buffer - the GPUBuffer object to create tensor from\n * @param options - An optional object representing options for creating tensor from WebGPU buffer.\n *\n * The options include following properties:\n * - `dataType`: the data type of the tensor. If omitted, assume 'float32'.\n * - `dims`: the dimension of the tensor. Required.\n * - `download`: an optional function to download the tensor data from GPU to CPU. If omitted, the GPU data\n * will not be able to download. Usually, this is provided by a GPU backend for the inference outputs. Users don't\n * need to provide this function.\n * - `dispose`: an optional function to dispose the tensor data on GPU. If omitted, the GPU data will not be disposed.\n * Usually, this is provided by a GPU backend for the inference outputs. Users don't need to provide this function.\n *\n * @returns a tensor object\n */\n fromGpuBuffer(\n buffer: Tensor.GpuBufferType, options: TensorFromGpuBufferOptions): TypedTensor;\n\n /**\n * create a tensor from a pre-allocated buffer. The buffer will be used as a pinned buffer.\n *\n * @param type - the tensor element type.\n * @param buffer - a TypedArray corresponding to the type.\n * @param dims - specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n *\n * @returns a tensor object\n */\n fromPinnedBuffer>(\n type: T, buffer: Tensor.DataTypeMap[T], dims?: readonly number[]): TypedTensor;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * A string that represents a file's URL or path.\n *\n * Path is vailable only in onnxruntime-node or onnxruntime-web running in Node.js.\n */\nexport type FileUrlOrPath = string;\n\n/**\n * A Blob object that represents a file.\n */\nexport type FileBlob = Blob;\n\n/**\n * A Uint8Array, ArrayBuffer or SharedArrayBuffer object that represents a file content.\n *\n * When it is an ArrayBuffer or SharedArrayBuffer, the whole buffer is assumed to be the file content.\n */\nexport type FileData = Uint8Array|ArrayBufferLike;\n\n/**\n * Represents a file that can be loaded by the ONNX Runtime JavaScript API.\n */\nexport type FileType = FileUrlOrPath|FileBlob|FileData;\n\n/**\n * Represents an external data file.\n */\nexport interface ExternalDataFileDescription {\n /**\n * Specify the external data file.\n */\n data: FileType;\n /**\n * Specify the file path.\n */\n path: string;\n}\n\n/**\n * Represents an external data file.\n *\n * When using a string, it should be a file URL or path that in the same directory as the model file.\n */\nexport type ExternalDataFileType = ExternalDataFileDescription|FileUrlOrPath;\n\n/**\n * Options for model loading.\n */\nexport interface OnnxModelOptions {\n /**\n * Specifying a list of files that represents the external data.\n */\n externalData?: readonly ExternalDataFileType[];\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from './tensor.js';\n\nexport type NonTensorType = never;\n\n/**\n * Type OnnxValue Represents both tensors and non-tensors value for model's inputs/outputs.\n *\n * NOTE: currently not support non-tensor\n */\nexport type OnnxValue = Tensor|NonTensorType;\n\n/**\n * Type OnnxValueDataLocation represents the location of the data of an OnnxValue.\n */\nexport type OnnxValueDataLocation = Tensor.DataLocation;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {resolveBackendAndExecutionProviders} from './backend-impl.js';\nimport {SessionHandler, TrainingSessionHandler} from './backend.js';\nimport {InferenceSession as InferenceSession} from './inference-session.js';\nimport {OnnxValue} from './onnx-value.js';\nimport {Tensor} from './tensor.js';\nimport {TrainingSession as TrainingSessionInterface, TrainingSessionCreateOptions} from './training-session.js';\n\ntype SessionOptions = InferenceSession.SessionOptions;\ntype FeedsType = InferenceSession.FeedsType;\ntype FetchesType = InferenceSession.FetchesType;\ntype ReturnType = InferenceSession.ReturnType;\ntype RunOptions = InferenceSession.RunOptions;\n\nconst noBackendErrMsg: string = 'Training backend could not be resolved. ' +\n 'Make sure you\\'re using the correct configuration & WebAssembly files.';\n\nexport class TrainingSession implements TrainingSessionInterface {\n private constructor(handler: TrainingSessionHandler, hasOptimizerModel: boolean, hasEvalModel: boolean) {\n this.handler = handler;\n this.hasOptimizerModel = hasOptimizerModel;\n this.hasEvalModel = hasEvalModel;\n }\n private handler: TrainingSessionHandler;\n private hasOptimizerModel: boolean;\n private hasEvalModel: boolean;\n\n get trainingInputNames(): readonly string[] {\n return this.handler.inputNames;\n }\n get trainingOutputNames(): readonly string[] {\n return this.handler.outputNames;\n }\n\n get evalInputNames(): readonly string[] {\n if (this.hasEvalModel) {\n return this.handler.evalInputNames;\n } else {\n throw new Error('This training session has no evalModel loaded.');\n }\n }\n get evalOutputNames(): readonly string[] {\n if (this.hasEvalModel) {\n return this.handler.evalOutputNames;\n } else {\n throw new Error('This training session has no evalModel loaded.');\n }\n }\n\n static async create(trainingOptions: TrainingSessionCreateOptions, sessionOptions?: SessionOptions):\n Promise {\n const evalModel: string|Uint8Array = trainingOptions.evalModel || '';\n const optimizerModel: string|Uint8Array = trainingOptions.optimizerModel || '';\n const options: SessionOptions = sessionOptions || {};\n\n // resolve backend, update session options with validated EPs, and create session handler\n const [backend, optionsWithValidatedEPs] = await resolveBackendAndExecutionProviders(options);\n if (backend.createTrainingSessionHandler) {\n const handler = await backend.createTrainingSessionHandler(\n trainingOptions.checkpointState, trainingOptions.trainModel, evalModel, optimizerModel,\n optionsWithValidatedEPs);\n return new TrainingSession(handler, !!trainingOptions.optimizerModel, !!trainingOptions.evalModel);\n } else {\n throw new Error(noBackendErrMsg);\n }\n }\n\n /**\n * Helper function for runTrainStep and future runStep methods that handles the type-narrowing conversion from\n * the given parameters to SessionHandler.FetchesType and RunOptions.\n *\n * @param inputNames the feeds object is checked that they contain all input names in the provided list of input\n * names.\n * @param outputNames the fetches object is checked that their keys match up with valid names in the list of output\n * names.\n * @param feeds the required input\n * @param arg1 narrowed & converted into the SessionHandler.FetchesType or RunOptions object\n * @param arg2 optional RunOptions object.\n * @returns\n */\n typeNarrowingForRunStep(\n inputNames: readonly string[], outputNames: readonly string[], feeds: FeedsType, arg1?: FetchesType|RunOptions,\n arg2?: RunOptions): [SessionHandler.FetchesType, RunOptions] {\n const fetches: {[name: string]: OnnxValue|null} = {};\n let options: RunOptions = {};\n // check inputs\n if (typeof feeds !== 'object' || feeds === null || feeds instanceof Tensor || Array.isArray(feeds)) {\n throw new TypeError(\n '\\'feeds\\' must be an object that use input names as keys and OnnxValue as corresponding values.');\n }\n\n let isFetchesEmpty = true;\n // determine which override is being used\n if (typeof arg1 === 'object') {\n if (arg1 === null) {\n throw new TypeError('Unexpected argument[1]: cannot be null.');\n }\n if (arg1 instanceof Tensor) {\n throw new TypeError('\\'fetches\\' cannot be a Tensor');\n }\n\n if (Array.isArray(arg1)) {\n if (arg1.length === 0) {\n throw new TypeError('\\'fetches\\' cannot be an empty array.');\n }\n isFetchesEmpty = false;\n // output names\n for (const name of arg1) {\n if (typeof name !== 'string') {\n throw new TypeError('\\'fetches\\' must be a string array or an object.');\n }\n if (outputNames.indexOf(name) === -1) {\n throw new RangeError(`'fetches' contains invalid output name: ${name}.`);\n }\n fetches[name] = null;\n }\n\n if (typeof arg2 === 'object' && arg2 !== null) {\n options = arg2;\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else {\n // decide whether arg1 is fetches or options\n // if any output name is present and its value is valid OnnxValue, we consider it fetches\n let isFetches = false;\n const arg1Keys = Object.getOwnPropertyNames(arg1);\n for (const name of outputNames) {\n if (arg1Keys.indexOf(name) !== -1) {\n const v = (arg1 as InferenceSession.NullableOnnxValueMapType)[name];\n if (v === null || v instanceof Tensor) {\n isFetches = true;\n isFetchesEmpty = false;\n fetches[name] = v;\n }\n }\n }\n\n if (isFetches) {\n if (typeof arg2 === 'object' && arg2 !== null) {\n options = arg2;\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else {\n options = arg1 as RunOptions;\n }\n }\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('Unexpected argument[1]: must be \\'fetches\\' or \\'options\\'.');\n }\n\n // check if all inputs are in feed\n for (const name of inputNames) {\n if (typeof feeds[name] === 'undefined') {\n throw new Error(`input '${name}' is missing in 'feeds'.`);\n }\n }\n\n // if no fetches is specified, we use the full output names list\n if (isFetchesEmpty) {\n for (const name of outputNames) {\n fetches[name] = null;\n }\n }\n\n return [fetches, options];\n }\n\n /**\n * Helper method for runTrainStep and any other runStep methods. Takes the ReturnType result from the SessionHandler\n * and changes it into a map of Tensors.\n *\n * @param results\n * @returns\n */\n convertHandlerReturnTypeToMapOfTensors(results: SessionHandler.ReturnType): ReturnType {\n const returnValue: {[name: string]: OnnxValue} = {};\n for (const key in results) {\n if (Object.hasOwnProperty.call(results, key)) {\n const result = results[key];\n if (result instanceof Tensor) {\n returnValue[key] = result;\n } else {\n returnValue[key] = new Tensor(result.type, result.data, result.dims);\n }\n }\n }\n return returnValue;\n }\n\n async lazyResetGrad(): Promise {\n await this.handler.lazyResetGrad();\n }\n\n runTrainStep(feeds: FeedsType, options?: RunOptions): Promise;\n runTrainStep(feeds: FeedsType, fetches: FetchesType, options?: RunOptions): Promise;\n async runTrainStep(feeds: FeedsType, arg1?: FetchesType|RunOptions, arg2?: RunOptions): Promise {\n const [fetches, options] =\n this.typeNarrowingForRunStep(this.trainingInputNames, this.trainingOutputNames, feeds, arg1, arg2);\n const results = await this.handler.runTrainStep(feeds, fetches, options);\n return this.convertHandlerReturnTypeToMapOfTensors(results);\n }\n\n async runOptimizerStep(options?: InferenceSession.RunOptions|undefined): Promise {\n if (this.hasOptimizerModel) {\n await this.handler.runOptimizerStep(options || {});\n } else {\n throw new Error('This TrainingSession has no OptimizerModel loaded.');\n }\n }\n\n runEvalStep(feeds: FeedsType, options?: RunOptions|undefined): Promise;\n runEvalStep(feeds: FeedsType, fetches: FetchesType, options?: RunOptions|undefined): Promise;\n async runEvalStep(feeds: FeedsType, arg1?: FetchesType|RunOptions, arg2?: RunOptions): Promise {\n if (this.hasEvalModel) {\n const [fetches, options] =\n this.typeNarrowingForRunStep(this.evalInputNames, this.evalOutputNames, feeds, arg1, arg2);\n const results = await this.handler.runEvalStep(feeds, fetches, options);\n return this.convertHandlerReturnTypeToMapOfTensors(results);\n } else {\n throw new Error('This TrainingSession has no EvalModel loaded.');\n }\n }\n\n async getParametersSize(trainableOnly = true): Promise {\n return this.handler.getParametersSize(trainableOnly);\n }\n\n async loadParametersBuffer(array: Uint8Array, trainableOnly = true): Promise {\n const paramsSize = await this.getParametersSize(trainableOnly);\n // checking that the size of the Uint8Array is equivalent to the byte length of a Float32Array of the number\n // of parameters\n if (array.length !== 4 * paramsSize) {\n throw new Error(\n 'Size of the buffer passed into loadParametersBuffer must match the number of parameters in ' +\n 'the model. Please use getParametersSize method to check.');\n }\n return this.handler.loadParametersBuffer(array, trainableOnly);\n }\n\n async getContiguousParameters(trainableOnly = true): Promise {\n return this.handler.getContiguousParameters(trainableOnly);\n }\n\n async release(): Promise {\n return this.handler.dispose();\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession} from './inference-session.js';\nimport {OnnxValue} from './onnx-value.js';\nimport {TrainingSession as TrainingSessionImpl} from './training-session-impl.js';\n\n/* eslint-disable @typescript-eslint/no-redeclare */\n\nexport declare namespace TrainingSession {\n /**\n * Either URI file path (string) or Uint8Array containing model or checkpoint information.\n */\n type UriOrBuffer = string|Uint8Array;\n}\n\n/**\n * Represent a runtime instance of an ONNX training session,\n * which contains a model that can be trained, and, optionally,\n * an eval and optimizer model.\n */\nexport interface TrainingSession {\n // #region run()\n\n /**\n * Lazily resets the gradients of all trainable parameters to zero. Should happen after the invocation of\n * runOptimizerStep.\n */\n lazyResetGrad(): Promise;\n\n /**\n * Run TrainStep asynchronously with the given feeds and options.\n *\n * @param feeds - Representation of the model input. See type description of `InferenceSession.InputType` for\n detail.\n * @param options - Optional. A set of options that controls the behavior of model training.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding values.\n */\n runTrainStep(feeds: InferenceSession.FeedsType, options?: InferenceSession.RunOptions):\n Promise;\n\n /**\n * Run a single train step with the given inputs and options.\n *\n * @param feeds - Representation of the model input.\n * @param fetches - Representation of the model output.\n * detail.\n * @param options - Optional. A set of options that controls the behavior of model training.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding\n values.\n */\n runTrainStep(\n feeds: InferenceSession.FeedsType, fetches: InferenceSession.FetchesType,\n options?: InferenceSession.RunOptions): Promise;\n\n /**\n * Runs a single optimizer step, which performs weight updates for the trainable parameters using the optimizer model.\n *\n * @param options - Optional. A set of options that controls the behavior of model optimizing.\n */\n runOptimizerStep(options?: InferenceSession.RunOptions): Promise;\n\n /**\n * Run a single eval step with the given inputs and options using the eval model.\n *\n * @param feeds - Representation of the model input.\n * @param options - Optional. A set of options that controls the behavior of model eval step.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding\n values.\n */\n runEvalStep(feeds: InferenceSession.FeedsType, options?: InferenceSession.RunOptions):\n Promise;\n\n /**\n * Run a single eval step with the given inputs and options using the eval model.\n *\n * @param feeds - Representation of the model input.\n * @param fetches - Representation of the model output.\n * detail.\n * @param options - Optional. A set of options that controls the behavior of model eval step.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding\n values.\n */\n runEvalStep(\n feeds: InferenceSession.FeedsType, fetches: InferenceSession.FetchesType,\n options?: InferenceSession.RunOptions): Promise;\n\n // #endregion\n\n // #region copy parameters\n\n /**\n * Retrieves the size of all parameters for the training state. Calculates the total number of primitive (datatype of\n * the parameters) elements of all the parameters in the training state.\n *\n * @param trainableOnly - When set to true, the size is calculated for trainable params only. Default value is true.\n */\n getParametersSize(trainableOnly: boolean): Promise;\n\n /**\n * Copies parameter values from the given buffer to the training state. Currently, only supporting models with\n * parameters of type Float32.\n *\n * @param buffer - A Uint8Array representation of Float32 parameters.\n * @param trainableOnly - True if trainable parameters only to be modified, false otherwise. Default value is true.\n */\n loadParametersBuffer(buffer: Uint8Array, trainableOnly: boolean): Promise;\n\n /**\n * Copies the model parameters to a contiguous buffer. Usually used in the context of Federated Learning.\n * Currently, only supporting models with parameters of type Float32.\n *\n * @param trainableOnly - When set to true, only trainable parameters are copied. Trainable parameters are parameters\n * for which requires_grad is set to true. Default value is true.\n * @returns A promise that resolves to a Float32 OnnxValue of the requested parameters.\n */\n getContiguousParameters(trainableOnly: boolean): Promise;\n // #endregion\n\n // #region release()\n\n /**\n * Release the inference session and the underlying resources.\n */\n release(): Promise;\n // #endregion\n\n // #region metadata\n\n /**\n * Get input names of the loaded training model.\n */\n readonly trainingInputNames: readonly string[];\n\n /**\n * Get output names of the loaded training model.\n */\n readonly trainingOutputNames: readonly string[];\n\n /**\n * Get input names of the loaded eval model. Is an empty array if no eval model is loaded.\n */\n readonly evalInputNames: readonly string[];\n\n /**\n * Get output names of the loaded eval model. Is an empty array if no eval model is loaded.\n */\n readonly evalOutputNames: readonly string[];\n\n // #endregion\n}\n\n/**\n * Represents the optional parameters that can be passed into the TrainingSessionFactory.\n */\nexport interface TrainingSessionCreateOptions {\n /**\n * URI or buffer for a .ckpt file that contains the checkpoint for the training model.\n */\n checkpointState: TrainingSession.UriOrBuffer;\n /**\n * URI or buffer for the .onnx training file.\n */\n trainModel: TrainingSession.UriOrBuffer;\n /**\n * Optional. URI or buffer for the .onnx optimizer model file.\n */\n optimizerModel?: TrainingSession.UriOrBuffer;\n /**\n * Optional. URI or buffer for the .onnx eval model file.\n */\n evalModel?: TrainingSession.UriOrBuffer;\n}\n\n/**\n * Defines method overload possibilities for creating a TrainingSession.\n */\nexport interface TrainingSessionFactory {\n // #region create()\n\n /**\n * Creates a new TrainingSession and asynchronously loads any models passed in through trainingOptions\n *\n * @param trainingOptions specify models and checkpoints to load into the Training Session\n * @param sessionOptions specify configuration for training session behavior\n *\n * @returns Promise that resolves to a TrainingSession object\n */\n create(trainingOptions: TrainingSessionCreateOptions, sessionOptions?: InferenceSession.SessionOptions):\n Promise;\n\n // #endregion\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const TrainingSession: TrainingSessionFactory = TrainingSessionImpl;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * # ONNX Runtime JavaScript API\n *\n * ONNX Runtime JavaScript API is a unified API for all JavaScript usages, including the following NPM packages:\n *\n * - [onnxruntime-node](https://www.npmjs.com/package/onnxruntime-node)\n * - [onnxruntime-web](https://www.npmjs.com/package/onnxruntime-web)\n * - [onnxruntime-react-native](https://www.npmjs.com/package/onnxruntime-react-native)\n *\n * See also:\n * - [Get Started](https://onnxruntime.ai/docs/get-started/with-javascript/)\n * - [Inference examples](https://github.com/microsoft/onnxruntime-inference-examples/tree/main/js)\n *\n * @packageDocumentation\n */\n\nexport * from './backend.js';\nexport * from './env.js';\nexport * from './inference-session.js';\nexport * from './tensor.js';\nexport * from './tensor-conversion.js';\nexport * from './tensor-factory.js';\nexport * from './trace.js';\nexport * from './onnx-model.js';\nexport * from './onnx-value.js';\nexport * from './training-session.js';\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from 'onnxruntime-common';\n\nimport {WebGLContext} from './backends/webgl/webgl-context';\n\nexport declare namespace Logger {\n export interface SeverityTypeMap {\n verbose: 'v';\n info: 'i';\n warning: 'w';\n error: 'e';\n fatal: 'f';\n }\n\n export type Severity = keyof SeverityTypeMap;\n\n export type Provider = 'none'|'console';\n\n /**\n * Logging config that used to control the behavior of logger\n */\n export interface Config {\n /**\n * Specify the logging provider. 'console' by default\n */\n provider?: Provider;\n /**\n * Specify the minimal logger serverity. 'warning' by default\n */\n minimalSeverity?: Logger.Severity;\n /**\n * Whether to output date time in log. true by default\n */\n logDateTime?: boolean;\n /**\n * Whether to output source information (Not yet supported). false by default\n */\n logSourceLocation?: boolean;\n }\n\n export interface CategorizedLogger {\n verbose(content: string): void;\n info(content: string): void;\n warning(content: string): void;\n error(content: string): void;\n fatal(content: string): void;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport interface Logger {\n (category: string): Logger.CategorizedLogger;\n\n verbose(content: string): void;\n verbose(category: string, content: string): void;\n info(content: string): void;\n info(category: string, content: string): void;\n warning(content: string): void;\n warning(category: string, content: string): void;\n error(content: string): void;\n error(category: string, content: string): void;\n fatal(content: string): void;\n fatal(category: string, content: string): void;\n\n /**\n * Reset the logger configuration.\n * @param config specify an optional default config\n */\n reset(config?: Logger.Config): void;\n /**\n * Set the logger's behavior on the given category\n * @param category specify a category string. If '*' is specified, all previous configuration will be overwritten. If\n * '' is specified, the default behavior will be updated.\n * @param config the config object to indicate the logger's behavior\n */\n set(category: string, config: Logger.Config): void;\n\n /**\n * Set the logger's behavior from ort-common env\n * @param env the env used to set logger. Currently only setting loglevel is supported through Env.\n */\n setWithEnv(env: Env): void;\n}\n\ninterface LoggerProvider {\n log(severity: Logger.Severity, content: string, category?: string): void;\n}\nclass NoOpLoggerProvider implements LoggerProvider {\n log(_severity: Logger.Severity, _content: string, _category?: string) {\n // do nothing\n }\n}\nclass ConsoleLoggerProvider implements LoggerProvider {\n log(severity: Logger.Severity, content: string, category?: string) {\n // eslint-disable-next-line no-console\n console.log(`${this.color(severity)} ${category ? '\\x1b[35m' + category + '\\x1b[0m ' : ''}${content}`);\n }\n\n private color(severity: Logger.Severity) {\n switch (severity) {\n case 'verbose':\n return '\\x1b[34;40mv\\x1b[0m';\n case 'info':\n return '\\x1b[32mi\\x1b[0m';\n case 'warning':\n return '\\x1b[30;43mw\\x1b[0m';\n case 'error':\n return '\\x1b[31;40me\\x1b[0m';\n case 'fatal':\n return '\\x1b[101mf\\x1b[0m';\n default:\n throw new Error(`unsupported severity: ${severity}`);\n }\n }\n}\n\nconst SEVERITY_VALUE = {\n verbose: 1000,\n info: 2000,\n warning: 4000,\n error: 5000,\n fatal: 6000\n};\n\nconst LOGGER_PROVIDER_MAP: {readonly [provider: string]: Readonly} = {\n ['none']: new NoOpLoggerProvider(),\n ['console']: new ConsoleLoggerProvider()\n};\nconst LOGGER_DEFAULT_CONFIG = {\n provider: 'console',\n minimalSeverity: 'warning',\n logDateTime: true,\n logSourceLocation: false\n};\nlet LOGGER_CONFIG_MAP:\n {[category: string]: Readonly>} = {['']: LOGGER_DEFAULT_CONFIG as Required};\n\nfunction log(category: string): Logger.CategorizedLogger;\nfunction log(severity: Logger.Severity, content: string): void;\nfunction log(severity: Logger.Severity, category: string, content: string): void;\nfunction log(severity: Logger.Severity, arg1: string, arg2?: string): void;\nfunction log(\n arg0: string|Logger.Severity, arg1?: string, arg2?: string|number, arg3?: number): Logger.CategorizedLogger|void {\n if (arg1 === undefined) {\n // log(category: string): Logger.CategorizedLogger;\n return createCategorizedLogger(arg0);\n } else if (arg2 === undefined) {\n // log(severity, content);\n logInternal(arg0 as Logger.Severity, arg1, 1);\n } else if (typeof arg2 === 'number' && arg3 === undefined) {\n // log(severity, content, stack)\n logInternal(arg0 as Logger.Severity, arg1, arg2);\n } else if (typeof arg2 === 'string' && arg3 === undefined) {\n // log(severity, category, content)\n logInternal(arg0 as Logger.Severity, arg2, 1, arg1);\n } else if (typeof arg2 === 'string' && typeof arg3 === 'number') {\n // log(severity, category, content, stack)\n logInternal(arg0 as Logger.Severity, arg2, arg3, arg1);\n } else {\n throw new TypeError('input is valid');\n }\n}\n\nfunction createCategorizedLogger(category: string): Logger.CategorizedLogger {\n return {\n verbose: log.verbose.bind(null, category),\n info: log.info.bind(null, category),\n warning: log.warning.bind(null, category),\n error: log.error.bind(null, category),\n fatal: log.fatal.bind(null, category)\n };\n}\n\n// NOTE: argument 'category' is put the last parameter beacause typescript\n// doesn't allow optional argument put in front of required argument. This\n// order is different from a usual logging API.\nfunction logInternal(severity: Logger.Severity, content: string, _stack: number, category?: string) {\n const config = LOGGER_CONFIG_MAP[category || ''] || LOGGER_CONFIG_MAP[''];\n if (SEVERITY_VALUE[severity] < SEVERITY_VALUE[config.minimalSeverity]) {\n return;\n }\n\n if (config.logDateTime) {\n content = `${new Date().toISOString()}|${content}`;\n }\n\n if (config.logSourceLocation) {\n // TODO: calculate source location from 'stack'\n }\n\n LOGGER_PROVIDER_MAP[config.provider].log(severity, content, category);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace log {\n export function verbose(content: string): void;\n export function verbose(category: string, content: string): void;\n export function verbose(arg0: string, arg1?: string) {\n log('verbose', arg0, arg1);\n }\n export function info(content: string): void;\n export function info(category: string, content: string): void;\n export function info(arg0: string, arg1?: string) {\n log('info', arg0, arg1);\n }\n export function warning(content: string): void;\n export function warning(category: string, content: string): void;\n export function warning(arg0: string, arg1?: string) {\n log('warning', arg0, arg1);\n }\n export function error(content: string): void;\n export function error(category: string, content: string): void;\n export function error(arg0: string, arg1?: string) {\n log('error', arg0, arg1);\n }\n export function fatal(content: string): void;\n export function fatal(category: string, content: string): void;\n export function fatal(arg0: string, arg1?: string) {\n log('fatal', arg0, arg1);\n }\n\n export function reset(config?: Logger.Config): void {\n LOGGER_CONFIG_MAP = {};\n set('', config || {});\n }\n export function set(category: string, config: Logger.Config): void {\n if (category === '*') {\n reset(config);\n } else {\n const previousConfig = LOGGER_CONFIG_MAP[category] || LOGGER_DEFAULT_CONFIG;\n LOGGER_CONFIG_MAP[category] = {\n provider: config.provider || previousConfig.provider,\n minimalSeverity: config.minimalSeverity || previousConfig.minimalSeverity,\n logDateTime: (config.logDateTime === undefined) ? previousConfig.logDateTime : config.logDateTime,\n logSourceLocation: (config.logSourceLocation === undefined) ? previousConfig.logSourceLocation :\n config.logSourceLocation\n };\n }\n\n // TODO: we want to support wildcard or regex?\n }\n\n export function setWithEnv(env: Env): void {\n const config: Logger.Config = {};\n if (env.logLevel) {\n config.minimalSeverity = env.logLevel as Logger.Severity;\n }\n set('', config);\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare, @typescript-eslint/naming-convention\nexport const Logger: Logger = log;\n\nexport declare namespace Profiler {\n export interface Config {\n maxNumberEvents?: number;\n flushBatchSize?: number;\n flushIntervalInMilliseconds?: number;\n }\n\n export type EventCategory = 'session'|'node'|'op'|'backend';\n\n export interface Event {\n end(): void|Promise;\n }\n}\n// TODO\n// class WebGLEvent implements Profiler.Event {}\n\nclass Event implements Profiler.Event {\n constructor(\n public category: Profiler.EventCategory, public name: string, public startTime: number,\n private endCallback: (e: Event) => void|Promise, public timer?: WebGLQuery, public ctx?: WebGLContext) {}\n\n async end() {\n return this.endCallback(this);\n }\n\n async checkTimer(): Promise {\n if (this.ctx === undefined || this.timer === undefined) {\n throw new Error('No webgl timer found');\n } else {\n this.ctx.endTimer();\n return this.ctx.waitForQueryAndGetTime(this.timer);\n }\n }\n}\n\nclass EventRecord {\n constructor(\n public category: Profiler.EventCategory, public name: string, public startTime: number, public endTime: number) {}\n}\n\nexport class Profiler {\n static create(config?: Profiler.Config): Profiler {\n if (config === undefined) {\n return new this();\n }\n return new this(config.maxNumberEvents, config.flushBatchSize, config.flushIntervalInMilliseconds);\n }\n\n private constructor(maxNumberEvents?: number, flushBatchSize?: number, flushIntervalInMilliseconds?: number) {\n this._started = false;\n this._maxNumberEvents = maxNumberEvents === undefined ? 10000 : maxNumberEvents;\n this._flushBatchSize = flushBatchSize === undefined ? 10 : flushBatchSize;\n this._flushIntervalInMilliseconds = flushIntervalInMilliseconds === undefined ? 5000 : flushIntervalInMilliseconds;\n }\n\n // start profiling\n start() {\n this._started = true;\n this._timingEvents = [];\n this._flushTime = now();\n this._flushPointer = 0;\n }\n\n // stop profiling\n stop() {\n this._started = false;\n for (; this._flushPointer < this._timingEvents.length; this._flushPointer++) {\n this.logOneEvent(this._timingEvents[this._flushPointer]);\n }\n }\n\n // create an event scope for the specific function\n event(category: Profiler.EventCategory, name: string, func: () => T, ctx?: WebGLContext): T;\n event(category: Profiler.EventCategory, name: string, func: () => Promise, ctx?: WebGLContext): Promise;\n\n event(category: Profiler.EventCategory, name: string, func: () => T | Promise, ctx?: WebGLContext): T\n |Promise {\n const event = this._started ? this.begin(category, name, ctx) : undefined;\n let isPromise = false;\n\n const res = func();\n\n // we consider a then-able object is a promise\n if (res && typeof (res as Promise).then === 'function') {\n isPromise = true;\n return new Promise((resolve, reject) => {\n (res as Promise)\n .then(\n async value => { // fulfilled\n if (event) {\n await event.end();\n }\n resolve(value);\n },\n async reason => { // rejected\n if (event) {\n await event.end();\n }\n reject(reason);\n });\n });\n }\n if (!isPromise && event) {\n const eventRes = event.end();\n if (eventRes && typeof eventRes.then === 'function') {\n return new Promise((resolve, reject) => {\n (eventRes).then(\n () => { // fulfilled\n resolve(res);\n },\n (reason) => { // rejected\n reject(reason);\n });\n });\n }\n }\n return res;\n }\n\n // begin an event\n begin(category: Profiler.EventCategory, name: string, ctx?: WebGLContext): Event {\n if (!this._started) {\n throw new Error('profiler is not started yet');\n }\n if (ctx === undefined) {\n const startTime = now();\n this.flush(startTime);\n return new Event(category, name, startTime, e => this.endSync(e));\n } else {\n const timer: WebGLQuery = ctx.beginTimer();\n return new Event(category, name, 0, async e => this.end(e), timer, ctx);\n }\n }\n\n // end the specific event\n private async end(event: Event): Promise {\n const endTime: number = await event.checkTimer();\n if (this._timingEvents.length < this._maxNumberEvents) {\n this._timingEvents.push(new EventRecord(event.category, event.name, event.startTime, endTime));\n this.flush(endTime);\n }\n }\n\n private endSync(event: Event): void {\n const endTime: number = now();\n if (this._timingEvents.length < this._maxNumberEvents) {\n this._timingEvents.push(new EventRecord(event.category, event.name, event.startTime, endTime));\n this.flush(endTime);\n }\n }\n\n private logOneEvent(event: EventRecord) {\n Logger.verbose(\n `Profiler.${event.category}`,\n `${(event.endTime - event.startTime).toFixed(2)}ms on event '${event.name}' at ${event.endTime.toFixed(2)}`);\n }\n\n private flush(currentTime: number) {\n if (this._timingEvents.length - this._flushPointer >= this._flushBatchSize ||\n currentTime - this._flushTime >= this._flushIntervalInMilliseconds) {\n // should flush when either batch size accumlated or interval elepsed\n\n for (const previousPointer = this._flushPointer; this._flushPointer < previousPointer + this._flushBatchSize &&\n this._flushPointer < this._timingEvents.length;\n this._flushPointer++) {\n this.logOneEvent(this._timingEvents[this._flushPointer]);\n }\n\n this._flushTime = now();\n }\n }\n\n get started() {\n return this._started;\n }\n private _started = false;\n private _timingEvents: EventRecord[];\n\n private readonly _maxNumberEvents: number;\n\n private readonly _flushBatchSize: number;\n private readonly _flushIntervalInMilliseconds: number;\n\n private _flushTime: number;\n private _flushPointer = 0;\n}\n\n/**\n * returns a number to represent the current timestamp in a resolution as high as possible.\n */\nexport const now = (typeof performance !== 'undefined' && performance.now) ? () => performance.now() : Date.now;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from './graph';\nimport {OperatorImplementation, OperatorInitialization} from './operators';\n\nexport interface OpSet {\n domain: string;\n version: number;\n}\nexport declare namespace OpSet {\n /**\n * Domain of an opset, it can be an empty string(default value, represent for ai.onnx), or 'ai.onnx.ml'\n */\n type Domain = ''|'ai.onnx.ml'|'com.microsoft';\n /**\n * A resolve rule consists of 4 or 5 items: opType, opSetDomain, versionSelector, operatorImplementation and\n * operatorInitialization (optional)\n */\n type ResolveRule = [\n string, Domain, string, OperatorImplementation\n ]|[string, Domain, string, OperatorImplementation, OperatorInitialization];\n}\n\nexport function resolveOperator(node: Graph.Node, opsets: readonly OpSet[], rules: readonly OpSet.ResolveRule[]) {\n for (const rule of rules) {\n const opType = rule[0];\n const domain = rule[1];\n const versionSelector = rule[2];\n const opImpl = rule[3];\n const opInit = rule[4];\n\n if (node.opType === opType) { // operator type matches\n for (const opset of opsets) {\n // opset '' and 'ai.onnx' are considered the same.\n if (opset.domain === domain || (opset.domain === 'ai.onnx' && domain === '')) { // opset domain found\n if (matchSelector(opset.version, versionSelector)) {\n return {opImpl, opInit};\n }\n }\n }\n }\n }\n\n throw new TypeError(`cannot resolve operator '${node.opType}' with opsets: ${\n opsets.map(set => `${set.domain || 'ai.onnx'} v${set.version}`).join(', ')}`);\n}\n\nfunction matchSelector(version: number, selector: string): boolean {\n if (selector.endsWith('+')) {\n // minimum version match ('7+' expects version>=7)\n const rangeStart = Number.parseInt(selector.substring(0, selector.length - 1), 10);\n return !isNaN(rangeStart) && rangeStart <= version;\n } else if (selector.split('-').length === 2) {\n // range match ('6-8' expects 6<=version<=8)\n const pair = selector.split('-');\n const rangeStart = Number.parseInt(pair[0], 10);\n const rangeEnd = Number.parseInt(pair[1], 10);\n return !isNaN(rangeStart) && !isNaN(rangeEnd) && rangeStart <= version && version <= rangeEnd;\n } else {\n // exact match ('7' expects version===7)\n return Number.parseInt(selector, 10) === version;\n }\n}\n", "\"use strict\";\r\nexports.__esModule = true;\r\nvar Guid = /** @class */ (function () {\r\n function Guid(guid) {\r\n if (!guid) {\r\n throw new TypeError(\"Invalid argument; `value` has no value.\");\r\n }\r\n this.value = Guid.EMPTY;\r\n if (guid && Guid.isGuid(guid)) {\r\n this.value = guid;\r\n }\r\n }\r\n Guid.isGuid = function (guid) {\r\n var value = guid.toString();\r\n return guid && (guid instanceof Guid || Guid.validator.test(value));\r\n };\r\n Guid.create = function () {\r\n return new Guid([Guid.gen(2), Guid.gen(1), Guid.gen(1), Guid.gen(1), Guid.gen(3)].join(\"-\"));\r\n };\r\n Guid.createEmpty = function () {\r\n return new Guid(\"emptyguid\");\r\n };\r\n Guid.parse = function (guid) {\r\n return new Guid(guid);\r\n };\r\n Guid.raw = function () {\r\n return [Guid.gen(2), Guid.gen(1), Guid.gen(1), Guid.gen(1), Guid.gen(3)].join(\"-\");\r\n };\r\n Guid.gen = function (count) {\r\n var out = \"\";\r\n for (var i = 0; i < count; i++) {\r\n // tslint:disable-next-line:no-bitwise\r\n out += (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);\r\n }\r\n return out;\r\n };\r\n Guid.prototype.equals = function (other) {\r\n // Comparing string `value` against provided `guid` will auto-call\r\n // toString on `guid` for comparison\r\n return Guid.isGuid(other) && this.value === other.toString();\r\n };\r\n Guid.prototype.isEmpty = function () {\r\n return this.value === Guid.EMPTY;\r\n };\r\n Guid.prototype.toString = function () {\r\n return this.value;\r\n };\r\n Guid.prototype.toJSON = function () {\r\n return {\r\n value: this.value\r\n };\r\n };\r\n Guid.validator = new RegExp(\"^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$\", \"i\");\r\n Guid.EMPTY = \"00000000-0000-0000-0000-000000000000\";\r\n return Guid;\r\n}());\r\nexports.Guid = Guid;\r\n", "/**\n * @license\n * Copyright 2009 The Closure Library Authors\n * Copyright 2020 Daniel Wirtz / The long.js Authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// WebAssembly optimizations to do native i64 multiplication and divide\nvar wasm = null;\ntry {\n wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\n ])), {}).exports;\n} catch (e) {\n // no wasm support :(\n}\n\n/**\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\n * See the from* functions below for more convenient ways of constructing Longs.\n * @exports Long\n * @class A Long class for representing a 64 bit two's-complement integer value.\n * @param {number} low The low (signed) 32 bits of the long\n * @param {number} high The high (signed) 32 bits of the long\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @constructor\n */\nfunction Long(low, high, unsigned) {\n\n /**\n * The low 32 bits as a signed value.\n * @type {number}\n */\n this.low = low | 0;\n\n /**\n * The high 32 bits as a signed value.\n * @type {number}\n */\n this.high = high | 0;\n\n /**\n * Whether unsigned or not.\n * @type {boolean}\n */\n this.unsigned = !!unsigned;\n}\n\n// The internal representation of a long is the two given signed, 32-bit values.\n// We use 32-bit pieces because these are the size of integers on which\n// Javascript performs bit-operations. For operations like addition and\n// multiplication, we split each number into 16 bit pieces, which can easily be\n// multiplied within Javascript's floating-point representation without overflow\n// or change in sign.\n//\n// In the algorithms below, we frequently reduce the negative case to the\n// positive case by negating the input(s) and then post-processing the result.\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\n// a positive number, it overflows back into a negative). Not handling this\n// case would often result in infinite recursion.\n//\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\n// methods on which they depend.\n\n/**\n * An indicator used to reliably determine if an object is a Long or not.\n * @type {boolean}\n * @const\n * @private\n */\nLong.prototype.__isLong__;\n\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\n\n/**\n * @function\n * @param {*} obj Object\n * @returns {boolean}\n * @inner\n */\nfunction isLong(obj) {\n return (obj && obj[\"__isLong__\"]) === true;\n}\n\n/**\n * @function\n * @param {*} value number\n * @returns {number}\n * @inner\n */\nfunction ctz32(value) {\n var c = Math.clz32(value & -value);\n return value ? 31 - c : c;\n}\n\n/**\n * Tests if the specified object is a Long.\n * @function\n * @param {*} obj Object\n * @returns {boolean}\n */\nLong.isLong = isLong;\n\n/**\n * A cache of the Long representations of small integer values.\n * @type {!Object}\n * @inner\n */\nvar INT_CACHE = {};\n\n/**\n * A cache of the Long representations of small unsigned integer values.\n * @type {!Object}\n * @inner\n */\nvar UINT_CACHE = {};\n\n/**\n * @param {number} value\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nfunction fromInt(value, unsigned) {\n var obj, cachedObj, cache;\n if (unsigned) {\n value >>>= 0;\n if (cache = (0 <= value && value < 256)) {\n cachedObj = UINT_CACHE[value];\n if (cachedObj)\n return cachedObj;\n }\n obj = fromBits(value, 0, true);\n if (cache)\n UINT_CACHE[value] = obj;\n return obj;\n } else {\n value |= 0;\n if (cache = (-128 <= value && value < 128)) {\n cachedObj = INT_CACHE[value];\n if (cachedObj)\n return cachedObj;\n }\n obj = fromBits(value, value < 0 ? -1 : 0, false);\n if (cache)\n INT_CACHE[value] = obj;\n return obj;\n }\n}\n\n/**\n * Returns a Long representing the given 32 bit integer value.\n * @function\n * @param {number} value The 32 bit integer in question\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\nLong.fromInt = fromInt;\n\n/**\n * @param {number} value\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nfunction fromNumber(value, unsigned) {\n if (isNaN(value))\n return unsigned ? UZERO : ZERO;\n if (unsigned) {\n if (value < 0)\n return UZERO;\n if (value >= TWO_PWR_64_DBL)\n return MAX_UNSIGNED_VALUE;\n } else {\n if (value <= -TWO_PWR_63_DBL)\n return MIN_VALUE;\n if (value + 1 >= TWO_PWR_63_DBL)\n return MAX_VALUE;\n }\n if (value < 0)\n return fromNumber(-value, unsigned).neg();\n return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\n}\n\n/**\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\n * @function\n * @param {number} value The number in question\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\nLong.fromNumber = fromNumber;\n\n/**\n * @param {number} lowBits\n * @param {number} highBits\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nfunction fromBits(lowBits, highBits, unsigned) {\n return new Long(lowBits, highBits, unsigned);\n}\n\n/**\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\n * assumed to use 32 bits.\n * @function\n * @param {number} lowBits The low 32 bits\n * @param {number} highBits The high 32 bits\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\nLong.fromBits = fromBits;\n\n/**\n * @function\n * @param {number} base\n * @param {number} exponent\n * @returns {number}\n * @inner\n */\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\n\n/**\n * @param {string} str\n * @param {(boolean|number)=} unsigned\n * @param {number=} radix\n * @returns {!Long}\n * @inner\n */\nfunction fromString(str, unsigned, radix) {\n if (str.length === 0)\n throw Error('empty string');\n if (typeof unsigned === 'number') {\n // For goog.math.long compatibility\n radix = unsigned;\n unsigned = false;\n } else {\n unsigned = !!unsigned;\n }\n if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\n return unsigned ? UZERO : ZERO;\n radix = radix || 10;\n if (radix < 2 || 36 < radix)\n throw RangeError('radix');\n\n var p;\n if ((p = str.indexOf('-')) > 0)\n throw Error('interior hyphen');\n else if (p === 0) {\n return fromString(str.substring(1), unsigned, radix).neg();\n }\n\n // Do several (8) digits each time through the loop, so as to\n // minimize the calls to the very expensive emulated div.\n var radixToPower = fromNumber(pow_dbl(radix, 8));\n\n var result = ZERO;\n for (var i = 0; i < str.length; i += 8) {\n var size = Math.min(8, str.length - i),\n value = parseInt(str.substring(i, i + size), radix);\n if (size < 8) {\n var power = fromNumber(pow_dbl(radix, size));\n result = result.mul(power).add(fromNumber(value));\n } else {\n result = result.mul(radixToPower);\n result = result.add(fromNumber(value));\n }\n }\n result.unsigned = unsigned;\n return result;\n}\n\n/**\n * Returns a Long representation of the given string, written using the specified radix.\n * @function\n * @param {string} str The textual representation of the Long\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\n * @returns {!Long} The corresponding Long value\n */\nLong.fromString = fromString;\n\n/**\n * @function\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\nfunction fromValue(val, unsigned) {\n if (typeof val === 'number')\n return fromNumber(val, unsigned);\n if (typeof val === 'string')\n return fromString(val, unsigned);\n // Throws for non-objects, converts non-instanceof Long:\n return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\n}\n\n/**\n * Converts the specified value to a Long using the appropriate from* function for its type.\n * @function\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long}\n */\nLong.fromValue = fromValue;\n\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\n// no runtime penalty for these.\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_16_DBL = 1 << 16;\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_24_DBL = 1 << 24;\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\n\n/**\n * @type {number}\n * @const\n * @inner\n */\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\n\n/**\n * @type {!Long}\n * @const\n * @inner\n */\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\n\n/**\n * @type {!Long}\n * @inner\n */\nvar ZERO = fromInt(0);\n\n/**\n * Signed zero.\n * @type {!Long}\n */\nLong.ZERO = ZERO;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar UZERO = fromInt(0, true);\n\n/**\n * Unsigned zero.\n * @type {!Long}\n */\nLong.UZERO = UZERO;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar ONE = fromInt(1);\n\n/**\n * Signed one.\n * @type {!Long}\n */\nLong.ONE = ONE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar UONE = fromInt(1, true);\n\n/**\n * Unsigned one.\n * @type {!Long}\n */\nLong.UONE = UONE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar NEG_ONE = fromInt(-1);\n\n/**\n * Signed negative one.\n * @type {!Long}\n */\nLong.NEG_ONE = NEG_ONE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar MAX_VALUE = fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0, false);\n\n/**\n * Maximum signed value.\n * @type {!Long}\n */\nLong.MAX_VALUE = MAX_VALUE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF | 0, 0xFFFFFFFF | 0, true);\n\n/**\n * Maximum unsigned value.\n * @type {!Long}\n */\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\n\n/**\n * @type {!Long}\n * @inner\n */\nvar MIN_VALUE = fromBits(0, 0x80000000 | 0, false);\n\n/**\n * Minimum signed value.\n * @type {!Long}\n */\nLong.MIN_VALUE = MIN_VALUE;\n\n/**\n * @alias Long.prototype\n * @inner\n */\nvar LongPrototype = Long.prototype;\n\n/**\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\n * @this {!Long}\n * @returns {number}\n */\nLongPrototype.toInt = function toInt() {\n return this.unsigned ? this.low >>> 0 : this.low;\n};\n\n/**\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\n * @this {!Long}\n * @returns {number}\n */\nLongPrototype.toNumber = function toNumber() {\n if (this.unsigned)\n return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\n return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\n};\n\n/**\n * Converts the Long to a string written in the specified radix.\n * @this {!Long}\n * @param {number=} radix Radix (2-36), defaults to 10\n * @returns {string}\n * @override\n * @throws {RangeError} If `radix` is out of range\n */\nLongPrototype.toString = function toString(radix) {\n radix = radix || 10;\n if (radix < 2 || 36 < radix)\n throw RangeError('radix');\n if (this.isZero())\n return '0';\n if (this.isNegative()) { // Unsigned Longs are never negative\n if (this.eq(MIN_VALUE)) {\n // We need to change the Long value before it can be negated, so we remove\n // the bottom-most digit in this base and then recurse to do the rest.\n var radixLong = fromNumber(radix),\n div = this.div(radixLong),\n rem1 = div.mul(radixLong).sub(this);\n return div.toString(radix) + rem1.toInt().toString(radix);\n } else\n return '-' + this.neg().toString(radix);\n }\n\n // Do several (6) digits each time through the loop, so as to\n // minimize the calls to the very expensive emulated div.\n var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\n rem = this;\n var result = '';\n while (true) {\n var remDiv = rem.div(radixToPower),\n intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\n digits = intval.toString(radix);\n rem = remDiv;\n if (rem.isZero())\n return digits + result;\n else {\n while (digits.length < 6)\n digits = '0' + digits;\n result = '' + digits + result;\n }\n }\n};\n\n/**\n * Gets the high 32 bits as a signed integer.\n * @this {!Long}\n * @returns {number} Signed high bits\n */\nLongPrototype.getHighBits = function getHighBits() {\n return this.high;\n};\n\n/**\n * Gets the high 32 bits as an unsigned integer.\n * @this {!Long}\n * @returns {number} Unsigned high bits\n */\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\n return this.high >>> 0;\n};\n\n/**\n * Gets the low 32 bits as a signed integer.\n * @this {!Long}\n * @returns {number} Signed low bits\n */\nLongPrototype.getLowBits = function getLowBits() {\n return this.low;\n};\n\n/**\n * Gets the low 32 bits as an unsigned integer.\n * @this {!Long}\n * @returns {number} Unsigned low bits\n */\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\n return this.low >>> 0;\n};\n\n/**\n * Gets the number of bits needed to represent the absolute value of this Long.\n * @this {!Long}\n * @returns {number}\n */\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\n if (this.isNegative()) // Unsigned Longs are never negative\n return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\n var val = this.high != 0 ? this.high : this.low;\n for (var bit = 31; bit > 0; bit--)\n if ((val & (1 << bit)) != 0)\n break;\n return this.high != 0 ? bit + 33 : bit + 1;\n};\n\n/**\n * Tests if this Long's value equals zero.\n * @this {!Long}\n * @returns {boolean}\n */\nLongPrototype.isZero = function isZero() {\n return this.high === 0 && this.low === 0;\n};\n\n/**\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\n * @returns {boolean}\n */\nLongPrototype.eqz = LongPrototype.isZero;\n\n/**\n * Tests if this Long's value is negative.\n * @this {!Long}\n * @returns {boolean}\n */\nLongPrototype.isNegative = function isNegative() {\n return !this.unsigned && this.high < 0;\n};\n\n/**\n * Tests if this Long's value is positive or zero.\n * @this {!Long}\n * @returns {boolean}\n */\nLongPrototype.isPositive = function isPositive() {\n return this.unsigned || this.high >= 0;\n};\n\n/**\n * Tests if this Long's value is odd.\n * @this {!Long}\n * @returns {boolean}\n */\nLongPrototype.isOdd = function isOdd() {\n return (this.low & 1) === 1;\n};\n\n/**\n * Tests if this Long's value is even.\n * @this {!Long}\n * @returns {boolean}\n */\nLongPrototype.isEven = function isEven() {\n return (this.low & 1) === 0;\n};\n\n/**\n * Tests if this Long's value equals the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.equals = function equals(other) {\n if (!isLong(other))\n other = fromValue(other);\n if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\n return false;\n return this.high === other.high && this.low === other.low;\n};\n\n/**\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.eq = LongPrototype.equals;\n\n/**\n * Tests if this Long's value differs from the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.notEquals = function notEquals(other) {\n return !this.eq(/* validates */ other);\n};\n\n/**\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.neq = LongPrototype.notEquals;\n\n/**\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.ne = LongPrototype.notEquals;\n\n/**\n * Tests if this Long's value is less than the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.lessThan = function lessThan(other) {\n return this.comp(/* validates */ other) < 0;\n};\n\n/**\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.lt = LongPrototype.lessThan;\n\n/**\n * Tests if this Long's value is less than or equal the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\n return this.comp(/* validates */ other) <= 0;\n};\n\n/**\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\n\n/**\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.le = LongPrototype.lessThanOrEqual;\n\n/**\n * Tests if this Long's value is greater than the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.greaterThan = function greaterThan(other) {\n return this.comp(/* validates */ other) > 0;\n};\n\n/**\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.gt = LongPrototype.greaterThan;\n\n/**\n * Tests if this Long's value is greater than or equal the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\n return this.comp(/* validates */ other) >= 0;\n};\n\n/**\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\n\n/**\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {boolean}\n */\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\n\n/**\n * Compares this Long's value with the specified's.\n * @this {!Long}\n * @param {!Long|number|string} other Other value\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\n * if the given one is greater\n */\nLongPrototype.compare = function compare(other) {\n if (!isLong(other))\n other = fromValue(other);\n if (this.eq(other))\n return 0;\n var thisNeg = this.isNegative(),\n otherNeg = other.isNegative();\n if (thisNeg && !otherNeg)\n return -1;\n if (!thisNeg && otherNeg)\n return 1;\n // At this point the sign bits are the same\n if (!this.unsigned)\n return this.sub(other).isNegative() ? -1 : 1;\n // Both are positive if at least one is unsigned\n return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\n};\n\n/**\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\n * @function\n * @param {!Long|number|string} other Other value\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\n * if the given one is greater\n */\nLongPrototype.comp = LongPrototype.compare;\n\n/**\n * Negates this Long's value.\n * @this {!Long}\n * @returns {!Long} Negated Long\n */\nLongPrototype.negate = function negate() {\n if (!this.unsigned && this.eq(MIN_VALUE))\n return MIN_VALUE;\n return this.not().add(ONE);\n};\n\n/**\n * Negates this Long's value. This is an alias of {@link Long#negate}.\n * @function\n * @returns {!Long} Negated Long\n */\nLongPrototype.neg = LongPrototype.negate;\n\n/**\n * Returns the sum of this and the specified Long.\n * @this {!Long}\n * @param {!Long|number|string} addend Addend\n * @returns {!Long} Sum\n */\nLongPrototype.add = function add(addend) {\n if (!isLong(addend))\n addend = fromValue(addend);\n\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\n\n var a48 = this.high >>> 16;\n var a32 = this.high & 0xFFFF;\n var a16 = this.low >>> 16;\n var a00 = this.low & 0xFFFF;\n\n var b48 = addend.high >>> 16;\n var b32 = addend.high & 0xFFFF;\n var b16 = addend.low >>> 16;\n var b00 = addend.low & 0xFFFF;\n\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n c00 += a00 + b00;\n c16 += c00 >>> 16;\n c00 &= 0xFFFF;\n c16 += a16 + b16;\n c32 += c16 >>> 16;\n c16 &= 0xFFFF;\n c32 += a32 + b32;\n c48 += c32 >>> 16;\n c32 &= 0xFFFF;\n c48 += a48 + b48;\n c48 &= 0xFFFF;\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\n};\n\n/**\n * Returns the difference of this and the specified Long.\n * @this {!Long}\n * @param {!Long|number|string} subtrahend Subtrahend\n * @returns {!Long} Difference\n */\nLongPrototype.subtract = function subtract(subtrahend) {\n if (!isLong(subtrahend))\n subtrahend = fromValue(subtrahend);\n return this.add(subtrahend.neg());\n};\n\n/**\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\n * @function\n * @param {!Long|number|string} subtrahend Subtrahend\n * @returns {!Long} Difference\n */\nLongPrototype.sub = LongPrototype.subtract;\n\n/**\n * Returns the product of this and the specified Long.\n * @this {!Long}\n * @param {!Long|number|string} multiplier Multiplier\n * @returns {!Long} Product\n */\nLongPrototype.multiply = function multiply(multiplier) {\n if (this.isZero())\n return this;\n if (!isLong(multiplier))\n multiplier = fromValue(multiplier);\n\n // use wasm support if present\n if (wasm) {\n var low = wasm[\"mul\"](this.low,\n this.high,\n multiplier.low,\n multiplier.high);\n return fromBits(low, wasm[\"get_high\"](), this.unsigned);\n }\n\n if (multiplier.isZero())\n return this.unsigned ? UZERO : ZERO;\n if (this.eq(MIN_VALUE))\n return multiplier.isOdd() ? MIN_VALUE : ZERO;\n if (multiplier.eq(MIN_VALUE))\n return this.isOdd() ? MIN_VALUE : ZERO;\n\n if (this.isNegative()) {\n if (multiplier.isNegative())\n return this.neg().mul(multiplier.neg());\n else\n return this.neg().mul(multiplier).neg();\n } else if (multiplier.isNegative())\n return this.mul(multiplier.neg()).neg();\n\n // If both longs are small, use float multiplication\n if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\n return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\n\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\n // We can skip products that would overflow.\n\n var a48 = this.high >>> 16;\n var a32 = this.high & 0xFFFF;\n var a16 = this.low >>> 16;\n var a00 = this.low & 0xFFFF;\n\n var b48 = multiplier.high >>> 16;\n var b32 = multiplier.high & 0xFFFF;\n var b16 = multiplier.low >>> 16;\n var b00 = multiplier.low & 0xFFFF;\n\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n c00 += a00 * b00;\n c16 += c00 >>> 16;\n c00 &= 0xFFFF;\n c16 += a16 * b00;\n c32 += c16 >>> 16;\n c16 &= 0xFFFF;\n c16 += a00 * b16;\n c32 += c16 >>> 16;\n c16 &= 0xFFFF;\n c32 += a32 * b00;\n c48 += c32 >>> 16;\n c32 &= 0xFFFF;\n c32 += a16 * b16;\n c48 += c32 >>> 16;\n c32 &= 0xFFFF;\n c32 += a00 * b32;\n c48 += c32 >>> 16;\n c32 &= 0xFFFF;\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\n c48 &= 0xFFFF;\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\n};\n\n/**\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\n * @function\n * @param {!Long|number|string} multiplier Multiplier\n * @returns {!Long} Product\n */\nLongPrototype.mul = LongPrototype.multiply;\n\n/**\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\n * unsigned if this Long is unsigned.\n * @this {!Long}\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Quotient\n */\nLongPrototype.divide = function divide(divisor) {\n if (!isLong(divisor))\n divisor = fromValue(divisor);\n if (divisor.isZero())\n throw Error('division by zero');\n\n // use wasm support if present\n if (wasm) {\n // guard against signed division overflow: the largest\n // negative number / -1 would be 1 larger than the largest\n // positive number, due to two's complement.\n if (!this.unsigned &&\n this.high === -0x80000000 &&\n divisor.low === -1 && divisor.high === -1) {\n // be consistent with non-wasm code path\n return this;\n }\n var low = (this.unsigned ? wasm[\"div_u\"] : wasm[\"div_s\"])(\n this.low,\n this.high,\n divisor.low,\n divisor.high\n );\n return fromBits(low, wasm[\"get_high\"](), this.unsigned);\n }\n\n if (this.isZero())\n return this.unsigned ? UZERO : ZERO;\n var approx, rem, res;\n if (!this.unsigned) {\n // This section is only relevant for signed longs and is derived from the\n // closure library as a whole.\n if (this.eq(MIN_VALUE)) {\n if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\n return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\n else if (divisor.eq(MIN_VALUE))\n return ONE;\n else {\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\n var halfThis = this.shr(1);\n approx = halfThis.div(divisor).shl(1);\n if (approx.eq(ZERO)) {\n return divisor.isNegative() ? ONE : NEG_ONE;\n } else {\n rem = this.sub(divisor.mul(approx));\n res = approx.add(rem.div(divisor));\n return res;\n }\n }\n } else if (divisor.eq(MIN_VALUE))\n return this.unsigned ? UZERO : ZERO;\n if (this.isNegative()) {\n if (divisor.isNegative())\n return this.neg().div(divisor.neg());\n return this.neg().div(divisor).neg();\n } else if (divisor.isNegative())\n return this.div(divisor.neg()).neg();\n res = ZERO;\n } else {\n // The algorithm below has not been made for unsigned longs. It's therefore\n // required to take special care of the MSB prior to running it.\n if (!divisor.unsigned)\n divisor = divisor.toUnsigned();\n if (divisor.gt(this))\n return UZERO;\n if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\n return UONE;\n res = UZERO;\n }\n\n // Repeat the following until the remainder is less than other: find a\n // floating-point that approximates remainder / other *from below*, add this\n // into the result, and subtract it from the remainder. It is critical that\n // the approximate value is less than or equal to the real value so that the\n // remainder never becomes negative.\n rem = this;\n while (rem.gte(divisor)) {\n // Approximate the result of division. This may be a little greater or\n // smaller than the actual value.\n approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\n\n // We will tweak the approximate result by changing it in the 48-th digit or\n // the smallest non-fractional digit, whichever is larger.\n var log2 = Math.ceil(Math.log(approx) / Math.LN2),\n delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\n\n // Decrease the approximation until it is smaller than the remainder. Note\n // that if it is too large, the product overflows and is negative.\n approxRes = fromNumber(approx),\n approxRem = approxRes.mul(divisor);\n while (approxRem.isNegative() || approxRem.gt(rem)) {\n approx -= delta;\n approxRes = fromNumber(approx, this.unsigned);\n approxRem = approxRes.mul(divisor);\n }\n\n // We know the answer can't be zero... and actually, zero would cause\n // infinite recursion since we would make no progress.\n if (approxRes.isZero())\n approxRes = ONE;\n\n res = res.add(approxRes);\n rem = rem.sub(approxRem);\n }\n return res;\n};\n\n/**\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\n * @function\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Quotient\n */\nLongPrototype.div = LongPrototype.divide;\n\n/**\n * Returns this Long modulo the specified.\n * @this {!Long}\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Remainder\n */\nLongPrototype.modulo = function modulo(divisor) {\n if (!isLong(divisor))\n divisor = fromValue(divisor);\n\n // use wasm support if present\n if (wasm) {\n var low = (this.unsigned ? wasm[\"rem_u\"] : wasm[\"rem_s\"])(\n this.low,\n this.high,\n divisor.low,\n divisor.high\n );\n return fromBits(low, wasm[\"get_high\"](), this.unsigned);\n }\n\n return this.sub(this.div(divisor).mul(divisor));\n};\n\n/**\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\n * @function\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Remainder\n */\nLongPrototype.mod = LongPrototype.modulo;\n\n/**\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\n * @function\n * @param {!Long|number|string} divisor Divisor\n * @returns {!Long} Remainder\n */\nLongPrototype.rem = LongPrototype.modulo;\n\n/**\n * Returns the bitwise NOT of this Long.\n * @this {!Long}\n * @returns {!Long}\n */\nLongPrototype.not = function not() {\n return fromBits(~this.low, ~this.high, this.unsigned);\n};\n\n/**\n * Returns count leading zeros of this Long.\n * @this {!Long}\n * @returns {!number}\n */\nLongPrototype.countLeadingZeros = function countLeadingZeros() {\n return this.high ? Math.clz32(this.high) : Math.clz32(this.low) + 32;\n};\n\n/**\n * Returns count leading zeros. This is an alias of {@link Long#countLeadingZeros}.\n * @function\n * @param {!Long}\n * @returns {!number}\n */\nLongPrototype.clz = LongPrototype.countLeadingZeros;\n\n/**\n * Returns count trailing zeros of this Long.\n * @this {!Long}\n * @returns {!number}\n */\nLongPrototype.countTrailingZeros = function countTrailingZeros() {\n return this.low ? ctz32(this.low) : ctz32(this.high) + 32;\n};\n\n/**\n * Returns count trailing zeros. This is an alias of {@link Long#countTrailingZeros}.\n * @function\n * @param {!Long}\n * @returns {!number}\n */\nLongPrototype.ctz = LongPrototype.countTrailingZeros;\n\n/**\n * Returns the bitwise AND of this Long and the specified.\n * @this {!Long}\n * @param {!Long|number|string} other Other Long\n * @returns {!Long}\n */\nLongPrototype.and = function and(other) {\n if (!isLong(other))\n other = fromValue(other);\n return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\n};\n\n/**\n * Returns the bitwise OR of this Long and the specified.\n * @this {!Long}\n * @param {!Long|number|string} other Other Long\n * @returns {!Long}\n */\nLongPrototype.or = function or(other) {\n if (!isLong(other))\n other = fromValue(other);\n return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\n};\n\n/**\n * Returns the bitwise XOR of this Long and the given one.\n * @this {!Long}\n * @param {!Long|number|string} other Other Long\n * @returns {!Long}\n */\nLongPrototype.xor = function xor(other) {\n if (!isLong(other))\n other = fromValue(other);\n return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\n};\n\n/**\n * Returns this Long with bits shifted to the left by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\n if (isLong(numBits))\n numBits = numBits.toInt();\n if ((numBits &= 63) === 0)\n return this;\n else if (numBits < 32)\n return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\n else\n return fromBits(0, this.low << (numBits - 32), this.unsigned);\n};\n\n/**\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shl = LongPrototype.shiftLeft;\n\n/**\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shiftRight = function shiftRight(numBits) {\n if (isLong(numBits))\n numBits = numBits.toInt();\n if ((numBits &= 63) === 0)\n return this;\n else if (numBits < 32)\n return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\n else\n return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\n};\n\n/**\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shr = LongPrototype.shiftRight;\n\n/**\n * Returns this Long with bits logically shifted to the right by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\n if (isLong(numBits)) numBits = numBits.toInt();\n if ((numBits &= 63) === 0) return this;\n if (numBits < 32) return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >>> numBits, this.unsigned);\n if (numBits === 32) return fromBits(this.high, 0, this.unsigned);\n return fromBits(this.high >>> (numBits - 32), 0, this.unsigned);\n};\n\n/**\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\n\n/**\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\n\n/**\n * Returns this Long with bits rotated to the left by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\nLongPrototype.rotateLeft = function rotateLeft(numBits) {\n var b;\n if (isLong(numBits)) numBits = numBits.toInt();\n if ((numBits &= 63) === 0) return this;\n if (numBits === 32) return fromBits(this.high, this.low, this.unsigned);\n if (numBits < 32) {\n b = (32 - numBits);\n return fromBits(((this.low << numBits) | (this.high >>> b)), ((this.high << numBits) | (this.low >>> b)), this.unsigned);\n }\n numBits -= 32;\n b = (32 - numBits);\n return fromBits(((this.high << numBits) | (this.low >>> b)), ((this.low << numBits) | (this.high >>> b)), this.unsigned);\n}\n/**\n * Returns this Long with bits rotated to the left by the given amount. This is an alias of {@link Long#rotateLeft}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\nLongPrototype.rotl = LongPrototype.rotateLeft;\n\n/**\n * Returns this Long with bits rotated to the right by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\nLongPrototype.rotateRight = function rotateRight(numBits) {\n var b;\n if (isLong(numBits)) numBits = numBits.toInt();\n if ((numBits &= 63) === 0) return this;\n if (numBits === 32) return fromBits(this.high, this.low, this.unsigned);\n if (numBits < 32) {\n b = (32 - numBits);\n return fromBits(((this.high << b) | (this.low >>> numBits)), ((this.low << b) | (this.high >>> numBits)), this.unsigned);\n }\n numBits -= 32;\n b = (32 - numBits);\n return fromBits(((this.low << b) | (this.high >>> numBits)), ((this.high << b) | (this.low >>> numBits)), this.unsigned);\n}\n/**\n * Returns this Long with bits rotated to the right by the given amount. This is an alias of {@link Long#rotateRight}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\nLongPrototype.rotr = LongPrototype.rotateRight;\n\n/**\n * Converts this Long to signed.\n * @this {!Long}\n * @returns {!Long} Signed long\n */\nLongPrototype.toSigned = function toSigned() {\n if (!this.unsigned)\n return this;\n return fromBits(this.low, this.high, false);\n};\n\n/**\n * Converts this Long to unsigned.\n * @this {!Long}\n * @returns {!Long} Unsigned long\n */\nLongPrototype.toUnsigned = function toUnsigned() {\n if (this.unsigned)\n return this;\n return fromBits(this.low, this.high, true);\n};\n\n/**\n * Converts this Long to its byte representation.\n * @param {boolean=} le Whether little or big endian, defaults to big endian\n * @this {!Long}\n * @returns {!Array.} Byte representation\n */\nLongPrototype.toBytes = function toBytes(le) {\n return le ? this.toBytesLE() : this.toBytesBE();\n};\n\n/**\n * Converts this Long to its little endian byte representation.\n * @this {!Long}\n * @returns {!Array.} Little endian byte representation\n */\nLongPrototype.toBytesLE = function toBytesLE() {\n var hi = this.high,\n lo = this.low;\n return [\n lo & 0xff,\n lo >>> 8 & 0xff,\n lo >>> 16 & 0xff,\n lo >>> 24,\n hi & 0xff,\n hi >>> 8 & 0xff,\n hi >>> 16 & 0xff,\n hi >>> 24\n ];\n};\n\n/**\n * Converts this Long to its big endian byte representation.\n * @this {!Long}\n * @returns {!Array.} Big endian byte representation\n */\nLongPrototype.toBytesBE = function toBytesBE() {\n var hi = this.high,\n lo = this.low;\n return [\n hi >>> 24,\n hi >>> 16 & 0xff,\n hi >>> 8 & 0xff,\n hi & 0xff,\n lo >>> 24,\n lo >>> 16 & 0xff,\n lo >>> 8 & 0xff,\n lo & 0xff\n ];\n};\n\n/**\n * Creates a Long from its byte representation.\n * @param {!Array.} bytes Byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @param {boolean=} le Whether little or big endian, defaults to big endian\n * @returns {Long} The corresponding Long value\n */\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\n return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\n};\n\n/**\n * Creates a Long from its little endian byte representation.\n * @param {!Array.} bytes Little endian byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {Long} The corresponding Long value\n */\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\n return new Long(\n bytes[0] |\n bytes[1] << 8 |\n bytes[2] << 16 |\n bytes[3] << 24,\n bytes[4] |\n bytes[5] << 8 |\n bytes[6] << 16 |\n bytes[7] << 24,\n unsigned\n );\n};\n\n/**\n * Creates a Long from its big endian byte representation.\n * @param {!Array.} bytes Big endian byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {Long} The corresponding Long value\n */\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\n return new Long(\n bytes[4] << 24 |\n bytes[5] << 16 |\n bytes[6] << 8 |\n bytes[7],\n bytes[0] << 24 |\n bytes[1] << 16 |\n bytes[2] << 8 |\n bytes[3],\n unsigned\n );\n};\n\nexport default Long;\n", "/// @file\n/// @addtogroup flatbuffers_javascript_api\n/// @{\n/// @cond FLATBUFFERS_INTERNAL\n\n/**\n * @fileoverview\n *\n * Need to suppress 'global this' error so the Node.js export line doesn't cause\n * closure compile to error out.\n * @suppress {globalThis}\n */\n\n/**\n * @const\n * @namespace\n */\nvar flatbuffers = {};\n\n/**\n * @typedef {number}\n */\nflatbuffers.Offset;\n\n/**\n * @typedef {{\n * bb: flatbuffers.ByteBuffer,\n * bb_pos: number\n * }}\n */\nflatbuffers.Table;\n\n/**\n * @type {number}\n * @const\n */\nflatbuffers.SIZEOF_SHORT = 2;\n\n/**\n * @type {number}\n * @const\n */\nflatbuffers.SIZEOF_INT = 4;\n\n/**\n * @type {number}\n * @const\n */\nflatbuffers.FILE_IDENTIFIER_LENGTH = 4;\n\n/**\n * @type {number}\n * @const\n */\nflatbuffers.SIZE_PREFIX_LENGTH = 4;\n\n/**\n * @enum {number}\n */\nflatbuffers.Encoding = {\n UTF8_BYTES: 1,\n UTF16_STRING: 2\n};\n\n/**\n * @type {Int32Array}\n * @const\n */\nflatbuffers.int32 = new Int32Array(2);\n\n/**\n * @type {Float32Array}\n * @const\n */\nflatbuffers.float32 = new Float32Array(flatbuffers.int32.buffer);\n\n/**\n * @type {Float64Array}\n * @const\n */\nflatbuffers.float64 = new Float64Array(flatbuffers.int32.buffer);\n\n/**\n * @type {boolean}\n * @const\n */\nflatbuffers.isLittleEndian = new Uint16Array(new Uint8Array([1, 0]).buffer)[0] === 1;\n\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * @constructor\n * @param {number} low\n * @param {number} high\n */\nflatbuffers.Long = function(low, high) {\n /**\n * @type {number}\n * @const\n */\n this.low = low | 0;\n\n /**\n * @type {number}\n * @const\n */\n this.high = high | 0;\n};\n\n/**\n * @param {number} low\n * @param {number} high\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.Long.create = function(low, high) {\n // Special-case zero to avoid GC overhead for default values\n return low == 0 && high == 0 ? flatbuffers.Long.ZERO : new flatbuffers.Long(low, high);\n};\n\n/**\n * @returns {number}\n */\nflatbuffers.Long.prototype.toFloat64 = function() {\n return (this.low >>> 0) + this.high * 0x100000000;\n};\n\n/**\n * @param {flatbuffers.Long} other\n * @returns {boolean}\n */\nflatbuffers.Long.prototype.equals = function(other) {\n return this.low == other.low && this.high == other.high;\n};\n\n/**\n * @type {!flatbuffers.Long}\n * @const\n */\nflatbuffers.Long.ZERO = new flatbuffers.Long(0, 0);\n\n/// @endcond\n////////////////////////////////////////////////////////////////////////////////\n/**\n * Create a FlatBufferBuilder.\n *\n * @constructor\n * @param {number=} opt_initial_size\n */\nflatbuffers.Builder = function(opt_initial_size) {\n if (!opt_initial_size) {\n var initial_size = 1024;\n } else {\n var initial_size = opt_initial_size;\n }\n\n /**\n * @type {flatbuffers.ByteBuffer}\n * @private\n */\n this.bb = flatbuffers.ByteBuffer.allocate(initial_size);\n\n /**\n * Remaining space in the ByteBuffer.\n *\n * @type {number}\n * @private\n */\n this.space = initial_size;\n\n /**\n * Minimum alignment encountered so far.\n *\n * @type {number}\n * @private\n */\n this.minalign = 1;\n\n /**\n * The vtable for the current table.\n *\n * @type {Array.}\n * @private\n */\n this.vtable = null;\n\n /**\n * The amount of fields we're actually using.\n *\n * @type {number}\n * @private\n */\n this.vtable_in_use = 0;\n\n /**\n * Whether we are currently serializing a table.\n *\n * @type {boolean}\n * @private\n */\n this.isNested = false;\n\n /**\n * Starting offset of the current struct/table.\n *\n * @type {number}\n * @private\n */\n this.object_start = 0;\n\n /**\n * List of offsets of all vtables.\n *\n * @type {Array.}\n * @private\n */\n this.vtables = [];\n\n /**\n * For the current vector being built.\n *\n * @type {number}\n * @private\n */\n this.vector_num_elems = 0;\n\n /**\n * False omits default values from the serialized data\n *\n * @type {boolean}\n * @private\n */\n this.force_defaults = false;\n};\n\nflatbuffers.Builder.prototype.clear = function() {\n this.bb.clear();\n this.space = this.bb.capacity();\n this.minalign = 1;\n this.vtable = null;\n this.vtable_in_use = 0;\n this.isNested = false;\n this.object_start = 0;\n this.vtables = [];\n this.vector_num_elems = 0;\n this.force_defaults = false;\n};\n\n/**\n * In order to save space, fields that are set to their default value\n * don't get serialized into the buffer. Forcing defaults provides a\n * way to manually disable this optimization.\n *\n * @param {boolean} forceDefaults true always serializes default values\n */\nflatbuffers.Builder.prototype.forceDefaults = function(forceDefaults) {\n this.force_defaults = forceDefaults;\n};\n\n/**\n * Get the ByteBuffer representing the FlatBuffer. Only call this after you've\n * called finish(). The actual data starts at the ByteBuffer's current position,\n * not necessarily at 0.\n *\n * @returns {flatbuffers.ByteBuffer}\n */\nflatbuffers.Builder.prototype.dataBuffer = function() {\n return this.bb;\n};\n\n/**\n * Get the bytes representing the FlatBuffer. Only call this after you've\n * called finish().\n *\n * @returns {!Uint8Array}\n */\nflatbuffers.Builder.prototype.asUint8Array = function() {\n return this.bb.bytes().subarray(this.bb.position(), this.bb.position() + this.offset());\n};\n\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * Prepare to write an element of `size` after `additional_bytes` have been\n * written, e.g. if you write a string, you need to align such the int length\n * field is aligned to 4 bytes, and the string data follows it directly. If all\n * you need to do is alignment, `additional_bytes` will be 0.\n *\n * @param {number} size This is the of the new element to write\n * @param {number} additional_bytes The padding size\n */\nflatbuffers.Builder.prototype.prep = function(size, additional_bytes) {\n // Track the biggest thing we've ever aligned to.\n if (size > this.minalign) {\n this.minalign = size;\n }\n\n // Find the amount of alignment needed such that `size` is properly\n // aligned after `additional_bytes`\n var align_size = ((~(this.bb.capacity() - this.space + additional_bytes)) + 1) & (size - 1);\n\n // Reallocate the buffer if needed.\n while (this.space < align_size + size + additional_bytes) {\n var old_buf_size = this.bb.capacity();\n this.bb = flatbuffers.Builder.growByteBuffer(this.bb);\n this.space += this.bb.capacity() - old_buf_size;\n }\n\n this.pad(align_size);\n};\n\n/**\n * @param {number} byte_size\n */\nflatbuffers.Builder.prototype.pad = function(byte_size) {\n for (var i = 0; i < byte_size; i++) {\n this.bb.writeInt8(--this.space, 0);\n }\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeInt8 = function(value) {\n this.bb.writeInt8(this.space -= 1, value);\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeInt16 = function(value) {\n this.bb.writeInt16(this.space -= 2, value);\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeInt32 = function(value) {\n this.bb.writeInt32(this.space -= 4, value);\n};\n\n/**\n * @param {flatbuffers.Long} value\n */\nflatbuffers.Builder.prototype.writeInt64 = function(value) {\n this.bb.writeInt64(this.space -= 8, value);\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeFloat32 = function(value) {\n this.bb.writeFloat32(this.space -= 4, value);\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeFloat64 = function(value) {\n this.bb.writeFloat64(this.space -= 8, value);\n};\n/// @endcond\n\n/**\n * Add an `int8` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `int8` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addInt8 = function(value) {\n this.prep(1, 0);\n this.writeInt8(value);\n};\n\n/**\n * Add an `int16` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `int16` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addInt16 = function(value) {\n this.prep(2, 0);\n this.writeInt16(value);\n};\n\n/**\n * Add an `int32` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `int32` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addInt32 = function(value) {\n this.prep(4, 0);\n this.writeInt32(value);\n};\n\n/**\n * Add an `int64` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {flatbuffers.Long} value The `int64` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addInt64 = function(value) {\n this.prep(8, 0);\n this.writeInt64(value);\n};\n\n/**\n * Add a `float32` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `float32` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addFloat32 = function(value) {\n this.prep(4, 0);\n this.writeFloat32(value);\n};\n\n/**\n * Add a `float64` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `float64` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addFloat64 = function(value) {\n this.prep(8, 0);\n this.writeFloat64(value);\n};\n\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldInt8 = function(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addInt8(value);\n this.slot(voffset);\n }\n};\n\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldInt16 = function(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addInt16(value);\n this.slot(voffset);\n }\n};\n\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldInt32 = function(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addInt32(value);\n this.slot(voffset);\n }\n};\n\n/**\n * @param {number} voffset\n * @param {flatbuffers.Long} value\n * @param {flatbuffers.Long} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldInt64 = function(voffset, value, defaultValue) {\n if (this.force_defaults || !value.equals(defaultValue)) {\n this.addInt64(value);\n this.slot(voffset);\n }\n};\n\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldFloat32 = function(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addFloat32(value);\n this.slot(voffset);\n }\n};\n\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldFloat64 = function(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addFloat64(value);\n this.slot(voffset);\n }\n};\n\n/**\n * @param {number} voffset\n * @param {flatbuffers.Offset} value\n * @param {flatbuffers.Offset} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldOffset = function(voffset, value, defaultValue) {\n if (this.force_defaults || value != defaultValue) {\n this.addOffset(value);\n this.slot(voffset);\n }\n};\n\n/**\n * Structs are stored inline, so nothing additional is being added. `d` is always 0.\n *\n * @param {number} voffset\n * @param {flatbuffers.Offset} value\n * @param {flatbuffers.Offset} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldStruct = function(voffset, value, defaultValue) {\n if (value != defaultValue) {\n this.nested(value);\n this.slot(voffset);\n }\n};\n\n/**\n * Structures are always stored inline, they need to be created right\n * where they're used. You'll get this assertion failure if you\n * created it elsewhere.\n *\n * @param {flatbuffers.Offset} obj The offset of the created object\n */\nflatbuffers.Builder.prototype.nested = function(obj) {\n if (obj != this.offset()) {\n throw new Error('FlatBuffers: struct must be serialized inline.');\n }\n};\n\n/**\n * Should not be creating any other object, string or vector\n * while an object is being constructed\n */\nflatbuffers.Builder.prototype.notNested = function() {\n if (this.isNested) {\n throw new Error('FlatBuffers: object serialization must not be nested.');\n }\n};\n\n/**\n * Set the current vtable at `voffset` to the current location in the buffer.\n *\n * @param {number} voffset\n */\nflatbuffers.Builder.prototype.slot = function(voffset) {\n this.vtable[voffset] = this.offset();\n};\n\n/**\n * @returns {flatbuffers.Offset} Offset relative to the end of the buffer.\n */\nflatbuffers.Builder.prototype.offset = function() {\n return this.bb.capacity() - this.space;\n};\n\n/**\n * Doubles the size of the backing ByteBuffer and copies the old data towards\n * the end of the new buffer (since we build the buffer backwards).\n *\n * @param {flatbuffers.ByteBuffer} bb The current buffer with the existing data\n * @returns {!flatbuffers.ByteBuffer} A new byte buffer with the old data copied\n * to it. The data is located at the end of the buffer.\n *\n * uint8Array.set() formally takes {Array|ArrayBufferView}, so to pass\n * it a uint8Array we need to suppress the type check:\n * @suppress {checkTypes}\n */\nflatbuffers.Builder.growByteBuffer = function(bb) {\n var old_buf_size = bb.capacity();\n\n // Ensure we don't grow beyond what fits in an int.\n if (old_buf_size & 0xC0000000) {\n throw new Error('FlatBuffers: cannot grow buffer beyond 2 gigabytes.');\n }\n\n var new_buf_size = old_buf_size << 1;\n var nbb = flatbuffers.ByteBuffer.allocate(new_buf_size);\n nbb.setPosition(new_buf_size - old_buf_size);\n nbb.bytes().set(bb.bytes(), new_buf_size - old_buf_size);\n return nbb;\n};\n/// @endcond\n\n/**\n * Adds on offset, relative to where it will be written.\n *\n * @param {flatbuffers.Offset} offset The offset to add.\n */\nflatbuffers.Builder.prototype.addOffset = function(offset) {\n this.prep(flatbuffers.SIZEOF_INT, 0); // Ensure alignment is already done.\n this.writeInt32(this.offset() - offset + flatbuffers.SIZEOF_INT);\n};\n\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * Start encoding a new object in the buffer. Users will not usually need to\n * call this directly. The FlatBuffers compiler will generate helper methods\n * that call this method internally.\n *\n * @param {number} numfields\n */\nflatbuffers.Builder.prototype.startObject = function(numfields) {\n this.notNested();\n if (this.vtable == null) {\n this.vtable = [];\n }\n this.vtable_in_use = numfields;\n for (var i = 0; i < numfields; i++) {\n this.vtable[i] = 0; // This will push additional elements as needed\n }\n this.isNested = true;\n this.object_start = this.offset();\n};\n\n/**\n * Finish off writing the object that is under construction.\n *\n * @returns {flatbuffers.Offset} The offset to the object inside `dataBuffer`\n */\nflatbuffers.Builder.prototype.endObject = function() {\n if (this.vtable == null || !this.isNested) {\n throw new Error('FlatBuffers: endObject called without startObject');\n }\n\n this.addInt32(0);\n var vtableloc = this.offset();\n\n // Trim trailing zeroes.\n var i = this.vtable_in_use - 1;\n for (; i >= 0 && this.vtable[i] == 0; i--) {}\n var trimmed_size = i + 1;\n\n // Write out the current vtable.\n for (; i >= 0; i--) {\n // Offset relative to the start of the table.\n this.addInt16(this.vtable[i] != 0 ? vtableloc - this.vtable[i] : 0);\n }\n\n var standard_fields = 2; // The fields below:\n this.addInt16(vtableloc - this.object_start);\n var len = (trimmed_size + standard_fields) * flatbuffers.SIZEOF_SHORT;\n this.addInt16(len);\n\n // Search for an existing vtable that matches the current one.\n var existing_vtable = 0;\n var vt1 = this.space;\nouter_loop:\n for (i = 0; i < this.vtables.length; i++) {\n var vt2 = this.bb.capacity() - this.vtables[i];\n if (len == this.bb.readInt16(vt2)) {\n for (var j = flatbuffers.SIZEOF_SHORT; j < len; j += flatbuffers.SIZEOF_SHORT) {\n if (this.bb.readInt16(vt1 + j) != this.bb.readInt16(vt2 + j)) {\n continue outer_loop;\n }\n }\n existing_vtable = this.vtables[i];\n break;\n }\n }\n\n if (existing_vtable) {\n // Found a match:\n // Remove the current vtable.\n this.space = this.bb.capacity() - vtableloc;\n\n // Point table to existing vtable.\n this.bb.writeInt32(this.space, existing_vtable - vtableloc);\n } else {\n // No match:\n // Add the location of the current vtable to the list of vtables.\n this.vtables.push(this.offset());\n\n // Point table to current vtable.\n this.bb.writeInt32(this.bb.capacity() - vtableloc, this.offset() - vtableloc);\n }\n\n this.isNested = false;\n return vtableloc;\n};\n/// @endcond\n\n/**\n * Finalize a buffer, poiting to the given `root_table`.\n *\n * @param {flatbuffers.Offset} root_table\n * @param {string=} opt_file_identifier\n * @param {boolean=} opt_size_prefix\n */\nflatbuffers.Builder.prototype.finish = function(root_table, opt_file_identifier, opt_size_prefix) {\n var size_prefix = opt_size_prefix ? flatbuffers.SIZE_PREFIX_LENGTH : 0;\n if (opt_file_identifier) {\n var file_identifier = opt_file_identifier;\n this.prep(this.minalign, flatbuffers.SIZEOF_INT +\n flatbuffers.FILE_IDENTIFIER_LENGTH + size_prefix);\n if (file_identifier.length != flatbuffers.FILE_IDENTIFIER_LENGTH) {\n throw new Error('FlatBuffers: file identifier must be length ' +\n flatbuffers.FILE_IDENTIFIER_LENGTH);\n }\n for (var i = flatbuffers.FILE_IDENTIFIER_LENGTH - 1; i >= 0; i--) {\n this.writeInt8(file_identifier.charCodeAt(i));\n }\n }\n this.prep(this.minalign, flatbuffers.SIZEOF_INT + size_prefix);\n this.addOffset(root_table);\n if (size_prefix) {\n this.addInt32(this.bb.capacity() - this.space);\n }\n this.bb.setPosition(this.space);\n};\n\n/**\n * Finalize a size prefixed buffer, pointing to the given `root_table`.\n *\n * @param {flatbuffers.Offset} root_table\n * @param {string=} opt_file_identifier\n */\nflatbuffers.Builder.prototype.finishSizePrefixed = function (root_table, opt_file_identifier) {\n this.finish(root_table, opt_file_identifier, true);\n};\n\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * This checks a required field has been set in a given table that has\n * just been constructed.\n *\n * @param {flatbuffers.Offset} table\n * @param {number} field\n */\nflatbuffers.Builder.prototype.requiredField = function(table, field) {\n var table_start = this.bb.capacity() - table;\n var vtable_start = table_start - this.bb.readInt32(table_start);\n var ok = this.bb.readInt16(vtable_start + field) != 0;\n\n // If this fails, the caller will show what field needs to be set.\n if (!ok) {\n throw new Error('FlatBuffers: field ' + field + ' must be set');\n }\n};\n\n/**\n * Start a new array/vector of objects. Users usually will not call\n * this directly. The FlatBuffers compiler will create a start/end\n * method for vector types in generated code.\n *\n * @param {number} elem_size The size of each element in the array\n * @param {number} num_elems The number of elements in the array\n * @param {number} alignment The alignment of the array\n */\nflatbuffers.Builder.prototype.startVector = function(elem_size, num_elems, alignment) {\n this.notNested();\n this.vector_num_elems = num_elems;\n this.prep(flatbuffers.SIZEOF_INT, elem_size * num_elems);\n this.prep(alignment, elem_size * num_elems); // Just in case alignment > int.\n};\n\n/**\n * Finish off the creation of an array and all its elements. The array must be\n * created with `startVector`.\n *\n * @returns {flatbuffers.Offset} The offset at which the newly created array\n * starts.\n */\nflatbuffers.Builder.prototype.endVector = function() {\n this.writeInt32(this.vector_num_elems);\n return this.offset();\n};\n/// @endcond\n\n/**\n * Encode the string `s` in the buffer using UTF-8. If a Uint8Array is passed\n * instead of a string, it is assumed to contain valid UTF-8 encoded data.\n *\n * @param {string|Uint8Array} s The string to encode\n * @return {flatbuffers.Offset} The offset in the buffer where the encoded string starts\n */\nflatbuffers.Builder.prototype.createString = function(s) {\n if (s instanceof Uint8Array) {\n var utf8 = s;\n } else {\n var utf8 = [];\n var i = 0;\n\n while (i < s.length) {\n var codePoint;\n\n // Decode UTF-16\n var a = s.charCodeAt(i++);\n if (a < 0xD800 || a >= 0xDC00) {\n codePoint = a;\n } else {\n var b = s.charCodeAt(i++);\n codePoint = (a << 10) + b + (0x10000 - (0xD800 << 10) - 0xDC00);\n }\n\n // Encode UTF-8\n if (codePoint < 0x80) {\n utf8.push(codePoint);\n } else {\n if (codePoint < 0x800) {\n utf8.push(((codePoint >> 6) & 0x1F) | 0xC0);\n } else {\n if (codePoint < 0x10000) {\n utf8.push(((codePoint >> 12) & 0x0F) | 0xE0);\n } else {\n utf8.push(\n ((codePoint >> 18) & 0x07) | 0xF0,\n ((codePoint >> 12) & 0x3F) | 0x80);\n }\n utf8.push(((codePoint >> 6) & 0x3F) | 0x80);\n }\n utf8.push((codePoint & 0x3F) | 0x80);\n }\n }\n }\n\n this.addInt8(0);\n this.startVector(1, utf8.length, 1);\n this.bb.setPosition(this.space -= utf8.length);\n for (var i = 0, offset = this.space, bytes = this.bb.bytes(); i < utf8.length; i++) {\n bytes[offset++] = utf8[i];\n }\n return this.endVector();\n};\n\n/**\n * A helper function to avoid generated code depending on this file directly.\n *\n * @param {number} low\n * @param {number} high\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.Builder.prototype.createLong = function(low, high) {\n return flatbuffers.Long.create(low, high);\n};\n////////////////////////////////////////////////////////////////////////////////\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * Create a new ByteBuffer with a given array of bytes (`Uint8Array`).\n *\n * @constructor\n * @param {Uint8Array} bytes\n */\nflatbuffers.ByteBuffer = function(bytes) {\n /**\n * @type {Uint8Array}\n * @private\n */\n this.bytes_ = bytes;\n\n /**\n * @type {number}\n * @private\n */\n this.position_ = 0;\n};\n\n/**\n * Create and allocate a new ByteBuffer with a given size.\n *\n * @param {number} byte_size\n * @returns {!flatbuffers.ByteBuffer}\n */\nflatbuffers.ByteBuffer.allocate = function(byte_size) {\n return new flatbuffers.ByteBuffer(new Uint8Array(byte_size));\n};\n\nflatbuffers.ByteBuffer.prototype.clear = function() {\n this.position_ = 0;\n};\n\n/**\n * Get the underlying `Uint8Array`.\n *\n * @returns {Uint8Array}\n */\nflatbuffers.ByteBuffer.prototype.bytes = function() {\n return this.bytes_;\n};\n\n/**\n * Get the buffer's position.\n *\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.position = function() {\n return this.position_;\n};\n\n/**\n * Set the buffer's position.\n *\n * @param {number} position\n */\nflatbuffers.ByteBuffer.prototype.setPosition = function(position) {\n this.position_ = position;\n};\n\n/**\n * Get the buffer's capacity.\n *\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.capacity = function() {\n return this.bytes_.length;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readInt8 = function(offset) {\n return this.readUint8(offset) << 24 >> 24;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readUint8 = function(offset) {\n return this.bytes_[offset];\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readInt16 = function(offset) {\n return this.readUint16(offset) << 16 >> 16;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readUint16 = function(offset) {\n return this.bytes_[offset] | this.bytes_[offset + 1] << 8;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readInt32 = function(offset) {\n return this.bytes_[offset] | this.bytes_[offset + 1] << 8 | this.bytes_[offset + 2] << 16 | this.bytes_[offset + 3] << 24;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readUint32 = function(offset) {\n return this.readInt32(offset) >>> 0;\n};\n\n/**\n * @param {number} offset\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.ByteBuffer.prototype.readInt64 = function(offset) {\n return new flatbuffers.Long(this.readInt32(offset), this.readInt32(offset + 4));\n};\n\n/**\n * @param {number} offset\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.ByteBuffer.prototype.readUint64 = function(offset) {\n return new flatbuffers.Long(this.readUint32(offset), this.readUint32(offset + 4));\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readFloat32 = function(offset) {\n flatbuffers.int32[0] = this.readInt32(offset);\n return flatbuffers.float32[0];\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readFloat64 = function(offset) {\n flatbuffers.int32[flatbuffers.isLittleEndian ? 0 : 1] = this.readInt32(offset);\n flatbuffers.int32[flatbuffers.isLittleEndian ? 1 : 0] = this.readInt32(offset + 4);\n return flatbuffers.float64[0];\n};\n\n/**\n * @param {number} offset\n * @param {number|boolean} value\n */\nflatbuffers.ByteBuffer.prototype.writeInt8 = function(offset, value) {\n this.bytes_[offset] = /** @type {number} */(value);\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeUint8 = function(offset, value) {\n this.bytes_[offset] = value;\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeInt16 = function(offset, value) {\n this.bytes_[offset] = value;\n this.bytes_[offset + 1] = value >> 8;\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeUint16 = function(offset, value) {\n this.bytes_[offset] = value;\n this.bytes_[offset + 1] = value >> 8;\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeInt32 = function(offset, value) {\n this.bytes_[offset] = value;\n this.bytes_[offset + 1] = value >> 8;\n this.bytes_[offset + 2] = value >> 16;\n this.bytes_[offset + 3] = value >> 24;\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeUint32 = function(offset, value) {\n this.bytes_[offset] = value;\n this.bytes_[offset + 1] = value >> 8;\n this.bytes_[offset + 2] = value >> 16;\n this.bytes_[offset + 3] = value >> 24;\n};\n\n/**\n * @param {number} offset\n * @param {flatbuffers.Long} value\n */\nflatbuffers.ByteBuffer.prototype.writeInt64 = function(offset, value) {\n this.writeInt32(offset, value.low);\n this.writeInt32(offset + 4, value.high);\n};\n\n/**\n * @param {number} offset\n * @param {flatbuffers.Long} value\n */\nflatbuffers.ByteBuffer.prototype.writeUint64 = function(offset, value) {\n this.writeUint32(offset, value.low);\n this.writeUint32(offset + 4, value.high);\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeFloat32 = function(offset, value) {\n flatbuffers.float32[0] = value;\n this.writeInt32(offset, flatbuffers.int32[0]);\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeFloat64 = function(offset, value) {\n flatbuffers.float64[0] = value;\n this.writeInt32(offset, flatbuffers.int32[flatbuffers.isLittleEndian ? 0 : 1]);\n this.writeInt32(offset + 4, flatbuffers.int32[flatbuffers.isLittleEndian ? 1 : 0]);\n};\n\n/**\n * Return the file identifier. Behavior is undefined for FlatBuffers whose\n * schema does not include a file_identifier (likely points at padding or the\n * start of a the root vtable).\n * @returns {string}\n */\nflatbuffers.ByteBuffer.prototype.getBufferIdentifier = function() {\n if (this.bytes_.length < this.position_ + flatbuffers.SIZEOF_INT +\n flatbuffers.FILE_IDENTIFIER_LENGTH) {\n throw new Error(\n 'FlatBuffers: ByteBuffer is too short to contain an identifier.');\n }\n var result = \"\";\n for (var i = 0; i < flatbuffers.FILE_IDENTIFIER_LENGTH; i++) {\n result += String.fromCharCode(\n this.readInt8(this.position_ + flatbuffers.SIZEOF_INT + i));\n }\n return result;\n};\n\n/**\n * Look up a field in the vtable, return an offset into the object, or 0 if the\n * field is not present.\n *\n * @param {number} bb_pos\n * @param {number} vtable_offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.__offset = function(bb_pos, vtable_offset) {\n var vtable = bb_pos - this.readInt32(bb_pos);\n return vtable_offset < this.readInt16(vtable) ? this.readInt16(vtable + vtable_offset) : 0;\n};\n\n/**\n * Initialize any Table-derived type to point to the union at the given offset.\n *\n * @param {flatbuffers.Table} t\n * @param {number} offset\n * @returns {flatbuffers.Table}\n */\nflatbuffers.ByteBuffer.prototype.__union = function(t, offset) {\n t.bb_pos = offset + this.readInt32(offset);\n t.bb = this;\n return t;\n};\n\n/**\n * Create a JavaScript string from UTF-8 data stored inside the FlatBuffer.\n * This allocates a new string and converts to wide chars upon each access.\n *\n * To avoid the conversion to UTF-16, pass flatbuffers.Encoding.UTF8_BYTES as\n * the \"optionalEncoding\" argument. This is useful for avoiding conversion to\n * and from UTF-16 when the data will just be packaged back up in another\n * FlatBuffer later on.\n *\n * @param {number} offset\n * @param {flatbuffers.Encoding=} opt_encoding Defaults to UTF16_STRING\n * @returns {string|!Uint8Array}\n */\nflatbuffers.ByteBuffer.prototype.__string = function(offset, opt_encoding) {\n offset += this.readInt32(offset);\n\n var length = this.readInt32(offset);\n var result = '';\n var i = 0;\n\n offset += flatbuffers.SIZEOF_INT;\n\n if (opt_encoding === flatbuffers.Encoding.UTF8_BYTES) {\n return this.bytes_.subarray(offset, offset + length);\n }\n\n while (i < length) {\n var codePoint;\n\n // Decode UTF-8\n var a = this.readUint8(offset + i++);\n if (a < 0xC0) {\n codePoint = a;\n } else {\n var b = this.readUint8(offset + i++);\n if (a < 0xE0) {\n codePoint =\n ((a & 0x1F) << 6) |\n (b & 0x3F);\n } else {\n var c = this.readUint8(offset + i++);\n if (a < 0xF0) {\n codePoint =\n ((a & 0x0F) << 12) |\n ((b & 0x3F) << 6) |\n (c & 0x3F);\n } else {\n var d = this.readUint8(offset + i++);\n codePoint =\n ((a & 0x07) << 18) |\n ((b & 0x3F) << 12) |\n ((c & 0x3F) << 6) |\n (d & 0x3F);\n }\n }\n }\n\n // Encode UTF-16\n if (codePoint < 0x10000) {\n result += String.fromCharCode(codePoint);\n } else {\n codePoint -= 0x10000;\n result += String.fromCharCode(\n (codePoint >> 10) + 0xD800,\n (codePoint & ((1 << 10) - 1)) + 0xDC00);\n }\n }\n\n return result;\n};\n\n/**\n * Retrieve the relative offset stored at \"offset\"\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.__indirect = function(offset) {\n return offset + this.readInt32(offset);\n};\n\n/**\n * Get the start of data of a vector whose offset is stored at \"offset\" in this object.\n *\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.__vector = function(offset) {\n return offset + this.readInt32(offset) + flatbuffers.SIZEOF_INT; // data starts after the length\n};\n\n/**\n * Get the length of a vector whose offset is stored at \"offset\" in this object.\n *\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.__vector_len = function(offset) {\n return this.readInt32(offset + this.readInt32(offset));\n};\n\n/**\n * @param {string} ident\n * @returns {boolean}\n */\nflatbuffers.ByteBuffer.prototype.__has_identifier = function(ident) {\n if (ident.length != flatbuffers.FILE_IDENTIFIER_LENGTH) {\n throw new Error('FlatBuffers: file identifier must be length ' +\n flatbuffers.FILE_IDENTIFIER_LENGTH);\n }\n for (var i = 0; i < flatbuffers.FILE_IDENTIFIER_LENGTH; i++) {\n if (ident.charCodeAt(i) != this.readInt8(this.position_ + flatbuffers.SIZEOF_INT + i)) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * A helper function to avoid generated code depending on this file directly.\n *\n * @param {number} low\n * @param {number} high\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.ByteBuffer.prototype.createLong = function(low, high) {\n return flatbuffers.Long.create(low, high);\n};\n\n// Exports for Node.js and RequireJS\nexport { flatbuffers };\n\n/// @endcond\n/// @}\n", "// automatically generated by the FlatBuffers compiler, do not modify\n/* eslint-disable */\n\nimport {flatbuffers} from 'flatbuffers';\n\n/**\n * @enum {number}\n */\nexport namespace onnxruntime.experimental.fbs {\n export enum AttributeType {\n UNDEFINED = 0,\n FLOAT = 1,\n INT = 2,\n STRING = 3,\n TENSOR = 4,\n GRAPH = 5,\n FLOATS = 6,\n INTS = 7,\n STRINGS = 8,\n TENSORS = 9,\n GRAPHS = 10,\n SPARSE_TENSOR = 11,\n SPARSE_TENSORS = 12\n }\n}\n\n/**\n * @enum {number}\n */\nexport namespace onnxruntime.experimental.fbs {\n export enum DimensionValueType {UNKNOWN = 0, VALUE = 1, PARAM = 2}\n}\n\n/**\n * @enum {number}\n */\nexport namespace onnxruntime.experimental.fbs {\n export enum TensorDataType {\n UNDEFINED = 0,\n FLOAT = 1,\n UINT8 = 2,\n INT8 = 3,\n UINT16 = 4,\n INT16 = 5,\n INT32 = 6,\n INT64 = 7,\n STRING = 8,\n BOOL = 9,\n FLOAT16 = 10,\n DOUBLE = 11,\n UINT32 = 12,\n UINT64 = 13,\n COMPLEX64 = 14,\n COMPLEX128 = 15,\n BFLOAT16 = 16,\n FLOAT8E4M3FN = 17,\n FLOAT8E4M3FNUZ = 18,\n FLOAT8E5M2 = 19,\n FLOAT8E5M2FNUZ = 20,\n }\n}\n\n/**\n * @enum {number}\n */\nexport namespace onnxruntime.experimental.fbs {\n export enum NodeType {Primitive = 0, Fused = 1}\n}\n\n/**\n * @enum {number}\n */\nexport namespace onnxruntime.experimental.fbs {\n export enum TypeInfoValue {NONE = 0, tensor_type = 1, sequence_type = 2, map_type = 3}\n}\n\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class Shape {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns Shape\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): Shape {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Shape= obj\n * @returns Shape\n */\n static getRootAsShape(bb: flatbuffers.ByteBuffer, obj?: Shape): Shape {\n return (obj || new Shape()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Shape= obj\n * @returns Shape\n */\n static getSizePrefixedRootAsShape(bb: flatbuffers.ByteBuffer, obj?: Shape): Shape {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Shape()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.Dimension= obj\n * @returns onnxruntime.experimental.fbs.Dimension\n */\n dim(index: number, obj?: onnxruntime.experimental.fbs.Dimension): onnxruntime.experimental.fbs.Dimension|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? (obj || new onnxruntime.experimental.fbs.Dimension())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n dimLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startShape(builder: flatbuffers.Builder) {\n builder.startObject(1);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset dimOffset\n */\n static addDim(builder: flatbuffers.Builder, dimOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, dimOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createDimVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startDimVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endShape(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createShape(builder: flatbuffers.Builder, dimOffset: flatbuffers.Offset): flatbuffers.Offset {\n Shape.startShape(builder);\n Shape.addDim(builder, dimOffset);\n return Shape.endShape(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class Dimension {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns Dimension\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): Dimension {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Dimension= obj\n * @returns Dimension\n */\n static getRootAsDimension(bb: flatbuffers.ByteBuffer, obj?: Dimension): Dimension {\n return (obj || new Dimension()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Dimension= obj\n * @returns Dimension\n */\n static getSizePrefixedRootAsDimension(bb: flatbuffers.ByteBuffer, obj?: Dimension): Dimension {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Dimension()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param onnxruntime.experimental.fbs.DimensionValue= obj\n * @returns onnxruntime.experimental.fbs.DimensionValue|null\n */\n value(obj?: onnxruntime.experimental.fbs.DimensionValue): onnxruntime.experimental.fbs.DimensionValue|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? (obj || new onnxruntime.experimental.fbs.DimensionValue())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n denotation(): string|null;\n denotation(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n denotation(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startDimension(builder: flatbuffers.Builder) {\n builder.startObject(2);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset valueOffset\n */\n static addValue(builder: flatbuffers.Builder, valueOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, valueOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset denotationOffset\n */\n static addDenotation(builder: flatbuffers.Builder, denotationOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, denotationOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endDimension(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createDimension(\n builder: flatbuffers.Builder, valueOffset: flatbuffers.Offset,\n denotationOffset: flatbuffers.Offset): flatbuffers.Offset {\n Dimension.startDimension(builder);\n Dimension.addValue(builder, valueOffset);\n Dimension.addDenotation(builder, denotationOffset);\n return Dimension.endDimension(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class DimensionValue {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns DimensionValue\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): DimensionValue {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param DimensionValue= obj\n * @returns DimensionValue\n */\n static getRootAsDimensionValue(bb: flatbuffers.ByteBuffer, obj?: DimensionValue): DimensionValue {\n return (obj || new DimensionValue()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param DimensionValue= obj\n * @returns DimensionValue\n */\n static getSizePrefixedRootAsDimensionValue(bb: flatbuffers.ByteBuffer, obj?: DimensionValue): DimensionValue {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new DimensionValue()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @returns onnxruntime.experimental.fbs.DimensionValueType\n */\n dimType(): onnxruntime.experimental.fbs.DimensionValueType {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? /** */ (this.bb!.readInt8(this.bb_pos + offset)) :\n onnxruntime.experimental.fbs.DimensionValueType.UNKNOWN;\n }\n\n /**\n * @returns flatbuffers.Long\n */\n dimValue(): flatbuffers.Long {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(0, 0);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n dimParam(): string|null;\n dimParam(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n dimParam(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startDimensionValue(builder: flatbuffers.Builder) {\n builder.startObject(3);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param onnxruntime.experimental.fbs.DimensionValueType dimType\n */\n static addDimType(builder: flatbuffers.Builder, dimType: onnxruntime.experimental.fbs.DimensionValueType) {\n builder.addFieldInt8(0, dimType, onnxruntime.experimental.fbs.DimensionValueType.UNKNOWN);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Long dimValue\n */\n static addDimValue(builder: flatbuffers.Builder, dimValue: flatbuffers.Long) {\n builder.addFieldInt64(1, dimValue, builder.createLong(0, 0));\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset dimParamOffset\n */\n static addDimParam(builder: flatbuffers.Builder, dimParamOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, dimParamOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endDimensionValue(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createDimensionValue(\n builder: flatbuffers.Builder, dimType: onnxruntime.experimental.fbs.DimensionValueType,\n dimValue: flatbuffers.Long, dimParamOffset: flatbuffers.Offset): flatbuffers.Offset {\n DimensionValue.startDimensionValue(builder);\n DimensionValue.addDimType(builder, dimType);\n DimensionValue.addDimValue(builder, dimValue);\n DimensionValue.addDimParam(builder, dimParamOffset);\n return DimensionValue.endDimensionValue(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class TensorTypeAndShape {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns TensorTypeAndShape\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): TensorTypeAndShape {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param TensorTypeAndShape= obj\n * @returns TensorTypeAndShape\n */\n static getRootAsTensorTypeAndShape(bb: flatbuffers.ByteBuffer, obj?: TensorTypeAndShape): TensorTypeAndShape {\n return (obj || new TensorTypeAndShape()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param TensorTypeAndShape= obj\n * @returns TensorTypeAndShape\n */\n static getSizePrefixedRootAsTensorTypeAndShape(bb: flatbuffers.ByteBuffer, obj?: TensorTypeAndShape):\n TensorTypeAndShape {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new TensorTypeAndShape()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @returns onnxruntime.experimental.fbs.TensorDataType\n */\n elemType(): onnxruntime.experimental.fbs.TensorDataType {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? /** */ (this.bb!.readInt32(this.bb_pos + offset)) :\n onnxruntime.experimental.fbs.TensorDataType.UNDEFINED;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.Shape= obj\n * @returns onnxruntime.experimental.fbs.Shape|null\n */\n shape(obj?: onnxruntime.experimental.fbs.Shape): onnxruntime.experimental.fbs.Shape|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.Shape())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startTensorTypeAndShape(builder: flatbuffers.Builder) {\n builder.startObject(2);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param onnxruntime.experimental.fbs.TensorDataType elemType\n */\n static addElemType(builder: flatbuffers.Builder, elemType: onnxruntime.experimental.fbs.TensorDataType) {\n builder.addFieldInt32(0, elemType, onnxruntime.experimental.fbs.TensorDataType.UNDEFINED);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset shapeOffset\n */\n static addShape(builder: flatbuffers.Builder, shapeOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, shapeOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endTensorTypeAndShape(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createTensorTypeAndShape(\n builder: flatbuffers.Builder, elemType: onnxruntime.experimental.fbs.TensorDataType,\n shapeOffset: flatbuffers.Offset): flatbuffers.Offset {\n TensorTypeAndShape.startTensorTypeAndShape(builder);\n TensorTypeAndShape.addElemType(builder, elemType);\n TensorTypeAndShape.addShape(builder, shapeOffset);\n return TensorTypeAndShape.endTensorTypeAndShape(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class MapType {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns MapType\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): MapType {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param MapType= obj\n * @returns MapType\n */\n static getRootAsMapType(bb: flatbuffers.ByteBuffer, obj?: MapType): MapType {\n return (obj || new MapType()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param MapType= obj\n * @returns MapType\n */\n static getSizePrefixedRootAsMapType(bb: flatbuffers.ByteBuffer, obj?: MapType): MapType {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new MapType()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @returns onnxruntime.experimental.fbs.TensorDataType\n */\n keyType(): onnxruntime.experimental.fbs.TensorDataType {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? /** */ (this.bb!.readInt32(this.bb_pos + offset)) :\n onnxruntime.experimental.fbs.TensorDataType.UNDEFINED;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.TypeInfo= obj\n * @returns onnxruntime.experimental.fbs.TypeInfo|null\n */\n valueType(obj?: onnxruntime.experimental.fbs.TypeInfo): onnxruntime.experimental.fbs.TypeInfo|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.TypeInfo())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startMapType(builder: flatbuffers.Builder) {\n builder.startObject(2);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param onnxruntime.experimental.fbs.TensorDataType keyType\n */\n static addKeyType(builder: flatbuffers.Builder, keyType: onnxruntime.experimental.fbs.TensorDataType) {\n builder.addFieldInt32(0, keyType, onnxruntime.experimental.fbs.TensorDataType.UNDEFINED);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset valueTypeOffset\n */\n static addValueType(builder: flatbuffers.Builder, valueTypeOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, valueTypeOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endMapType(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createMapType(\n builder: flatbuffers.Builder, keyType: onnxruntime.experimental.fbs.TensorDataType,\n valueTypeOffset: flatbuffers.Offset): flatbuffers.Offset {\n MapType.startMapType(builder);\n MapType.addKeyType(builder, keyType);\n MapType.addValueType(builder, valueTypeOffset);\n return MapType.endMapType(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class SequenceType {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns SequenceType\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): SequenceType {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param SequenceType= obj\n * @returns SequenceType\n */\n static getRootAsSequenceType(bb: flatbuffers.ByteBuffer, obj?: SequenceType): SequenceType {\n return (obj || new SequenceType()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param SequenceType= obj\n * @returns SequenceType\n */\n static getSizePrefixedRootAsSequenceType(bb: flatbuffers.ByteBuffer, obj?: SequenceType): SequenceType {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new SequenceType()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param onnxruntime.experimental.fbs.TypeInfo= obj\n * @returns onnxruntime.experimental.fbs.TypeInfo|null\n */\n elemType(obj?: onnxruntime.experimental.fbs.TypeInfo): onnxruntime.experimental.fbs.TypeInfo|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? (obj || new onnxruntime.experimental.fbs.TypeInfo())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startSequenceType(builder: flatbuffers.Builder) {\n builder.startObject(1);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset elemTypeOffset\n */\n static addElemType(builder: flatbuffers.Builder, elemTypeOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, elemTypeOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endSequenceType(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createSequenceType(builder: flatbuffers.Builder, elemTypeOffset: flatbuffers.Offset): flatbuffers.Offset {\n SequenceType.startSequenceType(builder);\n SequenceType.addElemType(builder, elemTypeOffset);\n return SequenceType.endSequenceType(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class EdgeEnd {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns EdgeEnd\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): EdgeEnd {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @returns number\n */\n nodeIndex(): number {\n return this.bb!.readUint32(this.bb_pos);\n }\n\n /**\n * @returns number\n */\n srcArgIndex(): number {\n return this.bb!.readInt32(this.bb_pos + 4);\n }\n\n /**\n * @returns number\n */\n dstArgIndex(): number {\n return this.bb!.readInt32(this.bb_pos + 8);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number node_index\n * @param number src_arg_index\n * @param number dst_arg_index\n * @returns flatbuffers.Offset\n */\n static createEdgeEnd(\n builder: flatbuffers.Builder, node_index: number, src_arg_index: number,\n dst_arg_index: number): flatbuffers.Offset {\n builder.prep(4, 12);\n builder.writeInt32(dst_arg_index);\n builder.writeInt32(src_arg_index);\n builder.writeInt32(node_index);\n return builder.offset();\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class NodeEdge {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns NodeEdge\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): NodeEdge {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param NodeEdge= obj\n * @returns NodeEdge\n */\n static getRootAsNodeEdge(bb: flatbuffers.ByteBuffer, obj?: NodeEdge): NodeEdge {\n return (obj || new NodeEdge()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param NodeEdge= obj\n * @returns NodeEdge\n */\n static getSizePrefixedRootAsNodeEdge(bb: flatbuffers.ByteBuffer, obj?: NodeEdge): NodeEdge {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new NodeEdge()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @returns number\n */\n nodeIndex(): number {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.EdgeEnd= obj\n * @returns onnxruntime.experimental.fbs.EdgeEnd\n */\n inputEdges(index: number, obj?: onnxruntime.experimental.fbs.EdgeEnd): onnxruntime.experimental.fbs.EdgeEnd|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.EdgeEnd())\n .__init(this.bb!.__vector(this.bb_pos + offset) + index * 12, this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n inputEdgesLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.EdgeEnd= obj\n * @returns onnxruntime.experimental.fbs.EdgeEnd\n */\n outputEdges(index: number, obj?: onnxruntime.experimental.fbs.EdgeEnd): onnxruntime.experimental.fbs.EdgeEnd|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? (obj || new onnxruntime.experimental.fbs.EdgeEnd())\n .__init(this.bb!.__vector(this.bb_pos + offset) + index * 12, this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n outputEdgesLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startNodeEdge(builder: flatbuffers.Builder) {\n builder.startObject(3);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number nodeIndex\n */\n static addNodeIndex(builder: flatbuffers.Builder, nodeIndex: number) {\n builder.addFieldInt32(0, nodeIndex, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset inputEdgesOffset\n */\n static addInputEdges(builder: flatbuffers.Builder, inputEdgesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, inputEdgesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startInputEdgesVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(12, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset outputEdgesOffset\n */\n static addOutputEdges(builder: flatbuffers.Builder, outputEdgesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, outputEdgesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startOutputEdgesVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(12, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endNodeEdge(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createNodeEdge(\n builder: flatbuffers.Builder, nodeIndex: number, inputEdgesOffset: flatbuffers.Offset,\n outputEdgesOffset: flatbuffers.Offset): flatbuffers.Offset {\n NodeEdge.startNodeEdge(builder);\n NodeEdge.addNodeIndex(builder, nodeIndex);\n NodeEdge.addInputEdges(builder, inputEdgesOffset);\n NodeEdge.addOutputEdges(builder, outputEdgesOffset);\n return NodeEdge.endNodeEdge(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class Node {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns Node\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): Node {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Node= obj\n * @returns Node\n */\n static getRootAsNode(bb: flatbuffers.ByteBuffer, obj?: Node): Node {\n return (obj || new Node()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Node= obj\n * @returns Node\n */\n static getSizePrefixedRootAsNode(bb: flatbuffers.ByteBuffer, obj?: Node): Node {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Node()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n name(): string|null;\n name(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n name(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n docString(): string|null;\n docString(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n docString(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n domain(): string|null;\n domain(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n domain(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @returns number\n */\n sinceVersion(): number {\n let offset = this.bb!.__offset(this.bb_pos, 10);\n return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n }\n\n /**\n * @returns number\n */\n index(): number {\n let offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n opType(): string|null;\n opType(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n opType(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 14);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @returns onnxruntime.experimental.fbs.NodeType\n */\n type(): onnxruntime.experimental.fbs.NodeType {\n let offset = this.bb!.__offset(this.bb_pos, 16);\n return offset ? /** */ (this.bb!.readInt32(this.bb_pos + offset)) :\n onnxruntime.experimental.fbs.NodeType.Primitive;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n executionProviderType(): string|null;\n executionProviderType(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n executionProviderType(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 18);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param number index\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array\n */\n inputs(index: number): string;\n inputs(index: number, optionalEncoding: flatbuffers.Encoding): string|Uint8Array;\n inputs(index: number, optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 20);\n return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n }\n\n /**\n * @returns number\n */\n inputsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 20);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array\n */\n outputs(index: number): string;\n outputs(index: number, optionalEncoding: flatbuffers.Encoding): string|Uint8Array;\n outputs(index: number, optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 22);\n return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n }\n\n /**\n * @returns number\n */\n outputsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 22);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.Attribute= obj\n * @returns onnxruntime.experimental.fbs.Attribute\n */\n attributes(index: number, obj?: onnxruntime.experimental.fbs.Attribute): onnxruntime.experimental.fbs.Attribute\n |null {\n let offset = this.bb!.__offset(this.bb_pos, 24);\n return offset ? (obj || new onnxruntime.experimental.fbs.Attribute())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n attributesLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 24);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @returns number\n */\n inputArgCounts(index: number): number|null {\n let offset = this.bb!.__offset(this.bb_pos, 26);\n return offset ? this.bb!.readInt32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\n }\n\n /**\n * @returns number\n */\n inputArgCountsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 26);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @returns Int32Array\n */\n inputArgCountsArray(): Int32Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 26);\n return offset ?\n new Int32Array(\n this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset),\n this.bb!.__vector_len(this.bb_pos + offset)) :\n null;\n }\n\n /**\n * @param number index\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array\n */\n implicitInputs(index: number): string;\n implicitInputs(index: number, optionalEncoding: flatbuffers.Encoding): string|Uint8Array;\n implicitInputs(index: number, optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 28);\n return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n }\n\n /**\n * @returns number\n */\n implicitInputsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 28);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startNode(builder: flatbuffers.Builder) {\n builder.startObject(13);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset nameOffset\n */\n static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, nameOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset docStringOffset\n */\n static addDocString(builder: flatbuffers.Builder, docStringOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, docStringOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset domainOffset\n */\n static addDomain(builder: flatbuffers.Builder, domainOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, domainOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number sinceVersion\n */\n static addSinceVersion(builder: flatbuffers.Builder, sinceVersion: number) {\n builder.addFieldInt32(3, sinceVersion, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number index\n */\n static addIndex(builder: flatbuffers.Builder, index: number) {\n builder.addFieldInt32(4, index, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset opTypeOffset\n */\n static addOpType(builder: flatbuffers.Builder, opTypeOffset: flatbuffers.Offset) {\n builder.addFieldOffset(5, opTypeOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param onnxruntime.experimental.fbs.NodeType type\n */\n static addType(builder: flatbuffers.Builder, type: onnxruntime.experimental.fbs.NodeType) {\n builder.addFieldInt32(6, type, onnxruntime.experimental.fbs.NodeType.Primitive);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset executionProviderTypeOffset\n */\n static addExecutionProviderType(builder: flatbuffers.Builder, executionProviderTypeOffset: flatbuffers.Offset) {\n builder.addFieldOffset(7, executionProviderTypeOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset inputsOffset\n */\n static addInputs(builder: flatbuffers.Builder, inputsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(8, inputsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createInputsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startInputsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset outputsOffset\n */\n static addOutputs(builder: flatbuffers.Builder, outputsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(9, outputsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createOutputsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startOutputsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset attributesOffset\n */\n static addAttributes(builder: flatbuffers.Builder, attributesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(10, attributesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createAttributesVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startAttributesVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset inputArgCountsOffset\n */\n static addInputArgCounts(builder: flatbuffers.Builder, inputArgCountsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(11, inputArgCountsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createInputArgCountsVector(builder: flatbuffers.Builder, data: number[]|Uint8Array): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt32(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startInputArgCountsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset implicitInputsOffset\n */\n static addImplicitInputs(builder: flatbuffers.Builder, implicitInputsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(12, implicitInputsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createImplicitInputsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startImplicitInputsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endNode(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createNode(\n builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset, docStringOffset: flatbuffers.Offset,\n domainOffset: flatbuffers.Offset, sinceVersion: number, index: number, opTypeOffset: flatbuffers.Offset,\n type: onnxruntime.experimental.fbs.NodeType, executionProviderTypeOffset: flatbuffers.Offset,\n inputsOffset: flatbuffers.Offset, outputsOffset: flatbuffers.Offset, attributesOffset: flatbuffers.Offset,\n inputArgCountsOffset: flatbuffers.Offset, implicitInputsOffset: flatbuffers.Offset): flatbuffers.Offset {\n Node.startNode(builder);\n Node.addName(builder, nameOffset);\n Node.addDocString(builder, docStringOffset);\n Node.addDomain(builder, domainOffset);\n Node.addSinceVersion(builder, sinceVersion);\n Node.addIndex(builder, index);\n Node.addOpType(builder, opTypeOffset);\n Node.addType(builder, type);\n Node.addExecutionProviderType(builder, executionProviderTypeOffset);\n Node.addInputs(builder, inputsOffset);\n Node.addOutputs(builder, outputsOffset);\n Node.addAttributes(builder, attributesOffset);\n Node.addInputArgCounts(builder, inputArgCountsOffset);\n Node.addImplicitInputs(builder, implicitInputsOffset);\n return Node.endNode(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class ValueInfo {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns ValueInfo\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): ValueInfo {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param ValueInfo= obj\n * @returns ValueInfo\n */\n static getRootAsValueInfo(bb: flatbuffers.ByteBuffer, obj?: ValueInfo): ValueInfo {\n return (obj || new ValueInfo()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param ValueInfo= obj\n * @returns ValueInfo\n */\n static getSizePrefixedRootAsValueInfo(bb: flatbuffers.ByteBuffer, obj?: ValueInfo): ValueInfo {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new ValueInfo()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n name(): string|null;\n name(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n name(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n docString(): string|null;\n docString(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n docString(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.TypeInfo= obj\n * @returns onnxruntime.experimental.fbs.TypeInfo|null\n */\n type(obj?: onnxruntime.experimental.fbs.TypeInfo): onnxruntime.experimental.fbs.TypeInfo|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? (obj || new onnxruntime.experimental.fbs.TypeInfo())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startValueInfo(builder: flatbuffers.Builder) {\n builder.startObject(3);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset nameOffset\n */\n static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, nameOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset docStringOffset\n */\n static addDocString(builder: flatbuffers.Builder, docStringOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, docStringOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset typeOffset\n */\n static addType(builder: flatbuffers.Builder, typeOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, typeOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endValueInfo(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createValueInfo(\n builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset, docStringOffset: flatbuffers.Offset,\n typeOffset: flatbuffers.Offset): flatbuffers.Offset {\n ValueInfo.startValueInfo(builder);\n ValueInfo.addName(builder, nameOffset);\n ValueInfo.addDocString(builder, docStringOffset);\n ValueInfo.addType(builder, typeOffset);\n return ValueInfo.endValueInfo(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class TypeInfo {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns TypeInfo\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): TypeInfo {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param TypeInfo= obj\n * @returns TypeInfo\n */\n static getRootAsTypeInfo(bb: flatbuffers.ByteBuffer, obj?: TypeInfo): TypeInfo {\n return (obj || new TypeInfo()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param TypeInfo= obj\n * @returns TypeInfo\n */\n static getSizePrefixedRootAsTypeInfo(bb: flatbuffers.ByteBuffer, obj?: TypeInfo): TypeInfo {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new TypeInfo()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n denotation(): string|null;\n denotation(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n denotation(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @returns onnxruntime.experimental.fbs.TypeInfoValue\n */\n valueType(): onnxruntime.experimental.fbs.TypeInfoValue {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? /** */ (this.bb!.readUint8(this.bb_pos + offset)) :\n onnxruntime.experimental.fbs.TypeInfoValue.NONE;\n }\n\n /**\n * @param flatbuffers.Table obj\n * @returns ?flatbuffers.Table\n */\n value(obj: T): T|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__union(obj, this.bb_pos + offset) : null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startTypeInfo(builder: flatbuffers.Builder) {\n builder.startObject(3);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset denotationOffset\n */\n static addDenotation(builder: flatbuffers.Builder, denotationOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, denotationOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param onnxruntime.experimental.fbs.TypeInfoValue valueType\n */\n static addValueType(builder: flatbuffers.Builder, valueType: onnxruntime.experimental.fbs.TypeInfoValue) {\n builder.addFieldInt8(1, valueType, onnxruntime.experimental.fbs.TypeInfoValue.NONE);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset valueOffset\n */\n static addValue(builder: flatbuffers.Builder, valueOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, valueOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endTypeInfo(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createTypeInfo(\n builder: flatbuffers.Builder, denotationOffset: flatbuffers.Offset,\n valueType: onnxruntime.experimental.fbs.TypeInfoValue, valueOffset: flatbuffers.Offset): flatbuffers.Offset {\n TypeInfo.startTypeInfo(builder);\n TypeInfo.addDenotation(builder, denotationOffset);\n TypeInfo.addValueType(builder, valueType);\n TypeInfo.addValue(builder, valueOffset);\n return TypeInfo.endTypeInfo(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class OperatorSetId {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns OperatorSetId\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): OperatorSetId {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param OperatorSetId= obj\n * @returns OperatorSetId\n */\n static getRootAsOperatorSetId(bb: flatbuffers.ByteBuffer, obj?: OperatorSetId): OperatorSetId {\n return (obj || new OperatorSetId()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param OperatorSetId= obj\n * @returns OperatorSetId\n */\n static getSizePrefixedRootAsOperatorSetId(bb: flatbuffers.ByteBuffer, obj?: OperatorSetId): OperatorSetId {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new OperatorSetId()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n domain(): string|null;\n domain(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n domain(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @returns flatbuffers.Long\n */\n version(): flatbuffers.Long {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(0, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startOperatorSetId(builder: flatbuffers.Builder) {\n builder.startObject(2);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset domainOffset\n */\n static addDomain(builder: flatbuffers.Builder, domainOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, domainOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Long version\n */\n static addVersion(builder: flatbuffers.Builder, version: flatbuffers.Long) {\n builder.addFieldInt64(1, version, builder.createLong(0, 0));\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endOperatorSetId(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createOperatorSetId(\n builder: flatbuffers.Builder, domainOffset: flatbuffers.Offset, version: flatbuffers.Long): flatbuffers.Offset {\n OperatorSetId.startOperatorSetId(builder);\n OperatorSetId.addDomain(builder, domainOffset);\n OperatorSetId.addVersion(builder, version);\n return OperatorSetId.endOperatorSetId(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class Tensor {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns Tensor\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): Tensor {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Tensor= obj\n * @returns Tensor\n */\n static getRootAsTensor(bb: flatbuffers.ByteBuffer, obj?: Tensor): Tensor {\n return (obj || new Tensor()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Tensor= obj\n * @returns Tensor\n */\n static getSizePrefixedRootAsTensor(bb: flatbuffers.ByteBuffer, obj?: Tensor): Tensor {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Tensor()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n name(): string|null;\n name(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n name(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n docString(): string|null;\n docString(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n docString(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param number index\n * @returns flatbuffers.Long\n */\n dims(index: number): flatbuffers.Long|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.readInt64(this.bb!.__vector(this.bb_pos + offset) + index * 8) :\n this.bb!.createLong(0, 0);\n }\n\n /**\n * @returns number\n */\n dimsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @returns onnxruntime.experimental.fbs.TensorDataType\n */\n dataType(): onnxruntime.experimental.fbs.TensorDataType {\n let offset = this.bb!.__offset(this.bb_pos, 10);\n return offset ? /** */ (this.bb!.readInt32(this.bb_pos + offset)) :\n onnxruntime.experimental.fbs.TensorDataType.UNDEFINED;\n }\n\n /**\n * @param number index\n * @returns number\n */\n rawData(index: number): number|null {\n let offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ? this.bb!.readUint8(this.bb!.__vector(this.bb_pos + offset) + index) : 0;\n }\n\n /**\n * @returns number\n */\n rawDataLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @returns Uint8Array\n */\n rawDataArray(): Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ?\n new Uint8Array(\n this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset),\n this.bb!.__vector_len(this.bb_pos + offset)) :\n null;\n }\n\n /**\n * @param number index\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array\n */\n stringData(index: number): string;\n stringData(index: number, optionalEncoding: flatbuffers.Encoding): string|Uint8Array;\n stringData(index: number, optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 14);\n return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n }\n\n /**\n * @returns number\n */\n stringDataLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 14);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startTensor(builder: flatbuffers.Builder) {\n builder.startObject(6);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset nameOffset\n */\n static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, nameOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset docStringOffset\n */\n static addDocString(builder: flatbuffers.Builder, docStringOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, docStringOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset dimsOffset\n */\n static addDims(builder: flatbuffers.Builder, dimsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, dimsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createDimsVector(builder: flatbuffers.Builder, data: flatbuffers.Long[]): flatbuffers.Offset {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt64(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startDimsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(8, numElems, 8);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param onnxruntime.experimental.fbs.TensorDataType dataType\n */\n static addDataType(builder: flatbuffers.Builder, dataType: onnxruntime.experimental.fbs.TensorDataType) {\n builder.addFieldInt32(3, dataType, onnxruntime.experimental.fbs.TensorDataType.UNDEFINED);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset rawDataOffset\n */\n static addRawData(builder: flatbuffers.Builder, rawDataOffset: flatbuffers.Offset) {\n builder.addFieldOffset(4, rawDataOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createRawDataVector(builder: flatbuffers.Builder, data: number[]|Uint8Array): flatbuffers.Offset {\n builder.startVector(1, data.length, 1);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt8(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startRawDataVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(1, numElems, 1);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset stringDataOffset\n */\n static addStringData(builder: flatbuffers.Builder, stringDataOffset: flatbuffers.Offset) {\n builder.addFieldOffset(5, stringDataOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createStringDataVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startStringDataVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endTensor(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createTensor(\n builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset, docStringOffset: flatbuffers.Offset,\n dimsOffset: flatbuffers.Offset, dataType: onnxruntime.experimental.fbs.TensorDataType,\n rawDataOffset: flatbuffers.Offset, stringDataOffset: flatbuffers.Offset): flatbuffers.Offset {\n Tensor.startTensor(builder);\n Tensor.addName(builder, nameOffset);\n Tensor.addDocString(builder, docStringOffset);\n Tensor.addDims(builder, dimsOffset);\n Tensor.addDataType(builder, dataType);\n Tensor.addRawData(builder, rawDataOffset);\n Tensor.addStringData(builder, stringDataOffset);\n return Tensor.endTensor(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class SparseTensor {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns SparseTensor\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): SparseTensor {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param SparseTensor= obj\n * @returns SparseTensor\n */\n static getRootAsSparseTensor(bb: flatbuffers.ByteBuffer, obj?: SparseTensor): SparseTensor {\n return (obj || new SparseTensor()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param SparseTensor= obj\n * @returns SparseTensor\n */\n static getSizePrefixedRootAsSparseTensor(bb: flatbuffers.ByteBuffer, obj?: SparseTensor): SparseTensor {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new SparseTensor()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param onnxruntime.experimental.fbs.Tensor= obj\n * @returns onnxruntime.experimental.fbs.Tensor|null\n */\n values(obj?: onnxruntime.experimental.fbs.Tensor): onnxruntime.experimental.fbs.Tensor|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? (obj || new onnxruntime.experimental.fbs.Tensor())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.Tensor= obj\n * @returns onnxruntime.experimental.fbs.Tensor|null\n */\n indices(obj?: onnxruntime.experimental.fbs.Tensor): onnxruntime.experimental.fbs.Tensor|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.Tensor())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param number index\n * @returns flatbuffers.Long\n */\n dims(index: number): flatbuffers.Long|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.readInt64(this.bb!.__vector(this.bb_pos + offset) + index * 8) :\n this.bb!.createLong(0, 0);\n }\n\n /**\n * @returns number\n */\n dimsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startSparseTensor(builder: flatbuffers.Builder) {\n builder.startObject(3);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset valuesOffset\n */\n static addValues(builder: flatbuffers.Builder, valuesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, valuesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset indicesOffset\n */\n static addIndices(builder: flatbuffers.Builder, indicesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, indicesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset dimsOffset\n */\n static addDims(builder: flatbuffers.Builder, dimsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, dimsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createDimsVector(builder: flatbuffers.Builder, data: flatbuffers.Long[]): flatbuffers.Offset {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt64(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startDimsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(8, numElems, 8);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endSparseTensor(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createSparseTensor(\n builder: flatbuffers.Builder, valuesOffset: flatbuffers.Offset, indicesOffset: flatbuffers.Offset,\n dimsOffset: flatbuffers.Offset): flatbuffers.Offset {\n SparseTensor.startSparseTensor(builder);\n SparseTensor.addValues(builder, valuesOffset);\n SparseTensor.addIndices(builder, indicesOffset);\n SparseTensor.addDims(builder, dimsOffset);\n return SparseTensor.endSparseTensor(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class Attribute {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns Attribute\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): Attribute {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Attribute= obj\n * @returns Attribute\n */\n static getRootAsAttribute(bb: flatbuffers.ByteBuffer, obj?: Attribute): Attribute {\n return (obj || new Attribute()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Attribute= obj\n * @returns Attribute\n */\n static getSizePrefixedRootAsAttribute(bb: flatbuffers.ByteBuffer, obj?: Attribute): Attribute {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Attribute()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n name(): string|null;\n name(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n name(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n docString(): string|null;\n docString(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n docString(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @returns onnxruntime.experimental.fbs.AttributeType\n */\n type(): onnxruntime.experimental.fbs.AttributeType {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? /** */ (this.bb!.readInt32(this.bb_pos + offset)) :\n onnxruntime.experimental.fbs.AttributeType.UNDEFINED;\n }\n\n /**\n * @returns number\n */\n f(): number {\n let offset = this.bb!.__offset(this.bb_pos, 10);\n return offset ? this.bb!.readFloat32(this.bb_pos + offset) : 0.0;\n }\n\n /**\n * @returns flatbuffers.Long\n */\n i(): flatbuffers.Long {\n let offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(0, 0);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n s(): string|null;\n s(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n s(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 14);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.Tensor= obj\n * @returns onnxruntime.experimental.fbs.Tensor|null\n */\n t(obj?: onnxruntime.experimental.fbs.Tensor): onnxruntime.experimental.fbs.Tensor|null {\n let offset = this.bb!.__offset(this.bb_pos, 16);\n return offset ? (obj || new onnxruntime.experimental.fbs.Tensor())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.Graph= obj\n * @returns onnxruntime.experimental.fbs.Graph|null\n */\n g(obj?: onnxruntime.experimental.fbs.Graph): onnxruntime.experimental.fbs.Graph|null {\n let offset = this.bb!.__offset(this.bb_pos, 18);\n return offset ? (obj || new onnxruntime.experimental.fbs.Graph())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param number index\n * @returns number\n */\n floats(index: number): number|null {\n let offset = this.bb!.__offset(this.bb_pos, 20);\n return offset ? this.bb!.readFloat32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\n }\n\n /**\n * @returns number\n */\n floatsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 20);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @returns Float32Array\n */\n floatsArray(): Float32Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 20);\n return offset ?\n new Float32Array(\n this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset),\n this.bb!.__vector_len(this.bb_pos + offset)) :\n null;\n }\n\n /**\n * @param number index\n * @returns flatbuffers.Long\n */\n ints(index: number): flatbuffers.Long|null {\n let offset = this.bb!.__offset(this.bb_pos, 22);\n return offset ? this.bb!.readInt64(this.bb!.__vector(this.bb_pos + offset) + index * 8) :\n this.bb!.createLong(0, 0);\n }\n\n /**\n * @returns number\n */\n intsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 22);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array\n */\n strings(index: number): string;\n strings(index: number, optionalEncoding: flatbuffers.Encoding): string|Uint8Array;\n strings(index: number, optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 24);\n return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n }\n\n /**\n * @returns number\n */\n stringsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 24);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.Tensor= obj\n * @returns onnxruntime.experimental.fbs.Tensor\n */\n tensors(index: number, obj?: onnxruntime.experimental.fbs.Tensor): onnxruntime.experimental.fbs.Tensor|null {\n let offset = this.bb!.__offset(this.bb_pos, 26);\n return offset ? (obj || new onnxruntime.experimental.fbs.Tensor())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n tensorsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 26);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.Graph= obj\n * @returns onnxruntime.experimental.fbs.Graph\n */\n graphs(index: number, obj?: onnxruntime.experimental.fbs.Graph): onnxruntime.experimental.fbs.Graph|null {\n let offset = this.bb!.__offset(this.bb_pos, 28);\n return offset ? (obj || new onnxruntime.experimental.fbs.Graph())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n graphsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 28);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startAttribute(builder: flatbuffers.Builder) {\n builder.startObject(13);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset nameOffset\n */\n static addName(builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, nameOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset docStringOffset\n */\n static addDocString(builder: flatbuffers.Builder, docStringOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, docStringOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param onnxruntime.experimental.fbs.AttributeType type\n */\n static addType(builder: flatbuffers.Builder, type: onnxruntime.experimental.fbs.AttributeType) {\n builder.addFieldInt32(2, type, onnxruntime.experimental.fbs.AttributeType.UNDEFINED);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number f\n */\n static addF(builder: flatbuffers.Builder, f: number) {\n builder.addFieldFloat32(3, f, 0.0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Long i\n */\n static addI(builder: flatbuffers.Builder, i: flatbuffers.Long) {\n builder.addFieldInt64(4, i, builder.createLong(0, 0));\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset sOffset\n */\n static addS(builder: flatbuffers.Builder, sOffset: flatbuffers.Offset) {\n builder.addFieldOffset(5, sOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset tOffset\n */\n static addT(builder: flatbuffers.Builder, tOffset: flatbuffers.Offset) {\n builder.addFieldOffset(6, tOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset gOffset\n */\n static addG(builder: flatbuffers.Builder, gOffset: flatbuffers.Offset) {\n builder.addFieldOffset(7, gOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset floatsOffset\n */\n static addFloats(builder: flatbuffers.Builder, floatsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(8, floatsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createFloatsVector(builder: flatbuffers.Builder, data: number[]|Uint8Array): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addFloat32(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startFloatsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset intsOffset\n */\n static addInts(builder: flatbuffers.Builder, intsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(9, intsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createIntsVector(builder: flatbuffers.Builder, data: flatbuffers.Long[]): flatbuffers.Offset {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt64(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startIntsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(8, numElems, 8);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset stringsOffset\n */\n static addStrings(builder: flatbuffers.Builder, stringsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(10, stringsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createStringsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startStringsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset tensorsOffset\n */\n static addTensors(builder: flatbuffers.Builder, tensorsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(11, tensorsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createTensorsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startTensorsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset graphsOffset\n */\n static addGraphs(builder: flatbuffers.Builder, graphsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(12, graphsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createGraphsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startGraphsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endAttribute(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createAttribute(\n builder: flatbuffers.Builder, nameOffset: flatbuffers.Offset, docStringOffset: flatbuffers.Offset,\n type: onnxruntime.experimental.fbs.AttributeType, f: number, i: flatbuffers.Long, sOffset: flatbuffers.Offset,\n tOffset: flatbuffers.Offset, gOffset: flatbuffers.Offset, floatsOffset: flatbuffers.Offset,\n intsOffset: flatbuffers.Offset, stringsOffset: flatbuffers.Offset, tensorsOffset: flatbuffers.Offset,\n graphsOffset: flatbuffers.Offset): flatbuffers.Offset {\n Attribute.startAttribute(builder);\n Attribute.addName(builder, nameOffset);\n Attribute.addDocString(builder, docStringOffset);\n Attribute.addType(builder, type);\n Attribute.addF(builder, f);\n Attribute.addI(builder, i);\n Attribute.addS(builder, sOffset);\n Attribute.addT(builder, tOffset);\n Attribute.addG(builder, gOffset);\n Attribute.addFloats(builder, floatsOffset);\n Attribute.addInts(builder, intsOffset);\n Attribute.addStrings(builder, stringsOffset);\n Attribute.addTensors(builder, tensorsOffset);\n Attribute.addGraphs(builder, graphsOffset);\n return Attribute.endAttribute(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class Graph {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns Graph\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): Graph {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Graph= obj\n * @returns Graph\n */\n static getRootAsGraph(bb: flatbuffers.ByteBuffer, obj?: Graph): Graph {\n return (obj || new Graph()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Graph= obj\n * @returns Graph\n */\n static getSizePrefixedRootAsGraph(bb: flatbuffers.ByteBuffer, obj?: Graph): Graph {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Graph()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.Tensor= obj\n * @returns onnxruntime.experimental.fbs.Tensor\n */\n initializers(index: number, obj?: onnxruntime.experimental.fbs.Tensor): onnxruntime.experimental.fbs.Tensor|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? (obj || new onnxruntime.experimental.fbs.Tensor())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n initializersLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.ValueInfo= obj\n * @returns onnxruntime.experimental.fbs.ValueInfo\n */\n nodeArgs(index: number, obj?: onnxruntime.experimental.fbs.ValueInfo): onnxruntime.experimental.fbs.ValueInfo|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.ValueInfo())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n nodeArgsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.Node= obj\n * @returns onnxruntime.experimental.fbs.Node\n */\n nodes(index: number, obj?: onnxruntime.experimental.fbs.Node): onnxruntime.experimental.fbs.Node|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? (obj || new onnxruntime.experimental.fbs.Node())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n nodesLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @returns number\n */\n maxNodeIndex(): number {\n let offset = this.bb!.__offset(this.bb_pos, 10);\n return offset ? this.bb!.readUint32(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.NodeEdge= obj\n * @returns onnxruntime.experimental.fbs.NodeEdge\n */\n nodeEdges(index: number, obj?: onnxruntime.experimental.fbs.NodeEdge): onnxruntime.experimental.fbs.NodeEdge|null {\n let offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ? (obj || new onnxruntime.experimental.fbs.NodeEdge())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n nodeEdgesLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array\n */\n inputs(index: number): string;\n inputs(index: number, optionalEncoding: flatbuffers.Encoding): string|Uint8Array;\n inputs(index: number, optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 14);\n return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n }\n\n /**\n * @returns number\n */\n inputsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 14);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array\n */\n outputs(index: number): string;\n outputs(index: number, optionalEncoding: flatbuffers.Encoding): string|Uint8Array;\n outputs(index: number, optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 16);\n return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n }\n\n /**\n * @returns number\n */\n outputsLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 16);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.SparseTensor= obj\n * @returns onnxruntime.experimental.fbs.SparseTensor\n */\n sparseInitializers(index: number, obj?: onnxruntime.experimental.fbs.SparseTensor):\n onnxruntime.experimental.fbs.SparseTensor|null {\n let offset = this.bb!.__offset(this.bb_pos, 18);\n return offset ? (obj || new onnxruntime.experimental.fbs.SparseTensor())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n sparseInitializersLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 18);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startGraph(builder: flatbuffers.Builder) {\n builder.startObject(8);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset initializersOffset\n */\n static addInitializers(builder: flatbuffers.Builder, initializersOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, initializersOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createInitializersVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startInitializersVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset nodeArgsOffset\n */\n static addNodeArgs(builder: flatbuffers.Builder, nodeArgsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, nodeArgsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createNodeArgsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startNodeArgsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset nodesOffset\n */\n static addNodes(builder: flatbuffers.Builder, nodesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, nodesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createNodesVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startNodesVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number maxNodeIndex\n */\n static addMaxNodeIndex(builder: flatbuffers.Builder, maxNodeIndex: number) {\n builder.addFieldInt32(3, maxNodeIndex, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset nodeEdgesOffset\n */\n static addNodeEdges(builder: flatbuffers.Builder, nodeEdgesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(4, nodeEdgesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createNodeEdgesVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startNodeEdgesVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset inputsOffset\n */\n static addInputs(builder: flatbuffers.Builder, inputsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(5, inputsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createInputsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startInputsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset outputsOffset\n */\n static addOutputs(builder: flatbuffers.Builder, outputsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(6, outputsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createOutputsVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startOutputsVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset sparseInitializersOffset\n */\n static addSparseInitializers(builder: flatbuffers.Builder, sparseInitializersOffset: flatbuffers.Offset) {\n builder.addFieldOffset(7, sparseInitializersOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createSparseInitializersVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]):\n flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startSparseInitializersVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endGraph(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createGraph(\n builder: flatbuffers.Builder, initializersOffset: flatbuffers.Offset, nodeArgsOffset: flatbuffers.Offset,\n nodesOffset: flatbuffers.Offset, maxNodeIndex: number, nodeEdgesOffset: flatbuffers.Offset,\n inputsOffset: flatbuffers.Offset, outputsOffset: flatbuffers.Offset,\n sparseInitializersOffset: flatbuffers.Offset): flatbuffers.Offset {\n Graph.startGraph(builder);\n Graph.addInitializers(builder, initializersOffset);\n Graph.addNodeArgs(builder, nodeArgsOffset);\n Graph.addNodes(builder, nodesOffset);\n Graph.addMaxNodeIndex(builder, maxNodeIndex);\n Graph.addNodeEdges(builder, nodeEdgesOffset);\n Graph.addInputs(builder, inputsOffset);\n Graph.addOutputs(builder, outputsOffset);\n Graph.addSparseInitializers(builder, sparseInitializersOffset);\n return Graph.endGraph(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class Model {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns Model\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): Model {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Model= obj\n * @returns Model\n */\n static getRootAsModel(bb: flatbuffers.ByteBuffer, obj?: Model): Model {\n return (obj || new Model()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param Model= obj\n * @returns Model\n */\n static getSizePrefixedRootAsModel(bb: flatbuffers.ByteBuffer, obj?: Model): Model {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new Model()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @returns flatbuffers.Long\n */\n irVersion(): flatbuffers.Long {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(0, 0);\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.OperatorSetId= obj\n * @returns onnxruntime.experimental.fbs.OperatorSetId\n */\n opsetImport(index: number, obj?: onnxruntime.experimental.fbs.OperatorSetId):\n onnxruntime.experimental.fbs.OperatorSetId|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.OperatorSetId())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n opsetImportLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n producerName(): string|null;\n producerName(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n producerName(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n producerVersion(): string|null;\n producerVersion(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n producerVersion(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 10);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n domain(): string|null;\n domain(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n domain(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @returns flatbuffers.Long\n */\n modelVersion(): flatbuffers.Long {\n let offset = this.bb!.__offset(this.bb_pos, 14);\n return offset ? this.bb!.readInt64(this.bb_pos + offset) : this.bb!.createLong(0, 0);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n docString(): string|null;\n docString(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n docString(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 16);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.Graph= obj\n * @returns onnxruntime.experimental.fbs.Graph|null\n */\n graph(obj?: onnxruntime.experimental.fbs.Graph): onnxruntime.experimental.fbs.Graph|null {\n let offset = this.bb!.__offset(this.bb_pos, 18);\n return offset ? (obj || new onnxruntime.experimental.fbs.Graph())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n graphDocString(): string|null;\n graphDocString(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n graphDocString(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 20);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startModel(builder: flatbuffers.Builder) {\n builder.startObject(9);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Long irVersion\n */\n static addIrVersion(builder: flatbuffers.Builder, irVersion: flatbuffers.Long) {\n builder.addFieldInt64(0, irVersion, builder.createLong(0, 0));\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset opsetImportOffset\n */\n static addOpsetImport(builder: flatbuffers.Builder, opsetImportOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, opsetImportOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createOpsetImportVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startOpsetImportVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset producerNameOffset\n */\n static addProducerName(builder: flatbuffers.Builder, producerNameOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, producerNameOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset producerVersionOffset\n */\n static addProducerVersion(builder: flatbuffers.Builder, producerVersionOffset: flatbuffers.Offset) {\n builder.addFieldOffset(3, producerVersionOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset domainOffset\n */\n static addDomain(builder: flatbuffers.Builder, domainOffset: flatbuffers.Offset) {\n builder.addFieldOffset(4, domainOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Long modelVersion\n */\n static addModelVersion(builder: flatbuffers.Builder, modelVersion: flatbuffers.Long) {\n builder.addFieldInt64(5, modelVersion, builder.createLong(0, 0));\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset docStringOffset\n */\n static addDocString(builder: flatbuffers.Builder, docStringOffset: flatbuffers.Offset) {\n builder.addFieldOffset(6, docStringOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset graphOffset\n */\n static addGraph(builder: flatbuffers.Builder, graphOffset: flatbuffers.Offset) {\n builder.addFieldOffset(7, graphOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset graphDocStringOffset\n */\n static addGraphDocString(builder: flatbuffers.Builder, graphDocStringOffset: flatbuffers.Offset) {\n builder.addFieldOffset(8, graphDocStringOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endModel(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createModel(\n builder: flatbuffers.Builder, irVersion: flatbuffers.Long, opsetImportOffset: flatbuffers.Offset,\n producerNameOffset: flatbuffers.Offset, producerVersionOffset: flatbuffers.Offset,\n domainOffset: flatbuffers.Offset, modelVersion: flatbuffers.Long, docStringOffset: flatbuffers.Offset,\n graphOffset: flatbuffers.Offset, graphDocStringOffset: flatbuffers.Offset): flatbuffers.Offset {\n Model.startModel(builder);\n Model.addIrVersion(builder, irVersion);\n Model.addOpsetImport(builder, opsetImportOffset);\n Model.addProducerName(builder, producerNameOffset);\n Model.addProducerVersion(builder, producerVersionOffset);\n Model.addDomain(builder, domainOffset);\n Model.addModelVersion(builder, modelVersion);\n Model.addDocString(builder, docStringOffset);\n Model.addGraph(builder, graphOffset);\n Model.addGraphDocString(builder, graphDocStringOffset);\n return Model.endModel(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class KernelCreateInfos {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns KernelCreateInfos\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): KernelCreateInfos {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param KernelCreateInfos= obj\n * @returns KernelCreateInfos\n */\n static getRootAsKernelCreateInfos(bb: flatbuffers.ByteBuffer, obj?: KernelCreateInfos): KernelCreateInfos {\n return (obj || new KernelCreateInfos()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param KernelCreateInfos= obj\n * @returns KernelCreateInfos\n */\n static getSizePrefixedRootAsKernelCreateInfos(bb: flatbuffers.ByteBuffer, obj?: KernelCreateInfos):\n KernelCreateInfos {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new KernelCreateInfos()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param number index\n * @returns number\n */\n nodeIndices(index: number): number|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.readUint32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\n }\n\n /**\n * @returns number\n */\n nodeIndicesLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @returns Uint32Array\n */\n nodeIndicesArray(): Uint32Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ?\n new Uint32Array(\n this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset),\n this.bb!.__vector_len(this.bb_pos + offset)) :\n null;\n }\n\n /**\n * @param number index\n * @returns flatbuffers.Long\n */\n kernelDefHashes(index: number): flatbuffers.Long|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.readUint64(this.bb!.__vector(this.bb_pos + offset) + index * 8) :\n this.bb!.createLong(0, 0);\n }\n\n /**\n * @returns number\n */\n kernelDefHashesLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startKernelCreateInfos(builder: flatbuffers.Builder) {\n builder.startObject(2);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset nodeIndicesOffset\n */\n static addNodeIndices(builder: flatbuffers.Builder, nodeIndicesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, nodeIndicesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createNodeIndicesVector(builder: flatbuffers.Builder, data: number[]|Uint8Array): flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt32(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startNodeIndicesVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset kernelDefHashesOffset\n */\n static addKernelDefHashes(builder: flatbuffers.Builder, kernelDefHashesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, kernelDefHashesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createKernelDefHashesVector(builder: flatbuffers.Builder, data: flatbuffers.Long[]): flatbuffers.Offset {\n builder.startVector(8, data.length, 8);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addInt64(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startKernelDefHashesVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(8, numElems, 8);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endKernelCreateInfos(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createKernelCreateInfos(\n builder: flatbuffers.Builder, nodeIndicesOffset: flatbuffers.Offset,\n kernelDefHashesOffset: flatbuffers.Offset): flatbuffers.Offset {\n KernelCreateInfos.startKernelCreateInfos(builder);\n KernelCreateInfos.addNodeIndices(builder, nodeIndicesOffset);\n KernelCreateInfos.addKernelDefHashes(builder, kernelDefHashesOffset);\n return KernelCreateInfos.endKernelCreateInfos(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class SubGraphSessionState {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns SubGraphSessionState\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): SubGraphSessionState {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param SubGraphSessionState= obj\n * @returns SubGraphSessionState\n */\n static getRootAsSubGraphSessionState(bb: flatbuffers.ByteBuffer, obj?: SubGraphSessionState): SubGraphSessionState {\n return (obj || new SubGraphSessionState()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param SubGraphSessionState= obj\n * @returns SubGraphSessionState\n */\n static getSizePrefixedRootAsSubGraphSessionState(bb: flatbuffers.ByteBuffer, obj?: SubGraphSessionState):\n SubGraphSessionState {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new SubGraphSessionState()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n graphId(): string|null;\n graphId(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n graphId(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.SessionState= obj\n * @returns onnxruntime.experimental.fbs.SessionState|null\n */\n sessionState(obj?: onnxruntime.experimental.fbs.SessionState): onnxruntime.experimental.fbs.SessionState|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.SessionState())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startSubGraphSessionState(builder: flatbuffers.Builder) {\n builder.startObject(2);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset graphIdOffset\n */\n static addGraphId(builder: flatbuffers.Builder, graphIdOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, graphIdOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset sessionStateOffset\n */\n static addSessionState(builder: flatbuffers.Builder, sessionStateOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, sessionStateOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endSubGraphSessionState(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n builder.requiredField(offset, 4); // graph_id\n return offset;\n }\n\n static createSubGraphSessionState(\n builder: flatbuffers.Builder, graphIdOffset: flatbuffers.Offset,\n sessionStateOffset: flatbuffers.Offset): flatbuffers.Offset {\n SubGraphSessionState.startSubGraphSessionState(builder);\n SubGraphSessionState.addGraphId(builder, graphIdOffset);\n SubGraphSessionState.addSessionState(builder, sessionStateOffset);\n return SubGraphSessionState.endSubGraphSessionState(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class SessionState {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns SessionState\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): SessionState {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param SessionState= obj\n * @returns SessionState\n */\n static getRootAsSessionState(bb: flatbuffers.ByteBuffer, obj?: SessionState): SessionState {\n return (obj || new SessionState()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param SessionState= obj\n * @returns SessionState\n */\n static getSizePrefixedRootAsSessionState(bb: flatbuffers.ByteBuffer, obj?: SessionState): SessionState {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new SessionState()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param onnxruntime.experimental.fbs.KernelCreateInfos= obj\n * @returns onnxruntime.experimental.fbs.KernelCreateInfos|null\n */\n kernels(obj?: onnxruntime.experimental.fbs.KernelCreateInfos): onnxruntime.experimental.fbs.KernelCreateInfos|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? (obj || new onnxruntime.experimental.fbs.KernelCreateInfos())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param number index\n * @param onnxruntime.experimental.fbs.SubGraphSessionState= obj\n * @returns onnxruntime.experimental.fbs.SubGraphSessionState\n */\n subGraphSessionStates(index: number, obj?: onnxruntime.experimental.fbs.SubGraphSessionState):\n onnxruntime.experimental.fbs.SubGraphSessionState|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.SubGraphSessionState())\n .__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) :\n null;\n }\n\n /**\n * @returns number\n */\n subGraphSessionStatesLength(): number {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startSessionState(builder: flatbuffers.Builder) {\n builder.startObject(2);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset kernelsOffset\n */\n static addKernels(builder: flatbuffers.Builder, kernelsOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, kernelsOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset subGraphSessionStatesOffset\n */\n static addSubGraphSessionStates(builder: flatbuffers.Builder, subGraphSessionStatesOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, subGraphSessionStatesOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param Array. data\n * @returns flatbuffers.Offset\n */\n static createSubGraphSessionStatesVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]):\n flatbuffers.Offset {\n builder.startVector(4, data.length, 4);\n for (let i = data.length - 1; i >= 0; i--) {\n builder.addOffset(data[i]);\n }\n return builder.endVector();\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param number numElems\n */\n static startSubGraphSessionStatesVector(builder: flatbuffers.Builder, numElems: number) {\n builder.startVector(4, numElems, 4);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endSessionState(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n static createSessionState(\n builder: flatbuffers.Builder, kernelsOffset: flatbuffers.Offset,\n subGraphSessionStatesOffset: flatbuffers.Offset): flatbuffers.Offset {\n SessionState.startSessionState(builder);\n SessionState.addKernels(builder, kernelsOffset);\n SessionState.addSubGraphSessionStates(builder, subGraphSessionStatesOffset);\n return SessionState.endSessionState(builder);\n }\n }\n}\n/**\n * @constructor\n */\nexport namespace onnxruntime.experimental.fbs {\n export class InferenceSession {\n bb: flatbuffers.ByteBuffer|null = null;\n\n bb_pos = 0;\n /**\n * @param number i\n * @param flatbuffers.ByteBuffer bb\n * @returns InferenceSession\n */\n __init(i: number, bb: flatbuffers.ByteBuffer): InferenceSession {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param InferenceSession= obj\n * @returns InferenceSession\n */\n static getRootAsInferenceSession(bb: flatbuffers.ByteBuffer, obj?: InferenceSession): InferenceSession {\n return (obj || new InferenceSession()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @param InferenceSession= obj\n * @returns InferenceSession\n */\n static getSizePrefixedRootAsInferenceSession(bb: flatbuffers.ByteBuffer, obj?: InferenceSession): InferenceSession {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new InferenceSession()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n }\n\n /**\n * @param flatbuffers.ByteBuffer bb\n * @returns boolean\n */\n static bufferHasIdentifier(bb: flatbuffers.ByteBuffer): boolean {\n return bb.__has_identifier('ORTM');\n }\n\n /**\n * @param flatbuffers.Encoding= optionalEncoding\n * @returns string|Uint8Array|null\n */\n ortVersion(): string|null;\n ortVersion(optionalEncoding: flatbuffers.Encoding): string|Uint8Array|null;\n ortVersion(optionalEncoding?: any): string|Uint8Array|null {\n let offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.Model= obj\n * @returns onnxruntime.experimental.fbs.Model|null\n */\n model(obj?: onnxruntime.experimental.fbs.Model): onnxruntime.experimental.fbs.Model|null {\n let offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? (obj || new onnxruntime.experimental.fbs.Model())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param onnxruntime.experimental.fbs.SessionState= obj\n * @returns onnxruntime.experimental.fbs.SessionState|null\n */\n sessionState(obj?: onnxruntime.experimental.fbs.SessionState): onnxruntime.experimental.fbs.SessionState|null {\n let offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? (obj || new onnxruntime.experimental.fbs.SessionState())\n .__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) :\n null;\n }\n\n /**\n * @param flatbuffers.Builder builder\n */\n static startInferenceSession(builder: flatbuffers.Builder) {\n builder.startObject(3);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset ortVersionOffset\n */\n static addOrtVersion(builder: flatbuffers.Builder, ortVersionOffset: flatbuffers.Offset) {\n builder.addFieldOffset(0, ortVersionOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset modelOffset\n */\n static addModel(builder: flatbuffers.Builder, modelOffset: flatbuffers.Offset) {\n builder.addFieldOffset(1, modelOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset sessionStateOffset\n */\n static addSessionState(builder: flatbuffers.Builder, sessionStateOffset: flatbuffers.Offset) {\n builder.addFieldOffset(2, sessionStateOffset, 0);\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @returns flatbuffers.Offset\n */\n static endInferenceSession(builder: flatbuffers.Builder): flatbuffers.Offset {\n let offset = builder.endObject();\n return offset;\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset offset\n */\n static finishInferenceSessionBuffer(builder: flatbuffers.Builder, offset: flatbuffers.Offset) {\n builder.finish(offset, 'ORTM');\n }\n\n /**\n * @param flatbuffers.Builder builder\n * @param flatbuffers.Offset offset\n */\n static finishSizePrefixedInferenceSessionBuffer(builder: flatbuffers.Builder, offset: flatbuffers.Offset) {\n builder.finish(offset, 'ORTM', true);\n }\n\n static createInferenceSession(\n builder: flatbuffers.Builder, ortVersionOffset: flatbuffers.Offset, modelOffset: flatbuffers.Offset,\n sessionStateOffset: flatbuffers.Offset): flatbuffers.Offset {\n InferenceSession.startInferenceSession(builder);\n InferenceSession.addOrtVersion(builder, ortVersionOffset);\n InferenceSession.addModel(builder, modelOffset);\n InferenceSession.addSessionState(builder, sessionStateOffset);\n return InferenceSession.endInferenceSession(builder);\n }\n }\n}\n", "\"use strict\";\r\nmodule.exports = asPromise;\r\n\r\n/**\r\n * Callback as used by {@link util.asPromise}.\r\n * @typedef asPromiseCallback\r\n * @type {function}\r\n * @param {Error|null} error Error, if any\r\n * @param {...*} params Additional arguments\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Returns a promise from a node-style callback function.\r\n * @memberof util\r\n * @param {asPromiseCallback} fn Function to call\r\n * @param {*} ctx Function context\r\n * @param {...*} params Function arguments\r\n * @returns {Promise<*>} Promisified function\r\n */\r\nfunction asPromise(fn, ctx/*, varargs */) {\r\n var params = new Array(arguments.length - 1),\r\n offset = 0,\r\n index = 2,\r\n pending = true;\r\n while (index < arguments.length)\r\n params[offset++] = arguments[index++];\r\n return new Promise(function executor(resolve, reject) {\r\n params[offset] = function callback(err/*, varargs */) {\r\n if (pending) {\r\n pending = false;\r\n if (err)\r\n reject(err);\r\n else {\r\n var params = new Array(arguments.length - 1),\r\n offset = 0;\r\n while (offset < params.length)\r\n params[offset++] = arguments[offset];\r\n resolve.apply(null, params);\r\n }\r\n }\r\n };\r\n try {\r\n fn.apply(ctx || null, params);\r\n } catch (err) {\r\n if (pending) {\r\n pending = false;\r\n reject(err);\r\n }\r\n }\r\n });\r\n}\r\n", "\"use strict\";\r\n\r\n/**\r\n * A minimal base64 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar base64 = exports;\r\n\r\n/**\r\n * Calculates the byte length of a base64 encoded string.\r\n * @param {string} string Base64 encoded string\r\n * @returns {number} Byte length\r\n */\r\nbase64.length = function length(string) {\r\n var p = string.length;\r\n if (!p)\r\n return 0;\r\n var n = 0;\r\n while (--p % 4 > 1 && string.charAt(p) === \"=\")\r\n ++n;\r\n return Math.ceil(string.length * 3) / 4 - n;\r\n};\r\n\r\n// Base64 encoding table\r\nvar b64 = new Array(64);\r\n\r\n// Base64 decoding table\r\nvar s64 = new Array(123);\r\n\r\n// 65..90, 97..122, 48..57, 43, 47\r\nfor (var i = 0; i < 64;)\r\n s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\r\n\r\n/**\r\n * Encodes a buffer to a base64 encoded string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} Base64 encoded string\r\n */\r\nbase64.encode = function encode(buffer, start, end) {\r\n var parts = null,\r\n chunk = [];\r\n var i = 0, // output index\r\n j = 0, // goto index\r\n t; // temporary\r\n while (start < end) {\r\n var b = buffer[start++];\r\n switch (j) {\r\n case 0:\r\n chunk[i++] = b64[b >> 2];\r\n t = (b & 3) << 4;\r\n j = 1;\r\n break;\r\n case 1:\r\n chunk[i++] = b64[t | b >> 4];\r\n t = (b & 15) << 2;\r\n j = 2;\r\n break;\r\n case 2:\r\n chunk[i++] = b64[t | b >> 6];\r\n chunk[i++] = b64[b & 63];\r\n j = 0;\r\n break;\r\n }\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (j) {\r\n chunk[i++] = b64[t];\r\n chunk[i++] = 61;\r\n if (j === 1)\r\n chunk[i++] = 61;\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\nvar invalidEncoding = \"invalid encoding\";\r\n\r\n/**\r\n * Decodes a base64 encoded string to a buffer.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Number of bytes written\r\n * @throws {Error} If encoding is invalid\r\n */\r\nbase64.decode = function decode(string, buffer, offset) {\r\n var start = offset;\r\n var j = 0, // goto index\r\n t; // temporary\r\n for (var i = 0; i < string.length;) {\r\n var c = string.charCodeAt(i++);\r\n if (c === 61 && j > 1)\r\n break;\r\n if ((c = s64[c]) === undefined)\r\n throw Error(invalidEncoding);\r\n switch (j) {\r\n case 0:\r\n t = c;\r\n j = 1;\r\n break;\r\n case 1:\r\n buffer[offset++] = t << 2 | (c & 48) >> 4;\r\n t = c;\r\n j = 2;\r\n break;\r\n case 2:\r\n buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2;\r\n t = c;\r\n j = 3;\r\n break;\r\n case 3:\r\n buffer[offset++] = (t & 3) << 6 | c;\r\n j = 0;\r\n break;\r\n }\r\n }\r\n if (j === 1)\r\n throw Error(invalidEncoding);\r\n return offset - start;\r\n};\r\n\r\n/**\r\n * Tests if the specified string appears to be base64 encoded.\r\n * @param {string} string String to test\r\n * @returns {boolean} `true` if probably base64 encoded, otherwise false\r\n */\r\nbase64.test = function test(string) {\r\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string);\r\n};\r\n", "\"use strict\";\r\nmodule.exports = EventEmitter;\r\n\r\n/**\r\n * Constructs a new event emitter instance.\r\n * @classdesc A minimal event emitter.\r\n * @memberof util\r\n * @constructor\r\n */\r\nfunction EventEmitter() {\r\n\r\n /**\r\n * Registered listeners.\r\n * @type {Object.}\r\n * @private\r\n */\r\n this._listeners = {};\r\n}\r\n\r\n/**\r\n * Registers an event listener.\r\n * @param {string} evt Event name\r\n * @param {function} fn Listener\r\n * @param {*} [ctx] Listener context\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.on = function on(evt, fn, ctx) {\r\n (this._listeners[evt] || (this._listeners[evt] = [])).push({\r\n fn : fn,\r\n ctx : ctx || this\r\n });\r\n return this;\r\n};\r\n\r\n/**\r\n * Removes an event listener or any matching listeners if arguments are omitted.\r\n * @param {string} [evt] Event name. Removes all listeners if omitted.\r\n * @param {function} [fn] Listener to remove. Removes all listeners of `evt` if omitted.\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.off = function off(evt, fn) {\r\n if (evt === undefined)\r\n this._listeners = {};\r\n else {\r\n if (fn === undefined)\r\n this._listeners[evt] = [];\r\n else {\r\n var listeners = this._listeners[evt];\r\n for (var i = 0; i < listeners.length;)\r\n if (listeners[i].fn === fn)\r\n listeners.splice(i, 1);\r\n else\r\n ++i;\r\n }\r\n }\r\n return this;\r\n};\r\n\r\n/**\r\n * Emits an event by calling its listeners with the specified arguments.\r\n * @param {string} evt Event name\r\n * @param {...*} args Arguments\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.emit = function emit(evt) {\r\n var listeners = this._listeners[evt];\r\n if (listeners) {\r\n var args = [],\r\n i = 1;\r\n for (; i < arguments.length;)\r\n args.push(arguments[i++]);\r\n for (i = 0; i < listeners.length;)\r\n listeners[i].fn.apply(listeners[i++].ctx, args);\r\n }\r\n return this;\r\n};\r\n", "\"use strict\";\r\n\r\nmodule.exports = factory(factory);\r\n\r\n/**\r\n * Reads / writes floats / doubles from / to buffers.\r\n * @name util.float\r\n * @namespace\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using little endian byte order.\r\n * @name util.float.writeFloatLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using big endian byte order.\r\n * @name util.float.writeFloatBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using little endian byte order.\r\n * @name util.float.readFloatLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using big endian byte order.\r\n * @name util.float.readFloatBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using little endian byte order.\r\n * @name util.float.writeDoubleLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using big endian byte order.\r\n * @name util.float.writeDoubleBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using little endian byte order.\r\n * @name util.float.readDoubleLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using big endian byte order.\r\n * @name util.float.readDoubleBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n// Factory function for the purpose of node-based testing in modified global environments\r\nfunction factory(exports) {\r\n\r\n // float: typed array\r\n if (typeof Float32Array !== \"undefined\") (function() {\r\n\r\n var f32 = new Float32Array([ -0 ]),\r\n f8b = new Uint8Array(f32.buffer),\r\n le = f8b[3] === 128;\r\n\r\n function writeFloat_f32_cpy(val, buf, pos) {\r\n f32[0] = val;\r\n buf[pos ] = f8b[0];\r\n buf[pos + 1] = f8b[1];\r\n buf[pos + 2] = f8b[2];\r\n buf[pos + 3] = f8b[3];\r\n }\r\n\r\n function writeFloat_f32_rev(val, buf, pos) {\r\n f32[0] = val;\r\n buf[pos ] = f8b[3];\r\n buf[pos + 1] = f8b[2];\r\n buf[pos + 2] = f8b[1];\r\n buf[pos + 3] = f8b[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev;\r\n /* istanbul ignore next */\r\n exports.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy;\r\n\r\n function readFloat_f32_cpy(buf, pos) {\r\n f8b[0] = buf[pos ];\r\n f8b[1] = buf[pos + 1];\r\n f8b[2] = buf[pos + 2];\r\n f8b[3] = buf[pos + 3];\r\n return f32[0];\r\n }\r\n\r\n function readFloat_f32_rev(buf, pos) {\r\n f8b[3] = buf[pos ];\r\n f8b[2] = buf[pos + 1];\r\n f8b[1] = buf[pos + 2];\r\n f8b[0] = buf[pos + 3];\r\n return f32[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev;\r\n /* istanbul ignore next */\r\n exports.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy;\r\n\r\n // float: ieee754\r\n })(); else (function() {\r\n\r\n function writeFloat_ieee754(writeUint, val, buf, pos) {\r\n var sign = val < 0 ? 1 : 0;\r\n if (sign)\r\n val = -val;\r\n if (val === 0)\r\n writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos);\r\n else if (isNaN(val))\r\n writeUint(2143289344, buf, pos);\r\n else if (val > 3.4028234663852886e+38) // +-Infinity\r\n writeUint((sign << 31 | 2139095040) >>> 0, buf, pos);\r\n else if (val < 1.1754943508222875e-38) // denormal\r\n writeUint((sign << 31 | Math.round(val / 1.401298464324817e-45)) >>> 0, buf, pos);\r\n else {\r\n var exponent = Math.floor(Math.log(val) / Math.LN2),\r\n mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607;\r\n writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos);\r\n }\r\n }\r\n\r\n exports.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE);\r\n exports.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE);\r\n\r\n function readFloat_ieee754(readUint, buf, pos) {\r\n var uint = readUint(buf, pos),\r\n sign = (uint >> 31) * 2 + 1,\r\n exponent = uint >>> 23 & 255,\r\n mantissa = uint & 8388607;\r\n return exponent === 255\r\n ? mantissa\r\n ? NaN\r\n : sign * Infinity\r\n : exponent === 0 // denormal\r\n ? sign * 1.401298464324817e-45 * mantissa\r\n : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608);\r\n }\r\n\r\n exports.readFloatLE = readFloat_ieee754.bind(null, readUintLE);\r\n exports.readFloatBE = readFloat_ieee754.bind(null, readUintBE);\r\n\r\n })();\r\n\r\n // double: typed array\r\n if (typeof Float64Array !== \"undefined\") (function() {\r\n\r\n var f64 = new Float64Array([-0]),\r\n f8b = new Uint8Array(f64.buffer),\r\n le = f8b[7] === 128;\r\n\r\n function writeDouble_f64_cpy(val, buf, pos) {\r\n f64[0] = val;\r\n buf[pos ] = f8b[0];\r\n buf[pos + 1] = f8b[1];\r\n buf[pos + 2] = f8b[2];\r\n buf[pos + 3] = f8b[3];\r\n buf[pos + 4] = f8b[4];\r\n buf[pos + 5] = f8b[5];\r\n buf[pos + 6] = f8b[6];\r\n buf[pos + 7] = f8b[7];\r\n }\r\n\r\n function writeDouble_f64_rev(val, buf, pos) {\r\n f64[0] = val;\r\n buf[pos ] = f8b[7];\r\n buf[pos + 1] = f8b[6];\r\n buf[pos + 2] = f8b[5];\r\n buf[pos + 3] = f8b[4];\r\n buf[pos + 4] = f8b[3];\r\n buf[pos + 5] = f8b[2];\r\n buf[pos + 6] = f8b[1];\r\n buf[pos + 7] = f8b[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev;\r\n /* istanbul ignore next */\r\n exports.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy;\r\n\r\n function readDouble_f64_cpy(buf, pos) {\r\n f8b[0] = buf[pos ];\r\n f8b[1] = buf[pos + 1];\r\n f8b[2] = buf[pos + 2];\r\n f8b[3] = buf[pos + 3];\r\n f8b[4] = buf[pos + 4];\r\n f8b[5] = buf[pos + 5];\r\n f8b[6] = buf[pos + 6];\r\n f8b[7] = buf[pos + 7];\r\n return f64[0];\r\n }\r\n\r\n function readDouble_f64_rev(buf, pos) {\r\n f8b[7] = buf[pos ];\r\n f8b[6] = buf[pos + 1];\r\n f8b[5] = buf[pos + 2];\r\n f8b[4] = buf[pos + 3];\r\n f8b[3] = buf[pos + 4];\r\n f8b[2] = buf[pos + 5];\r\n f8b[1] = buf[pos + 6];\r\n f8b[0] = buf[pos + 7];\r\n return f64[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev;\r\n /* istanbul ignore next */\r\n exports.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy;\r\n\r\n // double: ieee754\r\n })(); else (function() {\r\n\r\n function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) {\r\n var sign = val < 0 ? 1 : 0;\r\n if (sign)\r\n val = -val;\r\n if (val === 0) {\r\n writeUint(0, buf, pos + off0);\r\n writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos + off1);\r\n } else if (isNaN(val)) {\r\n writeUint(0, buf, pos + off0);\r\n writeUint(2146959360, buf, pos + off1);\r\n } else if (val > 1.7976931348623157e+308) { // +-Infinity\r\n writeUint(0, buf, pos + off0);\r\n writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1);\r\n } else {\r\n var mantissa;\r\n if (val < 2.2250738585072014e-308) { // denormal\r\n mantissa = val / 5e-324;\r\n writeUint(mantissa >>> 0, buf, pos + off0);\r\n writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1);\r\n } else {\r\n var exponent = Math.floor(Math.log(val) / Math.LN2);\r\n if (exponent === 1024)\r\n exponent = 1023;\r\n mantissa = val * Math.pow(2, -exponent);\r\n writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0);\r\n writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1);\r\n }\r\n }\r\n }\r\n\r\n exports.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4);\r\n exports.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0);\r\n\r\n function readDouble_ieee754(readUint, off0, off1, buf, pos) {\r\n var lo = readUint(buf, pos + off0),\r\n hi = readUint(buf, pos + off1);\r\n var sign = (hi >> 31) * 2 + 1,\r\n exponent = hi >>> 20 & 2047,\r\n mantissa = 4294967296 * (hi & 1048575) + lo;\r\n return exponent === 2047\r\n ? mantissa\r\n ? NaN\r\n : sign * Infinity\r\n : exponent === 0 // denormal\r\n ? sign * 5e-324 * mantissa\r\n : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496);\r\n }\r\n\r\n exports.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4);\r\n exports.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0);\r\n\r\n })();\r\n\r\n return exports;\r\n}\r\n\r\n// uint helpers\r\n\r\nfunction writeUintLE(val, buf, pos) {\r\n buf[pos ] = val & 255;\r\n buf[pos + 1] = val >>> 8 & 255;\r\n buf[pos + 2] = val >>> 16 & 255;\r\n buf[pos + 3] = val >>> 24;\r\n}\r\n\r\nfunction writeUintBE(val, buf, pos) {\r\n buf[pos ] = val >>> 24;\r\n buf[pos + 1] = val >>> 16 & 255;\r\n buf[pos + 2] = val >>> 8 & 255;\r\n buf[pos + 3] = val & 255;\r\n}\r\n\r\nfunction readUintLE(buf, pos) {\r\n return (buf[pos ]\r\n | buf[pos + 1] << 8\r\n | buf[pos + 2] << 16\r\n | buf[pos + 3] << 24) >>> 0;\r\n}\r\n\r\nfunction readUintBE(buf, pos) {\r\n return (buf[pos ] << 24\r\n | buf[pos + 1] << 16\r\n | buf[pos + 2] << 8\r\n | buf[pos + 3]) >>> 0;\r\n}\r\n", "\"use strict\";\r\nmodule.exports = inquire;\r\n\r\n/**\r\n * Requires a module only if available.\r\n * @memberof util\r\n * @param {string} moduleName Module to require\r\n * @returns {?Object} Required module if available and not empty, otherwise `null`\r\n */\r\nfunction inquire(moduleName) {\r\n try {\r\n var mod = eval(\"quire\".replace(/^/,\"re\"))(moduleName); // eslint-disable-line no-eval\r\n if (mod && (mod.length || Object.keys(mod).length))\r\n return mod;\r\n } catch (e) {} // eslint-disable-line no-empty\r\n return null;\r\n}\r\n", "\"use strict\";\r\n\r\n/**\r\n * A minimal UTF8 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar utf8 = exports;\r\n\r\n/**\r\n * Calculates the UTF8 byte length of a string.\r\n * @param {string} string String\r\n * @returns {number} Byte length\r\n */\r\nutf8.length = function utf8_length(string) {\r\n var len = 0,\r\n c = 0;\r\n for (var i = 0; i < string.length; ++i) {\r\n c = string.charCodeAt(i);\r\n if (c < 128)\r\n len += 1;\r\n else if (c < 2048)\r\n len += 2;\r\n else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\r\n ++i;\r\n len += 4;\r\n } else\r\n len += 3;\r\n }\r\n return len;\r\n};\r\n\r\n/**\r\n * Reads UTF8 bytes as a string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} String read\r\n */\r\nutf8.read = function utf8_read(buffer, start, end) {\r\n var len = end - start;\r\n if (len < 1)\r\n return \"\";\r\n var parts = null,\r\n chunk = [],\r\n i = 0, // char offset\r\n t; // temporary\r\n while (start < end) {\r\n t = buffer[start++];\r\n if (t < 128)\r\n chunk[i++] = t;\r\n else if (t > 191 && t < 224)\r\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n else if (t > 239 && t < 365) {\r\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n chunk[i++] = 0xD800 + (t >> 10);\r\n chunk[i++] = 0xDC00 + (t & 1023);\r\n } else\r\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\n/**\r\n * Writes a string as UTF8 bytes.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Bytes written\r\n */\r\nutf8.write = function utf8_write(string, buffer, offset) {\r\n var start = offset,\r\n c1, // character 1\r\n c2; // character 2\r\n for (var i = 0; i < string.length; ++i) {\r\n c1 = string.charCodeAt(i);\r\n if (c1 < 128) {\r\n buffer[offset++] = c1;\r\n } else if (c1 < 2048) {\r\n buffer[offset++] = c1 >> 6 | 192;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\r\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\r\n ++i;\r\n buffer[offset++] = c1 >> 18 | 240;\r\n buffer[offset++] = c1 >> 12 & 63 | 128;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else {\r\n buffer[offset++] = c1 >> 12 | 224;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n }\r\n }\r\n return offset - start;\r\n};\r\n", "\"use strict\";\r\nmodule.exports = pool;\r\n\r\n/**\r\n * An allocator as used by {@link util.pool}.\r\n * @typedef PoolAllocator\r\n * @type {function}\r\n * @param {number} size Buffer size\r\n * @returns {Uint8Array} Buffer\r\n */\r\n\r\n/**\r\n * A slicer as used by {@link util.pool}.\r\n * @typedef PoolSlicer\r\n * @type {function}\r\n * @param {number} start Start offset\r\n * @param {number} end End offset\r\n * @returns {Uint8Array} Buffer slice\r\n * @this {Uint8Array}\r\n */\r\n\r\n/**\r\n * A general purpose buffer pool.\r\n * @memberof util\r\n * @function\r\n * @param {PoolAllocator} alloc Allocator\r\n * @param {PoolSlicer} slice Slicer\r\n * @param {number} [size=8192] Slab size\r\n * @returns {PoolAllocator} Pooled allocator\r\n */\r\nfunction pool(alloc, slice, size) {\r\n var SIZE = size || 8192;\r\n var MAX = SIZE >>> 1;\r\n var slab = null;\r\n var offset = SIZE;\r\n return function pool_alloc(size) {\r\n if (size < 1 || size > MAX)\r\n return alloc(size);\r\n if (offset + size > SIZE) {\r\n slab = alloc(SIZE);\r\n offset = 0;\r\n }\r\n var buf = slice.call(slab, offset, offset += size);\r\n if (offset & 7) // align to 32 bit\r\n offset = (offset | 7) + 1;\r\n return buf;\r\n };\r\n}\r\n", "\"use strict\";\nmodule.exports = LongBits;\n\nvar util = require(\"../util/minimal\");\n\n/**\n * Constructs new long bits.\n * @classdesc Helper class for working with the low and high bits of a 64 bit value.\n * @memberof util\n * @constructor\n * @param {number} lo Low 32 bits, unsigned\n * @param {number} hi High 32 bits, unsigned\n */\nfunction LongBits(lo, hi) {\n\n // note that the casts below are theoretically unnecessary as of today, but older statically\n // generated converter code might still call the ctor with signed 32bits. kept for compat.\n\n /**\n * Low bits.\n * @type {number}\n */\n this.lo = lo >>> 0;\n\n /**\n * High bits.\n * @type {number}\n */\n this.hi = hi >>> 0;\n}\n\n/**\n * Zero bits.\n * @memberof util.LongBits\n * @type {util.LongBits}\n */\nvar zero = LongBits.zero = new LongBits(0, 0);\n\nzero.toNumber = function() { return 0; };\nzero.zzEncode = zero.zzDecode = function() { return this; };\nzero.length = function() { return 1; };\n\n/**\n * Zero hash.\n * @memberof util.LongBits\n * @type {string}\n */\nvar zeroHash = LongBits.zeroHash = \"\\0\\0\\0\\0\\0\\0\\0\\0\";\n\n/**\n * Constructs new long bits from the specified number.\n * @param {number} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.fromNumber = function fromNumber(value) {\n if (value === 0)\n return zero;\n var sign = value < 0;\n if (sign)\n value = -value;\n var lo = value >>> 0,\n hi = (value - lo) / 4294967296 >>> 0;\n if (sign) {\n hi = ~hi >>> 0;\n lo = ~lo >>> 0;\n if (++lo > 4294967295) {\n lo = 0;\n if (++hi > 4294967295)\n hi = 0;\n }\n }\n return new LongBits(lo, hi);\n};\n\n/**\n * Constructs new long bits from a number, long or string.\n * @param {Long|number|string} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.from = function from(value) {\n if (typeof value === \"number\")\n return LongBits.fromNumber(value);\n if (util.isString(value)) {\n /* istanbul ignore else */\n if (util.Long)\n value = util.Long.fromString(value);\n else\n return LongBits.fromNumber(parseInt(value, 10));\n }\n return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero;\n};\n\n/**\n * Converts this long bits to a possibly unsafe JavaScript number.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {number} Possibly unsafe number\n */\nLongBits.prototype.toNumber = function toNumber(unsigned) {\n if (!unsigned && this.hi >>> 31) {\n var lo = ~this.lo + 1 >>> 0,\n hi = ~this.hi >>> 0;\n if (!lo)\n hi = hi + 1 >>> 0;\n return -(lo + hi * 4294967296);\n }\n return this.lo + this.hi * 4294967296;\n};\n\n/**\n * Converts this long bits to a long.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long} Long\n */\nLongBits.prototype.toLong = function toLong(unsigned) {\n return util.Long\n ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned))\n /* istanbul ignore next */\n : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) };\n};\n\nvar charCodeAt = String.prototype.charCodeAt;\n\n/**\n * Constructs new long bits from the specified 8 characters long hash.\n * @param {string} hash Hash\n * @returns {util.LongBits} Bits\n */\nLongBits.fromHash = function fromHash(hash) {\n if (hash === zeroHash)\n return zero;\n return new LongBits(\n ( charCodeAt.call(hash, 0)\n | charCodeAt.call(hash, 1) << 8\n | charCodeAt.call(hash, 2) << 16\n | charCodeAt.call(hash, 3) << 24) >>> 0\n ,\n ( charCodeAt.call(hash, 4)\n | charCodeAt.call(hash, 5) << 8\n | charCodeAt.call(hash, 6) << 16\n | charCodeAt.call(hash, 7) << 24) >>> 0\n );\n};\n\n/**\n * Converts this long bits to a 8 characters long hash.\n * @returns {string} Hash\n */\nLongBits.prototype.toHash = function toHash() {\n return String.fromCharCode(\n this.lo & 255,\n this.lo >>> 8 & 255,\n this.lo >>> 16 & 255,\n this.lo >>> 24 ,\n this.hi & 255,\n this.hi >>> 8 & 255,\n this.hi >>> 16 & 255,\n this.hi >>> 24\n );\n};\n\n/**\n * Zig-zag encodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzEncode = function zzEncode() {\n var mask = this.hi >> 31;\n this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0;\n this.lo = ( this.lo << 1 ^ mask) >>> 0;\n return this;\n};\n\n/**\n * Zig-zag decodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzDecode = function zzDecode() {\n var mask = -(this.lo & 1);\n this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0;\n this.hi = ( this.hi >>> 1 ^ mask) >>> 0;\n return this;\n};\n\n/**\n * Calculates the length of this longbits when encoded as a varint.\n * @returns {number} Length\n */\nLongBits.prototype.length = function length() {\n var part0 = this.lo,\n part1 = (this.lo >>> 28 | this.hi << 4) >>> 0,\n part2 = this.hi >>> 24;\n return part2 === 0\n ? part1 === 0\n ? part0 < 16384\n ? part0 < 128 ? 1 : 2\n : part0 < 2097152 ? 3 : 4\n : part1 < 16384\n ? part1 < 128 ? 5 : 6\n : part1 < 2097152 ? 7 : 8\n : part2 < 128 ? 9 : 10;\n};\n", "\"use strict\";\nvar util = exports;\n\n// used to return a Promise where callback is omitted\nutil.asPromise = require(\"@protobufjs/aspromise\");\n\n// converts to / from base64 encoded strings\nutil.base64 = require(\"@protobufjs/base64\");\n\n// base class of rpc.Service\nutil.EventEmitter = require(\"@protobufjs/eventemitter\");\n\n// float handling accross browsers\nutil.float = require(\"@protobufjs/float\");\n\n// requires modules optionally and hides the call from bundlers\nutil.inquire = require(\"@protobufjs/inquire\");\n\n// converts to / from utf8 encoded strings\nutil.utf8 = require(\"@protobufjs/utf8\");\n\n// provides a node-like buffer pool in the browser\nutil.pool = require(\"@protobufjs/pool\");\n\n// utility to work with the low and high bits of a 64 bit value\nutil.LongBits = require(\"./longbits\");\n\n/**\n * Whether running within node or not.\n * @memberof util\n * @type {boolean}\n */\nutil.isNode = Boolean(typeof global !== \"undefined\"\n && global\n && global.process\n && global.process.versions\n && global.process.versions.node);\n\n/**\n * Global object reference.\n * @memberof util\n * @type {Object}\n */\nutil.global = util.isNode && global\n || typeof window !== \"undefined\" && window\n || typeof self !== \"undefined\" && self\n || this; // eslint-disable-line no-invalid-this\n\n/**\n * An immuable empty array.\n * @memberof util\n * @type {Array.<*>}\n * @const\n */\nutil.emptyArray = Object.freeze ? Object.freeze([]) : /* istanbul ignore next */ []; // used on prototypes\n\n/**\n * An immutable empty object.\n * @type {Object}\n * @const\n */\nutil.emptyObject = Object.freeze ? Object.freeze({}) : /* istanbul ignore next */ {}; // used on prototypes\n\n/**\n * Tests if the specified value is an integer.\n * @function\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is an integer\n */\nutil.isInteger = Number.isInteger || /* istanbul ignore next */ function isInteger(value) {\n return typeof value === \"number\" && isFinite(value) && Math.floor(value) === value;\n};\n\n/**\n * Tests if the specified value is a string.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a string\n */\nutil.isString = function isString(value) {\n return typeof value === \"string\" || value instanceof String;\n};\n\n/**\n * Tests if the specified value is a non-null object.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a non-null object\n */\nutil.isObject = function isObject(value) {\n return value && typeof value === \"object\";\n};\n\n/**\n * Checks if a property on a message is considered to be present.\n * This is an alias of {@link util.isSet}.\n * @function\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isset =\n\n/**\n * Checks if a property on a message is considered to be present.\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isSet = function isSet(obj, prop) {\n var value = obj[prop];\n if (value != null && obj.hasOwnProperty(prop)) // eslint-disable-line eqeqeq, no-prototype-builtins\n return typeof value !== \"object\" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0;\n return false;\n};\n\n/**\n * Any compatible Buffer instance.\n * This is a minimal stand-alone definition of a Buffer instance. The actual type is that exported by node's typings.\n * @interface Buffer\n * @extends Uint8Array\n */\n\n/**\n * Node's Buffer class if available.\n * @type {Constructor}\n */\nutil.Buffer = (function() {\n try {\n var Buffer = util.inquire(\"buffer\").Buffer;\n // refuse to use non-node buffers if not explicitly assigned (perf reasons):\n return Buffer.prototype.utf8Write ? Buffer : /* istanbul ignore next */ null;\n } catch (e) {\n /* istanbul ignore next */\n return null;\n }\n})();\n\n// Internal alias of or polyfull for Buffer.from.\nutil._Buffer_from = null;\n\n// Internal alias of or polyfill for Buffer.allocUnsafe.\nutil._Buffer_allocUnsafe = null;\n\n/**\n * Creates a new buffer of whatever type supported by the environment.\n * @param {number|number[]} [sizeOrArray=0] Buffer size or number array\n * @returns {Uint8Array|Buffer} Buffer\n */\nutil.newBuffer = function newBuffer(sizeOrArray) {\n /* istanbul ignore next */\n return typeof sizeOrArray === \"number\"\n ? util.Buffer\n ? util._Buffer_allocUnsafe(sizeOrArray)\n : new util.Array(sizeOrArray)\n : util.Buffer\n ? util._Buffer_from(sizeOrArray)\n : typeof Uint8Array === \"undefined\"\n ? sizeOrArray\n : new Uint8Array(sizeOrArray);\n};\n\n/**\n * Array implementation used in the browser. `Uint8Array` if supported, otherwise `Array`.\n * @type {Constructor}\n */\nutil.Array = typeof Uint8Array !== \"undefined\" ? Uint8Array /* istanbul ignore next */ : Array;\n\n/**\n * Any compatible Long instance.\n * This is a minimal stand-alone definition of a Long instance. The actual type is that exported by long.js.\n * @interface Long\n * @property {number} low Low bits\n * @property {number} high High bits\n * @property {boolean} unsigned Whether unsigned or not\n */\n\n/**\n * Long.js's Long class if available.\n * @type {Constructor}\n */\nutil.Long = /* istanbul ignore next */ util.global.dcodeIO && /* istanbul ignore next */ util.global.dcodeIO.Long\n || /* istanbul ignore next */ util.global.Long\n || util.inquire(\"long\");\n\n/**\n * Regular expression used to verify 2 bit (`bool`) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key2Re = /^true|false|0|1$/;\n\n/**\n * Regular expression used to verify 32 bit (`int32` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key32Re = /^-?(?:0|[1-9][0-9]*)$/;\n\n/**\n * Regular expression used to verify 64 bit (`int64` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key64Re = /^(?:[\\\\x00-\\\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;\n\n/**\n * Converts a number or long to an 8 characters long hash string.\n * @param {Long|number} value Value to convert\n * @returns {string} Hash\n */\nutil.longToHash = function longToHash(value) {\n return value\n ? util.LongBits.from(value).toHash()\n : util.LongBits.zeroHash;\n};\n\n/**\n * Converts an 8 characters long hash string to a long or number.\n * @param {string} hash Hash\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long|number} Original value\n */\nutil.longFromHash = function longFromHash(hash, unsigned) {\n var bits = util.LongBits.fromHash(hash);\n if (util.Long)\n return util.Long.fromBits(bits.lo, bits.hi, unsigned);\n return bits.toNumber(Boolean(unsigned));\n};\n\n/**\n * Merges the properties of the source object into the destination object.\n * @memberof util\n * @param {Object.} dst Destination object\n * @param {Object.} src Source object\n * @param {boolean} [ifNotSet=false] Merges only if the key is not already set\n * @returns {Object.} Destination object\n */\nfunction merge(dst, src, ifNotSet) { // used by converters\n for (var keys = Object.keys(src), i = 0; i < keys.length; ++i)\n if (dst[keys[i]] === undefined || !ifNotSet)\n dst[keys[i]] = src[keys[i]];\n return dst;\n}\n\nutil.merge = merge;\n\n/**\n * Converts the first character of a string to lower case.\n * @param {string} str String to convert\n * @returns {string} Converted string\n */\nutil.lcFirst = function lcFirst(str) {\n return str.charAt(0).toLowerCase() + str.substring(1);\n};\n\n/**\n * Creates a custom error constructor.\n * @memberof util\n * @param {string} name Error name\n * @returns {Constructor} Custom error constructor\n */\nfunction newError(name) {\n\n function CustomError(message, properties) {\n\n if (!(this instanceof CustomError))\n return new CustomError(message, properties);\n\n // Error.call(this, message);\n // ^ just returns a new error instance because the ctor can be called as a function\n\n Object.defineProperty(this, \"message\", { get: function() { return message; } });\n\n /* istanbul ignore next */\n if (Error.captureStackTrace) // node\n Error.captureStackTrace(this, CustomError);\n else\n Object.defineProperty(this, \"stack\", { value: new Error().stack || \"\" });\n\n if (properties)\n merge(this, properties);\n }\n\n CustomError.prototype = Object.create(Error.prototype, {\n constructor: {\n value: CustomError,\n writable: true,\n enumerable: false,\n configurable: true,\n },\n name: {\n get: function get() { return name; },\n set: undefined,\n enumerable: false,\n // configurable: false would accurately preserve the behavior of\n // the original, but I'm guessing that was not intentional.\n // For an actual error subclass, this property would\n // be configurable.\n configurable: true,\n },\n toString: {\n value: function value() { return this.name + \": \" + this.message; },\n writable: true,\n enumerable: false,\n configurable: true,\n },\n });\n\n return CustomError;\n}\n\nutil.newError = newError;\n\n/**\n * Constructs a new protocol error.\n * @classdesc Error subclass indicating a protocol specifc error.\n * @memberof util\n * @extends Error\n * @template T extends Message\n * @constructor\n * @param {string} message Error message\n * @param {Object.} [properties] Additional properties\n * @example\n * try {\n * MyMessage.decode(someBuffer); // throws if required fields are missing\n * } catch (e) {\n * if (e instanceof ProtocolError && e.instance)\n * console.log(\"decoded so far: \" + JSON.stringify(e.instance));\n * }\n */\nutil.ProtocolError = newError(\"ProtocolError\");\n\n/**\n * So far decoded message instance.\n * @name util.ProtocolError#instance\n * @type {Message}\n */\n\n/**\n * A OneOf getter as returned by {@link util.oneOfGetter}.\n * @typedef OneOfGetter\n * @type {function}\n * @returns {string|undefined} Set field name, if any\n */\n\n/**\n * Builds a getter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfGetter} Unbound getter\n */\nutil.oneOfGetter = function getOneOf(fieldNames) {\n var fieldMap = {};\n for (var i = 0; i < fieldNames.length; ++i)\n fieldMap[fieldNames[i]] = 1;\n\n /**\n * @returns {string|undefined} Set field name, if any\n * @this Object\n * @ignore\n */\n return function() { // eslint-disable-line consistent-return\n for (var keys = Object.keys(this), i = keys.length - 1; i > -1; --i)\n if (fieldMap[keys[i]] === 1 && this[keys[i]] !== undefined && this[keys[i]] !== null)\n return keys[i];\n };\n};\n\n/**\n * A OneOf setter as returned by {@link util.oneOfSetter}.\n * @typedef OneOfSetter\n * @type {function}\n * @param {string|undefined} value Field name\n * @returns {undefined}\n */\n\n/**\n * Builds a setter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfSetter} Unbound setter\n */\nutil.oneOfSetter = function setOneOf(fieldNames) {\n\n /**\n * @param {string} name Field name\n * @returns {undefined}\n * @this Object\n * @ignore\n */\n return function(name) {\n for (var i = 0; i < fieldNames.length; ++i)\n if (fieldNames[i] !== name)\n delete this[fieldNames[i]];\n };\n};\n\n/**\n * Default conversion options used for {@link Message#toJSON} implementations.\n *\n * These options are close to proto3's JSON mapping with the exception that internal types like Any are handled just like messages. More precisely:\n *\n * - Longs become strings\n * - Enums become string keys\n * - Bytes become base64 encoded strings\n * - (Sub-)Messages become plain objects\n * - Maps become plain objects with all string keys\n * - Repeated fields become arrays\n * - NaN and Infinity for float and double fields become strings\n *\n * @type {IConversionOptions}\n * @see https://developers.google.com/protocol-buffers/docs/proto3?hl=en#json\n */\nutil.toJSONOptions = {\n longs: String,\n enums: String,\n bytes: String,\n json: true\n};\n\n// Sets up buffer utility according to the environment (called in index-minimal)\nutil._configure = function() {\n var Buffer = util.Buffer;\n /* istanbul ignore if */\n if (!Buffer) {\n util._Buffer_from = util._Buffer_allocUnsafe = null;\n return;\n }\n // because node 4.x buffers are incompatible & immutable\n // see: https://github.com/dcodeIO/protobuf.js/pull/665\n util._Buffer_from = Buffer.from !== Uint8Array.from && Buffer.from ||\n /* istanbul ignore next */\n function Buffer_from(value, encoding) {\n return new Buffer(value, encoding);\n };\n util._Buffer_allocUnsafe = Buffer.allocUnsafe ||\n /* istanbul ignore next */\n function Buffer_allocUnsafe(size) {\n return new Buffer(size);\n };\n};\n", "\"use strict\";\nmodule.exports = Writer;\n\nvar util = require(\"./util/minimal\");\n\nvar BufferWriter; // cyclic\n\nvar LongBits = util.LongBits,\n base64 = util.base64,\n utf8 = util.utf8;\n\n/**\n * Constructs a new writer operation instance.\n * @classdesc Scheduled writer operation.\n * @constructor\n * @param {function(*, Uint8Array, number)} fn Function to call\n * @param {number} len Value byte length\n * @param {*} val Value to write\n * @ignore\n */\nfunction Op(fn, len, val) {\n\n /**\n * Function to call.\n * @type {function(Uint8Array, number, *)}\n */\n this.fn = fn;\n\n /**\n * Value byte length.\n * @type {number}\n */\n this.len = len;\n\n /**\n * Next operation.\n * @type {Writer.Op|undefined}\n */\n this.next = undefined;\n\n /**\n * Value to write.\n * @type {*}\n */\n this.val = val; // type varies\n}\n\n/* istanbul ignore next */\nfunction noop() {} // eslint-disable-line no-empty-function\n\n/**\n * Constructs a new writer state instance.\n * @classdesc Copied writer state.\n * @memberof Writer\n * @constructor\n * @param {Writer} writer Writer to copy state from\n * @ignore\n */\nfunction State(writer) {\n\n /**\n * Current head.\n * @type {Writer.Op}\n */\n this.head = writer.head;\n\n /**\n * Current tail.\n * @type {Writer.Op}\n */\n this.tail = writer.tail;\n\n /**\n * Current buffer length.\n * @type {number}\n */\n this.len = writer.len;\n\n /**\n * Next state.\n * @type {State|null}\n */\n this.next = writer.states;\n}\n\n/**\n * Constructs a new writer instance.\n * @classdesc Wire format writer using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n */\nfunction Writer() {\n\n /**\n * Current length.\n * @type {number}\n */\n this.len = 0;\n\n /**\n * Operations head.\n * @type {Object}\n */\n this.head = new Op(noop, 0, 0);\n\n /**\n * Operations tail\n * @type {Object}\n */\n this.tail = this.head;\n\n /**\n * Linked forked states.\n * @type {Object|null}\n */\n this.states = null;\n\n // When a value is written, the writer calculates its byte length and puts it into a linked\n // list of operations to perform when finish() is called. This both allows us to allocate\n // buffers of the exact required size and reduces the amount of work we have to do compared\n // to first calculating over objects and then encoding over objects. In our case, the encoding\n // part is just a linked list walk calling operations with already prepared values.\n}\n\nvar create = function create() {\n return util.Buffer\n ? function create_buffer_setup() {\n return (Writer.create = function create_buffer() {\n return new BufferWriter();\n })();\n }\n /* istanbul ignore next */\n : function create_array() {\n return new Writer();\n };\n};\n\n/**\n * Creates a new writer.\n * @function\n * @returns {BufferWriter|Writer} A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer}\n */\nWriter.create = create();\n\n/**\n * Allocates a buffer of the specified size.\n * @param {number} size Buffer size\n * @returns {Uint8Array} Buffer\n */\nWriter.alloc = function alloc(size) {\n return new util.Array(size);\n};\n\n// Use Uint8Array buffer pool in the browser, just like node does with buffers\n/* istanbul ignore else */\nif (util.Array !== Array)\n Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray);\n\n/**\n * Pushes a new operation to the queue.\n * @param {function(Uint8Array, number, *)} fn Function to call\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @returns {Writer} `this`\n * @private\n */\nWriter.prototype._push = function push(fn, len, val) {\n this.tail = this.tail.next = new Op(fn, len, val);\n this.len += len;\n return this;\n};\n\nfunction writeByte(val, buf, pos) {\n buf[pos] = val & 255;\n}\n\nfunction writeVarint32(val, buf, pos) {\n while (val > 127) {\n buf[pos++] = val & 127 | 128;\n val >>>= 7;\n }\n buf[pos] = val;\n}\n\n/**\n * Constructs a new varint writer operation instance.\n * @classdesc Scheduled varint writer operation.\n * @extends Op\n * @constructor\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @ignore\n */\nfunction VarintOp(len, val) {\n this.len = len;\n this.next = undefined;\n this.val = val;\n}\n\nVarintOp.prototype = Object.create(Op.prototype);\nVarintOp.prototype.fn = writeVarint32;\n\n/**\n * Writes an unsigned 32 bit value as a varint.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.uint32 = function write_uint32(value) {\n // here, the call to this.push has been inlined and a varint specific Op subclass is used.\n // uint32 is by far the most frequently used operation and benefits significantly from this.\n this.len += (this.tail = this.tail.next = new VarintOp(\n (value = value >>> 0)\n < 128 ? 1\n : value < 16384 ? 2\n : value < 2097152 ? 3\n : value < 268435456 ? 4\n : 5,\n value)).len;\n return this;\n};\n\n/**\n * Writes a signed 32 bit value as a varint.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.int32 = function write_int32(value) {\n return value < 0\n ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) // 10 bytes per spec\n : this.uint32(value);\n};\n\n/**\n * Writes a 32 bit value as a varint, zig-zag encoded.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sint32 = function write_sint32(value) {\n return this.uint32((value << 1 ^ value >> 31) >>> 0);\n};\n\nfunction writeVarint64(val, buf, pos) {\n while (val.hi) {\n buf[pos++] = val.lo & 127 | 128;\n val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0;\n val.hi >>>= 7;\n }\n while (val.lo > 127) {\n buf[pos++] = val.lo & 127 | 128;\n val.lo = val.lo >>> 7;\n }\n buf[pos++] = val.lo;\n}\n\n/**\n * Writes an unsigned 64 bit value as a varint.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.uint64 = function write_uint64(value) {\n var bits = LongBits.from(value);\n return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a signed 64 bit value as a varint.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.int64 = Writer.prototype.uint64;\n\n/**\n * Writes a signed 64 bit value as a varint, zig-zag encoded.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sint64 = function write_sint64(value) {\n var bits = LongBits.from(value).zzEncode();\n return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a boolish value as a varint.\n * @param {boolean} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bool = function write_bool(value) {\n return this._push(writeByte, 1, value ? 1 : 0);\n};\n\nfunction writeFixed32(val, buf, pos) {\n buf[pos ] = val & 255;\n buf[pos + 1] = val >>> 8 & 255;\n buf[pos + 2] = val >>> 16 & 255;\n buf[pos + 3] = val >>> 24;\n}\n\n/**\n * Writes an unsigned 32 bit value as fixed 32 bits.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.fixed32 = function write_fixed32(value) {\n return this._push(writeFixed32, 4, value >>> 0);\n};\n\n/**\n * Writes a signed 32 bit value as fixed 32 bits.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sfixed32 = Writer.prototype.fixed32;\n\n/**\n * Writes an unsigned 64 bit value as fixed 64 bits.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.fixed64 = function write_fixed64(value) {\n var bits = LongBits.from(value);\n return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi);\n};\n\n/**\n * Writes a signed 64 bit value as fixed 64 bits.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sfixed64 = Writer.prototype.fixed64;\n\n/**\n * Writes a float (32 bit).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.float = function write_float(value) {\n return this._push(util.float.writeFloatLE, 4, value);\n};\n\n/**\n * Writes a double (64 bit float).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.double = function write_double(value) {\n return this._push(util.float.writeDoubleLE, 8, value);\n};\n\nvar writeBytes = util.Array.prototype.set\n ? function writeBytes_set(val, buf, pos) {\n buf.set(val, pos); // also works for plain array values\n }\n /* istanbul ignore next */\n : function writeBytes_for(val, buf, pos) {\n for (var i = 0; i < val.length; ++i)\n buf[pos + i] = val[i];\n };\n\n/**\n * Writes a sequence of bytes.\n * @param {Uint8Array|string} value Buffer or base64 encoded string to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bytes = function write_bytes(value) {\n var len = value.length >>> 0;\n if (!len)\n return this._push(writeByte, 1, 0);\n if (util.isString(value)) {\n var buf = Writer.alloc(len = base64.length(value));\n base64.decode(value, buf, 0);\n value = buf;\n }\n return this.uint32(len)._push(writeBytes, len, value);\n};\n\n/**\n * Writes a string.\n * @param {string} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.string = function write_string(value) {\n var len = utf8.length(value);\n return len\n ? this.uint32(len)._push(utf8.write, len, value)\n : this._push(writeByte, 1, 0);\n};\n\n/**\n * Forks this writer's state by pushing it to a stack.\n * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state.\n * @returns {Writer} `this`\n */\nWriter.prototype.fork = function fork() {\n this.states = new State(this);\n this.head = this.tail = new Op(noop, 0, 0);\n this.len = 0;\n return this;\n};\n\n/**\n * Resets this instance to the last state.\n * @returns {Writer} `this`\n */\nWriter.prototype.reset = function reset() {\n if (this.states) {\n this.head = this.states.head;\n this.tail = this.states.tail;\n this.len = this.states.len;\n this.states = this.states.next;\n } else {\n this.head = this.tail = new Op(noop, 0, 0);\n this.len = 0;\n }\n return this;\n};\n\n/**\n * Resets to the last state and appends the fork state's current write length as a varint followed by its operations.\n * @returns {Writer} `this`\n */\nWriter.prototype.ldelim = function ldelim() {\n var head = this.head,\n tail = this.tail,\n len = this.len;\n this.reset().uint32(len);\n if (len) {\n this.tail.next = head.next; // skip noop\n this.tail = tail;\n this.len += len;\n }\n return this;\n};\n\n/**\n * Finishes the write operation.\n * @returns {Uint8Array} Finished buffer\n */\nWriter.prototype.finish = function finish() {\n var head = this.head.next, // skip noop\n buf = this.constructor.alloc(this.len),\n pos = 0;\n while (head) {\n head.fn(head.val, buf, pos);\n pos += head.len;\n head = head.next;\n }\n // this.head = this.tail = null;\n return buf;\n};\n\nWriter._configure = function(BufferWriter_) {\n BufferWriter = BufferWriter_;\n Writer.create = create();\n BufferWriter._configure();\n};\n", "\"use strict\";\nmodule.exports = BufferWriter;\n\n// extends Writer\nvar Writer = require(\"./writer\");\n(BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter;\n\nvar util = require(\"./util/minimal\");\n\n/**\n * Constructs a new buffer writer instance.\n * @classdesc Wire format writer using node buffers.\n * @extends Writer\n * @constructor\n */\nfunction BufferWriter() {\n Writer.call(this);\n}\n\nBufferWriter._configure = function () {\n /**\n * Allocates a buffer of the specified size.\n * @function\n * @param {number} size Buffer size\n * @returns {Buffer} Buffer\n */\n BufferWriter.alloc = util._Buffer_allocUnsafe;\n\n BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === \"set\"\n ? function writeBytesBuffer_set(val, buf, pos) {\n buf.set(val, pos); // faster than copy (requires node >= 4 where Buffers extend Uint8Array and set is properly inherited)\n // also works for plain array values\n }\n /* istanbul ignore next */\n : function writeBytesBuffer_copy(val, buf, pos) {\n if (val.copy) // Buffer values\n val.copy(buf, pos, 0, val.length);\n else for (var i = 0; i < val.length;) // plain array values\n buf[pos++] = val[i++];\n };\n};\n\n\n/**\n * @override\n */\nBufferWriter.prototype.bytes = function write_bytes_buffer(value) {\n if (util.isString(value))\n value = util._Buffer_from(value, \"base64\");\n var len = value.length >>> 0;\n this.uint32(len);\n if (len)\n this._push(BufferWriter.writeBytesBuffer, len, value);\n return this;\n};\n\nfunction writeStringBuffer(val, buf, pos) {\n if (val.length < 40) // plain js is faster for short strings (probably due to redundant assertions)\n util.utf8.write(val, buf, pos);\n else if (buf.utf8Write)\n buf.utf8Write(val, pos);\n else\n buf.write(val, pos);\n}\n\n/**\n * @override\n */\nBufferWriter.prototype.string = function write_string_buffer(value) {\n var len = util.Buffer.byteLength(value);\n this.uint32(len);\n if (len)\n this._push(writeStringBuffer, len, value);\n return this;\n};\n\n\n/**\n * Finishes the write operation.\n * @name BufferWriter#finish\n * @function\n * @returns {Buffer} Finished buffer\n */\n\nBufferWriter._configure();\n", "\"use strict\";\nmodule.exports = Reader;\n\nvar util = require(\"./util/minimal\");\n\nvar BufferReader; // cyclic\n\nvar LongBits = util.LongBits,\n utf8 = util.utf8;\n\n/* istanbul ignore next */\nfunction indexOutOfRange(reader, writeLength) {\n return RangeError(\"index out of range: \" + reader.pos + \" + \" + (writeLength || 1) + \" > \" + reader.len);\n}\n\n/**\n * Constructs a new reader instance using the specified buffer.\n * @classdesc Wire format reader using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n * @param {Uint8Array} buffer Buffer to read from\n */\nfunction Reader(buffer) {\n\n /**\n * Read buffer.\n * @type {Uint8Array}\n */\n this.buf = buffer;\n\n /**\n * Read buffer position.\n * @type {number}\n */\n this.pos = 0;\n\n /**\n * Read buffer length.\n * @type {number}\n */\n this.len = buffer.length;\n}\n\nvar create_array = typeof Uint8Array !== \"undefined\"\n ? function create_typed_array(buffer) {\n if (buffer instanceof Uint8Array || Array.isArray(buffer))\n return new Reader(buffer);\n throw Error(\"illegal buffer\");\n }\n /* istanbul ignore next */\n : function create_array(buffer) {\n if (Array.isArray(buffer))\n return new Reader(buffer);\n throw Error(\"illegal buffer\");\n };\n\nvar create = function create() {\n return util.Buffer\n ? function create_buffer_setup(buffer) {\n return (Reader.create = function create_buffer(buffer) {\n return util.Buffer.isBuffer(buffer)\n ? new BufferReader(buffer)\n /* istanbul ignore next */\n : create_array(buffer);\n })(buffer);\n }\n /* istanbul ignore next */\n : create_array;\n};\n\n/**\n * Creates a new reader using the specified buffer.\n * @function\n * @param {Uint8Array|Buffer} buffer Buffer to read from\n * @returns {Reader|BufferReader} A {@link BufferReader} if `buffer` is a Buffer, otherwise a {@link Reader}\n * @throws {Error} If `buffer` is not a valid buffer\n */\nReader.create = create();\n\nReader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */ util.Array.prototype.slice;\n\n/**\n * Reads a varint as an unsigned 32 bit value.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.uint32 = (function read_uint32_setup() {\n var value = 4294967295; // optimizer type-hint, tends to deopt otherwise (?!)\n return function read_uint32() {\n value = ( this.buf[this.pos] & 127 ) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 7) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 15) << 28) >>> 0; if (this.buf[this.pos++] < 128) return value;\n\n /* istanbul ignore if */\n if ((this.pos += 5) > this.len) {\n this.pos = this.len;\n throw indexOutOfRange(this, 10);\n }\n return value;\n };\n})();\n\n/**\n * Reads a varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.int32 = function read_int32() {\n return this.uint32() | 0;\n};\n\n/**\n * Reads a zig-zag encoded varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.sint32 = function read_sint32() {\n var value = this.uint32();\n return value >>> 1 ^ -(value & 1) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readLongVarint() {\n // tends to deopt with local vars for octet etc.\n var bits = new LongBits(0, 0);\n var i = 0;\n if (this.len - this.pos > 4) { // fast route (lo)\n for (; i < 4; ++i) {\n // 1st..4th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n // 5th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0;\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) >> 4) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n i = 0;\n } else {\n for (; i < 3; ++i) {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n // 1st..3th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n // 4th\n bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0;\n return bits;\n }\n if (this.len - this.pos > 4) { // fast route (hi)\n for (; i < 5; ++i) {\n // 6th..10th\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n } else {\n for (; i < 5; ++i) {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n // 6th..10th\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n }\n /* istanbul ignore next */\n throw Error(\"invalid varint encoding\");\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads a varint as a signed 64 bit value.\n * @name Reader#int64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as an unsigned 64 bit value.\n * @name Reader#uint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a zig-zag encoded varint as a signed 64 bit value.\n * @name Reader#sint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as a boolean.\n * @returns {boolean} Value read\n */\nReader.prototype.bool = function read_bool() {\n return this.uint32() !== 0;\n};\n\nfunction readFixed32_end(buf, end) { // note that this uses `end`, not `pos`\n return (buf[end - 4]\n | buf[end - 3] << 8\n | buf[end - 2] << 16\n | buf[end - 1] << 24) >>> 0;\n}\n\n/**\n * Reads fixed 32 bits as an unsigned 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.fixed32 = function read_fixed32() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n return readFixed32_end(this.buf, this.pos += 4);\n};\n\n/**\n * Reads fixed 32 bits as a signed 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.sfixed32 = function read_sfixed32() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n return readFixed32_end(this.buf, this.pos += 4) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readFixed64(/* this: Reader */) {\n\n /* istanbul ignore if */\n if (this.pos + 8 > this.len)\n throw indexOutOfRange(this, 8);\n\n return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4));\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads fixed 64 bits.\n * @name Reader#fixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads zig-zag encoded fixed 64 bits.\n * @name Reader#sfixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a float (32 bit) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.float = function read_float() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n var value = util.float.readFloatLE(this.buf, this.pos);\n this.pos += 4;\n return value;\n};\n\n/**\n * Reads a double (64 bit float) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.double = function read_double() {\n\n /* istanbul ignore if */\n if (this.pos + 8 > this.len)\n throw indexOutOfRange(this, 4);\n\n var value = util.float.readDoubleLE(this.buf, this.pos);\n this.pos += 8;\n return value;\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @returns {Uint8Array} Value read\n */\nReader.prototype.bytes = function read_bytes() {\n var length = this.uint32(),\n start = this.pos,\n end = this.pos + length;\n\n /* istanbul ignore if */\n if (end > this.len)\n throw indexOutOfRange(this, length);\n\n this.pos += length;\n if (Array.isArray(this.buf)) // plain array\n return this.buf.slice(start, end);\n\n if (start === end) { // fix for IE 10/Win8 and others' subarray returning array of size 1\n var nativeBuffer = util.Buffer;\n return nativeBuffer\n ? nativeBuffer.alloc(0)\n : new this.buf.constructor(0);\n }\n return this._slice.call(this.buf, start, end);\n};\n\n/**\n * Reads a string preceeded by its byte length as a varint.\n * @returns {string} Value read\n */\nReader.prototype.string = function read_string() {\n var bytes = this.bytes();\n return utf8.read(bytes, 0, bytes.length);\n};\n\n/**\n * Skips the specified number of bytes if specified, otherwise skips a varint.\n * @param {number} [length] Length if known, otherwise a varint is assumed\n * @returns {Reader} `this`\n */\nReader.prototype.skip = function skip(length) {\n if (typeof length === \"number\") {\n /* istanbul ignore if */\n if (this.pos + length > this.len)\n throw indexOutOfRange(this, length);\n this.pos += length;\n } else {\n do {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n } while (this.buf[this.pos++] & 128);\n }\n return this;\n};\n\n/**\n * Skips the next element of the specified wire type.\n * @param {number} wireType Wire type received\n * @returns {Reader} `this`\n */\nReader.prototype.skipType = function(wireType) {\n switch (wireType) {\n case 0:\n this.skip();\n break;\n case 1:\n this.skip(8);\n break;\n case 2:\n this.skip(this.uint32());\n break;\n case 3:\n while ((wireType = this.uint32() & 7) !== 4) {\n this.skipType(wireType);\n }\n break;\n case 5:\n this.skip(4);\n break;\n\n /* istanbul ignore next */\n default:\n throw Error(\"invalid wire type \" + wireType + \" at offset \" + this.pos);\n }\n return this;\n};\n\nReader._configure = function(BufferReader_) {\n BufferReader = BufferReader_;\n Reader.create = create();\n BufferReader._configure();\n\n var fn = util.Long ? \"toLong\" : /* istanbul ignore next */ \"toNumber\";\n util.merge(Reader.prototype, {\n\n int64: function read_int64() {\n return readLongVarint.call(this)[fn](false);\n },\n\n uint64: function read_uint64() {\n return readLongVarint.call(this)[fn](true);\n },\n\n sint64: function read_sint64() {\n return readLongVarint.call(this).zzDecode()[fn](false);\n },\n\n fixed64: function read_fixed64() {\n return readFixed64.call(this)[fn](true);\n },\n\n sfixed64: function read_sfixed64() {\n return readFixed64.call(this)[fn](false);\n }\n\n });\n};\n", "\"use strict\";\nmodule.exports = BufferReader;\n\n// extends Reader\nvar Reader = require(\"./reader\");\n(BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader;\n\nvar util = require(\"./util/minimal\");\n\n/**\n * Constructs a new buffer reader instance.\n * @classdesc Wire format reader using node buffers.\n * @extends Reader\n * @constructor\n * @param {Buffer} buffer Buffer to read from\n */\nfunction BufferReader(buffer) {\n Reader.call(this, buffer);\n\n /**\n * Read buffer.\n * @name BufferReader#buf\n * @type {Buffer}\n */\n}\n\nBufferReader._configure = function () {\n /* istanbul ignore else */\n if (util.Buffer)\n BufferReader.prototype._slice = util.Buffer.prototype.slice;\n};\n\n\n/**\n * @override\n */\nBufferReader.prototype.string = function read_string_buffer() {\n var len = this.uint32(); // modifies pos\n return this.buf.utf8Slice\n ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len))\n : this.buf.toString(\"utf-8\", this.pos, this.pos = Math.min(this.pos + len, this.len));\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @name BufferReader#bytes\n * @function\n * @returns {Buffer} Value read\n */\n\nBufferReader._configure();\n", "\"use strict\";\nmodule.exports = Service;\n\nvar util = require(\"../util/minimal\");\n\n// Extends EventEmitter\n(Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service;\n\n/**\n * A service method callback as used by {@link rpc.ServiceMethod|ServiceMethod}.\n *\n * Differs from {@link RPCImplCallback} in that it is an actual callback of a service method which may not return `response = null`.\n * @typedef rpc.ServiceMethodCallback\n * @template TRes extends Message\n * @type {function}\n * @param {Error|null} error Error, if any\n * @param {TRes} [response] Response message\n * @returns {undefined}\n */\n\n/**\n * A service method part of a {@link rpc.Service} as created by {@link Service.create}.\n * @typedef rpc.ServiceMethod\n * @template TReq extends Message\n * @template TRes extends Message\n * @type {function}\n * @param {TReq|Properties} request Request message or plain object\n * @param {rpc.ServiceMethodCallback} [callback] Node-style callback called with the error, if any, and the response message\n * @returns {Promise>} Promise if `callback` has been omitted, otherwise `undefined`\n */\n\n/**\n * Constructs a new RPC service instance.\n * @classdesc An RPC service as returned by {@link Service#create}.\n * @exports rpc.Service\n * @extends util.EventEmitter\n * @constructor\n * @param {RPCImpl} rpcImpl RPC implementation\n * @param {boolean} [requestDelimited=false] Whether requests are length-delimited\n * @param {boolean} [responseDelimited=false] Whether responses are length-delimited\n */\nfunction Service(rpcImpl, requestDelimited, responseDelimited) {\n\n if (typeof rpcImpl !== \"function\")\n throw TypeError(\"rpcImpl must be a function\");\n\n util.EventEmitter.call(this);\n\n /**\n * RPC implementation. Becomes `null` once the service is ended.\n * @type {RPCImpl|null}\n */\n this.rpcImpl = rpcImpl;\n\n /**\n * Whether requests are length-delimited.\n * @type {boolean}\n */\n this.requestDelimited = Boolean(requestDelimited);\n\n /**\n * Whether responses are length-delimited.\n * @type {boolean}\n */\n this.responseDelimited = Boolean(responseDelimited);\n}\n\n/**\n * Calls a service method through {@link rpc.Service#rpcImpl|rpcImpl}.\n * @param {Method|rpc.ServiceMethod} method Reflected or static method\n * @param {Constructor} requestCtor Request constructor\n * @param {Constructor} responseCtor Response constructor\n * @param {TReq|Properties} request Request message or plain object\n * @param {rpc.ServiceMethodCallback} callback Service callback\n * @returns {undefined}\n * @template TReq extends Message\n * @template TRes extends Message\n */\nService.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) {\n\n if (!request)\n throw TypeError(\"request must be specified\");\n\n var self = this;\n if (!callback)\n return util.asPromise(rpcCall, self, method, requestCtor, responseCtor, request);\n\n if (!self.rpcImpl) {\n setTimeout(function() { callback(Error(\"already ended\")); }, 0);\n return undefined;\n }\n\n try {\n return self.rpcImpl(\n method,\n requestCtor[self.requestDelimited ? \"encodeDelimited\" : \"encode\"](request).finish(),\n function rpcCallback(err, response) {\n\n if (err) {\n self.emit(\"error\", err, method);\n return callback(err);\n }\n\n if (response === null) {\n self.end(/* endedByRPC */ true);\n return undefined;\n }\n\n if (!(response instanceof responseCtor)) {\n try {\n response = responseCtor[self.responseDelimited ? \"decodeDelimited\" : \"decode\"](response);\n } catch (err) {\n self.emit(\"error\", err, method);\n return callback(err);\n }\n }\n\n self.emit(\"data\", response, method);\n return callback(null, response);\n }\n );\n } catch (err) {\n self.emit(\"error\", err, method);\n setTimeout(function() { callback(err); }, 0);\n return undefined;\n }\n};\n\n/**\n * Ends this service and emits the `end` event.\n * @param {boolean} [endedByRPC=false] Whether the service has been ended by the RPC implementation.\n * @returns {rpc.Service} `this`\n */\nService.prototype.end = function end(endedByRPC) {\n if (this.rpcImpl) {\n if (!endedByRPC) // signal end to rpcImpl\n this.rpcImpl(null, null, null);\n this.rpcImpl = null;\n this.emit(\"end\").off();\n }\n return this;\n};\n", "\"use strict\";\n\n/**\n * Streaming RPC helpers.\n * @namespace\n */\nvar rpc = exports;\n\n/**\n * RPC implementation passed to {@link Service#create} performing a service request on network level, i.e. by utilizing http requests or websockets.\n * @typedef RPCImpl\n * @type {function}\n * @param {Method|rpc.ServiceMethod,Message<{}>>} method Reflected or static method being called\n * @param {Uint8Array} requestData Request data\n * @param {RPCImplCallback} callback Callback function\n * @returns {undefined}\n * @example\n * function rpcImpl(method, requestData, callback) {\n * if (protobuf.util.lcFirst(method.name) !== \"myMethod\") // compatible with static code\n * throw Error(\"no such method\");\n * asynchronouslyObtainAResponse(requestData, function(err, responseData) {\n * callback(err, responseData);\n * });\n * }\n */\n\n/**\n * Node-style callback as used by {@link RPCImpl}.\n * @typedef RPCImplCallback\n * @type {function}\n * @param {Error|null} error Error, if any, otherwise `null`\n * @param {Uint8Array|null} [response] Response data or `null` to signal end of stream, if there hasn't been an error\n * @returns {undefined}\n */\n\nrpc.Service = require(\"./rpc/service\");\n", "\"use strict\";\nmodule.exports = {};\n\n/**\n * Named roots.\n * This is where pbjs stores generated structures (the option `-r, --root` specifies a name).\n * Can also be used manually to make roots available across modules.\n * @name roots\n * @type {Object.}\n * @example\n * // pbjs -r myroot -o compiled.js ...\n *\n * // in another module:\n * require(\"./compiled.js\");\n *\n * // in any subsequent module:\n * var root = protobuf.roots[\"myroot\"];\n */\n", "\"use strict\";\nvar protobuf = exports;\n\n/**\n * Build type, one of `\"full\"`, `\"light\"` or `\"minimal\"`.\n * @name build\n * @type {string}\n * @const\n */\nprotobuf.build = \"minimal\";\n\n// Serialization\nprotobuf.Writer = require(\"./writer\");\nprotobuf.BufferWriter = require(\"./writer_buffer\");\nprotobuf.Reader = require(\"./reader\");\nprotobuf.BufferReader = require(\"./reader_buffer\");\n\n// Utility\nprotobuf.util = require(\"./util/minimal\");\nprotobuf.rpc = require(\"./rpc\");\nprotobuf.roots = require(\"./roots\");\nprotobuf.configure = configure;\n\n/* istanbul ignore next */\n/**\n * Reconfigures the library according to the environment.\n * @returns {undefined}\n */\nfunction configure() {\n protobuf.util._configure();\n protobuf.Writer._configure(protobuf.BufferWriter);\n protobuf.Reader._configure(protobuf.BufferReader);\n}\n\n// Set up buffer utility according to the environment\nconfigure();\n", "// minimal library entry point.\n\n\"use strict\";\nmodule.exports = require(\"./src/index-minimal\");\n", "/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/\n\"use strict\";\n\nvar $protobuf = require(\"protobufjs/minimal\");\n\n// Common aliases\nvar $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;\n\n// Exported root namespace\nvar $root = $protobuf.roots[\"default\"] || ($protobuf.roots[\"default\"] = {});\n\n$root.onnx = (function() {\n\n /**\n * Namespace onnx.\n * @exports onnx\n * @namespace\n */\n var onnx = {};\n\n /**\n * Version enum.\n * @name onnx.Version\n * @enum {number}\n * @property {number} _START_VERSION=0 _START_VERSION value\n * @property {number} IR_VERSION_2017_10_10=1 IR_VERSION_2017_10_10 value\n * @property {number} IR_VERSION_2017_10_30=2 IR_VERSION_2017_10_30 value\n * @property {number} IR_VERSION_2017_11_3=3 IR_VERSION_2017_11_3 value\n * @property {number} IR_VERSION_2019_1_22=4 IR_VERSION_2019_1_22 value\n * @property {number} IR_VERSION_2019_3_18=5 IR_VERSION_2019_3_18 value\n * @property {number} IR_VERSION_2019_9_19=6 IR_VERSION_2019_9_19 value\n * @property {number} IR_VERSION_2020_5_8=7 IR_VERSION_2020_5_8 value\n * @property {number} IR_VERSION_2021_7_30=8 IR_VERSION_2021_7_30 value\n * @property {number} IR_VERSION=9 IR_VERSION value\n */\n onnx.Version = (function() {\n var valuesById = {}, values = Object.create(valuesById);\n values[valuesById[0] = \"_START_VERSION\"] = 0;\n values[valuesById[1] = \"IR_VERSION_2017_10_10\"] = 1;\n values[valuesById[2] = \"IR_VERSION_2017_10_30\"] = 2;\n values[valuesById[3] = \"IR_VERSION_2017_11_3\"] = 3;\n values[valuesById[4] = \"IR_VERSION_2019_1_22\"] = 4;\n values[valuesById[5] = \"IR_VERSION_2019_3_18\"] = 5;\n values[valuesById[6] = \"IR_VERSION_2019_9_19\"] = 6;\n values[valuesById[7] = \"IR_VERSION_2020_5_8\"] = 7;\n values[valuesById[8] = \"IR_VERSION_2021_7_30\"] = 8;\n values[valuesById[9] = \"IR_VERSION\"] = 9;\n return values;\n })();\n\n onnx.AttributeProto = (function() {\n\n /**\n * Properties of an AttributeProto.\n * @memberof onnx\n * @interface IAttributeProto\n * @property {string|null} [name] AttributeProto name\n * @property {string|null} [refAttrName] AttributeProto refAttrName\n * @property {string|null} [docString] AttributeProto docString\n * @property {onnx.AttributeProto.AttributeType|null} [type] AttributeProto type\n * @property {number|null} [f] AttributeProto f\n * @property {number|Long|null} [i] AttributeProto i\n * @property {Uint8Array|null} [s] AttributeProto s\n * @property {onnx.ITensorProto|null} [t] AttributeProto t\n * @property {onnx.IGraphProto|null} [g] AttributeProto g\n * @property {onnx.ISparseTensorProto|null} [sparseTensor] AttributeProto sparseTensor\n * @property {onnx.ITypeProto|null} [tp] AttributeProto tp\n * @property {Array.|null} [floats] AttributeProto floats\n * @property {Array.|null} [ints] AttributeProto ints\n * @property {Array.|null} [strings] AttributeProto strings\n * @property {Array.|null} [tensors] AttributeProto tensors\n * @property {Array.|null} [graphs] AttributeProto graphs\n * @property {Array.|null} [sparseTensors] AttributeProto sparseTensors\n * @property {Array.|null} [typeProtos] AttributeProto typeProtos\n */\n\n /**\n * Constructs a new AttributeProto.\n * @memberof onnx\n * @classdesc Represents an AttributeProto.\n * @implements IAttributeProto\n * @constructor\n * @param {onnx.IAttributeProto=} [properties] Properties to set\n */\n function AttributeProto(properties) {\n this.floats = [];\n this.ints = [];\n this.strings = [];\n this.tensors = [];\n this.graphs = [];\n this.sparseTensors = [];\n this.typeProtos = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * AttributeProto name.\n * @member {string} name\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.name = \"\";\n\n /**\n * AttributeProto refAttrName.\n * @member {string} refAttrName\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.refAttrName = \"\";\n\n /**\n * AttributeProto docString.\n * @member {string} docString\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.docString = \"\";\n\n /**\n * AttributeProto type.\n * @member {onnx.AttributeProto.AttributeType} type\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.type = 0;\n\n /**\n * AttributeProto f.\n * @member {number} f\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.f = 0;\n\n /**\n * AttributeProto i.\n * @member {number|Long} i\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.i = $util.Long ? $util.Long.fromBits(0,0,false) : 0;\n\n /**\n * AttributeProto s.\n * @member {Uint8Array} s\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.s = $util.newBuffer([]);\n\n /**\n * AttributeProto t.\n * @member {onnx.ITensorProto|null|undefined} t\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.t = null;\n\n /**\n * AttributeProto g.\n * @member {onnx.IGraphProto|null|undefined} g\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.g = null;\n\n /**\n * AttributeProto sparseTensor.\n * @member {onnx.ISparseTensorProto|null|undefined} sparseTensor\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.sparseTensor = null;\n\n /**\n * AttributeProto tp.\n * @member {onnx.ITypeProto|null|undefined} tp\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.tp = null;\n\n /**\n * AttributeProto floats.\n * @member {Array.} floats\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.floats = $util.emptyArray;\n\n /**\n * AttributeProto ints.\n * @member {Array.} ints\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.ints = $util.emptyArray;\n\n /**\n * AttributeProto strings.\n * @member {Array.} strings\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.strings = $util.emptyArray;\n\n /**\n * AttributeProto tensors.\n * @member {Array.} tensors\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.tensors = $util.emptyArray;\n\n /**\n * AttributeProto graphs.\n * @member {Array.} graphs\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.graphs = $util.emptyArray;\n\n /**\n * AttributeProto sparseTensors.\n * @member {Array.} sparseTensors\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.sparseTensors = $util.emptyArray;\n\n /**\n * AttributeProto typeProtos.\n * @member {Array.} typeProtos\n * @memberof onnx.AttributeProto\n * @instance\n */\n AttributeProto.prototype.typeProtos = $util.emptyArray;\n\n /**\n * Creates a new AttributeProto instance using the specified properties.\n * @function create\n * @memberof onnx.AttributeProto\n * @static\n * @param {onnx.IAttributeProto=} [properties] Properties to set\n * @returns {onnx.AttributeProto} AttributeProto instance\n */\n AttributeProto.create = function create(properties) {\n return new AttributeProto(properties);\n };\n\n /**\n * Encodes the specified AttributeProto message. Does not implicitly {@link onnx.AttributeProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.AttributeProto\n * @static\n * @param {onnx.IAttributeProto} message AttributeProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n AttributeProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);\n if (message.f != null && Object.hasOwnProperty.call(message, \"f\"))\n writer.uint32(/* id 2, wireType 5 =*/21).float(message.f);\n if (message.i != null && Object.hasOwnProperty.call(message, \"i\"))\n writer.uint32(/* id 3, wireType 0 =*/24).int64(message.i);\n if (message.s != null && Object.hasOwnProperty.call(message, \"s\"))\n writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.s);\n if (message.t != null && Object.hasOwnProperty.call(message, \"t\"))\n $root.onnx.TensorProto.encode(message.t, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\n if (message.g != null && Object.hasOwnProperty.call(message, \"g\"))\n $root.onnx.GraphProto.encode(message.g, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();\n if (message.floats != null && message.floats.length) {\n writer.uint32(/* id 7, wireType 2 =*/58).fork();\n for (var i = 0; i < message.floats.length; ++i)\n writer.float(message.floats[i]);\n writer.ldelim();\n }\n if (message.ints != null && message.ints.length) {\n writer.uint32(/* id 8, wireType 2 =*/66).fork();\n for (var i = 0; i < message.ints.length; ++i)\n writer.int64(message.ints[i]);\n writer.ldelim();\n }\n if (message.strings != null && message.strings.length)\n for (var i = 0; i < message.strings.length; ++i)\n writer.uint32(/* id 9, wireType 2 =*/74).bytes(message.strings[i]);\n if (message.tensors != null && message.tensors.length)\n for (var i = 0; i < message.tensors.length; ++i)\n $root.onnx.TensorProto.encode(message.tensors[i], writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();\n if (message.graphs != null && message.graphs.length)\n for (var i = 0; i < message.graphs.length; ++i)\n $root.onnx.GraphProto.encode(message.graphs[i], writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();\n if (message.docString != null && Object.hasOwnProperty.call(message, \"docString\"))\n writer.uint32(/* id 13, wireType 2 =*/106).string(message.docString);\n if (message.tp != null && Object.hasOwnProperty.call(message, \"tp\"))\n $root.onnx.TypeProto.encode(message.tp, writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim();\n if (message.typeProtos != null && message.typeProtos.length)\n for (var i = 0; i < message.typeProtos.length; ++i)\n $root.onnx.TypeProto.encode(message.typeProtos[i], writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim();\n if (message.type != null && Object.hasOwnProperty.call(message, \"type\"))\n writer.uint32(/* id 20, wireType 0 =*/160).int32(message.type);\n if (message.refAttrName != null && Object.hasOwnProperty.call(message, \"refAttrName\"))\n writer.uint32(/* id 21, wireType 2 =*/170).string(message.refAttrName);\n if (message.sparseTensor != null && Object.hasOwnProperty.call(message, \"sparseTensor\"))\n $root.onnx.SparseTensorProto.encode(message.sparseTensor, writer.uint32(/* id 22, wireType 2 =*/178).fork()).ldelim();\n if (message.sparseTensors != null && message.sparseTensors.length)\n for (var i = 0; i < message.sparseTensors.length; ++i)\n $root.onnx.SparseTensorProto.encode(message.sparseTensors[i], writer.uint32(/* id 23, wireType 2 =*/186).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified AttributeProto message, length delimited. Does not implicitly {@link onnx.AttributeProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.AttributeProto\n * @static\n * @param {onnx.IAttributeProto} message AttributeProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n AttributeProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes an AttributeProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.AttributeProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.AttributeProto} AttributeProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n AttributeProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.AttributeProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.name = reader.string();\n break;\n }\n case 21: {\n message.refAttrName = reader.string();\n break;\n }\n case 13: {\n message.docString = reader.string();\n break;\n }\n case 20: {\n message.type = reader.int32();\n break;\n }\n case 2: {\n message.f = reader.float();\n break;\n }\n case 3: {\n message.i = reader.int64();\n break;\n }\n case 4: {\n message.s = reader.bytes();\n break;\n }\n case 5: {\n message.t = $root.onnx.TensorProto.decode(reader, reader.uint32());\n break;\n }\n case 6: {\n message.g = $root.onnx.GraphProto.decode(reader, reader.uint32());\n break;\n }\n case 22: {\n message.sparseTensor = $root.onnx.SparseTensorProto.decode(reader, reader.uint32());\n break;\n }\n case 14: {\n message.tp = $root.onnx.TypeProto.decode(reader, reader.uint32());\n break;\n }\n case 7: {\n if (!(message.floats && message.floats.length))\n message.floats = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.floats.push(reader.float());\n } else\n message.floats.push(reader.float());\n break;\n }\n case 8: {\n if (!(message.ints && message.ints.length))\n message.ints = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.ints.push(reader.int64());\n } else\n message.ints.push(reader.int64());\n break;\n }\n case 9: {\n if (!(message.strings && message.strings.length))\n message.strings = [];\n message.strings.push(reader.bytes());\n break;\n }\n case 10: {\n if (!(message.tensors && message.tensors.length))\n message.tensors = [];\n message.tensors.push($root.onnx.TensorProto.decode(reader, reader.uint32()));\n break;\n }\n case 11: {\n if (!(message.graphs && message.graphs.length))\n message.graphs = [];\n message.graphs.push($root.onnx.GraphProto.decode(reader, reader.uint32()));\n break;\n }\n case 23: {\n if (!(message.sparseTensors && message.sparseTensors.length))\n message.sparseTensors = [];\n message.sparseTensors.push($root.onnx.SparseTensorProto.decode(reader, reader.uint32()));\n break;\n }\n case 15: {\n if (!(message.typeProtos && message.typeProtos.length))\n message.typeProtos = [];\n message.typeProtos.push($root.onnx.TypeProto.decode(reader, reader.uint32()));\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes an AttributeProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.AttributeProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.AttributeProto} AttributeProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n AttributeProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies an AttributeProto message.\n * @function verify\n * @memberof onnx.AttributeProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n AttributeProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.name != null && message.hasOwnProperty(\"name\"))\n if (!$util.isString(message.name))\n return \"name: string expected\";\n if (message.refAttrName != null && message.hasOwnProperty(\"refAttrName\"))\n if (!$util.isString(message.refAttrName))\n return \"refAttrName: string expected\";\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n if (!$util.isString(message.docString))\n return \"docString: string expected\";\n if (message.type != null && message.hasOwnProperty(\"type\"))\n switch (message.type) {\n default:\n return \"type: enum value expected\";\n case 0:\n case 1:\n case 2:\n case 3:\n case 4:\n case 5:\n case 11:\n case 13:\n case 6:\n case 7:\n case 8:\n case 9:\n case 10:\n case 12:\n case 14:\n break;\n }\n if (message.f != null && message.hasOwnProperty(\"f\"))\n if (typeof message.f !== \"number\")\n return \"f: number expected\";\n if (message.i != null && message.hasOwnProperty(\"i\"))\n if (!$util.isInteger(message.i) && !(message.i && $util.isInteger(message.i.low) && $util.isInteger(message.i.high)))\n return \"i: integer|Long expected\";\n if (message.s != null && message.hasOwnProperty(\"s\"))\n if (!(message.s && typeof message.s.length === \"number\" || $util.isString(message.s)))\n return \"s: buffer expected\";\n if (message.t != null && message.hasOwnProperty(\"t\")) {\n var error = $root.onnx.TensorProto.verify(message.t);\n if (error)\n return \"t.\" + error;\n }\n if (message.g != null && message.hasOwnProperty(\"g\")) {\n var error = $root.onnx.GraphProto.verify(message.g);\n if (error)\n return \"g.\" + error;\n }\n if (message.sparseTensor != null && message.hasOwnProperty(\"sparseTensor\")) {\n var error = $root.onnx.SparseTensorProto.verify(message.sparseTensor);\n if (error)\n return \"sparseTensor.\" + error;\n }\n if (message.tp != null && message.hasOwnProperty(\"tp\")) {\n var error = $root.onnx.TypeProto.verify(message.tp);\n if (error)\n return \"tp.\" + error;\n }\n if (message.floats != null && message.hasOwnProperty(\"floats\")) {\n if (!Array.isArray(message.floats))\n return \"floats: array expected\";\n for (var i = 0; i < message.floats.length; ++i)\n if (typeof message.floats[i] !== \"number\")\n return \"floats: number[] expected\";\n }\n if (message.ints != null && message.hasOwnProperty(\"ints\")) {\n if (!Array.isArray(message.ints))\n return \"ints: array expected\";\n for (var i = 0; i < message.ints.length; ++i)\n if (!$util.isInteger(message.ints[i]) && !(message.ints[i] && $util.isInteger(message.ints[i].low) && $util.isInteger(message.ints[i].high)))\n return \"ints: integer|Long[] expected\";\n }\n if (message.strings != null && message.hasOwnProperty(\"strings\")) {\n if (!Array.isArray(message.strings))\n return \"strings: array expected\";\n for (var i = 0; i < message.strings.length; ++i)\n if (!(message.strings[i] && typeof message.strings[i].length === \"number\" || $util.isString(message.strings[i])))\n return \"strings: buffer[] expected\";\n }\n if (message.tensors != null && message.hasOwnProperty(\"tensors\")) {\n if (!Array.isArray(message.tensors))\n return \"tensors: array expected\";\n for (var i = 0; i < message.tensors.length; ++i) {\n var error = $root.onnx.TensorProto.verify(message.tensors[i]);\n if (error)\n return \"tensors.\" + error;\n }\n }\n if (message.graphs != null && message.hasOwnProperty(\"graphs\")) {\n if (!Array.isArray(message.graphs))\n return \"graphs: array expected\";\n for (var i = 0; i < message.graphs.length; ++i) {\n var error = $root.onnx.GraphProto.verify(message.graphs[i]);\n if (error)\n return \"graphs.\" + error;\n }\n }\n if (message.sparseTensors != null && message.hasOwnProperty(\"sparseTensors\")) {\n if (!Array.isArray(message.sparseTensors))\n return \"sparseTensors: array expected\";\n for (var i = 0; i < message.sparseTensors.length; ++i) {\n var error = $root.onnx.SparseTensorProto.verify(message.sparseTensors[i]);\n if (error)\n return \"sparseTensors.\" + error;\n }\n }\n if (message.typeProtos != null && message.hasOwnProperty(\"typeProtos\")) {\n if (!Array.isArray(message.typeProtos))\n return \"typeProtos: array expected\";\n for (var i = 0; i < message.typeProtos.length; ++i) {\n var error = $root.onnx.TypeProto.verify(message.typeProtos[i]);\n if (error)\n return \"typeProtos.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates an AttributeProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.AttributeProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.AttributeProto} AttributeProto\n */\n AttributeProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.AttributeProto)\n return object;\n var message = new $root.onnx.AttributeProto();\n if (object.name != null)\n message.name = String(object.name);\n if (object.refAttrName != null)\n message.refAttrName = String(object.refAttrName);\n if (object.docString != null)\n message.docString = String(object.docString);\n switch (object.type) {\n default:\n if (typeof object.type === \"number\") {\n message.type = object.type;\n break;\n }\n break;\n case \"UNDEFINED\":\n case 0:\n message.type = 0;\n break;\n case \"FLOAT\":\n case 1:\n message.type = 1;\n break;\n case \"INT\":\n case 2:\n message.type = 2;\n break;\n case \"STRING\":\n case 3:\n message.type = 3;\n break;\n case \"TENSOR\":\n case 4:\n message.type = 4;\n break;\n case \"GRAPH\":\n case 5:\n message.type = 5;\n break;\n case \"SPARSE_TENSOR\":\n case 11:\n message.type = 11;\n break;\n case \"TYPE_PROTO\":\n case 13:\n message.type = 13;\n break;\n case \"FLOATS\":\n case 6:\n message.type = 6;\n break;\n case \"INTS\":\n case 7:\n message.type = 7;\n break;\n case \"STRINGS\":\n case 8:\n message.type = 8;\n break;\n case \"TENSORS\":\n case 9:\n message.type = 9;\n break;\n case \"GRAPHS\":\n case 10:\n message.type = 10;\n break;\n case \"SPARSE_TENSORS\":\n case 12:\n message.type = 12;\n break;\n case \"TYPE_PROTOS\":\n case 14:\n message.type = 14;\n break;\n }\n if (object.f != null)\n message.f = Number(object.f);\n if (object.i != null)\n if ($util.Long)\n (message.i = $util.Long.fromValue(object.i)).unsigned = false;\n else if (typeof object.i === \"string\")\n message.i = parseInt(object.i, 10);\n else if (typeof object.i === \"number\")\n message.i = object.i;\n else if (typeof object.i === \"object\")\n message.i = new $util.LongBits(object.i.low >>> 0, object.i.high >>> 0).toNumber();\n if (object.s != null)\n if (typeof object.s === \"string\")\n $util.base64.decode(object.s, message.s = $util.newBuffer($util.base64.length(object.s)), 0);\n else if (object.s.length >= 0)\n message.s = object.s;\n if (object.t != null) {\n if (typeof object.t !== \"object\")\n throw TypeError(\".onnx.AttributeProto.t: object expected\");\n message.t = $root.onnx.TensorProto.fromObject(object.t);\n }\n if (object.g != null) {\n if (typeof object.g !== \"object\")\n throw TypeError(\".onnx.AttributeProto.g: object expected\");\n message.g = $root.onnx.GraphProto.fromObject(object.g);\n }\n if (object.sparseTensor != null) {\n if (typeof object.sparseTensor !== \"object\")\n throw TypeError(\".onnx.AttributeProto.sparseTensor: object expected\");\n message.sparseTensor = $root.onnx.SparseTensorProto.fromObject(object.sparseTensor);\n }\n if (object.tp != null) {\n if (typeof object.tp !== \"object\")\n throw TypeError(\".onnx.AttributeProto.tp: object expected\");\n message.tp = $root.onnx.TypeProto.fromObject(object.tp);\n }\n if (object.floats) {\n if (!Array.isArray(object.floats))\n throw TypeError(\".onnx.AttributeProto.floats: array expected\");\n message.floats = [];\n for (var i = 0; i < object.floats.length; ++i)\n message.floats[i] = Number(object.floats[i]);\n }\n if (object.ints) {\n if (!Array.isArray(object.ints))\n throw TypeError(\".onnx.AttributeProto.ints: array expected\");\n message.ints = [];\n for (var i = 0; i < object.ints.length; ++i)\n if ($util.Long)\n (message.ints[i] = $util.Long.fromValue(object.ints[i])).unsigned = false;\n else if (typeof object.ints[i] === \"string\")\n message.ints[i] = parseInt(object.ints[i], 10);\n else if (typeof object.ints[i] === \"number\")\n message.ints[i] = object.ints[i];\n else if (typeof object.ints[i] === \"object\")\n message.ints[i] = new $util.LongBits(object.ints[i].low >>> 0, object.ints[i].high >>> 0).toNumber();\n }\n if (object.strings) {\n if (!Array.isArray(object.strings))\n throw TypeError(\".onnx.AttributeProto.strings: array expected\");\n message.strings = [];\n for (var i = 0; i < object.strings.length; ++i)\n if (typeof object.strings[i] === \"string\")\n $util.base64.decode(object.strings[i], message.strings[i] = $util.newBuffer($util.base64.length(object.strings[i])), 0);\n else if (object.strings[i].length >= 0)\n message.strings[i] = object.strings[i];\n }\n if (object.tensors) {\n if (!Array.isArray(object.tensors))\n throw TypeError(\".onnx.AttributeProto.tensors: array expected\");\n message.tensors = [];\n for (var i = 0; i < object.tensors.length; ++i) {\n if (typeof object.tensors[i] !== \"object\")\n throw TypeError(\".onnx.AttributeProto.tensors: object expected\");\n message.tensors[i] = $root.onnx.TensorProto.fromObject(object.tensors[i]);\n }\n }\n if (object.graphs) {\n if (!Array.isArray(object.graphs))\n throw TypeError(\".onnx.AttributeProto.graphs: array expected\");\n message.graphs = [];\n for (var i = 0; i < object.graphs.length; ++i) {\n if (typeof object.graphs[i] !== \"object\")\n throw TypeError(\".onnx.AttributeProto.graphs: object expected\");\n message.graphs[i] = $root.onnx.GraphProto.fromObject(object.graphs[i]);\n }\n }\n if (object.sparseTensors) {\n if (!Array.isArray(object.sparseTensors))\n throw TypeError(\".onnx.AttributeProto.sparseTensors: array expected\");\n message.sparseTensors = [];\n for (var i = 0; i < object.sparseTensors.length; ++i) {\n if (typeof object.sparseTensors[i] !== \"object\")\n throw TypeError(\".onnx.AttributeProto.sparseTensors: object expected\");\n message.sparseTensors[i] = $root.onnx.SparseTensorProto.fromObject(object.sparseTensors[i]);\n }\n }\n if (object.typeProtos) {\n if (!Array.isArray(object.typeProtos))\n throw TypeError(\".onnx.AttributeProto.typeProtos: array expected\");\n message.typeProtos = [];\n for (var i = 0; i < object.typeProtos.length; ++i) {\n if (typeof object.typeProtos[i] !== \"object\")\n throw TypeError(\".onnx.AttributeProto.typeProtos: object expected\");\n message.typeProtos[i] = $root.onnx.TypeProto.fromObject(object.typeProtos[i]);\n }\n }\n return message;\n };\n\n /**\n * Creates a plain object from an AttributeProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.AttributeProto\n * @static\n * @param {onnx.AttributeProto} message AttributeProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n AttributeProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults) {\n object.floats = [];\n object.ints = [];\n object.strings = [];\n object.tensors = [];\n object.graphs = [];\n object.typeProtos = [];\n object.sparseTensors = [];\n }\n if (options.defaults) {\n object.name = \"\";\n object.f = 0;\n if ($util.Long) {\n var long = new $util.Long(0, 0, false);\n object.i = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.i = options.longs === String ? \"0\" : 0;\n if (options.bytes === String)\n object.s = \"\";\n else {\n object.s = [];\n if (options.bytes !== Array)\n object.s = $util.newBuffer(object.s);\n }\n object.t = null;\n object.g = null;\n object.docString = \"\";\n object.tp = null;\n object.type = options.enums === String ? \"UNDEFINED\" : 0;\n object.refAttrName = \"\";\n object.sparseTensor = null;\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n object.name = message.name;\n if (message.f != null && message.hasOwnProperty(\"f\"))\n object.f = options.json && !isFinite(message.f) ? String(message.f) : message.f;\n if (message.i != null && message.hasOwnProperty(\"i\"))\n if (typeof message.i === \"number\")\n object.i = options.longs === String ? String(message.i) : message.i;\n else\n object.i = options.longs === String ? $util.Long.prototype.toString.call(message.i) : options.longs === Number ? new $util.LongBits(message.i.low >>> 0, message.i.high >>> 0).toNumber() : message.i;\n if (message.s != null && message.hasOwnProperty(\"s\"))\n object.s = options.bytes === String ? $util.base64.encode(message.s, 0, message.s.length) : options.bytes === Array ? Array.prototype.slice.call(message.s) : message.s;\n if (message.t != null && message.hasOwnProperty(\"t\"))\n object.t = $root.onnx.TensorProto.toObject(message.t, options);\n if (message.g != null && message.hasOwnProperty(\"g\"))\n object.g = $root.onnx.GraphProto.toObject(message.g, options);\n if (message.floats && message.floats.length) {\n object.floats = [];\n for (var j = 0; j < message.floats.length; ++j)\n object.floats[j] = options.json && !isFinite(message.floats[j]) ? String(message.floats[j]) : message.floats[j];\n }\n if (message.ints && message.ints.length) {\n object.ints = [];\n for (var j = 0; j < message.ints.length; ++j)\n if (typeof message.ints[j] === \"number\")\n object.ints[j] = options.longs === String ? String(message.ints[j]) : message.ints[j];\n else\n object.ints[j] = options.longs === String ? $util.Long.prototype.toString.call(message.ints[j]) : options.longs === Number ? new $util.LongBits(message.ints[j].low >>> 0, message.ints[j].high >>> 0).toNumber() : message.ints[j];\n }\n if (message.strings && message.strings.length) {\n object.strings = [];\n for (var j = 0; j < message.strings.length; ++j)\n object.strings[j] = options.bytes === String ? $util.base64.encode(message.strings[j], 0, message.strings[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.strings[j]) : message.strings[j];\n }\n if (message.tensors && message.tensors.length) {\n object.tensors = [];\n for (var j = 0; j < message.tensors.length; ++j)\n object.tensors[j] = $root.onnx.TensorProto.toObject(message.tensors[j], options);\n }\n if (message.graphs && message.graphs.length) {\n object.graphs = [];\n for (var j = 0; j < message.graphs.length; ++j)\n object.graphs[j] = $root.onnx.GraphProto.toObject(message.graphs[j], options);\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n object.docString = message.docString;\n if (message.tp != null && message.hasOwnProperty(\"tp\"))\n object.tp = $root.onnx.TypeProto.toObject(message.tp, options);\n if (message.typeProtos && message.typeProtos.length) {\n object.typeProtos = [];\n for (var j = 0; j < message.typeProtos.length; ++j)\n object.typeProtos[j] = $root.onnx.TypeProto.toObject(message.typeProtos[j], options);\n }\n if (message.type != null && message.hasOwnProperty(\"type\"))\n object.type = options.enums === String ? $root.onnx.AttributeProto.AttributeType[message.type] === undefined ? message.type : $root.onnx.AttributeProto.AttributeType[message.type] : message.type;\n if (message.refAttrName != null && message.hasOwnProperty(\"refAttrName\"))\n object.refAttrName = message.refAttrName;\n if (message.sparseTensor != null && message.hasOwnProperty(\"sparseTensor\"))\n object.sparseTensor = $root.onnx.SparseTensorProto.toObject(message.sparseTensor, options);\n if (message.sparseTensors && message.sparseTensors.length) {\n object.sparseTensors = [];\n for (var j = 0; j < message.sparseTensors.length; ++j)\n object.sparseTensors[j] = $root.onnx.SparseTensorProto.toObject(message.sparseTensors[j], options);\n }\n return object;\n };\n\n /**\n * Converts this AttributeProto to JSON.\n * @function toJSON\n * @memberof onnx.AttributeProto\n * @instance\n * @returns {Object.} JSON object\n */\n AttributeProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for AttributeProto\n * @function getTypeUrl\n * @memberof onnx.AttributeProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n AttributeProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.AttributeProto\";\n };\n\n /**\n * AttributeType enum.\n * @name onnx.AttributeProto.AttributeType\n * @enum {number}\n * @property {number} UNDEFINED=0 UNDEFINED value\n * @property {number} FLOAT=1 FLOAT value\n * @property {number} INT=2 INT value\n * @property {number} STRING=3 STRING value\n * @property {number} TENSOR=4 TENSOR value\n * @property {number} GRAPH=5 GRAPH value\n * @property {number} SPARSE_TENSOR=11 SPARSE_TENSOR value\n * @property {number} TYPE_PROTO=13 TYPE_PROTO value\n * @property {number} FLOATS=6 FLOATS value\n * @property {number} INTS=7 INTS value\n * @property {number} STRINGS=8 STRINGS value\n * @property {number} TENSORS=9 TENSORS value\n * @property {number} GRAPHS=10 GRAPHS value\n * @property {number} SPARSE_TENSORS=12 SPARSE_TENSORS value\n * @property {number} TYPE_PROTOS=14 TYPE_PROTOS value\n */\n AttributeProto.AttributeType = (function() {\n var valuesById = {}, values = Object.create(valuesById);\n values[valuesById[0] = \"UNDEFINED\"] = 0;\n values[valuesById[1] = \"FLOAT\"] = 1;\n values[valuesById[2] = \"INT\"] = 2;\n values[valuesById[3] = \"STRING\"] = 3;\n values[valuesById[4] = \"TENSOR\"] = 4;\n values[valuesById[5] = \"GRAPH\"] = 5;\n values[valuesById[11] = \"SPARSE_TENSOR\"] = 11;\n values[valuesById[13] = \"TYPE_PROTO\"] = 13;\n values[valuesById[6] = \"FLOATS\"] = 6;\n values[valuesById[7] = \"INTS\"] = 7;\n values[valuesById[8] = \"STRINGS\"] = 8;\n values[valuesById[9] = \"TENSORS\"] = 9;\n values[valuesById[10] = \"GRAPHS\"] = 10;\n values[valuesById[12] = \"SPARSE_TENSORS\"] = 12;\n values[valuesById[14] = \"TYPE_PROTOS\"] = 14;\n return values;\n })();\n\n return AttributeProto;\n })();\n\n onnx.ValueInfoProto = (function() {\n\n /**\n * Properties of a ValueInfoProto.\n * @memberof onnx\n * @interface IValueInfoProto\n * @property {string|null} [name] ValueInfoProto name\n * @property {onnx.ITypeProto|null} [type] ValueInfoProto type\n * @property {string|null} [docString] ValueInfoProto docString\n */\n\n /**\n * Constructs a new ValueInfoProto.\n * @memberof onnx\n * @classdesc Represents a ValueInfoProto.\n * @implements IValueInfoProto\n * @constructor\n * @param {onnx.IValueInfoProto=} [properties] Properties to set\n */\n function ValueInfoProto(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * ValueInfoProto name.\n * @member {string} name\n * @memberof onnx.ValueInfoProto\n * @instance\n */\n ValueInfoProto.prototype.name = \"\";\n\n /**\n * ValueInfoProto type.\n * @member {onnx.ITypeProto|null|undefined} type\n * @memberof onnx.ValueInfoProto\n * @instance\n */\n ValueInfoProto.prototype.type = null;\n\n /**\n * ValueInfoProto docString.\n * @member {string} docString\n * @memberof onnx.ValueInfoProto\n * @instance\n */\n ValueInfoProto.prototype.docString = \"\";\n\n /**\n * Creates a new ValueInfoProto instance using the specified properties.\n * @function create\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {onnx.IValueInfoProto=} [properties] Properties to set\n * @returns {onnx.ValueInfoProto} ValueInfoProto instance\n */\n ValueInfoProto.create = function create(properties) {\n return new ValueInfoProto(properties);\n };\n\n /**\n * Encodes the specified ValueInfoProto message. Does not implicitly {@link onnx.ValueInfoProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {onnx.IValueInfoProto} message ValueInfoProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ValueInfoProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);\n if (message.type != null && Object.hasOwnProperty.call(message, \"type\"))\n $root.onnx.TypeProto.encode(message.type, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\n if (message.docString != null && Object.hasOwnProperty.call(message, \"docString\"))\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.docString);\n return writer;\n };\n\n /**\n * Encodes the specified ValueInfoProto message, length delimited. Does not implicitly {@link onnx.ValueInfoProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {onnx.IValueInfoProto} message ValueInfoProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ValueInfoProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a ValueInfoProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.ValueInfoProto} ValueInfoProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ValueInfoProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.ValueInfoProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.name = reader.string();\n break;\n }\n case 2: {\n message.type = $root.onnx.TypeProto.decode(reader, reader.uint32());\n break;\n }\n case 3: {\n message.docString = reader.string();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a ValueInfoProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.ValueInfoProto} ValueInfoProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ValueInfoProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a ValueInfoProto message.\n * @function verify\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n ValueInfoProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.name != null && message.hasOwnProperty(\"name\"))\n if (!$util.isString(message.name))\n return \"name: string expected\";\n if (message.type != null && message.hasOwnProperty(\"type\")) {\n var error = $root.onnx.TypeProto.verify(message.type);\n if (error)\n return \"type.\" + error;\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n if (!$util.isString(message.docString))\n return \"docString: string expected\";\n return null;\n };\n\n /**\n * Creates a ValueInfoProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.ValueInfoProto} ValueInfoProto\n */\n ValueInfoProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.ValueInfoProto)\n return object;\n var message = new $root.onnx.ValueInfoProto();\n if (object.name != null)\n message.name = String(object.name);\n if (object.type != null) {\n if (typeof object.type !== \"object\")\n throw TypeError(\".onnx.ValueInfoProto.type: object expected\");\n message.type = $root.onnx.TypeProto.fromObject(object.type);\n }\n if (object.docString != null)\n message.docString = String(object.docString);\n return message;\n };\n\n /**\n * Creates a plain object from a ValueInfoProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {onnx.ValueInfoProto} message ValueInfoProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n ValueInfoProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults) {\n object.name = \"\";\n object.type = null;\n object.docString = \"\";\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n object.name = message.name;\n if (message.type != null && message.hasOwnProperty(\"type\"))\n object.type = $root.onnx.TypeProto.toObject(message.type, options);\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n object.docString = message.docString;\n return object;\n };\n\n /**\n * Converts this ValueInfoProto to JSON.\n * @function toJSON\n * @memberof onnx.ValueInfoProto\n * @instance\n * @returns {Object.} JSON object\n */\n ValueInfoProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for ValueInfoProto\n * @function getTypeUrl\n * @memberof onnx.ValueInfoProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n ValueInfoProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.ValueInfoProto\";\n };\n\n return ValueInfoProto;\n })();\n\n onnx.NodeProto = (function() {\n\n /**\n * Properties of a NodeProto.\n * @memberof onnx\n * @interface INodeProto\n * @property {Array.|null} [input] NodeProto input\n * @property {Array.|null} [output] NodeProto output\n * @property {string|null} [name] NodeProto name\n * @property {string|null} [opType] NodeProto opType\n * @property {string|null} [domain] NodeProto domain\n * @property {Array.|null} [attribute] NodeProto attribute\n * @property {string|null} [docString] NodeProto docString\n */\n\n /**\n * Constructs a new NodeProto.\n * @memberof onnx\n * @classdesc Represents a NodeProto.\n * @implements INodeProto\n * @constructor\n * @param {onnx.INodeProto=} [properties] Properties to set\n */\n function NodeProto(properties) {\n this.input = [];\n this.output = [];\n this.attribute = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * NodeProto input.\n * @member {Array.} input\n * @memberof onnx.NodeProto\n * @instance\n */\n NodeProto.prototype.input = $util.emptyArray;\n\n /**\n * NodeProto output.\n * @member {Array.} output\n * @memberof onnx.NodeProto\n * @instance\n */\n NodeProto.prototype.output = $util.emptyArray;\n\n /**\n * NodeProto name.\n * @member {string} name\n * @memberof onnx.NodeProto\n * @instance\n */\n NodeProto.prototype.name = \"\";\n\n /**\n * NodeProto opType.\n * @member {string} opType\n * @memberof onnx.NodeProto\n * @instance\n */\n NodeProto.prototype.opType = \"\";\n\n /**\n * NodeProto domain.\n * @member {string} domain\n * @memberof onnx.NodeProto\n * @instance\n */\n NodeProto.prototype.domain = \"\";\n\n /**\n * NodeProto attribute.\n * @member {Array.} attribute\n * @memberof onnx.NodeProto\n * @instance\n */\n NodeProto.prototype.attribute = $util.emptyArray;\n\n /**\n * NodeProto docString.\n * @member {string} docString\n * @memberof onnx.NodeProto\n * @instance\n */\n NodeProto.prototype.docString = \"\";\n\n /**\n * Creates a new NodeProto instance using the specified properties.\n * @function create\n * @memberof onnx.NodeProto\n * @static\n * @param {onnx.INodeProto=} [properties] Properties to set\n * @returns {onnx.NodeProto} NodeProto instance\n */\n NodeProto.create = function create(properties) {\n return new NodeProto(properties);\n };\n\n /**\n * Encodes the specified NodeProto message. Does not implicitly {@link onnx.NodeProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.NodeProto\n * @static\n * @param {onnx.INodeProto} message NodeProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n NodeProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.input != null && message.input.length)\n for (var i = 0; i < message.input.length; ++i)\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.input[i]);\n if (message.output != null && message.output.length)\n for (var i = 0; i < message.output.length; ++i)\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.output[i]);\n if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.name);\n if (message.opType != null && Object.hasOwnProperty.call(message, \"opType\"))\n writer.uint32(/* id 4, wireType 2 =*/34).string(message.opType);\n if (message.attribute != null && message.attribute.length)\n for (var i = 0; i < message.attribute.length; ++i)\n $root.onnx.AttributeProto.encode(message.attribute[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\n if (message.docString != null && Object.hasOwnProperty.call(message, \"docString\"))\n writer.uint32(/* id 6, wireType 2 =*/50).string(message.docString);\n if (message.domain != null && Object.hasOwnProperty.call(message, \"domain\"))\n writer.uint32(/* id 7, wireType 2 =*/58).string(message.domain);\n return writer;\n };\n\n /**\n * Encodes the specified NodeProto message, length delimited. Does not implicitly {@link onnx.NodeProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.NodeProto\n * @static\n * @param {onnx.INodeProto} message NodeProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n NodeProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a NodeProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.NodeProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.NodeProto} NodeProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n NodeProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.NodeProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n if (!(message.input && message.input.length))\n message.input = [];\n message.input.push(reader.string());\n break;\n }\n case 2: {\n if (!(message.output && message.output.length))\n message.output = [];\n message.output.push(reader.string());\n break;\n }\n case 3: {\n message.name = reader.string();\n break;\n }\n case 4: {\n message.opType = reader.string();\n break;\n }\n case 7: {\n message.domain = reader.string();\n break;\n }\n case 5: {\n if (!(message.attribute && message.attribute.length))\n message.attribute = [];\n message.attribute.push($root.onnx.AttributeProto.decode(reader, reader.uint32()));\n break;\n }\n case 6: {\n message.docString = reader.string();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a NodeProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.NodeProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.NodeProto} NodeProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n NodeProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a NodeProto message.\n * @function verify\n * @memberof onnx.NodeProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n NodeProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.input != null && message.hasOwnProperty(\"input\")) {\n if (!Array.isArray(message.input))\n return \"input: array expected\";\n for (var i = 0; i < message.input.length; ++i)\n if (!$util.isString(message.input[i]))\n return \"input: string[] expected\";\n }\n if (message.output != null && message.hasOwnProperty(\"output\")) {\n if (!Array.isArray(message.output))\n return \"output: array expected\";\n for (var i = 0; i < message.output.length; ++i)\n if (!$util.isString(message.output[i]))\n return \"output: string[] expected\";\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n if (!$util.isString(message.name))\n return \"name: string expected\";\n if (message.opType != null && message.hasOwnProperty(\"opType\"))\n if (!$util.isString(message.opType))\n return \"opType: string expected\";\n if (message.domain != null && message.hasOwnProperty(\"domain\"))\n if (!$util.isString(message.domain))\n return \"domain: string expected\";\n if (message.attribute != null && message.hasOwnProperty(\"attribute\")) {\n if (!Array.isArray(message.attribute))\n return \"attribute: array expected\";\n for (var i = 0; i < message.attribute.length; ++i) {\n var error = $root.onnx.AttributeProto.verify(message.attribute[i]);\n if (error)\n return \"attribute.\" + error;\n }\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n if (!$util.isString(message.docString))\n return \"docString: string expected\";\n return null;\n };\n\n /**\n * Creates a NodeProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.NodeProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.NodeProto} NodeProto\n */\n NodeProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.NodeProto)\n return object;\n var message = new $root.onnx.NodeProto();\n if (object.input) {\n if (!Array.isArray(object.input))\n throw TypeError(\".onnx.NodeProto.input: array expected\");\n message.input = [];\n for (var i = 0; i < object.input.length; ++i)\n message.input[i] = String(object.input[i]);\n }\n if (object.output) {\n if (!Array.isArray(object.output))\n throw TypeError(\".onnx.NodeProto.output: array expected\");\n message.output = [];\n for (var i = 0; i < object.output.length; ++i)\n message.output[i] = String(object.output[i]);\n }\n if (object.name != null)\n message.name = String(object.name);\n if (object.opType != null)\n message.opType = String(object.opType);\n if (object.domain != null)\n message.domain = String(object.domain);\n if (object.attribute) {\n if (!Array.isArray(object.attribute))\n throw TypeError(\".onnx.NodeProto.attribute: array expected\");\n message.attribute = [];\n for (var i = 0; i < object.attribute.length; ++i) {\n if (typeof object.attribute[i] !== \"object\")\n throw TypeError(\".onnx.NodeProto.attribute: object expected\");\n message.attribute[i] = $root.onnx.AttributeProto.fromObject(object.attribute[i]);\n }\n }\n if (object.docString != null)\n message.docString = String(object.docString);\n return message;\n };\n\n /**\n * Creates a plain object from a NodeProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.NodeProto\n * @static\n * @param {onnx.NodeProto} message NodeProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n NodeProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults) {\n object.input = [];\n object.output = [];\n object.attribute = [];\n }\n if (options.defaults) {\n object.name = \"\";\n object.opType = \"\";\n object.docString = \"\";\n object.domain = \"\";\n }\n if (message.input && message.input.length) {\n object.input = [];\n for (var j = 0; j < message.input.length; ++j)\n object.input[j] = message.input[j];\n }\n if (message.output && message.output.length) {\n object.output = [];\n for (var j = 0; j < message.output.length; ++j)\n object.output[j] = message.output[j];\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n object.name = message.name;\n if (message.opType != null && message.hasOwnProperty(\"opType\"))\n object.opType = message.opType;\n if (message.attribute && message.attribute.length) {\n object.attribute = [];\n for (var j = 0; j < message.attribute.length; ++j)\n object.attribute[j] = $root.onnx.AttributeProto.toObject(message.attribute[j], options);\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n object.docString = message.docString;\n if (message.domain != null && message.hasOwnProperty(\"domain\"))\n object.domain = message.domain;\n return object;\n };\n\n /**\n * Converts this NodeProto to JSON.\n * @function toJSON\n * @memberof onnx.NodeProto\n * @instance\n * @returns {Object.} JSON object\n */\n NodeProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for NodeProto\n * @function getTypeUrl\n * @memberof onnx.NodeProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n NodeProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.NodeProto\";\n };\n\n return NodeProto;\n })();\n\n onnx.TrainingInfoProto = (function() {\n\n /**\n * Properties of a TrainingInfoProto.\n * @memberof onnx\n * @interface ITrainingInfoProto\n * @property {onnx.IGraphProto|null} [initialization] TrainingInfoProto initialization\n * @property {onnx.IGraphProto|null} [algorithm] TrainingInfoProto algorithm\n * @property {Array.|null} [initializationBinding] TrainingInfoProto initializationBinding\n * @property {Array.|null} [updateBinding] TrainingInfoProto updateBinding\n */\n\n /**\n * Constructs a new TrainingInfoProto.\n * @memberof onnx\n * @classdesc Represents a TrainingInfoProto.\n * @implements ITrainingInfoProto\n * @constructor\n * @param {onnx.ITrainingInfoProto=} [properties] Properties to set\n */\n function TrainingInfoProto(properties) {\n this.initializationBinding = [];\n this.updateBinding = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * TrainingInfoProto initialization.\n * @member {onnx.IGraphProto|null|undefined} initialization\n * @memberof onnx.TrainingInfoProto\n * @instance\n */\n TrainingInfoProto.prototype.initialization = null;\n\n /**\n * TrainingInfoProto algorithm.\n * @member {onnx.IGraphProto|null|undefined} algorithm\n * @memberof onnx.TrainingInfoProto\n * @instance\n */\n TrainingInfoProto.prototype.algorithm = null;\n\n /**\n * TrainingInfoProto initializationBinding.\n * @member {Array.} initializationBinding\n * @memberof onnx.TrainingInfoProto\n * @instance\n */\n TrainingInfoProto.prototype.initializationBinding = $util.emptyArray;\n\n /**\n * TrainingInfoProto updateBinding.\n * @member {Array.} updateBinding\n * @memberof onnx.TrainingInfoProto\n * @instance\n */\n TrainingInfoProto.prototype.updateBinding = $util.emptyArray;\n\n /**\n * Creates a new TrainingInfoProto instance using the specified properties.\n * @function create\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {onnx.ITrainingInfoProto=} [properties] Properties to set\n * @returns {onnx.TrainingInfoProto} TrainingInfoProto instance\n */\n TrainingInfoProto.create = function create(properties) {\n return new TrainingInfoProto(properties);\n };\n\n /**\n * Encodes the specified TrainingInfoProto message. Does not implicitly {@link onnx.TrainingInfoProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {onnx.ITrainingInfoProto} message TrainingInfoProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TrainingInfoProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.initialization != null && Object.hasOwnProperty.call(message, \"initialization\"))\n $root.onnx.GraphProto.encode(message.initialization, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n if (message.algorithm != null && Object.hasOwnProperty.call(message, \"algorithm\"))\n $root.onnx.GraphProto.encode(message.algorithm, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\n if (message.initializationBinding != null && message.initializationBinding.length)\n for (var i = 0; i < message.initializationBinding.length; ++i)\n $root.onnx.StringStringEntryProto.encode(message.initializationBinding[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\n if (message.updateBinding != null && message.updateBinding.length)\n for (var i = 0; i < message.updateBinding.length; ++i)\n $root.onnx.StringStringEntryProto.encode(message.updateBinding[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified TrainingInfoProto message, length delimited. Does not implicitly {@link onnx.TrainingInfoProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {onnx.ITrainingInfoProto} message TrainingInfoProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TrainingInfoProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a TrainingInfoProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TrainingInfoProto} TrainingInfoProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TrainingInfoProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TrainingInfoProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.initialization = $root.onnx.GraphProto.decode(reader, reader.uint32());\n break;\n }\n case 2: {\n message.algorithm = $root.onnx.GraphProto.decode(reader, reader.uint32());\n break;\n }\n case 3: {\n if (!(message.initializationBinding && message.initializationBinding.length))\n message.initializationBinding = [];\n message.initializationBinding.push($root.onnx.StringStringEntryProto.decode(reader, reader.uint32()));\n break;\n }\n case 4: {\n if (!(message.updateBinding && message.updateBinding.length))\n message.updateBinding = [];\n message.updateBinding.push($root.onnx.StringStringEntryProto.decode(reader, reader.uint32()));\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a TrainingInfoProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TrainingInfoProto} TrainingInfoProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TrainingInfoProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a TrainingInfoProto message.\n * @function verify\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n TrainingInfoProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.initialization != null && message.hasOwnProperty(\"initialization\")) {\n var error = $root.onnx.GraphProto.verify(message.initialization);\n if (error)\n return \"initialization.\" + error;\n }\n if (message.algorithm != null && message.hasOwnProperty(\"algorithm\")) {\n var error = $root.onnx.GraphProto.verify(message.algorithm);\n if (error)\n return \"algorithm.\" + error;\n }\n if (message.initializationBinding != null && message.hasOwnProperty(\"initializationBinding\")) {\n if (!Array.isArray(message.initializationBinding))\n return \"initializationBinding: array expected\";\n for (var i = 0; i < message.initializationBinding.length; ++i) {\n var error = $root.onnx.StringStringEntryProto.verify(message.initializationBinding[i]);\n if (error)\n return \"initializationBinding.\" + error;\n }\n }\n if (message.updateBinding != null && message.hasOwnProperty(\"updateBinding\")) {\n if (!Array.isArray(message.updateBinding))\n return \"updateBinding: array expected\";\n for (var i = 0; i < message.updateBinding.length; ++i) {\n var error = $root.onnx.StringStringEntryProto.verify(message.updateBinding[i]);\n if (error)\n return \"updateBinding.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates a TrainingInfoProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TrainingInfoProto} TrainingInfoProto\n */\n TrainingInfoProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TrainingInfoProto)\n return object;\n var message = new $root.onnx.TrainingInfoProto();\n if (object.initialization != null) {\n if (typeof object.initialization !== \"object\")\n throw TypeError(\".onnx.TrainingInfoProto.initialization: object expected\");\n message.initialization = $root.onnx.GraphProto.fromObject(object.initialization);\n }\n if (object.algorithm != null) {\n if (typeof object.algorithm !== \"object\")\n throw TypeError(\".onnx.TrainingInfoProto.algorithm: object expected\");\n message.algorithm = $root.onnx.GraphProto.fromObject(object.algorithm);\n }\n if (object.initializationBinding) {\n if (!Array.isArray(object.initializationBinding))\n throw TypeError(\".onnx.TrainingInfoProto.initializationBinding: array expected\");\n message.initializationBinding = [];\n for (var i = 0; i < object.initializationBinding.length; ++i) {\n if (typeof object.initializationBinding[i] !== \"object\")\n throw TypeError(\".onnx.TrainingInfoProto.initializationBinding: object expected\");\n message.initializationBinding[i] = $root.onnx.StringStringEntryProto.fromObject(object.initializationBinding[i]);\n }\n }\n if (object.updateBinding) {\n if (!Array.isArray(object.updateBinding))\n throw TypeError(\".onnx.TrainingInfoProto.updateBinding: array expected\");\n message.updateBinding = [];\n for (var i = 0; i < object.updateBinding.length; ++i) {\n if (typeof object.updateBinding[i] !== \"object\")\n throw TypeError(\".onnx.TrainingInfoProto.updateBinding: object expected\");\n message.updateBinding[i] = $root.onnx.StringStringEntryProto.fromObject(object.updateBinding[i]);\n }\n }\n return message;\n };\n\n /**\n * Creates a plain object from a TrainingInfoProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {onnx.TrainingInfoProto} message TrainingInfoProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n TrainingInfoProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults) {\n object.initializationBinding = [];\n object.updateBinding = [];\n }\n if (options.defaults) {\n object.initialization = null;\n object.algorithm = null;\n }\n if (message.initialization != null && message.hasOwnProperty(\"initialization\"))\n object.initialization = $root.onnx.GraphProto.toObject(message.initialization, options);\n if (message.algorithm != null && message.hasOwnProperty(\"algorithm\"))\n object.algorithm = $root.onnx.GraphProto.toObject(message.algorithm, options);\n if (message.initializationBinding && message.initializationBinding.length) {\n object.initializationBinding = [];\n for (var j = 0; j < message.initializationBinding.length; ++j)\n object.initializationBinding[j] = $root.onnx.StringStringEntryProto.toObject(message.initializationBinding[j], options);\n }\n if (message.updateBinding && message.updateBinding.length) {\n object.updateBinding = [];\n for (var j = 0; j < message.updateBinding.length; ++j)\n object.updateBinding[j] = $root.onnx.StringStringEntryProto.toObject(message.updateBinding[j], options);\n }\n return object;\n };\n\n /**\n * Converts this TrainingInfoProto to JSON.\n * @function toJSON\n * @memberof onnx.TrainingInfoProto\n * @instance\n * @returns {Object.} JSON object\n */\n TrainingInfoProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for TrainingInfoProto\n * @function getTypeUrl\n * @memberof onnx.TrainingInfoProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n TrainingInfoProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TrainingInfoProto\";\n };\n\n return TrainingInfoProto;\n })();\n\n onnx.ModelProto = (function() {\n\n /**\n * Properties of a ModelProto.\n * @memberof onnx\n * @interface IModelProto\n * @property {number|Long|null} [irVersion] ModelProto irVersion\n * @property {Array.|null} [opsetImport] ModelProto opsetImport\n * @property {string|null} [producerName] ModelProto producerName\n * @property {string|null} [producerVersion] ModelProto producerVersion\n * @property {string|null} [domain] ModelProto domain\n * @property {number|Long|null} [modelVersion] ModelProto modelVersion\n * @property {string|null} [docString] ModelProto docString\n * @property {onnx.IGraphProto|null} [graph] ModelProto graph\n * @property {Array.|null} [metadataProps] ModelProto metadataProps\n * @property {Array.|null} [trainingInfo] ModelProto trainingInfo\n * @property {Array.|null} [functions] ModelProto functions\n */\n\n /**\n * Constructs a new ModelProto.\n * @memberof onnx\n * @classdesc Represents a ModelProto.\n * @implements IModelProto\n * @constructor\n * @param {onnx.IModelProto=} [properties] Properties to set\n */\n function ModelProto(properties) {\n this.opsetImport = [];\n this.metadataProps = [];\n this.trainingInfo = [];\n this.functions = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * ModelProto irVersion.\n * @member {number|Long} irVersion\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.irVersion = $util.Long ? $util.Long.fromBits(0,0,false) : 0;\n\n /**\n * ModelProto opsetImport.\n * @member {Array.} opsetImport\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.opsetImport = $util.emptyArray;\n\n /**\n * ModelProto producerName.\n * @member {string} producerName\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.producerName = \"\";\n\n /**\n * ModelProto producerVersion.\n * @member {string} producerVersion\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.producerVersion = \"\";\n\n /**\n * ModelProto domain.\n * @member {string} domain\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.domain = \"\";\n\n /**\n * ModelProto modelVersion.\n * @member {number|Long} modelVersion\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.modelVersion = $util.Long ? $util.Long.fromBits(0,0,false) : 0;\n\n /**\n * ModelProto docString.\n * @member {string} docString\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.docString = \"\";\n\n /**\n * ModelProto graph.\n * @member {onnx.IGraphProto|null|undefined} graph\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.graph = null;\n\n /**\n * ModelProto metadataProps.\n * @member {Array.} metadataProps\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.metadataProps = $util.emptyArray;\n\n /**\n * ModelProto trainingInfo.\n * @member {Array.} trainingInfo\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.trainingInfo = $util.emptyArray;\n\n /**\n * ModelProto functions.\n * @member {Array.} functions\n * @memberof onnx.ModelProto\n * @instance\n */\n ModelProto.prototype.functions = $util.emptyArray;\n\n /**\n * Creates a new ModelProto instance using the specified properties.\n * @function create\n * @memberof onnx.ModelProto\n * @static\n * @param {onnx.IModelProto=} [properties] Properties to set\n * @returns {onnx.ModelProto} ModelProto instance\n */\n ModelProto.create = function create(properties) {\n return new ModelProto(properties);\n };\n\n /**\n * Encodes the specified ModelProto message. Does not implicitly {@link onnx.ModelProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.ModelProto\n * @static\n * @param {onnx.IModelProto} message ModelProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ModelProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.irVersion != null && Object.hasOwnProperty.call(message, \"irVersion\"))\n writer.uint32(/* id 1, wireType 0 =*/8).int64(message.irVersion);\n if (message.producerName != null && Object.hasOwnProperty.call(message, \"producerName\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.producerName);\n if (message.producerVersion != null && Object.hasOwnProperty.call(message, \"producerVersion\"))\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.producerVersion);\n if (message.domain != null && Object.hasOwnProperty.call(message, \"domain\"))\n writer.uint32(/* id 4, wireType 2 =*/34).string(message.domain);\n if (message.modelVersion != null && Object.hasOwnProperty.call(message, \"modelVersion\"))\n writer.uint32(/* id 5, wireType 0 =*/40).int64(message.modelVersion);\n if (message.docString != null && Object.hasOwnProperty.call(message, \"docString\"))\n writer.uint32(/* id 6, wireType 2 =*/50).string(message.docString);\n if (message.graph != null && Object.hasOwnProperty.call(message, \"graph\"))\n $root.onnx.GraphProto.encode(message.graph, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();\n if (message.opsetImport != null && message.opsetImport.length)\n for (var i = 0; i < message.opsetImport.length; ++i)\n $root.onnx.OperatorSetIdProto.encode(message.opsetImport[i], writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();\n if (message.metadataProps != null && message.metadataProps.length)\n for (var i = 0; i < message.metadataProps.length; ++i)\n $root.onnx.StringStringEntryProto.encode(message.metadataProps[i], writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim();\n if (message.trainingInfo != null && message.trainingInfo.length)\n for (var i = 0; i < message.trainingInfo.length; ++i)\n $root.onnx.TrainingInfoProto.encode(message.trainingInfo[i], writer.uint32(/* id 20, wireType 2 =*/162).fork()).ldelim();\n if (message.functions != null && message.functions.length)\n for (var i = 0; i < message.functions.length; ++i)\n $root.onnx.FunctionProto.encode(message.functions[i], writer.uint32(/* id 25, wireType 2 =*/202).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified ModelProto message, length delimited. Does not implicitly {@link onnx.ModelProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.ModelProto\n * @static\n * @param {onnx.IModelProto} message ModelProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n ModelProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a ModelProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.ModelProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.ModelProto} ModelProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ModelProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.ModelProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.irVersion = reader.int64();\n break;\n }\n case 8: {\n if (!(message.opsetImport && message.opsetImport.length))\n message.opsetImport = [];\n message.opsetImport.push($root.onnx.OperatorSetIdProto.decode(reader, reader.uint32()));\n break;\n }\n case 2: {\n message.producerName = reader.string();\n break;\n }\n case 3: {\n message.producerVersion = reader.string();\n break;\n }\n case 4: {\n message.domain = reader.string();\n break;\n }\n case 5: {\n message.modelVersion = reader.int64();\n break;\n }\n case 6: {\n message.docString = reader.string();\n break;\n }\n case 7: {\n message.graph = $root.onnx.GraphProto.decode(reader, reader.uint32());\n break;\n }\n case 14: {\n if (!(message.metadataProps && message.metadataProps.length))\n message.metadataProps = [];\n message.metadataProps.push($root.onnx.StringStringEntryProto.decode(reader, reader.uint32()));\n break;\n }\n case 20: {\n if (!(message.trainingInfo && message.trainingInfo.length))\n message.trainingInfo = [];\n message.trainingInfo.push($root.onnx.TrainingInfoProto.decode(reader, reader.uint32()));\n break;\n }\n case 25: {\n if (!(message.functions && message.functions.length))\n message.functions = [];\n message.functions.push($root.onnx.FunctionProto.decode(reader, reader.uint32()));\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a ModelProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.ModelProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.ModelProto} ModelProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n ModelProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a ModelProto message.\n * @function verify\n * @memberof onnx.ModelProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n ModelProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.irVersion != null && message.hasOwnProperty(\"irVersion\"))\n if (!$util.isInteger(message.irVersion) && !(message.irVersion && $util.isInteger(message.irVersion.low) && $util.isInteger(message.irVersion.high)))\n return \"irVersion: integer|Long expected\";\n if (message.opsetImport != null && message.hasOwnProperty(\"opsetImport\")) {\n if (!Array.isArray(message.opsetImport))\n return \"opsetImport: array expected\";\n for (var i = 0; i < message.opsetImport.length; ++i) {\n var error = $root.onnx.OperatorSetIdProto.verify(message.opsetImport[i]);\n if (error)\n return \"opsetImport.\" + error;\n }\n }\n if (message.producerName != null && message.hasOwnProperty(\"producerName\"))\n if (!$util.isString(message.producerName))\n return \"producerName: string expected\";\n if (message.producerVersion != null && message.hasOwnProperty(\"producerVersion\"))\n if (!$util.isString(message.producerVersion))\n return \"producerVersion: string expected\";\n if (message.domain != null && message.hasOwnProperty(\"domain\"))\n if (!$util.isString(message.domain))\n return \"domain: string expected\";\n if (message.modelVersion != null && message.hasOwnProperty(\"modelVersion\"))\n if (!$util.isInteger(message.modelVersion) && !(message.modelVersion && $util.isInteger(message.modelVersion.low) && $util.isInteger(message.modelVersion.high)))\n return \"modelVersion: integer|Long expected\";\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n if (!$util.isString(message.docString))\n return \"docString: string expected\";\n if (message.graph != null && message.hasOwnProperty(\"graph\")) {\n var error = $root.onnx.GraphProto.verify(message.graph);\n if (error)\n return \"graph.\" + error;\n }\n if (message.metadataProps != null && message.hasOwnProperty(\"metadataProps\")) {\n if (!Array.isArray(message.metadataProps))\n return \"metadataProps: array expected\";\n for (var i = 0; i < message.metadataProps.length; ++i) {\n var error = $root.onnx.StringStringEntryProto.verify(message.metadataProps[i]);\n if (error)\n return \"metadataProps.\" + error;\n }\n }\n if (message.trainingInfo != null && message.hasOwnProperty(\"trainingInfo\")) {\n if (!Array.isArray(message.trainingInfo))\n return \"trainingInfo: array expected\";\n for (var i = 0; i < message.trainingInfo.length; ++i) {\n var error = $root.onnx.TrainingInfoProto.verify(message.trainingInfo[i]);\n if (error)\n return \"trainingInfo.\" + error;\n }\n }\n if (message.functions != null && message.hasOwnProperty(\"functions\")) {\n if (!Array.isArray(message.functions))\n return \"functions: array expected\";\n for (var i = 0; i < message.functions.length; ++i) {\n var error = $root.onnx.FunctionProto.verify(message.functions[i]);\n if (error)\n return \"functions.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates a ModelProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.ModelProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.ModelProto} ModelProto\n */\n ModelProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.ModelProto)\n return object;\n var message = new $root.onnx.ModelProto();\n if (object.irVersion != null)\n if ($util.Long)\n (message.irVersion = $util.Long.fromValue(object.irVersion)).unsigned = false;\n else if (typeof object.irVersion === \"string\")\n message.irVersion = parseInt(object.irVersion, 10);\n else if (typeof object.irVersion === \"number\")\n message.irVersion = object.irVersion;\n else if (typeof object.irVersion === \"object\")\n message.irVersion = new $util.LongBits(object.irVersion.low >>> 0, object.irVersion.high >>> 0).toNumber();\n if (object.opsetImport) {\n if (!Array.isArray(object.opsetImport))\n throw TypeError(\".onnx.ModelProto.opsetImport: array expected\");\n message.opsetImport = [];\n for (var i = 0; i < object.opsetImport.length; ++i) {\n if (typeof object.opsetImport[i] !== \"object\")\n throw TypeError(\".onnx.ModelProto.opsetImport: object expected\");\n message.opsetImport[i] = $root.onnx.OperatorSetIdProto.fromObject(object.opsetImport[i]);\n }\n }\n if (object.producerName != null)\n message.producerName = String(object.producerName);\n if (object.producerVersion != null)\n message.producerVersion = String(object.producerVersion);\n if (object.domain != null)\n message.domain = String(object.domain);\n if (object.modelVersion != null)\n if ($util.Long)\n (message.modelVersion = $util.Long.fromValue(object.modelVersion)).unsigned = false;\n else if (typeof object.modelVersion === \"string\")\n message.modelVersion = parseInt(object.modelVersion, 10);\n else if (typeof object.modelVersion === \"number\")\n message.modelVersion = object.modelVersion;\n else if (typeof object.modelVersion === \"object\")\n message.modelVersion = new $util.LongBits(object.modelVersion.low >>> 0, object.modelVersion.high >>> 0).toNumber();\n if (object.docString != null)\n message.docString = String(object.docString);\n if (object.graph != null) {\n if (typeof object.graph !== \"object\")\n throw TypeError(\".onnx.ModelProto.graph: object expected\");\n message.graph = $root.onnx.GraphProto.fromObject(object.graph);\n }\n if (object.metadataProps) {\n if (!Array.isArray(object.metadataProps))\n throw TypeError(\".onnx.ModelProto.metadataProps: array expected\");\n message.metadataProps = [];\n for (var i = 0; i < object.metadataProps.length; ++i) {\n if (typeof object.metadataProps[i] !== \"object\")\n throw TypeError(\".onnx.ModelProto.metadataProps: object expected\");\n message.metadataProps[i] = $root.onnx.StringStringEntryProto.fromObject(object.metadataProps[i]);\n }\n }\n if (object.trainingInfo) {\n if (!Array.isArray(object.trainingInfo))\n throw TypeError(\".onnx.ModelProto.trainingInfo: array expected\");\n message.trainingInfo = [];\n for (var i = 0; i < object.trainingInfo.length; ++i) {\n if (typeof object.trainingInfo[i] !== \"object\")\n throw TypeError(\".onnx.ModelProto.trainingInfo: object expected\");\n message.trainingInfo[i] = $root.onnx.TrainingInfoProto.fromObject(object.trainingInfo[i]);\n }\n }\n if (object.functions) {\n if (!Array.isArray(object.functions))\n throw TypeError(\".onnx.ModelProto.functions: array expected\");\n message.functions = [];\n for (var i = 0; i < object.functions.length; ++i) {\n if (typeof object.functions[i] !== \"object\")\n throw TypeError(\".onnx.ModelProto.functions: object expected\");\n message.functions[i] = $root.onnx.FunctionProto.fromObject(object.functions[i]);\n }\n }\n return message;\n };\n\n /**\n * Creates a plain object from a ModelProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.ModelProto\n * @static\n * @param {onnx.ModelProto} message ModelProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n ModelProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults) {\n object.opsetImport = [];\n object.metadataProps = [];\n object.trainingInfo = [];\n object.functions = [];\n }\n if (options.defaults) {\n if ($util.Long) {\n var long = new $util.Long(0, 0, false);\n object.irVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.irVersion = options.longs === String ? \"0\" : 0;\n object.producerName = \"\";\n object.producerVersion = \"\";\n object.domain = \"\";\n if ($util.Long) {\n var long = new $util.Long(0, 0, false);\n object.modelVersion = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.modelVersion = options.longs === String ? \"0\" : 0;\n object.docString = \"\";\n object.graph = null;\n }\n if (message.irVersion != null && message.hasOwnProperty(\"irVersion\"))\n if (typeof message.irVersion === \"number\")\n object.irVersion = options.longs === String ? String(message.irVersion) : message.irVersion;\n else\n object.irVersion = options.longs === String ? $util.Long.prototype.toString.call(message.irVersion) : options.longs === Number ? new $util.LongBits(message.irVersion.low >>> 0, message.irVersion.high >>> 0).toNumber() : message.irVersion;\n if (message.producerName != null && message.hasOwnProperty(\"producerName\"))\n object.producerName = message.producerName;\n if (message.producerVersion != null && message.hasOwnProperty(\"producerVersion\"))\n object.producerVersion = message.producerVersion;\n if (message.domain != null && message.hasOwnProperty(\"domain\"))\n object.domain = message.domain;\n if (message.modelVersion != null && message.hasOwnProperty(\"modelVersion\"))\n if (typeof message.modelVersion === \"number\")\n object.modelVersion = options.longs === String ? String(message.modelVersion) : message.modelVersion;\n else\n object.modelVersion = options.longs === String ? $util.Long.prototype.toString.call(message.modelVersion) : options.longs === Number ? new $util.LongBits(message.modelVersion.low >>> 0, message.modelVersion.high >>> 0).toNumber() : message.modelVersion;\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n object.docString = message.docString;\n if (message.graph != null && message.hasOwnProperty(\"graph\"))\n object.graph = $root.onnx.GraphProto.toObject(message.graph, options);\n if (message.opsetImport && message.opsetImport.length) {\n object.opsetImport = [];\n for (var j = 0; j < message.opsetImport.length; ++j)\n object.opsetImport[j] = $root.onnx.OperatorSetIdProto.toObject(message.opsetImport[j], options);\n }\n if (message.metadataProps && message.metadataProps.length) {\n object.metadataProps = [];\n for (var j = 0; j < message.metadataProps.length; ++j)\n object.metadataProps[j] = $root.onnx.StringStringEntryProto.toObject(message.metadataProps[j], options);\n }\n if (message.trainingInfo && message.trainingInfo.length) {\n object.trainingInfo = [];\n for (var j = 0; j < message.trainingInfo.length; ++j)\n object.trainingInfo[j] = $root.onnx.TrainingInfoProto.toObject(message.trainingInfo[j], options);\n }\n if (message.functions && message.functions.length) {\n object.functions = [];\n for (var j = 0; j < message.functions.length; ++j)\n object.functions[j] = $root.onnx.FunctionProto.toObject(message.functions[j], options);\n }\n return object;\n };\n\n /**\n * Converts this ModelProto to JSON.\n * @function toJSON\n * @memberof onnx.ModelProto\n * @instance\n * @returns {Object.} JSON object\n */\n ModelProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for ModelProto\n * @function getTypeUrl\n * @memberof onnx.ModelProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n ModelProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.ModelProto\";\n };\n\n return ModelProto;\n })();\n\n onnx.StringStringEntryProto = (function() {\n\n /**\n * Properties of a StringStringEntryProto.\n * @memberof onnx\n * @interface IStringStringEntryProto\n * @property {string|null} [key] StringStringEntryProto key\n * @property {string|null} [value] StringStringEntryProto value\n */\n\n /**\n * Constructs a new StringStringEntryProto.\n * @memberof onnx\n * @classdesc Represents a StringStringEntryProto.\n * @implements IStringStringEntryProto\n * @constructor\n * @param {onnx.IStringStringEntryProto=} [properties] Properties to set\n */\n function StringStringEntryProto(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * StringStringEntryProto key.\n * @member {string} key\n * @memberof onnx.StringStringEntryProto\n * @instance\n */\n StringStringEntryProto.prototype.key = \"\";\n\n /**\n * StringStringEntryProto value.\n * @member {string} value\n * @memberof onnx.StringStringEntryProto\n * @instance\n */\n StringStringEntryProto.prototype.value = \"\";\n\n /**\n * Creates a new StringStringEntryProto instance using the specified properties.\n * @function create\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {onnx.IStringStringEntryProto=} [properties] Properties to set\n * @returns {onnx.StringStringEntryProto} StringStringEntryProto instance\n */\n StringStringEntryProto.create = function create(properties) {\n return new StringStringEntryProto(properties);\n };\n\n /**\n * Encodes the specified StringStringEntryProto message. Does not implicitly {@link onnx.StringStringEntryProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {onnx.IStringStringEntryProto} message StringStringEntryProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n StringStringEntryProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.key != null && Object.hasOwnProperty.call(message, \"key\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.key);\n if (message.value != null && Object.hasOwnProperty.call(message, \"value\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.value);\n return writer;\n };\n\n /**\n * Encodes the specified StringStringEntryProto message, length delimited. Does not implicitly {@link onnx.StringStringEntryProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {onnx.IStringStringEntryProto} message StringStringEntryProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n StringStringEntryProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a StringStringEntryProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.StringStringEntryProto} StringStringEntryProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n StringStringEntryProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.StringStringEntryProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.key = reader.string();\n break;\n }\n case 2: {\n message.value = reader.string();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a StringStringEntryProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.StringStringEntryProto} StringStringEntryProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n StringStringEntryProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a StringStringEntryProto message.\n * @function verify\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n StringStringEntryProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.key != null && message.hasOwnProperty(\"key\"))\n if (!$util.isString(message.key))\n return \"key: string expected\";\n if (message.value != null && message.hasOwnProperty(\"value\"))\n if (!$util.isString(message.value))\n return \"value: string expected\";\n return null;\n };\n\n /**\n * Creates a StringStringEntryProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.StringStringEntryProto} StringStringEntryProto\n */\n StringStringEntryProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.StringStringEntryProto)\n return object;\n var message = new $root.onnx.StringStringEntryProto();\n if (object.key != null)\n message.key = String(object.key);\n if (object.value != null)\n message.value = String(object.value);\n return message;\n };\n\n /**\n * Creates a plain object from a StringStringEntryProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {onnx.StringStringEntryProto} message StringStringEntryProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n StringStringEntryProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults) {\n object.key = \"\";\n object.value = \"\";\n }\n if (message.key != null && message.hasOwnProperty(\"key\"))\n object.key = message.key;\n if (message.value != null && message.hasOwnProperty(\"value\"))\n object.value = message.value;\n return object;\n };\n\n /**\n * Converts this StringStringEntryProto to JSON.\n * @function toJSON\n * @memberof onnx.StringStringEntryProto\n * @instance\n * @returns {Object.} JSON object\n */\n StringStringEntryProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for StringStringEntryProto\n * @function getTypeUrl\n * @memberof onnx.StringStringEntryProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n StringStringEntryProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.StringStringEntryProto\";\n };\n\n return StringStringEntryProto;\n })();\n\n onnx.TensorAnnotation = (function() {\n\n /**\n * Properties of a TensorAnnotation.\n * @memberof onnx\n * @interface ITensorAnnotation\n * @property {string|null} [tensorName] TensorAnnotation tensorName\n * @property {Array.|null} [quantParameterTensorNames] TensorAnnotation quantParameterTensorNames\n */\n\n /**\n * Constructs a new TensorAnnotation.\n * @memberof onnx\n * @classdesc Represents a TensorAnnotation.\n * @implements ITensorAnnotation\n * @constructor\n * @param {onnx.ITensorAnnotation=} [properties] Properties to set\n */\n function TensorAnnotation(properties) {\n this.quantParameterTensorNames = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * TensorAnnotation tensorName.\n * @member {string} tensorName\n * @memberof onnx.TensorAnnotation\n * @instance\n */\n TensorAnnotation.prototype.tensorName = \"\";\n\n /**\n * TensorAnnotation quantParameterTensorNames.\n * @member {Array.} quantParameterTensorNames\n * @memberof onnx.TensorAnnotation\n * @instance\n */\n TensorAnnotation.prototype.quantParameterTensorNames = $util.emptyArray;\n\n /**\n * Creates a new TensorAnnotation instance using the specified properties.\n * @function create\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {onnx.ITensorAnnotation=} [properties] Properties to set\n * @returns {onnx.TensorAnnotation} TensorAnnotation instance\n */\n TensorAnnotation.create = function create(properties) {\n return new TensorAnnotation(properties);\n };\n\n /**\n * Encodes the specified TensorAnnotation message. Does not implicitly {@link onnx.TensorAnnotation.verify|verify} messages.\n * @function encode\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {onnx.ITensorAnnotation} message TensorAnnotation message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TensorAnnotation.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.tensorName != null && Object.hasOwnProperty.call(message, \"tensorName\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.tensorName);\n if (message.quantParameterTensorNames != null && message.quantParameterTensorNames.length)\n for (var i = 0; i < message.quantParameterTensorNames.length; ++i)\n $root.onnx.StringStringEntryProto.encode(message.quantParameterTensorNames[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified TensorAnnotation message, length delimited. Does not implicitly {@link onnx.TensorAnnotation.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {onnx.ITensorAnnotation} message TensorAnnotation message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TensorAnnotation.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a TensorAnnotation message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TensorAnnotation} TensorAnnotation\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TensorAnnotation.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TensorAnnotation();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.tensorName = reader.string();\n break;\n }\n case 2: {\n if (!(message.quantParameterTensorNames && message.quantParameterTensorNames.length))\n message.quantParameterTensorNames = [];\n message.quantParameterTensorNames.push($root.onnx.StringStringEntryProto.decode(reader, reader.uint32()));\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a TensorAnnotation message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TensorAnnotation} TensorAnnotation\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TensorAnnotation.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a TensorAnnotation message.\n * @function verify\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n TensorAnnotation.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.tensorName != null && message.hasOwnProperty(\"tensorName\"))\n if (!$util.isString(message.tensorName))\n return \"tensorName: string expected\";\n if (message.quantParameterTensorNames != null && message.hasOwnProperty(\"quantParameterTensorNames\")) {\n if (!Array.isArray(message.quantParameterTensorNames))\n return \"quantParameterTensorNames: array expected\";\n for (var i = 0; i < message.quantParameterTensorNames.length; ++i) {\n var error = $root.onnx.StringStringEntryProto.verify(message.quantParameterTensorNames[i]);\n if (error)\n return \"quantParameterTensorNames.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates a TensorAnnotation message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TensorAnnotation} TensorAnnotation\n */\n TensorAnnotation.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TensorAnnotation)\n return object;\n var message = new $root.onnx.TensorAnnotation();\n if (object.tensorName != null)\n message.tensorName = String(object.tensorName);\n if (object.quantParameterTensorNames) {\n if (!Array.isArray(object.quantParameterTensorNames))\n throw TypeError(\".onnx.TensorAnnotation.quantParameterTensorNames: array expected\");\n message.quantParameterTensorNames = [];\n for (var i = 0; i < object.quantParameterTensorNames.length; ++i) {\n if (typeof object.quantParameterTensorNames[i] !== \"object\")\n throw TypeError(\".onnx.TensorAnnotation.quantParameterTensorNames: object expected\");\n message.quantParameterTensorNames[i] = $root.onnx.StringStringEntryProto.fromObject(object.quantParameterTensorNames[i]);\n }\n }\n return message;\n };\n\n /**\n * Creates a plain object from a TensorAnnotation message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {onnx.TensorAnnotation} message TensorAnnotation\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n TensorAnnotation.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.quantParameterTensorNames = [];\n if (options.defaults)\n object.tensorName = \"\";\n if (message.tensorName != null && message.hasOwnProperty(\"tensorName\"))\n object.tensorName = message.tensorName;\n if (message.quantParameterTensorNames && message.quantParameterTensorNames.length) {\n object.quantParameterTensorNames = [];\n for (var j = 0; j < message.quantParameterTensorNames.length; ++j)\n object.quantParameterTensorNames[j] = $root.onnx.StringStringEntryProto.toObject(message.quantParameterTensorNames[j], options);\n }\n return object;\n };\n\n /**\n * Converts this TensorAnnotation to JSON.\n * @function toJSON\n * @memberof onnx.TensorAnnotation\n * @instance\n * @returns {Object.} JSON object\n */\n TensorAnnotation.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for TensorAnnotation\n * @function getTypeUrl\n * @memberof onnx.TensorAnnotation\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n TensorAnnotation.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TensorAnnotation\";\n };\n\n return TensorAnnotation;\n })();\n\n onnx.GraphProto = (function() {\n\n /**\n * Properties of a GraphProto.\n * @memberof onnx\n * @interface IGraphProto\n * @property {Array.|null} [node] GraphProto node\n * @property {string|null} [name] GraphProto name\n * @property {Array.|null} [initializer] GraphProto initializer\n * @property {Array.|null} [sparseInitializer] GraphProto sparseInitializer\n * @property {string|null} [docString] GraphProto docString\n * @property {Array.|null} [input] GraphProto input\n * @property {Array.|null} [output] GraphProto output\n * @property {Array.|null} [valueInfo] GraphProto valueInfo\n * @property {Array.|null} [quantizationAnnotation] GraphProto quantizationAnnotation\n */\n\n /**\n * Constructs a new GraphProto.\n * @memberof onnx\n * @classdesc Represents a GraphProto.\n * @implements IGraphProto\n * @constructor\n * @param {onnx.IGraphProto=} [properties] Properties to set\n */\n function GraphProto(properties) {\n this.node = [];\n this.initializer = [];\n this.sparseInitializer = [];\n this.input = [];\n this.output = [];\n this.valueInfo = [];\n this.quantizationAnnotation = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * GraphProto node.\n * @member {Array.} node\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.node = $util.emptyArray;\n\n /**\n * GraphProto name.\n * @member {string} name\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.name = \"\";\n\n /**\n * GraphProto initializer.\n * @member {Array.} initializer\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.initializer = $util.emptyArray;\n\n /**\n * GraphProto sparseInitializer.\n * @member {Array.} sparseInitializer\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.sparseInitializer = $util.emptyArray;\n\n /**\n * GraphProto docString.\n * @member {string} docString\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.docString = \"\";\n\n /**\n * GraphProto input.\n * @member {Array.} input\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.input = $util.emptyArray;\n\n /**\n * GraphProto output.\n * @member {Array.} output\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.output = $util.emptyArray;\n\n /**\n * GraphProto valueInfo.\n * @member {Array.} valueInfo\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.valueInfo = $util.emptyArray;\n\n /**\n * GraphProto quantizationAnnotation.\n * @member {Array.} quantizationAnnotation\n * @memberof onnx.GraphProto\n * @instance\n */\n GraphProto.prototype.quantizationAnnotation = $util.emptyArray;\n\n /**\n * Creates a new GraphProto instance using the specified properties.\n * @function create\n * @memberof onnx.GraphProto\n * @static\n * @param {onnx.IGraphProto=} [properties] Properties to set\n * @returns {onnx.GraphProto} GraphProto instance\n */\n GraphProto.create = function create(properties) {\n return new GraphProto(properties);\n };\n\n /**\n * Encodes the specified GraphProto message. Does not implicitly {@link onnx.GraphProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.GraphProto\n * @static\n * @param {onnx.IGraphProto} message GraphProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n GraphProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.node != null && message.node.length)\n for (var i = 0; i < message.node.length; ++i)\n $root.onnx.NodeProto.encode(message.node[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.name);\n if (message.initializer != null && message.initializer.length)\n for (var i = 0; i < message.initializer.length; ++i)\n $root.onnx.TensorProto.encode(message.initializer[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\n if (message.docString != null && Object.hasOwnProperty.call(message, \"docString\"))\n writer.uint32(/* id 10, wireType 2 =*/82).string(message.docString);\n if (message.input != null && message.input.length)\n for (var i = 0; i < message.input.length; ++i)\n $root.onnx.ValueInfoProto.encode(message.input[i], writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();\n if (message.output != null && message.output.length)\n for (var i = 0; i < message.output.length; ++i)\n $root.onnx.ValueInfoProto.encode(message.output[i], writer.uint32(/* id 12, wireType 2 =*/98).fork()).ldelim();\n if (message.valueInfo != null && message.valueInfo.length)\n for (var i = 0; i < message.valueInfo.length; ++i)\n $root.onnx.ValueInfoProto.encode(message.valueInfo[i], writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim();\n if (message.quantizationAnnotation != null && message.quantizationAnnotation.length)\n for (var i = 0; i < message.quantizationAnnotation.length; ++i)\n $root.onnx.TensorAnnotation.encode(message.quantizationAnnotation[i], writer.uint32(/* id 14, wireType 2 =*/114).fork()).ldelim();\n if (message.sparseInitializer != null && message.sparseInitializer.length)\n for (var i = 0; i < message.sparseInitializer.length; ++i)\n $root.onnx.SparseTensorProto.encode(message.sparseInitializer[i], writer.uint32(/* id 15, wireType 2 =*/122).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified GraphProto message, length delimited. Does not implicitly {@link onnx.GraphProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.GraphProto\n * @static\n * @param {onnx.IGraphProto} message GraphProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n GraphProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a GraphProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.GraphProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.GraphProto} GraphProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n GraphProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.GraphProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n if (!(message.node && message.node.length))\n message.node = [];\n message.node.push($root.onnx.NodeProto.decode(reader, reader.uint32()));\n break;\n }\n case 2: {\n message.name = reader.string();\n break;\n }\n case 5: {\n if (!(message.initializer && message.initializer.length))\n message.initializer = [];\n message.initializer.push($root.onnx.TensorProto.decode(reader, reader.uint32()));\n break;\n }\n case 15: {\n if (!(message.sparseInitializer && message.sparseInitializer.length))\n message.sparseInitializer = [];\n message.sparseInitializer.push($root.onnx.SparseTensorProto.decode(reader, reader.uint32()));\n break;\n }\n case 10: {\n message.docString = reader.string();\n break;\n }\n case 11: {\n if (!(message.input && message.input.length))\n message.input = [];\n message.input.push($root.onnx.ValueInfoProto.decode(reader, reader.uint32()));\n break;\n }\n case 12: {\n if (!(message.output && message.output.length))\n message.output = [];\n message.output.push($root.onnx.ValueInfoProto.decode(reader, reader.uint32()));\n break;\n }\n case 13: {\n if (!(message.valueInfo && message.valueInfo.length))\n message.valueInfo = [];\n message.valueInfo.push($root.onnx.ValueInfoProto.decode(reader, reader.uint32()));\n break;\n }\n case 14: {\n if (!(message.quantizationAnnotation && message.quantizationAnnotation.length))\n message.quantizationAnnotation = [];\n message.quantizationAnnotation.push($root.onnx.TensorAnnotation.decode(reader, reader.uint32()));\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a GraphProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.GraphProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.GraphProto} GraphProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n GraphProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a GraphProto message.\n * @function verify\n * @memberof onnx.GraphProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n GraphProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.node != null && message.hasOwnProperty(\"node\")) {\n if (!Array.isArray(message.node))\n return \"node: array expected\";\n for (var i = 0; i < message.node.length; ++i) {\n var error = $root.onnx.NodeProto.verify(message.node[i]);\n if (error)\n return \"node.\" + error;\n }\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n if (!$util.isString(message.name))\n return \"name: string expected\";\n if (message.initializer != null && message.hasOwnProperty(\"initializer\")) {\n if (!Array.isArray(message.initializer))\n return \"initializer: array expected\";\n for (var i = 0; i < message.initializer.length; ++i) {\n var error = $root.onnx.TensorProto.verify(message.initializer[i]);\n if (error)\n return \"initializer.\" + error;\n }\n }\n if (message.sparseInitializer != null && message.hasOwnProperty(\"sparseInitializer\")) {\n if (!Array.isArray(message.sparseInitializer))\n return \"sparseInitializer: array expected\";\n for (var i = 0; i < message.sparseInitializer.length; ++i) {\n var error = $root.onnx.SparseTensorProto.verify(message.sparseInitializer[i]);\n if (error)\n return \"sparseInitializer.\" + error;\n }\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n if (!$util.isString(message.docString))\n return \"docString: string expected\";\n if (message.input != null && message.hasOwnProperty(\"input\")) {\n if (!Array.isArray(message.input))\n return \"input: array expected\";\n for (var i = 0; i < message.input.length; ++i) {\n var error = $root.onnx.ValueInfoProto.verify(message.input[i]);\n if (error)\n return \"input.\" + error;\n }\n }\n if (message.output != null && message.hasOwnProperty(\"output\")) {\n if (!Array.isArray(message.output))\n return \"output: array expected\";\n for (var i = 0; i < message.output.length; ++i) {\n var error = $root.onnx.ValueInfoProto.verify(message.output[i]);\n if (error)\n return \"output.\" + error;\n }\n }\n if (message.valueInfo != null && message.hasOwnProperty(\"valueInfo\")) {\n if (!Array.isArray(message.valueInfo))\n return \"valueInfo: array expected\";\n for (var i = 0; i < message.valueInfo.length; ++i) {\n var error = $root.onnx.ValueInfoProto.verify(message.valueInfo[i]);\n if (error)\n return \"valueInfo.\" + error;\n }\n }\n if (message.quantizationAnnotation != null && message.hasOwnProperty(\"quantizationAnnotation\")) {\n if (!Array.isArray(message.quantizationAnnotation))\n return \"quantizationAnnotation: array expected\";\n for (var i = 0; i < message.quantizationAnnotation.length; ++i) {\n var error = $root.onnx.TensorAnnotation.verify(message.quantizationAnnotation[i]);\n if (error)\n return \"quantizationAnnotation.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates a GraphProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.GraphProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.GraphProto} GraphProto\n */\n GraphProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.GraphProto)\n return object;\n var message = new $root.onnx.GraphProto();\n if (object.node) {\n if (!Array.isArray(object.node))\n throw TypeError(\".onnx.GraphProto.node: array expected\");\n message.node = [];\n for (var i = 0; i < object.node.length; ++i) {\n if (typeof object.node[i] !== \"object\")\n throw TypeError(\".onnx.GraphProto.node: object expected\");\n message.node[i] = $root.onnx.NodeProto.fromObject(object.node[i]);\n }\n }\n if (object.name != null)\n message.name = String(object.name);\n if (object.initializer) {\n if (!Array.isArray(object.initializer))\n throw TypeError(\".onnx.GraphProto.initializer: array expected\");\n message.initializer = [];\n for (var i = 0; i < object.initializer.length; ++i) {\n if (typeof object.initializer[i] !== \"object\")\n throw TypeError(\".onnx.GraphProto.initializer: object expected\");\n message.initializer[i] = $root.onnx.TensorProto.fromObject(object.initializer[i]);\n }\n }\n if (object.sparseInitializer) {\n if (!Array.isArray(object.sparseInitializer))\n throw TypeError(\".onnx.GraphProto.sparseInitializer: array expected\");\n message.sparseInitializer = [];\n for (var i = 0; i < object.sparseInitializer.length; ++i) {\n if (typeof object.sparseInitializer[i] !== \"object\")\n throw TypeError(\".onnx.GraphProto.sparseInitializer: object expected\");\n message.sparseInitializer[i] = $root.onnx.SparseTensorProto.fromObject(object.sparseInitializer[i]);\n }\n }\n if (object.docString != null)\n message.docString = String(object.docString);\n if (object.input) {\n if (!Array.isArray(object.input))\n throw TypeError(\".onnx.GraphProto.input: array expected\");\n message.input = [];\n for (var i = 0; i < object.input.length; ++i) {\n if (typeof object.input[i] !== \"object\")\n throw TypeError(\".onnx.GraphProto.input: object expected\");\n message.input[i] = $root.onnx.ValueInfoProto.fromObject(object.input[i]);\n }\n }\n if (object.output) {\n if (!Array.isArray(object.output))\n throw TypeError(\".onnx.GraphProto.output: array expected\");\n message.output = [];\n for (var i = 0; i < object.output.length; ++i) {\n if (typeof object.output[i] !== \"object\")\n throw TypeError(\".onnx.GraphProto.output: object expected\");\n message.output[i] = $root.onnx.ValueInfoProto.fromObject(object.output[i]);\n }\n }\n if (object.valueInfo) {\n if (!Array.isArray(object.valueInfo))\n throw TypeError(\".onnx.GraphProto.valueInfo: array expected\");\n message.valueInfo = [];\n for (var i = 0; i < object.valueInfo.length; ++i) {\n if (typeof object.valueInfo[i] !== \"object\")\n throw TypeError(\".onnx.GraphProto.valueInfo: object expected\");\n message.valueInfo[i] = $root.onnx.ValueInfoProto.fromObject(object.valueInfo[i]);\n }\n }\n if (object.quantizationAnnotation) {\n if (!Array.isArray(object.quantizationAnnotation))\n throw TypeError(\".onnx.GraphProto.quantizationAnnotation: array expected\");\n message.quantizationAnnotation = [];\n for (var i = 0; i < object.quantizationAnnotation.length; ++i) {\n if (typeof object.quantizationAnnotation[i] !== \"object\")\n throw TypeError(\".onnx.GraphProto.quantizationAnnotation: object expected\");\n message.quantizationAnnotation[i] = $root.onnx.TensorAnnotation.fromObject(object.quantizationAnnotation[i]);\n }\n }\n return message;\n };\n\n /**\n * Creates a plain object from a GraphProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.GraphProto\n * @static\n * @param {onnx.GraphProto} message GraphProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n GraphProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults) {\n object.node = [];\n object.initializer = [];\n object.input = [];\n object.output = [];\n object.valueInfo = [];\n object.quantizationAnnotation = [];\n object.sparseInitializer = [];\n }\n if (options.defaults) {\n object.name = \"\";\n object.docString = \"\";\n }\n if (message.node && message.node.length) {\n object.node = [];\n for (var j = 0; j < message.node.length; ++j)\n object.node[j] = $root.onnx.NodeProto.toObject(message.node[j], options);\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n object.name = message.name;\n if (message.initializer && message.initializer.length) {\n object.initializer = [];\n for (var j = 0; j < message.initializer.length; ++j)\n object.initializer[j] = $root.onnx.TensorProto.toObject(message.initializer[j], options);\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n object.docString = message.docString;\n if (message.input && message.input.length) {\n object.input = [];\n for (var j = 0; j < message.input.length; ++j)\n object.input[j] = $root.onnx.ValueInfoProto.toObject(message.input[j], options);\n }\n if (message.output && message.output.length) {\n object.output = [];\n for (var j = 0; j < message.output.length; ++j)\n object.output[j] = $root.onnx.ValueInfoProto.toObject(message.output[j], options);\n }\n if (message.valueInfo && message.valueInfo.length) {\n object.valueInfo = [];\n for (var j = 0; j < message.valueInfo.length; ++j)\n object.valueInfo[j] = $root.onnx.ValueInfoProto.toObject(message.valueInfo[j], options);\n }\n if (message.quantizationAnnotation && message.quantizationAnnotation.length) {\n object.quantizationAnnotation = [];\n for (var j = 0; j < message.quantizationAnnotation.length; ++j)\n object.quantizationAnnotation[j] = $root.onnx.TensorAnnotation.toObject(message.quantizationAnnotation[j], options);\n }\n if (message.sparseInitializer && message.sparseInitializer.length) {\n object.sparseInitializer = [];\n for (var j = 0; j < message.sparseInitializer.length; ++j)\n object.sparseInitializer[j] = $root.onnx.SparseTensorProto.toObject(message.sparseInitializer[j], options);\n }\n return object;\n };\n\n /**\n * Converts this GraphProto to JSON.\n * @function toJSON\n * @memberof onnx.GraphProto\n * @instance\n * @returns {Object.} JSON object\n */\n GraphProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for GraphProto\n * @function getTypeUrl\n * @memberof onnx.GraphProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n GraphProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.GraphProto\";\n };\n\n return GraphProto;\n })();\n\n onnx.TensorProto = (function() {\n\n /**\n * Properties of a TensorProto.\n * @memberof onnx\n * @interface ITensorProto\n * @property {Array.|null} [dims] TensorProto dims\n * @property {number|null} [dataType] TensorProto dataType\n * @property {onnx.TensorProto.ISegment|null} [segment] TensorProto segment\n * @property {Array.|null} [floatData] TensorProto floatData\n * @property {Array.|null} [int32Data] TensorProto int32Data\n * @property {Array.|null} [stringData] TensorProto stringData\n * @property {Array.|null} [int64Data] TensorProto int64Data\n * @property {string|null} [name] TensorProto name\n * @property {string|null} [docString] TensorProto docString\n * @property {Uint8Array|null} [rawData] TensorProto rawData\n * @property {Array.|null} [externalData] TensorProto externalData\n * @property {onnx.TensorProto.DataLocation|null} [dataLocation] TensorProto dataLocation\n * @property {Array.|null} [doubleData] TensorProto doubleData\n * @property {Array.|null} [uint64Data] TensorProto uint64Data\n */\n\n /**\n * Constructs a new TensorProto.\n * @memberof onnx\n * @classdesc Represents a TensorProto.\n * @implements ITensorProto\n * @constructor\n * @param {onnx.ITensorProto=} [properties] Properties to set\n */\n function TensorProto(properties) {\n this.dims = [];\n this.floatData = [];\n this.int32Data = [];\n this.stringData = [];\n this.int64Data = [];\n this.externalData = [];\n this.doubleData = [];\n this.uint64Data = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * TensorProto dims.\n * @member {Array.} dims\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.dims = $util.emptyArray;\n\n /**\n * TensorProto dataType.\n * @member {number} dataType\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.dataType = 0;\n\n /**\n * TensorProto segment.\n * @member {onnx.TensorProto.ISegment|null|undefined} segment\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.segment = null;\n\n /**\n * TensorProto floatData.\n * @member {Array.} floatData\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.floatData = $util.emptyArray;\n\n /**\n * TensorProto int32Data.\n * @member {Array.} int32Data\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.int32Data = $util.emptyArray;\n\n /**\n * TensorProto stringData.\n * @member {Array.} stringData\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.stringData = $util.emptyArray;\n\n /**\n * TensorProto int64Data.\n * @member {Array.} int64Data\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.int64Data = $util.emptyArray;\n\n /**\n * TensorProto name.\n * @member {string} name\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.name = \"\";\n\n /**\n * TensorProto docString.\n * @member {string} docString\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.docString = \"\";\n\n /**\n * TensorProto rawData.\n * @member {Uint8Array} rawData\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.rawData = $util.newBuffer([]);\n\n /**\n * TensorProto externalData.\n * @member {Array.} externalData\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.externalData = $util.emptyArray;\n\n /**\n * TensorProto dataLocation.\n * @member {onnx.TensorProto.DataLocation} dataLocation\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.dataLocation = 0;\n\n /**\n * TensorProto doubleData.\n * @member {Array.} doubleData\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.doubleData = $util.emptyArray;\n\n /**\n * TensorProto uint64Data.\n * @member {Array.} uint64Data\n * @memberof onnx.TensorProto\n * @instance\n */\n TensorProto.prototype.uint64Data = $util.emptyArray;\n\n /**\n * Creates a new TensorProto instance using the specified properties.\n * @function create\n * @memberof onnx.TensorProto\n * @static\n * @param {onnx.ITensorProto=} [properties] Properties to set\n * @returns {onnx.TensorProto} TensorProto instance\n */\n TensorProto.create = function create(properties) {\n return new TensorProto(properties);\n };\n\n /**\n * Encodes the specified TensorProto message. Does not implicitly {@link onnx.TensorProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.TensorProto\n * @static\n * @param {onnx.ITensorProto} message TensorProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TensorProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.dims != null && message.dims.length) {\n writer.uint32(/* id 1, wireType 2 =*/10).fork();\n for (var i = 0; i < message.dims.length; ++i)\n writer.int64(message.dims[i]);\n writer.ldelim();\n }\n if (message.dataType != null && Object.hasOwnProperty.call(message, \"dataType\"))\n writer.uint32(/* id 2, wireType 0 =*/16).int32(message.dataType);\n if (message.segment != null && Object.hasOwnProperty.call(message, \"segment\"))\n $root.onnx.TensorProto.Segment.encode(message.segment, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\n if (message.floatData != null && message.floatData.length) {\n writer.uint32(/* id 4, wireType 2 =*/34).fork();\n for (var i = 0; i < message.floatData.length; ++i)\n writer.float(message.floatData[i]);\n writer.ldelim();\n }\n if (message.int32Data != null && message.int32Data.length) {\n writer.uint32(/* id 5, wireType 2 =*/42).fork();\n for (var i = 0; i < message.int32Data.length; ++i)\n writer.int32(message.int32Data[i]);\n writer.ldelim();\n }\n if (message.stringData != null && message.stringData.length)\n for (var i = 0; i < message.stringData.length; ++i)\n writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.stringData[i]);\n if (message.int64Data != null && message.int64Data.length) {\n writer.uint32(/* id 7, wireType 2 =*/58).fork();\n for (var i = 0; i < message.int64Data.length; ++i)\n writer.int64(message.int64Data[i]);\n writer.ldelim();\n }\n if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\n writer.uint32(/* id 8, wireType 2 =*/66).string(message.name);\n if (message.rawData != null && Object.hasOwnProperty.call(message, \"rawData\"))\n writer.uint32(/* id 9, wireType 2 =*/74).bytes(message.rawData);\n if (message.doubleData != null && message.doubleData.length) {\n writer.uint32(/* id 10, wireType 2 =*/82).fork();\n for (var i = 0; i < message.doubleData.length; ++i)\n writer.double(message.doubleData[i]);\n writer.ldelim();\n }\n if (message.uint64Data != null && message.uint64Data.length) {\n writer.uint32(/* id 11, wireType 2 =*/90).fork();\n for (var i = 0; i < message.uint64Data.length; ++i)\n writer.uint64(message.uint64Data[i]);\n writer.ldelim();\n }\n if (message.docString != null && Object.hasOwnProperty.call(message, \"docString\"))\n writer.uint32(/* id 12, wireType 2 =*/98).string(message.docString);\n if (message.externalData != null && message.externalData.length)\n for (var i = 0; i < message.externalData.length; ++i)\n $root.onnx.StringStringEntryProto.encode(message.externalData[i], writer.uint32(/* id 13, wireType 2 =*/106).fork()).ldelim();\n if (message.dataLocation != null && Object.hasOwnProperty.call(message, \"dataLocation\"))\n writer.uint32(/* id 14, wireType 0 =*/112).int32(message.dataLocation);\n return writer;\n };\n\n /**\n * Encodes the specified TensorProto message, length delimited. Does not implicitly {@link onnx.TensorProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TensorProto\n * @static\n * @param {onnx.ITensorProto} message TensorProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TensorProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a TensorProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TensorProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TensorProto} TensorProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TensorProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TensorProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n if (!(message.dims && message.dims.length))\n message.dims = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.dims.push(reader.int64());\n } else\n message.dims.push(reader.int64());\n break;\n }\n case 2: {\n message.dataType = reader.int32();\n break;\n }\n case 3: {\n message.segment = $root.onnx.TensorProto.Segment.decode(reader, reader.uint32());\n break;\n }\n case 4: {\n if (!(message.floatData && message.floatData.length))\n message.floatData = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.floatData.push(reader.float());\n } else\n message.floatData.push(reader.float());\n break;\n }\n case 5: {\n if (!(message.int32Data && message.int32Data.length))\n message.int32Data = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.int32Data.push(reader.int32());\n } else\n message.int32Data.push(reader.int32());\n break;\n }\n case 6: {\n if (!(message.stringData && message.stringData.length))\n message.stringData = [];\n message.stringData.push(reader.bytes());\n break;\n }\n case 7: {\n if (!(message.int64Data && message.int64Data.length))\n message.int64Data = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.int64Data.push(reader.int64());\n } else\n message.int64Data.push(reader.int64());\n break;\n }\n case 8: {\n message.name = reader.string();\n break;\n }\n case 12: {\n message.docString = reader.string();\n break;\n }\n case 9: {\n message.rawData = reader.bytes();\n break;\n }\n case 13: {\n if (!(message.externalData && message.externalData.length))\n message.externalData = [];\n message.externalData.push($root.onnx.StringStringEntryProto.decode(reader, reader.uint32()));\n break;\n }\n case 14: {\n message.dataLocation = reader.int32();\n break;\n }\n case 10: {\n if (!(message.doubleData && message.doubleData.length))\n message.doubleData = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.doubleData.push(reader.double());\n } else\n message.doubleData.push(reader.double());\n break;\n }\n case 11: {\n if (!(message.uint64Data && message.uint64Data.length))\n message.uint64Data = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.uint64Data.push(reader.uint64());\n } else\n message.uint64Data.push(reader.uint64());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a TensorProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TensorProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TensorProto} TensorProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TensorProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a TensorProto message.\n * @function verify\n * @memberof onnx.TensorProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n TensorProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.dims != null && message.hasOwnProperty(\"dims\")) {\n if (!Array.isArray(message.dims))\n return \"dims: array expected\";\n for (var i = 0; i < message.dims.length; ++i)\n if (!$util.isInteger(message.dims[i]) && !(message.dims[i] && $util.isInteger(message.dims[i].low) && $util.isInteger(message.dims[i].high)))\n return \"dims: integer|Long[] expected\";\n }\n if (message.dataType != null && message.hasOwnProperty(\"dataType\"))\n if (!$util.isInteger(message.dataType))\n return \"dataType: integer expected\";\n if (message.segment != null && message.hasOwnProperty(\"segment\")) {\n var error = $root.onnx.TensorProto.Segment.verify(message.segment);\n if (error)\n return \"segment.\" + error;\n }\n if (message.floatData != null && message.hasOwnProperty(\"floatData\")) {\n if (!Array.isArray(message.floatData))\n return \"floatData: array expected\";\n for (var i = 0; i < message.floatData.length; ++i)\n if (typeof message.floatData[i] !== \"number\")\n return \"floatData: number[] expected\";\n }\n if (message.int32Data != null && message.hasOwnProperty(\"int32Data\")) {\n if (!Array.isArray(message.int32Data))\n return \"int32Data: array expected\";\n for (var i = 0; i < message.int32Data.length; ++i)\n if (!$util.isInteger(message.int32Data[i]))\n return \"int32Data: integer[] expected\";\n }\n if (message.stringData != null && message.hasOwnProperty(\"stringData\")) {\n if (!Array.isArray(message.stringData))\n return \"stringData: array expected\";\n for (var i = 0; i < message.stringData.length; ++i)\n if (!(message.stringData[i] && typeof message.stringData[i].length === \"number\" || $util.isString(message.stringData[i])))\n return \"stringData: buffer[] expected\";\n }\n if (message.int64Data != null && message.hasOwnProperty(\"int64Data\")) {\n if (!Array.isArray(message.int64Data))\n return \"int64Data: array expected\";\n for (var i = 0; i < message.int64Data.length; ++i)\n if (!$util.isInteger(message.int64Data[i]) && !(message.int64Data[i] && $util.isInteger(message.int64Data[i].low) && $util.isInteger(message.int64Data[i].high)))\n return \"int64Data: integer|Long[] expected\";\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n if (!$util.isString(message.name))\n return \"name: string expected\";\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n if (!$util.isString(message.docString))\n return \"docString: string expected\";\n if (message.rawData != null && message.hasOwnProperty(\"rawData\"))\n if (!(message.rawData && typeof message.rawData.length === \"number\" || $util.isString(message.rawData)))\n return \"rawData: buffer expected\";\n if (message.externalData != null && message.hasOwnProperty(\"externalData\")) {\n if (!Array.isArray(message.externalData))\n return \"externalData: array expected\";\n for (var i = 0; i < message.externalData.length; ++i) {\n var error = $root.onnx.StringStringEntryProto.verify(message.externalData[i]);\n if (error)\n return \"externalData.\" + error;\n }\n }\n if (message.dataLocation != null && message.hasOwnProperty(\"dataLocation\"))\n switch (message.dataLocation) {\n default:\n return \"dataLocation: enum value expected\";\n case 0:\n case 1:\n break;\n }\n if (message.doubleData != null && message.hasOwnProperty(\"doubleData\")) {\n if (!Array.isArray(message.doubleData))\n return \"doubleData: array expected\";\n for (var i = 0; i < message.doubleData.length; ++i)\n if (typeof message.doubleData[i] !== \"number\")\n return \"doubleData: number[] expected\";\n }\n if (message.uint64Data != null && message.hasOwnProperty(\"uint64Data\")) {\n if (!Array.isArray(message.uint64Data))\n return \"uint64Data: array expected\";\n for (var i = 0; i < message.uint64Data.length; ++i)\n if (!$util.isInteger(message.uint64Data[i]) && !(message.uint64Data[i] && $util.isInteger(message.uint64Data[i].low) && $util.isInteger(message.uint64Data[i].high)))\n return \"uint64Data: integer|Long[] expected\";\n }\n return null;\n };\n\n /**\n * Creates a TensorProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TensorProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TensorProto} TensorProto\n */\n TensorProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TensorProto)\n return object;\n var message = new $root.onnx.TensorProto();\n if (object.dims) {\n if (!Array.isArray(object.dims))\n throw TypeError(\".onnx.TensorProto.dims: array expected\");\n message.dims = [];\n for (var i = 0; i < object.dims.length; ++i)\n if ($util.Long)\n (message.dims[i] = $util.Long.fromValue(object.dims[i])).unsigned = false;\n else if (typeof object.dims[i] === \"string\")\n message.dims[i] = parseInt(object.dims[i], 10);\n else if (typeof object.dims[i] === \"number\")\n message.dims[i] = object.dims[i];\n else if (typeof object.dims[i] === \"object\")\n message.dims[i] = new $util.LongBits(object.dims[i].low >>> 0, object.dims[i].high >>> 0).toNumber();\n }\n if (object.dataType != null)\n message.dataType = object.dataType | 0;\n if (object.segment != null) {\n if (typeof object.segment !== \"object\")\n throw TypeError(\".onnx.TensorProto.segment: object expected\");\n message.segment = $root.onnx.TensorProto.Segment.fromObject(object.segment);\n }\n if (object.floatData) {\n if (!Array.isArray(object.floatData))\n throw TypeError(\".onnx.TensorProto.floatData: array expected\");\n message.floatData = [];\n for (var i = 0; i < object.floatData.length; ++i)\n message.floatData[i] = Number(object.floatData[i]);\n }\n if (object.int32Data) {\n if (!Array.isArray(object.int32Data))\n throw TypeError(\".onnx.TensorProto.int32Data: array expected\");\n message.int32Data = [];\n for (var i = 0; i < object.int32Data.length; ++i)\n message.int32Data[i] = object.int32Data[i] | 0;\n }\n if (object.stringData) {\n if (!Array.isArray(object.stringData))\n throw TypeError(\".onnx.TensorProto.stringData: array expected\");\n message.stringData = [];\n for (var i = 0; i < object.stringData.length; ++i)\n if (typeof object.stringData[i] === \"string\")\n $util.base64.decode(object.stringData[i], message.stringData[i] = $util.newBuffer($util.base64.length(object.stringData[i])), 0);\n else if (object.stringData[i].length >= 0)\n message.stringData[i] = object.stringData[i];\n }\n if (object.int64Data) {\n if (!Array.isArray(object.int64Data))\n throw TypeError(\".onnx.TensorProto.int64Data: array expected\");\n message.int64Data = [];\n for (var i = 0; i < object.int64Data.length; ++i)\n if ($util.Long)\n (message.int64Data[i] = $util.Long.fromValue(object.int64Data[i])).unsigned = false;\n else if (typeof object.int64Data[i] === \"string\")\n message.int64Data[i] = parseInt(object.int64Data[i], 10);\n else if (typeof object.int64Data[i] === \"number\")\n message.int64Data[i] = object.int64Data[i];\n else if (typeof object.int64Data[i] === \"object\")\n message.int64Data[i] = new $util.LongBits(object.int64Data[i].low >>> 0, object.int64Data[i].high >>> 0).toNumber();\n }\n if (object.name != null)\n message.name = String(object.name);\n if (object.docString != null)\n message.docString = String(object.docString);\n if (object.rawData != null)\n if (typeof object.rawData === \"string\")\n $util.base64.decode(object.rawData, message.rawData = $util.newBuffer($util.base64.length(object.rawData)), 0);\n else if (object.rawData.length >= 0)\n message.rawData = object.rawData;\n if (object.externalData) {\n if (!Array.isArray(object.externalData))\n throw TypeError(\".onnx.TensorProto.externalData: array expected\");\n message.externalData = [];\n for (var i = 0; i < object.externalData.length; ++i) {\n if (typeof object.externalData[i] !== \"object\")\n throw TypeError(\".onnx.TensorProto.externalData: object expected\");\n message.externalData[i] = $root.onnx.StringStringEntryProto.fromObject(object.externalData[i]);\n }\n }\n switch (object.dataLocation) {\n default:\n if (typeof object.dataLocation === \"number\") {\n message.dataLocation = object.dataLocation;\n break;\n }\n break;\n case \"DEFAULT\":\n case 0:\n message.dataLocation = 0;\n break;\n case \"EXTERNAL\":\n case 1:\n message.dataLocation = 1;\n break;\n }\n if (object.doubleData) {\n if (!Array.isArray(object.doubleData))\n throw TypeError(\".onnx.TensorProto.doubleData: array expected\");\n message.doubleData = [];\n for (var i = 0; i < object.doubleData.length; ++i)\n message.doubleData[i] = Number(object.doubleData[i]);\n }\n if (object.uint64Data) {\n if (!Array.isArray(object.uint64Data))\n throw TypeError(\".onnx.TensorProto.uint64Data: array expected\");\n message.uint64Data = [];\n for (var i = 0; i < object.uint64Data.length; ++i)\n if ($util.Long)\n (message.uint64Data[i] = $util.Long.fromValue(object.uint64Data[i])).unsigned = true;\n else if (typeof object.uint64Data[i] === \"string\")\n message.uint64Data[i] = parseInt(object.uint64Data[i], 10);\n else if (typeof object.uint64Data[i] === \"number\")\n message.uint64Data[i] = object.uint64Data[i];\n else if (typeof object.uint64Data[i] === \"object\")\n message.uint64Data[i] = new $util.LongBits(object.uint64Data[i].low >>> 0, object.uint64Data[i].high >>> 0).toNumber(true);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a TensorProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TensorProto\n * @static\n * @param {onnx.TensorProto} message TensorProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n TensorProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults) {\n object.dims = [];\n object.floatData = [];\n object.int32Data = [];\n object.stringData = [];\n object.int64Data = [];\n object.doubleData = [];\n object.uint64Data = [];\n object.externalData = [];\n }\n if (options.defaults) {\n object.dataType = 0;\n object.segment = null;\n object.name = \"\";\n if (options.bytes === String)\n object.rawData = \"\";\n else {\n object.rawData = [];\n if (options.bytes !== Array)\n object.rawData = $util.newBuffer(object.rawData);\n }\n object.docString = \"\";\n object.dataLocation = options.enums === String ? \"DEFAULT\" : 0;\n }\n if (message.dims && message.dims.length) {\n object.dims = [];\n for (var j = 0; j < message.dims.length; ++j)\n if (typeof message.dims[j] === \"number\")\n object.dims[j] = options.longs === String ? String(message.dims[j]) : message.dims[j];\n else\n object.dims[j] = options.longs === String ? $util.Long.prototype.toString.call(message.dims[j]) : options.longs === Number ? new $util.LongBits(message.dims[j].low >>> 0, message.dims[j].high >>> 0).toNumber() : message.dims[j];\n }\n if (message.dataType != null && message.hasOwnProperty(\"dataType\"))\n object.dataType = message.dataType;\n if (message.segment != null && message.hasOwnProperty(\"segment\"))\n object.segment = $root.onnx.TensorProto.Segment.toObject(message.segment, options);\n if (message.floatData && message.floatData.length) {\n object.floatData = [];\n for (var j = 0; j < message.floatData.length; ++j)\n object.floatData[j] = options.json && !isFinite(message.floatData[j]) ? String(message.floatData[j]) : message.floatData[j];\n }\n if (message.int32Data && message.int32Data.length) {\n object.int32Data = [];\n for (var j = 0; j < message.int32Data.length; ++j)\n object.int32Data[j] = message.int32Data[j];\n }\n if (message.stringData && message.stringData.length) {\n object.stringData = [];\n for (var j = 0; j < message.stringData.length; ++j)\n object.stringData[j] = options.bytes === String ? $util.base64.encode(message.stringData[j], 0, message.stringData[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.stringData[j]) : message.stringData[j];\n }\n if (message.int64Data && message.int64Data.length) {\n object.int64Data = [];\n for (var j = 0; j < message.int64Data.length; ++j)\n if (typeof message.int64Data[j] === \"number\")\n object.int64Data[j] = options.longs === String ? String(message.int64Data[j]) : message.int64Data[j];\n else\n object.int64Data[j] = options.longs === String ? $util.Long.prototype.toString.call(message.int64Data[j]) : options.longs === Number ? new $util.LongBits(message.int64Data[j].low >>> 0, message.int64Data[j].high >>> 0).toNumber() : message.int64Data[j];\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n object.name = message.name;\n if (message.rawData != null && message.hasOwnProperty(\"rawData\"))\n object.rawData = options.bytes === String ? $util.base64.encode(message.rawData, 0, message.rawData.length) : options.bytes === Array ? Array.prototype.slice.call(message.rawData) : message.rawData;\n if (message.doubleData && message.doubleData.length) {\n object.doubleData = [];\n for (var j = 0; j < message.doubleData.length; ++j)\n object.doubleData[j] = options.json && !isFinite(message.doubleData[j]) ? String(message.doubleData[j]) : message.doubleData[j];\n }\n if (message.uint64Data && message.uint64Data.length) {\n object.uint64Data = [];\n for (var j = 0; j < message.uint64Data.length; ++j)\n if (typeof message.uint64Data[j] === \"number\")\n object.uint64Data[j] = options.longs === String ? String(message.uint64Data[j]) : message.uint64Data[j];\n else\n object.uint64Data[j] = options.longs === String ? $util.Long.prototype.toString.call(message.uint64Data[j]) : options.longs === Number ? new $util.LongBits(message.uint64Data[j].low >>> 0, message.uint64Data[j].high >>> 0).toNumber(true) : message.uint64Data[j];\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n object.docString = message.docString;\n if (message.externalData && message.externalData.length) {\n object.externalData = [];\n for (var j = 0; j < message.externalData.length; ++j)\n object.externalData[j] = $root.onnx.StringStringEntryProto.toObject(message.externalData[j], options);\n }\n if (message.dataLocation != null && message.hasOwnProperty(\"dataLocation\"))\n object.dataLocation = options.enums === String ? $root.onnx.TensorProto.DataLocation[message.dataLocation] === undefined ? message.dataLocation : $root.onnx.TensorProto.DataLocation[message.dataLocation] : message.dataLocation;\n return object;\n };\n\n /**\n * Converts this TensorProto to JSON.\n * @function toJSON\n * @memberof onnx.TensorProto\n * @instance\n * @returns {Object.} JSON object\n */\n TensorProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for TensorProto\n * @function getTypeUrl\n * @memberof onnx.TensorProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n TensorProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TensorProto\";\n };\n\n /**\n * DataType enum.\n * @name onnx.TensorProto.DataType\n * @enum {number}\n * @property {number} UNDEFINED=0 UNDEFINED value\n * @property {number} FLOAT=1 FLOAT value\n * @property {number} UINT8=2 UINT8 value\n * @property {number} INT8=3 INT8 value\n * @property {number} UINT16=4 UINT16 value\n * @property {number} INT16=5 INT16 value\n * @property {number} INT32=6 INT32 value\n * @property {number} INT64=7 INT64 value\n * @property {number} STRING=8 STRING value\n * @property {number} BOOL=9 BOOL value\n * @property {number} FLOAT16=10 FLOAT16 value\n * @property {number} DOUBLE=11 DOUBLE value\n * @property {number} UINT32=12 UINT32 value\n * @property {number} UINT64=13 UINT64 value\n * @property {number} COMPLEX64=14 COMPLEX64 value\n * @property {number} COMPLEX128=15 COMPLEX128 value\n * @property {number} BFLOAT16=16 BFLOAT16 value\n * @property {number} FLOAT8E4M3FN=17 FLOAT8E4M3FN value\n * @property {number} FLOAT8E4M3FNUZ=18 FLOAT8E4M3FNUZ value\n * @property {number} FLOAT8E5M2=19 FLOAT8E5M2 value\n * @property {number} FLOAT8E5M2FNUZ=20 FLOAT8E5M2FNUZ value\n */\n TensorProto.DataType = (function() {\n var valuesById = {}, values = Object.create(valuesById);\n values[valuesById[0] = \"UNDEFINED\"] = 0;\n values[valuesById[1] = \"FLOAT\"] = 1;\n values[valuesById[2] = \"UINT8\"] = 2;\n values[valuesById[3] = \"INT8\"] = 3;\n values[valuesById[4] = \"UINT16\"] = 4;\n values[valuesById[5] = \"INT16\"] = 5;\n values[valuesById[6] = \"INT32\"] = 6;\n values[valuesById[7] = \"INT64\"] = 7;\n values[valuesById[8] = \"STRING\"] = 8;\n values[valuesById[9] = \"BOOL\"] = 9;\n values[valuesById[10] = \"FLOAT16\"] = 10;\n values[valuesById[11] = \"DOUBLE\"] = 11;\n values[valuesById[12] = \"UINT32\"] = 12;\n values[valuesById[13] = \"UINT64\"] = 13;\n values[valuesById[14] = \"COMPLEX64\"] = 14;\n values[valuesById[15] = \"COMPLEX128\"] = 15;\n values[valuesById[16] = \"BFLOAT16\"] = 16;\n values[valuesById[17] = \"FLOAT8E4M3FN\"] = 17;\n values[valuesById[18] = \"FLOAT8E4M3FNUZ\"] = 18;\n values[valuesById[19] = \"FLOAT8E5M2\"] = 19;\n values[valuesById[20] = \"FLOAT8E5M2FNUZ\"] = 20;\n return values;\n })();\n\n TensorProto.Segment = (function() {\n\n /**\n * Properties of a Segment.\n * @memberof onnx.TensorProto\n * @interface ISegment\n * @property {number|Long|null} [begin] Segment begin\n * @property {number|Long|null} [end] Segment end\n */\n\n /**\n * Constructs a new Segment.\n * @memberof onnx.TensorProto\n * @classdesc Represents a Segment.\n * @implements ISegment\n * @constructor\n * @param {onnx.TensorProto.ISegment=} [properties] Properties to set\n */\n function Segment(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Segment begin.\n * @member {number|Long} begin\n * @memberof onnx.TensorProto.Segment\n * @instance\n */\n Segment.prototype.begin = $util.Long ? $util.Long.fromBits(0,0,false) : 0;\n\n /**\n * Segment end.\n * @member {number|Long} end\n * @memberof onnx.TensorProto.Segment\n * @instance\n */\n Segment.prototype.end = $util.Long ? $util.Long.fromBits(0,0,false) : 0;\n\n /**\n * Creates a new Segment instance using the specified properties.\n * @function create\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {onnx.TensorProto.ISegment=} [properties] Properties to set\n * @returns {onnx.TensorProto.Segment} Segment instance\n */\n Segment.create = function create(properties) {\n return new Segment(properties);\n };\n\n /**\n * Encodes the specified Segment message. Does not implicitly {@link onnx.TensorProto.Segment.verify|verify} messages.\n * @function encode\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {onnx.TensorProto.ISegment} message Segment message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Segment.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.begin != null && Object.hasOwnProperty.call(message, \"begin\"))\n writer.uint32(/* id 1, wireType 0 =*/8).int64(message.begin);\n if (message.end != null && Object.hasOwnProperty.call(message, \"end\"))\n writer.uint32(/* id 2, wireType 0 =*/16).int64(message.end);\n return writer;\n };\n\n /**\n * Encodes the specified Segment message, length delimited. Does not implicitly {@link onnx.TensorProto.Segment.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {onnx.TensorProto.ISegment} message Segment message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Segment.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Segment message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TensorProto.Segment} Segment\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Segment.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TensorProto.Segment();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.begin = reader.int64();\n break;\n }\n case 2: {\n message.end = reader.int64();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Segment message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TensorProto.Segment} Segment\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Segment.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Segment message.\n * @function verify\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Segment.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.begin != null && message.hasOwnProperty(\"begin\"))\n if (!$util.isInteger(message.begin) && !(message.begin && $util.isInteger(message.begin.low) && $util.isInteger(message.begin.high)))\n return \"begin: integer|Long expected\";\n if (message.end != null && message.hasOwnProperty(\"end\"))\n if (!$util.isInteger(message.end) && !(message.end && $util.isInteger(message.end.low) && $util.isInteger(message.end.high)))\n return \"end: integer|Long expected\";\n return null;\n };\n\n /**\n * Creates a Segment message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TensorProto.Segment} Segment\n */\n Segment.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TensorProto.Segment)\n return object;\n var message = new $root.onnx.TensorProto.Segment();\n if (object.begin != null)\n if ($util.Long)\n (message.begin = $util.Long.fromValue(object.begin)).unsigned = false;\n else if (typeof object.begin === \"string\")\n message.begin = parseInt(object.begin, 10);\n else if (typeof object.begin === \"number\")\n message.begin = object.begin;\n else if (typeof object.begin === \"object\")\n message.begin = new $util.LongBits(object.begin.low >>> 0, object.begin.high >>> 0).toNumber();\n if (object.end != null)\n if ($util.Long)\n (message.end = $util.Long.fromValue(object.end)).unsigned = false;\n else if (typeof object.end === \"string\")\n message.end = parseInt(object.end, 10);\n else if (typeof object.end === \"number\")\n message.end = object.end;\n else if (typeof object.end === \"object\")\n message.end = new $util.LongBits(object.end.low >>> 0, object.end.high >>> 0).toNumber();\n return message;\n };\n\n /**\n * Creates a plain object from a Segment message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {onnx.TensorProto.Segment} message Segment\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Segment.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults) {\n if ($util.Long) {\n var long = new $util.Long(0, 0, false);\n object.begin = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.begin = options.longs === String ? \"0\" : 0;\n if ($util.Long) {\n var long = new $util.Long(0, 0, false);\n object.end = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.end = options.longs === String ? \"0\" : 0;\n }\n if (message.begin != null && message.hasOwnProperty(\"begin\"))\n if (typeof message.begin === \"number\")\n object.begin = options.longs === String ? String(message.begin) : message.begin;\n else\n object.begin = options.longs === String ? $util.Long.prototype.toString.call(message.begin) : options.longs === Number ? new $util.LongBits(message.begin.low >>> 0, message.begin.high >>> 0).toNumber() : message.begin;\n if (message.end != null && message.hasOwnProperty(\"end\"))\n if (typeof message.end === \"number\")\n object.end = options.longs === String ? String(message.end) : message.end;\n else\n object.end = options.longs === String ? $util.Long.prototype.toString.call(message.end) : options.longs === Number ? new $util.LongBits(message.end.low >>> 0, message.end.high >>> 0).toNumber() : message.end;\n return object;\n };\n\n /**\n * Converts this Segment to JSON.\n * @function toJSON\n * @memberof onnx.TensorProto.Segment\n * @instance\n * @returns {Object.} JSON object\n */\n Segment.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for Segment\n * @function getTypeUrl\n * @memberof onnx.TensorProto.Segment\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n Segment.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TensorProto.Segment\";\n };\n\n return Segment;\n })();\n\n /**\n * DataLocation enum.\n * @name onnx.TensorProto.DataLocation\n * @enum {number}\n * @property {number} DEFAULT=0 DEFAULT value\n * @property {number} EXTERNAL=1 EXTERNAL value\n */\n TensorProto.DataLocation = (function() {\n var valuesById = {}, values = Object.create(valuesById);\n values[valuesById[0] = \"DEFAULT\"] = 0;\n values[valuesById[1] = \"EXTERNAL\"] = 1;\n return values;\n })();\n\n return TensorProto;\n })();\n\n onnx.SparseTensorProto = (function() {\n\n /**\n * Properties of a SparseTensorProto.\n * @memberof onnx\n * @interface ISparseTensorProto\n * @property {onnx.ITensorProto|null} [values] SparseTensorProto values\n * @property {onnx.ITensorProto|null} [indices] SparseTensorProto indices\n * @property {Array.|null} [dims] SparseTensorProto dims\n */\n\n /**\n * Constructs a new SparseTensorProto.\n * @memberof onnx\n * @classdesc Represents a SparseTensorProto.\n * @implements ISparseTensorProto\n * @constructor\n * @param {onnx.ISparseTensorProto=} [properties] Properties to set\n */\n function SparseTensorProto(properties) {\n this.dims = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * SparseTensorProto values.\n * @member {onnx.ITensorProto|null|undefined} values\n * @memberof onnx.SparseTensorProto\n * @instance\n */\n SparseTensorProto.prototype.values = null;\n\n /**\n * SparseTensorProto indices.\n * @member {onnx.ITensorProto|null|undefined} indices\n * @memberof onnx.SparseTensorProto\n * @instance\n */\n SparseTensorProto.prototype.indices = null;\n\n /**\n * SparseTensorProto dims.\n * @member {Array.} dims\n * @memberof onnx.SparseTensorProto\n * @instance\n */\n SparseTensorProto.prototype.dims = $util.emptyArray;\n\n /**\n * Creates a new SparseTensorProto instance using the specified properties.\n * @function create\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {onnx.ISparseTensorProto=} [properties] Properties to set\n * @returns {onnx.SparseTensorProto} SparseTensorProto instance\n */\n SparseTensorProto.create = function create(properties) {\n return new SparseTensorProto(properties);\n };\n\n /**\n * Encodes the specified SparseTensorProto message. Does not implicitly {@link onnx.SparseTensorProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {onnx.ISparseTensorProto} message SparseTensorProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n SparseTensorProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.values != null && Object.hasOwnProperty.call(message, \"values\"))\n $root.onnx.TensorProto.encode(message.values, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n if (message.indices != null && Object.hasOwnProperty.call(message, \"indices\"))\n $root.onnx.TensorProto.encode(message.indices, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\n if (message.dims != null && message.dims.length) {\n writer.uint32(/* id 3, wireType 2 =*/26).fork();\n for (var i = 0; i < message.dims.length; ++i)\n writer.int64(message.dims[i]);\n writer.ldelim();\n }\n return writer;\n };\n\n /**\n * Encodes the specified SparseTensorProto message, length delimited. Does not implicitly {@link onnx.SparseTensorProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {onnx.ISparseTensorProto} message SparseTensorProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n SparseTensorProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a SparseTensorProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.SparseTensorProto} SparseTensorProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n SparseTensorProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.SparseTensorProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.values = $root.onnx.TensorProto.decode(reader, reader.uint32());\n break;\n }\n case 2: {\n message.indices = $root.onnx.TensorProto.decode(reader, reader.uint32());\n break;\n }\n case 3: {\n if (!(message.dims && message.dims.length))\n message.dims = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.dims.push(reader.int64());\n } else\n message.dims.push(reader.int64());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a SparseTensorProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.SparseTensorProto} SparseTensorProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n SparseTensorProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a SparseTensorProto message.\n * @function verify\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n SparseTensorProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.values != null && message.hasOwnProperty(\"values\")) {\n var error = $root.onnx.TensorProto.verify(message.values);\n if (error)\n return \"values.\" + error;\n }\n if (message.indices != null && message.hasOwnProperty(\"indices\")) {\n var error = $root.onnx.TensorProto.verify(message.indices);\n if (error)\n return \"indices.\" + error;\n }\n if (message.dims != null && message.hasOwnProperty(\"dims\")) {\n if (!Array.isArray(message.dims))\n return \"dims: array expected\";\n for (var i = 0; i < message.dims.length; ++i)\n if (!$util.isInteger(message.dims[i]) && !(message.dims[i] && $util.isInteger(message.dims[i].low) && $util.isInteger(message.dims[i].high)))\n return \"dims: integer|Long[] expected\";\n }\n return null;\n };\n\n /**\n * Creates a SparseTensorProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.SparseTensorProto} SparseTensorProto\n */\n SparseTensorProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.SparseTensorProto)\n return object;\n var message = new $root.onnx.SparseTensorProto();\n if (object.values != null) {\n if (typeof object.values !== \"object\")\n throw TypeError(\".onnx.SparseTensorProto.values: object expected\");\n message.values = $root.onnx.TensorProto.fromObject(object.values);\n }\n if (object.indices != null) {\n if (typeof object.indices !== \"object\")\n throw TypeError(\".onnx.SparseTensorProto.indices: object expected\");\n message.indices = $root.onnx.TensorProto.fromObject(object.indices);\n }\n if (object.dims) {\n if (!Array.isArray(object.dims))\n throw TypeError(\".onnx.SparseTensorProto.dims: array expected\");\n message.dims = [];\n for (var i = 0; i < object.dims.length; ++i)\n if ($util.Long)\n (message.dims[i] = $util.Long.fromValue(object.dims[i])).unsigned = false;\n else if (typeof object.dims[i] === \"string\")\n message.dims[i] = parseInt(object.dims[i], 10);\n else if (typeof object.dims[i] === \"number\")\n message.dims[i] = object.dims[i];\n else if (typeof object.dims[i] === \"object\")\n message.dims[i] = new $util.LongBits(object.dims[i].low >>> 0, object.dims[i].high >>> 0).toNumber();\n }\n return message;\n };\n\n /**\n * Creates a plain object from a SparseTensorProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {onnx.SparseTensorProto} message SparseTensorProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n SparseTensorProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.dims = [];\n if (options.defaults) {\n object.values = null;\n object.indices = null;\n }\n if (message.values != null && message.hasOwnProperty(\"values\"))\n object.values = $root.onnx.TensorProto.toObject(message.values, options);\n if (message.indices != null && message.hasOwnProperty(\"indices\"))\n object.indices = $root.onnx.TensorProto.toObject(message.indices, options);\n if (message.dims && message.dims.length) {\n object.dims = [];\n for (var j = 0; j < message.dims.length; ++j)\n if (typeof message.dims[j] === \"number\")\n object.dims[j] = options.longs === String ? String(message.dims[j]) : message.dims[j];\n else\n object.dims[j] = options.longs === String ? $util.Long.prototype.toString.call(message.dims[j]) : options.longs === Number ? new $util.LongBits(message.dims[j].low >>> 0, message.dims[j].high >>> 0).toNumber() : message.dims[j];\n }\n return object;\n };\n\n /**\n * Converts this SparseTensorProto to JSON.\n * @function toJSON\n * @memberof onnx.SparseTensorProto\n * @instance\n * @returns {Object.} JSON object\n */\n SparseTensorProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for SparseTensorProto\n * @function getTypeUrl\n * @memberof onnx.SparseTensorProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n SparseTensorProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.SparseTensorProto\";\n };\n\n return SparseTensorProto;\n })();\n\n onnx.TensorShapeProto = (function() {\n\n /**\n * Properties of a TensorShapeProto.\n * @memberof onnx\n * @interface ITensorShapeProto\n * @property {Array.|null} [dim] TensorShapeProto dim\n */\n\n /**\n * Constructs a new TensorShapeProto.\n * @memberof onnx\n * @classdesc Represents a TensorShapeProto.\n * @implements ITensorShapeProto\n * @constructor\n * @param {onnx.ITensorShapeProto=} [properties] Properties to set\n */\n function TensorShapeProto(properties) {\n this.dim = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * TensorShapeProto dim.\n * @member {Array.} dim\n * @memberof onnx.TensorShapeProto\n * @instance\n */\n TensorShapeProto.prototype.dim = $util.emptyArray;\n\n /**\n * Creates a new TensorShapeProto instance using the specified properties.\n * @function create\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {onnx.ITensorShapeProto=} [properties] Properties to set\n * @returns {onnx.TensorShapeProto} TensorShapeProto instance\n */\n TensorShapeProto.create = function create(properties) {\n return new TensorShapeProto(properties);\n };\n\n /**\n * Encodes the specified TensorShapeProto message. Does not implicitly {@link onnx.TensorShapeProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {onnx.ITensorShapeProto} message TensorShapeProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TensorShapeProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.dim != null && message.dim.length)\n for (var i = 0; i < message.dim.length; ++i)\n $root.onnx.TensorShapeProto.Dimension.encode(message.dim[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified TensorShapeProto message, length delimited. Does not implicitly {@link onnx.TensorShapeProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {onnx.ITensorShapeProto} message TensorShapeProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TensorShapeProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a TensorShapeProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TensorShapeProto} TensorShapeProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TensorShapeProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TensorShapeProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n if (!(message.dim && message.dim.length))\n message.dim = [];\n message.dim.push($root.onnx.TensorShapeProto.Dimension.decode(reader, reader.uint32()));\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a TensorShapeProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TensorShapeProto} TensorShapeProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TensorShapeProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a TensorShapeProto message.\n * @function verify\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n TensorShapeProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.dim != null && message.hasOwnProperty(\"dim\")) {\n if (!Array.isArray(message.dim))\n return \"dim: array expected\";\n for (var i = 0; i < message.dim.length; ++i) {\n var error = $root.onnx.TensorShapeProto.Dimension.verify(message.dim[i]);\n if (error)\n return \"dim.\" + error;\n }\n }\n return null;\n };\n\n /**\n * Creates a TensorShapeProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TensorShapeProto} TensorShapeProto\n */\n TensorShapeProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TensorShapeProto)\n return object;\n var message = new $root.onnx.TensorShapeProto();\n if (object.dim) {\n if (!Array.isArray(object.dim))\n throw TypeError(\".onnx.TensorShapeProto.dim: array expected\");\n message.dim = [];\n for (var i = 0; i < object.dim.length; ++i) {\n if (typeof object.dim[i] !== \"object\")\n throw TypeError(\".onnx.TensorShapeProto.dim: object expected\");\n message.dim[i] = $root.onnx.TensorShapeProto.Dimension.fromObject(object.dim[i]);\n }\n }\n return message;\n };\n\n /**\n * Creates a plain object from a TensorShapeProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {onnx.TensorShapeProto} message TensorShapeProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n TensorShapeProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.dim = [];\n if (message.dim && message.dim.length) {\n object.dim = [];\n for (var j = 0; j < message.dim.length; ++j)\n object.dim[j] = $root.onnx.TensorShapeProto.Dimension.toObject(message.dim[j], options);\n }\n return object;\n };\n\n /**\n * Converts this TensorShapeProto to JSON.\n * @function toJSON\n * @memberof onnx.TensorShapeProto\n * @instance\n * @returns {Object.} JSON object\n */\n TensorShapeProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for TensorShapeProto\n * @function getTypeUrl\n * @memberof onnx.TensorShapeProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n TensorShapeProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TensorShapeProto\";\n };\n\n TensorShapeProto.Dimension = (function() {\n\n /**\n * Properties of a Dimension.\n * @memberof onnx.TensorShapeProto\n * @interface IDimension\n * @property {number|Long|null} [dimValue] Dimension dimValue\n * @property {string|null} [dimParam] Dimension dimParam\n * @property {string|null} [denotation] Dimension denotation\n */\n\n /**\n * Constructs a new Dimension.\n * @memberof onnx.TensorShapeProto\n * @classdesc Represents a Dimension.\n * @implements IDimension\n * @constructor\n * @param {onnx.TensorShapeProto.IDimension=} [properties] Properties to set\n */\n function Dimension(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Dimension dimValue.\n * @member {number|Long|null|undefined} dimValue\n * @memberof onnx.TensorShapeProto.Dimension\n * @instance\n */\n Dimension.prototype.dimValue = null;\n\n /**\n * Dimension dimParam.\n * @member {string|null|undefined} dimParam\n * @memberof onnx.TensorShapeProto.Dimension\n * @instance\n */\n Dimension.prototype.dimParam = null;\n\n /**\n * Dimension denotation.\n * @member {string} denotation\n * @memberof onnx.TensorShapeProto.Dimension\n * @instance\n */\n Dimension.prototype.denotation = \"\";\n\n // OneOf field names bound to virtual getters and setters\n var $oneOfFields;\n\n /**\n * Dimension value.\n * @member {\"dimValue\"|\"dimParam\"|undefined} value\n * @memberof onnx.TensorShapeProto.Dimension\n * @instance\n */\n Object.defineProperty(Dimension.prototype, \"value\", {\n get: $util.oneOfGetter($oneOfFields = [\"dimValue\", \"dimParam\"]),\n set: $util.oneOfSetter($oneOfFields)\n });\n\n /**\n * Creates a new Dimension instance using the specified properties.\n * @function create\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {onnx.TensorShapeProto.IDimension=} [properties] Properties to set\n * @returns {onnx.TensorShapeProto.Dimension} Dimension instance\n */\n Dimension.create = function create(properties) {\n return new Dimension(properties);\n };\n\n /**\n * Encodes the specified Dimension message. Does not implicitly {@link onnx.TensorShapeProto.Dimension.verify|verify} messages.\n * @function encode\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {onnx.TensorShapeProto.IDimension} message Dimension message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Dimension.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.dimValue != null && Object.hasOwnProperty.call(message, \"dimValue\"))\n writer.uint32(/* id 1, wireType 0 =*/8).int64(message.dimValue);\n if (message.dimParam != null && Object.hasOwnProperty.call(message, \"dimParam\"))\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.dimParam);\n if (message.denotation != null && Object.hasOwnProperty.call(message, \"denotation\"))\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.denotation);\n return writer;\n };\n\n /**\n * Encodes the specified Dimension message, length delimited. Does not implicitly {@link onnx.TensorShapeProto.Dimension.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {onnx.TensorShapeProto.IDimension} message Dimension message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Dimension.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Dimension message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TensorShapeProto.Dimension} Dimension\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Dimension.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TensorShapeProto.Dimension();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.dimValue = reader.int64();\n break;\n }\n case 2: {\n message.dimParam = reader.string();\n break;\n }\n case 3: {\n message.denotation = reader.string();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Dimension message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TensorShapeProto.Dimension} Dimension\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Dimension.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Dimension message.\n * @function verify\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Dimension.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n var properties = {};\n if (message.dimValue != null && message.hasOwnProperty(\"dimValue\")) {\n properties.value = 1;\n if (!$util.isInteger(message.dimValue) && !(message.dimValue && $util.isInteger(message.dimValue.low) && $util.isInteger(message.dimValue.high)))\n return \"dimValue: integer|Long expected\";\n }\n if (message.dimParam != null && message.hasOwnProperty(\"dimParam\")) {\n if (properties.value === 1)\n return \"value: multiple values\";\n properties.value = 1;\n if (!$util.isString(message.dimParam))\n return \"dimParam: string expected\";\n }\n if (message.denotation != null && message.hasOwnProperty(\"denotation\"))\n if (!$util.isString(message.denotation))\n return \"denotation: string expected\";\n return null;\n };\n\n /**\n * Creates a Dimension message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TensorShapeProto.Dimension} Dimension\n */\n Dimension.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TensorShapeProto.Dimension)\n return object;\n var message = new $root.onnx.TensorShapeProto.Dimension();\n if (object.dimValue != null)\n if ($util.Long)\n (message.dimValue = $util.Long.fromValue(object.dimValue)).unsigned = false;\n else if (typeof object.dimValue === \"string\")\n message.dimValue = parseInt(object.dimValue, 10);\n else if (typeof object.dimValue === \"number\")\n message.dimValue = object.dimValue;\n else if (typeof object.dimValue === \"object\")\n message.dimValue = new $util.LongBits(object.dimValue.low >>> 0, object.dimValue.high >>> 0).toNumber();\n if (object.dimParam != null)\n message.dimParam = String(object.dimParam);\n if (object.denotation != null)\n message.denotation = String(object.denotation);\n return message;\n };\n\n /**\n * Creates a plain object from a Dimension message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {onnx.TensorShapeProto.Dimension} message Dimension\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Dimension.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults)\n object.denotation = \"\";\n if (message.dimValue != null && message.hasOwnProperty(\"dimValue\")) {\n if (typeof message.dimValue === \"number\")\n object.dimValue = options.longs === String ? String(message.dimValue) : message.dimValue;\n else\n object.dimValue = options.longs === String ? $util.Long.prototype.toString.call(message.dimValue) : options.longs === Number ? new $util.LongBits(message.dimValue.low >>> 0, message.dimValue.high >>> 0).toNumber() : message.dimValue;\n if (options.oneofs)\n object.value = \"dimValue\";\n }\n if (message.dimParam != null && message.hasOwnProperty(\"dimParam\")) {\n object.dimParam = message.dimParam;\n if (options.oneofs)\n object.value = \"dimParam\";\n }\n if (message.denotation != null && message.hasOwnProperty(\"denotation\"))\n object.denotation = message.denotation;\n return object;\n };\n\n /**\n * Converts this Dimension to JSON.\n * @function toJSON\n * @memberof onnx.TensorShapeProto.Dimension\n * @instance\n * @returns {Object.} JSON object\n */\n Dimension.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for Dimension\n * @function getTypeUrl\n * @memberof onnx.TensorShapeProto.Dimension\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n Dimension.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TensorShapeProto.Dimension\";\n };\n\n return Dimension;\n })();\n\n return TensorShapeProto;\n })();\n\n onnx.TypeProto = (function() {\n\n /**\n * Properties of a TypeProto.\n * @memberof onnx\n * @interface ITypeProto\n * @property {onnx.TypeProto.ITensor|null} [tensorType] TypeProto tensorType\n * @property {onnx.TypeProto.ISequence|null} [sequenceType] TypeProto sequenceType\n * @property {onnx.TypeProto.IMap|null} [mapType] TypeProto mapType\n * @property {onnx.TypeProto.IOptional|null} [optionalType] TypeProto optionalType\n * @property {onnx.TypeProto.ISparseTensor|null} [sparseTensorType] TypeProto sparseTensorType\n * @property {string|null} [denotation] TypeProto denotation\n */\n\n /**\n * Constructs a new TypeProto.\n * @memberof onnx\n * @classdesc Represents a TypeProto.\n * @implements ITypeProto\n * @constructor\n * @param {onnx.ITypeProto=} [properties] Properties to set\n */\n function TypeProto(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * TypeProto tensorType.\n * @member {onnx.TypeProto.ITensor|null|undefined} tensorType\n * @memberof onnx.TypeProto\n * @instance\n */\n TypeProto.prototype.tensorType = null;\n\n /**\n * TypeProto sequenceType.\n * @member {onnx.TypeProto.ISequence|null|undefined} sequenceType\n * @memberof onnx.TypeProto\n * @instance\n */\n TypeProto.prototype.sequenceType = null;\n\n /**\n * TypeProto mapType.\n * @member {onnx.TypeProto.IMap|null|undefined} mapType\n * @memberof onnx.TypeProto\n * @instance\n */\n TypeProto.prototype.mapType = null;\n\n /**\n * TypeProto optionalType.\n * @member {onnx.TypeProto.IOptional|null|undefined} optionalType\n * @memberof onnx.TypeProto\n * @instance\n */\n TypeProto.prototype.optionalType = null;\n\n /**\n * TypeProto sparseTensorType.\n * @member {onnx.TypeProto.ISparseTensor|null|undefined} sparseTensorType\n * @memberof onnx.TypeProto\n * @instance\n */\n TypeProto.prototype.sparseTensorType = null;\n\n /**\n * TypeProto denotation.\n * @member {string} denotation\n * @memberof onnx.TypeProto\n * @instance\n */\n TypeProto.prototype.denotation = \"\";\n\n // OneOf field names bound to virtual getters and setters\n var $oneOfFields;\n\n /**\n * TypeProto value.\n * @member {\"tensorType\"|\"sequenceType\"|\"mapType\"|\"optionalType\"|\"sparseTensorType\"|undefined} value\n * @memberof onnx.TypeProto\n * @instance\n */\n Object.defineProperty(TypeProto.prototype, \"value\", {\n get: $util.oneOfGetter($oneOfFields = [\"tensorType\", \"sequenceType\", \"mapType\", \"optionalType\", \"sparseTensorType\"]),\n set: $util.oneOfSetter($oneOfFields)\n });\n\n /**\n * Creates a new TypeProto instance using the specified properties.\n * @function create\n * @memberof onnx.TypeProto\n * @static\n * @param {onnx.ITypeProto=} [properties] Properties to set\n * @returns {onnx.TypeProto} TypeProto instance\n */\n TypeProto.create = function create(properties) {\n return new TypeProto(properties);\n };\n\n /**\n * Encodes the specified TypeProto message. Does not implicitly {@link onnx.TypeProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.TypeProto\n * @static\n * @param {onnx.ITypeProto} message TypeProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TypeProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.tensorType != null && Object.hasOwnProperty.call(message, \"tensorType\"))\n $root.onnx.TypeProto.Tensor.encode(message.tensorType, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n if (message.sequenceType != null && Object.hasOwnProperty.call(message, \"sequenceType\"))\n $root.onnx.TypeProto.Sequence.encode(message.sequenceType, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();\n if (message.mapType != null && Object.hasOwnProperty.call(message, \"mapType\"))\n $root.onnx.TypeProto.Map.encode(message.mapType, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\n if (message.denotation != null && Object.hasOwnProperty.call(message, \"denotation\"))\n writer.uint32(/* id 6, wireType 2 =*/50).string(message.denotation);\n if (message.sparseTensorType != null && Object.hasOwnProperty.call(message, \"sparseTensorType\"))\n $root.onnx.TypeProto.SparseTensor.encode(message.sparseTensorType, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();\n if (message.optionalType != null && Object.hasOwnProperty.call(message, \"optionalType\"))\n $root.onnx.TypeProto.Optional.encode(message.optionalType, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified TypeProto message, length delimited. Does not implicitly {@link onnx.TypeProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TypeProto\n * @static\n * @param {onnx.ITypeProto} message TypeProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n TypeProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a TypeProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TypeProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TypeProto} TypeProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TypeProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TypeProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.tensorType = $root.onnx.TypeProto.Tensor.decode(reader, reader.uint32());\n break;\n }\n case 4: {\n message.sequenceType = $root.onnx.TypeProto.Sequence.decode(reader, reader.uint32());\n break;\n }\n case 5: {\n message.mapType = $root.onnx.TypeProto.Map.decode(reader, reader.uint32());\n break;\n }\n case 9: {\n message.optionalType = $root.onnx.TypeProto.Optional.decode(reader, reader.uint32());\n break;\n }\n case 8: {\n message.sparseTensorType = $root.onnx.TypeProto.SparseTensor.decode(reader, reader.uint32());\n break;\n }\n case 6: {\n message.denotation = reader.string();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a TypeProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TypeProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TypeProto} TypeProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n TypeProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a TypeProto message.\n * @function verify\n * @memberof onnx.TypeProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n TypeProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n var properties = {};\n if (message.tensorType != null && message.hasOwnProperty(\"tensorType\")) {\n properties.value = 1;\n {\n var error = $root.onnx.TypeProto.Tensor.verify(message.tensorType);\n if (error)\n return \"tensorType.\" + error;\n }\n }\n if (message.sequenceType != null && message.hasOwnProperty(\"sequenceType\")) {\n if (properties.value === 1)\n return \"value: multiple values\";\n properties.value = 1;\n {\n var error = $root.onnx.TypeProto.Sequence.verify(message.sequenceType);\n if (error)\n return \"sequenceType.\" + error;\n }\n }\n if (message.mapType != null && message.hasOwnProperty(\"mapType\")) {\n if (properties.value === 1)\n return \"value: multiple values\";\n properties.value = 1;\n {\n var error = $root.onnx.TypeProto.Map.verify(message.mapType);\n if (error)\n return \"mapType.\" + error;\n }\n }\n if (message.optionalType != null && message.hasOwnProperty(\"optionalType\")) {\n if (properties.value === 1)\n return \"value: multiple values\";\n properties.value = 1;\n {\n var error = $root.onnx.TypeProto.Optional.verify(message.optionalType);\n if (error)\n return \"optionalType.\" + error;\n }\n }\n if (message.sparseTensorType != null && message.hasOwnProperty(\"sparseTensorType\")) {\n if (properties.value === 1)\n return \"value: multiple values\";\n properties.value = 1;\n {\n var error = $root.onnx.TypeProto.SparseTensor.verify(message.sparseTensorType);\n if (error)\n return \"sparseTensorType.\" + error;\n }\n }\n if (message.denotation != null && message.hasOwnProperty(\"denotation\"))\n if (!$util.isString(message.denotation))\n return \"denotation: string expected\";\n return null;\n };\n\n /**\n * Creates a TypeProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TypeProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TypeProto} TypeProto\n */\n TypeProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TypeProto)\n return object;\n var message = new $root.onnx.TypeProto();\n if (object.tensorType != null) {\n if (typeof object.tensorType !== \"object\")\n throw TypeError(\".onnx.TypeProto.tensorType: object expected\");\n message.tensorType = $root.onnx.TypeProto.Tensor.fromObject(object.tensorType);\n }\n if (object.sequenceType != null) {\n if (typeof object.sequenceType !== \"object\")\n throw TypeError(\".onnx.TypeProto.sequenceType: object expected\");\n message.sequenceType = $root.onnx.TypeProto.Sequence.fromObject(object.sequenceType);\n }\n if (object.mapType != null) {\n if (typeof object.mapType !== \"object\")\n throw TypeError(\".onnx.TypeProto.mapType: object expected\");\n message.mapType = $root.onnx.TypeProto.Map.fromObject(object.mapType);\n }\n if (object.optionalType != null) {\n if (typeof object.optionalType !== \"object\")\n throw TypeError(\".onnx.TypeProto.optionalType: object expected\");\n message.optionalType = $root.onnx.TypeProto.Optional.fromObject(object.optionalType);\n }\n if (object.sparseTensorType != null) {\n if (typeof object.sparseTensorType !== \"object\")\n throw TypeError(\".onnx.TypeProto.sparseTensorType: object expected\");\n message.sparseTensorType = $root.onnx.TypeProto.SparseTensor.fromObject(object.sparseTensorType);\n }\n if (object.denotation != null)\n message.denotation = String(object.denotation);\n return message;\n };\n\n /**\n * Creates a plain object from a TypeProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TypeProto\n * @static\n * @param {onnx.TypeProto} message TypeProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n TypeProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults)\n object.denotation = \"\";\n if (message.tensorType != null && message.hasOwnProperty(\"tensorType\")) {\n object.tensorType = $root.onnx.TypeProto.Tensor.toObject(message.tensorType, options);\n if (options.oneofs)\n object.value = \"tensorType\";\n }\n if (message.sequenceType != null && message.hasOwnProperty(\"sequenceType\")) {\n object.sequenceType = $root.onnx.TypeProto.Sequence.toObject(message.sequenceType, options);\n if (options.oneofs)\n object.value = \"sequenceType\";\n }\n if (message.mapType != null && message.hasOwnProperty(\"mapType\")) {\n object.mapType = $root.onnx.TypeProto.Map.toObject(message.mapType, options);\n if (options.oneofs)\n object.value = \"mapType\";\n }\n if (message.denotation != null && message.hasOwnProperty(\"denotation\"))\n object.denotation = message.denotation;\n if (message.sparseTensorType != null && message.hasOwnProperty(\"sparseTensorType\")) {\n object.sparseTensorType = $root.onnx.TypeProto.SparseTensor.toObject(message.sparseTensorType, options);\n if (options.oneofs)\n object.value = \"sparseTensorType\";\n }\n if (message.optionalType != null && message.hasOwnProperty(\"optionalType\")) {\n object.optionalType = $root.onnx.TypeProto.Optional.toObject(message.optionalType, options);\n if (options.oneofs)\n object.value = \"optionalType\";\n }\n return object;\n };\n\n /**\n * Converts this TypeProto to JSON.\n * @function toJSON\n * @memberof onnx.TypeProto\n * @instance\n * @returns {Object.} JSON object\n */\n TypeProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for TypeProto\n * @function getTypeUrl\n * @memberof onnx.TypeProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n TypeProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TypeProto\";\n };\n\n TypeProto.Tensor = (function() {\n\n /**\n * Properties of a Tensor.\n * @memberof onnx.TypeProto\n * @interface ITensor\n * @property {number|null} [elemType] Tensor elemType\n * @property {onnx.ITensorShapeProto|null} [shape] Tensor shape\n */\n\n /**\n * Constructs a new Tensor.\n * @memberof onnx.TypeProto\n * @classdesc Represents a Tensor.\n * @implements ITensor\n * @constructor\n * @param {onnx.TypeProto.ITensor=} [properties] Properties to set\n */\n function Tensor(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Tensor elemType.\n * @member {number} elemType\n * @memberof onnx.TypeProto.Tensor\n * @instance\n */\n Tensor.prototype.elemType = 0;\n\n /**\n * Tensor shape.\n * @member {onnx.ITensorShapeProto|null|undefined} shape\n * @memberof onnx.TypeProto.Tensor\n * @instance\n */\n Tensor.prototype.shape = null;\n\n /**\n * Creates a new Tensor instance using the specified properties.\n * @function create\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {onnx.TypeProto.ITensor=} [properties] Properties to set\n * @returns {onnx.TypeProto.Tensor} Tensor instance\n */\n Tensor.create = function create(properties) {\n return new Tensor(properties);\n };\n\n /**\n * Encodes the specified Tensor message. Does not implicitly {@link onnx.TypeProto.Tensor.verify|verify} messages.\n * @function encode\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {onnx.TypeProto.ITensor} message Tensor message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Tensor.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.elemType != null && Object.hasOwnProperty.call(message, \"elemType\"))\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.elemType);\n if (message.shape != null && Object.hasOwnProperty.call(message, \"shape\"))\n $root.onnx.TensorShapeProto.encode(message.shape, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified Tensor message, length delimited. Does not implicitly {@link onnx.TypeProto.Tensor.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {onnx.TypeProto.ITensor} message Tensor message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Tensor.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Tensor message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TypeProto.Tensor} Tensor\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Tensor.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TypeProto.Tensor();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.elemType = reader.int32();\n break;\n }\n case 2: {\n message.shape = $root.onnx.TensorShapeProto.decode(reader, reader.uint32());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Tensor message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TypeProto.Tensor} Tensor\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Tensor.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Tensor message.\n * @function verify\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Tensor.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.elemType != null && message.hasOwnProperty(\"elemType\"))\n if (!$util.isInteger(message.elemType))\n return \"elemType: integer expected\";\n if (message.shape != null && message.hasOwnProperty(\"shape\")) {\n var error = $root.onnx.TensorShapeProto.verify(message.shape);\n if (error)\n return \"shape.\" + error;\n }\n return null;\n };\n\n /**\n * Creates a Tensor message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TypeProto.Tensor} Tensor\n */\n Tensor.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TypeProto.Tensor)\n return object;\n var message = new $root.onnx.TypeProto.Tensor();\n if (object.elemType != null)\n message.elemType = object.elemType | 0;\n if (object.shape != null) {\n if (typeof object.shape !== \"object\")\n throw TypeError(\".onnx.TypeProto.Tensor.shape: object expected\");\n message.shape = $root.onnx.TensorShapeProto.fromObject(object.shape);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a Tensor message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {onnx.TypeProto.Tensor} message Tensor\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Tensor.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults) {\n object.elemType = 0;\n object.shape = null;\n }\n if (message.elemType != null && message.hasOwnProperty(\"elemType\"))\n object.elemType = message.elemType;\n if (message.shape != null && message.hasOwnProperty(\"shape\"))\n object.shape = $root.onnx.TensorShapeProto.toObject(message.shape, options);\n return object;\n };\n\n /**\n * Converts this Tensor to JSON.\n * @function toJSON\n * @memberof onnx.TypeProto.Tensor\n * @instance\n * @returns {Object.} JSON object\n */\n Tensor.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for Tensor\n * @function getTypeUrl\n * @memberof onnx.TypeProto.Tensor\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n Tensor.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TypeProto.Tensor\";\n };\n\n return Tensor;\n })();\n\n TypeProto.Sequence = (function() {\n\n /**\n * Properties of a Sequence.\n * @memberof onnx.TypeProto\n * @interface ISequence\n * @property {onnx.ITypeProto|null} [elemType] Sequence elemType\n */\n\n /**\n * Constructs a new Sequence.\n * @memberof onnx.TypeProto\n * @classdesc Represents a Sequence.\n * @implements ISequence\n * @constructor\n * @param {onnx.TypeProto.ISequence=} [properties] Properties to set\n */\n function Sequence(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Sequence elemType.\n * @member {onnx.ITypeProto|null|undefined} elemType\n * @memberof onnx.TypeProto.Sequence\n * @instance\n */\n Sequence.prototype.elemType = null;\n\n /**\n * Creates a new Sequence instance using the specified properties.\n * @function create\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {onnx.TypeProto.ISequence=} [properties] Properties to set\n * @returns {onnx.TypeProto.Sequence} Sequence instance\n */\n Sequence.create = function create(properties) {\n return new Sequence(properties);\n };\n\n /**\n * Encodes the specified Sequence message. Does not implicitly {@link onnx.TypeProto.Sequence.verify|verify} messages.\n * @function encode\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {onnx.TypeProto.ISequence} message Sequence message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Sequence.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.elemType != null && Object.hasOwnProperty.call(message, \"elemType\"))\n $root.onnx.TypeProto.encode(message.elemType, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified Sequence message, length delimited. Does not implicitly {@link onnx.TypeProto.Sequence.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {onnx.TypeProto.ISequence} message Sequence message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Sequence.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Sequence message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TypeProto.Sequence} Sequence\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Sequence.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TypeProto.Sequence();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.elemType = $root.onnx.TypeProto.decode(reader, reader.uint32());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Sequence message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TypeProto.Sequence} Sequence\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Sequence.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Sequence message.\n * @function verify\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Sequence.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.elemType != null && message.hasOwnProperty(\"elemType\")) {\n var error = $root.onnx.TypeProto.verify(message.elemType);\n if (error)\n return \"elemType.\" + error;\n }\n return null;\n };\n\n /**\n * Creates a Sequence message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TypeProto.Sequence} Sequence\n */\n Sequence.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TypeProto.Sequence)\n return object;\n var message = new $root.onnx.TypeProto.Sequence();\n if (object.elemType != null) {\n if (typeof object.elemType !== \"object\")\n throw TypeError(\".onnx.TypeProto.Sequence.elemType: object expected\");\n message.elemType = $root.onnx.TypeProto.fromObject(object.elemType);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a Sequence message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {onnx.TypeProto.Sequence} message Sequence\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Sequence.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults)\n object.elemType = null;\n if (message.elemType != null && message.hasOwnProperty(\"elemType\"))\n object.elemType = $root.onnx.TypeProto.toObject(message.elemType, options);\n return object;\n };\n\n /**\n * Converts this Sequence to JSON.\n * @function toJSON\n * @memberof onnx.TypeProto.Sequence\n * @instance\n * @returns {Object.} JSON object\n */\n Sequence.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for Sequence\n * @function getTypeUrl\n * @memberof onnx.TypeProto.Sequence\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n Sequence.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TypeProto.Sequence\";\n };\n\n return Sequence;\n })();\n\n TypeProto.Map = (function() {\n\n /**\n * Properties of a Map.\n * @memberof onnx.TypeProto\n * @interface IMap\n * @property {number|null} [keyType] Map keyType\n * @property {onnx.ITypeProto|null} [valueType] Map valueType\n */\n\n /**\n * Constructs a new Map.\n * @memberof onnx.TypeProto\n * @classdesc Represents a Map.\n * @implements IMap\n * @constructor\n * @param {onnx.TypeProto.IMap=} [properties] Properties to set\n */\n function Map(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Map keyType.\n * @member {number} keyType\n * @memberof onnx.TypeProto.Map\n * @instance\n */\n Map.prototype.keyType = 0;\n\n /**\n * Map valueType.\n * @member {onnx.ITypeProto|null|undefined} valueType\n * @memberof onnx.TypeProto.Map\n * @instance\n */\n Map.prototype.valueType = null;\n\n /**\n * Creates a new Map instance using the specified properties.\n * @function create\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {onnx.TypeProto.IMap=} [properties] Properties to set\n * @returns {onnx.TypeProto.Map} Map instance\n */\n Map.create = function create(properties) {\n return new Map(properties);\n };\n\n /**\n * Encodes the specified Map message. Does not implicitly {@link onnx.TypeProto.Map.verify|verify} messages.\n * @function encode\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {onnx.TypeProto.IMap} message Map message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Map.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.keyType != null && Object.hasOwnProperty.call(message, \"keyType\"))\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.keyType);\n if (message.valueType != null && Object.hasOwnProperty.call(message, \"valueType\"))\n $root.onnx.TypeProto.encode(message.valueType, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified Map message, length delimited. Does not implicitly {@link onnx.TypeProto.Map.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {onnx.TypeProto.IMap} message Map message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Map.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Map message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TypeProto.Map} Map\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Map.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TypeProto.Map();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.keyType = reader.int32();\n break;\n }\n case 2: {\n message.valueType = $root.onnx.TypeProto.decode(reader, reader.uint32());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Map message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TypeProto.Map} Map\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Map.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Map message.\n * @function verify\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Map.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.keyType != null && message.hasOwnProperty(\"keyType\"))\n if (!$util.isInteger(message.keyType))\n return \"keyType: integer expected\";\n if (message.valueType != null && message.hasOwnProperty(\"valueType\")) {\n var error = $root.onnx.TypeProto.verify(message.valueType);\n if (error)\n return \"valueType.\" + error;\n }\n return null;\n };\n\n /**\n * Creates a Map message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TypeProto.Map} Map\n */\n Map.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TypeProto.Map)\n return object;\n var message = new $root.onnx.TypeProto.Map();\n if (object.keyType != null)\n message.keyType = object.keyType | 0;\n if (object.valueType != null) {\n if (typeof object.valueType !== \"object\")\n throw TypeError(\".onnx.TypeProto.Map.valueType: object expected\");\n message.valueType = $root.onnx.TypeProto.fromObject(object.valueType);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a Map message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {onnx.TypeProto.Map} message Map\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Map.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults) {\n object.keyType = 0;\n object.valueType = null;\n }\n if (message.keyType != null && message.hasOwnProperty(\"keyType\"))\n object.keyType = message.keyType;\n if (message.valueType != null && message.hasOwnProperty(\"valueType\"))\n object.valueType = $root.onnx.TypeProto.toObject(message.valueType, options);\n return object;\n };\n\n /**\n * Converts this Map to JSON.\n * @function toJSON\n * @memberof onnx.TypeProto.Map\n * @instance\n * @returns {Object.} JSON object\n */\n Map.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for Map\n * @function getTypeUrl\n * @memberof onnx.TypeProto.Map\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n Map.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TypeProto.Map\";\n };\n\n return Map;\n })();\n\n TypeProto.Optional = (function() {\n\n /**\n * Properties of an Optional.\n * @memberof onnx.TypeProto\n * @interface IOptional\n * @property {onnx.ITypeProto|null} [elemType] Optional elemType\n */\n\n /**\n * Constructs a new Optional.\n * @memberof onnx.TypeProto\n * @classdesc Represents an Optional.\n * @implements IOptional\n * @constructor\n * @param {onnx.TypeProto.IOptional=} [properties] Properties to set\n */\n function Optional(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Optional elemType.\n * @member {onnx.ITypeProto|null|undefined} elemType\n * @memberof onnx.TypeProto.Optional\n * @instance\n */\n Optional.prototype.elemType = null;\n\n /**\n * Creates a new Optional instance using the specified properties.\n * @function create\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {onnx.TypeProto.IOptional=} [properties] Properties to set\n * @returns {onnx.TypeProto.Optional} Optional instance\n */\n Optional.create = function create(properties) {\n return new Optional(properties);\n };\n\n /**\n * Encodes the specified Optional message. Does not implicitly {@link onnx.TypeProto.Optional.verify|verify} messages.\n * @function encode\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {onnx.TypeProto.IOptional} message Optional message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Optional.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.elemType != null && Object.hasOwnProperty.call(message, \"elemType\"))\n $root.onnx.TypeProto.encode(message.elemType, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified Optional message, length delimited. Does not implicitly {@link onnx.TypeProto.Optional.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {onnx.TypeProto.IOptional} message Optional message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Optional.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes an Optional message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TypeProto.Optional} Optional\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Optional.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TypeProto.Optional();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.elemType = $root.onnx.TypeProto.decode(reader, reader.uint32());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes an Optional message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TypeProto.Optional} Optional\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Optional.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies an Optional message.\n * @function verify\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Optional.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.elemType != null && message.hasOwnProperty(\"elemType\")) {\n var error = $root.onnx.TypeProto.verify(message.elemType);\n if (error)\n return \"elemType.\" + error;\n }\n return null;\n };\n\n /**\n * Creates an Optional message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TypeProto.Optional} Optional\n */\n Optional.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TypeProto.Optional)\n return object;\n var message = new $root.onnx.TypeProto.Optional();\n if (object.elemType != null) {\n if (typeof object.elemType !== \"object\")\n throw TypeError(\".onnx.TypeProto.Optional.elemType: object expected\");\n message.elemType = $root.onnx.TypeProto.fromObject(object.elemType);\n }\n return message;\n };\n\n /**\n * Creates a plain object from an Optional message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {onnx.TypeProto.Optional} message Optional\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Optional.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults)\n object.elemType = null;\n if (message.elemType != null && message.hasOwnProperty(\"elemType\"))\n object.elemType = $root.onnx.TypeProto.toObject(message.elemType, options);\n return object;\n };\n\n /**\n * Converts this Optional to JSON.\n * @function toJSON\n * @memberof onnx.TypeProto.Optional\n * @instance\n * @returns {Object.} JSON object\n */\n Optional.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for Optional\n * @function getTypeUrl\n * @memberof onnx.TypeProto.Optional\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n Optional.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TypeProto.Optional\";\n };\n\n return Optional;\n })();\n\n TypeProto.SparseTensor = (function() {\n\n /**\n * Properties of a SparseTensor.\n * @memberof onnx.TypeProto\n * @interface ISparseTensor\n * @property {number|null} [elemType] SparseTensor elemType\n * @property {onnx.ITensorShapeProto|null} [shape] SparseTensor shape\n */\n\n /**\n * Constructs a new SparseTensor.\n * @memberof onnx.TypeProto\n * @classdesc Represents a SparseTensor.\n * @implements ISparseTensor\n * @constructor\n * @param {onnx.TypeProto.ISparseTensor=} [properties] Properties to set\n */\n function SparseTensor(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * SparseTensor elemType.\n * @member {number} elemType\n * @memberof onnx.TypeProto.SparseTensor\n * @instance\n */\n SparseTensor.prototype.elemType = 0;\n\n /**\n * SparseTensor shape.\n * @member {onnx.ITensorShapeProto|null|undefined} shape\n * @memberof onnx.TypeProto.SparseTensor\n * @instance\n */\n SparseTensor.prototype.shape = null;\n\n /**\n * Creates a new SparseTensor instance using the specified properties.\n * @function create\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {onnx.TypeProto.ISparseTensor=} [properties] Properties to set\n * @returns {onnx.TypeProto.SparseTensor} SparseTensor instance\n */\n SparseTensor.create = function create(properties) {\n return new SparseTensor(properties);\n };\n\n /**\n * Encodes the specified SparseTensor message. Does not implicitly {@link onnx.TypeProto.SparseTensor.verify|verify} messages.\n * @function encode\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {onnx.TypeProto.ISparseTensor} message SparseTensor message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n SparseTensor.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.elemType != null && Object.hasOwnProperty.call(message, \"elemType\"))\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.elemType);\n if (message.shape != null && Object.hasOwnProperty.call(message, \"shape\"))\n $root.onnx.TensorShapeProto.encode(message.shape, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified SparseTensor message, length delimited. Does not implicitly {@link onnx.TypeProto.SparseTensor.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {onnx.TypeProto.ISparseTensor} message SparseTensor message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n SparseTensor.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a SparseTensor message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.TypeProto.SparseTensor} SparseTensor\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n SparseTensor.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.TypeProto.SparseTensor();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.elemType = reader.int32();\n break;\n }\n case 2: {\n message.shape = $root.onnx.TensorShapeProto.decode(reader, reader.uint32());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a SparseTensor message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.TypeProto.SparseTensor} SparseTensor\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n SparseTensor.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a SparseTensor message.\n * @function verify\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n SparseTensor.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.elemType != null && message.hasOwnProperty(\"elemType\"))\n if (!$util.isInteger(message.elemType))\n return \"elemType: integer expected\";\n if (message.shape != null && message.hasOwnProperty(\"shape\")) {\n var error = $root.onnx.TensorShapeProto.verify(message.shape);\n if (error)\n return \"shape.\" + error;\n }\n return null;\n };\n\n /**\n * Creates a SparseTensor message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.TypeProto.SparseTensor} SparseTensor\n */\n SparseTensor.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.TypeProto.SparseTensor)\n return object;\n var message = new $root.onnx.TypeProto.SparseTensor();\n if (object.elemType != null)\n message.elemType = object.elemType | 0;\n if (object.shape != null) {\n if (typeof object.shape !== \"object\")\n throw TypeError(\".onnx.TypeProto.SparseTensor.shape: object expected\");\n message.shape = $root.onnx.TensorShapeProto.fromObject(object.shape);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a SparseTensor message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {onnx.TypeProto.SparseTensor} message SparseTensor\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n SparseTensor.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults) {\n object.elemType = 0;\n object.shape = null;\n }\n if (message.elemType != null && message.hasOwnProperty(\"elemType\"))\n object.elemType = message.elemType;\n if (message.shape != null && message.hasOwnProperty(\"shape\"))\n object.shape = $root.onnx.TensorShapeProto.toObject(message.shape, options);\n return object;\n };\n\n /**\n * Converts this SparseTensor to JSON.\n * @function toJSON\n * @memberof onnx.TypeProto.SparseTensor\n * @instance\n * @returns {Object.} JSON object\n */\n SparseTensor.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for SparseTensor\n * @function getTypeUrl\n * @memberof onnx.TypeProto.SparseTensor\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n SparseTensor.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.TypeProto.SparseTensor\";\n };\n\n return SparseTensor;\n })();\n\n return TypeProto;\n })();\n\n onnx.OperatorSetIdProto = (function() {\n\n /**\n * Properties of an OperatorSetIdProto.\n * @memberof onnx\n * @interface IOperatorSetIdProto\n * @property {string|null} [domain] OperatorSetIdProto domain\n * @property {number|Long|null} [version] OperatorSetIdProto version\n */\n\n /**\n * Constructs a new OperatorSetIdProto.\n * @memberof onnx\n * @classdesc Represents an OperatorSetIdProto.\n * @implements IOperatorSetIdProto\n * @constructor\n * @param {onnx.IOperatorSetIdProto=} [properties] Properties to set\n */\n function OperatorSetIdProto(properties) {\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * OperatorSetIdProto domain.\n * @member {string} domain\n * @memberof onnx.OperatorSetIdProto\n * @instance\n */\n OperatorSetIdProto.prototype.domain = \"\";\n\n /**\n * OperatorSetIdProto version.\n * @member {number|Long} version\n * @memberof onnx.OperatorSetIdProto\n * @instance\n */\n OperatorSetIdProto.prototype.version = $util.Long ? $util.Long.fromBits(0,0,false) : 0;\n\n /**\n * Creates a new OperatorSetIdProto instance using the specified properties.\n * @function create\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {onnx.IOperatorSetIdProto=} [properties] Properties to set\n * @returns {onnx.OperatorSetIdProto} OperatorSetIdProto instance\n */\n OperatorSetIdProto.create = function create(properties) {\n return new OperatorSetIdProto(properties);\n };\n\n /**\n * Encodes the specified OperatorSetIdProto message. Does not implicitly {@link onnx.OperatorSetIdProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {onnx.IOperatorSetIdProto} message OperatorSetIdProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n OperatorSetIdProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.domain != null && Object.hasOwnProperty.call(message, \"domain\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.domain);\n if (message.version != null && Object.hasOwnProperty.call(message, \"version\"))\n writer.uint32(/* id 2, wireType 0 =*/16).int64(message.version);\n return writer;\n };\n\n /**\n * Encodes the specified OperatorSetIdProto message, length delimited. Does not implicitly {@link onnx.OperatorSetIdProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {onnx.IOperatorSetIdProto} message OperatorSetIdProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n OperatorSetIdProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes an OperatorSetIdProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.OperatorSetIdProto} OperatorSetIdProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n OperatorSetIdProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.OperatorSetIdProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.domain = reader.string();\n break;\n }\n case 2: {\n message.version = reader.int64();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes an OperatorSetIdProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.OperatorSetIdProto} OperatorSetIdProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n OperatorSetIdProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies an OperatorSetIdProto message.\n * @function verify\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n OperatorSetIdProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.domain != null && message.hasOwnProperty(\"domain\"))\n if (!$util.isString(message.domain))\n return \"domain: string expected\";\n if (message.version != null && message.hasOwnProperty(\"version\"))\n if (!$util.isInteger(message.version) && !(message.version && $util.isInteger(message.version.low) && $util.isInteger(message.version.high)))\n return \"version: integer|Long expected\";\n return null;\n };\n\n /**\n * Creates an OperatorSetIdProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.OperatorSetIdProto} OperatorSetIdProto\n */\n OperatorSetIdProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.OperatorSetIdProto)\n return object;\n var message = new $root.onnx.OperatorSetIdProto();\n if (object.domain != null)\n message.domain = String(object.domain);\n if (object.version != null)\n if ($util.Long)\n (message.version = $util.Long.fromValue(object.version)).unsigned = false;\n else if (typeof object.version === \"string\")\n message.version = parseInt(object.version, 10);\n else if (typeof object.version === \"number\")\n message.version = object.version;\n else if (typeof object.version === \"object\")\n message.version = new $util.LongBits(object.version.low >>> 0, object.version.high >>> 0).toNumber();\n return message;\n };\n\n /**\n * Creates a plain object from an OperatorSetIdProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {onnx.OperatorSetIdProto} message OperatorSetIdProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n OperatorSetIdProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.defaults) {\n object.domain = \"\";\n if ($util.Long) {\n var long = new $util.Long(0, 0, false);\n object.version = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;\n } else\n object.version = options.longs === String ? \"0\" : 0;\n }\n if (message.domain != null && message.hasOwnProperty(\"domain\"))\n object.domain = message.domain;\n if (message.version != null && message.hasOwnProperty(\"version\"))\n if (typeof message.version === \"number\")\n object.version = options.longs === String ? String(message.version) : message.version;\n else\n object.version = options.longs === String ? $util.Long.prototype.toString.call(message.version) : options.longs === Number ? new $util.LongBits(message.version.low >>> 0, message.version.high >>> 0).toNumber() : message.version;\n return object;\n };\n\n /**\n * Converts this OperatorSetIdProto to JSON.\n * @function toJSON\n * @memberof onnx.OperatorSetIdProto\n * @instance\n * @returns {Object.} JSON object\n */\n OperatorSetIdProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for OperatorSetIdProto\n * @function getTypeUrl\n * @memberof onnx.OperatorSetIdProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n OperatorSetIdProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.OperatorSetIdProto\";\n };\n\n return OperatorSetIdProto;\n })();\n\n /**\n * OperatorStatus enum.\n * @name onnx.OperatorStatus\n * @enum {number}\n * @property {number} EXPERIMENTAL=0 EXPERIMENTAL value\n * @property {number} STABLE=1 STABLE value\n */\n onnx.OperatorStatus = (function() {\n var valuesById = {}, values = Object.create(valuesById);\n values[valuesById[0] = \"EXPERIMENTAL\"] = 0;\n values[valuesById[1] = \"STABLE\"] = 1;\n return values;\n })();\n\n onnx.FunctionProto = (function() {\n\n /**\n * Properties of a FunctionProto.\n * @memberof onnx\n * @interface IFunctionProto\n * @property {string|null} [name] FunctionProto name\n * @property {Array.|null} [input] FunctionProto input\n * @property {Array.|null} [output] FunctionProto output\n * @property {Array.|null} [attribute] FunctionProto attribute\n * @property {Array.|null} [attributeProto] FunctionProto attributeProto\n * @property {Array.|null} [node] FunctionProto node\n * @property {string|null} [docString] FunctionProto docString\n * @property {Array.|null} [opsetImport] FunctionProto opsetImport\n * @property {string|null} [domain] FunctionProto domain\n */\n\n /**\n * Constructs a new FunctionProto.\n * @memberof onnx\n * @classdesc Represents a FunctionProto.\n * @implements IFunctionProto\n * @constructor\n * @param {onnx.IFunctionProto=} [properties] Properties to set\n */\n function FunctionProto(properties) {\n this.input = [];\n this.output = [];\n this.attribute = [];\n this.attributeProto = [];\n this.node = [];\n this.opsetImport = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * FunctionProto name.\n * @member {string} name\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.name = \"\";\n\n /**\n * FunctionProto input.\n * @member {Array.} input\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.input = $util.emptyArray;\n\n /**\n * FunctionProto output.\n * @member {Array.} output\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.output = $util.emptyArray;\n\n /**\n * FunctionProto attribute.\n * @member {Array.} attribute\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.attribute = $util.emptyArray;\n\n /**\n * FunctionProto attributeProto.\n * @member {Array.} attributeProto\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.attributeProto = $util.emptyArray;\n\n /**\n * FunctionProto node.\n * @member {Array.} node\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.node = $util.emptyArray;\n\n /**\n * FunctionProto docString.\n * @member {string} docString\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.docString = \"\";\n\n /**\n * FunctionProto opsetImport.\n * @member {Array.} opsetImport\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.opsetImport = $util.emptyArray;\n\n /**\n * FunctionProto domain.\n * @member {string} domain\n * @memberof onnx.FunctionProto\n * @instance\n */\n FunctionProto.prototype.domain = \"\";\n\n /**\n * Creates a new FunctionProto instance using the specified properties.\n * @function create\n * @memberof onnx.FunctionProto\n * @static\n * @param {onnx.IFunctionProto=} [properties] Properties to set\n * @returns {onnx.FunctionProto} FunctionProto instance\n */\n FunctionProto.create = function create(properties) {\n return new FunctionProto(properties);\n };\n\n /**\n * Encodes the specified FunctionProto message. Does not implicitly {@link onnx.FunctionProto.verify|verify} messages.\n * @function encode\n * @memberof onnx.FunctionProto\n * @static\n * @param {onnx.IFunctionProto} message FunctionProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n FunctionProto.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);\n if (message.input != null && message.input.length)\n for (var i = 0; i < message.input.length; ++i)\n writer.uint32(/* id 4, wireType 2 =*/34).string(message.input[i]);\n if (message.output != null && message.output.length)\n for (var i = 0; i < message.output.length; ++i)\n writer.uint32(/* id 5, wireType 2 =*/42).string(message.output[i]);\n if (message.attribute != null && message.attribute.length)\n for (var i = 0; i < message.attribute.length; ++i)\n writer.uint32(/* id 6, wireType 2 =*/50).string(message.attribute[i]);\n if (message.node != null && message.node.length)\n for (var i = 0; i < message.node.length; ++i)\n $root.onnx.NodeProto.encode(message.node[i], writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();\n if (message.docString != null && Object.hasOwnProperty.call(message, \"docString\"))\n writer.uint32(/* id 8, wireType 2 =*/66).string(message.docString);\n if (message.opsetImport != null && message.opsetImport.length)\n for (var i = 0; i < message.opsetImport.length; ++i)\n $root.onnx.OperatorSetIdProto.encode(message.opsetImport[i], writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();\n if (message.domain != null && Object.hasOwnProperty.call(message, \"domain\"))\n writer.uint32(/* id 10, wireType 2 =*/82).string(message.domain);\n if (message.attributeProto != null && message.attributeProto.length)\n for (var i = 0; i < message.attributeProto.length; ++i)\n $root.onnx.AttributeProto.encode(message.attributeProto[i], writer.uint32(/* id 11, wireType 2 =*/90).fork()).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified FunctionProto message, length delimited. Does not implicitly {@link onnx.FunctionProto.verify|verify} messages.\n * @function encodeDelimited\n * @memberof onnx.FunctionProto\n * @static\n * @param {onnx.IFunctionProto} message FunctionProto message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n FunctionProto.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a FunctionProto message from the specified reader or buffer.\n * @function decode\n * @memberof onnx.FunctionProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {onnx.FunctionProto} FunctionProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n FunctionProto.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.onnx.FunctionProto();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.name = reader.string();\n break;\n }\n case 4: {\n if (!(message.input && message.input.length))\n message.input = [];\n message.input.push(reader.string());\n break;\n }\n case 5: {\n if (!(message.output && message.output.length))\n message.output = [];\n message.output.push(reader.string());\n break;\n }\n case 6: {\n if (!(message.attribute && message.attribute.length))\n message.attribute = [];\n message.attribute.push(reader.string());\n break;\n }\n case 11: {\n if (!(message.attributeProto && message.attributeProto.length))\n message.attributeProto = [];\n message.attributeProto.push($root.onnx.AttributeProto.decode(reader, reader.uint32()));\n break;\n }\n case 7: {\n if (!(message.node && message.node.length))\n message.node = [];\n message.node.push($root.onnx.NodeProto.decode(reader, reader.uint32()));\n break;\n }\n case 8: {\n message.docString = reader.string();\n break;\n }\n case 9: {\n if (!(message.opsetImport && message.opsetImport.length))\n message.opsetImport = [];\n message.opsetImport.push($root.onnx.OperatorSetIdProto.decode(reader, reader.uint32()));\n break;\n }\n case 10: {\n message.domain = reader.string();\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a FunctionProto message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof onnx.FunctionProto\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {onnx.FunctionProto} FunctionProto\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n FunctionProto.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a FunctionProto message.\n * @function verify\n * @memberof onnx.FunctionProto\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n FunctionProto.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.name != null && message.hasOwnProperty(\"name\"))\n if (!$util.isString(message.name))\n return \"name: string expected\";\n if (message.input != null && message.hasOwnProperty(\"input\")) {\n if (!Array.isArray(message.input))\n return \"input: array expected\";\n for (var i = 0; i < message.input.length; ++i)\n if (!$util.isString(message.input[i]))\n return \"input: string[] expected\";\n }\n if (message.output != null && message.hasOwnProperty(\"output\")) {\n if (!Array.isArray(message.output))\n return \"output: array expected\";\n for (var i = 0; i < message.output.length; ++i)\n if (!$util.isString(message.output[i]))\n return \"output: string[] expected\";\n }\n if (message.attribute != null && message.hasOwnProperty(\"attribute\")) {\n if (!Array.isArray(message.attribute))\n return \"attribute: array expected\";\n for (var i = 0; i < message.attribute.length; ++i)\n if (!$util.isString(message.attribute[i]))\n return \"attribute: string[] expected\";\n }\n if (message.attributeProto != null && message.hasOwnProperty(\"attributeProto\")) {\n if (!Array.isArray(message.attributeProto))\n return \"attributeProto: array expected\";\n for (var i = 0; i < message.attributeProto.length; ++i) {\n var error = $root.onnx.AttributeProto.verify(message.attributeProto[i]);\n if (error)\n return \"attributeProto.\" + error;\n }\n }\n if (message.node != null && message.hasOwnProperty(\"node\")) {\n if (!Array.isArray(message.node))\n return \"node: array expected\";\n for (var i = 0; i < message.node.length; ++i) {\n var error = $root.onnx.NodeProto.verify(message.node[i]);\n if (error)\n return \"node.\" + error;\n }\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n if (!$util.isString(message.docString))\n return \"docString: string expected\";\n if (message.opsetImport != null && message.hasOwnProperty(\"opsetImport\")) {\n if (!Array.isArray(message.opsetImport))\n return \"opsetImport: array expected\";\n for (var i = 0; i < message.opsetImport.length; ++i) {\n var error = $root.onnx.OperatorSetIdProto.verify(message.opsetImport[i]);\n if (error)\n return \"opsetImport.\" + error;\n }\n }\n if (message.domain != null && message.hasOwnProperty(\"domain\"))\n if (!$util.isString(message.domain))\n return \"domain: string expected\";\n return null;\n };\n\n /**\n * Creates a FunctionProto message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof onnx.FunctionProto\n * @static\n * @param {Object.} object Plain object\n * @returns {onnx.FunctionProto} FunctionProto\n */\n FunctionProto.fromObject = function fromObject(object) {\n if (object instanceof $root.onnx.FunctionProto)\n return object;\n var message = new $root.onnx.FunctionProto();\n if (object.name != null)\n message.name = String(object.name);\n if (object.input) {\n if (!Array.isArray(object.input))\n throw TypeError(\".onnx.FunctionProto.input: array expected\");\n message.input = [];\n for (var i = 0; i < object.input.length; ++i)\n message.input[i] = String(object.input[i]);\n }\n if (object.output) {\n if (!Array.isArray(object.output))\n throw TypeError(\".onnx.FunctionProto.output: array expected\");\n message.output = [];\n for (var i = 0; i < object.output.length; ++i)\n message.output[i] = String(object.output[i]);\n }\n if (object.attribute) {\n if (!Array.isArray(object.attribute))\n throw TypeError(\".onnx.FunctionProto.attribute: array expected\");\n message.attribute = [];\n for (var i = 0; i < object.attribute.length; ++i)\n message.attribute[i] = String(object.attribute[i]);\n }\n if (object.attributeProto) {\n if (!Array.isArray(object.attributeProto))\n throw TypeError(\".onnx.FunctionProto.attributeProto: array expected\");\n message.attributeProto = [];\n for (var i = 0; i < object.attributeProto.length; ++i) {\n if (typeof object.attributeProto[i] !== \"object\")\n throw TypeError(\".onnx.FunctionProto.attributeProto: object expected\");\n message.attributeProto[i] = $root.onnx.AttributeProto.fromObject(object.attributeProto[i]);\n }\n }\n if (object.node) {\n if (!Array.isArray(object.node))\n throw TypeError(\".onnx.FunctionProto.node: array expected\");\n message.node = [];\n for (var i = 0; i < object.node.length; ++i) {\n if (typeof object.node[i] !== \"object\")\n throw TypeError(\".onnx.FunctionProto.node: object expected\");\n message.node[i] = $root.onnx.NodeProto.fromObject(object.node[i]);\n }\n }\n if (object.docString != null)\n message.docString = String(object.docString);\n if (object.opsetImport) {\n if (!Array.isArray(object.opsetImport))\n throw TypeError(\".onnx.FunctionProto.opsetImport: array expected\");\n message.opsetImport = [];\n for (var i = 0; i < object.opsetImport.length; ++i) {\n if (typeof object.opsetImport[i] !== \"object\")\n throw TypeError(\".onnx.FunctionProto.opsetImport: object expected\");\n message.opsetImport[i] = $root.onnx.OperatorSetIdProto.fromObject(object.opsetImport[i]);\n }\n }\n if (object.domain != null)\n message.domain = String(object.domain);\n return message;\n };\n\n /**\n * Creates a plain object from a FunctionProto message. Also converts values to other types if specified.\n * @function toObject\n * @memberof onnx.FunctionProto\n * @static\n * @param {onnx.FunctionProto} message FunctionProto\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n FunctionProto.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults) {\n object.input = [];\n object.output = [];\n object.attribute = [];\n object.node = [];\n object.opsetImport = [];\n object.attributeProto = [];\n }\n if (options.defaults) {\n object.name = \"\";\n object.docString = \"\";\n object.domain = \"\";\n }\n if (message.name != null && message.hasOwnProperty(\"name\"))\n object.name = message.name;\n if (message.input && message.input.length) {\n object.input = [];\n for (var j = 0; j < message.input.length; ++j)\n object.input[j] = message.input[j];\n }\n if (message.output && message.output.length) {\n object.output = [];\n for (var j = 0; j < message.output.length; ++j)\n object.output[j] = message.output[j];\n }\n if (message.attribute && message.attribute.length) {\n object.attribute = [];\n for (var j = 0; j < message.attribute.length; ++j)\n object.attribute[j] = message.attribute[j];\n }\n if (message.node && message.node.length) {\n object.node = [];\n for (var j = 0; j < message.node.length; ++j)\n object.node[j] = $root.onnx.NodeProto.toObject(message.node[j], options);\n }\n if (message.docString != null && message.hasOwnProperty(\"docString\"))\n object.docString = message.docString;\n if (message.opsetImport && message.opsetImport.length) {\n object.opsetImport = [];\n for (var j = 0; j < message.opsetImport.length; ++j)\n object.opsetImport[j] = $root.onnx.OperatorSetIdProto.toObject(message.opsetImport[j], options);\n }\n if (message.domain != null && message.hasOwnProperty(\"domain\"))\n object.domain = message.domain;\n if (message.attributeProto && message.attributeProto.length) {\n object.attributeProto = [];\n for (var j = 0; j < message.attributeProto.length; ++j)\n object.attributeProto[j] = $root.onnx.AttributeProto.toObject(message.attributeProto[j], options);\n }\n return object;\n };\n\n /**\n * Converts this FunctionProto to JSON.\n * @function toJSON\n * @memberof onnx.FunctionProto\n * @instance\n * @returns {Object.} JSON object\n */\n FunctionProto.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for FunctionProto\n * @function getTypeUrl\n * @memberof onnx.FunctionProto\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n FunctionProto.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/onnx.FunctionProto\";\n };\n\n return FunctionProto;\n })();\n\n return onnx;\n})();\n\nmodule.exports = $root;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {flatbuffers} from 'flatbuffers';\nimport Long from 'long';\n\nimport {Graph} from './graph';\nimport {onnxruntime} from './ort-schema/flatbuffers/ort-generated';\nimport {onnx} from './ort-schema/protobuf/onnx';\nimport {Tensor} from './tensor';\n\n// check the inputs shape before running an OP.\n// return true when the inputs pass the check\n// return false when the inputs do not fit the requirement\n// throw exception when fatal error or not implemented\nexport function checkInputsShape(inputs: Tensor[], ...expectedDimensions: number[]): boolean {\n if (!inputs || inputs.length !== expectedDimensions.length) {\n return false;\n }\n for (let i = 0; i < inputs.length; i++) {\n if (!inputs[i].dims || inputs[i].dims.length !== expectedDimensions[i]) {\n return false;\n }\n }\n return true;\n}\n\n// Evaluates the given expression and asserts error message if condition is unmet.\nexport function assert(expr: boolean, msg: () => string) {\n if (!expr) {\n throw new Error(typeof msg === 'string' ? msg : msg());\n }\n}\n\nexport class ArrayUtil {\n /**\n * Verifies if 2 input arrays contain the same elements.\n * @param n1 Array 1\n * @param n2 Array 2\n * @returns Whether these 2 are equal\n */\n static arraysEqual(\n n1: readonly number[]|Int8Array|Uint8Array|Int16Array|Uint16Array|Int32Array|Uint32Array|Uint8ClampedArray|\n Float32Array|Float64Array,\n n2: readonly number[]|Int8Array|Uint8Array|Int16Array|Uint16Array|Int32Array|Uint32Array|Uint8ClampedArray|\n Float32Array|Float64Array) {\n if (n1.length !== n2.length) {\n return false;\n }\n for (let i = 0; i < n1.length; i++) {\n if (n1[i] !== n2[i]) {\n return false;\n }\n }\n return true;\n }\n}\n\nexport class MatMulUtil {\n /**\n * Fix the input shapes for MatMul operation if they need fixing\n * @param dimsA The shape of tensor A. Should be an array of positive integers\n * @param dimsB The shape of tensor B. Should be an array of positive integers\n * @returns A tuple containing the preprocessed input shapes as required by ONNX specifications\n */\n static preprocessInputShapes(dimsA: readonly number[], dimsB: readonly number[]):\n [readonly number[], readonly number[]] {\n // If the first argument is 1-D, it is promoted to a matrix by prepending\n // a 1 to its dimensions. After matrix multiplication the prepended 1 is\n // removed.\n const a = (dimsA.length === 1) ? [1, dimsA[0]] : dimsA;\n\n // If the second argument is 1-D, it is promoted to a matrix by appending\n // a 1 to its dimensions. After matrix multiplication the appended 1 is\n // removed.\n const b = (dimsB.length === 1) ? [dimsB[0], 1] : dimsB;\n\n return [a, b];\n }\n\n /**\n * Fix the output shape computed for MatMul operation if it needs fixing\n * @param outputShape The computed outputShape. Should be an array (atleast of length 2) of positive integers.\n * This will be mutated.\n * @param aRank The rank of tensor A.\n * @param bRank The rank of tensor B.\n */\n static postprocessOutputShape(outputShape: number[], aRank: number, bRank: number) {\n // Remove prepended dimension if first input is 1d\n if (aRank === 1) {\n // outputShape = outputShape.slice(0, outputShape.length - 2).concat(outputShape.slice(outputShape.length - 1));\n outputShape.splice(outputShape.length - 2, 1);\n }\n // Remove appended dimension if second input is 1d\n if (bRank === 1) {\n outputShape.pop();\n }\n }\n\n /**\n * Calculate the expected shape when matrix multiplication\n * @param a The shape of tensor A. Should be a tuple of 2 positive integers\n * @param b The shape of tensor B. Should be a tuple of 2 positive integers\n * @returns The expected shape of the result, or undefined if N/A\n */\n static calcMatMulShape(a: [number, number], b: [number, number]): [number, number]|undefined {\n return (a[1] !== b[0]) ? undefined : [a[0], b[1]];\n }\n}\n\nexport class BroadcastUtil {\n /**\n * Calculate the expected shape when broadcasting 2 tensors\n * @param a The shape of tensor A. Should be an array of positive integers\n * @param b The shape of tensor B. Should be an array of positive integers\n * @param isMatMul Whether the operation is MatMul\n * @returns The expected shape of the result, or undefined if N/A\n */\n static calcShape(adims: readonly number[], bdims: readonly number[], isMatMul = false): readonly number[]|undefined {\n const arank = adims.length;\n const brank = bdims.length;\n if (arank === 0) {\n return bdims;\n }\n if (brank === 0) {\n return adims;\n }\n const crank = Math.max(adims.length, bdims.length);\n const cdims = new Array(crank);\n\n // calculate the last 2 dimension if it is MatMul\n if (isMatMul) {\n if (arank < 2 || brank < 2) {\n return undefined;\n }\n const cShapeMatMul =\n MatMulUtil.calcMatMulShape([adims[arank - 2], adims[arank - 1]], [bdims[brank - 2], bdims[brank - 1]]);\n if (cShapeMatMul === undefined) {\n return undefined;\n }\n [cdims[crank - 2], cdims[crank - 1]] = cShapeMatMul;\n }\n\n for (let i = isMatMul ? 3 : 1; i <= crank; i++) {\n const aLen = arank - i < 0 ? 1 : adims[arank - i];\n const bLen = brank - i < 0 ? 1 : bdims[brank - i];\n\n if (aLen !== bLen && aLen > 1 && bLen > 1) {\n return undefined;\n }\n cdims[crank - i] = Math.max(aLen, bLen);\n }\n\n return cdims;\n }\n\n /**\n * Given the indices of a broadcasted tensor, calculate the original indices\n * @param broadcastedIndices The given indices of the broadcasted tensor.\n * @param originalShape The original shape of the tensor before broadcas\n * @returns The calculated indices that maps to the original tensor.\n */\n static index(broadcastedIndices: readonly number[], originalShape: readonly number[]): number[] {\n // NOTE 1: we assume the parameter broadcastedIndices is valid. ie. it should have the same\n // length as the broadcasted shape, and for each dimension the index should\n // not be out of range.\n const originalIndices = new Array(originalShape.length);\n BroadcastUtil.fillIndex(broadcastedIndices, originalShape, originalIndices);\n return originalIndices;\n }\n\n /**\n * Given the indices of a broadcasted tensor, calculate the original indices\n * @param broadcastedIndices The given indices of the broadcasted tensor.\n * @param originalShape The original shape of the tensor before broadcast\n * @param originalIndices The mapping of broadcastedIndices to the originalIndices (output parameter - will be\n * mutated).\n */\n static fillIndex(broadcastedIndices: readonly number[], originalShape: readonly number[], originalIndices: number[]) {\n // NOTE 1: we assume the parameter broadcastedIndices is valid. ie. it should have the same length as the\n // broadcasted shape, and for each dimension the index should not be out of range.\n // NOTE 2: we assume the parameter originalIndices has the same length as the originalShape\n const dimOffset = broadcastedIndices.length - originalShape.length;\n for (let i = 0; i < originalShape.length; i++) {\n originalIndices[i] = broadcastedIndices[dimOffset + i] % originalShape[i];\n }\n }\n\n /**\n * Perform the broadcasting operation on the specific operator\n * @param a The input tensor A\n * @param b The input tensor B\n * @param op The operator lambda function\n * @param inplace Whether to write the result back to A.\n * @returns The result tensor, or undefined if input not broadcastable.\n */\n static calc(\n a: Tensor, b: Tensor, op: (a: string|number, b: string|number) => (string | number), inplace: boolean,\n resultType?: Tensor.DataType): Tensor|undefined {\n const outputShape = BroadcastUtil.calcShape(a.dims, b.dims);\n\n if (outputShape) {\n if (inplace && !ShapeUtil.areEqual(outputShape, a.dims)) {\n // B is not broadcastable to A, failed to calculate inplace.\n return undefined;\n }\n\n const size = ShapeUtil.size(outputShape);\n const c = inplace ? a : new Tensor(outputShape, resultType || a.type);\n\n // both inputs are scalars\n if (outputShape.length === 0) {\n c.set([], op(a.get([]) as number, b.get([]) as number));\n }\n\n // atleast one input is a non-scalar\n else {\n const outputIndices = new Array(outputShape.length);\n const originalIndicesA = new Array(a.dims.length);\n const originalIndicesB = new Array(b.dims.length);\n let valA: string|number = 0;\n let valB: string|number = 0;\n let isAScalar = false;\n let isBScalar = false;\n if (a.dims.length === 0) {\n valA = a.get([]) as number;\n isAScalar = true;\n }\n if (b.dims.length === 0) {\n valB = b.get([]) as number;\n isBScalar = true;\n }\n let rest: number;\n for (let i = 0; i < size; i++) {\n // traversal indices\n rest = i;\n for (let j = outputShape.length - 1; j >= 0; j--) {\n outputIndices[j] = rest % outputShape[j];\n rest = Math.floor(rest / outputShape[j]);\n }\n\n if (!isAScalar) {\n // map outputIndices (which is actually broadcasted) to the originalIndices\n BroadcastUtil.fillIndex(outputIndices, a.dims, originalIndicesA);\n valA = a.get(originalIndicesA) as number;\n }\n if (!isBScalar) {\n BroadcastUtil.fillIndex(outputIndices, b.dims, originalIndicesB);\n valB = b.get(originalIndicesB) as number;\n }\n\n c.set(outputIndices, op(valA, valB));\n }\n }\n\n return c;\n }\n\n return undefined;\n }\n\n /**\n * Determine if a shape is unidirectional broadcastable to another shape\n * @param shape The input shape\n * @param finalShape The desired shape after broadcasting\n */\n static isValidBroadcast(shape: readonly number[], finalShape: readonly number[]): boolean {\n // align shape to the right\n const inputRank = shape.length;\n const finalRank = finalShape.length;\n if (inputRank > finalRank) {\n return false;\n }\n for (let i = 1; i <= inputRank; i++) {\n if (shape[inputRank - i] !== 1 && shape[inputRank - i] !== finalShape[finalRank - i]) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Determine the broadcasted dims in input shape based on the given output shape.\n * Note that this function only returns the broadcasted dims.\n * @param inputShape The input shape\n * @param outputShape The output shape\n * @returns The broadcasted dims in input shape.\n */\n static getBroadcastDims(inputShape: readonly number[], outputShape: readonly number[]): number[] {\n const inRank = inputShape.length;\n const dims: number[] = [];\n for (let i = 0; i < inRank; i++) {\n const dim = inRank - 1 - i;\n const a = inputShape[dim] || 1;\n const b = outputShape[outputShape.length - 1 - i] || 1;\n if (b > 1 && a === 1) {\n dims.unshift(dim);\n }\n }\n return dims;\n }\n}\n\n// copy array helper\n// mimics memcpy as much as possible\nexport function arrayCopyHelper(\n target: number[]|Tensor.NumberType, source: number[]|Tensor.NumberType, targetIndex: number, sourceIndex: number,\n blockSize: number) {\n if (sourceIndex < 0 || sourceIndex >= source.length) {\n throw new Error('sourceIndex out of bounds');\n }\n if (targetIndex < 0 || targetIndex >= target.length) {\n throw new Error('targetIndex out of bounds');\n }\n if (sourceIndex + blockSize > source.length) {\n throw new Error('source indices to be copied are outside bounds');\n }\n if (targetIndex + blockSize > target.length) {\n throw new Error('target array is too small to hold result');\n }\n\n for (let offset = 0; offset < blockSize; offset++) {\n target[targetIndex + offset] = source[sourceIndex + offset];\n }\n}\n\nexport class GemmUtil {\n // will make sure input shapes are compatible for this op\n // and return back the shape of the output in the form of a tuple\n // will throw exception if the input shapes are not compatible\n static getShapeOfGemmResult(\n leftShape: readonly number[], transLeft: boolean, rightShape: readonly number[], transRight: boolean,\n biasShape?: readonly number[]): readonly number[] {\n if (leftShape.length !== 2 || rightShape.length !== 2) {\n throw new Error('shape need to be of size 2');\n }\n\n let M: number;\n let K: number;\n let N: number;\n\n if (transLeft) {\n M = leftShape[1];\n K = leftShape[0];\n } else {\n M = leftShape[0];\n K = leftShape[1];\n }\n\n let kDim = -1;\n\n if (transRight) {\n N = rightShape[0];\n kDim = 1;\n } else {\n N = rightShape[1];\n kDim = 0;\n }\n\n if (rightShape[kDim] !== K) {\n throw new Error('dimension mismatch');\n }\n\n if (M <= 0 || N <= 0 || K <= 0) {\n throw new Error('invalid shape specified');\n }\n\n if (biasShape && !BroadcastUtil.isValidBroadcast(biasShape, [M, N])) {\n throw new Error('gemm: invalid bias shape for broadcast');\n }\n\n return [M, N, K];\n }\n}\n\nexport class ProtoUtil {\n static tensorDataTypeFromProto(typeProto: onnx.TensorProto.DataType|\n onnxruntime.experimental.fbs.TensorDataType): Tensor.DataType {\n switch (typeProto) {\n case onnx.TensorProto.DataType.INT8:\n return 'int8';\n case onnx.TensorProto.DataType.UINT8:\n return 'uint8';\n case onnx.TensorProto.DataType.BOOL:\n return 'bool';\n case onnx.TensorProto.DataType.INT16:\n return 'int16';\n case onnx.TensorProto.DataType.UINT16:\n return 'uint16';\n case onnx.TensorProto.DataType.INT32:\n return 'int32';\n case onnx.TensorProto.DataType.UINT32:\n return 'uint32';\n case onnx.TensorProto.DataType.FLOAT:\n return 'float32';\n case onnx.TensorProto.DataType.DOUBLE:\n return 'float64';\n case onnx.TensorProto.DataType.STRING:\n return 'string';\n\n // For INT64/UINT64, reduce their value to 32-bits.\n // Should throw exception when overflow\n case onnx.TensorProto.DataType.INT64:\n return 'int32';\n case onnx.TensorProto.DataType.UINT64:\n return 'uint32';\n\n default:\n throw new Error(`unsupported data type: ${onnx.TensorProto.DataType[typeProto]}`);\n }\n }\n\n static tensorDataTypeStringToEnum(type: string): onnx.TensorProto.DataType {\n switch (type) {\n case 'int8':\n return onnx.TensorProto.DataType.INT8;\n case 'uint8':\n return onnx.TensorProto.DataType.UINT8;\n case 'bool':\n return onnx.TensorProto.DataType.BOOL;\n case 'int16':\n return onnx.TensorProto.DataType.INT16;\n case 'uint16':\n return onnx.TensorProto.DataType.UINT16;\n case 'int32':\n return onnx.TensorProto.DataType.INT32;\n case 'uint32':\n return onnx.TensorProto.DataType.UINT32;\n case 'float32':\n return onnx.TensorProto.DataType.FLOAT;\n case 'float64':\n return onnx.TensorProto.DataType.DOUBLE;\n case 'string':\n return onnx.TensorProto.DataType.STRING;\n case 'int64':\n return onnx.TensorProto.DataType.INT64;\n case 'uint64':\n return onnx.TensorProto.DataType.UINT64;\n\n default:\n throw new Error(`unsupported data type: ${type}`);\n }\n }\n\n static tensorDimsFromProto(dims: Array): number[] {\n // get rid of Long type for dims\n return dims.map(d => Long.isLong(d) ? d.toNumber() : d);\n }\n\n static tensorValueTypeFromProto(valueType: onnx.TypeProto.ITensor): Graph.ValueType {\n return {\n tensorType: ProtoUtil.tensorDataTypeFromProto(valueType.elemType!),\n shape: {dims: ProtoUtil.tensorDimsFromProto(valueType.shape!.dim!.map(d => d.dimValue!))}\n };\n }\n\n static tensorDimsFromORTFormat(tensor: onnxruntime.experimental.fbs.Tensor) {\n const dims = [];\n for (let i = 0; i < tensor.dimsLength(); i++) {\n dims.push(LongUtil.longToNumber(tensor.dims(i)!));\n }\n return dims;\n }\n\n static tensorAttributesFromORTFormat(node: onnxruntime.experimental.fbs.Node) {\n const attributes = [];\n for (let i = 0; i < node.attributesLength(); i++) {\n attributes.push(node.attributes(i)!);\n }\n return attributes;\n }\n}\n\nexport class LongUtil {\n // This function is called to get a number from long type of data for attribute, dim, and ir version,\n // which values are signed integers.\n // To make it more generic, add an optional parameter to convert to a unsigned number.\n static longToNumber(n: Long|flatbuffers.Long|number, unsigned?: boolean) {\n if (Long.isLong(n)) {\n return n.toNumber();\n } else if (n instanceof flatbuffers.Long) {\n return Long.fromValue({low: n.low, high: n.high, unsigned: unsigned ?? false}).toNumber();\n }\n return n;\n }\n static isLong(n: unknown) {\n return Long.isLong(n) || n instanceof flatbuffers.Long;\n }\n}\n\nexport class ShapeUtil {\n static size(dims: readonly number[]): number {\n return ShapeUtil.getSizeFromDimensionRange(dims, 0, dims.length);\n }\n\n // `axis` inclusive\n static sizeFromDimension(dims: readonly number[], axis: number): number {\n if (axis < 0 || axis > dims.length) {\n throw new Error(`invalid dimension of ${axis} for sizeFromDimension as Tensor has ${dims.length} dimensions.`);\n }\n return ShapeUtil.getSizeFromDimensionRange(dims, axis, dims.length);\n }\n\n // `axis` exclusive\n static sizeToDimension(dims: readonly number[], axis: number): number {\n if (axis < 0 || axis > dims.length) {\n throw new Error(`invalid dimension of ${axis} for sizeToDimension as Tensor has ${dims.length} dimensions.`);\n }\n return ShapeUtil.getSizeFromDimensionRange(dims, 0, axis);\n }\n\n static getSizeFromDimensionRange(dims: readonly number[], start: number, end: number): number {\n let size = 1;\n for (let i = start; i < end; i++) {\n // safety check as this method is called by multiple other methods requiring size.\n // size cannot be 0 or negative.\n if (dims[i] <= 0) {\n throw new Error(\n // eslint-disable-next-line max-len\n 'cannot get valid size from specified dimension range. Most likely the range contains 0 or negative values in them.');\n }\n size *= dims[i];\n }\n return size;\n }\n\n static computeStrides(dims: readonly number[]): readonly number[] {\n const rank = dims.length;\n if (rank === 0) {\n return [];\n } else if (rank === 1) {\n return [1];\n }\n const strides = new Array(rank);\n strides[rank - 1] = 1;\n strides[rank - 2] = dims[rank - 1];\n for (let i = rank - 3; i >= 0; --i) {\n strides[i] = strides[i + 1] * dims[i + 1];\n }\n return strides;\n }\n\n static transpose(dims: readonly number[]): readonly number[] {\n const copy = dims.slice();\n return copy.reverse();\n }\n\n static indicesToOffset(indices: readonly number[], strides: readonly number[], axis?: number): number {\n if (axis === undefined) {\n axis = indices.length;\n }\n let offset = 0;\n for (let i = 0; i < axis; ++i) {\n offset += strides[i] * indices[i];\n }\n return offset;\n }\n\n static offsetToIndices(offset: number, strides: readonly number[]): readonly number[] {\n const rank = strides.length;\n if (rank === 0) {\n return [];\n } else if (rank === 1) {\n return [offset * strides[0]];\n }\n const indices: number[] = new Array(strides.length);\n for (let i = 0; i < indices.length - 1; ++i) {\n indices[i] = Math.floor(offset / strides[i]);\n offset -= indices[i] * strides[i];\n }\n indices[indices.length - 1] = offset;\n return indices;\n }\n\n /**\n * normailze axis of range [-r, r) into [0, r).\n */\n static normalizeAxis(axis: number, tensorRank: number): number {\n if (axis < -tensorRank && axis >= tensorRank) {\n throw new Error('unsupported axis for this operation.');\n }\n return axis < 0 ? axis + tensorRank : axis;\n }\n\n static normalizeAxes(axes: readonly number[], tensorRank: number): number[] {\n return axes.map(x => this.normalizeAxis(x, tensorRank));\n }\n\n // Increment an index into a tensor (in lexicographic\n // ordering), wrapping around the specified upper_bound.\n /**\n * Increment an index into a tensor (in lexicographic ordering), wrapping around the specified upper_bound.\n * @param index Given index to increment (Will be mutated)\n * @param dims The dimensions of the tensor for which the given index corresponds to\n * @param axisToIncrementOn The 1-indexed axis to increment on. If undefined, axisToIncrementOn == rank\n */\n static incrementIndex(index: number[], dims: readonly number[], axisToIncrementOn?: number) {\n if (dims.length === 0 || index.length === 0) {\n throw new Error('Index incrementing unsupported for scalar Tensor');\n }\n if (axisToIncrementOn === undefined) {\n axisToIncrementOn = dims.length;\n } else {\n if (axisToIncrementOn <= 0 || axisToIncrementOn > dims.length) {\n throw new Error('Incorrect axis to increment on');\n }\n }\n\n for (let k = axisToIncrementOn - 1; k >= 0; --k) {\n index[k]++;\n if (index[k] < dims[k]) {\n break;\n }\n index[k] = 0;\n }\n }\n\n /**\n * Produces a new dimensions array based on the values in the 'originalDimensions' and 'shape' array\n * Used in Reshape\n * @param originalDims Original Shape array\n * @param shapeHints array containing values to compute the new dimensions\n * For example:\n * originalDims = [2,2] and shapeHints = [0,-1] will return [2,2]\n * originalDims = [2,2] and shapeHints = [4] will return [4]\n * originalDims = [2,2] and shapeHints = [5] will throw an exception\n * https://github.com/onnx/onnx/blob/main/docs/Operators.md#Reshape\n */\n\n static calculateReshapedDims(originalDims: readonly number[], shapeHints: ArrayLike): number[] {\n // reshape to a Scalar Tensor\n if (shapeHints.length === 0) {\n if (originalDims.length === 0 || ShapeUtil.size(originalDims) === 1) {\n return [];\n } else {\n throw new Error('cannot reshape to a scalar Tensor');\n }\n }\n\n const nDims = shapeHints.length;\n const reshapedDims = new Array(nDims);\n let unknownDimension = -1;\n let newTensorSize = 1;\n for (let i = 0; i < nDims; i++) {\n if (shapeHints[i] < -1) {\n throw new Error('a dimension in shape hints cannot be less than -1');\n }\n if (shapeHints[i] === -1) {\n if (unknownDimension !== -1) {\n throw new Error('at most one dimension in shape hints can be -1');\n }\n unknownDimension = i;\n } else {\n if (shapeHints[i] === 0) {\n if (i >= originalDims.length) {\n throw new Error('the dimension with value zero exceeds the dimension size of the input tensor');\n }\n reshapedDims[i] = originalDims[i];\n } else {\n reshapedDims[i] = shapeHints[i];\n }\n newTensorSize *= reshapedDims[i];\n }\n }\n\n const oldTensorSize = ShapeUtil.size(originalDims);\n if (unknownDimension !== -1) {\n if (oldTensorSize % newTensorSize !== 0) {\n throw new Error(`the input tensor cannot be reshaped to the requested shape. Input shape: [${\n originalDims}] Output shape: [${shapeHints}]`);\n }\n reshapedDims[unknownDimension] = oldTensorSize / newTensorSize;\n }\n // validate sizes from originalDims and reshapedDims match\n else {\n if (newTensorSize !== oldTensorSize) {\n throw new Error('reshapedDims and originalDims don\\'t have matching sizes');\n }\n }\n return reshapedDims;\n }\n\n /**\n * Sorts a given array based on the indices in the Perm array\n * Used in Transpose\n * @param a Array to be sorted such as dims or strides\n * @param perm Perm given; if null a will be reversed\n */\n static sortBasedOnPerm(a: readonly number[], perm?: readonly number[]): readonly number[] {\n if (perm) {\n return perm.map((v) => a[v]);\n } else {\n return a.slice().reverse();\n }\n }\n\n /**\n * Pads a given shape according to the padding values\n * @param dims shape of the Tensor to be padded\n * @param pad pad values\n */\n static padShape(dims: readonly number[], pad: readonly number[]): readonly number[] {\n const rank = dims.length;\n return dims.map((v, i) => v + pad[i] + pad[i + rank]);\n }\n\n /**\n * Determines if the two shapes are identical\n * @param shape1\n * @param shape2\n */\n static areEqual(shape1: readonly number[], shape2: readonly number[]): boolean {\n if (shape1.length !== shape2.length) {\n return false;\n }\n return shape1.every((v, i) => v === shape2[i]);\n }\n\n /**\n * Validates if the given `dims` or `shape` is valid in ONNX.js context and returns data size\n * @param dims - input `dims` that needs to be checked\n */\n static validateDimsAndCalcSize(dims: readonly number[]): number {\n if (dims.length > 6) {\n throw new TypeError('Only rank 0 to 6 is supported for tensor shape.');\n }\n let size = 1;\n for (const n of dims) {\n if (!Number.isInteger(n)) {\n throw new TypeError(`Invalid shape: ${n} is not an integer`);\n }\n if (n < 0 || n > 2147483647) {\n throw new TypeError(`Invalid shape: length ${n} is not allowed`);\n }\n size *= n;\n }\n return size;\n }\n\n /**\n * Determines the shape of output tensor y = flatten(x, axis)\n * @param dims - shape of input tensor\n * @param axis - flatten axis, in the range [-r, r]\n */\n static flattenShape(dims: readonly number[], axis: number): readonly number[] {\n if (axis < 0) {\n axis += dims.length;\n }\n const total = dims.reduce((x, y) => x * y, 1);\n const right = dims.slice(axis).reduce((x, y) => x * y, 1);\n const outputDims = [total / right, right];\n\n return outputDims;\n }\n\n /**\n * Determines the shape of output tensor y = squeeze(x, axes)\n * @param dims - shape of input tensor\n * @param axes - squeeze axes\n */\n static squeezeShape(dims: readonly number[], axes: readonly number[]): readonly number[] {\n const outputDims = new Array();\n\n // sanity check\n axes = ShapeUtil.normalizeAxes(axes, dims.length);\n\n for (let i = 0; i < dims.length; i++) {\n const inSqueezeList = axes.indexOf(i) >= 0;\n if (inSqueezeList && dims[i] !== 1) {\n throw new Error('squeeze an axis of size different than 1');\n }\n\n if ((axes.length === 0 && dims[i] > 1) || (axes.length > 0 && !inSqueezeList)) {\n outputDims.push(dims[i]);\n }\n }\n\n return outputDims;\n }\n\n /**\n * Determines the shape of output tensor y = unsqueeze(x, axes)\n * @param dims - shape of input tensor\n * @param axes - unsqueeze axes\n */\n static unsqueezeShape(dims: readonly number[], axes: readonly number[]): readonly number[] {\n const outputDims = new Array(dims.length + axes.length);\n\n // initialize the array elements to 0\n outputDims.fill(0);\n\n // set all axes indices to 1 in outputDims and check for duplicates\n for (let i = 0; i < axes.length; i++) {\n const axis = ShapeUtil.normalizeAxis(axes[i], outputDims.length);\n if (axis >= outputDims.length) {\n throw new Error('\\'axes\\' has an out of range axis');\n }\n if (outputDims[axis] !== 0) {\n throw new Error('\\'axes\\' has a duplicate axis');\n }\n\n outputDims[axis] = 1;\n }\n\n // fill in the zero entries of outputDims with the input tensor's shape\n let inputDimsIterator = 0;\n for (let i = 0; i < outputDims.length; i++) {\n if (outputDims[i] === 0) {\n outputDims[i] = dims[inputDimsIterator++];\n }\n }\n\n // sanity check assertion. 'inputDimsIterator'\n // should be equal to the length of 'dims'\n if (inputDimsIterator !== dims.length) {\n throw new Error('the unsqueezed dimension could not be established');\n }\n\n return outputDims;\n }\n}\n\n// bunch of helper methods that do a variety of math operations\nexport class MathUtil {\n // y = (x*x) + y\n static sqr(\n target: number[]|Tensor.NumberType, source: number[]|Tensor.NumberType, targetIndex: number, sourceIndex: number,\n blockSize: number) {\n if (sourceIndex < 0 || sourceIndex >= source.length) {\n throw new Error('sourceIndex out of bounds');\n }\n if (targetIndex < 0 || targetIndex >= target.length) {\n throw new Error('targetIndex out of bounds');\n }\n if (sourceIndex + blockSize > source.length) {\n throw new Error('source indices to be copied are outside bounds');\n }\n if (targetIndex + blockSize > target.length) {\n throw new Error('target array is too small to hold result');\n }\n\n for (let offset = 0; offset < blockSize; offset++) {\n target[targetIndex + offset] += Math.pow(source[sourceIndex + offset], 2);\n }\n }\n\n // y = ax + y\n static axpy(\n target: number[]|Tensor.NumberType, source: number[]|Tensor.NumberType, targetIndex: number, sourceIndex: number,\n blockSize: number, alpha: number) {\n if (sourceIndex < 0 || sourceIndex >= source.length) {\n throw new Error('sourceIndex out of bounds');\n }\n if (targetIndex < 0 || targetIndex >= target.length) {\n throw new Error('targetIndex out of bounds');\n }\n if (sourceIndex + blockSize > source.length) {\n throw new Error('source indices to be copied are outside bounds');\n }\n if (targetIndex + blockSize > target.length) {\n throw new Error('target array is too small to hold result');\n }\n\n for (let offset = 0; offset < blockSize; offset++) {\n target[targetIndex + offset] += (alpha * source[sourceIndex + offset]);\n }\n }\n\n // y = pow(x, b)\n static powx(\n target: number[]|Tensor.NumberType, source: number[]|Tensor.NumberType, targetIndex: number, sourceIndex: number,\n blockSize: number, b: number) {\n if (sourceIndex < 0 || sourceIndex >= source.length) {\n throw new Error('sourceIndex out of bounds');\n }\n if (targetIndex < 0 || targetIndex >= target.length) {\n throw new Error('targetIndex out of bounds');\n }\n if (sourceIndex + blockSize > source.length) {\n throw new Error('source indices to be copied are outside bounds');\n }\n if (targetIndex + blockSize > target.length) {\n throw new Error('target array is too small to hold result');\n }\n\n for (let offset = 0; offset < blockSize; offset++) {\n target[targetIndex + offset] = Math.pow(source[sourceIndex + offset], b);\n }\n }\n\n // y = x * y\n static mul(\n target: number[]|Tensor.NumberType, source: number[]|Tensor.NumberType, targetIndex: number, sourceIndex: number,\n blockSize: number) {\n if (sourceIndex < 0 || sourceIndex >= source.length) {\n throw new Error('sourceIndex out of bounds');\n }\n if (targetIndex < 0 || targetIndex >= target.length) {\n throw new Error('targetIndex out of bounds');\n }\n if (sourceIndex + blockSize > source.length) {\n throw new Error('source indices to be copied are outside bounds');\n }\n if (targetIndex + blockSize > target.length) {\n throw new Error('target array is too small to hold result');\n }\n\n for (let offset = 0; offset < blockSize; offset++) {\n target[targetIndex + offset] = (source[sourceIndex + offset] * target[targetIndex + offset]);\n }\n }\n}\n\nexport class SplitUtil {\n /**\n * Calculates new Shapes from existing one and the splits given along the axis provides\n * @param dims Shape of the Tensor to be splitted into two or more Shapes\n * @param axis The dimension along which the Tensor will be split\n * @param splits Offsets for the start of each split\n */\n static splitShape(dims: readonly number[], axis: number, split: number[], numOutputs?: number):\n [number[][], number[]] {\n if (split.length === 0) {\n if (!numOutputs) {\n throw new Error('need to know number of outputs when the \\'split\\' attribute is not specified');\n }\n SplitUtil.determineSplit(dims[axis], numOutputs, split);\n }\n\n const shapes: number[][] = [];\n const offsets = [0];\n for (let i = 0; i < split.length; ++i) {\n if (i !== 0) {\n offsets.push(offsets[i - 1] + split[i - 1]);\n }\n const shape = dims.slice();\n shape[axis] = split[i];\n shapes.push(shape);\n }\n return [shapes, offsets];\n }\n\n static determineSplit(numElementsAlongAxis: number, numOutputs: number, split: number[]) {\n // If 'split' is not specified by the user, we need to partition the number of elements equally among the outputs\n if (numElementsAlongAxis % numOutputs !== 0) {\n throw new Error('cannot split tensor to equal sized parts');\n }\n for (let i = 0; i < numOutputs; ++i) {\n split.push(numElementsAlongAxis / numOutputs);\n }\n }\n}\n\nexport class ReduceUtil {\n /**\n * Perform reduce operations on the specific operator\n * @param a Input tensor data\n * @param axes The dimensions along which the Tensor will be reduced\n * @param keepdims If set to true, the axes which are reduced are left in the\n * result as dimensions with size one.\n * @param op1 The operation to be performed on each element in the tensor\n * @param op2 The operation to be performed between elements in the tensor\n */\n static calcReduce(\n a: Tensor, axes: number[], keepdims: boolean, op1: (b: number) => number,\n op2: (a: number, b: number) => number): Tensor {\n const dims = a.dims.slice(0);\n // if axes is not set, perform reduce on all axes\n if (axes.length === 0) {\n dims.forEach((_d, ind) => axes.push(ind));\n }\n // get a temporary broadcastable output shape\n const outputDims = ReduceUtil.calcReduceShape(dims, axes, true);\n\n // loop through the output and calculate result one by one\n const size = ShapeUtil.size(outputDims);\n const y = new Tensor(outputDims, a.type);\n const strides = ShapeUtil.computeStrides(outputDims);\n const inputStrides = ShapeUtil.computeStrides(dims);\n const indicesY = new Array(dims.length);\n for (let i = 0; i < size; i++) {\n const indices = ShapeUtil.offsetToIndices(i, strides);\n // map index\n BroadcastUtil.fillIndex(indices, dims, indicesY);\n y.set(\n indices,\n ReduceUtil.calcReduceByAxis(\n a.numberData, axes, dims, 0, ShapeUtil.indicesToOffset(indicesY, inputStrides), op1, op2));\n }\n\n if (keepdims) {\n return y;\n } else {\n // keepdims == 0, calculate the expected shape\n return new Tensor(\n ReduceUtil.calcReduceShape(dims, axes, keepdims), y.type, undefined, undefined, y.data, y.dataId);\n }\n }\n\n /**\n * Perform reduce operations on the specific operator on specific axes\n * @param a Input tensor data\n * @param axes The dimensions along which the Tensor will be reduced\n * @param dims The input dimension.\n * @param curAxisInd Index in axes specifying the current dimension along\n * which the tensor will be reduced\n * @param pos The current index of element to perform operation\n * @param op1 The operation to be performed on each element in the tensor\n * @param op2 The operation to be performed between elements in the tensor\n */\n static calcReduceByAxis(\n input: Tensor.NumberType, axes: number[], dims: number[], curAxisInd: number, pos: number,\n op1: (b: number) => number, op2: (a: number, b: number) => number): number {\n let res = 0;\n if (curAxisInd >= axes.length) {\n return op1(input[pos]);\n }\n const axis = axes[curAxisInd];\n const step = axis >= dims.length ? 1 : ShapeUtil.size(dims.slice(axis + 1));\n for (let i = 0; i < dims[axis]; i++) {\n res = i === 0 ? ReduceUtil.calcReduceByAxis(input, axes, dims, curAxisInd + 1, pos, op1, op2) :\n op2(res, ReduceUtil.calcReduceByAxis(input, axes, dims, curAxisInd + 1, pos, op1, op2));\n pos += step;\n }\n return res;\n }\n\n /**\n * Calculate the expected shape of a reduce operation\n * @param dims The input tensor dimension\n * @param axes The dimensions along which the Tensor will be reduced\n * @param keepdims If set to true, the axes which are reduced are left in the\n * result as dimensions with size one.\n */\n static calcReduceShape(dims: readonly number[], axes: readonly number[], keepDims: boolean): number[] {\n const outputDims = dims.slice();\n for (let i = 0; i < axes.length; i++) {\n if (keepDims) {\n outputDims[axes[i]] = 1;\n } else {\n outputDims[axes[i]] = 0;\n }\n }\n return outputDims.filter(dim => dim !== 0);\n }\n}\n\nexport class PoolConvUtil {\n /**\n * Adjust the kernel, strides, pads to correct rank. Set to default value if not present\n * @param isGlobalOperator If true, perform global pooling.\n * @param inputDims The input tensor dimension.\n * @param kernelShape The size of the kernel along each axis.\n * @param strides Stride along each axis.\n * @param dilations Dilation along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n */\n static adjustPoolAttributes(\n isGlobalOperator: boolean, inputDims: readonly number[], kernelShape: number[], strides: number[],\n dilations: number[], pads: number[]) {\n if (!isGlobalOperator && kernelShape.length !== inputDims.length - 2) {\n throw new Error('length of specified kernel shapes should be 2 less than length of input dimensions');\n }\n\n if (isGlobalOperator) {\n // adjust kernel shape to cover the input dims\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n if (dim >= kernelShape.length) {\n kernelShape.push(inputDims[dim + 2]);\n } else {\n kernelShape[dim] = inputDims[dim + 2];\n }\n }\n }\n\n // adjust strides length to match kernel shape length\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (dim < strides.length) {\n if (strides[dim] < 0) {\n throw new Error('strides should be greater than or equal to 1');\n }\n } else {\n strides.push(1);\n }\n }\n\n // adjust dilation value\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (dim < dilations.length) {\n if (dilations[dim] < 0) {\n throw new Error('dilations should be greater than or equal to 1');\n }\n } else {\n dilations.push(1);\n }\n }\n\n // adjust pads length to match 2 * kernel shape length\n for (let dim = 0; dim < kernelShape.length * 2; dim++) {\n if (dim < pads.length) {\n if (pads[dim] < 0) {\n throw new Error('pad should be greater than or equal to 1');\n }\n } else {\n pads.push(0);\n }\n }\n\n // sanity checks for values in kernel shapes and pads\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (kernelShape[dim] <= 0) {\n throw new Error('kernel shapes need to be greater than 0');\n }\n\n if (pads[dim] >= kernelShape[dim] || pads[dim + kernelShape.length] >= kernelShape[dim]) {\n throw new Error('pads should be smaller than kernel');\n }\n }\n }\n\n // adjust pad values based on 'autoPad' attribute\n static adjustPadsBasedOnAutoPad(\n inputDims: readonly number[], strides: readonly number[], dilations: readonly number[],\n kernelShape: readonly number[], pads: number[], autoPad?: string) {\n if (!autoPad) {\n return;\n }\n\n if (pads.length !== 2 * (inputDims.length - 2)) {\n throw new Error('length of pads should be twice the length of data dimensions');\n }\n\n if (strides.length !== (inputDims.length - 2)) {\n throw new Error('length of strides should be the length of data dimensions');\n }\n\n if (kernelShape.length !== (inputDims.length - 2)) {\n throw new Error('length of kernel shapes should be the length of data dimensions');\n }\n\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n PoolConvUtil.adjustPadAndReturnShape(\n inputDims[dim + 2], strides[dim], dilations[dim], kernelShape[dim], pads, dim, dim + inputDims.length - 2,\n autoPad);\n }\n }\n\n /**\n * Calculate the output shape for Pool ops based on input attributes. (Should be used only for Pool ops)\n * @param isGlobalOperator If true, perform global pooling.\n * @param inputDims The input tensor dimension. (inputs[0].dims)\n * @param strides Stride along each axis.\n * @param dilations Dilation along each axis.\n * @param kernelShape The size of the kernel along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n * @param autoPad DEPRECATED attribute supported for legacy models. Specifies how to implicitly calculate pads in each\n * dimension. Can take values NOTSET, SAME_UPPER, SAME_LOWER, or VALID.\n */\n static computePoolOutputShape(\n isGlobalOperator: boolean, inputDims: readonly number[], strides: number[], dilations: number[],\n kernelShape: number[], pads: number[], autoPad?: string): number[] {\n if (inputDims.length <= 0) {\n throw new Error('input shape must be of size greater than 0');\n }\n\n // Add batch size and number of channels of output\n const outputDims = [inputDims[0], inputDims[1]];\n\n PoolConvUtil.computeShapeHelper(\n isGlobalOperator, inputDims, outputDims, strides, dilations, kernelShape, pads, autoPad);\n return outputDims;\n }\n\n /**\n * Calculate the output shape for Conv op based on input attributes. (Should be used only for Conv op)\n * @param inputDims The input tensor dimension. (inputs[0].dims)\n * @param filterDims The filter tensor dimension. (inputs[1].dims)\n * @param strides Stride along each axis.\n * @param kernelShape The size of the kernel along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n * @param autoPad DEPRECATED attribute supported for legacy models. Specifies how to implicitly calculate pads in each\n * dimension. Can take values NOTSET, SAME_UPPER, SAME_LOWER, or VALID.\n */\n static computeConvOutputShape(\n inputDims: readonly number[], filterDims: readonly number[], strides: number[], dilations: number[],\n kernelShape: number[], pads: number[], autoPad?: string): number[] {\n if (inputDims.length <= 0 || filterDims.length <= 0) {\n throw new Error('invalid input tensor dims or invalid filter tensor dims');\n }\n\n // Add batch size and number of channels of output\n const outputDims = [inputDims[0], filterDims[0]];\n\n PoolConvUtil.computeShapeHelper(false, inputDims, outputDims, strides, dilations, kernelShape, pads, autoPad);\n return outputDims;\n }\n\n // will compute output shapes for data dimensions ONLY (i.e.) no batch size and channels\n // called by computePoolOutputShape() and computeConvOutputShape()\n // adjust pads based on 'autoPad' attribute prior to shape computation\n private static computeShapeHelper(\n isGlobalOperator: boolean, inputDims: readonly number[], outputDims: number[], strides: readonly number[],\n dilations: readonly number[], kernelShape: readonly number[], pads: number[], autoPad?: string) {\n if (isGlobalOperator) {\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n outputDims.push(1);\n }\n } else {\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n outputDims.push(PoolConvUtil.adjustPadAndReturnShape(\n inputDims[dim + 2], strides[dim], dilations[dim], kernelShape[dim], pads, dim, dim + inputDims.length - 2,\n autoPad));\n }\n }\n }\n\n // helper for computeShapeHelper() and adjustPadsBasedOnAutoPad()\n // adjusts pad value for given 'autoPad' string and computes output shape along a particular dimension\n private static adjustPadAndReturnShape(\n inSize: number, stride: number, dilation: number, kernel: number, pads: number[], padHeadIndex: number,\n padTailIndex: number, autoPad?: string): number {\n const dkernel = dilation * (kernel - 1) + 1;\n if (autoPad && autoPad !== 'NOTSET') {\n switch (autoPad) {\n case 'VALID':\n pads[padHeadIndex] = 0;\n pads[padTailIndex] = 0;\n return Math.floor(((inSize - dkernel) / stride) + 1);\n case 'SAME_LOWER':\n case 'SAME_UPPER':\n if (dilation !== 1) {\n throw new Error('Dilation not supported for SAME_UPPER or SAME_LOWER');\n } else {\n const legacyTargetSize = (inSize + stride - 1) / stride;\n const padNeeded = (legacyTargetSize - 1) * stride + kernel - inSize;\n pads[padHeadIndex] =\n (autoPad === 'SAME_LOWER') ? Math.floor((padNeeded + 1) / 2) : Math.floor(padNeeded / 2);\n pads[padTailIndex] = padNeeded - pads[padHeadIndex];\n return Math.floor(((inSize + padNeeded - kernel) / stride) + 1);\n }\n default:\n throw new Error('Unsupported AutoPad type');\n }\n } else {\n return Math.floor(((inSize + pads[padHeadIndex] + pads[padTailIndex] - dkernel) / stride) + 1);\n }\n }\n}\n\nexport const MIN_CLIP = -3.4028234663852886e+38;\nexport const MAX_CLIP = 3.4028234663852886e+38;\n\nexport function decodeUtf8String(buffer: Uint8Array): string {\n return new TextDecoder().decode(buffer);\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Guid} from 'guid-typescript';\nimport Long from 'long';\n\nimport {onnxruntime} from './ort-schema/flatbuffers/ort-generated';\nimport {onnx} from './ort-schema/protobuf/onnx';\nimport {decodeUtf8String, ProtoUtil, ShapeUtil} from './util';\n\nimport ortFbs = onnxruntime.experimental.fbs;\n\nexport declare namespace Tensor {\n export interface DataTypeMap {\n bool: Uint8Array;\n float32: Float32Array;\n float64: Float64Array;\n string: string[];\n int8: Int8Array;\n uint8: Uint8Array;\n int16: Int16Array;\n uint16: Uint16Array;\n int32: Int32Array;\n uint32: Uint32Array;\n int64: BigInt64Array;\n }\n\n export type DataType = keyof DataTypeMap;\n\n export type StringType = Tensor.DataTypeMap['string'];\n export type BooleanType = Tensor.DataTypeMap['bool'];\n export type IntegerType = Tensor.DataTypeMap['int8']|Tensor.DataTypeMap['uint8']|Tensor.DataTypeMap['int16']|\n Tensor.DataTypeMap['uint16']|Tensor.DataTypeMap['int32']|Tensor.DataTypeMap['uint32'];\n export type FloatType = Tensor.DataTypeMap['float32']|Tensor.DataTypeMap['float64'];\n export type NumberType = BooleanType|IntegerType|FloatType;\n\n export type Id = Guid;\n}\n\ntype TensorData = Tensor.DataTypeMap[Tensor.DataType];\n\ntype DataProvider = (id: Tensor.Id) => TensorData;\ntype AsyncDataProvider = (id: Tensor.Id) => Promise;\n\nexport class Tensor {\n /**\n * get the underlying tensor data\n */\n get data(): TensorData {\n if (this.cache === undefined) {\n const data = this.dataProvider!(this.dataId);\n if (data.length !== this.size) {\n throw new Error('Length of data provided by the Data Provider is inconsistent with the dims of this Tensor.');\n }\n this.cache = data;\n }\n return this.cache;\n }\n\n /**\n * get the underlying string tensor data. Should only use when type is STRING\n */\n get stringData() {\n if (this.type !== 'string') {\n throw new TypeError('data type is not string');\n }\n\n return this.data as Tensor.StringType;\n }\n\n /**\n * get the underlying integer tensor data. Should only use when type is one of the following: (UINT8, INT8, UINT16,\n * INT16, INT32, UINT32, BOOL)\n */\n get integerData() {\n switch (this.type) {\n case 'uint8':\n case 'int8':\n case 'uint16':\n case 'int16':\n case 'int32':\n case 'uint32':\n case 'bool':\n return this.data as Tensor.IntegerType;\n\n default:\n throw new TypeError('data type is not integer (uint8, int8, uint16, int16, int32, uint32, bool)');\n }\n }\n\n /**\n * get the underlying float tensor data. Should only use when type is one of the following: (FLOAT, DOUBLE)\n */\n get floatData() {\n switch (this.type) {\n case 'float32':\n case 'float64':\n return this.data as Tensor.FloatType;\n\n default:\n throw new TypeError('data type is not float (float32, float64)');\n }\n }\n\n /**\n * get the underlying number tensor data. Should only use when type is one of the following: (UINT8, INT8, UINT16,\n * INT16, INT32, UINT32, BOOL, FLOAT, DOUBLE)\n */\n get numberData() {\n if (this.type !== 'string') {\n return this.data as Tensor.NumberType;\n }\n throw new TypeError('type cannot be non-number (string)');\n }\n\n /**\n * get value of an element at the given indices\n */\n get(indices: readonly number[]): Tensor.DataTypeMap[Tensor.DataType][number] {\n return this.data[ShapeUtil.indicesToOffset(indices, this.strides)];\n }\n\n /**\n * set value of an element at the given indices\n */\n set(indices: readonly number[], value: Tensor.DataTypeMap[Tensor.DataType][number]) {\n this.data[ShapeUtil.indicesToOffset(indices, this.strides)] = value;\n }\n\n /**\n * get the underlying tensor data asynchronously\n */\n async getData(): Promise {\n if (this.cache === undefined) {\n this.cache = await this.asyncDataProvider!(this.dataId);\n }\n return this.cache;\n }\n\n /**\n * get the number of elements in the tensor\n */\n public readonly size: number;\n\n private _strides: readonly number[];\n /**\n * get the strides for each dimension\n */\n get strides(): readonly number[] {\n if (!this._strides) {\n this._strides = ShapeUtil.computeStrides(this.dims);\n }\n return this._strides;\n }\n\n constructor(\n /**\n * get the dimensions of the tensor\n */\n public readonly dims: readonly number[],\n /**\n * get the type of the tensor\n */\n public readonly type: Tensor.DataType, private dataProvider?: DataProvider,\n private asyncDataProvider?: AsyncDataProvider, private cache?: TensorData,\n /**\n * get the data ID that used to map to a tensor data\n */\n public readonly dataId: Guid = Guid.create()) {\n this.size = ShapeUtil.validateDimsAndCalcSize(dims);\n const size = this.size;\n const empty = (dataProvider === undefined && asyncDataProvider === undefined && cache === undefined);\n\n if (cache !== undefined) {\n if (cache.length !== size) {\n throw new RangeError('Input dims doesn\\'t match data length.');\n }\n }\n\n if (type === 'string') {\n if (cache !== undefined && (!Array.isArray(cache) || !cache.every(i => typeof i === 'string'))) {\n throw new TypeError('cache should be a string array');\n }\n\n if (empty) {\n this.cache = new Array(size);\n }\n } else {\n if (cache !== undefined) {\n const constructor = dataviewConstructor(type);\n if (!(cache instanceof constructor)) {\n throw new TypeError(`cache should be type ${constructor.name}`);\n }\n }\n\n if (empty) {\n const buf = new ArrayBuffer(size * sizeof(type));\n this.cache = createView(buf, type);\n }\n }\n }\n\n /**\n * Construct new Tensor from a ONNX Tensor object\n * @param tensorProto the ONNX Tensor\n */\n static fromProto(tensorProto: onnx.ITensorProto): Tensor {\n if (!tensorProto) {\n throw new Error('cannot construct Value from an empty tensor');\n }\n const type = ProtoUtil.tensorDataTypeFromProto(tensorProto.dataType!);\n const dims = ProtoUtil.tensorDimsFromProto(tensorProto.dims!);\n\n const value = new Tensor(dims, type);\n\n if (type === 'string') {\n // When it's STRING type, the value should always be stored in field\n // 'stringData'\n tensorProto.stringData!.forEach((str, i) => {\n value.data[i] = decodeUtf8String(str);\n });\n\n } else if (\n tensorProto.rawData && typeof tensorProto.rawData.byteLength === 'number' &&\n tensorProto.rawData.byteLength > 0) {\n // NOT considering segment for now (IMPORTANT)\n\n // populate value from rawData\n const dataDest = value.data;\n const dataSource =\n new DataView(tensorProto.rawData.buffer, tensorProto.rawData.byteOffset, tensorProto.rawData.byteLength);\n const elementSize = sizeofProto(tensorProto.dataType!);\n const length = tensorProto.rawData.byteLength / elementSize;\n\n if (tensorProto.rawData.byteLength % elementSize !== 0) {\n throw new Error('invalid buffer length');\n }\n if (dataDest.length !== length) {\n throw new Error('buffer length mismatch');\n }\n\n for (let i = 0; i < length; i++) {\n const n = readProto(dataSource, tensorProto.dataType!, i * elementSize);\n dataDest[i] = n;\n }\n } else {\n // populate value from array\n let array: Array;\n switch (tensorProto.dataType) {\n case onnx.TensorProto.DataType.FLOAT:\n array = tensorProto.floatData!;\n break;\n case onnx.TensorProto.DataType.INT32:\n case onnx.TensorProto.DataType.INT16:\n case onnx.TensorProto.DataType.UINT16:\n case onnx.TensorProto.DataType.INT8:\n case onnx.TensorProto.DataType.UINT8:\n case onnx.TensorProto.DataType.BOOL:\n array = tensorProto.int32Data!;\n break;\n case onnx.TensorProto.DataType.INT64:\n array = tensorProto.int64Data!;\n break;\n case onnx.TensorProto.DataType.DOUBLE:\n array = tensorProto.doubleData!;\n break;\n case onnx.TensorProto.DataType.UINT32:\n case onnx.TensorProto.DataType.UINT64:\n array = tensorProto.uint64Data!;\n break;\n default:\n // should never run here\n throw new Error('unspecific error');\n }\n\n if (array === null || array === undefined) {\n throw new Error('failed to populate data from a tensorproto value');\n }\n\n const data = value.data;\n if (data.length !== array.length) {\n throw new Error('array length mismatch');\n }\n\n for (let i = 0; i < array.length; i++) {\n const element = array[i];\n if (Long.isLong(element)) {\n data[i] = longToNumber(element, tensorProto.dataType);\n } else {\n data[i] = element;\n }\n }\n }\n\n return value;\n }\n\n /**\n * Construct new Tensor from raw data\n * @param data the raw data object. Should be a string array for 'string' tensor, and the corresponding typed array\n * for other types of tensor.\n * @param dims the dimensions of the tensor\n * @param type the type of the tensor\n */\n static fromData(data: Tensor.DataTypeMap[Tensor.DataType], dims: readonly number[], type: Tensor.DataType) {\n return new Tensor(dims, type, undefined, undefined, data);\n }\n\n static fromOrtTensor(ortTensor: ortFbs.Tensor) {\n if (!ortTensor) {\n throw new Error('cannot construct Value from an empty tensor');\n }\n const dims = ProtoUtil.tensorDimsFromORTFormat(ortTensor);\n const type = ProtoUtil.tensorDataTypeFromProto(ortTensor.dataType());\n\n const value = new Tensor(dims, type);\n\n if (type === 'string') {\n // When it's STRING type, the value should always be stored in field\n // 'stringData'\n for (let i = 0; i < ortTensor.stringDataLength(); i++) {\n value.data[i] = ortTensor.stringData(i);\n }\n\n } else if (\n ortTensor.rawDataArray() && typeof ortTensor.rawDataLength() === 'number' && ortTensor.rawDataLength() > 0) {\n // NOT considering segment for now (IMPORTANT)\n\n // populate value from rawData\n const dataDest = value.data;\n const dataSource = new DataView(\n ortTensor.rawDataArray()!.buffer, ortTensor.rawDataArray()!.byteOffset, ortTensor.rawDataLength());\n const elementSize = sizeofProto(ortTensor.dataType());\n const length = ortTensor.rawDataLength() / elementSize;\n\n if (ortTensor.rawDataLength() % elementSize !== 0) {\n throw new Error('invalid buffer length');\n }\n if (dataDest.length !== length) {\n throw new Error('buffer length mismatch');\n }\n\n for (let i = 0; i < length; i++) {\n const n = readProto(dataSource, ortTensor.dataType(), i * elementSize);\n dataDest[i] = n;\n }\n }\n return value;\n }\n}\n\nfunction sizeof(type: Tensor.DataType): number {\n switch (type) {\n case 'bool':\n case 'int8':\n case 'uint8':\n return 1;\n case 'int16':\n case 'uint16':\n return 2;\n case 'int32':\n case 'uint32':\n case 'float32':\n return 4;\n case 'float64':\n return 8;\n default:\n throw new Error(`cannot calculate sizeof() on type ${type}`);\n }\n}\n\nfunction sizeofProto(type: onnx.TensorProto.DataType|ortFbs.TensorDataType): number {\n switch (type) {\n case onnx.TensorProto.DataType.UINT8:\n case onnx.TensorProto.DataType.INT8:\n case onnx.TensorProto.DataType.BOOL:\n return 1;\n case onnx.TensorProto.DataType.UINT16:\n case onnx.TensorProto.DataType.INT16:\n return 2;\n case onnx.TensorProto.DataType.FLOAT:\n case onnx.TensorProto.DataType.INT32:\n case onnx.TensorProto.DataType.UINT32:\n return 4;\n case onnx.TensorProto.DataType.INT64:\n case onnx.TensorProto.DataType.DOUBLE:\n case onnx.TensorProto.DataType.UINT64:\n return 8;\n default:\n throw new Error(`cannot calculate sizeof() on type ${onnx.TensorProto.DataType[type]}`);\n }\n}\n\nfunction createView(dataBuffer: ArrayBuffer, type: Tensor.DataType) {\n return new (dataviewConstructor(type))(dataBuffer);\n}\n\nfunction dataviewConstructor(type: Tensor.DataType) {\n switch (type) {\n case 'bool':\n case 'uint8':\n return Uint8Array;\n case 'int8':\n return Int8Array;\n case 'int16':\n return Int16Array;\n case 'uint16':\n return Uint16Array;\n case 'int32':\n return Int32Array;\n case 'uint32':\n return Uint32Array;\n case 'int64':\n return BigInt64Array;\n case 'float32':\n return Float32Array;\n case 'float64':\n return Float64Array;\n default:\n // should never run to here\n throw new Error('unspecified error');\n }\n}\n\n// convert a long number to a 32-bit integer (cast-down)\nfunction longToNumber(i: Long, type: onnx.TensorProto.DataType|ortFbs.TensorDataType): number {\n // INT64, UINT32, UINT64\n if (type === onnx.TensorProto.DataType.INT64 || type === ortFbs.TensorDataType.INT64) {\n if (i.greaterThanOrEqual(2147483648) || i.lessThan(-2147483648)) {\n throw new TypeError('int64 is not supported');\n }\n } else if (\n type === onnx.TensorProto.DataType.UINT32 || type === ortFbs.TensorDataType.UINT32 ||\n type === onnx.TensorProto.DataType.UINT64 || type === ortFbs.TensorDataType.UINT64) {\n if (i.greaterThanOrEqual(4294967296) || i.lessThan(0)) {\n throw new TypeError('uint64 is not supported');\n }\n } else {\n throw new TypeError(`not a LONG type: ${onnx.TensorProto.DataType[type]}`);\n }\n\n return i.toNumber();\n}\n\n// read one value from TensorProto\nfunction readProto(view: DataView, type: onnx.TensorProto.DataType|ortFbs.TensorDataType, byteOffset: number): number {\n switch (type) {\n case onnx.TensorProto.DataType.BOOL:\n case onnx.TensorProto.DataType.UINT8:\n return view.getUint8(byteOffset);\n case onnx.TensorProto.DataType.INT8:\n return view.getInt8(byteOffset);\n case onnx.TensorProto.DataType.UINT16:\n return view.getUint16(byteOffset, true);\n case onnx.TensorProto.DataType.INT16:\n return view.getInt16(byteOffset, true);\n case onnx.TensorProto.DataType.FLOAT:\n return view.getFloat32(byteOffset, true);\n case onnx.TensorProto.DataType.INT32:\n return view.getInt32(byteOffset, true);\n case onnx.TensorProto.DataType.UINT32:\n return view.getUint32(byteOffset, true);\n case onnx.TensorProto.DataType.INT64:\n return longToNumber(\n Long.fromBits(view.getUint32(byteOffset, true), view.getUint32(byteOffset + 4, true), false), type);\n case onnx.TensorProto.DataType.DOUBLE:\n return view.getFloat64(byteOffset, true);\n case onnx.TensorProto.DataType.UINT64:\n return longToNumber(\n Long.fromBits(view.getUint32(byteOffset, true), view.getUint32(byteOffset + 4, true), true), type);\n default:\n throw new Error(`cannot read from DataView for type ${onnx.TensorProto.DataType[type]}`);\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * represent a version irrelevant abstraction of for GLSL source code\n */\nexport interface Glsl {\n readonly version: string;\n readonly attribute: string;\n readonly varyingVertex: string;\n readonly varyingFrag: string;\n readonly texture2D: string;\n readonly output: string;\n readonly outputDeclaration: string;\n}\n\nconst GLSL_ES_2_0: Glsl = {\n version: '',\n attribute: 'attribute',\n varyingVertex: 'varying',\n varyingFrag: 'varying',\n texture2D: 'texture2D',\n output: 'gl_FragColor',\n outputDeclaration: '',\n};\nconst GLSL_ES_3_0: Glsl = {\n version: '#version 300 es',\n attribute: 'in',\n varyingVertex: 'out',\n varyingFrag: 'in',\n texture2D: 'texture',\n output: 'outputColor',\n outputDeclaration: 'out vec4 outputColor;',\n};\n\nexport function getGlsl(version: 1|2) {\n return version === 1 ? GLSL_ES_2_0 : GLSL_ES_3_0;\n}\n\nexport function getVertexShaderSource(version: 1|2): string {\n const glsl = getGlsl(version);\n return `${glsl.version}\n precision highp float;\n ${glsl.attribute} vec3 position;\n ${glsl.attribute} vec2 textureCoord;\n\n ${glsl.varyingVertex} vec2 TexCoords;\n\n void main()\n {\n gl_Position = vec4(position, 1.0);\n TexCoords = textureCoord;\n }`;\n}\n\nexport function getFragShaderPreamble(version: 1|2): string {\n const glsl = getGlsl(version);\n return `${glsl.version}\n precision highp float;\n precision highp int;\n precision highp sampler2D;\n ${glsl.varyingFrag} vec2 TexCoords;\n ${glsl.outputDeclaration}\n const vec2 halfCR = vec2(0.5, 0.5);\n\n // Custom vector types to handle higher dimenalities.\n struct ivec5\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n };\n\n struct ivec6\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n int v;\n };\n\n int imod(int x, int y) {\n return x - y * (x / y);\n }\n\n `;\n}\n\nexport function getDefaultFragShaderMain(version: 1|2, outputShapeLength: number): string {\n const glsl = getGlsl(version);\n return `\n void main() {\n int indices[${outputShapeLength}];\n toVec(TexCoords, indices);\n vec4 result = vec4(process(indices));\n ${glsl.output} = result;\n }\n `;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../tensor';\n\n/**\n * Layout info is used for mapping n-dimensional array to 2D textures\n * The layout is created by the TextureLayoutStrategy based on\n * the Tensor's dimensions and strides\n */\nexport interface TextureLayout {\n width: number;\n height: number;\n /**\n * specify the number of value that encoded in a single pixel\n */\n channels: 1|2|3|4;\n /**\n * whether in packed mode or not\n */\n isPacked?: boolean;\n /**\n * the normalized shape\n */\n shape: readonly number[];\n /**\n * the stride of each dimensions, calculated according to shape\n */\n strides: readonly number[];\n /**\n * the original shape(dims) of the corresponding tensor\n */\n unpackedShape: readonly number[];\n\n reversedWH?: boolean;\n}\nexport interface TextureData extends TextureLayout {\n tensor: Tensor;\n texture: WebGLTexture;\n}\n\nexport enum TextureType {\n unpacked, // <-- normal unpacked texture\n unpackedReversed, // <-- unpacked texture used in old ONNX.js implementation (deprecated)\n packed, // <-- normal packed texture\n downloadUint8AsFloat, // <-- ONLY used in texture downloading for iOS devices\n packedLastDimension // <-- ONLY used in old ONNX.js Conv implementation for input W (deprecated)\n}\n\nexport interface TensorInfo {\n id?: Tensor.Id;\n dims: readonly number[];\n type: Tensor.DataType;\n textureType: TextureType;\n}\n\nexport interface ProgramVariable {\n type: 'float'|'int';\n name: string;\n arrayLength?: number;\n data: number|number[];\n}\n\n/**\n * A set of metadata of a shader program.\n */\nexport interface ProgramMetadata {\n /**\n * the name of the program. used for debugging and profiling\n */\n name: string;\n /**\n * texture types for each input\n */\n inputTypes: TextureType[];\n /**\n * names of each input\n */\n inputNames: string[];\n /**\n * an optional string as a cache hint in the artifact cache\n */\n cacheHint?: string;\n}\n\n/**\n * A ProgramInfoLoader allows\n */\nexport interface ProgramInfoLoader extends ProgramMetadata {\n /**\n * a function to get the program info\n */\n get(): ProgramInfo;\n}\n\n/**\n * A set of data that represent a shader program\n */\nexport interface ProgramInfo extends ProgramMetadata {\n /**\n * information of uniform variables\n */\n variables?: ProgramVariable[];\n /**\n * tensor info for output\n */\n output: TensorInfo;\n /**\n * the shader's processing source code\n */\n shaderSource: string;\n /**\n * whether the shader source contains a customized main function implementation\n */\n hasMain?: boolean;\n}\n\nexport interface VariableInfo {\n type: 'float'|'int';\n name: string;\n arrayLength?: number;\n}\n\nexport interface ProgramVariable {\n type: 'float'|'int';\n name: string;\n arrayLength?: number;\n data: number|number[];\n}\n\n/**\n * Information of uniforms that shader uses\n */\nexport interface UniformInfo {\n type: 'sampler2D'|VariableInfo['type'];\n name: string;\n arrayLength?: number;\n}\n\nexport interface UniformLocation extends UniformInfo {\n location: WebGLUniformLocation;\n}\n\n/**\n * Artifact is the result of compilation\n * It does not contain input of output data\n * However anything that could be run as a \"program\"\n */\nexport interface Artifact {\n programInfo: ProgramInfo;\n program: WebGLProgram;\n uniformLocations: UniformLocation[];\n attribLocations: {position: number; textureCoord: number};\n}\nexport declare namespace Artifact {\n type UniformLocations = Artifact['uniformLocations'];\n type AttribLocations = Artifact['attribLocations'];\n}\n\nexport interface UniformData {\n [name: string]: number|number[];\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {assert} from '../../util';\n/**\n * Given a non RGBA shape calculate the R version\n * It is assumed that the dimensions are multiples of given channels\n * NOTE: it is always the last dim that gets packed.\n * @param unpackedShape original shape to create a packed version from\n */\nexport function getPackedShape(unpackedShape: readonly number[]): readonly number[] {\n const len = unpackedShape.length;\n return unpackedShape.slice(0, len - 1).concat(unpackedShape[len - 1] / 4);\n}\n\nexport async function repeatedTry(\n checkFn: () => boolean, delayFn = (_counter: number) => 0, maxCounter?: number): Promise {\n return new Promise((resolve, reject) => {\n let tryCount = 0;\n\n const tryFn = () => {\n if (checkFn()) {\n resolve();\n return;\n }\n\n tryCount++;\n\n const nextBackoff = delayFn(tryCount);\n\n if (maxCounter != null && tryCount >= maxCounter) {\n reject();\n return;\n }\n setTimeout(tryFn, nextBackoff);\n };\n\n tryFn();\n });\n}\n\n/**\n * Generates the function name from an input sampler name.\n * @param samplerName Name of the sampler.\n */\nexport function generateShaderFuncNameFromInputSamplerName(samplerName: string): string {\n assert(typeof samplerName !== 'undefined' && samplerName.length !== 0, () => 'empty string found for sampler name');\n return 'get' + samplerName.charAt(0).toUpperCase() + samplerName.slice(1);\n}\n\n/**\n * Generates the function name from an input sampler name at output coordinates.\n * @param samplerName Name of the sampler.\n */\nexport function generateShaderFuncNameFromInputSamplerNameAtOutCoords(samplerName: string): string {\n assert(typeof samplerName !== 'undefined' && samplerName.length !== 0, () => 'empty string found for sampler name');\n return 'get' + samplerName.charAt(0).toUpperCase() + samplerName.slice(1) + 'AtOutCoords';\n}\n\n/** Returns a new input shape (a copy) that has a squeezed logical shape. */\nexport function squeezeInputShape(inputShape: readonly number[], squeezedShape: number[]): number[] {\n // Deep copy.\n let newInputShape: number[] = JSON.parse(JSON.stringify(inputShape));\n newInputShape = squeezedShape;\n return newInputShape;\n}\n\n/** Returns a list of squeezed parameters for shader functions */\nexport function getSqueezedParams(params: string[], keptDims: number[]): string {\n return keptDims.map(d => params[d]).join(', ');\n}\n\n/** Returns the data type for different ranks. */\nexport function getCoordsDataType(rank: number): string {\n if (rank <= 1) {\n return 'int';\n } else if (rank === 2) {\n return 'ivec2';\n } else if (rank === 3) {\n return 'ivec3';\n } else if (rank === 4) {\n return 'ivec4';\n } else if (rank === 5) {\n return 'ivec5';\n } else if (rank === 6) {\n return 'ivec6';\n } else {\n throw Error(`GPU for rank ${rank} is not yet supported`);\n }\n}\n\nexport function getGlChannels(rank = 6): string[] {\n return ['x', 'y', 'z', 'w', 'u', 'v'].slice(0, rank);\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {getGlChannels} from '../utils';\n\nexport function getVecChannels(name: string, rank: number): string[] {\n return getGlChannels(rank).map(d => `${name}.${d}`);\n}\n\nexport function getChannels(name: string, rank: number): string[] {\n if (rank === 1) {\n return [name];\n }\n return getVecChannels(name, rank);\n}\n\nexport function unpackFromChannel(): string {\n return `\n float getChannel(vec4 frag, int dim) {\n int modCoord = imod(dim, 2);\n return modCoord == 0 ? frag.r : frag.g;\n }\n\n float getChannel(vec4 frag, vec2 innerDims) {\n vec2 modCoord = mod(innerDims, 2.);\n return modCoord.x == 0. ?\n (modCoord.y == 0. ? frag.r : frag.g) :\n (modCoord.y == 0. ? frag.b : frag.a);\n }\n `;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, TextureType} from '../types';\nimport {getCoordsDataType} from '../utils';\n\nimport {getChannels} from './packing-utils';\n\nconst packProgramMetadata = {\n name: 'pack',\n inputNames: ['A'],\n inputTypes: [TextureType.unpackedReversed]\n};\n\nconst createPackProgramInfo = (handler: WebGLInferenceHandler, input: Tensor): ProgramInfo => {\n const glsl = getGlsl(handler.session.backend.glContext.version);\n const inputShape = input.dims;\n\n const inputRank = inputShape.length;\n // createTextureLayoutFromShape won't change output rank. Need to verify by running tests\n const outputRank = input.dims.length;\n\n const coordsDataType = getCoordsDataType(outputRank);\n const channels = getChannels('rc', outputRank);\n const setup = getSetup(outputRank, channels, inputShape[inputShape.length - 2], inputShape[inputShape.length - 1]);\n\n let reversedInputWH;\n if (inputRank === 0) {\n reversedInputWH = [1, 1];\n } else if (inputRank === 1) {\n reversedInputWH = [inputShape[0], 1];\n } else {\n reversedInputWH = [inputShape[outputRank - 1], inputShape[outputRank - 2]];\n }\n const outOfBoundsCondition = getOutOfBoundsCondition(outputRank, reversedInputWH, channels);\n const output = getOutput(inputShape, channels);\n\n const shaderSource = `\n void main() {\n ${coordsDataType} rc = getOutputCoords();\n\n if(${outOfBoundsCondition}) {\n ${glsl.output} = vec4(0);\n } else {\n ${setup}\n\n ${glsl.output} = vec4(${output});\n }\n }\n `;\n return {\n ...packProgramMetadata,\n hasMain: true,\n output: {dims: input.dims, type: input.type, textureType: TextureType.packed},\n shaderSource\n };\n};\n\nexport const createPackProgramInfoLoader = (handler: WebGLInferenceHandler, input: Tensor): ProgramInfoLoader =>\n ({...packProgramMetadata, get: () => createPackProgramInfo(handler, input)});\n\n/**\n * check output coordinate location and return false if it is outside input's width/height boundary\n */\nfunction getOutOfBoundsCondition(rank: number, shape: readonly number[], dims: string[]): string {\n if (rank === 0) {\n return 'false';\n }\n if (rank === 1) {\n return `rc > ${shape[0]}`;\n }\n\n let cond = '';\n for (let i = rank - 2; i < rank; i++) {\n cond += `${dims[i]} >= ${shape[i - rank + 2]}`;\n if (i < rank - 1) {\n cond += '||';\n }\n }\n\n return cond;\n}\n\n/**\n * code snippet to sample input texture with output coordinates\n */\nfunction getOutput(shape: readonly number[], dims: string[]): string {\n const rank = shape.length;\n\n if (rank === 0) {\n return 'getA(), 0, 0, 0';\n }\n\n if (rank === 1) {\n return `getA(rc),\n rc + 1 >= ${shape[0]} ? 0. : getA(rc + 1),\n 0, 0`;\n }\n\n const coord00 = 'r, c';\n const coord01 = 'r, cp1';\n const coord10 = 'rp1, c';\n const coord11 = 'rp1, cp1';\n let D = '';\n if (rank > 2) {\n for (let i = 0; i < rank - 2; ++i) {\n D = D + `${dims[i]},`;\n }\n }\n return `getA(${D}${coord00}),\n rEdge ? 0. : getA(${D}${coord10}),\n cEdge ? 0. : getA(${D}${coord01}),\n rEdge || cEdge ? 0. : getA(${D}${coord11})`;\n}\n\n/**\n * code snippet to setup 4 coordinates and edge conditions\n */\nfunction getSetup(rank: number, dims: string[], rows: number, cols: number): string {\n if (rank === 0 || rank === 1) {\n return '';\n }\n // rank >= 2 for width+height pack.\n else {\n const setup = `\n int r = ${dims[rank - 2]};\n int c = ${dims[rank - 1]};\n int rp1 = ${dims[rank - 2]} + 1;\n int cp1 = ${dims[rank - 1]} + 1;\n bool rEdge = rp1 >= ${cols};\n bool cEdge = cp1 >= ${rows};\n `;\n return setup;\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nimport {unpackFromChannel} from './packing-utils';\n\nconst createPackedReshape3DProgramMetadata = (outputShape3D: readonly number[]) =>\n ({name: 'Reshape (packed)', inputTypes: [TextureType.packed], inputNames: ['A'], cacheHint: `${outputShape3D}`});\n\nconst createPackedReshape3DProgramInfo =\n (handler: WebGLInferenceHandler, input3D: Tensor, metadata: ProgramMetadata, outputShape3D: readonly number[]):\n ProgramInfo => {\n const inputShape3D = input3D.dims as [number, number, number];\n const squeezedOutputShape = outputShape3D as [number, number, number];\n\n let mainLoop = '';\n for (let i = 0; i < 4; i++) {\n let outputCoords = '';\n switch (i) {\n case 0:\n outputCoords = 'outputCoords = rc;';\n break;\n case 1:\n outputCoords = 'outputCoords = ivec3(rc.x, rc.y+1, rc.z);';\n break;\n case 2:\n outputCoords = 'outputCoords = ivec3(rc.x, rc.y, rc.z+1);';\n break;\n case 3:\n outputCoords = 'outputCoords = ivec3(rc.x, rc.y+1, rc.z+1);';\n break;\n default:\n throw new Error();\n }\n\n mainLoop += `\n ${outputCoords}\n ${i > 0 ? 'if(outputCoords.y < rows && outputCoords.z < cols){' : ''}\n int flattenedIndex = getFlattenedIndex(outputCoords);\n\n ivec3 inputRC = inputCoordsFromReshapedOutCoords(flattenedIndex);\n vec2 innerDims = vec2(float(inputRC.y),float(inputRC.z));\n\n result[${i}] = getChannel(getA(inputRC.x, inputRC.y, inputRC.z), innerDims);\n\n ${i > 0 ? '}' : ''}\n `;\n }\n const glsl = getGlsl(handler.session.backend.glContext.version);\n\n const shaderSource = `\n ${getReshapedInputCoords(inputShape3D)}\n ${getFlattenedIndexFrom3D(squeezedOutputShape)}\n ${unpackFromChannel()}\n\n void main() {\n ivec3 rc = getOutputCoords();\n\n vec4 result = vec4(0.0);\n\n ivec3 outputCoords;\n int rows = ${squeezedOutputShape[2]};\n int cols = ${squeezedOutputShape[1]};\n\n ${mainLoop}\n ${glsl.output} = result;\n }\n `;\n\n return {\n ...metadata,\n output: {dims: squeezedOutputShape, type: input3D.type, textureType: TextureType.packed},\n shaderSource,\n hasMain: true\n };\n };\n\nexport const createPackedReshape3DProgramInfoLoader =\n (handler: WebGLInferenceHandler, input3D: Tensor, outputShape3D: readonly number[]): ProgramInfoLoader => {\n const metadata = createPackedReshape3DProgramMetadata(outputShape3D);\n return {...metadata, get: () => createPackedReshape3DProgramInfo(handler, input3D, metadata, outputShape3D)};\n };\n\nexport function processDims3D(shape: ArrayLike): [number, number, number] {\n if (shape.length === 0) {\n return [1, 1, 1];\n }\n // TODO: squeeze other shapes to 2D case\n let batch = 1;\n for (let i = 0; i < shape.length - 2; ++i) {\n batch *= shape[i];\n }\n return [batch, shape.length > 1 ? shape[shape.length - 2] : 1, shape[shape.length - 1]];\n}\n\n// For packed reshape, we need to re-arrange texel data for output shape.\n// Our pack is designed to pack a 2x2 tile in last h and w dimension, so\n// for the reshaped new tensor, we just need to re-arrange the last h and\n// w dimension. For any shape that is not in 3D, i.e. [batch, W, H], we\n// first convert it to 3D by collapsing other dimension to batch dim, then\n// process with the last two dimensions.\n// Note: we only need the shape tensor to calculate output shape, so the\n// content in shape tensor is never uploaded to GPU. It is always kept in CPU.\n// TODO: optimize the algorithm -- in some cases, if the last two dims are\n// the same between input shape and output shape, the packed reshape can be\n// treated as no-op.\nexport function isReshapeCheap(dims: readonly number[], reshapedDims: readonly number[]) {\n let isCheapReshape = false;\n if (dims.length === 0 || reshapedDims.length === 0) { // scalar\n isCheapReshape = true;\n } else if (dims.length < 2 || reshapedDims.length < 2) { // 1D\n isCheapReshape = dims[dims.length - 1] === reshapedDims[reshapedDims.length - 1];\n } else { // 2D +\n isCheapReshape = dims[dims.length - 1] === reshapedDims[reshapedDims.length - 1] &&\n dims[dims.length - 2] === reshapedDims[reshapedDims.length - 2];\n }\n\n return isCheapReshape;\n}\n\nfunction getReshapedInputCoords(shape: [number, number, number]): string {\n const strides = ShapeUtil.computeStrides(shape);\n const coords = ['b', 'r', 'c'];\n const index = 'index';\n const coordsFromIndexSnippet = strides\n .map((stride, i) => {\n const line1 = `int ${coords[i]} = ${index} / ${stride}`;\n const line2 = i === strides.length - 1 ?\n `int ${coords[i + 1]} = ${index} - ${coords[i]} * ${stride}` :\n `index -= ${coords[i]} * ${stride}`;\n return `${line1}; ${line2};`;\n })\n .join('');\n\n return `\n ivec3 inputCoordsFromReshapedOutCoords(int index) {\n ${coordsFromIndexSnippet}\n return ivec3(b, r, c);\n }\n `;\n}\n\nfunction getFlattenedIndexFrom3D(shape: [number, number, number]): string {\n const strides = ShapeUtil.computeStrides(shape);\n\n return `\n int getFlattenedIndex(ivec3 coords) {\n // reverse y, z order\n return coords.x * ${strides[0]} + coords.z * ${strides[1]} + coords.y;\n }\n`;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {TextureData, TextureType} from '../types';\n\nexport const encodeAsUint8 = (inferenceHandler: WebGLInferenceHandler, input: TextureData): TextureData => {\n const outputShape = input.shape;\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n /**\n * https://github.com/tensorflow/tfjs-core/blob/master/src/kernels/webgl/encode_float_gpu.ts\n */\n const shaderSource = `\n const float FLOAT_MAX = 1.70141184e38;\n const float FLOAT_MIN = 1.17549435e-38;\n\n bool isNaN(float val) {\n return (val < 1.0 || 0.0 < val || val == 0.0) ? false : true;\n }\n\n highp vec4 encodeAsUint8(highp float v) {\n if (isNaN(v)) {\n return vec4(255, 255, 255, 255);\n }\n\n highp float av = abs(v);\n\n if(av < FLOAT_MIN) {\n return vec4(0.0, 0.0, 0.0, 0.0);\n } else if(v > FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\n } else if(v < -FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 255.0) / 255.0;\n }\n\n highp vec4 c = vec4(0,0,0,0);\n\n highp float e = floor(log2(av));\n highp float m = exp2(fract(log2(av))) - 1.0;\n\n c[2] = floor(128.0 * m);\n m -= c[2] / 128.0;\n c[1] = floor(32768.0 * m);\n m -= c[1] / 32768.0;\n c[0] = floor(8388608.0 * m);\n\n highp float ebias = e + 127.0;\n c[3] = floor(ebias / 2.0);\n ebias -= c[3] * 2.0;\n c[2] += floor(ebias) * 128.0;\n\n c[3] += 128.0 * step(0.0, -v);\n\n return c / 255.0;\n }\n\n void main() {\n float value = ${glsl.texture2D}(X,TexCoords).r;\n ${glsl.output} = encodeAsUint8(value);\n }`;\n const programInfo = {\n name: 'Uint8Encode',\n inputTypes: [TextureType.unpacked],\n inputNames: ['X'],\n output: {dims: outputShape, type: input.tensor.type, textureType: TextureType.downloadUint8AsFloat},\n shaderSource,\n hasMain: true\n };\n return inferenceHandler.executeProgram(programInfo, [input.tensor]);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, TextureType} from '../types';\nimport {getCoordsDataType} from '../utils';\n\nimport {getChannels, unpackFromChannel} from './packing-utils';\n\nconst unpackProgramMetadata = {\n name: 'unpack',\n inputNames: ['A'],\n inputTypes: [TextureType.packed]\n};\n\nexport const createUnpackProgramInfo = (handler: WebGLInferenceHandler, input: Tensor): ProgramInfo => {\n const rank = input.dims.length;\n\n const channels = getChannels('rc', rank);\n const innerDims = channels.slice(-2);\n const coordsDataType = getCoordsDataType(rank);\n const unpackChannel = unpackFromChannel();\n const isScalar = (input.dims.length === 0);\n const sourceCoords = isScalar ? '' : getSourceCoords(rank, channels);\n const coords = rank <= 1 ? 'rc' : `vec2(${innerDims.join(',')})`;\n const glsl = getGlsl(handler.session.backend.glContext.version);\n const shaderSource = `\n ${unpackChannel}\n void main() {\n ${coordsDataType} rc = getOutputCoords();\n\n // Sample the texture with the coords to get the rgba channel value.\n vec4 packedInput = getA(${sourceCoords});\n\n ${glsl.output} = vec4(getChannel(packedInput, ${coords}), 0, 0, 0);\n }\n `;\n\n return {\n ...unpackProgramMetadata,\n hasMain: true,\n output: {dims: input.dims, type: input.type, textureType: TextureType.unpacked},\n shaderSource\n };\n};\n\nexport const createUnpackProgramInfoLoader = (handler: WebGLInferenceHandler, input: Tensor): ProgramInfoLoader =>\n ({...unpackProgramMetadata, get: () => createUnpackProgramInfo(handler, input)});\n\nfunction getSourceCoords(rank: number, dims: string[]): string {\n if (rank === 1) {\n return 'rc';\n }\n\n let coords = '';\n for (let i = 0; i < rank; i++) {\n coords += dims[i];\n if (i < rank - 1) {\n coords += ',';\n }\n }\n return coords;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Logger} from '../../instrument';\n\nexport declare namespace Encoder {\n export interface DataTypeMap {\n float: Float32Array;\n byte: Uint8Array;\n int: Uint32Array;\n }\n export type DataType = keyof DataTypeMap;\n type DataArrayType = DataTypeMap[DataType];\n}\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport const enum EncoderUsage {\n Default = 0,\n UploadOnly,\n Download4BytesAsFloat32,\n}\n/* eslint-enable @typescript-eslint/naming-convention */\n\n/**\n * Abstraction for mapping data types to texture texlets\n * Encoding means how a Float32 is mapped to 1 or 4 channels for each texlet\n * Decoding means how a texlet's channels are mapped to a resulting Float32\n */\nexport interface DataEncoder {\n internalFormat: number;\n format: number;\n textureType: number;\n channelSize: number;\n encode(src: Encoder.DataArrayType, textureSize: number): Encoder.DataArrayType;\n allocate(size: number): Encoder.DataArrayType;\n decode(buffer: Encoder.DataArrayType, dataSize: number): Encoder.DataArrayType;\n}\n/**\n * WebGL2 data encoder\n * Uses R32F as the format for texlet\n */\nexport class RedFloat32DataEncoder implements DataEncoder {\n internalFormat: number;\n format: number;\n textureType: number;\n channelSize: number;\n constructor(gl: WebGL2RenderingContext, channels = 1) {\n if (channels === 1) {\n this.internalFormat = gl.R32F;\n this.format = gl.RED;\n this.textureType = gl.FLOAT;\n this.channelSize = channels;\n } else if (channels === 4) {\n this.internalFormat = gl.RGBA32F;\n this.format = gl.RGBA;\n this.textureType = gl.FLOAT;\n this.channelSize = channels;\n } else {\n throw new Error(`Invalid number of channels: ${channels}`);\n }\n }\n encode(src: Encoder.DataArrayType, textureSize: number): Encoder.DataArrayType {\n let result: Float32Array;\n let source: Float32Array;\n if (src.constructor !== Float32Array) {\n Logger.warning('Encoder', 'data was not of type Float32; creating new Float32Array');\n source = new Float32Array(src);\n }\n if (textureSize * this.channelSize > src.length) {\n Logger.warning('Encoder', 'Source data too small. Allocating larger array');\n source = src as Float32Array;\n result = this.allocate(textureSize * this.channelSize) as Float32Array;\n source.forEach((v, i) => result[i] = v);\n } else {\n source = src as Float32Array;\n result = source;\n }\n return result;\n }\n allocate(size: number): Encoder.DataArrayType {\n return new Float32Array(size * 4);\n }\n decode(buffer: Encoder.DataArrayType, dataSize: number): Float32Array {\n if (this.channelSize === 1) {\n const filteredData = (buffer as Float32Array).filter((_value, index) => index % 4 === 0).subarray(0, dataSize);\n return filteredData;\n }\n return buffer.subarray(0, dataSize) as Float32Array;\n }\n}\n/**\n * Data encoder for WebGL 1 with support for floating point texture\n */\nexport class RGBAFloatDataEncoder implements DataEncoder {\n internalFormat: number;\n format: number;\n textureType: number;\n channelSize: number;\n constructor(gl: WebGLRenderingContext, channels = 1, textureType?: number) {\n if (channels !== 1 && channels !== 4) {\n throw new Error(`Invalid number of channels: ${channels}`);\n }\n this.internalFormat = gl.RGBA;\n this.format = gl.RGBA;\n this.channelSize = channels;\n this.textureType = textureType || gl.FLOAT;\n }\n encode(src: Float32Array, textureSize: number): Encoder.DataArrayType {\n let dest = src;\n if (this.channelSize === 1) {\n Logger.verbose('Encoder', 'Exploding into a larger array');\n dest = this.allocate(textureSize) as Float32Array;\n src.forEach((v, i) => dest[i * 4] = v);\n }\n return dest;\n }\n allocate(size: number): Encoder.DataArrayType {\n return new Float32Array(size * 4);\n }\n decode(buffer: Encoder.DataArrayType, dataSize: number): Float32Array {\n if (this.channelSize === 1) {\n const filteredData = (buffer as Float32Array).filter((_value, index) => index % 4 === 0).subarray(0, dataSize);\n return filteredData;\n }\n return buffer.subarray(0, dataSize) as Float32Array;\n }\n}\n\nexport class Uint8DataEncoder implements DataEncoder {\n internalFormat: number;\n format: number;\n textureType: number;\n channelSize = 4;\n constructor(gl: WebGLRenderingContext, channels = 1) {\n if (channels === 1) {\n this.internalFormat = gl.ALPHA;\n this.format = gl.ALPHA; // not tested\n this.textureType = gl.UNSIGNED_BYTE;\n this.channelSize = channels;\n } else if (channels === 4) {\n this.internalFormat = gl.RGBA;\n this.format = gl.RGBA;\n this.textureType = gl.UNSIGNED_BYTE;\n this.channelSize = channels;\n } else {\n throw new Error(`Invalid number of channels: ${channels}`);\n }\n }\n encode(src: Uint8Array, _textureSize: number): Encoder.DataArrayType {\n return new Uint8Array(src.buffer, src.byteOffset, src.byteLength);\n }\n allocate(size: number): Encoder.DataArrayType {\n return new Uint8Array(size * this.channelSize);\n }\n decode(buffer: Encoder.DataArrayType, dataSize: number): Uint8Array {\n if (buffer instanceof Uint8Array) {\n return buffer.subarray(0, dataSize);\n }\n throw new Error(`Invalid array type: ${buffer.constructor}`);\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {ShapeUtil} from '../../util';\n\nimport {TextureLayoutStrategy, WidthHeightPrefs} from './texture-layout-strategy';\nimport {TextureLayout, TextureType} from './types';\n\nexport const createTextureLayoutFromTextureType =\n (textureLayoutStrategy: TextureLayoutStrategy, shape: readonly number[],\n textureType: TextureType): TextureLayout => {\n const channel = (textureType === TextureType.unpacked || textureType === TextureType.unpackedReversed) ? 1 : 4;\n const isPacked = textureType === TextureType.packed;\n const reverseWH = (textureType === TextureType.unpackedReversed || textureType === TextureType.packed);\n const breakAxis = textureType === TextureType.packedLastDimension ? shape.length - 1 : undefined;\n const unpackedShape = textureType === TextureType.packedLastDimension ?\n shape.map((d, i) => i === shape.length - 1 ? d * 4 : d) :\n undefined;\n return createTextureLayoutFromShape(\n textureLayoutStrategy, shape, channel, unpackedShape, {isPacked, reverseWH, breakAxis});\n };\n\nexport const calculateTextureWidthAndHeight =\n (textureLayoutStrategy: TextureLayoutStrategy, shape: readonly number[], textureType: TextureType):\n [number, number] => {\n const layout = createTextureLayoutFromTextureType(textureLayoutStrategy, shape, textureType);\n return [layout.width, layout.height];\n };\n\n/**\n * Create a TextureLayout object from shape.\n */\nexport const createTextureLayoutFromShape =\n (textureLayoutStrategy: TextureLayoutStrategy, shape: readonly number[], channels: 1|4 = 1,\n unpackedShape?: readonly number[], prefs?: WidthHeightPrefs): TextureLayout => {\n const isPacked = !!(prefs && prefs.isPacked);\n const [width, height] = textureLayoutStrategy.computeTextureWH(isPacked ? unpackedShape || shape : shape, prefs);\n const rank = shape.length;\n let inferredDims = shape.slice(0);\n if (rank === 0) {\n inferredDims = [1];\n }\n if (channels === 1) {\n // unpackedShape will take `shape` and not `inferredDims` so as to create a scalar Tensor if need be\n unpackedShape = shape;\n } else if (isPacked) {\n if (channels !== 4) {\n throw new Error('a packed texture must be 4-channel');\n }\n unpackedShape = shape;\n if (rank > 0) {\n inferredDims[rank - 1] = Math.ceil(inferredDims[rank - 1] / 2);\n }\n if (rank > 1) {\n inferredDims[rank - 2] = Math.ceil(inferredDims[rank - 2] / 2);\n }\n } else if (!unpackedShape) {\n throw new Error('Unpacked shape is needed when using channels > 1');\n }\n return {\n width,\n height,\n channels,\n isPacked,\n shape: inferredDims,\n strides: ShapeUtil.computeStrides(inferredDims),\n unpackedShape,\n reversedWH: (prefs && prefs.reverseWH)\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceHandler} from '../../backend';\nimport {Logger} from '../../instrument';\nimport {Tensor} from '../../tensor';\nimport {ShapeUtil} from '../../util';\n\nimport {createPackProgramInfoLoader} from './ops/pack';\nimport {createPackedReshape3DProgramInfoLoader, isReshapeCheap, processDims3D} from './ops/reshape-packed';\nimport {encodeAsUint8} from './ops/uint8-encode';\nimport {createUnpackProgramInfoLoader} from './ops/unpack';\nimport {WebGLSessionHandler} from './session-handler';\nimport {EncoderUsage} from './texture-data-encoder';\nimport {calculateTextureWidthAndHeight, createTextureLayoutFromShape, createTextureLayoutFromTextureType} from './texture-layout';\nimport {Artifact, ProgramInfo, ProgramInfoLoader, TextureData, TextureLayout, TextureType} from './types';\n\nconst getProgramInfoUniqueKey =\n (programInfo: ProgramInfo|ProgramInfoLoader, inputTextureDatas: TextureData[]): string => {\n const inputs =\n inputTextureDatas.map(texture => `${texture.unpackedShape.join(',')};${texture.width}x${texture.height}`)\n .join('_');\n let key = programInfo.name;\n if (programInfo.cacheHint) {\n key += '[' + programInfo.cacheHint + ']';\n }\n key += ':' + inputs;\n return key;\n };\n\nexport class WebGLInferenceHandler implements InferenceHandler {\n private packedTextureDataCache: Map;\n private unpackedTextureDataCache: Map;\n constructor(public session: WebGLSessionHandler) {\n this.packedTextureDataCache = new Map();\n this.unpackedTextureDataCache = new Map();\n }\n\n /**\n * @returns [width, height]\n */\n calculateTextureWidthAndHeight(shape: readonly number[], textureType: TextureType): [number, number] {\n return calculateTextureWidthAndHeight(this.session.layoutStrategy, shape, textureType);\n }\n\n executeProgram(program: ProgramInfo|ProgramInfoLoader, inputs: readonly Tensor[]): TextureData {\n if (inputs.length < program.inputNames.length) {\n throw new Error(`Input size mustn't be less than ${program.inputNames.length}.`);\n }\n if (program.inputNames.length !== program.inputTypes.length) {\n throw new Error('input names size does not match input types');\n }\n\n // create texture info for input\n const inputTextureDatas: TextureData[] = [];\n for (let i = 0; i < program.inputNames.length; ++i) {\n inputTextureDatas[i] = this.getOrCreateTextureData(inputs[i], program.inputTypes[i]);\n }\n\n const key = getProgramInfoUniqueKey(program, inputTextureDatas);\n let artifact = this.session.programManager.getArtifact(key);\n const programInfo = artifact ?\n artifact.programInfo :\n (typeof (program as ProgramInfoLoader).get === 'function' ? (program as ProgramInfoLoader).get() :\n (program as ProgramInfo));\n\n // create texture info for output\n const outputTextureLayout = createTextureLayoutFromTextureType(\n this.session.layoutStrategy, programInfo.output.dims, programInfo.output.textureType);\n const outputTextureData = this.createTextureData(outputTextureLayout, programInfo.output.type);\n\n if (!artifact) {\n artifact = this.session.programManager.build(programInfo, inputTextureDatas, outputTextureData);\n this.session.programManager.setArtifact(key, artifact);\n }\n\n this.runProgram(artifact, inputTextureDatas, outputTextureData);\n return outputTextureData;\n }\n\n run(program: ProgramInfoLoader, inputs: readonly Tensor[]): Tensor {\n const outputTextureData = this.executeProgram(program, inputs);\n return outputTextureData.tensor;\n }\n\n private runProgram(artifact: Artifact, inputs: TextureData[], output: TextureData): void {\n // input should match\n for (let i = 0; i < inputs.length; ++i) {\n if (!!inputs[i].isPacked !== (artifact.programInfo.inputTypes[i] === TextureType.packed)) {\n throw new Error(`input[${i}] property packed inconsistent`);\n }\n }\n\n // output should match\n if (!!output.isPacked !== (artifact.programInfo.output.textureType === TextureType.packed)) {\n throw new Error('output property packed inconsistent');\n }\n\n this.session.programManager.run(artifact, inputs, output);\n }\n\n /**\n * Create a TextureData object from a tensor.\n * Usage = EncoderUsage.UploadOnly.\n * If a related texture data is found in cache, returns it;\n * Otherwise:\n * Creates a new texture layout if not provided;\n * Creates WebGLTexture with the layout;\n * Upload tensor data to the texture;\n * Creates a texture data object associated with the given tensor.\n * @param tensor the tensor with data to upload\n */\n private getOrCreateTextureData(tensor: Tensor, textureType: TextureType) {\n let td = this.getTextureData(tensor.dataId, textureType === TextureType.packed);\n\n if (!td) {\n // check if we have texture data in different type\n td = this.getTextureData(tensor.dataId, textureType !== TextureType.packed);\n if (td) {\n if (textureType === TextureType.packed) {\n return this.pack(td);\n } else {\n return this.unpack(td);\n }\n }\n }\n\n if (!td) {\n const layout = createTextureLayoutFromTextureType(this.session.layoutStrategy, tensor.dims, textureType);\n\n if (textureType === TextureType.packedLastDimension) {\n const group = 1;\n const channels = 4;\n const shape = tensor.dims;\n if (shape.length === 4) {\n // pre-processing for kernel data of Conv.\n //\n // TODO: currently this is a hacking to overwrite Conv's weight. The correct way to do this should be:\n // 1. implement texture based const-folding\n // 2. create a WebGL program \"preprocessConvWeight\" to do the same work as below\n // 3. run the program before dotProduct.\n //\n const adjustedKernelShape = [shape[0], Math.ceil((shape[1] * shape[2] * shape[3]) / channels)];\n const adjustedLayout =\n createTextureLayoutFromTextureType(this.session.layoutStrategy, adjustedKernelShape, textureType);\n let buffer = tensor.numberData;\n if (shape[1] * shape[2] * shape[3] % channels !== 0) {\n const numFeatureMaps = shape[0];\n const oldRowSize = shape[1] * shape[2] * shape[3];\n const newRowSize = Math.ceil(oldRowSize * group / channels) * channels;\n const newSize = numFeatureMaps * newRowSize;\n buffer = new Float32Array(newSize);\n for (let f = 0; f < numFeatureMaps; ++f) {\n const oldOffset = f * oldRowSize;\n const newOffset = f * newRowSize + f % group * oldRowSize;\n buffer.set(tensor.numberData.subarray(oldOffset, oldOffset + oldRowSize), newOffset);\n }\n }\n return this.createTextureData(adjustedLayout, tensor.type, buffer, tensor, EncoderUsage.UploadOnly);\n }\n }\n\n if (textureType === TextureType.packed) {\n const unpackedTextureLayout =\n createTextureLayoutFromShape(this.session.layoutStrategy, tensor.dims, 1, [], {reverseWH: true});\n const unpackedTextureData = this.createTextureData(\n unpackedTextureLayout, tensor.type, tensor.numberData, tensor, EncoderUsage.UploadOnly);\n td = this.pack(unpackedTextureData);\n } else {\n td = this.createTextureData(layout, tensor.type, tensor.numberData, tensor, EncoderUsage.UploadOnly);\n }\n }\n return td;\n }\n\n /**\n * Create a TextureData object using the given data and bind to the given tensor.\n * Usage = EncoderUsage.UploadOnly.\n * NOTE: this function is a hack for Conv implementation. should remove this function, after rewriting Conv\n * implementation by Graph.Transformer\n * @param dataType the tensor data type\n * @param data the actual data to upload\n * @param tensor the tensor to bind. tensor's data is ignored.\n */\n createTextureDataFromLayoutBindTensor(\n layout: TextureLayout, dataType: Tensor.DataType, data: Tensor.NumberType, tensor: Tensor): TextureData {\n return this.createTextureData(layout, dataType, data, tensor, EncoderUsage.UploadOnly);\n }\n\n private createTextureData(\n layout: TextureLayout, dataType: Tensor.DataType, data?: Tensor.NumberType, tensor?: Tensor,\n usage?: EncoderUsage): TextureData {\n Logger.verbose('InferenceHandler', `Creating TextureData: layout:[${JSON.stringify(layout)}]`);\n const texture = this.session.textureManager.createTextureFromLayout(dataType, layout, data, usage);\n return this.createTextureDataFromTexture(layout, dataType, texture, tensor);\n }\n\n reshapeUnpacked(input: Tensor, reshapedDims: readonly number[]): Tensor {\n const inputTD = this.getOrCreateTextureData(input, TextureType.unpacked);\n const newTextureLayout: TextureLayout = {\n channels: inputTD.channels,\n height: inputTD.height,\n width: inputTD.width,\n // handle reshaping into scalar Tensors\n shape: reshapedDims.length !== 0 ? reshapedDims : [1],\n strides: ShapeUtil.computeStrides(reshapedDims),\n unpackedShape: reshapedDims,\n };\n const newTextureData = this.createTextureDataFromTexture(newTextureLayout, input.type, inputTD.texture);\n return newTextureData.tensor;\n }\n\n reshapePacked(input: Tensor, reshapedDims: readonly number[]): Tensor {\n const inputTD = this.getOrCreateTextureData(input, TextureType.packed);\n\n // check if the reshape is 'cheap'\n if (isReshapeCheap(input.dims, reshapedDims)) {\n const newTextureLayout: TextureLayout = {\n channels: inputTD.channels,\n height: inputTD.height,\n width: inputTD.width,\n // handle reshaping into scalar Tensors\n shape: reshapedDims.length !== 0 ? reshapedDims : [1],\n strides: ShapeUtil.computeStrides(reshapedDims),\n unpackedShape: reshapedDims,\n isPacked: true\n };\n const newTextureData = this.createTextureDataFromTexture(newTextureLayout, input.type, inputTD.texture);\n return newTextureData.tensor;\n }\n\n const squeezedInputShape = processDims3D(input.dims);\n const squeezedOutputShape = processDims3D(reshapedDims);\n\n const squeezedInputTensor = this.reshapePacked(input, squeezedInputShape);\n const squeezedOutputTensor = this.run(\n createPackedReshape3DProgramInfoLoader(this, squeezedInputTensor, squeezedOutputShape), [squeezedInputTensor]);\n const outputTensor = this.reshapePacked(squeezedOutputTensor, reshapedDims);\n return outputTensor;\n }\n\n cast(input: Tensor, type: Tensor.DataType): Tensor {\n const inputTD = this.getOrCreateTextureData(input, TextureType.unpacked);\n const newTextureData = this.createTextureDataFromTexture(inputTD as TextureLayout, type, inputTD.texture);\n return newTextureData.tensor;\n }\n\n private createTextureDataFromTexture(\n layout: TextureLayout, dataType: Tensor.DataType, texture: WebGLTexture, tensor?: Tensor, tensorId?: Tensor.Id) {\n const textureData: TextureData = {\n ...layout,\n tensor: tensor ||\n new Tensor(\n layout.unpackedShape, dataType, (_id: Tensor.Id) => this.readTexture(textureData),\n async (_id: Tensor.Id) => this.readTextureAsync(textureData), undefined, tensorId),\n texture\n };\n this.setTextureData(textureData.tensor.dataId, textureData, layout.isPacked);\n return textureData;\n }\n\n private getTextureData(tensorId: Tensor.Id, isPacked = false): TextureData|undefined {\n return this.session.isInitializer(tensorId) ? this.session.getTextureData(tensorId, isPacked) :\n isPacked ? this.packedTextureDataCache.get(tensorId) :\n this.unpackedTextureDataCache.get(tensorId);\n }\n setTextureData(tensorId: Tensor.Id, td: TextureData, isPacked = false): void {\n if (this.session.isInitializer(tensorId)) {\n this.session.setTextureData(tensorId, td, isPacked);\n } else {\n (isPacked ? this.packedTextureDataCache : this.unpackedTextureDataCache).set(tensorId, td);\n }\n }\n isTextureLayoutCached(tensor: Tensor, isPacked = false): boolean {\n return !!this.getTextureData(tensor.dataId, isPacked);\n }\n\n dispose(): void {\n this.session.textureManager.clearActiveTextures();\n this.packedTextureDataCache.forEach(td => this.session.textureManager.releaseTexture(td));\n this.packedTextureDataCache = new Map();\n this.unpackedTextureDataCache.forEach(td => this.session.textureManager.releaseTexture(td));\n this.unpackedTextureDataCache = new Map();\n }\n\n readTexture(textureData: TextureData): Tensor.NumberType {\n if (textureData.isPacked) {\n return this.readTexture(this.unpack(textureData));\n }\n if (!this.session.backend.glContext.isFloat32DownloadSupported) {\n return this.session.textureManager.readUint8TextureAsFloat(encodeAsUint8(this, textureData));\n }\n return this.session.textureManager.readTexture(textureData, textureData.tensor.type, textureData.channels);\n }\n\n async readTextureAsync(textureData: TextureData): Promise {\n if (textureData.isPacked) {\n return this.readTextureAsync(this.unpack(textureData));\n }\n if (!this.session.backend.glContext.isFloat32DownloadSupported) {\n return this.session.textureManager.readUint8TextureAsFloat(encodeAsUint8(this, textureData));\n }\n return this.session.textureManager.readTextureAsync(textureData, textureData.tensor.type, textureData.channels);\n }\n\n pack(input: TextureData): TextureData {\n const outputTextureData = this.executeProgram(createPackProgramInfoLoader(this, input.tensor), [input.tensor]);\n return outputTextureData;\n }\n\n unpack(input: TextureData): TextureData {\n const outputTextureData = this.executeProgram(createUnpackProgramInfoLoader(this, input.tensor), [input.tensor]);\n return outputTextureData;\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nclass AttributeWithCacheKeyImpl {\n constructor(attribute: Record) {\n Object.assign(this, attribute);\n }\n\n private key: string;\n public get cacheKey(): string {\n if (!this.key) {\n this.key =\n Object.getOwnPropertyNames(this).sort().map(name => `${(this as Record)[name]}`).join(';');\n }\n return this.key;\n }\n}\n\nexport interface AttributeWithCacheKey {\n readonly cacheKey: string;\n}\n\nexport const createAttributeWithCacheKey = >(attribute: T): T&AttributeWithCacheKey =>\n new AttributeWithCacheKeyImpl(attribute) as unknown as T & AttributeWithCacheKey;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, TextureType} from '../types';\n\nexport interface BatchNormalizationAttributes extends AttributeWithCacheKey {\n epsilon: number;\n momentum: number;\n spatial: number;\n}\n\nconst batchNormalizationProgramMetadata = {\n name: 'BatchNormalization',\n inputNames: ['A', 'Scale', 'B', 'Mean', 'Variance'],\n inputTypes:\n [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked, TextureType.unpacked, TextureType.unpacked]\n};\n\nexport const batchNormalization: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: BatchNormalizationAttributes): Tensor[] => {\n validateInputs(inputs);\n const output = inferenceHandler.run(\n {\n ...batchNormalizationProgramMetadata,\n cacheHint: attributes.cacheKey,\n get: () => createBatchNormalizationProgramInfo(inferenceHandler, inputs, attributes)\n },\n inputs);\n return [output];\n };\n\nexport const parseBatchNormalizationAttributes: OperatorInitialization =\n (node: Graph.Node): BatchNormalizationAttributes => {\n const epsilon = node.attributes.getFloat('epsilon', 1e-5);\n const momentum = node.attributes.getFloat('momentum', 0.9);\n const spatial = node.attributes.getInt('spatial', 1);\n return createAttributeWithCacheKey({epsilon, momentum, spatial});\n };\n\nconst createBatchNormalizationProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: BatchNormalizationAttributes):\n ProgramInfo => {\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const rank = inputs[0].dims.length;\n const [scaleWidth, scaleHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(inputs[1].dims, TextureType.unpacked);\n const shaderSource = `\n float process(int[${rank}] indices) {\n vec2 position = offsetToCoords(indices[1], ${scaleWidth}, ${scaleHeight});\n float scale = getColorAsFloat(${glsl.texture2D}(Scale, position));\n float mean = getColorAsFloat(${glsl.texture2D}(Mean, position));\n float variance = getColorAsFloat(${glsl.texture2D}(Variance, position));\n float b = getColorAsFloat(${glsl.texture2D}(B, position));\n\n return scale * ( (_A(indices) - mean) / sqrt(variance + float(${attributes.epsilon})) ) + b;\n }`;\n return {\n ...batchNormalizationProgramMetadata,\n output: {dims: inputs[0].dims, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 5) {\n throw new Error('BatchNormalization requires 5 inputs.');\n }\n\n const X = inputs[0];\n const scale = inputs[1];\n const B = inputs[2];\n const mean = inputs[3];\n const var_ = inputs[4];\n\n // input should atleast have three dimensions - N,C,dim1,...,dimn\n // other inputs can have only one dimensions\n if (X.dims.length < 3 || scale.dims.length !== 1 || B.dims.length !== 1 || mean.dims.length !== 1 ||\n var_.dims.length !== 1) {\n throw new Error('invalid input shape.');\n }\n if (scale.dims[0] !== X.dims[1] || B.dims[0] !== X.dims[1] || mean.dims[0] !== X.dims[1] ||\n var_.dims[0] !== X.dims[1]) {\n throw new Error('invalid input shape.');\n }\n if ((X.type !== 'float32' && X.type !== 'float64') || (scale.type !== 'float32' && scale.type !== 'float64') ||\n (B.type !== 'float32' && B.type !== 'float64') || (mean.type !== 'float32' && mean.type !== 'float64') ||\n (var_.type !== 'float32' && var_.type !== 'float64')) {\n throw new Error('invalid input tensor types.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {ProgramInfo, TextureLayout} from './types';\nimport {WebGLContext} from './webgl-context';\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport enum FunctionType {\n ValueBased,\n Positional\n}\nexport interface GlslFunction {\n body: string;\n name: string;\n type: T;\n}\nexport type GlslValueFunction = GlslFunction;\nexport interface GlslPositionalFunction extends GlslFunction {\n inputShape: readonly number[];\n outputShape: readonly number[];\n}\n\nexport class GlslContext {\n constructor(\n public glContext: WebGLContext, public programInfo: ProgramInfo, public inputTextureLayouts: TextureLayout[],\n public outputTextureLayout: TextureLayout) {}\n}\nexport abstract class GlslLib {\n constructor(public context: GlslContext) {}\n abstract getFunctions(): {[name: string]: GlslLibRoutine};\n abstract getCustomTypes(): {[name: string]: string};\n}\n\n// abstraction to represent a GLSL library routine and it's dependencies\nexport class GlslLibRoutine {\n constructor(public routineBody: string, public dependencies?: string[]) {}\n}\n\n// abstraction to represent a GLSL library routine and it's dependencies AS GRAPH Nodes\n// this level of abstraction is used to topologically sort routines before fragment shade inclusion\nexport class GlslLibRoutineNode {\n dependencies: GlslLibRoutineNode[];\n routineBody: string;\n constructor(public name: string, routineBody?: string, dependencies?: GlslLibRoutineNode[]) {\n if (dependencies) {\n this.dependencies = dependencies;\n } else {\n this.dependencies = [];\n }\n\n if (routineBody) {\n this.routineBody = routineBody;\n }\n }\n addDependency(node: GlslLibRoutineNode) {\n if (node) {\n this.dependencies.push(node);\n }\n }\n}\n\n// topologically sort GLSL library routines (graph nodes abstraction) before shader script inclusion\nexport class TopologicalSortGlslRoutines {\n static returnOrderedNodes(nodes: GlslLibRoutineNode[]): GlslLibRoutineNode[] {\n if (!nodes || nodes.length === 0) {\n return [];\n }\n\n if (nodes.length === 1) {\n return nodes;\n }\n\n const cycleCheck = new Set();\n const alreadyTraversed = new Set();\n const result = new Array();\n\n this.createOrderedNodes(nodes, cycleCheck, alreadyTraversed, result);\n return result;\n }\n\n private static createOrderedNodes(\n graphNodes: GlslLibRoutineNode[], cycleCheck: Set, alreadyTraversed: Set,\n result: GlslLibRoutineNode[]) {\n for (let i = 0; i < graphNodes.length; ++i) {\n this.dfsTraverse(graphNodes[i], cycleCheck, alreadyTraversed, result);\n }\n }\n\n private static dfsTraverse(\n root: GlslLibRoutineNode, cycleCheck: Set, alreadyTraversed: Set, result: GlslLibRoutineNode[]) {\n // if this root has already been traversed return\n if (!root || alreadyTraversed.has(root.name)) {\n return;\n }\n\n // cyclic dependency has been detected\n if (cycleCheck.has(root.name)) {\n throw new Error('Cyclic dependency detected. Can\\'t topologically sort routines needed for shader.');\n }\n\n // hold this node to detect cycles if any\n cycleCheck.add(root.name);\n\n // traverse children in a dfs fashion\n const dependencies = root.dependencies;\n if (dependencies && dependencies.length > 0) {\n for (let i = 0; i < dependencies.length; ++i) {\n this.dfsTraverse(dependencies[i], cycleCheck, alreadyTraversed, result);\n }\n }\n\n // add to result holder\n result.push(root);\n\n // mark this node as traversed so that we don't traverse from this again\n alreadyTraversed.add(root.name);\n\n // release the hold\n cycleCheck.delete(root.name);\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {BroadcastUtil, ShapeUtil} from '../../../util';\nimport {FunctionType, GlslValueFunction} from '../glsl-definitions';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, TextureType} from '../types';\n\nexport function glslAdd(): GlslValueFunction {\n const name = 'add_';\n const body = `\n float ${name}(float a, float b) {\n return a + b;\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return v1 + v2;\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslDiv(): GlslValueFunction {\n const name = 'div_';\n const body = `\n float ${name}(float a, float b) {\n return a / b;\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return v1 / v2;\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslMul(): GlslValueFunction {\n const name = 'mul_';\n const body = `\n float ${name}(float a, float b) {\n return a * b;\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return v1 * v2;\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslSub(): GlslValueFunction {\n const name = 'sub_';\n const body = `\n float ${name}(float a, float b) {\n return a - b;\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return v1 - v2;\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslEqual(): GlslValueFunction {\n const name = 'equal_';\n const body = `\n float ${name}(float a, float b) {\n return float(a == b);\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return vec4(equal(v1, v2));\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslGreater(): GlslValueFunction {\n const name = 'greater_';\n const body = `\n float ${name}(float a, float b) {\n return float(a > b);\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return vec4( v1.r > v2.r ,\n v1.g > v2.g,\n v1.b > v2.b,\n v1.a > v2.a );\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslLess(): GlslValueFunction {\n const name = 'less_';\n const body = `\n float ${name}(float a, float b) {\n return float(a < b);\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return vec4( v1.r < v2.r ,\n v1.g < v2.g,\n v1.b < v2.b,\n v1.a < v2.a );\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslAnd(): GlslValueFunction {\n const name = 'and_';\n const body = `\n float ${name}(float a, float b) {\n return float( bool(a) && bool(b) );\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n bvec4 b1 = bvec4(v1);\n bvec4 b2 = bvec4(v2);\n return vec4( b1.r && b2.r ,\n b1.g && b2.g,\n b1.b && b2.b,\n b1.a && b2.a );\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslOr(): GlslValueFunction {\n const name = 'or_';\n const body = `\n float ${name}(float a, float b) {\n return float( bool(a) || bool(b) );\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n bvec4 b1 = bvec4(v1);\n bvec4 b2 = bvec4(v2);\n return vec4( b1.r || b2.r ,\n b1.g || b2.g,\n b1.b || b2.b,\n b1.a || b2.a );\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslXor(): GlslValueFunction {\n const name = 'xor_';\n const body = `\n float ${name}(float a, float b) {\n return float( bool(a) ^^ bool(b) );\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n bvec4 b1 = bvec4(v1);\n bvec4 b2 = bvec4(v2);\n return vec4( b1.r ^^ b2.r ,\n b1.g ^^ b2.g,\n b1.b ^^ b2.b,\n b1.a ^^ b2.a );\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslPow(): GlslValueFunction {\n return glslBuiltinBinary('pow');\n}\nexport function glslPRelu(): GlslValueFunction {\n const name = 'prelu_';\n const body = `\n float ${name}(float a, float b) {\n return a < 0.0 ? a * b: a;\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return vec4(\n v1.r < 0.0 ? v1.r * v2.r: v1.r,\n v1.g < 0.0 ? v1.g * v2.g: v1.g,\n v1.b < 0.0 ? v1.b * v2.b: v1.b,\n v1.a < 0.0 ? v1.a * v2.a: v1.a\n );\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\n\nfunction glslBuiltinBinary(fname: string): GlslValueFunction {\n const name = `${fname}_`;\n const body = `\n float ${name}(float a, float b) {\n return ${fname}(a, b);\n }\n vec4 ${name}(vec4 v1, vec4 v2) {\n return ${fname}(v1, v2);\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\n\nconst createBinaryProgramInfoLoader =\n (handler: WebGLInferenceHandler, inputs: Tensor[], glslFunc: GlslValueFunction,\n outputTensorType: Tensor.DataType = inputs[0].type, cacheKey?: string): ProgramInfoLoader => {\n const textureType = handler.session.pack ? TextureType.packed : TextureType.unpacked;\n return {\n name: glslFunc.name,\n inputNames: ['A', 'B'],\n inputTypes: [textureType, textureType],\n cacheHint: cacheKey,\n get: () => createBinaryProgramInfo(handler, inputs, glslFunc, outputTensorType)\n };\n };\n\nconst createBinaryProgramInfo =\n (handler: WebGLInferenceHandler, inputs: Tensor[], glslFunc: GlslValueFunction,\n outputTensorType: Tensor.DataType = inputs[0].type): ProgramInfo => {\n const textureType = handler.session.pack ? TextureType.packed : TextureType.unpacked;\n const isBroadcast = !ShapeUtil.areEqual(inputs[0].dims, inputs[1].dims);\n let outputShape = inputs[0].dims;\n\n const usePackedTexture = handler.session.pack;\n\n if (isBroadcast) {\n const calculatedShape = BroadcastUtil.calcShape(inputs[0].dims, inputs[1].dims, false);\n if (!calculatedShape) {\n throw new Error('Can\\'t perform binary op on the given tensors');\n }\n outputShape = calculatedShape;\n const outputRank = outputShape.length;\n const aRank = inputs[0].dims.length !== 0 ? inputs[0].dims.length : 1;\n const bRank = inputs[1].dims.length !== 0 ? inputs[1].dims.length : 1;\n const aBcast = inputs[0].dims.length !== 0 ? 'bcastIndices_A(indices, aindices);' : 'aindices[0] = 0;';\n const bBcast = inputs[1].dims.length !== 0 ? 'bcastIndices_B(indices, bindices);' : 'bindices[0] = 0;';\n\n const glsl = getGlsl(handler.session.backend.glContext.version);\n const shaderSource = usePackedTexture ? `\n ${glslFunc.body}\n void main() {\n vec4 a = getAAtOutCoords();\n vec4 b = getBAtOutCoords();\n vec4 result = ${glslFunc.name}(a, b);\n ${glsl.output} = result;\n }` :\n `\n ${glslFunc.body}\n float process(int indices[${outputRank}]) {\n int aindices[${aRank}];\n int bindices[${bRank}];\n ${aBcast}\n ${bBcast}\n return ${glslFunc.name}(_A(aindices), _B(bindices));\n }`;\n\n return {\n name: glslFunc.name,\n inputNames: ['A', 'B'],\n inputTypes: [textureType, textureType],\n output: {dims: outputShape, type: outputTensorType, textureType},\n shaderSource,\n hasMain: usePackedTexture\n };\n }\n const glsl = getGlsl(handler.session.backend.glContext.version);\n const shaderSource = `\n ${glslFunc.body}\n void main() {\n vec4 v1 = ${glsl.texture2D}(A, TexCoords);\n vec4 v2 = ${glsl.texture2D}(B, TexCoords);\n vec4 result = ${glslFunc.name}(v1, v2);\n ${glsl.output} = result;\n }\n `;\n\n return {\n name: glslFunc.name,\n inputNames: ['A', 'B'],\n inputTypes: [textureType, textureType],\n output: {dims: inputs[0].dims, type: outputTensorType, textureType},\n shaderSource,\n hasMain: true\n };\n };\n\nexport const add = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslAdd()), inputs)];\n\nexport const and = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslAnd(), 'bool'), inputs)];\n\nexport const div = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslDiv()), inputs)];\n\nexport const equal = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslEqual(), 'bool'), inputs)];\n\nexport const greater = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslGreater(), 'bool'), inputs)];\n\nexport const less = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslLess(), 'bool'), inputs)];\n\nexport const mul = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslMul()), inputs)];\n\nexport const or = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslOr(), 'bool'), inputs)];\n\nexport const pow = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslPow()), inputs)];\n\nexport const pRelu = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslPRelu()), inputs)];\n\nexport const sub = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslSub()), inputs)];\n\nexport const xor = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createBinaryProgramInfoLoader(handler, inputs, glslXor(), 'bool'), inputs)];\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ProtoUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nexport const cast: OperatorImplementation =\n (handler: WebGLInferenceHandler, inputs: Tensor[], to: Tensor.DataType): Tensor[] => {\n validateInputs(inputs);\n return [handler.cast(inputs[0], to)];\n };\n\nexport const parseCastAttributes: OperatorInitialization = (node: Graph.Node): Tensor.DataType =>\n ProtoUtil.tensorDataTypeFromProto(node.attributes.getInt('to'));\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Cast requires 1 input.');\n }\n\n if (inputs[0].type === 'string') {\n throw new Error('Invalid input type.');\n }\n};", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\nimport {getCoordsDataType, getGlChannels} from '../utils';\n\nimport {ConcatAttributes} from './concat';\nimport {getChannels, unpackFromChannel} from './packing-utils';\n\nconst createPackedConcatProgramMetadata = (inputCount: number, cacheHint: string) => ({\n name: 'Concat (packed)',\n inputNames: Array.from({length: inputCount}, (_v, i) => `X${i}`),\n inputTypes: Array(inputCount).fill(TextureType.packed),\n cacheHint\n});\n\nconst createPackedConcatProgramInfo =\n (handler: WebGLInferenceHandler, metadata: ProgramMetadata, inputs: Tensor[], axis: number): ProgramInfo => {\n const inputShape = inputs[0].dims.slice();\n if (axis >= inputShape.length || axis < (-1 * inputShape.length)) {\n throw new Error('axis specified for concat doesn\\'t match input dimensionality');\n }\n if (axis < 0) {\n axis = inputShape.length + axis;\n }\n // ensure all of the non-concatenated axes match each other\n // calculate the shape of the output tensor while we do that\n const outputShape = inputShape.slice(0);\n for (let i = 1; i < inputs.length; i++) {\n const dataNShape = inputs[i].dims.slice();\n for (let axisIndex = 0; axisIndex < inputShape.length; axisIndex++) {\n // add to the placeholder for computing output shape\n if (axisIndex === axis) {\n outputShape[axis] += dataNShape[axisIndex];\n }\n // ensure all non-cancatenated axes match each other\n else if (inputShape[axisIndex] !== dataNShape[axisIndex]) {\n throw new Error('non concat dimensions must match');\n }\n }\n }\n\n const rank = outputShape.length;\n const coords = getChannels('coords', rank);\n const dtype = getCoordsDataType(rank);\n const unpackChannel = unpackFromChannel();\n\n const shapes = inputs.map(i => i.dims);\n const channels = getGlChannels(rank);\n const offsets: number[] = new Array(shapes.length - 1);\n\n offsets[0] = shapes[0][axis];\n for (let i = 1; i < offsets.length; i++) {\n offsets[i] = offsets[i - 1] + shapes[i][axis];\n }\n\n const channel = channels[axis];\n const lastChannels = channels.slice(-2);\n const allChannels = channels.join();\n\n let getValueSnippet = `if (${channel} < ${offsets[0]}) {\n return getChannel(\n getX0(${allChannels}), vec2(${lastChannels.join()}));\n }`;\n for (let i = 1; i < offsets.length; i++) {\n const shift = offsets[i - 1];\n getValueSnippet += `\n if (${channel} < ${offsets[i]} && ${channel} >= ${offsets[i - 1]}) {\n return getChannel(\n getX${i}(${getShiftedChannelsSnippet(channels, channel, shift)}),\n vec2(${getShiftedChannelsSnippet(lastChannels, channel, shift)}));\n }`;\n }\n const lastIndex = offsets.length;\n const shift = offsets[offsets.length - 1];\n getValueSnippet += `\n return getChannel(\n getX${lastIndex}(${getShiftedChannelsSnippet(channels, channel, shift)}),\n vec2(${getShiftedChannelsSnippet(lastChannels, channel, shift)}));`;\n\n const glsl = getGlsl(handler.session.backend.glContext.version);\n\n const shaderSource = `\n ${unpackChannel}\n float getValue(${channels.map(x => 'int ' + x)}) {\n ${getValueSnippet}\n }\n\n void main() {\n ${dtype} coords = getOutputCoords();\n int lastDim = coords.${channels[rank - 1]};\n coords.${channels[rank - 1]} = coords.${channels[rank - 2]};\n coords.${channels[rank - 2]} = lastDim;\n\n vec4 result = vec4(getValue(${coords}), 0., 0., 0.);\n\n ${coords[rank - 1]} = ${coords[rank - 1]} + 1;\n if (${coords[rank - 1]} < ${outputShape[rank - 1]}) {\n result.g = getValue(${coords});\n }\n\n ${coords[rank - 2]} = ${coords[rank - 2]} + 1;\n if (${coords[rank - 2]} < ${outputShape[rank - 2]}) {\n result.a = getValue(${coords});\n }\n\n ${coords[rank - 1]} = ${coords[rank - 1]} - 1;\n if (${coords[rank - 2]} < ${outputShape[rank - 2]} &&\n ${coords[rank - 1]} < ${outputShape[rank - 1]}) {\n result.b = getValue(${coords});\n }\n ${glsl.output} = result;\n }\n `;\n\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.packed},\n shaderSource,\n hasMain: true,\n };\n };\n\nexport const createPackedConcatProgramInfoLoader =\n (handler: WebGLInferenceHandler, inputs: Tensor[], attributes: ConcatAttributes): ProgramInfoLoader => {\n const metadata = createPackedConcatProgramMetadata(inputs.length, attributes.cacheKey);\n return {...metadata, get: () => createPackedConcatProgramInfo(handler, metadata, inputs, attributes.axis)};\n };\n\nconst getShiftedChannelsSnippet = (channels: string[], channel: string, shift: number): string => {\n const channelIdx = channels.indexOf(channel);\n const res = channels.map((c, idx) => {\n if (idx === channelIdx) {\n return `${c} - ${shift}`;\n } else {\n return c;\n }\n });\n return res.join();\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nimport {createPackedConcatProgramInfoLoader} from './concat-packed';\n\nexport interface ConcatAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n}\n\nexport const concat: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ConcatAttributes): Tensor[] => {\n validateInputs(inputs);\n if (inferenceHandler.session.pack && inputs[0].dims.length > 1) {\n const output =\n inferenceHandler.run(createPackedConcatProgramInfoLoader(inferenceHandler, inputs, attributes), inputs);\n return [output];\n } else {\n const output =\n inferenceHandler.run(createUnpackedConcatProgramInfoLoader(inferenceHandler, inputs, attributes), inputs);\n return [output];\n }\n };\n\nconst createUnpackedConcatProgramMetadata = (inputCount: number, cacheHint: string) => ({\n name: 'Concat',\n inputNames: Array.from({length: inputCount}, (_v, i) => `X${i}`),\n inputTypes: Array(inputCount).fill(TextureType.unpacked),\n cacheHint\n});\n\nconst createUnpackedConcatProgramInfo =\n (_handler: WebGLInferenceHandler, metadata: ProgramMetadata, inputs: Tensor[], axis: number): ProgramInfo => {\n const inputShape = inputs[0].dims.slice();\n if (axis >= inputShape.length || axis < (-1 * inputShape.length)) {\n throw new Error('axis specified for concat doesn\\'t match input dimensionality');\n }\n if (axis < 0) {\n axis = inputShape.length + axis;\n }\n // ensure all of the non-concatenated axes match each other\n // calculate the shape of the output tensor while we do that\n const outputShape = inputShape.slice(0);\n for (let i = 1; i < inputs.length; i++) {\n const dataNShape = inputs[i].dims.slice();\n for (let axisIndex = 0; axisIndex < inputShape.length; axisIndex++) {\n // add to the placeholder for computing output shape\n if (axisIndex === axis) {\n outputShape[axis] += dataNShape[axisIndex];\n }\n // ensure all non-cancatenated axes match each other\n else if (inputShape[axisIndex] !== dataNShape[axisIndex]) {\n throw new Error('non concat dimensions must match');\n }\n }\n }\n\n const rank = outputShape.length;\n\n const sizeInConcatAxis = new Array(inputs.length);\n let previousSum = 0;\n for (let i = 0; i < sizeInConcatAxis.length; ++i) {\n previousSum += inputs[i].dims[axis];\n sizeInConcatAxis[i] = previousSum;\n }\n\n let getTextureIndexWhereDataResidesMethod = '';\n // in most cases linear search is sufficient, as in most scenarios, only 2 tensors are concatenated\n if (inputs.length < 5) {\n getTextureIndexWhereDataResidesMethod = getTextureIndexWhereDataResidesLinearSearch(sizeInConcatAxis);\n } else {\n getTextureIndexWhereDataResidesMethod = getTextureIndexWhereDataResidesBinarySearch(sizeInConcatAxis);\n }\n\n const fetchDataFromCorrectTextureMethod = getFetchDataFromCorrectTextureMethod(inputs.length, rank);\n const getSizeInConcatAxisValueFromIndexMethod = getGetSizeInConcatAxisValueFromIndexMethod(sizeInConcatAxis);\n const shaderSource = `\n ${fetchDataFromCorrectTextureMethod}\n ${getSizeInConcatAxisValueFromIndexMethod}\n ${getTextureIndexWhereDataResidesMethod}\n float process(int indices[${rank}]) {\n int textureIndex = getTextureWhereDataResides (indices[${axis}]);\n\n if(textureIndex != 0) {\n indices[${axis}] = indices[${axis}] - int(getSizeInConcatAxisValueFromIndex(textureIndex-int(1)));\n }\n\n return fetchDataFromCorrectTexture(textureIndex, indices);\n }`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource,\n };\n };\n\nconst createUnpackedConcatProgramInfoLoader =\n (handler: WebGLInferenceHandler, inputs: Tensor[], attributes: ConcatAttributes): ProgramInfoLoader => {\n const metadata = createUnpackedConcatProgramMetadata(inputs.length, attributes.cacheKey);\n return {...metadata, get: () => createUnpackedConcatProgramInfo(handler, metadata, inputs, attributes.axis)};\n };\n\nconst getTextureIndexWhereDataResidesLinearSearch = (sizeInConcatAxis: number[]): string => {\n const searchAxis = sizeInConcatAxis.map((size, i) => `if(index<${size}) {return ${i};}\n`);\n return `int getTextureWhereDataResides(int index) {\n ${searchAxis.join('')}\n }`;\n};\n\n// TODO: Implement BinarySearch in GLSL\nconst getTextureIndexWhereDataResidesBinarySearch = (sizeInConcatAxis: number[]): string =>\n getTextureIndexWhereDataResidesLinearSearch(sizeInConcatAxis);\n\nconst getFetchDataFromCorrectTextureMethod = (numberOfTensors: number, tensorRank: number) => {\n const codeLines: string[] = [`float fetchDataFromCorrectTexture(int textureIndex, int indices[${tensorRank}]) {`];\n for (let i = 0; i < numberOfTensors; ++i) {\n if (i === 0) {\n codeLines.push(\n '\\t' +\n `if (textureIndex == ${i}) { return _X${i}(indices); }`);\n } else if (i === numberOfTensors - 1) {\n codeLines.push(\n '\\t' +\n `else { return _X${i}(indices); }`);\n } else {\n codeLines.push(\n '\\t' +\n `else if (textureIndex == ${i}) { return _X${i}(indices); }`);\n }\n }\n codeLines.push(\n '\\t' +\n '}');\n return codeLines.join('\\n');\n};\n\nconst getGetSizeInConcatAxisValueFromIndexMethod = (sizeInConcatAxis: number[]): string => {\n const codeLines: string[] = ['int getSizeInConcatAxisValueFromIndex(int index) {'];\n for (let i = 0; i < sizeInConcatAxis.length; ++i) {\n if (i === 0) {\n codeLines.push(\n '\\t' +\n `if (index == ${i}) { return ${sizeInConcatAxis[i]}; }`);\n } else if (i === sizeInConcatAxis.length - 1) {\n codeLines.push(\n '\\t' +\n `else { return ${sizeInConcatAxis[i]}; }`);\n } else {\n codeLines.push(\n '\\t' +\n `else if (index == ${i}) { return ${sizeInConcatAxis[i]}; }`);\n }\n }\n codeLines.push(\n '\\t' +\n '}');\n\n return codeLines.join('\\n');\n};\n\nexport const parseConcatAttributes: OperatorInitialization = (node: Graph.Node): ConcatAttributes =>\n createAttributeWithCacheKey({axis: node.attributes.getInt('axis')});\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('too few inputs');\n }\n\n const inputType = inputs[0].type;\n const inputDimensionality = inputs[0].dims.length;\n\n // TODO: Support string concat\n if (inputType === 'string') {\n throw new Error('string tensor is not supported yet');\n }\n\n for (const input of inputs) {\n // make sure types of all inputs match\n if (input.type !== inputType) {\n throw new Error('input tensors should be one type');\n }\n\n // make sure the dimensionality of all inputs are the same\n if (input.dims.length !== inputDimensionality) {\n throw new Error('input tensors should have the same shape');\n }\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {Tensor} from '../../../tensor';\nimport {MAX_CLIP, MIN_CLIP} from '../../../util';\nimport {FunctionType, GlslValueFunction} from '../glsl-definitions';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nexport function glslAbs(): GlslValueFunction {\n return glslBuiltinUnary('abs');\n}\nexport function glslAcos(): GlslValueFunction {\n return glslBuiltinUnary('acos');\n}\nexport function glslAsin(): GlslValueFunction {\n return glslBuiltinUnary('asin');\n}\nexport function glslAtan(): GlslValueFunction {\n return glslBuiltinUnary('atan');\n}\nexport function glslCeil(): GlslValueFunction {\n return glslBuiltinUnary('ceil');\n}\nexport function glslCos(): GlslValueFunction {\n return glslBuiltinUnary('cos');\n}\nexport function glslElu(alpha: number): GlslValueFunction {\n const name = 'elu';\n const body = `\n const float alpha = float(${alpha});\n\n float ${name}_(float a) {\n return a >= 0.0 ? a: (exp(a) - 1.0) * alpha;\n }\n vec4 ${name}_(vec4 v) {\n return vec4(${name}_(v.x), ${name}_(v.y), ${name}_(v.z), ${name}_(v.w));\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslExp(): GlslValueFunction {\n return glslBuiltinUnary('exp');\n}\nexport function glslFloor(): GlslValueFunction {\n return glslBuiltinUnary('floor');\n}\nexport function glslClip(min: number, max: number): GlslValueFunction {\n const name = 'clip';\n const body = `\n const float min = float(${min});\n const float max = float(${max});\n\n float ${name}_(float a) {\n return clamp(a, min, max);\n }\n vec4 ${name}_(vec4 v) {\n return clamp(v, min, max);\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslIdentity(): GlslValueFunction {\n const name = 'indentity';\n const body = `\n float ${name}_(float a) {\n return a;\n }\n vec4 ${name}_(vec4 v) {\n return v;\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslLeakyRelu(alpha: number): GlslValueFunction {\n const name = 'leakyRelu';\n const body = `\n const float alpha = float(${alpha});\n\n float ${name}_(float a) {\n return a < 0.0 ? a * alpha : a;\n }\n vec4 ${name}_(vec4 v) {\n return vec4(${name}_(v.x), ${name}_(v.y), ${name}_(v.z), ${name}_(v.w));\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslLog(): GlslValueFunction {\n return glslBuiltinUnary('log');\n}\nexport function glslNeg(): GlslValueFunction {\n const name = 'neg';\n const body = `\n float ${name}_(float a) {\n return -a;\n }\n vec4 ${name}_(vec4 v) {\n return -v;\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslNot(): GlslValueFunction {\n const name = 'not';\n const body = `\n float ${name}_(float a) {\n return float( ! bool(a) );\n }\n bool ${name}_(bool a) {\n return !a;\n }\n vec4 ${name}_(vec4 v) {\n return vec4(!bool(v.x), !bool(v.y), !bool(v.z), !bool(v.w));\n }\n bvec4 ${name}_(bvec4 v) {\n return bvec4(!v.x, !v.y, !v.z, !v.w);\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslSin(): GlslValueFunction {\n return glslBuiltinUnary('sin');\n}\nexport function glslRelu(): GlslValueFunction {\n const name = 'relu';\n const body = `\n float ${name}_(float a) {\n return max( a, 0.0 );\n }\n vec4 ${name}_(vec4 v) {\n return max( v, 0.0 );\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslSigmoid(): GlslValueFunction {\n const name = 'sigmoid';\n const body = `\n float ${name}_(float a) {\n return 1.0 / (1.0 + exp(-a));\n }\n vec4 ${name}_(vec4 v) {\n return 1.0 / (1.0 + exp(-v));\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nexport function glslSqrt(): GlslValueFunction {\n return glslBuiltinUnary('sqrt');\n}\nexport function glslTan(): GlslValueFunction {\n return glslBuiltinUnary('tan');\n}\nexport function glslTanh(): GlslValueFunction {\n const name = 'tanh';\n const body = `\n float ${name}_(float a) {\n a = clamp(a, -10., 10.);\n a = exp(2.*a);\n return (a - 1.) / (a + 1.);\n }\n vec4 ${name}_(vec4 v) {\n v = clamp(v, -10., 10.);\n v = exp(2.*v);\n return (v - 1.) / (v + 1.);\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\nfunction glslBuiltinUnary(name: string): GlslValueFunction {\n const body = `\n float ${name}_(float a) {\n return ${name}(a);\n }\n vec4 ${name}_(vec4 v) {\n return ${name}(v);\n }\n `;\n return {body, name, type: FunctionType.ValueBased};\n}\n\n/////\n/////\n/////\n\nconst createElementwiseProgramInfo =\n (handler: WebGLInferenceHandler, metadata: ProgramMetadata, input: Tensor, glslFunc: GlslValueFunction):\n ProgramInfo => {\n const textureType = handler.session.pack ? TextureType.packed : TextureType.unpacked;\n const glsl = getGlsl(handler.session.backend.glContext.version);\n return {\n ...metadata,\n output: {dims: input.dims, type: input.type, textureType},\n shaderSource: `\n ${glslFunc.body}\n void main() {\n vec4 v = ${glsl.texture2D}(A, TexCoords);\n v = ${glslFunc.name}_(v);\n ${glsl.output} = v;\n }\n `,\n hasMain: true\n };\n };\n\nconst createElementwiseProgramInfoLoader =\n (handler: WebGLInferenceHandler, input: Tensor, glslFunc: GlslValueFunction, cacheKey?: string):\n ProgramInfoLoader => {\n const textureType = handler.session.pack ? TextureType.packed : TextureType.unpacked;\n const metadata = {name: glslFunc.name, inputTypes: [textureType], inputNames: ['A'], cacheHint: cacheKey};\n return {...metadata, get: () => createElementwiseProgramInfo(handler, metadata, input, glslFunc)};\n };\n\nexport const abs = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslAbs()), inputs)];\n\nexport const acos = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslAcos()), inputs)];\n\nexport const asin = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslAsin()), inputs)];\n\nexport const atan = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslAtan()), inputs)];\n\nexport interface ClipAttributes extends AttributeWithCacheKey {\n readonly min: number;\n readonly max: number;\n}\n\nexport const clip =\n (handler: WebGLInferenceHandler, inputs: Tensor[], attributes: ClipAttributes): Tensor[] => [handler.run(\n createElementwiseProgramInfoLoader(\n handler, inputs[0], glslClip(attributes.min, attributes.max), attributes.cacheKey),\n inputs)];\n\nexport const parseClipAttributes = (node: Graph.Node): ClipAttributes => createAttributeWithCacheKey(\n {min: node.attributes.getFloat('min', MIN_CLIP), max: node.attributes.getFloat('max', MAX_CLIP)});\n\nexport const clipV11 = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n const attributes = generateClipAttributesFromInputs(handler, inputs);\n return clip(handler, [inputs[0]], attributes);\n};\n\nconst generateClipAttributesFromInputs = (handler: WebGLInferenceHandler, inputs: Tensor[]): ClipAttributes => {\n if (inputs.length >= 3 &&\n (!handler.session.isInitializer(inputs[1].dataId) || !handler.session.isInitializer(inputs[2].dataId))) {\n throw new Error('dynamic clip attributes are not allowed');\n }\n\n const min = (inputs.length >= 3) ? inputs[1].numberData[0] : MIN_CLIP;\n const max = (inputs.length >= 3) ? inputs[2].numberData[0] : MAX_CLIP;\n return createAttributeWithCacheKey({min, max});\n};\n\nexport const ceil = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslCeil()), inputs)];\n\nexport const cos = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslCos()), inputs)];\n\nexport interface EluAttributes extends AttributeWithCacheKey {\n readonly alpha: number;\n}\n\nexport const elu =\n (handler: WebGLInferenceHandler, inputs: Tensor[], attributes: EluAttributes): Tensor[] => [handler.run(\n createElementwiseProgramInfoLoader(handler, inputs[0], glslElu(attributes.alpha), attributes.cacheKey),\n inputs)];\n\nexport const parseEluAttributes = (node: Graph.Node): EluAttributes =>\n createAttributeWithCacheKey({alpha: node.attributes.getFloat('alpha', 1.0)});\n\nexport const exp = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslExp()), inputs)];\n\nexport const floor = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslFloor()), inputs)];\n\nexport const identity = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslIdentity()), inputs)];\n\nexport interface LeakyReluAttributes extends AttributeWithCacheKey {\n readonly alpha: number;\n}\n\nexport const leakyRelu =\n (handler: WebGLInferenceHandler, inputs: Tensor[], attributes: LeakyReluAttributes): Tensor[] => [handler.run(\n createElementwiseProgramInfoLoader(handler, inputs[0], glslLeakyRelu(attributes.alpha), attributes.cacheKey),\n inputs)];\n\nexport const parseLeakyReluAttributes = (node: Graph.Node): LeakyReluAttributes =>\n createAttributeWithCacheKey({alpha: node.attributes.getFloat('alpha', 0.01)});\n\nexport const log = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslLog()), inputs)];\n\nexport const neg = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslNeg()), inputs)];\n\nexport const not = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslNot()), inputs)];\n\nexport const relu = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslRelu()), inputs)];\n\nexport const sigmoid = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslSigmoid()), inputs)];\n\nexport const sin = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslSin()), inputs)];\n\nexport const sqrt = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslSqrt()), inputs)];\n\nexport const tan = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslTan()), inputs)];\n\nexport const tanh = (handler: WebGLInferenceHandler, inputs: Tensor[]):\n Tensor[] => [handler.run(createElementwiseProgramInfoLoader(handler, inputs[0], glslTanh()), inputs)];\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Attribute} from '../../../attribute';\nimport {MAX_CLIP, MIN_CLIP} from '../../../util';\nimport {GlslValueFunction} from '../glsl-definitions';\n\nimport {glslClip, glslRelu, glslSigmoid} from './unary-op';\n\nexport interface InternalActivationAttributes {\n readonly activation: string;\n readonly clipMin?: number;\n readonly clipMax?: number;\n readonly activationCacheKey: string;\n}\n\nexport function getActivationSnippet(attributes: InternalActivationAttributes) {\n let func: GlslValueFunction;\n switch (attributes.activation) {\n case 'Relu':\n func = glslRelu();\n break;\n case 'Sigmoid':\n func = glslSigmoid();\n break;\n case 'Clip':\n func = glslClip(attributes.clipMin!, attributes.clipMax!);\n break;\n // TODO: adding other activations that can be fused.\n default:\n return {activationFunction: '', applyActivation: ''};\n }\n\n const activationName = func.name;\n const activationFunction = func.body;\n const applyActivation = `value = ${activationName}_(value);`;\n return {activationFunction, applyActivation};\n}\n\nexport const parseInternalActivationAttributes = (attributes: Attribute): InternalActivationAttributes => {\n const activation = attributes.getString('activation', '');\n\n if (activation === 'Clip') {\n const [clipMin, clipMax] = attributes.getFloats('activation_params', [MIN_CLIP, MAX_CLIP]);\n return {activation, clipMax, clipMin, activationCacheKey: `${activation}:${clipMin},${clipMax}`};\n }\n return {activation, activationCacheKey: activation};\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Logger} from '../../../instrument';\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nimport {calculateOutputShape, ConvAttributes} from './conv';\nimport {getActivationSnippet} from './fuse-utils';\n\nconst createUnpackedGroupedConvProgramMetadata = (hasBias: boolean, cacheHint: string): ProgramMetadata => ({\n name: 'GroupedConv',\n inputNames: hasBias ? ['X', 'W', 'Bias'] : ['X', 'W'],\n inputTypes: hasBias ? [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked] :\n [TextureType.unpacked, TextureType.unpacked],\n cacheHint\n});\n\nconst createUnpackedGroupedConvProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], metadata: ProgramMetadata,\n attributes: ConvAttributes): ProgramInfo => {\n const hasBias = inputs.length > 2;\n const processBias = hasBias ? 'value += getBias(output_channel);' : '';\n const xShape = inputs[0].dims.slice();\n const wShape = inputs[1].dims.slice();\n const outputChannelsPerGroup = wShape[0] / attributes.group;\n Logger.verbose(\n 'GroupedConv',\n `autpPad:${attributes.autoPad}, dilations:${attributes.dilations}, group:${attributes.group}, kernelShape:${\n attributes.kernelShape}, pads:${attributes.pads}, strides:${attributes.strides}`);\n const outputShape =\n calculateOutputShape(xShape, wShape, attributes.dilations, attributes.pads, attributes.strides);\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const {activationFunction, applyActivation} = getActivationSnippet(attributes);\n\n const shaderSource = `\n const ivec2 strides = ivec2(${attributes.strides[0]}, ${attributes.strides[1]});\n const ivec2 pads = ivec2(${attributes.pads[0]}, ${attributes.pads[1]});\n ${activationFunction}\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n int output_channel = coords.y;\n ivec2 xRCCorner = coords.zw * strides - pads;\n int group_id = output_channel / ${outputChannelsPerGroup};\n\n float value = 0.0;\n for (int wInChannel = 0; wInChannel < ${wShape[1]}; wInChannel++) {\n int input_channel = group_id * ${wShape[1]} + wInChannel;\n for (int wHeight = 0; wHeight < ${wShape[2]}; wHeight++) {\n int xHeight = xRCCorner.x + wHeight * ${attributes.dilations[0]};\n\n if (xHeight < 0 || xHeight >= ${xShape[2]}) {\n continue;\n }\n\n for (int wWidth = 0; wWidth < ${wShape[3]}; wWidth++) {\n int xWidth = xRCCorner.y + wWidth * ${attributes.dilations[1]};\n if (xWidth < 0 || xWidth >= ${xShape[3]}) {\n continue;\n }\n\n float xVal = getX(batch, input_channel, xWidth, xHeight);\n float wVal = getW(output_channel, wInChannel, wWidth, wHeight);\n value += xVal*wVal;\n }\n }\n }\n ${processBias}\n ${applyActivation}\n ${glsl.output} = vec4(value, .0, .0, .0);\n }\n`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource,\n hasMain: true,\n };\n };\n\nexport const createUnpackedGroupedConvProgramInfoLoader =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], attributes: ConvAttributes):\n ProgramInfoLoader => {\n const metadata = createUnpackedGroupedConvProgramMetadata(inputs.length > 2, attributes.cacheKey);\n return {\n ...metadata,\n get: () => createUnpackedGroupedConvProgramInfo(inferenceHandler, inputs, metadata, attributes)\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nimport {ConvAttributes} from './conv';\nimport {unpackFromChannel} from './packing-utils';\n\nconst createPackedIm2ColProgramMetadata = (cacheHint: string) => ({\n name: 'Im2Col (packed)',\n inputNames: ['A'],\n inputTypes: [TextureType.packed],\n cacheHint,\n});\n\nconst createPackedIm2ColProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, metadata: ProgramMetadata, x: Tensor, w: Tensor,\n outputShape: readonly number[], attributes: ConvAttributes): ProgramInfo => {\n const xshape = x.dims;\n const wshape = w.dims;\n const rowDim = 2;\n const colDim = 3;\n const rank = outputShape.length;\n const im2colShape = [wshape[1] * wshape[2] * wshape[3], outputShape[2] * outputShape[3]];\n const kernelSize = wshape[2] * wshape[3];\n const unpackChannel = unpackFromChannel();\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n let unrolled = '';\n\n for (let row = 0; row <= 1; row++) {\n for (let col = 0; col <= 1; col++) {\n unrolled += `\n blockIndex = rc.x + ${col};\n pos = rc.y + ${row};\n\n if(blockIndex < ${im2colShape[1]} && pos < ${im2colShape[0]}) {\n offsetY = int(blockIndex / (${outputShape[rank - 1]})) * ${attributes.strides[0]} -\n ${attributes.pads[0]};\n d0 = offsetY + ${attributes.dilations[0]} * (imod(pos, ${kernelSize}) / ${wshape[2]});\n\n if(d0 < ${xshape[rowDim]} && d0 >= 0) {\n offsetX = imod(blockIndex, ${outputShape[rank - 1]}) * ${attributes.strides[1]} -\n ${attributes.pads[1]};\n d1 = offsetX + ${attributes.dilations[1]} * imod(imod(pos, ${kernelSize}), ${wshape[2]});\n\n if(d1 < ${xshape[colDim]} && d1 >= 0) {\n\n ch = int(float(pos)/ ${kernelSize}.);\n innerDims = vec2(d0, d1);\n result[${row * 2 + col}] = getChannel(\n getA(0, ch, int(innerDims.x),\n int(innerDims.y)), innerDims);\n }\n }\n }\n\n `;\n }\n }\n\n const shaderSource = `\n ${unpackChannel}\n\n void main() {\n ivec2 rc = getOutputCoords();\n vec4 result = vec4(0.0);\n int blockIndex, pos, offsetY, d0, offsetX, d1, ch;\n vec2 innerDims;\n ${unrolled}\n ${glsl.output} = result;\n }\n `;\n return {\n ...metadata,\n output: {dims: im2colShape, type: x.type, textureType: TextureType.packed},\n shaderSource,\n hasMain: true\n };\n };\n\nexport const createPackedIm2ColProgramInfoLoader =\n (inferenceHandler: WebGLInferenceHandler, x: Tensor, w: Tensor, outputShape: readonly number[],\n attributes: ConvAttributes): ProgramInfoLoader => {\n const metadata = createPackedIm2ColProgramMetadata(attributes.cacheKey);\n return {\n ...metadata,\n get: () => createPackedIm2ColProgramInfo(inferenceHandler, metadata, x, w, outputShape, attributes)\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {BroadcastUtil, ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\nimport {getCoordsDataType, getGlChannels} from '../utils';\n\nimport {getActivationSnippet, InternalActivationAttributes, parseInternalActivationAttributes} from './fuse-utils';\nimport {createPackedMatmulProgramInfoLoader} from './matmul-pack';\n\nexport const matMul: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: InternalActivationAttributes): Tensor[] => {\n validateInputs(inputs);\n\n if (inferenceHandler.session.pack) {\n return [inferenceHandler.run(\n createPackedMatmulProgramInfoLoader(inferenceHandler, inputs, attributes), inputs)];\n } else {\n return [inferenceHandler.run(createMatmulProgramInfoLoader(inputs, attributes), inputs)];\n }\n };\n\nexport const parseMatMulAttributes: OperatorInitialization =\n (node: Graph.Node): InternalActivationAttributes => parseInternalActivationAttributes(node.attributes);\n\nconst createMatmulProgramMetadata = (hasBias: boolean, cacheHint: string) => ({\n name: 'MatMul',\n inputNames: hasBias ? ['A', 'B', 'Bias'] : ['A', 'B'],\n inputTypes: hasBias ? [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked] :\n [TextureType.unpacked, TextureType.unpacked],\n cacheHint\n});\n\nfunction createMatmulProgramInfo(\n metadata: ProgramMetadata, inputs: Tensor[], activationAttributes: InternalActivationAttributes): ProgramInfo {\n const aShape = inputs[0].dims;\n const bShape = inputs[1].dims;\n const outputShape = BroadcastUtil.calcShape(aShape, bShape, true);\n if (!outputShape) {\n throw new Error('Can\\'t use matmul on the given tensors');\n }\n const coordsDataType = getCoordsDataType(outputShape.length);\n const allGlChannels = getGlChannels();\n const {activationFunction, applyActivation} = getActivationSnippet(activationAttributes);\n\n const hasBias = inputs.length > 2;\n const processBias = hasBias ? 'value += getBiasForMatmul();' : '';\n const getBiasForMatmulSnippet =\n hasBias ? `${getBiasForMatmul(coordsDataType, allGlChannels, inputs[2].dims, outputShape, false)}` : '';\n\n const rank = outputShape.length;\n const arank = aShape.length;\n const brank = bShape.length;\n const sharedDim = aShape[aShape.length - 1];\n const shaderSource = `\n ${activationFunction}\n ${getBiasForMatmulSnippet}\n float process(int indices[${rank}]) {\n int a[${arank}];\n int b[${brank}];\n bcastMatmulIndices_A(indices, a);\n bcastMatmulIndices_B(indices, b);\n\n float value;\n for (int k=0; k<${sharedDim}; ++k) {\n a[${arank - 1}] = k;\n b[${brank - 2}] = k;\n value += _A(a) * _B(b);\n }\n ${processBias}\n ${applyActivation}\n return value;\n }`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource,\n };\n}\n\nexport function createMatmulProgramInfoLoader(\n inputs: Tensor[], activationAttributes: InternalActivationAttributes): ProgramInfoLoader {\n const metadata = createMatmulProgramMetadata(inputs.length > 2, activationAttributes.activationCacheKey);\n return {...metadata, get: () => createMatmulProgramInfo(metadata, inputs, activationAttributes)};\n}\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('MatMul requires 2 inputs.');\n }\n\n if (inputs[0].dims[inputs[0].dims.length - 1] !== inputs[1].dims[inputs[1].dims.length - 2]) {\n throw new Error('shared dimension does not match.');\n }\n\n if ((inputs[0].type !== 'float32' && inputs[0].type !== 'float64') ||\n (inputs[1].type !== 'float32' && inputs[1].type !== 'float64')) {\n throw new Error('inputs should be float type');\n }\n\n if (inputs[0].type !== inputs[1].type) {\n throw new Error('inputs types should match');\n }\n};\n\nexport function getBiasForMatmul(\n coordsDataType: string, allGlChannels: readonly string[], inShape: readonly number[], outShape: readonly number[],\n isPacked: boolean): string {\n let unpackedCoordsSnippet = '';\n const inRank = inShape.length;\n const outRank = outShape.length;\n const rankDiff = outRank - inRank;\n if (outRank < 2 && inRank > 0) {\n unpackedCoordsSnippet = 'coords';\n } else {\n unpackedCoordsSnippet = inShape.map((_s, i) => `coords.${allGlChannels[i + rankDiff]}`).join(', ');\n }\n const broadcastDims = BroadcastUtil.getBroadcastDims(inShape, outShape);\n const coordsSnippet = broadcastDims.map(d => `coords.${allGlChannels[d + rankDiff]} = 0;`).join('\\n');\n const inSize = ShapeUtil.size(inShape);\n const isInputScalar = inSize === 1;\n let output = 'vec4(outputValue.xx, outputValue.yy)';\n if (isInputScalar) {\n output = 'vec4(outputValue.x)';\n }\n const getBiasForMatmulSource = isPacked ? `\nvec4 getBiasForMatmul() {\n ${coordsDataType} coords = getOutputCoords();\n ${coordsSnippet}\n vec4 outputValue = getBias(${unpackedCoordsSnippet});\n return ${output};\n}` :\n `\nfloat getBiasForMatmul() {\n ${coordsDataType} coords = getOutputCoords();\n ${coordsSnippet}\n return getBias(coords.x);\n}`;\n\n return getBiasForMatmulSource;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {BroadcastUtil, ShapeUtil} from '../../../util';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\nimport {getCoordsDataType, getGlChannels} from '../utils';\n\nimport {getActivationSnippet, InternalActivationAttributes} from './fuse-utils';\nimport {getBiasForMatmul} from './matmul';\n\nconst createPackedMatmulProgramMetadata = (hasBias: boolean, cacheHint: string) => ({\n name: 'MatMul (packed)',\n inputNames: hasBias ? ['A', 'B', 'Bias'] : ['A', 'B'],\n inputTypes: hasBias ? [TextureType.packed, TextureType.packed, TextureType.packed] :\n [TextureType.packed, TextureType.packed],\n cacheHint\n});\n\nconst createPackedMatmulProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, metadata: ProgramMetadata, inputs: Tensor[],\n activationAttributes: InternalActivationAttributes): ProgramInfo => {\n const hasBias = inputs.length > 2;\n const processBias = hasBias ? 'value += getBiasForMatmul();' : '';\n const aShape = inputs[0].dims;\n const bShape = inputs[1].dims;\n const outputShape = BroadcastUtil.calcShape(aShape, bShape, true);\n const isBroadcast = !ShapeUtil.areEqual(inputs[0].dims, inputs[1].dims);\n\n if (!outputShape) {\n throw new Error('Can\\'t use matmul on the given tensors');\n }\n const sharedDim = aShape[aShape.length - 1];\n const sharedDimIndex = Math.ceil(sharedDim / 2);\n const aRank = aShape.length;\n const bRank = bShape.length;\n\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const coordsDataType = getCoordsDataType(outputShape.length);\n const outRank = outputShape.length;\n const allGlChannels = getGlChannels();\n const {activationFunction, applyActivation} = getActivationSnippet(activationAttributes);\n\n const getBiasForMatmulSnippet =\n hasBias ? `${getBiasForMatmul(coordsDataType, allGlChannels, inputs[2].dims, outputShape, true)}` : '';\n\n const getBcastedSamplerForMatmulSnippet =\n isBroadcast ? `${getBcastSamplerForMatmul(coordsDataType, allGlChannels, inputs, outputShape)}` : '';\n\n const getSamplerAInLoopSnippet = isBroadcast ? 'getAAtOutCoordsMatmul(i)' : `getA(${getA(allGlChannels, aRank)})`;\n const getSamplerBInLoopSnippet = isBroadcast ? 'getBAtOutCoordsMatmul(i)' : `getB(${getB(allGlChannels, bRank)})`;\n const getOutputCoordsSnippet = isBroadcast ? '' : `${coordsDataType} rc =\n getOutputCoords(); int lastDim = rc.${allGlChannels[outRank - 1]}; rc.${allGlChannels[outRank - 1]} =\n rc.${allGlChannels[outRank - 2]}; rc.${allGlChannels[outRank - 2]} = lastDim;\n `;\n const shaderSource = `\n ${getBcastedSamplerForMatmulSnippet}\n ${getBiasForMatmulSnippet}\n ${activationFunction}\n void main() {\n ${getOutputCoordsSnippet}\n\n vec4 value = vec4(0);\n for (int i = 0; i < ${sharedDimIndex}; i++) {\n vec4 a = ${getSamplerAInLoopSnippet};\n vec4 b = ${getSamplerBInLoopSnippet};\n\n value += (a.rrbb * b.rgrg);\n value += (a.ggaa * b.baba);\n }\n ${processBias}\n ${applyActivation}\n ${glsl.output} = value;\n }`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.packed},\n shaderSource,\n hasMain: true\n };\n };\n\nexport const createPackedMatmulProgramInfoLoader =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[],\n activationAttributes: InternalActivationAttributes): ProgramInfoLoader => {\n const metadata = createPackedMatmulProgramMetadata(inputs.length > 2, activationAttributes.activationCacheKey);\n return {\n ...metadata,\n get: () => createPackedMatmulProgramInfo(inferenceHandler, metadata, inputs, activationAttributes)\n };\n };\n\nfunction getBcastSamplerForMatmul(\n coordsDataType: string, allGlChannels: readonly string[], inputs: Tensor[], outShape: readonly number[]): string {\n let unpackedACoordsSnippet = [];\n let unpackedBCoordsSnippet = [];\n\n const inAShape = inputs[0].dims;\n const inBShape = inputs[1].dims;\n\n const inARank = inAShape.length;\n const inBRank = inBShape.length;\n\n const outRank = outShape.length;\n const rankADiff = outRank - inARank;\n const rankBDiff = outRank - inBRank;\n\n unpackedACoordsSnippet = inAShape.map((_s, i) => `coords.${allGlChannels[i + rankADiff]}`);\n unpackedACoordsSnippet[inARank - 1] = 'i*2';\n unpackedACoordsSnippet.join(', ');\n unpackedBCoordsSnippet = inBShape.map((_s, i) => `coords.${allGlChannels[i + rankBDiff]}`);\n unpackedBCoordsSnippet[inBRank - 2] = 'i*2';\n unpackedBCoordsSnippet.join(', ');\n\n const broadcastADims = BroadcastUtil.getBroadcastDims(inAShape, outShape);\n const broadcastBDims = BroadcastUtil.getBroadcastDims(inBShape, outShape);\n\n const coordsASnippet = broadcastADims.map(d => `coords.${allGlChannels[d + rankADiff]} = 0;`).join('\\n');\n const coordsBSnippet = broadcastBDims.map(d => `coords.${allGlChannels[d + rankBDiff]} = 0;`).join('\\n');\n const swapDimSnippet = `int lastDim = coords.${allGlChannels[outRank - 1]};\n coords.${allGlChannels[outRank - 1]} = coords.${allGlChannels[outRank - 2]};\n coords.${allGlChannels[outRank - 2]} = lastDim;`;\n\n const getBcastSamplerMatmulSource = `\nvec4 getAAtOutCoordsMatmul(int i) {\n ${coordsDataType} coords = getOutputCoords();\n ${swapDimSnippet}\n ${coordsASnippet}\n vec4 outputValue = getA(${unpackedACoordsSnippet});\n return outputValue;\n}\n\nvec4 getBAtOutCoordsMatmul(int i) {\n ${coordsDataType} coords = getOutputCoords();\n ${swapDimSnippet}\n ${coordsBSnippet}\n vec4 outputValue = getB(${unpackedBCoordsSnippet});\n return outputValue;\n}`;\n\n return getBcastSamplerMatmulSource;\n}\n\nfunction getA(allGlChannels: string[], rank: number): string {\n let res = '';\n for (let i = 0; i < rank - 2; i++) {\n res += `rc.${allGlChannels[i]}, `;\n }\n res += `rc.${allGlChannels[rank - 2]}, ` +\n 'i*2';\n return res;\n}\n\nfunction getB(allGlChannels: string[], rank: number): string {\n let res = '';\n for (let i = 0; i < rank - 2; i++) {\n res += `rc.${allGlChannels[i]}, `;\n }\n res += 'i*2, ' +\n `rc.${allGlChannels[rank - 1]}`;\n return res;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nimport {calculateOutputShape, ConvAttributes} from './conv';\nimport {createPackedIm2ColProgramInfoLoader} from './im2col-pack';\nimport {createPackedMatmulProgramInfoLoader} from './matmul-pack';\n\nexport const conv2DPackedPointwise =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], attributes: ConvAttributes): Tensor => {\n const xshape = inputs[0].dims;\n const kshape = inputs[1].dims;\n const outputShape =\n calculateOutputShape(xshape, kshape, attributes.dilations, attributes.pads, attributes.strides);\n const reshapedX = inferenceHandler.reshapePacked(inputs[0], [xshape[1], xshape[2] * xshape[3]]);\n const reshapedK = inferenceHandler.reshapePacked(inputs[1], [kshape[0], kshape[1]]);\n\n const matmulInputs = inputs.length > 2 ? [reshapedK, reshapedX, inputs[2]] : [reshapedK, reshapedX];\n const matmulOutput = inferenceHandler.run(\n createPackedMatmulProgramInfoLoader(inferenceHandler, matmulInputs, attributes), matmulInputs);\n return inferenceHandler.reshapePacked(matmulOutput, outputShape);\n };\n\nexport const conv2DPacked =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], attributes: ConvAttributes): Tensor => {\n const xshape = inputs[0].dims;\n const kshape = inputs[1].dims;\n const outputShape =\n calculateOutputShape(xshape, kshape, attributes.dilations, attributes.pads, attributes.strides);\n\n // run im2col\n const im2colOutput = inferenceHandler.run(\n createPackedIm2ColProgramInfoLoader(inferenceHandler, inputs[0], inputs[1], outputShape, attributes),\n [inputs[0]]);\n\n // reshape kernel\n const kernelReshaped = inferenceHandler.reshapePacked(inputs[1], [kshape[0], kshape[1] * kshape[2] * kshape[3]]);\n\n // run matmul\n const matmulInputs =\n (inputs.length === 3) ? [kernelReshaped, im2colOutput, inputs[2]] : [kernelReshaped, im2colOutput];\n const matmulOutput = inferenceHandler.run(\n createPackedMatmulProgramInfoLoader(inferenceHandler, matmulInputs, attributes), matmulInputs);\n\n // reshape output\n const outputReshaped = inferenceHandler.reshapePacked(matmulOutput, outputShape);\n return outputReshaped;\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nimport {ConvAttributes} from './conv';\n\nconst createIm2ColProgramMetadata = (cacheHint: string) => ({\n name: 'Im2Col',\n inputNames: ['X'],\n inputTypes: [TextureType.unpacked],\n cacheHint,\n});\n\nconst createIm2ColProgramInfo =\n (_inferenceHandler: WebGLInferenceHandler, metadata: ProgramMetadata, x: Tensor, w: Tensor,\n outputShape: readonly number[], attributes: ConvAttributes): ProgramInfo => {\n const xshape = x.dims;\n const wshape = w.dims;\n\n const rank = outputShape.length;\n const im2colDims = calculateIm2ColDims(xshape, wshape, outputShape, 4);\n\n const shaderSource = `\n const int XC = ${xshape[1]};\n const int XH = ${xshape[2]};\n const int XW = ${xshape[3]};\n const int KH = ${attributes.kernelShape[0]};\n const int KW = ${attributes.kernelShape[1]};\n const int dilationH = ${attributes.dilations[0]};\n const int dilationW = ${attributes.dilations[1]};\n const int strideH = ${attributes.strides[0]};\n const int strideW = ${attributes.strides[1]};\n const int padH = ${attributes.pads[0]};\n const int padW = ${attributes.pads[1]};\n const int KHKW = KH*KW;\n const int XCKHKW = XC * KHKW;\n const int outputChannels = 4;\n vec4 process(int indices[${rank}]) {\n int b = indices[0]; // batch size\n int oh = indices[1] * strideH - padH; //output height\n int ow = indices[2] * strideW - padW; //output width\n int p = indices[3] * outputChannels; //patch\n vec4 value = vec4(0.0);\n for(int i=0; i < outputChannels; ++i) {\n if(p < XCKHKW) {\n int patchC = p / KHKW;\n int patchH = (p - patchC*KHKW) / KW;\n int patchW = (p - patchC*KHKW) - patchH * KW;\n int xh2 = oh + patchH * dilationH;\n int xw2 = ow + patchW * dilationW;\n int x[${xshape.length}];\n x[0] = b;\n x[1] = patchC;\n x[2] = xh2;\n x[3] = xw2;\n if(xh2 >= 0 &&\n xh2 < XH &&\n xw2 >= 0 &&\n xw2 < XW) {\n value[i] = _X(x);\n }\n }\n ++p;\n }\n return value;\n }\n `;\n return {\n ...metadata,\n output: {dims: im2colDims, type: x.type, textureType: TextureType.packedLastDimension},\n shaderSource\n };\n };\n\nexport const createIm2ColProgramInfoLoader =\n (inferenceHandler: WebGLInferenceHandler, x: Tensor, w: Tensor, outputShape: readonly number[],\n attributes: ConvAttributes): ProgramInfoLoader => {\n const metadata = createIm2ColProgramMetadata(attributes.cacheKey);\n return {\n ...metadata,\n get: () => createIm2ColProgramInfo(inferenceHandler, metadata, x, w, outputShape, attributes)\n };\n };\n\n\nexport const calculateIm2ColDims =\n (inputShape: readonly number[], kernelShape: readonly number[], outputShape: readonly number[], channels = 4):\n number[] =>\n [outputShape[0], outputShape[2], outputShape[3],\n Math.ceil(inputShape[1] * kernelShape[2] * kernelShape[3] / channels)];\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nimport {getActivationSnippet, InternalActivationAttributes} from './fuse-utils';\nimport {calculateIm2ColDims} from './im2col';\n\nconst createDotProductProgramMetadata = (hasBias: boolean, attributes: InternalActivationAttributes) => ({\n name: 'ConvDotProduct',\n inputNames: hasBias ? ['Im2Col', 'K', 'B'] : ['Im2Col', 'K'],\n inputTypes: hasBias ? [TextureType.unpacked, TextureType.packedLastDimension, TextureType.unpacked] :\n [TextureType.unpacked, TextureType.packedLastDimension],\n cacheKey: attributes.activationCacheKey\n});\n\nconst createDotProductProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, metadata: ProgramMetadata, inputs: readonly Tensor[],\n outputShape: number[], attributes: InternalActivationAttributes): ProgramInfo => {\n const xshape = inputs[0].dims;\n const kshape = inputs[1].dims;\n const adjustedKernelShape = [kshape[0], Math.ceil((xshape[1] * kshape[2] * kshape[3]) / 4)];\n const im2colShape = calculateIm2ColDims(xshape, kshape, outputShape);\n const [kWidth, kHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(adjustedKernelShape, TextureType.packedLastDimension);\n\n const im2colStrides = ShapeUtil.computeStrides(im2colShape);\n const [im2colWidth, im2colHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(im2colShape, TextureType.packedLastDimension);\n const rank = outputShape.length;\n\n const initValue = (inputs.length < 3) ? '0.0' : '_B(b)';\n const sharedDim = Math.ceil(xshape[1] * kshape[2] * kshape[3] / 4);\n const {activationFunction, applyActivation} = getActivationSnippet(attributes);\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const shaderSource = `\n${activationFunction}\nfloat process(int indices[${rank}]) {\n int b[1];\n b[0] = indices[1];\n int im2col[4];\n im2col[0] = indices[0];\n im2col[1] = indices[2];\n im2col[2] = indices[3];\n int im2colOffset = im2col[0] * ${im2colStrides[0]} + im2col[1] * ${im2colStrides[1]} + im2col[2] * ${\n im2colStrides[2]};\n int kernelOffset = indices[1] * ${adjustedKernelShape[1]};\n float value = ${initValue};\n for (int i = 0; i < ${sharedDim}; ++i) {\n vec2 im2colCoords = offsetToCoords(im2colOffset, ${im2colWidth}, ${im2colHeight});\n vec2 kernelCoords = offsetToCoords(kernelOffset, ${kWidth}, ${kHeight});\n value += dot(${glsl.texture2D}(Im2Col, im2colCoords), ${glsl.texture2D}(K, kernelCoords));\n ++im2colOffset;\n ++kernelOffset;\n }\n ${applyActivation}\n return value;\n}`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nexport const createDotProductProgramInfoLoader =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], outputShape: number[],\n attributes: InternalActivationAttributes): ProgramInfoLoader => {\n const metadata = createDotProductProgramMetadata(inputs.length > 2, attributes);\n return {\n ...metadata,\n get: () => createDotProductProgramInfo(inferenceHandler, metadata, inputs, outputShape, attributes)\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {InferenceHandler} from '../../../backend';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {PoolConvUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nimport {createUnpackedGroupedConvProgramInfoLoader} from './conv-grouped';\nimport {conv2DPacked} from './conv-pack';\nimport {createDotProductProgramInfoLoader} from './dot-product';\nimport {InternalActivationAttributes, parseInternalActivationAttributes} from './fuse-utils';\nimport {createIm2ColProgramInfoLoader} from './im2col';\nimport {createMatmulProgramInfoLoader} from './matmul';\n\n\nexport const calculateOutputShape =\n (inputShape: readonly number[], kernelShape: readonly number[], dilations: readonly number[],\n adjustPads: readonly number[], strides: readonly number[]): number[] => {\n const batchSize = inputShape[0];\n const inputSpatialShape = inputShape.slice(2);\n const spatialRank = inputSpatialShape.length;\n const outChannels = kernelShape[0];\n const kernelSpatialShape = kernelShape.slice(2);\n const dilatedKernelShape = kernelSpatialShape.map((v, i) => v + (v - 1) * (dilations[i] - 1));\n const inputSpatialShapeWithPad = inputSpatialShape.map((v, i) => v + adjustPads[i] + adjustPads[i + spatialRank]);\n const outputSpatialShape =\n inputSpatialShapeWithPad.map((v, i) => Math.floor((v - dilatedKernelShape[i] + strides[i]) / strides[i]));\n const outputShape = [batchSize, outChannels].concat(...outputSpatialShape);\n return outputShape;\n };\n\nexport interface ConvAttributes extends InternalActivationAttributes, AttributeWithCacheKey {\n readonly autoPad: string;\n readonly dilations: readonly number[];\n readonly group: number;\n readonly kernelShape: readonly number[];\n readonly pads: readonly number[];\n readonly strides: readonly number[];\n}\n\nexport const conv: OperatorImplementation =\n (inferenceHandler: InferenceHandler, inputs: Tensor[], attributes: ConvAttributes): Tensor[] => {\n validateInputs(inputs, attributes); // currently will fail if not conv2D\n return conv2d(inferenceHandler, inputs, attributes);\n };\n\nconst conv2d: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ConvAttributes): Tensor[] => {\n const adjustedAttributes = getAdjustedConvAttributes(attributes, inputs);\n const packMode = inferenceHandler.session.pack;\n const isPointwise = adjustedAttributes.kernelShape[0] === 1 && adjustedAttributes.kernelShape[1] === 1;\n if (adjustedAttributes.group > 1) {\n const result = inferenceHandler.run(\n createUnpackedGroupedConvProgramInfoLoader(inferenceHandler, inputs, adjustedAttributes), inputs);\n return [result];\n } else if (isPointwise && packMode) {\n return [conv2DUnpackedPointwise(inferenceHandler, inputs, adjustedAttributes)];\n } else if (packMode && inputs[0].dims.length === 4 && inputs[0].dims[0] === 1 && !isPointwise) {\n return [conv2DPacked(inferenceHandler, inputs, adjustedAttributes)];\n } else {\n return [conv2DUnpacked(inferenceHandler, inputs, adjustedAttributes)];\n }\n };\n\nconst conv2DUnpackedPointwise =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], attributes: ConvAttributes): Tensor => {\n const xshape = inputs[0].dims;\n const kshape = inputs[1].dims;\n const outputShape =\n calculateOutputShape(xshape, kshape, attributes.dilations, attributes.pads, attributes.strides);\n const reshapedX = inferenceHandler.reshapeUnpacked(inputs[0], [xshape[1], xshape[2] * xshape[3]]);\n const reshapedK = inferenceHandler.reshapeUnpacked(inputs[1], [kshape[0], kshape[1]]);\n\n const matmulInputs = inputs.length > 2 ? [reshapedK, reshapedX, inputs[2]] : [reshapedK, reshapedX];\n const matmulOutput = inferenceHandler.run(createMatmulProgramInfoLoader(matmulInputs, attributes), matmulInputs);\n return inferenceHandler.reshapeUnpacked(matmulOutput, outputShape);\n };\n\nconst conv2DUnpacked =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], attributes: ConvAttributes): Tensor => {\n const xshape = inputs[0].dims;\n const kshape = inputs[1].dims;\n const outputShape =\n calculateOutputShape(xshape, kshape, attributes.dilations, attributes.pads, attributes.strides);\n const xIm2Col = inferenceHandler.run(\n createIm2ColProgramInfoLoader(inferenceHandler, inputs[0], inputs[1], outputShape, attributes), [inputs[0]]);\n\n const dotProductInputs = inputs.length === 3 ? [xIm2Col, inputs[1], inputs[2]] : [xIm2Col, inputs[1]];\n const output = inferenceHandler.run(\n createDotProductProgramInfoLoader(inferenceHandler, inputs, outputShape, attributes), dotProductInputs);\n return output;\n };\n\nconst getAdjustedConvAttributes = (attributes: T, inputs: Tensor[]): T => {\n const kernelShape = attributes.kernelShape.slice();\n // if kernelShape is not specified in the attributes of this op, infer it from the weight tensor dims\n if (attributes.kernelShape.length === 0) {\n for (let i = 2; i < inputs[1].dims.length; ++i) {\n kernelShape.push(inputs[1].dims[i]);\n }\n }\n const pads = attributes.pads.slice();\n PoolConvUtil.adjustPadsBasedOnAutoPad(\n inputs[0].dims, attributes.strides, attributes.dilations, kernelShape, pads, attributes.autoPad);\n\n // always return a new object so does not modify the original attributes\n const newAttributes: T = Object.assign({}, attributes);\n Object.assign(newAttributes, {kernelShape, pads, cacheKey: attributes.cacheKey});\n return newAttributes;\n};\n\nexport const parseConvAttributes: OperatorInitialization = (node: Graph.Node): ConvAttributes => {\n const attributes = node.attributes;\n const activationAttributes = parseInternalActivationAttributes(attributes);\n // TODO : Make this generic enough to compute default attributes for multi-dimensional conv\n const autoPad = attributes.getString('auto_pad', 'NOTSET');\n const dilations = attributes.getInts('dilations', [1, 1]);\n const group = attributes.getInt('group', 1);\n const kernelShape = attributes.getInts('kernel_shape', []);\n const pads = attributes.getInts('pads', [0, 0, 0, 0]);\n const strides = attributes.getInts('strides', [1, 1]);\n\n return createAttributeWithCacheKey({autoPad, dilations, group, kernelShape, pads, strides, ...activationAttributes});\n};\n\nconst validateInputs = (inputs: Tensor[], attributes: ConvAttributes): void => {\n // Refer to the below link for all input checks\n // https://github.com/onnx/onnx/blob/main/docs/Operators.md#Conv\n if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n throw new Error('Conv requires 2 or 3 inputs');\n }\n\n // TODO : Need to add support for multi-dimensional conv\n if (inputs[0].dims.length !== 4 || inputs[1].dims.length !== 4) {\n throw new Error('currently only support 2-dimensional conv');\n }\n\n // FILTER_IN_CHANNEL should be equal to DATA_CHANNEL\n const dataChannel = inputs[0].dims[1];\n const filterInChannel = inputs[1].dims[1] * attributes.group;\n if (dataChannel !== filterInChannel) {\n throw new Error('FILTER_IN_CHANNEL should be equal to DATA_CHANNEL');\n }\n\n // if bias is provided it should be 1D and the number of elements should be equal to the number of feature maps\n if (inputs.length === 3 && (inputs[2].dims.length !== 1 || inputs[1].dims[0] !== inputs[2].dims[0])) {\n throw new Error('invalid bias');\n }\n\n const spatialRank = inputs[0].dims.length - 2;\n // wrong dilations dimension\n if (attributes.dilations.length !== spatialRank) {\n throw new Error(`dilations should be ${spatialRank}D`);\n }\n\n // Wrong strides dimension\n if (attributes.strides.length !== spatialRank) {\n throw new Error(`strides should be ${spatialRank}D`);\n }\n\n // Wrong pads dimension\n if (attributes.pads.length !== spatialRank * 2) {\n throw new Error(`pads should be ${spatialRank * 2}D`);\n }\n\n // if kernelShape is specified, it's data length must be 2 less than dims length of the weights tensor\n // (the first 2 dims are batch_size and channels)\n if (attributes.kernelShape.length !== 0 && attributes.kernelShape.length !== inputs[1].dims.length - 2) {\n throw new Error('invalid kernel shape');\n }\n\n // TODO : Need to add support for float64\n if (inputs[0].type !== 'float32' || inputs[1].type !== 'float32') {\n throw new Error('Conv input(X,W) should be float tensor');\n }\n\n if (inputs.length === 3 && inputs[2].type !== 'float32') {\n throw new Error('Conv input(bias) should be float tensor');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {InferenceHandler} from '../../../backend';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nimport {ConvAttributes} from './conv';\nimport {getActivationSnippet, parseInternalActivationAttributes} from './fuse-utils';\n\nconst computeTotalPad =\n (inDim: number, stride: number, adj: number, kernel: number, dilation: number, outSize: number) =>\n (inDim - 1) * stride + adj + (kernel - 1) * dilation + 1 - outSize;\n\nconst distributePadding = (totalPad: number, autoPad: string, pads: number[], head: number, tail: number) => {\n const smallPad = Math.floor(totalPad / 2);\n if (autoPad === 'SAME_UPPER') {\n pads[head] = smallPad;\n pads[tail] = totalPad - smallPad;\n } else if (autoPad === 'SAME_LOWER') {\n pads[head] = totalPad - smallPad;\n pads[tail] = smallPad;\n }\n};\n\nconst calculateOutputShapeAndPads =\n (inputShape: readonly number[], kernelShape: readonly number[], dilations: readonly number[], autoPad: string,\n pads: number[], strides: readonly number[], outputPadding: readonly number[], outputShape: number[]) => {\n const spatialRank = inputShape.length - 2;\n const updateShape = outputShape.length === 0;\n for (let i = 0; i < spatialRank; ++i) {\n const outSize = updateShape ? inputShape[i + 2] * strides[i] : outputShape[i];\n const totalPad = computeTotalPad(inputShape[i + 2], strides[i], pads[i], kernelShape[i], dilations[i], outSize);\n distributePadding(totalPad, autoPad, pads, i, i + spatialRank);\n if (updateShape) {\n outputShape.push(\n strides[i] * (inputShape[i + 2] - 1) + outputPadding[i] + (kernelShape[i] - 1) * dilations[i] + 1 -\n pads[i] - pads[i + spatialRank]);\n }\n }\n };\n\nexport interface ConvTransposeAttributes extends ConvAttributes {\n readonly outputPadding: readonly number[];\n readonly outputShape: readonly number[];\n}\n\nexport const convTranspose: OperatorImplementation =\n (inferenceHandler: InferenceHandler, inputs: Tensor[], attributes: ConvTransposeAttributes): Tensor[] => {\n validateInputs(inputs, attributes); // currently will fail if not convTranspose2D\n return convTranspose2d(inferenceHandler, inputs, attributes);\n };\n\nconst convTranspose2d: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ConvTransposeAttributes): Tensor[] => {\n const adjustedAttributes = getAdjustedConvTransposeAttributes(attributes, inputs);\n return [convTranspose2DUnpacked(inferenceHandler, inputs, adjustedAttributes)];\n };\n\nconst createConvTransposeProgramMetadata = (hasBias: boolean, cacheHint: string) => ({\n name: 'ConvTranspose',\n inputNames: hasBias ? ['X', 'W', 'B'] : ['X', 'W'],\n inputTypes: hasBias ? [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked] :\n [TextureType.unpacked, TextureType.unpacked],\n cacheHint\n});\n\nconst createUnpackedConvTransposeProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], metadata: ProgramMetadata,\n attributes: ConvTransposeAttributes): ProgramInfo => {\n const hasBias = inputs.length > 2;\n const valueInit = hasBias ? 'getB(output_channel)' : '0.0';\n const xShape = inputs[0].dims;\n const wShape = inputs[1].dims;\n const outputChannelsPerGroup = wShape[1];\n const inputChannelsPerGroup = wShape[0] / attributes.group;\n const outputShape = [inputs[0].dims[0], inputs[1].dims[1] * attributes.group, ...attributes.outputShape];\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const {activationFunction, applyActivation} = getActivationSnippet(attributes);\n\n const shaderSource = `\n const ivec2 strides = ivec2(${attributes.strides[0]}, ${attributes.strides[1]});\n const ivec2 pads = ivec2(${attributes.pads[0]}, ${attributes.pads[1]});\n ${activationFunction}\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n int output_channel = coords.y;\n\n ivec2 loc = coords.zw + pads;\n\n int group_id = output_channel / ${outputChannelsPerGroup};\n int wOutChannel = output_channel - group_id * ${outputChannelsPerGroup};\n\n float value = ${valueInit};\n for (int inChannelOffset = 0; inChannelOffset < ${inputChannelsPerGroup}; inChannelOffset++) {\n int input_channel = group_id * ${inputChannelsPerGroup} + inChannelOffset;\n for (int wWOff = 0; wWOff < ${wShape[2]}; wWOff++) {\n for (int wHOff = 0; wHOff < ${wShape[3]}; wHOff++) {\n ivec2 wOff = ivec2(wWOff * ${attributes.dilations[0]}, wHOff * ${attributes.dilations[1]});\n ivec2 wLoc = loc - wOff;\n ivec2 wLocIn = wLoc / strides;\n if (\n wLocIn * strides == wLoc &&\n wLocIn.x >= 0 && wLocIn.x < ${xShape[2]} &&\n wLocIn.y >= 0 && wLocIn.y < ${xShape[3]}\n ) {\n float xVal = getX(batch, input_channel, wLocIn.y, wLocIn.x);\n float wVal = getW(input_channel, wOutChannel, wHOff, wWOff);\n value += xVal * wVal;\n }\n }\n }\n }\n ${applyActivation}\n ${glsl.output} = vec4(value, .0, .0, .0);\n }\n`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource,\n hasMain: true,\n };\n };\n\nconst createUnpackedConvTransposeProgramInfoLoader =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], attributes: ConvTransposeAttributes):\n ProgramInfoLoader => {\n const metadata = createConvTransposeProgramMetadata(inputs.length > 2, attributes.cacheKey);\n return {\n ...metadata,\n get: () => createUnpackedConvTransposeProgramInfo(inferenceHandler, inputs, metadata, attributes)\n };\n };\n\n\nconst convTranspose2DUnpacked =\n (inferenceHandler: WebGLInferenceHandler, inputs: readonly Tensor[], attributes: ConvTransposeAttributes):\n Tensor => {\n const result = inferenceHandler.run(\n createUnpackedConvTransposeProgramInfoLoader(inferenceHandler, inputs, attributes), inputs);\n return result;\n };\n\nconst getAdjustedConvTransposeAttributes = (attributes: T, inputs: Tensor[]): T => {\n const kernelShape = attributes.kernelShape.slice();\n // if kernelShape is not specified in the attributes of this op, infer it from the weight tensor dims\n if (attributes.kernelShape.length === 0) {\n for (let i = 2; i < inputs[1].dims.length; ++i) {\n kernelShape.push(inputs[1].dims[i]);\n }\n }\n\n const pads = attributes.pads.slice();\n const outputShape = attributes.outputShape.slice();\n const inputShape = inputs[0].dims;\n // If outputShape is not specified in the attributes of this op, infer it from the parameters\n // Similarly, automatically infer pads if not specified\n calculateOutputShapeAndPads(\n inputShape, kernelShape, attributes.dilations, attributes.autoPad, pads, attributes.strides,\n attributes.outputPadding, outputShape);\n\n // always return a new object so does not modify the original attributes\n const newAttributes: T = Object.assign({}, attributes);\n Object.assign(newAttributes, {kernelShape, pads, outputShape, cacheKey: attributes.cacheKey});\n return newAttributes;\n};\n\nexport const parseConvTransposeAttributes: OperatorInitialization =\n (node: Graph.Node): ConvTransposeAttributes => {\n const attributes = node.attributes;\n const activationAttributes = parseInternalActivationAttributes(attributes);\n // TODO : Make this generic enough to compute default attributes for multi-dimensional conv\n const autoPad = attributes.getString('auto_pad', 'NOTSET');\n const dilations = attributes.getInts('dilations', [1, 1]);\n const group = attributes.getInt('group', 1);\n const kernelShape = attributes.getInts('kernel_shape', []);\n const outputPadding = attributes.getInts('output_padding', [0, 0]);\n const outputShape = attributes.getInts('output_shape', []);\n const pads = attributes.getInts('pads', [0, 0, 0, 0]);\n const strides = attributes.getInts('strides', [1, 1]);\n\n return createAttributeWithCacheKey(\n {autoPad, dilations, group, kernelShape, outputPadding, outputShape, pads, strides, ...activationAttributes});\n };\n\nconst validateInputs = (inputs: Tensor[], attributes: ConvTransposeAttributes): void => {\n // Refer to the below link for all input checks\n // https://github.com/onnx/onnx/blob/main/docs/Operators.md#Conv\n if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n throw new Error('Conv requires 2 or 3 inputs');\n }\n\n // TODO : Need to add support for multi-dimensional conv\n if (inputs[0].dims.length !== 4 || inputs[1].dims.length !== 4) {\n throw new Error('currently only support 2-dimensional conv');\n }\n\n // FILTER_IN_CHANNEL should be equal to DATA_CHANNEL\n const dataChannel = inputs[0].dims[1];\n const filterInChannel = inputs[1].dims[0];\n if (dataChannel !== filterInChannel) {\n throw new Error('FILTER_IN_CHANNEL should be equal to DATA_CHANNEL');\n }\n\n const featureMaps = inputs[1].dims[1] * attributes.group;\n\n // if bias is provided it should be 1D and the number of elements should be equal to the number of feature maps\n if (inputs.length === 3 && (inputs[2].dims.length !== 1 || inputs[2].dims[0] !== featureMaps)) {\n throw new Error('invalid bias');\n }\n\n const spatialRank = inputs[0].dims.length - 2;\n // wrong dilations dimension\n if (attributes.dilations.length !== spatialRank) {\n throw new Error(`dilations should be ${spatialRank}D`);\n }\n\n // Wrong strides dimension\n if (attributes.strides.length !== spatialRank) {\n throw new Error(`strides should be ${spatialRank}D`);\n }\n\n // Wrong pads dimension\n if (attributes.pads.length !== spatialRank * 2) {\n throw new Error(`pads should be ${spatialRank * 2}D`);\n }\n\n // Wrong output padding dimension\n if (attributes.outputPadding.length !== spatialRank) {\n throw new Error(`output_padding should be ${spatialRank}D`);\n }\n\n // if kernelShape is specified, it's data length must be 2 less than dims length of the weights tensor\n // (the first 2 dims are batch_size and channels)\n if (attributes.kernelShape.length !== 0 && attributes.kernelShape.length !== inputs[1].dims.length - 2) {\n throw new Error('invalid kernel shape');\n }\n\n // as with kernelShape, must have same number of spatial dims as input\n if (attributes.outputShape.length !== 0 && attributes.outputShape.length !== inputs[0].dims.length - 2) {\n throw new Error('invalid output shape');\n }\n\n // TODO : Need to add support for float64\n if (inputs[0].type !== 'float32' || inputs[1].type !== 'float32') {\n throw new Error('ConvTranspose input(X,W) should be float tensor');\n }\n\n if (inputs.length === 3 && inputs[2].type !== 'float32') {\n throw new Error('ConvTranspose input(bias) should be float tensor');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, TextureType} from '../types';\n\nexport interface TransposeAttributes extends AttributeWithCacheKey {\n readonly perm: number[];\n}\n\nconst transposeProgramMetadata = {\n name: 'Transpose',\n inputNames: ['A'],\n inputTypes: [TextureType.unpacked]\n};\n\nexport const transpose: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: TransposeAttributes): Tensor[] => {\n validateInputs(inputs);\n const output = inferenceHandler.run(\n {\n ...transposeProgramMetadata,\n cacheHint: attributes.cacheKey,\n get: () => createTransposeProgramInfo(inferenceHandler, inputs[0], attributes.perm)\n },\n inputs);\n return [output];\n };\n\nexport const parseTransposeAttributes: OperatorInitialization =\n (node: Graph.Node): TransposeAttributes => createAttributeWithCacheKey({perm: node.attributes.getInts('perm', [])});\n\nconst createTransposeProgramInfo =\n (_inferenceHandler: WebGLInferenceHandler, input: Tensor, perm: number[]): ProgramInfo => {\n const inputShape = input.dims;\n perm = getAdjustedPerm(inputShape, perm);\n const unpackedOutputShape = getOutputShape(inputShape, perm);\n const rank = inputShape.length;\n // A dims=[${inputs[0].dims.toString()}]\n // out Dims=[${unpackedOutputShape.toString()}]\n // based on perm=[${perm.toString()}]\n const shaderSource = `\n ${getPermFunctionBody('perm', perm, rank)}\n float process(int indices[${rank}]) {\n int a[${rank}];\n perm(a, indices);\n return _A(a);\n }`;\n return {\n ...transposeProgramMetadata,\n output: {dims: unpackedOutputShape, type: input.type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst getAdjustedPerm = (inputShape: readonly number[], perm: number[]): number[] => {\n if (perm && perm.length !== inputShape.length) {\n perm = [...(inputShape.keys())].reverse();\n }\n return perm;\n};\n\nconst getOutputShape = (inputShape: readonly number[], perm: number[]): readonly number[] => {\n perm = getAdjustedPerm(inputShape, perm);\n return ShapeUtil.sortBasedOnPerm(inputShape, perm);\n};\n\nconst getPermFunctionBody = (name: string, perm: number[], rank: number): string => {\n const reverseFunc = [];\n reverseFunc.push(`void ${name}(out int a[${rank}], int src[${rank}]) {`);\n for (let i = 0; i < rank; ++i) {\n reverseFunc.push(`\\ta[${perm[i]}]=src[${i}];`);\n }\n reverseFunc.push('\\t}');\n return reverseFunc.join('\\n');\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Transpose requires 1 input.');\n }\n\n if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n throw new Error('input should be float tensor');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nimport {transpose, TransposeAttributes} from './transpose';\n\nexport interface DepthToSpaceAttributes {\n mode: 'DCR'|'CRD';\n blocksize: number;\n}\n\nexport const depthToSpace: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: DepthToSpaceAttributes): Tensor[] => {\n validateInputs(inputs);\n const blocksize = attributes.blocksize;\n const blocksizeSqr = blocksize * blocksize;\n const transposePerm = attributes.mode === 'DCR' ? [0, 3, 4, 1, 5, 2] : [0, 1, 4, 2, 5, 3];\n const firstReshapeShape = attributes.mode === 'DCR' ?\n [\n inputs[0].dims[0], blocksize, blocksize, inputs[0].dims[1] / blocksizeSqr, inputs[0].dims[2],\n inputs[0].dims[3]\n ] :\n [\n inputs[0].dims[0], inputs[0].dims[1] / blocksizeSqr, blocksize, blocksize, inputs[0].dims[2],\n inputs[0].dims[3]\n ];\n\n // const transpose = new WebGLTranspose();\n // const attributes = new Attribute(undefined);\n // attributes.set('perm', 'ints', transposePerm);\n // transpose.initialize(attributes);\n\n // First reshape\n const firstReshapedTensor = inferenceHandler.reshapeUnpacked(inputs[0], firstReshapeShape);\n\n // transpose\n const transposeAttributes: TransposeAttributes = {perm: transposePerm, cacheKey: `${transposePerm}`};\n const [transposeOutput] = transpose(inferenceHandler, [firstReshapedTensor], transposeAttributes);\n\n // Second reshape\n const secondReshapeShape = [\n inputs[0].dims[0], inputs[0].dims[1] / blocksizeSqr, inputs[0].dims[2] * blocksize,\n inputs[0].dims[3] * blocksize\n ];\n const result = inferenceHandler.reshapeUnpacked(transposeOutput, secondReshapeShape);\n return [result];\n };\n\nexport const parseDepthToSpaceAttributes: OperatorInitialization =\n (node: Graph.Node): DepthToSpaceAttributes => {\n // processing node attributes\n const blocksize = node.attributes.getInt('blocksize');\n if (blocksize < 1) {\n throw new Error(`blocksize must be >= 1, but got : ${blocksize} for DepthToSpace`);\n }\n const mode = node.attributes.getString('mode', 'DCR');\n if (mode !== 'DCR' && mode !== 'CRD') {\n throw new Error(`unrecognized mode: ${mode} for DepthToSpace`);\n }\n return {mode, blocksize};\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (inputs.length !== 1) {\n throw new Error(`DepthToSpace expect 1 inputs, but got ${inputs.length}`);\n }\n\n // Input has to be a 4-D tensor\n // TODO: Support string depth-to-space.\n if (inputs[0].type === 'string' || inputs[0].dims.length !== 4) {\n throw new TypeError('DepthToSpace input should be a 4-D numeric tensor');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nexport const flatten: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], axis: number): Tensor[] => {\n validateInputs(inputs, axis);\n\n const outputDims = ShapeUtil.flattenShape(inputs[0].dims, axis);\n return [inferenceHandler.reshapeUnpacked(inputs[0], outputDims)];\n };\n\nexport const parseFlattenAttributes: OperatorInitialization = (node: Graph.Node): number =>\n node.attributes.getInt('axis', 1); // default axis is 1\n\nconst validateInputs = (inputs: Tensor[], axis: number): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Flatten requires 1 input.');\n }\n\n const r = inputs[0].dims.length;\n if (r === 0) {\n throw new Error('scalar tensor is not supported.');\n }\n\n if (axis < -r || axis > r) {\n throw new Error('Invalid axis');\n }\n\n // TODO: Support string type\n if (inputs[0].type === 'string') {\n throw new Error('string tensor is not supported.');\n }\n};", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceHandler} from './backend';\nimport {Graph} from './graph';\nimport {Tensor} from './tensor';\n\nexport type OperatorImplementation = (inferenceHandler: InferenceHandler, inputs: Tensor[], context: T) => Tensor[];\nexport type OperatorInitialization = (node: Graph.Node, graph: Graph) => T;\n\nexport interface Operator {\n readonly impl: OperatorImplementation;\n readonly context: Graph.Node|unknown;\n}\n\nexport const NUMBER_TYPES: readonly Tensor.DataType[] =\n ['float32', 'float64', 'int32', 'int16', 'int8', 'uint16', 'uint32', 'uint8'];\nexport const INT_TYPES: readonly Tensor.DataType[] = ['int32', 'int16', 'int8', 'uint16', 'uint32', 'uint8'];\nexport const FLOAT_TYPES: readonly Tensor.DataType[] = ['float32', 'float64'];\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {NUMBER_TYPES, OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\ninterface GatherAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n}\n\nexport const gather: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: GatherAttributes): Tensor[] => {\n validateInputs(inputs, attributes.axis);\n const output = inferenceHandler.run(createGatherProgramInfoLoader(inferenceHandler, inputs, attributes), inputs);\n return [output];\n };\n\nexport const parseGatherAttributes: OperatorInitialization = (node: Graph.Node): GatherAttributes =>\n createAttributeWithCacheKey({axis: node.attributes.getInt('axis', 0)});\n\nconst gatherProgramMetadata = {\n name: 'Gather',\n inputNames: ['A', 'B'],\n inputTypes: [TextureType.unpacked, TextureType.unpacked],\n};\n\nconst createGatherProgramInfo =\n (_handler: WebGLInferenceHandler, metadata: ProgramMetadata, inputs: Tensor[], axis: number): ProgramInfo => {\n const inputShape = inputs[0].dims.slice();\n const indexDataShape = inputs[1].dims.slice();\n const outputShape = new Array(inputShape.length + indexDataShape.length - 1);\n\n axis = ShapeUtil.normalizeAxis(axis, inputShape.length);\n const indexCopyOps: string[] = [];\n for (let i = 0; i < outputShape.length; i++) {\n // outputShape is divided into three parts: A, B, C\n // |0 axis| axis + indexDataShape.length | end|\n // | A | B | C |\n //\n // inputIdx: [A, inputs[1][B], C]\n if (i < axis) { // A\n outputShape[i] = inputShape[i];\n indexCopyOps.push(`inputIdx[${i}] = outputIdx[${i}];`);\n } else {\n if (i < axis + indexDataShape.length) { // B\n outputShape[i] = indexDataShape[i - axis];\n indexCopyOps.push(`indexDataIdx[${i - axis}] = outputIdx[${i}];`);\n } else { // C\n outputShape[i] = inputShape[i - indexDataShape.length + 1]; // skip 1 for axis\n indexCopyOps.push(`inputIdx[${i - indexDataShape.length + 1}] = outputIdx[${i}];`);\n }\n }\n }\n\n const orank = outputShape.length || 1;\n const irank = inputShape.length;\n const iDrank = indexDataShape.length || 1;\n const shaderSource = `\n float process(int outputIdx[${orank}]) {\n int inputIdx[${irank}];\n int indexDataIdx[${iDrank}];\n indexDataIdx[0] = 0;\n ${indexCopyOps.join('\\n ')}\n int idx = int(_B(indexDataIdx));\n inputIdx[${axis}] = idx < 0 ? idx + ${inputShape[axis]} : idx;\n return _A(inputIdx);\n }`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst createGatherProgramInfoLoader =\n (handler: WebGLInferenceHandler, inputs: Tensor[], attributes: GatherAttributes): ProgramInfoLoader => {\n const metadata = {...gatherProgramMetadata, cacheHint: attributes.cacheKey};\n return {...metadata, get: () => createGatherProgramInfo(handler, metadata, inputs, attributes.axis)};\n };\n\nconst validateInputs = (inputs: Tensor[], axis: number): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Gather requires 2 inputs.');\n }\n const tensorRank = inputs[0].dims.length;\n if (tensorRank < 1) {\n throw new Error('Invalid input shape.');\n }\n if (axis < -tensorRank || axis > tensorRank - 1) {\n throw new Error('Invalid axis.');\n }\n if (NUMBER_TYPES.indexOf(inputs[0].type) === -1) {\n throw new Error('Invaid input type.');\n }\n if (inputs[1].type !== 'int32' && inputs[1].type !== 'int16') {\n throw new Error('Invaid input type.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {GemmUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nexport interface GemmAttributes extends AttributeWithCacheKey {\n transA: boolean;\n transB: boolean;\n alpha: number;\n beta: number;\n isOptionalC: boolean; // in opset 11, C becomes optional\n}\n\nexport const gemm: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: GemmAttributes): Tensor[] => {\n validateInputs(inputs, attributes);\n const output = inferenceHandler.run(createGemmProgramInfoLoader(inputs, attributes), inputs);\n return [output];\n };\n\nconst parseGemmAttributes = (node: Graph.Node, isOptionalC: boolean): GemmAttributes => {\n const transA = node.attributes.getInt('transA', 0) !== 0;\n const transB = node.attributes.getInt('transB', 0) !== 0;\n const alpha = node.attributes.getFloat('alpha', 1.0);\n const beta = node.attributes.getFloat('beta', 1.0);\n return createAttributeWithCacheKey({transA, transB, alpha, beta, isOptionalC});\n};\n\nexport const parseGemmAttributesV7: OperatorInitialization = (node: Graph.Node): GemmAttributes =>\n parseGemmAttributes(node, false);\n\nexport const parseGemmAttributesV11: OperatorInitialization = (node: Graph.Node): GemmAttributes =>\n parseGemmAttributes(node, true);\n\nconst createGemmProgramInfoLoader = (inputs: Tensor[], attributes: GemmAttributes): ProgramInfoLoader => {\n const metadata = {\n name: 'Gemm',\n inputNames: inputs.length === 3 ? ['A', 'B', 'C'] : ['A', 'B'],\n inputTypes: inputs.length === 3 ? [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked] :\n [TextureType.unpacked, TextureType.unpacked],\n key: attributes.cacheKey\n };\n\n return {...metadata, get: () => createGemmProgramInfo(metadata, inputs, attributes)};\n};\n\nconst createGemmProgramInfo =\n (metadata: ProgramMetadata, inputs: Tensor[], attributes: GemmAttributes): ProgramInfo => {\n const aShape = inputs[0].dims.slice();\n const bShape = inputs[1].dims.slice();\n const [M, N] = GemmUtil.getShapeOfGemmResult(\n aShape, attributes.transA, bShape, attributes.transB, inputs.length === 3 ? inputs[2].dims : undefined);\n const outputShape = [M, N];\n if (!outputShape) {\n throw new Error('Can\\'t use gemm on the given tensors');\n }\n let sharedDim = aShape[aShape.length - 1];\n let line = '';\n if (attributes.transA) {\n sharedDim = aShape[0];\n }\n if (attributes.transA && attributes.transB) {\n line = 'value += _A_T(a) * _B_T(b);';\n } else if (attributes.transA && !attributes.transB) {\n line = 'value += _A_T(a) * _B(b);';\n } else if (!attributes.transA && attributes.transB) {\n line = 'value += _A(a) * _B_T(b);';\n } else if (!attributes.transA && !attributes.transB) {\n line = 'value += _A(a) * _B(b);';\n }\n const rank = outputShape.length;\n const declareC = inputs.length === 3 ? `int c[${inputs[2].dims.length}];` : '';\n const broadcastC = inputs.length === 3 ? 'bcastIndices_C(indices, c);' : '';\n const calculateC = inputs.length === 3 ? 'value += beta * _C(c);' : '';\n const shaderSource = `\n float process(int indices[${rank}]) {\n int a[${rank}];\n int b[${rank}];\n ${declareC}\n\n copyVec(indices, a);\n copyVec(indices, b);\n ${broadcastC}\n\n float value = 0.0;\n for (int k=0; k<${sharedDim}; ++k) {\n a[${rank - 1}] = k;\n b[${rank - 2}] = k;\n ${line}\n }\n\n value = value * alpha;\n ${calculateC}\n return value;\n }`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n variables: [\n {name: 'alpha', type: 'float', data: attributes.alpha}, {name: 'beta', type: 'float', data: attributes.beta}\n ],\n shaderSource\n };\n };\n\nconst validateInputs = (inputs: Tensor[], attributes: GemmAttributes): void => {\n if (!inputs) {\n throw new Error('Input is missing');\n }\n if (attributes.isOptionalC && (inputs.length < 2 || inputs.length > 3)) {\n throw new Error('Invaid input shape.');\n }\n if (!attributes.isOptionalC && inputs.length !== 3) {\n throw new Error('Gemm requires 3 inputs');\n }\n\n // 'C' can be of dimensionality 1 or 2 only\n if (inputs.length === 3 && inputs[2].dims.length !== 1 && inputs[2].dims.length !== 2) {\n throw new Error('Invalid input shape of C');\n }\n\n if ((inputs[0].type !== 'float32' && inputs[0].type !== 'float64') ||\n (inputs[1].type !== 'float32' && inputs[1].type !== 'float64') ||\n (inputs.length === 3 && inputs[2].type !== 'float32' && inputs[2].type !== 'float64')) {\n throw new Error('Invalid input type.');\n }\n\n if ((inputs[0].type !== inputs[1].type) || (inputs.length === 3 && inputs[0].type !== inputs[2].type)) {\n throw new Error('Input types are mismatched');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nexport interface ImageScalerAttributes extends AttributeWithCacheKey {\n scale: number;\n bias: number[];\n}\n\nexport const imageScaler: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ImageScalerAttributes): Tensor[] => {\n validateInputs(inputs);\n const output =\n inferenceHandler.run(createImageScalerProgramInfoLoader(inferenceHandler, inputs, attributes), inputs);\n return [output];\n };\n\nexport const parseImageScalerAttributes: OperatorInitialization =\n (node: Graph.Node): ImageScalerAttributes => {\n const scale = node.attributes.getFloat('scale');\n const bias = node.attributes.getFloats('bias');\n return createAttributeWithCacheKey({scale, bias});\n };\n\nconst imageScalerProgramMetadata = {\n name: 'ImageScaler',\n inputNames: ['X'],\n inputTypes: [TextureType.unpacked],\n};\n\nconst createImageScalerProgramInfo =\n (_handler: WebGLInferenceHandler, metadata: ProgramMetadata, inputs: Tensor[], attributes: ImageScalerAttributes):\n ProgramInfo => {\n const outputShape = inputs[0].dims.slice();\n const rank = outputShape.length;\n const getBiasMethod = createGetBiasMethod(attributes.bias.length);\n const shaderSource = `\n ${getBiasMethod}\n float process(int indices[${rank}]) {\n return _X(indices) * scale + getBias(bias, indices[1]);\n }`;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n variables: [\n {name: 'bias', type: 'float', arrayLength: attributes.bias.length, data: attributes.bias},\n {name: 'scale', type: 'float', data: attributes.scale}\n ],\n shaderSource\n };\n };\n\nconst createImageScalerProgramInfoLoader =\n (handler: WebGLInferenceHandler, inputs: Tensor[], attributes: ImageScalerAttributes): ProgramInfoLoader => {\n const metadata = {...imageScalerProgramMetadata, cacheHint: attributes.cacheKey};\n return {...metadata, get: () => createImageScalerProgramInfo(handler, metadata, inputs, attributes)};\n };\n\nconst createGetBiasMethod = (numChannels: number): string => {\n const codeLines: string[] = [`float getBias(float bias[${numChannels}], int channel) {`];\n for (let i = 0; i < numChannels; ++i) {\n if (i === 0) {\n codeLines.push(\n '\\t' +\n `if (channel == ${i}) { return bias[${i}]; }`);\n } else if (i === numChannels - 1) {\n codeLines.push(\n '\\t' +\n `else { return bias[${i}]; }`);\n } else {\n codeLines.push(\n '\\t' +\n `else if (channel == ${i}) { return bias[${i}]; }`);\n }\n }\n codeLines.push(\n '\\t' +\n '}');\n return codeLines.join('\\n');\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('ImageScaler requires 1 input.');\n }\n if (inputs[0].dims.length !== 4) {\n throw new Error('Invalid input shape.');\n }\n if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n throw new Error('Invalid input type.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, ProgramMetadata, TextureType} from '../types';\n\nexport const instanceNormalization: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], epsilon: number): Tensor[] => {\n validateInputs(inputs);\n\n const meanAndVariance = inferenceHandler.run(createMeanAndVarianceProgramInfoLoader(inputs[0]), inputs);\n const output = inferenceHandler.run(\n createComputeOutputProgramInfoLoader(inferenceHandler, inputs[0], epsilon, meanAndVariance.dims),\n [inputs[0], meanAndVariance, inputs[1], inputs[2]]);\n return [output];\n };\n\nexport const parseInstanceNormalizationAttributes: OperatorInitialization = (node: Graph.Node): number =>\n node.attributes.getFloat('epsilon', 1e-5);\n\nconst meanAndVarianceProgramMetadata = {\n name: 'InstanceNormalization_MeanAndVariance',\n inputNames: ['X'],\n inputTypes: [TextureType.unpacked],\n};\n\nconst createMeanAndVarianceProgramInfo = (metadata: ProgramMetadata, input: Tensor): ProgramInfo => {\n const xDims = input.dims.slice();\n const channel = xDims[1];\n const channelSize = xDims[2] * xDims[3];\n const outputShape = [xDims[0], channel];\n\n const shaderSource = `\n vec4 process(int[2] indices) {\n vec4 v = vec4(0.0);\n int a[4];\n a[0] = indices[0];\n a[1] = indices[1];\n float temp = 0.0;\n for(int a2=0; a2<${xDims[2]}; a2++) {\n a[2] = a2;\n for(int a3=0; a3<${xDims[3]}; a3++) {\n a[3] = a3;\n float x = _X(a);\n temp += x;\n }\n }\n float mean = temp / float(${channelSize});\n temp = 0.0;\n for(int a2=0; a2<${xDims[2]}; a2++) {\n a[2] = a2;\n for(int a3=0; a3<${xDims[3]}; a3++) {\n a[3] = a3;\n float x = _X(a);\n temp += (x - mean) * (x - mean);\n }\n }\n v.r = mean;\n v.g = temp / float(${channelSize});\n\n return v;\n }`;\n return {\n ...metadata,\n output: {dims: outputShape, type: input.type, textureType: TextureType.packedLastDimension},\n shaderSource\n };\n};\n\nconst createMeanAndVarianceProgramInfoLoader = (input: Tensor): ProgramInfoLoader => ({\n ...meanAndVarianceProgramMetadata,\n get: () => createMeanAndVarianceProgramInfo(meanAndVarianceProgramMetadata, input)\n});\n\nconst computeOutputProgramMetadata = {\n name: 'InstanceNormalization_ComputeOutput',\n inputNames: ['X', 'MeanAndVariance', 'Scale', 'B'],\n inputTypes: [TextureType.unpacked, TextureType.packedLastDimension, TextureType.unpacked, TextureType.unpacked],\n};\n\nconst createComputeOutputProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, metadata: ProgramMetadata, input: Tensor, epsilon: number,\n meanAndVarianceShape: readonly number[]): ProgramInfo => {\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const [textureWidth, textureHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(meanAndVarianceShape, TextureType.packedLastDimension);\n const [meanAndVarianceWidth, meanAndVarianceHeight] = [textureWidth / 4, textureHeight];\n const shaderSource = `\n vec4 get_MeanAndVariance(int[2] mv) {\n int offset = indicesToOffset_MeanAndVariance(mv);\n vec2 coords = offsetToCoords(offset, ${meanAndVarianceWidth}, ${meanAndVarianceHeight});\n return ${glsl.texture2D}(MeanAndVariance, coords);\n }\n\n float process(int[4] indices) {\n int mv[2];\n mv[0] = indices[0];\n mv[1] = indices[1];\n vec4 mean_and_variance = get_MeanAndVariance(mv);\n float mean = mean_and_variance.r;\n float variance = mean_and_variance.g;\n\n int sb[1];\n sb[0] = indices[1];\n float scale = _Scale(sb);\n float b = _B(sb);\n\n return scale * (_X(indices) - mean) / sqrt(variance + epsilon) + b;\n }`;\n return {\n ...metadata,\n output: {dims: input.dims, type: input.type, textureType: TextureType.unpacked},\n variables: [{name: 'epsilon', type: 'float', data: epsilon}],\n shaderSource\n };\n };\n\nconst createComputeOutputProgramInfoLoader =\n (inferenceHandler: WebGLInferenceHandler, input: Tensor, epsilon: number, meanAndVarianceShape: readonly number[]):\n ProgramInfoLoader => {\n const metadata = {...computeOutputProgramMetadata, cacheHint: `${epsilon}`};\n return {\n ...metadata,\n get: () => createComputeOutputProgramInfo(inferenceHandler, metadata, input, epsilon, meanAndVarianceShape)\n };\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 3) {\n throw new Error('InstanceNormalization requires 3 inputs.');\n }\n\n const X = inputs[0];\n const scale = inputs[1];\n const B = inputs[2];\n\n // input should at least have three dimensions - N,C,dim1,...,dimn\n // other inputs can have only one dimensions\n if (X.dims.length < 3 || scale.dims.length !== 1 || B.dims.length !== 1) {\n throw new Error('Invalid input shape.');\n }\n if (scale.dims[0] !== X.dims[1] || B.dims[0] !== X.dims[1]) {\n throw new Error('Input shapes are mismatched.');\n }\n if ((X.type !== 'float32' && X.type !== 'float64') || (scale.type !== 'float32' && scale.type !== 'float64') ||\n (B.type !== 'float32' && B.type !== 'float64')) {\n throw new Error('Invalid input type.');\n }\n if (inputs[0].dims.length !== 4) {\n throw new Error('Only support 4-D input shape.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramInfoLoader, TextureType} from '../types';\n\nexport interface LrnAttributes extends AttributeWithCacheKey {\n alpha: number;\n beta: number;\n bias: number;\n size: number;\n}\n\nexport const lrn: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: LrnAttributes): Tensor[] => {\n validateInputs(inputs);\n\n // if (inferenceHandler.session.pack) {\n // return [inferenceHandler.run(createPackedLrnProgramInfoLoader(inferenceHandler, inputs, attributes),\n // inputs)];\n // } else {\n return [inferenceHandler.run(createLrnProgramInfoLoader(inputs, attributes), inputs)];\n //}\n };\n\nexport const parseLrnAttributes: OperatorInitialization = (node: Graph.Node): LrnAttributes => {\n const alpha = node.attributes.getFloat('alpha', 0.0001);\n const beta = node.attributes.getFloat('beta', 0.75);\n const bias = node.attributes.getFloat('bias', 1.0);\n const size = node.attributes.getInt('size');\n\n return createAttributeWithCacheKey({alpha, beta, bias, size});\n};\n\nconst lrnProgramMetadata = {\n name: 'LRN',\n inputNames: ['X'],\n inputTypes: [TextureType.unpacked]\n};\n\nfunction createLrnProgramInfo(inputs: Tensor[], attributes: LrnAttributes): ProgramInfo {\n const C = inputs[0].dims[1];\n const rank = inputs[0].dims.length;\n const from = -Math.floor((attributes.size - 1) / 2);\n const to = Math.ceil((attributes.size - 1) / 2);\n const alpha = `float(${attributes.alpha}) / float(${attributes.size})`;\n const bias = `float(${attributes.bias})`;\n const beta = `float(${attributes.beta})`;\n\n const shaderSource = `\n float process(int indices[${rank}]) {\n int c = indices[1];\n float x = _X(indices);\n float square_sum = 0.0;\n\n for (int i = ${from}; i <= ${to}; i++) {\n int idx = c + i;\n if (c >= 0 && c < ${C}) {\n indices[1] = idx;\n float j = _X(indices);\n square_sum += j * j;\n }\n }\n return x / pow(${bias} + ${alpha} * square_sum, ${beta});\n }`;\n return {\n ...lrnProgramMetadata,\n cacheHint: attributes.cacheKey,\n output: {dims: inputs[0].dims, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource,\n };\n}\n\nexport function createLrnProgramInfoLoader(inputs: Tensor[], attributes: LrnAttributes): ProgramInfoLoader {\n return {...lrnProgramMetadata, cacheHint: attributes.cacheKey, get: () => createLrnProgramInfo(inputs, attributes)};\n}\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('LRN requires 1 input.');\n }\n if (inputs[0].dims.length !== 4) {\n throw new Error('currently only support LRN for input with \"NCHW\" format');\n }\n if (inputs[0].type !== 'float32') {\n throw new Error('input should be float type');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {getGlsl, Glsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, TextureType} from '../types';\n\nexport interface PadAttributes extends AttributeWithCacheKey {\n readonly mode: string;\n readonly pads: number[];\n readonly value: number;\n}\n\nconst padProgramMetadata = {\n name: 'Pad',\n inputNames: ['A'],\n inputTypes: [TextureType.unpacked],\n};\n\nexport const padV2: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: PadAttributes): Tensor[] => {\n validateInputsV2(inputs);\n const output = inferenceHandler.run(\n {\n ...padProgramMetadata,\n cacheHint: attributes.cacheKey,\n get: () => createPadProgramInfo(inferenceHandler, inputs[0], attributes)\n },\n inputs);\n return [output];\n };\n\nexport const parsePadAttributesV2: OperatorInitialization = (node: Graph.Node): PadAttributes => {\n const mode = node.attributes.getString('mode', 'constant');\n const value = node.attributes.getFloat('value', 0.0);\n const pads = node.attributes.getInts('pads');\n return createAttributeWithCacheKey({mode, value, pads});\n};\n\nexport const padV11: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], mode: string): Tensor[] => {\n validateInputsV11(inputs);\n const attrubutes = generatePadAttributesFromInputs(inferenceHandler, inputs, mode);\n return padV2(inferenceHandler, [inputs[0]], attrubutes);\n };\n\nexport const parsePadAttributesV11: OperatorInitialization = (node: Graph.Node): string =>\n node.attributes.getString('mode', 'constant');\n\nconst generatePadAttributesFromInputs =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], mode: string): PadAttributes => {\n if (!inferenceHandler.session.isInitializer(inputs[1].dataId) ||\n (inputs.length >= 3 && !inferenceHandler.session.isInitializer(inputs[2].dataId))) {\n throw new Error('dynamic pad attributes are not allowed');\n }\n\n const pads = Array.from(inputs[1].integerData);\n const value = (inputs.length >= 3) ? inputs[2].floatData[0] : 0.0;\n\n return createAttributeWithCacheKey({mode, pads, value});\n };\n\nconst createPadProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, input: Tensor, attributes: PadAttributes): ProgramInfo => {\n const outputShape = ShapeUtil.padShape(input.dims.slice(), attributes.pads);\n const rank = outputShape.length;\n const padFunction = getPadFunction(inferenceHandler, input, attributes);\n const shaderSource = `\n ${padFunction}\n float process(int[${rank}] indices) {\n return padA(indices);\n }`;\n return {\n name: 'Pad',\n inputNames: ['A'],\n inputTypes: [TextureType.unpacked],\n output: {dims: outputShape, type: input.type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst validateInputsV2 = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Pad requires 1 input');\n }\n if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n throw new Error('Invalid input type.');\n }\n};\n\nconst validateInputsV11 = (inputs: Tensor[]): void => {\n if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n throw new Error('Pad requires 2 or 3 inputs');\n }\n if (inputs[1].type !== 'int32') {\n throw new Error('Invalid input type.');\n }\n if (inputs.length >= 3 && inputs[2].type === 'string') {\n throw new Error('Invalid input type.');\n }\n};\n\nconst getPadFunction = (inferenceHandler: WebGLInferenceHandler, input: Tensor, attributes: PadAttributes): string => {\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const [width, height] = inferenceHandler.calculateTextureWidthAndHeight(input.dims, TextureType.unpacked);\n const strides = ShapeUtil.computeStrides(input.dims);\n\n switch (attributes.mode) {\n case 'constant':\n return getPadConstant(glsl, input.dims, strides, width, height, attributes.pads, attributes.value);\n case 'reflect':\n return getPadReflect(glsl, input.dims, strides, width, height, attributes.pads);\n case 'edge':\n return getPadEdge(glsl, input.dims, strides, width, height, attributes.pads);\n default:\n throw new Error('Invalid mode');\n }\n};\n\nconst getPadConstant =\n (glsl: Glsl, shape: readonly number[], strides: readonly number[], width: number, height: number, pads: number[],\n value: number): string => {\n const rank = shape.length;\n let block = '';\n for (let i = rank - 1; i >= 0; --i) {\n block += `\n k = m[${i}] - ${pads[i]};\n if (k < 0) return constant;\n if (k >= ${shape[i]}) return constant;\n offset += k * ${strides[i]};\n `;\n }\n return `\n float padA(int m[${rank}]) {\n const float constant = float(${value});\n int offset = 0;\n int k = 0;\n ${block}\n vec2 coords = offsetToCoords(offset, ${width}, ${height});\n float value = getColorAsFloat(${glsl.texture2D}(A, coords));\n return value;\n }\n `;\n };\n\nconst getPadReflect =\n (glsl: Glsl, shape: readonly number[], strides: readonly number[], width: number, height: number, pads: number[]):\n string => {\n const rank = shape.length;\n\n let block = '';\n for (let i = rank - 1; i >= 0; --i) {\n block += `\n k = m[${i}] - ${pads[i]};\n if (k < 0) { k = -k; }\n {\n const int _2n_1 = ${2 * (shape[i] - 1)};\n k = int( mod( float(k), float(_2n_1) ) ) ;\n if(k >= ${shape[i]}) { k = _2n_1 - k; }\n }\n offset += k * ${strides[i]};\n `;\n }\n return `\n float padA(int m[${rank}]) {\n int offset = 0;\n int k = 0;\n ${block}\n vec2 coords = offsetToCoords(offset, ${width}, ${height});\n float value = getColorAsFloat(${glsl.texture2D}(A, coords));\n return value;\n }\n `;\n };\n\nconst getPadEdge =\n (glsl: Glsl, shape: readonly number[], strides: readonly number[], width: number, height: number, pads: number[]):\n string => {\n const rank = shape.length;\n\n let block = '';\n for (let i = rank - 1; i >= 0; --i) {\n block += `\n k = m[${i}] - ${pads[i]};\n if (k < 0) k = 0;\n if (k >= ${shape[i]}) k = ${shape[i] - 1};\n offset += k * ${strides[i]};\n `;\n }\n return `\n float padA(int m[${rank}]) {\n int offset = 0;\n int k = 0;\n ${block}\n vec2 coords = offsetToCoords(offset, ${width}, ${height});\n float value = getColorAsFloat(${glsl.texture2D}(A, coords));\n return value;\n }\n `;\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {PoolConvUtil, ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramMetadata, TextureType} from '../types';\n\nexport interface AveragePoolAttributes extends AttributeWithCacheKey {\n readonly autoPad: string;\n readonly ceilMode: number;\n readonly countIncludePad: boolean;\n readonly kernelShape: readonly number[];\n readonly strides: readonly number[];\n readonly pads: readonly number[];\n}\n\nexport const averagePool: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: AveragePoolAttributes): Tensor[] => {\n validateInputs(inputs);\n const metadata =\n {name: 'AveragePool', inputNames: ['X'], inputTypes: [TextureType.unpacked], cacheHint: attributes.cacheKey};\n const output = inferenceHandler.run(\n {...metadata, get: () => createAveragePoolProgramInfo(inputs, metadata, false, attributes)}, inputs);\n return [output];\n };\n\nexport const parseAveragePoolAttributes: OperatorInitialization =\n (node: Graph.Node): AveragePoolAttributes => {\n const autoPad = node.attributes.getString('auto_pad', 'NOTSET');\n const ceilMode = node.attributes.getInt('ceil_mode', 0);\n const countIncludePad = (node.attributes.getInt('count_include_pad', 0) === 0 ? false : true);\n const kernelShape = node.attributes.getInts('kernel_shape');\n const strides = node.attributes.getInts('strides', []);\n const pads = node.attributes.getInts('pads', []);\n\n // TODO: support attribute 'ceil_mode'\n if (ceilMode !== 0) {\n throw new Error('using ceil() in shape computation is not yet supported for AveragePool');\n }\n\n return createAttributeWithCacheKey({autoPad, ceilMode, countIncludePad, kernelShape, strides, pads});\n };\n\nconst createAveragePoolProgramInfo =\n (inputs: Tensor[], metadata: ProgramMetadata, isGlobalOperator: boolean, attributes: AveragePoolAttributes):\n ProgramInfo => {\n const [adjustedAttributes, outputShape] =\n getAdjustedPoolAttributesAndOutputShape(inputs, attributes, isGlobalOperator);\n const kernelSize = ShapeUtil.size(adjustedAttributes.kernelShape);\n const op1 = 'value += _X(x);';\n let op2 = '';\n if (adjustedAttributes.countIncludePad) {\n op2 += `value /= float(${kernelSize});`;\n } else {\n op2 += `value /= float(${kernelSize} - pad);`;\n }\n const poolingCode = generatePoolingCode(inputs[0].dims, adjustedAttributes, op1, op2, '0.0');\n const shaderSource = `\n ${poolingCode}\n `;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nexport const globalAveragePool: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: AveragePoolAttributes): Tensor[] => {\n validateInputs(inputs);\n const metadata = {\n name: 'GlobalAveragePool',\n inputNames: ['X'],\n inputTypes: [TextureType.unpacked],\n cacheHint: `${attributes.countIncludePad}`\n };\n const output = inferenceHandler.run(\n {...metadata, get: () => createAveragePoolProgramInfo(inputs, metadata, true, attributes)}, inputs);\n return [output];\n };\n\nexport const parseGlobalAveragePoolAttributes: OperatorInitialization =\n (node: Graph.Node): AveragePoolAttributes => {\n const countIncludePad = (node.attributes.getInt('count_include_pad', 0) === 0 ? false : true);\n return createAttributeWithCacheKey(\n {autoPad: '', ceilMode: 0, countIncludePad, kernelShape: [], strides: [], pads: []});\n };\n\nexport interface MaxPoolAttributes extends AveragePoolAttributes {\n readonly storageOrder: number;\n readonly dilations: number[];\n}\n\nexport const maxPool: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: MaxPoolAttributes): Tensor[] => {\n validateInputs(inputs);\n const metadata =\n {name: 'MaxPool', inputNames: ['X'], inputTypes: [TextureType.unpacked], cacheHint: attributes.cacheKey};\n const output = inferenceHandler.run(\n {...metadata, get: () => createMaxPoolProgramInfo(inputs, metadata, false, attributes)}, inputs);\n return [output];\n };\n\nexport const parseMaxPoolAttributes: OperatorInitialization =\n (node: Graph.Node): MaxPoolAttributes => {\n const autoPad = node.attributes.getString('auto_pad', 'NOTSET');\n const ceilMode = node.attributes.getInt('ceil_mode', 0);\n const kernelShape = node.attributes.getInts('kernel_shape');\n const strides = node.attributes.getInts('strides', []);\n const pads = node.attributes.getInts('pads', []);\n const storageOrder = node.attributes.getInt('storage_order', 0);\n const dilations = node.attributes.getInts('dilations', []);\n\n // TODO: support attribute 'ceil_mode' and 'storage_order'\n if (storageOrder !== 0) {\n throw new Error('column major storage order is not yet supported for MaxPool');\n }\n if (ceilMode !== 0) {\n throw new Error('using ceil() in shape computation is not yet supported for MaxPool');\n }\n\n return createAttributeWithCacheKey(\n {autoPad, ceilMode, countIncludePad: false, kernelShape, strides, pads, storageOrder, dilations});\n };\n\nconst createMaxPoolProgramInfo =\n (inputs: Tensor[], metadata: ProgramMetadata, isGlobalOperator: boolean, attributes: MaxPoolAttributes):\n ProgramInfo => {\n const [adjustedAttributes, outputShape] =\n getAdjustedPoolAttributesAndOutputShape(inputs, attributes, isGlobalOperator);\n const op1 = `\n value = max(_X(x), value);\n `;\n const op2 = '';\n const poolingCode = generatePoolingCode(inputs[0].dims, adjustedAttributes, op1, op2, '-1e5');\n const shaderSource = `\n ${poolingCode}\n `;\n return {\n ...metadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst getAdjustedPoolAttributesAndOutputShape =\n (inputs: Tensor[], attributes: AveragePoolAttributes|MaxPoolAttributes, isGlobalOperator: boolean):\n [AveragePoolAttributes|MaxPoolAttributes, number[]] => {\n const inputShape = inputs[0].dims.slice();\n const hasDilations = Object.hasOwnProperty.call(attributes, 'dilations');\n const kernelShape = attributes.kernelShape.slice();\n const strides = attributes.strides.slice();\n const dilations: number[] = hasDilations ? (attributes as MaxPoolAttributes).dilations.slice() : [];\n const pads = attributes.pads.slice();\n PoolConvUtil.adjustPoolAttributes(isGlobalOperator, inputShape, kernelShape, strides, dilations, pads);\n\n const outputShape = PoolConvUtil.computePoolOutputShape(\n isGlobalOperator, inputShape, strides, dilations, kernelShape, pads, attributes.autoPad);\n\n const newAttributes = Object.assign({}, attributes);\n if (hasDilations) {\n Object.assign(newAttributes, {kernelShape, strides, pads, dilations, cacheKey: attributes.cacheKey});\n } else {\n Object.assign(newAttributes, {kernelShape, strides, pads, cacheKey: attributes.cacheKey});\n }\n return [newAttributes, outputShape];\n };\n\nconst globalMaxPoolAttributes = {\n autoPad: '',\n ceilMode: 0,\n countIncludePad: false,\n kernelShape: [],\n strides: [],\n pads: [],\n storageOrder: 0,\n dilations: [],\n cacheKey: ''\n};\n\nconst globalMaxPoolMetadata = {\n name: 'GlobalMaxPool',\n inputNames: ['X'],\n inputTypes: [TextureType.unpacked]\n};\n\nexport const globalMaxPool = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n validateInputs(inputs);\n const output = inferenceHandler.run(\n {\n ...globalMaxPoolMetadata,\n get: () => createMaxPoolProgramInfo(inputs, globalMaxPoolMetadata, true, globalMaxPoolAttributes)\n },\n inputs);\n return [output];\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Pool ops requires 1 input.');\n }\n if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n throw new Error('Invalid input type.');\n }\n};\n\nconst generatePoolingCode =\n (inputDims: readonly number[], attributes: AveragePoolAttributes, op1: string, op2: string, start: string):\n string => {\n const rank = inputDims.length;\n if (attributes.kernelShape.length <= 2) {\n const kw = attributes.kernelShape[attributes.kernelShape.length - 1];\n const sw = attributes.strides[attributes.strides.length - 1];\n const pwStart = attributes.pads[attributes.pads.length / 2 - 1];\n const pwEnd = attributes.pads[attributes.pads.length - 1];\n const dimW = inputDims[rank - 1];\n let codeW = '';\n let codeH = '';\n let codeHEnd = '';\n if (pwStart + pwEnd !== 0) {\n codeW = `\n for (int i = 0; i < ${kw}; i++) {\n x[${rank} - 1] = indices[${rank} - 1] * ${sw} - ${pwStart} + i;\n if (x[${rank} - 1] < 0 || x[${rank} - 1] >= ${dimW}) {\n pad++;\n continue;\n }\n ${op1}\n }`;\n } else {\n codeW = `\n for (int i = 0; i < ${kw}; i++) {\n x[${rank} - 1] = indices[${rank} - 1] * ${sw} - ${pwStart} + i;\n ${op1}\n }`;\n }\n\n if (attributes.kernelShape.length === 2) {\n const kh = attributes.kernelShape[attributes.kernelShape.length - 2];\n const sh = attributes.strides[attributes.strides.length - 2];\n const phStart = attributes.pads[attributes.pads.length / 2 - 2];\n const phEnd = attributes.pads[attributes.pads.length - 2];\n const dimH = inputDims[rank - 2];\n if (phStart + phEnd !== 0) {\n codeH = `\n for (int j = 0; j < ${kh}; j++) {\n x[${rank} - 2] = indices[${rank} - 2] * ${sh} - ${phStart} + j;\n if (x[${rank} - 2] < 0 || x[${rank} - 2] >= ${dimH}) {\n pad+= ${kw};\n continue;\n }\n `;\n } else {\n codeH = `\n for (int j = 0; j < ${kh}; j++) {\n x[${rank} - 2] = indices[${rank} - 2] * ${sh} - ${phStart} + j;\n `;\n }\n codeHEnd = `\n }\n `;\n }\n\n const poolingCode = `\n float process(int indices[${rank}]) {\n int x[${rank}];\n copyVec(indices, x);\n\n float value = ${start};\n int pad = 0;\n ${codeH}\n ${codeW}\n ${codeHEnd}\n ${op2}\n return value;\n }\n `;\n return poolingCode;\n } else {\n const kernelSize = ShapeUtil.size(attributes.kernelShape);\n const kernelStrides = ShapeUtil.computeStrides(attributes.kernelShape);\n const stridesRank = kernelStrides.length;\n const padsRank = attributes.pads.length;\n const offsetToIndicesFunction = offsetToIndices(stridesRank);\n const copyInputDims = copyArray(inputDims, 'inputDims');\n const copyPads = copyArray(attributes.pads, 'pads');\n const copyKernelStrides = copyArray(kernelStrides, 'kernelStrides');\n const copyStrides = copyArray(attributes.strides, 'strides');\n const hasPads = attributes.pads.reduce((sum, cur) => sum + cur);\n let padCode = '';\n if (hasPads) {\n padCode = `\n if (x[j] >= inputDims[j] || x[j] < 0) {\n pad++;\n isPad = true;\n break;\n }\n }\n if (!isPad) {\n ${op1}\n }`;\n } else {\n padCode = `\n }\n ${op1}\n `;\n }\n const poolingCode = `\n ${offsetToIndicesFunction}\n float process(int indices[${rank}]) {\n int x[${rank}];\n copyVec(indices, x);\n int offset[${stridesRank}];\n int pads[${padsRank}];\n int inputDims[${rank}];\n int kernelStrides[${stridesRank}];\n int strides[${stridesRank}];\n ${copyPads}\n ${copyInputDims}\n ${copyStrides}\n ${copyKernelStrides}\n\n float value = ${start};\n int pad = 0;\n bool isPad = false;\n for (int i = 0; i < ${kernelSize}; i++) {\n offsetToIndices(i, kernelStrides, offset);\n isPad = false;\n for (int j = ${rank} - ${stridesRank}; j < ${rank}; j++) {\n x[j] = indices[j] * strides[j - ${rank} + ${stridesRank}]\n + offset[j - ${rank} + ${stridesRank}] - pads[j - 2];\n ${padCode}\n }\n ${op2}\n\n return value;\n }\n `;\n return poolingCode;\n }\n };\n\nconst copyArray = (array: readonly number[], arrayName: string): string => {\n let block = '';\n for (let i = 0; i < array.length; i++) {\n block += `\n ${arrayName}[${i}] = ${array[i]};\n `;\n }\n return block;\n};\n\nconst offsetToIndices = (rank: number): string => `\n void offsetToIndices(int offset, int[${rank}] strides, out int[${rank}] indices) {\n if (${rank} == 0) {\n return;\n }\n for (int i = 0; i < ${rank} - 1; ++i) {\n indices[i] = offset / strides[i];\n offset -= indices[i] * strides[i];\n }\n indices[${rank} - 1] = offset;\n }`;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {NUMBER_TYPES, OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramMetadata, TextureType} from '../types';\n\nexport interface ReduceAttributes extends AttributeWithCacheKey {\n readonly axes: number[];\n readonly keepDims: boolean;\n}\n\n// return [init ops, reduce ops, final ops]\ntype ReduceOp = (inputs: Tensor[], axes: number[]) => string[];\n\nconst reduce =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes, name: string,\n reduceOp: ReduceOp): Tensor[] => {\n validateInputs(inputs);\n\n const reduceProgramMetadata = {\n name,\n inputNames: ['A'],\n inputTypes: [TextureType.unpacked],\n };\n\n const output = inferenceHandler.run(\n {\n ...reduceProgramMetadata,\n cacheHint: attributes.cacheKey,\n get: () =>\n createReduceProgramInfo(inferenceHandler, inputs, attributes, name, reduceOp, reduceProgramMetadata)\n },\n inputs);\n return [output];\n };\n\nexport const parseReduceAttributes: OperatorInitialization = (node: Graph.Node): ReduceAttributes => {\n const axes = node.attributes.getInts('axes', []);\n const keepDims = node.attributes.getInt('keepdims', 1) === 1;\n return createAttributeWithCacheKey({axes, keepDims});\n};\n\nconst createReduceProgramInfo =\n (_handler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes, _name: string, reduceOp: ReduceOp,\n reduceProgramMetadata: ProgramMetadata): ProgramInfo => {\n const outputShape: number[] = [];\n const iRank = inputs[0].dims.length || 1;\n\n const idxCopy = []; // copy output indexes to input indexes\n\n const axes = ShapeUtil.normalizeAxes(attributes.axes, inputs[0].dims.length);\n const ops = reduceOp(inputs, axes);\n let reduceOps = ops[1];\n\n for (let k = 0; k < inputs[0].dims.length; k++) {\n // if this axis is reduced\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n if (attributes.keepDims) {\n outputShape.push(1);\n } // else { remove the axis from outputShape; }\n\n // loop over the d-th axis\n reduceOps = `\n for(int j${k} = 0; j${k} < ${inputs[0].dims[k]}; j${k}++) {\n inputIdx[${k}] = j${k};\n ${reduceOps}\n }`;\n } else {\n idxCopy.push(`inputIdx[${k}] = outputIdx[${outputShape.length}];`);\n\n outputShape.push(inputs[0].dims[k]);\n }\n }\n\n const oRank = outputShape.length || 1;\n\n const shaderSource = `\n float process(int outputIdx[${oRank}]) {\n float value; // final result\n int inputIdx[${iRank}]; // addressing input data\n ${idxCopy.join('\\n')}\n ${ops[0]} // init ops for reduce max/min\n ${reduceOps}\n ${ops[2]} // final computation for reduce mean\n return value;\n }`;\n\n return {\n ...reduceProgramMetadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n // TODO: support Reduce* operators with 2 inputs.\n if (!inputs || inputs.length !== 1) {\n throw new Error('Reduce op requires 1 input.');\n }\n\n if (NUMBER_TYPES.indexOf(inputs[0].type) === -1) {\n throw new Error('Invalid input type.');\n }\n};\n\nexport const reduceSum: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes): Tensor[] => {\n const reduceOp: ReduceOp = (): string[] => ['value = 0.0;', 'value += _A(inputIdx);', ''];\n return reduce(inferenceHandler, inputs, attributes, 'ReduceSum', reduceOp);\n };\n\nexport const reduceMean: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes): Tensor[] => {\n const reduceOp: ReduceOp = (inputs: Tensor[], axes: number[]): string[] => {\n let size = 1.0;\n for (let k = 0; k < inputs[0].dims.length; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n size *= inputs[0].dims[k];\n }\n }\n\n return ['value = 0.0;', 'value += _A(inputIdx);', `value /= ${size}.;`]; // ensure real number with `.`\n };\n return reduce(inferenceHandler, inputs, attributes, 'ReduceMean', reduceOp);\n };\n\nexport const reduceMax: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes): Tensor[] => {\n const reduceOp: ReduceOp = (inputs: Tensor[], axes: number[]): string[] => {\n const idxZero = [];\n for (let k = 0; k < inputs[0].dims.length; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(`inputIdx[${k}] = 0;`); // first element\n }\n }\n\n return [`${idxZero.join('\\n')}\\nvalue = _A(inputIdx);`, 'value = max(value, _A(inputIdx));', ''];\n };\n return reduce(inferenceHandler, inputs, attributes, 'ReduceMax', reduceOp);\n };\n\nexport const reduceMin: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes): Tensor[] => {\n const reduceOp: ReduceOp = (inputs: Tensor[], axes: number[]): string[] => {\n const idxZero = [];\n for (let k = 0; k < inputs[0].dims.length; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(`inputIdx[${k}] = 0;`); // first element\n }\n }\n\n return [`${idxZero.join('\\n')}\\nvalue = _A(inputIdx);`, 'value = min(value, _A(inputIdx));', ''];\n };\n return reduce(inferenceHandler, inputs, attributes, 'ReduceMin', reduceOp);\n };\n\nexport const reduceProd: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes): Tensor[] => {\n const reduceOp: ReduceOp = (): string[] => ['value = 1.0;', 'value *= _A(inputIdx);', ''];\n return reduce(inferenceHandler, inputs, attributes, 'ReduceProd', reduceOp);\n };\n\nexport const reduceLogSum: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes): Tensor[] => {\n const reduceOp: ReduceOp = (): string[] => ['value = 0.0;', 'value += _A(inputIdx);', 'value = log(value);'];\n return reduce(inferenceHandler, inputs, attributes, 'ReduceLogSum', reduceOp);\n };\n\nexport const reduceLogSumSquare: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: ReduceAttributes): Tensor[] => {\n const reduceOp: ReduceOp = (): string[] => ['float t; value = 0.0;', 't = _A(inputIdx); value += t * t;', ''];\n return reduce(inferenceHandler, inputs, attributes, 'ReduceLogSumSquare', reduceOp);\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nexport const reshape = (handler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n const reshapedDims = ShapeUtil.calculateReshapedDims(inputs[0].dims, inputs[1].integerData);\n if (handler.session.pack) {\n return [handler.reshapePacked(inputs[0], reshapedDims)];\n } else {\n return [handler.reshapeUnpacked(inputs[0], reshapedDims)];\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, TextureType} from '../types';\n\nexport interface UpsampleAttributes extends AttributeWithCacheKey {\n readonly opset: number;\n readonly isResize: boolean;\n readonly mode: string;\n readonly scales: number[];\n readonly extrapolationValue: number;\n readonly coordinateTransformMode: string;\n readonly useExtrapolation: boolean;\n readonly needRoiInput: boolean;\n readonly nearestMode: string;\n readonly cubicCoefficientA: number;\n readonly excludeOutside: boolean;\n readonly useNearest2xOptimization: boolean;\n readonly roiInputIdx: number;\n readonly scalesInputIdx: number;\n readonly sizesInputIdx: number;\n}\n\nconst upsampleProgramMetadata = {\n name: 'Upsample',\n inputNames: ['X'],\n inputTypes: [TextureType.unpacked],\n};\n\nexport const upsample: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: UpsampleAttributes): Tensor[] => {\n validateInputs(inputs, attributes);\n const output = inferenceHandler.run(\n {\n ...upsampleProgramMetadata,\n cacheHint: attributes.cacheKey,\n get: () => createUpsampleProgramInfo(inferenceHandler, inputs, attributes)\n },\n inputs);\n return [output];\n };\n\nexport const parseUpsampleAttributesV7: OperatorInitialization =\n (node: Graph.Node): UpsampleAttributes => parseUpsampleAttributes(node, 7);\n\nexport const parseUpsampleAttributesV9: OperatorInitialization =\n (node: Graph.Node): UpsampleAttributes => parseUpsampleAttributes(node, 9);\n\nexport const parseUpsampleAttributes = (node: Graph.Node, opset: number): UpsampleAttributes => {\n const isResize = (opset >= 10);\n\n // processing node attributes\n const mode = node.attributes.getString('mode', 'nearest');\n if (mode !== 'nearest' && mode !== 'linear' && (opset < 11 || mode !== 'cubic')) {\n throw new Error(`unrecognized mode: ${mode}`);\n }\n\n let scales: number[] = [];\n if (opset < 9) {\n scales = node.attributes.getFloats('scales');\n scalesValidation(scales, mode, isResize);\n }\n\n const extrapolationValue = node.attributes.getFloat('extrapolation_value', 0.0);\n\n const coordinateTransformMode =\n opset > 10 ? node.attributes.getString('coordinate_transformation_mode', 'half_pixel') : 'asymmetric';\n if ([\n 'asymmetric', 'pytorch_half_pixel', 'tf_half_pixel_for_nn', 'align_corners', 'tf_crop_and_resize', 'half_pixel'\n ].indexOf(coordinateTransformMode) === -1) {\n throw new Error(`coordinate_transform_mode '${coordinateTransformMode}' is not supported`);\n }\n const needRoiInput = (coordinateTransformMode === 'tf_crop_and_resize');\n const useExtrapolation = needRoiInput;\n\n const nearestMode =\n (mode === 'nearest' && opset >= 11) ? node.attributes.getString('nearest_mode', 'round_prefer_floor') : '';\n if (['round_prefer_floor', 'round_prefer_ceil', 'floor', 'ceil', ''].indexOf(nearestMode) === -1) {\n throw new Error(`nearest_mode '${nearestMode}' is not supported`);\n }\n\n const cubicCoefficientA = node.attributes.getFloat('cubic_coeff_a', -0.75);\n const excludeOutside = node.attributes.getInt('exclude_outside', 0) !== 0;\n if (excludeOutside && mode !== 'cubic') {\n throw new Error('exclude_outside can be set to 1 only when mode is CUBIC.');\n }\n\n const useNearest2xOptimization =\n (opset < 11) ? true : (mode === 'nearest' && coordinateTransformMode === 'asymmetric' && nearestMode === 'floor');\n\n let roiInputIdx = 0;\n let scalesInputIdx = 0;\n let sizesInputIdx = 0;\n\n if (opset > 10) {\n // handle when roiInput is not given\n if (node.inputs.length > 2) {\n roiInputIdx = 1;\n scalesInputIdx = 2;\n sizesInputIdx = 3;\n } else {\n scalesInputIdx = 1;\n sizesInputIdx = 2;\n }\n } else if (opset === 9) {\n scalesInputIdx = 1;\n }\n\n return createAttributeWithCacheKey({\n opset,\n isResize,\n mode,\n scales,\n extrapolationValue,\n coordinateTransformMode,\n useExtrapolation,\n needRoiInput,\n nearestMode,\n cubicCoefficientA,\n excludeOutside,\n useNearest2xOptimization,\n roiInputIdx,\n scalesInputIdx,\n sizesInputIdx\n });\n};\n\nconst createUpsampleProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: UpsampleAttributes): ProgramInfo => {\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const [inputWidth, inputHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(inputs[0].dims, TextureType.unpacked);\n\n const outputShape = inputs[0].dims.map((dim, i) => Math.floor(dim * attributes.scales[i]));\n const [outputWidth, outputHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(outputShape, TextureType.unpacked);\n const dim = outputShape.length;\n\n const outputPitches = new Array(dim);\n const inputPitches = new Array(dim);\n let precalculatedPitches = `\n int output_pitches[${dim}];\n int input_pitches[${dim}];\n `;\n for (let d = dim - 1; d >= 0; d--) {\n outputPitches[d] = (d === dim - 1) ? 1 : outputPitches[d + 1] * outputShape[d + 1];\n inputPitches[d] = (d === dim - 1) ? 1 : inputPitches[d + 1] * inputs[0].dims[d + 1];\n\n precalculatedPitches += `\n output_pitches[${d}] = ${outputPitches[d]};\n input_pitches[${d}] = ${inputPitches[d]};\n `;\n }\n const getInputFloatFunction = `\n float getInputFloat(int index) {\n vec2 coords = offsetToCoords(index, ${inputWidth}, ${inputHeight});\n float value = getColorAsFloat(${glsl.texture2D}(X, coords));\n return value;\n }\n `;\n\n const shaderSource = attributes.mode === 'nearest' ?\n // nearest\n `\n ${getInputFloatFunction}\n float process(int indices[${dim}]) {\n int input_index = 0;\n int output_index = coordsToOffset(TexCoords, ${outputWidth}, ${outputHeight});\n\n ${precalculatedPitches}\n\n int d, m;\n for (int dim = 0; dim < ${dim}; ++dim) {\n d = output_index / output_pitches[dim];\n m = output_index - d * output_pitches[dim];\n output_index = m;\n\n if (scales[dim] != 1 && d > 0) {\n int d2 = d / scales[dim];\n m = d - d2 * scales[dim];\n d = d2;\n }\n input_index += input_pitches[dim] * d;\n }\n\n return getInputFloat(input_index);\n }` :\n dim === 4 ?\n // bilinear 4D\n `\n ${getInputFloatFunction}\n float process(int indices[4]) {\n int input_index = 0;\n int output_index = coordsToOffset(TexCoords, ${outputWidth}, ${outputHeight});\n\n ${precalculatedPitches}\n\n int m;\n int index_of_dim0, index_of_dim1, index_of_dim2, index_of_dim3;\n index_of_dim0 = output_index / output_pitches[0];\n m = output_index - index_of_dim0 * output_pitches[0];\n index_of_dim1 = m / output_pitches[1];\n m = m - index_of_dim1 * output_pitches[1];\n index_of_dim2 = m / output_pitches[2];\n m = m - index_of_dim2 * output_pitches[2];\n index_of_dim3 = m;\n\n int index_of_input_dim2, index_of_input_dim3, x_offset, y_offset;\n index_of_input_dim2 = index_of_dim2 / scales[2];\n y_offset = index_of_dim2 - index_of_input_dim2 * scales[2];\n index_of_input_dim3 = index_of_dim3 / scales[3];\n x_offset = index_of_dim3 - index_of_input_dim3 * scales[3];\n\n input_index = index_of_dim0 * input_pitches[0] +\n index_of_dim1 * input_pitches[1] +\n index_of_input_dim2 * input_pitches[2] +\n index_of_input_dim3;\n\n float x00 = getInputFloat(input_index);\n float x10, x01, x11;\n\n bool end_of_dim2 = false;\n if (index_of_input_dim2 == (${inputs[0].dims[2]} - 1)) {\n // It's the end in dimension 2\n x01 = x00;\n end_of_dim2 = true;\n } else {\n x01 = getInputFloat(input_index + input_pitches[2]);\n }\n\n if (index_of_input_dim3 == (input_pitches[2] - 1)) {\n // It's the end in dimension 3\n x10 = x00;\n x11 = x01;\n }\n else {\n x10 = getInputFloat(input_index + 1);\n x11 = end_of_dim2 ? x10 : getInputFloat(input_index + input_pitches[2] + 1);\n }\n\n float y0 = x00 + float(y_offset) * (x01 - x00) / float(scales[2]);\n float y1 = x10 + float(y_offset) * (x11 - x10) / float(scales[2]);\n return y0 + float(x_offset) * (y1 - y0) / float(scales[3]);\n }` :\n // bilinear 2D\n `\n ${getInputFloatFunction}\n float process(int indices[2]) {\n int input_index = 0;\n int output_index = coordsToOffset(TexCoords, ${outputWidth}, ${outputHeight});\n\n ${precalculatedPitches}\n\n int m;\n int index_of_dim0, index_of_dim1;\n index_of_dim0 = output_index / output_pitches[0];\n m = output_index - index_of_dim0 * output_pitches[0];\n index_of_dim1 = m;\n\n int index_of_input_dim0, index_of_input_dim1, x_offset, y_offset;\n index_of_input_dim0 = index_of_dim0 / scales[0];\n y_offset = index_of_dim0 - index_of_input_dim0 * scales[0];\n index_of_input_dim1 = index_of_dim1 / scales[1];\n x_offset = index_of_dim1 - index_of_input_dim1 * scales[1];\n\n input_index = index_of_input_dim0 * input_pitches[0] + index_of_input_dim1;\n\n float x00 = getInputFloat(input_index);\n float x10, x01, x11;\n\n bool end_of_dim0 = false;\n if (index_of_input_dim0 == (${inputs[0].dims[0]} - 1)) {\n // It's the end in dimension 0\n x01 = x00;\n end_of_dim0 = true;\n } else {\n x01 = getInputFloat(input_index + input_pitches[0]);\n }\n\n if (index_of_input_dim1 == (input_pitches[0] - 1)) {\n // It's the end in dimension 1\n x10 = x00;\n x11 = x01;\n }\n else {\n x10 = getInputFloat(input_index + 1);\n x11 = end_of_dim0 ? x10 : getInputFloat(input_index + input_pitches[0] + 1);\n }\n\n float y0 = x00 + float(y_offset) * (x01 - x00) / float(scales[0]);\n float y1 = x10 + float(y_offset) * (x11 - x10) / float(scales[0]);\n return y0 + float(x_offset) * (y1 - y0) / float(scales[1]);\n }`;\n return {\n ...upsampleProgramMetadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource,\n variables: [{\n name: 'scales',\n type: 'int',\n arrayLength: attributes.scales.length,\n data: attributes.scales.map(x => Math.ceil(x))\n }]\n };\n };\n\nexport const validateInputs = (inputs: Tensor[], attribute: UpsampleAttributes): void => {\n if (!inputs || (attribute.opset < 9 && inputs.length !== 1) ||\n (attribute.opset >= 9 && attribute.opset < 11 && inputs.length !== 2) ||\n (attribute.opset >= 11 && inputs.length < 2)) {\n throw new Error('invalid inputs.');\n }\n\n if (attribute.scales.length > 0 && inputs[0].dims.length !== attribute.scales.length) {\n throw new Error('Invalid input shape.');\n }\n\n if (inputs[0].type === 'string') {\n throw new Error('Invalid input tensor types.');\n }\n};\n\nexport const scalesValidation = (scales: number[], mode: string, isResize: boolean): void => {\n if (!isResize) {\n for (const scale of scales) {\n if (scale < 1) {\n throw new Error('Scale value should be greater than or equal to 1.');\n }\n }\n } else {\n for (const scale of scales) {\n if (scale <= 0) {\n throw new Error('Scale value should be greater than 0.');\n }\n }\n }\n if (mode === 'linear' || mode === 'cubic') {\n if (scales.length !== 2 && (scales.length !== 4 || scales[0] !== 1 || scales[1] !== 1)) {\n throw new Error(`'Linear' mode and 'Cubic' mode only support 2-D inputs ('Bilinear', 'Bicubic') \\\n or 4-D inputs with the corresponding outermost 2 scale values being 1 \\\n in the ${isResize ? 'Resize' : 'Upsample'} opeartor.`);\n }\n }\n};", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, TextureType} from '../types';\nimport {getCoordsDataType} from '../utils';\n\nimport {unpackFromChannel} from './packing-utils';\nimport {parseUpsampleAttributes, scalesValidation, UpsampleAttributes, validateInputs} from './upsample';\n\nconst resizeProgramMetadata = {\n name: 'Resize',\n inputNames: ['A'],\n inputTypes: [TextureType.packed]\n};\n\nexport const resize: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: UpsampleAttributes): Tensor[] => {\n validateInputs(inputs, attributes);\n const output = inferenceHandler.run(\n {\n ...resizeProgramMetadata,\n cacheHint: attributes.cacheKey,\n get: () => createPackedResizeProgramInfo(inferenceHandler, inputs, attributes)\n },\n inputs);\n return [output];\n };\n\nexport const parseResizeAttributesV10: OperatorInitialization =\n (node: Graph.Node): UpsampleAttributes => parseUpsampleAttributes(node, 10);\n\nexport const parseResizeAttributesV11: OperatorInitialization =\n (node: Graph.Node): UpsampleAttributes => parseUpsampleAttributes(node, 11);\n\nconst createPackedResizeProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: UpsampleAttributes): ProgramInfo => {\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const [scales, outputShape] = prepareInputs(inputs, attributes);\n\n const isSame =\n scales.every((s: number) => s === 1) && attributes.coordinateTransformMode !== 'tf_crop_and_resize';\n if (isSame) {\n return {\n ...resizeProgramMetadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.packed},\n hasMain: true,\n shaderSource: `void main() {\n vec4 v = ${glsl.texture2D}(X, TexCoords);\n ${glsl.output} = v;\n }`\n };\n }\n\n const dim = outputShape.length;\n if (dim < 2) {\n throw new Error(`output dimension should be at least 2, but got ${dim}`);\n }\n\n const outputHeight = outputShape[dim - 2];\n const outputWidth = outputShape[dim - 1];\n\n const inputShape = inputs[0].dims;\n if (dim !== inputShape.length) {\n throw new Error(`output dimension should match input ${inputShape.length}, but got ${dim}`);\n }\n const inputHeight = inputShape[dim - 2];\n const inputWidth = inputShape[dim - 1];\n\n const scalesHeight = scales[dim - 2];\n const scalesWidth = scales[dim - 1];\n\n let getSourceFracIndex = '';\n\n if (attributes.mode !== 'linear') {\n // TODO: support other modes\n throw new Error(`resize (packed) does not support mode: '${attributes.mode}'`);\n }\n switch (attributes.coordinateTransformMode) {\n case 'asymmetric':\n getSourceFracIndex = `\n vec4 getSourceFracIndex(ivec4 coords) {\n return vec4(coords) / scaleWHWH;\n }\n `;\n break;\n case 'half_pixel':\n getSourceFracIndex = `\n vec4 getSourceFracIndex(ivec4 coords) {\n return (vec4(coords) + 0.5) / scaleWHWH - 0.5;\n }\n `;\n break;\n case 'pytorch_half_pixel':\n getSourceFracIndex = `\n vec4 getSourceFracIndex(ivec4 coords) {\n vec4 fcoords = vec4(coords);\n return vec4(\n ${outputWidth}.0 > 1.0 ? (fcoords.x + 0.5) / scaleWHWH.x - 0.5 : 0.0,\n ${outputHeight}.0 > 1.0 ? (fcoords.y + 0.5) / scaleWHWH.y - 0.5 : 0.0,\n ${outputWidth}.0 > 1.0 ? (fcoords.z + 0.5) / scaleWHWH.z - 0.5 : 0.0,\n ${outputHeight}.0 > 1.0 ? (fcoords.w + 0.5) / scaleWHWH.w - 0.5 : 0.0\n );\n }\n `;\n break;\n case 'align_corners':\n getSourceFracIndex = `\n vec4 getSourceFracIndex(ivec4 coords) {\n vec4 resized = vec4(${outputWidth}.0 - 1.0, ${outputHeight}.0 - 1.0, ${outputWidth}.0 - 1.0,\n ${outputHeight}.0 - 1.0);\n vec4 original = vec4(${inputWidth}.0 - 1.0, ${inputHeight}.0 - 1.0, ${inputWidth}.0 - 1.0,\n ${inputHeight}.0 - 1.0);\n vec4 new_scale = original / resized;\n return vec4(coords) * new_scale;\n }\n `;\n break;\n default:\n // TODO:supporting other coordinateTransformModes\n throw new Error(`resize (packed) does not support coordinateTransformMode: \\\n '${attributes.coordinateTransformMode}'`);\n }\n\n const coordsDataType = getCoordsDataType(dim);\n const unpackChannel = unpackFromChannel();\n const shaderSource = `\n const vec2 inputWH = vec2(${inputHeight}.0, ${inputWidth}.0);\n const vec4 scaleWHWH = vec4(float(${scalesHeight}), float(${scalesWidth}), float(${scalesHeight}), float(${\n scalesWidth}));\n ${unpackChannel}\n ${getSourceFracIndex}\n float getAValue(int x10, int r, int c, int d) {\n return getChannel(getA(x10, r, c, d), vec2(c, d));\n }\n void main() {\n ${coordsDataType} rc = getOutputCoords();\n\n int batch = rc[0];\n int depth = rc[1];\n\n // retrieve the 4 coordinates that is used in the 4 packed output values.\n ivec4 coords = ivec4(rc.wz, rc.w + 1, rc.z + 1);\n\n // calculate the source index in fraction\n vec4 sourceFrac = getSourceFracIndex(coords);\n\n // get the lower and upper bound of the 4 values that will be packed into one texel.\n ivec4 x00 = ivec4(max(sourceFrac.xy, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.xy)));\n ivec4 x01 = ivec4(max(sourceFrac.xw, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.xw)));\n ivec4 x10 = ivec4(max(sourceFrac.zy, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.zy)));\n ivec4 x11 = ivec4(max(sourceFrac.zw, vec2(0.0)), min(inputWH - 1.0, ceil(sourceFrac.zw)));\n\n bool hasNextRow = rc.w < ${outputHeight - 1};\n bool hasNextCol = rc.z < ${outputWidth - 1};\n\n // pack x00, x01, x10, x11's top-left corner into one vec4 structure\n vec4 topLeft = vec4(\n getAValue(batch, depth, x00.x, x00.y),\n hasNextCol ? getAValue(batch, depth, x01.x, x01.y) : 0.0,\n hasNextRow ? getAValue(batch, depth, x10.x, x10.y) : 0.0,\n (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.x, x11.y) : 0.0);\n\n // pack x00, x01, x10, x11's top-right corner into one vec4 structure\n vec4 topRight = vec4(\n getAValue(batch, depth, x00.x, x00.w),\n hasNextCol ? getAValue(batch, depth, x01.x, x01.w) : 0.0,\n hasNextRow ? getAValue(batch, depth, x10.x, x10.w) : 0.0,\n (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.x, x11.w) : 0.0);\n\n // pack x00, x01, x10, x11's bottom-left corner into one vec4 structure\n vec4 bottomLeft = vec4(\n getAValue(batch, depth, x00.z, x00.y),\n hasNextCol ? getAValue(batch, depth, x01.z, x01.y) : 0.0,\n hasNextRow ? getAValue(batch, depth, x10.z, x10.y) : 0.0,\n (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.z, x11.y) : 0.0);\n\n // pack x00, x01, x10, x11's bottom-right corner into one vec4 structure\n vec4 bottomRight = vec4(\n getAValue(batch, depth, x00.z, x00.w),\n hasNextCol ? getAValue(batch, depth, x01.z, x01.w) : 0.0,\n hasNextRow ? getAValue(batch, depth, x10.z, x10.w) : 0.0,\n (hasNextRow && hasNextCol) ? getAValue(batch, depth, x11.z, x11.w) : 0.0);\n\n // calculate the interpolation fraction on u and v direction\n vec4 frac = vec4(sourceFrac) - floor(sourceFrac);\n vec4 clampFrac = clamp(frac, vec4(0.0), vec4(1.0));\n\n vec4 top = mix(topLeft, topRight, clampFrac.ywyw);\n vec4 bottom = mix(bottomLeft, bottomRight, clampFrac.ywyw);\n vec4 newValue = mix(top, bottom, clampFrac.xxzz);\n\n ${glsl.output} = vec4(newValue);\n }\n `;\n return {\n ...resizeProgramMetadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.packed},\n hasMain: true,\n shaderSource\n };\n };\n\n\nconst prepareInputs = (inputs: Tensor[], attributes: UpsampleAttributes): [readonly number[], readonly number[]] => {\n const x = inputs[0];\n const xDims = x.dims;\n\n let scales = attributes.scales;\n let outputSizes: number[]|undefined;\n if (scales.length === 0) {\n const scalesTensor = inputs[attributes.scalesInputIdx];\n if (scalesTensor && scalesTensor.size !== 0) {\n if (inputs[attributes.sizesInputIdx]) {\n throw new Error('Only one of scales or sizes must be provided as input.');\n }\n scales = parseScalesData(scalesTensor, attributes.mode, attributes.isResize);\n } else {\n const sizesTensor = inputs[attributes.sizesInputIdx];\n if (!sizesTensor || sizesTensor.size === 0) {\n throw new Error('Either scales or sizes MUST be provided as input.');\n }\n\n outputSizes = Array.from(sizesTensor.integerData);\n scales = parseScalesDataFromOutputSize(outputSizes, xDims, attributes.mode, attributes.isResize);\n }\n } else {\n if (inputs[attributes.sizesInputIdx]) {\n throw new Error('Only one of scales or sizes must be provided as input.');\n }\n }\n\n const yDims = outputSizes || (xDims.map((dim, i) => Math.floor(dim * scales[i])));\n\n return [scales, yDims];\n};\n\nconst parseScalesData = (scale: Tensor, mode: string, isResize: boolean): number[] => {\n const scales = Array.from(scale.floatData);\n scalesValidation(scales, mode, isResize);\n return scales;\n};\n\nconst parseScalesDataFromOutputSize =\n (yDims: readonly number[], xDims: readonly number[], mode: string, isResize: boolean): number[] => {\n const length = xDims.length;\n const scales = new Array(length);\n\n for (let i = 0, end = length; i < end; i++) {\n if (xDims[i] === 0) {\n if (yDims[i] !== 0) {\n throw new Error('Input dim is zero but required output dim is non-zero.');\n }\n scales[i] = 1;\n } else {\n scales[i] = yDims[i] / xDims[i];\n }\n }\n scalesValidation(scales, mode, isResize);\n return scales;\n };\n\n// roi data is not used yet. but leave here for future usage.\n// const getRoi = (inputs: Tensor[], attributes: UpsampleAttributes) : number[] => {\n// let roi: number[] = [];\n// if (attributes.needRoiInput) {\n// if (attributes.roiInputIdx <= 0) {\n// throw new Error('Invalid roi input index.');\n// }\n// const roiTensor = inputs[attributes.roiInputIdx];\n// roi = roiTensor.size > 0 ? Array.from(roiTensor.floatData) : [];\n// } else {\n// roi = new Array(inputs[0].dims.length * 2).fill(0);\n// }\n// return roi;\n// };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nexport const shape = (_inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n validateInputs(inputs);\n return [new Tensor([inputs[0].dims.length], 'int32', undefined, undefined, new Int32Array(inputs[0].dims))];\n};\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Shape requires 1 input.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {NUMBER_TYPES, OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, TextureType} from '../types';\n\nexport interface SliceAttributes extends AttributeWithCacheKey {\n readonly axes: number[];\n readonly ends: number[];\n readonly starts: number[];\n}\n\nconst sliceProgramMetadata = {\n name: 'Slice',\n inputNames: ['A'],\n inputTypes: [TextureType.unpacked]\n};\n\nexport const slice: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: SliceAttributes): Tensor[] => {\n validateInputs(inputs);\n const output = inferenceHandler.run(\n {\n ...sliceProgramMetadata,\n cacheHint: attributes.cacheKey,\n get: () => createSliceProgramInfo(inferenceHandler, inputs[0], attributes)\n },\n inputs);\n return [output];\n };\n\nexport const parseSliceAttributes: OperatorInitialization = (node: Graph.Node): SliceAttributes => {\n const starts = node.attributes.getInts('starts');\n const ends = node.attributes.getInts('ends');\n const axes = node.attributes.getInts('axes', []);\n return createAttributeWithCacheKey({starts, ends, axes});\n};\n\nconst createSliceProgramInfo =\n (_inferenceHandler: WebGLInferenceHandler, input: Tensor, attributes: SliceAttributes): ProgramInfo => {\n const axes = (attributes.axes.length === 0) ? input.dims.slice(0).map((_val, i) => i) : attributes.axes;\n const normalizedAxes = ShapeUtil.normalizeAxes(axes, input.dims.length);\n const starts = attributes.starts.map((start, i) => {\n if (start > input.dims[normalizedAxes[i]] - 1) {\n return input.dims[normalizedAxes[i]];\n }\n return ShapeUtil.normalizeAxis(start, input.dims[normalizedAxes[i]]);\n });\n const ends = attributes.ends.map((end, i) => {\n if (end > input.dims[normalizedAxes[i]] - 1) {\n return input.dims[normalizedAxes[i]];\n }\n return ShapeUtil.normalizeAxis(end, input.dims[normalizedAxes[i]]);\n });\n\n const outputShape = input.dims.slice();\n\n const sliceOps: string[] = [];\n for (let i = 0; i < normalizedAxes.length; i++) {\n outputShape[normalizedAxes[i]] = ends[i] - starts[i];\n if (starts[i] > 0) {\n sliceOps.push(`outputIdx[${normalizedAxes[i]}] += ${starts[i]};`);\n } // else { sliceOps.push(`outputIdx[${normalizedAxes[i]}] += 0;`); }\n }\n\n const rank = outputShape.length;\n const shaderSource = `\n float process(int outputIdx[${rank}]) {\n ${sliceOps.join('\\n ')}\n return _A(outputIdx);\n }`;\n return {\n ...sliceProgramMetadata,\n output: {dims: outputShape, type: input.type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Slice requires 1 input.');\n }\n if (NUMBER_TYPES.indexOf(inputs[0].type) === -1) {\n throw new Error('Invalid input type.');\n }\n};\n\nexport const sliceV10 = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n validateInputsV10(inputs);\n const attributes = generateSliceAttributesFromInputs(inferenceHandler, inputs);\n const output = inferenceHandler.run(\n {\n ...sliceProgramMetadata,\n cacheHint: attributes.cacheKey,\n get: () => createSliceProgramInfo(inferenceHandler, inputs[0], attributes)\n },\n [inputs[0]]);\n return [output];\n};\n\nconst generateSliceAttributesFromInputs =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): SliceAttributes => {\n if (!inferenceHandler.session.isInitializer(inputs[1].dataId) ||\n !inferenceHandler.session.isInitializer(inputs[2].dataId) ||\n (inputs.length >= 4 && !inferenceHandler.session.isInitializer(inputs[3].dataId)) ||\n (inputs.length >= 5 && !inferenceHandler.session.isInitializer(inputs[4].dataId))) {\n throw new Error('dynamic slice attributes are not allowed');\n }\n\n if (inputs.length >= 5 && inputs[4].integerData.some((i: number) => i !== 1)) {\n throw new Error('currently non-1 steps is not supported for Slice');\n }\n\n const starts = Array.from(inputs[1].integerData);\n const ends = Array.from(inputs[2].integerData);\n const axes = inputs.length >= 4 ? Array.from(inputs[3].integerData) : [];\n const cacheKey = `${axes};${starts};${ends}`;\n return {starts, ends, axes, cacheKey};\n };\n\nconst validateInputsV10 = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length < 3 || inputs.length > 5) {\n throw new Error('Invalid input number.');\n }\n if (inputs[1].type !== 'int32' || inputs[1].dims.length !== 1) {\n throw new Error('Invalid input type.');\n }\n if (inputs[2].type !== 'int32' || inputs[2].dims.length !== 1) {\n throw new Error('Invalid input type.');\n }\n if (inputs.length >= 4 && (inputs[3].type !== 'int32' || inputs[3].dims.length !== 1)) {\n throw new Error('Invalid input type.');\n }\n if (inputs.length >= 5 && (inputs[4].type !== 'int32' || inputs[4].dims.length !== 1)) {\n throw new Error('Invalid input type.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, TextureType} from '../types';\n\nimport {transpose, TransposeAttributes} from './transpose';\n\nexport interface SoftmaxAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n}\n\nconst softmaxComputeMaxProgramMetadata = {\n name: 'SoftmaxComputeMax',\n inputNames: ['A'],\n inputTypes: [TextureType.unpacked],\n};\n\nconst softmaxComputeScaleProgramMetadata = {\n name: 'SoftmaxComputeScale',\n inputNames: ['A', 'Max'],\n inputTypes: [TextureType.unpacked, TextureType.unpacked],\n};\n\nconst softmaxProgramMetadata = {\n name: 'SoftMax',\n inputNames: ['A', 'Max', 'Norm'],\n inputTypes: [TextureType.unpacked, TextureType.unpacked, TextureType.unpacked],\n};\n\nexport const softmax: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: SoftmaxAttributes): Tensor[] => {\n validateInputs(inputs);\n\n const inputShape = inputs[0].dims.slice();\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputShape.length);\n const logicalRowCount = ShapeUtil.sizeToDimension(inputShape, axis);\n const featureCount = ShapeUtil.sizeFromDimension(inputShape, axis);\n\n const output = computeSoftmax(inferenceHandler, inputs, attributes, logicalRowCount, featureCount);\n return output;\n };\n\nexport const parseSoftmaxAttributes: OperatorInitialization =\n (node: Graph.Node): SoftmaxAttributes => createAttributeWithCacheKey({axis: node.attributes.getInt('axis', 1)});\n\nexport const parseSoftmaxAttributesV13: OperatorInitialization =\n (node: Graph.Node): SoftmaxAttributes => createAttributeWithCacheKey({axis: node.attributes.getInt('axis', -1)});\n\n// The \"semantic\" meaning of axis has changed in opset-13.\n// Please compare: https://github.com/onnx/onnx/blob/main/docs/Operators.md#Softmax\n// with https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Softmax-11 for detailed explanations\n// To account for the opset-13 behavior, our plan will be to transpose the \"axis\" dim to the innermost dim\n// and perform softmax and then reverse the transpose. We can skip the transposing aspect if the axis is already\n// the innermost dim\nexport const softmaxV13: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: SoftmaxAttributes): Tensor[] => {\n validateInputs(inputs);\n\n const inputShape = inputs[0].dims.slice();\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputShape.length);\n const rank = inputShape.length;\n\n const isTransposeRequired = (axis !== rank - 1) ? true : false;\n const transposedInputShape: number[] = [];\n let perm: number[] = [];\n let transposedInputs: Tensor[] = [];\n let transposeAttribute: TransposeAttributes;\n\n if (isTransposeRequired) {\n perm = Array.from({length: rank}).map((_, i) => i);\n\n // swap the innermost dim with the dim corresponding to axis\n perm[axis] = rank - 1;\n perm[rank - 1] = axis;\n\n perm.map(p => transposedInputShape.push(inputShape[p]));\n\n transposeAttribute = createAttributeWithCacheKey({perm});\n transposedInputs = transpose(inferenceHandler, inputs, transposeAttribute);\n }\n\n const logicalRowCount = isTransposeRequired ? ShapeUtil.sizeToDimension(transposedInputShape, rank - 1) :\n ShapeUtil.sizeToDimension(inputShape, rank - 1);\n const featureCount = isTransposeRequired ? ShapeUtil.sizeFromDimension(transposedInputShape, rank - 1) :\n ShapeUtil.sizeFromDimension(inputShape, rank - 1);\n\n const output = computeSoftmax(\n inferenceHandler, isTransposeRequired ? transposedInputs : inputs, attributes, logicalRowCount, featureCount);\n\n if (isTransposeRequired) {\n const reversedOutput = transpose(inferenceHandler, output, transposeAttribute!);\n return reversedOutput;\n } else {\n return output;\n }\n };\n\nconst computeSoftmax =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: SoftmaxAttributes, logicalRowCount: number,\n featureCount: number): Tensor[] => {\n const computeMaxProgramInfo =\n createComputeMaxProgramInfo(inferenceHandler, inputs[0], logicalRowCount, featureCount, [logicalRowCount]);\n const max = inferenceHandler.run(\n {...softmaxComputeMaxProgramMetadata, cacheHint: attributes.cacheKey, get: () => computeMaxProgramInfo},\n inputs);\n\n const computeScaleProgramInfo = createComputScaleProgramInfo(\n inferenceHandler, inputs[0], logicalRowCount, featureCount, computeMaxProgramInfo.output.dims,\n [logicalRowCount]);\n const scale = inferenceHandler.run(\n {...softmaxComputeScaleProgramMetadata, cacheHint: attributes.cacheKey, get: () => computeScaleProgramInfo},\n [inputs[0], max]);\n\n const softMaxProgramInfo = createSoftMaxProgramInfo(\n inferenceHandler, inputs[0], logicalRowCount, featureCount, computeMaxProgramInfo.output.dims,\n computeScaleProgramInfo.output.dims);\n const output = inferenceHandler.run(\n {...softmaxProgramMetadata, cacheHint: attributes.cacheKey, get: () => softMaxProgramInfo},\n [inputs[0], max, scale]);\n return [output];\n };\n\n/**\n * Create a texture that contains the maximum value of each of the 'N' rows\n */\nconst createComputeMaxProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, input: Tensor, logicalRowCount: number, featureCount: number,\n outputShape: number[]): ProgramInfo => {\n const [textureWidth, textureHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(input.dims, TextureType.unpacked);\n const rank = outputShape.length;\n\n if (logicalRowCount < 1 || featureCount < 1) {\n throw new Error('Logical row count N and feature count D must be greater than or equal to 1');\n }\n\n if (outputShape.length !== 1) {\n throw new Error('Dimensionality of the output should be 1');\n }\n\n if (outputShape[0] !== logicalRowCount) {\n throw new Error('Shape of the output should be equal to logical row count');\n }\n\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const shaderSource = `\n float process(int[${rank}] indices) {\n int logical_row_start_offset = indices[0] * ${featureCount};\n\n float max = getColorAsFloat(${glsl.texture2D}(A, offsetToCoords(logical_row_start_offset, ${textureWidth},\n ${textureHeight} )));\n for(int i=1; i<${featureCount}; ++i)\n {\n float current = getColorAsFloat(${glsl.texture2D}(A, offsetToCoords(logical_row_start_offset + i,\n ${textureWidth}, ${textureHeight})));\n if(current > max)\n max = current;\n }\n\n return max;\n }`;\n return {\n ...softmaxComputeMaxProgramMetadata,\n output: {dims: outputShape, type: input.type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\n/**\n * Create a texture that contains the normalization factor for each of the 'N' rows\n */\nconst createComputScaleProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, input: Tensor, logicalRowCount: number, featureCount: number,\n maxElementPerLogicalRow: readonly number[], outputShape: number[]): ProgramInfo => {\n const [textureWidth, textureHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(input.dims, TextureType.unpacked);\n const rank = outputShape.length;\n\n if (logicalRowCount < 1 || featureCount < 1) {\n throw new Error('Logical row count N and feature count D must be greater than or equal to 1');\n }\n\n if (outputShape.length !== 1) {\n throw new Error('Dimensionality of the output should be 1');\n }\n\n if (outputShape[0] !== logicalRowCount) {\n throw new Error('Shape of the output should be equal to logical row count');\n }\n\n if (maxElementPerLogicalRow.length !== 1) {\n throw new Error('Dimensionality of the intermediate results should be 1');\n }\n\n if (maxElementPerLogicalRow[0] !== logicalRowCount) {\n throw new Error('Shape of the intermediate results should be equal to logical row count');\n }\n\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const shaderSource = `\n float process(int[${rank}] indices) {\n int logical_row_start_offset = indices[0] * ${featureCount};\n\n float norm_factor = 0.0;\n float max = _Max(indices);\n for(int i=0; i<${featureCount}; ++i)\n {\n norm_factor += exp(getColorAsFloat(${glsl.texture2D}(A, offsetToCoords(logical_row_start_offset + i,\n ${textureWidth}, ${textureHeight}))) - max);\n }\n\n return norm_factor;\n }`;\n return {\n ...softmaxComputeScaleProgramMetadata,\n output: {dims: outputShape, type: input.type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst createSoftMaxProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, input: Tensor, logicalRowCount: number, featureCount: number,\n maxElementPerLogicalRow: readonly number[], normalizationPerLogicalRow: readonly number[]): ProgramInfo => {\n const [textureWidth, textureHeight] =\n inferenceHandler.calculateTextureWidthAndHeight(input.dims, TextureType.unpacked);\n const rank = input.dims.length;\n\n if (logicalRowCount < 1 || featureCount < 1) {\n throw new Error('Logical row count N and feature count D must be greater than or equal to 1');\n }\n\n if (maxElementPerLogicalRow.length !== 1 || normalizationPerLogicalRow.length !== 1) {\n throw new Error('Dimensionality of the intermediate results should be 1');\n }\n\n if (maxElementPerLogicalRow[0] !== logicalRowCount || normalizationPerLogicalRow[0] !== logicalRowCount) {\n throw new Error('Shape of the intermediate results should be equal to logical row count');\n }\n\n const shaderSource = `\n float process(int[${rank}] indices) {\n\n // get offset of current logical tensor index from the 2-D texture coordinates (TexCoords)\n int offset = coordsToOffset(TexCoords, ${textureWidth}, ${textureHeight});\n\n //determine the logical row for this index\n int logical_row_index[1];\n logical_row_index[0] = offset / ${featureCount};\n\n float norm_factor = _Norm(logical_row_index);\n\n // avoid possible division by 0\n // if norm_facor is 0, all elements are zero\n // if so, return 0\n if(norm_factor == 0.0)\n return 0.0;\n\n return exp(_A(indices) - _Max(logical_row_index)) / norm_factor;\n }`;\n return {\n ...softmaxProgramMetadata,\n output: {dims: input.dims, type: input.type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Softmax requires 1 input.');\n }\n\n if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n throw new Error('Invalid input type');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../../../attribute-with-cache-key';\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil, SplitUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, TextureType} from '../types';\n\nexport interface SplitAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n readonly split: number[];\n readonly numOutputs: number;\n}\n\nconst splitProgramMetadata = {\n name: 'Split',\n inputNames: ['A'],\n inputTypes: [TextureType.unpacked],\n};\n\nexport const split: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], attributes: SplitAttributes): Tensor[] => {\n validateInputs(inputs);\n\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputs[0].dims.length);\n const count = getProgramCount(inferenceHandler, inputs, axis, attributes);\n const output: Tensor[] = [];\n for (let i = 0; i < count; ++i) {\n output.push(inferenceHandler.run(\n {\n ...splitProgramMetadata,\n cacheHint: `${attributes.cacheKey};${i}`,\n get: () => createSplitProgramInfo(inferenceHandler, inputs[0], attributes, axis, i)\n },\n inputs));\n }\n\n return output;\n };\n\nexport const parseSplitAttributes: OperatorInitialization = (node: Graph.Node): SplitAttributes => {\n const axis = node.attributes.getInt('axis', 0);\n const split = node.attributes.getInts('split', []);\n const numOutputs = node.outputs.length;\n return createAttributeWithCacheKey({axis, split, numOutputs});\n};\n\nconst getProgramCount =\n (_inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], axis: number, attributes: SplitAttributes): number => {\n const [, offsets] = SplitUtil.splitShape(inputs[0].dims, axis, attributes.split, attributes.numOutputs);\n return offsets.length;\n };\n\nconst createSplitProgramInfo =\n (_inferenceHandler: WebGLInferenceHandler, input: Tensor, attributes: SplitAttributes, axis: number, index: number):\n ProgramInfo => {\n const [shapes, offsets] = SplitUtil.splitShape(input.dims, axis, attributes.split, attributes.numOutputs);\n const offset = offsets[index];\n const outputShape = shapes[index];\n const rank = outputShape.length;\n const shaderSource = `\n float process(int indices[${rank}]) {\n indices[${axis}] += ${offset};\n return _A(indices);\n }\n `;\n return {\n ...splitProgramMetadata,\n cacheHint: `${attributes.cacheKey}:${index}`,\n output: {dims: outputShape, type: input.type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Split requires one input.');\n }\n\n if (inputs[0].type !== 'int8' && inputs[0].type !== 'uint8' && inputs[0].type !== 'int16' &&\n inputs[0].type !== 'uint16' && inputs[0].type !== 'int32' && inputs[0].type !== 'uint32' &&\n inputs[0].type !== 'float32' && inputs[0].type !== 'float64' && inputs[0].type !== 'bool') {\n throw new Error('Invalid input type.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nexport const squeeze: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], axes: number[]): Tensor[] => {\n validateInputs(inputs);\n const outputShape = ShapeUtil.squeezeShape(inputs[0].dims, axes);\n const output = inferenceHandler.reshapeUnpacked(inputs[0], outputShape);\n return [output];\n };\n\nexport const squeezeV13 = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n validateInputsV13(inputs);\n return squeeze(inferenceHandler, [inputs[0]], Array.from(inputs[1].integerData));\n};\n\nexport const parseSqueezeAttributes: OperatorInitialization = (node: Graph.Node): number[] =>\n node.attributes.getInts('axes');\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Squeeze requires 1 input.');\n }\n\n if (inputs[0].type === 'string') {\n throw new Error('invalid input tensor types.');\n }\n};\n\nconst validateInputsV13 = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Squeeze requires 2 inputs.');\n }\n\n if (inputs[1].type !== 'int32') {\n throw new Error('Invalid input type.');\n }\n};", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from '../../../tensor';\nimport {getGlsl} from '../glsl-source';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramMetadata, TextureType} from '../types';\n\nexport const sum = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n validateInputs(inputs);\n\n const sumProgramMetadata = {\n name: 'Sum',\n inputNames: inputs.map((_v, i) => `X${i}`),\n inputTypes: new Array(inputs.length).fill(TextureType.unpacked)\n };\n\n const output = inferenceHandler.run(\n {...sumProgramMetadata, get: () => createSumProgramInfo(inferenceHandler, inputs, sumProgramMetadata)}, inputs);\n return [output];\n};\n\nconst createSumProgramInfo =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], sumProgramMetadata: ProgramMetadata): ProgramInfo => {\n const glsl = getGlsl(inferenceHandler.session.backend.glContext.version);\n const outputShape = inputs[0].dims.slice();\n const sumLine = inputs.map((_v, i) => `${glsl.texture2D}(X${i},TexCoords)`).join(' + ');\n const shaderSource = `\n void main() {\n vec4 result = ${sumLine};\n ${glsl.output} = result;\n }\n `;\n return {\n ...sumProgramMetadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n hasMain: true,\n shaderSource\n };\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length === 0) {\n throw new Error('Sum requires inputs.');\n }\n\n const length = inputs[0].dims.length;\n for (let i = 1; i < inputs.length; i++) {\n if (length !== inputs[i].dims.length) {\n throw new Error('Input shapes are mismatched.');\n }\n\n for (let j = 0; j < length; j++) {\n if (inputs[0].dims[j] !== inputs[i].dims[j]) {\n throw new Error('Input shapes are not matched.');\n }\n }\n }\n\n if (inputs[0].type !== 'float32' && inputs[0].type !== 'float64') {\n throw new Error('Invalid input type.');\n }\n for (let i = 1; i < inputs.length; i++) {\n if (inputs[0].type !== inputs[i].type) {\n throw new Error('Input types are not matched.');\n }\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {NUMBER_TYPES} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {WebGLInferenceHandler} from '../inference-handler';\nimport {ProgramInfo, ProgramMetadata, TextureType} from '../types';\n\nexport const tile = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n validateInputs(inputs);\n\n const tileProgramMetadata = {\n name: 'Tile',\n inputNames: ['A'],\n inputTypes: [TextureType.unpacked],\n };\n\n const output = inferenceHandler.run(\n {...tileProgramMetadata, get: () => createTileProgramInfo(inferenceHandler, inputs, tileProgramMetadata)},\n inputs);\n return [output];\n};\n\nconst createTileProgramInfo =\n (_handler: WebGLInferenceHandler, inputs: Tensor[], tileProgramMetadata: ProgramMetadata): ProgramInfo => {\n const inputShape = inputs[0].dims.slice();\n const outputShape = new Array(inputShape.length);\n\n const tileOps: string[] = [];\n for (let i = 0; i < inputShape.length; i++) {\n outputShape[i] = inputShape[i] * inputs[1].numberData[i];\n tileOps.push(`inputIdx[${i}] = int(mod(float(outputIdx[${i}]), ${inputShape[i]}.));`);\n }\n\n const rank = outputShape.length;\n const shaderSource = `\n float process(int outputIdx[${rank}]) {\n int inputIdx[${rank}];\n ${tileOps.join('\\n')}\n return _A(inputIdx);\n }\n `;\n return {\n ...tileProgramMetadata,\n output: {dims: outputShape, type: inputs[0].type, textureType: TextureType.unpacked},\n shaderSource\n };\n };\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Tile requires 2 input.');\n }\n if (inputs[1].dims.length !== 1) {\n throw new Error('The second input shape must 1 dimension.');\n }\n if (inputs[1].dims[0] !== inputs[0].dims.length) {\n throw new Error('Invalid input shape.');\n }\n if (NUMBER_TYPES.indexOf(inputs[0].type) === -1) {\n throw new Error('Invalid input type.');\n }\n if (inputs[1].type !== 'int32' && inputs[1].type !== 'int16') {\n throw new Error('Invalid repeat type.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Graph} from '../../../graph';\nimport {OperatorImplementation, OperatorInitialization} from '../../../operators';\nimport {Tensor} from '../../../tensor';\nimport {ShapeUtil} from '../../../util';\nimport {WebGLInferenceHandler} from '../inference-handler';\n\nexport const unsqueeze: OperatorImplementation =\n (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[], axes: number[]): Tensor[] => {\n validateInputs(inputs);\n const outputShape = ShapeUtil.unsqueezeShape(inputs[0].dims, axes);\n const output = inferenceHandler.reshapeUnpacked(inputs[0], outputShape);\n return [output];\n };\n\nexport const unsqueezeV13 = (inferenceHandler: WebGLInferenceHandler, inputs: Tensor[]): Tensor[] => {\n validateInputsV13(inputs);\n return unsqueeze(inferenceHandler, [inputs[0]], Array.from(inputs[1].integerData));\n};\n\nexport const parseUnsqueezeAttributes: OperatorInitialization = (node: Graph.Node): number[] =>\n node.attributes.getInts('axes');\n\nconst validateInputs = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Unsqueeze requires 1 input.');\n }\n\n if (inputs[0].type === 'string') {\n throw new Error('invalid input tensor types.');\n }\n};\n\nconst validateInputsV13 = (inputs: Tensor[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Unsqueeze requires 2 inputs.');\n }\n\n if (inputs[1].type !== 'int32') {\n throw new Error('Invalid input type.');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {OpSet} from '../../opset';\n\nimport {batchNormalization, parseBatchNormalizationAttributes} from './ops/batch-normalization';\nimport * as binaryOps from './ops/binary-op';\nimport {cast, parseCastAttributes} from './ops/cast';\nimport {concat, parseConcatAttributes} from './ops/concat';\nimport {conv, parseConvAttributes} from './ops/conv';\nimport {convTranspose, parseConvTransposeAttributes} from './ops/conv-transpose';\nimport {depthToSpace, parseDepthToSpaceAttributes} from './ops/depth-to-space';\nimport {flatten, parseFlattenAttributes} from './ops/flatten';\nimport {gather, parseGatherAttributes} from './ops/gather';\nimport {gemm, parseGemmAttributesV11, parseGemmAttributesV7} from './ops/gemm';\nimport {imageScaler, parseImageScalerAttributes} from './ops/image-scaler';\nimport {instanceNormalization, parseInstanceNormalizationAttributes} from './ops/instance-normalization';\nimport {lrn, parseLrnAttributes} from './ops/lrn';\nimport {matMul, parseMatMulAttributes} from './ops/matmul';\nimport {padV11, padV2, parsePadAttributesV11, parsePadAttributesV2} from './ops/pad';\nimport {averagePool, globalAveragePool, globalMaxPool, maxPool, parseAveragePoolAttributes, parseGlobalAveragePoolAttributes, parseMaxPoolAttributes} from './ops/pool';\nimport {parseReduceAttributes, reduceLogSum, reduceLogSumSquare, reduceMax, reduceMean, reduceMin, reduceProd, reduceSum} from './ops/reduce';\nimport {reshape} from './ops/reshape';\nimport {parseResizeAttributesV10, parseResizeAttributesV11, resize} from './ops/resize-packed';\nimport {shape} from './ops/shape';\nimport {parseSliceAttributes, slice, sliceV10} from './ops/slice';\nimport {parseSoftmaxAttributes, parseSoftmaxAttributesV13, softmax, softmaxV13} from './ops/softmax';\nimport {parseSplitAttributes, split} from './ops/split';\nimport {parseSqueezeAttributes, squeeze, squeezeV13} from './ops/squeeze';\nimport {sum} from './ops/sum';\nimport {tile} from './ops/tile';\nimport {parseTransposeAttributes, transpose} from './ops/transpose';\nimport * as unaryOps from './ops/unary-op';\nimport {parseUnsqueezeAttributes, unsqueeze, unsqueezeV13} from './ops/unsqueeze';\nimport {parseUpsampleAttributesV7, parseUpsampleAttributesV9, upsample} from './ops/upsample';\n\nexport const WEBGL_OP_RESOLVE_RULES: readonly OpSet.ResolveRule[] = [\n ['Abs', '', '6+', unaryOps.abs],\n ['Acos', '', '7+', unaryOps.acos],\n ['Add', '', '7+', binaryOps.add],\n ['And', '', '7+', binaryOps.and],\n ['Asin', '', '7+', unaryOps.asin],\n ['Atan', '', '7+', unaryOps.atan],\n // TODO: support new attributes for AveragePool-10\n ['AveragePool', '', '7+', averagePool, parseAveragePoolAttributes],\n ['BatchNormalization', '', '7+', batchNormalization, parseBatchNormalizationAttributes],\n ['Cast', '', '6+', cast, parseCastAttributes],\n ['Ceil', '', '6+', unaryOps.ceil],\n ['Clip', '', '6-10', unaryOps.clip, unaryOps.parseClipAttributes],\n ['Clip', '', '11+', unaryOps.clipV11],\n ['Concat', '', '4+', concat, parseConcatAttributes],\n ['Conv', '', '1+', conv, parseConvAttributes],\n ['ConvTranspose', '', '1+', convTranspose, parseConvTransposeAttributes],\n ['Cos', '', '7+', unaryOps.cos],\n ['Div', '', '7+', binaryOps.div],\n ['Dropout', '', '7+', unaryOps.identity],\n ['DepthToSpace', '', '1+', depthToSpace, parseDepthToSpaceAttributes],\n ['Equal', '', '7+', binaryOps.equal],\n ['Elu', '', '6+', unaryOps.elu, unaryOps.parseEluAttributes],\n ['Exp', '', '6+', unaryOps.exp],\n ['Flatten', '', '1+', flatten, parseFlattenAttributes],\n ['Floor', '', '6+', unaryOps.floor],\n ['FusedConv', 'com.microsoft', '1+', conv, parseConvAttributes],\n ['Gather', '', '1+', gather, parseGatherAttributes],\n ['Gemm', '', '7-10', gemm, parseGemmAttributesV7],\n ['Gemm', '', '11+', gemm, parseGemmAttributesV11],\n ['GlobalAveragePool', '', '1+', globalAveragePool, parseGlobalAveragePoolAttributes],\n ['GlobalMaxPool', '', '1+', globalMaxPool],\n ['Greater', '', '7+', binaryOps.greater],\n ['Identity', '', '1+', unaryOps.identity],\n ['ImageScaler', '', '1+', imageScaler, parseImageScalerAttributes],\n ['InstanceNormalization', '', '6+', instanceNormalization, parseInstanceNormalizationAttributes],\n ['LeakyRelu', '', '6+', unaryOps.leakyRelu, unaryOps.parseLeakyReluAttributes],\n ['Less', '', '7+', binaryOps.less],\n ['LRN', '', '1+', lrn, parseLrnAttributes],\n ['Log', '', '6+', unaryOps.log],\n ['MatMul', '', '1+', matMul, parseMatMulAttributes],\n // TODO: support new attributes for MaxPool-8 and MaxPool-10\n ['MaxPool', '', '1+', maxPool, parseMaxPoolAttributes],\n ['Mul', '', '7+', binaryOps.mul],\n ['Neg', '', '6+', unaryOps.neg],\n ['Not', '', '1+', unaryOps.not],\n ['Or', '', '7+', binaryOps.or],\n ['Pad', '', '2-10', padV2, parsePadAttributesV2],\n ['Pad', '', '11+', padV11, parsePadAttributesV11],\n ['Pow', '', '7+', binaryOps.pow],\n ['PRelu', '', '7+', binaryOps.pRelu],\n ['ReduceLogSum', '', '1+', reduceLogSum, parseReduceAttributes],\n ['ReduceMax', '', '1+', reduceMax, parseReduceAttributes],\n ['ReduceMean', '', '1+', reduceMean, parseReduceAttributes],\n ['ReduceMin', '', '1+', reduceMin, parseReduceAttributes],\n ['ReduceProd', '', '1+', reduceProd, parseReduceAttributes],\n ['ReduceSum', '', '1-12', reduceSum, parseReduceAttributes],\n ['ReduceSumSquare', '', '1+', reduceLogSumSquare, parseReduceAttributes],\n ['Relu', '', '6+', unaryOps.relu],\n ['Reshape', '', '5+', reshape],\n ['Resize', '', '10', resize, parseResizeAttributesV10],\n ['Resize', '', '11+', resize, parseResizeAttributesV11],\n ['Shape', '', '1+', shape],\n ['Sigmoid', '', '6+', unaryOps.sigmoid],\n ['Sin', '', '7+', unaryOps.sin],\n ['Slice', '', '10+', sliceV10], // TODO: support 'steps' for Slice-10\n ['Slice', '', '1-9', slice, parseSliceAttributes],\n // The \"semantic\" meaning of axis has changed in opset-13.\n ['Softmax', '', '1-12', softmax, parseSoftmaxAttributes],\n ['Softmax', '', '13+', softmaxV13, parseSoftmaxAttributesV13],\n // 'Split' operator has an optional attribute 'split'\n // this attribute determines how the specified axis of input data is split.\n // When the attribute is missing, we need the count of number of outputs\n // so that we can determine the 'split' attribute from the runtime input to the Operator\n ['Split', '', '2-12', split, parseSplitAttributes],\n ['Sqrt', '', '6+', unaryOps.sqrt],\n ['Squeeze', '', '1-12', squeeze, parseSqueezeAttributes],\n ['Squeeze', '', '13+', squeezeV13],\n ['Sub', '', '7+', binaryOps.sub],\n ['Sum', '', '6+', sum],\n ['Tan', '', '7+', unaryOps.tan],\n ['Tanh', '', '6+', unaryOps.tanh],\n ['Tile', '', '6+', tile],\n ['Transpose', '', '1+', transpose, parseTransposeAttributes],\n ['Upsample', '', '7-8', upsample, parseUpsampleAttributesV7],\n ['Upsample', '', '9', upsample, parseUpsampleAttributesV9],\n ['Unsqueeze', '', '1-12', unsqueeze, parseUnsqueezeAttributes],\n ['Unsqueeze', '', '13+', unsqueezeV13],\n ['Xor', '', '7+', binaryOps.xor],\n];\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nconst INLINE_FUNC_DEF_REGEX = /@inline[\\s\\n\\r]+(\\w+)[\\s\\n\\r]+([0-9a-zA-Z_]+)\\s*\\(([^)]*)\\)\\s*{(([^}]|[\\n\\r])*)}/gm;\nconst FUNC_CALL_REGEX = '(\\\\w+)?\\\\s+([_0-9a-zA-Z]+)\\\\s+=\\\\s+__FUNC__\\\\((.*)\\\\)\\\\s*;';\n/**\n * GLSL preprocessor responsible for resolving @inline directives\n */\nexport function replaceInlines(script: string): string {\n const inlineDefs: {[name: string]: {params: Array<{type: string; name: string}|null>; body: string}} = {};\n let match;\n while ((match = INLINE_FUNC_DEF_REGEX.exec(script)) !== null) {\n const params = match[3]\n .split(',')\n .map(s => {\n const tokens = s.trim().split(' ');\n if (tokens && tokens.length === 2) {\n return {type: tokens[0], name: tokens[1]};\n }\n return null;\n })\n .filter(v => v !== null);\n inlineDefs[match[2]] = {params, body: match[4]};\n }\n for (const name in inlineDefs) {\n const regexString = FUNC_CALL_REGEX.replace('__FUNC__', name);\n const regex = new RegExp(regexString, 'gm');\n while ((match = regex.exec(script)) !== null) {\n const type = match[1];\n const variable = match[2];\n const params = match[3].split(',');\n const declLine = (type) ? `${type} ${variable};` : '';\n let newBody: string = inlineDefs[name].body;\n let paramRedecLine = '';\n inlineDefs[name].params.forEach((v, i) => {\n if (v) {\n paramRedecLine += `${v.type} ${v.name} = ${params[i]};\\n`;\n }\n });\n newBody = `${paramRedecLine}\\n ${newBody}`;\n newBody = newBody.replace('return', `${variable} = `);\n const replacement = `\n ${declLine}\n {\n ${newBody}\n }\n `;\n script = script.replace(match[0], replacement);\n }\n }\n script = script.replace(INLINE_FUNC_DEF_REGEX, '');\n return script;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Logger} from '../../instrument';\nimport {assert} from '../../util';\n\n/** Layout preferences */\nexport interface WidthHeightPrefs {\n breakAxis?: number;\n isPacked?: boolean;\n reverseWH?: boolean;\n}\n/**\n * TextureLayoutStrategy is an abstraction for different plans\n * for mapping n-dimensional arrays to 2D textures (and back)\n */\nexport interface TextureLayoutStrategy {\n computeTextureWH(shape: readonly number[], prefs?: WidthHeightPrefs): [number, number];\n}\n\n/**\n * This strategy try to find the minimal max(W,H) that fulfills (W * H == totalSize)\n */\nexport class AlwaysKeepOriginalSizeStrategy implements TextureLayoutStrategy {\n constructor(public maxTextureSize: number) {}\n computeTextureWH(shape: readonly number[], prefs?: WidthHeightPrefs): [number, number] {\n // scalar tensor\n if (shape.length === 0) {\n return [1, 1];\n }\n const maxTextureSize = this.maxTextureSize;\n if (prefs && prefs.breakAxis !== undefined) {\n // check to see if dims fit\n const wsize = prefs.breakAxis >= shape.length ? 1 : shape.slice(prefs.breakAxis).reduce((a, b) => a * b);\n const hsize = prefs.breakAxis <= 0 ? 1 : shape.slice(0, prefs.breakAxis).reduce((a, b) => a * b);\n if (wsize > maxTextureSize || hsize > maxTextureSize) {\n // ignore preferences\n // continue with default layout\n Logger.verbose(\n 'TextureLayout',\n `Given width/height preferences were unattainable: shape:${shape}, breakAxis:${prefs.breakAxis}`);\n } else {\n return [wsize, hsize];\n }\n }\n const totalSize = shape.reduce((a, b) => a * b);\n\n let width = Math.floor(Math.sqrt(totalSize));\n\n for (; width < maxTextureSize && width < totalSize; width++) {\n if (totalSize % width === 0) {\n break;\n }\n }\n\n if (width >= maxTextureSize || totalSize % width !== 0) {\n throw new Error(`The given dimensions are outside this GPU's boundaries: ${shape}`);\n }\n return [width, totalSize / width];\n }\n}\n\nexport class PreferLogicalStrategy implements TextureLayoutStrategy {\n constructor(public maxTextureSize: number) {}\n computeTextureWH(shape: readonly number[], prefs?: WidthHeightPrefs): [number, number] {\n const wh = this.computeTexture(shape, prefs);\n if (prefs && prefs.isPacked) {\n wh[0] /= 2;\n wh[1] /= 2;\n }\n if (prefs && prefs.reverseWH) {\n return [wh[1], wh[0]];\n }\n return wh;\n }\n\n computeTexture(shape: readonly number[], prefs?: WidthHeightPrefs): [number, number] {\n const isPacked = prefs && prefs.isPacked;\n // scalar tensor\n if (shape.length === 0) {\n return isPacked ? [2, 2] : [1, 1];\n }\n let maxTextureSize = this.maxTextureSize;\n if (prefs && prefs.breakAxis !== undefined) {\n // check to see if dims fit\n const wsize = prefs.breakAxis >= shape.length ? 1 : shape.slice(prefs.breakAxis).reduce((a, b) => a * b);\n const hsize = prefs.breakAxis <= 0 ? 1 : shape.slice(0, prefs.breakAxis).reduce((a, b) => a * b);\n if (wsize > maxTextureSize || hsize > maxTextureSize) {\n // ignore preferences\n // continue with default layout\n Logger.verbose(\n 'TextureLayout',\n `Given width/height preferences were unattainable: shape:${shape}, breakAxis:${prefs.breakAxis}`);\n } else {\n return [wsize, hsize];\n }\n }\n let logShape = shape.slice(0);\n if (isPacked) {\n maxTextureSize = maxTextureSize * 2;\n\n // This logic ensures we accurately count the number of packed texels needed\n // to accommodate the tensor. We can only pack values in the same texel if\n // they are from adjacent pairs of rows/cols within the same batch. So if a\n // tensor has 3 rows, we pretend it has 4 rows in order to account for the\n // fact that the texels containing the third row are half empty.\n logShape = logShape.map(\n (_d, i) => i >= logShape.length - 2 ? (logShape[i] % 2 === 0 ? logShape[i] : logShape[i] + 1) : logShape[i]);\n\n // Packed texture height is at least 2 (the channel height of a single\n // texel).\n if (logShape.length === 1) {\n logShape = [2, logShape[0]];\n }\n }\n\n // If logical shape is 2, we don't squeeze, since we want to match physical.\n if (logShape.length !== 2) {\n const squeezeResult = squeezeShape(logShape);\n logShape = squeezeResult.newShape;\n }\n\n const size = sizeFromShape(logShape);\n if (logShape.length <= 1 && size <= maxTextureSize) {\n return [1, size];\n } else if (logShape.length === 2 && logShape[0] <= maxTextureSize && logShape[1] <= maxTextureSize) {\n return logShape as [number, number];\n } else if (logShape.length === 3 && logShape[0] * logShape[1] <= maxTextureSize && logShape[2] <= maxTextureSize) {\n return [logShape[0] * logShape[1], logShape[2]];\n } else if (logShape.length === 3 && logShape[0] <= maxTextureSize && logShape[1] * logShape[2] <= maxTextureSize) {\n return [logShape[0], logShape[1] * logShape[2]];\n } else if (\n logShape.length === 4 && logShape[0] * logShape[1] * logShape[2] <= maxTextureSize &&\n logShape[3] <= maxTextureSize) {\n return [logShape[0] * logShape[1] * logShape[2], logShape[3]];\n } else if (\n logShape.length === 4 && logShape[0] <= maxTextureSize &&\n logShape[1] * logShape[2] * logShape[3] <= maxTextureSize) {\n return [logShape[0], logShape[1] * logShape[2] * logShape[3]];\n } else {\n if (isPacked) {\n // For packed textures size equals the number of channels required to\n // accommodate the texture data. However in order to squarify such that\n // inner dimensions stay even, we rewrite size to equal the number of\n // texels. Then in the return statement we rehydrate the squarified\n // dimensions to channel units.\n return sizeToSquarishShape(size / 4).map(d => d * 2) as [number, number];\n }\n return sizeToSquarishShape(size);\n }\n }\n}\n\nexport function squeezeShape(shape: number[], axis?: number[]): {newShape: number[]; keptDims: number[]} {\n const newShape: number[] = [];\n const keptDims: number[] = [];\n const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0;\n const axes = (axis == null || isEmptyArray) ? null : parseAxisParam(axis, shape).sort();\n let j = 0;\n for (let i = 0; i < shape.length; ++i) {\n if (axes != null) {\n if (axes[j] === i && shape[i] !== 1) {\n throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`);\n }\n if ((axes[j] == null || axes[j] > i) && shape[i] === 1) {\n newShape.push(shape[i]);\n keptDims.push(i);\n }\n if (axes[j] <= i) {\n j++;\n }\n }\n if (shape[i] !== 1) {\n newShape.push(shape[i]);\n keptDims.push(i);\n }\n }\n return {newShape, keptDims};\n}\n\nexport function parseAxisParam(axis: number|number[], shape: number[]): number[] {\n const rank = shape.length;\n\n // Normalize input\n axis = axis == null ? shape.map((_s, i) => i) : ([] as number[]).concat(axis);\n\n // Check for valid range\n assert(\n axis.every(ax => ax >= -rank && ax < rank),\n () => `All values in axis param must be in range [-${rank}, ${rank}) but ` +\n `got axis ${axis}`);\n\n // Check for only integers\n assert(\n axis.every(isInt),\n () => 'All values in axis param must be integers but ' +\n `got axis ${axis}`);\n\n // Handle negative axis.\n return axis.map(a => a < 0 ? rank + a : a);\n}\nexport function isInt(a: number): boolean {\n return a % 1 === 0;\n}\nexport function sizeFromShape(shape: number[]): number {\n if (shape.length === 0) {\n // Scalar.\n return 1;\n }\n let size = shape[0];\n for (let i = 1; i < shape.length; i++) {\n size *= shape[i];\n }\n return size;\n}\nexport function getRowsCols(shape: number[]): [number, number] {\n if (shape.length === 0) {\n throw Error('Cannot get rows and columns of an empty shape array.');\n }\n\n return [shape.length > 1 ? shape[shape.length - 2] : 1, shape[shape.length - 1]];\n}\nexport function sizeToSquarishShape(size: number): [number, number] {\n const width = Math.ceil(Math.sqrt(size));\n return [width, Math.ceil(size / width)];\n}\nexport function getBatchDim(shape: number[], dimsToSkip = 2): number {\n return sizeFromShape(shape.slice(0, shape.length - dimsToSkip));\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {ArrayUtil, BroadcastUtil, ShapeUtil} from '../../util';\n\nimport {GlslContext, GlslLib, GlslLibRoutine} from './glsl-definitions';\nimport {getGlsl} from './glsl-source';\nimport {squeezeShape} from './texture-layout-strategy';\nimport {TextureLayout} from './types';\nimport {generateShaderFuncNameFromInputSamplerName, generateShaderFuncNameFromInputSamplerNameAtOutCoords, getCoordsDataType, getGlChannels, getSqueezedParams, squeezeInputShape} from './utils';\n\n/**\n * GLSL Library responsible for data types and routines for manipulating\n * coordinates and mapping to/from tensor indices\n */\nexport class CoordsGlslLib extends GlslLib {\n returnType: string;\n\n constructor(context: GlslContext) {\n super(context);\n }\n getFunctions(): {[name: string]: GlslLibRoutine} {\n return {\n ...this.offsetToCoords(),\n ...this.coordsToOffset(),\n ...this.toVec(),\n ...this.valueFrom(),\n // TODO return these only when packing is enabled.\n ...this.getCommonUtilFuncs(),\n ...this.getInputsSamplingSnippets(),\n ...this.getOutputSamplingSnippet()\n };\n }\n getCustomTypes() {\n return {};\n }\n /**\n * Produces a function that can map from\n * 2D normalzied coordinates (s,t) to a flat offset\n */\n protected offsetToCoords(): {[name: string]: GlslLibRoutine} {\n const funcName = 'offsetToCoords';\n return {\n offsetToCoords: new GlslLibRoutine(`\n vec2 ${funcName}(int offset, int width, int height) {\n int t = offset / width;\n int s = offset - t*width;\n vec2 coords = (vec2(s,t) + vec2(0.5,0.5)) / vec2(width, height);\n return coords;\n }\n `)\n };\n }\n\n /**\n * Produces a function that can map from\n * 2D normalzied coordinates (s,t) to a flat offset\n */\n protected coordsToOffset(): {[name: string]: GlslLibRoutine} {\n const funcName = 'coordsToOffset';\n return {\n coordsToOffset: new GlslLibRoutine(`\n int ${funcName}(vec2 coords, int width, int height) {\n float s = coords.s * float(width);\n float t = coords.t * float(height);\n int offset = int(t) * width + int(s);\n return offset;\n }\n `)\n };\n }\n\n /**\n * Generates code for output sampler.\n */\n\n protected getOutputSamplingSnippet(): {[name: string]: GlslLibRoutine} {\n const outputLayout = this.context.outputTextureLayout;\n if (outputLayout.isPacked) {\n return this.getPackedOutputSamplingSnippet(outputLayout);\n } else {\n return this.getUnpackedOutputSamplingSnippet(outputLayout);\n }\n }\n\n /**\n * Generates code for packed output sampler.\n */\n protected getPackedOutputSamplingSnippet(outputLayout: TextureLayout): {[name: string]: GlslLibRoutine} {\n const outShape = outputLayout.unpackedShape;\n const outTexShape = [outputLayout.width, outputLayout.height];\n const result: {[name: string]: GlslLibRoutine} = {};\n const funcName = 'getOutputCoords';\n switch (outShape.length) {\n case 0:\n result[funcName] = this.getOutputScalarCoords();\n break;\n case 1:\n result[funcName] = this.getOutputPacked1DCoords(outShape as [number], outTexShape as [number, number]);\n break;\n case 2:\n result[funcName] = this.getOutputPacked2DCoords(outShape as [number, number], outTexShape as [number, number]);\n break;\n case 3:\n result[funcName] =\n this.getOutputPacked3DCoords(outShape as [number, number, number], outTexShape as [number, number]);\n break;\n default:\n result[funcName] = this.getOutputPackedNDCoords(outShape, outTexShape as [number, number]);\n }\n const glsl = getGlsl(this.context.glContext.version);\n // TODO we need this to properly return a packed vec4 from kernels.\n // Replace all '{glsl.output} = result' with 'setOutput(result)' in all kernels.\n const floatTextureSetRGBASource = `\n void setOutput(vec4 val) {\n ${glsl.output} = val;\n }\n `;\n const floatTextureSetRGBAFuncName = 'floatTextureSetRGBA';\n result[floatTextureSetRGBAFuncName] = new GlslLibRoutine(floatTextureSetRGBASource);\n return result;\n }\n\n /**\n * Generates code for unpacked output sampler.\n */\n protected getUnpackedOutputSamplingSnippet(outputLayout: TextureLayout): {[name: string]: GlslLibRoutine} {\n const outShape = outputLayout.unpackedShape;\n const outTexShape = [outputLayout.width, outputLayout.height];\n const result: {[name: string]: GlslLibRoutine} = {};\n const funcName = 'getOutputCoords';\n switch (outShape.length) {\n case 0:\n result[funcName] = this.getOutputScalarCoords();\n break;\n case 1:\n result[funcName] = this.getOutputUnpacked1DCoords(outShape as [number], outTexShape as [number, number]);\n break;\n case 2:\n result[funcName] =\n this.getOutputUnpacked2DCoords(outShape as [number, number], outTexShape as [number, number]);\n break;\n case 3:\n result[funcName] =\n this.getOutputUnpacked3DCoords(outShape as [number, number, number], outTexShape as [number, number]);\n break;\n case 4:\n result[funcName] = this.getOutputUnpacked4DCoords(\n outShape as [number, number, number, number], outTexShape as [number, number]);\n break;\n case 5:\n result[funcName] = this.getOutputUnpacked5DCoords(\n outShape as [number, number, number, number, number], outTexShape as [number, number]);\n break;\n case 6:\n result[funcName] = this.getOutputUnpacked6DCoords(\n outShape as [number, number, number, number, number, number], outTexShape as [number, number]);\n break;\n default:\n throw new Error(`Unsupported output dimensionality: ${outShape.length}`);\n }\n const glsl = getGlsl(this.context.glContext.version);\n // TODO we need this to properly return a packed vec4 from kernels.\n // Replace all '{glsl.output} = result' with 'setOutput(result)' in all kernels.\n const floatTextureSetRSource = `\n void setOutput(float val) {\n ${glsl.output} = vec4(val, 0, 0, 0);\n }\n `;\n const floatTextureSetRFuncName = 'floatTextureSetR';\n result[floatTextureSetRFuncName] = new GlslLibRoutine(floatTextureSetRSource);\n return result;\n }\n\n /**\n * Scalar output coordinates.\n */\n protected getOutputScalarCoords(): GlslLibRoutine {\n return new GlslLibRoutine(`\n int getOutputCoords() {\n return 0;\n }\n `);\n }\n\n /**\n * 1D packed output coordinates.\n */\n protected getOutputPacked1DCoords(_shape: [number], texShape: [number, number]): GlslLibRoutine {\n const packedTexShape = texShape;\n let source = '';\n if (packedTexShape[0] === 1) {\n source = `\n int getOutputCoords() {\n return 2 * int(TexCoords.y * ${packedTexShape[1]}.0);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n if (packedTexShape[1] === 1) {\n source = `\n int getOutputCoords() {\n return 2 * int(TexCoords.x * ${packedTexShape[0]}.0);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n source = `\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n return 2 * (resTexRC.y * ${packedTexShape[0]} + resTexRC.x);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * 2D packed output coordinates.\n */\n protected getOutputPacked2DCoords(shape: [number, number], texShape: [number, number]): GlslLibRoutine {\n let source = '';\n if (ArrayUtil.arraysEqual(shape, texShape)) {\n source = `\n ivec2 getOutputCoords() {\n return 2 * ivec2(TexCoords.xy * vec2(${texShape[0]}, ${texShape[1]}));\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n const packedTexShape = texShape;\n // texels needed to accommodate a logical row\n const texelsInLogicalRow = Math.ceil(shape[1] / 2);\n\n /**\n * getOutputCoords\n *\n * resTexRC: The rows and columns of the texels. If you move over one\n * texel to the right in the packed texture, you are moving over one column\n * (not two).\n *\n * index: The texel index\n */\n source = `\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n\n int index = resTexRC.y * ${packedTexShape[0]} + resTexRC.x;\n\n // reverse r and c order for packed texture\n int r = imod(index, ${texelsInLogicalRow}) * 2;\n int c = 2 * (index / ${texelsInLogicalRow});\n\n return ivec2(r, c);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * 3D packed output coordinates.\n */\n protected getOutputPacked3DCoords(shape: [number, number, number], texShape: [number, number]): GlslLibRoutine {\n const packedTexShape = [texShape[0], texShape[1]];\n const texelsInLogicalRow = Math.ceil(shape[2] / 2);\n const texelsInBatch = texelsInLogicalRow * Math.ceil(shape[1] / 2);\n const source = `\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n int index = resTexRC.y * ${packedTexShape[0]} + resTexRC.x;\n\n int b = index / ${texelsInBatch};\n index -= b * ${texelsInBatch};\n\n // reverse r and c order for packed texture\n int r = imod(index, ${texelsInLogicalRow}) * 2;\n int c = 2 * (index / ${texelsInLogicalRow});\n\n return ivec3(b, r, c);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * ND packed output coordinates.\n */\n protected getOutputPackedNDCoords(shape: readonly number[], texShape: [number, number]): GlslLibRoutine {\n const packedTexShape = [texShape[0], texShape[1]];\n\n const texelsInLogicalRow = Math.ceil(shape[shape.length - 1] / 2);\n const texelsInBatch = texelsInLogicalRow * Math.ceil(shape[shape.length - 2] / 2);\n let texelsInBatchN = texelsInBatch;\n let batches = '';\n let coords = 'b, r, c';\n\n for (let b = 2; b < shape.length - 1; b++) {\n texelsInBatchN *= shape[shape.length - b - 1];\n batches = `\n int b${b} = index / ${texelsInBatchN};\n index -= b${b} * ${texelsInBatchN};\n ` + batches;\n coords = `b${b}, ` + coords;\n }\n const source = `\n ivec${shape.length} getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n int index = resTexRC.y * ${packedTexShape[0]} + resTexRC.x;\n\n ${batches}\n\n int b = index / ${texelsInBatch};\n index -= b * ${texelsInBatch};\n\n // reverse r and c order for packed texture\n int r = imod(index, ${texelsInLogicalRow}) * 2;\n int c = 2 * (index / ${texelsInLogicalRow});\n\n return ivec${shape.length}(${coords});\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Unpacked 1D output coordinates.\n */\n protected getOutputUnpacked1DCoords(_shape: [number], texShape: [number, number]): GlslLibRoutine {\n const source = `\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${texShape[0]}, ${texShape[1]}));\n return resTexRC.y * ${texShape[0]} + resTexRC.x;\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Unpacked 2D output coordinates.\n */\n protected getOutputUnpacked2DCoords(shape: [number, number], texShape: [number, number]): GlslLibRoutine {\n const source = `\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${texShape[0]}, ${texShape[1]}));\n int index = resTexRC.y * ${texShape[0]} + resTexRC.x;\n int r = index / ${shape[1]};\n int c = index - r * ${shape[1]};\n return ivec2(r, c);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Unpacked 3D output coordinates.\n */\n protected getOutputUnpacked3DCoords(shape: [number, number, number], texShape: [number, number]): GlslLibRoutine {\n let source = '';\n const rank = shape.length;\n\n let strides = null;\n if (rank < 2) {\n strides = [];\n }\n\n strides = new Array(rank - 1);\n strides[rank - 2] = shape[rank - 1];\n for (let i = rank - 3; i >= 0; --i) {\n strides[i] = strides[i + 1] * shape[i + 1];\n }\n const coordsToCompute = ['r', 'c', 'd'];\n const coordsFromIndexSnippet =\n strides\n .map((stride, i) => {\n const line1 = `int ${coordsToCompute[i]} = index / ${stride}`;\n const line2 = i === strides.length - 1 ?\n `int ${coordsToCompute[i + 1]} = index - ${coordsToCompute[i]} * ${stride}` :\n `index -= ${coordsToCompute[i]} * ${stride}`;\n return `${line1}; ${line2};`;\n })\n .join('');\n\n source = `\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${texShape[0]}, ${texShape[1]}));\n int index = resTexRC.y * ${texShape[0]} + resTexRC.x;\n ${coordsFromIndexSnippet}\n return ivec3(r, c, d);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Unpacked 4D output coordinates.\n */\n protected getOutputUnpacked4DCoords(shape: [number, number, number, number], texShape: [number, number]):\n GlslLibRoutine {\n let source = '';\n const rank = shape.length;\n\n let strides = null;\n if (rank < 2) {\n strides = [];\n }\n\n strides = new Array(rank - 1);\n strides[rank - 2] = shape[rank - 1];\n for (let i = rank - 3; i >= 0; --i) {\n strides[i] = strides[i + 1] * shape[i + 1];\n }\n const coordsToCompute = ['r', 'c', 'd', 'd2'];\n const coordsFromIndexSnippet =\n strides\n .map((stride, i) => {\n const line1 = `int ${coordsToCompute[i]} = index / ${stride}`;\n const line2 = i === strides.length - 1 ?\n `int ${coordsToCompute[i + 1]} = index - ${coordsToCompute[i]} * ${stride}` :\n `index -= ${coordsToCompute[i]} * ${stride}`;\n return `${line1}; ${line2};`;\n })\n .join('');\n\n source = `\n ivec4 getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${texShape[0]}, ${texShape[1]}));\n int index = resTexRC.y * ${texShape[0]} + resTexRC.x;\n ${coordsFromIndexSnippet}\n return ivec4(r, c, d, d2);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Unpacked 5D output coordinates.\n */\n protected getOutputUnpacked5DCoords(shape: [number, number, number, number, number], texShape: [number, number]):\n GlslLibRoutine {\n let source = '';\n const rank = shape.length;\n\n let strides = null;\n if (rank < 2) {\n strides = [];\n }\n\n strides = new Array(rank - 1);\n strides[rank - 2] = shape[rank - 1];\n for (let i = rank - 3; i >= 0; --i) {\n strides[i] = strides[i + 1] * shape[i + 1];\n }\n const coordsToCompute = ['r', 'c', 'd', 'd2', 'd3'];\n const coordsFromIndexSnippet =\n strides\n .map((stride, i) => {\n const line1 = `int ${coordsToCompute[i]} = index / ${stride}`;\n const line2 = i === strides.length - 1 ?\n `int ${coordsToCompute[i + 1]} = index - ${coordsToCompute[i]} * ${stride}` :\n `index -= ${coordsToCompute[i]} * ${stride}`;\n return `${line1}; ${line2};`;\n })\n .join('');\n\n source = `\n ivec5 getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${texShape[0]}, ${texShape[1]}));\n int index = resTexRC.y * ${texShape[0]} + resTexRC.x;\n ${coordsFromIndexSnippet}\n return ivec5(r, c, d, d2, d3);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Unpacked 6D output coordinates.\n */\n protected getOutputUnpacked6DCoords(shape: [number, number, number, number, number, number], texShape: [\n number, number\n ]): GlslLibRoutine {\n let source = '';\n const rank = shape.length;\n\n let strides = null;\n if (rank < 2) {\n strides = [];\n }\n\n strides = new Array(rank - 1);\n strides[rank - 2] = shape[rank - 1];\n for (let i = rank - 3; i >= 0; --i) {\n strides[i] = strides[i + 1] * shape[i + 1];\n }\n const coordsToCompute = ['r', 'c', 'd', 'd2', 'd3', 'd4'];\n const coordsFromIndexSnippet =\n strides\n .map((stride, i) => {\n const line1 = `int ${coordsToCompute[i]} = index / ${stride}`;\n const line2 = i === strides.length - 1 ?\n `int ${coordsToCompute[i + 1]} = index - ${coordsToCompute[i]} * ${stride}` :\n `index -= ${coordsToCompute[i]} * ${stride}`;\n return `${line1}; ${line2};`;\n })\n .join('');\n\n source = `\n ivec6 getOutputCoords() {\n ivec2 resTexRC = ivec2(TexCoords.xy *\n vec2(${texShape[0]}, ${texShape[1]}));\n int index = resTexRC.y * ${texShape[0]} + resTexRC.x;\n ${coordsFromIndexSnippet}\n return ivec6(r, c, d, d2, d3, d4);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Generates code for common UV coords computation utility functions.\n */\n protected getCommonUtilFuncs(): {[name: string]: GlslLibRoutine} {\n const result: {[name: string]: GlslLibRoutine} = {};\n let funcName = 'uvFromFlat';\n result[funcName] = new GlslLibRoutine(`\n vec2 uvFromFlat(int texNumR, int texNumC, int index) {\n int texC = index / texNumR;\n int texR = index - texC * texNumR;\n // TODO: swap texR, texC order in following function so row is corresponding to u and column is corresponding to\n // v.\n return (vec2(texR, texC) + halfCR) / vec2(texNumR, texNumC);\n }\n `);\n funcName = 'packedUVfrom1D';\n result[funcName] = new GlslLibRoutine(`\n vec2 packedUVfrom1D(int texNumR, int texNumC, int index) {\n int texelIndex = index / 2;\n int texR = texelIndex / texNumC;\n int texC = texelIndex - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n }\n `);\n funcName = 'packedUVfrom2D';\n result[funcName] = new GlslLibRoutine(`\n vec2 packedUVfrom2D(int texNumR, int texNumC, int texelsInLogicalRow, int row, int col) {\n int texelIndex = (row / 2) * texelsInLogicalRow + (col / 2);\n int texR = texelIndex / texNumC;\n int texC = texelIndex - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n }\n `);\n funcName = 'packedUVfrom3D';\n result[funcName] = new GlslLibRoutine(`\n vec2 packedUVfrom3D(int texNumR, int texNumC,\n int texelsInBatch, int texelsInLogicalRow, int b,\n int row, int col) {\n int index = b * texelsInBatch + (row / 2) * texelsInLogicalRow + (col / 2);\n int texR = index / texNumC;\n int texC = index - texR * texNumC;\n return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n }\n `);\n funcName = 'sampleTexture';\n const glsl = getGlsl(this.context.glContext.version);\n result[funcName] = new GlslLibRoutine(`\n float sampleTexture(sampler2D textureSampler, vec2 uv) {\n return ${glsl.texture2D}(textureSampler, uv).r;\n }`);\n return result;\n }\n\n /**\n * Constructing snippets for inputs\n */\n protected getInputsSamplingSnippets(): {[name: string]: GlslLibRoutine} {\n const result: {[name: string]: GlslLibRoutine} = {};\n const outputLayout = this.context.outputTextureLayout;\n this.context.programInfo.inputNames.forEach((samplerName, i) => {\n const inputLayout = this.context.inputTextureLayouts[i];\n const funcName = generateShaderFuncNameFromInputSamplerName(samplerName);\n if (inputLayout.isPacked) {\n result[funcName] = this.getPackedSamplerFromInput(funcName, samplerName, inputLayout);\n } else {\n result[funcName] = this.getUnpackedSamplerFromInput(funcName, samplerName, inputLayout);\n }\n\n const outCoordFuncName = generateShaderFuncNameFromInputSamplerNameAtOutCoords(samplerName);\n if (inputLayout.unpackedShape.length <= outputLayout.unpackedShape.length) {\n if (inputLayout.isPacked) {\n result[outCoordFuncName] =\n this.getPackedSamplerAtOutputCoords(outCoordFuncName, inputLayout, outputLayout, samplerName);\n } else {\n result[outCoordFuncName] =\n this.getUnpackedSamplerAtOutputCoords(outCoordFuncName, inputLayout, outputLayout, samplerName);\n }\n }\n });\n\n return result;\n }\n\n /**\n * Constructing snippets for output coordinates of samplers\n */\n protected getPackedSamplerAtOutputCoords(\n funcName: string, inputLayout: TextureLayout, outputLayout: TextureLayout, name: string): GlslLibRoutine {\n const inShape = inputLayout.unpackedShape;\n const outShape = outputLayout.unpackedShape;\n const texName = name;\n const texFuncSnippet = generateShaderFuncNameFromInputSamplerName(texName);\n\n const inRank = inShape.length;\n const outRank = outShape.length;\n\n const broadcastDims = BroadcastUtil.getBroadcastDims(inShape, outShape);\n\n const type = getCoordsDataType(outRank);\n const rankDiff = outRank - inRank;\n let coordsSnippet: string;\n const fields = getGlChannels();\n\n if (inRank === 0) {\n coordsSnippet = '';\n } else if (outRank < 2 && broadcastDims.length >= 1) {\n coordsSnippet = 'coords = 0;';\n } else {\n coordsSnippet = broadcastDims.map(d => `coords.${fields[d + rankDiff]} = 0;`).join('\\n');\n }\n let unpackedCoordsSnippet = '';\n if (outRank < 2 && inRank > 0) {\n unpackedCoordsSnippet = 'coords';\n } else {\n unpackedCoordsSnippet = inShape.map((_s, i) => `coords.${fields[i + rankDiff]}`).join(', ');\n }\n\n let output = 'return outputValue;';\n const inSize = ShapeUtil.size(inShape);\n const isInputScalar = inSize === 1;\n const outSize = ShapeUtil.size(outShape);\n const isOutputScalar = outSize === 1;\n\n if (inRank === 1 && !isInputScalar && !isOutputScalar) {\n output = `\n return vec4(outputValue.xy, outputValue.xy);\n `;\n } else if (isInputScalar && !isOutputScalar) {\n if (outRank === 1) {\n output = `\n return vec4(outputValue.x, outputValue.x, 0., 0.);\n `;\n } else {\n output = `\n return vec4(outputValue.x);\n `;\n }\n } else if (broadcastDims.length) {\n const rows = inRank - 2;\n const cols = inRank - 1;\n\n if (broadcastDims.indexOf(rows) > -1 && broadcastDims.indexOf(cols) > -1) {\n output = 'return vec4(outputValue.x);';\n } else if (broadcastDims.indexOf(rows) > -1) {\n output = 'return vec4(outputValue.x, outputValue.y, ' +\n 'outputValue.x, outputValue.y);';\n } else if (broadcastDims.indexOf(cols) > -1) {\n output = 'return vec4(outputValue.xx, outputValue.zz);';\n }\n }\n\n const swapLastDimsSnippet = `\n int lastDim = coords.${fields[outRank - 1]};\n coords.${fields[outRank - 1]} = coords.${fields[outRank - 2]};\n coords.${fields[outRank - 2]} = lastDim;\n `;\n const source = `\n vec4 ${funcName}() {\n ${type} coords = getOutputCoords();\n ${swapLastDimsSnippet}\n ${coordsSnippet}\n vec4 outputValue = ${texFuncSnippet}(${unpackedCoordsSnippet});\n ${output}\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.getOutputCoords']);\n }\n\n /**\n * Constructing snippets for unpacked output coordinates of samplers\n */\n protected getUnpackedSamplerAtOutputCoords(\n funcName: string, inputLayout: TextureLayout, outputLayout: TextureLayout, name: string): GlslLibRoutine {\n const outTexShape = [outputLayout.width, outputLayout.height];\n const inTexShape = [inputLayout.width, inputLayout.height];\n const inRank = inputLayout.unpackedShape.length;\n const outRank = outputLayout.unpackedShape.length;\n const inShape = inputLayout.unpackedShape;\n const outShape = outputLayout.unpackedShape;\n const texFuncSnippet = generateShaderFuncNameFromInputSamplerName(name);\n\n if (inRank === outRank && ArrayUtil.arraysEqual(inTexShape, outTexShape)) {\n const source = `\n float ${funcName}() {\n return sampleTexture(${name}, TexCoords);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n }\n\n const type = getCoordsDataType(outRank);\n const broadcastDims = BroadcastUtil.getBroadcastDims(inShape, outShape);\n const rankDiff = outRank - inRank;\n let coordsSnippet: string;\n const fields = getGlChannels();\n\n if (inRank === 0) {\n coordsSnippet = '';\n } else if (outRank < 2 && broadcastDims.length >= 1) {\n coordsSnippet = 'coords = 0;';\n } else {\n coordsSnippet = broadcastDims.map(d => `coords.${fields[d + rankDiff]} = 0;`).join('\\n');\n }\n let unpackedCoordsSnippet = '';\n if (outRank < 2 && inRank > 0) {\n unpackedCoordsSnippet = 'coords';\n } else {\n unpackedCoordsSnippet = inputLayout.unpackedShape.map((_s, i) => `coords.${fields[i + rankDiff]}`).join(', ');\n }\n const source = `\n float ${funcName}() {\n ${type} coords = getOutputCoords();\n ${coordsSnippet}\n return ${texFuncSnippet}(${unpackedCoordsSnippet});\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.getOutputCoords']);\n }\n\n /**\n * Constructing snippets for packed operations.\n */\n protected getPackedSamplerFromInput(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n switch (inputLayout.unpackedShape.length) {\n case 0:\n return this.getPackedSamplerScalar(funcName, name);\n case 1:\n return this.getPackedSampler1D(funcName, name, inputLayout);\n case 2:\n return this.getPackedSampler2D(funcName, name, inputLayout);\n case 3:\n return this.getPackedSampler3D(funcName, name, inputLayout);\n default:\n return this.getPackedSamplerND(funcName, name, inputLayout);\n }\n }\n\n /**\n * Constructing snippets for unpacked operations.\n */\n protected getUnpackedSamplerFromInput(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n switch (shape.length) {\n case 0:\n return this.getUnpackedSamplerScalar(funcName, name, inputLayout);\n case 1:\n return this.getUnpackedSampler1D(funcName, name, inputLayout);\n case 2:\n return this.getUnpackedSampler2D(funcName, name, inputLayout);\n case 3:\n return this.getUnpackedSampler3D(funcName, name, inputLayout);\n case 4:\n return this.getUnpackedSampler4D(funcName, name, inputLayout);\n case 5:\n return this.getUnpackedSampler5D(funcName, name, inputLayout);\n case 6:\n return this.getUnpackedSampler6D(funcName, name, inputLayout);\n default:\n // TODO support more dimensionalities\n throw new Error(`Unsupported dimension ${shape.length}-D`);\n }\n }\n\n /**\n * Packed scalar snippet.\n */\n protected getPackedSamplerScalar(funcName: string, name: string): GlslLibRoutine {\n const glsl = getGlsl(this.context.glContext.version);\n const source = `\n vec4 ${funcName}() {\n return ${glsl.texture2D}(${name}, halfCR);\n }\n `;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Packed 1D snippet.\n */\n protected getPackedSampler1D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const texShape = [inputLayout.width, inputLayout.height];\n const packedTexShape = [texShape[1], texShape[0]];\n const glsl = getGlsl(this.context.glContext.version);\n\n const packedSampler = `vec4 ${funcName}(int index) {\n vec2 uv = packedUVfrom1D(\n ${packedTexShape[0]}, ${packedTexShape[1]}, index);\n return ${glsl.texture2D}(${name}, uv);\n }`;\n const source = packedSampler;\n return new GlslLibRoutine(source, ['coordinates.packedUVfrom1D']);\n }\n\n /**\n * Packed 2D snippet.\n */\n protected getPackedSampler2D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n const texShape = [inputLayout.width, inputLayout.height];\n const glsl = getGlsl(this.context.glContext.version);\n const texNumR = texShape[0];\n const texNumC = texShape[1];\n\n if (texShape != null && ArrayUtil.arraysEqual(shape, texShape)) {\n const packedSampler = `vec4 ${funcName}(int row, int col) {\n vec2 uv = (vec2(col, row) + halfCR) / vec2(${texNumC}.0, ${texNumR}.0);\n return ${glsl.texture2D}(${name}, uv);\n }`;\n\n return new GlslLibRoutine(packedSampler);\n }\n const packedTexShape = texShape;\n const valuesPerRow = Math.ceil(shape[1] / 2);\n const packedSampler = `vec4 ${funcName}(int row, int col) {\n vec2 uv = packedUVfrom2D(${packedTexShape[1]}, ${packedTexShape[0]}, ${valuesPerRow}, row, col);\n return ${glsl.texture2D}(${name}, uv);\n }`;\n const source = packedSampler;\n return new GlslLibRoutine(source, ['coordinates.packedUVfrom2D']);\n }\n\n /**\n * Packed 3D snippet.\n */\n protected getPackedSampler3D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n const texShape = [inputLayout.width, inputLayout.height];\n const packedTexShape = [texShape[0], texShape[1]];\n const glsl = getGlsl(this.context.glContext.version);\n\n if (shape[0] === 1) {\n const squeezedShape = shape.slice(1);\n const keptDims = [1, 2];\n const newInputShape = squeezeInputShape(shape, squeezedShape);\n const params = ['b', 'row', 'col'];\n // Deep copy of input texture layout.\n const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n newInputLayout.unpackedShape = newInputShape;\n const samplerRoutine = this.getPackedSamplerFromInput(funcName, name, newInputLayout);\n const packedSampler = `${samplerRoutine.routineBody}\n vec4 ${funcName}(int b, int row, int col) {\n return ${funcName}(${getSqueezedParams(params, keptDims)});\n } `;\n const source = packedSampler;\n return new GlslLibRoutine(source, samplerRoutine.dependencies);\n }\n const texNumR = packedTexShape[0];\n const texNumC = packedTexShape[1];\n\n const valuesPerRow = Math.ceil(shape[2] / 2);\n const texelsInBatch = valuesPerRow * Math.ceil(shape[1] / 2);\n\n const packedSampler = `vec4 ${funcName}(int b, int row, int col) {\n vec2 uv = packedUVfrom3D(\n ${texNumC}, ${texNumR}, ${texelsInBatch}, ${valuesPerRow}, b, row, col);\n return ${glsl.texture2D}(${name}, uv);}`;\n const source = packedSampler;\n return new GlslLibRoutine(source, ['coordinates.packedUVfrom3D']);\n }\n /*\n * Packed ND snippet.\n */\n protected getPackedSamplerND(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n const rank = shape.length;\n const texShape = [inputLayout.width, inputLayout.height];\n const glsl = getGlsl(this.context.glContext.version);\n\n const packedTexShape = [texShape[0], texShape[1]];\n const texNumR = packedTexShape[1];\n const texNumC = packedTexShape[0];\n const valuesPerRow = Math.ceil(shape[rank - 1] / 2);\n let texelsInBatch = valuesPerRow * Math.ceil(shape[rank - 2] / 2);\n let params = 'int b, int row, int col';\n let index = `b * ${texelsInBatch} + (row / 2) * ${valuesPerRow} + (col / 2)`;\n for (let b = 2; b < rank - 1; b++) {\n params = `int b${b}, ` + params;\n texelsInBatch *= shape[rank - b - 1];\n index = `b${b} * ${texelsInBatch} + ` + index;\n }\n const packedSampler = `vec4 ${funcName}(${params}) {\n int index = ${index};\n int texR = index / ${texNumC};\n int texC = index - texR * ${texNumC};\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${texNumC}, ${texNumR});\n return ${glsl.texture2D}(${name}, uv);\n }`;\n const source = packedSampler;\n return new GlslLibRoutine(source);\n }\n\n /**\n * Unpacked scalar snippet.\n */\n protected getUnpackedSamplerScalar(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const [texNumR, texNumC] = [inputLayout.width, inputLayout.height];\n if (texNumR === 1 && texNumC === 1) {\n const source = `\n float ${funcName}() {\n return sampleTexture(${name}, halfCR);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n }\n\n const source = `\n float ${funcName}() {\n int offset_${name} = coordsToOffset(TexCoords, ${texNumR}, ${texNumC});\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, offset_${name});\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(\n source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n }\n\n /**\n * Unpacked 1D snippet.\n */\n protected getUnpackedSampler1D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const tNumR = inputLayout.width;\n const tNumC = inputLayout.height;\n\n if (tNumC === 1 && tNumR === 1) {\n const source = `\n float ${funcName}(int index) {\n return sampleTexture(${name}, halfCR);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n }\n\n if (tNumC === 1) {\n const source = `\n float ${funcName}(int index) {\n vec2 uv = vec2((float(index) + 0.5) / ${tNumR}.0, 0.5);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n }\n if (tNumR === 1) {\n const source = `\n float ${funcName}(int index) {\n vec2 uv = vec2(0.5, (float(index) + 0.5) / ${tNumC}.0);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n }\n const source = `\n float ${funcName}(int index) {\n vec2 uv = uvFromFlat(${tNumR}, ${tNumC}, index);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture']);\n }\n\n /**\n * Unpacked 2D snippet.\n */\n\n protected getUnpackedSampler2D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n\n // TODO: modify row/col order for other dimensions.\n const texShape = [inputLayout.height, inputLayout.width];\n\n if (texShape != null && ArrayUtil.arraysEqual(shape, texShape)) {\n const texNumR = texShape[1];\n const texNumC = texShape[0];\n const source = `\n float ${funcName}(int row, int col) {\n vec2 uv = (vec2(row, col) + halfCR) / vec2(${texNumR}.0, ${texNumC}.0);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n }\n\n const {newShape, keptDims} = squeezeShape(shape as number[]);\n const squeezedShape = newShape;\n if (squeezedShape.length < shape.length) {\n const newInputShape = squeezeInputShape(shape, squeezedShape);\n // Deep copy of input texture layout.\n const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n newInputLayout.unpackedShape = newInputShape;\n\n const params = ['col', 'row'];\n const source = `\n ${this.getUnpackedSamplerFromInput(funcName, name, newInputLayout).routineBody}\n float ${funcName}(int row, int col) {\n return ${funcName}(${getSqueezedParams(params, keptDims)});\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture']);\n }\n\n const texNumR = texShape[1];\n const texNumC = texShape[0];\n if (texNumC === 1) {\n const source = `\n float ${funcName}(int row, int col) {\n int offset_${name} = coordsToOffset(TexCoords, ${texNumR}, ${texNumC});\n float index = dot(vec3(row, col, offset_${name}), vec3(${shape[1]}, 1, 1));\n vec2 uv = vec2(0.5, (index + 0.5) / ${texNumR}.0);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n }\n\n if (texNumR === 1) {\n const source = `\n float ${funcName}(int row, int col) {\n int offset_${name} = coordsToOffset(TexCoords, ${texNumR}, ${texNumC});\n float index = dot(vec3(row, col, offset_${name}), vec3(${shape[1]}, 1, 1));\n vec2 uv = vec2((index + 0.5) / ${texNumC}.0, 0.5);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n }\n\n const source = `\n float ${funcName}(int row, int col) {\n int index = col * ${shape[1]} + row;\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(\n source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n }\n\n /**\n * Unpacked 3D snippet.\n */\n\n protected getUnpackedSampler3D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n const stride0 = shape[1] * shape[2];\n const stride1 = shape[2];\n\n const {newShape, keptDims} = squeezeShape(shape as number[]);\n const squeezedShape = newShape;\n if (squeezedShape.length < shape.length) {\n const newInputShape = squeezeInputShape(shape, squeezedShape);\n const params = ['batch', 'col', 'row'];\n // Deep copy of input texture layout.\n const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n newInputLayout.unpackedShape = newInputShape;\n const routine = this.getUnpackedSamplerFromInput(funcName, name, newInputLayout);\n // TODO: revisit the logic here to make it simpler\n const revDims = keptDims.reverse();\n const source = `\n ${routine.routineBody}\n float ${funcName}(int batch, int row, int col) {\n return ${funcName}(${getSqueezedParams(params, revDims)});\n }\n `;\n return new GlslLibRoutine(source, routine.dependencies);\n }\n\n const texNumR = inputLayout.width;\n const texNumC = inputLayout.height;\n const source = `\n float ${funcName}(int depth, int row, int col) {\n // Explicitly use integer operations as dot() only works on floats.\n int index = depth * ${stride0} + col * ${stride1} + row;\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(\n source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n }\n\n /**\n * Unpacked 4D snippet.\n */\n\n protected getUnpackedSampler4D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n const stride2 = shape[3];\n const stride1 = shape[2] * stride2;\n const stride0 = shape[1] * stride1;\n\n //\n // TODO: re-enable this shortcut once the index calculation bug is fixed.\n //\n // const {newShape, keptDims} = squeezeShape(shape as number[]);\n // if (newShape.length < shape.length) {\n // const newInputShape = squeezeInputShape(shape, newShape);\n // const params = ['row', 'col', 'depth', 'depth2'];\n // // Deep copy of input texture layout.\n // const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n // newInputLayout.unpackedShape = newInputShape;\n // const source = `\n // ${this.getUnpackedSamplerFromInput(funcName, name, newInputLayout).routineBody}\n // float ${funcName}(int row, int col, int depth, int depth2) {\n // return ${funcName}(${getSqueezedParams(params, keptDims)});\n // }\n // `;\n // return new GlslLibRoutine(\n // source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n // }\n\n const texNumR = inputLayout.width;\n const texNumC = inputLayout.height;\n const source = `\n float ${funcName}(int row, int col, int depth, int depth2) {\n int index = row * ${stride0} + col * ${stride1} +\n depth2 * ${stride2} + depth;\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture']);\n }\n\n /**\n * Unpacked 5D snippet.\n */\n protected getUnpackedSampler5D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n const stride3 = shape[4];\n const stride2 = shape[3] * stride3;\n const stride1 = shape[2] * stride2;\n const stride0 = shape[1] * stride1;\n\n const {newShape, keptDims} = squeezeShape(shape as number[]);\n if (newShape.length < shape.length) {\n const newInputShape = squeezeInputShape(shape, newShape);\n const params = ['row', 'col', 'depth', 'depth2', 'depth3'];\n // Deep copy of input texture layout.\n const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n newInputLayout.unpackedShape = newInputShape;\n\n const source = `\n ${this.getUnpackedSamplerFromInput(funcName, name, newInputLayout).routineBody}\n float ${funcName}(int row, int col, int depth, int depth2, int depth3) {\n return ${funcName}(${getSqueezedParams(params, keptDims)});\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture', 'coordinates.uvFromFlat']);\n }\n\n const texNumR = inputLayout.width;\n const texNumC = inputLayout.height;\n const source = `\n float ${funcName}(int row, int col, int depth, int depth2, int depth3) {\n int index = row * ${stride0} + col * ${stride1} + depth * ${stride2} +\n depth3 * ${stride3} + depth2;\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture', 'coordinates.uvFromFlat']);\n }\n\n /**\n * Unpacked 6D snippet.\n */\n protected getUnpackedSampler6D(funcName: string, name: string, inputLayout: TextureLayout): GlslLibRoutine {\n const shape = inputLayout.unpackedShape;\n const stride4 = shape[5];\n const stride3 = shape[4] * stride4;\n const stride2 = shape[3] * stride3;\n const stride1 = shape[2] * stride2;\n const stride0 = shape[1] * stride1;\n\n const {newShape, keptDims} = squeezeShape(shape as number[]);\n if (newShape.length < shape.length) {\n const newInputShape = squeezeInputShape(shape, newShape);\n const params = ['row', 'col', 'depth', 'depth2', 'depth3', 'depth4'];\n // Deep copy of input texture layout.\n const newInputLayout: TextureLayout = JSON.parse(JSON.stringify(inputLayout));\n newInputLayout.unpackedShape = newInputShape;\n\n const source = `\n ${this.getUnpackedSamplerFromInput(funcName, name, newInputLayout).routineBody}\n float ${funcName}(int row, int col, int depth,\n int depth2, int depth3, int depth4) {\n return ${funcName}(${getSqueezedParams(params, keptDims)});\n }\n `;\n return new GlslLibRoutine(source, ['coordinates.sampleTexture', 'coordinates.uvFromFlat']);\n }\n\n const texNumR = inputLayout.width;\n const texNumC = inputLayout.height;\n const source = `\n float ${funcName}(int row, int col, int depth,\n int depth2, int depth3, int depth4) {\n int index = row * ${stride0} + col * ${stride1} + depth * ${stride2} +\n depth2 * ${stride3} + depth3 * ${stride4} + depth4;\n vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n return sampleTexture(${name}, uv);\n }\n `;\n return new GlslLibRoutine(\n source, ['coordinates.uvFromFlat', 'coordinates.sampleTexture', 'coordinates.coordsToOffset']);\n }\n\n /**\n * This is the main function to map from the given texture coordinates (s,t)\n * to logical indices for the output\n * There will only be one single variation of this\n * Also see coordsToOffset and offsetToIndices for input-specific versions\n */\n protected toVec(): {[name: string]: GlslLibRoutine} {\n const output = this.context.outputTextureLayout;\n const rank = output.shape.length;\n const strides = output.strides;\n const xScale = output.width;\n const yScale = output.height;\n\n const stridesBlock = [];\n for (let i = 0; i < rank - 1; ++i) {\n stridesBlock.push(`\n c[${i}] = offset / ${strides[i]};`);\n stridesBlock.push(`\n offset -= c[${i}] * ${strides[i]};`);\n }\n stridesBlock.push(`\n c[${rank - 1}] = offset;`);\n const body = `\n void toVec(vec2 texCoords, out int c[${rank}]) {\n int offset = coordsToOffset(texCoords, ${xScale}, ${yScale});\n ${stridesBlock.join('')}\n }\n void toVec(int offset, out int c[${rank}]) {\n ${stridesBlock.join('')}\n }\n `;\n return {toVec: new GlslLibRoutine(body, ['coordinates.coordsToOffset'])};\n }\n /**\n * These are value getter functions generated for each input\n * Each function is hardwired to the name and dimensions of the input\n * An '_T' variation is also produced which accesses values as if the\n * input was transposed\n */\n protected valueFrom(): {[name: string]: GlslLibRoutine} {\n const result: {[name: string]: GlslLibRoutine} = {};\n this.context.programInfo.inputNames.forEach((name, i) => {\n const layout = this.context.inputTextureLayouts[i];\n const shape = layout.unpackedShape.length > 0 ? layout.unpackedShape : layout.shape;\n const rank = shape.length;\n let funcName = `_${name}`;\n result[funcName] = new GlslLibRoutine(\n this.getValueFromSingle(name, rank, layout.width, layout.height, false),\n [`shapeUtils.indicesToOffset${funcName}`, 'coordinates.offsetToCoords', 'fragcolor.getColorAsFloat']);\n funcName = funcName + '_T';\n result[funcName] = new GlslLibRoutine(\n this.getValueFromSingle(name, rank, layout.width, layout.height, true),\n [`shapeUtils.indicesToOffset${funcName}`, 'coordinates.offsetToCoords', 'fragcolor.getColorAsFloat']);\n });\n return result;\n }\n /**\n * Produces one value getter function for the name and rank given\n * If a transpose is set proper offsetToCoords mapping will be used\n * @param name name of the function\n * @param rank rank of the input\n * @param transpose whether or not should generate a transpose variation\n */\n protected getValueFromSingle(varName: string, rank: number, width: number, height: number, transpose: boolean):\n string {\n let name = `_${varName}`;\n if (transpose) {\n name = name + '_T';\n }\n const glsl = getGlsl(this.context.glContext.version);\n return `\n float ${name}(int m[${rank}]) {\n int offset = indicesToOffset${name}(m);\n vec2 coords = offsetToCoords(offset, ${width}, ${height});\n float value = getColorAsFloat(${glsl.texture2D}(${varName}, coords));\n return value;\n }\n `;\n }\n\n /**\n * Produces a packed value getter function for the name and rank given\n * If a transpose is set proper offsetToCoords mapping will be used\n * @param name name of the function\n * @param rank rank of the input\n * @param transpose whether or not should generate a transpose variation\n */\n protected getPackedValueFrom(varName: string, rank: number, width: number, height: number, transpose: boolean):\n string {\n let name = `_${varName}_Pack`;\n if (transpose) {\n name = name + '_T';\n }\n const glsl = getGlsl(this.context.glContext.version);\n return `\n vec4 ${name}(int m[${rank}]) {\n int offset = indicesToOffset_${varName}(m);\n vec2 coords = offsetToCoords(offset, ${width}, ${height});\n return ${glsl.texture2D}(${varName}, coords);\n }\n `;\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {GlslContext, GlslLib, GlslLibRoutine} from './glsl-definitions';\n\n/**\n * This GLSL library handles routines converting\n * float32 to/from Unsigned byte or float 16\n */\nexport class EncodingGlslLib extends GlslLib {\n constructor(context: GlslContext) {\n super(context);\n }\n getFunctions(): {[name: string]: GlslLibRoutine} {\n return {...this.encodeFloat32(), ...this.decodeFloat32()};\n }\n getCustomTypes(): {[name: string]: string} {\n return {};\n }\n protected encodeFloat32(): {[name: string]: GlslLibRoutine} {\n return {\n encode: new GlslLibRoutine(`highp vec4 encode(highp float f) {\n return vec4(f, 0.0, 0.0, 0.0);\n }\n `)\n };\n }\n protected decodeFloat32(): {[name: string]: GlslLibRoutine} {\n return {\n decode: new GlslLibRoutine(`highp float decode(highp vec4 rgba) {\n return rgba.r;\n }\n `)\n };\n }\n /**\n * returns the routine to encode encode a 32bit float to a vec4 (of unsigned bytes)\n * @credit: https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float\n */\n protected encodeUint8(): {[name: string]: GlslLibRoutine} {\n const endianness = EncodingGlslLib.isLittleEndian() ? 'rgba.rgba=rgba.abgr;' : '';\n return {\n encode: new GlslLibRoutine(`\n highp vec4 encode(highp float f) {\n highp float F = abs(f);\n highp float Sign = step(0.0,-f);\n highp float Exponent = floor(log2(F));\n highp float Mantissa = (exp2(- Exponent) * F);\n Exponent = floor(log2(F) + 127.0) + floor(log2(Mantissa));\n highp vec4 rgba;\n rgba[0] = 128.0 * Sign + floor(Exponent*exp2(-1.0));\n rgba[1] = 128.0 * mod(Exponent,2.0) + mod(floor(Mantissa*128.0),128.0);\n rgba[2] = floor(mod(floor(Mantissa*exp2(23.0 -8.0)),exp2(8.0)));\n rgba[3] = floor(exp2(23.0)*mod(Mantissa,exp2(-15.0)));\n ${endianness}\n rgba = rgba / 255.0; // values need to be normalized to [0,1]\n return rgba;\n }\n `)\n };\n }\n /**\n * returns the routine to encode a vec4 of unsigned bytes to float32\n * @credit: https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float\n */\n protected decodeUint8(): {[name: string]: GlslLibRoutine} {\n const endianness = EncodingGlslLib.isLittleEndian() ? 'rgba.rgba=rgba.abgr;' : '';\n return {\n decode: new GlslLibRoutine(`\n highp float decode(highp vec4 rgba) {\n rgba = rgba * 255.0; // values need to be de-normalized from [0,1] to [0,255]\n ${endianness}\n highp float Sign = 1.0 - step(128.0,rgba[0])*2.0;\n highp float Exponent = 2.0 * mod(rgba[0],128.0) + step(128.0,rgba[1]) - 127.0;\n highp float Mantissa = mod(rgba[1],128.0)*65536.0 + rgba[2]*256.0 +rgba[3] + float(0x800000);\n highp float Result = Sign * exp2(Exponent) * (Mantissa * exp2(-23.0 ));\n return Result;\n }\n `)\n };\n }\n /**\n * Determines if the machine is little endian or not\n * @credit: https://gist.github.com/TooTallNate/4750953\n */\n static isLittleEndian(): boolean {\n const b = new ArrayBuffer(4);\n const a = new Uint32Array(b);\n const c = new Uint8Array(b);\n a[0] = 0xdeadbeef;\n if (c[0] === 0xef) {\n return true;\n }\n if (c[0] === 0xde) {\n return false;\n }\n throw new Error('unknown endianness');\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {GlslContext, GlslLib, GlslLibRoutine} from './glsl-definitions';\nimport {getGlsl} from './glsl-source';\n\n/**\n * This GLSL library handles routines around reading a texlet and writing to it\n * Reading and writing could be more than just dealing with one channel\n * It may require encoding/decoding to/from 4 channels into one\n */\nexport class FragColorGlslLib extends GlslLib {\n constructor(context: GlslContext) {\n super(context);\n }\n getFunctions(): {[name: string]: GlslLibRoutine} {\n return {...this.setFragColor(), ...this.getColorAsFloat()};\n }\n getCustomTypes(): {[name: string]: string} {\n return {};\n }\n protected setFragColor(): {[name: string]: GlslLibRoutine} {\n const glsl = getGlsl(this.context.glContext.version);\n return {\n setFragColor: new GlslLibRoutine(\n `\n void setFragColor(float value) {\n ${glsl.output} = encode(value);\n }\n `,\n ['encoding.encode'])\n };\n }\n protected getColorAsFloat(): {[name: string]: GlslLibRoutine} {\n return {\n getColorAsFloat: new GlslLibRoutine(\n `\n float getColorAsFloat(vec4 color) {\n return decode(color);\n }\n `,\n ['encoding.decode'])\n };\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {GlslContext, GlslLib, GlslLibRoutine} from './glsl-definitions';\n\n/**\n * GLSL Library responsible for data types and routines for manipulating\n * coordinates and mapping to/from tensor indices\n */\nexport class ShapeUtilsGlslLib extends GlslLib {\n constructor(context: GlslContext) {\n super(context);\n }\n getFunctions(): {[name: string]: GlslLibRoutine} {\n return {\n ...this.bcastIndex(),\n ...this.bcastMatmulIndex(),\n ...this.offsetToIndices(),\n ...this.indicesToOffset(),\n ...this.incrementIndices()\n };\n }\n getCustomTypes() {\n return {};\n }\n protected bcastIndex(): {[name: string]: GlslLibRoutine} {\n const outputRank = this.context.outputTextureLayout.shape.length;\n const result: {[name: string]: GlslLibRoutine} = {};\n this.context.programInfo.inputNames.forEach((name, i) => {\n const shape = this.context.inputTextureLayouts[i].unpackedShape;\n if (shape.length <= outputRank) {\n const rank = shape.length;\n const dimOffset = outputRank - rank;\n const funcName = `bcastIndices_${name}`;\n let block = '';\n for (let i = 0; i < rank; ++i) {\n block += `\n realIndices[${i}] = int( mod(float(bcastedIndices[${dimOffset + i}]), ${shape[i]}.0) );\n `;\n }\n const body = `\n void ${funcName} (int bcastedIndices[${outputRank}], out int realIndices[${rank}]) {\n ${block}\n }\n `;\n result[funcName] = new GlslLibRoutine(body);\n }\n });\n return result;\n }\n protected bcastMatmulIndex(): {[name: string]: GlslLibRoutine} {\n const outputRank = this.context.outputTextureLayout.shape.length;\n const result: {[name: string]: GlslLibRoutine} = {};\n this.context.programInfo.inputNames.forEach((name, i) => {\n const shape = this.context.inputTextureLayouts[i].shape;\n if (!(shape.length < 2 || shape.length > outputRank)) {\n const rank = shape.length;\n const dimOffset = outputRank - rank;\n const funcName = `bcastMatmulIndices_${name}`;\n let block = '';\n for (let i = 0; i < rank - 2; ++i) {\n block += `\n realIndices[${i}] = int( mod(float(bcastedIndices[${dimOffset + i}]), ${shape[i]}.0) );\n `;\n }\n const body = `\n void ${funcName}(int bcastedIndices[${outputRank}], out int realIndices[${rank}]) {\n ${block}\n realIndices[${rank - 1}] = bcastedIndices[${outputRank - 1}];\n realIndices[${rank - 2}] = bcastedIndices[${outputRank - 2}];\n }\n `;\n result[funcName] = new GlslLibRoutine(body);\n }\n });\n return result;\n }\n protected indicesToOffset(): {[name: string]: GlslLibRoutine} {\n const result: {[name: string]: GlslLibRoutine} = {};\n this.context.programInfo.inputNames.forEach((name, i) => {\n const shape = this.context.inputTextureLayouts[i].shape;\n const strides = this.context.inputTextureLayouts[i].strides;\n const rank = shape.length;\n let funcName = `indicesToOffset_${name}`;\n result[funcName] = new GlslLibRoutine(ShapeUtilsGlslLib.indexToOffsetSingle(funcName, rank, strides));\n funcName = `indicesToOffset_${name}_T`;\n result[funcName] =\n new GlslLibRoutine(ShapeUtilsGlslLib.indexToOffsetSingle(funcName, rank, strides.slice().reverse()));\n });\n return result;\n }\n static indexToOffsetSingle(name: string, rank: number, strides: readonly number[]): string {\n let block = '';\n for (let i = rank - 1; i >= 0; --i) {\n block += `\n offset += indices[${i}] * ${strides[i]};\n `;\n }\n return `\n int ${name}(int indices[${rank}]) {\n int offset = 0;\n ${block}\n return offset;\n }\n `;\n }\n protected offsetToIndices(): {[name: string]: GlslLibRoutine} {\n const result: {[name: string]: GlslLibRoutine} = {};\n this.context.programInfo.inputNames.forEach((name, i) => {\n const shape = this.context.inputTextureLayouts[i].shape;\n const strides = this.context.inputTextureLayouts[i].strides;\n const rank = shape.length;\n let funcName = `offsetToIndices_${name}`;\n result[funcName] = new GlslLibRoutine(ShapeUtilsGlslLib.offsetToIndicesSingle(funcName, rank, strides));\n funcName = `offsetToIndices_${name}_T`;\n result[funcName] =\n new GlslLibRoutine(ShapeUtilsGlslLib.offsetToIndicesSingle(funcName, rank, strides.slice().reverse()));\n });\n return result;\n }\n static offsetToIndicesSingle(name: string, rank: number, strides: readonly number[]): string {\n const stridesBlock = [];\n for (let i = 0; i < rank - 1; ++i) {\n stridesBlock.push(`\n indices[${i}] = offset / ${strides[i]};`);\n stridesBlock.push(`\n offset -= indices[${i}] * ${strides[i]};`);\n }\n stridesBlock.push(`\n indices[${rank - 1}] = offset;`);\n return `\n void ${name}(int offset, out int indices[${rank}]) {\n ${stridesBlock.join('')}\n }\n `;\n }\n protected incrementIndices(): {[name: string]: GlslLibRoutine} {\n const result: {[name: string]: GlslLibRoutine} = {};\n this.context.programInfo.inputNames.forEach((name, i) => {\n const shape = this.context.inputTextureLayouts[i].shape;\n const rank = shape.length;\n const funcName = `incrementIndices_${name}`;\n let shapeInit = '';\n for (let i = 0; i < rank; ++i) {\n shapeInit += `\n shape[${i}] = ${shape[i]};`;\n }\n const body = `\n void ${funcName}(int axis, out int indices[${rank}]) {\n int shape[${rank}];\n ${shapeInit};\n for(int i = ${rank} -1 ; i >= 0; --i) {\n if(i > axis) continue;\n indices[i] += 1;\n if(indices[i] < shape[i]) {\n break;\n }\n indices[i] = 0;\n }\n }\n `;\n result[funcName] = new GlslLibRoutine(body);\n });\n return result;\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {GlslContext, GlslLib, GlslLibRoutine} from './glsl-definitions';\n\n/**\n * GLSL Library responsible for vec routines\n * Vec is an varible length int array. The length is fixed at the time of\n * generating the library functions from the dimensions of the output.\n */\nexport class VecGlslLib extends GlslLib {\n constructor(context: GlslContext) {\n super(context);\n }\n getCustomTypes(): {[name: string]: string} {\n return {};\n }\n getFunctions(): {[name: string]: GlslLibRoutine} {\n return {...this.binaryVecFunctions(), ...this.copyVec(), ...this.setVecItem(), ...this.getVecItem()};\n }\n protected binaryVecFunctions(): {[name: string]: GlslLibRoutine} {\n const outputLayout = this.context.outputTextureLayout;\n const rank = outputLayout.shape.length;\n const nameOp: {[name: string]: string} = {add: '+=', sub: '-=', mul: '*=', div: '/='};\n const result: {[name: string]: GlslLibRoutine} = {};\n for (const name in nameOp) {\n const fname = `${name}Vec`;\n let assignmentBlock = '';\n for (let i = 0; i < rank; ++i) {\n assignmentBlock += `\n dest[${i}] ${nameOp[name]} src[${i}];\n `;\n }\n const body = `\n void ${fname}(int src[${rank}], out int dest[${rank}]) {\n ${assignmentBlock}\n }\n `;\n result[fname] = new GlslLibRoutine(body);\n }\n\n return result;\n }\n protected copyVec(): {[name: string]: GlslLibRoutine} {\n const outputLayout = this.context.outputTextureLayout;\n const rank = outputLayout.shape.length;\n let assignmentBlock = '';\n for (let i = 0; i < rank; ++i) {\n assignmentBlock += `\n dest[${i}] = src[${i}];\n `;\n }\n const body = `\n void copyVec(int src[${rank}], out int dest[${rank}]) {\n ${assignmentBlock}\n }\n `;\n return {copyVec: new GlslLibRoutine(body)};\n }\n\n protected setVecItem(): {[name: string]: GlslLibRoutine} {\n const outputLayout = this.context.outputTextureLayout;\n const rank = outputLayout.shape.length;\n let block = `\n if(index < 0)\n index =${rank} + index;\n if (index == 0)\n m[0] = value;\n `;\n for (let i = 1; i < rank - 1; ++i) {\n block += `\n else if (index == ${i})\n m[${i}] = value;\n `;\n }\n block += `\n else\n m[${rank - 1}] = value;\n `;\n const body = `\n void setVecItem(out int m[${rank}], int index, int value) {\n ${block}\n }\n `;\n return {setVecItem: new GlslLibRoutine(body)};\n }\n protected getVecItem(): {[name: string]: GlslLibRoutine} {\n const outputLayout = this.context.outputTextureLayout;\n const rank = outputLayout.shape.length;\n let block = `\n if(index < 0)\n index = ${rank} + index;\n if (index == 0)\n return m[0];\n `;\n for (let i = 1; i < rank - 1; ++i) {\n block += `\n else if (index == ${i})\n return m[${i}];\n `;\n }\n block += `\n else\n return m[${rank - 1}];\n `;\n const body = `\n int getVecItem(int m[${rank}], int index) {\n ${block}\n }\n `;\n return {getVecItem: new GlslLibRoutine(body)};\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {CoordsGlslLib} from './glsl-coordinate-lib';\nimport {GlslContext, GlslLib} from './glsl-definitions';\nimport {EncodingGlslLib} from './glsl-encoding-lib';\nimport {FragColorGlslLib} from './glsl-fragcolor-lib';\nimport {ShapeUtilsGlslLib} from './glsl-shape-utils-lib';\nimport {VecGlslLib} from './glsl-vec-lib';\n\nexport const glslRegistry: {[name: string]: new (context: GlslContext) => GlslLib} = {\n 'encoding': EncodingGlslLib,\n 'fragcolor': FragColorGlslLib,\n 'vec': VecGlslLib,\n 'shapeUtils': ShapeUtilsGlslLib,\n 'coordinates': CoordsGlslLib,\n // 'arrays': ArrayGlslSLib\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {GlslContext, GlslLib, GlslLibRoutineNode, TopologicalSortGlslRoutines} from './glsl-definitions';\nimport {replaceInlines} from './glsl-function-inliner';\nimport {glslRegistry} from './glsl-registered-libs';\nimport {getDefaultFragShaderMain, getFragShaderPreamble} from './glsl-source';\nimport {ProgramInfo, TextureLayout, VariableInfo} from './types';\nimport {WebGLContext} from './webgl-context';\n\n/**\n * Preprocessor for the additions to the GLSL language\n * It deals with:\n * @include directives\n * @inline\n * Loop unrolling (not implemented)\n * Macro resolution (not implemented)\n */\nexport class GlslPreprocessor {\n readonly context: GlslContext;\n readonly libs: {[name: string]: GlslLib} = {};\n readonly glslLibRoutineDependencyGraph: {[routineName: string]: GlslLibRoutineNode} = {};\n\n constructor(\n glContext: WebGLContext, programInfo: ProgramInfo, inputTextureLayouts: TextureLayout[],\n outputTextureLayout: TextureLayout) {\n this.context = new GlslContext(glContext, programInfo, inputTextureLayouts, outputTextureLayout);\n\n // construct GlslLibs\n Object.keys(glslRegistry).forEach((name: string) => {\n const lib = new glslRegistry[name](this.context);\n this.libs[name] = lib;\n });\n\n // construct GlslRoutineDependencyGraph\n const map = this.glslLibRoutineDependencyGraph;\n for (const libName in this.libs) {\n const lib = this.libs[libName];\n const routinesInLib = lib.getFunctions();\n for (const routine in routinesInLib) {\n const key = libName + '.' + routine;\n let currentNode: GlslLibRoutineNode;\n if (map[key]) {\n currentNode = map[key];\n currentNode.routineBody = routinesInLib[routine].routineBody;\n } else {\n currentNode = new GlslLibRoutineNode(key, routinesInLib[routine].routineBody);\n map[key] = currentNode;\n }\n const dependencies = routinesInLib[routine].dependencies;\n if (dependencies) {\n for (let i = 0; i < dependencies.length; ++i) {\n if (!map[dependencies[i]]) {\n const node = new GlslLibRoutineNode(dependencies[i]);\n map[dependencies[i]] = node;\n currentNode.addDependency(node);\n } else {\n currentNode.addDependency(map[dependencies[i]]);\n }\n }\n }\n }\n }\n }\n\n preprocess(): string {\n const programInfo = this.context.programInfo;\n let source = programInfo.shaderSource;\n\n // append main() function\n if (!this.context.programInfo.hasMain) {\n source = `${source}\n ${getDefaultFragShaderMain(this.context.glContext.version, this.context.outputTextureLayout.shape.length)}`;\n }\n // replace inlines\n source = replaceInlines(source);\n\n // concat final source string\n return `${getFragShaderPreamble(this.context.glContext.version)}\n ${this.getUniforms(programInfo.inputNames, programInfo.variables)}\n ${this.getImports(source)}\n ${source}`;\n }\n\n protected getImports(script: string): string {\n const routinesIncluded = this.selectGlslLibRoutinesToBeIncluded(script);\n\n if (routinesIncluded.length === 0) {\n return '';\n }\n\n let routines = '';\n for (let i = 0; i < routinesIncluded.length; ++i) {\n if (routinesIncluded[i].routineBody) {\n routines += routinesIncluded[i].routineBody + '\\n';\n } else {\n throw new Error(`Missing body for the Glsl Library routine: ${routinesIncluded[i].name}`);\n }\n }\n\n return routines;\n }\n private selectGlslLibRoutinesToBeIncluded(script: string): GlslLibRoutineNode[] {\n const nodes: GlslLibRoutineNode[] = [];\n\n Object.keys(this.glslLibRoutineDependencyGraph).forEach(classAndRoutine => {\n const routine = classAndRoutine.split('.')[1];\n if (script.indexOf(routine) !== -1) {\n nodes.push(this.glslLibRoutineDependencyGraph[classAndRoutine]);\n }\n });\n\n return TopologicalSortGlslRoutines.returnOrderedNodes(nodes);\n }\n\n protected getUniforms(samplers?: string[], variables?: VariableInfo[]): string {\n const uniformLines: string[] = [];\n if (samplers) {\n for (const sampler of samplers) {\n uniformLines.push(`uniform sampler2D ${sampler};`);\n }\n }\n if (variables) {\n for (const variable of variables) {\n uniformLines.push(\n `uniform ${variable.type} ${variable.name}${variable.arrayLength ? `[${variable.arrayLength}]` : ''};`);\n }\n }\n return uniformLines.join('\\n');\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport {Logger, Profiler} from '../../instrument';\n\nimport {GlslPreprocessor} from './glsl-preprocessor';\nimport {getVertexShaderSource} from './glsl-source';\nimport {TextureLayoutStrategy} from './texture-layout-strategy';\nimport {Artifact, ProgramInfo, ProgramVariable, TextureData, TextureLayout, VariableInfo} from './types';\nimport {WebGLContext} from './webgl-context';\n\n/**\n * ProgramManager is the main class behind running computations\n * It builds ProgramInfo's into Artifacts\n * It compiles given ProgramInfo's into WebGL Prorams (cached as Artifacts)\n * Uses the artifact to run the computation by calling Draw on\n * the WebGL drawing buffer\n * ProgramManager automatically maps (binds) input variables to their\n * corresponding Location's in the binary program\n */\nexport class ProgramManager {\n repo: Map; // this should be per-session object\n vertexShader: WebGLShader;\n attributesBound: boolean;\n\n constructor(\n public profiler: Readonly, public glContext: WebGLContext,\n public textureLayoutStrategy: TextureLayoutStrategy) {\n this.repo = new Map();\n this.attributesBound = false;\n }\n getArtifact(key: unknown): Artifact|undefined {\n return this.repo.get(key);\n }\n setArtifact(key: unknown, artifact: Artifact): void {\n this.repo.set(key, artifact);\n }\n run(buildArtifact: Artifact, inputs: TextureData[], output: TextureData): void {\n this.profiler.event('op', `ProgramManager.run ${buildArtifact.programInfo.name ?? 'unknown kernel'}`, () => {\n const gl = this.glContext.gl;\n const program = buildArtifact.program;\n gl.useProgram(program);\n try {\n this.bindOutput(output);\n if (!this.attributesBound) {\n this.bindAttributes(buildArtifact.attribLocations);\n }\n this.bindUniforms(buildArtifact.uniformLocations, buildArtifact.programInfo.variables ?? [], inputs);\n } catch (err) {\n Logger.error('ProgramManager', buildArtifact.programInfo.shaderSource);\n throw err;\n }\n this.profiler.event('backend', 'GlContext.draw()', () => {\n this.glContext.draw();\n });\n }, this.glContext);\n }\n dispose(): void {\n if (this.vertexShader) {\n this.glContext.deleteShader(this.vertexShader);\n }\n this.repo.forEach(a => this.glContext.deleteProgram(a.program));\n }\n build(programInfo: ProgramInfo, inputTextureLayouts: TextureLayout[], outputTextureLayout: TextureLayout): Artifact {\n return this.profiler.event('backend', 'ProgramManager.build', () => {\n const preprocessor = new GlslPreprocessor(this.glContext, programInfo, inputTextureLayouts, outputTextureLayout);\n const fragScript = preprocessor.preprocess();\n const program = this.compile(fragScript);\n const artifact = {\n programInfo,\n program,\n uniformLocations: this.getUniformLocations(\n program, preprocessor.context.programInfo.inputNames, preprocessor.context.programInfo.variables),\n attribLocations: this.getAttribLocations(program)\n };\n return artifact;\n });\n }\n protected compile(fragShaderScript: string): WebGLProgram {\n if (!this.vertexShader) {\n Logger.verbose('ProrgramManager', 'Compiling and caching Vertex shader for the first time');\n const vertexShaderScript = getVertexShaderSource(this.glContext.version);\n this.vertexShader = this.glContext.compileShader(vertexShaderScript, this.glContext.gl.VERTEX_SHADER);\n }\n if (env.debug) {\n Logger.verbose('ProrgramManager', `FragShader:\n${fragShaderScript}\n`);\n }\n const fragShader = this.glContext.compileShader(fragShaderScript, this.glContext.gl.FRAGMENT_SHADER);\n const program = this.glContext.createProgram(this.vertexShader, fragShader);\n this.glContext.deleteShader(fragShader);\n return program;\n }\n bindOutput(td: TextureData): void {\n const width = td.width;\n const height = td.height;\n Logger.verbose(\n 'ProrgramManager',\n `Binding output texture to Framebuffer: w/h=${width}/${height}, shape=${td.shape}, type=${td.tensor.type}`);\n this.glContext.attachFramebuffer(td.texture, width, height);\n }\n bindAttributes(attribLocations: Artifact.AttribLocations): void {\n const positionHandle = attribLocations.position;\n const textureCoordHandle = attribLocations.textureCoord;\n this.glContext.setVertexAttributes(positionHandle, textureCoordHandle);\n this.attributesBound = true;\n }\n bindUniforms(uniformLocations: Artifact.UniformLocations, variables: ProgramVariable[], textures: TextureData[]):\n void {\n const gl = this.glContext.gl;\n let texturePosition = 0;\n for (const {name, type, location, arrayLength} of uniformLocations) {\n const value = variables.find(v => v.name === name)?.data;\n if (type !== 'sampler2D' && !value) {\n throw new Error(`variable '${name}' does not have data defined in program info`);\n }\n switch (type) {\n case 'sampler2D':\n this.bindTexture(textures[texturePosition], location, texturePosition);\n texturePosition++;\n break;\n case 'float':\n if (arrayLength) {\n gl.uniform1fv(location, value as number[]);\n } else {\n gl.uniform1f(location, value as number);\n }\n break;\n case 'int':\n if (arrayLength) {\n gl.uniform1iv(location, value as number[]);\n } else {\n gl.uniform1i(location, value as number);\n }\n break;\n default:\n throw new Error(`Uniform not implemented: ${type}`);\n }\n }\n }\n bindTexture(td: TextureData, uniformHandle: WebGLUniformLocation, position: number): void {\n this.glContext.bindTextureToUniform(td.texture, position, uniformHandle);\n }\n getAttribLocations(program: WebGLProgram): Artifact.AttribLocations {\n return {\n position: this.getAttribLocation(program, 'position'),\n textureCoord: this.getAttribLocation(program, 'textureCoord')\n };\n }\n getUniformLocations(program: WebGLProgram, samplers?: string[], variables?: VariableInfo[]):\n Artifact.UniformLocations {\n const uniformLocations: Artifact.UniformLocations = [];\n if (samplers) {\n for (const sampler of samplers) {\n uniformLocations.push({name: sampler, type: 'sampler2D', location: this.getUniformLocation(program, sampler)});\n }\n }\n if (variables) {\n for (const variable of variables) {\n uniformLocations.push({...variable, location: this.getUniformLocation(program, variable.name)});\n }\n }\n return uniformLocations;\n }\n getUniformLocation(program: WebGLProgram, name: string): WebGLUniformLocation {\n const gl = this.glContext.gl;\n const reference = gl.getUniformLocation(program, name);\n if (reference === null) {\n throw new Error(`Uniform ${name} not found.`);\n }\n return reference;\n }\n getAttribLocation(program: WebGLProgram, name: string): number {\n const gl = this.glContext.gl;\n const attributeLocation: number = gl.getAttribLocation(program, name);\n return attributeLocation;\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Logger, Profiler} from '../../instrument';\nimport {Tensor} from '../../tensor';\n\nimport {Encoder, EncoderUsage} from './texture-data-encoder';\nimport {TextureLayoutStrategy} from './texture-layout-strategy';\nimport {TextureData, TextureLayout} from './types';\nimport {WebGLContext} from './webgl-context';\n\nexport interface TextureManagerConfig {\n reuseTextures?: boolean;\n}\n\n/**\n * TextureManager is the mainly responsible for caching Textures\n * Textures are cached in 2 levels:\n * 1. the texures which are associated with a dataId (from Tensor)\n * Caching these is crucial to performance. These are In-use Textures\n * 2. textures which are not in use by any current ProgramInfo/Tensor\n * These are called Free Textures\n * TextureManager is also used to help creating textures. For this it\n * uses WebGLContext and TextureLayoutStrategy\n */\nexport class TextureManager {\n private readonly inUseTextures: Map;\n private readonly idleTextures: Map;\n private readonly textureLookup: Map;\n private readonly pendingRead: Map void>> = new Map();\n\n constructor(\n public glContext: WebGLContext, public layoutStrategy: TextureLayoutStrategy, public profiler: Readonly,\n private config: TextureManagerConfig) {\n if (config.reuseTextures) {\n this.inUseTextures = new Map();\n this.idleTextures = new Map();\n this.textureLookup = new Map();\n }\n }\n createTextureFromLayout(\n dataType: Tensor.DataType, layout: TextureLayout, data?: Tensor.NumberType, usage?: EncoderUsage) {\n const textureDataType = this.toEncoderType(dataType);\n\n const encoder = this.glContext.getEncoder(textureDataType, layout.channels || 1, usage);\n if (layout.isPacked && usage === EncoderUsage.UploadOnly) {\n throw new Error('not implemented');\n }\n const width = layout.width;\n const height = layout.height;\n\n let key: string|undefined;\n let inUseTextures: WebGLTexture[]|undefined;\n if (this.config.reuseTextures) {\n key = `${width}x${height}_${encoder.format}_${encoder.internalFormat}_${encoder.textureType}`;\n inUseTextures = this.inUseTextures.get(key);\n if (!inUseTextures) {\n inUseTextures = [];\n this.inUseTextures.set(key, inUseTextures);\n }\n\n const idleTextures = this.idleTextures.get(key);\n if (idleTextures && idleTextures.length > 0) {\n const texture = idleTextures.pop()!;\n inUseTextures.push(texture);\n if (usage === EncoderUsage.UploadOnly) {\n this.glContext.updateTexture(texture, width, height, encoder, this.toTextureData(dataType, data)!);\n }\n return texture;\n }\n }\n\n Logger.verbose('TextureManager', `Creating new texture of size ${layout.width}x${layout.height}`);\n const texture = this.glContext.allocateTexture(width, height, encoder, this.toTextureData(dataType, data));\n\n if (this.config.reuseTextures) {\n inUseTextures!.push(texture);\n this.textureLookup.set(texture, key!);\n }\n return texture;\n }\n readTexture(td: TextureData, dataType: Tensor.DataType, channels?: number): Tensor.NumberType {\n if (!channels) {\n channels = 1;\n }\n return this.profiler.event('backend', 'TextureManager.readTexture', () => {\n const dataSize = td.shape.reduce((a, b) => a * b) * channels!;\n const data = this.glContext.readTexture(\n td.texture, td.width, td.height, dataSize, this.toEncoderType(dataType), channels!);\n return this.toTensorData(dataType, data);\n });\n }\n async readTextureAsync(td: TextureData, dataType: Tensor.DataType, channels?: number): Promise {\n const dataId = td.tensor.dataId;\n if (!channels) {\n channels = 1;\n }\n if (this.pendingRead.has(dataId)) {\n const subscribers = this.pendingRead.get(dataId);\n return new Promise(resolve => subscribers?.push(resolve));\n }\n return this.profiler.event('backend', 'TextureManager.readTextureAsync', async () => {\n this.pendingRead.set(dataId, []);\n const dataSize = td.shape.reduce((a, b) => a * b) * channels!;\n // add a fence waiting for the data to be ready\n await this.glContext.createAndWaitForFence();\n const data = this.glContext.readTexture(\n td.texture, td.width, td.height, dataSize, this.toEncoderType(dataType), channels!);\n const tensorData = this.toTensorData(dataType, data);\n const subscribers = this.pendingRead.get(dataId);\n this.pendingRead.delete(dataId);\n subscribers?.forEach(resolve => resolve(tensorData));\n return tensorData;\n });\n }\n readUint8TextureAsFloat(td: TextureData): Float32Array {\n return this.profiler.event('backend', 'TextureManager.readUint8TextureAsFloat', () => {\n const dataSize = td.shape.reduce((a, b) => a * b);\n const data = this.glContext.readTexture(td.texture, td.width, td.height, dataSize * 4, 'byte', 4);\n return new Float32Array(data.buffer, data.byteOffset, dataSize);\n });\n }\n releaseTexture(textureData: TextureData, deleteTexture?: boolean): void {\n let key: string|undefined;\n if (this.config.reuseTextures) {\n key = this.textureLookup.get(textureData.texture);\n if (key) {\n if (deleteTexture) {\n this.textureLookup.delete(key);\n }\n const inUseTextures = this.inUseTextures.get(key);\n if (inUseTextures) {\n const index = inUseTextures.indexOf(textureData.texture);\n if (index !== -1) {\n inUseTextures.splice(index, 1);\n let idleTextures = this.idleTextures.get(key);\n if (!idleTextures) {\n idleTextures = [];\n this.idleTextures.set(key, idleTextures);\n }\n idleTextures.push(textureData.texture);\n }\n }\n }\n }\n\n if (!key || deleteTexture) {\n Logger.verbose('TextureManager', `Deleting texture of size ${textureData.width}x${textureData.height}`);\n this.glContext.deleteTexture(textureData.texture);\n }\n }\n toTensorData(dataType: Tensor.DataType, data: Encoder.DataArrayType): Tensor.NumberType {\n switch (dataType) {\n case 'int16':\n return data instanceof Int16Array ? data : Int16Array.from(data);\n case 'int32':\n return data instanceof Int32Array ? data : Int32Array.from(data);\n case 'int8':\n return data instanceof Int8Array ? data : Int8Array.from(data);\n case 'uint16':\n return data instanceof Uint16Array ? data : Uint16Array.from(data);\n case 'uint32':\n return data instanceof Uint32Array ? data : Uint32Array.from(data);\n case 'uint8':\n case 'bool':\n return data instanceof Uint8Array ? data : Uint8Array.from(data);\n case 'float32':\n return data instanceof Float32Array ? data : Float32Array.from(data);\n case 'float64':\n return data instanceof Float64Array ? data : Float64Array.from(data);\n default:\n throw new Error(`TensorData type ${dataType} is not supported`);\n }\n }\n toTextureData(_dataType: Tensor.DataType, data: Tensor.NumberType|undefined): Encoder.DataArrayType|undefined {\n if (!data) {\n return undefined;\n }\n return (data instanceof Float32Array) ? data : new Float32Array(data);\n /*\n switch (dataType) {\n case 'int16':\n case 'int32':\n case 'uint16':\n case 'uint32':\n return (data.constructor === Uint32Array) ? data as Uint32Array : new Uint32Array(data);\n case 'int8':\n case 'uint8':\n case 'bool':\n return (data.constructor === Uint8Array) ? data as Uint8Array : new Uint8Array(data);\n case 'float32':\n case 'float64':\n return (data.constructor === Float32Array) ? data as Float32Array : new Float32Array(data);\n default:\n throw new Error(`TensorData type ${dataType} is not supported`);\n }\n */\n }\n toEncoderType(_dataType: Tensor.DataType): Encoder.DataType {\n return 'float';\n // switch (dataType) {\n // case 'int16':\n // case 'int32':\n // case 'uint16':\n // case 'uint32':\n // return 'int';\n // case 'uint8':\n // case 'bool':\n // return 'byte';\n // case 'float32':\n // case 'float64':\n // return 'float';\n // default:\n // throw new Error(`TensorData type ${dataType} is not supported`);\n // }\n }\n clearActiveTextures(): void {\n this.glContext.clearActiveTextures();\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {SessionHandler} from '../../backend';\nimport {Graph} from '../../graph';\nimport {Logger} from '../../instrument';\nimport {Operator} from '../../operators';\nimport {OpSet, resolveOperator} from '../../opset';\nimport {Session} from '../../session';\nimport {Tensor} from '../../tensor';\nimport {WebGLBackend} from '../backend-webgl';\n\nimport {WebGLInferenceHandler} from './inference-handler';\nimport {WEBGL_OP_RESOLVE_RULES} from './op-resolve-rules';\nimport {ProgramManager} from './program-manager';\nimport {PreferLogicalStrategy, TextureLayoutStrategy} from './texture-layout-strategy';\nimport {TextureManager} from './texture-manager';\nimport {TextureData} from './types';\n\nexport class WebGLSessionHandler implements SessionHandler {\n programManager: ProgramManager;\n textureManager: TextureManager;\n layoutStrategy: TextureLayoutStrategy;\n packedTextureDataCache: Map;\n unpackedTextureDataCache: Map;\n pack2unpackMap: Map;\n unpack2packMap: Map;\n initializers: Set;\n pack?: boolean;\n\n constructor(public readonly backend: WebGLBackend, public readonly context: Session.Context) {\n this.layoutStrategy = new PreferLogicalStrategy(backend.glContext.maxTextureSize);\n this.programManager = new ProgramManager(this.context.profiler, backend.glContext, this.layoutStrategy);\n this.textureManager = new TextureManager(\n backend.glContext, this.layoutStrategy, this.context.profiler,\n {reuseTextures: backend.textureCacheMode === 'full'});\n this.packedTextureDataCache = new Map();\n this.unpackedTextureDataCache = new Map();\n this.pack = backend.pack;\n this.pack2unpackMap = new Map();\n this.unpack2packMap = new Map();\n }\n\n createInferenceHandler() {\n return new WebGLInferenceHandler(this);\n }\n onGraphInitialized(graph: Graph): void {\n const initializers = graph.getValues().filter(v => v.from === -1 && v.tensor).map(v => v.tensor!.dataId);\n this.initializers = new Set(initializers);\n }\n isInitializer(tensorId: Tensor.Id): boolean {\n return this.initializers ? this.initializers.has(tensorId) : false;\n }\n addInitializer(tensorId: Tensor.Id): void {\n this.initializers.add(tensorId);\n }\n getTextureData(tensorId: Tensor.Id, isPacked: boolean): TextureData|undefined {\n if (isPacked) {\n return this.packedTextureDataCache.get(tensorId);\n } else {\n return this.unpackedTextureDataCache.get(tensorId);\n }\n }\n setTextureData(tensorId: Tensor.Id, textureData: TextureData, isPacked = false): void {\n Logger.verbose('WebGLSessionHandler', 'Storing Texture data in cache');\n if (isPacked) {\n this.packedTextureDataCache.set(tensorId, textureData);\n } else {\n this.unpackedTextureDataCache.set(tensorId, textureData);\n }\n }\n dispose(): void {\n this.programManager.dispose();\n this.textureManager.clearActiveTextures();\n this.packedTextureDataCache.forEach(td => this.textureManager.releaseTexture(td, true));\n this.packedTextureDataCache = new Map();\n this.unpackedTextureDataCache.forEach(td => this.textureManager.releaseTexture(td, true));\n this.unpackedTextureDataCache = new Map();\n }\n resolve(node: Graph.Node, opsets: readonly OpSet[], graph: Graph): Operator {\n const op = resolveOperator(node, opsets, WEBGL_OP_RESOLVE_RULES);\n return {impl: op.opImpl, context: op.opInit ? op.opInit(node, graph) : node};\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport * as DataEncoders from './texture-data-encoder';\nimport {DataEncoder, Encoder, EncoderUsage} from './texture-data-encoder';\nimport {repeatedTry} from './utils';\n\nexport interface FenceContext {\n query: WebGLSync|null;\n isFencePassed(): boolean;\n}\n\ntype PollItem = {\n isDoneFn: () => boolean; resolveFn: () => void;\n};\n\nexport function linearSearchLastTrue(arr: Array<() => boolean>): number {\n let i = 0;\n for (; i < arr.length; ++i) {\n const isDone = arr[i]();\n if (!isDone) {\n break;\n }\n }\n return i - 1;\n}\n\n/**\n * Abstraction and wrapper around WebGLRenderingContext and its operations\n */\nexport class WebGLContext {\n gl: WebGLRenderingContext;\n version: 1|2;\n\n private vertexbuffer: WebGLBuffer;\n private framebuffer: WebGLFramebuffer;\n\n // WebGL flags and vital parameters\n private isFloatTextureAttachableToFrameBuffer: boolean;\n isFloat32DownloadSupported: boolean;\n isRenderFloat32Supported: boolean;\n isBlendSupported: boolean;\n maxTextureSize: number;\n // private maxCombinedTextureImageUnits: number;\n private maxTextureImageUnits: number;\n // private maxCubeMapTextureSize: number;\n // private shadingLanguageVersion: string;\n // private webglVendor: string;\n // private webglVersion: string;\n\n // WebGL2 flags and vital parameters\n // private max3DTextureSize: number;\n // private maxArrayTextureLayers: number;\n // private maxColorAttachments: number;\n // private maxDrawBuffers: number;\n\n // WebGL extensions\n // eslint-disable-next-line camelcase\n textureFloatExtension: OES_texture_float|null;\n // eslint-disable-next-line camelcase\n textureHalfFloatExtension: OES_texture_half_float|null;\n\n // WebGL2 extensions\n colorBufferFloatExtension: unknown|null;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n disjointTimerQueryWebgl2Extension: {TIME_ELAPSED_EXT: GLenum; GPU_DISJOINT_EXT: GLenum}|null;\n\n private disposed: boolean;\n private frameBufferBound = false;\n\n constructor(gl: WebGLRenderingContext, version: 1|2) {\n this.gl = gl;\n this.version = version;\n\n this.getExtensions();\n this.vertexbuffer = this.createVertexbuffer();\n this.framebuffer = this.createFramebuffer();\n this.queryVitalParameters();\n }\n\n allocateTexture(width: number, height: number, encoder: DataEncoder, data?: Encoder.DataArrayType): WebGLTexture {\n const gl = this.gl;\n // create the texture\n const texture = gl.createTexture();\n // bind the texture so the following methods effect this texture.\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n const buffer = data ? encoder.encode(data, width * height) : null;\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0, // Level of detail.\n encoder.internalFormat, width, height,\n 0, // Always 0 in OpenGL ES.\n encoder.format, encoder.textureType, buffer);\n this.checkError();\n return texture as WebGLTexture;\n }\n updateTexture(\n texture: WebGLTexture, width: number, height: number, encoder: DataEncoder, data: Encoder.DataArrayType): void {\n const gl = this.gl;\n gl.bindTexture(gl.TEXTURE_2D, texture);\n const buffer = encoder.encode(data, width * height);\n gl.texSubImage2D(\n gl.TEXTURE_2D,\n 0, // level\n 0, // xoffset\n 0, // yoffset\n width, height, encoder.format, encoder.textureType, buffer);\n this.checkError();\n }\n attachFramebuffer(texture: WebGLTexture, width: number, height: number): void {\n const gl = this.gl;\n // Make it the target for framebuffer operations - including rendering.\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture,\n 0); // 0, we aren't using MIPMAPs\n this.checkError();\n gl.viewport(0, 0, width, height);\n gl.scissor(0, 0, width, height);\n }\n readTexture(\n texture: WebGLTexture, width: number, height: number, dataSize: number, dataType: Encoder.DataType,\n channels: number): Encoder.DataArrayType {\n const gl = this.gl;\n if (!channels) {\n channels = 1;\n }\n if (!this.frameBufferBound) {\n this.attachFramebuffer(texture, width, height);\n }\n const encoder = this.getEncoder(dataType, channels);\n const buffer = encoder.allocate(width * height);\n // bind texture to framebuffer\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.framebufferTexture2D(\n gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture,\n 0); // 0, we aren't using MIPMAPs\n // TODO: Check if framebuffer is ready\n gl.readPixels(0, 0, width, height, gl.RGBA, encoder.textureType, buffer);\n this.checkError();\n // unbind FB\n return encoder.decode(buffer, dataSize);\n }\n\n isFramebufferReady(): boolean {\n // TODO: Implement logic to check if the framebuffer is ready\n return true;\n }\n getActiveTexture(): string {\n const gl = this.gl;\n const n = gl.getParameter(this.gl.ACTIVE_TEXTURE);\n return `TEXTURE${(n - gl.TEXTURE0)}`;\n }\n getTextureBinding(): WebGLTexture {\n return this.gl.getParameter(this.gl.TEXTURE_BINDING_2D);\n }\n getFramebufferBinding(): WebGLFramebuffer {\n return this.gl.getParameter(this.gl.FRAMEBUFFER_BINDING);\n }\n setVertexAttributes(positionHandle: number, textureCoordHandle: number): void {\n const gl = this.gl;\n gl.vertexAttribPointer(positionHandle, 3, gl.FLOAT, false, 20, 0);\n gl.enableVertexAttribArray(positionHandle);\n if (textureCoordHandle !== -1) {\n gl.vertexAttribPointer(textureCoordHandle, 2, gl.FLOAT, false, 20, 12);\n gl.enableVertexAttribArray(textureCoordHandle);\n }\n this.checkError();\n }\n createProgram(\n vertexShader: WebGLShader,\n fragShader: WebGLShader,\n ): WebGLProgram {\n const gl = this.gl;\n const program = gl.createProgram()!;\n\n // the program consists of our shaders\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragShader);\n gl.linkProgram(program);\n return program;\n }\n compileShader(shaderSource: string, shaderType: number): WebGLShader {\n const gl = this.gl;\n const shader = gl.createShader(shaderType);\n if (!shader) {\n throw new Error(`createShader() returned null with type ${shaderType}`);\n }\n\n gl.shaderSource(shader, shaderSource);\n gl.compileShader(shader);\n if (gl.getShaderParameter(shader, gl.COMPILE_STATUS) === false) {\n throw new Error(`Failed to compile shader: ${gl.getShaderInfoLog(shader)}\nShader source:\n${shaderSource}`);\n }\n return shader;\n }\n deleteShader(shader: WebGLShader): void {\n this.gl.deleteShader(shader);\n }\n bindTextureToUniform(texture: WebGLTexture, position: number, uniformHandle: WebGLUniformLocation): void {\n const gl = this.gl;\n gl.activeTexture(gl.TEXTURE0 + position);\n this.checkError();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n this.checkError();\n gl.uniform1i(uniformHandle, position);\n this.checkError();\n }\n draw(): void {\n this.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);\n this.checkError();\n }\n checkError(): void {\n if (env.debug) {\n const gl = this.gl;\n const error = gl.getError();\n let label = '';\n switch (error) {\n case (gl.NO_ERROR):\n return;\n case (gl.INVALID_ENUM):\n label = 'INVALID_ENUM';\n break;\n case (gl.INVALID_VALUE):\n label = 'INVALID_VALUE';\n break;\n case (gl.INVALID_OPERATION):\n label = 'INVALID_OPERATION';\n break;\n case (gl.INVALID_FRAMEBUFFER_OPERATION):\n label = 'INVALID_FRAMEBUFFER_OPERATION';\n break;\n case (gl.OUT_OF_MEMORY):\n label = 'OUT_OF_MEMORY';\n break;\n case (gl.CONTEXT_LOST_WEBGL):\n label = 'CONTEXT_LOST_WEBGL';\n break;\n default:\n label = `Unknown WebGL Error: ${error.toString(16)}`;\n }\n throw new Error(label);\n }\n }\n deleteTexture(texture: WebGLTexture): void {\n this.gl.deleteTexture(texture);\n }\n deleteProgram(program: WebGLProgram): void {\n this.gl.deleteProgram(program);\n }\n getEncoder(dataType: Encoder.DataType, channels: number, usage: EncoderUsage = EncoderUsage.Default): DataEncoder {\n if (this.version === 2) {\n return new DataEncoders.RedFloat32DataEncoder(this.gl as WebGL2RenderingContext, channels);\n }\n\n switch (dataType) {\n case 'float':\n if (usage === EncoderUsage.UploadOnly || this.isRenderFloat32Supported) {\n return new DataEncoders.RGBAFloatDataEncoder(this.gl, channels);\n } else {\n return new DataEncoders.RGBAFloatDataEncoder(\n this.gl, channels, this.textureHalfFloatExtension!.HALF_FLOAT_OES);\n }\n case 'int':\n throw new Error('not implemented');\n case 'byte':\n return new DataEncoders.Uint8DataEncoder(this.gl, channels);\n default:\n throw new Error(`Invalid dataType: ${dataType}`);\n }\n }\n clearActiveTextures(): void {\n const gl = this.gl;\n for (let unit = 0; unit < this.maxTextureImageUnits; ++unit) {\n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n }\n dispose(): void {\n if (this.disposed) {\n return;\n }\n const gl = this.gl;\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteFramebuffer(this.framebuffer);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n gl.deleteBuffer(this.vertexbuffer);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);\n gl.finish();\n this.disposed = true;\n }\n\n private createDefaultGeometry(): Float32Array {\n // Sets of x,y,z(=0),s,t coordinates.\n return new Float32Array([\n -1.0, 1.0, 0.0, 0.0, 1.0, // upper left\n -1.0, -1.0, 0.0, 0.0, 0.0, // lower left\n 1.0, 1.0, 0.0, 1.0, 1.0, // upper right\n 1.0, -1.0, 0.0, 1.0, 0.0 // lower right\n ]);\n }\n private createVertexbuffer(): WebGLBuffer {\n const gl = this.gl;\n const buffer = gl.createBuffer();\n if (!buffer) {\n throw new Error('createBuffer() returned null');\n }\n const geometry = this.createDefaultGeometry();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, geometry, gl.STATIC_DRAW);\n this.checkError();\n return buffer;\n }\n private createFramebuffer(): WebGLFramebuffer {\n const fb = this.gl.createFramebuffer();\n if (!fb) {\n throw new Error('createFramebuffer returned null');\n }\n return fb;\n }\n\n private queryVitalParameters(): void {\n const gl = this.gl;\n\n this.isFloatTextureAttachableToFrameBuffer = this.checkFloatTextureAttachableToFrameBuffer();\n this.isRenderFloat32Supported = this.checkRenderFloat32();\n this.isFloat32DownloadSupported = this.checkFloat32Download();\n\n if (this.version === 1 && !this.textureHalfFloatExtension && !this.isRenderFloat32Supported) {\n throw new Error('both float32 and float16 TextureType are not supported');\n }\n\n this.isBlendSupported = !this.isRenderFloat32Supported || this.checkFloat32Blend();\n\n // this.maxCombinedTextureImageUnits = gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS);\n this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n this.maxTextureImageUnits = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n // this.maxCubeMapTextureSize = gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);\n // this.shadingLanguageVersion = gl.getParameter(gl.SHADING_LANGUAGE_VERSION);\n // this.webglVendor = gl.getParameter(gl.VENDOR);\n // this.webglVersion = gl.getParameter(gl.VERSION);\n\n if (this.version === 2) {\n // this.max3DTextureSize = gl.getParameter(WebGL2RenderingContext.MAX_3D_TEXTURE_SIZE);\n // this.maxArrayTextureLayers = gl.getParameter(WebGL2RenderingContext.MAX_ARRAY_TEXTURE_LAYERS);\n // this.maxColorAttachments = gl.getParameter(WebGL2RenderingContext.MAX_COLOR_ATTACHMENTS);\n // this.maxDrawBuffers = gl.getParameter(WebGL2RenderingContext.MAX_DRAW_BUFFERS);\n }\n }\n private getExtensions(): void {\n if (this.version === 2) {\n this.colorBufferFloatExtension = this.gl.getExtension('EXT_color_buffer_float');\n this.disjointTimerQueryWebgl2Extension = this.gl.getExtension('EXT_disjoint_timer_query_webgl2');\n } else {\n this.textureFloatExtension = this.gl.getExtension('OES_texture_float');\n this.textureHalfFloatExtension = this.gl.getExtension('OES_texture_half_float');\n }\n }\n\n private checkFloatTextureAttachableToFrameBuffer(): boolean {\n // test whether Float32 texture is supported:\n // STEP.1 create a float texture\n const gl = this.gl;\n const texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const internalFormat = this.version === 2 ? (gl as unknown as {RGBA32F: number}).RGBA32F : gl.RGBA;\n gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, 1, 1, 0, gl.RGBA, gl.FLOAT, null);\n // STEP.2 bind a frame buffer\n const frameBuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n // STEP.3 attach texture to framebuffer\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n // STEP.4 test whether framebuffer is complete\n const isComplete = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteTexture(texture);\n gl.deleteFramebuffer(frameBuffer);\n return isComplete;\n }\n\n private checkRenderFloat32(): boolean {\n if (this.version === 2) {\n if (!this.colorBufferFloatExtension) {\n return false;\n }\n } else {\n if (!this.textureFloatExtension) {\n return false;\n }\n }\n return this.isFloatTextureAttachableToFrameBuffer;\n }\n\n private checkFloat32Download(): boolean {\n if (this.version === 2) {\n if (!this.colorBufferFloatExtension) {\n return false;\n }\n } else {\n if (!this.textureFloatExtension) {\n return false;\n }\n if (!this.gl.getExtension('WEBGL_color_buffer_float')) {\n return false;\n }\n }\n return this.isFloatTextureAttachableToFrameBuffer;\n }\n\n /**\n * Check whether GL_BLEND is supported\n */\n private checkFloat32Blend(): boolean {\n // it looks like currently (2019-05-08) there is no easy way to detect whether BLEND is supported\n // https://github.com/microsoft/onnxjs/issues/145\n\n const gl = this.gl;\n\n let texture: WebGLTexture|null|undefined;\n let frameBuffer: WebGLFramebuffer|null|undefined;\n let vertexShader: WebGLShader|null|undefined;\n let fragmentShader: WebGLShader|null|undefined;\n let program: WebGLProgram|null|undefined;\n\n try {\n texture = gl.createTexture();\n frameBuffer = gl.createFramebuffer();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const internalFormat = this.version === 2 ? (gl as unknown as {RGBA32F: number}).RGBA32F : gl.RGBA;\n gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, 1, 1, 0, gl.RGBA, gl.FLOAT, null);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n\n gl.enable(gl.BLEND);\n\n vertexShader = gl.createShader(gl.VERTEX_SHADER);\n if (!vertexShader) {\n return false;\n }\n gl.shaderSource(vertexShader, 'void main(){}');\n gl.compileShader(vertexShader);\n\n fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n if (!fragmentShader) {\n return false;\n }\n gl.shaderSource(fragmentShader, 'precision highp float;void main(){gl_FragColor=vec4(0.5);}');\n gl.compileShader(fragmentShader);\n\n program = gl.createProgram();\n if (!program) {\n return false;\n }\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n gl.useProgram(program);\n\n gl.drawArrays(gl.POINTS, 0, 1);\n return gl.getError() === gl.NO_ERROR;\n\n } finally {\n gl.disable(gl.BLEND);\n\n if (program) {\n gl.deleteProgram(program);\n }\n if (vertexShader) {\n gl.deleteShader(vertexShader);\n }\n if (fragmentShader) {\n gl.deleteShader(fragmentShader);\n }\n if (frameBuffer) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteFramebuffer(frameBuffer);\n }\n if (texture) {\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(texture);\n }\n }\n }\n\n beginTimer(): WebGLQuery {\n if (this.version === 2 && this.disjointTimerQueryWebgl2Extension) {\n const gl2 = this.gl as WebGL2RenderingContext;\n const ext = this.disjointTimerQueryWebgl2Extension;\n\n const query = gl2.createQuery() as WebGLQuery;\n gl2.beginQuery(ext.TIME_ELAPSED_EXT, query);\n return query;\n } else {\n // TODO: add webgl 1 handling.\n throw new Error('WebGL1 profiling currently not supported.');\n }\n }\n\n endTimer() {\n if (this.version === 2 && this.disjointTimerQueryWebgl2Extension) {\n const gl2 = this.gl as WebGL2RenderingContext;\n const ext = this.disjointTimerQueryWebgl2Extension;\n gl2.endQuery(ext.TIME_ELAPSED_EXT);\n return;\n } else {\n // TODO: add webgl 1 handling.\n throw new Error('WebGL1 profiling currently not supported');\n }\n }\n\n isTimerResultAvailable(query: WebGLQuery): boolean {\n let available = false, disjoint = false;\n if (this.version === 2 && this.disjointTimerQueryWebgl2Extension) {\n const gl2 = this.gl as WebGL2RenderingContext;\n const ext = this.disjointTimerQueryWebgl2Extension;\n\n available = gl2.getQueryParameter(query, gl2.QUERY_RESULT_AVAILABLE);\n disjoint = gl2.getParameter(ext.GPU_DISJOINT_EXT);\n } else {\n // TODO: add webgl 1 handling.\n throw new Error('WebGL1 profiling currently not supported');\n }\n\n return available && !disjoint;\n }\n\n getTimerResult(query: WebGLQuery): number {\n let timeElapsed = 0;\n if (this.version === 2) {\n const gl2 = this.gl as WebGL2RenderingContext;\n timeElapsed = gl2.getQueryParameter(query, gl2.QUERY_RESULT);\n gl2.deleteQuery(query);\n } else {\n // TODO: add webgl 1 handling.\n throw new Error('WebGL1 profiling currently not supported');\n }\n // return miliseconds\n return timeElapsed / 1000000;\n }\n\n async waitForQueryAndGetTime(query: WebGLQuery): Promise {\n await repeatedTry(() => this.isTimerResultAvailable(query));\n return this.getTimerResult(query);\n }\n\n public async createAndWaitForFence(): Promise {\n const fenceContext = this.createFence(this.gl);\n return this.pollFence(fenceContext);\n }\n\n private createFence(gl: WebGLRenderingContext): FenceContext {\n let isFencePassed: () => boolean;\n const gl2 = gl as WebGL2RenderingContext;\n const query = gl2.fenceSync(gl2.SYNC_GPU_COMMANDS_COMPLETE, 0);\n gl.flush();\n if (query === null) {\n isFencePassed = () => true;\n } else {\n isFencePassed = () => {\n const status = gl2.clientWaitSync(query, 0, 0);\n return status === gl2.ALREADY_SIGNALED || status === gl2.CONDITION_SATISFIED;\n };\n }\n return {query, isFencePassed};\n }\n\n async pollFence(fenceContext: FenceContext) {\n return new Promise(resolve => {\n void this.addItemToPoll(() => fenceContext.isFencePassed(), () => resolve());\n });\n }\n\n private itemsToPoll: PollItem[] = [];\n\n pollItems(): void {\n // Find the last query that has finished.\n const index = linearSearchLastTrue(this.itemsToPoll.map(x => x.isDoneFn));\n for (let i = 0; i <= index; ++i) {\n const {resolveFn} = this.itemsToPoll[i];\n resolveFn();\n }\n this.itemsToPoll = this.itemsToPoll.slice(index + 1);\n }\n\n private async addItemToPoll(isDoneFn: () => boolean, resolveFn: () => void) {\n this.itemsToPoll.push({isDoneFn, resolveFn});\n if (this.itemsToPoll.length > 1) {\n // We already have a running loop that polls.\n return;\n }\n // Start a new loop that polls.\n await repeatedTry(() => {\n this.pollItems();\n // End the loop if no more items to poll.\n return this.itemsToPoll.length === 0;\n });\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Logger} from '../../instrument';\n\nimport {WebGLContext} from './webgl-context';\n\nconst cache: {[contextId: string]: WebGLContext} = {};\n\n/**\n * This factory function creates proper WebGLRenderingContext based on\n * the current browsers capabilities\n * The order is from higher/most recent versions to most basic\n */\nexport function createWebGLContext(contextId?: 'webgl'|'webgl2'): WebGLContext {\n let context: WebGLContext|undefined;\n if ((!contextId || contextId === 'webgl2') && 'webgl2' in cache) {\n context = cache.webgl2;\n } else if ((!contextId || contextId === 'webgl') && 'webgl' in cache) {\n context = cache.webgl;\n }\n\n if (!context) {\n try {\n // try to create webgl context from an offscreen canvas\n const offscreenCanvas = createOffscreenCanvas();\n context = createNewWebGLContext(offscreenCanvas, contextId);\n } catch (e) {\n // if failed, fallback to try to use a normal canvas element\n const canvas = createCanvas();\n context = createNewWebGLContext(canvas, contextId);\n }\n }\n\n contextId = contextId || context.version === 1 ? 'webgl' : 'webgl2';\n const gl = context.gl;\n\n cache[contextId] = context;\n\n if (gl.isContextLost()) {\n delete cache[contextId];\n return createWebGLContext(contextId);\n }\n\n gl.disable(gl.DEPTH_TEST);\n gl.disable(gl.STENCIL_TEST);\n gl.disable(gl.BLEND);\n gl.disable(gl.DITHER);\n gl.disable(gl.POLYGON_OFFSET_FILL);\n gl.disable(gl.SAMPLE_COVERAGE);\n gl.enable(gl.SCISSOR_TEST);\n gl.enable(gl.CULL_FACE);\n gl.cullFace(gl.BACK);\n\n return context;\n}\n\nexport function createNewWebGLContext(canvas: HTMLCanvasElement, contextId?: 'webgl'|'webgl2'): WebGLContext {\n const contextAttributes: WebGLContextAttributes = {\n alpha: false,\n depth: false,\n antialias: false,\n stencil: false,\n preserveDrawingBuffer: false,\n premultipliedAlpha: false,\n failIfMajorPerformanceCaveat: false\n };\n let gl: WebGLRenderingContext|null;\n const ca = contextAttributes;\n if (!contextId || contextId === 'webgl2') {\n gl = canvas.getContext('webgl2', ca);\n if (gl) {\n try {\n return new WebGLContext(gl, 2);\n } catch (err) {\n Logger.warning('GlContextFactory', `failed to create WebGLContext using contextId 'webgl2'. Error: ${err}`);\n }\n }\n }\n if (!contextId || contextId === 'webgl') {\n gl = canvas.getContext('webgl', ca) || canvas.getContext('experimental-webgl', ca) as WebGLRenderingContext;\n if (gl) {\n try {\n return new WebGLContext(gl, 1);\n } catch (err) {\n Logger.warning(\n 'GlContextFactory',\n `failed to create WebGLContext using contextId 'webgl' or 'experimental-webgl'. Error: ${err}`);\n }\n }\n }\n\n throw new Error('WebGL is not supported');\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ndeclare let OffscreenCanvas: {new (width: number, height: number): HTMLCanvasElement};\n\nfunction createCanvas(): HTMLCanvasElement {\n if (typeof document === 'undefined') {\n throw new TypeError('failed to create canvas: document is not supported');\n }\n const canvas: HTMLCanvasElement = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n return canvas;\n}\n\nfunction createOffscreenCanvas(): HTMLCanvasElement {\n if (typeof OffscreenCanvas === 'undefined') {\n throw new TypeError('failed to create offscreen canvas: OffscreenCanvas is not supported');\n }\n return new OffscreenCanvas(1, 1);\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport {Backend, SessionHandler} from '../backend';\nimport {Logger} from '../instrument';\nimport {Session} from '../session';\n\nimport {WebGLSessionHandler} from './webgl/session-handler';\nimport {WebGLContext} from './webgl/webgl-context';\nimport {createWebGLContext} from './webgl/webgl-context-factory';\n\n/**\n * WebGLBackend is the entry point for all WebGL opeartions\n * When it starts it created the WebGLRenderingContext\n * and other main framework components such as Program and Texture Managers\n */\nexport class WebGLBackend implements Backend {\n glContext: WebGLContext;\n\n get contextId(): 'webgl'|'webgl2'|undefined {\n return env.webgl.contextId;\n }\n set contextId(value: 'webgl'|'webgl2'|undefined) {\n env.webgl.contextId = value;\n }\n\n get matmulMaxBatchSize(): number|undefined {\n return env.webgl.matmulMaxBatchSize;\n }\n set matmulMaxBatchSize(value: number|undefined) {\n env.webgl.matmulMaxBatchSize = value;\n }\n\n get textureCacheMode(): 'initializerOnly'|'full'|undefined {\n return env.webgl.textureCacheMode;\n }\n set textureCacheMode(value: 'initializerOnly'|'full'|undefined) {\n env.webgl.textureCacheMode = value;\n }\n\n get pack(): boolean|undefined {\n return env.webgl.pack;\n }\n set pack(value: boolean|undefined) {\n env.webgl.pack = value;\n }\n\n get async(): boolean|undefined {\n return env.webgl.async;\n }\n set async(value: boolean|undefined) {\n env.webgl.async = value;\n }\n\n initialize(): boolean {\n try {\n this.glContext = createWebGLContext(this.contextId);\n if (typeof this.matmulMaxBatchSize !== 'number') {\n this.matmulMaxBatchSize = 16;\n }\n if (typeof this.textureCacheMode !== 'string') {\n this.textureCacheMode = 'full';\n }\n if (typeof this.pack !== 'boolean') {\n this.pack = false;\n }\n if (typeof this.async !== 'boolean') {\n this.async = false;\n }\n\n Logger.setWithEnv(env);\n\n if (!env.webgl.context) {\n Object.defineProperty(env.webgl, 'context', {value: this.glContext.gl});\n }\n\n Logger.verbose(\n 'WebGLBackend',\n `Created WebGLContext: ${typeof this.glContext} with matmulMaxBatchSize: ${\n this.matmulMaxBatchSize}; textureCacheMode: ${this.textureCacheMode}; pack: ${this.pack}; async: ${\n this.async}.`);\n return true;\n } catch (e) {\n Logger.warning('WebGLBackend', `Unable to initialize WebGLBackend. ${e}`);\n return false;\n }\n }\n createSessionHandler(context: Session.Context): SessionHandler {\n return new WebGLSessionHandler(this, context);\n }\n dispose(): void {\n this.glContext.dispose();\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {WebGLBackend} from './backends/backend-webgl';\nimport {Graph} from './graph';\nimport {Operator} from './operators';\nimport {OpSet} from './opset';\nimport {Session} from './session';\n\nexport interface InferenceHandler {\n /**\n * dispose the inference handler. it will be called as the last step in Session.run()\n */\n dispose(): void;\n}\n\nexport interface SessionHandler {\n /**\n * transform the graph at initialization time\n * @param graphTransformer the graph transformer to manipulate the model graph\n */\n transformGraph?(graphTransformer: Graph.Transformer): void;\n\n /**\n * create an instance of InferenceHandler to use in a Session.run() call\n */\n createInferenceHandler(): InferenceHandler;\n\n /**\n * dispose the session handler. it will be called when a session is being disposed explicitly\n */\n dispose(): void;\n\n /**\n * Resolves the operator from the name and opset version; backend specific\n * @param node the node to resolve\n * @param opsets a list of opsets that exported from the model\n * @param graph the completely initialized graph\n */\n resolve(node: Graph.Node, opsets: readonly OpSet[], graph: Graph): Operator;\n\n /**\n * This method let's the sessionHandler know that the graph initialization is complete\n * @param graph the completely initialized graph\n */\n onGraphInitialized?(graph: Graph): void;\n\n /**\n * a reference to the corresponding backend\n */\n readonly backend: Backend;\n\n /**\n * a reference to the session context\n */\n readonly context: Session.Context;\n}\n\nexport interface Backend {\n /**\n * initialize the backend. will be called only once, when the first time the\n * backend it to be used\n */\n initialize(): boolean|Promise;\n\n /**\n * create an instance of SessionHandler to use in a Session object's lifecycle\n */\n createSessionHandler(context: Session.Context): SessionHandler;\n\n /**\n * dispose the backend. currently this will not be called\n */\n dispose(): void;\n}\n\n// caches all initialized backend instances\nconst backendsCache: Map = new Map();\n\nexport const backend: {[name: string]: Backend} = {\n webgl: new WebGLBackend()\n};\n\n/**\n * Resolve a reference to the backend. If a hint is specified, the corresponding\n * backend will be used.\n */\nexport async function resolveBackend(hint?: string|readonly string[]): Promise {\n if (!hint) {\n return resolveBackend(['webgl']);\n } else {\n const hints = typeof hint === 'string' ? [hint] : hint;\n\n for (const backendHint of hints) {\n const cache = backendsCache.get(backendHint);\n if (cache) {\n return cache;\n }\n\n const backend = await tryLoadBackend(backendHint);\n if (backend) {\n return backend;\n }\n }\n }\n\n throw new Error('no available backend to use');\n}\n\nasync function tryLoadBackend(backendHint: string): Promise {\n const backendObj = backend;\n\n if (typeof backendObj[backendHint] !== 'undefined' && isBackend(backendObj[backendHint])) {\n const backend = backendObj[backendHint];\n let init = backend.initialize();\n if (typeof init === 'object' && 'then' in init) {\n init = await init;\n }\n if (init) {\n backendsCache.set(backendHint, backend);\n return backend;\n }\n }\n\n return undefined;\n}\n\nfunction isBackend(obj: unknown) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const o = obj as any;\n\n // check if an object is a Backend instance\n if (\n 'initialize' in o && typeof o.initialize === 'function' && // initialize()\n 'createSessionHandler' in o && typeof o.createSessionHandler === 'function' && // createSessionHandler()\n 'dispose' in o && typeof o.dispose === 'function' // dispose()\n ) {\n return true;\n }\n\n return false;\n}\n\nexport type BackendType = Backend;\nexport type SessionHandlerType = ReturnType;\nexport type InferenceHandlerType = ReturnType;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {SessionHandler} from './backend';\nimport {Graph} from './graph';\nimport {Logger, Profiler} from './instrument';\nimport {Operator} from './operators';\nimport {Tensor} from './tensor';\n\nclass KernelOp {\n constructor(public op: Operator, public node: Graph.Node) {}\n}\n\nexport class ExecutionPlan {\n constructor(private graph: Graph, ops: Operator[], private profiler: Readonly) {\n this.initialize(ops);\n }\n\n initialize(ops: Operator[]) {\n this.profiler.event('session', 'ExecutionPlan.initialize', () => {\n const graphNodes = this.graph.getNodes();\n if (graphNodes.length !== ops.length) {\n throw new Error('The size of nodes and OPs do not match.');\n }\n\n this._ops = ops.map((op, i) => new KernelOp(op, graphNodes[i]));\n this.reset();\n\n // look for starter node(s)\n this._starter = [];\n this._ops.forEach((op, i) => {\n let resolved = true;\n for (const input of op.node.inputs) {\n if (\n !this._values[input] // not an initialized input\n && this.graph.getInputIndices().indexOf(input) === -1 // not model input\n ) {\n resolved = false;\n break;\n }\n }\n if (resolved) {\n this._starter.push(i);\n }\n });\n });\n }\n\n reset() {\n this._values = this.graph.getValues().map(i => i.tensor);\n }\n\n async execute(sessionHandler: SessionHandler, modelInputs: Tensor[]): Promise {\n return this.profiler.event('session', 'ExecutionPlan.execute', async () => {\n // reset mediem result\n this.reset();\n\n // create inference handler\n const inferenceHandler = sessionHandler.createInferenceHandler();\n\n // populate inputs value\n const graphInputs = this.graph.getInputIndices();\n if (modelInputs.length !== graphInputs.length) {\n throw new Error(`number of input tensors don't match the number of inputs to the model: actual: ${\n modelInputs.length} expected: ${graphInputs.length}`);\n }\n\n modelInputs.forEach((input, i) => {\n const index = graphInputs[i];\n this._values[index] = input;\n });\n\n // prepare running sequence\n const sequence: number[] = this._starter.slice(0);\n\n // execution iterations\n const graphValues = this.graph.getValues();\n const graphNodes = this.graph.getNodes();\n\n let rear = 0;\n while (rear < sequence.length) {\n const thisOpIndex = sequence[rear++];\n const thisOp = this._ops[thisOpIndex];\n\n // check input\n const inputList = thisOp.node.inputs.map(i => this._values[i]);\n if (inputList.indexOf(undefined) !== -1) {\n throw new Error(`unresolved input detected: op: ${thisOp.node}`);\n }\n\n // run\n const inputTensors = inputList as Tensor[];\n Logger.verbose(\n 'ExecPlan',\n `Running op:${thisOp.node.name} (${\n inputTensors.map((t, i) => `'${thisOp.node.inputs[i]}': ${t.type}[${t.dims.join(',')}]`).join(', ')})`);\n\n const outputList = await this.profiler.event(\n 'node', thisOp.node.name, async () => thisOp.op.impl(inferenceHandler, inputTensors, thisOp.op.context));\n\n // check output\n if (outputList.length !== thisOp.node.outputs.length) {\n throw new Error('the size of output does not match model definition.');\n }\n\n // fill value\n outputList.forEach((output, i) => {\n const j = thisOp.node.outputs[i];\n if (this._values[j]) {\n throw new Error(`output [${j}] already has value: op:${thisOp.node.name}`);\n }\n this._values[j] = output;\n });\n\n // resolve downstream nodes\n const downstreamNodes = new Set();\n outputList.forEach((_output, i) => {\n const j = thisOp.node.outputs[i];\n for (const currentDownstreamNodeIndex of graphValues[j].to) {\n const currentDownstreamNode = graphNodes[currentDownstreamNodeIndex];\n let resolved = true;\n for (const k of currentDownstreamNode.inputs) {\n if (!this._values[k]) {\n resolved = false;\n break;\n }\n }\n if (resolved) {\n downstreamNodes.add(currentDownstreamNodeIndex);\n }\n }\n });\n sequence.push(...downstreamNodes);\n }\n\n const output: Tensor[] = [];\n for (let i = 0; i < this.graph.getOutputIndices().length; i++) {\n const outputIndex = this.graph.getOutputIndices()[i];\n const outputTensor = this._values[outputIndex];\n if (outputTensor === undefined) {\n throw new Error(`required output [${outputIndex}] does not have value`);\n }\n if (outputIndex === 0) {\n await outputTensor.getData();\n } else {\n // eslint-disable-next-line no-unused-expressions\n outputTensor.data;\n }\n output.push(outputTensor);\n }\n Logger.verbose('ExecPlan', 'disposing of inferenceHandler');\n inferenceHandler.dispose();\n return output;\n });\n }\n\n _values: Array;\n _ops: KernelOp[];\n _starter: number[];\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport Long from 'long';\n\nimport {onnxruntime} from './ort-schema/flatbuffers/ort-generated';\nimport {onnx} from './ort-schema/protobuf/onnx';\nimport {Tensor} from './tensor';\nimport {decodeUtf8String, LongUtil} from './util';\n\nimport ortFbs = onnxruntime.experimental.fbs;\n\nexport declare namespace Attribute {\n export interface DataTypeMap {\n float: number;\n int: number;\n string: string;\n tensor: Tensor;\n floats: number[];\n ints: number[];\n strings: string[];\n tensors: Tensor[];\n }\n\n export type DataType = keyof DataTypeMap;\n}\n\ntype ValueTypes = Attribute.DataTypeMap[Attribute.DataType];\n\ntype Value = [ValueTypes, Attribute.DataType];\n\nexport class Attribute {\n constructor(attributes: onnx.IAttributeProto[]|ortFbs.Attribute[]|null|undefined) {\n this._attributes = new Map();\n if (attributes !== null && attributes !== undefined) {\n for (const attr of attributes) {\n if (attr instanceof onnx.AttributeProto) {\n this._attributes.set(attr.name, [Attribute.getValue(attr), Attribute.getType(attr)]);\n } else if (attr instanceof ortFbs.Attribute) {\n this._attributes.set(attr.name()!, [Attribute.getValue(attr), Attribute.getType(attr)]);\n }\n }\n if (this._attributes.size < attributes.length) {\n throw new Error('duplicated attribute names');\n }\n }\n }\n\n set(key: string, type: Attribute.DataType, value: ValueTypes): void {\n this._attributes.set(key, [value, type]);\n }\n delete(key: string): void {\n this._attributes.delete(key);\n }\n getFloat(key: string, defaultValue?: Attribute.DataTypeMap['float']) {\n return this.get(key, 'float', defaultValue);\n }\n\n getInt(key: string, defaultValue?: Attribute.DataTypeMap['int']) {\n return this.get(key, 'int', defaultValue);\n }\n\n getString(key: string, defaultValue?: Attribute.DataTypeMap['string']) {\n return this.get(key, 'string', defaultValue);\n }\n\n getTensor(key: string, defaultValue?: Attribute.DataTypeMap['tensor']) {\n return this.get(key, 'tensor', defaultValue);\n }\n\n getFloats(key: string, defaultValue?: Attribute.DataTypeMap['floats']) {\n return this.get(key, 'floats', defaultValue);\n }\n\n getInts(key: string, defaultValue?: Attribute.DataTypeMap['ints']) {\n return this.get(key, 'ints', defaultValue);\n }\n\n getStrings(key: string, defaultValue?: Attribute.DataTypeMap['strings']) {\n return this.get(key, 'strings', defaultValue);\n }\n\n getTensors(key: string, defaultValue?: Attribute.DataTypeMap['tensors']) {\n return this.get(key, 'tensors', defaultValue);\n }\n\n private get(\n key: string, type: Attribute.DataType, defaultValue?: V): V {\n const valueAndType = this._attributes.get(key);\n if (valueAndType === undefined) {\n if (defaultValue !== undefined) {\n return defaultValue;\n }\n throw new Error(`required attribute not found: ${key}`);\n }\n if (valueAndType[1] !== type) {\n throw new Error(`type mismatch: expected ${type} but got ${valueAndType[1]}`);\n }\n return valueAndType[0] as V;\n }\n\n private static getType(attr: onnx.IAttributeProto|ortFbs.Attribute): Attribute.DataType {\n const type = attr instanceof onnx.AttributeProto ? (attr).type : (attr as ortFbs.Attribute).type();\n switch (type) {\n case onnx.AttributeProto.AttributeType.FLOAT:\n return 'float';\n case onnx.AttributeProto.AttributeType.INT:\n return 'int';\n case onnx.AttributeProto.AttributeType.STRING:\n return 'string';\n case onnx.AttributeProto.AttributeType.TENSOR:\n return 'tensor';\n case onnx.AttributeProto.AttributeType.FLOATS:\n return 'floats';\n case onnx.AttributeProto.AttributeType.INTS:\n return 'ints';\n case onnx.AttributeProto.AttributeType.STRINGS:\n return 'strings';\n case onnx.AttributeProto.AttributeType.TENSORS:\n return 'tensors';\n default:\n throw new Error(`attribute type is not supported yet: ${onnx.AttributeProto.AttributeType[type]}`);\n }\n }\n\n private static getValue(attr: onnx.IAttributeProto|ortFbs.Attribute) {\n const attrType = attr instanceof onnx.AttributeProto ? attr.type : (attr as ortFbs.Attribute).type();\n if (attrType === onnx.AttributeProto.AttributeType.GRAPH || attrType === onnx.AttributeProto.AttributeType.GRAPHS) {\n throw new Error('graph attribute is not supported yet');\n }\n\n const value = this.getValueNoCheck(attr);\n\n // cast LONG to number\n if (attrType === onnx.AttributeProto.AttributeType.INT && LongUtil.isLong(value)) {\n return LongUtil.longToNumber(value as Long | flatbuffers.Long);\n }\n\n // cast LONG[] to number[]\n if (attrType === onnx.AttributeProto.AttributeType.INTS) {\n const arr = (value as Array);\n const numberValue: number[] = new Array(arr.length);\n\n for (let i = 0; i < arr.length; i++) {\n const maybeLong = arr[i];\n numberValue[i] = LongUtil.longToNumber(maybeLong);\n }\n\n return numberValue;\n }\n\n // cast onnx.TensorProto to onnxjs.Tensor\n if (attrType === onnx.AttributeProto.AttributeType.TENSOR) {\n return attr instanceof onnx.AttributeProto ? Tensor.fromProto(value as onnx.ITensorProto) :\n Tensor.fromOrtTensor(value as ortFbs.Tensor);\n }\n\n // cast onnx.TensorProto[] to onnxjs.Tensor[]\n if (attrType === onnx.AttributeProto.AttributeType.TENSORS) {\n if (attr instanceof onnx.AttributeProto) {\n const tensorProtos = value as onnx.ITensorProto[];\n return tensorProtos.map(value => Tensor.fromProto(value));\n } else if (attr instanceof ortFbs.Attribute) {\n const tensorProtos = value as ortFbs.Tensor[];\n return tensorProtos.map(value => Tensor.fromOrtTensor(value));\n }\n }\n\n // cast Uint8Array to string\n if (attrType === onnx.AttributeProto.AttributeType.STRING) {\n // string in onnx attribute is of uint8array type, so we need to convert it to string below. While in ort format,\n // string attributes are returned as string, so no conversion is needed.\n if (attr instanceof onnx.AttributeProto) {\n const utf8String = value as Uint8Array;\n return decodeUtf8String(utf8String);\n }\n }\n\n // cast Uint8Array[] to string[]\n if (attrType === onnx.AttributeProto.AttributeType.STRINGS) {\n // strings in onnx attribute is returned as uint8array[], so we need to convert it to string[] below. While in ort\n // format strings attributes are returned as string[], so no conversion is needed.\n if (attr instanceof onnx.AttributeProto) {\n const utf8Strings = value as Uint8Array[];\n return utf8Strings.map(decodeUtf8String);\n }\n }\n\n return value as ValueTypes;\n }\n\n private static getValueNoCheck(attr: onnx.IAttributeProto|ortFbs.Attribute) {\n return attr instanceof (onnx.AttributeProto) ? this.getValueNoCheckFromOnnxFormat(attr) :\n this.getValueNoCheckFromOrtFormat(attr as ortFbs.Attribute);\n }\n\n private static getValueNoCheckFromOnnxFormat(attr: onnx.IAttributeProto) {\n switch (attr.type!) {\n case onnx.AttributeProto.AttributeType.FLOAT:\n return attr.f;\n case onnx.AttributeProto.AttributeType.INT:\n return attr.i;\n case onnx.AttributeProto.AttributeType.STRING:\n return attr.s;\n case onnx.AttributeProto.AttributeType.TENSOR:\n return attr.t;\n case onnx.AttributeProto.AttributeType.GRAPH:\n return attr.g;\n case onnx.AttributeProto.AttributeType.FLOATS:\n return attr.floats;\n case onnx.AttributeProto.AttributeType.INTS:\n return attr.ints;\n case onnx.AttributeProto.AttributeType.STRINGS:\n return attr.strings;\n case onnx.AttributeProto.AttributeType.TENSORS:\n return attr.tensors;\n case onnx.AttributeProto.AttributeType.GRAPHS:\n return attr.graphs;\n default:\n throw new Error(`unsupported attribute type: ${onnx.AttributeProto.AttributeType[attr.type!]}`);\n }\n }\n\n private static getValueNoCheckFromOrtFormat(attr: ortFbs.Attribute) {\n switch (attr.type()) {\n case ortFbs.AttributeType.FLOAT:\n return attr.f();\n case ortFbs.AttributeType.INT:\n return attr.i();\n case ortFbs.AttributeType.STRING:\n return attr.s();\n case ortFbs.AttributeType.TENSOR:\n return attr.t();\n case ortFbs.AttributeType.GRAPH:\n return attr.g();\n case ortFbs.AttributeType.FLOATS:\n return attr.floatsArray();\n case ortFbs.AttributeType.INTS: {\n const ints = [];\n for (let i = 0; i < attr.intsLength(); i++) {\n ints.push(attr.ints(i)!);\n }\n return ints;\n }\n case ortFbs.AttributeType.STRINGS: {\n const strings = [];\n for (let i = 0; i < attr.stringsLength(); i++) {\n strings.push(attr.strings(i));\n }\n return strings;\n }\n case ortFbs.AttributeType.TENSORS: {\n const tensors = [];\n for (let i = 0; i < attr.tensorsLength(); i++) {\n tensors.push(attr.tensors(i)!);\n }\n return tensors;\n }\n // case ortFbs.AttributeType.GRAPHS:\n // TODO: Subgraph not supported yet.\n // const graphs = [];\n // for (let i = 0; i < attr.graphsLength(); i++) {\n // graphs.push(attr.graphs(i)!);\n // }\n // return graphs;\n default:\n throw new Error(`unsupported attribute type: ${ortFbs.AttributeType[attr.type()]}`);\n }\n }\n\n protected _attributes: Map;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Attribute} from './attribute';\nimport {onnxruntime} from './ort-schema/flatbuffers/ort-generated';\nimport {onnx} from './ort-schema/protobuf/onnx';\nimport {Tensor} from './tensor';\nimport {LongUtil, MAX_CLIP, MIN_CLIP, ProtoUtil} from './util';\n\nimport ortFbs = onnxruntime.experimental.fbs;\n\nexport declare namespace Graph {\n export interface Shape {\n readonly dims: readonly number[];\n }\n export interface ValueType {\n readonly tensorType: Tensor.DataType;\n readonly shape: Shape;\n }\n export interface Value {\n // the tensor data. empty for non-initialized inputs\n readonly tensor?: Tensor;\n\n // index to the Node where the value comes from. -1 for initializer.\n readonly from: number;\n\n // indices to the Nodes where the values go to.\n readonly to: readonly number[];\n\n // value type specification. empty for non-input values.\n readonly type?: ValueType;\n }\n export interface Node {\n // name of the node\n readonly name: string;\n\n // the operator type\n readonly opType: string;\n\n // indices to the Values where the inputs come from.\n readonly inputs: readonly number[];\n\n // indices to the Values where the outpus go to.\n readonly outputs: readonly number[];\n\n // the attributes that used by the operator\n readonly attributes: Attribute;\n }\n\n /**\n * a Transformer is an instance that allows all possible transformation operations that applied to a graph\n */\n export interface Transformer {\n removeAllIdentityNodes(): void;\n removeAllDropoutNodes(): void;\n fuseConvActivationNodes(): void;\n // TODO: add generic functions to manipulate the graph\n }\n\n // an initializer can use transformer to transform the graph\n export interface Initializer {\n transformGraph(transformer: Transformer): void;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport interface Graph {\n getInputIndices(): readonly number[];\n getInputNames(): readonly string[];\n getOutputIndices(): readonly number[];\n getOutputNames(): readonly string[];\n getValues(): readonly Graph.Value[];\n getNodes(): readonly Graph.Node[];\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-redeclare\nexport const Graph = {\n /**\n * construct a graph from a graph protobuf type\n */\n from: (graphProto: onnx.IGraphProto|ortFbs.Graph, initializer?: Graph.Initializer) =>\n new GraphImpl(graphProto, initializer),\n};\n\nclass Value implements Graph.Value {\n constructor(valueInfo?: onnx.IValueInfoProto) {\n this._from = undefined;\n this._to = [];\n this.tensor = undefined;\n this.type = undefined;\n\n if (valueInfo) {\n this.type = ProtoUtil.tensorValueTypeFromProto(valueInfo.type!.tensorType!);\n }\n }\n\n _from?: number; // -1 represent from initializer\n get from() {\n return this._from!;\n }\n _to: number[];\n get to() {\n return this._to;\n }\n type?: Graph.ValueType;\n tensor?: Tensor;\n}\n\nclass Node implements Graph.Node {\n constructor(_nodeProto: onnx.INodeProto|ortFbs.Node, name?: string) {\n if (_nodeProto instanceof onnx.NodeProto) {\n this.name = _nodeProto.name;\n this.opType = _nodeProto.opType;\n this.attributes = new Attribute(_nodeProto.attribute);\n } else if (_nodeProto instanceof ortFbs.Node) {\n this.name = name ?? _nodeProto.name()!;\n this.opType = _nodeProto.opType()!;\n this.attributes = new Attribute(ProtoUtil.tensorAttributesFromORTFormat(_nodeProto));\n }\n\n this.inputs = [];\n this.outputs = [];\n this.executeNode = true;\n }\n\n name: string;\n opType: string;\n inputs: number[];\n outputs: number[];\n attributes: Attribute;\n executeNode: boolean;\n}\n\nclass GraphImpl implements Graph, Graph.Transformer {\n private _allData: Value[];\n\n private _allInputIndices: number[];\n private _allInputNames: string[];\n\n private _allOutputIndices: number[];\n private _allOutputNames: string[];\n\n private _nodes: Node[];\n\n constructor(graph: onnx.IGraphProto|ortFbs.Graph, graphInitializer?: Graph.Initializer) {\n if (!graph) {\n throw new TypeError('graph is empty');\n }\n\n // build the graph - will throw exceptions if something fatal is detected\n this.buildGraph(graph);\n\n // execute any transformation logic for the graph (if applicable)\n this.transformGraph(graphInitializer);\n\n // check for cycles and other inconsistencies - will throw exceptions if something fatal is detected\n this.checkIsAcyclic();\n }\n\n getInputIndices(): readonly number[] {\n return this._allInputIndices;\n }\n\n getInputNames(): readonly string[] {\n return this._allInputNames;\n }\n\n getOutputIndices(): readonly number[] {\n return this._allOutputIndices;\n }\n\n getOutputNames(): readonly string[] {\n return this._allOutputNames;\n }\n\n getValues(): readonly Graph.Value[] {\n return this._allData;\n }\n\n getNodes(): readonly Graph.Node[] {\n return this._nodes;\n }\n\n private buildGraph(graph: onnx.IGraphProto|ortFbs.Graph) {\n // build the graph - will throw exceptions if something fatal is detected\n if (graph instanceof onnx.GraphProto) {\n this.buildGraphFromOnnxFormat(graph);\n } else if (graph instanceof ortFbs.Graph) {\n this.buildGraphFromOrtFormat(graph);\n } else {\n throw new TypeError('Graph type is not supported.');\n }\n }\n private buildGraphFromOnnxFormat(graph: onnx.IGraphProto) {\n const dataIndices = new Map();\n this._allData = [];\n\n this._allInputIndices = [];\n this._allInputNames = [];\n\n this._allOutputIndices = [];\n this._allOutputNames = [];\n\n this._nodes = [];\n\n const nodesIndices = new Map();\n\n // scan all inputs\n if (!graph.input) {\n throw new Error('missing information in graph: input');\n }\n const inputValueNames = [];\n for (const i of graph.input) {\n if (dataIndices.has(i.name!)) {\n throw new Error(`duplicated input name: ${i.name}`);\n }\n const currentIndex = this._allData.push(new Value(i)) - 1;\n dataIndices.set(i.name!, currentIndex);\n inputValueNames.push(i.name!);\n }\n\n // scan all initializers\n if (!graph.initializer) {\n throw new Error('missing information in graph: initializer');\n }\n for (const i of graph.initializer) {\n let index = dataIndices.get(i.name!);\n if (index === undefined) {\n const value = new Value();\n value.type = {\n shape: {dims: ProtoUtil.tensorDimsFromProto(i.dims!)},\n tensorType: ProtoUtil.tensorDataTypeFromProto(i.dataType!)\n };\n index = this._allData.push(value) - 1;\n dataIndices.set(i.name!, index);\n }\n this._allData[index]._from = -1;\n this._allData[index].tensor = Tensor.fromProto(i);\n }\n\n // filter out input indices\n for (let i = 0; i < this._allData.length; i++) {\n if (!this._allData[i].tensor) {\n this._allInputIndices.push(i);\n this._allInputNames.push(inputValueNames[i]);\n }\n }\n\n // scan all outputs\n if (!graph.output) {\n throw new Error('missing information in graph: output');\n }\n for (const i of graph.output) {\n if (dataIndices.has(i.name!)) {\n throw new Error(`duplicated output name: ${i.name}`);\n }\n const currentIndex = this._allData.push(new Value(i)) - 1;\n dataIndices.set(i.name!, currentIndex);\n this._allOutputIndices.push(currentIndex);\n this._allOutputNames.push(i.name!);\n }\n\n // scan all nodes\n if (!graph.node) {\n throw new Error('missing information in graph: node');\n }\n for (const nodeProto of graph.node) {\n if (!nodeProto.name) {\n // assign a name to the node if it doesn't have one\n for (let pick = 0;; pick++) {\n const name = `unnamed_${nodeProto.opType}_${pick}`;\n if (!nodesIndices.has(name)) {\n nodeProto.name = name;\n break;\n }\n }\n }\n\n if (nodesIndices.has(nodeProto.name)) {\n throw new Error(`duplicated node name: ${nodeProto.name}`);\n }\n const currentIndex = this._nodes.push(new Node(nodeProto)) - 1;\n nodesIndices.set(nodeProto.name, currentIndex);\n }\n\n // scan node's outputs\n for (let i = 0; i < this._nodes.length; i++) {\n const node = this._nodes[i];\n const nodeProto = graph.node[i];\n if (!nodeProto.output) {\n throw new Error(`missing output for node: ${nodeProto.name}`);\n }\n for (const output of nodeProto.output) {\n let dataIndex = dataIndices.get(output);\n if (typeof dataIndex === 'undefined') {\n dataIndex = this._allData.push(new Value()) - 1;\n dataIndices.set(output, dataIndex);\n }\n node.outputs.push(dataIndex);\n\n if (this._allData[dataIndex]._from !== undefined) {\n throw new Error(`multiple nodes output to one data value: ${dataIndex}`);\n }\n this._allData[dataIndex]._from = i;\n\n // for the 'Constant' operator, just create a new edge in the graph corresponding to the 'output' of the\n // operator and ignore the node from the graph\n if (nodeProto.opType === 'Constant') {\n if (!nodeProto.attribute || nodeProto.attribute.length !== 1 || !nodeProto.attribute[0].t) {\n throw new Error('missing attributes or missing tensor value in attributes for this Constant operator');\n }\n if (!nodeProto.output || nodeProto.output.length !== 1) {\n throw new Error('missing output or incorrect number of outputs for this Constant operator');\n }\n node.outputs.pop();\n node.executeNode = false;\n\n this._allData[dataIndex]._from = -1;\n this._allData[dataIndex].tensor = Tensor.fromProto(nodeProto.attribute[0].t);\n }\n }\n }\n\n // scan node's inputs\n for (let i = 0; i < this._nodes.length; i++) {\n const node = this._nodes[i];\n const nodeProto = graph.node[i];\n\n if (!nodeProto.input) {\n throw new Error(`missing input for node: ${nodeProto.name}`);\n }\n for (const input of nodeProto.input) {\n const dataIndex = dataIndices.get(input);\n if (typeof dataIndex === 'undefined') {\n // handle exception when opset > 9 and roi / scales not given\n if (input === '' && (nodeProto.input.length === 3 || nodeProto.input.length === 4) &&\n nodeProto.opType === 'Resize') {\n continue;\n }\n throw new Error(`unrecognized input '${input}' for node: ${nodeProto.name}`);\n }\n node.inputs.push(dataIndex);\n\n this._allData[dataIndex]._to.push(i);\n }\n }\n\n return true;\n }\n\n private buildGraphFromOrtFormat(graph: ortFbs.Graph) {\n const dataIndices = new Map();\n this._allData = [];\n\n this._allInputIndices = [];\n this._allInputNames = [];\n\n this._allOutputIndices = [];\n this._allOutputNames = [];\n\n this._nodes = [];\n\n const nodesIndices = new Map();\n\n // scan all inputs\n const inputValueNames = [];\n for (let i = 0; i < graph.inputsLength(); i++) {\n const inputName = graph.inputs(i);\n if (dataIndices.has(inputName)) {\n throw new Error(`duplicated input name: ${inputName}`);\n }\n // Find the input typeInfo from nodeargs\n for (let j = 0; j < graph.nodeArgsLength(); j++) {\n if (graph.nodeArgs(j)?.name() === inputName) {\n const value = new Value();\n const valueType = graph.nodeArgs(j)?.type()?.valueType();\n if (valueType !== ortFbs.TypeInfoValue.tensor_type) {\n throw new Error('Unexpected value type for the nodeArg.');\n }\n const valueInfo = graph.nodeArgs(j)!.type()!.value(new ortFbs.TensorTypeAndShape())!;\n const type = ProtoUtil.tensorDataTypeFromProto(valueInfo.elemType());\n const shape = valueInfo.shape()!;\n const dims = [];\n for (let k = 0; k < shape.dimLength()!; k++) {\n dims.push(LongUtil.longToNumber(shape.dim(k)!.value()!.dimValue()!));\n }\n value.type = {shape: {dims}, tensorType: type};\n const currentIndex = this._allData.push(value) - 1;\n dataIndices.set(inputName, currentIndex);\n inputValueNames.push(inputName);\n }\n }\n }\n // check initializers\n for (let i = 0; i < graph.initializersLength(); i++) {\n const initializer = graph.initializers(i)!;\n let index = dataIndices.get(initializer.name()!);\n if (index === undefined) {\n const value = new Value();\n const dims = ProtoUtil.tensorDimsFromORTFormat(initializer);\n const type = ProtoUtil.tensorDataTypeFromProto(initializer.dataType());\n value.type = {shape: {dims}, tensorType: type};\n index = this._allData.push(value) - 1;\n dataIndices.set(initializer.name()!, index);\n }\n this._allData[index]._from = -1;\n this._allData[index].tensor = Tensor.fromOrtTensor(initializer);\n }\n\n // filter out input indices\n for (let i = 0; i < this._allData.length; i++) {\n if (!this._allData[i].tensor) {\n this._allInputIndices.push(i);\n this._allInputNames.push(inputValueNames[i]);\n }\n }\n\n // scan all outputs\n for (let i = 0; i < graph.outputsLength(); i++) {\n const outputName = graph.outputs(i);\n if (dataIndices.has(outputName)) {\n throw new Error(`duplicated output name: ${outputName}`);\n }\n const currentIndex = this._allData.push(new Value()) - 1;\n dataIndices.set(outputName, currentIndex);\n this._allOutputIndices.push(currentIndex);\n this._allOutputNames.push(outputName);\n }\n\n // scan all nodes\n if (!graph.nodes) {\n throw new Error('missing information in graph: node');\n }\n for (let i = 0; i < graph.nodesLength(); i++) {\n const nodeProto = graph.nodes(i);\n let name = nodeProto!.name();\n if (!name) {\n // assign a name to the node if it doesn't have one\n for (let pick = 0;; pick++) {\n name = `unnamed_${nodeProto!.opType()}_${pick}`;\n if (!nodesIndices.has(name)) {\n // an unique name is found. break.\n break;\n }\n }\n }\n\n if (nodesIndices.has(name)) {\n throw new Error(`duplicated node name: ${name}`);\n }\n const currentIndex = this._nodes.push(new Node(nodeProto!, name)) - 1;\n nodesIndices.set(name, currentIndex);\n }\n\n // scan node's outputs\n for (let i = 0; i < this._nodes.length; i++) {\n const node = this._nodes[i];\n const nodeProto = graph.nodes(i);\n if (nodeProto == null) {\n throw new Error(`No node exists at index ${i}`);\n }\n if (nodeProto?.outputsLength() === 0) {\n throw new Error(`missing output for node: ${nodeProto.name}`);\n }\n for (let j = 0; j < nodeProto?.outputsLength(); j++) {\n const output = nodeProto?.outputs(j);\n let dataIndex = dataIndices.get(output);\n if (typeof dataIndex === 'undefined') {\n dataIndex = this._allData.push(new Value()) - 1;\n dataIndices.set(output, dataIndex);\n }\n node.outputs.push(dataIndex);\n\n if (this._allData[dataIndex]._from !== undefined) {\n throw new Error(`multiple nodes output to one data value: ${dataIndex}`);\n }\n this._allData[dataIndex]._from = i;\n\n // for the 'Constant' operator, just create a new edge in the graph corresponding to the 'output' of the\n // operator and ignore the node from the graph\n if (nodeProto.opType() === 'Constant') {\n if (nodeProto.attributesLength() !== 1 || !nodeProto.attributes(0)!.t()) {\n throw new Error('missing attributes or missing tensor value in attributes for this Constant operator');\n }\n if (nodeProto.outputsLength() !== 1) {\n throw new Error('missing output or incorrect number of outputs for this Constant operator');\n }\n node.outputs.pop();\n node.executeNode = false;\n\n this._allData[dataIndex]._from = -1;\n this._allData[dataIndex].tensor = Tensor.fromOrtTensor(nodeProto.attributes(0)!.t()!);\n }\n }\n }\n\n // scan node's inputs\n for (let i = 0; i < this._nodes.length; i++) {\n const node = this._nodes[i];\n const nodeProto = graph.nodes(i)!;\n\n if (nodeProto.inputsLength() === 0) {\n throw new Error(`missing input for node: ${nodeProto.name}`);\n }\n for (let j = 0; j < nodeProto.inputsLength()!; j++) {\n const input = nodeProto.inputs(j)!;\n const dataIndex = dataIndices.get(input);\n if (typeof dataIndex === 'undefined') {\n throw new Error(`unrecognized input '${input}' for node: ${nodeProto!.name()}`);\n }\n node.inputs.push(dataIndex);\n\n this._allData[dataIndex]._to.push(i);\n }\n }\n }\n\n private checkIsAcyclic() {\n // go through the graph and check for cycles or other fatal inconsistencies\n const starters: Set = new Set();\n this._allInputIndices.forEach(i => {\n const data = this._allData[i];\n data._to.forEach(j => {\n starters.add(j);\n });\n });\n\n // Iterative DFS to check for cycles\n const nodesStack = Array.from(starters);\n const nodesState = new Array(this._nodes.length).fill('white');\n\n while (nodesStack.length > 0) {\n const nodeIndex = nodesStack.pop()!;\n // this node has now been processed completely. Mark this node 'black' to denote this.\n if (nodesState[nodeIndex] === 'gray') {\n nodesState[nodeIndex] = 'black';\n } else {\n // this node is under processing stage. mark this node 'gray' to denote this.\n nodesStack.push(nodeIndex);\n nodesState[nodeIndex] = 'gray';\n\n this._nodes[nodeIndex].outputs.forEach((outgoingEdgeIndex) => {\n const data = this._allData[outgoingEdgeIndex];\n if (typeof data.tensor !== 'undefined') {\n throw new Error('node outputs should not be initialized');\n }\n if (data._from !== nodeIndex) {\n throw new Error('from property of the Value object doesn\\'t match index of Node being processed');\n }\n data._to.forEach((downstreamNodeIndex) => {\n // back edge found - cyclic\n if (nodesState[downstreamNodeIndex] === 'gray') {\n throw new Error('model graph is cyclic');\n }\n // tree edge found - continue processing by adding it to stack\n else if (nodesState[downstreamNodeIndex] === 'white') {\n nodesStack.push(downstreamNodeIndex);\n }\n });\n });\n }\n }\n }\n\n private transformGraph(graphInitializer?: Graph.Initializer): void {\n // apply common transform\n this.removeAllIdentityNodes();\n this.removeAllDropoutNodes();\n this.fuseConvActivationNodes();\n // apply initializer specific transform\n if (graphInitializer) {\n graphInitializer.transformGraph(this);\n }\n\n // finalize graph\n this.finalizeGraph();\n }\n\n /**\n * finalize the graph.\n *\n * this function should be called after all the transformation completed.\n * this function removes all unnecessary nodes and values from the graph\n */\n finalizeGraph() {\n let offset = 0;\n // delete all nodes that are not being executed\n // The graph is represented using these two arrays\n // this._nodes - Array holding the kernels to execute - each entry is a kernel pointing to this._allData\n // this._allData - hold 2 fields - to [] & from - these feileds hold the graph map for inputs and outputs per node\n // newIndices - remapping the graph after reading the flag 'executeNode'\n const newIndices = new Array(this._nodes.length, 0);\n let nodePossition = 0;\n\n for (let i = 0; i < this._nodes.length; i++) {\n // giving new indexes to the nodes based on execution flag\n newIndices[i] = nodePossition;\n if (this._nodes[i].executeNode) {\n if (nodePossition !== i) {\n this._nodes[nodePossition] = this._nodes[i];\n }\n nodePossition++;\n\n } else {\n // delete all output values\n this._nodes[i].outputs.forEach(ind => {\n this._allData[ind]._from = -2;\n });\n }\n }\n\n // removing the unused nodes\n this._nodes.splice(nodePossition, this._nodes.length - nodePossition);\n\n // Updating this._allData according to the new this._nodes\n for (let i = 0; i < this._allData.length; i++) {\n const currentData = this._allData[i];\n if (currentData._from !== undefined && currentData._from !== -1 && currentData._from !== -2) {\n currentData._from = newIndices[currentData._from];\n }\n\n for (let j = 0; j < currentData._to.length; j++) {\n if (currentData._to[j] >= 0) {\n currentData._to[j] = newIndices[currentData._to[j]];\n } else {\n throw new Error('Trying to update a removed node');\n }\n }\n }\n\n offset = 0;\n // delete all values that are not being referenced\n for (let i = 0; i < this._allData.length; i++) {\n // if current value is neither linked to next node, nor an output value, remove it.\n if (this._allData[i].from === -2 && this._allOutputIndices.indexOf(i + offset) === -1) {\n offset++;\n this._allData.splice(i, 1);\n i--;\n continue;\n }\n if (offset > 0) {\n let ind = -1;\n // if current value is neither an input value nor an initializer, find the node it's\n // coming from and update the corresponding node output\n if (this._allData[i].from !== undefined && this._allData[i].from !== -1) {\n ind = this._nodes[this._allData[i].from].outputs.indexOf(i + offset);\n if (ind !== -1) {\n this._nodes[this._allData[i].from].outputs[ind] = i;\n }\n } else {\n // if current value is an input value, update its reference in inputIndices\n ind = this._allInputIndices.indexOf(i + offset);\n if (ind !== -1) {\n this._allInputIndices[ind] = i;\n }\n }\n\n // find the node that the current value is linking to and update its input reference\n this._allData[i].to.forEach(node => {\n ind = this._nodes[node].inputs.indexOf(i + offset);\n if (ind !== -1) {\n this._nodes[node].inputs[ind] = i;\n }\n });\n if (this._allData[i].to.length === 0) {\n // if current value is a graph output, update its reference in outputIndices\n ind = this._allOutputIndices.indexOf(i + offset);\n if (ind !== -1) {\n this._allOutputIndices[ind] = i;\n }\n }\n }\n }\n }\n\n /**\n * Delete the specified node. Assume the node has one incoming input and the first output connected to other nodes.\n * An input validation must be done before calling this function.\n * @param nodeIndex The index of node to be deleted\n */\n private deleteNode(nodeIndex: number) {\n const node = this._nodes[nodeIndex];\n if (node.outputs.length > 1) {\n for (let i = 1; i < node.outputs.length; i++) {\n if (this._allData[node.outputs[i]].to.length > 0) {\n throw new Error('Node deletion with more than one output connected to other nodes is not supported. ');\n }\n }\n }\n\n // this node wil not be executed\n node.executeNode = false;\n const inputValueIndex = node.inputs[0];\n const outputValueIndex = node.outputs[0];\n const nodesConsumingOutput = this._allData[outputValueIndex].to;\n\n // remove this node from the to property of the input Value\n for (let i = 0; i < node.inputs.length; i++) {\n const delIndex = this._allData[node.inputs[i]].to.indexOf(nodeIndex);\n // should not happen\n if (delIndex === -1) {\n throw new Error('The Value object doesn\\'t have the current Node in it\\'s \\'to\\' property ');\n }\n this._allData[node.inputs[i]].to.splice(delIndex, 1);\n }\n\n // clear node indices consuming this output Value\n this._allData[outputValueIndex]._to = [];\n\n // if the output of this node is a graph output, adjust the index appropriately\n const index = this._allOutputIndices.indexOf(outputValueIndex);\n if (index !== -1) {\n this._allOutputIndices[index] = inputValueIndex;\n }\n\n // override the inputs for nodes consuming this node's output with the input to this node\n if (nodesConsumingOutput && nodesConsumingOutput.length > 0) {\n for (const nodeIndex of nodesConsumingOutput) {\n const replaceIndex = this._nodes[nodeIndex].inputs.indexOf(outputValueIndex);\n // should not happen\n if (replaceIndex === -1) {\n throw new Error('The Node object doesn\\'t have the output Value in it\\'s \\'inputs\\' property ');\n }\n this._nodes[nodeIndex].inputs[replaceIndex] = inputValueIndex;\n this._allData[inputValueIndex].to.push(nodeIndex);\n }\n }\n }\n\n removeAllDropoutNodes() {\n let nodeIndex = 0;\n for (const node of this._nodes) {\n // weed out 'Dropout' nodes so that no time is wasted in execution\n if (node.opType === 'Dropout') {\n // the node should have exactly 1 input and 1 or 2 outputs\n if (node.inputs.length !== 1) {\n throw new Error('Dropout nodes should only contain one input. ');\n }\n if (node.outputs.length !== 1 && node.outputs.length !== 2) {\n throw new Error('Dropout nodes should contain either 1 or 2 output(s)');\n }\n // the second output should not be referenced by any other node\n if (node.outputs.length === 2 && this._allData[node.outputs[1]]._to.length !== 0) {\n throw new Error('Dropout nodes\\'s second output should not be referenced by other nodes');\n }\n this.deleteNode(nodeIndex);\n }\n nodeIndex++;\n }\n }\n\n removeAllIdentityNodes() {\n let nodeIndex = 0;\n for (const node of this._nodes) {\n // weed out 'Identity' nodes so that no time is wasted in execution\n if (node.opType === 'Identity') {\n this.deleteNode(nodeIndex);\n }\n nodeIndex++;\n }\n }\n\n isActivation(n: Node): boolean {\n switch (n.opType) {\n // TODO: add other activation methods\n case 'Relu':\n case 'Sigmoid':\n case 'Clip':\n return true;\n default:\n return false;\n }\n }\n\n fuseConvActivationNodes() {\n for (const node of this._nodes) {\n if (node.opType === 'Conv') {\n const next = this._allData[node.outputs[0]]._to;\n if (next.length === 1 && this.isActivation(this._nodes[next[0]])) {\n const child = this._nodes[next[0]];\n if (child.opType === 'Clip') {\n if (child.inputs.length === 1) {\n try {\n node.attributes.set(\n 'activation_params', 'floats',\n [child.attributes.getFloat('min'), child.attributes.getFloat('max')]);\n } catch (e) {\n node.attributes.set('activation_params', 'floats', [MIN_CLIP, MAX_CLIP]);\n }\n } else if (\n child.inputs.length >= 3 && this._allData[child.inputs[1]].tensor !== undefined &&\n this._allData[child.inputs[2]].tensor !== undefined) {\n node.attributes.set('activation_params', 'floats', [\n this._allData[child.inputs[1]].tensor!.floatData[0], this._allData[child.inputs[2]].tensor!.floatData[0]\n ]);\n } else {\n // Skip fusion with clip node since clip min and clip max are not coming from initializer\n continue;\n }\n }\n node.attributes.set('activation', 'string', (child.opType));\n this.deleteNode(next[0]);\n }\n }\n }\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {flatbuffers} from 'flatbuffers';\n\nimport {Graph} from './graph';\nimport {OpSet} from './opset';\nimport {onnxruntime} from './ort-schema/flatbuffers/ort-generated';\nimport {onnx} from './ort-schema/protobuf/onnx';\nimport {LongUtil} from './util';\n\nimport ortFbs = onnxruntime.experimental.fbs;\n\nexport class Model {\n // empty model\n constructor() {}\n\n load(buf: Uint8Array, graphInitializer?: Graph.Initializer, isOrtFormat?: boolean): void {\n let onnxError: Error|undefined;\n if (!isOrtFormat) {\n // isOrtFormat === false || isOrtFormat === undefined\n try {\n this.loadFromOnnxFormat(buf, graphInitializer);\n return;\n } catch (e) {\n if (isOrtFormat !== undefined) {\n throw e;\n }\n onnxError = e;\n }\n }\n\n try {\n this.loadFromOrtFormat(buf, graphInitializer);\n } catch (e) {\n if (isOrtFormat !== undefined) {\n throw e;\n }\n // Tried both formats and failed (when isOrtFormat === undefined)\n throw new Error(`Failed to load model as ONNX format: ${onnxError}\\nas ORT format: ${e}`);\n }\n }\n\n private loadFromOnnxFormat(buf: Uint8Array, graphInitializer?: Graph.Initializer): void {\n const modelProto = onnx.ModelProto.decode(buf);\n const irVersion = LongUtil.longToNumber(modelProto.irVersion);\n if (irVersion < 3) {\n throw new Error('only support ONNX model with IR_VERSION>=3');\n }\n\n this._opsets =\n modelProto.opsetImport.map(i => ({domain: i.domain as string, version: LongUtil.longToNumber(i.version!)}));\n\n this._graph = Graph.from(modelProto.graph!, graphInitializer);\n }\n\n private loadFromOrtFormat(buf: Uint8Array, graphInitializer?: Graph.Initializer): void {\n const fb = new flatbuffers.ByteBuffer(buf);\n const ortModel = ortFbs.InferenceSession.getRootAsInferenceSession(fb).model()!;\n const irVersion = LongUtil.longToNumber(ortModel.irVersion());\n if (irVersion < 3) {\n throw new Error('only support ONNX model with IR_VERSION>=3');\n }\n this._opsets = [];\n for (let i = 0; i < ortModel.opsetImportLength(); i++) {\n const opsetId = ortModel.opsetImport(i)!;\n this._opsets.push({domain: opsetId?.domain() as string, version: LongUtil.longToNumber(opsetId.version()!)});\n }\n\n this._graph = Graph.from(ortModel.graph()!, graphInitializer);\n }\n\n private _graph: Graph;\n get graph(): Graph {\n return this._graph;\n }\n\n private _opsets: OpSet[];\n get opsets(): readonly OpSet[] {\n return this._opsets;\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {resolveBackend, SessionHandlerType} from './backend';\nimport {ExecutionPlan} from './execution-plan';\nimport {Graph} from './graph';\nimport {Profiler} from './instrument';\nimport {Model} from './model';\nimport {Operator} from './operators';\nimport {Tensor} from './tensor';\n\nexport declare namespace Session {\n export interface Config {\n backendHint?: string;\n profiler?: Profiler.Config;\n }\n\n export interface Context {\n profiler: Readonly;\n graphInputTypes?: Tensor.DataType[];\n graphInputDims?: Array;\n }\n}\n\nexport class Session {\n constructor(config: Session.Config = {}) {\n this._initialized = false;\n this.backendHint = config.backendHint;\n this.profiler = Profiler.create(config.profiler);\n this.context = {profiler: this.profiler, graphInputTypes: [], graphInputDims: []};\n }\n\n get inputNames(): readonly string[] {\n return this._model.graph.getInputNames();\n }\n get outputNames(): readonly string[] {\n return this._model.graph.getOutputNames();\n }\n\n startProfiling() {\n this.profiler.start();\n }\n\n endProfiling() {\n this.profiler.stop();\n }\n\n async loadModel(uri: string): Promise;\n async loadModel(buffer: ArrayBuffer, byteOffset?: number, length?: number): Promise;\n async loadModel(buffer: Uint8Array): Promise;\n async loadModel(arg: string|ArrayBuffer|Uint8Array, byteOffset?: number, length?: number): Promise {\n await this.profiler.event('session', 'Session.loadModel', async () => {\n // resolve backend and session handler\n const backend = await resolveBackend(this.backendHint);\n this.sessionHandler = backend.createSessionHandler(this.context);\n\n this._model = new Model();\n if (typeof arg === 'string') {\n const isOrtFormat = arg.endsWith('.ort');\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n // node\n const {readFile} = require('node:fs/promises');\n const buf = await readFile(arg);\n this.initialize(buf, isOrtFormat);\n } else {\n // browser\n const response = await fetch(arg);\n const buf = await response.arrayBuffer();\n this.initialize(new Uint8Array(buf), isOrtFormat);\n }\n } else if (!ArrayBuffer.isView(arg)) {\n // load model from ArrayBuffer\n const arr = new Uint8Array(arg, byteOffset || 0, length || arg.byteLength);\n this.initialize(arr);\n } else {\n // load model from Uint8array\n this.initialize(arg);\n }\n });\n }\n\n private initialize(modelProtoBlob: Uint8Array, isOrtFormat?: boolean): void {\n if (this._initialized) {\n throw new Error('already initialized');\n }\n\n this.profiler.event('session', 'Session.initialize', () => {\n // load graph\n const graphInitializer =\n this.sessionHandler.transformGraph ? this.sessionHandler as Graph.Initializer : undefined;\n this._model.load(modelProtoBlob, graphInitializer, isOrtFormat);\n\n // graph is completely initialzied at this stage , let the interested handlers know\n if (this.sessionHandler.onGraphInitialized) {\n this.sessionHandler.onGraphInitialized(this._model.graph);\n }\n // initialize each operator in the graph\n this.initializeOps(this._model.graph);\n\n // instantiate an ExecutionPlan object to be used by the Session object\n this._executionPlan = new ExecutionPlan(this._model.graph, this._ops, this.profiler);\n });\n\n this._initialized = true;\n }\n\n async run(inputs: Map|Tensor[]): Promise> {\n if (!this._initialized) {\n throw new Error('session not initialized yet');\n }\n\n return this.profiler.event('session', 'Session.run', async () => {\n const inputTensors = this.normalizeAndValidateInputs(inputs);\n\n const outputTensors = await this._executionPlan.execute(this.sessionHandler, inputTensors);\n\n return this.createOutput(outputTensors);\n });\n }\n\n private normalizeAndValidateInputs(inputs: Map|Tensor[]): Tensor[] {\n const modelInputNames = this._model.graph.getInputNames();\n\n // normalize inputs\n // inputs: Tensor[]\n if (Array.isArray(inputs)) {\n if (inputs.length !== modelInputNames.length) {\n throw new Error(`incorrect input array length: expected ${modelInputNames.length} but got ${inputs.length}`);\n }\n }\n // convert map to array\n // inputs: Map\n else {\n if (inputs.size !== modelInputNames.length) {\n throw new Error(`incorrect input map size: expected ${modelInputNames.length} but got ${inputs.size}`);\n }\n\n const sortedInputs = new Array(inputs.size);\n let sortedInputsIndex = 0;\n for (let i = 0; i < modelInputNames.length; ++i) {\n const tensor = inputs.get(modelInputNames[i]);\n if (!tensor) {\n throw new Error(`missing input tensor for: '${name}'`);\n }\n sortedInputs[sortedInputsIndex++] = tensor;\n }\n\n inputs = sortedInputs;\n }\n\n // validate dims requirements\n // First session run - graph input data is not cached for the session\n if (!this.context.graphInputTypes || this.context.graphInputTypes.length === 0 || !this.context.graphInputDims ||\n this.context.graphInputDims.length === 0) {\n const modelInputIndices = this._model.graph.getInputIndices();\n const modelValues = this._model.graph.getValues();\n\n const graphInputDims = new Array(modelInputIndices.length);\n\n for (let i = 0; i < modelInputIndices.length; ++i) {\n const graphInput = modelValues[modelInputIndices[i]];\n graphInputDims[i] = graphInput.type!.shape.dims;\n\n // cached for second and subsequent runs.\n // Some parts of the framework works on the assumption that the graph and types and shapes are static\n this.context.graphInputTypes!.push(graphInput.type!.tensorType);\n this.context.graphInputDims!.push(inputs[i].dims);\n }\n\n this.validateInputTensorDims(graphInputDims, inputs, true);\n }\n\n // Second and subsequent session runs - graph input data is cached for the session\n else {\n this.validateInputTensorDims(this.context.graphInputDims, inputs, false);\n }\n\n // validate types requirement\n this.validateInputTensorTypes(this.context.graphInputTypes!, inputs);\n\n return inputs;\n }\n\n private validateInputTensorTypes(graphInputTypes: Tensor.DataType[], givenInputs: Tensor[]) {\n for (let i = 0; i < givenInputs.length; i++) {\n const expectedType = graphInputTypes[i];\n const actualType = givenInputs[i].type;\n if (expectedType !== actualType) {\n throw new Error(`input tensor[${i}] check failed: expected type '${expectedType}' but got ${actualType}`);\n }\n }\n }\n\n private validateInputTensorDims(\n graphInputDims: Array, givenInputs: Tensor[], noneDimSupported: boolean) {\n for (let i = 0; i < givenInputs.length; i++) {\n const expectedDims = graphInputDims[i];\n const actualDims = givenInputs[i].dims;\n if (!this.compareTensorDims(expectedDims, actualDims, noneDimSupported)) {\n throw new Error(`input tensor[${i}] check failed: expected shape '[${expectedDims.join(',')}]' but got [${\n actualDims.join(',')}]`);\n }\n }\n }\n\n private compareTensorDims(expectedDims: readonly number[], actualDims: readonly number[], noneDimSupported: boolean):\n boolean {\n if (expectedDims.length !== actualDims.length) {\n return false;\n }\n\n for (let i = 0; i < expectedDims.length; ++i) {\n if (expectedDims[i] !== actualDims[i] && (!noneDimSupported || expectedDims[i] !== 0)) {\n // data shape mis-match AND not a 'None' dimension.\n return false;\n }\n }\n\n return true;\n }\n\n private createOutput(outputTensors: Tensor[]): Map {\n const modelOutputNames = this._model.graph.getOutputNames();\n if (outputTensors.length !== modelOutputNames.length) {\n throw new Error('expected number of outputs do not match number of generated outputs');\n }\n\n const output = new Map();\n for (let i = 0; i < modelOutputNames.length; ++i) {\n output.set(modelOutputNames[i], outputTensors[i]);\n }\n\n return output;\n }\n\n private initializeOps(graph: Graph): void {\n const nodes = graph.getNodes();\n this._ops = new Array(nodes.length);\n\n for (let i = 0; i < nodes.length; i++) {\n this._ops[i] = this.sessionHandler.resolve(nodes[i], this._model.opsets, graph);\n }\n }\n\n private _model: Model;\n private _initialized: boolean;\n\n private _ops: Operator[];\n private _executionPlan: ExecutionPlan;\n\n private backendHint?: string;\n\n private sessionHandler: SessionHandlerType;\n private context: Session.Context;\n private profiler: Readonly;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession, InferenceSessionHandler, SessionHandler, Tensor} from 'onnxruntime-common';\n\nimport {Session} from './session';\nimport {Tensor as OnnxjsTensor} from './tensor';\n\nexport class OnnxjsSessionHandler implements InferenceSessionHandler {\n constructor(private session: Session) {\n this.inputNames = this.session.inputNames;\n this.outputNames = this.session.outputNames;\n }\n\n async dispose(): Promise {}\n inputNames: readonly string[];\n outputNames: readonly string[];\n async run(\n feeds: SessionHandler.FeedsType, _fetches: SessionHandler.FetchesType,\n _options: InferenceSession.RunOptions): Promise {\n const inputMap = new Map();\n for (const name in feeds) {\n if (Object.hasOwnProperty.call(feeds, name)) {\n const feed = feeds[name];\n inputMap.set(\n name,\n new OnnxjsTensor(\n feed.dims, feed.type as OnnxjsTensor.DataType, undefined, undefined,\n feed.data as OnnxjsTensor.NumberType));\n }\n }\n const outputMap = await this.session.run(inputMap);\n const output: SessionHandler.ReturnType = {};\n outputMap.forEach((tensor, name) => {\n output[name] = new Tensor(tensor.type, tensor.data, tensor.dims);\n });\n return output;\n }\n startProfiling(): void {\n this.session.startProfiling();\n }\n endProfiling(): void {\n this.session.endProfiling();\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/* eslint-disable import/no-internal-modules */\nimport {Backend, InferenceSession, InferenceSessionHandler} from 'onnxruntime-common';\n\nimport {Session} from './onnxjs/session';\nimport {OnnxjsSessionHandler} from './onnxjs/session-handler-inference';\n\nclass OnnxjsBackend implements Backend {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n async init(): Promise {}\n\n async createInferenceSessionHandler(pathOrBuffer: string|Uint8Array, options?: InferenceSession.SessionOptions):\n Promise {\n // NOTE: Session.Config(from onnx.js) is not compatible with InferenceSession.SessionOptions(from\n // onnxruntime-common).\n // In future we should remove Session.Config and use InferenceSession.SessionOptions.\n // Currently we allow this to happen to make test runner work.\n const session = new Session(options as unknown as Session.Config);\n\n // typescript cannot merge method override correctly (so far in 4.2.3). need if-else to call the method.\n if (typeof pathOrBuffer === 'string') {\n await session.loadModel(pathOrBuffer);\n } else {\n await session.loadModel(pathOrBuffer);\n }\n\n return new OnnxjsSessionHandler(session);\n }\n}\n\nexport const onnxjsBackend = new OnnxjsBackend();\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport const isNode = !!(typeof process !== 'undefined' && process.versions && process.versions.node);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/// \n\n//\n// * type hack for \"HTMLImageElement\"\n//\n// in typescript, the type of \"HTMLImageElement\" is defined in lib.dom.d.ts, which is conflict with lib.webworker.d.ts.\n// when we use webworker, the lib.webworker.d.ts will be used, which does not have HTMLImageElement defined.\n//\n// we will get the following errors complaining that HTMLImageElement is not defined:\n//\n// ====================================================================================================================\n//\n// ../common/dist/cjs/tensor-factory.d.ts:187:29 - error TS2552: Cannot find name 'HTMLImageElement'. Did you mean\n// 'HTMLLIElement'?\n//\n// 187 fromImage(imageElement: HTMLImageElement, options?: TensorFromImageElementOptions):\n// Promise | TypedTensor<'uint8'>>;\n// ~~~~~~~~~~~~~~~~\n//\n// node_modules/@webgpu/types/dist/index.d.ts:83:7 - error TS2552: Cannot find name 'HTMLImageElement'. Did you mean\n// 'HTMLLIElement'?\n//\n// 83 | HTMLImageElement\n// ~~~~~~~~~~~~~~~~\n//\n// ====================================================================================================================\n//\n// `HTMLImageElement` is only used in type declaration and not in real code. So we define it as `unknown` here to\n// bypass the type check.\n\n//\n// * type hack for \"document\"\n//\n// in typescript, the type of \"document\" is defined in lib.dom.d.ts, so it's not available in webworker.\n//\n// we will get the following errors complaining that document is not defined:\n//\n// ====================================================================================================================\n//\n// lib/wasm/wasm-utils-import.ts:7:33 - error TS2584: Cannot find name 'document'. Do you need to change your target\n// library? Try changing the 'lib' compiler option to include 'dom'.\n//\n// 7 export const scriptSrc = typeof document !== 'undefined' ? (document?.currentScript as HTMLScriptElement)?.src :\n// ~~~~~~~~\n//\n// lib/wasm/wasm-utils-import.ts:7:61 - error TS2584: Cannot find name 'document'. Do you need to change your target\n// library? Try changing the 'lib' compiler option to include 'dom'.\n//\n// 7 export const scriptSrc = typeof document !== 'undefined' ? (document?.currentScript as HTMLScriptElement)?.src :\n// ~~~~~~~~\n//\n// lib/wasm/wasm-utils-import.ts:7:88 - error TS2552: Cannot find name 'HTMLScriptElement'. Did you mean\n// 'HTMLLIElement'?\n//\n// 7 export const scriptSrc = typeof document !== 'undefined' ? (document?.currentScript as HTMLScriptElement)?.src :\n// ~~~~~~~~~~~~~~~~~\n// ====================================================================================================================\n//\n// `document` is used to get the current script URL, which is not available in webworker. This file is served as a\n// \"dual\" file for entries of both webworker and the esm module.\n//\ndeclare global {\n type HTMLImageElement = unknown;\n type HTMLScriptElement = {src?: string};\n const document: undefined|{currentScript?: HTMLScriptElement};\n}\n\n/**\n * @summary\n *\n * This file is served as a \"dual\" file for both entries of the following:\n * - The proxy worker itself.\n * - When used as a worker, it listens to the messages from the main thread and performs the corresponding operations.\n * - Should be imported directly using `new Worker()` in the main thread.\n *\n * - The ESM module that creates the proxy worker (as a worker launcher).\n * - When used as a worker launcher, it creates the proxy worker and returns it.\n * - Should be imported using `import()` in the main thread, with the query parameter `import=1`.\n *\n * This file will be always compiling into ESM format.\n */\n\nimport type {OrtWasmMessage, SerializableTensorMetadata} from '../proxy-messages.js';\nimport {createSession, copyFromExternalBuffer, endProfiling, extractTransferableBuffers, initEp, initRuntime, releaseSession, run} from '../wasm-core-impl.js';\nimport {initializeWebAssembly} from '../wasm-factory.js';\nimport {scriptSrc} from '../wasm-utils-import.js';\n\nconst WORKER_NAME = 'ort-wasm-proxy-worker';\nconst isProxyWorker = globalThis.self?.name === WORKER_NAME;\n\nif (isProxyWorker) {\n // Worker thread\n self.onmessage = (ev: MessageEvent): void => {\n const {type, in : message} = ev.data;\n try {\n switch (type) {\n case 'init-wasm':\n initializeWebAssembly(message!.wasm)\n .then(\n () => {\n initRuntime(message!).then(\n () => {\n postMessage({type});\n },\n err => {\n postMessage({type, err});\n });\n },\n err => {\n postMessage({type, err});\n });\n break;\n case 'init-ep': {\n const {epName, env} = message!;\n initEp(env, epName)\n .then(\n () => {\n postMessage({type});\n },\n err => {\n postMessage({type, err});\n });\n break;\n }\n case 'copy-from': {\n const {buffer} = message!;\n const bufferData = copyFromExternalBuffer(buffer);\n postMessage({type, out: bufferData} as OrtWasmMessage);\n break;\n }\n case 'create': {\n const {model, options} = message!;\n createSession(model, options)\n .then(\n sessionMetadata => {\n postMessage({type, out: sessionMetadata} as OrtWasmMessage);\n },\n err => {\n postMessage({type, err});\n });\n break;\n }\n case 'release':\n releaseSession(message!);\n postMessage({type});\n break;\n case 'run': {\n const {sessionId, inputIndices, inputs, outputIndices, options} = message!;\n run(sessionId, inputIndices, inputs, outputIndices, new Array(outputIndices.length).fill(null), options)\n .then(\n outputs => {\n if (outputs.some(o => o[3] !== 'cpu')) {\n postMessage({type, err: 'Proxy does not support non-cpu tensor location.'});\n } else {\n postMessage(\n {type, out: outputs} as OrtWasmMessage,\n extractTransferableBuffers([...inputs, ...outputs] as SerializableTensorMetadata[]));\n }\n },\n err => {\n postMessage({type, err});\n });\n break;\n }\n case 'end-profiling':\n endProfiling(message!);\n postMessage({type});\n break;\n default:\n }\n } catch (err) {\n postMessage({type, err} as OrtWasmMessage);\n }\n };\n}\n\nexport default isProxyWorker ?\n null :\n (urlOverride?: string) =>\n new Worker(urlOverride ?? scriptSrc!, {type: BUILD_DEFS.IS_ESM ? 'module' : 'classic', name: WORKER_NAME});\n", "var e,r=(e=import.meta.url,async function(r={}){function t(){return x.buffer!=R.buffer&&L(),R}function n(){return x.buffer!=R.buffer&&L(),H}function a(){return x.buffer!=R.buffer&&L(),D}function o(){return x.buffer!=R.buffer&&L(),F}function i(){return x.buffer!=R.buffer&&L(),P}function s(){return x.buffer!=R.buffer&&L(),B}function u(){return x.buffer!=R.buffer&&L(),I}function f(){return x.buffer!=R.buffer&&L(),$}var l,c,d=Object.assign({},r),b=new Promise(((e,r)=>{l=e,c=r})),m=\"object\"==typeof window,p=\"function\"==typeof importScripts,h=p&&\"em-pthread\"==self.name;d.mountExternalData=(e,r)=>{(d.Fb||(d.Fb=new Map)).set(e,r)},d.unmountExternalData=()=>{delete d.Fb};var g=globalThis.SharedArrayBuffer??new WebAssembly.Memory({initial:0,maximum:0,shared:!0}).buffer.constructor;let v=()=>{const e=(e,r,t)=>(...n)=>{const a=zr,o=r?.();n=e(...n);const i=r?.();return o!==i&&(e=i,t(o),r=t=null),zr!=a?new Promise(((e,r)=>{Qr={resolve:e,reject:r}})):n},r=e=>async(...r)=>{try{if(d.Eb)throw Error(\"Session already started\");const t=d.Eb={bc:r[0],errors:[]},n=await e(...r);if(d.Eb!==t)throw Error(\"Session mismatch\");d.Mb?.flush();const a=t.errors;if(0e)),0d._OrtCreateSession),(e=>d._OrtCreateSession=e)),d._OrtRun=r(e(d._OrtRun,(()=>d._OrtRun),(e=>d._OrtRun=e))),d._OrtRunWithBinding=r(e(d._OrtRunWithBinding,(()=>d._OrtRunWithBinding),(e=>d._OrtRunWithBinding=e))),d._OrtBindInput=e(d._OrtBindInput,(()=>d._OrtBindInput),(e=>d._OrtBindInput=e)),v=void 0};d.jsepInit=(e,r)=>{if(v?.(),\"webgpu\"===e){[d.Mb,d.Tb,d.Xb,d.Nb,d.Wb,d.jb,d.Yb,d.$b,d.Ub,d.Vb,d.Zb]=r;const e=d.Mb;d.jsepRegisterBuffer=(r,t,n,a)=>e.registerBuffer(r,t,n,a),d.jsepGetBuffer=r=>e.getBuffer(r),d.jsepCreateDownloader=(r,t,n)=>e.createDownloader(r,t,n),d.jsepOnReleaseSession=r=>{e.onReleaseSession(r)},d.jsepOnRunStart=r=>e.onRunStart(r)}};var y,w,A=Object.assign({},d),_=\"./this.program\",C=(e,r)=>{throw r},O=\"\";(m||p)&&(p?O=self.location.href:\"undefined\"!=typeof document&&document.currentScript&&(O=document.currentScript.src),e&&(O=e),O=O.startsWith(\"blob:\")?\"\":O.substr(0,O.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1),e=>{var r=new XMLHttpRequest;return r.open(\"GET\",e,!1),r.send(null),r.responseText},p&&(w=e=>{var r=new XMLHttpRequest;return r.open(\"GET\",e,!1),r.responseType=\"arraybuffer\",r.send(null),new Uint8Array(r.response)}),y=(e,r,t)=>{var n=new XMLHttpRequest;n.open(\"GET\",e,!0),n.responseType=\"arraybuffer\",n.onload=()=>{200==n.status||0==n.status&&n.response?r(n.response):t()},n.onerror=t,n.send(null)});var j=console.log.bind(console),T=console.error.bind(console),S=j,W=T;if(Object.assign(d,A),A=null,h){var E,M=!1;function Pn(e){try{var r=e.data,t=r.cmd;if(\"load\"===t){let e=[];self.onmessage=r=>e.push(r),self.startWorker=()=>{postMessage({cmd:\"loaded\"});for(let r of e)Pn(r);self.onmessage=Pn};for(const e of r.handlers)d[e]&&!d[e].proxy||(d[e]=(...r)=>{postMessage({Lb:\"callHandler\",kc:e,args:r})},\"print\"==e&&(S=d[e]),\"printErr\"==e&&(W=d[e]));x=r.wasmMemory,L(),E(r.wasmModule)}else if(\"run\"===t){_n(r.pthread_ptr,0,0,1,0,0),Rr(r.pthread_ptr),Te(),_e(),M||(gn(),M=!0);try{Se(r.start_routine,r.arg)}catch(e){if(\"unwind\"!=e)throw e}}else\"cancel\"===t?yn()&&Tn(-1):\"setimmediate\"!==r.target&&(\"checkMailbox\"===t?M&&Hr():t&&(W(`worker: received unknown command ${t}`),W(r)))}catch(e){throw Cn(),e}}W=function(...e){e=e.join(\" \"),console.error(e)},self.alert=function(...e){postMessage({Lb:\"alert\",text:e.join(\" \"),mc:yn()})},d.instantiateWasm=(e,r)=>new Promise((e=>{E=t=>{t=new WebAssembly.Instance(t,oe()),r(t),e()}})),self.onunhandledrejection=e=>{throw e.reason||e},self.onmessage=Pn}var x,N,k,R,H,D,F,P,B,I,U,G,$,Y=!1;function L(){var e=x.buffer;d.HEAP8=R=new Int8Array(e),d.HEAP16=D=new Int16Array(e),d.HEAPU8=H=new Uint8Array(e),d.HEAPU16=F=new Uint16Array(e),d.HEAP32=P=new Int32Array(e),d.HEAPU32=B=new Uint32Array(e),d.HEAPF32=I=new Float32Array(e),d.HEAPF64=$=new Float64Array(e),d.HEAP64=U=new BigInt64Array(e),d.HEAPU64=G=new BigUint64Array(e)}if(!h){if(d.wasmMemory)x=d.wasmMemory;else if(!((x=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0})).buffer instanceof g))throw W(\"requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag\"),Error(\"bad memory\");L()}var z=[],V=[],q=[],J=0,X=null,K=null;function Q(){if(0==--J&&(null!==X&&(clearInterval(X),X=null),K)){var e=K;K=null,e()}}function Z(e){throw W(e=\"Aborted(\"+e+\")\"),Y=!0,k=1,e=new WebAssembly.RuntimeError(e+\". Build with -sASSERTIONS for more info.\"),c(e),e}var ee,re=e=>e.startsWith(\"data:application/octet-stream;base64,\"),te=e=>e.startsWith(\"file://\");function ne(e){if(w)return w(e);throw\"both async and sync fetching of the wasm failed\"}function ae(e,r,t){return function(e){if(m||p){if(\"function\"==typeof fetch&&!te(e))return fetch(e,{credentials:\"same-origin\"}).then((r=>{if(!r.ok)throw`failed to load wasm binary file at '${e}'`;return r.arrayBuffer()})).catch((()=>ne(e)));if(y)return new Promise(((r,t)=>{y(e,(e=>r(new Uint8Array(e))),t)}))}return Promise.resolve().then((()=>ne(e)))}(e).then((e=>WebAssembly.instantiate(e,r))).then(t,(e=>{W(`failed to asynchronously prepare wasm: ${e}`),Z(e)}))}function oe(){return{a:{M:ue,za:se,b:Ee,$:xe,z:He,pa:De,X:Ie,Z:Ue,qa:Ge,na:$e,ga:Ye,ma:Le,J:ze,Y:Ve,V:qe,oa:Je,W:Xe,va:Ze,D:ir,P:ur,O:hr,C:vr,s:yr,p:wr,E:Ar,y:Er,Q:Mr,ta:xr,ja:Nr,T:Dr,aa:Pr,F:Br,ia:Rr,sa:Ir,u:$r,B:rt,o:nt,k:it,c:cr,n:ut,j:dt,Aa:bt,r:mt,d:pt,v:ht,m:gt,g:vt,l:yt,i:wt,h:At,e:_t,da:Ct,ea:St,fa:Wt,ba:Et,ca:Mt,S:xt,f:Rt,N:Ht,G:Dt,K:Ft,w:Pt,ra:It,U:Ut,t:Bt,x:Gt,L:$t,R:Yt,ya:qt,xa:Jt,ka:Zt,la:en,_:he,A:rn,I:tn,ha:nn,H:on,a:x,wa:me,ua:ln,q:cn}}}var ie={1337716:(e,r,t,a)=>{if(void 0===d||!d.Fb)return 1;if((e=Re(e>>>0)).startsWith(\"./\")&&(e=e.substring(2)),!(e=d.Fb.get(e)))return 2;if(a>>>=0,(r>>>=0)+(t>>>=0)>e.byteLength)return 3;try{return n().set(e.subarray(r,r+t),a>>>0),0}catch{return 4}},1338217:()=>{d.Ub()},1338248:()=>{d.Vb()},1338277:()=>{d.Zb()},1338302:e=>d.Tb(e),1338335:e=>d.Xb(e),1338367:(e,r,t)=>{d.Nb(e,r,t,!0)},1338406:(e,r,t)=>{d.Nb(e,r,t)},1338439:()=>\"undefined\"!=typeof wasmOffsetConverter,1338496:e=>{d.jb(\"Abs\",e,void 0)},1338547:e=>{d.jb(\"Neg\",e,void 0)},1338598:e=>{d.jb(\"Floor\",e,void 0)},1338651:e=>{d.jb(\"Ceil\",e,void 0)},1338703:e=>{d.jb(\"Reciprocal\",e,void 0)},1338761:e=>{d.jb(\"Sqrt\",e,void 0)},1338813:e=>{d.jb(\"Exp\",e,void 0)},1338864:e=>{d.jb(\"Erf\",e,void 0)},1338915:e=>{d.jb(\"Sigmoid\",e,void 0)},1338970:(e,r,t)=>{d.jb(\"HardSigmoid\",e,{alpha:r,beta:t})},1339049:e=>{d.jb(\"Log\",e,void 0)},1339100:e=>{d.jb(\"Sin\",e,void 0)},1339151:e=>{d.jb(\"Cos\",e,void 0)},1339202:e=>{d.jb(\"Tan\",e,void 0)},1339253:e=>{d.jb(\"Asin\",e,void 0)},1339305:e=>{d.jb(\"Acos\",e,void 0)},1339357:e=>{d.jb(\"Atan\",e,void 0)},1339409:e=>{d.jb(\"Sinh\",e,void 0)},1339461:e=>{d.jb(\"Cosh\",e,void 0)},1339513:e=>{d.jb(\"Asinh\",e,void 0)},1339566:e=>{d.jb(\"Acosh\",e,void 0)},1339619:e=>{d.jb(\"Atanh\",e,void 0)},1339672:e=>{d.jb(\"Tanh\",e,void 0)},1339724:e=>{d.jb(\"Not\",e,void 0)},1339775:(e,r,t)=>{d.jb(\"Clip\",e,{min:r,max:t})},1339844:e=>{d.jb(\"Clip\",e,void 0)},1339896:(e,r)=>{d.jb(\"Elu\",e,{alpha:r})},1339954:e=>{d.jb(\"Relu\",e,void 0)},1340006:(e,r)=>{d.jb(\"LeakyRelu\",e,{alpha:r})},1340070:(e,r)=>{d.jb(\"ThresholdedRelu\",e,{alpha:r})},1340140:(e,r)=>{d.jb(\"Cast\",e,{to:r})},1340198:e=>{d.jb(\"Add\",e,void 0)},1340249:e=>{d.jb(\"Sub\",e,void 0)},1340300:e=>{d.jb(\"Mul\",e,void 0)},1340351:e=>{d.jb(\"Div\",e,void 0)},1340402:e=>{d.jb(\"Pow\",e,void 0)},1340453:e=>{d.jb(\"Equal\",e,void 0)},1340506:e=>{d.jb(\"Greater\",e,void 0)},1340561:e=>{d.jb(\"GreaterOrEqual\",e,void 0)},1340623:e=>{d.jb(\"Less\",e,void 0)},1340675:e=>{d.jb(\"LessOrEqual\",e,void 0)},1340734:(e,r,t,n,a)=>{d.jb(\"ReduceMean\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1340893:(e,r,t,n,a)=>{d.jb(\"ReduceMax\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1341051:(e,r,t,n,a)=>{d.jb(\"ReduceMin\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1341209:(e,r,t,n,a)=>{d.jb(\"ReduceProd\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1341368:(e,r,t,n,a)=>{d.jb(\"ReduceSum\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1341526:(e,r,t,n,a)=>{d.jb(\"ReduceL1\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1341683:(e,r,t,n,a)=>{d.jb(\"ReduceL2\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1341840:(e,r,t,n,a)=>{d.jb(\"ReduceLogSum\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1342001:(e,r,t,n,a)=>{d.jb(\"ReduceSumSquare\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1342165:(e,r,t,n,a)=>{d.jb(\"ReduceLogSumExp\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1342329:e=>{d.jb(\"Where\",e,void 0)},1342382:(e,r,t)=>{d.jb(\"Transpose\",e,{perm:r?Array.from(i().subarray(r>>>0,t>>>0)):[]})},1342490:(e,r,t,n)=>{d.jb(\"DepthToSpace\",e,{blocksize:r,mode:Re(t),format:n?\"NHWC\":\"NCHW\"})},1342623:(e,r,t,n)=>{d.jb(\"DepthToSpace\",e,{blocksize:r,mode:Re(t),format:n?\"NHWC\":\"NCHW\"})},1342756:(e,r,n,a,o,s,u,f,l,c,b,m,p,h,g)=>{d.jb(\"ConvTranspose\",e,{format:l?\"NHWC\":\"NCHW\",autoPad:r,dilations:[n],group:a,kernelShape:[o],pads:[s,u],strides:[f],wIsConst:()=>!!t()[c>>>0],outputPadding:b?Array.from(i().subarray(b>>>0,m>>>0)):[],outputShape:p?Array.from(i().subarray(p>>>0,h>>>0)):[],activation:Re(g)})},1343157:(e,r,n,a,o,s,u,f,l,c,b,m,p,h)=>{d.jb(\"ConvTranspose\",e,{format:f?\"NHWC\":\"NCHW\",autoPad:r,dilations:Array.from(i().subarray(n>>>0,2+(n>>>0)>>>0)),group:a,kernelShape:Array.from(i().subarray(o>>>0,2+(o>>>0)>>>0)),pads:Array.from(i().subarray(s>>>0,4+(s>>>0)>>>0)),strides:Array.from(i().subarray(u>>>0,2+(u>>>0)>>>0)),wIsConst:()=>!!t()[l>>>0],outputPadding:c?Array.from(i().subarray(c>>>0,b>>>0)):[],outputShape:m?Array.from(i().subarray(m>>>0,p>>>0)):[],activation:Re(h)})},1343722:(e,r,n,a,o,s,u,f,l,c,b,m,p,h,g)=>{d.jb(\"ConvTranspose\",e,{format:l?\"NHWC\":\"NCHW\",autoPad:r,dilations:[n],group:a,kernelShape:[o],pads:[s,u],strides:[f],wIsConst:()=>!!t()[c>>>0],outputPadding:b?Array.from(i().subarray(b>>>0,m>>>0)):[],outputShape:p?Array.from(i().subarray(p>>>0,h>>>0)):[],activation:Re(g)})},1344123:(e,r,n,a,o,s,u,f,l,c,b,m,p,h)=>{d.jb(\"ConvTranspose\",e,{format:f?\"NHWC\":\"NCHW\",autoPad:r,dilations:Array.from(i().subarray(n>>>0,2+(n>>>0)>>>0)),group:a,kernelShape:Array.from(i().subarray(o>>>0,2+(o>>>0)>>>0)),pads:Array.from(i().subarray(s>>>0,4+(s>>>0)>>>0)),strides:Array.from(i().subarray(u>>>0,2+(u>>>0)>>>0)),wIsConst:()=>!!t()[l>>>0],outputPadding:c?Array.from(i().subarray(c>>>0,b>>>0)):[],outputShape:m?Array.from(i().subarray(m>>>0,p>>>0)):[],activation:Re(h)})},1344688:(e,r)=>{d.jb(\"GlobalAveragePool\",e,{format:r?\"NHWC\":\"NCHW\"})},1344779:(e,r,t,n,a,o,i,s,u,f,l,c,b,m,p,h)=>{d.jb(\"AveragePool\",e,{format:h?\"NHWC\":\"NCHW\",auto_pad:r,ceil_mode:t,count_include_pad:n,storage_order:a,dilations:[o,i],kernel_shape:[s,u],pads:[f,l,c,b],strides:[m,p]})},1345063:(e,r)=>{d.jb(\"GlobalAveragePool\",e,{format:r?\"NHWC\":\"NCHW\"})},1345154:(e,r,t,n,a,o,i,s,u,f,l,c,b,m,p,h)=>{d.jb(\"AveragePool\",e,{format:h?\"NHWC\":\"NCHW\",auto_pad:r,ceil_mode:t,count_include_pad:n,storage_order:a,dilations:[o,i],kernel_shape:[s,u],pads:[f,l,c,b],strides:[m,p]})},1345438:(e,r)=>{d.jb(\"GlobalMaxPool\",e,{format:r?\"NHWC\":\"NCHW\"})},1345525:(e,r,t,n,a,o,i,s,u,f,l,c,b,m,p,h)=>{d.jb(\"MaxPool\",e,{format:h?\"NHWC\":\"NCHW\",auto_pad:r,ceil_mode:t,count_include_pad:n,storage_order:a,dilations:[o,i],kernel_shape:[s,u],pads:[f,l,c,b],strides:[m,p]})},1345805:(e,r)=>{d.jb(\"GlobalMaxPool\",e,{format:r?\"NHWC\":\"NCHW\"})},1345892:(e,r,t,n,a,o,i,s,u,f,l,c,b,m,p,h)=>{d.jb(\"MaxPool\",e,{format:h?\"NHWC\":\"NCHW\",auto_pad:r,ceil_mode:t,count_include_pad:n,storage_order:a,dilations:[o,i],kernel_shape:[s,u],pads:[f,l,c,b],strides:[m,p]})},1346172:(e,r,t,n,a)=>{d.jb(\"Gemm\",e,{alpha:r,beta:t,transA:n,transB:a})},1346276:e=>{d.jb(\"MatMul\",e,void 0)},1346330:(e,r,t,n)=>{d.jb(\"ArgMax\",e,{keepDims:!!r,selectLastIndex:!!t,axis:n})},1346438:(e,r,t,n)=>{d.jb(\"ArgMin\",e,{keepDims:!!r,selectLastIndex:!!t,axis:n})},1346546:(e,r)=>{d.jb(\"Softmax\",e,{axis:r})},1346609:(e,r)=>{d.jb(\"Concat\",e,{axis:r})},1346669:(e,r,t,n,a)=>{d.jb(\"Split\",e,{axis:r,numOutputs:t,splitSizes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1346809:e=>{d.jb(\"Expand\",e,void 0)},1346863:(e,r)=>{d.jb(\"Gather\",e,{axis:Number(r)})},1346934:(e,r)=>{d.jb(\"GatherElements\",e,{axis:Number(r)})},1347013:(e,r,t,n,a,o,s,u,f,l,c)=>{d.jb(\"Resize\",e,{antialias:r,axes:t?Array.from(i().subarray(t>>>0,n>>>0)):[],coordinateTransformMode:Re(a),cubicCoeffA:o,excludeOutside:s,extrapolationValue:u,keepAspectRatioPolicy:Re(f),mode:Re(l),nearestMode:Re(c)})},1347359:(e,r,t,n,a,o,s)=>{d.jb(\"Slice\",e,{starts:r?Array.from(i().subarray(r>>>0,t>>>0)):[],ends:n?Array.from(i().subarray(n>>>0,a>>>0)):[],axes:o?Array.from(i().subarray(o>>>0,s>>>0)):[]})},1347575:e=>{d.jb(\"Tile\",e,void 0)},1347627:(e,r,t)=>{d.jb(\"InstanceNormalization\",e,{epsilon:r,format:t?\"NHWC\":\"NCHW\"})},1347741:(e,r,t)=>{d.jb(\"InstanceNormalization\",e,{epsilon:r,format:t?\"NHWC\":\"NCHW\"})},1347855:e=>{d.jb(\"Range\",e,void 0)},1347908:(e,r)=>{d.jb(\"Einsum\",e,{equation:Re(r)})},1347989:(e,r,t,n,a)=>{d.jb(\"Pad\",e,{mode:r,value:t,pads:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1348116:(e,r,t,n,a,o)=>{d.jb(\"BatchNormalization\",e,{epsilon:r,momentum:t,spatial:!!a,trainingMode:!!n,format:o?\"NHWC\":\"NCHW\"})},1348285:(e,r,t,n,a,o)=>{d.jb(\"BatchNormalization\",e,{epsilon:r,momentum:t,spatial:!!a,trainingMode:!!n,format:o?\"NHWC\":\"NCHW\"})},1348454:(e,r,t)=>{d.jb(\"CumSum\",e,{exclusive:Number(r),reverse:Number(t)})},1348551:(e,r,t,n,a,o,s,u,f)=>{d.jb(\"Attention\",e,{numHeads:r,isUnidirectional:t,maskFilterValue:n,scale:a,doRotary:o,qkvHiddenSizes:s?Array.from(i().subarray(Number(u)>>>0,Number(u)+s>>>0)):[],pastPresentShareBuffer:!!f})},1348823:e=>{d.jb(\"BiasAdd\",e,void 0)},1348878:e=>{d.jb(\"BiasSplitGelu\",e,void 0)},1348939:e=>{d.jb(\"FastGelu\",e,void 0)},1348995:(e,r,n,a,o,s,f,l,c,b,m,p,h,g,v,y)=>{d.jb(\"Conv\",e,{format:p?\"NHWC\":\"NCHW\",auto_pad:r,dilations:n?Array.from(i().subarray(n>>>0,a>>>0)):[],group:o,kernel_shape:s?Array.from(i().subarray(s>>>0,f>>>0)):[],pads:l?Array.from(i().subarray(l>>>0,c>>>0)):[],strides:b?Array.from(i().subarray(b>>>0,m>>>0)):[],w_is_const:()=>!!t()[h>>>0],activation:Re(g),activation_params:v?Array.from(u().subarray(v>>>0,y>>>0)):[]})},1349491:e=>{d.jb(\"Gelu\",e,void 0)},1349543:(e,r,t,n)=>{d.jb(\"GroupQueryAttention\",e,{numHeads:r,kvNumHeads:t,scale:n})},1349656:(e,r,t,n)=>{d.jb(\"LayerNormalization\",e,{axis:r,epsilon:t,simplified:!!n})},1349767:(e,r,t,n)=>{d.jb(\"LayerNormalization\",e,{axis:r,epsilon:t,simplified:!!n})},1349878:(e,r,t,n,a,o)=>{d.jb(\"MatMulNBits\",e,{k:r,n:t,accuracyLevel:n,bits:a,blockSize:o})},1350005:(e,r,t,n,a,o)=>{d.jb(\"MultiHeadAttention\",e,{numHeads:r,isUnidirectional:t,maskFilterValue:n,scale:a,doRotary:o})},1350164:(e,r)=>{d.jb(\"QuickGelu\",e,{alpha:r})},1350228:(e,r,t,n,a)=>{d.jb(\"RotaryEmbedding\",e,{interleaved:!!r,numHeads:t,rotaryEmbeddingDim:n,scale:a})},1350367:(e,r,t)=>{d.jb(\"SkipLayerNormalization\",e,{epsilon:r,simplified:!!t})},1350469:e=>{d.Yb(e)},1350503:(e,r)=>d.$b(e,r,d.Eb.bc,d.Eb.errors),1350615:(e,r,t)=>{d.jb(\"SkipLayerNormalization\",e,{epsilon:r,simplified:!!t})}};function se(e,r,t){return et((async()=>{await d.Wb(e,r,t)}))}function ue(){return\"undefined\"!=typeof wasmOffsetConverter}function fe(e){this.name=\"ExitStatus\",this.message=`Program terminated with exit(${e})`,this.status=e}var le=e=>{e.terminate(),e.onmessage=()=>{}},ce=e=>{0==ge.length&&(Oe(),Ce(ge[0]));var r=ge.pop();if(!r)return 6;ve.push(r),we[e.Ab]=r,r.Ab=e.Ab;var t={cmd:\"run\",start_routine:e.cc,arg:e.Pb,pthread_ptr:e.Ab};return r.postMessage(t,e.ic),0},de=0,be=(e,r,...t)=>{for(var n=2*t.length,a=xn(),o=Mn(8*n),i=o>>>3,s=0;s>>0]=u)}return e=On(e,0,n,o,r),En(a),e};function me(e){if(h)return be(0,1,e);if(k=e,!(0{if(k=e,h)throw pe(e),\"unwind\";me(e)},ge=[],ve=[],ye=[],we={},Ae=e=>{var r=e.Ab;delete we[r],ge.push(e),ve.splice(ve.indexOf(e),1),e.Ab=0,jn(r)};function _e(){ye.forEach((e=>e()))}var Ce=e=>new Promise((r=>{e.onmessage=t=>{var n=(t=t.data).cmd;if(t.targetThread&&t.targetThread!=yn()){var a=we[t.targetThread];a?a.postMessage(t,t.transferList):W(`Internal error! Worker sent a message \"${n}\" to target pthread ${t.targetThread}, but that thread no longer exists!`)}else\"checkMailbox\"===n?Hr():\"spawnThread\"===n?ce(t):\"cleanupThread\"===n?Ae(we[t.thread]):\"killThread\"===n?(t=t.thread,n=we[t],delete we[t],le(n),jn(t),ve.splice(ve.indexOf(n),1),n.Ab=0):\"cancelThread\"===n?we[t.thread].postMessage({cmd:\"cancel\"}):\"loaded\"===n?(e.loaded=!0,r(e)):\"alert\"===n?alert(`Thread ${t.threadId}: ${t.text}`):\"setimmediate\"===t.target?e.postMessage(t):\"callHandler\"===n?d[t.handler](...t.args):n&&W(`worker sent an unknown command ${n}`)},e.onerror=e=>{throw W(`worker sent an error! ${e.filename}:${e.lineno}: ${e.message}`),e};var t,n=[];for(t of[\"onExit\"])d.hasOwnProperty(t)&&n.push(t);e.postMessage({cmd:\"load\",handlers:n,wasmMemory:x,wasmModule:N})}));function Oe(){var e=new Worker(new URL(import.meta.url),{type:\"module\",workerData:\"em-pthread\",name:\"em-pthread\"});ge.push(e)}var je=e=>{for(;0{var e=yn(),r=s()[e+52>>>2>>>0];e=s()[e+56>>>2>>>0],Wn(r,r-e),En(r)},Se=(e,r)=>{de=0,e=Nn(e,r),0>>=0);throw r>>>=0,t>>>=0,s()[n.Ib+16>>>2>>>0]=0,s()[n.Ib+4>>>2>>>0]=r,s()[n.Ib+8>>>2>>>0]=t,e}function Me(e,r,t,n){return h?be(2,1,e,r,t,n):xe(e,r,t,n)}function xe(e,r,t,n){if(e>>>=0,r>>>=0,t>>>=0,n>>>=0,void 0===g)return W(\"Current environment does not support SharedArrayBuffer, pthreads are not available!\"),6;var a=[];return h&&0===a.length?Me(e,r,t,n):(e={cc:t,Ab:e,Pb:n,ic:a},h?(e.Lb=\"spawnThread\",postMessage(e,a),0):ce(e))}var Ne=\"undefined\"!=typeof TextDecoder?new TextDecoder(\"utf8\"):void 0,ke=(e,r,t)=>{var n=(r>>>=0)+t;for(t=r;e[t]&&!(t>=n);)++t;if(16(a=224==(240&a)?(15&a)<<12|o<<6|i:(7&a)<<18|o<<12|i<<6|63&e[r++])?n+=String.fromCharCode(a):(a-=65536,n+=String.fromCharCode(55296|a>>10,56320|1023&a))}}else n+=String.fromCharCode(a)}return n},Re=(e,r)=>(e>>>=0)?ke(n(),e,r):\"\";function He(e,r,t){return h?be(3,1,e,r,t):0}function De(e,r){if(h)return be(4,1,e,r)}var Fe=e=>{for(var r=0,t=0;t=n?r++:2047>=n?r+=2:55296<=n&&57343>=n?(r+=4,++t):r+=3}return r},Pe=(e,r,t,n)=>{if(!(0>>=0;n=t+n-1;for(var o=0;o=i&&(i=65536+((1023&i)<<10)|1023&e.charCodeAt(++o)),127>=i){if(t>=n)break;r[t++>>>0]=i}else{if(2047>=i){if(t+1>=n)break;r[t++>>>0]=192|i>>6}else{if(65535>=i){if(t+2>=n)break;r[t++>>>0]=224|i>>12}else{if(t+3>=n)break;r[t++>>>0]=240|i>>18,r[t++>>>0]=128|i>>12&63}r[t++>>>0]=128|i>>6&63}r[t++>>>0]=128|63&i}}return r[t>>>0]=0,t-a},Be=(e,r,t)=>Pe(e,n(),r,t);function Ie(e,r){if(h)return be(5,1,e,r)}function Ue(e,r,t){if(h)return be(6,1,e,r,t)}function Ge(e,r,t){return h?be(7,1,e,r,t):0}function $e(e,r){if(h)return be(8,1,e,r)}function Ye(e,r,t){if(h)return be(9,1,e,r,t)}function Le(e,r,t,n){if(h)return be(10,1,e,r,t,n)}function ze(e,r,t,n){if(h)return be(11,1,e,r,t,n)}function Ve(e,r,t,n){if(h)return be(12,1,e,r,t,n)}function qe(e){if(h)return be(13,1,e)}function Je(e,r){if(h)return be(14,1,e,r)}function Xe(e,r,t){if(h)return be(15,1,e,r,t)}var Ke,Qe,Ze=()=>{Z(\"\")},er=e=>{for(var r=\"\";n()[e>>>0];)r+=Ke[n()[e++>>>0]];return r},rr={},tr={},nr={};function ar(e,r,t={}){if(!(\"argPackAdvance\"in r))throw new TypeError(\"registerType registeredInstance requires argPackAdvance\");return function(e,r,t={}){var n=r.name;if(!e)throw new Qe(`type \"${n}\" must have a positive integer typeid pointer`);if(tr.hasOwnProperty(e)){if(t.Rb)return;throw new Qe(`Cannot register type '${n}' twice`)}tr[e]=r,delete nr[e],rr.hasOwnProperty(e)&&(r=rr[e],delete rr[e],r.forEach((e=>e())))}(e,r,t)}var or=(e,r,u)=>{switch(r){case 1:return u?e=>t()[e>>>0]:e=>n()[e>>>0];case 2:return u?e=>a()[e>>>1>>>0]:e=>o()[e>>>1>>>0];case 4:return u?e=>i()[e>>>2>>>0]:e=>s()[e>>>2>>>0];case 8:return u?e=>U[e>>>3]:e=>G[e>>>3];default:throw new TypeError(`invalid integer width (${r}): ${e}`)}};function ir(e,r,t){t>>>=0,ar(e>>>=0,{name:r=er(r>>>0),fromWireType:e=>e,toWireType:function(e,r){if(\"bigint\"!=typeof r&&\"number\"!=typeof r)throw r=null===r?\"null\":\"object\"==(e=typeof r)||\"array\"===e||\"function\"===e?r.toString():\"\"+r,new TypeError(`Cannot convert \"${r}\" to ${this.name}`);return\"number\"==typeof r&&(r=BigInt(r)),r},argPackAdvance:sr,readValueFromPointer:or(r,t,-1==r.indexOf(\"u\")),Db:null})}var sr=8;function ur(e,r,t,a){ar(e>>>=0,{name:r=er(r>>>0),fromWireType:function(e){return!!e},toWireType:function(e,r){return r?t:a},argPackAdvance:sr,readValueFromPointer:function(e){return this.fromWireType(n()[e>>>0])},Db:null})}var fr=[],lr=[];function cr(e){9<(e>>>=0)&&0==--lr[e+1]&&(lr[e]=void 0,fr.push(e))}var dr=e=>{if(!e)throw new Qe(\"Cannot use deleted val. handle = \"+e);return lr[e]},br=e=>{switch(e){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:const r=fr.pop()||lr.length;return lr[r]=e,lr[r+1]=1,r}};function mr(e){return this.fromWireType(s()[e>>>2>>>0])}var pr={name:\"emscripten::val\",fromWireType:e=>{var r=dr(e);return cr(e),r},toWireType:(e,r)=>br(r),argPackAdvance:sr,readValueFromPointer:mr,Db:null};function hr(e){return ar(e>>>0,pr)}var gr=(e,r)=>{switch(r){case 4:return function(e){return this.fromWireType(u()[e>>>2>>>0])};case 8:return function(e){return this.fromWireType(f()[e>>>3>>>0])};default:throw new TypeError(`invalid float width (${r}): ${e}`)}};function vr(e,r,t){t>>>=0,ar(e>>>=0,{name:r=er(r>>>0),fromWireType:e=>e,toWireType:(e,r)=>r,argPackAdvance:sr,readValueFromPointer:gr(r,t),Db:null})}function yr(e,r,t,n,a){if(e>>>=0,t>>>=0,r=er(r>>>0),-1===a&&(a=4294967295),a=e=>e,0===n){var o=32-8*t;a=e=>e<>>o}var i=r.includes(\"unsigned\")?function(e,r){return r>>>0}:function(e,r){return r};ar(e,{name:r,fromWireType:a,toWireType:i,argPackAdvance:sr,readValueFromPointer:or(r,t,0!==n),Db:null})}function wr(e,r,n){function a(e){var r=s()[e>>>2>>>0];return e=s()[e+4>>>2>>>0],new o(t().buffer,e,r)}var o=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][r];ar(e>>>=0,{name:n=er(n>>>0),fromWireType:a,argPackAdvance:sr,readValueFromPointer:a},{Rb:!0})}function Ar(e,r){e>>>=0;var t=\"std::string\"===(r=er(r>>>0));ar(e,{name:r,fromWireType:function(e){var r=s()[e>>>2>>>0],a=e+4;if(t)for(var o=a,i=0;i<=r;++i){var u=a+i;if(i==r||0==n()[u>>>0]){if(o=Re(o,u-o),void 0===f)var f=o;else f+=String.fromCharCode(0),f+=o;o=u+1}}else{for(f=Array(r),i=0;i>>0]);f=f.join(\"\")}return An(e),f},toWireType:function(e,r){r instanceof ArrayBuffer&&(r=new Uint8Array(r));var a=\"string\"==typeof r;if(!(a||r instanceof Uint8Array||r instanceof Uint8ClampedArray||r instanceof Int8Array))throw new Qe(\"Cannot pass non-string to std::string\");var o=t&&a?Fe(r):r.length,i=wn(4+o+1),u=i+4;if(s()[i>>>2>>>0]=o,t&&a)Be(r,u,o+1);else if(a)for(a=0;a>>0]=f}else for(a=0;a>>0]=r[a];return null!==e&&e.push(An,i),i},argPackAdvance:sr,readValueFromPointer:mr,Db(e){An(e)}})}var _r=\"undefined\"!=typeof TextDecoder?new TextDecoder(\"utf-16le\"):void 0,Cr=(e,r)=>{for(var t=e>>1,i=t+r/2;!(t>=i)&&o()[t>>>0];)++t;if(32<(t<<=1)-e&&_r)return _r.decode(n().slice(e,t));for(t=\"\",i=0;!(i>=r/2);++i){var s=a()[e+2*i>>>1>>>0];if(0==s)break;t+=String.fromCharCode(s)}return t},Or=(e,r,t)=>{if(t??=2147483647,2>t)return 0;var n=r;t=(t-=2)<2*e.length?t/2:e.length;for(var o=0;o>>1>>>0]=i,r+=2}return a()[r>>>1>>>0]=0,r-n},jr=e=>2*e.length,Tr=(e,r)=>{for(var t=0,n=\"\";!(t>=r/4);){var a=i()[e+4*t>>>2>>>0];if(0==a)break;++t,65536<=a?(a-=65536,n+=String.fromCharCode(55296|a>>10,56320|1023&a)):n+=String.fromCharCode(a)}return n},Sr=(e,r,t)=>{if(r>>>=0,t??=2147483647,4>t)return 0;var n=r;t=n+t-4;for(var a=0;a=o&&(o=65536+((1023&o)<<10)|1023&e.charCodeAt(++a)),i()[r>>>2>>>0]=o,(r+=4)+4>t)break}return i()[r>>>2>>>0]=0,r-n},Wr=e=>{for(var r=0,t=0;t=n&&++t,r+=4}return r};function Er(e,r,t){if(e>>>=0,r>>>=0,t=er(t>>>=0),2===r)var n=Cr,a=Or,i=jr,u=e=>o()[e>>>1>>>0];else 4===r&&(n=Tr,a=Sr,i=Wr,u=e=>s()[e>>>2>>>0]);ar(e,{name:t,fromWireType:e=>{for(var t,a=s()[e>>>2>>>0],o=e+4,i=0;i<=a;++i){var f=e+4+i*r;i!=a&&0!=u(f)||(o=n(o,f-o),void 0===t?t=o:(t+=String.fromCharCode(0),t+=o),o=f+r)}return An(e),t},toWireType:(e,n)=>{if(\"string\"!=typeof n)throw new Qe(`Cannot pass non-string to C++ string type ${t}`);var o=i(n),u=wn(4+o+r);return s()[u>>>2>>>0]=o/r,a(n,u+4,o+r),null!==e&&e.push(An,u),u},argPackAdvance:sr,readValueFromPointer:mr,Db(e){An(e)}})}function Mr(e,r){ar(e>>>=0,{Sb:!0,name:r=er(r>>>0),argPackAdvance:0,fromWireType:()=>{},toWireType:()=>{}})}var xr=()=>1;function Nr(e){_n(e>>>0,!p,1,!m,131072,!1),_e()}var kr=e=>{if(!Y)try{if(e(),!(0>>=0,\"function\"==typeof Atomics.jc&&(Atomics.jc(i(),e>>>2,e).value.then(Hr),e+=128,Atomics.store(i(),e>>>2,1))}var Hr=()=>{var e=yn();e&&(Rr(e),kr(Sn))};function Dr(e,r){(e>>>=0)==r>>>0?setTimeout(Hr):h?postMessage({targetThread:e,cmd:\"checkMailbox\"}):(e=we[e])&&e.postMessage({cmd:\"checkMailbox\"})}var Fr=[];function Pr(e,r,t,n,a){for(r>>>=0,n/=2,Fr.length=n,t=a>>>0>>>3,a=0;a>>0];return(r?ie[r]:mn[e])(...Fr)}function Br(e){e>>>=0,h?postMessage({cmd:\"cleanupThread\",thread:e}):Ae(we[e])}function Ir(e){}var Ur=(e,r)=>{var t=tr[e];if(void 0===t)throw e=hn(e),t=er(e),An(e),new Qe(`${r} has unknown type ${t}`);return t},Gr=(e,r,t)=>{var n=[];return e=e.toWireType(n,t),n.length&&(s()[r>>>2>>>0]=br(n)),e};function $r(e,r,t){return r>>>=0,t>>>=0,e=dr(e>>>0),r=Ur(r,\"emval::as\"),Gr(r,t,e)}var Yr=e=>{try{e()}catch(e){Z(e)}},Lr=0,zr=null,Vr=0,qr=[],Jr={},Xr={},Kr=0,Qr=null,Zr=[];function et(e){return function(e){if(!Y){if(0===Lr){var r=!1,t=!1;e(((e=0)=>{if(!Y&&(Vr=e,r=!0,t)){Lr=2,Yr((()=>Hn(zr))),\"undefined\"!=typeof Browser&&Browser.Jb.Qb&&Browser.Jb.resume(),e=!1;try{var n=function(){var e=i()[zr+8>>>2>>>0];return e=pn[Xr[e]],--de,e()}()}catch(r){n=r,e=!0}var a=!1;if(!zr){var o=Qr;o&&(Qr=null,(e?o.reject:o.resolve)(n),a=!0)}if(e&&!a)throw n}})),t=!0,r||(Lr=1,zr=function(){var e=wn(65548),r=e+12;s()[e>>>2>>>0]=r,s()[e+4>>>2>>>0]=r+65536,r=qr[0];var t=Jr[r];return void 0===t&&(t=Kr++,Jr[r]=t,Xr[t]=r),r=t,i()[e+8>>>2>>>0]=r,e}(),\"undefined\"!=typeof Browser&&Browser.Jb.Qb&&Browser.Jb.pause(),Yr((()=>kn(zr))))}else 2===Lr?(Lr=0,Yr(Dn),An(zr),zr=null,Zr.forEach(kr)):Z(`invalid state: ${Lr}`);return Vr}}((r=>{e().then(r)}))}function rt(e){return e>>>=0,et((()=>(e=dr(e)).then(br)))}var tt=[];function nt(e,r,t,n){return t>>>=0,n>>>=0,(e=tt[e>>>0])(null,r=dr(r>>>0),t,n)}var at={},ot=e=>{var r=at[e];return void 0===r?er(e):r};function it(e,r,t,n,a){return t>>>=0,n>>>=0,a>>>=0,(e=tt[e>>>0])(r=dr(r>>>0),r[t=ot(t)],n,a)}var st=()=>\"object\"==typeof globalThis?globalThis:Function(\"return this\")();function ut(e){return 0==(e>>>=0)?br(st()):(e=ot(e),br(st()[e]))}var ft=e=>{var r=tt.length;return tt.push(e),r},lt=(e,r)=>{for(var t=Array(e),n=0;n>>2>>>0],\"parameter \"+n);return t},ct=(e,r)=>Object.defineProperty(r,\"name\",{value:e});function dt(e,r,t){var n=(r=lt(e,r>>>0)).shift();e--;var a=\"return function (obj, func, destructorsRef, args) {\\n\",o=0,i=[];0===t&&i.push(\"obj\");for(var s=[\"retType\"],u=[n],f=0;fe.name)).join(\", \")}) => ${n.name}>`,ft(ct(t,e))}function bt(e){return e=ot(e>>>0),br(d[e])}function mt(e,r){return r>>>=0,e=dr(e>>>0),r=dr(r),br(e[r])}function pt(e){9<(e>>>=0)&&(lr[e+1]+=1)}function ht(){return br([])}function gt(e){e=dr(e>>>0);for(var r=Array(e.length),t=0;t>>0))}function yt(){return br({})}function wt(e){for(var r=dr(e>>>=0);r.length;){var t=r.pop();r.pop()(t)}cr(e)}function At(e,r,t){r>>>=0,t>>>=0,e=dr(e>>>0),r=dr(r),t=dr(t),e[r]=t}function _t(e,r){return r>>>=0,e=(e=Ur(e>>>0,\"_emval_take_value\")).readValueFromPointer(r),br(e)}function Ct(e,r){e=-9007199254740992>e||9007199254740992>>=0,e=new Date(1e3*e),i()[r>>>2>>>0]=e.getUTCSeconds(),i()[r+4>>>2>>>0]=e.getUTCMinutes(),i()[r+8>>>2>>>0]=e.getUTCHours(),i()[r+12>>>2>>>0]=e.getUTCDate(),i()[r+16>>>2>>>0]=e.getUTCMonth(),i()[r+20>>>2>>>0]=e.getUTCFullYear()-1900,i()[r+24>>>2>>>0]=e.getUTCDay(),e=(e.getTime()-Date.UTC(e.getUTCFullYear(),0,1,0,0,0,0))/864e5|0,i()[r+28>>>2>>>0]=e}var Ot=e=>0==e%4&&(0!=e%100||0==e%400),jt=[0,31,60,91,121,152,182,213,244,274,305,335],Tt=[0,31,59,90,120,151,181,212,243,273,304,334];function St(e,r){e=-9007199254740992>e||9007199254740992>>=0,e=new Date(1e3*e),i()[r>>>2>>>0]=e.getSeconds(),i()[r+4>>>2>>>0]=e.getMinutes(),i()[r+8>>>2>>>0]=e.getHours(),i()[r+12>>>2>>>0]=e.getDate(),i()[r+16>>>2>>>0]=e.getMonth(),i()[r+20>>>2>>>0]=e.getFullYear()-1900,i()[r+24>>>2>>>0]=e.getDay();var t=(Ot(e.getFullYear())?jt:Tt)[e.getMonth()]+e.getDate()-1|0;i()[r+28>>>2>>>0]=t,i()[r+36>>>2>>>0]=-60*e.getTimezoneOffset(),t=new Date(e.getFullYear(),6,1).getTimezoneOffset();var n=new Date(e.getFullYear(),0,1).getTimezoneOffset();e=0|(t!=n&&e.getTimezoneOffset()==Math.min(n,t)),i()[r+32>>>2>>>0]=e}function Wt(e){e>>>=0;var r=new Date(i()[e+20>>>2>>>0]+1900,i()[e+16>>>2>>>0],i()[e+12>>>2>>>0],i()[e+8>>>2>>>0],i()[e+4>>>2>>>0],i()[e>>>2>>>0],0),t=i()[e+32>>>2>>>0],n=r.getTimezoneOffset(),a=new Date(r.getFullYear(),6,1).getTimezoneOffset(),o=new Date(r.getFullYear(),0,1).getTimezoneOffset(),s=Math.min(o,a);return 0>t?i()[e+32>>>2>>>0]=Number(a!=o&&s==n):0>>2>>>0]=r.getDay(),t=(Ot(r.getFullYear())?jt:Tt)[r.getMonth()]+r.getDate()-1|0,i()[e+28>>>2>>>0]=t,i()[e>>>2>>>0]=r.getSeconds(),i()[e+4>>>2>>>0]=r.getMinutes(),i()[e+8>>>2>>>0]=r.getHours(),i()[e+12>>>2>>>0]=r.getDate(),i()[e+16>>>2>>>0]=r.getMonth(),i()[e+20>>>2>>>0]=r.getYear(),e=r.getTime(),BigInt(isNaN(e)?-1:e/1e3)}function Et(e,r,t,n,a,o,i){return h?be(16,1,e,r,t,n,a,o,i):-52}function Mt(e,r,t,n,a,o){if(h)return be(17,1,e,r,t,n,a,o)}function xt(e,r,t,n){e>>>=0,r>>>=0,t>>>=0,n>>>=0;var a=(new Date).getFullYear(),o=new Date(a,0,1),u=new Date(a,6,1);a=o.getTimezoneOffset();var f=u.getTimezoneOffset(),l=Math.max(a,f);s()[e>>>2>>>0]=60*l,i()[r>>>2>>>0]=Number(a!=f),o=(e=e=>e.toLocaleTimeString(void 0,{hour12:!1,timeZoneName:\"short\"}).split(\" \")[1])(o),u=e(u),f{Nt.length=0;for(var t;t=n()[e++>>>0];){var a=105!=t;r+=(a&=112!=t)&&r%8?4:0,Nt.push(112==t?s()[r>>>2>>>0]:106==t?U[r>>>3]:105==t?i()[r>>>2>>>0]:f()[r>>>3>>>0]),r+=a?8:4}return Nt};function Rt(e,r,t){return e>>>=0,r=kt(r>>>0,t>>>0),ie[e](...r)}function Ht(e,r,t){return e>>>=0,r=kt(r>>>0,t>>>0),ie[e](...r)}var Dt=()=>{},Ft=()=>Date.now();function Pt(e,r){return W(Re(e>>>0,r>>>0))}var Bt,It=()=>{throw de+=1,\"unwind\"};function Ut(){return 4294901760}Bt=()=>performance.timeOrigin+performance.now();var Gt=()=>navigator.hardwareConcurrency;function $t(){return Z(\"Cannot use emscripten_pc_get_function without -sUSE_OFFSET_CONVERTER\"),0}function Yt(e){e>>>=0;var r=n().length;if(e<=r||4294901760=t;t*=2){var a=r*(1+.2/t);a=Math.min(a,e+100663296);var o=Math;a=Math.max(e,a);e:{o=(o.min.call(o,4294901760,a+(65536-a%65536)%65536)-x.buffer.byteLength+65535)/65536;try{x.grow(o),L();var i=1;break e}catch(e){}i=void 0}if(i)return!0}return!1}var Lt=()=>(Z(\"Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER\"),0),zt={},Vt=e=>{e.forEach((e=>{var r=Lt();r&&(zt[r]=e)}))};function qt(){var e=Error().stack.toString().split(\"\\n\");return\"Error\"==e[0]&&e.shift(),Vt(e),zt.Ob=Lt(),zt.ac=e,zt.Ob}function Jt(e,r,t){if(e>>>=0,r>>>=0,zt.Ob==e)var n=zt.ac;else\"Error\"==(n=Error().stack.toString().split(\"\\n\"))[0]&&n.shift(),Vt(n);for(var a=3;n[a]&&Lt()!=e;)++a;for(e=0;e>>2>>>0]=Lt();return e}var Xt,Kt={},Qt=()=>{if(!Xt){var e,r={USER:\"web_user\",LOGNAME:\"web_user\",PATH:\"/\",PWD:\"/\",HOME:\"/home/web_user\",LANG:(\"object\"==typeof navigator&&navigator.languages&&navigator.languages[0]||\"C\").replace(\"-\",\"_\")+\".UTF-8\",_:_||\"./this.program\"};for(e in Kt)void 0===Kt[e]?delete r[e]:r[e]=Kt[e];var t=[];for(e in r)t.push(`${e}=${r[e]}`);Xt=t}return Xt};function Zt(e,r){if(h)return be(18,1,e,r);e>>>=0,r>>>=0;var n=0;return Qt().forEach(((a,o)=>{var i=r+n;for(o=s()[e+4*o>>>2>>>0]=i,i=0;i>>0]=a.charCodeAt(i);t()[o>>>0]=0,n+=a.length+1})),0}function en(e,r){if(h)return be(19,1,e,r);e>>>=0,r>>>=0;var t=Qt();s()[e>>>2>>>0]=t.length;var n=0;return t.forEach((e=>n+=e.length+1)),s()[r>>>2>>>0]=n,0}function rn(e){return h?be(20,1,e):52}function tn(e,r,t,n){return h?be(21,1,e,r,t,n):52}function nn(e,r,t,n){return h?be(22,1,e,r,t,n):70}var an=[null,[],[]];function on(e,r,t,a){if(h)return be(23,1,e,r,t,a);r>>>=0,t>>>=0,a>>>=0;for(var o=0,i=0;i>>2>>>0],f=s()[r+4>>>2>>>0];r+=8;for(var l=0;l>>0],d=an[e];0===c||10===c?((1===e?S:W)(ke(d,0)),d.length=0):d.push(c)}o+=f}return s()[a>>>2>>>0]=o,0}var sn=[31,29,31,30,31,30,31,31,30,31,30,31],un=[31,28,31,30,31,30,31,31,30,31,30,31],fn=(e,r)=>{t().set(e,r>>>0)};function ln(e,r,t,n){function a(e,r,t){for(e=\"number\"==typeof e?e.toString():e||\"\";e.lengthe?-1:0n-e.getDate())){e.setDate(e.getDate()+r);break}r-=n-e.getDate()+1,e.setDate(1),11>t?e.setMonth(t+1):(e.setMonth(0),e.setFullYear(e.getFullYear()+1))}return t=new Date(e.getFullYear()+1,0,4),r=f(new Date(e.getFullYear(),0,4)),t=f(t),0>=u(r,e)?0>=u(t,e)?e.getFullYear()+1:e.getFullYear():e.getFullYear()-1}e>>>=0,r>>>=0,t>>>=0,n>>>=0;var c=s()[n+40>>>2>>>0];for(var d in n={fc:i()[n>>>2>>>0],ec:i()[n+4>>>2>>>0],Gb:i()[n+8>>>2>>>0],Kb:i()[n+12>>>2>>>0],Hb:i()[n+16>>>2>>>0],Cb:i()[n+20>>>2>>>0],ub:i()[n+24>>>2>>>0],Bb:i()[n+28>>>2>>>0],nc:i()[n+32>>>2>>>0],dc:i()[n+36>>>2>>>0],hc:c?Re(c):\"\"},t=Re(t),c={\"%c\":\"%a %b %d %H:%M:%S %Y\",\"%D\":\"%m/%d/%y\",\"%F\":\"%Y-%m-%d\",\"%h\":\"%b\",\"%r\":\"%I:%M:%S %p\",\"%R\":\"%H:%M\",\"%T\":\"%H:%M:%S\",\"%x\":\"%m/%d/%y\",\"%X\":\"%H:%M:%S\",\"%Ec\":\"%c\",\"%EC\":\"%C\",\"%Ex\":\"%m/%d/%y\",\"%EX\":\"%H:%M:%S\",\"%Ey\":\"%y\",\"%EY\":\"%Y\",\"%Od\":\"%d\",\"%Oe\":\"%e\",\"%OH\":\"%H\",\"%OI\":\"%I\",\"%Om\":\"%m\",\"%OM\":\"%M\",\"%OS\":\"%S\",\"%Ou\":\"%u\",\"%OU\":\"%U\",\"%OV\":\"%V\",\"%Ow\":\"%w\",\"%OW\":\"%W\",\"%Oy\":\"%y\"})t=t.replace(new RegExp(d,\"g\"),c[d]);var b=\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),m=\"January February March April May June July August September October November December\".split(\" \");for(d in c={\"%a\":e=>b[e.ub].substring(0,3),\"%A\":e=>b[e.ub],\"%b\":e=>m[e.Hb].substring(0,3),\"%B\":e=>m[e.Hb],\"%C\":e=>o((e.Cb+1900)/100|0,2),\"%d\":e=>o(e.Kb,2),\"%e\":e=>a(e.Kb,2,\" \"),\"%g\":e=>l(e).toString().substring(2),\"%G\":l,\"%H\":e=>o(e.Gb,2),\"%I\":e=>(0==(e=e.Gb)?e=12:12{for(var r=0,t=0;t<=e.Hb-1;r+=(Ot(e.Cb+1900)?sn:un)[t++]);return o(e.Kb+r,3)},\"%m\":e=>o(e.Hb+1,2),\"%M\":e=>o(e.ec,2),\"%n\":()=>\"\\n\",\"%p\":e=>0<=e.Gb&&12>e.Gb?\"AM\":\"PM\",\"%S\":e=>o(e.fc,2),\"%t\":()=>\"\\t\",\"%u\":e=>e.ub||7,\"%U\":e=>o(Math.floor((e.Bb+7-e.ub)/7),2),\"%V\":e=>{var r=Math.floor((e.Bb+7-(e.ub+6)%7)/7);if(2>=(e.ub+371-e.Bb-2)%7&&r++,r)53==r&&(4==(t=(e.ub+371-e.Bb)%7)||3==t&&Ot(e.Cb)||(r=1));else{r=52;var t=(e.ub+7-e.Bb-1)%7;(4==t||5==t&&Ot(e.Cb%400-1))&&r++}return o(r,2)},\"%w\":e=>e.ub,\"%W\":e=>o(Math.floor((e.Bb+7-(e.ub+6)%7)/7),2),\"%y\":e=>(e.Cb+1900).toString().substring(2),\"%Y\":e=>e.Cb+1900,\"%z\":e=>{var r=0<=(e=e.dc);return e=Math.abs(e)/60,(r?\"+\":\"-\")+String(\"0000\"+(e/60*100+e%60)).slice(-4)},\"%Z\":e=>e.hc,\"%%\":()=>\"%\"},t=t.replace(/%%/g,\"\\0\\0\"),c)t.includes(d)&&(t=t.replace(new RegExp(d,\"g\"),c[d](n)));return d=function(e){var r=Array(Fe(e)+1);return Pe(e,r,0,r.length),r}(t=t.replace(/\\0\\0/g,\"%\")),d.length>r?0:(fn(d,e),d.length-1)}function cn(e,r,t,n){return ln(e>>>0,r>>>0,t>>>0,n>>>0)}h||function(){for(var e=d.numThreads-1;e--;)Oe();z.unshift((()=>{J++,function(e){h?e():Promise.all(ge.map(Ce)).then(e)}((()=>Q()))}))}();for(var dn=Array(256),bn=0;256>bn;++bn)dn[bn]=String.fromCharCode(bn);Ke=dn,Qe=d.BindingError=class extends Error{constructor(e){super(e),this.name=\"BindingError\"}},d.InternalError=class extends Error{constructor(e){super(e),this.name=\"InternalError\"}},lr.push(0,1,void 0,1,null,1,!0,1,!1,1),d.count_emval_handles=()=>lr.length/2-5-fr.length;var mn=[me,pe,Me,He,De,Ie,Ue,Ge,$e,Ye,Le,ze,Ve,qe,Je,Xe,Et,Mt,Zt,en,rn,tn,nn,on],pn=function(){function e(e,r){return pn=e.exports,pn=function(){var e=pn,r={};for(let[t,n]of Object.entries(e))r[t]=\"function\"==typeof n?(...e)=>{qr.push(t);try{return n(...e)}finally{Y||(qr.pop(),zr&&1===Lr&&0===qr.length&&(Lr=0,de+=1,Yr(Rn),\"undefined\"!=typeof Fibers&&Fibers.oc()))}}:n;return r}(),pn=function(){var e=pn,r=e=>r=>e(r)>>>0,t=e=>()=>e()>>>0;return(e=Object.assign({},e)).Ca=r(e.Ca),e.fb=t(e.fb),e.gb=r(e.gb),e.emscripten_main_runtime_thread_id=t(e.emscripten_main_runtime_thread_id),e.sb=r(e.sb),e.tb=t(e.tb),e}(),ye.push(pn.ib),V.unshift(pn.Ba),N=r,Q(),pn}var r=oe();if(J++,d.instantiateWasm)try{return d.instantiateWasm(r,e)}catch(e){W(`Module.instantiateWasm callback failed with error: ${e}`),c(e)}return ee||=d.locateFile?re(\"ort-wasm-simd-threaded.jsep.wasm\")?\"ort-wasm-simd-threaded.jsep.wasm\":d.locateFile?d.locateFile(\"ort-wasm-simd-threaded.jsep.wasm\",O):O+\"ort-wasm-simd-threaded.jsep.wasm\":new URL(\"ort-wasm-simd-threaded.jsep.wasm\",import.meta.url).href,function(e,r){var t=ee;return\"function\"!=typeof WebAssembly.instantiateStreaming||re(t)||te(t)||\"function\"!=typeof fetch?ae(t,e,r):fetch(t,{credentials:\"same-origin\"}).then((n=>WebAssembly.instantiateStreaming(n,e).then(r,(function(n){return W(`wasm streaming compile failed: ${n}`),W(\"falling back to ArrayBuffer instantiation\"),ae(t,e,r)}))))}(r,(function(r){e(r.instance,r.module)})).catch(c),{}}(),hn=e=>(hn=pn.Ca)(e),gn=()=>(gn=pn.Da)();d._OrtInit=(e,r)=>(d._OrtInit=pn.Ea)(e,r),d._OrtGetLastError=(e,r)=>(d._OrtGetLastError=pn.Fa)(e,r),d._OrtCreateSessionOptions=(e,r,t,n,a,o,i,s,u,f)=>(d._OrtCreateSessionOptions=pn.Ga)(e,r,t,n,a,o,i,s,u,f),d._OrtAppendExecutionProvider=(e,r)=>(d._OrtAppendExecutionProvider=pn.Ha)(e,r),d._OrtAddFreeDimensionOverride=(e,r,t)=>(d._OrtAddFreeDimensionOverride=pn.Ia)(e,r,t),d._OrtAddSessionConfigEntry=(e,r,t)=>(d._OrtAddSessionConfigEntry=pn.Ja)(e,r,t),d._OrtReleaseSessionOptions=e=>(d._OrtReleaseSessionOptions=pn.Ka)(e),d._OrtCreateSession=(e,r,t)=>(d._OrtCreateSession=pn.La)(e,r,t),d._OrtReleaseSession=e=>(d._OrtReleaseSession=pn.Ma)(e),d._OrtGetInputOutputCount=(e,r,t)=>(d._OrtGetInputOutputCount=pn.Na)(e,r,t),d._OrtGetInputName=(e,r)=>(d._OrtGetInputName=pn.Oa)(e,r),d._OrtGetOutputName=(e,r)=>(d._OrtGetOutputName=pn.Pa)(e,r),d._OrtFree=e=>(d._OrtFree=pn.Qa)(e),d._OrtCreateTensor=(e,r,t,n,a,o)=>(d._OrtCreateTensor=pn.Ra)(e,r,t,n,a,o),d._OrtGetTensorData=(e,r,t,n,a)=>(d._OrtGetTensorData=pn.Sa)(e,r,t,n,a),d._OrtReleaseTensor=e=>(d._OrtReleaseTensor=pn.Ta)(e),d._OrtCreateRunOptions=(e,r,t,n)=>(d._OrtCreateRunOptions=pn.Ua)(e,r,t,n),d._OrtAddRunConfigEntry=(e,r,t)=>(d._OrtAddRunConfigEntry=pn.Va)(e,r,t),d._OrtReleaseRunOptions=e=>(d._OrtReleaseRunOptions=pn.Wa)(e),d._OrtCreateBinding=e=>(d._OrtCreateBinding=pn.Xa)(e),d._OrtBindInput=(e,r,t)=>(d._OrtBindInput=pn.Ya)(e,r,t),d._OrtBindOutput=(e,r,t,n)=>(d._OrtBindOutput=pn.Za)(e,r,t,n),d._OrtClearBoundOutputs=e=>(d._OrtClearBoundOutputs=pn._a)(e),d._OrtReleaseBinding=e=>(d._OrtReleaseBinding=pn.$a)(e),d._OrtRunWithBinding=(e,r,t,n,a)=>(d._OrtRunWithBinding=pn.ab)(e,r,t,n,a),d._OrtRun=(e,r,t,n,a,o,i,s)=>(d._OrtRun=pn.bb)(e,r,t,n,a,o,i,s),d._OrtEndProfiling=e=>(d._OrtEndProfiling=pn.cb)(e),d._JsepOutput=(e,r,t)=>(d._JsepOutput=pn.db)(e,r,t),d._JsepGetNodeName=e=>(d._JsepGetNodeName=pn.eb)(e);var vn,yn=()=>(yn=pn.fb)(),wn=d._malloc=e=>(wn=d._malloc=pn.gb)(e),An=d._free=e=>(An=d._free=pn.hb)(e),_n=(e,r,t,n,a,o)=>(_n=pn.kb)(e,r,t,n,a,o),Cn=()=>(Cn=pn.lb)(),On=(e,r,t,n,a)=>(On=pn.mb)(e,r,t,n,a),jn=e=>(jn=pn.nb)(e),Tn=e=>(Tn=pn.ob)(e),Sn=()=>(Sn=pn.pb)(),Wn=(e,r)=>(Wn=pn.qb)(e,r),En=e=>(En=pn.rb)(e),Mn=e=>(Mn=pn.sb)(e),xn=()=>(xn=pn.tb)(),Nn=d.dynCall_ii=(e,r)=>(Nn=d.dynCall_ii=pn.vb)(e,r),kn=e=>(kn=pn.wb)(e),Rn=()=>(Rn=pn.xb)(),Hn=e=>(Hn=pn.yb)(e),Dn=()=>(Dn=pn.zb)();function Fn(){if(!(0xn(),d.stackRestore=e=>En(e),d.stackAlloc=e=>Mn(e),d.UTF8ToString=Re,d.stringToUTF8=Be,d.lengthBytesUTF8=Fe,K=function e(){vn||Fn(),vn||(K=e)},Fn(),b});export default r;\"em-pthread\"===globalThis.self?.name&&r();", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport type {OrtWasmModule} from './wasm-types';\nimport {isNode} from './wasm-utils-env';\n\n/**\n * The classic script source URL. This is not always available in non ESModule environments.\n *\n * In Node.js, this is undefined.\n */\nexport const scriptSrc =\n // if Nodejs, return undefined\n isNode ? undefined :\n // if It's ESM, use import.meta.url\n BUILD_DEFS.ESM_IMPORT_META_URL ??\n // use `document.currentScript.src` if available\n (typeof document !== 'undefined' ? (document.currentScript as HTMLScriptElement)?.src :\n // use `self.location.href` if available\n (typeof self !== 'undefined' ? self.location?.href : undefined));\n\n/**\n * The origin of the current location.\n *\n * In Node.js, this is undefined.\n */\nconst origin = isNode || typeof location === 'undefined' ? undefined : location.origin;\n\n/**\n * Check if the given filename with prefix is from the same origin.\n */\nconst isSameOrigin = (filename: string, prefixOverride?: string) => {\n try {\n const baseUrl = prefixOverride ?? scriptSrc;\n const url = baseUrl ? new URL(filename, baseUrl) : new URL(filename);\n return url.origin === origin;\n } catch {\n return false;\n }\n};\n\n/**\n * Normalize the inputs to an absolute URL with the given prefix override. If failed, return undefined.\n */\nconst normalizeUrl = (filename: string, prefixOverride?: string) => {\n const baseUrl = prefixOverride ?? scriptSrc;\n try {\n const url = baseUrl ? new URL(filename, baseUrl) : new URL(filename);\n return url.href;\n } catch {\n return undefined;\n }\n};\n\n/**\n * Create a fallback URL if an absolute URL cannot be created by the normalizeUrl function.\n */\nconst fallbackUrl = (filename: string, prefixOverride?: string) => `${prefixOverride ?? './'}${filename}`;\n\n/**\n * This helper function is used to preload a module from a URL.\n *\n * If the origin of the worker URL is different from the current origin, the worker cannot be loaded directly.\n * See discussions in https://github.com/webpack-contrib/worker-loader/issues/154\n *\n * In this case, we will fetch the worker URL and create a new Blob URL with the same origin as a workaround.\n *\n * @param absoluteUrl - The absolute URL to preload.\n *\n * @returns - A promise that resolves to a new Blob URL\n */\nconst preload = async(absoluteUrl: string): Promise => {\n const response = await fetch(absoluteUrl, {credentials: 'same-origin'});\n const blob = await response.blob();\n return URL.createObjectURL(blob);\n};\n\n/**\n * This helper function is used to dynamically import a module from a URL.\n *\n * The build script has special handling for this function to ensure that the URL is not bundled into the final output.\n *\n * @param url - The URL to import.\n *\n * @returns - A promise that resolves to the default export of the module.\n */\nconst dynamicImportDefault = async(url: string): Promise => (await import(/* webpackIgnore: true */ url)).default;\n\n/**\n * The proxy worker factory imported from the proxy worker module.\n *\n * This is only available when the WebAssembly proxy is not disabled.\n */\nconst createProxyWorker: ((urlOverride?: string) => Worker)|undefined =\n // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires\n BUILD_DEFS.DISABLE_WASM_PROXY ? undefined : require('./proxy-worker/main').default;\n\n/**\n * Import the proxy worker.\n *\n * This function will perform the following steps:\n * 1. If a preload is needed, it will preload the module and return the object URL.\n * 2. Use the proxy worker factory to create the proxy worker.\n *\n * @returns - A promise that resolves to a tuple of 2 elements:\n * - The object URL of the preloaded module, or undefined if no preload is needed.\n * - The proxy worker.\n */\nexport const importProxyWorker = async(): Promise<[undefined | string, Worker]> => {\n if (!scriptSrc) {\n throw new Error('Failed to load proxy worker: cannot determine the script source URL.');\n }\n\n // If the script source is from the same origin, we can use the embedded proxy module directly.\n if (isSameOrigin(scriptSrc)) {\n return [undefined, createProxyWorker!()];\n }\n\n // Otherwise, need to preload\n const url = await preload(scriptSrc);\n return [url, createProxyWorker!(url)];\n};\n\n/**\n * The embedded WebAssembly module.\n *\n * This is only available in ESM and when embedding is not disabled.\n */\nconst embeddedWasmModule: EmscriptenModuleFactory|undefined =\n BUILD_DEFS.IS_ESM && BUILD_DEFS.DISABLE_DYNAMIC_IMPORT ?\n // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires\n require(\n !BUILD_DEFS.DISABLE_TRAINING ? '../../dist/ort-training-wasm-simd-threaded.mjs' :\n !BUILD_DEFS.DISABLE_JSEP ? '../../dist/ort-wasm-simd-threaded.jsep.mjs' :\n '../../dist/ort-wasm-simd-threaded.mjs')\n .default :\n undefined;\n\n/**\n * Import the WebAssembly module.\n *\n * This function will perform the following steps:\n * 1. If BUILD_DEFS.DISABLE_DYNAMIC_IMPORT is true, use the embedded module.\n * 2. If a preload is needed, it will preload the module and return the object URL.\n * 3. Otherwise, it will perform a dynamic import of the module.\n *\n * @returns - A promise that resolves to a tuple of 2 elements:\n * - The object URL of the preloaded module, or undefined if no preload is needed.\n * - The default export of the module, which is a factory function to create the WebAssembly module.\n */\nexport const importWasmModule = async(\n urlOverride: string|undefined, prefixOverride: string|undefined,\n isMultiThreaded: boolean): Promise<[undefined | string, EmscriptenModuleFactory]> => {\n if (BUILD_DEFS.DISABLE_DYNAMIC_IMPORT) {\n return [undefined, embeddedWasmModule!];\n } else {\n const wasmModuleFilename = !BUILD_DEFS.DISABLE_TRAINING ? 'ort-training-wasm-simd-threaded.mjs' :\n !BUILD_DEFS.DISABLE_JSEP ? 'ort-wasm-simd-threaded.jsep.mjs' :\n 'ort-wasm-simd-threaded.mjs';\n const wasmModuleUrl = urlOverride ?? normalizeUrl(wasmModuleFilename, prefixOverride);\n // need to preload if all of the following conditions are met:\n // 1. not in Node.js.\n // - Node.js does not have the same origin policy for creating workers.\n // 2. multi-threaded is enabled.\n // - If multi-threaded is disabled, no worker will be created. So we don't need to preload the module.\n // 3. the absolute URL is available.\n // - If the absolute URL is failed to be created, the origin cannot be determined. In this case, we will not\n // preload the module.\n // 4. the worker URL is not from the same origin.\n // - If the worker URL is from the same origin, we can create the worker directly.\n const needPreload = !isNode && isMultiThreaded && wasmModuleUrl && !isSameOrigin(wasmModuleUrl, prefixOverride);\n const url = needPreload ? (await preload(wasmModuleUrl)) :\n (wasmModuleUrl ?? fallbackUrl(wasmModuleFilename, prefixOverride));\n return [needPreload ? url : undefined, await dynamicImportDefault>(url)];\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from 'onnxruntime-common';\n\nimport type {OrtWasmModule} from './wasm-types';\nimport {importWasmModule} from './wasm-utils-import';\n\nlet wasm: OrtWasmModule|undefined;\nlet initialized = false;\nlet initializing = false;\nlet aborted = false;\n\nconst isMultiThreadSupported = (): boolean => {\n // If 'SharedArrayBuffer' is not available, WebAssembly threads will not work.\n if (typeof SharedArrayBuffer === 'undefined') {\n return false;\n }\n\n try {\n // Test for transferability of SABs (for browsers. needed for Firefox)\n // https://groups.google.com/forum/#!msg/mozilla.dev.platform/IHkBZlHETpA/dwsMNchWEQAJ\n if (typeof MessageChannel !== 'undefined') {\n new MessageChannel().port1.postMessage(new SharedArrayBuffer(1));\n }\n\n // Test for WebAssembly threads capability (for both browsers and Node.js)\n // This typed array is a WebAssembly program containing threaded instructions.\n return WebAssembly.validate(new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 5,\n 4, 1, 3, 1, 1, 10, 11, 1, 9, 0, 65, 0, 254, 16, 2, 0, 26, 11\n ]));\n } catch (e) {\n return false;\n }\n};\n\nconst isSimdSupported = (): boolean => {\n try {\n // Test for WebAssembly SIMD capability (for both browsers and Node.js)\n // This typed array is a WebAssembly program containing SIMD instructions.\n\n // The binary data is generated from the following code by wat2wasm:\n //\n // (module\n // (type $t0 (func))\n // (func $f0 (type $t0)\n // (drop\n // (i32x4.dot_i16x8_s\n // (i8x16.splat\n // (i32.const 0))\n // (v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000)))))\n\n return WebAssembly.validate(new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 10, 30, 1, 28, 0, 65, 0,\n 253, 15, 253, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 186, 1, 26, 11\n ]));\n } catch (e) {\n return false;\n }\n};\n\nexport const initializeWebAssembly = async(flags: Env.WebAssemblyFlags): Promise => {\n if (initialized) {\n return Promise.resolve();\n }\n if (initializing) {\n throw new Error('multiple calls to \\'initializeWebAssembly()\\' detected.');\n }\n if (aborted) {\n throw new Error('previous call to \\'initializeWebAssembly()\\' failed.');\n }\n\n initializing = true;\n\n // wasm flags are already initialized\n const timeout = flags.initTimeout!;\n let numThreads = flags.numThreads!;\n\n // ensure SIMD is supported\n if (!isSimdSupported()) {\n throw new Error('WebAssembly SIMD is not supported in the current environment.');\n }\n\n // check if multi-threading is supported\n const multiThreadSupported = isMultiThreadSupported();\n if (numThreads > 1 && !multiThreadSupported) {\n if (typeof self !== 'undefined' && !self.crossOriginIsolated) {\n // eslint-disable-next-line no-console\n console.warn(\n 'env.wasm.numThreads is set to ' + numThreads +\n ', but this will not work unless you enable crossOriginIsolated mode. ' +\n 'See https://web.dev/cross-origin-isolation-guide/ for more info.');\n }\n\n // eslint-disable-next-line no-console\n console.warn(\n 'WebAssembly multi-threading is not supported in the current environment. ' +\n 'Falling back to single-threading.');\n\n // set flags.numThreads to 1 so that OrtInit() will not create a global thread pool.\n flags.numThreads = numThreads = 1;\n }\n\n const wasmPaths = flags.wasmPaths;\n const wasmPrefixOverride = typeof wasmPaths === 'string' ? wasmPaths : undefined;\n const mjsPathOverrideFlag = (wasmPaths as Env.WasmFilePaths)?.mjs;\n const mjsPathOverride = (mjsPathOverrideFlag as URL)?.href ?? mjsPathOverrideFlag;\n const wasmPathOverrideFlag = (wasmPaths as Env.WasmFilePaths)?.wasm;\n const wasmPathOverride = (wasmPathOverrideFlag as URL)?.href ?? wasmPathOverrideFlag;\n\n const [objectUrl, ortWasmFactory] = (await importWasmModule(mjsPathOverride, wasmPrefixOverride, numThreads > 1));\n\n let isTimeout = false;\n\n const tasks: Array> = [];\n\n // promise for timeout\n if (timeout > 0) {\n tasks.push(new Promise((resolve) => {\n setTimeout(() => {\n isTimeout = true;\n resolve();\n }, timeout);\n }));\n }\n\n // promise for module initialization\n tasks.push(new Promise((resolve, reject) => {\n const config: Partial = {\n /**\n * The number of threads. WebAssembly will create (Module.numThreads - 1) workers. If it is 1, no worker will be\n * created.\n */\n numThreads,\n };\n\n if (wasmPathOverride || wasmPrefixOverride) {\n /**\n * A callback function to locate the WebAssembly file. The function should return the full path of the file.\n *\n * Since Emscripten 3.1.58, this function is only called for the .wasm file.\n */\n config.locateFile = (fileName, scriptDirectory) =>\n wasmPathOverride ?? (wasmPrefixOverride ?? scriptDirectory) + fileName;\n }\n\n ortWasmFactory(config).then(\n // wasm module initialized successfully\n module => {\n initializing = false;\n initialized = true;\n wasm = module;\n resolve();\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n }\n },\n // wasm module failed to initialize\n (what) => {\n initializing = false;\n aborted = true;\n reject(what);\n });\n }));\n\n await Promise.race(tasks);\n\n if (isTimeout) {\n throw new Error(`WebAssembly backend initializing failed due to timeout: ${timeout}ms`);\n }\n};\n\nexport const getInstance = (): OrtWasmModule => {\n if (initialized && wasm) {\n return wasm;\n }\n\n throw new Error('WebAssembly is not initialized yet.');\n};\n\nexport const dispose = (): void => {\n if (initialized && !initializing && !aborted) {\n // TODO: currently \"PThread.terminateAllThreads()\" is not exposed in the wasm module.\n // And this function is not yet called by any code.\n // If it is needed in the future, we should expose it in the wasm module and uncomment the following line.\n\n // wasm?.PThread?.terminateAllThreads();\n wasm = undefined;\n\n initializing = false;\n initialized = false;\n aborted = true;\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {getInstance} from './wasm-factory';\n\nexport const allocWasmString = (data: string, allocs: number[]): number => {\n const wasm = getInstance();\n\n const dataLength = wasm.lengthBytesUTF8(data) + 1;\n const dataOffset = wasm._malloc(dataLength);\n wasm.stringToUTF8(data, dataOffset, dataLength);\n allocs.push(dataOffset);\n\n return dataOffset;\n};\n\ninterface ExtraOptionsHandler {\n (name: string, value: string): void;\n}\n\nexport const iterateExtraOptions =\n (options: Record, prefix: string, seen: WeakSet>,\n handler: ExtraOptionsHandler): void => {\n if (typeof options == 'object' && options !== null) {\n if (seen.has(options)) {\n throw new Error('Circular reference in options');\n } else {\n seen.add(options);\n }\n }\n\n Object.entries(options).forEach(([key, value]) => {\n const name = (prefix) ? prefix + key : key;\n if (typeof value === 'object') {\n iterateExtraOptions(value as Record, name + '.', seen, handler);\n } else if (typeof value === 'string' || typeof value === 'number') {\n handler(name, value.toString());\n } else if (typeof value === 'boolean') {\n handler(name, (value) ? '1' : '0');\n } else {\n throw new Error(`Can't handle extra config type: ${typeof value}`);\n }\n });\n };\n\n/**\n * check web assembly API's last error and throw error if any error occurred.\n * @param message a message used when an error occurred.\n */\nexport const checkLastError = (message: string): void => {\n const wasm = getInstance();\n\n const stack = wasm.stackSave();\n try {\n const paramsOffset = wasm.stackAlloc(8);\n wasm._OrtGetLastError(paramsOffset, paramsOffset + 4);\n const errorCode = wasm.HEAP32[paramsOffset / 4];\n const errorMessagePointer = wasm.HEAPU32[paramsOffset / 4 + 1];\n const errorMessage = errorMessagePointer ? wasm.UTF8ToString(errorMessagePointer) : '';\n throw new Error(`${message} ERROR_CODE: ${errorCode}, ERROR_MESSAGE: ${errorMessage}`);\n } finally {\n wasm.stackRestore(stack);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession} from 'onnxruntime-common';\n\nimport {getInstance} from './wasm-factory';\nimport {allocWasmString, checkLastError, iterateExtraOptions} from './wasm-utils';\n\nexport const setRunOptions = (options: InferenceSession.RunOptions): [number, number[]] => {\n const wasm = getInstance();\n let runOptionsHandle = 0;\n const allocs: number[] = [];\n\n const runOptions: InferenceSession.RunOptions = options || {};\n\n try {\n if (options?.logSeverityLevel === undefined) {\n runOptions.logSeverityLevel = 2; // Default to warning\n } else if (\n typeof options.logSeverityLevel !== 'number' || !Number.isInteger(options.logSeverityLevel) ||\n options.logSeverityLevel < 0 || options.logSeverityLevel > 4) {\n throw new Error(`log serverity level is not valid: ${options.logSeverityLevel}`);\n }\n\n if (options?.logVerbosityLevel === undefined) {\n runOptions.logVerbosityLevel = 0; // Default to 0\n } else if (typeof options.logVerbosityLevel !== 'number' || !Number.isInteger(options.logVerbosityLevel)) {\n throw new Error(`log verbosity level is not valid: ${options.logVerbosityLevel}`);\n }\n\n if (options?.terminate === undefined) {\n runOptions.terminate = false;\n }\n\n let tagDataOffset = 0;\n if (options?.tag !== undefined) {\n tagDataOffset = allocWasmString(options.tag, allocs);\n }\n\n runOptionsHandle = wasm._OrtCreateRunOptions(\n runOptions.logSeverityLevel!, runOptions.logVerbosityLevel!, !!runOptions.terminate!, tagDataOffset);\n if (runOptionsHandle === 0) {\n checkLastError('Can\\'t create run options.');\n }\n\n if (options?.extra !== undefined) {\n iterateExtraOptions(options.extra, '', new WeakSet>(), (key, value) => {\n const keyDataOffset = allocWasmString(key, allocs);\n const valueDataOffset = allocWasmString(value, allocs);\n\n if (wasm._OrtAddRunConfigEntry(runOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n checkLastError(`Can't set a run config entry: ${key} - ${value}.`);\n }\n });\n }\n\n return [runOptionsHandle, allocs];\n } catch (e) {\n if (runOptionsHandle !== 0) {\n wasm._OrtReleaseRunOptions(runOptionsHandle);\n }\n allocs.forEach(alloc => wasm._free(alloc));\n throw e;\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession} from 'onnxruntime-common';\n\nimport {getInstance} from './wasm-factory';\nimport {allocWasmString, checkLastError, iterateExtraOptions} from './wasm-utils';\n\nconst getGraphOptimzationLevel = (graphOptimizationLevel: string|unknown): number => {\n switch (graphOptimizationLevel) {\n case 'disabled':\n return 0;\n case 'basic':\n return 1;\n case 'extended':\n return 2;\n case 'all':\n return 99;\n default:\n throw new Error(`unsupported graph optimization level: ${graphOptimizationLevel}`);\n }\n};\n\nconst getExecutionMode = (executionMode: 'sequential'|'parallel'): number => {\n switch (executionMode) {\n case 'sequential':\n return 0;\n case 'parallel':\n return 1;\n default:\n throw new Error(`unsupported execution mode: ${executionMode}`);\n }\n};\n\nconst appendDefaultOptions = (options: InferenceSession.SessionOptions): void => {\n if (!options.extra) {\n options.extra = {};\n }\n if (!options.extra.session) {\n options.extra.session = {};\n }\n const session = options.extra.session as Record;\n if (!session.use_ort_model_bytes_directly) {\n // eslint-disable-next-line camelcase\n session.use_ort_model_bytes_directly = '1';\n }\n\n // if using JSEP with WebGPU, always disable memory pattern\n if (options.executionProviders &&\n options.executionProviders.some(ep => (typeof ep === 'string' ? ep : ep.name) === 'webgpu')) {\n options.enableMemPattern = false;\n }\n};\n\nconst setExecutionProviders =\n (sessionOptionsHandle: number, executionProviders: readonly InferenceSession.ExecutionProviderConfig[],\n allocs: number[]): void => {\n for (const ep of executionProviders) {\n let epName = typeof ep === 'string' ? ep : ep.name;\n\n // check EP name\n switch (epName) {\n case 'webnn':\n epName = 'WEBNN';\n if (typeof ep !== 'string') {\n const webnnOptions = ep as InferenceSession.WebNNExecutionProviderOption;\n // const context = (webnnOptions as InferenceSession.WebNNOptionsWithMLContext)?.context;\n const deviceType = (webnnOptions as InferenceSession.WebNNContextOptions)?.deviceType;\n if (deviceType) {\n const keyDataOffset = allocWasmString('deviceType', allocs);\n const valueDataOffset = allocWasmString(deviceType, allocs);\n if (getInstance()._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !==\n 0) {\n checkLastError(`Can't set a session config entry: 'deviceType' - ${deviceType}.`);\n }\n }\n }\n break;\n case 'webgpu':\n epName = 'JS';\n if (typeof ep !== 'string') {\n const webgpuOptions = ep as InferenceSession.WebGpuExecutionProviderOption;\n if (webgpuOptions?.preferredLayout) {\n if (webgpuOptions.preferredLayout !== 'NCHW' && webgpuOptions.preferredLayout !== 'NHWC') {\n throw new Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${webgpuOptions.preferredLayout}`);\n }\n const keyDataOffset = allocWasmString('preferredLayout', allocs);\n const valueDataOffset = allocWasmString(webgpuOptions.preferredLayout, allocs);\n if (getInstance()._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !==\n 0) {\n checkLastError(\n `Can't set a session config entry: 'preferredLayout' - ${webgpuOptions.preferredLayout}.`);\n }\n }\n }\n break;\n case 'wasm':\n case 'cpu':\n continue;\n default:\n throw new Error(`not supported execution provider: ${epName}`);\n }\n\n const epNameDataOffset = allocWasmString(epName, allocs);\n if (getInstance()._OrtAppendExecutionProvider(sessionOptionsHandle, epNameDataOffset) !== 0) {\n checkLastError(`Can't append execution provider: ${epName}.`);\n }\n }\n };\n\nexport const setSessionOptions = (options?: InferenceSession.SessionOptions): [number, number[]] => {\n const wasm = getInstance();\n let sessionOptionsHandle = 0;\n const allocs: number[] = [];\n\n const sessionOptions: InferenceSession.SessionOptions = options || {};\n appendDefaultOptions(sessionOptions);\n\n try {\n const graphOptimizationLevel = getGraphOptimzationLevel(sessionOptions.graphOptimizationLevel ?? 'all');\n const executionMode = getExecutionMode(sessionOptions.executionMode ?? 'sequential');\n const logIdDataOffset =\n typeof sessionOptions.logId === 'string' ? allocWasmString(sessionOptions.logId, allocs) : 0;\n\n const logSeverityLevel = sessionOptions.logSeverityLevel ?? 2; // Default to 2 - warning\n if (!Number.isInteger(logSeverityLevel) || logSeverityLevel < 0 || logSeverityLevel > 4) {\n throw new Error(`log serverity level is not valid: ${logSeverityLevel}`);\n }\n\n const logVerbosityLevel = sessionOptions.logVerbosityLevel ?? 0; // Default to 0 - verbose\n if (!Number.isInteger(logVerbosityLevel) || logVerbosityLevel < 0 || logVerbosityLevel > 4) {\n throw new Error(`log verbosity level is not valid: ${logVerbosityLevel}`);\n }\n\n const optimizedModelFilePathOffset = typeof sessionOptions.optimizedModelFilePath === 'string' ?\n allocWasmString(sessionOptions.optimizedModelFilePath, allocs) :\n 0;\n\n sessionOptionsHandle = wasm._OrtCreateSessionOptions(\n graphOptimizationLevel, !!sessionOptions.enableCpuMemArena, !!sessionOptions.enableMemPattern, executionMode,\n !!sessionOptions.enableProfiling, 0, logIdDataOffset, logSeverityLevel, logVerbosityLevel,\n optimizedModelFilePathOffset);\n if (sessionOptionsHandle === 0) {\n checkLastError('Can\\'t create session options.');\n }\n\n if (sessionOptions.executionProviders) {\n setExecutionProviders(sessionOptionsHandle, sessionOptions.executionProviders, allocs);\n }\n\n if (sessionOptions.enableGraphCapture !== undefined) {\n if (typeof sessionOptions.enableGraphCapture !== 'boolean') {\n throw new Error(`enableGraphCapture must be a boolean value: ${sessionOptions.enableGraphCapture}`);\n }\n const keyDataOffset = allocWasmString('enableGraphCapture', allocs);\n const valueDataOffset = allocWasmString(sessionOptions.enableGraphCapture.toString(), allocs);\n if (wasm._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n checkLastError(\n `Can't set a session config entry: 'enableGraphCapture' - ${sessionOptions.enableGraphCapture}.`);\n }\n }\n\n if (sessionOptions.freeDimensionOverrides) {\n for (const [name, value] of Object.entries(sessionOptions.freeDimensionOverrides)) {\n if (typeof name !== 'string') {\n throw new Error(`free dimension override name must be a string: ${name}`);\n }\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {\n throw new Error(`free dimension override value must be a non-negative integer: ${value}`);\n }\n const nameOffset = allocWasmString(name, allocs);\n if (wasm._OrtAddFreeDimensionOverride(sessionOptionsHandle, nameOffset, value) !== 0) {\n checkLastError(`Can't set a free dimension override: ${name} - ${value}.`);\n }\n }\n }\n\n if (sessionOptions.extra !== undefined) {\n iterateExtraOptions(sessionOptions.extra, '', new WeakSet>(), (key, value) => {\n const keyDataOffset = allocWasmString(key, allocs);\n const valueDataOffset = allocWasmString(value, allocs);\n\n if (wasm._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n checkLastError(`Can't set a session config entry: ${key} - ${value}.`);\n }\n });\n }\n\n return [sessionOptionsHandle, allocs];\n } catch (e) {\n if (sessionOptionsHandle !== 0) {\n wasm._OrtReleaseSessionOptions(sessionOptionsHandle);\n }\n allocs.forEach(alloc => wasm._free(alloc));\n throw e;\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from 'onnxruntime-common';\n\n// a dummy type declaration for Float16Array in case any polyfill is available.\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-explicit-any\n const Float16Array: any;\n}\n\n// This file includes common definitions. They do NOT have dependency on the WebAssembly instance.\n\n/**\n * Copied from ONNX definition. Use this to drop dependency 'onnx_proto' to decrease compiled .js file size.\n */\nexport const enum DataType {\n undefined = 0,\n float = 1,\n uint8 = 2,\n int8 = 3,\n uint16 = 4,\n int16 = 5,\n int32 = 6,\n int64 = 7,\n string = 8,\n bool = 9,\n float16 = 10,\n double = 11,\n uint32 = 12,\n uint64 = 13,\n complex64 = 14,\n complex128 = 15,\n bfloat16 = 16\n}\n\n/**\n * Map string tensor data to enum value\n */\nexport const tensorDataTypeStringToEnum = (type: string): DataType => {\n switch (type) {\n case 'int8':\n return DataType.int8;\n case 'uint8':\n return DataType.uint8;\n case 'bool':\n return DataType.bool;\n case 'int16':\n return DataType.int16;\n case 'uint16':\n return DataType.uint16;\n case 'int32':\n return DataType.int32;\n case 'uint32':\n return DataType.uint32;\n case 'float16':\n return DataType.float16;\n case 'float32':\n return DataType.float;\n case 'float64':\n return DataType.double;\n case 'string':\n return DataType.string;\n case 'int64':\n return DataType.int64;\n case 'uint64':\n return DataType.uint64;\n\n default:\n throw new Error(`unsupported data type: ${type}`);\n }\n};\n\n/**\n * Map enum value to string tensor data\n */\nexport const tensorDataTypeEnumToString = (typeProto: DataType): Tensor.Type => {\n switch (typeProto) {\n case DataType.int8:\n return 'int8';\n case DataType.uint8:\n return 'uint8';\n case DataType.bool:\n return 'bool';\n case DataType.int16:\n return 'int16';\n case DataType.uint16:\n return 'uint16';\n case DataType.int32:\n return 'int32';\n case DataType.uint32:\n return 'uint32';\n case DataType.float16:\n return 'float16';\n case DataType.float:\n return 'float32';\n case DataType.double:\n return 'float64';\n case DataType.string:\n return 'string';\n case DataType.int64:\n return 'int64';\n case DataType.uint64:\n return 'uint64';\n\n default:\n throw new Error(`unsupported data type: ${typeProto}`);\n }\n};\n\n/**\n * get tensor element size in bytes by the given data type\n * @returns size in integer or undefined if the data type is not supported\n */\nexport const getTensorElementSize = (dateType: number): number|\n undefined => [undefined, 4, 1, 1, 2, 2, 4, 8, undefined, 1, 2, 8, 4, 8, undefined, undefined, undefined][dateType];\n\n/**\n * get typed array constructor by the given tensor type\n */\nexport const tensorTypeToTypedArrayConstructor = (type: Tensor.Type): Float32ArrayConstructor|Uint8ArrayConstructor|\n Int8ArrayConstructor|Uint16ArrayConstructor|Int16ArrayConstructor|Int32ArrayConstructor|BigInt64ArrayConstructor|\n Uint8ArrayConstructor|Float64ArrayConstructor|Uint32ArrayConstructor|BigUint64ArrayConstructor => {\n switch (type) {\n case 'float16':\n // allow Float16Array polyfill.\n return typeof Float16Array !== 'undefined' && Float16Array.from ? Float16Array : Uint16Array;\n case 'float32':\n return Float32Array;\n case 'uint8':\n return Uint8Array;\n case 'int8':\n return Int8Array;\n case 'uint16':\n return Uint16Array;\n case 'int16':\n return Int16Array;\n case 'int32':\n return Int32Array;\n case 'bool':\n return Uint8Array;\n case 'float64':\n return Float64Array;\n case 'uint32':\n return Uint32Array;\n case 'int64':\n return BigInt64Array;\n case 'uint64':\n return BigUint64Array;\n default:\n throw new Error(`unsupported type: ${type}`);\n }\n };\n\n/**\n * Map string log level to integer value\n */\nexport const logLevelStringToEnum = (logLevel?: 'verbose'|'info'|'warning'|'error'|'fatal'): number => {\n switch (logLevel) {\n case 'verbose':\n return 0;\n case 'info':\n return 1;\n case 'warning':\n return 2;\n case 'error':\n return 3;\n case 'fatal':\n return 4;\n default:\n throw new Error(`unsupported logging level: ${logLevel}`);\n }\n};\n\n/**\n * Check whether the given tensor type is supported by GPU buffer\n */\nexport const isGpuBufferSupportedType = (type: Tensor.Type): type is Tensor.GpuBufferDataTypes => type === 'float32' ||\n type === 'float16' || type === 'int32' || type === 'int64' || type === 'uint32' || type === 'uint8' ||\n type === 'bool';\n\n/**\n * Map string data location to integer value\n */\nexport const dataLocationStringToEnum = (location: Tensor.DataLocation): number => {\n switch (location) {\n case 'none':\n return 0;\n case 'cpu':\n return 1;\n case 'cpu-pinned':\n return 2;\n case 'texture':\n return 3;\n case 'gpu-buffer':\n return 4;\n default:\n throw new Error(`unsupported data location: ${location}`);\n }\n};\n\n/**\n * Map integer data location to string value\n */\nexport const dataLocationEnumToString = (location: number): Tensor.DataLocation|undefined =>\n (['none', 'cpu', 'cpu-pinned', 'texture', 'gpu-buffer'] as const)[location];\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {isNode} from './wasm-utils-env';\n\n/**\n * Load a file into a Uint8Array.\n *\n * @param file - the file to load. Can be a URL/path, a Blob, an ArrayBuffer, or a Uint8Array.\n * @returns a Uint8Array containing the file data.\n */\nexport const loadFile = async(file: string|Blob|ArrayBufferLike|Uint8Array): Promise => {\n if (typeof file === 'string') {\n if (isNode) {\n // load file into ArrayBuffer in Node.js\n try {\n const {readFile} = require('node:fs/promises');\n return new Uint8Array(await readFile(file));\n } catch (e) {\n if (e.code === 'ERR_FS_FILE_TOO_LARGE') {\n // file is too large, use fs.createReadStream instead\n const {createReadStream} = require('node:fs');\n const stream = createReadStream(file);\n const chunks: Uint8Array[] = [];\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n return new Uint8Array(Buffer.concat(chunks));\n }\n throw e;\n }\n } else {\n // load file into ArrayBuffer in browsers\n const response = await fetch(file);\n if (!response.ok) {\n throw new Error(`failed to load external data file: ${file}`);\n }\n const contentLengthHeader = response.headers.get('Content-Length');\n const fileSize = contentLengthHeader ? parseInt(contentLengthHeader, 10) : 0;\n if (fileSize < 1073741824 /* 1GB */) {\n // when Content-Length header is not set, we cannot determine the file size. We assume it is small enough to\n // load into memory.\n return new Uint8Array(await response.arrayBuffer());\n } else {\n // file is too large, use stream instead\n if (!response.body) {\n throw new Error(`failed to load external data file: ${file}, no response body.`);\n }\n const reader = response.body.getReader();\n\n let buffer;\n try {\n // try to create ArrayBuffer directly\n buffer = new ArrayBuffer(fileSize);\n } catch (e) {\n if (e instanceof RangeError) {\n // use WebAssembly Memory to allocate larger ArrayBuffer\n const pages = Math.ceil(fileSize / 65536);\n buffer = new WebAssembly.Memory({initial: pages, maximum: pages}).buffer;\n } else {\n throw e;\n }\n }\n\n let offset = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n const chunkSize = value.byteLength;\n const chunk = new Uint8Array(buffer, offset, chunkSize);\n chunk.set(value);\n offset += chunkSize;\n }\n return new Uint8Array(buffer, 0, fileSize);\n }\n }\n\n } else if (file instanceof Blob) {\n return new Uint8Array(await file.arrayBuffer());\n } else if (file instanceof Uint8Array) {\n return file;\n } else {\n return new Uint8Array(file);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from 'onnxruntime-common';\n\nimport {logLevelStringToEnum} from '../wasm-common';\n\ntype LogLevel = NonNullable;\ntype MessageString = string;\ntype MessageFunction = () => string;\ntype Message = MessageString|MessageFunction;\n\nconst logLevelPrefix = ['V', 'I', 'W', 'E', 'F'];\n\nconst doLog = (level: number, message: string): void => {\n // eslint-disable-next-line no-console\n console.log(`[${logLevelPrefix[level]},${new Date().toISOString()}]${message}`);\n};\n\nlet configLogLevel: LogLevel|undefined;\nlet debug: boolean|undefined;\n\nexport const configureLogger = ($configLogLevel: LogLevel, $debug: boolean): void => {\n configLogLevel = $configLogLevel;\n debug = $debug;\n};\n\n/**\n * A simple logging utility to log messages to the console.\n */\nexport const LOG = (logLevel: LogLevel, msg: Message): void => {\n const messageLevel = logLevelStringToEnum(logLevel);\n const configLevel = logLevelStringToEnum(configLogLevel);\n if (messageLevel >= configLevel) {\n doLog(messageLevel, typeof msg === 'function' ? msg() : msg);\n }\n};\n\n/**\n * A simple logging utility to log messages to the console. Only logs when debug is enabled.\n */\nexport const LOG_DEBUG: typeof LOG = (...args: Parameters) => {\n if (debug) {\n LOG(...args);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from 'onnxruntime-common';\n\nimport {tensorTypeToTypedArrayConstructor} from '../wasm-common';\n\nexport const createView = (dataBuffer: ArrayBuffer, type: Tensor.Type): Int32Array|Uint32Array|BigInt64Array|\n BigUint64Array|Uint8Array|Float32Array|Float64Array|Int8Array|Int16Array|Uint16Array =>\n new (tensorTypeToTypedArrayConstructor(type))(dataBuffer);\n\n/**\n * a TensorView does not own the data.\n */\nexport interface TensorView {\n readonly data: number;\n readonly dataType: number;\n readonly dims: readonly number[];\n\n /**\n * get a Float32Array data view of the tensor data. tensor data must be on CPU.\n */\n getFloat32Array(): Float32Array;\n\n /**\n * get a BigInt64Array data view of the tensor data. tensor data must be on CPU.\n */\n getBigInt64Array(): BigInt64Array;\n\n /**\n * get a Int32Array data view of the tensor data. tensor data must be on CPU.\n */\n getInt32Array(): Int32Array;\n\n /**\n * create a new tensor view with the same data but different dimensions.\n */\n reshape(newDims: readonly number[]): TensorView;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../wasm-common';\nimport {TensorView} from '../tensor-view';\n\nimport {ShaderHelper} from './ops/common';\n\nexport type SessionState = 'default'|'capturing'|'replaying';\n\nexport enum GpuDataType {\n default = 0,\n upload = 1,\n profile = 2\n}\nexport type GpuDataId = number;\n\nexport type GpuArchitecture = 'ampere';\nexport type GpuVendor = 'amd'|'intel'|'nvidia';\nexport interface AdapterInfo {\n isArchitecture: (architecture: GpuArchitecture) => boolean;\n isVendor: (vendor: GpuVendor) => boolean;\n}\n\nexport interface GpuData {\n type: GpuDataType;\n id: GpuDataId;\n buffer: GPUBuffer;\n}\n\nexport interface TensorInfo {\n dims: readonly number[];\n dataType: number;\n}\n\nexport interface ProgramUniform {\n type: DataType;\n data: number|readonly number[];\n}\n\nexport type ProgramUniformVariableInfo = [type: DataType, length: number];\n\n/**\n * Represent the dependency of a program on a specific input tensor.\n *\n * - 'none': the shader/uniform does not depend on this input's info\n * - 'type': the shader/uniform depends on data type of this input\n * - 'rank': the shader/uniform depends on data type and the rank of this input\n * - 'dims': the shader/uniform depends on data type and the dims of this input\n * - 'data': the shader/uniform depends on data type, the dims and the data of this input\n */\nexport type ProgramInputTensorInfoDependency = 'none'|'type'|'rank'|'dims'|'data';\n\n/**\n * Represent information about a program's cache for shader.\n */\nexport interface ProgramShaderCacheInfo {\n /**\n * an optional string as a cache hint in the artifact cache. If this is not specified, the cache hint will be empty.\n *\n * This hint string should only contains initializing-time information, such as the attributes or any information of\n * initializers. It should NOT contain any runtime information, such as the shape of inputs.\n */\n hint?: string;\n\n /**\n * an optional list of dependencies of the program on the input tensors. If this is not specified, the program depends\n * on 'dims' of all inputs.\n */\n inputDependencies?: ProgramInputTensorInfoDependency[];\n}\n\n/**\n * Represent information about a program's cache for uniform.\n */\nexport interface ProgramUniformCacheInfo {\n /**\n * an optional string as a cache hint in the uniform cache. If this is not specified, the cache hint will be empty.\n *\n * This hint string should only contains runtime information, such as the shape of inputs.\n */\n hint?: string;\n\n /**\n * an optional list of dependencies of the program on the input tensors. If this is not specified, the program depends\n * on 'none' of all inputs.\n */\n inputDependencies?: ProgramInputTensorInfoDependency[];\n}\n\n\n/**\n * A set of data that represent a shader program\n */\nexport interface ProgramInfo {\n /**\n * the name of the program. used for debugging and profiling\n */\n name: string;\n\n /**\n * an optional object describing the cache information of the program shader.\n *\n * If this is not specified, assume hint is empty and inputDependencies are ['dims'] for all inputs.\n */\n shaderCache?: ProgramShaderCacheInfo;\n\n /**\n * the shader's processing source code.\n *\n * This function will be called when shader cache missed.\n */\n getShaderSource: (shaderHelper: ShaderHelper) => string;\n\n /**\n * A function to get run data required to run the program.\n *\n * This function will be called every time the program is executed. Should keep this function as simple as possible.\n */\n getRunData: (inputs: readonly TensorView[]) => {\n outputs: readonly TensorInfo[];\n dispatchGroup: {x: number; y?: number; z?: number};\n programUniforms?: readonly ProgramUniform[];\n };\n}\n\nexport interface Artifact {\n programInfo: ProgramInfo;\n computePipeline: GPUComputePipeline;\n uniformVariablesInfo: readonly ProgramUniformVariableInfo[]|undefined;\n}\n\nexport interface ComputeContextInputsOutputsMapping {\n /**\n * specify the mapping to the program's inputs. the value can be a number or a tensor view.\n * - if it's a number, it's the index of the kernel's input\n * - if it's a tensor view, it's an existing tensor view that will be used as the input\n *\n * if inputs is not specified, the mapping will be the kernel's inputs in order.\n */\n readonly inputs?: ReadonlyArray;\n /**\n * specify the mapping to the program's outputs. the value must be a number.\n * - if it's a non-negative number, it's the index of the kernel's output\n * - if it's -1, it's an output that will be created as a temporary value. this value will be released after\n * the kernel is executed.\n * - if it's -2, it's an output that will be created as a persistent value. this value will be released when the\n * kernel is released.\n *\n * if outputs is not specified, the mapping will be the kernel's outputs in order.\n */\n readonly outputs?: readonly number[];\n}\n\n/**\n * A ComputeContext instance carries the states that representing the current running of a kernel.\n */\nexport interface ComputeContext {\n /**\n * gpu adapter info\n */\n readonly adapterInfo: AdapterInfo;\n\n /**\n * stores the pointer to OpKernelContext\n */\n readonly opKernelContext: number;\n\n /**\n * a list of inputs, each input is an instance of TensorView\n */\n readonly inputs: readonly TensorView[];\n\n /**\n * a custom data object that can be used to store any data that is needed by the kernel\n */\n readonly kernelCustomData: {[key: string]: unknown};\n\n /**\n * a buffer that can be used to access custom data created each time the kernel is executed\n */\n readonly customDataBuffer: Uint8Array;\n\n /**\n * a number of outputs for the node\n */\n readonly outputCount: number;\n\n compute(program: ProgramInfo, inputsOutputsMapping?: ComputeContextInputsOutputsMapping): TensorView[];\n output(index: number, dims: readonly number[]): number;\n getMaxComputeWorkgroupSizes(): [number, number, number];\n getMaxComputeWorkgroupStoragesize(): number;\n}\n\nexport type TimestampQuery = 'none'|'inside-passes'|'at-passes';\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {WebGpuBackend} from '../backend-webgpu';\nimport {LOG_DEBUG} from '../log';\n\nimport {GpuData, GpuDataId, GpuDataType} from './types';\n\n/**\n * manages GpuDataId -> GpuBuffer\n */\nexport interface GpuDataManager {\n /**\n * copy data from CPU to GPU.\n */\n upload(id: GpuDataId, data: Uint8Array): void;\n /**\n * copy data from GPU to GPU.\n */\n memcpy(sourceId: GpuDataId, destinationId: GpuDataId): void;\n /**\n * create new data on GPU.\n */\n create(size: number, usage?: number): GpuData;\n /**\n * get GPU data by ID.\n */\n get(id: GpuDataId): GpuData|undefined;\n /**\n * release the data on GPU by ID.\n *\n * @return size of the data released\n */\n release(id: GpuDataId): number;\n /**\n * copy data from GPU to CPU.\n */\n download(id: GpuDataId, getTargetBuffer: () => Uint8Array): Promise;\n\n /**\n * refresh the buffers that marked for release.\n *\n * when release() is called, the buffer is not released immediately. this is because we need to wait for the commands\n * to be submitted to the GPU. this function is called after the commands are submitted so that the buffers can be\n * actually released.\n */\n refreshPendingBuffers(): void;\n\n /**\n * register an external buffer for IO Binding. If the buffer is already registered, return the existing GPU data ID.\n *\n * GPU data manager only manages a mapping between the buffer and the GPU data ID. It will not manage the lifecycle of\n * the external buffer.\n */\n registerExternalBuffer(buffer: GPUBuffer, originalSize: number, previousBuffer?: GPUBuffer): number;\n\n /**\n * unregister an external buffer for IO Binding.\n */\n unregisterExternalBuffer(buffer: GPUBuffer): void;\n\n /**\n * destroy all gpu buffers.\n */\n dispose(): void;\n\n /**\n * release session related data.\n * @param sessionId - specify the session ID.\n */\n onReleaseSession(sessionId: number): void;\n}\n\ninterface StorageCacheValue {\n gpuData: GpuData;\n originalSize: number;\n}\n\nconst bucketFreelist: Map = new Map([\n [64, 250],\n [128, 200],\n [256, 200],\n [512, 200],\n [2048, 230],\n [4096, 200],\n [8192, 50],\n [16384, 50],\n [32768, 50],\n [65536, 50],\n [131072, 50],\n [262144, 50],\n [524288, 50],\n [1048576, 50],\n [2097152, 30],\n [4194304, 20],\n [8388608, 10],\n [12582912, 10],\n [16777216, 10],\n [26214400, 15],\n [33554432, 22],\n [44236800, 2],\n [58982400, 6],\n // we don't want to cache the bucket sizes below but not caching them\n // results in some major performance hits for models like sd-turbo.\n [67108864, 6],\n [134217728, 6],\n [167772160, 6],\n]);\n\nconst bucketArr: number[] = [];\n\n/**\n * normalize the buffer size so that it fits the 128-bits (16 bytes) alignment.\n */\nconst calcNormalizedBufferSize = (size: number) => Math.ceil(size / 16) * 16;\n\n/**\n * calculate the buffer size so that it fits into buckets.\n */\nconst calcBucketBufferSize = (size: number) => {\n for (let idx = 0; idx < bucketArr.length; idx++) {\n const sizeForBucket = bucketArr[idx];\n if (size <= sizeForBucket) {\n return sizeForBucket;\n }\n }\n // not in bucket list -> caller will not cache, round up to 16.\n return Math.ceil(size / 16) * 16;\n};\n\nlet guid = 1;\nconst createNewGpuDataId = () => guid++;\n\n/**\n * exported standard download function. This function is used by the session to download the data from GPU, and also by\n * factory to create GPU tensors with the capacity of downloading data from GPU.\n *\n * @param backend - the WebGPU backend\n * @param gpuBuffer - the GPU buffer to download\n * @param originalSize - the original size of the data\n * @param getTargetBuffer - optional. If provided, the data will be copied to the target buffer. Otherwise, a new buffer\n * will be created and returned.\n */\nexport const downloadGpuData =\n async(backend: WebGpuBackend, gpuBuffer: GPUBuffer, originalSize: number, getTargetBuffer?: () => Uint8Array):\n Promise => {\n const bufferSize = calcNormalizedBufferSize(originalSize);\n const gpuReadBuffer = backend.device.createBuffer(\n // eslint-disable-next-line no-bitwise\n {size: bufferSize, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});\n try {\n const commandEncoder = backend.getCommandEncoder();\n backend.endComputePass();\n commandEncoder.copyBufferToBuffer(\n gpuBuffer /* source buffer */, 0 /* source offset */, gpuReadBuffer /* destination buffer */,\n 0 /* destination offset */, bufferSize /* size */\n );\n backend.flush();\n\n await gpuReadBuffer.mapAsync(GPUMapMode.READ);\n\n const arrayBuffer = gpuReadBuffer.getMappedRange();\n if (getTargetBuffer) {\n // if we already have a CPU buffer to accept the data, no need to clone the ArrayBuffer.\n const targetBuffer = getTargetBuffer();\n targetBuffer.set(new Uint8Array(arrayBuffer, 0, originalSize));\n return targetBuffer;\n } else {\n // the mapped ArrayBuffer will be released when the GPU buffer is destroyed. Need to clone the\n // ArrayBuffer.\n return new Uint8Array(arrayBuffer.slice(0, originalSize));\n }\n } finally {\n gpuReadBuffer.destroy();\n }\n };\n\nclass GpuDataManagerImpl implements GpuDataManager {\n // GPU Data ID => GPU Data ( storage buffer )\n private storageCache: Map;\n\n // pending buffers for uploading ( data is unmapped )\n private buffersForUploadingPending: GPUBuffer[];\n // pending buffers for computing\n private buffersPending: GPUBuffer[];\n\n // The reusable storage buffers for computing.\n private freeBuffers: Map;\n // The reusable uniform buffers\n private freeUniformBuffers: Map;\n\n // The external buffers registered users for IO Binding.\n private externalBuffers: Map;\n\n // The pendingBuffers for capture graph.\n // a SessionID -> GPUBuffer[] mapping.\n private capturedPendingBuffers: Map;\n\n constructor(private backend: WebGpuBackend) {\n this.storageCache = new Map();\n this.freeBuffers = new Map();\n this.freeUniformBuffers = new Map();\n this.buffersForUploadingPending = [];\n this.buffersPending = [];\n this.externalBuffers = new Map();\n this.capturedPendingBuffers = new Map();\n\n for (const [key, ] of bucketFreelist) {\n bucketArr.push(key);\n this.freeBuffers.set(key, []);\n this.freeUniformBuffers.set(key, []);\n }\n }\n\n upload(id: GpuDataId, data: Uint8Array): void {\n const srcArrayBuffer = data.buffer;\n const srcOffset = data.byteOffset;\n const srcLength = data.byteLength;\n const size = calcNormalizedBufferSize(srcLength);\n\n // get destination gpu buffer\n const gpuDataCache = this.storageCache.get(id);\n if (!gpuDataCache) {\n throw new Error('gpu data for uploading does not exist');\n }\n if (gpuDataCache.originalSize !== srcLength) {\n throw new Error(`inconsistent data size. gpu data size=${gpuDataCache.originalSize}, data size=${srcLength}`);\n }\n\n // create gpu buffer\n const gpuBufferForUploading = this.backend.device.createBuffer(\n // eslint-disable-next-line no-bitwise\n {mappedAtCreation: true, size, usage: GPUBufferUsage.MAP_WRITE | GPUBufferUsage.COPY_SRC});\n\n // copy (upload) data\n const arrayBuffer = gpuBufferForUploading.getMappedRange();\n new Uint8Array(arrayBuffer).set(new Uint8Array(srcArrayBuffer, srcOffset, srcLength));\n gpuBufferForUploading.unmap();\n\n\n // GPU copy\n const commandEncoder = this.backend.getCommandEncoder();\n this.backend.endComputePass();\n commandEncoder.copyBufferToBuffer(gpuBufferForUploading, 0, gpuDataCache.gpuData.buffer, 0, size);\n\n LOG_DEBUG('verbose', () => `[WebGPU] GpuDataManager.upload(id=${id})`);\n\n this.buffersForUploadingPending.push(gpuBufferForUploading);\n }\n\n memcpy(sourceId: GpuDataId, destinationId: GpuDataId): void {\n // get source gpu buffer\n const sourceGpuDataCache = this.storageCache.get(sourceId);\n if (!sourceGpuDataCache) {\n throw new Error('source gpu data for memcpy does not exist');\n }\n // get destination gpu buffer\n const destinationGpuDataCache = this.storageCache.get(destinationId);\n if (!destinationGpuDataCache) {\n throw new Error('destination gpu data for memcpy does not exist');\n }\n if (sourceGpuDataCache.originalSize !== destinationGpuDataCache.originalSize) {\n throw new Error('inconsistent source and destination gpu data size');\n }\n\n const size = calcNormalizedBufferSize(sourceGpuDataCache.originalSize);\n\n // GPU copy\n const commandEncoder = this.backend.getCommandEncoder();\n this.backend.endComputePass();\n commandEncoder.copyBufferToBuffer(\n sourceGpuDataCache.gpuData.buffer, 0, destinationGpuDataCache.gpuData.buffer, 0, size);\n }\n\n registerExternalBuffer(buffer: GPUBuffer, originalSize: number, previousBuffer?: GPUBuffer): number {\n let id: number|undefined;\n if (previousBuffer) {\n id = this.externalBuffers.get(previousBuffer);\n if (id === undefined) {\n throw new Error('previous buffer is not registered');\n }\n if (buffer === previousBuffer) {\n LOG_DEBUG(\n 'verbose',\n () => `[WebGPU] GpuDataManager.registerExternalBuffer(size=${originalSize}) => id=${\n id}, buffer is the same, skip.`);\n return id;\n } else if (this.backend.capturedCommandList.has(this.backend.currentSessionId!)) {\n throw new Error(`Registering a different external buffer under graph capture mode is not supported yet.\n Please use the previous external buffer!`);\n }\n this.externalBuffers.delete(previousBuffer);\n } else {\n id = createNewGpuDataId();\n }\n\n this.storageCache.set(id, {gpuData: {id, type: GpuDataType.default, buffer}, originalSize});\n this.externalBuffers.set(buffer, id);\n LOG_DEBUG(\n 'verbose',\n () => `[WebGPU] GpuDataManager.registerExternalBuffer(size=${originalSize}) => id=${id}, registered.`);\n return id;\n }\n\n unregisterExternalBuffer(buffer: GPUBuffer): void {\n const id = this.externalBuffers.get(buffer);\n if (id !== undefined) {\n this.storageCache.delete(id);\n this.externalBuffers.delete(buffer);\n LOG_DEBUG('verbose', () => `[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${id}`);\n }\n }\n\n // eslint-disable-next-line no-bitwise\n create(size: number, usage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST): GpuData {\n const bufferSize = calcBucketBufferSize(size);\n\n let gpuBuffer;\n // Currently, only storage buffers are reused.\n // eslint-disable-next-line no-bitwise\n const isStorage = (usage & GPUBufferUsage.STORAGE) === GPUBufferUsage.STORAGE;\n // eslint-disable-next-line no-bitwise\n const isUniform = (usage & GPUBufferUsage.UNIFORM) === GPUBufferUsage.UNIFORM;\n if (isStorage || isUniform) {\n const freeBuffers = isStorage ? this.freeBuffers : this.freeUniformBuffers;\n const buffers = freeBuffers.get(bufferSize);\n if (!buffers) {\n // no such bucket/freelist - create gpu buffer\n gpuBuffer = this.backend.device.createBuffer({size: bufferSize, usage});\n } else {\n if (buffers.length > 0) {\n // in freelist, use it\n gpuBuffer = buffers.pop() as GPUBuffer;\n } else {\n // bucket empty, create gpu buffer\n gpuBuffer = this.backend.device.createBuffer({size: bufferSize, usage});\n }\n }\n } else {\n // create gpu buffer\n gpuBuffer = this.backend.device.createBuffer({size: bufferSize, usage});\n }\n\n const gpuData = {id: createNewGpuDataId(), type: GpuDataType.default, buffer: gpuBuffer};\n this.storageCache.set(gpuData.id, {gpuData, originalSize: size});\n\n LOG_DEBUG('verbose', () => `[WebGPU] GpuDataManager.create(size=${size}) => id=${gpuData.id}`);\n return gpuData;\n }\n\n get(id: GpuDataId): GpuData|undefined {\n return this.storageCache.get(id)?.gpuData;\n }\n\n release(id: GpuDataId): number {\n const cachedData = this.storageCache.get(id);\n if (!cachedData) {\n throw new Error('releasing data does not exist');\n }\n\n LOG_DEBUG('verbose', () => `[WebGPU] GpuDataManager.release(id=${id}), gpuDataId=${cachedData.gpuData.id}`);\n\n this.storageCache.delete(id);\n this.buffersPending.push(cachedData.gpuData.buffer);\n // cachedData.gpuData.buffer.destroy();\n\n return cachedData.originalSize;\n }\n\n async download(id: GpuDataId, getTargetBuffer: () => Uint8Array): Promise {\n const cachedData = this.storageCache.get(id);\n if (!cachedData) {\n throw new Error('data does not exist');\n }\n await downloadGpuData(this.backend, cachedData.gpuData.buffer, cachedData.originalSize, getTargetBuffer);\n }\n\n refreshPendingBuffers(): void {\n for (const buffer of this.buffersForUploadingPending) {\n // upload buffer is only useful in the session creation time. So we don't need to reuse them in session running.\n buffer.destroy();\n }\n this.buffersForUploadingPending = [];\n\n if (this.buffersPending.length === 0) {\n return;\n }\n\n if (this.backend.sessionStatus === 'default') {\n for (const buffer of this.buffersPending) {\n const maxInFreeList = bucketFreelist.get(buffer.size);\n\n // eslint-disable-next-line no-bitwise\n if ((buffer.usage & GPUBufferUsage.STORAGE) === GPUBufferUsage.STORAGE) {\n // Put the pending buffer to freeBuffers list instead of really destroying it for buffer reusing.\n const freelist = this.freeBuffers.get(buffer.size) || [];\n if (maxInFreeList === undefined || freelist.length >= maxInFreeList) {\n buffer.destroy();\n } else {\n freelist.push(buffer);\n }\n // eslint-disable-next-line no-bitwise\n } else if ((buffer.usage & GPUBufferUsage.UNIFORM) === GPUBufferUsage.UNIFORM) {\n // Put the pending buffer to freeUniformBuffers list instead of really destroying it for buffer reusing.\n const freelist = this.freeUniformBuffers.get(buffer.size) || [];\n if (maxInFreeList === undefined || freelist.length >= maxInFreeList) {\n buffer.destroy();\n } else {\n freelist.push(buffer);\n }\n } else {\n buffer.destroy();\n }\n }\n this.buffersPending = [];\n } else {\n // Don't release intermediate tensors in non-default mode.\n // TODO: reuse the storage buffers in non-default mode.\n let capturedBuffers = this.capturedPendingBuffers.get(this.backend.currentSessionId!);\n if (!capturedBuffers) {\n capturedBuffers = [];\n this.capturedPendingBuffers.set(this.backend.currentSessionId!, capturedBuffers);\n }\n for (const buffer of this.buffersPending) {\n capturedBuffers.push(buffer);\n }\n this.buffersPending = [];\n }\n }\n\n dispose() {\n this.freeBuffers.forEach((buffers) => {\n buffers.forEach(buffer => {\n buffer.destroy();\n });\n });\n this.freeUniformBuffers.forEach((buffers) => {\n buffers.forEach(buffer => {\n buffer.destroy();\n });\n });\n\n this.storageCache.forEach((storage) => {\n storage.gpuData.buffer.destroy();\n });\n\n this.capturedPendingBuffers.forEach((buffers) => {\n buffers.forEach(buffer => {\n buffer.destroy();\n });\n });\n this.storageCache = new Map();\n this.freeBuffers = new Map();\n this.freeUniformBuffers = new Map();\n this.capturedPendingBuffers = new Map();\n }\n\n onReleaseSession(sessionId: number) {\n // release the captured pending buffers.\n const pendingBuffers = this.capturedPendingBuffers.get(sessionId);\n if (pendingBuffers) {\n pendingBuffers.forEach(buffer => {\n buffer.destroy();\n });\n this.capturedPendingBuffers.delete(sessionId);\n }\n }\n}\n\nexport const createGpuDataManager = (...args: ConstructorParameters): GpuDataManager =>\n new GpuDataManagerImpl(...args);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nclass AttributeWithCacheKeyImpl {\n constructor(attribute: Record) {\n Object.assign(this, attribute);\n }\n\n private key: string;\n public get cacheKey(): string {\n if (!this.key) {\n this.key =\n Object.getOwnPropertyNames(this).sort().map(name => `${(this as Record)[name]}`).join(';');\n }\n return this.key;\n }\n}\n\nexport interface AttributeWithCacheKey {\n readonly cacheKey: string;\n}\n\n/**\n * create a new object from the given attribute, and add a cacheKey property to it\n */\nexport const createAttributeWithCacheKey = >(attribute: T): T&AttributeWithCacheKey =>\n new AttributeWithCacheKeyImpl(attribute) as unknown as T & AttributeWithCacheKey;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/* eslint-disable no-param-reassign */\n\nexport class MatMulUtil {\n /**\n * Calculate the expected shape when matrix multiplication\n * @param a The shape of tensor A. Should be a tuple of 2 positive integers\n * @param b The shape of tensor B. Should be a tuple of 2 positive integers\n * @returns The expected shape of the result, or undefined if N/A\n */\n static calcMatMulShape(a: [number, number], b: [number, number]): [number, number]|undefined {\n return (a[1] !== b[0]) ? undefined : [a[0], b[1]];\n }\n}\n\n\nexport class BroadcastUtil {\n /**\n * Calculate the expected shape when broadcasting 2 tensors\n * @param a The shape of tensor A. Should be an array of positive integers\n * @param b The shape of tensor B. Should be an array of positive integers\n * @param isMatMul Whether the operation is MatMul\n * @returns The expected shape of the result, or undefined if N/A\n */\n static calcShape(adims: readonly number[], bdims: readonly number[], isMatMul = false): readonly number[]|undefined {\n const arank = adims.length;\n const brank = bdims.length;\n if (arank === 0) {\n return bdims;\n }\n if (brank === 0) {\n return adims;\n }\n const crank = Math.max(adims.length, bdims.length);\n const cdims = new Array(crank);\n\n // calculate the last 2 dimension if it is MatMul\n if (isMatMul) {\n if (arank < 2 || brank < 2) {\n return undefined;\n }\n const cShapeMatMul =\n MatMulUtil.calcMatMulShape([adims[arank - 2], adims[arank - 1]], [bdims[brank - 2], bdims[brank - 1]]);\n if (cShapeMatMul === undefined) {\n return undefined;\n }\n [cdims[crank - 2], cdims[crank - 1]] = cShapeMatMul;\n }\n\n for (let i = isMatMul ? 3 : 1; i <= crank; i++) {\n const aLen = arank - i < 0 ? 1 : adims[arank - i];\n const bLen = brank - i < 0 ? 1 : bdims[brank - i];\n\n if (aLen !== bLen && aLen > 1 && bLen > 1) {\n return undefined;\n }\n const max = Math.max(aLen, bLen);\n if (aLen && bLen) {\n cdims[crank - i] = Math.max(aLen, bLen);\n } else {\n // when either aLen or bLen is 0, the other should be either 0 or 1, otherwise it is not broadcastable.\n if (max > 1) {\n return undefined;\n }\n cdims[crank - i] = 0;\n }\n }\n\n return cdims;\n }\n\n /**\n * Determine if a shape is unidirectional broadcastable to another shape\n * @param shape The input shape\n * @param finalShape The desired shape after broadcasting\n */\n static isValidBroadcast(shape: readonly number[], finalShape: readonly number[]): boolean {\n // align shape to the right\n const inputRank = shape.length;\n const finalRank = finalShape.length;\n if (inputRank > finalRank) {\n return false;\n }\n for (let i = 1; i <= inputRank; i++) {\n if (shape[inputRank - i] !== 1 && shape[inputRank - i] !== finalShape[finalRank - i]) {\n return false;\n }\n }\n return true;\n }\n}\n\n\nexport class ShapeUtil {\n /**\n * calculate the size (number of elements)\n */\n static size(dims: readonly number[]): number {\n return ShapeUtil.getSizeFromDimensionRange(dims, 0, dims.length);\n }\n\n /**\n * convert dims corresponding to type change to pack. ex. uint8 data to uint32\n */\n static convertShape(dims: readonly number[], size = 4): readonly number[] {\n const rank = dims.length;\n if (rank === 0) {\n return [];\n }\n const newDims = new Array(rank);\n let i = rank - 1;\n while (i >= 0) {\n if (dims[i] % size === 0) {\n newDims[i] = dims[i] / size;\n break;\n }\n if (size % dims[i] !== 0) {\n throw new Error('cannot convert shape');\n }\n newDims[i] = 1;\n size /= dims[i];\n i--;\n }\n for (i--; i >= 0; i--) {\n newDims[i] = dims[i];\n }\n return newDims;\n }\n\n /**\n * calculate the size (number of elements) from the given axis (inclusive)\n */\n static sizeFromDimension(dims: readonly number[], axis: number): number {\n if (axis < 0 || axis > dims.length) {\n throw new Error(`invalid dimension of ${axis} for sizeFromDimension as Tensor has ${dims.length} dimensions.`);\n }\n return ShapeUtil.getSizeFromDimensionRange(dims, axis, dims.length);\n }\n\n /**\n * calculate the size (number of elements) to the given axis (exclusive)\n */\n static sizeToDimension(dims: readonly number[], axis: number): number {\n if (axis < 0 || axis > dims.length) {\n throw new Error(`invalid dimension of ${axis} for sizeToDimension as Tensor has ${dims.length} dimensions.`);\n }\n return ShapeUtil.getSizeFromDimensionRange(dims, 0, axis);\n }\n\n /**\n * calculate the size (number of elements) from and to the given axis [start, end)\n */\n static getSizeFromDimensionRange(dims: readonly number[], start: number, end: number): number {\n let size = 1;\n for (let i = start; i < end; i++) {\n // safety check as this method is called by multiple other methods requiring size.\n // size cannot be negative.\n if (dims[i] < 0) {\n throw new Error(\n // eslint-disable-next-line max-len\n 'cannot get valid size from specified dimension range. Most likely the range contains negative values in them.');\n }\n size *= dims[i];\n }\n return size;\n }\n\n static computeStrides(dims: readonly number[]): readonly number[] {\n const rank = dims.length;\n if (rank === 0) {\n return [];\n } else if (rank === 1) {\n return [1];\n }\n const strides = new Array(rank);\n strides[rank - 1] = 1;\n strides[rank - 2] = dims[rank - 1];\n for (let i = rank - 3; i >= 0; --i) {\n strides[i] = strides[i + 1] * dims[i + 1];\n }\n return strides;\n }\n\n /**\n * normailze axis of range [-r, r) into [0, r).\n */\n static normalizeAxis(axis: number, tensorRank: number): number {\n if (axis < -tensorRank && axis >= tensorRank) {\n throw new Error('unsupported axis for this operation.');\n }\n return axis < 0 ? axis + tensorRank : axis;\n }\n\n static normalizeAxes(axes: readonly number[], tensorRank?: number): number[] {\n return axes.map(x => this.normalizeAxis(x, tensorRank ?? axes.length));\n }\n\n /**\n * Sorts a given array based on the indices in the Perm array\n * Used in Transpose\n * @param a Array to be sorted such as dims or strides\n * @param perm Perm given; if null a will be reversed\n */\n static sortBasedOnPerm(a: readonly number[], perm?: readonly number[]): readonly number[] {\n if (perm) {\n return perm.map((v) => a[v]);\n } else {\n return a.slice().reverse();\n }\n }\n\n /**\n * Pads a given shape according to the padding values\n * @param dims shape of the Tensor to be padded\n * @param pad pad values\n */\n static padShape(dims: readonly number[], pad: readonly number[]): readonly number[] {\n const rank = dims.length;\n return dims.map((v, i) => v + pad[i] + pad[i + rank]);\n }\n\n /**\n * Determines if the two shapes are identical\n * @param shape1\n * @param shape2\n */\n static areEqual(shape1: readonly number[], shape2: readonly number[]): boolean {\n if (shape1.length !== shape2.length) {\n return false;\n }\n return shape1.every((v, i) => v === shape2[i]);\n }\n}\n\nexport class PoolConvUtil {\n /**\n * Adjust the kernel, strides, pads to correct rank. Set to default value if not present\n * @param isGlobalOperator If true, perform global pooling.\n * @param inputDims The input tensor dimension.\n * @param kernelShape The size of the kernel along each axis.\n * @param strides Stride along each axis.\n * @param dilations Dilation along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n */\n static adjustPoolAttributes(\n isGlobalOperator: boolean, inputDims: readonly number[], kernelShape: number[], strides: number[],\n dilations: number[], pads: number[]): void {\n if (!isGlobalOperator && kernelShape.length !== inputDims.length - 2) {\n throw new Error('length of specified kernel shapes should be 2 less than length of input dimensions');\n }\n\n if (isGlobalOperator) {\n // adjust kernel shape to cover the input dims\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n if (dim >= kernelShape.length) {\n kernelShape.push(inputDims[dim + 2]);\n } else {\n kernelShape[dim] = inputDims[dim + 2];\n }\n }\n }\n\n // adjust strides length to match kernel shape length\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (dim < strides.length) {\n if (strides[dim] < 0) {\n throw new Error('strides should be greater than or equal to 1');\n }\n } else {\n strides.push(1);\n }\n }\n\n // adjust dilation value\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (dim < dilations.length) {\n if (dilations[dim] < 0) {\n throw new Error('dilations should be greater than or equal to 1');\n }\n } else {\n dilations.push(1);\n }\n }\n\n // adjust pads length to match 2 * kernel shape length\n for (let dim = 0; dim < kernelShape.length * 2; dim++) {\n if (dim < pads.length) {\n if (pads[dim] < 0) {\n throw new Error('pad should be greater than or equal to 1');\n }\n } else {\n pads.push(0);\n }\n }\n\n // sanity checks for values in kernel shapes and pads\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (kernelShape[dim] <= 0) {\n throw new Error('kernel shapes need to be greater than 0');\n }\n\n if (pads[dim] >= kernelShape[dim] || pads[dim + kernelShape.length] >= kernelShape[dim]) {\n throw new Error('pads should be smaller than kernel');\n }\n }\n }\n\n // adjust pad values based on 'autoPad' attribute\n static adjustPadsBasedOnAutoPad(\n inputDims: readonly number[], strides: readonly number[], dilations: readonly number[],\n kernelShape: readonly number[], pads: number[], isChannelLast: boolean, autoPad?: string): void {\n if (!autoPad) {\n return;\n }\n\n if (pads.length !== 2 * (inputDims.length - 2)) {\n throw new Error('length of pads should be twice the length of data dimensions');\n }\n\n if (strides.length !== (inputDims.length - 2)) {\n throw new Error('length of strides should be the length of data dimensions');\n }\n\n if (kernelShape.length !== (inputDims.length - 2)) {\n throw new Error('length of kernel shapes should be the length of data dimensions');\n }\n\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n PoolConvUtil.adjustPadAndReturnShape(\n inputDims[dim + (isChannelLast ? 1 : 2)], strides[dim], dilations[dim], kernelShape[dim], pads, dim,\n dim + inputDims.length - 2, autoPad);\n }\n }\n\n /**\n * Calculate the output shape for Pool ops based on input attributes. (Should be used only for Pool ops)\n * @param isGlobalOperator If true, perform global pooling.\n * @param inputDims The input tensor dimension. (inputs[0].dims)\n * @param strides Stride along each axis.\n * @param dilations Dilation along each axis.\n * @param kernelShape The size of the kernel along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n * @param autoPad DEPRECATED attribute supported for legacy models. Specifies how to implicitly calculate pads in each\n * dimension. Can take values NOTSET, SAME_UPPER, SAME_LOWER, or VALID.\n */\n static computePoolOutputShape(\n isGlobalOperator: boolean, inputDims: readonly number[], strides: number[], dilations: number[],\n kernelShape: number[], pads: number[], autoPad?: string): number[] {\n if (inputDims.length <= 0) {\n throw new Error('input shape must be of size greater than 0');\n }\n\n // Add batch size and number of channels of output\n const outputDims = [inputDims[0], inputDims[1]];\n\n PoolConvUtil.computeShapeHelper(\n isGlobalOperator, inputDims, outputDims, strides, dilations, kernelShape, pads, autoPad);\n return outputDims;\n }\n\n /**\n * Calculate the output shape for Conv op based on input attributes. (Should be used only for Conv op)\n * @param inputDims The input tensor dimension. (inputs[0].dims)\n * @param filterDims The filter tensor dimension. (inputs[1].dims)\n * @param strides Stride along each axis.\n * @param kernelShape The size of the kernel along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n * @param autoPad DEPRECATED attribute supported for legacy models. Specifies how to implicitly calculate pads in each\n * dimension. Can take values NOTSET, SAME_UPPER, SAME_LOWER, or VALID.\n */\n static computeConvOutputShape(\n inputDims: readonly number[], filterDims: readonly number[], strides: number[], dilations: number[],\n kernelShape: number[], pads: number[], autoPad?: string): number[] {\n if (inputDims.length <= 0 || filterDims.length <= 0) {\n throw new Error('invalid input tensor dims or invalid filter tensor dims');\n }\n\n // Add batch size and number of channels of output\n const outputDims = [inputDims[0], filterDims[0]];\n\n PoolConvUtil.computeShapeHelper(false, inputDims, outputDims, strides, dilations, kernelShape, pads, autoPad);\n return outputDims;\n }\n\n // will compute output shapes for data dimensions ONLY (i.e.) no batch size and channels\n // called by computePoolOutputShape() and computeConvOutputShape()\n // adjust pads based on 'autoPad' attribute prior to shape computation\n private static computeShapeHelper(\n isGlobalOperator: boolean, inputDims: readonly number[], outputDims: number[], strides: readonly number[],\n dilations: readonly number[], kernelShape: readonly number[], pads: number[], autoPad?: string) {\n if (isGlobalOperator) {\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n outputDims.push(1);\n }\n } else {\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n outputDims.push(PoolConvUtil.adjustPadAndReturnShape(\n inputDims[dim + 2], strides[dim], dilations[dim], kernelShape[dim], pads, dim, dim + inputDims.length - 2,\n autoPad));\n }\n }\n }\n\n // helper for computeShapeHelper() and adjustPadsBasedOnAutoPad()\n // adjusts pad value for given 'autoPad' string and computes output shape along a particular dimension\n private static adjustPadAndReturnShape(\n inSize: number, stride: number, dilation: number, kernel: number, pads: number[], padHeadIndex: number,\n padTailIndex: number, autoPad?: string): number {\n const dkernel = dilation * (kernel - 1) + 1;\n if (autoPad && autoPad !== 'NOTSET') {\n switch (autoPad) {\n case 'VALID':\n pads[padHeadIndex] = 0;\n pads[padTailIndex] = 0;\n return Math.floor(((inSize - dkernel) / stride) + 1);\n case 'SAME_LOWER':\n case 'SAME_UPPER':\n if (dilation !== 1) {\n throw new Error('Dilation not supported for SAME_UPPER or SAME_LOWER');\n } else {\n const legacyTargetSize = (inSize + stride - 1) / stride;\n const padNeeded = (legacyTargetSize - 1) * stride + kernel - inSize;\n pads[padHeadIndex] =\n (autoPad === 'SAME_LOWER') ? Math.floor((padNeeded + 1) / 2) : Math.floor(padNeeded / 2);\n pads[padTailIndex] = padNeeded - pads[padHeadIndex];\n return Math.floor(((inSize + padNeeded - kernel) / stride) + 1);\n }\n default:\n throw new Error('Unsupported AutoPad type');\n }\n } else {\n return Math.floor(((inSize + pads[padHeadIndex] + pads[padTailIndex] - dkernel) / stride) + 1);\n }\n }\n}\n\nexport class GemmUtil {\n // will make sure input shapes are compatible for this op\n // and return back the shape of the output in the form of a tuple\n // will throw exception if the input shapes are not compatible\n static getShapeOfGemmResult(\n leftShape: readonly number[], transLeft: boolean, rightShape: readonly number[], transRight: boolean,\n biasShape?: readonly number[]): readonly number[] {\n if (leftShape.length !== 2 || rightShape.length !== 2) {\n throw new Error('shape need to be of size 2');\n }\n\n let M: number;\n let K: number;\n let N: number;\n\n if (transLeft) {\n M = leftShape[1];\n K = leftShape[0];\n } else {\n M = leftShape[0];\n K = leftShape[1];\n }\n\n let kDim = -1;\n\n if (transRight) {\n N = rightShape[0];\n kDim = 1;\n } else {\n N = rightShape[1];\n kDim = 0;\n }\n\n if (rightShape[kDim] !== K) {\n throw new Error('dimension mismatch');\n }\n\n if (M <= 0 || N <= 0 || K <= 0) {\n throw new Error('invalid shape specified');\n }\n\n if (biasShape && !BroadcastUtil.isValidBroadcast(biasShape, [M, N])) {\n throw new Error('gemm: invalid bias shape for broadcast');\n }\n\n return [M, N, K];\n }\n}\n\n\nexport const MIN_CLIP = -3.4028234663852886e+38;\nexport const MAX_CLIP = 3.4028234663852886e+38;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {ShapeUtil} from '../../util';\nimport {ProgramUniform, ProgramUniformVariableInfo} from '../types';\n\n/**\n * constant value for a workgroup size.\n *\n * We definitely can do further optimization in future, but for now we use 64.\n *\n * rule of thumb: Use [a workgroup size of] 64 unless you know what GPU you are targeting or that your workload\n * needs something different.\n *\n * from: https://surma.dev/things/webgpu/\n **/\nexport const WORKGROUP_SIZE = 64;\n\ninterface IndicesHelperTypes {\n /**\n * WGSL type of indices expression\n */\n readonly indices: string;\n\n /**\n * WGSL type of a value\n */\n readonly value: string;\n\n /**\n * WGSL type of storage type representing a value\n *\n * This is usually the same to `value`, but for some type (eg. bool), we need to use `u32` as storage type for\n * value type `vec4`\n */\n readonly storage: string;\n\n /**\n * tensor type as represented in TensorView\n */\n readonly tensor: number;\n}\n\n/**\n * A helper class for generating WGSL code for manipulating indices and data for a shader's input or output.\n *\n * This class is designed to offer a unified way to generate WGSL code for manipulating indices and data for a shader's\n * input or output.\n *\n * The following is a list of terminologies used in this class:\n * - `offset`: a uint32 value representing the offset of an element in the data buffer.\n * - `indices`: an abstraction of a multi-dimensional array's indices representing the data's index on each dimension.\n * - `value`: a value of a data element.\n *\n * Users are expected to create an instance of this class for each shader's input or output, and use the instance to\n * generate WGSL code for manipulating indices and data. The following 2 exported functions are for users to call to\n * create an instance of an indices helper:\n * - `inputVariable()`: create an indices helper instance for an input.\n * - `outputVariable()`: create an indices helper instance for an output.\n * - `internalVariable()`: create an indices helper instance for an internal variable.\n *\n * An indices helper instance contains helper functions for the following operations:\n * - access readonly basic information, including: `name`(the name of the input or output), `usage`(whether it's an\n * input, an output or an internal variable) and `shape`(the passed in shape).\n * - `type`: access readonly type information, including: `indices`(the type of indices), `value`(the type of value at\n * runtime), `storage`(the type of value at storage) and `tensor`(the tensor type as represented in TensorView).\n * - generate WGSL code for getting indices from offset. Use `offsetToIndices()` for WGSL code snippet to calculate\n * indices from offset, and use `indicesToOffset()` for WGSL code snippet to calculate offset from indices.\n * - to manipulate an instance of indices, use `setIndices()` and `getIndices()` to set and get the indices on an\n * indices variable.\n * - to manipulate data, use `set()`/`get()` to access data at the given indices from parameter list, use\n * `setByIndices()`/`getByIndices()` to access data at the given indices from an indices variable, and use\n * `setByOffset()`/`getByOffset()` to access data at the given offset.\n * - `impl`: get WGSL code of function implementation for the util functions mentioned above.\n */\nexport interface IndicesHelper {\n /**\n * get WGSL code of function implementation for the util functions.\n *\n */\n readonly impl: () => string;\n\n /**\n * get type info\n */\n readonly type: IndicesHelperTypes;\n\n /**\n * WGSL code of a expression for getting indices from offset.\n *\n * @param varOffset - a u32 expression representing the offset.\n *\n * @returns an `type.indices` expression\n */\n readonly offsetToIndices: (varOffset: string) => string;\n\n /**\n * WGSL code of an `u32` expression for getting offset from indices.\n *\n * @param varIndices - a `type.indices` expression representing the indices.\n *\n * @returns an `u32` expression\n */\n readonly indicesToOffset: (varIndices: string) => string;\n\n /**\n * WGSL code of an `u32` expression for getting original offset from broadcasted indices.\n *\n * @param varIndices - a `type.indices` expression representing the output indices.\n * @param output - output IndicesHelper.\n *\n * @returns an `u32` expression\n */\n readonly broadcastedIndicesToOffset: (varIndices: string, output: IndicesHelper) => string;\n\n /**\n * WGSL code of generating an indices literal\n *\n * @param init - initial value.\n */\n readonly indices: (...init: ReadonlyArray) => string;\n\n /**\n * WGSL code of a statement for setting indices.\n *\n * @param varIndices - a variable name for the indices.\n * @param idx - the index of the indices to set. can be a number or a string (WGSL `u32` expression).\n * @param value - the value to set. can be a number or a string (WGSL `u32` expression).\n *\n * @returns a WGSL statement\n */\n readonly indicesSet: (varIndices: string, idx: number|string, value: number|string) => void;\n\n /**\n * WGSL code of an `u32` expression for getting indices.\n *\n * @param varIndices - a variable name for the indices.\n * @param idx - the index of the indices to get. can be a number or a string (WGSL `u32` expression).\n *\n * @returns an `u32` expression\n */\n readonly indicesGet: (varIndices: string, idx: number|string) => string;\n\n /**\n * WGSL code for a statement for setting data at the given indices.\n *\n * @param indicesAndValue - an array of numbers or strings (WGSL `u32` expression) representing the indices, followed\n * by the value to set. This array should have exactly `shape.length + 1` elements.\n */\n readonly set: (...indicesAndValue: ReadonlyArray) => string;\n\n /**\n * WGSL code for a statement for setting data at the given indices variable.\n *\n * @param varIndices - a variable name for the indices.\n * @param value - the value to set. should be a WGSL expression.\n */\n readonly setByIndices: (varIndices: string, value: string) => string;\n\n /**\n * WGSL code for a statement for setting data at the given offset.\n *\n * @param offset - a number or a string (WGSL `u32` expression) representing the offset.\n * @param value - the value to set. should be a WGSL expression.\n */\n readonly setByOffset: (offset: number|string, value: string) => string;\n\n /**\n * WGSL code for an expression for getting data at the given indices.\n *\n * @param indices - an array of numbers or strings (WGSL `u32` expression) representing the indices.\n */\n readonly get: (...indices: ReadonlyArray) => string;\n\n /**\n * WGSL code for an expression for getting data at the given indices variable.\n *\n * @param varIndices - a variable name for the indices.\n */\n readonly getByIndices: (varIndices: string) => string;\n\n /**\n * WGSL code for an expression for getting data at the given offset.\n *\n * @param offset - a number or a string (WGSL `u32` expression) representing the offset.\n */\n readonly getByOffset: (offset: number|string) => string;\n\n /**\n * name of the data variable\n */\n readonly name: string;\n\n /**\n * whether the helper is for an input, an output or an internal variable.\n */\n readonly usage: 'input'|'output'|'internal';\n\n /**\n * the rank of the input or output.\n */\n readonly rank: number;\n\n /**\n * a string representing the variable name for the shape of the input or output.\n */\n readonly shape: string;\n\n /**\n * a string representing the variable name for the strides of the input or output.\n */\n readonly strides: string;\n}\n\nconst getWgslMappedType = (type: number, components: 1|2|3|4): string|[string, string] => {\n if (components === 3) {\n throw new Error('vec3 has same alignment as vec4, use vec4 instead');\n }\n\n // return type is [ storage type, runtime type ] or a single string for both\n switch (type) {\n case DataType.float16:\n return components > 1 ? `vec${components}` : 'f16';\n case DataType.float:\n return components > 1 ? `vec${components}` : 'f32';\n case DataType.int32:\n return components > 1 ? `vec${components}` : 'i32';\n case DataType.uint32:\n return components > 1 ? `vec${components}` : 'u32';\n case DataType.int64:\n if (components > 1) {\n throw new Error('currently not supported vecX of uint64 yet');\n }\n return ['vec2', 'i32'];\n case DataType.uint64:\n if (components > 1) {\n throw new Error('currently not supported vecX of uint64 yet');\n }\n return ['vec2', 'u32'];\n case DataType.bool:\n if (components !== 4) {\n throw new Error('bool must be vec4');\n }\n return ['u32', 'vec4'];\n\n default:\n throw new Error(`Unknown data type: ${type}`);\n }\n};\n\nexport const tensorTypeToWsglStorageType = (type: DataType, components: 1|2|3|4 = 1) => {\n const mappedType = getWgslMappedType(type, components);\n return typeof mappedType === 'string' ? mappedType : mappedType[0];\n};\n\nexport const tensorTypeToWsglValueType = (type: DataType, components: 1|2|3|4 = 1) => {\n const mappedType = getWgslMappedType(type, components);\n return typeof mappedType === 'string' ? mappedType : mappedType[1];\n};\n\nexport const createTensorShapeVariables = (...dims: ReadonlyArray): ProgramUniform[] => {\n const programUniforms: ProgramUniform[] = [];\n dims.forEach(dim => {\n if (dim.length !== 0) {\n programUniforms.push(\n {type: DataType.uint32, data: dim}, {type: DataType.uint32, data: ShapeUtil.computeStrides(dim)});\n }\n });\n return programUniforms;\n};\n\n/**\n * A helper function to get maximum vector size for specified data length\n * @param size\n */\nexport const getMaxComponents = (size: number) => {\n // we cannot use vec3 type since it has alignment of 16 bytes\n if (size % 4 === 0) {\n return 4;\n } else if (size % 2 === 0) {\n return 2;\n }\n\n return 1;\n};\n\n/**\n * A helper function that initializes variable as a scalar or vector. e.g. f32(0) or vec4f(0,0,0,0)\n * @param dataType\n * @param components\n * @param value\n */\nexport const fillVector = (dataType = 'f32', components?: number, value = '0') => {\n if (!components || components === 1) {\n return `${dataType}(${value})`;\n }\n\n return `vec${components}<${dataType}>(${value})`;\n};\n\n/**\n * A helper function that casts value or vector to f32\n * @param dataType\n * @param components\n * @param value\n */\nexport const castToF32 = (dataType: string, components: number, value: string) => {\n if (dataType === 'f32') {\n return value;\n }\n if (components === 1) {\n return `f32(${value})`;\n }\n\n return `vec${components}(${value})`;\n};\n\n/**\n * A helper function that returns scalar or sums all components of a vector\n * @param name\n * @param components\n */\nexport const sumVector = (name: string, components: number) => {\n if (components === 4) {\n return `(${name}.x + ${name}.y + ${name}.z + ${name}.w)`;\n } else if (components === 2) {\n return `(${name}.x + ${name}.y)`;\n } else if (components === 3) {\n return `(${name}.x + ${name}.y + ${name}.z)`;\n }\n\n return name;\n};\n\n/**\n * A helper function that returns variable element at index.\n * @param name - the name of variable.\n * @param index - the index of variable element.\n * @param length - the length of variable.\n * @param type - the type of variable, optional.\n */\nexport const getElementAt =\n (name: string, index: number|string, length: number, type?: UniformDataElementType): string => {\n if (name.startsWith('uniforms.') && length > 4) {\n if (typeof (index) === 'string') {\n if (type === 'f16') {\n return `${name}[(${index}) / 8][(${index}) % 8 / 4][(${index}) % 8 % 4]`;\n } else {\n return `${name}[(${index}) / 4][(${index}) % 4]`;\n }\n } else {\n if (type === 'f16') {\n return `${name}[${Math.floor(index / 8)}][${Math.floor(index % 8 / 4)}][${index % 8 % 4}]`;\n } else {\n return `${name}[${Math.floor(index / 4)}][${index % 4}]`;\n }\n }\n } else {\n return length > 1 ? `${name}[${index}]` : name;\n }\n };\n\n/**\n * A helper function to get a IndicesHelper for a given input or output.\n *\n * @param name - the name of the input or output.\n * @param tensorType - the tensor type of the input or output.\n * @param shapeOrRank - the tensor shape or the rank of the input or output.\n * @param usage - the usage of the indices helper.\n * @param components - indicates the number of components of each element. 1 for scalar, 2 for vec2, 3 for vec3, 4 for\n * vec4.\n */\nconst createIndicesHelper =\n (name: string, tensorType: number, shapeOrRank: number|readonly number[], usage: IndicesHelper['usage'],\n components: 1|2|3|4): IndicesHelper => {\n const useUniform = typeof shapeOrRank === 'number';\n const rank = useUniform ? shapeOrRank : shapeOrRank.length;\n const rankIdentity = [...new Array(rank).keys()];\n const indicesType = rank < 2 ? 'u32' : rank <= 4 ? `vec${rank}` : `array`;\n const mappedType = getWgslMappedType(tensorType, components);\n const valueType = typeof mappedType === 'string' ? mappedType : mappedType[1];\n const storageType = typeof mappedType === 'string' ? mappedType : mappedType[0];\n const type = {indices: indicesType, value: valueType, storage: storageType, tensor: tensorType};\n\n const normalizeDim = (dim: number|string): string => typeof dim === 'string' ? dim : `${dim}u`;\n\n const implementationUsed = {\n offsetToIndices: false,\n indicesToOffset: false,\n broadcastedIndicesToOffset: false,\n set: false,\n setByIndices: false,\n get: false,\n getByIndices: false,\n };\n\n const uniformPrefix = useUniform ? 'uniforms.' : '';\n const shape = `${uniformPrefix}${name}_shape`;\n const strides = `${uniformPrefix}${name}_strides`;\n\n let o2iSnippet = '';\n for (let i = 0; i < rank - 1; i++) {\n o2iSnippet += `\n let dim${i} = current / ${getElementAt(strides, i, rank)};\n let rest${i} = current % ${getElementAt(strides, i, rank)};\n indices[${i}] = dim${i};\n current = rest${i};\n `;\n }\n o2iSnippet += `indices[${rank - 1}] = current;`;\n\n const offsetToIndicesImplementation = rank < 2 ? '' : `\n fn o2i_${name}(offset: u32) -> ${type.indices} {\n var indices: ${type.indices};\n var current = offset;\n ${o2iSnippet}\n return indices;\n }`;\n\n const offsetToIndices = (varOffset: string) => {\n implementationUsed.offsetToIndices = true;\n return rank < 2 ? varOffset : `o2i_${name}(${varOffset})`;\n };\n\n const offsets: string[] = [];\n if (rank >= 2) {\n for (let i = rank - 1; i >= 0; i--) {\n offsets.push(`${getElementAt(strides, i, rank)} * (indices[${i}])`);\n }\n }\n\n const indicesToOffsetImplementation = rank < 2 ? '' : `\n fn i2o_${name}(indices: ${type.indices}) -> u32 {\n return ${offsets.join('+')};\n }`;\n\n const indicesToOffset = (varIndices: string) => {\n implementationUsed.indicesToOffset = true;\n return rank < 2 ? varIndices : `i2o_${name}(${varIndices})`;\n };\n\n const indices = (...init: ReadonlyArray) =>\n rank === 0 ? '0u' : `${type.indices}(${init.map(normalizeDim).join(',')})`;\n\n const indicesGet = (varIndices: string, idx: number|string) => {\n if (rank < 2) {\n return `${varIndices}`;\n } else {\n return `${getElementAt(varIndices, idx, rank)}`;\n }\n };\n\n const indicesSet = (varIndices: string, idx: number|string, value: string) => {\n if (rank < 2) {\n return `${varIndices}=${value};`;\n } else {\n return `${getElementAt(varIndices, idx, rank)}=${value};`;\n }\n };\n\n const broadcastedIndicesToOffsetImplementation: {[key: string]: string} = {};\n const broadcastedIndicesToOffset = (varIndices: string, output: IndicesHelper) => {\n implementationUsed.broadcastedIndicesToOffset = true;\n const implKey = `${output.name}broadcastedIndicesTo${name}Offset`;\n if (implKey in broadcastedIndicesToOffsetImplementation) {\n return `${implKey}(${varIndices})`;\n }\n const offsets = [];\n for (let i = rank - 1; i >= 0; i--) {\n const idx = output.indicesGet('outputIndices', i + output.rank - rank);\n offsets.push(`${indicesGet(strides, i)} * (${idx} % ${indicesGet(shape, i)})`);\n }\n broadcastedIndicesToOffsetImplementation[implKey] =\n `fn ${implKey}(outputIndices: ${output.type.indices}) -> u32 {\n return ${offsets.length > 0 ? offsets.join('+') : '0u'};\n }`;\n\n return `${implKey}(${varIndices})`;\n };\n\n const setByOffset = (offset: number|string, value: string) => (() => {\n if (type.storage === type.value) {\n return `${name}[${offset}]=${value};`;\n } else if (type.storage === 'vec2' && type.value === 'i32') {\n // int64, components === 1\n return `${name}[${offset}]=vec2(u32(${value}), select(0u, 0xFFFFFFFFu, ${value} < 0));`;\n } else if (type.storage === 'vec2' && type.value === 'u32') {\n // uint64, components === 1\n return `${name}[${offset}]=vec2(u32(${value}), 0u);`;\n } else if (type.storage === 'u32' && type.value === 'vec4') {\n // bool, components === 4\n return `${name}[${offset}]=dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(${value}));`;\n } else {\n throw new Error(`not supported combination of storage type ${type.storage} and value type ${type.value} yet`);\n }\n })();\n\n const getByOffset = (offset: number|string) => (() => {\n if (type.storage === type.value) {\n return `${name}[${offset}]`;\n } else if (type.storage === 'vec2' && type.value === 'i32') {\n // int64, components === 1\n return `i32(${name}[${offset}].x)`;\n } else if (type.storage === 'vec2' && type.value === 'u32') {\n // uint64, components === 1\n return `u32(${name}[${offset}].x)`;\n } else if (type.storage === 'u32' && type.value === 'vec4') {\n // bool, components === 4\n return `vec4(bool(${name}[${offset}] & 0xFFu), bool(${name}[${offset}] & 0xFF00u), bool(${name}[${\n offset}] & 0xFF0000u), bool(${name}[${offset}] & 0xFF000000u))`;\n } else {\n throw new Error(`not supported combination of storage type ${type.storage} and value type ${type.value} yet`);\n }\n })();\n\n const getByIndicesImplementation = rank < 2 ? '' : `\n fn get_${name}ByIndices(indices: ${type.indices}) -> ${valueType} {\n return ${getByOffset(`i2o_${name}(indices)`)};\n }`;\n\n const getImplementation = rank < 2 ? '' : (() => {\n const functionParams = rankIdentity.map(i => `d${i}: u32`).join(', ');\n const dimsParams = rankIdentity.map(i => `d${i}`).join(', ');\n return `\n fn get_${name}(${functionParams}) -> ${valueType} {\n return get_${name}ByIndices(${indices(dimsParams)});\n }`;\n })();\n\n const get = (...indices: ReadonlyArray) => {\n if (indices.length !== rank) {\n throw new Error(`indices length must be ${rank}`);\n }\n\n const normalizedIndices = indices.map(normalizeDim).join(',');\n\n if (rank === 0) {\n return getByOffset('0u');\n } else if (rank === 1) {\n return getByOffset(normalizedIndices[0]);\n } else {\n implementationUsed.get = true;\n implementationUsed.getByIndices = true;\n implementationUsed.indicesToOffset = true;\n return `get_${name}(${normalizedIndices})`;\n }\n };\n\n const getByIndices = (varIndices: string) => {\n if (rank < 2) {\n return getByOffset(varIndices);\n } else {\n implementationUsed.getByIndices = true;\n implementationUsed.indicesToOffset = true;\n return `get_${name}ByIndices(${varIndices})`;\n }\n };\n\n const setByIndicesImplementation = rank < 2 ? '' : `\n fn set_${name}ByIndices(indices: ${type.indices}, value: ${valueType}) {\n ${setByOffset(`i2o_${name}(indices)`, 'value')}\n }`;\n\n const setImplementation = rank < 2 ? '' : (() => {\n const functionParams = rankIdentity.map(i => `d${i}: u32`).join(', ');\n const dimsParams = rankIdentity.map(i => `d${i}`).join(', ');\n return `\n fn set_${name}(${functionParams}, value: ${valueType}) {\n set_${name}ByIndices(${indices(dimsParams)}, value);\n }`;\n })();\n\n const set = (...indicesAndValue: ReadonlyArray) => {\n if (indicesAndValue.length !== rank + 1) {\n throw new Error(`indices length must be ${rank}`);\n }\n const value = indicesAndValue[rank];\n if (typeof value !== 'string') {\n throw new Error('value must be string');\n }\n\n const normalizedIndices = indicesAndValue.slice(0, rank).map(normalizeDim).join(',');\n\n if (rank === 0) {\n return setByOffset('0u', value);\n } else if (rank === 1) {\n return setByOffset(normalizedIndices[0], value);\n } else {\n implementationUsed.set = true;\n implementationUsed.setByIndices = true;\n implementationUsed.indicesToOffset = true;\n return `set_${name}(${normalizedIndices}, ${value})`;\n }\n };\n\n const setByIndices = (varIndices: string, value: string) => {\n if (rank < 2) {\n return setByOffset(varIndices, value);\n } else {\n implementationUsed.setByIndices = true;\n implementationUsed.indicesToOffset = true;\n return `set_${name}ByIndices(${varIndices}, ${value});`;\n }\n };\n\n const impl = () => {\n const impls = [];\n let needShapeStrides = false;\n if (implementationUsed.offsetToIndices) {\n impls.push(offsetToIndicesImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.indicesToOffset) {\n impls.push(indicesToOffsetImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.broadcastedIndicesToOffset) {\n Object.values(broadcastedIndicesToOffsetImplementation).forEach(impl => impls.push(impl));\n needShapeStrides = true;\n }\n if (implementationUsed.set) {\n impls.push(setImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.setByIndices) {\n impls.push(setByIndicesImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.get) {\n impls.push(getImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.getByIndices) {\n impls.push(getByIndicesImplementation);\n needShapeStrides = true;\n }\n if (!useUniform && needShapeStrides) {\n impls.unshift(\n `const ${shape} = ${type.indices}(${shapeOrRank.join(',')});`,\n `const ${strides} = ${type.indices}(${ShapeUtil.computeStrides(shapeOrRank).join(',')});`);\n }\n return impls.join('\\n');\n };\n\n return {\n impl,\n type,\n offsetToIndices,\n indicesToOffset,\n broadcastedIndicesToOffset,\n indices,\n indicesGet,\n indicesSet,\n set,\n setByOffset,\n setByIndices,\n get,\n getByOffset,\n getByIndices,\n // isVec4,\n usage,\n name,\n strides,\n shape,\n rank\n };\n };\n\n/**\n * Create a IndicesHelper for an input.\n *\n * @param name - the name of the input.\n * @param type - the tensor type of the input.\n * @param shapeOrRank - the tensor shape or the rank of the input.\n * @param components - the number of components of the input. available values are 1, 2, 3, 4. default is 1.\n * @returns an IndicesHelper for the input.\n */\nexport const inputVariable =\n (name: string, type: number, shapeOrRank: number|readonly number[], components: 1|2|3|4 = 1): IndicesHelper =>\n createIndicesHelper(name, type, shapeOrRank, 'input', components);\n\n/**\n * Create a IndicesHelper for an output.\n *\n * @param name - the name of the output.\n * @param type - the tensor type of the output.\n * @param shapeOrRank - the tensor shape or the rank of the output.\n * @param components - the number of components of the output. available values are 1, 2, 3, 4. default is 1.\n * @returns an IndicesHelper for the output.\n */\nexport const outputVariable =\n (name: string, type: number, shapeOrRank: number|readonly number[], components: 1|2|3|4 = 1): IndicesHelper =>\n createIndicesHelper(name, type, shapeOrRank, 'output', components);\n\n/**\n * Create a IndicesHelper for an internal variable.\n *\n * @param name - the name of the variable.\n * @param type - the tensor type of the variable.\n * @param shapeOrRank - the tensor shape or the rank of the variable.\n * @param components - the number of components of the variable. available values are 1, 2, 3, 4. default is 1.\n * @returns an IndicesHelper for the variable.\n */\nexport const internalVariable =\n (name: string, type: number, shapeOrRank: number|readonly number[], components: 1|2|3|4 = 1): IndicesHelper =>\n createIndicesHelper(name, type, shapeOrRank, 'internal', components);\n\nexport type UniformDataElementType = 'u32'|'f16'|'f32'|'i32';\nexport type UniformsArrayType = Array<{name: string; type: UniformDataElementType; length?: number}>;\n\n/**\n * A ShaderHelper is a helper class for generating WGSL code.\n */\nexport interface ShaderHelper {\n /**\n * A helper function to generate the start of main function in WGSL source code.\n *\n * @example\n * const getShaderSource = (shaderHelper: ShaderHelper) => `\n * ...\n *\n * ${shaderHelper.mainStart()}\n * // your code here inside main() function\n * ...\n * }\n * `;\n *\n * @param workgroupSize - an optional workgroup size. default is WORKGROUP_SIZE.\n */\n mainStart(workgroupSize?: number|[number, number, number]): string;\n\n /**\n * A helper function to generate the code snippet for guarding against out-of-bounds size.\n *\n * @example\n * const getShaderSource = (shaderHelper: ShaderHelper) => `\n * ...\n *\n * ${shaderHelper.mainStart()}\n * ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes(outputSize)}\n *\n * // your code here inside main() function\n * ...\n * }\n * `;\n *\n * @param size - the size of the data to guard against. can be a number or a string (WGSL `u32` expression).\n */\n guardAgainstOutOfBoundsWorkgroupSizes(size: unknown): string;\n\n /**\n * A helper function to generate the code snippet for declaring multiple inputs or outputs.\n *\n * @param variables - an array of IndicesHelper for the variables.\n */\n declareVariables(...variables: IndicesHelper[]): string;\n\n /**\n * A helper function to register one uniform. Can be called multiple times to register multiple uniforms.\n *\n * @param name - the name of the uniform.\n * @param type - the type of the uniform.\n * @param length - the length of the uniform, default to 1 when it is not provided.\n */\n registerUniform(name: string, type: string, length?: number): ShaderHelper;\n\n /**\n * A helper function to register multiple uniforms. Can be called multiple times to register multiple uniforms.\n *\n * @param uniforms - an array of uniforms. Each element of the array is an object with 2 properties: `name` and\n * `type`.\n */\n registerUniforms(uniforms: UniformsArrayType): ShaderHelper;\n\n /**\n * A helper function to register multiple internal variables. Can be called multiple times to register multiple\n * internal variables.\n *\n * @param variables - an array of IndicesHelper for the variables.\n */\n registerInternalVariables(...variables: IndicesHelper[]): ShaderHelper;\n}\n\nclass ShaderHelperImpl implements ShaderHelper {\n constructor(private normalizedDispatchGroup: [number, number, number], private limits: GPUSupportedLimits) {}\n\n guardAgainstOutOfBoundsWorkgroupSizes(size: number|string): string {\n // Guard against out-of-bounds work group sizes\n const sizeInCode = typeof size === 'number' ? `${size}u` : size;\n return `if (global_idx >= ${sizeInCode}) { return; }`;\n }\n\n mainStart(workgroupSize: number|[number, number, number] = WORKGROUP_SIZE) {\n const workgroupSizeX = typeof workgroupSize === 'number' ? workgroupSize : workgroupSize[0];\n const workgroupSizeY = typeof workgroupSize === 'number' ? 1 : workgroupSize[1];\n const workgroupSizeZ = typeof workgroupSize === 'number' ? 1 : workgroupSize[2];\n\n if (workgroupSizeX > this.limits.maxComputeWorkgroupSizeX ||\n workgroupSizeY > this.limits.maxComputeWorkgroupSizeY ||\n workgroupSizeZ > this.limits.maxComputeWorkgroupSizeZ) {\n throw new Error(`workgroup size [${workgroupSizeX}, ${workgroupSizeY}, ${\n workgroupSizeZ}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${\n this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);\n }\n\n if (workgroupSizeX * workgroupSizeY * workgroupSizeZ > this.limits.maxComputeInvocationsPerWorkgroup) {\n throw new Error(`workgroup size [${workgroupSizeX}, ${workgroupSizeY}, ${\n workgroupSizeZ}] exceeds the maximum workgroup invocations ${\n this.limits.maxComputeInvocationsPerWorkgroup}.`);\n }\n\n const is1DimensionDispatch = this.normalizedDispatchGroup[1] === 1 && this.normalizedDispatchGroup[2] === 1;\n const paramList = is1DimensionDispatch ? `@builtin(global_invocation_id) global_id : vec3,\n @builtin(workgroup_id) workgroup_id : vec3,\n @builtin(local_invocation_id) local_id : vec3` :\n `@builtin(global_invocation_id) global_id : vec3,\n @builtin(local_invocation_id) local_id : vec3,\n @builtin(local_invocation_index) local_idx : u32,\n @builtin(workgroup_id) workgroup_id : vec3,\n @builtin(num_workgroups) num_workgroups : vec3`;\n const globalIdxDefinition = is1DimensionDispatch ?\n 'let global_idx = global_id.x; let local_idx = local_id.x;' :\n `let global_idx = (workgroup_id.z * num_workgroups[0] * num_workgroups[1] +\n workgroup_id.y * num_workgroups[0] + workgroup_id.x) * ${\n workgroupSizeX * workgroupSizeY * workgroupSizeZ}u + local_idx;`;\n\n return `@compute @workgroup_size(${workgroupSizeX}, ${workgroupSizeY}, ${workgroupSizeZ})\n fn main(${paramList}) {\n ${globalIdxDefinition}\n `;\n }\n\n private appendVariableUniforms(variable: IndicesHelper): void {\n if (variable.rank !== 0) {\n if (variable.shape.startsWith('uniforms.')) {\n this.uniforms.push({name: variable.shape.replace('uniforms.', ''), type: 'u32', length: variable.rank});\n }\n if (variable.strides.startsWith('uniforms.')) {\n this.uniforms.push({name: variable.strides.replace('uniforms.', ''), type: 'u32', length: variable.rank});\n }\n }\n }\n\n private declareVariable(variable: IndicesHelper, bindingIndex: number): string {\n if (variable.usage === 'internal') {\n throw new Error('cannot use internal variable with declareVariable(). use registerInternalVariables() instead.');\n }\n this.variables.push(variable);\n this.appendVariableUniforms(variable);\n\n const access = variable.usage === 'input' ? 'read' : 'read_write';\n const storageType = variable.type.storage;\n return `@group(0) @binding(${bindingIndex}) var ${variable.name}: array<${storageType}>;`;\n }\n\n declareVariables(...variables: IndicesHelper[]): string {\n return variables.map(v => this.declareVariable(v, this.variableIndex++)).join('\\n');\n }\n\n private registerInternalVariable(variable: IndicesHelper): void {\n if (variable.usage !== 'internal') {\n throw new Error(\n 'cannot use input or output variable with registerInternalVariable(). use declareVariables() instead.');\n }\n\n this.internalVariables.push(variable);\n this.appendVariableUniforms(variable);\n }\n\n registerInternalVariables(...variables: IndicesHelper[]): ShaderHelper {\n variables.forEach(v => this.registerInternalVariable(v));\n return this;\n }\n\n registerUniform(name: string, type: UniformDataElementType, length = 1): ShaderHelper {\n this.uniforms.push({name, type, length});\n return this;\n }\n\n registerUniforms(additionalUniforms: UniformsArrayType): ShaderHelper {\n this.uniforms = this.uniforms.concat(additionalUniforms);\n return this;\n }\n\n private internalVariables: IndicesHelper[] = [];\n private variables: IndicesHelper[] = [];\n private uniforms: UniformsArrayType = [];\n private uniformDeclaration(): string {\n if (this.uniforms.length === 0) {\n return '';\n }\n\n const uniformSnippets: string[] = [];\n for (const {name, type, length} of this.uniforms) {\n if (length && length > 4) {\n if (type === 'f16') {\n uniformSnippets.push(`@align(16) ${name}:array, ${Math.ceil(length / 8)}>`);\n } else {\n uniformSnippets.push(`${name}:array, ${Math.ceil(length / 4)}>`);\n }\n } else {\n const typeTemp = length == null || length === 1 ? type : `vec${length}<${type}>`;\n uniformSnippets.push(`${name}:${typeTemp}`);\n }\n }\n\n return `\n struct Uniforms { ${uniformSnippets.join(', ')} };\n @group(0) @binding(${this.variableIndex}) var uniforms: Uniforms;`;\n }\n private variableIndex = 0;\n\n /**\n * Get additional implementation that needs to be added to the shader source.\n */\n get additionalImplementations(): string {\n return this.uniformDeclaration() + this.variables.map(i => i.impl()).join('\\n') +\n this.internalVariables.map(i => i.impl()).join('\\n');\n }\n\n /**\n * Get the variable info of the shader program.\n */\n get variablesInfo(): ProgramUniformVariableInfo[]|undefined {\n if (this.uniforms.length === 0) {\n return undefined;\n }\n\n const uniformWgslTypeToDataType = (type: UniformDataElementType) =>\n ([DataType.uint32, DataType.float16, DataType.float,\n DataType.int32][['u32', 'f16', 'f32', 'i32'].indexOf(type)]);\n return this.uniforms.map(u => ([uniformWgslTypeToDataType(u.type), u.length ?? 1]));\n }\n}\n\nexport const createShaderHelper = (dispatchGroup: [number, number, number], limits: GPUSupportedLimits) =>\n new ShaderHelperImpl(dispatchGroup, limits);\n\n/**\n * This function comes from https://github.com/tensorflow/tfjs/blob/master/tfjs-core/src/ops/broadcast_util.ts#L18-L40\n * Returns the dimensions in the input shape that are broadcasted to\n * produce the provided output shape.\n *\n * The returned dimensions are 0-indexed and sorted. An example:\n * inShape = [4, 1, 3]\n * outShape = [5, 4, 3, 3]\n * result = [1]. Dimension 1 (2nd dimension of input) gets broadcasted 1 => 3.\n */\nexport const getBroadcastDims = (inShape: readonly number[], outShape: readonly number[]): number[] => {\n const inRank = inShape.length;\n const dims: number[] = [];\n for (let i = 0; i < inRank; i++) {\n const dim = inRank - 1 - i;\n const a = inShape[dim] || 1;\n const b = outShape[outShape.length - 1 - i] || 1;\n if (b > 1 && a === 1) {\n dims.unshift(dim);\n }\n }\n return dims;\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface TransposeAttributes extends AttributeWithCacheKey {\n readonly perm: number[];\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Transpose requires 1 input.');\n }\n};\n\nconst getAdjustedPerm = (inputRank: number, perm: number[]): number[] =>\n (perm && perm.length !== inputRank) ? [...(new Array(inputRank).keys())].reverse() : perm;\n\nconst getOutputShape = (inputShape: readonly number[], perm: number[]): readonly number[] =>\n ShapeUtil.sortBasedOnPerm(inputShape, getAdjustedPerm(inputShape.length, perm));\n\nconst permFunctionBody = (perm: number[], rank: number, input: IndicesHelper, output: IndicesHelper): string => {\n const reverseFunc = [];\n reverseFunc.push(`fn perm(i: ${output.type.indices}) -> ${input.type.indices} {\n var a: ${input.type.indices};`);\n for (let i = 0; i < rank; ++i) {\n reverseFunc.push(input.indicesSet('a', perm[i], `i[${i}]`));\n }\n reverseFunc.push('return a;}');\n return reverseFunc.join('\\n');\n};\n\nexport const createTransposeProgramInfo = (inputTensor: TensorView, permAttr: number[]): ProgramInfo => {\n const inputDataType = inputTensor.dataType;\n const inputRank = inputTensor.dims.length;\n const perm = getAdjustedPerm(inputRank, permAttr);\n const outputShape = getOutputShape(inputTensor.dims, perm);\n const output = outputVariable('output', inputDataType, outputShape.length);\n const input = inputVariable('a', inputDataType, inputRank);\n let getShaderSource;\n if (perm.length === 2 && perm[0] === 1 && perm[1] === 0) {\n const wgslType = output.type.value;\n const workgroupSize: [number, number, number] = [16, 16, 1];\n getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(input, output)}\n var tile : array, ${workgroupSize[0]}>;\n ${shaderHelper.mainStart(workgroupSize)}\n var x = workgroup_id.x * ${workgroupSize[0]}u + local_id.x;\n var y = workgroup_id.y * ${workgroupSize[0]}u + local_id.y;\n let width = uniforms.output_shape[0];\n let height = uniforms.output_shape[1];\n if (x < width && y < height) {\n tile[local_id.y][local_id.x] = ${input.getByOffset('y * width + x')};\n }\n workgroupBarrier();\n x = workgroup_id.y * ${workgroupSize[0]}u + local_id.x;\n y = workgroup_id.x * ${workgroupSize[0]}u + local_id.y;\n if (x < height && y < width) {\n ${output.setByOffset('y * height + x', 'tile[local_id.x][local_id.y]')}\n }\n }`;\n } else {\n getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(input, output)}\n\n ${permFunctionBody(perm, inputRank, input, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let indices = ${output.offsetToIndices('global_idx')};\n let aIndices = perm(indices);\n\n ${output.setByOffset('global_idx', input.getByIndices('aIndices'))}\n }`;\n }\n return {\n name: 'Transpose',\n shaderCache: {hint: `${permAttr}`, inputDependencies: ['rank']},\n getRunData: (inputs) => {\n const outputSize = ShapeUtil.size(outputShape);\n return {\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms:\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(inputs[0].dims, outputShape)],\n };\n },\n getShaderSource,\n };\n};\n\nexport const transpose = (context: ComputeContext, attributes: TransposeAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createTransposeProgramInfo(context.inputs[0], attributes.perm));\n};\n\nexport const parseTransposeAttributes = (attributes: Record): TransposeAttributes =>\n createAttributeWithCacheKey({perm: attributes.perm as number[]});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramShaderCacheInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper} from './common';\nimport {createReduceAttributesFromInputs, ReduceAttributes} from './reduce';\nimport {createTransposeProgramInfo} from './transpose';\n\nconst reduceOps: {[key: string]: string} = {\n max: 'select(bestValue, candidate, candidate > bestValue)',\n min: 'select(bestValue, candidate, candidate < bestValue)',\n mean: 'bestValue + candidate',\n sum: 'bestValue + candidate',\n prod: 'bestValue * candidate',\n sumSquare: 'bestValue + candidate * candidate',\n logSumExp: 'bestValue + exp(candidate)',\n l1: 'bestValue + abs(candidate)',\n l2: 'bestValue + candidate * candidate',\n logSum: 'bestValue + candidate'\n};\n\nconst reduceSharedOps: {[key: string]: string} = {\n max: 'select(bestValue, candidate, candidate > bestValue)',\n min: 'select(bestValue, candidate, candidate < bestValue)',\n mean: 'bestValue + candidate',\n sum: 'bestValue + candidate',\n prod: 'bestValue * candidate',\n sumSquare: 'bestValue + candidate',\n logSumExp: 'bestValue + candidate',\n l1: 'bestValue + candidate',\n l2: 'bestValue + candidate',\n logSum: 'bestValue + candidate'\n};\n\nconst reduceInitValues: {[key: string]: string} = {\n max: '_A[offset]',\n min: '_A[offset]',\n mean: '0',\n sum: '0',\n prod: '1',\n sumSquare: '0',\n logSumExp: '0',\n l1: '0',\n l2: '0',\n logSum: '0'\n};\n\nconst reduceOutputValues: {[key: string]: string} = {\n max: 'bestValue',\n min: 'bestValue',\n sum: 'bestValue',\n prod: 'bestValue',\n sumSquare: 'bestValue',\n logSumExp: 'log(bestValue)',\n l1: 'bestValue',\n l2: 'sqrt(bestValue)',\n logSum: 'log(bestValue)'\n};\n\nconst getInnerMostAxes = (numInnerAxes: number, rank: number): number[] => {\n const res = [];\n for (let i = rank - numInnerAxes; i < rank; ++i) {\n res.push(i);\n }\n return res;\n};\n\nconst computeOutAndReduceShapes = (shape: readonly number[], axes: readonly number[]): [number[], number[]] => {\n const outputShape = [];\n const rank = shape.length;\n for (let dim = 0; dim < rank; dim++) {\n if (axes.indexOf(dim) === -1) {\n outputShape.push(shape[dim]);\n }\n }\n const reduceShape = axes.map(dim => shape[dim]);\n return [outputShape, reduceShape];\n};\n\nconst expandShapeToKeepDim = (shape: number[], axes: number[]): number[] => {\n const rank = shape.length + axes.length;\n const expandShape = [];\n let shapeIdx = 0;\n for (let dim = 0; dim < rank; dim++) {\n if (axes.indexOf(dim) === -1) {\n expandShape.push(shape[shapeIdx++]);\n } else {\n expandShape.push(1);\n }\n }\n return expandShape;\n};\n\nconst areAxesInnerMostDims = (axes: number[], rank: number): boolean => {\n for (let i = 0; i < axes.length; ++i) {\n if (axes[axes.length - i - 1] !== rank - 1 - i) {\n return false;\n }\n }\n return true;\n};\n\nconst getAxesPermutation = (axes: number[], rank: number): number[] => {\n const res = [];\n if (!areAxesInnerMostDims(axes, rank)) {\n for (let i = 0; i < rank; ++i) {\n if (axes.indexOf(i) === -1) {\n res.push(i);\n }\n }\n axes.forEach(axis => res.push(axis));\n }\n return res;\n};\n\nexport const createReduceSharedProgramInfo =\n (name: string, shaderCache: ProgramShaderCacheInfo, inputs: readonly TensorView[], reduceType: string,\n outputDataType: DataType, outputShape: number[], reduceShape: number[]): ProgramInfo => {\n const inputShape = inputs[0].dims;\n\n const outputSize = ShapeUtil.size(outputShape);\n const reduceSize = ShapeUtil.size(reduceShape);\n\n const input = inputVariable('_A', inputs[0].dataType, inputShape);\n const output = outputVariable('output', outputDataType, outputShape);\n\n const workgroupSize = 32;\n\n const sharedMemorySnippet = `\n var aBestValues : array;\n `;\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniform('reduceSize', 'u32').declareVariables(input, output)}\n ${sharedMemorySnippet}\n fn DIV_CEIL(a : u32, b : u32) -> u32 {\n return ((a - 1u) / b + 1u);\n }\n ${shaderHelper.mainStart(workgroupSize)}\n\n let outputIndex = global_idx / ${workgroupSize};\n let offset = outputIndex * uniforms.reduceSize;\n\n var bestValue = f32(${reduceInitValues[reduceType]});\n let Length = uniforms.reduceSize;\n for (var k = local_idx; k < Length; k = k + ${workgroupSize}) {\n let candidate = f32(${input.getByOffset('offset + k')});\n bestValue = ${reduceOps[reduceType]};\n }\n aBestValues[local_idx] = bestValue;\n workgroupBarrier();\n\n var reduceSize = min(Length, ${workgroupSize}u);\n for (var currentSize = reduceSize / 2u; reduceSize > 1u;\n currentSize = reduceSize / 2u) {\n let interval = DIV_CEIL(reduceSize, 2u);\n if (local_idx < currentSize) {\n let candidate = aBestValues[local_idx + interval];\n bestValue = ${reduceSharedOps[reduceType]};\n aBestValues[local_idx] = bestValue;\n }\n reduceSize = interval;\n workgroupBarrier();\n }\n\n if (local_idx == 0u) {\n ${\n output.setByOffset(\n 'outputIndex',\n `${\n reduceType === 'mean' ? `${output.type.storage}(bestValue / f32(uniforms.reduceSize))` :\n `${output.type.storage}(${reduceOutputValues[reduceType]})`}`)};\n }\n }`;\n\n // One work group is responsible for only one element of output.\n return {\n name,\n shaderCache,\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: outputDataType}],\n dispatchGroup: {x: outputSize},\n programUniforms: [{type: DataType.uint32, data: reduceSize}]\n }),\n };\n };\n\nconst reduceCommon =\n (context: ComputeContext, name: string, attributes: ReduceAttributes,\n reduceType: 'sum'|'sumSquare'|'prod'|'min'|'max'|'mean'|'logSumExp'|'l1'|'l2'|'logSum'): void => {\n const updatedAttributes: ReduceAttributes =\n context.inputs.length === 1 ? attributes : createReduceAttributesFromInputs(context.inputs, attributes);\n\n let updatedAxes = updatedAttributes.axes;\n if (updatedAxes.length === 0 && !updatedAttributes.noopWithEmptyAxes) {\n updatedAxes = context.inputs[0].dims.map((_dim, i) => i);\n }\n const normalizeAxes = ShapeUtil.normalizeAxes(updatedAxes, context.inputs[0].dims.length);\n\n let axes = normalizeAxes;\n let input = context.inputs[0];\n const permutedAxes = getAxesPermutation(axes, context.inputs[0].dims.length);\n if (permutedAxes.length > 0) {\n input = context.compute(\n createTransposeProgramInfo(context.inputs[0], permutedAxes), {inputs: [0], outputs: [-1]})[0];\n axes = getInnerMostAxes(axes.length, input.dims.length);\n }\n\n const [outputShape, reduceShape] = computeOutAndReduceShapes(input.dims, axes);\n let finalOutputShape = outputShape;\n if (updatedAttributes.keepDims) {\n finalOutputShape = expandShapeToKeepDim(outputShape, normalizeAxes);\n }\n\n context.compute(\n createReduceSharedProgramInfo(\n name, {hint: updatedAttributes.cacheKey, inputDependencies: ['type']}, [input], reduceType,\n context.inputs[0].dataType, finalOutputShape, reduceShape),\n {inputs: [input]});\n };\n\nexport const reduceMeanShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceMeanShared', attributes, 'mean');\n};\n\nexport const reduceL1Shared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceL1Shared', attributes, 'l1');\n};\n\nexport const reduceL2Shared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceL2Shared', attributes, 'l2');\n};\n\nexport const reduceLogSumExpShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceLogSumExpShared', attributes, 'logSumExp');\n};\n\nexport const reduceMaxShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceMaxShared', attributes, 'max');\n};\n\nexport const reduceMinShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceMinShared', attributes, 'min');\n};\n\nexport const reduceProdShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceProdShared', attributes, 'prod');\n};\n\nexport const reduceSumShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceSumShared', attributes, 'sum');\n};\n\nexport const reduceSumSquareShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceSumSquareShared', attributes, 'sumSquare');\n};\n\nexport const reduceLogSumShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceLogSumShared', attributes, 'logSum');\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramShaderCacheInfo} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\nimport {reduceL1Shared, reduceL2Shared, reduceLogSumExpShared, reduceLogSumShared, reduceMaxShared, reduceMeanShared, reduceMinShared, reduceProdShared, reduceSumShared, reduceSumSquareShared} from './reduce-shared';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length === 0 || inputs.length > 2) {\n throw new Error('Reduce op requires 1 or 2 inputs.');\n }\n\n if (inputs.length === 2 && inputs[1].dims.length !== 1) {\n throw new Error('Invalid axes input dims.');\n }\n};\n\nexport interface ReduceAttributes extends AttributeWithCacheKey {\n keepDims: boolean;\n noopWithEmptyAxes: boolean;\n axes: number[];\n}\n\nexport type ReduceOp =\n (input: IndicesHelper, output: IndicesHelper,\n axes: readonly number[]) => [string, string, string, string, ...string[]];\n\nconst noOp: ReduceOp = (input) => ['', '', `var value = ${input.getByIndices('input_indices')};`, ''];\nexport const createReduceProgramInfo =\n (name: string, shaderCache: ProgramShaderCacheInfo, inputs: readonly TensorView[], reduceOp: ReduceOp,\n axesInput: number[], outputDataType: DataType, keepDims = false, noopWithEmptyAxes = false): ProgramInfo => {\n const outputShape: number[] = [];\n const inputShape = inputs[0].dims;\n const inputRank = inputShape.length;\n const axes = ShapeUtil.normalizeAxes(axesInput, inputRank);\n const reduceOnAllAxes = !noopWithEmptyAxes && axes.length === 0;\n inputShape.forEach((d, i) => {\n if (reduceOnAllAxes || axes.indexOf(i) >= 0) {\n if (keepDims) {\n outputShape.push(1);\n } // else { // skip this axis}\n } else {\n outputShape.push(d);\n }\n });\n const outputRank = outputShape.length;\n const outputSize = ShapeUtil.size(outputShape);\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const idxCopy: string[] = []; // copy output indexes to input indexes\n\n const input = inputVariable('_A', inputs[0].dataType, inputRank);\n const output = outputVariable('output', outputDataType, outputRank);\n const ops = reduceOp(input, output, axes);\n let reduceOps = ops[2];\n\n for (let k = 0, l = 0; k < inputRank; k++) {\n // if this axis is reduced\n if (reduceOnAllAxes || axes.indexOf(k) >= 0) {\n if (keepDims) {\n l++;\n }\n // loop over the d-th axis\n reduceOps = `for(var j${k}: u32 = 0; j${k} < ${inputShape[k]}; j${k}++) {\n ${ops[2].includes('last_index') ? `let last_index = j${k};` : ''}\n ${input.indicesSet('input_indices', k, `j${k}`)}\n ${reduceOps}\n }`;\n } else {\n idxCopy.push(`${input.indicesSet('input_indices', k, output.indicesGet('output_indices', l))};`);\n l++;\n }\n }\n return `\n\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(input, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n var input_indices: ${input.type.indices};\n let output_indices = ${output.offsetToIndices('global_idx')};\n\n ${idxCopy.join('\\n')}\n ${ops[0]} // init ops for reduce max/min\n ${ops[1]}\n ${reduceOps}\n ${ops[3]}\n ${ops.length === 4 ? output.setByOffset('global_idx', 'value') : ops.slice(4).join('\\n')}\n }`;\n };\n\n return {\n name,\n shaderCache,\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: outputDataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms:\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(inputShape, outputShape)]\n }),\n };\n };\n\nexport const createReduceAttributesFromInputs =\n (inputs: readonly TensorView[], attributes: ReduceAttributes): ReduceAttributes => {\n const axes: number[] = [];\n if (inputs[1].dims[0] > 0) {\n inputs[1].getBigInt64Array().forEach(v => axes.push(Number(v)));\n }\n return createAttributeWithCacheKey(\n {axes, keepDims: attributes.keepDims, noopWithEmptyAxes: attributes.noopWithEmptyAxes});\n };\n\nconst runReduceProgram =\n (context: ComputeContext, name: string, attributes: ReduceAttributes, reduceOp: ReduceOp): void => {\n const inputs = context.inputs;\n const updatedAttributes: ReduceAttributes =\n inputs.length === 1 ? attributes : createReduceAttributesFromInputs(inputs, attributes);\n\n context.compute(\n createReduceProgramInfo(\n name, {hint: updatedAttributes.cacheKey, inputDependencies: ['rank']}, [inputs[0]],\n updatedAttributes.noopWithEmptyAxes && updatedAttributes.axes.length === 0 ? noOp : reduceOp,\n updatedAttributes.axes, inputs[0].dataType, updatedAttributes.keepDims,\n updatedAttributes.noopWithEmptyAxes),\n {inputs: [0]});\n };\n\nconst reduceLogSumNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(0);`,\n '',\n `value += ${input.getByIndices('input_indices')};`,\n 'value = log(value);',\n ];\n runReduceProgram(context, 'ReduceLogSum', attributes, reduceOp);\n};\n\nconst reduceL1Naive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(0);`,\n '',\n `value += abs(${input.getByIndices('input_indices')});`,\n '',\n ];\n runReduceProgram(context, 'ReduceL1', attributes, reduceOp);\n};\n\nconst reduceL2Naive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var t = ${output.type.value}(0); var value = ${output.type.value}(0);`,\n '',\n `t = ${input.getByIndices('input_indices')}; value += (t * t);`,\n 'value = sqrt(value);',\n ];\n runReduceProgram(context, 'ReduceL2', attributes, reduceOp);\n};\n\nconst reduceLogSumExpNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(0);`,\n '',\n `value += exp(${input.getByIndices('input_indices')});`,\n 'value = log(value);',\n ];\n runReduceProgram(context, 'ReduceLogSumExp', attributes, reduceOp);\n};\n\nconst reduceMaxNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, _output, axes) => {\n const idxZero = [];\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(input.indicesSet('input_indices', k, 0));\n }\n }\n\n return [\n `${idxZero.join('\\n')}`,\n `var value = ${input.getByIndices('input_indices')};`,\n `value = max(value, ${input.getByIndices('input_indices')});`,\n '',\n ];\n };\n runReduceProgram(context, 'ReduceMax', attributes, reduceOp);\n};\n\nconst reduceMeanNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output, axes) => {\n let size = 1.0;\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n // TODO: this depends on the input dims. If we want to use uniform, this need to be updated.\n size *= context.inputs[0].dims[k];\n }\n }\n\n return [\n 'var sum = f32(0);',\n '',\n `sum += f32(${input.getByIndices('input_indices')});`,\n `let value = ${output.type.value}(sum / ${size});`,\n ];\n };\n runReduceProgram(context, 'ReduceMean', attributes, reduceOp);\n};\n\nconst reduceMinNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, _output, axes) => {\n const idxZero = [];\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(`input_indices[${k}] = 0;`); // first element\n }\n }\n\n return [\n `${idxZero.join('\\n')}`,\n `var value = ${input.getByIndices('input_indices')};`,\n `value = min(value, ${input.getByIndices('input_indices')});`,\n '',\n ];\n };\n runReduceProgram(context, 'ReduceMin', attributes, reduceOp);\n};\n\nconst reduceProdNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(1);`,\n '',\n `value *= ${input.getByIndices('input_indices')};`,\n '',\n ];\n runReduceProgram(context, 'ReduceProd', attributes, reduceOp);\n};\n\nconst reduceSumNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(0);`,\n '',\n `value += ${input.getByIndices('input_indices')};`,\n '',\n ];\n runReduceProgram(context, 'ReduceSum', attributes, reduceOp);\n};\n\nconst reduceSumSquareNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var t = ${output.type.value}(0); var value = ${output.type.value}(0);`,\n '',\n `t = ${input.getByIndices('input_indices')}; value += t * t;`,\n '',\n ];\n runReduceProgram(context, 'ReduceSumSquare', attributes, reduceOp);\n};\n\nconst useNaiveReduceMethod =\n (shape: readonly number[], axes: readonly number[], noopWithEmptyAxes: boolean): boolean => {\n if (axes.length === 0) {\n return noopWithEmptyAxes;\n }\n\n let outputSize = 1;\n let reduceSize = 1;\n for (let dim = 0; dim < axes.length; dim++) {\n if (axes.indexOf(dim) === -1) {\n outputSize *= shape[dim];\n } else {\n reduceSize *= shape[dim];\n }\n }\n\n // The condition data is very rough, although considering the count of Execution Unit (EU), the potential\n // work groups in a EU and the counts of loops in the naive and shared methods, also doing experiments\n // on some machines.\n return reduceSize < 32 && outputSize > 1024;\n };\n\nexport const reduceMean = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceMeanNaive(context, attributes);\n } else {\n reduceMeanShared(context, attributes);\n }\n};\n\nexport const reduceL1 = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceL1Naive(context, attributes);\n } else {\n reduceL1Shared(context, attributes);\n }\n};\n\nexport const reduceL2 = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceL2Naive(context, attributes);\n } else {\n reduceL2Shared(context, attributes);\n }\n};\n\nexport const reduceLogSumExp = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceLogSumExpNaive(context, attributes);\n } else {\n reduceLogSumExpShared(context, attributes);\n }\n};\n\nexport const reduceMax = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceMaxNaive(context, attributes);\n } else {\n reduceMaxShared(context, attributes);\n }\n};\n\nexport const reduceMin = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceMinNaive(context, attributes);\n } else {\n reduceMinShared(context, attributes);\n }\n};\n\nexport const reduceProd = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceProdNaive(context, attributes);\n } else {\n reduceProdShared(context, attributes);\n }\n};\n\nexport const reduceSum = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceSumNaive(context, attributes);\n } else {\n reduceSumShared(context, attributes);\n }\n};\n\nexport const reduceSumSquare = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceSumSquareNaive(context, attributes);\n } else {\n reduceSumSquareShared(context, attributes);\n }\n};\n\nexport const reduceLogSum = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceLogSumNaive(context, attributes);\n } else {\n reduceLogSumShared(context, attributes);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// TODO: this is the same naive implementation we use for reduce that has\n// performance limitations when the reduced axis is long. Need to add\n// a optimized codepath for this.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext} from '../types';\n\nimport {createReduceProgramInfo, ReduceOp} from './reduce';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length === 0 || inputs.length > 2) {\n throw new Error('ArgMinMaxOp op requires 1 or 2 inputs.');\n }\n if (inputs[0].dataType !== DataType.float) {\n throw new Error('Invalid input type.');\n }\n};\n\nexport interface ArgMinMaxAttributes extends AttributeWithCacheKey {\n keepDims: boolean;\n axis: number;\n selectLastIndex: number;\n}\n\nexport const argMin = (context: ComputeContext, attributes: ArgMinMaxAttributes): void => {\n validateInputs(context.inputs);\n const argMinMaxOp: ReduceOp = (input, output, axes) => {\n const idxZero = [];\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(`input_indices[${k}] = 0;`); // first element\n }\n }\n return [\n `${idxZero.join('\\n')}`, `var value = ${input.getByIndices('input_indices')};\\nvar best_index : i32 = 0;`,\n `if (${input.getByIndices('input_indices')} ${attributes.selectLastIndex > 0 ? '<=' : '<'} value) {\n value = ${input.getByIndices('input_indices')};\n best_index = i32(last_index);\n }`,\n '', output.setByOffset('global_idx', 'best_index')\n ];\n };\n\n context.compute(\n createReduceProgramInfo(\n 'ArgMin', {hint: attributes.cacheKey, inputDependencies: ['rank']}, [context.inputs[0]], argMinMaxOp,\n [attributes.axis], DataType.int64, attributes.keepDims),\n {inputs: [0]});\n};\n\nexport const argMax = (context: ComputeContext, attributes: ArgMinMaxAttributes): void => {\n validateInputs(context.inputs);\n const argMinMaxOp: ReduceOp = (input, output, axes) => {\n const idxZero = [];\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(`input_indices[${k}] = 0;`); // first element\n }\n }\n return [\n `${idxZero.join('\\n')}`, `var value = ${input.getByIndices('input_indices')};\\nvar best_index : i32 = 0;`,\n `if (${input.getByIndices('input_indices')} ${attributes.selectLastIndex > 0 ? '>=' : '>'} value) {\n value = ${input.getByIndices('input_indices')};\n best_index = i32(last_index);\n }`,\n '', output.setByOffset('global_idx', 'best_index')\n ];\n };\n\n context.compute(\n createReduceProgramInfo(\n 'argMax', {hint: attributes.cacheKey, inputDependencies: ['rank']}, [context.inputs[0]], argMinMaxOp,\n [attributes.axis], DataType.int64, attributes.keepDims),\n {inputs: [0]});\n};\n\nexport const parseArgMinMaxAttributes = (attributes: Record): ArgMinMaxAttributes =>\n createAttributeWithCacheKey(attributes as Omit);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ComputeContext, GpuDataType, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {getMaxComponents, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, tensorTypeToWsglValueType, UniformDataElementType, UniformsArrayType} from './common';\n\nexport const enum AttentionQkvFormat {\n unknown, // enum value not set, or depends on qkv projection implementation details\n qkvBNSH, // for non-packed qkv, permuted\n qkvBSNH, // for non-packed qkv, not permuted, used by memory efficient attention or MultiHeadAttention\n qkvBSN3H, // for TRT fused attention, qkv are packed\n qkvBNSHqkvBS3NH, // for TRT fused causal attention, data has two formats (qkv is 3BNSH, gemm_buffer is BS3NH)\n qKvBSNHxBSN2H, // for TRT fused cross attention, kv are packed\n qkvTNH, // for memory efficient attention, qkv are not packed, and paddings are removed.\n qkvTN3H, // for TRT fused attention, qkv are packed and paddings are removed\n}\n\nexport const enum AttentionMaskType {\n none, // No mask\n mask1dKeySeqLen, // [batch_size], key sequence length\n mask1dEndStart, // [2 * batch_size] with end positions and start positions\n mask1DKeySeqLenStart, // [3 * batch_size + 2] with [key_len[0], ..., key_len[batch_size - 1], query_start[0],\n // ..., query_start[batch_size - 1], query_end[batch_size - 1], key_start[0], ...,\n // key_start[batch_size - 1], key_end[batch_size - 1]]\n mask2dDummy, // dummy mask with shape [1, 1] or [batch_size, 1]. It has same effect as no mask.\n mask2dKeyPadding, // [batch_size, total_sequence_length]\n mask3dAttention, // [batch_size, sequence_length, total_sequence_length]\n mask4dMegatron, // Megatron causal mask with shape [batch_size, 1, max_sequence_length, max_sequence_length]\n maskUnknown\n}\n\nexport interface AttentionParameters {\n batchSize: number;\n sequenceLength: number;\n pastSequenceLength: number;\n kvSequenceLength: number;\n totalSequenceLength: number;\n maxSequenceLength: number;\n inputHiddenSize: number;\n hiddenSize: number;\n vHiddenSize: number;\n headSize: number;\n vHeadSize: number;\n numHeads: number;\n kvNumHeads?: number;\n nReps?: number;\n isUnidirectional?: boolean;\n pastPresentShareBuffer: boolean;\n maskFilterValue?: number;\n maskType: AttentionMaskType;\n scale: number;\n broadcastResPosBias: boolean;\n passPastInKv: boolean;\n qkvFormat: AttentionQkvFormat;\n isPastkvBSNH?: boolean;\n}\n\nexport interface AttentionAttrs {\n numHeads: number;\n kvNumHeads?: number;\n isUnidirectional?: number;\n maskFilterValue?: number;\n scale: number;\n doRotary: number;\n qkvHiddenSizes: number[];\n pastPresentShareBuffer: boolean;\n}\n\nconst validateAttentionInputs = (inputs: readonly TensorView[], attributes: AttentionAttrs): AttentionParameters => {\n // Abbreviation and Meanings:\n // B: batch_size\n // S: sequence_length (input sequence length of query)\n // P: past_sequence_length (past sequence length of key or value)\n // L: kv_sequence_length (input sequence length of key or value)\n // M: max_sequence_length\n // T: total_sequence_length = past_sequence_length + kv_sequence_length\n // N: num_heads\n // H: head size for Q and K, aka q_head_size or k_head_size or qk_head_size\n // H_v: v_head_size\n // D_i: input hidden size\n // D: hidden size for Q and K (D = N * H), aka q_hidden_size or k_hidden_size or qk_hidden_size\n // D_v: v_hidden_size = num_heads * v_head_size\n\n // When past state is used, Q, K and V should have same hidden size (unless we split it into past_key and past_value).\n\n // Input shapes:\n // input (Q/K/V) : (B, S, D_i)\n // weights (Q/K/V) : (D_i, D + D + D_v)\n // bias (Q/K/V) : (D + D + D_v)\n // mask_index : see below\n // past (K/V) : (2, B, N, P, H) or NULL\n // relative_position_bias : (B, N, S, T) or NULL\n\n // For mask_index, the following shapes are supported:\n // NULL, (B, 1), (1, 1)\n // (B), (2 * B), (3 * B + 2)\n // (B, T)\n // (B, S, T)\n // (B, 1, M, M)\n //\n // When a model is pruned (like some attention heads are removed in Q/K/V), input_hidden_size could be larger\n // than hidden dimension of Q, K and V.\n\n const input = inputs[0];\n const weights = inputs[1];\n const bias = inputs[2];\n const maskIndex = inputs[3];\n const past = inputs[4];\n const relativePositionBias = inputs[5];\n\n if (past && relativePositionBias) {\n throw new Error('Attention cannot have both past and relative_position_bias');\n }\n\n if (input.dims.length !== 3) {\n throw new Error('Input \"input\" must have 3 dimensions');\n }\n\n const batchSize = input.dims[0];\n const sequenceLength = input.dims[1];\n const inputHiddenSize = input.dims[2];\n\n if (bias.dims.length !== 1) {\n throw new Error('Input \"bias\" is expected to have 1 dimensions');\n }\n\n if (weights.dims.length !== 2) {\n throw new Error('Input \"weights\" is expected to have 2 dimensions');\n }\n\n if (weights.dims[0] !== inputHiddenSize) {\n throw new Error('Input 1 dimension 0 should have same length as dimension 2 of input 0');\n }\n\n if (bias.dims[0] !== weights.dims[1]) {\n throw new Error('Input \"bias\" dimension 0 should have same length as dimension 1 of input \"weights\"');\n }\n\n let qHiddenSize = bias.dims[0] / 3;\n let kHiddenSize = qHiddenSize;\n let vHiddenSize = kHiddenSize;\n if (attributes.qkvHiddenSizes.length > 0) {\n if (attributes.qkvHiddenSizes.length !== 3) {\n throw new Error('qkv_hidden_sizes attribute should have 3 elements');\n }\n for (const sz of attributes.qkvHiddenSizes) {\n if (sz % attributes.numHeads !== 0) {\n throw new Error('qkv_hidden_sizes should be divisible by num_heads');\n }\n }\n\n qHiddenSize = attributes.qkvHiddenSizes[0];\n kHiddenSize = attributes.qkvHiddenSizes[1];\n vHiddenSize = attributes.qkvHiddenSizes[2];\n }\n\n const kvSequenceLength = sequenceLength;\n\n if (qHiddenSize !== kHiddenSize) {\n throw new Error('qkv_hidden_sizes first element should be same as the second');\n }\n\n if (bias.dims[0] !== qHiddenSize + kHiddenSize + vHiddenSize) {\n throw new Error('Input \"bias\" dimension 0 should have same length as sum of Q/K/V hidden sizes');\n }\n\n let pastSequenceLength = 0;\n if (past) {\n if (kHiddenSize !== vHiddenSize) {\n throw new Error('Input \"past\" expect k_hidden_size == v_hidden_size');\n }\n if (past.dims.length !== 5) {\n throw new Error('Input \"past\" must have 5 dimensions');\n }\n if (past.dims[0] !== 2) {\n throw new Error('Input \"past\" first dimension must be 2');\n }\n if (past.dims[1] !== batchSize) {\n throw new Error('Input \"past\" second dimension must be batch_size');\n }\n if (past.dims[2] !== attributes.numHeads) {\n throw new Error('Input \"past\" third dimension must be num_heads');\n }\n if (past.dims[4] !== kHiddenSize / attributes.numHeads) {\n throw new Error('Input \"past\" fifth dimension must be k_hidden_size / num_heads');\n }\n\n if (!attributes.pastPresentShareBuffer) {\n pastSequenceLength = past.dims[3];\n }\n // TODO: handle past_seq_len\n }\n\n const totalSequenceLength = kvSequenceLength + pastSequenceLength;\n const maxSequenceLength = -1;\n\n const maskType = AttentionMaskType.none;\n if (maskIndex) {\n // maskType = AttentionMaskType.MASK_UNKNOWN;\n // TODO: handle mask\n throw new Error('Mask not supported');\n }\n\n if (past) {\n throw new Error('past is not supported');\n }\n\n return {\n batchSize,\n sequenceLength,\n pastSequenceLength,\n kvSequenceLength,\n totalSequenceLength,\n maxSequenceLength,\n inputHiddenSize,\n hiddenSize: qHiddenSize,\n vHiddenSize,\n headSize: Math.floor(qHiddenSize / attributes.numHeads),\n vHeadSize: Math.floor(vHiddenSize / attributes.numHeads),\n numHeads: attributes.numHeads,\n isUnidirectional: false,\n pastPresentShareBuffer: false,\n maskFilterValue: attributes.maskFilterValue,\n maskType,\n scale: attributes.scale,\n broadcastResPosBias: false,\n passPastInKv: false,\n qkvFormat: AttentionQkvFormat.qkvBNSH,\n };\n};\n\nconst createInPlaceSoftmaxProgramInfo = (_context: ComputeContext, input: TensorView, n: number, d: number) => {\n const components = getMaxComponents(d);\n let WG = 64;\n const dComp = d / components;\n if (dComp < WG) {\n WG = 1;\n } else if (dComp / 8 < 64) {\n WG = Math.ceil(dComp / 8);\n }\n const elementsPerThread = Math.ceil(d / components / WG);\n const programUniforms: ProgramUniform[] = [\n {type: input.dataType, data: 1 / d}, {type: DataType.uint32, data: dComp},\n {type: DataType.uint32, data: elementsPerThread}\n ];\n const dataType = tensorTypeToWsglStorageType(input.dataType, components);\n const f32Type = tensorTypeToWsglValueType(DataType.float, components);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const inputHelper = outputVariable('x', input.dataType, input.dims, components);\n const elemValueType = tensorTypeToWsglValueType(input.dataType);\n const uniforms: UniformsArrayType = [\n {name: 'd_inv', type: elemValueType as UniformDataElementType}, {name: 'd_comp', type: 'u32'},\n {name: 'elements_per_thread', type: 'u32'}\n ];\n\n return `\n var thread_max: array;\n var thread_sum: array;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(inputHelper)}\n ${shaderHelper.mainStart([\n WG, 1, 1\n ])}\n let local_offset = local_idx * uniforms.elements_per_thread;\n let offset = workgroup_id.x * uniforms.d_comp + local_offset;\n\n var thread_max_vector = ${f32Type}(-3.402823e+38f);\n for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < uniforms.d_comp; i++) {\n thread_max_vector = max(${f32Type}(x[offset + i]), thread_max_vector);\n }\n thread_max[local_idx] = ${(() => {\n switch (components) {\n case 1:\n return 'thread_max_vector';\n case 2:\n return 'max(thread_max_vector.x, thread_max_vector.y)';\n case 4:\n return 'max(max(thread_max_vector.x, thread_max_vector.y), max(thread_max_vector.z, thread_max_vector.w))';\n default:\n throw new Error(`Unsupported components: ${components}`);\n }\n })()};\n workgroupBarrier();\n\n var max_value = f32(-3.402823e+38f);\n for (var i = 0u; i < ${WG}; i++) {\n max_value = max(thread_max[i], max_value);\n }\n\n var sum_vector = ${f32Type}(0);\n for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < uniforms.d_comp; i++) {\n sum_vector += exp(${f32Type}(x[offset + i]) - max_value);\n }\n thread_sum[local_idx] = ${(() => {\n switch (components) {\n case 1:\n return 'sum_vector';\n case 2:\n return 'sum_vector.x + sum_vector.y';\n case 4:\n return 'sum_vector.x + sum_vector.y + sum_vector.z + sum_vector.w';\n default:\n throw new Error(`Unsupported components: ${components}`);\n }\n })()};\n workgroupBarrier();\n\n var sum: f32 = 0;\n for (var i = 0u; i < ${WG}; i++) {\n sum += thread_sum[i];\n }\n\n if (sum == 0) {\n for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < uniforms.d_comp; i++) {\n x[offset + i] = ${inputHelper.type.value}(uniforms.d_inv);\n }\n } else {\n for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < uniforms.d_comp; i++) {\n var f32input = ${f32Type}(x[offset + i]);\n x[offset + i] = ${inputHelper.type.value}(exp(f32input - max_value) / sum);\n }\n }\n }`;\n };\n\n return {\n name: 'AttentionProbsSoftmax',\n shaderCache: {hint: `${WG};${dataType};${components}`},\n getShaderSource,\n getRunData: () => ({outputs: [], dispatchGroup: {x: n}, programUniforms}),\n };\n};\n\nconst createAttentionProbsProgramInfo =\n (context: ComputeContext, q: TensorView, key: TensorView, pastKey: TensorView|undefined,\n relativePositionBias: TensorView|undefined, parameters: AttentionParameters, attributes: AttentionAttrs,\n pastSequenceLength: number) => {\n const totalSequenceLength = pastSequenceLength + parameters.kvSequenceLength;\n const probsShape = [parameters.batchSize, parameters.numHeads, parameters.sequenceLength, totalSequenceLength];\n const presentKey = parameters.kvNumHeads === undefined && context.outputCount > 1;\n const presentKeyShape = presentKey ?\n [parameters.batchSize, parameters.numHeads, totalSequenceLength, parameters.headSize] :\n undefined;\n\n // TODO: handle mask\n\n const alpha = attributes.scale === 0 ? 1.0 / Math.sqrt(parameters.headSize) : attributes.scale;\n const components = getMaxComponents(parameters.headSize);\n const vectorizedHeadSize = parameters.headSize / components;\n const TILE_SIZE = 12;\n const dispatch = {\n x: Math.ceil(totalSequenceLength / TILE_SIZE),\n y: Math.ceil(parameters.sequenceLength / TILE_SIZE),\n z: parameters.batchSize * parameters.numHeads\n };\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: parameters.sequenceLength}, {type: DataType.uint32, data: vectorizedHeadSize},\n {type: DataType.uint32, data: totalSequenceLength}, {type: DataType.uint32, data: parameters.numHeads},\n {type: DataType.float, data: alpha}, {type: DataType.uint32, data: pastSequenceLength},\n {type: DataType.uint32, data: parameters.kvSequenceLength}\n ];\n\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type'];\n if (pastKey) {\n inputDependencies.push('type');\n }\n if (relativePositionBias) {\n inputDependencies.push('type');\n }\n const outputs = [{dims: probsShape, dataType: q.dataType, gpuDataType: GpuDataType.default}];\n if (presentKey) {\n outputs.push({dims: presentKeyShape!, dataType: q.dataType, gpuDataType: GpuDataType.default});\n }\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const qInput = inputVariable('q', q.dataType, q.dims, components);\n const kInput = inputVariable('key', key.dataType, key.dims, components);\n const inputVars = [qInput, kInput];\n if (pastKey) {\n const pastKeyInput = inputVariable('past_key', pastKey.dataType, pastKey.dims, components);\n inputVars.push(pastKeyInput);\n }\n if (relativePositionBias) {\n inputVars.push(\n inputVariable('relative_position_bias', relativePositionBias.dataType, relativePositionBias.dims));\n }\n const output = outputVariable('output', q.dataType, probsShape);\n const outputVars = [output];\n if (presentKey) {\n outputVars.push(outputVariable('present_key', q.dataType, presentKeyShape!, components));\n }\n const f32Type = tensorTypeToWsglValueType(DataType.float, components);\n\n const uniforms: UniformsArrayType = [\n {name: 'M', type: 'u32'}, {name: 'K', type: 'u32'}, {name: 'N', type: 'u32'},\n {name: 'num_heads', type: 'u32'}, {name: 'alpha', type: 'f32' as UniformDataElementType},\n {name: 'past_sequence_length', type: 'u32'}, {name: 'kv_sequence_length', type: 'u32'}\n ];\n return `\n const TILE_SIZE = ${TILE_SIZE}u;\n\n var tileQ: array<${qInput.type.storage}, ${TILE_SIZE * TILE_SIZE}>;\n var tileK: array<${qInput.type.storage}, ${TILE_SIZE * TILE_SIZE}>;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVars, ...outputVars)}\n ${shaderHelper.mainStart([\n TILE_SIZE, TILE_SIZE, 1\n ])}\n // x holds the N and y holds the M\n let headIdx = workgroup_id.z;\n let m = workgroup_id.y * TILE_SIZE;\n let n = workgroup_id.x * TILE_SIZE;\n let qOffset = uniforms.M * uniforms.K * headIdx + m * uniforms.K;\n ${(() => {\n if (pastKey && presentKey) {\n return `\n let kOffset = uniforms.kv_sequence_length * uniforms.K * headIdx;\n let pastKeyOffset = uniforms.past_sequence_length * uniforms.K * headIdx;`;\n } else {\n return `\n let kOffset = uniforms.N * uniforms.K * headIdx + n * uniforms.K;`;\n }\n })()}\n ${presentKey ? 'let presentKeyOffset = headIdx * uniforms.N * uniforms.K;' : ''}\n var value = ${f32Type}(0);\n for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) {\n if (global_id.y < uniforms.M && w + local_id.x < uniforms.K) {\n tileQ[TILE_SIZE * local_id.y + local_id.x] = q[qOffset + local_id.y * uniforms.K + w + local_id.x];\n }\n if (n + local_id.y < uniforms.N && w + local_id.x < uniforms.K) {\n var idx = TILE_SIZE * local_id.y + local_id.x;\n ${(() => {\n if (pastKey && presentKey) {\n return `\n if (n + local_id.y < uniforms.past_sequence_length) {\n tileK[idx] = past_key[pastKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x];\n } else {\n tileK[idx] =\n key[kOffset + (n + local_id.y - uniforms.past_sequence_length) * uniforms.K + w + local_id.x];\n }`;\n } else {\n return 'tileK[idx] = key[kOffset + local_id.y * uniforms.K + w + local_id.x];';\n }\n })()}\n ${\n presentKey ?\n 'present_key[presentKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x] = tileK[idx];' :\n ''}\n }\n workgroupBarrier();\n\n for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) {\n value += ${f32Type}(tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * local_id.x + k]);\n }\n\n workgroupBarrier();\n }\n\n let headOffset = headIdx * uniforms.M * uniforms.N;\n if (global_id.y < uniforms.M && global_id.x < uniforms.N) {\n let outputIdx = headOffset + global_id.y * uniforms.N + global_id.x;\n var sum: f32 = ${(() => {\n switch (components) {\n case 1:\n return 'value';\n case 2:\n return 'value.x + value.y';\n case 4:\n return 'value.x + value.y + value.z + value.w';\n default:\n throw new Error(`Unsupported components: ${components}`);\n }\n })()};\n output[outputIdx] = ${output.type.value} (sum * uniforms.alpha) + ${\n relativePositionBias ? 'relative_position_bias[outputIdx]' : '0.0'};\n }\n }`;\n };\n return {\n name: 'AttentionProbs',\n shaderCache: {\n hint: `${components};${relativePositionBias !== undefined};${pastKey !== undefined};${context.outputCount}`,\n inputDependencies\n },\n getRunData: () => ({outputs, dispatchGroup: dispatch, programUniforms}),\n getShaderSource,\n };\n };\n\n\nconst createVxAttentionScoreProgramInfo =\n (context: ComputeContext, probs: TensorView, v: TensorView, pastValue: TensorView|undefined,\n params: AttentionParameters, pastSequenceLength: number) => {\n const totalSequenceLength = pastSequenceLength + params.kvSequenceLength;\n const nReps = params.nReps ? params.nReps : 1;\n const repeatedVHiddenSize = params.vHiddenSize * nReps;\n const presentValue = params.kvNumHeads == null && context.outputCount > 1;\n const presentValueShape =\n presentValue ? [params.batchSize, params.numHeads, totalSequenceLength, params.headSize] : undefined;\n const outputShape = [params.batchSize, params.sequenceLength, repeatedVHiddenSize];\n const TILE_SIZE = 12;\n const dispatch = {\n x: Math.ceil(params.vHeadSize / TILE_SIZE),\n y: Math.ceil(params.sequenceLength / TILE_SIZE),\n z: params.batchSize * params.numHeads\n };\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: params.sequenceLength}, {type: DataType.uint32, data: totalSequenceLength},\n {type: DataType.uint32, data: params.vHeadSize}, {type: DataType.uint32, data: params.numHeads},\n {type: DataType.uint32, data: repeatedVHiddenSize}, {type: DataType.uint32, data: pastSequenceLength},\n {type: DataType.uint32, data: params.kvSequenceLength}\n ];\n const inputDependencies: ProgramInputTensorInfoDependency[] =\n pastValue ? ['type', 'type', 'type'] : ['type', 'type'];\n const outputs = [{dims: outputShape, dataType: probs.dataType, gpuDataType: GpuDataType.default}];\n if (presentValue) {\n outputs.push({dims: presentValueShape!, dataType: probs.dataType, gpuDataType: GpuDataType.default});\n }\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const probsHelper = inputVariable('probs', probs.dataType, probs.dims);\n const vHelper = inputVariable('v', v.dataType, v.dims);\n const inputVars = [probsHelper, vHelper];\n if (pastValue) {\n inputVars.push(inputVariable('past_value', pastValue.dataType, pastValue.dims));\n }\n const output = outputVariable('output', probs.dataType, outputShape);\n const outputVars = [output];\n if (presentValue) {\n outputVars.push(outputVariable('present_value', probs.dataType, presentValueShape!));\n }\n const uniforms: UniformsArrayType = [\n {name: 'M', type: 'u32'}, {name: 'K', type: 'u32'}, {name: 'N', type: 'u32'},\n {name: 'num_heads', type: 'u32'}, {name: 'v_hidden_size', type: 'u32'},\n {name: 'past_sequence_length', type: 'u32'}, {name: 'kv_sequence_length', type: 'u32'}\n ];\n return `\n const TILE_SIZE = ${TILE_SIZE}u;\n var tileQ: array<${probsHelper.type.value}, ${TILE_SIZE * TILE_SIZE}>;\n var tileK: array<${probsHelper.type.value}, ${TILE_SIZE * TILE_SIZE}>;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVars, ...outputVars)}\n ${shaderHelper.mainStart([\n TILE_SIZE, TILE_SIZE, 1\n ])}\n let headIdx = workgroup_id.z;\n let m = global_id.y;\n let n = global_id.x;\n\n let offsetA = headIdx * (uniforms.M * uniforms.K) + m * uniforms.K;\n ${(() => {\n if (pastValue && presentValue) {\n return `\n let pastValueOffset = headIdx * uniforms.N * uniforms.past_sequence_length + n;\n let vOffset = headIdx * uniforms.N * uniforms.kv_sequence_length + n;\n `;\n } else {\n return `\n let offsetB = headIdx * uniforms.N * uniforms.K + n;\n `;\n }\n })()}\n ${presentValue ? 'let presentValueOffset = headIdx * uniforms.N * uniforms.K + n;' : ''}\n var value = ${probsHelper.type.storage}(0);\n for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) {\n if (m < uniforms.M && w + local_id.x < uniforms.K) {\n tileQ[TILE_SIZE * local_id.y + local_id.x] = probs[offsetA + w + local_id.x];\n }\n if (n < uniforms.N && w + local_id.y < uniforms.K) {\n var idx = TILE_SIZE * local_id.y + local_id.x;\n ${(() => {\n if (pastValue && presentValue) {\n return `\n if (w + local_id.y < uniforms.past_sequence_length) {\n tileK[idx] = past_value[pastValueOffset + (w + local_id.y) * uniforms.N];\n } else {\n tileK[idx] = v[vOffset + (w + local_id.y - uniforms.past_sequence_length) * uniforms.N];\n }\n `;\n } else {\n return `\n tileK[idx] = v[offsetB + (w + local_id.y) * uniforms.N];\n `;\n }\n })()}\n ${presentValue ? 'present_value[presentValueOffset + (w + local_id.y) * uniforms.N] = tileK[idx];' : ''}\n }\n workgroupBarrier();\n for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) {\n value += tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * k + local_id.x];\n }\n workgroupBarrier();\n }\n\n // we need to transpose output from BNSH_v to BSND_v\n let batchIdx = workgroup_id.z / uniforms.num_heads;\n let currentBatchHeadNumber = workgroup_id.z % uniforms.num_heads;\n if (m < uniforms.M && n < uniforms.N) {\n let outputIdx = batchIdx * uniforms.M * uniforms.v_hidden_size + m * uniforms.v_hidden_size\n + currentBatchHeadNumber * uniforms.N + n;\n output[outputIdx] = value;\n }\n }`;\n };\n\n return {\n name: 'AttentionScore',\n shaderCache: {hint: `${pastValue !== undefined};${context.outputCount}`, inputDependencies},\n getRunData: () => ({outputs, dispatchGroup: dispatch, programUniforms}),\n getShaderSource,\n };\n };\n\nexport const applyAttention =\n (context: ComputeContext, q: TensorView, k: TensorView, v: TensorView, _maskIndex: TensorView|undefined,\n _past: TensorView|undefined, pastKey: TensorView|undefined, pastValue: TensorView|undefined,\n relativePositionBias: TensorView|undefined, parameters: AttentionParameters, attributes: AttentionAttrs) => {\n const outputCount = context.outputCount;\n const pastSequenceLength =\n parameters.kvNumHeads !== undefined || outputCount > 1 ? parameters.pastSequenceLength : 0;\n const totalSequenceLength = pastSequenceLength + parameters.kvSequenceLength;\n\n const inputsK = (parameters.kvNumHeads === undefined && outputCount > 1 && pastKey) ? [q, k, pastKey] : [q, k];\n if (relativePositionBias) {\n inputsK.push(relativePositionBias);\n }\n\n // Run AttentionProbs\n const probs = context.compute(\n createAttentionProbsProgramInfo(\n context, q, k, outputCount > 1 ? pastKey : undefined, relativePositionBias, parameters, attributes,\n pastSequenceLength),\n {inputs: inputsK, outputs: (parameters.kvNumHeads === undefined && outputCount > 1) ? [-1, 1] : [-1]})[0];\n\n // Run Softmax\n context.compute(\n createInPlaceSoftmaxProgramInfo(\n context, probs, parameters.batchSize * parameters.numHeads * parameters.sequenceLength,\n totalSequenceLength),\n {inputs: [probs], outputs: []});\n\n // Run AttrionScore\n const inputsV =\n (parameters.kvNumHeads === undefined && outputCount > 1 && pastValue) ? [probs, v, pastValue] : [probs, v];\n context.compute(\n createVxAttentionScoreProgramInfo(\n context, probs, v, outputCount > 1 && pastValue ? pastValue : undefined, parameters, pastSequenceLength),\n {inputs: inputsV, outputs: (parameters.kvNumHeads === undefined && outputCount > 1) ? [0, 2] : [0]});\n };\n\nconst prepare = (context: ComputeContext, parameters: AttentionParameters) => {\n const outputShape = [\n parameters.batchSize,\n parameters.numHeads,\n parameters.sequenceLength,\n parameters.headSize,\n ];\n const M = parameters.sequenceLength;\n const K = parameters.inputHiddenSize;\n const N = parameters.headSize;\n const TILE_SIZE = 12;\n const dispatch = {\n x: Math.ceil(parameters.headSize / TILE_SIZE),\n y: Math.ceil(parameters.sequenceLength / TILE_SIZE),\n z: parameters.batchSize * parameters.numHeads\n };\n const inputs = [context.inputs[0], context.inputs[1], context.inputs[2]];\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: M}, {type: DataType.uint32, data: K}, {type: DataType.uint32, data: N},\n {type: DataType.uint32, data: parameters.numHeads}, {type: DataType.uint32, data: parameters.headSize},\n {type: DataType.uint32, data: parameters.hiddenSize},\n {type: DataType.uint32, data: parameters.hiddenSize + parameters.hiddenSize + parameters.vHiddenSize}\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const outputQ = outputVariable('output_q', inputs[0].dataType, outputShape);\n const outputK = outputVariable('output_k', inputs[0].dataType, outputShape);\n const outputV = outputVariable('output_v', inputs[0].dataType, outputShape);\n const input = inputVariable('input', inputs[0].dataType, inputs[0].dims);\n const weight = inputVariable('weight', inputs[1].dataType, inputs[1].dims);\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims);\n const dataType = input.type.storage;\n\n const uniforms: UniformsArrayType = [\n {name: 'M', type: 'u32'}, {name: 'K', type: 'u32'}, {name: 'N', type: 'u32'}, {name: 'num_heads', type: 'u32'},\n {name: 'head_size', type: 'u32'}, {name: 'hidden_size', type: 'u32'}, {name: 'ldb', type: 'u32'}\n ];\n return `\n const TILE_SIZE = ${TILE_SIZE}u;\n var tileInput: array<${dataType}, ${TILE_SIZE * TILE_SIZE}>;\n var tileWeightQ: array<${dataType}, ${TILE_SIZE * TILE_SIZE}>;\n var tileWeightK: array<${dataType}, ${TILE_SIZE * TILE_SIZE}>;\n var tileWeightV: array<${dataType}, ${TILE_SIZE * TILE_SIZE}>;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(input, weight, bias, outputQ, outputK, outputV)}\n ${shaderHelper.mainStart([\n TILE_SIZE, TILE_SIZE, 1\n ])}\n let batchIndex = workgroup_id.z / uniforms.num_heads;\n let headNumber = workgroup_id.z % uniforms.num_heads;\n let m = global_id.y;\n let n = global_id.x;\n\n let inputOffset = batchIndex * (uniforms.M * uniforms.K) + m * uniforms.K;\n let biasOffsetQ = headNumber * uniforms.head_size;\n let biasOffsetK = uniforms.hidden_size + biasOffsetQ;\n let biasOffsetV = uniforms.hidden_size + biasOffsetK;\n\n var valueQ = ${dataType}(0);\n var valueK = ${dataType}(0);\n var valueV = ${dataType}(0);\n for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) {\n if (m < uniforms.M && w + local_id.x < uniforms.K) {\n tileInput[TILE_SIZE * local_id.y + local_id.x] = input[inputOffset + w + local_id.x];\n }\n if (n < uniforms.N && w + local_id.y < uniforms.K) {\n let offset = n + (w + local_id.y) * uniforms.ldb;\n tileWeightQ[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetQ + offset];\n tileWeightK[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetK + offset];\n tileWeightV[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetV + offset];\n }\n workgroupBarrier();\n for (var k: u32 = 0u; k ({\n outputs: [\n {dims: outputShape, dataType: context.inputs[0].dataType, gpuDataType: GpuDataType.default},\n {dims: outputShape, dataType: context.inputs[0].dataType, gpuDataType: GpuDataType.default},\n {dims: outputShape, dataType: context.inputs[0].dataType, gpuDataType: GpuDataType.default},\n ],\n dispatchGroup: dispatch,\n programUniforms\n }),\n getShaderSource,\n },\n {inputs, outputs: [-1, -1, -1]});\n};\n\nexport const attention = (context: ComputeContext, attributes: AttentionAttrs): void => {\n const params = validateAttentionInputs(context.inputs, attributes);\n\n const [q, k, v] = prepare(context, params);\n\n return applyAttention(\n context, q, k, v, context.inputs[4], undefined, undefined, undefined, context.inputs[5], params, attributes);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, getMaxComponents, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface BatchNormAttributes extends AttributeWithCacheKey {\n readonly epsilon: number;\n readonly momentum: number;\n readonly spatial: boolean;\n readonly trainingMode: boolean;\n readonly format: 'NHWC'|'NCHW';\n readonly outputCount: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: BatchNormAttributes): void => {\n if (!inputs || inputs.length !== 5) {\n throw new Error('BatchNormalization requires 5 inputs');\n }\n\n const checkShapeEqual = (actual: readonly number[], expected: readonly number[], message: string) => {\n const r = expected.length;\n if (r !== actual.length) {\n throw new Error(`${message}: num dimensions != ${r}`);\n }\n expected.forEach((v, i) => {\n if (v !== actual[i]) {\n throw new Error(`${message}: dim[${i}] do not match`);\n }\n });\n };\n\n if (inputs[0].dims.length > 1) {\n const shape = attributes.format === 'NHWC' ?\n (attributes.spatial ? inputs[0].dims.slice(-1) :\n inputs[0].dims.slice(-1).concat(inputs[0].dims.slice(1, inputs[0].dims.length - 1))) :\n inputs[0].dims.slice(1, attributes.spatial ? 2 : undefined);\n checkShapeEqual(inputs[1].dims, shape, 'Invalid input scale');\n checkShapeEqual(inputs[2].dims, shape, 'Invalid input B');\n checkShapeEqual(inputs[3].dims, shape, 'Invalid input mean');\n checkShapeEqual(inputs[4].dims, shape, 'Invalid input var');\n } else {\n checkShapeEqual(inputs[1].dims, [1], 'Invalid input scale');\n checkShapeEqual(inputs[2].dims, [1], 'Invalid input B');\n checkShapeEqual(inputs[3].dims, [1], 'Invalid input mean');\n checkShapeEqual(inputs[4].dims, [1], 'Invalid input var');\n }\n};\n\nconst createBatchNormInferenceProgramInfo =\n (inputs: readonly TensorView[], attributes: BatchNormAttributes): ProgramInfo => {\n const {epsilon, spatial, format} = attributes;\n const yShape = inputs[0].dims;\n const components = spatial ? getMaxComponents(yShape[yShape.length - 1]) : 1;\n const cComponents = format === 'NHWC' && yShape.length > 1 ? components : 1;\n const outputSize = ShapeUtil.size(yShape) / components;\n // Only support uniforms for opset version >= 9 (spatial = true).\n const useShapesUniforms = spatial;\n const shapeOrRank = useShapesUniforms ? yShape.length : yShape;\n const x = inputVariable('x', inputs[0].dataType, inputs[0].dims, components);\n const scale = inputVariable('scale', inputs[1].dataType, inputs[1].dims, cComponents);\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims, cComponents);\n const inputMean = inputVariable('inputMean', inputs[3].dataType, inputs[3].dims, cComponents);\n const inputVar = inputVariable('inputVar', inputs[4].dataType, inputs[4].dims, cComponents);\n const y = outputVariable('y', inputs[0].dataType, shapeOrRank, components);\n // TODO: support inputs with different data type. Current we need to make sure all inputs have the same data type.\n // Otherwise, the shader compilation will fail.\n const calcCOffset = (): string => {\n let cOffset = '';\n if (spatial) {\n cOffset = `let cOffset = ${\n yShape.length === 1 ? '0u' :\n format === 'NHWC' ? `outputIndices[${yShape.length - 1}] / ${components}` :\n 'outputIndices[1]'};`;\n } else {\n if (format === 'NCHW') {\n cOffset = `\n ${y.indicesSet('outputIndices', '0', '0')}\n let cOffset = ${y.indicesToOffset('outputIndices')};`;\n } else {\n // update C channel.\n cOffset = `var cIndices = ${scale.type.indices}(0);\n cIndices[0] = outputIndices[${yShape.length - 1}];`;\n // update D1 x ... x Dn channels.\n for (let i = 1; i < scale.rank; i++) {\n cOffset += `cIndices[${i}] = outputIndices[${i}];`;\n }\n cOffset += `let cOffset = ${scale.indicesToOffset('cIndices')};`;\n }\n }\n return cOffset;\n };\n const getInferenceModeShaderSource = (helper: ShaderHelper) => `\n const epsilon = ${epsilon};\n ${helper.registerUniform('outputSize', 'u32').declareVariables(x, scale, bias, inputMean, inputVar, y)}\n ${helper.mainStart()}\n ${helper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n var outputIndices = ${y.offsetToIndices(`global_idx * ${components}`)};\n ${calcCOffset()}\n let scale = ${scale.getByOffset('cOffset')};\n let bias = ${bias.getByOffset('cOffset')};\n let inputMean = ${inputMean.getByOffset('cOffset')};\n let inputVar = ${inputVar.getByOffset('cOffset')};\n let x = ${x.getByOffset('global_idx')};\n let value = (x - inputMean) * inverseSqrt(inputVar + epsilon) * scale + bias;\n ${y.setByOffset('global_idx', 'value')}\n }`;\n return {\n name: 'BatchNormalization',\n shaderCache: {\n hint: `${attributes.epsilon}_${attributes.format}_${spatial}_${components}`,\n inputDependencies: useShapesUniforms ? ['rank', 'type', 'type', 'type', 'type'] : undefined,\n },\n getShaderSource: getInferenceModeShaderSource,\n getRunData: () => ({\n outputs: [{dims: inputs[0].dims, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms: useShapesUniforms ?\n [\n {type: DataType.uint32, data: outputSize},\n ...createTensorShapeVariables(yShape),\n ] :\n [\n {type: DataType.uint32, data: outputSize},\n ],\n }),\n };\n };\n\nexport const parseBatchNormAttributes = (attributes: Record): BatchNormAttributes =>\n createAttributeWithCacheKey(attributes as Omit);\n\nexport const batchNorm = (context: ComputeContext, attributes: Record): void => {\n const {inputs, outputCount} = context;\n const updatedAttributes = parseBatchNormAttributes({...attributes, outputCount});\n if (env.webgpu.validateInputContent) {\n validateInputs(inputs, updatedAttributes);\n }\n if (attributes.trainingMode) {\n throw new Error('BatchNormalization trainingMode is not supported yet.');\n } else {\n context.compute(createBatchNormInferenceProgramInfo(inputs, updatedAttributes));\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper} from './common';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (inputs[0].dims.length !== 3) {\n throw new Error('input should have 3 dimensions');\n }\n\n if (![320, 640, 1280].includes(inputs[0].dims[2])) {\n throw new Error('number of channels should be 320, 640 or 1280');\n }\n\n if (inputs[1].dims.length !== 1) {\n throw new Error('bias is expected to have 1 dimensions');\n }\n\n if (inputs[0].dims[2] !== inputs[1].dims[0]) {\n throw new Error('last dimension of input and bias are not the same');\n }\n};\n\nconst createBiasAddProgramInfo = (inputs: readonly TensorView[]): ProgramInfo => {\n const outputShape = inputs[0].dims;\n\n const channels = inputs[0].dims[2];\n // since channel number can be only 320/640/1280, it's always divisable by 4\n const outputSize = ShapeUtil.size(outputShape) / 4;\n\n const dataType = inputs[0].dataType;\n const input = inputVariable('input', dataType, outputShape, 4);\n const bias = inputVariable('bias', dataType, [channels], 4);\n const residual = inputVariable('residual', dataType, outputShape, 4);\n const output = outputVariable('output', dataType, outputShape, 4);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n const channels = ${channels}u / 4;\n ${shaderHelper.declareVariables(input, bias, residual, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes(outputSize)}\n let value = ${input.getByOffset('global_idx')}\n + ${bias.getByOffset('global_idx % channels')} + ${residual.getByOffset('global_idx')};\n ${output.setByOffset('global_idx', 'value')}\n }`;\n\n return {\n name: 'BiasAdd',\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)}\n }),\n getShaderSource,\n };\n};\n\nexport const biasAdd = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n context.compute(createBiasAddProgramInfo(context.inputs));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {MAX_CLIP, MIN_CLIP, ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglValueType} from './common';\n\ntype BuiltinFunctionName = string;\ntype ElementwiseCustomExpression = (expression: string) => string;\ntype ElementwiseFunctionCall = BuiltinFunctionName|ElementwiseCustomExpression;\n\nconst createElementwiseProgramShader =\n (shaderHelper: ShaderHelper, datasize: number, inputDataType: number, outputDataType: number,\n funcCall: ElementwiseFunctionCall, additionalImplementation?: string): string => {\n const vecSize = Math.ceil(datasize / 4);\n\n let expression = '';\n if (typeof funcCall === 'string') {\n expression = `${funcCall}(a)`;\n } else {\n expression = funcCall('a');\n }\n\n const input = inputVariable('inputData', inputDataType, [vecSize], 4);\n const output = outputVariable('outputData', outputDataType, [vecSize], 4);\n\n return `\n ${shaderHelper.registerUniform('vec_size', 'u32').declareVariables(input, output)}\n\n ${additionalImplementation ?? ''}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.vec_size')}\n\n let a = ${input.getByOffset('global_idx')};\n ${output.setByOffset('global_idx', expression)}\n }`;\n };\n\nconst createElementwiseProgramInfo =\n (input: TensorView, name: string, funcCall: ElementwiseFunctionCall, additionalImplementation?: string,\n cacheKey?: string, outputDataType: number = input.dataType): ProgramInfo => ({\n name,\n shaderCache: {hint: cacheKey, inputDependencies: ['type']},\n getShaderSource: shaderHelper => createElementwiseProgramShader(\n shaderHelper, ShapeUtil.size(input.dims), input.dataType, outputDataType, funcCall, additionalImplementation),\n getRunData: (inputTensors) => ({\n outputs: [{dims: input.dims, dataType: outputDataType}],\n dispatchGroup:\n {x: Math.ceil(ShapeUtil.size(inputTensors[0].dims) / 64 /* workgroup size */ / 4 /* vec size */)},\n programUniforms: [\n {type: DataType.uint32, data: Math.ceil(ShapeUtil.size(input.dims) / 4)},\n ],\n })\n });\n\nexport const abs = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Abs', 'abs'));\n};\n\nexport const acos = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Acos', 'acos'));\n};\n\nexport const acosh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Acosh', 'acosh'));\n};\n\nexport const asin = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Asin', 'asin'));\n};\n\nexport const asinh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Asinh', 'asinh'));\n};\n\nexport const atan = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Atan', 'atan'));\n};\nexport const atanh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Atanh', 'atanh'));\n};\n\nexport interface CastAttributes extends AttributeWithCacheKey {\n readonly to: number;\n readonly saturate?: boolean;\n}\n\nexport const parseCastAttributes = (attributes: Record): CastAttributes =>\n createAttributeWithCacheKey(attributes as {to: number});\n\n\nexport const cast = (context: ComputeContext, attributes: CastAttributes): void => {\n let func: ElementwiseFunctionCall;\n switch (attributes.to) {\n case DataType.float16:\n func = 'vec4';\n break;\n case DataType.float:\n func = 'vec4';\n break;\n case DataType.uint32:\n func = 'vec4';\n break;\n case DataType.int32:\n func = 'vec4';\n break;\n case DataType.bool:\n func = 'vec4';\n break;\n default:\n throw new RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${attributes.to}`);\n }\n context.compute(\n createElementwiseProgramInfo(context.inputs[0], 'Cast', func, undefined, attributes.cacheKey, attributes.to));\n};\n\nexport interface ClipAttributes extends AttributeWithCacheKey {\n readonly min: number;\n readonly max: number;\n}\n\nconst generateClipAttributesFromInputs = (inputs: readonly TensorView[]): ClipAttributes => {\n const min = (inputs.length >= 2 && inputs[1].data !== 0) ? inputs[1].getFloat32Array()[0] : MIN_CLIP;\n const max = (inputs.length >= 3 && inputs[2].data !== 0) ? inputs[2].getFloat32Array()[0] : MAX_CLIP;\n return createAttributeWithCacheKey({min, max});\n};\n\nexport const clip = (context: ComputeContext, clipAttributes: ClipAttributes): void => {\n const attributes = context.inputs.length === 1 ? clipAttributes : generateClipAttributesFromInputs(context.inputs);\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(\n createElementwiseProgramInfo(\n context.inputs[0], 'Clip', a => `clamp(${a}, clip_min_, clip_max_)`, `\n const clip_min_: vec4<${dataType}> = vec4(${dataType}(${attributes.min}));\n const clip_max_: vec4<${dataType}> = vec4(${dataType}(${attributes.max}));\n`,\n attributes.cacheKey),\n {inputs: [0]});\n};\n\nexport const ceil = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Ceil', 'ceil'));\n};\n\nexport const cos = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Cos', 'cos'));\n};\n\nexport const cosh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Cosh', 'cosh'));\n};\n\nexport interface AlphaAttributes extends AttributeWithCacheKey {\n readonly alpha: number;\n}\n\nexport const parseAlphaAttributes = (attributes: Record): AlphaAttributes =>\n createAttributeWithCacheKey(attributes as {alpha: number});\n\nexport const elu = (context: ComputeContext, attributes: AlphaAttributes): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'Elu', a => `elu_vf32(${a})`, `\n const elu_alpha_ = ${dataType}(${attributes.alpha});\n\n fn elu_f32(a: ${dataType}) -> ${dataType} {\n return select((exp(a) - 1.0) * elu_alpha_, a, a >= 0.0);\n }\n\n fn elu_vf32(v: vec4<${dataType}>) -> vec4<${dataType}> {\n return vec4(elu_f32(v.x), elu_f32(v.y), elu_f32(v.z), elu_f32(v.w));\n }`,\n attributes.cacheKey));\n};\n\nexport const erfImpl = (varType = 'f32') => `\nconst r0: ${varType} = 0.3275911;\nconst r1: ${varType} = 0.254829592;\nconst r2: ${varType} = -0.284496736;\nconst r3: ${varType} = 1.421413741;\nconst r4: ${varType} = -1.453152027;\nconst r5: ${varType} = 1.061405429;\n\nfn erf_vf32(v: vec4<${varType}>) -> vec4<${varType}> {\n let absv = abs(v);\n let x = 1.0 / (1.0 + r0 * absv);\n return sign(v) * (1.0 - ((((r5 * x + r4) * x + r3) * x + r2) * x + r1) * x * exp(-absv * absv));\n}`;\n\nexport const erf = (context: ComputeContext): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Erf', a => `erf_vf32(${a})`, erfImpl(dataType)));\n};\n\nexport const exp = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Exp', 'exp'));\n};\n\nexport const floor = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Floor', 'floor'));\n};\n\nexport const gelu = (context: ComputeContext): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'Gelu', a => `0.5 * ${a} * (1.0 + erf_vf32(${a} * 0.7071067811865475))`, erfImpl(dataType)));\n};\n\nexport const leakyRelu = (context: ComputeContext, attributes: AlphaAttributes): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'LeakyRelu', a => `select(leaky_relu_alpha_ * ${a}, ${a}, ${a} >= vec4<${dataType}>(0.0))`,\n `const leaky_relu_alpha_ = ${dataType}(${attributes.alpha});`, attributes.cacheKey));\n};\n\nexport const not = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Not', a => `!${a}`));\n};\n\nexport const neg = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Neg', a => `-${a}`));\n};\n\nexport const reciprocal = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Reciprocal', a => `1.0/${a}`));\n};\n\nexport const relu = (context: ComputeContext): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'Relu', a => `select(vec4<${dataType}>(0.0), ${a}, ${a} > vec4<${dataType}>(0.0))`));\n};\n\nexport const sigmoid = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Sigmoid', a => `(1.0 / (1.0 + exp(-${a})))`));\n};\n\nexport interface HardSigmoidAttributes extends AttributeWithCacheKey {\n readonly alpha: number;\n readonly beta: number;\n}\n\nexport const parseHardSigmoidAttributes = (attributes: Record): HardSigmoidAttributes =>\n createAttributeWithCacheKey(attributes as {\n alpha: number;\n beta: number;\n });\n\nexport const hardSigmoid = (context: ComputeContext, attributes: HardSigmoidAttributes): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'HardSigmoid',\n a => `max(vec4<${dataType}>(0.0), min(vec4<${dataType}>(1.0), ${attributes.alpha} * ${a} + vec4<${dataType}>(${\n attributes.beta})))`,\n undefined, attributes.cacheKey));\n};\n\nexport const sin = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Sin', 'sin'));\n};\n\nexport const sinh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Sinh', 'sinh'));\n};\n\nexport const sqrt = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Sqrt', 'sqrt'));\n};\n\nexport const tan = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Tan', 'tan'));\n};\n\nexport const tanhExpression = (a: string) => `sign(${a}) * (1 - exp(-2 * abs(${a}))) / (1 + exp(-2 * abs(${a})))`;\n\nexport const tanh = (context: ComputeContext): void => {\n // TODO: revisit after https://github.com/gpuweb/gpuweb/issues/4458 is resolved\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Tanh', tanhExpression));\n};\n\nexport const fastGeluImpl = (varType = 'f32') => `\nconst fast_gelu_a: ${varType} = 0.5;\nconst fast_gelu_b: ${varType} = 0.7978845608028654;\nconst fast_gelu_c: ${varType} = 0.035677408136300125;\n\nfn tanh_v(v: vec4<${varType}>) -> vec4<${varType}> {\n return ${tanhExpression('v')};\n}\n`;\n\nexport const fastGeluExpression = (x: string) =>\n `(fast_gelu_a + fast_gelu_a * tanh_v(${x} * (fast_gelu_c * ${x} * ${x} + fast_gelu_b))) * ${x}`;\n\nexport const fastGelu = (context: ComputeContext): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'FastGelu', fastGeluExpression, fastGeluImpl(dataType), undefined,\n context.inputs[0].dataType));\n};\n\nexport const thresholdedRelu = (context: ComputeContext, attributes: AlphaAttributes): number => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'ThresholdedRelu', a => `select(vec4<${dataType}>(0.0), ${a}, ${a} > thresholded_relu_alpha_)`,\n `const thresholded_relu_alpha_ = vec4<${dataType}>(${attributes.alpha});`, attributes.cacheKey));\n return 0;\n};\n\nexport const log = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Log', 'log'));\n};\n\nexport const quickGeluImpl = (varType: string, alpha: number) => `\nconst alpha = vec4<${varType}>(${alpha});\nconst one = ${varType}(1.0);\nconst zero = ${varType}(0.0);\n\nfn quick_gelu_impl(x: vec4<${varType}>) -> vec4<${varType}> {\n let v = x *alpha;\n var x1 : vec4<${varType}>;\n for (var i = 0; i < 4; i = i + 1) {\n if (v[i] >= zero) {\n x1[i] = one / (one + exp(-v[i]));\n } else {\n x1[i] = one - one / (one + exp(v[i]));\n }\n }\n return x * x1;\n}\n`;\n\nexport const quickGeluExpression = (x: string) => `quick_gelu_impl(${x})`;\n\nexport const quickgelu = (context: ComputeContext, attributes: AlphaAttributes): void => {\n const dType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'QuickGelu', quickGeluExpression, quickGeluImpl(dType, attributes.alpha), attributes.cacheKey,\n context.inputs[0].dataType));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType} from './common';\nimport {erfImpl} from './unary-op';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (inputs[0].dims.length !== 3) {\n throw new Error('input should have 3 dimensions');\n }\n\n if (![2560, 5120, 10240].includes(inputs[0].dims[2])) {\n throw new Error('hidden state should be 2560, 5120 or 10240');\n }\n\n if (inputs[1].dims.length !== 1) {\n throw new Error('bias is expected to have 1 dimensions');\n }\n\n if (inputs[0].dims[2] !== inputs[1].dims[0]) {\n throw new Error('last dimension of input and bias are not the same');\n }\n};\n\nconst createBiasSplitGeluProgramInfo = (inputs: readonly TensorView[]): ProgramInfo => {\n const outputShape = inputs[0].dims.slice();\n outputShape[2] = outputShape[2] / 2;\n\n const input = inputVariable('input', inputs[0].dataType, inputs[0].dims, 4);\n const bias = inputVariable('bias', inputs[0].dataType, [inputs[0].dims[2]], 4);\n const output = outputVariable('output', inputs[0].dataType, outputShape, 4);\n\n const outputSize = ShapeUtil.size(outputShape) / 4;\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n const M_SQRT2 = sqrt(2.0);\n const halfChannels = ${inputs[0].dims[2] / 4 / 2}u;\n\n ${shaderHelper.declareVariables(input, bias, output)}\n\n ${erfImpl(dataType)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes(outputSize)}\n let biasIdx = global_idx % halfChannels;\n let batchIndex = global_idx / halfChannels;\n let inputOffset = biasIdx + batchIndex * halfChannels * 2;\n let valueLeft = input[inputOffset] + bias[biasIdx];\n let valueRight = input[inputOffset + halfChannels] + bias[biasIdx + halfChannels];\n let geluRight = valueRight * 0.5 * (erf_vf32(valueRight / M_SQRT2) + 1);\n\n ${output.setByOffset('global_idx', 'valueLeft * geluRight')}\n }`;\n\n return {\n name: 'BiasSplitGelu',\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)}\n }),\n getShaderSource,\n };\n};\n\nexport const biasSplitGelu = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n context.compute(createBiasSplitGeluProgramInfo(context.inputs));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {BroadcastUtil, ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\ntype BuiltinFunctionName = string;\ntype BinaryCustomExpression = (expressionA: string, expressionB: string) => string;\ntype BinaryFunctionCall = BuiltinFunctionName|BinaryCustomExpression|{\n scalar: BinaryCustomExpression;\n vector: BinaryCustomExpression;\n};\n\nconst createBinaryOpProgramShader =\n (shaderHelper: ShaderHelper, dimsA: readonly number[], dimsB: readonly number[], dimsOutput: readonly number[],\n vectorize: boolean, doBroadcast: boolean, sharedDimensionDivisibleBy4: boolean, funcCall: BinaryFunctionCall,\n typeA: number, typeB: number, typeOutput: number, additionalImplementation?: string) => {\n let expressionScalar: BinaryCustomExpression;\n let expressionVector: BinaryCustomExpression;\n if (typeof funcCall === 'string') {\n expressionScalar = expressionVector = (a, b) => `${funcCall}((${a}),(${b}))`;\n } else if (typeof funcCall === 'function') {\n expressionScalar = expressionVector = funcCall;\n } else {\n expressionScalar = funcCall.scalar;\n expressionVector = funcCall.vector;\n }\n\n const output = outputVariable('outputData', typeOutput, dimsOutput.length, 4);\n const a = inputVariable('aData', typeA, dimsA.length, 4);\n const b = inputVariable('bData', typeB, dimsB.length, 4);\n\n let assignment: string;\n if (vectorize) {\n if (doBroadcast) {\n const isAOneElement = ShapeUtil.size(dimsA) === 1;\n const isBOneElement = ShapeUtil.size(dimsB) === 1;\n const aLastDimDivisibleBy4 = dimsA.length > 0 && dimsA[dimsA.length - 1] % 4 === 0;\n const bLastDimDivisibleBy4 = dimsB.length > 0 && dimsB[dimsB.length - 1] % 4 === 0;\n if (isAOneElement || isBOneElement) {\n assignment = output.setByOffset(\n 'global_idx',\n expressionVector(\n isAOneElement ? `${a.type.value}(${a.getByOffset('0')}.x)` : a.getByOffset('global_idx'),\n isBOneElement ? `${b.type.value}(${b.getByOffset('0')}.x)` : b.getByOffset('global_idx')));\n } else {\n assignment = `\n let outputIndices = ${output.offsetToIndices('global_idx * 4u')};\n let offsetA = ${a.broadcastedIndicesToOffset('outputIndices', output)};\n let offsetB = ${b.broadcastedIndicesToOffset('outputIndices', output)};\n ${\n output.setByOffset(\n 'global_idx',\n expressionVector(\n sharedDimensionDivisibleBy4 || aLastDimDivisibleBy4 ?\n a.getByOffset('offsetA / 4u') :\n `${a.type.value}(${a.getByOffset('offsetA / 4u')}[offsetA % 4u])`,\n sharedDimensionDivisibleBy4 || bLastDimDivisibleBy4 ?\n b.getByOffset('offsetB / 4u') :\n `${b.type.value}(${b.getByOffset('offsetB / 4u')}[offsetB % 4u])`))}\n `;\n }\n } else {\n assignment = output.setByOffset(\n 'global_idx', expressionVector(a.getByOffset('global_idx'), b.getByOffset('global_idx')));\n }\n } else {\n if (!doBroadcast) {\n throw new Error('no necessary to use scalar implementation for element-wise binary op implementation.');\n }\n\n const singleAssignment = (resStr: string, x: number, typeCast = '') => {\n const expressionA = `aData[indexA${x}][componentA${x}]`;\n const expressionB = `bData[indexB${x}][componentB${x}]`;\n return `\n let outputIndices${x} = ${output.offsetToIndices(`global_idx * 4u + ${x}u`)};\n let offsetA${x} = ${a.broadcastedIndicesToOffset(`outputIndices${x}`, output)};\n let offsetB${x} = ${b.broadcastedIndicesToOffset(`outputIndices${x}`, output)};\n let indexA${x} = offsetA${x} / 4u;\n let indexB${x} = offsetB${x} / 4u;\n let componentA${x} = offsetA${x} % 4u;\n let componentB${x} = offsetB${x} % 4u;\n ${resStr}[${x}] = ${typeCast}(${expressionScalar(expressionA, expressionB)});\n `;\n };\n if (typeOutput === DataType.bool) {\n assignment = `\n var data = vec4(0);\n ${singleAssignment('data', 0, 'u32')}\n ${singleAssignment('data', 1, 'u32')}\n ${singleAssignment('data', 2, 'u32')}\n ${singleAssignment('data', 3, 'u32')}\n outputData[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`;\n } else {\n assignment = `\n ${singleAssignment('outputData[global_idx]', 0)}\n ${singleAssignment('outputData[global_idx]', 1)}\n ${singleAssignment('outputData[global_idx]', 2)}\n ${singleAssignment('outputData[global_idx]', 3)}\n `;\n }\n }\n\n return `\n ${shaderHelper.registerUniform('vec_size', 'u32').declareVariables(a, b, output)}\n\n ${additionalImplementation ?? ''}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.vec_size')}\n ${assignment}\n }`;\n };\n\nconst createBinaryOpProgramInfo =\n (name: string, cacheKey: string, a: TensorView, b: TensorView, funcCall: BinaryFunctionCall,\n additionalImplementation?: string, outputDataType: number = a.dataType): ProgramInfo => {\n const isBroadcast = !ShapeUtil.areEqual(a.dims, b.dims);\n let outputShape = a.dims;\n let outputSize = ShapeUtil.size(a.dims);\n\n let vectorize = false;\n let sharedDimensionDivisibleBy4 = false;\n\n // TODO: deal with zero-sized tensors (eg. dims=[1,0])\n const cacheKeyAux = [isBroadcast];\n if (isBroadcast) {\n const calculatedShape = BroadcastUtil.calcShape(a.dims, b.dims, false);\n if (!calculatedShape) {\n throw new Error('Can\\'t perform binary op on the given tensors');\n }\n outputShape = calculatedShape;\n outputSize = ShapeUtil.size(outputShape);\n const isAOneElement = ShapeUtil.size(a.dims) === 1;\n const isBOneElement = ShapeUtil.size(b.dims) === 1;\n const aLastDimDivisibleBy4 = a.dims.length > 0 && a.dims[a.dims.length - 1] % 4 === 0;\n const bLastDimDivisibleBy4 = b.dims.length > 0 && b.dims[b.dims.length - 1] % 4 === 0;\n cacheKeyAux.push(isAOneElement);\n cacheKeyAux.push(isBOneElement);\n cacheKeyAux.push(aLastDimDivisibleBy4);\n cacheKeyAux.push(bLastDimDivisibleBy4);\n // check whether vectorize can be enabled\n let sharedDimension = 1;\n for (let i = 1; i < outputShape.length; i++) {\n const dimA = a.dims[a.dims.length - i] ?? 1;\n const dimB = b.dims[b.dims.length - i] ?? 1;\n if (dimA === dimB) {\n sharedDimension *= dimA;\n } else {\n break;\n }\n }\n if (sharedDimension % 4 === 0) {\n sharedDimensionDivisibleBy4 = true;\n vectorize = true;\n } else if (isAOneElement || isBOneElement || aLastDimDivisibleBy4 || bLastDimDivisibleBy4) {\n vectorize = true;\n }\n } else {\n // element-wise\n vectorize = true;\n }\n cacheKeyAux.push(vectorize);\n\n return {\n name,\n shaderCache: {\n hint: cacheKey + cacheKeyAux.map((x) => x.toString()).join('_'),\n inputDependencies: ['rank', 'rank'],\n },\n getShaderSource: (shaderHelper) => createBinaryOpProgramShader(\n shaderHelper, a.dims, b.dims, outputShape, vectorize, isBroadcast, sharedDimensionDivisibleBy4, funcCall,\n a.dataType, b.dataType, outputDataType, additionalImplementation),\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: outputDataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */ / 4 /* component size */)},\n programUniforms: [\n {type: DataType.uint32, data: Math.ceil(ShapeUtil.size(outputShape) / 4)},\n ...createTensorShapeVariables(a.dims, b.dims, outputShape)\n ],\n }),\n };\n };\n\nconst runBinaryOp =\n (context: ComputeContext, name: string, funcCall: BinaryFunctionCall, additionalImplementation?: string,\n cacheKey?: string, outputDataType?: number): void => {\n context.compute(createBinaryOpProgramInfo(\n name, cacheKey ?? '', context.inputs[0], context.inputs[1], funcCall, additionalImplementation,\n outputDataType));\n };\n\nexport const add = (context: ComputeContext): void => {\n runBinaryOp(context, 'Add', (a, b) => `${a}+${b}`);\n};\n\nexport const div = (context: ComputeContext): void => {\n runBinaryOp(context, 'Div', (a, b) => `${a}/${b}`);\n};\n\nexport const equal = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'Equal', ({scalar: (a, b) => `u32(${a}==${b})`, vector: (a, b) => `vec4(${a}==${b})`}), undefined,\n undefined, DataType.bool);\n};\n\nexport const mul = (context: ComputeContext): void => {\n runBinaryOp(context, 'Mul', (a, b) => `${a}*${b}`);\n};\n\nexport const pow = (context: ComputeContext): void => {\n const type = inputVariable('input', context.inputs[0].dataType, context.inputs[0].dims).type.value;\n const roundStr = type === 'i32' ? 'round' : '';\n runBinaryOp(\n context, 'Pow', ({scalar: (a, b) => `pow_custom(${a},${b})`, vector: (a, b) => `pow_vector_custom(${a},${b})`}),\n `\n fn pow_custom(a : ${type}, b : ${type}) -> ${type} {\n if (b == ${type}(0.0)) {\n return ${type}(1.0);\n } else if (a < ${type}(0.0) && f32(b) != floor(f32(b))) {\n return ${type}(pow(f32(a), f32(b))); // NaN\n }\n return select(sign(a), ${type}(1.0), round(f32(abs(b) % ${type}(2.0))) != 1.0) * ${type}(${\n roundStr}(pow(f32(abs(a)), f32(b))));\n }\n fn pow_vector_custom(a : vec4<${type}>, b : vec4<${type}>) -> vec4<${type}> {\n // TODO: implement vectorized pow\n return vec4<${type}>(pow_custom(a.x, b.x), pow_custom(a.y, b.y), pow_custom(a.z, b.z), pow_custom(a.w, b.w));\n }\n `);\n};\n\nexport const sub = (context: ComputeContext): void => {\n runBinaryOp(context, 'Sub', (a, b) => `${a}-${b}`);\n};\n\nexport const greater = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'Greater', ({scalar: (a, b) => `u32(${a}>${b})`, vector: (a, b) => `vec4(${a}>${b})`}), undefined,\n undefined, DataType.bool);\n};\n\nexport const less = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'Less', ({scalar: (a, b) => `u32(${a}<${b})`, vector: (a, b) => `vec4(${a}<${b})`}), undefined,\n undefined, DataType.bool);\n};\n\nexport const greaterOrEqual = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'GreaterOrEqual', ({scalar: (a, b) => `u32(${a}>=${b})`, vector: (a, b) => `vec4(${a}>=${b})`}),\n undefined, undefined, DataType.bool);\n};\n\nexport const lessOrEqual = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'LessOrEqual', ({scalar: (a, b) => `u32(${a}<=${b})`, vector: (a, b) => `vec4(${a}<=${b})`}),\n undefined, undefined, DataType.bool);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface ConcatAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[], axis: number): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('too few inputs');\n }\n const referenceIndex = 0;\n const referenceInput = inputs[referenceIndex];\n const inputType = referenceInput.dataType;\n const inputRank = referenceInput.dims.length;\n inputs.forEach((input, i) => {\n if (i === referenceIndex) {\n return;\n }\n // make sure types of all inputs match\n if (input.dataType !== inputType) {\n throw new Error('input tensors should be one type');\n }\n // make sure the dimensionality of all inputs are the same\n if (input.dims.length !== inputRank) {\n throw new Error('input tensors should have the same shape');\n }\n input.dims.forEach((dim, i) => {\n if (i !== axis && dim !== referenceInput.dims[i]) {\n throw new Error('non concat dimensions must match');\n }\n });\n });\n};\n\nconst calculateInputIndexImpl = (numberOfTensors: number, sizeInConcatAxisStr: string): string => `\n fn calculateInputIndex(index: u32) -> u32 {\n let sizeInConcatAxis = array(${sizeInConcatAxisStr});\n for (var i: u32 = 0u; i < ${numberOfTensors}; i += 1u ) {\n if (index < sizeInConcatAxis[i]) {\n return i;\n }\n }\n return ${numberOfTensors}u;\n }`;\n\nconst assignOutputData = (inputs: readonly IndicesHelper[], output: IndicesHelper) => {\n const numberOfTensors = inputs.length;\n\n const codeLines: string[] = [];\n for (let i = 0; i < numberOfTensors; ++i) {\n const returnSnippet = output.setByOffset('global_idx', inputs[i].getByIndices('indices'));\n if (numberOfTensors === 1) {\n codeLines.push(returnSnippet);\n } else if (i === 0) {\n codeLines.push(`if (inputIndex == ${i}u) { ${returnSnippet} }`);\n } else if (i === numberOfTensors - 1) {\n codeLines.push(`else { ${returnSnippet} }`);\n } else {\n codeLines.push(`else if (inputIndex == ${i}) { ${returnSnippet} }`);\n }\n }\n return codeLines.join('\\n');\n};\n\nconst createConcatProgramInfo =\n (inputs: readonly TensorView[], adjustedAxis: number, outputShape: number[], dataType: DataType): ProgramInfo => {\n const outputSize = ShapeUtil.size(outputShape);\n\n const sizeInConcatAxis = new Array(inputs.length);\n const inputVars = new Array(inputs.length);\n\n let previousSum = 0;\n const inputDependencies: ProgramInputTensorInfoDependency[] = [];\n const inputRanks = [];\n const programUniforms: ProgramUniform[] = [{type: DataType.uint32, data: outputSize}];\n for (let i = 0; i < inputs.length; ++i) {\n previousSum += inputs[i].dims[adjustedAxis];\n sizeInConcatAxis[i] = previousSum;\n inputRanks.push(inputs[i].dims.length);\n inputVars[i] = inputVariable(`input${i}`, dataType, inputRanks[i]);\n inputDependencies.push('rank');\n programUniforms.push({type: DataType.uint32, data: sizeInConcatAxis[i]});\n }\n for (let i = 0; i < inputs.length; ++i) {\n programUniforms.push(...createTensorShapeVariables(inputs[i].dims));\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const output = outputVariable('output', dataType, outputShape.length);\n const indicesAxis = output.indicesGet('indices', adjustedAxis);\n const sizeInConcatAxisStr =\n Array.from(Array(sizeInConcatAxis.length).keys()).map(i => `uniforms.sizeInConcatAxis${i}`).join(',');\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n\n ${(() => {\n shaderHelper.registerUniform('outputSize', 'u32');\n for (let i = 0; i < inputs.length; i++) {\n shaderHelper.registerUniform(`sizeInConcatAxis${i}`, 'u32');\n }\n return shaderHelper.declareVariables(...inputVars, output);\n })()}\n\n ${calculateInputIndexImpl(sizeInConcatAxis.length, sizeInConcatAxisStr)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n\n var indices = ${output.offsetToIndices('global_idx')};\n\n let inputIndex = calculateInputIndex(${indicesAxis});\n if (inputIndex != 0u) {\n let sizeInConcatAxis = array(${sizeInConcatAxisStr});\n ${indicesAxis} -= sizeInConcatAxis[inputIndex - 1u];\n }\n\n ${assignOutputData(inputVars, output)}\n }`;\n\n return {\n name: 'Concat',\n shaderCache: {hint: `${adjustedAxis}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms,\n }),\n getShaderSource,\n };\n };\n\nexport const concat = (context: ComputeContext, attributes: ConcatAttributes): void => {\n const inputs = context.inputs;\n const inputShape = inputs[0].dims;\n const adjustedAxis = ShapeUtil.normalizeAxis(attributes.axis, inputShape.length);\n validateInputs(inputs, adjustedAxis);\n const outputShape = inputShape.slice();\n outputShape[adjustedAxis] =\n inputs.reduce((sum, input) => sum + (input.dims.length > adjustedAxis ? input.dims[adjustedAxis] : 0), 0);\n // 0 length tensors are valid for concat, remove them\n const nonEmptyInputs = inputs.filter(input => ShapeUtil.size(input.dims) > 0);\n context.compute(\n createConcatProgramInfo(nonEmptyInputs, adjustedAxis, outputShape, inputs[0].dataType), {inputs: nonEmptyInputs});\n};\n\nexport const parseConcatAttributes = (attributes: Record): ConcatAttributes =>\n createAttributeWithCacheKey({axis: attributes.axis as number});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {MAX_CLIP, MIN_CLIP} from '../../util';\nimport {ProgramUniform} from '../types';\n\nimport {UniformsArrayType} from './common';\n\nexport interface InternalActivationAttributes {\n readonly activation: string;\n readonly clipMin?: number;\n readonly clipMax?: number;\n readonly alpha?: number;\n readonly beta?: number;\n}\n\nexport const getActivationSnippet =\n (attributes: InternalActivationAttributes, valueType: string, baseType = 'f32'): string => {\n switch (attributes.activation) {\n case 'Relu':\n return `value = max(value, ${valueType}(0.0));`;\n case 'Sigmoid':\n return `value = (${valueType}(1.0) / (${valueType}(1.0) + exp(-value)));`;\n case 'Clip':\n return `value = clamp(value, ${valueType}(${baseType}(uniforms.clip_min)), ${valueType}(${\n baseType}(uniforms.clip_max)));`;\n case 'HardSigmoid':\n return `value = max(${valueType}(0.0), min(${valueType}(1.0), ${baseType}(uniforms.alpha) * value + ${\n baseType}(uniforms.beta)));`;\n case 'LeakyRelu':\n return `value = select(${baseType}(uniforms.alpha) * value, value, value >= ${valueType}(0.0));`;\n case '':\n return '';\n // TODO: adding other activations that can be fused.\n default:\n throw new Error(`Unsupported activation ${attributes.activation}`);\n }\n };\n\nexport const appendActivationUniformsData =\n (attributes: InternalActivationAttributes, programUniform: ProgramUniform[]) => {\n if (attributes.activation === 'Clip') {\n programUniform.push(\n {type: DataType.float, data: attributes.clipMax!}, {type: DataType.float, data: attributes.clipMin!});\n } else if (attributes.activation === 'HardSigmoid') {\n programUniform.push(\n {type: DataType.float, data: attributes.alpha!}, {type: DataType.float, data: attributes.beta!});\n } else if (attributes.activation === 'LeakyRelu') {\n programUniform.push({type: DataType.float, data: attributes.alpha!});\n }\n };\n\nexport const appendActivationUniforms = (attributes: InternalActivationAttributes, uniforms: UniformsArrayType) => {\n if (attributes.activation === 'Clip') {\n uniforms.push({name: 'clip_max', type: 'f32'}, {name: 'clip_min', type: 'f32'});\n } else if (attributes.activation === 'HardSigmoid') {\n uniforms.push({name: 'alpha', type: 'f32'}, {name: 'beta', type: 'f32'});\n } else if (attributes.activation === 'LeakyRelu') {\n uniforms.push({name: 'alpha', type: 'f32'});\n }\n};\n\nexport const parseInternalActivationAttributes =\n (attributes: Record|undefined): InternalActivationAttributes => {\n const activation = attributes?.activation as string || '';\n if (activation === 'HardSigmoid') {\n const [alpha, beta] = attributes?.activation_params as [number, number] || [0.2, 0.5];\n return {activation, alpha, beta};\n } else if (activation === 'Clip') {\n const [clipMin, clipMax] = attributes?.activation_params as [number, number] || [MIN_CLIP, MAX_CLIP];\n return {activation, clipMax, clipMin};\n } else if (activation === 'LeakyRelu') {\n const [alpha] = attributes?.activation_params as [number] || [0.01];\n return {activation, alpha};\n }\n return {activation};\n };\n", "/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/activation_util.ts\n//\n// modified to fit the needs of the project\n\nexport const typeSnippet = (component: number, dataType: string) => {\n switch (component) {\n case 1:\n return dataType;\n case 2:\n return `vec2<${dataType}>`;\n case 3:\n return `vec3<${dataType}>`;\n case 4:\n return `vec4<${dataType}>`;\n default:\n throw new Error(`${component}-component is not supported.`);\n }\n};\n\nexport const biasSnippet = (hasBias: boolean): string => `\n ${hasBias ? 'value = value + getBiasByOutputCoords(coords);' : ''}\n `;\n", "/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-core/src/ops/conv_util.ts\n//\n// modified to fit the needs of the project\n\nexport const utilFunctions = (strideStr: string) => (`\nfn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 {\n return dot(coords, vec4(\n shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1));\n}\nfn getOutputIndexFromCoords(coords : vec4) -> i32 {\n return dot(coords, vec4(\n i32(${strideStr}.x), i32(${strideStr}.y), i32(${strideStr}.z), 1));\n}\n`);\n", "/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/matmul_packed_webgpu.ts\n//\n// modified to fit the needs of the project\n\nimport {DataType} from '../../../../wasm-common';\nimport {TensorView} from '../../../tensor-view';\nimport {ShapeUtil} from '../../../util';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, getBroadcastDims, IndicesHelper, inputVariable, internalVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet, InternalActivationAttributes} from '../fuse-utils';\n\nimport {typeSnippet} from './activation_util';\n\nconst writeDataToSubAVec4Snippet = (transpose: boolean, batchDims?: IndicesHelper) => {\n if (transpose) {\n return `\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n kStart + inputRow,\n globalRowStart / innerElementSize + inputCol${batchDims ? ', batchIndices' : ''});\n `;\n\n } else {\n return `\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n globalRow + innerRow,\n kStart / innerElementSize + inputCol${batchDims ? ', batchIndices' : ''});\n `;\n }\n};\n\nconst calculateResultSnippet = (transposeA: boolean, innerElementSize: number) => {\n if (transposeA) {\n return `\n let ACached0 = mm_Asub[k * innerElementSize][localRow];\n let ACached1 = mm_Asub[k * innerElementSize + 1][localRow];\n let ACached2 = mm_Asub[k * innerElementSize + 2][localRow];\n ${innerElementSize === 3 ? '' : 'let ACached3 = mm_Asub[k * innerElementSize + 3][localRow];'}\n for (var i = 0; i < rowPerThread; i = i + 1) {\n acc[i] = BCached0 * ACached0[i] + acc[i];\n acc[i] = BCached1 * ACached1[i] + acc[i];\n acc[i] = BCached2 * ACached2[i] + acc[i];\n ${innerElementSize === 3 ? '' : 'acc[i] = BCached3 * ACached3[i] + acc[i];'}\n }`;\n } else {\n return `\n for (var i = 0; i < rowPerThread; i = i + 1) {\n let ACached = mm_Asub[tileRow + i][k];\n acc[i] = BCached0 * ACached.x + acc[i];\n acc[i] = BCached1 * ACached.y + acc[i];\n acc[i] = BCached2 * ACached.z + acc[i];\n ${innerElementSize === 3 ? '' : 'acc[i] = BCached3 * ACached.w + acc[i];'}\n }`;\n }\n};\n\nexport const makeMatMulPackedVec4Source =\n (workPerThread: number[], workgroupSize: [number, number, number], type = 'f32', batchDims?: IndicesHelper,\n transposeA = false, tileInner = 32, splitK = false, splitedDimInner = 32): string => {\n const tileAOuter = workgroupSize[1] * workPerThread[1];\n const tileBOuter = workgroupSize[0] * workPerThread[0];\n const tileAWidth = transposeA ? tileAOuter : tileInner;\n const tileAHight = transposeA ? tileInner : tileAOuter;\n const innerElementSize = tileAWidth / workgroupSize[0];\n const rowPerThreadB = tileInner / workgroupSize[1];\n\n if (!(((transposeA && innerElementSize === 4 && workPerThread[1] === 4) ||\n (!transposeA && (innerElementSize === 3 || innerElementSize === 4))) &&\n tileAWidth % workgroupSize[0] === 0 && tileInner % workgroupSize[1] === 0 && workPerThread[0] === 4)) {\n throw new Error(`If transposeA ${transposeA} is true, innerElementSize ${\n innerElementSize} and workPerThread[1] ${workPerThread[1]} must be 4.\n Otherwise, innerElementSize ${innerElementSize} must be 3 or 4.\n tileAWidth ${tileAWidth} must be divisible by workgroupSize[0]${workgroupSize[0]}. tileInner ${\n tileInner} must be divisible by workgroupSize[1] ${workgroupSize[1]}. colPerThread ${\n workPerThread[0]} must be 4.`);\n }\n return `\nvar mm_Asub: array, ${tileAWidth / innerElementSize}>, ${tileAHight}>;\nvar mm_Bsub: array, ${tileBOuter / workPerThread[0]}>, ${tileInner}>;\n\nconst rowPerThread = ${workPerThread[1]};\nconst colPerThread = ${workPerThread[0]};\nconst innerElementSize = ${innerElementSize};\nconst tileInner = ${tileInner};\n\n@compute @workgroup_size(${workgroupSize[0]}, ${workgroupSize[1]}, ${workgroupSize[2]})\nfn main(@builtin(local_invocation_id) localId : vec3,\n @builtin(global_invocation_id) globalId : vec3,\n @builtin(workgroup_id) workgroupId : vec3) {\n let localRow = i32(localId.y);\n let tileRow = localRow * rowPerThread;\n let tileCol = i32(localId.x);\n\n let globalRow =i32(globalId.y) * rowPerThread;\n let globalCol = i32(globalId.x);\n let batch = ${splitK ? '0' : 'i32(globalId.z)'};\n ${batchDims ? `let batchIndices = ${batchDims.offsetToIndices('u32(batch)')};` : ''}\n let globalRowStart = i32(workgroupId.y) * ${tileAOuter};\n\n let num_tiles = ${splitK ? `${Math.ceil(splitedDimInner / tileInner)}` : '(uniforms.dim_inner - 1) / tileInner + 1'};\n var kStart = ${splitK ? `i32(globalId.z) * ${splitedDimInner}` : '0'};\n\n var acc: array, rowPerThread>;\n\n // Loop over shared dimension.\n let tileRowB = localRow * ${rowPerThreadB};\n for (var t = 0; t < num_tiles; t = t + 1) {\n // Load one tile of A into local memory.\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n let inputRow = tileRow + innerRow;\n let inputCol = tileCol;\n ${writeDataToSubAVec4Snippet(transposeA, batchDims)}\n }\n\n // Load one tile of B into local memory.\n for (var innerRow = 0; innerRow < ${rowPerThreadB}; innerRow = innerRow + 1) {\n let inputRow = tileRowB + innerRow;\n let inputCol = tileCol;\n mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol${\n batchDims ? ', batchIndices' : ''});\n }\n kStart = kStart + tileInner;\n workgroupBarrier();\n\n // Compute acc values for a single thread.\n for (var k = 0; k < tileInner / innerElementSize; k = k + 1) {\n let BCached0 = mm_Bsub[k * innerElementSize][tileCol];\n let BCached1 = mm_Bsub[k * innerElementSize + 1][tileCol];\n let BCached2 = mm_Bsub[k * innerElementSize + 2][tileCol];\n ${innerElementSize === 3 ? '' : 'let BCached3 = mm_Bsub[k * innerElementSize + 3][tileCol];'}\n\n ${calculateResultSnippet(transposeA, innerElementSize)}\n }\n\n workgroupBarrier();\n }\n\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]);\n }\n}`;\n };\n\nconst writeDataToSubASnippet = (transpose: boolean, batchDims?: IndicesHelper) => {\n if (transpose) {\n return `\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n kStart + inputRow,\n globalRowStart + inputCol${batchDims ? ', batchIndices' : ''});\n `;\n\n } else {\n return `\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n globalRowStart + inputRow,\n kStart + inputCol${batchDims ? ', batchIndices' : ''});\n `;\n }\n};\n\nconst readDataFromSubASnippet = (transposeA: boolean) =>\n transposeA ? 'let ACached = mm_Asub[k][tileRow + innerRow];' : 'let ACached = mm_Asub[tileRow + innerRow][k];';\n\n// sequentialAccessByThreads means sequential data in memory is accessed by\n// threads, instead of a single thread (default behavior).\nexport const makeMatMulPackedSource =\n (workPerThread: number[], workgroupSize: [number, number, number], type = 'f32', batchDims?: IndicesHelper,\n transposeA = false, tileInner = 32, splitK = false, splitedDimInner = 32,\n sequentialAccessByThreads = false): string => {\n const tileAOuter = workPerThread[1] * workgroupSize[1];\n const tileBOuter = workPerThread[0] * workgroupSize[0];\n const tileAWidth = transposeA ? tileAOuter : tileInner;\n const tileAHight = transposeA ? tileInner : tileAOuter;\n\n if (!(tileAHight % workgroupSize[1] === 0 && tileAWidth % workgroupSize[0] === 0 &&\n tileInner % workgroupSize[1] === 0)) {\n throw new Error(`tileAHight ${tileAHight} must be divisible by workgroupSize[1]${\n workgroupSize[1]}, tileAWidth ${tileAWidth} must be divisible by workgroupSize[0]${\n workgroupSize[0]}, tileInner ${tileInner} must be divisible by workgroupSize[1]${workgroupSize[1]}`);\n }\n const rowPerThreadA = tileAHight / workgroupSize[1];\n const colPerThreadA = tileAWidth / workgroupSize[0];\n const rowPerThreadB = tileInner / workgroupSize[1];\n const matmulSnippet = sequentialAccessByThreads ?\n `\n let localRow = i32(localId.y);\n let localCol = i32(localId.x);\n let globalRowStart = i32(workgroupId.y) * ${tileAOuter};\n let globalColStart = i32(workgroupId.x) * ${tileBOuter};\n\n // Loop over shared dimension.\n for (var t = 0; t < num_tiles; t = t + 1) {\n // Load one tile of A into local memory.\n for (var inputRow = localRow; inputRow < ${tileAHight}; inputRow = inputRow + ${workgroupSize[1]}) {\n for (var inputCol = localCol; inputCol < ${tileAWidth}; inputCol = inputCol + ${workgroupSize[0]}) {\n ${writeDataToSubASnippet(transposeA, batchDims)}\n }\n }\n // Load one tile of B into local memory.\n for (var inputRow = localRow; inputRow < ${tileInner}; inputRow = inputRow + ${workgroupSize[1]}) {\n for (var inputCol = localCol; inputCol < ${tileBOuter}; inputCol = inputCol + ${workgroupSize[0]}) {\n mm_Bsub[inputRow][inputCol] = mm_readB(batch,\n kStart + inputRow,\n globalColStart + inputCol${batchDims ? ', batchIndices' : ''});\n }\n }\n kStart = kStart + tileInner;\n workgroupBarrier();\n\n // Compute acc values for a single thread.\n var BCached : array<${type}, colPerThread>;\n for (var k = 0; k < tileInner; k = k + 1) {\n for (var inner = 0; inner < colPerThread; inner = inner + 1) {\n BCached[inner] = mm_Bsub[k][localCol + inner * ${workgroupSize[0]}];\n }\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n let ACached = ${\n transposeA ? `mm_Asub[k][localRow + innerRow * ${workgroupSize[1]}];` :\n `mm_Asub[localRow + innerRow * ${workgroupSize[1]}][k];`}\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n acc[innerRow][innerCol] = acc[innerRow][innerCol] +\n ACached * BCached[innerCol];\n }\n }\n }\n workgroupBarrier();\n }\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n let gRow = globalRowStart + localRow + innerRow * ${workgroupSize[1]};\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n let gCol = globalColStart + localCol + innerCol * ${workgroupSize[0]};\n mm_write(batch, gRow, gCol, acc[innerRow][innerCol]);\n }\n }\n ` :\n `\nlet tileRow = i32(localId.y) * rowPerThread;\nlet tileCol = i32(localId.x) * colPerThread;\n\nlet globalRow = i32(globalId.y) * rowPerThread;\nlet globalCol = i32(globalId.x) * colPerThread;\nlet globalRowStart = i32(workgroupId.y) * ${tileAOuter};\n\nlet tileRowA = i32(localId.y) * ${rowPerThreadA};\nlet tileColA = i32(localId.x) * ${colPerThreadA};\nlet tileRowB = i32(localId.y) * ${rowPerThreadB};\n// Loop over shared dimension.\nfor (var t = 0; t < num_tiles; t = t + 1) {\n // Load one tile of A into local memory.\n for (var innerRow = 0; innerRow < ${rowPerThreadA}; innerRow = innerRow + 1) {\n for (var innerCol = 0; innerCol < ${colPerThreadA}; innerCol = innerCol + 1) {\n let inputRow = tileRowA + innerRow;\n let inputCol = tileColA + innerCol;\n ${writeDataToSubASnippet(transposeA, batchDims)}\n }\n }\n\n // Load one tile of B into local memory.\n for (var innerRow = 0; innerRow < ${rowPerThreadB}; innerRow = innerRow + 1) {\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n let inputRow = tileRowB + innerRow;\n let inputCol = tileCol + innerCol;\n mm_Bsub[inputRow][inputCol] = mm_readB(batch,\n kStart + inputRow,\n globalCol + innerCol${batchDims ? ', batchIndices' : ''});\n }\n }\n kStart = kStart + tileInner;\n workgroupBarrier();\n\n // Compute acc values for a single thread.\n var BCached : array<${type}, colPerThread>;\n for (var k = 0; k < tileInner; k = k + 1) {\n for (var inner = 0; inner < colPerThread; inner = inner + 1) {\n BCached[inner] = mm_Bsub[k][tileCol + inner];\n }\n\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n ${readDataFromSubASnippet(transposeA)}\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol];\n }\n }\n }\n\n workgroupBarrier();\n}\n\nfor (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n mm_write(batch, globalRow + innerRow, globalCol + innerCol,\n acc[innerRow][innerCol]);\n }\n}\n`;\n\n return `\n var mm_Asub : array, ${tileAHight}>;\n var mm_Bsub : array, ${tileInner}>;\n const rowPerThread = ${workPerThread[1]};\n const colPerThread = ${workPerThread[0]};\n const tileInner = ${tileInner};\n\n@compute @workgroup_size(${workgroupSize[0]}, ${workgroupSize[1]}, ${workgroupSize[2]})\nfn main(@builtin(local_invocation_id) localId : vec3,\n @builtin(global_invocation_id) globalId : vec3,\n @builtin(workgroup_id) workgroupId : vec3) {\n let batch = ${splitK ? '0' : 'i32(globalId.z)'};\n ${batchDims ? `let batchIndices = ${batchDims.offsetToIndices('u32(batch)')};` : ''}\n let num_tiles = ${\n splitK ? `${Math.ceil(splitedDimInner / tileInner)}` : '(uniforms.dim_inner - 1) / tileInner + 1'};\n var kStart = ${splitK ? `i32(globalId.z) * ${splitedDimInner}` : '0'};\n\n var acc : array, rowPerThread>;\n ${matmulSnippet}\n }\n`;\n };\n\nconst matMulReadWriteFnSource =\n (component: number, hasBias: boolean, applyActivation: string, variables: IndicesHelper[],\n batchShapes: Array, isChannelsLast = false): string => {\n const [batchAShape, batchBShape, batchShape] = batchShapes;\n const [batchVariable, aVariable, bVariable, outputVariable] = variables;\n const broadCastADims = getBroadcastDims(batchAShape, batchShape);\n const broadCastBDims = getBroadcastDims(batchBShape, batchShape);\n const dataType = tensorTypeToWsglStorageType(variables[0].type.tensor);\n const getAIndices = () => {\n const aRank = aVariable.rank;\n const batchRank = batchVariable.rank;\n let resStr = `var aIndices: ${aVariable.type.indices};`;\n for (let i = aRank - 2 - 1, j = batchRank - 1; i >= 0; i--, j--) {\n resStr += `\\naIndices[${i}] = ${batchRank > 1 ? `batchIndices[${j}]` : 'batchIndices'};`;\n }\n broadCastADims.forEach(i => {\n resStr += `\\naIndices[${i}] = 0;`;\n });\n resStr += `\\naIndices[${aRank - 2}] = u32(row);\n aIndices[${aRank - 1}] = u32(colIn);`;\n return resStr;\n };\n const getBIndices = () => {\n const bRank = bVariable.rank;\n const batchRank = batchVariable.rank;\n let resStr = `var bIndices: ${bVariable.type.indices};`;\n for (let i = bRank - 2 - 1, j = batchRank - 1; i >= 0; i--, j--) {\n resStr += `\\nbIndices[${i}] = ${batchRank > 1 ? `batchIndices[${j}]` : 'batchIndices'};`;\n }\n broadCastBDims.forEach(i => {\n resStr += `\\nbIndices[${i}] = 0;`;\n });\n resStr += `\\nbIndices[${bRank - 2}] = u32(row);\n bIndices[${bRank - 1}] = u32(colIn);`;\n return resStr;\n };\n const source = `\n fn mm_readA(batch: i32, row: i32, colIn: i32, batchIndices: ${batchVariable.type.indices}) -> ${\n typeSnippet(component, dataType)} {\n var value = ${typeSnippet(component, dataType)}(0.0);\n let col = colIn * ${component};\n if(row < uniforms.dim_a_outer && col < uniforms.dim_inner)\n {\n ${getAIndices()}\n value = ${aVariable.getByIndices('aIndices')};\n }\n return value;\n }\n\n fn mm_readB(batch: i32, row: i32, colIn: i32, batchIndices: ${batchVariable.type.indices}) -> ${\n typeSnippet(component, dataType)} {\n var value = ${typeSnippet(component, dataType)}(0.0);\n let col = colIn * ${component};\n if(row < uniforms.dim_inner && col < uniforms.dim_b_outer)\n {\n ${getBIndices()}\n value = ${bVariable.getByIndices('bIndices')};\n }\n return value;\n }\n\n fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${typeSnippet(component, dataType)}) {\n let col = colIn * ${component};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) {\n var value = valueIn;\n let coords = vec3(batch, row, colIn);\n ${\n hasBias ?\n `value = value + ${isChannelsLast ? 'bias[colIn]' : `${typeSnippet(component, dataType)}(bias[row])`};` :\n '' }\n ${applyActivation}\n ${outputVariable.setByIndices('vec3(coords)', 'value')}\n }\n }\n `;\n return source;\n };\n\nexport const createMatmulProgramInfo =\n (inputs: readonly TensorView[], activationAttributes: InternalActivationAttributes, outputShape: readonly number[],\n reshapedOutputShape?: readonly number[],\n isChannelsLast = false /* only used for conv2dByMatMul*/): ProgramInfo => {\n const aShape = inputs[0].dims;\n const bShape = inputs[1].dims;\n const outerDimsA = aShape.slice(0, -2);\n const outerDimsB = bShape.slice(0, -2);\n const outerDims = reshapedOutputShape ? reshapedOutputShape.slice(0, -2) : outputShape.slice(0, -2);\n const batchSize = ShapeUtil.size(outerDims);\n const dimAOuter = aShape[aShape.length - 2];\n const dimInner = aShape[aShape.length - 1];\n const dimBOuter = bShape[bShape.length - 1];\n const isVec4 = dimInner % 4 === 0 && dimBOuter % 4 === 0;\n\n // TODO: fine tune size\n const elementsPerThread = dimAOuter <= 8 ? [4, 1, 1] : [4, 4, 1];\n const workgroupSize: [number, number, number] = [8, 8, 1];\n const dispatch = [\n Math.ceil(dimBOuter / workgroupSize[0] / elementsPerThread[0]),\n Math.ceil(dimAOuter / workgroupSize[1] / elementsPerThread[1]),\n Math.ceil(batchSize / workgroupSize[2] / elementsPerThread[2])\n ];\n\n const components = isVec4 ? 4 : 1;\n const aShapeTemp = [...outerDimsA, dimAOuter, dimInner / components];\n const aRank = aShapeTemp.length;\n const bShapeTemp = [...outerDimsB, dimInner, dimBOuter / components];\n const bRank = bShapeTemp.length;\n const outputShapeTemp = [batchSize, dimAOuter, dimBOuter / components];\n const programUniforms: ProgramUniform[] = [\n {type: DataType.int32, data: dimAOuter}, {type: DataType.int32, data: dimBOuter},\n {type: DataType.int32, data: dimInner}\n ];\n appendActivationUniformsData(activationAttributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(outerDims, aShapeTemp, bShapeTemp));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n\n const hasBias = inputs.length > 2;\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShapeTemp));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const batchRank = outerDims.length;\n const batchDims = internalVariable('batchDims', inputs[0].dataType, batchRank, 1);\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n\n const A = inputVariable('a', inputs[0].dataType, aRank, components);\n const B = inputVariable('b', inputs[1].dataType, bRank, components);\n const output = outputVariable('result', inputs[0].dataType, outputShapeTemp.length, components);\n const inputVariables = [A, B];\n if (hasBias) {\n const biasComponents = isChannelsLast ? components : 1;\n inputVariables.push(inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, biasComponents));\n }\n const uniforms: UniformsArrayType =\n [{name: 'dim_a_outer', type: 'i32'}, {name: 'dim_b_outer', type: 'i32'}, {name: 'dim_inner', type: 'i32'}];\n appendActivationUniforms(activationAttributes, uniforms);\n const baseType = tensorTypeToWsglStorageType(output.type.tensor);\n const applyActivation = getActivationSnippet(activationAttributes, output.type.value, baseType);\n const declareFunctions = matMulReadWriteFnSource(\n components, hasBias, applyActivation, [batchDims, A, B, output], [outerDimsA, outerDimsB, outerDims],\n isChannelsLast);\n return `\n ${\n shaderHelper.registerUniforms(uniforms).registerInternalVariables(batchDims).declareVariables(\n ...inputVariables, output)}\n ${declareFunctions}\n ${\n isVec4 ? makeMatMulPackedVec4Source(elementsPerThread, workgroupSize, dataType, batchDims) :\n makeMatMulPackedSource(elementsPerThread, workgroupSize, dataType, batchDims)}\n `;\n };\n return {\n name: 'MatMul',\n shaderCache: {\n hint: `${elementsPerThread};${activationAttributes.activation};${isVec4};${isChannelsLast}`,\n inputDependencies\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n programUniforms\n }),\n getShaderSource,\n };\n };\n", "/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/conv2d_mm_webgpu.ts\n//\n// modified to fit the needs of the project\n\nimport {DataType} from '../../../../wasm-common';\nimport {LOG_DEBUG} from '../../../log';\nimport {TensorView} from '../../../tensor-view';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {ConvAttributes} from '../conv';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet} from '../fuse-utils';\n\nimport {biasSnippet, typeSnippet} from './activation_util';\nimport {utilFunctions} from './conv_util';\nimport {makeMatMulPackedSource, makeMatMulPackedVec4Source} from './matmul_packed_webgpu';\n\nconst conv2dCommonSnippet =\n (isChannelsLast: boolean, fitAOuter: boolean, fitBOuter: boolean, fitInner: boolean, addBias = false,\n attributes: ConvAttributes, innerElementSizeX = 4, innerElementSizeW = 4, innerElementSize = 4,\n dataType = 'f32'): string => {\n const getXSnippet = (innerElementSize: number) => {\n switch (innerElementSize) {\n case 1:\n return 'resData = x[xIndex];';\n case 3:\n return `resData = vec3<${dataType}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;\n case 4:\n return 'resData = x[xIndex / 4];';\n default:\n throw new Error(`innerElementSize ${innerElementSize} is not supported.`);\n }\n };\n const getWSnippet = (innerElementSize: number) => {\n switch (innerElementSize) {\n case 1:\n return 'return w[row * i32(uniforms.w_shape[3]) + colIn];';\n case 4:\n return 'return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];';\n default:\n throw new Error(`innerElementSize ${innerElementSize} is not supported.`);\n }\n };\n const coordASnippet = isChannelsLast ? `\n let coord = vec4(batch, xRow, xCol, xCh);\n ` :\n `\n let coord = vec4(batch, xCh, xRow, xCol);\n `;\n\n const coordResSnippet = isChannelsLast ? `\n let coords = vec4(\n batch,\n row / outWidth,\n row % outWidth,\n col);\n ` :\n `\n let coords = vec4(\n batch,\n row,\n col / outWidth,\n col % outWidth);\n `;\n\n const xHeight = isChannelsLast ? 'i32(uniforms.x_shape[1])' : 'i32(uniforms.x_shape[2])';\n const xWidth = isChannelsLast ? 'i32(uniforms.x_shape[2])' : 'i32(uniforms.x_shape[3])';\n const row = isChannelsLast ? 'row' : 'col';\n const col = isChannelsLast ? 'col' : 'row';\n const readXSnippet = `\n let inChannels = i32(uniforms.w_shape[2]);\n let outWidth = ${isChannelsLast ? 'i32(uniforms.result_shape[2])' : 'i32(uniforms.result_shape[3])'};\n let outRow = ${row} / outWidth;\n let outCol = ${row} % outWidth;\n\n let WRow = ${col} / (i32(uniforms.w_shape[1]) * inChannels);\n let WCol = ${col} / inChannels % i32(uniforms.w_shape[1]);\n let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0];\n let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1];\n let xCh = ${col} % inChannels;\n var resData = ${typeSnippet(innerElementSizeX, dataType)}(0.0);\n // The bounds checking is always needed since we use it to pad zero for\n // the 'same' padding type.\n if (xRow >= 0 && xRow < ${xHeight} && xCol >= 0 && xCol < ${xWidth}) {\n ${coordASnippet}\n let xIndex = getIndexFromCoords4D(coord, vec4(uniforms.x_shape));\n ${getXSnippet(innerElementSizeX)}\n }\n return resData;`;\n\n const sampleX = isChannelsLast ? (fitAOuter && fitInner ? `\n let col = colIn * ${innerElementSizeX};\n ${readXSnippet}` :\n `\n let col = colIn * ${innerElementSizeX};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) {\n ${readXSnippet}\n }\n return ${typeSnippet(innerElementSizeX, dataType)}(0.0);`) :\n (fitInner && fitBOuter ? `\n let col = colIn * ${innerElementSizeX};\n ${readXSnippet}` :\n `\n let col = colIn * ${innerElementSizeX};\n if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) {\n ${readXSnippet}\n }\n return ${typeSnippet(innerElementSizeX, dataType)}(0.0);`);\n\n const sampleW = `${getWSnippet(innerElementSizeW)}`;\n\n const resType = typeSnippet(innerElementSize, dataType);\n const aType =\n isChannelsLast ? typeSnippet(innerElementSizeX, dataType) : typeSnippet(innerElementSizeW, dataType);\n const bType =\n isChannelsLast ? typeSnippet(innerElementSizeW, dataType) : typeSnippet(innerElementSizeX, dataType);\n const applyActivation = getActivationSnippet(attributes, resType, dataType);\n const userCode = `\n fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${aType} {\n ${isChannelsLast ? sampleX : sampleW}\n }\n\n fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${bType} {\n ${isChannelsLast ? sampleW : sampleX}\n }\n\n fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${resType}) {\n let col = colIn * ${innerElementSize};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer)\n {\n var value = valueIn;\n let outWidth = ${isChannelsLast ? 'i32(uniforms.result_shape[2])' : 'i32(uniforms.result_shape[3])'};\n ${coordResSnippet}\n ${biasSnippet(addBias)}\n ${applyActivation}\n setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value);\n }\n }`;\n return userCode;\n };\n\nexport const createConv2DMatMulProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvAttributes, outputShape: readonly number[], dimAOuter: number,\n dimBOuter: number, dimInner: number, hasBias: boolean, sequentialAccessByThreads: boolean): ProgramInfo => {\n const isChannelsLast = attributes.format === 'NHWC';\n const inChannels = isChannelsLast ? inputs[0].dims[3] : inputs[0].dims[1];\n const batchSize = outputShape[0];\n const outWidth = isChannelsLast ? outputShape[2] : outputShape[3];\n const outHeight = isChannelsLast ? outputShape[1] : outputShape[2];\n const outChannels = isChannelsLast ? outputShape[3] : outputShape[1];\n // TODO: enable vec4 for NCHW\n const isVec4 = isChannelsLast && (inChannels % 4 === 0 || inChannels % 3 === 0) && outChannels % 4 === 0;\n\n // TODO: fine tune size\n const dispatchX = isChannelsLast ? outChannels : outWidth * outHeight;\n const dispatchY = isChannelsLast ? outWidth * outHeight : outChannels;\n const workGroupSize: [number, number, number] = [8, 8, 1];\n const elementsPerThread = dimAOuter <= 8 ? [4, 1, 1] : [4, 4, 1];\n const dispatch = [\n Math.ceil(dispatchX / workGroupSize[0] / elementsPerThread[0]),\n Math.ceil(dispatchY / workGroupSize[1] / elementsPerThread[1]),\n Math.ceil(batchSize / workGroupSize[2] / elementsPerThread[2])\n ];\n\n LOG_DEBUG('verbose', () => `[conv2d_mm_webgpu] dispatch = ${dispatch}`);\n\n const innerElementSize = isVec4 ? (isChannelsLast && inChannels % 4 !== 0 ? 3 : 4) : 1;\n const tileAOuter = workGroupSize[1] * elementsPerThread[1];\n const tileBOuter = workGroupSize[0] * elementsPerThread[0];\n const tileInner = Math.max(workGroupSize[0] * innerElementSize, workGroupSize[1]);\n const fitAOuter = dimAOuter % tileAOuter === 0;\n const fitBOuter = dimBOuter % tileBOuter === 0;\n const fitInner = dimInner % tileInner === 0;\n const elementsSize = isVec4 ? [innerElementSize, 4, 4] : [1, 1, 1];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.int32, data: dimAOuter}, {type: DataType.int32, data: dimBOuter},\n {type: DataType.int32, data: dimInner}, {type: DataType.int32, data: [attributes.pads[0], attributes.pads[1]]},\n {type: DataType.int32, data: attributes.strides}, {type: DataType.int32, data: attributes.dilations}\n ];\n appendActivationUniformsData(attributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(inputs[0].dims, inputs[1].dims));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const uniforms: UniformsArrayType = [\n {name: 'dim_a_outer', type: 'i32'}, {name: 'dim_b_outer', type: 'i32'}, {name: 'dim_inner', type: 'i32'},\n {name: 'pad', type: 'i32', length: 2}, {name: 'stride', type: 'i32', length: 2},\n {name: 'dilation', type: 'i32', length: 2}\n ];\n appendActivationUniforms(attributes, uniforms);\n\n // TODO: support component 2, 3.\n const components = isVec4 ? 4 : 1;\n const t = tensorTypeToWsglStorageType(inputs[0].dataType);\n let declareFunctions = `\n fn setOutputAtIndex(flatIndex : i32, value : ${isVec4 ? `vec4<${t}>` : t}) {\n result[flatIndex] = ${isVec4 ? `vec4<${t}>` : t}(value);\n }\n fn setOutputAtCoords(d0 : i32, d1 : i32, d2 : i32, d3 : i32, value : ${isVec4 ? `vec4<${t}>` : t}) {\n let flatIndex = getOutputIndexFromCoords(vec4(d0, d1, d2, d3));\n setOutputAtIndex(flatIndex ${isVec4 ? '/ 4' : ''}, value);\n }`;\n const x = inputVariable(\n 'x', inputs[0].dataType, inputs[0].dims.length, innerElementSize === 3 ? 1 : innerElementSize);\n const w = inputVariable('w', inputs[1].dataType, inputs[1].dims.length, components);\n const inputVariables = [x, w];\n const output = outputVariable('result', inputs[0].dataType, outputShape.length, components);\n if (hasBias) {\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, components);\n inputVariables.push(bias);\n declareFunctions += `\n fn getBiasByOutputCoords(coords : vec4) -> ${isVec4 ? `vec4<${t}>` : t} {\n return bias[coords.${isChannelsLast ? 'w' : 'y'}${isVec4 ? '/ 4' : ''}];\n }`;\n }\n\n return `\n ${utilFunctions('uniforms.result_strides')}\n //struct Uniforms { xShape : vec4, wShape : vec4, outShape : vec4,\n // outShapeStrides: vec3, filterDims : vec2, pad : vec2, stride : vec2,\n // dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32 };\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)}\n ${declareFunctions}\n ${\n conv2dCommonSnippet(\n isChannelsLast, fitAOuter, fitBOuter, fitInner, hasBias, attributes, elementsSize[0], elementsSize[1],\n elementsSize[2], t)}\n ${\n isVec4 ?\n makeMatMulPackedVec4Source(elementsPerThread, workGroupSize, t, undefined, !isChannelsLast, tileInner) :\n makeMatMulPackedSource(\n elementsPerThread, workGroupSize, t, undefined, !isChannelsLast, tileInner, false, undefined,\n sequentialAccessByThreads)}`;\n };\n return {\n name: 'Conv2DMatMul',\n shaderCache: {\n hint: `${attributes.cacheKey};${innerElementSize};${isVec4};${fitAOuter};${fitBOuter};${fitInner};${\n tileAOuter};${tileBOuter};${tileInner}`,\n inputDependencies\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n programUniforms,\n }),\n getShaderSource\n };\n };\n", "/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/conv3d_naive_webgpu.ts\n//\n// modified to fit the needs of the project\n\nimport {DataType} from '../../../../wasm-common';\nimport {LOG_DEBUG} from '../../../log';\nimport {TensorView} from '../../../tensor-view';\nimport {ShapeUtil} from '../../../util';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, getElementAt, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {ConvAttributes} from '../conv';\n\nconst arrayProduct = (arr: number[]) => {\n let product = 1;\n for (let i = 0; i < arr.length; i++) {\n product *= arr[i];\n }\n return product;\n};\n\nconst parse3TupleParam = (param: number|[number, number, number]): [number, number, number] =>\n typeof param === 'number' ? [param, param, param] : param;\n\nconst getEffectiveFilterSize = (filterSize: number, dilation: number): number => {\n if (dilation <= 1) {\n return filterSize;\n }\n\n return filterSize + (filterSize - 1) * (dilation - 1);\n};\n\nconst computeDefaultPad =\n (inputShape: [number, number]|[number, number, number, number], fieldSize: number, stride: number, dilation = 1):\n number => {\n const effectiveFieldSize = getEffectiveFilterSize(fieldSize, dilation);\n return Math.floor((inputShape[0] * (stride - 1) - stride + effectiveFieldSize) / 2);\n };\n\nconst computeOutputShape4D =\n (inShape: [number, number, number, number], filterShape: [number, number, number], outChannels: number,\n strides: [number, number, number], zeroPad?: number): [number, number, number, number] => {\n if (zeroPad == null) {\n // eslint-disable-next-line no-param-reassign\n zeroPad = computeDefaultPad(inShape, filterShape[0], strides[0]);\n }\n const outShape: [number, number, number, number] = [0, 0, 0, outChannels];\n for (let index = 0; index < 3; index++) {\n if (inShape[index] + 2 * zeroPad >= filterShape[index]) {\n outShape[index] = Math.trunc((inShape[index] - filterShape[index] + 2 * zeroPad) / strides[index] + 1);\n }\n }\n return outShape;\n };\n\nconst get3DPadAndOutInfo =\n (pad: number|string|number[], inDepth: number, inHeight: number, inWidth: number, strideDepth: number,\n strideHeight: number, strideWidth: number, filterDepth: number, filterHeight: number,\n filterWidth: number): {padInfo: PadInfo3D; outDepth: number; outHeight: number; outWidth: number} => {\n let padInfo: PadInfo3D;\n let outDepth: number;\n let outHeight: number;\n let outWidth: number;\n\n if (pad === 'VALID') {\n // eslint-disable-next-line no-param-reassign\n pad = 0;\n }\n\n if (typeof pad === 'number') {\n padInfo = {top: pad, bottom: pad, left: pad, right: pad, front: pad, back: pad};\n const outShape = computeOutputShape4D(\n [inDepth, inHeight, inWidth, 1], [filterDepth, filterHeight, filterWidth], 1,\n [strideDepth, strideHeight, strideWidth], pad);\n outDepth = outShape[0];\n outHeight = outShape[1];\n outWidth = outShape[2];\n } else if (Array.isArray(pad)) {\n if (!pad.every((val, _, arr) => val === arr[0])) {\n throw Error(`Unsupported padding parameter: ${pad}`);\n }\n padInfo = {top: pad[0], bottom: pad[1], left: pad[2], right: pad[3], front: pad[4], back: pad[5]};\n const outShape = computeOutputShape4D(\n [inDepth, inHeight, inWidth, 1], [filterDepth, filterHeight, filterWidth], 1,\n [strideDepth, strideHeight, strideWidth], pad[0]);\n outDepth = outShape[0];\n outHeight = outShape[1];\n outWidth = outShape[2];\n } else if (pad === 'SAME_UPPER') {\n // TODO: support 'SAME_LOWER'.\n outDepth = Math.ceil(inDepth / strideDepth);\n outHeight = Math.ceil(inHeight / strideHeight);\n outWidth = Math.ceil(inWidth / strideWidth);\n const padAlongDepth = (outDepth - 1) * strideDepth + filterDepth - inDepth;\n const padAlongHeight = (outHeight - 1) * strideHeight + filterHeight - inHeight;\n const padAlongWidth = (outWidth - 1) * strideWidth + filterWidth - inWidth;\n const front = Math.floor(padAlongDepth / 2);\n const back = padAlongDepth - front;\n const top = Math.floor(padAlongHeight / 2);\n const bottom = padAlongHeight - top;\n const left = Math.floor(padAlongWidth / 2);\n const right = padAlongWidth - left;\n\n padInfo = {top, bottom, left, right, front, back};\n } else {\n throw Error(`Unknown padding parameter: ${pad}`);\n }\n return {padInfo, outDepth, outHeight, outWidth};\n };\n\ntype PadInfo3D = {\n top: number; left: number; right: number; bottom: number; front: number; back: number;\n};\n\nexport type Conv3DInfo = {\n batchSize: number; inDepth: number; inHeight: number; inWidth: number; inChannels: number; outDepth: number;\n outHeight: number;\n outWidth: number;\n outChannels: number;\n dataFormat: 'channelsFirst' | 'channelsLast';\n strideDepth: number;\n strideHeight: number;\n strideWidth: number;\n dilationDepth: number;\n dilationHeight: number;\n dilationWidth: number;\n filterDepth: number;\n filterHeight: number;\n filterWidth: number;\n effectiveFilterDepth: number;\n effectiveFilterHeight: number;\n effectiveFilterWidth: number;\n padInfo: PadInfo3D;\n inShape: [number, number, number, number, number];\n outShape: [number, number, number, number, number];\n filterShape: [number, number, number, number, number];\n};\n\nexport const computeConv3DInfo =\n (inShape: [number, number, number, number, number], filterShape: [number, number, number, number, number],\n strides: number|[number, number, number], dilations: number|[number, number, number], pad: number|string|number[],\n depthwise = false, dataFormat: 'channelsFirst'|'channelsLast' = 'channelsLast'): Conv3DInfo => {\n let batchSize, inDepth, inHeight, inWidth, inChannels;\n if (dataFormat === 'channelsLast') {\n [batchSize, inDepth, inHeight, inWidth, inChannels] = inShape;\n } else if (dataFormat === 'channelsFirst') {\n [batchSize, inChannels, inDepth, inHeight, inWidth] = inShape;\n } else {\n throw new Error(`Unknown dataFormat ${dataFormat}`);\n }\n const [filterChannels, , filterDepth, filterHeight, filterWidth] = filterShape;\n\n const [strideDepth, strideHeight, strideWidth] = parse3TupleParam(strides);\n const [dilationDepth, dilationHeight, dilationWidth] = parse3TupleParam(dilations);\n\n const effectiveFilterDepth = getEffectiveFilterSize(filterDepth, dilationDepth);\n const effectiveFilterHeight = getEffectiveFilterSize(filterHeight, dilationHeight);\n const effectiveFilterWidth = getEffectiveFilterSize(filterWidth, dilationWidth);\n const {padInfo, outDepth, outHeight, outWidth} = get3DPadAndOutInfo(\n pad, inDepth, inHeight, inWidth, strideDepth, strideHeight, strideWidth, effectiveFilterDepth,\n effectiveFilterHeight, effectiveFilterWidth);\n\n const outChannels = depthwise ? filterChannels * inChannels : filterChannels;\n\n let outShape: [number, number, number, number, number] = [0, 0, 0, 0, 0];\n if (dataFormat === 'channelsFirst') {\n outShape = [batchSize, outChannels, outDepth, outHeight, outWidth];\n } else if (dataFormat === 'channelsLast') {\n outShape = [batchSize, outDepth, outHeight, outWidth, outChannels];\n }\n\n return {\n batchSize,\n dataFormat,\n inDepth,\n inHeight,\n inWidth,\n inChannels,\n outDepth,\n outHeight,\n outWidth,\n outChannels,\n padInfo,\n strideDepth,\n strideHeight,\n strideWidth,\n filterDepth,\n filterHeight,\n filterWidth,\n effectiveFilterDepth,\n effectiveFilterHeight,\n effectiveFilterWidth,\n dilationDepth,\n dilationHeight,\n dilationWidth,\n inShape,\n outShape,\n filterShape\n };\n };\n\nexport const createConv3DNaiveProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvAttributes, outputShape: readonly number[],\n filterDims: readonly number[], pads: readonly number[], dataFormat: string): ProgramInfo => {\n const isChannelsLast = dataFormat === 'channelsLast';\n const inChannels = isChannelsLast ? inputs[0].dims[3] : inputs[0].dims[1];\n // TODO: enable vec4.\n const isVec4 = false;\n const workGroupSize: [number, number, number] = [64, 1, 1];\n const dispatchLayout = {x: outputShape.map((_, i) => i)};\n const dispatch = [Math.ceil(arrayProduct(dispatchLayout.x.map(d => outputShape[d])) / (workGroupSize[0])), 1, 1];\n\n LOG_DEBUG('verbose', () => `[conv3d_naive_webgpu] dispatch = ${dispatch}`);\n\n const innerElementSize = isVec4 ? (isChannelsLast && inChannels % 4 !== 0 ? 3 : 4) : 1;\n const outputSize = ShapeUtil.size(outputShape);\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: filterDims},\n {type: DataType.uint32, data: pads}, {type: DataType.uint32, data: attributes.strides},\n {type: DataType.uint32, data: attributes.dilations}\n ];\n programUniforms.push(...createTensorShapeVariables(inputs[0].dims, inputs[1].dims));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n const hasBias = inputs.length === 3;\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'filter_dims', type: 'u32', length: filterDims.length},\n {name: 'pads', type: 'u32', length: pads.length},\n {name: 'strides', type: 'u32', length: attributes.strides.length},\n {name: 'dilations', type: 'u32', length: attributes.dilations.length}\n ];\n // TODO: support component 2, 3.\n const components = isVec4 ? 4 : 1;\n const t = tensorTypeToWsglStorageType(inputs[0].dataType);\n\n const x = inputVariable(\n 'x', inputs[0].dataType, inputs[0].dims.length, innerElementSize === 3 ? 1 : innerElementSize);\n const w = inputVariable('W', inputs[1].dataType, inputs[1].dims.length, components);\n const inputVariables = [x, w];\n const output = outputVariable('result', inputs[0].dataType, outputShape.length, components);\n let declareFunctions = '';\n if (hasBias) {\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, components);\n inputVariables.push(bias);\n declareFunctions += `\n fn getBiasByOutputCoords(coords : array) -> ${isVec4 ? `vec4<${t}>` : t} {\n return bias[${isChannelsLast ? getElementAt('coords', 4, 5) : getElementAt('coords', 1, 5)}${\n isVec4 ? '/ 4' : ''}];\n }`;\n }\n\n return `\n ${declareFunctions}\n fn getX(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 {\n let aIndices = array(d0, d1, d2, d3, d4);\n return ${x.getByIndices('aIndices')};\n }\n fn getW(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 {\n let aIndices = array(d0, d1, d2, d3, d4);\n return ${w.getByIndices('aIndices')};\n }\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let coords = ${output.offsetToIndices('global_idx')};\n let batch = ${getElementAt('coords', 0, x.rank)};\n let d2 = ${\n isChannelsLast ? getElementAt('coords', x.rank - 1, x.rank) : getElementAt('coords', 1, x.rank)};\n let xFRCCorner = vec3(${\n isChannelsLast ? getElementAt('coords', 1, x.rank) : getElementAt('coords', 2, x.rank)},\n ${isChannelsLast ? getElementAt('coords', 2, x.rank) : getElementAt('coords', 3, x.rank)},\n ${\n isChannelsLast ? getElementAt('coords', 3, x.rank) :\n getElementAt('coords', 4, x.rank)}) * uniforms.strides - uniforms.pads;\n let xFCorner = xFRCCorner.x;\n let xRCorner = xFRCCorner.y;\n let xCCorner = xFRCCorner.z;\n let xShapeY = ${\n isChannelsLast ? getElementAt('uniforms.x_shape', 1, x.rank) : getElementAt('uniforms.x_shape', 2, x.rank)};\n let xShapeZ = ${\n isChannelsLast ? getElementAt('uniforms.x_shape', 2, x.rank) : getElementAt('uniforms.x_shape', 3, x.rank)};\n let xShapeW = ${\n isChannelsLast ? getElementAt('uniforms.x_shape', 3, x.rank) : getElementAt('uniforms.x_shape', 4, x.rank)};\n let xShapeU = ${\n isChannelsLast ? getElementAt('uniforms.x_shape', 4, x.rank) : getElementAt('uniforms.x_shape', 1, x.rank)};\n let inputDepthNearestVec4 = (xShapeU / 4) * 4;\n let inputDepthVec4Remainder = xShapeU % 4;\n\n var dotProd = 0.0;\n for (var wF = 0u; wF < uniforms.filter_dims[0]; wF++) {\n let xF = xFCorner + wF * uniforms.dilations[0];\n if (xF < 0 || xF >= xShapeY) {\n continue;\n }\n\n for (var wR = 0u; wR < uniforms.filter_dims[1]; wR++) {\n let xR = xRCorner + wR * uniforms.dilations[1];\n if (xR < 0 || xR >= xShapeZ) {\n continue;\n }\n\n for (var wC = 0u; wC < uniforms.filter_dims[2]; wC++) {\n let xC = xCCorner + wC * uniforms.dilations[2];\n if (xC < 0 || xC >= xShapeW) {\n continue;\n }\n\n for (var d1 = 0u; d1 < inputDepthNearestVec4; d1 += 4) {\n ${\n isChannelsLast ? `let xValues = vec4(\n getX(batch, xF, xR, xC, d1),\n getX(batch, xF, xR, xC, d1 + 1),\n getX(batch, xF, xR, xC, d1 + 2),\n getX(batch, xF, xR, xC, d1 + 3));\n ` :\n `let xValues = vec4(\n getX(batch, d1, xF, xR, xC),\n getX(batch, d1 + 1, xF, xR, xC),\n getX(batch, d1 + 2, xF, xR, xC),\n getX(batch, d1 + 3, xF, xR, xC));\n `}\n let wValues = vec4(\n getW(d2, d1, wF, wR, wC),\n getW(d2, d1 + 1, wF, wR, wC),\n getW(d2, d1 + 2, wF, wR, wC),\n getW(d2, d1 + 3, wF, wR, wC));\n dotProd += dot(xValues, wValues);\n }\n if (inputDepthVec4Remainder == 1) {\n ${\n isChannelsLast ? `dotProd += getX(batch, xF, xR, xC, inputDepthNearestVec4)\n * getW(d2, inputDepthNearestVec4, wF, wR, wC);` :\n `dotProd += getX(batch, inputDepthNearestVec4, xF, xR, xC)\n * getW(d2, inputDepthNearestVec4, wF, wR, wC);`}\n } else if (inputDepthVec4Remainder == 2) {\n ${\n isChannelsLast ? `let xValues = vec2(\n getX(batch, xF, xR, xC, inputDepthNearestVec4),\n getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1));\n ` :\n `let xValues = vec2(\n getX(batch, inputDepthNearestVec4, xF, xR, xC),\n getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC));\n `}\n let wValues = vec2(\n getW(d2, inputDepthNearestVec4, wF, wR, wC),\n getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC));\n dotProd += dot(xValues, wValues);\n } else if (inputDepthVec4Remainder == 3) {\n ${\n isChannelsLast ? `let xValues = vec3(\n getX(batch, xF, xR, xC, inputDepthNearestVec4),\n getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1),\n getX(batch, xF, xR, xC, inputDepthNearestVec4 + 2));\n ` :\n `let xValues = vec3(\n getX(batch, inputDepthNearestVec4, xF, xR, xC),\n getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC),\n getX(batch, inputDepthNearestVec4 + 2, xF, xR, xC));\n `}\n let wValues = vec3(\n getW(d2, inputDepthNearestVec4, wF, wR, wC),\n getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC),\n getW(d2, inputDepthNearestVec4 + 2, wF, wR, wC));\n dotProd += dot(xValues, wValues);\n }\n }\n }\n }\n ${hasBias ? 'dotProd = dotProd + getBiasByOutputCoords(coords)' : ''};\n result[global_idx] = f32(dotProd);\n }`;\n };\n return {\n name: 'Conv3DNaive',\n shaderCache:\n {hint: `${attributes.cacheKey};${isChannelsLast};${innerElementSize};${hasBias}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n programUniforms,\n }),\n getShaderSource\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, getMaxComponents, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\nimport {calculateOutputShape, ConvAttributes} from './conv';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet} from './fuse-utils';\n\n/**\n * naive grouped conv implementation, supports 1d/2d conv\n * @param squeezeOutputShapeFunction - an optional function to squeeze the output shape, only used in conv1d\n */\nexport const createGroupedConvProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvAttributes,\n squeezeOutputShapeFunction?: (shape: readonly number[]) => number[]): ProgramInfo => {\n const hasBias = inputs.length > 2;\n const processBias = hasBias ? 'value += b[output_channel];' : '';\n const xShape = inputs[0].dims;\n const wShape = inputs[1].dims;\n const outputChannelsPerGroup = wShape[0] / attributes.group;\n\n const isChannelLast = attributes.format === 'NHWC';\n const outputShape = calculateOutputShape(\n xShape, wShape, attributes.dilations, attributes.pads, attributes.strides, isChannelLast);\n const outputSize = ShapeUtil.size(outputShape);\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: attributes.dilations},\n {type: DataType.uint32, data: [attributes.strides[0], attributes.strides[1]]},\n {type: DataType.uint32, data: [attributes.pads[0], attributes.pads[1]]},\n {type: DataType.uint32, data: outputChannelsPerGroup}\n ];\n appendActivationUniformsData(attributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(xShape, wShape));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('output', inputs[0].dataType, outputShape.length);\n const baseType = tensorTypeToWsglStorageType(output.type.tensor);\n const applyActivation = getActivationSnippet(attributes, output.type.value, baseType);\n const x = inputVariable('x', inputs[0].dataType, xShape.length);\n const w = inputVariable('w', inputs[1].dataType, wShape.length);\n const inputVars = [x, w];\n if (hasBias) {\n inputVars.push(inputVariable('b', inputs[2].dataType, inputs[2].dims.length));\n }\n\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'dilations', type: 'u32', length: attributes.dilations.length},\n {name: 'strides', type: 'u32', length: 2}, {name: 'pads', type: 'u32', length: 2},\n {name: 'output_channels_per_group', type: 'u32'}\n ];\n appendActivationUniforms(attributes, uniforms);\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVars, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let outputIndices = ${output.offsetToIndices('global_idx')};\n let batch: u32 = outputIndices[0];\n let output_channel: u32 = outputIndices[${isChannelLast ? 3 : 1}];\n let xRCCorner: vec2 = vec2(outputIndices[${isChannelLast ? 1 : 2}], outputIndices[${\n isChannelLast ? 2 : 3}]) * uniforms.strides - uniforms.pads;\n let group_id: u32 = output_channel / uniforms.output_channels_per_group;\n\n var value: ${output.type.value} = ${output.type.value}(0);\n for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[1]; wInChannel++) {\n let input_channel = group_id * uniforms.w_shape[1] + wInChannel;\n for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[2]; wHeight++) {\n let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0];\n\n if (xHeight < 0u || xHeight >= uniforms.x_shape[${isChannelLast ? 1 : 2}]) {\n continue;\n }\n\n for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[3]; wWidth++) {\n let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1];\n if (xWidth < 0u || xWidth >= uniforms.x_shape[${isChannelLast ? 2 : 3}]) {\n continue;\n }\n\n let xVal = ${\n isChannelLast ? x.get('batch', 'xHeight', 'xWidth', 'input_channel') :\n x.get('batch', 'input_channel', 'xHeight', 'xWidth')};\n let wVal = ${w.get('output_channel', 'wInChannel', 'wHeight', 'wWidth')};\n value += xVal*wVal;\n }\n }\n }\n ${processBias}\n ${applyActivation}\n ${output.setByOffset('global_idx', 'value')}\n }`;\n };\n return {\n name: 'GroupedConv',\n shaderCache: {hint: attributes.cacheKey, inputDependencies},\n getRunData: () => ({\n outputs: [{\n dims: squeezeOutputShapeFunction ? squeezeOutputShapeFunction(outputShape) : outputShape,\n dataType: inputs[0].dataType\n }],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n };\n\nexport const createGroupedConvVectorizeProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvAttributes, outputShape: readonly number[]): ProgramInfo => {\n const hasBias = inputs.length > 2;\n const components = getMaxComponents(outputShape[3]);\n const outputNumber = getMaxComponents(outputShape[2]);\n const outputSize = ShapeUtil.size(outputShape) / components / outputNumber;\n const xShape = [inputs[0].dims[0], inputs[0].dims[1], inputs[0].dims[2], inputs[0].dims[3] / components];\n const wShape = [inputs[1].dims[0], inputs[1].dims[1], inputs[1].dims[2], inputs[1].dims[3] / components];\n const outputShapeInShader = [outputShape[0], outputShape[1], outputShape[2], outputShape[3] / components];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize},\n {type: DataType.int32, data: [attributes.strides[0], attributes.strides[1]]},\n {type: DataType.int32, data: [attributes.pads[0], attributes.pads[1]]}\n ];\n appendActivationUniformsData(attributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(xShape, wShape, outputShapeInShader));\n const xNumber = (outputNumber - 1) * attributes.strides[1] + wShape[1];\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('output', inputs[0].dataType, outputShapeInShader.length, components);\n const baseType = tensorTypeToWsglStorageType(output.type.tensor);\n const applyActivation = getActivationSnippet(attributes, output.type.value, baseType);\n const x = inputVariable('x', inputs[0].dataType, xShape.length, components);\n const w = inputVariable('w', inputs[1].dataType, wShape.length, components);\n const inputVars = [x, w];\n if (hasBias) {\n inputVars.push(inputVariable('b', inputs[2].dataType, inputs[2].dims, components));\n }\n const processBias = hasBias ? 'value += b[output_channel];' : '';\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'},\n {name: 'strides', type: 'i32', length: 2},\n {name: 'pads', type: 'i32', length: 2},\n ];\n appendActivationUniforms(attributes, uniforms);\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVars, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let width0 = uniforms.output_shape[3];\n let output_channel = global_idx % width0;\n var index1 = global_idx / width0;\n let width1 = uniforms.output_shape[2] / ${outputNumber}u;\n let col = (index1 % width1) * ${outputNumber}u;\n index1 = index1 / width1;\n let row = index1 % uniforms.output_shape[1];\n let batch = index1 / uniforms.output_shape[1];\n\n let x_corner = vec2(i32(row), i32(col)) * uniforms.strides - uniforms.pads;\n\n var x_vals: array<${x.type.value}, ${xNumber}>;\n var values: array<${output.type.value}, ${outputNumber}>;\n let input_channel = output_channel;\n // Use constant instead of uniform can give better performance for w's height/width.\n for (var w_height: u32 = 0u; w_height < ${wShape[0]}; w_height++) {\n let x_height = x_corner.x + i32(w_height);\n if (x_height >= 0 && u32(x_height) < uniforms.x_shape[1]) {\n for (var i = 0; i < ${xNumber}; i++) {\n let x_width = x_corner.y + i;\n if (x_width >= 0 && u32(x_width) < uniforms.x_shape[2]) {\n x_vals[i] = ${x.get('batch', 'u32(x_height)', 'u32(x_width)', 'input_channel')};\n } else {\n x_vals[i] = ${x.type.value}(0);\n }\n }\n for (var w_width: u32 = 0u; w_width < ${wShape[1]}; w_width++) {\n let w_val = ${w.get('w_height', 'w_width', '0', 'output_channel')};\n for (var i = 0u; i < ${outputNumber}u; i++) {\n values[i] = fma(x_vals[i * u32(uniforms.strides[1]) + w_width], w_val, values[i]);\n }\n }\n }\n }\n\n for (var i = 0u; i < ${outputNumber}u; i++) {\n var value = values[i];\n ${processBias}\n ${applyActivation}\n ${output.set('batch', 'row', 'col + i', 'output_channel', 'value')};\n }\n }`;\n };\n\n return {\n name: 'GroupedConv-Vectorize',\n shaderCache: {\n hint: `${attributes.cacheKey};${components};${outputNumber};${xNumber};${wShape[0]};${wShape[1]}`,\n inputDependencies: hasBias ? ['rank', 'rank', 'type'] : ['rank', 'rank']\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {BroadcastUtil, ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createMatmulProgramInfo} from './3rd-party/matmul_packed_webgpu';\nimport {createTensorShapeVariables, getBroadcastDims, getMaxComponents, IndicesHelper, inputVariable, internalVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet, InternalActivationAttributes} from './fuse-utils';\n\nexport const createNaiveMatmulProgramInfo =\n (inputs: readonly TensorView[], activationAttributes: InternalActivationAttributes, outputShape: readonly number[],\n reshapedOutputShape?: readonly number[],\n isChannelsLast = false /* only used for conv2dByMatMul*/): ProgramInfo => {\n const aShape = inputs[0].dims;\n const bShape = inputs[1].dims;\n\n const M = aShape[aShape.length - 2];\n const N = bShape[bShape.length - 1];\n const K = aShape[aShape.length - 1];\n const components = getMaxComponents(N);\n const aComponents = getMaxComponents(K);\n const outputNumber = getMaxComponents(M);\n const outputSize = ShapeUtil.size(outputShape) / components / outputNumber;\n const hasBias = inputs.length > 2;\n const outerDims = reshapedOutputShape ? reshapedOutputShape.slice(0, -2) : outputShape.slice(0, -2);\n const batchSize = ShapeUtil.size(outerDims);\n const outputShapeInShader = [batchSize, M, N];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: M}, {type: DataType.uint32, data: N},\n {type: DataType.uint32, data: K}\n ];\n appendActivationUniformsData(activationAttributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(outerDims, aShape, bShape));\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n }\n programUniforms.push(...createTensorShapeVariables(outputShapeInShader));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const batchDims = internalVariable('batch_dims', inputs[0].dataType, outerDims.length);\n const a = inputVariable('a', inputs[0].dataType, aShape.length, aComponents);\n const b = inputVariable('b', inputs[1].dataType, bShape.length, components);\n const output = outputVariable('output', inputs[0].dataType, outputShapeInShader.length, components);\n const baseType = tensorTypeToWsglStorageType(output.type.tensor);\n const applyActivation = getActivationSnippet(activationAttributes, output.type.value, baseType);\n const inputVariables = [a, b];\n let processBias = '';\n if (hasBias) {\n const biasComponents = isChannelsLast ? components : 1;\n inputVariables.push(inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, biasComponents));\n processBias = `${\n isChannelsLast ? `value += bias[col / ${biasComponents}];` :\n `value += ${output.type.value}(bias[row + i]);`}`;\n }\n\n const outerDimsA = aShape.slice(0, -2);\n const outerDimsB = bShape.slice(0, -2);\n const broadCastADims = getBroadcastDims(outerDimsA, outerDims);\n const broadCastBDims = getBroadcastDims(outerDimsB, outerDims);\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'M', type: 'u32'}, {name: 'N', type: 'u32'},\n {name: 'K', type: 'u32'}\n ];\n appendActivationUniforms(activationAttributes, uniforms);\n\n const getIndices = (variable: IndicesHelper, broadCastDims: number[]) => {\n const rank = variable.rank;\n const name = variable.name;\n if (rank === 2) {\n return `var ${name}_indices = ${variable.type.indices}(0u, 0u);`;\n }\n const batchRank = batchDims.rank;\n let resStr = `var ${name}_indices: ${variable.type.indices};`;\n for (let i = rank - 2 - 1, j = batchRank - 1; i >= 0; i--, j--) {\n resStr += `\\n${name}_indices[${i}] = ${batchRank > 1 ? `batch_indices[${j}]` : 'batch_indices'};`;\n }\n broadCastDims.forEach(i => {\n resStr += `\\n${name}_indices[${i}] = 0;`;\n });\n resStr += `${name}_indices[${rank - 2}] = 0u;\n ${name}_indices[${rank - 1}] = 0u;`;\n return resStr;\n };\n\n const calcResult = (): string => {\n let calcStr = `var a_data: ${a.type.value};`;\n for (let i = 0; i < aComponents; i++) {\n calcStr += `\n let b_data${i} = b[(b_offset + (k + ${i}) * uniforms.N + col) / ${components}];`;\n }\n for (let i = 0; i < outputNumber; i++) {\n calcStr += `a_data = a[(a_offset + (row + ${i}) * uniforms.K + k) / ${aComponents}];`;\n\n for (let j = 0; j < aComponents; j++) {\n calcStr += `\n values[${i}] = fma(${b.type.value}(a_data${aComponents === 1 ? '' : `[${j}]`}), b_data${j}, values[${\n i}]);\\n`;\n }\n }\n return calcStr;\n };\n\n return `\n ${\n shaderHelper.registerUniforms(uniforms).registerInternalVariables(batchDims).declareVariables(\n ...inputVariables, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let col = (global_idx % (uniforms.N / ${components})) * ${components};\n var index1 = global_idx / (uniforms.N / ${components});\n let stride1 = uniforms.M / ${outputNumber};\n let row = (index1 % stride1) * ${outputNumber};\n let batch = index1 / stride1;\n\n ${outputShape.length === 2 ? '' : `let batch_indices = ${batchDims.offsetToIndices('batch')};`}\n ${getIndices(a, broadCastADims)}\n let a_offset = ${a.indicesToOffset('a_indices')};\n ${getIndices(b, broadCastBDims)}\n let b_offset = ${b.indicesToOffset('b_indices')};\n var values: array<${output.type.value}, ${outputNumber}>;\n for (var k: u32 = 0u; k < uniforms.K; k = k + ${aComponents}) {\n ${calcResult()}\n }\n for (var i = 0u; i < ${outputNumber}u; i++) {\n var value = values[i];\n ${processBias}\n ${applyActivation}\n let cur_indices = ${output.type.indices}(batch, row + i, col);\n let offset = ${output.indicesToOffset('cur_indices')};\n ${output.setByOffset(`offset / ${components}`, 'value')};\n }\n }\n `;\n };\n return {\n name: 'MatMulNaive',\n shaderCache: {\n hint: `${activationAttributes.activation};${components};${aComponents};${outputNumber};${isChannelsLast}`,\n inputDependencies: hasBias ? ['rank', 'rank', 'rank'] : ['rank', 'rank']\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource\n };\n };\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('MatMul requires 2 inputs.');\n }\n\n if (inputs[0].dims[inputs[0].dims.length - 1] !== inputs[1].dims[inputs[1].dims.length - 2]) {\n throw new Error('shared dimension does not match.');\n }\n};\n\nexport const matMul = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n const outputShape = BroadcastUtil.calcShape(context.inputs[0].dims, context.inputs[1].dims, true);\n if (!outputShape) {\n throw new Error('Can\\'t use matmul on the given tensors');\n }\n const N = outputShape[outputShape.length - 1];\n const K = context.inputs[0].dims[context.inputs[0].dims.length - 1];\n if (N < 8 && K < 8) {\n context.compute(createNaiveMatmulProgramInfo(context.inputs, {activation: ''}, outputShape));\n } else {\n context.compute(createMatmulProgramInfo(context.inputs, {activation: ''}, outputShape));\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorView} from '../../tensor-view';\nimport {PoolConvUtil} from '../../util';\nimport {AttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext} from '../types';\n\nimport {createConv2DMatMulProgramInfo} from './3rd-party/conv2d_mm_webgpu';\nimport {computeConv3DInfo, createConv3DNaiveProgramInfo} from './3rd-party/conv3d_naive_webgpu';\nimport {createMatmulProgramInfo} from './3rd-party/matmul_packed_webgpu';\nimport {createGroupedConvProgramInfo, createGroupedConvVectorizeProgramInfo} from './conv-grouped';\nimport {InternalActivationAttributes, parseInternalActivationAttributes} from './fuse-utils';\nimport {createNaiveMatmulProgramInfo} from './matmul';\nimport {createTransposeProgramInfo} from './transpose';\n\nexport const calculateOutputShape =\n (inputShape: readonly number[], kernelShape: readonly number[], dilations: readonly number[],\n adjustPads: readonly number[], strides: readonly number[], isChannelLast: boolean): number[] => {\n const batchSize = inputShape[0];\n const inputSpatialShape = inputShape.slice(isChannelLast ? 1 : 2, isChannelLast ? 3 : 4);\n const spatialRank = inputSpatialShape.length;\n const outChannels = kernelShape[0];\n const kernelSpatialShape = kernelShape.slice(2);\n const dilatedKernelShape = kernelSpatialShape.map((v, i) => v + (v - 1) * (dilations[i] - 1));\n const inputSpatialShapeWithPad = inputSpatialShape.map((v, i) => v + adjustPads[i] + adjustPads[i + spatialRank]);\n const outputShape =\n inputSpatialShapeWithPad.map((v, i) => Math.floor((v - dilatedKernelShape[i] + strides[i]) / strides[i]));\n outputShape.splice(0, 0, batchSize);\n outputShape.splice(isChannelLast ? 3 : 1, 0, outChannels);\n return outputShape;\n };\n\nexport interface ConvAttributes extends InternalActivationAttributes, AttributeWithCacheKey {\n readonly autoPad: string;\n readonly dilations: readonly number[];\n readonly format: 'NHWC'|'NCHW';\n readonly group: number;\n readonly kernelShape: readonly number[];\n readonly pads: readonly number[];\n readonly strides: readonly number[];\n readonly wIsConst: boolean;\n}\n\n// for transposing weight tensor from [M, C/group, KH, KW] to [KH, KW, C/group, M]\nconst weightTransposeAttribute = [2, 3, 1, 0];\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: ConvAttributes): void => {\n // Refer to the below link for all input checks\n // https://github.com/onnx/onnx/blob/master/docs/Operators.md#Conv\n if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n throw new Error('Conv requires 2 or 3 inputs');\n }\n\n if (inputs[0].dims.length > 5) {\n throw new Error('greater than 5D is not supported');\n }\n\n if (inputs[0].dims.length !== inputs[1].dims.length) {\n throw new Error('filter does not have same dimension as input');\n }\n\n // FILTER_IN_CHANNEL should be equal to DATA_CHANNEL\n const dataChannel = inputs[0].dims[attributes.format === 'NHWC' ? inputs[0].dims.length - 1 : 1];\n const filterInChannel = inputs[1].dims[1] * attributes.group;\n if (dataChannel !== filterInChannel) {\n throw new Error('FILTER_IN_CHANNEL should be equal to DATA_CHANNEL');\n }\n\n // if bias is provided it should be 1D and the number of elements should be equal to the number of feature maps\n if (inputs.length === 3 && (inputs[2].dims.length !== 1 || inputs[1].dims[0] !== inputs[2].dims[0])) {\n throw new Error('invalid bias');\n }\n\n const spatialRank = inputs[0].dims.length - 2;\n // wrong dilations dimension\n if (attributes.dilations.length !== spatialRank) {\n throw new Error(`dilations should be ${spatialRank}D`);\n }\n\n // Wrong strides dimension\n if (attributes.strides.length !== spatialRank) {\n throw new Error(`strides should be ${spatialRank}D`);\n }\n\n // Wrong pads dimension\n if (attributes.pads.length !== spatialRank * 2) {\n throw new Error(`pads should be ${spatialRank * 2}D`);\n }\n\n // if kernelShape is specified, it's data length must be 2 less than dims length of the weights tensor\n // (the first 2 dims are batch_size and channels)\n if (attributes.kernelShape.length !== 0 && attributes.kernelShape.length !== inputs[1].dims.length - 2) {\n throw new Error('invalid kernel shape');\n }\n};\n\nconst getAdjustedConvAttributes = (attributes: T, inputs: readonly TensorView[]): T => {\n const kernelShape = attributes.kernelShape.slice();\n // if kernelShape is not specified in the attributes of this op, infer it from the weight tensor dims\n for (let i = 2; i < inputs[1].dims.length; ++i) {\n if (kernelShape[i - 2] === 0) {\n kernelShape[i - 2] = inputs[1].dims[i];\n }\n }\n const pads = attributes.pads.slice();\n PoolConvUtil.adjustPadsBasedOnAutoPad(\n inputs[0].dims, attributes.strides, attributes.dilations, kernelShape, pads, attributes.format === 'NHWC',\n attributes.autoPad);\n\n // always return a new object so does not modify the original attributes\n const newAttributes: T = Object.assign({}, attributes);\n Object.assign(newAttributes, {kernelShape, pads});\n return newAttributes;\n};\n\nexport const parseConvAttributes = (attributes: Record): ConvAttributes => {\n const activationAttributes = parseInternalActivationAttributes(attributes);\n // TODO : Make this generic enough to compute default attributes for multi-dimensional conv\n const format = attributes.format as 'NHWC' | 'NCHW';\n const autoPad = ['NOTSET', 'VALID', 'SAME_UPPER', 'SAME_LOWER'][attributes.auto_pad as number];\n const dilations = attributes.dilations as number[];\n const group = attributes.group as number;\n const kernelShape = attributes.kernel_shape as number[];\n const pads = attributes.pads as number[];\n const strides = attributes.strides as number[];\n const wIsConst = (attributes.w_is_const as () => boolean)();\n\n return {\n autoPad,\n format,\n dilations,\n group,\n kernelShape,\n pads,\n strides,\n wIsConst,\n ...activationAttributes,\n cacheKey: `${attributes.format};${activationAttributes.activation};`\n };\n};\n\nconst conv2d = (context: ComputeContext, inputs: readonly TensorView[], attributes: ConvAttributes): void => {\n const adjustedAttributes = getAdjustedConvAttributes(attributes, inputs);\n\n // check attributes\n\n // const hasPreluActivationWeights = false; /* TODO: add support for prelu activation weights */\n const isChannelsLast = attributes.format === 'NHWC';\n if (attributes.group !== 1) {\n // NVIDIA GPU with ampere architecture fails with below 2 cases, but we couldn't repro them with any other\n // GPUs. So just disable vectorize on NVIDIA ampere to ensure always correct outputs.\n // [webgpu]Conv - conv - vectorize group - B\n // [webgpu]Conv - conv - vectorize group - D\n const enableGroupedConvVectorize = !context.adapterInfo.isArchitecture('ampere');\n if (enableGroupedConvVectorize && isChannelsLast && inputs[1].dims[0] === attributes.group &&\n inputs[1].dims[1] === 1 && attributes.dilations[0] === 1 && attributes.dilations[1] === 1) {\n const outputShape = calculateOutputShape(\n inputs[0].dims, inputs[1].dims, attributes.dilations, adjustedAttributes.pads, attributes.strides,\n isChannelsLast);\n const transposedWeight = (context.kernelCustomData.wT as TensorView | undefined) ??\n context.compute(\n createTransposeProgramInfo(inputs[1], weightTransposeAttribute),\n {inputs: [1], outputs: [attributes.wIsConst ? -2 : -1]})[0];\n if (attributes.wIsConst && !context.kernelCustomData.wT) {\n context.kernelCustomData.wT = transposedWeight;\n }\n const convInputs = [inputs[0], transposedWeight];\n if (inputs.length === 3) {\n convInputs.push(inputs[2]);\n }\n context.compute(\n createGroupedConvVectorizeProgramInfo(convInputs, adjustedAttributes, outputShape), {inputs: convInputs});\n } else {\n context.compute(createGroupedConvProgramInfo(inputs, adjustedAttributes));\n }\n return;\n }\n\n const hasBias = inputs.length === 3;\n const inputHeight = inputs[0].dims[isChannelsLast ? 1 : 2];\n const inputWidth = inputs[0].dims[isChannelsLast ? 2 : 3];\n const inputChannels = inputs[0].dims[isChannelsLast ? 3 : 1];\n const weightHeight = inputs[1].dims[2];\n const weightWidth = inputs[1].dims[3];\n\n const outputShape = calculateOutputShape(\n inputs[0].dims, inputs[1].dims, attributes.dilations, adjustedAttributes.pads, attributes.strides,\n isChannelsLast);\n const outHeight = outputShape[isChannelsLast ? 1 : 2];\n const outWidth = outputShape[isChannelsLast ? 2 : 3];\n const outChannels = outputShape[isChannelsLast ? 3 : 1];\n\n const sameSize = isChannelsLast && weightHeight === inputHeight && weightWidth === inputWidth &&\n attributes.pads[0] === 0 && attributes.pads[1] === 0;\n if (sameSize ||\n (weightHeight === 1 && weightWidth === 1 && attributes.dilations[0] === 1 && attributes.dilations[1] === 1 &&\n attributes.strides[0] === 1 && attributes.strides[1] === 1 && attributes.pads[0] === 0 &&\n attributes.pads[1] === 0)) {\n // conv2dByMatMul\n const batch = outputShape[0];\n let xReshaped, wReshaped, matmulOutputShape;\n const matmulInputs = [];\n if (isChannelsLast) {\n const transposedWeight = (context.kernelCustomData.wT as TensorView | undefined) ??\n context.compute(\n createTransposeProgramInfo(inputs[1], weightTransposeAttribute),\n {inputs: [1], outputs: [attributes.wIsConst ? -2 : -1]})[0];\n if (attributes.wIsConst && !context.kernelCustomData.wT) {\n context.kernelCustomData.wT = transposedWeight;\n }\n if (sameSize) {\n const sharedDim = inputHeight * inputWidth * inputChannels;\n xReshaped = inputs[0].reshape([1, batch, sharedDim]);\n wReshaped = transposedWeight.reshape([1, sharedDim, outChannels]);\n matmulOutputShape = [1, batch, outChannels];\n } else {\n xReshaped = inputs[0].reshape([batch, inputHeight * inputWidth, inputChannels]);\n wReshaped = transposedWeight.reshape([1, inputChannels, outChannels]);\n matmulOutputShape = [batch, outHeight * outWidth, outChannels];\n }\n matmulInputs.push(xReshaped);\n matmulInputs.push(wReshaped);\n } else {\n xReshaped = inputs[0].reshape([batch, inputChannels, inputHeight * inputWidth]);\n wReshaped = inputs[1].reshape([1, outChannels, inputChannels]);\n matmulOutputShape = [batch, outChannels, outHeight * outWidth];\n matmulInputs.push(wReshaped);\n matmulInputs.push(xReshaped);\n }\n if (hasBias) {\n matmulInputs.push(inputs[2]);\n }\n const N = matmulOutputShape[2];\n const K = matmulInputs[0].dims[matmulInputs[0].dims.length - 1];\n // Tune the threshold.\n if (N < 8 && K < 8) {\n context.compute(\n createNaiveMatmulProgramInfo(\n matmulInputs, adjustedAttributes, outputShape, matmulOutputShape, isChannelsLast),\n {inputs: matmulInputs});\n } else {\n context.compute(\n createMatmulProgramInfo(matmulInputs, adjustedAttributes, outputShape, matmulOutputShape, isChannelsLast),\n {inputs: matmulInputs});\n }\n return;\n }\n\n // TODO: implement conv2dWithIm2Col()\n\n const sequentialAccessByThreads = /* backend.adapterInfo.isIntel() */ true;\n\n // STEP.1: transpose weight\n const transposedWeight = (context.kernelCustomData.wT as TensorView | undefined) ??\n context.compute(\n createTransposeProgramInfo(inputs[1], weightTransposeAttribute),\n {inputs: [1], outputs: [attributes.wIsConst ? -2 : -1]})[0];\n if (attributes.wIsConst && !context.kernelCustomData.wT) {\n context.kernelCustomData.wT = transposedWeight;\n }\n\n // STEP.2: prepare reshaped inputs\n const convInputs = [inputs[0], transposedWeight];\n if (hasBias) {\n convInputs.push(inputs[2]);\n }\n\n // STEP.3: compute matmul\n const dimAOuter = isChannelsLast ? outHeight * outWidth : outChannels;\n const dimBOuter = isChannelsLast ? outChannels : outHeight * outWidth;\n const dimInner = weightHeight * weightWidth * inputChannels;\n context.compute(\n createConv2DMatMulProgramInfo(\n convInputs, adjustedAttributes, outputShape, dimAOuter, dimBOuter, dimInner, hasBias,\n sequentialAccessByThreads),\n {inputs: convInputs});\n};\n\nconst conv1d = (context: ComputeContext, attributes: ConvAttributes): void => {\n // extend the input to 2D by adding H dimension\n const isChannelLast = attributes.format === 'NHWC';\n const inputs = [\n context.inputs[0].reshape(\n isChannelLast ?\n // [N, W, C] -> [N, H=1, W, C]\n [context.inputs[0].dims[0], 1, context.inputs[0].dims[1], context.inputs[0].dims[2]] :\n // [N, C, W] -> [N, C, H=1, W]\n [context.inputs[0].dims[0], context.inputs[0].dims[1], 1, context.inputs[0].dims[2]]),\n //[FILTER_OUT_CHANNEL, FILTER_IN_CHANNEL, kW] -> [FILTER_OUT_CHANNEL, FILTER_IN_CHANNEL, kH=1, kW]\n context.inputs[1].reshape([context.inputs[1].dims[0], context.inputs[1].dims[1], 1, context.inputs[1].dims[2]])\n ];\n if (context.inputs.length === 3) {\n inputs.push(context.inputs[2]);\n }\n const pads = [0, attributes.pads[0], 0, attributes.pads[1]];\n const strides = [1].concat(attributes.strides);\n const dilations = [1].concat(attributes.dilations);\n const kernelShape = [1].concat(attributes.kernelShape);\n const adjustedAttributes = getAdjustedConvAttributes({...attributes, pads, strides, dilations, kernelShape}, inputs);\n context.compute(createGroupedConvProgramInfo(\n inputs, adjustedAttributes,\n outputShape => isChannelLast ? [outputShape[0], outputShape[2], outputShape[3]] : []));\n};\n\nconst conv3d = (context: ComputeContext, inputs: readonly TensorView[], attributes: ConvAttributes): void => {\n const format = attributes.format === 'NHWC' ? 'channelsLast' : 'channelsFirst';\n const adjustedAttributes = getAdjustedConvAttributes(attributes, inputs);\n const pads = attributes.autoPad === 'NOTSET' ? attributes.pads : attributes.autoPad;\n const convInfo = computeConv3DInfo(\n inputs[0].dims as [number, number, number, number, number],\n inputs[1].dims as [number, number, number, number, number],\n attributes.strides as number | [number, number, number],\n attributes.dilations as number | [number, number, number], pads as string | number[], false, format);\n context.compute(createConv3DNaiveProgramInfo(\n inputs, adjustedAttributes, convInfo.outShape,\n [convInfo.filterDepth, convInfo.filterHeight, convInfo.filterWidth],\n [convInfo.padInfo.front, convInfo.padInfo.top, convInfo.padInfo.left], format));\n};\n\nexport const conv = (context: ComputeContext, attributes: ConvAttributes): void => {\n validateInputs(context.inputs, attributes);\n if (context.inputs[0].dims.length === 3) {\n conv1d(context, attributes);\n } else if (context.inputs[0].dims.length === 5) {\n conv3d(context, context.inputs, attributes);\n } else {\n conv2d(context, context.inputs, attributes);\n }\n};\n", "/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/conv_backprop_mm_webgpu.ts\n//\n// modified to fit the needs of the project\n\nimport {DataType} from '../../../../wasm-common';\nimport {LOG_DEBUG} from '../../../log';\nimport {TensorView} from '../../../tensor-view';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {ConvTransposeAttributes} from '../conv-transpose';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet} from '../fuse-utils';\n\nimport {biasSnippet} from './activation_util';\nimport {utilFunctions} from './conv_util';\nimport {makeMatMulPackedSource, makeMatMulPackedVec4Source} from './matmul_packed_webgpu';\n\nconst conv2dTransposeCommonSnippet =\n (isChannelsLast: boolean, addBias = false, attributes: ConvTransposeAttributes, type: string,\n innerElementSize = 4): string => {\n const getWSnippet = (innerElementSize: number) => {\n switch (innerElementSize) {\n case 1:\n return 'return w[getIndexFromCoords4D(coord, vec4(uniforms.w_shape))];';\n case 4:\n return `\n let coord1 = vec4(coordX, coordY, col + 1, rowInner);\n let coord2 = vec4(coordX, coordY, col + 2, rowInner);\n let coord3 = vec4(coordX, coordY, col + 3, rowInner);\n let v0 = w[getIndexFromCoords4D(coord, vec4(uniforms.w_shape))];\n let v1 = w[getIndexFromCoords4D(coord1, vec4(uniforms.w_shape))];\n let v2 = w[getIndexFromCoords4D(coord2, vec4(uniforms.w_shape))];\n let v3 = w[getIndexFromCoords4D(coord3, vec4(uniforms.w_shape))];\n return ${type}(v0, v1, v2, v3);\n `;\n default:\n throw new Error(`innerElementSize ${innerElementSize} is not supported.`);\n }\n };\n const coordASnippet = isChannelsLast ? `\n let coord = vec4(batch, iXR, iXC, xCh);\n ` :\n `\n let coord = vec4(batch, xCh, iXR, iXC);\n `;\n\n const coordResSnippet = isChannelsLast ? `\n let coords = vec4(\n batch,\n row / outWidth,\n row % outWidth,\n col);\n ` :\n `\n let coords = vec4(\n batch,\n row,\n col / outWidth,\n col % outWidth);\n `;\n\n const xHeight = isChannelsLast ? 'i32(uniforms.x_shape[1])' : 'i32(uniforms.x_shape[2])';\n const xWidth = isChannelsLast ? 'i32(uniforms.x_shape[2])' : 'i32(uniforms.x_shape[3])';\n const row = isChannelsLast ? 'row' : 'col';\n const col = isChannelsLast ? 'col' : 'row';\n\n const readASnippet = `\n let inChannels = ${isChannelsLast ? 'i32(uniforms.x_shape[3])' : 'i32(uniforms.x_shape[1])'};\n let outWidth = ${isChannelsLast ? 'i32(uniforms.result_shape[2])' : 'i32(uniforms.result_shape[3])'};\n let outRow = ${row} / outWidth;\n let outCol = ${row} % outWidth;\n\n let WRow = ${col} / (uniforms.filter_dims[1] * inChannels);\n let WCol = ${col} / inChannels % uniforms.filter_dims[1];\n let xR = f32(outRow - uniforms.pads[0] + uniforms.dilations[0] * WRow) / f32(uniforms.strides[0]);\n let xC = f32(outCol - uniforms.pads[1] + uniforms.dilations[1] * WCol) / f32(uniforms.strides[1]);\n if (xR < 0.0 || xR >= f32(${xHeight}) || fract(xR) > 0.0) {\n return ${type}(0.0);\n }\n if (xC < 0.0 || xC >= f32(${xWidth}) || fract(xC) > 0.0) {\n return ${type}(0.0);\n }\n let iXR = i32(xR);\n let iXC = i32(xC);\n let xCh = ${col} % inChannels;\n ${coordASnippet}\n return x[getIndexFromCoords4D(coord, vec4(uniforms.x_shape))/${innerElementSize}];`;\n\n const sampleA = isChannelsLast ? `\n let col = colIn * ${innerElementSize};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) {\n ${readASnippet}\n }\n return ${type}(0.0);` :\n `\n let col = colIn * ${innerElementSize};\n if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) {\n ${readASnippet}\n }\n return ${type}(0.0);`;\n\n const sampleW = `\n let col = colIn * ${innerElementSize};\n let inChannels = ${isChannelsLast ? 'i32(uniforms.x_shape[3])' : 'i32(uniforms.x_shape[1])'};\n let coordX = uniforms.filter_dims[0] - 1 - row / (uniforms.filter_dims[1] * inChannels);\n let coordY = uniforms.filter_dims[1] - 1 - (row / inChannels) % uniforms.filter_dims[1];\n if (${\n isChannelsLast ? 'row < uniforms.dim_inner && col < uniforms.dim_b_outer' :\n 'row < uniforms.dim_inner && col < uniforms.dim_a_outer'} && coordX >= 0 && coordY >= 0) {\n let rowInner = row % inChannels;\n let coord = vec4(coordX, coordY, col, rowInner);\n ${getWSnippet(innerElementSize)}\n }\n return ${type}(0.0);\n `;\n\n const applyActivation = getActivationSnippet(attributes, type);\n const userCode = `\n fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${type} {\n ${isChannelsLast ? sampleA : sampleW}\n }\n\n fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${type} {\n ${isChannelsLast ? sampleW : sampleA}\n }\n\n fn mm_write(batch: i32, row : i32, colIn : i32, valueInput : ${type}) {\n let col = colIn * ${innerElementSize};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) {\n var value = valueInput;\n let outWidth = ${isChannelsLast ? 'i32(uniforms.result_shape[2])' : 'i32(uniforms.result_shape[3])'};\n ${coordResSnippet}\n ${biasSnippet(addBias)}\n ${applyActivation}\n result[getIndexFromCoords4D(coords, vec4(uniforms.result_shape))/${innerElementSize}] = value;\n }\n }`;\n return userCode;\n };\n\nexport const createConv2DTransposeMatMulProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvTransposeAttributes, outputShape: readonly number[],\n dimAOuter: number, dimBOuter: number, dimInner: number, hasBias: boolean,\n sequentialAccessByThreads: boolean): ProgramInfo => {\n const isChannelsLast = attributes.format === 'NHWC';\n const inChannels = isChannelsLast ? inputs[0].dims[3] : inputs[0].dims[1];\n const batchSize = outputShape[0];\n const outWidth = isChannelsLast ? outputShape[2] : outputShape[3];\n const outHeight = isChannelsLast ? outputShape[1] : outputShape[2];\n const outChannels = isChannelsLast ? outputShape[3] : outputShape[1];\n // TODO: enable vec4 for NCHW\n const isVec4 = isChannelsLast && (inChannels % 4 === 0 && inChannels % 3) && outChannels % 4 === 0;\n\n // TODO: fine tune size\n const dispatchX = isChannelsLast ? outChannels : outWidth * outHeight;\n const dispatchY = isChannelsLast ? outWidth * outHeight : outChannels;\n const workGroupSize: [number, number, number] = [8, 8, 1];\n const elementsPerThread = dimAOuter <= 8 ? [4, 1, 1] : [4, 4, 1];\n const dispatch = [\n Math.ceil(dispatchX / workGroupSize[0] / elementsPerThread[0]),\n Math.ceil(dispatchY / workGroupSize[1] / elementsPerThread[1]),\n Math.ceil(batchSize / workGroupSize[2] / elementsPerThread[2])\n ];\n\n LOG_DEBUG('verbose', () => `[conv_backprop_mm_webgpu] dispatch = ${dispatch}`);\n\n const innerElementSize = isVec4 ? 4 : 1;\n const tileInner = Math.max(workGroupSize[0] * innerElementSize, workGroupSize[1]);\n const components = isVec4 ? 4 : 1;\n const filterDims =\n [attributes.kernelShape[isChannelsLast ? 1 : 2], attributes.kernelShape[isChannelsLast ? 2 : 3]];\n const effectiveFilterDims = [\n filterDims[0] + (attributes.dilations[0] <= 1 ? 0 : (filterDims[0] - 1) * (attributes.dilations[0] - 1)),\n filterDims[1] + (attributes.dilations[1] <= 1 ? 0 : (filterDims[1] - 1) * (attributes.dilations[1] - 1))\n ];\n const pads = [\n effectiveFilterDims[0] - 1 - Math.floor((attributes.pads[0] + attributes.pads[2]) / 2),\n effectiveFilterDims[1] - 1 - Math.floor((attributes.pads[1] + attributes.pads[3]) / 2)\n ];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.int32, data: dimAOuter}, {type: DataType.int32, data: dimBOuter},\n {type: DataType.int32, data: dimInner}, {type: DataType.int32, data: attributes.strides},\n {type: DataType.int32, data: attributes.dilations}, {type: DataType.int32, data: filterDims},\n {type: DataType.int32, data: pads}\n ];\n appendActivationUniformsData(attributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(inputs[0].dims, inputs[1].dims));\n\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const x = inputVariable('x', inputs[0].dataType, inputs[0].dims.length, components);\n const w = inputVariable('w', inputs[1].dataType, inputs[1].dims.length, 1);\n const output = outputVariable('result', inputs[0].dataType, outputShape.length, components);\n const inputVariables = [x, w];\n\n let declareFunctions = '';\n if (hasBias) {\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, components);\n inputVariables.push(bias);\n declareFunctions += `\n fn getBiasByOutputCoords(coords : vec4) -> ${bias.type.value} {\n return bias[coords.${isChannelsLast ? 'w' : 'y'}${isVec4 ? '/ 4' : ''}];\n }`;\n }\n\n const uniforms: UniformsArrayType = [\n {name: 'dim_a_outer', type: 'i32'}, {name: 'dim_b_outer', type: 'i32'}, {name: 'dim_inner', type: 'i32'},\n {name: 'strides', type: 'i32', length: 2}, {name: 'dilations', type: 'i32', length: 2},\n {name: 'filter_dims', type: 'i32', length: filterDims.length},\n {name: 'pads', type: 'i32', length: pads.length}\n ];\n appendActivationUniforms(attributes, uniforms);\n const elemType = tensorTypeToWsglStorageType(inputs[0].dataType, 1);\n if (elemType !== 'f16' && elemType !== 'f32') {\n throw new Error(`elemType ${elemType} is not supported.`);\n }\n return `\n ${utilFunctions('uniforms.result_strides')}\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)};\n ${declareFunctions}\n ${conv2dTransposeCommonSnippet(isChannelsLast, hasBias, attributes, x.type.value, innerElementSize)}\n ${\n isVec4 ? makeMatMulPackedVec4Source(\n elementsPerThread, workGroupSize, elemType, undefined, !isChannelsLast, tileInner) :\n makeMatMulPackedSource(\n elementsPerThread, workGroupSize, elemType, undefined, !isChannelsLast, tileInner, false,\n undefined, sequentialAccessByThreads)}`;\n };\n\n return {\n name: 'Conv2DTransposeMatMul',\n shaderCache:\n {hint: `${attributes.cacheKey};${elementsPerThread};${workGroupSize};${isVec4}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n programUniforms\n }),\n getShaderSource\n };\n };\n", "/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/conv_backprop_webgpu.ts\n\nimport {DataType} from '../../../../wasm-common';\nimport {LOG_DEBUG} from '../../../log';\nimport {TensorView} from '../../../tensor-view';\nimport {ShapeUtil} from '../../../util';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {ConvTransposeAttributes} from '../conv-transpose';\n\nconst createConvTranspose2DOpProgramShaderSource =\n (shaderHelper: ShaderHelper, inputs: readonly TensorView[], outputShape: readonly number[], hasBias: boolean,\n is1DimensionDispatch: boolean, isVec4 = false, dataType: string, uniforms: UniformsArrayType,\n isChannelsLast = false): string => {\n const rowDim = isChannelsLast ? 1 : 2;\n const colDim = isChannelsLast ? 2 : 3;\n const channelDim = isChannelsLast ? 3 : 1;\n const workPerThread = isVec4 ? 2 : 1;\n\n let declareFunctions = `\n fn setOutputAtIndex(flatIndex : u32, value : ${isVec4 ? `vec4<${dataType}>` : dataType}) {\n result[flatIndex] = ${isVec4 ? `vec4<${dataType}>` : dataType}(value);\n }`;\n if (hasBias) {\n declareFunctions += `\n fn getBiasByOutputCoords(coords : vec4) -> ${isVec4 ? `vec4<${dataType}>` : dataType} {\n return bias[coords.${isChannelsLast ? 'w' : 'y'}${isVec4 ? '/ 4' : ''}];\n }`;\n }\n const components = isVec4 ? 4 : 1;\n const w = inputVariable('W', inputs[1].dataType, inputs[1].dims.length, components);\n const dy = inputVariable('Dy', inputs[0].dataType, inputs[0].dims.length, components);\n const inputVariables = [dy, w];\n if (hasBias) {\n inputVariables.push(inputVariable('bias', inputs[2].dataType, [outputShape[channelDim]].length, components));\n }\n const output = outputVariable('result', inputs[0].dataType, outputShape.length, components);\n\n const codeSnippet4 = `{\n let batch: u32 = ${is1DimensionDispatch ? 'global_id.z' : 'workgroup_id.z'} / uniforms.result_shape[1];\n let r = ${is1DimensionDispatch ? 'global_id.z' : 'workgroup_id.z'} % uniforms.result_shape[1];\n let c = ${is1DimensionDispatch ? 'global_id.y' : 'workgroup_id.y'} * ${workPerThread};\n let d1: u32 = ${is1DimensionDispatch ? 'global_id.x' : 'workgroup_id.x'} * 4;\n\n let dyCorner = vec2(i32(r), i32(c)) - vec2(uniforms.pads);\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n var dotProd: array, ${workPerThread}>;\n for (var i = 0; i < ${workPerThread}; i++) {\n dotProd[i] = vec4<${dataType}>(0.0);\n }\n for (var wR: u32 = 0; wR < uniforms.filter_dims[0]; wR = wR + 1) {\n var dyR = (${dataType}(dyCorner.x) + ${dataType}(wR)) / ${dataType}(uniforms.strides.x);\n let wRPerm = uniforms.filter_dims[0] - 1 - wR;\n if (dyR < 0.0 || dyR >= ${dataType}(uniforms.Dy_shape[1]) ||\n fract(dyR) > 0.0 || wRPerm < 0) {\n continue;\n }\n let idyR: u32 = u32(dyR);\n\n for (var wC: u32 = 0; wC < uniforms.filter_dims[1]; wC = wC + 1) {\n let dyC = (${dataType}(dyCorner.y) + ${dataType}(wC)) / ${dataType}(uniforms.strides.y);\n let dyC2 = (${dataType}(dyCorner.y) + 1.0 + ${dataType}(wC)) / ${dataType}(uniforms.strides.y);\n let wCPerm = uniforms.filter_dims[1] - 1 - wC;\n if (wCPerm < 0) {\n continue;\n }\n var bDyCVal = true;\n var bDyCVal2 = true;\n if (dyC < 0.0 || dyC >= ${dataType}(uniforms.Dy_shape[2]) ||\n fract(dyC) > 0.0) {\n bDyCVal = false;\n }\n if (dyC2 < 0.0 || dyC2 >= ${dataType}(uniforms.Dy_shape[2]) ||\n fract(dyC2) > 0.0) {\n bDyCVal2 = false;\n }\n\n let idyC: u32 = u32(dyC);\n let idyC2: u32 = u32(dyC2);\n if (bDyCVal && bDyCVal2) {\n let d2Length = uniforms.Dy_shape[3];\n for (var d2 :u32 = 0; d2 < d2Length; d2 = d2 + 4) {\n let wValue0 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1', 'd2')};\n let wValue1 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 1', 'd2')};\n let wValue2 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 2', 'd2')};\n let wValue3 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 3', 'd2')};\n\n var xValue = ${dy.get('batch', 'idyR', 'idyC', 'd2')};\n let tmpval = vec4<${dataType}>(dot(xValue, wValue0),\n dot(xValue, wValue1),\n dot(xValue, wValue2),\n dot(xValue, wValue3));\n dotProd[0] = dotProd[0] + tmpval;\n\n xValue = ${dy.get('batch', 'idyR', 'idyC2', 'd2')};\n\n dotProd[1] = dotProd[1] + vec4<${dataType}>(dot(xValue, wValue0),\n dot(xValue, wValue1),\n dot(xValue, wValue2),\n dot(xValue, wValue3));\n }\n } else if (bDyCVal) {\n let d2Length = uniforms.Dy_shape[${channelDim}];\n for (var d2: u32 = 0; d2 < d2Length; d2 = d2 + 4) {\n let wValue0 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1', 'd2')};\n let wValue1 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 1', 'd2')};\n let wValue2 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 2', 'd2')};\n let wValue3 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 3', 'd2')};\n\n var xValue = ${dy.get('batch', 'idyR', 'idyC', 'd2')};\n let tmpval = vec4<${dataType}>(dot(xValue, wValue0),\n dot(xValue, wValue1),\n dot(xValue, wValue2),\n dot(xValue, wValue3));\n dotProd[0] = dotProd[0] + tmpval;\n }\n } else if (bDyCVal2) {\n let d2Length = uniforms.Dy_shape[3];\n for (var d2: u32 = 0; d2 < d2Length; d2 = d2 + 4) {\n let wValue0 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1', 'd2')};\n let wValue1 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 1', 'd2')};\n let wValue2 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 2', 'd2')};\n let wValue3 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 3', 'd2')};\n\n var xValue = ${dy.get('batch', 'idyR', 'idyC2', 'd2')};\n let tmpval = vec4<${dataType}>(dot(xValue, wValue0),\n dot(xValue, wValue1),\n dot(xValue, wValue2),\n dot(xValue, wValue3));\n dotProd[1] = dotProd[1] + tmpval;\n }\n }\n }\n }\n\n for (var i: u32 = 0; i < ${workPerThread}; i = i + 1) {\n let value = dotProd[i] + ${hasBias ? 'bias[c+i]' : `vec4<${dataType}>(0.0)`};\n ${output.set('batch', 'r', 'c + i', 'd1', 'value')};\n }\n }`;\n const codeSnippet = `\n let outputIndices = ${output.offsetToIndices('global_idx')};\n let batch = ${output.indicesGet('outputIndices', 0)};\n let d1 = ${output.indicesGet('outputIndices', channelDim)};\n let r = ${output.indicesGet('outputIndices', rowDim)};\n let c = ${output.indicesGet('outputIndices', colDim)};\n let dyCorner = vec2(i32(r), i32(c)) - uniforms.pads;\n let dyRCorner = dyCorner.x;\n let dyCCorner = dyCorner.y;\n let groupId = d1 / uniforms.output_channels_per_group;\n let wOutChannel = d1 - groupId * uniforms.output_channels_per_group;\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n var dotProd = ${dataType}(0.0);\n for (var wR: u32 = 0; wR < uniforms.effective_filter_dims.x; wR = wR + 1) {\n if (wR % uniforms.dilations.x != 0) {\n continue;\n }\n let dyR = (${dataType}(dyRCorner) + ${dataType}(wR)) / ${dataType}(uniforms.strides[0]);\n let wRPerm = uniforms.filter_dims.x - 1 - wR / uniforms.dilations.x;\n if (dyR < 0.0 || dyR >= ${dataType}(uniforms.Dy_shape[${rowDim}]) || fract(dyR) > 0.0 ||\n wRPerm < 0) {\n continue;\n }\n let idyR: u32 = u32(dyR);\n\n for (var wC: u32 = 0; wC < uniforms.effective_filter_dims.y; wC = wC + 1) {\n if (wC % uniforms.dilations.y != 0) {\n continue;\n }\n let dyC = (${dataType}(dyCCorner) + ${dataType}(wC)) / ${dataType}(uniforms.strides.y);\n let wCPerm = uniforms.filter_dims.y - 1 - wC / uniforms.dilations.y;\n if (dyC < 0.0 || dyC >= ${dataType}(uniforms.Dy_shape[${colDim}]) ||\n fract(dyC) > 0.0 || wCPerm < 0) {\n continue;\n }\n let idyC: u32 = u32(dyC);\n var inputChannel = groupId * uniforms.input_channels_per_group;\n for (var d2: u32 = 0; d2 < uniforms.input_channels_per_group; d2 = d2 + 1) {\n let xValue = ${\n isChannelsLast ? dy.get('batch', 'idyR', 'idyC', 'inputChannel') :\n dy.get('batch', 'inputChannel', 'idyR', 'idyC')};\n let wValue = ${w.get('inputChannel', 'wOutChannel', 'u32(wRPerm)', 'u32(wCPerm)')};\n dotProd = dotProd + xValue * wValue;\n inputChannel = inputChannel + 1;\n }\n }\n }\n let value = dotProd + ${hasBias ? 'bias[d1]' : `${dataType}(0.0)`};\n ${output.setByOffset('global_idx', 'value')};\n `;\n\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)}\n ${declareFunctions}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')};\n ${isVec4 ? codeSnippet4 : codeSnippet}}`;\n };\n\nexport const createConvTranspose2DProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvTransposeAttributes,\n squeezeOutputShapeFunction?: (shape: readonly number[]) => number[]): ProgramInfo => {\n const hasBias = inputs.length > 2;\n // const isChannelsLast = attributes.format === 'NHWC';\n const outputShape = attributes.outputShape;\n const outputSize = ShapeUtil.size(outputShape);\n\n // const inChannels = inputs[0].dims[isChannelsLast ? 3 : 1];\n // TODO Enable isVec4 for performance\n // Disabled due to weight matrix layout issue\n // const isVec4 = attributes.group === 1 && isChannelsLast && inChannels % 4 === 0 && outChannels % 4 === 0;\n const dispatch = [\n Math.ceil(outputSize / 64),\n 1,\n 1,\n ];\n LOG_DEBUG('verbose', () => `[conv2d_backprop_webgpu] dispatch = ${dispatch}`);\n\n const isChannelsLast = attributes.format === 'NHWC';\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n const strides = [attributes.strides[0], attributes.strides[1]];\n const filterDims =\n [attributes.kernelShape[isChannelsLast ? 1 : 2], attributes.kernelShape[isChannelsLast ? 2 : 3]];\n const dilations = [attributes.dilations[0], attributes.dilations[1]];\n const effectiveFilterDims = [\n filterDims[0] +\n (attributes.dilations[0] <= 1 ?\n 0 :\n (attributes.kernelShape[isChannelsLast ? 1 : 2] - 1) * (attributes.dilations[0] - 1)),\n filterDims[1] +\n (attributes.dilations[1] <= 1 ?\n 0 :\n (attributes.kernelShape[isChannelsLast ? 2 : 3] - 1) * (attributes.dilations[1] - 1))\n ];\n const pads = [\n effectiveFilterDims[0] - 1 - Math.floor((attributes.pads[0] + attributes.pads[2]) / 2),\n effectiveFilterDims[1] - 1 - Math.floor(attributes.pads[1] + attributes.pads[3]) / 2\n ];\n\n const isVec4 = false;\n const group = attributes.group;\n const wShape = inputs[1].dims;\n const inputChannelsPerGroup = wShape[0] / group;\n const outputChannelsPerGroup = wShape[1];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: strides},\n {type: DataType.uint32, data: filterDims}, {type: DataType.uint32, data: dilations},\n {type: DataType.uint32, data: effectiveFilterDims}, {type: DataType.int32, data: pads},\n {type: DataType.uint32, data: inputChannelsPerGroup}, {type: DataType.uint32, data: outputChannelsPerGroup},\n ...createTensorShapeVariables(inputs[0].dims, inputs[1].dims)\n ];\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const is1DimensionDispatch = dispatch[1] === 1 && dispatch[2] === 1;\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'strides', type: 'u32', length: strides.length},\n {name: 'filter_dims', type: 'u32', length: filterDims.length},\n {name: 'dilations', type: 'u32', length: filterDims.length},\n {name: 'effective_filter_dims', type: 'u32', length: effectiveFilterDims.length},\n {name: 'pads', type: 'i32', length: pads.length}, {name: 'input_channels_per_group', type: 'u32'},\n {name: 'output_channels_per_group', type: 'u32'}\n ];\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n return `${\n createConvTranspose2DOpProgramShaderSource(\n shaderHelper, inputs, outputShape, hasBias, is1DimensionDispatch, isVec4, dataType, uniforms,\n isChannelsLast)}`;\n };\n return {\n name: 'ConvTranspose2D',\n shaderCache: {hint: `${attributes.cacheKey};`, inputDependencies},\n getRunData: () => ({\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n outputs: [{\n dims: squeezeOutputShapeFunction ? squeezeOutputShapeFunction(outputShape) : outputShape,\n dataType: inputs[0].dataType\n }],\n programUniforms\n }),\n getShaderSource\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorView} from '../../tensor-view';\nimport {ComputeContext} from '../types';\n\nimport {createConv2DTransposeMatMulProgramInfo} from './3rd-party/conv_backprop_mm_webgpu';\nimport {createConvTranspose2DProgramInfo} from './3rd-party/conv_backprop_webgpu';\nimport {ConvAttributes} from './conv';\nimport {parseInternalActivationAttributes} from './fuse-utils';\nimport {createTransposeProgramInfo} from './transpose';\n\nconst computeTotalPad =\n (inDim: number, stride: number, adj: number, kernel: number, dilation: number, outSize: number) =>\n (inDim - 1) * stride + adj + (kernel - 1) * dilation + 1 - outSize;\n\nconst distributePadding = (totalPad: number, autoPad: string, pads: number[], head: number, tail: number) => {\n const smallPad = Math.floor(totalPad / 2);\n if (autoPad === 'SAME_UPPER') {\n pads[head] = smallPad;\n pads[tail] = totalPad - smallPad;\n } else if (autoPad === 'SAME_LOWER') {\n pads[head] = totalPad - smallPad;\n pads[tail] = smallPad;\n }\n};\n\nconst calculateOutputShapeAndPads =\n (inputShape: readonly number[], kernelShape: readonly number[], dilations: readonly number[], autoPad: string,\n group: number, pads: number[], strides: readonly number[], isChannelLast: boolean, outputPadding: number[],\n outputShape: number[]) => {\n const spatialRank = inputShape.length - 2;\n const updateOutputShape = outputShape.length === 0;\n if (outputPadding.length === 0) {\n for (let i = 0; i < spatialRank; ++i) {\n outputPadding.push(0);\n }\n }\n const batchSize = inputShape[0];\n const outChannels = kernelShape[isChannelLast ? 3 : 1] * group;\n for (let i = 0, j = inputShape.length - spatialRank - (isChannelLast ? 1 : 0); i < spatialRank; ++i, ++j) {\n const inSize = inputShape[j];\n const outSize = updateOutputShape ? inSize * strides[i] : outputShape[i];\n const totalPad = computeTotalPad(inSize, strides[i], pads[i], kernelShape[j], dilations[i], outSize);\n distributePadding(totalPad, autoPad, pads, i, i + spatialRank);\n if (updateOutputShape) {\n outputShape.push(\n strides[i] * (inSize - 1) + outputPadding[i] + (kernelShape[j] - 1) * dilations[i] + 1 - pads[i] -\n pads[i + spatialRank]);\n }\n }\n outputShape.splice(0, 0, batchSize);\n outputShape.splice(isChannelLast ? 3 : 1, 0, outChannels);\n };\n\nexport interface ConvTransposeAttributes extends ConvAttributes {\n readonly outputPadding: readonly number[];\n readonly outputShape: readonly number[];\n}\n\nconst getAdjustedConvTransposeAttributes =\n (attributes: T, inputs: readonly TensorView[]): T => {\n const kernelShape = attributes.kernelShape.slice();\n // if kernelShape is not specified in the attributes of this op, infer it from the weight tensor dims\n if (attributes.kernelShape.length === 0 || attributes.kernelShape.reduce((a, b) => a * b, 1) === 0) {\n kernelShape.length = 0;\n for (let i = 2; i < inputs[1].dims.length; ++i) {\n kernelShape.push(inputs[1].dims[i]);\n }\n }\n const isChannelsLast = attributes.format === 'NHWC';\n kernelShape.splice(0, 0, inputs[1].dims[0]);\n kernelShape.splice(isChannelsLast ? 3 : 1, 0, inputs[1].dims[1]);\n\n const pads = attributes.pads.slice();\n const outputShape = attributes.outputShape.slice();\n const outputPadding = attributes.outputPadding.slice();\n const inputShape = inputs[0].dims;\n let dilations = attributes.dilations.slice();\n if (dilations.reduce((a, b) => a + b, 0) === 0) {\n const spatialRank = inputs[0].dims.length - 2;\n dilations = new Array(spatialRank).fill(1);\n }\n let strides = attributes.strides.slice();\n if (strides.reduce((a, b) => a + b, 0) === 0) {\n const spatialRank = inputs[0].dims.length - 2;\n strides = new Array(spatialRank).fill(1);\n }\n // If outputShape is not specified in the attributes of this op, infer it from the parameters\n // Similarly, automatically infer pads if not specified\n calculateOutputShapeAndPads(\n inputShape, kernelShape, dilations, attributes.autoPad, attributes.group, pads, strides, isChannelsLast,\n outputPadding, outputShape);\n\n // always return a new object so does not modify the original attributes\n const newAttributes: T = Object.assign({}, attributes);\n Object.assign(newAttributes, {kernelShape, pads, outputPadding, outputShape, dilations, strides});\n return newAttributes;\n };\n\nexport const parseConvTransposeAttributes = (attributes: Record): ConvTransposeAttributes => {\n const activationAttributes = parseInternalActivationAttributes(attributes);\n // TODO : Make this generic enough to compute default attributes for multi-dimensional conv\n const format = attributes.format as 'NHWC' | 'NCHW';\n const autoPad =\n ['NOTSET', 'VALID', 'SAME_UPPER',\n 'SAME_LOWER'][typeof attributes.autoPad == 'undefined' ? 0 : attributes.autoPad as number];\n const dilations = attributes.dilations as [number, number];\n const group = attributes.group as number;\n const kernelShape = attributes.kernelShape as [number, number];\n const pads = attributes.pads as [number, number, number, number];\n const strides = attributes.strides as [number, number];\n const wIsConst = (attributes.wIsConst as () => boolean)();\n const outputPadding = attributes.outputPadding as [number, number, number, number];\n const outputShape = attributes.outputShape as [number, number];\n return {\n autoPad,\n format,\n dilations,\n group,\n kernelShape,\n outputPadding,\n outputShape,\n pads,\n strides,\n wIsConst,\n ...activationAttributes,\n cacheKey: `${attributes.format};${activationAttributes.activation};`\n };\n};\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: ConvTransposeAttributes): void => {\n // Refer to the below link for all input checks\n // https://github.com/onnx/onnx/blob/main/docs/Operators.md#ConvTranspose\n if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n throw new Error('Conv requires 2 or 3 inputs');\n }\n\n // TODO : Need to add support for multi-dimensional conv\n if (inputs[0].dims.length !== 4 && inputs[0].dims.length !== 3) {\n throw new Error('currently only support 2-dimensional conv');\n }\n\n if (inputs[0].dims.length !== inputs[1].dims.length) {\n throw new Error('filter does not have same dimension as input');\n }\n\n // FILTER_IN_CHANNEL should be equal to DATA_CHANNEL\n const dataChannel = inputs[0].dims[attributes.format === 'NHWC' ? inputs[0].dims.length - 1 : 1];\n const filterInChannel = inputs[1].dims[0];\n if (dataChannel !== filterInChannel) {\n throw new Error('FILTER_IN_CHANNEL should be equal to DATA_CHANNEL');\n }\n\n const featureMaps = inputs[1].dims[1] * attributes.group;\n\n // if bias is provided it should be 1D and the number of elements should be equal to the number of feature maps\n if (inputs.length === 3 && (inputs[2].dims.length !== 1 || inputs[2].dims[0] !== featureMaps)) {\n throw new Error('invalid bias');\n }\n\n const spatialRank = inputs[0].dims.length - 2;\n const dilationsSet = attributes.dilations.reduce((a, b) => a + b, 0) > 0;\n // wrong dilations dimension\n if (dilationsSet && attributes.dilations.length !== spatialRank) {\n throw new Error(`dilations should be ${spatialRank}D`);\n }\n\n const stridesSet = attributes.strides.reduce((a, b) => a + b, 0) > 0;\n // Wrong strides dimension\n if (stridesSet && attributes.strides.length !== spatialRank) {\n throw new Error(`strides should be ${spatialRank}D`);\n }\n\n // Wrong pads dimension\n const padsSet = attributes.pads.reduce((a, b) => a + b, 0) > 0;\n if (padsSet && attributes.pads.length !== spatialRank * 2) {\n throw new Error(`pads should be ${spatialRank * 2}D`);\n }\n\n // Wrong output padding dimension\n if (attributes.outputPadding.length !== spatialRank && attributes.outputPadding.length !== 0) {\n throw new Error(`output_padding should be ${spatialRank}D`);\n }\n\n // if kernelShape is specified, it's data length must be 2 less than dims length of the weights tensor\n // (the first 2 dims are batch_size and channels)\n const kernelShapeSet = attributes.kernelShape.reduce((a, b) => a + b, 0) > 0;\n if (kernelShapeSet && attributes.kernelShape.length !== 0 &&\n attributes.kernelShape.length !== inputs[1].dims.length - 2) {\n throw new Error('invalid kernel shape');\n }\n\n // as with kernelShape, must have same number of spatial dims as input\n if (attributes.outputShape.length !== 0 && attributes.outputShape.length !== inputs[0].dims.length - 2) {\n throw new Error('invalid output shape');\n }\n};\n\n// for transposing weight tensor from [C, M/group, KH, KW] to [KH, KW, M/group, C]\nconst weightTransposePerm = [2, 3, 1, 0];\n\nconst convTranspose2d =\n (context: ComputeContext, inputs: readonly TensorView[], attributes: ConvTransposeAttributes): void => {\n const adjustedAttributes = getAdjustedConvTransposeAttributes(attributes, inputs);\n const isChannelsLast = attributes.format === 'NHWC';\n const outputShape = adjustedAttributes.outputShape;\n const outChannels = outputShape[isChannelsLast ? 3 : 1];\n const inputChannels = inputs[0].dims[isChannelsLast ? 3 : 1];\n // Switch to naive method when outChannels and inputChannels are very small. It's because that in this case it's\n // not suitable for matmul version since matmul uses tile size 32x32 resulting the underlying execution unit\n // utilization rate is very low.\n if (adjustedAttributes.group !== 1 || (outChannels === 1 && inputChannels === 1)) {\n context.compute(createConvTranspose2DProgramInfo(inputs, adjustedAttributes));\n return;\n }\n const outHeight = outputShape[isChannelsLast ? 1 : 2];\n const outWidth = outputShape[isChannelsLast ? 2 : 3];\n const weightHeight = inputs[1].dims[2];\n const weightWidth = inputs[1].dims[3];\n\n const dimAOuter = isChannelsLast ? outHeight * outWidth : outChannels;\n const dimBOuter = isChannelsLast ? outChannels : outHeight * outWidth;\n const dimInner = weightHeight * weightWidth * inputChannels;\n\n const sequentialAccessByThreads = /* backend.adapterInfo.isIntel() */ true;\n\n\n // STEP.1: transpose weight\n const transposedWeight = (context.kernelCustomData.wT as TensorView | undefined) ??\n context.compute(\n createTransposeProgramInfo(inputs[1], weightTransposePerm),\n {inputs: [1], outputs: [attributes.wIsConst ? -2 : -1]})[0];\n if (attributes.wIsConst && !context.kernelCustomData.wT) {\n context.kernelCustomData.wT = transposedWeight;\n }\n\n // STEP.2: prepare reshaped inputs\n const convTransposeInputs = [inputs[0], transposedWeight];\n const hasBias = inputs.length === 3;\n if (hasBias) {\n if (!isChannelsLast && inputs[2].dims.length === 1) {\n convTransposeInputs.push(inputs[2].reshape([inputs[2].dims[0], 1, 1]));\n } else {\n convTransposeInputs.push(inputs[2]);\n }\n }\n\n // STEP.3: compute matmul\n context.compute(\n createConv2DTransposeMatMulProgramInfo(\n convTransposeInputs, adjustedAttributes, outputShape, dimAOuter, dimBOuter, dimInner, hasBias,\n sequentialAccessByThreads),\n {inputs: convTransposeInputs});\n };\n\nconst convTranspose1d = (context: ComputeContext, attributes: ConvTransposeAttributes): void => {\n // extend the input to 2D by adding H dimension\n const isChannelLast = attributes.format === 'NHWC';\n\n const inputs = [\n context.inputs[0].reshape(\n isChannelLast ?\n // [N, W, C] -> [N, H=1, W, C]\n [context.inputs[0].dims[0], 1, context.inputs[0].dims[1], context.inputs[0].dims[2]] :\n // [N, C, W] -> [N, C, H=1, W]\n [context.inputs[0].dims[0], context.inputs[0].dims[1], 1, context.inputs[0].dims[2]]),\n //[FILTER_OUT_CHANNEL, FILTER_IN_CHANNEL, kW] -> [FILTER_OUT_CHANNEL, FILTER_IN_CHANNEL, kH=1, kW]\n context.inputs[1].reshape([context.inputs[1].dims[0], context.inputs[1].dims[1], 1, context.inputs[1].dims[2]])\n ];\n if (context.inputs.length === 3) {\n inputs.push(context.inputs[2]);\n }\n let kernelShape = attributes.kernelShape;\n if (kernelShape.length === 0 || kernelShape[0] === 0) {\n kernelShape = [context.inputs[1].dims[2]];\n }\n let dilations = attributes.dilations;\n if (dilations.length === 0 || dilations[0] === 0) {\n dilations = [1];\n }\n let strides = attributes.strides;\n if (strides.length === 0 || strides[0] === 0) {\n strides = [1];\n }\n let pads = attributes.pads;\n if (pads.length === 0) {\n pads = [0, 0];\n }\n pads = [0, pads[0], 0, pads[1]];\n strides = [1].concat(strides);\n dilations = [1].concat(dilations);\n kernelShape = [1].concat(kernelShape);\n const adjustedAttributes =\n getAdjustedConvTransposeAttributes({...attributes, pads, strides, dilations, kernelShape}, inputs);\n context.compute(createConvTranspose2DProgramInfo(\n inputs, adjustedAttributes,\n outputShape => isChannelLast ? [outputShape[0], outputShape[2], outputShape[3]] :\n [outputShape[0], outputShape[1], outputShape[3]]));\n};\n\nexport const convTranspose = (context: ComputeContext, attributes: ConvTransposeAttributes): void => {\n validateInputs(context.inputs, attributes);\n if (context.inputs[0].dims.length === 3) {\n convTranspose1d(context, attributes);\n } else {\n convTranspose2d(context, context.inputs, attributes);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, inputVariable, outputVariable, ShaderHelper} from './common';\n\n\nexport interface CumSumAttributes extends AttributeWithCacheKey {\n readonly exclusive: boolean;\n readonly reverse: boolean;\n}\nconst createCumsumProgramInfo =\n (inputType: number, inputShape: readonly number[], axisInput: TensorView, attributes: CumSumAttributes):\n ProgramInfo => {\n const outputSize = ShapeUtil.size(inputShape); // outputShape is same as inputShape.\n const rank = inputShape.length; // input/output rank\n const input = inputVariable('input', inputType, rank);\n const output = outputVariable('output', inputType, rank);\n const axisValue = axisInput.dataType === DataType.int32 ? axisInput.getInt32Array()[0] :\n Number(axisInput.getBigInt64Array()[0]);\n const axis = ShapeUtil.normalizeAxis(axisValue, rank);\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const index = ` i32(${input.indicesGet('inputIndices', 'uniforms.axis')}) `;\n const max = getElementAt('uniforms.input_shape', 'uniforms.axis', rank);\n const lowerLimit = attributes.reverse ? index + (attributes.exclusive ? ' + 1' : '') : '0';\n const upperLimit = attributes.reverse ? max : index + (attributes.exclusive ? '' : ' + 1');\n return `\n ${\n shaderHelper.registerUniform('outputSize', 'u32')\n .registerUniform('axis', 'u32')\n .declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n var inputIndices = ${output.offsetToIndices('global_idx')};\n var sum = ${output.type.value}(0);\n let first : i32 = ${lowerLimit};\n let last : i32 = ${upperLimit};\n for (var i : i32 = first; i < last; i++) {\n ${input.indicesSet('inputIndices', 'uniforms.axis', 'u32(i)')};\n sum = sum + ${input.getByIndices('inputIndices')};\n }\n ${output.setByOffset('global_idx', 'sum')};\n }`;\n };\n return {\n name: 'CumSum',\n shaderCache: {hint: attributes.cacheKey, inputDependencies: ['rank']},\n getRunData: () => ({\n outputs: [{dims: inputShape, dataType: inputType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms: [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: axis},\n ...createTensorShapeVariables(inputShape, inputShape)\n ]\n\n }),\n getShaderSource\n };\n };\n\n\nexport const cumsum = (context: ComputeContext, attributes: CumSumAttributes): void => {\n const inputShape = context.inputs[0].dims;\n const inputType = context.inputs[0].dataType;\n const axis = context.inputs[1];\n context.compute(createCumsumProgramInfo(inputType, inputShape, axis, attributes), {inputs: [0]});\n};\n\nexport const parseCumSumAttributes = (attributes: Record): CumSumAttributes => {\n const exclusive = attributes.exclusive as number === 1;\n const reverse = attributes.reverse as number === 1;\n return createAttributeWithCacheKey({exclusive, reverse});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface FormatAttributes {\n readonly format: 'NHWC'|'NCHW';\n}\n\nexport interface DepthToSpaceAttributes extends FormatAttributes, AttributeWithCacheKey {\n readonly blocksize: number;\n readonly mode: string;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('DepthToSpace requires 1 input.');\n }\n if (inputs[0].dims.length !== 4) {\n throw new Error('DepthToSpace requires 4D input.');\n }\n};\n\nconst permFunctionBody = (perm: number[], rank: number, input: IndicesHelper, output: IndicesHelper): string => {\n const reverseFunc = [];\n reverseFunc.push(`fn perm(i: ${output.type.indices}) -> ${input.type.indices} {\n var a: ${input.type.indices};`);\n for (let i = 0; i < rank; ++i) {\n reverseFunc.push(input.indicesSet('a', perm[i], `i[${i}]`));\n }\n reverseFunc.push('return a;}');\n return reverseFunc.join('\\n');\n};\n\nconst createDepthToSpaceProgramInfo = (inputTensor: TensorView, attributes: DepthToSpaceAttributes): ProgramInfo => {\n let n: number, h: number, w: number, c: number;\n let shape: number[];\n let perm: number[];\n const isChannelLast = attributes.format === 'NHWC';\n const blocksize = attributes.blocksize;\n const isDCRmode = attributes.mode === 'DCR';\n if (isChannelLast) {\n [n, h, w, c] = inputTensor.dims;\n shape = isDCRmode ? [n, h, w, blocksize, blocksize, c / (blocksize ** 2)] :\n [n, h, w, c / (blocksize ** 2), blocksize, blocksize];\n perm = isDCRmode ? [0, 1, 3, 2, 4, 5] : [0, 1, 4, 2, 5, 3];\n } else {\n [n, h, w, c] = [inputTensor.dims[0], inputTensor.dims[2], inputTensor.dims[3], inputTensor.dims[1]];\n shape = isDCRmode ? [n, blocksize, blocksize, c / (blocksize ** 2), h, w] :\n [n, c / (blocksize ** 2), blocksize, blocksize, h, w];\n perm = isDCRmode ? [0, 3, 4, 1, 5, 2] : [0, 1, 4, 2, 5, 3];\n }\n const reshapedInputTensor = inputTensor.reshape(shape);\n const reshapedInputRank = reshapedInputTensor.dims.length;\n const inputDataType = inputTensor.dataType;\n\n const reshapedInput = inputVariable('a', inputDataType, reshapedInputRank);\n const permedOutput = outputVariable('output', inputDataType, reshapedInputRank);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(reshapedInput, permedOutput)}\n\n ${permFunctionBody(perm, reshapedInputRank, reshapedInput, permedOutput)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let indices = ${permedOutput.offsetToIndices('global_idx')};\n let aIndices = perm(indices);\n\n ${permedOutput.setByOffset('global_idx', reshapedInput.getByIndices('aIndices'))}\n }`;\n\n return {\n name: 'DepthToSpace',\n shaderCache: {hint: `${inputTensor.dims};${attributes.blocksize};${attributes.mode}`, inputDependencies: ['rank']},\n getRunData: (inputs) => {\n const outputShape = isChannelLast ? [n, h * blocksize, w * blocksize, c / (blocksize ** 2)] :\n [n, c / (blocksize ** 2), h * blocksize, w * blocksize];\n const outputSize = ShapeUtil.size(outputShape);\n const shapeBeforePerm = reshapedInputTensor.dims;\n const shapeAfterPerm = ShapeUtil.sortBasedOnPerm(shapeBeforePerm, perm);\n return {\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms:\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(shapeBeforePerm, shapeAfterPerm)],\n };\n },\n getShaderSource,\n };\n};\n\nexport const depthToSpace = (context: ComputeContext, attributes: DepthToSpaceAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createDepthToSpaceProgramInfo(context.inputs[0], attributes));\n};\n\nexport const parseDepthToSpaceAttributes = (attributes: Record): DepthToSpaceAttributes =>\n createAttributeWithCacheKey({\n blocksize: attributes.blocksize as number,\n mode: attributes.mode as string,\n format: attributes.format as 'NHWC' | 'NCHW'\n });\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface EinsumAttributes extends AttributeWithCacheKey {\n readonly equation: string;\n}\n// The equation attribute value is a string which consists of left hand side (LHS) and optionally right hand side (RHS)\n// separated by '->'. Ex. \"ij,jk -> ik\" expresses matrix multiplication\n// \"ij->ji\" expresses matrix transpose\n// \"ii->i\" diagonal elements of a square matrix\n// LHS consists of a sequence of terms separated by commas. Each term corresponds to an input variable.\n// Each symbol corresponds to a dimension in the input variable. The symbol can be either a letter, 'a' to 'z' or 'A' to\n// 'Z' or '...' to represent arbitrary dimensions.\n\nconst symbolPattern =\n '[a-zA-Z]|\\\\.\\\\.\\\\.'; // The pattern each symbol in each term in the symbolic equation should match\nconst termPattern = '(' + symbolPattern + ')+'; // The pattern each term in the symbolic equation should match\nconst termPatternOnly = '^' + termPattern + '$'; // The patterns only matchs a term begin to end.\nconst lhsPattern = '(' + termPattern + ',)*' + termPattern; // The pattern the LHS should match\nconst lhsPatternOnly = '^' + lhsPattern + '$'; // The patterns only matchs a LHS begin to end.\n\ninterface SymbolInfo {\n count: number; // Symbol corresponding to a dimmension of an input\n inputIndices: number[]; // Number of input variables the symbol corresponds to\n dimValue: number; // Number of dimensions the symbol corresponds to\n}\n\nclass EinsumTerm {\n constructor(inputIndex = -1) {\n this.symbolToIndices = new Map();\n this.inputIndex = inputIndex;\n }\n\n // Add a symbol to the term\n addSymbol(symbol: string, index: number) {\n let value = this.symbolToIndices.get(symbol);\n if (value === undefined) {\n value = [index];\n } else {\n value.push(index);\n }\n this.symbolToIndices.set(symbol, value);\n }\n\n symbolToIndices: Map; // Map from symbol to dimensions of the input corresponding to the term\n inputIndex: number; // -1 for output and 0, 1, 2, ... for inputs\n}\n\nclass EinsumEquation {\n constructor(inputs: readonly TensorView[], public readonly equation: string) {\n this.hasEllipsis = false;\n this.symbolToInfo = new Map();\n this.lhs = new Array();\n this.outputDims = [];\n // As rhs needs to be updated allow using let instead of const for both lhs and rhs.\n // eslint-disable-next-line prefer-const\n let [lhs, rhs] = equation.includes('->') ? equation.split('->', 2) : [equation, ''];\n if (!lhs.match(RegExp(lhsPatternOnly))) {\n throw new Error('Invalid LHS term');\n }\n const inputTerms = lhs.split(',');\n inputTerms.forEach((inputTerm, index) => {\n const dims = inputs[index].dims.slice();\n if (!inputTerm.match(RegExp(termPatternOnly))) {\n throw new Error('Invalid LHS term');\n }\n const einsumTerm = this.processTerm(inputTerm, true, dims, index);\n this.lhs.push(einsumTerm);\n });\n\n // Initialize the RHS if not specified\n if (rhs === '') {\n // Construct RHS from LHS terms/symbols\n rhs += [...this.symbolToInfo.entries()]\n .filter(([sym, info]) => (info.count === 1 || sym === '...'))\n .map(([sym]) => sym)\n .join('');\n } else {\n if (!rhs.match(RegExp(termPattern))) {\n throw new Error('Invalid RHS');\n }\n }\n\n // Compute output dims\n const rhsSymbols = rhs.match(RegExp(symbolPattern, 'g'));\n rhsSymbols?.forEach((symbol) => {\n if (symbol === '...') {\n this.outputDims = this.outputDims.concat(this.ellipsisDims);\n } else {\n const info = this.symbolToInfo.get(symbol);\n if (info === undefined) {\n throw new Error('Invalid RHS symbol');\n }\n this.outputDims.push(info.dimValue);\n }\n });\n this.rhs = this.processTerm(rhs, false, this.outputDims);\n } // End of EinsumEqation constructor\n\n // Add a symbol to the equation\n addSymbol(symbol: string, dimValue: number, inputIndex: number) {\n let info = this.symbolToInfo.get(symbol);\n if (info !== undefined) {\n if (info.dimValue !== dimValue && info.count !== 1) {\n throw new Error('Dimension mismatch');\n } else {\n info.count++;\n info.inputIndices.push(inputIndex);\n }\n } else {\n info = {count: 1, dimValue, inputIndices: [inputIndex]};\n }\n this.symbolToInfo.set(symbol, info);\n }\n\n // Process one input/output term\n processTerm(term: string, isInput: boolean, dims: readonly number[], index = -1): EinsumTerm {\n const rank = dims.length;\n let ellipsis = false;\n let ellipsisDims = [];\n let nextDim = 0;\n // For output empty string is allowed because the output may be reduced to a scalar value\n if (!term.match(RegExp(termPatternOnly)) && (!isInput && term !== '')) {\n throw new Error('Invalid LHS term');\n }\n const indexSymbols = term.match(RegExp(symbolPattern, 'g'));\n const einsumTerm = new EinsumTerm(index);\n // symbol can be either a lettre, 'a' to 'z' or 'A' to 'Z', or '...'\n indexSymbols?.forEach((symbol: string, i: number) => {\n if (symbol === '...') {\n if (ellipsis) {\n throw new Error('Only one ellipsis is allowed per input term');\n }\n ellipsis = true;\n const ellipsisDimLength = rank - indexSymbols.length + 1;\n if (ellipsisDimLength < 0) {\n throw new Error('Ellipsis out of bounds');\n }\n ellipsisDims = dims.slice(nextDim, nextDim + ellipsisDimLength);\n if (this.hasEllipsis) {\n if (this.ellipsisDims.length !== ellipsisDims.length ||\n this.ellipsisDims.toString() !== ellipsisDims.toString()) {\n throw new Error('Ellipsis dimensions mismatch');\n }\n } else if (isInput) {\n this.hasEllipsis = true;\n this.ellipsisDims = ellipsisDims;\n } else {\n throw new Error('Ellipsis must be specified in the LHS');\n }\n // Add '0', '1', '2', '3', '4', etc to represent ellipsis dimensions to avoid special handling\n for (let j = 0; j < ellipsisDims.length; j++) {\n const symbol = String.fromCharCode('0'.charCodeAt(0) + j);\n einsumTerm.addSymbol(symbol, i + j);\n this.addSymbol(symbol, dims[nextDim++], index);\n }\n } else {\n einsumTerm.addSymbol(symbol, i + (this.hasEllipsis ? this.ellipsisDims.length - 1 : 0));\n this.addSymbol(symbol, dims[nextDim++], index);\n }\n });\n return einsumTerm;\n }\n\n symbolToInfo: Map; // All symbols in the equation\n hasEllipsis: boolean; // The equation has ellipsis or not\n ellipsisDims: number[]; // The dimensions of the equation ellipsis corresponds to.\n lhs: EinsumTerm[]; // Terms on the left-hand side of the equation\n rhs: EinsumTerm; // Term on the right-hand side of the equation\n outputDims: number[]; // Output dimensions of the equation\n} // End of class EinsumEquation\n\nconst appendMax = (name: string): string => name + '_max';\n\nconst createEinsumProgramInfo =\n (inputShapes: Array, dataType: number, einsumEquation: EinsumEquation,\n outputShape: readonly number[]): ProgramInfo => {\n const ranks = inputShapes.map((dims) => dims.length);\n const inputVars = ranks.map((rank, index) => inputVariable(`input${index}`, dataType, rank));\n const outputSize = ShapeUtil.size(outputShape);\n const output = outputVariable('output', dataType, outputShape.length);\n const uniformsSymbols =\n [...einsumEquation.symbolToInfo.keys()].filter((symbol) => !einsumEquation.rhs.symbolToIndices.has(symbol));\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const idxCopy: string[] = [];\n const initProd = 'var prod = 1.0;';\n const initSum = 'var sum = 0.0;';\n const updateSum = 'sum += prod;';\n const reduceOpsSetIndices: string[] = [];\n const reduceOpsLoopHeaders: string[] = [];\n const reduceOpsLoopFooters: string[] = [];\n const reduceOpCompute: string[] = [];\n const isReduceOpsWithoutLoop = einsumEquation.symbolToInfo.size === einsumEquation.rhs.symbolToIndices.size;\n einsumEquation.symbolToInfo.forEach((info, symbol) => {\n if (einsumEquation.rhs.symbolToIndices.has(symbol)) {\n const outputIndex = einsumEquation.rhs.symbolToIndices.get(symbol)?.[0];\n if (outputIndex !== undefined) {\n einsumEquation.lhs.forEach((term, i) => {\n if (info.inputIndices.includes(i)) {\n const indices = term.symbolToIndices.get(symbol);\n if (indices === undefined) {\n throw new Error('Invalid symbol error');\n }\n indices.forEach((index) => {\n idxCopy.push(`${\n inputVars[i].indicesSet(\n `input${i}Indices`, index, output.indicesGet('outputIndices', outputIndex))}`);\n });\n }\n });\n }\n } else {\n einsumEquation.lhs.forEach((term, i) => {\n if (info.inputIndices.includes(i)) {\n const indices = term.symbolToIndices.get(symbol);\n if (indices === undefined) {\n throw new Error('Invalid symbol error');\n }\n indices.forEach((index) => {\n reduceOpsSetIndices.push(`${inputVars[i].indicesSet(`input${i}Indices`, index, `${symbol}`)}`);\n });\n reduceOpCompute.push(`prod *= ${inputVars[i].getByIndices(`input${i}Indices`)};`);\n }\n });\n reduceOpsLoopHeaders.push(\n `for(var ${symbol}: u32 = 0; ${symbol} < uniforms.${appendMax(symbol)}; ${symbol}++) {`);\n reduceOpsLoopFooters.push('}');\n }\n });\n const reduceOps = isReduceOpsWithoutLoop ?\n [\n ...idxCopy,\n `let sum = ${inputVars.map((inputVar, i) => inputVar.getByIndices(`input${i}Indices`)).join(' * ')};`\n ] :\n [\n ...idxCopy,\n initSum,\n ...reduceOpsLoopHeaders,\n ...reduceOpsSetIndices,\n initProd,\n ...reduceOpCompute,\n updateSum,\n ...reduceOpsLoopFooters,\n ];\n return `\n ${\n shaderHelper\n .registerUniforms(uniformsSymbols.map((symbol) => ({name: `${appendMax(symbol)}`, type: 'u32'})))\n .registerUniform('outputSize', 'u32')\n .declareVariables(...inputVars, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n var outputIndices = ${output.offsetToIndices('global_idx')};\n ${inputVars.map((_var, i) => `var input${i}Indices: ${inputVars[i].type.indices};`).join('\\n')}\n ${reduceOps.join('\\n')};\n ${output.setByOffset('global_idx', 'sum')};\n }`;\n };\n return {\n name: 'Einsum',\n shaderCache: {hint: einsumEquation.equation, inputDependencies: inputShapes.map(() => 'rank')},\n getRunData: () => {\n // The symbols from uniformSymbols array are guaranteed to exist in einsumEquations.symbolToInfo map. The\n // filter is added to make sure that dimValue is never 0.\n const programUniformsInit: ProgramUniform[] =\n uniformsSymbols.filter((symbol) => einsumEquation.symbolToInfo.has(symbol))\n .map(\n (symbol) =>\n ({type: DataType.uint32, data: einsumEquation.symbolToInfo.get(symbol)?.dimValue || 0}));\n programUniformsInit.push({type: DataType.uint32, data: outputSize});\n const programUniforms: ProgramUniform[] =\n inputShapes.map((dims, _) => [...createTensorShapeVariables(dims)])\n .reduce((acc, inputProgramUniforms) => acc.concat(inputProgramUniforms), programUniformsInit);\n programUniforms.push(...createTensorShapeVariables(outputShape));\n return ({\n outputs: [{dims: outputShape, dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n });\n },\n getShaderSource,\n };\n };\n\nexport const einsum = (context: ComputeContext, attributes: EinsumAttributes): void => {\n const einsumEquation = new EinsumEquation(context.inputs, attributes.equation);\n const outputShape = einsumEquation.outputDims;\n const inputShapes = context.inputs.map((input, _) => input.dims);\n context.compute(createEinsumProgramInfo(inputShapes, context.inputs[0].dataType, einsumEquation, outputShape));\n};\n\nexport const parseEinsumAttributes = (attributes: Record): EinsumAttributes => {\n const equation = (attributes.equation as string).replace(/\\s+/g, '');\n return createAttributeWithCacheKey({equation});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Expand requires 2 input.');\n }\n const inputShape = inputs[0].dims;\n const shape = Array.from(inputs[1].getBigInt64Array(), Number);\n\n let shapeIndex = shape.length < inputShape.length ? 0 : shape.length - inputShape.length;\n let inputShapeIndex = inputShape.length < shape.length ? 0 : inputShape.length - shape.length;\n for (; shapeIndex < shape.length && inputShapeIndex < inputShape.length; ++shapeIndex, ++inputShapeIndex) {\n if (shape[shapeIndex] !== inputShape[inputShapeIndex] && shape[shapeIndex] !== 1 &&\n inputShape[inputShapeIndex] !== 1) {\n throw new Error('Expand requires shape to be broadcastable to input');\n }\n }\n};\n\nconst getAdjustedShape = (shape1: readonly number[], shape2: readonly number[]): number[] => {\n const diff = shape1.length - shape2.length;\n const shape: number[] = [];\n for (let i = 0; i < diff; ++i) {\n shape.push(shape1[i]);\n }\n for (let i = 0; i < shape2.length; ++i) {\n shape.push(shape2[i] === 1 ? shape1[i + diff] : shape2[i]);\n }\n return shape;\n};\n\nconst calculateOutputShape = (inputShape: readonly number[], shape: readonly number[]): number[] =>\n (inputShape.length > shape.length) ? getAdjustedShape(inputShape, shape) : getAdjustedShape(shape, inputShape);\n\n\nconst createExpandProgramInfo = (inputs: readonly TensorView[]): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const shape = Array.from(inputs[1].getBigInt64Array(), Number);\n const outputShape: number[] = calculateOutputShape(inputShape, shape);\n const dataType = inputs[0].dataType;\n const components = dataType === DataType.bool ? 4 : 1;\n const outputSize = Math.ceil(ShapeUtil.size(outputShape) / components);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const input = inputVariable('input', dataType, inputShape.length, components);\n const output = outputVariable('output', dataType, outputShape.length, components);\n let assignment: string;\n if (dataType === DataType.bool) {\n const singleAssignment = (resStr: string, x: number, typeCast = '') => `\n let outputIndices${x} = ${output.offsetToIndices(`outputOffset + ${x}u`)};\n let offset${x} = ${input.broadcastedIndicesToOffset(`outputIndices${x}`, output)};\n let index${x} = offset${x} / 4u;\n let component${x} = offset${x} % 4u;\n ${resStr}[${x}] = ${typeCast}(${input.getByOffset(`index${x}`)}[component${x}]);\n `;\n assignment = `\n let outputOffset = global_idx * ${components};\n var data = vec4(0);\n ${singleAssignment('data', 0, 'u32')}\n ${singleAssignment('data', 1, 'u32')}\n ${singleAssignment('data', 2, 'u32')}\n ${singleAssignment('data', 3, 'u32')}\n ${output.setByOffset('global_idx', 'data')}\n }`;\n } else {\n assignment = `\n let outputIndices = ${output.offsetToIndices('global_idx')};\n let inputOffset = ${input.broadcastedIndicesToOffset('outputIndices', output)};\n ${output.setByOffset('global_idx', input.getByOffset('inputOffset'))}\n }`;\n }\n return `\n ${shaderHelper.registerUniform('vec_size', 'u32').declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.vec_size')}\n ${assignment}`;\n };\n\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(inputShape, outputShape)];\n return {\n name: 'Expand',\n shaderCache: {hint: `${outputShape.length}`, inputDependencies: ['rank']},\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n })\n };\n};\n\nexport const expand = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n context.compute(createExpandProgramInfo(context.inputs), {inputs: [0]});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglValueType, UniformsArrayType, WORKGROUP_SIZE} from './common';\nimport * as unary from './unary-op';\n\n// GELU is defined as Y=0.5*X*(1+tanh(0.797885*X+0.035677*X*X*X)), where X may pre-add a bias.\n\nconst createFastGeluProgramInfo = (inputTensors: readonly TensorView[]): ProgramInfo => {\n const dataType = inputTensors[0].dataType;\n const outputSize = ShapeUtil.size(inputTensors[0].dims);\n const biasLength = ShapeUtil.size(inputTensors[1].dims);\n // can only use vec4 when bias length is multiple of 4\n const useVec4 = biasLength % 4 === 0;\n const getShaderSource = (shaderHelper: ShaderHelper): string => {\n const x = inputVariable('x', dataType, [1], 4);\n const bias = inputVariable('bias', dataType, [1], 4);\n const y = outputVariable('y', dataType, [1], 4);\n\n const uniforms: UniformsArrayType = [{name: 'output_vec_size', type: 'u32'}, {name: 'bias_size', type: 'u32'}];\n\n const singleElementBias = (i: 0|1|2|3) => `\n let bias${i}_offset: u32 = (global_idx * 4 + ${i}) % uniforms.bias_size;\n let bias${i} = ${bias.getByOffset(`bias${i}_offset / 4`)}[bias${i}_offset % 4];`;\n const biasGetExpression = useVec4 ?\n `\n let bias = ${bias.getByOffset('global_idx % (uniforms.bias_size / 4)')};` :\n `${singleElementBias(0)}${singleElementBias(1)}${singleElementBias(2)}${singleElementBias(3)}\n let bias = ${x.type.value}(bias0, bias1, bias2, bias3);`;\n\n return `${shaderHelper.registerUniforms(uniforms).declareVariables(x, bias, y)}\n\n ${unary.fastGeluImpl(tensorTypeToWsglValueType(dataType))}\n\n ${shaderHelper.mainStart(WORKGROUP_SIZE)}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_vec_size')}\n\n let x = ${x.getByOffset('global_idx')};\n ${biasGetExpression}\n let x_in = x + bias;\n ${y.setByOffset('global_idx', unary.fastGeluExpression('x_in'))}\n }`;\n };\n\n return {\n name: 'FastGeluWithBias',\n shaderCache: {hint: `${useVec4}`, inputDependencies: ['type', 'type']},\n getShaderSource,\n getRunData: (inputs) => ({\n outputs: [{dims: inputs[0].dims, dataType: inputs[0].dataType}],\n programUniforms:\n [{type: DataType.uint32, data: Math.ceil(outputSize / 4)}, {type: DataType.uint32, data: biasLength}],\n dispatchGroup: {x: Math.ceil(outputSize / WORKGROUP_SIZE / 4)}\n })\n };\n};\n\nexport const fastGelu = (context: ComputeContext): void => {\n if (context.inputs.length < 2 || ShapeUtil.size(context.inputs[1].dims) === 0) {\n unary.fastGelu(context);\n } else {\n context.compute(createFastGeluProgramInfo(context.inputs));\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface GatherAttributes extends AttributeWithCacheKey {\n axis: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Gather requires 2 inputs.');\n }\n};\n\nconst createGatherProgramInfo = (inputs: readonly TensorView[], attributes: GatherAttributes): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const indicesShape = inputs[1].dims;\n\n const inputRank = inputShape.length;\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputRank);\n\n const outputShape = inputShape.slice(0);\n outputShape.splice(axis, 1, ...indicesShape);\n\n const axisDimLimit = inputShape[axis];\n const components = inputs[0].dataType === DataType.bool ? 4 : 1;\n const outputSize = Math.ceil(ShapeUtil.size(outputShape) / components);\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.int32, data: axisDimLimit},\n {type: DataType.uint32, data: axis}, ...createTensorShapeVariables(inputs[0].dims, inputs[1].dims, outputShape)\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const data = inputVariable('data', inputs[0].dataType, inputs[0].dims.length, components);\n const indices = inputVariable('inputIndices', inputs[1].dataType, inputs[1].dims.length);\n const output = outputVariable('output', inputs[0].dataType, outputShape.length, components);\n\n const calcDataIndices = (x: number|string): string => {\n const indicesRank = indicesShape.length;\n let calcStr = `var indicesIndices${x} = ${indices.type.indices}(0);`;\n for (let i = 0; i < indicesRank; i++) {\n calcStr += `${indicesRank > 1 ? `indicesIndices${x}[${i}]` : `indicesIndices${x}`} = ${\n outputShape.length > 1 ? `outputIndices${x}[uniforms.axis + ${i}]` : `outputIndices${x}`};`;\n }\n calcStr += `\n var idx${x} = ${indices.getByIndices(`indicesIndices${x}`)};\n if (idx${x} < 0) {\n idx${x} = idx${x} + uniforms.axisDimLimit;\n }\n var dataIndices${x} : ${data.type.indices};\n `;\n for (let i = 0, j = 0; i < inputRank; i++) {\n if (i === axis) {\n calcStr += `${inputRank > 1 ? `dataIndices${x}[${i}]` : `dataIndices${x}`} = u32(idx${x});`;\n j += indicesRank;\n } else {\n calcStr += `${inputRank > 1 ? `dataIndices${x}[${i}]` : `dataIndices${x}`} = ${\n outputShape.length > 1 ? `outputIndices${x}[${j}]` : `outputIndices${x}`};`;\n j++;\n }\n }\n return calcStr;\n };\n let assignment: string;\n if (inputs[0].dataType === DataType.bool) {\n const singleAssignment = (resStr: string, x: number, typeCast = '') => `\n let outputIndices${x} = ${output.offsetToIndices(`outputOffset + ${x}u`)};\n ${calcDataIndices(x)};\n let offset${x} = ${data.indicesToOffset(`dataIndices${x}`)};\n let index${x} = offset${x} / 4u;\n let component${x} = offset${x} % 4u;\n ${resStr}[${x}] = ${typeCast}(${data.getByOffset(`index${x}`)}[component${x}]);\n `;\n assignment = `\n let outputOffset = global_idx * ${components};\n var value = vec4(0);\n ${singleAssignment('value', 0, 'u32')}\n ${singleAssignment('value', 1, 'u32')}\n ${singleAssignment('value', 2, 'u32')}\n ${singleAssignment('value', 3, 'u32')}\n ${output.setByOffset('global_idx', 'value')}\n `;\n } else {\n assignment = `\n let outputIndices = ${output.offsetToIndices('global_idx')};\n ${calcDataIndices('')};\n let value = ${data.getByIndices('dataIndices')};\n ${output.setByOffset('global_idx', 'value')};\n `;\n }\n return `\n ${\n shaderHelper.registerUniform('outputSize', 'u32')\n .registerUniform('axisDimLimit', 'i32')\n .registerUniform('axis', 'u32')\n .declareVariables(data, indices, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n ${assignment}\n }`;\n };\n return {\n name: 'Gather',\n shaderCache: {hint: attributes.cacheKey, inputDependencies: ['rank', 'rank']},\n getRunData: () => ({\n outputs: [\n {dims: outputShape, dataType: inputs[0].dataType},\n ],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n};\n\nexport const parseGatherAttributes = (attributes: Record): GatherAttributes =>\n createAttributeWithCacheKey({axis: attributes.axis as number});\n\nexport const gather = (context: ComputeContext, attributes: GatherAttributes): void => {\n const inputs = context.inputs;\n validateInputs(inputs);\n context.compute(createGatherProgramInfo(context.inputs, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface GatherElementsAttributes extends AttributeWithCacheKey {\n axis: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('GatherElements requires 2 inputs.');\n }\n\n if (inputs[0].dims.length < 1) {\n throw new Error('GatherElements requires that the data input be rank >= 1.');\n }\n\n if (inputs[0].dims.length !== inputs[1].dims.length) {\n throw new Error(`GatherElements requires that the data input and\n indices input tensors be of same rank.`);\n }\n};\n\nconst createGatherElementsProgramInfo =\n (inputs: readonly TensorView[], attributes: GatherElementsAttributes): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const inputOutputDataType = inputs[0].dataType;\n const inputRank = inputShape.length;\n\n const indicesShape = inputs[1].dims;\n const indicesDataType = inputs[1].dataType;\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputRank);\n const axisDimLimit = inputShape[axis];\n\n const outputShape = indicesShape.slice(0);\n const outputSize = ShapeUtil.size(outputShape);\n\n const input = inputVariable('input', inputOutputDataType, inputRank);\n const indices = inputVariable('indicesInput', indicesDataType, indicesShape.length);\n const output = outputVariable('output', inputOutputDataType, outputShape.length);\n\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.int32, data: axisDimLimit},\n {type: DataType.uint32, data: axis}\n ];\n programUniforms.push(...createTensorShapeVariables(inputShape, indicesShape, outputShape));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n\n // int64 indices would be treated as little endian i32 with assumption they fall in i32 limits\n // That assumption is safe as it's not possible to allocate >2gb buffer for input tensor\n // Input data will be treated as u32 or two u32 for 8-byte tensors\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${\n shaderHelper.registerUniform('outputSize', 'u32')\n .registerUniform('axisDimLimit', 'i32')\n .registerUniform('axis', 'u32')\n .declareVariables(input, indices, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n\n let outputIndices = ${output.offsetToIndices('global_idx')};\n\n var idx = ${indices.getByOffset('global_idx')};\n if (idx < 0) {\n idx = idx + uniforms.axisDimLimit;\n }\n var inputIndices = ${input.type.indices}(outputIndices);\n ${input.indicesSet('inputIndices', 'uniforms.axis', 'u32(idx)')};\n let value = ${input.getByIndices('inputIndices')};\n\n ${output.setByOffset('global_idx', 'value')};\n }`;\n\n return {\n name: 'GatherElements',\n shaderCache: {inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n };\n\nexport const parseGatherElementsAttributes = (attributes: Record): GatherElementsAttributes =>\n createAttributeWithCacheKey({axis: attributes.axis as number});\n\nexport const gatherElements = (context: ComputeContext, attributes: GatherElementsAttributes): void => {\n const inputs = context.inputs;\n validateInputs(inputs);\n context.compute(createGatherElementsProgramInfo(context.inputs, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {GemmUtil, ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs) {\n throw new Error('Input is missing');\n }\n if (inputs.length < 2 || inputs.length > 3) {\n throw new Error('Invaid input number.');\n }\n\n // 'C' can be of dimensionality 0, 1 or 2 only\n if (inputs.length === 3 && inputs[2].dims.length > 2) {\n throw new Error('Invalid input shape of C');\n }\n\n if ((inputs[0].dataType !== inputs[1].dataType) ||\n (inputs.length === 3 && inputs[0].dataType !== inputs[2].dataType)) {\n throw new Error('Input types are mismatched');\n }\n};\n\nexport interface GemmAttributes extends AttributeWithCacheKey {\n transA: boolean;\n transB: boolean;\n alpha: number;\n beta: number;\n}\n\nconst createGemmProgramInfo = (inputs: readonly TensorView[], attributes: GemmAttributes): ProgramInfo => {\n const aShape = inputs[0].dims.slice();\n const bShape = inputs[1].dims.slice();\n const [M, N, K] = GemmUtil.getShapeOfGemmResult(\n aShape, attributes.transA, bShape, attributes.transB, inputs.length === 3 ? inputs[2].dims : undefined);\n const outputShape = [M, N];\n if (!outputShape) {\n throw new Error('Can\\'t use gemm on the given tensors');\n }\n const outputSize = ShapeUtil.size(outputShape);\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: M}, {type: DataType.uint32, data: N},\n {type: DataType.uint32, data: K}, {type: DataType.float, data: attributes.alpha},\n {type: DataType.float, data: attributes.beta}\n ];\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type'];\n if (inputs.length === 3) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n let line = '';\n if (attributes.transA && attributes.transB) {\n line = 'value += a[k * uniforms.M + m] * b[n * uniforms.K + k];';\n } else if (attributes.transA && !attributes.transB) {\n line = 'value += a[k * uniforms.M + m] * b[k * uniforms.N + n];';\n } else if (!attributes.transA && attributes.transB) {\n line = 'value += a[m * uniforms.K + k] * b[n * uniforms.K + k];';\n } else if (!attributes.transA && !attributes.transB) {\n line = 'value += a[m * uniforms.K + k] * b[k * uniforms.N + n];';\n }\n\n const calculateAlpha = attributes.alpha === 1 ? '' : 'value *= uniforms.alpha;';\n const a = inputVariable('a', inputs[0].dataType, inputs[0].dims);\n const b = inputVariable('b', inputs[1].dataType, inputs[1].dims);\n const dataType = a.type.value;\n let c: IndicesHelper|null = null;\n const variables = [a, b];\n if (inputs.length === 3) {\n c = inputVariable('c', inputs[2].dataType, inputs[2].dims.length);\n variables.push(c);\n }\n const output = outputVariable('output', inputs[0].dataType, outputShape.length);\n variables.push(output);\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'M', type: 'u32'}, {name: 'N', type: 'u32'}, {name: 'K', type: 'u32'},\n {name: 'alpha', type: 'f32'}, {name: 'beta', type: 'f32'}\n ];\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...variables)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let m = global_idx / uniforms.N;\n let n = global_idx % uniforms.N;\n\n var value = ${dataType}(0);\n for (var k: u32 = 0u; k < uniforms.K; k++) {\n ${line}\n }\n\n ${calculateAlpha}\n ${(() => {\n if (c != null) {\n return `let cOffset = ${c.broadcastedIndicesToOffset('vec2(m, n)', output)}; value += ${\n dataType}(uniforms.beta) * ${c.getByOffset('cOffset')};`;\n }\n return '';\n })()}\n output[global_idx] = value;\n }`;\n };\n\n return {\n name: 'Gemm',\n shaderCache: {hint: `${attributes.cacheKey}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n};\n\nexport const parseGemmAttributes = (attributes: Record): GemmAttributes => {\n const transA = attributes.transA as boolean;\n const transB = attributes.transB as boolean;\n const alpha = attributes.alpha as number;\n const beta = attributes.beta as number;\n return {transA, transB, alpha, beta, cacheKey: `${attributes.transA};${attributes.transB};${attributes.alpha === 1}`};\n};\n\nexport const gemm = (context: ComputeContext, attributes: GemmAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createGemmProgramInfo(context.inputs, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, GpuDataType, ProgramUniform} from '../types';\n\nimport {applyAttention, AttentionAttrs, AttentionMaskType, AttentionParameters, AttentionQkvFormat} from './attention';\nimport {inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\nimport {createTransposeProgramInfo, TransposeAttributes} from './transpose';\n\nconst getInput = (inputs: readonly TensorView[], i: number) =>\n (inputs.length > i) && (inputs[i].dims.length > 0) && (ShapeUtil.size(inputs[i].dims)) > 0 ? inputs[i] : undefined;\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: AttentionAttrs): AttentionParameters => {\n const query = inputs[0];\n const key = getInput(inputs, 1);\n const value = getInput(inputs, 2);\n const bias = getInput(inputs, 3);\n const keyPaddingMask = getInput(inputs, 4);\n const relativePositionBias = getInput(inputs, 5);\n const pastKey = getInput(inputs, 6);\n const pastValue = getInput(inputs, 7);\n\n // Abbreviation and Meanings:\n // B: batch_size\n // S: sequence_length (input sequence length of query)\n // P: past_sequence_length (past sequence length of key or value)\n // L: kv_sequence_length (input sequence length of key or value)\n // M: max_sequence_length\n // T: total_sequence_length = past_sequence_length + kv_sequence_length\n // N: num_heads\n // H: head size for Q and K, aka q_head_size or k_head_size or qk_head_size\n // H_v: v_head_size\n // D_i: input hidden size\n // D: hidden size for Q and K (D = N * H), aka q_hidden_size or k_hidden_size or qk_hidden_size\n // D_v: v_hidden_size = num_heads * v_head_size\n\n // key_padding_mask (K/V) : (B) or (2*B + 1) or (B, L) or None\n // relative_position_bias : (B, 1, S, L)\n // past_key : (B, N, S*, H)\n // past_value : (B, N, S*, H)\n // When no packing for q/k/v:\n // query (Q) : (B, S, D)\n // key (K) : (B, L, D) or (B, N, S*, H)\n // value (V) : (B, L, D_v) or (B, N, S*, H)\n // bias (Q/K/V) : (D + D + D_v)\n // When packed kv is used:\n // query (Q) : (B, S, D)\n // key (K) : (B, L, N, 2, H)\n // value (V) : None\n // bias (Q/K/V) : None\n // When packed qkv is used:\n // query (Q) : (B, L, N, 3, H) or (B, S, 3*D)\n // key (K) : None\n // value (V) : None\n // bias (Q/K/V) : None or (D + D + D_v)\n\n if (query.dims.length !== 3 && query.dims.length !== 5) {\n throw new Error('Input query is expected to have 3 or 5 dimensions');\n }\n\n const dmmhaPacking = false;\n const batchSize = query.dims[0];\n const sequenceLength = query.dims[1];\n const hiddenSize = query.dims.length === 3 ? (dmmhaPacking ? query.dims[2] / 3 : query.dims[2]) :\n attributes.numHeads * query.dims[4];\n let kvSequenceLength = sequenceLength;\n\n let pastSequenceLength = 0;\n let maxSequenceLength = 0;\n const headSize = Math.floor(hiddenSize / attributes.numHeads);\n if (pastKey && pastValue) {\n if (pastKey.dims.length !== 4) {\n throw new Error('Input \"past_key\" is expected to have 4 dimensions');\n }\n if (pastKey.dims[0] !== batchSize || pastKey.dims[1] !== attributes.numHeads || pastKey.dims[3] !== headSize) {\n throw new Error('Input \"past_key\" shape (batch_size, num_heads, past_sequence_length, head_size)');\n }\n if (pastValue.dims[0] !== batchSize || pastValue.dims[1] !== attributes.numHeads ||\n pastValue.dims[3] !== headSize) {\n throw new Error('Input \"past_value\" shape (batch_size, num_heads, past_sequence_length, head_size)');\n }\n if (pastKey.dims[2] !== pastValue.dims[2]) {\n throw new Error('Input \"past_key\" and \"past_value\" shall have same dim 2 (past_sequence_length)');\n }\n if (pastValue.dims.length !== 4) {\n throw new Error('Input \"past_value\" is expected to have 4 dimensions');\n }\n pastSequenceLength = pastKey.dims[2];\n maxSequenceLength = pastKey.dims[2];\n } else if (pastKey || pastValue) {\n throw new Error('Input \"past_key\" and \"past_value\" shall be both present or both absent');\n }\n\n let qkvFormat: AttentionQkvFormat;\n if (key) {\n if (query.dims.length !== 3) {\n throw new Error('Input \"query\" is expected to have 3 dimensions when key is given');\n }\n if (key.dims.length < 3 || key.dims.length > 5) {\n throw new Error('Input \"key\" is expected to have 3, 4, or 5 dimensions');\n }\n if (query.dims[0] !== key.dims[0]) {\n throw new Error('Input \"query\" and \"key\" shall have same dim 0 (batch size)');\n }\n\n if (key.dims.length === 3) {\n if (key.dims[2] !== query.dims[2]) {\n throw new Error('Input \"query\" and \"key\" shall have same dim 2 (hidden_size)');\n }\n qkvFormat = AttentionQkvFormat.qkvBSNH;\n kvSequenceLength = key.dims[1];\n } else if (key.dims.length === 5) {\n if (key.dims[2] !== attributes.numHeads || key.dims[3] !== 2 || key.dims[4] !== headSize) {\n throw new Error('Expect \"key\" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');\n }\n if (value) {\n throw new Error('Expect \"value\" be none when \"key\" has packed kv format.');\n }\n qkvFormat = AttentionQkvFormat.qKvBSNHxBSN2H;\n kvSequenceLength = key.dims[1];\n } else { // key_dims.size() == 4 (cross-attention with past_key)\n if (key.dims[1] !== attributes.numHeads || key.dims[3] !== headSize) {\n throw new Error('Expect \"key\" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');\n }\n\n qkvFormat = AttentionQkvFormat.unknown;\n kvSequenceLength = key.dims[2];\n }\n } else { // packed QKV\n if (query.dims.length !== 3 && query.dims.length !== 5) {\n throw new Error('Input \"query\" is expected to have 3 or 5 dimensions when key is empty');\n }\n if (query.dims.length === 5 && (query.dims[2] !== attributes.numHeads || query.dims[3] !== 3)) {\n throw new Error('Expect \"query\" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');\n }\n\n qkvFormat = AttentionQkvFormat.qkvBSN3H;\n }\n\n if (bias) {\n if (bias.dims.length !== 1) {\n throw new Error('Input \"bias\" is expected to have 1 dimension');\n }\n\n if (value) {\n if (query.dims.length === 5 && query.dims[3] === 2) {\n throw new Error('bias is not allowed for packed kv.');\n }\n }\n }\n\n let maskType: AttentionMaskType = AttentionMaskType.none;\n if (keyPaddingMask) {\n maskType = AttentionMaskType.maskUnknown;\n const maskDims = keyPaddingMask.dims;\n if (maskDims.length === 1) {\n if (maskDims[0] === batchSize) {\n maskType = AttentionMaskType.mask1dKeySeqLen;\n } else if (maskDims[0] === 3 * batchSize + 2) {\n maskType = AttentionMaskType.mask1DKeySeqLenStart;\n }\n } else if (maskDims.length === 2 && maskDims[0] === batchSize && maskDims[1] === kvSequenceLength) {\n maskType = AttentionMaskType.mask2dKeyPadding;\n }\n if (maskType === AttentionMaskType.maskUnknown) {\n throw new Error('Input \"key_padding_mask\" shape shall be (batch_size) or (batch_size, kv_sequence_length)');\n }\n throw new Error('Mask not supported');\n }\n\n let passPastInKv = false;\n let vHiddenSize = hiddenSize;\n if (value) {\n if (value.dims.length !== 3 && value.dims.length !== 4) {\n throw new Error('Input \"value\" is expected to have 3 or 4 dimensions');\n }\n\n if (query.dims[0] !== value.dims[0]) {\n throw new Error('Input \"query\" and \"value\" shall have same dim 0 (batch_size)');\n }\n\n if (value.dims.length === 3) {\n if (kvSequenceLength !== value.dims[1]) {\n throw new Error('Input \"key\" and \"value\" shall have the same dim 1 (kv_sequence_length)');\n }\n vHiddenSize = value.dims[2];\n } else {\n if (kvSequenceLength !== value.dims[2]) {\n throw new Error('Input \"past_key\" and \"past_value\" shall have the same dim 2 (kv_sequence_length)');\n }\n vHiddenSize = value.dims[1] * value.dims[3];\n passPastInKv = true;\n }\n }\n\n const totalSequenceLength = pastSequenceLength + kvSequenceLength;\n const broadcastResPosBias = false;\n\n if (keyPaddingMask) {\n throw new Error('Key padding mask is not supported');\n }\n\n if (relativePositionBias) {\n if (relativePositionBias.dims.length !== 4) {\n throw new Error('Input \"relative_position_bias\" is expected to have 4 dimensions');\n }\n if ((relativePositionBias.dims[0] !== batchSize && relativePositionBias.dims[0] !== 1) ||\n relativePositionBias.dims[1] !== attributes.numHeads || relativePositionBias.dims[2] !== sequenceLength ||\n relativePositionBias.dims[3] !== totalSequenceLength) {\n throw new Error('Input \"relative_position_bias\" shape (batch_size, 1, sequence_length, kv_sequence_length)');\n }\n }\n\n return {\n batchSize,\n sequenceLength,\n pastSequenceLength,\n kvSequenceLength,\n totalSequenceLength,\n maxSequenceLength,\n inputHiddenSize: 0,\n hiddenSize,\n vHiddenSize,\n headSize,\n vHeadSize: Math.floor(vHiddenSize / attributes.numHeads),\n numHeads: attributes.numHeads,\n isUnidirectional: false,\n pastPresentShareBuffer: false,\n maskFilterValue: attributes.maskFilterValue,\n maskType,\n scale: attributes.scale,\n broadcastResPosBias,\n passPastInKv,\n qkvFormat,\n };\n};\n\nexport const parseMultiHeadAttentionAttributes = (attributes: AttentionAttrs): AttentionAttrs =>\n createAttributeWithCacheKey({...attributes});\n\nconst weightTransposeAttribute: TransposeAttributes = createAttributeWithCacheKey({perm: [0, 2, 1, 3]});\n\nconst addBiasTranspose =\n (context: ComputeContext, qkv: TensorView, bias: TensorView, batchSize: number, sequenceLength: number,\n hiddenSize: number, biasOffset: number) => {\n const outputShape = [batchSize, sequenceLength, hiddenSize];\n const outputSize = ShapeUtil.size(outputShape);\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: biasOffset},\n {type: DataType.uint32, data: hiddenSize}\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('qkv_with_bias', qkv.dataType, outputShape);\n const qkvInput = inputVariable('qkv', qkv.dataType, outputShape);\n const biasInput = inputVariable('bias', bias.dataType, outputShape);\n\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'bias_offset', type: 'u32'}, {name: 'hidden_size', type: 'u32'}\n ];\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(qkvInput, biasInput, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let bias_offset_idx = (global_idx % uniforms.hidden_size) + uniforms.bias_offset;\n\n qkv_with_bias[global_idx] = qkv[global_idx] + bias[bias_offset_idx];\n }`;\n };\n\n return context.compute(\n {\n name: 'MultiHeadAttentionAddBias',\n shaderCache: {inputDependencies: ['type', 'type']},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: qkv.dataType, gpuDataType: GpuDataType.default}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n },\n {inputs: [qkv, bias], outputs: [-1]})[0];\n };\n\nexport const maybeTransposeToBNSHAndAddBias =\n (context: ComputeContext, batchSize: number, numHeads: number, sequenceLength: number, headSize: number,\n input: TensorView, bias?: TensorView, biasOffset?: number) => {\n // const newDims = [];\n\n let reshapedInput = input;\n if (!bias) {\n if (input.dims.length === 3) {\n reshapedInput = input.reshape([batchSize, sequenceLength, numHeads, headSize]);\n }\n return context.compute(\n createTransposeProgramInfo(reshapedInput, weightTransposeAttribute.perm),\n {inputs: [reshapedInput], outputs: [-1]})[0];\n } else {\n if (sequenceLength === 1) {\n throw new Error('AddBiasReshape is not implemented. Please export your model with packed QKV or KV');\n } else {\n reshapedInput =\n addBiasTranspose(context, input, bias, batchSize, sequenceLength, numHeads * headSize, biasOffset!);\n reshapedInput = reshapedInput.reshape([batchSize, sequenceLength, numHeads, headSize]);\n return context.compute(\n createTransposeProgramInfo(reshapedInput, weightTransposeAttribute.perm),\n {inputs: [reshapedInput], outputs: [-1]})[0];\n }\n }\n };\n\nexport const multiHeadAttention = (context: ComputeContext, attributes: AttentionAttrs): void => {\n const params = validateInputs(context.inputs, attributes);\n const query = context.inputs[0];\n const key = getInput(context.inputs, 1);\n const value = getInput(context.inputs, 2);\n const bias = getInput(context.inputs, 3);\n const keyPaddingMask = getInput(context.inputs, 4);\n const relativePositionBias = getInput(context.inputs, 5);\n const pastKey = getInput(context.inputs, 6);\n const pastValue = getInput(context.inputs, 7);\n if (query.dims.length === 5) {\n throw new Error('Packed QKV is not implemented');\n }\n\n if (key?.dims.length === 5) {\n throw new Error('Packed KV is not implemented');\n }\n\n // applyAttention expects BNSH inputs\n const kvBNSH = key && value && key.dims.length === 4 && value.dims.length === 4;\n\n const Q = maybeTransposeToBNSHAndAddBias(\n context, params.batchSize, params.numHeads, params.sequenceLength, params.headSize, query, bias, 0);\n\n if (kvBNSH) {\n return applyAttention(\n context, Q, key, value, keyPaddingMask, undefined, pastKey, pastValue, relativePositionBias, params,\n attributes);\n }\n if (!key || !value) {\n throw new Error('key and value must be provided');\n }\n const K = maybeTransposeToBNSHAndAddBias(\n context, params.batchSize, params.numHeads, params.kvSequenceLength, params.headSize, key, bias,\n params.hiddenSize);\n\n const V = maybeTransposeToBNSHAndAddBias(\n context, params.batchSize, params.numHeads, params.kvSequenceLength, params.vHeadSize, value, bias,\n 2 * params.hiddenSize);\n\n applyAttention(\n context, Q, K, V, keyPaddingMask, undefined, pastKey, pastValue, relativePositionBias, params, attributes);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nconst getRepeats = (repeatsTensorView: TensorView): readonly number[] =>\n Array.from(repeatsTensorView.getBigInt64Array(), Number);\n\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Tile requires 2 inputs.');\n }\n\n if (inputs[0].dataType !== DataType.float && inputs[0].dataType !== DataType.float16 &&\n inputs[0].dataType !== DataType.int32 && inputs[0].dataType !== DataType.uint32) {\n throw new Error('Tile only support float, float16, int32, and uint32 data types');\n }\n\n if (inputs[1].dataType !== DataType.int64) {\n throw new Error('Tile `repeats` input should be of int64 data type');\n }\n\n if (inputs[1].dims.length !== 1) {\n throw new Error('Tile `repeats` input should be 1-D');\n }\n\n const repeats: readonly number[] = getRepeats(inputs[1]);\n\n if (repeats.length !== inputs[0].dims.length) {\n throw new Error('Tile `repeats` input should have same number of elements as rank of input data tensor');\n }\n};\n\nconst getOutputShape = (inputShape: readonly number[], repeats: readonly number[]): readonly number[] => {\n const outputShape: number[] = [];\n\n for (let i = 0; i < inputShape.length; ++i) {\n outputShape.push(inputShape[i] * repeats[i]);\n }\n\n return outputShape;\n};\n\nexport const createTileProgramInfo = (inputs: readonly TensorView[], shape?: number[]): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const repeats: readonly number[] = shape == null ? getRepeats(inputs[1]) : shape;\n const outputShape = getOutputShape(inputShape, repeats);\n const outputSize = ShapeUtil.size(outputShape);\n\n const dataType = inputs[0].dataType;\n const input = inputVariable('input', dataType, inputShape.length);\n const output = outputVariable('output', dataType, outputShape.length);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n const inputShape = ${input.indices(...inputShape)};\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let output_indices = ${output.offsetToIndices('global_idx')};\n var input_indices: ${input.type.indices};\n for (var i = 0; i < ${inputShape.length}; i++) {\n let input_dim_i = ${input.indicesGet('uniforms.input_shape', 'i')};\n let input_dim_value = ${output.indicesGet('output_indices', 'i')} % input_dim_i;\n\n ${input.indicesSet('input_indices', 'i', 'input_dim_value')}\n }\n ${output.setByOffset('global_idx', input.getByIndices('input_indices'))}\n }`;\n\n return {\n name: 'Tile',\n shaderCache: {hint: `${repeats}`, inputDependencies: ['rank']},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms:\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(inputs[0].dims, outputShape)],\n }),\n getShaderSource,\n };\n};\n\nexport const tile = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n context.compute(createTileProgramInfo(context.inputs), {inputs: [0]});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {applyAttention, AttentionAttrs, AttentionMaskType, AttentionParameters, AttentionQkvFormat} from './attention';\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\nimport {maybeTransposeToBNSHAndAddBias} from './multihead-attention';\nimport {createTileProgramInfo} from './tile';\nimport {createTransposeProgramInfo, TransposeAttributes} from './transpose';\n\nexport const validateInputs = (inputs: readonly TensorView[], attributes: AttentionAttrs): AttentionParameters => {\n const query = inputs[0];\n const key = inputs[1];\n const value = inputs[2];\n const pastKey = inputs[3];\n const pastValue = inputs[4];\n\n // Abbreviation and Meanings:\n // B: batch_size\n // S: sequence_length (input sequence length of query)\n // P: past_sequence_length (past sequence length of key or value)\n // L: kv_sequence_length (input sequence length of key or value)\n // M: max_sequence_length\n // T: total_sequence_length = past_sequence_length + kv_sequence_length\n // N: num_heads\n // H: head size for Q and K, aka q_head_size or k_head_size or qk_head_size\n // H_v: v_head_size\n // D_i: input hidden size\n // D: hidden size for Q and K (D = N * H), aka q_hidden_size or k_hidden_size or qk_hidden_size\n // D_v: v_hidden_size = num_heads * v_head_size\n\n // past_key : (B, N, S*, H)\n // past_value : (B, N, S*, H)\n // When no packing for q/k/v:\n // query (Q) : (B, S, D)\n // key (K) : (B, L, D) or (B, N, S*, H)\n // value (V) : (B, L, D_v) or (B, N, S*, H)\n // When packed kv is used:\n // query (Q) : (B, S, D)\n // key (K) : (B, L, N, 2, H)\n // value (V) : None\n // When packed qkv is used:\n // query (Q) : (B, L, N, 3, H) or (B, S, 3*D)\n // key (K) : None\n // value (V) : None\n\n if (query.dims.length !== 3 && query.dims.length !== 5) {\n throw new Error('Input query is expected to have 3 or 5 dimensions');\n }\n\n const dmmhaPacking = false;\n const batchSize = query.dims[0];\n const sequenceLength = query.dims[1];\n const hiddenSize = query.dims.length === 3 ? (dmmhaPacking ? query.dims[2] / 3 : query.dims[2]) :\n attributes.numHeads * query.dims[4];\n let kvSequenceLength = sequenceLength;\n\n let pastSequenceLength = 0;\n let maxSequenceLength = 0;\n const headSize = Math.floor(hiddenSize / attributes.numHeads);\n const hasPastKey = pastKey && pastKey.dims.length !== 0;\n const hasPastValue = pastValue && pastValue.dims.length !== 0;\n // TODO : this should be from attributes.\n const isPastkvBSNH = true;\n if (hasPastKey && hasPastValue) {\n if (pastKey.dims.length !== 4) {\n throw new Error('Input \"past_key\" is expected to have 4 dimensions');\n }\n if (pastValue.dims.length !== 4) {\n throw new Error('Input \"past_value\" is expected to have 4 dimensions');\n }\n if (isPastkvBSNH) {\n // For BSNH\n pastSequenceLength = pastKey.dims[1];\n maxSequenceLength = pastKey.dims[1];\n } else {\n // For BNSH\n pastSequenceLength = pastKey.dims[2];\n maxSequenceLength = pastKey.dims[2];\n }\n } else if (hasPastKey || hasPastValue) {\n throw new Error('Input \"past_key\" and \"past_value\" shall be both present or both absent');\n }\n\n let qkvFormat: AttentionQkvFormat;\n if (key) {\n if (query.dims.length !== 3) {\n throw new Error('Input \"query\" is expected to have 3 dimensions when key is given');\n }\n if (key.dims.length < 3 || key.dims.length > 5) {\n throw new Error('Input \"key\" is expected to have 3, 4, or 5 dimensions');\n }\n if (query.dims[0] !== key.dims[0]) {\n throw new Error('Input \"query\" and \"key\" shall have same dim 0 (batch size)');\n }\n\n if (key.dims.length === 3) {\n if (query.dims[2] % key.dims[2] !== 0) {\n throw new Error('Dimension 2 of \"query\" should be a multiple of \"key\"');\n }\n qkvFormat = AttentionQkvFormat.qkvBSNH;\n kvSequenceLength = key.dims[1];\n } else if (key.dims.length === 5) {\n if (key.dims[2] !== attributes.numHeads || key.dims[3] !== 2 || key.dims[4] !== headSize) {\n throw new Error('Expect \"key\" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');\n }\n if (value) {\n throw new Error('Expect \"value\" be none when \"key\" has packed kv format.');\n }\n qkvFormat = AttentionQkvFormat.qKvBSNHxBSN2H;\n kvSequenceLength = key.dims[1];\n } else { // key_dims.size() == 4 (cross-attention with past_key)\n if (key.dims[1] !== attributes.numHeads || key.dims[3] !== headSize) {\n throw new Error('Expect \"key\" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');\n }\n\n qkvFormat = AttentionQkvFormat.unknown;\n kvSequenceLength = key.dims[2];\n }\n } else { // packed QKV\n if (query.dims.length !== 3 && query.dims.length !== 5) {\n throw new Error('Input \"query\" is expected to have 3 or 5 dimensions when key is empty');\n }\n if (query.dims.length === 5 && (query.dims[2] !== attributes.numHeads || query.dims[3] !== 3)) {\n throw new Error('Expect \"query\" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');\n }\n\n qkvFormat = AttentionQkvFormat.qkvBSN3H;\n }\n\n const maskType: AttentionMaskType = AttentionMaskType.none;\n let passPastInKv = false;\n let vHiddenSize = hiddenSize;\n if (value) {\n if (value.dims.length !== 3 && value.dims.length !== 4) {\n throw new Error('Input \"value\" is expected to have 3 or 4 dimensions');\n }\n\n if (query.dims[0] !== value.dims[0]) {\n throw new Error('Input \"query\" and \"value\" shall have same dim 0 (batch_size)');\n }\n\n if (value.dims.length === 3) {\n if (kvSequenceLength !== value.dims[1]) {\n throw new Error('Input \"key\" and \"value\" shall have the same dim 1 (kv_sequence_length)');\n }\n vHiddenSize = value.dims[2];\n } else {\n if (kvSequenceLength !== value.dims[2]) {\n throw new Error('Input \"past_key\" and \"past_value\" shall have the same dim 2 (kv_sequence_length)');\n }\n vHiddenSize = value.dims[1] * value.dims[3];\n passPastInKv = true;\n }\n }\n const totalSequenceLength = pastSequenceLength + kvSequenceLength;\n const broadcastResPosBias = false;\n\n return {\n batchSize,\n sequenceLength,\n pastSequenceLength,\n kvSequenceLength,\n totalSequenceLength,\n maxSequenceLength,\n inputHiddenSize: 0,\n hiddenSize,\n vHiddenSize,\n headSize,\n vHeadSize: Math.floor(vHiddenSize / attributes.kvNumHeads!),\n numHeads: attributes.numHeads,\n kvNumHeads: attributes.kvNumHeads,\n nReps: attributes.numHeads / attributes.kvNumHeads!,\n pastPresentShareBuffer: false,\n maskType,\n scale: attributes.scale,\n broadcastResPosBias,\n passPastInKv,\n qkvFormat,\n isPastkvBSNH,\n };\n};\n\nconst createConcatProgramInfo =\n (a: TensorView, b: TensorView|undefined, dataType: DataType, params: AttentionParameters): ProgramInfo => {\n const outputShape = [params.batchSize, params.totalSequenceLength, params.kvNumHeads!, params.headSize];\n const component = 4;\n const outputSize = ShapeUtil.size(outputShape) / component;\n const presentSequenceLength = params.totalSequenceLength;\n const output = outputVariable('present_kv', dataType, outputShape.length, component);\n const inputA = inputVariable('new_kv', a.dataType, a.dims.length, component);\n const inputB = b ? inputVariable('past_kv', b.dataType, b.dims.length, component) : undefined;\n\n const H = Math.ceil(params.headSize / component);\n const dispatch = {x: presentSequenceLength, y: a.dims[0], z: 1};\n\n const inputDependencies: ProgramInputTensorInfoDependency[] = b ? ['rank', 'rank'] : ['rank'];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: params.pastSequenceLength},\n {type: DataType.uint32, data: params.kvSequenceLength},\n {type: DataType.uint32, data: params.totalSequenceLength}\n ];\n\n const inputs = [inputA];\n if (inputB) {\n programUniforms.push(\n ...createTensorShapeVariables(a.dims), ...createTensorShapeVariables(b!.dims),\n ...createTensorShapeVariables(outputShape));\n inputs.push(inputB);\n } else {\n programUniforms.push(...createTensorShapeVariables(a.dims), ...createTensorShapeVariables(outputShape));\n }\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'past_seqlen', type: 'u32'}, {name: 'new_seqlen', type: 'u32'},\n {name: 'present_seqlen', type: 'u32'}\n ];\n\n const pastStr = ` let past_batch_stride = uniforms.past_seqlen * num_heads * H;\n var past_head_stride = uniforms.past_seqlen * H;\n if (is_bsnh) {\n past_head_stride = H;\n }\n let in_offset = b * past_batch_stride + s * row_stride + n * past_head_stride + h;\n present_kv[out_offset] = past_kv[in_offset];`;\n const newStr = ` let new_batch_stride = uniforms.new_seqlen * num_heads * H;\n let new_row_stride = num_heads * H;\n let new_head_stride = H;\n let in_offset = b * new_batch_stride + (s - past_seqlen) * new_row_stride + n * new_head_stride + h;\n present_kv[out_offset] = new_kv[in_offset];`;\n const concatStr = b ? `if (s < past_seqlen) {\n ${pastStr}\n } else if (s < past_seqlen + uniforms.new_seqlen) {\n ${newStr}\n }` :\n `if (s < past_seqlen + uniforms.new_seqlen) {\n ${newStr}\n }`;\n\n // TODO: handle H * params.kvNumHeads greater than maxComputeInvocationsPerWorkgroup limit.\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputs, output)}\n ${shaderHelper.mainStart([\n H, params.kvNumHeads!, 1\n ])}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n var indices = ${output.offsetToIndices('global_idx')};\n let h = local_id.x;\n let n = local_id.y;\n let s = workgroup_id.x;\n let b = workgroup_id.y;\n let num_heads = ${params.kvNumHeads!}u;\n let H = ${H}u;\n\n let present_seqlen = uniforms.present_seqlen;\n let present_batch_stride = present_seqlen * num_heads * H;\n var row_stride = H;\n let is_bsnh = ${params.isPastkvBSNH};\n\n if (is_bsnh) {\n row_stride = num_heads * H;\n }\n var present_head_stride = present_seqlen * H;\n if (is_bsnh) {\n present_head_stride = H;\n }\n\n let past_seqlen = uniforms.past_seqlen;\n\n let out_offset = b * present_batch_stride + s * row_stride + n * present_head_stride + h;\n ${concatStr}\n }`;\n\n return {\n name: 'ConcatPastNew',\n shaderCache: {hint: `${params.kvNumHeads!}${H}${!!b}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType}],\n dispatchGroup: dispatch,\n programUniforms,\n }),\n getShaderSource,\n };\n };\n\nexport const parseGroupQueryAttentionAttributes = (attributes: AttentionAttrs): AttentionAttrs =>\n createAttributeWithCacheKey({...attributes});\n\nconst weightTransposeAttribute: TransposeAttributes = createAttributeWithCacheKey({perm: [0, 2, 1, 3]});\n\nconst maybeExpandAndTransposeToBNSH =\n (context: ComputeContext, input: TensorView, pastKV: TensorView|undefined, params: AttentionParameters,\n outputIndex: number) => {\n let reshapedInput = input;\n const numHeads = params.kvNumHeads!;\n const nReps = params.nReps!;\n if (input.dims.length === 3 && params.kvSequenceLength !== 0) {\n reshapedInput = input.reshape([params.batchSize, params.kvSequenceLength, numHeads, params.headSize]);\n }\n\n if (pastKV) {\n reshapedInput = context.compute(\n createConcatProgramInfo(reshapedInput, pastKV, reshapedInput.dataType, params),\n {inputs: [reshapedInput, pastKV], outputs: [params.isPastkvBSNH ? outputIndex : -1]})[0];\n } else {\n reshapedInput = context.compute(\n createConcatProgramInfo(reshapedInput, undefined, reshapedInput.dataType, params),\n {inputs: [reshapedInput], outputs: [params.isPastkvBSNH ? outputIndex : -1]})[0];\n }\n if (nReps !== 1) {\n reshapedInput = context.compute(\n createTileProgramInfo([reshapedInput], [1, 1, 1, nReps]), {inputs: [reshapedInput], outputs: [-1]})[0];\n reshapedInput =\n reshapedInput.reshape([params.batchSize, params.totalSequenceLength, numHeads * nReps, params.headSize]);\n }\n\n return context.compute(\n createTransposeProgramInfo(reshapedInput, weightTransposeAttribute.perm),\n {inputs: [reshapedInput], outputs: [-1]})[0];\n };\n\nexport const groupQueryAttention = (context: ComputeContext, attributes: AttentionAttrs): void => {\n const params = validateInputs(context.inputs, attributes);\n if (context.inputs[0].dims.length === 5) {\n throw new Error('Packed QKV is not implemented');\n }\n\n if (context.inputs[1]?.dims.length === 5) {\n throw new Error('Packed KV is not implemented');\n }\n\n const Q = maybeTransposeToBNSHAndAddBias(\n context, params.batchSize, params.numHeads, params.sequenceLength, params.headSize, context.inputs[0], undefined,\n 0);\n const pastKey = context.inputs[3] && context.inputs[3].dims.length !== 0 ? context.inputs[3] : undefined;\n const pastValue = context.inputs[4] && context.inputs[4].dims.length !== 0 ? context.inputs[4] : undefined;\n const K = maybeExpandAndTransposeToBNSH(context, context.inputs[1], pastKey, params, 1);\n const V = maybeExpandAndTransposeToBNSH(context, context.inputs[2], pastValue, params, 2);\n applyAttention(context, Q, K, V, undefined, undefined, undefined, undefined, undefined, params, attributes);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, fillVector, getMaxComponents, inputVariable, outputVariable, ShaderHelper, sumVector, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\n\nexport interface InstanceNormAttributes {\n epsilon: number;\n format: 'NHWC'|'NCHW';\n}\n\nconst createInstanceNormProgramInfo =\n (inputs: readonly TensorView[], attributes: InstanceNormAttributes): ProgramInfo => {\n const xShape = inputs[0].dims;\n const outputShape = xShape;\n const axis = 2;\n const normCount = ShapeUtil.sizeToDimension(xShape, axis);\n const normSize = ShapeUtil.sizeFromDimension(xShape, axis);\n const components = getMaxComponents(normSize);\n const normPackedSize = normSize / components;\n const inputShape = [xShape[0], xShape[1], normPackedSize];\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'type', 'type'];\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: normSize}, {type: DataType.uint32, data: normPackedSize}];\n programUniforms.push(...createTensorShapeVariables(inputShape, inputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const x = inputVariable('x', inputs[0].dataType, inputShape.length, components);\n const scale = inputVariable('scale', inputs[1].dataType, inputs[1].dims);\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims);\n const output = outputVariable('output', inputs[0].dataType, inputShape.length, components);\n const variables = [x, scale, bias, output];\n const dataType = x.type.value;\n const f32Type = components === 1 ? 'f32' : `vec${components}`;\n const workgroupSize = 64;\n\n const uniforms: UniformsArrayType = [{name: 'normSize', type: 'u32'}, {name: 'normPackedSize', type: 'u32'}];\n return `\n var meanShared : f32;\n var squaredNormShared : f32;\n var workgroupShared : array<${f32Type}, ${workgroupSize}>;\n const workgroupSize = ${workgroupSize}u;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...variables)}\n ${shaderHelper.mainStart(workgroupSize)}\n let norm = global_idx / workgroupSize;\n let batch = norm / uniforms.x_shape[1];\n let channel = norm % uniforms.x_shape[1];\n let localIndex = local_id.x;\n\n // initialize workgroup memory\n var initial = ${f32Type}(0);\n for (var h = localIndex; h < uniforms.normPackedSize; h += workgroupSize) {\n initial = initial + ${f32Type}(${x.get('batch', 'channel', 'h')});\n }\n workgroupShared[localIndex] = initial;\n workgroupBarrier();\n\n // Calculate the mean of current channel data.\n for (var currSize = workgroupSize >> 1; currSize > 0; currSize = currSize >> 1) {\n if (localIndex < currSize) {\n workgroupShared[localIndex] = workgroupShared[localIndex] + workgroupShared[localIndex + currSize];\n }\n workgroupBarrier();\n }\n if (localIndex == 0) {\n meanShared = ${sumVector('workgroupShared[0]', components)} / f32(uniforms.normSize);\n }\n workgroupBarrier();\n\n // reinitialize workgroup memory.\n initial = ${f32Type}(0);\n for (var h = localIndex; h < uniforms.normPackedSize; h += workgroupSize) {\n let deviation = ${f32Type}(${x.get('batch', 'channel', 'h')}) - ${f32Type}(meanShared);\n initial = initial + deviation * deviation;\n }\n workgroupShared[localIndex] = initial;\n workgroupBarrier();\n\n // Calculate the sum of square of deviation of current channel data.\n for (var currSize = workgroupSize >> 1; currSize > 0; currSize = currSize >> 1) {\n if (localIndex < currSize) {\n workgroupShared[localIndex] = workgroupShared[localIndex] + workgroupShared[localIndex + currSize];\n }\n workgroupBarrier();\n }\n if (localIndex == 0) {\n squaredNormShared = ${sumVector('workgroupShared[0]', components)};\n }\n workgroupBarrier();\n\n let invStdDev = inverseSqrt(squaredNormShared / f32(uniforms.normSize) + f32(${attributes.epsilon}));\n let channelScale = invStdDev * f32(${scale.getByOffset('channel')});\n let channelShift = f32(${bias.getByOffset('channel')}) - meanShared * channelScale;\n for (var h = localIndex; h < uniforms.normPackedSize; h += workgroupSize) {\n let value = ${x.get('batch', 'channel', 'h')} * ${dataType}(${f32Type}(channelScale)) + ${dataType}(${\n f32Type}(channelShift));\n ${output.set('batch', 'channel', 'h', 'value')};\n }\n }`;\n };\n return {\n ...{name: 'InstanceNormalization'},\n // TODO: use epsilon as uniform. Currently epsilon as uniform fails test_instancenorm_epsilon.\n shaderCache: {hint: `${attributes.epsilon};${components}`, inputDependencies},\n getRunData: () => ({\n outputs: [\n {dims: outputShape, dataType: inputs[0].dataType},\n ],\n dispatchGroup: {x: normCount},\n programUniforms\n }),\n getShaderSource,\n };\n };\n\nconst computeMean =\n (context: ComputeContext, input: TensorView, scale: TensorView, bias: TensorView, n: number, h: number, c: number,\n epsilon: number) => {\n const components = getMaxComponents(c);\n const WG = 64;\n // we will store channel scale and channel shift in [2, components] matrix\n // or in vec2 when components == 1\n const outputType = components === 1 ? 'vec2f' : `mat2x${components}f`;\n const sumCastType = components === 1 ? 'f32' : `vec${components}f`;\n const setOutputValue = (var1: string, var2: string) => `${outputType}(${var1}, ${var2})`;\n const unitsOfWork = n * c / components;\n const wgSize = Math.ceil(h / WG);\n\n const meanInputDependencies: ProgramInputTensorInfoDependency[] = ['type'];\n const meanProgramUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: wgSize}, {type: DataType.uint32, data: h},\n {type: DataType.uint32, data: Math.floor(c / components)},\n {type: DataType.uint32, data: Math.floor(h * c / components)}\n ];\n\n const getMeanShaderSource = (shaderHelper: ShaderHelper) => {\n const inputHelper = inputVariable('input', input.dataType, input.dims, components);\n return `\n ${shaderHelper.declareVariables(inputHelper)}\n @group(0) @binding(1) var output : array<${outputType}>;\n struct Uniforms {wg_size:u32, H:u32, C:u32, image_size:u32};\n @group(0) @binding(2) var uniforms: Uniforms;\n\n ${shaderHelper.mainStart(WG)}\n let currentImageNumber = global_idx / ${WG} / uniforms.C;\n let currentChannelNumber = (global_idx / ${WG}) % uniforms.C;\n let wgOffset = local_id.x * uniforms.wg_size;\n if (wgOffset >= uniforms.H) {\n return;\n }\n let wgMax = min(wgOffset + uniforms.wg_size, uniforms.H);\n\n let offset = currentImageNumber * uniforms.image_size + currentChannelNumber;\n var sum = ${fillVector('f32', components)};\n var squaredSum = ${fillVector('f32', components)};\n for (var i: u32 = wgOffset; i < wgMax; i++) {\n let value = ${sumCastType}(input[offset + i * uniforms.C]);\n sum += value;\n squaredSum += value * value;\n }\n output[global_idx] = ${setOutputValue('sum', 'squaredSum')};\n }`;\n };\n\n const meanValues = context.compute(\n {\n name: 'InstanceNormComputeMean',\n shaderCache: {hint: `${components}`, inputDependencies: meanInputDependencies},\n getRunData: () => ({\n outputs: [\n {dims: [n, c, WG, 2], dataType: DataType.float},\n ],\n dispatchGroup: {x: n * c / components},\n programUniforms: meanProgramUniforms\n }),\n getShaderSource: getMeanShaderSource,\n },\n {inputs: [input], outputs: [-1]})[0];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: unitsOfWork}, {type: DataType.uint32, data: h},\n {type: DataType.uint32, data: Math.floor(c / components)},\n {type: DataType.uint32, data: Math.floor(WG * c / components)}\n ];\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type', 'type'];\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const scaleHelper = inputVariable('scale', scale.dataType, scale.dims, components);\n const biasHelper = inputVariable('bias', bias.dataType, bias.dims, components);\n return `\n @group(0) @binding(0) var input : array<${outputType}>;\n @group(0) @binding(1) var scale : array<${scaleHelper.type.storage}>;\n @group(0) @binding(2) var bias : array<${biasHelper.type.storage}>;\n @group(0) @binding(3) var output : array<${outputType}>;\n struct Uniforms {units_of_work : u32, H: u32, C : u32, image_size : u32};\n @group(0) @binding(4) var uniforms: Uniforms;\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.units_of_work')}\n let currentImageNumber = global_idx / uniforms.C;\n let currentChannelNumber = global_idx % uniforms.C;\n\n let offset = currentImageNumber * uniforms.image_size;\n var sum = ${fillVector('f32', components)};\n var squaredSum = ${fillVector('f32', components)};\n for (var i: u32 = 0; i < min(${WG}, uniforms.H); i++) {\n let value = input[offset + i + currentChannelNumber * ${WG}];\n sum += value[0];\n squaredSum += value[1];\n }\n sum = sum / f32(uniforms.H);\n squaredSum = squaredSum / f32(uniforms.H);\n let invStdDev = inverseSqrt(squaredSum - sum * sum + f32(${epsilon}));\n let channelScale = invStdDev * ${sumCastType}(scale[currentChannelNumber]);\n let channelShift = ${sumCastType}(bias[currentChannelNumber]) - sum * channelScale;\n\n output[global_idx] = ${setOutputValue('channelScale', 'channelShift')};\n }`;\n };\n return context.compute(\n {\n name: 'InstanceNormComputeChannelScaleShift',\n // TODO: use epsilon as uniform. Currently epsilon as uniform fails test_instancenorm_epsilon.\n shaderCache: {hint: `${components};${epsilon}`, inputDependencies},\n getRunData: () => ({\n outputs: [\n {dims: [n, c, 2], dataType: DataType.float},\n ],\n dispatchGroup: {x: Math.ceil(unitsOfWork / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n },\n {inputs: [meanValues, scale, bias], outputs: [-1]})[0];\n };\n\nconst createInstanceNormNHWCProgramInfo =\n (context: ComputeContext, inputs: readonly TensorView[], attributes: InstanceNormAttributes) => {\n const xShape = inputs[0].dims;\n const outputShape = xShape;\n const N = xShape[0];\n const C = xShape[xShape.length - 1];\n const H = ShapeUtil.sizeFromDimension(xShape, 1) / C;\n const components = getMaxComponents(C);\n const outputSize = ShapeUtil.size(outputShape) / components;\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: H}, {type: DataType.uint32, data: Math.floor(C / components)}];\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type'];\n // first compute mean\n const channelScaleShift = computeMean(context, inputs[0], inputs[1], inputs[2], N, H, C, attributes.epsilon);\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n const scaleType = components === 1 ? 'vec2f' : `mat2x${components}f`;\n const scaleCastType = components === 1 ? dataType : `vec${components}<${dataType}>`;\n\n const inputHelper = inputVariable('input', inputs[0].dataType, inputs[0].dims, components);\n const outputHelper = outputVariable('output', inputs[0].dataType, outputShape, components);\n\n return `\n @group(0) @binding(0) var input : array<${inputHelper.type.storage}>;\n @group(0) @binding(1) var scaleInput : array<${scaleType}>;\n @group(0) @binding(2) var output : array<${outputHelper.type.storage}>;\n struct Uniforms {H: u32, C : u32};\n @group(0) @binding(3) var uniforms: Uniforms;\n\n ${shaderHelper.mainStart()}\n let currentImageNumber = global_idx / (uniforms.C * uniforms.H);\n let currentChannelNumber = global_idx % uniforms.C;\n\n let scaleOffset = currentImageNumber * uniforms.C + currentChannelNumber;\n let scale = scaleInput[scaleOffset];\n output[global_idx] = fma(input[global_idx], ${scaleCastType}(scale[0]), ${scaleCastType}(scale[1]));\n }`;\n };\n context.compute(\n {\n name: 'InstanceNormalizationNHWC',\n shaderCache: {hint: `${components}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n },\n {inputs: [inputs[0], channelScaleShift]});\n };\n\nexport const instanceNorm = (context: ComputeContext, attributes: InstanceNormAttributes): void => {\n if (attributes.format === 'NHWC') {\n createInstanceNormNHWCProgramInfo(context, context.inputs, attributes);\n } else {\n context.compute(createInstanceNormProgramInfo(context.inputs, attributes));\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {castToF32, fillVector, getMaxComponents, inputVariable, outputVariable, ShaderHelper, sumVector, tensorTypeToWsglStorageType, UniformsArrayType,} from './common';\n\ninterface LayerNormAttributes {\n simplified: boolean;\n axis: number;\n epsilon: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length < 2) {\n throw new Error('layerNorm requires at least 2 inputs.');\n }\n};\n\nconst createLayerNormProgramInfo =\n (inputs: readonly TensorView[], attributes: LayerNormAttributes, outputCount: number): ProgramInfo => {\n const simplified = attributes.simplified;\n\n const xShape = inputs[0].dims;\n const scale = inputs[1];\n const bias = !simplified && inputs[2];\n\n const outputShape = xShape;\n const axis = ShapeUtil.normalizeAxis(attributes.axis, xShape.length);\n const normCount = ShapeUtil.sizeToDimension(xShape, axis);\n const normSize = ShapeUtil.sizeFromDimension(xShape, axis);\n\n const scaleSize = ShapeUtil.size(scale.dims);\n const biasSize = bias ? ShapeUtil.size(bias.dims) : 0;\n if (scaleSize !== normSize || (bias && biasSize !== normSize)) {\n throw new Error(`Size of X.shape()[axis:] == ${normSize}.\n Size of scale and bias (if provided) must match this.\n Got scale size of ${scaleSize} and bias size of ${biasSize}`);\n }\n\n const meanInvStdDevDim: number[] = [];\n for (let i = 0; i < xShape.length; ++i) {\n if (i < axis) {\n meanInvStdDevDim.push(xShape[i]);\n } else {\n meanInvStdDevDim.push(1);\n }\n }\n const components = getMaxComponents(normSize);\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type'];\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: normCount}, {type: DataType.float, data: normSize},\n {type: DataType.uint32, data: Math.floor(normSize / components)},\n {type: DataType.float, data: attributes.epsilon}\n ];\n if (bias) {\n inputDependencies.push('type');\n }\n const hasMeanDataOutput = outputCount > 1;\n const hasInvStdOutput = outputCount > 2;\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n const variables = [\n inputVariable('x', inputs[0].dataType, inputs[0].dims, components),\n inputVariable('scale', scale.dataType, scale.dims, components),\n ];\n if (bias) {\n variables.push(inputVariable('bias', bias.dataType, bias.dims, components));\n }\n variables.push(outputVariable('output', inputs[0].dataType, outputShape, components));\n if (hasMeanDataOutput) {\n variables.push(outputVariable('mean_data_output', DataType.float, meanInvStdDevDim));\n }\n if (hasInvStdOutput) {\n variables.push(outputVariable('inv_std_output', DataType.float, meanInvStdDevDim));\n }\n\n const uniforms: UniformsArrayType = [\n {name: 'norm_count', type: 'u32'}, {name: 'norm_size', type: 'f32'},\n {name: 'norm_size_vectorized', type: 'u32'}, {name: 'epsilon', type: 'f32'}\n ];\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...variables)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.norm_count')}\n let offset = global_idx * uniforms.norm_size_vectorized;\n var mean_vector = ${fillVector('f32', components)};\n var mean_square_vector = ${fillVector('f32', components)};\n\n for (var h: u32 = 0u; h < uniforms.norm_size_vectorized; h++) {\n let value = ${castToF32(dataType, components, 'x[h + offset]')};\n mean_vector += value;\n mean_square_vector += value * value;\n }\n let mean = ${sumVector('mean_vector', components)} / uniforms.norm_size;\n let inv_std_dev = inverseSqrt(${sumVector('mean_square_vector', components)} / uniforms.norm_size ${\n simplified ? '' : '- mean * mean'} + uniforms.epsilon);\n\n for (var j: u32 = 0; j < uniforms.norm_size_vectorized; j++) {\n let f32input = ${castToF32(dataType, components, 'x[j + offset]')};\n let f32scale = ${castToF32(dataType, components, 'scale[j]')};\n output[j + offset] = ${variables[0].type.value}((f32input ${simplified ? '' : '- mean'}) * inv_std_dev * f32scale\n ${bias ? `+ ${castToF32(dataType, components, 'bias[j]')}` : ''}\n );\n }\n\n ${hasMeanDataOutput ? 'mean_data_output[global_idx] = mean' : ''};\n ${hasInvStdOutput ? 'inv_std_output[global_idx] = inv_std_dev' : ''};\n }`;\n };\n const outputs = [{dims: outputShape, dataType: inputs[0].dataType}];\n if (hasMeanDataOutput) {\n outputs.push({dims: meanInvStdDevDim, dataType: DataType.float});\n }\n if (hasInvStdOutput) {\n outputs.push({dims: meanInvStdDevDim, dataType: DataType.float});\n }\n\n return {\n name: 'LayerNormalization',\n shaderCache: {hint: `${components};${outputCount};${simplified}`, inputDependencies},\n getRunData: () =>\n ({outputs, dispatchGroup: {x: Math.ceil(normCount / 64 /* workgroup size */)}, programUniforms}),\n getShaderSource,\n };\n };\n\nexport const layerNorm = (context: ComputeContext, attributes: LayerNormAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createLayerNormProgramInfo(context.inputs, attributes, context.outputCount));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType, getTensorElementSize} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, getMaxComponents, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\n\n// TODO support quantization bits not equal to 4\nexport interface MatMulNBitsAttributes extends AttributeWithCacheKey {\n k: number;\n n: number;\n accuracyLevel: number;\n bits: number;\n blockSize: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: MatMulNBitsAttributes): void => {\n if (inputs.length < 3 || inputs.length > 4) {\n throw new Error('MatMulNBits requires 3 or 4 inputs');\n }\n const a = inputs[0];\n const aRank = a.dims.length;\n if (a.dims[aRank - 1] !== attributes.k) {\n throw new Error('The last dim of input shape does not match the k value');\n }\n const nBlocksPerCol = Math.floor((attributes.k + attributes.blockSize - 1) / attributes.blockSize);\n const blobSize = attributes.blockSize / 8 * attributes.bits;\n const b = inputs[1];\n if (!ShapeUtil.areEqual(b.dims, [attributes.n, nBlocksPerCol, blobSize])) {\n throw new Error('The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize');\n }\n const scales = inputs[2];\n const scalesShape = scales.dims;\n if (ShapeUtil.size(scalesShape) !== attributes.n * nBlocksPerCol) {\n throw new Error('scales input size error.');\n }\n if (inputs.length === 4) {\n const zeroPoints = inputs[3];\n const zeroPointsShape = zeroPoints.dims;\n const expectedZeroPointsSize =\n attributes.bits > 4 ? (attributes.n * nBlocksPerCol) : attributes.n * Math.floor((nBlocksPerCol + 1) / 2);\n if (ShapeUtil.size(zeroPointsShape) !== expectedZeroPointsSize) {\n throw new Error('zeroPoints input size error.');\n }\n }\n};\n\nexport const createMatMulNBitsProgramInfo =\n (inputs: readonly TensorView[], attributes: MatMulNBitsAttributes,\n maxComputeWorkgroupSizes: [number, number, number], maxComputeWorkgroupStorageSize: number): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const aRank = inputShape.length;\n const nBlocksPerCol = Math.floor((attributes.k + attributes.blockSize - 1) / attributes.blockSize);\n const dimAOuter = inputShape[aRank - 2];\n const dimInner = attributes.k;\n const dimBOuter = attributes.n;\n const batchDims = inputShape.slice(0, aRank - 2);\n const batchSize = ShapeUtil.size(batchDims);\n const blobSize = attributes.blockSize / 8 * attributes.bits;\n const blobSizeInWords = blobSize / 4;\n const dataType = inputs[0].dataType;\n const outputNumber = getMaxComponents(dimAOuter);\n const aComponents = getMaxComponents(attributes.k);\n const bComponents = getMaxComponents(blobSizeInWords);\n const elementSize = getTensorElementSize(dataType)!;\n const workgroupOutputSize = dimAOuter * nBlocksPerCol * elementSize;\n const maxNumberOfComponents = Math.floor(maxComputeWorkgroupStorageSize / workgroupOutputSize);\n const useBlockwiseMatMulNBits = nBlocksPerCol <= maxComputeWorkgroupSizes[0] && maxNumberOfComponents > 0;\n const components = (!useBlockwiseMatMulNBits || maxNumberOfComponents >= 4) ? getMaxComponents(dimBOuter) :\n ((maxNumberOfComponents >= 2) && getMaxComponents(dimBOuter) >= 2) ? 2 :\n 1;\n const outputShape = batchDims.concat([dimAOuter, dimBOuter]);\n const outputSize = ShapeUtil.size(outputShape) / components / outputNumber;\n\n const programUniforms: ProgramUniform[] = useBlockwiseMatMulNBits ?\n [] :\n [{type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: attributes.blockSize}];\n const inputShapeTemp = [batchSize, dimAOuter, dimInner / aComponents];\n const bShape = ShapeUtil.convertShape(inputs[1].dims).slice();\n bShape.splice(-1, 1, blobSizeInWords / bComponents);\n programUniforms.push(...createTensorShapeVariables(inputShapeTemp));\n programUniforms.push(...createTensorShapeVariables(bShape));\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n if (inputs.length === 4) {\n programUniforms.push(...createTensorShapeVariables(ShapeUtil.convertShape(inputs[3].dims)));\n }\n const outputShapeTemp = [batchSize, dimAOuter, dimBOuter / components];\n programUniforms.push(...createTensorShapeVariables(outputShapeTemp));\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const inputRank = inputShapeTemp.length;\n const a = inputVariable('a', inputs[0].dataType, inputRank, aComponents);\n const b = inputVariable('b', DataType.uint32, bShape.length, bComponents);\n const scales = inputVariable('scales', inputs[2].dataType, inputs[2].dims.length);\n const inputVariables = [a, b, scales];\n const zeroPoints =\n inputs.length === 4 ? inputVariable('zero_points', DataType.uint32, inputs[3].dims.length) : undefined;\n if (zeroPoints) {\n inputVariables.push(zeroPoints);\n }\n const outputRank = outputShapeTemp.length;\n const output = outputVariable('output', inputs[0].dataType, outputRank, components);\n const uniforms: UniformsArrayType = [{name: 'output_size', type: 'u32'}, {name: 'block_size', type: 'u32'}];\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n\n const qDqDataType = (() => {\n switch (aComponents) {\n case 1:\n return `array<${dataType}, 8>`;\n case 2:\n return `mat4x2<${dataType}>`;\n case 4:\n return `mat2x4<${dataType}>`;\n default:\n throw new Error(`${aComponents}-component is not supported.`);\n }\n })();\n\n const processOneBlock = `\n for (var word: u32 = 0; word < ${blobSizeInWords}; word += ${bComponents}) {\n ${b.indicesSet('b_indices', '2', 'word')};\n let b_data = ${b.getByIndices('b_indices')};\n for (var i: u32 = 0; i < ${bComponents}; i++) {\n let b_value: u32 = ${bComponents === 1 ? 'b_data' : 'b_data[word + i]'};\n let b_mask: u32 = 0x0F0F0F0Fu;\n let b_value_lower: vec4 = unpack4xU8(b_value & b_mask);\n let b_value_upper: vec4 = unpack4xU8((b_value >> 4) & b_mask);\n let b_quantized_values = ${qDqDataType}(${\n Array.from({length: 4}, (_, i) => `${dataType}(b_value_lower[${i}]), ${dataType}(b_value_upper[${i}])`)\n .join(', ')});\n let b_dequantized_values = ${(() => {\n if (aComponents === 1) {\n return `${qDqDataType}(${\n Array.from({length: 8}, (_, i) => `(b_quantized_values[${i}] - zero_point) * scale`).join(', ')});`;\n } else {\n return `(b_quantized_values - ${qDqDataType}(${Array(8).fill('zero_point').join(',')})) * scale;`;\n }\n })()};\n // Number of B elements per 32-bit word is 32/bits = 32/4 = 8\n for (var m: u32 = 0; m < ${useBlockwiseMatMulNBits ? dimAOuter : outputNumber}u; m++) {\n ${a.indicesSet('a_indices', inputRank - 2, useBlockwiseMatMulNBits ? 'm' : `row * ${outputNumber} + m`)};\n ${a.indicesSet('a_indices', inputRank - 1, 'word_offset')};\n var input_offset = ${a.indicesToOffset('a_indices')};\n var a_data: ${qDqDataType};\n for (var j: u32 = 0; j < ${8 / aComponents}; j++) {\n a_data[j] = ${a.getByOffset('input_offset')};\n input_offset++;\n }\n ${useBlockwiseMatMulNBits ? 'workgroup_shared[workgroup_shared_offset + m]' : 'output_values[m]'}${\n components > 1 ? '[c]' : ''} += ${\n Array\n .from(\n {length: 8 / aComponents},\n (_, i) => `${\n aComponents === 1 ? `a_data[${i}] * b_dequantized_values[${i}]` :\n `dot(a_data[${i}], b_dequantized_values[${i}])`}`)\n .join(' + ')};\n }\n word_offset += ${8 / aComponents};\n }\n }`;\n const updateZeroPointIndex = zeroPoints ? `\n zero_point_offset += 4;\n if (zero_point_offset == 32) {\n zero_point_offset = 0;\n zero_point_index++;\n zero_point_word = ${zeroPoints.getByOffset('zero_point_index')};\n }` :\n '';\n\n return useBlockwiseMatMulNBits ? `\n var workgroup_shared: array<${output.type.value}, ${dimAOuter * nBlocksPerCol}>;\n ${shaderHelper.declareVariables(...inputVariables, output)}\n ${shaderHelper.mainStart([\n nBlocksPerCol, 1, 1\n ])}\n var a_indices: ${a.type.indices};\n var block = local_id.x;\n var col = workgroup_id.y;\n var batch = workgroup_id.z;\n ${a.indicesSet('a_indices', '0', 'batch')};\n // Two zero points are packed into one byte when uniforms.bits is 4.\n for (var c: u32 = 0; c < ${components}; c++) {\n let col_times_components_plus_c = col * ${components} + c;\n ${\n zeroPoints ? `\n var zero_point_bytes_per_col: u32 = (${nBlocksPerCol} + 1) / 2;\n var zero_point_byte_count: u32 = col_times_components_plus_c * zero_point_bytes_per_col + (block >> 0x1u);\n var zero_point_word_index: u32 = zero_point_byte_count >> 0x2u;\n var zero_point_byte_offset: u32 = zero_point_byte_count & 0x3u;\n var zero_point_nibble_offset: u32 = block & 0x1u;\n var zero_point_bits_offset: u32 = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2);\n var zero_point_word: u32 = ${zeroPoints.getByOffset('zero_point_word_index')} >> zero_point_bits_offset;` :\n ''}\n var b_indices: ${b.type.indices};\n ${b.indicesSet('b_indices', '0', 'col_times_components_plus_c')};\n // The scale and zero points are computed per block.\n var scales_index = col_times_components_plus_c * ${nBlocksPerCol} + block;\n let scale = ${scales.getByOffset('scales_index')};\n // The default zero point is 8 for unsigned 4-bit quantization.\n let zero_point = ${dataType}(${zeroPoints ? '(zero_point_word) & 0xFu' : 8.0});\n ${b.indicesSet('b_indices', '1', 'block')};\n var word_offset: u32 = block * ${attributes.blockSize / aComponents};\n var workgroup_shared_offset: u32 = block * ${dimAOuter};\n ${processOneBlock}\n }\n workgroupBarrier();\n var output_indices: ${output.type.indices};\n var elements_per_thread: u32 = ${Math.ceil(dimAOuter / nBlocksPerCol)};\n ${output.indicesSet('output_indices', '0', 'batch')};\n ${output.indicesSet('output_indices', outputRank - 1, 'col')};\n ${output.indicesSet('output_indices', outputRank - 2, 'local_id.x * elements_per_thread')};\n var output_offset = ${output.indicesToOffset('output_indices')};\n for (var m: u32 = 0u; m < elements_per_thread; m++) {\n var row = m + local_id.x * elements_per_thread;\n if (row < ${dimAOuter}) {\n var output_value: ${output.type.value} = ${output.type.value}(0);\n var workgroup_shared_offset: u32 = row;\n for (var b: u32 = 0u; b < ${nBlocksPerCol}u; b++) {\n output_value += workgroup_shared[workgroup_shared_offset];\n workgroup_shared_offset += ${dimAOuter};\n }\n ${output.setByOffset('output_offset', 'output_value')};\n output_offset += ${dimBOuter / components};\n }\n }\n }` :\n `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n var output_values: array<${output.type.value}, ${outputNumber}>;\n var output_indices = ${output.offsetToIndices('global_idx')};\n var col = ${output.indicesGet('output_indices', outputRank - 1)};\n var row = ${output.indicesGet('output_indices', outputRank - 2)};\n var a_indices: ${a.type.indices} = output_indices;\n // Two zero points are packed into one byte because uniforms.bits <= 4.\n // zero_point_offset is either 0 or 4. It is bit offset within one byte.\n // TODO support zero_point_offset for bits > 4\n ${\n zeroPoints ? `\n var zero_point_abs_offset = col * ${components} * ((${nBlocksPerCol} + 1) / 2);\n var zero_point_index: u32 = zero_point_abs_offset / 4;\n var zero_point_word: u32 = ${zeroPoints.getByOffset('zero_point_index')};\n var zero_point_offset: u32 = (zero_point_abs_offset % 4) * 8;` :\n ''}\n var scale_index = col * ${nBlocksPerCol * components};\n var b_indices: ${b.type.indices};\n for (var c: u32 = 0; c < ${components}; c++) {\n ${b.indicesSet('b_indices', '0', `col * ${components} + c`)};\n var block_offset: u32 = 0;\n for (var block: u32 = 0; block < ${nBlocksPerCol}; block++) {\n // The scale and zero points are computed per block.\n let scale = ${scales.getByOffset('scale_index')};\n // The default zero point is 8 for unsigned 4-bit quantization.\n let zero_point = ${dataType}(${zeroPoints ? 'extractBits(zero_point_word, zero_point_offset, 4)' : 8.0});\n ${b.indicesSet('b_indices', '1', 'block')};\n var word_offset: u32 = block_offset;\n ${processOneBlock}\n scale_index++;\n ${updateZeroPointIndex}\n block_offset += uniforms.block_size / ${aComponents};\n }\n // Drop the trailing 4 bits if the zero_poit_offset is not a byte boundary to align with the next byte.\n ${\n zeroPoints ? `if (zero_point_offset % 8 > 0) {\n ${updateZeroPointIndex}\n }` :\n ''}\n }\n for (var k: u32 = 0u; k < ${outputNumber}u; k++) {\n ${output.indicesSet('output_indices', outputRank - 2, `${outputNumber} * row + k`)};\n ${output.setByIndices('output_indices', 'output_values[k]')}\n }\n }`;\n };\n return {\n name: useBlockwiseMatMulNBits ? 'BlockwiseMatMulNBits' : 'MatMulNBits',\n shaderCache: {\n hint: `${attributes.cacheKey};${dimAOuter};${dataType};${inputs.length}`,\n inputDependencies: Array(inputs.length).fill('rank')\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType}],\n name: useBlockwiseMatMulNBits ? 'BlockwiseMatMulNBits' : 'MatMulNBits',\n dispatchGroup: useBlockwiseMatMulNBits ? {x: 1, y: Math.ceil(dimBOuter / components), z: batchSize} :\n {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource\n };\n };\n\nexport const matMulNBits = (context: ComputeContext, attributes: MatMulNBitsAttributes): void => {\n validateInputs(context.inputs, attributes);\n const maxComputeWorkgroupSizes: [number, number, number] = context.getMaxComputeWorkgroupSizes();\n const maxComputeWorkgroupStorageSize = context.getMaxComputeWorkgroupStoragesize();\n context.compute(createMatMulNBitsProgramInfo(\n context.inputs, attributes, maxComputeWorkgroupSizes, maxComputeWorkgroupStorageSize));\n};\n\nexport const parseMatMulNBitsAttributes = (attributes: Record): MatMulNBitsAttributes =>\n createAttributeWithCacheKey(attributes as Omit);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper, UniformDataElementType, UniformsArrayType} from './common';\n\ninterface PadAttributes {\n // 0-constant, 1-reflect, 2-edge, 3-wrap\n readonly mode: number;\n readonly value: number;\n readonly pads: number[];\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('Too few inputs');\n }\n if (inputs[0].dataType !== DataType.float && inputs[0].dataType !== DataType.float16) {\n throw new Error('Input type must be float or float16.');\n }\n\n if (inputs.length >= 2) {\n let validPads = inputs[0].dims.length * 2 === inputs[1].dims[0];\n if (inputs.length === 4) {\n validPads = inputs[3].dims[0] * 2 === inputs[1].dims[0];\n }\n if (!validPads) {\n throw new Error('The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].');\n }\n }\n};\n\nconst getPadConstant = (output: IndicesHelper, inputRank: number, padsLength: number): string => {\n let block = '';\n for (let i = inputRank - 1; i >= 0; --i) {\n block += `\n k = i32(${output.indicesGet('indices', i)}) - ${getElementAt('uniforms.pads', i, padsLength)};\n if (k < 0) {\n break;\n }\n if (k >= i32(${getElementAt('uniforms.x_shape', i, inputRank)})) {\n break;\n }\n offset += k * i32(${getElementAt('uniforms.x_strides', i, inputRank)});\n `;\n }\n\n return `\n value = ${output.type.value}(uniforms.constant_value);\n for (var i = 0; i < 1; i++) {\n var offset = 0;\n var k = 0;\n ${block}\n value = x[offset];\n }\n `;\n};\n\nconst getPadReflect = (output: IndicesHelper, inputRank: number, padsLength: number): string => {\n let block = '';\n for (let i = inputRank - 1; i >= 0; --i) {\n block += `\n k = i32(${output.indicesGet('indices', i)}) - ${getElementAt('uniforms.pads', i, padsLength)};\n if (k < 0) {\n k = -k;\n }\n {\n let _2n_1 = 2 * (i32(${getElementAt('uniforms.x_shape', i, inputRank)}) - 1);\n k = k % _2n_1;\n if(k >= i32(${getElementAt('uniforms.x_shape', i, inputRank)})) {\n k = _2n_1 - k;\n }\n }\n offset += k * i32(${getElementAt('uniforms.x_strides', i, inputRank)});\n `;\n }\n\n return `\n var offset = 0;\n var k = 0;\n ${block}\n value = x[offset];\n `;\n};\n\nconst getPadEdge = (output: IndicesHelper, inputRank: number, padsLength: number): string => {\n let block = '';\n for (let i = inputRank - 1; i >= 0; --i) {\n block += `\n k = i32(${output.indicesGet('indices', i)}) - ${getElementAt('uniforms.pads', i, padsLength)};\n if (k < 0) {\n k = 0;\n }\n if (k >= i32(${getElementAt('uniforms.x_shape', i, inputRank)})) {\n k = i32(${getElementAt('uniforms.x_shape', i, inputRank)}) - 1;\n }\n offset += k * i32(${getElementAt('uniforms.x_strides', i, inputRank)});\n `;\n }\n\n return `\n var offset = 0;\n var k = 0;\n ${block}\n value = x[offset];\n `;\n};\n\nconst getPadWrap = (output: IndicesHelper, inputRank: number, padsLength: number): string => {\n let block = '';\n for (let i = inputRank - 1; i >= 0; --i) {\n block += `\n k = i32(${output.indicesGet('indices', i)}) - ${getElementAt('uniforms.pads', i, padsLength)};\n if (k < 0) {\n k += i32(${getElementAt('uniforms.x_shape', i, inputRank)}]);\n }\n if (k >= i32(${getElementAt('uniforms.x_shape', i, inputRank)})) {\n k -= i32(${getElementAt('uniforms.x_shape', i, inputRank)});\n }\n offset += k * i32(${getElementAt('uniforms.x_strides', i, inputRank)});\n `;\n }\n\n return `\n var offset = 0;\n var k = 0;\n ${block}\n value = x[offset];\n `;\n};\n\nconst getPadSnippet = (output: IndicesHelper, inputRank: number, attributes: PadAttributes): string => {\n switch (attributes.mode) {\n case 0:\n return getPadConstant(output, inputRank, attributes.pads.length);\n case 1:\n return getPadReflect(output, inputRank, attributes.pads.length);\n case 2:\n return getPadEdge(output, inputRank, attributes.pads.length);\n case 3:\n return getPadWrap(output, inputRank, attributes.pads.length);\n default:\n throw new Error('Invalid mode');\n }\n};\n\nconst createPadProgramInfo = (inputs: readonly TensorView[], attributes: PadAttributes): ProgramInfo => {\n const outputShape = ShapeUtil.padShape(inputs[0].dims.slice(), attributes.pads);\n const inputDims = inputs[0].dims;\n const outputSize = ShapeUtil.size(outputShape);\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: outputSize}, {type: DataType.int32, data: attributes.pads}];\n if (attributes.mode === 0) {\n programUniforms.push({type: inputs[0].dataType, data: attributes.value});\n }\n\n programUniforms.push(...createTensorShapeVariables(inputs[0].dims, outputShape));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank'];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('output', inputs[0].dataType, outputShape.length);\n const input = inputVariable('x', inputs[0].dataType, inputDims.length);\n const dataType = input.type.value;\n const padSnippet = getPadSnippet(output, inputDims.length, attributes);\n const uniforms: UniformsArrayType =\n [{name: 'output_size', type: 'u32'}, {name: 'pads', type: 'i32', length: attributes.pads.length}];\n if (attributes.mode === 0) {\n uniforms.push({name: 'constant_value', type: dataType as UniformDataElementType});\n }\n\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let indices = ${output.offsetToIndices('global_idx')};\n\n var value = ${dataType}(0);\n ${padSnippet}\n output[global_idx] = value;\n }`;\n };\n\n return {\n name: 'Pad',\n shaderCache: {hint: `${attributes.mode}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(ShapeUtil.size(outputShape) / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n};\n\nconst createPadAttributesFromInputs = (inputs: readonly TensorView[], attributes: PadAttributes): PadAttributes => {\n if (inputs.length > 1) {\n const bigInt64Pads = inputs[1].getBigInt64Array();\n const value = (inputs.length >= 3 && inputs[2].data) ? inputs[2].getFloat32Array()[0] : 0.0;\n\n const inputRank = inputs[0].dims.length;\n const updatePads = new Int32Array(2 * inputRank).fill(0);\n if (inputs.length >= 4) {\n const axes = inputs[3].getBigInt64Array();\n for (let i = 0; i < axes.length; i++) {\n updatePads[Number(axes[i])] = Number(bigInt64Pads[i]);\n updatePads[Number(axes[i]) + inputRank] = Number(bigInt64Pads[i + axes.length]);\n }\n } else {\n bigInt64Pads.forEach((v, i) => updatePads[Number(i)] = (Number(v)));\n }\n\n const pads: number[] = [];\n updatePads.forEach(v => pads.push(v));\n\n return {mode: attributes.mode, value, pads};\n } else {\n return attributes;\n }\n};\n\nexport const pad = (context: ComputeContext, attributes: PadAttributes): void => {\n validateInputs(context.inputs);\n const updatedAttributes = createPadAttributesFromInputs(context.inputs, attributes);\n context.compute(createPadProgramInfo(context.inputs, updatedAttributes), {inputs: [0]});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {PoolConvUtil, ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\n\n// TODO: support:\n// - ceil_mode \"test_maxpool_2d_ceil\"\n// - storage_order \"test_maxpool_with_argmax_2d_precomputed_strides\"\n// - [MaxPool] dilations \"test_maxpool_2d_dilations\"\n// - [MaxPool] output[1] \"test_maxpool_with_argmax_2d_precomputed_pads\"\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (env.webgpu.validateInputContent && (!inputs || inputs.length !== 1)) {\n throw new Error('Pool ops requires 1 input.');\n }\n};\n\nconst getAdjustedPoolAttributesAndOutputShape = (\n input: TensorView, attributes: AttributeType, isGlobalOperator: boolean): [AttributeType, number[]] => {\n const isChannelsLast = attributes.format === 'NHWC';\n const inputShapeAsChannelFirst = input.dims.slice();\n if (isChannelsLast) {\n inputShapeAsChannelFirst.splice(1, 0, inputShapeAsChannelFirst.pop()!); // Move channel to the second position.\n }\n const hasDilations = Object.hasOwnProperty.call(attributes, 'dilations');\n const kernelShape = attributes.kernelShape.slice();\n const strides = attributes.strides.slice();\n const dilations: number[] = hasDilations ? (attributes as MaxPoolAttributes).dilations.slice() : [];\n const pads = attributes.pads.slice();\n PoolConvUtil.adjustPoolAttributes(isGlobalOperator, inputShapeAsChannelFirst, kernelShape, strides, dilations, pads);\n\n const outputShapeAsChannelFirst = PoolConvUtil.computePoolOutputShape(\n isGlobalOperator, inputShapeAsChannelFirst, strides, dilations, kernelShape, pads, attributes.autoPad);\n\n const newAttributes = Object.assign({}, attributes);\n if (hasDilations) {\n Object.assign(newAttributes, {kernelShape, strides, pads, dilations, cacheKey: attributes.cacheKey});\n } else {\n Object.assign(newAttributes, {kernelShape, strides, pads, cacheKey: attributes.cacheKey});\n }\n const outputShapeAsChannelLast = outputShapeAsChannelFirst.slice();\n outputShapeAsChannelLast.push(outputShapeAsChannelLast.splice(1, 1)[0]);\n return [newAttributes, isChannelsLast ? outputShapeAsChannelLast : outputShapeAsChannelFirst];\n};\n\nconst getUniformAndPadInfo = (\n outputShape: readonly number[],\n attributes: AttributeType): [ProgramUniform[], UniformsArrayType, boolean, boolean, boolean] => {\n const isChannelsLast = attributes.format === 'NHWC';\n const outputSize = ShapeUtil.size(outputShape);\n const kernelSize = ShapeUtil.size(attributes.kernelShape);\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: kernelSize}];\n const uniforms: UniformsArrayType = [{name: 'outputSize', type: 'u32'}, {name: 'kernelSize', type: 'u32'}];\n if (attributes.kernelShape.length <= 2) {\n const kw = attributes.kernelShape[attributes.kernelShape.length - 1];\n const sw = attributes.strides[attributes.strides.length - 1];\n const pwStart = attributes.pads[attributes.pads.length / 2 - 1];\n const pwEnd = attributes.pads[attributes.pads.length - 1];\n const pwStartEndNotZero = !!(pwStart + pwEnd);\n programUniforms.push(\n {type: DataType.uint32, data: kw},\n {type: DataType.uint32, data: sw},\n {type: DataType.uint32, data: pwStart},\n {type: DataType.uint32, data: pwEnd},\n );\n uniforms.push(\n {name: 'kw', type: 'u32'}, {name: 'sw', type: 'u32'}, {name: 'pwStart', type: 'u32'},\n {name: 'pwEnd', type: 'u32'});\n\n let phStartEndNotZero = false;\n if (attributes.kernelShape.length === 2) {\n const kh = attributes.kernelShape[attributes.kernelShape.length - 2];\n const sh = attributes.strides[attributes.strides.length - 2];\n const phStart = attributes.pads[attributes.pads.length / 2 - 2];\n const phEnd = attributes.pads[attributes.pads.length - 2];\n phStartEndNotZero = !!(phStart + phEnd);\n programUniforms.push(\n {type: DataType.uint32, data: kh}, {type: DataType.uint32, data: sh}, {type: DataType.uint32, data: phStart},\n {type: DataType.uint32, data: phEnd});\n\n uniforms.push(\n {name: 'kh', type: 'u32'}, {name: 'sh', type: 'u32'}, {name: 'phStart', type: 'u32'},\n {name: 'phEnd', type: 'u32'});\n }\n return [programUniforms, uniforms, true, pwStartEndNotZero, phStartEndNotZero];\n } else {\n if (isChannelsLast) {\n throw new Error('Pooling with kernelShape.length > 2 is not supported for NHWC format.');\n }\n const kernelStrides = ShapeUtil.computeStrides(attributes.kernelShape);\n programUniforms.push(\n {type: DataType.uint32, data: kernelStrides}, {type: DataType.uint32, data: attributes.pads},\n {type: DataType.uint32, data: attributes.strides});\n uniforms.push(\n {name: 'kernelStrides', type: 'u32', length: kernelStrides.length},\n {name: 'pads', type: 'u32', length: attributes.pads.length},\n {name: 'strides', type: 'u32', length: attributes.strides.length});\n\n const hasPads = attributes.pads.reduce((sum, cur) => sum + cur);\n return [programUniforms, uniforms, !!hasPads, false, false];\n }\n};\n\nconst generatePoolingCode = (\n shaderHelper: ShaderHelper, x: IndicesHelper, rank: number, outputShapeRank: number, attributes: AttributeType,\n op1: string, op2: string, start: number, uniforms: UniformsArrayType, hasPads: boolean, pwStartEndNotZero: boolean,\n phStartEndNotZero: boolean): string => {\n const isChannelsLast = attributes.format === 'NHWC';\n const dataType = x.type.value;\n const output = outputVariable('output', x.type.tensor, outputShapeRank);\n\n if (attributes.kernelShape.length <= 2) {\n let codeW = '';\n let codeH = '';\n let codeHEnd = '';\n const dimIdxW = rank - (isChannelsLast ? 2 : 1);\n if (pwStartEndNotZero) {\n codeW = `\n for (var i: u32 = 0u; i < uniforms.kw; i++) {\n xIndices[${dimIdxW}] = indices[${dimIdxW}] * uniforms.sw - uniforms.pwStart + i;\n if (xIndices[${dimIdxW}] < 0 || xIndices[${dimIdxW}]\n >= uniforms.x_shape[${dimIdxW}]) {\n pad++;\n continue;\n }\n let x_val = x[${x.indicesToOffset('xIndices')}];\n ${op1}\n }`;\n } else {\n codeW = `\n for (var i: u32 = 0u; i < uniforms.kw; i++) {\n xIndices[${dimIdxW}] = indices[${dimIdxW}] * uniforms.sw - uniforms.pwStart + i;\n let x_val = x[${x.indicesToOffset('xIndices')}];\n ${op1}\n }`;\n }\n\n if (attributes.kernelShape.length === 2) {\n const dimIdxH = rank - (isChannelsLast ? 3 : 2);\n if (phStartEndNotZero) {\n codeH = `\n for (var j: u32 = 0u; j < uniforms.kh; j++) {\n xIndices[${dimIdxH}] = indices[${dimIdxH}] * uniforms.sh - uniforms.phStart + j;\n if (xIndices[${dimIdxH}] < 0 || xIndices[${dimIdxH}] >= uniforms.x_shape[${dimIdxH}]) {\n pad += i32(uniforms.kw);\n continue;\n }\n `;\n } else {\n codeH = `\n for (var j: u32 = 0u; j < uniforms.kh; j++) {\n xIndices[${dimIdxH}] = indices[${dimIdxH}] * uniforms.sh - uniforms.phStart + j;\n `;\n }\n codeHEnd = `\n }\n `;\n }\n\n const poolingCode = `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(x, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n\n let indices = ${output.offsetToIndices('global_idx')};\n var xIndices = ${output.offsetToIndices('global_idx')};\n\n var value = ${dataType}(${start});\n var pad = 0;\n ${codeH}\n ${codeW}\n ${codeHEnd}\n ${op2}\n\n output[global_idx] = value;\n }`;\n return poolingCode;\n } else {\n if (isChannelsLast) {\n throw new Error('Pooling with kernelShape.length > 2 is not supported for NHWC format.');\n }\n const stridesRank = attributes.kernelShape.length;\n const padsRank = attributes.pads.length;\n let padCode = '';\n if (hasPads) {\n padCode = `\n if (xIndices[j] >= uniforms.x_shape[j]) {\n pad++;\n isPad = true;\n break;\n }\n }\n if (!isPad) {\n let x_val = x[${x.indicesToOffset('xIndices')}];\n ${op1}\n }`;\n } else {\n padCode = `\n }\n let x_val = x[${x.indicesToOffset('xIndices')}];\n ${op1}\n `;\n }\n const poolingCode = `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(x, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n let indices = ${output.offsetToIndices('global_idx')};\n var xIndices = ${output.offsetToIndices('global_idx')};\n\n var offsets: array;\n\n var value = ${dataType}(${start});\n var pad = 0;\n var isPad = false;\n\n for (var i: u32 = 0u; i < uniforms.kernelSize; i++) {\n var offset = i;\n for (var j = 0u; j < ${stridesRank - 1}u; j++) {\n offsets[j] = offset / ${getElementAt('uniforms.kernelStrides', 'j', stridesRank)};\n offset -= offsets[j] * ${getElementAt('uniforms.kernelStrides', 'j', stridesRank)};\n }\n offsets[${stridesRank - 1}] = offset;\n\n isPad = false;\n for (var j = ${rank - stridesRank}u; j < ${rank}u; j++) {\n xIndices[j] = indices[j] * ${\n getElementAt('uniforms.strides', `j - ${rank - stridesRank}u`, stridesRank)}\n + offsets[j - ${rank - stridesRank}u] - ${getElementAt('uniforms.pads', 'j - 2u', padsRank)};\n ${padCode}\n }\n ${op2}\n\n output[global_idx] = value;\n }`;\n return poolingCode;\n }\n};\n\nexport interface FormatAttributes {\n readonly format: 'NHWC'|'NCHW';\n}\n\nexport interface PoolCommonAttributes extends FormatAttributes {\n readonly autoPad: string;\n readonly ceilMode: number;\n readonly kernelShape: readonly number[];\n readonly strides: readonly number[];\n readonly pads: readonly number[];\n}\n\nconst createShaderKeyFromAttributes = (attributes: PoolCommonAttributes): string =>\n (`${attributes.format};${attributes.ceilMode};${attributes.autoPad};${attributes.kernelShape.length}`);\n\nconst createAveragePoolShaderKeyFromAttributes = (attributes: AveragePoolAttributes): string =>\n (`${createShaderKeyFromAttributes(attributes)};${attributes.countIncludePad}`);\n\nconst createMaxPoolShaderKeyFromAttributes = (attributes: MaxPoolAttributes): string =>\n (`${createShaderKeyFromAttributes(attributes)};${attributes.storageOrder};${attributes.dilations}`);\n\nconst parsePoolCommonAttributes = (attributes: Record): PoolCommonAttributes => ({\n format: attributes.format as FormatAttributes['format'],\n autoPad: ['NOTSET', 'VALID', 'SAME_UPPER', 'SAME_LOWER'][attributes.auto_pad as number],\n ceilMode: attributes.ceil_mode as number,\n kernelShape: attributes.kernel_shape as [number, number],\n strides: attributes.strides as [number, number],\n pads: attributes.pads as [number, number, number, number]\n});\n\nexport interface AveragePoolAttributes extends PoolCommonAttributes, AttributeWithCacheKey {\n readonly countIncludePad: boolean;\n}\n\nconst createAveragePoolProgramInfo =\n (name: string, input: TensorView, isGlobalOperator: boolean, attributes: AveragePoolAttributes): ProgramInfo => {\n const [adjustedAttributes, outputShape] =\n getAdjustedPoolAttributesAndOutputShape(input, attributes, isGlobalOperator);\n const x = inputVariable('x', input.dataType, input.dims.length);\n const dataType = x.type.value;\n\n const op1 = 'value += x_val;';\n let op2 = '';\n if (adjustedAttributes.countIncludePad) {\n op2 += `value /= ${dataType}(uniforms.kernelSize);`;\n } else {\n op2 += `value /= ${dataType}(i32(uniforms.kernelSize) - pad);`;\n }\n const [programUniforms, uniforms, hasPads, pwStartEndNotZero, phStartEndNotZero] =\n getUniformAndPadInfo(outputShape, adjustedAttributes);\n programUniforms.push(...createTensorShapeVariables(input.dims, outputShape));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank'];\n return {\n name,\n shaderCache:\n {hint: `${attributes.cacheKey};${hasPads};${pwStartEndNotZero};${phStartEndNotZero}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: input.dataType}],\n dispatchGroup: {x: Math.ceil(ShapeUtil.size(outputShape) / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource: shaderHelper => generatePoolingCode(\n shaderHelper, x, input.dims.length, outputShape.length, adjustedAttributes, op1, op2, 0.0, uniforms,\n hasPads, pwStartEndNotZero, phStartEndNotZero),\n };\n };\n\nexport const parseAveragePoolAttributes = (attributes: Record): AveragePoolAttributes => {\n const countIncludePad = (attributes.count_include_pad as number) === 0 ? false : true;\n\n const attr = parsePoolCommonAttributes(attributes);\n // TODO: support attribute 'ceil_mode'\n if (attr.ceilMode !== 0) {\n throw new Error('using ceil() in shape computation is not yet supported for AveragePool');\n }\n const averagePoolAttributes = {countIncludePad, ...attr, cacheKey: ''};\n return {...averagePoolAttributes, cacheKey: createAveragePoolShaderKeyFromAttributes(averagePoolAttributes)};\n};\n\nexport const averagePool = (context: ComputeContext, attributes: AveragePoolAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createAveragePoolProgramInfo('AveragePool', context.inputs[0], false, attributes));\n};\n\nconst globalPoolAttributes = {\n autoPad: '',\n ceilMode: 0,\n countIncludePad: false,\n kernelShape: [],\n strides: [],\n pads: [],\n storageOrder: 0,\n dilations: []\n};\n\nexport const parseGlobalAveragePoolAttributes = (attributes: Record): AveragePoolAttributes => {\n const format = attributes.format as FormatAttributes['format'];\n return {format, ...globalPoolAttributes, cacheKey: format};\n};\n\nexport const globalAveragePool = (context: ComputeContext, attributes: AveragePoolAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createAveragePoolProgramInfo('GlobalAveragePool', context.inputs[0], true, attributes));\n};\n\nexport interface MaxPoolAttributes extends PoolCommonAttributes, AttributeWithCacheKey {\n readonly storageOrder: number;\n readonly dilations: number[];\n}\n\nconst createMaxPoolProgramInfo =\n (name: string, input: TensorView, isGlobalOperator: boolean, attributes: MaxPoolAttributes): ProgramInfo => {\n const [adjustedAttributes, outputShape] =\n getAdjustedPoolAttributesAndOutputShape(input, attributes, isGlobalOperator);\n const op1 = `\n value = max(x_val, value);\n `;\n const op2 = '';\n const x = inputVariable('x', input.dataType, input.dims.length);\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank'];\n const [programUniforms, uniforms, hasPads, pwStartEndNotZero, phStartEndNotZero] =\n getUniformAndPadInfo(outputShape, adjustedAttributes);\n programUniforms.push(...createTensorShapeVariables(input.dims, outputShape));\n return {\n name,\n shaderCache:\n {hint: `${attributes.cacheKey};${hasPads};${pwStartEndNotZero};${phStartEndNotZero}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: input.dataType}],\n dispatchGroup: {x: Math.ceil(ShapeUtil.size(outputShape) / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource: shaderHelper => generatePoolingCode(\n shaderHelper, x, input.dims.length, outputShape.length, adjustedAttributes, op1, op2,\n (input.dataType === DataType.float16) ? -65504 : -1e5, uniforms, hasPads, pwStartEndNotZero,\n phStartEndNotZero),\n };\n };\n\nexport const maxPool = (context: ComputeContext, attributes: MaxPoolAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createMaxPoolProgramInfo('MaxPool', context.inputs[0], false, attributes));\n};\n\nexport const parseMaxPoolAttributes = (attributes: Record): MaxPoolAttributes => {\n const storageOrder = attributes.storage_order as number;\n const dilations = attributes.dilations as [number, number];\n\n const attr = parsePoolCommonAttributes(attributes);\n // TODO: support attribute 'ceil_mode' and 'storage_order'\n if (storageOrder !== 0) {\n throw new Error('column major storage order is not yet supported for MaxPool');\n }\n if (attr.ceilMode !== 0) {\n throw new Error('using ceil() in shape computation is not yet supported for MaxPool');\n }\n const maxPoolAttributes = {storageOrder, dilations, ...attr, cacheKey: ''};\n return {...maxPoolAttributes, cacheKey: createMaxPoolShaderKeyFromAttributes(maxPoolAttributes)};\n};\n\nexport const parseGlobalMaxPoolAttributes = (attributes: Record): MaxPoolAttributes => {\n const format = attributes.format as FormatAttributes['format'];\n return {format, ...globalPoolAttributes, cacheKey: format};\n};\n\nexport const globalMaxPool = (context: ComputeContext, attributes: MaxPoolAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createMaxPoolProgramInfo('GlobalMaxPool', context.inputs[0], true, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport {DataType} from '../../../wasm-common';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, outputVariable, ShaderHelper, UniformDataElementType, UniformsArrayType} from './common';\n\nconst validateInputsContent = (start: number, limit: number, delta: number): void => {\n const sameStartLimit = start === limit;\n const increasingRangeNegativeStep = start < limit && delta < 0;\n const decreasingRangePositiveStep = start > limit && delta > 0;\n\n if (sameStartLimit || increasingRangeNegativeStep || decreasingRangePositiveStep) {\n throw new Error('Range these inputs\\' contents are invalid.');\n }\n};\n\nconst createRangeProgramInfo = (start: number, limit: number, delta: number, dataType: DataType): ProgramInfo => {\n const numElements = Math.abs(Math.ceil((limit - start) / delta));\n const outputShape: number[] = [numElements];\n const outputSize = numElements;\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: dataType, data: start}, {type: dataType, data: delta},\n ...createTensorShapeVariables(outputShape)\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('output', dataType, outputShape.length);\n const wgslType = output.type.value;\n const uniforms: UniformsArrayType = [\n {name: 'outputSize', type: 'u32'}, {name: 'start', type: wgslType as UniformDataElementType},\n {name: 'delta', type: wgslType as UniformDataElementType}\n ];\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n output[global_idx] = uniforms.start + ${wgslType}(global_idx) * uniforms.delta;\n }`;\n };\n\n return {\n name: 'Range',\n shaderCache: {hint: `${dataType}`},\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n })\n };\n};\n\nexport const range = (context: ComputeContext): void => {\n let start = 0;\n let limit = 0;\n let delta = 0;\n if (context.inputs[0].dataType === DataType.int32) {\n start = context.inputs[0].getInt32Array()[0];\n limit = context.inputs[1].getInt32Array()[0];\n delta = context.inputs[2].getInt32Array()[0];\n } else if (context.inputs[0].dataType === DataType.float) {\n start = context.inputs[0].getFloat32Array()[0];\n limit = context.inputs[1].getFloat32Array()[0];\n delta = context.inputs[2].getFloat32Array()[0];\n }\n if (env.webgpu.validateInputContent) {\n validateInputsContent(start, limit, delta);\n }\n\n context.compute(createRangeProgramInfo(start, limit, delta, context.inputs[0].dataType), {inputs: []});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\ntype CoordinateTransformMode = 'half_pixel'|'asymmetric'|'pytorch_half_pixel'|'tf_half_pixel_for_nn'|'align_corners'|\n 'tf_crop_and_resize'|'half_pixel_symmetric';\n\ntype KeepAspectRatioPolicy = 'stretch'|'not_smaller'|'not_larger';\n\ntype Mode = 'nearest'|'linear'|'cubic';\n\ntype NearestMode = 'round_prefer_floor'|'round_prefer_ceil'|'floor'|'ceil'|'simple';\n\nexport interface ResizeAttributes extends AttributeWithCacheKey {\n antialias: number;\n axes: number[];\n coordinateTransformMode: CoordinateTransformMode;\n cubicCoeffA: number;\n excludeOutside: boolean;\n extrapolationValue: number;\n keepAspectRatioPolicy: KeepAspectRatioPolicy;\n mode: Mode;\n nearestMode: NearestMode;\n}\n\nconst validateScales = (scales: number[], attributes: ResizeAttributes): void => {\n scales.every((value) => value > 0 || (() => {\n throw new Error('Resize requires scales input values to be positive');\n }));\n // Check scales dims based on mode: LINEAR, CUBIC\n if (scales.length > 0) {\n if (attributes.mode === 'linear') {\n if (!(scales.length === 2 || scales.length === 3 || (scales.length === 4 && scales[0] === 1 && scales[1] === 1) ||\n (scales.length === 4 && scales[0] === 1 && scales[3] === 1) ||\n (scales.length === 5 && scales[0] === 1 && scales[1] === 1))) {\n throw new Error(\n `For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and\n one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`);\n }\n } else if (attributes.mode === 'cubic') {\n if (!(scales.length === 2 || (scales.length === 4 && scales[0] === 1 && scales[1] === 1) ||\n (scales.length === 4 && scales[0] === 1 && scales[3] === 1))) {\n throw new Error('Resize requires scales input size to be 2 or 4 for cubic mode');\n }\n }\n }\n};\n\nconst updateScales = (scales: readonly number[], axes: readonly number[], rank: number): number[] => {\n axes.every((value) => value >= 0 && value < rank || (() => {\n throw new Error('Resize requires axes input values to be positive and less than rank');\n }));\n const newScales = new Array(rank).fill(1.0);\n axes.forEach((value, index) => newScales[value] = scales[index]);\n return newScales;\n};\n\nconst validateInputs =\n (inputs: readonly TensorView[], attributes: ResizeAttributes, opsetVersion: number, scales: number[],\n sizes: number[], roi: number[]): void => {\n const [roiInputIndex, scalesInputIndex, sizesInputIndex] =\n (opsetVersion > 10) ? [1, 2, 3] : [-1, (inputs.length > 1) ? 1 : -1, -1];\n const rank = inputs[0].dims.length;\n if (roiInputIndex > 0 && inputs.length > roiInputIndex && inputs[roiInputIndex].dims.length > 0) {\n inputs[roiInputIndex].getFloat32Array().forEach((value) => roi.push(value));\n } else if (attributes.coordinateTransformMode === 'tf_crop_and_resize') {\n throw new Error('Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize');\n }\n\n if (scalesInputIndex > 0 && inputs.length > scalesInputIndex && inputs[scalesInputIndex].dims.length > 0) {\n inputs[scalesInputIndex].getFloat32Array().forEach((value) => scales.push(value));\n if (scales.length !== 0 &&\n (scales.length !== rank && (opsetVersion >= 18 && scales.length !== attributes.axes.length))) {\n throw new Error(\n 'Resize requires scales input size to be same as input rank or axes size for opset 18 and up');\n }\n validateScales(scales, attributes);\n if (attributes.axes.length > 0) {\n updateScales(scales, attributes.axes, rank).forEach((value, index) => scales[index] = value);\n }\n }\n if (sizesInputIndex > 0 && inputs.length > sizesInputIndex) {\n inputs[sizesInputIndex].getBigInt64Array().forEach((value) => sizes.push(Number(value)));\n if (sizes.length !== rank || (opsetVersion >= 18 && sizes.length === attributes.axes.length)) {\n throw new Error('Resize requires sizes input size to be same as input rank or axes size for opset 18 and up');\n }\n }\n\n if (attributes.axes.length > 0) {\n if (scales.length !== attributes.axes.length) {\n throw new Error('Resize requires \"scales\" input size to be of axes rank when axes attributes is specified');\n }\n if (sizes.length !== attributes.axes.length) {\n throw new Error(\n 'Resize requires \"sizes\" input size to be of rank axes rank when axes attributes is specified');\n }\n }\n if (typeof scales !== 'undefined' && typeof sizes !== 'undefined' && scales.length > 0 && sizes.length > rank) {\n throw new Error('Resize requires only of scales or sizes to be specified');\n }\n };\n\nconst getOriginalCoordinateFromResizedCoordinate =\n (coordinateTransferMode: CoordinateTransformMode, dType: string): string =>\n `fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32,\n lengthOriginal: u32, roiStart: f32, roiEnd: f32) -> ${dType} { ` +\n (() => {\n switch (coordinateTransferMode) {\n case 'asymmetric':\n return `return ${dType}(xResized) / ${dType}(xScale);`;\n case 'pytorch_half_pixel':\n return `if (lengthResized > 1) {\n return (${dType}(xResized) + 0.5) / ${dType}(xScale) - 0.5;\n } else {\n return 0.0;\n }`;\n case 'tf_half_pixel_for_nn':\n return `return (${dType}(xResized) + 0.5) / ${dType}(xScale);`;\n case 'align_corners':\n return `if (lengthResized == 1) {\n return 0.0;\n } else {\n // The whole part and the fractional part are calculated separately due to inaccuracy of floating\n // point division. As an example, f32(21) / f32(7) may evaluate to 2.99... instead of 3, causing an\n // offset-by-one error later in floor().\n let whole = ${dType}(xResized * (lengthOriginal - 1) / (lengthResized - 1));\n let fract =\n ${dType}(xResized * (lengthOriginal - 1) % (lengthResized - 1)) / ${dType}(lengthResized - 1);\n return whole + fract;\n }`;\n case 'tf_crop_and_resize':\n return `if (lengthResized > 1) {\n return ${dType}(roiStart) * ${dType}(lengthOriginal - 1) +\n (${dType}(xResized) * ${dType}(roiEnd - roiStart) * ${dType}(lengthOriginal - 1)) /\n ${dType}(lengthResized - 1);\n } else {\n return 0.5 * ${dType}(roiStart + roiEnd) * ${dType}(lengthOriginal - 1);\n }`;\n case 'half_pixel_symmetric':\n return `const outputWidth = ${dType}xScale * ${dType}(lengthResized);\n const adjustment = ${dType}(lengthResized) / outputWidth;\n const center = ${dType}(lengthOriginal) / 2;\n const offset = center * (1 - adjustment);\n return offset + ((${dType}(xResized) + 0.5) / ${dType}(xScale)) - 0.5;`;\n case 'half_pixel':\n return `return ((${dType}(xResized) + 0.5) / ${dType}(xScale)) - 0.5;`;\n default:\n throw new Error(`Coordinate transform mode ${coordinateTransferMode} is not supported`);\n }\n })() +\n '}';\n\nconst getNearestPixelFromOriginal = (nearestMode: NearestMode, opsetVersion: number, dType: string): string =>\n `fn getNearestPixelFromOriginal(xOriginal: ${dType}, isDownSample: bool) -> ${dType} {` + (() => {\n switch (nearestMode) {\n case 'round_prefer_ceil':\n return 'if (fract(xOriginal) == 0.5) { \\\n return ceil(xOriginal); \\\n } else { \\\n return round(xOriginal); \\\n }';\n case 'floor':\n return 'return floor(xOriginal);';\n case 'ceil':\n return 'return ceil(xOriginal);';\n case 'round_prefer_floor':\n return 'if (fract(xOriginal) == 0.5) { \\\n return floor(xOriginal); \\\n } else { \\\n return round(xOriginal); \\\n }';\n case 'simple':\n default:\n if (opsetVersion < 11) {\n return 'if (isDownSample) \\\n { \\\n return ceil(xOriginal); \\\n } else { \\\n return xOriginal; \\\n }';\n }\n throw new Error(`Nearest mode ${nearestMode} is not supported`);\n }\n })() +\n '}';\n\nconst updateRoI = (roi: readonly number[], axes: readonly number[], rank: number): number[] => {\n const roiTmp = new Array(rank).fill(0).concat(new Array(rank).fill(1));\n const roiLocal = roi.length === 0 ? roiTmp : roi.slice();\n if (axes.length > 0) {\n axes.forEach((v, i) => {\n roiTmp[v] = roiLocal[i];\n roiTmp[i + rank] = roiLocal[axes.length + i];\n });\n return roiTmp;\n }\n return roiLocal;\n};\n\nconst initOutputShape =\n (inputShape: readonly number[], scales: readonly number[], sizes: readonly number[], axes: readonly number[]):\n number[] => {\n let outputShape: number[] = [];\n if (sizes.length > 0) {\n if (axes.length > 0) {\n inputShape.forEach((v) => outputShape.push(v));\n if (Math.max(...axes) > inputShape.length) {\n throw new Error('axes is out of bound');\n }\n axes.forEach((v, i) => outputShape[v] = sizes[i]);\n } else {\n sizes.forEach((v) => outputShape.push(v));\n }\n } else {\n if (scales.length === 0) {\n throw new Error('Resize requires either scales or sizes.');\n } else {\n outputShape = inputShape.map((value, index) => Math.round(value * scales[index]));\n }\n }\n return outputShape;\n };\n\nconst adjustOutputShape = (inputShape: readonly number[], scales: number[], attributes: ResizeAttributes) => {\n const scaleInPolicy = (() => {\n switch (attributes.keepAspectRatioPolicy) {\n case 'not_larger':\n return attributes.axes.length > 0 ? Math.min(...attributes.axes.map(i => scales[i]), Number.MAX_VALUE) :\n Math.min(...scales, Number.MAX_VALUE);\n case 'not_smaller':\n return attributes.axes.length > 0 ? Math.max(...attributes.axes.map(i => scales[i]), Number.MIN_VALUE) :\n Math.max(...scales, Number.MIN_VALUE);\n default:\n throw new Error(`Keep aspect ratio policy ${attributes.keepAspectRatioPolicy} is not supported`);\n }\n })();\n scales.fill(1.0, 0, scales.length);\n const adjustedOutputShape = inputShape.slice();\n if (attributes.axes.length > 0) {\n attributes.axes.forEach((v) => scales[v] = scaleInPolicy);\n attributes.axes.forEach((v) => adjustedOutputShape[v] = Math.round(inputShape[v] * scales[v]));\n } else {\n scales.fill(scaleInPolicy, 0, scales.length);\n adjustedOutputShape.forEach((v, i) => adjustedOutputShape[i] = Math.round(v * scales[i]));\n }\n return adjustedOutputShape;\n};\n\nconst calculateOriginalIndicesFromOutputIndices =\n (output: IndicesHelper, inputShape: readonly number[], outputShape: readonly number[], scalesLength: number,\n roiLength: number): string => `\n fn calculateOriginalIndicesFromOutputIndices(output_indices: ${output.type.indices}) -> array<${\n output.type.value}, ${outputShape.length}> {\n var original_indices: array<${output.type.value}, ${outputShape.length}>;\n for (var i:u32 = 0; i < ${outputShape.length}; i++) {\n var output_index = ${output.indicesGet('output_indices', 'i')};\n var scale = ${getElementAt('uniforms.scales', 'i', scalesLength)};\n var roi_low = ${getElementAt('uniforms.roi', 'i', roiLength)};\n var roi_hi = ${getElementAt('uniforms.roi', `i + ${inputShape.length}`, roiLength)};\n if (scale == 1.0) {\n original_indices[i] = ${output.type.value}(output_index);\n } else {\n var input_shape_i = ${getElementAt('uniforms.input_shape', 'i', inputShape.length)};\n var output_shape_i = ${getElementAt('uniforms.output_shape', 'i', outputShape.length)};\n original_indices[i] = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i,\n input_shape_i, roi_low, roi_hi);\n }\n }\n return original_indices;\n }`;\n\nconst calculateInputIndicesFromOutputIndices =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[], outputShape: readonly number[],\n scalesLength: number, roiLength: number, useExtrapolation: boolean): string => `\n fn calculateInputIndicesFromOutputIndices(output_indices: ${output.type.indices}) -> ${input.type.indices} {\n var input_indices: ${input.type.indices};\n for (var i:u32 = 0; i < ${outputShape.length}; i++) {\n var output_index = ${output.indicesGet('output_indices', 'i')};\n var input_index: u32;\n var scale = ${getElementAt('uniforms.scales', 'i', scalesLength)};\n if (scale == 1.0) {\n input_index = output_index;\n } else {\n var roi_low = ${getElementAt('uniforms.roi', 'i', roiLength)};\n var roi_hi = ${getElementAt('uniforms.roi', `i + ${inputShape.length}`, roiLength)};\n var input_shape_i = ${getElementAt('uniforms.input_shape', 'i', inputShape.length)};\n var output_shape_i = ${getElementAt('uniforms.output_shape', 'i', outputShape.length)};\n var original_idx = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i,\n input_shape_i, roi_low, roi_hi);\n if (!${useExtrapolation} || (original_idx >= 0 && original_idx < ${output.type.value}(input_shape_i))) {\n if (original_idx < 0) {\n input_index = 0;\n } else if (original_idx > ${output.type.value}(input_shape_i - 1)) {\n input_index = input_shape_i - 1;\n } else {\n input_index = u32(getNearestPixelFromOriginal(original_idx, scale < 1));\n }\n } else {\n input_index = u32(original_idx);\n }\n }\n ${input.indicesSet('input_indices', 'i', ' input_index')}\n }\n return input_indices;\n }`;\nconst checkInputIndices = (input: IndicesHelper, inputShape: readonly number[]): string => `\n fn checkInputIndices(input_indices: ${input.type.indices}) -> bool {\n for (var i:u32 = 0; i < ${inputShape.length}; i++) {\n var input_index = ${input.indicesGet('input_indices', 'i')};\n if (input_index < 0 || input_index >= ${getElementAt('uniforms.input_shape', 'i', inputShape.length)}) {\n return false;\n }\n }\n return true;\n }`;\n\nconst setChannelAndBatchIndices =\n (input: IndicesHelper, channelIdx: number, batchIdx: number, spacialDims: number): string =>\n input.rank > spacialDims ? `\n ${input.indicesSet('input_indices', channelIdx, 'channel')};\n ${input.indicesSet('input_indices', batchIdx, 'batch')};\n` :\n '';\n\nconst bilinearInterpolation =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[], useExtrapolation: boolean,\n extrapolationValue: number): string => {\n const isNchw = true;\n const [batchIdx, heightIdx, widthIdx, channelIdx] =\n inputShape.length === 2 ? [-1, 0, 1, -1] : (isNchw ? [0, 2, 3, 1] : [0, 1, 2, 3]);\n const dType = input.type.value;\n return `\n fn getInputValue(batch: u32, channel: u32, row: u32, col: u32) -> ${dType} {\n var input_indices: ${input.type.indices};\n ${input.indicesSet('input_indices', heightIdx, `max(0, min(row, ${inputShape[heightIdx]} - 1))`)};\n ${input.indicesSet('input_indices', widthIdx, `max(0, min(col, ${inputShape[widthIdx]} - 1))`)};\n ${setChannelAndBatchIndices(input, channelIdx, batchIdx, 2)}\n return ${input.getByIndices('input_indices')};\n }\n\n fn bilinearInterpolation(output_indices: ${output.type.indices}) -> ${dType} {\n var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices);\n var row:${dType} = originalIndices[${heightIdx}];\n var col:${dType} = originalIndices[${widthIdx}];\n ${\n useExtrapolation ?\n `if (row < 0 || row > (${inputShape[heightIdx]} - 1) || col < 0 || col > (${inputShape[widthIdx]} - 1)) {\n return ${extrapolationValue};\n }` :\n ''};\n row = max(0, min(row, ${inputShape[heightIdx]} - 1));\n col = max(0, min(col, ${inputShape[widthIdx]} - 1));\n var row1: u32 = u32(row);\n var col1: u32 = u32(col);\n var row2: u32 = u32(row + 1);\n var col2: u32 = u32(col + 1);\n var channel: u32 = ${inputShape.length > 2 ? `u32(originalIndices[${channelIdx}])` : '0'};\n var batch: u32 = ${inputShape.length > 2 ? `u32(originalIndices[${batchIdx}])` : '0'};\n var x11: ${dType} = getInputValue(batch, channel, row1, col1);\n var x12: ${dType} = getInputValue(batch, channel, row1, col2);\n var x21: ${dType} = getInputValue(batch, channel, row2, col1);\n var x22: ${dType} = getInputValue(batch, channel, row2, col2);\n var dx1: ${dType} = abs(row - ${dType}(row1));\n var dx2: ${dType} = abs(${dType}(row2) - row);\n var dy1: ${dType} = abs(col - ${dType}(col1));\n var dy2: ${dType} = abs(${dType}(col2) - col);\n if (row1 == row2) {\n dx1 = 0.5;\n dx2 = 0.5;\n }\n if (col1 == col2) {\n dy1 = 0.5;\n dy2 = 0.5;\n }\n return (x11 * dx2 * dy2 + x12 * dx2 * dy1 + x21 * dx1 * dy2 + x22 * dx1 * dy1);\n }`;\n };\n\nconst bicubicInterpolation =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[], outputShape: readonly number[],\n scales: readonly number[], roi: readonly number[], cubicCoeffA: number, useExtrapolation: boolean,\n extrapolationValue: number, excludeOutside: boolean): string => {\n const is2D = inputShape.length === 2;\n const isNchw = true;\n const [heightIdx, widthIdx] = is2D ? [0, 1] : isNchw ? [2, 3] : [1, 2];\n const dType = input.type.value;\n const createCubicInterpolationFunction = (idx: number): string => {\n const direction = idx === heightIdx ? 'row' : 'col';\n return `\n fn ${direction}CubicInterpolation(input_indices: ${input.type.indices}, output_indices: ${\n output.type.indices}) -> ${dType} {\n var output_index = ${output.indicesGet('output_indices', idx)};\n var originalIdx: ${dType} = getOriginalCoordinateFromResizedCoordinate(output_index, ${scales[idx]},\n ${outputShape[idx]}, ${inputShape[idx]}, ${roi[idx]}, ${roi[idx]} + ${inputShape.length});\n var fractOriginalIdx: ${dType} = originalIdx - floor(originalIdx);\n var coefs = getCubicInterpolationCoefs(fractOriginalIdx);\n\n if (${useExtrapolation} && (originalIdx < 0 || originalIdx > (${inputShape[idx]} - 1))) {\n return ${extrapolationValue};\n }\n var data: array<${dType}, 4> = array<${dType}, 4>(0.0, 0.0, 0.0, 0.0);\n for (var i: i32 = -1; i < 3; i++) {\n var ${direction}: ${dType} = originalIdx + ${dType}(i);\n if (${direction} < 0 || ${direction} >= ${inputShape[idx]}) {\n ${(() => {\n if (excludeOutside) {\n return `coefs[i + 1] = 0.0;\n continue;`;\n } else if (useExtrapolation) {\n return `return ${extrapolationValue};`;\n } else {\n return `${direction} = max(0, min(${direction}, ${inputShape[idx]} - 1));`;\n }\n })()};\n }\n var input_indices_copy: ${input.type.indices} = input_indices;\n ${input.indicesSet('input_indices_copy', idx, `u32(${direction})`)};\n data[i + 1] = ${\n idx === heightIdx ? input.getByIndices('input_indices_copy') :\n 'rowCubicInterpolation(input_indices_copy, output_indices)'};\n }\n return cubicInterpolation1D(data, coefs);\n }`;\n };\n\n return `\n ${createCubicInterpolationFunction(heightIdx)};\n ${createCubicInterpolationFunction(widthIdx)};\n fn getCubicInterpolationCoefs(s: ${dType}) -> array<${dType}, 4> {\n var absS = abs(s);\n var coeffs: array<${dType}, 4> = array<${dType}, 4>(0.0, 0.0, 0.0, 0.0);\n var oneMinusAbsS: ${dType} = 1.0 - absS;\n var twoMinusAbsS: ${dType} = 2.0 - absS;\n var onePlusAbsS: ${dType} = 1.0 + absS;\n coeffs[0] = ((${cubicCoeffA} * onePlusAbsS - 5 * ${cubicCoeffA}) * onePlusAbsS + 8 * ${\n cubicCoeffA}) * onePlusAbsS - 4 * ${cubicCoeffA};\n coeffs[1] = ((${cubicCoeffA} + 2) * absS - (${cubicCoeffA} + 3)) * absS * absS + 1;\n coeffs[2] = ((${cubicCoeffA} + 2) * oneMinusAbsS - (${cubicCoeffA} + 3)) * oneMinusAbsS * oneMinusAbsS + 1;\n coeffs[3] = ((${cubicCoeffA} * twoMinusAbsS - 5 * ${cubicCoeffA}) * twoMinusAbsS + 8 * ${\n cubicCoeffA}) * twoMinusAbsS - 4 * ${cubicCoeffA};\n return coeffs;\n }\n\n fn cubicInterpolation1D(x: array<${dType}, 4>, coefs: array<${dType}, 4>) -> ${dType} {\n var coefsSum: ${dType} = coefs[0] + coefs[1] + coefs[2] + coefs[3];\n return (x[0] * coefs[0] + x[1] * coefs[1]+ x[2] * coefs[2]+ x[3] * coefs[3]) / coefsSum;\n }\n\n fn bicubicInterpolation(output_indices: ${output.type.indices}) -> ${dType} {\n var input_indices: ${input.type.indices} = output_indices;\n return colCubicInterpolation(input_indices, output_indices);\n }\n `;\n };\n\nconst trilinearInterpolation =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[], useExtrapolation: boolean,\n extrapolationValue: number): string => {\n const isNchw = true;\n const [batchIdx, depthIdx, heightIdx, widthIdx, channelIdx] =\n inputShape.length === 3 ? [-1, 0, 1, 2, -1] : (isNchw ? [0, 2, 3, 4, 1] : [0, 1, 2, 3, 4]);\n const dType = input.type.value;\n return `\n fn getInputValue(batch: u32, channel: u32, depth:u32, height: u32, width: u32) -> ${dType} {\n var input_indices: ${input.type.indices};\n ${input.indicesSet('input_indices', depthIdx, `max(0, min(depth, ${inputShape[depthIdx]} - 1))`)};\n ${input.indicesSet('input_indices', heightIdx, `max(0, min(height, ${inputShape[heightIdx]} - 1))`)};\n ${input.indicesSet('input_indices', widthIdx, `max(0, min(width, ${inputShape[widthIdx]} - 1))`)};\n ${setChannelAndBatchIndices(input, channelIdx, batchIdx, 3)}\n return ${input.getByIndices('input_indices')};\n }\n\n fn trilinearInterpolation(output_indices: ${output.type.indices}) -> ${dType} {\n var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices);\n var depth:${dType} = originalIndices[${depthIdx}];\n var height:${dType} = originalIndices[${heightIdx}];\n var width:${dType} = originalIndices[${widthIdx}];\n ${\n useExtrapolation ? `if (depth < 0 || depth > (${inputShape[depthIdx]} - 1) || height < 0 || height > (${\n inputShape[heightIdx]} - 1) || width < 0 || (width > ${inputShape[widthIdx]} - 1)) {\n return ${extrapolationValue};\n }` :\n ''};\n\n depth = max(0, min(depth, ${inputShape[depthIdx]} - 1));\n height = max(0, min(height, ${inputShape[heightIdx]} - 1));\n width = max(0, min(width, ${inputShape[widthIdx]} - 1));\n var depth1: u32 = u32(depth);\n var height1: u32 = u32(height);\n var width1: u32 = u32(width);\n var depth2: u32 = u32(depth + 1);\n var height2: u32 = u32(height + 1);\n var width2: u32 = u32(width + 1);\n var channel: u32 = ${inputShape.length > 3 ? `u32(originalIndices[${channelIdx}])` : '0'};\n var batch: u32 = ${inputShape.length > 3 ? `u32(originalIndices[${batchIdx}])` : '0'};\n\n var x111: ${dType} = getInputValue(batch, channel, depth1, height1, width1);\n var x112: ${dType} = getInputValue(batch, channel, depth1, height1, width2);\n var x121: ${dType} = getInputValue(batch, channel, depth1, height2, width1);\n var x122: ${dType} = getInputValue(batch, channel, depth1, height2, width2);\n var x211: ${dType} = getInputValue(batch, channel, depth2, height1, width1);\n var x212: ${dType} = getInputValue(batch, channel, depth2, height1, width2);\n var x221: ${dType} = getInputValue(batch, channel, depth2, height2, width1);\n var x222: ${dType} = getInputValue(batch, channel, depth2, height2, width2);\n var dx1: ${dType} = abs(depth - ${dType}(depth1));\n var dx2: ${dType} = abs(${dType}(depth2) - depth);\n var dy1: ${dType} = abs(height - ${dType}(height1));\n var dy2: ${dType} = abs(${dType}(height2) - height);\n var dz1: ${dType} = abs(width - ${dType}(width1));\n var dz2: ${dType} = abs(${dType}(width2) - width);\n if (depth1 == depth2) {\n dx1 = 0.5;\n dx2 = 0.5;\n }\n if (height1 == height2) {\n dy1 = 0.5;\n dy2 = 0.5;\n }\n if (width1 == width2) {\n dz1 = 0.5;\n dz2 = 0.5;\n }\n return (x111 * dx2 * dy2 * dz2 + x112 * dx2 * dy2 * dz1 + x121 * dx2 * dy1 *dz2 + x122 * dx2 * dy1 * dz1 +\n x211 * dx1 * dy2 * dz2 + x212 * dx1 * dy2 * dz1 + x221 * dx1 * dy1 *dz2 + x222 * dx1 * dy1 * dz1);\n }`;\n };\n\nconst createResizeProgramInfo =\n (inputTensor: TensorView, attributes: ResizeAttributes, opsetVersion: number, scalesInput: readonly number[],\n sizes: readonly number[], roiInput: readonly number[]): ProgramInfo => {\n const inputShape = inputTensor.dims;\n const roi = updateRoI(roiInput, attributes.axes, inputShape.length);\n\n let outputShape = initOutputShape(inputShape, scalesInput, sizes, attributes.axes);\n let scales = scalesInput.slice();\n if (scalesInput.length === 0) {\n scales = inputShape.map((value, index) => value === 0 ? 1.0 : outputShape[index] / value);\n if (attributes.keepAspectRatioPolicy !== 'stretch') {\n outputShape = adjustOutputShape(inputShape, scales, attributes);\n }\n }\n const output = outputVariable('output', inputTensor.dataType, outputShape.length);\n const input = inputVariable('input', inputTensor.dataType, inputShape.length);\n const outputSize = ShapeUtil.size(outputShape);\n const noScale = inputShape.length === outputShape.length && inputShape.every((d, i) => d === outputShape[i]);\n const useExtrapolation = attributes.coordinateTransformMode === 'tf_crop_and_resize';\n const extrapolationValue = attributes.extrapolationValue;\n const dataType = input.type.value;\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${noScale ? '' : `\n ${getOriginalCoordinateFromResizedCoordinate(attributes.coordinateTransformMode, dataType)};\n ${(() => {\n switch (attributes.mode) {\n case 'nearest':\n return `\n ${checkInputIndices(input, inputShape)};\n ${getNearestPixelFromOriginal(attributes.nearestMode, opsetVersion, dataType)};\n ${\n calculateInputIndicesFromOutputIndices(\n input, output, inputShape, outputShape, scales.length, roi.length, useExtrapolation)};\n `;\n case 'linear':\n return `\n ${calculateOriginalIndicesFromOutputIndices(output, inputShape, outputShape, scales.length, roi.length)};\n ${(() => {\n if (inputShape.length === 2 || inputShape.length === 4) {\n return `${bilinearInterpolation(input, output, inputShape, useExtrapolation, extrapolationValue)}`;\n } else if (inputShape.length === 3 || inputShape.length === 5) {\n return `${trilinearInterpolation(input, output, inputShape, useExtrapolation, extrapolationValue)}`;\n } else {\n throw Error('Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.');\n }\n })()};\n `;\n case 'cubic':\n return `\n ${(() => {\n if (inputShape.length === 2 || inputShape.length === 4) {\n return `${\n bicubicInterpolation(\n input, output, inputShape, outputShape, scales, roi, attributes.cubicCoeffA, useExtrapolation,\n attributes.extrapolationValue, attributes.excludeOutside)}`;\n } else {\n throw Error('Cubic mode only supports input dims 2 and 4 are supported in linear mode.');\n }\n })()};\n `;\n default:\n throw Error('Invalid resize mode');\n }\n })()};\n `}\n ${\n shaderHelper.registerUniform('output_size', 'u32')\n .registerUniform('scales', 'f32', scales.length)\n .registerUniform('roi', 'f32', roi.length)\n .declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n ${noScale ? 'output[global_idx] = input[global_idx];' : `\n let output_indices = ${output.offsetToIndices('global_idx')};\n var input_indices: ${input.type.indices};\n ${(() => {\n switch (attributes.mode) {\n case 'nearest':\n return `input_indices = calculateInputIndicesFromOutputIndices(output_indices);\n if (checkInputIndices(input_indices)) {\n output[global_idx] = ${input.getByIndices('input_indices')};\n } else {\n output[global_idx] = ${attributes.extrapolationValue};\n }`;\n case 'linear':\n return `output[global_idx] = ${\n (inputShape.length === 2 || inputShape.length === 4) ? 'bilinearInterpolation' :\n 'trilinearInterpolation'}(output_indices);`;\n case 'cubic':\n return 'output[global_idx] = bicubicInterpolation(output_indices);';\n default:\n throw Error(`Unsupported resize mode: ${attributes.mode}`);\n }\n })()};\n`}\n }`;\n\n return {\n name: 'Resize',\n shaderCache: {\n hint: `${attributes.cacheKey}|${opsetVersion}|${scales.length > 0 ? scales : ''}|${\n sizes.length > 0 ? sizes : ''}|${roi.length > 0 ? roi : ''}|${noScale}|${inputShape}`,\n inputDependencies: ['rank']\n },\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputTensor.dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms: [\n {type: DataType.uint32, data: outputSize}, {type: DataType.float, data: scales},\n {type: DataType.float, data: roi}, ...createTensorShapeVariables(inputShape, outputShape)\n ]\n })\n };\n };\n\nconst getOpsetVersionFromCustomDataBuffer = (context: ComputeContext): number => {\n const customDataBuffer = context.customDataBuffer;\n const customDataBuffer32 = new Uint32Array(customDataBuffer, customDataBuffer.byteOffset, 1);\n const opsetVersion = customDataBuffer32[0];\n return opsetVersion;\n};\n\nexport const resize = (context: ComputeContext, attributes: ResizeAttributes): void => {\n const scales: number[] = [];\n const sizes: number[] = [];\n const roi: number[] = [];\n\n // Note that scales in resize are always f32. roi can be f32 or f16.\n // TODO: Currently this code does not support f16 for roi when passed as optional input.\n\n const opsetVersion = getOpsetVersionFromCustomDataBuffer(context);\n if (attributes.antialias !== 0) {\n throw Error('Only default value (0) for Antialias attribute is supported');\n }\n validateInputs(context.inputs, attributes, opsetVersion, scales, sizes, roi);\n context.compute(\n createResizeProgramInfo(context.inputs[0], attributes, opsetVersion, scales, sizes, roi), {inputs: [0]});\n};\n\nexport const parseResizeAttributes = (attributes: Record): ResizeAttributes => {\n const antialias = attributes.antialias as number;\n const axes = attributes.axes as number[];\n const coordinateTransformMode: CoordinateTransformMode =\n attributes.coordinateTransformMode as CoordinateTransformMode;\n const cubicCoeffA = attributes.cubicCoeffA as number;\n const excludeOutside = attributes.excludeOutside as number !== 0;\n const extrapolationValue = attributes.extrapolationValue as number;\n const keepAspectRatioPolicy: KeepAspectRatioPolicy = attributes.keepAspectRatioPolicy as KeepAspectRatioPolicy;\n const mode: Mode = attributes.mode as Mode;\n // If nearestMode is not specified, use simple mode.\n const nearestMode: NearestMode = (attributes.nearestMode === '' ? 'simple' : attributes.nearestMode) as NearestMode;\n return createAttributeWithCacheKey({\n antialias,\n axes,\n coordinateTransformMode,\n cubicCoeffA,\n excludeOutside,\n extrapolationValue,\n keepAspectRatioPolicy,\n mode,\n nearestMode\n });\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, WORKGROUP_SIZE} from './common';\n\nexport interface RotaryEmbeddingAttributes {\n readonly interleaved: boolean;\n readonly numHeads: number;\n readonly rotaryEmbeddingDim: number;\n readonly scale: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: RotaryEmbeddingAttributes): void => {\n const [input, positionIds, cosCache, sinCache] = inputs;\n const {numHeads, rotaryEmbeddingDim} = attributes;\n\n if (input.dims.length !== 3 && input.dims.length !== 4) {\n throw new Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${input.dims.length}`);\n }\n if (!ShapeUtil.areEqual(positionIds.dims, []) && !ShapeUtil.areEqual(positionIds.dims, [1]) &&\n positionIds.dims.length !== 2) {\n throw new Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${positionIds.dims.length}`);\n }\n if (cosCache.dims.length !== 2) {\n throw new Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${cosCache.dims.length}`);\n }\n if (sinCache.dims.length !== 2) {\n throw new Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${sinCache.dims.length}`);\n }\n if (!ShapeUtil.areEqual(cosCache.dims, sinCache.dims)) {\n throw new Error('Inputs \\'cos_cache\\' and \\'sin_cache\\' are expected to have the same shape');\n }\n\n if (rotaryEmbeddingDim > 0 && numHeads === 0) {\n throw new Error('num_heads must be provided if rotary_embedding_dim is specified');\n }\n\n const batchSize = input.dims[0];\n const sequenceLength = input.dims[input.dims.length - 2];\n const maxSequenceLength = cosCache.dims[0];\n const hiddenSize = ShapeUtil.sizeFromDimension(input.dims, 1) / sequenceLength;\n const headSize = rotaryEmbeddingDim === 0 ? cosCache.dims[1] * 2 : hiddenSize / numHeads;\n if (rotaryEmbeddingDim > headSize) {\n throw new Error('rotary_embedding_dim must be less than or equal to head_size');\n }\n\n if (positionIds.dims.length === 2) {\n if (batchSize !== positionIds.dims[0]) {\n throw new Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${positionIds.dims[0]}`);\n }\n if (sequenceLength !== positionIds.dims[1]) {\n throw new Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${positionIds.dims[1]}`);\n }\n }\n\n if (headSize / 2 !== cosCache.dims[1] && rotaryEmbeddingDim / 2 !== cosCache.dims[1]) {\n throw new Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${\n cosCache.dims[1]}`);\n }\n\n if (sequenceLength > maxSequenceLength) {\n throw new Error('Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported');\n }\n};\n\nconst createRotaryEmbeddingProgramInfo =\n (inputs: readonly TensorView[], attributes: RotaryEmbeddingAttributes): ProgramInfo => {\n const {interleaved, numHeads, rotaryEmbeddingDim, scale} = attributes;\n const batchSize = inputs[0].dims[0];\n const batchStride = ShapeUtil.sizeFromDimension(inputs[0].dims, 1);\n const sequenceLength = inputs[0].dims[inputs[0].dims.length - 2];\n const hiddenSize = batchStride / sequenceLength;\n const halfRotaryEmbeddingDim = inputs[2].dims[1];\n const headSize = rotaryEmbeddingDim === 0 ? halfRotaryEmbeddingDim * 2 : hiddenSize / numHeads;\n\n // Rotary embeddings will be calculated in a pair-wise fashion. In accordance, use the shape\n // [batch size, sequence length, num of heads, num of pairs to rotate + num of dims to copy]\n // to unfold the global index in shader.\n const globalShape =\n new Array(batchSize, sequenceLength, hiddenSize / headSize, headSize - halfRotaryEmbeddingDim);\n const globalStrides = ShapeUtil.computeStrides(globalShape);\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.float, data: scale},\n {type: DataType.uint32, data: globalShape},\n {type: DataType.uint32, data: globalStrides},\n\n // strides for addressing the input/output tensor, in permutated order to align with the unfolded global index,\n // i.e. BSNH\n ...(inputs[0].dims.length === 3 ?\n new Array({type: DataType.uint32, data: [batchStride, hiddenSize, headSize, 1]}) :\n []),\n ...(inputs[0].dims.length === 4 ?\n new Array(\n {type: DataType.uint32, data: [batchStride, headSize, sequenceLength * headSize, 1]}) :\n []),\n\n ...createTensorShapeVariables(inputs[0].dims, inputs[1].dims, inputs[2].dims, inputs[3].dims, inputs[0].dims),\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const input = inputVariable('input', inputs[0].dataType, inputs[0].dims.length);\n const positionIds = inputVariable('position_ids', inputs[1].dataType, inputs[1].dims.length);\n const cosCache = inputVariable('cos_cache', inputs[2].dataType, inputs[2].dims.length);\n const sinCache = inputVariable('sin_cache', inputs[3].dataType, inputs[3].dims.length);\n const output = outputVariable('output', inputs[0].dataType, inputs[0].dims.length);\n\n shaderHelper.registerUniforms([\n {name: 'scale', type: 'f32'},\n {name: 'global_shape', type: 'u32', length: globalShape.length},\n {name: 'global_strides', type: 'u32', length: globalStrides.length},\n {name: 'input_output_strides', type: 'u32', length: globalStrides.length},\n ]);\n\n return `\n ${shaderHelper.declareVariables(input, positionIds, cosCache, sinCache, output)}\n\n ${shaderHelper.mainStart(WORKGROUP_SIZE)}\n let half_rotary_emb_dim = uniforms.${cosCache.name}_shape[1];\n let bsnh = global_idx / uniforms.global_strides % uniforms.global_shape;\n let size = uniforms.global_shape[0] * uniforms.global_strides[0];\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('size')}\n\n if (bsnh[3] < half_rotary_emb_dim) {\n let position_ids_idx =\n ${positionIds.broadcastedIndicesToOffset('bsnh.xy', outputVariable('', positionIds.type.tensor, 2))};\n let position_id =\n u32(${positionIds.getByOffset('position_ids_idx')}) + select(0, bsnh[1], position_ids_idx == 0);\n let i = dot(bsnh, uniforms.input_output_strides) + select(0, bsnh[3], ${interleaved});\n let j = i + select(half_rotary_emb_dim, 1, ${interleaved});\n let re = ${input.getByOffset('i')} * ${cosCache.get('position_id', 'bsnh[3]')} -\n ${input.getByOffset('j')} * ${sinCache.get('position_id', 'bsnh[3]')};\n ${output.setByOffset('i', 're')}\n let im = ${input.getByOffset('i')} * ${sinCache.get('position_id', 'bsnh[3]')} +\n ${input.getByOffset('j')} * ${cosCache.get('position_id', 'bsnh[3]')};\n ${output.setByOffset('j', 'im')}\n } else {\n let k = dot(bsnh, uniforms.input_output_strides) + half_rotary_emb_dim;\n ${output.setByOffset('k', input.getByOffset('k'))}\n }\n }`;\n };\n\n return {\n name: 'RotaryEmbedding',\n shaderCache: {\n hint: createAttributeWithCacheKey({\n interleaved,\n }).cacheKey,\n inputDependencies: ['rank', 'rank', 'rank', 'rank'],\n },\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: inputs[0].dims, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(ShapeUtil.size(globalShape) / WORKGROUP_SIZE)},\n programUniforms,\n }),\n };\n };\n\nexport const rotaryEmbedding = (context: ComputeContext, attributes: RotaryEmbeddingAttributes): void => {\n validateInputs(context.inputs, attributes);\n context.compute(createRotaryEmbeddingProgramInfo(context.inputs, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {castToF32, getMaxComponents, inputVariable, outputVariable, ShaderHelper, sumVector, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\n\nexport interface SkipLayerNormAttributes {\n simplified: boolean;\n epsilon: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length < 3) {\n throw new Error('layerNorm requires at least 3 inputs.');\n }\n\n const input: TensorView = inputs[0];\n const skip: TensorView = inputs[1];\n const gamma: TensorView = inputs[2];\n\n if (input.dataType !== skip.dataType || input.dataType !== gamma.dataType) {\n throw new Error('All inputs must have the same data type');\n }\n\n if (input.dims.length !== 3 && input.dims.length !== 2) {\n throw new Error('Input must be 2D or 3D');\n }\n\n if (skip.dims.length !== 3 && skip.dims.length !== 2) {\n throw new Error('Skip must be 2D or 3D');\n }\n\n const hiddenSize = input.dims[input.dims.length - 1];\n const sequenceLength = input.dims[input.dims.length - 2];\n if (skip.dims[skip.dims.length - 1] !== hiddenSize) {\n throw new Error('Skip must have the same hidden size as input');\n }\n if (skip.dims[skip.dims.length - 2] !== sequenceLength) {\n throw new Error('Skip must have the same sequence length as input');\n }\n\n if (gamma.dims.length !== 1) {\n throw new Error('Gamma must be 1D');\n }\n if (gamma.dims[gamma.dims.length - 1] !== hiddenSize) {\n throw new Error('Gamma must have the same hidden size as input');\n }\n if (inputs.length > 3) {\n const beta: TensorView = inputs[3];\n if (beta.dims.length !== 1) {\n throw new Error('Beta must be 1D');\n }\n if (beta.dims[beta.dims.length - 1] !== hiddenSize) {\n throw new Error('Beta must have the same hidden size as input');\n }\n }\n if (inputs.length > 4) {\n const bias: TensorView = inputs[4];\n if (bias.dims.length !== 1) {\n throw new Error('Bias must be 1D');\n }\n if (bias.dims[bias.dims.length - 1] !== hiddenSize) {\n throw new Error('Bias must have the same hidden size as input');\n }\n }\n};\n\nconst createSkipLayerNormProgramInfo =\n (inputs: readonly TensorView[], attributes: SkipLayerNormAttributes, outputCount: number, isTraining: boolean):\n ProgramInfo => {\n const simplified = attributes.simplified;\n\n const inputShape = inputs[0].dims;\n const inputSize = ShapeUtil.size(inputShape);\n const outputShape = inputShape;\n const outputSize = inputSize;\n const hiddenSize = inputShape.slice(-1)[0];\n const meanInvStdDevDim = isTraining ? inputShape.slice(0, -1).concat(1) : [];\n const hasBetaInput = !simplified && inputs.length > 3;\n const hasBiasInput = inputs.length > 4;\n const hasMeanOutput = isTraining && outputCount > 1;\n const hasInvStdDevOutput = isTraining && outputCount > 2;\n const hasInputSkipBiasSumOutput = outputCount > 3;\n const workgroupSize = 64;\n\n const components = getMaxComponents(hiddenSize);\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize},\n {type: DataType.uint32, data: components},\n {type: DataType.uint32, data: hiddenSize},\n {type: DataType.float, data: attributes.epsilon},\n ];\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const uniformsArray: UniformsArrayType = [\n {name: 'output_size', type: 'u32'},\n {name: 'components', type: 'u32'},\n {name: 'hidden_size', type: 'u32'},\n {name: 'epsilon', type: 'f32'},\n ];\n const variables = [\n inputVariable('x', inputs[0].dataType, inputs[0].dims, components),\n inputVariable('skip', inputs[1].dataType, inputs[1].dims, components),\n inputVariable('gamma', inputs[2].dataType, inputs[2].dims, components),\n ];\n if (hasBetaInput) {\n variables.push(inputVariable('beta', inputs[3].dataType, inputs[3].dims, components));\n }\n if (hasBiasInput) {\n variables.push(inputVariable('bias', inputs[4].dataType, inputs[4].dims, components));\n }\n variables.push(outputVariable('output', inputs[0].dataType, outputShape, components));\n if (hasMeanOutput) {\n variables.push(outputVariable('mean_output', DataType.float, meanInvStdDevDim));\n }\n if (hasInvStdDevOutput) {\n variables.push(outputVariable('inv_std_output', DataType.float, meanInvStdDevDim));\n }\n if (hasInputSkipBiasSumOutput) {\n variables.push(outputVariable('input_skip_bias_sum', inputs[0].dataType, outputShape, components));\n }\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n const vecDataType = tensorTypeToWsglStorageType(DataType.float, components);\n return `\n\n ${shaderHelper.registerUniforms(uniformsArray).declareVariables(...variables)}\n var sum_shared : array<${vecDataType}, ${workgroupSize}>;\n var sum_squared_shared : array<${vecDataType}, ${workgroupSize}>;\n\n ${shaderHelper.mainStart([\n workgroupSize, 1, 1\n ])}\n let ix = local_id.x;\n let iy = global_id.x / ${workgroupSize};\n\n let hidden_size_vectorized: u32 = uniforms.hidden_size / uniforms.components;\n var stride = hidden_size_vectorized / ${workgroupSize};\n let offset = ix * stride + iy * hidden_size_vectorized;\n let offset1d = stride * ix;\n if (ix == ${workgroupSize - 1}) {\n stride = hidden_size_vectorized - stride * ix;\n }\n for (var i: u32 = 0; i < stride; i++) {\n let skip_value = skip[offset + i];\n let bias_value = ${hasBiasInput ? 'bias[offset1d + i]' : dataType + '(0.0)'};\n let input_value = x[offset + i];\n let value = input_value + skip_value + bias_value;\n ${hasInputSkipBiasSumOutput ? 'input_skip_bias_sum[offset + i] = value;' : ''}\n output[offset + i] = value;\n let f32_value = ${castToF32(dataType, components, 'value')};\n sum_shared[ix] += f32_value;\n sum_squared_shared[ix] += f32_value * f32_value;\n }\n workgroupBarrier();\n\n var reduce_size : u32 = ${workgroupSize};\n for (var curr_size = reduce_size >> 1; curr_size > 0; curr_size = reduce_size >> 1) {\n reduce_size = curr_size + (reduce_size & 1);\n if (ix < curr_size) {\n sum_shared[ix] += sum_shared[ix + reduce_size];\n sum_squared_shared[ix] += sum_squared_shared[ix + reduce_size];\n }\n workgroupBarrier();\n }\n\n let sum = sum_shared[0];\n let square_sum = sum_squared_shared[0];\n let mean = ${sumVector('sum', components)} / f32(uniforms.hidden_size);\n let inv_std_dev = inverseSqrt(${sumVector('square_sum', components)} / f32(uniforms.hidden_size) ${\n simplified ? '' : '- mean * mean'} + uniforms.epsilon);\n ${hasMeanOutput ? 'mean_output[global_idx] = mean;' : ''}\n ${hasInvStdDevOutput ? 'inv_std_output[global_idx] = inv_std_dev;' : ''}\n\n for (var i: u32 = 0; i < stride; i++) {\n output[offset + i] = (output[offset + i] ${simplified ? '' : `- ${dataType}(mean)`}) *\n ${dataType}(inv_std_dev) * gamma[offset1d + i]\n ${hasBetaInput ? '+ beta[offset1d + i]' : ''};\n }\n }`;\n };\n const outputs = [{dims: outputShape, dataType: inputs[0].dataType}];\n if (outputCount > 1) {\n outputs.push({dims: meanInvStdDevDim, dataType: DataType.float});\n }\n if (outputCount > 2) {\n outputs.push({dims: meanInvStdDevDim, dataType: DataType.float});\n }\n if (outputCount > 3) {\n outputs.push({dims: inputShape, dataType: inputs[0].dataType});\n }\n return {\n name: 'SkipLayerNormalization',\n shaderCache: {\n hint: `${components};${hasMeanOutput};${hasInvStdDevOutput};${hasInputSkipBiasSumOutput}`,\n inputDependencies: inputs.map((_input, _index) => 'type')\n },\n getShaderSource,\n getRunData: () => ({\n outputs,\n dispatchGroup: {\n x: Math.ceil(outputSize / hiddenSize),\n },\n programUniforms\n }),\n };\n };\n\nexport const skipLayerNorm = (context: ComputeContext, attributes: SkipLayerNormAttributes): void => {\n // TODO: initialize isTraining from ComputeContext\n const isTraining = false;\n validateInputs(context.inputs);\n // Mean and InvStdDev are only used in training mode and are not required for inference.\n // They are added here for completeness only.\n const outputs = [0];\n if (context.outputCount > 1) {\n outputs.push(isTraining ? 1 : -3);\n }\n if (context.outputCount > 2) {\n outputs.push(isTraining ? 2 : -3);\n }\n if (context.outputCount > 3) {\n outputs.push(3);\n }\n context.compute(\n createSkipLayerNormProgramInfo(context.inputs, attributes, context.outputCount, isTraining), {outputs});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform, TensorInfo} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\n\nexport interface SliceAttributes extends AttributeWithCacheKey {\n readonly starts: number[];\n readonly ends: number[];\n readonly axes: number[];\n}\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: SliceAttributes): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('too few inputs');\n }\n if (attributes.axes.length !== 0) {\n if (attributes.axes.length !== attributes.starts.length || attributes.axes.length !== attributes.ends.length) {\n throw new Error('axes, starts and ends must have the same length');\n }\n } else if (attributes.starts.length !== attributes.ends.length) {\n throw new Error('starts and ends must have the same length');\n }\n inputs.slice(1).forEach((_, idx) => {\n if (inputs[idx + 1].dataType !== DataType.int32 && inputs[idx + 1].dataType !== DataType.int64) {\n throw new Error(`Input ${idx} must be an array of int32 or int64`);\n }\n });\n};\n\nconst readInput = (inputs: readonly TensorView[], idx: number): number[] => {\n const input: number[] = [];\n if (inputs.length > idx) {\n if (inputs[idx].dataType === DataType.int64) {\n inputs[idx].getBigInt64Array().forEach(v => input.push(Number(v)));\n } else if (inputs[idx].dataType === DataType.int32) {\n inputs[idx].getInt32Array().forEach(v => input.push(Number(v)));\n } else {\n throw new Error(`Input ${idx} must be an array of int32 or int64`);\n }\n }\n return input;\n};\n\nconst createSliceAttributesFromInputs =\n (inputs: readonly TensorView[], attributes: SliceAttributes): SliceAttributes => {\n if (inputs.length > 1) {\n const starts: number[] = readInput(inputs, 1);\n const ends: number[] = readInput(inputs, 2);\n let axes: number[] = readInput(inputs, 3);\n if (axes.length === 0) {\n axes = [...Array(inputs[0].dims.length).keys()];\n }\n return createAttributeWithCacheKey({starts, ends, axes});\n } else {\n return attributes;\n }\n };\n\nconst fixStartEndValues =\n (value: number, index: number, inputShape: readonly number[], axes: readonly number[], steps: readonly number[]):\n number => {\n let newValue = value;\n if (value < 0) {\n newValue += inputShape[axes[index]];\n }\n if (steps[index] < 0) {\n return Math.max(0, Math.min(newValue, inputShape[axes[index]] - 1));\n } else {\n return Math.max(0, Math.min(newValue, inputShape[axes[index]]));\n }\n };\n\nconst calculateInputIndicesImpl =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[]): string =>\n `fn calculateInputIndices(output_indices: ${output.type.indices}) -> ${input.type.indices} {\n var input_indices: ${input.type.indices};\n var carry = 0u;\n for (var i = ${inputShape.length}; i >= 0; i--) {\n let input_shape_i = ${getElementAt('uniforms.input_shape', 'i', inputShape.length)};\n let steps_i = ${getElementAt('uniforms.steps', 'i', inputShape.length)};\n let signs_i = ${getElementAt('uniforms.signs', 'i', inputShape.length)};\n let starts_i = ${getElementAt('uniforms.starts', 'i', inputShape.length)};\n var output_index = ${output.indicesGet('output_indices', 'i')};\n var input_index = output_index * steps_i + starts_i + carry;\n carry = input_index / input_shape_i;\n input_index = input_index % input_shape_i;\n if (signs_i < 0) {\n input_index = input_shape_i - input_index - 1u + starts_i;\n }\n ${input.indicesSet('input_indices', 'i', 'input_index')};\n }\n return input_indices;\n }`;\n\nconst createSliceProgramInfo = (inputs: readonly TensorView[], attributes: SliceAttributes): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const inputSize = ShapeUtil.size(inputShape);\n const axes = (attributes.axes.length > 0) ? ShapeUtil.normalizeAxes(attributes.axes, inputShape.length) :\n [...Array(inputShape.length).keys()];\n let steps = readInput(inputs, 4);\n steps.forEach((step) => step !== 0 || (() => {\n throw new Error('step cannot be 0');\n }));\n if (steps.length === 0) {\n steps = Array(axes.length).fill(1);\n }\n const starts = attributes.starts.map((start, i) => fixStartEndValues(start, i, inputShape, axes, steps));\n\n const ends = attributes.ends.map((end, i) => fixStartEndValues(end, i, inputShape, axes, steps));\n\n if (axes.length !== starts.length || axes.length !== ends.length) {\n throw new Error('start, ends and axes should have the same number of elements');\n }\n\n if (axes.length !== inputShape.length) {\n for (let i = 0; i < inputShape.length; ++i) {\n if (!axes.includes(i)) {\n starts.splice(i, 0, 0);\n ends.splice(i, 0, inputShape[i]);\n steps.splice(i, 0, 1);\n }\n }\n }\n const signs = steps.map(step => Math.sign(step));\n // Convert negative steps to positive steps and reverse starts and ends\n steps.forEach((step, i, array) => {\n if (step < 0) {\n const numSteps = (ends[i] - starts[i]) / step;\n const newEnd = starts[i];\n const newStart = newEnd + numSteps * steps[i];\n starts[i] = newStart;\n ends[i] = newEnd;\n array[i] = -step;\n }\n });\n // Output rank is expected to be less than or equal to the input rank.\n const outputShape = inputShape.slice(0);\n axes.forEach((axis, _) => {\n outputShape[axis] = Math.ceil((ends[axis] - starts[axis]) / steps[axis]);\n });\n const outputTensorInfo: TensorInfo = {dims: outputShape, dataType: inputs[0].dataType};\n\n const output = outputVariable('output', inputs[0].dataType, outputShape.length);\n const input = inputVariable('input', inputs[0].dataType, inputs[0].dims.length);\n const outputSize = ShapeUtil.size(outputShape);\n const uniforms: UniformsArrayType = [\n {name: 'outputSize', type: 'u32'}, {name: 'starts', type: 'u32', length: starts.length},\n {name: 'signs', type: 'i32', length: signs.length}, {name: 'steps', type: 'u32', length: steps.length}\n ];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: starts},\n {type: DataType.int32, data: signs}, {type: DataType.uint32, data: steps},\n ...createTensorShapeVariables(inputs[0].dims, outputShape)\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(input, output)}\n ${calculateInputIndicesImpl(input, output, inputShape)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n let output_indices = ${output.offsetToIndices('global_idx')};\n let input_indices = calculateInputIndices(output_indices);\n ${output.setByOffset('global_idx', input.getByIndices('input_indices'))}\n }`;\n return {\n name: 'Slice',\n shaderCache: {hint: `${signs.length}_${starts.length}_${steps.length}`, inputDependencies: ['rank']},\n getShaderSource,\n getRunData: () => ({\n outputs: [outputTensorInfo],\n dispatchGroup: {x: Math.ceil(inputSize / 64 /* workgroup size */)},\n programUniforms\n })\n };\n};\n\nexport const slice = (context: ComputeContext, attributes: SliceAttributes): void => {\n validateInputs(context.inputs, attributes);\n const updatedAttributes = createSliceAttributesFromInputs(context.inputs, attributes);\n context.compute(createSliceProgramInfo(context.inputs, updatedAttributes), {inputs: [0]});\n // if (ShapeUtil.size(program.outputs[0].dims) > 0) {\n // context.compute(programInfoLoader, {inputs: [0]});\n // } else {\n // // TODO: support empty output\n // throw new Error('slice: output size is 0');\n // }\n};\n\nexport const parseSliceAttributes = (attributes: Record): SliceAttributes => {\n const starts = attributes.starts as number[];\n const ends = attributes.ends as number[];\n const axes = attributes.axes as number[];\n return createAttributeWithCacheKey({starts, ends, axes});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// TODO: this is the same naive implementation we use for reduce that has\n// performance limitations when the reduced axis is long. Need to add\n// a optimized codepath for this.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {getMaxComponents, inputVariable, outputVariable, ShaderHelper, sumVector, tensorTypeToWsglStorageType} from './common';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Softmax op requires 1 input.');\n }\n};\n\nexport interface SoftmaxAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n}\n\nconst createSoftmaxProgramInfo = (input: TensorView, attributes: SoftmaxAttributes): ProgramInfo => {\n const shape = input.dims;\n const outputSize = ShapeUtil.size(shape);\n const WG = 64;\n let axis = attributes.axis;\n if (axis < 0) {\n axis = shape.length + axis;\n }\n if (axis < shape.length - 1) {\n throw new Error('softmax only supports last axis for now.');\n }\n\n const cols = shape[axis];\n const rows = outputSize / cols;\n const components = getMaxComponents(cols);\n const packedCols = cols / components;\n\n const maxVector = (name: string, components: number) => {\n if (components === 4) {\n return `max(max(${name}.x, ${name}.y), max(${name}.z, ${name}.w))`;\n } else if (components === 2) {\n return `max(${name}.x, ${name}.y)`;\n } else if (components === 3) {\n return `max(max(${name}.x, ${name}.y), ${name}.z)`;\n }\n\n return name;\n };\n const x = inputVariable('x', input.dataType, input.dims, components);\n const output = outputVariable('result', input.dataType, input.dims, components);\n const valueType = x.type.value;\n // 6.2.4 in wgsl spec\n const threadMaxDecl = tensorTypeToWsglStorageType(input.dataType) === 'f32' ?\n `var threadMax = ${valueType}(-3.402823e+38f);` :\n `var threadMax = ${valueType}(-65504.0h);`;\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n var rowMaxShared : ${valueType};\n var rowSumShared : ${valueType};\n var threadShared : array<${valueType}, ${WG}>;\n\n fn getValue(row: i32, col: i32, row_stride: i32) -> ${valueType} {\n let index = row * row_stride + col;\n return x[index];\n }\n\n fn setValue(row: i32, col: i32, row_stride: i32, value: ${valueType}) {\n let index = row * row_stride + col;\n result[index] = value;\n }\n ${shaderHelper.registerUniform('packedCols', 'i32').declareVariables(x, output)}\n ${shaderHelper.mainStart()}\n let gindex = i32(global_idx);\n let lindex = i32(local_idx);\n const wg = ${WG};\n let row = gindex / wg;\n let cols = uniforms.packedCols;\n let row_stride : i32 = uniforms.packedCols;\n\n // find the rows max\n ${threadMaxDecl}\n for (var col = lindex; col < cols; col += wg) {\n let value = getValue(row, col, row_stride);\n threadMax = max(threadMax, value);\n }\n if (lindex < cols) {\n threadShared[lindex] = threadMax;\n }\n workgroupBarrier();\n\n var reduceSize = min(cols, wg);\n for (var currSize = reduceSize >> 1; currSize > 0; currSize = reduceSize >> 1) {\n reduceSize = currSize + (reduceSize & 1);\n if (lindex < currSize) {\n threadShared[lindex] = max(threadShared[lindex], threadShared[lindex + reduceSize]);\n }\n workgroupBarrier();\n }\n if (lindex == 0) {\n rowMaxShared = ${valueType}(${maxVector('threadShared[0]', components)});\n }\n workgroupBarrier();\n\n // find the rows sum\n var threadSum = ${valueType}(0.0);\n for (var col = lindex; col < cols; col += wg) {\n let subExp = exp(getValue(row, col, row_stride) - rowMaxShared);\n threadSum += subExp;\n }\n threadShared[lindex] = threadSum;\n workgroupBarrier();\n\n for (var currSize = wg >> 1; currSize > 0; currSize = currSize >> 1) {\n if (lindex < currSize) {\n threadShared[lindex] = threadShared[lindex] + threadShared[lindex + currSize];\n }\n workgroupBarrier();\n }\n if (lindex == 0) {\n rowSumShared = ${valueType}(${sumVector('threadShared[0]', components)});\n }\n workgroupBarrier();\n\n // calculate final value for each element in the row\n for (var col = lindex; col < cols; col += wg) {\n let value = exp(getValue(row, col, row_stride) - rowMaxShared) / rowSumShared;\n setValue(row, col, row_stride, value);\n }\n }`;\n return {\n name: 'Softmax',\n shaderCache: {hint: `${components}`, inputDependencies: ['type']},\n getRunData: () => ({\n outputs: [{dims: shape, dataType: input.dataType}],\n dispatchGroup: {x: rows},\n programUniforms: [{type: DataType.int32, data: packedCols}]\n }),\n getShaderSource,\n };\n};\n\nexport const softmax = (context: ComputeContext, attributes: SoftmaxAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createSoftmaxProgramInfo(context.inputs[0], attributes));\n};\n\nexport const parseSoftmaxAttributes = (attributes: Record): SoftmaxAttributes =>\n createAttributeWithCacheKey({axis: attributes.axis as number});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform, TensorInfo} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface SplitAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n readonly numOutputs: number;\n readonly splitSizes: number[];\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('too few inputs');\n }\n};\n\nconst createSplitAttributesFromInputs =\n (inputs: readonly TensorView[], attributes: SplitAttributes): SplitAttributes => {\n const splitSizes: number[] = [];\n let numOutputs: number = attributes.numOutputs;\n if (inputs[1].dims[0] > 0) {\n inputs[1].getBigInt64Array().forEach(v => splitSizes.push(Number(v)));\n numOutputs = splitSizes.length;\n }\n return createAttributeWithCacheKey({numOutputs, axis: attributes.axis, splitSizes});\n };\n\nconst calculateOutputIndexImpl = (numberOfTensors: number): string => `\nfn calculateOutputIndex(index: u32) -> u32 {\n for (var i: u32 = 0u; i < ${numberOfTensors}u; i += 1u ) {\n if (index < ${getElementAt('uniforms.size_in_split_axis', 'i', numberOfTensors)}) {\n return i;\n }\n }\n return ${numberOfTensors}u;\n}`;\nconst writeBufferDataImpl = (outputs: readonly IndicesHelper[]) => {\n const numberOfTensors = outputs.length;\n const codeLines: string[] = [];\n for (let i = 0; i < numberOfTensors; ++i) {\n const returnSnippet = outputs[i].setByIndices('indices', 'input[global_idx]');\n if (numberOfTensors === 1) {\n codeLines.push(returnSnippet);\n } else if (i === 0) {\n codeLines.push(`if (output_number == ${i}u) { ${returnSnippet} }`);\n } else if (i === numberOfTensors - 1) {\n codeLines.push(`else { ${returnSnippet} }`);\n } else {\n codeLines.push(`else if (output_number == ${i}) { ${returnSnippet} }`);\n }\n }\n return `\n fn writeBufferData(output_number: u32, indices: ${outputs[0].type.indices}, global_idx: u32) {\n ${codeLines.join('\\n')}\n }`;\n};\n\nconst createSplitProgramInfo = (inputs: readonly TensorView[], attributes: SplitAttributes): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const inputSize = ShapeUtil.size(inputShape);\n const dataType = inputs[0].dataType;\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputShape.length);\n const outputs = new Array(attributes.numOutputs);\n const input = inputVariable('input', dataType, inputShape.length);\n const sizeInSplitAxis = new Array(attributes.numOutputs);\n const outputsTensorInfo: TensorInfo[] = [];\n const outputShapes: number[][] = [];\n let previousSum = 0;\n const programUniforms: ProgramUniform[] = [{type: DataType.uint32, data: inputSize}];\n for (let i = 0; i < attributes.numOutputs; i++) {\n previousSum += attributes.splitSizes[i];\n sizeInSplitAxis[i] = previousSum;\n const outputShape = inputShape.slice();\n outputShape[attributes.axis] = attributes.splitSizes[i];\n outputShapes.push(outputShape);\n outputs[i] = outputVariable(`output${i}`, dataType, outputShape.length);\n outputsTensorInfo.push({dims: outputShapes[i], dataType: inputs[0].dataType});\n }\n programUniforms.push(\n {type: DataType.uint32, data: sizeInSplitAxis}, ...createTensorShapeVariables(inputShape, ...outputShapes));\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${\n shaderHelper.registerUniform('input_size', 'u32')\n .registerUniform('size_in_split_axis', 'u32', sizeInSplitAxis.length)\n .declareVariables(input, ...outputs)}\n ${calculateOutputIndexImpl(sizeInSplitAxis.length)}\n ${writeBufferDataImpl(outputs)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.input_size')}\n\n var indices = ${input.offsetToIndices('global_idx')};\n var index = ${input.indicesGet('indices', axis)};\n let output_number = calculateOutputIndex(index);\n if (output_number != 0) {\n index -= ${getElementAt('uniforms.size_in_split_axis', 'output_number - 1u', sizeInSplitAxis.length)};\n ${input.indicesSet('indices', axis, 'index')};\n }\n writeBufferData(output_number, indices, global_idx);\n }`;\n return {\n name: 'Split',\n shaderCache: {hint: attributes.cacheKey, inputDependencies: ['rank']},\n getShaderSource,\n getRunData: () => ({\n outputs: outputsTensorInfo,\n dispatchGroup: {x: Math.ceil(inputSize / 64 /* workgroup size */)},\n programUniforms\n })\n };\n};\n\nexport const split = (context: ComputeContext, attributes: SplitAttributes): void => {\n validateInputs(context.inputs);\n const updatedAttributes =\n context.inputs.length === 1 ? attributes : createSplitAttributesFromInputs(context.inputs, attributes);\n context.compute(createSplitProgramInfo(context.inputs, updatedAttributes), {inputs: [0]});\n};\n\nexport const parseSplitAttributes = (attributes: Record): SplitAttributes => {\n const axis = attributes.axis as number;\n const splitSizes: number[] = attributes.splitSizes as number[];\n const numOutputs = attributes.numOutputs as number < 0 ? splitSizes.length : attributes.numOutputs as number;\n if (numOutputs !== splitSizes.length) {\n throw new Error('numOutputs and splitSizes lengh must be equal');\n }\n return createAttributeWithCacheKey({axis, numOutputs, splitSizes});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {BroadcastUtil, ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nconst createWhereOpProgramShader =\n (shaderHelper: ShaderHelper, inputs: readonly TensorView[], dimsOutput: readonly number[], isBroadcast: boolean,\n typeOutput: number) => {\n const output = outputVariable('output_data', typeOutput, dimsOutput.length, 4);\n const a = inputVariable('a_data', inputs[1].dataType, inputs[1].dims.length, 4);\n const b = inputVariable('b_data', inputs[2].dataType, inputs[2].dims.length, 4);\n const c = inputVariable('c_data', inputs[0].dataType, inputs[0].dims.length, 4);\n\n let assignment: string;\n const expression = (a: string, b: string, c: string) => `select(${b}, ${a}, ${c})`;\n if (!isBroadcast) {\n assignment = output.setByOffset(\n 'global_idx',\n expression(a.getByOffset('global_idx'), b.getByOffset('global_idx'), c.getByOffset('global_idx')));\n } else {\n const singleAssignment = (resStr: string, x: number, typeCast = '') => {\n const expressionA = `a_data[index_a${x}][component_a${x}]`;\n const expressionB = `b_data[index_b${x}][component_b${x}]`;\n // eslint-disable-next-line no-bitwise\n const expressionC = `bool(c_data[index_c${x}] & (0xffu << (component_c${x} * 8)))`;\n return `\n let output_indices${x} = ${output.offsetToIndices(`global_idx * 4u + ${x}u`)};\n let offset_a${x} = ${a.broadcastedIndicesToOffset(`output_indices${x}`, output)};\n let offset_b${x} = ${b.broadcastedIndicesToOffset(`output_indices${x}`, output)};\n let offset_c${x} = ${c.broadcastedIndicesToOffset(`output_indices${x}`, output)};\n let index_a${x} = offset_a${x} / 4u;\n let index_b${x} = offset_b${x} / 4u;\n let index_c${x} = offset_c${x} / 4u;\n let component_a${x} = offset_a${x} % 4u;\n let component_b${x} = offset_b${x} % 4u;\n let component_c${x} = offset_c${x} % 4u;\n ${resStr}[${x}] = ${typeCast}(${expression(expressionA, expressionB, expressionC)});\n `;\n };\n if (typeOutput === DataType.bool) {\n assignment = `\n var data = vec4(0);\n ${singleAssignment('data', 0, 'u32')}\n ${singleAssignment('data', 1, 'u32')}\n ${singleAssignment('data', 2, 'u32')}\n ${singleAssignment('data', 3, 'u32')}\n output_data[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`;\n } else {\n assignment = `\n ${singleAssignment('output_data[global_idx]', 0)}\n ${singleAssignment('output_data[global_idx]', 1)}\n ${singleAssignment('output_data[global_idx]', 2)}\n ${singleAssignment('output_data[global_idx]', 3)}\n `;\n }\n }\n\n return `\n ${shaderHelper.registerUniform('vec_size', 'u32').declareVariables(c, a, b, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.vec_size')}\n ${assignment}\n }`;\n };\n\nconst createWhereOpProgramInfo = (inputs: readonly TensorView[]): ProgramInfo => {\n const dimsA = inputs[1].dims;\n const dimsB = inputs[2].dims;\n const dimsC = inputs[0].dims;\n const outputDataType = inputs[1].dataType;\n\n const isBroadcast = !(ShapeUtil.areEqual(dimsA, dimsB) && ShapeUtil.areEqual(dimsB, dimsC));\n let outputShape = dimsA;\n let outputSize = ShapeUtil.size(dimsA);\n // TODO: deal with zero-sized tensors (eg. dims=[1,0])\n\n if (isBroadcast) {\n const calculatedShape = BroadcastUtil.calcShape(BroadcastUtil.calcShape(dimsA, dimsB, false)!, dimsC, false);\n if (!calculatedShape) {\n throw new Error('Can\\'t perform where op on the given tensors');\n }\n outputShape = calculatedShape;\n outputSize = ShapeUtil.size(outputShape);\n }\n\n const vecSize = Math.ceil(outputSize / 4);\n\n return {\n name: 'Where',\n shaderCache: {inputDependencies: ['rank', 'rank', 'rank']},\n getShaderSource: (shaderHelper) =>\n createWhereOpProgramShader(shaderHelper, inputs, outputShape, isBroadcast, outputDataType),\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: outputDataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */ / 4 /* vec size */)},\n programUniforms:\n [{type: DataType.uint32, data: vecSize}, ...createTensorShapeVariables(dimsC, dimsA, dimsB, outputShape)],\n }),\n };\n};\n\nexport const where = (context: ComputeContext): void => {\n context.compute(createWhereOpProgramInfo(context.inputs));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {argMax, argMin, parseArgMinMaxAttributes} from './ops/argminmax';\nimport {attention} from './ops/attention';\nimport {batchNorm} from './ops/batch-norm';\nimport {biasAdd} from './ops/bias-add';\nimport {biasSplitGelu} from './ops/bias-split-gelu';\nimport * as binaryOps from './ops/binary-op';\nimport {concat, parseConcatAttributes} from './ops/concat';\nimport {conv, parseConvAttributes} from './ops/conv';\nimport {convTranspose, parseConvTransposeAttributes} from './ops/conv-transpose';\nimport {cumsum, parseCumSumAttributes} from './ops/cumsum';\nimport {depthToSpace, parseDepthToSpaceAttributes} from './ops/depth-to-space';\nimport {einsum, parseEinsumAttributes} from './ops/einsum';\nimport {expand} from './ops/expand';\nimport {fastGelu} from './ops/fast-gelu';\nimport {gather, parseGatherAttributes} from './ops/gather';\nimport {gatherElements, parseGatherElementsAttributes} from './ops/gather-elements';\nimport {gemm, parseGemmAttributes} from './ops/gemm';\nimport {groupQueryAttention, parseGroupQueryAttentionAttributes} from './ops/group-query-attention';\nimport {instanceNorm} from './ops/instance-norm';\nimport {layerNorm} from './ops/layer-norm';\nimport {matMul} from './ops/matmul';\nimport {matMulNBits, parseMatMulNBitsAttributes} from './ops/matmulnbits';\nimport {multiHeadAttention, parseMultiHeadAttentionAttributes} from './ops/multihead-attention';\nimport {pad} from './ops/pad';\nimport * as pool from './ops/pool';\nimport {range} from './ops/range';\nimport {reduceL1, reduceL2, reduceLogSum, reduceLogSumExp, reduceMax, reduceMean, reduceMin, reduceProd, reduceSum, reduceSumSquare} from './ops/reduce';\nimport {parseResizeAttributes, resize} from './ops/resize';\nimport {rotaryEmbedding} from './ops/rotary-embedding';\nimport {skipLayerNorm} from './ops/skip-layer-norm';\nimport {parseSliceAttributes, slice} from './ops/slice';\nimport {parseSoftmaxAttributes, softmax} from './ops/softmax';\nimport {parseSplitAttributes, split} from './ops/split';\nimport {tile} from './ops/tile';\nimport {parseTransposeAttributes, transpose} from './ops/transpose';\nimport * as unaryOps from './ops/unary-op';\nimport {where} from './ops/where';\nimport {ComputeContext} from './types';\n\nexport type RunFunction = (context: ComputeContext, attribute?: unknown) => void;\nexport type ParseAttributeFunction = (attributeRaw: unknown) => unknown;\nexport type OperatorImplementation = [RunFunction]|[RunFunction, ParseAttributeFunction];\n\nexport const WEBGPU_OP_RESOLVE_RULES: Map = new Map([\n ['Abs', [unaryOps.abs]],\n ['Acos', [unaryOps.acos]],\n ['Acosh', [unaryOps.acosh]],\n ['Add', [binaryOps.add]],\n ['ArgMax', [argMax, parseArgMinMaxAttributes]],\n ['ArgMin', [argMin, parseArgMinMaxAttributes]],\n ['Asin', [unaryOps.asin]],\n ['Asinh', [unaryOps.asinh]],\n ['Atan', [unaryOps.atan]],\n ['Atanh', [unaryOps.atanh]],\n ['Attention', [attention]],\n // TODO: support new attributes for AveragePool-10\n ['AveragePool', [pool.averagePool, pool.parseAveragePoolAttributes]],\n ['BatchNormalization', [batchNorm]],\n ['BiasAdd', [biasAdd]],\n ['BiasSplitGelu', [biasSplitGelu]],\n ['Cast', [unaryOps.cast, unaryOps.parseCastAttributes]],\n ['Ceil', [unaryOps.ceil]],\n ['Clip', [unaryOps.clip]],\n ['Concat', [concat, parseConcatAttributes]],\n ['Conv', [conv, parseConvAttributes]],\n ['ConvTranspose', [convTranspose, parseConvTransposeAttributes]],\n ['Cos', [unaryOps.cos]],\n ['Cosh', [unaryOps.cosh]],\n ['CumSum', [cumsum, parseCumSumAttributes]],\n ['DepthToSpace', [depthToSpace, parseDepthToSpaceAttributes]],\n ['Div', [binaryOps.div]],\n ['Einsum', [einsum, parseEinsumAttributes]],\n ['Elu', [unaryOps.elu, unaryOps.parseAlphaAttributes]],\n ['Equal', [binaryOps.equal]],\n ['Erf', [unaryOps.erf]],\n ['Exp', [unaryOps.exp]],\n ['Expand', [expand]],\n ['FastGelu', [fastGelu]],\n ['Floor', [unaryOps.floor]],\n ['FusedConv', [conv, parseConvAttributes]],\n ['Gather', [gather, parseGatherAttributes]],\n ['GatherElements', [gatherElements, parseGatherElementsAttributes]],\n ['Gelu', [unaryOps.gelu]],\n ['Gemm', [gemm, parseGemmAttributes]],\n ['GlobalAveragePool', [pool.globalAveragePool, pool.parseGlobalAveragePoolAttributes]],\n ['GlobalMaxPool', [pool.globalMaxPool, pool.parseGlobalMaxPoolAttributes]],\n ['Greater', [binaryOps.greater]],\n ['GreaterOrEqual', [binaryOps.greaterOrEqual]],\n ['GroupQueryAttention', [groupQueryAttention, parseGroupQueryAttentionAttributes]],\n ['HardSigmoid', [unaryOps.hardSigmoid, unaryOps.parseHardSigmoidAttributes]],\n ['InstanceNormalization', [instanceNorm]],\n ['LayerNormalization', [layerNorm]],\n ['LeakyRelu', [unaryOps.leakyRelu, unaryOps.parseAlphaAttributes]],\n ['Less', [binaryOps.less]],\n ['LessOrEqual', [binaryOps.lessOrEqual]],\n ['Log', [unaryOps.log]],\n ['MatMul', [matMul]],\n ['MatMulNBits', [matMulNBits, parseMatMulNBitsAttributes]],\n // TODO: support new attributes for MaxPool-8 and MaxPool-10\n ['MaxPool', [pool.maxPool, pool.parseMaxPoolAttributes]],\n ['Mul', [binaryOps.mul]],\n ['MultiHeadAttention', [multiHeadAttention, parseMultiHeadAttentionAttributes]],\n ['Neg', [unaryOps.neg]],\n ['Not', [unaryOps.not]],\n ['Pad', [pad]],\n ['Pow', [binaryOps.pow]],\n ['QuickGelu', [unaryOps.quickgelu, unaryOps.parseAlphaAttributes]],\n ['Range', [range]],\n ['Reciprocal', [unaryOps.reciprocal]],\n ['ReduceMin', [reduceMin]],\n ['ReduceMean', [reduceMean]],\n ['ReduceMax', [reduceMax]],\n ['ReduceSum', [reduceSum]],\n ['ReduceProd', [reduceProd]],\n ['ReduceL1', [reduceL1]],\n ['ReduceL2', [reduceL2]],\n ['ReduceLogSum', [reduceLogSum]],\n ['ReduceLogSumExp', [reduceLogSumExp]],\n ['ReduceSumSquare', [reduceSumSquare]],\n ['Relu', [unaryOps.relu]],\n ['Resize', [resize, parseResizeAttributes]],\n ['RotaryEmbedding', [rotaryEmbedding]],\n ['Sigmoid', [unaryOps.sigmoid]],\n ['Sin', [unaryOps.sin]],\n ['Sinh', [unaryOps.sinh]],\n ['Slice', [slice, parseSliceAttributes]],\n ['SkipLayerNormalization', [skipLayerNorm]],\n ['Split', [split, parseSplitAttributes]],\n ['Sqrt', [unaryOps.sqrt]],\n ['Softmax', [softmax, parseSoftmaxAttributes]],\n ['Sub', [binaryOps.sub]],\n ['Tan', [unaryOps.tan]],\n ['Tanh', [unaryOps.tanh]],\n ['ThresholdedRelu', [unaryOps.thresholdedRelu, unaryOps.parseAlphaAttributes]],\n ['Tile', [tile]],\n ['Transpose', [transpose, parseTransposeAttributes]],\n ['Where', [where]],\n]);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TRACE_FUNC_BEGIN, TRACE_FUNC_END} from 'onnxruntime-common';\n\nimport {WebGpuBackend} from '../backend-webgpu';\nimport {LOG_DEBUG} from '../log';\n\nimport {createShaderHelper} from './ops/common';\nimport {Artifact, GpuData, ProgramInfo} from './types';\n\n/**\n * ProgramManager is the main class behind running computations\n * It builds ProgramInfo's into Artifacts\n * It compiles given ProgramInfo's into WebGL Prorams (cached as Artifacts)\n * Uses the artifact to run the computation by calling Draw on\n * the WebGL drawing buffer\n * ProgramManager automatically maps (binds) input variables to their\n * corresponding Location's in the binary program\n */\nexport class ProgramManager {\n repo: Map; // this should be per-session object\n attributesBound: boolean;\n\n constructor(private backend: WebGpuBackend) {\n this.repo = new Map();\n this.attributesBound = false;\n }\n getArtifact(key: unknown): Artifact|undefined {\n return this.repo.get(key);\n }\n setArtifact(key: unknown, artifact: Artifact): void {\n this.repo.set(key, artifact);\n }\n run(buildArtifact: Artifact, inputs: GpuData[], outputs: GpuData[], dispatchGroup: [number, number, number],\n uniformBufferBinding: GPUBindingResource|undefined): void {\n TRACE_FUNC_BEGIN(buildArtifact.programInfo.name);\n const device = this.backend.device;\n const computePassEncoder = this.backend.getComputePassEncoder();\n this.backend.writeTimestamp(this.backend.pendingDispatchNumber * 2);\n const entries = [];\n for (const input of inputs) {\n entries.push({binding: entries.length, resource: {buffer: input.buffer}});\n }\n for (const output of outputs) {\n entries.push({binding: entries.length, resource: {buffer: output.buffer}});\n }\n if (uniformBufferBinding) {\n entries.push({binding: entries.length, resource: uniformBufferBinding});\n }\n const bindGroup = device.createBindGroup(\n {layout: buildArtifact.computePipeline.getBindGroupLayout(0), entries, label: buildArtifact.programInfo.name});\n\n if (this.backend.sessionStatus === 'capturing') {\n const commandInfo = {\n kernelId: this.backend.currentKernelId!,\n computePipeline: buildArtifact.computePipeline,\n bindGroup,\n dispatchGroup\n };\n const sessionCommandList = this.backend.capturedCommandList.get(this.backend.currentSessionId!);\n sessionCommandList!.push(commandInfo);\n }\n\n computePassEncoder.setPipeline(buildArtifact.computePipeline);\n computePassEncoder.setBindGroup(0, bindGroup);\n computePassEncoder.dispatchWorkgroups(...dispatchGroup);\n this.backend.writeTimestamp(this.backend.pendingDispatchNumber * 2 + 1);\n this.backend.pendingDispatchNumber++;\n\n if (this.backend.pendingDispatchNumber >= this.backend.maxDispatchNumber ||\n this.backend.queryType === 'at-passes') {\n this.backend.endComputePass();\n }\n if (this.backend.pendingDispatchNumber >= this.backend.maxDispatchNumber) {\n this.backend.flush();\n }\n TRACE_FUNC_END(buildArtifact.programInfo.name);\n }\n dispose(): void {\n // this.repo.forEach(a => this.glContext.deleteProgram(a.program));\n }\n build(programInfo: ProgramInfo, normalizedDispatchGroupSize: [number, number, number]): Artifact {\n TRACE_FUNC_BEGIN(programInfo.name);\n const device = this.backend.device;\n const extensions: string[] = [];\n if (device.features.has('shader-f16')) {\n extensions.push('enable f16;');\n }\n const shaderHelper = createShaderHelper(normalizedDispatchGroupSize, this.backend.device.limits);\n const userCode = programInfo.getShaderSource(shaderHelper);\n const code = `${extensions.join('\\n')}\\n${shaderHelper.additionalImplementations}\\n${userCode}`;\n const shaderModule = device.createShaderModule({code, label: programInfo.name});\n LOG_DEBUG('verbose', () => `[WebGPU] ${programInfo.name} shader code: ${code}`);\n\n const computePipeline = device.createComputePipeline(\n {compute: {module: shaderModule, entryPoint: 'main'}, layout: 'auto', label: programInfo.name});\n\n TRACE_FUNC_END(programInfo.name);\n return {programInfo, computePipeline, uniformVariablesInfo: shaderHelper.variablesInfo};\n }\n\n normalizeDispatchGroupSize(dispatchGroup: ReturnType['dispatchGroup']):\n [number, number, number] {\n const x = typeof dispatchGroup === 'number' ? dispatchGroup : dispatchGroup.x;\n const y = typeof dispatchGroup === 'number' ? 1 : (dispatchGroup.y || 1);\n const z = typeof dispatchGroup === 'number' ? 1 : (dispatchGroup.z || 1);\n const limitPerDimension = this.backend.device.limits.maxComputeWorkgroupsPerDimension;\n if (x <= limitPerDimension && y <= limitPerDimension && z <= limitPerDimension) {\n return [x, y, z];\n }\n const size = x * y * z;\n let dispatchAverage = Math.ceil(Math.sqrt(size));\n if (dispatchAverage > limitPerDimension) {\n dispatchAverage = Math.ceil(Math.cbrt(size));\n if (dispatchAverage > limitPerDimension) {\n throw new Error('Total dispatch size exceeds WebGPU maximum.');\n }\n return [dispatchAverage, dispatchAverage, dispatchAverage];\n } else {\n return [dispatchAverage, dispatchAverage, 1];\n }\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env, Tensor, TRACE, TRACE_FUNC_BEGIN, TRACE_FUNC_END} from 'onnxruntime-common';\n\nimport {DataType, tensorDataTypeEnumToString} from '../wasm-common';\n\nimport {configureLogger, LOG_DEBUG} from './log';\nimport {createView, TensorView} from './tensor-view';\nimport {createGpuDataManager, downloadGpuData, GpuDataManager} from './webgpu/gpu-data-manager';\nimport {RunFunction, WEBGPU_OP_RESOLVE_RULES} from './webgpu/op-resolve-rules';\nimport {ProgramManager} from './webgpu/program-manager';\nimport {AdapterInfo, ComputeContext, GpuArchitecture, GpuData, GpuVendor, ProgramInfo, ProgramInputTensorInfoDependency, SessionState, TimestampQuery} from './webgpu/types';\n\ninterface CommandInfo {\n readonly kernelId: number;\n readonly computePipeline: GPUComputePipeline;\n readonly bindGroup: GPUBindGroup;\n readonly dispatchGroup: [number, number, number];\n}\n\ninterface KernelInfo {\n readonly kernelType: string;\n readonly kernelName: string;\n readonly kernelEntry: RunFunction;\n readonly attributes: [((attribute: unknown) => unknown)|undefined, unknown];\n}\n\ninterface PendingKernelInfo {\n readonly kernelId: number;\n readonly programName: string;\n readonly inputTensorViews: readonly TensorView[];\n readonly outputTensorViews: readonly TensorView[];\n}\n\nconst getProgramInputTensorInfoDependencyKey =\n (inputTensors: readonly TensorView[], inputDependencies: readonly ProgramInputTensorInfoDependency[]): string => {\n if (inputDependencies.length !== inputTensors.length) {\n throw new Error(`inputDependencies length ${inputDependencies.length} is not equal to inputTensors length ${\n inputTensors.length}.`);\n }\n\n const inputInfos: string[] = [];\n for (let i = 0; i < inputTensors.length; ++i) {\n const type = inputTensors[i].dataType;\n switch (inputDependencies[i]) {\n case 'none': {\n inputInfos.push('');\n break;\n }\n case 'type': {\n inputInfos.push(`${type}`);\n break;\n }\n case 'rank': {\n const rank = inputTensors[i].dims.length;\n inputInfos.push(`${type};${rank}`);\n break;\n }\n case 'dims': {\n const dims = inputTensors[i].dims.join(',');\n inputInfos.push(`${type};${dims}`);\n break;\n }\n default:\n throw new Error(`unsupported input dependency: ${inputDependencies[i]}`);\n }\n }\n\n return inputInfos.join('|');\n };\n\n/**\n * get a unique key representing the program from the program info, input shapes and types.\n *\n * @returns a unique key is a shorter string than the shader source, which contains all the information to identify a\n * program. if the key is the same, the program shader source should be the same, so we can reuse the program.\n *\n */\nconst getProgramInfoUniqueKey =\n (programInfo: ProgramInfo, inputTensors: readonly TensorView[], is1DimensionDispatch: boolean): string => {\n // final key format:\n // []:is1DimensionDispatch:||...\n let key = programInfo.name;\n if (programInfo.shaderCache?.hint) {\n key += '[' + programInfo.shaderCache.hint + ']';\n }\n key += ':' + is1DimensionDispatch +\n `:${\n getProgramInputTensorInfoDependencyKey(\n inputTensors,\n programInfo.shaderCache?.inputDependencies ??\n new Array(inputTensors.length).fill('dims'))}`;\n return key;\n };\n\nclass AdapterInfoImpl implements AdapterInfo {\n readonly architecture?: string;\n readonly vendor?: string;\n\n constructor(adapterInfo: GPUAdapterInfo) {\n if (adapterInfo) {\n this.architecture = adapterInfo.architecture;\n this.vendor = adapterInfo.vendor;\n }\n }\n\n isArchitecture(architecture: GpuArchitecture): boolean {\n return this.architecture === architecture;\n }\n\n isVendor(vendor: GpuVendor): boolean {\n return this.vendor === vendor;\n }\n}\n\n/**\n * this class is designed to store status and being used as a singleton for JSEP. It will be passed to jsepInit() as\n * the first parameter so that it is stored for future use.\n */\nexport class WebGpuBackend {\n adapterInfo: AdapterInfoImpl;\n device: GPUDevice;\n /**\n * an instance of GpuDataManager to manage a GpuDataId -> GpuBuffer mapping\n */\n gpuDataManager: GpuDataManager;\n /**\n * an instance of ProgramManager to build and run WebGPU compute shader program, and manage a ProgramKey -> Program\n * artifacts mapping\n */\n programManager: ProgramManager;\n\n /**\n * representing the session ID of which is currently being run.\n * `null` means no session is being run.\n * only valid when session.run is executed.\n */\n currentSessionId: number|null = null;\n\n /**\n * representing the kernel ID of which is currently being computed (CPU code perspective).\n * `null` means no kernel is being computed.\n * only one kernel can be computed at a moment.\n */\n currentKernelId: number|null = null;\n /**\n * a list of temporary GPU data for the current kernel. should release when the kernel done computation.\n */\n private temporaryData: GpuData[];\n /**\n * a KernelID -> a GPU data list, which stores persistent GPU data owned by the specific kernel.\n */\n private kernelPersistentData: Map;\n /**\n * a KernelID -> a custom data, which stores custom data owned by the specific kernel.\n */\n private kernelCustomData: Map;\n /**\n * get the custom data of the current kernel\n */\n get currentKernelCustomData(): {[key: string]: unknown} {\n if (this.currentKernelId === null) {\n throw new Error('currentKernelCustomData(): currentKernelId is null. (should not happen)');\n }\n\n let data = this.kernelCustomData.get(this.currentKernelId);\n if (!data) {\n data = {};\n this.kernelCustomData.set(this.currentKernelId, data);\n }\n\n return data;\n }\n\n // KernelID -> kernelInfo mapping\n kernels: Map;\n private commandEncoder: GPUCommandEncoder|null = null;\n private computePassEncoder: GPUComputePassEncoder|null = null;\n maxDispatchNumber = 16;\n pendingDispatchNumber = 0;\n\n // info of kernels pending submission for a single batch\n private pendingKernels: PendingKernelInfo[] = [];\n // queryReadBuffer -> pendingKernels mapping for all the batches\n private pendingQueries: Map = new Map();\n private queryResolveBuffer?: GPUBuffer;\n private querySet?: GPUQuerySet;\n private queryTimeBase?: bigint;\n queryType: TimestampQuery;\n\n env: Env;\n sessionStatus: SessionState = 'default';\n /**\n * a SessionID -> CommandInfo[] mapping. It's used to record all GPU commands for corresponding session.\n */\n capturedCommandList: Map = new Map();\n\n /**\n * a SessionID -> PendingKernelInfo[] mapping for profiling.\n */\n private capturedPendingKernels: Map = new Map();\n\n /**\n * a SessionID -> a Map of (InputOutputIndex -> [ID, GPUBuffer]) mapping.\n */\n sessionExternalDataMapping: Map> = new Map();\n\n async initialize(env: Env, adapter: GPUAdapter): Promise {\n this.env = env;\n const requiredFeatures: GPUFeatureName[] = [];\n const deviceDescriptor: GPUDeviceDescriptor = {\n requiredLimits: {\n maxComputeWorkgroupStorageSize: adapter.limits.maxComputeWorkgroupStorageSize,\n maxComputeWorkgroupsPerDimension: adapter.limits.maxComputeWorkgroupsPerDimension,\n maxStorageBufferBindingSize: adapter.limits.maxStorageBufferBindingSize,\n maxBufferSize: adapter.limits.maxBufferSize,\n maxComputeInvocationsPerWorkgroup: adapter.limits.maxComputeInvocationsPerWorkgroup,\n maxComputeWorkgroupSizeX: adapter.limits.maxComputeWorkgroupSizeX,\n maxComputeWorkgroupSizeY: adapter.limits.maxComputeWorkgroupSizeY,\n maxComputeWorkgroupSizeZ: adapter.limits.maxComputeWorkgroupSizeZ,\n },\n requiredFeatures,\n };\n\n if (adapter.features.has('chromium-experimental-timestamp-query-inside-passes')) {\n requiredFeatures.push('chromium-experimental-timestamp-query-inside-passes' as GPUFeatureName);\n } else if (adapter.features.has('timestamp-query')) {\n requiredFeatures.push('timestamp-query');\n }\n if (adapter.features.has('shader-f16')) {\n requiredFeatures.push('shader-f16');\n }\n\n this.device = await adapter.requestDevice(deviceDescriptor);\n this.adapterInfo = new AdapterInfoImpl(adapter.info || await adapter.requestAdapterInfo());\n this.gpuDataManager = createGpuDataManager(this);\n this.programManager = new ProgramManager(this);\n this.kernels = new Map();\n this.kernelPersistentData = new Map();\n this.kernelCustomData = new Map();\n\n // set up flags for logger\n configureLogger(env.logLevel!, !!env.debug);\n\n // TODO: set up flags\n\n this.device.onuncapturederror = ev => {\n if (ev.error instanceof GPUValidationError) {\n // eslint-disable-next-line no-console\n console.error(`An uncaught WebGPU validation error was raised: ${ev.error.message}`);\n }\n };\n\n Object.defineProperty(\n this.env.webgpu, 'device', {value: this.device, writable: false, enumerable: true, configurable: false});\n Object.defineProperty(\n this.env.webgpu, 'adapter', {value: adapter, writable: false, enumerable: true, configurable: false});\n\n // init queryType, which is necessary for InferenceSession.create\n this.setQueryType();\n }\n\n dispose(): void {\n if (typeof this.querySet !== 'undefined') {\n this.querySet.destroy();\n }\n this.gpuDataManager.dispose();\n }\n\n getCommandEncoder(): GPUCommandEncoder {\n if (!this.commandEncoder) {\n this.commandEncoder = this.device.createCommandEncoder();\n }\n return this.commandEncoder;\n }\n\n getComputePassEncoder(): GPUComputePassEncoder {\n if (!this.computePassEncoder) {\n const commandEncoder = this.getCommandEncoder();\n const computePassDescriptor: GPUComputePassDescriptor = {};\n\n if (this.queryType === 'at-passes') {\n computePassDescriptor.timestampWrites = {\n querySet: this.querySet!,\n beginningOfPassWriteIndex: this.pendingDispatchNumber * 2,\n endOfPassWriteIndex: this.pendingDispatchNumber * 2 + 1,\n };\n }\n\n this.computePassEncoder = commandEncoder.beginComputePass(computePassDescriptor);\n }\n return this.computePassEncoder;\n }\n\n endComputePass(): void {\n if (this.computePassEncoder) {\n this.computePassEncoder.end();\n this.computePassEncoder = null;\n }\n }\n\n flush(): void {\n if (!this.commandEncoder) {\n return;\n }\n\n TRACE_FUNC_BEGIN();\n\n this.endComputePass();\n let queryReadBuffer: GPUBuffer;\n if (this.queryType !== 'none') {\n this.commandEncoder.resolveQuerySet(\n this.querySet!, 0, this.pendingDispatchNumber * 2, this.queryResolveBuffer!, 0);\n\n queryReadBuffer = this.device.createBuffer(\n // eslint-disable-next-line no-bitwise\n {size: this.pendingDispatchNumber * 2 * 8, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST});\n\n this.pendingQueries.set(queryReadBuffer, this.pendingKernels);\n this.pendingKernels = [];\n this.commandEncoder.copyBufferToBuffer(\n this.queryResolveBuffer!, 0, queryReadBuffer, 0, this.pendingDispatchNumber * 2 * 8);\n }\n\n this.device.queue.submit([this.commandEncoder.finish()]);\n this.gpuDataManager.refreshPendingBuffers();\n this.commandEncoder = null;\n this.pendingDispatchNumber = 0;\n\n if (this.queryType !== 'none') {\n void queryReadBuffer!.mapAsync(GPUMapMode.READ).then(() => {\n const mappedData = new BigUint64Array(queryReadBuffer.getMappedRange());\n const pendingKernels = this.pendingQueries.get(queryReadBuffer)!;\n for (let i = 0; i < mappedData.length / 2; i++) {\n const pendingKernelInfo = pendingKernels[i];\n const kernelId = pendingKernelInfo.kernelId;\n const kernelInfo = this.kernels.get(kernelId)!;\n const kernelType = kernelInfo.kernelType;\n const kernelName = kernelInfo.kernelName;\n const programName = pendingKernelInfo.programName;\n const inputTensorViews = pendingKernelInfo.inputTensorViews;\n const outputTensorViews = pendingKernelInfo.outputTensorViews;\n const startTimeU64 = mappedData[i * 2];\n const endTimeU64 = mappedData[i * 2 + 1];\n\n if (typeof this.queryTimeBase === 'undefined') {\n this.queryTimeBase = startTimeU64;\n }\n\n const startTime = Number(startTimeU64 - this.queryTimeBase);\n const endTime = Number(endTimeU64 - this.queryTimeBase);\n\n if (!Number.isSafeInteger(startTime) || !Number.isSafeInteger(endTime)) {\n throw new RangeError('incorrect timestamp range');\n }\n\n if (this.env.webgpu.profiling?.ondata) {\n this.env.webgpu.profiling.ondata({\n version: 1,\n inputsMetadata: inputTensorViews.map(\n value => ({dims: value.dims, dataType: tensorDataTypeEnumToString(value.dataType)})),\n outputsMetadata: outputTensorViews.map(\n value => ({dims: value.dims, dataType: tensorDataTypeEnumToString(value.dataType)})),\n kernelId,\n kernelType,\n kernelName,\n programName,\n startTime,\n endTime,\n });\n } else {\n // if no callback is provided, print the profiling message to console\n let inputShapes = '';\n inputTensorViews.forEach((value, i) => {\n inputShapes += `input[${i}]: [${value.dims}] | ${tensorDataTypeEnumToString(value.dataType)}, `;\n });\n let outputShapes = '';\n outputTensorViews.forEach((value, i) => {\n outputShapes += `output[${i}]: [${value.dims}] | ${tensorDataTypeEnumToString(value.dataType)}, `;\n });\n // eslint-disable-next-line no-console\n console.log(`[profiling] kernel \"${kernelId}|${kernelType}|${kernelName}|${programName}\" ${inputShapes}${\n outputShapes}execution time: ${endTime - startTime} ns`);\n }\n TRACE('GPU', `${programName}::${startTimeU64}::${endTimeU64}`);\n }\n queryReadBuffer.unmap();\n this.pendingQueries.delete(queryReadBuffer);\n });\n }\n TRACE_FUNC_END();\n }\n\n /**\n * run a WebGPU program.\n * @param program a ProgramInfo instance\n * @param inputTensorViews a TensorView array. each element represents a value already exists in GPU.\n * @param outputIndices an indices array. each element can be either -1 (temporary data), -2 (persistent data) or an\n * index to the kernel's output.\n * @param createKernelOutput a callback function that create a value to kernel's output with the given index\n * @param createIntermediateOutput a callback function that create a value as a intermediate value, either temporary\n * or persistent (owned by the current kernel)\n * @returns a TensorView array representing the result.\n */\n run(program: ProgramInfo, inputTensorViews: readonly TensorView[], outputIndices: readonly number[],\n createKernelOutput: (index: number, dataType: number, dims: readonly number[]) => TensorView,\n createIntermediateOutput: (dataType: number, dims: readonly number[]) => TensorView,\n outputCount: number): TensorView[] {\n TRACE_FUNC_BEGIN(program.name);\n // create info for inputs\n const inputDatas: GpuData[] = [];\n for (let i = 0; i < inputTensorViews.length; ++i) {\n const data = inputTensorViews[i].data;\n // if tensor view data is 0, it means the output is zero-sized tensor, and there is no GPU data for it.\n if (data === 0) {\n continue;\n }\n const gpuData = this.gpuDataManager.get(data);\n if (!gpuData) {\n throw new Error(`no GPU data for input: ${data}`);\n }\n inputDatas.push(gpuData);\n }\n\n const {outputs, dispatchGroup, programUniforms} = program.getRunData(inputTensorViews);\n\n // check output indices\n const validatedOutputIndices = outputIndices.length === 0 ? outputs.map((_, i) => i) : outputIndices;\n if (validatedOutputIndices.length !== outputs.length) {\n throw new Error(`Output size ${validatedOutputIndices.length} must be equal to ${outputs.length}.`);\n }\n\n // create info for outputs\n const outputTensorViews: TensorView[] = [];\n const outputDatas: GpuData[] = [];\n for (let i = 0; i < outputs.length; ++i) {\n // value -1 and -2 are used for creating temporary and persistent outputs.\n // value -3 is used for placeholder output. So -3, -2, -1 and 0, 1, 2, ... are valid\n // output indices. see type definition of ComputeContextInputsOutputsMapping for more details.\n if (!Number.isInteger(validatedOutputIndices[i]) || validatedOutputIndices[i] < -3 ||\n validatedOutputIndices[i] >= outputCount) {\n throw new Error(`Invalid output index: ${validatedOutputIndices[i]}`);\n }\n if (validatedOutputIndices[i] === -3) {\n continue;\n }\n const isTemporary = validatedOutputIndices[i] === -1;\n const isPersistent = validatedOutputIndices[i] === -2;\n const tensorView = (isTemporary || isPersistent) ?\n createIntermediateOutput(outputs[i].dataType, outputs[i].dims) :\n createKernelOutput(validatedOutputIndices[i], outputs[i].dataType, outputs[i].dims);\n outputTensorViews.push(tensorView);\n // if tensor view data is 0, it means the output is zero-sized tensor, and there is no GPU data for it.\n if (tensorView.data === 0) {\n continue;\n }\n const gpuData = this.gpuDataManager.get(tensorView.data);\n if (!gpuData) {\n throw new Error(`no GPU data for output: ${tensorView.data}`);\n }\n if (isTemporary) {\n this.temporaryData.push(gpuData);\n }\n if (isPersistent) {\n let persistentData = this.kernelPersistentData.get(this.currentKernelId!);\n if (!persistentData) {\n persistentData = [];\n this.kernelPersistentData.set(this.currentKernelId!, persistentData);\n }\n persistentData.push(gpuData);\n }\n outputDatas.push(gpuData);\n }\n\n // when there are any zero-sized tensor in the inputs or outputs, we should report error unless all outputs are\n // zero-sized tensors.\n if (inputDatas.length !== inputTensorViews.length || outputDatas.length !== outputTensorViews.length) {\n // if all outputs are zero-sized tensors, there is no need to run the program.\n if (outputDatas.length === 0) {\n TRACE_FUNC_END(program.name);\n return outputTensorViews;\n }\n // if some outputs are zero-sized tensors, report an error.\n //\n // TODO: so far we don't see any use case that outputs include both zero-sized tensors and non-zero-sized tensors.\n // If we see such use case, we need to make a change here to support it.\n throw new Error(\n `Program ${program.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`);\n }\n\n // load uniforms\n // TODO: add cache for uniform (is it necessary?)\n //\n let uniformBufferBinding: GPUBindingResource|undefined;\n if (programUniforms) {\n let currentOffset = 0;\n const offsets: number[] = [];\n\n programUniforms.forEach(v => {\n const data = typeof v.data === 'number' ? [v.data] : v.data;\n if (data.length === 0) {\n return;\n }\n // https://www.w3.org/TR/WGSL/#alignof\n const sizeOfElement = v.type === DataType.float16 ? 2 : 4;\n let sizeOfVecOrMat;\n let baseAlignment;\n if (v.type === DataType.float16) {\n baseAlignment = data.length > 4 ? 16 : (data.length > 2 ? 8 : data.length * sizeOfElement);\n sizeOfVecOrMat = data.length > 4 ? 16 : sizeOfElement * data.length;\n } else {\n baseAlignment = data.length <= 2 ? data.length * sizeOfElement : 16;\n sizeOfVecOrMat = 16;\n }\n currentOffset = Math.ceil(currentOffset / baseAlignment) * baseAlignment;\n offsets.push(currentOffset);\n // For non-float16 type, when data.length > 4, the uniform variable is of type array,N>, where\n // N = Math.ceil(data.length / 4) and SizeOf(vec4) = 16. The total byte length is N *\n // SizeOf(vec4). For float16 type, when data.length > 4, the uniform variable is of type\n // array,N>, where N = Math.ceil(data.length / 8) and SizeOf(mat2x4) = 16. The total byte\n // length is N * SizeOf(mat2x4).\n const elementPerVecOrMat = v.type === DataType.float16 ? 8 : 4;\n currentOffset += data.length > 4 ? Math.ceil(data.length / elementPerVecOrMat) * sizeOfVecOrMat :\n data.length * sizeOfElement;\n });\n\n // Meet alignment of struct here: https://www.w3.org/TR/WGSL/#alignment-and-size. For simplicity, set\n // maxAlignmentOfField to 16 since the underlying buffer has been rounded up to 16.\n const maxAlignmentOfField = 16;\n currentOffset = Math.ceil(currentOffset / maxAlignmentOfField) * maxAlignmentOfField;\n const arrayBuffer = new ArrayBuffer(currentOffset);\n programUniforms.forEach((v, i) => {\n const offset = offsets[i];\n const data = typeof v.data === 'number' ? [v.data] : v.data;\n if (v.type === DataType.int32) {\n new Int32Array(arrayBuffer, offset, data.length).set(data);\n } else if (v.type === DataType.uint32) {\n new Uint32Array(arrayBuffer, offset, data.length).set(data);\n } else if (v.type === DataType.float16) {\n // TODO: use Float16Array.\n new Uint16Array(arrayBuffer, offset, data.length).set(data);\n } else if (v.type === DataType.float) {\n new Float32Array(arrayBuffer, offset, data.length).set(data);\n } else {\n throw new Error(`Unsupported uniform type: ${tensorDataTypeEnumToString(v.type)}`);\n }\n });\n\n const uniformBufferData =\n // eslint-disable-next-line no-bitwise\n this.gpuDataManager.create(currentOffset, GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM);\n this.device.queue.writeBuffer(uniformBufferData.buffer, 0, arrayBuffer, 0, currentOffset);\n this.gpuDataManager.release(uniformBufferData.id);\n uniformBufferBinding = {offset: 0, size: currentOffset, buffer: uniformBufferData.buffer};\n }\n\n const normalizedDispatchGroup = this.programManager.normalizeDispatchGroupSize(dispatchGroup);\n const is1DimensionDispatch = normalizedDispatchGroup[1] === 1 && normalizedDispatchGroup[2] === 1;\n // get program info\n const key = getProgramInfoUniqueKey(program, inputTensorViews, is1DimensionDispatch);\n let artifact = this.programManager.getArtifact(key);\n if (!artifact) {\n artifact = this.programManager.build(program, normalizedDispatchGroup);\n this.programManager.setArtifact(key, artifact);\n LOG_DEBUG('info', () => `[artifact] key: ${key}, programName: ${program.name}`);\n }\n\n // validate uniform variables\n if (programUniforms && artifact.uniformVariablesInfo) {\n if (programUniforms.length !== artifact.uniformVariablesInfo.length) {\n throw new Error(`Uniform variables count mismatch: expect ${artifact.uniformVariablesInfo.length}, got ${\n programUniforms.length} in program \"${artifact.programInfo.name}\".`);\n }\n for (let i = 0; i < programUniforms.length; i++) {\n const uniform = programUniforms[i];\n const actualType = uniform.type;\n const actualLength = typeof uniform.data === 'number' ? 1 : uniform.data.length;\n const [type, length] = artifact.uniformVariablesInfo[i];\n if (actualType !== type || actualLength !== length) {\n throw new Error(`Uniform variable ${i} mismatch: expect type ${type} with size ${length}, got type ${\n actualType} with size ${actualLength} in program \"${artifact.programInfo.name}\".`);\n }\n }\n }\n\n LOG_DEBUG(\n 'info',\n () => `[ProgramManager] run \"${program.name}\" (key=${key}) with ${normalizedDispatchGroup[0]}x${\n normalizedDispatchGroup[1]}x${normalizedDispatchGroup[2]}`);\n\n if (this.queryType !== 'none' || this.sessionStatus === 'capturing') {\n const pendingKernelInfo: PendingKernelInfo = {\n kernelId: this.currentKernelId!,\n programName: artifact.programInfo.name,\n inputTensorViews,\n outputTensorViews,\n };\n this.pendingKernels.push(pendingKernelInfo);\n\n if (this.sessionStatus === 'capturing') {\n const sessionPendingKernels = this.capturedPendingKernels.get(this.currentSessionId!);\n sessionPendingKernels!.push(pendingKernelInfo);\n }\n }\n\n this.programManager.run(artifact, inputDatas, outputDatas, normalizedDispatchGroup, uniformBufferBinding);\n\n TRACE_FUNC_END(program.name);\n return outputTensorViews;\n }\n\n upload(gpuDataId: number, data: Uint8Array): void {\n this.gpuDataManager.upload(gpuDataId, data);\n }\n\n memcpy(src: number, dst: number): void {\n this.gpuDataManager.memcpy(src, dst);\n }\n\n async download(gpuDataId: number, getTargetBuffer: () => Uint8Array): Promise {\n // the underlying buffer may be changed after the async function is called. so we use a getter function to make sure\n // the buffer is up-to-date.\n await this.gpuDataManager.download(gpuDataId, getTargetBuffer);\n }\n\n alloc(size: number): number {\n return this.gpuDataManager.create(size).id;\n }\n\n free(ptr: number): number {\n return this.gpuDataManager.release(ptr);\n }\n\n createKernel(kernelType: string, kernelId: number, attribute: unknown, kernelName: string): void {\n const op = WEBGPU_OP_RESOLVE_RULES.get(kernelType);\n if (!op) {\n throw new Error(`kernel not implemented: ${kernelType}`);\n }\n\n const kernelInfo: KernelInfo = {\n kernelType,\n kernelName,\n kernelEntry: op[0],\n attributes: [op[1], attribute],\n };\n this.kernels.set(kernelId, kernelInfo);\n }\n\n releaseKernel(kernelId: number): void {\n const persistentData = this.kernelPersistentData.get(kernelId);\n if (persistentData) {\n for (const data of persistentData) {\n this.gpuDataManager.release(data.id);\n }\n this.kernelPersistentData.delete(kernelId);\n }\n\n this.kernelCustomData.delete(kernelId);\n this.kernels.delete(kernelId);\n }\n\n computeKernel(kernelId: number, context: ComputeContext, errors: Array>): number {\n const kernel = this.kernels.get(kernelId);\n if (!kernel) {\n throw new Error(`kernel not created: ${kernelId}`);\n }\n const kernelType = kernel.kernelType;\n const kernelName = kernel.kernelName;\n const kernelEntry = kernel.kernelEntry;\n const attributes = kernel.attributes;\n if (this.currentKernelId !== null) {\n throw new Error(`kernel \"[${kernelType}] ${kernelName}\" is not allowed to be called recursively`);\n }\n this.currentKernelId = kernelId;\n\n // parse attributes if necessary\n if (attributes[0]) {\n attributes[1] = attributes[0](attributes[1]);\n attributes[0] = undefined;\n }\n\n LOG_DEBUG('info', () => `[WebGPU] Start to run kernel \"[${kernelType}] ${kernelName}\"...`);\n\n const useErrorScope = this.env.debug;\n\n this.temporaryData = [];\n try {\n if (useErrorScope) {\n this.device.pushErrorScope('validation');\n }\n\n kernelEntry(context, attributes[1]);\n return 0; // ORT_OK\n } catch (e) {\n errors.push(Promise.resolve(`[WebGPU] Kernel \"[${kernelType}] ${kernelName}\" failed. ${e}`));\n return 1; // ORT_FAIL\n } finally {\n if (useErrorScope) {\n errors.push(this.device.popErrorScope().then(\n err => err ? `GPU validation error for kernel \"[${kernelType}] ${kernelName}\": ${err.message}` : null));\n }\n\n for (const data of this.temporaryData) {\n this.gpuDataManager.release(data.id);\n }\n this.temporaryData = [];\n this.currentKernelId = null;\n }\n }\n\n // #region external buffer\n registerBuffer(sessionId: number, index: number, buffer: GPUBuffer, size: number): number {\n let sessionInputOutputMapping = this.sessionExternalDataMapping.get(sessionId);\n if (!sessionInputOutputMapping) {\n sessionInputOutputMapping = new Map();\n this.sessionExternalDataMapping.set(sessionId, sessionInputOutputMapping);\n }\n\n const previousBuffer = sessionInputOutputMapping.get(index);\n const id = this.gpuDataManager.registerExternalBuffer(buffer, size, previousBuffer?.[1]);\n sessionInputOutputMapping.set(index, [id, buffer]);\n return id;\n }\n unregisterBuffers(sessionId: number): void {\n const sessionInputOutputMapping = this.sessionExternalDataMapping.get(sessionId);\n if (sessionInputOutputMapping) {\n sessionInputOutputMapping.forEach(bufferInfo => this.gpuDataManager.unregisterExternalBuffer(bufferInfo[1]));\n this.sessionExternalDataMapping.delete(sessionId);\n }\n }\n getBuffer(gpuDataId: number): GPUBuffer {\n const gpuData = this.gpuDataManager.get(gpuDataId);\n if (!gpuData) {\n throw new Error(`no GPU data for buffer: ${gpuDataId}`);\n }\n return gpuData.buffer;\n }\n createDownloader(gpuBuffer: GPUBuffer, size: number, type: Tensor.GpuBufferDataTypes):\n () => Promise {\n return async () => {\n const data = await downloadGpuData(this, gpuBuffer, size);\n return createView(data.buffer, type);\n };\n }\n // #endregion\n writeTimestamp(index: number): void {\n if (this.queryType !== 'inside-passes') {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.computePassEncoder as any).writeTimestamp(this.querySet, index);\n }\n setQueryType(): void {\n this.queryType = 'none';\n if (this.env.webgpu.profiling?.mode === 'default' ||\n (typeof this.env.trace === 'undefined' ? this.env.wasm.trace : this.env.trace)) {\n if (this.device.features.has('chromium-experimental-timestamp-query-inside-passes')) {\n this.queryType = 'inside-passes';\n } else if (this.device.features.has('timestamp-query')) {\n this.queryType = 'at-passes';\n }\n\n if (this.queryType !== 'none' && typeof this.querySet === 'undefined') {\n this.querySet = this.device.createQuerySet({\n type: 'timestamp',\n count: this.maxDispatchNumber * 2,\n });\n this.queryResolveBuffer = this.device.createBuffer(\n // eslint-disable-next-line no-bitwise\n {size: this.maxDispatchNumber * 2 * 8, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE});\n }\n }\n }\n\n captureBegin(): void {\n LOG_DEBUG('info', 'captureBegin');\n if (!this.capturedCommandList.get(this.currentSessionId!)) {\n this.capturedCommandList.set(this.currentSessionId!, []);\n }\n if (!this.capturedPendingKernels.get(this.currentSessionId!)) {\n this.capturedPendingKernels.set(this.currentSessionId!, []);\n }\n // flush the left commands before we change the status.\n this.flush();\n this.sessionStatus = 'capturing';\n }\n captureEnd(): void {\n LOG_DEBUG('info', 'captureEnd');\n // flush the left commands before we change the status.\n this.flush();\n this.sessionStatus = 'default';\n }\n replay(): void {\n LOG_DEBUG('info', 'replay');\n this.sessionStatus = 'replaying';\n const sessionCommandList = this.capturedCommandList.get(this.currentSessionId!);\n const sessionPendingKernels = this.capturedPendingKernels.get(this.currentSessionId!);\n const length = sessionCommandList!.length;\n this.pendingKernels = [];\n for (let i = 0; i < length; i++) {\n const computePassEncoder = this.getComputePassEncoder();\n const command = sessionCommandList![i];\n this.writeTimestamp(this.pendingDispatchNumber * 2);\n computePassEncoder.setPipeline(command.computePipeline);\n computePassEncoder.setBindGroup(0, command.bindGroup);\n computePassEncoder.dispatchWorkgroups(...command.dispatchGroup);\n this.writeTimestamp(this.pendingDispatchNumber * 2 + 1);\n this.pendingDispatchNumber++;\n if (this.queryType !== 'none') {\n this.pendingKernels.push(sessionPendingKernels![i]);\n }\n if (this.pendingDispatchNumber >= this.maxDispatchNumber || this.queryType === 'at-passes') {\n this.endComputePass();\n }\n if (this.pendingDispatchNumber >= this.maxDispatchNumber) {\n this.flush();\n }\n }\n // flush the left commands before we change the status.\n this.flush();\n this.sessionStatus = 'default';\n }\n\n onReleaseSession(sessionId: number): void {\n this.unregisterBuffers(sessionId);\n if (this.capturedCommandList.has(sessionId)) {\n this.capturedCommandList.delete(sessionId);\n }\n if (this.capturedPendingKernels.has(sessionId)) {\n this.capturedPendingKernels.delete(sessionId);\n }\n this.gpuDataManager.onReleaseSession(sessionId);\n }\n\n onRunStart(sessionId: number): void {\n this.currentSessionId = sessionId;\n this.setQueryType();\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from 'onnxruntime-common';\n\nimport type {OrtWasmModule} from '../wasm-types';\nimport {DataType, getTensorElementSize} from '../wasm-common';\n\nimport {WebGpuBackend} from './backend-webgpu';\nimport {LOG_DEBUG} from './log';\nimport {TensorView} from './tensor-view';\nimport {ShapeUtil} from './util';\nimport {AdapterInfo, ComputeContext, ComputeContextInputsOutputsMapping, ProgramInfo} from './webgpu/types';\n\n/* eslint-disable no-bitwise */\n\nclass TensorViewImpl implements TensorView {\n constructor(\n private module: OrtWasmModule, public readonly dataType: number, public readonly data: number,\n public readonly dims: readonly number[]) {}\n\n getFloat32Array(): Float32Array {\n if (this.dataType !== DataType.float) {\n throw new Error('Invalid data type');\n }\n const elementCount = ShapeUtil.size(this.dims);\n return elementCount === 0 ? new Float32Array() :\n new Float32Array(this.module.HEAP8.buffer, this.data, elementCount);\n }\n\n getBigInt64Array(): BigInt64Array {\n if (this.dataType !== DataType.int64) {\n throw new Error('Invalid data type');\n }\n const elementCount = ShapeUtil.size(this.dims);\n return elementCount === 0 ? new BigInt64Array() :\n new BigInt64Array(this.module.HEAP8.buffer, this.data, elementCount);\n }\n\n getInt32Array(): Int32Array {\n if (this.dataType !== DataType.int32) {\n throw new Error('Invalid data type');\n }\n const elementCount = ShapeUtil.size(this.dims);\n return elementCount === 0 ? new Int32Array() : new Int32Array(this.module.HEAP8.buffer, this.data, elementCount);\n }\n\n reshape(newDims: readonly number[]): TensorView {\n if (ShapeUtil.size(newDims) !== ShapeUtil.size(this.dims)) {\n throw new Error('Invalid new shape');\n }\n return new TensorViewImpl(this.module, this.dataType, this.data, newDims);\n }\n}\n\nclass ComputeContextImpl implements ComputeContext {\n readonly adapterInfo: AdapterInfo;\n readonly opKernelContext: number;\n readonly inputs: readonly TensorView[];\n readonly outputCount: number;\n get kernelCustomData(): {[key: string]: unknown} {\n return this.backend.currentKernelCustomData;\n }\n get customDataBuffer(): Uint8Array {\n return this.module.HEAPU8.subarray(this.customDataOffset, this.customDataOffset + this.customDataSize);\n }\n private customDataOffset = 0;\n private customDataSize = 0;\n constructor(private module: OrtWasmModule, private backend: WebGpuBackend, contextDataOffset: number) {\n this.adapterInfo = backend.adapterInfo;\n const heapU32 = module.HEAPU32;\n\n // extract context data\n let dataIndex = (contextDataOffset >>> 2);\n this.opKernelContext = heapU32[dataIndex++];\n const inputCount = heapU32[dataIndex++];\n this.outputCount = heapU32[dataIndex++];\n this.customDataOffset = heapU32[dataIndex++];\n this.customDataSize = heapU32[dataIndex++];\n\n const inputs: TensorView[] = [];\n for (let i = 0; i < inputCount; i++) {\n const dataType = heapU32[dataIndex++];\n const data = heapU32[dataIndex++];\n const dim = heapU32[dataIndex++];\n const dims: number[] = [];\n for (let d = 0; d < dim; d++) {\n dims.push(heapU32[dataIndex++]);\n }\n inputs.push(new TensorViewImpl(module, dataType, data, dims));\n }\n this.inputs = inputs;\n }\n\n getMaxComputeWorkgroupSizes(): [number, number, number] {\n return [\n this.backend.device.limits.maxComputeWorkgroupSizeX, this.backend.device.limits.maxComputeWorkgroupSizeY,\n this.backend.device.limits.maxComputeWorkgroupSizeZ\n ];\n }\n\n getMaxComputeWorkgroupStoragesize(): number {\n return this.backend.device.limits.maxComputeWorkgroupStorageSize;\n }\n\n compute(program: ProgramInfo, inputsOutputsMapping?: ComputeContextInputsOutputsMapping): TensorView[] {\n // prepare inputs. inputs should always be valid data.\n const mappedInputs =\n inputsOutputsMapping?.inputs?.map(i => typeof i === 'number' ? this.inputs[i] : i) ?? this.inputs;\n // prepare outputs.\n const outputIndices = inputsOutputsMapping?.outputs ?? [];\n const createKernelOutput = (index: number, dataType: number, dims: readonly number[]): TensorView =>\n new TensorViewImpl(this.module, dataType, this.output(index, dims), dims);\n const createTemporaryOutput = (dataType: number, dims: readonly number[]): TensorView => {\n const elementSize = getTensorElementSize(dataType);\n if (!elementSize) {\n throw new Error(`Unsupported data type: ${dataType}`);\n }\n const bufferSize = elementSize * ShapeUtil.size(dims);\n const gpuDataId = bufferSize > 0 ? this.backend.gpuDataManager.create(bufferSize).id : 0;\n return new TensorViewImpl(this.module, dataType, gpuDataId, dims);\n };\n return this.backend.run(\n program, mappedInputs, outputIndices, createKernelOutput, createTemporaryOutput, this.outputCount);\n }\n\n output(index: number, dims: readonly number[]): number {\n const stack = this.module.stackSave();\n try {\n const data = this.module.stackAlloc((1 + dims.length) * 4 /* sizeof(size_t) */);\n let offset = data >> 2;\n this.module.HEAPU32[offset++] = dims.length;\n for (let i = 0; i < dims.length; i++) {\n this.module.HEAPU32[offset++] = dims[i];\n }\n return this.module._JsepOutput!(this.opKernelContext, index, data);\n } catch (e) {\n throw new Error(\n `Failed to generate kernel's output[${index}] with dims [${dims}]. ` +\n 'If you are running with pre-allocated output, please make sure the output type/dims are correct. ' +\n `Error: ${e}`);\n } finally {\n this.module.stackRestore(stack);\n }\n }\n}\n\n/**\n * Initialize JSEP with WebGPU backend.\n *\n * This function will be called after the WebAssembly module is loaded and initialized (\"_OrtInit\" is called), once for\n * each of the following EPs if they are specified:\n * - \"webgpu\"\n * - \"webnn\"\n *\n * For WebGPU, this function expects:\n * - WebGPU is enabled in build (BUILD_DEFS.DISABLE_JSEP === false).\n * - WebGPU is available in current environment. (a valid GPUAdapter is passed in)\n *\n * For WebNN, this function expects:\n * - WebNN is enabled in build (BUILD_DEFS.DISABLE_JSEP === false).\n * - WebNN is available in current environment. (navigator.ml is not undefined)\n *\n * If the WebAssembly module is not built with JSEP support, this function will throw an error. This will invalidate\n * 'webgpu'/'webnn' backend.\n *\n * @param name - the name of the EP, either \"webgpu\" or \"webnn\"\n * @param module - the ORT WebAssembly module\n * @param env - the ORT environment variable (ort.env)\n * @param gpuAdapter - the pre-created GPU adapter\n */\nexport const init =\n async(name: 'webgpu'|'webnn', module: OrtWasmModule, env: Env, gpuAdapter?: GPUAdapter): Promise => {\n const jsepInit = module.jsepInit;\n if (!jsepInit) {\n throw new Error('Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.');\n }\n\n if (name === 'webgpu') {\n const backend = new WebGpuBackend();\n await backend.initialize(env, gpuAdapter!);\n\n jsepInit('webgpu', [\n // backend\n backend,\n\n // jsepAlloc()\n (size: number) => backend.alloc(size),\n\n // jsepFree()\n (ptr: number) => backend.free(ptr),\n\n // jsepCopy(src, dst, size, isSourceGpu)\n (src: number, dst: number, size: number, isSourceGpu = false) => {\n if (isSourceGpu) {\n LOG_DEBUG('verbose', () => `[WebGPU] jsepCopyGpuToGpu: src=${src}, dst=${dst}, size=${size}`);\n backend.memcpy(src, dst);\n } else {\n LOG_DEBUG('verbose', () => `[WebGPU] jsepCopyCpuToGpu: dataOffset=${src}, gpuDataId=${dst}, size=${size}`);\n const data = module.HEAPU8.subarray(src >>> 0, (src >>> 0) + size);\n backend.upload(dst, data);\n }\n },\n\n // jsepCopyAsync(src, dst, size)\n async(gpuDataId: number, dataOffset: number, size: number):\n Promise => {\n LOG_DEBUG(\n 'verbose',\n () => `[WebGPU] jsepCopyGpuToCpu: gpuDataId=${gpuDataId}, dataOffset=${dataOffset}, size=${size}`);\n\n await backend.download(\n gpuDataId, () => module.HEAPU8.subarray(dataOffset >>> 0, (dataOffset >>> 0) + size));\n },\n\n // jsepCreateKernel\n (kernelType: string, kernelId: number, attribute: unknown) => backend.createKernel(\n kernelType, kernelId, attribute, module.UTF8ToString(module._JsepGetNodeName!(kernelId))),\n\n // jsepReleaseKernel\n (kernel: number) => backend.releaseKernel(kernel),\n\n // jsepRun\n (kernel: number, contextDataOffset: number, sessionHandle: number, errors: Array>) => {\n LOG_DEBUG(\n 'verbose',\n () => `[WebGPU] jsepRun: sessionHandle=${sessionHandle}, kernel=${kernel}, contextDataOffset=${\n contextDataOffset}`);\n const context = new ComputeContextImpl(module, backend, contextDataOffset);\n return backend.computeKernel(kernel, context, errors);\n },\n // jsepCaptureBegin\n () => backend.captureBegin(),\n // jsepCaptureEnd\n () => backend.captureEnd(),\n // jsepReplay\n () => backend.replay()\n ]);\n } else {\n jsepInit('webnn');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// WebNN API currently does not have a TypeScript definition file. This file is a workaround with types generated from\n// WebNN API specification.\n// https://github.com/webmachinelearning/webnn/issues/677\n/// \n\nimport {Env, InferenceSession, Tensor} from 'onnxruntime-common';\n\nimport {SerializableInternalBuffer, SerializableSessionMetadata, SerializableTensorMetadata, TensorMetadata} from './proxy-messages';\nimport {setRunOptions} from './run-options';\nimport {setSessionOptions} from './session-options';\nimport {dataLocationStringToEnum, getTensorElementSize, isGpuBufferSupportedType, logLevelStringToEnum, tensorDataTypeEnumToString, tensorDataTypeStringToEnum, tensorTypeToTypedArrayConstructor} from './wasm-common';\nimport {getInstance} from './wasm-factory';\nimport {allocWasmString, checkLastError} from './wasm-utils';\nimport {loadFile} from './wasm-utils-load-file';\n\n// #region Initializations\n\n/**\n * There are 4 different \"initialization\" steps for ORT. They happen in different places and different time.\n *\n * 1. JavaScript initialization for onnxruntime-common and onnxruntime-web.\n * This is the first initialization step. In this step, onnxruntime-web calls onnxruntime-common's registerBackend()\n * function multiple times to register all the available backends. The backend registration is very fast. It only\n * registers the backend name with the uninitialized backend object. No heavy initialization is done in this step.\n * Refer to web/lib/index.ts for the backend registration.\n *\n * 2. WebAssembly artifact initialization.\n * This happens when any registered wasm backend is used for the first time (ie. `ort.InferenceSession.create()` or\n * `ort.TrainingSession.create()` is called). In this step, onnxruntime-web does the followings:\n * - create a proxy worker and make sure the proxy worker is ready to receive messages, if proxy is enabled.\n * - perform feature detection, locate correct WebAssembly artifact path and call the Emscripten generated\n * JavaScript code to initialize the WebAssembly runtime.\n * - if proxy is enabled, this step happens in the proxy worker using message 'init-wasm'.\n * - downloading the 'ort-wasm{...}.wasm' file is done in this step.\n * - if multi-thread is enabled, one or more webworker will be created to initialize the PThread threadpool.\n *\n * 3. ORT environment initialization.\n * This happens after step 2. In this step, onnxruntime-web performs ONNX Runtime environment initialization.\n * Function `_OrtInit()` is called in this step.\n * - if proxy is enabled, this step happens in the proxy worker using message 'init-ort'.\n * - logging level (ort.env.logLevel) and thread number (ort.env.wasm.numThreads) are set in this step.\n *\n * 4. Session initialization.\n * This happens when `ort.InferenceSession.create()` or `ort.TrainingSession.create()` is called. Unlike the first 3\n * steps (they only called once), this step will be done for each session. In this step, onnxruntime-web does the\n * followings:\n * If the parameter is a URL:\n * - download the model data from the URL.\n * - copy the model data to the WASM heap. (proxy: 'copy-from')\n * - dereference the model buffer. This step allows the original ArrayBuffer to be garbage collected.\n * - call `_OrtCreateSession()` to create the session. (proxy: 'create')\n *\n * If the parameter is a Uint8Array object:\n * - copy the model data to the WASM heap. (proxy: 'copy-from')\n * - call `_OrtCreateSession()` to create the session. (proxy: 'create')\n *\n *\n */\n\n/**\n * initialize ORT environment.\n *\n * @param numThreads SetGlobalIntraOpNumThreads(numThreads)\n * @param loggingLevel CreateEnv(static_cast(logging_level))\n */\nconst initOrt = (numThreads: number, loggingLevel: number): void => {\n const errorCode = getInstance()._OrtInit(numThreads, loggingLevel);\n if (errorCode !== 0) {\n checkLastError('Can\\'t initialize onnxruntime.');\n }\n};\n\n/**\n * initialize runtime environment.\n * @param env passed in the environment config object.\n */\nexport const initRuntime = async(env: Env): Promise => {\n // init ORT\n initOrt(env.wasm.numThreads!, logLevelStringToEnum(env.logLevel));\n};\n\n/**\n * perform EP specific initialization.\n *\n * @param env\n * @param epName\n */\nexport const initEp = async(env: Env, epName: string): Promise => {\n if (!BUILD_DEFS.DISABLE_JSEP) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires\n const initJsep = require('./jsep/init').init;\n\n if (epName === 'webgpu') {\n // perform WebGPU availability check\n if (typeof navigator === 'undefined' || !navigator.gpu) {\n throw new Error('WebGPU is not supported in current environment');\n }\n\n let adapter = env.webgpu.adapter as GPUAdapter | null;\n if (!adapter) {\n // if adapter is not set, request a new adapter.\n const powerPreference = env.webgpu.powerPreference;\n if (powerPreference !== undefined && powerPreference !== 'low-power' &&\n powerPreference !== 'high-performance') {\n throw new Error(`Invalid powerPreference setting: \"${powerPreference}\"`);\n }\n const forceFallbackAdapter = env.webgpu.forceFallbackAdapter;\n if (forceFallbackAdapter !== undefined && typeof forceFallbackAdapter !== 'boolean') {\n throw new Error(`Invalid forceFallbackAdapter setting: \"${forceFallbackAdapter}\"`);\n }\n adapter = await navigator.gpu.requestAdapter({powerPreference, forceFallbackAdapter});\n if (!adapter) {\n throw new Error(\n 'Failed to get GPU adapter. ' +\n 'You may need to enable flag \"--enable-unsafe-webgpu\" if you are using Chrome.');\n }\n } else {\n // if adapter is set, validate it.\n if (typeof adapter.limits !== 'object' || typeof adapter.features !== 'object' ||\n typeof adapter.requestDevice !== 'function') {\n throw new Error('Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.');\n }\n }\n\n await initJsep('webgpu', getInstance(), env, adapter);\n }\n if (epName === 'webnn') {\n // perform WebNN availability check\n if (typeof navigator === 'undefined' || !(navigator as unknown as {ml: unknown}).ml) {\n throw new Error('WebNN is not supported in current environment');\n }\n\n await initJsep('webnn', getInstance(), env);\n }\n }\n};\n\n// #endregion Initializations\n\n/**\n * valid data locations for input/output tensors.\n */\ntype SupportedTensorDataLocationForInputOutput = 'cpu'|'cpu-pinned'|'gpu-buffer';\n\ntype IOBindingState = {\n /**\n * the handle of IO binding.\n */\n readonly handle: number;\n\n /**\n * the preferred location for each output tensor.\n *\n * value is one of 'cpu', 'cpu-pinned', 'gpu-buffer'.\n */\n readonly outputPreferredLocations: readonly SupportedTensorDataLocationForInputOutput[];\n\n /**\n * enum value of the preferred location for each output tensor.\n */\n readonly outputPreferredLocationsEncoded: readonly number[];\n};\n\n/**\n * tuple elements are: InferenceSession ID; inputNamesUTF8Encoded; outputNamesUTF8Encoded; bindingState\n */\ntype SessionMetadata = [\n inferenceSessionId: number, inputNamesUTF8Encoded: number[], outputNamesUTF8Encoded: number[],\n bindingState: IOBindingState|null, enableGraphCapture: boolean, inputOutputBound: boolean\n];\n\nconst activeSessions = new Map();\n\n/**\n * get the input/output count of the session.\n * @param sessionHandle the handle representing the session. should be non-zero.\n * @returns a tuple including 2 numbers, representing the input count and output count.\n */\nconst getSessionInputOutputCount = (sessionHandle: number): [number, number] => {\n const wasm = getInstance();\n const stack = wasm.stackSave();\n try {\n const dataOffset = wasm.stackAlloc(8);\n const errorCode = wasm._OrtGetInputOutputCount(sessionHandle, dataOffset, dataOffset + 4);\n if (errorCode !== 0) {\n checkLastError('Can\\'t get session input/output count.');\n }\n return [wasm.HEAP32[dataOffset / 4], wasm.HEAP32[dataOffset / 4 + 1]];\n } finally {\n wasm.stackRestore(stack);\n }\n};\n\n/**\n * allocate the memory and memcpy the external buffer.\n *\n * @param model - the external buffer containing the model data. Must not be the same buffer as the WASM heap.\n * @returns a 2-elements tuple - the pointer and size of the allocated buffer\n */\nexport const copyFromExternalBuffer = (model: Uint8Array): [number, number] => {\n const wasm = getInstance();\n const modelDataOffset = wasm._malloc(model.byteLength);\n if (modelDataOffset === 0) {\n throw new Error(`Can't create a session. failed to allocate a buffer of size ${model.byteLength}.`);\n }\n wasm.HEAPU8.set(model, modelDataOffset);\n return [modelDataOffset, model.byteLength];\n};\n\n/**\n * create an inference session from a model data buffer.\n *\n * @param modelData - either a Uint8Array object representing the model data, or a 2-elements tuple containing the\n * pointer and size of the model data buffer.\n * @param options an optional session options object.\n * @returns a 3-elements tuple containing [session handle, input names, output names]\n */\nexport const createSession = async(\n modelData: Uint8Array|SerializableInternalBuffer,\n options?: InferenceSession.SessionOptions): Promise => {\n let modelDataOffset: number, modelDataLength: number;\n const wasm = getInstance();\n\n if (Array.isArray(modelData)) {\n // if model data is an array, it must be a 2-elements tuple containing the pointer and size of the model data\n [modelDataOffset, modelDataLength] = modelData;\n } else if (modelData.buffer === wasm.HEAPU8.buffer) {\n // if model data uses the same buffer as the WASM heap, we don't need to copy it.\n [modelDataOffset, modelDataLength] = [modelData.byteOffset, modelData.byteLength];\n } else {\n // otherwise, copy the model data to the WASM heap.\n [modelDataOffset, modelDataLength] = copyFromExternalBuffer(modelData);\n }\n\n let sessionHandle = 0;\n let sessionOptionsHandle = 0;\n let ioBindingHandle = 0;\n let allocs: number[] = [];\n const inputNamesUTF8Encoded = [];\n const outputNamesUTF8Encoded = [];\n\n try {\n [sessionOptionsHandle, allocs] = setSessionOptions(options);\n\n if (options?.externalData && wasm.mountExternalData) {\n const loadingPromises = [];\n for (const file of options.externalData) {\n const path = typeof file === 'string' ? file : file.path;\n loadingPromises.push(loadFile(typeof file === 'string' ? file : file.data).then(data => {\n wasm.mountExternalData!(path, data);\n }));\n }\n\n // wait for all external data files to be loaded\n await Promise.all(loadingPromises);\n }\n\n for (const provider of options?.executionProviders ?? []) {\n const providerName = typeof provider === 'string' ? provider : provider.name;\n if (providerName === 'webnn') {\n if (wasm.currentContext) {\n throw new Error('WebNN execution provider is already set.');\n }\n if (typeof provider !== 'string') {\n const webnnOptions = provider as InferenceSession.WebNNExecutionProviderOption;\n const context = (webnnOptions as InferenceSession.WebNNOptionsWithMLContext)?.context;\n const gpuDevice = (webnnOptions as InferenceSession.WebNNOptionsWebGpu)?.gpuDevice;\n const deviceType = (webnnOptions as InferenceSession.WebNNContextOptions)?.deviceType;\n const numThreads = (webnnOptions as InferenceSession.WebNNContextOptions)?.numThreads;\n const powerPreference = (webnnOptions as InferenceSession.WebNNContextOptions)?.powerPreference;\n if (context) {\n wasm.currentContext = context as MLContext;\n } else if (gpuDevice) {\n wasm.currentContext = await navigator.ml.createContext(gpuDevice);\n } else {\n wasm.currentContext = await navigator.ml.createContext({deviceType, numThreads, powerPreference});\n }\n } else {\n wasm.currentContext = await navigator.ml.createContext();\n }\n break;\n }\n }\n\n sessionHandle = await wasm._OrtCreateSession(modelDataOffset, modelDataLength, sessionOptionsHandle);\n if (sessionHandle === 0) {\n checkLastError('Can\\'t create a session.');\n }\n\n // clear current MLContext after session creation\n if (wasm.currentContext) {\n wasm.currentContext = undefined;\n }\n\n const [inputCount, outputCount] = getSessionInputOutputCount(sessionHandle);\n\n const enableGraphCapture = !!options?.enableGraphCapture;\n\n const inputNames = [];\n const outputNames = [];\n const outputPreferredLocations: SupportedTensorDataLocationForInputOutput[] = [];\n for (let i = 0; i < inputCount; i++) {\n const name = wasm._OrtGetInputName(sessionHandle, i);\n if (name === 0) {\n checkLastError('Can\\'t get an input name.');\n }\n inputNamesUTF8Encoded.push(name);\n inputNames.push(wasm.UTF8ToString(name));\n }\n for (let i = 0; i < outputCount; i++) {\n const name = wasm._OrtGetOutputName(sessionHandle, i);\n if (name === 0) {\n checkLastError('Can\\'t get an output name.');\n }\n outputNamesUTF8Encoded.push(name);\n const nameString = wasm.UTF8ToString(name);\n outputNames.push(nameString);\n\n if (!BUILD_DEFS.DISABLE_JSEP) {\n if (enableGraphCapture && options?.preferredOutputLocation === undefined) {\n outputPreferredLocations.push('gpu-buffer');\n continue;\n }\n const location = typeof options?.preferredOutputLocation === 'string' ?\n options.preferredOutputLocation :\n options?.preferredOutputLocation?.[nameString] ?? 'cpu';\n if (location !== 'cpu' && location !== 'cpu-pinned' && location !== 'gpu-buffer') {\n throw new Error(`Not supported preferred output location: ${location}.`);\n }\n if (enableGraphCapture && location !== 'gpu-buffer') {\n throw new Error(`Not supported preferred output location: ${\n location}. Only 'gpu-buffer' location is supported when enableGraphCapture is true.`);\n }\n outputPreferredLocations.push(location);\n }\n }\n\n // use IO binding only when at least one output is preffered to be on GPU.\n let bindingState: IOBindingState|null = null;\n if (!BUILD_DEFS.DISABLE_JSEP && outputPreferredLocations.some(l => l === 'gpu-buffer')) {\n ioBindingHandle = wasm._OrtCreateBinding(sessionHandle);\n if (ioBindingHandle === 0) {\n checkLastError('Can\\'t create IO binding.');\n }\n\n bindingState = {\n handle: ioBindingHandle,\n outputPreferredLocations,\n outputPreferredLocationsEncoded: outputPreferredLocations.map(l => dataLocationStringToEnum(l)),\n };\n }\n\n activeSessions.set(\n sessionHandle,\n [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, bindingState, enableGraphCapture, false]);\n return [sessionHandle, inputNames, outputNames];\n } catch (e) {\n inputNamesUTF8Encoded.forEach(buf => wasm._OrtFree(buf));\n outputNamesUTF8Encoded.forEach(buf => wasm._OrtFree(buf));\n\n if (ioBindingHandle !== 0) {\n wasm._OrtReleaseBinding(ioBindingHandle);\n }\n\n if (sessionHandle !== 0) {\n wasm._OrtReleaseSession(sessionHandle);\n }\n throw e;\n } finally {\n wasm._free(modelDataOffset);\n if (sessionOptionsHandle !== 0) {\n wasm._OrtReleaseSessionOptions(sessionOptionsHandle);\n }\n allocs.forEach(alloc => wasm._free(alloc));\n\n // unmount external data if necessary\n wasm.unmountExternalData?.();\n }\n};\n\nexport const releaseSession = (sessionId: number): void => {\n const wasm = getInstance();\n const session = activeSessions.get(sessionId);\n if (!session) {\n throw new Error(`cannot release session. invalid session id: ${sessionId}`);\n }\n const [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, ioBindingState, enableGraphCapture] = session;\n\n if (ioBindingState) {\n if (enableGraphCapture) {\n wasm._OrtClearBoundOutputs(ioBindingState.handle);\n }\n wasm._OrtReleaseBinding(ioBindingState.handle);\n }\n\n wasm.jsepOnReleaseSession?.(sessionId);\n\n inputNamesUTF8Encoded.forEach(buf => wasm._OrtFree(buf));\n outputNamesUTF8Encoded.forEach(buf => wasm._OrtFree(buf));\n wasm._OrtReleaseSession(sessionHandle);\n activeSessions.delete(sessionId);\n};\n\nexport const prepareInputOutputTensor =\n (tensor: TensorMetadata|null, tensorHandles: number[], allocs: number[], sessionId: number, index: number,\n enableGraphCapture = false): void => {\n if (!tensor) {\n tensorHandles.push(0);\n return;\n }\n\n const wasm = getInstance();\n\n const dataType = tensor[0];\n const dims = tensor[1];\n const location = tensor[3];\n\n let rawData: number;\n let dataByteLength: number;\n\n if (dataType === 'string' && location === 'gpu-buffer') {\n throw new Error('String tensor is not supported on GPU.');\n }\n\n if (enableGraphCapture && location !== 'gpu-buffer') {\n throw new Error(\n `External buffer must be provided for input/output index ${index} when enableGraphCapture is true.`);\n }\n\n if (location === 'gpu-buffer') {\n const gpuBuffer = tensor[2].gpuBuffer as GPUBuffer;\n const elementSizeInBytes = getTensorElementSize(tensorDataTypeStringToEnum(dataType))!;\n dataByteLength = dims.reduce((a, b) => a * b, 1) * elementSizeInBytes;\n\n const registerBuffer = wasm.jsepRegisterBuffer;\n if (!registerBuffer) {\n throw new Error('Tensor location \"gpu-buffer\" is not supported without using WebGPU.');\n }\n rawData = registerBuffer(sessionId, index, gpuBuffer, dataByteLength);\n } else {\n const data = tensor[2];\n\n if (Array.isArray(data)) {\n // string tensor\n dataByteLength = 4 * data.length;\n rawData = wasm._malloc(dataByteLength);\n allocs.push(rawData);\n let dataIndex = rawData / 4;\n for (let i = 0; i < data.length; i++) {\n if (typeof data[i] !== 'string') {\n throw new TypeError(`tensor data at index ${i} is not a string`);\n }\n wasm.HEAPU32[dataIndex++] = allocWasmString(data[i], allocs);\n }\n } else {\n dataByteLength = data.byteLength;\n rawData = wasm._malloc(dataByteLength);\n allocs.push(rawData);\n wasm.HEAPU8.set(new Uint8Array(data.buffer, data.byteOffset, dataByteLength), rawData);\n }\n }\n\n const stack = wasm.stackSave();\n const dimsOffset = wasm.stackAlloc(4 * dims.length);\n try {\n let dimIndex = dimsOffset / 4;\n dims.forEach(d => wasm.HEAP32[dimIndex++] = d);\n const tensor = wasm._OrtCreateTensor(\n tensorDataTypeStringToEnum(dataType), rawData, dataByteLength, dimsOffset, dims.length,\n dataLocationStringToEnum(location));\n if (tensor === 0) {\n checkLastError(`Can't create tensor for input/output. session=${sessionId}, index=${index}.`);\n }\n tensorHandles.push(tensor);\n } finally {\n wasm.stackRestore(stack);\n }\n };\n\n/**\n * perform inference run\n */\nexport const run = async(\n sessionId: number, inputIndices: number[], inputTensors: TensorMetadata[], outputIndices: number[],\n outputTensors: Array, options: InferenceSession.RunOptions): Promise => {\n const wasm = getInstance();\n const session = activeSessions.get(sessionId);\n if (!session) {\n throw new Error(`cannot run inference. invalid session id: ${sessionId}`);\n }\n const sessionHandle = session[0];\n const inputNamesUTF8Encoded = session[1];\n const outputNamesUTF8Encoded = session[2];\n const ioBindingState = session[3];\n const enableGraphCapture = session[4];\n const inputOutputBound = session[5];\n\n const inputCount = inputIndices.length;\n const outputCount = outputIndices.length;\n\n let runOptionsHandle = 0;\n let runOptionsAllocs: number[] = [];\n\n const inputTensorHandles: number[] = [];\n const outputTensorHandles: number[] = [];\n const inputOutputAllocs: number[] = [];\n\n const beforeRunStack = wasm.stackSave();\n const inputValuesOffset = wasm.stackAlloc(inputCount * 4);\n const inputNamesOffset = wasm.stackAlloc(inputCount * 4);\n const outputValuesOffset = wasm.stackAlloc(outputCount * 4);\n const outputNamesOffset = wasm.stackAlloc(outputCount * 4);\n\n try {\n [runOptionsHandle, runOptionsAllocs] = setRunOptions(options);\n\n // create input tensors\n for (let i = 0; i < inputCount; i++) {\n prepareInputOutputTensor(\n inputTensors[i], inputTensorHandles, inputOutputAllocs, sessionId, inputIndices[i], enableGraphCapture);\n }\n\n // create output tensors\n for (let i = 0; i < outputCount; i++) {\n prepareInputOutputTensor(\n outputTensors[i], outputTensorHandles, inputOutputAllocs, sessionId, inputCount + outputIndices[i],\n enableGraphCapture);\n }\n\n let inputValuesIndex = inputValuesOffset / 4;\n let inputNamesIndex = inputNamesOffset / 4;\n let outputValuesIndex = outputValuesOffset / 4;\n let outputNamesIndex = outputNamesOffset / 4;\n for (let i = 0; i < inputCount; i++) {\n wasm.HEAPU32[inputValuesIndex++] = inputTensorHandles[i];\n wasm.HEAPU32[inputNamesIndex++] = inputNamesUTF8Encoded[inputIndices[i]];\n }\n for (let i = 0; i < outputCount; i++) {\n wasm.HEAPU32[outputValuesIndex++] = outputTensorHandles[i];\n wasm.HEAPU32[outputNamesIndex++] = outputNamesUTF8Encoded[outputIndices[i]];\n }\n\n if (!BUILD_DEFS.DISABLE_JSEP && ioBindingState && !inputOutputBound) {\n const {handle, outputPreferredLocations, outputPreferredLocationsEncoded} = ioBindingState;\n\n if (inputNamesUTF8Encoded.length !== inputCount) {\n throw new Error(`input count from feeds (${\n inputCount}) is expected to be always equal to model's input count (${inputNamesUTF8Encoded.length}).`);\n }\n\n // process inputs\n for (let i = 0; i < inputCount; i++) {\n const index = inputIndices[i];\n const errorCode = await wasm._OrtBindInput(handle, inputNamesUTF8Encoded[index], inputTensorHandles[i]);\n if (errorCode !== 0) {\n checkLastError(`Can't bind input[${i}] for session=${sessionId}.`);\n }\n }\n\n // process pre-allocated outputs\n for (let i = 0; i < outputCount; i++) {\n const index = outputIndices[i];\n const location = outputTensors[i]?.[3]; // undefined means output is not pre-allocated.\n\n if (location) {\n // output is pre-allocated. bind the tensor.\n const errorCode = wasm._OrtBindOutput(handle, outputNamesUTF8Encoded[index], outputTensorHandles[i], 0);\n if (errorCode !== 0) {\n checkLastError(`Can't bind pre-allocated output[${i}] for session=${sessionId}.`);\n }\n } else {\n // output is not pre-allocated. reset preferred location.\n const errorCode =\n wasm._OrtBindOutput(handle, outputNamesUTF8Encoded[index], 0, outputPreferredLocationsEncoded[index]);\n if (errorCode !== 0) {\n checkLastError(`Can't bind output[${i}] to ${outputPreferredLocations[i]} for session=${sessionId}.`);\n }\n }\n }\n activeSessions.set(\n sessionId,\n [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, ioBindingState, enableGraphCapture, true]);\n }\n\n wasm.jsepOnRunStart?.(sessionHandle);\n let errorCode: number;\n if (!BUILD_DEFS.DISABLE_JSEP && ioBindingState) {\n errorCode = await wasm._OrtRunWithBinding(\n sessionHandle, ioBindingState.handle, outputCount, outputValuesOffset, runOptionsHandle);\n } else {\n errorCode = await wasm._OrtRun(\n sessionHandle, inputNamesOffset, inputValuesOffset, inputCount, outputNamesOffset, outputCount,\n outputValuesOffset, runOptionsHandle);\n }\n\n if (errorCode !== 0) {\n checkLastError('failed to call OrtRun().');\n }\n\n const output: TensorMetadata[] = [];\n\n for (let i = 0; i < outputCount; i++) {\n const tensor = wasm.HEAPU32[outputValuesOffset / 4 + i];\n if (tensor === outputTensorHandles[i]) {\n // output tensor is pre-allocated. no need to copy data.\n output.push(outputTensors[i]!);\n continue;\n }\n\n const beforeGetTensorDataStack = wasm.stackSave();\n // stack allocate 4 pointer value\n const tensorDataOffset = wasm.stackAlloc(4 * 4);\n\n let keepOutputTensor = false;\n let type: Tensor.Type|undefined, dataOffset = 0;\n try {\n const errorCode = wasm._OrtGetTensorData(\n tensor, tensorDataOffset, tensorDataOffset + 4, tensorDataOffset + 8, tensorDataOffset + 12);\n if (errorCode !== 0) {\n checkLastError(`Can't access output tensor data on index ${i}.`);\n }\n let tensorDataIndex = tensorDataOffset / 4;\n const dataType = wasm.HEAPU32[tensorDataIndex++];\n dataOffset = wasm.HEAPU32[tensorDataIndex++];\n const dimsOffset = wasm.HEAPU32[tensorDataIndex++];\n const dimsLength = wasm.HEAPU32[tensorDataIndex++];\n const dims = [];\n for (let i = 0; i < dimsLength; i++) {\n dims.push(wasm.HEAPU32[dimsOffset / 4 + i]);\n }\n wasm._OrtFree(dimsOffset);\n\n const size = dims.reduce((a, b) => a * b, 1);\n type = tensorDataTypeEnumToString(dataType);\n\n const preferredLocation = ioBindingState?.outputPreferredLocations[outputIndices[i]];\n\n if (type === 'string') {\n if (preferredLocation === 'gpu-buffer') {\n throw new Error('String tensor is not supported on GPU.');\n }\n const stringData: string[] = [];\n let dataIndex = dataOffset / 4;\n for (let i = 0; i < size; i++) {\n const offset = wasm.HEAPU32[dataIndex++];\n const maxBytesToRead = i === size - 1 ? undefined : wasm.HEAPU32[dataIndex] - offset;\n stringData.push(wasm.UTF8ToString(offset, maxBytesToRead));\n }\n output.push([type, dims, stringData, 'cpu']);\n } else {\n // If a certain output's preferred location is GPU but the tensor is empty, we still need to create a CPU\n // tensor for it. There is no mapping GPU buffer for an empty tensor.\n if (preferredLocation === 'gpu-buffer' && size > 0) {\n const getBuffer = wasm.jsepGetBuffer;\n if (!getBuffer) {\n throw new Error('preferredLocation \"gpu-buffer\" is not supported without using WebGPU.');\n }\n const gpuBuffer = getBuffer(dataOffset);\n const elementSize = getTensorElementSize(dataType);\n if (elementSize === undefined || !isGpuBufferSupportedType(type)) {\n throw new Error(`Unsupported data type: ${type}`);\n }\n\n // do not release the tensor right now. it will be released when user calls tensor.dispose().\n keepOutputTensor = true;\n\n output.push([\n type, dims, {\n gpuBuffer,\n download: wasm.jsepCreateDownloader!(gpuBuffer, size * elementSize, type),\n dispose: () => {\n wasm._OrtReleaseTensor(tensor);\n }\n },\n 'gpu-buffer'\n ]);\n } else {\n const typedArrayConstructor = tensorTypeToTypedArrayConstructor(type);\n const data = new typedArrayConstructor(size);\n new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n .set(wasm.HEAPU8.subarray(dataOffset, dataOffset + data.byteLength));\n output.push([type, dims, data, 'cpu']);\n }\n }\n } finally {\n wasm.stackRestore(beforeGetTensorDataStack);\n if (type === 'string' && dataOffset) {\n wasm._free(dataOffset);\n }\n if (!keepOutputTensor) {\n wasm._OrtReleaseTensor(tensor);\n }\n }\n }\n\n if (ioBindingState && !enableGraphCapture) {\n wasm._OrtClearBoundOutputs(ioBindingState.handle);\n activeSessions.set(\n sessionId,\n [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, ioBindingState, enableGraphCapture, false]);\n }\n return output;\n } finally {\n wasm.stackRestore(beforeRunStack);\n\n inputTensorHandles.forEach(v => wasm._OrtReleaseTensor(v));\n outputTensorHandles.forEach(v => wasm._OrtReleaseTensor(v));\n inputOutputAllocs.forEach(p => wasm._free(p));\n\n if (runOptionsHandle !== 0) {\n wasm._OrtReleaseRunOptions(runOptionsHandle);\n }\n runOptionsAllocs.forEach(p => wasm._free(p));\n }\n};\n\n/**\n * end profiling\n */\nexport const endProfiling = (sessionId: number): void => {\n const wasm = getInstance();\n const session = activeSessions.get(sessionId);\n if (!session) {\n throw new Error('invalid session id');\n }\n const sessionHandle = session[0];\n\n // profile file name is not used yet, but it must be freed.\n const profileFileName = wasm._OrtEndProfiling(sessionHandle);\n if (profileFileName === 0) {\n checkLastError('Can\\'t get an profile file name.');\n }\n wasm._OrtFree(profileFileName);\n};\n\nexport const extractTransferableBuffers = (tensors: readonly SerializableTensorMetadata[]): ArrayBufferLike[] => {\n const buffers: ArrayBufferLike[] = [];\n for (const tensor of tensors) {\n const data = tensor[2];\n if (!Array.isArray(data) && 'buffer' in data) {\n buffers.push(data.buffer);\n }\n }\n return buffers;\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env, InferenceSession} from 'onnxruntime-common';\n\nimport {OrtWasmMessage, SerializableInternalBuffer, SerializableSessionMetadata, SerializableTensorMetadata, TensorMetadata} from './proxy-messages';\nimport * as core from './wasm-core-impl';\nimport {initializeWebAssembly} from './wasm-factory';\nimport {importProxyWorker} from './wasm-utils-import';\n\nconst isProxy = (): boolean => !!env.wasm.proxy && typeof document !== 'undefined';\nlet proxyWorker: Worker|undefined;\nlet initializing = false;\nlet initialized = false;\nlet aborted = false;\nlet temporaryObjectUrl: string|undefined;\n\ntype PromiseCallbacks = [resolve: (result: T) => void, reject: (reason: unknown) => void];\nlet initWasmCallbacks: PromiseCallbacks;\nconst queuedCallbacks: Map>> = new Map();\n\nconst enqueueCallbacks = (type: OrtWasmMessage['type'], callbacks: PromiseCallbacks): void => {\n const queue = queuedCallbacks.get(type);\n if (queue) {\n queue.push(callbacks);\n } else {\n queuedCallbacks.set(type, [callbacks]);\n }\n};\n\nconst ensureWorker = (): void => {\n if (initializing || !initialized || aborted || !proxyWorker) {\n throw new Error('worker not ready');\n }\n};\n\nconst onProxyWorkerMessage = (ev: MessageEvent): void => {\n switch (ev.data.type) {\n case 'init-wasm':\n initializing = false;\n if (ev.data.err) {\n aborted = true;\n initWasmCallbacks[1](ev.data.err);\n } else {\n initialized = true;\n initWasmCallbacks[0]();\n }\n if (temporaryObjectUrl) {\n URL.revokeObjectURL(temporaryObjectUrl);\n temporaryObjectUrl = undefined;\n }\n break;\n case 'init-ep':\n case 'copy-from':\n case 'create':\n case 'release':\n case 'run':\n case 'end-profiling': {\n const callbacks = queuedCallbacks.get(ev.data.type)!;\n if (ev.data.err) {\n callbacks.shift()![1](ev.data.err);\n } else {\n callbacks.shift()![0](ev.data.out!);\n }\n break;\n }\n default:\n }\n};\n\n\nexport const initializeWebAssemblyAndOrtRuntime = async(): Promise => {\n if (initialized) {\n return;\n }\n if (initializing) {\n throw new Error('multiple calls to \\'initWasm()\\' detected.');\n }\n if (aborted) {\n throw new Error('previous call to \\'initWasm()\\' failed.');\n }\n\n initializing = true;\n\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n return new Promise((resolve, reject) => {\n proxyWorker?.terminate();\n\n void importProxyWorker().then(([objectUrl, worker]) => {\n try {\n proxyWorker = worker;\n proxyWorker.onerror = (ev: ErrorEvent) => reject(ev);\n proxyWorker.onmessage = onProxyWorkerMessage;\n initWasmCallbacks = [resolve, reject];\n const message: OrtWasmMessage = {type: 'init-wasm', in : env};\n proxyWorker.postMessage(message);\n temporaryObjectUrl = objectUrl;\n } catch (e) {\n reject(e);\n }\n }, reject);\n });\n\n } else {\n try {\n await initializeWebAssembly(env.wasm);\n await core.initRuntime(env);\n initialized = true;\n } catch (e) {\n aborted = true;\n throw e;\n } finally {\n initializing = false;\n }\n }\n};\n\nexport const initializeOrtEp = async(epName: string): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('init-ep', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'init-ep', in : {epName, env}};\n proxyWorker!.postMessage(message);\n });\n } else {\n await core.initEp(env, epName);\n }\n};\n\nexport const copyFromExternalBuffer = async(buffer: Uint8Array): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('copy-from', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'copy-from', in : {buffer}};\n proxyWorker!.postMessage(message, [buffer.buffer]);\n });\n } else {\n return core.copyFromExternalBuffer(buffer);\n }\n};\n\nexport const createSession =\n async(model: SerializableInternalBuffer|Uint8Array, options?: InferenceSession.SessionOptions):\n Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n // check unsupported options\n if (options?.preferredOutputLocation) {\n throw new Error('session option \"preferredOutputLocation\" is not supported for proxy.');\n }\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('create', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'create', in : {model, options: {...options}}};\n const transferable: Transferable[] = [];\n if (model instanceof Uint8Array) {\n transferable.push(model.buffer);\n }\n proxyWorker!.postMessage(message, transferable);\n });\n } else {\n return core.createSession(model, options);\n }\n };\n\nexport const releaseSession = async(sessionId: number): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('release', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'release', in : sessionId};\n proxyWorker!.postMessage(message);\n });\n } else {\n core.releaseSession(sessionId);\n }\n};\n\nexport const run = async(\n sessionId: number, inputIndices: number[], inputs: TensorMetadata[], outputIndices: number[],\n outputs: Array, options: InferenceSession.RunOptions): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n // check inputs location\n if (inputs.some(t => t[3] !== 'cpu')) {\n throw new Error('input tensor on GPU is not supported for proxy.');\n }\n // check outputs location\n if (outputs.some(t => t)) {\n throw new Error('pre-allocated output tensor is not supported for proxy.');\n }\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('run', [resolve, reject]);\n const serializableInputs = inputs as SerializableTensorMetadata[]; // every input is on CPU.\n const message: OrtWasmMessage =\n {type: 'run', in : {sessionId, inputIndices, inputs: serializableInputs, outputIndices, options}};\n proxyWorker!.postMessage(message, core.extractTransferableBuffers(serializableInputs));\n });\n } else {\n return core.run(sessionId, inputIndices, inputs, outputIndices, outputs, options);\n }\n};\n\nexport const endProfiling = async(sessionId: number): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('end-profiling', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'end-profiling', in : sessionId};\n proxyWorker!.postMessage(message);\n });\n } else {\n core.endProfiling(sessionId);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession, InferenceSessionHandler, SessionHandler, Tensor, TRACE_FUNC_BEGIN, TRACE_FUNC_END} from 'onnxruntime-common';\n\nimport {SerializableInternalBuffer, TensorMetadata} from './proxy-messages';\nimport {copyFromExternalBuffer, createSession, endProfiling, releaseSession, run} from './proxy-wrapper';\nimport {isGpuBufferSupportedType} from './wasm-common';\nimport {isNode} from './wasm-utils-env';\nimport {loadFile} from './wasm-utils-load-file';\n\nexport const encodeTensorMetadata = (tensor: Tensor, getName: () => string): TensorMetadata => {\n switch (tensor.location) {\n case 'cpu':\n return [tensor.type, tensor.dims, tensor.data, 'cpu'];\n case 'gpu-buffer':\n return [tensor.type, tensor.dims, {gpuBuffer: tensor.gpuBuffer}, 'gpu-buffer'];\n default:\n throw new Error(`invalid data location: ${tensor.location} for ${getName()}`);\n }\n};\n\nexport const decodeTensorMetadata = (tensor: TensorMetadata): Tensor => {\n switch (tensor[3]) {\n case 'cpu':\n return new Tensor(tensor[0], tensor[2], tensor[1]);\n case 'gpu-buffer': {\n const dataType = tensor[0];\n if (!isGpuBufferSupportedType(dataType)) {\n throw new Error(`not supported data type: ${dataType} for deserializing GPU tensor`);\n }\n const {gpuBuffer, download, dispose} = tensor[2];\n return Tensor.fromGpuBuffer(gpuBuffer, {dataType, dims: tensor[1], download, dispose});\n }\n default:\n throw new Error(`invalid data location: ${tensor[3]}`);\n }\n};\n\nexport class OnnxruntimeWebAssemblySessionHandler implements InferenceSessionHandler {\n private sessionId: number;\n\n inputNames: string[];\n outputNames: string[];\n\n async fetchModelAndCopyToWasmMemory(path: string): Promise {\n // fetch model from url and move to wasm heap.\n return copyFromExternalBuffer(await loadFile(path));\n }\n\n async loadModel(pathOrBuffer: string|Uint8Array, options?: InferenceSession.SessionOptions): Promise {\n TRACE_FUNC_BEGIN();\n let model: Parameters[0];\n\n if (typeof pathOrBuffer === 'string') {\n if (isNode) {\n // node\n model = await loadFile(pathOrBuffer);\n } else {\n // browser\n // fetch model and copy to wasm heap.\n model = await this.fetchModelAndCopyToWasmMemory(pathOrBuffer);\n }\n } else {\n model = pathOrBuffer;\n }\n\n [this.sessionId, this.inputNames, this.outputNames] = await createSession(model, options);\n TRACE_FUNC_END();\n }\n\n async dispose(): Promise {\n return releaseSession(this.sessionId);\n }\n\n async run(feeds: SessionHandler.FeedsType, fetches: SessionHandler.FetchesType, options: InferenceSession.RunOptions):\n Promise {\n TRACE_FUNC_BEGIN();\n const inputArray: Tensor[] = [];\n const inputIndices: number[] = [];\n Object.entries(feeds).forEach(kvp => {\n const name = kvp[0];\n const tensor = kvp[1];\n const index = this.inputNames.indexOf(name);\n if (index === -1) {\n throw new Error(`invalid input '${name}'`);\n }\n inputArray.push(tensor);\n inputIndices.push(index);\n });\n\n const outputArray: Array = [];\n const outputIndices: number[] = [];\n Object.entries(fetches).forEach(kvp => {\n const name = kvp[0];\n const tensor = kvp[1];\n const index = this.outputNames.indexOf(name);\n if (index === -1) {\n throw new Error(`invalid output '${name}'`);\n }\n outputArray.push(tensor);\n outputIndices.push(index);\n });\n\n const inputs =\n inputArray.map((t, i) => encodeTensorMetadata(t, () => `input \"${this.inputNames[inputIndices[i]]}\"`));\n const outputs = outputArray.map(\n (t, i) => t ? encodeTensorMetadata(t, () => `output \"${this.outputNames[outputIndices[i]]}\"`) : null);\n\n const results = await run(this.sessionId, inputIndices, inputs, outputIndices, outputs, options);\n\n const resultMap: SessionHandler.ReturnType = {};\n for (let i = 0; i < results.length; i++) {\n resultMap[this.outputNames[outputIndices[i]]] = outputArray[i] ?? decodeTensorMetadata(results[i]);\n }\n TRACE_FUNC_END();\n return resultMap;\n }\n\n startProfiling(): void {\n // TODO: implement profiling\n }\n\n endProfiling(): void {\n void endProfiling(this.sessionId);\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Backend, env, InferenceSession, InferenceSessionHandler} from 'onnxruntime-common';\n\nimport {initializeOrtEp, initializeWebAssemblyAndOrtRuntime} from './wasm/proxy-wrapper';\nimport {OnnxruntimeWebAssemblySessionHandler} from './wasm/session-handler-inference';\nimport {scriptSrc} from './wasm/wasm-utils-import';\n\n/**\n * This function initializes all flags for WebAssembly.\n *\n * Those flags are accessible from `ort.env.wasm`. Users are allow to set those flags before the first inference session\n * being created, to override default value.\n */\nexport const initializeFlags = (): void => {\n if (typeof env.wasm.initTimeout !== 'number' || env.wasm.initTimeout < 0) {\n env.wasm.initTimeout = 0;\n }\n\n if (env.wasm.simd === false) {\n // eslint-disable-next-line no-console\n console.warn(\n 'Deprecated property \"env.wasm.simd\" is set to false. ' +\n 'non-SIMD build is no longer provided, and this setting will be ignored.');\n }\n\n if (typeof env.wasm.proxy !== 'boolean') {\n env.wasm.proxy = false;\n }\n\n if (typeof env.wasm.trace !== 'boolean') {\n env.wasm.trace = false;\n }\n\n if (typeof env.wasm.numThreads !== 'number' || !Number.isInteger(env.wasm.numThreads) || env.wasm.numThreads <= 0) {\n // The following logic only applies when `ort.env.wasm.numThreads` is not set by user. We will always honor user's\n // setting if it is provided.\n\n // Browser: when crossOriginIsolated is false, SharedArrayBuffer is not available so WebAssembly threads will not\n // work. In this case, we will set numThreads to 1.\n //\n // There is an exception: when the browser is configured to force-enable SharedArrayBuffer (e.g. Chromuim with\n // --enable-features=SharedArrayBuffer), it is possible that `self.crossOriginIsolated` is false and\n // SharedArrayBuffer is available at the same time. This is usually for testing. In this case, we will still set\n // numThreads to 1 here. If we want to enable multi-threading in test, we should set `ort.env.wasm.numThreads` to a\n // value greater than 1.\n if (typeof self !== 'undefined' && !self.crossOriginIsolated) {\n env.wasm.numThreads = 1;\n } else {\n const numCpuLogicalCores =\n typeof navigator === 'undefined' ? require('node:os').cpus().length : navigator.hardwareConcurrency;\n env.wasm.numThreads = Math.min(4, Math.ceil((numCpuLogicalCores || 1) / 2));\n }\n }\n\n if (!BUILD_DEFS.DISABLE_DYNAMIC_IMPORT) {\n // overwrite wasm paths override if not set\n if (env.wasm.wasmPaths === undefined && scriptSrc && scriptSrc.indexOf('blob:') !== 0) {\n env.wasm.wasmPaths = scriptSrc.substring(0, scriptSrc.lastIndexOf('/') + 1);\n }\n }\n};\n\nexport class OnnxruntimeWebAssemblyBackend implements Backend {\n /**\n * This function initializes the WebAssembly backend.\n *\n * This function will be called only once for each backend name. It will be called the first time when\n * `ort.InferenceSession.create()` is called with a registered backend name.\n *\n * @param backendName - the registered backend name.\n */\n async init(backendName: string): Promise {\n // populate wasm flags\n initializeFlags();\n\n // init wasm\n await initializeWebAssemblyAndOrtRuntime();\n\n // performe EP specific initialization\n await initializeOrtEp(backendName);\n }\n createInferenceSessionHandler(path: string, options?: InferenceSession.SessionOptions):\n Promise;\n createInferenceSessionHandler(buffer: Uint8Array, options?: InferenceSession.SessionOptions):\n Promise;\n async createInferenceSessionHandler(pathOrBuffer: string|Uint8Array, options?: InferenceSession.SessionOptions):\n Promise {\n const handler = new OnnxruntimeWebAssemblySessionHandler();\n await handler.loadModel(pathOrBuffer, options);\n return Promise.resolve(handler);\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {OnnxruntimeWebAssemblyBackend} from './backend-wasm';\nexport const wasmBackend = new OnnxruntimeWebAssemblyBackend();\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/* eslint-disable @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports */\n\n// We use \"require\" instead of \"import\" here because import statement must be put in top level. Our current code does\n// not allow bundler to tree-shaking code as expected because some codes are treated as having side effects.\n// So we import code inside the if-clause to allow bundler remove the code safely.\n\nexport * from 'onnxruntime-common';\nimport * as ort from 'onnxruntime-common';\nexport default ort;\n\nimport {registerBackend, env} from 'onnxruntime-common';\nimport {version} from './version';\n\nif (!BUILD_DEFS.DISABLE_WEBGL) {\n const onnxjsBackend = require('./backend-onnxjs').onnxjsBackend;\n registerBackend('webgl', onnxjsBackend, -10);\n}\n\nif (!BUILD_DEFS.DISABLE_WASM) {\n const wasmBackend = BUILD_DEFS.DISABLE_TRAINING ? require('./backend-wasm-inference').wasmBackend :\n require('./backend-wasm-training').wasmBackend;\n if (!BUILD_DEFS.DISABLE_JSEP) {\n registerBackend('webgpu', wasmBackend, 5);\n registerBackend('webnn', wasmBackend, 5);\n }\n registerBackend('cpu', wasmBackend, 10);\n registerBackend('wasm', wasmBackend, 10);\n}\n\nObject.defineProperty(env.versions, 'web', {value: version, enumerable: true});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// This file is generated by /js/scripts/update-version.ts\n// Do not modify file content manually.\n\nexport const version = '1.19.0';\n"], + "mappings": "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", + "names": ["backends", "backendsSortedByPriority", "registerBackend", "tryResolveAndInitializeBackend", "resolveBackendAndExecutionProviders", "init_backend_impl", "__esmMin", "name", "backend", "priority", "currentBackend", "i", "backendName", "backendInfo", "isInitializing", "e", "options", "eps", "backendHints", "backendNames", "errors", "availableBackendNames", "resolveResult", "err", "filteredEps", "target", "prop", "init_backend", "__esmMin", "init_backend_impl", "version", "init_version", "__esmMin", "logLevelValue", "env", "init_env_impl", "__esmMin", "init_version", "version", "value", "env", "init_env", "__esmMin", "init_env_impl", "tensorToDataURL", "tensorToImageData", "init_tensor_conversion_impl", "__esmMin", "tensor", "options", "canvas", "pixels2DContext", "width", "height", "inputformat", "norm", "normMean", "normBias", "stride", "rTensorPointer", "gTensorPointer", "bTensorPointer", "aTensorPointer", "i", "j", "R", "G", "B", "A", "image", "channels", "step", "rImagePointer", "gImagePointer", "bImagePointer", "aImagePointer", "bufferToTensor", "tensorFromImage", "tensorFromTexture", "tensorFromGpuBuffer", "tensorFromPinnedBuffer", "init_tensor_factory_impl", "__esmMin", "init_tensor_impl", "buffer", "options", "height", "width", "norm", "normMean", "normBias", "inputformat", "outputformat", "stride", "float32Data", "step", "rImagePointer", "gImagePointer", "bImagePointer", "aImagePointer", "rTensorPointer", "gTensorPointer", "bTensorPointer", "aTensorPointer", "i", "Tensor", "image", "isHTMLImageEle", "isImageDataEle", "isImageBitmap", "isString", "data", "bufferToTensorOptions", "createCanvas", "createCanvasContext", "canvas", "pixels2DContext", "tempCanvas", "resolve", "reject", "context", "newImage", "img", "texture", "download", "dispose", "dims", "gpuBuffer", "dataType", "type", "NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP", "NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP", "isTypedArrayChecked", "checkTypedArray", "init_tensor_impl_type_mapping", "__esmMin", "isBigInt64ArrayAvailable", "isBigUint64ArrayAvailable", "isFloat16ArrayAvailable", "calculateSize", "tensorReshape", "init_tensor_utils_impl", "__esmMin", "init_tensor_impl", "dims", "size", "i", "dim", "tensor", "Tensor", "Tensor", "init_tensor_impl", "__esmMin", "init_tensor_conversion_impl", "init_tensor_factory_impl", "init_tensor_impl_type_mapping", "init_tensor_utils_impl", "arg0", "arg1", "arg2", "checkTypedArray", "type", "dims", "expectedTypedArrayConstructor", "NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP", "data", "maybeDims", "typedArrayConstructor", "firstElementType", "mappedType", "NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP", "size", "calculateSize", "image", "options", "tensorFromImage", "texture", "tensorFromTexture", "gpuBuffer", "tensorFromGpuBuffer", "buffer", "tensorFromPinnedBuffer", "tensorToDataURL", "tensorToImageData", "releaseData", "tensorReshape", "Tensor", "init_tensor", "__esmMin", "init_tensor_impl", "TRACE", "TRACE_FUNC", "TRACE_FUNC_BEGIN", "TRACE_FUNC_END", "init_trace", "__esmMin", "init_env_impl", "deviceType", "label", "env", "msg", "extraMsg", "stack", "hasTraceFunc", "i", "InferenceSession", "init_inference_session_impl", "__esmMin", "init_backend_impl", "init_tensor", "init_trace", "_InferenceSession", "handler", "feeds", "arg1", "arg2", "TRACE_FUNC_BEGIN", "fetches", "options", "Tensor", "isFetchesEmpty", "name", "isFetches", "arg1Keys", "v", "results", "returnValue", "key", "result", "TRACE_FUNC_END", "arg0", "arg3", "filePathOrUint8Array", "buffer", "byteOffset", "byteLength", "backend", "optionsWithValidatedEPs", "resolveBackendAndExecutionProviders", "InferenceSession", "init_inference_session", "__esmMin", "init_inference_session_impl", "init_tensor_conversion", "__esmMin", "init_tensor_factory", "__esmMin", "init_onnx_model", "__esmMin", "init_onnx_value", "__esmMin", "noBackendErrMsg", "TrainingSession", "init_training_session_impl", "__esmMin", "init_backend_impl", "init_tensor", "_TrainingSession", "handler", "hasOptimizerModel", "hasEvalModel", "trainingOptions", "sessionOptions", "evalModel", "optimizerModel", "options", "backend", "optionsWithValidatedEPs", "resolveBackendAndExecutionProviders", "inputNames", "outputNames", "feeds", "arg1", "arg2", "fetches", "Tensor", "isFetchesEmpty", "name", "isFetches", "arg1Keys", "v", "results", "returnValue", "key", "result", "trainableOnly", "array", "paramsSize", "TrainingSession", "init_training_session", "__esmMin", "init_training_session_impl", "esm_exports", "__export", "InferenceSession", "TRACE", "TRACE_FUNC_BEGIN", "TRACE_FUNC_END", "Tensor", "TrainingSession", "env", "registerBackend", "init_esm", "__esmMin", "init_backend", "init_env", "init_inference_session", "init_tensor", "init_tensor_conversion", "init_tensor_factory", "init_trace", "init_onnx_model", "init_onnx_value", "init_training_session", "log", "arg0", "arg1", "arg2", "arg3", "createCategorizedLogger", "logInternal", "category", "severity", "content", "_stack", "config", "LOGGER_CONFIG_MAP", "SEVERITY_VALUE", "LOGGER_PROVIDER_MAP", "NoOpLoggerProvider", "ConsoleLoggerProvider", "LOGGER_DEFAULT_CONFIG", "Logger", "Event", "EventRecord", "Profiler", "now", "init_instrument", "__esmMin", "_severity", "_content", "_category", "verbose", "info", "warning", "error", "fatal", "reset", "set", "previousConfig", "setWithEnv", "env", "name", "startTime", "endCallback", "timer", "ctx", "endTime", "maxNumberEvents", "flushBatchSize", "flushIntervalInMilliseconds", "func", "event", "isPromise", "res", "resolve", "reject", "value", "reason", "eventRes", "e", "currentTime", "previousPointer", "resolveOperator", "node", "opsets", "rules", "rule", "opType", "domain", "versionSelector", "opImpl", "opInit", "opset", "matchSelector", "set", "version", "selector", "rangeStart", "pair", "rangeEnd", "init_opset", "__esmMin", "require_guid", "__commonJSMin", "exports", "Guid", "guid", "value", "count", "out", "i", "other", "Long", "low", "high", "unsigned", "isLong", "obj", "ctz32", "value", "c", "fromInt", "cachedObj", "cache", "UINT_CACHE", "fromBits", "INT_CACHE", "fromNumber", "UZERO", "ZERO", "TWO_PWR_64_DBL", "MAX_UNSIGNED_VALUE", "TWO_PWR_63_DBL", "MIN_VALUE", "MAX_VALUE", "TWO_PWR_32_DBL", "lowBits", "highBits", "fromString", "str", "radix", "p", "radixToPower", "pow_dbl", "result", "i", "size", "power", "fromValue", "val", "wasm", "TWO_PWR_16_DBL", "TWO_PWR_24_DBL", "TWO_PWR_24", "ONE", "UONE", "NEG_ONE", "LongPrototype", "long_default", "init_long", "__esmMin", "radixLong", "div", "rem1", "rem", "remDiv", "intval", "digits", "bit", "other", "thisNeg", "otherNeg", "addend", "a48", "a32", "a16", "a00", "b48", "b32", "b16", "b00", "c48", "c32", "c16", "c00", "subtrahend", "multiplier", "divisor", "approx", "res", "halfThis", "log2", "delta", "approxRes", "approxRem", "numBits", "b", "le", "hi", "lo", "bytes", "flatbuffers", "init_flatbuffers", "__esmMin", "low", "high", "other", "opt_initial_size", "initial_size", "forceDefaults", "size", "additional_bytes", "align_size", "old_buf_size", "byte_size", "i", "value", "voffset", "defaultValue", "obj", "bb", "new_buf_size", "nbb", "offset", "numfields", "vtableloc", "trimmed_size", "standard_fields", "len", "existing_vtable", "vt1", "outer_loop", "vt2", "j", "root_table", "opt_file_identifier", "opt_size_prefix", "size_prefix", "file_identifier", "table", "field", "table_start", "vtable_start", "ok", "elem_size", "num_elems", "alignment", "s", "utf8", "codePoint", "a", "b", "bytes", "position", "result", "bb_pos", "vtable_offset", "vtable", "t", "opt_encoding", "length", "c", "d", "ident", "onnxruntime", "init_ort_generated", "__esmMin", "init_flatbuffers", "experimental", "fbs", "AttributeType", "DimensionValueType", "TensorDataType", "NodeType", "TypeInfoValue", "Shape", "i", "bb", "obj", "flatbuffers", "index", "offset", "builder", "dimOffset", "data", "numElems", "Dimension", "optionalEncoding", "valueOffset", "denotationOffset", "DimensionValue", "dimType", "dimValue", "dimParamOffset", "TensorTypeAndShape", "elemType", "shapeOffset", "MapType", "keyType", "valueTypeOffset", "SequenceType", "elemTypeOffset", "EdgeEnd", "node_index", "src_arg_index", "dst_arg_index", "NodeEdge", "nodeIndex", "inputEdgesOffset", "outputEdgesOffset", "Node", "nameOffset", "docStringOffset", "domainOffset", "sinceVersion", "opTypeOffset", "type", "executionProviderTypeOffset", "inputsOffset", "outputsOffset", "attributesOffset", "inputArgCountsOffset", "implicitInputsOffset", "ValueInfo", "typeOffset", "TypeInfo", "valueType", "OperatorSetId", "version", "Tensor", "dimsOffset", "dataType", "rawDataOffset", "stringDataOffset", "SparseTensor", "valuesOffset", "indicesOffset", "Attribute", "f", "sOffset", "tOffset", "gOffset", "floatsOffset", "intsOffset", "stringsOffset", "tensorsOffset", "graphsOffset", "Graph", "initializersOffset", "nodeArgsOffset", "nodesOffset", "maxNodeIndex", "nodeEdgesOffset", "sparseInitializersOffset", "Model", "irVersion", "opsetImportOffset", "producerNameOffset", "producerVersionOffset", "modelVersion", "graphOffset", "graphDocStringOffset", "KernelCreateInfos", "nodeIndicesOffset", "kernelDefHashesOffset", "SubGraphSessionState", "graphIdOffset", "sessionStateOffset", "SessionState", "kernelsOffset", "subGraphSessionStatesOffset", "InferenceSession", "ortVersionOffset", "modelOffset", "require_aspromise", "__commonJSMin", "exports", "module", "asPromise", "fn", "ctx", "params", "offset", "index", "pending", "resolve", "reject", "err", "require_base64", "__commonJSMin", "exports", "base64", "string", "p", "n", "b64", "s64", "i", "buffer", "start", "end", "parts", "chunk", "j", "t", "b", "invalidEncoding", "offset", "c", "require_eventemitter", "__commonJSMin", "exports", "module", "EventEmitter", "evt", "fn", "ctx", "listeners", "i", "args", "require_float", "__commonJSMin", "exports", "module", "factory", "f32", "f8b", "le", "writeFloat_f32_cpy", "val", "buf", "pos", "writeFloat_f32_rev", "readFloat_f32_cpy", "readFloat_f32_rev", "writeFloat_ieee754", "writeUint", "sign", "exponent", "mantissa", "writeUintLE", "writeUintBE", "readFloat_ieee754", "readUint", "uint", "readUintLE", "readUintBE", "f64", "writeDouble_f64_cpy", "writeDouble_f64_rev", "readDouble_f64_cpy", "readDouble_f64_rev", "writeDouble_ieee754", "off0", "off1", "readDouble_ieee754", "lo", "hi", "require_inquire", "__commonJSMin", "e", "require_utf8", "__commonJSMin", "exports", "utf8", "string", "len", "c", "i", "buffer", "start", "end", "parts", "chunk", "t", "offset", "c1", "c2", "require_pool", "__commonJSMin", "exports", "module", "pool", "alloc", "slice", "size", "SIZE", "MAX", "slab", "offset", "buf", "require_longbits", "__commonJSMin", "exports", "module", "LongBits", "util", "lo", "hi", "zero", "zeroHash", "value", "sign", "unsigned", "charCodeAt", "hash", "mask", "part0", "part1", "part2", "require_minimal", "__commonJSMin", "exports", "util", "value", "obj", "prop", "Buffer", "sizeOrArray", "hash", "unsigned", "bits", "merge", "dst", "src", "ifNotSet", "keys", "i", "str", "newError", "name", "CustomError", "message", "properties", "fieldNames", "fieldMap", "encoding", "size", "require_writer", "__commonJSMin", "exports", "module", "Writer", "util", "BufferWriter", "LongBits", "base64", "utf8", "Op", "fn", "len", "val", "noop", "State", "writer", "create", "size", "writeByte", "buf", "pos", "writeVarint32", "VarintOp", "value", "writeVarint64", "bits", "writeFixed32", "writeBytes", "i", "head", "tail", "BufferWriter_", "require_writer_buffer", "__commonJSMin", "exports", "module", "BufferWriter", "Writer", "util", "val", "buf", "pos", "i", "value", "len", "writeStringBuffer", "require_reader", "__commonJSMin", "exports", "module", "Reader", "util", "BufferReader", "LongBits", "utf8", "indexOutOfRange", "reader", "writeLength", "buffer", "create_array", "create", "value", "readLongVarint", "bits", "i", "readFixed32_end", "buf", "end", "readFixed64", "length", "start", "nativeBuffer", "bytes", "wireType", "BufferReader_", "fn", "require_reader_buffer", "__commonJSMin", "exports", "module", "BufferReader", "Reader", "util", "buffer", "len", "require_service", "__commonJSMin", "exports", "module", "Service", "util", "rpcImpl", "requestDelimited", "responseDelimited", "rpcCall", "method", "requestCtor", "responseCtor", "request", "callback", "self", "err", "response", "endedByRPC", "require_rpc", "__commonJSMin", "exports", "rpc", "require_roots", "__commonJSMin", "exports", "module", "require_index_minimal", "__commonJSMin", "exports", "protobuf", "configure", "require_minimal", "__commonJSMin", "exports", "module", "require_onnx", "__commonJSMin", "exports", "module", "$protobuf", "$Reader", "$Writer", "$util", "$root", "onnx", "valuesById", "values", "AttributeProto", "properties", "keys", "i", "message", "writer", "reader", "length", "end", "tag", "end2", "error", "object", "options", "long", "j", "typeUrlPrefix", "ValueInfoProto", "NodeProto", "TrainingInfoProto", "ModelProto", "StringStringEntryProto", "TensorAnnotation", "GraphProto", "TensorProto", "Segment", "SparseTensorProto", "TensorShapeProto", "Dimension", "$oneOfFields", "TypeProto", "Tensor", "Sequence", "Map", "Optional", "SparseTensor", "OperatorSetIdProto", "FunctionProto", "assert", "expr", "msg", "decodeUtf8String", "buffer", "import_onnx", "ArrayUtil", "MatMulUtil", "BroadcastUtil", "GemmUtil", "ProtoUtil", "LongUtil", "ShapeUtil", "SplitUtil", "PoolConvUtil", "MIN_CLIP", "MAX_CLIP", "init_util", "__esmMin", "init_flatbuffers", "init_long", "init_tensor", "n1", "n2", "i", "dimsA", "dimsB", "a", "b", "outputShape", "aRank", "bRank", "_BroadcastUtil", "adims", "bdims", "isMatMul", "arank", "brank", "crank", "cdims", "cShapeMatMul", "aLen", "bLen", "broadcastedIndices", "originalShape", "originalIndices", "dimOffset", "op", "inplace", "resultType", "size", "c", "Tensor", "outputIndices", "originalIndicesA", "originalIndicesB", "valA", "valB", "isAScalar", "isBScalar", "rest", "j", "shape", "finalShape", "inputRank", "finalRank", "inputShape", "inRank", "dims", "dim", "leftShape", "transLeft", "rightShape", "transRight", "biasShape", "M", "K", "N", "kDim", "_ProtoUtil", "typeProto", "type", "d", "long_default", "valueType", "tensor", "node", "attributes", "n", "unsigned", "flatbuffers", "_ShapeUtil", "axis", "start", "end", "rank", "strides", "indices", "offset", "tensorRank", "axes", "x", "index", "axisToIncrementOn", "k", "originalDims", "shapeHints", "nDims", "reshapedDims", "unknownDimension", "newTensorSize", "oldTensorSize", "perm", "v", "pad", "shape1", "shape2", "total", "y", "right", "outputDims", "inSqueezeList", "inputDimsIterator", "_SplitUtil", "split", "numOutputs", "shapes", "offsets", "numElementsAlongAxis", "_PoolConvUtil", "isGlobalOperator", "inputDims", "kernelShape", "dilations", "pads", "autoPad", "filterDims", "inSize", "stride", "dilation", "kernel", "padHeadIndex", "padTailIndex", "dkernel", "padNeeded", "sizeof", "type", "sizeofProto", "createView", "dataBuffer", "dataviewConstructor", "longToNumber", "i", "ortFbs", "readProto", "view", "byteOffset", "long_default", "import_guid_typescript", "import_onnx", "Tensor", "init_tensor", "__esmMin", "init_long", "init_ort_generated", "init_util", "onnxruntime", "_Tensor", "dims", "dataProvider", "asyncDataProvider", "cache", "dataId", "ShapeUtil", "size", "empty", "constructor", "buf", "data", "indices", "value", "tensorProto", "ProtoUtil", "str", "decodeUtf8String", "dataDest", "dataSource", "elementSize", "length", "n", "array", "element", "ortTensor", "getGlsl", "version", "GLSL_ES_2_0", "GLSL_ES_3_0", "getVertexShaderSource", "glsl", "getFragShaderPreamble", "getDefaultFragShaderMain", "outputShapeLength", "init_glsl_source", "__esmMin", "init_types", "__esmMin", "repeatedTry", "checkFn", "delayFn", "_counter", "maxCounter", "resolve", "reject", "tryCount", "tryFn", "nextBackoff", "generateShaderFuncNameFromInputSamplerName", "samplerName", "assert", "generateShaderFuncNameFromInputSamplerNameAtOutCoords", "squeezeInputShape", "inputShape", "squeezedShape", "newInputShape", "getSqueezedParams", "params", "keptDims", "d", "getCoordsDataType", "rank", "getGlChannels", "init_utils", "__esmMin", "init_util", "getVecChannels", "name", "rank", "getGlChannels", "d", "getChannels", "unpackFromChannel", "init_packing_utils", "__esmMin", "init_utils", "getOutOfBoundsCondition", "rank", "shape", "dims", "cond", "i", "getOutput", "coord00", "coord01", "coord10", "coord11", "D", "getSetup", "rows", "cols", "packProgramMetadata", "createPackProgramInfo", "createPackProgramInfoLoader", "init_pack", "__esmMin", "init_glsl_source", "init_types", "init_utils", "init_packing_utils", "handler", "input", "glsl", "getGlsl", "inputShape", "inputRank", "outputRank", "coordsDataType", "getCoordsDataType", "channels", "getChannels", "setup", "reversedInputWH", "outOfBoundsCondition", "output", "shaderSource", "processDims3D", "shape", "batch", "i", "isReshapeCheap", "dims", "reshapedDims", "isCheapReshape", "getReshapedInputCoords", "strides", "ShapeUtil", "coords", "index", "stride", "line1", "line2", "getFlattenedIndexFrom3D", "createPackedReshape3DProgramMetadata", "createPackedReshape3DProgramInfo", "createPackedReshape3DProgramInfoLoader", "init_reshape_packed", "__esmMin", "init_util", "init_glsl_source", "init_types", "init_packing_utils", "outputShape3D", "handler", "input3D", "metadata", "inputShape3D", "squeezedOutputShape", "mainLoop", "outputCoords", "glsl", "getGlsl", "shaderSource", "unpackFromChannel", "encodeAsUint8", "init_uint8_encode", "__esmMin", "init_glsl_source", "init_types", "inferenceHandler", "input", "outputShape", "glsl", "getGlsl", "shaderSource", "programInfo", "getSourceCoords", "rank", "dims", "coords", "i", "unpackProgramMetadata", "createUnpackProgramInfo", "createUnpackProgramInfoLoader", "init_unpack", "__esmMin", "init_glsl_source", "init_types", "init_utils", "init_packing_utils", "handler", "input", "channels", "getChannels", "innerDims", "coordsDataType", "getCoordsDataType", "unpackChannel", "unpackFromChannel", "sourceCoords", "glsl", "getGlsl", "shaderSource", "RedFloat32DataEncoder", "RGBAFloatDataEncoder", "Uint8DataEncoder", "init_texture_data_encoder", "__esmMin", "init_instrument", "gl", "channels", "src", "textureSize", "result", "source", "Logger", "v", "i", "size", "buffer", "dataSize", "_value", "index", "textureType", "dest", "_textureSize", "createTextureLayoutFromTextureType", "calculateTextureWidthAndHeight", "createTextureLayoutFromShape", "init_texture_layout", "__esmMin", "init_util", "init_types", "textureLayoutStrategy", "shape", "textureType", "channel", "isPacked", "reverseWH", "breakAxis", "unpackedShape", "d", "i", "layout", "channels", "prefs", "width", "height", "rank", "inferredDims", "ShapeUtil", "getProgramInfoUniqueKey", "WebGLInferenceHandler", "init_inference_handler", "__esmMin", "init_instrument", "init_tensor", "init_util", "init_pack", "init_reshape_packed", "init_uint8_encode", "init_unpack", "init_texture_data_encoder", "init_texture_layout", "init_types", "programInfo", "inputTextureDatas", "inputs", "texture", "key", "session", "shape", "textureType", "calculateTextureWidthAndHeight", "program", "i", "artifact", "outputTextureLayout", "createTextureLayoutFromTextureType", "outputTextureData", "output", "tensor", "td", "layout", "adjustedKernelShape", "adjustedLayout", "buffer", "numFeatureMaps", "oldRowSize", "newRowSize", "newSize", "f", "oldOffset", "newOffset", "unpackedTextureLayout", "createTextureLayoutFromShape", "unpackedTextureData", "dataType", "data", "usage", "Logger", "input", "reshapedDims", "inputTD", "newTextureLayout", "ShapeUtil", "isReshapeCheap", "squeezedInputShape", "processDims3D", "squeezedOutputShape", "squeezedInputTensor", "squeezedOutputTensor", "createPackedReshape3DProgramInfoLoader", "type", "tensorId", "textureData", "Tensor", "_id", "isPacked", "encodeAsUint8", "createPackProgramInfoLoader", "createUnpackProgramInfoLoader", "AttributeWithCacheKeyImpl", "createAttributeWithCacheKey", "init_attribute_with_cache_key", "__esmMin", "attribute", "name", "batchNormalizationProgramMetadata", "batchNormalization", "parseBatchNormalizationAttributes", "createBatchNormalizationProgramInfo", "validateInputs", "init_batch_normalization", "__esmMin", "init_attribute_with_cache_key", "init_glsl_source", "init_types", "inferenceHandler", "inputs", "attributes", "node", "epsilon", "momentum", "spatial", "createAttributeWithCacheKey", "glsl", "getGlsl", "rank", "scaleWidth", "scaleHeight", "shaderSource", "X", "scale", "B", "mean", "var_", "GlslContext", "GlslLib", "GlslLibRoutine", "GlslLibRoutineNode", "TopologicalSortGlslRoutines", "init_glsl_definitions", "__esmMin", "glContext", "programInfo", "inputTextureLayouts", "outputTextureLayout", "context", "routineBody", "dependencies", "name", "node", "nodes", "cycleCheck", "alreadyTraversed", "result", "graphNodes", "root", "i", "glslAdd", "name", "glslDiv", "glslMul", "glslSub", "glslEqual", "glslGreater", "glslLess", "glslAnd", "glslOr", "glslXor", "glslPow", "glslBuiltinBinary", "glslPRelu", "fname", "createBinaryProgramInfoLoader", "createBinaryProgramInfo", "add", "and", "div", "equal", "greater", "less", "mul", "or", "pow", "pRelu", "sub", "xor", "init_binary_op", "__esmMin", "init_util", "init_glsl_definitions", "init_glsl_source", "init_types", "handler", "inputs", "glslFunc", "outputTensorType", "cacheKey", "textureType", "isBroadcast", "ShapeUtil", "outputShape", "usePackedTexture", "calculatedShape", "BroadcastUtil", "outputRank", "aRank", "bRank", "aBcast", "bBcast", "glsl", "getGlsl", "shaderSource", "cast", "parseCastAttributes", "validateInputs", "init_cast", "__esmMin", "init_util", "handler", "inputs", "to", "node", "ProtoUtil", "createPackedConcatProgramMetadata", "createPackedConcatProgramInfo", "createPackedConcatProgramInfoLoader", "getShiftedChannelsSnippet", "init_concat_packed", "__esmMin", "init_glsl_source", "init_types", "init_utils", "init_packing_utils", "inputCount", "cacheHint", "_v", "i", "handler", "metadata", "inputs", "axis", "inputShape", "outputShape", "dataNShape", "axisIndex", "rank", "coords", "getChannels", "dtype", "getCoordsDataType", "unpackChannel", "unpackFromChannel", "shapes", "channels", "getGlChannels", "offsets", "channel", "lastChannels", "allChannels", "getValueSnippet", "shift", "lastIndex", "glsl", "getGlsl", "shaderSource", "x", "attributes", "channelIdx", "c", "idx", "concat", "createUnpackedConcatProgramMetadata", "createUnpackedConcatProgramInfo", "createUnpackedConcatProgramInfoLoader", "getTextureIndexWhereDataResidesLinearSearch", "getTextureIndexWhereDataResidesBinarySearch", "getFetchDataFromCorrectTextureMethod", "getGetSizeInConcatAxisValueFromIndexMethod", "parseConcatAttributes", "validateInputs", "init_concat", "__esmMin", "init_attribute_with_cache_key", "init_types", "init_concat_packed", "inferenceHandler", "inputs", "attributes", "createPackedConcatProgramInfoLoader", "inputCount", "cacheHint", "_v", "i", "_handler", "metadata", "axis", "inputShape", "outputShape", "dataNShape", "axisIndex", "rank", "sizeInConcatAxis", "previousSum", "getTextureIndexWhereDataResidesMethod", "fetchDataFromCorrectTextureMethod", "getSizeInConcatAxisValueFromIndexMethod", "shaderSource", "handler", "size", "numberOfTensors", "tensorRank", "codeLines", "node", "createAttributeWithCacheKey", "inputType", "inputDimensionality", "input", "glslAbs", "glslBuiltinUnary", "glslAcos", "glslAsin", "glslAtan", "glslCeil", "glslCos", "glslElu", "alpha", "name", "glslExp", "glslFloor", "glslClip", "min", "max", "glslIdentity", "glslLeakyRelu", "glslLog", "glslNeg", "glslNot", "glslSin", "glslRelu", "glslSigmoid", "glslSqrt", "glslTan", "glslTanh", "createElementwiseProgramInfo", "createElementwiseProgramInfoLoader", "abs", "acos", "asin", "atan", "clip", "parseClipAttributes", "clipV11", "generateClipAttributesFromInputs", "ceil", "cos", "elu", "parseEluAttributes", "exp", "floor", "identity", "leakyRelu", "parseLeakyReluAttributes", "log", "neg", "not", "relu", "sigmoid", "sin", "sqrt", "tan", "tanh", "init_unary_op", "__esmMin", "init_attribute_with_cache_key", "init_util", "init_glsl_definitions", "init_glsl_source", "init_types", "handler", "metadata", "input", "glslFunc", "textureType", "glsl", "getGlsl", "cacheKey", "inputs", "attributes", "node", "createAttributeWithCacheKey", "MIN_CLIP", "MAX_CLIP", "getActivationSnippet", "attributes", "func", "glslRelu", "glslSigmoid", "glslClip", "activationName", "activationFunction", "applyActivation", "parseInternalActivationAttributes", "init_fuse_utils", "__esmMin", "init_util", "init_unary_op", "activation", "clipMin", "clipMax", "MIN_CLIP", "MAX_CLIP", "createUnpackedGroupedConvProgramMetadata", "createUnpackedGroupedConvProgramInfo", "createUnpackedGroupedConvProgramInfoLoader", "init_conv_grouped", "__esmMin", "init_instrument", "init_glsl_source", "init_types", "init_conv", "init_fuse_utils", "hasBias", "cacheHint", "inferenceHandler", "inputs", "metadata", "attributes", "processBias", "xShape", "wShape", "outputChannelsPerGroup", "Logger", "outputShape", "calculateOutputShape", "glsl", "getGlsl", "activationFunction", "applyActivation", "getActivationSnippet", "shaderSource", "createPackedIm2ColProgramMetadata", "createPackedIm2ColProgramInfo", "createPackedIm2ColProgramInfoLoader", "init_im2col_pack", "__esmMin", "init_glsl_source", "init_types", "init_packing_utils", "cacheHint", "inferenceHandler", "metadata", "x", "w", "outputShape", "attributes", "xshape", "wshape", "rowDim", "colDim", "rank", "im2colShape", "kernelSize", "unpackChannel", "unpackFromChannel", "glsl", "getGlsl", "unrolled", "row", "col", "shaderSource", "createMatmulProgramInfo", "metadata", "inputs", "activationAttributes", "aShape", "bShape", "outputShape", "BroadcastUtil", "coordsDataType", "getCoordsDataType", "allGlChannels", "getGlChannels", "activationFunction", "applyActivation", "getActivationSnippet", "hasBias", "processBias", "getBiasForMatmulSnippet", "getBiasForMatmul", "rank", "arank", "brank", "sharedDim", "shaderSource", "createMatmulProgramInfoLoader", "createMatmulProgramMetadata", "inShape", "outShape", "isPacked", "unpackedCoordsSnippet", "inRank", "outRank", "rankDiff", "_s", "i", "coordsSnippet", "d", "isInputScalar", "ShapeUtil", "output", "matMul", "parseMatMulAttributes", "validateInputs", "init_matmul", "__esmMin", "init_util", "init_types", "init_utils", "init_fuse_utils", "init_matmul_pack", "inferenceHandler", "attributes", "createPackedMatmulProgramInfoLoader", "node", "parseInternalActivationAttributes", "cacheHint", "getBcastSamplerForMatmul", "coordsDataType", "allGlChannels", "inputs", "outShape", "unpackedACoordsSnippet", "unpackedBCoordsSnippet", "inAShape", "inBShape", "inARank", "inBRank", "outRank", "rankADiff", "rankBDiff", "_s", "i", "broadcastADims", "BroadcastUtil", "broadcastBDims", "coordsASnippet", "d", "coordsBSnippet", "swapDimSnippet", "getA", "rank", "res", "getB", "createPackedMatmulProgramMetadata", "createPackedMatmulProgramInfo", "createPackedMatmulProgramInfoLoader", "init_matmul_pack", "__esmMin", "init_util", "init_glsl_source", "init_types", "init_utils", "init_fuse_utils", "init_matmul", "hasBias", "cacheHint", "inferenceHandler", "metadata", "activationAttributes", "processBias", "aShape", "bShape", "outputShape", "isBroadcast", "ShapeUtil", "sharedDim", "sharedDimIndex", "aRank", "bRank", "glsl", "getGlsl", "getCoordsDataType", "getGlChannels", "activationFunction", "applyActivation", "getActivationSnippet", "getBiasForMatmulSnippet", "getBiasForMatmul", "getBcastedSamplerForMatmulSnippet", "getSamplerAInLoopSnippet", "getSamplerBInLoopSnippet", "getOutputCoordsSnippet", "shaderSource", "conv2DPacked", "init_conv_pack", "__esmMin", "init_conv", "init_im2col_pack", "init_matmul_pack", "inferenceHandler", "inputs", "attributes", "xshape", "kshape", "outputShape", "calculateOutputShape", "im2colOutput", "createPackedIm2ColProgramInfoLoader", "kernelReshaped", "matmulInputs", "matmulOutput", "createPackedMatmulProgramInfoLoader", "createIm2ColProgramMetadata", "createIm2ColProgramInfo", "createIm2ColProgramInfoLoader", "calculateIm2ColDims", "init_im2col", "__esmMin", "init_types", "cacheHint", "_inferenceHandler", "metadata", "x", "w", "outputShape", "attributes", "xshape", "wshape", "rank", "im2colDims", "shaderSource", "inferenceHandler", "inputShape", "kernelShape", "channels", "createDotProductProgramMetadata", "createDotProductProgramInfo", "createDotProductProgramInfoLoader", "init_dot_product", "__esmMin", "init_util", "init_glsl_source", "init_types", "init_fuse_utils", "init_im2col", "hasBias", "attributes", "inferenceHandler", "metadata", "inputs", "outputShape", "xshape", "kshape", "adjustedKernelShape", "im2colShape", "calculateIm2ColDims", "kWidth", "kHeight", "im2colStrides", "ShapeUtil", "im2colWidth", "im2colHeight", "rank", "initValue", "sharedDim", "activationFunction", "applyActivation", "getActivationSnippet", "glsl", "getGlsl", "shaderSource", "calculateOutputShape", "conv", "conv2d", "conv2DUnpackedPointwise", "conv2DUnpacked", "getAdjustedConvAttributes", "parseConvAttributes", "validateInputs", "init_conv", "__esmMin", "init_attribute_with_cache_key", "init_util", "init_conv_grouped", "init_conv_pack", "init_dot_product", "init_fuse_utils", "init_im2col", "init_matmul", "inputShape", "kernelShape", "dilations", "adjustPads", "strides", "batchSize", "inputSpatialShape", "spatialRank", "outChannels", "dilatedKernelShape", "v", "i", "outputSpatialShape", "inferenceHandler", "inputs", "attributes", "adjustedAttributes", "packMode", "isPointwise", "createUnpackedGroupedConvProgramInfoLoader", "conv2DPacked", "xshape", "kshape", "outputShape", "reshapedX", "reshapedK", "matmulInputs", "matmulOutput", "createMatmulProgramInfoLoader", "xIm2Col", "createIm2ColProgramInfoLoader", "dotProductInputs", "createDotProductProgramInfoLoader", "pads", "PoolConvUtil", "newAttributes", "node", "activationAttributes", "parseInternalActivationAttributes", "autoPad", "group", "createAttributeWithCacheKey", "dataChannel", "filterInChannel", "computeTotalPad", "distributePadding", "calculateOutputShapeAndPads", "convTranspose", "convTranspose2d", "createConvTransposeProgramMetadata", "createUnpackedConvTransposeProgramInfo", "createUnpackedConvTransposeProgramInfoLoader", "convTranspose2DUnpacked", "getAdjustedConvTransposeAttributes", "parseConvTransposeAttributes", "validateInputs", "init_conv_transpose", "__esmMin", "init_attribute_with_cache_key", "init_glsl_source", "init_types", "init_fuse_utils", "inDim", "stride", "adj", "kernel", "dilation", "outSize", "totalPad", "autoPad", "pads", "head", "tail", "smallPad", "inputShape", "kernelShape", "dilations", "strides", "outputPadding", "outputShape", "spatialRank", "updateShape", "i", "inferenceHandler", "inputs", "attributes", "adjustedAttributes", "hasBias", "cacheHint", "metadata", "valueInit", "xShape", "wShape", "outputChannelsPerGroup", "inputChannelsPerGroup", "glsl", "getGlsl", "activationFunction", "applyActivation", "getActivationSnippet", "shaderSource", "newAttributes", "node", "activationAttributes", "parseInternalActivationAttributes", "group", "createAttributeWithCacheKey", "dataChannel", "filterInChannel", "featureMaps", "transposeProgramMetadata", "transpose", "parseTransposeAttributes", "createTransposeProgramInfo", "getAdjustedPerm", "getOutputShape", "getPermFunctionBody", "validateInputs", "init_transpose", "__esmMin", "init_attribute_with_cache_key", "init_util", "init_types", "inferenceHandler", "inputs", "attributes", "node", "createAttributeWithCacheKey", "_inferenceHandler", "input", "perm", "inputShape", "unpackedOutputShape", "rank", "shaderSource", "ShapeUtil", "name", "reverseFunc", "i", "depthToSpace", "parseDepthToSpaceAttributes", "validateInputs", "init_depth_to_space", "__esmMin", "init_transpose", "inferenceHandler", "inputs", "attributes", "blocksize", "blocksizeSqr", "transposePerm", "firstReshapeShape", "firstReshapedTensor", "transposeAttributes", "transposeOutput", "transpose", "secondReshapeShape", "node", "mode", "flatten", "parseFlattenAttributes", "validateInputs", "init_flatten", "__esmMin", "init_util", "inferenceHandler", "inputs", "axis", "outputDims", "ShapeUtil", "node", "r", "NUMBER_TYPES", "init_operators", "__esmMin", "gather", "parseGatherAttributes", "gatherProgramMetadata", "createGatherProgramInfo", "createGatherProgramInfoLoader", "validateInputs", "init_gather", "__esmMin", "init_attribute_with_cache_key", "init_operators", "init_util", "init_types", "inferenceHandler", "inputs", "attributes", "node", "createAttributeWithCacheKey", "_handler", "metadata", "axis", "inputShape", "indexDataShape", "outputShape", "ShapeUtil", "indexCopyOps", "i", "orank", "irank", "iDrank", "shaderSource", "handler", "tensorRank", "NUMBER_TYPES", "gemm", "parseGemmAttributes", "parseGemmAttributesV7", "parseGemmAttributesV11", "createGemmProgramInfoLoader", "createGemmProgramInfo", "validateInputs", "init_gemm", "__esmMin", "init_attribute_with_cache_key", "init_util", "init_types", "inferenceHandler", "inputs", "attributes", "node", "isOptionalC", "transA", "transB", "alpha", "beta", "createAttributeWithCacheKey", "metadata", "aShape", "bShape", "M", "N", "GemmUtil", "outputShape", "sharedDim", "line", "rank", "declareC", "broadcastC", "calculateC", "shaderSource", "imageScaler", "parseImageScalerAttributes", "imageScalerProgramMetadata", "createImageScalerProgramInfo", "createImageScalerProgramInfoLoader", "createGetBiasMethod", "validateInputs", "init_image_scaler", "__esmMin", "init_attribute_with_cache_key", "init_types", "inferenceHandler", "inputs", "attributes", "node", "scale", "bias", "createAttributeWithCacheKey", "_handler", "metadata", "outputShape", "rank", "shaderSource", "handler", "numChannels", "codeLines", "i", "instanceNormalization", "parseInstanceNormalizationAttributes", "meanAndVarianceProgramMetadata", "createMeanAndVarianceProgramInfo", "createMeanAndVarianceProgramInfoLoader", "computeOutputProgramMetadata", "createComputeOutputProgramInfo", "createComputeOutputProgramInfoLoader", "validateInputs", "init_instance_normalization", "__esmMin", "init_glsl_source", "init_types", "inferenceHandler", "inputs", "epsilon", "meanAndVariance", "node", "metadata", "input", "xDims", "channel", "channelSize", "outputShape", "shaderSource", "meanAndVarianceShape", "glsl", "getGlsl", "textureWidth", "textureHeight", "meanAndVarianceWidth", "meanAndVarianceHeight", "X", "scale", "B", "createLrnProgramInfo", "inputs", "attributes", "C", "rank", "from", "to", "alpha", "bias", "beta", "shaderSource", "lrnProgramMetadata", "createLrnProgramInfoLoader", "lrn", "parseLrnAttributes", "validateInputs", "init_lrn", "__esmMin", "init_attribute_with_cache_key", "init_types", "inferenceHandler", "node", "size", "createAttributeWithCacheKey", "padProgramMetadata", "padV2", "parsePadAttributesV2", "padV11", "parsePadAttributesV11", "generatePadAttributesFromInputs", "createPadProgramInfo", "validateInputsV2", "validateInputsV11", "getPadFunction", "getPadConstant", "getPadReflect", "getPadEdge", "init_pad", "__esmMin", "init_attribute_with_cache_key", "init_util", "init_glsl_source", "init_types", "inferenceHandler", "inputs", "attributes", "node", "mode", "value", "pads", "createAttributeWithCacheKey", "attrubutes", "input", "outputShape", "ShapeUtil", "rank", "shaderSource", "glsl", "getGlsl", "width", "height", "strides", "shape", "block", "i", "averagePool", "parseAveragePoolAttributes", "createAveragePoolProgramInfo", "globalAveragePool", "parseGlobalAveragePoolAttributes", "maxPool", "parseMaxPoolAttributes", "createMaxPoolProgramInfo", "getAdjustedPoolAttributesAndOutputShape", "globalMaxPoolAttributes", "globalMaxPoolMetadata", "globalMaxPool", "validateInputs", "generatePoolingCode", "copyArray", "offsetToIndices", "init_pool", "__esmMin", "init_attribute_with_cache_key", "init_util", "init_types", "inferenceHandler", "inputs", "attributes", "metadata", "node", "autoPad", "ceilMode", "countIncludePad", "kernelShape", "strides", "pads", "createAttributeWithCacheKey", "isGlobalOperator", "adjustedAttributes", "outputShape", "kernelSize", "ShapeUtil", "op1", "op2", "shaderSource", "storageOrder", "dilations", "inputShape", "hasDilations", "PoolConvUtil", "newAttributes", "inputDims", "start", "rank", "kw", "sw", "pwStart", "pwEnd", "dimW", "codeW", "codeH", "codeHEnd", "kh", "sh", "phStart", "phEnd", "dimH", "kernelStrides", "stridesRank", "padsRank", "offsetToIndicesFunction", "copyInputDims", "copyPads", "copyKernelStrides", "copyStrides", "hasPads", "sum", "cur", "padCode", "array", "arrayName", "block", "i", "reduce", "parseReduceAttributes", "createReduceProgramInfo", "validateInputs", "reduceSum", "reduceMean", "reduceMax", "reduceMin", "reduceProd", "reduceLogSum", "reduceLogSumSquare", "init_reduce", "__esmMin", "init_attribute_with_cache_key", "init_operators", "init_util", "init_types", "inferenceHandler", "inputs", "attributes", "name", "reduceOp", "reduceProgramMetadata", "node", "axes", "keepDims", "createAttributeWithCacheKey", "_handler", "_name", "outputShape", "iRank", "idxCopy", "ShapeUtil", "ops", "reduceOps", "k", "shaderSource", "NUMBER_TYPES", "size", "idxZero", "reshape", "init_reshape", "__esmMin", "init_util", "handler", "inputs", "reshapedDims", "ShapeUtil", "upsampleProgramMetadata", "upsample", "parseUpsampleAttributesV7", "parseUpsampleAttributesV9", "parseUpsampleAttributes", "createUpsampleProgramInfo", "validateInputs", "scalesValidation", "init_upsample", "__esmMin", "init_attribute_with_cache_key", "init_glsl_source", "init_types", "inferenceHandler", "inputs", "attributes", "node", "opset", "isResize", "mode", "scales", "extrapolationValue", "coordinateTransformMode", "needRoiInput", "useExtrapolation", "nearestMode", "cubicCoefficientA", "excludeOutside", "useNearest2xOptimization", "roiInputIdx", "scalesInputIdx", "sizesInputIdx", "createAttributeWithCacheKey", "glsl", "getGlsl", "inputWidth", "inputHeight", "outputShape", "dim", "i", "outputWidth", "outputHeight", "outputPitches", "inputPitches", "precalculatedPitches", "d", "getInputFloatFunction", "shaderSource", "x", "attribute", "scale", "resizeProgramMetadata", "resize", "parseResizeAttributesV10", "parseResizeAttributesV11", "createPackedResizeProgramInfo", "prepareInputs", "parseScalesData", "parseScalesDataFromOutputSize", "init_resize_packed", "__esmMin", "init_glsl_source", "init_types", "init_utils", "init_packing_utils", "init_upsample", "inferenceHandler", "inputs", "attributes", "validateInputs", "node", "parseUpsampleAttributes", "glsl", "getGlsl", "scales", "outputShape", "s", "dim", "outputHeight", "outputWidth", "inputShape", "inputHeight", "inputWidth", "scalesHeight", "scalesWidth", "getSourceFracIndex", "coordsDataType", "getCoordsDataType", "unpackChannel", "unpackFromChannel", "shaderSource", "xDims", "outputSizes", "scalesTensor", "sizesTensor", "yDims", "i", "scale", "mode", "isResize", "scalesValidation", "length", "end", "shape", "validateInputs", "init_shape", "__esmMin", "init_tensor", "_inferenceHandler", "inputs", "Tensor", "sliceProgramMetadata", "slice", "parseSliceAttributes", "createSliceProgramInfo", "validateInputs", "sliceV10", "generateSliceAttributesFromInputs", "validateInputsV10", "init_slice", "__esmMin", "init_attribute_with_cache_key", "init_operators", "init_util", "init_types", "inferenceHandler", "inputs", "attributes", "node", "starts", "ends", "axes", "createAttributeWithCacheKey", "_inferenceHandler", "input", "_val", "i", "normalizedAxes", "ShapeUtil", "start", "end", "outputShape", "sliceOps", "shaderSource", "NUMBER_TYPES", "cacheKey", "softmaxComputeMaxProgramMetadata", "softmaxComputeScaleProgramMetadata", "softmaxProgramMetadata", "softmax", "parseSoftmaxAttributes", "parseSoftmaxAttributesV13", "softmaxV13", "computeSoftmax", "createComputeMaxProgramInfo", "createComputScaleProgramInfo", "createSoftMaxProgramInfo", "validateInputs", "init_softmax", "__esmMin", "init_attribute_with_cache_key", "init_util", "init_glsl_source", "init_types", "init_transpose", "inferenceHandler", "inputs", "attributes", "inputShape", "axis", "ShapeUtil", "logicalRowCount", "featureCount", "node", "createAttributeWithCacheKey", "rank", "isTransposeRequired", "transposedInputShape", "perm", "transposedInputs", "transposeAttribute", "_", "i", "p", "transpose", "output", "computeMaxProgramInfo", "max", "computeScaleProgramInfo", "scale", "softMaxProgramInfo", "input", "outputShape", "textureWidth", "textureHeight", "glsl", "getGlsl", "shaderSource", "maxElementPerLogicalRow", "normalizationPerLogicalRow", "splitProgramMetadata", "split", "parseSplitAttributes", "getProgramCount", "createSplitProgramInfo", "validateInputs", "init_split", "__esmMin", "init_attribute_with_cache_key", "init_util", "init_types", "inferenceHandler", "inputs", "attributes", "axis", "ShapeUtil", "count", "output", "i", "node", "numOutputs", "createAttributeWithCacheKey", "_inferenceHandler", "offsets", "SplitUtil", "input", "index", "shapes", "offset", "outputShape", "shaderSource", "squeeze", "squeezeV13", "parseSqueezeAttributes", "validateInputs", "validateInputsV13", "init_squeeze", "__esmMin", "init_util", "inferenceHandler", "inputs", "axes", "outputShape", "ShapeUtil", "node", "sum", "createSumProgramInfo", "validateInputs", "init_sum", "__esmMin", "init_glsl_source", "init_types", "inferenceHandler", "inputs", "sumProgramMetadata", "_v", "glsl", "getGlsl", "outputShape", "shaderSource", "i", "length", "j", "tile", "createTileProgramInfo", "validateInputs", "init_tile", "__esmMin", "init_operators", "init_types", "inferenceHandler", "inputs", "tileProgramMetadata", "_handler", "inputShape", "outputShape", "tileOps", "i", "rank", "shaderSource", "NUMBER_TYPES", "unsqueeze", "unsqueezeV13", "parseUnsqueezeAttributes", "validateInputs", "validateInputsV13", "init_unsqueeze", "__esmMin", "init_util", "inferenceHandler", "inputs", "axes", "outputShape", "ShapeUtil", "node", "WEBGL_OP_RESOLVE_RULES", "init_op_resolve_rules", "__esmMin", "init_batch_normalization", "init_binary_op", "init_cast", "init_concat", "init_conv", "init_conv_transpose", "init_depth_to_space", "init_flatten", "init_gather", "init_gemm", "init_image_scaler", "init_instance_normalization", "init_lrn", "init_matmul", "init_pad", "init_pool", "init_reduce", "init_reshape", "init_resize_packed", "init_shape", "init_slice", "init_softmax", "init_split", "init_squeeze", "init_sum", "init_tile", "init_transpose", "init_unary_op", "init_unsqueeze", "init_upsample", "abs", "acos", "add", "and", "asin", "atan", "averagePool", "parseAveragePoolAttributes", "batchNormalization", "parseBatchNormalizationAttributes", "cast", "parseCastAttributes", "ceil", "clip", "parseClipAttributes", "clipV11", "concat", "parseConcatAttributes", "conv", "parseConvAttributes", "convTranspose", "parseConvTransposeAttributes", "cos", "div", "identity", "depthToSpace", "parseDepthToSpaceAttributes", "equal", "elu", "parseEluAttributes", "exp", "flatten", "parseFlattenAttributes", "floor", "gather", "parseGatherAttributes", "gemm", "parseGemmAttributesV7", "parseGemmAttributesV11", "globalAveragePool", "parseGlobalAveragePoolAttributes", "globalMaxPool", "greater", "imageScaler", "parseImageScalerAttributes", "instanceNormalization", "parseInstanceNormalizationAttributes", "leakyRelu", "parseLeakyReluAttributes", "less", "lrn", "parseLrnAttributes", "log", "matMul", "parseMatMulAttributes", "maxPool", "parseMaxPoolAttributes", "mul", "neg", "not", "or", "padV2", "parsePadAttributesV2", "padV11", "parsePadAttributesV11", "pow", "pRelu", "reduceLogSum", "parseReduceAttributes", "reduceMax", "reduceMean", "reduceMin", "reduceProd", "reduceSum", "reduceLogSumSquare", "relu", "reshape", "resize", "parseResizeAttributesV10", "parseResizeAttributesV11", "shape", "sigmoid", "sin", "sliceV10", "slice", "parseSliceAttributes", "softmax", "parseSoftmaxAttributes", "softmaxV13", "parseSoftmaxAttributesV13", "split", "parseSplitAttributes", "sqrt", "squeeze", "parseSqueezeAttributes", "squeezeV13", "sub", "sum", "tan", "tanh", "tile", "transpose", "parseTransposeAttributes", "upsample", "parseUpsampleAttributesV7", "parseUpsampleAttributesV9", "unsqueeze", "parseUnsqueezeAttributes", "unsqueezeV13", "xor", "replaceInlines", "script", "inlineDefs", "match", "INLINE_FUNC_DEF_REGEX", "params", "s", "tokens", "v", "name", "regexString", "FUNC_CALL_REGEX", "regex", "type", "variable", "declLine", "newBody", "paramRedecLine", "i", "replacement", "init_glsl_function_inliner", "__esmMin", "squeezeShape", "shape", "axis", "newShape", "keptDims", "isEmptyArray", "axes", "parseAxisParam", "j", "i", "rank", "_s", "assert", "ax", "isInt", "a", "sizeFromShape", "size", "sizeToSquarishShape", "width", "PreferLogicalStrategy", "init_texture_layout_strategy", "__esmMin", "init_instrument", "init_util", "maxTextureSize", "prefs", "wh", "isPacked", "wsize", "b", "hsize", "Logger", "logShape", "_d", "d", "CoordsGlslLib", "init_glsl_coordinate_lib", "__esmMin", "init_util", "init_glsl_definitions", "init_glsl_source", "init_texture_layout_strategy", "init_utils", "GlslLib", "context", "funcName", "GlslLibRoutine", "outputLayout", "outShape", "outTexShape", "result", "floatTextureSetRGBASource", "getGlsl", "floatTextureSetRGBAFuncName", "floatTextureSetRSource", "floatTextureSetRFuncName", "_shape", "texShape", "packedTexShape", "source", "shape", "ArrayUtil", "texelsInLogicalRow", "texelsInBatch", "texelsInBatchN", "batches", "coords", "b", "rank", "strides", "i", "coordsToCompute", "coordsFromIndexSnippet", "stride", "line1", "line2", "glsl", "samplerName", "inputLayout", "generateShaderFuncNameFromInputSamplerName", "outCoordFuncName", "generateShaderFuncNameFromInputSamplerNameAtOutCoords", "name", "inShape", "texFuncSnippet", "inRank", "outRank", "broadcastDims", "BroadcastUtil", "type", "getCoordsDataType", "rankDiff", "coordsSnippet", "fields", "getGlChannels", "d", "unpackedCoordsSnippet", "_s", "output", "isInputScalar", "ShapeUtil", "isOutputScalar", "rows", "cols", "swapLastDimsSnippet", "inTexShape", "texNumR", "texNumC", "packedSampler", "valuesPerRow", "squeezedShape", "keptDims", "newInputShape", "squeezeInputShape", "params", "newInputLayout", "samplerRoutine", "getSqueezedParams", "index", "tNumR", "tNumC", "newShape", "squeezeShape", "stride0", "stride1", "routine", "revDims", "stride2", "stride3", "stride4", "xScale", "yScale", "stridesBlock", "body", "layout", "varName", "width", "height", "transpose", "EncodingGlslLib", "init_glsl_encoding_lib", "__esmMin", "init_glsl_definitions", "_EncodingGlslLib", "GlslLib", "context", "GlslLibRoutine", "endianness", "b", "a", "c", "FragColorGlslLib", "init_glsl_fragcolor_lib", "__esmMin", "init_glsl_definitions", "init_glsl_source", "GlslLib", "context", "glsl", "getGlsl", "GlslLibRoutine", "ShapeUtilsGlslLib", "init_glsl_shape_utils_lib", "__esmMin", "init_glsl_definitions", "_ShapeUtilsGlslLib", "GlslLib", "context", "outputRank", "result", "name", "i", "shape", "rank", "dimOffset", "funcName", "block", "body", "GlslLibRoutine", "strides", "stridesBlock", "shapeInit", "VecGlslLib", "init_glsl_vec_lib", "__esmMin", "init_glsl_definitions", "GlslLib", "context", "rank", "nameOp", "result", "name", "fname", "assignmentBlock", "i", "body", "GlslLibRoutine", "block", "glslRegistry", "init_glsl_registered_libs", "__esmMin", "init_glsl_coordinate_lib", "init_glsl_encoding_lib", "init_glsl_fragcolor_lib", "init_glsl_shape_utils_lib", "init_glsl_vec_lib", "EncodingGlslLib", "FragColorGlslLib", "VecGlslLib", "ShapeUtilsGlslLib", "CoordsGlslLib", "GlslPreprocessor", "init_glsl_preprocessor", "__esmMin", "init_glsl_definitions", "init_glsl_function_inliner", "init_glsl_registered_libs", "init_glsl_source", "glContext", "programInfo", "inputTextureLayouts", "outputTextureLayout", "GlslContext", "glslRegistry", "name", "lib", "map", "libName", "routinesInLib", "routine", "key", "currentNode", "GlslLibRoutineNode", "dependencies", "i", "node", "source", "getDefaultFragShaderMain", "replaceInlines", "getFragShaderPreamble", "script", "routinesIncluded", "routines", "nodes", "classAndRoutine", "TopologicalSortGlslRoutines", "samplers", "variables", "uniformLines", "sampler", "variable", "ProgramManager", "init_program_manager", "__esmMin", "init_esm", "init_instrument", "init_glsl_preprocessor", "init_glsl_source", "profiler", "glContext", "textureLayoutStrategy", "key", "artifact", "buildArtifact", "inputs", "output", "gl", "program", "err", "Logger", "a", "programInfo", "inputTextureLayouts", "outputTextureLayout", "preprocessor", "GlslPreprocessor", "fragScript", "fragShaderScript", "vertexShaderScript", "getVertexShaderSource", "env", "fragShader", "td", "width", "height", "attribLocations", "positionHandle", "textureCoordHandle", "uniformLocations", "variables", "textures", "texturePosition", "name", "type", "location", "arrayLength", "value", "v", "uniformHandle", "position", "samplers", "sampler", "variable", "reference", "TextureManager", "init_texture_manager", "__esmMin", "init_instrument", "init_texture_data_encoder", "glContext", "layoutStrategy", "profiler", "config", "dataType", "layout", "data", "usage", "textureDataType", "encoder", "width", "height", "key", "inUseTextures", "idleTextures", "texture", "Logger", "td", "channels", "dataSize", "a", "b", "dataId", "subscribers", "resolve", "tensorData", "textureData", "deleteTexture", "index", "_dataType", "WebGLSessionHandler", "init_session_handler", "__esmMin", "init_instrument", "init_opset", "init_inference_handler", "init_op_resolve_rules", "init_program_manager", "init_texture_layout_strategy", "init_texture_manager", "backend", "context", "PreferLogicalStrategy", "ProgramManager", "TextureManager", "WebGLInferenceHandler", "graph", "initializers", "v", "tensorId", "isPacked", "textureData", "Logger", "td", "node", "opsets", "op", "resolveOperator", "WEBGL_OP_RESOLVE_RULES", "linearSearchLastTrue", "arr", "i", "WebGLContext", "init_webgl_context", "__esmMin", "init_esm", "init_texture_data_encoder", "init_utils", "gl", "version", "width", "height", "encoder", "data", "texture", "buffer", "dataSize", "dataType", "channels", "positionHandle", "textureCoordHandle", "vertexShader", "fragShader", "program", "shaderSource", "shaderType", "shader", "position", "uniformHandle", "env", "error", "label", "usage", "RedFloat32DataEncoder", "RGBAFloatDataEncoder", "Uint8DataEncoder", "unit", "geometry", "fb", "internalFormat", "frameBuffer", "isComplete", "fragmentShader", "gl2", "ext", "query", "available", "disjoint", "timeElapsed", "repeatedTry", "fenceContext", "isFencePassed", "status", "resolve", "index", "x", "resolveFn", "isDoneFn", "createWebGLContext", "contextId", "context", "cache", "offscreenCanvas", "createOffscreenCanvas", "createNewWebGLContext", "canvas", "createCanvas", "gl", "contextAttributes", "ca", "WebGLContext", "err", "Logger", "init_webgl_context_factory", "__esmMin", "init_instrument", "init_webgl_context", "WebGLBackend", "init_backend_webgl", "__esmMin", "init_esm", "init_instrument", "init_session_handler", "init_webgl_context_factory", "env", "value", "createWebGLContext", "Logger", "context", "WebGLSessionHandler", "resolveBackend", "hint", "hints", "backendHint", "cache", "backendsCache", "backend", "tryLoadBackend", "backendObj", "isBackend", "init", "obj", "o", "init_backend", "__esmMin", "init_backend_webgl", "WebGLBackend", "KernelOp", "ExecutionPlan", "init_execution_plan", "__esmMin", "init_instrument", "op", "node", "graph", "ops", "profiler", "graphNodes", "i", "resolved", "input", "sessionHandler", "modelInputs", "inferenceHandler", "graphInputs", "index", "sequence", "graphValues", "rear", "thisOpIndex", "thisOp", "inputList", "inputTensors", "Logger", "t", "outputList", "output", "j", "downstreamNodes", "_output", "currentDownstreamNodeIndex", "currentDownstreamNode", "k", "outputIndex", "outputTensor", "import_onnx", "ortFbs", "Attribute", "init_attribute", "__esmMin", "init_ort_generated", "init_tensor", "init_util", "onnxruntime", "_Attribute", "attributes", "attr", "key", "type", "value", "defaultValue", "valueAndType", "attrType", "LongUtil", "arr", "numberValue", "i", "maybeLong", "Tensor", "decodeUtf8String", "ints", "strings", "tensors", "import_onnx", "ortFbs", "Graph", "Value", "Node", "GraphImpl", "init_graph", "__esmMin", "init_attribute", "init_ort_generated", "init_tensor", "init_util", "onnxruntime", "graphProto", "initializer", "valueInfo", "ProtoUtil", "_nodeProto", "name", "Attribute", "graph", "graphInitializer", "dataIndices", "nodesIndices", "inputValueNames", "currentIndex", "index", "value", "Tensor", "nodeProto", "pick", "node", "output", "dataIndex", "input", "inputName", "j", "type", "shape", "dims", "k", "LongUtil", "outputName", "starters", "i", "nodesStack", "nodesState", "nodeIndex", "outgoingEdgeIndex", "data", "downstreamNodeIndex", "offset", "newIndices", "nodePossition", "ind", "currentData", "inputValueIndex", "outputValueIndex", "nodesConsumingOutput", "delIndex", "replaceIndex", "n", "next", "child", "MIN_CLIP", "MAX_CLIP", "import_onnx", "ortFbs", "Model", "init_model", "__esmMin", "init_flatbuffers", "init_graph", "init_ort_generated", "init_util", "onnxruntime", "buf", "graphInitializer", "isOrtFormat", "onnxError", "e", "modelProto", "LongUtil", "Graph", "fb", "flatbuffers", "ortModel", "i", "opsetId", "Session", "init_session", "__esmMin", "init_backend", "init_execution_plan", "init_instrument", "init_model", "config", "Profiler", "arg", "byteOffset", "length", "backend", "resolveBackend", "Model", "isOrtFormat", "buf", "arr", "modelProtoBlob", "graphInitializer", "ExecutionPlan", "inputs", "inputTensors", "outputTensors", "modelInputNames", "sortedInputs", "sortedInputsIndex", "tensor", "modelInputIndices", "modelValues", "graphInputDims", "i", "graphInput", "graphInputTypes", "givenInputs", "expectedType", "actualType", "noneDimSupported", "expectedDims", "actualDims", "modelOutputNames", "output", "graph", "nodes", "OnnxjsSessionHandler", "init_session_handler_inference", "__esmMin", "init_esm", "init_tensor", "session", "feeds", "_fetches", "_options", "inputMap", "name", "feed", "Tensor", "outputMap", "output", "tensor", "backend_onnxjs_exports", "__export", "onnxjsBackend", "OnnxjsBackend", "init_backend_onnxjs", "__esmMin", "init_session", "init_session_handler_inference", "pathOrBuffer", "options", "session", "Session", "OnnxjsSessionHandler", "init_wasm_utils_env", "__esmMin", "main_exports", "__export", "main_default", "WORKER_NAME", "isProxyWorker", "init_main", "__esmMin", "init_wasm_core_impl", "init_wasm_factory", "init_wasm_utils_import", "ev", "type", "message", "initializeWebAssembly", "initRuntime", "err", "epName", "env", "initEp", "buffer", "bufferData", "copyFromExternalBuffer", "model", "options", "createSession", "sessionMetadata", "releaseSession", "sessionId", "inputIndices", "inputs", "outputIndices", "run", "outputs", "o", "extractTransferableBuffers", "endProfiling", "urlOverride", "scriptSrc", "ort_wasm_simd_threaded_jsep_exports", "__export", "ort_wasm_simd_threaded_jsep_default", "e", "r", "init_ort_wasm_simd_threaded_jsep", "__esmMin", "t", "x", "R", "L", "H", "a", "D", "F", "P", "B", "u", "I", "f", "$", "c", "d", "b", "m", "p", "h", "g", "v", "n", "zr", "o", "i", "Qr", "y", "w", "A", "_", "C", "O", "j", "T", "S", "W", "Pn", "E", "_n", "Rr", "Te", "_e", "M", "gn", "Se", "yn", "Tn", "Hr", "Cn", "oe", "N", "k", "U", "G", "Y", "z", "V", "q", "J", "X", "K", "Q", "Z", "ee", "re", "te", "ne", "ae", "ue", "se", "Ee", "xe", "He", "De", "Ie", "Ue", "Ge", "$e", "Ye", "Le", "ze", "Ve", "qe", "Je", "Xe", "Ze", "ir", "ur", "hr", "vr", "yr", "wr", "Ar", "Er", "Mr", "xr", "Nr", "Dr", "Pr", "Br", "Ir", "$r", "rt", "nt", "it", "cr", "ut", "dt", "bt", "mt", "pt", "ht", "gt", "vt", "yt", "wt", "At", "_t", "Ct", "St", "Wt", "Et", "Mt", "xt", "Rt", "Ht", "Dt", "Ft", "Pt", "It", "Ut", "Bt", "Gt", "$t", "Yt", "qt", "Jt", "Zt", "en", "he", "rn", "tn", "nn", "on", "me", "ln", "cn", "ie", "Re", "s", "l", "et", "fe", "le", "ce", "ge", "Oe", "Ce", "ve", "we", "de", "be", "xn", "Mn", "On", "En", "pe", "ye", "Ae", "jn", "je", "Wn", "Nn", "We", "Me", "Ne", "ke", "Fe", "Pe", "Be", "Ke", "Qe", "er", "rr", "tr", "nr", "ar", "or", "sr", "fr", "lr", "dr", "br", "mr", "pr", "gr", "An", "wn", "_r", "Cr", "Or", "jr", "Tr", "Sr", "Wr", "kr", "Sn", "Fr", "mn", "Ur", "hn", "Gr", "Yr", "Lr", "Vr", "qr", "Jr", "Xr", "Kr", "Zr", "Hn", "pn", "kn", "Dn", "tt", "at", "ot", "st", "ft", "lt", "ct", "Ot", "jt", "Tt", "Nt", "kt", "Lt", "zt", "Vt", "Xt", "Kt", "Qt", "an", "sn", "un", "fn", "dn", "bn", "Rn", "vn", "Fn", "scriptSrc", "origin", "isSameOrigin", "preload", "createProxyWorker", "importProxyWorker", "embeddedWasmModule", "importWasmModule", "init_wasm_utils_import", "__esmMin", "init_wasm_utils_env", "filename", "prefixOverride", "baseUrl", "absoluteUrl", "blob", "url", "urlOverride", "isMultiThreaded", "wasm", "initialized", "initializing", "aborted", "isMultiThreadSupported", "isSimdSupported", "initializeWebAssembly", "getInstance", "init_wasm_factory", "__esmMin", "init_wasm_utils_import", "flags", "timeout", "numThreads", "multiThreadSupported", "wasmPaths", "wasmPrefixOverride", "mjsPathOverrideFlag", "mjsPathOverride", "wasmPathOverrideFlag", "wasmPathOverride", "objectUrl", "ortWasmFactory", "importWasmModule", "isTimeout", "tasks", "resolve", "reject", "config", "fileName", "scriptDirectory", "module", "what", "allocWasmString", "iterateExtraOptions", "checkLastError", "init_wasm_utils", "__esmMin", "init_wasm_factory", "data", "allocs", "wasm", "getInstance", "dataLength", "dataOffset", "options", "prefix", "seen", "handler", "key", "value", "name", "message", "stack", "paramsOffset", "errorCode", "errorMessagePointer", "errorMessage", "setRunOptions", "init_run_options", "__esmMin", "init_wasm_factory", "init_wasm_utils", "options", "wasm", "getInstance", "runOptionsHandle", "allocs", "runOptions", "tagDataOffset", "allocWasmString", "checkLastError", "iterateExtraOptions", "key", "value", "keyDataOffset", "valueDataOffset", "e", "alloc", "getGraphOptimzationLevel", "getExecutionMode", "appendDefaultOptions", "setExecutionProviders", "setSessionOptions", "init_session_options", "__esmMin", "init_wasm_factory", "init_wasm_utils", "graphOptimizationLevel", "executionMode", "options", "session", "ep", "sessionOptionsHandle", "executionProviders", "allocs", "epName", "deviceType", "keyDataOffset", "allocWasmString", "valueDataOffset", "getInstance", "checkLastError", "webgpuOptions", "epNameDataOffset", "wasm", "sessionOptions", "logIdDataOffset", "logSeverityLevel", "logVerbosityLevel", "optimizedModelFilePathOffset", "name", "value", "nameOffset", "iterateExtraOptions", "key", "e", "alloc", "tensorDataTypeStringToEnum", "tensorDataTypeEnumToString", "getTensorElementSize", "tensorTypeToTypedArrayConstructor", "logLevelStringToEnum", "isGpuBufferSupportedType", "dataLocationStringToEnum", "init_wasm_common", "__esmMin", "type", "typeProto", "dateType", "logLevel", "location", "loadFile", "init_wasm_utils_load_file", "__esmMin", "init_wasm_utils_env", "file", "readFile", "createReadStream", "stream", "chunks", "chunk", "response", "contentLengthHeader", "fileSize", "reader", "buffer", "e", "pages", "offset", "done", "value", "chunkSize", "logLevelPrefix", "doLog", "configLogLevel", "debug", "configureLogger", "LOG", "LOG_DEBUG", "init_log", "__esmMin", "init_wasm_common", "level", "message", "$configLogLevel", "$debug", "logLevel", "msg", "messageLevel", "logLevelStringToEnum", "configLevel", "args", "createView", "init_tensor_view", "__esmMin", "init_wasm_common", "dataBuffer", "type", "tensorTypeToTypedArrayConstructor", "init_types", "__esmMin", "bucketFreelist", "bucketArr", "calcNormalizedBufferSize", "calcBucketBufferSize", "guid", "createNewGpuDataId", "downloadGpuData", "GpuDataManagerImpl", "createGpuDataManager", "init_gpu_data_manager", "__esmMin", "init_log", "init_types", "size", "idx", "sizeForBucket", "backend", "gpuBuffer", "originalSize", "getTargetBuffer", "bufferSize", "gpuReadBuffer", "commandEncoder", "arrayBuffer", "targetBuffer", "key", "id", "data", "srcArrayBuffer", "srcOffset", "srcLength", "gpuDataCache", "gpuBufferForUploading", "LOG_DEBUG", "sourceId", "destinationId", "sourceGpuDataCache", "destinationGpuDataCache", "buffer", "previousBuffer", "usage", "isStorage", "isUniform", "buffers", "gpuData", "cachedData", "maxInFreeList", "freelist", "capturedBuffers", "storage", "sessionId", "pendingBuffers", "args", "AttributeWithCacheKeyImpl", "createAttributeWithCacheKey", "init_attribute_with_cache_key", "__esmMin", "attribute", "name", "MatMulUtil", "BroadcastUtil", "ShapeUtil", "PoolConvUtil", "GemmUtil", "MIN_CLIP", "MAX_CLIP", "init_util", "__esmMin", "a", "b", "adims", "bdims", "isMatMul", "arank", "brank", "crank", "cdims", "cShapeMatMul", "i", "aLen", "bLen", "max", "shape", "finalShape", "inputRank", "finalRank", "_ShapeUtil", "dims", "size", "rank", "newDims", "axis", "start", "end", "strides", "tensorRank", "axes", "x", "perm", "v", "pad", "shape1", "shape2", "_PoolConvUtil", "isGlobalOperator", "inputDims", "kernelShape", "dilations", "pads", "dim", "isChannelLast", "autoPad", "outputDims", "filterDims", "inSize", "stride", "dilation", "kernel", "padHeadIndex", "padTailIndex", "dkernel", "padNeeded", "leftShape", "transLeft", "rightShape", "transRight", "biasShape", "M", "K", "N", "kDim", "WORKGROUP_SIZE", "getWgslMappedType", "tensorTypeToWsglStorageType", "tensorTypeToWsglValueType", "createTensorShapeVariables", "getMaxComponents", "fillVector", "castToF32", "sumVector", "getElementAt", "createIndicesHelper", "inputVariable", "outputVariable", "internalVariable", "ShaderHelperImpl", "createShaderHelper", "getBroadcastDims", "init_common", "__esmMin", "init_wasm_common", "init_util", "type", "components", "mappedType", "dims", "programUniforms", "dim", "ShapeUtil", "size", "dataType", "value", "name", "index", "length", "tensorType", "shapeOrRank", "usage", "useUniform", "rank", "rankIdentity", "indicesType", "valueType", "storageType", "normalizeDim", "implementationUsed", "uniformPrefix", "shape", "strides", "o2iSnippet", "i", "offsetToIndicesImplementation", "offsetToIndices", "varOffset", "offsets", "indicesToOffsetImplementation", "indicesToOffset", "varIndices", "indices", "init", "indicesGet", "idx", "indicesSet", "broadcastedIndicesToOffsetImplementation", "broadcastedIndicesToOffset", "output", "implKey", "setByOffset", "offset", "getByOffset", "getByIndicesImplementation", "getImplementation", "functionParams", "dimsParams", "get", "normalizedIndices", "getByIndices", "setByIndicesImplementation", "setImplementation", "impls", "needShapeStrides", "impl", "indicesAndValue", "normalizedDispatchGroup", "limits", "workgroupSize", "workgroupSizeX", "workgroupSizeY", "workgroupSizeZ", "is1DimensionDispatch", "paramList", "globalIdxDefinition", "variable", "bindingIndex", "access", "variables", "v", "additionalUniforms", "uniformSnippets", "typeTemp", "uniformWgslTypeToDataType", "u", "dispatchGroup", "inShape", "outShape", "inRank", "a", "validateInputs", "getAdjustedPerm", "getOutputShape", "permFunctionBody", "createTransposeProgramInfo", "transpose", "parseTransposeAttributes", "init_transpose", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "inputRank", "perm", "inputShape", "ShapeUtil", "rank", "input", "output", "reverseFunc", "inputTensor", "permAttr", "inputDataType", "outputShape", "outputVariable", "inputVariable", "getShaderSource", "wgslType", "workgroupSize", "shaderHelper", "outputSize", "createTensorShapeVariables", "context", "attributes", "createAttributeWithCacheKey", "reduceOps", "reduceSharedOps", "reduceInitValues", "reduceOutputValues", "getInnerMostAxes", "computeOutAndReduceShapes", "expandShapeToKeepDim", "areAxesInnerMostDims", "getAxesPermutation", "createReduceSharedProgramInfo", "reduceCommon", "reduceMeanShared", "reduceL1Shared", "reduceL2Shared", "reduceLogSumExpShared", "reduceMaxShared", "reduceMinShared", "reduceProdShared", "reduceSumShared", "reduceSumSquareShared", "reduceLogSumShared", "init_reduce_shared", "__esmMin", "init_wasm_common", "init_util", "init_common", "init_reduce", "init_transpose", "numInnerAxes", "rank", "res", "i", "shape", "axes", "outputShape", "dim", "reduceShape", "expandShape", "shapeIdx", "axis", "name", "shaderCache", "inputs", "reduceType", "outputDataType", "inputShape", "outputSize", "ShapeUtil", "reduceSize", "input", "inputVariable", "output", "outputVariable", "workgroupSize", "sharedMemorySnippet", "shaderHelper", "context", "attributes", "updatedAttributes", "createReduceAttributesFromInputs", "updatedAxes", "_dim", "normalizeAxes", "permutedAxes", "createTransposeProgramInfo", "finalOutputShape", "validateInputs", "noOp", "createReduceProgramInfo", "createReduceAttributesFromInputs", "runReduceProgram", "reduceLogSumNaive", "reduceL1Naive", "reduceL2Naive", "reduceLogSumExpNaive", "reduceMaxNaive", "reduceMeanNaive", "reduceMinNaive", "reduceProdNaive", "reduceSumNaive", "reduceSumSquareNaive", "useNaiveReduceMethod", "reduceMean", "reduceL1", "reduceL2", "reduceLogSumExp", "reduceMax", "reduceMin", "reduceProd", "reduceSum", "reduceSumSquare", "reduceLogSum", "init_reduce", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "init_reduce_shared", "inputs", "input", "name", "shaderCache", "reduceOp", "axesInput", "outputDataType", "keepDims", "noopWithEmptyAxes", "outputShape", "inputShape", "inputRank", "axes", "ShapeUtil", "reduceOnAllAxes", "d", "i", "outputRank", "outputSize", "shaderHelper", "idxCopy", "inputVariable", "output", "outputVariable", "ops", "reduceOps", "k", "l", "createTensorShapeVariables", "attributes", "v", "createAttributeWithCacheKey", "context", "updatedAttributes", "_output", "idxZero", "size", "shape", "reduceSize", "dim", "reduceMeanShared", "reduceL1Shared", "reduceL2Shared", "reduceLogSumExpShared", "reduceMaxShared", "reduceMinShared", "reduceProdShared", "reduceSumShared", "reduceSumSquareShared", "reduceLogSumShared", "validateInputs", "argMin", "argMax", "parseArgMinMaxAttributes", "init_argminmax", "__esmMin", "init_wasm_common", "init_attribute_with_cache_key", "init_reduce", "inputs", "context", "attributes", "argMinMaxOp", "input", "output", "axes", "idxZero", "k", "createReduceProgramInfo", "createAttributeWithCacheKey", "validateAttentionInputs", "createInPlaceSoftmaxProgramInfo", "createAttentionProbsProgramInfo", "createVxAttentionScoreProgramInfo", "applyAttention", "prepare", "attention", "init_attention", "__esmMin", "init_wasm_common", "init_types", "init_common", "inputs", "attributes", "input", "weights", "bias", "maskIndex", "past", "relativePositionBias", "batchSize", "sequenceLength", "inputHiddenSize", "qHiddenSize", "kHiddenSize", "vHiddenSize", "sz", "kvSequenceLength", "pastSequenceLength", "totalSequenceLength", "maxSequenceLength", "maskType", "_context", "d", "components", "getMaxComponents", "WG", "dComp", "elementsPerThread", "programUniforms", "dataType", "tensorTypeToWsglStorageType", "f32Type", "tensorTypeToWsglValueType", "getShaderSource", "shaderHelper", "inputHelper", "outputVariable", "uniforms", "context", "q", "key", "pastKey", "parameters", "probsShape", "presentKey", "presentKeyShape", "alpha", "vectorizedHeadSize", "TILE_SIZE", "dispatch", "inputDependencies", "outputs", "qInput", "inputVariable", "kInput", "inputVars", "pastKeyInput", "output", "outputVars", "probs", "v", "pastValue", "params", "nReps", "repeatedVHiddenSize", "presentValue", "presentValueShape", "outputShape", "probsHelper", "vHelper", "k", "_maskIndex", "_past", "outputCount", "inputsK", "inputsV", "M", "K", "N", "outputQ", "outputK", "outputV", "weight", "validateInputs", "createBatchNormInferenceProgramInfo", "parseBatchNormAttributes", "batchNorm", "init_batch_norm", "__esmMin", "init_esm", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "checkShapeEqual", "actual", "expected", "message", "r", "v", "i", "shape", "epsilon", "spatial", "format", "yShape", "components", "getMaxComponents", "cComponents", "outputSize", "ShapeUtil", "useShapesUniforms", "shapeOrRank", "x", "inputVariable", "scale", "bias", "inputMean", "inputVar", "y", "outputVariable", "calcCOffset", "cOffset", "getInferenceModeShaderSource", "helper", "createTensorShapeVariables", "createAttributeWithCacheKey", "context", "outputCount", "updatedAttributes", "env", "validateInputs", "createBiasAddProgramInfo", "biasAdd", "init_bias_add", "__esmMin", "init_util", "init_common", "inputs", "outputShape", "channels", "outputSize", "ShapeUtil", "dataType", "input", "inputVariable", "bias", "residual", "output", "outputVariable", "shaderHelper", "context", "createElementwiseProgramShader", "createElementwiseProgramInfo", "abs", "acos", "acosh", "asin", "asinh", "atan", "atanh", "parseCastAttributes", "cast", "generateClipAttributesFromInputs", "clip", "ceil", "cos", "cosh", "parseAlphaAttributes", "elu", "erfImpl", "erf", "exp", "floor", "gelu", "leakyRelu", "not", "neg", "reciprocal", "relu", "sigmoid", "parseHardSigmoidAttributes", "hardSigmoid", "sin", "sinh", "sqrt", "tan", "tanhExpression", "tanh", "fastGeluImpl", "fastGeluExpression", "fastGelu", "thresholdedRelu", "log", "quickGeluImpl", "quickGeluExpression", "quickgelu", "init_unary_op", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "shaderHelper", "datasize", "inputDataType", "outputDataType", "funcCall", "additionalImplementation", "vecSize", "expression", "input", "inputVariable", "output", "outputVariable", "name", "cacheKey", "ShapeUtil", "inputTensors", "context", "attributes", "createAttributeWithCacheKey", "func", "inputs", "min", "MIN_CLIP", "max", "MAX_CLIP", "clipAttributes", "dataType", "tensorTypeToWsglValueType", "a", "varType", "x", "alpha", "dType", "validateInputs", "createBiasSplitGeluProgramInfo", "biasSplitGelu", "init_bias_split_gelu", "__esmMin", "init_util", "init_common", "init_unary_op", "inputs", "outputShape", "input", "inputVariable", "bias", "output", "outputVariable", "outputSize", "ShapeUtil", "dataType", "tensorTypeToWsglStorageType", "shaderHelper", "erfImpl", "context", "createBinaryOpProgramShader", "createBinaryOpProgramInfo", "runBinaryOp", "add", "div", "equal", "mul", "pow", "sub", "greater", "less", "greaterOrEqual", "lessOrEqual", "init_binary_op", "__esmMin", "init_wasm_common", "init_util", "init_common", "shaderHelper", "dimsA", "dimsB", "dimsOutput", "vectorize", "doBroadcast", "sharedDimensionDivisibleBy4", "funcCall", "typeA", "typeB", "typeOutput", "additionalImplementation", "expressionScalar", "expressionVector", "a", "b", "output", "outputVariable", "inputVariable", "assignment", "isAOneElement", "ShapeUtil", "isBOneElement", "aLastDimDivisibleBy4", "bLastDimDivisibleBy4", "singleAssignment", "resStr", "x", "typeCast", "expressionA", "expressionB", "name", "cacheKey", "outputDataType", "isBroadcast", "outputShape", "outputSize", "cacheKeyAux", "calculatedShape", "BroadcastUtil", "sharedDimension", "i", "dimA", "dimB", "createTensorShapeVariables", "context", "type", "validateInputs", "calculateInputIndexImpl", "assignOutputData", "createConcatProgramInfo", "concat", "parseConcatAttributes", "init_concat", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "axis", "referenceIndex", "referenceInput", "inputType", "inputRank", "input", "i", "dim", "numberOfTensors", "sizeInConcatAxisStr", "output", "codeLines", "returnSnippet", "adjustedAxis", "outputShape", "dataType", "outputSize", "ShapeUtil", "sizeInConcatAxis", "inputVars", "previousSum", "inputDependencies", "inputRanks", "programUniforms", "inputVariable", "createTensorShapeVariables", "outputVariable", "indicesAxis", "getShaderSource", "shaderHelper", "context", "attributes", "inputShape", "sum", "nonEmptyInputs", "createAttributeWithCacheKey", "getActivationSnippet", "appendActivationUniformsData", "appendActivationUniforms", "parseInternalActivationAttributes", "init_fuse_utils", "__esmMin", "init_wasm_common", "init_util", "attributes", "valueType", "baseType", "programUniform", "uniforms", "activation", "alpha", "beta", "clipMin", "clipMax", "MIN_CLIP", "MAX_CLIP", "typeSnippet", "biasSnippet", "init_activation_util", "__esmMin", "component", "dataType", "hasBias", "utilFunctions", "init_conv_util", "__esmMin", "strideStr", "writeDataToSubAVec4Snippet", "calculateResultSnippet", "makeMatMulPackedVec4Source", "writeDataToSubASnippet", "readDataFromSubASnippet", "makeMatMulPackedSource", "matMulReadWriteFnSource", "createMatmulProgramInfo", "init_matmul_packed_webgpu", "__esmMin", "init_wasm_common", "init_util", "init_common", "init_fuse_utils", "init_activation_util", "transpose", "batchDims", "transposeA", "innerElementSize", "workPerThread", "workgroupSize", "type", "tileInner", "splitK", "splitedDimInner", "tileAOuter", "tileBOuter", "tileAWidth", "tileAHight", "rowPerThreadB", "sequentialAccessByThreads", "rowPerThreadA", "colPerThreadA", "matmulSnippet", "component", "hasBias", "applyActivation", "variables", "batchShapes", "isChannelsLast", "batchAShape", "batchBShape", "batchShape", "batchVariable", "aVariable", "bVariable", "outputVariable", "broadCastADims", "getBroadcastDims", "broadCastBDims", "dataType", "tensorTypeToWsglStorageType", "getAIndices", "aRank", "batchRank", "resStr", "i", "j", "getBIndices", "bRank", "typeSnippet", "inputs", "activationAttributes", "outputShape", "reshapedOutputShape", "aShape", "bShape", "outerDimsA", "outerDimsB", "outerDims", "batchSize", "ShapeUtil", "dimAOuter", "dimInner", "dimBOuter", "isVec4", "elementsPerThread", "dispatch", "components", "aShapeTemp", "bShapeTemp", "outputShapeTemp", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "internalVariable", "A", "inputVariable", "B", "output", "inputVariables", "biasComponents", "uniforms", "appendActivationUniforms", "baseType", "getActivationSnippet", "declareFunctions", "conv2dCommonSnippet", "createConv2DMatMulProgramInfo", "init_conv2d_mm_webgpu", "__esmMin", "init_wasm_common", "init_log", "init_common", "init_fuse_utils", "init_activation_util", "init_conv_util", "init_matmul_packed_webgpu", "isChannelsLast", "fitAOuter", "fitBOuter", "fitInner", "addBias", "attributes", "innerElementSizeX", "innerElementSizeW", "innerElementSize", "dataType", "getXSnippet", "getWSnippet", "coordASnippet", "coordResSnippet", "xHeight", "xWidth", "row", "col", "readXSnippet", "typeSnippet", "sampleX", "sampleW", "resType", "aType", "bType", "applyActivation", "getActivationSnippet", "biasSnippet", "inputs", "outputShape", "dimAOuter", "dimBOuter", "dimInner", "hasBias", "sequentialAccessByThreads", "inChannels", "batchSize", "outWidth", "outHeight", "outChannels", "isVec4", "dispatchX", "dispatchY", "workGroupSize", "elementsPerThread", "dispatch", "LOG_DEBUG", "tileAOuter", "tileBOuter", "tileInner", "elementsSize", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "uniforms", "appendActivationUniforms", "components", "t", "tensorTypeToWsglStorageType", "declareFunctions", "x", "inputVariable", "w", "inputVariables", "output", "outputVariable", "bias", "utilFunctions", "makeMatMulPackedVec4Source", "makeMatMulPackedSource", "arrayProduct", "parse3TupleParam", "getEffectiveFilterSize", "computeDefaultPad", "computeOutputShape4D", "get3DPadAndOutInfo", "computeConv3DInfo", "createConv3DNaiveProgramInfo", "init_conv3d_naive_webgpu", "__esmMin", "init_wasm_common", "init_log", "init_util", "init_common", "arr", "product", "i", "param", "filterSize", "dilation", "inputShape", "fieldSize", "stride", "effectiveFieldSize", "inShape", "filterShape", "outChannels", "strides", "zeroPad", "outShape", "index", "pad", "inDepth", "inHeight", "inWidth", "strideDepth", "strideHeight", "strideWidth", "filterDepth", "filterHeight", "filterWidth", "padInfo", "outDepth", "outHeight", "outWidth", "val", "_", "padAlongDepth", "padAlongHeight", "padAlongWidth", "front", "back", "top", "bottom", "left", "right", "dilations", "depthwise", "dataFormat", "batchSize", "inChannels", "filterChannels", "dilationDepth", "dilationHeight", "dilationWidth", "effectiveFilterDepth", "effectiveFilterHeight", "effectiveFilterWidth", "inputs", "attributes", "outputShape", "filterDims", "pads", "isChannelsLast", "isVec4", "workGroupSize", "dispatchLayout", "dispatch", "d", "LOG_DEBUG", "innerElementSize", "outputSize", "ShapeUtil", "programUniforms", "createTensorShapeVariables", "inputDependencies", "hasBias", "getShaderSource", "shaderHelper", "uniforms", "components", "t", "tensorTypeToWsglStorageType", "x", "inputVariable", "w", "inputVariables", "output", "outputVariable", "declareFunctions", "bias", "getElementAt", "createGroupedConvProgramInfo", "createGroupedConvVectorizeProgramInfo", "init_conv_grouped", "__esmMin", "init_wasm_common", "init_util", "init_common", "init_conv", "init_fuse_utils", "inputs", "attributes", "squeezeOutputShapeFunction", "hasBias", "processBias", "xShape", "wShape", "outputChannelsPerGroup", "isChannelLast", "outputShape", "calculateOutputShape", "outputSize", "ShapeUtil", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "output", "outputVariable", "baseType", "tensorTypeToWsglStorageType", "applyActivation", "getActivationSnippet", "x", "inputVariable", "w", "inputVars", "uniforms", "appendActivationUniforms", "components", "getMaxComponents", "outputNumber", "outputShapeInShader", "xNumber", "createNaiveMatmulProgramInfo", "validateInputs", "matMul", "init_matmul", "__esmMin", "init_wasm_common", "init_util", "init_matmul_packed_webgpu", "init_common", "init_fuse_utils", "inputs", "activationAttributes", "outputShape", "reshapedOutputShape", "isChannelsLast", "aShape", "bShape", "M", "N", "K", "components", "getMaxComponents", "aComponents", "outputNumber", "outputSize", "ShapeUtil", "hasBias", "outerDims", "outputShapeInShader", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "batchDims", "internalVariable", "a", "inputVariable", "b", "output", "outputVariable", "baseType", "tensorTypeToWsglStorageType", "applyActivation", "getActivationSnippet", "inputVariables", "processBias", "biasComponents", "outerDimsA", "outerDimsB", "broadCastADims", "getBroadcastDims", "broadCastBDims", "uniforms", "appendActivationUniforms", "getIndices", "variable", "broadCastDims", "rank", "name", "batchRank", "resStr", "i", "j", "calcResult", "calcStr", "context", "BroadcastUtil", "createMatmulProgramInfo", "calculateOutputShape", "weightTransposeAttribute", "validateInputs", "getAdjustedConvAttributes", "parseConvAttributes", "conv2d", "conv1d", "conv3d", "conv", "init_conv", "__esmMin", "init_util", "init_conv2d_mm_webgpu", "init_conv3d_naive_webgpu", "init_matmul_packed_webgpu", "init_conv_grouped", "init_fuse_utils", "init_matmul", "init_transpose", "inputShape", "kernelShape", "dilations", "adjustPads", "strides", "isChannelLast", "batchSize", "inputSpatialShape", "spatialRank", "outChannels", "dilatedKernelShape", "v", "i", "outputShape", "inputs", "attributes", "dataChannel", "filterInChannel", "pads", "PoolConvUtil", "newAttributes", "activationAttributes", "parseInternalActivationAttributes", "format", "autoPad", "group", "wIsConst", "context", "adjustedAttributes", "isChannelsLast", "transposedWeight", "createTransposeProgramInfo", "convInputs", "createGroupedConvVectorizeProgramInfo", "createGroupedConvProgramInfo", "hasBias", "inputHeight", "inputWidth", "inputChannels", "weightHeight", "weightWidth", "outHeight", "outWidth", "sameSize", "batch", "xReshaped", "wReshaped", "matmulOutputShape", "matmulInputs", "sharedDim", "N", "K", "createNaiveMatmulProgramInfo", "createMatmulProgramInfo", "sequentialAccessByThreads", "dimAOuter", "dimBOuter", "dimInner", "createConv2DMatMulProgramInfo", "convInfo", "computeConv3DInfo", "createConv3DNaiveProgramInfo", "conv2dTransposeCommonSnippet", "createConv2DTransposeMatMulProgramInfo", "init_conv_backprop_mm_webgpu", "__esmMin", "init_wasm_common", "init_log", "init_common", "init_fuse_utils", "init_activation_util", "init_conv_util", "init_matmul_packed_webgpu", "isChannelsLast", "addBias", "attributes", "type", "innerElementSize", "getWSnippet", "coordASnippet", "coordResSnippet", "xHeight", "xWidth", "row", "col", "readASnippet", "sampleA", "sampleW", "applyActivation", "getActivationSnippet", "biasSnippet", "inputs", "outputShape", "dimAOuter", "dimBOuter", "dimInner", "hasBias", "sequentialAccessByThreads", "inChannels", "batchSize", "outWidth", "outHeight", "outChannels", "isVec4", "dispatchX", "dispatchY", "workGroupSize", "elementsPerThread", "dispatch", "LOG_DEBUG", "tileInner", "components", "filterDims", "effectiveFilterDims", "pads", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "x", "inputVariable", "w", "output", "outputVariable", "inputVariables", "declareFunctions", "bias", "uniforms", "appendActivationUniforms", "elemType", "tensorTypeToWsglStorageType", "utilFunctions", "makeMatMulPackedVec4Source", "makeMatMulPackedSource", "createConvTranspose2DOpProgramShaderSource", "createConvTranspose2DProgramInfo", "init_conv_backprop_webgpu", "__esmMin", "init_wasm_common", "init_log", "init_util", "init_common", "shaderHelper", "inputs", "outputShape", "hasBias", "is1DimensionDispatch", "isVec4", "dataType", "uniforms", "isChannelsLast", "rowDim", "colDim", "channelDim", "workPerThread", "declareFunctions", "components", "w", "inputVariable", "dy", "inputVariables", "output", "outputVariable", "codeSnippet4", "codeSnippet", "attributes", "squeezeOutputShapeFunction", "outputSize", "ShapeUtil", "dispatch", "LOG_DEBUG", "inputDependencies", "strides", "filterDims", "dilations", "effectiveFilterDims", "pads", "group", "wShape", "inputChannelsPerGroup", "outputChannelsPerGroup", "programUniforms", "createTensorShapeVariables", "getShaderSource", "tensorTypeToWsglStorageType", "computeTotalPad", "distributePadding", "calculateOutputShapeAndPads", "getAdjustedConvTransposeAttributes", "parseConvTransposeAttributes", "validateInputs", "weightTransposePerm", "convTranspose2d", "convTranspose1d", "convTranspose", "init_conv_transpose", "__esmMin", "init_conv_backprop_mm_webgpu", "init_conv_backprop_webgpu", "init_fuse_utils", "init_transpose", "inDim", "stride", "adj", "kernel", "dilation", "outSize", "totalPad", "autoPad", "pads", "head", "tail", "smallPad", "inputShape", "kernelShape", "dilations", "group", "strides", "isChannelLast", "outputPadding", "outputShape", "spatialRank", "updateOutputShape", "i", "batchSize", "outChannels", "j", "inSize", "attributes", "inputs", "a", "b", "isChannelsLast", "newAttributes", "activationAttributes", "parseInternalActivationAttributes", "format", "wIsConst", "dataChannel", "filterInChannel", "featureMaps", "context", "adjustedAttributes", "inputChannels", "createConvTranspose2DProgramInfo", "outHeight", "outWidth", "weightHeight", "weightWidth", "dimAOuter", "dimBOuter", "dimInner", "sequentialAccessByThreads", "transposedWeight", "createTransposeProgramInfo", "convTransposeInputs", "hasBias", "createConv2DTransposeMatMulProgramInfo", "createCumsumProgramInfo", "cumsum", "parseCumSumAttributes", "init_cumsum", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputType", "inputShape", "axisInput", "attributes", "outputSize", "ShapeUtil", "rank", "input", "inputVariable", "output", "outputVariable", "axisValue", "axis", "getShaderSource", "shaderHelper", "index", "max", "getElementAt", "lowerLimit", "upperLimit", "createTensorShapeVariables", "context", "exclusive", "reverse", "createAttributeWithCacheKey", "validateInputs", "permFunctionBody", "createDepthToSpaceProgramInfo", "depthToSpace", "parseDepthToSpaceAttributes", "init_depth_to_space", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "perm", "rank", "input", "output", "reverseFunc", "inputTensor", "attributes", "h", "w", "c", "shape", "isChannelLast", "blocksize", "isDCRmode", "reshapedInputTensor", "reshapedInputRank", "inputDataType", "reshapedInput", "inputVariable", "permedOutput", "outputVariable", "getShaderSource", "shaderHelper", "outputShape", "outputSize", "ShapeUtil", "shapeBeforePerm", "shapeAfterPerm", "createTensorShapeVariables", "context", "createAttributeWithCacheKey", "symbolPattern", "termPattern", "termPatternOnly", "lhsPattern", "lhsPatternOnly", "EinsumTerm", "EinsumEquation", "appendMax", "createEinsumProgramInfo", "einsum", "parseEinsumAttributes", "init_einsum", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputIndex", "symbol", "index", "value", "inputs", "equation", "lhs", "rhs", "inputTerm", "dims", "einsumTerm", "sym", "info", "dimValue", "term", "isInput", "rank", "ellipsis", "ellipsisDims", "nextDim", "indexSymbols", "i", "ellipsisDimLength", "j", "name", "inputShapes", "dataType", "einsumEquation", "outputShape", "inputVars", "inputVariable", "outputSize", "ShapeUtil", "output", "outputVariable", "uniformsSymbols", "getShaderSource", "shaderHelper", "idxCopy", "initProd", "initSum", "updateSum", "reduceOpsSetIndices", "reduceOpsLoopHeaders", "reduceOpsLoopFooters", "reduceOpCompute", "isReduceOpsWithoutLoop", "outputIndex", "indices", "reduceOps", "inputVar", "_var", "programUniformsInit", "programUniforms", "_", "createTensorShapeVariables", "acc", "inputProgramUniforms", "context", "attributes", "input", "createAttributeWithCacheKey", "validateInputs", "getAdjustedShape", "calculateOutputShape", "createExpandProgramInfo", "expand", "init_expand", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "inputShape", "shape", "shapeIndex", "inputShapeIndex", "shape1", "shape2", "diff", "i", "outputShape", "dataType", "components", "outputSize", "ShapeUtil", "getShaderSource", "shaderHelper", "input", "inputVariable", "output", "outputVariable", "assignment", "singleAssignment", "resStr", "x", "typeCast", "programUniforms", "createTensorShapeVariables", "context", "createFastGeluProgramInfo", "fastGelu", "init_fast_gelu", "__esmMin", "init_wasm_common", "init_util", "init_common", "init_unary_op", "inputTensors", "dataType", "outputSize", "ShapeUtil", "biasLength", "useVec4", "getShaderSource", "shaderHelper", "x", "inputVariable", "bias", "y", "outputVariable", "uniforms", "singleElementBias", "i", "biasGetExpression", "fastGeluImpl", "tensorTypeToWsglValueType", "WORKGROUP_SIZE", "fastGeluExpression", "inputs", "context", "validateInputs", "createGatherProgramInfo", "parseGatherAttributes", "gather", "init_gather", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "inputShape", "indicesShape", "inputRank", "axis", "ShapeUtil", "outputShape", "axisDimLimit", "components", "outputSize", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "data", "inputVariable", "indices", "output", "outputVariable", "calcDataIndices", "x", "indicesRank", "calcStr", "i", "j", "assignment", "singleAssignment", "resStr", "typeCast", "createAttributeWithCacheKey", "context", "validateInputs", "createGatherElementsProgramInfo", "parseGatherElementsAttributes", "gatherElements", "init_gather_elements", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "inputShape", "inputOutputDataType", "inputRank", "indicesShape", "indicesDataType", "axis", "ShapeUtil", "axisDimLimit", "outputShape", "outputSize", "input", "inputVariable", "indices", "output", "outputVariable", "programUniforms", "createTensorShapeVariables", "shaderHelper", "createAttributeWithCacheKey", "context", "validateInputs", "createGemmProgramInfo", "parseGemmAttributes", "gemm", "init_gemm", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "attributes", "aShape", "bShape", "M", "N", "K", "GemmUtil", "outputShape", "outputSize", "ShapeUtil", "programUniforms", "inputDependencies", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "line", "calculateAlpha", "a", "inputVariable", "b", "dataType", "c", "variables", "output", "outputVariable", "uniforms", "transA", "transB", "alpha", "beta", "context", "getInput", "validateInputs", "parseMultiHeadAttentionAttributes", "weightTransposeAttribute", "addBiasTranspose", "maybeTransposeToBNSHAndAddBias", "multiHeadAttention", "init_multihead_attention", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_types", "init_attention", "init_common", "init_transpose", "inputs", "i", "ShapeUtil", "attributes", "query", "key", "value", "bias", "keyPaddingMask", "relativePositionBias", "pastKey", "pastValue", "dmmhaPacking", "batchSize", "sequenceLength", "hiddenSize", "kvSequenceLength", "pastSequenceLength", "maxSequenceLength", "headSize", "qkvFormat", "maskType", "maskDims", "passPastInKv", "vHiddenSize", "totalSequenceLength", "broadcastResPosBias", "createAttributeWithCacheKey", "context", "qkv", "biasOffset", "outputShape", "outputSize", "programUniforms", "getShaderSource", "shaderHelper", "output", "outputVariable", "qkvInput", "inputVariable", "biasInput", "uniforms", "numHeads", "input", "reshapedInput", "createTransposeProgramInfo", "params", "kvBNSH", "Q", "applyAttention", "K", "V", "getRepeats", "validateInputs", "getOutputShape", "createTileProgramInfo", "tile", "init_tile", "__esmMin", "init_wasm_common", "init_util", "init_common", "repeatsTensorView", "inputs", "inputShape", "repeats", "outputShape", "i", "shape", "outputSize", "ShapeUtil", "dataType", "input", "inputVariable", "output", "outputVariable", "getShaderSource", "shaderHelper", "createTensorShapeVariables", "context", "validateInputs", "createConcatProgramInfo", "parseGroupQueryAttentionAttributes", "weightTransposeAttribute", "maybeExpandAndTransposeToBNSH", "groupQueryAttention", "init_group_query_attention", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_attention", "init_common", "init_multihead_attention", "init_tile", "init_transpose", "inputs", "attributes", "query", "key", "value", "pastKey", "pastValue", "dmmhaPacking", "batchSize", "sequenceLength", "hiddenSize", "kvSequenceLength", "pastSequenceLength", "maxSequenceLength", "headSize", "hasPastKey", "hasPastValue", "isPastkvBSNH", "qkvFormat", "maskType", "passPastInKv", "vHiddenSize", "totalSequenceLength", "broadcastResPosBias", "a", "b", "dataType", "params", "outputShape", "component", "outputSize", "ShapeUtil", "presentSequenceLength", "output", "outputVariable", "inputA", "inputVariable", "inputB", "H", "dispatch", "inputDependencies", "programUniforms", "createTensorShapeVariables", "uniforms", "pastStr", "newStr", "concatStr", "getShaderSource", "shaderHelper", "createAttributeWithCacheKey", "context", "input", "pastKV", "outputIndex", "reshapedInput", "numHeads", "nReps", "createTileProgramInfo", "createTransposeProgramInfo", "Q", "maybeTransposeToBNSHAndAddBias", "K", "V", "applyAttention", "createInstanceNormProgramInfo", "computeMean", "createInstanceNormNHWCProgramInfo", "instanceNorm", "init_instance_norm", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "attributes", "xShape", "outputShape", "axis", "normCount", "ShapeUtil", "normSize", "components", "getMaxComponents", "normPackedSize", "inputShape", "inputDependencies", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "x", "inputVariable", "scale", "bias", "output", "outputVariable", "variables", "dataType", "f32Type", "workgroupSize", "uniforms", "sumVector", "context", "input", "n", "h", "c", "epsilon", "WG", "outputType", "sumCastType", "setOutputValue", "var1", "var2", "unitsOfWork", "wgSize", "meanInputDependencies", "meanProgramUniforms", "getMeanShaderSource", "inputHelper", "fillVector", "meanValues", "scaleHelper", "biasHelper", "N", "C", "H", "outputSize", "channelScaleShift", "tensorTypeToWsglStorageType", "scaleType", "scaleCastType", "outputHelper", "validateInputs", "createLayerNormProgramInfo", "layerNorm", "init_layer_norm", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "attributes", "outputCount", "simplified", "xShape", "scale", "bias", "outputShape", "axis", "ShapeUtil", "normCount", "normSize", "scaleSize", "biasSize", "meanInvStdDevDim", "i", "components", "getMaxComponents", "inputDependencies", "programUniforms", "hasMeanDataOutput", "hasInvStdOutput", "getShaderSource", "shaderHelper", "dataType", "tensorTypeToWsglStorageType", "variables", "inputVariable", "outputVariable", "uniforms", "fillVector", "castToF32", "sumVector", "outputs", "context", "validateInputs", "createMatMulNBitsProgramInfo", "matMulNBits", "parseMatMulNBitsAttributes", "init_matmulnbits", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "a", "aRank", "nBlocksPerCol", "blobSize", "b", "ShapeUtil", "scalesShape", "zeroPointsShape", "expectedZeroPointsSize", "maxComputeWorkgroupSizes", "maxComputeWorkgroupStorageSize", "inputShape", "dimAOuter", "dimInner", "dimBOuter", "batchDims", "batchSize", "blobSizeInWords", "dataType", "outputNumber", "getMaxComponents", "aComponents", "bComponents", "elementSize", "getTensorElementSize", "workgroupOutputSize", "maxNumberOfComponents", "useBlockwiseMatMulNBits", "components", "outputShape", "outputSize", "programUniforms", "inputShapeTemp", "bShape", "createTensorShapeVariables", "outputShapeTemp", "getShaderSource", "shaderHelper", "inputRank", "inputVariable", "scales", "inputVariables", "zeroPoints", "outputRank", "output", "outputVariable", "uniforms", "tensorTypeToWsglStorageType", "qDqDataType", "processOneBlock", "_", "i", "updateZeroPointIndex", "context", "createAttributeWithCacheKey", "validateInputs", "getPadConstant", "getPadReflect", "getPadEdge", "getPadWrap", "getPadSnippet", "createPadProgramInfo", "createPadAttributesFromInputs", "pad", "init_pad", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "validPads", "output", "inputRank", "padsLength", "block", "i", "getElementAt", "attributes", "outputShape", "ShapeUtil", "inputDims", "outputSize", "programUniforms", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "outputVariable", "input", "inputVariable", "dataType", "padSnippet", "uniforms", "bigInt64Pads", "value", "updatePads", "axes", "v", "pads", "context", "updatedAttributes", "validateInputs", "getAdjustedPoolAttributesAndOutputShape", "getUniformAndPadInfo", "generatePoolingCode", "createShaderKeyFromAttributes", "createAveragePoolShaderKeyFromAttributes", "createMaxPoolShaderKeyFromAttributes", "parsePoolCommonAttributes", "createAveragePoolProgramInfo", "parseAveragePoolAttributes", "averagePool", "globalPoolAttributes", "parseGlobalAveragePoolAttributes", "globalAveragePool", "createMaxPoolProgramInfo", "maxPool", "parseMaxPoolAttributes", "parseGlobalMaxPoolAttributes", "globalMaxPool", "init_pool", "__esmMin", "init_esm", "init_wasm_common", "init_util", "init_common", "inputs", "env", "input", "attributes", "isGlobalOperator", "isChannelsLast", "inputShapeAsChannelFirst", "hasDilations", "kernelShape", "strides", "dilations", "pads", "PoolConvUtil", "outputShapeAsChannelFirst", "newAttributes", "outputShapeAsChannelLast", "outputShape", "outputSize", "ShapeUtil", "kernelSize", "programUniforms", "uniforms", "kw", "sw", "pwStart", "pwEnd", "pwStartEndNotZero", "phStartEndNotZero", "kh", "sh", "phStart", "phEnd", "kernelStrides", "hasPads", "sum", "cur", "shaderHelper", "x", "rank", "outputShapeRank", "op1", "op2", "start", "dataType", "output", "outputVariable", "codeW", "codeH", "codeHEnd", "dimIdxW", "dimIdxH", "stridesRank", "padsRank", "padCode", "getElementAt", "name", "adjustedAttributes", "inputVariable", "createTensorShapeVariables", "inputDependencies", "countIncludePad", "attr", "averagePoolAttributes", "context", "format", "storageOrder", "maxPoolAttributes", "validateInputsContent", "createRangeProgramInfo", "range", "init_range", "__esmMin", "init_esm", "init_wasm_common", "init_common", "start", "limit", "delta", "sameStartLimit", "increasingRangeNegativeStep", "decreasingRangePositiveStep", "dataType", "numElements", "outputShape", "outputSize", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "output", "outputVariable", "wgslType", "uniforms", "context", "env", "validateScales", "updateScales", "validateInputs", "getOriginalCoordinateFromResizedCoordinate", "getNearestPixelFromOriginal", "updateRoI", "initOutputShape", "adjustOutputShape", "calculateOriginalIndicesFromOutputIndices", "calculateInputIndicesFromOutputIndices", "checkInputIndices", "setChannelAndBatchIndices", "bilinearInterpolation", "bicubicInterpolation", "trilinearInterpolation", "createResizeProgramInfo", "getOpsetVersionFromCustomDataBuffer", "resize", "parseResizeAttributes", "init_resize", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "scales", "attributes", "value", "axes", "rank", "newScales", "index", "inputs", "opsetVersion", "sizes", "roi", "roiInputIndex", "scalesInputIndex", "sizesInputIndex", "coordinateTransferMode", "dType", "nearestMode", "roiTmp", "roiLocal", "v", "i", "inputShape", "outputShape", "scaleInPolicy", "adjustedOutputShape", "output", "scalesLength", "roiLength", "getElementAt", "input", "useExtrapolation", "channelIdx", "batchIdx", "spacialDims", "extrapolationValue", "heightIdx", "widthIdx", "cubicCoeffA", "excludeOutside", "is2D", "isNchw", "createCubicInterpolationFunction", "idx", "direction", "depthIdx", "inputTensor", "scalesInput", "roiInput", "outputVariable", "inputVariable", "outputSize", "ShapeUtil", "noScale", "d", "dataType", "getShaderSource", "shaderHelper", "createTensorShapeVariables", "context", "customDataBuffer", "antialias", "coordinateTransformMode", "keepAspectRatioPolicy", "mode", "createAttributeWithCacheKey", "validateInputs", "createRotaryEmbeddingProgramInfo", "rotaryEmbedding", "init_rotary_embedding", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "input", "positionIds", "cosCache", "sinCache", "numHeads", "rotaryEmbeddingDim", "ShapeUtil", "batchSize", "sequenceLength", "maxSequenceLength", "hiddenSize", "headSize", "interleaved", "scale", "batchStride", "halfRotaryEmbeddingDim", "globalShape", "globalStrides", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "inputVariable", "output", "outputVariable", "WORKGROUP_SIZE", "createAttributeWithCacheKey", "context", "validateInputs", "createSkipLayerNormProgramInfo", "skipLayerNorm", "init_skip_layer_norm", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "input", "skip", "gamma", "hiddenSize", "sequenceLength", "beta", "bias", "attributes", "outputCount", "isTraining", "simplified", "inputShape", "inputSize", "ShapeUtil", "outputShape", "outputSize", "meanInvStdDevDim", "hasBetaInput", "hasBiasInput", "hasMeanOutput", "hasInvStdDevOutput", "hasInputSkipBiasSumOutput", "workgroupSize", "components", "getMaxComponents", "programUniforms", "getShaderSource", "shaderHelper", "uniformsArray", "variables", "inputVariable", "outputVariable", "dataType", "tensorTypeToWsglStorageType", "vecDataType", "castToF32", "sumVector", "outputs", "_input", "_index", "context", "validateInputs", "readInput", "createSliceAttributesFromInputs", "fixStartEndValues", "calculateInputIndicesImpl", "createSliceProgramInfo", "slice", "parseSliceAttributes", "init_slice", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "_", "idx", "input", "v", "starts", "ends", "axes", "createAttributeWithCacheKey", "value", "index", "inputShape", "steps", "newValue", "output", "getElementAt", "inputSize", "ShapeUtil", "step", "start", "i", "end", "signs", "array", "numSteps", "newEnd", "newStart", "outputShape", "axis", "outputTensorInfo", "outputVariable", "inputVariable", "outputSize", "uniforms", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "context", "updatedAttributes", "validateInputs", "createSoftmaxProgramInfo", "softmax", "parseSoftmaxAttributes", "init_softmax", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "input", "attributes", "shape", "outputSize", "ShapeUtil", "WG", "axis", "cols", "rows", "components", "getMaxComponents", "packedCols", "maxVector", "name", "x", "inputVariable", "output", "outputVariable", "valueType", "threadMaxDecl", "tensorTypeToWsglStorageType", "getShaderSource", "shaderHelper", "sumVector", "context", "createAttributeWithCacheKey", "validateInputs", "createSplitAttributesFromInputs", "calculateOutputIndexImpl", "writeBufferDataImpl", "createSplitProgramInfo", "split", "parseSplitAttributes", "init_split", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "splitSizes", "numOutputs", "v", "createAttributeWithCacheKey", "numberOfTensors", "getElementAt", "outputs", "codeLines", "i", "returnSnippet", "inputShape", "inputSize", "ShapeUtil", "dataType", "axis", "input", "inputVariable", "sizeInSplitAxis", "outputsTensorInfo", "outputShapes", "previousSum", "programUniforms", "outputShape", "outputVariable", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "context", "updatedAttributes", "createWhereOpProgramShader", "createWhereOpProgramInfo", "where", "init_where", "__esmMin", "init_wasm_common", "init_util", "init_common", "shaderHelper", "inputs", "dimsOutput", "isBroadcast", "typeOutput", "output", "outputVariable", "a", "inputVariable", "b", "c", "assignment", "expression", "singleAssignment", "resStr", "x", "typeCast", "expressionA", "expressionB", "expressionC", "dimsA", "dimsB", "dimsC", "outputDataType", "ShapeUtil", "outputShape", "outputSize", "calculatedShape", "BroadcastUtil", "vecSize", "createTensorShapeVariables", "context", "WEBGPU_OP_RESOLVE_RULES", "init_op_resolve_rules", "__esmMin", "init_argminmax", "init_attention", "init_batch_norm", "init_bias_add", "init_bias_split_gelu", "init_binary_op", "init_concat", "init_conv", "init_conv_transpose", "init_cumsum", "init_depth_to_space", "init_einsum", "init_expand", "init_fast_gelu", "init_gather", "init_gather_elements", "init_gemm", "init_group_query_attention", "init_instance_norm", "init_layer_norm", "init_matmul", "init_matmulnbits", "init_multihead_attention", "init_pad", "init_pool", "init_range", "init_reduce", "init_resize", "init_rotary_embedding", "init_skip_layer_norm", "init_slice", "init_softmax", "init_split", "init_tile", "init_transpose", "init_unary_op", "init_where", "abs", "acos", "acosh", "add", "argMax", "parseArgMinMaxAttributes", "argMin", "asin", "asinh", "atan", "atanh", "attention", "averagePool", "parseAveragePoolAttributes", "batchNorm", "biasAdd", "biasSplitGelu", "cast", "parseCastAttributes", "ceil", "clip", "concat", "parseConcatAttributes", "conv", "parseConvAttributes", "convTranspose", "parseConvTransposeAttributes", "cos", "cosh", "cumsum", "parseCumSumAttributes", "depthToSpace", "parseDepthToSpaceAttributes", "div", "einsum", "parseEinsumAttributes", "elu", "parseAlphaAttributes", "equal", "erf", "exp", "expand", "fastGelu", "floor", "gather", "parseGatherAttributes", "gatherElements", "parseGatherElementsAttributes", "gelu", "gemm", "parseGemmAttributes", "globalAveragePool", "parseGlobalAveragePoolAttributes", "globalMaxPool", "parseGlobalMaxPoolAttributes", "greater", "greaterOrEqual", "groupQueryAttention", "parseGroupQueryAttentionAttributes", "hardSigmoid", "parseHardSigmoidAttributes", "instanceNorm", "layerNorm", "leakyRelu", "less", "lessOrEqual", "log", "matMul", "matMulNBits", "parseMatMulNBitsAttributes", "maxPool", "parseMaxPoolAttributes", "mul", "multiHeadAttention", "parseMultiHeadAttentionAttributes", "neg", "not", "pad", "pow", "quickgelu", "range", "reciprocal", "reduceMin", "reduceMean", "reduceMax", "reduceSum", "reduceProd", "reduceL1", "reduceL2", "reduceLogSum", "reduceLogSumExp", "reduceSumSquare", "relu", "resize", "parseResizeAttributes", "rotaryEmbedding", "sigmoid", "sin", "sinh", "slice", "parseSliceAttributes", "skipLayerNorm", "split", "parseSplitAttributes", "sqrt", "softmax", "parseSoftmaxAttributes", "sub", "tan", "tanh", "thresholdedRelu", "tile", "transpose", "parseTransposeAttributes", "where", "ProgramManager", "init_program_manager", "__esmMin", "init_esm", "init_log", "init_common", "backend", "key", "artifact", "buildArtifact", "inputs", "outputs", "dispatchGroup", "uniformBufferBinding", "TRACE_FUNC_BEGIN", "device", "computePassEncoder", "entries", "input", "output", "bindGroup", "commandInfo", "TRACE_FUNC_END", "programInfo", "normalizedDispatchGroupSize", "extensions", "shaderHelper", "createShaderHelper", "userCode", "code", "shaderModule", "LOG_DEBUG", "computePipeline", "x", "y", "z", "limitPerDimension", "size", "dispatchAverage", "getProgramInputTensorInfoDependencyKey", "getProgramInfoUniqueKey", "AdapterInfoImpl", "WebGpuBackend", "init_backend_webgpu", "__esmMin", "init_esm", "init_wasm_common", "init_log", "init_tensor_view", "init_gpu_data_manager", "init_op_resolve_rules", "init_program_manager", "inputTensors", "inputDependencies", "inputInfos", "i", "type", "rank", "dims", "programInfo", "is1DimensionDispatch", "key", "adapterInfo", "architecture", "vendor", "data", "env", "adapter", "requiredFeatures", "deviceDescriptor", "createGpuDataManager", "ProgramManager", "configureLogger", "ev", "commandEncoder", "computePassDescriptor", "TRACE_FUNC_BEGIN", "queryReadBuffer", "mappedData", "pendingKernels", "pendingKernelInfo", "kernelId", "kernelInfo", "kernelType", "kernelName", "programName", "inputTensorViews", "outputTensorViews", "startTimeU64", "endTimeU64", "startTime", "endTime", "value", "tensorDataTypeEnumToString", "inputShapes", "outputShapes", "TRACE", "TRACE_FUNC_END", "program", "outputIndices", "createKernelOutput", "createIntermediateOutput", "outputCount", "inputDatas", "gpuData", "outputs", "dispatchGroup", "programUniforms", "validatedOutputIndices", "_", "outputDatas", "isTemporary", "isPersistent", "tensorView", "persistentData", "uniformBufferBinding", "currentOffset", "offsets", "v", "sizeOfElement", "sizeOfVecOrMat", "baseAlignment", "elementPerVecOrMat", "maxAlignmentOfField", "arrayBuffer", "offset", "uniformBufferData", "normalizedDispatchGroup", "artifact", "LOG_DEBUG", "uniform", "actualType", "actualLength", "length", "gpuDataId", "src", "dst", "getTargetBuffer", "size", "ptr", "attribute", "op", "WEBGPU_OP_RESOLVE_RULES", "context", "errors", "kernel", "kernelEntry", "attributes", "useErrorScope", "e", "err", "sessionId", "index", "buffer", "sessionInputOutputMapping", "previousBuffer", "id", "bufferInfo", "gpuBuffer", "downloadGpuData", "createView", "sessionCommandList", "sessionPendingKernels", "computePassEncoder", "command", "init_exports", "__export", "init", "TensorViewImpl", "ComputeContextImpl", "init_init", "__esmMin", "init_wasm_common", "init_backend_webgpu", "init_log", "init_util", "_TensorViewImpl", "module", "dataType", "data", "dims", "elementCount", "ShapeUtil", "newDims", "backend", "contextDataOffset", "heapU32", "dataIndex", "inputCount", "inputs", "i", "dim", "d", "program", "inputsOutputsMapping", "mappedInputs", "outputIndices", "createKernelOutput", "index", "createTemporaryOutput", "elementSize", "getTensorElementSize", "bufferSize", "gpuDataId", "stack", "offset", "e", "name", "env", "gpuAdapter", "jsepInit", "WebGpuBackend", "size", "ptr", "src", "dst", "isSourceGpu", "LOG_DEBUG", "dataOffset", "kernelType", "kernelId", "attribute", "kernel", "sessionHandle", "errors", "context", "initOrt", "initRuntime", "initEp", "activeSessions", "getSessionInputOutputCount", "copyFromExternalBuffer", "createSession", "releaseSession", "prepareInputOutputTensor", "run", "endProfiling", "extractTransferableBuffers", "init_wasm_core_impl", "__esmMin", "init_run_options", "init_session_options", "init_wasm_common", "init_wasm_factory", "init_wasm_utils", "init_wasm_utils_load_file", "numThreads", "loggingLevel", "getInstance", "checkLastError", "env", "logLevelStringToEnum", "epName", "initJsep", "adapter", "powerPreference", "forceFallbackAdapter", "sessionHandle", "wasm", "stack", "dataOffset", "model", "modelDataOffset", "modelData", "options", "modelDataLength", "sessionOptionsHandle", "ioBindingHandle", "allocs", "inputNamesUTF8Encoded", "outputNamesUTF8Encoded", "setSessionOptions", "loadingPromises", "file", "path", "loadFile", "data", "provider", "webnnOptions", "context", "gpuDevice", "deviceType", "inputCount", "outputCount", "enableGraphCapture", "inputNames", "outputNames", "outputPreferredLocations", "i", "name", "nameString", "location", "bindingState", "l", "dataLocationStringToEnum", "e", "buf", "alloc", "sessionId", "session", "ioBindingState", "tensor", "tensorHandles", "index", "dataType", "dims", "rawData", "dataByteLength", "gpuBuffer", "elementSizeInBytes", "getTensorElementSize", "tensorDataTypeStringToEnum", "a", "b", "registerBuffer", "dataIndex", "allocWasmString", "dimsOffset", "dimIndex", "d", "inputIndices", "inputTensors", "outputIndices", "outputTensors", "inputOutputBound", "runOptionsHandle", "runOptionsAllocs", "inputTensorHandles", "outputTensorHandles", "inputOutputAllocs", "beforeRunStack", "inputValuesOffset", "inputNamesOffset", "outputValuesOffset", "outputNamesOffset", "setRunOptions", "inputValuesIndex", "inputNamesIndex", "outputValuesIndex", "outputNamesIndex", "handle", "outputPreferredLocationsEncoded", "errorCode", "output", "beforeGetTensorDataStack", "tensorDataOffset", "keepOutputTensor", "type", "tensorDataIndex", "dimsLength", "size", "tensorDataTypeEnumToString", "preferredLocation", "stringData", "offset", "maxBytesToRead", "getBuffer", "elementSize", "isGpuBufferSupportedType", "typedArrayConstructor", "tensorTypeToTypedArrayConstructor", "v", "p", "profileFileName", "tensors", "buffers", "isProxy", "proxyWorker", "initializing", "initialized", "aborted", "temporaryObjectUrl", "initWasmCallbacks", "queuedCallbacks", "enqueueCallbacks", "ensureWorker", "onProxyWorkerMessage", "initializeWebAssemblyAndOrtRuntime", "initializeOrtEp", "copyFromExternalBuffer", "createSession", "releaseSession", "run", "endProfiling", "init_proxy_wrapper", "__esmMin", "init_esm", "init_wasm_core_impl", "init_wasm_factory", "init_wasm_utils_import", "env", "type", "callbacks", "queue", "ev", "resolve", "reject", "importProxyWorker", "objectUrl", "worker", "message", "e", "initializeWebAssembly", "initRuntime", "epName", "initEp", "buffer", "model", "options", "transferable", "sessionId", "inputIndices", "inputs", "outputIndices", "outputs", "t", "serializableInputs", "extractTransferableBuffers", "encodeTensorMetadata", "decodeTensorMetadata", "OnnxruntimeWebAssemblySessionHandler", "init_session_handler_inference", "__esmMin", "init_esm", "init_proxy_wrapper", "init_wasm_common", "init_wasm_utils_env", "init_wasm_utils_load_file", "tensor", "getName", "Tensor", "dataType", "isGpuBufferSupportedType", "gpuBuffer", "download", "dispose", "path", "copyFromExternalBuffer", "loadFile", "pathOrBuffer", "options", "TRACE_FUNC_BEGIN", "model", "createSession", "TRACE_FUNC_END", "releaseSession", "feeds", "fetches", "inputArray", "inputIndices", "kvp", "name", "index", "outputArray", "outputIndices", "inputs", "t", "i", "outputs", "results", "run", "resultMap", "endProfiling", "initializeFlags", "OnnxruntimeWebAssemblyBackend", "init_backend_wasm", "__esmMin", "init_esm", "init_proxy_wrapper", "init_session_handler_inference", "init_wasm_utils_import", "env", "numCpuLogicalCores", "backendName", "initializeWebAssemblyAndOrtRuntime", "initializeOrtEp", "pathOrBuffer", "options", "handler", "OnnxruntimeWebAssemblySessionHandler", "backend_wasm_inference_exports", "__export", "wasmBackend", "init_backend_wasm_inference", "__esmMin", "init_backend_wasm", "OnnxruntimeWebAssemblyBackend", "init_esm", "version", "lib_default", "esm_exports", "onnxjsBackend", "registerBackend", "wasmBackend", "env", "version"] } diff --git a/assets/dist/ort.webgpu.bundle.min.mjs b/assets/dist/ort.webgpu.bundle.min.mjs index 8ce72dd..310b3a7 100644 --- a/assets/dist/ort.webgpu.bundle.min.mjs +++ b/assets/dist/ort.webgpu.bundle.min.mjs @@ -3,17 +3,17 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. */ -var Dn=Object.defineProperty;var tp=Object.getOwnPropertyDescriptor;var rp=Object.getOwnPropertyNames;var np=Object.prototype.hasOwnProperty;var Bn=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var U=(e,t)=>()=>(e&&(t=e(e=0)),t);var Lt=(e,t)=>{for(var r in t)Dn(e,r,{get:t[r],enumerable:!0})},op=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of rp(t))!np.call(e,o)&&o!==r&&Dn(e,o,{get:()=>t[o],enumerable:!(n=tp(t,o))||n.enumerable});return e};var yr=e=>op(Dn({},"__esModule",{value:!0}),e);var br,$t,_t,ip,wr,vr=U(()=>{"use strict";br=new Map,$t=[],_t=(e,t,r)=>{if(t&&typeof t.init=="function"&&typeof t.createInferenceSessionHandler=="function"){let n=br.get(e);if(n===void 0)br.set(e,{backend:t,priority:r});else{if(n.priority>r)return;if(n.priority===r&&n.backend!==t)throw new Error(`cannot register backend "${e}" using priority ${r}`)}if(r>=0){let o=$t.indexOf(e);o!==-1&&$t.splice(o,1);for(let i=0;i<$t.length;i++)if(br.get($t[i]).priority<=r){$t.splice(i,0,e);return}$t.push(e)}return}throw new TypeError("not a valid backend")},ip=async e=>{let t=br.get(e);if(!t)return"backend not found.";if(t.initialized)return t.backend;if(t.aborted)return t.error;{let r=!!t.initPromise;try{return r||(t.initPromise=t.backend.init(e)),await t.initPromise,t.initialized=!0,t.backend}catch(n){return r||(t.error=`${n}`,t.aborted=!0),t.error}finally{delete t.initPromise}}},wr=async e=>{let t=e.executionProviders||[],r=t.map(d=>typeof d=="string"?d:d.name),n=r.length===0?$t:r,o,i=[],a=new Set;for(let d of n){let p=await ip(d);typeof p=="string"?i.push({name:d,err:p}):(o||(o=p),o===p&&a.add(d))}if(!o)throw new Error(`no available backend found. ERR: ${i.map(d=>`[${d.name}] ${d.err}`).join(", ")}`);for(let{name:d,err:p}of i)r.includes(d)&&console.warn(`removing requested execution provider "${d}" from session options because it is not available: ${p}`);let l=t.filter(d=>a.has(typeof d=="string"?d:d.name));return[o,new Proxy(e,{get:(d,p)=>p==="executionProviders"?l:Reflect.get(d,p)})]}});var ji=U(()=>{"use strict";vr()});var Yi,Xi=U(()=>{"use strict";Yi="1.19.0"});var Zi,Ne,Rn=U(()=>{"use strict";Xi();Zi="warning",Ne={wasm:{},webgl:{},webgpu:{},versions:{common:Yi},set logLevel(e){if(e!==void 0){if(typeof e!="string"||["verbose","info","warning","error","fatal"].indexOf(e)===-1)throw new Error(`Unsupported logging level: ${e}`);Zi=e}},get logLevel(){return Zi}};Object.defineProperty(Ne,"logLevel",{enumerable:!0})});var ye,Qi=U(()=>{"use strict";Rn();ye=Ne});var Ji,ea,ta=U(()=>{"use strict";Ji=(e,t)=>{let r=typeof document<"u"?document.createElement("canvas"):new OffscreenCanvas(1,1);r.width=e.dims[3],r.height=e.dims[2];let n=r.getContext("2d");if(n!=null){let o,i;t?.tensorLayout!==void 0&&t.tensorLayout==="NHWC"?(o=e.dims[2],i=e.dims[3]):(o=e.dims[3],i=e.dims[2]);let a=t?.format!==void 0?t.format:"RGB",l=t?.norm,d,p;l===void 0||l.mean===void 0?d=[255,255,255,255]:typeof l.mean=="number"?d=[l.mean,l.mean,l.mean,l.mean]:(d=[l.mean[0],l.mean[1],l.mean[2],0],l.mean[3]!==void 0&&(d[3]=l.mean[3])),l===void 0||l.bias===void 0?p=[0,0,0,0]:typeof l.bias=="number"?p=[l.bias,l.bias,l.bias,l.bias]:(p=[l.bias[0],l.bias[1],l.bias[2],0],l.bias[3]!==void 0&&(p[3]=l.bias[3]));let m=i*o,u=0,h=m,w=m*2,g=-1;a==="RGBA"?(u=0,h=m,w=m*2,g=m*3):a==="RGB"?(u=0,h=m,w=m*2):a==="RBG"&&(u=0,w=m,h=m*2);for(let b=0;b{let r=typeof document<"u"?document.createElement("canvas").getContext("2d"):new OffscreenCanvas(1,1).getContext("2d"),n;if(r!=null){let o,i,a;t?.tensorLayout!==void 0&&t.tensorLayout==="NHWC"?(o=e.dims[2],i=e.dims[1],a=e.dims[3]):(o=e.dims[3],i=e.dims[2],a=e.dims[1]);let l=t!==void 0&&t.format!==void 0?t.format:"RGB",d=t?.norm,p,m;d===void 0||d.mean===void 0?p=[255,255,255,255]:typeof d.mean=="number"?p=[d.mean,d.mean,d.mean,d.mean]:(p=[d.mean[0],d.mean[1],d.mean[2],255],d.mean[3]!==void 0&&(p[3]=d.mean[3])),d===void 0||d.bias===void 0?m=[0,0,0,0]:typeof d.bias=="number"?m=[d.bias,d.bias,d.bias,d.bias]:(m=[d.bias[0],d.bias[1],d.bias[2],0],d.bias[3]!==void 0&&(m[3]=d.bias[3]));let u=i*o;if(t!==void 0&&(t.format!==void 0&&a===4&&t.format!=="RGBA"||a===3&&t.format!=="RGB"&&t.format!=="BGR"))throw new Error("Tensor format doesn't match input tensor dims");let h=4,w=0,g=1,b=2,x=3,_=0,$=u,S=u*2,I=-1;l==="RGBA"?(_=0,$=u,S=u*2,I=u*3):l==="RGB"?(_=0,$=u,S=u*2):l==="RBG"&&(_=0,S=u,$=u*2),n=r.createImageData(o,i);for(let T=0;T{"use strict";$r();Mn=(e,t)=>{if(e===void 0)throw new Error("Image buffer must be defined");if(t.height===void 0||t.width===void 0)throw new Error("Image height and width must be defined");if(t.tensorLayout==="NHWC")throw new Error("NHWC Tensor layout is not supported yet");let{height:r,width:n}=t,o=t.norm??{mean:255,bias:0},i,a;typeof o.mean=="number"?i=[o.mean,o.mean,o.mean,o.mean]:i=[o.mean[0],o.mean[1],o.mean[2],o.mean[3]??255],typeof o.bias=="number"?a=[o.bias,o.bias,o.bias,o.bias]:a=[o.bias[0],o.bias[1],o.bias[2],o.bias[3]??0];let l=t.format!==void 0?t.format:"RGBA",d=t.tensorFormat!==void 0&&t.tensorFormat!==void 0?t.tensorFormat:"RGB",p=r*n,m=d==="RGBA"?new Float32Array(p*4):new Float32Array(p*3),u=4,h=0,w=1,g=2,b=3,x=0,_=p,$=p*2,S=-1;l==="RGB"&&(u=3,h=0,w=1,g=2,b=-1),d==="RGBA"?S=p*3:d==="RBG"?(x=0,$=p,_=p*2):d==="BGR"&&($=0,_=p,x=p*2);for(let T=0;T{let r=typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement,n=typeof ImageData<"u"&&e instanceof ImageData,o=typeof ImageBitmap<"u"&&e instanceof ImageBitmap,i=typeof e=="string",a,l=t??{},d=()=>{if(typeof document<"u")return document.createElement("canvas");if(typeof OffscreenCanvas<"u")return new OffscreenCanvas(1,1);throw new Error("Canvas is not supported")},p=m=>m instanceof HTMLCanvasElement||m instanceof OffscreenCanvas?m.getContext("2d"):null;if(r){let m=d();m.width=e.width,m.height=e.height;let u=p(m);if(u!=null){let h=e.height,w=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(h=t.resizedHeight,w=t.resizedWidth),t!==void 0){if(l=t,t.tensorFormat!==void 0)throw new Error("Image input config format must be RGBA for HTMLImageElement");l.tensorFormat="RGBA",l.height=h,l.width=w}else l.tensorFormat="RGBA",l.height=h,l.width=w;u.drawImage(e,0,0),a=u.getImageData(0,0,w,h).data}else throw new Error("Can not access image data")}else if(n){let m,u;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(m=t.resizedHeight,u=t.resizedWidth):(m=e.height,u=e.width),t!==void 0&&(l=t),l.format="RGBA",l.height=m,l.width=u,t!==void 0){let h=d();h.width=u,h.height=m;let w=p(h);if(w!=null)w.putImageData(e,0,0),a=w.getImageData(0,0,u,m).data;else throw new Error("Can not access image data")}else a=e.data}else if(o){if(t===void 0)throw new Error("Please provide image config with format for Imagebitmap");let m=d();m.width=e.width,m.height=e.height;let u=p(m);if(u!=null){let h=e.height,w=e.width;return u.drawImage(e,0,0,w,h),a=u.getImageData(0,0,w,h).data,l.height=h,l.width=w,Mn(a,l)}else throw new Error("Can not access image data")}else{if(i)return new Promise((m,u)=>{let h=d(),w=p(h);if(!e||!w)return u();let g=new Image;g.crossOrigin="Anonymous",g.src=e,g.onload=()=>{h.width=g.width,h.height=g.height,w.drawImage(g,0,0,h.width,h.height);let b=w.getImageData(0,0,h.width,h.height);l.height=h.height,l.width=h.width,m(Mn(b.data,l))}});throw new Error("Input data provided is not supported - aborted tensor creation")}if(a!==void 0)return Mn(a,l);throw new Error("Input data provided is not supported - aborted tensor creation")},na=(e,t)=>{let{width:r,height:n,download:o,dispose:i}=t,a=[1,n,r,4];return new Re({location:"texture",type:"float32",texture:e,dims:a,download:o,dispose:i})},oa=(e,t)=>{let{dataType:r,dims:n,download:o,dispose:i}=t;return new Re({location:"gpu-buffer",type:r??"float32",gpuBuffer:e,dims:n,download:o,dispose:i})},ia=(e,t,r)=>new Re({location:"cpu-pinned",type:e,data:t,dims:r??[t.length]})});var xt,Ft,sa,ua,da=U(()=>{"use strict";xt=new Map([["float32",Float32Array],["uint8",Uint8Array],["int8",Int8Array],["uint16",Uint16Array],["int16",Int16Array],["int32",Int32Array],["bool",Uint8Array],["float64",Float64Array],["uint32",Uint32Array]]),Ft=new Map([[Float32Array,"float32"],[Uint8Array,"uint8"],[Int8Array,"int8"],[Uint16Array,"uint16"],[Int16Array,"int16"],[Int32Array,"int32"],[Float64Array,"float64"],[Uint32Array,"uint32"]]),sa=!1,ua=()=>{if(!sa){sa=!0;let e=typeof BigInt64Array<"u"&&BigInt64Array.from,t=typeof BigUint64Array<"u"&&BigUint64Array.from,r=typeof Float16Array<"u"&&Float16Array.from;e&&(xt.set("int64",BigInt64Array),Ft.set(BigInt64Array,"int64")),t&&(xt.set("uint64",BigUint64Array),Ft.set(BigUint64Array,"uint64")),r?(xt.set("float16",Float16Array),Ft.set(Float16Array,"float16")):xt.set("float16",Uint16Array)}}});var la,ca,pa=U(()=>{"use strict";$r();la=e=>{let t=1;for(let r=0;r{switch(e.location){case"cpu":return new Re(e.type,e.data,t);case"cpu-pinned":return new Re({location:"cpu-pinned",data:e.data,type:e.type,dims:t});case"texture":return new Re({location:"texture",texture:e.texture,type:e.type,dims:t});case"gpu-buffer":return new Re({location:"gpu-buffer",gpuBuffer:e.gpuBuffer,type:e.type,dims:t});default:throw new Error(`tensorReshape: tensor location ${e.location} is not supported`)}}});var Re,$r=U(()=>{"use strict";ta();aa();da();pa();Re=class{constructor(t,r,n){ua();let o,i;if(typeof t=="object"&&"location"in t)switch(this.dataLocation=t.location,o=t.type,i=t.dims,t.location){case"cpu-pinned":{let l=xt.get(o);if(!l)throw new TypeError(`unsupported type "${o}" to create tensor from pinned buffer`);if(!(t.data instanceof l))throw new TypeError(`buffer should be of type ${l.name}`);this.cpuData=t.data;break}case"texture":{if(o!=="float32")throw new TypeError(`unsupported type "${o}" to create tensor from texture`);this.gpuTextureData=t.texture,this.downloader=t.download,this.disposer=t.dispose;break}case"gpu-buffer":{if(o!=="float32"&&o!=="float16"&&o!=="int32"&&o!=="int64"&&o!=="uint32"&&o!=="uint8"&&o!=="bool")throw new TypeError(`unsupported type "${o}" to create tensor from gpu buffer`);this.gpuBufferData=t.gpuBuffer,this.downloader=t.download,this.disposer=t.dispose;break}default:throw new Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let l,d;if(typeof t=="string")if(o=t,d=n,t==="string"){if(!Array.isArray(r))throw new TypeError("A string tensor's data must be a string array.");l=r}else{let p=xt.get(t);if(p===void 0)throw new TypeError(`Unsupported tensor type: ${t}.`);if(Array.isArray(r)){if(t==="float16"&&p===Uint16Array)throw new TypeError("Creating a float16 tensor from number array is not supported. Please use Uint16Array as data.");t==="uint64"||t==="int64"?l=p.from(r,BigInt):l=p.from(r)}else if(r instanceof p)l=r;else throw new TypeError(`A ${o} tensor's data must be type of ${p}`)}else if(d=r,Array.isArray(t)){if(t.length===0)throw new TypeError("Tensor type cannot be inferred from an empty array.");let p=typeof t[0];if(p==="string")o="string",l=t;else if(p==="boolean")o="bool",l=Uint8Array.from(t);else throw new TypeError(`Invalid element type of data array: ${p}.`)}else{let p=Ft.get(t.constructor);if(p===void 0)throw new TypeError(`Unsupported type for tensor data: ${t.constructor}.`);o=p,l=t}if(d===void 0)d=[l.length];else if(!Array.isArray(d))throw new TypeError("A tensor's dims must be a number array");i=d,this.cpuData=l,this.dataLocation="cpu"}let a=la(i);if(this.cpuData&&a!==this.cpuData.length)throw new Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=o,this.dims=i,this.size=a}static async fromImage(t,r){return ra(t,r)}static fromTexture(t,r){return na(t,r)}static fromGpuBuffer(t,r){return oa(t,r)}static fromPinnedBuffer(t,r,n){return ia(t,r,n)}toDataURL(t){return Ji(this,t)}toImageData(t){return ea(this,t)}get data(){if(this.ensureValid(),!this.cpuData)throw new Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw new Error("The data is not stored as a WebGL texture.");return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw new Error("The data is not stored as a WebGPU buffer.");return this.gpuBufferData}async getData(t){switch(this.ensureValid(),this.dataLocation){case"cpu":case"cpu-pinned":return this.data;case"texture":case"gpu-buffer":{if(!this.downloader)throw new Error("The current tensor is not created with a specified data downloader.");if(this.isDownloading)throw new Error("The current tensor is being downloaded.");try{this.isDownloading=!0;let r=await this.downloader();return this.downloader=void 0,this.dataLocation="cpu",this.cpuData=r,t&&this.disposer&&(this.disposer(),this.disposer=void 0),r}finally{this.isDownloading=!1}}default:throw new Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw new Error("The current tensor is being downloaded.");this.disposer&&(this.disposer(),this.disposer=void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation="none"}ensureValid(){if(this.dataLocation==="none")throw new Error("The tensor is disposed.")}reshape(t){if(this.ensureValid(),this.downloader||this.disposer)throw new Error("Cannot reshape a tensor that owns GPU resource.");return ca(this,t)}}});var ze,_r=U(()=>{"use strict";$r();ze=Re});var xr,ma,We,Me,Un=U(()=>{"use strict";Rn();xr=(e,t)=>{(typeof Ne.trace>"u"?!Ne.wasm.trace:!Ne.trace)||console.timeStamp(`${e}::ORT::${t}`)},ma=(e,t)=>{let r=new Error().stack?.split(/\r\n|\r|\n/g)||[],n=!1;for(let o=0;o{(typeof Ne.trace>"u"?!Ne.wasm.trace:!Ne.trace)||ma("BEGIN",e)},Me=e=>{(typeof Ne.trace>"u"?!Ne.wasm.trace:!Ne.trace)||ma("END",e)}});var Sr,fa=U(()=>{"use strict";vr();_r();Un();Sr=class e{constructor(t){this.handler=t}async run(t,r,n){We();let o={},i={};if(typeof t!="object"||t===null||t instanceof ze||Array.isArray(t))throw new TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let a=!0;if(typeof r=="object"){if(r===null)throw new TypeError("Unexpected argument[1]: cannot be null.");if(r instanceof ze)throw new TypeError("'fetches' cannot be a Tensor");if(Array.isArray(r)){if(r.length===0)throw new TypeError("'fetches' cannot be an empty array.");a=!1;for(let p of r){if(typeof p!="string")throw new TypeError("'fetches' must be a string array or an object.");if(this.outputNames.indexOf(p)===-1)throw new RangeError(`'fetches' contains invalid output name: ${p}.`);o[p]=null}if(typeof n=="object"&&n!==null)i=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else{let p=!1,m=Object.getOwnPropertyNames(r);for(let u of this.outputNames)if(m.indexOf(u)!==-1){let h=r[u];(h===null||h instanceof ze)&&(p=!0,a=!1,o[u]=h)}if(p){if(typeof n=="object"&&n!==null)i=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else i=r}}else if(typeof r<"u")throw new TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let p of this.inputNames)if(typeof t[p]>"u")throw new Error(`input '${p}' is missing in 'feeds'.`);if(a)for(let p of this.outputNames)o[p]=null;let l=await this.handler.run(t,o,i),d={};for(let p in l)if(Object.hasOwnProperty.call(l,p)){let m=l[p];m instanceof ze?d[p]=m:d[p]=new ze(m.type,m.data,m.dims)}return Me(),d}async release(){return this.handler.dispose()}static async create(t,r,n,o){We();let i,a={};if(typeof t=="string"){if(i=t,typeof r=="object"&&r!==null)a=r;else if(typeof r<"u")throw new TypeError("'options' must be an object.")}else if(t instanceof Uint8Array){if(i=t,typeof r=="object"&&r!==null)a=r;else if(typeof r<"u")throw new TypeError("'options' must be an object.")}else if(t instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&t instanceof SharedArrayBuffer){let m=t,u=0,h=t.byteLength;if(typeof r=="object"&&r!==null)a=r;else if(typeof r=="number"){if(u=r,!Number.isSafeInteger(u))throw new RangeError("'byteOffset' must be an integer.");if(u<0||u>=m.byteLength)throw new RangeError(`'byteOffset' is out of range [0, ${m.byteLength}).`);if(h=t.byteLength-u,typeof n=="number"){if(h=n,!Number.isSafeInteger(h))throw new RangeError("'byteLength' must be an integer.");if(h<=0||u+h>m.byteLength)throw new RangeError(`'byteLength' is out of range (0, ${m.byteLength-u}].`);if(typeof o=="object"&&o!==null)a=o;else if(typeof o<"u")throw new TypeError("'options' must be an object.")}else if(typeof n<"u")throw new TypeError("'byteLength' must be a number.")}else if(typeof r<"u")throw new TypeError("'options' must be an object.");i=new Uint8Array(m,u,h)}else throw new TypeError("Unexpected argument[0]: must be 'path' or 'buffer'.");let[l,d]=await wr(a),p=await l.createInferenceSessionHandler(i,d);return Me(),new e(p)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}}});var ap,ha=U(()=>{"use strict";fa();ap=Sr});var ga=U(()=>{"use strict"});var ya=U(()=>{"use strict"});var ba=U(()=>{"use strict"});var wa=U(()=>{"use strict"});var sp,Ir,va=U(()=>{"use strict";vr();_r();sp="Training backend could not be resolved. Make sure you're using the correct configuration & WebAssembly files.",Ir=class e{constructor(t,r,n){this.handler=t,this.hasOptimizerModel=r,this.hasEvalModel=n}get trainingInputNames(){return this.handler.inputNames}get trainingOutputNames(){return this.handler.outputNames}get evalInputNames(){if(this.hasEvalModel)return this.handler.evalInputNames;throw new Error("This training session has no evalModel loaded.")}get evalOutputNames(){if(this.hasEvalModel)return this.handler.evalOutputNames;throw new Error("This training session has no evalModel loaded.")}static async create(t,r){let n=t.evalModel||"",o=t.optimizerModel||"",i=r||{},[a,l]=await wr(i);if(a.createTrainingSessionHandler){let d=await a.createTrainingSessionHandler(t.checkpointState,t.trainModel,n,o,l);return new e(d,!!t.optimizerModel,!!t.evalModel)}else throw new Error(sp)}typeNarrowingForRunStep(t,r,n,o,i){let a={},l={};if(typeof n!="object"||n===null||n instanceof ze||Array.isArray(n))throw new TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let d=!0;if(typeof o=="object"){if(o===null)throw new TypeError("Unexpected argument[1]: cannot be null.");if(o instanceof ze)throw new TypeError("'fetches' cannot be a Tensor");if(Array.isArray(o)){if(o.length===0)throw new TypeError("'fetches' cannot be an empty array.");d=!1;for(let p of o){if(typeof p!="string")throw new TypeError("'fetches' must be a string array or an object.");if(r.indexOf(p)===-1)throw new RangeError(`'fetches' contains invalid output name: ${p}.`);a[p]=null}if(typeof i=="object"&&i!==null)l=i;else if(typeof i<"u")throw new TypeError("'options' must be an object.")}else{let p=!1,m=Object.getOwnPropertyNames(o);for(let u of r)if(m.indexOf(u)!==-1){let h=o[u];(h===null||h instanceof ze)&&(p=!0,d=!1,a[u]=h)}if(p){if(typeof i=="object"&&i!==null)l=i;else if(typeof i<"u")throw new TypeError("'options' must be an object.")}else l=o}}else if(typeof o<"u")throw new TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let p of t)if(typeof n[p]>"u")throw new Error(`input '${p}' is missing in 'feeds'.`);if(d)for(let p of r)a[p]=null;return[a,l]}convertHandlerReturnTypeToMapOfTensors(t){let r={};for(let n in t)if(Object.hasOwnProperty.call(t,n)){let o=t[n];o instanceof ze?r[n]=o:r[n]=new ze(o.type,o.data,o.dims)}return r}async lazyResetGrad(){await this.handler.lazyResetGrad()}async runTrainStep(t,r,n){let[o,i]=this.typeNarrowingForRunStep(this.trainingInputNames,this.trainingOutputNames,t,r,n),a=await this.handler.runTrainStep(t,o,i);return this.convertHandlerReturnTypeToMapOfTensors(a)}async runOptimizerStep(t){if(this.hasOptimizerModel)await this.handler.runOptimizerStep(t||{});else throw new Error("This TrainingSession has no OptimizerModel loaded.")}async runEvalStep(t,r,n){if(this.hasEvalModel){let[o,i]=this.typeNarrowingForRunStep(this.evalInputNames,this.evalOutputNames,t,r,n),a=await this.handler.runEvalStep(t,o,i);return this.convertHandlerReturnTypeToMapOfTensors(a)}else throw new Error("This TrainingSession has no EvalModel loaded.")}async getParametersSize(t=!0){return this.handler.getParametersSize(t)}async loadParametersBuffer(t,r=!0){let n=await this.getParametersSize(r);if(t.length!==4*n)throw new Error("Size of the buffer passed into loadParametersBuffer must match the number of parameters in the model. Please use getParametersSize method to check.");return this.handler.loadParametersBuffer(t,r)}async getContiguousParameters(t=!0){return this.handler.getContiguousParameters(t)}async release(){return this.handler.dispose()}}});var up,$a=U(()=>{"use strict";va();up=Ir});var Vn={};Lt(Vn,{InferenceSession:()=>ap,TRACE:()=>xr,TRACE_FUNC_BEGIN:()=>We,TRACE_FUNC_END:()=>Me,Tensor:()=>ze,TrainingSession:()=>up,env:()=>ye,registerBackend:()=>_t});var Le=U(()=>{"use strict";ji();Qi();ha();_r();ga();ya();Un();ba();wa();$a()});var Cr=U(()=>{"use strict"});var Ia={};Lt(Ia,{default:()=>dp});var xa,Sa,dp,Ca=U(()=>{"use strict";Nn();St();qt();xa="ort-wasm-proxy-worker",Sa=globalThis.self?.name===xa;Sa&&(self.onmessage=e=>{let{type:t,in:r}=e.data;try{switch(t){case"init-wasm":Tr(r.wasm).then(()=>{Ar(r).then(()=>{postMessage({type:t})},n=>{postMessage({type:t,err:n})})},n=>{postMessage({type:t,err:n})});break;case"init-ep":{let{epName:n,env:o}=r;Er(o,n).then(()=>{postMessage({type:t})},i=>{postMessage({type:t,err:i})});break}case"copy-from":{let{buffer:n}=r,o=Kt(n);postMessage({type:t,out:o});break}case"create":{let{model:n,options:o}=r;kr(n,o).then(i=>{postMessage({type:t,out:i})},i=>{postMessage({type:t,err:i})});break}case"release":Pr(r),postMessage({type:t});break;case"run":{let{sessionId:n,inputIndices:o,inputs:i,outputIndices:a,options:l}=r;Or(n,o,i,a,new Array(a.length).fill(null),l).then(d=>{d.some(p=>p[3]!=="cpu")?postMessage({type:t,err:"Proxy does not support non-cpu tensor location."}):postMessage({type:t,out:d},Dr([...i,...d]))},d=>{postMessage({type:t,err:d})});break}case"end-profiling":zr(r),postMessage({type:t});break;default:}}catch(n){postMessage({type:t,err:n})}});dp=Sa?null:e=>new Worker(e??Mt,{type:"module",name:xa})});var Aa={};Lt(Aa,{default:()=>lp});var Wn,Ta,lp,Ea=U(()=>{"use strict";Ta=(Wn=import.meta.url,async function(e={}){function t(){return X.buffer!=ie.buffer&&ve(),ie}function r(){return X.buffer!=ie.buffer&&ve(),le}function n(){return X.buffer!=ie.buffer&&ve(),se}function o(){return X.buffer!=ie.buffer&&ve(),Z}function i(){return X.buffer!=ie.buffer&&ve(),re}function a(){return X.buffer!=ie.buffer&&ve(),J}function l(){return X.buffer!=ie.buffer&&ve(),Pe}function d(){return X.buffer!=ie.buffer&&ve(),ue}var p,m,u=Object.assign({},e),h=new Promise((s,c)=>{p=s,m=c}),w=typeof window=="object",g=typeof importScripts=="function",b=g&&self.name=="em-pthread";u.mountExternalData=(s,c)=>{(u.Cb||(u.Cb=new Map)).set(s,c)},u.unmountExternalData=()=>{delete u.Cb};var x=globalThis.SharedArrayBuffer??new WebAssembly.Memory({initial:0,maximum:0,shared:!0}).buffer.constructor;let _=()=>{let s=(f,y,v)=>(...C)=>{let O=Je,B=y?.();C=f(...C);let N=y?.();return B!==N&&(f=N,v(B),y=v=null),Je!=O?new Promise((L,j)=>{Cn={resolve:L,reject:j}}):C},c=f=>async(...y)=>{try{if(u.Bb)throw Error("Session already started");let v=u.Bb={Zb:y[0],errors:[]},C=await f(...y);if(u.Bb!==v)throw Error("Session mismatch");u.Jb?.flush();let O=v.errors;if(0N),0u._OrtCreateSession,f=>u._OrtCreateSession=f),u._OrtRun=c(s(u._OrtRun,()=>u._OrtRun,f=>u._OrtRun=f)),u._OrtRunWithBinding=c(s(u._OrtRunWithBinding,()=>u._OrtRunWithBinding,f=>u._OrtRunWithBinding=f)),u._OrtBindInput=s(u._OrtBindInput,()=>u._OrtBindInput,f=>u._OrtBindInput=f),_=void 0};u.jsepInit=(s,c)=>{if(_?.(),s==="webgpu"){[u.Jb,u.Qb,u.Ub,u.Kb,u.Tb,u.gb,u.Vb,u.Xb,u.Rb,u.Sb,u.Wb]=c;let f=u.Jb;u.jsepRegisterBuffer=(y,v,C,O)=>f.registerBuffer(y,v,C,O),u.jsepGetBuffer=y=>f.getBuffer(y),u.jsepCreateDownloader=(y,v,C)=>f.createDownloader(y,v,C),u.jsepOnReleaseSession=y=>{f.onReleaseSession(y)},u.jsepOnRunStart=y=>f.onRunStart(y)}};var $,S,I=Object.assign({},u),T="./this.program",A=(s,c)=>{throw c},z="";(w||g)&&(g?z=self.location.href:typeof document<"u"&&document.currentScript&&(z=document.currentScript.src),Wn&&(z=Wn),z=z.startsWith("blob:")?"":z.substr(0,z.replace(/[?#].*/,"").lastIndexOf("/")+1),g&&(S=s=>{var c=new XMLHttpRequest;return c.open("GET",s,!1),c.responseType="arraybuffer",c.send(null),new Uint8Array(c.response)}),$=(s,c,f)=>{var y=new XMLHttpRequest;y.open("GET",s,!0),y.responseType="arraybuffer",y.onload=()=>{y.status==200||y.status==0&&y.response?c(y.response):f()},y.onerror=f,y.send(null)});var D=console.log.bind(console),H=console.error.bind(console),W=D,F=H;if(Object.assign(u,I),I=null,b){let s=function(c){try{var f=c.data,y=f.cmd;if(y==="load"){let v=[];self.onmessage=C=>v.push(C),self.startWorker=()=>{postMessage({cmd:"loaded"});for(let C of v)s(C);self.onmessage=s};for(let C of f.handlers)u[C]&&!u[C].proxy||(u[C]=(...O)=>{postMessage({Ib:"callHandler",hc:C,args:O})},C=="print"&&(W=u[C]),C=="printErr"&&(F=u[C]));X=f.wasmMemory,ve(),de(f.wasmModule)}else if(y==="run"){kn(f.pthread_ptr,0,0,1,0,0),xn(f.pthread_ptr),Nl(),Vo(),ce||(Ri(),ce=!0);try{Wl(f.start_routine,f.arg)}catch(v){if(v!="unwind")throw v}}else y==="cancel"?Rt()&&hr(-1):f.target!=="setimmediate"&&(y==="checkMailbox"?ce&&ar():y&&(F(`worker: received unknown command ${y}`),F(f)))}catch(v){throw Mi(),v}};var _h=s,de,ce=!1;F=function(...c){c=c.join(" "),console.error(c)},self.alert=function(...c){postMessage({Ib:"alert",text:c.join(" "),jc:Rt()})},u.instantiateWasm=(c,f)=>new Promise(y=>{de=v=>{v=new WebAssembly.Instance(v,zo()),f(v),y()}}),self.onunhandledrejection=c=>{throw c.reason||c},self.onmessage=s}var X,xe,q,ie,le,se,Z,re,J,Pe,R,Y,ue,Te=!1;function ve(){var s=X.buffer;u.HEAP8=ie=new Int8Array(s),u.HEAP16=se=new Int16Array(s),u.HEAPU8=le=new Uint8Array(s),u.HEAPU16=Z=new Uint16Array(s),u.HEAP32=re=new Int32Array(s),u.HEAPU32=J=new Uint32Array(s),u.HEAPF32=Pe=new Float32Array(s),u.HEAPF64=ue=new Float64Array(s),u.HEAP64=R=new BigInt64Array(s),u.HEAPU64=Y=new BigUint64Array(s)}if(!b){if(u.wasmMemory)X=u.wasmMemory;else if(!((X=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0})).buffer instanceof x))throw F("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),Error("bad memory");ve()}var Se=[],Ot=[],Be=[],Ae=0,Xe=null,lt=null;function or(){if(--Ae==0&&(Xe!==null&&(clearInterval(Xe),Xe=null),lt)){var s=lt;lt=null,s()}}function Gt(s){throw F(s="Aborted("+s+")"),Te=!0,q=1,s=new WebAssembly.RuntimeError(s+". Build with -sASSERTIONS for more info."),m(s),s}var Ao,Eo=s=>s.startsWith("data:application/octet-stream;base64,"),ko=s=>s.startsWith("file://");function Po(s){if(S)return S(s);throw"both async and sync fetching of the wasm failed"}function Oo(s,c,f){return function(y){if(w||g){if(typeof fetch=="function"&&!ko(y))return fetch(y,{credentials:"same-origin"}).then(v=>{if(!v.ok)throw`failed to load wasm binary file at '${y}'`;return v.arrayBuffer()}).catch(()=>Po(y));if($)return new Promise((v,C)=>{$(y,O=>v(new Uint8Array(O)),C)})}return Promise.resolve().then(()=>Po(y))}(s).then(y=>WebAssembly.instantiate(y,c)).then(f,y=>{F(`failed to asynchronously prepare wasm: ${y}`),Gt(y)})}function zo(){return{a:{wa:Vl,b:Gl,Y:Go,y:qo,ma:Ko,U:Yo,W:Xo,na:Zo,ka:Qo,da:Jo,ja:ei,I:ti,V:ri,S:ni,la:oi,T:ii,sa:Ll,C:ql,M:Kl,L:Yl,B:Zl,s:Ql,p:Jl,D:ec,x:sc,N:uc,ra:dc,ga:lc,Q:cc,Z:pc,E:mc,fa:xn,pa:fc,u:hc,A:bc,o:wc,k:$c,c:$n,n:_c,j:Ic,xa:Cc,r:Tc,d:Ac,v:Ec,m:kc,g:Pc,l:Oc,i:zc,h:Dc,e:Bc,aa:Rc,ba:Mc,ca:Uc,_:wi,$:vi,P:Vc,f:Nc,K:Wc,F:Hc,J:Gc,ta:Lc,oa:Fc,R:qc,t:_i,w:Kc,O:jc,va:Yc,ua:Xc,ha:Ii,ia:Ci,X:gn,z:Ti,H:Ai,ea:Ei,G:ki,a:X,qa:zi,q:Jc}}}var mn={1336340:(s,c,f,y)=>{if(u===void 0||!u.Cb)return 1;if((s=ke(s>>>0)).startsWith("./")&&(s=s.substring(2)),!(s=u.Cb.get(s)))return 2;if(y>>>=0,(c>>>=0)+(f>>>=0)>s.byteLength)return 3;try{return r().set(s.subarray(c,c+f),y>>>0),0}catch{return 4}},1336841:()=>{u.Rb()},1336872:()=>{u.Sb()},1336901:()=>{u.Wb()},1336926:s=>u.Qb(s),1336959:s=>u.Ub(s),1336991:(s,c,f)=>{u.Kb(s,c,f,!0)},1337030:(s,c,f)=>{u.Kb(s,c,f)},1337063:()=>typeof wasmOffsetConverter<"u",1337120:s=>{u.gb("Abs",s,void 0)},1337171:s=>{u.gb("Neg",s,void 0)},1337222:s=>{u.gb("Floor",s,void 0)},1337275:s=>{u.gb("Ceil",s,void 0)},1337327:s=>{u.gb("Reciprocal",s,void 0)},1337385:s=>{u.gb("Sqrt",s,void 0)},1337437:s=>{u.gb("Exp",s,void 0)},1337488:s=>{u.gb("Erf",s,void 0)},1337539:s=>{u.gb("Sigmoid",s,void 0)},1337594:(s,c,f)=>{u.gb("HardSigmoid",s,{alpha:c,beta:f})},1337673:s=>{u.gb("Log",s,void 0)},1337724:s=>{u.gb("Sin",s,void 0)},1337775:s=>{u.gb("Cos",s,void 0)},1337826:s=>{u.gb("Tan",s,void 0)},1337877:s=>{u.gb("Asin",s,void 0)},1337929:s=>{u.gb("Acos",s,void 0)},1337981:s=>{u.gb("Atan",s,void 0)},1338033:s=>{u.gb("Sinh",s,void 0)},1338085:s=>{u.gb("Cosh",s,void 0)},1338137:s=>{u.gb("Asinh",s,void 0)},1338190:s=>{u.gb("Acosh",s,void 0)},1338243:s=>{u.gb("Atanh",s,void 0)},1338296:s=>{u.gb("Tanh",s,void 0)},1338348:s=>{u.gb("Not",s,void 0)},1338399:(s,c,f)=>{u.gb("Clip",s,{min:c,max:f})},1338468:s=>{u.gb("Clip",s,void 0)},1338520:(s,c)=>{u.gb("Elu",s,{alpha:c})},1338578:s=>{u.gb("Relu",s,void 0)},1338630:(s,c)=>{u.gb("LeakyRelu",s,{alpha:c})},1338694:(s,c)=>{u.gb("ThresholdedRelu",s,{alpha:c})},1338764:(s,c)=>{u.gb("Cast",s,{to:c})},1338822:s=>{u.gb("Add",s,void 0)},1338873:s=>{u.gb("Sub",s,void 0)},1338924:s=>{u.gb("Mul",s,void 0)},1338975:s=>{u.gb("Div",s,void 0)},1339026:s=>{u.gb("Pow",s,void 0)},1339077:s=>{u.gb("Equal",s,void 0)},1339130:s=>{u.gb("Greater",s,void 0)},1339185:s=>{u.gb("GreaterOrEqual",s,void 0)},1339247:s=>{u.gb("Less",s,void 0)},1339299:s=>{u.gb("LessOrEqual",s,void 0)},1339358:(s,c,f,y,v)=>{u.gb("ReduceMean",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1339517:(s,c,f,y,v)=>{u.gb("ReduceMax",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1339675:(s,c,f,y,v)=>{u.gb("ReduceMin",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1339833:(s,c,f,y,v)=>{u.gb("ReduceProd",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1339992:(s,c,f,y,v)=>{u.gb("ReduceSum",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1340150:(s,c,f,y,v)=>{u.gb("ReduceL1",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1340307:(s,c,f,y,v)=>{u.gb("ReduceL2",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1340464:(s,c,f,y,v)=>{u.gb("ReduceLogSum",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1340625:(s,c,f,y,v)=>{u.gb("ReduceSumSquare",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1340789:(s,c,f,y,v)=>{u.gb("ReduceLogSumExp",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1340953:s=>{u.gb("Where",s,void 0)},1341006:(s,c,f)=>{u.gb("Transpose",s,{perm:c?Array.from(i().subarray(c>>>0,f>>>0)):[]})},1341114:(s,c,f,y)=>{u.gb("DepthToSpace",s,{blocksize:c,mode:ke(f),format:y?"NHWC":"NCHW"})},1341247:(s,c,f,y)=>{u.gb("DepthToSpace",s,{blocksize:c,mode:ke(f),format:y?"NHWC":"NCHW"})},1341380:(s,c,f,y,v,C,O,B,N,L,j,pe,fe,P,ee)=>{u.gb("ConvTranspose",s,{format:N?"NHWC":"NCHW",autoPad:c,dilations:[f],group:y,kernelShape:[v],pads:[C,O],strides:[B],wIsConst:()=>!!t()[L>>>0],outputPadding:j?Array.from(i().subarray(j>>>0,pe>>>0)):[],outputShape:fe?Array.from(i().subarray(fe>>>0,P>>>0)):[],activation:ke(ee)})},1341781:(s,c,f,y,v,C,O,B,N,L,j,pe,fe,P)=>{u.gb("ConvTranspose",s,{format:B?"NHWC":"NCHW",autoPad:c,dilations:Array.from(i().subarray(f>>>0,2+(f>>>0)>>>0)),group:y,kernelShape:Array.from(i().subarray(v>>>0,2+(v>>>0)>>>0)),pads:Array.from(i().subarray(C>>>0,4+(C>>>0)>>>0)),strides:Array.from(i().subarray(O>>>0,2+(O>>>0)>>>0)),wIsConst:()=>!!t()[N>>>0],outputPadding:L?Array.from(i().subarray(L>>>0,j>>>0)):[],outputShape:pe?Array.from(i().subarray(pe>>>0,fe>>>0)):[],activation:ke(P)})},1342346:(s,c,f,y,v,C,O,B,N,L,j,pe,fe,P,ee)=>{u.gb("ConvTranspose",s,{format:N?"NHWC":"NCHW",autoPad:c,dilations:[f],group:y,kernelShape:[v],pads:[C,O],strides:[B],wIsConst:()=>!!t()[L>>>0],outputPadding:j?Array.from(i().subarray(j>>>0,pe>>>0)):[],outputShape:fe?Array.from(i().subarray(fe>>>0,P>>>0)):[],activation:ke(ee)})},1342747:(s,c,f,y,v,C,O,B,N,L,j,pe,fe,P)=>{u.gb("ConvTranspose",s,{format:B?"NHWC":"NCHW",autoPad:c,dilations:Array.from(i().subarray(f>>>0,2+(f>>>0)>>>0)),group:y,kernelShape:Array.from(i().subarray(v>>>0,2+(v>>>0)>>>0)),pads:Array.from(i().subarray(C>>>0,4+(C>>>0)>>>0)),strides:Array.from(i().subarray(O>>>0,2+(O>>>0)>>>0)),wIsConst:()=>!!t()[N>>>0],outputPadding:L?Array.from(i().subarray(L>>>0,j>>>0)):[],outputShape:pe?Array.from(i().subarray(pe>>>0,fe>>>0)):[],activation:ke(P)})},1343312:(s,c)=>{u.gb("GlobalAveragePool",s,{format:c?"NHWC":"NCHW"})},1343403:(s,c,f,y,v,C,O,B,N,L,j,pe,fe,P,ee,ge)=>{u.gb("AveragePool",s,{format:ge?"NHWC":"NCHW",auto_pad:c,ceil_mode:f,count_include_pad:y,storage_order:v,dilations:[C,O],kernel_shape:[B,N],pads:[L,j,pe,fe],strides:[P,ee]})},1343687:(s,c)=>{u.gb("GlobalAveragePool",s,{format:c?"NHWC":"NCHW"})},1343778:(s,c,f,y,v,C,O,B,N,L,j,pe,fe,P,ee,ge)=>{u.gb("AveragePool",s,{format:ge?"NHWC":"NCHW",auto_pad:c,ceil_mode:f,count_include_pad:y,storage_order:v,dilations:[C,O],kernel_shape:[B,N],pads:[L,j,pe,fe],strides:[P,ee]})},1344062:(s,c)=>{u.gb("GlobalMaxPool",s,{format:c?"NHWC":"NCHW"})},1344149:(s,c,f,y,v,C,O,B,N,L,j,pe,fe,P,ee,ge)=>{u.gb("MaxPool",s,{format:ge?"NHWC":"NCHW",auto_pad:c,ceil_mode:f,count_include_pad:y,storage_order:v,dilations:[C,O],kernel_shape:[B,N],pads:[L,j,pe,fe],strides:[P,ee]})},1344429:(s,c)=>{u.gb("GlobalMaxPool",s,{format:c?"NHWC":"NCHW"})},1344516:(s,c,f,y,v,C,O,B,N,L,j,pe,fe,P,ee,ge)=>{u.gb("MaxPool",s,{format:ge?"NHWC":"NCHW",auto_pad:c,ceil_mode:f,count_include_pad:y,storage_order:v,dilations:[C,O],kernel_shape:[B,N],pads:[L,j,pe,fe],strides:[P,ee]})},1344796:(s,c,f,y,v)=>{u.gb("Gemm",s,{alpha:c,beta:f,transA:y,transB:v})},1344900:s=>{u.gb("MatMul",s,void 0)},1344954:(s,c,f,y)=>{u.gb("ArgMax",s,{keepDims:!!c,selectLastIndex:!!f,axis:y})},1345062:(s,c,f,y)=>{u.gb("ArgMin",s,{keepDims:!!c,selectLastIndex:!!f,axis:y})},1345170:(s,c)=>{u.gb("Softmax",s,{axis:c})},1345233:(s,c)=>{u.gb("Concat",s,{axis:c})},1345293:(s,c,f,y,v)=>{u.gb("Split",s,{axis:c,numOutputs:f,splitSizes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1345433:s=>{u.gb("Expand",s,void 0)},1345487:(s,c)=>{u.gb("Gather",s,{axis:Number(c)})},1345558:(s,c)=>{u.gb("GatherElements",s,{axis:Number(c)})},1345637:(s,c,f,y,v,C,O,B,N,L,j)=>{u.gb("Resize",s,{antialias:c,axes:f?Array.from(i().subarray(f>>>0,y>>>0)):[],coordinateTransformMode:ke(v),cubicCoeffA:C,excludeOutside:O,extrapolationValue:B,keepAspectRatioPolicy:ke(N),mode:ke(L),nearestMode:ke(j)})},1345983:(s,c,f,y,v,C,O)=>{u.gb("Slice",s,{starts:c?Array.from(i().subarray(c>>>0,f>>>0)):[],ends:y?Array.from(i().subarray(y>>>0,v>>>0)):[],axes:C?Array.from(i().subarray(C>>>0,O>>>0)):[]})},1346199:s=>{u.gb("Tile",s,void 0)},1346251:(s,c,f)=>{u.gb("InstanceNormalization",s,{epsilon:c,format:f?"NHWC":"NCHW"})},1346365:(s,c,f)=>{u.gb("InstanceNormalization",s,{epsilon:c,format:f?"NHWC":"NCHW"})},1346479:s=>{u.gb("Range",s,void 0)},1346532:(s,c)=>{u.gb("Einsum",s,{equation:ke(c)})},1346613:(s,c,f,y,v)=>{u.gb("Pad",s,{mode:c,value:f,pads:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1346740:(s,c,f,y,v,C)=>{u.gb("BatchNormalization",s,{epsilon:c,momentum:f,spatial:!!v,trainingMode:!!y,format:C?"NHWC":"NCHW"})},1346909:(s,c,f,y,v,C)=>{u.gb("BatchNormalization",s,{epsilon:c,momentum:f,spatial:!!v,trainingMode:!!y,format:C?"NHWC":"NCHW"})},1347078:(s,c,f)=>{u.gb("CumSum",s,{exclusive:Number(c),reverse:Number(f)})},1347175:(s,c,f,y,v,C,O,B,N)=>{u.gb("Attention",s,{numHeads:c,isUnidirectional:f,maskFilterValue:y,scale:v,doRotary:C,qkvHiddenSizes:O?Array.from(i().subarray(Number(B)>>>0,Number(B)+O>>>0)):[],pastPresentShareBuffer:!!N})},1347447:s=>{u.gb("BiasAdd",s,void 0)},1347502:s=>{u.gb("BiasSplitGelu",s,void 0)},1347563:s=>{u.gb("FastGelu",s,void 0)},1347619:(s,c,f,y,v,C,O,B,N,L,j,pe,fe,P,ee,ge)=>{u.gb("Conv",s,{format:pe?"NHWC":"NCHW",auto_pad:c,dilations:f?Array.from(i().subarray(f>>>0,y>>>0)):[],group:v,kernel_shape:C?Array.from(i().subarray(C>>>0,O>>>0)):[],pads:B?Array.from(i().subarray(B>>>0,N>>>0)):[],strides:L?Array.from(i().subarray(L>>>0,j>>>0)):[],w_is_const:()=>!!t()[fe>>>0],activation:ke(P),activation_params:ee?Array.from(l().subarray(ee>>>0,ge>>>0)):[]})},1348115:s=>{u.gb("Gelu",s,void 0)},1348167:(s,c,f,y)=>{u.gb("GroupQueryAttention",s,{numHeads:c,kvNumHeads:f,scale:y})},1348280:(s,c,f,y)=>{u.gb("LayerNormalization",s,{axis:c,epsilon:f,simplified:!!y})},1348391:(s,c,f,y)=>{u.gb("LayerNormalization",s,{axis:c,epsilon:f,simplified:!!y})},1348502:(s,c,f,y,v,C)=>{u.gb("MatMulNBits",s,{k:c,n:f,accuracyLevel:y,bits:v,blockSize:C})},1348629:(s,c,f,y,v,C)=>{u.gb("MultiHeadAttention",s,{numHeads:c,isUnidirectional:f,maskFilterValue:y,scale:v,doRotary:C})},1348788:(s,c)=>{u.gb("QuickGelu",s,{alpha:c})},1348852:(s,c,f,y,v)=>{u.gb("RotaryEmbedding",s,{interleaved:!!c,numHeads:f,rotaryEmbeddingDim:y,scale:v})},1348991:(s,c,f)=>{u.gb("SkipLayerNormalization",s,{epsilon:c,simplified:!!f})},1349093:s=>{u.Vb(s)},1349127:(s,c)=>u.Xb(s,c,u.Bb.Zb,u.Bb.errors),1349239:(s,c,f)=>{u.gb("SkipLayerNormalization",s,{epsilon:c,simplified:!!f})}};function Vl(s,c,f){return fi(async()=>{await u.Tb(s,c,f)})}function fn(s){this.name="ExitStatus",this.message=`Program terminated with exit(${s})`,this.status=s}var hn=s=>{s.terminate(),s.onmessage=()=>{}},Do=s=>{ct.length==0&&(Wo(),No(ct[0]));var c=ct.pop();if(!c)return 6;wt.push(c),Ze[s.xb]=c,c.xb=s.xb;var f={cmd:"run",start_routine:s.$b,arg:s.Mb,pthread_ptr:s.xb};return c.postMessage(f,s.ec),0},bt=0,_e=(s,c,...f)=>{for(var y=2*f.length,v=zn(),C=On(8*y),O=C>>>3,B=0;B>>0]=N)}return s=Ui(s,0,y,C,c),gr(v),s};function Bo(s){if(b)return _e(0,1,s);if(q=s,!(0{if(q=s,b)throw Ro(s),"unwind";Bo(s)},ct=[],wt=[],Mo=[],Ze={},Uo=s=>{var c=s.xb;delete Ze[c],ct.push(s),wt.splice(wt.indexOf(s),1),s.xb=0,Pn(c)};function Vo(){Mo.forEach(s=>s())}var No=s=>new Promise(c=>{s.onmessage=v=>{var C=(v=v.data).cmd;if(v.targetThread&&v.targetThread!=Rt()){var O=Ze[v.targetThread];O?O.postMessage(v,v.transferList):F(`Internal error! Worker sent a message "${C}" to target pthread ${v.targetThread}, but that thread no longer exists!`)}else C==="checkMailbox"?ar():C==="spawnThread"?Do(v):C==="cleanupThread"?Uo(Ze[v.thread]):C==="killThread"?(v=v.thread,C=Ze[v],delete Ze[v],hn(C),Pn(v),wt.splice(wt.indexOf(C),1),C.xb=0):C==="cancelThread"?Ze[v.thread].postMessage({cmd:"cancel"}):C==="loaded"?(s.loaded=!0,c(s)):C==="alert"?alert(`Thread ${v.threadId}: ${v.text}`):v.target==="setimmediate"?s.postMessage(v):C==="callHandler"?u[v.handler](...v.args):C&&F(`worker sent an unknown command ${C}`)},s.onerror=v=>{throw F(`worker sent an error! ${v.filename}:${v.lineno}: ${v.message}`),v};var f,y=[];for(f of["onExit"])u.hasOwnProperty(f)&&y.push(f);s.postMessage({cmd:"load",handlers:y,wasmMemory:X,wasmModule:xe})});function Wo(){var s=new Worker(new URL(import.meta.url),{type:"module",workerData:"em-pthread",name:"em-pthread"});ct.push(s)}var ir=s=>{for(;0{var s=Rt(),c=a()[s+52>>>2>>>0];s=a()[s+56>>>2>>>0],Ni(c,c-s),gr(c)},Wl=(s,c)=>{bt=0,s=Wi(s,c),0>>=0);throw c>>>=0,f>>>=0,a()[y.Fb+16>>>2>>>0]=0,a()[y.Fb+4>>>2>>>0]=c,a()[y.Fb+8>>>2>>>0]=f,s}function Ho(s,c,f,y){return b?_e(2,1,s,c,f,y):Go(s,c,f,y)}function Go(s,c,f,y){if(s>>>=0,c>>>=0,f>>>=0,y>>>=0,x===void 0)return F("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;var v=[];return b&&v.length===0?Ho(s,c,f,y):(s={$b:f,xb:s,Mb:y,ec:v},b?(s.Ib="spawnThread",postMessage(s,v),0):Do(s))}var Lo=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0,Fo=(s,c,f)=>{var y=(c>>>=0)+f;for(f=c;s[f]&&!(f>=y);)++f;if(16(v=(240&v)==224?(15&v)<<12|C<<6|O:(7&v)<<18|C<<12|O<<6|63&s[c++])?y+=String.fromCharCode(v):(v-=65536,y+=String.fromCharCode(55296|v>>10,56320|1023&v))}}else y+=String.fromCharCode(v)}return y},ke=(s,c)=>(s>>>=0)?Fo(r(),s,c):"";function qo(s,c,f){return b?_e(3,1,s,c,f):0}function Ko(s,c){if(b)return _e(4,1,s,c)}var yn=s=>{for(var c=0,f=0;f=y?c++:2047>=y?c+=2:55296<=y&&57343>=y?(c+=4,++f):c+=3}return c},jo=(s,c,f,y)=>{if(!(0>>=0;y=f+y-1;for(var C=0;C=O&&(O=65536+((1023&O)<<10)|1023&s.charCodeAt(++C)),127>=O){if(f>=y)break;c[f++>>>0]=O}else{if(2047>=O){if(f+1>=y)break;c[f++>>>0]=192|O>>6}else{if(65535>=O){if(f+2>=y)break;c[f++>>>0]=224|O>>12}else{if(f+3>=y)break;c[f++>>>0]=240|O>>18,c[f++>>>0]=128|O>>12&63}c[f++>>>0]=128|O>>6&63}c[f++>>>0]=128|63&O}}return c[f>>>0]=0,f-v},zt=(s,c,f)=>jo(s,r(),c,f);function Yo(s,c){if(b)return _e(5,1,s,c)}function Xo(s,c,f){if(b)return _e(6,1,s,c,f)}function Zo(s,c,f){return b?_e(7,1,s,c,f):0}function Qo(s,c){if(b)return _e(8,1,s,c)}function Jo(s,c,f){if(b)return _e(9,1,s,c,f)}function ei(s,c,f,y){if(b)return _e(10,1,s,c,f,y)}function ti(s,c,f,y){if(b)return _e(11,1,s,c,f,y)}function ri(s,c,f,y){if(b)return _e(12,1,s,c,f,y)}function ni(s){if(b)return _e(13,1,s)}function oi(s,c){if(b)return _e(14,1,s,c)}function ii(s,c,f){if(b)return _e(15,1,s,c,f)}var ai,pt,Ll=()=>{Gt("")},Qe=s=>{for(var c="";r()[s>>>0];)c+=ai[r()[s++>>>0]];return c},bn={},wn={},Fl={};function st(s,c,f={}){if(!("argPackAdvance"in c))throw new TypeError("registerType registeredInstance requires argPackAdvance");return function(y,v,C={}){var O=v.name;if(!y)throw new pt(`type "${O}" must have a positive integer typeid pointer`);if(wn.hasOwnProperty(y)){if(C.Ob)return;throw new pt(`Cannot register type '${O}' twice`)}wn[y]=v,delete Fl[y],bn.hasOwnProperty(y)&&(v=bn[y],delete bn[y],v.forEach(B=>B()))}(s,c,f)}var si=(s,c,f)=>{switch(c){case 1:return f?y=>t()[y>>>0]:y=>r()[y>>>0];case 2:return f?y=>n()[y>>>1>>>0]:y=>o()[y>>>1>>>0];case 4:return f?y=>i()[y>>>2>>>0]:y=>a()[y>>>2>>>0];case 8:return f?y=>R[y>>>3]:y=>Y[y>>>3];default:throw new TypeError(`invalid integer width (${c}): ${s}`)}};function ql(s,c,f){f>>>=0,st(s>>>=0,{name:c=Qe(c>>>0),fromWireType:y=>y,toWireType:function(y,v){if(typeof v!="bigint"&&typeof v!="number")throw v=v===null?"null":(y=typeof v)=="object"||y==="array"||y==="function"?v.toString():""+v,new TypeError(`Cannot convert "${v}" to ${this.name}`);return typeof v=="number"&&(v=BigInt(v)),v},argPackAdvance:mt,readValueFromPointer:si(c,f,c.indexOf("u")==-1),Ab:null})}var mt=8;function Kl(s,c,f,y){st(s>>>=0,{name:c=Qe(c>>>0),fromWireType:function(v){return!!v},toWireType:function(v,C){return C?f:y},argPackAdvance:mt,readValueFromPointer:function(v){return this.fromWireType(r()[v>>>0])},Ab:null})}var vn=[],ut=[];function $n(s){9<(s>>>=0)&&--ut[s+1]==0&&(ut[s]=void 0,vn.push(s))}var He=s=>{if(!s)throw new pt("Cannot use deleted val. handle = "+s);return ut[s]},Ge=s=>{switch(s){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:let c=vn.pop()||ut.length;return ut[c]=s,ut[c+1]=1,c}};function _n(s){return this.fromWireType(a()[s>>>2>>>0])}var jl={name:"emscripten::val",fromWireType:s=>{var c=He(s);return $n(s),c},toWireType:(s,c)=>Ge(c),argPackAdvance:mt,readValueFromPointer:_n,Ab:null};function Yl(s){return st(s>>>0,jl)}var Xl=(s,c)=>{switch(c){case 4:return function(f){return this.fromWireType(l()[f>>>2>>>0])};case 8:return function(f){return this.fromWireType(d()[f>>>3>>>0])};default:throw new TypeError(`invalid float width (${c}): ${s}`)}};function Zl(s,c,f){f>>>=0,st(s>>>=0,{name:c=Qe(c>>>0),fromWireType:y=>y,toWireType:(y,v)=>v,argPackAdvance:mt,readValueFromPointer:Xl(c,f),Ab:null})}function Ql(s,c,f,y,v){if(s>>>=0,f>>>=0,c=Qe(c>>>0),v===-1&&(v=4294967295),v=B=>B,y===0){var C=32-8*f;v=B=>B<>>C}var O=c.includes("unsigned")?function(B,N){return N>>>0}:function(B,N){return N};st(s,{name:c,fromWireType:v,toWireType:O,argPackAdvance:mt,readValueFromPointer:si(c,f,y!==0),Ab:null})}function Jl(s,c,f){function y(C){var O=a()[C>>>2>>>0];return C=a()[C+4>>>2>>>0],new v(t().buffer,C,O)}var v=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][c];st(s>>>=0,{name:f=Qe(f>>>0),fromWireType:y,argPackAdvance:mt,readValueFromPointer:y},{Ob:!0})}function ec(s,c){s>>>=0;var f=(c=Qe(c>>>0))==="std::string";st(s,{name:c,fromWireType:function(y){var v=a()[y>>>2>>>0],C=y+4;if(f)for(var O=C,B=0;B<=v;++B){var N=C+B;if(B==v||r()[N>>>0]==0){if(O=ke(O,N-O),L===void 0)var L=O;else L+=String.fromCharCode(0),L+=O;O=N+1}}else{for(L=Array(v),B=0;B>>0]);L=L.join("")}return et(y),L},toWireType:function(y,v){v instanceof ArrayBuffer&&(v=new Uint8Array(v));var C=typeof v=="string";if(!(C||v instanceof Uint8Array||v instanceof Uint8ClampedArray||v instanceof Int8Array))throw new pt("Cannot pass non-string to std::string");var O=f&&C?yn(v):v.length,B=fr(4+O+1),N=B+4;if(a()[B>>>2>>>0]=O,f&&C)zt(v,N,O+1);else if(C)for(C=0;C>>0]=L}else for(C=0;C>>0]=v[C];return y!==null&&y.push(et,B),B},argPackAdvance:mt,readValueFromPointer:_n,Ab(y){et(y)}})}var ui=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,tc=(s,c)=>{for(var f=s>>1,y=f+c/2;!(f>=y)&&o()[f>>>0];)++f;if(32<(f<<=1)-s&&ui)return ui.decode(r().slice(s,f));for(f="",y=0;!(y>=c/2);++y){var v=n()[s+2*y>>>1>>>0];if(v==0)break;f+=String.fromCharCode(v)}return f},rc=(s,c,f)=>{if(f??=2147483647,2>f)return 0;var y=c;f=(f-=2)<2*s.length?f/2:s.length;for(var v=0;v>>1>>>0]=C,c+=2}return n()[c>>>1>>>0]=0,c-y},nc=s=>2*s.length,oc=(s,c)=>{for(var f=0,y="";!(f>=c/4);){var v=i()[s+4*f>>>2>>>0];if(v==0)break;++f,65536<=v?(v-=65536,y+=String.fromCharCode(55296|v>>10,56320|1023&v)):y+=String.fromCharCode(v)}return y},ic=(s,c,f)=>{if(c>>>=0,f??=2147483647,4>f)return 0;var y=c;f=y+f-4;for(var v=0;v=C&&(C=65536+((1023&C)<<10)|1023&s.charCodeAt(++v)),i()[c>>>2>>>0]=C,(c+=4)+4>f)break}return i()[c>>>2>>>0]=0,c-y},ac=s=>{for(var c=0,f=0;f=y&&++f,c+=4}return c};function sc(s,c,f){if(s>>>=0,c>>>=0,f=Qe(f>>>=0),c===2)var y=tc,v=rc,C=nc,O=B=>o()[B>>>1>>>0];else c===4&&(y=oc,v=ic,C=ac,O=B=>a()[B>>>2>>>0]);st(s,{name:f,fromWireType:B=>{for(var N,L=a()[B>>>2>>>0],j=B+4,pe=0;pe<=L;++pe){var fe=B+4+pe*c;pe!=L&&O(fe)!=0||(j=y(j,fe-j),N===void 0?N=j:(N+=String.fromCharCode(0),N+=j),j=fe+c)}return et(B),N},toWireType:(B,N)=>{if(typeof N!="string")throw new pt(`Cannot pass non-string to C++ string type ${f}`);var L=C(N),j=fr(4+L+c);return a()[j>>>2>>>0]=L/c,v(N,j+4,L+c),B!==null&&B.push(et,j),j},argPackAdvance:mt,readValueFromPointer:_n,Ab(B){et(B)}})}function uc(s,c){st(s>>>=0,{Pb:!0,name:c=Qe(c>>>0),argPackAdvance:0,fromWireType:()=>{},toWireType:()=>{}})}var dc=()=>1;function lc(s){kn(s>>>0,!g,1,!w,131072,!1),Vo()}var di=s=>{if(!Te)try{if(s(),!(0>>=0,typeof Atomics.fc=="function"&&(Atomics.fc(i(),s>>>2,s).value.then(ar),s+=128,Atomics.store(i(),s>>>2,1))}var ar=()=>{var s=Rt();s&&(xn(s),di(Vi))};function cc(s,c){(s>>>=0)==c>>>0?setTimeout(ar):b?postMessage({targetThread:s,cmd:"checkMailbox"}):(s=Ze[s])&&s.postMessage({cmd:"checkMailbox"})}var Sn=[];function pc(s,c,f,y,v){for(c>>>=0,y/=2,Sn.length=y,f=v>>>0>>>3,v=0;v>>0];return(c?mn[c]:ep[s])(...Sn)}function mc(s){s>>>=0,b?postMessage({cmd:"cleanupThread",thread:s}):Uo(Ze[s])}function fc(s){}var In=(s,c)=>{var f=wn[s];if(f===void 0)throw s=Bi(s),f=Qe(s),et(s),new pt(`${c} has unknown type ${f}`);return f},li=(s,c,f)=>{var y=[];return s=s.toWireType(y,f),y.length&&(a()[c>>>2>>>0]=Ge(y)),s};function hc(s,c,f){return c>>>=0,f>>>=0,s=He(s>>>0),c=In(c,"emval::as"),li(c,f,s)}var sr=s=>{try{s()}catch(c){Gt(c)}},ft=0,Je=null,ci=0,ur=[],pi={},mi={},gc=0,Cn=null,yc=[];function fi(s){return function(c){if(!Te){if(ft===0){var f=!1,y=!1;c((v=0)=>{if(!Te&&(ci=v,f=!0,y)){ft=2,sr(()=>Li(Je)),typeof Browser<"u"&&Browser.Gb.Nb&&Browser.Gb.resume(),v=!1;try{var C=function(){var N=i()[Je+8>>>2>>>0];return N=K[mi[N]],--bt,N()}()}catch(N){C=N,v=!0}var O=!1;if(!Je){var B=Cn;B&&(Cn=null,(v?B.reject:B.resolve)(C),O=!0)}if(v&&!O)throw C}}),y=!0,f||(ft=1,Je=function(){var v=fr(65548),C=v+12;a()[v>>>2>>>0]=C,a()[v+4>>>2>>>0]=C+65536,C=ur[0];var O=pi[C];return O===void 0&&(O=gc++,pi[C]=O,mi[O]=C),C=O,i()[v+8>>>2>>>0]=C,v}(),typeof Browser<"u"&&Browser.Gb.Nb&&Browser.Gb.pause(),sr(()=>Hi(Je)))}else ft===2?(ft=0,sr(Fi),et(Je),Je=null,yc.forEach(di)):Gt(`invalid state: ${ft}`);return ci}}(c=>{s().then(c)})}function bc(s){return s>>>=0,fi(()=>(s=He(s)).then(Ge))}var dr=[];function wc(s,c,f,y){return f>>>=0,y>>>=0,(s=dr[s>>>0])(null,c=He(c>>>0),f,y)}var vc={},lr=s=>{var c=vc[s];return c===void 0?Qe(s):c};function $c(s,c,f,y,v){return f>>>=0,y>>>=0,v>>>=0,(s=dr[s>>>0])(c=He(c>>>0),c[f=lr(f)],y,v)}var hi=()=>typeof globalThis=="object"?globalThis:Function("return this")();function _c(s){return(s>>>=0)==0?Ge(hi()):(s=lr(s),Ge(hi()[s]))}var xc=s=>{var c=dr.length;return dr.push(s),c},Sc=(s,c)=>{for(var f=Array(s),y=0;y>>2>>>0],"parameter "+y);return f},gi=(s,c)=>Object.defineProperty(c,"name",{value:s});function Ic(s,c,f){var y=(c=Sc(s,c>>>0)).shift();s--;var v=`return function (obj, func, destructorsRef, args) { +var Bn=Object.defineProperty;var np=Object.getOwnPropertyDescriptor;var op=Object.getOwnPropertyNames;var ip=Object.prototype.hasOwnProperty;var Rn=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var U=(e,t)=>()=>(e&&(t=e(e=0)),t);var Lt=(e,t)=>{for(var r in t)Bn(e,r,{get:t[r],enumerable:!0})},ap=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of op(t))!ip.call(e,o)&&o!==r&&Bn(e,o,{get:()=>t[o],enumerable:!(n=np(t,o))||n.enumerable});return e};var yr=e=>ap(Bn({},"__esModule",{value:!0}),e);var br,$t,_t,sp,wr,vr=U(()=>{"use strict";br=new Map,$t=[],_t=(e,t,r)=>{if(t&&typeof t.init=="function"&&typeof t.createInferenceSessionHandler=="function"){let n=br.get(e);if(n===void 0)br.set(e,{backend:t,priority:r});else{if(n.priority>r)return;if(n.priority===r&&n.backend!==t)throw new Error(`cannot register backend "${e}" using priority ${r}`)}if(r>=0){let o=$t.indexOf(e);o!==-1&&$t.splice(o,1);for(let i=0;i<$t.length;i++)if(br.get($t[i]).priority<=r){$t.splice(i,0,e);return}$t.push(e)}return}throw new TypeError("not a valid backend")},sp=async e=>{let t=br.get(e);if(!t)return"backend not found.";if(t.initialized)return t.backend;if(t.aborted)return t.error;{let r=!!t.initPromise;try{return r||(t.initPromise=t.backend.init(e)),await t.initPromise,t.initialized=!0,t.backend}catch(n){return r||(t.error=`${n}`,t.aborted=!0),t.error}finally{delete t.initPromise}}},wr=async e=>{let t=e.executionProviders||[],r=t.map(d=>typeof d=="string"?d:d.name),n=r.length===0?$t:r,o,i=[],a=new Set;for(let d of n){let p=await sp(d);typeof p=="string"?i.push({name:d,err:p}):(o||(o=p),o===p&&a.add(d))}if(!o)throw new Error(`no available backend found. ERR: ${i.map(d=>`[${d.name}] ${d.err}`).join(", ")}`);for(let{name:d,err:p}of i)r.includes(d)&&console.warn(`removing requested execution provider "${d}" from session options because it is not available: ${p}`);let l=t.filter(d=>a.has(typeof d=="string"?d:d.name));return[o,new Proxy(e,{get:(d,p)=>p==="executionProviders"?l:Reflect.get(d,p)})]}});var Ki=U(()=>{"use strict";vr()});var Yi,Xi=U(()=>{"use strict";Yi="1.19.0"});var Zi,Ne,Mn=U(()=>{"use strict";Xi();Zi="warning",Ne={wasm:{},webgl:{},webgpu:{},versions:{common:Yi},set logLevel(e){if(e!==void 0){if(typeof e!="string"||["verbose","info","warning","error","fatal"].indexOf(e)===-1)throw new Error(`Unsupported logging level: ${e}`);Zi=e}},get logLevel(){return Zi}};Object.defineProperty(Ne,"logLevel",{enumerable:!0})});var ye,Qi=U(()=>{"use strict";Mn();ye=Ne});var Ji,ea,ta=U(()=>{"use strict";Ji=(e,t)=>{let r=typeof document<"u"?document.createElement("canvas"):new OffscreenCanvas(1,1);r.width=e.dims[3],r.height=e.dims[2];let n=r.getContext("2d");if(n!=null){let o,i;t?.tensorLayout!==void 0&&t.tensorLayout==="NHWC"?(o=e.dims[2],i=e.dims[3]):(o=e.dims[3],i=e.dims[2]);let a=t?.format!==void 0?t.format:"RGB",l=t?.norm,d,p;l===void 0||l.mean===void 0?d=[255,255,255,255]:typeof l.mean=="number"?d=[l.mean,l.mean,l.mean,l.mean]:(d=[l.mean[0],l.mean[1],l.mean[2],0],l.mean[3]!==void 0&&(d[3]=l.mean[3])),l===void 0||l.bias===void 0?p=[0,0,0,0]:typeof l.bias=="number"?p=[l.bias,l.bias,l.bias,l.bias]:(p=[l.bias[0],l.bias[1],l.bias[2],0],l.bias[3]!==void 0&&(p[3]=l.bias[3]));let m=i*o,u=0,h=m,w=m*2,g=-1;a==="RGBA"?(u=0,h=m,w=m*2,g=m*3):a==="RGB"?(u=0,h=m,w=m*2):a==="RBG"&&(u=0,w=m,h=m*2);for(let b=0;b{let r=typeof document<"u"?document.createElement("canvas").getContext("2d"):new OffscreenCanvas(1,1).getContext("2d"),n;if(r!=null){let o,i,a;t?.tensorLayout!==void 0&&t.tensorLayout==="NHWC"?(o=e.dims[2],i=e.dims[1],a=e.dims[3]):(o=e.dims[3],i=e.dims[2],a=e.dims[1]);let l=t!==void 0&&t.format!==void 0?t.format:"RGB",d=t?.norm,p,m;d===void 0||d.mean===void 0?p=[255,255,255,255]:typeof d.mean=="number"?p=[d.mean,d.mean,d.mean,d.mean]:(p=[d.mean[0],d.mean[1],d.mean[2],255],d.mean[3]!==void 0&&(p[3]=d.mean[3])),d===void 0||d.bias===void 0?m=[0,0,0,0]:typeof d.bias=="number"?m=[d.bias,d.bias,d.bias,d.bias]:(m=[d.bias[0],d.bias[1],d.bias[2],0],d.bias[3]!==void 0&&(m[3]=d.bias[3]));let u=i*o;if(t!==void 0&&(t.format!==void 0&&a===4&&t.format!=="RGBA"||a===3&&t.format!=="RGB"&&t.format!=="BGR"))throw new Error("Tensor format doesn't match input tensor dims");let h=4,w=0,g=1,b=2,x=3,_=0,$=u,S=u*2,I=-1;l==="RGBA"?(_=0,$=u,S=u*2,I=u*3):l==="RGB"?(_=0,$=u,S=u*2):l==="RBG"&&(_=0,S=u,$=u*2),n=r.createImageData(o,i);for(let T=0;T{"use strict";$r();Un=(e,t)=>{if(e===void 0)throw new Error("Image buffer must be defined");if(t.height===void 0||t.width===void 0)throw new Error("Image height and width must be defined");if(t.tensorLayout==="NHWC")throw new Error("NHWC Tensor layout is not supported yet");let{height:r,width:n}=t,o=t.norm??{mean:255,bias:0},i,a;typeof o.mean=="number"?i=[o.mean,o.mean,o.mean,o.mean]:i=[o.mean[0],o.mean[1],o.mean[2],o.mean[3]??255],typeof o.bias=="number"?a=[o.bias,o.bias,o.bias,o.bias]:a=[o.bias[0],o.bias[1],o.bias[2],o.bias[3]??0];let l=t.format!==void 0?t.format:"RGBA",d=t.tensorFormat!==void 0&&t.tensorFormat!==void 0?t.tensorFormat:"RGB",p=r*n,m=d==="RGBA"?new Float32Array(p*4):new Float32Array(p*3),u=4,h=0,w=1,g=2,b=3,x=0,_=p,$=p*2,S=-1;l==="RGB"&&(u=3,h=0,w=1,g=2,b=-1),d==="RGBA"?S=p*3:d==="RBG"?(x=0,$=p,_=p*2):d==="BGR"&&($=0,_=p,x=p*2);for(let T=0;T{let r=typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement,n=typeof ImageData<"u"&&e instanceof ImageData,o=typeof ImageBitmap<"u"&&e instanceof ImageBitmap,i=typeof e=="string",a,l=t??{},d=()=>{if(typeof document<"u")return document.createElement("canvas");if(typeof OffscreenCanvas<"u")return new OffscreenCanvas(1,1);throw new Error("Canvas is not supported")},p=m=>m instanceof HTMLCanvasElement||m instanceof OffscreenCanvas?m.getContext("2d"):null;if(r){let m=d();m.width=e.width,m.height=e.height;let u=p(m);if(u!=null){let h=e.height,w=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(h=t.resizedHeight,w=t.resizedWidth),t!==void 0){if(l=t,t.tensorFormat!==void 0)throw new Error("Image input config format must be RGBA for HTMLImageElement");l.tensorFormat="RGBA",l.height=h,l.width=w}else l.tensorFormat="RGBA",l.height=h,l.width=w;u.drawImage(e,0,0),a=u.getImageData(0,0,w,h).data}else throw new Error("Can not access image data")}else if(n){let m,u;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(m=t.resizedHeight,u=t.resizedWidth):(m=e.height,u=e.width),t!==void 0&&(l=t),l.format="RGBA",l.height=m,l.width=u,t!==void 0){let h=d();h.width=u,h.height=m;let w=p(h);if(w!=null)w.putImageData(e,0,0),a=w.getImageData(0,0,u,m).data;else throw new Error("Can not access image data")}else a=e.data}else if(o){if(t===void 0)throw new Error("Please provide image config with format for Imagebitmap");let m=d();m.width=e.width,m.height=e.height;let u=p(m);if(u!=null){let h=e.height,w=e.width;return u.drawImage(e,0,0,w,h),a=u.getImageData(0,0,w,h).data,l.height=h,l.width=w,Un(a,l)}else throw new Error("Can not access image data")}else{if(i)return new Promise((m,u)=>{let h=d(),w=p(h);if(!e||!w)return u();let g=new Image;g.crossOrigin="Anonymous",g.src=e,g.onload=()=>{h.width=g.width,h.height=g.height,w.drawImage(g,0,0,h.width,h.height);let b=w.getImageData(0,0,h.width,h.height);l.height=h.height,l.width=h.width,m(Un(b.data,l))}});throw new Error("Input data provided is not supported - aborted tensor creation")}if(a!==void 0)return Un(a,l);throw new Error("Input data provided is not supported - aborted tensor creation")},na=(e,t)=>{let{width:r,height:n,download:o,dispose:i}=t,a=[1,n,r,4];return new Re({location:"texture",type:"float32",texture:e,dims:a,download:o,dispose:i})},oa=(e,t)=>{let{dataType:r,dims:n,download:o,dispose:i}=t;return new Re({location:"gpu-buffer",type:r??"float32",gpuBuffer:e,dims:n,download:o,dispose:i})},ia=(e,t,r)=>new Re({location:"cpu-pinned",type:e,data:t,dims:r??[t.length]})});var xt,Ft,sa,ua,da=U(()=>{"use strict";xt=new Map([["float32",Float32Array],["uint8",Uint8Array],["int8",Int8Array],["uint16",Uint16Array],["int16",Int16Array],["int32",Int32Array],["bool",Uint8Array],["float64",Float64Array],["uint32",Uint32Array]]),Ft=new Map([[Float32Array,"float32"],[Uint8Array,"uint8"],[Int8Array,"int8"],[Uint16Array,"uint16"],[Int16Array,"int16"],[Int32Array,"int32"],[Float64Array,"float64"],[Uint32Array,"uint32"]]),sa=!1,ua=()=>{if(!sa){sa=!0;let e=typeof BigInt64Array<"u"&&BigInt64Array.from,t=typeof BigUint64Array<"u"&&BigUint64Array.from,r=typeof Float16Array<"u"&&Float16Array.from;e&&(xt.set("int64",BigInt64Array),Ft.set(BigInt64Array,"int64")),t&&(xt.set("uint64",BigUint64Array),Ft.set(BigUint64Array,"uint64")),r?(xt.set("float16",Float16Array),Ft.set(Float16Array,"float16")):xt.set("float16",Uint16Array)}}});var la,ca,pa=U(()=>{"use strict";$r();la=e=>{let t=1;for(let r=0;r{switch(e.location){case"cpu":return new Re(e.type,e.data,t);case"cpu-pinned":return new Re({location:"cpu-pinned",data:e.data,type:e.type,dims:t});case"texture":return new Re({location:"texture",texture:e.texture,type:e.type,dims:t});case"gpu-buffer":return new Re({location:"gpu-buffer",gpuBuffer:e.gpuBuffer,type:e.type,dims:t});default:throw new Error(`tensorReshape: tensor location ${e.location} is not supported`)}}});var Re,$r=U(()=>{"use strict";ta();aa();da();pa();Re=class{constructor(t,r,n){ua();let o,i;if(typeof t=="object"&&"location"in t)switch(this.dataLocation=t.location,o=t.type,i=t.dims,t.location){case"cpu-pinned":{let l=xt.get(o);if(!l)throw new TypeError(`unsupported type "${o}" to create tensor from pinned buffer`);if(!(t.data instanceof l))throw new TypeError(`buffer should be of type ${l.name}`);this.cpuData=t.data;break}case"texture":{if(o!=="float32")throw new TypeError(`unsupported type "${o}" to create tensor from texture`);this.gpuTextureData=t.texture,this.downloader=t.download,this.disposer=t.dispose;break}case"gpu-buffer":{if(o!=="float32"&&o!=="float16"&&o!=="int32"&&o!=="int64"&&o!=="uint32"&&o!=="uint8"&&o!=="bool")throw new TypeError(`unsupported type "${o}" to create tensor from gpu buffer`);this.gpuBufferData=t.gpuBuffer,this.downloader=t.download,this.disposer=t.dispose;break}default:throw new Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let l,d;if(typeof t=="string")if(o=t,d=n,t==="string"){if(!Array.isArray(r))throw new TypeError("A string tensor's data must be a string array.");l=r}else{let p=xt.get(t);if(p===void 0)throw new TypeError(`Unsupported tensor type: ${t}.`);if(Array.isArray(r)){if(t==="float16"&&p===Uint16Array)throw new TypeError("Creating a float16 tensor from number array is not supported. Please use Uint16Array as data.");t==="uint64"||t==="int64"?l=p.from(r,BigInt):l=p.from(r)}else if(r instanceof p)l=r;else throw new TypeError(`A ${o} tensor's data must be type of ${p}`)}else if(d=r,Array.isArray(t)){if(t.length===0)throw new TypeError("Tensor type cannot be inferred from an empty array.");let p=typeof t[0];if(p==="string")o="string",l=t;else if(p==="boolean")o="bool",l=Uint8Array.from(t);else throw new TypeError(`Invalid element type of data array: ${p}.`)}else{let p=Ft.get(t.constructor);if(p===void 0)throw new TypeError(`Unsupported type for tensor data: ${t.constructor}.`);o=p,l=t}if(d===void 0)d=[l.length];else if(!Array.isArray(d))throw new TypeError("A tensor's dims must be a number array");i=d,this.cpuData=l,this.dataLocation="cpu"}let a=la(i);if(this.cpuData&&a!==this.cpuData.length)throw new Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=o,this.dims=i,this.size=a}static async fromImage(t,r){return ra(t,r)}static fromTexture(t,r){return na(t,r)}static fromGpuBuffer(t,r){return oa(t,r)}static fromPinnedBuffer(t,r,n){return ia(t,r,n)}toDataURL(t){return Ji(this,t)}toImageData(t){return ea(this,t)}get data(){if(this.ensureValid(),!this.cpuData)throw new Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw new Error("The data is not stored as a WebGL texture.");return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw new Error("The data is not stored as a WebGPU buffer.");return this.gpuBufferData}async getData(t){switch(this.ensureValid(),this.dataLocation){case"cpu":case"cpu-pinned":return this.data;case"texture":case"gpu-buffer":{if(!this.downloader)throw new Error("The current tensor is not created with a specified data downloader.");if(this.isDownloading)throw new Error("The current tensor is being downloaded.");try{this.isDownloading=!0;let r=await this.downloader();return this.downloader=void 0,this.dataLocation="cpu",this.cpuData=r,t&&this.disposer&&(this.disposer(),this.disposer=void 0),r}finally{this.isDownloading=!1}}default:throw new Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw new Error("The current tensor is being downloaded.");this.disposer&&(this.disposer(),this.disposer=void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation="none"}ensureValid(){if(this.dataLocation==="none")throw new Error("The tensor is disposed.")}reshape(t){if(this.ensureValid(),this.downloader||this.disposer)throw new Error("Cannot reshape a tensor that owns GPU resource.");return ca(this,t)}}});var De,_r=U(()=>{"use strict";$r();De=Re});var xr,ma,We,Me,Vn=U(()=>{"use strict";Mn();xr=(e,t)=>{(typeof Ne.trace>"u"?!Ne.wasm.trace:!Ne.trace)||console.timeStamp(`${e}::ORT::${t}`)},ma=(e,t)=>{let r=new Error().stack?.split(/\r\n|\r|\n/g)||[],n=!1;for(let o=0;o{(typeof Ne.trace>"u"?!Ne.wasm.trace:!Ne.trace)||ma("BEGIN",e)},Me=e=>{(typeof Ne.trace>"u"?!Ne.wasm.trace:!Ne.trace)||ma("END",e)}});var Sr,fa=U(()=>{"use strict";vr();_r();Vn();Sr=class e{constructor(t){this.handler=t}async run(t,r,n){We();let o={},i={};if(typeof t!="object"||t===null||t instanceof De||Array.isArray(t))throw new TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let a=!0;if(typeof r=="object"){if(r===null)throw new TypeError("Unexpected argument[1]: cannot be null.");if(r instanceof De)throw new TypeError("'fetches' cannot be a Tensor");if(Array.isArray(r)){if(r.length===0)throw new TypeError("'fetches' cannot be an empty array.");a=!1;for(let p of r){if(typeof p!="string")throw new TypeError("'fetches' must be a string array or an object.");if(this.outputNames.indexOf(p)===-1)throw new RangeError(`'fetches' contains invalid output name: ${p}.`);o[p]=null}if(typeof n=="object"&&n!==null)i=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else{let p=!1,m=Object.getOwnPropertyNames(r);for(let u of this.outputNames)if(m.indexOf(u)!==-1){let h=r[u];(h===null||h instanceof De)&&(p=!0,a=!1,o[u]=h)}if(p){if(typeof n=="object"&&n!==null)i=n;else if(typeof n<"u")throw new TypeError("'options' must be an object.")}else i=r}}else if(typeof r<"u")throw new TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let p of this.inputNames)if(typeof t[p]>"u")throw new Error(`input '${p}' is missing in 'feeds'.`);if(a)for(let p of this.outputNames)o[p]=null;let l=await this.handler.run(t,o,i),d={};for(let p in l)if(Object.hasOwnProperty.call(l,p)){let m=l[p];m instanceof De?d[p]=m:d[p]=new De(m.type,m.data,m.dims)}return Me(),d}async release(){return this.handler.dispose()}static async create(t,r,n,o){We();let i,a={};if(typeof t=="string"){if(i=t,typeof r=="object"&&r!==null)a=r;else if(typeof r<"u")throw new TypeError("'options' must be an object.")}else if(t instanceof Uint8Array){if(i=t,typeof r=="object"&&r!==null)a=r;else if(typeof r<"u")throw new TypeError("'options' must be an object.")}else if(t instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&t instanceof SharedArrayBuffer){let m=t,u=0,h=t.byteLength;if(typeof r=="object"&&r!==null)a=r;else if(typeof r=="number"){if(u=r,!Number.isSafeInteger(u))throw new RangeError("'byteOffset' must be an integer.");if(u<0||u>=m.byteLength)throw new RangeError(`'byteOffset' is out of range [0, ${m.byteLength}).`);if(h=t.byteLength-u,typeof n=="number"){if(h=n,!Number.isSafeInteger(h))throw new RangeError("'byteLength' must be an integer.");if(h<=0||u+h>m.byteLength)throw new RangeError(`'byteLength' is out of range (0, ${m.byteLength-u}].`);if(typeof o=="object"&&o!==null)a=o;else if(typeof o<"u")throw new TypeError("'options' must be an object.")}else if(typeof n<"u")throw new TypeError("'byteLength' must be a number.")}else if(typeof r<"u")throw new TypeError("'options' must be an object.");i=new Uint8Array(m,u,h)}else throw new TypeError("Unexpected argument[0]: must be 'path' or 'buffer'.");let[l,d]=await wr(a),p=await l.createInferenceSessionHandler(i,d);return Me(),new e(p)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}}});var up,ha=U(()=>{"use strict";fa();up=Sr});var ga=U(()=>{"use strict"});var ya=U(()=>{"use strict"});var ba=U(()=>{"use strict"});var wa=U(()=>{"use strict"});var dp,Ir,va=U(()=>{"use strict";vr();_r();dp="Training backend could not be resolved. Make sure you're using the correct configuration & WebAssembly files.",Ir=class e{constructor(t,r,n){this.handler=t,this.hasOptimizerModel=r,this.hasEvalModel=n}get trainingInputNames(){return this.handler.inputNames}get trainingOutputNames(){return this.handler.outputNames}get evalInputNames(){if(this.hasEvalModel)return this.handler.evalInputNames;throw new Error("This training session has no evalModel loaded.")}get evalOutputNames(){if(this.hasEvalModel)return this.handler.evalOutputNames;throw new Error("This training session has no evalModel loaded.")}static async create(t,r){let n=t.evalModel||"",o=t.optimizerModel||"",i=r||{},[a,l]=await wr(i);if(a.createTrainingSessionHandler){let d=await a.createTrainingSessionHandler(t.checkpointState,t.trainModel,n,o,l);return new e(d,!!t.optimizerModel,!!t.evalModel)}else throw new Error(dp)}typeNarrowingForRunStep(t,r,n,o,i){let a={},l={};if(typeof n!="object"||n===null||n instanceof De||Array.isArray(n))throw new TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let d=!0;if(typeof o=="object"){if(o===null)throw new TypeError("Unexpected argument[1]: cannot be null.");if(o instanceof De)throw new TypeError("'fetches' cannot be a Tensor");if(Array.isArray(o)){if(o.length===0)throw new TypeError("'fetches' cannot be an empty array.");d=!1;for(let p of o){if(typeof p!="string")throw new TypeError("'fetches' must be a string array or an object.");if(r.indexOf(p)===-1)throw new RangeError(`'fetches' contains invalid output name: ${p}.`);a[p]=null}if(typeof i=="object"&&i!==null)l=i;else if(typeof i<"u")throw new TypeError("'options' must be an object.")}else{let p=!1,m=Object.getOwnPropertyNames(o);for(let u of r)if(m.indexOf(u)!==-1){let h=o[u];(h===null||h instanceof De)&&(p=!0,d=!1,a[u]=h)}if(p){if(typeof i=="object"&&i!==null)l=i;else if(typeof i<"u")throw new TypeError("'options' must be an object.")}else l=o}}else if(typeof o<"u")throw new TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let p of t)if(typeof n[p]>"u")throw new Error(`input '${p}' is missing in 'feeds'.`);if(d)for(let p of r)a[p]=null;return[a,l]}convertHandlerReturnTypeToMapOfTensors(t){let r={};for(let n in t)if(Object.hasOwnProperty.call(t,n)){let o=t[n];o instanceof De?r[n]=o:r[n]=new De(o.type,o.data,o.dims)}return r}async lazyResetGrad(){await this.handler.lazyResetGrad()}async runTrainStep(t,r,n){let[o,i]=this.typeNarrowingForRunStep(this.trainingInputNames,this.trainingOutputNames,t,r,n),a=await this.handler.runTrainStep(t,o,i);return this.convertHandlerReturnTypeToMapOfTensors(a)}async runOptimizerStep(t){if(this.hasOptimizerModel)await this.handler.runOptimizerStep(t||{});else throw new Error("This TrainingSession has no OptimizerModel loaded.")}async runEvalStep(t,r,n){if(this.hasEvalModel){let[o,i]=this.typeNarrowingForRunStep(this.evalInputNames,this.evalOutputNames,t,r,n),a=await this.handler.runEvalStep(t,o,i);return this.convertHandlerReturnTypeToMapOfTensors(a)}else throw new Error("This TrainingSession has no EvalModel loaded.")}async getParametersSize(t=!0){return this.handler.getParametersSize(t)}async loadParametersBuffer(t,r=!0){let n=await this.getParametersSize(r);if(t.length!==4*n)throw new Error("Size of the buffer passed into loadParametersBuffer must match the number of parameters in the model. Please use getParametersSize method to check.");return this.handler.loadParametersBuffer(t,r)}async getContiguousParameters(t=!0){return this.handler.getContiguousParameters(t)}async release(){return this.handler.dispose()}}});var lp,$a=U(()=>{"use strict";va();lp=Ir});var Nn={};Lt(Nn,{InferenceSession:()=>up,TRACE:()=>xr,TRACE_FUNC_BEGIN:()=>We,TRACE_FUNC_END:()=>Me,Tensor:()=>De,TrainingSession:()=>lp,env:()=>ye,registerBackend:()=>_t});var Le=U(()=>{"use strict";Ki();Qi();ha();_r();ga();ya();Vn();ba();wa();$a()});var Cr=U(()=>{"use strict"});var Ia={};Lt(Ia,{default:()=>cp});var xa,Sa,cp,Ca=U(()=>{"use strict";Wn();St();qt();xa="ort-wasm-proxy-worker",Sa=globalThis.self?.name===xa;Sa&&(self.onmessage=e=>{let{type:t,in:r}=e.data;try{switch(t){case"init-wasm":Tr(r.wasm).then(()=>{Ar(r).then(()=>{postMessage({type:t})},n=>{postMessage({type:t,err:n})})},n=>{postMessage({type:t,err:n})});break;case"init-ep":{let{epName:n,env:o}=r;Er(o,n).then(()=>{postMessage({type:t})},i=>{postMessage({type:t,err:i})});break}case"copy-from":{let{buffer:n}=r,o=jt(n);postMessage({type:t,out:o});break}case"create":{let{model:n,options:o}=r;kr(n,o).then(i=>{postMessage({type:t,out:i})},i=>{postMessage({type:t,err:i})});break}case"release":Pr(r),postMessage({type:t});break;case"run":{let{sessionId:n,inputIndices:o,inputs:i,outputIndices:a,options:l}=r;Or(n,o,i,a,new Array(a.length).fill(null),l).then(d=>{d.some(p=>p[3]!=="cpu")?postMessage({type:t,err:"Proxy does not support non-cpu tensor location."}):postMessage({type:t,out:d},zr([...i,...d]))},d=>{postMessage({type:t,err:d})});break}case"end-profiling":Dr(r),postMessage({type:t});break;default:}}catch(n){postMessage({type:t,err:n})}});cp=Sa?null:e=>new Worker(e??Ut,{type:"module",name:xa})});var Aa={};Lt(Aa,{default:()=>pp});var Hn,Ta,pp,Ea=U(()=>{"use strict";Ta=(Hn=import.meta.url,async function(e={}){function t(){return X.buffer!=ie.buffer&&ve(),ie}function r(){return X.buffer!=ie.buffer&&ve(),le}function n(){return X.buffer!=ie.buffer&&ve(),se}function o(){return X.buffer!=ie.buffer&&ve(),Z}function i(){return X.buffer!=ie.buffer&&ve(),re}function a(){return X.buffer!=ie.buffer&&ve(),J}function l(){return X.buffer!=ie.buffer&&ve(),Pe}function d(){return X.buffer!=ie.buffer&&ve(),ue}var p,m,u=Object.assign({},e),h=new Promise((s,c)=>{p=s,m=c}),w=typeof window=="object",g=typeof importScripts=="function",b=g&&self.name=="em-pthread";u.mountExternalData=(s,c)=>{(u.Fb||(u.Fb=new Map)).set(s,c)},u.unmountExternalData=()=>{delete u.Fb};var x=globalThis.SharedArrayBuffer??new WebAssembly.Memory({initial:0,maximum:0,shared:!0}).buffer.constructor;let _=()=>{let s=(f,y,v)=>(...C)=>{let O=Je,B=y?.();C=f(...C);let N=y?.();return B!==N&&(f=N,v(B),y=v=null),Je!=O?new Promise((L,K)=>{Tn={resolve:L,reject:K}}):C},c=f=>async(...y)=>{try{if(u.Eb)throw Error("Session already started");let v=u.Eb={bc:y[0],errors:[]},C=await f(...y);if(u.Eb!==v)throw Error("Session mismatch");u.Mb?.flush();let O=v.errors;if(0N),0u._OrtCreateSession,f=>u._OrtCreateSession=f),u._OrtRun=c(s(u._OrtRun,()=>u._OrtRun,f=>u._OrtRun=f)),u._OrtRunWithBinding=c(s(u._OrtRunWithBinding,()=>u._OrtRunWithBinding,f=>u._OrtRunWithBinding=f)),u._OrtBindInput=s(u._OrtBindInput,()=>u._OrtBindInput,f=>u._OrtBindInput=f),_=void 0};u.jsepInit=(s,c)=>{if(_?.(),s==="webgpu"){[u.Mb,u.Tb,u.Xb,u.Nb,u.Wb,u.jb,u.Yb,u.$b,u.Ub,u.Vb,u.Zb]=c;let f=u.Mb;u.jsepRegisterBuffer=(y,v,C,O)=>f.registerBuffer(y,v,C,O),u.jsepGetBuffer=y=>f.getBuffer(y),u.jsepCreateDownloader=(y,v,C)=>f.createDownloader(y,v,C),u.jsepOnReleaseSession=y=>{f.onReleaseSession(y)},u.jsepOnRunStart=y=>f.onRunStart(y)}};var $,S,I=Object.assign({},u),T="./this.program",A=(s,c)=>{throw c},D="";(w||g)&&(g?D=self.location.href:typeof document<"u"&&document.currentScript&&(D=document.currentScript.src),Hn&&(D=Hn),D=D.startsWith("blob:")?"":D.substr(0,D.replace(/[?#].*/,"").lastIndexOf("/")+1),g&&(S=s=>{var c=new XMLHttpRequest;return c.open("GET",s,!1),c.responseType="arraybuffer",c.send(null),new Uint8Array(c.response)}),$=(s,c,f)=>{var y=new XMLHttpRequest;y.open("GET",s,!0),y.responseType="arraybuffer",y.onload=()=>{y.status==200||y.status==0&&y.response?c(y.response):f()},y.onerror=f,y.send(null)});var z=console.log.bind(console),H=console.error.bind(console),W=z,F=H;if(Object.assign(u,I),I=null,b){let s=function(c){try{var f=c.data,y=f.cmd;if(y==="load"){let v=[];self.onmessage=C=>v.push(C),self.startWorker=()=>{postMessage({cmd:"loaded"});for(let C of v)s(C);self.onmessage=s};for(let C of f.handlers)u[C]&&!u[C].proxy||(u[C]=(...O)=>{postMessage({Lb:"callHandler",kc:C,args:O})},C=="print"&&(W=u[C]),C=="printErr"&&(F=u[C]));X=f.wasmMemory,ve(),de(f.wasmModule)}else if(y==="run"){Pn(f.pthread_ptr,0,0,1,0,0),Sn(f.pthread_ptr),Wl(),Vo(),ce||(Ri(),ce=!0);try{Hl(f.start_routine,f.arg)}catch(v){if(v!="unwind")throw v}}else y==="cancel"?Mt()&&hr(-1):f.target!=="setimmediate"&&(y==="checkMailbox"?ce&&ar():y&&(F(`worker: received unknown command ${y}`),F(f)))}catch(v){throw Mi(),v}};var Sh=s,de,ce=!1;F=function(...c){c=c.join(" "),console.error(c)},self.alert=function(...c){postMessage({Lb:"alert",text:c.join(" "),mc:Mt()})},u.instantiateWasm=(c,f)=>new Promise(y=>{de=v=>{v=new WebAssembly.Instance(v,zo()),f(v),y()}}),self.onunhandledrejection=c=>{throw c.reason||c},self.onmessage=s}var X,xe,q,ie,le,se,Z,re,J,Pe,R,Y,ue,Te=!1;function ve(){var s=X.buffer;u.HEAP8=ie=new Int8Array(s),u.HEAP16=se=new Int16Array(s),u.HEAPU8=le=new Uint8Array(s),u.HEAPU16=Z=new Uint16Array(s),u.HEAP32=re=new Int32Array(s),u.HEAPU32=J=new Uint32Array(s),u.HEAPF32=Pe=new Float32Array(s),u.HEAPF64=ue=new Float64Array(s),u.HEAP64=R=new BigInt64Array(s),u.HEAPU64=Y=new BigUint64Array(s)}if(!b){if(u.wasmMemory)X=u.wasmMemory;else if(!((X=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0})).buffer instanceof x))throw F("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),Error("bad memory");ve()}var Se=[],Ot=[],Be=[],Ae=0,Xe=null,lt=null;function or(){if(--Ae==0&&(Xe!==null&&(clearInterval(Xe),Xe=null),lt)){var s=lt;lt=null,s()}}function Dt(s){throw F(s="Aborted("+s+")"),Te=!0,q=1,s=new WebAssembly.RuntimeError(s+". Build with -sASSERTIONS for more info."),m(s),s}var Eo,ko=s=>s.startsWith("data:application/octet-stream;base64,"),Po=s=>s.startsWith("file://");function Oo(s){if(S)return S(s);throw"both async and sync fetching of the wasm failed"}function Do(s,c,f){return function(y){if(w||g){if(typeof fetch=="function"&&!Po(y))return fetch(y,{credentials:"same-origin"}).then(v=>{if(!v.ok)throw`failed to load wasm binary file at '${y}'`;return v.arrayBuffer()}).catch(()=>Oo(y));if($)return new Promise((v,C)=>{$(y,O=>v(new Uint8Array(O)),C)})}return Promise.resolve().then(()=>Oo(y))}(s).then(y=>WebAssembly.instantiate(y,c)).then(f,y=>{F(`failed to asynchronously prepare wasm: ${y}`),Dt(y)})}function zo(){return{a:{M:Nl,za:Vl,b:Ll,$:Go,z:qo,pa:jo,X:Yo,Z:Xo,qa:Zo,na:Qo,ga:Jo,ma:ei,J:ti,Y:ri,V:ni,oa:oi,W:ii,va:Fl,D:jl,P:Kl,O:Xl,C:Ql,s:Jl,p:ec,E:tc,y:uc,Q:dc,ta:lc,ja:cc,T:pc,aa:mc,F:fc,ia:Sn,sa:hc,u:gc,B:wc,o:vc,k:_c,c:_n,n:xc,j:Cc,Aa:Tc,r:Ac,d:Ec,v:kc,m:Pc,g:Oc,l:Dc,i:zc,h:Bc,e:Rc,da:Mc,ea:Uc,fa:Vc,ba:wi,ca:vi,S:Nc,f:Wc,N:Hc,G:Gc,K:Lc,w:Fc,ra:qc,U:jc,t:_i,x:Kc,L:Yc,R:Xc,ya:Zc,xa:Qc,ka:Ii,la:Ci,_:yn,A:Ti,I:Ai,ha:Ei,H:ki,a:X,wa:gn,ua:Di,q:tp}}}var mn={1337716:(s,c,f,y)=>{if(u===void 0||!u.Fb)return 1;if((s=ke(s>>>0)).startsWith("./")&&(s=s.substring(2)),!(s=u.Fb.get(s)))return 2;if(y>>>=0,(c>>>=0)+(f>>>=0)>s.byteLength)return 3;try{return r().set(s.subarray(c,c+f),y>>>0),0}catch{return 4}},1338217:()=>{u.Ub()},1338248:()=>{u.Vb()},1338277:()=>{u.Zb()},1338302:s=>u.Tb(s),1338335:s=>u.Xb(s),1338367:(s,c,f)=>{u.Nb(s,c,f,!0)},1338406:(s,c,f)=>{u.Nb(s,c,f)},1338439:()=>typeof wasmOffsetConverter<"u",1338496:s=>{u.jb("Abs",s,void 0)},1338547:s=>{u.jb("Neg",s,void 0)},1338598:s=>{u.jb("Floor",s,void 0)},1338651:s=>{u.jb("Ceil",s,void 0)},1338703:s=>{u.jb("Reciprocal",s,void 0)},1338761:s=>{u.jb("Sqrt",s,void 0)},1338813:s=>{u.jb("Exp",s,void 0)},1338864:s=>{u.jb("Erf",s,void 0)},1338915:s=>{u.jb("Sigmoid",s,void 0)},1338970:(s,c,f)=>{u.jb("HardSigmoid",s,{alpha:c,beta:f})},1339049:s=>{u.jb("Log",s,void 0)},1339100:s=>{u.jb("Sin",s,void 0)},1339151:s=>{u.jb("Cos",s,void 0)},1339202:s=>{u.jb("Tan",s,void 0)},1339253:s=>{u.jb("Asin",s,void 0)},1339305:s=>{u.jb("Acos",s,void 0)},1339357:s=>{u.jb("Atan",s,void 0)},1339409:s=>{u.jb("Sinh",s,void 0)},1339461:s=>{u.jb("Cosh",s,void 0)},1339513:s=>{u.jb("Asinh",s,void 0)},1339566:s=>{u.jb("Acosh",s,void 0)},1339619:s=>{u.jb("Atanh",s,void 0)},1339672:s=>{u.jb("Tanh",s,void 0)},1339724:s=>{u.jb("Not",s,void 0)},1339775:(s,c,f)=>{u.jb("Clip",s,{min:c,max:f})},1339844:s=>{u.jb("Clip",s,void 0)},1339896:(s,c)=>{u.jb("Elu",s,{alpha:c})},1339954:s=>{u.jb("Relu",s,void 0)},1340006:(s,c)=>{u.jb("LeakyRelu",s,{alpha:c})},1340070:(s,c)=>{u.jb("ThresholdedRelu",s,{alpha:c})},1340140:(s,c)=>{u.jb("Cast",s,{to:c})},1340198:s=>{u.jb("Add",s,void 0)},1340249:s=>{u.jb("Sub",s,void 0)},1340300:s=>{u.jb("Mul",s,void 0)},1340351:s=>{u.jb("Div",s,void 0)},1340402:s=>{u.jb("Pow",s,void 0)},1340453:s=>{u.jb("Equal",s,void 0)},1340506:s=>{u.jb("Greater",s,void 0)},1340561:s=>{u.jb("GreaterOrEqual",s,void 0)},1340623:s=>{u.jb("Less",s,void 0)},1340675:s=>{u.jb("LessOrEqual",s,void 0)},1340734:(s,c,f,y,v)=>{u.jb("ReduceMean",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1340893:(s,c,f,y,v)=>{u.jb("ReduceMax",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1341051:(s,c,f,y,v)=>{u.jb("ReduceMin",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1341209:(s,c,f,y,v)=>{u.jb("ReduceProd",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1341368:(s,c,f,y,v)=>{u.jb("ReduceSum",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1341526:(s,c,f,y,v)=>{u.jb("ReduceL1",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1341683:(s,c,f,y,v)=>{u.jb("ReduceL2",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1341840:(s,c,f,y,v)=>{u.jb("ReduceLogSum",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1342001:(s,c,f,y,v)=>{u.jb("ReduceSumSquare",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1342165:(s,c,f,y,v)=>{u.jb("ReduceLogSumExp",s,{keepDims:!!c,noopWithEmptyAxes:!!f,axes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1342329:s=>{u.jb("Where",s,void 0)},1342382:(s,c,f)=>{u.jb("Transpose",s,{perm:c?Array.from(i().subarray(c>>>0,f>>>0)):[]})},1342490:(s,c,f,y)=>{u.jb("DepthToSpace",s,{blocksize:c,mode:ke(f),format:y?"NHWC":"NCHW"})},1342623:(s,c,f,y)=>{u.jb("DepthToSpace",s,{blocksize:c,mode:ke(f),format:y?"NHWC":"NCHW"})},1342756:(s,c,f,y,v,C,O,B,N,L,K,pe,fe,P,ee)=>{u.jb("ConvTranspose",s,{format:N?"NHWC":"NCHW",autoPad:c,dilations:[f],group:y,kernelShape:[v],pads:[C,O],strides:[B],wIsConst:()=>!!t()[L>>>0],outputPadding:K?Array.from(i().subarray(K>>>0,pe>>>0)):[],outputShape:fe?Array.from(i().subarray(fe>>>0,P>>>0)):[],activation:ke(ee)})},1343157:(s,c,f,y,v,C,O,B,N,L,K,pe,fe,P)=>{u.jb("ConvTranspose",s,{format:B?"NHWC":"NCHW",autoPad:c,dilations:Array.from(i().subarray(f>>>0,2+(f>>>0)>>>0)),group:y,kernelShape:Array.from(i().subarray(v>>>0,2+(v>>>0)>>>0)),pads:Array.from(i().subarray(C>>>0,4+(C>>>0)>>>0)),strides:Array.from(i().subarray(O>>>0,2+(O>>>0)>>>0)),wIsConst:()=>!!t()[N>>>0],outputPadding:L?Array.from(i().subarray(L>>>0,K>>>0)):[],outputShape:pe?Array.from(i().subarray(pe>>>0,fe>>>0)):[],activation:ke(P)})},1343722:(s,c,f,y,v,C,O,B,N,L,K,pe,fe,P,ee)=>{u.jb("ConvTranspose",s,{format:N?"NHWC":"NCHW",autoPad:c,dilations:[f],group:y,kernelShape:[v],pads:[C,O],strides:[B],wIsConst:()=>!!t()[L>>>0],outputPadding:K?Array.from(i().subarray(K>>>0,pe>>>0)):[],outputShape:fe?Array.from(i().subarray(fe>>>0,P>>>0)):[],activation:ke(ee)})},1344123:(s,c,f,y,v,C,O,B,N,L,K,pe,fe,P)=>{u.jb("ConvTranspose",s,{format:B?"NHWC":"NCHW",autoPad:c,dilations:Array.from(i().subarray(f>>>0,2+(f>>>0)>>>0)),group:y,kernelShape:Array.from(i().subarray(v>>>0,2+(v>>>0)>>>0)),pads:Array.from(i().subarray(C>>>0,4+(C>>>0)>>>0)),strides:Array.from(i().subarray(O>>>0,2+(O>>>0)>>>0)),wIsConst:()=>!!t()[N>>>0],outputPadding:L?Array.from(i().subarray(L>>>0,K>>>0)):[],outputShape:pe?Array.from(i().subarray(pe>>>0,fe>>>0)):[],activation:ke(P)})},1344688:(s,c)=>{u.jb("GlobalAveragePool",s,{format:c?"NHWC":"NCHW"})},1344779:(s,c,f,y,v,C,O,B,N,L,K,pe,fe,P,ee,ge)=>{u.jb("AveragePool",s,{format:ge?"NHWC":"NCHW",auto_pad:c,ceil_mode:f,count_include_pad:y,storage_order:v,dilations:[C,O],kernel_shape:[B,N],pads:[L,K,pe,fe],strides:[P,ee]})},1345063:(s,c)=>{u.jb("GlobalAveragePool",s,{format:c?"NHWC":"NCHW"})},1345154:(s,c,f,y,v,C,O,B,N,L,K,pe,fe,P,ee,ge)=>{u.jb("AveragePool",s,{format:ge?"NHWC":"NCHW",auto_pad:c,ceil_mode:f,count_include_pad:y,storage_order:v,dilations:[C,O],kernel_shape:[B,N],pads:[L,K,pe,fe],strides:[P,ee]})},1345438:(s,c)=>{u.jb("GlobalMaxPool",s,{format:c?"NHWC":"NCHW"})},1345525:(s,c,f,y,v,C,O,B,N,L,K,pe,fe,P,ee,ge)=>{u.jb("MaxPool",s,{format:ge?"NHWC":"NCHW",auto_pad:c,ceil_mode:f,count_include_pad:y,storage_order:v,dilations:[C,O],kernel_shape:[B,N],pads:[L,K,pe,fe],strides:[P,ee]})},1345805:(s,c)=>{u.jb("GlobalMaxPool",s,{format:c?"NHWC":"NCHW"})},1345892:(s,c,f,y,v,C,O,B,N,L,K,pe,fe,P,ee,ge)=>{u.jb("MaxPool",s,{format:ge?"NHWC":"NCHW",auto_pad:c,ceil_mode:f,count_include_pad:y,storage_order:v,dilations:[C,O],kernel_shape:[B,N],pads:[L,K,pe,fe],strides:[P,ee]})},1346172:(s,c,f,y,v)=>{u.jb("Gemm",s,{alpha:c,beta:f,transA:y,transB:v})},1346276:s=>{u.jb("MatMul",s,void 0)},1346330:(s,c,f,y)=>{u.jb("ArgMax",s,{keepDims:!!c,selectLastIndex:!!f,axis:y})},1346438:(s,c,f,y)=>{u.jb("ArgMin",s,{keepDims:!!c,selectLastIndex:!!f,axis:y})},1346546:(s,c)=>{u.jb("Softmax",s,{axis:c})},1346609:(s,c)=>{u.jb("Concat",s,{axis:c})},1346669:(s,c,f,y,v)=>{u.jb("Split",s,{axis:c,numOutputs:f,splitSizes:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1346809:s=>{u.jb("Expand",s,void 0)},1346863:(s,c)=>{u.jb("Gather",s,{axis:Number(c)})},1346934:(s,c)=>{u.jb("GatherElements",s,{axis:Number(c)})},1347013:(s,c,f,y,v,C,O,B,N,L,K)=>{u.jb("Resize",s,{antialias:c,axes:f?Array.from(i().subarray(f>>>0,y>>>0)):[],coordinateTransformMode:ke(v),cubicCoeffA:C,excludeOutside:O,extrapolationValue:B,keepAspectRatioPolicy:ke(N),mode:ke(L),nearestMode:ke(K)})},1347359:(s,c,f,y,v,C,O)=>{u.jb("Slice",s,{starts:c?Array.from(i().subarray(c>>>0,f>>>0)):[],ends:y?Array.from(i().subarray(y>>>0,v>>>0)):[],axes:C?Array.from(i().subarray(C>>>0,O>>>0)):[]})},1347575:s=>{u.jb("Tile",s,void 0)},1347627:(s,c,f)=>{u.jb("InstanceNormalization",s,{epsilon:c,format:f?"NHWC":"NCHW"})},1347741:(s,c,f)=>{u.jb("InstanceNormalization",s,{epsilon:c,format:f?"NHWC":"NCHW"})},1347855:s=>{u.jb("Range",s,void 0)},1347908:(s,c)=>{u.jb("Einsum",s,{equation:ke(c)})},1347989:(s,c,f,y,v)=>{u.jb("Pad",s,{mode:c,value:f,pads:y?Array.from(i().subarray(y>>>0,v>>>0)):[]})},1348116:(s,c,f,y,v,C)=>{u.jb("BatchNormalization",s,{epsilon:c,momentum:f,spatial:!!v,trainingMode:!!y,format:C?"NHWC":"NCHW"})},1348285:(s,c,f,y,v,C)=>{u.jb("BatchNormalization",s,{epsilon:c,momentum:f,spatial:!!v,trainingMode:!!y,format:C?"NHWC":"NCHW"})},1348454:(s,c,f)=>{u.jb("CumSum",s,{exclusive:Number(c),reverse:Number(f)})},1348551:(s,c,f,y,v,C,O,B,N)=>{u.jb("Attention",s,{numHeads:c,isUnidirectional:f,maskFilterValue:y,scale:v,doRotary:C,qkvHiddenSizes:O?Array.from(i().subarray(Number(B)>>>0,Number(B)+O>>>0)):[],pastPresentShareBuffer:!!N})},1348823:s=>{u.jb("BiasAdd",s,void 0)},1348878:s=>{u.jb("BiasSplitGelu",s,void 0)},1348939:s=>{u.jb("FastGelu",s,void 0)},1348995:(s,c,f,y,v,C,O,B,N,L,K,pe,fe,P,ee,ge)=>{u.jb("Conv",s,{format:pe?"NHWC":"NCHW",auto_pad:c,dilations:f?Array.from(i().subarray(f>>>0,y>>>0)):[],group:v,kernel_shape:C?Array.from(i().subarray(C>>>0,O>>>0)):[],pads:B?Array.from(i().subarray(B>>>0,N>>>0)):[],strides:L?Array.from(i().subarray(L>>>0,K>>>0)):[],w_is_const:()=>!!t()[fe>>>0],activation:ke(P),activation_params:ee?Array.from(l().subarray(ee>>>0,ge>>>0)):[]})},1349491:s=>{u.jb("Gelu",s,void 0)},1349543:(s,c,f,y)=>{u.jb("GroupQueryAttention",s,{numHeads:c,kvNumHeads:f,scale:y})},1349656:(s,c,f,y)=>{u.jb("LayerNormalization",s,{axis:c,epsilon:f,simplified:!!y})},1349767:(s,c,f,y)=>{u.jb("LayerNormalization",s,{axis:c,epsilon:f,simplified:!!y})},1349878:(s,c,f,y,v,C)=>{u.jb("MatMulNBits",s,{k:c,n:f,accuracyLevel:y,bits:v,blockSize:C})},1350005:(s,c,f,y,v,C)=>{u.jb("MultiHeadAttention",s,{numHeads:c,isUnidirectional:f,maskFilterValue:y,scale:v,doRotary:C})},1350164:(s,c)=>{u.jb("QuickGelu",s,{alpha:c})},1350228:(s,c,f,y,v)=>{u.jb("RotaryEmbedding",s,{interleaved:!!c,numHeads:f,rotaryEmbeddingDim:y,scale:v})},1350367:(s,c,f)=>{u.jb("SkipLayerNormalization",s,{epsilon:c,simplified:!!f})},1350469:s=>{u.Yb(s)},1350503:(s,c)=>u.$b(s,c,u.Eb.bc,u.Eb.errors),1350615:(s,c,f)=>{u.jb("SkipLayerNormalization",s,{epsilon:c,simplified:!!f})}};function Vl(s,c,f){return fi(async()=>{await u.Wb(s,c,f)})}function Nl(){return typeof wasmOffsetConverter<"u"}function fn(s){this.name="ExitStatus",this.message=`Program terminated with exit(${s})`,this.status=s}var hn=s=>{s.terminate(),s.onmessage=()=>{}},Bo=s=>{ct.length==0&&(Wo(),No(ct[0]));var c=ct.pop();if(!c)return 6;wt.push(c),Ze[s.Ab]=c,c.Ab=s.Ab;var f={cmd:"run",start_routine:s.cc,arg:s.Pb,pthread_ptr:s.Ab};return c.postMessage(f,s.ic),0},bt=0,_e=(s,c,...f)=>{for(var y=2*f.length,v=zn(),C=Dn(8*y),O=C>>>3,B=0;B>>0]=N)}return s=Ui(s,0,y,C,c),gr(v),s};function gn(s){if(b)return _e(0,1,s);if(q=s,!(0{if(q=s,b)throw Ro(s),"unwind";gn(s)},ct=[],wt=[],Mo=[],Ze={},Uo=s=>{var c=s.Ab;delete Ze[c],ct.push(s),wt.splice(wt.indexOf(s),1),s.Ab=0,On(c)};function Vo(){Mo.forEach(s=>s())}var No=s=>new Promise(c=>{s.onmessage=v=>{var C=(v=v.data).cmd;if(v.targetThread&&v.targetThread!=Mt()){var O=Ze[v.targetThread];O?O.postMessage(v,v.transferList):F(`Internal error! Worker sent a message "${C}" to target pthread ${v.targetThread}, but that thread no longer exists!`)}else C==="checkMailbox"?ar():C==="spawnThread"?Bo(v):C==="cleanupThread"?Uo(Ze[v.thread]):C==="killThread"?(v=v.thread,C=Ze[v],delete Ze[v],hn(C),On(v),wt.splice(wt.indexOf(C),1),C.Ab=0):C==="cancelThread"?Ze[v.thread].postMessage({cmd:"cancel"}):C==="loaded"?(s.loaded=!0,c(s)):C==="alert"?alert(`Thread ${v.threadId}: ${v.text}`):v.target==="setimmediate"?s.postMessage(v):C==="callHandler"?u[v.handler](...v.args):C&&F(`worker sent an unknown command ${C}`)},s.onerror=v=>{throw F(`worker sent an error! ${v.filename}:${v.lineno}: ${v.message}`),v};var f,y=[];for(f of["onExit"])u.hasOwnProperty(f)&&y.push(f);s.postMessage({cmd:"load",handlers:y,wasmMemory:X,wasmModule:xe})});function Wo(){var s=new Worker(new URL(import.meta.url),{type:"module",workerData:"em-pthread",name:"em-pthread"});ct.push(s)}var ir=s=>{for(;0{var s=Mt(),c=a()[s+52>>>2>>>0];s=a()[s+56>>>2>>>0],Ni(c,c-s),gr(c)},Hl=(s,c)=>{bt=0,s=Wi(s,c),0>>=0);throw c>>>=0,f>>>=0,a()[y.Ib+16>>>2>>>0]=0,a()[y.Ib+4>>>2>>>0]=c,a()[y.Ib+8>>>2>>>0]=f,s}function Ho(s,c,f,y){return b?_e(2,1,s,c,f,y):Go(s,c,f,y)}function Go(s,c,f,y){if(s>>>=0,c>>>=0,f>>>=0,y>>>=0,x===void 0)return F("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;var v=[];return b&&v.length===0?Ho(s,c,f,y):(s={cc:f,Ab:s,Pb:y,ic:v},b?(s.Lb="spawnThread",postMessage(s,v),0):Bo(s))}var Lo=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0,Fo=(s,c,f)=>{var y=(c>>>=0)+f;for(f=c;s[f]&&!(f>=y);)++f;if(16(v=(240&v)==224?(15&v)<<12|C<<6|O:(7&v)<<18|C<<12|O<<6|63&s[c++])?y+=String.fromCharCode(v):(v-=65536,y+=String.fromCharCode(55296|v>>10,56320|1023&v))}}else y+=String.fromCharCode(v)}return y},ke=(s,c)=>(s>>>=0)?Fo(r(),s,c):"";function qo(s,c,f){return b?_e(3,1,s,c,f):0}function jo(s,c){if(b)return _e(4,1,s,c)}var bn=s=>{for(var c=0,f=0;f=y?c++:2047>=y?c+=2:55296<=y&&57343>=y?(c+=4,++f):c+=3}return c},Ko=(s,c,f,y)=>{if(!(0>>=0;y=f+y-1;for(var C=0;C=O&&(O=65536+((1023&O)<<10)|1023&s.charCodeAt(++C)),127>=O){if(f>=y)break;c[f++>>>0]=O}else{if(2047>=O){if(f+1>=y)break;c[f++>>>0]=192|O>>6}else{if(65535>=O){if(f+2>=y)break;c[f++>>>0]=224|O>>12}else{if(f+3>=y)break;c[f++>>>0]=240|O>>18,c[f++>>>0]=128|O>>12&63}c[f++>>>0]=128|O>>6&63}c[f++>>>0]=128|63&O}}return c[f>>>0]=0,f-v},zt=(s,c,f)=>Ko(s,r(),c,f);function Yo(s,c){if(b)return _e(5,1,s,c)}function Xo(s,c,f){if(b)return _e(6,1,s,c,f)}function Zo(s,c,f){return b?_e(7,1,s,c,f):0}function Qo(s,c){if(b)return _e(8,1,s,c)}function Jo(s,c,f){if(b)return _e(9,1,s,c,f)}function ei(s,c,f,y){if(b)return _e(10,1,s,c,f,y)}function ti(s,c,f,y){if(b)return _e(11,1,s,c,f,y)}function ri(s,c,f,y){if(b)return _e(12,1,s,c,f,y)}function ni(s){if(b)return _e(13,1,s)}function oi(s,c){if(b)return _e(14,1,s,c)}function ii(s,c,f){if(b)return _e(15,1,s,c,f)}var ai,pt,Fl=()=>{Dt("")},Qe=s=>{for(var c="";r()[s>>>0];)c+=ai[r()[s++>>>0]];return c},wn={},vn={},ql={};function st(s,c,f={}){if(!("argPackAdvance"in c))throw new TypeError("registerType registeredInstance requires argPackAdvance");return function(y,v,C={}){var O=v.name;if(!y)throw new pt(`type "${O}" must have a positive integer typeid pointer`);if(vn.hasOwnProperty(y)){if(C.Rb)return;throw new pt(`Cannot register type '${O}' twice`)}vn[y]=v,delete ql[y],wn.hasOwnProperty(y)&&(v=wn[y],delete wn[y],v.forEach(B=>B()))}(s,c,f)}var si=(s,c,f)=>{switch(c){case 1:return f?y=>t()[y>>>0]:y=>r()[y>>>0];case 2:return f?y=>n()[y>>>1>>>0]:y=>o()[y>>>1>>>0];case 4:return f?y=>i()[y>>>2>>>0]:y=>a()[y>>>2>>>0];case 8:return f?y=>R[y>>>3]:y=>Y[y>>>3];default:throw new TypeError(`invalid integer width (${c}): ${s}`)}};function jl(s,c,f){f>>>=0,st(s>>>=0,{name:c=Qe(c>>>0),fromWireType:y=>y,toWireType:function(y,v){if(typeof v!="bigint"&&typeof v!="number")throw v=v===null?"null":(y=typeof v)=="object"||y==="array"||y==="function"?v.toString():""+v,new TypeError(`Cannot convert "${v}" to ${this.name}`);return typeof v=="number"&&(v=BigInt(v)),v},argPackAdvance:mt,readValueFromPointer:si(c,f,c.indexOf("u")==-1),Db:null})}var mt=8;function Kl(s,c,f,y){st(s>>>=0,{name:c=Qe(c>>>0),fromWireType:function(v){return!!v},toWireType:function(v,C){return C?f:y},argPackAdvance:mt,readValueFromPointer:function(v){return this.fromWireType(r()[v>>>0])},Db:null})}var $n=[],ut=[];function _n(s){9<(s>>>=0)&&--ut[s+1]==0&&(ut[s]=void 0,$n.push(s))}var He=s=>{if(!s)throw new pt("Cannot use deleted val. handle = "+s);return ut[s]},Ge=s=>{switch(s){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:let c=$n.pop()||ut.length;return ut[c]=s,ut[c+1]=1,c}};function xn(s){return this.fromWireType(a()[s>>>2>>>0])}var Yl={name:"emscripten::val",fromWireType:s=>{var c=He(s);return _n(s),c},toWireType:(s,c)=>Ge(c),argPackAdvance:mt,readValueFromPointer:xn,Db:null};function Xl(s){return st(s>>>0,Yl)}var Zl=(s,c)=>{switch(c){case 4:return function(f){return this.fromWireType(l()[f>>>2>>>0])};case 8:return function(f){return this.fromWireType(d()[f>>>3>>>0])};default:throw new TypeError(`invalid float width (${c}): ${s}`)}};function Ql(s,c,f){f>>>=0,st(s>>>=0,{name:c=Qe(c>>>0),fromWireType:y=>y,toWireType:(y,v)=>v,argPackAdvance:mt,readValueFromPointer:Zl(c,f),Db:null})}function Jl(s,c,f,y,v){if(s>>>=0,f>>>=0,c=Qe(c>>>0),v===-1&&(v=4294967295),v=B=>B,y===0){var C=32-8*f;v=B=>B<>>C}var O=c.includes("unsigned")?function(B,N){return N>>>0}:function(B,N){return N};st(s,{name:c,fromWireType:v,toWireType:O,argPackAdvance:mt,readValueFromPointer:si(c,f,y!==0),Db:null})}function ec(s,c,f){function y(C){var O=a()[C>>>2>>>0];return C=a()[C+4>>>2>>>0],new v(t().buffer,C,O)}var v=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][c];st(s>>>=0,{name:f=Qe(f>>>0),fromWireType:y,argPackAdvance:mt,readValueFromPointer:y},{Rb:!0})}function tc(s,c){s>>>=0;var f=(c=Qe(c>>>0))==="std::string";st(s,{name:c,fromWireType:function(y){var v=a()[y>>>2>>>0],C=y+4;if(f)for(var O=C,B=0;B<=v;++B){var N=C+B;if(B==v||r()[N>>>0]==0){if(O=ke(O,N-O),L===void 0)var L=O;else L+=String.fromCharCode(0),L+=O;O=N+1}}else{for(L=Array(v),B=0;B>>0]);L=L.join("")}return et(y),L},toWireType:function(y,v){v instanceof ArrayBuffer&&(v=new Uint8Array(v));var C=typeof v=="string";if(!(C||v instanceof Uint8Array||v instanceof Uint8ClampedArray||v instanceof Int8Array))throw new pt("Cannot pass non-string to std::string");var O=f&&C?bn(v):v.length,B=fr(4+O+1),N=B+4;if(a()[B>>>2>>>0]=O,f&&C)zt(v,N,O+1);else if(C)for(C=0;C>>0]=L}else for(C=0;C>>0]=v[C];return y!==null&&y.push(et,B),B},argPackAdvance:mt,readValueFromPointer:xn,Db(y){et(y)}})}var ui=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,rc=(s,c)=>{for(var f=s>>1,y=f+c/2;!(f>=y)&&o()[f>>>0];)++f;if(32<(f<<=1)-s&&ui)return ui.decode(r().slice(s,f));for(f="",y=0;!(y>=c/2);++y){var v=n()[s+2*y>>>1>>>0];if(v==0)break;f+=String.fromCharCode(v)}return f},nc=(s,c,f)=>{if(f??=2147483647,2>f)return 0;var y=c;f=(f-=2)<2*s.length?f/2:s.length;for(var v=0;v>>1>>>0]=C,c+=2}return n()[c>>>1>>>0]=0,c-y},oc=s=>2*s.length,ic=(s,c)=>{for(var f=0,y="";!(f>=c/4);){var v=i()[s+4*f>>>2>>>0];if(v==0)break;++f,65536<=v?(v-=65536,y+=String.fromCharCode(55296|v>>10,56320|1023&v)):y+=String.fromCharCode(v)}return y},ac=(s,c,f)=>{if(c>>>=0,f??=2147483647,4>f)return 0;var y=c;f=y+f-4;for(var v=0;v=C&&(C=65536+((1023&C)<<10)|1023&s.charCodeAt(++v)),i()[c>>>2>>>0]=C,(c+=4)+4>f)break}return i()[c>>>2>>>0]=0,c-y},sc=s=>{for(var c=0,f=0;f=y&&++f,c+=4}return c};function uc(s,c,f){if(s>>>=0,c>>>=0,f=Qe(f>>>=0),c===2)var y=rc,v=nc,C=oc,O=B=>o()[B>>>1>>>0];else c===4&&(y=ic,v=ac,C=sc,O=B=>a()[B>>>2>>>0]);st(s,{name:f,fromWireType:B=>{for(var N,L=a()[B>>>2>>>0],K=B+4,pe=0;pe<=L;++pe){var fe=B+4+pe*c;pe!=L&&O(fe)!=0||(K=y(K,fe-K),N===void 0?N=K:(N+=String.fromCharCode(0),N+=K),K=fe+c)}return et(B),N},toWireType:(B,N)=>{if(typeof N!="string")throw new pt(`Cannot pass non-string to C++ string type ${f}`);var L=C(N),K=fr(4+L+c);return a()[K>>>2>>>0]=L/c,v(N,K+4,L+c),B!==null&&B.push(et,K),K},argPackAdvance:mt,readValueFromPointer:xn,Db(B){et(B)}})}function dc(s,c){st(s>>>=0,{Sb:!0,name:c=Qe(c>>>0),argPackAdvance:0,fromWireType:()=>{},toWireType:()=>{}})}var lc=()=>1;function cc(s){Pn(s>>>0,!g,1,!w,131072,!1),Vo()}var di=s=>{if(!Te)try{if(s(),!(0>>=0,typeof Atomics.jc=="function"&&(Atomics.jc(i(),s>>>2,s).value.then(ar),s+=128,Atomics.store(i(),s>>>2,1))}var ar=()=>{var s=Mt();s&&(Sn(s),di(Vi))};function pc(s,c){(s>>>=0)==c>>>0?setTimeout(ar):b?postMessage({targetThread:s,cmd:"checkMailbox"}):(s=Ze[s])&&s.postMessage({cmd:"checkMailbox"})}var In=[];function mc(s,c,f,y,v){for(c>>>=0,y/=2,In.length=y,f=v>>>0>>>3,v=0;v>>0];return(c?mn[c]:rp[s])(...In)}function fc(s){s>>>=0,b?postMessage({cmd:"cleanupThread",thread:s}):Uo(Ze[s])}function hc(s){}var Cn=(s,c)=>{var f=vn[s];if(f===void 0)throw s=Bi(s),f=Qe(s),et(s),new pt(`${c} has unknown type ${f}`);return f},li=(s,c,f)=>{var y=[];return s=s.toWireType(y,f),y.length&&(a()[c>>>2>>>0]=Ge(y)),s};function gc(s,c,f){return c>>>=0,f>>>=0,s=He(s>>>0),c=Cn(c,"emval::as"),li(c,f,s)}var sr=s=>{try{s()}catch(c){Dt(c)}},ft=0,Je=null,ci=0,ur=[],pi={},mi={},yc=0,Tn=null,bc=[];function fi(s){return function(c){if(!Te){if(ft===0){var f=!1,y=!1;c((v=0)=>{if(!Te&&(ci=v,f=!0,y)){ft=2,sr(()=>Li(Je)),typeof Browser<"u"&&Browser.Jb.Qb&&Browser.Jb.resume(),v=!1;try{var C=function(){var N=i()[Je+8>>>2>>>0];return N=j[mi[N]],--bt,N()}()}catch(N){C=N,v=!0}var O=!1;if(!Je){var B=Tn;B&&(Tn=null,(v?B.reject:B.resolve)(C),O=!0)}if(v&&!O)throw C}}),y=!0,f||(ft=1,Je=function(){var v=fr(65548),C=v+12;a()[v>>>2>>>0]=C,a()[v+4>>>2>>>0]=C+65536,C=ur[0];var O=pi[C];return O===void 0&&(O=yc++,pi[C]=O,mi[O]=C),C=O,i()[v+8>>>2>>>0]=C,v}(),typeof Browser<"u"&&Browser.Jb.Qb&&Browser.Jb.pause(),sr(()=>Hi(Je)))}else ft===2?(ft=0,sr(Fi),et(Je),Je=null,bc.forEach(di)):Dt(`invalid state: ${ft}`);return ci}}(c=>{s().then(c)})}function wc(s){return s>>>=0,fi(()=>(s=He(s)).then(Ge))}var dr=[];function vc(s,c,f,y){return f>>>=0,y>>>=0,(s=dr[s>>>0])(null,c=He(c>>>0),f,y)}var $c={},lr=s=>{var c=$c[s];return c===void 0?Qe(s):c};function _c(s,c,f,y,v){return f>>>=0,y>>>=0,v>>>=0,(s=dr[s>>>0])(c=He(c>>>0),c[f=lr(f)],y,v)}var hi=()=>typeof globalThis=="object"?globalThis:Function("return this")();function xc(s){return(s>>>=0)==0?Ge(hi()):(s=lr(s),Ge(hi()[s]))}var Sc=s=>{var c=dr.length;return dr.push(s),c},Ic=(s,c)=>{for(var f=Array(s),y=0;y>>2>>>0],"parameter "+y);return f},gi=(s,c)=>Object.defineProperty(c,"name",{value:s});function Cc(s,c,f){var y=(c=Ic(s,c>>>0)).shift();s--;var v=`return function (obj, func, destructorsRef, args) { `,C=0,O=[];f===0&&O.push("obj");for(var B=["retType"],N=[y],L=0;Lj.name).join(", ")}) => ${y.name}>`,xc(gi(f,s))}function Cc(s){return s=lr(s>>>0),Ge(u[s])}function Tc(s,c){return c>>>=0,s=He(s>>>0),c=He(c),Ge(s[c])}function Ac(s){9<(s>>>=0)&&(ut[s+1]+=1)}function Ec(){return Ge([])}function kc(s){s=He(s>>>0);for(var c=Array(s.length),f=0;f>>0))}function Oc(){return Ge({})}function zc(s){for(var c=He(s>>>=0);c.length;){var f=c.pop();c.pop()(f)}$n(s)}function Dc(s,c,f){c>>>=0,f>>>=0,s=He(s>>>0),c=He(c),f=He(f),s[c]=f}function Bc(s,c){return c>>>=0,s=(s=In(s>>>0,"_emval_take_value")).readValueFromPointer(c),Ge(s)}function Rc(s,c){s=-9007199254740992>s||9007199254740992>>=0,s=new Date(1e3*s),i()[c>>>2>>>0]=s.getUTCSeconds(),i()[c+4>>>2>>>0]=s.getUTCMinutes(),i()[c+8>>>2>>>0]=s.getUTCHours(),i()[c+12>>>2>>>0]=s.getUTCDate(),i()[c+16>>>2>>>0]=s.getUTCMonth(),i()[c+20>>>2>>>0]=s.getUTCFullYear()-1900,i()[c+24>>>2>>>0]=s.getUTCDay(),s=(s.getTime()-Date.UTC(s.getUTCFullYear(),0,1,0,0,0,0))/864e5|0,i()[c+28>>>2>>>0]=s}var Dt=s=>s%4==0&&(s%100!=0||s%400==0),yi=[0,31,60,91,121,152,182,213,244,274,305,335],bi=[0,31,59,90,120,151,181,212,243,273,304,334];function Mc(s,c){s=-9007199254740992>s||9007199254740992>>=0,s=new Date(1e3*s),i()[c>>>2>>>0]=s.getSeconds(),i()[c+4>>>2>>>0]=s.getMinutes(),i()[c+8>>>2>>>0]=s.getHours(),i()[c+12>>>2>>>0]=s.getDate(),i()[c+16>>>2>>>0]=s.getMonth(),i()[c+20>>>2>>>0]=s.getFullYear()-1900,i()[c+24>>>2>>>0]=s.getDay();var f=(Dt(s.getFullYear())?yi:bi)[s.getMonth()]+s.getDate()-1|0;i()[c+28>>>2>>>0]=f,i()[c+36>>>2>>>0]=-60*s.getTimezoneOffset(),f=new Date(s.getFullYear(),6,1).getTimezoneOffset();var y=new Date(s.getFullYear(),0,1).getTimezoneOffset();s=0|(f!=y&&s.getTimezoneOffset()==Math.min(y,f)),i()[c+32>>>2>>>0]=s}function Uc(s){s>>>=0;var c=new Date(i()[s+20>>>2>>>0]+1900,i()[s+16>>>2>>>0],i()[s+12>>>2>>>0],i()[s+8>>>2>>>0],i()[s+4>>>2>>>0],i()[s>>>2>>>0],0),f=i()[s+32>>>2>>>0],y=c.getTimezoneOffset(),v=new Date(c.getFullYear(),6,1).getTimezoneOffset(),C=new Date(c.getFullYear(),0,1).getTimezoneOffset(),O=Math.min(C,v);return 0>f?i()[s+32>>>2>>>0]=+(v!=C&&O==y):0>>2>>>0]=c.getDay(),f=(Dt(c.getFullYear())?yi:bi)[c.getMonth()]+c.getDate()-1|0,i()[s+28>>>2>>>0]=f,i()[s>>>2>>>0]=c.getSeconds(),i()[s+4>>>2>>>0]=c.getMinutes(),i()[s+8>>>2>>>0]=c.getHours(),i()[s+12>>>2>>>0]=c.getDate(),i()[s+16>>>2>>>0]=c.getMonth(),i()[s+20>>>2>>>0]=c.getYear(),s=c.getTime(),BigInt(isNaN(s)?-1:s/1e3)}function wi(s,c,f,y,v,C,O){return b?_e(16,1,s,c,f,y,v,C,O):-52}function vi(s,c,f,y,v,C){if(b)return _e(17,1,s,c,f,y,v,C)}function Vc(s,c,f,y){s>>>=0,c>>>=0,f>>>=0,y>>>=0;var v=new Date().getFullYear(),C=new Date(v,0,1),O=new Date(v,6,1);v=C.getTimezoneOffset();var B=O.getTimezoneOffset(),N=Math.max(v,B);a()[s>>>2>>>0]=60*N,i()[c>>>2>>>0]=+(v!=B),C=(s=L=>L.toLocaleTimeString(void 0,{hour12:!1,timeZoneName:"short"}).split(" ")[1])(C),O=s(O),B{Tn.length=0;for(var f;f=r()[s++>>>0];){var y=f!=105;c+=(y&=f!=112)&&c%8?4:0,Tn.push(f==112?a()[c>>>2>>>0]:f==106?R[c>>>3]:f==105?i()[c>>>2>>>0]:d()[c>>>3>>>0]),c+=y?8:4}return Tn};function Nc(s,c,f){return s>>>=0,c=$i(c>>>0,f>>>0),mn[s](...c)}function Wc(s,c,f){return s>>>=0,c=$i(c>>>0,f>>>0),mn[s](...c)}var Hc=()=>{},Gc=()=>Date.now();function Lc(s,c){return F(ke(s>>>0,c>>>0))}var _i,Fc=()=>{throw bt+=1,"unwind"};function qc(){return 4294901760}_i=()=>performance.timeOrigin+performance.now();var Kc=()=>navigator.hardwareConcurrency;function jc(s){s>>>=0;var c=r().length;if(s<=c||4294901760=f;f*=2){var y=c*(1+.2/f);y=Math.min(y,s+100663296);var v=Math;y=Math.max(s,y);e:{v=(v.min.call(v,4294901760,y+(65536-y%65536)%65536)-X.buffer.byteLength+65535)/65536;try{X.grow(v),ve();var C=1;break e}catch{}C=void 0}if(C)return!0}return!1}var cr=()=>(Gt("Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER"),0),Bt={},xi=s=>{s.forEach(c=>{var f=cr();f&&(Bt[f]=c)})};function Yc(){var s=Error().stack.toString().split(` -`);return s[0]=="Error"&&s.shift(),xi(s),Bt.Lb=cr(),Bt.Yb=s,Bt.Lb}function Xc(s,c,f){if(s>>>=0,c>>>=0,Bt.Lb==s)var y=Bt.Yb;else(y=Error().stack.toString().split(` -`))[0]=="Error"&&y.shift(),xi(y);for(var v=3;y[v]&&cr()!=s;)++v;for(s=0;s>>2>>>0]=cr();return s}var An,En={},Si=()=>{if(!An){var s,c={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:T||"./this.program"};for(s in En)En[s]===void 0?delete c[s]:c[s]=En[s];var f=[];for(s in c)f.push(`${s}=${c[s]}`);An=f}return An};function Ii(s,c){if(b)return _e(18,1,s,c);s>>>=0,c>>>=0;var f=0;return Si().forEach((y,v)=>{var C=c+f;for(v=a()[s+4*v>>>2>>>0]=C,C=0;C>>0]=y.charCodeAt(C);t()[v>>>0]=0,f+=y.length+1}),0}function Ci(s,c){if(b)return _e(19,1,s,c);s>>>=0,c>>>=0;var f=Si();a()[s>>>2>>>0]=f.length;var y=0;return f.forEach(v=>y+=v.length+1),a()[c>>>2>>>0]=y,0}function Ti(s){return b?_e(20,1,s):52}function Ai(s,c,f,y){return b?_e(21,1,s,c,f,y):52}function Ei(s,c,f,y){return b?_e(22,1,s,c,f,y):70}var Zc=[null,[],[]];function ki(s,c,f,y){if(b)return _e(23,1,s,c,f,y);c>>>=0,f>>>=0,y>>>=0;for(var v=0,C=0;C>>2>>>0],B=a()[c+4>>>2>>>0];c+=8;for(var N=0;N>>0],j=Zc[s];L===0||L===10?((s===1?W:F)(Fo(j,0)),j.length=0):j.push(L)}v+=B}return a()[y>>>2>>>0]=v,0}var Pi=[31,29,31,30,31,30,31,31,30,31,30,31],Oi=[31,28,31,30,31,30,31,31,30,31,30,31],Qc=(s,c)=>{t().set(s,c>>>0)};function zi(s,c,f,y){function v(P,ee,ge){for(P=typeof P=="number"?P.toString():P||"";P.lengthKi?-1:0vt-P.getDate())){P.setDate(P.getDate()+ee);break}ee-=vt-P.getDate()+1,P.setDate(1),11>ge?P.setMonth(ge+1):(P.setMonth(0),P.setFullYear(P.getFullYear()+1))}return ge=new Date(P.getFullYear()+1,0,4),ee=B(new Date(P.getFullYear(),0,4)),ge=B(ge),0>=O(ee,P)?0>=O(ge,P)?P.getFullYear()+1:P.getFullYear():P.getFullYear()-1}s>>>=0,c>>>=0,f>>>=0,y>>>=0;var L=a()[y+40>>>2>>>0];for(var j in y={cc:i()[y>>>2>>>0],bc:i()[y+4>>>2>>>0],Db:i()[y+8>>>2>>>0],Hb:i()[y+12>>>2>>>0],Eb:i()[y+16>>>2>>>0],zb:i()[y+20>>>2>>>0],rb:i()[y+24>>>2>>>0],yb:i()[y+28>>>2>>>0],kc:i()[y+32>>>2>>>0],ac:i()[y+36>>>2>>>0],dc:L?ke(L):""},f=ke(f),L={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"})f=f.replace(new RegExp(j,"g"),L[j]);var pe="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),fe="January February March April May June July August September October November December".split(" ");for(j in L={"%a":P=>pe[P.rb].substring(0,3),"%A":P=>pe[P.rb],"%b":P=>fe[P.Eb].substring(0,3),"%B":P=>fe[P.Eb],"%C":P=>C((P.zb+1900)/100|0,2),"%d":P=>C(P.Hb,2),"%e":P=>v(P.Hb,2," "),"%g":P=>N(P).toString().substring(2),"%G":N,"%H":P=>C(P.Db,2),"%I":P=>((P=P.Db)==0?P=12:12{for(var ee=0,ge=0;ge<=P.Eb-1;ee+=(Dt(P.zb+1900)?Pi:Oi)[ge++]);return C(P.Hb+ee,3)},"%m":P=>C(P.Eb+1,2),"%M":P=>C(P.bc,2),"%n":()=>` -`,"%p":P=>0<=P.Db&&12>P.Db?"AM":"PM","%S":P=>C(P.cc,2),"%t":()=>" ","%u":P=>P.rb||7,"%U":P=>C(Math.floor((P.yb+7-P.rb)/7),2),"%V":P=>{var ee=Math.floor((P.yb+7-(P.rb+6)%7)/7);if(2>=(P.rb+371-P.yb-2)%7&&ee++,ee)ee==53&&((ge=(P.rb+371-P.yb)%7)==4||ge==3&&Dt(P.zb)||(ee=1));else{ee=52;var ge=(P.rb+7-P.yb-1)%7;(ge==4||ge==5&&Dt(P.zb%400-1))&&ee++}return C(ee,2)},"%w":P=>P.rb,"%W":P=>C(Math.floor((P.yb+7-(P.rb+6)%7)/7),2),"%y":P=>(P.zb+1900).toString().substring(2),"%Y":P=>P.zb+1900,"%z":P=>{var ee=0<=(P=P.ac);return P=Math.abs(P)/60,(ee?"+":"-")+("0000"+(P/60*100+P%60)).slice(-4)},"%Z":P=>P.dc,"%%":()=>"%"},f=f.replace(/%%/g,"\0\0"),L)f.includes(j)&&(f=f.replace(new RegExp(j,"g"),L[j](y)));return j=function(P){var ee=Array(yn(P)+1);return jo(P,ee,0,ee.length),ee}(f=f.replace(/\0\0/g,"%")),j.length>c?0:(Qc(j,s),j.length-1)}function Jc(s,c,f,y){return zi(s>>>0,c>>>0,f>>>0,y>>>0)}b||function(){for(var s=u.numThreads-1;s--;)Wo();Se.unshift(()=>{Ae++,function(c){b?c():Promise.all(ct.map(No)).then(c)}(()=>or())})}();for(var Di=Array(256),pr=0;256>pr;++pr)Di[pr]=String.fromCharCode(pr);ai=Di,pt=u.BindingError=class extends Error{constructor(s){super(s),this.name="BindingError"}},u.InternalError=class extends Error{constructor(s){super(s),this.name="InternalError"}},ut.push(0,1,void 0,1,null,1,!0,1,!1,1),u.count_emval_handles=()=>ut.length/2-5-vn.length;var ep=[Bo,Ro,Ho,qo,Ko,Yo,Xo,Zo,Qo,Jo,ei,ti,ri,ni,oi,ii,wi,vi,Ii,Ci,Ti,Ai,Ei,ki],K=function(){function s(f,y){return K=f.exports,K=function(){var v=K,C={};for(let[O,B]of Object.entries(v))C[O]=typeof B=="function"?(...N)=>{ur.push(O);try{return B(...N)}finally{Te||(ur.pop(),Je&&ft===1&&ur.length===0&&(ft=0,bt+=1,sr(Gi),typeof Fibers<"u"&&Fibers.lc()))}}:B;return C}(),K=function(){var v=K,C=B=>N=>B(N)>>>0,O=B=>()=>B()>>>0;return(v=Object.assign({},v)).za=C(v.za),v.cb=O(v.cb),v.db=C(v.db),v.emscripten_main_runtime_thread_id=O(v.emscripten_main_runtime_thread_id),v.pb=C(v.pb),v.qb=O(v.qb),v}(),Mo.push(K.fb),Ot.unshift(K.ya),xe=y,or(),K}var c=zo();if(Ae++,u.instantiateWasm)try{return u.instantiateWasm(c,s)}catch(f){F(`Module.instantiateWasm callback failed with error: ${f}`),m(f)}return Ao||=u.locateFile?Eo("ort-wasm-simd-threaded.jsep.wasm")?"ort-wasm-simd-threaded.jsep.wasm":u.locateFile?u.locateFile("ort-wasm-simd-threaded.jsep.wasm",z):z+"ort-wasm-simd-threaded.jsep.wasm":new URL("ort-wasm-simd-threaded.jsep.wasm",import.meta.url).href,function(f,y){var v=Ao;return typeof WebAssembly.instantiateStreaming!="function"||Eo(v)||ko(v)||typeof fetch!="function"?Oo(v,f,y):fetch(v,{credentials:"same-origin"}).then(C=>WebAssembly.instantiateStreaming(C,f).then(y,function(O){return F(`wasm streaming compile failed: ${O}`),F("falling back to ArrayBuffer instantiation"),Oo(v,f,y)}))}(c,function(f){s(f.instance,f.module)}).catch(m),{}}(),Bi=s=>(Bi=K.za)(s),Ri=()=>(Ri=K.Aa)();u._OrtInit=(s,c)=>(u._OrtInit=K.Ba)(s,c),u._OrtGetLastError=(s,c)=>(u._OrtGetLastError=K.Ca)(s,c),u._OrtCreateSessionOptions=(s,c,f,y,v,C,O,B,N,L)=>(u._OrtCreateSessionOptions=K.Da)(s,c,f,y,v,C,O,B,N,L),u._OrtAppendExecutionProvider=(s,c)=>(u._OrtAppendExecutionProvider=K.Ea)(s,c),u._OrtAddFreeDimensionOverride=(s,c,f)=>(u._OrtAddFreeDimensionOverride=K.Fa)(s,c,f),u._OrtAddSessionConfigEntry=(s,c,f)=>(u._OrtAddSessionConfigEntry=K.Ga)(s,c,f),u._OrtReleaseSessionOptions=s=>(u._OrtReleaseSessionOptions=K.Ha)(s),u._OrtCreateSession=(s,c,f)=>(u._OrtCreateSession=K.Ia)(s,c,f),u._OrtReleaseSession=s=>(u._OrtReleaseSession=K.Ja)(s),u._OrtGetInputOutputCount=(s,c,f)=>(u._OrtGetInputOutputCount=K.Ka)(s,c,f),u._OrtGetInputName=(s,c)=>(u._OrtGetInputName=K.La)(s,c),u._OrtGetOutputName=(s,c)=>(u._OrtGetOutputName=K.Ma)(s,c),u._OrtFree=s=>(u._OrtFree=K.Na)(s),u._OrtCreateTensor=(s,c,f,y,v,C)=>(u._OrtCreateTensor=K.Oa)(s,c,f,y,v,C),u._OrtGetTensorData=(s,c,f,y,v)=>(u._OrtGetTensorData=K.Pa)(s,c,f,y,v),u._OrtReleaseTensor=s=>(u._OrtReleaseTensor=K.Qa)(s),u._OrtCreateRunOptions=(s,c,f,y)=>(u._OrtCreateRunOptions=K.Ra)(s,c,f,y),u._OrtAddRunConfigEntry=(s,c,f)=>(u._OrtAddRunConfigEntry=K.Sa)(s,c,f),u._OrtReleaseRunOptions=s=>(u._OrtReleaseRunOptions=K.Ta)(s),u._OrtCreateBinding=s=>(u._OrtCreateBinding=K.Ua)(s),u._OrtBindInput=(s,c,f)=>(u._OrtBindInput=K.Va)(s,c,f),u._OrtBindOutput=(s,c,f,y)=>(u._OrtBindOutput=K.Wa)(s,c,f,y),u._OrtClearBoundOutputs=s=>(u._OrtClearBoundOutputs=K.Xa)(s),u._OrtReleaseBinding=s=>(u._OrtReleaseBinding=K.Ya)(s),u._OrtRunWithBinding=(s,c,f,y,v)=>(u._OrtRunWithBinding=K.Za)(s,c,f,y,v),u._OrtRun=(s,c,f,y,v,C,O,B)=>(u._OrtRun=K._a)(s,c,f,y,v,C,O,B),u._OrtEndProfiling=s=>(u._OrtEndProfiling=K.$a)(s),u._JsepOutput=(s,c,f)=>(u._JsepOutput=K.ab)(s,c,f),u._JsepGetNodeName=s=>(u._JsepGetNodeName=K.bb)(s);var mr,Rt=()=>(Rt=K.cb)(),fr=u._malloc=s=>(fr=u._malloc=K.db)(s),et=u._free=s=>(et=u._free=K.eb)(s),kn=(s,c,f,y,v,C)=>(kn=K.hb)(s,c,f,y,v,C),Mi=()=>(Mi=K.ib)(),Ui=(s,c,f,y,v)=>(Ui=K.jb)(s,c,f,y,v),Pn=s=>(Pn=K.kb)(s),hr=s=>(hr=K.lb)(s),Vi=()=>(Vi=K.mb)(),Ni=(s,c)=>(Ni=K.nb)(s,c),gr=s=>(gr=K.ob)(s),On=s=>(On=K.pb)(s),zn=()=>(zn=K.qb)(),Wi=u.dynCall_ii=(s,c)=>(Wi=u.dynCall_ii=K.sb)(s,c),Hi=s=>(Hi=K.tb)(s),Gi=()=>(Gi=K.ub)(),Li=s=>(Li=K.vb)(s),Fi=()=>(Fi=K.wb)();function qi(){if(!(0zn(),u.stackRestore=s=>gr(s),u.stackAlloc=s=>On(s),u.UTF8ToString=ke,u.stringToUTF8=zt,u.lengthBytesUTF8=yn,lt=function s(){mr||qi(),mr||(lt=s)},qi(),h}),lp=Ta;globalThis.self?.name==="em-pthread"&&Ta()});var Mt,cp,pp,mp,ka,Pa,fp,Oa,qt=U(()=>{"use strict";Cr();Mt=!1?void 0:import.meta.url??(typeof document<"u"?document.currentScript?.src:typeof self<"u"?self.location?.href:void 0),cp=!1||typeof location>"u"?void 0:location.origin,pp=(e,t)=>{try{let r=t??Mt;return(r?new URL(e,r):new URL(e)).origin===cp}catch{return!1}},mp=async e=>{let r=await(await fetch(e,{credentials:"same-origin"})).blob();return URL.createObjectURL(r)},ka=(Ca(),yr(Ia)).default,Pa=async()=>{if(!Mt)throw new Error("Failed to load proxy worker: cannot determine the script source URL.");if(pp(Mt))return[void 0,ka()];let e=await mp(Mt);return[e,ka(e)]},fp=(Ea(),yr(Aa)).default,Oa=async(e,t,r)=>[void 0,fp]});var Hn,Gn,Br,za,hp,gp,Tr,Ie,St=U(()=>{"use strict";qt();Gn=!1,Br=!1,za=!1,hp=()=>{if(typeof SharedArrayBuffer>"u")return!1;try{return typeof MessageChannel<"u"&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},gp=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},Tr=async e=>{if(Gn)return Promise.resolve();if(Br)throw new Error("multiple calls to 'initializeWebAssembly()' detected.");if(za)throw new Error("previous call to 'initializeWebAssembly()' failed.");Br=!0;let t=e.initTimeout,r=e.numThreads;if(!gp())throw new Error("WebAssembly SIMD is not supported in the current environment.");let n=hp();r>1&&!n&&(typeof self<"u"&&!self.crossOriginIsolated&&console.warn("env.wasm.numThreads is set to "+r+", but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info."),console.warn("WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading."),e.numThreads=r=1);let o=e.wasmPaths,i=typeof o=="string"?o:void 0,a=o?.mjs,l=a?.href??a,d=o?.wasm,p=d?.href??d,[m,u]=await Oa(l,i,r>1),h=!1,w=[];if(t>0&&w.push(new Promise(g=>{setTimeout(()=>{h=!0,g()},t)})),w.push(new Promise((g,b)=>{let x={numThreads:r};(p||i)&&(x.locateFile=(_,$)=>p??(i??$)+_),u(x).then(_=>{Br=!1,Gn=!0,Hn=_,g(),m&&URL.revokeObjectURL(m)},_=>{Br=!1,za=!0,b(_)})})),await Promise.race(w),h)throw new Error(`WebAssembly backend initializing failed due to timeout: ${t}ms`)},Ie=()=>{if(Gn&&Hn)return Hn;throw new Error("WebAssembly is not initialized yet.")}});var Ee,jt,$e,Rr=U(()=>{"use strict";St();Ee=(e,t)=>{let r=Ie(),n=r.lengthBytesUTF8(e)+1,o=r._malloc(n);return r.stringToUTF8(e,o,n),t.push(o),o},jt=(e,t,r,n)=>{if(typeof e=="object"&&e!==null){if(r.has(e))throw new Error("Circular reference in options");r.add(e)}Object.entries(e).forEach(([o,i])=>{let a=t?t+o:o;if(typeof i=="object")jt(i,a+".",r,n);else if(typeof i=="string"||typeof i=="number")n(a,i.toString());else if(typeof i=="boolean")n(a,i?"1":"0");else throw new Error(`Can't handle extra config type: ${typeof i}`)})},$e=e=>{let t=Ie(),r=t.stackSave();try{let n=t.stackAlloc(8);t._OrtGetLastError(n,n+4);let o=t.HEAP32[n/4],i=t.HEAPU32[n/4+1],a=i?t.UTF8ToString(i):"";throw new Error(`${e} ERROR_CODE: ${o}, ERROR_MESSAGE: ${a}`)}finally{t.stackRestore(r)}}});var Da,Ba=U(()=>{"use strict";St();Rr();Da=e=>{let t=Ie(),r=0,n=[],o=e||{};try{if(e?.logSeverityLevel===void 0)o.logSeverityLevel=2;else if(typeof e.logSeverityLevel!="number"||!Number.isInteger(e.logSeverityLevel)||e.logSeverityLevel<0||e.logSeverityLevel>4)throw new Error(`log serverity level is not valid: ${e.logSeverityLevel}`);if(e?.logVerbosityLevel===void 0)o.logVerbosityLevel=0;else if(typeof e.logVerbosityLevel!="number"||!Number.isInteger(e.logVerbosityLevel))throw new Error(`log verbosity level is not valid: ${e.logVerbosityLevel}`);e?.terminate===void 0&&(o.terminate=!1);let i=0;return e?.tag!==void 0&&(i=Ee(e.tag,n)),r=t._OrtCreateRunOptions(o.logSeverityLevel,o.logVerbosityLevel,!!o.terminate,i),r===0&&$e("Can't create run options."),e?.extra!==void 0&&jt(e.extra,"",new WeakSet,(a,l)=>{let d=Ee(a,n),p=Ee(l,n);t._OrtAddRunConfigEntry(r,d,p)!==0&&$e(`Can't set a run config entry: ${a} - ${l}.`)}),[r,n]}catch(i){throw r!==0&&t._OrtReleaseRunOptions(r),n.forEach(a=>t._free(a)),i}}});var yp,bp,wp,vp,Ra,Ma=U(()=>{"use strict";St();Rr();yp=e=>{switch(e){case"disabled":return 0;case"basic":return 1;case"extended":return 2;case"all":return 99;default:throw new Error(`unsupported graph optimization level: ${e}`)}},bp=e=>{switch(e){case"sequential":return 0;case"parallel":return 1;default:throw new Error(`unsupported execution mode: ${e}`)}},wp=e=>{e.extra||(e.extra={}),e.extra.session||(e.extra.session={});let t=e.extra.session;t.use_ort_model_bytes_directly||(t.use_ort_model_bytes_directly="1"),e.executionProviders&&e.executionProviders.some(r=>(typeof r=="string"?r:r.name)==="webgpu")&&(e.enableMemPattern=!1)},vp=(e,t,r)=>{for(let n of t){let o=typeof n=="string"?n:n.name;switch(o){case"webnn":if(o="WEBNN",typeof n!="string"){let l=n?.deviceType;if(l){let d=Ee("deviceType",r),p=Ee(l,r);Ie()._OrtAddSessionConfigEntry(e,d,p)!==0&&$e(`Can't set a session config entry: 'deviceType' - ${l}.`)}}break;case"webgpu":if(o="JS",typeof n!="string"){let a=n;if(a?.preferredLayout){if(a.preferredLayout!=="NCHW"&&a.preferredLayout!=="NHWC")throw new Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${a.preferredLayout}`);let l=Ee("preferredLayout",r),d=Ee(a.preferredLayout,r);Ie()._OrtAddSessionConfigEntry(e,l,d)!==0&&$e(`Can't set a session config entry: 'preferredLayout' - ${a.preferredLayout}.`)}}break;case"wasm":case"cpu":continue;default:throw new Error(`not supported execution provider: ${o}`)}let i=Ee(o,r);Ie()._OrtAppendExecutionProvider(e,i)!==0&&$e(`Can't append execution provider: ${o}.`)}},Ra=e=>{let t=Ie(),r=0,n=[],o=e||{};wp(o);try{let i=yp(o.graphOptimizationLevel??"all"),a=bp(o.executionMode??"sequential"),l=typeof o.logId=="string"?Ee(o.logId,n):0,d=o.logSeverityLevel??2;if(!Number.isInteger(d)||d<0||d>4)throw new Error(`log serverity level is not valid: ${d}`);let p=o.logVerbosityLevel??0;if(!Number.isInteger(p)||p<0||p>4)throw new Error(`log verbosity level is not valid: ${p}`);let m=typeof o.optimizedModelFilePath=="string"?Ee(o.optimizedModelFilePath,n):0;if(r=t._OrtCreateSessionOptions(i,!!o.enableCpuMemArena,!!o.enableMemPattern,a,!!o.enableProfiling,0,l,d,p,m),r===0&&$e("Can't create session options."),o.executionProviders&&vp(r,o.executionProviders,n),o.enableGraphCapture!==void 0){if(typeof o.enableGraphCapture!="boolean")throw new Error(`enableGraphCapture must be a boolean value: ${o.enableGraphCapture}`);let u=Ee("enableGraphCapture",n),h=Ee(o.enableGraphCapture.toString(),n);t._OrtAddSessionConfigEntry(r,u,h)!==0&&$e(`Can't set a session config entry: 'enableGraphCapture' - ${o.enableGraphCapture}.`)}if(o.freeDimensionOverrides)for(let[u,h]of Object.entries(o.freeDimensionOverrides)){if(typeof u!="string")throw new Error(`free dimension override name must be a string: ${u}`);if(typeof h!="number"||!Number.isInteger(h)||h<0)throw new Error(`free dimension override value must be a non-negative integer: ${h}`);let w=Ee(u,n);t._OrtAddFreeDimensionOverride(r,w,h)!==0&&$e(`Can't set a free dimension override: ${u} - ${h}.`)}return o.extra!==void 0&&jt(o.extra,"",new WeakSet,(u,h)=>{let w=Ee(u,n),g=Ee(h,n);t._OrtAddSessionConfigEntry(r,w,g)!==0&&$e(`Can't set a session config entry: ${u} - ${h}.`)}),[r,n]}catch(i){throw r!==0&&t._OrtReleaseSessionOptions(r),n.forEach(a=>t._free(a)),i}}});var Ln,ht,It,Mr,Yt,Ur,Fn,Q=U(()=>{"use strict";Ln=e=>{switch(e){case"int8":return 3;case"uint8":return 2;case"bool":return 9;case"int16":return 5;case"uint16":return 4;case"int32":return 6;case"uint32":return 12;case"float16":return 10;case"float32":return 1;case"float64":return 11;case"string":return 8;case"int64":return 7;case"uint64":return 13;default:throw new Error(`unsupported data type: ${e}`)}},ht=e=>{switch(e){case 3:return"int8";case 2:return"uint8";case 9:return"bool";case 5:return"int16";case 4:return"uint16";case 6:return"int32";case 12:return"uint32";case 10:return"float16";case 1:return"float32";case 11:return"float64";case 8:return"string";case 7:return"int64";case 13:return"uint64";default:throw new Error(`unsupported data type: ${e}`)}},It=e=>[void 0,4,1,1,2,2,4,8,void 0,1,2,8,4,8,void 0,void 0,void 0][e],Mr=e=>{switch(e){case"float16":return typeof Float16Array<"u"&&Float16Array.from?Float16Array:Uint16Array;case"float32":return Float32Array;case"uint8":return Uint8Array;case"int8":return Int8Array;case"uint16":return Uint16Array;case"int16":return Int16Array;case"int32":return Int32Array;case"bool":return Uint8Array;case"float64":return Float64Array;case"uint32":return Uint32Array;case"int64":return BigInt64Array;case"uint64":return BigUint64Array;default:throw new Error(`unsupported type: ${e}`)}},Yt=e=>{switch(e){case"verbose":return 0;case"info":return 1;case"warning":return 2;case"error":return 3;case"fatal":return 4;default:throw new Error(`unsupported logging level: ${e}`)}},Ur=e=>e==="float32"||e==="float16"||e==="int32"||e==="int64"||e==="uint32"||e==="uint8"||e==="bool",Fn=e=>{switch(e){case"none":return 0;case"cpu":return 1;case"cpu-pinned":return 2;case"texture":return 3;case"gpu-buffer":return 4;default:throw new Error(`unsupported data location: ${e}`)}}});var Xt,qn=U(()=>{"use strict";Cr();Xt=async e=>{if(typeof e=="string")if(!1)try{let{readFile:t}=Bn("node:fs/promises");return new Uint8Array(await t(e))}catch(t){if(t.code==="ERR_FS_FILE_TOO_LARGE"){let{createReadStream:r}=Bn("node:fs"),n=r(e),o=[];for await(let i of n)o.push(i);return new Uint8Array(Buffer.concat(o))}throw t}else{let t=await fetch(e);if(!t.ok)throw new Error(`failed to load external data file: ${e}`);let r=t.headers.get("Content-Length"),n=r?parseInt(r,10):0;if(n<1073741824)return new Uint8Array(await t.arrayBuffer());{if(!t.body)throw new Error(`failed to load external data file: ${e}, no response body.`);let o=t.body.getReader(),i;try{i=new ArrayBuffer(n)}catch(l){if(l instanceof RangeError){let d=Math.ceil(n/65536);i=new WebAssembly.Memory({initial:d,maximum:d}).buffer}else throw l}let a=0;for(;;){let{done:l,value:d}=await o.read();if(l)break;let p=d.byteLength;new Uint8Array(i,a,p).set(d),a+=p}return new Uint8Array(i,0,n)}}else return e instanceof Blob?new Uint8Array(await e.arrayBuffer()):e instanceof Uint8Array?e:new Uint8Array(e)}});var $p,_p,Ua,Va,Na,xp,be,dt=U(()=>{"use strict";Q();$p=["V","I","W","E","F"],_p=(e,t)=>{console.log(`[${$p[e]},${new Date().toISOString()}]${t}`)},Na=(e,t)=>{Ua=e,Va=t},xp=(e,t)=>{let r=Yt(e),n=Yt(Ua);r>=n&&_p(r,typeof t=="function"?t():t)},be=(...e)=>{Va&&xp(...e)}});var Wa,Ha=U(()=>{"use strict";Q();Wa=(e,t)=>new(Mr(t))(e)});var Vr=U(()=>{"use strict"});var Ga,Kn,jn,Sp,Ip,La,Xn,Yn,qa,Ka=U(()=>{"use strict";dt();Vr();Ga=new Map([[64,250],[128,200],[256,200],[512,200],[2048,230],[4096,200],[8192,50],[16384,50],[32768,50],[65536,50],[131072,50],[262144,50],[524288,50],[1048576,50],[2097152,30],[4194304,20],[8388608,10],[12582912,10],[16777216,10],[26214400,15],[33554432,22],[44236800,2],[58982400,6],[67108864,6],[134217728,6],[167772160,6]]),Kn=[],jn=e=>Math.ceil(e/16)*16,Sp=e=>{for(let t=0;tIp++,Xn=async(e,t,r,n)=>{let o=jn(r),i=e.device.createBuffer({size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});try{let a=e.getCommandEncoder();e.endComputePass(),a.copyBufferToBuffer(t,0,i,0,o),e.flush(),await i.mapAsync(GPUMapMode.READ);let l=i.getMappedRange();if(n){let d=n();return d.set(new Uint8Array(l,0,r)),d}else return new Uint8Array(l.slice(0,r))}finally{i.destroy()}},Yn=class{constructor(t){this.backend=t;this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.buffersForUploadingPending=[],this.buffersPending=[],this.externalBuffers=new Map,this.capturedPendingBuffers=new Map;for(let[r]of Ga)Kn.push(r),this.freeBuffers.set(r,[]),this.freeUniformBuffers.set(r,[])}upload(t,r){let n=r.buffer,o=r.byteOffset,i=r.byteLength,a=jn(i),l=this.storageCache.get(t);if(!l)throw new Error("gpu data for uploading does not exist");if(l.originalSize!==i)throw new Error(`inconsistent data size. gpu data size=${l.originalSize}, data size=${i}`);let d=this.backend.device.createBuffer({mappedAtCreation:!0,size:a,usage:GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC}),p=d.getMappedRange();new Uint8Array(p).set(new Uint8Array(n,o,i)),d.unmap();let m=this.backend.getCommandEncoder();this.backend.endComputePass(),m.copyBufferToBuffer(d,0,l.gpuData.buffer,0,a),be("verbose",()=>`[WebGPU] GpuDataManager.upload(id=${t})`),this.buffersForUploadingPending.push(d)}memcpy(t,r){let n=this.storageCache.get(t);if(!n)throw new Error("source gpu data for memcpy does not exist");let o=this.storageCache.get(r);if(!o)throw new Error("destination gpu data for memcpy does not exist");if(n.originalSize!==o.originalSize)throw new Error("inconsistent source and destination gpu data size");let i=jn(n.originalSize),a=this.backend.getCommandEncoder();this.backend.endComputePass(),a.copyBufferToBuffer(n.gpuData.buffer,0,o.gpuData.buffer,0,i)}registerExternalBuffer(t,r,n){let o;if(n){if(o=this.externalBuffers.get(n),o===void 0)throw new Error("previous buffer is not registered");if(t===n)return be("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${r}) => id=${o}, buffer is the same, skip.`),o;if(this.backend.capturedCommandList.has(this.backend.currentSessionId))throw new Error(`Registering a different external buffer under graph capture mode is not supported yet. - Please use the previous external buffer!`);this.externalBuffers.delete(n)}else o=La();return this.storageCache.set(o,{gpuData:{id:o,type:0,buffer:t},originalSize:r}),this.externalBuffers.set(t,o),be("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${r}) => id=${o}, registered.`),o}unregisterExternalBuffer(t){let r=this.externalBuffers.get(t);r!==void 0&&(this.storageCache.delete(r),this.externalBuffers.delete(t),be("verbose",()=>`[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${r}`))}create(t,r=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST){let n=Sp(t),o,i=(r&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE,a=(r&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM;if(i||a){let p=(i?this.freeBuffers:this.freeUniformBuffers).get(n);p?p.length>0?o=p.pop():o=this.backend.device.createBuffer({size:n,usage:r}):o=this.backend.device.createBuffer({size:n,usage:r})}else o=this.backend.device.createBuffer({size:n,usage:r});let l={id:La(),type:0,buffer:o};return this.storageCache.set(l.id,{gpuData:l,originalSize:t}),be("verbose",()=>`[WebGPU] GpuDataManager.create(size=${t}) => id=${l.id}`),l}get(t){return this.storageCache.get(t)?.gpuData}release(t){let r=this.storageCache.get(t);if(!r)throw new Error("releasing data does not exist");return be("verbose",()=>`[WebGPU] GpuDataManager.release(id=${t}), gpuDataId=${r.gpuData.id}`),this.storageCache.delete(t),this.buffersPending.push(r.gpuData.buffer),r.originalSize}async download(t,r){let n=this.storageCache.get(t);if(!n)throw new Error("data does not exist");await Xn(this.backend,n.gpuData.buffer,n.originalSize,r)}refreshPendingBuffers(){for(let t of this.buffersForUploadingPending)t.destroy();if(this.buffersForUploadingPending=[],this.buffersPending.length!==0)if(this.backend.sessionStatus==="default"){for(let t of this.buffersPending){let r=Ga.get(t.size);if((t.usage&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE){let n=this.freeBuffers.get(t.size)||[];r===void 0||n.length>=r?t.destroy():n.push(t)}else if((t.usage&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM){let n=this.freeUniformBuffers.get(t.size)||[];r===void 0||n.length>=r?t.destroy():n.push(t)}else t.destroy()}this.buffersPending=[]}else{let t=this.capturedPendingBuffers.get(this.backend.currentSessionId);t||(t=[],this.capturedPendingBuffers.set(this.backend.currentSessionId,t));for(let r of this.buffersPending)t.push(r);this.buffersPending=[]}}dispose(){this.freeBuffers.forEach(t=>{t.forEach(r=>{r.destroy()})}),this.freeUniformBuffers.forEach(t=>{t.forEach(r=>{r.destroy()})}),this.storageCache.forEach(t=>{t.gpuData.buffer.destroy()}),this.capturedPendingBuffers.forEach(t=>{t.forEach(r=>{r.destroy()})}),this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.capturedPendingBuffers=new Map}onReleaseSession(t){let r=this.capturedPendingBuffers.get(t);r&&(r.forEach(n=>{n.destroy()}),this.capturedPendingBuffers.delete(t))}},qa=(...e)=>new Yn(...e)});var Zn,te,Ce=U(()=>{"use strict";Zn=class{constructor(t){Object.assign(this,t)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map(t=>`${this[t]}`).join(";")),this.key}},te=e=>new Zn(e)});var Qn,tt,k,Ct,Nr,Wr,Hr,ae=U(()=>{"use strict";Qn=class{static calcMatMulShape(t,r){return t[1]!==r[0]?void 0:[t[0],r[1]]}},tt=class{static calcShape(t,r,n=!1){let o=t.length,i=r.length;if(o===0)return r;if(i===0)return t;let a=Math.max(t.length,r.length),l=new Array(a);if(n){if(o<2||i<2)return;let d=Qn.calcMatMulShape([t[o-2],t[o-1]],[r[i-2],r[i-1]]);if(d===void 0)return;[l[a-2],l[a-1]]=d}for(let d=n?3:1;d<=a;d++){let p=o-d<0?1:t[o-d],m=i-d<0?1:r[i-d];if(p!==m&&p>1&&m>1)return;let u=Math.max(p,m);if(p&&m)l[a-d]=Math.max(p,m);else{if(u>1)return;l[a-d]=0}}return l}static isValidBroadcast(t,r){let n=t.length,o=r.length;if(n>o)return!1;for(let i=1;i<=n;i++)if(t[n-i]!==1&&t[n-i]!==r[o-i])return!1;return!0}},k=class e{static size(t){return e.getSizeFromDimensionRange(t,0,t.length)}static convertShape(t,r=4){let n=t.length;if(n===0)return[];let o=new Array(n),i=n-1;for(;i>=0;){if(t[i]%r===0){o[i]=t[i]/r;break}if(r%t[i]!==0)throw new Error("cannot convert shape");o[i]=1,r/=t[i],i--}for(i--;i>=0;i--)o[i]=t[i];return o}static sizeFromDimension(t,r){if(r<0||r>t.length)throw new Error(`invalid dimension of ${r} for sizeFromDimension as Tensor has ${t.length} dimensions.`);return e.getSizeFromDimensionRange(t,r,t.length)}static sizeToDimension(t,r){if(r<0||r>t.length)throw new Error(`invalid dimension of ${r} for sizeToDimension as Tensor has ${t.length} dimensions.`);return e.getSizeFromDimensionRange(t,0,r)}static getSizeFromDimensionRange(t,r,n){let o=1;for(let i=r;i=0;--o)n[o]=n[o+1]*t[o+1];return n}static normalizeAxis(t,r){if(t<-r&&t>=r)throw new Error("unsupported axis for this operation.");return t<0?t+r:t}static normalizeAxes(t,r){return t.map(n=>this.normalizeAxis(n,r??t.length))}static sortBasedOnPerm(t,r){return r?r.map(n=>t[n]):t.slice().reverse()}static padShape(t,r){let n=t.length;return t.map((o,i)=>o+r[i]+r[i+n])}static areEqual(t,r){return t.length!==r.length?!1:t.every((n,o)=>n===r[o])}},Ct=class e{static adjustPoolAttributes(t,r,n,o,i,a){if(!t&&n.length!==r.length-2)throw new Error("length of specified kernel shapes should be 2 less than length of input dimensions");if(t)for(let l=0;l=n.length?n.push(r[l+2]):n[l]=r[l+2];for(let l=0;l=n[l]||a[l+n.length]>=n[l])throw new Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(t,r,n,o,i,a,l){if(l){if(i.length!==2*(t.length-2))throw new Error("length of pads should be twice the length of data dimensions");if(r.length!==t.length-2)throw new Error("length of strides should be the length of data dimensions");if(o.length!==t.length-2)throw new Error("length of kernel shapes should be the length of data dimensions");for(let d=0;d{"use strict";Q();ae();Tt=64,eo=(e,t)=>{if(t===3)throw new Error("vec3 has same alignment as vec4, use vec4 instead");switch(e){case 10:return t>1?`vec${t}`:"f16";case 1:return t>1?`vec${t}`:"f32";case 6:return t>1?`vec${t}`:"i32";case 12:return t>1?`vec${t}`:"u32";case 7:if(t>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","i32"];case 13:if(t>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","u32"];case 9:if(t!==4)throw new Error("bool must be vec4");return["u32","vec4"];default:throw new Error(`Unknown data type: ${e}`)}},he=(e,t=1)=>{let r=eo(e,t);return typeof r=="string"?r:r[0]},Oe=(e,t=1)=>{let r=eo(e,t);return typeof r=="string"?r:r[1]},V=(...e)=>{let t=[];return e.forEach(r=>{r.length!==0&&t.push({type:12,data:r},{type:12,data:k.computeStrides(r)})}),t},we=e=>e%4===0?4:e%2===0?2:1,gt=(e="f32",t,r="0")=>!t||t===1?`${e}(${r})`:`vec${t}<${e}>(${r})`,At=(e,t,r)=>e==="f32"?r:t===1?`f32(${r})`:`vec${t}(${r})`,qe=(e,t)=>t===4?`(${e}.x + ${e}.y + ${e}.z + ${e}.w)`:t===2?`(${e}.x + ${e}.y)`:t===3?`(${e}.x + ${e}.y + ${e}.z)`:e,G=(e,t,r,n)=>e.startsWith("uniforms.")&&r>4?typeof t=="string"?n==="f16"?`${e}[(${t}) / 8][(${t}) % 8 / 4][(${t}) % 8 % 4]`:`${e}[(${t}) / 4][(${t}) % 4]`:n==="f16"?`${e}[${Math.floor(t/8)}][${Math.floor(t%8/4)}][${t%8%4}]`:`${e}[${Math.floor(t/4)}][${t%4}]`:r>1?`${e}[${t}]`:e,to=(e,t,r,n,o)=>{let i=typeof r=="number",a=i?r:r.length,l=[...new Array(a).keys()],d=a<2?"u32":a<=4?`vec${a}`:`array`,p=eo(t,o),m=typeof p=="string"?p:p[1],u=typeof p=="string"?p:p[0],h={indices:d,value:m,storage:u,tensor:t},w=R=>typeof R=="string"?R:`${R}u`,g={offsetToIndices:!1,indicesToOffset:!1,broadcastedIndicesToOffset:!1,set:!1,setByIndices:!1,get:!1,getByIndices:!1},b=i?"uniforms.":"",x=`${b}${e}_shape`,_=`${b}${e}_strides`,$="";for(let R=0;RK.name).join(", ")}) => ${y.name}>`,Sc(gi(f,s))}function Tc(s){return s=lr(s>>>0),Ge(u[s])}function Ac(s,c){return c>>>=0,s=He(s>>>0),c=He(c),Ge(s[c])}function Ec(s){9<(s>>>=0)&&(ut[s+1]+=1)}function kc(){return Ge([])}function Pc(s){s=He(s>>>0);for(var c=Array(s.length),f=0;f>>0))}function Dc(){return Ge({})}function zc(s){for(var c=He(s>>>=0);c.length;){var f=c.pop();c.pop()(f)}_n(s)}function Bc(s,c,f){c>>>=0,f>>>=0,s=He(s>>>0),c=He(c),f=He(f),s[c]=f}function Rc(s,c){return c>>>=0,s=(s=Cn(s>>>0,"_emval_take_value")).readValueFromPointer(c),Ge(s)}function Mc(s,c){s=-9007199254740992>s||9007199254740992>>=0,s=new Date(1e3*s),i()[c>>>2>>>0]=s.getUTCSeconds(),i()[c+4>>>2>>>0]=s.getUTCMinutes(),i()[c+8>>>2>>>0]=s.getUTCHours(),i()[c+12>>>2>>>0]=s.getUTCDate(),i()[c+16>>>2>>>0]=s.getUTCMonth(),i()[c+20>>>2>>>0]=s.getUTCFullYear()-1900,i()[c+24>>>2>>>0]=s.getUTCDay(),s=(s.getTime()-Date.UTC(s.getUTCFullYear(),0,1,0,0,0,0))/864e5|0,i()[c+28>>>2>>>0]=s}var Bt=s=>s%4==0&&(s%100!=0||s%400==0),yi=[0,31,60,91,121,152,182,213,244,274,305,335],bi=[0,31,59,90,120,151,181,212,243,273,304,334];function Uc(s,c){s=-9007199254740992>s||9007199254740992>>=0,s=new Date(1e3*s),i()[c>>>2>>>0]=s.getSeconds(),i()[c+4>>>2>>>0]=s.getMinutes(),i()[c+8>>>2>>>0]=s.getHours(),i()[c+12>>>2>>>0]=s.getDate(),i()[c+16>>>2>>>0]=s.getMonth(),i()[c+20>>>2>>>0]=s.getFullYear()-1900,i()[c+24>>>2>>>0]=s.getDay();var f=(Bt(s.getFullYear())?yi:bi)[s.getMonth()]+s.getDate()-1|0;i()[c+28>>>2>>>0]=f,i()[c+36>>>2>>>0]=-60*s.getTimezoneOffset(),f=new Date(s.getFullYear(),6,1).getTimezoneOffset();var y=new Date(s.getFullYear(),0,1).getTimezoneOffset();s=0|(f!=y&&s.getTimezoneOffset()==Math.min(y,f)),i()[c+32>>>2>>>0]=s}function Vc(s){s>>>=0;var c=new Date(i()[s+20>>>2>>>0]+1900,i()[s+16>>>2>>>0],i()[s+12>>>2>>>0],i()[s+8>>>2>>>0],i()[s+4>>>2>>>0],i()[s>>>2>>>0],0),f=i()[s+32>>>2>>>0],y=c.getTimezoneOffset(),v=new Date(c.getFullYear(),6,1).getTimezoneOffset(),C=new Date(c.getFullYear(),0,1).getTimezoneOffset(),O=Math.min(C,v);return 0>f?i()[s+32>>>2>>>0]=+(v!=C&&O==y):0>>2>>>0]=c.getDay(),f=(Bt(c.getFullYear())?yi:bi)[c.getMonth()]+c.getDate()-1|0,i()[s+28>>>2>>>0]=f,i()[s>>>2>>>0]=c.getSeconds(),i()[s+4>>>2>>>0]=c.getMinutes(),i()[s+8>>>2>>>0]=c.getHours(),i()[s+12>>>2>>>0]=c.getDate(),i()[s+16>>>2>>>0]=c.getMonth(),i()[s+20>>>2>>>0]=c.getYear(),s=c.getTime(),BigInt(isNaN(s)?-1:s/1e3)}function wi(s,c,f,y,v,C,O){return b?_e(16,1,s,c,f,y,v,C,O):-52}function vi(s,c,f,y,v,C){if(b)return _e(17,1,s,c,f,y,v,C)}function Nc(s,c,f,y){s>>>=0,c>>>=0,f>>>=0,y>>>=0;var v=new Date().getFullYear(),C=new Date(v,0,1),O=new Date(v,6,1);v=C.getTimezoneOffset();var B=O.getTimezoneOffset(),N=Math.max(v,B);a()[s>>>2>>>0]=60*N,i()[c>>>2>>>0]=+(v!=B),C=(s=L=>L.toLocaleTimeString(void 0,{hour12:!1,timeZoneName:"short"}).split(" ")[1])(C),O=s(O),B{An.length=0;for(var f;f=r()[s++>>>0];){var y=f!=105;c+=(y&=f!=112)&&c%8?4:0,An.push(f==112?a()[c>>>2>>>0]:f==106?R[c>>>3]:f==105?i()[c>>>2>>>0]:d()[c>>>3>>>0]),c+=y?8:4}return An};function Wc(s,c,f){return s>>>=0,c=$i(c>>>0,f>>>0),mn[s](...c)}function Hc(s,c,f){return s>>>=0,c=$i(c>>>0,f>>>0),mn[s](...c)}var Gc=()=>{},Lc=()=>Date.now();function Fc(s,c){return F(ke(s>>>0,c>>>0))}var _i,qc=()=>{throw bt+=1,"unwind"};function jc(){return 4294901760}_i=()=>performance.timeOrigin+performance.now();var Kc=()=>navigator.hardwareConcurrency;function Yc(){return Dt("Cannot use emscripten_pc_get_function without -sUSE_OFFSET_CONVERTER"),0}function Xc(s){s>>>=0;var c=r().length;if(s<=c||4294901760=f;f*=2){var y=c*(1+.2/f);y=Math.min(y,s+100663296);var v=Math;y=Math.max(s,y);e:{v=(v.min.call(v,4294901760,y+(65536-y%65536)%65536)-X.buffer.byteLength+65535)/65536;try{X.grow(v),ve();var C=1;break e}catch{}C=void 0}if(C)return!0}return!1}var cr=()=>(Dt("Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER"),0),Rt={},xi=s=>{s.forEach(c=>{var f=cr();f&&(Rt[f]=c)})};function Zc(){var s=Error().stack.toString().split(` +`);return s[0]=="Error"&&s.shift(),xi(s),Rt.Ob=cr(),Rt.ac=s,Rt.Ob}function Qc(s,c,f){if(s>>>=0,c>>>=0,Rt.Ob==s)var y=Rt.ac;else(y=Error().stack.toString().split(` +`))[0]=="Error"&&y.shift(),xi(y);for(var v=3;y[v]&&cr()!=s;)++v;for(s=0;s>>2>>>0]=cr();return s}var En,kn={},Si=()=>{if(!En){var s,c={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:T||"./this.program"};for(s in kn)kn[s]===void 0?delete c[s]:c[s]=kn[s];var f=[];for(s in c)f.push(`${s}=${c[s]}`);En=f}return En};function Ii(s,c){if(b)return _e(18,1,s,c);s>>>=0,c>>>=0;var f=0;return Si().forEach((y,v)=>{var C=c+f;for(v=a()[s+4*v>>>2>>>0]=C,C=0;C>>0]=y.charCodeAt(C);t()[v>>>0]=0,f+=y.length+1}),0}function Ci(s,c){if(b)return _e(19,1,s,c);s>>>=0,c>>>=0;var f=Si();a()[s>>>2>>>0]=f.length;var y=0;return f.forEach(v=>y+=v.length+1),a()[c>>>2>>>0]=y,0}function Ti(s){return b?_e(20,1,s):52}function Ai(s,c,f,y){return b?_e(21,1,s,c,f,y):52}function Ei(s,c,f,y){return b?_e(22,1,s,c,f,y):70}var Jc=[null,[],[]];function ki(s,c,f,y){if(b)return _e(23,1,s,c,f,y);c>>>=0,f>>>=0,y>>>=0;for(var v=0,C=0;C>>2>>>0],B=a()[c+4>>>2>>>0];c+=8;for(var N=0;N>>0],K=Jc[s];L===0||L===10?((s===1?W:F)(Fo(K,0)),K.length=0):K.push(L)}v+=B}return a()[y>>>2>>>0]=v,0}var Pi=[31,29,31,30,31,30,31,31,30,31,30,31],Oi=[31,28,31,30,31,30,31,31,30,31,30,31],ep=(s,c)=>{t().set(s,c>>>0)};function Di(s,c,f,y){function v(P,ee,ge){for(P=typeof P=="number"?P.toString():P||"";P.lengthji?-1:0vt-P.getDate())){P.setDate(P.getDate()+ee);break}ee-=vt-P.getDate()+1,P.setDate(1),11>ge?P.setMonth(ge+1):(P.setMonth(0),P.setFullYear(P.getFullYear()+1))}return ge=new Date(P.getFullYear()+1,0,4),ee=B(new Date(P.getFullYear(),0,4)),ge=B(ge),0>=O(ee,P)?0>=O(ge,P)?P.getFullYear()+1:P.getFullYear():P.getFullYear()-1}s>>>=0,c>>>=0,f>>>=0,y>>>=0;var L=a()[y+40>>>2>>>0];for(var K in y={fc:i()[y>>>2>>>0],ec:i()[y+4>>>2>>>0],Gb:i()[y+8>>>2>>>0],Kb:i()[y+12>>>2>>>0],Hb:i()[y+16>>>2>>>0],Cb:i()[y+20>>>2>>>0],ub:i()[y+24>>>2>>>0],Bb:i()[y+28>>>2>>>0],nc:i()[y+32>>>2>>>0],dc:i()[y+36>>>2>>>0],hc:L?ke(L):""},f=ke(f),L={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"})f=f.replace(new RegExp(K,"g"),L[K]);var pe="Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),fe="January February March April May June July August September October November December".split(" ");for(K in L={"%a":P=>pe[P.ub].substring(0,3),"%A":P=>pe[P.ub],"%b":P=>fe[P.Hb].substring(0,3),"%B":P=>fe[P.Hb],"%C":P=>C((P.Cb+1900)/100|0,2),"%d":P=>C(P.Kb,2),"%e":P=>v(P.Kb,2," "),"%g":P=>N(P).toString().substring(2),"%G":N,"%H":P=>C(P.Gb,2),"%I":P=>((P=P.Gb)==0?P=12:12{for(var ee=0,ge=0;ge<=P.Hb-1;ee+=(Bt(P.Cb+1900)?Pi:Oi)[ge++]);return C(P.Kb+ee,3)},"%m":P=>C(P.Hb+1,2),"%M":P=>C(P.ec,2),"%n":()=>` +`,"%p":P=>0<=P.Gb&&12>P.Gb?"AM":"PM","%S":P=>C(P.fc,2),"%t":()=>" ","%u":P=>P.ub||7,"%U":P=>C(Math.floor((P.Bb+7-P.ub)/7),2),"%V":P=>{var ee=Math.floor((P.Bb+7-(P.ub+6)%7)/7);if(2>=(P.ub+371-P.Bb-2)%7&&ee++,ee)ee==53&&((ge=(P.ub+371-P.Bb)%7)==4||ge==3&&Bt(P.Cb)||(ee=1));else{ee=52;var ge=(P.ub+7-P.Bb-1)%7;(ge==4||ge==5&&Bt(P.Cb%400-1))&&ee++}return C(ee,2)},"%w":P=>P.ub,"%W":P=>C(Math.floor((P.Bb+7-(P.ub+6)%7)/7),2),"%y":P=>(P.Cb+1900).toString().substring(2),"%Y":P=>P.Cb+1900,"%z":P=>{var ee=0<=(P=P.dc);return P=Math.abs(P)/60,(ee?"+":"-")+("0000"+(P/60*100+P%60)).slice(-4)},"%Z":P=>P.hc,"%%":()=>"%"},f=f.replace(/%%/g,"\0\0"),L)f.includes(K)&&(f=f.replace(new RegExp(K,"g"),L[K](y)));return K=function(P){var ee=Array(bn(P)+1);return Ko(P,ee,0,ee.length),ee}(f=f.replace(/\0\0/g,"%")),K.length>c?0:(ep(K,s),K.length-1)}function tp(s,c,f,y){return Di(s>>>0,c>>>0,f>>>0,y>>>0)}b||function(){for(var s=u.numThreads-1;s--;)Wo();Se.unshift(()=>{Ae++,function(c){b?c():Promise.all(ct.map(No)).then(c)}(()=>or())})}();for(var zi=Array(256),pr=0;256>pr;++pr)zi[pr]=String.fromCharCode(pr);ai=zi,pt=u.BindingError=class extends Error{constructor(s){super(s),this.name="BindingError"}},u.InternalError=class extends Error{constructor(s){super(s),this.name="InternalError"}},ut.push(0,1,void 0,1,null,1,!0,1,!1,1),u.count_emval_handles=()=>ut.length/2-5-$n.length;var rp=[gn,Ro,Ho,qo,jo,Yo,Xo,Zo,Qo,Jo,ei,ti,ri,ni,oi,ii,wi,vi,Ii,Ci,Ti,Ai,Ei,ki],j=function(){function s(f,y){return j=f.exports,j=function(){var v=j,C={};for(let[O,B]of Object.entries(v))C[O]=typeof B=="function"?(...N)=>{ur.push(O);try{return B(...N)}finally{Te||(ur.pop(),Je&&ft===1&&ur.length===0&&(ft=0,bt+=1,sr(Gi),typeof Fibers<"u"&&Fibers.oc()))}}:B;return C}(),j=function(){var v=j,C=B=>N=>B(N)>>>0,O=B=>()=>B()>>>0;return(v=Object.assign({},v)).Ca=C(v.Ca),v.fb=O(v.fb),v.gb=C(v.gb),v.emscripten_main_runtime_thread_id=O(v.emscripten_main_runtime_thread_id),v.sb=C(v.sb),v.tb=O(v.tb),v}(),Mo.push(j.ib),Ot.unshift(j.Ba),xe=y,or(),j}var c=zo();if(Ae++,u.instantiateWasm)try{return u.instantiateWasm(c,s)}catch(f){F(`Module.instantiateWasm callback failed with error: ${f}`),m(f)}return Eo||=u.locateFile?ko("ort-wasm-simd-threaded.jsep.wasm")?"ort-wasm-simd-threaded.jsep.wasm":u.locateFile?u.locateFile("ort-wasm-simd-threaded.jsep.wasm",D):D+"ort-wasm-simd-threaded.jsep.wasm":new URL("ort-wasm-simd-threaded.jsep.wasm",import.meta.url).href,function(f,y){var v=Eo;return typeof WebAssembly.instantiateStreaming!="function"||ko(v)||Po(v)||typeof fetch!="function"?Do(v,f,y):fetch(v,{credentials:"same-origin"}).then(C=>WebAssembly.instantiateStreaming(C,f).then(y,function(O){return F(`wasm streaming compile failed: ${O}`),F("falling back to ArrayBuffer instantiation"),Do(v,f,y)}))}(c,function(f){s(f.instance,f.module)}).catch(m),{}}(),Bi=s=>(Bi=j.Ca)(s),Ri=()=>(Ri=j.Da)();u._OrtInit=(s,c)=>(u._OrtInit=j.Ea)(s,c),u._OrtGetLastError=(s,c)=>(u._OrtGetLastError=j.Fa)(s,c),u._OrtCreateSessionOptions=(s,c,f,y,v,C,O,B,N,L)=>(u._OrtCreateSessionOptions=j.Ga)(s,c,f,y,v,C,O,B,N,L),u._OrtAppendExecutionProvider=(s,c)=>(u._OrtAppendExecutionProvider=j.Ha)(s,c),u._OrtAddFreeDimensionOverride=(s,c,f)=>(u._OrtAddFreeDimensionOverride=j.Ia)(s,c,f),u._OrtAddSessionConfigEntry=(s,c,f)=>(u._OrtAddSessionConfigEntry=j.Ja)(s,c,f),u._OrtReleaseSessionOptions=s=>(u._OrtReleaseSessionOptions=j.Ka)(s),u._OrtCreateSession=(s,c,f)=>(u._OrtCreateSession=j.La)(s,c,f),u._OrtReleaseSession=s=>(u._OrtReleaseSession=j.Ma)(s),u._OrtGetInputOutputCount=(s,c,f)=>(u._OrtGetInputOutputCount=j.Na)(s,c,f),u._OrtGetInputName=(s,c)=>(u._OrtGetInputName=j.Oa)(s,c),u._OrtGetOutputName=(s,c)=>(u._OrtGetOutputName=j.Pa)(s,c),u._OrtFree=s=>(u._OrtFree=j.Qa)(s),u._OrtCreateTensor=(s,c,f,y,v,C)=>(u._OrtCreateTensor=j.Ra)(s,c,f,y,v,C),u._OrtGetTensorData=(s,c,f,y,v)=>(u._OrtGetTensorData=j.Sa)(s,c,f,y,v),u._OrtReleaseTensor=s=>(u._OrtReleaseTensor=j.Ta)(s),u._OrtCreateRunOptions=(s,c,f,y)=>(u._OrtCreateRunOptions=j.Ua)(s,c,f,y),u._OrtAddRunConfigEntry=(s,c,f)=>(u._OrtAddRunConfigEntry=j.Va)(s,c,f),u._OrtReleaseRunOptions=s=>(u._OrtReleaseRunOptions=j.Wa)(s),u._OrtCreateBinding=s=>(u._OrtCreateBinding=j.Xa)(s),u._OrtBindInput=(s,c,f)=>(u._OrtBindInput=j.Ya)(s,c,f),u._OrtBindOutput=(s,c,f,y)=>(u._OrtBindOutput=j.Za)(s,c,f,y),u._OrtClearBoundOutputs=s=>(u._OrtClearBoundOutputs=j._a)(s),u._OrtReleaseBinding=s=>(u._OrtReleaseBinding=j.$a)(s),u._OrtRunWithBinding=(s,c,f,y,v)=>(u._OrtRunWithBinding=j.ab)(s,c,f,y,v),u._OrtRun=(s,c,f,y,v,C,O,B)=>(u._OrtRun=j.bb)(s,c,f,y,v,C,O,B),u._OrtEndProfiling=s=>(u._OrtEndProfiling=j.cb)(s),u._JsepOutput=(s,c,f)=>(u._JsepOutput=j.db)(s,c,f),u._JsepGetNodeName=s=>(u._JsepGetNodeName=j.eb)(s);var mr,Mt=()=>(Mt=j.fb)(),fr=u._malloc=s=>(fr=u._malloc=j.gb)(s),et=u._free=s=>(et=u._free=j.hb)(s),Pn=(s,c,f,y,v,C)=>(Pn=j.kb)(s,c,f,y,v,C),Mi=()=>(Mi=j.lb)(),Ui=(s,c,f,y,v)=>(Ui=j.mb)(s,c,f,y,v),On=s=>(On=j.nb)(s),hr=s=>(hr=j.ob)(s),Vi=()=>(Vi=j.pb)(),Ni=(s,c)=>(Ni=j.qb)(s,c),gr=s=>(gr=j.rb)(s),Dn=s=>(Dn=j.sb)(s),zn=()=>(zn=j.tb)(),Wi=u.dynCall_ii=(s,c)=>(Wi=u.dynCall_ii=j.vb)(s,c),Hi=s=>(Hi=j.wb)(s),Gi=()=>(Gi=j.xb)(),Li=s=>(Li=j.yb)(s),Fi=()=>(Fi=j.zb)();function qi(){if(!(0zn(),u.stackRestore=s=>gr(s),u.stackAlloc=s=>Dn(s),u.UTF8ToString=ke,u.stringToUTF8=zt,u.lengthBytesUTF8=bn,lt=function s(){mr||qi(),mr||(lt=s)},qi(),h}),pp=Ta;globalThis.self?.name==="em-pthread"&&Ta()});var Ut,mp,fp,hp,ka,Pa,gp,Oa,qt=U(()=>{"use strict";Cr();Ut=!1?void 0:import.meta.url??(typeof document<"u"?document.currentScript?.src:typeof self<"u"?self.location?.href:void 0),mp=!1||typeof location>"u"?void 0:location.origin,fp=(e,t)=>{try{let r=t??Ut;return(r?new URL(e,r):new URL(e)).origin===mp}catch{return!1}},hp=async e=>{let r=await(await fetch(e,{credentials:"same-origin"})).blob();return URL.createObjectURL(r)},ka=(Ca(),yr(Ia)).default,Pa=async()=>{if(!Ut)throw new Error("Failed to load proxy worker: cannot determine the script source URL.");if(fp(Ut))return[void 0,ka()];let e=await hp(Ut);return[e,ka(e)]},gp=(Ea(),yr(Aa)).default,Oa=async(e,t,r)=>[void 0,gp]});var Gn,Ln,Br,Da,yp,bp,Tr,Ie,St=U(()=>{"use strict";qt();Ln=!1,Br=!1,Da=!1,yp=()=>{if(typeof SharedArrayBuffer>"u")return!1;try{return typeof MessageChannel<"u"&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},bp=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},Tr=async e=>{if(Ln)return Promise.resolve();if(Br)throw new Error("multiple calls to 'initializeWebAssembly()' detected.");if(Da)throw new Error("previous call to 'initializeWebAssembly()' failed.");Br=!0;let t=e.initTimeout,r=e.numThreads;if(!bp())throw new Error("WebAssembly SIMD is not supported in the current environment.");let n=yp();r>1&&!n&&(typeof self<"u"&&!self.crossOriginIsolated&&console.warn("env.wasm.numThreads is set to "+r+", but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info."),console.warn("WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading."),e.numThreads=r=1);let o=e.wasmPaths,i=typeof o=="string"?o:void 0,a=o?.mjs,l=a?.href??a,d=o?.wasm,p=d?.href??d,[m,u]=await Oa(l,i,r>1),h=!1,w=[];if(t>0&&w.push(new Promise(g=>{setTimeout(()=>{h=!0,g()},t)})),w.push(new Promise((g,b)=>{let x={numThreads:r};(p||i)&&(x.locateFile=(_,$)=>p??(i??$)+_),u(x).then(_=>{Br=!1,Ln=!0,Gn=_,g(),m&&URL.revokeObjectURL(m)},_=>{Br=!1,Da=!0,b(_)})})),await Promise.race(w),h)throw new Error(`WebAssembly backend initializing failed due to timeout: ${t}ms`)},Ie=()=>{if(Ln&&Gn)return Gn;throw new Error("WebAssembly is not initialized yet.")}});var Ee,Kt,$e,Rr=U(()=>{"use strict";St();Ee=(e,t)=>{let r=Ie(),n=r.lengthBytesUTF8(e)+1,o=r._malloc(n);return r.stringToUTF8(e,o,n),t.push(o),o},Kt=(e,t,r,n)=>{if(typeof e=="object"&&e!==null){if(r.has(e))throw new Error("Circular reference in options");r.add(e)}Object.entries(e).forEach(([o,i])=>{let a=t?t+o:o;if(typeof i=="object")Kt(i,a+".",r,n);else if(typeof i=="string"||typeof i=="number")n(a,i.toString());else if(typeof i=="boolean")n(a,i?"1":"0");else throw new Error(`Can't handle extra config type: ${typeof i}`)})},$e=e=>{let t=Ie(),r=t.stackSave();try{let n=t.stackAlloc(8);t._OrtGetLastError(n,n+4);let o=t.HEAP32[n/4],i=t.HEAPU32[n/4+1],a=i?t.UTF8ToString(i):"";throw new Error(`${e} ERROR_CODE: ${o}, ERROR_MESSAGE: ${a}`)}finally{t.stackRestore(r)}}});var za,Ba=U(()=>{"use strict";St();Rr();za=e=>{let t=Ie(),r=0,n=[],o=e||{};try{if(e?.logSeverityLevel===void 0)o.logSeverityLevel=2;else if(typeof e.logSeverityLevel!="number"||!Number.isInteger(e.logSeverityLevel)||e.logSeverityLevel<0||e.logSeverityLevel>4)throw new Error(`log serverity level is not valid: ${e.logSeverityLevel}`);if(e?.logVerbosityLevel===void 0)o.logVerbosityLevel=0;else if(typeof e.logVerbosityLevel!="number"||!Number.isInteger(e.logVerbosityLevel))throw new Error(`log verbosity level is not valid: ${e.logVerbosityLevel}`);e?.terminate===void 0&&(o.terminate=!1);let i=0;return e?.tag!==void 0&&(i=Ee(e.tag,n)),r=t._OrtCreateRunOptions(o.logSeverityLevel,o.logVerbosityLevel,!!o.terminate,i),r===0&&$e("Can't create run options."),e?.extra!==void 0&&Kt(e.extra,"",new WeakSet,(a,l)=>{let d=Ee(a,n),p=Ee(l,n);t._OrtAddRunConfigEntry(r,d,p)!==0&&$e(`Can't set a run config entry: ${a} - ${l}.`)}),[r,n]}catch(i){throw r!==0&&t._OrtReleaseRunOptions(r),n.forEach(a=>t._free(a)),i}}});var wp,vp,$p,_p,Ra,Ma=U(()=>{"use strict";St();Rr();wp=e=>{switch(e){case"disabled":return 0;case"basic":return 1;case"extended":return 2;case"all":return 99;default:throw new Error(`unsupported graph optimization level: ${e}`)}},vp=e=>{switch(e){case"sequential":return 0;case"parallel":return 1;default:throw new Error(`unsupported execution mode: ${e}`)}},$p=e=>{e.extra||(e.extra={}),e.extra.session||(e.extra.session={});let t=e.extra.session;t.use_ort_model_bytes_directly||(t.use_ort_model_bytes_directly="1"),e.executionProviders&&e.executionProviders.some(r=>(typeof r=="string"?r:r.name)==="webgpu")&&(e.enableMemPattern=!1)},_p=(e,t,r)=>{for(let n of t){let o=typeof n=="string"?n:n.name;switch(o){case"webnn":if(o="WEBNN",typeof n!="string"){let l=n?.deviceType;if(l){let d=Ee("deviceType",r),p=Ee(l,r);Ie()._OrtAddSessionConfigEntry(e,d,p)!==0&&$e(`Can't set a session config entry: 'deviceType' - ${l}.`)}}break;case"webgpu":if(o="JS",typeof n!="string"){let a=n;if(a?.preferredLayout){if(a.preferredLayout!=="NCHW"&&a.preferredLayout!=="NHWC")throw new Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${a.preferredLayout}`);let l=Ee("preferredLayout",r),d=Ee(a.preferredLayout,r);Ie()._OrtAddSessionConfigEntry(e,l,d)!==0&&$e(`Can't set a session config entry: 'preferredLayout' - ${a.preferredLayout}.`)}}break;case"wasm":case"cpu":continue;default:throw new Error(`not supported execution provider: ${o}`)}let i=Ee(o,r);Ie()._OrtAppendExecutionProvider(e,i)!==0&&$e(`Can't append execution provider: ${o}.`)}},Ra=e=>{let t=Ie(),r=0,n=[],o=e||{};$p(o);try{let i=wp(o.graphOptimizationLevel??"all"),a=vp(o.executionMode??"sequential"),l=typeof o.logId=="string"?Ee(o.logId,n):0,d=o.logSeverityLevel??2;if(!Number.isInteger(d)||d<0||d>4)throw new Error(`log serverity level is not valid: ${d}`);let p=o.logVerbosityLevel??0;if(!Number.isInteger(p)||p<0||p>4)throw new Error(`log verbosity level is not valid: ${p}`);let m=typeof o.optimizedModelFilePath=="string"?Ee(o.optimizedModelFilePath,n):0;if(r=t._OrtCreateSessionOptions(i,!!o.enableCpuMemArena,!!o.enableMemPattern,a,!!o.enableProfiling,0,l,d,p,m),r===0&&$e("Can't create session options."),o.executionProviders&&_p(r,o.executionProviders,n),o.enableGraphCapture!==void 0){if(typeof o.enableGraphCapture!="boolean")throw new Error(`enableGraphCapture must be a boolean value: ${o.enableGraphCapture}`);let u=Ee("enableGraphCapture",n),h=Ee(o.enableGraphCapture.toString(),n);t._OrtAddSessionConfigEntry(r,u,h)!==0&&$e(`Can't set a session config entry: 'enableGraphCapture' - ${o.enableGraphCapture}.`)}if(o.freeDimensionOverrides)for(let[u,h]of Object.entries(o.freeDimensionOverrides)){if(typeof u!="string")throw new Error(`free dimension override name must be a string: ${u}`);if(typeof h!="number"||!Number.isInteger(h)||h<0)throw new Error(`free dimension override value must be a non-negative integer: ${h}`);let w=Ee(u,n);t._OrtAddFreeDimensionOverride(r,w,h)!==0&&$e(`Can't set a free dimension override: ${u} - ${h}.`)}return o.extra!==void 0&&Kt(o.extra,"",new WeakSet,(u,h)=>{let w=Ee(u,n),g=Ee(h,n);t._OrtAddSessionConfigEntry(r,w,g)!==0&&$e(`Can't set a session config entry: ${u} - ${h}.`)}),[r,n]}catch(i){throw r!==0&&t._OrtReleaseSessionOptions(r),n.forEach(a=>t._free(a)),i}}});var Fn,ht,It,Mr,Yt,Ur,qn,Q=U(()=>{"use strict";Fn=e=>{switch(e){case"int8":return 3;case"uint8":return 2;case"bool":return 9;case"int16":return 5;case"uint16":return 4;case"int32":return 6;case"uint32":return 12;case"float16":return 10;case"float32":return 1;case"float64":return 11;case"string":return 8;case"int64":return 7;case"uint64":return 13;default:throw new Error(`unsupported data type: ${e}`)}},ht=e=>{switch(e){case 3:return"int8";case 2:return"uint8";case 9:return"bool";case 5:return"int16";case 4:return"uint16";case 6:return"int32";case 12:return"uint32";case 10:return"float16";case 1:return"float32";case 11:return"float64";case 8:return"string";case 7:return"int64";case 13:return"uint64";default:throw new Error(`unsupported data type: ${e}`)}},It=e=>[void 0,4,1,1,2,2,4,8,void 0,1,2,8,4,8,void 0,void 0,void 0][e],Mr=e=>{switch(e){case"float16":return typeof Float16Array<"u"&&Float16Array.from?Float16Array:Uint16Array;case"float32":return Float32Array;case"uint8":return Uint8Array;case"int8":return Int8Array;case"uint16":return Uint16Array;case"int16":return Int16Array;case"int32":return Int32Array;case"bool":return Uint8Array;case"float64":return Float64Array;case"uint32":return Uint32Array;case"int64":return BigInt64Array;case"uint64":return BigUint64Array;default:throw new Error(`unsupported type: ${e}`)}},Yt=e=>{switch(e){case"verbose":return 0;case"info":return 1;case"warning":return 2;case"error":return 3;case"fatal":return 4;default:throw new Error(`unsupported logging level: ${e}`)}},Ur=e=>e==="float32"||e==="float16"||e==="int32"||e==="int64"||e==="uint32"||e==="uint8"||e==="bool",qn=e=>{switch(e){case"none":return 0;case"cpu":return 1;case"cpu-pinned":return 2;case"texture":return 3;case"gpu-buffer":return 4;default:throw new Error(`unsupported data location: ${e}`)}}});var Xt,jn=U(()=>{"use strict";Cr();Xt=async e=>{if(typeof e=="string")if(!1)try{let{readFile:t}=Rn("node:fs/promises");return new Uint8Array(await t(e))}catch(t){if(t.code==="ERR_FS_FILE_TOO_LARGE"){let{createReadStream:r}=Rn("node:fs"),n=r(e),o=[];for await(let i of n)o.push(i);return new Uint8Array(Buffer.concat(o))}throw t}else{let t=await fetch(e);if(!t.ok)throw new Error(`failed to load external data file: ${e}`);let r=t.headers.get("Content-Length"),n=r?parseInt(r,10):0;if(n<1073741824)return new Uint8Array(await t.arrayBuffer());{if(!t.body)throw new Error(`failed to load external data file: ${e}, no response body.`);let o=t.body.getReader(),i;try{i=new ArrayBuffer(n)}catch(l){if(l instanceof RangeError){let d=Math.ceil(n/65536);i=new WebAssembly.Memory({initial:d,maximum:d}).buffer}else throw l}let a=0;for(;;){let{done:l,value:d}=await o.read();if(l)break;let p=d.byteLength;new Uint8Array(i,a,p).set(d),a+=p}return new Uint8Array(i,0,n)}}else return e instanceof Blob?new Uint8Array(await e.arrayBuffer()):e instanceof Uint8Array?e:new Uint8Array(e)}});var xp,Sp,Ua,Va,Na,Ip,be,dt=U(()=>{"use strict";Q();xp=["V","I","W","E","F"],Sp=(e,t)=>{console.log(`[${xp[e]},${new Date().toISOString()}]${t}`)},Na=(e,t)=>{Ua=e,Va=t},Ip=(e,t)=>{let r=Yt(e),n=Yt(Ua);r>=n&&Sp(r,typeof t=="function"?t():t)},be=(...e)=>{Va&&Ip(...e)}});var Wa,Ha=U(()=>{"use strict";Q();Wa=(e,t)=>new(Mr(t))(e)});var Vr=U(()=>{"use strict"});var Ga,Kn,Yn,Cp,Tp,La,Zn,Xn,qa,ja=U(()=>{"use strict";dt();Vr();Ga=new Map([[64,250],[128,200],[256,200],[512,200],[2048,230],[4096,200],[8192,50],[16384,50],[32768,50],[65536,50],[131072,50],[262144,50],[524288,50],[1048576,50],[2097152,30],[4194304,20],[8388608,10],[12582912,10],[16777216,10],[26214400,15],[33554432,22],[44236800,2],[58982400,6],[67108864,6],[134217728,6],[167772160,6]]),Kn=[],Yn=e=>Math.ceil(e/16)*16,Cp=e=>{for(let t=0;tTp++,Zn=async(e,t,r,n)=>{let o=Yn(r),i=e.device.createBuffer({size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});try{let a=e.getCommandEncoder();e.endComputePass(),a.copyBufferToBuffer(t,0,i,0,o),e.flush(),await i.mapAsync(GPUMapMode.READ);let l=i.getMappedRange();if(n){let d=n();return d.set(new Uint8Array(l,0,r)),d}else return new Uint8Array(l.slice(0,r))}finally{i.destroy()}},Xn=class{constructor(t){this.backend=t;this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.buffersForUploadingPending=[],this.buffersPending=[],this.externalBuffers=new Map,this.capturedPendingBuffers=new Map;for(let[r]of Ga)Kn.push(r),this.freeBuffers.set(r,[]),this.freeUniformBuffers.set(r,[])}upload(t,r){let n=r.buffer,o=r.byteOffset,i=r.byteLength,a=Yn(i),l=this.storageCache.get(t);if(!l)throw new Error("gpu data for uploading does not exist");if(l.originalSize!==i)throw new Error(`inconsistent data size. gpu data size=${l.originalSize}, data size=${i}`);let d=this.backend.device.createBuffer({mappedAtCreation:!0,size:a,usage:GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC}),p=d.getMappedRange();new Uint8Array(p).set(new Uint8Array(n,o,i)),d.unmap();let m=this.backend.getCommandEncoder();this.backend.endComputePass(),m.copyBufferToBuffer(d,0,l.gpuData.buffer,0,a),be("verbose",()=>`[WebGPU] GpuDataManager.upload(id=${t})`),this.buffersForUploadingPending.push(d)}memcpy(t,r){let n=this.storageCache.get(t);if(!n)throw new Error("source gpu data for memcpy does not exist");let o=this.storageCache.get(r);if(!o)throw new Error("destination gpu data for memcpy does not exist");if(n.originalSize!==o.originalSize)throw new Error("inconsistent source and destination gpu data size");let i=Yn(n.originalSize),a=this.backend.getCommandEncoder();this.backend.endComputePass(),a.copyBufferToBuffer(n.gpuData.buffer,0,o.gpuData.buffer,0,i)}registerExternalBuffer(t,r,n){let o;if(n){if(o=this.externalBuffers.get(n),o===void 0)throw new Error("previous buffer is not registered");if(t===n)return be("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${r}) => id=${o}, buffer is the same, skip.`),o;if(this.backend.capturedCommandList.has(this.backend.currentSessionId))throw new Error(`Registering a different external buffer under graph capture mode is not supported yet. + Please use the previous external buffer!`);this.externalBuffers.delete(n)}else o=La();return this.storageCache.set(o,{gpuData:{id:o,type:0,buffer:t},originalSize:r}),this.externalBuffers.set(t,o),be("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${r}) => id=${o}, registered.`),o}unregisterExternalBuffer(t){let r=this.externalBuffers.get(t);r!==void 0&&(this.storageCache.delete(r),this.externalBuffers.delete(t),be("verbose",()=>`[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${r}`))}create(t,r=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST){let n=Cp(t),o,i=(r&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE,a=(r&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM;if(i||a){let p=(i?this.freeBuffers:this.freeUniformBuffers).get(n);p?p.length>0?o=p.pop():o=this.backend.device.createBuffer({size:n,usage:r}):o=this.backend.device.createBuffer({size:n,usage:r})}else o=this.backend.device.createBuffer({size:n,usage:r});let l={id:La(),type:0,buffer:o};return this.storageCache.set(l.id,{gpuData:l,originalSize:t}),be("verbose",()=>`[WebGPU] GpuDataManager.create(size=${t}) => id=${l.id}`),l}get(t){return this.storageCache.get(t)?.gpuData}release(t){let r=this.storageCache.get(t);if(!r)throw new Error("releasing data does not exist");return be("verbose",()=>`[WebGPU] GpuDataManager.release(id=${t}), gpuDataId=${r.gpuData.id}`),this.storageCache.delete(t),this.buffersPending.push(r.gpuData.buffer),r.originalSize}async download(t,r){let n=this.storageCache.get(t);if(!n)throw new Error("data does not exist");await Zn(this.backend,n.gpuData.buffer,n.originalSize,r)}refreshPendingBuffers(){for(let t of this.buffersForUploadingPending)t.destroy();if(this.buffersForUploadingPending=[],this.buffersPending.length!==0)if(this.backend.sessionStatus==="default"){for(let t of this.buffersPending){let r=Ga.get(t.size);if((t.usage&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE){let n=this.freeBuffers.get(t.size)||[];r===void 0||n.length>=r?t.destroy():n.push(t)}else if((t.usage&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM){let n=this.freeUniformBuffers.get(t.size)||[];r===void 0||n.length>=r?t.destroy():n.push(t)}else t.destroy()}this.buffersPending=[]}else{let t=this.capturedPendingBuffers.get(this.backend.currentSessionId);t||(t=[],this.capturedPendingBuffers.set(this.backend.currentSessionId,t));for(let r of this.buffersPending)t.push(r);this.buffersPending=[]}}dispose(){this.freeBuffers.forEach(t=>{t.forEach(r=>{r.destroy()})}),this.freeUniformBuffers.forEach(t=>{t.forEach(r=>{r.destroy()})}),this.storageCache.forEach(t=>{t.gpuData.buffer.destroy()}),this.capturedPendingBuffers.forEach(t=>{t.forEach(r=>{r.destroy()})}),this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.capturedPendingBuffers=new Map}onReleaseSession(t){let r=this.capturedPendingBuffers.get(t);r&&(r.forEach(n=>{n.destroy()}),this.capturedPendingBuffers.delete(t))}},qa=(...e)=>new Xn(...e)});var Qn,te,Ce=U(()=>{"use strict";Qn=class{constructor(t){Object.assign(this,t)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map(t=>`${this[t]}`).join(";")),this.key}},te=e=>new Qn(e)});var Jn,tt,k,Ct,Nr,Wr,Hr,ae=U(()=>{"use strict";Jn=class{static calcMatMulShape(t,r){return t[1]!==r[0]?void 0:[t[0],r[1]]}},tt=class{static calcShape(t,r,n=!1){let o=t.length,i=r.length;if(o===0)return r;if(i===0)return t;let a=Math.max(t.length,r.length),l=new Array(a);if(n){if(o<2||i<2)return;let d=Jn.calcMatMulShape([t[o-2],t[o-1]],[r[i-2],r[i-1]]);if(d===void 0)return;[l[a-2],l[a-1]]=d}for(let d=n?3:1;d<=a;d++){let p=o-d<0?1:t[o-d],m=i-d<0?1:r[i-d];if(p!==m&&p>1&&m>1)return;let u=Math.max(p,m);if(p&&m)l[a-d]=Math.max(p,m);else{if(u>1)return;l[a-d]=0}}return l}static isValidBroadcast(t,r){let n=t.length,o=r.length;if(n>o)return!1;for(let i=1;i<=n;i++)if(t[n-i]!==1&&t[n-i]!==r[o-i])return!1;return!0}},k=class e{static size(t){return e.getSizeFromDimensionRange(t,0,t.length)}static convertShape(t,r=4){let n=t.length;if(n===0)return[];let o=new Array(n),i=n-1;for(;i>=0;){if(t[i]%r===0){o[i]=t[i]/r;break}if(r%t[i]!==0)throw new Error("cannot convert shape");o[i]=1,r/=t[i],i--}for(i--;i>=0;i--)o[i]=t[i];return o}static sizeFromDimension(t,r){if(r<0||r>t.length)throw new Error(`invalid dimension of ${r} for sizeFromDimension as Tensor has ${t.length} dimensions.`);return e.getSizeFromDimensionRange(t,r,t.length)}static sizeToDimension(t,r){if(r<0||r>t.length)throw new Error(`invalid dimension of ${r} for sizeToDimension as Tensor has ${t.length} dimensions.`);return e.getSizeFromDimensionRange(t,0,r)}static getSizeFromDimensionRange(t,r,n){let o=1;for(let i=r;i=0;--o)n[o]=n[o+1]*t[o+1];return n}static normalizeAxis(t,r){if(t<-r&&t>=r)throw new Error("unsupported axis for this operation.");return t<0?t+r:t}static normalizeAxes(t,r){return t.map(n=>this.normalizeAxis(n,r??t.length))}static sortBasedOnPerm(t,r){return r?r.map(n=>t[n]):t.slice().reverse()}static padShape(t,r){let n=t.length;return t.map((o,i)=>o+r[i]+r[i+n])}static areEqual(t,r){return t.length!==r.length?!1:t.every((n,o)=>n===r[o])}},Ct=class e{static adjustPoolAttributes(t,r,n,o,i,a){if(!t&&n.length!==r.length-2)throw new Error("length of specified kernel shapes should be 2 less than length of input dimensions");if(t)for(let l=0;l=n.length?n.push(r[l+2]):n[l]=r[l+2];for(let l=0;l=n[l]||a[l+n.length]>=n[l])throw new Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(t,r,n,o,i,a,l){if(l){if(i.length!==2*(t.length-2))throw new Error("length of pads should be twice the length of data dimensions");if(r.length!==t.length-2)throw new Error("length of strides should be the length of data dimensions");if(o.length!==t.length-2)throw new Error("length of kernel shapes should be the length of data dimensions");for(let d=0;d{"use strict";Q();ae();Tt=64,to=(e,t)=>{if(t===3)throw new Error("vec3 has same alignment as vec4, use vec4 instead");switch(e){case 10:return t>1?`vec${t}`:"f16";case 1:return t>1?`vec${t}`:"f32";case 6:return t>1?`vec${t}`:"i32";case 12:return t>1?`vec${t}`:"u32";case 7:if(t>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","i32"];case 13:if(t>1)throw new Error("currently not supported vecX of uint64 yet");return["vec2","u32"];case 9:if(t!==4)throw new Error("bool must be vec4");return["u32","vec4"];default:throw new Error(`Unknown data type: ${e}`)}},he=(e,t=1)=>{let r=to(e,t);return typeof r=="string"?r:r[0]},Oe=(e,t=1)=>{let r=to(e,t);return typeof r=="string"?r:r[1]},V=(...e)=>{let t=[];return e.forEach(r=>{r.length!==0&&t.push({type:12,data:r},{type:12,data:k.computeStrides(r)})}),t},we=e=>e%4===0?4:e%2===0?2:1,gt=(e="f32",t,r="0")=>!t||t===1?`${e}(${r})`:`vec${t}<${e}>(${r})`,At=(e,t,r)=>e==="f32"?r:t===1?`f32(${r})`:`vec${t}(${r})`,qe=(e,t)=>t===4?`(${e}.x + ${e}.y + ${e}.z + ${e}.w)`:t===2?`(${e}.x + ${e}.y)`:t===3?`(${e}.x + ${e}.y + ${e}.z)`:e,G=(e,t,r,n)=>e.startsWith("uniforms.")&&r>4?typeof t=="string"?n==="f16"?`${e}[(${t}) / 8][(${t}) % 8 / 4][(${t}) % 8 % 4]`:`${e}[(${t}) / 4][(${t}) % 4]`:n==="f16"?`${e}[${Math.floor(t/8)}][${Math.floor(t%8/4)}][${t%8%4}]`:`${e}[${Math.floor(t/4)}][${t%4}]`:r>1?`${e}[${t}]`:e,ro=(e,t,r,n,o)=>{let i=typeof r=="number",a=i?r:r.length,l=[...new Array(a).keys()],d=a<2?"u32":a<=4?`vec${a}`:`array`,p=to(t,o),m=typeof p=="string"?p:p[1],u=typeof p=="string"?p:p[0],h={indices:d,value:m,storage:u,tensor:t},w=R=>typeof R=="string"?R:`${R}u`,g={offsetToIndices:!1,indicesToOffset:!1,broadcastedIndicesToOffset:!1,set:!1,setByIndices:!1,get:!1,getByIndices:!1},b=i?"uniforms.":"",x=`${b}${e}_shape`,_=`${b}${e}_strides`,$="";for(let R=0;R(g.offsetToIndices=!0,a<2?R:`o2i_${e}(${R})`),T=[];if(a>=2)for(let R=a-1;R>=0;R--)T.push(`${G(_,R,a)} * (indices[${R}])`);let A=a<2?"":` fn i2o_${e}(indices: ${h.indices}) -> u32 { return ${T.join("+")}; - }`,z=R=>(g.indicesToOffset=!0,a<2?R:`i2o_${e}(${R})`),D=(...R)=>a===0?"0u":`${h.indices}(${R.map(w).join(",")})`,H=(R,Y)=>a<2?`${R}`:`${G(R,Y,a)}`,W=(R,Y,ue)=>a<2?`${R}=${ue};`:`${G(R,Y,a)}=${ue};`,F={},de=(R,Y)=>{g.broadcastedIndicesToOffset=!0;let ue=`${Y.name}broadcastedIndicesTo${e}Offset`;if(ue in F)return`${ue}(${R})`;let Te=[];for(let ve=a-1;ve>=0;ve--){let Se=Y.indicesGet("outputIndices",ve+Y.rank-a);Te.push(`${H(_,ve)} * (${Se} % ${H(x,ve)})`)}return F[ue]=`fn ${ue}(outputIndices: ${Y.type.indices}) -> u32 { + }`,D=R=>(g.indicesToOffset=!0,a<2?R:`i2o_${e}(${R})`),z=(...R)=>a===0?"0u":`${h.indices}(${R.map(w).join(",")})`,H=(R,Y)=>a<2?`${R}`:`${G(R,Y,a)}`,W=(R,Y,ue)=>a<2?`${R}=${ue};`:`${G(R,Y,a)}=${ue};`,F={},de=(R,Y)=>{g.broadcastedIndicesToOffset=!0;let ue=`${Y.name}broadcastedIndicesTo${e}Offset`;if(ue in F)return`${ue}(${R})`;let Te=[];for(let ve=a-1;ve>=0;ve--){let Se=Y.indicesGet("outputIndices",ve+Y.rank-a);Te.push(`${H(_,ve)} * (${Se} % ${H(x,ve)})`)}return F[ue]=`fn ${ue}(outputIndices: ${Y.type.indices}) -> u32 { return ${Te.length>0?Te.join("+"):"0u"}; }`,`${ue}(${R})`},ce=(R,Y)=>(()=>{if(h.storage===h.value)return`${e}[${R}]=${Y};`;if(h.storage==="vec2"&&h.value==="i32")return`${e}[${R}]=vec2(u32(${Y}), select(0u, 0xFFFFFFFFu, ${Y} < 0));`;if(h.storage==="vec2"&&h.value==="u32")return`${e}[${R}]=vec2(u32(${Y}), 0u);`;if(h.storage==="u32"&&h.value==="vec4")return`${e}[${R}]=dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(${Y}));`;throw new Error(`not supported combination of storage type ${h.storage} and value type ${h.value} yet`)})(),X=R=>(()=>{if(h.storage===h.value)return`${e}[${R}]`;if(h.storage==="vec2"&&h.value==="i32")return`i32(${e}[${R}].x)`;if(h.storage==="vec2"&&h.value==="u32")return`u32(${e}[${R}].x)`;if(h.storage==="u32"&&h.value==="vec4")return`vec4(bool(${e}[${R}] & 0xFFu), bool(${e}[${R}] & 0xFF00u), bool(${e}[${R}] & 0xFF0000u), bool(${e}[${R}] & 0xFF000000u))`;throw new Error(`not supported combination of storage type ${h.storage} and value type ${h.value} yet`)})(),xe=a<2?"":` fn get_${e}ByIndices(indices: ${h.indices}) -> ${m} { return ${X(`i2o_${e}(indices)`)}; }`,q=a<2?"":(()=>{let R=l.map(ue=>`d${ue}: u32`).join(", "),Y=l.map(ue=>`d${ue}`).join(", ");return` fn get_${e}(${R}) -> ${m} { - return get_${e}ByIndices(${D(Y)}); + return get_${e}ByIndices(${z(Y)}); }`})(),ie=(...R)=>{if(R.length!==a)throw new Error(`indices length must be ${a}`);let Y=R.map(w).join(",");return a===0?X("0u"):a===1?X(Y[0]):(g.get=!0,g.getByIndices=!0,g.indicesToOffset=!0,`get_${e}(${Y})`)},le=R=>a<2?X(R):(g.getByIndices=!0,g.indicesToOffset=!0,`get_${e}ByIndices(${R})`),se=a<2?"":` fn set_${e}ByIndices(indices: ${h.indices}, value: ${m}) { ${ce(`i2o_${e}(indices)`,"value")} }`,Z=a<2?"":(()=>{let R=l.map(ue=>`d${ue}: u32`).join(", "),Y=l.map(ue=>`d${ue}`).join(", ");return` fn set_${e}(${R}, value: ${m}) { - set_${e}ByIndices(${D(Y)}, value); + set_${e}ByIndices(${z(Y)}, value); }`})();return{impl:()=>{let R=[],Y=!1;return g.offsetToIndices&&(R.push(S),Y=!0),g.indicesToOffset&&(R.push(A),Y=!0),g.broadcastedIndicesToOffset&&(Object.values(F).forEach(ue=>R.push(ue)),Y=!0),g.set&&(R.push(Z),Y=!0),g.setByIndices&&(R.push(se),Y=!0),g.get&&(R.push(q),Y=!0),g.getByIndices&&(R.push(xe),Y=!0),!i&&Y&&R.unshift(`const ${x} = ${h.indices}(${r.join(",")});`,`const ${_} = ${h.indices}(${k.computeStrides(r).join(",")});`),R.join(` -`)},type:h,offsetToIndices:I,indicesToOffset:z,broadcastedIndicesToOffset:de,indices:D,indicesGet:H,indicesSet:W,set:(...R)=>{if(R.length!==a+1)throw new Error(`indices length must be ${a}`);let Y=R[a];if(typeof Y!="string")throw new Error("value must be string");let ue=R.slice(0,a).map(w).join(",");return a===0?ce("0u",Y):a===1?ce(ue[0],Y):(g.set=!0,g.setByIndices=!0,g.indicesToOffset=!0,`set_${e}(${ue}, ${Y})`)},setByOffset:ce,setByIndices:(R,Y)=>a<2?ce(R,Y):(g.setByIndices=!0,g.indicesToOffset=!0,`set_${e}ByIndices(${R}, ${Y});`),get:ie,getByOffset:X,getByIndices:le,usage:n,name:e,strides:_,shape:x,rank:a}},E=(e,t,r,n=1)=>to(e,t,r,"input",n),M=(e,t,r,n=1)=>to(e,t,r,"output",n),Gr=(e,t,r,n=1)=>to(e,t,r,"internal",n),Jn=class{constructor(t,r){this.normalizedDispatchGroup=t;this.limits=r;this.internalVariables=[];this.variables=[];this.uniforms=[];this.variableIndex=0}guardAgainstOutOfBoundsWorkgroupSizes(t){return`if (global_idx >= ${typeof t=="number"?`${t}u`:t}) { return; }`}mainStart(t=Tt){let r=typeof t=="number"?t:t[0],n=typeof t=="number"?1:t[1],o=typeof t=="number"?1:t[2];if(r>this.limits.maxComputeWorkgroupSizeX||n>this.limits.maxComputeWorkgroupSizeY||o>this.limits.maxComputeWorkgroupSizeZ)throw new Error(`workgroup size [${r}, ${n}, ${o}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);if(r*n*o>this.limits.maxComputeInvocationsPerWorkgroup)throw new Error(`workgroup size [${r}, ${n}, ${o}] exceeds the maximum workgroup invocations ${this.limits.maxComputeInvocationsPerWorkgroup}.`);let i=this.normalizedDispatchGroup[1]===1&&this.normalizedDispatchGroup[2]===1,a=i?`@builtin(global_invocation_id) global_id : vec3, +`)},type:h,offsetToIndices:I,indicesToOffset:D,broadcastedIndicesToOffset:de,indices:z,indicesGet:H,indicesSet:W,set:(...R)=>{if(R.length!==a+1)throw new Error(`indices length must be ${a}`);let Y=R[a];if(typeof Y!="string")throw new Error("value must be string");let ue=R.slice(0,a).map(w).join(",");return a===0?ce("0u",Y):a===1?ce(ue[0],Y):(g.set=!0,g.setByIndices=!0,g.indicesToOffset=!0,`set_${e}(${ue}, ${Y})`)},setByOffset:ce,setByIndices:(R,Y)=>a<2?ce(R,Y):(g.setByIndices=!0,g.indicesToOffset=!0,`set_${e}ByIndices(${R}, ${Y});`),get:ie,getByOffset:X,getByIndices:le,usage:n,name:e,strides:_,shape:x,rank:a}},E=(e,t,r,n=1)=>ro(e,t,r,"input",n),M=(e,t,r,n=1)=>ro(e,t,r,"output",n),Gr=(e,t,r,n=1)=>ro(e,t,r,"internal",n),eo=class{constructor(t,r){this.normalizedDispatchGroup=t;this.limits=r;this.internalVariables=[];this.variables=[];this.uniforms=[];this.variableIndex=0}guardAgainstOutOfBoundsWorkgroupSizes(t){return`if (global_idx >= ${typeof t=="number"?`${t}u`:t}) { return; }`}mainStart(t=Tt){let r=typeof t=="number"?t:t[0],n=typeof t=="number"?1:t[1],o=typeof t=="number"?1:t[2];if(r>this.limits.maxComputeWorkgroupSizeX||n>this.limits.maxComputeWorkgroupSizeY||o>this.limits.maxComputeWorkgroupSizeZ)throw new Error(`workgroup size [${r}, ${n}, ${o}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);if(r*n*o>this.limits.maxComputeInvocationsPerWorkgroup)throw new Error(`workgroup size [${r}, ${n}, ${o}] exceeds the maximum workgroup invocations ${this.limits.maxComputeInvocationsPerWorkgroup}.`);let i=this.normalizedDispatchGroup[1]===1&&this.normalizedDispatchGroup[2]===1,a=i?`@builtin(global_invocation_id) global_id : vec3, @builtin(workgroup_id) workgroup_id : vec3, @builtin(local_invocation_id) local_id : vec3`:`@builtin(global_invocation_id) global_id : vec3, @builtin(local_invocation_id) local_id : vec3, @@ -57,9 +57,9 @@ var Dn=Object.defineProperty;var tp=Object.getOwnPropertyDescriptor;var rp=Objec struct Uniforms { ${t.join(", ")} }; @group(0) @binding(${this.variableIndex}) var uniforms: Uniforms;`}get additionalImplementations(){return this.uniformDeclaration()+this.variables.map(t=>t.impl()).join(` `)+this.internalVariables.map(t=>t.impl()).join(` -`)}get variablesInfo(){if(this.uniforms.length===0)return;let t=r=>[12,10,1,6][["u32","f16","f32","i32"].indexOf(r)];return this.uniforms.map(r=>[t(r.type),r.length??1])}},ja=(e,t)=>new Jn(e,t),Vt=(e,t)=>{let r=e.length,n=[];for(let o=0;o1&&a===1&&n.unshift(i)}return n}});var Cp,Ya,Tp,Ap,Ue,Xa,Za,Et=U(()=>{"use strict";Q();ae();Ce();oe();Cp=e=>{if(!e||e.length!==1)throw new Error("Transpose requires 1 input.")},Ya=(e,t)=>t&&t.length!==e?[...new Array(e).keys()].reverse():t,Tp=(e,t)=>k.sortBasedOnPerm(e,Ya(e.length,t)),Ap=(e,t,r,n)=>{let o=[];o.push(`fn perm(i: ${n.type.indices}) -> ${r.type.indices} { +`)}get variablesInfo(){if(this.uniforms.length===0)return;let t=r=>[12,10,1,6][["u32","f16","f32","i32"].indexOf(r)];return this.uniforms.map(r=>[t(r.type),r.length??1])}},Ka=(e,t)=>new eo(e,t),Nt=(e,t)=>{let r=e.length,n=[];for(let o=0;o1&&a===1&&n.unshift(i)}return n}});var Ap,Ya,Ep,kp,Ue,Xa,Za,Et=U(()=>{"use strict";Q();ae();Ce();oe();Ap=e=>{if(!e||e.length!==1)throw new Error("Transpose requires 1 input.")},Ya=(e,t)=>t&&t.length!==e?[...new Array(e).keys()].reverse():t,Ep=(e,t)=>k.sortBasedOnPerm(e,Ya(e.length,t)),kp=(e,t,r,n)=>{let o=[];o.push(`fn perm(i: ${n.type.indices}) -> ${r.type.indices} { var a: ${r.type.indices};`);for(let i=0;i{let r=e.dataType,n=e.dims.length,o=Ya(n,t),i=Tp(e.dims,o),a=M("output",r,i.length),l=E("a",r,n),d;if(o.length===2&&o[0]===1&&o[1]===0){let p=a.type.value,m=[16,16,1];d=u=>` +`)},Ue=(e,t)=>{let r=e.dataType,n=e.dims.length,o=Ya(n,t),i=Ep(e.dims,o),a=M("output",r,i.length),l=E("a",r,n),d;if(o.length===2&&o[0]===1&&o[1]===0){let p=a.type.value,m=[16,16,1];d=u=>` ${u.registerUniform("output_size","u32").declareVariables(l,a)} var tile : array, ${m[0]}>; ${u.mainStart(m)} @@ -79,7 +79,7 @@ var Dn=Object.defineProperty;var tp=Object.getOwnPropertyDescriptor;var rp=Objec }`}else d=p=>` ${p.registerUniform("output_size","u32").declareVariables(l,a)} - ${Ap(o,n,l,a)} + ${kp(o,n,l,a)} ${p.mainStart()} ${p.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} @@ -88,7 +88,7 @@ var Dn=Object.defineProperty;var tp=Object.getOwnPropertyDescriptor;var rp=Objec let aIndices = perm(indices); ${a.setByOffset("global_idx",l.getByIndices("aIndices"))} - }`;return{name:"Transpose",shaderCache:{hint:`${t}`,inputDependencies:["rank"]},getRunData:p=>{let m=k.size(i);return{outputs:[{dims:i,dataType:p[0].dataType}],dispatchGroup:{x:Math.ceil(m/64)},programUniforms:[{type:12,data:m},...V(p[0].dims,i)]}},getShaderSource:d}},Xa=(e,t)=>{Cp(e.inputs),e.compute(Ue(e.inputs[0],t.perm))},Za=e=>te({perm:e.perm})});var Ep,kp,Pp,Op,zp,Dp,Bp,Rp,Mp,Up,rt,Qa,Ja,es,ts,rs,ns,os,is,as,ss,us=U(()=>{"use strict";Q();ae();oe();Lr();Et();Ep={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate * candidate",logSumExp:"bestValue + exp(candidate)",l1:"bestValue + abs(candidate)",l2:"bestValue + candidate * candidate",logSum:"bestValue + candidate"},kp={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate",logSumExp:"bestValue + candidate",l1:"bestValue + candidate",l2:"bestValue + candidate",logSum:"bestValue + candidate"},Pp={max:"_A[offset]",min:"_A[offset]",mean:"0",sum:"0",prod:"1",sumSquare:"0",logSumExp:"0",l1:"0",l2:"0",logSum:"0"},Op={max:"bestValue",min:"bestValue",sum:"bestValue",prod:"bestValue",sumSquare:"bestValue",logSumExp:"log(bestValue)",l1:"bestValue",l2:"sqrt(bestValue)",logSum:"log(bestValue)"},zp=(e,t)=>{let r=[];for(let n=t-e;n{let r=[],n=e.length;for(let i=0;ie[i]);return[r,o]},Bp=(e,t)=>{let r=e.length+t.length,n=[],o=0;for(let i=0;i{for(let r=0;r{let r=[];if(!Rp(e,t)){for(let n=0;nr.push(n))}return r},Up=(e,t,r,n,o,i,a)=>{let l=r[0].dims,d=k.size(i),p=k.size(a),m=E("_A",r[0].dataType,l),u=M("output",o,i),h=32,w=` + }`;return{name:"Transpose",shaderCache:{hint:`${t}`,inputDependencies:["rank"]},getRunData:p=>{let m=k.size(i);return{outputs:[{dims:i,dataType:p[0].dataType}],dispatchGroup:{x:Math.ceil(m/64)},programUniforms:[{type:12,data:m},...V(p[0].dims,i)]}},getShaderSource:d}},Xa=(e,t)=>{Ap(e.inputs),e.compute(Ue(e.inputs[0],t.perm))},Za=e=>te({perm:e.perm})});var Pp,Op,Dp,zp,Bp,Rp,Mp,Up,Vp,Np,rt,Qa,Ja,es,ts,rs,ns,os,is,as,ss,us=U(()=>{"use strict";Q();ae();oe();Lr();Et();Pp={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate * candidate",logSumExp:"bestValue + exp(candidate)",l1:"bestValue + abs(candidate)",l2:"bestValue + candidate * candidate",logSum:"bestValue + candidate"},Op={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate",logSumExp:"bestValue + candidate",l1:"bestValue + candidate",l2:"bestValue + candidate",logSum:"bestValue + candidate"},Dp={max:"_A[offset]",min:"_A[offset]",mean:"0",sum:"0",prod:"1",sumSquare:"0",logSumExp:"0",l1:"0",l2:"0",logSum:"0"},zp={max:"bestValue",min:"bestValue",sum:"bestValue",prod:"bestValue",sumSquare:"bestValue",logSumExp:"log(bestValue)",l1:"bestValue",l2:"sqrt(bestValue)",logSum:"log(bestValue)"},Bp=(e,t)=>{let r=[];for(let n=t-e;n{let r=[],n=e.length;for(let i=0;ie[i]);return[r,o]},Mp=(e,t)=>{let r=e.length+t.length,n=[],o=0;for(let i=0;i{for(let r=0;r{let r=[];if(!Up(e,t)){for(let n=0;nr.push(n))}return r},Np=(e,t,r,n,o,i,a)=>{let l=r[0].dims,d=k.size(i),p=k.size(a),m=E("_A",r[0].dataType,l),u=M("output",o,i),h=32,w=` var aBestValues : array; `;return{name:e,shaderCache:t,getShaderSource:b=>` ${b.registerUniform("reduceSize","u32").declareVariables(m,u)} @@ -101,11 +101,11 @@ var Dn=Object.defineProperty;var tp=Object.getOwnPropertyDescriptor;var rp=Objec let outputIndex = global_idx / ${h}; let offset = outputIndex * uniforms.reduceSize; - var bestValue = f32(${Pp[n]}); + var bestValue = f32(${Dp[n]}); let Length = uniforms.reduceSize; for (var k = local_idx; k < Length; k = k + ${h}) { let candidate = f32(${m.getByOffset("offset + k")}); - bestValue = ${Ep[n]}; + bestValue = ${Pp[n]}; } aBestValues[local_idx] = bestValue; workgroupBarrier(); @@ -116,7 +116,7 @@ var Dn=Object.defineProperty;var tp=Object.getOwnPropertyDescriptor;var rp=Objec let interval = DIV_CEIL(reduceSize, 2u); if (local_idx < currentSize) { let candidate = aBestValues[local_idx + interval]; - bestValue = ${kp[n]}; + bestValue = ${Op[n]}; aBestValues[local_idx] = bestValue; } reduceSize = interval; @@ -124,13 +124,13 @@ var Dn=Object.defineProperty;var tp=Object.getOwnPropertyDescriptor;var rp=Objec } if (local_idx == 0u) { - ${u.setByOffset("outputIndex",`${n==="mean"?`${u.type.storage}(bestValue / f32(uniforms.reduceSize))`:`${u.type.storage}(${Op[n]})`}`)}; + ${u.setByOffset("outputIndex",`${n==="mean"?`${u.type.storage}(bestValue / f32(uniforms.reduceSize))`:`${u.type.storage}(${zp[n]})`}`)}; } - }`,getRunData:()=>({outputs:[{dims:i,dataType:o}],dispatchGroup:{x:d},programUniforms:[{type:12,data:p}]})}},rt=(e,t,r,n)=>{let o=e.inputs.length===1?r:ro(e.inputs,r),i=o.axes;i.length===0&&!o.noopWithEmptyAxes&&(i=e.inputs[0].dims.map((w,g)=>g));let a=k.normalizeAxes(i,e.inputs[0].dims.length),l=a,d=e.inputs[0],p=Mp(l,e.inputs[0].dims.length);p.length>0&&(d=e.compute(Ue(e.inputs[0],p),{inputs:[0],outputs:[-1]})[0],l=zp(l.length,d.dims.length));let[m,u]=Dp(d.dims,l),h=m;o.keepDims&&(h=Bp(m,a)),e.compute(Up(t,{hint:o.cacheKey,inputDependencies:["type"]},[d],n,e.inputs[0].dataType,h,u),{inputs:[d]})},Qa=(e,t)=>{rt(e,"ReduceMeanShared",t,"mean")},Ja=(e,t)=>{rt(e,"ReduceL1Shared",t,"l1")},es=(e,t)=>{rt(e,"ReduceL2Shared",t,"l2")},ts=(e,t)=>{rt(e,"ReduceLogSumExpShared",t,"logSumExp")},rs=(e,t)=>{rt(e,"ReduceMaxShared",t,"max")},ns=(e,t)=>{rt(e,"ReduceMinShared",t,"min")},os=(e,t)=>{rt(e,"ReduceProdShared",t,"prod")},is=(e,t)=>{rt(e,"ReduceSumShared",t,"sum")},as=(e,t)=>{rt(e,"ReduceSumSquareShared",t,"sumSquare")},ss=(e,t)=>{rt(e,"ReduceLogSumShared",t,"logSum")}});var nt,Vp,Fr,ro,ot,Np,Wp,Hp,Gp,Lp,Fp,qp,Kp,jp,Yp,it,ds,ls,cs,ps,ms,fs,hs,gs,ys,bs,Lr=U(()=>{"use strict";Q();ae();Ce();oe();us();nt=e=>{if(!e||e.length===0||e.length>2)throw new Error("Reduce op requires 1 or 2 inputs.");if(e.length===2&&e[1].dims.length!==1)throw new Error("Invalid axes input dims.")},Vp=e=>["","",`var value = ${e.getByIndices("input_indices")};`,""],Fr=(e,t,r,n,o,i,a=!1,l=!1)=>{let d=[],p=r[0].dims,m=p.length,u=k.normalizeAxes(o,m),h=!l&&u.length===0;p.forEach((x,_)=>{h||u.indexOf(_)>=0?a&&d.push(1):d.push(x)});let w=d.length,g=k.size(d);return{name:e,shaderCache:t,getShaderSource:x=>{let _=[],$=E("_A",r[0].dataType,m),S=M("output",i,w),I=n($,S,u),T=I[2];for(let A=0,z=0;A=0?(a&&z++,T=`for(var j${A}: u32 = 0; j${A} < ${p[A]}; j${A}++) { + }`,getRunData:()=>({outputs:[{dims:i,dataType:o}],dispatchGroup:{x:d},programUniforms:[{type:12,data:p}]})}},rt=(e,t,r,n)=>{let o=e.inputs.length===1?r:no(e.inputs,r),i=o.axes;i.length===0&&!o.noopWithEmptyAxes&&(i=e.inputs[0].dims.map((w,g)=>g));let a=k.normalizeAxes(i,e.inputs[0].dims.length),l=a,d=e.inputs[0],p=Vp(l,e.inputs[0].dims.length);p.length>0&&(d=e.compute(Ue(e.inputs[0],p),{inputs:[0],outputs:[-1]})[0],l=Bp(l.length,d.dims.length));let[m,u]=Rp(d.dims,l),h=m;o.keepDims&&(h=Mp(m,a)),e.compute(Np(t,{hint:o.cacheKey,inputDependencies:["type"]},[d],n,e.inputs[0].dataType,h,u),{inputs:[d]})},Qa=(e,t)=>{rt(e,"ReduceMeanShared",t,"mean")},Ja=(e,t)=>{rt(e,"ReduceL1Shared",t,"l1")},es=(e,t)=>{rt(e,"ReduceL2Shared",t,"l2")},ts=(e,t)=>{rt(e,"ReduceLogSumExpShared",t,"logSumExp")},rs=(e,t)=>{rt(e,"ReduceMaxShared",t,"max")},ns=(e,t)=>{rt(e,"ReduceMinShared",t,"min")},os=(e,t)=>{rt(e,"ReduceProdShared",t,"prod")},is=(e,t)=>{rt(e,"ReduceSumShared",t,"sum")},as=(e,t)=>{rt(e,"ReduceSumSquareShared",t,"sumSquare")},ss=(e,t)=>{rt(e,"ReduceLogSumShared",t,"logSum")}});var nt,Wp,Fr,no,ot,Hp,Gp,Lp,Fp,qp,jp,Kp,Yp,Xp,Zp,it,ds,ls,cs,ps,ms,fs,hs,gs,ys,bs,Lr=U(()=>{"use strict";Q();ae();Ce();oe();us();nt=e=>{if(!e||e.length===0||e.length>2)throw new Error("Reduce op requires 1 or 2 inputs.");if(e.length===2&&e[1].dims.length!==1)throw new Error("Invalid axes input dims.")},Wp=e=>["","",`var value = ${e.getByIndices("input_indices")};`,""],Fr=(e,t,r,n,o,i,a=!1,l=!1)=>{let d=[],p=r[0].dims,m=p.length,u=k.normalizeAxes(o,m),h=!l&&u.length===0;p.forEach((x,_)=>{h||u.indexOf(_)>=0?a&&d.push(1):d.push(x)});let w=d.length,g=k.size(d);return{name:e,shaderCache:t,getShaderSource:x=>{let _=[],$=E("_A",r[0].dataType,m),S=M("output",i,w),I=n($,S,u),T=I[2];for(let A=0,D=0;A=0?(a&&D++,T=`for(var j${A}: u32 = 0; j${A} < ${p[A]}; j${A}++) { ${I[2].includes("last_index")?`let last_index = j${A};`:""} ${$.indicesSet("input_indices",A,`j${A}`)} ${T} - }`):(_.push(`${$.indicesSet("input_indices",A,S.indicesGet("output_indices",z))};`),z++);return` + }`):(_.push(`${$.indicesSet("input_indices",A,S.indicesGet("output_indices",D))};`),D++);return` ${x.registerUniform("output_size","u32").declareVariables($,S)} @@ -147,9 +147,9 @@ var Dn=Object.defineProperty;var tp=Object.getOwnPropertyDescriptor;var rp=Objec ${I[3]} ${I.length===4?S.setByOffset("global_idx","value"):I.slice(4).join(` `)} - }`},getRunData:()=>({outputs:[{dims:d,dataType:i}],dispatchGroup:{x:Math.ceil(g/64)},programUniforms:[{type:12,data:g},...V(p,d)]})}},ro=(e,t)=>{let r=[];return e[1].dims[0]>0&&e[1].getBigInt64Array().forEach(n=>r.push(Number(n))),te({axes:r,keepDims:t.keepDims,noopWithEmptyAxes:t.noopWithEmptyAxes})},ot=(e,t,r,n)=>{let o=e.inputs,i=o.length===1?r:ro(o,r);e.compute(Fr(t,{hint:i.cacheKey,inputDependencies:["rank"]},[o[0]],i.noopWithEmptyAxes&&i.axes.length===0?Vp:n,i.axes,o[0].dataType,i.keepDims,i.noopWithEmptyAxes),{inputs:[0]})},Np=(e,t)=>{nt(e.inputs),ot(e,"ReduceLogSum",t,(n,o)=>[`var value = ${o.type.storage}(0);`,"",`value += ${n.getByIndices("input_indices")};`,"value = log(value);"])},Wp=(e,t)=>{nt(e.inputs),ot(e,"ReduceL1",t,(n,o)=>[`var value = ${o.type.storage}(0);`,"",`value += abs(${n.getByIndices("input_indices")});`,""])},Hp=(e,t)=>{nt(e.inputs),ot(e,"ReduceL2",t,(n,o)=>[`var t = ${o.type.value}(0); var value = ${o.type.value}(0);`,"",`t = ${n.getByIndices("input_indices")}; value += (t * t);`,"value = sqrt(value);"])},Gp=(e,t)=>{nt(e.inputs),ot(e,"ReduceLogSumExp",t,(n,o)=>[`var value = ${o.type.storage}(0);`,"",`value += exp(${n.getByIndices("input_indices")});`,"value = log(value);"])},Lp=(e,t)=>{nt(e.inputs),ot(e,"ReduceMax",t,(n,o,i)=>{let a=[];for(let l=0;l=0||i.length===0)&&a.push(n.indicesSet("input_indices",l,0));return[`${a.join(` -`)}`,`var value = ${n.getByIndices("input_indices")};`,`value = max(value, ${n.getByIndices("input_indices")});`,""]})},Fp=(e,t)=>{nt(e.inputs),ot(e,"ReduceMean",t,(n,o,i)=>{let a=1;for(let l=0;l=0||i.length===0)&&(a*=e.inputs[0].dims[l]);return["var sum = f32(0);","",`sum += f32(${n.getByIndices("input_indices")});`,`let value = ${o.type.value}(sum / ${a});`]})},qp=(e,t)=>{nt(e.inputs),ot(e,"ReduceMin",t,(n,o,i)=>{let a=[];for(let l=0;l=0||i.length===0)&&a.push(`input_indices[${l}] = 0;`);return[`${a.join(` -`)}`,`var value = ${n.getByIndices("input_indices")};`,`value = min(value, ${n.getByIndices("input_indices")});`,""]})},Kp=(e,t)=>{nt(e.inputs),ot(e,"ReduceProd",t,(n,o)=>[`var value = ${o.type.storage}(1);`,"",`value *= ${n.getByIndices("input_indices")};`,""])},jp=(e,t)=>{nt(e.inputs),ot(e,"ReduceSum",t,(n,o)=>[`var value = ${o.type.storage}(0);`,"",`value += ${n.getByIndices("input_indices")};`,""])},Yp=(e,t)=>{nt(e.inputs),ot(e,"ReduceSumSquare",t,(n,o)=>[`var t = ${o.type.value}(0); var value = ${o.type.value}(0);`,"",`t = ${n.getByIndices("input_indices")}; value += t * t;`,""])},it=(e,t,r)=>{if(t.length===0)return r;let n=1,o=1;for(let i=0;i1024},ds=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Fp(e,t):Qa(e,t)},ls=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Wp(e,t):Ja(e,t)},cs=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Hp(e,t):es(e,t)},ps=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Gp(e,t):ts(e,t)},ms=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Lp(e,t):rs(e,t)},fs=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?qp(e,t):ns(e,t)},hs=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Kp(e,t):os(e,t)},gs=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?jp(e,t):is(e,t)},ys=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Yp(e,t):as(e,t)},bs=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Np(e,t):ss(e,t)}});var ws,vs,$s,no,_s=U(()=>{"use strict";Q();Ce();Lr();ws=e=>{if(!e||e.length===0||e.length>2)throw new Error("ArgMinMaxOp op requires 1 or 2 inputs.");if(e[0].dataType!==1)throw new Error("Invalid input type.")},vs=(e,t)=>{ws(e.inputs);let r=(n,o,i)=>{let a=[];for(let l=0;l=0||i.length===0)&&a.push(`input_indices[${l}] = 0;`);return[`${a.join(` + }`},getRunData:()=>({outputs:[{dims:d,dataType:i}],dispatchGroup:{x:Math.ceil(g/64)},programUniforms:[{type:12,data:g},...V(p,d)]})}},no=(e,t)=>{let r=[];return e[1].dims[0]>0&&e[1].getBigInt64Array().forEach(n=>r.push(Number(n))),te({axes:r,keepDims:t.keepDims,noopWithEmptyAxes:t.noopWithEmptyAxes})},ot=(e,t,r,n)=>{let o=e.inputs,i=o.length===1?r:no(o,r);e.compute(Fr(t,{hint:i.cacheKey,inputDependencies:["rank"]},[o[0]],i.noopWithEmptyAxes&&i.axes.length===0?Wp:n,i.axes,o[0].dataType,i.keepDims,i.noopWithEmptyAxes),{inputs:[0]})},Hp=(e,t)=>{nt(e.inputs),ot(e,"ReduceLogSum",t,(n,o)=>[`var value = ${o.type.storage}(0);`,"",`value += ${n.getByIndices("input_indices")};`,"value = log(value);"])},Gp=(e,t)=>{nt(e.inputs),ot(e,"ReduceL1",t,(n,o)=>[`var value = ${o.type.storage}(0);`,"",`value += abs(${n.getByIndices("input_indices")});`,""])},Lp=(e,t)=>{nt(e.inputs),ot(e,"ReduceL2",t,(n,o)=>[`var t = ${o.type.value}(0); var value = ${o.type.value}(0);`,"",`t = ${n.getByIndices("input_indices")}; value += (t * t);`,"value = sqrt(value);"])},Fp=(e,t)=>{nt(e.inputs),ot(e,"ReduceLogSumExp",t,(n,o)=>[`var value = ${o.type.storage}(0);`,"",`value += exp(${n.getByIndices("input_indices")});`,"value = log(value);"])},qp=(e,t)=>{nt(e.inputs),ot(e,"ReduceMax",t,(n,o,i)=>{let a=[];for(let l=0;l=0||i.length===0)&&a.push(n.indicesSet("input_indices",l,0));return[`${a.join(` +`)}`,`var value = ${n.getByIndices("input_indices")};`,`value = max(value, ${n.getByIndices("input_indices")});`,""]})},jp=(e,t)=>{nt(e.inputs),ot(e,"ReduceMean",t,(n,o,i)=>{let a=1;for(let l=0;l=0||i.length===0)&&(a*=e.inputs[0].dims[l]);return["var sum = f32(0);","",`sum += f32(${n.getByIndices("input_indices")});`,`let value = ${o.type.value}(sum / ${a});`]})},Kp=(e,t)=>{nt(e.inputs),ot(e,"ReduceMin",t,(n,o,i)=>{let a=[];for(let l=0;l=0||i.length===0)&&a.push(`input_indices[${l}] = 0;`);return[`${a.join(` +`)}`,`var value = ${n.getByIndices("input_indices")};`,`value = min(value, ${n.getByIndices("input_indices")});`,""]})},Yp=(e,t)=>{nt(e.inputs),ot(e,"ReduceProd",t,(n,o)=>[`var value = ${o.type.storage}(1);`,"",`value *= ${n.getByIndices("input_indices")};`,""])},Xp=(e,t)=>{nt(e.inputs),ot(e,"ReduceSum",t,(n,o)=>[`var value = ${o.type.storage}(0);`,"",`value += ${n.getByIndices("input_indices")};`,""])},Zp=(e,t)=>{nt(e.inputs),ot(e,"ReduceSumSquare",t,(n,o)=>[`var t = ${o.type.value}(0); var value = ${o.type.value}(0);`,"",`t = ${n.getByIndices("input_indices")}; value += t * t;`,""])},it=(e,t,r)=>{if(t.length===0)return r;let n=1,o=1;for(let i=0;i1024},ds=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?jp(e,t):Qa(e,t)},ls=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Gp(e,t):Ja(e,t)},cs=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Lp(e,t):es(e,t)},ps=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Fp(e,t):ts(e,t)},ms=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?qp(e,t):rs(e,t)},fs=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Kp(e,t):ns(e,t)},hs=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Yp(e,t):os(e,t)},gs=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Xp(e,t):is(e,t)},ys=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Zp(e,t):as(e,t)},bs=(e,t)=>{it(e.inputs[0].dims,t.axes,t.noopWithEmptyAxes)?Hp(e,t):ss(e,t)}});var ws,vs,$s,oo,_s=U(()=>{"use strict";Q();Ce();Lr();ws=e=>{if(!e||e.length===0||e.length>2)throw new Error("ArgMinMaxOp op requires 1 or 2 inputs.");if(e[0].dataType!==1)throw new Error("Invalid input type.")},vs=(e,t)=>{ws(e.inputs);let r=(n,o,i)=>{let a=[];for(let l=0;l=0||i.length===0)&&a.push(`input_indices[${l}] = 0;`);return[`${a.join(` `)}`,`var value = ${n.getByIndices("input_indices")}; var best_index : i32 = 0;`,`if (${n.getByIndices("input_indices")} ${t.selectLastIndex>0?"<=":"<"} value) { value = ${n.getByIndices("input_indices")}; @@ -159,7 +159,7 @@ var best_index : i32 = 0;`,`if (${n.getByIndices("input_indices")} ${t.selectLas var best_index : i32 = 0;`,`if (${n.getByIndices("input_indices")} ${t.selectLastIndex>0?">=":">"} value) { value = ${n.getByIndices("input_indices")}; best_index = i32(last_index); - }`,"",o.setByOffset("global_idx","best_index")]};e.compute(Fr("argMax",{hint:t.cacheKey,inputDependencies:["rank"]},[e.inputs[0]],r,[t.axis],7,t.keepDims),{inputs:[0]})},no=e=>te(e)});var Xp,Zp,Qp,Jp,Nt,em,xs,qr=U(()=>{"use strict";Q();Vr();oe();Xp=(e,t)=>{let r=e[0],n=e[1],o=e[2],i=e[3],a=e[4],l=e[5];if(a&&l)throw new Error("Attention cannot have both past and relative_position_bias");if(r.dims.length!==3)throw new Error('Input "input" must have 3 dimensions');let d=r.dims[0],p=r.dims[1],m=r.dims[2];if(o.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimensions');if(n.dims.length!==2)throw new Error('Input "weights" is expected to have 2 dimensions');if(n.dims[0]!==m)throw new Error("Input 1 dimension 0 should have same length as dimension 2 of input 0");if(o.dims[0]!==n.dims[1])throw new Error('Input "bias" dimension 0 should have same length as dimension 1 of input "weights"');let u=o.dims[0]/3,h=u,w=h;if(t.qkvHiddenSizes.length>0){if(t.qkvHiddenSizes.length!==3)throw new Error("qkv_hidden_sizes attribute should have 3 elements");for(let S of t.qkvHiddenSizes)if(S%t.numHeads!==0)throw new Error("qkv_hidden_sizes should be divisible by num_heads");u=t.qkvHiddenSizes[0],h=t.qkvHiddenSizes[1],w=t.qkvHiddenSizes[2]}let g=p;if(u!==h)throw new Error("qkv_hidden_sizes first element should be same as the second");if(o.dims[0]!==u+h+w)throw new Error('Input "bias" dimension 0 should have same length as sum of Q/K/V hidden sizes');let b=0;if(a){if(h!==w)throw new Error('Input "past" expect k_hidden_size == v_hidden_size');if(a.dims.length!==5)throw new Error('Input "past" must have 5 dimensions');if(a.dims[0]!==2)throw new Error('Input "past" first dimension must be 2');if(a.dims[1]!==d)throw new Error('Input "past" second dimension must be batch_size');if(a.dims[2]!==t.numHeads)throw new Error('Input "past" third dimension must be num_heads');if(a.dims[4]!==h/t.numHeads)throw new Error('Input "past" fifth dimension must be k_hidden_size / num_heads');t.pastPresentShareBuffer||(b=a.dims[3])}let x=g+b,_=-1,$=0;if(i)throw new Error("Mask not supported");if(a)throw new Error("past is not supported");return{batchSize:d,sequenceLength:p,pastSequenceLength:b,kvSequenceLength:g,totalSequenceLength:x,maxSequenceLength:_,inputHiddenSize:m,hiddenSize:u,vHiddenSize:w,headSize:Math.floor(u/t.numHeads),vHeadSize:Math.floor(w/t.numHeads),numHeads:t.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:t.maskFilterValue,maskType:$,scale:t.scale,broadcastResPosBias:!1,passPastInKv:!1,qkvFormat:1}},Zp=(e,t,r,n)=>{let o=we(n),i=64,a=n/o;a{let w=M("x",t.dataType,t.dims,o),b=[{name:"d_inv",type:Oe(t.dataType)},{name:"d_comp",type:"u32"},{name:"elements_per_thread",type:"u32"}];return` + }`,"",o.setByOffset("global_idx","best_index")]};e.compute(Fr("argMax",{hint:t.cacheKey,inputDependencies:["rank"]},[e.inputs[0]],r,[t.axis],7,t.keepDims),{inputs:[0]})},oo=e=>te(e)});var Qp,Jp,em,tm,Wt,rm,xs,qr=U(()=>{"use strict";Q();Vr();oe();Qp=(e,t)=>{let r=e[0],n=e[1],o=e[2],i=e[3],a=e[4],l=e[5];if(a&&l)throw new Error("Attention cannot have both past and relative_position_bias");if(r.dims.length!==3)throw new Error('Input "input" must have 3 dimensions');let d=r.dims[0],p=r.dims[1],m=r.dims[2];if(o.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimensions');if(n.dims.length!==2)throw new Error('Input "weights" is expected to have 2 dimensions');if(n.dims[0]!==m)throw new Error("Input 1 dimension 0 should have same length as dimension 2 of input 0");if(o.dims[0]!==n.dims[1])throw new Error('Input "bias" dimension 0 should have same length as dimension 1 of input "weights"');let u=o.dims[0]/3,h=u,w=h;if(t.qkvHiddenSizes.length>0){if(t.qkvHiddenSizes.length!==3)throw new Error("qkv_hidden_sizes attribute should have 3 elements");for(let S of t.qkvHiddenSizes)if(S%t.numHeads!==0)throw new Error("qkv_hidden_sizes should be divisible by num_heads");u=t.qkvHiddenSizes[0],h=t.qkvHiddenSizes[1],w=t.qkvHiddenSizes[2]}let g=p;if(u!==h)throw new Error("qkv_hidden_sizes first element should be same as the second");if(o.dims[0]!==u+h+w)throw new Error('Input "bias" dimension 0 should have same length as sum of Q/K/V hidden sizes');let b=0;if(a){if(h!==w)throw new Error('Input "past" expect k_hidden_size == v_hidden_size');if(a.dims.length!==5)throw new Error('Input "past" must have 5 dimensions');if(a.dims[0]!==2)throw new Error('Input "past" first dimension must be 2');if(a.dims[1]!==d)throw new Error('Input "past" second dimension must be batch_size');if(a.dims[2]!==t.numHeads)throw new Error('Input "past" third dimension must be num_heads');if(a.dims[4]!==h/t.numHeads)throw new Error('Input "past" fifth dimension must be k_hidden_size / num_heads');t.pastPresentShareBuffer||(b=a.dims[3])}let x=g+b,_=-1,$=0;if(i)throw new Error("Mask not supported");if(a)throw new Error("past is not supported");return{batchSize:d,sequenceLength:p,pastSequenceLength:b,kvSequenceLength:g,totalSequenceLength:x,maxSequenceLength:_,inputHiddenSize:m,hiddenSize:u,vHiddenSize:w,headSize:Math.floor(u/t.numHeads),vHeadSize:Math.floor(w/t.numHeads),numHeads:t.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:t.maskFilterValue,maskType:$,scale:t.scale,broadcastResPosBias:!1,passPastInKv:!1,qkvFormat:1}},Jp=(e,t,r,n)=>{let o=we(n),i=64,a=n/o;a{let w=M("x",t.dataType,t.dims,o),b=[{name:"d_inv",type:Oe(t.dataType)},{name:"d_comp",type:"u32"},{name:"elements_per_thread",type:"u32"}];return` var thread_max: array; var thread_sum: array; ${h.registerUniforms(b).declareVariables(w)} @@ -201,12 +201,12 @@ var best_index : i32 = 0;`,`if (${n.getByIndices("input_indices")} ${t.selectLas x[offset + i] = ${w.type.value}(exp(f32input - max_value) / sum); } } - }`};return{name:"AttentionProbsSoftmax",shaderCache:{hint:`${i};${p};${o}`},getShaderSource:u,getRunData:()=>({outputs:[],dispatchGroup:{x:r},programUniforms:d})}},Qp=(e,t,r,n,o,i,a,l)=>{let d=l+i.kvSequenceLength,p=[i.batchSize,i.numHeads,i.sequenceLength,d],m=i.kvNumHeads===void 0&&e.outputCount>1,u=m?[i.batchSize,i.numHeads,d,i.headSize]:void 0,h=a.scale===0?1/Math.sqrt(i.headSize):a.scale,w=we(i.headSize),g=i.headSize/w,b=12,x={x:Math.ceil(d/b),y:Math.ceil(i.sequenceLength/b),z:i.batchSize*i.numHeads},_=[{type:12,data:i.sequenceLength},{type:12,data:g},{type:12,data:d},{type:12,data:i.numHeads},{type:1,data:h},{type:12,data:l},{type:12,data:i.kvSequenceLength}],$=["type","type"];n&&$.push("type"),o&&$.push("type");let S=[{dims:p,dataType:t.dataType,gpuDataType:0}];m&&S.push({dims:u,dataType:t.dataType,gpuDataType:0});let I=T=>{let A=E("q",t.dataType,t.dims,w),z=E("key",r.dataType,r.dims,w),D=[A,z];if(n){let ce=E("past_key",n.dataType,n.dims,w);D.push(ce)}o&&D.push(E("relative_position_bias",o.dataType,o.dims));let H=M("output",t.dataType,p),W=[H];m&&W.push(M("present_key",t.dataType,u,w));let F=Oe(1,w),de=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"alpha",type:"f32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"}];return` + }`};return{name:"AttentionProbsSoftmax",shaderCache:{hint:`${i};${p};${o}`},getShaderSource:u,getRunData:()=>({outputs:[],dispatchGroup:{x:r},programUniforms:d})}},em=(e,t,r,n,o,i,a,l)=>{let d=l+i.kvSequenceLength,p=[i.batchSize,i.numHeads,i.sequenceLength,d],m=i.kvNumHeads===void 0&&e.outputCount>1,u=m?[i.batchSize,i.numHeads,d,i.headSize]:void 0,h=a.scale===0?1/Math.sqrt(i.headSize):a.scale,w=we(i.headSize),g=i.headSize/w,b=12,x={x:Math.ceil(d/b),y:Math.ceil(i.sequenceLength/b),z:i.batchSize*i.numHeads},_=[{type:12,data:i.sequenceLength},{type:12,data:g},{type:12,data:d},{type:12,data:i.numHeads},{type:1,data:h},{type:12,data:l},{type:12,data:i.kvSequenceLength}],$=["type","type"];n&&$.push("type"),o&&$.push("type");let S=[{dims:p,dataType:t.dataType,gpuDataType:0}];m&&S.push({dims:u,dataType:t.dataType,gpuDataType:0});let I=T=>{let A=E("q",t.dataType,t.dims,w),D=E("key",r.dataType,r.dims,w),z=[A,D];if(n){let ce=E("past_key",n.dataType,n.dims,w);z.push(ce)}o&&z.push(E("relative_position_bias",o.dataType,o.dims));let H=M("output",t.dataType,p),W=[H];m&&W.push(M("present_key",t.dataType,u,w));let F=Oe(1,w),de=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"alpha",type:"f32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"}];return` const TILE_SIZE = ${b}u; var tileQ: array<${A.type.storage}, ${b*b}>; var tileK: array<${A.type.storage}, ${b*b}>; - ${T.registerUniforms(de).declareVariables(...D,...W)} + ${T.registerUniforms(de).declareVariables(...z,...W)} ${T.mainStart([b,b,1])} // x holds the N and y holds the M let headIdx = workgroup_id.z; @@ -249,11 +249,11 @@ var best_index : i32 = 0;`,`if (${n.getByIndices("input_indices")} ${t.selectLas var sum: f32 = ${(()=>{switch(w){case 1:return"value";case 2:return"value.x + value.y";case 4:return"value.x + value.y + value.z + value.w";default:throw new Error(`Unsupported components: ${w}`)}})()}; output[outputIdx] = ${H.type.value} (sum * uniforms.alpha) + ${o?"relative_position_bias[outputIdx]":"0.0"}; } - }`};return{name:"AttentionProbs",shaderCache:{hint:`${w};${o!==void 0};${n!==void 0};${e.outputCount}`,inputDependencies:$},getRunData:()=>({outputs:S,dispatchGroup:x,programUniforms:_}),getShaderSource:I}},Jp=(e,t,r,n,o,i)=>{let a=i+o.kvSequenceLength,l=o.nReps?o.nReps:1,d=o.vHiddenSize*l,p=o.kvNumHeads==null&&e.outputCount>1,m=p?[o.batchSize,o.numHeads,a,o.headSize]:void 0,u=[o.batchSize,o.sequenceLength,d],h=12,w={x:Math.ceil(o.vHeadSize/h),y:Math.ceil(o.sequenceLength/h),z:o.batchSize*o.numHeads},g=[{type:12,data:o.sequenceLength},{type:12,data:a},{type:12,data:o.vHeadSize},{type:12,data:o.numHeads},{type:12,data:d},{type:12,data:i},{type:12,data:o.kvSequenceLength}],b=n?["type","type","type"]:["type","type"],x=[{dims:u,dataType:t.dataType,gpuDataType:0}];p&&x.push({dims:m,dataType:t.dataType,gpuDataType:0});let _=$=>{let S=E("probs",t.dataType,t.dims),I=E("v",r.dataType,r.dims),T=[S,I];n&&T.push(E("past_value",n.dataType,n.dims));let z=[M("output",t.dataType,u)];p&&z.push(M("present_value",t.dataType,m));let D=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"v_hidden_size",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"}];return` + }`};return{name:"AttentionProbs",shaderCache:{hint:`${w};${o!==void 0};${n!==void 0};${e.outputCount}`,inputDependencies:$},getRunData:()=>({outputs:S,dispatchGroup:x,programUniforms:_}),getShaderSource:I}},tm=(e,t,r,n,o,i)=>{let a=i+o.kvSequenceLength,l=o.nReps?o.nReps:1,d=o.vHiddenSize*l,p=o.kvNumHeads==null&&e.outputCount>1,m=p?[o.batchSize,o.numHeads,a,o.headSize]:void 0,u=[o.batchSize,o.sequenceLength,d],h=12,w={x:Math.ceil(o.vHeadSize/h),y:Math.ceil(o.sequenceLength/h),z:o.batchSize*o.numHeads},g=[{type:12,data:o.sequenceLength},{type:12,data:a},{type:12,data:o.vHeadSize},{type:12,data:o.numHeads},{type:12,data:d},{type:12,data:i},{type:12,data:o.kvSequenceLength}],b=n?["type","type","type"]:["type","type"],x=[{dims:u,dataType:t.dataType,gpuDataType:0}];p&&x.push({dims:m,dataType:t.dataType,gpuDataType:0});let _=$=>{let S=E("probs",t.dataType,t.dims),I=E("v",r.dataType,r.dims),T=[S,I];n&&T.push(E("past_value",n.dataType,n.dims));let D=[M("output",t.dataType,u)];p&&D.push(M("present_value",t.dataType,m));let z=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"v_hidden_size",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"}];return` const TILE_SIZE = ${h}u; var tileQ: array<${S.type.value}, ${h*h}>; var tileK: array<${S.type.value}, ${h*h}>; - ${$.registerUniforms(D).declareVariables(...T,...z)} + ${$.registerUniforms(z).declareVariables(...T,...D)} ${$.mainStart([h,h,1])} let headIdx = workgroup_id.z; let m = global_id.y; @@ -300,7 +300,7 @@ var best_index : i32 = 0;`,`if (${n.getByIndices("input_indices")} ${t.selectLas + currentBatchHeadNumber * uniforms.N + n; output[outputIdx] = value; } - }`};return{name:"AttentionScore",shaderCache:{hint:`${n!==void 0};${e.outputCount}`,inputDependencies:b},getRunData:()=>({outputs:x,dispatchGroup:w,programUniforms:g}),getShaderSource:_}},Nt=(e,t,r,n,o,i,a,l,d,p,m)=>{let u=e.outputCount,h=p.kvNumHeads!==void 0||u>1?p.pastSequenceLength:0,w=h+p.kvSequenceLength,g=p.kvNumHeads===void 0&&u>1&&a?[t,r,a]:[t,r];d&&g.push(d);let b=e.compute(Qp(e,t,r,u>1?a:void 0,d,p,m,h),{inputs:g,outputs:p.kvNumHeads===void 0&&u>1?[-1,1]:[-1]})[0];e.compute(Zp(e,b,p.batchSize*p.numHeads*p.sequenceLength,w),{inputs:[b],outputs:[]});let x=p.kvNumHeads===void 0&&u>1&&l?[b,n,l]:[b,n];e.compute(Jp(e,b,n,u>1&&l?l:void 0,p,h),{inputs:x,outputs:p.kvNumHeads===void 0&&u>1?[0,2]:[0]})},em=(e,t)=>{let r=[t.batchSize,t.numHeads,t.sequenceLength,t.headSize],n=t.sequenceLength,o=t.inputHiddenSize,i=t.headSize,a=12,l={x:Math.ceil(t.headSize/a),y:Math.ceil(t.sequenceLength/a),z:t.batchSize*t.numHeads},d=[e.inputs[0],e.inputs[1],e.inputs[2]],p=[{type:12,data:n},{type:12,data:o},{type:12,data:i},{type:12,data:t.numHeads},{type:12,data:t.headSize},{type:12,data:t.hiddenSize},{type:12,data:t.hiddenSize+t.hiddenSize+t.vHiddenSize}],m=u=>{let h=M("output_q",d[0].dataType,r),w=M("output_k",d[0].dataType,r),g=M("output_v",d[0].dataType,r),b=E("input",d[0].dataType,d[0].dims),x=E("weight",d[1].dataType,d[1].dims),_=E("bias",d[2].dataType,d[2].dims),$=b.type.storage,S=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"hidden_size",type:"u32"},{name:"ldb",type:"u32"}];return` + }`};return{name:"AttentionScore",shaderCache:{hint:`${n!==void 0};${e.outputCount}`,inputDependencies:b},getRunData:()=>({outputs:x,dispatchGroup:w,programUniforms:g}),getShaderSource:_}},Wt=(e,t,r,n,o,i,a,l,d,p,m)=>{let u=e.outputCount,h=p.kvNumHeads!==void 0||u>1?p.pastSequenceLength:0,w=h+p.kvSequenceLength,g=p.kvNumHeads===void 0&&u>1&&a?[t,r,a]:[t,r];d&&g.push(d);let b=e.compute(em(e,t,r,u>1?a:void 0,d,p,m,h),{inputs:g,outputs:p.kvNumHeads===void 0&&u>1?[-1,1]:[-1]})[0];e.compute(Jp(e,b,p.batchSize*p.numHeads*p.sequenceLength,w),{inputs:[b],outputs:[]});let x=p.kvNumHeads===void 0&&u>1&&l?[b,n,l]:[b,n];e.compute(tm(e,b,n,u>1&&l?l:void 0,p,h),{inputs:x,outputs:p.kvNumHeads===void 0&&u>1?[0,2]:[0]})},rm=(e,t)=>{let r=[t.batchSize,t.numHeads,t.sequenceLength,t.headSize],n=t.sequenceLength,o=t.inputHiddenSize,i=t.headSize,a=12,l={x:Math.ceil(t.headSize/a),y:Math.ceil(t.sequenceLength/a),z:t.batchSize*t.numHeads},d=[e.inputs[0],e.inputs[1],e.inputs[2]],p=[{type:12,data:n},{type:12,data:o},{type:12,data:i},{type:12,data:t.numHeads},{type:12,data:t.headSize},{type:12,data:t.hiddenSize},{type:12,data:t.hiddenSize+t.hiddenSize+t.vHiddenSize}],m=u=>{let h=M("output_q",d[0].dataType,r),w=M("output_k",d[0].dataType,r),g=M("output_v",d[0].dataType,r),b=E("input",d[0].dataType,d[0].dims),x=E("weight",d[1].dataType,d[1].dims),_=E("bias",d[2].dataType,d[2].dims),$=b.type.storage,S=[{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"hidden_size",type:"u32"},{name:"ldb",type:"u32"}];return` const TILE_SIZE = ${a}u; var tileInput: array<${$}, ${a*a}>; var tileWeightQ: array<${$}, ${a*a}>; @@ -355,7 +355,7 @@ var best_index : i32 = 0;`,`if (${n.getByIndices("input_indices")} ${t.selectLas output_k[outputIdx] = valueK; output_v[outputIdx] = valueV; } - }`};return e.compute({name:"AttentionPrepare",shaderCache:{inputDependencies:["type","type","type"]},getRunData:()=>({outputs:[{dims:r,dataType:e.inputs[0].dataType,gpuDataType:0},{dims:r,dataType:e.inputs[0].dataType,gpuDataType:0},{dims:r,dataType:e.inputs[0].dataType,gpuDataType:0}],dispatchGroup:l,programUniforms:p}),getShaderSource:m},{inputs:d,outputs:[-1,-1,-1]})},xs=(e,t)=>{let r=Xp(e.inputs,t),[n,o,i]=em(e,r);return Nt(e,n,o,i,e.inputs[4],void 0,void 0,void 0,e.inputs[5],r,t)}});var tm,rm,nm,Ss,Is=U(()=>{"use strict";Le();Q();ae();Ce();oe();tm=(e,t)=>{if(!e||e.length!==5)throw new Error("BatchNormalization requires 5 inputs");let r=(n,o,i)=>{let a=o.length;if(a!==n.length)throw new Error(`${i}: num dimensions != ${a}`);o.forEach((l,d)=>{if(l!==n[d])throw new Error(`${i}: dim[${d}] do not match`)})};if(e[0].dims.length>1){let n=t.format==="NHWC"?t.spatial?e[0].dims.slice(-1):e[0].dims.slice(-1).concat(e[0].dims.slice(1,e[0].dims.length-1)):e[0].dims.slice(1,t.spatial?2:void 0);r(e[1].dims,n,"Invalid input scale"),r(e[2].dims,n,"Invalid input B"),r(e[3].dims,n,"Invalid input mean"),r(e[4].dims,n,"Invalid input var")}else r(e[1].dims,[1],"Invalid input scale"),r(e[2].dims,[1],"Invalid input B"),r(e[3].dims,[1],"Invalid input mean"),r(e[4].dims,[1],"Invalid input var")},rm=(e,t)=>{let{epsilon:r,spatial:n,format:o}=t,i=e[0].dims,a=n?we(i[i.length-1]):1,l=o==="NHWC"&&i.length>1?a:1,d=k.size(i)/a,p=n,m=p?i.length:i,u=E("x",e[0].dataType,e[0].dims,a),h=E("scale",e[1].dataType,e[1].dims,l),w=E("bias",e[2].dataType,e[2].dims,l),g=E("inputMean",e[3].dataType,e[3].dims,l),b=E("inputVar",e[4].dataType,e[4].dims,l),x=M("y",e[0].dataType,m,a),_=()=>{let S="";if(n)S=`let cOffset = ${i.length===1?"0u":o==="NHWC"?`outputIndices[${i.length-1}] / ${a}`:"outputIndices[1]"};`;else if(o==="NCHW")S=` + }`};return e.compute({name:"AttentionPrepare",shaderCache:{inputDependencies:["type","type","type"]},getRunData:()=>({outputs:[{dims:r,dataType:e.inputs[0].dataType,gpuDataType:0},{dims:r,dataType:e.inputs[0].dataType,gpuDataType:0},{dims:r,dataType:e.inputs[0].dataType,gpuDataType:0}],dispatchGroup:l,programUniforms:p}),getShaderSource:m},{inputs:d,outputs:[-1,-1,-1]})},xs=(e,t)=>{let r=Qp(e.inputs,t),[n,o,i]=rm(e,r);return Wt(e,n,o,i,e.inputs[4],void 0,void 0,void 0,e.inputs[5],r,t)}});var nm,om,im,Ss,Is=U(()=>{"use strict";Le();Q();ae();Ce();oe();nm=(e,t)=>{if(!e||e.length!==5)throw new Error("BatchNormalization requires 5 inputs");let r=(n,o,i)=>{let a=o.length;if(a!==n.length)throw new Error(`${i}: num dimensions != ${a}`);o.forEach((l,d)=>{if(l!==n[d])throw new Error(`${i}: dim[${d}] do not match`)})};if(e[0].dims.length>1){let n=t.format==="NHWC"?t.spatial?e[0].dims.slice(-1):e[0].dims.slice(-1).concat(e[0].dims.slice(1,e[0].dims.length-1)):e[0].dims.slice(1,t.spatial?2:void 0);r(e[1].dims,n,"Invalid input scale"),r(e[2].dims,n,"Invalid input B"),r(e[3].dims,n,"Invalid input mean"),r(e[4].dims,n,"Invalid input var")}else r(e[1].dims,[1],"Invalid input scale"),r(e[2].dims,[1],"Invalid input B"),r(e[3].dims,[1],"Invalid input mean"),r(e[4].dims,[1],"Invalid input var")},om=(e,t)=>{let{epsilon:r,spatial:n,format:o}=t,i=e[0].dims,a=n?we(i[i.length-1]):1,l=o==="NHWC"&&i.length>1?a:1,d=k.size(i)/a,p=n,m=p?i.length:i,u=E("x",e[0].dataType,e[0].dims,a),h=E("scale",e[1].dataType,e[1].dims,l),w=E("bias",e[2].dataType,e[2].dims,l),g=E("inputMean",e[3].dataType,e[3].dims,l),b=E("inputVar",e[4].dataType,e[4].dims,l),x=M("y",e[0].dataType,m,a),_=()=>{let S="";if(n)S=`let cOffset = ${i.length===1?"0u":o==="NHWC"?`outputIndices[${i.length-1}] / ${a}`:"outputIndices[1]"};`;else if(o==="NCHW")S=` ${x.indicesSet("outputIndices","0","0")} let cOffset = ${x.indicesToOffset("outputIndices")};`;else{S=`var cIndices = ${h.type.indices}(0); cIndices[0] = outputIndices[${i.length-1}];`;for(let I=1;I` @@ -372,7 +372,7 @@ var best_index : i32 = 0;`,`if (${n.getByIndices("input_indices")} ${t.selectLas let x = ${u.getByOffset("global_idx")}; let value = (x - inputMean) * inverseSqrt(inputVar + epsilon) * scale + bias; ${x.setByOffset("global_idx","value")} - }`;return{name:"BatchNormalization",shaderCache:{hint:`${t.epsilon}_${t.format}_${n}_${a}`,inputDependencies:p?["rank","type","type","type","type"]:void 0},getShaderSource:$,getRunData:()=>({outputs:[{dims:e[0].dims,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(d/64)},programUniforms:p?[{type:12,data:d},...V(i)]:[{type:12,data:d}]})}},nm=e=>te(e),Ss=(e,t)=>{let{inputs:r,outputCount:n}=e,o=nm({...t,outputCount:n});if(ye.webgpu.validateInputContent&&tm(r,o),t.trainingMode)throw new Error("BatchNormalization trainingMode is not supported yet.");e.compute(rm(r,o))}});var om,im,Cs,Ts=U(()=>{"use strict";ae();oe();om=e=>{if(e[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![320,640,1280].includes(e[0].dims[2]))throw new Error("number of channels should be 320, 640 or 1280");if(e[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(e[0].dims[2]!==e[1].dims[0])throw new Error("last dimension of input and bias are not the same")},im=e=>{let t=e[0].dims,r=e[0].dims[2],n=k.size(t)/4,o=e[0].dataType,i=E("input",o,t,4),a=E("bias",o,[r],4),l=E("residual",o,t,4),d=M("output",o,t,4);return{name:"BiasAdd",getRunData:()=>({outputs:[{dims:t,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(n/64)}}),getShaderSource:m=>` + }`;return{name:"BatchNormalization",shaderCache:{hint:`${t.epsilon}_${t.format}_${n}_${a}`,inputDependencies:p?["rank","type","type","type","type"]:void 0},getShaderSource:$,getRunData:()=>({outputs:[{dims:e[0].dims,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(d/64)},programUniforms:p?[{type:12,data:d},...V(i)]:[{type:12,data:d}]})}},im=e=>te(e),Ss=(e,t)=>{let{inputs:r,outputCount:n}=e,o=im({...t,outputCount:n});if(ye.webgpu.validateInputContent&&nm(r,o),t.trainingMode)throw new Error("BatchNormalization trainingMode is not supported yet.");e.compute(om(r,o))}});var am,sm,Cs,Ts=U(()=>{"use strict";ae();oe();am=e=>{if(e[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![320,640,1280].includes(e[0].dims[2]))throw new Error("number of channels should be 320, 640 or 1280");if(e[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(e[0].dims[2]!==e[1].dims[0])throw new Error("last dimension of input and bias are not the same")},sm=e=>{let t=e[0].dims,r=e[0].dims[2],n=k.size(t)/4,o=e[0].dataType,i=E("input",o,t,4),a=E("bias",o,[r],4),l=E("residual",o,t,4),d=M("output",o,t,4);return{name:"BiasAdd",getRunData:()=>({outputs:[{dims:t,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(n/64)}}),getShaderSource:m=>` const channels = ${r}u / 4; ${m.declareVariables(i,a,l,d)} @@ -381,7 +381,7 @@ var best_index : i32 = 0;`,`if (${n.getByIndices("input_indices")} ${t.selectLas let value = ${i.getByOffset("global_idx")} + ${a.getByOffset("global_idx % channels")} + ${l.getByOffset("global_idx")}; ${d.setByOffset("global_idx","value")} - }`}},Cs=e=>{om(e.inputs),e.compute(im(e.inputs))}});var am,me,As,Es,ks,Ps,Os,zs,Ds,Bs,Rs,sm,Ms,Us,Vs,Ns,Zt,Ws,Kr,Hs,Gs,Ls,Fs,qs,Ks,js,Ys,Xs,Zs,Qs,Js,eu,tu,ru,nu,ou,iu,oo,io,au,su,uu,um,dm,du,jr=U(()=>{"use strict";Q();ae();Ce();oe();am=(e,t,r,n,o,i)=>{let a=Math.ceil(t/4),l="";typeof o=="string"?l=`${o}(a)`:l=o("a");let d=E("inputData",r,[a],4),p=M("outputData",n,[a],4);return` + }`}},Cs=e=>{am(e.inputs),e.compute(sm(e.inputs))}});var um,me,As,Es,ks,Ps,Os,Ds,zs,Bs,Rs,dm,Ms,Us,Vs,Ns,Zt,Ws,jr,Hs,Gs,Ls,Fs,qs,js,Ks,Ys,Xs,Zs,Qs,Js,eu,tu,ru,nu,ou,iu,io,ao,au,su,uu,lm,cm,du,Kr=U(()=>{"use strict";Q();ae();Ce();oe();um=(e,t,r,n,o,i)=>{let a=Math.ceil(t/4),l="";typeof o=="string"?l=`${o}(a)`:l=o("a");let d=E("inputData",r,[a],4),p=M("outputData",n,[a],4);return` ${e.registerUniform("vec_size","u32").declareVariables(d,p)} ${i??""} @@ -391,7 +391,7 @@ var best_index : i32 = 0;`,`if (${n.getByIndices("input_indices")} ${t.selectLas let a = ${d.getByOffset("global_idx")}; ${p.setByOffset("global_idx",l)} - }`},me=(e,t,r,n,o,i=e.dataType)=>({name:t,shaderCache:{hint:o,inputDependencies:["type"]},getShaderSource:a=>am(a,k.size(e.dims),e.dataType,i,r,n),getRunData:a=>({outputs:[{dims:e.dims,dataType:i}],dispatchGroup:{x:Math.ceil(k.size(a[0].dims)/64/4)},programUniforms:[{type:12,data:Math.ceil(k.size(e.dims)/4)}]})}),As=e=>{e.compute(me(e.inputs[0],"Abs","abs"))},Es=e=>{e.compute(me(e.inputs[0],"Acos","acos"))},ks=e=>{e.compute(me(e.inputs[0],"Acosh","acosh"))},Ps=e=>{e.compute(me(e.inputs[0],"Asin","asin"))},Os=e=>{e.compute(me(e.inputs[0],"Asinh","asinh"))},zs=e=>{e.compute(me(e.inputs[0],"Atan","atan"))},Ds=e=>{e.compute(me(e.inputs[0],"Atanh","atanh"))},Bs=e=>te(e),Rs=(e,t)=>{let r;switch(t.to){case 10:r="vec4";break;case 1:r="vec4";break;case 12:r="vec4";break;case 6:r="vec4";break;case 9:r="vec4";break;default:throw new RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${t.to}`)}e.compute(me(e.inputs[0],"Cast",r,void 0,t.cacheKey,t.to))},sm=e=>{let t=e.length>=2&&e[1].data!==0?e[1].getFloat32Array()[0]:Wr,r=e.length>=3&&e[2].data!==0?e[2].getFloat32Array()[0]:Hr;return te({min:t,max:r})},Ms=(e,t)=>{let r=e.inputs.length===1?t:sm(e.inputs),n=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"Clip",o=>`clamp(${o}, clip_min_, clip_max_)`,` + }`},me=(e,t,r,n,o,i=e.dataType)=>({name:t,shaderCache:{hint:o,inputDependencies:["type"]},getShaderSource:a=>um(a,k.size(e.dims),e.dataType,i,r,n),getRunData:a=>({outputs:[{dims:e.dims,dataType:i}],dispatchGroup:{x:Math.ceil(k.size(a[0].dims)/64/4)},programUniforms:[{type:12,data:Math.ceil(k.size(e.dims)/4)}]})}),As=e=>{e.compute(me(e.inputs[0],"Abs","abs"))},Es=e=>{e.compute(me(e.inputs[0],"Acos","acos"))},ks=e=>{e.compute(me(e.inputs[0],"Acosh","acosh"))},Ps=e=>{e.compute(me(e.inputs[0],"Asin","asin"))},Os=e=>{e.compute(me(e.inputs[0],"Asinh","asinh"))},Ds=e=>{e.compute(me(e.inputs[0],"Atan","atan"))},zs=e=>{e.compute(me(e.inputs[0],"Atanh","atanh"))},Bs=e=>te(e),Rs=(e,t)=>{let r;switch(t.to){case 10:r="vec4";break;case 1:r="vec4";break;case 12:r="vec4";break;case 6:r="vec4";break;case 9:r="vec4";break;default:throw new RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${t.to}`)}e.compute(me(e.inputs[0],"Cast",r,void 0,t.cacheKey,t.to))},dm=e=>{let t=e.length>=2&&e[1].data!==0?e[1].getFloat32Array()[0]:Wr,r=e.length>=3&&e[2].data!==0?e[2].getFloat32Array()[0]:Hr;return te({min:t,max:r})},Ms=(e,t)=>{let r=e.inputs.length===1?t:dm(e.inputs),n=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"Clip",o=>`clamp(${o}, clip_min_, clip_max_)`,` const clip_min_: vec4<${n}> = vec4(${n}(${r.min})); const clip_max_: vec4<${n}> = vec4(${n}(${r.max})); `,r.cacheKey),{inputs:[0]})},Us=e=>{e.compute(me(e.inputs[0],"Ceil","ceil"))},Vs=e=>{e.compute(me(e.inputs[0],"Cos","cos"))},Ns=e=>{e.compute(me(e.inputs[0],"Cosh","cosh"))},Zt=e=>te(e),Ws=(e,t)=>{let r=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"Elu",n=>`elu_vf32(${n})`,` @@ -403,7 +403,7 @@ var best_index : i32 = 0;`,`if (${n.getByIndices("input_indices")} ${t.selectLas fn elu_vf32(v: vec4<${r}>) -> vec4<${r}> { return vec4(elu_f32(v.x), elu_f32(v.y), elu_f32(v.z), elu_f32(v.w)); - }`,t.cacheKey))},Kr=(e="f32")=>` + }`,t.cacheKey))},jr=(e="f32")=>` const r0: ${e} = 0.3275911; const r1: ${e} = 0.254829592; const r2: ${e} = -0.284496736; @@ -415,7 +415,7 @@ fn erf_vf32(v: vec4<${e}>) -> vec4<${e}> { let absv = abs(v); let x = 1.0 / (1.0 + r0 * absv); return sign(v) * (1.0 - ((((r5 * x + r4) * x + r3) * x + r2) * x + r1) * x * exp(-absv * absv)); -}`,Hs=e=>{let t=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"Erf",r=>`erf_vf32(${r})`,Kr(t)))},Gs=e=>{e.compute(me(e.inputs[0],"Exp","exp"))},Ls=e=>{e.compute(me(e.inputs[0],"Floor","floor"))},Fs=e=>{let t=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"Gelu",r=>`0.5 * ${r} * (1.0 + erf_vf32(${r} * 0.7071067811865475))`,Kr(t)))},qs=(e,t)=>{let r=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"LeakyRelu",n=>`select(leaky_relu_alpha_ * ${n}, ${n}, ${n} >= vec4<${r}>(0.0))`,`const leaky_relu_alpha_ = ${r}(${t.alpha});`,t.cacheKey))},Ks=e=>{e.compute(me(e.inputs[0],"Not",t=>`!${t}`))},js=e=>{e.compute(me(e.inputs[0],"Neg",t=>`-${t}`))},Ys=e=>{e.compute(me(e.inputs[0],"Reciprocal",t=>`1.0/${t}`))},Xs=e=>{let t=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"Relu",r=>`select(vec4<${t}>(0.0), ${r}, ${r} > vec4<${t}>(0.0))`))},Zs=e=>{e.compute(me(e.inputs[0],"Sigmoid",t=>`(1.0 / (1.0 + exp(-${t})))`))},Qs=e=>te(e),Js=(e,t)=>{let r=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"HardSigmoid",n=>`max(vec4<${r}>(0.0), min(vec4<${r}>(1.0), ${t.alpha} * ${n} + vec4<${r}>(${t.beta})))`,void 0,t.cacheKey))},eu=e=>{e.compute(me(e.inputs[0],"Sin","sin"))},tu=e=>{e.compute(me(e.inputs[0],"Sinh","sinh"))},ru=e=>{e.compute(me(e.inputs[0],"Sqrt","sqrt"))},nu=e=>{e.compute(me(e.inputs[0],"Tan","tan"))},ou=e=>`sign(${e}) * (1 - exp(-2 * abs(${e}))) / (1 + exp(-2 * abs(${e})))`,iu=e=>{e.compute(me(e.inputs[0],"Tanh",ou))},oo=(e="f32")=>` +}`,Hs=e=>{let t=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"Erf",r=>`erf_vf32(${r})`,jr(t)))},Gs=e=>{e.compute(me(e.inputs[0],"Exp","exp"))},Ls=e=>{e.compute(me(e.inputs[0],"Floor","floor"))},Fs=e=>{let t=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"Gelu",r=>`0.5 * ${r} * (1.0 + erf_vf32(${r} * 0.7071067811865475))`,jr(t)))},qs=(e,t)=>{let r=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"LeakyRelu",n=>`select(leaky_relu_alpha_ * ${n}, ${n}, ${n} >= vec4<${r}>(0.0))`,`const leaky_relu_alpha_ = ${r}(${t.alpha});`,t.cacheKey))},js=e=>{e.compute(me(e.inputs[0],"Not",t=>`!${t}`))},Ks=e=>{e.compute(me(e.inputs[0],"Neg",t=>`-${t}`))},Ys=e=>{e.compute(me(e.inputs[0],"Reciprocal",t=>`1.0/${t}`))},Xs=e=>{let t=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"Relu",r=>`select(vec4<${t}>(0.0), ${r}, ${r} > vec4<${t}>(0.0))`))},Zs=e=>{e.compute(me(e.inputs[0],"Sigmoid",t=>`(1.0 / (1.0 + exp(-${t})))`))},Qs=e=>te(e),Js=(e,t)=>{let r=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"HardSigmoid",n=>`max(vec4<${r}>(0.0), min(vec4<${r}>(1.0), ${t.alpha} * ${n} + vec4<${r}>(${t.beta})))`,void 0,t.cacheKey))},eu=e=>{e.compute(me(e.inputs[0],"Sin","sin"))},tu=e=>{e.compute(me(e.inputs[0],"Sinh","sinh"))},ru=e=>{e.compute(me(e.inputs[0],"Sqrt","sqrt"))},nu=e=>{e.compute(me(e.inputs[0],"Tan","tan"))},ou=e=>`sign(${e}) * (1 - exp(-2 * abs(${e}))) / (1 + exp(-2 * abs(${e})))`,iu=e=>{e.compute(me(e.inputs[0],"Tanh",ou))},io=(e="f32")=>` const fast_gelu_a: ${e} = 0.5; const fast_gelu_b: ${e} = 0.7978845608028654; const fast_gelu_c: ${e} = 0.035677408136300125; @@ -423,7 +423,7 @@ const fast_gelu_c: ${e} = 0.035677408136300125; fn tanh_v(v: vec4<${e}>) -> vec4<${e}> { return ${ou("v")}; } -`,io=e=>`(fast_gelu_a + fast_gelu_a * tanh_v(${e} * (fast_gelu_c * ${e} * ${e} + fast_gelu_b))) * ${e}`,au=e=>{let t=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"FastGelu",io,oo(t),void 0,e.inputs[0].dataType))},su=(e,t)=>{let r=Oe(e.inputs[0].dataType);return e.compute(me(e.inputs[0],"ThresholdedRelu",n=>`select(vec4<${r}>(0.0), ${n}, ${n} > thresholded_relu_alpha_)`,`const thresholded_relu_alpha_ = vec4<${r}>(${t.alpha});`,t.cacheKey)),0},uu=e=>{e.compute(me(e.inputs[0],"Log","log"))},um=(e,t)=>` +`,ao=e=>`(fast_gelu_a + fast_gelu_a * tanh_v(${e} * (fast_gelu_c * ${e} * ${e} + fast_gelu_b))) * ${e}`,au=e=>{let t=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"FastGelu",ao,io(t),void 0,e.inputs[0].dataType))},su=(e,t)=>{let r=Oe(e.inputs[0].dataType);return e.compute(me(e.inputs[0],"ThresholdedRelu",n=>`select(vec4<${r}>(0.0), ${n}, ${n} > thresholded_relu_alpha_)`,`const thresholded_relu_alpha_ = vec4<${r}>(${t.alpha});`,t.cacheKey)),0},uu=e=>{e.compute(me(e.inputs[0],"Log","log"))},lm=(e,t)=>` const alpha = vec4<${e}>(${t}); const one = ${e}(1.0); const zero = ${e}(0.0); @@ -440,13 +440,13 @@ fn quick_gelu_impl(x: vec4<${e}>) -> vec4<${e}> { } return x * x1; } -`,dm=e=>`quick_gelu_impl(${e})`,du=(e,t)=>{let r=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"QuickGelu",dm,um(r,t.alpha),t.cacheKey,e.inputs[0].dataType))}});var lm,cm,cu,pu=U(()=>{"use strict";ae();oe();jr();lm=e=>{if(e[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![2560,5120,10240].includes(e[0].dims[2]))throw new Error("hidden state should be 2560, 5120 or 10240");if(e[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(e[0].dims[2]!==e[1].dims[0])throw new Error("last dimension of input and bias are not the same")},cm=e=>{let t=e[0].dims.slice();t[2]=t[2]/2;let r=E("input",e[0].dataType,e[0].dims,4),n=E("bias",e[0].dataType,[e[0].dims[2]],4),o=M("output",e[0].dataType,t,4),i=k.size(t)/4,a=he(e[0].dataType);return{name:"BiasSplitGelu",getRunData:()=>({outputs:[{dims:t,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(i/64)}}),getShaderSource:d=>` +`,cm=e=>`quick_gelu_impl(${e})`,du=(e,t)=>{let r=Oe(e.inputs[0].dataType);e.compute(me(e.inputs[0],"QuickGelu",cm,lm(r,t.alpha),t.cacheKey,e.inputs[0].dataType))}});var pm,mm,cu,pu=U(()=>{"use strict";ae();oe();Kr();pm=e=>{if(e[0].dims.length!==3)throw new Error("input should have 3 dimensions");if(![2560,5120,10240].includes(e[0].dims[2]))throw new Error("hidden state should be 2560, 5120 or 10240");if(e[1].dims.length!==1)throw new Error("bias is expected to have 1 dimensions");if(e[0].dims[2]!==e[1].dims[0])throw new Error("last dimension of input and bias are not the same")},mm=e=>{let t=e[0].dims.slice();t[2]=t[2]/2;let r=E("input",e[0].dataType,e[0].dims,4),n=E("bias",e[0].dataType,[e[0].dims[2]],4),o=M("output",e[0].dataType,t,4),i=k.size(t)/4,a=he(e[0].dataType);return{name:"BiasSplitGelu",getRunData:()=>({outputs:[{dims:t,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(i/64)}}),getShaderSource:d=>` const M_SQRT2 = sqrt(2.0); const halfChannels = ${e[0].dims[2]/4/2}u; ${d.declareVariables(r,n,o)} - ${Kr(a)} + ${jr(a)} ${d.mainStart()} ${d.guardAgainstOutOfBoundsWorkgroupSizes(i)} @@ -458,12 +458,12 @@ fn quick_gelu_impl(x: vec4<${e}>) -> vec4<${e}> { let geluRight = valueRight * 0.5 * (erf_vf32(valueRight / M_SQRT2) + 1); ${o.setByOffset("global_idx","valueLeft * geluRight")} - }`}},cu=e=>{lm(e.inputs),e.compute(cm(e.inputs))}});var pm,mm,at,mu,fu,hu,gu,yu,bu,wu,vu,$u,_u,xu=U(()=>{"use strict";Q();ae();oe();pm=(e,t,r,n,o,i,a,l,d,p,m,u)=>{let h,w;typeof l=="string"?h=w=($,S)=>`${l}((${$}),(${S}))`:typeof l=="function"?h=w=l:(h=l.scalar,w=l.vector);let g=M("outputData",m,n.length,4),b=E("aData",d,t.length,4),x=E("bData",p,r.length,4),_;if(o)if(i){let $=k.size(t)===1,S=k.size(r)===1,I=t.length>0&&t[t.length-1]%4===0,T=r.length>0&&r[r.length-1]%4===0;$||S?_=g.setByOffset("global_idx",w($?`${b.type.value}(${b.getByOffset("0")}.x)`:b.getByOffset("global_idx"),S?`${x.type.value}(${x.getByOffset("0")}.x)`:x.getByOffset("global_idx"))):_=` + }`}},cu=e=>{pm(e.inputs),e.compute(mm(e.inputs))}});var fm,hm,at,mu,fu,hu,gu,yu,bu,wu,vu,$u,_u,xu=U(()=>{"use strict";Q();ae();oe();fm=(e,t,r,n,o,i,a,l,d,p,m,u)=>{let h,w;typeof l=="string"?h=w=($,S)=>`${l}((${$}),(${S}))`:typeof l=="function"?h=w=l:(h=l.scalar,w=l.vector);let g=M("outputData",m,n.length,4),b=E("aData",d,t.length,4),x=E("bData",p,r.length,4),_;if(o)if(i){let $=k.size(t)===1,S=k.size(r)===1,I=t.length>0&&t[t.length-1]%4===0,T=r.length>0&&r[r.length-1]%4===0;$||S?_=g.setByOffset("global_idx",w($?`${b.type.value}(${b.getByOffset("0")}.x)`:b.getByOffset("global_idx"),S?`${x.type.value}(${x.getByOffset("0")}.x)`:x.getByOffset("global_idx"))):_=` let outputIndices = ${g.offsetToIndices("global_idx * 4u")}; let offsetA = ${b.broadcastedIndicesToOffset("outputIndices",g)}; let offsetB = ${x.broadcastedIndicesToOffset("outputIndices",g)}; ${g.setByOffset("global_idx",w(a||I?b.getByOffset("offsetA / 4u"):`${b.type.value}(${b.getByOffset("offsetA / 4u")}[offsetA % 4u])`,a||T?x.getByOffset("offsetB / 4u"):`${x.type.value}(${x.getByOffset("offsetB / 4u")}[offsetB % 4u])`))} - `}else _=g.setByOffset("global_idx",w(b.getByOffset("global_idx"),x.getByOffset("global_idx")));else{if(!i)throw new Error("no necessary to use scalar implementation for element-wise binary op implementation.");let $=(S,I,T="")=>{let A=`aData[indexA${I}][componentA${I}]`,z=`bData[indexB${I}][componentB${I}]`;return` + `}else _=g.setByOffset("global_idx",w(b.getByOffset("global_idx"),x.getByOffset("global_idx")));else{if(!i)throw new Error("no necessary to use scalar implementation for element-wise binary op implementation.");let $=(S,I,T="")=>{let A=`aData[indexA${I}][componentA${I}]`,D=`bData[indexB${I}][componentB${I}]`;return` let outputIndices${I} = ${g.offsetToIndices(`global_idx * 4u + ${I}u`)}; let offsetA${I} = ${b.broadcastedIndicesToOffset(`outputIndices${I}`,g)}; let offsetB${I} = ${x.broadcastedIndicesToOffset(`outputIndices${I}`,g)}; @@ -471,7 +471,7 @@ fn quick_gelu_impl(x: vec4<${e}>) -> vec4<${e}> { let indexB${I} = offsetB${I} / 4u; let componentA${I} = offsetA${I} % 4u; let componentB${I} = offsetB${I} % 4u; - ${S}[${I}] = ${T}(${h(A,z)}); + ${S}[${I}] = ${T}(${h(A,D)}); `};m===9?_=` var data = vec4(0); ${$("data",0,"u32")} @@ -491,7 +491,7 @@ fn quick_gelu_impl(x: vec4<${e}>) -> vec4<${e}> { ${e.mainStart()} ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} ${_} - }`},mm=(e,t,r,n,o,i,a=r.dataType)=>{let l=!k.areEqual(r.dims,n.dims),d=r.dims,p=k.size(r.dims),m=!1,u=!1,h=[l];if(l){let w=tt.calcShape(r.dims,n.dims,!1);if(!w)throw new Error("Can't perform binary op on the given tensors");d=w,p=k.size(d);let g=k.size(r.dims)===1,b=k.size(n.dims)===1,x=r.dims.length>0&&r.dims[r.dims.length-1]%4===0,_=n.dims.length>0&&n.dims[n.dims.length-1]%4===0;h.push(g),h.push(b),h.push(x),h.push(_);let $=1;for(let S=1;Sw.toString()).join("_"),inputDependencies:["rank","rank"]},getShaderSource:w=>pm(w,r.dims,n.dims,d,m,l,u,o,r.dataType,n.dataType,a,i),getRunData:()=>({outputs:[{dims:d,dataType:a}],dispatchGroup:{x:Math.ceil(p/64/4)},programUniforms:[{type:12,data:Math.ceil(k.size(d)/4)},...V(r.dims,n.dims,d)]})}},at=(e,t,r,n,o,i)=>{e.compute(mm(t,o??"",e.inputs[0],e.inputs[1],r,n,i))},mu=e=>{at(e,"Add",(t,r)=>`${t}+${r}`)},fu=e=>{at(e,"Div",(t,r)=>`${t}/${r}`)},hu=e=>{at(e,"Equal",{scalar:(t,r)=>`u32(${t}==${r})`,vector:(t,r)=>`vec4(${t}==${r})`},void 0,void 0,9)},gu=e=>{at(e,"Mul",(t,r)=>`${t}*${r}`)},yu=e=>{let t=E("input",e.inputs[0].dataType,e.inputs[0].dims).type.value;at(e,"Pow",{scalar:(n,o)=>`pow_custom(${n},${o})`,vector:(n,o)=>`pow_vector_custom(${n},${o})`},` + }`},hm=(e,t,r,n,o,i,a=r.dataType)=>{let l=!k.areEqual(r.dims,n.dims),d=r.dims,p=k.size(r.dims),m=!1,u=!1,h=[l];if(l){let w=tt.calcShape(r.dims,n.dims,!1);if(!w)throw new Error("Can't perform binary op on the given tensors");d=w,p=k.size(d);let g=k.size(r.dims)===1,b=k.size(n.dims)===1,x=r.dims.length>0&&r.dims[r.dims.length-1]%4===0,_=n.dims.length>0&&n.dims[n.dims.length-1]%4===0;h.push(g),h.push(b),h.push(x),h.push(_);let $=1;for(let S=1;Sw.toString()).join("_"),inputDependencies:["rank","rank"]},getShaderSource:w=>fm(w,r.dims,n.dims,d,m,l,u,o,r.dataType,n.dataType,a,i),getRunData:()=>({outputs:[{dims:d,dataType:a}],dispatchGroup:{x:Math.ceil(p/64/4)},programUniforms:[{type:12,data:Math.ceil(k.size(d)/4)},...V(r.dims,n.dims,d)]})}},at=(e,t,r,n,o,i)=>{e.compute(hm(t,o??"",e.inputs[0],e.inputs[1],r,n,i))},mu=e=>{at(e,"Add",(t,r)=>`${t}+${r}`)},fu=e=>{at(e,"Div",(t,r)=>`${t}/${r}`)},hu=e=>{at(e,"Equal",{scalar:(t,r)=>`u32(${t}==${r})`,vector:(t,r)=>`vec4(${t}==${r})`},void 0,void 0,9)},gu=e=>{at(e,"Mul",(t,r)=>`${t}*${r}`)},yu=e=>{let t=E("input",e.inputs[0].dataType,e.inputs[0].dims).type.value;at(e,"Pow",{scalar:(n,o)=>`pow_custom(${n},${o})`,vector:(n,o)=>`pow_vector_custom(${n},${o})`},` fn pow_custom(a : ${t}, b : ${t}) -> ${t} { if (b == ${t}(0.0)) { return ${t}(1.0); @@ -504,7 +504,7 @@ fn quick_gelu_impl(x: vec4<${e}>) -> vec4<${e}> { // TODO: implement vectorized pow return vec4<${t}>(pow_custom(a.x, b.x), pow_custom(a.y, b.y), pow_custom(a.z, b.z), pow_custom(a.w, b.w)); } - `)},bu=e=>{at(e,"Sub",(t,r)=>`${t}-${r}`)},wu=e=>{at(e,"Greater",{scalar:(t,r)=>`u32(${t}>${r})`,vector:(t,r)=>`vec4(${t}>${r})`},void 0,void 0,9)},vu=e=>{at(e,"Less",{scalar:(t,r)=>`u32(${t}<${r})`,vector:(t,r)=>`vec4(${t}<${r})`},void 0,void 0,9)},$u=e=>{at(e,"GreaterOrEqual",{scalar:(t,r)=>`u32(${t}>=${r})`,vector:(t,r)=>`vec4(${t}>=${r})`},void 0,void 0,9)},_u=e=>{at(e,"LessOrEqual",{scalar:(t,r)=>`u32(${t}<=${r})`,vector:(t,r)=>`vec4(${t}<=${r})`},void 0,void 0,9)}});var hm,gm,ym,bm,Su,Iu,Cu=U(()=>{"use strict";Q();ae();Ce();oe();hm=(e,t)=>{if(!e||e.length<1)throw new Error("too few inputs");let r=0,n=e[r],o=n.dataType,i=n.dims.length;e.forEach((a,l)=>{if(l!==r){if(a.dataType!==o)throw new Error("input tensors should be one type");if(a.dims.length!==i)throw new Error("input tensors should have the same shape");a.dims.forEach((d,p)=>{if(p!==t&&d!==n.dims[p])throw new Error("non concat dimensions must match")})}})},gm=(e,t)=>` + `)},bu=e=>{at(e,"Sub",(t,r)=>`${t}-${r}`)},wu=e=>{at(e,"Greater",{scalar:(t,r)=>`u32(${t}>${r})`,vector:(t,r)=>`vec4(${t}>${r})`},void 0,void 0,9)},vu=e=>{at(e,"Less",{scalar:(t,r)=>`u32(${t}<${r})`,vector:(t,r)=>`vec4(${t}<${r})`},void 0,void 0,9)},$u=e=>{at(e,"GreaterOrEqual",{scalar:(t,r)=>`u32(${t}>=${r})`,vector:(t,r)=>`vec4(${t}>=${r})`},void 0,void 0,9)},_u=e=>{at(e,"LessOrEqual",{scalar:(t,r)=>`u32(${t}<=${r})`,vector:(t,r)=>`vec4(${t}<=${r})`},void 0,void 0,9)}});var ym,bm,wm,vm,Su,Iu,Cu=U(()=>{"use strict";Q();ae();Ce();oe();ym=(e,t)=>{if(!e||e.length<1)throw new Error("too few inputs");let r=0,n=e[r],o=n.dataType,i=n.dims.length;e.forEach((a,l)=>{if(l!==r){if(a.dataType!==o)throw new Error("input tensors should be one type");if(a.dims.length!==i)throw new Error("input tensors should have the same shape");a.dims.forEach((d,p)=>{if(p!==t&&d!==n.dims[p])throw new Error("non concat dimensions must match")})}})},bm=(e,t)=>` fn calculateInputIndex(index: u32) -> u32 { let sizeInConcatAxis = array(${t}); for (var i: u32 = 0u; i < ${e}; i += 1u ) { @@ -513,12 +513,12 @@ fn quick_gelu_impl(x: vec4<${e}>) -> vec4<${e}> { } } return ${e}u; - }`,ym=(e,t)=>{let r=e.length,n=[];for(let o=0;o{let o=k.size(r),i=new Array(e.length),a=new Array(e.length),l=0,d=[],p=[],m=[{type:12,data:o}];for(let b=0;b`uniforms.sizeInConcatAxis${b}`).join(","),g=b=>` + }`,wm=(e,t)=>{let r=e.length,n=[];for(let o=0;o{let o=k.size(r),i=new Array(e.length),a=new Array(e.length),l=0,d=[],p=[],m=[{type:12,data:o}];for(let b=0;b`uniforms.sizeInConcatAxis${b}`).join(","),g=b=>` ${(()=>{b.registerUniform("outputSize","u32");for(let x=0;x) -> vec4<${e}> { ${h} -= sizeInConcatAxis[inputIndex - 1u]; } - ${ym(a,u)} - }`;return{name:"Concat",shaderCache:{hint:`${t}`,inputDependencies:d},getRunData:()=>({outputs:[{dims:r,dataType:n}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:m}),getShaderSource:g}},Su=(e,t)=>{let r=e.inputs,n=r[0].dims,o=k.normalizeAxis(t.axis,n.length);hm(r,o);let i=n.slice();i[o]=r.reduce((l,d)=>l+(d.dims.length>o?d.dims[o]:0),0);let a=r.filter(l=>k.size(l.dims)>0);e.compute(bm(a,o,i,r[0].dataType),{inputs:a})},Iu=e=>te({axis:e.axis})});var Ke,je,Ye,Yr,yt=U(()=>{"use strict";Q();ae();Ke=(e,t,r="f32")=>{switch(e.activation){case"Relu":return`value = max(value, ${t}(0.0));`;case"Sigmoid":return`value = (${t}(1.0) / (${t}(1.0) + exp(-value)));`;case"Clip":return`value = clamp(value, ${t}(${r}(uniforms.clip_min)), ${t}(${r}(uniforms.clip_max)));`;case"HardSigmoid":return`value = max(${t}(0.0), min(${t}(1.0), ${r}(uniforms.alpha) * value + ${r}(uniforms.beta)));`;case"LeakyRelu":return`value = select(${r}(uniforms.alpha) * value, value, value >= ${t}(0.0));`;case"":return"";default:throw new Error(`Unsupported activation ${e.activation}`)}},je=(e,t)=>{e.activation==="Clip"?t.push({type:1,data:e.clipMax},{type:1,data:e.clipMin}):e.activation==="HardSigmoid"?t.push({type:1,data:e.alpha},{type:1,data:e.beta}):e.activation==="LeakyRelu"&&t.push({type:1,data:e.alpha})},Ye=(e,t)=>{e.activation==="Clip"?t.push({name:"clip_max",type:"f32"},{name:"clip_min",type:"f32"}):e.activation==="HardSigmoid"?t.push({name:"alpha",type:"f32"},{name:"beta",type:"f32"}):e.activation==="LeakyRelu"&&t.push({name:"alpha",type:"f32"})},Yr=e=>{let t=e?.activation||"";if(t==="HardSigmoid"){let[r,n]=e?.activation_params||[.2,.5];return{activation:t,alpha:r,beta:n}}else if(t==="Clip"){let[r,n]=e?.activation_params||[Wr,Hr];return{activation:t,clipMax:n,clipMin:r}}else if(t==="LeakyRelu"){let[r]=e?.activation_params||[.01];return{activation:t,alpha:r}}return{activation:t}}});var De,Xr,Zr=U(()=>{"use strict";De=(e,t)=>{switch(e){case 1:return t;case 2:return`vec2<${t}>`;case 3:return`vec3<${t}>`;case 4:return`vec4<${t}>`;default:throw new Error(`${e}-component is not supported.`)}},Xr=e=>` + ${wm(a,u)} + }`;return{name:"Concat",shaderCache:{hint:`${t}`,inputDependencies:d},getRunData:()=>({outputs:[{dims:r,dataType:n}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:m}),getShaderSource:g}},Su=(e,t)=>{let r=e.inputs,n=r[0].dims,o=k.normalizeAxis(t.axis,n.length);ym(r,o);let i=n.slice();i[o]=r.reduce((l,d)=>l+(d.dims.length>o?d.dims[o]:0),0);let a=r.filter(l=>k.size(l.dims)>0);e.compute(vm(a,o,i,r[0].dataType),{inputs:a})},Iu=e=>te({axis:e.axis})});var je,Ke,Ye,Yr,yt=U(()=>{"use strict";Q();ae();je=(e,t,r="f32")=>{switch(e.activation){case"Relu":return`value = max(value, ${t}(0.0));`;case"Sigmoid":return`value = (${t}(1.0) / (${t}(1.0) + exp(-value)));`;case"Clip":return`value = clamp(value, ${t}(${r}(uniforms.clip_min)), ${t}(${r}(uniforms.clip_max)));`;case"HardSigmoid":return`value = max(${t}(0.0), min(${t}(1.0), ${r}(uniforms.alpha) * value + ${r}(uniforms.beta)));`;case"LeakyRelu":return`value = select(${r}(uniforms.alpha) * value, value, value >= ${t}(0.0));`;case"":return"";default:throw new Error(`Unsupported activation ${e.activation}`)}},Ke=(e,t)=>{e.activation==="Clip"?t.push({type:1,data:e.clipMax},{type:1,data:e.clipMin}):e.activation==="HardSigmoid"?t.push({type:1,data:e.alpha},{type:1,data:e.beta}):e.activation==="LeakyRelu"&&t.push({type:1,data:e.alpha})},Ye=(e,t)=>{e.activation==="Clip"?t.push({name:"clip_max",type:"f32"},{name:"clip_min",type:"f32"}):e.activation==="HardSigmoid"?t.push({name:"alpha",type:"f32"},{name:"beta",type:"f32"}):e.activation==="LeakyRelu"&&t.push({name:"alpha",type:"f32"})},Yr=e=>{let t=e?.activation||"";if(t==="HardSigmoid"){let[r,n]=e?.activation_params||[.2,.5];return{activation:t,alpha:r,beta:n}}else if(t==="Clip"){let[r,n]=e?.activation_params||[Wr,Hr];return{activation:t,clipMax:n,clipMin:r}}else if(t==="LeakyRelu"){let[r]=e?.activation_params||[.01];return{activation:t,alpha:r}}return{activation:t}}});var ze,Xr,Zr=U(()=>{"use strict";ze=(e,t)=>{switch(e){case 1:return t;case 2:return`vec2<${t}>`;case 3:return`vec3<${t}>`;case 4:return`vec4<${t}>`;default:throw new Error(`${e}-component is not supported.`)}},Xr=e=>` ${e?"value = value + getBiasByOutputCoords(coords);":""} - `});var Qr,ao=U(()=>{"use strict";Qr=e=>` + `});var Qr,so=U(()=>{"use strict";Qr=e=>` fn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 { return dot(coords, vec4( shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1)); @@ -543,7 +543,7 @@ fn getOutputIndexFromCoords(coords : vec4) -> i32 { return dot(coords, vec4( i32(${e}.x), i32(${e}.y), i32(${e}.z), 1)); } -`});var wm,vm,Qt,Tu,$m,Jt,_m,Jr,er=U(()=>{"use strict";Q();ae();oe();yt();Zr();wm=(e,t)=>e?` +`});var $m,_m,Qt,Tu,xm,Jt,Sm,Jr,er=U(()=>{"use strict";Q();ae();oe();yt();Zr();$m=(e,t)=>e?` mm_Asub[inputRow][inputCol] = mm_readA(batch, kStart + inputRow, globalRowStart / innerElementSize + inputCol${t?", batchIndices":""}); @@ -551,7 +551,7 @@ fn getOutputIndexFromCoords(coords : vec4) -> i32 { mm_Asub[inputRow][inputCol] = mm_readA(batch, globalRow + innerRow, kStart / innerElementSize + inputCol${t?", batchIndices":""}); - `,vm=(e,t)=>e?` + `,_m=(e,t)=>e?` let ACached0 = mm_Asub[k * innerElementSize][localRow]; let ACached1 = mm_Asub[k * innerElementSize + 1][localRow]; let ACached2 = mm_Asub[k * innerElementSize + 2][localRow]; @@ -605,7 +605,7 @@ fn main(@builtin(local_invocation_id) localId : vec3, for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { let inputRow = tileRow + innerRow; let inputCol = tileCol; - ${wm(o,n)} + ${$m(o,n)} } // Load one tile of B into local memory. @@ -624,7 +624,7 @@ fn main(@builtin(local_invocation_id) localId : vec3, let BCached2 = mm_Bsub[k * innerElementSize + 2][tileCol]; ${h===3?"":"let BCached3 = mm_Bsub[k * innerElementSize + 3][tileCol];"} - ${vm(o,h)} + ${_m(o,h)} } workgroupBarrier(); @@ -641,7 +641,7 @@ fn main(@builtin(local_invocation_id) localId : vec3, mm_Asub[inputRow][inputCol] = mm_readA(batch, globalRowStart + inputRow, kStart + inputCol${t?", batchIndices":""}); - `,$m=e=>e?"let ACached = mm_Asub[k][tileRow + innerRow];":"let ACached = mm_Asub[tileRow + innerRow][k];",Jt=(e,t,r="f32",n,o=!1,i=32,a=!1,l=32,d=!1)=>{let p=e[1]*t[1],m=e[0]*t[0],u=o?p:i,h=o?i:p;if(!(h%t[1]===0&&u%t[0]===0&&i%t[1]===0))throw new Error(`tileAHight ${h} must be divisible by workgroupSize[1]${t[1]}, tileAWidth ${u} must be divisible by workgroupSize[0]${t[0]}, tileInner ${i} must be divisible by workgroupSize[1]${t[1]}`);let w=h/t[1],g=u/t[0],b=i/t[1],x=d?` + `,xm=e=>e?"let ACached = mm_Asub[k][tileRow + innerRow];":"let ACached = mm_Asub[tileRow + innerRow][k];",Jt=(e,t,r="f32",n,o=!1,i=32,a=!1,l=32,d=!1)=>{let p=e[1]*t[1],m=e[0]*t[0],u=o?p:i,h=o?i:p;if(!(h%t[1]===0&&u%t[0]===0&&i%t[1]===0))throw new Error(`tileAHight ${h} must be divisible by workgroupSize[1]${t[1]}, tileAWidth ${u} must be divisible by workgroupSize[0]${t[0]}, tileInner ${i} must be divisible by workgroupSize[1]${t[1]}`);let w=h/t[1],g=u/t[0],b=i/t[1],x=d?` let localRow = i32(localId.y); let localCol = i32(localId.x); let globalRowStart = i32(workgroupId.y) * ${p}; @@ -732,7 +732,7 @@ for (var t = 0; t < num_tiles; t = t + 1) { } for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { - ${$m(o)} + ${xm(o)} for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol]; } @@ -767,17 +767,17 @@ fn main(@builtin(local_invocation_id) localId : vec3, var acc : array, rowPerThread>; ${x} } -`},_m=(e,t,r,n,o,i=!1)=>{let[a,l,d]=o,[p,m,u,h]=n,w=Vt(a,d),g=Vt(l,d),b=he(n[0].type.tensor),x=()=>{let S=m.rank,I=p.rank,T=`var aIndices: ${m.type.indices};`;for(let A=S-2-1,z=I-1;A>=0;A--,z--)T+=` -aIndices[${A}] = ${I>1?`batchIndices[${z}]`:"batchIndices"};`;return w.forEach(A=>{T+=` +`},Sm=(e,t,r,n,o,i=!1)=>{let[a,l,d]=o,[p,m,u,h]=n,w=Nt(a,d),g=Nt(l,d),b=he(n[0].type.tensor),x=()=>{let S=m.rank,I=p.rank,T=`var aIndices: ${m.type.indices};`;for(let A=S-2-1,D=I-1;A>=0;A--,D--)T+=` +aIndices[${A}] = ${I>1?`batchIndices[${D}]`:"batchIndices"};`;return w.forEach(A=>{T+=` aIndices[${A}] = 0;`}),T+=` aIndices[${S-2}] = u32(row); - aIndices[${S-1}] = u32(colIn);`,T},_=()=>{let S=u.rank,I=p.rank,T=`var bIndices: ${u.type.indices};`;for(let A=S-2-1,z=I-1;A>=0;A--,z--)T+=` -bIndices[${A}] = ${I>1?`batchIndices[${z}]`:"batchIndices"};`;return g.forEach(A=>{T+=` + aIndices[${S-1}] = u32(colIn);`,T},_=()=>{let S=u.rank,I=p.rank,T=`var bIndices: ${u.type.indices};`;for(let A=S-2-1,D=I-1;A>=0;A--,D--)T+=` +bIndices[${A}] = ${I>1?`batchIndices[${D}]`:"batchIndices"};`;return g.forEach(A=>{T+=` bIndices[${A}] = 0;`}),T+=` bIndices[${S-2}] = u32(row); bIndices[${S-1}] = u32(colIn);`,T};return` - fn mm_readA(batch: i32, row: i32, colIn: i32, batchIndices: ${p.type.indices}) -> ${De(e,b)} { - var value = ${De(e,b)}(0.0); + fn mm_readA(batch: i32, row: i32, colIn: i32, batchIndices: ${p.type.indices}) -> ${ze(e,b)} { + var value = ${ze(e,b)}(0.0); let col = colIn * ${e}; if(row < uniforms.dim_a_outer && col < uniforms.dim_inner) { @@ -787,8 +787,8 @@ bIndices[${S-2}] = u32(row); return value; } - fn mm_readB(batch: i32, row: i32, colIn: i32, batchIndices: ${p.type.indices}) -> ${De(e,b)} { - var value = ${De(e,b)}(0.0); + fn mm_readB(batch: i32, row: i32, colIn: i32, batchIndices: ${p.type.indices}) -> ${ze(e,b)} { + var value = ${ze(e,b)}(0.0); let col = colIn * ${e}; if(row < uniforms.dim_inner && col < uniforms.dim_b_outer) { @@ -798,21 +798,21 @@ bIndices[${S-2}] = u32(row); return value; } - fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${De(e,b)}) { + fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${ze(e,b)}) { let col = colIn * ${e}; if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) { var value = valueIn; let coords = vec3(batch, row, colIn); - ${t?`value = value + ${i?"bias[colIn]":`${De(e,b)}(bias[row])`};`:""} + ${t?`value = value + ${i?"bias[colIn]":`${ze(e,b)}(bias[row])`};`:""} ${r} ${h.setByIndices("vec3(coords)","value")} } } - `},Jr=(e,t,r,n,o=!1)=>{let i=e[0].dims,a=e[1].dims,l=i.slice(0,-2),d=a.slice(0,-2),p=n?n.slice(0,-2):r.slice(0,-2),m=k.size(p),u=i[i.length-2],h=i[i.length-1],w=a[a.length-1],g=h%4===0&&w%4===0,b=u<=8?[4,1,1]:[4,4,1],x=[8,8,1],_=[Math.ceil(w/x[0]/b[0]),Math.ceil(u/x[1]/b[1]),Math.ceil(m/x[2]/b[2])],$=g?4:1,S=[...l,u,h/$],I=S.length,T=[...d,h,w/$],A=T.length,z=[m,u,w/$],D=[{type:6,data:u},{type:6,data:w},{type:6,data:h}];je(t,D),D.push(...V(p,S,T));let H=["rank","rank"],W=e.length>2;W&&(D.push(...V(e[2].dims)),H.push("rank")),D.push(...V(z));let F=de=>{let ce=p.length,X=Gr("batchDims",e[0].dataType,ce,1),xe=he(e[0].dataType),q=E("a",e[0].dataType,I,$),ie=E("b",e[1].dataType,A,$),le=M("result",e[0].dataType,z.length,$),se=[q,ie];if(W){let R=o?$:1;se.push(E("bias",e[2].dataType,e[2].dims.length,R))}let Z=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"}];Ye(t,Z);let re=he(le.type.tensor),J=Ke(t,le.type.value,re),Pe=_m($,W,J,[X,q,ie,le],[l,d,p],o);return` + `},Jr=(e,t,r,n,o=!1)=>{let i=e[0].dims,a=e[1].dims,l=i.slice(0,-2),d=a.slice(0,-2),p=n?n.slice(0,-2):r.slice(0,-2),m=k.size(p),u=i[i.length-2],h=i[i.length-1],w=a[a.length-1],g=h%4===0&&w%4===0,b=u<=8?[4,1,1]:[4,4,1],x=[8,8,1],_=[Math.ceil(w/x[0]/b[0]),Math.ceil(u/x[1]/b[1]),Math.ceil(m/x[2]/b[2])],$=g?4:1,S=[...l,u,h/$],I=S.length,T=[...d,h,w/$],A=T.length,D=[m,u,w/$],z=[{type:6,data:u},{type:6,data:w},{type:6,data:h}];Ke(t,z),z.push(...V(p,S,T));let H=["rank","rank"],W=e.length>2;W&&(z.push(...V(e[2].dims)),H.push("rank")),z.push(...V(D));let F=de=>{let ce=p.length,X=Gr("batchDims",e[0].dataType,ce,1),xe=he(e[0].dataType),q=E("a",e[0].dataType,I,$),ie=E("b",e[1].dataType,A,$),le=M("result",e[0].dataType,D.length,$),se=[q,ie];if(W){let R=o?$:1;se.push(E("bias",e[2].dataType,e[2].dims.length,R))}let Z=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"}];Ye(t,Z);let re=he(le.type.tensor),J=je(t,le.type.value,re),Pe=Sm($,W,J,[X,q,ie,le],[l,d,p],o);return` ${de.registerUniforms(Z).registerInternalVariables(X).declareVariables(...se,le)} ${Pe} ${g?Qt(b,x,xe,X):Jt(b,x,xe,X)} - `};return{name:"MatMul",shaderCache:{hint:`${b};${t.activation};${g};${o}`,inputDependencies:H},getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:_[0],y:_[1],z:_[2]},programUniforms:D}),getShaderSource:F}}});var xm,Au,Eu=U(()=>{"use strict";Q();dt();oe();yt();Zr();ao();er();xm=(e,t,r,n,o=!1,i,a=4,l=4,d=4,p="f32")=>{let m=W=>{switch(W){case 1:return"resData = x[xIndex];";case 3:return`resData = vec3<${p}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;case 4:return"resData = x[xIndex / 4];";default:throw new Error(`innerElementSize ${W} is not supported.`)}},u=W=>{switch(W){case 1:return"return w[row * i32(uniforms.w_shape[3]) + colIn];";case 4:return"return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];";default:throw new Error(`innerElementSize ${W} is not supported.`)}},h=e?` + `};return{name:"MatMul",shaderCache:{hint:`${b};${t.activation};${g};${o}`,inputDependencies:H},getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:_[0],y:_[1],z:_[2]},programUniforms:z}),getShaderSource:F}}});var Im,Au,Eu=U(()=>{"use strict";Q();dt();oe();yt();Zr();so();er();Im=(e,t,r,n,o=!1,i,a=4,l=4,d=4,p="f32")=>{let m=W=>{switch(W){case 1:return"resData = x[xIndex];";case 3:return`resData = vec3<${p}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;case 4:return"resData = x[xIndex / 4];";default:throw new Error(`innerElementSize ${W} is not supported.`)}},u=W=>{switch(W){case 1:return"return w[row * i32(uniforms.w_shape[3]) + colIn];";case 4:return"return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];";default:throw new Error(`innerElementSize ${W} is not supported.`)}},h=e?` let coord = vec4(batch, xRow, xCol, xCh); `:` let coord = vec4(batch, xCh, xRow, xCol); @@ -839,7 +839,7 @@ bIndices[${S-2}] = u32(row); let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0]; let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1]; let xCh = ${_} % inChannels; - var resData = ${De(a,p)}(0.0); + var resData = ${ze(a,p)}(0.0); // The bounds checking is always needed since we use it to pad zero for // the 'same' padding type. if (xRow >= 0 && xRow < ${g} && xCol >= 0 && xCol < ${b}) { @@ -854,19 +854,19 @@ bIndices[${S-2}] = u32(row); if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) { ${$} } - return ${De(a,p)}(0.0);`:n&&r?` + return ${ze(a,p)}(0.0);`:n&&r?` let col = colIn * ${a}; ${$}`:` let col = colIn * ${a}; if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { ${$} } - return ${De(a,p)}(0.0);`,I=`${u(l)}`,T=De(d,p),A=e?De(a,p):De(l,p),z=e?De(l,p):De(a,p),D=Ke(i,T,p);return` + return ${ze(a,p)}(0.0);`,I=`${u(l)}`,T=ze(d,p),A=e?ze(a,p):ze(l,p),D=e?ze(l,p):ze(a,p),z=je(i,T,p);return` fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${A} { ${e?S:I} } - fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${z} { + fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${D} { ${e?I:S} } @@ -878,10 +878,10 @@ bIndices[${S-2}] = u32(row); let outWidth = ${e?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; ${w} ${Xr(o)} - ${D} + ${z} setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); } - }`},Au=(e,t,r,n,o,i,a,l)=>{let d=t.format==="NHWC",p=d?e[0].dims[3]:e[0].dims[1],m=r[0],u=d?r[2]:r[3],h=d?r[1]:r[2],w=d?r[3]:r[1],g=d&&(p%4===0||p%3===0)&&w%4===0,b=d?w:u*h,x=d?u*h:w,_=[8,8,1],$=n<=8?[4,1,1]:[4,4,1],S=[Math.ceil(b/_[0]/$[0]),Math.ceil(x/_[1]/$[1]),Math.ceil(m/_[2]/$[2])];be("verbose",()=>`[conv2d_mm_webgpu] dispatch = ${S}`);let I=g?d&&p%4!==0?3:4:1,T=_[1]*$[1],A=_[0]*$[0],z=Math.max(_[0]*I,_[1]),D=n%T===0,H=o%A===0,W=i%z===0,F=g?[I,4,4]:[1,1,1],de=[{type:6,data:n},{type:6,data:o},{type:6,data:i},{type:6,data:[t.pads[0],t.pads[1]]},{type:6,data:t.strides},{type:6,data:t.dilations}];je(t,de),de.push(...V(e[0].dims,e[1].dims));let ce=["rank","rank"];a&&(de.push(...V(e[2].dims)),ce.push("rank")),de.push(...V(r));let X=xe=>{let q=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"},{name:"pad",type:"i32",length:2},{name:"stride",type:"i32",length:2},{name:"dilation",type:"i32",length:2}];Ye(t,q);let ie=g?4:1,le=he(e[0].dataType),se=` + }`},Au=(e,t,r,n,o,i,a,l)=>{let d=t.format==="NHWC",p=d?e[0].dims[3]:e[0].dims[1],m=r[0],u=d?r[2]:r[3],h=d?r[1]:r[2],w=d?r[3]:r[1],g=d&&(p%4===0||p%3===0)&&w%4===0,b=d?w:u*h,x=d?u*h:w,_=[8,8,1],$=n<=8?[4,1,1]:[4,4,1],S=[Math.ceil(b/_[0]/$[0]),Math.ceil(x/_[1]/$[1]),Math.ceil(m/_[2]/$[2])];be("verbose",()=>`[conv2d_mm_webgpu] dispatch = ${S}`);let I=g?d&&p%4!==0?3:4:1,T=_[1]*$[1],A=_[0]*$[0],D=Math.max(_[0]*I,_[1]),z=n%T===0,H=o%A===0,W=i%D===0,F=g?[I,4,4]:[1,1,1],de=[{type:6,data:n},{type:6,data:o},{type:6,data:i},{type:6,data:[t.pads[0],t.pads[1]]},{type:6,data:t.strides},{type:6,data:t.dilations}];Ke(t,de),de.push(...V(e[0].dims,e[1].dims));let ce=["rank","rank"];a&&(de.push(...V(e[2].dims)),ce.push("rank")),de.push(...V(r));let X=xe=>{let q=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"},{name:"pad",type:"i32",length:2},{name:"stride",type:"i32",length:2},{name:"dilation",type:"i32",length:2}];Ye(t,q);let ie=g?4:1,le=he(e[0].dataType),se=` fn setOutputAtIndex(flatIndex : i32, value : ${g?`vec4<${le}>`:le}) { result[flatIndex] = ${g?`vec4<${le}>`:le}(value); } @@ -898,8 +898,8 @@ bIndices[${S-2}] = u32(row); // dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32 }; ${xe.registerUniforms(q).declareVariables(...J,Pe)} ${se} - ${xm(d,D,H,W,a,t,F[0],F[1],F[2],le)} - ${g?Qt($,_,le,void 0,!d,z):Jt($,_,le,void 0,!d,z,!1,void 0,l)}`};return{name:"Conv2DMatMul",shaderCache:{hint:`${t.cacheKey};${I};${g};${D};${H};${W};${T};${A};${z}`,inputDependencies:ce},getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:S[0],y:S[1],z:S[2]},programUniforms:de}),getShaderSource:X}}});var Sm,ku,en,Im,Pu,Cm,Ou,zu,Du=U(()=>{"use strict";Q();dt();ae();oe();Sm=e=>{let t=1;for(let r=0;rtypeof e=="number"?[e,e,e]:e,en=(e,t)=>t<=1?e:e+(e-1)*(t-1),Im=(e,t,r,n=1)=>{let o=en(t,n);return Math.floor((e[0]*(r-1)-r+o)/2)},Pu=(e,t,r,n,o)=>{o==null&&(o=Im(e,t[0],n[0]));let i=[0,0,0,r];for(let a=0;a<3;a++)e[a]+2*o>=t[a]&&(i[a]=Math.trunc((e[a]-t[a]+2*o)/n[a]+1));return i},Cm=(e,t,r,n,o,i,a,l,d,p)=>{let m,u,h,w;if(e==="VALID"&&(e=0),typeof e=="number"){m={top:e,bottom:e,left:e,right:e,front:e,back:e};let g=Pu([t,r,n,1],[l,d,p],1,[o,i,a],e);u=g[0],h=g[1],w=g[2]}else if(Array.isArray(e)){if(!e.every((b,x,_)=>b===_[0]))throw Error(`Unsupported padding parameter: ${e}`);m={top:e[0],bottom:e[1],left:e[2],right:e[3],front:e[4],back:e[5]};let g=Pu([t,r,n,1],[l,d,p],1,[o,i,a],e[0]);u=g[0],h=g[1],w=g[2]}else if(e==="SAME_UPPER"){u=Math.ceil(t/o),h=Math.ceil(r/i),w=Math.ceil(n/a);let g=(u-1)*o+l-t,b=(h-1)*i+d-r,x=(w-1)*a+p-n,_=Math.floor(g/2),$=g-_,S=Math.floor(b/2),I=b-S,T=Math.floor(x/2),A=x-T;m={top:S,bottom:I,left:T,right:A,front:_,back:$}}else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:m,outDepth:u,outHeight:h,outWidth:w}},Ou=(e,t,r,n,o,i=!1,a="channelsLast")=>{let l,d,p,m,u;if(a==="channelsLast")[l,d,p,m,u]=e;else if(a==="channelsFirst")[l,u,d,p,m]=e;else throw new Error(`Unknown dataFormat ${a}`);let[h,,w,g,b]=t,[x,_,$]=ku(r),[S,I,T]=ku(n),A=en(w,S),z=en(g,I),D=en(b,T),{padInfo:H,outDepth:W,outHeight:F,outWidth:de}=Cm(o,d,p,m,x,_,$,A,z,D),ce=i?h*u:h,X=[0,0,0,0,0];return a==="channelsFirst"?X=[l,ce,W,F,de]:a==="channelsLast"&&(X=[l,W,F,de,ce]),{batchSize:l,dataFormat:a,inDepth:d,inHeight:p,inWidth:m,inChannels:u,outDepth:W,outHeight:F,outWidth:de,outChannels:ce,padInfo:H,strideDepth:x,strideHeight:_,strideWidth:$,filterDepth:w,filterHeight:g,filterWidth:b,effectiveFilterDepth:A,effectiveFilterHeight:z,effectiveFilterWidth:D,dilationDepth:S,dilationHeight:I,dilationWidth:T,inShape:e,outShape:X,filterShape:t}},zu=(e,t,r,n,o,i)=>{let a=i==="channelsLast",l=a?e[0].dims[3]:e[0].dims[1],d=!1,p=[64,1,1],m={x:r.map(($,S)=>S)},u=[Math.ceil(Sm(m.x.map($=>r[$]))/p[0]),1,1];be("verbose",()=>`[conv3d_naive_webgpu] dispatch = ${u}`);let h=d?a&&l%4!==0?3:4:1,w=k.size(r),g=[{type:12,data:w},{type:12,data:n},{type:12,data:o},{type:12,data:t.strides},{type:12,data:t.dilations}];g.push(...V(e[0].dims,e[1].dims));let b=["rank","rank"],x=e.length===3;x&&(g.push(...V(e[2].dims)),b.push("rank")),g.push(...V(r));let _=$=>{let S=[{name:"output_size",type:"u32"},{name:"filter_dims",type:"u32",length:n.length},{name:"pads",type:"u32",length:o.length},{name:"strides",type:"u32",length:t.strides.length},{name:"dilations",type:"u32",length:t.dilations.length}],I=d?4:1,T=he(e[0].dataType),A=E("x",e[0].dataType,e[0].dims.length,h===3?1:h),z=E("W",e[1].dataType,e[1].dims.length,I),D=[A,z],H=M("result",e[0].dataType,r.length,I),W="";if(x){let F=E("bias",e[2].dataType,e[2].dims.length,I);D.push(F),W+=` + ${Im(d,z,H,W,a,t,F[0],F[1],F[2],le)} + ${g?Qt($,_,le,void 0,!d,D):Jt($,_,le,void 0,!d,D,!1,void 0,l)}`};return{name:"Conv2DMatMul",shaderCache:{hint:`${t.cacheKey};${I};${g};${z};${H};${W};${T};${A};${D}`,inputDependencies:ce},getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:S[0],y:S[1],z:S[2]},programUniforms:de}),getShaderSource:X}}});var Cm,ku,en,Tm,Pu,Am,Ou,Du,zu=U(()=>{"use strict";Q();dt();ae();oe();Cm=e=>{let t=1;for(let r=0;rtypeof e=="number"?[e,e,e]:e,en=(e,t)=>t<=1?e:e+(e-1)*(t-1),Tm=(e,t,r,n=1)=>{let o=en(t,n);return Math.floor((e[0]*(r-1)-r+o)/2)},Pu=(e,t,r,n,o)=>{o==null&&(o=Tm(e,t[0],n[0]));let i=[0,0,0,r];for(let a=0;a<3;a++)e[a]+2*o>=t[a]&&(i[a]=Math.trunc((e[a]-t[a]+2*o)/n[a]+1));return i},Am=(e,t,r,n,o,i,a,l,d,p)=>{let m,u,h,w;if(e==="VALID"&&(e=0),typeof e=="number"){m={top:e,bottom:e,left:e,right:e,front:e,back:e};let g=Pu([t,r,n,1],[l,d,p],1,[o,i,a],e);u=g[0],h=g[1],w=g[2]}else if(Array.isArray(e)){if(!e.every((b,x,_)=>b===_[0]))throw Error(`Unsupported padding parameter: ${e}`);m={top:e[0],bottom:e[1],left:e[2],right:e[3],front:e[4],back:e[5]};let g=Pu([t,r,n,1],[l,d,p],1,[o,i,a],e[0]);u=g[0],h=g[1],w=g[2]}else if(e==="SAME_UPPER"){u=Math.ceil(t/o),h=Math.ceil(r/i),w=Math.ceil(n/a);let g=(u-1)*o+l-t,b=(h-1)*i+d-r,x=(w-1)*a+p-n,_=Math.floor(g/2),$=g-_,S=Math.floor(b/2),I=b-S,T=Math.floor(x/2),A=x-T;m={top:S,bottom:I,left:T,right:A,front:_,back:$}}else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:m,outDepth:u,outHeight:h,outWidth:w}},Ou=(e,t,r,n,o,i=!1,a="channelsLast")=>{let l,d,p,m,u;if(a==="channelsLast")[l,d,p,m,u]=e;else if(a==="channelsFirst")[l,u,d,p,m]=e;else throw new Error(`Unknown dataFormat ${a}`);let[h,,w,g,b]=t,[x,_,$]=ku(r),[S,I,T]=ku(n),A=en(w,S),D=en(g,I),z=en(b,T),{padInfo:H,outDepth:W,outHeight:F,outWidth:de}=Am(o,d,p,m,x,_,$,A,D,z),ce=i?h*u:h,X=[0,0,0,0,0];return a==="channelsFirst"?X=[l,ce,W,F,de]:a==="channelsLast"&&(X=[l,W,F,de,ce]),{batchSize:l,dataFormat:a,inDepth:d,inHeight:p,inWidth:m,inChannels:u,outDepth:W,outHeight:F,outWidth:de,outChannels:ce,padInfo:H,strideDepth:x,strideHeight:_,strideWidth:$,filterDepth:w,filterHeight:g,filterWidth:b,effectiveFilterDepth:A,effectiveFilterHeight:D,effectiveFilterWidth:z,dilationDepth:S,dilationHeight:I,dilationWidth:T,inShape:e,outShape:X,filterShape:t}},Du=(e,t,r,n,o,i)=>{let a=i==="channelsLast",l=a?e[0].dims[3]:e[0].dims[1],d=!1,p=[64,1,1],m={x:r.map(($,S)=>S)},u=[Math.ceil(Cm(m.x.map($=>r[$]))/p[0]),1,1];be("verbose",()=>`[conv3d_naive_webgpu] dispatch = ${u}`);let h=d?a&&l%4!==0?3:4:1,w=k.size(r),g=[{type:12,data:w},{type:12,data:n},{type:12,data:o},{type:12,data:t.strides},{type:12,data:t.dilations}];g.push(...V(e[0].dims,e[1].dims));let b=["rank","rank"],x=e.length===3;x&&(g.push(...V(e[2].dims)),b.push("rank")),g.push(...V(r));let _=$=>{let S=[{name:"output_size",type:"u32"},{name:"filter_dims",type:"u32",length:n.length},{name:"pads",type:"u32",length:o.length},{name:"strides",type:"u32",length:t.strides.length},{name:"dilations",type:"u32",length:t.dilations.length}],I=d?4:1,T=he(e[0].dataType),A=E("x",e[0].dataType,e[0].dims.length,h===3?1:h),D=E("W",e[1].dataType,e[1].dims.length,I),z=[A,D],H=M("result",e[0].dataType,r.length,I),W="";if(x){let F=E("bias",e[2].dataType,e[2].dims.length,I);z.push(F),W+=` fn getBiasByOutputCoords(coords : array) -> ${d?`vec4<${T}>`:T} { return bias[${a?G("coords",4,5):G("coords",1,5)}${d?"/ 4":""}]; }`}return` @@ -910,9 +910,9 @@ bIndices[${S-2}] = u32(row); } fn getW(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { let aIndices = array(d0, d1, d2, d3, d4); - return ${z.getByIndices("aIndices")}; + return ${D.getByIndices("aIndices")}; } - ${$.registerUniforms(S).declareVariables(...D,H)} + ${$.registerUniforms(S).declareVariables(...z,H)} ${$.mainStart()} ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} let coords = ${H.offsetToIndices("global_idx")}; @@ -1006,7 +1006,7 @@ bIndices[${S-2}] = u32(row); } ${x?"dotProd = dotProd + getBiasByOutputCoords(coords)":""}; result[global_idx] = f32(dotProd); - }`};return{name:"Conv3DNaive",shaderCache:{hint:`${t.cacheKey};${a};${h};${x}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:u[0],y:u[1],z:u[2]},programUniforms:g}),getShaderSource:_}}});var so,Bu,Ru=U(()=>{"use strict";Q();ae();oe();uo();yt();so=(e,t,r)=>{let n=e.length>2,o=n?"value += b[output_channel];":"",i=e[0].dims,a=e[1].dims,l=a[0]/t.group,d=t.format==="NHWC",p=tn(i,a,t.dilations,t.pads,t.strides,d),m=k.size(p),u=[{type:12,data:m},{type:12,data:t.dilations},{type:12,data:[t.strides[0],t.strides[1]]},{type:12,data:[t.pads[0],t.pads[1]]},{type:12,data:l}];je(t,u),u.push(...V(i,a));let h=["rank","rank"];n&&(u.push(...V(e[2].dims)),h.push("rank")),u.push(...V(p));let w=g=>{let b=M("output",e[0].dataType,p.length),x=he(b.type.tensor),_=Ke(t,b.type.value,x),$=E("x",e[0].dataType,i.length),S=E("w",e[1].dataType,a.length),I=[$,S];n&&I.push(E("b",e[2].dataType,e[2].dims.length));let T=[{name:"output_size",type:"u32"},{name:"dilations",type:"u32",length:t.dilations.length},{name:"strides",type:"u32",length:2},{name:"pads",type:"u32",length:2},{name:"output_channels_per_group",type:"u32"}];return Ye(t,T),` + }`};return{name:"Conv3DNaive",shaderCache:{hint:`${t.cacheKey};${a};${h};${x}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:u[0],y:u[1],z:u[2]},programUniforms:g}),getShaderSource:_}}});var uo,Bu,Ru=U(()=>{"use strict";Q();ae();oe();lo();yt();uo=(e,t,r)=>{let n=e.length>2,o=n?"value += b[output_channel];":"",i=e[0].dims,a=e[1].dims,l=a[0]/t.group,d=t.format==="NHWC",p=tn(i,a,t.dilations,t.pads,t.strides,d),m=k.size(p),u=[{type:12,data:m},{type:12,data:t.dilations},{type:12,data:[t.strides[0],t.strides[1]]},{type:12,data:[t.pads[0],t.pads[1]]},{type:12,data:l}];Ke(t,u),u.push(...V(i,a));let h=["rank","rank"];n&&(u.push(...V(e[2].dims)),h.push("rank")),u.push(...V(p));let w=g=>{let b=M("output",e[0].dataType,p.length),x=he(b.type.tensor),_=je(t,b.type.value,x),$=E("x",e[0].dataType,i.length),S=E("w",e[1].dataType,a.length),I=[$,S];n&&I.push(E("b",e[2].dataType,e[2].dims.length));let T=[{name:"output_size",type:"u32"},{name:"dilations",type:"u32",length:t.dilations.length},{name:"strides",type:"u32",length:2},{name:"pads",type:"u32",length:2},{name:"output_channels_per_group",type:"u32"}];return Ye(t,T),` ${g.registerUniforms(T).declareVariables(...I,b)} ${g.mainStart()} @@ -1043,7 +1043,7 @@ bIndices[${S-2}] = u32(row); ${o} ${_} ${b.setByOffset("global_idx","value")} - }`};return{name:"GroupedConv",shaderCache:{hint:t.cacheKey,inputDependencies:h},getRunData:()=>({outputs:[{dims:r?r(p):p,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(m/64)},programUniforms:u}),getShaderSource:w}},Bu=(e,t,r)=>{let n=e.length>2,o=we(r[3]),i=we(r[2]),a=k.size(r)/o/i,l=[e[0].dims[0],e[0].dims[1],e[0].dims[2],e[0].dims[3]/o],d=[e[1].dims[0],e[1].dims[1],e[1].dims[2],e[1].dims[3]/o],p=[r[0],r[1],r[2],r[3]/o],m=[{type:12,data:a},{type:6,data:[t.strides[0],t.strides[1]]},{type:6,data:[t.pads[0],t.pads[1]]}];je(t,m),m.push(...V(l,d,p));let u=(i-1)*t.strides[1]+d[1],h=w=>{let g=M("output",e[0].dataType,p.length,o),b=he(g.type.tensor),x=Ke(t,g.type.value,b),_=E("x",e[0].dataType,l.length,o),$=E("w",e[1].dataType,d.length,o),S=[_,$];n&&S.push(E("b",e[2].dataType,e[2].dims,o));let I=n?"value += b[output_channel];":"",T=[{name:"output_size",type:"u32"},{name:"strides",type:"i32",length:2},{name:"pads",type:"i32",length:2}];return Ye(t,T),` + }`};return{name:"GroupedConv",shaderCache:{hint:t.cacheKey,inputDependencies:h},getRunData:()=>({outputs:[{dims:r?r(p):p,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(m/64)},programUniforms:u}),getShaderSource:w}},Bu=(e,t,r)=>{let n=e.length>2,o=we(r[3]),i=we(r[2]),a=k.size(r)/o/i,l=[e[0].dims[0],e[0].dims[1],e[0].dims[2],e[0].dims[3]/o],d=[e[1].dims[0],e[1].dims[1],e[1].dims[2],e[1].dims[3]/o],p=[r[0],r[1],r[2],r[3]/o],m=[{type:12,data:a},{type:6,data:[t.strides[0],t.strides[1]]},{type:6,data:[t.pads[0],t.pads[1]]}];Ke(t,m),m.push(...V(l,d,p));let u=(i-1)*t.strides[1]+d[1],h=w=>{let g=M("output",e[0].dataType,p.length,o),b=he(g.type.tensor),x=je(t,g.type.value,b),_=E("x",e[0].dataType,l.length,o),$=E("w",e[1].dataType,d.length,o),S=[_,$];n&&S.push(E("b",e[2].dataType,e[2].dims,o));let I=n?"value += b[output_channel];":"",T=[{name:"output_size",type:"u32"},{name:"strides",type:"i32",length:2},{name:"pads",type:"i32",length:2}];return Ye(t,T),` ${w.registerUniforms(T).declareVariables(...S,g)} ${w.mainStart()} ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} @@ -1088,14 +1088,14 @@ bIndices[${S-2}] = u32(row); ${x} ${g.set("batch","row","col + i","output_channel","value")}; } - }`};return{name:"GroupedConv-Vectorize",shaderCache:{hint:`${t.cacheKey};${o};${i};${u};${d[0]};${d[1]}`,inputDependencies:n?["rank","rank","type"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:m}),getShaderSource:h}}});var lo,Tm,Mu,co=U(()=>{"use strict";Q();ae();er();oe();yt();lo=(e,t,r,n,o=!1)=>{let i=e[0].dims,a=e[1].dims,l=i[i.length-2],d=a[a.length-1],p=i[i.length-1],m=we(d),u=we(p),h=we(l),w=k.size(r)/m/h,g=e.length>2,b=n?n.slice(0,-2):r.slice(0,-2),_=[k.size(b),l,d],$=[{type:12,data:w},{type:12,data:l},{type:12,data:d},{type:12,data:p}];je(t,$),$.push(...V(b,i,a)),g&&$.push(...V(e[2].dims)),$.push(...V(_));let S=I=>{let T=Gr("batch_dims",e[0].dataType,b.length),A=E("a",e[0].dataType,i.length,u),z=E("b",e[1].dataType,a.length,m),D=M("output",e[0].dataType,_.length,m),H=he(D.type.tensor),W=Ke(t,D.type.value,H),F=[A,z],de="";if(g){let Z=o?m:1;F.push(E("bias",e[2].dataType,e[2].dims.length,Z)),de=`${o?`value += bias[col / ${Z}];`:`value += ${D.type.value}(bias[row + i]);`}`}let ce=i.slice(0,-2),X=a.slice(0,-2),xe=Vt(ce,b),q=Vt(X,b),ie=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"}];Ye(t,ie);let le=(Z,re)=>{let J=Z.rank,Pe=Z.name;if(J===2)return`var ${Pe}_indices = ${Z.type.indices}(0u, 0u);`;let R=T.rank,Y=`var ${Pe}_indices: ${Z.type.indices};`;for(let ue=J-2-1,Te=R-1;ue>=0;ue--,Te--)Y+=` + }`};return{name:"GroupedConv-Vectorize",shaderCache:{hint:`${t.cacheKey};${o};${i};${u};${d[0]};${d[1]}`,inputDependencies:n?["rank","rank","type"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:m}),getShaderSource:h}}});var co,Em,Mu,po=U(()=>{"use strict";Q();ae();er();oe();yt();co=(e,t,r,n,o=!1)=>{let i=e[0].dims,a=e[1].dims,l=i[i.length-2],d=a[a.length-1],p=i[i.length-1],m=we(d),u=we(p),h=we(l),w=k.size(r)/m/h,g=e.length>2,b=n?n.slice(0,-2):r.slice(0,-2),_=[k.size(b),l,d],$=[{type:12,data:w},{type:12,data:l},{type:12,data:d},{type:12,data:p}];Ke(t,$),$.push(...V(b,i,a)),g&&$.push(...V(e[2].dims)),$.push(...V(_));let S=I=>{let T=Gr("batch_dims",e[0].dataType,b.length),A=E("a",e[0].dataType,i.length,u),D=E("b",e[1].dataType,a.length,m),z=M("output",e[0].dataType,_.length,m),H=he(z.type.tensor),W=je(t,z.type.value,H),F=[A,D],de="";if(g){let Z=o?m:1;F.push(E("bias",e[2].dataType,e[2].dims.length,Z)),de=`${o?`value += bias[col / ${Z}];`:`value += ${z.type.value}(bias[row + i]);`}`}let ce=i.slice(0,-2),X=a.slice(0,-2),xe=Nt(ce,b),q=Nt(X,b),ie=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"}];Ye(t,ie);let le=(Z,re)=>{let J=Z.rank,Pe=Z.name;if(J===2)return`var ${Pe}_indices = ${Z.type.indices}(0u, 0u);`;let R=T.rank,Y=`var ${Pe}_indices: ${Z.type.indices};`;for(let ue=J-2-1,Te=R-1;ue>=0;ue--,Te--)Y+=` ${Pe}_indices[${ue}] = ${R>1?`batch_indices[${Te}]`:"batch_indices"};`;return re.forEach(ue=>{Y+=` ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; ${Pe}_indices[${J-1}] = 0u;`,Y},se=()=>{let Z=`var a_data: ${A.type.value};`;for(let re=0;re; + ${le(D,q)} + let b_offset = ${D.indicesToOffset("b_indices")}; + var values: array<${z.type.value}, ${h}>; for (var k: u32 = 0u; k < uniforms.K; k = k + ${u}) { ${se()} } @@ -1117,12 +1117,12 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; var value = values[i]; ${de} ${W} - let cur_indices = ${D.type.indices}(batch, row + i, col); - let offset = ${D.indicesToOffset("cur_indices")}; - ${D.setByOffset(`offset / ${m}`,"value")}; + let cur_indices = ${z.type.indices}(batch, row + i, col); + let offset = ${z.indicesToOffset("cur_indices")}; + ${z.setByOffset(`offset / ${m}`,"value")}; } } - `};return{name:"MatMulNaive",shaderCache:{hint:`${t.activation};${m};${u};${h};${o}`,inputDependencies:g?["rank","rank","rank"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(w/64)},programUniforms:$}),getShaderSource:S}},Tm=e=>{if(!e||e.length!==2)throw new Error("MatMul requires 2 inputs.");if(e[0].dims[e[0].dims.length-1]!==e[1].dims[e[1].dims.length-2])throw new Error("shared dimension does not match.")},Mu=e=>{Tm(e.inputs);let t=tt.calcShape(e.inputs[0].dims,e.inputs[1].dims,!0);if(!t)throw new Error("Can't use matmul on the given tensors");let r=t[t.length-1],n=e.inputs[0].dims[e.inputs[0].dims.length-1];r<8&&n<8?e.compute(lo(e.inputs,{activation:""},t)):e.compute(Jr(e.inputs,{activation:""},t))}});var tn,po,Am,mo,fo,Em,km,Pm,ho,uo=U(()=>{"use strict";ae();Eu();Du();er();Ru();yt();co();Et();tn=(e,t,r,n,o,i)=>{let a=e[0],l=e.slice(i?1:2,i?3:4),d=l.length,p=t[0],u=t.slice(2).map((g,b)=>g+(g-1)*(r[b]-1)),w=l.map((g,b)=>g+n[b]+n[b+d]).map((g,b)=>Math.floor((g-u[b]+o[b])/o[b]));return w.splice(0,0,a),w.splice(i?3:1,0,p),w},po=[2,3,1,0],Am=(e,t)=>{if(!e||e.length!==2&&e.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(e[0].dims.length>5)throw new Error("greater than 5D is not supported");if(e[0].dims.length!==e[1].dims.length)throw new Error("filter does not have same dimension as input");let r=e[0].dims[t.format==="NHWC"?e[0].dims.length-1:1],n=e[1].dims[1]*t.group;if(r!==n)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if(e.length===3&&(e[2].dims.length!==1||e[1].dims[0]!==e[2].dims[0]))throw new Error("invalid bias");let o=e[0].dims.length-2;if(t.dilations.length!==o)throw new Error(`dilations should be ${o}D`);if(t.strides.length!==o)throw new Error(`strides should be ${o}D`);if(t.pads.length!==o*2)throw new Error(`pads should be ${o*2}D`);if(t.kernelShape.length!==0&&t.kernelShape.length!==e[1].dims.length-2)throw new Error("invalid kernel shape")},mo=(e,t)=>{let r=e.kernelShape.slice();for(let i=2;i{let t=Yr(e),r=e.format,n=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][e.auto_pad],o=e.dilations,i=e.group,a=e.kernel_shape,l=e.pads,d=e.strides,p=e.w_is_const();return{autoPad:n,format:r,dilations:o,group:i,kernelShape:a,pads:l,strides:d,wIsConst:p,...t,cacheKey:`${e.format};${t.activation};`}},Em=(e,t,r)=>{let n=mo(r,t),o=r.format==="NHWC";if(r.group!==1){if(!e.adapterInfo.isArchitecture("ampere")&&o&&t[1].dims[0]===r.group&&t[1].dims[1]===1&&r.dilations[0]===1&&r.dilations[1]===1){let z=tn(t[0].dims,t[1].dims,r.dilations,n.pads,r.strides,o),D=e.kernelCustomData.wT??e.compute(Ue(t[1],po),{inputs:[1],outputs:[r.wIsConst?-2:-1]})[0];r.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=D);let H=[t[0],D];t.length===3&&H.push(t[2]),e.compute(Bu(H,n,z),{inputs:H})}else e.compute(so(t,n));return}let i=t.length===3,a=t[0].dims[o?1:2],l=t[0].dims[o?2:3],d=t[0].dims[o?3:1],p=t[1].dims[2],m=t[1].dims[3],u=tn(t[0].dims,t[1].dims,r.dilations,n.pads,r.strides,o),h=u[o?1:2],w=u[o?2:3],g=u[o?3:1],b=o&&p===a&&m===l&&r.pads[0]===0&&r.pads[1]===0;if(b||p===1&&m===1&&r.dilations[0]===1&&r.dilations[1]===1&&r.strides[0]===1&&r.strides[1]===1&&r.pads[0]===0&&r.pads[1]===0){let A=u[0],z,D,H,W=[];if(o){let ce=e.kernelCustomData.wT??e.compute(Ue(t[1],po),{inputs:[1],outputs:[r.wIsConst?-2:-1]})[0];if(r.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=ce),b){let X=a*l*d;z=t[0].reshape([1,A,X]),D=ce.reshape([1,X,g]),H=[1,A,g]}else z=t[0].reshape([A,a*l,d]),D=ce.reshape([1,d,g]),H=[A,h*w,g];W.push(z),W.push(D)}else z=t[0].reshape([A,d,a*l]),D=t[1].reshape([1,g,d]),H=[A,g,h*w],W.push(D),W.push(z);i&&W.push(t[2]);let F=H[2],de=W[0].dims[W[0].dims.length-1];F<8&&de<8?e.compute(lo(W,n,u,H,o),{inputs:W}):e.compute(Jr(W,n,u,H,o),{inputs:W});return}let x=!0,_=e.kernelCustomData.wT??e.compute(Ue(t[1],po),{inputs:[1],outputs:[r.wIsConst?-2:-1]})[0];r.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=_);let $=[t[0],_];i&&$.push(t[2]);let S=o?h*w:g,I=o?g:h*w,T=p*m*d;e.compute(Au($,n,u,S,I,T,i,x),{inputs:$})},km=(e,t)=>{let r=t.format==="NHWC",n=[e.inputs[0].reshape(r?[e.inputs[0].dims[0],1,e.inputs[0].dims[1],e.inputs[0].dims[2]]:[e.inputs[0].dims[0],e.inputs[0].dims[1],1,e.inputs[0].dims[2]]),e.inputs[1].reshape([e.inputs[1].dims[0],e.inputs[1].dims[1],1,e.inputs[1].dims[2]])];e.inputs.length===3&&n.push(e.inputs[2]);let o=[0,t.pads[0],0,t.pads[1]],i=[1].concat(t.strides),a=[1].concat(t.dilations),l=[1].concat(t.kernelShape),d=mo({...t,pads:o,strides:i,dilations:a,kernelShape:l},n);e.compute(so(n,d,p=>r?[p[0],p[2],p[3]]:[]))},Pm=(e,t,r)=>{let n=r.format==="NHWC"?"channelsLast":"channelsFirst",o=mo(r,t),i=r.autoPad==="NOTSET"?r.pads:r.autoPad,a=Ou(t[0].dims,t[1].dims,r.strides,r.dilations,i,!1,n);e.compute(zu(t,o,a.outShape,[a.filterDepth,a.filterHeight,a.filterWidth],[a.padInfo.front,a.padInfo.top,a.padInfo.left],n))},ho=(e,t)=>{Am(e.inputs,t),e.inputs[0].dims.length===3?km(e,t):e.inputs[0].dims.length===5?Pm(e,e.inputs,t):Em(e,e.inputs,t)}});var Om,Uu,Vu=U(()=>{"use strict";Q();dt();oe();yt();Zr();ao();er();Om=(e,t=!1,r,n,o=4)=>{let i=_=>{switch(_){case 1:return"return w[getIndexFromCoords4D(coord, vec4(uniforms.w_shape))];";case 4:return` + `};return{name:"MatMulNaive",shaderCache:{hint:`${t.activation};${m};${u};${h};${o}`,inputDependencies:g?["rank","rank","rank"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(w/64)},programUniforms:$}),getShaderSource:S}},Em=e=>{if(!e||e.length!==2)throw new Error("MatMul requires 2 inputs.");if(e[0].dims[e[0].dims.length-1]!==e[1].dims[e[1].dims.length-2])throw new Error("shared dimension does not match.")},Mu=e=>{Em(e.inputs);let t=tt.calcShape(e.inputs[0].dims,e.inputs[1].dims,!0);if(!t)throw new Error("Can't use matmul on the given tensors");let r=t[t.length-1],n=e.inputs[0].dims[e.inputs[0].dims.length-1];r<8&&n<8?e.compute(co(e.inputs,{activation:""},t)):e.compute(Jr(e.inputs,{activation:""},t))}});var tn,mo,km,fo,ho,Pm,Om,Dm,go,lo=U(()=>{"use strict";ae();Eu();zu();er();Ru();yt();po();Et();tn=(e,t,r,n,o,i)=>{let a=e[0],l=e.slice(i?1:2,i?3:4),d=l.length,p=t[0],u=t.slice(2).map((g,b)=>g+(g-1)*(r[b]-1)),w=l.map((g,b)=>g+n[b]+n[b+d]).map((g,b)=>Math.floor((g-u[b]+o[b])/o[b]));return w.splice(0,0,a),w.splice(i?3:1,0,p),w},mo=[2,3,1,0],km=(e,t)=>{if(!e||e.length!==2&&e.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(e[0].dims.length>5)throw new Error("greater than 5D is not supported");if(e[0].dims.length!==e[1].dims.length)throw new Error("filter does not have same dimension as input");let r=e[0].dims[t.format==="NHWC"?e[0].dims.length-1:1],n=e[1].dims[1]*t.group;if(r!==n)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if(e.length===3&&(e[2].dims.length!==1||e[1].dims[0]!==e[2].dims[0]))throw new Error("invalid bias");let o=e[0].dims.length-2;if(t.dilations.length!==o)throw new Error(`dilations should be ${o}D`);if(t.strides.length!==o)throw new Error(`strides should be ${o}D`);if(t.pads.length!==o*2)throw new Error(`pads should be ${o*2}D`);if(t.kernelShape.length!==0&&t.kernelShape.length!==e[1].dims.length-2)throw new Error("invalid kernel shape")},fo=(e,t)=>{let r=e.kernelShape.slice();for(let i=2;i{let t=Yr(e),r=e.format,n=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][e.auto_pad],o=e.dilations,i=e.group,a=e.kernel_shape,l=e.pads,d=e.strides,p=e.w_is_const();return{autoPad:n,format:r,dilations:o,group:i,kernelShape:a,pads:l,strides:d,wIsConst:p,...t,cacheKey:`${e.format};${t.activation};`}},Pm=(e,t,r)=>{let n=fo(r,t),o=r.format==="NHWC";if(r.group!==1){if(!e.adapterInfo.isArchitecture("ampere")&&o&&t[1].dims[0]===r.group&&t[1].dims[1]===1&&r.dilations[0]===1&&r.dilations[1]===1){let D=tn(t[0].dims,t[1].dims,r.dilations,n.pads,r.strides,o),z=e.kernelCustomData.wT??e.compute(Ue(t[1],mo),{inputs:[1],outputs:[r.wIsConst?-2:-1]})[0];r.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=z);let H=[t[0],z];t.length===3&&H.push(t[2]),e.compute(Bu(H,n,D),{inputs:H})}else e.compute(uo(t,n));return}let i=t.length===3,a=t[0].dims[o?1:2],l=t[0].dims[o?2:3],d=t[0].dims[o?3:1],p=t[1].dims[2],m=t[1].dims[3],u=tn(t[0].dims,t[1].dims,r.dilations,n.pads,r.strides,o),h=u[o?1:2],w=u[o?2:3],g=u[o?3:1],b=o&&p===a&&m===l&&r.pads[0]===0&&r.pads[1]===0;if(b||p===1&&m===1&&r.dilations[0]===1&&r.dilations[1]===1&&r.strides[0]===1&&r.strides[1]===1&&r.pads[0]===0&&r.pads[1]===0){let A=u[0],D,z,H,W=[];if(o){let ce=e.kernelCustomData.wT??e.compute(Ue(t[1],mo),{inputs:[1],outputs:[r.wIsConst?-2:-1]})[0];if(r.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=ce),b){let X=a*l*d;D=t[0].reshape([1,A,X]),z=ce.reshape([1,X,g]),H=[1,A,g]}else D=t[0].reshape([A,a*l,d]),z=ce.reshape([1,d,g]),H=[A,h*w,g];W.push(D),W.push(z)}else D=t[0].reshape([A,d,a*l]),z=t[1].reshape([1,g,d]),H=[A,g,h*w],W.push(z),W.push(D);i&&W.push(t[2]);let F=H[2],de=W[0].dims[W[0].dims.length-1];F<8&&de<8?e.compute(co(W,n,u,H,o),{inputs:W}):e.compute(Jr(W,n,u,H,o),{inputs:W});return}let x=!0,_=e.kernelCustomData.wT??e.compute(Ue(t[1],mo),{inputs:[1],outputs:[r.wIsConst?-2:-1]})[0];r.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=_);let $=[t[0],_];i&&$.push(t[2]);let S=o?h*w:g,I=o?g:h*w,T=p*m*d;e.compute(Au($,n,u,S,I,T,i,x),{inputs:$})},Om=(e,t)=>{let r=t.format==="NHWC",n=[e.inputs[0].reshape(r?[e.inputs[0].dims[0],1,e.inputs[0].dims[1],e.inputs[0].dims[2]]:[e.inputs[0].dims[0],e.inputs[0].dims[1],1,e.inputs[0].dims[2]]),e.inputs[1].reshape([e.inputs[1].dims[0],e.inputs[1].dims[1],1,e.inputs[1].dims[2]])];e.inputs.length===3&&n.push(e.inputs[2]);let o=[0,t.pads[0],0,t.pads[1]],i=[1].concat(t.strides),a=[1].concat(t.dilations),l=[1].concat(t.kernelShape),d=fo({...t,pads:o,strides:i,dilations:a,kernelShape:l},n);e.compute(uo(n,d,p=>r?[p[0],p[2],p[3]]:[]))},Dm=(e,t,r)=>{let n=r.format==="NHWC"?"channelsLast":"channelsFirst",o=fo(r,t),i=r.autoPad==="NOTSET"?r.pads:r.autoPad,a=Ou(t[0].dims,t[1].dims,r.strides,r.dilations,i,!1,n);e.compute(Du(t,o,a.outShape,[a.filterDepth,a.filterHeight,a.filterWidth],[a.padInfo.front,a.padInfo.top,a.padInfo.left],n))},go=(e,t)=>{km(e.inputs,t),e.inputs[0].dims.length===3?Om(e,t):e.inputs[0].dims.length===5?Dm(e,e.inputs,t):Pm(e,e.inputs,t)}});var zm,Uu,Vu=U(()=>{"use strict";Q();dt();oe();yt();Zr();so();er();zm=(e,t=!1,r,n,o=4)=>{let i=_=>{switch(_){case 1:return"return w[getIndexFromCoords4D(coord, vec4(uniforms.w_shape))];";case 4:return` let coord1 = vec4(coordX, coordY, col + 1, rowInner); let coord2 = vec4(coordX, coordY, col + 2, rowInner); let coord3 = vec4(coordX, coordY, col + 3, rowInner); @@ -1188,7 +1188,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; ${i(o)} } return ${n}(0.0); - `,b=Ke(r,n);return` + `,b=je(r,n);return` fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${n} { ${e?w:g} } @@ -1207,15 +1207,15 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; ${b} result[getIndexFromCoords4D(coords, vec4(uniforms.result_shape))/${o}] = value; } - }`},Uu=(e,t,r,n,o,i,a,l)=>{let d=t.format==="NHWC",p=d?e[0].dims[3]:e[0].dims[1],m=r[0],u=d?r[2]:r[3],h=d?r[1]:r[2],w=d?r[3]:r[1],g=d&&p%4===0&&p%3&&w%4===0,b=d?w:u*h,x=d?u*h:w,_=[8,8,1],$=n<=8?[4,1,1]:[4,4,1],S=[Math.ceil(b/_[0]/$[0]),Math.ceil(x/_[1]/$[1]),Math.ceil(m/_[2]/$[2])];be("verbose",()=>`[conv_backprop_mm_webgpu] dispatch = ${S}`);let I=g?4:1,T=Math.max(_[0]*I,_[1]),A=g?4:1,z=[t.kernelShape[d?1:2],t.kernelShape[d?2:3]],D=[z[0]+(t.dilations[0]<=1?0:(z[0]-1)*(t.dilations[0]-1)),z[1]+(t.dilations[1]<=1?0:(z[1]-1)*(t.dilations[1]-1))],H=[D[0]-1-Math.floor((t.pads[0]+t.pads[2])/2),D[1]-1-Math.floor((t.pads[1]+t.pads[3])/2)],W=[{type:6,data:n},{type:6,data:o},{type:6,data:i},{type:6,data:t.strides},{type:6,data:t.dilations},{type:6,data:z},{type:6,data:H}];je(t,W),W.push(...V(e[0].dims,e[1].dims));let F=["rank","rank"];a&&(W.push(...V(e[2].dims)),F.push("rank")),W.push(...V(r));let de=ce=>{let X=E("x",e[0].dataType,e[0].dims.length,A),xe=E("w",e[1].dataType,e[1].dims.length,1),q=M("result",e[0].dataType,r.length,A),ie=[X,xe],le="";if(a){let re=E("bias",e[2].dataType,e[2].dims.length,A);ie.push(re),le+=` + }`},Uu=(e,t,r,n,o,i,a,l)=>{let d=t.format==="NHWC",p=d?e[0].dims[3]:e[0].dims[1],m=r[0],u=d?r[2]:r[3],h=d?r[1]:r[2],w=d?r[3]:r[1],g=d&&p%4===0&&p%3&&w%4===0,b=d?w:u*h,x=d?u*h:w,_=[8,8,1],$=n<=8?[4,1,1]:[4,4,1],S=[Math.ceil(b/_[0]/$[0]),Math.ceil(x/_[1]/$[1]),Math.ceil(m/_[2]/$[2])];be("verbose",()=>`[conv_backprop_mm_webgpu] dispatch = ${S}`);let I=g?4:1,T=Math.max(_[0]*I,_[1]),A=g?4:1,D=[t.kernelShape[d?1:2],t.kernelShape[d?2:3]],z=[D[0]+(t.dilations[0]<=1?0:(D[0]-1)*(t.dilations[0]-1)),D[1]+(t.dilations[1]<=1?0:(D[1]-1)*(t.dilations[1]-1))],H=[z[0]-1-Math.floor((t.pads[0]+t.pads[2])/2),z[1]-1-Math.floor((t.pads[1]+t.pads[3])/2)],W=[{type:6,data:n},{type:6,data:o},{type:6,data:i},{type:6,data:t.strides},{type:6,data:t.dilations},{type:6,data:D},{type:6,data:H}];Ke(t,W),W.push(...V(e[0].dims,e[1].dims));let F=["rank","rank"];a&&(W.push(...V(e[2].dims)),F.push("rank")),W.push(...V(r));let de=ce=>{let X=E("x",e[0].dataType,e[0].dims.length,A),xe=E("w",e[1].dataType,e[1].dims.length,1),q=M("result",e[0].dataType,r.length,A),ie=[X,xe],le="";if(a){let re=E("bias",e[2].dataType,e[2].dims.length,A);ie.push(re),le+=` fn getBiasByOutputCoords(coords : vec4) -> ${re.type.value} { return bias[coords.${d?"w":"y"}${g?"/ 4":""}]; - }`}let se=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"},{name:"strides",type:"i32",length:2},{name:"dilations",type:"i32",length:2},{name:"filter_dims",type:"i32",length:z.length},{name:"pads",type:"i32",length:H.length}];Ye(t,se);let Z=he(e[0].dataType,1);if(Z!=="f16"&&Z!=="f32")throw new Error(`elemType ${Z} is not supported.`);return` + }`}let se=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"},{name:"strides",type:"i32",length:2},{name:"dilations",type:"i32",length:2},{name:"filter_dims",type:"i32",length:D.length},{name:"pads",type:"i32",length:H.length}];Ye(t,se);let Z=he(e[0].dataType,1);if(Z!=="f16"&&Z!=="f32")throw new Error(`elemType ${Z} is not supported.`);return` ${Qr("uniforms.result_strides")} ${ce.registerUniforms(se).declareVariables(...ie,q)}; ${le} - ${Om(d,a,t,X.type.value,I)} - ${g?Qt($,_,Z,void 0,!d,T):Jt($,_,Z,void 0,!d,T,!1,void 0,l)}`};return{name:"Conv2DTransposeMatMul",shaderCache:{hint:`${t.cacheKey};${$};${_};${g}`,inputDependencies:F},getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:S[0],y:S[1],z:S[2]},programUniforms:W}),getShaderSource:de}}});var zm,go,Nu=U(()=>{"use strict";Q();dt();ae();oe();zm=(e,t,r,n,o,i=!1,a,l,d=!1)=>{let p=d?1:2,m=d?2:3,u=d?3:1,h=i?2:1,w=` + ${zm(d,a,t,X.type.value,I)} + ${g?Qt($,_,Z,void 0,!d,T):Jt($,_,Z,void 0,!d,T,!1,void 0,l)}`};return{name:"Conv2DTransposeMatMul",shaderCache:{hint:`${t.cacheKey};${$};${_};${g}`,inputDependencies:F},getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:S[0],y:S[1],z:S[2]},programUniforms:W}),getShaderSource:de}}});var Bm,yo,Nu=U(()=>{"use strict";Q();dt();ae();oe();Bm=(e,t,r,n,o,i=!1,a,l,d=!1)=>{let p=d?1:2,m=d?2:3,u=d?3:1,h=i?2:1,w=` fn setOutputAtIndex(flatIndex : u32, value : ${i?`vec4<${a}>`:a}) { result[flatIndex] = ${i?`vec4<${a}>`:a}(value); }`;n&&(w+=` @@ -1378,7 +1378,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; ${e.mainStart()} ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")}; - ${i?S:I}}`},go=(e,t,r)=>{let n=e.length>2,o=t.outputShape,i=k.size(o),a=[Math.ceil(i/64),1,1];be("verbose",()=>`[conv2d_backprop_webgpu] dispatch = ${a}`);let l=t.format==="NHWC",d=["rank","rank"],p=[t.strides[0],t.strides[1]],m=[t.kernelShape[l?1:2],t.kernelShape[l?2:3]],u=[t.dilations[0],t.dilations[1]],h=[m[0]+(t.dilations[0]<=1?0:(t.kernelShape[l?1:2]-1)*(t.dilations[0]-1)),m[1]+(t.dilations[1]<=1?0:(t.kernelShape[l?2:3]-1)*(t.dilations[1]-1))],w=[h[0]-1-Math.floor((t.pads[0]+t.pads[2])/2),h[1]-1-Math.floor(t.pads[1]+t.pads[3])/2],g=!1,b=t.group,x=e[1].dims,_=x[0]/b,$=x[1],S=[{type:12,data:i},{type:12,data:p},{type:12,data:m},{type:12,data:u},{type:12,data:h},{type:6,data:w},{type:12,data:_},{type:12,data:$},...V(e[0].dims,e[1].dims)];n&&(S.push(...V(e[2].dims)),d.push("rank")),S.push(...V(o));let I=a[1]===1&&a[2]===1,T=A=>{let z=[{name:"output_size",type:"u32"},{name:"strides",type:"u32",length:p.length},{name:"filter_dims",type:"u32",length:m.length},{name:"dilations",type:"u32",length:m.length},{name:"effective_filter_dims",type:"u32",length:h.length},{name:"pads",type:"i32",length:w.length},{name:"input_channels_per_group",type:"u32"},{name:"output_channels_per_group",type:"u32"}],D=he(e[0].dataType);return`${zm(A,e,o,n,I,g,D,z,l)}`};return{name:"ConvTranspose2D",shaderCache:{hint:`${t.cacheKey};`,inputDependencies:d},getRunData:()=>({dispatchGroup:{x:a[0],y:a[1],z:a[2]},outputs:[{dims:r?r(o):o,dataType:e[0].dataType}],programUniforms:S}),getShaderSource:T}}});var Dm,Bm,Rm,Wu,Hu,Mm,Um,Vm,Nm,Gu,Lu=U(()=>{"use strict";Vu();Nu();yt();Et();Dm=(e,t,r,n,o,i)=>(e-1)*t+r+(n-1)*o+1-i,Bm=(e,t,r,n,o)=>{let i=Math.floor(e/2);t==="SAME_UPPER"?(r[n]=i,r[o]=e-i):t==="SAME_LOWER"&&(r[n]=e-i,r[o]=i)},Rm=(e,t,r,n,o,i,a,l,d,p)=>{let m=e.length-2,u=p.length===0;if(d.length===0)for(let g=0;g{let r=e.kernelShape.slice();if(e.kernelShape.length===0||e.kernelShape.reduce((u,h)=>u*h,1)===0){r.length=0;for(let u=2;uu+h,0)===0){let u=t[0].dims.length-2;d=new Array(u).fill(1)}let p=e.strides.slice();if(p.reduce((u,h)=>u+h,0)===0){let u=t[0].dims.length-2;p=new Array(u).fill(1)}Rm(l,r,d,e.autoPad,e.group,o,p,n,a,i);let m=Object.assign({},e);return Object.assign(m,{kernelShape:r,pads:o,outputPadding:a,outputShape:i,dilations:d,strides:p}),m},Hu=e=>{let t=Yr(e),r=e.format,n=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][typeof e.autoPad>"u"?0:e.autoPad],o=e.dilations,i=e.group,a=e.kernelShape,l=e.pads,d=e.strides,p=e.wIsConst(),m=e.outputPadding,u=e.outputShape;return{autoPad:n,format:r,dilations:o,group:i,kernelShape:a,outputPadding:m,outputShape:u,pads:l,strides:d,wIsConst:p,...t,cacheKey:`${e.format};${t.activation};`}},Mm=(e,t)=>{if(!e||e.length!==2&&e.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(e[0].dims.length!==4&&e[0].dims.length!==3)throw new Error("currently only support 2-dimensional conv");if(e[0].dims.length!==e[1].dims.length)throw new Error("filter does not have same dimension as input");let r=e[0].dims[t.format==="NHWC"?e[0].dims.length-1:1],n=e[1].dims[0];if(r!==n)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let o=e[1].dims[1]*t.group;if(e.length===3&&(e[2].dims.length!==1||e[2].dims[0]!==o))throw new Error("invalid bias");let i=e[0].dims.length-2;if(t.dilations.reduce((m,u)=>m+u,0)>0&&t.dilations.length!==i)throw new Error(`dilations should be ${i}D`);if(t.strides.reduce((m,u)=>m+u,0)>0&&t.strides.length!==i)throw new Error(`strides should be ${i}D`);if(t.pads.reduce((m,u)=>m+u,0)>0&&t.pads.length!==i*2)throw new Error(`pads should be ${i*2}D`);if(t.outputPadding.length!==i&&t.outputPadding.length!==0)throw new Error(`output_padding should be ${i}D`);if(t.kernelShape.reduce((m,u)=>m+u,0)>0&&t.kernelShape.length!==0&&t.kernelShape.length!==e[1].dims.length-2)throw new Error("invalid kernel shape");if(t.outputShape.length!==0&&t.outputShape.length!==e[0].dims.length-2)throw new Error("invalid output shape")},Um=[2,3,1,0],Vm=(e,t,r)=>{let n=Wu(r,t),o=r.format==="NHWC",i=n.outputShape,a=i[o?3:1],l=t[0].dims[o?3:1];if(n.group!==1||a===1&&l===1){e.compute(go(t,n));return}let d=i[o?1:2],p=i[o?2:3],m=t[1].dims[2],u=t[1].dims[3],h=o?d*p:a,w=o?a:d*p,g=m*u*l,b=!0,x=e.kernelCustomData.wT??e.compute(Ue(t[1],Um),{inputs:[1],outputs:[r.wIsConst?-2:-1]})[0];r.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=x);let _=[t[0],x],$=t.length===3;$&&(!o&&t[2].dims.length===1?_.push(t[2].reshape([t[2].dims[0],1,1])):_.push(t[2])),e.compute(Uu(_,n,i,h,w,g,$,b),{inputs:_})},Nm=(e,t)=>{let r=t.format==="NHWC",n=[e.inputs[0].reshape(r?[e.inputs[0].dims[0],1,e.inputs[0].dims[1],e.inputs[0].dims[2]]:[e.inputs[0].dims[0],e.inputs[0].dims[1],1,e.inputs[0].dims[2]]),e.inputs[1].reshape([e.inputs[1].dims[0],e.inputs[1].dims[1],1,e.inputs[1].dims[2]])];e.inputs.length===3&&n.push(e.inputs[2]);let o=t.kernelShape;(o.length===0||o[0]===0)&&(o=[e.inputs[1].dims[2]]);let i=t.dilations;(i.length===0||i[0]===0)&&(i=[1]);let a=t.strides;(a.length===0||a[0]===0)&&(a=[1]);let l=t.pads;l.length===0&&(l=[0,0]),l=[0,l[0],0,l[1]],a=[1].concat(a),i=[1].concat(i),o=[1].concat(o);let d=Wu({...t,pads:l,strides:a,dilations:i,kernelShape:o},n);e.compute(go(n,d,p=>r?[p[0],p[2],p[3]]:[p[0],p[1],p[3]]))},Gu=(e,t)=>{Mm(e.inputs,t),e.inputs[0].dims.length===3?Nm(e,t):Vm(e,e.inputs,t)}});var Wm,Fu,qu,Ku=U(()=>{"use strict";Q();ae();Ce();oe();Wm=(e,t,r,n)=>{let o=k.size(t),i=t.length,a=E("input",e,i),l=M("output",e,i),d=r.dataType===6?r.getInt32Array()[0]:Number(r.getBigInt64Array()[0]),p=k.normalizeAxis(d,i),m=u=>{let h=` i32(${a.indicesGet("inputIndices","uniforms.axis")}) `,w=G("uniforms.input_shape","uniforms.axis",i),g=n.reverse?h+(n.exclusive?" + 1":""):"0",b=n.reverse?w:h+(n.exclusive?"":" + 1");return` + ${i?S:I}}`},yo=(e,t,r)=>{let n=e.length>2,o=t.outputShape,i=k.size(o),a=[Math.ceil(i/64),1,1];be("verbose",()=>`[conv2d_backprop_webgpu] dispatch = ${a}`);let l=t.format==="NHWC",d=["rank","rank"],p=[t.strides[0],t.strides[1]],m=[t.kernelShape[l?1:2],t.kernelShape[l?2:3]],u=[t.dilations[0],t.dilations[1]],h=[m[0]+(t.dilations[0]<=1?0:(t.kernelShape[l?1:2]-1)*(t.dilations[0]-1)),m[1]+(t.dilations[1]<=1?0:(t.kernelShape[l?2:3]-1)*(t.dilations[1]-1))],w=[h[0]-1-Math.floor((t.pads[0]+t.pads[2])/2),h[1]-1-Math.floor(t.pads[1]+t.pads[3])/2],g=!1,b=t.group,x=e[1].dims,_=x[0]/b,$=x[1],S=[{type:12,data:i},{type:12,data:p},{type:12,data:m},{type:12,data:u},{type:12,data:h},{type:6,data:w},{type:12,data:_},{type:12,data:$},...V(e[0].dims,e[1].dims)];n&&(S.push(...V(e[2].dims)),d.push("rank")),S.push(...V(o));let I=a[1]===1&&a[2]===1,T=A=>{let D=[{name:"output_size",type:"u32"},{name:"strides",type:"u32",length:p.length},{name:"filter_dims",type:"u32",length:m.length},{name:"dilations",type:"u32",length:m.length},{name:"effective_filter_dims",type:"u32",length:h.length},{name:"pads",type:"i32",length:w.length},{name:"input_channels_per_group",type:"u32"},{name:"output_channels_per_group",type:"u32"}],z=he(e[0].dataType);return`${Bm(A,e,o,n,I,g,z,D,l)}`};return{name:"ConvTranspose2D",shaderCache:{hint:`${t.cacheKey};`,inputDependencies:d},getRunData:()=>({dispatchGroup:{x:a[0],y:a[1],z:a[2]},outputs:[{dims:r?r(o):o,dataType:e[0].dataType}],programUniforms:S}),getShaderSource:T}}});var Rm,Mm,Um,Wu,Hu,Vm,Nm,Wm,Hm,Gu,Lu=U(()=>{"use strict";Vu();Nu();yt();Et();Rm=(e,t,r,n,o,i)=>(e-1)*t+r+(n-1)*o+1-i,Mm=(e,t,r,n,o)=>{let i=Math.floor(e/2);t==="SAME_UPPER"?(r[n]=i,r[o]=e-i):t==="SAME_LOWER"&&(r[n]=e-i,r[o]=i)},Um=(e,t,r,n,o,i,a,l,d,p)=>{let m=e.length-2,u=p.length===0;if(d.length===0)for(let g=0;g{let r=e.kernelShape.slice();if(e.kernelShape.length===0||e.kernelShape.reduce((u,h)=>u*h,1)===0){r.length=0;for(let u=2;uu+h,0)===0){let u=t[0].dims.length-2;d=new Array(u).fill(1)}let p=e.strides.slice();if(p.reduce((u,h)=>u+h,0)===0){let u=t[0].dims.length-2;p=new Array(u).fill(1)}Um(l,r,d,e.autoPad,e.group,o,p,n,a,i);let m=Object.assign({},e);return Object.assign(m,{kernelShape:r,pads:o,outputPadding:a,outputShape:i,dilations:d,strides:p}),m},Hu=e=>{let t=Yr(e),r=e.format,n=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][typeof e.autoPad>"u"?0:e.autoPad],o=e.dilations,i=e.group,a=e.kernelShape,l=e.pads,d=e.strides,p=e.wIsConst(),m=e.outputPadding,u=e.outputShape;return{autoPad:n,format:r,dilations:o,group:i,kernelShape:a,outputPadding:m,outputShape:u,pads:l,strides:d,wIsConst:p,...t,cacheKey:`${e.format};${t.activation};`}},Vm=(e,t)=>{if(!e||e.length!==2&&e.length!==3)throw new Error("Conv requires 2 or 3 inputs");if(e[0].dims.length!==4&&e[0].dims.length!==3)throw new Error("currently only support 2-dimensional conv");if(e[0].dims.length!==e[1].dims.length)throw new Error("filter does not have same dimension as input");let r=e[0].dims[t.format==="NHWC"?e[0].dims.length-1:1],n=e[1].dims[0];if(r!==n)throw new Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let o=e[1].dims[1]*t.group;if(e.length===3&&(e[2].dims.length!==1||e[2].dims[0]!==o))throw new Error("invalid bias");let i=e[0].dims.length-2;if(t.dilations.reduce((m,u)=>m+u,0)>0&&t.dilations.length!==i)throw new Error(`dilations should be ${i}D`);if(t.strides.reduce((m,u)=>m+u,0)>0&&t.strides.length!==i)throw new Error(`strides should be ${i}D`);if(t.pads.reduce((m,u)=>m+u,0)>0&&t.pads.length!==i*2)throw new Error(`pads should be ${i*2}D`);if(t.outputPadding.length!==i&&t.outputPadding.length!==0)throw new Error(`output_padding should be ${i}D`);if(t.kernelShape.reduce((m,u)=>m+u,0)>0&&t.kernelShape.length!==0&&t.kernelShape.length!==e[1].dims.length-2)throw new Error("invalid kernel shape");if(t.outputShape.length!==0&&t.outputShape.length!==e[0].dims.length-2)throw new Error("invalid output shape")},Nm=[2,3,1,0],Wm=(e,t,r)=>{let n=Wu(r,t),o=r.format==="NHWC",i=n.outputShape,a=i[o?3:1],l=t[0].dims[o?3:1];if(n.group!==1||a===1&&l===1){e.compute(yo(t,n));return}let d=i[o?1:2],p=i[o?2:3],m=t[1].dims[2],u=t[1].dims[3],h=o?d*p:a,w=o?a:d*p,g=m*u*l,b=!0,x=e.kernelCustomData.wT??e.compute(Ue(t[1],Nm),{inputs:[1],outputs:[r.wIsConst?-2:-1]})[0];r.wIsConst&&!e.kernelCustomData.wT&&(e.kernelCustomData.wT=x);let _=[t[0],x],$=t.length===3;$&&(!o&&t[2].dims.length===1?_.push(t[2].reshape([t[2].dims[0],1,1])):_.push(t[2])),e.compute(Uu(_,n,i,h,w,g,$,b),{inputs:_})},Hm=(e,t)=>{let r=t.format==="NHWC",n=[e.inputs[0].reshape(r?[e.inputs[0].dims[0],1,e.inputs[0].dims[1],e.inputs[0].dims[2]]:[e.inputs[0].dims[0],e.inputs[0].dims[1],1,e.inputs[0].dims[2]]),e.inputs[1].reshape([e.inputs[1].dims[0],e.inputs[1].dims[1],1,e.inputs[1].dims[2]])];e.inputs.length===3&&n.push(e.inputs[2]);let o=t.kernelShape;(o.length===0||o[0]===0)&&(o=[e.inputs[1].dims[2]]);let i=t.dilations;(i.length===0||i[0]===0)&&(i=[1]);let a=t.strides;(a.length===0||a[0]===0)&&(a=[1]);let l=t.pads;l.length===0&&(l=[0,0]),l=[0,l[0],0,l[1]],a=[1].concat(a),i=[1].concat(i),o=[1].concat(o);let d=Wu({...t,pads:l,strides:a,dilations:i,kernelShape:o},n);e.compute(yo(n,d,p=>r?[p[0],p[2],p[3]]:[p[0],p[1],p[3]]))},Gu=(e,t)=>{Vm(e.inputs,t),e.inputs[0].dims.length===3?Hm(e,t):Wm(e,e.inputs,t)}});var Gm,Fu,qu,ju=U(()=>{"use strict";Q();ae();Ce();oe();Gm=(e,t,r,n)=>{let o=k.size(t),i=t.length,a=E("input",e,i),l=M("output",e,i),d=r.dataType===6?r.getInt32Array()[0]:Number(r.getBigInt64Array()[0]),p=k.normalizeAxis(d,i),m=u=>{let h=` i32(${a.indicesGet("inputIndices","uniforms.axis")}) `,w=G("uniforms.input_shape","uniforms.axis",i),g=n.reverse?h+(n.exclusive?" + 1":""):"0",b=n.reverse?w:h+(n.exclusive?"":" + 1");return` ${u.registerUniform("outputSize","u32").registerUniform("axis","u32").declareVariables(a,l)} ${u.mainStart()} ${u.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} @@ -1391,12 +1391,12 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; sum = sum + ${a.getByIndices("inputIndices")}; } ${l.setByOffset("global_idx","sum")}; - }`};return{name:"CumSum",shaderCache:{hint:n.cacheKey,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:t,dataType:e}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:[{type:12,data:o},{type:12,data:p},...V(t,t)]}),getShaderSource:m}},Fu=(e,t)=>{let r=e.inputs[0].dims,n=e.inputs[0].dataType,o=e.inputs[1];e.compute(Wm(n,r,o,t),{inputs:[0]})},qu=e=>{let t=e.exclusive===1,r=e.reverse===1;return te({exclusive:t,reverse:r})}});var Hm,Gm,Lm,ju,Yu,Xu=U(()=>{"use strict";Q();ae();Ce();oe();Hm=e=>{if(!e||e.length!==1)throw new Error("DepthToSpace requires 1 input.");if(e[0].dims.length!==4)throw new Error("DepthToSpace requires 4D input.")},Gm=(e,t,r,n)=>{let o=[];o.push(`fn perm(i: ${n.type.indices}) -> ${r.type.indices} { + }`};return{name:"CumSum",shaderCache:{hint:n.cacheKey,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:t,dataType:e}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:[{type:12,data:o},{type:12,data:p},...V(t,t)]}),getShaderSource:m}},Fu=(e,t)=>{let r=e.inputs[0].dims,n=e.inputs[0].dataType,o=e.inputs[1];e.compute(Gm(n,r,o,t),{inputs:[0]})},qu=e=>{let t=e.exclusive===1,r=e.reverse===1;return te({exclusive:t,reverse:r})}});var Lm,Fm,qm,Ku,Yu,Xu=U(()=>{"use strict";Q();ae();Ce();oe();Lm=e=>{if(!e||e.length!==1)throw new Error("DepthToSpace requires 1 input.");if(e[0].dims.length!==4)throw new Error("DepthToSpace requires 4D input.")},Fm=(e,t,r,n)=>{let o=[];o.push(`fn perm(i: ${n.type.indices}) -> ${r.type.indices} { var a: ${r.type.indices};`);for(let i=0;i{let r,n,o,i,a,l,d=t.format==="NHWC",p=t.blocksize,m=t.mode==="DCR";d?([r,n,o,i]=e.dims,a=m?[r,n,o,p,p,i/p**2]:[r,n,o,i/p**2,p,p],l=m?[0,1,3,2,4,5]:[0,1,4,2,5,3]):([r,n,o,i]=[e.dims[0],e.dims[2],e.dims[3],e.dims[1]],a=m?[r,p,p,i/p**2,n,o]:[r,i/p**2,p,p,n,o],l=m?[0,3,4,1,5,2]:[0,1,4,2,5,3]);let u=e.reshape(a),h=u.dims.length,w=e.dataType,g=E("a",w,h),b=M("output",w,h),x=_=>` +`)},qm=(e,t)=>{let r,n,o,i,a,l,d=t.format==="NHWC",p=t.blocksize,m=t.mode==="DCR";d?([r,n,o,i]=e.dims,a=m?[r,n,o,p,p,i/p**2]:[r,n,o,i/p**2,p,p],l=m?[0,1,3,2,4,5]:[0,1,4,2,5,3]):([r,n,o,i]=[e.dims[0],e.dims[2],e.dims[3],e.dims[1]],a=m?[r,p,p,i/p**2,n,o]:[r,i/p**2,p,p,n,o],l=m?[0,3,4,1,5,2]:[0,1,4,2,5,3]);let u=e.reshape(a),h=u.dims.length,w=e.dataType,g=E("a",w,h),b=M("output",w,h),x=_=>` ${_.registerUniform("output_size","u32").declareVariables(g,b)} - ${Gm(l,h,g,b)} + ${Fm(l,h,g,b)} ${_.mainStart()} ${_.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} @@ -1405,7 +1405,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; let aIndices = perm(indices); ${b.setByOffset("global_idx",g.getByIndices("aIndices"))} - }`;return{name:"DepthToSpace",shaderCache:{hint:`${e.dims};${t.blocksize};${t.mode}`,inputDependencies:["rank"]},getRunData:_=>{let $=d?[r,n*p,o*p,i/p**2]:[r,i/p**2,n*p,o*p],S=k.size($),I=u.dims,T=k.sortBasedOnPerm(I,l);return{outputs:[{dims:$,dataType:_[0].dataType}],dispatchGroup:{x:Math.ceil(S/64)},programUniforms:[{type:12,data:S},...V(I,T)]}},getShaderSource:x}},ju=(e,t)=>{Hm(e.inputs),e.compute(Lm(e.inputs[0],t))},Yu=e=>te({blocksize:e.blocksize,mode:e.mode,format:e.format})});var yo,rn,Zu,Fm,qm,bo,wo,Qu,Km,Ju,ed,td=U(()=>{"use strict";Q();ae();Ce();oe();yo="[a-zA-Z]|\\.\\.\\.",rn="("+yo+")+",Zu="^"+rn+"$",Fm="("+rn+",)*"+rn,qm="^"+Fm+"$",bo=class{constructor(t=-1){this.symbolToIndices=new Map,this.inputIndex=t}addSymbol(t,r){let n=this.symbolToIndices.get(t);n===void 0?n=[r]:n.push(r),this.symbolToIndices.set(t,n)}},wo=class{constructor(t,r){this.equation=r;this.hasEllipsis=!1,this.symbolToInfo=new Map,this.lhs=new Array,this.outputDims=[];let[n,o]=r.includes("->")?r.split("->",2):[r,""];if(!n.match(RegExp(qm)))throw new Error("Invalid LHS term");if(n.split(",").forEach((l,d)=>{let p=t[d].dims.slice();if(!l.match(RegExp(Zu)))throw new Error("Invalid LHS term");let m=this.processTerm(l,!0,p,d);this.lhs.push(m)}),o==="")o+=[...this.symbolToInfo.entries()].filter(([l,d])=>d.count===1||l==="...").map(([l])=>l).join("");else if(!o.match(RegExp(rn)))throw new Error("Invalid RHS");o.match(RegExp(yo,"g"))?.forEach(l=>{if(l==="...")this.outputDims=this.outputDims.concat(this.ellipsisDims);else{let d=this.symbolToInfo.get(l);if(d===void 0)throw new Error("Invalid RHS symbol");this.outputDims.push(d.dimValue)}}),this.rhs=this.processTerm(o,!1,this.outputDims)}addSymbol(t,r,n){let o=this.symbolToInfo.get(t);if(o!==void 0){if(o.dimValue!==r&&o.count!==1)throw new Error("Dimension mismatch");o.count++,o.inputIndices.push(n)}else o={count:1,dimValue:r,inputIndices:[n]};this.symbolToInfo.set(t,o)}processTerm(t,r,n,o=-1){let i=n.length,a=!1,l=[],d=0;if(!t.match(RegExp(Zu))&&!r&&t!=="")throw new Error("Invalid LHS term");let p=t.match(RegExp(yo,"g")),m=new bo(o);return p?.forEach((u,h)=>{if(u==="..."){if(a)throw new Error("Only one ellipsis is allowed per input term");a=!0;let w=i-p.length+1;if(w<0)throw new Error("Ellipsis out of bounds");if(l=n.slice(d,d+w),this.hasEllipsis){if(this.ellipsisDims.length!==l.length||this.ellipsisDims.toString()!==l.toString())throw new Error("Ellipsis dimensions mismatch")}else if(r)this.hasEllipsis=!0,this.ellipsisDims=l;else throw new Error("Ellipsis must be specified in the LHS");for(let g=0;ge+"_max",Km=(e,t,r,n)=>{let i=e.map(m=>m.length).map((m,u)=>E(`input${u}`,t,m)),a=k.size(n),l=M("output",t,n.length),d=[...r.symbolToInfo.keys()].filter(m=>!r.rhs.symbolToIndices.has(m)),p=m=>{let u=[],h="var prod = 1.0;",w="var sum = 0.0;",g="sum += prod;",b=[],x=[],_=[],$=[],S=r.symbolToInfo.size===r.rhs.symbolToIndices.size;r.symbolToInfo.forEach((T,A)=>{if(r.rhs.symbolToIndices.has(A)){let z=r.rhs.symbolToIndices.get(A)?.[0];z!==void 0&&r.lhs.forEach((D,H)=>{if(T.inputIndices.includes(H)){let W=D.symbolToIndices.get(A);if(W===void 0)throw new Error("Invalid symbol error");W.forEach(F=>{u.push(`${i[H].indicesSet(`input${H}Indices`,F,l.indicesGet("outputIndices",z))}`)})}})}else r.lhs.forEach((z,D)=>{if(T.inputIndices.includes(D)){let H=z.symbolToIndices.get(A);if(H===void 0)throw new Error("Invalid symbol error");H.forEach(W=>{b.push(`${i[D].indicesSet(`input${D}Indices`,W,`${A}`)}`)}),$.push(`prod *= ${i[D].getByIndices(`input${D}Indices`)};`)}}),x.push(`for(var ${A}: u32 = 0; ${A} < uniforms.${Qu(A)}; ${A}++) {`),_.push("}")});let I=S?[...u,`let sum = ${i.map((T,A)=>T.getByIndices(`input${A}Indices`)).join(" * ")};`]:[...u,w,...x,...b,h,...$,g,..._];return` + }`;return{name:"DepthToSpace",shaderCache:{hint:`${e.dims};${t.blocksize};${t.mode}`,inputDependencies:["rank"]},getRunData:_=>{let $=d?[r,n*p,o*p,i/p**2]:[r,i/p**2,n*p,o*p],S=k.size($),I=u.dims,T=k.sortBasedOnPerm(I,l);return{outputs:[{dims:$,dataType:_[0].dataType}],dispatchGroup:{x:Math.ceil(S/64)},programUniforms:[{type:12,data:S},...V(I,T)]}},getShaderSource:x}},Ku=(e,t)=>{Lm(e.inputs),e.compute(qm(e.inputs[0],t))},Yu=e=>te({blocksize:e.blocksize,mode:e.mode,format:e.format})});var bo,rn,Zu,jm,Km,wo,vo,Qu,Ym,Ju,ed,td=U(()=>{"use strict";Q();ae();Ce();oe();bo="[a-zA-Z]|\\.\\.\\.",rn="("+bo+")+",Zu="^"+rn+"$",jm="("+rn+",)*"+rn,Km="^"+jm+"$",wo=class{constructor(t=-1){this.symbolToIndices=new Map,this.inputIndex=t}addSymbol(t,r){let n=this.symbolToIndices.get(t);n===void 0?n=[r]:n.push(r),this.symbolToIndices.set(t,n)}},vo=class{constructor(t,r){this.equation=r;this.hasEllipsis=!1,this.symbolToInfo=new Map,this.lhs=new Array,this.outputDims=[];let[n,o]=r.includes("->")?r.split("->",2):[r,""];if(!n.match(RegExp(Km)))throw new Error("Invalid LHS term");if(n.split(",").forEach((l,d)=>{let p=t[d].dims.slice();if(!l.match(RegExp(Zu)))throw new Error("Invalid LHS term");let m=this.processTerm(l,!0,p,d);this.lhs.push(m)}),o==="")o+=[...this.symbolToInfo.entries()].filter(([l,d])=>d.count===1||l==="...").map(([l])=>l).join("");else if(!o.match(RegExp(rn)))throw new Error("Invalid RHS");o.match(RegExp(bo,"g"))?.forEach(l=>{if(l==="...")this.outputDims=this.outputDims.concat(this.ellipsisDims);else{let d=this.symbolToInfo.get(l);if(d===void 0)throw new Error("Invalid RHS symbol");this.outputDims.push(d.dimValue)}}),this.rhs=this.processTerm(o,!1,this.outputDims)}addSymbol(t,r,n){let o=this.symbolToInfo.get(t);if(o!==void 0){if(o.dimValue!==r&&o.count!==1)throw new Error("Dimension mismatch");o.count++,o.inputIndices.push(n)}else o={count:1,dimValue:r,inputIndices:[n]};this.symbolToInfo.set(t,o)}processTerm(t,r,n,o=-1){let i=n.length,a=!1,l=[],d=0;if(!t.match(RegExp(Zu))&&!r&&t!=="")throw new Error("Invalid LHS term");let p=t.match(RegExp(bo,"g")),m=new wo(o);return p?.forEach((u,h)=>{if(u==="..."){if(a)throw new Error("Only one ellipsis is allowed per input term");a=!0;let w=i-p.length+1;if(w<0)throw new Error("Ellipsis out of bounds");if(l=n.slice(d,d+w),this.hasEllipsis){if(this.ellipsisDims.length!==l.length||this.ellipsisDims.toString()!==l.toString())throw new Error("Ellipsis dimensions mismatch")}else if(r)this.hasEllipsis=!0,this.ellipsisDims=l;else throw new Error("Ellipsis must be specified in the LHS");for(let g=0;ge+"_max",Ym=(e,t,r,n)=>{let i=e.map(m=>m.length).map((m,u)=>E(`input${u}`,t,m)),a=k.size(n),l=M("output",t,n.length),d=[...r.symbolToInfo.keys()].filter(m=>!r.rhs.symbolToIndices.has(m)),p=m=>{let u=[],h="var prod = 1.0;",w="var sum = 0.0;",g="sum += prod;",b=[],x=[],_=[],$=[],S=r.symbolToInfo.size===r.rhs.symbolToIndices.size;r.symbolToInfo.forEach((T,A)=>{if(r.rhs.symbolToIndices.has(A)){let D=r.rhs.symbolToIndices.get(A)?.[0];D!==void 0&&r.lhs.forEach((z,H)=>{if(T.inputIndices.includes(H)){let W=z.symbolToIndices.get(A);if(W===void 0)throw new Error("Invalid symbol error");W.forEach(F=>{u.push(`${i[H].indicesSet(`input${H}Indices`,F,l.indicesGet("outputIndices",D))}`)})}})}else r.lhs.forEach((D,z)=>{if(T.inputIndices.includes(z)){let H=D.symbolToIndices.get(A);if(H===void 0)throw new Error("Invalid symbol error");H.forEach(W=>{b.push(`${i[z].indicesSet(`input${z}Indices`,W,`${A}`)}`)}),$.push(`prod *= ${i[z].getByIndices(`input${z}Indices`)};`)}}),x.push(`for(var ${A}: u32 = 0; ${A} < uniforms.${Qu(A)}; ${A}++) {`),_.push("}")});let I=S?[...u,`let sum = ${i.map((T,A)=>T.getByIndices(`input${A}Indices`)).join(" * ")};`]:[...u,w,...x,...b,h,...$,g,..._];return` ${m.registerUniforms(d.map(T=>({name:`${Qu(T)}`,type:"u32"}))).registerUniform("outputSize","u32").declareVariables(...i,l)} ${m.mainStart()} @@ -1416,7 +1416,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; ${I.join(` `)}; ${l.setByOffset("global_idx","sum")}; - }`};return{name:"Einsum",shaderCache:{hint:r.equation,inputDependencies:e.map(()=>"rank")},getRunData:()=>{let m=d.filter(h=>r.symbolToInfo.has(h)).map(h=>({type:12,data:r.symbolToInfo.get(h)?.dimValue||0}));m.push({type:12,data:a});let u=e.map((h,w)=>[...V(h)]).reduce((h,w)=>h.concat(w),m);return u.push(...V(n)),{outputs:[{dims:n,dataType:t}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:u}},getShaderSource:p}},Ju=(e,t)=>{let r=new wo(e.inputs,t.equation),n=r.outputDims,o=e.inputs.map((i,a)=>i.dims);e.compute(Km(o,e.inputs[0].dataType,r,n))},ed=e=>{let t=e.equation.replace(/\s+/g,"");return te({equation:t})}});var jm,rd,Ym,Xm,nd,od=U(()=>{"use strict";Q();ae();oe();jm=e=>{if(!e||e.length!==2)throw new Error("Expand requires 2 input.");let t=e[0].dims,r=Array.from(e[1].getBigInt64Array(),Number),n=r.length{let r=e.length-t.length,n=[];for(let o=0;oe.length>t.length?rd(e,t):rd(t,e),Xm=e=>{let t=e[0].dims,r=Array.from(e[1].getBigInt64Array(),Number),n=Ym(t,r),o=e[0].dataType,i=o===9?4:1,a=Math.ceil(k.size(n)/i),l=p=>{let m=E("input",o,t.length,i),u=M("output",o,n.length,i),h;if(o===9){let w=(g,b,x="")=>` + }`};return{name:"Einsum",shaderCache:{hint:r.equation,inputDependencies:e.map(()=>"rank")},getRunData:()=>{let m=d.filter(h=>r.symbolToInfo.has(h)).map(h=>({type:12,data:r.symbolToInfo.get(h)?.dimValue||0}));m.push({type:12,data:a});let u=e.map((h,w)=>[...V(h)]).reduce((h,w)=>h.concat(w),m);return u.push(...V(n)),{outputs:[{dims:n,dataType:t}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:u}},getShaderSource:p}},Ju=(e,t)=>{let r=new vo(e.inputs,t.equation),n=r.outputDims,o=e.inputs.map((i,a)=>i.dims);e.compute(Ym(o,e.inputs[0].dataType,r,n))},ed=e=>{let t=e.equation.replace(/\s+/g,"");return te({equation:t})}});var Xm,rd,Zm,Qm,nd,od=U(()=>{"use strict";Q();ae();oe();Xm=e=>{if(!e||e.length!==2)throw new Error("Expand requires 2 input.");let t=e[0].dims,r=Array.from(e[1].getBigInt64Array(),Number),n=r.length{let r=e.length-t.length,n=[];for(let o=0;oe.length>t.length?rd(e,t):rd(t,e),Qm=e=>{let t=e[0].dims,r=Array.from(e[1].getBigInt64Array(),Number),n=Zm(t,r),o=e[0].dataType,i=o===9?4:1,a=Math.ceil(k.size(n)/i),l=p=>{let m=E("input",o,t.length,i),u=M("output",o,n.length,i),h;if(o===9){let w=(g,b,x="")=>` let outputIndices${b} = ${u.offsetToIndices(`outputOffset + ${b}u`)}; let offset${b} = ${m.broadcastedIndicesToOffset(`outputIndices${b}`,u)}; let index${b} = offset${b} / 4u; @@ -1438,13 +1438,13 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; ${p.registerUniform("vec_size","u32").declareVariables(m,u)} ${p.mainStart()} ${p.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} - ${h}`},d=[{type:12,data:a},...V(t,n)];return{name:"Expand",shaderCache:{hint:`${n.length}`,inputDependencies:["rank"]},getShaderSource:l,getRunData:()=>({outputs:[{dims:n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:d})}},nd=e=>{jm(e.inputs),e.compute(Xm(e.inputs),{inputs:[0]})}});var Zm,id,ad=U(()=>{"use strict";Q();ae();oe();jr();Zm=e=>{let t=e[0].dataType,r=k.size(e[0].dims),n=k.size(e[1].dims),o=n%4===0,i=a=>{let l=E("x",t,[1],4),d=E("bias",t,[1],4),p=M("y",t,[1],4),m=[{name:"output_vec_size",type:"u32"},{name:"bias_size",type:"u32"}],u=w=>` + ${h}`},d=[{type:12,data:a},...V(t,n)];return{name:"Expand",shaderCache:{hint:`${n.length}`,inputDependencies:["rank"]},getShaderSource:l,getRunData:()=>({outputs:[{dims:n,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:d})}},nd=e=>{Xm(e.inputs),e.compute(Qm(e.inputs),{inputs:[0]})}});var Jm,id,ad=U(()=>{"use strict";Q();ae();oe();Kr();Jm=e=>{let t=e[0].dataType,r=k.size(e[0].dims),n=k.size(e[1].dims),o=n%4===0,i=a=>{let l=E("x",t,[1],4),d=E("bias",t,[1],4),p=M("y",t,[1],4),m=[{name:"output_vec_size",type:"u32"},{name:"bias_size",type:"u32"}],u=w=>` let bias${w}_offset: u32 = (global_idx * 4 + ${w}) % uniforms.bias_size; let bias${w} = ${d.getByOffset(`bias${w}_offset / 4`)}[bias${w}_offset % 4];`,h=o?` let bias = ${d.getByOffset("global_idx % (uniforms.bias_size / 4)")};`:`${u(0)}${u(1)}${u(2)}${u(3)} let bias = ${l.type.value}(bias0, bias1, bias2, bias3);`;return`${a.registerUniforms(m).declareVariables(l,d,p)} - ${oo(Oe(t))} + ${io(Oe(t))} ${a.mainStart(Tt)} ${a.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_vec_size")} @@ -1452,8 +1452,8 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; let x = ${l.getByOffset("global_idx")}; ${h} let x_in = x + bias; - ${p.setByOffset("global_idx",io("x_in"))} - }`};return{name:"FastGeluWithBias",shaderCache:{hint:`${o}`,inputDependencies:["type","type"]},getShaderSource:i,getRunData:a=>({outputs:[{dims:a[0].dims,dataType:a[0].dataType}],programUniforms:[{type:12,data:Math.ceil(r/4)},{type:12,data:n}],dispatchGroup:{x:Math.ceil(r/Tt/4)}})}},id=e=>{e.inputs.length<2||k.size(e.inputs[1].dims)===0?au(e):e.compute(Zm(e.inputs))}});var Qm,Jm,sd,ud,dd=U(()=>{"use strict";Q();ae();Ce();oe();Qm=e=>{if(!e||e.length!==2)throw new Error("Gather requires 2 inputs.")},Jm=(e,t)=>{let r=e[0].dims,n=e[1].dims,o=r.length,i=k.normalizeAxis(t.axis,o),a=r.slice(0);a.splice(i,1,...n);let l=r[i],d=e[0].dataType===9?4:1,p=Math.ceil(k.size(a)/d),m=[{type:12,data:p},{type:6,data:l},{type:12,data:i},...V(e[0].dims,e[1].dims,a)],u=h=>{let w=E("data",e[0].dataType,e[0].dims.length,d),g=E("inputIndices",e[1].dataType,e[1].dims.length),b=M("output",e[0].dataType,a.length,d),x=$=>{let S=n.length,I=`var indicesIndices${$} = ${g.type.indices}(0);`;for(let T=0;T1?`indicesIndices${$}[${T}]`:`indicesIndices${$}`} = ${a.length>1?`outputIndices${$}[uniforms.axis + ${T}]`:`outputIndices${$}`};`;I+=` + ${p.setByOffset("global_idx",ao("x_in"))} + }`};return{name:"FastGeluWithBias",shaderCache:{hint:`${o}`,inputDependencies:["type","type"]},getShaderSource:i,getRunData:a=>({outputs:[{dims:a[0].dims,dataType:a[0].dataType}],programUniforms:[{type:12,data:Math.ceil(r/4)},{type:12,data:n}],dispatchGroup:{x:Math.ceil(r/Tt/4)}})}},id=e=>{e.inputs.length<2||k.size(e.inputs[1].dims)===0?au(e):e.compute(Jm(e.inputs))}});var ef,tf,sd,ud,dd=U(()=>{"use strict";Q();ae();Ce();oe();ef=e=>{if(!e||e.length!==2)throw new Error("Gather requires 2 inputs.")},tf=(e,t)=>{let r=e[0].dims,n=e[1].dims,o=r.length,i=k.normalizeAxis(t.axis,o),a=r.slice(0);a.splice(i,1,...n);let l=r[i],d=e[0].dataType===9?4:1,p=Math.ceil(k.size(a)/d),m=[{type:12,data:p},{type:6,data:l},{type:12,data:i},...V(e[0].dims,e[1].dims,a)],u=h=>{let w=E("data",e[0].dataType,e[0].dims.length,d),g=E("inputIndices",e[1].dataType,e[1].dims.length),b=M("output",e[0].dataType,a.length,d),x=$=>{let S=n.length,I=`var indicesIndices${$} = ${g.type.indices}(0);`;for(let T=0;T1?`indicesIndices${$}[${T}]`:`indicesIndices${$}`} = ${a.length>1?`outputIndices${$}[uniforms.axis + ${T}]`:`outputIndices${$}`};`;I+=` var idx${$} = ${g.getByIndices(`indicesIndices${$}`)}; if (idx${$} < 0) { idx${$} = idx${$} + uniforms.axisDimLimit; @@ -1484,8 +1484,8 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; ${h.mainStart()} ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} ${_} - }`};return{name:"Gather",shaderCache:{hint:t.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:a,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:m}),getShaderSource:u}},sd=e=>te({axis:e.axis}),ud=(e,t)=>{let r=e.inputs;Qm(r),e.compute(Jm(e.inputs,t))}});var ef,tf,ld,cd,pd=U(()=>{"use strict";Q();ae();Ce();oe();ef=e=>{if(!e||e.length!==2)throw new Error("GatherElements requires 2 inputs.");if(e[0].dims.length<1)throw new Error("GatherElements requires that the data input be rank >= 1.");if(e[0].dims.length!==e[1].dims.length)throw new Error(`GatherElements requires that the data input and - indices input tensors be of same rank.`)},tf=(e,t)=>{let r=e[0].dims,n=e[0].dataType,o=r.length,i=e[1].dims,a=e[1].dataType,l=k.normalizeAxis(t.axis,o),d=r[l],p=i.slice(0),m=k.size(p),u=E("input",n,o),h=E("indicesInput",a,i.length),w=M("output",n,p.length),g=[{type:12,data:m},{type:6,data:d},{type:12,data:l}];return g.push(...V(r,i,p)),{name:"GatherElements",shaderCache:{inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:p,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(m/64)},programUniforms:g}),getShaderSource:_=>` + }`};return{name:"Gather",shaderCache:{hint:t.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:a,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:m}),getShaderSource:u}},sd=e=>te({axis:e.axis}),ud=(e,t)=>{let r=e.inputs;ef(r),e.compute(tf(e.inputs,t))}});var rf,nf,ld,cd,pd=U(()=>{"use strict";Q();ae();Ce();oe();rf=e=>{if(!e||e.length!==2)throw new Error("GatherElements requires 2 inputs.");if(e[0].dims.length<1)throw new Error("GatherElements requires that the data input be rank >= 1.");if(e[0].dims.length!==e[1].dims.length)throw new Error(`GatherElements requires that the data input and + indices input tensors be of same rank.`)},nf=(e,t)=>{let r=e[0].dims,n=e[0].dataType,o=r.length,i=e[1].dims,a=e[1].dataType,l=k.normalizeAxis(t.axis,o),d=r[l],p=i.slice(0),m=k.size(p),u=E("input",n,o),h=E("indicesInput",a,i.length),w=M("output",n,p.length),g=[{type:12,data:m},{type:6,data:d},{type:12,data:l}];return g.push(...V(r,i,p)),{name:"GatherElements",shaderCache:{inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:p,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(m/64)},programUniforms:g}),getShaderSource:_=>` ${_.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(u,h,w)} ${_.mainStart()} ${_.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} @@ -1501,7 +1501,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; let value = ${u.getByIndices("inputIndices")}; ${w.setByOffset("global_idx","value")}; - }`}},ld=e=>te({axis:e.axis}),cd=(e,t)=>{let r=e.inputs;ef(r),e.compute(tf(e.inputs,t))}});var rf,nf,md,fd,hd=U(()=>{"use strict";Q();ae();oe();rf=e=>{if(!e)throw new Error("Input is missing");if(e.length<2||e.length>3)throw new Error("Invaid input number.");if(e.length===3&&e[2].dims.length>2)throw new Error("Invalid input shape of C");if(e[0].dataType!==e[1].dataType||e.length===3&&e[0].dataType!==e[2].dataType)throw new Error("Input types are mismatched")},nf=(e,t)=>{let r=e[0].dims.slice(),n=e[1].dims.slice(),[o,i,a]=Nr.getShapeOfGemmResult(r,t.transA,n,t.transB,e.length===3?e[2].dims:void 0),l=[o,i];if(!l)throw new Error("Can't use gemm on the given tensors");let d=k.size(l),p=[{type:12,data:d},{type:12,data:o},{type:12,data:i},{type:12,data:a},{type:1,data:t.alpha},{type:1,data:t.beta}],m=["type","type"];e.length===3&&(p.push(...V(e[2].dims)),m.push("rank")),p.push(...V(l));let u=h=>{let w="";t.transA&&t.transB?w="value += a[k * uniforms.M + m] * b[n * uniforms.K + k];":t.transA&&!t.transB?w="value += a[k * uniforms.M + m] * b[k * uniforms.N + n];":!t.transA&&t.transB?w="value += a[m * uniforms.K + k] * b[n * uniforms.K + k];":!t.transA&&!t.transB&&(w="value += a[m * uniforms.K + k] * b[k * uniforms.N + n];");let g=t.alpha===1?"":"value *= uniforms.alpha;",b=E("a",e[0].dataType,e[0].dims),x=E("b",e[1].dataType,e[1].dims),_=b.type.value,$=null,S=[b,x];e.length===3&&($=E("c",e[2].dataType,e[2].dims.length),S.push($));let I=M("output",e[0].dataType,l.length);S.push(I);let T=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}];return` + }`}},ld=e=>te({axis:e.axis}),cd=(e,t)=>{let r=e.inputs;rf(r),e.compute(nf(e.inputs,t))}});var of,af,md,fd,hd=U(()=>{"use strict";Q();ae();oe();of=e=>{if(!e)throw new Error("Input is missing");if(e.length<2||e.length>3)throw new Error("Invaid input number.");if(e.length===3&&e[2].dims.length>2)throw new Error("Invalid input shape of C");if(e[0].dataType!==e[1].dataType||e.length===3&&e[0].dataType!==e[2].dataType)throw new Error("Input types are mismatched")},af=(e,t)=>{let r=e[0].dims.slice(),n=e[1].dims.slice(),[o,i,a]=Nr.getShapeOfGemmResult(r,t.transA,n,t.transB,e.length===3?e[2].dims:void 0),l=[o,i];if(!l)throw new Error("Can't use gemm on the given tensors");let d=k.size(l),p=[{type:12,data:d},{type:12,data:o},{type:12,data:i},{type:12,data:a},{type:1,data:t.alpha},{type:1,data:t.beta}],m=["type","type"];e.length===3&&(p.push(...V(e[2].dims)),m.push("rank")),p.push(...V(l));let u=h=>{let w="";t.transA&&t.transB?w="value += a[k * uniforms.M + m] * b[n * uniforms.K + k];":t.transA&&!t.transB?w="value += a[k * uniforms.M + m] * b[k * uniforms.N + n];":!t.transA&&t.transB?w="value += a[m * uniforms.K + k] * b[n * uniforms.K + k];":!t.transA&&!t.transB&&(w="value += a[m * uniforms.K + k] * b[k * uniforms.N + n];");let g=t.alpha===1?"":"value *= uniforms.alpha;",b=E("a",e[0].dataType,e[0].dims),x=E("b",e[1].dataType,e[1].dims),_=b.type.value,$=null,S=[b,x];e.length===3&&($=E("c",e[2].dataType,e[2].dims.length),S.push($));let I=M("output",e[0].dataType,l.length);S.push(I);let T=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}];return` ${h.registerUniforms(T).declareVariables(...S)} ${h.mainStart()} @@ -1518,14 +1518,14 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; ${g} ${(()=>$!=null?`let cOffset = ${$.broadcastedIndicesToOffset("vec2(m, n)",I)}; value += ${_}(uniforms.beta) * ${$.getByOffset("cOffset")};`:"")()} output[global_idx] = value; - }`};return{name:"Gemm",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:m},getRunData:()=>({outputs:[{dims:l,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(d/64)},programUniforms:p}),getShaderSource:u}},md=e=>{let t=e.transA,r=e.transB,n=e.alpha,o=e.beta;return{transA:t,transB:r,alpha:n,beta:o,cacheKey:`${e.transA};${e.transB};${e.alpha===1}`}},fd=(e,t)=>{rf(e.inputs),e.compute(nf(e.inputs,t))}});var Ve,sf,yd,gd,uf,tr,bd,vo=U(()=>{"use strict";Q();ae();Ce();Vr();qr();oe();Et();Ve=(e,t)=>e.length>t&&e[t].dims.length>0&&k.size(e[t].dims)>0?e[t]:void 0,sf=(e,t)=>{let r=e[0],n=Ve(e,1),o=Ve(e,2),i=Ve(e,3),a=Ve(e,4),l=Ve(e,5),d=Ve(e,6),p=Ve(e,7);if(r.dims.length!==3&&r.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let m=!1,u=r.dims[0],h=r.dims[1],w=r.dims.length===3?m?r.dims[2]/3:r.dims[2]:t.numHeads*r.dims[4],g=h,b=0,x=0,_=Math.floor(w/t.numHeads);if(d&&p){if(d.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(d.dims[0]!==u||d.dims[1]!==t.numHeads||d.dims[3]!==_)throw new Error('Input "past_key" shape (batch_size, num_heads, past_sequence_length, head_size)');if(p.dims[0]!==u||p.dims[1]!==t.numHeads||p.dims[3]!==_)throw new Error('Input "past_value" shape (batch_size, num_heads, past_sequence_length, head_size)');if(d.dims[2]!==p.dims[2])throw new Error('Input "past_key" and "past_value" shall have same dim 2 (past_sequence_length)');if(p.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');b=d.dims[2],x=d.dims[2]}else if(d||p)throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let $;if(n){if(r.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(n.dims.length<3||n.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(r.dims[0]!==n.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(n.dims.length===3){if(n.dims[2]!==r.dims[2])throw new Error('Input "query" and "key" shall have same dim 2 (hidden_size)');$=2,g=n.dims[1]}else if(n.dims.length===5){if(n.dims[2]!==t.numHeads||n.dims[3]!==2||n.dims[4]!==_)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(o)throw new Error('Expect "value" be none when "key" has packed kv format.');$=5,g=n.dims[1]}else{if(n.dims[1]!==t.numHeads||n.dims[3]!==_)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');$=0,g=n.dims[2]}}else{if(r.dims.length!==3&&r.dims.length!==5)throw new Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(r.dims.length===5&&(r.dims[2]!==t.numHeads||r.dims[3]!==3))throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');$=3}if(i){if(i.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimension');if(o&&r.dims.length===5&&r.dims[3]===2)throw new Error("bias is not allowed for packed kv.")}let S=0;if(a){S=8;let D=a.dims;throw D.length===1?D[0]===u?S=1:D[0]===3*u+2&&(S=3):D.length===2&&D[0]===u&&D[1]===g&&(S=5),S===8?new Error('Input "key_padding_mask" shape shall be (batch_size) or (batch_size, kv_sequence_length)'):new Error("Mask not supported")}let I=!1,T=w;if(o){if(o.dims.length!==3&&o.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(r.dims[0]!==o.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(o.dims.length===3){if(g!==o.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');T=o.dims[2]}else{if(g!==o.dims[2])throw new Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');T=o.dims[1]*o.dims[3],I=!0}}let A=b+g,z=!1;if(a)throw new Error("Key padding mask is not supported");if(l){if(l.dims.length!==4)throw new Error('Input "relative_position_bias" is expected to have 4 dimensions');if(l.dims[0]!==u&&l.dims[0]!==1||l.dims[1]!==t.numHeads||l.dims[2]!==h||l.dims[3]!==A)throw new Error('Input "relative_position_bias" shape (batch_size, 1, sequence_length, kv_sequence_length)')}return{batchSize:u,sequenceLength:h,pastSequenceLength:b,kvSequenceLength:g,totalSequenceLength:A,maxSequenceLength:x,inputHiddenSize:0,hiddenSize:w,vHiddenSize:T,headSize:_,vHeadSize:Math.floor(T/t.numHeads),numHeads:t.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:t.maskFilterValue,maskType:S,scale:t.scale,broadcastResPosBias:z,passPastInKv:I,qkvFormat:$}},yd=e=>te({...e}),gd=te({perm:[0,2,1,3]}),uf=(e,t,r,n,o,i,a)=>{let l=[n,o,i],d=k.size(l),p=[{type:12,data:d},{type:12,data:a},{type:12,data:i}],m=u=>{let h=M("qkv_with_bias",t.dataType,l),w=E("qkv",t.dataType,l),g=E("bias",r.dataType,l),b=[{name:"output_size",type:"u32"},{name:"bias_offset",type:"u32"},{name:"hidden_size",type:"u32"}];return` + }`};return{name:"Gemm",shaderCache:{hint:`${t.cacheKey}`,inputDependencies:m},getRunData:()=>({outputs:[{dims:l,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(d/64)},programUniforms:p}),getShaderSource:u}},md=e=>{let t=e.transA,r=e.transB,n=e.alpha,o=e.beta;return{transA:t,transB:r,alpha:n,beta:o,cacheKey:`${e.transA};${e.transB};${e.alpha===1}`}},fd=(e,t)=>{of(e.inputs),e.compute(af(e.inputs,t))}});var Ve,df,yd,gd,lf,tr,bd,$o=U(()=>{"use strict";Q();ae();Ce();Vr();qr();oe();Et();Ve=(e,t)=>e.length>t&&e[t].dims.length>0&&k.size(e[t].dims)>0?e[t]:void 0,df=(e,t)=>{let r=e[0],n=Ve(e,1),o=Ve(e,2),i=Ve(e,3),a=Ve(e,4),l=Ve(e,5),d=Ve(e,6),p=Ve(e,7);if(r.dims.length!==3&&r.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let m=!1,u=r.dims[0],h=r.dims[1],w=r.dims.length===3?m?r.dims[2]/3:r.dims[2]:t.numHeads*r.dims[4],g=h,b=0,x=0,_=Math.floor(w/t.numHeads);if(d&&p){if(d.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(d.dims[0]!==u||d.dims[1]!==t.numHeads||d.dims[3]!==_)throw new Error('Input "past_key" shape (batch_size, num_heads, past_sequence_length, head_size)');if(p.dims[0]!==u||p.dims[1]!==t.numHeads||p.dims[3]!==_)throw new Error('Input "past_value" shape (batch_size, num_heads, past_sequence_length, head_size)');if(d.dims[2]!==p.dims[2])throw new Error('Input "past_key" and "past_value" shall have same dim 2 (past_sequence_length)');if(p.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');b=d.dims[2],x=d.dims[2]}else if(d||p)throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let $;if(n){if(r.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(n.dims.length<3||n.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(r.dims[0]!==n.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(n.dims.length===3){if(n.dims[2]!==r.dims[2])throw new Error('Input "query" and "key" shall have same dim 2 (hidden_size)');$=2,g=n.dims[1]}else if(n.dims.length===5){if(n.dims[2]!==t.numHeads||n.dims[3]!==2||n.dims[4]!==_)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(o)throw new Error('Expect "value" be none when "key" has packed kv format.');$=5,g=n.dims[1]}else{if(n.dims[1]!==t.numHeads||n.dims[3]!==_)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');$=0,g=n.dims[2]}}else{if(r.dims.length!==3&&r.dims.length!==5)throw new Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(r.dims.length===5&&(r.dims[2]!==t.numHeads||r.dims[3]!==3))throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');$=3}if(i){if(i.dims.length!==1)throw new Error('Input "bias" is expected to have 1 dimension');if(o&&r.dims.length===5&&r.dims[3]===2)throw new Error("bias is not allowed for packed kv.")}let S=0;if(a){S=8;let z=a.dims;throw z.length===1?z[0]===u?S=1:z[0]===3*u+2&&(S=3):z.length===2&&z[0]===u&&z[1]===g&&(S=5),S===8?new Error('Input "key_padding_mask" shape shall be (batch_size) or (batch_size, kv_sequence_length)'):new Error("Mask not supported")}let I=!1,T=w;if(o){if(o.dims.length!==3&&o.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(r.dims[0]!==o.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(o.dims.length===3){if(g!==o.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');T=o.dims[2]}else{if(g!==o.dims[2])throw new Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');T=o.dims[1]*o.dims[3],I=!0}}let A=b+g,D=!1;if(a)throw new Error("Key padding mask is not supported");if(l){if(l.dims.length!==4)throw new Error('Input "relative_position_bias" is expected to have 4 dimensions');if(l.dims[0]!==u&&l.dims[0]!==1||l.dims[1]!==t.numHeads||l.dims[2]!==h||l.dims[3]!==A)throw new Error('Input "relative_position_bias" shape (batch_size, 1, sequence_length, kv_sequence_length)')}return{batchSize:u,sequenceLength:h,pastSequenceLength:b,kvSequenceLength:g,totalSequenceLength:A,maxSequenceLength:x,inputHiddenSize:0,hiddenSize:w,vHiddenSize:T,headSize:_,vHeadSize:Math.floor(T/t.numHeads),numHeads:t.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:t.maskFilterValue,maskType:S,scale:t.scale,broadcastResPosBias:D,passPastInKv:I,qkvFormat:$}},yd=e=>te({...e}),gd=te({perm:[0,2,1,3]}),lf=(e,t,r,n,o,i,a)=>{let l=[n,o,i],d=k.size(l),p=[{type:12,data:d},{type:12,data:a},{type:12,data:i}],m=u=>{let h=M("qkv_with_bias",t.dataType,l),w=E("qkv",t.dataType,l),g=E("bias",r.dataType,l),b=[{name:"output_size",type:"u32"},{name:"bias_offset",type:"u32"},{name:"hidden_size",type:"u32"}];return` ${u.registerUniforms(b).declareVariables(w,g,h)} ${u.mainStart()} ${u.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} let bias_offset_idx = (global_idx % uniforms.hidden_size) + uniforms.bias_offset; qkv_with_bias[global_idx] = qkv[global_idx] + bias[bias_offset_idx]; - }`};return e.compute({name:"MultiHeadAttentionAddBias",shaderCache:{inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:l,dataType:t.dataType,gpuDataType:0}],dispatchGroup:{x:Math.ceil(d/64)},programUniforms:p}),getShaderSource:m},{inputs:[t,r],outputs:[-1]})[0]},tr=(e,t,r,n,o,i,a,l)=>{let d=i;if(a){if(n===1)throw new Error("AddBiasReshape is not implemented. Please export your model with packed QKV or KV");return d=uf(e,i,a,t,n,r*o,l),d=d.reshape([t,n,r,o]),e.compute(Ue(d,gd.perm),{inputs:[d],outputs:[-1]})[0]}else return i.dims.length===3&&(d=i.reshape([t,n,r,o])),e.compute(Ue(d,gd.perm),{inputs:[d],outputs:[-1]})[0]},bd=(e,t)=>{let r=sf(e.inputs,t),n=e.inputs[0],o=Ve(e.inputs,1),i=Ve(e.inputs,2),a=Ve(e.inputs,3),l=Ve(e.inputs,4),d=Ve(e.inputs,5),p=Ve(e.inputs,6),m=Ve(e.inputs,7);if(n.dims.length===5)throw new Error("Packed QKV is not implemented");if(o?.dims.length===5)throw new Error("Packed KV is not implemented");let u=o&&i&&o.dims.length===4&&i.dims.length===4,h=tr(e,r.batchSize,r.numHeads,r.sequenceLength,r.headSize,n,a,0);if(u)return Nt(e,h,o,i,l,void 0,p,m,d,r,t);if(!o||!i)throw new Error("key and value must be provided");let w=tr(e,r.batchSize,r.numHeads,r.kvSequenceLength,r.headSize,o,a,r.hiddenSize),g=tr(e,r.batchSize,r.numHeads,r.kvSequenceLength,r.vHeadSize,i,a,2*r.hiddenSize);Nt(e,h,w,g,l,void 0,p,m,d,r,t)}});var wd,df,lf,$o,vd,_o=U(()=>{"use strict";Q();ae();oe();wd=e=>Array.from(e.getBigInt64Array(),Number),df=e=>{if(!e||e.length!==2)throw new Error("Tile requires 2 inputs.");if(e[0].dataType!==1&&e[0].dataType!==10&&e[0].dataType!==6&&e[0].dataType!==12)throw new Error("Tile only support float, float16, int32, and uint32 data types");if(e[1].dataType!==7)throw new Error("Tile `repeats` input should be of int64 data type");if(e[1].dims.length!==1)throw new Error("Tile `repeats` input should be 1-D");if(wd(e[1]).length!==e[0].dims.length)throw new Error("Tile `repeats` input should have same number of elements as rank of input data tensor")},lf=(e,t)=>{let r=[];for(let n=0;n{let r=e[0].dims,n=t??wd(e[1]),o=lf(r,n),i=k.size(o),a=e[0].dataType,l=E("input",a,r.length),d=M("output",a,o.length),p=m=>` + }`};return e.compute({name:"MultiHeadAttentionAddBias",shaderCache:{inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:l,dataType:t.dataType,gpuDataType:0}],dispatchGroup:{x:Math.ceil(d/64)},programUniforms:p}),getShaderSource:m},{inputs:[t,r],outputs:[-1]})[0]},tr=(e,t,r,n,o,i,a,l)=>{let d=i;if(a){if(n===1)throw new Error("AddBiasReshape is not implemented. Please export your model with packed QKV or KV");return d=lf(e,i,a,t,n,r*o,l),d=d.reshape([t,n,r,o]),e.compute(Ue(d,gd.perm),{inputs:[d],outputs:[-1]})[0]}else return i.dims.length===3&&(d=i.reshape([t,n,r,o])),e.compute(Ue(d,gd.perm),{inputs:[d],outputs:[-1]})[0]},bd=(e,t)=>{let r=df(e.inputs,t),n=e.inputs[0],o=Ve(e.inputs,1),i=Ve(e.inputs,2),a=Ve(e.inputs,3),l=Ve(e.inputs,4),d=Ve(e.inputs,5),p=Ve(e.inputs,6),m=Ve(e.inputs,7);if(n.dims.length===5)throw new Error("Packed QKV is not implemented");if(o?.dims.length===5)throw new Error("Packed KV is not implemented");let u=o&&i&&o.dims.length===4&&i.dims.length===4,h=tr(e,r.batchSize,r.numHeads,r.sequenceLength,r.headSize,n,a,0);if(u)return Wt(e,h,o,i,l,void 0,p,m,d,r,t);if(!o||!i)throw new Error("key and value must be provided");let w=tr(e,r.batchSize,r.numHeads,r.kvSequenceLength,r.headSize,o,a,r.hiddenSize),g=tr(e,r.batchSize,r.numHeads,r.kvSequenceLength,r.vHeadSize,i,a,2*r.hiddenSize);Wt(e,h,w,g,l,void 0,p,m,d,r,t)}});var wd,cf,pf,_o,vd,xo=U(()=>{"use strict";Q();ae();oe();wd=e=>Array.from(e.getBigInt64Array(),Number),cf=e=>{if(!e||e.length!==2)throw new Error("Tile requires 2 inputs.");if(e[0].dataType!==1&&e[0].dataType!==10&&e[0].dataType!==6&&e[0].dataType!==12)throw new Error("Tile only support float, float16, int32, and uint32 data types");if(e[1].dataType!==7)throw new Error("Tile `repeats` input should be of int64 data type");if(e[1].dims.length!==1)throw new Error("Tile `repeats` input should be 1-D");if(wd(e[1]).length!==e[0].dims.length)throw new Error("Tile `repeats` input should have same number of elements as rank of input data tensor")},pf=(e,t)=>{let r=[];for(let n=0;n{let r=e[0].dims,n=t??wd(e[1]),o=pf(r,n),i=k.size(o),a=e[0].dataType,l=E("input",a,r.length),d=M("output",a,o.length),p=m=>` const inputShape = ${l.indices(...r)}; ${m.registerUniform("output_size","u32").declareVariables(l,d)} ${m.mainStart()} @@ -1539,7 +1539,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; ${l.indicesSet("input_indices","i","input_dim_value")} } ${d.setByOffset("global_idx",l.getByIndices("input_indices"))} - }`;return{name:"Tile",shaderCache:{hint:`${n}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:o,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(i/64)},programUniforms:[{type:12,data:i},...V(e[0].dims,o)]}),getShaderSource:p}},vd=e=>{df(e.inputs),e.compute($o(e.inputs),{inputs:[0]})}});var cf,$d,xd,pf,_d,Sd,Id=U(()=>{"use strict";Q();ae();Ce();qr();oe();vo();_o();Et();cf=(e,t)=>{let r=e[0],n=e[1],o=e[2],i=e[3],a=e[4];if(r.dims.length!==3&&r.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let l=!1,d=r.dims[0],p=r.dims[1],m=r.dims.length===3?l?r.dims[2]/3:r.dims[2]:t.numHeads*r.dims[4],u=p,h=0,w=0,g=Math.floor(m/t.numHeads),b=i&&i.dims.length!==0,x=a&&a.dims.length!==0,_=!0;if(b&&x){if(i.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(a.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');_?(h=i.dims[1],w=i.dims[1]):(h=i.dims[2],w=i.dims[2])}else if(b||x)throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let $;if(n){if(r.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(n.dims.length<3||n.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(r.dims[0]!==n.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(n.dims.length===3){if(r.dims[2]%n.dims[2]!==0)throw new Error('Dimension 2 of "query" should be a multiple of "key"');$=2,u=n.dims[1]}else if(n.dims.length===5){if(n.dims[2]!==t.numHeads||n.dims[3]!==2||n.dims[4]!==g)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(o)throw new Error('Expect "value" be none when "key" has packed kv format.');$=5,u=n.dims[1]}else{if(n.dims[1]!==t.numHeads||n.dims[3]!==g)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');$=0,u=n.dims[2]}}else{if(r.dims.length!==3&&r.dims.length!==5)throw new Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(r.dims.length===5&&(r.dims[2]!==t.numHeads||r.dims[3]!==3))throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');$=3}let S=0,I=!1,T=m;if(o){if(o.dims.length!==3&&o.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(r.dims[0]!==o.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(o.dims.length===3){if(u!==o.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');T=o.dims[2]}else{if(u!==o.dims[2])throw new Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');T=o.dims[1]*o.dims[3],I=!0}}let A=h+u,z=!1;return{batchSize:d,sequenceLength:p,pastSequenceLength:h,kvSequenceLength:u,totalSequenceLength:A,maxSequenceLength:w,inputHiddenSize:0,hiddenSize:m,vHiddenSize:T,headSize:g,vHeadSize:Math.floor(T/t.kvNumHeads),numHeads:t.numHeads,kvNumHeads:t.kvNumHeads,nReps:t.numHeads/t.kvNumHeads,pastPresentShareBuffer:!1,maskType:S,scale:t.scale,broadcastResPosBias:z,passPastInKv:I,qkvFormat:$,isPastkvBSNH:_}},$d=(e,t,r,n)=>{let o=[n.batchSize,n.totalSequenceLength,n.kvNumHeads,n.headSize],i=4,a=k.size(o)/i,l=n.totalSequenceLength,d=M("present_kv",r,o.length,i),p=E("new_kv",e.dataType,e.dims.length,i),m=t?E("past_kv",t.dataType,t.dims.length,i):void 0,u=Math.ceil(n.headSize/i),h={x:l,y:e.dims[0],z:1},w=t?["rank","rank"]:["rank"],g=[{type:12,data:a},{type:12,data:n.pastSequenceLength},{type:12,data:n.kvSequenceLength},{type:12,data:n.totalSequenceLength}],b=[p];m?(g.push(...V(e.dims),...V(t.dims),...V(o)),b.push(m)):g.push(...V(e.dims),...V(o));let x=[{name:"output_size",type:"u32"},{name:"past_seqlen",type:"u32"},{name:"new_seqlen",type:"u32"},{name:"present_seqlen",type:"u32"}],_=` let past_batch_stride = uniforms.past_seqlen * num_heads * H; + }`;return{name:"Tile",shaderCache:{hint:`${n}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:o,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(i/64)},programUniforms:[{type:12,data:i},...V(e[0].dims,o)]}),getShaderSource:p}},vd=e=>{cf(e.inputs),e.compute(_o(e.inputs),{inputs:[0]})}});var mf,$d,xd,ff,_d,Sd,Id=U(()=>{"use strict";Q();ae();Ce();qr();oe();$o();xo();Et();mf=(e,t)=>{let r=e[0],n=e[1],o=e[2],i=e[3],a=e[4];if(r.dims.length!==3&&r.dims.length!==5)throw new Error("Input query is expected to have 3 or 5 dimensions");let l=!1,d=r.dims[0],p=r.dims[1],m=r.dims.length===3?l?r.dims[2]/3:r.dims[2]:t.numHeads*r.dims[4],u=p,h=0,w=0,g=Math.floor(m/t.numHeads),b=i&&i.dims.length!==0,x=a&&a.dims.length!==0,_=!0;if(b&&x){if(i.dims.length!==4)throw new Error('Input "past_key" is expected to have 4 dimensions');if(a.dims.length!==4)throw new Error('Input "past_value" is expected to have 4 dimensions');_?(h=i.dims[1],w=i.dims[1]):(h=i.dims[2],w=i.dims[2])}else if(b||x)throw new Error('Input "past_key" and "past_value" shall be both present or both absent');let $;if(n){if(r.dims.length!==3)throw new Error('Input "query" is expected to have 3 dimensions when key is given');if(n.dims.length<3||n.dims.length>5)throw new Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(r.dims[0]!==n.dims[0])throw new Error('Input "query" and "key" shall have same dim 0 (batch size)');if(n.dims.length===3){if(r.dims[2]%n.dims[2]!==0)throw new Error('Dimension 2 of "query" should be a multiple of "key"');$=2,u=n.dims[1]}else if(n.dims.length===5){if(n.dims[2]!==t.numHeads||n.dims[3]!==2||n.dims[4]!==g)throw new Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(o)throw new Error('Expect "value" be none when "key" has packed kv format.');$=5,u=n.dims[1]}else{if(n.dims[1]!==t.numHeads||n.dims[3]!==g)throw new Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');$=0,u=n.dims[2]}}else{if(r.dims.length!==3&&r.dims.length!==5)throw new Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(r.dims.length===5&&(r.dims[2]!==t.numHeads||r.dims[3]!==3))throw new Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');$=3}let S=0,I=!1,T=m;if(o){if(o.dims.length!==3&&o.dims.length!==4)throw new Error('Input "value" is expected to have 3 or 4 dimensions');if(r.dims[0]!==o.dims[0])throw new Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(o.dims.length===3){if(u!==o.dims[1])throw new Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');T=o.dims[2]}else{if(u!==o.dims[2])throw new Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');T=o.dims[1]*o.dims[3],I=!0}}let A=h+u,D=!1;return{batchSize:d,sequenceLength:p,pastSequenceLength:h,kvSequenceLength:u,totalSequenceLength:A,maxSequenceLength:w,inputHiddenSize:0,hiddenSize:m,vHiddenSize:T,headSize:g,vHeadSize:Math.floor(T/t.kvNumHeads),numHeads:t.numHeads,kvNumHeads:t.kvNumHeads,nReps:t.numHeads/t.kvNumHeads,pastPresentShareBuffer:!1,maskType:S,scale:t.scale,broadcastResPosBias:D,passPastInKv:I,qkvFormat:$,isPastkvBSNH:_}},$d=(e,t,r,n)=>{let o=[n.batchSize,n.totalSequenceLength,n.kvNumHeads,n.headSize],i=4,a=k.size(o)/i,l=n.totalSequenceLength,d=M("present_kv",r,o.length,i),p=E("new_kv",e.dataType,e.dims.length,i),m=t?E("past_kv",t.dataType,t.dims.length,i):void 0,u=Math.ceil(n.headSize/i),h={x:l,y:e.dims[0],z:1},w=t?["rank","rank"]:["rank"],g=[{type:12,data:a},{type:12,data:n.pastSequenceLength},{type:12,data:n.kvSequenceLength},{type:12,data:n.totalSequenceLength}],b=[p];m?(g.push(...V(e.dims),...V(t.dims),...V(o)),b.push(m)):g.push(...V(e.dims),...V(o));let x=[{name:"output_size",type:"u32"},{name:"past_seqlen",type:"u32"},{name:"new_seqlen",type:"u32"},{name:"present_seqlen",type:"u32"}],_=` let past_batch_stride = uniforms.past_seqlen * num_heads * H; var past_head_stride = uniforms.past_seqlen * H; if (is_bsnh) { past_head_stride = H; @@ -1585,7 +1585,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; let out_offset = b * present_batch_stride + s * row_stride + n * present_head_stride + h; ${S} - }`;return{name:"ConcatPastNew",shaderCache:{hint:`${n.kvNumHeads}${u}${!!t}`,inputDependencies:w},getRunData:()=>({outputs:[{dims:o,dataType:r}],dispatchGroup:h,programUniforms:g}),getShaderSource:I}},xd=e=>te({...e}),pf=te({perm:[0,2,1,3]}),_d=(e,t,r,n,o)=>{let i=t,a=n.kvNumHeads,l=n.nReps;return t.dims.length===3&&n.kvSequenceLength!==0&&(i=t.reshape([n.batchSize,n.kvSequenceLength,a,n.headSize])),r?i=e.compute($d(i,r,i.dataType,n),{inputs:[i,r],outputs:[n.isPastkvBSNH?o:-1]})[0]:i=e.compute($d(i,void 0,i.dataType,n),{inputs:[i],outputs:[n.isPastkvBSNH?o:-1]})[0],l!==1&&(i=e.compute($o([i],[1,1,1,l]),{inputs:[i],outputs:[-1]})[0],i=i.reshape([n.batchSize,n.totalSequenceLength,a*l,n.headSize])),e.compute(Ue(i,pf.perm),{inputs:[i],outputs:[-1]})[0]},Sd=(e,t)=>{let r=cf(e.inputs,t);if(e.inputs[0].dims.length===5)throw new Error("Packed QKV is not implemented");if(e.inputs[1]?.dims.length===5)throw new Error("Packed KV is not implemented");let n=tr(e,r.batchSize,r.numHeads,r.sequenceLength,r.headSize,e.inputs[0],void 0,0),o=e.inputs[3]&&e.inputs[3].dims.length!==0?e.inputs[3]:void 0,i=e.inputs[4]&&e.inputs[4].dims.length!==0?e.inputs[4]:void 0,a=_d(e,e.inputs[1],o,r,1),l=_d(e,e.inputs[2],i,r,2);Nt(e,n,a,l,void 0,void 0,void 0,void 0,void 0,r,t)}});var mf,ff,hf,Cd,Td=U(()=>{"use strict";Q();ae();oe();mf=(e,t)=>{let r=e[0].dims,n=r,o=2,i=k.sizeToDimension(r,o),a=k.sizeFromDimension(r,o),l=we(a),d=a/l,p=[r[0],r[1],d],m=["rank","type","type"],u=[{type:12,data:a},{type:12,data:d}];u.push(...V(p,p));let h=w=>{let g=E("x",e[0].dataType,p.length,l),b=E("scale",e[1].dataType,e[1].dims),x=E("bias",e[2].dataType,e[2].dims),_=M("output",e[0].dataType,p.length,l),$=[g,b,x,_],S=g.type.value,I=l===1?"f32":`vec${l}`,T=64,A=[{name:"normSize",type:"u32"},{name:"normPackedSize",type:"u32"}];return` + }`;return{name:"ConcatPastNew",shaderCache:{hint:`${n.kvNumHeads}${u}${!!t}`,inputDependencies:w},getRunData:()=>({outputs:[{dims:o,dataType:r}],dispatchGroup:h,programUniforms:g}),getShaderSource:I}},xd=e=>te({...e}),ff=te({perm:[0,2,1,3]}),_d=(e,t,r,n,o)=>{let i=t,a=n.kvNumHeads,l=n.nReps;return t.dims.length===3&&n.kvSequenceLength!==0&&(i=t.reshape([n.batchSize,n.kvSequenceLength,a,n.headSize])),r?i=e.compute($d(i,r,i.dataType,n),{inputs:[i,r],outputs:[n.isPastkvBSNH?o:-1]})[0]:i=e.compute($d(i,void 0,i.dataType,n),{inputs:[i],outputs:[n.isPastkvBSNH?o:-1]})[0],l!==1&&(i=e.compute(_o([i],[1,1,1,l]),{inputs:[i],outputs:[-1]})[0],i=i.reshape([n.batchSize,n.totalSequenceLength,a*l,n.headSize])),e.compute(Ue(i,ff.perm),{inputs:[i],outputs:[-1]})[0]},Sd=(e,t)=>{let r=mf(e.inputs,t);if(e.inputs[0].dims.length===5)throw new Error("Packed QKV is not implemented");if(e.inputs[1]?.dims.length===5)throw new Error("Packed KV is not implemented");let n=tr(e,r.batchSize,r.numHeads,r.sequenceLength,r.headSize,e.inputs[0],void 0,0),o=e.inputs[3]&&e.inputs[3].dims.length!==0?e.inputs[3]:void 0,i=e.inputs[4]&&e.inputs[4].dims.length!==0?e.inputs[4]:void 0,a=_d(e,e.inputs[1],o,r,1),l=_d(e,e.inputs[2],i,r,2);Wt(e,n,a,l,void 0,void 0,void 0,void 0,void 0,r,t)}});var hf,gf,yf,Cd,Td=U(()=>{"use strict";Q();ae();oe();hf=(e,t)=>{let r=e[0].dims,n=r,o=2,i=k.sizeToDimension(r,o),a=k.sizeFromDimension(r,o),l=we(a),d=a/l,p=[r[0],r[1],d],m=["rank","type","type"],u=[{type:12,data:a},{type:12,data:d}];u.push(...V(p,p));let h=w=>{let g=E("x",e[0].dataType,p.length,l),b=E("scale",e[1].dataType,e[1].dims),x=E("bias",e[2].dataType,e[2].dims),_=M("output",e[0].dataType,p.length,l),$=[g,b,x,_],S=g.type.value,I=l===1?"f32":`vec${l}`,T=64,A=[{name:"normSize",type:"u32"},{name:"normPackedSize",type:"u32"}];return` var meanShared : f32; var squaredNormShared : f32; var workgroupShared : array<${I}, ${T}>; @@ -1645,8 +1645,8 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; let value = ${g.get("batch","channel","h")} * ${S}(${I}(channelScale)) + ${S}(${I}(channelShift)); ${_.set("batch","channel","h","value")}; } - }`};return{name:"InstanceNormalization",shaderCache:{hint:`${t.epsilon};${l}`,inputDependencies:m},getRunData:()=>({outputs:[{dims:n,dataType:e[0].dataType}],dispatchGroup:{x:i},programUniforms:u}),getShaderSource:h}},ff=(e,t,r,n,o,i,a,l)=>{let d=we(a),p=64,m=d===1?"vec2f":`mat2x${d}f`,u=d===1?"f32":`vec${d}f`,h=(A,z)=>`${m}(${A}, ${z})`,w=o*a/d,g=Math.ceil(i/p),b=["type"],x=[{type:12,data:g},{type:12,data:i},{type:12,data:Math.floor(a/d)},{type:12,data:Math.floor(i*a/d)}],_=A=>{let z=E("input",t.dataType,t.dims,d);return` - ${A.declareVariables(z)} + }`};return{name:"InstanceNormalization",shaderCache:{hint:`${t.epsilon};${l}`,inputDependencies:m},getRunData:()=>({outputs:[{dims:n,dataType:e[0].dataType}],dispatchGroup:{x:i},programUniforms:u}),getShaderSource:h}},gf=(e,t,r,n,o,i,a,l)=>{let d=we(a),p=64,m=d===1?"vec2f":`mat2x${d}f`,u=d===1?"f32":`vec${d}f`,h=(A,D)=>`${m}(${A}, ${D})`,w=o*a/d,g=Math.ceil(i/p),b=["type"],x=[{type:12,data:g},{type:12,data:i},{type:12,data:Math.floor(a/d)},{type:12,data:Math.floor(i*a/d)}],_=A=>{let D=E("input",t.dataType,t.dims,d);return` + ${A.declareVariables(D)} @group(0) @binding(1) var output : array<${m}>; struct Uniforms {wg_size:u32, H:u32, C:u32, image_size:u32}; @group(0) @binding(2) var uniforms: Uniforms; @@ -1669,10 +1669,10 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; squaredSum += value * value; } output[global_idx] = ${h("sum","squaredSum")}; - }`},$=e.compute({name:"InstanceNormComputeMean",shaderCache:{hint:`${d}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:[o,a,p,2],dataType:1}],dispatchGroup:{x:o*a/d},programUniforms:x}),getShaderSource:_},{inputs:[t],outputs:[-1]})[0],S=[{type:12,data:w},{type:12,data:i},{type:12,data:Math.floor(a/d)},{type:12,data:Math.floor(p*a/d)}],I=["type","type","type"],T=A=>{let z=E("scale",r.dataType,r.dims,d),D=E("bias",n.dataType,n.dims,d);return` + }`},$=e.compute({name:"InstanceNormComputeMean",shaderCache:{hint:`${d}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:[o,a,p,2],dataType:1}],dispatchGroup:{x:o*a/d},programUniforms:x}),getShaderSource:_},{inputs:[t],outputs:[-1]})[0],S=[{type:12,data:w},{type:12,data:i},{type:12,data:Math.floor(a/d)},{type:12,data:Math.floor(p*a/d)}],I=["type","type","type"],T=A=>{let D=E("scale",r.dataType,r.dims,d),z=E("bias",n.dataType,n.dims,d);return` @group(0) @binding(0) var input : array<${m}>; - @group(0) @binding(1) var scale : array<${z.type.storage}>; - @group(0) @binding(2) var bias : array<${D.type.storage}>; + @group(0) @binding(1) var scale : array<${D.type.storage}>; + @group(0) @binding(2) var bias : array<${z.type.storage}>; @group(0) @binding(3) var output : array<${m}>; struct Uniforms {units_of_work : u32, H: u32, C : u32, image_size : u32}; @group(0) @binding(4) var uniforms: Uniforms; @@ -1697,7 +1697,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; let channelShift = ${u}(bias[currentChannelNumber]) - sum * channelScale; output[global_idx] = ${h("channelScale","channelShift")}; - }`};return e.compute({name:"InstanceNormComputeChannelScaleShift",shaderCache:{hint:`${d};${l}`,inputDependencies:I},getRunData:()=>({outputs:[{dims:[o,a,2],dataType:1}],dispatchGroup:{x:Math.ceil(w/64)},programUniforms:S}),getShaderSource:T},{inputs:[$,r,n],outputs:[-1]})[0]},hf=(e,t,r)=>{let n=t[0].dims,o=n,i=n[0],a=n[n.length-1],l=k.sizeFromDimension(n,1)/a,d=we(a),p=k.size(o)/d,m=[{type:12,data:l},{type:12,data:Math.floor(a/d)}],u=["type","type"],h=ff(e,t[0],t[1],t[2],i,l,a,r.epsilon),w=g=>{let b=he(t[0].dataType),x=d===1?"vec2f":`mat2x${d}f`,_=d===1?b:`vec${d}<${b}>`,$=E("input",t[0].dataType,t[0].dims,d),S=M("output",t[0].dataType,o,d);return` + }`};return e.compute({name:"InstanceNormComputeChannelScaleShift",shaderCache:{hint:`${d};${l}`,inputDependencies:I},getRunData:()=>({outputs:[{dims:[o,a,2],dataType:1}],dispatchGroup:{x:Math.ceil(w/64)},programUniforms:S}),getShaderSource:T},{inputs:[$,r,n],outputs:[-1]})[0]},yf=(e,t,r)=>{let n=t[0].dims,o=n,i=n[0],a=n[n.length-1],l=k.sizeFromDimension(n,1)/a,d=we(a),p=k.size(o)/d,m=[{type:12,data:l},{type:12,data:Math.floor(a/d)}],u=["type","type"],h=gf(e,t[0],t[1],t[2],i,l,a,r.epsilon),w=g=>{let b=he(t[0].dataType),x=d===1?"vec2f":`mat2x${d}f`,_=d===1?b:`vec${d}<${b}>`,$=E("input",t[0].dataType,t[0].dims,d),S=M("output",t[0].dataType,o,d);return` @group(0) @binding(0) var input : array<${$.type.storage}>; @group(0) @binding(1) var scaleInput : array<${x}>; @group(0) @binding(2) var output : array<${S.type.storage}>; @@ -1711,10 +1711,10 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; let scaleOffset = currentImageNumber * uniforms.C + currentChannelNumber; let scale = scaleInput[scaleOffset]; output[global_idx] = fma(input[global_idx], ${_}(scale[0]), ${_}(scale[1])); - }`};e.compute({name:"InstanceNormalizationNHWC",shaderCache:{hint:`${d}`,inputDependencies:u},getRunData:()=>({outputs:[{dims:o,dataType:t[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:m}),getShaderSource:w},{inputs:[t[0],h]})},Cd=(e,t)=>{t.format==="NHWC"?hf(e,e.inputs,t):e.compute(mf(e.inputs,t))}});var gf,yf,Ad,Ed=U(()=>{"use strict";Q();ae();oe();gf=e=>{if(!e||e.length<2)throw new Error("layerNorm requires at least 2 inputs.")},yf=(e,t,r)=>{let n=t.simplified,o=e[0].dims,i=e[1],a=!n&&e[2],l=o,d=k.normalizeAxis(t.axis,o.length),p=k.sizeToDimension(o,d),m=k.sizeFromDimension(o,d),u=k.size(i.dims),h=a?k.size(a.dims):0;if(u!==m||a&&h!==m)throw new Error(`Size of X.shape()[axis:] == ${m}. + }`};e.compute({name:"InstanceNormalizationNHWC",shaderCache:{hint:`${d}`,inputDependencies:u},getRunData:()=>({outputs:[{dims:o,dataType:t[0].dataType}],dispatchGroup:{x:Math.ceil(p/64)},programUniforms:m}),getShaderSource:w},{inputs:[t[0],h]})},Cd=(e,t)=>{t.format==="NHWC"?yf(e,e.inputs,t):e.compute(hf(e.inputs,t))}});var bf,wf,Ad,Ed=U(()=>{"use strict";Q();ae();oe();bf=e=>{if(!e||e.length<2)throw new Error("layerNorm requires at least 2 inputs.")},wf=(e,t,r)=>{let n=t.simplified,o=e[0].dims,i=e[1],a=!n&&e[2],l=o,d=k.normalizeAxis(t.axis,o.length),p=k.sizeToDimension(o,d),m=k.sizeFromDimension(o,d),u=k.size(i.dims),h=a?k.size(a.dims):0;if(u!==m||a&&h!==m)throw new Error(`Size of X.shape()[axis:] == ${m}. Size of scale and bias (if provided) must match this. - Got scale size of ${u} and bias size of ${h}`);let w=[];for(let T=0;T1,$=r>2,S=T=>{let A=he(e[0].dataType),z=[E("x",e[0].dataType,e[0].dims,g),E("scale",i.dataType,i.dims,g)];a&&z.push(E("bias",a.dataType,a.dims,g)),z.push(M("output",e[0].dataType,l,g)),_&&z.push(M("mean_data_output",1,w)),$&&z.push(M("inv_std_output",1,w));let D=[{name:"norm_count",type:"u32"},{name:"norm_size",type:"f32"},{name:"norm_size_vectorized",type:"u32"},{name:"epsilon",type:"f32"}];return` - ${T.registerUniforms(D).declareVariables(...z)} + Got scale size of ${u} and bias size of ${h}`);let w=[];for(let T=0;T1,$=r>2,S=T=>{let A=he(e[0].dataType),D=[E("x",e[0].dataType,e[0].dims,g),E("scale",i.dataType,i.dims,g)];a&&D.push(E("bias",a.dataType,a.dims,g)),D.push(M("output",e[0].dataType,l,g)),_&&D.push(M("mean_data_output",1,w)),$&&D.push(M("inv_std_output",1,w));let z=[{name:"norm_count",type:"u32"},{name:"norm_size",type:"f32"},{name:"norm_size_vectorized",type:"u32"},{name:"epsilon",type:"f32"}];return` + ${T.registerUniforms(z).declareVariables(...D)} ${T.mainStart()} ${T.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.norm_count")} let offset = global_idx * uniforms.norm_size_vectorized; @@ -1732,14 +1732,14 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; for (var j: u32 = 0; j < uniforms.norm_size_vectorized; j++) { let f32input = ${At(A,g,"x[j + offset]")}; let f32scale = ${At(A,g,"scale[j]")}; - output[j + offset] = ${z[0].type.value}((f32input ${n?"":"- mean"}) * inv_std_dev * f32scale + output[j + offset] = ${D[0].type.value}((f32input ${n?"":"- mean"}) * inv_std_dev * f32scale ${a?`+ ${At(A,g,"bias[j]")}`:""} ); } ${_?"mean_data_output[global_idx] = mean":""}; ${$?"inv_std_output[global_idx] = inv_std_dev":""}; - }`},I=[{dims:l,dataType:e[0].dataType}];return _&&I.push({dims:w,dataType:1}),$&&I.push({dims:w,dataType:1}),{name:"LayerNormalization",shaderCache:{hint:`${g};${r};${n}`,inputDependencies:b},getRunData:()=>({outputs:I,dispatchGroup:{x:Math.ceil(p/64)},programUniforms:x}),getShaderSource:S}},Ad=(e,t)=>{gf(e.inputs),e.compute(yf(e.inputs,t,e.outputCount))}});var bf,wf,kd,Pd,Od=U(()=>{"use strict";Q();ae();Ce();oe();bf=(e,t)=>{if(e.length<3||e.length>4)throw new Error("MatMulNBits requires 3 or 4 inputs");let r=e[0],n=r.dims.length;if(r.dims[n-1]!==t.k)throw new Error("The last dim of input shape does not match the k value");let o=Math.floor((t.k+t.blockSize-1)/t.blockSize),i=t.blockSize/8*t.bits,a=e[1];if(!k.areEqual(a.dims,[t.n,o,i]))throw new Error("The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize");let d=e[2].dims;if(k.size(d)!==t.n*o)throw new Error("scales input size error.");if(e.length===4){let m=e[3].dims,u=t.bits>4?t.n*o:t.n*Math.floor((o+1)/2);if(k.size(m)!==u)throw new Error("zeroPoints input size error.")}},wf=(e,t,r,n)=>{let o=e[0].dims,i=o.length,a=Math.floor((t.k+t.blockSize-1)/t.blockSize),l=o[i-2],d=t.k,p=t.n,m=o.slice(0,i-2),u=k.size(m),w=t.blockSize/8*t.bits/4,g=e[0].dataType,b=we(l),x=we(t.k),_=we(w),$=It(g),S=l*a*$,I=Math.floor(n/S),T=a<=r[0]&&I>0,A=!T||I>=4?we(p):I>=2&&we(p)>=2?2:1,z=m.concat([l,p]),D=k.size(z)/A/b,H=T?[]:[{type:12,data:D},{type:12,data:t.blockSize}],W=[u,l,d/x],F=k.convertShape(e[1].dims).slice();F.splice(-1,1,w/_),H.push(...V(W)),H.push(...V(F)),H.push(...V(e[2].dims)),e.length===4&&H.push(...V(k.convertShape(e[3].dims)));let de=[u,l,p/A];H.push(...V(de));let ce=X=>{let xe=W.length,q=E("a",e[0].dataType,xe,x),ie=E("b",12,F.length,_),le=E("scales",e[2].dataType,e[2].dims.length),se=[q,ie,le],Z=e.length===4?E("zero_points",12,e[3].dims.length):void 0;Z&&se.push(Z);let re=de.length,J=M("output",e[0].dataType,re,A),Pe=[{name:"output_size",type:"u32"},{name:"block_size",type:"u32"}],R=he(e[0].dataType),Y=(()=>{switch(x){case 1:return`array<${R}, 8>`;case 2:return`mat4x2<${R}>`;case 4:return`mat2x4<${R}>`;default:throw new Error(`${x}-component is not supported.`)}})(),ue=` + }`},I=[{dims:l,dataType:e[0].dataType}];return _&&I.push({dims:w,dataType:1}),$&&I.push({dims:w,dataType:1}),{name:"LayerNormalization",shaderCache:{hint:`${g};${r};${n}`,inputDependencies:b},getRunData:()=>({outputs:I,dispatchGroup:{x:Math.ceil(p/64)},programUniforms:x}),getShaderSource:S}},Ad=(e,t)=>{bf(e.inputs),e.compute(wf(e.inputs,t,e.outputCount))}});var vf,$f,kd,Pd,Od=U(()=>{"use strict";Q();ae();Ce();oe();vf=(e,t)=>{if(e.length<3||e.length>4)throw new Error("MatMulNBits requires 3 or 4 inputs");let r=e[0],n=r.dims.length;if(r.dims[n-1]!==t.k)throw new Error("The last dim of input shape does not match the k value");let o=Math.floor((t.k+t.blockSize-1)/t.blockSize),i=t.blockSize/8*t.bits,a=e[1];if(!k.areEqual(a.dims,[t.n,o,i]))throw new Error("The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize");let d=e[2].dims;if(k.size(d)!==t.n*o)throw new Error("scales input size error.");if(e.length===4){let m=e[3].dims,u=t.bits>4?t.n*o:t.n*Math.floor((o+1)/2);if(k.size(m)!==u)throw new Error("zeroPoints input size error.")}},$f=(e,t,r,n)=>{let o=e[0].dims,i=o.length,a=Math.floor((t.k+t.blockSize-1)/t.blockSize),l=o[i-2],d=t.k,p=t.n,m=o.slice(0,i-2),u=k.size(m),w=t.blockSize/8*t.bits/4,g=e[0].dataType,b=we(l),x=we(t.k),_=we(w),$=It(g),S=l*a*$,I=Math.floor(n/S),T=a<=r[0]&&I>0,A=!T||I>=4?we(p):I>=2&&we(p)>=2?2:1,D=m.concat([l,p]),z=k.size(D)/A/b,H=T?[]:[{type:12,data:z},{type:12,data:t.blockSize}],W=[u,l,d/x],F=k.convertShape(e[1].dims).slice();F.splice(-1,1,w/_),H.push(...V(W)),H.push(...V(F)),H.push(...V(e[2].dims)),e.length===4&&H.push(...V(k.convertShape(e[3].dims)));let de=[u,l,p/A];H.push(...V(de));let ce=X=>{let xe=W.length,q=E("a",e[0].dataType,xe,x),ie=E("b",12,F.length,_),le=E("scales",e[2].dataType,e[2].dims.length),se=[q,ie,le],Z=e.length===4?E("zero_points",12,e[3].dims.length):void 0;Z&&se.push(Z);let re=de.length,J=M("output",e[0].dataType,re,A),Pe=[{name:"output_size",type:"u32"},{name:"block_size",type:"u32"}],R=he(e[0].dataType),Y=(()=>{switch(x){case 1:return`array<${R}, 8>`;case 2:return`mat4x2<${R}>`;case 4:return`mat2x4<${R}>`;default:throw new Error(`${x}-component is not supported.`)}})(),ue=` for (var word: u32 = 0; word < ${w}; word += ${_}) { ${ie.indicesSet("b_indices","2","word")}; let b_data = ${ie.getByIndices("b_indices")}; @@ -1865,7 +1865,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; ${J.indicesSet("output_indices",re-2,`${b} * row + k`)}; ${J.setByIndices("output_indices","output_values[k]")} } - }`};return{name:T?"BlockwiseMatMulNBits":"MatMulNBits",shaderCache:{hint:`${t.cacheKey};${l};${g};${e.length}`,inputDependencies:Array(e.length).fill("rank")},getRunData:()=>({outputs:[{dims:z,dataType:g}],name:T?"BlockwiseMatMulNBits":"MatMulNBits",dispatchGroup:T?{x:1,y:Math.ceil(p/A),z:u}:{x:Math.ceil(D/64)},programUniforms:H}),getShaderSource:ce}},kd=(e,t)=>{bf(e.inputs,t);let r=e.getMaxComputeWorkgroupSizes(),n=e.getMaxComputeWorkgroupStoragesize();e.compute(wf(e.inputs,t,r,n))},Pd=e=>te(e)});var vf,$f,_f,xf,Sf,If,Cf,Tf,zd,Dd=U(()=>{"use strict";Q();ae();oe();vf=e=>{if(!e||e.length<1)throw new Error("Too few inputs");if(e[0].dataType!==1&&e[0].dataType!==10)throw new Error("Input type must be float or float16.");if(e.length>=2){let t=e[0].dims.length*2===e[1].dims[0];if(e.length===4&&(t=e[3].dims[0]*2===e[1].dims[0]),!t)throw new Error("The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].")}},$f=(e,t,r)=>{let n="";for(let o=t-1;o>=0;--o)n+=` + }`};return{name:T?"BlockwiseMatMulNBits":"MatMulNBits",shaderCache:{hint:`${t.cacheKey};${l};${g};${e.length}`,inputDependencies:Array(e.length).fill("rank")},getRunData:()=>({outputs:[{dims:D,dataType:g}],name:T?"BlockwiseMatMulNBits":"MatMulNBits",dispatchGroup:T?{x:1,y:Math.ceil(p/A),z:u}:{x:Math.ceil(z/64)},programUniforms:H}),getShaderSource:ce}},kd=(e,t)=>{vf(e.inputs,t);let r=e.getMaxComputeWorkgroupSizes(),n=e.getMaxComputeWorkgroupStoragesize();e.compute($f(e.inputs,t,r,n))},Pd=e=>te(e)});var _f,xf,Sf,If,Cf,Tf,Af,Ef,Dd,zd=U(()=>{"use strict";Q();ae();oe();_f=e=>{if(!e||e.length<1)throw new Error("Too few inputs");if(e[0].dataType!==1&&e[0].dataType!==10)throw new Error("Input type must be float or float16.");if(e.length>=2){let t=e[0].dims.length*2===e[1].dims[0];if(e.length===4&&(t=e[3].dims[0]*2===e[1].dims[0]),!t)throw new Error("The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].")}},xf=(e,t,r)=>{let n="";for(let o=t-1;o>=0;--o)n+=` k = i32(${e.indicesGet("indices",o)}) - ${G("uniforms.pads",o,r)}; if (k < 0) { break; @@ -1882,7 +1882,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; ${n} value = x[offset]; } - `},_f=(e,t,r)=>{let n="";for(let o=t-1;o>=0;--o)n+=` + `},Sf=(e,t,r)=>{let n="";for(let o=t-1;o>=0;--o)n+=` k = i32(${e.indicesGet("indices",o)}) - ${G("uniforms.pads",o,r)}; if (k < 0) { k = -k; @@ -1900,7 +1900,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; var k = 0; ${n} value = x[offset]; - `},xf=(e,t,r)=>{let n="";for(let o=t-1;o>=0;--o)n+=` + `},If=(e,t,r)=>{let n="";for(let o=t-1;o>=0;--o)n+=` k = i32(${e.indicesGet("indices",o)}) - ${G("uniforms.pads",o,r)}; if (k < 0) { k = 0; @@ -1914,7 +1914,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; var k = 0; ${n} value = x[offset]; - `},Sf=(e,t,r)=>{let n="";for(let o=t-1;o>=0;--o)n+=` + `},Cf=(e,t,r)=>{let n="";for(let o=t-1;o>=0;--o)n+=` k = i32(${e.indicesGet("indices",o)}) - ${G("uniforms.pads",o,r)}; if (k < 0) { k += i32(${G("uniforms.x_shape",o,t)}]); @@ -1928,7 +1928,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; var k = 0; ${n} value = x[offset]; - `},If=(e,t,r)=>{switch(r.mode){case 0:return $f(e,t,r.pads.length);case 1:return _f(e,t,r.pads.length);case 2:return xf(e,t,r.pads.length);case 3:return Sf(e,t,r.pads.length);default:throw new Error("Invalid mode")}},Cf=(e,t)=>{let r=k.padShape(e[0].dims.slice(),t.pads),n=e[0].dims,o=k.size(r),i=[{type:12,data:o},{type:6,data:t.pads}];t.mode===0&&i.push({type:e[0].dataType,data:t.value}),i.push(...V(e[0].dims,r));let a=["rank"],l=d=>{let p=M("output",e[0].dataType,r.length),m=E("x",e[0].dataType,n.length),u=m.type.value,h=If(p,n.length,t),w=[{name:"output_size",type:"u32"},{name:"pads",type:"i32",length:t.pads.length}];return t.mode===0&&w.push({name:"constant_value",type:u}),` + `},Tf=(e,t,r)=>{switch(r.mode){case 0:return xf(e,t,r.pads.length);case 1:return Sf(e,t,r.pads.length);case 2:return If(e,t,r.pads.length);case 3:return Cf(e,t,r.pads.length);default:throw new Error("Invalid mode")}},Af=(e,t)=>{let r=k.padShape(e[0].dims.slice(),t.pads),n=e[0].dims,o=k.size(r),i=[{type:12,data:o},{type:6,data:t.pads}];t.mode===0&&i.push({type:e[0].dataType,data:t.value}),i.push(...V(e[0].dims,r));let a=["rank"],l=d=>{let p=M("output",e[0].dataType,r.length),m=E("x",e[0].dataType,n.length),u=m.type.value,h=Tf(p,n.length,t),w=[{name:"output_size",type:"u32"},{name:"pads",type:"i32",length:t.pads.length}];return t.mode===0&&w.push({name:"constant_value",type:u}),` ${d.registerUniforms(w).declareVariables(m,p)} ${d.mainStart()} ${d.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} @@ -1938,7 +1938,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; var value = ${u}(0); ${h} output[global_idx] = value; - }`};return{name:"Pad",shaderCache:{hint:`${t.mode}`,inputDependencies:a},getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(k.size(r)/64)},programUniforms:i}),getShaderSource:l}},Tf=(e,t)=>{if(e.length>1){let r=e[1].getBigInt64Array(),n=e.length>=3&&e[2].data?e[2].getFloat32Array()[0]:0,o=e[0].dims.length,i=new Int32Array(2*o).fill(0);if(e.length>=4){let l=e[3].getBigInt64Array();for(let d=0;di[Number(d)]=Number(l));let a=[];return i.forEach(l=>a.push(l)),{mode:t.mode,value:n,pads:a}}else return t},zd=(e,t)=>{vf(e.inputs);let r=Tf(e.inputs,t);e.compute(Cf(e.inputs,r),{inputs:[0]})}});var nn,Bd,Rd,Md,Ud,Af,Ef,Vd,Nd,Wd,Hd,Gd,Ld,Fd,qd,Kd,jd,Yd,Xd,Zd=U(()=>{"use strict";Le();Q();ae();oe();nn=e=>{if(ye.webgpu.validateInputContent&&(!e||e.length!==1))throw new Error("Pool ops requires 1 input.")},Bd=(e,t,r)=>{let n=t.format==="NHWC",o=e.dims.slice();n&&o.splice(1,0,o.pop());let i=Object.hasOwnProperty.call(t,"dilations"),a=t.kernelShape.slice(),l=t.strides.slice(),d=i?t.dilations.slice():[],p=t.pads.slice();Ct.adjustPoolAttributes(r,o,a,l,d,p);let m=Ct.computePoolOutputShape(r,o,l,d,a,p,t.autoPad),u=Object.assign({},t);i?Object.assign(u,{kernelShape:a,strides:l,pads:p,dilations:d,cacheKey:t.cacheKey}):Object.assign(u,{kernelShape:a,strides:l,pads:p,cacheKey:t.cacheKey});let h=m.slice();return h.push(h.splice(1,1)[0]),[u,n?h:m]},Rd=(e,t)=>{let r=t.format==="NHWC",n=k.size(e),o=k.size(t.kernelShape),i=[{type:12,data:n},{type:12,data:o}],a=[{name:"outputSize",type:"u32"},{name:"kernelSize",type:"u32"}];if(t.kernelShape.length<=2){let l=t.kernelShape[t.kernelShape.length-1],d=t.strides[t.strides.length-1],p=t.pads[t.pads.length/2-1],m=t.pads[t.pads.length-1],u=!!(p+m);i.push({type:12,data:l},{type:12,data:d},{type:12,data:p},{type:12,data:m}),a.push({name:"kw",type:"u32"},{name:"sw",type:"u32"},{name:"pwStart",type:"u32"},{name:"pwEnd",type:"u32"});let h=!1;if(t.kernelShape.length===2){let w=t.kernelShape[t.kernelShape.length-2],g=t.strides[t.strides.length-2],b=t.pads[t.pads.length/2-2],x=t.pads[t.pads.length-2];h=!!(b+x),i.push({type:12,data:w},{type:12,data:g},{type:12,data:b},{type:12,data:x}),a.push({name:"kh",type:"u32"},{name:"sh",type:"u32"},{name:"phStart",type:"u32"},{name:"phEnd",type:"u32"})}return[i,a,!0,u,h]}else{if(r)throw new Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let l=k.computeStrides(t.kernelShape);i.push({type:12,data:l},{type:12,data:t.pads},{type:12,data:t.strides}),a.push({name:"kernelStrides",type:"u32",length:l.length},{name:"pads",type:"u32",length:t.pads.length},{name:"strides",type:"u32",length:t.strides.length});let d=t.pads.reduce((p,m)=>p+m);return[i,a,!!d,!1,!1]}},Md=(e,t,r,n,o,i,a,l,d,p,m,u)=>{let h=o.format==="NHWC",w=t.type.value,g=M("output",t.type.tensor,n);if(o.kernelShape.length<=2){let b="",x="",_="",$=r-(h?2:1);if(m?b=` + }`};return{name:"Pad",shaderCache:{hint:`${t.mode}`,inputDependencies:a},getRunData:()=>({outputs:[{dims:r,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(k.size(r)/64)},programUniforms:i}),getShaderSource:l}},Ef=(e,t)=>{if(e.length>1){let r=e[1].getBigInt64Array(),n=e.length>=3&&e[2].data?e[2].getFloat32Array()[0]:0,o=e[0].dims.length,i=new Int32Array(2*o).fill(0);if(e.length>=4){let l=e[3].getBigInt64Array();for(let d=0;di[Number(d)]=Number(l));let a=[];return i.forEach(l=>a.push(l)),{mode:t.mode,value:n,pads:a}}else return t},Dd=(e,t)=>{_f(e.inputs);let r=Ef(e.inputs,t);e.compute(Af(e.inputs,r),{inputs:[0]})}});var nn,Bd,Rd,Md,Ud,kf,Pf,Vd,Nd,Wd,Hd,Gd,Ld,Fd,qd,jd,Kd,Yd,Xd,Zd=U(()=>{"use strict";Le();Q();ae();oe();nn=e=>{if(ye.webgpu.validateInputContent&&(!e||e.length!==1))throw new Error("Pool ops requires 1 input.")},Bd=(e,t,r)=>{let n=t.format==="NHWC",o=e.dims.slice();n&&o.splice(1,0,o.pop());let i=Object.hasOwnProperty.call(t,"dilations"),a=t.kernelShape.slice(),l=t.strides.slice(),d=i?t.dilations.slice():[],p=t.pads.slice();Ct.adjustPoolAttributes(r,o,a,l,d,p);let m=Ct.computePoolOutputShape(r,o,l,d,a,p,t.autoPad),u=Object.assign({},t);i?Object.assign(u,{kernelShape:a,strides:l,pads:p,dilations:d,cacheKey:t.cacheKey}):Object.assign(u,{kernelShape:a,strides:l,pads:p,cacheKey:t.cacheKey});let h=m.slice();return h.push(h.splice(1,1)[0]),[u,n?h:m]},Rd=(e,t)=>{let r=t.format==="NHWC",n=k.size(e),o=k.size(t.kernelShape),i=[{type:12,data:n},{type:12,data:o}],a=[{name:"outputSize",type:"u32"},{name:"kernelSize",type:"u32"}];if(t.kernelShape.length<=2){let l=t.kernelShape[t.kernelShape.length-1],d=t.strides[t.strides.length-1],p=t.pads[t.pads.length/2-1],m=t.pads[t.pads.length-1],u=!!(p+m);i.push({type:12,data:l},{type:12,data:d},{type:12,data:p},{type:12,data:m}),a.push({name:"kw",type:"u32"},{name:"sw",type:"u32"},{name:"pwStart",type:"u32"},{name:"pwEnd",type:"u32"});let h=!1;if(t.kernelShape.length===2){let w=t.kernelShape[t.kernelShape.length-2],g=t.strides[t.strides.length-2],b=t.pads[t.pads.length/2-2],x=t.pads[t.pads.length-2];h=!!(b+x),i.push({type:12,data:w},{type:12,data:g},{type:12,data:b},{type:12,data:x}),a.push({name:"kh",type:"u32"},{name:"sh",type:"u32"},{name:"phStart",type:"u32"},{name:"phEnd",type:"u32"})}return[i,a,!0,u,h]}else{if(r)throw new Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let l=k.computeStrides(t.kernelShape);i.push({type:12,data:l},{type:12,data:t.pads},{type:12,data:t.strides}),a.push({name:"kernelStrides",type:"u32",length:l.length},{name:"pads",type:"u32",length:t.pads.length},{name:"strides",type:"u32",length:t.strides.length});let d=t.pads.reduce((p,m)=>p+m);return[i,a,!!d,!1,!1]}},Md=(e,t,r,n,o,i,a,l,d,p,m,u)=>{let h=o.format==="NHWC",w=t.type.value,g=M("output",t.type.tensor,n);if(o.kernelShape.length<=2){let b="",x="",_="",$=r-(h?2:1);if(m?b=` for (var i: u32 = 0u; i < uniforms.kw; i++) { xIndices[${$}] = indices[${$}] * uniforms.sw - uniforms.pwStart + i; if (xIndices[${$}] < 0 || xIndices[${$}] @@ -2027,15 +2027,15 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; ${a} output[global_idx] = value; - }`}},Ud=e=>`${e.format};${e.ceilMode};${e.autoPad};${e.kernelShape.length}`,Af=e=>`${Ud(e)};${e.countIncludePad}`,Ef=e=>`${Ud(e)};${e.storageOrder};${e.dilations}`,Vd=e=>({format:e.format,autoPad:["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][e.auto_pad],ceilMode:e.ceil_mode,kernelShape:e.kernel_shape,strides:e.strides,pads:e.pads}),Nd=(e,t,r,n)=>{let[o,i]=Bd(t,n,r),a=E("x",t.dataType,t.dims.length),l=a.type.value,d="value += x_val;",p="";o.countIncludePad?p+=`value /= ${l}(uniforms.kernelSize);`:p+=`value /= ${l}(i32(uniforms.kernelSize) - pad);`;let[m,u,h,w,g]=Rd(i,o);m.push(...V(t.dims,i));let b=["rank"];return{name:e,shaderCache:{hint:`${n.cacheKey};${h};${w};${g}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:i,dataType:t.dataType}],dispatchGroup:{x:Math.ceil(k.size(i)/64)},programUniforms:m}),getShaderSource:x=>Md(x,a,t.dims.length,i.length,o,d,p,0,u,h,w,g)}},Wd=e=>{let t=e.count_include_pad!==0,r=Vd(e);if(r.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for AveragePool");let n={countIncludePad:t,...r,cacheKey:""};return{...n,cacheKey:Af(n)}},Hd=(e,t)=>{nn(e.inputs),e.compute(Nd("AveragePool",e.inputs[0],!1,t))},Gd={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[]},Ld=e=>{let t=e.format;return{format:t,...Gd,cacheKey:t}},Fd=(e,t)=>{nn(e.inputs),e.compute(Nd("GlobalAveragePool",e.inputs[0],!0,t))},qd=(e,t,r,n)=>{let[o,i]=Bd(t,n,r),a=` + }`}},Ud=e=>`${e.format};${e.ceilMode};${e.autoPad};${e.kernelShape.length}`,kf=e=>`${Ud(e)};${e.countIncludePad}`,Pf=e=>`${Ud(e)};${e.storageOrder};${e.dilations}`,Vd=e=>({format:e.format,autoPad:["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][e.auto_pad],ceilMode:e.ceil_mode,kernelShape:e.kernel_shape,strides:e.strides,pads:e.pads}),Nd=(e,t,r,n)=>{let[o,i]=Bd(t,n,r),a=E("x",t.dataType,t.dims.length),l=a.type.value,d="value += x_val;",p="";o.countIncludePad?p+=`value /= ${l}(uniforms.kernelSize);`:p+=`value /= ${l}(i32(uniforms.kernelSize) - pad);`;let[m,u,h,w,g]=Rd(i,o);m.push(...V(t.dims,i));let b=["rank"];return{name:e,shaderCache:{hint:`${n.cacheKey};${h};${w};${g}`,inputDependencies:b},getRunData:()=>({outputs:[{dims:i,dataType:t.dataType}],dispatchGroup:{x:Math.ceil(k.size(i)/64)},programUniforms:m}),getShaderSource:x=>Md(x,a,t.dims.length,i.length,o,d,p,0,u,h,w,g)}},Wd=e=>{let t=e.count_include_pad!==0,r=Vd(e);if(r.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for AveragePool");let n={countIncludePad:t,...r,cacheKey:""};return{...n,cacheKey:kf(n)}},Hd=(e,t)=>{nn(e.inputs),e.compute(Nd("AveragePool",e.inputs[0],!1,t))},Gd={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[]},Ld=e=>{let t=e.format;return{format:t,...Gd,cacheKey:t}},Fd=(e,t)=>{nn(e.inputs),e.compute(Nd("GlobalAveragePool",e.inputs[0],!0,t))},qd=(e,t,r,n)=>{let[o,i]=Bd(t,n,r),a=` value = max(x_val, value); - `,l="",d=E("x",t.dataType,t.dims.length),p=["rank"],[m,u,h,w,g]=Rd(i,o);return m.push(...V(t.dims,i)),{name:e,shaderCache:{hint:`${n.cacheKey};${h};${w};${g}`,inputDependencies:p},getRunData:()=>({outputs:[{dims:i,dataType:t.dataType}],dispatchGroup:{x:Math.ceil(k.size(i)/64)},programUniforms:m}),getShaderSource:b=>Md(b,d,t.dims.length,i.length,o,a,l,t.dataType===10?-65504:-1e5,u,h,w,g)}},Kd=(e,t)=>{nn(e.inputs),e.compute(qd("MaxPool",e.inputs[0],!1,t))},jd=e=>{let t=e.storage_order,r=e.dilations,n=Vd(e);if(t!==0)throw new Error("column major storage order is not yet supported for MaxPool");if(n.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for MaxPool");let o={storageOrder:t,dilations:r,...n,cacheKey:""};return{...o,cacheKey:Ef(o)}},Yd=e=>{let t=e.format;return{format:t,...Gd,cacheKey:t}},Xd=(e,t)=>{nn(e.inputs),e.compute(qd("GlobalMaxPool",e.inputs[0],!0,t))}});var Pf,Of,Qd,Jd=U(()=>{"use strict";Le();Q();oe();Pf=(e,t,r)=>{let n=e===t,o=et&&r>0;if(n||o||i)throw new Error("Range these inputs' contents are invalid.")},Of=(e,t,r,n)=>{let o=Math.abs(Math.ceil((t-e)/r)),i=[o],a=o,l=[{type:12,data:a},{type:n,data:e},{type:n,data:r},...V(i)],d=p=>{let m=M("output",n,i.length),u=m.type.value,h=[{name:"outputSize",type:"u32"},{name:"start",type:u},{name:"delta",type:u}];return` + `,l="",d=E("x",t.dataType,t.dims.length),p=["rank"],[m,u,h,w,g]=Rd(i,o);return m.push(...V(t.dims,i)),{name:e,shaderCache:{hint:`${n.cacheKey};${h};${w};${g}`,inputDependencies:p},getRunData:()=>({outputs:[{dims:i,dataType:t.dataType}],dispatchGroup:{x:Math.ceil(k.size(i)/64)},programUniforms:m}),getShaderSource:b=>Md(b,d,t.dims.length,i.length,o,a,l,t.dataType===10?-65504:-1e5,u,h,w,g)}},jd=(e,t)=>{nn(e.inputs),e.compute(qd("MaxPool",e.inputs[0],!1,t))},Kd=e=>{let t=e.storage_order,r=e.dilations,n=Vd(e);if(t!==0)throw new Error("column major storage order is not yet supported for MaxPool");if(n.ceilMode!==0)throw new Error("using ceil() in shape computation is not yet supported for MaxPool");let o={storageOrder:t,dilations:r,...n,cacheKey:""};return{...o,cacheKey:Pf(o)}},Yd=e=>{let t=e.format;return{format:t,...Gd,cacheKey:t}},Xd=(e,t)=>{nn(e.inputs),e.compute(qd("GlobalMaxPool",e.inputs[0],!0,t))}});var Df,zf,Qd,Jd=U(()=>{"use strict";Le();Q();oe();Df=(e,t,r)=>{let n=e===t,o=et&&r>0;if(n||o||i)throw new Error("Range these inputs' contents are invalid.")},zf=(e,t,r,n)=>{let o=Math.abs(Math.ceil((t-e)/r)),i=[o],a=o,l=[{type:12,data:a},{type:n,data:e},{type:n,data:r},...V(i)],d=p=>{let m=M("output",n,i.length),u=m.type.value,h=[{name:"outputSize",type:"u32"},{name:"start",type:u},{name:"delta",type:u}];return` ${p.registerUniforms(h).declareVariables(m)} ${p.mainStart()} ${p.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} output[global_idx] = uniforms.start + ${u}(global_idx) * uniforms.delta; - }`};return{name:"Range",shaderCache:{hint:`${n}`},getShaderSource:d,getRunData:()=>({outputs:[{dims:i,dataType:n}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:l})}},Qd=e=>{let t=0,r=0,n=0;e.inputs[0].dataType===6?(t=e.inputs[0].getInt32Array()[0],r=e.inputs[1].getInt32Array()[0],n=e.inputs[2].getInt32Array()[0]):e.inputs[0].dataType===1&&(t=e.inputs[0].getFloat32Array()[0],r=e.inputs[1].getFloat32Array()[0],n=e.inputs[2].getFloat32Array()[0]),ye.webgpu.validateInputContent&&Pf(t,r,n),e.compute(Of(t,r,n,e.inputs[0].dataType),{inputs:[]})}});var zf,Df,Bf,Rf,Mf,Uf,Vf,Nf,Wf,Hf,Gf,el,Lf,Ff,qf,Kf,jf,tl,rl,nl=U(()=>{"use strict";Q();ae();Ce();oe();zf=(e,t)=>{if(e.every(r=>r>0||(()=>{throw new Error("Resize requires scales input values to be positive")})),e.length>0){if(t.mode==="linear"){if(!(e.length===2||e.length===3||e.length===4&&e[0]===1&&e[1]===1||e.length===4&&e[0]===1&&e[3]===1||e.length===5&&e[0]===1&&e[1]===1))throw new Error(`For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and - one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`)}else if(t.mode==="cubic"&&!(e.length===2||e.length===4&&e[0]===1&&e[1]===1||e.length===4&&e[0]===1&&e[3]===1))throw new Error("Resize requires scales input size to be 2 or 4 for cubic mode")}},Df=(e,t,r)=>{t.every(o=>o>=0&&o{throw new Error("Resize requires axes input values to be positive and less than rank")}));let n=new Array(r).fill(1);return t.forEach((o,i)=>n[o]=e[i]),n},Bf=(e,t,r,n,o,i)=>{let[a,l,d]=r>10?[1,2,3]:[-1,e.length>1?1:-1,-1],p=e[0].dims.length;if(a>0&&e.length>a&&e[a].dims.length>0)e[a].getFloat32Array().forEach(m=>i.push(m));else if(t.coordinateTransformMode==="tf_crop_and_resize")throw new Error("Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize");if(l>0&&e.length>l&&e[l].dims.length>0){if(e[l].getFloat32Array().forEach(m=>n.push(m)),n.length!==0&&n.length!==p&&r>=18&&n.length!==t.axes.length)throw new Error("Resize requires scales input size to be same as input rank or axes size for opset 18 and up");zf(n,t),t.axes.length>0&&Df(n,t.axes,p).forEach((m,u)=>n[u]=m)}if(d>0&&e.length>d&&(e[d].getBigInt64Array().forEach(m=>o.push(Number(m))),o.length!==p||r>=18&&o.length===t.axes.length))throw new Error("Resize requires sizes input size to be same as input rank or axes size for opset 18 and up");if(t.axes.length>0){if(n.length!==t.axes.length)throw new Error('Resize requires "scales" input size to be of axes rank when axes attributes is specified');if(o.length!==t.axes.length)throw new Error('Resize requires "sizes" input size to be of rank axes rank when axes attributes is specified')}if(typeof n<"u"&&typeof o<"u"&&n.length>0&&o.length>p)throw new Error("Resize requires only of scales or sizes to be specified")},Rf=(e,t)=>`fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32, + }`};return{name:"Range",shaderCache:{hint:`${n}`},getShaderSource:d,getRunData:()=>({outputs:[{dims:i,dataType:n}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:l})}},Qd=e=>{let t=0,r=0,n=0;e.inputs[0].dataType===6?(t=e.inputs[0].getInt32Array()[0],r=e.inputs[1].getInt32Array()[0],n=e.inputs[2].getInt32Array()[0]):e.inputs[0].dataType===1&&(t=e.inputs[0].getFloat32Array()[0],r=e.inputs[1].getFloat32Array()[0],n=e.inputs[2].getFloat32Array()[0]),ye.webgpu.validateInputContent&&Df(t,r,n),e.compute(zf(t,r,n,e.inputs[0].dataType),{inputs:[]})}});var Bf,Rf,Mf,Uf,Vf,Nf,Wf,Hf,Gf,Lf,Ff,el,qf,jf,Kf,Yf,Xf,tl,rl,nl=U(()=>{"use strict";Q();ae();Ce();oe();Bf=(e,t)=>{if(e.every(r=>r>0||(()=>{throw new Error("Resize requires scales input values to be positive")})),e.length>0){if(t.mode==="linear"){if(!(e.length===2||e.length===3||e.length===4&&e[0]===1&&e[1]===1||e.length===4&&e[0]===1&&e[3]===1||e.length===5&&e[0]===1&&e[1]===1))throw new Error(`For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and + one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`)}else if(t.mode==="cubic"&&!(e.length===2||e.length===4&&e[0]===1&&e[1]===1||e.length===4&&e[0]===1&&e[3]===1))throw new Error("Resize requires scales input size to be 2 or 4 for cubic mode")}},Rf=(e,t,r)=>{t.every(o=>o>=0&&o{throw new Error("Resize requires axes input values to be positive and less than rank")}));let n=new Array(r).fill(1);return t.forEach((o,i)=>n[o]=e[i]),n},Mf=(e,t,r,n,o,i)=>{let[a,l,d]=r>10?[1,2,3]:[-1,e.length>1?1:-1,-1],p=e[0].dims.length;if(a>0&&e.length>a&&e[a].dims.length>0)e[a].getFloat32Array().forEach(m=>i.push(m));else if(t.coordinateTransformMode==="tf_crop_and_resize")throw new Error("Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize");if(l>0&&e.length>l&&e[l].dims.length>0){if(e[l].getFloat32Array().forEach(m=>n.push(m)),n.length!==0&&n.length!==p&&r>=18&&n.length!==t.axes.length)throw new Error("Resize requires scales input size to be same as input rank or axes size for opset 18 and up");Bf(n,t),t.axes.length>0&&Rf(n,t.axes,p).forEach((m,u)=>n[u]=m)}if(d>0&&e.length>d&&(e[d].getBigInt64Array().forEach(m=>o.push(Number(m))),o.length!==p||r>=18&&o.length===t.axes.length))throw new Error("Resize requires sizes input size to be same as input rank or axes size for opset 18 and up");if(t.axes.length>0){if(n.length!==t.axes.length)throw new Error('Resize requires "scales" input size to be of axes rank when axes attributes is specified');if(o.length!==t.axes.length)throw new Error('Resize requires "sizes" input size to be of rank axes rank when axes attributes is specified')}if(typeof n<"u"&&typeof o<"u"&&n.length>0&&o.length>p)throw new Error("Resize requires only of scales or sizes to be specified")},Uf=(e,t)=>`fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32, lengthOriginal: u32, roiStart: f32, roiEnd: f32) -> ${t} { `+(()=>{switch(e){case"asymmetric":return`return ${t}(xResized) / ${t}(xScale);`;case"pytorch_half_pixel":return`if (lengthResized > 1) { return (${t}(xResized) + 0.5) / ${t}(xScale) - 0.5; } else { @@ -2060,7 +2060,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; const adjustment = ${t}(lengthResized) / outputWidth; const center = ${t}(lengthOriginal) / 2; const offset = center * (1 - adjustment); - return offset + ((${t}(xResized) + 0.5) / ${t}(xScale)) - 0.5;`;case"half_pixel":return`return ((${t}(xResized) + 0.5) / ${t}(xScale)) - 0.5;`;default:throw new Error(`Coordinate transform mode ${e} is not supported`)}})()+"}",Mf=(e,t,r)=>`fn getNearestPixelFromOriginal(xOriginal: ${r}, isDownSample: bool) -> ${r} {`+(()=>{switch(e){case"round_prefer_ceil":return"if (fract(xOriginal) == 0.5) { return ceil(xOriginal); } else { return round(xOriginal); }";case"floor":return"return floor(xOriginal);";case"ceil":return"return ceil(xOriginal);";case"round_prefer_floor":return"if (fract(xOriginal) == 0.5) { return floor(xOriginal); } else { return round(xOriginal); }";case"simple":default:if(t<11)return"if (isDownSample) { return ceil(xOriginal); } else { return xOriginal; }";throw new Error(`Nearest mode ${e} is not supported`)}})()+"}",Uf=(e,t,r)=>{let n=new Array(r).fill(0).concat(new Array(r).fill(1)),o=e.length===0?n:e.slice();return t.length>0?(t.forEach((i,a)=>{n[i]=o[a],n[a+r]=o[t.length+a]}),n):o},Vf=(e,t,r,n)=>{let o=[];if(r.length>0)if(n.length>0){if(e.forEach(i=>o.push(i)),Math.max(...n)>e.length)throw new Error("axes is out of bound");n.forEach((i,a)=>o[i]=r[a])}else r.forEach(i=>o.push(i));else{if(t.length===0)throw new Error("Resize requires either scales or sizes.");o=e.map((i,a)=>Math.round(i*t[a]))}return o},Nf=(e,t,r)=>{let n=(()=>{switch(r.keepAspectRatioPolicy){case"not_larger":return r.axes.length>0?Math.min(...r.axes.map(i=>t[i]),Number.MAX_VALUE):Math.min(...t,Number.MAX_VALUE);case"not_smaller":return r.axes.length>0?Math.max(...r.axes.map(i=>t[i]),Number.MIN_VALUE):Math.max(...t,Number.MIN_VALUE);default:throw new Error(`Keep aspect ratio policy ${r.keepAspectRatioPolicy} is not supported`)}})();t.fill(1,0,t.length);let o=e.slice();return r.axes.length>0?(r.axes.forEach(i=>t[i]=n),r.axes.forEach(i=>o[i]=Math.round(e[i]*t[i]))):(t.fill(n,0,t.length),o.forEach((i,a)=>o[a]=Math.round(i*t[a]))),o},Wf=(e,t,r,n,o)=>` + return offset + ((${t}(xResized) + 0.5) / ${t}(xScale)) - 0.5;`;case"half_pixel":return`return ((${t}(xResized) + 0.5) / ${t}(xScale)) - 0.5;`;default:throw new Error(`Coordinate transform mode ${e} is not supported`)}})()+"}",Vf=(e,t,r)=>`fn getNearestPixelFromOriginal(xOriginal: ${r}, isDownSample: bool) -> ${r} {`+(()=>{switch(e){case"round_prefer_ceil":return"if (fract(xOriginal) == 0.5) { return ceil(xOriginal); } else { return round(xOriginal); }";case"floor":return"return floor(xOriginal);";case"ceil":return"return ceil(xOriginal);";case"round_prefer_floor":return"if (fract(xOriginal) == 0.5) { return floor(xOriginal); } else { return round(xOriginal); }";case"simple":default:if(t<11)return"if (isDownSample) { return ceil(xOriginal); } else { return xOriginal; }";throw new Error(`Nearest mode ${e} is not supported`)}})()+"}",Nf=(e,t,r)=>{let n=new Array(r).fill(0).concat(new Array(r).fill(1)),o=e.length===0?n:e.slice();return t.length>0?(t.forEach((i,a)=>{n[i]=o[a],n[a+r]=o[t.length+a]}),n):o},Wf=(e,t,r,n)=>{let o=[];if(r.length>0)if(n.length>0){if(e.forEach(i=>o.push(i)),Math.max(...n)>e.length)throw new Error("axes is out of bound");n.forEach((i,a)=>o[i]=r[a])}else r.forEach(i=>o.push(i));else{if(t.length===0)throw new Error("Resize requires either scales or sizes.");o=e.map((i,a)=>Math.round(i*t[a]))}return o},Hf=(e,t,r)=>{let n=(()=>{switch(r.keepAspectRatioPolicy){case"not_larger":return r.axes.length>0?Math.min(...r.axes.map(i=>t[i]),Number.MAX_VALUE):Math.min(...t,Number.MAX_VALUE);case"not_smaller":return r.axes.length>0?Math.max(...r.axes.map(i=>t[i]),Number.MIN_VALUE):Math.max(...t,Number.MIN_VALUE);default:throw new Error(`Keep aspect ratio policy ${r.keepAspectRatioPolicy} is not supported`)}})();t.fill(1,0,t.length);let o=e.slice();return r.axes.length>0?(r.axes.forEach(i=>t[i]=n),r.axes.forEach(i=>o[i]=Math.round(e[i]*t[i]))):(t.fill(n,0,t.length),o.forEach((i,a)=>o[a]=Math.round(i*t[a]))),o},Gf=(e,t,r,n,o)=>` fn calculateOriginalIndicesFromOutputIndices(output_indices: ${e.type.indices}) -> array<${e.type.value}, ${r.length}> { var original_indices: array<${e.type.value}, ${r.length}>; for (var i:u32 = 0; i < ${r.length}; i++) { @@ -2078,7 +2078,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; } } return original_indices; - }`,Hf=(e,t,r,n,o,i,a)=>` + }`,Lf=(e,t,r,n,o,i,a)=>` fn calculateInputIndicesFromOutputIndices(output_indices: ${t.type.indices}) -> ${e.type.indices} { var input_indices: ${e.type.indices}; for (var i:u32 = 0; i < ${n.length}; i++) { @@ -2109,7 +2109,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; ${e.indicesSet("input_indices","i"," input_index")} } return input_indices; - }`,Gf=(e,t)=>` + }`,Ff=(e,t)=>` fn checkInputIndices(input_indices: ${e.type.indices}) -> bool { for (var i:u32 = 0; i < ${t.length}; i++) { var input_index = ${e.indicesGet("input_indices","i")}; @@ -2121,7 +2121,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; }`,el=(e,t,r,n)=>e.rank>n?` ${e.indicesSet("input_indices",t,"channel")}; ${e.indicesSet("input_indices",r,"batch")}; -`:"",Lf=(e,t,r,n,o)=>{let[a,l,d,p]=r.length===2?[-1,0,1,-1]:[0,2,3,1],m=e.type.value;return` +`:"",qf=(e,t,r,n,o)=>{let[a,l,d,p]=r.length===2?[-1,0,1,-1]:[0,2,3,1],m=e.type.value;return` fn getInputValue(batch: u32, channel: u32, row: u32, col: u32) -> ${m} { var input_indices: ${e.type.indices}; ${e.indicesSet("input_indices",l,`max(0, min(row, ${r[l]} - 1))`)}; @@ -2162,7 +2162,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; dy2 = 0.5; } return (x11 * dx2 * dy2 + x12 * dx2 * dy1 + x21 * dx1 * dy2 + x22 * dx1 * dy1); - }`},Ff=(e,t,r,n,o,i,a,l,d,p)=>{let m=r.length===2,u=!0,[h,w]=m?[0,1]:u?[2,3]:[1,2],g=e.type.value,b=x=>{let _=x===h?"row":"col";return` + }`},jf=(e,t,r,n,o,i,a,l,d,p)=>{let m=r.length===2,u=!0,[h,w]=m?[0,1]:u?[2,3]:[1,2],g=e.type.value,b=x=>{let _=x===h?"row":"col";return` fn ${_}CubicInterpolation(input_indices: ${e.type.indices}, output_indices: ${t.type.indices}) -> ${g} { var output_index = ${t.indicesGet("output_indices",x)}; var originalIdx: ${g} = getOriginalCoordinateFromResizedCoordinate(output_index, ${o[x]}, @@ -2210,7 +2210,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; var input_indices: ${e.type.indices} = output_indices; return colCubicInterpolation(input_indices, output_indices); } - `},qf=(e,t,r,n,o)=>{let[a,l,d,p,m]=r.length===3?[-1,0,1,2,-1]:[0,2,3,4,1],u=e.type.value;return` + `},Kf=(e,t,r,n,o)=>{let[a,l,d,p,m]=r.length===3?[-1,0,1,2,-1]:[0,2,3,4,1],u=e.type.value;return` fn getInputValue(batch: u32, channel: u32, depth:u32, height: u32, width: u32) -> ${u} { var input_indices: ${e.type.indices}; ${e.indicesSet("input_indices",l,`max(0, min(depth, ${r[l]} - 1))`)}; @@ -2269,18 +2269,18 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; } return (x111 * dx2 * dy2 * dz2 + x112 * dx2 * dy2 * dz1 + x121 * dx2 * dy1 *dz2 + x122 * dx2 * dy1 * dz1 + x211 * dx1 * dy2 * dz2 + x212 * dx1 * dy2 * dz1 + x221 * dx1 * dy1 *dz2 + x222 * dx1 * dy1 * dz1); - }`},Kf=(e,t,r,n,o,i)=>{let a=e.dims,l=Uf(i,t.axes,a.length),d=Vf(a,n,o,t.axes),p=n.slice();n.length===0&&(p=a.map(($,S)=>$===0?1:d[S]/$),t.keepAspectRatioPolicy!=="stretch"&&(d=Nf(a,p,t)));let m=M("output",e.dataType,d.length),u=E("input",e.dataType,a.length),h=k.size(d),w=a.length===d.length&&a.every(($,S)=>$===d[S]),g=t.coordinateTransformMode==="tf_crop_and_resize",b=t.extrapolationValue,x=u.type.value,_=$=>` + }`},Yf=(e,t,r,n,o,i)=>{let a=e.dims,l=Nf(i,t.axes,a.length),d=Wf(a,n,o,t.axes),p=n.slice();n.length===0&&(p=a.map(($,S)=>$===0?1:d[S]/$),t.keepAspectRatioPolicy!=="stretch"&&(d=Hf(a,p,t)));let m=M("output",e.dataType,d.length),u=E("input",e.dataType,a.length),h=k.size(d),w=a.length===d.length&&a.every(($,S)=>$===d[S]),g=t.coordinateTransformMode==="tf_crop_and_resize",b=t.extrapolationValue,x=u.type.value,_=$=>` ${w?"":` - ${Rf(t.coordinateTransformMode,x)}; + ${Uf(t.coordinateTransformMode,x)}; ${(()=>{switch(t.mode){case"nearest":return` - ${Gf(u,a)}; - ${Mf(t.nearestMode,r,x)}; - ${Hf(u,m,a,d,p.length,l.length,g)}; + ${Ff(u,a)}; + ${Vf(t.nearestMode,r,x)}; + ${Lf(u,m,a,d,p.length,l.length,g)}; `;case"linear":return` - ${Wf(m,a,d,p.length,l.length)}; - ${(()=>{if(a.length===2||a.length===4)return`${Lf(u,m,a,g,b)}`;if(a.length===3||a.length===5)return`${qf(u,m,a,g,b)}`;throw Error("Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.")})()}; + ${Gf(m,a,d,p.length,l.length)}; + ${(()=>{if(a.length===2||a.length===4)return`${qf(u,m,a,g,b)}`;if(a.length===3||a.length===5)return`${Kf(u,m,a,g,b)}`;throw Error("Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.")})()}; `;case"cubic":return` - ${(()=>{if(a.length===2||a.length===4)return`${Ff(u,m,a,d,p,l,t.cubicCoeffA,g,t.extrapolationValue,t.excludeOutside)}`;throw Error("Cubic mode only supports input dims 2 and 4 are supported in linear mode.")})()}; + ${(()=>{if(a.length===2||a.length===4)return`${jf(u,m,a,d,p,l,t.cubicCoeffA,g,t.extrapolationValue,t.excludeOutside)}`;throw Error("Cubic mode only supports input dims 2 and 4 are supported in linear mode.")})()}; `;default:throw Error("Invalid resize mode")}})()}; `} ${$.registerUniform("output_size","u32").registerUniform("scales","f32",p.length).registerUniform("roi","f32",l.length).declareVariables(u,m)} @@ -2296,7 +2296,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; output[global_idx] = ${t.extrapolationValue}; }`;case"linear":return`output[global_idx] = ${a.length===2||a.length===4?"bilinearInterpolation":"trilinearInterpolation"}(output_indices);`;case"cubic":return"output[global_idx] = bicubicInterpolation(output_indices);";default:throw Error(`Unsupported resize mode: ${t.mode}`)}})()}; `} - }`;return{name:"Resize",shaderCache:{hint:`${t.cacheKey}|${r}|${p.length>0?p:""}|${o.length>0?o:""}|${l.length>0?l:""}|${w}|${a}`,inputDependencies:["rank"]},getShaderSource:_,getRunData:()=>({outputs:[{dims:d,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(h/64)},programUniforms:[{type:12,data:h},{type:1,data:p},{type:1,data:l},...V(a,d)]})}},jf=e=>{let t=e.customDataBuffer;return new Uint32Array(t,t.byteOffset,1)[0]},tl=(e,t)=>{let r=[],n=[],o=[],i=jf(e);if(t.antialias!==0)throw Error("Only default value (0) for Antialias attribute is supported");Bf(e.inputs,t,i,r,n,o),e.compute(Kf(e.inputs[0],t,i,r,n,o),{inputs:[0]})},rl=e=>{let t=e.antialias,r=e.axes,n=e.coordinateTransformMode,o=e.cubicCoeffA,i=e.excludeOutside!==0,a=e.extrapolationValue,l=e.keepAspectRatioPolicy,d=e.mode,p=e.nearestMode===""?"simple":e.nearestMode;return te({antialias:t,axes:r,coordinateTransformMode:n,cubicCoeffA:o,excludeOutside:i,extrapolationValue:a,keepAspectRatioPolicy:l,mode:d,nearestMode:p})}});var Yf,Xf,ol,il=U(()=>{"use strict";Q();ae();Ce();oe();Yf=(e,t)=>{let[r,n,o,i]=e,{numHeads:a,rotaryEmbeddingDim:l}=t;if(r.dims.length!==3&&r.dims.length!==4)throw new Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${r.dims.length}`);if(!k.areEqual(n.dims,[])&&!k.areEqual(n.dims,[1])&&n.dims.length!==2)throw new Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${n.dims.length}`);if(o.dims.length!==2)throw new Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${o.dims.length}`);if(i.dims.length!==2)throw new Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${i.dims.length}`);if(!k.areEqual(o.dims,i.dims))throw new Error("Inputs 'cos_cache' and 'sin_cache' are expected to have the same shape");if(l>0&&a===0)throw new Error("num_heads must be provided if rotary_embedding_dim is specified");let d=r.dims[0],p=r.dims[r.dims.length-2],m=o.dims[0],u=k.sizeFromDimension(r.dims,1)/p,h=l===0?o.dims[1]*2:u/a;if(l>h)throw new Error("rotary_embedding_dim must be less than or equal to head_size");if(n.dims.length===2){if(d!==n.dims[0])throw new Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${n.dims[0]}`);if(p!==n.dims[1])throw new Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${n.dims[1]}`)}if(h/2!==o.dims[1]&&l/2!==o.dims[1])throw new Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${o.dims[1]}`);if(p>m)throw new Error("Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported")},Xf=(e,t)=>{let{interleaved:r,numHeads:n,rotaryEmbeddingDim:o,scale:i}=t,a=e[0].dims[0],l=k.sizeFromDimension(e[0].dims,1),d=e[0].dims[e[0].dims.length-2],p=l/d,m=e[2].dims[1],u=o===0?m*2:p/n,h=new Array(a,d,p/u,u-m),w=k.computeStrides(h),g=[{type:1,data:i},{type:12,data:h},{type:12,data:w},...e[0].dims.length===3?new Array({type:12,data:[l,p,u,1]}):[],...e[0].dims.length===4?new Array({type:12,data:[l,u,d*u,1]}):[],...V(e[0].dims,e[1].dims,e[2].dims,e[3].dims,e[0].dims)],b=x=>{let _=E("input",e[0].dataType,e[0].dims.length),$=E("position_ids",e[1].dataType,e[1].dims.length),S=E("cos_cache",e[2].dataType,e[2].dims.length),I=E("sin_cache",e[3].dataType,e[3].dims.length),T=M("output",e[0].dataType,e[0].dims.length);return x.registerUniforms([{name:"scale",type:"f32"},{name:"global_shape",type:"u32",length:h.length},{name:"global_strides",type:"u32",length:w.length},{name:"input_output_strides",type:"u32",length:w.length}]),` + }`;return{name:"Resize",shaderCache:{hint:`${t.cacheKey}|${r}|${p.length>0?p:""}|${o.length>0?o:""}|${l.length>0?l:""}|${w}|${a}`,inputDependencies:["rank"]},getShaderSource:_,getRunData:()=>({outputs:[{dims:d,dataType:e.dataType}],dispatchGroup:{x:Math.ceil(h/64)},programUniforms:[{type:12,data:h},{type:1,data:p},{type:1,data:l},...V(a,d)]})}},Xf=e=>{let t=e.customDataBuffer;return new Uint32Array(t,t.byteOffset,1)[0]},tl=(e,t)=>{let r=[],n=[],o=[],i=Xf(e);if(t.antialias!==0)throw Error("Only default value (0) for Antialias attribute is supported");Mf(e.inputs,t,i,r,n,o),e.compute(Yf(e.inputs[0],t,i,r,n,o),{inputs:[0]})},rl=e=>{let t=e.antialias,r=e.axes,n=e.coordinateTransformMode,o=e.cubicCoeffA,i=e.excludeOutside!==0,a=e.extrapolationValue,l=e.keepAspectRatioPolicy,d=e.mode,p=e.nearestMode===""?"simple":e.nearestMode;return te({antialias:t,axes:r,coordinateTransformMode:n,cubicCoeffA:o,excludeOutside:i,extrapolationValue:a,keepAspectRatioPolicy:l,mode:d,nearestMode:p})}});var Zf,Qf,ol,il=U(()=>{"use strict";Q();ae();Ce();oe();Zf=(e,t)=>{let[r,n,o,i]=e,{numHeads:a,rotaryEmbeddingDim:l}=t;if(r.dims.length!==3&&r.dims.length!==4)throw new Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${r.dims.length}`);if(!k.areEqual(n.dims,[])&&!k.areEqual(n.dims,[1])&&n.dims.length!==2)throw new Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${n.dims.length}`);if(o.dims.length!==2)throw new Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${o.dims.length}`);if(i.dims.length!==2)throw new Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${i.dims.length}`);if(!k.areEqual(o.dims,i.dims))throw new Error("Inputs 'cos_cache' and 'sin_cache' are expected to have the same shape");if(l>0&&a===0)throw new Error("num_heads must be provided if rotary_embedding_dim is specified");let d=r.dims[0],p=r.dims[r.dims.length-2],m=o.dims[0],u=k.sizeFromDimension(r.dims,1)/p,h=l===0?o.dims[1]*2:u/a;if(l>h)throw new Error("rotary_embedding_dim must be less than or equal to head_size");if(n.dims.length===2){if(d!==n.dims[0])throw new Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${n.dims[0]}`);if(p!==n.dims[1])throw new Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${n.dims[1]}`)}if(h/2!==o.dims[1]&&l/2!==o.dims[1])throw new Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${o.dims[1]}`);if(p>m)throw new Error("Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported")},Qf=(e,t)=>{let{interleaved:r,numHeads:n,rotaryEmbeddingDim:o,scale:i}=t,a=e[0].dims[0],l=k.sizeFromDimension(e[0].dims,1),d=e[0].dims[e[0].dims.length-2],p=l/d,m=e[2].dims[1],u=o===0?m*2:p/n,h=new Array(a,d,p/u,u-m),w=k.computeStrides(h),g=[{type:1,data:i},{type:12,data:h},{type:12,data:w},...e[0].dims.length===3?new Array({type:12,data:[l,p,u,1]}):[],...e[0].dims.length===4?new Array({type:12,data:[l,u,d*u,1]}):[],...V(e[0].dims,e[1].dims,e[2].dims,e[3].dims,e[0].dims)],b=x=>{let _=E("input",e[0].dataType,e[0].dims.length),$=E("position_ids",e[1].dataType,e[1].dims.length),S=E("cos_cache",e[2].dataType,e[2].dims.length),I=E("sin_cache",e[3].dataType,e[3].dims.length),T=M("output",e[0].dataType,e[0].dims.length);return x.registerUniforms([{name:"scale",type:"f32"},{name:"global_shape",type:"u32",length:h.length},{name:"global_strides",type:"u32",length:w.length},{name:"input_output_strides",type:"u32",length:w.length}]),` ${x.declareVariables(_,$,S,I,T)} ${x.mainStart(Tt)} @@ -2322,9 +2322,9 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; let k = dot(bsnh, uniforms.input_output_strides) + half_rotary_emb_dim; ${T.setByOffset("k",_.getByOffset("k"))} } - }`};return{name:"RotaryEmbedding",shaderCache:{hint:te({interleaved:r}).cacheKey,inputDependencies:["rank","rank","rank","rank"]},getShaderSource:b,getRunData:()=>({outputs:[{dims:e[0].dims,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(k.size(h)/Tt)},programUniforms:g})}},ol=(e,t)=>{Yf(e.inputs,t),e.compute(Xf(e.inputs,t))}});var Zf,Qf,al,sl=U(()=>{"use strict";Q();ae();oe();Zf=e=>{if(!e||e.length<3)throw new Error("layerNorm requires at least 3 inputs.");let t=e[0],r=e[1],n=e[2];if(t.dataType!==r.dataType||t.dataType!==n.dataType)throw new Error("All inputs must have the same data type");if(t.dims.length!==3&&t.dims.length!==2)throw new Error("Input must be 2D or 3D");if(r.dims.length!==3&&r.dims.length!==2)throw new Error("Skip must be 2D or 3D");let o=t.dims[t.dims.length-1],i=t.dims[t.dims.length-2];if(r.dims[r.dims.length-1]!==o)throw new Error("Skip must have the same hidden size as input");if(r.dims[r.dims.length-2]!==i)throw new Error("Skip must have the same sequence length as input");if(n.dims.length!==1)throw new Error("Gamma must be 1D");if(n.dims[n.dims.length-1]!==o)throw new Error("Gamma must have the same hidden size as input");if(e.length>3){let a=e[3];if(a.dims.length!==1)throw new Error("Beta must be 1D");if(a.dims[a.dims.length-1]!==o)throw new Error("Beta must have the same hidden size as input")}if(e.length>4){let a=e[4];if(a.dims.length!==1)throw new Error("Bias must be 1D");if(a.dims[a.dims.length-1]!==o)throw new Error("Bias must have the same hidden size as input")}},Qf=(e,t,r,n)=>{let o=t.simplified,i=e[0].dims,a=k.size(i),l=i,d=a,p=i.slice(-1)[0],m=n?i.slice(0,-1).concat(1):[],u=!o&&e.length>3,h=e.length>4,w=n&&r>1,g=n&&r>2,b=r>3,x=64,_=we(p),$=[{type:12,data:d},{type:12,data:_},{type:12,data:p},{type:1,data:t.epsilon}],S=T=>{let A=[{name:"output_size",type:"u32"},{name:"components",type:"u32"},{name:"hidden_size",type:"u32"},{name:"epsilon",type:"f32"}],z=[E("x",e[0].dataType,e[0].dims,_),E("skip",e[1].dataType,e[1].dims,_),E("gamma",e[2].dataType,e[2].dims,_)];u&&z.push(E("beta",e[3].dataType,e[3].dims,_)),h&&z.push(E("bias",e[4].dataType,e[4].dims,_)),z.push(M("output",e[0].dataType,l,_)),w&&z.push(M("mean_output",1,m)),g&&z.push(M("inv_std_output",1,m)),b&&z.push(M("input_skip_bias_sum",e[0].dataType,l,_));let D=he(e[0].dataType),H=he(1,_);return` + }`};return{name:"RotaryEmbedding",shaderCache:{hint:te({interleaved:r}).cacheKey,inputDependencies:["rank","rank","rank","rank"]},getShaderSource:b,getRunData:()=>({outputs:[{dims:e[0].dims,dataType:e[0].dataType}],dispatchGroup:{x:Math.ceil(k.size(h)/Tt)},programUniforms:g})}},ol=(e,t)=>{Zf(e.inputs,t),e.compute(Qf(e.inputs,t))}});var Jf,eh,al,sl=U(()=>{"use strict";Q();ae();oe();Jf=e=>{if(!e||e.length<3)throw new Error("layerNorm requires at least 3 inputs.");let t=e[0],r=e[1],n=e[2];if(t.dataType!==r.dataType||t.dataType!==n.dataType)throw new Error("All inputs must have the same data type");if(t.dims.length!==3&&t.dims.length!==2)throw new Error("Input must be 2D or 3D");if(r.dims.length!==3&&r.dims.length!==2)throw new Error("Skip must be 2D or 3D");let o=t.dims[t.dims.length-1],i=t.dims[t.dims.length-2];if(r.dims[r.dims.length-1]!==o)throw new Error("Skip must have the same hidden size as input");if(r.dims[r.dims.length-2]!==i)throw new Error("Skip must have the same sequence length as input");if(n.dims.length!==1)throw new Error("Gamma must be 1D");if(n.dims[n.dims.length-1]!==o)throw new Error("Gamma must have the same hidden size as input");if(e.length>3){let a=e[3];if(a.dims.length!==1)throw new Error("Beta must be 1D");if(a.dims[a.dims.length-1]!==o)throw new Error("Beta must have the same hidden size as input")}if(e.length>4){let a=e[4];if(a.dims.length!==1)throw new Error("Bias must be 1D");if(a.dims[a.dims.length-1]!==o)throw new Error("Bias must have the same hidden size as input")}},eh=(e,t,r,n)=>{let o=t.simplified,i=e[0].dims,a=k.size(i),l=i,d=a,p=i.slice(-1)[0],m=n?i.slice(0,-1).concat(1):[],u=!o&&e.length>3,h=e.length>4,w=n&&r>1,g=n&&r>2,b=r>3,x=64,_=we(p),$=[{type:12,data:d},{type:12,data:_},{type:12,data:p},{type:1,data:t.epsilon}],S=T=>{let A=[{name:"output_size",type:"u32"},{name:"components",type:"u32"},{name:"hidden_size",type:"u32"},{name:"epsilon",type:"f32"}],D=[E("x",e[0].dataType,e[0].dims,_),E("skip",e[1].dataType,e[1].dims,_),E("gamma",e[2].dataType,e[2].dims,_)];u&&D.push(E("beta",e[3].dataType,e[3].dims,_)),h&&D.push(E("bias",e[4].dataType,e[4].dims,_)),D.push(M("output",e[0].dataType,l,_)),w&&D.push(M("mean_output",1,m)),g&&D.push(M("inv_std_output",1,m)),b&&D.push(M("input_skip_bias_sum",e[0].dataType,l,_));let z=he(e[0].dataType),H=he(1,_);return` - ${T.registerUniforms(A).declareVariables(...z)} + ${T.registerUniforms(A).declareVariables(...D)} var sum_shared : array<${H}, ${x}>; var sum_squared_shared : array<${H}, ${x}>; @@ -2341,12 +2341,12 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; } for (var i: u32 = 0; i < stride; i++) { let skip_value = skip[offset + i]; - let bias_value = ${h?"bias[offset1d + i]":D+"(0.0)"}; + let bias_value = ${h?"bias[offset1d + i]":z+"(0.0)"}; let input_value = x[offset + i]; let value = input_value + skip_value + bias_value; ${b?"input_skip_bias_sum[offset + i] = value;":""} output[offset + i] = value; - let f32_value = ${At(D,_,"value")}; + let f32_value = ${At(z,_,"value")}; sum_shared[ix] += f32_value; sum_squared_shared[ix] += f32_value * f32_value; } @@ -2370,11 +2370,11 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; ${g?"inv_std_output[global_idx] = inv_std_dev;":""} for (var i: u32 = 0; i < stride; i++) { - output[offset + i] = (output[offset + i] ${o?"":`- ${D}(mean)`}) * - ${D}(inv_std_dev) * gamma[offset1d + i] + output[offset + i] = (output[offset + i] ${o?"":`- ${z}(mean)`}) * + ${z}(inv_std_dev) * gamma[offset1d + i] ${u?"+ beta[offset1d + i]":""}; } - }`},I=[{dims:l,dataType:e[0].dataType}];return r>1&&I.push({dims:m,dataType:1}),r>2&&I.push({dims:m,dataType:1}),r>3&&I.push({dims:i,dataType:e[0].dataType}),{name:"SkipLayerNormalization",shaderCache:{hint:`${_};${w};${g};${b}`,inputDependencies:e.map((T,A)=>"type")},getShaderSource:S,getRunData:()=>({outputs:I,dispatchGroup:{x:Math.ceil(d/p)},programUniforms:$})}},al=(e,t)=>{Zf(e.inputs);let n=[0];e.outputCount>1&&n.push(-3),e.outputCount>2&&n.push(-3),e.outputCount>3&&n.push(3),e.compute(Qf(e.inputs,t,e.outputCount,!1),{outputs:n})}});var Jf,on,eh,ul,th,rh,dl,ll,cl=U(()=>{"use strict";Q();ae();Ce();oe();Jf=(e,t)=>{if(!e||e.length<1)throw new Error("too few inputs");if(t.axes.length!==0){if(t.axes.length!==t.starts.length||t.axes.length!==t.ends.length)throw new Error("axes, starts and ends must have the same length")}else if(t.starts.length!==t.ends.length)throw new Error("starts and ends must have the same length");e.slice(1).forEach((r,n)=>{if(e[n+1].dataType!==6&&e[n+1].dataType!==7)throw new Error(`Input ${n} must be an array of int32 or int64`)})},on=(e,t)=>{let r=[];if(e.length>t)if(e[t].dataType===7)e[t].getBigInt64Array().forEach(n=>r.push(Number(n)));else if(e[t].dataType===6)e[t].getInt32Array().forEach(n=>r.push(Number(n)));else throw new Error(`Input ${t} must be an array of int32 or int64`);return r},eh=(e,t)=>{if(e.length>1){let r=on(e,1),n=on(e,2),o=on(e,3);return o.length===0&&(o=[...Array(e[0].dims.length).keys()]),te({starts:r,ends:n,axes:o})}else return t},ul=(e,t,r,n,o)=>{let i=e;return e<0&&(i+=r[n[t]]),o[t]<0?Math.max(0,Math.min(i,r[n[t]]-1)):Math.max(0,Math.min(i,r[n[t]]))},th=(e,t,r)=>`fn calculateInputIndices(output_indices: ${t.type.indices}) -> ${e.type.indices} { + }`},I=[{dims:l,dataType:e[0].dataType}];return r>1&&I.push({dims:m,dataType:1}),r>2&&I.push({dims:m,dataType:1}),r>3&&I.push({dims:i,dataType:e[0].dataType}),{name:"SkipLayerNormalization",shaderCache:{hint:`${_};${w};${g};${b}`,inputDependencies:e.map((T,A)=>"type")},getShaderSource:S,getRunData:()=>({outputs:I,dispatchGroup:{x:Math.ceil(d/p)},programUniforms:$})}},al=(e,t)=>{Jf(e.inputs);let n=[0];e.outputCount>1&&n.push(-3),e.outputCount>2&&n.push(-3),e.outputCount>3&&n.push(3),e.compute(eh(e.inputs,t,e.outputCount,!1),{outputs:n})}});var th,on,rh,ul,nh,oh,dl,ll,cl=U(()=>{"use strict";Q();ae();Ce();oe();th=(e,t)=>{if(!e||e.length<1)throw new Error("too few inputs");if(t.axes.length!==0){if(t.axes.length!==t.starts.length||t.axes.length!==t.ends.length)throw new Error("axes, starts and ends must have the same length")}else if(t.starts.length!==t.ends.length)throw new Error("starts and ends must have the same length");e.slice(1).forEach((r,n)=>{if(e[n+1].dataType!==6&&e[n+1].dataType!==7)throw new Error(`Input ${n} must be an array of int32 or int64`)})},on=(e,t)=>{let r=[];if(e.length>t)if(e[t].dataType===7)e[t].getBigInt64Array().forEach(n=>r.push(Number(n)));else if(e[t].dataType===6)e[t].getInt32Array().forEach(n=>r.push(Number(n)));else throw new Error(`Input ${t} must be an array of int32 or int64`);return r},rh=(e,t)=>{if(e.length>1){let r=on(e,1),n=on(e,2),o=on(e,3);return o.length===0&&(o=[...Array(e[0].dims.length).keys()]),te({starts:r,ends:n,axes:o})}else return t},ul=(e,t,r,n,o)=>{let i=e;return e<0&&(i+=r[n[t]]),o[t]<0?Math.max(0,Math.min(i,r[n[t]]-1)):Math.max(0,Math.min(i,r[n[t]]))},nh=(e,t,r)=>`fn calculateInputIndices(output_indices: ${t.type.indices}) -> ${e.type.indices} { var input_indices: ${e.type.indices}; var carry = 0u; for (var i = ${r.length}; i >= 0; i--) { @@ -2392,15 +2392,15 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; ${e.indicesSet("input_indices","i","input_index")}; } return input_indices; - }`,rh=(e,t)=>{let r=e[0].dims,n=k.size(r),o=t.axes.length>0?k.normalizeAxes(t.axes,r.length):[...Array(r.length).keys()],i=on(e,4);i.forEach(_=>_!==0||(()=>{throw new Error("step cannot be 0")})),i.length===0&&(i=Array(o.length).fill(1));let a=t.starts.map((_,$)=>ul(_,$,r,o,i)),l=t.ends.map((_,$)=>ul(_,$,r,o,i));if(o.length!==a.length||o.length!==l.length)throw new Error("start, ends and axes should have the same number of elements");if(o.length!==r.length)for(let _=0;_Math.sign(_));i.forEach((_,$,S)=>{if(_<0){let I=(l[$]-a[$])/_,T=a[$],A=T+I*i[$];a[$]=A,l[$]=T,S[$]=-_}});let p=r.slice(0);o.forEach((_,$)=>{p[_]=Math.ceil((l[_]-a[_])/i[_])});let m={dims:p,dataType:e[0].dataType},u=M("output",e[0].dataType,p.length),h=E("input",e[0].dataType,e[0].dims.length),w=k.size(p),g=[{name:"outputSize",type:"u32"},{name:"starts",type:"u32",length:a.length},{name:"signs",type:"i32",length:d.length},{name:"steps",type:"u32",length:i.length}],b=[{type:12,data:w},{type:12,data:a},{type:6,data:d},{type:12,data:i},...V(e[0].dims,p)],x=_=>` + }`,oh=(e,t)=>{let r=e[0].dims,n=k.size(r),o=t.axes.length>0?k.normalizeAxes(t.axes,r.length):[...Array(r.length).keys()],i=on(e,4);i.forEach(_=>_!==0||(()=>{throw new Error("step cannot be 0")})),i.length===0&&(i=Array(o.length).fill(1));let a=t.starts.map((_,$)=>ul(_,$,r,o,i)),l=t.ends.map((_,$)=>ul(_,$,r,o,i));if(o.length!==a.length||o.length!==l.length)throw new Error("start, ends and axes should have the same number of elements");if(o.length!==r.length)for(let _=0;_Math.sign(_));i.forEach((_,$,S)=>{if(_<0){let I=(l[$]-a[$])/_,T=a[$],A=T+I*i[$];a[$]=A,l[$]=T,S[$]=-_}});let p=r.slice(0);o.forEach((_,$)=>{p[_]=Math.ceil((l[_]-a[_])/i[_])});let m={dims:p,dataType:e[0].dataType},u=M("output",e[0].dataType,p.length),h=E("input",e[0].dataType,e[0].dims.length),w=k.size(p),g=[{name:"outputSize",type:"u32"},{name:"starts",type:"u32",length:a.length},{name:"signs",type:"i32",length:d.length},{name:"steps",type:"u32",length:i.length}],b=[{type:12,data:w},{type:12,data:a},{type:6,data:d},{type:12,data:i},...V(e[0].dims,p)],x=_=>` ${_.registerUniforms(g).declareVariables(h,u)} - ${th(h,u,r)} + ${nh(h,u,r)} ${_.mainStart()} ${_.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} let output_indices = ${u.offsetToIndices("global_idx")}; let input_indices = calculateInputIndices(output_indices); ${u.setByOffset("global_idx",h.getByIndices("input_indices"))} - }`;return{name:"Slice",shaderCache:{hint:`${d.length}_${a.length}_${i.length}`,inputDependencies:["rank"]},getShaderSource:x,getRunData:()=>({outputs:[m],dispatchGroup:{x:Math.ceil(n/64)},programUniforms:b})}},dl=(e,t)=>{Jf(e.inputs,t);let r=eh(e.inputs,t);e.compute(rh(e.inputs,r),{inputs:[0]})},ll=e=>{let t=e.starts,r=e.ends,n=e.axes;return te({starts:t,ends:r,axes:n})}});var nh,oh,pl,ml,fl=U(()=>{"use strict";Q();ae();Ce();oe();nh=e=>{if(!e||e.length!==1)throw new Error("Softmax op requires 1 input.")},oh=(e,t)=>{let r=e.dims,n=k.size(r),o=64,i=t.axis;if(i<0&&(i=r.length+i),i_===4?`max(max(${x}.x, ${x}.y), max(${x}.z, ${x}.w))`:_===2?`max(${x}.x, ${x}.y)`:_===3?`max(max(${x}.x, ${x}.y), ${x}.z)`:x,u=E("x",e.dataType,e.dims,d),h=M("result",e.dataType,e.dims,d),w=u.type.value,g=he(e.dataType)==="f32"?`var threadMax = ${w}(-3.402823e+38f);`:`var threadMax = ${w}(-65504.0h);`,b=x=>` + }`;return{name:"Slice",shaderCache:{hint:`${d.length}_${a.length}_${i.length}`,inputDependencies:["rank"]},getShaderSource:x,getRunData:()=>({outputs:[m],dispatchGroup:{x:Math.ceil(n/64)},programUniforms:b})}},dl=(e,t)=>{th(e.inputs,t);let r=rh(e.inputs,t);e.compute(oh(e.inputs,r),{inputs:[0]})},ll=e=>{let t=e.starts,r=e.ends,n=e.axes;return te({starts:t,ends:r,axes:n})}});var ih,ah,pl,ml,fl=U(()=>{"use strict";Q();ae();Ce();oe();ih=e=>{if(!e||e.length!==1)throw new Error("Softmax op requires 1 input.")},ah=(e,t)=>{let r=e.dims,n=k.size(r),o=64,i=t.axis;if(i<0&&(i=r.length+i),i_===4?`max(max(${x}.x, ${x}.y), max(${x}.z, ${x}.w))`:_===2?`max(${x}.x, ${x}.y)`:_===3?`max(max(${x}.x, ${x}.y), ${x}.z)`:x,u=E("x",e.dataType,e.dims,d),h=M("result",e.dataType,e.dims,d),w=u.type.value,g=he(e.dataType)==="f32"?`var threadMax = ${w}(-3.402823e+38f);`:`var threadMax = ${w}(-65504.0h);`,b=x=>` var rowMaxShared : ${w}; var rowSumShared : ${w}; var threadShared : array<${w}, ${o}>; @@ -2472,7 +2472,7 @@ ${Pe}_indices[${ue}] = 0;`}),Y+=`${Pe}_indices[${J-2}] = 0u; let value = exp(getValue(row, col, row_stride) - rowMaxShared) / rowSumShared; setValue(row, col, row_stride, value); } - }`;return{name:"Softmax",shaderCache:{hint:`${d}`,inputDependencies:["type"]},getRunData:()=>({outputs:[{dims:r,dataType:e.dataType}],dispatchGroup:{x:l},programUniforms:[{type:6,data:p}]}),getShaderSource:b}},pl=(e,t)=>{nh(e.inputs),e.compute(oh(e.inputs[0],t))},ml=e=>te({axis:e.axis})});var ih,ah,sh,uh,dh,hl,gl,yl=U(()=>{"use strict";Q();ae();Ce();oe();ih=e=>{if(!e||e.length<1)throw new Error("too few inputs")},ah=(e,t)=>{let r=[],n=t.numOutputs;return e[1].dims[0]>0&&(e[1].getBigInt64Array().forEach(o=>r.push(Number(o))),n=r.length),te({numOutputs:n,axis:t.axis,splitSizes:r})},sh=e=>` + }`;return{name:"Softmax",shaderCache:{hint:`${d}`,inputDependencies:["type"]},getRunData:()=>({outputs:[{dims:r,dataType:e.dataType}],dispatchGroup:{x:l},programUniforms:[{type:6,data:p}]}),getShaderSource:b}},pl=(e,t)=>{ih(e.inputs),e.compute(ah(e.inputs[0],t))},ml=e=>te({axis:e.axis})});var sh,uh,dh,lh,ch,hl,gl,yl=U(()=>{"use strict";Q();ae();Ce();oe();sh=e=>{if(!e||e.length<1)throw new Error("too few inputs")},uh=(e,t)=>{let r=[],n=t.numOutputs;return e[1].dims[0]>0&&(e[1].getBigInt64Array().forEach(o=>r.push(Number(o))),n=r.length),te({numOutputs:n,axis:t.axis,splitSizes:r})},dh=e=>` fn calculateOutputIndex(index: u32) -> u32 { for (var i: u32 = 0u; i < ${e}u; i += 1u ) { if (index < ${G("uniforms.size_in_split_axis","i",e)}) { @@ -2480,14 +2480,14 @@ fn calculateOutputIndex(index: u32) -> u32 { } } return ${e}u; -}`,uh=e=>{let t=e.length,r=[];for(let n=0;n{let t=e.length,r=[];for(let n=0;n{let r=e[0].dims,n=k.size(r),o=e[0].dataType,i=k.normalizeAxis(t.axis,r.length),a=new Array(t.numOutputs),l=E("input",o,r.length),d=new Array(t.numOutputs),p=[],m=[],u=0,h=[{type:12,data:n}];for(let g=0;g` + }`},ch=(e,t)=>{let r=e[0].dims,n=k.size(r),o=e[0].dataType,i=k.normalizeAxis(t.axis,r.length),a=new Array(t.numOutputs),l=E("input",o,r.length),d=new Array(t.numOutputs),p=[],m=[],u=0,h=[{type:12,data:n}];for(let g=0;g` ${g.registerUniform("input_size","u32").registerUniform("size_in_split_axis","u32",d.length).declareVariables(l,...a)} - ${sh(d.length)} - ${uh(a)} + ${dh(d.length)} + ${lh(a)} ${g.mainStart()} ${g.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.input_size")} @@ -2500,7 +2500,7 @@ fn calculateOutputIndex(index: u32) -> u32 { ${l.indicesSet("indices",i,"index")}; } writeBufferData(output_number, indices, global_idx); - }`;return{name:"Split",shaderCache:{hint:t.cacheKey,inputDependencies:["rank"]},getShaderSource:w,getRunData:()=>({outputs:p,dispatchGroup:{x:Math.ceil(n/64)},programUniforms:h})}},hl=(e,t)=>{ih(e.inputs);let r=e.inputs.length===1?t:ah(e.inputs,t);e.compute(dh(e.inputs,r),{inputs:[0]})},gl=e=>{let t=e.axis,r=e.splitSizes,n=e.numOutputs<0?r.length:e.numOutputs;if(n!==r.length)throw new Error("numOutputs and splitSizes lengh must be equal");return te({axis:t,numOutputs:n,splitSizes:r})}});var lh,ch,bl,wl=U(()=>{"use strict";Q();ae();oe();lh=(e,t,r,n,o)=>{let i=M("output_data",o,r.length,4),a=E("a_data",t[1].dataType,t[1].dims.length,4),l=E("b_data",t[2].dataType,t[2].dims.length,4),d=E("c_data",t[0].dataType,t[0].dims.length,4),p,m=(u,h,w)=>`select(${h}, ${u}, ${w})`;if(!n)p=i.setByOffset("global_idx",m(a.getByOffset("global_idx"),l.getByOffset("global_idx"),d.getByOffset("global_idx")));else{let u=(h,w,g="")=>{let b=`a_data[index_a${w}][component_a${w}]`,x=`b_data[index_b${w}][component_b${w}]`,_=`bool(c_data[index_c${w}] & (0xffu << (component_c${w} * 8)))`;return` + }`;return{name:"Split",shaderCache:{hint:t.cacheKey,inputDependencies:["rank"]},getShaderSource:w,getRunData:()=>({outputs:p,dispatchGroup:{x:Math.ceil(n/64)},programUniforms:h})}},hl=(e,t)=>{sh(e.inputs);let r=e.inputs.length===1?t:uh(e.inputs,t);e.compute(ch(e.inputs,r),{inputs:[0]})},gl=e=>{let t=e.axis,r=e.splitSizes,n=e.numOutputs<0?r.length:e.numOutputs;if(n!==r.length)throw new Error("numOutputs and splitSizes lengh must be equal");return te({axis:t,numOutputs:n,splitSizes:r})}});var ph,mh,bl,wl=U(()=>{"use strict";Q();ae();oe();ph=(e,t,r,n,o)=>{let i=M("output_data",o,r.length,4),a=E("a_data",t[1].dataType,t[1].dims.length,4),l=E("b_data",t[2].dataType,t[2].dims.length,4),d=E("c_data",t[0].dataType,t[0].dims.length,4),p,m=(u,h,w)=>`select(${h}, ${u}, ${w})`;if(!n)p=i.setByOffset("global_idx",m(a.getByOffset("global_idx"),l.getByOffset("global_idx"),d.getByOffset("global_idx")));else{let u=(h,w,g="")=>{let b=`a_data[index_a${w}][component_a${w}]`,x=`b_data[index_b${w}][component_b${w}]`,_=`bool(c_data[index_c${w}] & (0xffu << (component_c${w} * 8)))`;return` let output_indices${w} = ${i.offsetToIndices(`global_idx * 4u + ${w}u`)}; let offset_a${w} = ${a.broadcastedIndicesToOffset(`output_indices${w}`,i)}; let offset_b${w} = ${l.broadcastedIndicesToOffset(`output_indices${w}`,i)}; @@ -2528,10 +2528,10 @@ fn calculateOutputIndex(index: u32) -> u32 { ${e.mainStart()} ${e.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} ${p} - }`},ch=e=>{let t=e[1].dims,r=e[2].dims,n=e[0].dims,o=e[1].dataType,i=!(k.areEqual(t,r)&&k.areEqual(r,n)),a=t,l=k.size(t);if(i){let p=tt.calcShape(tt.calcShape(t,r,!1),n,!1);if(!p)throw new Error("Can't perform where op on the given tensors");a=p,l=k.size(a)}let d=Math.ceil(l/4);return{name:"Where",shaderCache:{inputDependencies:["rank","rank","rank"]},getShaderSource:p=>lh(p,e,a,i,o),getRunData:()=>({outputs:[{dims:a,dataType:o}],dispatchGroup:{x:Math.ceil(l/64/4)},programUniforms:[{type:12,data:d},...V(n,t,r,a)]})}},bl=e=>{e.compute(ch(e.inputs))}});var vl,$l=U(()=>{"use strict";_s();qr();Is();Ts();pu();xu();Cu();uo();Lu();Ku();Xu();td();od();ad();dd();pd();hd();Id();Td();Ed();co();Od();vo();Dd();Zd();Jd();Lr();nl();il();sl();cl();fl();yl();_o();Et();jr();wl();vl=new Map([["Abs",[As]],["Acos",[Es]],["Acosh",[ks]],["Add",[mu]],["ArgMax",[$s,no]],["ArgMin",[vs,no]],["Asin",[Ps]],["Asinh",[Os]],["Atan",[zs]],["Atanh",[Ds]],["Attention",[xs]],["AveragePool",[Hd,Wd]],["BatchNormalization",[Ss]],["BiasAdd",[Cs]],["BiasSplitGelu",[cu]],["Cast",[Rs,Bs]],["Ceil",[Us]],["Clip",[Ms]],["Concat",[Su,Iu]],["Conv",[ho,fo]],["ConvTranspose",[Gu,Hu]],["Cos",[Vs]],["Cosh",[Ns]],["CumSum",[Fu,qu]],["DepthToSpace",[ju,Yu]],["Div",[fu]],["Einsum",[Ju,ed]],["Elu",[Ws,Zt]],["Equal",[hu]],["Erf",[Hs]],["Exp",[Gs]],["Expand",[nd]],["FastGelu",[id]],["Floor",[Ls]],["FusedConv",[ho,fo]],["Gather",[ud,sd]],["GatherElements",[cd,ld]],["Gelu",[Fs]],["Gemm",[fd,md]],["GlobalAveragePool",[Fd,Ld]],["GlobalMaxPool",[Xd,Yd]],["Greater",[wu]],["GreaterOrEqual",[$u]],["GroupQueryAttention",[Sd,xd]],["HardSigmoid",[Js,Qs]],["InstanceNormalization",[Cd]],["LayerNormalization",[Ad]],["LeakyRelu",[qs,Zt]],["Less",[vu]],["LessOrEqual",[_u]],["Log",[uu]],["MatMul",[Mu]],["MatMulNBits",[kd,Pd]],["MaxPool",[Kd,jd]],["Mul",[gu]],["MultiHeadAttention",[bd,yd]],["Neg",[js]],["Not",[Ks]],["Pad",[zd]],["Pow",[yu]],["QuickGelu",[du,Zt]],["Range",[Qd]],["Reciprocal",[Ys]],["ReduceMin",[fs]],["ReduceMean",[ds]],["ReduceMax",[ms]],["ReduceSum",[gs]],["ReduceProd",[hs]],["ReduceL1",[ls]],["ReduceL2",[cs]],["ReduceLogSum",[bs]],["ReduceLogSumExp",[ps]],["ReduceSumSquare",[ys]],["Relu",[Xs]],["Resize",[tl,rl]],["RotaryEmbedding",[ol]],["Sigmoid",[Zs]],["Sin",[eu]],["Sinh",[tu]],["Slice",[dl,ll]],["SkipLayerNormalization",[al]],["Split",[hl,gl]],["Sqrt",[ru]],["Softmax",[pl,ml]],["Sub",[bu]],["Tan",[nu]],["Tanh",[iu]],["ThresholdedRelu",[su,Zt]],["Tile",[vd]],["Transpose",[Xa,Za]],["Where",[bl]]])});var an,_l=U(()=>{"use strict";Le();dt();oe();an=class{constructor(t){this.backend=t;this.repo=new Map,this.attributesBound=!1}getArtifact(t){return this.repo.get(t)}setArtifact(t,r){this.repo.set(t,r)}run(t,r,n,o,i){We(t.programInfo.name);let a=this.backend.device,l=this.backend.getComputePassEncoder();this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2);let d=[];for(let m of r)d.push({binding:d.length,resource:{buffer:m.buffer}});for(let m of n)d.push({binding:d.length,resource:{buffer:m.buffer}});i&&d.push({binding:d.length,resource:i});let p=a.createBindGroup({layout:t.computePipeline.getBindGroupLayout(0),entries:d,label:t.programInfo.name});if(this.backend.sessionStatus==="capturing"){let m={kernelId:this.backend.currentKernelId,computePipeline:t.computePipeline,bindGroup:p,dispatchGroup:o};this.backend.capturedCommandList.get(this.backend.currentSessionId).push(m)}l.setPipeline(t.computePipeline),l.setBindGroup(0,p),l.dispatchWorkgroups(...o),this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2+1),this.backend.pendingDispatchNumber++,(this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber||this.backend.queryType==="at-passes")&&this.backend.endComputePass(),this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber&&this.backend.flush(),Me(t.programInfo.name)}dispose(){}build(t,r){We(t.name);let n=this.backend.device,o=[];n.features.has("shader-f16")&&o.push("enable f16;");let i=ja(r,this.backend.device.limits),a=t.getShaderSource(i),l=`${o.join(` + }`},mh=e=>{let t=e[1].dims,r=e[2].dims,n=e[0].dims,o=e[1].dataType,i=!(k.areEqual(t,r)&&k.areEqual(r,n)),a=t,l=k.size(t);if(i){let p=tt.calcShape(tt.calcShape(t,r,!1),n,!1);if(!p)throw new Error("Can't perform where op on the given tensors");a=p,l=k.size(a)}let d=Math.ceil(l/4);return{name:"Where",shaderCache:{inputDependencies:["rank","rank","rank"]},getShaderSource:p=>ph(p,e,a,i,o),getRunData:()=>({outputs:[{dims:a,dataType:o}],dispatchGroup:{x:Math.ceil(l/64/4)},programUniforms:[{type:12,data:d},...V(n,t,r,a)]})}},bl=e=>{e.compute(mh(e.inputs))}});var vl,$l=U(()=>{"use strict";_s();qr();Is();Ts();pu();xu();Cu();lo();Lu();ju();Xu();td();od();ad();dd();pd();hd();Id();Td();Ed();po();Od();$o();zd();Zd();Jd();Lr();nl();il();sl();cl();fl();yl();xo();Et();Kr();wl();vl=new Map([["Abs",[As]],["Acos",[Es]],["Acosh",[ks]],["Add",[mu]],["ArgMax",[$s,oo]],["ArgMin",[vs,oo]],["Asin",[Ps]],["Asinh",[Os]],["Atan",[Ds]],["Atanh",[zs]],["Attention",[xs]],["AveragePool",[Hd,Wd]],["BatchNormalization",[Ss]],["BiasAdd",[Cs]],["BiasSplitGelu",[cu]],["Cast",[Rs,Bs]],["Ceil",[Us]],["Clip",[Ms]],["Concat",[Su,Iu]],["Conv",[go,ho]],["ConvTranspose",[Gu,Hu]],["Cos",[Vs]],["Cosh",[Ns]],["CumSum",[Fu,qu]],["DepthToSpace",[Ku,Yu]],["Div",[fu]],["Einsum",[Ju,ed]],["Elu",[Ws,Zt]],["Equal",[hu]],["Erf",[Hs]],["Exp",[Gs]],["Expand",[nd]],["FastGelu",[id]],["Floor",[Ls]],["FusedConv",[go,ho]],["Gather",[ud,sd]],["GatherElements",[cd,ld]],["Gelu",[Fs]],["Gemm",[fd,md]],["GlobalAveragePool",[Fd,Ld]],["GlobalMaxPool",[Xd,Yd]],["Greater",[wu]],["GreaterOrEqual",[$u]],["GroupQueryAttention",[Sd,xd]],["HardSigmoid",[Js,Qs]],["InstanceNormalization",[Cd]],["LayerNormalization",[Ad]],["LeakyRelu",[qs,Zt]],["Less",[vu]],["LessOrEqual",[_u]],["Log",[uu]],["MatMul",[Mu]],["MatMulNBits",[kd,Pd]],["MaxPool",[jd,Kd]],["Mul",[gu]],["MultiHeadAttention",[bd,yd]],["Neg",[Ks]],["Not",[js]],["Pad",[Dd]],["Pow",[yu]],["QuickGelu",[du,Zt]],["Range",[Qd]],["Reciprocal",[Ys]],["ReduceMin",[fs]],["ReduceMean",[ds]],["ReduceMax",[ms]],["ReduceSum",[gs]],["ReduceProd",[hs]],["ReduceL1",[ls]],["ReduceL2",[cs]],["ReduceLogSum",[bs]],["ReduceLogSumExp",[ps]],["ReduceSumSquare",[ys]],["Relu",[Xs]],["Resize",[tl,rl]],["RotaryEmbedding",[ol]],["Sigmoid",[Zs]],["Sin",[eu]],["Sinh",[tu]],["Slice",[dl,ll]],["SkipLayerNormalization",[al]],["Split",[hl,gl]],["Sqrt",[ru]],["Softmax",[pl,ml]],["Sub",[bu]],["Tan",[nu]],["Tanh",[iu]],["ThresholdedRelu",[su,Zt]],["Tile",[vd]],["Transpose",[Xa,Za]],["Where",[bl]]])});var an,_l=U(()=>{"use strict";Le();dt();oe();an=class{constructor(t){this.backend=t;this.repo=new Map,this.attributesBound=!1}getArtifact(t){return this.repo.get(t)}setArtifact(t,r){this.repo.set(t,r)}run(t,r,n,o,i){We(t.programInfo.name);let a=this.backend.device,l=this.backend.getComputePassEncoder();this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2);let d=[];for(let m of r)d.push({binding:d.length,resource:{buffer:m.buffer}});for(let m of n)d.push({binding:d.length,resource:{buffer:m.buffer}});i&&d.push({binding:d.length,resource:i});let p=a.createBindGroup({layout:t.computePipeline.getBindGroupLayout(0),entries:d,label:t.programInfo.name});if(this.backend.sessionStatus==="capturing"){let m={kernelId:this.backend.currentKernelId,computePipeline:t.computePipeline,bindGroup:p,dispatchGroup:o};this.backend.capturedCommandList.get(this.backend.currentSessionId).push(m)}l.setPipeline(t.computePipeline),l.setBindGroup(0,p),l.dispatchWorkgroups(...o),this.backend.writeTimestamp(this.backend.pendingDispatchNumber*2+1),this.backend.pendingDispatchNumber++,(this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber||this.backend.queryType==="at-passes")&&this.backend.endComputePass(),this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber&&this.backend.flush(),Me(t.programInfo.name)}dispose(){}build(t,r){We(t.name);let n=this.backend.device,o=[];n.features.has("shader-f16")&&o.push("enable f16;");let i=Ka(r,this.backend.device.limits),a=t.getShaderSource(i),l=`${o.join(` `)} ${i.additionalImplementations} -${a}`,d=n.createShaderModule({code:l,label:t.name});be("verbose",()=>`[WebGPU] ${t.name} shader code: ${l}`);let p=n.createComputePipeline({compute:{module:d,entryPoint:"main"},layout:"auto",label:t.name});return Me(t.name),{programInfo:t,computePipeline:p,uniformVariablesInfo:i.variablesInfo}}normalizeDispatchGroupSize(t){let r=typeof t=="number"?t:t.x,n=typeof t=="number"?1:t.y||1,o=typeof t=="number"?1:t.z||1,i=this.backend.device.limits.maxComputeWorkgroupsPerDimension;if(r<=i&&n<=i&&o<=i)return[r,n,o];let a=r*n*o,l=Math.ceil(Math.sqrt(a));if(l>i){if(l=Math.ceil(Math.cbrt(a)),l>i)throw new Error("Total dispatch size exceeds WebGPU maximum.");return[l,l,l]}else return[l,l,1]}}});var ph,mh,xo,sn,xl=U(()=>{"use strict";Le();Q();dt();Ha();Ka();$l();_l();ph=(e,t)=>{if(t.length!==e.length)throw new Error(`inputDependencies length ${t.length} is not equal to inputTensors length ${e.length}.`);let r=[];for(let n=0;n{let n=e.name;return e.shaderCache?.hint&&(n+="["+e.shaderCache.hint+"]"),n+=":"+r+`:${ph(t,e.shaderCache?.inputDependencies??new Array(t.length).fill("dims"))}`,n},xo=class{constructor(t){t&&(this.architecture=t.architecture,this.vendor=t.vendor)}isArchitecture(t){return this.architecture===t}isVendor(t){return this.vendor===t}},sn=class{constructor(){this.currentSessionId=null;this.currentKernelId=null;this.commandEncoder=null;this.computePassEncoder=null;this.maxDispatchNumber=16;this.pendingDispatchNumber=0;this.pendingKernels=[];this.pendingQueries=new Map;this.sessionStatus="default";this.capturedCommandList=new Map;this.capturedPendingKernels=new Map;this.sessionExternalDataMapping=new Map}get currentKernelCustomData(){if(this.currentKernelId===null)throw new Error("currentKernelCustomData(): currentKernelId is null. (should not happen)");let t=this.kernelCustomData.get(this.currentKernelId);return t||(t={},this.kernelCustomData.set(this.currentKernelId,t)),t}async initialize(t,r){this.env=t;let n=[],o={requiredLimits:{maxComputeWorkgroupStorageSize:r.limits.maxComputeWorkgroupStorageSize,maxComputeWorkgroupsPerDimension:r.limits.maxComputeWorkgroupsPerDimension,maxStorageBufferBindingSize:r.limits.maxStorageBufferBindingSize,maxBufferSize:r.limits.maxBufferSize,maxComputeInvocationsPerWorkgroup:r.limits.maxComputeInvocationsPerWorkgroup,maxComputeWorkgroupSizeX:r.limits.maxComputeWorkgroupSizeX,maxComputeWorkgroupSizeY:r.limits.maxComputeWorkgroupSizeY,maxComputeWorkgroupSizeZ:r.limits.maxComputeWorkgroupSizeZ},requiredFeatures:n};r.features.has("chromium-experimental-timestamp-query-inside-passes")?n.push("chromium-experimental-timestamp-query-inside-passes"):r.features.has("timestamp-query")&&n.push("timestamp-query"),r.features.has("shader-f16")&&n.push("shader-f16"),this.device=await r.requestDevice(o),this.adapterInfo=new xo(r.info||await r.requestAdapterInfo()),this.gpuDataManager=qa(this),this.programManager=new an(this),this.kernels=new Map,this.kernelPersistentData=new Map,this.kernelCustomData=new Map,Na(t.logLevel,!!t.debug),this.device.onuncapturederror=i=>{i.error instanceof GPUValidationError&&console.error(`An uncaught WebGPU validation error was raised: ${i.error.message}`)},Object.defineProperty(this.env.webgpu,"device",{value:this.device,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(this.env.webgpu,"adapter",{value:r,writable:!1,enumerable:!0,configurable:!1}),this.setQueryType()}dispose(){typeof this.querySet<"u"&&this.querySet.destroy(),this.gpuDataManager.dispose()}getCommandEncoder(){return this.commandEncoder||(this.commandEncoder=this.device.createCommandEncoder()),this.commandEncoder}getComputePassEncoder(){if(!this.computePassEncoder){let t=this.getCommandEncoder(),r={};this.queryType==="at-passes"&&(r.timestampWrites={querySet:this.querySet,beginningOfPassWriteIndex:this.pendingDispatchNumber*2,endOfPassWriteIndex:this.pendingDispatchNumber*2+1}),this.computePassEncoder=t.beginComputePass(r)}return this.computePassEncoder}endComputePass(){this.computePassEncoder&&(this.computePassEncoder.end(),this.computePassEncoder=null)}flush(){if(!this.commandEncoder)return;We(),this.endComputePass();let t;this.queryType!=="none"&&(this.commandEncoder.resolveQuerySet(this.querySet,0,this.pendingDispatchNumber*2,this.queryResolveBuffer,0),t=this.device.createBuffer({size:this.pendingDispatchNumber*2*8,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),this.pendingQueries.set(t,this.pendingKernels),this.pendingKernels=[],this.commandEncoder.copyBufferToBuffer(this.queryResolveBuffer,0,t,0,this.pendingDispatchNumber*2*8)),this.device.queue.submit([this.commandEncoder.finish()]),this.gpuDataManager.refreshPendingBuffers(),this.commandEncoder=null,this.pendingDispatchNumber=0,this.queryType!=="none"&&t.mapAsync(GPUMapMode.READ).then(()=>{let r=new BigUint64Array(t.getMappedRange()),n=this.pendingQueries.get(t);for(let o=0;o"u"&&(this.queryTimeBase=w);let b=Number(w-this.queryTimeBase),x=Number(g-this.queryTimeBase);if(!Number.isSafeInteger(b)||!Number.isSafeInteger(x))throw new RangeError("incorrect timestamp range");if(this.env.webgpu.profiling?.ondata)this.env.webgpu.profiling.ondata({version:1,inputsMetadata:u.map(_=>({dims:_.dims,dataType:ht(_.dataType)})),outputsMetadata:h.map(_=>({dims:_.dims,dataType:ht(_.dataType)})),kernelId:a,kernelType:d,kernelName:p,programName:m,startTime:b,endTime:x});else{let _="";u.forEach((S,I)=>{_+=`input[${I}]: [${S.dims}] | ${ht(S.dataType)}, `});let $="";h.forEach((S,I)=>{$+=`output[${I}]: [${S.dims}] | ${ht(S.dataType)}, `}),console.log(`[profiling] kernel "${a}|${d}|${p}|${m}" ${_}${$}execution time: ${x-b} ns`)}xr("GPU",`${m}::${w}::${g}`)}t.unmap(),this.pendingQueries.delete(t)}),Me()}run(t,r,n,o,i,a){We(t.name);let l=[];for(let S=0;SI):n;if(u.length!==d.length)throw new Error(`Output size ${u.length} must be equal to ${d.length}.`);let h=[],w=[];for(let S=0;S=a)throw new Error(`Invalid output index: ${u[S]}`);if(u[S]===-3)continue;let I=u[S]===-1,T=u[S]===-2,A=I||T?i(d[S].dataType,d[S].dims):o(u[S],d[S].dataType,d[S].dims);if(h.push(A),A.data===0)continue;let z=this.gpuDataManager.get(A.data);if(!z)throw new Error(`no GPU data for output: ${A.data}`);if(I&&this.temporaryData.push(z),T){let D=this.kernelPersistentData.get(this.currentKernelId);D||(D=[],this.kernelPersistentData.set(this.currentKernelId,D)),D.push(z)}w.push(z)}if(l.length!==r.length||w.length!==h.length){if(w.length===0)return Me(t.name),h;throw new Error(`Program ${t.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`)}let g;if(m){let S=0,I=[];m.forEach(D=>{let H=typeof D.data=="number"?[D.data]:D.data;if(H.length===0)return;let W=D.type===10?2:4,F,de;D.type===10?(de=H.length>4?16:H.length>2?8:H.length*W,F=H.length>4?16:W*H.length):(de=H.length<=2?H.length*W:16,F=16),S=Math.ceil(S/de)*de,I.push(S);let ce=D.type===10?8:4;S+=H.length>4?Math.ceil(H.length/ce)*F:H.length*W});let T=16;S=Math.ceil(S/T)*T;let A=new ArrayBuffer(S);m.forEach((D,H)=>{let W=I[H],F=typeof D.data=="number"?[D.data]:D.data;if(D.type===6)new Int32Array(A,W,F.length).set(F);else if(D.type===12)new Uint32Array(A,W,F.length).set(F);else if(D.type===10)new Uint16Array(A,W,F.length).set(F);else if(D.type===1)new Float32Array(A,W,F.length).set(F);else throw new Error(`Unsupported uniform type: ${ht(D.type)}`)});let z=this.gpuDataManager.create(S,GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM);this.device.queue.writeBuffer(z.buffer,0,A,0,S),this.gpuDataManager.release(z.id),g={offset:0,size:S,buffer:z.buffer}}let b=this.programManager.normalizeDispatchGroupSize(p),x=b[1]===1&&b[2]===1,_=mh(t,r,x),$=this.programManager.getArtifact(_);if($||($=this.programManager.build(t,b),this.programManager.setArtifact(_,$),be("info",()=>`[artifact] key: ${_}, programName: ${t.name}`)),m&&$.uniformVariablesInfo){if(m.length!==$.uniformVariablesInfo.length)throw new Error(`Uniform variables count mismatch: expect ${$.uniformVariablesInfo.length}, got ${m.length} in program "${$.programInfo.name}".`);for(let S=0;S`[ProgramManager] run "${t.name}" (key=${_}) with ${b[0]}x${b[1]}x${b[2]}`),this.queryType!=="none"||this.sessionStatus==="capturing"){let S={kernelId:this.currentKernelId,programName:$.programInfo.name,inputTensorViews:r,outputTensorViews:h};this.pendingKernels.push(S),this.sessionStatus==="capturing"&&this.capturedPendingKernels.get(this.currentSessionId).push(S)}return this.programManager.run($,l,w,b,g),Me(t.name),h}upload(t,r){this.gpuDataManager.upload(t,r)}memcpy(t,r){this.gpuDataManager.memcpy(t,r)}async download(t,r){await this.gpuDataManager.download(t,r)}alloc(t){return this.gpuDataManager.create(t).id}free(t){return this.gpuDataManager.release(t)}createKernel(t,r,n,o){let i=vl.get(t);if(!i)throw new Error(`kernel not implemented: ${t}`);let a={kernelType:t,kernelName:o,kernelEntry:i[0],attributes:[i[1],n]};this.kernels.set(r,a)}releaseKernel(t){let r=this.kernelPersistentData.get(t);if(r){for(let n of r)this.gpuDataManager.release(n.id);this.kernelPersistentData.delete(t)}this.kernelCustomData.delete(t),this.kernels.delete(t)}computeKernel(t,r,n){let o=this.kernels.get(t);if(!o)throw new Error(`kernel not created: ${t}`);let i=o.kernelType,a=o.kernelName,l=o.kernelEntry,d=o.attributes;if(this.currentKernelId!==null)throw new Error(`kernel "[${i}] ${a}" is not allowed to be called recursively`);this.currentKernelId=t,d[0]&&(d[1]=d[0](d[1]),d[0]=void 0),be("info",()=>`[WebGPU] Start to run kernel "[${i}] ${a}"...`);let p=this.env.debug;this.temporaryData=[];try{return p&&this.device.pushErrorScope("validation"),l(r,d[1]),0}catch(m){return n.push(Promise.resolve(`[WebGPU] Kernel "[${i}] ${a}" failed. ${m}`)),1}finally{p&&n.push(this.device.popErrorScope().then(m=>m?`GPU validation error for kernel "[${i}] ${a}": ${m.message}`:null));for(let m of this.temporaryData)this.gpuDataManager.release(m.id);this.temporaryData=[],this.currentKernelId=null}}registerBuffer(t,r,n,o){let i=this.sessionExternalDataMapping.get(t);i||(i=new Map,this.sessionExternalDataMapping.set(t,i));let a=i.get(r),l=this.gpuDataManager.registerExternalBuffer(n,o,a?.[1]);return i.set(r,[l,n]),l}unregisterBuffers(t){let r=this.sessionExternalDataMapping.get(t);r&&(r.forEach(n=>this.gpuDataManager.unregisterExternalBuffer(n[1])),this.sessionExternalDataMapping.delete(t))}getBuffer(t){let r=this.gpuDataManager.get(t);if(!r)throw new Error(`no GPU data for buffer: ${t}`);return r.buffer}createDownloader(t,r,n){return async()=>{let o=await Xn(this,t,r);return Wa(o.buffer,n)}}writeTimestamp(t){this.queryType==="inside-passes"&&this.computePassEncoder.writeTimestamp(this.querySet,t)}setQueryType(){this.queryType="none",(this.env.webgpu.profiling?.mode==="default"||(typeof this.env.trace>"u"?this.env.wasm.trace:this.env.trace))&&(this.device.features.has("chromium-experimental-timestamp-query-inside-passes")?this.queryType="inside-passes":this.device.features.has("timestamp-query")&&(this.queryType="at-passes"),this.queryType!=="none"&&typeof this.querySet>"u"&&(this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxDispatchNumber*2}),this.queryResolveBuffer=this.device.createBuffer({size:this.maxDispatchNumber*2*8,usage:GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE})))}captureBegin(){be("info","captureBegin"),this.capturedCommandList.get(this.currentSessionId)||this.capturedCommandList.set(this.currentSessionId,[]),this.capturedPendingKernels.get(this.currentSessionId)||this.capturedPendingKernels.set(this.currentSessionId,[]),this.flush(),this.sessionStatus="capturing"}captureEnd(){be("info","captureEnd"),this.flush(),this.sessionStatus="default"}replay(){be("info","replay"),this.sessionStatus="replaying";let t=this.capturedCommandList.get(this.currentSessionId),r=this.capturedPendingKernels.get(this.currentSessionId),n=t.length;this.pendingKernels=[];for(let o=0;o=this.maxDispatchNumber||this.queryType==="at-passes")&&this.endComputePass(),this.pendingDispatchNumber>=this.maxDispatchNumber&&this.flush()}this.flush(),this.sessionStatus="default"}onReleaseSession(t){this.unregisterBuffers(t),this.capturedCommandList.has(t)&&this.capturedCommandList.delete(t),this.capturedPendingKernels.has(t)&&this.capturedPendingKernels.delete(t),this.gpuDataManager.onReleaseSession(t)}onRunStart(t){this.currentSessionId=t,this.setQueryType()}}});var Sl={};Lt(Sl,{init:()=>fh});var rr,So,fh,Il=U(()=>{"use strict";Q();xl();dt();ae();rr=class e{constructor(t,r,n,o){this.module=t;this.dataType=r;this.data=n;this.dims=o}getFloat32Array(){if(this.dataType!==1)throw new Error("Invalid data type");let t=k.size(this.dims);return t===0?new Float32Array:new Float32Array(this.module.HEAP8.buffer,this.data,t)}getBigInt64Array(){if(this.dataType!==7)throw new Error("Invalid data type");let t=k.size(this.dims);return t===0?new BigInt64Array:new BigInt64Array(this.module.HEAP8.buffer,this.data,t)}getInt32Array(){if(this.dataType!==6)throw new Error("Invalid data type");let t=k.size(this.dims);return t===0?new Int32Array:new Int32Array(this.module.HEAP8.buffer,this.data,t)}reshape(t){if(k.size(t)!==k.size(this.dims))throw new Error("Invalid new shape");return new e(this.module,this.dataType,this.data,t)}},So=class{constructor(t,r,n){this.module=t;this.backend=r;this.customDataOffset=0;this.customDataSize=0;this.adapterInfo=r.adapterInfo;let o=t.HEAPU32,i=n>>>2;this.opKernelContext=o[i++];let a=o[i++];this.outputCount=o[i++],this.customDataOffset=o[i++],this.customDataSize=o[i++];let l=[];for(let d=0;dtypeof l=="number"?this.inputs[l]:l)??this.inputs,o=r?.outputs??[],i=(l,d,p)=>new rr(this.module,d,this.output(l,p),p),a=(l,d)=>{let p=It(l);if(!p)throw new Error(`Unsupported data type: ${l}`);let m=p*k.size(d),u=m>0?this.backend.gpuDataManager.create(m).id:0;return new rr(this.module,l,u,d)};return this.backend.run(t,n,o,i,a,this.outputCount)}output(t,r){let n=this.module.stackSave();try{let o=this.module.stackAlloc((1+r.length)*4),i=o>>2;this.module.HEAPU32[i++]=r.length;for(let a=0;a{let o=t.jsepInit;if(!o)throw new Error("Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.");if(e==="webgpu"){let i=new sn;await i.initialize(r,n),o("webgpu",[i,a=>i.alloc(a),a=>i.free(a),(a,l,d,p=!1)=>{if(p)be("verbose",()=>`[WebGPU] jsepCopyGpuToGpu: src=${a}, dst=${l}, size=${d}`),i.memcpy(a,l);else{be("verbose",()=>`[WebGPU] jsepCopyCpuToGpu: dataOffset=${a}, gpuDataId=${l}, size=${d}`);let m=t.HEAPU8.subarray(a>>>0,(a>>>0)+d);i.upload(l,m)}},async(a,l,d)=>{be("verbose",()=>`[WebGPU] jsepCopyGpuToCpu: gpuDataId=${a}, dataOffset=${l}, size=${d}`),await i.download(a,()=>t.HEAPU8.subarray(l>>>0,(l>>>0)+d))},(a,l,d)=>i.createKernel(a,l,d,t.UTF8ToString(t._JsepGetNodeName(l))),a=>i.releaseKernel(a),(a,l,d,p)=>{be("verbose",()=>`[WebGPU] jsepRun: sessionHandle=${d}, kernel=${a}, contextDataOffset=${l}`);let m=new So(t,i,l);return i.computeKernel(a,m,p)},()=>i.captureBegin(),()=>i.captureEnd(),()=>i.replay()])}else o("webnn")}});var hh,Ar,Er,kt,gh,Kt,kr,Pr,Cl,Or,zr,Dr,Nn=U(()=>{"use strict";Ba();Ma();Q();St();Rr();qn();hh=(e,t)=>{Ie()._OrtInit(e,t)!==0&&$e("Can't initialize onnxruntime.")},Ar=async e=>{hh(e.wasm.numThreads,Yt(e.logLevel))},Er=async(e,t)=>{{let r=(Il(),yr(Sl)).init;if(t==="webgpu"){if(typeof navigator>"u"||!navigator.gpu)throw new Error("WebGPU is not supported in current environment");let n=e.webgpu.adapter;if(n){if(typeof n.limits!="object"||typeof n.features!="object"||typeof n.requestDevice!="function")throw new Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let o=e.webgpu.powerPreference;if(o!==void 0&&o!=="low-power"&&o!=="high-performance")throw new Error(`Invalid powerPreference setting: "${o}"`);let i=e.webgpu.forceFallbackAdapter;if(i!==void 0&&typeof i!="boolean")throw new Error(`Invalid forceFallbackAdapter setting: "${i}"`);if(n=await navigator.gpu.requestAdapter({powerPreference:o,forceFallbackAdapter:i}),!n)throw new Error('Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.')}await r("webgpu",Ie(),e,n)}if(t==="webnn"){if(typeof navigator>"u"||!navigator.ml)throw new Error("WebNN is not supported in current environment");await r("webnn",Ie(),e)}}},kt=new Map,gh=e=>{let t=Ie(),r=t.stackSave();try{let n=t.stackAlloc(8);return t._OrtGetInputOutputCount(e,n,n+4)!==0&&$e("Can't get session input/output count."),[t.HEAP32[n/4],t.HEAP32[n/4+1]]}finally{t.stackRestore(r)}},Kt=e=>{let t=Ie(),r=t._malloc(e.byteLength);if(r===0)throw new Error(`Can't create a session. failed to allocate a buffer of size ${e.byteLength}.`);return t.HEAPU8.set(e,r),[r,e.byteLength]},kr=async(e,t)=>{let r,n,o=Ie();Array.isArray(e)?[r,n]=e:e.buffer===o.HEAPU8.buffer?[r,n]=[e.byteOffset,e.byteLength]:[r,n]=Kt(e);let i=0,a=0,l=0,d=[],p=[],m=[];try{if([a,d]=Ra(t),t?.externalData&&o.mountExternalData){let $=[];for(let S of t.externalData){let I=typeof S=="string"?S:S.path;$.push(Xt(typeof S=="string"?S:S.data).then(T=>{o.mountExternalData(I,T)}))}await Promise.all($)}for(let $ of t?.executionProviders??[])if((typeof $=="string"?$:$.name)==="webnn"){if(o.currentContext)throw new Error("WebNN execution provider is already set.");if(typeof $!="string"){let I=$,T=I?.context,A=I?.gpuDevice,z=I?.deviceType,D=I?.numThreads,H=I?.powerPreference;T?o.currentContext=T:A?o.currentContext=await navigator.ml.createContext(A):o.currentContext=await navigator.ml.createContext({deviceType:z,numThreads:D,powerPreference:H})}else o.currentContext=await navigator.ml.createContext();break}i=await o._OrtCreateSession(r,n,a),i===0&&$e("Can't create a session."),o.currentContext&&(o.currentContext=void 0);let[u,h]=gh(i),w=!!t?.enableGraphCapture,g=[],b=[],x=[];for(let $=0;$$==="gpu-buffer")&&(l=o._OrtCreateBinding(i),l===0&&$e("Can't create IO binding."),_={handle:l,outputPreferredLocations:x,outputPreferredLocationsEncoded:x.map($=>Fn($))}),kt.set(i,[i,p,m,_,w,!1]),[i,g,b]}catch(u){throw p.forEach(h=>o._OrtFree(h)),m.forEach(h=>o._OrtFree(h)),l!==0&&o._OrtReleaseBinding(l),i!==0&&o._OrtReleaseSession(i),u}finally{o._free(r),a!==0&&o._OrtReleaseSessionOptions(a),d.forEach(u=>o._free(u)),o.unmountExternalData?.()}},Pr=e=>{let t=Ie(),r=kt.get(e);if(!r)throw new Error(`cannot release session. invalid session id: ${e}`);let[n,o,i,a,l]=r;a&&(l&&t._OrtClearBoundOutputs(a.handle),t._OrtReleaseBinding(a.handle)),t.jsepOnReleaseSession?.(e),o.forEach(d=>t._OrtFree(d)),i.forEach(d=>t._OrtFree(d)),t._OrtReleaseSession(n),kt.delete(e)},Cl=(e,t,r,n,o,i=!1)=>{if(!e){t.push(0);return}let a=Ie(),l=e[0],d=e[1],p=e[3],m,u;if(l==="string"&&p==="gpu-buffer")throw new Error("String tensor is not supported on GPU.");if(i&&p!=="gpu-buffer")throw new Error(`External buffer must be provided for input/output index ${o} when enableGraphCapture is true.`);if(p==="gpu-buffer"){let g=e[2].gpuBuffer,b=It(Ln(l));u=d.reduce((_,$)=>_*$,1)*b;let x=a.jsepRegisterBuffer;if(!x)throw new Error('Tensor location "gpu-buffer" is not supported without using WebGPU.');m=x(n,o,g,u)}else{let g=e[2];if(Array.isArray(g)){u=4*g.length,m=a._malloc(u),r.push(m);let b=m/4;for(let x=0;xa.HEAP32[g++]=x);let b=a._OrtCreateTensor(Ln(l),m,u,w,d.length,Fn(p));b===0&&$e(`Can't create tensor for input/output. session=${n}, index=${o}.`),t.push(b)}finally{a.stackRestore(h)}},Or=async(e,t,r,n,o,i)=>{let a=Ie(),l=kt.get(e);if(!l)throw new Error(`cannot run inference. invalid session id: ${e}`);let d=l[0],p=l[1],m=l[2],u=l[3],h=l[4],w=l[5],g=t.length,b=n.length,x=0,_=[],$=[],S=[],I=[],T=a.stackSave(),A=a.stackAlloc(g*4),z=a.stackAlloc(g*4),D=a.stackAlloc(b*4),H=a.stackAlloc(b*4);try{[x,_]=Da(i);for(let q=0;qBe*Ae,1);re=ht(Y);let Ot=u?.outputPreferredLocations[n[q]];if(re==="string"){if(Ot==="gpu-buffer")throw new Error("String tensor is not supported on GPU.");let Be=[],Ae=J/4;for(let Xe=0;Xe0){let Be=a.jsepGetBuffer;if(!Be)throw new Error('preferredLocation "gpu-buffer" is not supported without using WebGPU.');let Ae=Be(J),Xe=It(Y);if(Xe===void 0||!Ur(re))throw new Error(`Unsupported data type: ${re}`);Z=!0,xe.push([re,ve,{gpuBuffer:Ae,download:a.jsepCreateDownloader(Ae,Se*Xe,re),dispose:()=>{a._OrtReleaseTensor(ie)}},"gpu-buffer"])}else{let Be=Mr(re),Ae=new Be(Se);new Uint8Array(Ae.buffer,Ae.byteOffset,Ae.byteLength).set(a.HEAPU8.subarray(J,J+Ae.byteLength)),xe.push([re,ve,Ae,"cpu"])}}finally{a.stackRestore(le),re==="string"&&J&&a._free(J),Z||a._OrtReleaseTensor(ie)}}return u&&!h&&(a._OrtClearBoundOutputs(u.handle),kt.set(e,[d,p,m,u,h,!1])),xe}finally{a.stackRestore(T),$.forEach(W=>a._OrtReleaseTensor(W)),S.forEach(W=>a._OrtReleaseTensor(W)),I.forEach(W=>a._free(W)),x!==0&&a._OrtReleaseRunOptions(x),_.forEach(W=>a._free(W))}},zr=e=>{let t=Ie(),r=kt.get(e);if(!r)throw new Error("invalid session id");let n=r[0],o=t._OrtEndProfiling(n);o===0&&$e("Can't get an profile file name."),t._OrtFree(o)},Dr=e=>{let t=[];for(let r of e){let n=r[2];!Array.isArray(n)&&"buffer"in n&&t.push(n.buffer)}return t}});var Pt,Fe,nr,dn,ln,un,Io,Co,Wt,Ht,bh,Tl,Al,El,kl,Pl,Ol,zl,To=U(()=>{"use strict";Le();Nn();St();qt();Pt=()=>!!ye.wasm.proxy&&typeof document<"u",nr=!1,dn=!1,ln=!1,Co=new Map,Wt=(e,t)=>{let r=Co.get(e);r?r.push(t):Co.set(e,[t])},Ht=()=>{if(nr||!dn||ln||!Fe)throw new Error("worker not ready")},bh=e=>{switch(e.data.type){case"init-wasm":nr=!1,e.data.err?(ln=!0,Io[1](e.data.err)):(dn=!0,Io[0]()),un&&(URL.revokeObjectURL(un),un=void 0);break;case"init-ep":case"copy-from":case"create":case"release":case"run":case"end-profiling":{let t=Co.get(e.data.type);e.data.err?t.shift()[1](e.data.err):t.shift()[0](e.data.out);break}default:}},Tl=async()=>{if(!dn){if(nr)throw new Error("multiple calls to 'initWasm()' detected.");if(ln)throw new Error("previous call to 'initWasm()' failed.");if(nr=!0,Pt())return new Promise((e,t)=>{Fe?.terminate(),Pa().then(([r,n])=>{try{Fe=n,Fe.onerror=i=>t(i),Fe.onmessage=bh,Io=[e,t];let o={type:"init-wasm",in:ye};Fe.postMessage(o),un=r}catch(o){t(o)}},t)});try{await Tr(ye.wasm),await Ar(ye),dn=!0}catch(e){throw ln=!0,e}finally{nr=!1}}},Al=async e=>{if(Pt())return Ht(),new Promise((t,r)=>{Wt("init-ep",[t,r]);let n={type:"init-ep",in:{epName:e,env:ye}};Fe.postMessage(n)});await Er(ye,e)},El=async e=>Pt()?(Ht(),new Promise((t,r)=>{Wt("copy-from",[t,r]);let n={type:"copy-from",in:{buffer:e}};Fe.postMessage(n,[e.buffer])})):Kt(e),kl=async(e,t)=>{if(Pt()){if(t?.preferredOutputLocation)throw new Error('session option "preferredOutputLocation" is not supported for proxy.');return Ht(),new Promise((r,n)=>{Wt("create",[r,n]);let o={type:"create",in:{model:e,options:{...t}}},i=[];e instanceof Uint8Array&&i.push(e.buffer),Fe.postMessage(o,i)})}else return kr(e,t)},Pl=async e=>{if(Pt())return Ht(),new Promise((t,r)=>{Wt("release",[t,r]);let n={type:"release",in:e};Fe.postMessage(n)});Pr(e)},Ol=async(e,t,r,n,o,i)=>{if(Pt()){if(r.some(a=>a[3]!=="cpu"))throw new Error("input tensor on GPU is not supported for proxy.");if(o.some(a=>a))throw new Error("pre-allocated output tensor is not supported for proxy.");return Ht(),new Promise((a,l)=>{Wt("run",[a,l]);let d=r,p={type:"run",in:{sessionId:e,inputIndices:t,inputs:d,outputIndices:n,options:i}};Fe.postMessage(p,Dr(d))})}else return Or(e,t,r,n,o,i)},zl=async e=>{if(Pt())return Ht(),new Promise((t,r)=>{Wt("end-profiling",[t,r]);let n={type:"end-profiling",in:e};Fe.postMessage(n)});zr(e)}});var Dl,wh,cn,Bl=U(()=>{"use strict";Le();To();Q();Cr();qn();Dl=(e,t)=>{switch(e.location){case"cpu":return[e.type,e.dims,e.data,"cpu"];case"gpu-buffer":return[e.type,e.dims,{gpuBuffer:e.gpuBuffer},"gpu-buffer"];default:throw new Error(`invalid data location: ${e.location} for ${t()}`)}},wh=e=>{switch(e[3]){case"cpu":return new ze(e[0],e[2],e[1]);case"gpu-buffer":{let t=e[0];if(!Ur(t))throw new Error(`not supported data type: ${t} for deserializing GPU tensor`);let{gpuBuffer:r,download:n,dispose:o}=e[2];return ze.fromGpuBuffer(r,{dataType:t,dims:e[1],download:n,dispose:o})}default:throw new Error(`invalid data location: ${e[3]}`)}},cn=class{async fetchModelAndCopyToWasmMemory(t){return El(await Xt(t))}async loadModel(t,r){We();let n;typeof t=="string"?!1?n=await Xt(t):n=await this.fetchModelAndCopyToWasmMemory(t):n=t,[this.sessionId,this.inputNames,this.outputNames]=await kl(n,r),Me()}async dispose(){return Pl(this.sessionId)}async run(t,r,n){We();let o=[],i=[];Object.entries(t).forEach(h=>{let w=h[0],g=h[1],b=this.inputNames.indexOf(w);if(b===-1)throw new Error(`invalid input '${w}'`);o.push(g),i.push(b)});let a=[],l=[];Object.entries(r).forEach(h=>{let w=h[0],g=h[1],b=this.outputNames.indexOf(w);if(b===-1)throw new Error(`invalid output '${w}'`);a.push(g),l.push(b)});let d=o.map((h,w)=>Dl(h,()=>`input "${this.inputNames[i[w]]}"`)),p=a.map((h,w)=>h?Dl(h,()=>`output "${this.outputNames[l[w]]}"`):null),m=await Ol(this.sessionId,i,d,l,p,n),u={};for(let h=0;h{"use strict";Le();To();Bl();qt();vh=()=>{if((typeof ye.wasm.initTimeout!="number"||ye.wasm.initTimeout<0)&&(ye.wasm.initTimeout=0),ye.wasm.simd===!1&&console.warn('Deprecated property "env.wasm.simd" is set to false. non-SIMD build is no longer provided, and this setting will be ignored.'),typeof ye.wasm.proxy!="boolean"&&(ye.wasm.proxy=!1),typeof ye.wasm.trace!="boolean"&&(ye.wasm.trace=!1),typeof ye.wasm.numThreads!="number"||!Number.isInteger(ye.wasm.numThreads)||ye.wasm.numThreads<=0)if(typeof self<"u"&&!self.crossOriginIsolated)ye.wasm.numThreads=1;else{let e=typeof navigator>"u"?Bn("node:os").cpus().length:navigator.hardwareConcurrency;ye.wasm.numThreads=Math.min(4,Math.ceil((e||1)/2))}},pn=class{async init(t){vh(),await Tl(),await Al(t)}async createInferenceSessionHandler(t,r){let n=new cn;return await n.loadModel(t,r),Promise.resolve(n)}}});var Ml={};Lt(Ml,{wasmBackend:()=>$h});var $h,Ul=U(()=>{"use strict";Rl();$h=new pn});Le();Le();Le();var _a="1.19.0";var G_=Vn;{let e=(Ul(),yr(Ml)).wasmBackend;_t("webgpu",e,5),_t("webnn",e,5),_t("cpu",e,10),_t("wasm",e,10)}Object.defineProperty(ye.versions,"web",{value:_a,enumerable:!0});export{ap as InferenceSession,xr as TRACE,We as TRACE_FUNC_BEGIN,Me as TRACE_FUNC_END,ze as Tensor,up as TrainingSession,G_ as default,ye as env,_t as registerBackend}; +${a}`,d=n.createShaderModule({code:l,label:t.name});be("verbose",()=>`[WebGPU] ${t.name} shader code: ${l}`);let p=n.createComputePipeline({compute:{module:d,entryPoint:"main"},layout:"auto",label:t.name});return Me(t.name),{programInfo:t,computePipeline:p,uniformVariablesInfo:i.variablesInfo}}normalizeDispatchGroupSize(t){let r=typeof t=="number"?t:t.x,n=typeof t=="number"?1:t.y||1,o=typeof t=="number"?1:t.z||1,i=this.backend.device.limits.maxComputeWorkgroupsPerDimension;if(r<=i&&n<=i&&o<=i)return[r,n,o];let a=r*n*o,l=Math.ceil(Math.sqrt(a));if(l>i){if(l=Math.ceil(Math.cbrt(a)),l>i)throw new Error("Total dispatch size exceeds WebGPU maximum.");return[l,l,l]}else return[l,l,1]}}});var fh,hh,So,sn,xl=U(()=>{"use strict";Le();Q();dt();Ha();ja();$l();_l();fh=(e,t)=>{if(t.length!==e.length)throw new Error(`inputDependencies length ${t.length} is not equal to inputTensors length ${e.length}.`);let r=[];for(let n=0;n{let n=e.name;return e.shaderCache?.hint&&(n+="["+e.shaderCache.hint+"]"),n+=":"+r+`:${fh(t,e.shaderCache?.inputDependencies??new Array(t.length).fill("dims"))}`,n},So=class{constructor(t){t&&(this.architecture=t.architecture,this.vendor=t.vendor)}isArchitecture(t){return this.architecture===t}isVendor(t){return this.vendor===t}},sn=class{constructor(){this.currentSessionId=null;this.currentKernelId=null;this.commandEncoder=null;this.computePassEncoder=null;this.maxDispatchNumber=16;this.pendingDispatchNumber=0;this.pendingKernels=[];this.pendingQueries=new Map;this.sessionStatus="default";this.capturedCommandList=new Map;this.capturedPendingKernels=new Map;this.sessionExternalDataMapping=new Map}get currentKernelCustomData(){if(this.currentKernelId===null)throw new Error("currentKernelCustomData(): currentKernelId is null. (should not happen)");let t=this.kernelCustomData.get(this.currentKernelId);return t||(t={},this.kernelCustomData.set(this.currentKernelId,t)),t}async initialize(t,r){this.env=t;let n=[],o={requiredLimits:{maxComputeWorkgroupStorageSize:r.limits.maxComputeWorkgroupStorageSize,maxComputeWorkgroupsPerDimension:r.limits.maxComputeWorkgroupsPerDimension,maxStorageBufferBindingSize:r.limits.maxStorageBufferBindingSize,maxBufferSize:r.limits.maxBufferSize,maxComputeInvocationsPerWorkgroup:r.limits.maxComputeInvocationsPerWorkgroup,maxComputeWorkgroupSizeX:r.limits.maxComputeWorkgroupSizeX,maxComputeWorkgroupSizeY:r.limits.maxComputeWorkgroupSizeY,maxComputeWorkgroupSizeZ:r.limits.maxComputeWorkgroupSizeZ},requiredFeatures:n};r.features.has("chromium-experimental-timestamp-query-inside-passes")?n.push("chromium-experimental-timestamp-query-inside-passes"):r.features.has("timestamp-query")&&n.push("timestamp-query"),r.features.has("shader-f16")&&n.push("shader-f16"),this.device=await r.requestDevice(o),this.adapterInfo=new So(r.info||await r.requestAdapterInfo()),this.gpuDataManager=qa(this),this.programManager=new an(this),this.kernels=new Map,this.kernelPersistentData=new Map,this.kernelCustomData=new Map,Na(t.logLevel,!!t.debug),this.device.onuncapturederror=i=>{i.error instanceof GPUValidationError&&console.error(`An uncaught WebGPU validation error was raised: ${i.error.message}`)},Object.defineProperty(this.env.webgpu,"device",{value:this.device,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(this.env.webgpu,"adapter",{value:r,writable:!1,enumerable:!0,configurable:!1}),this.setQueryType()}dispose(){typeof this.querySet<"u"&&this.querySet.destroy(),this.gpuDataManager.dispose()}getCommandEncoder(){return this.commandEncoder||(this.commandEncoder=this.device.createCommandEncoder()),this.commandEncoder}getComputePassEncoder(){if(!this.computePassEncoder){let t=this.getCommandEncoder(),r={};this.queryType==="at-passes"&&(r.timestampWrites={querySet:this.querySet,beginningOfPassWriteIndex:this.pendingDispatchNumber*2,endOfPassWriteIndex:this.pendingDispatchNumber*2+1}),this.computePassEncoder=t.beginComputePass(r)}return this.computePassEncoder}endComputePass(){this.computePassEncoder&&(this.computePassEncoder.end(),this.computePassEncoder=null)}flush(){if(!this.commandEncoder)return;We(),this.endComputePass();let t;this.queryType!=="none"&&(this.commandEncoder.resolveQuerySet(this.querySet,0,this.pendingDispatchNumber*2,this.queryResolveBuffer,0),t=this.device.createBuffer({size:this.pendingDispatchNumber*2*8,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),this.pendingQueries.set(t,this.pendingKernels),this.pendingKernels=[],this.commandEncoder.copyBufferToBuffer(this.queryResolveBuffer,0,t,0,this.pendingDispatchNumber*2*8)),this.device.queue.submit([this.commandEncoder.finish()]),this.gpuDataManager.refreshPendingBuffers(),this.commandEncoder=null,this.pendingDispatchNumber=0,this.queryType!=="none"&&t.mapAsync(GPUMapMode.READ).then(()=>{let r=new BigUint64Array(t.getMappedRange()),n=this.pendingQueries.get(t);for(let o=0;o"u"&&(this.queryTimeBase=w);let b=Number(w-this.queryTimeBase),x=Number(g-this.queryTimeBase);if(!Number.isSafeInteger(b)||!Number.isSafeInteger(x))throw new RangeError("incorrect timestamp range");if(this.env.webgpu.profiling?.ondata)this.env.webgpu.profiling.ondata({version:1,inputsMetadata:u.map(_=>({dims:_.dims,dataType:ht(_.dataType)})),outputsMetadata:h.map(_=>({dims:_.dims,dataType:ht(_.dataType)})),kernelId:a,kernelType:d,kernelName:p,programName:m,startTime:b,endTime:x});else{let _="";u.forEach((S,I)=>{_+=`input[${I}]: [${S.dims}] | ${ht(S.dataType)}, `});let $="";h.forEach((S,I)=>{$+=`output[${I}]: [${S.dims}] | ${ht(S.dataType)}, `}),console.log(`[profiling] kernel "${a}|${d}|${p}|${m}" ${_}${$}execution time: ${x-b} ns`)}xr("GPU",`${m}::${w}::${g}`)}t.unmap(),this.pendingQueries.delete(t)}),Me()}run(t,r,n,o,i,a){We(t.name);let l=[];for(let S=0;SI):n;if(u.length!==d.length)throw new Error(`Output size ${u.length} must be equal to ${d.length}.`);let h=[],w=[];for(let S=0;S=a)throw new Error(`Invalid output index: ${u[S]}`);if(u[S]===-3)continue;let I=u[S]===-1,T=u[S]===-2,A=I||T?i(d[S].dataType,d[S].dims):o(u[S],d[S].dataType,d[S].dims);if(h.push(A),A.data===0)continue;let D=this.gpuDataManager.get(A.data);if(!D)throw new Error(`no GPU data for output: ${A.data}`);if(I&&this.temporaryData.push(D),T){let z=this.kernelPersistentData.get(this.currentKernelId);z||(z=[],this.kernelPersistentData.set(this.currentKernelId,z)),z.push(D)}w.push(D)}if(l.length!==r.length||w.length!==h.length){if(w.length===0)return Me(t.name),h;throw new Error(`Program ${t.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`)}let g;if(m){let S=0,I=[];m.forEach(z=>{let H=typeof z.data=="number"?[z.data]:z.data;if(H.length===0)return;let W=z.type===10?2:4,F,de;z.type===10?(de=H.length>4?16:H.length>2?8:H.length*W,F=H.length>4?16:W*H.length):(de=H.length<=2?H.length*W:16,F=16),S=Math.ceil(S/de)*de,I.push(S);let ce=z.type===10?8:4;S+=H.length>4?Math.ceil(H.length/ce)*F:H.length*W});let T=16;S=Math.ceil(S/T)*T;let A=new ArrayBuffer(S);m.forEach((z,H)=>{let W=I[H],F=typeof z.data=="number"?[z.data]:z.data;if(z.type===6)new Int32Array(A,W,F.length).set(F);else if(z.type===12)new Uint32Array(A,W,F.length).set(F);else if(z.type===10)new Uint16Array(A,W,F.length).set(F);else if(z.type===1)new Float32Array(A,W,F.length).set(F);else throw new Error(`Unsupported uniform type: ${ht(z.type)}`)});let D=this.gpuDataManager.create(S,GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM);this.device.queue.writeBuffer(D.buffer,0,A,0,S),this.gpuDataManager.release(D.id),g={offset:0,size:S,buffer:D.buffer}}let b=this.programManager.normalizeDispatchGroupSize(p),x=b[1]===1&&b[2]===1,_=hh(t,r,x),$=this.programManager.getArtifact(_);if($||($=this.programManager.build(t,b),this.programManager.setArtifact(_,$),be("info",()=>`[artifact] key: ${_}, programName: ${t.name}`)),m&&$.uniformVariablesInfo){if(m.length!==$.uniformVariablesInfo.length)throw new Error(`Uniform variables count mismatch: expect ${$.uniformVariablesInfo.length}, got ${m.length} in program "${$.programInfo.name}".`);for(let S=0;S`[ProgramManager] run "${t.name}" (key=${_}) with ${b[0]}x${b[1]}x${b[2]}`),this.queryType!=="none"||this.sessionStatus==="capturing"){let S={kernelId:this.currentKernelId,programName:$.programInfo.name,inputTensorViews:r,outputTensorViews:h};this.pendingKernels.push(S),this.sessionStatus==="capturing"&&this.capturedPendingKernels.get(this.currentSessionId).push(S)}return this.programManager.run($,l,w,b,g),Me(t.name),h}upload(t,r){this.gpuDataManager.upload(t,r)}memcpy(t,r){this.gpuDataManager.memcpy(t,r)}async download(t,r){await this.gpuDataManager.download(t,r)}alloc(t){return this.gpuDataManager.create(t).id}free(t){return this.gpuDataManager.release(t)}createKernel(t,r,n,o){let i=vl.get(t);if(!i)throw new Error(`kernel not implemented: ${t}`);let a={kernelType:t,kernelName:o,kernelEntry:i[0],attributes:[i[1],n]};this.kernels.set(r,a)}releaseKernel(t){let r=this.kernelPersistentData.get(t);if(r){for(let n of r)this.gpuDataManager.release(n.id);this.kernelPersistentData.delete(t)}this.kernelCustomData.delete(t),this.kernels.delete(t)}computeKernel(t,r,n){let o=this.kernels.get(t);if(!o)throw new Error(`kernel not created: ${t}`);let i=o.kernelType,a=o.kernelName,l=o.kernelEntry,d=o.attributes;if(this.currentKernelId!==null)throw new Error(`kernel "[${i}] ${a}" is not allowed to be called recursively`);this.currentKernelId=t,d[0]&&(d[1]=d[0](d[1]),d[0]=void 0),be("info",()=>`[WebGPU] Start to run kernel "[${i}] ${a}"...`);let p=this.env.debug;this.temporaryData=[];try{return p&&this.device.pushErrorScope("validation"),l(r,d[1]),0}catch(m){return n.push(Promise.resolve(`[WebGPU] Kernel "[${i}] ${a}" failed. ${m}`)),1}finally{p&&n.push(this.device.popErrorScope().then(m=>m?`GPU validation error for kernel "[${i}] ${a}": ${m.message}`:null));for(let m of this.temporaryData)this.gpuDataManager.release(m.id);this.temporaryData=[],this.currentKernelId=null}}registerBuffer(t,r,n,o){let i=this.sessionExternalDataMapping.get(t);i||(i=new Map,this.sessionExternalDataMapping.set(t,i));let a=i.get(r),l=this.gpuDataManager.registerExternalBuffer(n,o,a?.[1]);return i.set(r,[l,n]),l}unregisterBuffers(t){let r=this.sessionExternalDataMapping.get(t);r&&(r.forEach(n=>this.gpuDataManager.unregisterExternalBuffer(n[1])),this.sessionExternalDataMapping.delete(t))}getBuffer(t){let r=this.gpuDataManager.get(t);if(!r)throw new Error(`no GPU data for buffer: ${t}`);return r.buffer}createDownloader(t,r,n){return async()=>{let o=await Zn(this,t,r);return Wa(o.buffer,n)}}writeTimestamp(t){this.queryType==="inside-passes"&&this.computePassEncoder.writeTimestamp(this.querySet,t)}setQueryType(){this.queryType="none",(this.env.webgpu.profiling?.mode==="default"||(typeof this.env.trace>"u"?this.env.wasm.trace:this.env.trace))&&(this.device.features.has("chromium-experimental-timestamp-query-inside-passes")?this.queryType="inside-passes":this.device.features.has("timestamp-query")&&(this.queryType="at-passes"),this.queryType!=="none"&&typeof this.querySet>"u"&&(this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxDispatchNumber*2}),this.queryResolveBuffer=this.device.createBuffer({size:this.maxDispatchNumber*2*8,usage:GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE})))}captureBegin(){be("info","captureBegin"),this.capturedCommandList.get(this.currentSessionId)||this.capturedCommandList.set(this.currentSessionId,[]),this.capturedPendingKernels.get(this.currentSessionId)||this.capturedPendingKernels.set(this.currentSessionId,[]),this.flush(),this.sessionStatus="capturing"}captureEnd(){be("info","captureEnd"),this.flush(),this.sessionStatus="default"}replay(){be("info","replay"),this.sessionStatus="replaying";let t=this.capturedCommandList.get(this.currentSessionId),r=this.capturedPendingKernels.get(this.currentSessionId),n=t.length;this.pendingKernels=[];for(let o=0;o=this.maxDispatchNumber||this.queryType==="at-passes")&&this.endComputePass(),this.pendingDispatchNumber>=this.maxDispatchNumber&&this.flush()}this.flush(),this.sessionStatus="default"}onReleaseSession(t){this.unregisterBuffers(t),this.capturedCommandList.has(t)&&this.capturedCommandList.delete(t),this.capturedPendingKernels.has(t)&&this.capturedPendingKernels.delete(t),this.gpuDataManager.onReleaseSession(t)}onRunStart(t){this.currentSessionId=t,this.setQueryType()}}});var Sl={};Lt(Sl,{init:()=>gh});var rr,Io,gh,Il=U(()=>{"use strict";Q();xl();dt();ae();rr=class e{constructor(t,r,n,o){this.module=t;this.dataType=r;this.data=n;this.dims=o}getFloat32Array(){if(this.dataType!==1)throw new Error("Invalid data type");let t=k.size(this.dims);return t===0?new Float32Array:new Float32Array(this.module.HEAP8.buffer,this.data,t)}getBigInt64Array(){if(this.dataType!==7)throw new Error("Invalid data type");let t=k.size(this.dims);return t===0?new BigInt64Array:new BigInt64Array(this.module.HEAP8.buffer,this.data,t)}getInt32Array(){if(this.dataType!==6)throw new Error("Invalid data type");let t=k.size(this.dims);return t===0?new Int32Array:new Int32Array(this.module.HEAP8.buffer,this.data,t)}reshape(t){if(k.size(t)!==k.size(this.dims))throw new Error("Invalid new shape");return new e(this.module,this.dataType,this.data,t)}},Io=class{constructor(t,r,n){this.module=t;this.backend=r;this.customDataOffset=0;this.customDataSize=0;this.adapterInfo=r.adapterInfo;let o=t.HEAPU32,i=n>>>2;this.opKernelContext=o[i++];let a=o[i++];this.outputCount=o[i++],this.customDataOffset=o[i++],this.customDataSize=o[i++];let l=[];for(let d=0;dtypeof l=="number"?this.inputs[l]:l)??this.inputs,o=r?.outputs??[],i=(l,d,p)=>new rr(this.module,d,this.output(l,p),p),a=(l,d)=>{let p=It(l);if(!p)throw new Error(`Unsupported data type: ${l}`);let m=p*k.size(d),u=m>0?this.backend.gpuDataManager.create(m).id:0;return new rr(this.module,l,u,d)};return this.backend.run(t,n,o,i,a,this.outputCount)}output(t,r){let n=this.module.stackSave();try{let o=this.module.stackAlloc((1+r.length)*4),i=o>>2;this.module.HEAPU32[i++]=r.length;for(let a=0;a{let o=t.jsepInit;if(!o)throw new Error("Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.");if(e==="webgpu"){let i=new sn;await i.initialize(r,n),o("webgpu",[i,a=>i.alloc(a),a=>i.free(a),(a,l,d,p=!1)=>{if(p)be("verbose",()=>`[WebGPU] jsepCopyGpuToGpu: src=${a}, dst=${l}, size=${d}`),i.memcpy(a,l);else{be("verbose",()=>`[WebGPU] jsepCopyCpuToGpu: dataOffset=${a}, gpuDataId=${l}, size=${d}`);let m=t.HEAPU8.subarray(a>>>0,(a>>>0)+d);i.upload(l,m)}},async(a,l,d)=>{be("verbose",()=>`[WebGPU] jsepCopyGpuToCpu: gpuDataId=${a}, dataOffset=${l}, size=${d}`),await i.download(a,()=>t.HEAPU8.subarray(l>>>0,(l>>>0)+d))},(a,l,d)=>i.createKernel(a,l,d,t.UTF8ToString(t._JsepGetNodeName(l))),a=>i.releaseKernel(a),(a,l,d,p)=>{be("verbose",()=>`[WebGPU] jsepRun: sessionHandle=${d}, kernel=${a}, contextDataOffset=${l}`);let m=new Io(t,i,l);return i.computeKernel(a,m,p)},()=>i.captureBegin(),()=>i.captureEnd(),()=>i.replay()])}else o("webnn")}});var yh,Ar,Er,kt,bh,jt,kr,Pr,Cl,Or,Dr,zr,Wn=U(()=>{"use strict";Ba();Ma();Q();St();Rr();jn();yh=(e,t)=>{Ie()._OrtInit(e,t)!==0&&$e("Can't initialize onnxruntime.")},Ar=async e=>{yh(e.wasm.numThreads,Yt(e.logLevel))},Er=async(e,t)=>{{let r=(Il(),yr(Sl)).init;if(t==="webgpu"){if(typeof navigator>"u"||!navigator.gpu)throw new Error("WebGPU is not supported in current environment");let n=e.webgpu.adapter;if(n){if(typeof n.limits!="object"||typeof n.features!="object"||typeof n.requestDevice!="function")throw new Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let o=e.webgpu.powerPreference;if(o!==void 0&&o!=="low-power"&&o!=="high-performance")throw new Error(`Invalid powerPreference setting: "${o}"`);let i=e.webgpu.forceFallbackAdapter;if(i!==void 0&&typeof i!="boolean")throw new Error(`Invalid forceFallbackAdapter setting: "${i}"`);if(n=await navigator.gpu.requestAdapter({powerPreference:o,forceFallbackAdapter:i}),!n)throw new Error('Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.')}await r("webgpu",Ie(),e,n)}if(t==="webnn"){if(typeof navigator>"u"||!navigator.ml)throw new Error("WebNN is not supported in current environment");await r("webnn",Ie(),e)}}},kt=new Map,bh=e=>{let t=Ie(),r=t.stackSave();try{let n=t.stackAlloc(8);return t._OrtGetInputOutputCount(e,n,n+4)!==0&&$e("Can't get session input/output count."),[t.HEAP32[n/4],t.HEAP32[n/4+1]]}finally{t.stackRestore(r)}},jt=e=>{let t=Ie(),r=t._malloc(e.byteLength);if(r===0)throw new Error(`Can't create a session. failed to allocate a buffer of size ${e.byteLength}.`);return t.HEAPU8.set(e,r),[r,e.byteLength]},kr=async(e,t)=>{let r,n,o=Ie();Array.isArray(e)?[r,n]=e:e.buffer===o.HEAPU8.buffer?[r,n]=[e.byteOffset,e.byteLength]:[r,n]=jt(e);let i=0,a=0,l=0,d=[],p=[],m=[];try{if([a,d]=Ra(t),t?.externalData&&o.mountExternalData){let $=[];for(let S of t.externalData){let I=typeof S=="string"?S:S.path;$.push(Xt(typeof S=="string"?S:S.data).then(T=>{o.mountExternalData(I,T)}))}await Promise.all($)}for(let $ of t?.executionProviders??[])if((typeof $=="string"?$:$.name)==="webnn"){if(o.currentContext)throw new Error("WebNN execution provider is already set.");if(typeof $!="string"){let I=$,T=I?.context,A=I?.gpuDevice,D=I?.deviceType,z=I?.numThreads,H=I?.powerPreference;T?o.currentContext=T:A?o.currentContext=await navigator.ml.createContext(A):o.currentContext=await navigator.ml.createContext({deviceType:D,numThreads:z,powerPreference:H})}else o.currentContext=await navigator.ml.createContext();break}i=await o._OrtCreateSession(r,n,a),i===0&&$e("Can't create a session."),o.currentContext&&(o.currentContext=void 0);let[u,h]=bh(i),w=!!t?.enableGraphCapture,g=[],b=[],x=[];for(let $=0;$$==="gpu-buffer")&&(l=o._OrtCreateBinding(i),l===0&&$e("Can't create IO binding."),_={handle:l,outputPreferredLocations:x,outputPreferredLocationsEncoded:x.map($=>qn($))}),kt.set(i,[i,p,m,_,w,!1]),[i,g,b]}catch(u){throw p.forEach(h=>o._OrtFree(h)),m.forEach(h=>o._OrtFree(h)),l!==0&&o._OrtReleaseBinding(l),i!==0&&o._OrtReleaseSession(i),u}finally{o._free(r),a!==0&&o._OrtReleaseSessionOptions(a),d.forEach(u=>o._free(u)),o.unmountExternalData?.()}},Pr=e=>{let t=Ie(),r=kt.get(e);if(!r)throw new Error(`cannot release session. invalid session id: ${e}`);let[n,o,i,a,l]=r;a&&(l&&t._OrtClearBoundOutputs(a.handle),t._OrtReleaseBinding(a.handle)),t.jsepOnReleaseSession?.(e),o.forEach(d=>t._OrtFree(d)),i.forEach(d=>t._OrtFree(d)),t._OrtReleaseSession(n),kt.delete(e)},Cl=(e,t,r,n,o,i=!1)=>{if(!e){t.push(0);return}let a=Ie(),l=e[0],d=e[1],p=e[3],m,u;if(l==="string"&&p==="gpu-buffer")throw new Error("String tensor is not supported on GPU.");if(i&&p!=="gpu-buffer")throw new Error(`External buffer must be provided for input/output index ${o} when enableGraphCapture is true.`);if(p==="gpu-buffer"){let g=e[2].gpuBuffer,b=It(Fn(l));u=d.reduce((_,$)=>_*$,1)*b;let x=a.jsepRegisterBuffer;if(!x)throw new Error('Tensor location "gpu-buffer" is not supported without using WebGPU.');m=x(n,o,g,u)}else{let g=e[2];if(Array.isArray(g)){u=4*g.length,m=a._malloc(u),r.push(m);let b=m/4;for(let x=0;xa.HEAP32[g++]=x);let b=a._OrtCreateTensor(Fn(l),m,u,w,d.length,qn(p));b===0&&$e(`Can't create tensor for input/output. session=${n}, index=${o}.`),t.push(b)}finally{a.stackRestore(h)}},Or=async(e,t,r,n,o,i)=>{let a=Ie(),l=kt.get(e);if(!l)throw new Error(`cannot run inference. invalid session id: ${e}`);let d=l[0],p=l[1],m=l[2],u=l[3],h=l[4],w=l[5],g=t.length,b=n.length,x=0,_=[],$=[],S=[],I=[],T=a.stackSave(),A=a.stackAlloc(g*4),D=a.stackAlloc(g*4),z=a.stackAlloc(b*4),H=a.stackAlloc(b*4);try{[x,_]=za(i);for(let q=0;qBe*Ae,1);re=ht(Y);let Ot=u?.outputPreferredLocations[n[q]];if(re==="string"){if(Ot==="gpu-buffer")throw new Error("String tensor is not supported on GPU.");let Be=[],Ae=J/4;for(let Xe=0;Xe0){let Be=a.jsepGetBuffer;if(!Be)throw new Error('preferredLocation "gpu-buffer" is not supported without using WebGPU.');let Ae=Be(J),Xe=It(Y);if(Xe===void 0||!Ur(re))throw new Error(`Unsupported data type: ${re}`);Z=!0,xe.push([re,ve,{gpuBuffer:Ae,download:a.jsepCreateDownloader(Ae,Se*Xe,re),dispose:()=>{a._OrtReleaseTensor(ie)}},"gpu-buffer"])}else{let Be=Mr(re),Ae=new Be(Se);new Uint8Array(Ae.buffer,Ae.byteOffset,Ae.byteLength).set(a.HEAPU8.subarray(J,J+Ae.byteLength)),xe.push([re,ve,Ae,"cpu"])}}finally{a.stackRestore(le),re==="string"&&J&&a._free(J),Z||a._OrtReleaseTensor(ie)}}return u&&!h&&(a._OrtClearBoundOutputs(u.handle),kt.set(e,[d,p,m,u,h,!1])),xe}finally{a.stackRestore(T),$.forEach(W=>a._OrtReleaseTensor(W)),S.forEach(W=>a._OrtReleaseTensor(W)),I.forEach(W=>a._free(W)),x!==0&&a._OrtReleaseRunOptions(x),_.forEach(W=>a._free(W))}},Dr=e=>{let t=Ie(),r=kt.get(e);if(!r)throw new Error("invalid session id");let n=r[0],o=t._OrtEndProfiling(n);o===0&&$e("Can't get an profile file name."),t._OrtFree(o)},zr=e=>{let t=[];for(let r of e){let n=r[2];!Array.isArray(n)&&"buffer"in n&&t.push(n.buffer)}return t}});var Pt,Fe,nr,dn,ln,un,Co,To,Ht,Gt,vh,Tl,Al,El,kl,Pl,Ol,Dl,Ao=U(()=>{"use strict";Le();Wn();St();qt();Pt=()=>!!ye.wasm.proxy&&typeof document<"u",nr=!1,dn=!1,ln=!1,To=new Map,Ht=(e,t)=>{let r=To.get(e);r?r.push(t):To.set(e,[t])},Gt=()=>{if(nr||!dn||ln||!Fe)throw new Error("worker not ready")},vh=e=>{switch(e.data.type){case"init-wasm":nr=!1,e.data.err?(ln=!0,Co[1](e.data.err)):(dn=!0,Co[0]()),un&&(URL.revokeObjectURL(un),un=void 0);break;case"init-ep":case"copy-from":case"create":case"release":case"run":case"end-profiling":{let t=To.get(e.data.type);e.data.err?t.shift()[1](e.data.err):t.shift()[0](e.data.out);break}default:}},Tl=async()=>{if(!dn){if(nr)throw new Error("multiple calls to 'initWasm()' detected.");if(ln)throw new Error("previous call to 'initWasm()' failed.");if(nr=!0,Pt())return new Promise((e,t)=>{Fe?.terminate(),Pa().then(([r,n])=>{try{Fe=n,Fe.onerror=i=>t(i),Fe.onmessage=vh,Co=[e,t];let o={type:"init-wasm",in:ye};Fe.postMessage(o),un=r}catch(o){t(o)}},t)});try{await Tr(ye.wasm),await Ar(ye),dn=!0}catch(e){throw ln=!0,e}finally{nr=!1}}},Al=async e=>{if(Pt())return Gt(),new Promise((t,r)=>{Ht("init-ep",[t,r]);let n={type:"init-ep",in:{epName:e,env:ye}};Fe.postMessage(n)});await Er(ye,e)},El=async e=>Pt()?(Gt(),new Promise((t,r)=>{Ht("copy-from",[t,r]);let n={type:"copy-from",in:{buffer:e}};Fe.postMessage(n,[e.buffer])})):jt(e),kl=async(e,t)=>{if(Pt()){if(t?.preferredOutputLocation)throw new Error('session option "preferredOutputLocation" is not supported for proxy.');return Gt(),new Promise((r,n)=>{Ht("create",[r,n]);let o={type:"create",in:{model:e,options:{...t}}},i=[];e instanceof Uint8Array&&i.push(e.buffer),Fe.postMessage(o,i)})}else return kr(e,t)},Pl=async e=>{if(Pt())return Gt(),new Promise((t,r)=>{Ht("release",[t,r]);let n={type:"release",in:e};Fe.postMessage(n)});Pr(e)},Ol=async(e,t,r,n,o,i)=>{if(Pt()){if(r.some(a=>a[3]!=="cpu"))throw new Error("input tensor on GPU is not supported for proxy.");if(o.some(a=>a))throw new Error("pre-allocated output tensor is not supported for proxy.");return Gt(),new Promise((a,l)=>{Ht("run",[a,l]);let d=r,p={type:"run",in:{sessionId:e,inputIndices:t,inputs:d,outputIndices:n,options:i}};Fe.postMessage(p,zr(d))})}else return Or(e,t,r,n,o,i)},Dl=async e=>{if(Pt())return Gt(),new Promise((t,r)=>{Ht("end-profiling",[t,r]);let n={type:"end-profiling",in:e};Fe.postMessage(n)});Dr(e)}});var zl,$h,cn,Bl=U(()=>{"use strict";Le();Ao();Q();Cr();jn();zl=(e,t)=>{switch(e.location){case"cpu":return[e.type,e.dims,e.data,"cpu"];case"gpu-buffer":return[e.type,e.dims,{gpuBuffer:e.gpuBuffer},"gpu-buffer"];default:throw new Error(`invalid data location: ${e.location} for ${t()}`)}},$h=e=>{switch(e[3]){case"cpu":return new De(e[0],e[2],e[1]);case"gpu-buffer":{let t=e[0];if(!Ur(t))throw new Error(`not supported data type: ${t} for deserializing GPU tensor`);let{gpuBuffer:r,download:n,dispose:o}=e[2];return De.fromGpuBuffer(r,{dataType:t,dims:e[1],download:n,dispose:o})}default:throw new Error(`invalid data location: ${e[3]}`)}},cn=class{async fetchModelAndCopyToWasmMemory(t){return El(await Xt(t))}async loadModel(t,r){We();let n;typeof t=="string"?!1?n=await Xt(t):n=await this.fetchModelAndCopyToWasmMemory(t):n=t,[this.sessionId,this.inputNames,this.outputNames]=await kl(n,r),Me()}async dispose(){return Pl(this.sessionId)}async run(t,r,n){We();let o=[],i=[];Object.entries(t).forEach(h=>{let w=h[0],g=h[1],b=this.inputNames.indexOf(w);if(b===-1)throw new Error(`invalid input '${w}'`);o.push(g),i.push(b)});let a=[],l=[];Object.entries(r).forEach(h=>{let w=h[0],g=h[1],b=this.outputNames.indexOf(w);if(b===-1)throw new Error(`invalid output '${w}'`);a.push(g),l.push(b)});let d=o.map((h,w)=>zl(h,()=>`input "${this.inputNames[i[w]]}"`)),p=a.map((h,w)=>h?zl(h,()=>`output "${this.outputNames[l[w]]}"`):null),m=await Ol(this.sessionId,i,d,l,p,n),u={};for(let h=0;h{"use strict";Le();Ao();Bl();qt();_h=()=>{if((typeof ye.wasm.initTimeout!="number"||ye.wasm.initTimeout<0)&&(ye.wasm.initTimeout=0),ye.wasm.simd===!1&&console.warn('Deprecated property "env.wasm.simd" is set to false. non-SIMD build is no longer provided, and this setting will be ignored.'),typeof ye.wasm.proxy!="boolean"&&(ye.wasm.proxy=!1),typeof ye.wasm.trace!="boolean"&&(ye.wasm.trace=!1),typeof ye.wasm.numThreads!="number"||!Number.isInteger(ye.wasm.numThreads)||ye.wasm.numThreads<=0)if(typeof self<"u"&&!self.crossOriginIsolated)ye.wasm.numThreads=1;else{let e=typeof navigator>"u"?Rn("node:os").cpus().length:navigator.hardwareConcurrency;ye.wasm.numThreads=Math.min(4,Math.ceil((e||1)/2))}},pn=class{async init(t){_h(),await Tl(),await Al(t)}async createInferenceSessionHandler(t,r){let n=new cn;return await n.loadModel(t,r),Promise.resolve(n)}}});var Ml={};Lt(Ml,{wasmBackend:()=>xh});var xh,Ul=U(()=>{"use strict";Rl();xh=new pn});Le();Le();Le();var _a="1.19.0";var F_=Nn;{let e=(Ul(),yr(Ml)).wasmBackend;_t("webgpu",e,5),_t("webnn",e,5),_t("cpu",e,10),_t("wasm",e,10)}Object.defineProperty(ye.versions,"web",{value:_a,enumerable:!0});export{up as InferenceSession,xr as TRACE,We as TRACE_FUNC_BEGIN,Me as TRACE_FUNC_END,De as Tensor,lp as TrainingSession,F_ as default,ye as env,_t as registerBackend}; /** * @license * Copyright 2021 Google LLC. All Rights Reserved. diff --git a/assets/dist/ort.webgpu.bundle.min.mjs.map b/assets/dist/ort.webgpu.bundle.min.mjs.map index f74beae..228fafa 100644 --- a/assets/dist/ort.webgpu.bundle.min.mjs.map +++ b/assets/dist/ort.webgpu.bundle.min.mjs.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../common/lib/backend-impl.ts", "../../common/lib/backend.ts", "../../common/lib/version.ts", "../../common/lib/env-impl.ts", "../../common/lib/env.ts", "../../common/lib/tensor-conversion-impl.ts", "../../common/lib/tensor-factory-impl.ts", "../../common/lib/tensor-impl-type-mapping.ts", "../../common/lib/tensor-utils-impl.ts", "../../common/lib/tensor-impl.ts", "../../common/lib/tensor.ts", "../../common/lib/trace.ts", "../../common/lib/inference-session-impl.ts", "../../common/lib/inference-session.ts", "../../common/lib/tensor-conversion.ts", "../../common/lib/tensor-factory.ts", "../../common/lib/onnx-model.ts", "../../common/lib/onnx-value.ts", "../../common/lib/training-session-impl.ts", "../../common/lib/training-session.ts", "../../common/lib/index.ts", "../lib/wasm/wasm-utils-env.ts", "../lib/wasm/proxy-worker/main.ts", "ort-wasm-simd-threaded.jsep.mjs", "../lib/wasm/wasm-utils-import.ts", "../lib/wasm/wasm-factory.ts", "../lib/wasm/wasm-utils.ts", "../lib/wasm/run-options.ts", "../lib/wasm/session-options.ts", "../lib/wasm/wasm-common.ts", "../lib/wasm/wasm-utils-load-file.ts", "../lib/wasm/jsep/log.ts", "../lib/wasm/jsep/tensor-view.ts", "../lib/wasm/jsep/webgpu/types.ts", "../lib/wasm/jsep/webgpu/gpu-data-manager.ts", "../lib/wasm/jsep/webgpu/attribute-with-cache-key.ts", "../lib/wasm/jsep/util.ts", "../lib/wasm/jsep/webgpu/ops/common.ts", "../lib/wasm/jsep/webgpu/ops/transpose.ts", "../lib/wasm/jsep/webgpu/ops/reduce-shared.ts", "../lib/wasm/jsep/webgpu/ops/reduce.ts", "../lib/wasm/jsep/webgpu/ops/argminmax.ts", "../lib/wasm/jsep/webgpu/ops/attention.ts", "../lib/wasm/jsep/webgpu/ops/batch-norm.ts", "../lib/wasm/jsep/webgpu/ops/bias-add.ts", "../lib/wasm/jsep/webgpu/ops/unary-op.ts", "../lib/wasm/jsep/webgpu/ops/bias-split-gelu.ts", "../lib/wasm/jsep/webgpu/ops/binary-op.ts", "../lib/wasm/jsep/webgpu/ops/concat.ts", "../lib/wasm/jsep/webgpu/ops/fuse-utils.ts", "../lib/wasm/jsep/webgpu/ops/3rd-party/activation_util.ts", "../lib/wasm/jsep/webgpu/ops/3rd-party/conv_util.ts", "../lib/wasm/jsep/webgpu/ops/3rd-party/matmul_packed_webgpu.ts", "../lib/wasm/jsep/webgpu/ops/3rd-party/conv2d_mm_webgpu.ts", "../lib/wasm/jsep/webgpu/ops/3rd-party/conv3d_naive_webgpu.ts", "../lib/wasm/jsep/webgpu/ops/conv-grouped.ts", "../lib/wasm/jsep/webgpu/ops/matmul.ts", "../lib/wasm/jsep/webgpu/ops/conv.ts", "../lib/wasm/jsep/webgpu/ops/3rd-party/conv_backprop_mm_webgpu.ts", "../lib/wasm/jsep/webgpu/ops/3rd-party/conv_backprop_webgpu.ts", "../lib/wasm/jsep/webgpu/ops/conv-transpose.ts", "../lib/wasm/jsep/webgpu/ops/cumsum.ts", "../lib/wasm/jsep/webgpu/ops/depth-to-space.ts", "../lib/wasm/jsep/webgpu/ops/einsum.ts", "../lib/wasm/jsep/webgpu/ops/expand.ts", "../lib/wasm/jsep/webgpu/ops/fast-gelu.ts", "../lib/wasm/jsep/webgpu/ops/gather.ts", "../lib/wasm/jsep/webgpu/ops/gather-elements.ts", "../lib/wasm/jsep/webgpu/ops/gemm.ts", "../lib/wasm/jsep/webgpu/ops/multihead-attention.ts", "../lib/wasm/jsep/webgpu/ops/tile.ts", "../lib/wasm/jsep/webgpu/ops/group-query-attention.ts", "../lib/wasm/jsep/webgpu/ops/instance-norm.ts", "../lib/wasm/jsep/webgpu/ops/layer-norm.ts", "../lib/wasm/jsep/webgpu/ops/matmulnbits.ts", "../lib/wasm/jsep/webgpu/ops/pad.ts", "../lib/wasm/jsep/webgpu/ops/pool.ts", "../lib/wasm/jsep/webgpu/ops/range.ts", "../lib/wasm/jsep/webgpu/ops/resize.ts", "../lib/wasm/jsep/webgpu/ops/rotary-embedding.ts", "../lib/wasm/jsep/webgpu/ops/skip-layer-norm.ts", "../lib/wasm/jsep/webgpu/ops/slice.ts", "../lib/wasm/jsep/webgpu/ops/softmax.ts", "../lib/wasm/jsep/webgpu/ops/split.ts", "../lib/wasm/jsep/webgpu/ops/where.ts", "../lib/wasm/jsep/webgpu/op-resolve-rules.ts", "../lib/wasm/jsep/webgpu/program-manager.ts", "../lib/wasm/jsep/backend-webgpu.ts", "../lib/wasm/jsep/init.ts", "../lib/wasm/wasm-core-impl.ts", "../lib/wasm/proxy-wrapper.ts", "../lib/wasm/session-handler-inference.ts", "../lib/backend-wasm.ts", "../lib/backend-wasm-inference.ts", "../lib/index.ts", "../lib/version.ts"], - "sourcesContent": ["// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Backend} from './backend.js';\nimport {InferenceSession} from './inference-session.js';\n\ninterface BackendInfo {\n backend: Backend;\n priority: number;\n\n initPromise?: Promise;\n initialized?: boolean;\n aborted?: boolean;\n error?: string;\n}\n\nconst backends: Map = new Map();\nconst backendsSortedByPriority: string[] = [];\n\n/**\n * Register a backend.\n *\n * @param name - the name as a key to lookup as an execution provider.\n * @param backend - the backend object.\n * @param priority - an integer indicating the priority of the backend. Higher number means higher priority. if priority\n * < 0, it will be considered as a 'beta' version and will not be used as a fallback backend by default.\n *\n * @ignore\n */\nexport const registerBackend = (name: string, backend: Backend, priority: number): void => {\n if (backend && typeof backend.init === 'function' && typeof backend.createInferenceSessionHandler === 'function') {\n const currentBackend = backends.get(name);\n if (currentBackend === undefined) {\n backends.set(name, {backend, priority});\n } else if (currentBackend.priority > priority) {\n // same name is already registered with a higher priority. skip registeration.\n return;\n } else if (currentBackend.priority === priority) {\n if (currentBackend.backend !== backend) {\n throw new Error(`cannot register backend \"${name}\" using priority ${priority}`);\n }\n }\n\n if (priority >= 0) {\n const i = backendsSortedByPriority.indexOf(name);\n if (i !== -1) {\n backendsSortedByPriority.splice(i, 1);\n }\n\n for (let i = 0; i < backendsSortedByPriority.length; i++) {\n if (backends.get(backendsSortedByPriority[i])!.priority <= priority) {\n backendsSortedByPriority.splice(i, 0, name);\n return;\n }\n }\n backendsSortedByPriority.push(name);\n }\n return;\n }\n\n throw new TypeError('not a valid backend');\n};\n\n/**\n * Try to resolve and initialize a backend.\n *\n * @param backendName - the name of the backend.\n * @returns the backend instance if resolved and initialized successfully, or an error message if failed.\n */\nconst tryResolveAndInitializeBackend = async(backendName: string): Promise => {\n const backendInfo = backends.get(backendName);\n if (!backendInfo) {\n return 'backend not found.';\n }\n\n if (backendInfo.initialized) {\n return backendInfo.backend;\n } else if (backendInfo.aborted) {\n return backendInfo.error!;\n } else {\n const isInitializing = !!backendInfo.initPromise;\n try {\n if (!isInitializing) {\n backendInfo.initPromise = backendInfo.backend.init(backendName);\n }\n await backendInfo.initPromise;\n backendInfo.initialized = true;\n return backendInfo.backend;\n } catch (e) {\n if (!isInitializing) {\n backendInfo.error = `${e}`;\n backendInfo.aborted = true;\n }\n return backendInfo.error!;\n } finally {\n delete backendInfo.initPromise;\n }\n }\n};\n\n/**\n * Resolve execution providers from the specific session options.\n *\n * @param options - the session options object.\n * @returns a promise that resolves to a tuple of an initialized backend instance and a session options object with\n * filtered EP list.\n *\n * @ignore\n */\nexport const resolveBackendAndExecutionProviders = async(options: InferenceSession.SessionOptions):\n Promise<[backend: Backend, options: InferenceSession.SessionOptions]> => {\n // extract backend hints from session options\n const eps = options.executionProviders || [];\n const backendHints = eps.map(i => typeof i === 'string' ? i : i.name);\n const backendNames = backendHints.length === 0 ? backendsSortedByPriority : backendHints;\n\n // try to resolve and initialize all requested backends\n let backend: Backend|undefined;\n const errors = [];\n const availableBackendNames = new Set();\n for (const backendName of backendNames) {\n const resolveResult = await tryResolveAndInitializeBackend(backendName);\n if (typeof resolveResult === 'string') {\n errors.push({name: backendName, err: resolveResult});\n } else {\n if (!backend) {\n backend = resolveResult;\n }\n if (backend === resolveResult) {\n availableBackendNames.add(backendName);\n }\n }\n }\n\n // if no backend is available, throw error.\n if (!backend) {\n throw new Error(`no available backend found. ERR: ${errors.map(e => `[${e.name}] ${e.err}`).join(', ')}`);\n }\n\n // for each explicitly requested backend, if it's not available, output warning message.\n for (const {name, err} of errors) {\n if (backendHints.includes(name)) {\n // eslint-disable-next-line no-console\n console.warn(`removing requested execution provider \"${\n name}\" from session options because it is not available: ${err}`);\n }\n }\n\n const filteredEps = eps.filter(i => availableBackendNames.has(typeof i === 'string' ? i : i.name));\n\n return [\n backend, new Proxy(options, {\n get: (target, prop) => {\n if (prop === 'executionProviders') {\n return filteredEps;\n }\n return Reflect.get(target, prop);\n }\n })\n ];\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession} from './inference-session.js';\nimport {OnnxValue} from './onnx-value.js';\nimport {TrainingSession} from './training-session.js';\n\n/**\n * @ignore\n */\nexport declare namespace SessionHandler {\n type FeedsType = {[name: string]: OnnxValue};\n type FetchesType = {[name: string]: OnnxValue | null};\n type ReturnType = {[name: string]: OnnxValue};\n}\n\n/**\n * Represents shared SessionHandler functionality\n *\n * @ignore\n */\ninterface SessionHandler {\n dispose(): Promise;\n\n readonly inputNames: readonly string[];\n readonly outputNames: readonly string[];\n}\n\n/**\n * Represent a handler instance of an inference session.\n *\n * @ignore\n */\nexport interface InferenceSessionHandler extends SessionHandler {\n startProfiling(): void;\n endProfiling(): void;\n\n run(feeds: SessionHandler.FeedsType, fetches: SessionHandler.FetchesType,\n options: InferenceSession.RunOptions): Promise;\n}\n\n/**\n * Represent a handler instance of a training inference session.\n *\n * @ignore\n */\nexport interface TrainingSessionHandler extends SessionHandler {\n readonly evalInputNames: readonly string[];\n readonly evalOutputNames: readonly string[];\n\n lazyResetGrad(): Promise;\n runTrainStep(\n feeds: SessionHandler.FeedsType, fetches: SessionHandler.FetchesType,\n options: InferenceSession.RunOptions): Promise;\n runOptimizerStep(options: InferenceSession.RunOptions): Promise;\n runEvalStep(\n feeds: SessionHandler.FeedsType, fetches: SessionHandler.FetchesType,\n options: InferenceSession.RunOptions): Promise;\n\n getParametersSize(trainableOnly: boolean): Promise;\n loadParametersBuffer(buffer: Uint8Array, trainableOnly: boolean): Promise;\n getContiguousParameters(trainableOnly: boolean): Promise;\n}\n\n/**\n * Represent a backend that provides implementation of model inferencing.\n *\n * @ignore\n */\nexport interface Backend {\n /**\n * Initialize the backend asynchronously. Should throw when failed.\n */\n init(backendName: string): Promise;\n\n createInferenceSessionHandler(uriOrBuffer: string|Uint8Array, options?: InferenceSession.SessionOptions):\n Promise;\n\n createTrainingSessionHandler?\n (checkpointStateUriOrBuffer: TrainingSession.UriOrBuffer, trainModelUriOrBuffer: TrainingSession.UriOrBuffer,\n evalModelUriOrBuffer: TrainingSession.UriOrBuffer, optimizerModelUriOrBuffer: TrainingSession.UriOrBuffer,\n options: InferenceSession.SessionOptions): Promise;\n}\n\nexport {registerBackend} from './backend-impl.js';\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// This file is generated by /js/scripts/update-version.ts\n// Do not modify file content manually.\n\nexport const version = '1.19.0';\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from './env.js';\nimport {version} from './version.js';\n\ntype LogLevelType = Env['logLevel'];\n\nlet logLevelValue: Required = 'warning';\n\nexport const env: Env = {\n wasm: {} as Env.WebAssemblyFlags,\n webgl: {} as Env.WebGLFlags,\n webgpu: {} as Env.WebGpuFlags,\n versions: {common: version},\n\n set logLevel(value: LogLevelType) {\n if (value === undefined) {\n return;\n }\n if (typeof value !== 'string' || ['verbose', 'info', 'warning', 'error', 'fatal'].indexOf(value) === -1) {\n throw new Error(`Unsupported logging level: ${value}`);\n }\n logLevelValue = value;\n },\n get logLevel(): Required {\n return logLevelValue;\n },\n};\n\n// set property 'logLevel' so that they can be correctly transferred to worker by `postMessage()`.\nObject.defineProperty(env, 'logLevel', {enumerable: true});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env as envImpl} from './env-impl.js';\n\nexport declare namespace Env {\n export type WasmPathPrefix = string;\n export interface WasmFilePaths {\n /**\n * Specify the override path for the main .wasm file.\n *\n * This path should be an absolute path.\n *\n * If not modified, the filename of the .wasm file is:\n * - `ort-wasm-simd-threaded.wasm` for default build\n * - `ort-wasm-simd-threaded.jsep.wasm` for JSEP build (with WebGPU and WebNN)\n * - `ort-training-wasm-simd-threaded.wasm` for training build\n */\n wasm?: URL|string;\n /**\n * Specify the override path for the main .mjs file.\n *\n * This path should be an absolute path.\n *\n * If not modified, the filename of the .mjs file is:\n * - `ort-wasm-simd-threaded.mjs` for default build\n * - `ort-wasm-simd-threaded.jsep.mjs` for JSEP build (with WebGPU and WebNN)\n * - `ort-training-wasm-simd-threaded.mjs` for training build\n */\n mjs?: URL|string;\n }\n export type WasmPrefixOrFilePaths = WasmPathPrefix|WasmFilePaths;\n export interface WebAssemblyFlags {\n /**\n * set or get number of thread(s). If omitted or set to 0, number of thread(s) will be determined by system. If set\n * to 1, no worker thread will be spawned.\n *\n * This setting is available only when WebAssembly multithread feature is available in current context.\n *\n * @defaultValue `0`\n */\n numThreads?: number;\n\n /**\n * set or get a boolean value indicating whether to enable SIMD. If set to false, SIMD will be forcely disabled.\n *\n * This setting is available only when WebAssembly SIMD feature is available in current context.\n *\n * @deprecated This property is deprecated. Since SIMD is supported by all major JavaScript engines, non-SIMD\n * build is no longer provided. This property will be removed in future release.\n * @defaultValue `true`\n */\n simd?: boolean;\n\n /**\n * set or get a boolean value indicating whether to enable trace.\n *\n * @deprecated Use `env.trace` instead. If `env.trace` is set, this property will be ignored.\n * @defaultValue `false`\n */\n trace?: boolean;\n\n /**\n * Set or get a number specifying the timeout for initialization of WebAssembly backend, in milliseconds. A zero\n * value indicates no timeout is set.\n *\n * @defaultValue `0`\n */\n initTimeout?: number;\n\n /**\n * Set a custom URL prefix to the .wasm/.mjs files, or an object of overrides for both .wasm/.mjs file. The override\n * path should be an absolute path.\n */\n wasmPaths?: WasmPrefixOrFilePaths;\n\n /**\n * Set or get a boolean value indicating whether to proxy the execution of main thread to a worker thread.\n *\n * @defaultValue `false`\n */\n proxy?: boolean;\n }\n\n export interface WebGLFlags {\n /**\n * Set or get the WebGL Context ID (webgl or webgl2).\n *\n * @defaultValue `'webgl2'`\n */\n contextId?: 'webgl'|'webgl2';\n /**\n * Get the WebGL rendering context.\n */\n readonly context: WebGLRenderingContext;\n /**\n * Set or get the maximum batch size for matmul. 0 means to disable batching.\n *\n * @deprecated\n */\n matmulMaxBatchSize?: number;\n /**\n * Set or get the texture cache mode.\n *\n * @defaultValue `'full'`\n */\n textureCacheMode?: 'initializerOnly'|'full';\n /**\n * Set or get the packed texture mode\n *\n * @defaultValue `false`\n */\n pack?: boolean;\n /**\n * Set or get whether enable async download.\n *\n * @defaultValue `false`\n */\n async?: boolean;\n }\n\n export interface WebGpuProfilingDataV1TensorMetadata {\n dims: readonly number[];\n dataType: string;\n }\n export interface WebGpuProfilingDataV1 {\n version: 1;\n inputsMetadata: readonly WebGpuProfilingDataV1TensorMetadata[];\n outputsMetadata: readonly WebGpuProfilingDataV1TensorMetadata[];\n kernelId: number;\n kernelType: string;\n kernelName: string;\n programName: string;\n startTime: number;\n endTime: number;\n }\n\n export type WebGpuProfilingData = WebGpuProfilingDataV1;\n\n export interface WebGpuFlags {\n /**\n * Set or get the profiling mode.\n *\n * @deprecated Use `env.webgpu.profiling.mode` instead. If `env.webgpu.profiling.mode` is set, this property will be\n * ignored.\n */\n profilingMode?: 'off'|'default';\n /**\n * Set or get the profiling configuration.\n */\n profiling?: {\n /**\n * Set or get the profiling mode.\n *\n * @defaultValue `'off'`\n */\n mode?: 'off'|'default';\n\n /**\n * Set or get a callback function when a profiling data is received. If not set, the profiling data will be\n * printed to console.\n */\n ondata?: (data: WebGpuProfilingData) => void;\n };\n /**\n * Set or get the power preference.\n *\n * Setting this property only has effect before the first WebGPU inference session is created. The value will be\n * used as options for `navigator.gpu.requestAdapter()`.\n *\n * See {@link https://gpuweb.github.io/gpuweb/#dictdef-gpurequestadapteroptions} for more details.\n *\n * @defaultValue `undefined`\n */\n powerPreference?: 'low-power'|'high-performance';\n /**\n * Set or get the force fallback adapter flag.\n *\n * Setting this property only has effect before the first WebGPU inference session is created. The value will be\n * used as options for `navigator.gpu.requestAdapter()`.\n *\n * See {@link https://gpuweb.github.io/gpuweb/#dictdef-gpurequestadapteroptions} for more details.\n *\n * @defaultValue `undefined`\n */\n forceFallbackAdapter?: boolean;\n /**\n * Set or get the adapter for WebGPU.\n *\n * Setting this property only has effect before the first WebGPU inference session is created. The value will be\n * used as the GPU adapter for the underlying WebGPU backend to create GPU device.\n *\n * If this property is not set, it will be available to get after the first WebGPU inference session is created. The\n * value will be the GPU adapter that created by the underlying WebGPU backend.\n *\n * When use with TypeScript, the type of this property is `GPUAdapter` defined in \"@webgpu/types\".\n * Use `const adapter = env.webgpu.adapter as GPUAdapter;` in TypeScript to access this property with correct type.\n *\n * see comments on {@link Tensor.GpuBufferType}\n */\n adapter: unknown;\n /**\n * Get the device for WebGPU.\n *\n * This property is only available after the first WebGPU inference session is created.\n *\n * When use with TypeScript, the type of this property is `GPUDevice` defined in \"@webgpu/types\".\n * Use `const device = env.webgpu.device as GPUDevice;` in TypeScript to access this property with correct type.\n *\n * see comments on {@link Tensor.GpuBufferType} for more details about why not use types defined in \"@webgpu/types\".\n */\n readonly device: unknown;\n /**\n * Set or get whether validate input content.\n *\n * @defaultValue `false`\n */\n validateInputContent?: boolean;\n }\n}\n\nexport interface Env {\n /**\n * set the severity level for logging.\n *\n * @defaultValue `'warning'`\n */\n logLevel?: 'verbose'|'info'|'warning'|'error'|'fatal';\n\n /**\n * Indicate whether run in debug mode.\n *\n * @defaultValue `false`\n */\n debug?: boolean;\n\n /**\n * set or get a boolean value indicating whether to enable trace.\n *\n * @defaultValue `false`\n */\n trace?: boolean;\n\n /**\n * Get version of the current package.\n */\n readonly versions: {\n readonly common: string;\n readonly web?: string;\n readonly node?: string;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n readonly 'react-native'?: string;\n };\n\n /**\n * Represent a set of flags for WebAssembly\n */\n readonly wasm: Env.WebAssemblyFlags;\n\n /**\n * Represent a set of flags for WebGL\n */\n readonly webgl: Env.WebGLFlags;\n\n /**\n * Represent a set of flags for WebGPU\n */\n readonly webgpu: Env.WebGpuFlags;\n\n [name: string]: unknown;\n}\n\n/**\n * Represent a set of flags as a global singleton.\n */\nexport const env: Env = envImpl;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorToDataUrlOptions, TensorToImageDataOptions} from './tensor-conversion.js';\nimport {Tensor} from './tensor.js';\n\n/**\n * implementation of Tensor.toDataURL()\n */\nexport const tensorToDataURL = (tensor: Tensor, options?: TensorToDataUrlOptions): string => {\n const canvas = typeof document !== 'undefined' ? document.createElement('canvas') : (new OffscreenCanvas(1, 1));\n canvas.width = tensor.dims[3];\n canvas.height = tensor.dims[2];\n const pixels2DContext =\n canvas.getContext('2d') as (CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null);\n\n if (pixels2DContext != null) {\n // Default values for height and width & format\n let width: number;\n let height: number;\n if (options?.tensorLayout !== undefined && options.tensorLayout === 'NHWC') {\n width = tensor.dims[2];\n height = tensor.dims[3];\n } else { // Default layout is NCWH\n width = tensor.dims[3];\n height = tensor.dims[2];\n }\n\n const inputformat = options?.format !== undefined ? options.format : 'RGB';\n\n const norm = options?.norm;\n let normMean: [number, number, number, number];\n let normBias: [number, number, number, number];\n if (norm === undefined || norm.mean === undefined) {\n normMean = [255, 255, 255, 255];\n } else {\n if (typeof (norm.mean) === 'number') {\n normMean = [norm.mean, norm.mean, norm.mean, norm.mean];\n } else {\n normMean = [norm.mean[0], norm.mean[1], norm.mean[2], 0];\n if (norm.mean[3] !== undefined) {\n normMean[3] = norm.mean[3];\n }\n }\n }\n if (norm === undefined || norm.bias === undefined) {\n normBias = [0, 0, 0, 0];\n } else {\n if (typeof (norm.bias) === 'number') {\n normBias = [norm.bias, norm.bias, norm.bias, norm.bias];\n } else {\n normBias = [norm.bias[0], norm.bias[1], norm.bias[2], 0];\n if (norm.bias[3] !== undefined) {\n normBias[3] = norm.bias[3];\n }\n }\n }\n\n const stride = height * width;\n // Default pointer assignments\n let rTensorPointer = 0, gTensorPointer = stride, bTensorPointer = stride * 2, aTensorPointer = -1;\n\n // Updating the pointer assignments based on the input image format\n if (inputformat === 'RGBA') {\n rTensorPointer = 0;\n gTensorPointer = stride;\n bTensorPointer = stride * 2;\n aTensorPointer = stride * 3;\n } else if (inputformat === 'RGB') {\n rTensorPointer = 0;\n gTensorPointer = stride;\n bTensorPointer = stride * 2;\n } else if (inputformat === 'RBG') {\n rTensorPointer = 0;\n bTensorPointer = stride;\n gTensorPointer = stride * 2;\n }\n\n for (let i = 0; i < height; i++) {\n for (let j = 0; j < width; j++) {\n const R = ((tensor.data[rTensorPointer++] as number) - normBias[0]) * normMean[0]; // R value\n const G = ((tensor.data[gTensorPointer++] as number) - normBias[1]) * normMean[1]; // G value\n const B = ((tensor.data[bTensorPointer++] as number) - normBias[2]) * normMean[2]; // B value\n const A = aTensorPointer === -1 ?\n 255 :\n ((tensor.data[aTensorPointer++] as number) - normBias[3]) * normMean[3]; // A value\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n pixels2DContext.fillStyle = 'rgba(' + R + ',' + G + ',' + B + ',' + A + ')';\n pixels2DContext.fillRect(j, i, 1, 1);\n }\n }\n if ('toDataURL' in canvas) {\n return canvas.toDataURL();\n } else {\n throw new Error('toDataURL is not supported');\n }\n } else {\n throw new Error('Can not access image data');\n }\n};\n\n/**\n * implementation of Tensor.toImageData()\n */\nexport const tensorToImageData = (tensor: Tensor, options?: TensorToImageDataOptions): ImageData => {\n const pixels2DContext = typeof document !== 'undefined' ?\n document.createElement('canvas').getContext('2d') :\n new OffscreenCanvas(1, 1).getContext('2d') as OffscreenCanvasRenderingContext2D;\n let image: ImageData;\n if (pixels2DContext != null) {\n // Default values for height and width & format\n let width: number;\n let height: number;\n let channels: number;\n if (options?.tensorLayout !== undefined && options.tensorLayout === 'NHWC') {\n width = tensor.dims[2];\n height = tensor.dims[1];\n channels = tensor.dims[3];\n } else { // Default layout is NCWH\n width = tensor.dims[3];\n height = tensor.dims[2];\n channels = tensor.dims[1];\n }\n const inputformat = options !== undefined ? (options.format !== undefined ? options.format : 'RGB') : 'RGB';\n\n const norm = options?.norm;\n let normMean: [number, number, number, number];\n let normBias: [number, number, number, number];\n if (norm === undefined || norm.mean === undefined) {\n normMean = [255, 255, 255, 255];\n } else {\n if (typeof (norm.mean) === 'number') {\n normMean = [norm.mean, norm.mean, norm.mean, norm.mean];\n } else {\n normMean = [norm.mean[0], norm.mean[1], norm.mean[2], 255];\n if (norm.mean[3] !== undefined) {\n normMean[3] = norm.mean[3];\n }\n }\n }\n if (norm === undefined || norm.bias === undefined) {\n normBias = [0, 0, 0, 0];\n } else {\n if (typeof (norm.bias) === 'number') {\n normBias = [norm.bias, norm.bias, norm.bias, norm.bias];\n } else {\n normBias = [norm.bias[0], norm.bias[1], norm.bias[2], 0];\n if (norm.bias[3] !== undefined) {\n normBias[3] = norm.bias[3];\n }\n }\n }\n\n const stride = height * width;\n if (options !== undefined) {\n if (options.format !== undefined && (channels === 4 && options.format !== 'RGBA') ||\n (channels === 3 && (options.format !== 'RGB' && options.format !== 'BGR'))) {\n throw new Error('Tensor format doesn\\'t match input tensor dims');\n }\n }\n\n // Default pointer assignments\n const step = 4;\n let rImagePointer = 0, gImagePointer = 1, bImagePointer = 2, aImagePointer = 3;\n let rTensorPointer = 0, gTensorPointer = stride, bTensorPointer = stride * 2, aTensorPointer = -1;\n\n // Updating the pointer assignments based on the input image format\n if (inputformat === 'RGBA') {\n rTensorPointer = 0;\n gTensorPointer = stride;\n bTensorPointer = stride * 2;\n aTensorPointer = stride * 3;\n } else if (inputformat === 'RGB') {\n rTensorPointer = 0;\n gTensorPointer = stride;\n bTensorPointer = stride * 2;\n } else if (inputformat === 'RBG') {\n rTensorPointer = 0;\n bTensorPointer = stride;\n gTensorPointer = stride * 2;\n }\n\n image = pixels2DContext.createImageData(width, height);\n\n for (let i = 0; i < height * width;\n rImagePointer += step, gImagePointer += step, bImagePointer += step, aImagePointer += step, i++) {\n image.data[rImagePointer] = ((tensor.data[rTensorPointer++] as number) - normBias[0]) * normMean[0]; // R value\n image.data[gImagePointer] = ((tensor.data[gTensorPointer++] as number) - normBias[1]) * normMean[1]; // G value\n image.data[bImagePointer] = ((tensor.data[bTensorPointer++] as number) - normBias[2]) * normMean[2]; // B value\n image.data[aImagePointer] = aTensorPointer === -1 ?\n 255 :\n ((tensor.data[aTensorPointer++] as number) - normBias[3]) * normMean[3]; // A value\n }\n\n } else {\n throw new Error('Can not access image data');\n }\n return image;\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {OptionsDimensions, OptionsFormat, OptionsNormalizationParameters, OptionsTensorFormat, OptionsTensorLayout, TensorFromGpuBufferOptions, TensorFromImageBitmapOptions, TensorFromImageDataOptions, TensorFromImageElementOptions, TensorFromTextureOptions, TensorFromUrlOptions} from './tensor-factory.js';\nimport {Tensor} from './tensor-impl.js';\nimport {Tensor as TensorInterface} from './tensor.js';\n\ninterface BufferToTensorOptions extends OptionsDimensions, OptionsTensorLayout, OptionsNormalizationParameters,\n OptionsFormat, OptionsTensorFormat {}\n\n/**\n * Create a new tensor object from image object\n *\n * @param buffer - Extracted image buffer data - assuming RGBA format\n * @param imageFormat - input image configuration - required configurations height, width, format\n * @param tensorFormat - output tensor configuration - Default is RGB format\n */\nexport const bufferToTensor = (buffer: Uint8ClampedArray|undefined, options: BufferToTensorOptions): Tensor => {\n if (buffer === undefined) {\n throw new Error('Image buffer must be defined');\n }\n if (options.height === undefined || options.width === undefined) {\n throw new Error('Image height and width must be defined');\n }\n if (options.tensorLayout === 'NHWC') {\n throw new Error('NHWC Tensor layout is not supported yet');\n }\n\n const {height, width} = options;\n\n const norm = options.norm ?? {mean: 255, bias: 0};\n let normMean: [number, number, number, number];\n let normBias: [number, number, number, number];\n\n if (typeof (norm.mean) === 'number') {\n normMean = [norm.mean, norm.mean, norm.mean, norm.mean];\n } else {\n normMean = [norm.mean![0], norm.mean![1], norm.mean![2], norm.mean![3] ?? 255];\n }\n\n if (typeof (norm.bias) === 'number') {\n normBias = [norm.bias, norm.bias, norm.bias, norm.bias];\n } else {\n normBias = [norm.bias![0], norm.bias![1], norm.bias![2], norm.bias![3] ?? 0];\n }\n\n const inputformat = options.format !== undefined ? options.format : 'RGBA';\n // default value is RGBA since imagedata and HTMLImageElement uses it\n\n const outputformat =\n options.tensorFormat !== undefined ? (options.tensorFormat !== undefined ? options.tensorFormat : 'RGB') : 'RGB';\n const stride = height * width;\n const float32Data = outputformat === 'RGBA' ? new Float32Array(stride * 4) : new Float32Array(stride * 3);\n\n // Default pointer assignments\n let step = 4, rImagePointer = 0, gImagePointer = 1, bImagePointer = 2, aImagePointer = 3;\n let rTensorPointer = 0, gTensorPointer = stride, bTensorPointer = stride * 2, aTensorPointer = -1;\n\n // Updating the pointer assignments based on the input image format\n if (inputformat === 'RGB') {\n step = 3;\n rImagePointer = 0;\n gImagePointer = 1;\n bImagePointer = 2;\n aImagePointer = -1;\n }\n\n // Updating the pointer assignments based on the output tensor format\n if (outputformat === 'RGBA') {\n aTensorPointer = stride * 3;\n } else if (outputformat === 'RBG') {\n rTensorPointer = 0;\n bTensorPointer = stride;\n gTensorPointer = stride * 2;\n } else if (outputformat === 'BGR') {\n bTensorPointer = 0;\n gTensorPointer = stride;\n rTensorPointer = stride * 2;\n }\n\n for (let i = 0; i < stride;\n i++, rImagePointer += step, bImagePointer += step, gImagePointer += step, aImagePointer += step) {\n float32Data[rTensorPointer++] = (buffer[rImagePointer] + normBias[0]) / normMean[0];\n float32Data[gTensorPointer++] = (buffer[gImagePointer] + normBias[1]) / normMean[1];\n float32Data[bTensorPointer++] = (buffer[bImagePointer] + normBias[2]) / normMean[2];\n if (aTensorPointer !== -1 && aImagePointer !== -1) {\n float32Data[aTensorPointer++] = (buffer[aImagePointer] + normBias[3]) / normMean[3];\n }\n }\n\n // Float32Array -> ort.Tensor\n const outputTensor = outputformat === 'RGBA' ? new Tensor('float32', float32Data, [1, 4, height, width]) :\n new Tensor('float32', float32Data, [1, 3, height, width]);\n return outputTensor;\n};\n\n/**\n * implementation of Tensor.fromImage().\n */\nexport const tensorFromImage = async(\n image: ImageData|HTMLImageElement|ImageBitmap|string,\n options?: TensorFromImageDataOptions|TensorFromImageElementOptions|TensorFromImageBitmapOptions|\n TensorFromUrlOptions): Promise => {\n // checking the type of image object\n const isHTMLImageEle = typeof (HTMLImageElement) !== 'undefined' && image instanceof HTMLImageElement;\n const isImageDataEle = typeof (ImageData) !== 'undefined' && image instanceof ImageData;\n const isImageBitmap = typeof (ImageBitmap) !== 'undefined' && image instanceof ImageBitmap;\n const isString = typeof image === 'string';\n\n let data: Uint8ClampedArray|undefined;\n let bufferToTensorOptions: BufferToTensorOptions = options ?? {};\n\n const createCanvas = () => {\n if (typeof document !== 'undefined') {\n return document.createElement('canvas');\n } else if (typeof OffscreenCanvas !== 'undefined') {\n return new OffscreenCanvas(1, 1);\n } else {\n throw new Error('Canvas is not supported');\n }\n };\n const createCanvasContext = (canvas: HTMLCanvasElement|OffscreenCanvas) => {\n if (canvas instanceof HTMLCanvasElement) {\n return canvas.getContext('2d');\n } else if (canvas instanceof OffscreenCanvas) {\n return canvas.getContext('2d') as OffscreenCanvasRenderingContext2D;\n } else {\n return null;\n }\n };\n // filling and checking image configuration options\n if (isHTMLImageEle) {\n // HTMLImageElement - image object - format is RGBA by default\n const canvas = createCanvas();\n canvas.width = image.width;\n canvas.height = image.height;\n const pixels2DContext = createCanvasContext(canvas);\n\n if (pixels2DContext != null) {\n let height = image.height;\n let width = image.width;\n if (options !== undefined && options.resizedHeight !== undefined && options.resizedWidth !== undefined) {\n height = options.resizedHeight;\n width = options.resizedWidth;\n }\n\n if (options !== undefined) {\n bufferToTensorOptions = options;\n if (options.tensorFormat !== undefined) {\n throw new Error('Image input config format must be RGBA for HTMLImageElement');\n } else {\n bufferToTensorOptions.tensorFormat = 'RGBA';\n }\n bufferToTensorOptions.height = height;\n bufferToTensorOptions.width = width;\n } else {\n bufferToTensorOptions.tensorFormat = 'RGBA';\n bufferToTensorOptions.height = height;\n bufferToTensorOptions.width = width;\n }\n\n pixels2DContext.drawImage(image, 0, 0);\n data = pixels2DContext.getImageData(0, 0, width, height).data;\n } else {\n throw new Error('Can not access image data');\n }\n } else if (isImageDataEle) {\n let height: number;\n let width: number;\n\n if (options !== undefined && options.resizedWidth !== undefined && options.resizedHeight !== undefined) {\n height = options.resizedHeight;\n width = options.resizedWidth;\n } else {\n height = image.height;\n width = image.width;\n }\n\n if (options !== undefined) {\n bufferToTensorOptions = options;\n }\n bufferToTensorOptions.format = 'RGBA';\n bufferToTensorOptions.height = height;\n bufferToTensorOptions.width = width;\n\n if (options !== undefined) {\n const tempCanvas = createCanvas();\n\n tempCanvas.width = width;\n tempCanvas.height = height;\n\n const pixels2DContext = createCanvasContext(tempCanvas);\n\n if (pixels2DContext != null) {\n pixels2DContext.putImageData(image, 0, 0);\n data = pixels2DContext.getImageData(0, 0, width, height).data;\n } else {\n throw new Error('Can not access image data');\n }\n } else {\n data = image.data;\n }\n } else if (isImageBitmap) {\n // ImageBitmap - image object - format must be provided by user\n if (options === undefined) {\n throw new Error('Please provide image config with format for Imagebitmap');\n }\n\n const canvas = createCanvas();\n canvas.width = image.width;\n canvas.height = image.height;\n const pixels2DContext = createCanvasContext(canvas);\n\n if (pixels2DContext != null) {\n const height = image.height;\n const width = image.width;\n pixels2DContext.drawImage(image, 0, 0, width, height);\n data = pixels2DContext.getImageData(0, 0, width, height).data;\n bufferToTensorOptions.height = height;\n bufferToTensorOptions.width = width;\n return bufferToTensor(data, bufferToTensorOptions);\n } else {\n throw new Error('Can not access image data');\n }\n } else if (isString) {\n return new Promise((resolve, reject) => {\n const canvas = createCanvas();\n const context = createCanvasContext(canvas);\n if (!image || !context) {\n return reject();\n }\n const newImage = new Image();\n newImage.crossOrigin = 'Anonymous';\n newImage.src = image;\n newImage.onload = () => {\n canvas.width = newImage.width;\n canvas.height = newImage.height;\n context.drawImage(newImage, 0, 0, canvas.width, canvas.height);\n const img = context.getImageData(0, 0, canvas.width, canvas.height);\n\n bufferToTensorOptions.height = canvas.height;\n bufferToTensorOptions.width = canvas.width;\n resolve(bufferToTensor(img.data, bufferToTensorOptions));\n };\n });\n } else {\n throw new Error('Input data provided is not supported - aborted tensor creation');\n }\n\n if (data !== undefined) {\n return bufferToTensor(data, bufferToTensorOptions);\n } else {\n throw new Error('Input data provided is not supported - aborted tensor creation');\n }\n};\n\n/**\n * implementation of Tensor.fromTexture().\n */\nexport const tensorFromTexture = (\n texture: TensorInterface.TextureType, options: TensorFromTextureOptions): Tensor => {\n const {width, height, download, dispose} = options;\n // Always assume RGBAF32. TODO: support different texture format\n const dims = [1, height, width, 4];\n return new Tensor({location: 'texture', type: 'float32', texture, dims, download, dispose});\n};\n\n/**\n * implementation of Tensor.fromGpuBuffer().\n */\nexport const tensorFromGpuBuffer = (\n gpuBuffer: TensorInterface.GpuBufferType, options: TensorFromGpuBufferOptions): Tensor => {\n const {dataType, dims, download, dispose} = options;\n return new Tensor({location: 'gpu-buffer', type: dataType ?? 'float32', gpuBuffer, dims, download, dispose});\n};\n\n/**\n * implementation of Tensor.fromPinnedBuffer().\n */\nexport const tensorFromPinnedBuffer = (\n type: T, buffer: TensorInterface.DataTypeMap[T], dims?: readonly number[]): Tensor =>\n new Tensor({location: 'cpu-pinned', type, data: buffer, dims: dims ?? [buffer.length]});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from './tensor.js';\n\nexport type SupportedTypedArrayConstructors = Float32ArrayConstructor|Uint8ArrayConstructor|Int8ArrayConstructor|\n Uint16ArrayConstructor|Int16ArrayConstructor|Int32ArrayConstructor|BigInt64ArrayConstructor|Uint8ArrayConstructor|\n Float64ArrayConstructor|Uint32ArrayConstructor|BigUint64ArrayConstructor;\nexport type SupportedTypedArray = InstanceType;\n\n// a runtime map that maps type string to TypedArray constructor. Should match Tensor.DataTypeMap.\nexport const NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP = new Map([\n ['float32', Float32Array],\n ['uint8', Uint8Array],\n ['int8', Int8Array],\n ['uint16', Uint16Array],\n ['int16', Int16Array],\n ['int32', Int32Array],\n ['bool', Uint8Array],\n ['float64', Float64Array],\n ['uint32', Uint32Array],\n]);\n\n// a runtime map that maps type string to TypedArray constructor. Should match Tensor.DataTypeMap.\nexport const NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP = new Map([\n [Float32Array, 'float32'],\n [Uint8Array, 'uint8'],\n [Int8Array, 'int8'],\n [Uint16Array, 'uint16'],\n [Int16Array, 'int16'],\n [Int32Array, 'int32'],\n [Float64Array, 'float64'],\n [Uint32Array, 'uint32'],\n]);\n\n// a dummy type declaration for Float16Array in case any polyfill is available.\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-explicit-any\n const Float16Array: any;\n}\n\n// the following code allows delaying execution of BigInt/Float16Array checking. This allows lazy initialization for\n// NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP and NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP, which allows BigInt/Float16Array\n// polyfill if available.\nlet isTypedArrayChecked = false;\nexport const checkTypedArray = () => {\n if (!isTypedArrayChecked) {\n isTypedArrayChecked = true;\n const isBigInt64ArrayAvailable = typeof BigInt64Array !== 'undefined' && BigInt64Array.from;\n const isBigUint64ArrayAvailable = typeof BigUint64Array !== 'undefined' && BigUint64Array.from;\n const isFloat16ArrayAvailable = typeof Float16Array !== 'undefined' && Float16Array.from;\n\n if (isBigInt64ArrayAvailable) {\n NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('int64', BigInt64Array);\n NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(BigInt64Array, 'int64');\n }\n if (isBigUint64ArrayAvailable) {\n NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('uint64', BigUint64Array);\n NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(BigUint64Array, 'uint64');\n }\n if (isFloat16ArrayAvailable) {\n NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('float16', Float16Array);\n NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(Float16Array, 'float16');\n } else {\n // if Float16Array is not available, use 'Uint16Array' to store the data.\n NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('float16', Uint16Array);\n }\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {CpuPinnedConstructorParameters, GpuBufferConstructorParameters, TextureConstructorParameters} from './tensor-factory.js';\nimport {Tensor} from './tensor-impl.js';\n\n/**\n * calculate size from dims.\n *\n * @param dims the dims array. May be an illegal input.\n */\nexport const calculateSize = (dims: readonly unknown[]): number => {\n let size = 1;\n for (let i = 0; i < dims.length; i++) {\n const dim = dims[i];\n if (typeof dim !== 'number' || !Number.isSafeInteger(dim)) {\n throw new TypeError(`dims[${i}] must be an integer, got: ${dim}`);\n }\n if (dim < 0) {\n throw new RangeError(`dims[${i}] must be a non-negative integer, got: ${dim}`);\n }\n size *= dim;\n }\n return size;\n};\n\n/**\n * implementation of Tensor.reshape()\n */\nexport const tensorReshape = (tensor: Tensor, dims: readonly number[]): Tensor => {\n switch (tensor.location) {\n case 'cpu':\n return new Tensor(tensor.type, tensor.data, dims);\n case 'cpu-pinned':\n return new Tensor({\n location: 'cpu-pinned',\n data: tensor.data as CpuPinnedConstructorParameters['data'],\n type: tensor.type as CpuPinnedConstructorParameters['type'],\n dims,\n });\n case 'texture':\n return new Tensor({\n location: 'texture',\n texture: tensor.texture,\n type: tensor.type as TextureConstructorParameters['type'],\n dims,\n });\n case 'gpu-buffer':\n return new Tensor({\n location: 'gpu-buffer',\n gpuBuffer: tensor.gpuBuffer,\n type: tensor.type as GpuBufferConstructorParameters['type'],\n dims,\n });\n default:\n throw new Error(`tensorReshape: tensor location ${tensor.location} is not supported`);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {tensorToDataURL, tensorToImageData} from './tensor-conversion-impl.js';\nimport {TensorToDataUrlOptions, TensorToImageDataOptions} from './tensor-conversion.js';\nimport {tensorFromGpuBuffer, tensorFromImage, tensorFromPinnedBuffer, tensorFromTexture} from './tensor-factory-impl.js';\nimport {CpuPinnedConstructorParameters, GpuBufferConstructorParameters, TensorFromGpuBufferOptions, TensorFromImageBitmapOptions, TensorFromImageDataOptions, TensorFromImageElementOptions, TensorFromTextureOptions, TensorFromUrlOptions, TextureConstructorParameters} from './tensor-factory.js';\nimport {checkTypedArray, NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP, NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP, SupportedTypedArray, SupportedTypedArrayConstructors} from './tensor-impl-type-mapping.js';\nimport {calculateSize, tensorReshape} from './tensor-utils-impl.js';\nimport {Tensor as TensorInterface} from './tensor.js';\n\n// type aliases for those exported from Tensor interface\n\ntype TensorType = TensorInterface.Type;\ntype TensorDataType = TensorInterface.DataType;\ntype TensorDataLocation = TensorInterface.DataLocation;\ntype TensorTextureType = TensorInterface.TextureType;\ntype TensorGpuBufferType = TensorInterface.GpuBufferType;\n\n/**\n * the implementation of Tensor interface.\n *\n * @ignore\n */\nexport class Tensor implements TensorInterface {\n // #region constructors\n\n /**\n * Construct a new CPU tensor object from the given type, data and dims.\n */\n constructor(\n type: TensorType, data: TensorDataType|readonly string[]|readonly number[]|readonly boolean[],\n dims?: readonly number[]);\n /**\n * Construct a new CPU tensor object from the given data and dims. Type is inferred from data.\n */\n constructor(data: TensorDataType|readonly string[]|readonly boolean[], dims?: readonly number[]);\n /**\n * Construct a new tensor object from the pinned CPU data with the given type and dims.\n *\n * Tensor's location will be set to 'cpu-pinned'.\n *\n * @param params - Specify the parameters to construct the tensor.\n */\n constructor(params: CpuPinnedConstructorParameters);\n /**\n * Construct a new tensor object from the WebGL texture with the given type and dims.\n *\n * Tensor's location will be set to 'texture'.\n *\n * @param params - Specify the parameters to construct the tensor.\n */\n constructor(params: TextureConstructorParameters);\n /**\n * Construct a new tensor object from the WebGPU buffer with the given type and dims.\n *\n * Tensor's location will be set to 'gpu-buffer'.\n *\n * @param params - Specify the parameters to construct the tensor.\n */\n constructor(params: GpuBufferConstructorParameters);\n\n /**\n * implementation.\n */\n constructor(\n arg0: TensorType|TensorDataType|readonly string[]|readonly boolean[]|CpuPinnedConstructorParameters|\n TextureConstructorParameters|GpuBufferConstructorParameters,\n arg1?: TensorDataType|readonly number[]|readonly string[]|readonly boolean[], arg2?: readonly number[]) {\n // perform one-time check for BigInt/Float16Array support\n checkTypedArray();\n\n let type: TensorType;\n let dims: readonly number[];\n\n if (typeof arg0 === 'object' && 'location' in arg0) {\n //\n // constructing tensor from specific location\n //\n this.dataLocation = arg0.location;\n type = arg0.type;\n dims = arg0.dims;\n switch (arg0.location) {\n case 'cpu-pinned': {\n const expectedTypedArrayConstructor = NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.get(type);\n if (!expectedTypedArrayConstructor) {\n throw new TypeError(`unsupported type \"${type}\" to create tensor from pinned buffer`);\n }\n if (!(arg0.data instanceof expectedTypedArrayConstructor)) {\n throw new TypeError(`buffer should be of type ${expectedTypedArrayConstructor.name}`);\n }\n this.cpuData = arg0.data;\n break;\n }\n case 'texture': {\n if (type !== 'float32') {\n throw new TypeError(`unsupported type \"${type}\" to create tensor from texture`);\n }\n this.gpuTextureData = arg0.texture;\n this.downloader = arg0.download;\n this.disposer = arg0.dispose;\n break;\n }\n case 'gpu-buffer': {\n if ((type !== 'float32' && type !== 'float16' && type !== 'int32' && type !== 'int64' && type !== 'uint32' &&\n type !== 'uint8' && type !== 'bool')) {\n throw new TypeError(`unsupported type \"${type}\" to create tensor from gpu buffer`);\n }\n this.gpuBufferData = arg0.gpuBuffer;\n this.downloader = arg0.download;\n this.disposer = arg0.dispose;\n break;\n }\n default:\n throw new Error(`Tensor constructor: unsupported location '${this.dataLocation}'`);\n }\n } else {\n //\n // constructing tensor of location 'cpu'\n //\n let data: TensorDataType;\n let maybeDims: typeof arg1|typeof arg2;\n // check whether arg0 is type or data\n if (typeof arg0 === 'string') {\n //\n // Override: constructor(type, data, ...)\n //\n type = arg0;\n maybeDims = arg2;\n if (arg0 === 'string') {\n // string tensor\n if (!Array.isArray(arg1)) {\n throw new TypeError('A string tensor\\'s data must be a string array.');\n }\n // we don't check whether every element in the array is string; this is too slow. we assume it's correct and\n // error will be populated at inference\n data = arg1;\n } else {\n // numeric tensor\n const typedArrayConstructor = NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.get(arg0);\n if (typedArrayConstructor === undefined) {\n throw new TypeError(`Unsupported tensor type: ${arg0}.`);\n }\n if (Array.isArray(arg1)) {\n if (arg0 === 'float16' && typedArrayConstructor === Uint16Array) {\n // When no Float16Array polyfill is used, we cannot create 'float16' tensor from number array.\n //\n // Throw error here because when user try to use number array as data,\n // e.g. new Tensor('float16', [1, 2, 3, 4], dims)), it will actually call\n // Uint16Array.from(arg1) which generates wrong data.\n throw new TypeError(\n 'Creating a float16 tensor from number array is not supported. Please use Uint16Array as data.');\n } else if (arg0 === 'uint64' || arg0 === 'int64') {\n // use 'as any' here because:\n // 1. TypeScript's check on type of 'Array.isArray()' does not work with readonly arrays.\n // see https://github.com/microsoft/TypeScript/issues/17002\n // 2. TypeScript's check on union type of '(BigInt64ArrayConstructor|BigUint64ArrayConstructor).from()'\n // does not accept parameter mapFn.\n // 3. parameters of 'SupportedTypedArrayConstructors.from()' does not match the requirement of the union\n // type.\n\n // assume 'arg1' is of type \"readonly number[]|readonly bigint[]\" here.\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data = (typedArrayConstructor as any).from(arg1, BigInt);\n } else {\n // assume 'arg1' is of type \"readonly number[]\" here.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data = (typedArrayConstructor as any).from(arg1);\n }\n } else if (arg1 instanceof typedArrayConstructor) {\n data = arg1;\n } else {\n throw new TypeError(`A ${type} tensor's data must be type of ${typedArrayConstructor}`);\n }\n }\n } else {\n //\n // Override: constructor(data, ...)\n //\n maybeDims = arg1;\n if (Array.isArray(arg0)) {\n // only boolean[] and string[] is supported\n if (arg0.length === 0) {\n throw new TypeError('Tensor type cannot be inferred from an empty array.');\n }\n const firstElementType = typeof arg0[0];\n if (firstElementType === 'string') {\n type = 'string';\n data = arg0;\n } else if (firstElementType === 'boolean') {\n type = 'bool';\n // 'arg0' is of type 'boolean[]'. Uint8Array.from(boolean[]) actually works, but typescript thinks this is\n // wrong type. We use 'as any' to make it happy.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data = Uint8Array.from(arg0 as any[]);\n } else {\n throw new TypeError(`Invalid element type of data array: ${firstElementType}.`);\n }\n } else {\n // get tensor type from TypedArray\n const mappedType =\n NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.get(arg0.constructor as SupportedTypedArrayConstructors);\n if (mappedType === undefined) {\n throw new TypeError(`Unsupported type for tensor data: ${arg0.constructor}.`);\n }\n type = mappedType;\n data = arg0 as SupportedTypedArray;\n }\n }\n\n // type and data is processed, now processing dims\n if (maybeDims === undefined) {\n // assume 1-D tensor if dims omitted\n maybeDims = [data.length];\n } else if (!Array.isArray(maybeDims)) {\n throw new TypeError('A tensor\\'s dims must be a number array');\n }\n dims = maybeDims as readonly number[];\n\n this.cpuData = data;\n this.dataLocation = 'cpu';\n }\n\n // perform check on dims\n const size = calculateSize(dims);\n // if data is on CPU, check whether data length matches tensor size\n if (this.cpuData && size !== this.cpuData.length) {\n throw new Error(`Tensor's size(${size}) does not match data length(${this.cpuData.length}).`);\n }\n\n this.type = type;\n this.dims = dims;\n this.size = size;\n }\n // #endregion\n\n // #region factory\n static async fromImage(\n image: ImageData|HTMLImageElement|ImageBitmap|string,\n options?: TensorFromImageDataOptions|TensorFromImageElementOptions|TensorFromImageBitmapOptions|\n TensorFromUrlOptions): Promise {\n return tensorFromImage(image, options);\n }\n\n static fromTexture(\n texture: TensorTextureType, options: TensorFromTextureOptions): TensorInterface {\n return tensorFromTexture(texture, options);\n }\n\n static fromGpuBuffer(\n gpuBuffer: TensorGpuBufferType, options: TensorFromGpuBufferOptions): TensorInterface {\n return tensorFromGpuBuffer(gpuBuffer, options);\n }\n\n static fromPinnedBuffer(\n type: T, buffer: TensorInterface.DataTypeMap[T], dims?: readonly number[]): Tensor {\n return tensorFromPinnedBuffer(type, buffer, dims);\n }\n\n // #endregion\n\n // #region conversions\n toDataURL(options?: TensorToDataUrlOptions): string {\n return tensorToDataURL(this, options);\n }\n\n toImageData(options?: TensorToImageDataOptions): ImageData {\n return tensorToImageData(this, options);\n }\n // #endregion\n\n // #region public fields\n readonly dims: readonly number[];\n readonly type: TensorType;\n readonly size: number;\n // #endregion\n\n // #region private fields\n\n /**\n * stores the location of the data.\n */\n private dataLocation: TensorDataLocation;\n\n /**\n * stores the data on CPU, if location is 'cpu' or 'cpu-pinned'. otherwise empty.\n */\n private cpuData?: TensorDataType;\n\n /**\n * stores the underlying texture when location is 'texture'. otherwise empty.\n */\n private gpuTextureData?: TensorTextureType;\n\n /**\n * stores the underlying GPU buffer when location is 'gpu-buffer'. otherwise empty.\n */\n private gpuBufferData?: TensorGpuBufferType;\n\n /**\n * stores an optional downloader function to download data from GPU to CPU.\n */\n private downloader?(): Promise;\n\n /**\n * a flag indicating whether the data is being downloaded from GPU to CPU.\n */\n private isDownloading?: boolean;\n\n /**\n * stores an optional disposer function to dispose the underlying data.\n */\n private disposer?(): void;\n // #endregion\n\n // #region properties\n get data(): TensorDataType {\n this.ensureValid();\n if (!this.cpuData) {\n throw new Error(\n 'The data is not on CPU. Use `getData()` to download GPU data to CPU, ' +\n 'or use `texture` or `gpuBuffer` property to access the GPU data directly.');\n }\n return this.cpuData;\n }\n\n get location(): TensorDataLocation {\n return this.dataLocation;\n }\n\n get texture(): TensorTextureType {\n this.ensureValid();\n if (!this.gpuTextureData) {\n throw new Error('The data is not stored as a WebGL texture.');\n }\n return this.gpuTextureData;\n }\n\n get gpuBuffer(): TensorGpuBufferType {\n this.ensureValid();\n if (!this.gpuBufferData) {\n throw new Error('The data is not stored as a WebGPU buffer.');\n }\n return this.gpuBufferData;\n }\n // #endregion\n\n // #region methods\n\n async getData(releaseData?: boolean): Promise {\n this.ensureValid();\n switch (this.dataLocation) {\n case 'cpu':\n case 'cpu-pinned':\n return this.data;\n case 'texture':\n case 'gpu-buffer': {\n if (!this.downloader) {\n throw new Error('The current tensor is not created with a specified data downloader.');\n }\n if (this.isDownloading) {\n throw new Error('The current tensor is being downloaded.');\n }\n try {\n this.isDownloading = true;\n const data = await this.downloader();\n this.downloader = undefined;\n this.dataLocation = 'cpu';\n this.cpuData = data;\n\n if (releaseData && this.disposer) {\n this.disposer();\n this.disposer = undefined;\n }\n\n return data;\n\n } finally {\n this.isDownloading = false;\n }\n }\n default:\n throw new Error(`cannot get data from location: ${this.dataLocation}`);\n }\n }\n\n dispose(): void {\n if (this.isDownloading) {\n throw new Error('The current tensor is being downloaded.');\n }\n\n if (this.disposer) {\n this.disposer();\n this.disposer = undefined;\n }\n this.cpuData = undefined;\n this.gpuTextureData = undefined;\n this.gpuBufferData = undefined;\n this.downloader = undefined;\n this.isDownloading = undefined;\n\n this.dataLocation = 'none';\n }\n\n // #endregion\n\n // #region tensor utilities\n private ensureValid(): void {\n if (this.dataLocation === 'none') {\n throw new Error('The tensor is disposed.');\n }\n }\n\n reshape(dims: readonly number[]): TensorInterface {\n this.ensureValid();\n if (this.downloader || this.disposer) {\n throw new Error('Cannot reshape a tensor that owns GPU resource.');\n }\n return tensorReshape(this, dims);\n }\n // #endregion\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorFactory} from './tensor-factory.js';\nimport {Tensor as TensorImpl} from './tensor-impl.js';\nimport {TypedTensorUtils} from './tensor-utils.js';\n\n/* eslint-disable @typescript-eslint/no-redeclare */\n\n/**\n * represent a basic tensor with specified dimensions and data type.\n */\ninterface TypedTensorBase {\n /**\n * Get the dimensions of the tensor.\n */\n readonly dims: readonly number[];\n /**\n * Get the data type of the tensor.\n */\n readonly type: T;\n /**\n * Get the buffer data of the tensor.\n *\n * If the data is not on CPU (eg. it's in the form of WebGL texture or WebGPU buffer), throw error.\n */\n readonly data: Tensor.DataTypeMap[T];\n /**\n * Get the location of the data.\n */\n readonly location: Tensor.DataLocation;\n /**\n * Get the WebGL texture that holds the tensor data.\n *\n * If the data is not on GPU as WebGL texture, throw error.\n */\n readonly texture: Tensor.TextureType;\n /**\n * Get the WebGPU buffer that holds the tensor data.\n *\n * If the data is not on GPU as WebGPU buffer, throw error.\n */\n readonly gpuBuffer: Tensor.GpuBufferType;\n\n /**\n * Get the buffer data of the tensor.\n *\n * If the data is on CPU, returns the data immediately.\n * If the data is on GPU, downloads the data and returns the promise.\n *\n * @param releaseData - whether release the data on GPU. Ignore if data is already on CPU.\n */\n getData(releaseData?: boolean): Promise;\n\n /**\n * Dispose the tensor data.\n *\n * If the data is on CPU, remove its internal reference to the underlying data.\n * If the data is on GPU, release the data on GPU.\n *\n * After calling this function, the tensor is considered no longer valid. Its location will be set to 'none'.\n */\n dispose(): void;\n}\n\nexport declare namespace Tensor {\n interface DataTypeMap {\n float32: Float32Array;\n uint8: Uint8Array;\n int8: Int8Array;\n uint16: Uint16Array;\n int16: Int16Array;\n int32: Int32Array;\n int64: BigInt64Array;\n string: string[];\n bool: Uint8Array;\n float16: Uint16Array; // Keep using Uint16Array until we have a concrete solution for float 16.\n float64: Float64Array;\n uint32: Uint32Array;\n uint64: BigUint64Array;\n // complex64: never;\n // complex128: never;\n // bfloat16: never;\n }\n\n interface ElementTypeMap {\n float32: number;\n uint8: number;\n int8: number;\n uint16: number;\n int16: number;\n int32: number;\n int64: bigint;\n string: string;\n bool: boolean;\n float16: number; // Keep using Uint16Array until we have a concrete solution for float 16.\n float64: number;\n uint32: number;\n uint64: bigint;\n // complex64: never;\n // complex128: never;\n // bfloat16: never;\n }\n\n type DataType = DataTypeMap[Type];\n type ElementType = ElementTypeMap[Type];\n\n /**\n * supported data types for constructing a tensor from a pinned CPU buffer\n */\n export type CpuPinnedDataTypes = Exclude;\n\n /**\n * type alias for WebGL texture\n */\n export type TextureType = WebGLTexture;\n\n /**\n * supported data types for constructing a tensor from a WebGL texture\n */\n export type TextureDataTypes = 'float32';\n\n /**\n * type alias for WebGPU buffer\n *\n * The reason why we don't use type \"GPUBuffer\" defined in webgpu.d.ts from @webgpu/types is because \"@webgpu/types\"\n * requires \"@types/dom-webcodecs\" as peer dependency when using TypeScript < v5.1 and its version need to be chosen\n * carefully according to the TypeScript version being used. This means so far there is not a way to keep every\n * TypeScript version happy. It turns out that we will easily broke users on some TypeScript version.\n *\n * for more info see https://github.com/gpuweb/types/issues/127\n */\n export type GpuBufferType = {size: number; mapState: 'unmapped' | 'pending' | 'mapped'};\n\n /**\n * supported data types for constructing a tensor from a WebGPU buffer\n */\n export type GpuBufferDataTypes = 'float32'|'float16'|'int32'|'int64'|'uint32'|'uint8'|'bool';\n\n /**\n * represent where the tensor data is stored\n */\n export type DataLocation = 'none'|'cpu'|'cpu-pinned'|'texture'|'gpu-buffer';\n\n /**\n * represent the data type of a tensor\n */\n export type Type = keyof DataTypeMap;\n}\n\n/**\n * Represent multi-dimensional arrays to feed to or fetch from model inferencing.\n */\nexport interface TypedTensor extends TypedTensorBase, TypedTensorUtils {}\n/**\n * Represent multi-dimensional arrays to feed to or fetch from model inferencing.\n */\nexport interface Tensor extends TypedTensorBase, TypedTensorUtils {}\n\n/**\n * type TensorConstructor defines the constructors of 'Tensor' to create CPU tensor instances.\n */\nexport interface TensorConstructor extends TensorFactory {\n // #region CPU tensor - specify element type\n /**\n * Construct a new string tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(type: 'string', data: Tensor.DataTypeMap['string']|readonly string[],\n dims?: readonly number[]): TypedTensor<'string'>;\n\n /**\n * Construct a new bool tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(type: 'bool', data: Tensor.DataTypeMap['bool']|readonly boolean[], dims?: readonly number[]): TypedTensor<'bool'>;\n\n /**\n * Construct a new 64-bit integer typed tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(\n type: T, data: Tensor.DataTypeMap[T]|readonly bigint[]|readonly number[],\n dims?: readonly number[]): TypedTensor;\n\n /**\n * Construct a new numeric tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new>(\n type: T, data: Tensor.DataTypeMap[T]|readonly number[], dims?: readonly number[]): TypedTensor;\n // #endregion\n\n // #region CPU tensor - infer element types\n\n /**\n * Construct a new float32 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Float32Array, dims?: readonly number[]): TypedTensor<'float32'>;\n\n /**\n * Construct a new int8 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Int8Array, dims?: readonly number[]): TypedTensor<'int8'>;\n\n /**\n * Construct a new uint8 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Uint8Array, dims?: readonly number[]): TypedTensor<'uint8'>;\n\n /**\n * Construct a new uint16 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Uint16Array, dims?: readonly number[]): TypedTensor<'uint16'>;\n\n /**\n * Construct a new int16 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Int16Array, dims?: readonly number[]): TypedTensor<'int16'>;\n\n /**\n * Construct a new int32 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Int32Array, dims?: readonly number[]): TypedTensor<'int32'>;\n\n /**\n * Construct a new int64 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: BigInt64Array, dims?: readonly number[]): TypedTensor<'int64'>;\n\n /**\n * Construct a new string tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: readonly string[], dims?: readonly number[]): TypedTensor<'string'>;\n\n /**\n * Construct a new bool tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: readonly boolean[], dims?: readonly number[]): TypedTensor<'bool'>;\n\n /**\n * Construct a new float64 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Float64Array, dims?: readonly number[]): TypedTensor<'float64'>;\n\n /**\n * Construct a new uint32 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Uint32Array, dims?: readonly number[]): TypedTensor<'uint32'>;\n\n /**\n * Construct a new uint64 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: BigUint64Array, dims?: readonly number[]): TypedTensor<'uint64'>;\n\n // #endregion\n\n // #region CPU tensor - fall back to non-generic tensor type declaration\n\n /**\n * Construct a new tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(type: Tensor.Type, data: Tensor.DataType|readonly number[]|readonly string[]|readonly bigint[]|readonly boolean[],\n dims?: readonly number[]): Tensor;\n\n /**\n * Construct a new tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Tensor.DataType, dims?: readonly number[]): Tensor;\n // #endregion\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const Tensor = TensorImpl as TensorConstructor;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from './env-impl.js';\n\n/**\n * @ignore\n */\nexport const TRACE = (deviceType: string, label: string) => {\n if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {\n return;\n }\n // eslint-disable-next-line no-console\n console.timeStamp(`${deviceType}::ORT::${label}`);\n};\n\nconst TRACE_FUNC = (msg: string, extraMsg?: string) => {\n const stack = new Error().stack?.split(/\\r\\n|\\r|\\n/g) || [];\n let hasTraceFunc = false;\n for (let i = 0; i < stack.length; i++) {\n if (hasTraceFunc && !stack[i].includes('TRACE_FUNC')) {\n let label = `FUNC_${msg}::${stack[i].trim().split(' ')[1]}`;\n if (extraMsg) {\n label += `::${extraMsg}`;\n }\n TRACE('CPU', label);\n return;\n }\n if (stack[i].includes('TRACE_FUNC')) {\n hasTraceFunc = true;\n }\n }\n};\n\n/**\n * @ignore\n */\nexport const TRACE_FUNC_BEGIN = (extraMsg?: string) => {\n if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {\n return;\n }\n TRACE_FUNC('BEGIN', extraMsg);\n};\n\n/**\n * @ignore\n */\nexport const TRACE_FUNC_END = (extraMsg?: string) => {\n if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {\n return;\n }\n TRACE_FUNC('END', extraMsg);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {resolveBackendAndExecutionProviders} from './backend-impl.js';\nimport {InferenceSessionHandler} from './backend.js';\nimport {InferenceSession as InferenceSessionInterface} from './inference-session.js';\nimport {OnnxValue} from './onnx-value.js';\nimport {Tensor} from './tensor.js';\nimport {TRACE_FUNC_BEGIN, TRACE_FUNC_END} from './trace.js';\n\ntype SessionOptions = InferenceSessionInterface.SessionOptions;\ntype RunOptions = InferenceSessionInterface.RunOptions;\ntype FeedsType = InferenceSessionInterface.FeedsType;\ntype FetchesType = InferenceSessionInterface.FetchesType;\ntype ReturnType = InferenceSessionInterface.ReturnType;\n\nexport class InferenceSession implements InferenceSessionInterface {\n private constructor(handler: InferenceSessionHandler) {\n this.handler = handler;\n }\n run(feeds: FeedsType, options?: RunOptions): Promise;\n run(feeds: FeedsType, fetches: FetchesType, options?: RunOptions): Promise;\n async run(feeds: FeedsType, arg1?: FetchesType|RunOptions, arg2?: RunOptions): Promise {\n TRACE_FUNC_BEGIN();\n const fetches: {[name: string]: OnnxValue|null} = {};\n let options: RunOptions = {};\n // check inputs\n if (typeof feeds !== 'object' || feeds === null || feeds instanceof Tensor || Array.isArray(feeds)) {\n throw new TypeError(\n '\\'feeds\\' must be an object that use input names as keys and OnnxValue as corresponding values.');\n }\n\n let isFetchesEmpty = true;\n // determine which override is being used\n if (typeof arg1 === 'object') {\n if (arg1 === null) {\n throw new TypeError('Unexpected argument[1]: cannot be null.');\n }\n if (arg1 instanceof Tensor) {\n throw new TypeError('\\'fetches\\' cannot be a Tensor');\n }\n\n if (Array.isArray(arg1)) {\n if (arg1.length === 0) {\n throw new TypeError('\\'fetches\\' cannot be an empty array.');\n }\n isFetchesEmpty = false;\n // output names\n for (const name of arg1) {\n if (typeof name !== 'string') {\n throw new TypeError('\\'fetches\\' must be a string array or an object.');\n }\n if (this.outputNames.indexOf(name) === -1) {\n throw new RangeError(`'fetches' contains invalid output name: ${name}.`);\n }\n fetches[name] = null;\n }\n\n if (typeof arg2 === 'object' && arg2 !== null) {\n options = arg2;\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else {\n // decide whether arg1 is fetches or options\n // if any output name is present and its value is valid OnnxValue, we consider it fetches\n let isFetches = false;\n const arg1Keys = Object.getOwnPropertyNames(arg1);\n for (const name of this.outputNames) {\n if (arg1Keys.indexOf(name) !== -1) {\n const v = (arg1 as InferenceSessionInterface.NullableOnnxValueMapType)[name];\n if (v === null || v instanceof Tensor) {\n isFetches = true;\n isFetchesEmpty = false;\n fetches[name] = v;\n }\n }\n }\n\n if (isFetches) {\n if (typeof arg2 === 'object' && arg2 !== null) {\n options = arg2;\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else {\n options = arg1 as RunOptions;\n }\n }\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('Unexpected argument[1]: must be \\'fetches\\' or \\'options\\'.');\n }\n\n // check if all inputs are in feed\n for (const name of this.inputNames) {\n if (typeof feeds[name] === 'undefined') {\n throw new Error(`input '${name}' is missing in 'feeds'.`);\n }\n }\n\n // if no fetches is specified, we use the full output names list\n if (isFetchesEmpty) {\n for (const name of this.outputNames) {\n fetches[name] = null;\n }\n }\n\n // feeds, fetches and options are prepared\n\n const results = await this.handler.run(feeds, fetches, options);\n const returnValue: {[name: string]: OnnxValue} = {};\n for (const key in results) {\n if (Object.hasOwnProperty.call(results, key)) {\n const result = results[key];\n if (result instanceof Tensor) {\n returnValue[key] = result;\n } else {\n returnValue[key] = new Tensor(result.type, result.data, result.dims);\n }\n }\n }\n TRACE_FUNC_END();\n return returnValue;\n }\n\n async release(): Promise {\n return this.handler.dispose();\n }\n\n static create(path: string, options?: SessionOptions): Promise;\n static create(buffer: ArrayBufferLike, options?: SessionOptions): Promise;\n static create(buffer: ArrayBufferLike, byteOffset: number, byteLength?: number, options?: SessionOptions):\n Promise;\n static create(buffer: Uint8Array, options?: SessionOptions): Promise;\n static async create(\n arg0: string|ArrayBufferLike|Uint8Array, arg1?: SessionOptions|number, arg2?: number,\n arg3?: SessionOptions): Promise {\n TRACE_FUNC_BEGIN();\n // either load from a file or buffer\n let filePathOrUint8Array: string|Uint8Array;\n let options: SessionOptions = {};\n\n if (typeof arg0 === 'string') {\n filePathOrUint8Array = arg0;\n if (typeof arg1 === 'object' && arg1 !== null) {\n options = arg1;\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else if (arg0 instanceof Uint8Array) {\n filePathOrUint8Array = arg0;\n if (typeof arg1 === 'object' && arg1 !== null) {\n options = arg1;\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else if (\n arg0 instanceof ArrayBuffer ||\n (typeof SharedArrayBuffer !== 'undefined' && arg0 instanceof SharedArrayBuffer)) {\n const buffer = arg0;\n let byteOffset = 0;\n let byteLength = arg0.byteLength;\n if (typeof arg1 === 'object' && arg1 !== null) {\n options = arg1;\n } else if (typeof arg1 === 'number') {\n byteOffset = arg1;\n if (!Number.isSafeInteger(byteOffset)) {\n throw new RangeError('\\'byteOffset\\' must be an integer.');\n }\n if (byteOffset < 0 || byteOffset >= buffer.byteLength) {\n throw new RangeError(`'byteOffset' is out of range [0, ${buffer.byteLength}).`);\n }\n byteLength = arg0.byteLength - byteOffset;\n if (typeof arg2 === 'number') {\n byteLength = arg2;\n if (!Number.isSafeInteger(byteLength)) {\n throw new RangeError('\\'byteLength\\' must be an integer.');\n }\n if (byteLength <= 0 || byteOffset + byteLength > buffer.byteLength) {\n throw new RangeError(`'byteLength' is out of range (0, ${buffer.byteLength - byteOffset}].`);\n }\n if (typeof arg3 === 'object' && arg3 !== null) {\n options = arg3;\n } else if (typeof arg3 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'byteLength\\' must be a number.');\n }\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n filePathOrUint8Array = new Uint8Array(buffer, byteOffset, byteLength);\n } else {\n throw new TypeError('Unexpected argument[0]: must be \\'path\\' or \\'buffer\\'.');\n }\n\n // resolve backend, update session options with validated EPs, and create session handler\n const [backend, optionsWithValidatedEPs] = await resolveBackendAndExecutionProviders(options);\n const handler = await backend.createInferenceSessionHandler(filePathOrUint8Array, optionsWithValidatedEPs);\n TRACE_FUNC_END();\n return new InferenceSession(handler);\n }\n\n startProfiling(): void {\n this.handler.startProfiling();\n }\n endProfiling(): void {\n this.handler.endProfiling();\n }\n\n get inputNames(): readonly string[] {\n return this.handler.inputNames;\n }\n get outputNames(): readonly string[] {\n return this.handler.outputNames;\n }\n\n private handler: InferenceSessionHandler;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession as InferenceSessionImpl} from './inference-session-impl.js';\nimport {OnnxModelOptions} from './onnx-model.js';\nimport {OnnxValue, OnnxValueDataLocation} from './onnx-value.js';\n\n/* eslint-disable @typescript-eslint/no-redeclare */\n\nexport declare namespace InferenceSession {\n // #region input/output types\n\n type OnnxValueMapType = {readonly [name: string]: OnnxValue};\n type NullableOnnxValueMapType = {readonly [name: string]: OnnxValue | null};\n\n /**\n * A feeds (model inputs) is an object that uses input names as keys and OnnxValue as corresponding values.\n */\n type FeedsType = OnnxValueMapType;\n\n /**\n * A fetches (model outputs) could be one of the following:\n *\n * - Omitted. Use model's output names definition.\n * - An array of string indicating the output names.\n * - An object that use output names as keys and OnnxValue or null as corresponding values.\n *\n * @remark\n * different from input argument, in output, OnnxValue is optional. If an OnnxValue is present it will be\n * used as a pre-allocated value by the inference engine; if omitted, inference engine will allocate buffer\n * internally.\n */\n type FetchesType = readonly string[]|NullableOnnxValueMapType;\n\n /**\n * A inferencing return type is an object that uses output names as keys and OnnxValue as corresponding values.\n */\n type ReturnType = OnnxValueMapType;\n\n // #endregion\n\n // #region session options\n\n /**\n * A set of configurations for session behavior.\n */\n export interface SessionOptions extends OnnxModelOptions {\n /**\n * An array of execution provider options.\n *\n * An execution provider option can be a string indicating the name of the execution provider,\n * or an object of corresponding type.\n */\n executionProviders?: readonly ExecutionProviderConfig[];\n\n /**\n * The intra OP threads number.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native).\n */\n intraOpNumThreads?: number;\n\n /**\n * The inter OP threads number.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native).\n */\n interOpNumThreads?: number;\n\n /**\n * The free dimension override.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n freeDimensionOverrides?: {readonly [dimensionName: string]: number};\n\n /**\n * The optimization level.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n graphOptimizationLevel?: 'disabled'|'basic'|'extended'|'all';\n\n /**\n * Whether enable CPU memory arena.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n enableCpuMemArena?: boolean;\n\n /**\n * Whether enable memory pattern.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n enableMemPattern?: boolean;\n\n /**\n * Execution mode.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n executionMode?: 'sequential'|'parallel';\n\n /**\n * Optimized model file path.\n *\n * If this setting is specified, the optimized model will be dumped. In browser, a blob will be created\n * with a pop-up window.\n */\n optimizedModelFilePath?: string;\n\n /**\n * Whether enable profiling.\n *\n * This setting is a placeholder for a future use.\n */\n enableProfiling?: boolean;\n\n /**\n * File prefix for profiling.\n *\n * This setting is a placeholder for a future use.\n */\n profileFilePrefix?: string;\n\n /**\n * Log ID.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n logId?: string;\n\n /**\n * Log severity level. See\n * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/common/logging/severity.h\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n logSeverityLevel?: 0|1|2|3|4;\n\n /**\n * Log verbosity level.\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n */\n logVerbosityLevel?: number;\n\n /**\n * Specify string as a preferred data location for all outputs, or an object that use output names as keys and a\n * preferred data location as corresponding values.\n *\n * This setting is available only in ONNXRuntime Web for WebGL and WebGPU EP.\n */\n preferredOutputLocation?: OnnxValueDataLocation|{readonly [outputName: string]: OnnxValueDataLocation};\n\n /**\n * Whether enable graph capture.\n * This setting is available only in ONNXRuntime Web for WebGPU EP.\n */\n enableGraphCapture?: boolean;\n\n /**\n * Store configurations for a session. See\n * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/session/\n * onnxruntime_session_options_config_keys.h\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n *\n * @example\n * ```js\n * extra: {\n * session: {\n * set_denormal_as_zero: \"1\",\n * disable_prepacking: \"1\"\n * },\n * optimization: {\n * enable_gelu_approximation: \"1\"\n * }\n * }\n * ```\n */\n extra?: Record;\n }\n\n // #region execution providers\n\n // Currently, we have the following backends to support execution providers:\n // Backend Node.js binding: supports 'cpu', 'dml' (win32), 'coreml' (macOS) and 'cuda' (linux).\n // Backend WebAssembly: supports 'cpu', 'wasm', 'webgpu' and 'webnn'.\n // Backend ONNX.js: supports 'webgl'.\n // Backend React Native: supports 'cpu', 'xnnpack', 'coreml' (iOS), 'nnapi' (Android).\n interface ExecutionProviderOptionMap {\n coreml: CoreMLExecutionProviderOption;\n cpu: CpuExecutionProviderOption;\n cuda: CudaExecutionProviderOption;\n dml: DmlExecutionProviderOption;\n nnapi: NnapiExecutionProviderOption;\n tensorrt: TensorRtExecutionProviderOption;\n wasm: WebAssemblyExecutionProviderOption;\n webgl: WebGLExecutionProviderOption;\n webgpu: WebGpuExecutionProviderOption;\n webnn: WebNNExecutionProviderOption;\n qnn: QnnExecutionProviderOption;\n xnnpack: XnnpackExecutionProviderOption;\n }\n\n type ExecutionProviderName = keyof ExecutionProviderOptionMap;\n type ExecutionProviderConfig =\n ExecutionProviderOptionMap[ExecutionProviderName]|ExecutionProviderOption|ExecutionProviderName|string;\n\n export interface ExecutionProviderOption {\n readonly name: string;\n }\n export interface CpuExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'cpu';\n useArena?: boolean;\n }\n export interface CudaExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'cuda';\n deviceId?: number;\n }\n export interface DmlExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'dml';\n deviceId?: number;\n }\n export interface TensorRtExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'tensorrt';\n deviceId?: number;\n }\n export interface WebAssemblyExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'wasm';\n }\n export interface WebGLExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'webgl';\n // TODO: add flags\n }\n export interface XnnpackExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'xnnpack';\n }\n export interface WebGpuExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'webgpu';\n preferredLayout?: 'NCHW'|'NHWC';\n }\n\n // #region WebNN options\n\n interface WebNNExecutionProviderName extends ExecutionProviderOption {\n readonly name: 'webnn';\n }\n\n /**\n * Represents a set of options for creating a WebNN MLContext.\n *\n * @see https://www.w3.org/TR/webnn/#dictdef-mlcontextoptions\n */\n export interface WebNNContextOptions {\n deviceType?: 'cpu'|'gpu'|'npu';\n numThreads?: number;\n powerPreference?: 'default'|'low-power'|'high-performance';\n }\n\n /**\n * Represents a set of options for WebNN execution provider without MLContext.\n */\n export interface WebNNOptionsWithoutMLContext extends WebNNExecutionProviderName, WebNNContextOptions {\n context?: never;\n }\n\n /**\n * Represents a set of options for WebNN execution provider with MLContext.\n *\n * When MLContext is provided, the deviceType is also required so that the WebNN EP can determine the preferred\n * channel layout.\n *\n * @see https://www.w3.org/TR/webnn/#dom-ml-createcontext\n */\n export interface WebNNOptionsWithMLContext extends WebNNExecutionProviderName,\n Omit,\n Required> {\n context: unknown /* MLContext */;\n }\n\n /**\n * Represents a set of options for WebNN execution provider with MLContext which is created from GPUDevice.\n *\n * @see https://www.w3.org/TR/webnn/#dom-ml-createcontext-gpudevice\n */\n export interface WebNNOptionsWebGpu extends WebNNExecutionProviderName {\n context: unknown /* MLContext */;\n gpuDevice: unknown /* GPUDevice */;\n }\n\n /**\n * Options for WebNN execution provider.\n */\n export type WebNNExecutionProviderOption = WebNNOptionsWithoutMLContext|WebNNOptionsWithMLContext|WebNNOptionsWebGpu;\n\n // #endregion\n\n export interface QnnExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'qnn';\n // TODO add flags\n }\n export interface CoreMLExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'coreml';\n /**\n * The bit flags for CoreML execution provider.\n *\n * ```\n * COREML_FLAG_USE_CPU_ONLY = 0x001\n * COREML_FLAG_ENABLE_ON_SUBGRAPH = 0x002\n * COREML_FLAG_ONLY_ENABLE_DEVICE_WITH_ANE = 0x004\n * COREML_FLAG_ONLY_ALLOW_STATIC_INPUT_SHAPES = 0x008\n * COREML_FLAG_CREATE_MLPROGRAM = 0x010\n * ```\n *\n * See include/onnxruntime/core/providers/coreml/coreml_provider_factory.h for more details.\n *\n * This flag is available only in ONNXRuntime (Node.js binding).\n */\n coreMlFlags?: number;\n /**\n * Specify whether to use CPU only in CoreML EP.\n *\n * This setting is available only in ONNXRuntime (react-native).\n */\n useCPUOnly?: boolean;\n /**\n * Specify whether to enable CoreML EP on subgraph.\n *\n * This setting is available only in ONNXRuntime (react-native).\n */\n enableOnSubgraph?: boolean;\n /**\n * Specify whether to only enable CoreML EP for Apple devices with ANE (Apple Neural Engine).\n *\n * This setting is available only in ONNXRuntime (react-native).\n */\n onlyEnableDeviceWithANE?: boolean;\n }\n export interface NnapiExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'nnapi';\n useFP16?: boolean;\n useNCHW?: boolean;\n cpuDisabled?: boolean;\n cpuOnly?: boolean;\n }\n // #endregion\n\n // #endregion\n\n // #region run options\n\n /**\n * A set of configurations for inference run behavior\n */\n export interface RunOptions {\n /**\n * Log severity level. See\n * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/common/logging/severity.h\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n logSeverityLevel?: 0|1|2|3|4;\n\n /**\n * Log verbosity level.\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n */\n logVerbosityLevel?: number;\n\n /**\n * Terminate all incomplete OrtRun calls as soon as possible if true\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n */\n terminate?: boolean;\n\n /**\n * A tag for the Run() calls using this\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n tag?: string;\n\n /**\n * Set a single run configuration entry. See\n * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/session/\n * onnxruntime_run_options_config_keys.h\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n *\n * @example\n *\n * ```js\n * extra: {\n * memory: {\n * enable_memory_arena_shrinkage: \"1\",\n * }\n * }\n * ```\n */\n extra?: Record;\n }\n\n // #endregion\n\n // #region value metadata\n\n // eslint-disable-next-line @typescript-eslint/no-empty-interface\n interface ValueMetadata {\n // TBD\n }\n\n // #endregion\n}\n\n/**\n * Represent a runtime instance of an ONNX model.\n */\nexport interface InferenceSession {\n // #region run()\n\n /**\n * Execute the model asynchronously with the given feeds and options.\n *\n * @param feeds - Representation of the model input. See type description of `InferenceSession.InputType` for detail.\n * @param options - Optional. A set of options that controls the behavior of model inference.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding values.\n */\n run(feeds: InferenceSession.FeedsType, options?: InferenceSession.RunOptions): Promise;\n\n /**\n * Execute the model asynchronously with the given feeds, fetches and options.\n *\n * @param feeds - Representation of the model input. See type description of `InferenceSession.InputType` for detail.\n * @param fetches - Representation of the model output. See type description of `InferenceSession.OutputType` for\n * detail.\n * @param options - Optional. A set of options that controls the behavior of model inference.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding values.\n */\n run(feeds: InferenceSession.FeedsType, fetches: InferenceSession.FetchesType,\n options?: InferenceSession.RunOptions): Promise;\n\n // #endregion\n\n // #region release()\n\n /**\n * Release the inference session and the underlying resources.\n */\n release(): Promise;\n\n // #endregion\n\n // #region profiling\n\n /**\n * Start profiling.\n */\n startProfiling(): void;\n\n /**\n * End profiling.\n */\n endProfiling(): void;\n\n // #endregion\n\n // #region metadata\n\n /**\n * Get input names of the loaded model.\n */\n readonly inputNames: readonly string[];\n\n /**\n * Get output names of the loaded model.\n */\n readonly outputNames: readonly string[];\n\n // /**\n // * Get input metadata of the loaded model.\n // */\n // readonly inputMetadata: ReadonlyArray>;\n\n // /**\n // * Get output metadata of the loaded model.\n // */\n // readonly outputMetadata: ReadonlyArray>;\n\n // #endregion\n}\n\nexport interface InferenceSessionFactory {\n // #region create()\n\n /**\n * Create a new inference session and load model asynchronously from an ONNX model file.\n *\n * @param uri - The URI or file path of the model to load.\n * @param options - specify configuration for creating a new inference session.\n * @returns A promise that resolves to an InferenceSession object.\n */\n create(uri: string, options?: InferenceSession.SessionOptions): Promise;\n\n /**\n * Create a new inference session and load model asynchronously from an array bufer.\n *\n * @param buffer - An ArrayBuffer representation of an ONNX model.\n * @param options - specify configuration for creating a new inference session.\n * @returns A promise that resolves to an InferenceSession object.\n */\n create(buffer: ArrayBufferLike, options?: InferenceSession.SessionOptions): Promise;\n\n /**\n * Create a new inference session and load model asynchronously from segment of an array bufer.\n *\n * @param buffer - An ArrayBuffer representation of an ONNX model.\n * @param byteOffset - The beginning of the specified portion of the array buffer.\n * @param byteLength - The length in bytes of the array buffer.\n * @param options - specify configuration for creating a new inference session.\n * @returns A promise that resolves to an InferenceSession object.\n */\n create(buffer: ArrayBufferLike, byteOffset: number, byteLength?: number, options?: InferenceSession.SessionOptions):\n Promise;\n\n /**\n * Create a new inference session and load model asynchronously from a Uint8Array.\n *\n * @param buffer - A Uint8Array representation of an ONNX model.\n * @param options - specify configuration for creating a new inference session.\n * @returns A promise that resolves to an InferenceSession object.\n */\n create(buffer: Uint8Array, options?: InferenceSession.SessionOptions): Promise;\n\n // #endregion\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const InferenceSession: InferenceSessionFactory = InferenceSessionImpl;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {OptionsFormat, OptionsNormalizationParameters, OptionsTensorLayout} from './tensor-factory.js';\n\nexport interface TensorToDataUrlOptions extends OptionsTensorLayout, OptionsFormat, OptionsNormalizationParameters {}\n\nexport interface TensorToImageDataOptions extends OptionsTensorLayout, OptionsFormat, OptionsNormalizationParameters {}\n\nexport interface ConversionUtils {\n /**\n * creates a DataURL instance from tensor\n *\n * @param options - An optional object representing options for creating a DataURL instance from the tensor.\n *\n * The following default settings will be applied:\n * - `format`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * @returns a DataURL string representing the image converted from tensor data\n */\n toDataURL(options?: TensorToDataUrlOptions): string;\n\n /**\n * creates an ImageData instance from tensor\n *\n * @param options - An optional object representing options for creating an ImageData instance from the tensor.\n *\n * The following default settings will be applied:\n * - `format`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * @returns an ImageData instance representing the image converted from tensor data\n */\n toImageData(options?: TensorToImageDataOptions): ImageData;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor, TypedTensor} from './tensor.js';\n\nexport type ImageFormat = 'RGB'|'RGBA'|'BGR'|'RBG';\nexport type ImageTensorLayout = 'NHWC'|'NCHW';\n\n// the following region contains type definitions for constructing tensor from a specific location.\n\n// #region types for constructing a tensor from a specific location\n\n/**\n * represent common properties of the parameter for constructing a tensor from a specific location.\n */\ninterface CommonConstructorParameters extends Pick {\n /**\n * Specify the data type of the tensor.\n */\n readonly type: T;\n}\n\n/**\n * represent the parameter for constructing a tensor from a GPU resource.\n */\ninterface GpuResourceConstructorParameters {\n /**\n * an optional callback function to download data from GPU to CPU.\n *\n * If not provided, the tensor treat the GPU data as external resource.\n */\n download?(): Promise;\n\n /**\n * an optional callback function that will be called when the tensor is disposed.\n *\n * If not provided, the tensor treat the GPU data as external resource.\n */\n dispose?(): void;\n}\n\n/**\n * represent the parameter for constructing a tensor from a pinned CPU buffer\n */\nexport interface CpuPinnedConstructorParameters extends\n CommonConstructorParameters {\n /**\n * Specify the location of the data to be 'cpu-pinned'.\n */\n readonly location: 'cpu-pinned';\n /**\n * Specify the CPU pinned buffer that holds the tensor data.\n */\n readonly data: Tensor.DataTypeMap[T];\n}\n\n/**\n * represent the parameter for constructing a tensor from a WebGL texture\n */\nexport interface TextureConstructorParameters extends\n CommonConstructorParameters, GpuResourceConstructorParameters {\n /**\n * Specify the location of the data to be 'texture'.\n */\n readonly location: 'texture';\n /**\n * Specify the WebGL texture that holds the tensor data.\n */\n readonly texture: Tensor.TextureType;\n}\n\n/**\n * represent the parameter for constructing a tensor from a WebGPU buffer\n */\nexport interface GpuBufferConstructorParameters extends\n CommonConstructorParameters, GpuResourceConstructorParameters {\n /**\n * Specify the location of the data to be 'gpu-buffer'.\n */\n readonly location: 'gpu-buffer';\n /**\n * Specify the WebGPU buffer that holds the tensor data.\n */\n readonly gpuBuffer: Tensor.GpuBufferType;\n}\n\n// #endregion\n\n// the following region contains type definitions of each individual options.\n// the tensor factory functions use a composition of those options as the parameter type.\n\n// #region Options fields\n\nexport interface OptionsFormat {\n /**\n * Describes the image format represented in RGBA color space.\n */\n format?: ImageFormat;\n}\n\nexport interface OptionsTensorFormat {\n /**\n * Describes the image format of the tensor.\n *\n * NOTE: this is different from option 'format'. While option 'format' represents the original image, 'tensorFormat'\n * represents the target format of the tensor. A transpose will be performed if they are different.\n */\n tensorFormat?: ImageFormat;\n}\n\nexport interface OptionsTensorDataType {\n /**\n * Describes the data type of the tensor.\n */\n dataType?: 'float32'|'uint8';\n}\n\nexport interface OptionsTensorLayout {\n /**\n * Describes the tensor layout when representing data of one or more image(s).\n */\n tensorLayout?: ImageTensorLayout;\n}\n\nexport interface OptionsDimensions {\n /**\n * Describes the image height in pixel\n */\n height?: number;\n /**\n * Describes the image width in pixel\n */\n width?: number;\n}\n\nexport interface OptionResizedDimensions {\n /**\n * Describes the resized height. If omitted, original height will be used.\n */\n resizedHeight?: number;\n /**\n * Describes resized width - can be accessed via tensor dimensions as well\n */\n resizedWidth?: number;\n}\n\nexport interface OptionsNormalizationParameters {\n /**\n * Describes normalization parameters when preprocessing the image as model input.\n *\n * Data element are ranged from 0 to 255.\n */\n norm?: {\n /**\n * The 'bias' value for image normalization.\n * - If omitted, use default value 0.\n * - If it's a single number, apply to each channel\n * - If it's an array of 3 or 4 numbers, apply element-wise. Number of elements need to match the number of channels\n * for the corresponding image format\n */\n bias?: number|[number, number, number]|[number, number, number, number];\n /**\n * The 'mean' value for image normalization.\n * - If omitted, use default value 255.\n * - If it's a single number, apply to each channel\n * - If it's an array of 3 or 4 numbers, apply element-wise. Number of elements need to match the number of channels\n * for the corresponding image format\n */\n mean?: number | [number, number, number] | [number, number, number, number];\n };\n}\n\n// #endregion\n\n// #region Options composition\n\nexport interface TensorFromImageDataOptions extends OptionResizedDimensions, OptionsTensorFormat, OptionsTensorLayout,\n OptionsTensorDataType, OptionsNormalizationParameters {}\n\nexport interface TensorFromImageElementOptions extends OptionResizedDimensions, OptionsTensorFormat,\n OptionsTensorLayout, OptionsTensorDataType,\n OptionsNormalizationParameters {}\n\nexport interface TensorFromUrlOptions extends OptionsDimensions, OptionResizedDimensions, OptionsTensorFormat,\n OptionsTensorLayout, OptionsTensorDataType,\n OptionsNormalizationParameters {}\n\nexport interface TensorFromImageBitmapOptions extends OptionResizedDimensions, OptionsTensorFormat, OptionsTensorLayout,\n OptionsTensorDataType, OptionsNormalizationParameters {}\n\nexport interface TensorFromTextureOptions extends\n Required, OptionsFormat, GpuResourceConstructorParameters/* TODO: add more */ {}\n\nexport interface TensorFromGpuBufferOptions extends\n Pick, GpuResourceConstructorParameters {\n /**\n * Describes the data type of the tensor.\n */\n dataType?: T;\n}\n\n// #endregion\n\n/**\n * type TensorFactory defines the factory functions of 'Tensor' to create tensor instances from existing data or\n * resources.\n */\nexport interface TensorFactory {\n /**\n * create a tensor from an ImageData object\n *\n * @param imageData - the ImageData object to create tensor from\n * @param options - An optional object representing options for creating tensor from ImageData.\n *\n * The following default settings will be applied:\n * - `tensorFormat`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * - `dataType`: `'float32'`\n * @returns A promise that resolves to a tensor object\n */\n fromImage(imageData: ImageData, options?: TensorFromImageDataOptions):\n Promise|TypedTensor<'uint8'>>;\n\n /**\n * create a tensor from a HTMLImageElement object\n *\n * @param imageElement - the HTMLImageElement object to create tensor from\n * @param options - An optional object representing options for creating tensor from HTMLImageElement.\n *\n * The following default settings will be applied:\n * - `tensorFormat`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * - `dataType`: `'float32'`\n * @returns A promise that resolves to a tensor object\n */\n fromImage(imageElement: HTMLImageElement, options?: TensorFromImageElementOptions):\n Promise|TypedTensor<'uint8'>>;\n\n /**\n * create a tensor from URL\n *\n * @param urlSource - a string as a URL to the image or a data URL containing the image data.\n * @param options - An optional object representing options for creating tensor from URL.\n *\n * The following default settings will be applied:\n * - `tensorFormat`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * - `dataType`: `'float32'`\n * @returns A promise that resolves to a tensor object\n */\n fromImage(urlSource: string, options?: TensorFromUrlOptions): Promise|TypedTensor<'uint8'>>;\n\n /**\n * create a tensor from an ImageBitmap object\n *\n * @param bitmap - the ImageBitmap object to create tensor from\n * @param options - An optional object representing options for creating tensor from URL.\n *\n * The following default settings will be applied:\n * - `tensorFormat`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * - `dataType`: `'float32'`\n * @returns A promise that resolves to a tensor object\n */\n fromImage(bitmap: ImageBitmap, options: TensorFromImageBitmapOptions):\n Promise|TypedTensor<'uint8'>>;\n\n /**\n * create a tensor from a WebGL texture\n *\n * @param texture - the WebGLTexture object to create tensor from\n * @param options - An optional object representing options for creating tensor from WebGL texture.\n *\n * The options include following properties:\n * - `width`: the width of the texture. Required.\n * - `height`: the height of the texture. Required.\n * - `format`: the format of the texture. If omitted, assume 'RGBA'.\n * - `download`: an optional function to download the tensor data from GPU to CPU. If omitted, the GPU data\n * will not be able to download. Usually, this is provided by a GPU backend for the inference outputs. Users don't\n * need to provide this function.\n * - `dispose`: an optional function to dispose the tensor data on GPU. If omitted, the GPU data will not be disposed.\n * Usually, this is provided by a GPU backend for the inference outputs. Users don't need to provide this function.\n *\n * @returns a tensor object\n */\n fromTexture(\n texture: Tensor.TextureType, options: TensorFromTextureOptions): TypedTensor<'float32'>;\n\n /**\n * create a tensor from a WebGPU buffer\n *\n * @param buffer - the GPUBuffer object to create tensor from\n * @param options - An optional object representing options for creating tensor from WebGPU buffer.\n *\n * The options include following properties:\n * - `dataType`: the data type of the tensor. If omitted, assume 'float32'.\n * - `dims`: the dimension of the tensor. Required.\n * - `download`: an optional function to download the tensor data from GPU to CPU. If omitted, the GPU data\n * will not be able to download. Usually, this is provided by a GPU backend for the inference outputs. Users don't\n * need to provide this function.\n * - `dispose`: an optional function to dispose the tensor data on GPU. If omitted, the GPU data will not be disposed.\n * Usually, this is provided by a GPU backend for the inference outputs. Users don't need to provide this function.\n *\n * @returns a tensor object\n */\n fromGpuBuffer(\n buffer: Tensor.GpuBufferType, options: TensorFromGpuBufferOptions): TypedTensor;\n\n /**\n * create a tensor from a pre-allocated buffer. The buffer will be used as a pinned buffer.\n *\n * @param type - the tensor element type.\n * @param buffer - a TypedArray corresponding to the type.\n * @param dims - specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n *\n * @returns a tensor object\n */\n fromPinnedBuffer>(\n type: T, buffer: Tensor.DataTypeMap[T], dims?: readonly number[]): TypedTensor;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * A string that represents a file's URL or path.\n *\n * Path is vailable only in onnxruntime-node or onnxruntime-web running in Node.js.\n */\nexport type FileUrlOrPath = string;\n\n/**\n * A Blob object that represents a file.\n */\nexport type FileBlob = Blob;\n\n/**\n * A Uint8Array, ArrayBuffer or SharedArrayBuffer object that represents a file content.\n *\n * When it is an ArrayBuffer or SharedArrayBuffer, the whole buffer is assumed to be the file content.\n */\nexport type FileData = Uint8Array|ArrayBufferLike;\n\n/**\n * Represents a file that can be loaded by the ONNX Runtime JavaScript API.\n */\nexport type FileType = FileUrlOrPath|FileBlob|FileData;\n\n/**\n * Represents an external data file.\n */\nexport interface ExternalDataFileDescription {\n /**\n * Specify the external data file.\n */\n data: FileType;\n /**\n * Specify the file path.\n */\n path: string;\n}\n\n/**\n * Represents an external data file.\n *\n * When using a string, it should be a file URL or path that in the same directory as the model file.\n */\nexport type ExternalDataFileType = ExternalDataFileDescription|FileUrlOrPath;\n\n/**\n * Options for model loading.\n */\nexport interface OnnxModelOptions {\n /**\n * Specifying a list of files that represents the external data.\n */\n externalData?: readonly ExternalDataFileType[];\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from './tensor.js';\n\nexport type NonTensorType = never;\n\n/**\n * Type OnnxValue Represents both tensors and non-tensors value for model's inputs/outputs.\n *\n * NOTE: currently not support non-tensor\n */\nexport type OnnxValue = Tensor|NonTensorType;\n\n/**\n * Type OnnxValueDataLocation represents the location of the data of an OnnxValue.\n */\nexport type OnnxValueDataLocation = Tensor.DataLocation;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {resolveBackendAndExecutionProviders} from './backend-impl.js';\nimport {SessionHandler, TrainingSessionHandler} from './backend.js';\nimport {InferenceSession as InferenceSession} from './inference-session.js';\nimport {OnnxValue} from './onnx-value.js';\nimport {Tensor} from './tensor.js';\nimport {TrainingSession as TrainingSessionInterface, TrainingSessionCreateOptions} from './training-session.js';\n\ntype SessionOptions = InferenceSession.SessionOptions;\ntype FeedsType = InferenceSession.FeedsType;\ntype FetchesType = InferenceSession.FetchesType;\ntype ReturnType = InferenceSession.ReturnType;\ntype RunOptions = InferenceSession.RunOptions;\n\nconst noBackendErrMsg: string = 'Training backend could not be resolved. ' +\n 'Make sure you\\'re using the correct configuration & WebAssembly files.';\n\nexport class TrainingSession implements TrainingSessionInterface {\n private constructor(handler: TrainingSessionHandler, hasOptimizerModel: boolean, hasEvalModel: boolean) {\n this.handler = handler;\n this.hasOptimizerModel = hasOptimizerModel;\n this.hasEvalModel = hasEvalModel;\n }\n private handler: TrainingSessionHandler;\n private hasOptimizerModel: boolean;\n private hasEvalModel: boolean;\n\n get trainingInputNames(): readonly string[] {\n return this.handler.inputNames;\n }\n get trainingOutputNames(): readonly string[] {\n return this.handler.outputNames;\n }\n\n get evalInputNames(): readonly string[] {\n if (this.hasEvalModel) {\n return this.handler.evalInputNames;\n } else {\n throw new Error('This training session has no evalModel loaded.');\n }\n }\n get evalOutputNames(): readonly string[] {\n if (this.hasEvalModel) {\n return this.handler.evalOutputNames;\n } else {\n throw new Error('This training session has no evalModel loaded.');\n }\n }\n\n static async create(trainingOptions: TrainingSessionCreateOptions, sessionOptions?: SessionOptions):\n Promise {\n const evalModel: string|Uint8Array = trainingOptions.evalModel || '';\n const optimizerModel: string|Uint8Array = trainingOptions.optimizerModel || '';\n const options: SessionOptions = sessionOptions || {};\n\n // resolve backend, update session options with validated EPs, and create session handler\n const [backend, optionsWithValidatedEPs] = await resolveBackendAndExecutionProviders(options);\n if (backend.createTrainingSessionHandler) {\n const handler = await backend.createTrainingSessionHandler(\n trainingOptions.checkpointState, trainingOptions.trainModel, evalModel, optimizerModel,\n optionsWithValidatedEPs);\n return new TrainingSession(handler, !!trainingOptions.optimizerModel, !!trainingOptions.evalModel);\n } else {\n throw new Error(noBackendErrMsg);\n }\n }\n\n /**\n * Helper function for runTrainStep and future runStep methods that handles the type-narrowing conversion from\n * the given parameters to SessionHandler.FetchesType and RunOptions.\n *\n * @param inputNames the feeds object is checked that they contain all input names in the provided list of input\n * names.\n * @param outputNames the fetches object is checked that their keys match up with valid names in the list of output\n * names.\n * @param feeds the required input\n * @param arg1 narrowed & converted into the SessionHandler.FetchesType or RunOptions object\n * @param arg2 optional RunOptions object.\n * @returns\n */\n typeNarrowingForRunStep(\n inputNames: readonly string[], outputNames: readonly string[], feeds: FeedsType, arg1?: FetchesType|RunOptions,\n arg2?: RunOptions): [SessionHandler.FetchesType, RunOptions] {\n const fetches: {[name: string]: OnnxValue|null} = {};\n let options: RunOptions = {};\n // check inputs\n if (typeof feeds !== 'object' || feeds === null || feeds instanceof Tensor || Array.isArray(feeds)) {\n throw new TypeError(\n '\\'feeds\\' must be an object that use input names as keys and OnnxValue as corresponding values.');\n }\n\n let isFetchesEmpty = true;\n // determine which override is being used\n if (typeof arg1 === 'object') {\n if (arg1 === null) {\n throw new TypeError('Unexpected argument[1]: cannot be null.');\n }\n if (arg1 instanceof Tensor) {\n throw new TypeError('\\'fetches\\' cannot be a Tensor');\n }\n\n if (Array.isArray(arg1)) {\n if (arg1.length === 0) {\n throw new TypeError('\\'fetches\\' cannot be an empty array.');\n }\n isFetchesEmpty = false;\n // output names\n for (const name of arg1) {\n if (typeof name !== 'string') {\n throw new TypeError('\\'fetches\\' must be a string array or an object.');\n }\n if (outputNames.indexOf(name) === -1) {\n throw new RangeError(`'fetches' contains invalid output name: ${name}.`);\n }\n fetches[name] = null;\n }\n\n if (typeof arg2 === 'object' && arg2 !== null) {\n options = arg2;\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else {\n // decide whether arg1 is fetches or options\n // if any output name is present and its value is valid OnnxValue, we consider it fetches\n let isFetches = false;\n const arg1Keys = Object.getOwnPropertyNames(arg1);\n for (const name of outputNames) {\n if (arg1Keys.indexOf(name) !== -1) {\n const v = (arg1 as InferenceSession.NullableOnnxValueMapType)[name];\n if (v === null || v instanceof Tensor) {\n isFetches = true;\n isFetchesEmpty = false;\n fetches[name] = v;\n }\n }\n }\n\n if (isFetches) {\n if (typeof arg2 === 'object' && arg2 !== null) {\n options = arg2;\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else {\n options = arg1 as RunOptions;\n }\n }\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('Unexpected argument[1]: must be \\'fetches\\' or \\'options\\'.');\n }\n\n // check if all inputs are in feed\n for (const name of inputNames) {\n if (typeof feeds[name] === 'undefined') {\n throw new Error(`input '${name}' is missing in 'feeds'.`);\n }\n }\n\n // if no fetches is specified, we use the full output names list\n if (isFetchesEmpty) {\n for (const name of outputNames) {\n fetches[name] = null;\n }\n }\n\n return [fetches, options];\n }\n\n /**\n * Helper method for runTrainStep and any other runStep methods. Takes the ReturnType result from the SessionHandler\n * and changes it into a map of Tensors.\n *\n * @param results\n * @returns\n */\n convertHandlerReturnTypeToMapOfTensors(results: SessionHandler.ReturnType): ReturnType {\n const returnValue: {[name: string]: OnnxValue} = {};\n for (const key in results) {\n if (Object.hasOwnProperty.call(results, key)) {\n const result = results[key];\n if (result instanceof Tensor) {\n returnValue[key] = result;\n } else {\n returnValue[key] = new Tensor(result.type, result.data, result.dims);\n }\n }\n }\n return returnValue;\n }\n\n async lazyResetGrad(): Promise {\n await this.handler.lazyResetGrad();\n }\n\n runTrainStep(feeds: FeedsType, options?: RunOptions): Promise;\n runTrainStep(feeds: FeedsType, fetches: FetchesType, options?: RunOptions): Promise;\n async runTrainStep(feeds: FeedsType, arg1?: FetchesType|RunOptions, arg2?: RunOptions): Promise {\n const [fetches, options] =\n this.typeNarrowingForRunStep(this.trainingInputNames, this.trainingOutputNames, feeds, arg1, arg2);\n const results = await this.handler.runTrainStep(feeds, fetches, options);\n return this.convertHandlerReturnTypeToMapOfTensors(results);\n }\n\n async runOptimizerStep(options?: InferenceSession.RunOptions|undefined): Promise {\n if (this.hasOptimizerModel) {\n await this.handler.runOptimizerStep(options || {});\n } else {\n throw new Error('This TrainingSession has no OptimizerModel loaded.');\n }\n }\n\n runEvalStep(feeds: FeedsType, options?: RunOptions|undefined): Promise;\n runEvalStep(feeds: FeedsType, fetches: FetchesType, options?: RunOptions|undefined): Promise;\n async runEvalStep(feeds: FeedsType, arg1?: FetchesType|RunOptions, arg2?: RunOptions): Promise {\n if (this.hasEvalModel) {\n const [fetches, options] =\n this.typeNarrowingForRunStep(this.evalInputNames, this.evalOutputNames, feeds, arg1, arg2);\n const results = await this.handler.runEvalStep(feeds, fetches, options);\n return this.convertHandlerReturnTypeToMapOfTensors(results);\n } else {\n throw new Error('This TrainingSession has no EvalModel loaded.');\n }\n }\n\n async getParametersSize(trainableOnly = true): Promise {\n return this.handler.getParametersSize(trainableOnly);\n }\n\n async loadParametersBuffer(array: Uint8Array, trainableOnly = true): Promise {\n const paramsSize = await this.getParametersSize(trainableOnly);\n // checking that the size of the Uint8Array is equivalent to the byte length of a Float32Array of the number\n // of parameters\n if (array.length !== 4 * paramsSize) {\n throw new Error(\n 'Size of the buffer passed into loadParametersBuffer must match the number of parameters in ' +\n 'the model. Please use getParametersSize method to check.');\n }\n return this.handler.loadParametersBuffer(array, trainableOnly);\n }\n\n async getContiguousParameters(trainableOnly = true): Promise {\n return this.handler.getContiguousParameters(trainableOnly);\n }\n\n async release(): Promise {\n return this.handler.dispose();\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession} from './inference-session.js';\nimport {OnnxValue} from './onnx-value.js';\nimport {TrainingSession as TrainingSessionImpl} from './training-session-impl.js';\n\n/* eslint-disable @typescript-eslint/no-redeclare */\n\nexport declare namespace TrainingSession {\n /**\n * Either URI file path (string) or Uint8Array containing model or checkpoint information.\n */\n type UriOrBuffer = string|Uint8Array;\n}\n\n/**\n * Represent a runtime instance of an ONNX training session,\n * which contains a model that can be trained, and, optionally,\n * an eval and optimizer model.\n */\nexport interface TrainingSession {\n // #region run()\n\n /**\n * Lazily resets the gradients of all trainable parameters to zero. Should happen after the invocation of\n * runOptimizerStep.\n */\n lazyResetGrad(): Promise;\n\n /**\n * Run TrainStep asynchronously with the given feeds and options.\n *\n * @param feeds - Representation of the model input. See type description of `InferenceSession.InputType` for\n detail.\n * @param options - Optional. A set of options that controls the behavior of model training.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding values.\n */\n runTrainStep(feeds: InferenceSession.FeedsType, options?: InferenceSession.RunOptions):\n Promise;\n\n /**\n * Run a single train step with the given inputs and options.\n *\n * @param feeds - Representation of the model input.\n * @param fetches - Representation of the model output.\n * detail.\n * @param options - Optional. A set of options that controls the behavior of model training.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding\n values.\n */\n runTrainStep(\n feeds: InferenceSession.FeedsType, fetches: InferenceSession.FetchesType,\n options?: InferenceSession.RunOptions): Promise;\n\n /**\n * Runs a single optimizer step, which performs weight updates for the trainable parameters using the optimizer model.\n *\n * @param options - Optional. A set of options that controls the behavior of model optimizing.\n */\n runOptimizerStep(options?: InferenceSession.RunOptions): Promise;\n\n /**\n * Run a single eval step with the given inputs and options using the eval model.\n *\n * @param feeds - Representation of the model input.\n * @param options - Optional. A set of options that controls the behavior of model eval step.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding\n values.\n */\n runEvalStep(feeds: InferenceSession.FeedsType, options?: InferenceSession.RunOptions):\n Promise;\n\n /**\n * Run a single eval step with the given inputs and options using the eval model.\n *\n * @param feeds - Representation of the model input.\n * @param fetches - Representation of the model output.\n * detail.\n * @param options - Optional. A set of options that controls the behavior of model eval step.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding\n values.\n */\n runEvalStep(\n feeds: InferenceSession.FeedsType, fetches: InferenceSession.FetchesType,\n options?: InferenceSession.RunOptions): Promise;\n\n // #endregion\n\n // #region copy parameters\n\n /**\n * Retrieves the size of all parameters for the training state. Calculates the total number of primitive (datatype of\n * the parameters) elements of all the parameters in the training state.\n *\n * @param trainableOnly - When set to true, the size is calculated for trainable params only. Default value is true.\n */\n getParametersSize(trainableOnly: boolean): Promise;\n\n /**\n * Copies parameter values from the given buffer to the training state. Currently, only supporting models with\n * parameters of type Float32.\n *\n * @param buffer - A Uint8Array representation of Float32 parameters.\n * @param trainableOnly - True if trainable parameters only to be modified, false otherwise. Default value is true.\n */\n loadParametersBuffer(buffer: Uint8Array, trainableOnly: boolean): Promise;\n\n /**\n * Copies the model parameters to a contiguous buffer. Usually used in the context of Federated Learning.\n * Currently, only supporting models with parameters of type Float32.\n *\n * @param trainableOnly - When set to true, only trainable parameters are copied. Trainable parameters are parameters\n * for which requires_grad is set to true. Default value is true.\n * @returns A promise that resolves to a Float32 OnnxValue of the requested parameters.\n */\n getContiguousParameters(trainableOnly: boolean): Promise;\n // #endregion\n\n // #region release()\n\n /**\n * Release the inference session and the underlying resources.\n */\n release(): Promise;\n // #endregion\n\n // #region metadata\n\n /**\n * Get input names of the loaded training model.\n */\n readonly trainingInputNames: readonly string[];\n\n /**\n * Get output names of the loaded training model.\n */\n readonly trainingOutputNames: readonly string[];\n\n /**\n * Get input names of the loaded eval model. Is an empty array if no eval model is loaded.\n */\n readonly evalInputNames: readonly string[];\n\n /**\n * Get output names of the loaded eval model. Is an empty array if no eval model is loaded.\n */\n readonly evalOutputNames: readonly string[];\n\n // #endregion\n}\n\n/**\n * Represents the optional parameters that can be passed into the TrainingSessionFactory.\n */\nexport interface TrainingSessionCreateOptions {\n /**\n * URI or buffer for a .ckpt file that contains the checkpoint for the training model.\n */\n checkpointState: TrainingSession.UriOrBuffer;\n /**\n * URI or buffer for the .onnx training file.\n */\n trainModel: TrainingSession.UriOrBuffer;\n /**\n * Optional. URI or buffer for the .onnx optimizer model file.\n */\n optimizerModel?: TrainingSession.UriOrBuffer;\n /**\n * Optional. URI or buffer for the .onnx eval model file.\n */\n evalModel?: TrainingSession.UriOrBuffer;\n}\n\n/**\n * Defines method overload possibilities for creating a TrainingSession.\n */\nexport interface TrainingSessionFactory {\n // #region create()\n\n /**\n * Creates a new TrainingSession and asynchronously loads any models passed in through trainingOptions\n *\n * @param trainingOptions specify models and checkpoints to load into the Training Session\n * @param sessionOptions specify configuration for training session behavior\n *\n * @returns Promise that resolves to a TrainingSession object\n */\n create(trainingOptions: TrainingSessionCreateOptions, sessionOptions?: InferenceSession.SessionOptions):\n Promise;\n\n // #endregion\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const TrainingSession: TrainingSessionFactory = TrainingSessionImpl;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * # ONNX Runtime JavaScript API\n *\n * ONNX Runtime JavaScript API is a unified API for all JavaScript usages, including the following NPM packages:\n *\n * - [onnxruntime-node](https://www.npmjs.com/package/onnxruntime-node)\n * - [onnxruntime-web](https://www.npmjs.com/package/onnxruntime-web)\n * - [onnxruntime-react-native](https://www.npmjs.com/package/onnxruntime-react-native)\n *\n * See also:\n * - [Get Started](https://onnxruntime.ai/docs/get-started/with-javascript/)\n * - [Inference examples](https://github.com/microsoft/onnxruntime-inference-examples/tree/main/js)\n *\n * @packageDocumentation\n */\n\nexport * from './backend.js';\nexport * from './env.js';\nexport * from './inference-session.js';\nexport * from './tensor.js';\nexport * from './tensor-conversion.js';\nexport * from './tensor-factory.js';\nexport * from './trace.js';\nexport * from './onnx-model.js';\nexport * from './onnx-value.js';\nexport * from './training-session.js';\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport const isNode = !!(typeof process !== 'undefined' && process.versions && process.versions.node);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/// \n\n//\n// * type hack for \"HTMLImageElement\"\n//\n// in typescript, the type of \"HTMLImageElement\" is defined in lib.dom.d.ts, which is conflict with lib.webworker.d.ts.\n// when we use webworker, the lib.webworker.d.ts will be used, which does not have HTMLImageElement defined.\n//\n// we will get the following errors complaining that HTMLImageElement is not defined:\n//\n// ====================================================================================================================\n//\n// ../common/dist/cjs/tensor-factory.d.ts:187:29 - error TS2552: Cannot find name 'HTMLImageElement'. Did you mean\n// 'HTMLLIElement'?\n//\n// 187 fromImage(imageElement: HTMLImageElement, options?: TensorFromImageElementOptions):\n// Promise | TypedTensor<'uint8'>>;\n// ~~~~~~~~~~~~~~~~\n//\n// node_modules/@webgpu/types/dist/index.d.ts:83:7 - error TS2552: Cannot find name 'HTMLImageElement'. Did you mean\n// 'HTMLLIElement'?\n//\n// 83 | HTMLImageElement\n// ~~~~~~~~~~~~~~~~\n//\n// ====================================================================================================================\n//\n// `HTMLImageElement` is only used in type declaration and not in real code. So we define it as `unknown` here to\n// bypass the type check.\n\n//\n// * type hack for \"document\"\n//\n// in typescript, the type of \"document\" is defined in lib.dom.d.ts, so it's not available in webworker.\n//\n// we will get the following errors complaining that document is not defined:\n//\n// ====================================================================================================================\n//\n// lib/wasm/wasm-utils-import.ts:7:33 - error TS2584: Cannot find name 'document'. Do you need to change your target\n// library? Try changing the 'lib' compiler option to include 'dom'.\n//\n// 7 export const scriptSrc = typeof document !== 'undefined' ? (document?.currentScript as HTMLScriptElement)?.src :\n// ~~~~~~~~\n//\n// lib/wasm/wasm-utils-import.ts:7:61 - error TS2584: Cannot find name 'document'. Do you need to change your target\n// library? Try changing the 'lib' compiler option to include 'dom'.\n//\n// 7 export const scriptSrc = typeof document !== 'undefined' ? (document?.currentScript as HTMLScriptElement)?.src :\n// ~~~~~~~~\n//\n// lib/wasm/wasm-utils-import.ts:7:88 - error TS2552: Cannot find name 'HTMLScriptElement'. Did you mean\n// 'HTMLLIElement'?\n//\n// 7 export const scriptSrc = typeof document !== 'undefined' ? (document?.currentScript as HTMLScriptElement)?.src :\n// ~~~~~~~~~~~~~~~~~\n// ====================================================================================================================\n//\n// `document` is used to get the current script URL, which is not available in webworker. This file is served as a\n// \"dual\" file for entries of both webworker and the esm module.\n//\ndeclare global {\n type HTMLImageElement = unknown;\n type HTMLScriptElement = {src?: string};\n const document: undefined|{currentScript?: HTMLScriptElement};\n}\n\n/**\n * @summary\n *\n * This file is served as a \"dual\" file for both entries of the following:\n * - The proxy worker itself.\n * - When used as a worker, it listens to the messages from the main thread and performs the corresponding operations.\n * - Should be imported directly using `new Worker()` in the main thread.\n *\n * - The ESM module that creates the proxy worker (as a worker launcher).\n * - When used as a worker launcher, it creates the proxy worker and returns it.\n * - Should be imported using `import()` in the main thread, with the query parameter `import=1`.\n *\n * This file will be always compiling into ESM format.\n */\n\nimport type {OrtWasmMessage, SerializableTensorMetadata} from '../proxy-messages.js';\nimport {createSession, copyFromExternalBuffer, endProfiling, extractTransferableBuffers, initEp, initRuntime, releaseSession, run} from '../wasm-core-impl.js';\nimport {initializeWebAssembly} from '../wasm-factory.js';\nimport {scriptSrc} from '../wasm-utils-import.js';\n\nconst WORKER_NAME = 'ort-wasm-proxy-worker';\nconst isProxyWorker = globalThis.self?.name === WORKER_NAME;\n\nif (isProxyWorker) {\n // Worker thread\n self.onmessage = (ev: MessageEvent): void => {\n const {type, in : message} = ev.data;\n try {\n switch (type) {\n case 'init-wasm':\n initializeWebAssembly(message!.wasm)\n .then(\n () => {\n initRuntime(message!).then(\n () => {\n postMessage({type});\n },\n err => {\n postMessage({type, err});\n });\n },\n err => {\n postMessage({type, err});\n });\n break;\n case 'init-ep': {\n const {epName, env} = message!;\n initEp(env, epName)\n .then(\n () => {\n postMessage({type});\n },\n err => {\n postMessage({type, err});\n });\n break;\n }\n case 'copy-from': {\n const {buffer} = message!;\n const bufferData = copyFromExternalBuffer(buffer);\n postMessage({type, out: bufferData} as OrtWasmMessage);\n break;\n }\n case 'create': {\n const {model, options} = message!;\n createSession(model, options)\n .then(\n sessionMetadata => {\n postMessage({type, out: sessionMetadata} as OrtWasmMessage);\n },\n err => {\n postMessage({type, err});\n });\n break;\n }\n case 'release':\n releaseSession(message!);\n postMessage({type});\n break;\n case 'run': {\n const {sessionId, inputIndices, inputs, outputIndices, options} = message!;\n run(sessionId, inputIndices, inputs, outputIndices, new Array(outputIndices.length).fill(null), options)\n .then(\n outputs => {\n if (outputs.some(o => o[3] !== 'cpu')) {\n postMessage({type, err: 'Proxy does not support non-cpu tensor location.'});\n } else {\n postMessage(\n {type, out: outputs} as OrtWasmMessage,\n extractTransferableBuffers([...inputs, ...outputs] as SerializableTensorMetadata[]));\n }\n },\n err => {\n postMessage({type, err});\n });\n break;\n }\n case 'end-profiling':\n endProfiling(message!);\n postMessage({type});\n break;\n default:\n }\n } catch (err) {\n postMessage({type, err} as OrtWasmMessage);\n }\n };\n}\n\nexport default isProxyWorker ?\n null :\n (urlOverride?: string) =>\n new Worker(urlOverride ?? scriptSrc!, {type: BUILD_DEFS.IS_ESM ? 'module' : 'classic', name: WORKER_NAME});\n", "var r,e=(r=import.meta.url,async function(e={}){function t(){return k.buffer!=R.buffer&&Y(),R}function n(){return k.buffer!=R.buffer&&Y(),P}function a(){return k.buffer!=R.buffer&&Y(),D}function o(){return k.buffer!=R.buffer&&Y(),F}function i(){return k.buffer!=R.buffer&&Y(),B}function s(){return k.buffer!=R.buffer&&Y(),I}function u(){return k.buffer!=R.buffer&&Y(),U}function f(){return k.buffer!=R.buffer&&Y(),G}var l,c,d=Object.assign({},e),b=new Promise(((r,e)=>{l=r,c=e})),g=\"object\"==typeof window,m=\"function\"==typeof importScripts,p=m&&\"em-pthread\"==self.name;d.mountExternalData=(r,e)=>{(d.Cb||(d.Cb=new Map)).set(r,e)},d.unmountExternalData=()=>{delete d.Cb};var h=globalThis.SharedArrayBuffer??new WebAssembly.Memory({initial:0,maximum:0,shared:!0}).buffer.constructor;let v=()=>{const r=(r,e,t)=>(...n)=>{const a=Ye,o=e?.();n=r(...n);const i=e?.();return o!==i&&(r=i,t(o),e=t=null),Ye!=a?new Promise(((r,e)=>{Qe={resolve:r,reject:e}})):n},e=r=>async(...e)=>{try{if(d.Bb)throw Error(\"Session already started\");const t=d.Bb={Zb:e[0],errors:[]},n=await r(...e);if(d.Bb!==t)throw Error(\"Session mismatch\");d.Jb?.flush();const a=t.errors;if(0r)),0d._OrtCreateSession),(r=>d._OrtCreateSession=r)),d._OrtRun=e(r(d._OrtRun,(()=>d._OrtRun),(r=>d._OrtRun=r))),d._OrtRunWithBinding=e(r(d._OrtRunWithBinding,(()=>d._OrtRunWithBinding),(r=>d._OrtRunWithBinding=r))),d._OrtBindInput=r(d._OrtBindInput,(()=>d._OrtBindInput),(r=>d._OrtBindInput=r)),v=void 0};d.jsepInit=(r,e)=>{if(v?.(),\"webgpu\"===r){[d.Jb,d.Qb,d.Ub,d.Kb,d.Tb,d.gb,d.Vb,d.Xb,d.Rb,d.Sb,d.Wb]=e;const r=d.Jb;d.jsepRegisterBuffer=(e,t,n,a)=>r.registerBuffer(e,t,n,a),d.jsepGetBuffer=e=>r.getBuffer(e),d.jsepCreateDownloader=(e,t,n)=>r.createDownloader(e,t,n),d.jsepOnReleaseSession=e=>{r.onReleaseSession(e)},d.jsepOnRunStart=e=>r.onRunStart(e)}};var y,w,A=Object.assign({},d),_=\"./this.program\",C=(r,e)=>{throw e},O=\"\";(g||m)&&(m?O=self.location.href:\"undefined\"!=typeof document&&document.currentScript&&(O=document.currentScript.src),r&&(O=r),O=O.startsWith(\"blob:\")?\"\":O.substr(0,O.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1),r=>{var e=new XMLHttpRequest;return e.open(\"GET\",r,!1),e.send(null),e.responseText},m&&(w=r=>{var e=new XMLHttpRequest;return e.open(\"GET\",r,!1),e.responseType=\"arraybuffer\",e.send(null),new Uint8Array(e.response)}),y=(r,e,t)=>{var n=new XMLHttpRequest;n.open(\"GET\",r,!0),n.responseType=\"arraybuffer\",n.onload=()=>{200==n.status||0==n.status&&n.response?e(n.response):t()},n.onerror=t,n.send(null)});var T=console.log.bind(console),S=console.error.bind(console),W=T,E=S;if(Object.assign(d,A),A=null,p){var x,M=!1;function Dn(r){try{var e=r.data,t=e.cmd;if(\"load\"===t){let r=[];self.onmessage=e=>r.push(e),self.startWorker=()=>{postMessage({cmd:\"loaded\"});for(let e of r)Dn(e);self.onmessage=Dn};for(const r of e.handlers)d[r]&&!d[r].proxy||(d[r]=(...e)=>{postMessage({Ib:\"callHandler\",hc:r,args:e})},\"print\"==r&&(W=d[r]),\"printErr\"==r&&(E=d[r]));k=e.wasmMemory,Y(),x(e.wasmModule)}else if(\"run\"===t){wn(e.pthread_ptr,0,0,1,0,0),He(e.pthread_ptr),Tr(),Ar(),M||(mn(),M=!0);try{Sr(e.start_routine,e.arg)}catch(r){if(\"unwind\"!=r)throw r}}else\"cancel\"===t?hn()&&On(-1):\"setimmediate\"!==e.target&&(\"checkMailbox\"===t?M&&Re():t&&(E(`worker: received unknown command ${t}`),E(e)))}catch(r){throw An(),r}}E=function(...r){r=r.join(\" \"),console.error(r)},self.alert=function(...r){postMessage({Ib:\"alert\",text:r.join(\" \"),jc:hn()})},d.instantiateWasm=(r,e)=>new Promise((r=>{x=t=>{t=new WebAssembly.Instance(t,or()),e(t),r()}})),self.onunhandledrejection=r=>{throw r.reason||r},self.onmessage=Dn}var k,N,H,R,P,D,F,B,I,U,j,$,G,z=!1;function Y(){var r=k.buffer;d.HEAP8=R=new Int8Array(r),d.HEAP16=D=new Int16Array(r),d.HEAPU8=P=new Uint8Array(r),d.HEAPU16=F=new Uint16Array(r),d.HEAP32=B=new Int32Array(r),d.HEAPU32=I=new Uint32Array(r),d.HEAPF32=U=new Float32Array(r),d.HEAPF64=G=new Float64Array(r),d.HEAP64=j=new BigInt64Array(r),d.HEAPU64=$=new BigUint64Array(r)}if(!p){if(d.wasmMemory)k=d.wasmMemory;else if(!((k=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0})).buffer instanceof h))throw E(\"requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag\"),Error(\"bad memory\");Y()}var L=[],V=[],q=[],J=0,X=null,Q=null;function Z(){if(0==--J&&(null!==X&&(clearInterval(X),X=null),Q)){var r=Q;Q=null,r()}}function K(r){throw E(r=\"Aborted(\"+r+\")\"),z=!0,H=1,r=new WebAssembly.RuntimeError(r+\". Build with -sASSERTIONS for more info.\"),c(r),r}var rr,er=r=>r.startsWith(\"data:application/octet-stream;base64,\"),tr=r=>r.startsWith(\"file://\");function nr(r){if(w)return w(r);throw\"both async and sync fetching of the wasm failed\"}function ar(r,e,t){return function(r){if(g||m){if(\"function\"==typeof fetch&&!tr(r))return fetch(r,{credentials:\"same-origin\"}).then((e=>{if(!e.ok)throw`failed to load wasm binary file at '${r}'`;return e.arrayBuffer()})).catch((()=>nr(r)));if(y)return new Promise(((e,t)=>{y(r,(r=>e(new Uint8Array(r))),t)}))}return Promise.resolve().then((()=>nr(r)))}(r).then((r=>WebAssembly.instantiate(r,e))).then(t,(r=>{E(`failed to asynchronously prepare wasm: ${r}`),K(r)}))}function or(){return{a:{wa:sr,b:Er,Y:Mr,y:Rr,ma:Pr,U:Ir,W:Ur,na:jr,ka:$r,da:Gr,ja:zr,I:Yr,V:Lr,S:Vr,la:qr,T:Jr,sa:Zr,C:oe,M:se,L:me,B:he,s:ve,p:ye,D:we,x:Ee,N:xe,ra:Me,ga:ke,Q:Pe,Z:Fe,E:Be,fa:He,pa:Ie,u:$e,A:rt,o:tt,k:ot,c:le,n:st,j:ct,xa:dt,r:bt,d:gt,v:mt,m:pt,g:ht,l:vt,i:yt,h:wt,e:At,aa:_t,ba:St,ca:Wt,_:Et,$:xt,P:Mt,f:Ht,K:Rt,F:Pt,J:Dt,ta:Ft,oa:It,R:Ut,t:Bt,w:jt,O:$t,va:Lt,ua:Vt,ha:Qt,ia:Zt,X:mr,z:Kt,H:rn,ea:en,G:nn,a:k,qa:un,q:fn}}}var ir={1336340:(r,e,t,a)=>{if(void 0===d||!d.Cb)return 1;if((r=Hr(r>>>0)).startsWith(\"./\")&&(r=r.substring(2)),!(r=d.Cb.get(r)))return 2;if(a>>>=0,(e>>>=0)+(t>>>=0)>r.byteLength)return 3;try{return n().set(r.subarray(e,e+t),a>>>0),0}catch{return 4}},1336841:()=>{d.Rb()},1336872:()=>{d.Sb()},1336901:()=>{d.Wb()},1336926:r=>d.Qb(r),1336959:r=>d.Ub(r),1336991:(r,e,t)=>{d.Kb(r,e,t,!0)},1337030:(r,e,t)=>{d.Kb(r,e,t)},1337063:()=>\"undefined\"!=typeof wasmOffsetConverter,1337120:r=>{d.gb(\"Abs\",r,void 0)},1337171:r=>{d.gb(\"Neg\",r,void 0)},1337222:r=>{d.gb(\"Floor\",r,void 0)},1337275:r=>{d.gb(\"Ceil\",r,void 0)},1337327:r=>{d.gb(\"Reciprocal\",r,void 0)},1337385:r=>{d.gb(\"Sqrt\",r,void 0)},1337437:r=>{d.gb(\"Exp\",r,void 0)},1337488:r=>{d.gb(\"Erf\",r,void 0)},1337539:r=>{d.gb(\"Sigmoid\",r,void 0)},1337594:(r,e,t)=>{d.gb(\"HardSigmoid\",r,{alpha:e,beta:t})},1337673:r=>{d.gb(\"Log\",r,void 0)},1337724:r=>{d.gb(\"Sin\",r,void 0)},1337775:r=>{d.gb(\"Cos\",r,void 0)},1337826:r=>{d.gb(\"Tan\",r,void 0)},1337877:r=>{d.gb(\"Asin\",r,void 0)},1337929:r=>{d.gb(\"Acos\",r,void 0)},1337981:r=>{d.gb(\"Atan\",r,void 0)},1338033:r=>{d.gb(\"Sinh\",r,void 0)},1338085:r=>{d.gb(\"Cosh\",r,void 0)},1338137:r=>{d.gb(\"Asinh\",r,void 0)},1338190:r=>{d.gb(\"Acosh\",r,void 0)},1338243:r=>{d.gb(\"Atanh\",r,void 0)},1338296:r=>{d.gb(\"Tanh\",r,void 0)},1338348:r=>{d.gb(\"Not\",r,void 0)},1338399:(r,e,t)=>{d.gb(\"Clip\",r,{min:e,max:t})},1338468:r=>{d.gb(\"Clip\",r,void 0)},1338520:(r,e)=>{d.gb(\"Elu\",r,{alpha:e})},1338578:r=>{d.gb(\"Relu\",r,void 0)},1338630:(r,e)=>{d.gb(\"LeakyRelu\",r,{alpha:e})},1338694:(r,e)=>{d.gb(\"ThresholdedRelu\",r,{alpha:e})},1338764:(r,e)=>{d.gb(\"Cast\",r,{to:e})},1338822:r=>{d.gb(\"Add\",r,void 0)},1338873:r=>{d.gb(\"Sub\",r,void 0)},1338924:r=>{d.gb(\"Mul\",r,void 0)},1338975:r=>{d.gb(\"Div\",r,void 0)},1339026:r=>{d.gb(\"Pow\",r,void 0)},1339077:r=>{d.gb(\"Equal\",r,void 0)},1339130:r=>{d.gb(\"Greater\",r,void 0)},1339185:r=>{d.gb(\"GreaterOrEqual\",r,void 0)},1339247:r=>{d.gb(\"Less\",r,void 0)},1339299:r=>{d.gb(\"LessOrEqual\",r,void 0)},1339358:(r,e,t,n,a)=>{d.gb(\"ReduceMean\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1339517:(r,e,t,n,a)=>{d.gb(\"ReduceMax\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1339675:(r,e,t,n,a)=>{d.gb(\"ReduceMin\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1339833:(r,e,t,n,a)=>{d.gb(\"ReduceProd\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1339992:(r,e,t,n,a)=>{d.gb(\"ReduceSum\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1340150:(r,e,t,n,a)=>{d.gb(\"ReduceL1\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1340307:(r,e,t,n,a)=>{d.gb(\"ReduceL2\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1340464:(r,e,t,n,a)=>{d.gb(\"ReduceLogSum\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1340625:(r,e,t,n,a)=>{d.gb(\"ReduceSumSquare\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1340789:(r,e,t,n,a)=>{d.gb(\"ReduceLogSumExp\",r,{keepDims:!!e,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1340953:r=>{d.gb(\"Where\",r,void 0)},1341006:(r,e,t)=>{d.gb(\"Transpose\",r,{perm:e?Array.from(i().subarray(e>>>0,t>>>0)):[]})},1341114:(r,e,t,n)=>{d.gb(\"DepthToSpace\",r,{blocksize:e,mode:Hr(t),format:n?\"NHWC\":\"NCHW\"})},1341247:(r,e,t,n)=>{d.gb(\"DepthToSpace\",r,{blocksize:e,mode:Hr(t),format:n?\"NHWC\":\"NCHW\"})},1341380:(r,e,n,a,o,s,u,f,l,c,b,g,m,p,h)=>{d.gb(\"ConvTranspose\",r,{format:l?\"NHWC\":\"NCHW\",autoPad:e,dilations:[n],group:a,kernelShape:[o],pads:[s,u],strides:[f],wIsConst:()=>!!t()[c>>>0],outputPadding:b?Array.from(i().subarray(b>>>0,g>>>0)):[],outputShape:m?Array.from(i().subarray(m>>>0,p>>>0)):[],activation:Hr(h)})},1341781:(r,e,n,a,o,s,u,f,l,c,b,g,m,p)=>{d.gb(\"ConvTranspose\",r,{format:f?\"NHWC\":\"NCHW\",autoPad:e,dilations:Array.from(i().subarray(n>>>0,2+(n>>>0)>>>0)),group:a,kernelShape:Array.from(i().subarray(o>>>0,2+(o>>>0)>>>0)),pads:Array.from(i().subarray(s>>>0,4+(s>>>0)>>>0)),strides:Array.from(i().subarray(u>>>0,2+(u>>>0)>>>0)),wIsConst:()=>!!t()[l>>>0],outputPadding:c?Array.from(i().subarray(c>>>0,b>>>0)):[],outputShape:g?Array.from(i().subarray(g>>>0,m>>>0)):[],activation:Hr(p)})},1342346:(r,e,n,a,o,s,u,f,l,c,b,g,m,p,h)=>{d.gb(\"ConvTranspose\",r,{format:l?\"NHWC\":\"NCHW\",autoPad:e,dilations:[n],group:a,kernelShape:[o],pads:[s,u],strides:[f],wIsConst:()=>!!t()[c>>>0],outputPadding:b?Array.from(i().subarray(b>>>0,g>>>0)):[],outputShape:m?Array.from(i().subarray(m>>>0,p>>>0)):[],activation:Hr(h)})},1342747:(r,e,n,a,o,s,u,f,l,c,b,g,m,p)=>{d.gb(\"ConvTranspose\",r,{format:f?\"NHWC\":\"NCHW\",autoPad:e,dilations:Array.from(i().subarray(n>>>0,2+(n>>>0)>>>0)),group:a,kernelShape:Array.from(i().subarray(o>>>0,2+(o>>>0)>>>0)),pads:Array.from(i().subarray(s>>>0,4+(s>>>0)>>>0)),strides:Array.from(i().subarray(u>>>0,2+(u>>>0)>>>0)),wIsConst:()=>!!t()[l>>>0],outputPadding:c?Array.from(i().subarray(c>>>0,b>>>0)):[],outputShape:g?Array.from(i().subarray(g>>>0,m>>>0)):[],activation:Hr(p)})},1343312:(r,e)=>{d.gb(\"GlobalAveragePool\",r,{format:e?\"NHWC\":\"NCHW\"})},1343403:(r,e,t,n,a,o,i,s,u,f,l,c,b,g,m,p)=>{d.gb(\"AveragePool\",r,{format:p?\"NHWC\":\"NCHW\",auto_pad:e,ceil_mode:t,count_include_pad:n,storage_order:a,dilations:[o,i],kernel_shape:[s,u],pads:[f,l,c,b],strides:[g,m]})},1343687:(r,e)=>{d.gb(\"GlobalAveragePool\",r,{format:e?\"NHWC\":\"NCHW\"})},1343778:(r,e,t,n,a,o,i,s,u,f,l,c,b,g,m,p)=>{d.gb(\"AveragePool\",r,{format:p?\"NHWC\":\"NCHW\",auto_pad:e,ceil_mode:t,count_include_pad:n,storage_order:a,dilations:[o,i],kernel_shape:[s,u],pads:[f,l,c,b],strides:[g,m]})},1344062:(r,e)=>{d.gb(\"GlobalMaxPool\",r,{format:e?\"NHWC\":\"NCHW\"})},1344149:(r,e,t,n,a,o,i,s,u,f,l,c,b,g,m,p)=>{d.gb(\"MaxPool\",r,{format:p?\"NHWC\":\"NCHW\",auto_pad:e,ceil_mode:t,count_include_pad:n,storage_order:a,dilations:[o,i],kernel_shape:[s,u],pads:[f,l,c,b],strides:[g,m]})},1344429:(r,e)=>{d.gb(\"GlobalMaxPool\",r,{format:e?\"NHWC\":\"NCHW\"})},1344516:(r,e,t,n,a,o,i,s,u,f,l,c,b,g,m,p)=>{d.gb(\"MaxPool\",r,{format:p?\"NHWC\":\"NCHW\",auto_pad:e,ceil_mode:t,count_include_pad:n,storage_order:a,dilations:[o,i],kernel_shape:[s,u],pads:[f,l,c,b],strides:[g,m]})},1344796:(r,e,t,n,a)=>{d.gb(\"Gemm\",r,{alpha:e,beta:t,transA:n,transB:a})},1344900:r=>{d.gb(\"MatMul\",r,void 0)},1344954:(r,e,t,n)=>{d.gb(\"ArgMax\",r,{keepDims:!!e,selectLastIndex:!!t,axis:n})},1345062:(r,e,t,n)=>{d.gb(\"ArgMin\",r,{keepDims:!!e,selectLastIndex:!!t,axis:n})},1345170:(r,e)=>{d.gb(\"Softmax\",r,{axis:e})},1345233:(r,e)=>{d.gb(\"Concat\",r,{axis:e})},1345293:(r,e,t,n,a)=>{d.gb(\"Split\",r,{axis:e,numOutputs:t,splitSizes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1345433:r=>{d.gb(\"Expand\",r,void 0)},1345487:(r,e)=>{d.gb(\"Gather\",r,{axis:Number(e)})},1345558:(r,e)=>{d.gb(\"GatherElements\",r,{axis:Number(e)})},1345637:(r,e,t,n,a,o,s,u,f,l,c)=>{d.gb(\"Resize\",r,{antialias:e,axes:t?Array.from(i().subarray(t>>>0,n>>>0)):[],coordinateTransformMode:Hr(a),cubicCoeffA:o,excludeOutside:s,extrapolationValue:u,keepAspectRatioPolicy:Hr(f),mode:Hr(l),nearestMode:Hr(c)})},1345983:(r,e,t,n,a,o,s)=>{d.gb(\"Slice\",r,{starts:e?Array.from(i().subarray(e>>>0,t>>>0)):[],ends:n?Array.from(i().subarray(n>>>0,a>>>0)):[],axes:o?Array.from(i().subarray(o>>>0,s>>>0)):[]})},1346199:r=>{d.gb(\"Tile\",r,void 0)},1346251:(r,e,t)=>{d.gb(\"InstanceNormalization\",r,{epsilon:e,format:t?\"NHWC\":\"NCHW\"})},1346365:(r,e,t)=>{d.gb(\"InstanceNormalization\",r,{epsilon:e,format:t?\"NHWC\":\"NCHW\"})},1346479:r=>{d.gb(\"Range\",r,void 0)},1346532:(r,e)=>{d.gb(\"Einsum\",r,{equation:Hr(e)})},1346613:(r,e,t,n,a)=>{d.gb(\"Pad\",r,{mode:e,value:t,pads:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1346740:(r,e,t,n,a,o)=>{d.gb(\"BatchNormalization\",r,{epsilon:e,momentum:t,spatial:!!a,trainingMode:!!n,format:o?\"NHWC\":\"NCHW\"})},1346909:(r,e,t,n,a,o)=>{d.gb(\"BatchNormalization\",r,{epsilon:e,momentum:t,spatial:!!a,trainingMode:!!n,format:o?\"NHWC\":\"NCHW\"})},1347078:(r,e,t)=>{d.gb(\"CumSum\",r,{exclusive:Number(e),reverse:Number(t)})},1347175:(r,e,t,n,a,o,s,u,f)=>{d.gb(\"Attention\",r,{numHeads:e,isUnidirectional:t,maskFilterValue:n,scale:a,doRotary:o,qkvHiddenSizes:s?Array.from(i().subarray(Number(u)>>>0,Number(u)+s>>>0)):[],pastPresentShareBuffer:!!f})},1347447:r=>{d.gb(\"BiasAdd\",r,void 0)},1347502:r=>{d.gb(\"BiasSplitGelu\",r,void 0)},1347563:r=>{d.gb(\"FastGelu\",r,void 0)},1347619:(r,e,n,a,o,s,f,l,c,b,g,m,p,h,v,y)=>{d.gb(\"Conv\",r,{format:m?\"NHWC\":\"NCHW\",auto_pad:e,dilations:n?Array.from(i().subarray(n>>>0,a>>>0)):[],group:o,kernel_shape:s?Array.from(i().subarray(s>>>0,f>>>0)):[],pads:l?Array.from(i().subarray(l>>>0,c>>>0)):[],strides:b?Array.from(i().subarray(b>>>0,g>>>0)):[],w_is_const:()=>!!t()[p>>>0],activation:Hr(h),activation_params:v?Array.from(u().subarray(v>>>0,y>>>0)):[]})},1348115:r=>{d.gb(\"Gelu\",r,void 0)},1348167:(r,e,t,n)=>{d.gb(\"GroupQueryAttention\",r,{numHeads:e,kvNumHeads:t,scale:n})},1348280:(r,e,t,n)=>{d.gb(\"LayerNormalization\",r,{axis:e,epsilon:t,simplified:!!n})},1348391:(r,e,t,n)=>{d.gb(\"LayerNormalization\",r,{axis:e,epsilon:t,simplified:!!n})},1348502:(r,e,t,n,a,o)=>{d.gb(\"MatMulNBits\",r,{k:e,n:t,accuracyLevel:n,bits:a,blockSize:o})},1348629:(r,e,t,n,a,o)=>{d.gb(\"MultiHeadAttention\",r,{numHeads:e,isUnidirectional:t,maskFilterValue:n,scale:a,doRotary:o})},1348788:(r,e)=>{d.gb(\"QuickGelu\",r,{alpha:e})},1348852:(r,e,t,n,a)=>{d.gb(\"RotaryEmbedding\",r,{interleaved:!!e,numHeads:t,rotaryEmbeddingDim:n,scale:a})},1348991:(r,e,t)=>{d.gb(\"SkipLayerNormalization\",r,{epsilon:e,simplified:!!t})},1349093:r=>{d.Vb(r)},1349127:(r,e)=>d.Xb(r,e,d.Bb.Zb,d.Bb.errors),1349239:(r,e,t)=>{d.gb(\"SkipLayerNormalization\",r,{epsilon:e,simplified:!!t})}};function sr(r,e,t){return Ke((async()=>{await d.Tb(r,e,t)}))}function ur(r){this.name=\"ExitStatus\",this.message=`Program terminated with exit(${r})`,this.status=r}var fr=r=>{r.terminate(),r.onmessage=()=>{}},lr=r=>{0==pr.length&&(Cr(),_r(pr[0]));var e=pr.pop();if(!e)return 6;hr.push(e),yr[r.xb]=e,e.xb=r.xb;var t={cmd:\"run\",start_routine:r.$b,arg:r.Mb,pthread_ptr:r.xb};return e.postMessage(t,r.ec),0},cr=0,dr=(r,e,...t)=>{for(var n=2*t.length,a=xn(),o=En(8*n),i=o>>>3,s=0;s>>0]=u)}return r=_n(r,0,n,o,e),Wn(a),r};function br(r){if(p)return dr(0,1,r);if(H=r,!(0{if(H=r,p)throw gr(r),\"unwind\";br(r)},pr=[],hr=[],vr=[],yr={},wr=r=>{var e=r.xb;delete yr[e],pr.push(r),hr.splice(hr.indexOf(r),1),r.xb=0,Cn(e)};function Ar(){vr.forEach((r=>r()))}var _r=r=>new Promise((e=>{r.onmessage=t=>{var n=(t=t.data).cmd;if(t.targetThread&&t.targetThread!=hn()){var a=yr[t.targetThread];a?a.postMessage(t,t.transferList):E(`Internal error! Worker sent a message \"${n}\" to target pthread ${t.targetThread}, but that thread no longer exists!`)}else\"checkMailbox\"===n?Re():\"spawnThread\"===n?lr(t):\"cleanupThread\"===n?wr(yr[t.thread]):\"killThread\"===n?(t=t.thread,n=yr[t],delete yr[t],fr(n),Cn(t),hr.splice(hr.indexOf(n),1),n.xb=0):\"cancelThread\"===n?yr[t.thread].postMessage({cmd:\"cancel\"}):\"loaded\"===n?(r.loaded=!0,e(r)):\"alert\"===n?alert(`Thread ${t.threadId}: ${t.text}`):\"setimmediate\"===t.target?r.postMessage(t):\"callHandler\"===n?d[t.handler](...t.args):n&&E(`worker sent an unknown command ${n}`)},r.onerror=r=>{throw E(`worker sent an error! ${r.filename}:${r.lineno}: ${r.message}`),r};var t,n=[];for(t of[\"onExit\"])d.hasOwnProperty(t)&&n.push(t);r.postMessage({cmd:\"load\",handlers:n,wasmMemory:k,wasmModule:N})}));function Cr(){var r=new Worker(new URL(import.meta.url),{type:\"module\",workerData:\"em-pthread\",name:\"em-pthread\"});pr.push(r)}var Or=r=>{for(;0{var r=hn(),e=s()[r+52>>>2>>>0];r=s()[r+56>>>2>>>0],Sn(e,e-r),Wn(e)},Sr=(r,e)=>{cr=0,r=Mn(r,e),0>>=0);throw e>>>=0,t>>>=0,s()[n.Fb+16>>>2>>>0]=0,s()[n.Fb+4>>>2>>>0]=e,s()[n.Fb+8>>>2>>>0]=t,r}function xr(r,e,t,n){return p?dr(2,1,r,e,t,n):Mr(r,e,t,n)}function Mr(r,e,t,n){if(r>>>=0,e>>>=0,t>>>=0,n>>>=0,void 0===h)return E(\"Current environment does not support SharedArrayBuffer, pthreads are not available!\"),6;var a=[];return p&&0===a.length?xr(r,e,t,n):(r={$b:t,xb:r,Mb:n,ec:a},p?(r.Ib=\"spawnThread\",postMessage(r,a),0):lr(r))}var kr=\"undefined\"!=typeof TextDecoder?new TextDecoder(\"utf8\"):void 0,Nr=(r,e,t)=>{var n=(e>>>=0)+t;for(t=e;r[t]&&!(t>=n);)++t;if(16(a=224==(240&a)?(15&a)<<12|o<<6|i:(7&a)<<18|o<<12|i<<6|63&r[e++])?n+=String.fromCharCode(a):(a-=65536,n+=String.fromCharCode(55296|a>>10,56320|1023&a))}}else n+=String.fromCharCode(a)}return n},Hr=(r,e)=>(r>>>=0)?Nr(n(),r,e):\"\";function Rr(r,e,t){return p?dr(3,1,r,e,t):0}function Pr(r,e){if(p)return dr(4,1,r,e)}var Dr=r=>{for(var e=0,t=0;t=n?e++:2047>=n?e+=2:55296<=n&&57343>=n?(e+=4,++t):e+=3}return e},Fr=(r,e,t,n)=>{if(!(0>>=0;n=t+n-1;for(var o=0;o=i&&(i=65536+((1023&i)<<10)|1023&r.charCodeAt(++o)),127>=i){if(t>=n)break;e[t++>>>0]=i}else{if(2047>=i){if(t+1>=n)break;e[t++>>>0]=192|i>>6}else{if(65535>=i){if(t+2>=n)break;e[t++>>>0]=224|i>>12}else{if(t+3>=n)break;e[t++>>>0]=240|i>>18,e[t++>>>0]=128|i>>12&63}e[t++>>>0]=128|i>>6&63}e[t++>>>0]=128|63&i}}return e[t>>>0]=0,t-a},Br=(r,e,t)=>Fr(r,n(),e,t);function Ir(r,e){if(p)return dr(5,1,r,e)}function Ur(r,e,t){if(p)return dr(6,1,r,e,t)}function jr(r,e,t){return p?dr(7,1,r,e,t):0}function $r(r,e){if(p)return dr(8,1,r,e)}function Gr(r,e,t){if(p)return dr(9,1,r,e,t)}function zr(r,e,t,n){if(p)return dr(10,1,r,e,t,n)}function Yr(r,e,t,n){if(p)return dr(11,1,r,e,t,n)}function Lr(r,e,t,n){if(p)return dr(12,1,r,e,t,n)}function Vr(r){if(p)return dr(13,1,r)}function qr(r,e){if(p)return dr(14,1,r,e)}function Jr(r,e,t){if(p)return dr(15,1,r,e,t)}var Xr,Qr,Zr=()=>{K(\"\")},Kr=r=>{for(var e=\"\";n()[r>>>0];)e+=Xr[n()[r++>>>0]];return e},re={},ee={},te={};function ne(r,e,t={}){if(!(\"argPackAdvance\"in e))throw new TypeError(\"registerType registeredInstance requires argPackAdvance\");return function(r,e,t={}){var n=e.name;if(!r)throw new Qr(`type \"${n}\" must have a positive integer typeid pointer`);if(ee.hasOwnProperty(r)){if(t.Ob)return;throw new Qr(`Cannot register type '${n}' twice`)}ee[r]=e,delete te[r],re.hasOwnProperty(r)&&(e=re[r],delete re[r],e.forEach((r=>r())))}(r,e,t)}var ae=(r,e,u)=>{switch(e){case 1:return u?r=>t()[r>>>0]:r=>n()[r>>>0];case 2:return u?r=>a()[r>>>1>>>0]:r=>o()[r>>>1>>>0];case 4:return u?r=>i()[r>>>2>>>0]:r=>s()[r>>>2>>>0];case 8:return u?r=>j[r>>>3]:r=>$[r>>>3];default:throw new TypeError(`invalid integer width (${e}): ${r}`)}};function oe(r,e,t){t>>>=0,ne(r>>>=0,{name:e=Kr(e>>>0),fromWireType:r=>r,toWireType:function(r,e){if(\"bigint\"!=typeof e&&\"number\"!=typeof e)throw e=null===e?\"null\":\"object\"==(r=typeof e)||\"array\"===r||\"function\"===r?e.toString():\"\"+e,new TypeError(`Cannot convert \"${e}\" to ${this.name}`);return\"number\"==typeof e&&(e=BigInt(e)),e},argPackAdvance:ie,readValueFromPointer:ae(e,t,-1==e.indexOf(\"u\")),Ab:null})}var ie=8;function se(r,e,t,a){ne(r>>>=0,{name:e=Kr(e>>>0),fromWireType:function(r){return!!r},toWireType:function(r,e){return e?t:a},argPackAdvance:ie,readValueFromPointer:function(r){return this.fromWireType(n()[r>>>0])},Ab:null})}var ue=[],fe=[];function le(r){9<(r>>>=0)&&0==--fe[r+1]&&(fe[r]=void 0,ue.push(r))}var ce=r=>{if(!r)throw new Qr(\"Cannot use deleted val. handle = \"+r);return fe[r]},de=r=>{switch(r){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:const e=ue.pop()||fe.length;return fe[e]=r,fe[e+1]=1,e}};function be(r){return this.fromWireType(s()[r>>>2>>>0])}var ge={name:\"emscripten::val\",fromWireType:r=>{var e=ce(r);return le(r),e},toWireType:(r,e)=>de(e),argPackAdvance:ie,readValueFromPointer:be,Ab:null};function me(r){return ne(r>>>0,ge)}var pe=(r,e)=>{switch(e){case 4:return function(r){return this.fromWireType(u()[r>>>2>>>0])};case 8:return function(r){return this.fromWireType(f()[r>>>3>>>0])};default:throw new TypeError(`invalid float width (${e}): ${r}`)}};function he(r,e,t){t>>>=0,ne(r>>>=0,{name:e=Kr(e>>>0),fromWireType:r=>r,toWireType:(r,e)=>e,argPackAdvance:ie,readValueFromPointer:pe(e,t),Ab:null})}function ve(r,e,t,n,a){if(r>>>=0,t>>>=0,e=Kr(e>>>0),-1===a&&(a=4294967295),a=r=>r,0===n){var o=32-8*t;a=r=>r<>>o}var i=e.includes(\"unsigned\")?function(r,e){return e>>>0}:function(r,e){return e};ne(r,{name:e,fromWireType:a,toWireType:i,argPackAdvance:ie,readValueFromPointer:ae(e,t,0!==n),Ab:null})}function ye(r,e,n){function a(r){var e=s()[r>>>2>>>0];return r=s()[r+4>>>2>>>0],new o(t().buffer,r,e)}var o=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][e];ne(r>>>=0,{name:n=Kr(n>>>0),fromWireType:a,argPackAdvance:ie,readValueFromPointer:a},{Ob:!0})}function we(r,e){r>>>=0;var t=\"std::string\"===(e=Kr(e>>>0));ne(r,{name:e,fromWireType:function(r){var e=s()[r>>>2>>>0],a=r+4;if(t)for(var o=a,i=0;i<=e;++i){var u=a+i;if(i==e||0==n()[u>>>0]){if(o=Hr(o,u-o),void 0===f)var f=o;else f+=String.fromCharCode(0),f+=o;o=u+1}}else{for(f=Array(e),i=0;i>>0]);f=f.join(\"\")}return yn(r),f},toWireType:function(r,e){e instanceof ArrayBuffer&&(e=new Uint8Array(e));var a=\"string\"==typeof e;if(!(a||e instanceof Uint8Array||e instanceof Uint8ClampedArray||e instanceof Int8Array))throw new Qr(\"Cannot pass non-string to std::string\");var o=t&&a?Dr(e):e.length,i=vn(4+o+1),u=i+4;if(s()[i>>>2>>>0]=o,t&&a)Br(e,u,o+1);else if(a)for(a=0;a>>0]=f}else for(a=0;a>>0]=e[a];return null!==r&&r.push(yn,i),i},argPackAdvance:ie,readValueFromPointer:be,Ab(r){yn(r)}})}var Ae=\"undefined\"!=typeof TextDecoder?new TextDecoder(\"utf-16le\"):void 0,_e=(r,e)=>{for(var t=r>>1,i=t+e/2;!(t>=i)&&o()[t>>>0];)++t;if(32<(t<<=1)-r&&Ae)return Ae.decode(n().slice(r,t));for(t=\"\",i=0;!(i>=e/2);++i){var s=a()[r+2*i>>>1>>>0];if(0==s)break;t+=String.fromCharCode(s)}return t},Ce=(r,e,t)=>{if(t??=2147483647,2>t)return 0;var n=e;t=(t-=2)<2*r.length?t/2:r.length;for(var o=0;o>>1>>>0]=i,e+=2}return a()[e>>>1>>>0]=0,e-n},Oe=r=>2*r.length,Te=(r,e)=>{for(var t=0,n=\"\";!(t>=e/4);){var a=i()[r+4*t>>>2>>>0];if(0==a)break;++t,65536<=a?(a-=65536,n+=String.fromCharCode(55296|a>>10,56320|1023&a)):n+=String.fromCharCode(a)}return n},Se=(r,e,t)=>{if(e>>>=0,t??=2147483647,4>t)return 0;var n=e;t=n+t-4;for(var a=0;a=o&&(o=65536+((1023&o)<<10)|1023&r.charCodeAt(++a)),i()[e>>>2>>>0]=o,(e+=4)+4>t)break}return i()[e>>>2>>>0]=0,e-n},We=r=>{for(var e=0,t=0;t=n&&++t,e+=4}return e};function Ee(r,e,t){if(r>>>=0,e>>>=0,t=Kr(t>>>=0),2===e)var n=_e,a=Ce,i=Oe,u=r=>o()[r>>>1>>>0];else 4===e&&(n=Te,a=Se,i=We,u=r=>s()[r>>>2>>>0]);ne(r,{name:t,fromWireType:r=>{for(var t,a=s()[r>>>2>>>0],o=r+4,i=0;i<=a;++i){var f=r+4+i*e;i!=a&&0!=u(f)||(o=n(o,f-o),void 0===t?t=o:(t+=String.fromCharCode(0),t+=o),o=f+e)}return yn(r),t},toWireType:(r,n)=>{if(\"string\"!=typeof n)throw new Qr(`Cannot pass non-string to C++ string type ${t}`);var o=i(n),u=vn(4+o+e);return s()[u>>>2>>>0]=o/e,a(n,u+4,o+e),null!==r&&r.push(yn,u),u},argPackAdvance:ie,readValueFromPointer:be,Ab(r){yn(r)}})}function xe(r,e){ne(r>>>=0,{Pb:!0,name:e=Kr(e>>>0),argPackAdvance:0,fromWireType:()=>{},toWireType:()=>{}})}var Me=()=>1;function ke(r){wn(r>>>0,!m,1,!g,131072,!1),Ar()}var Ne=r=>{if(!z)try{if(r(),!(0>>=0,\"function\"==typeof Atomics.fc&&(Atomics.fc(i(),r>>>2,r).value.then(Re),r+=128,Atomics.store(i(),r>>>2,1))}var Re=()=>{var r=hn();r&&(He(r),Ne(Tn))};function Pe(r,e){(r>>>=0)==e>>>0?setTimeout(Re):p?postMessage({targetThread:r,cmd:\"checkMailbox\"}):(r=yr[r])&&r.postMessage({cmd:\"checkMailbox\"})}var De=[];function Fe(r,e,t,n,a){for(e>>>=0,n/=2,De.length=n,t=a>>>0>>>3,a=0;a>>0];return(e?ir[e]:dn[r])(...De)}function Be(r){r>>>=0,p?postMessage({cmd:\"cleanupThread\",thread:r}):wr(yr[r])}function Ie(r){}var Ue=(r,e)=>{var t=ee[r];if(void 0===t)throw r=gn(r),t=Kr(r),yn(r),new Qr(`${e} has unknown type ${t}`);return t},je=(r,e,t)=>{var n=[];return r=r.toWireType(n,t),n.length&&(s()[e>>>2>>>0]=de(n)),r};function $e(r,e,t){return e>>>=0,t>>>=0,r=ce(r>>>0),e=Ue(e,\"emval::as\"),je(e,t,r)}var Ge=r=>{try{r()}catch(r){K(r)}},ze=0,Ye=null,Le=0,Ve=[],qe={},Je={},Xe=0,Qe=null,Ze=[];function Ke(r){return function(r){if(!z){if(0===ze){var e=!1,t=!1;r(((r=0)=>{if(!z&&(Le=r,e=!0,t)){ze=2,Ge((()=>Hn(Ye))),\"undefined\"!=typeof Browser&&Browser.Gb.Nb&&Browser.Gb.resume(),r=!1;try{var n=function(){var r=i()[Ye+8>>>2>>>0];return r=bn[Je[r]],--cr,r()}()}catch(e){n=e,r=!0}var a=!1;if(!Ye){var o=Qe;o&&(Qe=null,(r?o.reject:o.resolve)(n),a=!0)}if(r&&!a)throw n}})),t=!0,e||(ze=1,Ye=function(){var r=vn(65548),e=r+12;s()[r>>>2>>>0]=e,s()[r+4>>>2>>>0]=e+65536,e=Ve[0];var t=qe[e];return void 0===t&&(t=Xe++,qe[e]=t,Je[t]=e),e=t,i()[r+8>>>2>>>0]=e,r}(),\"undefined\"!=typeof Browser&&Browser.Gb.Nb&&Browser.Gb.pause(),Ge((()=>kn(Ye))))}else 2===ze?(ze=0,Ge(Rn),yn(Ye),Ye=null,Ze.forEach(Ne)):K(`invalid state: ${ze}`);return Le}}((e=>{r().then(e)}))}function rt(r){return r>>>=0,Ke((()=>(r=ce(r)).then(de)))}var et=[];function tt(r,e,t,n){return t>>>=0,n>>>=0,(r=et[r>>>0])(null,e=ce(e>>>0),t,n)}var nt={},at=r=>{var e=nt[r];return void 0===e?Kr(r):e};function ot(r,e,t,n,a){return t>>>=0,n>>>=0,a>>>=0,(r=et[r>>>0])(e=ce(e>>>0),e[t=at(t)],n,a)}var it=()=>\"object\"==typeof globalThis?globalThis:Function(\"return this\")();function st(r){return 0==(r>>>=0)?de(it()):(r=at(r),de(it()[r]))}var ut=r=>{var e=et.length;return et.push(r),e},ft=(r,e)=>{for(var t=Array(r),n=0;n>>2>>>0],\"parameter \"+n);return t},lt=(r,e)=>Object.defineProperty(e,\"name\",{value:r});function ct(r,e,t){var n=(e=ft(r,e>>>0)).shift();r--;var a=\"return function (obj, func, destructorsRef, args) {\\n\",o=0,i=[];0===t&&i.push(\"obj\");for(var s=[\"retType\"],u=[n],f=0;fr.name)).join(\", \")}) => ${n.name}>`,ut(lt(t,r))}function dt(r){return r=at(r>>>0),de(d[r])}function bt(r,e){return e>>>=0,r=ce(r>>>0),e=ce(e),de(r[e])}function gt(r){9<(r>>>=0)&&(fe[r+1]+=1)}function mt(){return de([])}function pt(r){r=ce(r>>>0);for(var e=Array(r.length),t=0;t>>0))}function vt(){return de({})}function yt(r){for(var e=ce(r>>>=0);e.length;){var t=e.pop();e.pop()(t)}le(r)}function wt(r,e,t){e>>>=0,t>>>=0,r=ce(r>>>0),e=ce(e),t=ce(t),r[e]=t}function At(r,e){return e>>>=0,r=(r=Ue(r>>>0,\"_emval_take_value\")).readValueFromPointer(e),de(r)}function _t(r,e){r=-9007199254740992>r||9007199254740992>>=0,r=new Date(1e3*r),i()[e>>>2>>>0]=r.getUTCSeconds(),i()[e+4>>>2>>>0]=r.getUTCMinutes(),i()[e+8>>>2>>>0]=r.getUTCHours(),i()[e+12>>>2>>>0]=r.getUTCDate(),i()[e+16>>>2>>>0]=r.getUTCMonth(),i()[e+20>>>2>>>0]=r.getUTCFullYear()-1900,i()[e+24>>>2>>>0]=r.getUTCDay(),r=(r.getTime()-Date.UTC(r.getUTCFullYear(),0,1,0,0,0,0))/864e5|0,i()[e+28>>>2>>>0]=r}var Ct=r=>0==r%4&&(0!=r%100||0==r%400),Ot=[0,31,60,91,121,152,182,213,244,274,305,335],Tt=[0,31,59,90,120,151,181,212,243,273,304,334];function St(r,e){r=-9007199254740992>r||9007199254740992>>=0,r=new Date(1e3*r),i()[e>>>2>>>0]=r.getSeconds(),i()[e+4>>>2>>>0]=r.getMinutes(),i()[e+8>>>2>>>0]=r.getHours(),i()[e+12>>>2>>>0]=r.getDate(),i()[e+16>>>2>>>0]=r.getMonth(),i()[e+20>>>2>>>0]=r.getFullYear()-1900,i()[e+24>>>2>>>0]=r.getDay();var t=(Ct(r.getFullYear())?Ot:Tt)[r.getMonth()]+r.getDate()-1|0;i()[e+28>>>2>>>0]=t,i()[e+36>>>2>>>0]=-60*r.getTimezoneOffset(),t=new Date(r.getFullYear(),6,1).getTimezoneOffset();var n=new Date(r.getFullYear(),0,1).getTimezoneOffset();r=0|(t!=n&&r.getTimezoneOffset()==Math.min(n,t)),i()[e+32>>>2>>>0]=r}function Wt(r){r>>>=0;var e=new Date(i()[r+20>>>2>>>0]+1900,i()[r+16>>>2>>>0],i()[r+12>>>2>>>0],i()[r+8>>>2>>>0],i()[r+4>>>2>>>0],i()[r>>>2>>>0],0),t=i()[r+32>>>2>>>0],n=e.getTimezoneOffset(),a=new Date(e.getFullYear(),6,1).getTimezoneOffset(),o=new Date(e.getFullYear(),0,1).getTimezoneOffset(),s=Math.min(o,a);return 0>t?i()[r+32>>>2>>>0]=Number(a!=o&&s==n):0>>2>>>0]=e.getDay(),t=(Ct(e.getFullYear())?Ot:Tt)[e.getMonth()]+e.getDate()-1|0,i()[r+28>>>2>>>0]=t,i()[r>>>2>>>0]=e.getSeconds(),i()[r+4>>>2>>>0]=e.getMinutes(),i()[r+8>>>2>>>0]=e.getHours(),i()[r+12>>>2>>>0]=e.getDate(),i()[r+16>>>2>>>0]=e.getMonth(),i()[r+20>>>2>>>0]=e.getYear(),r=e.getTime(),BigInt(isNaN(r)?-1:r/1e3)}function Et(r,e,t,n,a,o,i){return p?dr(16,1,r,e,t,n,a,o,i):-52}function xt(r,e,t,n,a,o){if(p)return dr(17,1,r,e,t,n,a,o)}function Mt(r,e,t,n){r>>>=0,e>>>=0,t>>>=0,n>>>=0;var a=(new Date).getFullYear(),o=new Date(a,0,1),u=new Date(a,6,1);a=o.getTimezoneOffset();var f=u.getTimezoneOffset(),l=Math.max(a,f);s()[r>>>2>>>0]=60*l,i()[e>>>2>>>0]=Number(a!=f),o=(r=r=>r.toLocaleTimeString(void 0,{hour12:!1,timeZoneName:\"short\"}).split(\" \")[1])(o),u=r(u),f{kt.length=0;for(var t;t=n()[r++>>>0];){var a=105!=t;e+=(a&=112!=t)&&e%8?4:0,kt.push(112==t?s()[e>>>2>>>0]:106==t?j[e>>>3]:105==t?i()[e>>>2>>>0]:f()[e>>>3>>>0]),e+=a?8:4}return kt};function Ht(r,e,t){return r>>>=0,e=Nt(e>>>0,t>>>0),ir[r](...e)}function Rt(r,e,t){return r>>>=0,e=Nt(e>>>0,t>>>0),ir[r](...e)}var Pt=()=>{},Dt=()=>Date.now();function Ft(r,e){return E(Hr(r>>>0,e>>>0))}var Bt,It=()=>{throw cr+=1,\"unwind\"};function Ut(){return 4294901760}Bt=()=>performance.timeOrigin+performance.now();var jt=()=>navigator.hardwareConcurrency;function $t(r){r>>>=0;var e=n().length;if(r<=e||4294901760=t;t*=2){var a=e*(1+.2/t);a=Math.min(a,r+100663296);var o=Math;a=Math.max(r,a);r:{o=(o.min.call(o,4294901760,a+(65536-a%65536)%65536)-k.buffer.byteLength+65535)/65536;try{k.grow(o),Y();var i=1;break r}catch(r){}i=void 0}if(i)return!0}return!1}var Gt=()=>(K(\"Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER\"),0),zt={},Yt=r=>{r.forEach((r=>{var e=Gt();e&&(zt[e]=r)}))};function Lt(){var r=Error().stack.toString().split(\"\\n\");return\"Error\"==r[0]&&r.shift(),Yt(r),zt.Lb=Gt(),zt.Yb=r,zt.Lb}function Vt(r,e,t){if(r>>>=0,e>>>=0,zt.Lb==r)var n=zt.Yb;else\"Error\"==(n=Error().stack.toString().split(\"\\n\"))[0]&&n.shift(),Yt(n);for(var a=3;n[a]&&Gt()!=r;)++a;for(r=0;r>>2>>>0]=Gt();return r}var qt,Jt={},Xt=()=>{if(!qt){var r,e={USER:\"web_user\",LOGNAME:\"web_user\",PATH:\"/\",PWD:\"/\",HOME:\"/home/web_user\",LANG:(\"object\"==typeof navigator&&navigator.languages&&navigator.languages[0]||\"C\").replace(\"-\",\"_\")+\".UTF-8\",_:_||\"./this.program\"};for(r in Jt)void 0===Jt[r]?delete e[r]:e[r]=Jt[r];var t=[];for(r in e)t.push(`${r}=${e[r]}`);qt=t}return qt};function Qt(r,e){if(p)return dr(18,1,r,e);r>>>=0,e>>>=0;var n=0;return Xt().forEach(((a,o)=>{var i=e+n;for(o=s()[r+4*o>>>2>>>0]=i,i=0;i>>0]=a.charCodeAt(i);t()[o>>>0]=0,n+=a.length+1})),0}function Zt(r,e){if(p)return dr(19,1,r,e);r>>>=0,e>>>=0;var t=Xt();s()[r>>>2>>>0]=t.length;var n=0;return t.forEach((r=>n+=r.length+1)),s()[e>>>2>>>0]=n,0}function Kt(r){return p?dr(20,1,r):52}function rn(r,e,t,n){return p?dr(21,1,r,e,t,n):52}function en(r,e,t,n){return p?dr(22,1,r,e,t,n):70}var tn=[null,[],[]];function nn(r,e,t,a){if(p)return dr(23,1,r,e,t,a);e>>>=0,t>>>=0,a>>>=0;for(var o=0,i=0;i>>2>>>0],f=s()[e+4>>>2>>>0];e+=8;for(var l=0;l>>0],d=tn[r];0===c||10===c?((1===r?W:E)(Nr(d,0)),d.length=0):d.push(c)}o+=f}return s()[a>>>2>>>0]=o,0}var an=[31,29,31,30,31,30,31,31,30,31,30,31],on=[31,28,31,30,31,30,31,31,30,31,30,31],sn=(r,e)=>{t().set(r,e>>>0)};function un(r,e,t,n){function a(r,e,t){for(r=\"number\"==typeof r?r.toString():r||\"\";r.lengthr?-1:0n-r.getDate())){r.setDate(r.getDate()+e);break}e-=n-r.getDate()+1,r.setDate(1),11>t?r.setMonth(t+1):(r.setMonth(0),r.setFullYear(r.getFullYear()+1))}return t=new Date(r.getFullYear()+1,0,4),e=f(new Date(r.getFullYear(),0,4)),t=f(t),0>=u(e,r)?0>=u(t,r)?r.getFullYear()+1:r.getFullYear():r.getFullYear()-1}r>>>=0,e>>>=0,t>>>=0,n>>>=0;var c=s()[n+40>>>2>>>0];for(var d in n={cc:i()[n>>>2>>>0],bc:i()[n+4>>>2>>>0],Db:i()[n+8>>>2>>>0],Hb:i()[n+12>>>2>>>0],Eb:i()[n+16>>>2>>>0],zb:i()[n+20>>>2>>>0],rb:i()[n+24>>>2>>>0],yb:i()[n+28>>>2>>>0],kc:i()[n+32>>>2>>>0],ac:i()[n+36>>>2>>>0],dc:c?Hr(c):\"\"},t=Hr(t),c={\"%c\":\"%a %b %d %H:%M:%S %Y\",\"%D\":\"%m/%d/%y\",\"%F\":\"%Y-%m-%d\",\"%h\":\"%b\",\"%r\":\"%I:%M:%S %p\",\"%R\":\"%H:%M\",\"%T\":\"%H:%M:%S\",\"%x\":\"%m/%d/%y\",\"%X\":\"%H:%M:%S\",\"%Ec\":\"%c\",\"%EC\":\"%C\",\"%Ex\":\"%m/%d/%y\",\"%EX\":\"%H:%M:%S\",\"%Ey\":\"%y\",\"%EY\":\"%Y\",\"%Od\":\"%d\",\"%Oe\":\"%e\",\"%OH\":\"%H\",\"%OI\":\"%I\",\"%Om\":\"%m\",\"%OM\":\"%M\",\"%OS\":\"%S\",\"%Ou\":\"%u\",\"%OU\":\"%U\",\"%OV\":\"%V\",\"%Ow\":\"%w\",\"%OW\":\"%W\",\"%Oy\":\"%y\"})t=t.replace(new RegExp(d,\"g\"),c[d]);var b=\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),g=\"January February March April May June July August September October November December\".split(\" \");for(d in c={\"%a\":r=>b[r.rb].substring(0,3),\"%A\":r=>b[r.rb],\"%b\":r=>g[r.Eb].substring(0,3),\"%B\":r=>g[r.Eb],\"%C\":r=>o((r.zb+1900)/100|0,2),\"%d\":r=>o(r.Hb,2),\"%e\":r=>a(r.Hb,2,\" \"),\"%g\":r=>l(r).toString().substring(2),\"%G\":l,\"%H\":r=>o(r.Db,2),\"%I\":r=>(0==(r=r.Db)?r=12:12{for(var e=0,t=0;t<=r.Eb-1;e+=(Ct(r.zb+1900)?an:on)[t++]);return o(r.Hb+e,3)},\"%m\":r=>o(r.Eb+1,2),\"%M\":r=>o(r.bc,2),\"%n\":()=>\"\\n\",\"%p\":r=>0<=r.Db&&12>r.Db?\"AM\":\"PM\",\"%S\":r=>o(r.cc,2),\"%t\":()=>\"\\t\",\"%u\":r=>r.rb||7,\"%U\":r=>o(Math.floor((r.yb+7-r.rb)/7),2),\"%V\":r=>{var e=Math.floor((r.yb+7-(r.rb+6)%7)/7);if(2>=(r.rb+371-r.yb-2)%7&&e++,e)53==e&&(4==(t=(r.rb+371-r.yb)%7)||3==t&&Ct(r.zb)||(e=1));else{e=52;var t=(r.rb+7-r.yb-1)%7;(4==t||5==t&&Ct(r.zb%400-1))&&e++}return o(e,2)},\"%w\":r=>r.rb,\"%W\":r=>o(Math.floor((r.yb+7-(r.rb+6)%7)/7),2),\"%y\":r=>(r.zb+1900).toString().substring(2),\"%Y\":r=>r.zb+1900,\"%z\":r=>{var e=0<=(r=r.ac);return r=Math.abs(r)/60,(e?\"+\":\"-\")+String(\"0000\"+(r/60*100+r%60)).slice(-4)},\"%Z\":r=>r.dc,\"%%\":()=>\"%\"},t=t.replace(/%%/g,\"\\0\\0\"),c)t.includes(d)&&(t=t.replace(new RegExp(d,\"g\"),c[d](n)));return d=function(r){var e=Array(Dr(r)+1);return Fr(r,e,0,e.length),e}(t=t.replace(/\\0\\0/g,\"%\")),d.length>e?0:(sn(d,r),d.length-1)}function fn(r,e,t,n){return un(r>>>0,e>>>0,t>>>0,n>>>0)}p||function(){for(var r=d.numThreads-1;r--;)Cr();L.unshift((()=>{J++,function(r){p?r():Promise.all(pr.map(_r)).then(r)}((()=>Z()))}))}();for(var ln=Array(256),cn=0;256>cn;++cn)ln[cn]=String.fromCharCode(cn);Xr=ln,Qr=d.BindingError=class extends Error{constructor(r){super(r),this.name=\"BindingError\"}},d.InternalError=class extends Error{constructor(r){super(r),this.name=\"InternalError\"}},fe.push(0,1,void 0,1,null,1,!0,1,!1,1),d.count_emval_handles=()=>fe.length/2-5-ue.length;var dn=[br,gr,xr,Rr,Pr,Ir,Ur,jr,$r,Gr,zr,Yr,Lr,Vr,qr,Jr,Et,xt,Qt,Zt,Kt,rn,en,nn],bn=function(){function r(r,e){return bn=r.exports,bn=function(){var r=bn,e={};for(let[t,n]of Object.entries(r))e[t]=\"function\"==typeof n?(...r)=>{Ve.push(t);try{return n(...r)}finally{z||(Ve.pop(),Ye&&1===ze&&0===Ve.length&&(ze=0,cr+=1,Ge(Nn),\"undefined\"!=typeof Fibers&&Fibers.lc()))}}:n;return e}(),bn=function(){var r=bn,e=r=>e=>r(e)>>>0,t=r=>()=>r()>>>0;return(r=Object.assign({},r)).za=e(r.za),r.cb=t(r.cb),r.db=e(r.db),r.emscripten_main_runtime_thread_id=t(r.emscripten_main_runtime_thread_id),r.pb=e(r.pb),r.qb=t(r.qb),r}(),vr.push(bn.fb),V.unshift(bn.ya),N=e,Z(),bn}var e=or();if(J++,d.instantiateWasm)try{return d.instantiateWasm(e,r)}catch(r){E(`Module.instantiateWasm callback failed with error: ${r}`),c(r)}return rr||=d.locateFile?er(\"ort-wasm-simd-threaded.jsep.wasm\")?\"ort-wasm-simd-threaded.jsep.wasm\":d.locateFile?d.locateFile(\"ort-wasm-simd-threaded.jsep.wasm\",O):O+\"ort-wasm-simd-threaded.jsep.wasm\":new URL(\"ort-wasm-simd-threaded.jsep.wasm\",import.meta.url).href,function(r,e){var t=rr;return\"function\"!=typeof WebAssembly.instantiateStreaming||er(t)||tr(t)||\"function\"!=typeof fetch?ar(t,r,e):fetch(t,{credentials:\"same-origin\"}).then((n=>WebAssembly.instantiateStreaming(n,r).then(e,(function(n){return E(`wasm streaming compile failed: ${n}`),E(\"falling back to ArrayBuffer instantiation\"),ar(t,r,e)}))))}(e,(function(e){r(e.instance,e.module)})).catch(c),{}}(),gn=r=>(gn=bn.za)(r),mn=()=>(mn=bn.Aa)();d._OrtInit=(r,e)=>(d._OrtInit=bn.Ba)(r,e),d._OrtGetLastError=(r,e)=>(d._OrtGetLastError=bn.Ca)(r,e),d._OrtCreateSessionOptions=(r,e,t,n,a,o,i,s,u,f)=>(d._OrtCreateSessionOptions=bn.Da)(r,e,t,n,a,o,i,s,u,f),d._OrtAppendExecutionProvider=(r,e)=>(d._OrtAppendExecutionProvider=bn.Ea)(r,e),d._OrtAddFreeDimensionOverride=(r,e,t)=>(d._OrtAddFreeDimensionOverride=bn.Fa)(r,e,t),d._OrtAddSessionConfigEntry=(r,e,t)=>(d._OrtAddSessionConfigEntry=bn.Ga)(r,e,t),d._OrtReleaseSessionOptions=r=>(d._OrtReleaseSessionOptions=bn.Ha)(r),d._OrtCreateSession=(r,e,t)=>(d._OrtCreateSession=bn.Ia)(r,e,t),d._OrtReleaseSession=r=>(d._OrtReleaseSession=bn.Ja)(r),d._OrtGetInputOutputCount=(r,e,t)=>(d._OrtGetInputOutputCount=bn.Ka)(r,e,t),d._OrtGetInputName=(r,e)=>(d._OrtGetInputName=bn.La)(r,e),d._OrtGetOutputName=(r,e)=>(d._OrtGetOutputName=bn.Ma)(r,e),d._OrtFree=r=>(d._OrtFree=bn.Na)(r),d._OrtCreateTensor=(r,e,t,n,a,o)=>(d._OrtCreateTensor=bn.Oa)(r,e,t,n,a,o),d._OrtGetTensorData=(r,e,t,n,a)=>(d._OrtGetTensorData=bn.Pa)(r,e,t,n,a),d._OrtReleaseTensor=r=>(d._OrtReleaseTensor=bn.Qa)(r),d._OrtCreateRunOptions=(r,e,t,n)=>(d._OrtCreateRunOptions=bn.Ra)(r,e,t,n),d._OrtAddRunConfigEntry=(r,e,t)=>(d._OrtAddRunConfigEntry=bn.Sa)(r,e,t),d._OrtReleaseRunOptions=r=>(d._OrtReleaseRunOptions=bn.Ta)(r),d._OrtCreateBinding=r=>(d._OrtCreateBinding=bn.Ua)(r),d._OrtBindInput=(r,e,t)=>(d._OrtBindInput=bn.Va)(r,e,t),d._OrtBindOutput=(r,e,t,n)=>(d._OrtBindOutput=bn.Wa)(r,e,t,n),d._OrtClearBoundOutputs=r=>(d._OrtClearBoundOutputs=bn.Xa)(r),d._OrtReleaseBinding=r=>(d._OrtReleaseBinding=bn.Ya)(r),d._OrtRunWithBinding=(r,e,t,n,a)=>(d._OrtRunWithBinding=bn.Za)(r,e,t,n,a),d._OrtRun=(r,e,t,n,a,o,i,s)=>(d._OrtRun=bn._a)(r,e,t,n,a,o,i,s),d._OrtEndProfiling=r=>(d._OrtEndProfiling=bn.$a)(r),d._JsepOutput=(r,e,t)=>(d._JsepOutput=bn.ab)(r,e,t),d._JsepGetNodeName=r=>(d._JsepGetNodeName=bn.bb)(r);var pn,hn=()=>(hn=bn.cb)(),vn=d._malloc=r=>(vn=d._malloc=bn.db)(r),yn=d._free=r=>(yn=d._free=bn.eb)(r),wn=(r,e,t,n,a,o)=>(wn=bn.hb)(r,e,t,n,a,o),An=()=>(An=bn.ib)(),_n=(r,e,t,n,a)=>(_n=bn.jb)(r,e,t,n,a),Cn=r=>(Cn=bn.kb)(r),On=r=>(On=bn.lb)(r),Tn=()=>(Tn=bn.mb)(),Sn=(r,e)=>(Sn=bn.nb)(r,e),Wn=r=>(Wn=bn.ob)(r),En=r=>(En=bn.pb)(r),xn=()=>(xn=bn.qb)(),Mn=d.dynCall_ii=(r,e)=>(Mn=d.dynCall_ii=bn.sb)(r,e),kn=r=>(kn=bn.tb)(r),Nn=()=>(Nn=bn.ub)(),Hn=r=>(Hn=bn.vb)(r),Rn=()=>(Rn=bn.wb)();function Pn(){if(!(0xn(),d.stackRestore=r=>Wn(r),d.stackAlloc=r=>En(r),d.UTF8ToString=Hr,d.stringToUTF8=Br,d.lengthBytesUTF8=Dr,Q=function r(){pn||Pn(),pn||(Q=r)},Pn(),b});export default e;\"em-pthread\"===globalThis.self?.name&&e();", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport type {OrtWasmModule} from './wasm-types';\nimport {isNode} from './wasm-utils-env';\n\n/**\n * The classic script source URL. This is not always available in non ESModule environments.\n *\n * In Node.js, this is undefined.\n */\nexport const scriptSrc =\n // if Nodejs, return undefined\n isNode ? undefined :\n // if It's ESM, use import.meta.url\n BUILD_DEFS.ESM_IMPORT_META_URL ??\n // use `document.currentScript.src` if available\n (typeof document !== 'undefined' ? (document.currentScript as HTMLScriptElement)?.src :\n // use `self.location.href` if available\n (typeof self !== 'undefined' ? self.location?.href : undefined));\n\n/**\n * The origin of the current location.\n *\n * In Node.js, this is undefined.\n */\nconst origin = isNode || typeof location === 'undefined' ? undefined : location.origin;\n\n/**\n * Check if the given filename with prefix is from the same origin.\n */\nconst isSameOrigin = (filename: string, prefixOverride?: string) => {\n try {\n const baseUrl = prefixOverride ?? scriptSrc;\n const url = baseUrl ? new URL(filename, baseUrl) : new URL(filename);\n return url.origin === origin;\n } catch {\n return false;\n }\n};\n\n/**\n * Normalize the inputs to an absolute URL with the given prefix override. If failed, return undefined.\n */\nconst normalizeUrl = (filename: string, prefixOverride?: string) => {\n const baseUrl = prefixOverride ?? scriptSrc;\n try {\n const url = baseUrl ? new URL(filename, baseUrl) : new URL(filename);\n return url.href;\n } catch {\n return undefined;\n }\n};\n\n/**\n * Create a fallback URL if an absolute URL cannot be created by the normalizeUrl function.\n */\nconst fallbackUrl = (filename: string, prefixOverride?: string) => `${prefixOverride ?? './'}${filename}`;\n\n/**\n * This helper function is used to preload a module from a URL.\n *\n * If the origin of the worker URL is different from the current origin, the worker cannot be loaded directly.\n * See discussions in https://github.com/webpack-contrib/worker-loader/issues/154\n *\n * In this case, we will fetch the worker URL and create a new Blob URL with the same origin as a workaround.\n *\n * @param absoluteUrl - The absolute URL to preload.\n *\n * @returns - A promise that resolves to a new Blob URL\n */\nconst preload = async(absoluteUrl: string): Promise => {\n const response = await fetch(absoluteUrl, {credentials: 'same-origin'});\n const blob = await response.blob();\n return URL.createObjectURL(blob);\n};\n\n/**\n * This helper function is used to dynamically import a module from a URL.\n *\n * The build script has special handling for this function to ensure that the URL is not bundled into the final output.\n *\n * @param url - The URL to import.\n *\n * @returns - A promise that resolves to the default export of the module.\n */\nconst dynamicImportDefault = async(url: string): Promise => (await import(/* webpackIgnore: true */ url)).default;\n\n/**\n * The proxy worker factory imported from the proxy worker module.\n *\n * This is only available when the WebAssembly proxy is not disabled.\n */\nconst createProxyWorker: ((urlOverride?: string) => Worker)|undefined =\n // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires\n BUILD_DEFS.DISABLE_WASM_PROXY ? undefined : require('./proxy-worker/main').default;\n\n/**\n * Import the proxy worker.\n *\n * This function will perform the following steps:\n * 1. If a preload is needed, it will preload the module and return the object URL.\n * 2. Use the proxy worker factory to create the proxy worker.\n *\n * @returns - A promise that resolves to a tuple of 2 elements:\n * - The object URL of the preloaded module, or undefined if no preload is needed.\n * - The proxy worker.\n */\nexport const importProxyWorker = async(): Promise<[undefined | string, Worker]> => {\n if (!scriptSrc) {\n throw new Error('Failed to load proxy worker: cannot determine the script source URL.');\n }\n\n // If the script source is from the same origin, we can use the embedded proxy module directly.\n if (isSameOrigin(scriptSrc)) {\n return [undefined, createProxyWorker!()];\n }\n\n // Otherwise, need to preload\n const url = await preload(scriptSrc);\n return [url, createProxyWorker!(url)];\n};\n\n/**\n * The embedded WebAssembly module.\n *\n * This is only available in ESM and when embedding is not disabled.\n */\nconst embeddedWasmModule: EmscriptenModuleFactory|undefined =\n BUILD_DEFS.IS_ESM && BUILD_DEFS.DISABLE_DYNAMIC_IMPORT ?\n // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires\n require(\n !BUILD_DEFS.DISABLE_TRAINING ? '../../dist/ort-training-wasm-simd-threaded.mjs' :\n !BUILD_DEFS.DISABLE_JSEP ? '../../dist/ort-wasm-simd-threaded.jsep.mjs' :\n '../../dist/ort-wasm-simd-threaded.mjs')\n .default :\n undefined;\n\n/**\n * Import the WebAssembly module.\n *\n * This function will perform the following steps:\n * 1. If BUILD_DEFS.DISABLE_DYNAMIC_IMPORT is true, use the embedded module.\n * 2. If a preload is needed, it will preload the module and return the object URL.\n * 3. Otherwise, it will perform a dynamic import of the module.\n *\n * @returns - A promise that resolves to a tuple of 2 elements:\n * - The object URL of the preloaded module, or undefined if no preload is needed.\n * - The default export of the module, which is a factory function to create the WebAssembly module.\n */\nexport const importWasmModule = async(\n urlOverride: string|undefined, prefixOverride: string|undefined,\n isMultiThreaded: boolean): Promise<[undefined | string, EmscriptenModuleFactory]> => {\n if (BUILD_DEFS.DISABLE_DYNAMIC_IMPORT) {\n return [undefined, embeddedWasmModule!];\n } else {\n const wasmModuleFilename = !BUILD_DEFS.DISABLE_TRAINING ? 'ort-training-wasm-simd-threaded.mjs' :\n !BUILD_DEFS.DISABLE_JSEP ? 'ort-wasm-simd-threaded.jsep.mjs' :\n 'ort-wasm-simd-threaded.mjs';\n const wasmModuleUrl = urlOverride ?? normalizeUrl(wasmModuleFilename, prefixOverride);\n // need to preload if all of the following conditions are met:\n // 1. not in Node.js.\n // - Node.js does not have the same origin policy for creating workers.\n // 2. multi-threaded is enabled.\n // - If multi-threaded is disabled, no worker will be created. So we don't need to preload the module.\n // 3. the absolute URL is available.\n // - If the absolute URL is failed to be created, the origin cannot be determined. In this case, we will not\n // preload the module.\n // 4. the worker URL is not from the same origin.\n // - If the worker URL is from the same origin, we can create the worker directly.\n const needPreload = !isNode && isMultiThreaded && wasmModuleUrl && !isSameOrigin(wasmModuleUrl, prefixOverride);\n const url = needPreload ? (await preload(wasmModuleUrl)) :\n (wasmModuleUrl ?? fallbackUrl(wasmModuleFilename, prefixOverride));\n return [needPreload ? url : undefined, await dynamicImportDefault>(url)];\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from 'onnxruntime-common';\n\nimport type {OrtWasmModule} from './wasm-types';\nimport {importWasmModule} from './wasm-utils-import';\n\nlet wasm: OrtWasmModule|undefined;\nlet initialized = false;\nlet initializing = false;\nlet aborted = false;\n\nconst isMultiThreadSupported = (): boolean => {\n // If 'SharedArrayBuffer' is not available, WebAssembly threads will not work.\n if (typeof SharedArrayBuffer === 'undefined') {\n return false;\n }\n\n try {\n // Test for transferability of SABs (for browsers. needed for Firefox)\n // https://groups.google.com/forum/#!msg/mozilla.dev.platform/IHkBZlHETpA/dwsMNchWEQAJ\n if (typeof MessageChannel !== 'undefined') {\n new MessageChannel().port1.postMessage(new SharedArrayBuffer(1));\n }\n\n // Test for WebAssembly threads capability (for both browsers and Node.js)\n // This typed array is a WebAssembly program containing threaded instructions.\n return WebAssembly.validate(new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 5,\n 4, 1, 3, 1, 1, 10, 11, 1, 9, 0, 65, 0, 254, 16, 2, 0, 26, 11\n ]));\n } catch (e) {\n return false;\n }\n};\n\nconst isSimdSupported = (): boolean => {\n try {\n // Test for WebAssembly SIMD capability (for both browsers and Node.js)\n // This typed array is a WebAssembly program containing SIMD instructions.\n\n // The binary data is generated from the following code by wat2wasm:\n //\n // (module\n // (type $t0 (func))\n // (func $f0 (type $t0)\n // (drop\n // (i32x4.dot_i16x8_s\n // (i8x16.splat\n // (i32.const 0))\n // (v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000)))))\n\n return WebAssembly.validate(new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 10, 30, 1, 28, 0, 65, 0,\n 253, 15, 253, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 186, 1, 26, 11\n ]));\n } catch (e) {\n return false;\n }\n};\n\nexport const initializeWebAssembly = async(flags: Env.WebAssemblyFlags): Promise => {\n if (initialized) {\n return Promise.resolve();\n }\n if (initializing) {\n throw new Error('multiple calls to \\'initializeWebAssembly()\\' detected.');\n }\n if (aborted) {\n throw new Error('previous call to \\'initializeWebAssembly()\\' failed.');\n }\n\n initializing = true;\n\n // wasm flags are already initialized\n const timeout = flags.initTimeout!;\n let numThreads = flags.numThreads!;\n\n // ensure SIMD is supported\n if (!isSimdSupported()) {\n throw new Error('WebAssembly SIMD is not supported in the current environment.');\n }\n\n // check if multi-threading is supported\n const multiThreadSupported = isMultiThreadSupported();\n if (numThreads > 1 && !multiThreadSupported) {\n if (typeof self !== 'undefined' && !self.crossOriginIsolated) {\n // eslint-disable-next-line no-console\n console.warn(\n 'env.wasm.numThreads is set to ' + numThreads +\n ', but this will not work unless you enable crossOriginIsolated mode. ' +\n 'See https://web.dev/cross-origin-isolation-guide/ for more info.');\n }\n\n // eslint-disable-next-line no-console\n console.warn(\n 'WebAssembly multi-threading is not supported in the current environment. ' +\n 'Falling back to single-threading.');\n\n // set flags.numThreads to 1 so that OrtInit() will not create a global thread pool.\n flags.numThreads = numThreads = 1;\n }\n\n const wasmPaths = flags.wasmPaths;\n const wasmPrefixOverride = typeof wasmPaths === 'string' ? wasmPaths : undefined;\n const mjsPathOverrideFlag = (wasmPaths as Env.WasmFilePaths)?.mjs;\n const mjsPathOverride = (mjsPathOverrideFlag as URL)?.href ?? mjsPathOverrideFlag;\n const wasmPathOverrideFlag = (wasmPaths as Env.WasmFilePaths)?.wasm;\n const wasmPathOverride = (wasmPathOverrideFlag as URL)?.href ?? wasmPathOverrideFlag;\n\n const [objectUrl, ortWasmFactory] = (await importWasmModule(mjsPathOverride, wasmPrefixOverride, numThreads > 1));\n\n let isTimeout = false;\n\n const tasks: Array> = [];\n\n // promise for timeout\n if (timeout > 0) {\n tasks.push(new Promise((resolve) => {\n setTimeout(() => {\n isTimeout = true;\n resolve();\n }, timeout);\n }));\n }\n\n // promise for module initialization\n tasks.push(new Promise((resolve, reject) => {\n const config: Partial = {\n /**\n * The number of threads. WebAssembly will create (Module.numThreads - 1) workers. If it is 1, no worker will be\n * created.\n */\n numThreads,\n };\n\n if (wasmPathOverride || wasmPrefixOverride) {\n /**\n * A callback function to locate the WebAssembly file. The function should return the full path of the file.\n *\n * Since Emscripten 3.1.58, this function is only called for the .wasm file.\n */\n config.locateFile = (fileName, scriptDirectory) =>\n wasmPathOverride ?? (wasmPrefixOverride ?? scriptDirectory) + fileName;\n }\n\n ortWasmFactory(config).then(\n // wasm module initialized successfully\n module => {\n initializing = false;\n initialized = true;\n wasm = module;\n resolve();\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n }\n },\n // wasm module failed to initialize\n (what) => {\n initializing = false;\n aborted = true;\n reject(what);\n });\n }));\n\n await Promise.race(tasks);\n\n if (isTimeout) {\n throw new Error(`WebAssembly backend initializing failed due to timeout: ${timeout}ms`);\n }\n};\n\nexport const getInstance = (): OrtWasmModule => {\n if (initialized && wasm) {\n return wasm;\n }\n\n throw new Error('WebAssembly is not initialized yet.');\n};\n\nexport const dispose = (): void => {\n if (initialized && !initializing && !aborted) {\n // TODO: currently \"PThread.terminateAllThreads()\" is not exposed in the wasm module.\n // And this function is not yet called by any code.\n // If it is needed in the future, we should expose it in the wasm module and uncomment the following line.\n\n // wasm?.PThread?.terminateAllThreads();\n wasm = undefined;\n\n initializing = false;\n initialized = false;\n aborted = true;\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {getInstance} from './wasm-factory';\n\nexport const allocWasmString = (data: string, allocs: number[]): number => {\n const wasm = getInstance();\n\n const dataLength = wasm.lengthBytesUTF8(data) + 1;\n const dataOffset = wasm._malloc(dataLength);\n wasm.stringToUTF8(data, dataOffset, dataLength);\n allocs.push(dataOffset);\n\n return dataOffset;\n};\n\ninterface ExtraOptionsHandler {\n (name: string, value: string): void;\n}\n\nexport const iterateExtraOptions =\n (options: Record, prefix: string, seen: WeakSet>,\n handler: ExtraOptionsHandler): void => {\n if (typeof options == 'object' && options !== null) {\n if (seen.has(options)) {\n throw new Error('Circular reference in options');\n } else {\n seen.add(options);\n }\n }\n\n Object.entries(options).forEach(([key, value]) => {\n const name = (prefix) ? prefix + key : key;\n if (typeof value === 'object') {\n iterateExtraOptions(value as Record, name + '.', seen, handler);\n } else if (typeof value === 'string' || typeof value === 'number') {\n handler(name, value.toString());\n } else if (typeof value === 'boolean') {\n handler(name, (value) ? '1' : '0');\n } else {\n throw new Error(`Can't handle extra config type: ${typeof value}`);\n }\n });\n };\n\n/**\n * check web assembly API's last error and throw error if any error occurred.\n * @param message a message used when an error occurred.\n */\nexport const checkLastError = (message: string): void => {\n const wasm = getInstance();\n\n const stack = wasm.stackSave();\n try {\n const paramsOffset = wasm.stackAlloc(8);\n wasm._OrtGetLastError(paramsOffset, paramsOffset + 4);\n const errorCode = wasm.HEAP32[paramsOffset / 4];\n const errorMessagePointer = wasm.HEAPU32[paramsOffset / 4 + 1];\n const errorMessage = errorMessagePointer ? wasm.UTF8ToString(errorMessagePointer) : '';\n throw new Error(`${message} ERROR_CODE: ${errorCode}, ERROR_MESSAGE: ${errorMessage}`);\n } finally {\n wasm.stackRestore(stack);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession} from 'onnxruntime-common';\n\nimport {getInstance} from './wasm-factory';\nimport {allocWasmString, checkLastError, iterateExtraOptions} from './wasm-utils';\n\nexport const setRunOptions = (options: InferenceSession.RunOptions): [number, number[]] => {\n const wasm = getInstance();\n let runOptionsHandle = 0;\n const allocs: number[] = [];\n\n const runOptions: InferenceSession.RunOptions = options || {};\n\n try {\n if (options?.logSeverityLevel === undefined) {\n runOptions.logSeverityLevel = 2; // Default to warning\n } else if (\n typeof options.logSeverityLevel !== 'number' || !Number.isInteger(options.logSeverityLevel) ||\n options.logSeverityLevel < 0 || options.logSeverityLevel > 4) {\n throw new Error(`log serverity level is not valid: ${options.logSeverityLevel}`);\n }\n\n if (options?.logVerbosityLevel === undefined) {\n runOptions.logVerbosityLevel = 0; // Default to 0\n } else if (typeof options.logVerbosityLevel !== 'number' || !Number.isInteger(options.logVerbosityLevel)) {\n throw new Error(`log verbosity level is not valid: ${options.logVerbosityLevel}`);\n }\n\n if (options?.terminate === undefined) {\n runOptions.terminate = false;\n }\n\n let tagDataOffset = 0;\n if (options?.tag !== undefined) {\n tagDataOffset = allocWasmString(options.tag, allocs);\n }\n\n runOptionsHandle = wasm._OrtCreateRunOptions(\n runOptions.logSeverityLevel!, runOptions.logVerbosityLevel!, !!runOptions.terminate!, tagDataOffset);\n if (runOptionsHandle === 0) {\n checkLastError('Can\\'t create run options.');\n }\n\n if (options?.extra !== undefined) {\n iterateExtraOptions(options.extra, '', new WeakSet>(), (key, value) => {\n const keyDataOffset = allocWasmString(key, allocs);\n const valueDataOffset = allocWasmString(value, allocs);\n\n if (wasm._OrtAddRunConfigEntry(runOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n checkLastError(`Can't set a run config entry: ${key} - ${value}.`);\n }\n });\n }\n\n return [runOptionsHandle, allocs];\n } catch (e) {\n if (runOptionsHandle !== 0) {\n wasm._OrtReleaseRunOptions(runOptionsHandle);\n }\n allocs.forEach(alloc => wasm._free(alloc));\n throw e;\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession} from 'onnxruntime-common';\n\nimport {getInstance} from './wasm-factory';\nimport {allocWasmString, checkLastError, iterateExtraOptions} from './wasm-utils';\n\nconst getGraphOptimzationLevel = (graphOptimizationLevel: string|unknown): number => {\n switch (graphOptimizationLevel) {\n case 'disabled':\n return 0;\n case 'basic':\n return 1;\n case 'extended':\n return 2;\n case 'all':\n return 99;\n default:\n throw new Error(`unsupported graph optimization level: ${graphOptimizationLevel}`);\n }\n};\n\nconst getExecutionMode = (executionMode: 'sequential'|'parallel'): number => {\n switch (executionMode) {\n case 'sequential':\n return 0;\n case 'parallel':\n return 1;\n default:\n throw new Error(`unsupported execution mode: ${executionMode}`);\n }\n};\n\nconst appendDefaultOptions = (options: InferenceSession.SessionOptions): void => {\n if (!options.extra) {\n options.extra = {};\n }\n if (!options.extra.session) {\n options.extra.session = {};\n }\n const session = options.extra.session as Record;\n if (!session.use_ort_model_bytes_directly) {\n // eslint-disable-next-line camelcase\n session.use_ort_model_bytes_directly = '1';\n }\n\n // if using JSEP with WebGPU, always disable memory pattern\n if (options.executionProviders &&\n options.executionProviders.some(ep => (typeof ep === 'string' ? ep : ep.name) === 'webgpu')) {\n options.enableMemPattern = false;\n }\n};\n\nconst setExecutionProviders =\n (sessionOptionsHandle: number, executionProviders: readonly InferenceSession.ExecutionProviderConfig[],\n allocs: number[]): void => {\n for (const ep of executionProviders) {\n let epName = typeof ep === 'string' ? ep : ep.name;\n\n // check EP name\n switch (epName) {\n case 'webnn':\n epName = 'WEBNN';\n if (typeof ep !== 'string') {\n const webnnOptions = ep as InferenceSession.WebNNExecutionProviderOption;\n // const context = (webnnOptions as InferenceSession.WebNNOptionsWithMLContext)?.context;\n const deviceType = (webnnOptions as InferenceSession.WebNNContextOptions)?.deviceType;\n if (deviceType) {\n const keyDataOffset = allocWasmString('deviceType', allocs);\n const valueDataOffset = allocWasmString(deviceType, allocs);\n if (getInstance()._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !==\n 0) {\n checkLastError(`Can't set a session config entry: 'deviceType' - ${deviceType}.`);\n }\n }\n }\n break;\n case 'webgpu':\n epName = 'JS';\n if (typeof ep !== 'string') {\n const webgpuOptions = ep as InferenceSession.WebGpuExecutionProviderOption;\n if (webgpuOptions?.preferredLayout) {\n if (webgpuOptions.preferredLayout !== 'NCHW' && webgpuOptions.preferredLayout !== 'NHWC') {\n throw new Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${webgpuOptions.preferredLayout}`);\n }\n const keyDataOffset = allocWasmString('preferredLayout', allocs);\n const valueDataOffset = allocWasmString(webgpuOptions.preferredLayout, allocs);\n if (getInstance()._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !==\n 0) {\n checkLastError(\n `Can't set a session config entry: 'preferredLayout' - ${webgpuOptions.preferredLayout}.`);\n }\n }\n }\n break;\n case 'wasm':\n case 'cpu':\n continue;\n default:\n throw new Error(`not supported execution provider: ${epName}`);\n }\n\n const epNameDataOffset = allocWasmString(epName, allocs);\n if (getInstance()._OrtAppendExecutionProvider(sessionOptionsHandle, epNameDataOffset) !== 0) {\n checkLastError(`Can't append execution provider: ${epName}.`);\n }\n }\n };\n\nexport const setSessionOptions = (options?: InferenceSession.SessionOptions): [number, number[]] => {\n const wasm = getInstance();\n let sessionOptionsHandle = 0;\n const allocs: number[] = [];\n\n const sessionOptions: InferenceSession.SessionOptions = options || {};\n appendDefaultOptions(sessionOptions);\n\n try {\n const graphOptimizationLevel = getGraphOptimzationLevel(sessionOptions.graphOptimizationLevel ?? 'all');\n const executionMode = getExecutionMode(sessionOptions.executionMode ?? 'sequential');\n const logIdDataOffset =\n typeof sessionOptions.logId === 'string' ? allocWasmString(sessionOptions.logId, allocs) : 0;\n\n const logSeverityLevel = sessionOptions.logSeverityLevel ?? 2; // Default to 2 - warning\n if (!Number.isInteger(logSeverityLevel) || logSeverityLevel < 0 || logSeverityLevel > 4) {\n throw new Error(`log serverity level is not valid: ${logSeverityLevel}`);\n }\n\n const logVerbosityLevel = sessionOptions.logVerbosityLevel ?? 0; // Default to 0 - verbose\n if (!Number.isInteger(logVerbosityLevel) || logVerbosityLevel < 0 || logVerbosityLevel > 4) {\n throw new Error(`log verbosity level is not valid: ${logVerbosityLevel}`);\n }\n\n const optimizedModelFilePathOffset = typeof sessionOptions.optimizedModelFilePath === 'string' ?\n allocWasmString(sessionOptions.optimizedModelFilePath, allocs) :\n 0;\n\n sessionOptionsHandle = wasm._OrtCreateSessionOptions(\n graphOptimizationLevel, !!sessionOptions.enableCpuMemArena, !!sessionOptions.enableMemPattern, executionMode,\n !!sessionOptions.enableProfiling, 0, logIdDataOffset, logSeverityLevel, logVerbosityLevel,\n optimizedModelFilePathOffset);\n if (sessionOptionsHandle === 0) {\n checkLastError('Can\\'t create session options.');\n }\n\n if (sessionOptions.executionProviders) {\n setExecutionProviders(sessionOptionsHandle, sessionOptions.executionProviders, allocs);\n }\n\n if (sessionOptions.enableGraphCapture !== undefined) {\n if (typeof sessionOptions.enableGraphCapture !== 'boolean') {\n throw new Error(`enableGraphCapture must be a boolean value: ${sessionOptions.enableGraphCapture}`);\n }\n const keyDataOffset = allocWasmString('enableGraphCapture', allocs);\n const valueDataOffset = allocWasmString(sessionOptions.enableGraphCapture.toString(), allocs);\n if (wasm._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n checkLastError(\n `Can't set a session config entry: 'enableGraphCapture' - ${sessionOptions.enableGraphCapture}.`);\n }\n }\n\n if (sessionOptions.freeDimensionOverrides) {\n for (const [name, value] of Object.entries(sessionOptions.freeDimensionOverrides)) {\n if (typeof name !== 'string') {\n throw new Error(`free dimension override name must be a string: ${name}`);\n }\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {\n throw new Error(`free dimension override value must be a non-negative integer: ${value}`);\n }\n const nameOffset = allocWasmString(name, allocs);\n if (wasm._OrtAddFreeDimensionOverride(sessionOptionsHandle, nameOffset, value) !== 0) {\n checkLastError(`Can't set a free dimension override: ${name} - ${value}.`);\n }\n }\n }\n\n if (sessionOptions.extra !== undefined) {\n iterateExtraOptions(sessionOptions.extra, '', new WeakSet>(), (key, value) => {\n const keyDataOffset = allocWasmString(key, allocs);\n const valueDataOffset = allocWasmString(value, allocs);\n\n if (wasm._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n checkLastError(`Can't set a session config entry: ${key} - ${value}.`);\n }\n });\n }\n\n return [sessionOptionsHandle, allocs];\n } catch (e) {\n if (sessionOptionsHandle !== 0) {\n wasm._OrtReleaseSessionOptions(sessionOptionsHandle);\n }\n allocs.forEach(alloc => wasm._free(alloc));\n throw e;\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from 'onnxruntime-common';\n\n// a dummy type declaration for Float16Array in case any polyfill is available.\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-explicit-any\n const Float16Array: any;\n}\n\n// This file includes common definitions. They do NOT have dependency on the WebAssembly instance.\n\n/**\n * Copied from ONNX definition. Use this to drop dependency 'onnx_proto' to decrease compiled .js file size.\n */\nexport const enum DataType {\n undefined = 0,\n float = 1,\n uint8 = 2,\n int8 = 3,\n uint16 = 4,\n int16 = 5,\n int32 = 6,\n int64 = 7,\n string = 8,\n bool = 9,\n float16 = 10,\n double = 11,\n uint32 = 12,\n uint64 = 13,\n complex64 = 14,\n complex128 = 15,\n bfloat16 = 16\n}\n\n/**\n * Map string tensor data to enum value\n */\nexport const tensorDataTypeStringToEnum = (type: string): DataType => {\n switch (type) {\n case 'int8':\n return DataType.int8;\n case 'uint8':\n return DataType.uint8;\n case 'bool':\n return DataType.bool;\n case 'int16':\n return DataType.int16;\n case 'uint16':\n return DataType.uint16;\n case 'int32':\n return DataType.int32;\n case 'uint32':\n return DataType.uint32;\n case 'float16':\n return DataType.float16;\n case 'float32':\n return DataType.float;\n case 'float64':\n return DataType.double;\n case 'string':\n return DataType.string;\n case 'int64':\n return DataType.int64;\n case 'uint64':\n return DataType.uint64;\n\n default:\n throw new Error(`unsupported data type: ${type}`);\n }\n};\n\n/**\n * Map enum value to string tensor data\n */\nexport const tensorDataTypeEnumToString = (typeProto: DataType): Tensor.Type => {\n switch (typeProto) {\n case DataType.int8:\n return 'int8';\n case DataType.uint8:\n return 'uint8';\n case DataType.bool:\n return 'bool';\n case DataType.int16:\n return 'int16';\n case DataType.uint16:\n return 'uint16';\n case DataType.int32:\n return 'int32';\n case DataType.uint32:\n return 'uint32';\n case DataType.float16:\n return 'float16';\n case DataType.float:\n return 'float32';\n case DataType.double:\n return 'float64';\n case DataType.string:\n return 'string';\n case DataType.int64:\n return 'int64';\n case DataType.uint64:\n return 'uint64';\n\n default:\n throw new Error(`unsupported data type: ${typeProto}`);\n }\n};\n\n/**\n * get tensor element size in bytes by the given data type\n * @returns size in integer or undefined if the data type is not supported\n */\nexport const getTensorElementSize = (dateType: number): number|\n undefined => [undefined, 4, 1, 1, 2, 2, 4, 8, undefined, 1, 2, 8, 4, 8, undefined, undefined, undefined][dateType];\n\n/**\n * get typed array constructor by the given tensor type\n */\nexport const tensorTypeToTypedArrayConstructor = (type: Tensor.Type): Float32ArrayConstructor|Uint8ArrayConstructor|\n Int8ArrayConstructor|Uint16ArrayConstructor|Int16ArrayConstructor|Int32ArrayConstructor|BigInt64ArrayConstructor|\n Uint8ArrayConstructor|Float64ArrayConstructor|Uint32ArrayConstructor|BigUint64ArrayConstructor => {\n switch (type) {\n case 'float16':\n // allow Float16Array polyfill.\n return typeof Float16Array !== 'undefined' && Float16Array.from ? Float16Array : Uint16Array;\n case 'float32':\n return Float32Array;\n case 'uint8':\n return Uint8Array;\n case 'int8':\n return Int8Array;\n case 'uint16':\n return Uint16Array;\n case 'int16':\n return Int16Array;\n case 'int32':\n return Int32Array;\n case 'bool':\n return Uint8Array;\n case 'float64':\n return Float64Array;\n case 'uint32':\n return Uint32Array;\n case 'int64':\n return BigInt64Array;\n case 'uint64':\n return BigUint64Array;\n default:\n throw new Error(`unsupported type: ${type}`);\n }\n };\n\n/**\n * Map string log level to integer value\n */\nexport const logLevelStringToEnum = (logLevel?: 'verbose'|'info'|'warning'|'error'|'fatal'): number => {\n switch (logLevel) {\n case 'verbose':\n return 0;\n case 'info':\n return 1;\n case 'warning':\n return 2;\n case 'error':\n return 3;\n case 'fatal':\n return 4;\n default:\n throw new Error(`unsupported logging level: ${logLevel}`);\n }\n};\n\n/**\n * Check whether the given tensor type is supported by GPU buffer\n */\nexport const isGpuBufferSupportedType = (type: Tensor.Type): type is Tensor.GpuBufferDataTypes => type === 'float32' ||\n type === 'float16' || type === 'int32' || type === 'int64' || type === 'uint32' || type === 'uint8' ||\n type === 'bool';\n\n/**\n * Map string data location to integer value\n */\nexport const dataLocationStringToEnum = (location: Tensor.DataLocation): number => {\n switch (location) {\n case 'none':\n return 0;\n case 'cpu':\n return 1;\n case 'cpu-pinned':\n return 2;\n case 'texture':\n return 3;\n case 'gpu-buffer':\n return 4;\n default:\n throw new Error(`unsupported data location: ${location}`);\n }\n};\n\n/**\n * Map integer data location to string value\n */\nexport const dataLocationEnumToString = (location: number): Tensor.DataLocation|undefined =>\n (['none', 'cpu', 'cpu-pinned', 'texture', 'gpu-buffer'] as const)[location];\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {isNode} from './wasm-utils-env';\n\n/**\n * Load a file into a Uint8Array.\n *\n * @param file - the file to load. Can be a URL/path, a Blob, an ArrayBuffer, or a Uint8Array.\n * @returns a Uint8Array containing the file data.\n */\nexport const loadFile = async(file: string|Blob|ArrayBufferLike|Uint8Array): Promise => {\n if (typeof file === 'string') {\n if (isNode) {\n // load file into ArrayBuffer in Node.js\n try {\n const {readFile} = require('node:fs/promises');\n return new Uint8Array(await readFile(file));\n } catch (e) {\n if (e.code === 'ERR_FS_FILE_TOO_LARGE') {\n // file is too large, use fs.createReadStream instead\n const {createReadStream} = require('node:fs');\n const stream = createReadStream(file);\n const chunks: Uint8Array[] = [];\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n return new Uint8Array(Buffer.concat(chunks));\n }\n throw e;\n }\n } else {\n // load file into ArrayBuffer in browsers\n const response = await fetch(file);\n if (!response.ok) {\n throw new Error(`failed to load external data file: ${file}`);\n }\n const contentLengthHeader = response.headers.get('Content-Length');\n const fileSize = contentLengthHeader ? parseInt(contentLengthHeader, 10) : 0;\n if (fileSize < 1073741824 /* 1GB */) {\n // when Content-Length header is not set, we cannot determine the file size. We assume it is small enough to\n // load into memory.\n return new Uint8Array(await response.arrayBuffer());\n } else {\n // file is too large, use stream instead\n if (!response.body) {\n throw new Error(`failed to load external data file: ${file}, no response body.`);\n }\n const reader = response.body.getReader();\n\n let buffer;\n try {\n // try to create ArrayBuffer directly\n buffer = new ArrayBuffer(fileSize);\n } catch (e) {\n if (e instanceof RangeError) {\n // use WebAssembly Memory to allocate larger ArrayBuffer\n const pages = Math.ceil(fileSize / 65536);\n buffer = new WebAssembly.Memory({initial: pages, maximum: pages}).buffer;\n } else {\n throw e;\n }\n }\n\n let offset = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n const chunkSize = value.byteLength;\n const chunk = new Uint8Array(buffer, offset, chunkSize);\n chunk.set(value);\n offset += chunkSize;\n }\n return new Uint8Array(buffer, 0, fileSize);\n }\n }\n\n } else if (file instanceof Blob) {\n return new Uint8Array(await file.arrayBuffer());\n } else if (file instanceof Uint8Array) {\n return file;\n } else {\n return new Uint8Array(file);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from 'onnxruntime-common';\n\nimport {logLevelStringToEnum} from '../wasm-common';\n\ntype LogLevel = NonNullable;\ntype MessageString = string;\ntype MessageFunction = () => string;\ntype Message = MessageString|MessageFunction;\n\nconst logLevelPrefix = ['V', 'I', 'W', 'E', 'F'];\n\nconst doLog = (level: number, message: string): void => {\n // eslint-disable-next-line no-console\n console.log(`[${logLevelPrefix[level]},${new Date().toISOString()}]${message}`);\n};\n\nlet configLogLevel: LogLevel|undefined;\nlet debug: boolean|undefined;\n\nexport const configureLogger = ($configLogLevel: LogLevel, $debug: boolean): void => {\n configLogLevel = $configLogLevel;\n debug = $debug;\n};\n\n/**\n * A simple logging utility to log messages to the console.\n */\nexport const LOG = (logLevel: LogLevel, msg: Message): void => {\n const messageLevel = logLevelStringToEnum(logLevel);\n const configLevel = logLevelStringToEnum(configLogLevel);\n if (messageLevel >= configLevel) {\n doLog(messageLevel, typeof msg === 'function' ? msg() : msg);\n }\n};\n\n/**\n * A simple logging utility to log messages to the console. Only logs when debug is enabled.\n */\nexport const LOG_DEBUG: typeof LOG = (...args: Parameters) => {\n if (debug) {\n LOG(...args);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from 'onnxruntime-common';\n\nimport {tensorTypeToTypedArrayConstructor} from '../wasm-common';\n\nexport const createView = (dataBuffer: ArrayBuffer, type: Tensor.Type): Int32Array|Uint32Array|BigInt64Array|\n BigUint64Array|Uint8Array|Float32Array|Float64Array|Int8Array|Int16Array|Uint16Array =>\n new (tensorTypeToTypedArrayConstructor(type))(dataBuffer);\n\n/**\n * a TensorView does not own the data.\n */\nexport interface TensorView {\n readonly data: number;\n readonly dataType: number;\n readonly dims: readonly number[];\n\n /**\n * get a Float32Array data view of the tensor data. tensor data must be on CPU.\n */\n getFloat32Array(): Float32Array;\n\n /**\n * get a BigInt64Array data view of the tensor data. tensor data must be on CPU.\n */\n getBigInt64Array(): BigInt64Array;\n\n /**\n * get a Int32Array data view of the tensor data. tensor data must be on CPU.\n */\n getInt32Array(): Int32Array;\n\n /**\n * create a new tensor view with the same data but different dimensions.\n */\n reshape(newDims: readonly number[]): TensorView;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../wasm-common';\nimport {TensorView} from '../tensor-view';\n\nimport {ShaderHelper} from './ops/common';\n\nexport type SessionState = 'default'|'capturing'|'replaying';\n\nexport enum GpuDataType {\n default = 0,\n upload = 1,\n profile = 2\n}\nexport type GpuDataId = number;\n\nexport type GpuArchitecture = 'ampere';\nexport type GpuVendor = 'amd'|'intel'|'nvidia';\nexport interface AdapterInfo {\n isArchitecture: (architecture: GpuArchitecture) => boolean;\n isVendor: (vendor: GpuVendor) => boolean;\n}\n\nexport interface GpuData {\n type: GpuDataType;\n id: GpuDataId;\n buffer: GPUBuffer;\n}\n\nexport interface TensorInfo {\n dims: readonly number[];\n dataType: number;\n}\n\nexport interface ProgramUniform {\n type: DataType;\n data: number|readonly number[];\n}\n\nexport type ProgramUniformVariableInfo = [type: DataType, length: number];\n\n/**\n * Represent the dependency of a program on a specific input tensor.\n *\n * - 'none': the shader/uniform does not depend on this input's info\n * - 'type': the shader/uniform depends on data type of this input\n * - 'rank': the shader/uniform depends on data type and the rank of this input\n * - 'dims': the shader/uniform depends on data type and the dims of this input\n * - 'data': the shader/uniform depends on data type, the dims and the data of this input\n */\nexport type ProgramInputTensorInfoDependency = 'none'|'type'|'rank'|'dims'|'data';\n\n/**\n * Represent information about a program's cache for shader.\n */\nexport interface ProgramShaderCacheInfo {\n /**\n * an optional string as a cache hint in the artifact cache. If this is not specified, the cache hint will be empty.\n *\n * This hint string should only contains initializing-time information, such as the attributes or any information of\n * initializers. It should NOT contain any runtime information, such as the shape of inputs.\n */\n hint?: string;\n\n /**\n * an optional list of dependencies of the program on the input tensors. If this is not specified, the program depends\n * on 'dims' of all inputs.\n */\n inputDependencies?: ProgramInputTensorInfoDependency[];\n}\n\n/**\n * Represent information about a program's cache for uniform.\n */\nexport interface ProgramUniformCacheInfo {\n /**\n * an optional string as a cache hint in the uniform cache. If this is not specified, the cache hint will be empty.\n *\n * This hint string should only contains runtime information, such as the shape of inputs.\n */\n hint?: string;\n\n /**\n * an optional list of dependencies of the program on the input tensors. If this is not specified, the program depends\n * on 'none' of all inputs.\n */\n inputDependencies?: ProgramInputTensorInfoDependency[];\n}\n\n\n/**\n * A set of data that represent a shader program\n */\nexport interface ProgramInfo {\n /**\n * the name of the program. used for debugging and profiling\n */\n name: string;\n\n /**\n * an optional object describing the cache information of the program shader.\n *\n * If this is not specified, assume hint is empty and inputDependencies are ['dims'] for all inputs.\n */\n shaderCache?: ProgramShaderCacheInfo;\n\n /**\n * the shader's processing source code.\n *\n * This function will be called when shader cache missed.\n */\n getShaderSource: (shaderHelper: ShaderHelper) => string;\n\n /**\n * A function to get run data required to run the program.\n *\n * This function will be called every time the program is executed. Should keep this function as simple as possible.\n */\n getRunData: (inputs: readonly TensorView[]) => {\n outputs: readonly TensorInfo[];\n dispatchGroup: {x: number; y?: number; z?: number};\n programUniforms?: readonly ProgramUniform[];\n };\n}\n\nexport interface Artifact {\n programInfo: ProgramInfo;\n computePipeline: GPUComputePipeline;\n uniformVariablesInfo: readonly ProgramUniformVariableInfo[]|undefined;\n}\n\nexport interface ComputeContextInputsOutputsMapping {\n /**\n * specify the mapping to the program's inputs. the value can be a number or a tensor view.\n * - if it's a number, it's the index of the kernel's input\n * - if it's a tensor view, it's an existing tensor view that will be used as the input\n *\n * if inputs is not specified, the mapping will be the kernel's inputs in order.\n */\n readonly inputs?: ReadonlyArray;\n /**\n * specify the mapping to the program's outputs. the value must be a number.\n * - if it's a non-negative number, it's the index of the kernel's output\n * - if it's -1, it's an output that will be created as a temporary value. this value will be released after\n * the kernel is executed.\n * - if it's -2, it's an output that will be created as a persistent value. this value will be released when the\n * kernel is released.\n *\n * if outputs is not specified, the mapping will be the kernel's outputs in order.\n */\n readonly outputs?: readonly number[];\n}\n\n/**\n * A ComputeContext instance carries the states that representing the current running of a kernel.\n */\nexport interface ComputeContext {\n /**\n * gpu adapter info\n */\n readonly adapterInfo: AdapterInfo;\n\n /**\n * stores the pointer to OpKernelContext\n */\n readonly opKernelContext: number;\n\n /**\n * a list of inputs, each input is an instance of TensorView\n */\n readonly inputs: readonly TensorView[];\n\n /**\n * a custom data object that can be used to store any data that is needed by the kernel\n */\n readonly kernelCustomData: {[key: string]: unknown};\n\n /**\n * a buffer that can be used to access custom data created each time the kernel is executed\n */\n readonly customDataBuffer: Uint8Array;\n\n /**\n * a number of outputs for the node\n */\n readonly outputCount: number;\n\n compute(program: ProgramInfo, inputsOutputsMapping?: ComputeContextInputsOutputsMapping): TensorView[];\n output(index: number, dims: readonly number[]): number;\n getMaxComputeWorkgroupSizes(): [number, number, number];\n getMaxComputeWorkgroupStoragesize(): number;\n}\n\nexport type TimestampQuery = 'none'|'inside-passes'|'at-passes';\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {WebGpuBackend} from '../backend-webgpu';\nimport {LOG_DEBUG} from '../log';\n\nimport {GpuData, GpuDataId, GpuDataType} from './types';\n\n/**\n * manages GpuDataId -> GpuBuffer\n */\nexport interface GpuDataManager {\n /**\n * copy data from CPU to GPU.\n */\n upload(id: GpuDataId, data: Uint8Array): void;\n /**\n * copy data from GPU to GPU.\n */\n memcpy(sourceId: GpuDataId, destinationId: GpuDataId): void;\n /**\n * create new data on GPU.\n */\n create(size: number, usage?: number): GpuData;\n /**\n * get GPU data by ID.\n */\n get(id: GpuDataId): GpuData|undefined;\n /**\n * release the data on GPU by ID.\n *\n * @return size of the data released\n */\n release(id: GpuDataId): number;\n /**\n * copy data from GPU to CPU.\n */\n download(id: GpuDataId, getTargetBuffer: () => Uint8Array): Promise;\n\n /**\n * refresh the buffers that marked for release.\n *\n * when release() is called, the buffer is not released immediately. this is because we need to wait for the commands\n * to be submitted to the GPU. this function is called after the commands are submitted so that the buffers can be\n * actually released.\n */\n refreshPendingBuffers(): void;\n\n /**\n * register an external buffer for IO Binding. If the buffer is already registered, return the existing GPU data ID.\n *\n * GPU data manager only manages a mapping between the buffer and the GPU data ID. It will not manage the lifecycle of\n * the external buffer.\n */\n registerExternalBuffer(buffer: GPUBuffer, originalSize: number, previousBuffer?: GPUBuffer): number;\n\n /**\n * unregister an external buffer for IO Binding.\n */\n unregisterExternalBuffer(buffer: GPUBuffer): void;\n\n /**\n * destroy all gpu buffers.\n */\n dispose(): void;\n\n /**\n * release session related data.\n * @param sessionId - specify the session ID.\n */\n onReleaseSession(sessionId: number): void;\n}\n\ninterface StorageCacheValue {\n gpuData: GpuData;\n originalSize: number;\n}\n\nconst bucketFreelist: Map = new Map([\n [64, 250],\n [128, 200],\n [256, 200],\n [512, 200],\n [2048, 230],\n [4096, 200],\n [8192, 50],\n [16384, 50],\n [32768, 50],\n [65536, 50],\n [131072, 50],\n [262144, 50],\n [524288, 50],\n [1048576, 50],\n [2097152, 30],\n [4194304, 20],\n [8388608, 10],\n [12582912, 10],\n [16777216, 10],\n [26214400, 15],\n [33554432, 22],\n [44236800, 2],\n [58982400, 6],\n // we don't want to cache the bucket sizes below but not caching them\n // results in some major performance hits for models like sd-turbo.\n [67108864, 6],\n [134217728, 6],\n [167772160, 6],\n]);\n\nconst bucketArr: number[] = [];\n\n/**\n * normalize the buffer size so that it fits the 128-bits (16 bytes) alignment.\n */\nconst calcNormalizedBufferSize = (size: number) => Math.ceil(size / 16) * 16;\n\n/**\n * calculate the buffer size so that it fits into buckets.\n */\nconst calcBucketBufferSize = (size: number) => {\n for (let idx = 0; idx < bucketArr.length; idx++) {\n const sizeForBucket = bucketArr[idx];\n if (size <= sizeForBucket) {\n return sizeForBucket;\n }\n }\n // not in bucket list -> caller will not cache, round up to 16.\n return Math.ceil(size / 16) * 16;\n};\n\nlet guid = 1;\nconst createNewGpuDataId = () => guid++;\n\n/**\n * exported standard download function. This function is used by the session to download the data from GPU, and also by\n * factory to create GPU tensors with the capacity of downloading data from GPU.\n *\n * @param backend - the WebGPU backend\n * @param gpuBuffer - the GPU buffer to download\n * @param originalSize - the original size of the data\n * @param getTargetBuffer - optional. If provided, the data will be copied to the target buffer. Otherwise, a new buffer\n * will be created and returned.\n */\nexport const downloadGpuData =\n async(backend: WebGpuBackend, gpuBuffer: GPUBuffer, originalSize: number, getTargetBuffer?: () => Uint8Array):\n Promise => {\n const bufferSize = calcNormalizedBufferSize(originalSize);\n const gpuReadBuffer = backend.device.createBuffer(\n // eslint-disable-next-line no-bitwise\n {size: bufferSize, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});\n try {\n const commandEncoder = backend.getCommandEncoder();\n backend.endComputePass();\n commandEncoder.copyBufferToBuffer(\n gpuBuffer /* source buffer */, 0 /* source offset */, gpuReadBuffer /* destination buffer */,\n 0 /* destination offset */, bufferSize /* size */\n );\n backend.flush();\n\n await gpuReadBuffer.mapAsync(GPUMapMode.READ);\n\n const arrayBuffer = gpuReadBuffer.getMappedRange();\n if (getTargetBuffer) {\n // if we already have a CPU buffer to accept the data, no need to clone the ArrayBuffer.\n const targetBuffer = getTargetBuffer();\n targetBuffer.set(new Uint8Array(arrayBuffer, 0, originalSize));\n return targetBuffer;\n } else {\n // the mapped ArrayBuffer will be released when the GPU buffer is destroyed. Need to clone the\n // ArrayBuffer.\n return new Uint8Array(arrayBuffer.slice(0, originalSize));\n }\n } finally {\n gpuReadBuffer.destroy();\n }\n };\n\nclass GpuDataManagerImpl implements GpuDataManager {\n // GPU Data ID => GPU Data ( storage buffer )\n private storageCache: Map;\n\n // pending buffers for uploading ( data is unmapped )\n private buffersForUploadingPending: GPUBuffer[];\n // pending buffers for computing\n private buffersPending: GPUBuffer[];\n\n // The reusable storage buffers for computing.\n private freeBuffers: Map;\n // The reusable uniform buffers\n private freeUniformBuffers: Map;\n\n // The external buffers registered users for IO Binding.\n private externalBuffers: Map;\n\n // The pendingBuffers for capture graph.\n // a SessionID -> GPUBuffer[] mapping.\n private capturedPendingBuffers: Map;\n\n constructor(private backend: WebGpuBackend) {\n this.storageCache = new Map();\n this.freeBuffers = new Map();\n this.freeUniformBuffers = new Map();\n this.buffersForUploadingPending = [];\n this.buffersPending = [];\n this.externalBuffers = new Map();\n this.capturedPendingBuffers = new Map();\n\n for (const [key, ] of bucketFreelist) {\n bucketArr.push(key);\n this.freeBuffers.set(key, []);\n this.freeUniformBuffers.set(key, []);\n }\n }\n\n upload(id: GpuDataId, data: Uint8Array): void {\n const srcArrayBuffer = data.buffer;\n const srcOffset = data.byteOffset;\n const srcLength = data.byteLength;\n const size = calcNormalizedBufferSize(srcLength);\n\n // get destination gpu buffer\n const gpuDataCache = this.storageCache.get(id);\n if (!gpuDataCache) {\n throw new Error('gpu data for uploading does not exist');\n }\n if (gpuDataCache.originalSize !== srcLength) {\n throw new Error(`inconsistent data size. gpu data size=${gpuDataCache.originalSize}, data size=${srcLength}`);\n }\n\n // create gpu buffer\n const gpuBufferForUploading = this.backend.device.createBuffer(\n // eslint-disable-next-line no-bitwise\n {mappedAtCreation: true, size, usage: GPUBufferUsage.MAP_WRITE | GPUBufferUsage.COPY_SRC});\n\n // copy (upload) data\n const arrayBuffer = gpuBufferForUploading.getMappedRange();\n new Uint8Array(arrayBuffer).set(new Uint8Array(srcArrayBuffer, srcOffset, srcLength));\n gpuBufferForUploading.unmap();\n\n\n // GPU copy\n const commandEncoder = this.backend.getCommandEncoder();\n this.backend.endComputePass();\n commandEncoder.copyBufferToBuffer(gpuBufferForUploading, 0, gpuDataCache.gpuData.buffer, 0, size);\n\n LOG_DEBUG('verbose', () => `[WebGPU] GpuDataManager.upload(id=${id})`);\n\n this.buffersForUploadingPending.push(gpuBufferForUploading);\n }\n\n memcpy(sourceId: GpuDataId, destinationId: GpuDataId): void {\n // get source gpu buffer\n const sourceGpuDataCache = this.storageCache.get(sourceId);\n if (!sourceGpuDataCache) {\n throw new Error('source gpu data for memcpy does not exist');\n }\n // get destination gpu buffer\n const destinationGpuDataCache = this.storageCache.get(destinationId);\n if (!destinationGpuDataCache) {\n throw new Error('destination gpu data for memcpy does not exist');\n }\n if (sourceGpuDataCache.originalSize !== destinationGpuDataCache.originalSize) {\n throw new Error('inconsistent source and destination gpu data size');\n }\n\n const size = calcNormalizedBufferSize(sourceGpuDataCache.originalSize);\n\n // GPU copy\n const commandEncoder = this.backend.getCommandEncoder();\n this.backend.endComputePass();\n commandEncoder.copyBufferToBuffer(\n sourceGpuDataCache.gpuData.buffer, 0, destinationGpuDataCache.gpuData.buffer, 0, size);\n }\n\n registerExternalBuffer(buffer: GPUBuffer, originalSize: number, previousBuffer?: GPUBuffer): number {\n let id: number|undefined;\n if (previousBuffer) {\n id = this.externalBuffers.get(previousBuffer);\n if (id === undefined) {\n throw new Error('previous buffer is not registered');\n }\n if (buffer === previousBuffer) {\n LOG_DEBUG(\n 'verbose',\n () => `[WebGPU] GpuDataManager.registerExternalBuffer(size=${originalSize}) => id=${\n id}, buffer is the same, skip.`);\n return id;\n } else if (this.backend.capturedCommandList.has(this.backend.currentSessionId!)) {\n throw new Error(`Registering a different external buffer under graph capture mode is not supported yet.\n Please use the previous external buffer!`);\n }\n this.externalBuffers.delete(previousBuffer);\n } else {\n id = createNewGpuDataId();\n }\n\n this.storageCache.set(id, {gpuData: {id, type: GpuDataType.default, buffer}, originalSize});\n this.externalBuffers.set(buffer, id);\n LOG_DEBUG(\n 'verbose',\n () => `[WebGPU] GpuDataManager.registerExternalBuffer(size=${originalSize}) => id=${id}, registered.`);\n return id;\n }\n\n unregisterExternalBuffer(buffer: GPUBuffer): void {\n const id = this.externalBuffers.get(buffer);\n if (id !== undefined) {\n this.storageCache.delete(id);\n this.externalBuffers.delete(buffer);\n LOG_DEBUG('verbose', () => `[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${id}`);\n }\n }\n\n // eslint-disable-next-line no-bitwise\n create(size: number, usage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST): GpuData {\n const bufferSize = calcBucketBufferSize(size);\n\n let gpuBuffer;\n // Currently, only storage buffers are reused.\n // eslint-disable-next-line no-bitwise\n const isStorage = (usage & GPUBufferUsage.STORAGE) === GPUBufferUsage.STORAGE;\n // eslint-disable-next-line no-bitwise\n const isUniform = (usage & GPUBufferUsage.UNIFORM) === GPUBufferUsage.UNIFORM;\n if (isStorage || isUniform) {\n const freeBuffers = isStorage ? this.freeBuffers : this.freeUniformBuffers;\n const buffers = freeBuffers.get(bufferSize);\n if (!buffers) {\n // no such bucket/freelist - create gpu buffer\n gpuBuffer = this.backend.device.createBuffer({size: bufferSize, usage});\n } else {\n if (buffers.length > 0) {\n // in freelist, use it\n gpuBuffer = buffers.pop() as GPUBuffer;\n } else {\n // bucket empty, create gpu buffer\n gpuBuffer = this.backend.device.createBuffer({size: bufferSize, usage});\n }\n }\n } else {\n // create gpu buffer\n gpuBuffer = this.backend.device.createBuffer({size: bufferSize, usage});\n }\n\n const gpuData = {id: createNewGpuDataId(), type: GpuDataType.default, buffer: gpuBuffer};\n this.storageCache.set(gpuData.id, {gpuData, originalSize: size});\n\n LOG_DEBUG('verbose', () => `[WebGPU] GpuDataManager.create(size=${size}) => id=${gpuData.id}`);\n return gpuData;\n }\n\n get(id: GpuDataId): GpuData|undefined {\n return this.storageCache.get(id)?.gpuData;\n }\n\n release(id: GpuDataId): number {\n const cachedData = this.storageCache.get(id);\n if (!cachedData) {\n throw new Error('releasing data does not exist');\n }\n\n LOG_DEBUG('verbose', () => `[WebGPU] GpuDataManager.release(id=${id}), gpuDataId=${cachedData.gpuData.id}`);\n\n this.storageCache.delete(id);\n this.buffersPending.push(cachedData.gpuData.buffer);\n // cachedData.gpuData.buffer.destroy();\n\n return cachedData.originalSize;\n }\n\n async download(id: GpuDataId, getTargetBuffer: () => Uint8Array): Promise {\n const cachedData = this.storageCache.get(id);\n if (!cachedData) {\n throw new Error('data does not exist');\n }\n await downloadGpuData(this.backend, cachedData.gpuData.buffer, cachedData.originalSize, getTargetBuffer);\n }\n\n refreshPendingBuffers(): void {\n for (const buffer of this.buffersForUploadingPending) {\n // upload buffer is only useful in the session creation time. So we don't need to reuse them in session running.\n buffer.destroy();\n }\n this.buffersForUploadingPending = [];\n\n if (this.buffersPending.length === 0) {\n return;\n }\n\n if (this.backend.sessionStatus === 'default') {\n for (const buffer of this.buffersPending) {\n const maxInFreeList = bucketFreelist.get(buffer.size);\n\n // eslint-disable-next-line no-bitwise\n if ((buffer.usage & GPUBufferUsage.STORAGE) === GPUBufferUsage.STORAGE) {\n // Put the pending buffer to freeBuffers list instead of really destroying it for buffer reusing.\n const freelist = this.freeBuffers.get(buffer.size) || [];\n if (maxInFreeList === undefined || freelist.length >= maxInFreeList) {\n buffer.destroy();\n } else {\n freelist.push(buffer);\n }\n // eslint-disable-next-line no-bitwise\n } else if ((buffer.usage & GPUBufferUsage.UNIFORM) === GPUBufferUsage.UNIFORM) {\n // Put the pending buffer to freeUniformBuffers list instead of really destroying it for buffer reusing.\n const freelist = this.freeUniformBuffers.get(buffer.size) || [];\n if (maxInFreeList === undefined || freelist.length >= maxInFreeList) {\n buffer.destroy();\n } else {\n freelist.push(buffer);\n }\n } else {\n buffer.destroy();\n }\n }\n this.buffersPending = [];\n } else {\n // Don't release intermediate tensors in non-default mode.\n // TODO: reuse the storage buffers in non-default mode.\n let capturedBuffers = this.capturedPendingBuffers.get(this.backend.currentSessionId!);\n if (!capturedBuffers) {\n capturedBuffers = [];\n this.capturedPendingBuffers.set(this.backend.currentSessionId!, capturedBuffers);\n }\n for (const buffer of this.buffersPending) {\n capturedBuffers.push(buffer);\n }\n this.buffersPending = [];\n }\n }\n\n dispose() {\n this.freeBuffers.forEach((buffers) => {\n buffers.forEach(buffer => {\n buffer.destroy();\n });\n });\n this.freeUniformBuffers.forEach((buffers) => {\n buffers.forEach(buffer => {\n buffer.destroy();\n });\n });\n\n this.storageCache.forEach((storage) => {\n storage.gpuData.buffer.destroy();\n });\n\n this.capturedPendingBuffers.forEach((buffers) => {\n buffers.forEach(buffer => {\n buffer.destroy();\n });\n });\n this.storageCache = new Map();\n this.freeBuffers = new Map();\n this.freeUniformBuffers = new Map();\n this.capturedPendingBuffers = new Map();\n }\n\n onReleaseSession(sessionId: number) {\n // release the captured pending buffers.\n const pendingBuffers = this.capturedPendingBuffers.get(sessionId);\n if (pendingBuffers) {\n pendingBuffers.forEach(buffer => {\n buffer.destroy();\n });\n this.capturedPendingBuffers.delete(sessionId);\n }\n }\n}\n\nexport const createGpuDataManager = (...args: ConstructorParameters): GpuDataManager =>\n new GpuDataManagerImpl(...args);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nclass AttributeWithCacheKeyImpl {\n constructor(attribute: Record) {\n Object.assign(this, attribute);\n }\n\n private key: string;\n public get cacheKey(): string {\n if (!this.key) {\n this.key =\n Object.getOwnPropertyNames(this).sort().map(name => `${(this as Record)[name]}`).join(';');\n }\n return this.key;\n }\n}\n\nexport interface AttributeWithCacheKey {\n readonly cacheKey: string;\n}\n\n/**\n * create a new object from the given attribute, and add a cacheKey property to it\n */\nexport const createAttributeWithCacheKey = >(attribute: T): T&AttributeWithCacheKey =>\n new AttributeWithCacheKeyImpl(attribute) as unknown as T & AttributeWithCacheKey;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/* eslint-disable no-param-reassign */\n\nexport class MatMulUtil {\n /**\n * Calculate the expected shape when matrix multiplication\n * @param a The shape of tensor A. Should be a tuple of 2 positive integers\n * @param b The shape of tensor B. Should be a tuple of 2 positive integers\n * @returns The expected shape of the result, or undefined if N/A\n */\n static calcMatMulShape(a: [number, number], b: [number, number]): [number, number]|undefined {\n return (a[1] !== b[0]) ? undefined : [a[0], b[1]];\n }\n}\n\n\nexport class BroadcastUtil {\n /**\n * Calculate the expected shape when broadcasting 2 tensors\n * @param a The shape of tensor A. Should be an array of positive integers\n * @param b The shape of tensor B. Should be an array of positive integers\n * @param isMatMul Whether the operation is MatMul\n * @returns The expected shape of the result, or undefined if N/A\n */\n static calcShape(adims: readonly number[], bdims: readonly number[], isMatMul = false): readonly number[]|undefined {\n const arank = adims.length;\n const brank = bdims.length;\n if (arank === 0) {\n return bdims;\n }\n if (brank === 0) {\n return adims;\n }\n const crank = Math.max(adims.length, bdims.length);\n const cdims = new Array(crank);\n\n // calculate the last 2 dimension if it is MatMul\n if (isMatMul) {\n if (arank < 2 || brank < 2) {\n return undefined;\n }\n const cShapeMatMul =\n MatMulUtil.calcMatMulShape([adims[arank - 2], adims[arank - 1]], [bdims[brank - 2], bdims[brank - 1]]);\n if (cShapeMatMul === undefined) {\n return undefined;\n }\n [cdims[crank - 2], cdims[crank - 1]] = cShapeMatMul;\n }\n\n for (let i = isMatMul ? 3 : 1; i <= crank; i++) {\n const aLen = arank - i < 0 ? 1 : adims[arank - i];\n const bLen = brank - i < 0 ? 1 : bdims[brank - i];\n\n if (aLen !== bLen && aLen > 1 && bLen > 1) {\n return undefined;\n }\n const max = Math.max(aLen, bLen);\n if (aLen && bLen) {\n cdims[crank - i] = Math.max(aLen, bLen);\n } else {\n // when either aLen or bLen is 0, the other should be either 0 or 1, otherwise it is not broadcastable.\n if (max > 1) {\n return undefined;\n }\n cdims[crank - i] = 0;\n }\n }\n\n return cdims;\n }\n\n /**\n * Determine if a shape is unidirectional broadcastable to another shape\n * @param shape The input shape\n * @param finalShape The desired shape after broadcasting\n */\n static isValidBroadcast(shape: readonly number[], finalShape: readonly number[]): boolean {\n // align shape to the right\n const inputRank = shape.length;\n const finalRank = finalShape.length;\n if (inputRank > finalRank) {\n return false;\n }\n for (let i = 1; i <= inputRank; i++) {\n if (shape[inputRank - i] !== 1 && shape[inputRank - i] !== finalShape[finalRank - i]) {\n return false;\n }\n }\n return true;\n }\n}\n\n\nexport class ShapeUtil {\n /**\n * calculate the size (number of elements)\n */\n static size(dims: readonly number[]): number {\n return ShapeUtil.getSizeFromDimensionRange(dims, 0, dims.length);\n }\n\n /**\n * convert dims corresponding to type change to pack. ex. uint8 data to uint32\n */\n static convertShape(dims: readonly number[], size = 4): readonly number[] {\n const rank = dims.length;\n if (rank === 0) {\n return [];\n }\n const newDims = new Array(rank);\n let i = rank - 1;\n while (i >= 0) {\n if (dims[i] % size === 0) {\n newDims[i] = dims[i] / size;\n break;\n }\n if (size % dims[i] !== 0) {\n throw new Error('cannot convert shape');\n }\n newDims[i] = 1;\n size /= dims[i];\n i--;\n }\n for (i--; i >= 0; i--) {\n newDims[i] = dims[i];\n }\n return newDims;\n }\n\n /**\n * calculate the size (number of elements) from the given axis (inclusive)\n */\n static sizeFromDimension(dims: readonly number[], axis: number): number {\n if (axis < 0 || axis > dims.length) {\n throw new Error(`invalid dimension of ${axis} for sizeFromDimension as Tensor has ${dims.length} dimensions.`);\n }\n return ShapeUtil.getSizeFromDimensionRange(dims, axis, dims.length);\n }\n\n /**\n * calculate the size (number of elements) to the given axis (exclusive)\n */\n static sizeToDimension(dims: readonly number[], axis: number): number {\n if (axis < 0 || axis > dims.length) {\n throw new Error(`invalid dimension of ${axis} for sizeToDimension as Tensor has ${dims.length} dimensions.`);\n }\n return ShapeUtil.getSizeFromDimensionRange(dims, 0, axis);\n }\n\n /**\n * calculate the size (number of elements) from and to the given axis [start, end)\n */\n static getSizeFromDimensionRange(dims: readonly number[], start: number, end: number): number {\n let size = 1;\n for (let i = start; i < end; i++) {\n // safety check as this method is called by multiple other methods requiring size.\n // size cannot be negative.\n if (dims[i] < 0) {\n throw new Error(\n // eslint-disable-next-line max-len\n 'cannot get valid size from specified dimension range. Most likely the range contains negative values in them.');\n }\n size *= dims[i];\n }\n return size;\n }\n\n static computeStrides(dims: readonly number[]): readonly number[] {\n const rank = dims.length;\n if (rank === 0) {\n return [];\n } else if (rank === 1) {\n return [1];\n }\n const strides = new Array(rank);\n strides[rank - 1] = 1;\n strides[rank - 2] = dims[rank - 1];\n for (let i = rank - 3; i >= 0; --i) {\n strides[i] = strides[i + 1] * dims[i + 1];\n }\n return strides;\n }\n\n /**\n * normailze axis of range [-r, r) into [0, r).\n */\n static normalizeAxis(axis: number, tensorRank: number): number {\n if (axis < -tensorRank && axis >= tensorRank) {\n throw new Error('unsupported axis for this operation.');\n }\n return axis < 0 ? axis + tensorRank : axis;\n }\n\n static normalizeAxes(axes: readonly number[], tensorRank?: number): number[] {\n return axes.map(x => this.normalizeAxis(x, tensorRank ?? axes.length));\n }\n\n /**\n * Sorts a given array based on the indices in the Perm array\n * Used in Transpose\n * @param a Array to be sorted such as dims or strides\n * @param perm Perm given; if null a will be reversed\n */\n static sortBasedOnPerm(a: readonly number[], perm?: readonly number[]): readonly number[] {\n if (perm) {\n return perm.map((v) => a[v]);\n } else {\n return a.slice().reverse();\n }\n }\n\n /**\n * Pads a given shape according to the padding values\n * @param dims shape of the Tensor to be padded\n * @param pad pad values\n */\n static padShape(dims: readonly number[], pad: readonly number[]): readonly number[] {\n const rank = dims.length;\n return dims.map((v, i) => v + pad[i] + pad[i + rank]);\n }\n\n /**\n * Determines if the two shapes are identical\n * @param shape1\n * @param shape2\n */\n static areEqual(shape1: readonly number[], shape2: readonly number[]): boolean {\n if (shape1.length !== shape2.length) {\n return false;\n }\n return shape1.every((v, i) => v === shape2[i]);\n }\n}\n\nexport class PoolConvUtil {\n /**\n * Adjust the kernel, strides, pads to correct rank. Set to default value if not present\n * @param isGlobalOperator If true, perform global pooling.\n * @param inputDims The input tensor dimension.\n * @param kernelShape The size of the kernel along each axis.\n * @param strides Stride along each axis.\n * @param dilations Dilation along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n */\n static adjustPoolAttributes(\n isGlobalOperator: boolean, inputDims: readonly number[], kernelShape: number[], strides: number[],\n dilations: number[], pads: number[]): void {\n if (!isGlobalOperator && kernelShape.length !== inputDims.length - 2) {\n throw new Error('length of specified kernel shapes should be 2 less than length of input dimensions');\n }\n\n if (isGlobalOperator) {\n // adjust kernel shape to cover the input dims\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n if (dim >= kernelShape.length) {\n kernelShape.push(inputDims[dim + 2]);\n } else {\n kernelShape[dim] = inputDims[dim + 2];\n }\n }\n }\n\n // adjust strides length to match kernel shape length\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (dim < strides.length) {\n if (strides[dim] < 0) {\n throw new Error('strides should be greater than or equal to 1');\n }\n } else {\n strides.push(1);\n }\n }\n\n // adjust dilation value\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (dim < dilations.length) {\n if (dilations[dim] < 0) {\n throw new Error('dilations should be greater than or equal to 1');\n }\n } else {\n dilations.push(1);\n }\n }\n\n // adjust pads length to match 2 * kernel shape length\n for (let dim = 0; dim < kernelShape.length * 2; dim++) {\n if (dim < pads.length) {\n if (pads[dim] < 0) {\n throw new Error('pad should be greater than or equal to 1');\n }\n } else {\n pads.push(0);\n }\n }\n\n // sanity checks for values in kernel shapes and pads\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (kernelShape[dim] <= 0) {\n throw new Error('kernel shapes need to be greater than 0');\n }\n\n if (pads[dim] >= kernelShape[dim] || pads[dim + kernelShape.length] >= kernelShape[dim]) {\n throw new Error('pads should be smaller than kernel');\n }\n }\n }\n\n // adjust pad values based on 'autoPad' attribute\n static adjustPadsBasedOnAutoPad(\n inputDims: readonly number[], strides: readonly number[], dilations: readonly number[],\n kernelShape: readonly number[], pads: number[], isChannelLast: boolean, autoPad?: string): void {\n if (!autoPad) {\n return;\n }\n\n if (pads.length !== 2 * (inputDims.length - 2)) {\n throw new Error('length of pads should be twice the length of data dimensions');\n }\n\n if (strides.length !== (inputDims.length - 2)) {\n throw new Error('length of strides should be the length of data dimensions');\n }\n\n if (kernelShape.length !== (inputDims.length - 2)) {\n throw new Error('length of kernel shapes should be the length of data dimensions');\n }\n\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n PoolConvUtil.adjustPadAndReturnShape(\n inputDims[dim + (isChannelLast ? 1 : 2)], strides[dim], dilations[dim], kernelShape[dim], pads, dim,\n dim + inputDims.length - 2, autoPad);\n }\n }\n\n /**\n * Calculate the output shape for Pool ops based on input attributes. (Should be used only for Pool ops)\n * @param isGlobalOperator If true, perform global pooling.\n * @param inputDims The input tensor dimension. (inputs[0].dims)\n * @param strides Stride along each axis.\n * @param dilations Dilation along each axis.\n * @param kernelShape The size of the kernel along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n * @param autoPad DEPRECATED attribute supported for legacy models. Specifies how to implicitly calculate pads in each\n * dimension. Can take values NOTSET, SAME_UPPER, SAME_LOWER, or VALID.\n */\n static computePoolOutputShape(\n isGlobalOperator: boolean, inputDims: readonly number[], strides: number[], dilations: number[],\n kernelShape: number[], pads: number[], autoPad?: string): number[] {\n if (inputDims.length <= 0) {\n throw new Error('input shape must be of size greater than 0');\n }\n\n // Add batch size and number of channels of output\n const outputDims = [inputDims[0], inputDims[1]];\n\n PoolConvUtil.computeShapeHelper(\n isGlobalOperator, inputDims, outputDims, strides, dilations, kernelShape, pads, autoPad);\n return outputDims;\n }\n\n /**\n * Calculate the output shape for Conv op based on input attributes. (Should be used only for Conv op)\n * @param inputDims The input tensor dimension. (inputs[0].dims)\n * @param filterDims The filter tensor dimension. (inputs[1].dims)\n * @param strides Stride along each axis.\n * @param kernelShape The size of the kernel along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n * @param autoPad DEPRECATED attribute supported for legacy models. Specifies how to implicitly calculate pads in each\n * dimension. Can take values NOTSET, SAME_UPPER, SAME_LOWER, or VALID.\n */\n static computeConvOutputShape(\n inputDims: readonly number[], filterDims: readonly number[], strides: number[], dilations: number[],\n kernelShape: number[], pads: number[], autoPad?: string): number[] {\n if (inputDims.length <= 0 || filterDims.length <= 0) {\n throw new Error('invalid input tensor dims or invalid filter tensor dims');\n }\n\n // Add batch size and number of channels of output\n const outputDims = [inputDims[0], filterDims[0]];\n\n PoolConvUtil.computeShapeHelper(false, inputDims, outputDims, strides, dilations, kernelShape, pads, autoPad);\n return outputDims;\n }\n\n // will compute output shapes for data dimensions ONLY (i.e.) no batch size and channels\n // called by computePoolOutputShape() and computeConvOutputShape()\n // adjust pads based on 'autoPad' attribute prior to shape computation\n private static computeShapeHelper(\n isGlobalOperator: boolean, inputDims: readonly number[], outputDims: number[], strides: readonly number[],\n dilations: readonly number[], kernelShape: readonly number[], pads: number[], autoPad?: string) {\n if (isGlobalOperator) {\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n outputDims.push(1);\n }\n } else {\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n outputDims.push(PoolConvUtil.adjustPadAndReturnShape(\n inputDims[dim + 2], strides[dim], dilations[dim], kernelShape[dim], pads, dim, dim + inputDims.length - 2,\n autoPad));\n }\n }\n }\n\n // helper for computeShapeHelper() and adjustPadsBasedOnAutoPad()\n // adjusts pad value for given 'autoPad' string and computes output shape along a particular dimension\n private static adjustPadAndReturnShape(\n inSize: number, stride: number, dilation: number, kernel: number, pads: number[], padHeadIndex: number,\n padTailIndex: number, autoPad?: string): number {\n const dkernel = dilation * (kernel - 1) + 1;\n if (autoPad && autoPad !== 'NOTSET') {\n switch (autoPad) {\n case 'VALID':\n pads[padHeadIndex] = 0;\n pads[padTailIndex] = 0;\n return Math.floor(((inSize - dkernel) / stride) + 1);\n case 'SAME_LOWER':\n case 'SAME_UPPER':\n if (dilation !== 1) {\n throw new Error('Dilation not supported for SAME_UPPER or SAME_LOWER');\n } else {\n const legacyTargetSize = (inSize + stride - 1) / stride;\n const padNeeded = (legacyTargetSize - 1) * stride + kernel - inSize;\n pads[padHeadIndex] =\n (autoPad === 'SAME_LOWER') ? Math.floor((padNeeded + 1) / 2) : Math.floor(padNeeded / 2);\n pads[padTailIndex] = padNeeded - pads[padHeadIndex];\n return Math.floor(((inSize + padNeeded - kernel) / stride) + 1);\n }\n default:\n throw new Error('Unsupported AutoPad type');\n }\n } else {\n return Math.floor(((inSize + pads[padHeadIndex] + pads[padTailIndex] - dkernel) / stride) + 1);\n }\n }\n}\n\nexport class GemmUtil {\n // will make sure input shapes are compatible for this op\n // and return back the shape of the output in the form of a tuple\n // will throw exception if the input shapes are not compatible\n static getShapeOfGemmResult(\n leftShape: readonly number[], transLeft: boolean, rightShape: readonly number[], transRight: boolean,\n biasShape?: readonly number[]): readonly number[] {\n if (leftShape.length !== 2 || rightShape.length !== 2) {\n throw new Error('shape need to be of size 2');\n }\n\n let M: number;\n let K: number;\n let N: number;\n\n if (transLeft) {\n M = leftShape[1];\n K = leftShape[0];\n } else {\n M = leftShape[0];\n K = leftShape[1];\n }\n\n let kDim = -1;\n\n if (transRight) {\n N = rightShape[0];\n kDim = 1;\n } else {\n N = rightShape[1];\n kDim = 0;\n }\n\n if (rightShape[kDim] !== K) {\n throw new Error('dimension mismatch');\n }\n\n if (M <= 0 || N <= 0 || K <= 0) {\n throw new Error('invalid shape specified');\n }\n\n if (biasShape && !BroadcastUtil.isValidBroadcast(biasShape, [M, N])) {\n throw new Error('gemm: invalid bias shape for broadcast');\n }\n\n return [M, N, K];\n }\n}\n\n\nexport const MIN_CLIP = -3.4028234663852886e+38;\nexport const MAX_CLIP = 3.4028234663852886e+38;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {ShapeUtil} from '../../util';\nimport {ProgramUniform, ProgramUniformVariableInfo} from '../types';\n\n/**\n * constant value for a workgroup size.\n *\n * We definitely can do further optimization in future, but for now we use 64.\n *\n * rule of thumb: Use [a workgroup size of] 64 unless you know what GPU you are targeting or that your workload\n * needs something different.\n *\n * from: https://surma.dev/things/webgpu/\n **/\nexport const WORKGROUP_SIZE = 64;\n\ninterface IndicesHelperTypes {\n /**\n * WGSL type of indices expression\n */\n readonly indices: string;\n\n /**\n * WGSL type of a value\n */\n readonly value: string;\n\n /**\n * WGSL type of storage type representing a value\n *\n * This is usually the same to `value`, but for some type (eg. bool), we need to use `u32` as storage type for\n * value type `vec4`\n */\n readonly storage: string;\n\n /**\n * tensor type as represented in TensorView\n */\n readonly tensor: number;\n}\n\n/**\n * A helper class for generating WGSL code for manipulating indices and data for a shader's input or output.\n *\n * This class is designed to offer a unified way to generate WGSL code for manipulating indices and data for a shader's\n * input or output.\n *\n * The following is a list of terminologies used in this class:\n * - `offset`: a uint32 value representing the offset of an element in the data buffer.\n * - `indices`: an abstraction of a multi-dimensional array's indices representing the data's index on each dimension.\n * - `value`: a value of a data element.\n *\n * Users are expected to create an instance of this class for each shader's input or output, and use the instance to\n * generate WGSL code for manipulating indices and data. The following 2 exported functions are for users to call to\n * create an instance of an indices helper:\n * - `inputVariable()`: create an indices helper instance for an input.\n * - `outputVariable()`: create an indices helper instance for an output.\n * - `internalVariable()`: create an indices helper instance for an internal variable.\n *\n * An indices helper instance contains helper functions for the following operations:\n * - access readonly basic information, including: `name`(the name of the input or output), `usage`(whether it's an\n * input, an output or an internal variable) and `shape`(the passed in shape).\n * - `type`: access readonly type information, including: `indices`(the type of indices), `value`(the type of value at\n * runtime), `storage`(the type of value at storage) and `tensor`(the tensor type as represented in TensorView).\n * - generate WGSL code for getting indices from offset. Use `offsetToIndices()` for WGSL code snippet to calculate\n * indices from offset, and use `indicesToOffset()` for WGSL code snippet to calculate offset from indices.\n * - to manipulate an instance of indices, use `setIndices()` and `getIndices()` to set and get the indices on an\n * indices variable.\n * - to manipulate data, use `set()`/`get()` to access data at the given indices from parameter list, use\n * `setByIndices()`/`getByIndices()` to access data at the given indices from an indices variable, and use\n * `setByOffset()`/`getByOffset()` to access data at the given offset.\n * - `impl`: get WGSL code of function implementation for the util functions mentioned above.\n */\nexport interface IndicesHelper {\n /**\n * get WGSL code of function implementation for the util functions.\n *\n */\n readonly impl: () => string;\n\n /**\n * get type info\n */\n readonly type: IndicesHelperTypes;\n\n /**\n * WGSL code of a expression for getting indices from offset.\n *\n * @param varOffset - a u32 expression representing the offset.\n *\n * @returns an `type.indices` expression\n */\n readonly offsetToIndices: (varOffset: string) => string;\n\n /**\n * WGSL code of an `u32` expression for getting offset from indices.\n *\n * @param varIndices - a `type.indices` expression representing the indices.\n *\n * @returns an `u32` expression\n */\n readonly indicesToOffset: (varIndices: string) => string;\n\n /**\n * WGSL code of an `u32` expression for getting original offset from broadcasted indices.\n *\n * @param varIndices - a `type.indices` expression representing the output indices.\n * @param output - output IndicesHelper.\n *\n * @returns an `u32` expression\n */\n readonly broadcastedIndicesToOffset: (varIndices: string, output: IndicesHelper) => string;\n\n /**\n * WGSL code of generating an indices literal\n *\n * @param init - initial value.\n */\n readonly indices: (...init: ReadonlyArray) => string;\n\n /**\n * WGSL code of a statement for setting indices.\n *\n * @param varIndices - a variable name for the indices.\n * @param idx - the index of the indices to set. can be a number or a string (WGSL `u32` expression).\n * @param value - the value to set. can be a number or a string (WGSL `u32` expression).\n *\n * @returns a WGSL statement\n */\n readonly indicesSet: (varIndices: string, idx: number|string, value: number|string) => void;\n\n /**\n * WGSL code of an `u32` expression for getting indices.\n *\n * @param varIndices - a variable name for the indices.\n * @param idx - the index of the indices to get. can be a number or a string (WGSL `u32` expression).\n *\n * @returns an `u32` expression\n */\n readonly indicesGet: (varIndices: string, idx: number|string) => string;\n\n /**\n * WGSL code for a statement for setting data at the given indices.\n *\n * @param indicesAndValue - an array of numbers or strings (WGSL `u32` expression) representing the indices, followed\n * by the value to set. This array should have exactly `shape.length + 1` elements.\n */\n readonly set: (...indicesAndValue: ReadonlyArray) => string;\n\n /**\n * WGSL code for a statement for setting data at the given indices variable.\n *\n * @param varIndices - a variable name for the indices.\n * @param value - the value to set. should be a WGSL expression.\n */\n readonly setByIndices: (varIndices: string, value: string) => string;\n\n /**\n * WGSL code for a statement for setting data at the given offset.\n *\n * @param offset - a number or a string (WGSL `u32` expression) representing the offset.\n * @param value - the value to set. should be a WGSL expression.\n */\n readonly setByOffset: (offset: number|string, value: string) => string;\n\n /**\n * WGSL code for an expression for getting data at the given indices.\n *\n * @param indices - an array of numbers or strings (WGSL `u32` expression) representing the indices.\n */\n readonly get: (...indices: ReadonlyArray) => string;\n\n /**\n * WGSL code for an expression for getting data at the given indices variable.\n *\n * @param varIndices - a variable name for the indices.\n */\n readonly getByIndices: (varIndices: string) => string;\n\n /**\n * WGSL code for an expression for getting data at the given offset.\n *\n * @param offset - a number or a string (WGSL `u32` expression) representing the offset.\n */\n readonly getByOffset: (offset: number|string) => string;\n\n /**\n * name of the data variable\n */\n readonly name: string;\n\n /**\n * whether the helper is for an input, an output or an internal variable.\n */\n readonly usage: 'input'|'output'|'internal';\n\n /**\n * the rank of the input or output.\n */\n readonly rank: number;\n\n /**\n * a string representing the variable name for the shape of the input or output.\n */\n readonly shape: string;\n\n /**\n * a string representing the variable name for the strides of the input or output.\n */\n readonly strides: string;\n}\n\nconst getWgslMappedType = (type: number, components: 1|2|3|4): string|[string, string] => {\n if (components === 3) {\n throw new Error('vec3 has same alignment as vec4, use vec4 instead');\n }\n\n // return type is [ storage type, runtime type ] or a single string for both\n switch (type) {\n case DataType.float16:\n return components > 1 ? `vec${components}` : 'f16';\n case DataType.float:\n return components > 1 ? `vec${components}` : 'f32';\n case DataType.int32:\n return components > 1 ? `vec${components}` : 'i32';\n case DataType.uint32:\n return components > 1 ? `vec${components}` : 'u32';\n case DataType.int64:\n if (components > 1) {\n throw new Error('currently not supported vecX of uint64 yet');\n }\n return ['vec2', 'i32'];\n case DataType.uint64:\n if (components > 1) {\n throw new Error('currently not supported vecX of uint64 yet');\n }\n return ['vec2', 'u32'];\n case DataType.bool:\n if (components !== 4) {\n throw new Error('bool must be vec4');\n }\n return ['u32', 'vec4'];\n\n default:\n throw new Error(`Unknown data type: ${type}`);\n }\n};\n\nexport const tensorTypeToWsglStorageType = (type: DataType, components: 1|2|3|4 = 1) => {\n const mappedType = getWgslMappedType(type, components);\n return typeof mappedType === 'string' ? mappedType : mappedType[0];\n};\n\nexport const tensorTypeToWsglValueType = (type: DataType, components: 1|2|3|4 = 1) => {\n const mappedType = getWgslMappedType(type, components);\n return typeof mappedType === 'string' ? mappedType : mappedType[1];\n};\n\nexport const createTensorShapeVariables = (...dims: ReadonlyArray): ProgramUniform[] => {\n const programUniforms: ProgramUniform[] = [];\n dims.forEach(dim => {\n if (dim.length !== 0) {\n programUniforms.push(\n {type: DataType.uint32, data: dim}, {type: DataType.uint32, data: ShapeUtil.computeStrides(dim)});\n }\n });\n return programUniforms;\n};\n\n/**\n * A helper function to get maximum vector size for specified data length\n * @param size\n */\nexport const getMaxComponents = (size: number) => {\n // we cannot use vec3 type since it has alignment of 16 bytes\n if (size % 4 === 0) {\n return 4;\n } else if (size % 2 === 0) {\n return 2;\n }\n\n return 1;\n};\n\n/**\n * A helper function that initializes variable as a scalar or vector. e.g. f32(0) or vec4f(0,0,0,0)\n * @param dataType\n * @param components\n * @param value\n */\nexport const fillVector = (dataType = 'f32', components?: number, value = '0') => {\n if (!components || components === 1) {\n return `${dataType}(${value})`;\n }\n\n return `vec${components}<${dataType}>(${value})`;\n};\n\n/**\n * A helper function that casts value or vector to f32\n * @param dataType\n * @param components\n * @param value\n */\nexport const castToF32 = (dataType: string, components: number, value: string) => {\n if (dataType === 'f32') {\n return value;\n }\n if (components === 1) {\n return `f32(${value})`;\n }\n\n return `vec${components}(${value})`;\n};\n\n/**\n * A helper function that returns scalar or sums all components of a vector\n * @param name\n * @param components\n */\nexport const sumVector = (name: string, components: number) => {\n if (components === 4) {\n return `(${name}.x + ${name}.y + ${name}.z + ${name}.w)`;\n } else if (components === 2) {\n return `(${name}.x + ${name}.y)`;\n } else if (components === 3) {\n return `(${name}.x + ${name}.y + ${name}.z)`;\n }\n\n return name;\n};\n\n/**\n * A helper function that returns variable element at index.\n * @param name - the name of variable.\n * @param index - the index of variable element.\n * @param length - the length of variable.\n * @param type - the type of variable, optional.\n */\nexport const getElementAt =\n (name: string, index: number|string, length: number, type?: UniformDataElementType): string => {\n if (name.startsWith('uniforms.') && length > 4) {\n if (typeof (index) === 'string') {\n if (type === 'f16') {\n return `${name}[(${index}) / 8][(${index}) % 8 / 4][(${index}) % 8 % 4]`;\n } else {\n return `${name}[(${index}) / 4][(${index}) % 4]`;\n }\n } else {\n if (type === 'f16') {\n return `${name}[${Math.floor(index / 8)}][${Math.floor(index % 8 / 4)}][${index % 8 % 4}]`;\n } else {\n return `${name}[${Math.floor(index / 4)}][${index % 4}]`;\n }\n }\n } else {\n return length > 1 ? `${name}[${index}]` : name;\n }\n };\n\n/**\n * A helper function to get a IndicesHelper for a given input or output.\n *\n * @param name - the name of the input or output.\n * @param tensorType - the tensor type of the input or output.\n * @param shapeOrRank - the tensor shape or the rank of the input or output.\n * @param usage - the usage of the indices helper.\n * @param components - indicates the number of components of each element. 1 for scalar, 2 for vec2, 3 for vec3, 4 for\n * vec4.\n */\nconst createIndicesHelper =\n (name: string, tensorType: number, shapeOrRank: number|readonly number[], usage: IndicesHelper['usage'],\n components: 1|2|3|4): IndicesHelper => {\n const useUniform = typeof shapeOrRank === 'number';\n const rank = useUniform ? shapeOrRank : shapeOrRank.length;\n const rankIdentity = [...new Array(rank).keys()];\n const indicesType = rank < 2 ? 'u32' : rank <= 4 ? `vec${rank}` : `array`;\n const mappedType = getWgslMappedType(tensorType, components);\n const valueType = typeof mappedType === 'string' ? mappedType : mappedType[1];\n const storageType = typeof mappedType === 'string' ? mappedType : mappedType[0];\n const type = {indices: indicesType, value: valueType, storage: storageType, tensor: tensorType};\n\n const normalizeDim = (dim: number|string): string => typeof dim === 'string' ? dim : `${dim}u`;\n\n const implementationUsed = {\n offsetToIndices: false,\n indicesToOffset: false,\n broadcastedIndicesToOffset: false,\n set: false,\n setByIndices: false,\n get: false,\n getByIndices: false,\n };\n\n const uniformPrefix = useUniform ? 'uniforms.' : '';\n const shape = `${uniformPrefix}${name}_shape`;\n const strides = `${uniformPrefix}${name}_strides`;\n\n let o2iSnippet = '';\n for (let i = 0; i < rank - 1; i++) {\n o2iSnippet += `\n let dim${i} = current / ${getElementAt(strides, i, rank)};\n let rest${i} = current % ${getElementAt(strides, i, rank)};\n indices[${i}] = dim${i};\n current = rest${i};\n `;\n }\n o2iSnippet += `indices[${rank - 1}] = current;`;\n\n const offsetToIndicesImplementation = rank < 2 ? '' : `\n fn o2i_${name}(offset: u32) -> ${type.indices} {\n var indices: ${type.indices};\n var current = offset;\n ${o2iSnippet}\n return indices;\n }`;\n\n const offsetToIndices = (varOffset: string) => {\n implementationUsed.offsetToIndices = true;\n return rank < 2 ? varOffset : `o2i_${name}(${varOffset})`;\n };\n\n const offsets: string[] = [];\n if (rank >= 2) {\n for (let i = rank - 1; i >= 0; i--) {\n offsets.push(`${getElementAt(strides, i, rank)} * (indices[${i}])`);\n }\n }\n\n const indicesToOffsetImplementation = rank < 2 ? '' : `\n fn i2o_${name}(indices: ${type.indices}) -> u32 {\n return ${offsets.join('+')};\n }`;\n\n const indicesToOffset = (varIndices: string) => {\n implementationUsed.indicesToOffset = true;\n return rank < 2 ? varIndices : `i2o_${name}(${varIndices})`;\n };\n\n const indices = (...init: ReadonlyArray) =>\n rank === 0 ? '0u' : `${type.indices}(${init.map(normalizeDim).join(',')})`;\n\n const indicesGet = (varIndices: string, idx: number|string) => {\n if (rank < 2) {\n return `${varIndices}`;\n } else {\n return `${getElementAt(varIndices, idx, rank)}`;\n }\n };\n\n const indicesSet = (varIndices: string, idx: number|string, value: string) => {\n if (rank < 2) {\n return `${varIndices}=${value};`;\n } else {\n return `${getElementAt(varIndices, idx, rank)}=${value};`;\n }\n };\n\n const broadcastedIndicesToOffsetImplementation: {[key: string]: string} = {};\n const broadcastedIndicesToOffset = (varIndices: string, output: IndicesHelper) => {\n implementationUsed.broadcastedIndicesToOffset = true;\n const implKey = `${output.name}broadcastedIndicesTo${name}Offset`;\n if (implKey in broadcastedIndicesToOffsetImplementation) {\n return `${implKey}(${varIndices})`;\n }\n const offsets = [];\n for (let i = rank - 1; i >= 0; i--) {\n const idx = output.indicesGet('outputIndices', i + output.rank - rank);\n offsets.push(`${indicesGet(strides, i)} * (${idx} % ${indicesGet(shape, i)})`);\n }\n broadcastedIndicesToOffsetImplementation[implKey] =\n `fn ${implKey}(outputIndices: ${output.type.indices}) -> u32 {\n return ${offsets.length > 0 ? offsets.join('+') : '0u'};\n }`;\n\n return `${implKey}(${varIndices})`;\n };\n\n const setByOffset = (offset: number|string, value: string) => (() => {\n if (type.storage === type.value) {\n return `${name}[${offset}]=${value};`;\n } else if (type.storage === 'vec2' && type.value === 'i32') {\n // int64, components === 1\n return `${name}[${offset}]=vec2(u32(${value}), select(0u, 0xFFFFFFFFu, ${value} < 0));`;\n } else if (type.storage === 'vec2' && type.value === 'u32') {\n // uint64, components === 1\n return `${name}[${offset}]=vec2(u32(${value}), 0u);`;\n } else if (type.storage === 'u32' && type.value === 'vec4') {\n // bool, components === 4\n return `${name}[${offset}]=dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(${value}));`;\n } else {\n throw new Error(`not supported combination of storage type ${type.storage} and value type ${type.value} yet`);\n }\n })();\n\n const getByOffset = (offset: number|string) => (() => {\n if (type.storage === type.value) {\n return `${name}[${offset}]`;\n } else if (type.storage === 'vec2' && type.value === 'i32') {\n // int64, components === 1\n return `i32(${name}[${offset}].x)`;\n } else if (type.storage === 'vec2' && type.value === 'u32') {\n // uint64, components === 1\n return `u32(${name}[${offset}].x)`;\n } else if (type.storage === 'u32' && type.value === 'vec4') {\n // bool, components === 4\n return `vec4(bool(${name}[${offset}] & 0xFFu), bool(${name}[${offset}] & 0xFF00u), bool(${name}[${\n offset}] & 0xFF0000u), bool(${name}[${offset}] & 0xFF000000u))`;\n } else {\n throw new Error(`not supported combination of storage type ${type.storage} and value type ${type.value} yet`);\n }\n })();\n\n const getByIndicesImplementation = rank < 2 ? '' : `\n fn get_${name}ByIndices(indices: ${type.indices}) -> ${valueType} {\n return ${getByOffset(`i2o_${name}(indices)`)};\n }`;\n\n const getImplementation = rank < 2 ? '' : (() => {\n const functionParams = rankIdentity.map(i => `d${i}: u32`).join(', ');\n const dimsParams = rankIdentity.map(i => `d${i}`).join(', ');\n return `\n fn get_${name}(${functionParams}) -> ${valueType} {\n return get_${name}ByIndices(${indices(dimsParams)});\n }`;\n })();\n\n const get = (...indices: ReadonlyArray) => {\n if (indices.length !== rank) {\n throw new Error(`indices length must be ${rank}`);\n }\n\n const normalizedIndices = indices.map(normalizeDim).join(',');\n\n if (rank === 0) {\n return getByOffset('0u');\n } else if (rank === 1) {\n return getByOffset(normalizedIndices[0]);\n } else {\n implementationUsed.get = true;\n implementationUsed.getByIndices = true;\n implementationUsed.indicesToOffset = true;\n return `get_${name}(${normalizedIndices})`;\n }\n };\n\n const getByIndices = (varIndices: string) => {\n if (rank < 2) {\n return getByOffset(varIndices);\n } else {\n implementationUsed.getByIndices = true;\n implementationUsed.indicesToOffset = true;\n return `get_${name}ByIndices(${varIndices})`;\n }\n };\n\n const setByIndicesImplementation = rank < 2 ? '' : `\n fn set_${name}ByIndices(indices: ${type.indices}, value: ${valueType}) {\n ${setByOffset(`i2o_${name}(indices)`, 'value')}\n }`;\n\n const setImplementation = rank < 2 ? '' : (() => {\n const functionParams = rankIdentity.map(i => `d${i}: u32`).join(', ');\n const dimsParams = rankIdentity.map(i => `d${i}`).join(', ');\n return `\n fn set_${name}(${functionParams}, value: ${valueType}) {\n set_${name}ByIndices(${indices(dimsParams)}, value);\n }`;\n })();\n\n const set = (...indicesAndValue: ReadonlyArray) => {\n if (indicesAndValue.length !== rank + 1) {\n throw new Error(`indices length must be ${rank}`);\n }\n const value = indicesAndValue[rank];\n if (typeof value !== 'string') {\n throw new Error('value must be string');\n }\n\n const normalizedIndices = indicesAndValue.slice(0, rank).map(normalizeDim).join(',');\n\n if (rank === 0) {\n return setByOffset('0u', value);\n } else if (rank === 1) {\n return setByOffset(normalizedIndices[0], value);\n } else {\n implementationUsed.set = true;\n implementationUsed.setByIndices = true;\n implementationUsed.indicesToOffset = true;\n return `set_${name}(${normalizedIndices}, ${value})`;\n }\n };\n\n const setByIndices = (varIndices: string, value: string) => {\n if (rank < 2) {\n return setByOffset(varIndices, value);\n } else {\n implementationUsed.setByIndices = true;\n implementationUsed.indicesToOffset = true;\n return `set_${name}ByIndices(${varIndices}, ${value});`;\n }\n };\n\n const impl = () => {\n const impls = [];\n let needShapeStrides = false;\n if (implementationUsed.offsetToIndices) {\n impls.push(offsetToIndicesImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.indicesToOffset) {\n impls.push(indicesToOffsetImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.broadcastedIndicesToOffset) {\n Object.values(broadcastedIndicesToOffsetImplementation).forEach(impl => impls.push(impl));\n needShapeStrides = true;\n }\n if (implementationUsed.set) {\n impls.push(setImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.setByIndices) {\n impls.push(setByIndicesImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.get) {\n impls.push(getImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.getByIndices) {\n impls.push(getByIndicesImplementation);\n needShapeStrides = true;\n }\n if (!useUniform && needShapeStrides) {\n impls.unshift(\n `const ${shape} = ${type.indices}(${shapeOrRank.join(',')});`,\n `const ${strides} = ${type.indices}(${ShapeUtil.computeStrides(shapeOrRank).join(',')});`);\n }\n return impls.join('\\n');\n };\n\n return {\n impl,\n type,\n offsetToIndices,\n indicesToOffset,\n broadcastedIndicesToOffset,\n indices,\n indicesGet,\n indicesSet,\n set,\n setByOffset,\n setByIndices,\n get,\n getByOffset,\n getByIndices,\n // isVec4,\n usage,\n name,\n strides,\n shape,\n rank\n };\n };\n\n/**\n * Create a IndicesHelper for an input.\n *\n * @param name - the name of the input.\n * @param type - the tensor type of the input.\n * @param shapeOrRank - the tensor shape or the rank of the input.\n * @param components - the number of components of the input. available values are 1, 2, 3, 4. default is 1.\n * @returns an IndicesHelper for the input.\n */\nexport const inputVariable =\n (name: string, type: number, shapeOrRank: number|readonly number[], components: 1|2|3|4 = 1): IndicesHelper =>\n createIndicesHelper(name, type, shapeOrRank, 'input', components);\n\n/**\n * Create a IndicesHelper for an output.\n *\n * @param name - the name of the output.\n * @param type - the tensor type of the output.\n * @param shapeOrRank - the tensor shape or the rank of the output.\n * @param components - the number of components of the output. available values are 1, 2, 3, 4. default is 1.\n * @returns an IndicesHelper for the output.\n */\nexport const outputVariable =\n (name: string, type: number, shapeOrRank: number|readonly number[], components: 1|2|3|4 = 1): IndicesHelper =>\n createIndicesHelper(name, type, shapeOrRank, 'output', components);\n\n/**\n * Create a IndicesHelper for an internal variable.\n *\n * @param name - the name of the variable.\n * @param type - the tensor type of the variable.\n * @param shapeOrRank - the tensor shape or the rank of the variable.\n * @param components - the number of components of the variable. available values are 1, 2, 3, 4. default is 1.\n * @returns an IndicesHelper for the variable.\n */\nexport const internalVariable =\n (name: string, type: number, shapeOrRank: number|readonly number[], components: 1|2|3|4 = 1): IndicesHelper =>\n createIndicesHelper(name, type, shapeOrRank, 'internal', components);\n\nexport type UniformDataElementType = 'u32'|'f16'|'f32'|'i32';\nexport type UniformsArrayType = Array<{name: string; type: UniformDataElementType; length?: number}>;\n\n/**\n * A ShaderHelper is a helper class for generating WGSL code.\n */\nexport interface ShaderHelper {\n /**\n * A helper function to generate the start of main function in WGSL source code.\n *\n * @example\n * const getShaderSource = (shaderHelper: ShaderHelper) => `\n * ...\n *\n * ${shaderHelper.mainStart()}\n * // your code here inside main() function\n * ...\n * }\n * `;\n *\n * @param workgroupSize - an optional workgroup size. default is WORKGROUP_SIZE.\n */\n mainStart(workgroupSize?: number|[number, number, number]): string;\n\n /**\n * A helper function to generate the code snippet for guarding against out-of-bounds size.\n *\n * @example\n * const getShaderSource = (shaderHelper: ShaderHelper) => `\n * ...\n *\n * ${shaderHelper.mainStart()}\n * ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes(outputSize)}\n *\n * // your code here inside main() function\n * ...\n * }\n * `;\n *\n * @param size - the size of the data to guard against. can be a number or a string (WGSL `u32` expression).\n */\n guardAgainstOutOfBoundsWorkgroupSizes(size: unknown): string;\n\n /**\n * A helper function to generate the code snippet for declaring multiple inputs or outputs.\n *\n * @param variables - an array of IndicesHelper for the variables.\n */\n declareVariables(...variables: IndicesHelper[]): string;\n\n /**\n * A helper function to register one uniform. Can be called multiple times to register multiple uniforms.\n *\n * @param name - the name of the uniform.\n * @param type - the type of the uniform.\n * @param length - the length of the uniform, default to 1 when it is not provided.\n */\n registerUniform(name: string, type: string, length?: number): ShaderHelper;\n\n /**\n * A helper function to register multiple uniforms. Can be called multiple times to register multiple uniforms.\n *\n * @param uniforms - an array of uniforms. Each element of the array is an object with 2 properties: `name` and\n * `type`.\n */\n registerUniforms(uniforms: UniformsArrayType): ShaderHelper;\n\n /**\n * A helper function to register multiple internal variables. Can be called multiple times to register multiple\n * internal variables.\n *\n * @param variables - an array of IndicesHelper for the variables.\n */\n registerInternalVariables(...variables: IndicesHelper[]): ShaderHelper;\n}\n\nclass ShaderHelperImpl implements ShaderHelper {\n constructor(private normalizedDispatchGroup: [number, number, number], private limits: GPUSupportedLimits) {}\n\n guardAgainstOutOfBoundsWorkgroupSizes(size: number|string): string {\n // Guard against out-of-bounds work group sizes\n const sizeInCode = typeof size === 'number' ? `${size}u` : size;\n return `if (global_idx >= ${sizeInCode}) { return; }`;\n }\n\n mainStart(workgroupSize: number|[number, number, number] = WORKGROUP_SIZE) {\n const workgroupSizeX = typeof workgroupSize === 'number' ? workgroupSize : workgroupSize[0];\n const workgroupSizeY = typeof workgroupSize === 'number' ? 1 : workgroupSize[1];\n const workgroupSizeZ = typeof workgroupSize === 'number' ? 1 : workgroupSize[2];\n\n if (workgroupSizeX > this.limits.maxComputeWorkgroupSizeX ||\n workgroupSizeY > this.limits.maxComputeWorkgroupSizeY ||\n workgroupSizeZ > this.limits.maxComputeWorkgroupSizeZ) {\n throw new Error(`workgroup size [${workgroupSizeX}, ${workgroupSizeY}, ${\n workgroupSizeZ}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${\n this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);\n }\n\n if (workgroupSizeX * workgroupSizeY * workgroupSizeZ > this.limits.maxComputeInvocationsPerWorkgroup) {\n throw new Error(`workgroup size [${workgroupSizeX}, ${workgroupSizeY}, ${\n workgroupSizeZ}] exceeds the maximum workgroup invocations ${\n this.limits.maxComputeInvocationsPerWorkgroup}.`);\n }\n\n const is1DimensionDispatch = this.normalizedDispatchGroup[1] === 1 && this.normalizedDispatchGroup[2] === 1;\n const paramList = is1DimensionDispatch ? `@builtin(global_invocation_id) global_id : vec3,\n @builtin(workgroup_id) workgroup_id : vec3,\n @builtin(local_invocation_id) local_id : vec3` :\n `@builtin(global_invocation_id) global_id : vec3,\n @builtin(local_invocation_id) local_id : vec3,\n @builtin(local_invocation_index) local_idx : u32,\n @builtin(workgroup_id) workgroup_id : vec3,\n @builtin(num_workgroups) num_workgroups : vec3`;\n const globalIdxDefinition = is1DimensionDispatch ?\n 'let global_idx = global_id.x; let local_idx = local_id.x;' :\n `let global_idx = (workgroup_id.z * num_workgroups[0] * num_workgroups[1] +\n workgroup_id.y * num_workgroups[0] + workgroup_id.x) * ${\n workgroupSizeX * workgroupSizeY * workgroupSizeZ}u + local_idx;`;\n\n return `@compute @workgroup_size(${workgroupSizeX}, ${workgroupSizeY}, ${workgroupSizeZ})\n fn main(${paramList}) {\n ${globalIdxDefinition}\n `;\n }\n\n private appendVariableUniforms(variable: IndicesHelper): void {\n if (variable.rank !== 0) {\n if (variable.shape.startsWith('uniforms.')) {\n this.uniforms.push({name: variable.shape.replace('uniforms.', ''), type: 'u32', length: variable.rank});\n }\n if (variable.strides.startsWith('uniforms.')) {\n this.uniforms.push({name: variable.strides.replace('uniforms.', ''), type: 'u32', length: variable.rank});\n }\n }\n }\n\n private declareVariable(variable: IndicesHelper, bindingIndex: number): string {\n if (variable.usage === 'internal') {\n throw new Error('cannot use internal variable with declareVariable(). use registerInternalVariables() instead.');\n }\n this.variables.push(variable);\n this.appendVariableUniforms(variable);\n\n const access = variable.usage === 'input' ? 'read' : 'read_write';\n const storageType = variable.type.storage;\n return `@group(0) @binding(${bindingIndex}) var ${variable.name}: array<${storageType}>;`;\n }\n\n declareVariables(...variables: IndicesHelper[]): string {\n return variables.map(v => this.declareVariable(v, this.variableIndex++)).join('\\n');\n }\n\n private registerInternalVariable(variable: IndicesHelper): void {\n if (variable.usage !== 'internal') {\n throw new Error(\n 'cannot use input or output variable with registerInternalVariable(). use declareVariables() instead.');\n }\n\n this.internalVariables.push(variable);\n this.appendVariableUniforms(variable);\n }\n\n registerInternalVariables(...variables: IndicesHelper[]): ShaderHelper {\n variables.forEach(v => this.registerInternalVariable(v));\n return this;\n }\n\n registerUniform(name: string, type: UniformDataElementType, length = 1): ShaderHelper {\n this.uniforms.push({name, type, length});\n return this;\n }\n\n registerUniforms(additionalUniforms: UniformsArrayType): ShaderHelper {\n this.uniforms = this.uniforms.concat(additionalUniforms);\n return this;\n }\n\n private internalVariables: IndicesHelper[] = [];\n private variables: IndicesHelper[] = [];\n private uniforms: UniformsArrayType = [];\n private uniformDeclaration(): string {\n if (this.uniforms.length === 0) {\n return '';\n }\n\n const uniformSnippets: string[] = [];\n for (const {name, type, length} of this.uniforms) {\n if (length && length > 4) {\n if (type === 'f16') {\n uniformSnippets.push(`@align(16) ${name}:array, ${Math.ceil(length / 8)}>`);\n } else {\n uniformSnippets.push(`${name}:array, ${Math.ceil(length / 4)}>`);\n }\n } else {\n const typeTemp = length == null || length === 1 ? type : `vec${length}<${type}>`;\n uniformSnippets.push(`${name}:${typeTemp}`);\n }\n }\n\n return `\n struct Uniforms { ${uniformSnippets.join(', ')} };\n @group(0) @binding(${this.variableIndex}) var uniforms: Uniforms;`;\n }\n private variableIndex = 0;\n\n /**\n * Get additional implementation that needs to be added to the shader source.\n */\n get additionalImplementations(): string {\n return this.uniformDeclaration() + this.variables.map(i => i.impl()).join('\\n') +\n this.internalVariables.map(i => i.impl()).join('\\n');\n }\n\n /**\n * Get the variable info of the shader program.\n */\n get variablesInfo(): ProgramUniformVariableInfo[]|undefined {\n if (this.uniforms.length === 0) {\n return undefined;\n }\n\n const uniformWgslTypeToDataType = (type: UniformDataElementType) =>\n ([DataType.uint32, DataType.float16, DataType.float,\n DataType.int32][['u32', 'f16', 'f32', 'i32'].indexOf(type)]);\n return this.uniforms.map(u => ([uniformWgslTypeToDataType(u.type), u.length ?? 1]));\n }\n}\n\nexport const createShaderHelper = (dispatchGroup: [number, number, number], limits: GPUSupportedLimits) =>\n new ShaderHelperImpl(dispatchGroup, limits);\n\n/**\n * This function comes from https://github.com/tensorflow/tfjs/blob/master/tfjs-core/src/ops/broadcast_util.ts#L18-L40\n * Returns the dimensions in the input shape that are broadcasted to\n * produce the provided output shape.\n *\n * The returned dimensions are 0-indexed and sorted. An example:\n * inShape = [4, 1, 3]\n * outShape = [5, 4, 3, 3]\n * result = [1]. Dimension 1 (2nd dimension of input) gets broadcasted 1 => 3.\n */\nexport const getBroadcastDims = (inShape: readonly number[], outShape: readonly number[]): number[] => {\n const inRank = inShape.length;\n const dims: number[] = [];\n for (let i = 0; i < inRank; i++) {\n const dim = inRank - 1 - i;\n const a = inShape[dim] || 1;\n const b = outShape[outShape.length - 1 - i] || 1;\n if (b > 1 && a === 1) {\n dims.unshift(dim);\n }\n }\n return dims;\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface TransposeAttributes extends AttributeWithCacheKey {\n readonly perm: number[];\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Transpose requires 1 input.');\n }\n};\n\nconst getAdjustedPerm = (inputRank: number, perm: number[]): number[] =>\n (perm && perm.length !== inputRank) ? [...(new Array(inputRank).keys())].reverse() : perm;\n\nconst getOutputShape = (inputShape: readonly number[], perm: number[]): readonly number[] =>\n ShapeUtil.sortBasedOnPerm(inputShape, getAdjustedPerm(inputShape.length, perm));\n\nconst permFunctionBody = (perm: number[], rank: number, input: IndicesHelper, output: IndicesHelper): string => {\n const reverseFunc = [];\n reverseFunc.push(`fn perm(i: ${output.type.indices}) -> ${input.type.indices} {\n var a: ${input.type.indices};`);\n for (let i = 0; i < rank; ++i) {\n reverseFunc.push(input.indicesSet('a', perm[i], `i[${i}]`));\n }\n reverseFunc.push('return a;}');\n return reverseFunc.join('\\n');\n};\n\nexport const createTransposeProgramInfo = (inputTensor: TensorView, permAttr: number[]): ProgramInfo => {\n const inputDataType = inputTensor.dataType;\n const inputRank = inputTensor.dims.length;\n const perm = getAdjustedPerm(inputRank, permAttr);\n const outputShape = getOutputShape(inputTensor.dims, perm);\n const output = outputVariable('output', inputDataType, outputShape.length);\n const input = inputVariable('a', inputDataType, inputRank);\n let getShaderSource;\n if (perm.length === 2 && perm[0] === 1 && perm[1] === 0) {\n const wgslType = output.type.value;\n const workgroupSize: [number, number, number] = [16, 16, 1];\n getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(input, output)}\n var tile : array, ${workgroupSize[0]}>;\n ${shaderHelper.mainStart(workgroupSize)}\n var x = workgroup_id.x * ${workgroupSize[0]}u + local_id.x;\n var y = workgroup_id.y * ${workgroupSize[0]}u + local_id.y;\n let width = uniforms.output_shape[0];\n let height = uniforms.output_shape[1];\n if (x < width && y < height) {\n tile[local_id.y][local_id.x] = ${input.getByOffset('y * width + x')};\n }\n workgroupBarrier();\n x = workgroup_id.y * ${workgroupSize[0]}u + local_id.x;\n y = workgroup_id.x * ${workgroupSize[0]}u + local_id.y;\n if (x < height && y < width) {\n ${output.setByOffset('y * height + x', 'tile[local_id.x][local_id.y]')}\n }\n }`;\n } else {\n getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(input, output)}\n\n ${permFunctionBody(perm, inputRank, input, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let indices = ${output.offsetToIndices('global_idx')};\n let aIndices = perm(indices);\n\n ${output.setByOffset('global_idx', input.getByIndices('aIndices'))}\n }`;\n }\n return {\n name: 'Transpose',\n shaderCache: {hint: `${permAttr}`, inputDependencies: ['rank']},\n getRunData: (inputs) => {\n const outputSize = ShapeUtil.size(outputShape);\n return {\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms:\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(inputs[0].dims, outputShape)],\n };\n },\n getShaderSource,\n };\n};\n\nexport const transpose = (context: ComputeContext, attributes: TransposeAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createTransposeProgramInfo(context.inputs[0], attributes.perm));\n};\n\nexport const parseTransposeAttributes = (attributes: Record): TransposeAttributes =>\n createAttributeWithCacheKey({perm: attributes.perm as number[]});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramShaderCacheInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper} from './common';\nimport {createReduceAttributesFromInputs, ReduceAttributes} from './reduce';\nimport {createTransposeProgramInfo} from './transpose';\n\nconst reduceOps: {[key: string]: string} = {\n max: 'select(bestValue, candidate, candidate > bestValue)',\n min: 'select(bestValue, candidate, candidate < bestValue)',\n mean: 'bestValue + candidate',\n sum: 'bestValue + candidate',\n prod: 'bestValue * candidate',\n sumSquare: 'bestValue + candidate * candidate',\n logSumExp: 'bestValue + exp(candidate)',\n l1: 'bestValue + abs(candidate)',\n l2: 'bestValue + candidate * candidate',\n logSum: 'bestValue + candidate'\n};\n\nconst reduceSharedOps: {[key: string]: string} = {\n max: 'select(bestValue, candidate, candidate > bestValue)',\n min: 'select(bestValue, candidate, candidate < bestValue)',\n mean: 'bestValue + candidate',\n sum: 'bestValue + candidate',\n prod: 'bestValue * candidate',\n sumSquare: 'bestValue + candidate',\n logSumExp: 'bestValue + candidate',\n l1: 'bestValue + candidate',\n l2: 'bestValue + candidate',\n logSum: 'bestValue + candidate'\n};\n\nconst reduceInitValues: {[key: string]: string} = {\n max: '_A[offset]',\n min: '_A[offset]',\n mean: '0',\n sum: '0',\n prod: '1',\n sumSquare: '0',\n logSumExp: '0',\n l1: '0',\n l2: '0',\n logSum: '0'\n};\n\nconst reduceOutputValues: {[key: string]: string} = {\n max: 'bestValue',\n min: 'bestValue',\n sum: 'bestValue',\n prod: 'bestValue',\n sumSquare: 'bestValue',\n logSumExp: 'log(bestValue)',\n l1: 'bestValue',\n l2: 'sqrt(bestValue)',\n logSum: 'log(bestValue)'\n};\n\nconst getInnerMostAxes = (numInnerAxes: number, rank: number): number[] => {\n const res = [];\n for (let i = rank - numInnerAxes; i < rank; ++i) {\n res.push(i);\n }\n return res;\n};\n\nconst computeOutAndReduceShapes = (shape: readonly number[], axes: readonly number[]): [number[], number[]] => {\n const outputShape = [];\n const rank = shape.length;\n for (let dim = 0; dim < rank; dim++) {\n if (axes.indexOf(dim) === -1) {\n outputShape.push(shape[dim]);\n }\n }\n const reduceShape = axes.map(dim => shape[dim]);\n return [outputShape, reduceShape];\n};\n\nconst expandShapeToKeepDim = (shape: number[], axes: number[]): number[] => {\n const rank = shape.length + axes.length;\n const expandShape = [];\n let shapeIdx = 0;\n for (let dim = 0; dim < rank; dim++) {\n if (axes.indexOf(dim) === -1) {\n expandShape.push(shape[shapeIdx++]);\n } else {\n expandShape.push(1);\n }\n }\n return expandShape;\n};\n\nconst areAxesInnerMostDims = (axes: number[], rank: number): boolean => {\n for (let i = 0; i < axes.length; ++i) {\n if (axes[axes.length - i - 1] !== rank - 1 - i) {\n return false;\n }\n }\n return true;\n};\n\nconst getAxesPermutation = (axes: number[], rank: number): number[] => {\n const res = [];\n if (!areAxesInnerMostDims(axes, rank)) {\n for (let i = 0; i < rank; ++i) {\n if (axes.indexOf(i) === -1) {\n res.push(i);\n }\n }\n axes.forEach(axis => res.push(axis));\n }\n return res;\n};\n\nexport const createReduceSharedProgramInfo =\n (name: string, shaderCache: ProgramShaderCacheInfo, inputs: readonly TensorView[], reduceType: string,\n outputDataType: DataType, outputShape: number[], reduceShape: number[]): ProgramInfo => {\n const inputShape = inputs[0].dims;\n\n const outputSize = ShapeUtil.size(outputShape);\n const reduceSize = ShapeUtil.size(reduceShape);\n\n const input = inputVariable('_A', inputs[0].dataType, inputShape);\n const output = outputVariable('output', outputDataType, outputShape);\n\n const workgroupSize = 32;\n\n const sharedMemorySnippet = `\n var aBestValues : array;\n `;\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniform('reduceSize', 'u32').declareVariables(input, output)}\n ${sharedMemorySnippet}\n fn DIV_CEIL(a : u32, b : u32) -> u32 {\n return ((a - 1u) / b + 1u);\n }\n ${shaderHelper.mainStart(workgroupSize)}\n\n let outputIndex = global_idx / ${workgroupSize};\n let offset = outputIndex * uniforms.reduceSize;\n\n var bestValue = f32(${reduceInitValues[reduceType]});\n let Length = uniforms.reduceSize;\n for (var k = local_idx; k < Length; k = k + ${workgroupSize}) {\n let candidate = f32(${input.getByOffset('offset + k')});\n bestValue = ${reduceOps[reduceType]};\n }\n aBestValues[local_idx] = bestValue;\n workgroupBarrier();\n\n var reduceSize = min(Length, ${workgroupSize}u);\n for (var currentSize = reduceSize / 2u; reduceSize > 1u;\n currentSize = reduceSize / 2u) {\n let interval = DIV_CEIL(reduceSize, 2u);\n if (local_idx < currentSize) {\n let candidate = aBestValues[local_idx + interval];\n bestValue = ${reduceSharedOps[reduceType]};\n aBestValues[local_idx] = bestValue;\n }\n reduceSize = interval;\n workgroupBarrier();\n }\n\n if (local_idx == 0u) {\n ${\n output.setByOffset(\n 'outputIndex',\n `${\n reduceType === 'mean' ? `${output.type.storage}(bestValue / f32(uniforms.reduceSize))` :\n `${output.type.storage}(${reduceOutputValues[reduceType]})`}`)};\n }\n }`;\n\n // One work group is responsible for only one element of output.\n return {\n name,\n shaderCache,\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: outputDataType}],\n dispatchGroup: {x: outputSize},\n programUniforms: [{type: DataType.uint32, data: reduceSize}]\n }),\n };\n };\n\nconst reduceCommon =\n (context: ComputeContext, name: string, attributes: ReduceAttributes,\n reduceType: 'sum'|'sumSquare'|'prod'|'min'|'max'|'mean'|'logSumExp'|'l1'|'l2'|'logSum'): void => {\n const updatedAttributes: ReduceAttributes =\n context.inputs.length === 1 ? attributes : createReduceAttributesFromInputs(context.inputs, attributes);\n\n let updatedAxes = updatedAttributes.axes;\n if (updatedAxes.length === 0 && !updatedAttributes.noopWithEmptyAxes) {\n updatedAxes = context.inputs[0].dims.map((_dim, i) => i);\n }\n const normalizeAxes = ShapeUtil.normalizeAxes(updatedAxes, context.inputs[0].dims.length);\n\n let axes = normalizeAxes;\n let input = context.inputs[0];\n const permutedAxes = getAxesPermutation(axes, context.inputs[0].dims.length);\n if (permutedAxes.length > 0) {\n input = context.compute(\n createTransposeProgramInfo(context.inputs[0], permutedAxes), {inputs: [0], outputs: [-1]})[0];\n axes = getInnerMostAxes(axes.length, input.dims.length);\n }\n\n const [outputShape, reduceShape] = computeOutAndReduceShapes(input.dims, axes);\n let finalOutputShape = outputShape;\n if (updatedAttributes.keepDims) {\n finalOutputShape = expandShapeToKeepDim(outputShape, normalizeAxes);\n }\n\n context.compute(\n createReduceSharedProgramInfo(\n name, {hint: updatedAttributes.cacheKey, inputDependencies: ['type']}, [input], reduceType,\n context.inputs[0].dataType, finalOutputShape, reduceShape),\n {inputs: [input]});\n };\n\nexport const reduceMeanShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceMeanShared', attributes, 'mean');\n};\n\nexport const reduceL1Shared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceL1Shared', attributes, 'l1');\n};\n\nexport const reduceL2Shared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceL2Shared', attributes, 'l2');\n};\n\nexport const reduceLogSumExpShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceLogSumExpShared', attributes, 'logSumExp');\n};\n\nexport const reduceMaxShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceMaxShared', attributes, 'max');\n};\n\nexport const reduceMinShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceMinShared', attributes, 'min');\n};\n\nexport const reduceProdShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceProdShared', attributes, 'prod');\n};\n\nexport const reduceSumShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceSumShared', attributes, 'sum');\n};\n\nexport const reduceSumSquareShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceSumSquareShared', attributes, 'sumSquare');\n};\n\nexport const reduceLogSumShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceLogSumShared', attributes, 'logSum');\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramShaderCacheInfo} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\nimport {reduceL1Shared, reduceL2Shared, reduceLogSumExpShared, reduceLogSumShared, reduceMaxShared, reduceMeanShared, reduceMinShared, reduceProdShared, reduceSumShared, reduceSumSquareShared} from './reduce-shared';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length === 0 || inputs.length > 2) {\n throw new Error('Reduce op requires 1 or 2 inputs.');\n }\n\n if (inputs.length === 2 && inputs[1].dims.length !== 1) {\n throw new Error('Invalid axes input dims.');\n }\n};\n\nexport interface ReduceAttributes extends AttributeWithCacheKey {\n keepDims: boolean;\n noopWithEmptyAxes: boolean;\n axes: number[];\n}\n\nexport type ReduceOp =\n (input: IndicesHelper, output: IndicesHelper,\n axes: readonly number[]) => [string, string, string, string, ...string[]];\n\nconst noOp: ReduceOp = (input) => ['', '', `var value = ${input.getByIndices('input_indices')};`, ''];\nexport const createReduceProgramInfo =\n (name: string, shaderCache: ProgramShaderCacheInfo, inputs: readonly TensorView[], reduceOp: ReduceOp,\n axesInput: number[], outputDataType: DataType, keepDims = false, noopWithEmptyAxes = false): ProgramInfo => {\n const outputShape: number[] = [];\n const inputShape = inputs[0].dims;\n const inputRank = inputShape.length;\n const axes = ShapeUtil.normalizeAxes(axesInput, inputRank);\n const reduceOnAllAxes = !noopWithEmptyAxes && axes.length === 0;\n inputShape.forEach((d, i) => {\n if (reduceOnAllAxes || axes.indexOf(i) >= 0) {\n if (keepDims) {\n outputShape.push(1);\n } // else { // skip this axis}\n } else {\n outputShape.push(d);\n }\n });\n const outputRank = outputShape.length;\n const outputSize = ShapeUtil.size(outputShape);\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const idxCopy: string[] = []; // copy output indexes to input indexes\n\n const input = inputVariable('_A', inputs[0].dataType, inputRank);\n const output = outputVariable('output', outputDataType, outputRank);\n const ops = reduceOp(input, output, axes);\n let reduceOps = ops[2];\n\n for (let k = 0, l = 0; k < inputRank; k++) {\n // if this axis is reduced\n if (reduceOnAllAxes || axes.indexOf(k) >= 0) {\n if (keepDims) {\n l++;\n }\n // loop over the d-th axis\n reduceOps = `for(var j${k}: u32 = 0; j${k} < ${inputShape[k]}; j${k}++) {\n ${ops[2].includes('last_index') ? `let last_index = j${k};` : ''}\n ${input.indicesSet('input_indices', k, `j${k}`)}\n ${reduceOps}\n }`;\n } else {\n idxCopy.push(`${input.indicesSet('input_indices', k, output.indicesGet('output_indices', l))};`);\n l++;\n }\n }\n return `\n\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(input, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n var input_indices: ${input.type.indices};\n let output_indices = ${output.offsetToIndices('global_idx')};\n\n ${idxCopy.join('\\n')}\n ${ops[0]} // init ops for reduce max/min\n ${ops[1]}\n ${reduceOps}\n ${ops[3]}\n ${ops.length === 4 ? output.setByOffset('global_idx', 'value') : ops.slice(4).join('\\n')}\n }`;\n };\n\n return {\n name,\n shaderCache,\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: outputDataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms:\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(inputShape, outputShape)]\n }),\n };\n };\n\nexport const createReduceAttributesFromInputs =\n (inputs: readonly TensorView[], attributes: ReduceAttributes): ReduceAttributes => {\n const axes: number[] = [];\n if (inputs[1].dims[0] > 0) {\n inputs[1].getBigInt64Array().forEach(v => axes.push(Number(v)));\n }\n return createAttributeWithCacheKey(\n {axes, keepDims: attributes.keepDims, noopWithEmptyAxes: attributes.noopWithEmptyAxes});\n };\n\nconst runReduceProgram =\n (context: ComputeContext, name: string, attributes: ReduceAttributes, reduceOp: ReduceOp): void => {\n const inputs = context.inputs;\n const updatedAttributes: ReduceAttributes =\n inputs.length === 1 ? attributes : createReduceAttributesFromInputs(inputs, attributes);\n\n context.compute(\n createReduceProgramInfo(\n name, {hint: updatedAttributes.cacheKey, inputDependencies: ['rank']}, [inputs[0]],\n updatedAttributes.noopWithEmptyAxes && updatedAttributes.axes.length === 0 ? noOp : reduceOp,\n updatedAttributes.axes, inputs[0].dataType, updatedAttributes.keepDims,\n updatedAttributes.noopWithEmptyAxes),\n {inputs: [0]});\n };\n\nconst reduceLogSumNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(0);`,\n '',\n `value += ${input.getByIndices('input_indices')};`,\n 'value = log(value);',\n ];\n runReduceProgram(context, 'ReduceLogSum', attributes, reduceOp);\n};\n\nconst reduceL1Naive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(0);`,\n '',\n `value += abs(${input.getByIndices('input_indices')});`,\n '',\n ];\n runReduceProgram(context, 'ReduceL1', attributes, reduceOp);\n};\n\nconst reduceL2Naive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var t = ${output.type.value}(0); var value = ${output.type.value}(0);`,\n '',\n `t = ${input.getByIndices('input_indices')}; value += (t * t);`,\n 'value = sqrt(value);',\n ];\n runReduceProgram(context, 'ReduceL2', attributes, reduceOp);\n};\n\nconst reduceLogSumExpNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(0);`,\n '',\n `value += exp(${input.getByIndices('input_indices')});`,\n 'value = log(value);',\n ];\n runReduceProgram(context, 'ReduceLogSumExp', attributes, reduceOp);\n};\n\nconst reduceMaxNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, _output, axes) => {\n const idxZero = [];\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(input.indicesSet('input_indices', k, 0));\n }\n }\n\n return [\n `${idxZero.join('\\n')}`,\n `var value = ${input.getByIndices('input_indices')};`,\n `value = max(value, ${input.getByIndices('input_indices')});`,\n '',\n ];\n };\n runReduceProgram(context, 'ReduceMax', attributes, reduceOp);\n};\n\nconst reduceMeanNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output, axes) => {\n let size = 1.0;\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n // TODO: this depends on the input dims. If we want to use uniform, this need to be updated.\n size *= context.inputs[0].dims[k];\n }\n }\n\n return [\n 'var sum = f32(0);',\n '',\n `sum += f32(${input.getByIndices('input_indices')});`,\n `let value = ${output.type.value}(sum / ${size});`,\n ];\n };\n runReduceProgram(context, 'ReduceMean', attributes, reduceOp);\n};\n\nconst reduceMinNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, _output, axes) => {\n const idxZero = [];\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(`input_indices[${k}] = 0;`); // first element\n }\n }\n\n return [\n `${idxZero.join('\\n')}`,\n `var value = ${input.getByIndices('input_indices')};`,\n `value = min(value, ${input.getByIndices('input_indices')});`,\n '',\n ];\n };\n runReduceProgram(context, 'ReduceMin', attributes, reduceOp);\n};\n\nconst reduceProdNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(1);`,\n '',\n `value *= ${input.getByIndices('input_indices')};`,\n '',\n ];\n runReduceProgram(context, 'ReduceProd', attributes, reduceOp);\n};\n\nconst reduceSumNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(0);`,\n '',\n `value += ${input.getByIndices('input_indices')};`,\n '',\n ];\n runReduceProgram(context, 'ReduceSum', attributes, reduceOp);\n};\n\nconst reduceSumSquareNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var t = ${output.type.value}(0); var value = ${output.type.value}(0);`,\n '',\n `t = ${input.getByIndices('input_indices')}; value += t * t;`,\n '',\n ];\n runReduceProgram(context, 'ReduceSumSquare', attributes, reduceOp);\n};\n\nconst useNaiveReduceMethod =\n (shape: readonly number[], axes: readonly number[], noopWithEmptyAxes: boolean): boolean => {\n if (axes.length === 0) {\n return noopWithEmptyAxes;\n }\n\n let outputSize = 1;\n let reduceSize = 1;\n for (let dim = 0; dim < axes.length; dim++) {\n if (axes.indexOf(dim) === -1) {\n outputSize *= shape[dim];\n } else {\n reduceSize *= shape[dim];\n }\n }\n\n // The condition data is very rough, although considering the count of Execution Unit (EU), the potential\n // work groups in a EU and the counts of loops in the naive and shared methods, also doing experiments\n // on some machines.\n return reduceSize < 32 && outputSize > 1024;\n };\n\nexport const reduceMean = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceMeanNaive(context, attributes);\n } else {\n reduceMeanShared(context, attributes);\n }\n};\n\nexport const reduceL1 = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceL1Naive(context, attributes);\n } else {\n reduceL1Shared(context, attributes);\n }\n};\n\nexport const reduceL2 = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceL2Naive(context, attributes);\n } else {\n reduceL2Shared(context, attributes);\n }\n};\n\nexport const reduceLogSumExp = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceLogSumExpNaive(context, attributes);\n } else {\n reduceLogSumExpShared(context, attributes);\n }\n};\n\nexport const reduceMax = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceMaxNaive(context, attributes);\n } else {\n reduceMaxShared(context, attributes);\n }\n};\n\nexport const reduceMin = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceMinNaive(context, attributes);\n } else {\n reduceMinShared(context, attributes);\n }\n};\n\nexport const reduceProd = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceProdNaive(context, attributes);\n } else {\n reduceProdShared(context, attributes);\n }\n};\n\nexport const reduceSum = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceSumNaive(context, attributes);\n } else {\n reduceSumShared(context, attributes);\n }\n};\n\nexport const reduceSumSquare = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceSumSquareNaive(context, attributes);\n } else {\n reduceSumSquareShared(context, attributes);\n }\n};\n\nexport const reduceLogSum = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceLogSumNaive(context, attributes);\n } else {\n reduceLogSumShared(context, attributes);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// TODO: this is the same naive implementation we use for reduce that has\n// performance limitations when the reduced axis is long. Need to add\n// a optimized codepath for this.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext} from '../types';\n\nimport {createReduceProgramInfo, ReduceOp} from './reduce';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length === 0 || inputs.length > 2) {\n throw new Error('ArgMinMaxOp op requires 1 or 2 inputs.');\n }\n if (inputs[0].dataType !== DataType.float) {\n throw new Error('Invalid input type.');\n }\n};\n\nexport interface ArgMinMaxAttributes extends AttributeWithCacheKey {\n keepDims: boolean;\n axis: number;\n selectLastIndex: number;\n}\n\nexport const argMin = (context: ComputeContext, attributes: ArgMinMaxAttributes): void => {\n validateInputs(context.inputs);\n const argMinMaxOp: ReduceOp = (input, output, axes) => {\n const idxZero = [];\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(`input_indices[${k}] = 0;`); // first element\n }\n }\n return [\n `${idxZero.join('\\n')}`, `var value = ${input.getByIndices('input_indices')};\\nvar best_index : i32 = 0;`,\n `if (${input.getByIndices('input_indices')} ${attributes.selectLastIndex > 0 ? '<=' : '<'} value) {\n value = ${input.getByIndices('input_indices')};\n best_index = i32(last_index);\n }`,\n '', output.setByOffset('global_idx', 'best_index')\n ];\n };\n\n context.compute(\n createReduceProgramInfo(\n 'ArgMin', {hint: attributes.cacheKey, inputDependencies: ['rank']}, [context.inputs[0]], argMinMaxOp,\n [attributes.axis], DataType.int64, attributes.keepDims),\n {inputs: [0]});\n};\n\nexport const argMax = (context: ComputeContext, attributes: ArgMinMaxAttributes): void => {\n validateInputs(context.inputs);\n const argMinMaxOp: ReduceOp = (input, output, axes) => {\n const idxZero = [];\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(`input_indices[${k}] = 0;`); // first element\n }\n }\n return [\n `${idxZero.join('\\n')}`, `var value = ${input.getByIndices('input_indices')};\\nvar best_index : i32 = 0;`,\n `if (${input.getByIndices('input_indices')} ${attributes.selectLastIndex > 0 ? '>=' : '>'} value) {\n value = ${input.getByIndices('input_indices')};\n best_index = i32(last_index);\n }`,\n '', output.setByOffset('global_idx', 'best_index')\n ];\n };\n\n context.compute(\n createReduceProgramInfo(\n 'argMax', {hint: attributes.cacheKey, inputDependencies: ['rank']}, [context.inputs[0]], argMinMaxOp,\n [attributes.axis], DataType.int64, attributes.keepDims),\n {inputs: [0]});\n};\n\nexport const parseArgMinMaxAttributes = (attributes: Record): ArgMinMaxAttributes =>\n createAttributeWithCacheKey(attributes as Omit);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ComputeContext, GpuDataType, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {getMaxComponents, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, tensorTypeToWsglValueType, UniformDataElementType, UniformsArrayType} from './common';\n\nexport const enum AttentionQkvFormat {\n unknown, // enum value not set, or depends on qkv projection implementation details\n qkvBNSH, // for non-packed qkv, permuted\n qkvBSNH, // for non-packed qkv, not permuted, used by memory efficient attention or MultiHeadAttention\n qkvBSN3H, // for TRT fused attention, qkv are packed\n qkvBNSHqkvBS3NH, // for TRT fused causal attention, data has two formats (qkv is 3BNSH, gemm_buffer is BS3NH)\n qKvBSNHxBSN2H, // for TRT fused cross attention, kv are packed\n qkvTNH, // for memory efficient attention, qkv are not packed, and paddings are removed.\n qkvTN3H, // for TRT fused attention, qkv are packed and paddings are removed\n}\n\nexport const enum AttentionMaskType {\n none, // No mask\n mask1dKeySeqLen, // [batch_size], key sequence length\n mask1dEndStart, // [2 * batch_size] with end positions and start positions\n mask1DKeySeqLenStart, // [3 * batch_size + 2] with [key_len[0], ..., key_len[batch_size - 1], query_start[0],\n // ..., query_start[batch_size - 1], query_end[batch_size - 1], key_start[0], ...,\n // key_start[batch_size - 1], key_end[batch_size - 1]]\n mask2dDummy, // dummy mask with shape [1, 1] or [batch_size, 1]. It has same effect as no mask.\n mask2dKeyPadding, // [batch_size, total_sequence_length]\n mask3dAttention, // [batch_size, sequence_length, total_sequence_length]\n mask4dMegatron, // Megatron causal mask with shape [batch_size, 1, max_sequence_length, max_sequence_length]\n maskUnknown\n}\n\nexport interface AttentionParameters {\n batchSize: number;\n sequenceLength: number;\n pastSequenceLength: number;\n kvSequenceLength: number;\n totalSequenceLength: number;\n maxSequenceLength: number;\n inputHiddenSize: number;\n hiddenSize: number;\n vHiddenSize: number;\n headSize: number;\n vHeadSize: number;\n numHeads: number;\n kvNumHeads?: number;\n nReps?: number;\n isUnidirectional?: boolean;\n pastPresentShareBuffer: boolean;\n maskFilterValue?: number;\n maskType: AttentionMaskType;\n scale: number;\n broadcastResPosBias: boolean;\n passPastInKv: boolean;\n qkvFormat: AttentionQkvFormat;\n isPastkvBSNH?: boolean;\n}\n\nexport interface AttentionAttrs {\n numHeads: number;\n kvNumHeads?: number;\n isUnidirectional?: number;\n maskFilterValue?: number;\n scale: number;\n doRotary: number;\n qkvHiddenSizes: number[];\n pastPresentShareBuffer: boolean;\n}\n\nconst validateAttentionInputs = (inputs: readonly TensorView[], attributes: AttentionAttrs): AttentionParameters => {\n // Abbreviation and Meanings:\n // B: batch_size\n // S: sequence_length (input sequence length of query)\n // P: past_sequence_length (past sequence length of key or value)\n // L: kv_sequence_length (input sequence length of key or value)\n // M: max_sequence_length\n // T: total_sequence_length = past_sequence_length + kv_sequence_length\n // N: num_heads\n // H: head size for Q and K, aka q_head_size or k_head_size or qk_head_size\n // H_v: v_head_size\n // D_i: input hidden size\n // D: hidden size for Q and K (D = N * H), aka q_hidden_size or k_hidden_size or qk_hidden_size\n // D_v: v_hidden_size = num_heads * v_head_size\n\n // When past state is used, Q, K and V should have same hidden size (unless we split it into past_key and past_value).\n\n // Input shapes:\n // input (Q/K/V) : (B, S, D_i)\n // weights (Q/K/V) : (D_i, D + D + D_v)\n // bias (Q/K/V) : (D + D + D_v)\n // mask_index : see below\n // past (K/V) : (2, B, N, P, H) or NULL\n // relative_position_bias : (B, N, S, T) or NULL\n\n // For mask_index, the following shapes are supported:\n // NULL, (B, 1), (1, 1)\n // (B), (2 * B), (3 * B + 2)\n // (B, T)\n // (B, S, T)\n // (B, 1, M, M)\n //\n // When a model is pruned (like some attention heads are removed in Q/K/V), input_hidden_size could be larger\n // than hidden dimension of Q, K and V.\n\n const input = inputs[0];\n const weights = inputs[1];\n const bias = inputs[2];\n const maskIndex = inputs[3];\n const past = inputs[4];\n const relativePositionBias = inputs[5];\n\n if (past && relativePositionBias) {\n throw new Error('Attention cannot have both past and relative_position_bias');\n }\n\n if (input.dims.length !== 3) {\n throw new Error('Input \"input\" must have 3 dimensions');\n }\n\n const batchSize = input.dims[0];\n const sequenceLength = input.dims[1];\n const inputHiddenSize = input.dims[2];\n\n if (bias.dims.length !== 1) {\n throw new Error('Input \"bias\" is expected to have 1 dimensions');\n }\n\n if (weights.dims.length !== 2) {\n throw new Error('Input \"weights\" is expected to have 2 dimensions');\n }\n\n if (weights.dims[0] !== inputHiddenSize) {\n throw new Error('Input 1 dimension 0 should have same length as dimension 2 of input 0');\n }\n\n if (bias.dims[0] !== weights.dims[1]) {\n throw new Error('Input \"bias\" dimension 0 should have same length as dimension 1 of input \"weights\"');\n }\n\n let qHiddenSize = bias.dims[0] / 3;\n let kHiddenSize = qHiddenSize;\n let vHiddenSize = kHiddenSize;\n if (attributes.qkvHiddenSizes.length > 0) {\n if (attributes.qkvHiddenSizes.length !== 3) {\n throw new Error('qkv_hidden_sizes attribute should have 3 elements');\n }\n for (const sz of attributes.qkvHiddenSizes) {\n if (sz % attributes.numHeads !== 0) {\n throw new Error('qkv_hidden_sizes should be divisible by num_heads');\n }\n }\n\n qHiddenSize = attributes.qkvHiddenSizes[0];\n kHiddenSize = attributes.qkvHiddenSizes[1];\n vHiddenSize = attributes.qkvHiddenSizes[2];\n }\n\n const kvSequenceLength = sequenceLength;\n\n if (qHiddenSize !== kHiddenSize) {\n throw new Error('qkv_hidden_sizes first element should be same as the second');\n }\n\n if (bias.dims[0] !== qHiddenSize + kHiddenSize + vHiddenSize) {\n throw new Error('Input \"bias\" dimension 0 should have same length as sum of Q/K/V hidden sizes');\n }\n\n let pastSequenceLength = 0;\n if (past) {\n if (kHiddenSize !== vHiddenSize) {\n throw new Error('Input \"past\" expect k_hidden_size == v_hidden_size');\n }\n if (past.dims.length !== 5) {\n throw new Error('Input \"past\" must have 5 dimensions');\n }\n if (past.dims[0] !== 2) {\n throw new Error('Input \"past\" first dimension must be 2');\n }\n if (past.dims[1] !== batchSize) {\n throw new Error('Input \"past\" second dimension must be batch_size');\n }\n if (past.dims[2] !== attributes.numHeads) {\n throw new Error('Input \"past\" third dimension must be num_heads');\n }\n if (past.dims[4] !== kHiddenSize / attributes.numHeads) {\n throw new Error('Input \"past\" fifth dimension must be k_hidden_size / num_heads');\n }\n\n if (!attributes.pastPresentShareBuffer) {\n pastSequenceLength = past.dims[3];\n }\n // TODO: handle past_seq_len\n }\n\n const totalSequenceLength = kvSequenceLength + pastSequenceLength;\n const maxSequenceLength = -1;\n\n const maskType = AttentionMaskType.none;\n if (maskIndex) {\n // maskType = AttentionMaskType.MASK_UNKNOWN;\n // TODO: handle mask\n throw new Error('Mask not supported');\n }\n\n if (past) {\n throw new Error('past is not supported');\n }\n\n return {\n batchSize,\n sequenceLength,\n pastSequenceLength,\n kvSequenceLength,\n totalSequenceLength,\n maxSequenceLength,\n inputHiddenSize,\n hiddenSize: qHiddenSize,\n vHiddenSize,\n headSize: Math.floor(qHiddenSize / attributes.numHeads),\n vHeadSize: Math.floor(vHiddenSize / attributes.numHeads),\n numHeads: attributes.numHeads,\n isUnidirectional: false,\n pastPresentShareBuffer: false,\n maskFilterValue: attributes.maskFilterValue,\n maskType,\n scale: attributes.scale,\n broadcastResPosBias: false,\n passPastInKv: false,\n qkvFormat: AttentionQkvFormat.qkvBNSH,\n };\n};\n\nconst createInPlaceSoftmaxProgramInfo = (_context: ComputeContext, input: TensorView, n: number, d: number) => {\n const components = getMaxComponents(d);\n let WG = 64;\n const dComp = d / components;\n if (dComp < WG) {\n WG = 1;\n } else if (dComp / 8 < 64) {\n WG = Math.ceil(dComp / 8);\n }\n const elementsPerThread = Math.ceil(d / components / WG);\n const programUniforms: ProgramUniform[] = [\n {type: input.dataType, data: 1 / d}, {type: DataType.uint32, data: dComp},\n {type: DataType.uint32, data: elementsPerThread}\n ];\n const dataType = tensorTypeToWsglStorageType(input.dataType, components);\n const f32Type = tensorTypeToWsglValueType(DataType.float, components);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const inputHelper = outputVariable('x', input.dataType, input.dims, components);\n const elemValueType = tensorTypeToWsglValueType(input.dataType);\n const uniforms: UniformsArrayType = [\n {name: 'd_inv', type: elemValueType as UniformDataElementType}, {name: 'd_comp', type: 'u32'},\n {name: 'elements_per_thread', type: 'u32'}\n ];\n\n return `\n var thread_max: array;\n var thread_sum: array;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(inputHelper)}\n ${shaderHelper.mainStart([\n WG, 1, 1\n ])}\n let local_offset = local_idx * uniforms.elements_per_thread;\n let offset = workgroup_id.x * uniforms.d_comp + local_offset;\n\n var thread_max_vector = ${f32Type}(-3.402823e+38f);\n for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < uniforms.d_comp; i++) {\n thread_max_vector = max(${f32Type}(x[offset + i]), thread_max_vector);\n }\n thread_max[local_idx] = ${(() => {\n switch (components) {\n case 1:\n return 'thread_max_vector';\n case 2:\n return 'max(thread_max_vector.x, thread_max_vector.y)';\n case 4:\n return 'max(max(thread_max_vector.x, thread_max_vector.y), max(thread_max_vector.z, thread_max_vector.w))';\n default:\n throw new Error(`Unsupported components: ${components}`);\n }\n })()};\n workgroupBarrier();\n\n var max_value = f32(-3.402823e+38f);\n for (var i = 0u; i < ${WG}; i++) {\n max_value = max(thread_max[i], max_value);\n }\n\n var sum_vector = ${f32Type}(0);\n for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < uniforms.d_comp; i++) {\n sum_vector += exp(${f32Type}(x[offset + i]) - max_value);\n }\n thread_sum[local_idx] = ${(() => {\n switch (components) {\n case 1:\n return 'sum_vector';\n case 2:\n return 'sum_vector.x + sum_vector.y';\n case 4:\n return 'sum_vector.x + sum_vector.y + sum_vector.z + sum_vector.w';\n default:\n throw new Error(`Unsupported components: ${components}`);\n }\n })()};\n workgroupBarrier();\n\n var sum: f32 = 0;\n for (var i = 0u; i < ${WG}; i++) {\n sum += thread_sum[i];\n }\n\n if (sum == 0) {\n for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < uniforms.d_comp; i++) {\n x[offset + i] = ${inputHelper.type.value}(uniforms.d_inv);\n }\n } else {\n for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < uniforms.d_comp; i++) {\n var f32input = ${f32Type}(x[offset + i]);\n x[offset + i] = ${inputHelper.type.value}(exp(f32input - max_value) / sum);\n }\n }\n }`;\n };\n\n return {\n name: 'AttentionProbsSoftmax',\n shaderCache: {hint: `${WG};${dataType};${components}`},\n getShaderSource,\n getRunData: () => ({outputs: [], dispatchGroup: {x: n}, programUniforms}),\n };\n};\n\nconst createAttentionProbsProgramInfo =\n (context: ComputeContext, q: TensorView, key: TensorView, pastKey: TensorView|undefined,\n relativePositionBias: TensorView|undefined, parameters: AttentionParameters, attributes: AttentionAttrs,\n pastSequenceLength: number) => {\n const totalSequenceLength = pastSequenceLength + parameters.kvSequenceLength;\n const probsShape = [parameters.batchSize, parameters.numHeads, parameters.sequenceLength, totalSequenceLength];\n const presentKey = parameters.kvNumHeads === undefined && context.outputCount > 1;\n const presentKeyShape = presentKey ?\n [parameters.batchSize, parameters.numHeads, totalSequenceLength, parameters.headSize] :\n undefined;\n\n // TODO: handle mask\n\n const alpha = attributes.scale === 0 ? 1.0 / Math.sqrt(parameters.headSize) : attributes.scale;\n const components = getMaxComponents(parameters.headSize);\n const vectorizedHeadSize = parameters.headSize / components;\n const TILE_SIZE = 12;\n const dispatch = {\n x: Math.ceil(totalSequenceLength / TILE_SIZE),\n y: Math.ceil(parameters.sequenceLength / TILE_SIZE),\n z: parameters.batchSize * parameters.numHeads\n };\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: parameters.sequenceLength}, {type: DataType.uint32, data: vectorizedHeadSize},\n {type: DataType.uint32, data: totalSequenceLength}, {type: DataType.uint32, data: parameters.numHeads},\n {type: DataType.float, data: alpha}, {type: DataType.uint32, data: pastSequenceLength},\n {type: DataType.uint32, data: parameters.kvSequenceLength}\n ];\n\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type'];\n if (pastKey) {\n inputDependencies.push('type');\n }\n if (relativePositionBias) {\n inputDependencies.push('type');\n }\n const outputs = [{dims: probsShape, dataType: q.dataType, gpuDataType: GpuDataType.default}];\n if (presentKey) {\n outputs.push({dims: presentKeyShape!, dataType: q.dataType, gpuDataType: GpuDataType.default});\n }\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const qInput = inputVariable('q', q.dataType, q.dims, components);\n const kInput = inputVariable('key', key.dataType, key.dims, components);\n const inputVars = [qInput, kInput];\n if (pastKey) {\n const pastKeyInput = inputVariable('past_key', pastKey.dataType, pastKey.dims, components);\n inputVars.push(pastKeyInput);\n }\n if (relativePositionBias) {\n inputVars.push(\n inputVariable('relative_position_bias', relativePositionBias.dataType, relativePositionBias.dims));\n }\n const output = outputVariable('output', q.dataType, probsShape);\n const outputVars = [output];\n if (presentKey) {\n outputVars.push(outputVariable('present_key', q.dataType, presentKeyShape!, components));\n }\n const f32Type = tensorTypeToWsglValueType(DataType.float, components);\n\n const uniforms: UniformsArrayType = [\n {name: 'M', type: 'u32'}, {name: 'K', type: 'u32'}, {name: 'N', type: 'u32'},\n {name: 'num_heads', type: 'u32'}, {name: 'alpha', type: 'f32' as UniformDataElementType},\n {name: 'past_sequence_length', type: 'u32'}, {name: 'kv_sequence_length', type: 'u32'}\n ];\n return `\n const TILE_SIZE = ${TILE_SIZE}u;\n\n var tileQ: array<${qInput.type.storage}, ${TILE_SIZE * TILE_SIZE}>;\n var tileK: array<${qInput.type.storage}, ${TILE_SIZE * TILE_SIZE}>;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVars, ...outputVars)}\n ${shaderHelper.mainStart([\n TILE_SIZE, TILE_SIZE, 1\n ])}\n // x holds the N and y holds the M\n let headIdx = workgroup_id.z;\n let m = workgroup_id.y * TILE_SIZE;\n let n = workgroup_id.x * TILE_SIZE;\n let qOffset = uniforms.M * uniforms.K * headIdx + m * uniforms.K;\n ${(() => {\n if (pastKey && presentKey) {\n return `\n let kOffset = uniforms.kv_sequence_length * uniforms.K * headIdx;\n let pastKeyOffset = uniforms.past_sequence_length * uniforms.K * headIdx;`;\n } else {\n return `\n let kOffset = uniforms.N * uniforms.K * headIdx + n * uniforms.K;`;\n }\n })()}\n ${presentKey ? 'let presentKeyOffset = headIdx * uniforms.N * uniforms.K;' : ''}\n var value = ${f32Type}(0);\n for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) {\n if (global_id.y < uniforms.M && w + local_id.x < uniforms.K) {\n tileQ[TILE_SIZE * local_id.y + local_id.x] = q[qOffset + local_id.y * uniforms.K + w + local_id.x];\n }\n if (n + local_id.y < uniforms.N && w + local_id.x < uniforms.K) {\n var idx = TILE_SIZE * local_id.y + local_id.x;\n ${(() => {\n if (pastKey && presentKey) {\n return `\n if (n + local_id.y < uniforms.past_sequence_length) {\n tileK[idx] = past_key[pastKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x];\n } else {\n tileK[idx] =\n key[kOffset + (n + local_id.y - uniforms.past_sequence_length) * uniforms.K + w + local_id.x];\n }`;\n } else {\n return 'tileK[idx] = key[kOffset + local_id.y * uniforms.K + w + local_id.x];';\n }\n })()}\n ${\n presentKey ?\n 'present_key[presentKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x] = tileK[idx];' :\n ''}\n }\n workgroupBarrier();\n\n for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) {\n value += ${f32Type}(tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * local_id.x + k]);\n }\n\n workgroupBarrier();\n }\n\n let headOffset = headIdx * uniforms.M * uniforms.N;\n if (global_id.y < uniforms.M && global_id.x < uniforms.N) {\n let outputIdx = headOffset + global_id.y * uniforms.N + global_id.x;\n var sum: f32 = ${(() => {\n switch (components) {\n case 1:\n return 'value';\n case 2:\n return 'value.x + value.y';\n case 4:\n return 'value.x + value.y + value.z + value.w';\n default:\n throw new Error(`Unsupported components: ${components}`);\n }\n })()};\n output[outputIdx] = ${output.type.value} (sum * uniforms.alpha) + ${\n relativePositionBias ? 'relative_position_bias[outputIdx]' : '0.0'};\n }\n }`;\n };\n return {\n name: 'AttentionProbs',\n shaderCache: {\n hint: `${components};${relativePositionBias !== undefined};${pastKey !== undefined};${context.outputCount}`,\n inputDependencies\n },\n getRunData: () => ({outputs, dispatchGroup: dispatch, programUniforms}),\n getShaderSource,\n };\n };\n\n\nconst createVxAttentionScoreProgramInfo =\n (context: ComputeContext, probs: TensorView, v: TensorView, pastValue: TensorView|undefined,\n params: AttentionParameters, pastSequenceLength: number) => {\n const totalSequenceLength = pastSequenceLength + params.kvSequenceLength;\n const nReps = params.nReps ? params.nReps : 1;\n const repeatedVHiddenSize = params.vHiddenSize * nReps;\n const presentValue = params.kvNumHeads == null && context.outputCount > 1;\n const presentValueShape =\n presentValue ? [params.batchSize, params.numHeads, totalSequenceLength, params.headSize] : undefined;\n const outputShape = [params.batchSize, params.sequenceLength, repeatedVHiddenSize];\n const TILE_SIZE = 12;\n const dispatch = {\n x: Math.ceil(params.vHeadSize / TILE_SIZE),\n y: Math.ceil(params.sequenceLength / TILE_SIZE),\n z: params.batchSize * params.numHeads\n };\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: params.sequenceLength}, {type: DataType.uint32, data: totalSequenceLength},\n {type: DataType.uint32, data: params.vHeadSize}, {type: DataType.uint32, data: params.numHeads},\n {type: DataType.uint32, data: repeatedVHiddenSize}, {type: DataType.uint32, data: pastSequenceLength},\n {type: DataType.uint32, data: params.kvSequenceLength}\n ];\n const inputDependencies: ProgramInputTensorInfoDependency[] =\n pastValue ? ['type', 'type', 'type'] : ['type', 'type'];\n const outputs = [{dims: outputShape, dataType: probs.dataType, gpuDataType: GpuDataType.default}];\n if (presentValue) {\n outputs.push({dims: presentValueShape!, dataType: probs.dataType, gpuDataType: GpuDataType.default});\n }\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const probsHelper = inputVariable('probs', probs.dataType, probs.dims);\n const vHelper = inputVariable('v', v.dataType, v.dims);\n const inputVars = [probsHelper, vHelper];\n if (pastValue) {\n inputVars.push(inputVariable('past_value', pastValue.dataType, pastValue.dims));\n }\n const output = outputVariable('output', probs.dataType, outputShape);\n const outputVars = [output];\n if (presentValue) {\n outputVars.push(outputVariable('present_value', probs.dataType, presentValueShape!));\n }\n const uniforms: UniformsArrayType = [\n {name: 'M', type: 'u32'}, {name: 'K', type: 'u32'}, {name: 'N', type: 'u32'},\n {name: 'num_heads', type: 'u32'}, {name: 'v_hidden_size', type: 'u32'},\n {name: 'past_sequence_length', type: 'u32'}, {name: 'kv_sequence_length', type: 'u32'}\n ];\n return `\n const TILE_SIZE = ${TILE_SIZE}u;\n var tileQ: array<${probsHelper.type.value}, ${TILE_SIZE * TILE_SIZE}>;\n var tileK: array<${probsHelper.type.value}, ${TILE_SIZE * TILE_SIZE}>;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVars, ...outputVars)}\n ${shaderHelper.mainStart([\n TILE_SIZE, TILE_SIZE, 1\n ])}\n let headIdx = workgroup_id.z;\n let m = global_id.y;\n let n = global_id.x;\n\n let offsetA = headIdx * (uniforms.M * uniforms.K) + m * uniforms.K;\n ${(() => {\n if (pastValue && presentValue) {\n return `\n let pastValueOffset = headIdx * uniforms.N * uniforms.past_sequence_length + n;\n let vOffset = headIdx * uniforms.N * uniforms.kv_sequence_length + n;\n `;\n } else {\n return `\n let offsetB = headIdx * uniforms.N * uniforms.K + n;\n `;\n }\n })()}\n ${presentValue ? 'let presentValueOffset = headIdx * uniforms.N * uniforms.K + n;' : ''}\n var value = ${probsHelper.type.storage}(0);\n for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) {\n if (m < uniforms.M && w + local_id.x < uniforms.K) {\n tileQ[TILE_SIZE * local_id.y + local_id.x] = probs[offsetA + w + local_id.x];\n }\n if (n < uniforms.N && w + local_id.y < uniforms.K) {\n var idx = TILE_SIZE * local_id.y + local_id.x;\n ${(() => {\n if (pastValue && presentValue) {\n return `\n if (w + local_id.y < uniforms.past_sequence_length) {\n tileK[idx] = past_value[pastValueOffset + (w + local_id.y) * uniforms.N];\n } else {\n tileK[idx] = v[vOffset + (w + local_id.y - uniforms.past_sequence_length) * uniforms.N];\n }\n `;\n } else {\n return `\n tileK[idx] = v[offsetB + (w + local_id.y) * uniforms.N];\n `;\n }\n })()}\n ${presentValue ? 'present_value[presentValueOffset + (w + local_id.y) * uniforms.N] = tileK[idx];' : ''}\n }\n workgroupBarrier();\n for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) {\n value += tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * k + local_id.x];\n }\n workgroupBarrier();\n }\n\n // we need to transpose output from BNSH_v to BSND_v\n let batchIdx = workgroup_id.z / uniforms.num_heads;\n let currentBatchHeadNumber = workgroup_id.z % uniforms.num_heads;\n if (m < uniforms.M && n < uniforms.N) {\n let outputIdx = batchIdx * uniforms.M * uniforms.v_hidden_size + m * uniforms.v_hidden_size\n + currentBatchHeadNumber * uniforms.N + n;\n output[outputIdx] = value;\n }\n }`;\n };\n\n return {\n name: 'AttentionScore',\n shaderCache: {hint: `${pastValue !== undefined};${context.outputCount}`, inputDependencies},\n getRunData: () => ({outputs, dispatchGroup: dispatch, programUniforms}),\n getShaderSource,\n };\n };\n\nexport const applyAttention =\n (context: ComputeContext, q: TensorView, k: TensorView, v: TensorView, _maskIndex: TensorView|undefined,\n _past: TensorView|undefined, pastKey: TensorView|undefined, pastValue: TensorView|undefined,\n relativePositionBias: TensorView|undefined, parameters: AttentionParameters, attributes: AttentionAttrs) => {\n const outputCount = context.outputCount;\n const pastSequenceLength =\n parameters.kvNumHeads !== undefined || outputCount > 1 ? parameters.pastSequenceLength : 0;\n const totalSequenceLength = pastSequenceLength + parameters.kvSequenceLength;\n\n const inputsK = (parameters.kvNumHeads === undefined && outputCount > 1 && pastKey) ? [q, k, pastKey] : [q, k];\n if (relativePositionBias) {\n inputsK.push(relativePositionBias);\n }\n\n // Run AttentionProbs\n const probs = context.compute(\n createAttentionProbsProgramInfo(\n context, q, k, outputCount > 1 ? pastKey : undefined, relativePositionBias, parameters, attributes,\n pastSequenceLength),\n {inputs: inputsK, outputs: (parameters.kvNumHeads === undefined && outputCount > 1) ? [-1, 1] : [-1]})[0];\n\n // Run Softmax\n context.compute(\n createInPlaceSoftmaxProgramInfo(\n context, probs, parameters.batchSize * parameters.numHeads * parameters.sequenceLength,\n totalSequenceLength),\n {inputs: [probs], outputs: []});\n\n // Run AttrionScore\n const inputsV =\n (parameters.kvNumHeads === undefined && outputCount > 1 && pastValue) ? [probs, v, pastValue] : [probs, v];\n context.compute(\n createVxAttentionScoreProgramInfo(\n context, probs, v, outputCount > 1 && pastValue ? pastValue : undefined, parameters, pastSequenceLength),\n {inputs: inputsV, outputs: (parameters.kvNumHeads === undefined && outputCount > 1) ? [0, 2] : [0]});\n };\n\nconst prepare = (context: ComputeContext, parameters: AttentionParameters) => {\n const outputShape = [\n parameters.batchSize,\n parameters.numHeads,\n parameters.sequenceLength,\n parameters.headSize,\n ];\n const M = parameters.sequenceLength;\n const K = parameters.inputHiddenSize;\n const N = parameters.headSize;\n const TILE_SIZE = 12;\n const dispatch = {\n x: Math.ceil(parameters.headSize / TILE_SIZE),\n y: Math.ceil(parameters.sequenceLength / TILE_SIZE),\n z: parameters.batchSize * parameters.numHeads\n };\n const inputs = [context.inputs[0], context.inputs[1], context.inputs[2]];\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: M}, {type: DataType.uint32, data: K}, {type: DataType.uint32, data: N},\n {type: DataType.uint32, data: parameters.numHeads}, {type: DataType.uint32, data: parameters.headSize},\n {type: DataType.uint32, data: parameters.hiddenSize},\n {type: DataType.uint32, data: parameters.hiddenSize + parameters.hiddenSize + parameters.vHiddenSize}\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const outputQ = outputVariable('output_q', inputs[0].dataType, outputShape);\n const outputK = outputVariable('output_k', inputs[0].dataType, outputShape);\n const outputV = outputVariable('output_v', inputs[0].dataType, outputShape);\n const input = inputVariable('input', inputs[0].dataType, inputs[0].dims);\n const weight = inputVariable('weight', inputs[1].dataType, inputs[1].dims);\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims);\n const dataType = input.type.storage;\n\n const uniforms: UniformsArrayType = [\n {name: 'M', type: 'u32'}, {name: 'K', type: 'u32'}, {name: 'N', type: 'u32'}, {name: 'num_heads', type: 'u32'},\n {name: 'head_size', type: 'u32'}, {name: 'hidden_size', type: 'u32'}, {name: 'ldb', type: 'u32'}\n ];\n return `\n const TILE_SIZE = ${TILE_SIZE}u;\n var tileInput: array<${dataType}, ${TILE_SIZE * TILE_SIZE}>;\n var tileWeightQ: array<${dataType}, ${TILE_SIZE * TILE_SIZE}>;\n var tileWeightK: array<${dataType}, ${TILE_SIZE * TILE_SIZE}>;\n var tileWeightV: array<${dataType}, ${TILE_SIZE * TILE_SIZE}>;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(input, weight, bias, outputQ, outputK, outputV)}\n ${shaderHelper.mainStart([\n TILE_SIZE, TILE_SIZE, 1\n ])}\n let batchIndex = workgroup_id.z / uniforms.num_heads;\n let headNumber = workgroup_id.z % uniforms.num_heads;\n let m = global_id.y;\n let n = global_id.x;\n\n let inputOffset = batchIndex * (uniforms.M * uniforms.K) + m * uniforms.K;\n let biasOffsetQ = headNumber * uniforms.head_size;\n let biasOffsetK = uniforms.hidden_size + biasOffsetQ;\n let biasOffsetV = uniforms.hidden_size + biasOffsetK;\n\n var valueQ = ${dataType}(0);\n var valueK = ${dataType}(0);\n var valueV = ${dataType}(0);\n for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) {\n if (m < uniforms.M && w + local_id.x < uniforms.K) {\n tileInput[TILE_SIZE * local_id.y + local_id.x] = input[inputOffset + w + local_id.x];\n }\n if (n < uniforms.N && w + local_id.y < uniforms.K) {\n let offset = n + (w + local_id.y) * uniforms.ldb;\n tileWeightQ[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetQ + offset];\n tileWeightK[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetK + offset];\n tileWeightV[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetV + offset];\n }\n workgroupBarrier();\n for (var k: u32 = 0u; k ({\n outputs: [\n {dims: outputShape, dataType: context.inputs[0].dataType, gpuDataType: GpuDataType.default},\n {dims: outputShape, dataType: context.inputs[0].dataType, gpuDataType: GpuDataType.default},\n {dims: outputShape, dataType: context.inputs[0].dataType, gpuDataType: GpuDataType.default},\n ],\n dispatchGroup: dispatch,\n programUniforms\n }),\n getShaderSource,\n },\n {inputs, outputs: [-1, -1, -1]});\n};\n\nexport const attention = (context: ComputeContext, attributes: AttentionAttrs): void => {\n const params = validateAttentionInputs(context.inputs, attributes);\n\n const [q, k, v] = prepare(context, params);\n\n return applyAttention(\n context, q, k, v, context.inputs[4], undefined, undefined, undefined, context.inputs[5], params, attributes);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, getMaxComponents, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface BatchNormAttributes extends AttributeWithCacheKey {\n readonly epsilon: number;\n readonly momentum: number;\n readonly spatial: boolean;\n readonly trainingMode: boolean;\n readonly format: 'NHWC'|'NCHW';\n readonly outputCount: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: BatchNormAttributes): void => {\n if (!inputs || inputs.length !== 5) {\n throw new Error('BatchNormalization requires 5 inputs');\n }\n\n const checkShapeEqual = (actual: readonly number[], expected: readonly number[], message: string) => {\n const r = expected.length;\n if (r !== actual.length) {\n throw new Error(`${message}: num dimensions != ${r}`);\n }\n expected.forEach((v, i) => {\n if (v !== actual[i]) {\n throw new Error(`${message}: dim[${i}] do not match`);\n }\n });\n };\n\n if (inputs[0].dims.length > 1) {\n const shape = attributes.format === 'NHWC' ?\n (attributes.spatial ? inputs[0].dims.slice(-1) :\n inputs[0].dims.slice(-1).concat(inputs[0].dims.slice(1, inputs[0].dims.length - 1))) :\n inputs[0].dims.slice(1, attributes.spatial ? 2 : undefined);\n checkShapeEqual(inputs[1].dims, shape, 'Invalid input scale');\n checkShapeEqual(inputs[2].dims, shape, 'Invalid input B');\n checkShapeEqual(inputs[3].dims, shape, 'Invalid input mean');\n checkShapeEqual(inputs[4].dims, shape, 'Invalid input var');\n } else {\n checkShapeEqual(inputs[1].dims, [1], 'Invalid input scale');\n checkShapeEqual(inputs[2].dims, [1], 'Invalid input B');\n checkShapeEqual(inputs[3].dims, [1], 'Invalid input mean');\n checkShapeEqual(inputs[4].dims, [1], 'Invalid input var');\n }\n};\n\nconst createBatchNormInferenceProgramInfo =\n (inputs: readonly TensorView[], attributes: BatchNormAttributes): ProgramInfo => {\n const {epsilon, spatial, format} = attributes;\n const yShape = inputs[0].dims;\n const components = spatial ? getMaxComponents(yShape[yShape.length - 1]) : 1;\n const cComponents = format === 'NHWC' && yShape.length > 1 ? components : 1;\n const outputSize = ShapeUtil.size(yShape) / components;\n // Only support uniforms for opset version >= 9 (spatial = true).\n const useShapesUniforms = spatial;\n const shapeOrRank = useShapesUniforms ? yShape.length : yShape;\n const x = inputVariable('x', inputs[0].dataType, inputs[0].dims, components);\n const scale = inputVariable('scale', inputs[1].dataType, inputs[1].dims, cComponents);\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims, cComponents);\n const inputMean = inputVariable('inputMean', inputs[3].dataType, inputs[3].dims, cComponents);\n const inputVar = inputVariable('inputVar', inputs[4].dataType, inputs[4].dims, cComponents);\n const y = outputVariable('y', inputs[0].dataType, shapeOrRank, components);\n // TODO: support inputs with different data type. Current we need to make sure all inputs have the same data type.\n // Otherwise, the shader compilation will fail.\n const calcCOffset = (): string => {\n let cOffset = '';\n if (spatial) {\n cOffset = `let cOffset = ${\n yShape.length === 1 ? '0u' :\n format === 'NHWC' ? `outputIndices[${yShape.length - 1}] / ${components}` :\n 'outputIndices[1]'};`;\n } else {\n if (format === 'NCHW') {\n cOffset = `\n ${y.indicesSet('outputIndices', '0', '0')}\n let cOffset = ${y.indicesToOffset('outputIndices')};`;\n } else {\n // update C channel.\n cOffset = `var cIndices = ${scale.type.indices}(0);\n cIndices[0] = outputIndices[${yShape.length - 1}];`;\n // update D1 x ... x Dn channels.\n for (let i = 1; i < scale.rank; i++) {\n cOffset += `cIndices[${i}] = outputIndices[${i}];`;\n }\n cOffset += `let cOffset = ${scale.indicesToOffset('cIndices')};`;\n }\n }\n return cOffset;\n };\n const getInferenceModeShaderSource = (helper: ShaderHelper) => `\n const epsilon = ${epsilon};\n ${helper.registerUniform('outputSize', 'u32').declareVariables(x, scale, bias, inputMean, inputVar, y)}\n ${helper.mainStart()}\n ${helper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n var outputIndices = ${y.offsetToIndices(`global_idx * ${components}`)};\n ${calcCOffset()}\n let scale = ${scale.getByOffset('cOffset')};\n let bias = ${bias.getByOffset('cOffset')};\n let inputMean = ${inputMean.getByOffset('cOffset')};\n let inputVar = ${inputVar.getByOffset('cOffset')};\n let x = ${x.getByOffset('global_idx')};\n let value = (x - inputMean) * inverseSqrt(inputVar + epsilon) * scale + bias;\n ${y.setByOffset('global_idx', 'value')}\n }`;\n return {\n name: 'BatchNormalization',\n shaderCache: {\n hint: `${attributes.epsilon}_${attributes.format}_${spatial}_${components}`,\n inputDependencies: useShapesUniforms ? ['rank', 'type', 'type', 'type', 'type'] : undefined,\n },\n getShaderSource: getInferenceModeShaderSource,\n getRunData: () => ({\n outputs: [{dims: inputs[0].dims, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms: useShapesUniforms ?\n [\n {type: DataType.uint32, data: outputSize},\n ...createTensorShapeVariables(yShape),\n ] :\n [\n {type: DataType.uint32, data: outputSize},\n ],\n }),\n };\n };\n\nexport const parseBatchNormAttributes = (attributes: Record): BatchNormAttributes =>\n createAttributeWithCacheKey(attributes as Omit);\n\nexport const batchNorm = (context: ComputeContext, attributes: Record): void => {\n const {inputs, outputCount} = context;\n const updatedAttributes = parseBatchNormAttributes({...attributes, outputCount});\n if (env.webgpu.validateInputContent) {\n validateInputs(inputs, updatedAttributes);\n }\n if (attributes.trainingMode) {\n throw new Error('BatchNormalization trainingMode is not supported yet.');\n } else {\n context.compute(createBatchNormInferenceProgramInfo(inputs, updatedAttributes));\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper} from './common';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (inputs[0].dims.length !== 3) {\n throw new Error('input should have 3 dimensions');\n }\n\n if (![320, 640, 1280].includes(inputs[0].dims[2])) {\n throw new Error('number of channels should be 320, 640 or 1280');\n }\n\n if (inputs[1].dims.length !== 1) {\n throw new Error('bias is expected to have 1 dimensions');\n }\n\n if (inputs[0].dims[2] !== inputs[1].dims[0]) {\n throw new Error('last dimension of input and bias are not the same');\n }\n};\n\nconst createBiasAddProgramInfo = (inputs: readonly TensorView[]): ProgramInfo => {\n const outputShape = inputs[0].dims;\n\n const channels = inputs[0].dims[2];\n // since channel number can be only 320/640/1280, it's always divisable by 4\n const outputSize = ShapeUtil.size(outputShape) / 4;\n\n const dataType = inputs[0].dataType;\n const input = inputVariable('input', dataType, outputShape, 4);\n const bias = inputVariable('bias', dataType, [channels], 4);\n const residual = inputVariable('residual', dataType, outputShape, 4);\n const output = outputVariable('output', dataType, outputShape, 4);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n const channels = ${channels}u / 4;\n ${shaderHelper.declareVariables(input, bias, residual, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes(outputSize)}\n let value = ${input.getByOffset('global_idx')}\n + ${bias.getByOffset('global_idx % channels')} + ${residual.getByOffset('global_idx')};\n ${output.setByOffset('global_idx', 'value')}\n }`;\n\n return {\n name: 'BiasAdd',\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)}\n }),\n getShaderSource,\n };\n};\n\nexport const biasAdd = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n context.compute(createBiasAddProgramInfo(context.inputs));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {MAX_CLIP, MIN_CLIP, ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglValueType} from './common';\n\ntype BuiltinFunctionName = string;\ntype ElementwiseCustomExpression = (expression: string) => string;\ntype ElementwiseFunctionCall = BuiltinFunctionName|ElementwiseCustomExpression;\n\nconst createElementwiseProgramShader =\n (shaderHelper: ShaderHelper, datasize: number, inputDataType: number, outputDataType: number,\n funcCall: ElementwiseFunctionCall, additionalImplementation?: string): string => {\n const vecSize = Math.ceil(datasize / 4);\n\n let expression = '';\n if (typeof funcCall === 'string') {\n expression = `${funcCall}(a)`;\n } else {\n expression = funcCall('a');\n }\n\n const input = inputVariable('inputData', inputDataType, [vecSize], 4);\n const output = outputVariable('outputData', outputDataType, [vecSize], 4);\n\n return `\n ${shaderHelper.registerUniform('vec_size', 'u32').declareVariables(input, output)}\n\n ${additionalImplementation ?? ''}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.vec_size')}\n\n let a = ${input.getByOffset('global_idx')};\n ${output.setByOffset('global_idx', expression)}\n }`;\n };\n\nconst createElementwiseProgramInfo =\n (input: TensorView, name: string, funcCall: ElementwiseFunctionCall, additionalImplementation?: string,\n cacheKey?: string, outputDataType: number = input.dataType): ProgramInfo => ({\n name,\n shaderCache: {hint: cacheKey, inputDependencies: ['type']},\n getShaderSource: shaderHelper => createElementwiseProgramShader(\n shaderHelper, ShapeUtil.size(input.dims), input.dataType, outputDataType, funcCall, additionalImplementation),\n getRunData: (inputTensors) => ({\n outputs: [{dims: input.dims, dataType: outputDataType}],\n dispatchGroup:\n {x: Math.ceil(ShapeUtil.size(inputTensors[0].dims) / 64 /* workgroup size */ / 4 /* vec size */)},\n programUniforms: [\n {type: DataType.uint32, data: Math.ceil(ShapeUtil.size(input.dims) / 4)},\n ],\n })\n });\n\nexport const abs = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Abs', 'abs'));\n};\n\nexport const acos = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Acos', 'acos'));\n};\n\nexport const acosh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Acosh', 'acosh'));\n};\n\nexport const asin = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Asin', 'asin'));\n};\n\nexport const asinh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Asinh', 'asinh'));\n};\n\nexport const atan = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Atan', 'atan'));\n};\nexport const atanh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Atanh', 'atanh'));\n};\n\nexport interface CastAttributes extends AttributeWithCacheKey {\n readonly to: number;\n readonly saturate?: boolean;\n}\n\nexport const parseCastAttributes = (attributes: Record): CastAttributes =>\n createAttributeWithCacheKey(attributes as {to: number});\n\n\nexport const cast = (context: ComputeContext, attributes: CastAttributes): void => {\n let func: ElementwiseFunctionCall;\n switch (attributes.to) {\n case DataType.float16:\n func = 'vec4';\n break;\n case DataType.float:\n func = 'vec4';\n break;\n case DataType.uint32:\n func = 'vec4';\n break;\n case DataType.int32:\n func = 'vec4';\n break;\n case DataType.bool:\n func = 'vec4';\n break;\n default:\n throw new RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${attributes.to}`);\n }\n context.compute(\n createElementwiseProgramInfo(context.inputs[0], 'Cast', func, undefined, attributes.cacheKey, attributes.to));\n};\n\nexport interface ClipAttributes extends AttributeWithCacheKey {\n readonly min: number;\n readonly max: number;\n}\n\nconst generateClipAttributesFromInputs = (inputs: readonly TensorView[]): ClipAttributes => {\n const min = (inputs.length >= 2 && inputs[1].data !== 0) ? inputs[1].getFloat32Array()[0] : MIN_CLIP;\n const max = (inputs.length >= 3 && inputs[2].data !== 0) ? inputs[2].getFloat32Array()[0] : MAX_CLIP;\n return createAttributeWithCacheKey({min, max});\n};\n\nexport const clip = (context: ComputeContext, clipAttributes: ClipAttributes): void => {\n const attributes = context.inputs.length === 1 ? clipAttributes : generateClipAttributesFromInputs(context.inputs);\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(\n createElementwiseProgramInfo(\n context.inputs[0], 'Clip', a => `clamp(${a}, clip_min_, clip_max_)`, `\n const clip_min_: vec4<${dataType}> = vec4(${dataType}(${attributes.min}));\n const clip_max_: vec4<${dataType}> = vec4(${dataType}(${attributes.max}));\n`,\n attributes.cacheKey),\n {inputs: [0]});\n};\n\nexport const ceil = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Ceil', 'ceil'));\n};\n\nexport const cos = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Cos', 'cos'));\n};\n\nexport const cosh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Cosh', 'cosh'));\n};\n\nexport interface AlphaAttributes extends AttributeWithCacheKey {\n readonly alpha: number;\n}\n\nexport const parseAlphaAttributes = (attributes: Record): AlphaAttributes =>\n createAttributeWithCacheKey(attributes as {alpha: number});\n\nexport const elu = (context: ComputeContext, attributes: AlphaAttributes): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'Elu', a => `elu_vf32(${a})`, `\n const elu_alpha_ = ${dataType}(${attributes.alpha});\n\n fn elu_f32(a: ${dataType}) -> ${dataType} {\n return select((exp(a) - 1.0) * elu_alpha_, a, a >= 0.0);\n }\n\n fn elu_vf32(v: vec4<${dataType}>) -> vec4<${dataType}> {\n return vec4(elu_f32(v.x), elu_f32(v.y), elu_f32(v.z), elu_f32(v.w));\n }`,\n attributes.cacheKey));\n};\n\nexport const erfImpl = (varType = 'f32') => `\nconst r0: ${varType} = 0.3275911;\nconst r1: ${varType} = 0.254829592;\nconst r2: ${varType} = -0.284496736;\nconst r3: ${varType} = 1.421413741;\nconst r4: ${varType} = -1.453152027;\nconst r5: ${varType} = 1.061405429;\n\nfn erf_vf32(v: vec4<${varType}>) -> vec4<${varType}> {\n let absv = abs(v);\n let x = 1.0 / (1.0 + r0 * absv);\n return sign(v) * (1.0 - ((((r5 * x + r4) * x + r3) * x + r2) * x + r1) * x * exp(-absv * absv));\n}`;\n\nexport const erf = (context: ComputeContext): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Erf', a => `erf_vf32(${a})`, erfImpl(dataType)));\n};\n\nexport const exp = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Exp', 'exp'));\n};\n\nexport const floor = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Floor', 'floor'));\n};\n\nexport const gelu = (context: ComputeContext): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'Gelu', a => `0.5 * ${a} * (1.0 + erf_vf32(${a} * 0.7071067811865475))`, erfImpl(dataType)));\n};\n\nexport const leakyRelu = (context: ComputeContext, attributes: AlphaAttributes): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'LeakyRelu', a => `select(leaky_relu_alpha_ * ${a}, ${a}, ${a} >= vec4<${dataType}>(0.0))`,\n `const leaky_relu_alpha_ = ${dataType}(${attributes.alpha});`, attributes.cacheKey));\n};\n\nexport const not = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Not', a => `!${a}`));\n};\n\nexport const neg = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Neg', a => `-${a}`));\n};\n\nexport const reciprocal = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Reciprocal', a => `1.0/${a}`));\n};\n\nexport const relu = (context: ComputeContext): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'Relu', a => `select(vec4<${dataType}>(0.0), ${a}, ${a} > vec4<${dataType}>(0.0))`));\n};\n\nexport const sigmoid = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Sigmoid', a => `(1.0 / (1.0 + exp(-${a})))`));\n};\n\nexport interface HardSigmoidAttributes extends AttributeWithCacheKey {\n readonly alpha: number;\n readonly beta: number;\n}\n\nexport const parseHardSigmoidAttributes = (attributes: Record): HardSigmoidAttributes =>\n createAttributeWithCacheKey(attributes as {\n alpha: number;\n beta: number;\n });\n\nexport const hardSigmoid = (context: ComputeContext, attributes: HardSigmoidAttributes): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'HardSigmoid',\n a => `max(vec4<${dataType}>(0.0), min(vec4<${dataType}>(1.0), ${attributes.alpha} * ${a} + vec4<${dataType}>(${\n attributes.beta})))`,\n undefined, attributes.cacheKey));\n};\n\nexport const sin = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Sin', 'sin'));\n};\n\nexport const sinh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Sinh', 'sinh'));\n};\n\nexport const sqrt = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Sqrt', 'sqrt'));\n};\n\nexport const tan = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Tan', 'tan'));\n};\n\nexport const tanhExpression = (a: string) => `sign(${a}) * (1 - exp(-2 * abs(${a}))) / (1 + exp(-2 * abs(${a})))`;\n\nexport const tanh = (context: ComputeContext): void => {\n // TODO: revisit after https://github.com/gpuweb/gpuweb/issues/4458 is resolved\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Tanh', tanhExpression));\n};\n\nexport const fastGeluImpl = (varType = 'f32') => `\nconst fast_gelu_a: ${varType} = 0.5;\nconst fast_gelu_b: ${varType} = 0.7978845608028654;\nconst fast_gelu_c: ${varType} = 0.035677408136300125;\n\nfn tanh_v(v: vec4<${varType}>) -> vec4<${varType}> {\n return ${tanhExpression('v')};\n}\n`;\n\nexport const fastGeluExpression = (x: string) =>\n `(fast_gelu_a + fast_gelu_a * tanh_v(${x} * (fast_gelu_c * ${x} * ${x} + fast_gelu_b))) * ${x}`;\n\nexport const fastGelu = (context: ComputeContext): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'FastGelu', fastGeluExpression, fastGeluImpl(dataType), undefined,\n context.inputs[0].dataType));\n};\n\nexport const thresholdedRelu = (context: ComputeContext, attributes: AlphaAttributes): number => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'ThresholdedRelu', a => `select(vec4<${dataType}>(0.0), ${a}, ${a} > thresholded_relu_alpha_)`,\n `const thresholded_relu_alpha_ = vec4<${dataType}>(${attributes.alpha});`, attributes.cacheKey));\n return 0;\n};\n\nexport const log = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Log', 'log'));\n};\n\nexport const quickGeluImpl = (varType: string, alpha: number) => `\nconst alpha = vec4<${varType}>(${alpha});\nconst one = ${varType}(1.0);\nconst zero = ${varType}(0.0);\n\nfn quick_gelu_impl(x: vec4<${varType}>) -> vec4<${varType}> {\n let v = x *alpha;\n var x1 : vec4<${varType}>;\n for (var i = 0; i < 4; i = i + 1) {\n if (v[i] >= zero) {\n x1[i] = one / (one + exp(-v[i]));\n } else {\n x1[i] = one - one / (one + exp(v[i]));\n }\n }\n return x * x1;\n}\n`;\n\nexport const quickGeluExpression = (x: string) => `quick_gelu_impl(${x})`;\n\nexport const quickgelu = (context: ComputeContext, attributes: AlphaAttributes): void => {\n const dType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'QuickGelu', quickGeluExpression, quickGeluImpl(dType, attributes.alpha), attributes.cacheKey,\n context.inputs[0].dataType));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType} from './common';\nimport {erfImpl} from './unary-op';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (inputs[0].dims.length !== 3) {\n throw new Error('input should have 3 dimensions');\n }\n\n if (![2560, 5120, 10240].includes(inputs[0].dims[2])) {\n throw new Error('hidden state should be 2560, 5120 or 10240');\n }\n\n if (inputs[1].dims.length !== 1) {\n throw new Error('bias is expected to have 1 dimensions');\n }\n\n if (inputs[0].dims[2] !== inputs[1].dims[0]) {\n throw new Error('last dimension of input and bias are not the same');\n }\n};\n\nconst createBiasSplitGeluProgramInfo = (inputs: readonly TensorView[]): ProgramInfo => {\n const outputShape = inputs[0].dims.slice();\n outputShape[2] = outputShape[2] / 2;\n\n const input = inputVariable('input', inputs[0].dataType, inputs[0].dims, 4);\n const bias = inputVariable('bias', inputs[0].dataType, [inputs[0].dims[2]], 4);\n const output = outputVariable('output', inputs[0].dataType, outputShape, 4);\n\n const outputSize = ShapeUtil.size(outputShape) / 4;\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n const M_SQRT2 = sqrt(2.0);\n const halfChannels = ${inputs[0].dims[2] / 4 / 2}u;\n\n ${shaderHelper.declareVariables(input, bias, output)}\n\n ${erfImpl(dataType)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes(outputSize)}\n let biasIdx = global_idx % halfChannels;\n let batchIndex = global_idx / halfChannels;\n let inputOffset = biasIdx + batchIndex * halfChannels * 2;\n let valueLeft = input[inputOffset] + bias[biasIdx];\n let valueRight = input[inputOffset + halfChannels] + bias[biasIdx + halfChannels];\n let geluRight = valueRight * 0.5 * (erf_vf32(valueRight / M_SQRT2) + 1);\n\n ${output.setByOffset('global_idx', 'valueLeft * geluRight')}\n }`;\n\n return {\n name: 'BiasSplitGelu',\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)}\n }),\n getShaderSource,\n };\n};\n\nexport const biasSplitGelu = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n context.compute(createBiasSplitGeluProgramInfo(context.inputs));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {BroadcastUtil, ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\ntype BuiltinFunctionName = string;\ntype BinaryCustomExpression = (expressionA: string, expressionB: string) => string;\ntype BinaryFunctionCall = BuiltinFunctionName|BinaryCustomExpression|{\n scalar: BinaryCustomExpression;\n vector: BinaryCustomExpression;\n};\n\nconst createBinaryOpProgramShader =\n (shaderHelper: ShaderHelper, dimsA: readonly number[], dimsB: readonly number[], dimsOutput: readonly number[],\n vectorize: boolean, doBroadcast: boolean, sharedDimensionDivisibleBy4: boolean, funcCall: BinaryFunctionCall,\n typeA: number, typeB: number, typeOutput: number, additionalImplementation?: string) => {\n let expressionScalar: BinaryCustomExpression;\n let expressionVector: BinaryCustomExpression;\n if (typeof funcCall === 'string') {\n expressionScalar = expressionVector = (a, b) => `${funcCall}((${a}),(${b}))`;\n } else if (typeof funcCall === 'function') {\n expressionScalar = expressionVector = funcCall;\n } else {\n expressionScalar = funcCall.scalar;\n expressionVector = funcCall.vector;\n }\n\n const output = outputVariable('outputData', typeOutput, dimsOutput.length, 4);\n const a = inputVariable('aData', typeA, dimsA.length, 4);\n const b = inputVariable('bData', typeB, dimsB.length, 4);\n\n let assignment: string;\n if (vectorize) {\n if (doBroadcast) {\n const isAOneElement = ShapeUtil.size(dimsA) === 1;\n const isBOneElement = ShapeUtil.size(dimsB) === 1;\n const aLastDimDivisibleBy4 = dimsA.length > 0 && dimsA[dimsA.length - 1] % 4 === 0;\n const bLastDimDivisibleBy4 = dimsB.length > 0 && dimsB[dimsB.length - 1] % 4 === 0;\n if (isAOneElement || isBOneElement) {\n assignment = output.setByOffset(\n 'global_idx',\n expressionVector(\n isAOneElement ? `${a.type.value}(${a.getByOffset('0')}.x)` : a.getByOffset('global_idx'),\n isBOneElement ? `${b.type.value}(${b.getByOffset('0')}.x)` : b.getByOffset('global_idx')));\n } else {\n assignment = `\n let outputIndices = ${output.offsetToIndices('global_idx * 4u')};\n let offsetA = ${a.broadcastedIndicesToOffset('outputIndices', output)};\n let offsetB = ${b.broadcastedIndicesToOffset('outputIndices', output)};\n ${\n output.setByOffset(\n 'global_idx',\n expressionVector(\n sharedDimensionDivisibleBy4 || aLastDimDivisibleBy4 ?\n a.getByOffset('offsetA / 4u') :\n `${a.type.value}(${a.getByOffset('offsetA / 4u')}[offsetA % 4u])`,\n sharedDimensionDivisibleBy4 || bLastDimDivisibleBy4 ?\n b.getByOffset('offsetB / 4u') :\n `${b.type.value}(${b.getByOffset('offsetB / 4u')}[offsetB % 4u])`))}\n `;\n }\n } else {\n assignment = output.setByOffset(\n 'global_idx', expressionVector(a.getByOffset('global_idx'), b.getByOffset('global_idx')));\n }\n } else {\n if (!doBroadcast) {\n throw new Error('no necessary to use scalar implementation for element-wise binary op implementation.');\n }\n\n const singleAssignment = (resStr: string, x: number, typeCast = '') => {\n const expressionA = `aData[indexA${x}][componentA${x}]`;\n const expressionB = `bData[indexB${x}][componentB${x}]`;\n return `\n let outputIndices${x} = ${output.offsetToIndices(`global_idx * 4u + ${x}u`)};\n let offsetA${x} = ${a.broadcastedIndicesToOffset(`outputIndices${x}`, output)};\n let offsetB${x} = ${b.broadcastedIndicesToOffset(`outputIndices${x}`, output)};\n let indexA${x} = offsetA${x} / 4u;\n let indexB${x} = offsetB${x} / 4u;\n let componentA${x} = offsetA${x} % 4u;\n let componentB${x} = offsetB${x} % 4u;\n ${resStr}[${x}] = ${typeCast}(${expressionScalar(expressionA, expressionB)});\n `;\n };\n if (typeOutput === DataType.bool) {\n assignment = `\n var data = vec4(0);\n ${singleAssignment('data', 0, 'u32')}\n ${singleAssignment('data', 1, 'u32')}\n ${singleAssignment('data', 2, 'u32')}\n ${singleAssignment('data', 3, 'u32')}\n outputData[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`;\n } else {\n assignment = `\n ${singleAssignment('outputData[global_idx]', 0)}\n ${singleAssignment('outputData[global_idx]', 1)}\n ${singleAssignment('outputData[global_idx]', 2)}\n ${singleAssignment('outputData[global_idx]', 3)}\n `;\n }\n }\n\n return `\n ${shaderHelper.registerUniform('vec_size', 'u32').declareVariables(a, b, output)}\n\n ${additionalImplementation ?? ''}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.vec_size')}\n ${assignment}\n }`;\n };\n\nconst createBinaryOpProgramInfo =\n (name: string, cacheKey: string, a: TensorView, b: TensorView, funcCall: BinaryFunctionCall,\n additionalImplementation?: string, outputDataType: number = a.dataType): ProgramInfo => {\n const isBroadcast = !ShapeUtil.areEqual(a.dims, b.dims);\n let outputShape = a.dims;\n let outputSize = ShapeUtil.size(a.dims);\n\n let vectorize = false;\n let sharedDimensionDivisibleBy4 = false;\n\n // TODO: deal with zero-sized tensors (eg. dims=[1,0])\n const cacheKeyAux = [isBroadcast];\n if (isBroadcast) {\n const calculatedShape = BroadcastUtil.calcShape(a.dims, b.dims, false);\n if (!calculatedShape) {\n throw new Error('Can\\'t perform binary op on the given tensors');\n }\n outputShape = calculatedShape;\n outputSize = ShapeUtil.size(outputShape);\n const isAOneElement = ShapeUtil.size(a.dims) === 1;\n const isBOneElement = ShapeUtil.size(b.dims) === 1;\n const aLastDimDivisibleBy4 = a.dims.length > 0 && a.dims[a.dims.length - 1] % 4 === 0;\n const bLastDimDivisibleBy4 = b.dims.length > 0 && b.dims[b.dims.length - 1] % 4 === 0;\n cacheKeyAux.push(isAOneElement);\n cacheKeyAux.push(isBOneElement);\n cacheKeyAux.push(aLastDimDivisibleBy4);\n cacheKeyAux.push(bLastDimDivisibleBy4);\n // check whether vectorize can be enabled\n let sharedDimension = 1;\n for (let i = 1; i < outputShape.length; i++) {\n const dimA = a.dims[a.dims.length - i] ?? 1;\n const dimB = b.dims[b.dims.length - i] ?? 1;\n if (dimA === dimB) {\n sharedDimension *= dimA;\n } else {\n break;\n }\n }\n if (sharedDimension % 4 === 0) {\n sharedDimensionDivisibleBy4 = true;\n vectorize = true;\n } else if (isAOneElement || isBOneElement || aLastDimDivisibleBy4 || bLastDimDivisibleBy4) {\n vectorize = true;\n }\n } else {\n // element-wise\n vectorize = true;\n }\n cacheKeyAux.push(vectorize);\n\n return {\n name,\n shaderCache: {\n hint: cacheKey + cacheKeyAux.map((x) => x.toString()).join('_'),\n inputDependencies: ['rank', 'rank'],\n },\n getShaderSource: (shaderHelper) => createBinaryOpProgramShader(\n shaderHelper, a.dims, b.dims, outputShape, vectorize, isBroadcast, sharedDimensionDivisibleBy4, funcCall,\n a.dataType, b.dataType, outputDataType, additionalImplementation),\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: outputDataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */ / 4 /* component size */)},\n programUniforms: [\n {type: DataType.uint32, data: Math.ceil(ShapeUtil.size(outputShape) / 4)},\n ...createTensorShapeVariables(a.dims, b.dims, outputShape)\n ],\n }),\n };\n };\n\nconst runBinaryOp =\n (context: ComputeContext, name: string, funcCall: BinaryFunctionCall, additionalImplementation?: string,\n cacheKey?: string, outputDataType?: number): void => {\n context.compute(createBinaryOpProgramInfo(\n name, cacheKey ?? '', context.inputs[0], context.inputs[1], funcCall, additionalImplementation,\n outputDataType));\n };\n\nexport const add = (context: ComputeContext): void => {\n runBinaryOp(context, 'Add', (a, b) => `${a}+${b}`);\n};\n\nexport const div = (context: ComputeContext): void => {\n runBinaryOp(context, 'Div', (a, b) => `${a}/${b}`);\n};\n\nexport const equal = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'Equal', ({scalar: (a, b) => `u32(${a}==${b})`, vector: (a, b) => `vec4(${a}==${b})`}), undefined,\n undefined, DataType.bool);\n};\n\nexport const mul = (context: ComputeContext): void => {\n runBinaryOp(context, 'Mul', (a, b) => `${a}*${b}`);\n};\n\nexport const pow = (context: ComputeContext): void => {\n const type = inputVariable('input', context.inputs[0].dataType, context.inputs[0].dims).type.value;\n const roundStr = type === 'i32' ? 'round' : '';\n runBinaryOp(\n context, 'Pow', ({scalar: (a, b) => `pow_custom(${a},${b})`, vector: (a, b) => `pow_vector_custom(${a},${b})`}),\n `\n fn pow_custom(a : ${type}, b : ${type}) -> ${type} {\n if (b == ${type}(0.0)) {\n return ${type}(1.0);\n } else if (a < ${type}(0.0) && f32(b) != floor(f32(b))) {\n return ${type}(pow(f32(a), f32(b))); // NaN\n }\n return select(sign(a), ${type}(1.0), round(f32(abs(b) % ${type}(2.0))) != 1.0) * ${type}(${\n roundStr}(pow(f32(abs(a)), f32(b))));\n }\n fn pow_vector_custom(a : vec4<${type}>, b : vec4<${type}>) -> vec4<${type}> {\n // TODO: implement vectorized pow\n return vec4<${type}>(pow_custom(a.x, b.x), pow_custom(a.y, b.y), pow_custom(a.z, b.z), pow_custom(a.w, b.w));\n }\n `);\n};\n\nexport const sub = (context: ComputeContext): void => {\n runBinaryOp(context, 'Sub', (a, b) => `${a}-${b}`);\n};\n\nexport const greater = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'Greater', ({scalar: (a, b) => `u32(${a}>${b})`, vector: (a, b) => `vec4(${a}>${b})`}), undefined,\n undefined, DataType.bool);\n};\n\nexport const less = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'Less', ({scalar: (a, b) => `u32(${a}<${b})`, vector: (a, b) => `vec4(${a}<${b})`}), undefined,\n undefined, DataType.bool);\n};\n\nexport const greaterOrEqual = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'GreaterOrEqual', ({scalar: (a, b) => `u32(${a}>=${b})`, vector: (a, b) => `vec4(${a}>=${b})`}),\n undefined, undefined, DataType.bool);\n};\n\nexport const lessOrEqual = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'LessOrEqual', ({scalar: (a, b) => `u32(${a}<=${b})`, vector: (a, b) => `vec4(${a}<=${b})`}),\n undefined, undefined, DataType.bool);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface ConcatAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[], axis: number): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('too few inputs');\n }\n const referenceIndex = 0;\n const referenceInput = inputs[referenceIndex];\n const inputType = referenceInput.dataType;\n const inputRank = referenceInput.dims.length;\n inputs.forEach((input, i) => {\n if (i === referenceIndex) {\n return;\n }\n // make sure types of all inputs match\n if (input.dataType !== inputType) {\n throw new Error('input tensors should be one type');\n }\n // make sure the dimensionality of all inputs are the same\n if (input.dims.length !== inputRank) {\n throw new Error('input tensors should have the same shape');\n }\n input.dims.forEach((dim, i) => {\n if (i !== axis && dim !== referenceInput.dims[i]) {\n throw new Error('non concat dimensions must match');\n }\n });\n });\n};\n\nconst calculateInputIndexImpl = (numberOfTensors: number, sizeInConcatAxisStr: string): string => `\n fn calculateInputIndex(index: u32) -> u32 {\n let sizeInConcatAxis = array(${sizeInConcatAxisStr});\n for (var i: u32 = 0u; i < ${numberOfTensors}; i += 1u ) {\n if (index < sizeInConcatAxis[i]) {\n return i;\n }\n }\n return ${numberOfTensors}u;\n }`;\n\nconst assignOutputData = (inputs: readonly IndicesHelper[], output: IndicesHelper) => {\n const numberOfTensors = inputs.length;\n\n const codeLines: string[] = [];\n for (let i = 0; i < numberOfTensors; ++i) {\n const returnSnippet = output.setByOffset('global_idx', inputs[i].getByIndices('indices'));\n if (numberOfTensors === 1) {\n codeLines.push(returnSnippet);\n } else if (i === 0) {\n codeLines.push(`if (inputIndex == ${i}u) { ${returnSnippet} }`);\n } else if (i === numberOfTensors - 1) {\n codeLines.push(`else { ${returnSnippet} }`);\n } else {\n codeLines.push(`else if (inputIndex == ${i}) { ${returnSnippet} }`);\n }\n }\n return codeLines.join('\\n');\n};\n\nconst createConcatProgramInfo =\n (inputs: readonly TensorView[], adjustedAxis: number, outputShape: number[], dataType: DataType): ProgramInfo => {\n const outputSize = ShapeUtil.size(outputShape);\n\n const sizeInConcatAxis = new Array(inputs.length);\n const inputVars = new Array(inputs.length);\n\n let previousSum = 0;\n const inputDependencies: ProgramInputTensorInfoDependency[] = [];\n const inputRanks = [];\n const programUniforms: ProgramUniform[] = [{type: DataType.uint32, data: outputSize}];\n for (let i = 0; i < inputs.length; ++i) {\n previousSum += inputs[i].dims[adjustedAxis];\n sizeInConcatAxis[i] = previousSum;\n inputRanks.push(inputs[i].dims.length);\n inputVars[i] = inputVariable(`input${i}`, dataType, inputRanks[i]);\n inputDependencies.push('rank');\n programUniforms.push({type: DataType.uint32, data: sizeInConcatAxis[i]});\n }\n for (let i = 0; i < inputs.length; ++i) {\n programUniforms.push(...createTensorShapeVariables(inputs[i].dims));\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const output = outputVariable('output', dataType, outputShape.length);\n const indicesAxis = output.indicesGet('indices', adjustedAxis);\n const sizeInConcatAxisStr =\n Array.from(Array(sizeInConcatAxis.length).keys()).map(i => `uniforms.sizeInConcatAxis${i}`).join(',');\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n\n ${(() => {\n shaderHelper.registerUniform('outputSize', 'u32');\n for (let i = 0; i < inputs.length; i++) {\n shaderHelper.registerUniform(`sizeInConcatAxis${i}`, 'u32');\n }\n return shaderHelper.declareVariables(...inputVars, output);\n })()}\n\n ${calculateInputIndexImpl(sizeInConcatAxis.length, sizeInConcatAxisStr)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n\n var indices = ${output.offsetToIndices('global_idx')};\n\n let inputIndex = calculateInputIndex(${indicesAxis});\n if (inputIndex != 0u) {\n let sizeInConcatAxis = array(${sizeInConcatAxisStr});\n ${indicesAxis} -= sizeInConcatAxis[inputIndex - 1u];\n }\n\n ${assignOutputData(inputVars, output)}\n }`;\n\n return {\n name: 'Concat',\n shaderCache: {hint: `${adjustedAxis}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms,\n }),\n getShaderSource,\n };\n };\n\nexport const concat = (context: ComputeContext, attributes: ConcatAttributes): void => {\n const inputs = context.inputs;\n const inputShape = inputs[0].dims;\n const adjustedAxis = ShapeUtil.normalizeAxis(attributes.axis, inputShape.length);\n validateInputs(inputs, adjustedAxis);\n const outputShape = inputShape.slice();\n outputShape[adjustedAxis] =\n inputs.reduce((sum, input) => sum + (input.dims.length > adjustedAxis ? input.dims[adjustedAxis] : 0), 0);\n // 0 length tensors are valid for concat, remove them\n const nonEmptyInputs = inputs.filter(input => ShapeUtil.size(input.dims) > 0);\n context.compute(\n createConcatProgramInfo(nonEmptyInputs, adjustedAxis, outputShape, inputs[0].dataType), {inputs: nonEmptyInputs});\n};\n\nexport const parseConcatAttributes = (attributes: Record): ConcatAttributes =>\n createAttributeWithCacheKey({axis: attributes.axis as number});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {MAX_CLIP, MIN_CLIP} from '../../util';\nimport {ProgramUniform} from '../types';\n\nimport {UniformsArrayType} from './common';\n\nexport interface InternalActivationAttributes {\n readonly activation: string;\n readonly clipMin?: number;\n readonly clipMax?: number;\n readonly alpha?: number;\n readonly beta?: number;\n}\n\nexport const getActivationSnippet =\n (attributes: InternalActivationAttributes, valueType: string, baseType = 'f32'): string => {\n switch (attributes.activation) {\n case 'Relu':\n return `value = max(value, ${valueType}(0.0));`;\n case 'Sigmoid':\n return `value = (${valueType}(1.0) / (${valueType}(1.0) + exp(-value)));`;\n case 'Clip':\n return `value = clamp(value, ${valueType}(${baseType}(uniforms.clip_min)), ${valueType}(${\n baseType}(uniforms.clip_max)));`;\n case 'HardSigmoid':\n return `value = max(${valueType}(0.0), min(${valueType}(1.0), ${baseType}(uniforms.alpha) * value + ${\n baseType}(uniforms.beta)));`;\n case 'LeakyRelu':\n return `value = select(${baseType}(uniforms.alpha) * value, value, value >= ${valueType}(0.0));`;\n case '':\n return '';\n // TODO: adding other activations that can be fused.\n default:\n throw new Error(`Unsupported activation ${attributes.activation}`);\n }\n };\n\nexport const appendActivationUniformsData =\n (attributes: InternalActivationAttributes, programUniform: ProgramUniform[]) => {\n if (attributes.activation === 'Clip') {\n programUniform.push(\n {type: DataType.float, data: attributes.clipMax!}, {type: DataType.float, data: attributes.clipMin!});\n } else if (attributes.activation === 'HardSigmoid') {\n programUniform.push(\n {type: DataType.float, data: attributes.alpha!}, {type: DataType.float, data: attributes.beta!});\n } else if (attributes.activation === 'LeakyRelu') {\n programUniform.push({type: DataType.float, data: attributes.alpha!});\n }\n };\n\nexport const appendActivationUniforms = (attributes: InternalActivationAttributes, uniforms: UniformsArrayType) => {\n if (attributes.activation === 'Clip') {\n uniforms.push({name: 'clip_max', type: 'f32'}, {name: 'clip_min', type: 'f32'});\n } else if (attributes.activation === 'HardSigmoid') {\n uniforms.push({name: 'alpha', type: 'f32'}, {name: 'beta', type: 'f32'});\n } else if (attributes.activation === 'LeakyRelu') {\n uniforms.push({name: 'alpha', type: 'f32'});\n }\n};\n\nexport const parseInternalActivationAttributes =\n (attributes: Record|undefined): InternalActivationAttributes => {\n const activation = attributes?.activation as string || '';\n if (activation === 'HardSigmoid') {\n const [alpha, beta] = attributes?.activation_params as [number, number] || [0.2, 0.5];\n return {activation, alpha, beta};\n } else if (activation === 'Clip') {\n const [clipMin, clipMax] = attributes?.activation_params as [number, number] || [MIN_CLIP, MAX_CLIP];\n return {activation, clipMax, clipMin};\n } else if (activation === 'LeakyRelu') {\n const [alpha] = attributes?.activation_params as [number] || [0.01];\n return {activation, alpha};\n }\n return {activation};\n };\n", "/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/activation_util.ts\n//\n// modified to fit the needs of the project\n\nexport const typeSnippet = (component: number, dataType: string) => {\n switch (component) {\n case 1:\n return dataType;\n case 2:\n return `vec2<${dataType}>`;\n case 3:\n return `vec3<${dataType}>`;\n case 4:\n return `vec4<${dataType}>`;\n default:\n throw new Error(`${component}-component is not supported.`);\n }\n};\n\nexport const biasSnippet = (hasBias: boolean): string => `\n ${hasBias ? 'value = value + getBiasByOutputCoords(coords);' : ''}\n `;\n", "/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-core/src/ops/conv_util.ts\n//\n// modified to fit the needs of the project\n\nexport const utilFunctions = (strideStr: string) => (`\nfn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 {\n return dot(coords, vec4(\n shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1));\n}\nfn getOutputIndexFromCoords(coords : vec4) -> i32 {\n return dot(coords, vec4(\n i32(${strideStr}.x), i32(${strideStr}.y), i32(${strideStr}.z), 1));\n}\n`);\n", "/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/matmul_packed_webgpu.ts\n//\n// modified to fit the needs of the project\n\nimport {DataType} from '../../../../wasm-common';\nimport {TensorView} from '../../../tensor-view';\nimport {ShapeUtil} from '../../../util';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, getBroadcastDims, IndicesHelper, inputVariable, internalVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet, InternalActivationAttributes} from '../fuse-utils';\n\nimport {typeSnippet} from './activation_util';\n\nconst writeDataToSubAVec4Snippet = (transpose: boolean, batchDims?: IndicesHelper) => {\n if (transpose) {\n return `\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n kStart + inputRow,\n globalRowStart / innerElementSize + inputCol${batchDims ? ', batchIndices' : ''});\n `;\n\n } else {\n return `\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n globalRow + innerRow,\n kStart / innerElementSize + inputCol${batchDims ? ', batchIndices' : ''});\n `;\n }\n};\n\nconst calculateResultSnippet = (transposeA: boolean, innerElementSize: number) => {\n if (transposeA) {\n return `\n let ACached0 = mm_Asub[k * innerElementSize][localRow];\n let ACached1 = mm_Asub[k * innerElementSize + 1][localRow];\n let ACached2 = mm_Asub[k * innerElementSize + 2][localRow];\n ${innerElementSize === 3 ? '' : 'let ACached3 = mm_Asub[k * innerElementSize + 3][localRow];'}\n for (var i = 0; i < rowPerThread; i = i + 1) {\n acc[i] = BCached0 * ACached0[i] + acc[i];\n acc[i] = BCached1 * ACached1[i] + acc[i];\n acc[i] = BCached2 * ACached2[i] + acc[i];\n ${innerElementSize === 3 ? '' : 'acc[i] = BCached3 * ACached3[i] + acc[i];'}\n }`;\n } else {\n return `\n for (var i = 0; i < rowPerThread; i = i + 1) {\n let ACached = mm_Asub[tileRow + i][k];\n acc[i] = BCached0 * ACached.x + acc[i];\n acc[i] = BCached1 * ACached.y + acc[i];\n acc[i] = BCached2 * ACached.z + acc[i];\n ${innerElementSize === 3 ? '' : 'acc[i] = BCached3 * ACached.w + acc[i];'}\n }`;\n }\n};\n\nexport const makeMatMulPackedVec4Source =\n (workPerThread: number[], workgroupSize: [number, number, number], type = 'f32', batchDims?: IndicesHelper,\n transposeA = false, tileInner = 32, splitK = false, splitedDimInner = 32): string => {\n const tileAOuter = workgroupSize[1] * workPerThread[1];\n const tileBOuter = workgroupSize[0] * workPerThread[0];\n const tileAWidth = transposeA ? tileAOuter : tileInner;\n const tileAHight = transposeA ? tileInner : tileAOuter;\n const innerElementSize = tileAWidth / workgroupSize[0];\n const rowPerThreadB = tileInner / workgroupSize[1];\n\n if (!(((transposeA && innerElementSize === 4 && workPerThread[1] === 4) ||\n (!transposeA && (innerElementSize === 3 || innerElementSize === 4))) &&\n tileAWidth % workgroupSize[0] === 0 && tileInner % workgroupSize[1] === 0 && workPerThread[0] === 4)) {\n throw new Error(`If transposeA ${transposeA} is true, innerElementSize ${\n innerElementSize} and workPerThread[1] ${workPerThread[1]} must be 4.\n Otherwise, innerElementSize ${innerElementSize} must be 3 or 4.\n tileAWidth ${tileAWidth} must be divisible by workgroupSize[0]${workgroupSize[0]}. tileInner ${\n tileInner} must be divisible by workgroupSize[1] ${workgroupSize[1]}. colPerThread ${\n workPerThread[0]} must be 4.`);\n }\n return `\nvar mm_Asub: array, ${tileAWidth / innerElementSize}>, ${tileAHight}>;\nvar mm_Bsub: array, ${tileBOuter / workPerThread[0]}>, ${tileInner}>;\n\nconst rowPerThread = ${workPerThread[1]};\nconst colPerThread = ${workPerThread[0]};\nconst innerElementSize = ${innerElementSize};\nconst tileInner = ${tileInner};\n\n@compute @workgroup_size(${workgroupSize[0]}, ${workgroupSize[1]}, ${workgroupSize[2]})\nfn main(@builtin(local_invocation_id) localId : vec3,\n @builtin(global_invocation_id) globalId : vec3,\n @builtin(workgroup_id) workgroupId : vec3) {\n let localRow = i32(localId.y);\n let tileRow = localRow * rowPerThread;\n let tileCol = i32(localId.x);\n\n let globalRow =i32(globalId.y) * rowPerThread;\n let globalCol = i32(globalId.x);\n let batch = ${splitK ? '0' : 'i32(globalId.z)'};\n ${batchDims ? `let batchIndices = ${batchDims.offsetToIndices('u32(batch)')};` : ''}\n let globalRowStart = i32(workgroupId.y) * ${tileAOuter};\n\n let num_tiles = ${splitK ? `${Math.ceil(splitedDimInner / tileInner)}` : '(uniforms.dim_inner - 1) / tileInner + 1'};\n var kStart = ${splitK ? `i32(globalId.z) * ${splitedDimInner}` : '0'};\n\n var acc: array, rowPerThread>;\n\n // Loop over shared dimension.\n let tileRowB = localRow * ${rowPerThreadB};\n for (var t = 0; t < num_tiles; t = t + 1) {\n // Load one tile of A into local memory.\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n let inputRow = tileRow + innerRow;\n let inputCol = tileCol;\n ${writeDataToSubAVec4Snippet(transposeA, batchDims)}\n }\n\n // Load one tile of B into local memory.\n for (var innerRow = 0; innerRow < ${rowPerThreadB}; innerRow = innerRow + 1) {\n let inputRow = tileRowB + innerRow;\n let inputCol = tileCol;\n mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol${\n batchDims ? ', batchIndices' : ''});\n }\n kStart = kStart + tileInner;\n workgroupBarrier();\n\n // Compute acc values for a single thread.\n for (var k = 0; k < tileInner / innerElementSize; k = k + 1) {\n let BCached0 = mm_Bsub[k * innerElementSize][tileCol];\n let BCached1 = mm_Bsub[k * innerElementSize + 1][tileCol];\n let BCached2 = mm_Bsub[k * innerElementSize + 2][tileCol];\n ${innerElementSize === 3 ? '' : 'let BCached3 = mm_Bsub[k * innerElementSize + 3][tileCol];'}\n\n ${calculateResultSnippet(transposeA, innerElementSize)}\n }\n\n workgroupBarrier();\n }\n\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]);\n }\n}`;\n };\n\nconst writeDataToSubASnippet = (transpose: boolean, batchDims?: IndicesHelper) => {\n if (transpose) {\n return `\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n kStart + inputRow,\n globalRowStart + inputCol${batchDims ? ', batchIndices' : ''});\n `;\n\n } else {\n return `\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n globalRowStart + inputRow,\n kStart + inputCol${batchDims ? ', batchIndices' : ''});\n `;\n }\n};\n\nconst readDataFromSubASnippet = (transposeA: boolean) =>\n transposeA ? 'let ACached = mm_Asub[k][tileRow + innerRow];' : 'let ACached = mm_Asub[tileRow + innerRow][k];';\n\n// sequentialAccessByThreads means sequential data in memory is accessed by\n// threads, instead of a single thread (default behavior).\nexport const makeMatMulPackedSource =\n (workPerThread: number[], workgroupSize: [number, number, number], type = 'f32', batchDims?: IndicesHelper,\n transposeA = false, tileInner = 32, splitK = false, splitedDimInner = 32,\n sequentialAccessByThreads = false): string => {\n const tileAOuter = workPerThread[1] * workgroupSize[1];\n const tileBOuter = workPerThread[0] * workgroupSize[0];\n const tileAWidth = transposeA ? tileAOuter : tileInner;\n const tileAHight = transposeA ? tileInner : tileAOuter;\n\n if (!(tileAHight % workgroupSize[1] === 0 && tileAWidth % workgroupSize[0] === 0 &&\n tileInner % workgroupSize[1] === 0)) {\n throw new Error(`tileAHight ${tileAHight} must be divisible by workgroupSize[1]${\n workgroupSize[1]}, tileAWidth ${tileAWidth} must be divisible by workgroupSize[0]${\n workgroupSize[0]}, tileInner ${tileInner} must be divisible by workgroupSize[1]${workgroupSize[1]}`);\n }\n const rowPerThreadA = tileAHight / workgroupSize[1];\n const colPerThreadA = tileAWidth / workgroupSize[0];\n const rowPerThreadB = tileInner / workgroupSize[1];\n const matmulSnippet = sequentialAccessByThreads ?\n `\n let localRow = i32(localId.y);\n let localCol = i32(localId.x);\n let globalRowStart = i32(workgroupId.y) * ${tileAOuter};\n let globalColStart = i32(workgroupId.x) * ${tileBOuter};\n\n // Loop over shared dimension.\n for (var t = 0; t < num_tiles; t = t + 1) {\n // Load one tile of A into local memory.\n for (var inputRow = localRow; inputRow < ${tileAHight}; inputRow = inputRow + ${workgroupSize[1]}) {\n for (var inputCol = localCol; inputCol < ${tileAWidth}; inputCol = inputCol + ${workgroupSize[0]}) {\n ${writeDataToSubASnippet(transposeA, batchDims)}\n }\n }\n // Load one tile of B into local memory.\n for (var inputRow = localRow; inputRow < ${tileInner}; inputRow = inputRow + ${workgroupSize[1]}) {\n for (var inputCol = localCol; inputCol < ${tileBOuter}; inputCol = inputCol + ${workgroupSize[0]}) {\n mm_Bsub[inputRow][inputCol] = mm_readB(batch,\n kStart + inputRow,\n globalColStart + inputCol${batchDims ? ', batchIndices' : ''});\n }\n }\n kStart = kStart + tileInner;\n workgroupBarrier();\n\n // Compute acc values for a single thread.\n var BCached : array<${type}, colPerThread>;\n for (var k = 0; k < tileInner; k = k + 1) {\n for (var inner = 0; inner < colPerThread; inner = inner + 1) {\n BCached[inner] = mm_Bsub[k][localCol + inner * ${workgroupSize[0]}];\n }\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n let ACached = ${\n transposeA ? `mm_Asub[k][localRow + innerRow * ${workgroupSize[1]}];` :\n `mm_Asub[localRow + innerRow * ${workgroupSize[1]}][k];`}\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n acc[innerRow][innerCol] = acc[innerRow][innerCol] +\n ACached * BCached[innerCol];\n }\n }\n }\n workgroupBarrier();\n }\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n let gRow = globalRowStart + localRow + innerRow * ${workgroupSize[1]};\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n let gCol = globalColStart + localCol + innerCol * ${workgroupSize[0]};\n mm_write(batch, gRow, gCol, acc[innerRow][innerCol]);\n }\n }\n ` :\n `\nlet tileRow = i32(localId.y) * rowPerThread;\nlet tileCol = i32(localId.x) * colPerThread;\n\nlet globalRow = i32(globalId.y) * rowPerThread;\nlet globalCol = i32(globalId.x) * colPerThread;\nlet globalRowStart = i32(workgroupId.y) * ${tileAOuter};\n\nlet tileRowA = i32(localId.y) * ${rowPerThreadA};\nlet tileColA = i32(localId.x) * ${colPerThreadA};\nlet tileRowB = i32(localId.y) * ${rowPerThreadB};\n// Loop over shared dimension.\nfor (var t = 0; t < num_tiles; t = t + 1) {\n // Load one tile of A into local memory.\n for (var innerRow = 0; innerRow < ${rowPerThreadA}; innerRow = innerRow + 1) {\n for (var innerCol = 0; innerCol < ${colPerThreadA}; innerCol = innerCol + 1) {\n let inputRow = tileRowA + innerRow;\n let inputCol = tileColA + innerCol;\n ${writeDataToSubASnippet(transposeA, batchDims)}\n }\n }\n\n // Load one tile of B into local memory.\n for (var innerRow = 0; innerRow < ${rowPerThreadB}; innerRow = innerRow + 1) {\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n let inputRow = tileRowB + innerRow;\n let inputCol = tileCol + innerCol;\n mm_Bsub[inputRow][inputCol] = mm_readB(batch,\n kStart + inputRow,\n globalCol + innerCol${batchDims ? ', batchIndices' : ''});\n }\n }\n kStart = kStart + tileInner;\n workgroupBarrier();\n\n // Compute acc values for a single thread.\n var BCached : array<${type}, colPerThread>;\n for (var k = 0; k < tileInner; k = k + 1) {\n for (var inner = 0; inner < colPerThread; inner = inner + 1) {\n BCached[inner] = mm_Bsub[k][tileCol + inner];\n }\n\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n ${readDataFromSubASnippet(transposeA)}\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol];\n }\n }\n }\n\n workgroupBarrier();\n}\n\nfor (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n mm_write(batch, globalRow + innerRow, globalCol + innerCol,\n acc[innerRow][innerCol]);\n }\n}\n`;\n\n return `\n var mm_Asub : array, ${tileAHight}>;\n var mm_Bsub : array, ${tileInner}>;\n const rowPerThread = ${workPerThread[1]};\n const colPerThread = ${workPerThread[0]};\n const tileInner = ${tileInner};\n\n@compute @workgroup_size(${workgroupSize[0]}, ${workgroupSize[1]}, ${workgroupSize[2]})\nfn main(@builtin(local_invocation_id) localId : vec3,\n @builtin(global_invocation_id) globalId : vec3,\n @builtin(workgroup_id) workgroupId : vec3) {\n let batch = ${splitK ? '0' : 'i32(globalId.z)'};\n ${batchDims ? `let batchIndices = ${batchDims.offsetToIndices('u32(batch)')};` : ''}\n let num_tiles = ${\n splitK ? `${Math.ceil(splitedDimInner / tileInner)}` : '(uniforms.dim_inner - 1) / tileInner + 1'};\n var kStart = ${splitK ? `i32(globalId.z) * ${splitedDimInner}` : '0'};\n\n var acc : array, rowPerThread>;\n ${matmulSnippet}\n }\n`;\n };\n\nconst matMulReadWriteFnSource =\n (component: number, hasBias: boolean, applyActivation: string, variables: IndicesHelper[],\n batchShapes: Array, isChannelsLast = false): string => {\n const [batchAShape, batchBShape, batchShape] = batchShapes;\n const [batchVariable, aVariable, bVariable, outputVariable] = variables;\n const broadCastADims = getBroadcastDims(batchAShape, batchShape);\n const broadCastBDims = getBroadcastDims(batchBShape, batchShape);\n const dataType = tensorTypeToWsglStorageType(variables[0].type.tensor);\n const getAIndices = () => {\n const aRank = aVariable.rank;\n const batchRank = batchVariable.rank;\n let resStr = `var aIndices: ${aVariable.type.indices};`;\n for (let i = aRank - 2 - 1, j = batchRank - 1; i >= 0; i--, j--) {\n resStr += `\\naIndices[${i}] = ${batchRank > 1 ? `batchIndices[${j}]` : 'batchIndices'};`;\n }\n broadCastADims.forEach(i => {\n resStr += `\\naIndices[${i}] = 0;`;\n });\n resStr += `\\naIndices[${aRank - 2}] = u32(row);\n aIndices[${aRank - 1}] = u32(colIn);`;\n return resStr;\n };\n const getBIndices = () => {\n const bRank = bVariable.rank;\n const batchRank = batchVariable.rank;\n let resStr = `var bIndices: ${bVariable.type.indices};`;\n for (let i = bRank - 2 - 1, j = batchRank - 1; i >= 0; i--, j--) {\n resStr += `\\nbIndices[${i}] = ${batchRank > 1 ? `batchIndices[${j}]` : 'batchIndices'};`;\n }\n broadCastBDims.forEach(i => {\n resStr += `\\nbIndices[${i}] = 0;`;\n });\n resStr += `\\nbIndices[${bRank - 2}] = u32(row);\n bIndices[${bRank - 1}] = u32(colIn);`;\n return resStr;\n };\n const source = `\n fn mm_readA(batch: i32, row: i32, colIn: i32, batchIndices: ${batchVariable.type.indices}) -> ${\n typeSnippet(component, dataType)} {\n var value = ${typeSnippet(component, dataType)}(0.0);\n let col = colIn * ${component};\n if(row < uniforms.dim_a_outer && col < uniforms.dim_inner)\n {\n ${getAIndices()}\n value = ${aVariable.getByIndices('aIndices')};\n }\n return value;\n }\n\n fn mm_readB(batch: i32, row: i32, colIn: i32, batchIndices: ${batchVariable.type.indices}) -> ${\n typeSnippet(component, dataType)} {\n var value = ${typeSnippet(component, dataType)}(0.0);\n let col = colIn * ${component};\n if(row < uniforms.dim_inner && col < uniforms.dim_b_outer)\n {\n ${getBIndices()}\n value = ${bVariable.getByIndices('bIndices')};\n }\n return value;\n }\n\n fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${typeSnippet(component, dataType)}) {\n let col = colIn * ${component};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) {\n var value = valueIn;\n let coords = vec3(batch, row, colIn);\n ${\n hasBias ?\n `value = value + ${isChannelsLast ? 'bias[colIn]' : `${typeSnippet(component, dataType)}(bias[row])`};` :\n '' }\n ${applyActivation}\n ${outputVariable.setByIndices('vec3(coords)', 'value')}\n }\n }\n `;\n return source;\n };\n\nexport const createMatmulProgramInfo =\n (inputs: readonly TensorView[], activationAttributes: InternalActivationAttributes, outputShape: readonly number[],\n reshapedOutputShape?: readonly number[],\n isChannelsLast = false /* only used for conv2dByMatMul*/): ProgramInfo => {\n const aShape = inputs[0].dims;\n const bShape = inputs[1].dims;\n const outerDimsA = aShape.slice(0, -2);\n const outerDimsB = bShape.slice(0, -2);\n const outerDims = reshapedOutputShape ? reshapedOutputShape.slice(0, -2) : outputShape.slice(0, -2);\n const batchSize = ShapeUtil.size(outerDims);\n const dimAOuter = aShape[aShape.length - 2];\n const dimInner = aShape[aShape.length - 1];\n const dimBOuter = bShape[bShape.length - 1];\n const isVec4 = dimInner % 4 === 0 && dimBOuter % 4 === 0;\n\n // TODO: fine tune size\n const elementsPerThread = dimAOuter <= 8 ? [4, 1, 1] : [4, 4, 1];\n const workgroupSize: [number, number, number] = [8, 8, 1];\n const dispatch = [\n Math.ceil(dimBOuter / workgroupSize[0] / elementsPerThread[0]),\n Math.ceil(dimAOuter / workgroupSize[1] / elementsPerThread[1]),\n Math.ceil(batchSize / workgroupSize[2] / elementsPerThread[2])\n ];\n\n const components = isVec4 ? 4 : 1;\n const aShapeTemp = [...outerDimsA, dimAOuter, dimInner / components];\n const aRank = aShapeTemp.length;\n const bShapeTemp = [...outerDimsB, dimInner, dimBOuter / components];\n const bRank = bShapeTemp.length;\n const outputShapeTemp = [batchSize, dimAOuter, dimBOuter / components];\n const programUniforms: ProgramUniform[] = [\n {type: DataType.int32, data: dimAOuter}, {type: DataType.int32, data: dimBOuter},\n {type: DataType.int32, data: dimInner}\n ];\n appendActivationUniformsData(activationAttributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(outerDims, aShapeTemp, bShapeTemp));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n\n const hasBias = inputs.length > 2;\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShapeTemp));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const batchRank = outerDims.length;\n const batchDims = internalVariable('batchDims', inputs[0].dataType, batchRank, 1);\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n\n const A = inputVariable('a', inputs[0].dataType, aRank, components);\n const B = inputVariable('b', inputs[1].dataType, bRank, components);\n const output = outputVariable('result', inputs[0].dataType, outputShapeTemp.length, components);\n const inputVariables = [A, B];\n if (hasBias) {\n const biasComponents = isChannelsLast ? components : 1;\n inputVariables.push(inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, biasComponents));\n }\n const uniforms: UniformsArrayType =\n [{name: 'dim_a_outer', type: 'i32'}, {name: 'dim_b_outer', type: 'i32'}, {name: 'dim_inner', type: 'i32'}];\n appendActivationUniforms(activationAttributes, uniforms);\n const baseType = tensorTypeToWsglStorageType(output.type.tensor);\n const applyActivation = getActivationSnippet(activationAttributes, output.type.value, baseType);\n const declareFunctions = matMulReadWriteFnSource(\n components, hasBias, applyActivation, [batchDims, A, B, output], [outerDimsA, outerDimsB, outerDims],\n isChannelsLast);\n return `\n ${\n shaderHelper.registerUniforms(uniforms).registerInternalVariables(batchDims).declareVariables(\n ...inputVariables, output)}\n ${declareFunctions}\n ${\n isVec4 ? makeMatMulPackedVec4Source(elementsPerThread, workgroupSize, dataType, batchDims) :\n makeMatMulPackedSource(elementsPerThread, workgroupSize, dataType, batchDims)}\n `;\n };\n return {\n name: 'MatMul',\n shaderCache: {\n hint: `${elementsPerThread};${activationAttributes.activation};${isVec4};${isChannelsLast}`,\n inputDependencies\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n programUniforms\n }),\n getShaderSource,\n };\n };\n", "/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/conv2d_mm_webgpu.ts\n//\n// modified to fit the needs of the project\n\nimport {DataType} from '../../../../wasm-common';\nimport {LOG_DEBUG} from '../../../log';\nimport {TensorView} from '../../../tensor-view';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {ConvAttributes} from '../conv';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet} from '../fuse-utils';\n\nimport {biasSnippet, typeSnippet} from './activation_util';\nimport {utilFunctions} from './conv_util';\nimport {makeMatMulPackedSource, makeMatMulPackedVec4Source} from './matmul_packed_webgpu';\n\nconst conv2dCommonSnippet =\n (isChannelsLast: boolean, fitAOuter: boolean, fitBOuter: boolean, fitInner: boolean, addBias = false,\n attributes: ConvAttributes, innerElementSizeX = 4, innerElementSizeW = 4, innerElementSize = 4,\n dataType = 'f32'): string => {\n const getXSnippet = (innerElementSize: number) => {\n switch (innerElementSize) {\n case 1:\n return 'resData = x[xIndex];';\n case 3:\n return `resData = vec3<${dataType}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;\n case 4:\n return 'resData = x[xIndex / 4];';\n default:\n throw new Error(`innerElementSize ${innerElementSize} is not supported.`);\n }\n };\n const getWSnippet = (innerElementSize: number) => {\n switch (innerElementSize) {\n case 1:\n return 'return w[row * i32(uniforms.w_shape[3]) + colIn];';\n case 4:\n return 'return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];';\n default:\n throw new Error(`innerElementSize ${innerElementSize} is not supported.`);\n }\n };\n const coordASnippet = isChannelsLast ? `\n let coord = vec4(batch, xRow, xCol, xCh);\n ` :\n `\n let coord = vec4(batch, xCh, xRow, xCol);\n `;\n\n const coordResSnippet = isChannelsLast ? `\n let coords = vec4(\n batch,\n row / outWidth,\n row % outWidth,\n col);\n ` :\n `\n let coords = vec4(\n batch,\n row,\n col / outWidth,\n col % outWidth);\n `;\n\n const xHeight = isChannelsLast ? 'i32(uniforms.x_shape[1])' : 'i32(uniforms.x_shape[2])';\n const xWidth = isChannelsLast ? 'i32(uniforms.x_shape[2])' : 'i32(uniforms.x_shape[3])';\n const row = isChannelsLast ? 'row' : 'col';\n const col = isChannelsLast ? 'col' : 'row';\n const readXSnippet = `\n let inChannels = i32(uniforms.w_shape[2]);\n let outWidth = ${isChannelsLast ? 'i32(uniforms.result_shape[2])' : 'i32(uniforms.result_shape[3])'};\n let outRow = ${row} / outWidth;\n let outCol = ${row} % outWidth;\n\n let WRow = ${col} / (i32(uniforms.w_shape[1]) * inChannels);\n let WCol = ${col} / inChannels % i32(uniforms.w_shape[1]);\n let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0];\n let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1];\n let xCh = ${col} % inChannels;\n var resData = ${typeSnippet(innerElementSizeX, dataType)}(0.0);\n // The bounds checking is always needed since we use it to pad zero for\n // the 'same' padding type.\n if (xRow >= 0 && xRow < ${xHeight} && xCol >= 0 && xCol < ${xWidth}) {\n ${coordASnippet}\n let xIndex = getIndexFromCoords4D(coord, vec4(uniforms.x_shape));\n ${getXSnippet(innerElementSizeX)}\n }\n return resData;`;\n\n const sampleX = isChannelsLast ? (fitAOuter && fitInner ? `\n let col = colIn * ${innerElementSizeX};\n ${readXSnippet}` :\n `\n let col = colIn * ${innerElementSizeX};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) {\n ${readXSnippet}\n }\n return ${typeSnippet(innerElementSizeX, dataType)}(0.0);`) :\n (fitInner && fitBOuter ? `\n let col = colIn * ${innerElementSizeX};\n ${readXSnippet}` :\n `\n let col = colIn * ${innerElementSizeX};\n if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) {\n ${readXSnippet}\n }\n return ${typeSnippet(innerElementSizeX, dataType)}(0.0);`);\n\n const sampleW = `${getWSnippet(innerElementSizeW)}`;\n\n const resType = typeSnippet(innerElementSize, dataType);\n const aType =\n isChannelsLast ? typeSnippet(innerElementSizeX, dataType) : typeSnippet(innerElementSizeW, dataType);\n const bType =\n isChannelsLast ? typeSnippet(innerElementSizeW, dataType) : typeSnippet(innerElementSizeX, dataType);\n const applyActivation = getActivationSnippet(attributes, resType, dataType);\n const userCode = `\n fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${aType} {\n ${isChannelsLast ? sampleX : sampleW}\n }\n\n fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${bType} {\n ${isChannelsLast ? sampleW : sampleX}\n }\n\n fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${resType}) {\n let col = colIn * ${innerElementSize};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer)\n {\n var value = valueIn;\n let outWidth = ${isChannelsLast ? 'i32(uniforms.result_shape[2])' : 'i32(uniforms.result_shape[3])'};\n ${coordResSnippet}\n ${biasSnippet(addBias)}\n ${applyActivation}\n setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value);\n }\n }`;\n return userCode;\n };\n\nexport const createConv2DMatMulProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvAttributes, outputShape: readonly number[], dimAOuter: number,\n dimBOuter: number, dimInner: number, hasBias: boolean, sequentialAccessByThreads: boolean): ProgramInfo => {\n const isChannelsLast = attributes.format === 'NHWC';\n const inChannels = isChannelsLast ? inputs[0].dims[3] : inputs[0].dims[1];\n const batchSize = outputShape[0];\n const outWidth = isChannelsLast ? outputShape[2] : outputShape[3];\n const outHeight = isChannelsLast ? outputShape[1] : outputShape[2];\n const outChannels = isChannelsLast ? outputShape[3] : outputShape[1];\n // TODO: enable vec4 for NCHW\n const isVec4 = isChannelsLast && (inChannels % 4 === 0 || inChannels % 3 === 0) && outChannels % 4 === 0;\n\n // TODO: fine tune size\n const dispatchX = isChannelsLast ? outChannels : outWidth * outHeight;\n const dispatchY = isChannelsLast ? outWidth * outHeight : outChannels;\n const workGroupSize: [number, number, number] = [8, 8, 1];\n const elementsPerThread = dimAOuter <= 8 ? [4, 1, 1] : [4, 4, 1];\n const dispatch = [\n Math.ceil(dispatchX / workGroupSize[0] / elementsPerThread[0]),\n Math.ceil(dispatchY / workGroupSize[1] / elementsPerThread[1]),\n Math.ceil(batchSize / workGroupSize[2] / elementsPerThread[2])\n ];\n\n LOG_DEBUG('verbose', () => `[conv2d_mm_webgpu] dispatch = ${dispatch}`);\n\n const innerElementSize = isVec4 ? (isChannelsLast && inChannels % 4 !== 0 ? 3 : 4) : 1;\n const tileAOuter = workGroupSize[1] * elementsPerThread[1];\n const tileBOuter = workGroupSize[0] * elementsPerThread[0];\n const tileInner = Math.max(workGroupSize[0] * innerElementSize, workGroupSize[1]);\n const fitAOuter = dimAOuter % tileAOuter === 0;\n const fitBOuter = dimBOuter % tileBOuter === 0;\n const fitInner = dimInner % tileInner === 0;\n const elementsSize = isVec4 ? [innerElementSize, 4, 4] : [1, 1, 1];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.int32, data: dimAOuter}, {type: DataType.int32, data: dimBOuter},\n {type: DataType.int32, data: dimInner}, {type: DataType.int32, data: [attributes.pads[0], attributes.pads[1]]},\n {type: DataType.int32, data: attributes.strides}, {type: DataType.int32, data: attributes.dilations}\n ];\n appendActivationUniformsData(attributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(inputs[0].dims, inputs[1].dims));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const uniforms: UniformsArrayType = [\n {name: 'dim_a_outer', type: 'i32'}, {name: 'dim_b_outer', type: 'i32'}, {name: 'dim_inner', type: 'i32'},\n {name: 'pad', type: 'i32', length: 2}, {name: 'stride', type: 'i32', length: 2},\n {name: 'dilation', type: 'i32', length: 2}\n ];\n appendActivationUniforms(attributes, uniforms);\n\n // TODO: support component 2, 3.\n const components = isVec4 ? 4 : 1;\n const t = tensorTypeToWsglStorageType(inputs[0].dataType);\n let declareFunctions = `\n fn setOutputAtIndex(flatIndex : i32, value : ${isVec4 ? `vec4<${t}>` : t}) {\n result[flatIndex] = ${isVec4 ? `vec4<${t}>` : t}(value);\n }\n fn setOutputAtCoords(d0 : i32, d1 : i32, d2 : i32, d3 : i32, value : ${isVec4 ? `vec4<${t}>` : t}) {\n let flatIndex = getOutputIndexFromCoords(vec4(d0, d1, d2, d3));\n setOutputAtIndex(flatIndex ${isVec4 ? '/ 4' : ''}, value);\n }`;\n const x = inputVariable(\n 'x', inputs[0].dataType, inputs[0].dims.length, innerElementSize === 3 ? 1 : innerElementSize);\n const w = inputVariable('w', inputs[1].dataType, inputs[1].dims.length, components);\n const inputVariables = [x, w];\n const output = outputVariable('result', inputs[0].dataType, outputShape.length, components);\n if (hasBias) {\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, components);\n inputVariables.push(bias);\n declareFunctions += `\n fn getBiasByOutputCoords(coords : vec4) -> ${isVec4 ? `vec4<${t}>` : t} {\n return bias[coords.${isChannelsLast ? 'w' : 'y'}${isVec4 ? '/ 4' : ''}];\n }`;\n }\n\n return `\n ${utilFunctions('uniforms.result_strides')}\n //struct Uniforms { xShape : vec4, wShape : vec4, outShape : vec4,\n // outShapeStrides: vec3, filterDims : vec2, pad : vec2, stride : vec2,\n // dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32 };\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)}\n ${declareFunctions}\n ${\n conv2dCommonSnippet(\n isChannelsLast, fitAOuter, fitBOuter, fitInner, hasBias, attributes, elementsSize[0], elementsSize[1],\n elementsSize[2], t)}\n ${\n isVec4 ?\n makeMatMulPackedVec4Source(elementsPerThread, workGroupSize, t, undefined, !isChannelsLast, tileInner) :\n makeMatMulPackedSource(\n elementsPerThread, workGroupSize, t, undefined, !isChannelsLast, tileInner, false, undefined,\n sequentialAccessByThreads)}`;\n };\n return {\n name: 'Conv2DMatMul',\n shaderCache: {\n hint: `${attributes.cacheKey};${innerElementSize};${isVec4};${fitAOuter};${fitBOuter};${fitInner};${\n tileAOuter};${tileBOuter};${tileInner}`,\n inputDependencies\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n programUniforms,\n }),\n getShaderSource\n };\n };\n", "/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/conv3d_naive_webgpu.ts\n//\n// modified to fit the needs of the project\n\nimport {DataType} from '../../../../wasm-common';\nimport {LOG_DEBUG} from '../../../log';\nimport {TensorView} from '../../../tensor-view';\nimport {ShapeUtil} from '../../../util';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, getElementAt, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {ConvAttributes} from '../conv';\n\nconst arrayProduct = (arr: number[]) => {\n let product = 1;\n for (let i = 0; i < arr.length; i++) {\n product *= arr[i];\n }\n return product;\n};\n\nconst parse3TupleParam = (param: number|[number, number, number]): [number, number, number] =>\n typeof param === 'number' ? [param, param, param] : param;\n\nconst getEffectiveFilterSize = (filterSize: number, dilation: number): number => {\n if (dilation <= 1) {\n return filterSize;\n }\n\n return filterSize + (filterSize - 1) * (dilation - 1);\n};\n\nconst computeDefaultPad =\n (inputShape: [number, number]|[number, number, number, number], fieldSize: number, stride: number, dilation = 1):\n number => {\n const effectiveFieldSize = getEffectiveFilterSize(fieldSize, dilation);\n return Math.floor((inputShape[0] * (stride - 1) - stride + effectiveFieldSize) / 2);\n };\n\nconst computeOutputShape4D =\n (inShape: [number, number, number, number], filterShape: [number, number, number], outChannels: number,\n strides: [number, number, number], zeroPad?: number): [number, number, number, number] => {\n if (zeroPad == null) {\n // eslint-disable-next-line no-param-reassign\n zeroPad = computeDefaultPad(inShape, filterShape[0], strides[0]);\n }\n const outShape: [number, number, number, number] = [0, 0, 0, outChannels];\n for (let index = 0; index < 3; index++) {\n if (inShape[index] + 2 * zeroPad >= filterShape[index]) {\n outShape[index] = Math.trunc((inShape[index] - filterShape[index] + 2 * zeroPad) / strides[index] + 1);\n }\n }\n return outShape;\n };\n\nconst get3DPadAndOutInfo =\n (pad: number|string|number[], inDepth: number, inHeight: number, inWidth: number, strideDepth: number,\n strideHeight: number, strideWidth: number, filterDepth: number, filterHeight: number,\n filterWidth: number): {padInfo: PadInfo3D; outDepth: number; outHeight: number; outWidth: number} => {\n let padInfo: PadInfo3D;\n let outDepth: number;\n let outHeight: number;\n let outWidth: number;\n\n if (pad === 'VALID') {\n // eslint-disable-next-line no-param-reassign\n pad = 0;\n }\n\n if (typeof pad === 'number') {\n padInfo = {top: pad, bottom: pad, left: pad, right: pad, front: pad, back: pad};\n const outShape = computeOutputShape4D(\n [inDepth, inHeight, inWidth, 1], [filterDepth, filterHeight, filterWidth], 1,\n [strideDepth, strideHeight, strideWidth], pad);\n outDepth = outShape[0];\n outHeight = outShape[1];\n outWidth = outShape[2];\n } else if (Array.isArray(pad)) {\n if (!pad.every((val, _, arr) => val === arr[0])) {\n throw Error(`Unsupported padding parameter: ${pad}`);\n }\n padInfo = {top: pad[0], bottom: pad[1], left: pad[2], right: pad[3], front: pad[4], back: pad[5]};\n const outShape = computeOutputShape4D(\n [inDepth, inHeight, inWidth, 1], [filterDepth, filterHeight, filterWidth], 1,\n [strideDepth, strideHeight, strideWidth], pad[0]);\n outDepth = outShape[0];\n outHeight = outShape[1];\n outWidth = outShape[2];\n } else if (pad === 'SAME_UPPER') {\n // TODO: support 'SAME_LOWER'.\n outDepth = Math.ceil(inDepth / strideDepth);\n outHeight = Math.ceil(inHeight / strideHeight);\n outWidth = Math.ceil(inWidth / strideWidth);\n const padAlongDepth = (outDepth - 1) * strideDepth + filterDepth - inDepth;\n const padAlongHeight = (outHeight - 1) * strideHeight + filterHeight - inHeight;\n const padAlongWidth = (outWidth - 1) * strideWidth + filterWidth - inWidth;\n const front = Math.floor(padAlongDepth / 2);\n const back = padAlongDepth - front;\n const top = Math.floor(padAlongHeight / 2);\n const bottom = padAlongHeight - top;\n const left = Math.floor(padAlongWidth / 2);\n const right = padAlongWidth - left;\n\n padInfo = {top, bottom, left, right, front, back};\n } else {\n throw Error(`Unknown padding parameter: ${pad}`);\n }\n return {padInfo, outDepth, outHeight, outWidth};\n };\n\ntype PadInfo3D = {\n top: number; left: number; right: number; bottom: number; front: number; back: number;\n};\n\nexport type Conv3DInfo = {\n batchSize: number; inDepth: number; inHeight: number; inWidth: number; inChannels: number; outDepth: number;\n outHeight: number;\n outWidth: number;\n outChannels: number;\n dataFormat: 'channelsFirst' | 'channelsLast';\n strideDepth: number;\n strideHeight: number;\n strideWidth: number;\n dilationDepth: number;\n dilationHeight: number;\n dilationWidth: number;\n filterDepth: number;\n filterHeight: number;\n filterWidth: number;\n effectiveFilterDepth: number;\n effectiveFilterHeight: number;\n effectiveFilterWidth: number;\n padInfo: PadInfo3D;\n inShape: [number, number, number, number, number];\n outShape: [number, number, number, number, number];\n filterShape: [number, number, number, number, number];\n};\n\nexport const computeConv3DInfo =\n (inShape: [number, number, number, number, number], filterShape: [number, number, number, number, number],\n strides: number|[number, number, number], dilations: number|[number, number, number], pad: number|string|number[],\n depthwise = false, dataFormat: 'channelsFirst'|'channelsLast' = 'channelsLast'): Conv3DInfo => {\n let batchSize, inDepth, inHeight, inWidth, inChannels;\n if (dataFormat === 'channelsLast') {\n [batchSize, inDepth, inHeight, inWidth, inChannels] = inShape;\n } else if (dataFormat === 'channelsFirst') {\n [batchSize, inChannels, inDepth, inHeight, inWidth] = inShape;\n } else {\n throw new Error(`Unknown dataFormat ${dataFormat}`);\n }\n const [filterChannels, , filterDepth, filterHeight, filterWidth] = filterShape;\n\n const [strideDepth, strideHeight, strideWidth] = parse3TupleParam(strides);\n const [dilationDepth, dilationHeight, dilationWidth] = parse3TupleParam(dilations);\n\n const effectiveFilterDepth = getEffectiveFilterSize(filterDepth, dilationDepth);\n const effectiveFilterHeight = getEffectiveFilterSize(filterHeight, dilationHeight);\n const effectiveFilterWidth = getEffectiveFilterSize(filterWidth, dilationWidth);\n const {padInfo, outDepth, outHeight, outWidth} = get3DPadAndOutInfo(\n pad, inDepth, inHeight, inWidth, strideDepth, strideHeight, strideWidth, effectiveFilterDepth,\n effectiveFilterHeight, effectiveFilterWidth);\n\n const outChannels = depthwise ? filterChannels * inChannels : filterChannels;\n\n let outShape: [number, number, number, number, number] = [0, 0, 0, 0, 0];\n if (dataFormat === 'channelsFirst') {\n outShape = [batchSize, outChannels, outDepth, outHeight, outWidth];\n } else if (dataFormat === 'channelsLast') {\n outShape = [batchSize, outDepth, outHeight, outWidth, outChannels];\n }\n\n return {\n batchSize,\n dataFormat,\n inDepth,\n inHeight,\n inWidth,\n inChannels,\n outDepth,\n outHeight,\n outWidth,\n outChannels,\n padInfo,\n strideDepth,\n strideHeight,\n strideWidth,\n filterDepth,\n filterHeight,\n filterWidth,\n effectiveFilterDepth,\n effectiveFilterHeight,\n effectiveFilterWidth,\n dilationDepth,\n dilationHeight,\n dilationWidth,\n inShape,\n outShape,\n filterShape\n };\n };\n\nexport const createConv3DNaiveProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvAttributes, outputShape: readonly number[],\n filterDims: readonly number[], pads: readonly number[], dataFormat: string): ProgramInfo => {\n const isChannelsLast = dataFormat === 'channelsLast';\n const inChannels = isChannelsLast ? inputs[0].dims[3] : inputs[0].dims[1];\n // TODO: enable vec4.\n const isVec4 = false;\n const workGroupSize: [number, number, number] = [64, 1, 1];\n const dispatchLayout = {x: outputShape.map((_, i) => i)};\n const dispatch = [Math.ceil(arrayProduct(dispatchLayout.x.map(d => outputShape[d])) / (workGroupSize[0])), 1, 1];\n\n LOG_DEBUG('verbose', () => `[conv3d_naive_webgpu] dispatch = ${dispatch}`);\n\n const innerElementSize = isVec4 ? (isChannelsLast && inChannels % 4 !== 0 ? 3 : 4) : 1;\n const outputSize = ShapeUtil.size(outputShape);\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: filterDims},\n {type: DataType.uint32, data: pads}, {type: DataType.uint32, data: attributes.strides},\n {type: DataType.uint32, data: attributes.dilations}\n ];\n programUniforms.push(...createTensorShapeVariables(inputs[0].dims, inputs[1].dims));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n const hasBias = inputs.length === 3;\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'filter_dims', type: 'u32', length: filterDims.length},\n {name: 'pads', type: 'u32', length: pads.length},\n {name: 'strides', type: 'u32', length: attributes.strides.length},\n {name: 'dilations', type: 'u32', length: attributes.dilations.length}\n ];\n // TODO: support component 2, 3.\n const components = isVec4 ? 4 : 1;\n const t = tensorTypeToWsglStorageType(inputs[0].dataType);\n\n const x = inputVariable(\n 'x', inputs[0].dataType, inputs[0].dims.length, innerElementSize === 3 ? 1 : innerElementSize);\n const w = inputVariable('W', inputs[1].dataType, inputs[1].dims.length, components);\n const inputVariables = [x, w];\n const output = outputVariable('result', inputs[0].dataType, outputShape.length, components);\n let declareFunctions = '';\n if (hasBias) {\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, components);\n inputVariables.push(bias);\n declareFunctions += `\n fn getBiasByOutputCoords(coords : array) -> ${isVec4 ? `vec4<${t}>` : t} {\n return bias[${isChannelsLast ? getElementAt('coords', 4, 5) : getElementAt('coords', 1, 5)}${\n isVec4 ? '/ 4' : ''}];\n }`;\n }\n\n return `\n ${declareFunctions}\n fn getX(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 {\n let aIndices = array(d0, d1, d2, d3, d4);\n return ${x.getByIndices('aIndices')};\n }\n fn getW(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 {\n let aIndices = array(d0, d1, d2, d3, d4);\n return ${w.getByIndices('aIndices')};\n }\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let coords = ${output.offsetToIndices('global_idx')};\n let batch = ${getElementAt('coords', 0, x.rank)};\n let d2 = ${\n isChannelsLast ? getElementAt('coords', x.rank - 1, x.rank) : getElementAt('coords', 1, x.rank)};\n let xFRCCorner = vec3(${\n isChannelsLast ? getElementAt('coords', 1, x.rank) : getElementAt('coords', 2, x.rank)},\n ${isChannelsLast ? getElementAt('coords', 2, x.rank) : getElementAt('coords', 3, x.rank)},\n ${\n isChannelsLast ? getElementAt('coords', 3, x.rank) :\n getElementAt('coords', 4, x.rank)}) * uniforms.strides - uniforms.pads;\n let xFCorner = xFRCCorner.x;\n let xRCorner = xFRCCorner.y;\n let xCCorner = xFRCCorner.z;\n let xShapeY = ${\n isChannelsLast ? getElementAt('uniforms.x_shape', 1, x.rank) : getElementAt('uniforms.x_shape', 2, x.rank)};\n let xShapeZ = ${\n isChannelsLast ? getElementAt('uniforms.x_shape', 2, x.rank) : getElementAt('uniforms.x_shape', 3, x.rank)};\n let xShapeW = ${\n isChannelsLast ? getElementAt('uniforms.x_shape', 3, x.rank) : getElementAt('uniforms.x_shape', 4, x.rank)};\n let xShapeU = ${\n isChannelsLast ? getElementAt('uniforms.x_shape', 4, x.rank) : getElementAt('uniforms.x_shape', 1, x.rank)};\n let inputDepthNearestVec4 = (xShapeU / 4) * 4;\n let inputDepthVec4Remainder = xShapeU % 4;\n\n var dotProd = 0.0;\n for (var wF = 0u; wF < uniforms.filter_dims[0]; wF++) {\n let xF = xFCorner + wF * uniforms.dilations[0];\n if (xF < 0 || xF >= xShapeY) {\n continue;\n }\n\n for (var wR = 0u; wR < uniforms.filter_dims[1]; wR++) {\n let xR = xRCorner + wR * uniforms.dilations[1];\n if (xR < 0 || xR >= xShapeZ) {\n continue;\n }\n\n for (var wC = 0u; wC < uniforms.filter_dims[2]; wC++) {\n let xC = xCCorner + wC * uniforms.dilations[2];\n if (xC < 0 || xC >= xShapeW) {\n continue;\n }\n\n for (var d1 = 0u; d1 < inputDepthNearestVec4; d1 += 4) {\n ${\n isChannelsLast ? `let xValues = vec4(\n getX(batch, xF, xR, xC, d1),\n getX(batch, xF, xR, xC, d1 + 1),\n getX(batch, xF, xR, xC, d1 + 2),\n getX(batch, xF, xR, xC, d1 + 3));\n ` :\n `let xValues = vec4(\n getX(batch, d1, xF, xR, xC),\n getX(batch, d1 + 1, xF, xR, xC),\n getX(batch, d1 + 2, xF, xR, xC),\n getX(batch, d1 + 3, xF, xR, xC));\n `}\n let wValues = vec4(\n getW(d2, d1, wF, wR, wC),\n getW(d2, d1 + 1, wF, wR, wC),\n getW(d2, d1 + 2, wF, wR, wC),\n getW(d2, d1 + 3, wF, wR, wC));\n dotProd += dot(xValues, wValues);\n }\n if (inputDepthVec4Remainder == 1) {\n ${\n isChannelsLast ? `dotProd += getX(batch, xF, xR, xC, inputDepthNearestVec4)\n * getW(d2, inputDepthNearestVec4, wF, wR, wC);` :\n `dotProd += getX(batch, inputDepthNearestVec4, xF, xR, xC)\n * getW(d2, inputDepthNearestVec4, wF, wR, wC);`}\n } else if (inputDepthVec4Remainder == 2) {\n ${\n isChannelsLast ? `let xValues = vec2(\n getX(batch, xF, xR, xC, inputDepthNearestVec4),\n getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1));\n ` :\n `let xValues = vec2(\n getX(batch, inputDepthNearestVec4, xF, xR, xC),\n getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC));\n `}\n let wValues = vec2(\n getW(d2, inputDepthNearestVec4, wF, wR, wC),\n getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC));\n dotProd += dot(xValues, wValues);\n } else if (inputDepthVec4Remainder == 3) {\n ${\n isChannelsLast ? `let xValues = vec3(\n getX(batch, xF, xR, xC, inputDepthNearestVec4),\n getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1),\n getX(batch, xF, xR, xC, inputDepthNearestVec4 + 2));\n ` :\n `let xValues = vec3(\n getX(batch, inputDepthNearestVec4, xF, xR, xC),\n getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC),\n getX(batch, inputDepthNearestVec4 + 2, xF, xR, xC));\n `}\n let wValues = vec3(\n getW(d2, inputDepthNearestVec4, wF, wR, wC),\n getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC),\n getW(d2, inputDepthNearestVec4 + 2, wF, wR, wC));\n dotProd += dot(xValues, wValues);\n }\n }\n }\n }\n ${hasBias ? 'dotProd = dotProd + getBiasByOutputCoords(coords)' : ''};\n result[global_idx] = f32(dotProd);\n }`;\n };\n return {\n name: 'Conv3DNaive',\n shaderCache:\n {hint: `${attributes.cacheKey};${isChannelsLast};${innerElementSize};${hasBias}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n programUniforms,\n }),\n getShaderSource\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, getMaxComponents, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\nimport {calculateOutputShape, ConvAttributes} from './conv';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet} from './fuse-utils';\n\n/**\n * naive grouped conv implementation, supports 1d/2d conv\n * @param squeezeOutputShapeFunction - an optional function to squeeze the output shape, only used in conv1d\n */\nexport const createGroupedConvProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvAttributes,\n squeezeOutputShapeFunction?: (shape: readonly number[]) => number[]): ProgramInfo => {\n const hasBias = inputs.length > 2;\n const processBias = hasBias ? 'value += b[output_channel];' : '';\n const xShape = inputs[0].dims;\n const wShape = inputs[1].dims;\n const outputChannelsPerGroup = wShape[0] / attributes.group;\n\n const isChannelLast = attributes.format === 'NHWC';\n const outputShape = calculateOutputShape(\n xShape, wShape, attributes.dilations, attributes.pads, attributes.strides, isChannelLast);\n const outputSize = ShapeUtil.size(outputShape);\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: attributes.dilations},\n {type: DataType.uint32, data: [attributes.strides[0], attributes.strides[1]]},\n {type: DataType.uint32, data: [attributes.pads[0], attributes.pads[1]]},\n {type: DataType.uint32, data: outputChannelsPerGroup}\n ];\n appendActivationUniformsData(attributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(xShape, wShape));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('output', inputs[0].dataType, outputShape.length);\n const baseType = tensorTypeToWsglStorageType(output.type.tensor);\n const applyActivation = getActivationSnippet(attributes, output.type.value, baseType);\n const x = inputVariable('x', inputs[0].dataType, xShape.length);\n const w = inputVariable('w', inputs[1].dataType, wShape.length);\n const inputVars = [x, w];\n if (hasBias) {\n inputVars.push(inputVariable('b', inputs[2].dataType, inputs[2].dims.length));\n }\n\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'dilations', type: 'u32', length: attributes.dilations.length},\n {name: 'strides', type: 'u32', length: 2}, {name: 'pads', type: 'u32', length: 2},\n {name: 'output_channels_per_group', type: 'u32'}\n ];\n appendActivationUniforms(attributes, uniforms);\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVars, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let outputIndices = ${output.offsetToIndices('global_idx')};\n let batch: u32 = outputIndices[0];\n let output_channel: u32 = outputIndices[${isChannelLast ? 3 : 1}];\n let xRCCorner: vec2 = vec2(outputIndices[${isChannelLast ? 1 : 2}], outputIndices[${\n isChannelLast ? 2 : 3}]) * uniforms.strides - uniforms.pads;\n let group_id: u32 = output_channel / uniforms.output_channels_per_group;\n\n var value: ${output.type.value} = ${output.type.value}(0);\n for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[1]; wInChannel++) {\n let input_channel = group_id * uniforms.w_shape[1] + wInChannel;\n for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[2]; wHeight++) {\n let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0];\n\n if (xHeight < 0u || xHeight >= uniforms.x_shape[${isChannelLast ? 1 : 2}]) {\n continue;\n }\n\n for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[3]; wWidth++) {\n let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1];\n if (xWidth < 0u || xWidth >= uniforms.x_shape[${isChannelLast ? 2 : 3}]) {\n continue;\n }\n\n let xVal = ${\n isChannelLast ? x.get('batch', 'xHeight', 'xWidth', 'input_channel') :\n x.get('batch', 'input_channel', 'xHeight', 'xWidth')};\n let wVal = ${w.get('output_channel', 'wInChannel', 'wHeight', 'wWidth')};\n value += xVal*wVal;\n }\n }\n }\n ${processBias}\n ${applyActivation}\n ${output.setByOffset('global_idx', 'value')}\n }`;\n };\n return {\n name: 'GroupedConv',\n shaderCache: {hint: attributes.cacheKey, inputDependencies},\n getRunData: () => ({\n outputs: [{\n dims: squeezeOutputShapeFunction ? squeezeOutputShapeFunction(outputShape) : outputShape,\n dataType: inputs[0].dataType\n }],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n };\n\nexport const createGroupedConvVectorizeProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvAttributes, outputShape: readonly number[]): ProgramInfo => {\n const hasBias = inputs.length > 2;\n const components = getMaxComponents(outputShape[3]);\n const outputNumber = getMaxComponents(outputShape[2]);\n const outputSize = ShapeUtil.size(outputShape) / components / outputNumber;\n const xShape = [inputs[0].dims[0], inputs[0].dims[1], inputs[0].dims[2], inputs[0].dims[3] / components];\n const wShape = [inputs[1].dims[0], inputs[1].dims[1], inputs[1].dims[2], inputs[1].dims[3] / components];\n const outputShapeInShader = [outputShape[0], outputShape[1], outputShape[2], outputShape[3] / components];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize},\n {type: DataType.int32, data: [attributes.strides[0], attributes.strides[1]]},\n {type: DataType.int32, data: [attributes.pads[0], attributes.pads[1]]}\n ];\n appendActivationUniformsData(attributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(xShape, wShape, outputShapeInShader));\n const xNumber = (outputNumber - 1) * attributes.strides[1] + wShape[1];\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('output', inputs[0].dataType, outputShapeInShader.length, components);\n const baseType = tensorTypeToWsglStorageType(output.type.tensor);\n const applyActivation = getActivationSnippet(attributes, output.type.value, baseType);\n const x = inputVariable('x', inputs[0].dataType, xShape.length, components);\n const w = inputVariable('w', inputs[1].dataType, wShape.length, components);\n const inputVars = [x, w];\n if (hasBias) {\n inputVars.push(inputVariable('b', inputs[2].dataType, inputs[2].dims, components));\n }\n const processBias = hasBias ? 'value += b[output_channel];' : '';\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'},\n {name: 'strides', type: 'i32', length: 2},\n {name: 'pads', type: 'i32', length: 2},\n ];\n appendActivationUniforms(attributes, uniforms);\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVars, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let width0 = uniforms.output_shape[3];\n let output_channel = global_idx % width0;\n var index1 = global_idx / width0;\n let width1 = uniforms.output_shape[2] / ${outputNumber}u;\n let col = (index1 % width1) * ${outputNumber}u;\n index1 = index1 / width1;\n let row = index1 % uniforms.output_shape[1];\n let batch = index1 / uniforms.output_shape[1];\n\n let x_corner = vec2(i32(row), i32(col)) * uniforms.strides - uniforms.pads;\n\n var x_vals: array<${x.type.value}, ${xNumber}>;\n var values: array<${output.type.value}, ${outputNumber}>;\n let input_channel = output_channel;\n // Use constant instead of uniform can give better performance for w's height/width.\n for (var w_height: u32 = 0u; w_height < ${wShape[0]}; w_height++) {\n let x_height = x_corner.x + i32(w_height);\n if (x_height >= 0 && u32(x_height) < uniforms.x_shape[1]) {\n for (var i = 0; i < ${xNumber}; i++) {\n let x_width = x_corner.y + i;\n if (x_width >= 0 && u32(x_width) < uniforms.x_shape[2]) {\n x_vals[i] = ${x.get('batch', 'u32(x_height)', 'u32(x_width)', 'input_channel')};\n } else {\n x_vals[i] = ${x.type.value}(0);\n }\n }\n for (var w_width: u32 = 0u; w_width < ${wShape[1]}; w_width++) {\n let w_val = ${w.get('w_height', 'w_width', '0', 'output_channel')};\n for (var i = 0u; i < ${outputNumber}u; i++) {\n values[i] = fma(x_vals[i * u32(uniforms.strides[1]) + w_width], w_val, values[i]);\n }\n }\n }\n }\n\n for (var i = 0u; i < ${outputNumber}u; i++) {\n var value = values[i];\n ${processBias}\n ${applyActivation}\n ${output.set('batch', 'row', 'col + i', 'output_channel', 'value')};\n }\n }`;\n };\n\n return {\n name: 'GroupedConv-Vectorize',\n shaderCache: {\n hint: `${attributes.cacheKey};${components};${outputNumber};${xNumber};${wShape[0]};${wShape[1]}`,\n inputDependencies: hasBias ? ['rank', 'rank', 'type'] : ['rank', 'rank']\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {BroadcastUtil, ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createMatmulProgramInfo} from './3rd-party/matmul_packed_webgpu';\nimport {createTensorShapeVariables, getBroadcastDims, getMaxComponents, IndicesHelper, inputVariable, internalVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet, InternalActivationAttributes} from './fuse-utils';\n\nexport const createNaiveMatmulProgramInfo =\n (inputs: readonly TensorView[], activationAttributes: InternalActivationAttributes, outputShape: readonly number[],\n reshapedOutputShape?: readonly number[],\n isChannelsLast = false /* only used for conv2dByMatMul*/): ProgramInfo => {\n const aShape = inputs[0].dims;\n const bShape = inputs[1].dims;\n\n const M = aShape[aShape.length - 2];\n const N = bShape[bShape.length - 1];\n const K = aShape[aShape.length - 1];\n const components = getMaxComponents(N);\n const aComponents = getMaxComponents(K);\n const outputNumber = getMaxComponents(M);\n const outputSize = ShapeUtil.size(outputShape) / components / outputNumber;\n const hasBias = inputs.length > 2;\n const outerDims = reshapedOutputShape ? reshapedOutputShape.slice(0, -2) : outputShape.slice(0, -2);\n const batchSize = ShapeUtil.size(outerDims);\n const outputShapeInShader = [batchSize, M, N];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: M}, {type: DataType.uint32, data: N},\n {type: DataType.uint32, data: K}\n ];\n appendActivationUniformsData(activationAttributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(outerDims, aShape, bShape));\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n }\n programUniforms.push(...createTensorShapeVariables(outputShapeInShader));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const batchDims = internalVariable('batch_dims', inputs[0].dataType, outerDims.length);\n const a = inputVariable('a', inputs[0].dataType, aShape.length, aComponents);\n const b = inputVariable('b', inputs[1].dataType, bShape.length, components);\n const output = outputVariable('output', inputs[0].dataType, outputShapeInShader.length, components);\n const baseType = tensorTypeToWsglStorageType(output.type.tensor);\n const applyActivation = getActivationSnippet(activationAttributes, output.type.value, baseType);\n const inputVariables = [a, b];\n let processBias = '';\n if (hasBias) {\n const biasComponents = isChannelsLast ? components : 1;\n inputVariables.push(inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, biasComponents));\n processBias = `${\n isChannelsLast ? `value += bias[col / ${biasComponents}];` :\n `value += ${output.type.value}(bias[row + i]);`}`;\n }\n\n const outerDimsA = aShape.slice(0, -2);\n const outerDimsB = bShape.slice(0, -2);\n const broadCastADims = getBroadcastDims(outerDimsA, outerDims);\n const broadCastBDims = getBroadcastDims(outerDimsB, outerDims);\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'M', type: 'u32'}, {name: 'N', type: 'u32'},\n {name: 'K', type: 'u32'}\n ];\n appendActivationUniforms(activationAttributes, uniforms);\n\n const getIndices = (variable: IndicesHelper, broadCastDims: number[]) => {\n const rank = variable.rank;\n const name = variable.name;\n if (rank === 2) {\n return `var ${name}_indices = ${variable.type.indices}(0u, 0u);`;\n }\n const batchRank = batchDims.rank;\n let resStr = `var ${name}_indices: ${variable.type.indices};`;\n for (let i = rank - 2 - 1, j = batchRank - 1; i >= 0; i--, j--) {\n resStr += `\\n${name}_indices[${i}] = ${batchRank > 1 ? `batch_indices[${j}]` : 'batch_indices'};`;\n }\n broadCastDims.forEach(i => {\n resStr += `\\n${name}_indices[${i}] = 0;`;\n });\n resStr += `${name}_indices[${rank - 2}] = 0u;\n ${name}_indices[${rank - 1}] = 0u;`;\n return resStr;\n };\n\n const calcResult = (): string => {\n let calcStr = `var a_data: ${a.type.value};`;\n for (let i = 0; i < aComponents; i++) {\n calcStr += `\n let b_data${i} = b[(b_offset + (k + ${i}) * uniforms.N + col) / ${components}];`;\n }\n for (let i = 0; i < outputNumber; i++) {\n calcStr += `a_data = a[(a_offset + (row + ${i}) * uniforms.K + k) / ${aComponents}];`;\n\n for (let j = 0; j < aComponents; j++) {\n calcStr += `\n values[${i}] = fma(${b.type.value}(a_data${aComponents === 1 ? '' : `[${j}]`}), b_data${j}, values[${\n i}]);\\n`;\n }\n }\n return calcStr;\n };\n\n return `\n ${\n shaderHelper.registerUniforms(uniforms).registerInternalVariables(batchDims).declareVariables(\n ...inputVariables, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let col = (global_idx % (uniforms.N / ${components})) * ${components};\n var index1 = global_idx / (uniforms.N / ${components});\n let stride1 = uniforms.M / ${outputNumber};\n let row = (index1 % stride1) * ${outputNumber};\n let batch = index1 / stride1;\n\n ${outputShape.length === 2 ? '' : `let batch_indices = ${batchDims.offsetToIndices('batch')};`}\n ${getIndices(a, broadCastADims)}\n let a_offset = ${a.indicesToOffset('a_indices')};\n ${getIndices(b, broadCastBDims)}\n let b_offset = ${b.indicesToOffset('b_indices')};\n var values: array<${output.type.value}, ${outputNumber}>;\n for (var k: u32 = 0u; k < uniforms.K; k = k + ${aComponents}) {\n ${calcResult()}\n }\n for (var i = 0u; i < ${outputNumber}u; i++) {\n var value = values[i];\n ${processBias}\n ${applyActivation}\n let cur_indices = ${output.type.indices}(batch, row + i, col);\n let offset = ${output.indicesToOffset('cur_indices')};\n ${output.setByOffset(`offset / ${components}`, 'value')};\n }\n }\n `;\n };\n return {\n name: 'MatMulNaive',\n shaderCache: {\n hint: `${activationAttributes.activation};${components};${aComponents};${outputNumber};${isChannelsLast}`,\n inputDependencies: hasBias ? ['rank', 'rank', 'rank'] : ['rank', 'rank']\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource\n };\n };\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('MatMul requires 2 inputs.');\n }\n\n if (inputs[0].dims[inputs[0].dims.length - 1] !== inputs[1].dims[inputs[1].dims.length - 2]) {\n throw new Error('shared dimension does not match.');\n }\n};\n\nexport const matMul = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n const outputShape = BroadcastUtil.calcShape(context.inputs[0].dims, context.inputs[1].dims, true);\n if (!outputShape) {\n throw new Error('Can\\'t use matmul on the given tensors');\n }\n const N = outputShape[outputShape.length - 1];\n const K = context.inputs[0].dims[context.inputs[0].dims.length - 1];\n if (N < 8 && K < 8) {\n context.compute(createNaiveMatmulProgramInfo(context.inputs, {activation: ''}, outputShape));\n } else {\n context.compute(createMatmulProgramInfo(context.inputs, {activation: ''}, outputShape));\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorView} from '../../tensor-view';\nimport {PoolConvUtil} from '../../util';\nimport {AttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext} from '../types';\n\nimport {createConv2DMatMulProgramInfo} from './3rd-party/conv2d_mm_webgpu';\nimport {computeConv3DInfo, createConv3DNaiveProgramInfo} from './3rd-party/conv3d_naive_webgpu';\nimport {createMatmulProgramInfo} from './3rd-party/matmul_packed_webgpu';\nimport {createGroupedConvProgramInfo, createGroupedConvVectorizeProgramInfo} from './conv-grouped';\nimport {InternalActivationAttributes, parseInternalActivationAttributes} from './fuse-utils';\nimport {createNaiveMatmulProgramInfo} from './matmul';\nimport {createTransposeProgramInfo} from './transpose';\n\nexport const calculateOutputShape =\n (inputShape: readonly number[], kernelShape: readonly number[], dilations: readonly number[],\n adjustPads: readonly number[], strides: readonly number[], isChannelLast: boolean): number[] => {\n const batchSize = inputShape[0];\n const inputSpatialShape = inputShape.slice(isChannelLast ? 1 : 2, isChannelLast ? 3 : 4);\n const spatialRank = inputSpatialShape.length;\n const outChannels = kernelShape[0];\n const kernelSpatialShape = kernelShape.slice(2);\n const dilatedKernelShape = kernelSpatialShape.map((v, i) => v + (v - 1) * (dilations[i] - 1));\n const inputSpatialShapeWithPad = inputSpatialShape.map((v, i) => v + adjustPads[i] + adjustPads[i + spatialRank]);\n const outputShape =\n inputSpatialShapeWithPad.map((v, i) => Math.floor((v - dilatedKernelShape[i] + strides[i]) / strides[i]));\n outputShape.splice(0, 0, batchSize);\n outputShape.splice(isChannelLast ? 3 : 1, 0, outChannels);\n return outputShape;\n };\n\nexport interface ConvAttributes extends InternalActivationAttributes, AttributeWithCacheKey {\n readonly autoPad: string;\n readonly dilations: readonly number[];\n readonly format: 'NHWC'|'NCHW';\n readonly group: number;\n readonly kernelShape: readonly number[];\n readonly pads: readonly number[];\n readonly strides: readonly number[];\n readonly wIsConst: boolean;\n}\n\n// for transposing weight tensor from [M, C/group, KH, KW] to [KH, KW, C/group, M]\nconst weightTransposeAttribute = [2, 3, 1, 0];\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: ConvAttributes): void => {\n // Refer to the below link for all input checks\n // https://github.com/onnx/onnx/blob/master/docs/Operators.md#Conv\n if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n throw new Error('Conv requires 2 or 3 inputs');\n }\n\n if (inputs[0].dims.length > 5) {\n throw new Error('greater than 5D is not supported');\n }\n\n if (inputs[0].dims.length !== inputs[1].dims.length) {\n throw new Error('filter does not have same dimension as input');\n }\n\n // FILTER_IN_CHANNEL should be equal to DATA_CHANNEL\n const dataChannel = inputs[0].dims[attributes.format === 'NHWC' ? inputs[0].dims.length - 1 : 1];\n const filterInChannel = inputs[1].dims[1] * attributes.group;\n if (dataChannel !== filterInChannel) {\n throw new Error('FILTER_IN_CHANNEL should be equal to DATA_CHANNEL');\n }\n\n // if bias is provided it should be 1D and the number of elements should be equal to the number of feature maps\n if (inputs.length === 3 && (inputs[2].dims.length !== 1 || inputs[1].dims[0] !== inputs[2].dims[0])) {\n throw new Error('invalid bias');\n }\n\n const spatialRank = inputs[0].dims.length - 2;\n // wrong dilations dimension\n if (attributes.dilations.length !== spatialRank) {\n throw new Error(`dilations should be ${spatialRank}D`);\n }\n\n // Wrong strides dimension\n if (attributes.strides.length !== spatialRank) {\n throw new Error(`strides should be ${spatialRank}D`);\n }\n\n // Wrong pads dimension\n if (attributes.pads.length !== spatialRank * 2) {\n throw new Error(`pads should be ${spatialRank * 2}D`);\n }\n\n // if kernelShape is specified, it's data length must be 2 less than dims length of the weights tensor\n // (the first 2 dims are batch_size and channels)\n if (attributes.kernelShape.length !== 0 && attributes.kernelShape.length !== inputs[1].dims.length - 2) {\n throw new Error('invalid kernel shape');\n }\n};\n\nconst getAdjustedConvAttributes = (attributes: T, inputs: readonly TensorView[]): T => {\n const kernelShape = attributes.kernelShape.slice();\n // if kernelShape is not specified in the attributes of this op, infer it from the weight tensor dims\n for (let i = 2; i < inputs[1].dims.length; ++i) {\n if (kernelShape[i - 2] === 0) {\n kernelShape[i - 2] = inputs[1].dims[i];\n }\n }\n const pads = attributes.pads.slice();\n PoolConvUtil.adjustPadsBasedOnAutoPad(\n inputs[0].dims, attributes.strides, attributes.dilations, kernelShape, pads, attributes.format === 'NHWC',\n attributes.autoPad);\n\n // always return a new object so does not modify the original attributes\n const newAttributes: T = Object.assign({}, attributes);\n Object.assign(newAttributes, {kernelShape, pads});\n return newAttributes;\n};\n\nexport const parseConvAttributes = (attributes: Record): ConvAttributes => {\n const activationAttributes = parseInternalActivationAttributes(attributes);\n // TODO : Make this generic enough to compute default attributes for multi-dimensional conv\n const format = attributes.format as 'NHWC' | 'NCHW';\n const autoPad = ['NOTSET', 'VALID', 'SAME_UPPER', 'SAME_LOWER'][attributes.auto_pad as number];\n const dilations = attributes.dilations as number[];\n const group = attributes.group as number;\n const kernelShape = attributes.kernel_shape as number[];\n const pads = attributes.pads as number[];\n const strides = attributes.strides as number[];\n const wIsConst = (attributes.w_is_const as () => boolean)();\n\n return {\n autoPad,\n format,\n dilations,\n group,\n kernelShape,\n pads,\n strides,\n wIsConst,\n ...activationAttributes,\n cacheKey: `${attributes.format};${activationAttributes.activation};`\n };\n};\n\nconst conv2d = (context: ComputeContext, inputs: readonly TensorView[], attributes: ConvAttributes): void => {\n const adjustedAttributes = getAdjustedConvAttributes(attributes, inputs);\n\n // check attributes\n\n // const hasPreluActivationWeights = false; /* TODO: add support for prelu activation weights */\n const isChannelsLast = attributes.format === 'NHWC';\n if (attributes.group !== 1) {\n // NVIDIA GPU with ampere architecture fails with below 2 cases, but we couldn't repro them with any other\n // GPUs. So just disable vectorize on NVIDIA ampere to ensure always correct outputs.\n // [webgpu]Conv - conv - vectorize group - B\n // [webgpu]Conv - conv - vectorize group - D\n const enableGroupedConvVectorize = !context.adapterInfo.isArchitecture('ampere');\n if (enableGroupedConvVectorize && isChannelsLast && inputs[1].dims[0] === attributes.group &&\n inputs[1].dims[1] === 1 && attributes.dilations[0] === 1 && attributes.dilations[1] === 1) {\n const outputShape = calculateOutputShape(\n inputs[0].dims, inputs[1].dims, attributes.dilations, adjustedAttributes.pads, attributes.strides,\n isChannelsLast);\n const transposedWeight = (context.kernelCustomData.wT as TensorView | undefined) ??\n context.compute(\n createTransposeProgramInfo(inputs[1], weightTransposeAttribute),\n {inputs: [1], outputs: [attributes.wIsConst ? -2 : -1]})[0];\n if (attributes.wIsConst && !context.kernelCustomData.wT) {\n context.kernelCustomData.wT = transposedWeight;\n }\n const convInputs = [inputs[0], transposedWeight];\n if (inputs.length === 3) {\n convInputs.push(inputs[2]);\n }\n context.compute(\n createGroupedConvVectorizeProgramInfo(convInputs, adjustedAttributes, outputShape), {inputs: convInputs});\n } else {\n context.compute(createGroupedConvProgramInfo(inputs, adjustedAttributes));\n }\n return;\n }\n\n const hasBias = inputs.length === 3;\n const inputHeight = inputs[0].dims[isChannelsLast ? 1 : 2];\n const inputWidth = inputs[0].dims[isChannelsLast ? 2 : 3];\n const inputChannels = inputs[0].dims[isChannelsLast ? 3 : 1];\n const weightHeight = inputs[1].dims[2];\n const weightWidth = inputs[1].dims[3];\n\n const outputShape = calculateOutputShape(\n inputs[0].dims, inputs[1].dims, attributes.dilations, adjustedAttributes.pads, attributes.strides,\n isChannelsLast);\n const outHeight = outputShape[isChannelsLast ? 1 : 2];\n const outWidth = outputShape[isChannelsLast ? 2 : 3];\n const outChannels = outputShape[isChannelsLast ? 3 : 1];\n\n const sameSize = isChannelsLast && weightHeight === inputHeight && weightWidth === inputWidth &&\n attributes.pads[0] === 0 && attributes.pads[1] === 0;\n if (sameSize ||\n (weightHeight === 1 && weightWidth === 1 && attributes.dilations[0] === 1 && attributes.dilations[1] === 1 &&\n attributes.strides[0] === 1 && attributes.strides[1] === 1 && attributes.pads[0] === 0 &&\n attributes.pads[1] === 0)) {\n // conv2dByMatMul\n const batch = outputShape[0];\n let xReshaped, wReshaped, matmulOutputShape;\n const matmulInputs = [];\n if (isChannelsLast) {\n const transposedWeight = (context.kernelCustomData.wT as TensorView | undefined) ??\n context.compute(\n createTransposeProgramInfo(inputs[1], weightTransposeAttribute),\n {inputs: [1], outputs: [attributes.wIsConst ? -2 : -1]})[0];\n if (attributes.wIsConst && !context.kernelCustomData.wT) {\n context.kernelCustomData.wT = transposedWeight;\n }\n if (sameSize) {\n const sharedDim = inputHeight * inputWidth * inputChannels;\n xReshaped = inputs[0].reshape([1, batch, sharedDim]);\n wReshaped = transposedWeight.reshape([1, sharedDim, outChannels]);\n matmulOutputShape = [1, batch, outChannels];\n } else {\n xReshaped = inputs[0].reshape([batch, inputHeight * inputWidth, inputChannels]);\n wReshaped = transposedWeight.reshape([1, inputChannels, outChannels]);\n matmulOutputShape = [batch, outHeight * outWidth, outChannels];\n }\n matmulInputs.push(xReshaped);\n matmulInputs.push(wReshaped);\n } else {\n xReshaped = inputs[0].reshape([batch, inputChannels, inputHeight * inputWidth]);\n wReshaped = inputs[1].reshape([1, outChannels, inputChannels]);\n matmulOutputShape = [batch, outChannels, outHeight * outWidth];\n matmulInputs.push(wReshaped);\n matmulInputs.push(xReshaped);\n }\n if (hasBias) {\n matmulInputs.push(inputs[2]);\n }\n const N = matmulOutputShape[2];\n const K = matmulInputs[0].dims[matmulInputs[0].dims.length - 1];\n // Tune the threshold.\n if (N < 8 && K < 8) {\n context.compute(\n createNaiveMatmulProgramInfo(\n matmulInputs, adjustedAttributes, outputShape, matmulOutputShape, isChannelsLast),\n {inputs: matmulInputs});\n } else {\n context.compute(\n createMatmulProgramInfo(matmulInputs, adjustedAttributes, outputShape, matmulOutputShape, isChannelsLast),\n {inputs: matmulInputs});\n }\n return;\n }\n\n // TODO: implement conv2dWithIm2Col()\n\n const sequentialAccessByThreads = /* backend.adapterInfo.isIntel() */ true;\n\n // STEP.1: transpose weight\n const transposedWeight = (context.kernelCustomData.wT as TensorView | undefined) ??\n context.compute(\n createTransposeProgramInfo(inputs[1], weightTransposeAttribute),\n {inputs: [1], outputs: [attributes.wIsConst ? -2 : -1]})[0];\n if (attributes.wIsConst && !context.kernelCustomData.wT) {\n context.kernelCustomData.wT = transposedWeight;\n }\n\n // STEP.2: prepare reshaped inputs\n const convInputs = [inputs[0], transposedWeight];\n if (hasBias) {\n convInputs.push(inputs[2]);\n }\n\n // STEP.3: compute matmul\n const dimAOuter = isChannelsLast ? outHeight * outWidth : outChannels;\n const dimBOuter = isChannelsLast ? outChannels : outHeight * outWidth;\n const dimInner = weightHeight * weightWidth * inputChannels;\n context.compute(\n createConv2DMatMulProgramInfo(\n convInputs, adjustedAttributes, outputShape, dimAOuter, dimBOuter, dimInner, hasBias,\n sequentialAccessByThreads),\n {inputs: convInputs});\n};\n\nconst conv1d = (context: ComputeContext, attributes: ConvAttributes): void => {\n // extend the input to 2D by adding H dimension\n const isChannelLast = attributes.format === 'NHWC';\n const inputs = [\n context.inputs[0].reshape(\n isChannelLast ?\n // [N, W, C] -> [N, H=1, W, C]\n [context.inputs[0].dims[0], 1, context.inputs[0].dims[1], context.inputs[0].dims[2]] :\n // [N, C, W] -> [N, C, H=1, W]\n [context.inputs[0].dims[0], context.inputs[0].dims[1], 1, context.inputs[0].dims[2]]),\n //[FILTER_OUT_CHANNEL, FILTER_IN_CHANNEL, kW] -> [FILTER_OUT_CHANNEL, FILTER_IN_CHANNEL, kH=1, kW]\n context.inputs[1].reshape([context.inputs[1].dims[0], context.inputs[1].dims[1], 1, context.inputs[1].dims[2]])\n ];\n if (context.inputs.length === 3) {\n inputs.push(context.inputs[2]);\n }\n const pads = [0, attributes.pads[0], 0, attributes.pads[1]];\n const strides = [1].concat(attributes.strides);\n const dilations = [1].concat(attributes.dilations);\n const kernelShape = [1].concat(attributes.kernelShape);\n const adjustedAttributes = getAdjustedConvAttributes({...attributes, pads, strides, dilations, kernelShape}, inputs);\n context.compute(createGroupedConvProgramInfo(\n inputs, adjustedAttributes,\n outputShape => isChannelLast ? [outputShape[0], outputShape[2], outputShape[3]] : []));\n};\n\nconst conv3d = (context: ComputeContext, inputs: readonly TensorView[], attributes: ConvAttributes): void => {\n const format = attributes.format === 'NHWC' ? 'channelsLast' : 'channelsFirst';\n const adjustedAttributes = getAdjustedConvAttributes(attributes, inputs);\n const pads = attributes.autoPad === 'NOTSET' ? attributes.pads : attributes.autoPad;\n const convInfo = computeConv3DInfo(\n inputs[0].dims as [number, number, number, number, number],\n inputs[1].dims as [number, number, number, number, number],\n attributes.strides as number | [number, number, number],\n attributes.dilations as number | [number, number, number], pads as string | number[], false, format);\n context.compute(createConv3DNaiveProgramInfo(\n inputs, adjustedAttributes, convInfo.outShape,\n [convInfo.filterDepth, convInfo.filterHeight, convInfo.filterWidth],\n [convInfo.padInfo.front, convInfo.padInfo.top, convInfo.padInfo.left], format));\n};\n\nexport const conv = (context: ComputeContext, attributes: ConvAttributes): void => {\n validateInputs(context.inputs, attributes);\n if (context.inputs[0].dims.length === 3) {\n conv1d(context, attributes);\n } else if (context.inputs[0].dims.length === 5) {\n conv3d(context, context.inputs, attributes);\n } else {\n conv2d(context, context.inputs, attributes);\n }\n};\n", "/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/conv_backprop_mm_webgpu.ts\n//\n// modified to fit the needs of the project\n\nimport {DataType} from '../../../../wasm-common';\nimport {LOG_DEBUG} from '../../../log';\nimport {TensorView} from '../../../tensor-view';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {ConvTransposeAttributes} from '../conv-transpose';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet} from '../fuse-utils';\n\nimport {biasSnippet} from './activation_util';\nimport {utilFunctions} from './conv_util';\nimport {makeMatMulPackedSource, makeMatMulPackedVec4Source} from './matmul_packed_webgpu';\n\nconst conv2dTransposeCommonSnippet =\n (isChannelsLast: boolean, addBias = false, attributes: ConvTransposeAttributes, type: string,\n innerElementSize = 4): string => {\n const getWSnippet = (innerElementSize: number) => {\n switch (innerElementSize) {\n case 1:\n return 'return w[getIndexFromCoords4D(coord, vec4(uniforms.w_shape))];';\n case 4:\n return `\n let coord1 = vec4(coordX, coordY, col + 1, rowInner);\n let coord2 = vec4(coordX, coordY, col + 2, rowInner);\n let coord3 = vec4(coordX, coordY, col + 3, rowInner);\n let v0 = w[getIndexFromCoords4D(coord, vec4(uniforms.w_shape))];\n let v1 = w[getIndexFromCoords4D(coord1, vec4(uniforms.w_shape))];\n let v2 = w[getIndexFromCoords4D(coord2, vec4(uniforms.w_shape))];\n let v3 = w[getIndexFromCoords4D(coord3, vec4(uniforms.w_shape))];\n return ${type}(v0, v1, v2, v3);\n `;\n default:\n throw new Error(`innerElementSize ${innerElementSize} is not supported.`);\n }\n };\n const coordASnippet = isChannelsLast ? `\n let coord = vec4(batch, iXR, iXC, xCh);\n ` :\n `\n let coord = vec4(batch, xCh, iXR, iXC);\n `;\n\n const coordResSnippet = isChannelsLast ? `\n let coords = vec4(\n batch,\n row / outWidth,\n row % outWidth,\n col);\n ` :\n `\n let coords = vec4(\n batch,\n row,\n col / outWidth,\n col % outWidth);\n `;\n\n const xHeight = isChannelsLast ? 'i32(uniforms.x_shape[1])' : 'i32(uniforms.x_shape[2])';\n const xWidth = isChannelsLast ? 'i32(uniforms.x_shape[2])' : 'i32(uniforms.x_shape[3])';\n const row = isChannelsLast ? 'row' : 'col';\n const col = isChannelsLast ? 'col' : 'row';\n\n const readASnippet = `\n let inChannels = ${isChannelsLast ? 'i32(uniforms.x_shape[3])' : 'i32(uniforms.x_shape[1])'};\n let outWidth = ${isChannelsLast ? 'i32(uniforms.result_shape[2])' : 'i32(uniforms.result_shape[3])'};\n let outRow = ${row} / outWidth;\n let outCol = ${row} % outWidth;\n\n let WRow = ${col} / (uniforms.filter_dims[1] * inChannels);\n let WCol = ${col} / inChannels % uniforms.filter_dims[1];\n let xR = f32(outRow - uniforms.pads[0] + uniforms.dilations[0] * WRow) / f32(uniforms.strides[0]);\n let xC = f32(outCol - uniforms.pads[1] + uniforms.dilations[1] * WCol) / f32(uniforms.strides[1]);\n if (xR < 0.0 || xR >= f32(${xHeight}) || fract(xR) > 0.0) {\n return ${type}(0.0);\n }\n if (xC < 0.0 || xC >= f32(${xWidth}) || fract(xC) > 0.0) {\n return ${type}(0.0);\n }\n let iXR = i32(xR);\n let iXC = i32(xC);\n let xCh = ${col} % inChannels;\n ${coordASnippet}\n return x[getIndexFromCoords4D(coord, vec4(uniforms.x_shape))/${innerElementSize}];`;\n\n const sampleA = isChannelsLast ? `\n let col = colIn * ${innerElementSize};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) {\n ${readASnippet}\n }\n return ${type}(0.0);` :\n `\n let col = colIn * ${innerElementSize};\n if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) {\n ${readASnippet}\n }\n return ${type}(0.0);`;\n\n const sampleW = `\n let col = colIn * ${innerElementSize};\n let inChannels = ${isChannelsLast ? 'i32(uniforms.x_shape[3])' : 'i32(uniforms.x_shape[1])'};\n let coordX = uniforms.filter_dims[0] - 1 - row / (uniforms.filter_dims[1] * inChannels);\n let coordY = uniforms.filter_dims[1] - 1 - (row / inChannels) % uniforms.filter_dims[1];\n if (${\n isChannelsLast ? 'row < uniforms.dim_inner && col < uniforms.dim_b_outer' :\n 'row < uniforms.dim_inner && col < uniforms.dim_a_outer'} && coordX >= 0 && coordY >= 0) {\n let rowInner = row % inChannels;\n let coord = vec4(coordX, coordY, col, rowInner);\n ${getWSnippet(innerElementSize)}\n }\n return ${type}(0.0);\n `;\n\n const applyActivation = getActivationSnippet(attributes, type);\n const userCode = `\n fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${type} {\n ${isChannelsLast ? sampleA : sampleW}\n }\n\n fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${type} {\n ${isChannelsLast ? sampleW : sampleA}\n }\n\n fn mm_write(batch: i32, row : i32, colIn : i32, valueInput : ${type}) {\n let col = colIn * ${innerElementSize};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) {\n var value = valueInput;\n let outWidth = ${isChannelsLast ? 'i32(uniforms.result_shape[2])' : 'i32(uniforms.result_shape[3])'};\n ${coordResSnippet}\n ${biasSnippet(addBias)}\n ${applyActivation}\n result[getIndexFromCoords4D(coords, vec4(uniforms.result_shape))/${innerElementSize}] = value;\n }\n }`;\n return userCode;\n };\n\nexport const createConv2DTransposeMatMulProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvTransposeAttributes, outputShape: readonly number[],\n dimAOuter: number, dimBOuter: number, dimInner: number, hasBias: boolean,\n sequentialAccessByThreads: boolean): ProgramInfo => {\n const isChannelsLast = attributes.format === 'NHWC';\n const inChannels = isChannelsLast ? inputs[0].dims[3] : inputs[0].dims[1];\n const batchSize = outputShape[0];\n const outWidth = isChannelsLast ? outputShape[2] : outputShape[3];\n const outHeight = isChannelsLast ? outputShape[1] : outputShape[2];\n const outChannels = isChannelsLast ? outputShape[3] : outputShape[1];\n // TODO: enable vec4 for NCHW\n const isVec4 = isChannelsLast && (inChannels % 4 === 0 && inChannels % 3) && outChannels % 4 === 0;\n\n // TODO: fine tune size\n const dispatchX = isChannelsLast ? outChannels : outWidth * outHeight;\n const dispatchY = isChannelsLast ? outWidth * outHeight : outChannels;\n const workGroupSize: [number, number, number] = [8, 8, 1];\n const elementsPerThread = dimAOuter <= 8 ? [4, 1, 1] : [4, 4, 1];\n const dispatch = [\n Math.ceil(dispatchX / workGroupSize[0] / elementsPerThread[0]),\n Math.ceil(dispatchY / workGroupSize[1] / elementsPerThread[1]),\n Math.ceil(batchSize / workGroupSize[2] / elementsPerThread[2])\n ];\n\n LOG_DEBUG('verbose', () => `[conv_backprop_mm_webgpu] dispatch = ${dispatch}`);\n\n const innerElementSize = isVec4 ? 4 : 1;\n const tileInner = Math.max(workGroupSize[0] * innerElementSize, workGroupSize[1]);\n const components = isVec4 ? 4 : 1;\n const filterDims =\n [attributes.kernelShape[isChannelsLast ? 1 : 2], attributes.kernelShape[isChannelsLast ? 2 : 3]];\n const effectiveFilterDims = [\n filterDims[0] + (attributes.dilations[0] <= 1 ? 0 : (filterDims[0] - 1) * (attributes.dilations[0] - 1)),\n filterDims[1] + (attributes.dilations[1] <= 1 ? 0 : (filterDims[1] - 1) * (attributes.dilations[1] - 1))\n ];\n const pads = [\n effectiveFilterDims[0] - 1 - Math.floor((attributes.pads[0] + attributes.pads[2]) / 2),\n effectiveFilterDims[1] - 1 - Math.floor((attributes.pads[1] + attributes.pads[3]) / 2)\n ];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.int32, data: dimAOuter}, {type: DataType.int32, data: dimBOuter},\n {type: DataType.int32, data: dimInner}, {type: DataType.int32, data: attributes.strides},\n {type: DataType.int32, data: attributes.dilations}, {type: DataType.int32, data: filterDims},\n {type: DataType.int32, data: pads}\n ];\n appendActivationUniformsData(attributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(inputs[0].dims, inputs[1].dims));\n\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const x = inputVariable('x', inputs[0].dataType, inputs[0].dims.length, components);\n const w = inputVariable('w', inputs[1].dataType, inputs[1].dims.length, 1);\n const output = outputVariable('result', inputs[0].dataType, outputShape.length, components);\n const inputVariables = [x, w];\n\n let declareFunctions = '';\n if (hasBias) {\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, components);\n inputVariables.push(bias);\n declareFunctions += `\n fn getBiasByOutputCoords(coords : vec4) -> ${bias.type.value} {\n return bias[coords.${isChannelsLast ? 'w' : 'y'}${isVec4 ? '/ 4' : ''}];\n }`;\n }\n\n const uniforms: UniformsArrayType = [\n {name: 'dim_a_outer', type: 'i32'}, {name: 'dim_b_outer', type: 'i32'}, {name: 'dim_inner', type: 'i32'},\n {name: 'strides', type: 'i32', length: 2}, {name: 'dilations', type: 'i32', length: 2},\n {name: 'filter_dims', type: 'i32', length: filterDims.length},\n {name: 'pads', type: 'i32', length: pads.length}\n ];\n appendActivationUniforms(attributes, uniforms);\n const elemType = tensorTypeToWsglStorageType(inputs[0].dataType, 1);\n if (elemType !== 'f16' && elemType !== 'f32') {\n throw new Error(`elemType ${elemType} is not supported.`);\n }\n return `\n ${utilFunctions('uniforms.result_strides')}\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)};\n ${declareFunctions}\n ${conv2dTransposeCommonSnippet(isChannelsLast, hasBias, attributes, x.type.value, innerElementSize)}\n ${\n isVec4 ? makeMatMulPackedVec4Source(\n elementsPerThread, workGroupSize, elemType, undefined, !isChannelsLast, tileInner) :\n makeMatMulPackedSource(\n elementsPerThread, workGroupSize, elemType, undefined, !isChannelsLast, tileInner, false,\n undefined, sequentialAccessByThreads)}`;\n };\n\n return {\n name: 'Conv2DTransposeMatMul',\n shaderCache:\n {hint: `${attributes.cacheKey};${elementsPerThread};${workGroupSize};${isVec4}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n programUniforms\n }),\n getShaderSource\n };\n };\n", "/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/conv_backprop_webgpu.ts\n\nimport {DataType} from '../../../../wasm-common';\nimport {LOG_DEBUG} from '../../../log';\nimport {TensorView} from '../../../tensor-view';\nimport {ShapeUtil} from '../../../util';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {ConvTransposeAttributes} from '../conv-transpose';\n\nconst createConvTranspose2DOpProgramShaderSource =\n (shaderHelper: ShaderHelper, inputs: readonly TensorView[], outputShape: readonly number[], hasBias: boolean,\n is1DimensionDispatch: boolean, isVec4 = false, dataType: string, uniforms: UniformsArrayType,\n isChannelsLast = false): string => {\n const rowDim = isChannelsLast ? 1 : 2;\n const colDim = isChannelsLast ? 2 : 3;\n const channelDim = isChannelsLast ? 3 : 1;\n const workPerThread = isVec4 ? 2 : 1;\n\n let declareFunctions = `\n fn setOutputAtIndex(flatIndex : u32, value : ${isVec4 ? `vec4<${dataType}>` : dataType}) {\n result[flatIndex] = ${isVec4 ? `vec4<${dataType}>` : dataType}(value);\n }`;\n if (hasBias) {\n declareFunctions += `\n fn getBiasByOutputCoords(coords : vec4) -> ${isVec4 ? `vec4<${dataType}>` : dataType} {\n return bias[coords.${isChannelsLast ? 'w' : 'y'}${isVec4 ? '/ 4' : ''}];\n }`;\n }\n const components = isVec4 ? 4 : 1;\n const w = inputVariable('W', inputs[1].dataType, inputs[1].dims.length, components);\n const dy = inputVariable('Dy', inputs[0].dataType, inputs[0].dims.length, components);\n const inputVariables = [dy, w];\n if (hasBias) {\n inputVariables.push(inputVariable('bias', inputs[2].dataType, [outputShape[channelDim]].length, components));\n }\n const output = outputVariable('result', inputs[0].dataType, outputShape.length, components);\n\n const codeSnippet4 = `{\n let batch: u32 = ${is1DimensionDispatch ? 'global_id.z' : 'workgroup_id.z'} / uniforms.result_shape[1];\n let r = ${is1DimensionDispatch ? 'global_id.z' : 'workgroup_id.z'} % uniforms.result_shape[1];\n let c = ${is1DimensionDispatch ? 'global_id.y' : 'workgroup_id.y'} * ${workPerThread};\n let d1: u32 = ${is1DimensionDispatch ? 'global_id.x' : 'workgroup_id.x'} * 4;\n\n let dyCorner = vec2(i32(r), i32(c)) - vec2(uniforms.pads);\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n var dotProd: array, ${workPerThread}>;\n for (var i = 0; i < ${workPerThread}; i++) {\n dotProd[i] = vec4<${dataType}>(0.0);\n }\n for (var wR: u32 = 0; wR < uniforms.filter_dims[0]; wR = wR + 1) {\n var dyR = (${dataType}(dyCorner.x) + ${dataType}(wR)) / ${dataType}(uniforms.strides.x);\n let wRPerm = uniforms.filter_dims[0] - 1 - wR;\n if (dyR < 0.0 || dyR >= ${dataType}(uniforms.Dy_shape[1]) ||\n fract(dyR) > 0.0 || wRPerm < 0) {\n continue;\n }\n let idyR: u32 = u32(dyR);\n\n for (var wC: u32 = 0; wC < uniforms.filter_dims[1]; wC = wC + 1) {\n let dyC = (${dataType}(dyCorner.y) + ${dataType}(wC)) / ${dataType}(uniforms.strides.y);\n let dyC2 = (${dataType}(dyCorner.y) + 1.0 + ${dataType}(wC)) / ${dataType}(uniforms.strides.y);\n let wCPerm = uniforms.filter_dims[1] - 1 - wC;\n if (wCPerm < 0) {\n continue;\n }\n var bDyCVal = true;\n var bDyCVal2 = true;\n if (dyC < 0.0 || dyC >= ${dataType}(uniforms.Dy_shape[2]) ||\n fract(dyC) > 0.0) {\n bDyCVal = false;\n }\n if (dyC2 < 0.0 || dyC2 >= ${dataType}(uniforms.Dy_shape[2]) ||\n fract(dyC2) > 0.0) {\n bDyCVal2 = false;\n }\n\n let idyC: u32 = u32(dyC);\n let idyC2: u32 = u32(dyC2);\n if (bDyCVal && bDyCVal2) {\n let d2Length = uniforms.Dy_shape[3];\n for (var d2 :u32 = 0; d2 < d2Length; d2 = d2 + 4) {\n let wValue0 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1', 'd2')};\n let wValue1 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 1', 'd2')};\n let wValue2 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 2', 'd2')};\n let wValue3 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 3', 'd2')};\n\n var xValue = ${dy.get('batch', 'idyR', 'idyC', 'd2')};\n let tmpval = vec4<${dataType}>(dot(xValue, wValue0),\n dot(xValue, wValue1),\n dot(xValue, wValue2),\n dot(xValue, wValue3));\n dotProd[0] = dotProd[0] + tmpval;\n\n xValue = ${dy.get('batch', 'idyR', 'idyC2', 'd2')};\n\n dotProd[1] = dotProd[1] + vec4<${dataType}>(dot(xValue, wValue0),\n dot(xValue, wValue1),\n dot(xValue, wValue2),\n dot(xValue, wValue3));\n }\n } else if (bDyCVal) {\n let d2Length = uniforms.Dy_shape[${channelDim}];\n for (var d2: u32 = 0; d2 < d2Length; d2 = d2 + 4) {\n let wValue0 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1', 'd2')};\n let wValue1 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 1', 'd2')};\n let wValue2 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 2', 'd2')};\n let wValue3 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 3', 'd2')};\n\n var xValue = ${dy.get('batch', 'idyR', 'idyC', 'd2')};\n let tmpval = vec4<${dataType}>(dot(xValue, wValue0),\n dot(xValue, wValue1),\n dot(xValue, wValue2),\n dot(xValue, wValue3));\n dotProd[0] = dotProd[0] + tmpval;\n }\n } else if (bDyCVal2) {\n let d2Length = uniforms.Dy_shape[3];\n for (var d2: u32 = 0; d2 < d2Length; d2 = d2 + 4) {\n let wValue0 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1', 'd2')};\n let wValue1 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 1', 'd2')};\n let wValue2 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 2', 'd2')};\n let wValue3 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 3', 'd2')};\n\n var xValue = ${dy.get('batch', 'idyR', 'idyC2', 'd2')};\n let tmpval = vec4<${dataType}>(dot(xValue, wValue0),\n dot(xValue, wValue1),\n dot(xValue, wValue2),\n dot(xValue, wValue3));\n dotProd[1] = dotProd[1] + tmpval;\n }\n }\n }\n }\n\n for (var i: u32 = 0; i < ${workPerThread}; i = i + 1) {\n let value = dotProd[i] + ${hasBias ? 'bias[c+i]' : `vec4<${dataType}>(0.0)`};\n ${output.set('batch', 'r', 'c + i', 'd1', 'value')};\n }\n }`;\n const codeSnippet = `\n let outputIndices = ${output.offsetToIndices('global_idx')};\n let batch = ${output.indicesGet('outputIndices', 0)};\n let d1 = ${output.indicesGet('outputIndices', channelDim)};\n let r = ${output.indicesGet('outputIndices', rowDim)};\n let c = ${output.indicesGet('outputIndices', colDim)};\n let dyCorner = vec2(i32(r), i32(c)) - uniforms.pads;\n let dyRCorner = dyCorner.x;\n let dyCCorner = dyCorner.y;\n let groupId = d1 / uniforms.output_channels_per_group;\n let wOutChannel = d1 - groupId * uniforms.output_channels_per_group;\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n var dotProd = ${dataType}(0.0);\n for (var wR: u32 = 0; wR < uniforms.effective_filter_dims.x; wR = wR + 1) {\n if (wR % uniforms.dilations.x != 0) {\n continue;\n }\n let dyR = (${dataType}(dyRCorner) + ${dataType}(wR)) / ${dataType}(uniforms.strides[0]);\n let wRPerm = uniforms.filter_dims.x - 1 - wR / uniforms.dilations.x;\n if (dyR < 0.0 || dyR >= ${dataType}(uniforms.Dy_shape[${rowDim}]) || fract(dyR) > 0.0 ||\n wRPerm < 0) {\n continue;\n }\n let idyR: u32 = u32(dyR);\n\n for (var wC: u32 = 0; wC < uniforms.effective_filter_dims.y; wC = wC + 1) {\n if (wC % uniforms.dilations.y != 0) {\n continue;\n }\n let dyC = (${dataType}(dyCCorner) + ${dataType}(wC)) / ${dataType}(uniforms.strides.y);\n let wCPerm = uniforms.filter_dims.y - 1 - wC / uniforms.dilations.y;\n if (dyC < 0.0 || dyC >= ${dataType}(uniforms.Dy_shape[${colDim}]) ||\n fract(dyC) > 0.0 || wCPerm < 0) {\n continue;\n }\n let idyC: u32 = u32(dyC);\n var inputChannel = groupId * uniforms.input_channels_per_group;\n for (var d2: u32 = 0; d2 < uniforms.input_channels_per_group; d2 = d2 + 1) {\n let xValue = ${\n isChannelsLast ? dy.get('batch', 'idyR', 'idyC', 'inputChannel') :\n dy.get('batch', 'inputChannel', 'idyR', 'idyC')};\n let wValue = ${w.get('inputChannel', 'wOutChannel', 'u32(wRPerm)', 'u32(wCPerm)')};\n dotProd = dotProd + xValue * wValue;\n inputChannel = inputChannel + 1;\n }\n }\n }\n let value = dotProd + ${hasBias ? 'bias[d1]' : `${dataType}(0.0)`};\n ${output.setByOffset('global_idx', 'value')};\n `;\n\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)}\n ${declareFunctions}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')};\n ${isVec4 ? codeSnippet4 : codeSnippet}}`;\n };\n\nexport const createConvTranspose2DProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvTransposeAttributes,\n squeezeOutputShapeFunction?: (shape: readonly number[]) => number[]): ProgramInfo => {\n const hasBias = inputs.length > 2;\n // const isChannelsLast = attributes.format === 'NHWC';\n const outputShape = attributes.outputShape;\n const outputSize = ShapeUtil.size(outputShape);\n\n // const inChannels = inputs[0].dims[isChannelsLast ? 3 : 1];\n // TODO Enable isVec4 for performance\n // Disabled due to weight matrix layout issue\n // const isVec4 = attributes.group === 1 && isChannelsLast && inChannels % 4 === 0 && outChannels % 4 === 0;\n const dispatch = [\n Math.ceil(outputSize / 64),\n 1,\n 1,\n ];\n LOG_DEBUG('verbose', () => `[conv2d_backprop_webgpu] dispatch = ${dispatch}`);\n\n const isChannelsLast = attributes.format === 'NHWC';\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n const strides = [attributes.strides[0], attributes.strides[1]];\n const filterDims =\n [attributes.kernelShape[isChannelsLast ? 1 : 2], attributes.kernelShape[isChannelsLast ? 2 : 3]];\n const dilations = [attributes.dilations[0], attributes.dilations[1]];\n const effectiveFilterDims = [\n filterDims[0] +\n (attributes.dilations[0] <= 1 ?\n 0 :\n (attributes.kernelShape[isChannelsLast ? 1 : 2] - 1) * (attributes.dilations[0] - 1)),\n filterDims[1] +\n (attributes.dilations[1] <= 1 ?\n 0 :\n (attributes.kernelShape[isChannelsLast ? 2 : 3] - 1) * (attributes.dilations[1] - 1))\n ];\n const pads = [\n effectiveFilterDims[0] - 1 - Math.floor((attributes.pads[0] + attributes.pads[2]) / 2),\n effectiveFilterDims[1] - 1 - Math.floor(attributes.pads[1] + attributes.pads[3]) / 2\n ];\n\n const isVec4 = false;\n const group = attributes.group;\n const wShape = inputs[1].dims;\n const inputChannelsPerGroup = wShape[0] / group;\n const outputChannelsPerGroup = wShape[1];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: strides},\n {type: DataType.uint32, data: filterDims}, {type: DataType.uint32, data: dilations},\n {type: DataType.uint32, data: effectiveFilterDims}, {type: DataType.int32, data: pads},\n {type: DataType.uint32, data: inputChannelsPerGroup}, {type: DataType.uint32, data: outputChannelsPerGroup},\n ...createTensorShapeVariables(inputs[0].dims, inputs[1].dims)\n ];\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const is1DimensionDispatch = dispatch[1] === 1 && dispatch[2] === 1;\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'strides', type: 'u32', length: strides.length},\n {name: 'filter_dims', type: 'u32', length: filterDims.length},\n {name: 'dilations', type: 'u32', length: filterDims.length},\n {name: 'effective_filter_dims', type: 'u32', length: effectiveFilterDims.length},\n {name: 'pads', type: 'i32', length: pads.length}, {name: 'input_channels_per_group', type: 'u32'},\n {name: 'output_channels_per_group', type: 'u32'}\n ];\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n return `${\n createConvTranspose2DOpProgramShaderSource(\n shaderHelper, inputs, outputShape, hasBias, is1DimensionDispatch, isVec4, dataType, uniforms,\n isChannelsLast)}`;\n };\n return {\n name: 'ConvTranspose2D',\n shaderCache: {hint: `${attributes.cacheKey};`, inputDependencies},\n getRunData: () => ({\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n outputs: [{\n dims: squeezeOutputShapeFunction ? squeezeOutputShapeFunction(outputShape) : outputShape,\n dataType: inputs[0].dataType\n }],\n programUniforms\n }),\n getShaderSource\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorView} from '../../tensor-view';\nimport {ComputeContext} from '../types';\n\nimport {createConv2DTransposeMatMulProgramInfo} from './3rd-party/conv_backprop_mm_webgpu';\nimport {createConvTranspose2DProgramInfo} from './3rd-party/conv_backprop_webgpu';\nimport {ConvAttributes} from './conv';\nimport {parseInternalActivationAttributes} from './fuse-utils';\nimport {createTransposeProgramInfo} from './transpose';\n\nconst computeTotalPad =\n (inDim: number, stride: number, adj: number, kernel: number, dilation: number, outSize: number) =>\n (inDim - 1) * stride + adj + (kernel - 1) * dilation + 1 - outSize;\n\nconst distributePadding = (totalPad: number, autoPad: string, pads: number[], head: number, tail: number) => {\n const smallPad = Math.floor(totalPad / 2);\n if (autoPad === 'SAME_UPPER') {\n pads[head] = smallPad;\n pads[tail] = totalPad - smallPad;\n } else if (autoPad === 'SAME_LOWER') {\n pads[head] = totalPad - smallPad;\n pads[tail] = smallPad;\n }\n};\n\nconst calculateOutputShapeAndPads =\n (inputShape: readonly number[], kernelShape: readonly number[], dilations: readonly number[], autoPad: string,\n group: number, pads: number[], strides: readonly number[], isChannelLast: boolean, outputPadding: number[],\n outputShape: number[]) => {\n const spatialRank = inputShape.length - 2;\n const updateOutputShape = outputShape.length === 0;\n if (outputPadding.length === 0) {\n for (let i = 0; i < spatialRank; ++i) {\n outputPadding.push(0);\n }\n }\n const batchSize = inputShape[0];\n const outChannels = kernelShape[isChannelLast ? 3 : 1] * group;\n for (let i = 0, j = inputShape.length - spatialRank - (isChannelLast ? 1 : 0); i < spatialRank; ++i, ++j) {\n const inSize = inputShape[j];\n const outSize = updateOutputShape ? inSize * strides[i] : outputShape[i];\n const totalPad = computeTotalPad(inSize, strides[i], pads[i], kernelShape[j], dilations[i], outSize);\n distributePadding(totalPad, autoPad, pads, i, i + spatialRank);\n if (updateOutputShape) {\n outputShape.push(\n strides[i] * (inSize - 1) + outputPadding[i] + (kernelShape[j] - 1) * dilations[i] + 1 - pads[i] -\n pads[i + spatialRank]);\n }\n }\n outputShape.splice(0, 0, batchSize);\n outputShape.splice(isChannelLast ? 3 : 1, 0, outChannels);\n };\n\nexport interface ConvTransposeAttributes extends ConvAttributes {\n readonly outputPadding: readonly number[];\n readonly outputShape: readonly number[];\n}\n\nconst getAdjustedConvTransposeAttributes =\n (attributes: T, inputs: readonly TensorView[]): T => {\n const kernelShape = attributes.kernelShape.slice();\n // if kernelShape is not specified in the attributes of this op, infer it from the weight tensor dims\n if (attributes.kernelShape.length === 0 || attributes.kernelShape.reduce((a, b) => a * b, 1) === 0) {\n kernelShape.length = 0;\n for (let i = 2; i < inputs[1].dims.length; ++i) {\n kernelShape.push(inputs[1].dims[i]);\n }\n }\n const isChannelsLast = attributes.format === 'NHWC';\n kernelShape.splice(0, 0, inputs[1].dims[0]);\n kernelShape.splice(isChannelsLast ? 3 : 1, 0, inputs[1].dims[1]);\n\n const pads = attributes.pads.slice();\n const outputShape = attributes.outputShape.slice();\n const outputPadding = attributes.outputPadding.slice();\n const inputShape = inputs[0].dims;\n let dilations = attributes.dilations.slice();\n if (dilations.reduce((a, b) => a + b, 0) === 0) {\n const spatialRank = inputs[0].dims.length - 2;\n dilations = new Array(spatialRank).fill(1);\n }\n let strides = attributes.strides.slice();\n if (strides.reduce((a, b) => a + b, 0) === 0) {\n const spatialRank = inputs[0].dims.length - 2;\n strides = new Array(spatialRank).fill(1);\n }\n // If outputShape is not specified in the attributes of this op, infer it from the parameters\n // Similarly, automatically infer pads if not specified\n calculateOutputShapeAndPads(\n inputShape, kernelShape, dilations, attributes.autoPad, attributes.group, pads, strides, isChannelsLast,\n outputPadding, outputShape);\n\n // always return a new object so does not modify the original attributes\n const newAttributes: T = Object.assign({}, attributes);\n Object.assign(newAttributes, {kernelShape, pads, outputPadding, outputShape, dilations, strides});\n return newAttributes;\n };\n\nexport const parseConvTransposeAttributes = (attributes: Record): ConvTransposeAttributes => {\n const activationAttributes = parseInternalActivationAttributes(attributes);\n // TODO : Make this generic enough to compute default attributes for multi-dimensional conv\n const format = attributes.format as 'NHWC' | 'NCHW';\n const autoPad =\n ['NOTSET', 'VALID', 'SAME_UPPER',\n 'SAME_LOWER'][typeof attributes.autoPad == 'undefined' ? 0 : attributes.autoPad as number];\n const dilations = attributes.dilations as [number, number];\n const group = attributes.group as number;\n const kernelShape = attributes.kernelShape as [number, number];\n const pads = attributes.pads as [number, number, number, number];\n const strides = attributes.strides as [number, number];\n const wIsConst = (attributes.wIsConst as () => boolean)();\n const outputPadding = attributes.outputPadding as [number, number, number, number];\n const outputShape = attributes.outputShape as [number, number];\n return {\n autoPad,\n format,\n dilations,\n group,\n kernelShape,\n outputPadding,\n outputShape,\n pads,\n strides,\n wIsConst,\n ...activationAttributes,\n cacheKey: `${attributes.format};${activationAttributes.activation};`\n };\n};\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: ConvTransposeAttributes): void => {\n // Refer to the below link for all input checks\n // https://github.com/onnx/onnx/blob/main/docs/Operators.md#ConvTranspose\n if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n throw new Error('Conv requires 2 or 3 inputs');\n }\n\n // TODO : Need to add support for multi-dimensional conv\n if (inputs[0].dims.length !== 4 && inputs[0].dims.length !== 3) {\n throw new Error('currently only support 2-dimensional conv');\n }\n\n if (inputs[0].dims.length !== inputs[1].dims.length) {\n throw new Error('filter does not have same dimension as input');\n }\n\n // FILTER_IN_CHANNEL should be equal to DATA_CHANNEL\n const dataChannel = inputs[0].dims[attributes.format === 'NHWC' ? inputs[0].dims.length - 1 : 1];\n const filterInChannel = inputs[1].dims[0];\n if (dataChannel !== filterInChannel) {\n throw new Error('FILTER_IN_CHANNEL should be equal to DATA_CHANNEL');\n }\n\n const featureMaps = inputs[1].dims[1] * attributes.group;\n\n // if bias is provided it should be 1D and the number of elements should be equal to the number of feature maps\n if (inputs.length === 3 && (inputs[2].dims.length !== 1 || inputs[2].dims[0] !== featureMaps)) {\n throw new Error('invalid bias');\n }\n\n const spatialRank = inputs[0].dims.length - 2;\n const dilationsSet = attributes.dilations.reduce((a, b) => a + b, 0) > 0;\n // wrong dilations dimension\n if (dilationsSet && attributes.dilations.length !== spatialRank) {\n throw new Error(`dilations should be ${spatialRank}D`);\n }\n\n const stridesSet = attributes.strides.reduce((a, b) => a + b, 0) > 0;\n // Wrong strides dimension\n if (stridesSet && attributes.strides.length !== spatialRank) {\n throw new Error(`strides should be ${spatialRank}D`);\n }\n\n // Wrong pads dimension\n const padsSet = attributes.pads.reduce((a, b) => a + b, 0) > 0;\n if (padsSet && attributes.pads.length !== spatialRank * 2) {\n throw new Error(`pads should be ${spatialRank * 2}D`);\n }\n\n // Wrong output padding dimension\n if (attributes.outputPadding.length !== spatialRank && attributes.outputPadding.length !== 0) {\n throw new Error(`output_padding should be ${spatialRank}D`);\n }\n\n // if kernelShape is specified, it's data length must be 2 less than dims length of the weights tensor\n // (the first 2 dims are batch_size and channels)\n const kernelShapeSet = attributes.kernelShape.reduce((a, b) => a + b, 0) > 0;\n if (kernelShapeSet && attributes.kernelShape.length !== 0 &&\n attributes.kernelShape.length !== inputs[1].dims.length - 2) {\n throw new Error('invalid kernel shape');\n }\n\n // as with kernelShape, must have same number of spatial dims as input\n if (attributes.outputShape.length !== 0 && attributes.outputShape.length !== inputs[0].dims.length - 2) {\n throw new Error('invalid output shape');\n }\n};\n\n// for transposing weight tensor from [C, M/group, KH, KW] to [KH, KW, M/group, C]\nconst weightTransposePerm = [2, 3, 1, 0];\n\nconst convTranspose2d =\n (context: ComputeContext, inputs: readonly TensorView[], attributes: ConvTransposeAttributes): void => {\n const adjustedAttributes = getAdjustedConvTransposeAttributes(attributes, inputs);\n const isChannelsLast = attributes.format === 'NHWC';\n const outputShape = adjustedAttributes.outputShape;\n const outChannels = outputShape[isChannelsLast ? 3 : 1];\n const inputChannels = inputs[0].dims[isChannelsLast ? 3 : 1];\n // Switch to naive method when outChannels and inputChannels are very small. It's because that in this case it's\n // not suitable for matmul version since matmul uses tile size 32x32 resulting the underlying execution unit\n // utilization rate is very low.\n if (adjustedAttributes.group !== 1 || (outChannels === 1 && inputChannels === 1)) {\n context.compute(createConvTranspose2DProgramInfo(inputs, adjustedAttributes));\n return;\n }\n const outHeight = outputShape[isChannelsLast ? 1 : 2];\n const outWidth = outputShape[isChannelsLast ? 2 : 3];\n const weightHeight = inputs[1].dims[2];\n const weightWidth = inputs[1].dims[3];\n\n const dimAOuter = isChannelsLast ? outHeight * outWidth : outChannels;\n const dimBOuter = isChannelsLast ? outChannels : outHeight * outWidth;\n const dimInner = weightHeight * weightWidth * inputChannels;\n\n const sequentialAccessByThreads = /* backend.adapterInfo.isIntel() */ true;\n\n\n // STEP.1: transpose weight\n const transposedWeight = (context.kernelCustomData.wT as TensorView | undefined) ??\n context.compute(\n createTransposeProgramInfo(inputs[1], weightTransposePerm),\n {inputs: [1], outputs: [attributes.wIsConst ? -2 : -1]})[0];\n if (attributes.wIsConst && !context.kernelCustomData.wT) {\n context.kernelCustomData.wT = transposedWeight;\n }\n\n // STEP.2: prepare reshaped inputs\n const convTransposeInputs = [inputs[0], transposedWeight];\n const hasBias = inputs.length === 3;\n if (hasBias) {\n if (!isChannelsLast && inputs[2].dims.length === 1) {\n convTransposeInputs.push(inputs[2].reshape([inputs[2].dims[0], 1, 1]));\n } else {\n convTransposeInputs.push(inputs[2]);\n }\n }\n\n // STEP.3: compute matmul\n context.compute(\n createConv2DTransposeMatMulProgramInfo(\n convTransposeInputs, adjustedAttributes, outputShape, dimAOuter, dimBOuter, dimInner, hasBias,\n sequentialAccessByThreads),\n {inputs: convTransposeInputs});\n };\n\nconst convTranspose1d = (context: ComputeContext, attributes: ConvTransposeAttributes): void => {\n // extend the input to 2D by adding H dimension\n const isChannelLast = attributes.format === 'NHWC';\n\n const inputs = [\n context.inputs[0].reshape(\n isChannelLast ?\n // [N, W, C] -> [N, H=1, W, C]\n [context.inputs[0].dims[0], 1, context.inputs[0].dims[1], context.inputs[0].dims[2]] :\n // [N, C, W] -> [N, C, H=1, W]\n [context.inputs[0].dims[0], context.inputs[0].dims[1], 1, context.inputs[0].dims[2]]),\n //[FILTER_OUT_CHANNEL, FILTER_IN_CHANNEL, kW] -> [FILTER_OUT_CHANNEL, FILTER_IN_CHANNEL, kH=1, kW]\n context.inputs[1].reshape([context.inputs[1].dims[0], context.inputs[1].dims[1], 1, context.inputs[1].dims[2]])\n ];\n if (context.inputs.length === 3) {\n inputs.push(context.inputs[2]);\n }\n let kernelShape = attributes.kernelShape;\n if (kernelShape.length === 0 || kernelShape[0] === 0) {\n kernelShape = [context.inputs[1].dims[2]];\n }\n let dilations = attributes.dilations;\n if (dilations.length === 0 || dilations[0] === 0) {\n dilations = [1];\n }\n let strides = attributes.strides;\n if (strides.length === 0 || strides[0] === 0) {\n strides = [1];\n }\n let pads = attributes.pads;\n if (pads.length === 0) {\n pads = [0, 0];\n }\n pads = [0, pads[0], 0, pads[1]];\n strides = [1].concat(strides);\n dilations = [1].concat(dilations);\n kernelShape = [1].concat(kernelShape);\n const adjustedAttributes =\n getAdjustedConvTransposeAttributes({...attributes, pads, strides, dilations, kernelShape}, inputs);\n context.compute(createConvTranspose2DProgramInfo(\n inputs, adjustedAttributes,\n outputShape => isChannelLast ? [outputShape[0], outputShape[2], outputShape[3]] :\n [outputShape[0], outputShape[1], outputShape[3]]));\n};\n\nexport const convTranspose = (context: ComputeContext, attributes: ConvTransposeAttributes): void => {\n validateInputs(context.inputs, attributes);\n if (context.inputs[0].dims.length === 3) {\n convTranspose1d(context, attributes);\n } else {\n convTranspose2d(context, context.inputs, attributes);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, inputVariable, outputVariable, ShaderHelper} from './common';\n\n\nexport interface CumSumAttributes extends AttributeWithCacheKey {\n readonly exclusive: boolean;\n readonly reverse: boolean;\n}\nconst createCumsumProgramInfo =\n (inputType: number, inputShape: readonly number[], axisInput: TensorView, attributes: CumSumAttributes):\n ProgramInfo => {\n const outputSize = ShapeUtil.size(inputShape); // outputShape is same as inputShape.\n const rank = inputShape.length; // input/output rank\n const input = inputVariable('input', inputType, rank);\n const output = outputVariable('output', inputType, rank);\n const axisValue = axisInput.dataType === DataType.int32 ? axisInput.getInt32Array()[0] :\n Number(axisInput.getBigInt64Array()[0]);\n const axis = ShapeUtil.normalizeAxis(axisValue, rank);\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const index = ` i32(${input.indicesGet('inputIndices', 'uniforms.axis')}) `;\n const max = getElementAt('uniforms.input_shape', 'uniforms.axis', rank);\n const lowerLimit = attributes.reverse ? index + (attributes.exclusive ? ' + 1' : '') : '0';\n const upperLimit = attributes.reverse ? max : index + (attributes.exclusive ? '' : ' + 1');\n return `\n ${\n shaderHelper.registerUniform('outputSize', 'u32')\n .registerUniform('axis', 'u32')\n .declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n var inputIndices = ${output.offsetToIndices('global_idx')};\n var sum = ${output.type.value}(0);\n let first : i32 = ${lowerLimit};\n let last : i32 = ${upperLimit};\n for (var i : i32 = first; i < last; i++) {\n ${input.indicesSet('inputIndices', 'uniforms.axis', 'u32(i)')};\n sum = sum + ${input.getByIndices('inputIndices')};\n }\n ${output.setByOffset('global_idx', 'sum')};\n }`;\n };\n return {\n name: 'CumSum',\n shaderCache: {hint: attributes.cacheKey, inputDependencies: ['rank']},\n getRunData: () => ({\n outputs: [{dims: inputShape, dataType: inputType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms: [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: axis},\n ...createTensorShapeVariables(inputShape, inputShape)\n ]\n\n }),\n getShaderSource\n };\n };\n\n\nexport const cumsum = (context: ComputeContext, attributes: CumSumAttributes): void => {\n const inputShape = context.inputs[0].dims;\n const inputType = context.inputs[0].dataType;\n const axis = context.inputs[1];\n context.compute(createCumsumProgramInfo(inputType, inputShape, axis, attributes), {inputs: [0]});\n};\n\nexport const parseCumSumAttributes = (attributes: Record): CumSumAttributes => {\n const exclusive = attributes.exclusive as number === 1;\n const reverse = attributes.reverse as number === 1;\n return createAttributeWithCacheKey({exclusive, reverse});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface FormatAttributes {\n readonly format: 'NHWC'|'NCHW';\n}\n\nexport interface DepthToSpaceAttributes extends FormatAttributes, AttributeWithCacheKey {\n readonly blocksize: number;\n readonly mode: string;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('DepthToSpace requires 1 input.');\n }\n if (inputs[0].dims.length !== 4) {\n throw new Error('DepthToSpace requires 4D input.');\n }\n};\n\nconst permFunctionBody = (perm: number[], rank: number, input: IndicesHelper, output: IndicesHelper): string => {\n const reverseFunc = [];\n reverseFunc.push(`fn perm(i: ${output.type.indices}) -> ${input.type.indices} {\n var a: ${input.type.indices};`);\n for (let i = 0; i < rank; ++i) {\n reverseFunc.push(input.indicesSet('a', perm[i], `i[${i}]`));\n }\n reverseFunc.push('return a;}');\n return reverseFunc.join('\\n');\n};\n\nconst createDepthToSpaceProgramInfo = (inputTensor: TensorView, attributes: DepthToSpaceAttributes): ProgramInfo => {\n let n: number, h: number, w: number, c: number;\n let shape: number[];\n let perm: number[];\n const isChannelLast = attributes.format === 'NHWC';\n const blocksize = attributes.blocksize;\n const isDCRmode = attributes.mode === 'DCR';\n if (isChannelLast) {\n [n, h, w, c] = inputTensor.dims;\n shape = isDCRmode ? [n, h, w, blocksize, blocksize, c / (blocksize ** 2)] :\n [n, h, w, c / (blocksize ** 2), blocksize, blocksize];\n perm = isDCRmode ? [0, 1, 3, 2, 4, 5] : [0, 1, 4, 2, 5, 3];\n } else {\n [n, h, w, c] = [inputTensor.dims[0], inputTensor.dims[2], inputTensor.dims[3], inputTensor.dims[1]];\n shape = isDCRmode ? [n, blocksize, blocksize, c / (blocksize ** 2), h, w] :\n [n, c / (blocksize ** 2), blocksize, blocksize, h, w];\n perm = isDCRmode ? [0, 3, 4, 1, 5, 2] : [0, 1, 4, 2, 5, 3];\n }\n const reshapedInputTensor = inputTensor.reshape(shape);\n const reshapedInputRank = reshapedInputTensor.dims.length;\n const inputDataType = inputTensor.dataType;\n\n const reshapedInput = inputVariable('a', inputDataType, reshapedInputRank);\n const permedOutput = outputVariable('output', inputDataType, reshapedInputRank);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(reshapedInput, permedOutput)}\n\n ${permFunctionBody(perm, reshapedInputRank, reshapedInput, permedOutput)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let indices = ${permedOutput.offsetToIndices('global_idx')};\n let aIndices = perm(indices);\n\n ${permedOutput.setByOffset('global_idx', reshapedInput.getByIndices('aIndices'))}\n }`;\n\n return {\n name: 'DepthToSpace',\n shaderCache: {hint: `${inputTensor.dims};${attributes.blocksize};${attributes.mode}`, inputDependencies: ['rank']},\n getRunData: (inputs) => {\n const outputShape = isChannelLast ? [n, h * blocksize, w * blocksize, c / (blocksize ** 2)] :\n [n, c / (blocksize ** 2), h * blocksize, w * blocksize];\n const outputSize = ShapeUtil.size(outputShape);\n const shapeBeforePerm = reshapedInputTensor.dims;\n const shapeAfterPerm = ShapeUtil.sortBasedOnPerm(shapeBeforePerm, perm);\n return {\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms:\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(shapeBeforePerm, shapeAfterPerm)],\n };\n },\n getShaderSource,\n };\n};\n\nexport const depthToSpace = (context: ComputeContext, attributes: DepthToSpaceAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createDepthToSpaceProgramInfo(context.inputs[0], attributes));\n};\n\nexport const parseDepthToSpaceAttributes = (attributes: Record): DepthToSpaceAttributes =>\n createAttributeWithCacheKey({\n blocksize: attributes.blocksize as number,\n mode: attributes.mode as string,\n format: attributes.format as 'NHWC' | 'NCHW'\n });\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface EinsumAttributes extends AttributeWithCacheKey {\n readonly equation: string;\n}\n// The equation attribute value is a string which consists of left hand side (LHS) and optionally right hand side (RHS)\n// separated by '->'. Ex. \"ij,jk -> ik\" expresses matrix multiplication\n// \"ij->ji\" expresses matrix transpose\n// \"ii->i\" diagonal elements of a square matrix\n// LHS consists of a sequence of terms separated by commas. Each term corresponds to an input variable.\n// Each symbol corresponds to a dimension in the input variable. The symbol can be either a letter, 'a' to 'z' or 'A' to\n// 'Z' or '...' to represent arbitrary dimensions.\n\nconst symbolPattern =\n '[a-zA-Z]|\\\\.\\\\.\\\\.'; // The pattern each symbol in each term in the symbolic equation should match\nconst termPattern = '(' + symbolPattern + ')+'; // The pattern each term in the symbolic equation should match\nconst termPatternOnly = '^' + termPattern + '$'; // The patterns only matchs a term begin to end.\nconst lhsPattern = '(' + termPattern + ',)*' + termPattern; // The pattern the LHS should match\nconst lhsPatternOnly = '^' + lhsPattern + '$'; // The patterns only matchs a LHS begin to end.\n\ninterface SymbolInfo {\n count: number; // Symbol corresponding to a dimmension of an input\n inputIndices: number[]; // Number of input variables the symbol corresponds to\n dimValue: number; // Number of dimensions the symbol corresponds to\n}\n\nclass EinsumTerm {\n constructor(inputIndex = -1) {\n this.symbolToIndices = new Map();\n this.inputIndex = inputIndex;\n }\n\n // Add a symbol to the term\n addSymbol(symbol: string, index: number) {\n let value = this.symbolToIndices.get(symbol);\n if (value === undefined) {\n value = [index];\n } else {\n value.push(index);\n }\n this.symbolToIndices.set(symbol, value);\n }\n\n symbolToIndices: Map; // Map from symbol to dimensions of the input corresponding to the term\n inputIndex: number; // -1 for output and 0, 1, 2, ... for inputs\n}\n\nclass EinsumEquation {\n constructor(inputs: readonly TensorView[], public readonly equation: string) {\n this.hasEllipsis = false;\n this.symbolToInfo = new Map();\n this.lhs = new Array();\n this.outputDims = [];\n // As rhs needs to be updated allow using let instead of const for both lhs and rhs.\n // eslint-disable-next-line prefer-const\n let [lhs, rhs] = equation.includes('->') ? equation.split('->', 2) : [equation, ''];\n if (!lhs.match(RegExp(lhsPatternOnly))) {\n throw new Error('Invalid LHS term');\n }\n const inputTerms = lhs.split(',');\n inputTerms.forEach((inputTerm, index) => {\n const dims = inputs[index].dims.slice();\n if (!inputTerm.match(RegExp(termPatternOnly))) {\n throw new Error('Invalid LHS term');\n }\n const einsumTerm = this.processTerm(inputTerm, true, dims, index);\n this.lhs.push(einsumTerm);\n });\n\n // Initialize the RHS if not specified\n if (rhs === '') {\n // Construct RHS from LHS terms/symbols\n rhs += [...this.symbolToInfo.entries()]\n .filter(([sym, info]) => (info.count === 1 || sym === '...'))\n .map(([sym]) => sym)\n .join('');\n } else {\n if (!rhs.match(RegExp(termPattern))) {\n throw new Error('Invalid RHS');\n }\n }\n\n // Compute output dims\n const rhsSymbols = rhs.match(RegExp(symbolPattern, 'g'));\n rhsSymbols?.forEach((symbol) => {\n if (symbol === '...') {\n this.outputDims = this.outputDims.concat(this.ellipsisDims);\n } else {\n const info = this.symbolToInfo.get(symbol);\n if (info === undefined) {\n throw new Error('Invalid RHS symbol');\n }\n this.outputDims.push(info.dimValue);\n }\n });\n this.rhs = this.processTerm(rhs, false, this.outputDims);\n } // End of EinsumEqation constructor\n\n // Add a symbol to the equation\n addSymbol(symbol: string, dimValue: number, inputIndex: number) {\n let info = this.symbolToInfo.get(symbol);\n if (info !== undefined) {\n if (info.dimValue !== dimValue && info.count !== 1) {\n throw new Error('Dimension mismatch');\n } else {\n info.count++;\n info.inputIndices.push(inputIndex);\n }\n } else {\n info = {count: 1, dimValue, inputIndices: [inputIndex]};\n }\n this.symbolToInfo.set(symbol, info);\n }\n\n // Process one input/output term\n processTerm(term: string, isInput: boolean, dims: readonly number[], index = -1): EinsumTerm {\n const rank = dims.length;\n let ellipsis = false;\n let ellipsisDims = [];\n let nextDim = 0;\n // For output empty string is allowed because the output may be reduced to a scalar value\n if (!term.match(RegExp(termPatternOnly)) && (!isInput && term !== '')) {\n throw new Error('Invalid LHS term');\n }\n const indexSymbols = term.match(RegExp(symbolPattern, 'g'));\n const einsumTerm = new EinsumTerm(index);\n // symbol can be either a lettre, 'a' to 'z' or 'A' to 'Z', or '...'\n indexSymbols?.forEach((symbol: string, i: number) => {\n if (symbol === '...') {\n if (ellipsis) {\n throw new Error('Only one ellipsis is allowed per input term');\n }\n ellipsis = true;\n const ellipsisDimLength = rank - indexSymbols.length + 1;\n if (ellipsisDimLength < 0) {\n throw new Error('Ellipsis out of bounds');\n }\n ellipsisDims = dims.slice(nextDim, nextDim + ellipsisDimLength);\n if (this.hasEllipsis) {\n if (this.ellipsisDims.length !== ellipsisDims.length ||\n this.ellipsisDims.toString() !== ellipsisDims.toString()) {\n throw new Error('Ellipsis dimensions mismatch');\n }\n } else if (isInput) {\n this.hasEllipsis = true;\n this.ellipsisDims = ellipsisDims;\n } else {\n throw new Error('Ellipsis must be specified in the LHS');\n }\n // Add '0', '1', '2', '3', '4', etc to represent ellipsis dimensions to avoid special handling\n for (let j = 0; j < ellipsisDims.length; j++) {\n const symbol = String.fromCharCode('0'.charCodeAt(0) + j);\n einsumTerm.addSymbol(symbol, i + j);\n this.addSymbol(symbol, dims[nextDim++], index);\n }\n } else {\n einsumTerm.addSymbol(symbol, i + (this.hasEllipsis ? this.ellipsisDims.length - 1 : 0));\n this.addSymbol(symbol, dims[nextDim++], index);\n }\n });\n return einsumTerm;\n }\n\n symbolToInfo: Map; // All symbols in the equation\n hasEllipsis: boolean; // The equation has ellipsis or not\n ellipsisDims: number[]; // The dimensions of the equation ellipsis corresponds to.\n lhs: EinsumTerm[]; // Terms on the left-hand side of the equation\n rhs: EinsumTerm; // Term on the right-hand side of the equation\n outputDims: number[]; // Output dimensions of the equation\n} // End of class EinsumEquation\n\nconst appendMax = (name: string): string => name + '_max';\n\nconst createEinsumProgramInfo =\n (inputShapes: Array, dataType: number, einsumEquation: EinsumEquation,\n outputShape: readonly number[]): ProgramInfo => {\n const ranks = inputShapes.map((dims) => dims.length);\n const inputVars = ranks.map((rank, index) => inputVariable(`input${index}`, dataType, rank));\n const outputSize = ShapeUtil.size(outputShape);\n const output = outputVariable('output', dataType, outputShape.length);\n const uniformsSymbols =\n [...einsumEquation.symbolToInfo.keys()].filter((symbol) => !einsumEquation.rhs.symbolToIndices.has(symbol));\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const idxCopy: string[] = [];\n const initProd = 'var prod = 1.0;';\n const initSum = 'var sum = 0.0;';\n const updateSum = 'sum += prod;';\n const reduceOpsSetIndices: string[] = [];\n const reduceOpsLoopHeaders: string[] = [];\n const reduceOpsLoopFooters: string[] = [];\n const reduceOpCompute: string[] = [];\n const isReduceOpsWithoutLoop = einsumEquation.symbolToInfo.size === einsumEquation.rhs.symbolToIndices.size;\n einsumEquation.symbolToInfo.forEach((info, symbol) => {\n if (einsumEquation.rhs.symbolToIndices.has(symbol)) {\n const outputIndex = einsumEquation.rhs.symbolToIndices.get(symbol)?.[0];\n if (outputIndex !== undefined) {\n einsumEquation.lhs.forEach((term, i) => {\n if (info.inputIndices.includes(i)) {\n const indices = term.symbolToIndices.get(symbol);\n if (indices === undefined) {\n throw new Error('Invalid symbol error');\n }\n indices.forEach((index) => {\n idxCopy.push(`${\n inputVars[i].indicesSet(\n `input${i}Indices`, index, output.indicesGet('outputIndices', outputIndex))}`);\n });\n }\n });\n }\n } else {\n einsumEquation.lhs.forEach((term, i) => {\n if (info.inputIndices.includes(i)) {\n const indices = term.symbolToIndices.get(symbol);\n if (indices === undefined) {\n throw new Error('Invalid symbol error');\n }\n indices.forEach((index) => {\n reduceOpsSetIndices.push(`${inputVars[i].indicesSet(`input${i}Indices`, index, `${symbol}`)}`);\n });\n reduceOpCompute.push(`prod *= ${inputVars[i].getByIndices(`input${i}Indices`)};`);\n }\n });\n reduceOpsLoopHeaders.push(\n `for(var ${symbol}: u32 = 0; ${symbol} < uniforms.${appendMax(symbol)}; ${symbol}++) {`);\n reduceOpsLoopFooters.push('}');\n }\n });\n const reduceOps = isReduceOpsWithoutLoop ?\n [\n ...idxCopy,\n `let sum = ${inputVars.map((inputVar, i) => inputVar.getByIndices(`input${i}Indices`)).join(' * ')};`\n ] :\n [\n ...idxCopy,\n initSum,\n ...reduceOpsLoopHeaders,\n ...reduceOpsSetIndices,\n initProd,\n ...reduceOpCompute,\n updateSum,\n ...reduceOpsLoopFooters,\n ];\n return `\n ${\n shaderHelper\n .registerUniforms(uniformsSymbols.map((symbol) => ({name: `${appendMax(symbol)}`, type: 'u32'})))\n .registerUniform('outputSize', 'u32')\n .declareVariables(...inputVars, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n var outputIndices = ${output.offsetToIndices('global_idx')};\n ${inputVars.map((_var, i) => `var input${i}Indices: ${inputVars[i].type.indices};`).join('\\n')}\n ${reduceOps.join('\\n')};\n ${output.setByOffset('global_idx', 'sum')};\n }`;\n };\n return {\n name: 'Einsum',\n shaderCache: {hint: einsumEquation.equation, inputDependencies: inputShapes.map(() => 'rank')},\n getRunData: () => {\n // The symbols from uniformSymbols array are guaranteed to exist in einsumEquations.symbolToInfo map. The\n // filter is added to make sure that dimValue is never 0.\n const programUniformsInit: ProgramUniform[] =\n uniformsSymbols.filter((symbol) => einsumEquation.symbolToInfo.has(symbol))\n .map(\n (symbol) =>\n ({type: DataType.uint32, data: einsumEquation.symbolToInfo.get(symbol)?.dimValue || 0}));\n programUniformsInit.push({type: DataType.uint32, data: outputSize});\n const programUniforms: ProgramUniform[] =\n inputShapes.map((dims, _) => [...createTensorShapeVariables(dims)])\n .reduce((acc, inputProgramUniforms) => acc.concat(inputProgramUniforms), programUniformsInit);\n programUniforms.push(...createTensorShapeVariables(outputShape));\n return ({\n outputs: [{dims: outputShape, dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n });\n },\n getShaderSource,\n };\n };\n\nexport const einsum = (context: ComputeContext, attributes: EinsumAttributes): void => {\n const einsumEquation = new EinsumEquation(context.inputs, attributes.equation);\n const outputShape = einsumEquation.outputDims;\n const inputShapes = context.inputs.map((input, _) => input.dims);\n context.compute(createEinsumProgramInfo(inputShapes, context.inputs[0].dataType, einsumEquation, outputShape));\n};\n\nexport const parseEinsumAttributes = (attributes: Record): EinsumAttributes => {\n const equation = (attributes.equation as string).replace(/\\s+/g, '');\n return createAttributeWithCacheKey({equation});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Expand requires 2 input.');\n }\n const inputShape = inputs[0].dims;\n const shape = Array.from(inputs[1].getBigInt64Array(), Number);\n\n let shapeIndex = shape.length < inputShape.length ? 0 : shape.length - inputShape.length;\n let inputShapeIndex = inputShape.length < shape.length ? 0 : inputShape.length - shape.length;\n for (; shapeIndex < shape.length && inputShapeIndex < inputShape.length; ++shapeIndex, ++inputShapeIndex) {\n if (shape[shapeIndex] !== inputShape[inputShapeIndex] && shape[shapeIndex] !== 1 &&\n inputShape[inputShapeIndex] !== 1) {\n throw new Error('Expand requires shape to be broadcastable to input');\n }\n }\n};\n\nconst getAdjustedShape = (shape1: readonly number[], shape2: readonly number[]): number[] => {\n const diff = shape1.length - shape2.length;\n const shape: number[] = [];\n for (let i = 0; i < diff; ++i) {\n shape.push(shape1[i]);\n }\n for (let i = 0; i < shape2.length; ++i) {\n shape.push(shape2[i] === 1 ? shape1[i + diff] : shape2[i]);\n }\n return shape;\n};\n\nconst calculateOutputShape = (inputShape: readonly number[], shape: readonly number[]): number[] =>\n (inputShape.length > shape.length) ? getAdjustedShape(inputShape, shape) : getAdjustedShape(shape, inputShape);\n\n\nconst createExpandProgramInfo = (inputs: readonly TensorView[]): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const shape = Array.from(inputs[1].getBigInt64Array(), Number);\n const outputShape: number[] = calculateOutputShape(inputShape, shape);\n const dataType = inputs[0].dataType;\n const components = dataType === DataType.bool ? 4 : 1;\n const outputSize = Math.ceil(ShapeUtil.size(outputShape) / components);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const input = inputVariable('input', dataType, inputShape.length, components);\n const output = outputVariable('output', dataType, outputShape.length, components);\n let assignment: string;\n if (dataType === DataType.bool) {\n const singleAssignment = (resStr: string, x: number, typeCast = '') => `\n let outputIndices${x} = ${output.offsetToIndices(`outputOffset + ${x}u`)};\n let offset${x} = ${input.broadcastedIndicesToOffset(`outputIndices${x}`, output)};\n let index${x} = offset${x} / 4u;\n let component${x} = offset${x} % 4u;\n ${resStr}[${x}] = ${typeCast}(${input.getByOffset(`index${x}`)}[component${x}]);\n `;\n assignment = `\n let outputOffset = global_idx * ${components};\n var data = vec4(0);\n ${singleAssignment('data', 0, 'u32')}\n ${singleAssignment('data', 1, 'u32')}\n ${singleAssignment('data', 2, 'u32')}\n ${singleAssignment('data', 3, 'u32')}\n ${output.setByOffset('global_idx', 'data')}\n }`;\n } else {\n assignment = `\n let outputIndices = ${output.offsetToIndices('global_idx')};\n let inputOffset = ${input.broadcastedIndicesToOffset('outputIndices', output)};\n ${output.setByOffset('global_idx', input.getByOffset('inputOffset'))}\n }`;\n }\n return `\n ${shaderHelper.registerUniform('vec_size', 'u32').declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.vec_size')}\n ${assignment}`;\n };\n\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(inputShape, outputShape)];\n return {\n name: 'Expand',\n shaderCache: {hint: `${outputShape.length}`, inputDependencies: ['rank']},\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n })\n };\n};\n\nexport const expand = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n context.compute(createExpandProgramInfo(context.inputs), {inputs: [0]});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglValueType, UniformsArrayType, WORKGROUP_SIZE} from './common';\nimport * as unary from './unary-op';\n\n// GELU is defined as Y=0.5*X*(1+tanh(0.797885*X+0.035677*X*X*X)), where X may pre-add a bias.\n\nconst createFastGeluProgramInfo = (inputTensors: readonly TensorView[]): ProgramInfo => {\n const dataType = inputTensors[0].dataType;\n const outputSize = ShapeUtil.size(inputTensors[0].dims);\n const biasLength = ShapeUtil.size(inputTensors[1].dims);\n // can only use vec4 when bias length is multiple of 4\n const useVec4 = biasLength % 4 === 0;\n const getShaderSource = (shaderHelper: ShaderHelper): string => {\n const x = inputVariable('x', dataType, [1], 4);\n const bias = inputVariable('bias', dataType, [1], 4);\n const y = outputVariable('y', dataType, [1], 4);\n\n const uniforms: UniformsArrayType = [{name: 'output_vec_size', type: 'u32'}, {name: 'bias_size', type: 'u32'}];\n\n const singleElementBias = (i: 0|1|2|3) => `\n let bias${i}_offset: u32 = (global_idx * 4 + ${i}) % uniforms.bias_size;\n let bias${i} = ${bias.getByOffset(`bias${i}_offset / 4`)}[bias${i}_offset % 4];`;\n const biasGetExpression = useVec4 ?\n `\n let bias = ${bias.getByOffset('global_idx % (uniforms.bias_size / 4)')};` :\n `${singleElementBias(0)}${singleElementBias(1)}${singleElementBias(2)}${singleElementBias(3)}\n let bias = ${x.type.value}(bias0, bias1, bias2, bias3);`;\n\n return `${shaderHelper.registerUniforms(uniforms).declareVariables(x, bias, y)}\n\n ${unary.fastGeluImpl(tensorTypeToWsglValueType(dataType))}\n\n ${shaderHelper.mainStart(WORKGROUP_SIZE)}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_vec_size')}\n\n let x = ${x.getByOffset('global_idx')};\n ${biasGetExpression}\n let x_in = x + bias;\n ${y.setByOffset('global_idx', unary.fastGeluExpression('x_in'))}\n }`;\n };\n\n return {\n name: 'FastGeluWithBias',\n shaderCache: {hint: `${useVec4}`, inputDependencies: ['type', 'type']},\n getShaderSource,\n getRunData: (inputs) => ({\n outputs: [{dims: inputs[0].dims, dataType: inputs[0].dataType}],\n programUniforms:\n [{type: DataType.uint32, data: Math.ceil(outputSize / 4)}, {type: DataType.uint32, data: biasLength}],\n dispatchGroup: {x: Math.ceil(outputSize / WORKGROUP_SIZE / 4)}\n })\n };\n};\n\nexport const fastGelu = (context: ComputeContext): void => {\n if (context.inputs.length < 2 || ShapeUtil.size(context.inputs[1].dims) === 0) {\n unary.fastGelu(context);\n } else {\n context.compute(createFastGeluProgramInfo(context.inputs));\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface GatherAttributes extends AttributeWithCacheKey {\n axis: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Gather requires 2 inputs.');\n }\n};\n\nconst createGatherProgramInfo = (inputs: readonly TensorView[], attributes: GatherAttributes): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const indicesShape = inputs[1].dims;\n\n const inputRank = inputShape.length;\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputRank);\n\n const outputShape = inputShape.slice(0);\n outputShape.splice(axis, 1, ...indicesShape);\n\n const axisDimLimit = inputShape[axis];\n const components = inputs[0].dataType === DataType.bool ? 4 : 1;\n const outputSize = Math.ceil(ShapeUtil.size(outputShape) / components);\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.int32, data: axisDimLimit},\n {type: DataType.uint32, data: axis}, ...createTensorShapeVariables(inputs[0].dims, inputs[1].dims, outputShape)\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const data = inputVariable('data', inputs[0].dataType, inputs[0].dims.length, components);\n const indices = inputVariable('inputIndices', inputs[1].dataType, inputs[1].dims.length);\n const output = outputVariable('output', inputs[0].dataType, outputShape.length, components);\n\n const calcDataIndices = (x: number|string): string => {\n const indicesRank = indicesShape.length;\n let calcStr = `var indicesIndices${x} = ${indices.type.indices}(0);`;\n for (let i = 0; i < indicesRank; i++) {\n calcStr += `${indicesRank > 1 ? `indicesIndices${x}[${i}]` : `indicesIndices${x}`} = ${\n outputShape.length > 1 ? `outputIndices${x}[uniforms.axis + ${i}]` : `outputIndices${x}`};`;\n }\n calcStr += `\n var idx${x} = ${indices.getByIndices(`indicesIndices${x}`)};\n if (idx${x} < 0) {\n idx${x} = idx${x} + uniforms.axisDimLimit;\n }\n var dataIndices${x} : ${data.type.indices};\n `;\n for (let i = 0, j = 0; i < inputRank; i++) {\n if (i === axis) {\n calcStr += `${inputRank > 1 ? `dataIndices${x}[${i}]` : `dataIndices${x}`} = u32(idx${x});`;\n j += indicesRank;\n } else {\n calcStr += `${inputRank > 1 ? `dataIndices${x}[${i}]` : `dataIndices${x}`} = ${\n outputShape.length > 1 ? `outputIndices${x}[${j}]` : `outputIndices${x}`};`;\n j++;\n }\n }\n return calcStr;\n };\n let assignment: string;\n if (inputs[0].dataType === DataType.bool) {\n const singleAssignment = (resStr: string, x: number, typeCast = '') => `\n let outputIndices${x} = ${output.offsetToIndices(`outputOffset + ${x}u`)};\n ${calcDataIndices(x)};\n let offset${x} = ${data.indicesToOffset(`dataIndices${x}`)};\n let index${x} = offset${x} / 4u;\n let component${x} = offset${x} % 4u;\n ${resStr}[${x}] = ${typeCast}(${data.getByOffset(`index${x}`)}[component${x}]);\n `;\n assignment = `\n let outputOffset = global_idx * ${components};\n var value = vec4(0);\n ${singleAssignment('value', 0, 'u32')}\n ${singleAssignment('value', 1, 'u32')}\n ${singleAssignment('value', 2, 'u32')}\n ${singleAssignment('value', 3, 'u32')}\n ${output.setByOffset('global_idx', 'value')}\n `;\n } else {\n assignment = `\n let outputIndices = ${output.offsetToIndices('global_idx')};\n ${calcDataIndices('')};\n let value = ${data.getByIndices('dataIndices')};\n ${output.setByOffset('global_idx', 'value')};\n `;\n }\n return `\n ${\n shaderHelper.registerUniform('outputSize', 'u32')\n .registerUniform('axisDimLimit', 'i32')\n .registerUniform('axis', 'u32')\n .declareVariables(data, indices, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n ${assignment}\n }`;\n };\n return {\n name: 'Gather',\n shaderCache: {hint: attributes.cacheKey, inputDependencies: ['rank', 'rank']},\n getRunData: () => ({\n outputs: [\n {dims: outputShape, dataType: inputs[0].dataType},\n ],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n};\n\nexport const parseGatherAttributes = (attributes: Record): GatherAttributes =>\n createAttributeWithCacheKey({axis: attributes.axis as number});\n\nexport const gather = (context: ComputeContext, attributes: GatherAttributes): void => {\n const inputs = context.inputs;\n validateInputs(inputs);\n context.compute(createGatherProgramInfo(context.inputs, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface GatherElementsAttributes extends AttributeWithCacheKey {\n axis: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('GatherElements requires 2 inputs.');\n }\n\n if (inputs[0].dims.length < 1) {\n throw new Error('GatherElements requires that the data input be rank >= 1.');\n }\n\n if (inputs[0].dims.length !== inputs[1].dims.length) {\n throw new Error(`GatherElements requires that the data input and\n indices input tensors be of same rank.`);\n }\n};\n\nconst createGatherElementsProgramInfo =\n (inputs: readonly TensorView[], attributes: GatherElementsAttributes): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const inputOutputDataType = inputs[0].dataType;\n const inputRank = inputShape.length;\n\n const indicesShape = inputs[1].dims;\n const indicesDataType = inputs[1].dataType;\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputRank);\n const axisDimLimit = inputShape[axis];\n\n const outputShape = indicesShape.slice(0);\n const outputSize = ShapeUtil.size(outputShape);\n\n const input = inputVariable('input', inputOutputDataType, inputRank);\n const indices = inputVariable('indicesInput', indicesDataType, indicesShape.length);\n const output = outputVariable('output', inputOutputDataType, outputShape.length);\n\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.int32, data: axisDimLimit},\n {type: DataType.uint32, data: axis}\n ];\n programUniforms.push(...createTensorShapeVariables(inputShape, indicesShape, outputShape));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n\n // int64 indices would be treated as little endian i32 with assumption they fall in i32 limits\n // That assumption is safe as it's not possible to allocate >2gb buffer for input tensor\n // Input data will be treated as u32 or two u32 for 8-byte tensors\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${\n shaderHelper.registerUniform('outputSize', 'u32')\n .registerUniform('axisDimLimit', 'i32')\n .registerUniform('axis', 'u32')\n .declareVariables(input, indices, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n\n let outputIndices = ${output.offsetToIndices('global_idx')};\n\n var idx = ${indices.getByOffset('global_idx')};\n if (idx < 0) {\n idx = idx + uniforms.axisDimLimit;\n }\n var inputIndices = ${input.type.indices}(outputIndices);\n ${input.indicesSet('inputIndices', 'uniforms.axis', 'u32(idx)')};\n let value = ${input.getByIndices('inputIndices')};\n\n ${output.setByOffset('global_idx', 'value')};\n }`;\n\n return {\n name: 'GatherElements',\n shaderCache: {inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n };\n\nexport const parseGatherElementsAttributes = (attributes: Record): GatherElementsAttributes =>\n createAttributeWithCacheKey({axis: attributes.axis as number});\n\nexport const gatherElements = (context: ComputeContext, attributes: GatherElementsAttributes): void => {\n const inputs = context.inputs;\n validateInputs(inputs);\n context.compute(createGatherElementsProgramInfo(context.inputs, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {GemmUtil, ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs) {\n throw new Error('Input is missing');\n }\n if (inputs.length < 2 || inputs.length > 3) {\n throw new Error('Invaid input number.');\n }\n\n // 'C' can be of dimensionality 0, 1 or 2 only\n if (inputs.length === 3 && inputs[2].dims.length > 2) {\n throw new Error('Invalid input shape of C');\n }\n\n if ((inputs[0].dataType !== inputs[1].dataType) ||\n (inputs.length === 3 && inputs[0].dataType !== inputs[2].dataType)) {\n throw new Error('Input types are mismatched');\n }\n};\n\nexport interface GemmAttributes extends AttributeWithCacheKey {\n transA: boolean;\n transB: boolean;\n alpha: number;\n beta: number;\n}\n\nconst createGemmProgramInfo = (inputs: readonly TensorView[], attributes: GemmAttributes): ProgramInfo => {\n const aShape = inputs[0].dims.slice();\n const bShape = inputs[1].dims.slice();\n const [M, N, K] = GemmUtil.getShapeOfGemmResult(\n aShape, attributes.transA, bShape, attributes.transB, inputs.length === 3 ? inputs[2].dims : undefined);\n const outputShape = [M, N];\n if (!outputShape) {\n throw new Error('Can\\'t use gemm on the given tensors');\n }\n const outputSize = ShapeUtil.size(outputShape);\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: M}, {type: DataType.uint32, data: N},\n {type: DataType.uint32, data: K}, {type: DataType.float, data: attributes.alpha},\n {type: DataType.float, data: attributes.beta}\n ];\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type'];\n if (inputs.length === 3) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n let line = '';\n if (attributes.transA && attributes.transB) {\n line = 'value += a[k * uniforms.M + m] * b[n * uniforms.K + k];';\n } else if (attributes.transA && !attributes.transB) {\n line = 'value += a[k * uniforms.M + m] * b[k * uniforms.N + n];';\n } else if (!attributes.transA && attributes.transB) {\n line = 'value += a[m * uniforms.K + k] * b[n * uniforms.K + k];';\n } else if (!attributes.transA && !attributes.transB) {\n line = 'value += a[m * uniforms.K + k] * b[k * uniforms.N + n];';\n }\n\n const calculateAlpha = attributes.alpha === 1 ? '' : 'value *= uniforms.alpha;';\n const a = inputVariable('a', inputs[0].dataType, inputs[0].dims);\n const b = inputVariable('b', inputs[1].dataType, inputs[1].dims);\n const dataType = a.type.value;\n let c: IndicesHelper|null = null;\n const variables = [a, b];\n if (inputs.length === 3) {\n c = inputVariable('c', inputs[2].dataType, inputs[2].dims.length);\n variables.push(c);\n }\n const output = outputVariable('output', inputs[0].dataType, outputShape.length);\n variables.push(output);\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'M', type: 'u32'}, {name: 'N', type: 'u32'}, {name: 'K', type: 'u32'},\n {name: 'alpha', type: 'f32'}, {name: 'beta', type: 'f32'}\n ];\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...variables)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let m = global_idx / uniforms.N;\n let n = global_idx % uniforms.N;\n\n var value = ${dataType}(0);\n for (var k: u32 = 0u; k < uniforms.K; k++) {\n ${line}\n }\n\n ${calculateAlpha}\n ${(() => {\n if (c != null) {\n return `let cOffset = ${c.broadcastedIndicesToOffset('vec2(m, n)', output)}; value += ${\n dataType}(uniforms.beta) * ${c.getByOffset('cOffset')};`;\n }\n return '';\n })()}\n output[global_idx] = value;\n }`;\n };\n\n return {\n name: 'Gemm',\n shaderCache: {hint: `${attributes.cacheKey}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n};\n\nexport const parseGemmAttributes = (attributes: Record): GemmAttributes => {\n const transA = attributes.transA as boolean;\n const transB = attributes.transB as boolean;\n const alpha = attributes.alpha as number;\n const beta = attributes.beta as number;\n return {transA, transB, alpha, beta, cacheKey: `${attributes.transA};${attributes.transB};${attributes.alpha === 1}`};\n};\n\nexport const gemm = (context: ComputeContext, attributes: GemmAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createGemmProgramInfo(context.inputs, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, GpuDataType, ProgramUniform} from '../types';\n\nimport {applyAttention, AttentionAttrs, AttentionMaskType, AttentionParameters, AttentionQkvFormat} from './attention';\nimport {inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\nimport {createTransposeProgramInfo, TransposeAttributes} from './transpose';\n\nconst getInput = (inputs: readonly TensorView[], i: number) =>\n (inputs.length > i) && (inputs[i].dims.length > 0) && (ShapeUtil.size(inputs[i].dims)) > 0 ? inputs[i] : undefined;\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: AttentionAttrs): AttentionParameters => {\n const query = inputs[0];\n const key = getInput(inputs, 1);\n const value = getInput(inputs, 2);\n const bias = getInput(inputs, 3);\n const keyPaddingMask = getInput(inputs, 4);\n const relativePositionBias = getInput(inputs, 5);\n const pastKey = getInput(inputs, 6);\n const pastValue = getInput(inputs, 7);\n\n // Abbreviation and Meanings:\n // B: batch_size\n // S: sequence_length (input sequence length of query)\n // P: past_sequence_length (past sequence length of key or value)\n // L: kv_sequence_length (input sequence length of key or value)\n // M: max_sequence_length\n // T: total_sequence_length = past_sequence_length + kv_sequence_length\n // N: num_heads\n // H: head size for Q and K, aka q_head_size or k_head_size or qk_head_size\n // H_v: v_head_size\n // D_i: input hidden size\n // D: hidden size for Q and K (D = N * H), aka q_hidden_size or k_hidden_size or qk_hidden_size\n // D_v: v_hidden_size = num_heads * v_head_size\n\n // key_padding_mask (K/V) : (B) or (2*B + 1) or (B, L) or None\n // relative_position_bias : (B, 1, S, L)\n // past_key : (B, N, S*, H)\n // past_value : (B, N, S*, H)\n // When no packing for q/k/v:\n // query (Q) : (B, S, D)\n // key (K) : (B, L, D) or (B, N, S*, H)\n // value (V) : (B, L, D_v) or (B, N, S*, H)\n // bias (Q/K/V) : (D + D + D_v)\n // When packed kv is used:\n // query (Q) : (B, S, D)\n // key (K) : (B, L, N, 2, H)\n // value (V) : None\n // bias (Q/K/V) : None\n // When packed qkv is used:\n // query (Q) : (B, L, N, 3, H) or (B, S, 3*D)\n // key (K) : None\n // value (V) : None\n // bias (Q/K/V) : None or (D + D + D_v)\n\n if (query.dims.length !== 3 && query.dims.length !== 5) {\n throw new Error('Input query is expected to have 3 or 5 dimensions');\n }\n\n const dmmhaPacking = false;\n const batchSize = query.dims[0];\n const sequenceLength = query.dims[1];\n const hiddenSize = query.dims.length === 3 ? (dmmhaPacking ? query.dims[2] / 3 : query.dims[2]) :\n attributes.numHeads * query.dims[4];\n let kvSequenceLength = sequenceLength;\n\n let pastSequenceLength = 0;\n let maxSequenceLength = 0;\n const headSize = Math.floor(hiddenSize / attributes.numHeads);\n if (pastKey && pastValue) {\n if (pastKey.dims.length !== 4) {\n throw new Error('Input \"past_key\" is expected to have 4 dimensions');\n }\n if (pastKey.dims[0] !== batchSize || pastKey.dims[1] !== attributes.numHeads || pastKey.dims[3] !== headSize) {\n throw new Error('Input \"past_key\" shape (batch_size, num_heads, past_sequence_length, head_size)');\n }\n if (pastValue.dims[0] !== batchSize || pastValue.dims[1] !== attributes.numHeads ||\n pastValue.dims[3] !== headSize) {\n throw new Error('Input \"past_value\" shape (batch_size, num_heads, past_sequence_length, head_size)');\n }\n if (pastKey.dims[2] !== pastValue.dims[2]) {\n throw new Error('Input \"past_key\" and \"past_value\" shall have same dim 2 (past_sequence_length)');\n }\n if (pastValue.dims.length !== 4) {\n throw new Error('Input \"past_value\" is expected to have 4 dimensions');\n }\n pastSequenceLength = pastKey.dims[2];\n maxSequenceLength = pastKey.dims[2];\n } else if (pastKey || pastValue) {\n throw new Error('Input \"past_key\" and \"past_value\" shall be both present or both absent');\n }\n\n let qkvFormat: AttentionQkvFormat;\n if (key) {\n if (query.dims.length !== 3) {\n throw new Error('Input \"query\" is expected to have 3 dimensions when key is given');\n }\n if (key.dims.length < 3 || key.dims.length > 5) {\n throw new Error('Input \"key\" is expected to have 3, 4, or 5 dimensions');\n }\n if (query.dims[0] !== key.dims[0]) {\n throw new Error('Input \"query\" and \"key\" shall have same dim 0 (batch size)');\n }\n\n if (key.dims.length === 3) {\n if (key.dims[2] !== query.dims[2]) {\n throw new Error('Input \"query\" and \"key\" shall have same dim 2 (hidden_size)');\n }\n qkvFormat = AttentionQkvFormat.qkvBSNH;\n kvSequenceLength = key.dims[1];\n } else if (key.dims.length === 5) {\n if (key.dims[2] !== attributes.numHeads || key.dims[3] !== 2 || key.dims[4] !== headSize) {\n throw new Error('Expect \"key\" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');\n }\n if (value) {\n throw new Error('Expect \"value\" be none when \"key\" has packed kv format.');\n }\n qkvFormat = AttentionQkvFormat.qKvBSNHxBSN2H;\n kvSequenceLength = key.dims[1];\n } else { // key_dims.size() == 4 (cross-attention with past_key)\n if (key.dims[1] !== attributes.numHeads || key.dims[3] !== headSize) {\n throw new Error('Expect \"key\" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');\n }\n\n qkvFormat = AttentionQkvFormat.unknown;\n kvSequenceLength = key.dims[2];\n }\n } else { // packed QKV\n if (query.dims.length !== 3 && query.dims.length !== 5) {\n throw new Error('Input \"query\" is expected to have 3 or 5 dimensions when key is empty');\n }\n if (query.dims.length === 5 && (query.dims[2] !== attributes.numHeads || query.dims[3] !== 3)) {\n throw new Error('Expect \"query\" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');\n }\n\n qkvFormat = AttentionQkvFormat.qkvBSN3H;\n }\n\n if (bias) {\n if (bias.dims.length !== 1) {\n throw new Error('Input \"bias\" is expected to have 1 dimension');\n }\n\n if (value) {\n if (query.dims.length === 5 && query.dims[3] === 2) {\n throw new Error('bias is not allowed for packed kv.');\n }\n }\n }\n\n let maskType: AttentionMaskType = AttentionMaskType.none;\n if (keyPaddingMask) {\n maskType = AttentionMaskType.maskUnknown;\n const maskDims = keyPaddingMask.dims;\n if (maskDims.length === 1) {\n if (maskDims[0] === batchSize) {\n maskType = AttentionMaskType.mask1dKeySeqLen;\n } else if (maskDims[0] === 3 * batchSize + 2) {\n maskType = AttentionMaskType.mask1DKeySeqLenStart;\n }\n } else if (maskDims.length === 2 && maskDims[0] === batchSize && maskDims[1] === kvSequenceLength) {\n maskType = AttentionMaskType.mask2dKeyPadding;\n }\n if (maskType === AttentionMaskType.maskUnknown) {\n throw new Error('Input \"key_padding_mask\" shape shall be (batch_size) or (batch_size, kv_sequence_length)');\n }\n throw new Error('Mask not supported');\n }\n\n let passPastInKv = false;\n let vHiddenSize = hiddenSize;\n if (value) {\n if (value.dims.length !== 3 && value.dims.length !== 4) {\n throw new Error('Input \"value\" is expected to have 3 or 4 dimensions');\n }\n\n if (query.dims[0] !== value.dims[0]) {\n throw new Error('Input \"query\" and \"value\" shall have same dim 0 (batch_size)');\n }\n\n if (value.dims.length === 3) {\n if (kvSequenceLength !== value.dims[1]) {\n throw new Error('Input \"key\" and \"value\" shall have the same dim 1 (kv_sequence_length)');\n }\n vHiddenSize = value.dims[2];\n } else {\n if (kvSequenceLength !== value.dims[2]) {\n throw new Error('Input \"past_key\" and \"past_value\" shall have the same dim 2 (kv_sequence_length)');\n }\n vHiddenSize = value.dims[1] * value.dims[3];\n passPastInKv = true;\n }\n }\n\n const totalSequenceLength = pastSequenceLength + kvSequenceLength;\n const broadcastResPosBias = false;\n\n if (keyPaddingMask) {\n throw new Error('Key padding mask is not supported');\n }\n\n if (relativePositionBias) {\n if (relativePositionBias.dims.length !== 4) {\n throw new Error('Input \"relative_position_bias\" is expected to have 4 dimensions');\n }\n if ((relativePositionBias.dims[0] !== batchSize && relativePositionBias.dims[0] !== 1) ||\n relativePositionBias.dims[1] !== attributes.numHeads || relativePositionBias.dims[2] !== sequenceLength ||\n relativePositionBias.dims[3] !== totalSequenceLength) {\n throw new Error('Input \"relative_position_bias\" shape (batch_size, 1, sequence_length, kv_sequence_length)');\n }\n }\n\n return {\n batchSize,\n sequenceLength,\n pastSequenceLength,\n kvSequenceLength,\n totalSequenceLength,\n maxSequenceLength,\n inputHiddenSize: 0,\n hiddenSize,\n vHiddenSize,\n headSize,\n vHeadSize: Math.floor(vHiddenSize / attributes.numHeads),\n numHeads: attributes.numHeads,\n isUnidirectional: false,\n pastPresentShareBuffer: false,\n maskFilterValue: attributes.maskFilterValue,\n maskType,\n scale: attributes.scale,\n broadcastResPosBias,\n passPastInKv,\n qkvFormat,\n };\n};\n\nexport const parseMultiHeadAttentionAttributes = (attributes: AttentionAttrs): AttentionAttrs =>\n createAttributeWithCacheKey({...attributes});\n\nconst weightTransposeAttribute: TransposeAttributes = createAttributeWithCacheKey({perm: [0, 2, 1, 3]});\n\nconst addBiasTranspose =\n (context: ComputeContext, qkv: TensorView, bias: TensorView, batchSize: number, sequenceLength: number,\n hiddenSize: number, biasOffset: number) => {\n const outputShape = [batchSize, sequenceLength, hiddenSize];\n const outputSize = ShapeUtil.size(outputShape);\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: biasOffset},\n {type: DataType.uint32, data: hiddenSize}\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('qkv_with_bias', qkv.dataType, outputShape);\n const qkvInput = inputVariable('qkv', qkv.dataType, outputShape);\n const biasInput = inputVariable('bias', bias.dataType, outputShape);\n\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'bias_offset', type: 'u32'}, {name: 'hidden_size', type: 'u32'}\n ];\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(qkvInput, biasInput, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let bias_offset_idx = (global_idx % uniforms.hidden_size) + uniforms.bias_offset;\n\n qkv_with_bias[global_idx] = qkv[global_idx] + bias[bias_offset_idx];\n }`;\n };\n\n return context.compute(\n {\n name: 'MultiHeadAttentionAddBias',\n shaderCache: {inputDependencies: ['type', 'type']},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: qkv.dataType, gpuDataType: GpuDataType.default}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n },\n {inputs: [qkv, bias], outputs: [-1]})[0];\n };\n\nexport const maybeTransposeToBNSHAndAddBias =\n (context: ComputeContext, batchSize: number, numHeads: number, sequenceLength: number, headSize: number,\n input: TensorView, bias?: TensorView, biasOffset?: number) => {\n // const newDims = [];\n\n let reshapedInput = input;\n if (!bias) {\n if (input.dims.length === 3) {\n reshapedInput = input.reshape([batchSize, sequenceLength, numHeads, headSize]);\n }\n return context.compute(\n createTransposeProgramInfo(reshapedInput, weightTransposeAttribute.perm),\n {inputs: [reshapedInput], outputs: [-1]})[0];\n } else {\n if (sequenceLength === 1) {\n throw new Error('AddBiasReshape is not implemented. Please export your model with packed QKV or KV');\n } else {\n reshapedInput =\n addBiasTranspose(context, input, bias, batchSize, sequenceLength, numHeads * headSize, biasOffset!);\n reshapedInput = reshapedInput.reshape([batchSize, sequenceLength, numHeads, headSize]);\n return context.compute(\n createTransposeProgramInfo(reshapedInput, weightTransposeAttribute.perm),\n {inputs: [reshapedInput], outputs: [-1]})[0];\n }\n }\n };\n\nexport const multiHeadAttention = (context: ComputeContext, attributes: AttentionAttrs): void => {\n const params = validateInputs(context.inputs, attributes);\n const query = context.inputs[0];\n const key = getInput(context.inputs, 1);\n const value = getInput(context.inputs, 2);\n const bias = getInput(context.inputs, 3);\n const keyPaddingMask = getInput(context.inputs, 4);\n const relativePositionBias = getInput(context.inputs, 5);\n const pastKey = getInput(context.inputs, 6);\n const pastValue = getInput(context.inputs, 7);\n if (query.dims.length === 5) {\n throw new Error('Packed QKV is not implemented');\n }\n\n if (key?.dims.length === 5) {\n throw new Error('Packed KV is not implemented');\n }\n\n // applyAttention expects BNSH inputs\n const kvBNSH = key && value && key.dims.length === 4 && value.dims.length === 4;\n\n const Q = maybeTransposeToBNSHAndAddBias(\n context, params.batchSize, params.numHeads, params.sequenceLength, params.headSize, query, bias, 0);\n\n if (kvBNSH) {\n return applyAttention(\n context, Q, key, value, keyPaddingMask, undefined, pastKey, pastValue, relativePositionBias, params,\n attributes);\n }\n if (!key || !value) {\n throw new Error('key and value must be provided');\n }\n const K = maybeTransposeToBNSHAndAddBias(\n context, params.batchSize, params.numHeads, params.kvSequenceLength, params.headSize, key, bias,\n params.hiddenSize);\n\n const V = maybeTransposeToBNSHAndAddBias(\n context, params.batchSize, params.numHeads, params.kvSequenceLength, params.vHeadSize, value, bias,\n 2 * params.hiddenSize);\n\n applyAttention(\n context, Q, K, V, keyPaddingMask, undefined, pastKey, pastValue, relativePositionBias, params, attributes);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nconst getRepeats = (repeatsTensorView: TensorView): readonly number[] =>\n Array.from(repeatsTensorView.getBigInt64Array(), Number);\n\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Tile requires 2 inputs.');\n }\n\n if (inputs[0].dataType !== DataType.float && inputs[0].dataType !== DataType.float16 &&\n inputs[0].dataType !== DataType.int32 && inputs[0].dataType !== DataType.uint32) {\n throw new Error('Tile only support float, float16, int32, and uint32 data types');\n }\n\n if (inputs[1].dataType !== DataType.int64) {\n throw new Error('Tile `repeats` input should be of int64 data type');\n }\n\n if (inputs[1].dims.length !== 1) {\n throw new Error('Tile `repeats` input should be 1-D');\n }\n\n const repeats: readonly number[] = getRepeats(inputs[1]);\n\n if (repeats.length !== inputs[0].dims.length) {\n throw new Error('Tile `repeats` input should have same number of elements as rank of input data tensor');\n }\n};\n\nconst getOutputShape = (inputShape: readonly number[], repeats: readonly number[]): readonly number[] => {\n const outputShape: number[] = [];\n\n for (let i = 0; i < inputShape.length; ++i) {\n outputShape.push(inputShape[i] * repeats[i]);\n }\n\n return outputShape;\n};\n\nexport const createTileProgramInfo = (inputs: readonly TensorView[], shape?: number[]): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const repeats: readonly number[] = shape == null ? getRepeats(inputs[1]) : shape;\n const outputShape = getOutputShape(inputShape, repeats);\n const outputSize = ShapeUtil.size(outputShape);\n\n const dataType = inputs[0].dataType;\n const input = inputVariable('input', dataType, inputShape.length);\n const output = outputVariable('output', dataType, outputShape.length);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n const inputShape = ${input.indices(...inputShape)};\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let output_indices = ${output.offsetToIndices('global_idx')};\n var input_indices: ${input.type.indices};\n for (var i = 0; i < ${inputShape.length}; i++) {\n let input_dim_i = ${input.indicesGet('uniforms.input_shape', 'i')};\n let input_dim_value = ${output.indicesGet('output_indices', 'i')} % input_dim_i;\n\n ${input.indicesSet('input_indices', 'i', 'input_dim_value')}\n }\n ${output.setByOffset('global_idx', input.getByIndices('input_indices'))}\n }`;\n\n return {\n name: 'Tile',\n shaderCache: {hint: `${repeats}`, inputDependencies: ['rank']},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms:\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(inputs[0].dims, outputShape)],\n }),\n getShaderSource,\n };\n};\n\nexport const tile = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n context.compute(createTileProgramInfo(context.inputs), {inputs: [0]});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {applyAttention, AttentionAttrs, AttentionMaskType, AttentionParameters, AttentionQkvFormat} from './attention';\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\nimport {maybeTransposeToBNSHAndAddBias} from './multihead-attention';\nimport {createTileProgramInfo} from './tile';\nimport {createTransposeProgramInfo, TransposeAttributes} from './transpose';\n\nexport const validateInputs = (inputs: readonly TensorView[], attributes: AttentionAttrs): AttentionParameters => {\n const query = inputs[0];\n const key = inputs[1];\n const value = inputs[2];\n const pastKey = inputs[3];\n const pastValue = inputs[4];\n\n // Abbreviation and Meanings:\n // B: batch_size\n // S: sequence_length (input sequence length of query)\n // P: past_sequence_length (past sequence length of key or value)\n // L: kv_sequence_length (input sequence length of key or value)\n // M: max_sequence_length\n // T: total_sequence_length = past_sequence_length + kv_sequence_length\n // N: num_heads\n // H: head size for Q and K, aka q_head_size or k_head_size or qk_head_size\n // H_v: v_head_size\n // D_i: input hidden size\n // D: hidden size for Q and K (D = N * H), aka q_hidden_size or k_hidden_size or qk_hidden_size\n // D_v: v_hidden_size = num_heads * v_head_size\n\n // past_key : (B, N, S*, H)\n // past_value : (B, N, S*, H)\n // When no packing for q/k/v:\n // query (Q) : (B, S, D)\n // key (K) : (B, L, D) or (B, N, S*, H)\n // value (V) : (B, L, D_v) or (B, N, S*, H)\n // When packed kv is used:\n // query (Q) : (B, S, D)\n // key (K) : (B, L, N, 2, H)\n // value (V) : None\n // When packed qkv is used:\n // query (Q) : (B, L, N, 3, H) or (B, S, 3*D)\n // key (K) : None\n // value (V) : None\n\n if (query.dims.length !== 3 && query.dims.length !== 5) {\n throw new Error('Input query is expected to have 3 or 5 dimensions');\n }\n\n const dmmhaPacking = false;\n const batchSize = query.dims[0];\n const sequenceLength = query.dims[1];\n const hiddenSize = query.dims.length === 3 ? (dmmhaPacking ? query.dims[2] / 3 : query.dims[2]) :\n attributes.numHeads * query.dims[4];\n let kvSequenceLength = sequenceLength;\n\n let pastSequenceLength = 0;\n let maxSequenceLength = 0;\n const headSize = Math.floor(hiddenSize / attributes.numHeads);\n const hasPastKey = pastKey && pastKey.dims.length !== 0;\n const hasPastValue = pastValue && pastValue.dims.length !== 0;\n // TODO : this should be from attributes.\n const isPastkvBSNH = true;\n if (hasPastKey && hasPastValue) {\n if (pastKey.dims.length !== 4) {\n throw new Error('Input \"past_key\" is expected to have 4 dimensions');\n }\n if (pastValue.dims.length !== 4) {\n throw new Error('Input \"past_value\" is expected to have 4 dimensions');\n }\n if (isPastkvBSNH) {\n // For BSNH\n pastSequenceLength = pastKey.dims[1];\n maxSequenceLength = pastKey.dims[1];\n } else {\n // For BNSH\n pastSequenceLength = pastKey.dims[2];\n maxSequenceLength = pastKey.dims[2];\n }\n } else if (hasPastKey || hasPastValue) {\n throw new Error('Input \"past_key\" and \"past_value\" shall be both present or both absent');\n }\n\n let qkvFormat: AttentionQkvFormat;\n if (key) {\n if (query.dims.length !== 3) {\n throw new Error('Input \"query\" is expected to have 3 dimensions when key is given');\n }\n if (key.dims.length < 3 || key.dims.length > 5) {\n throw new Error('Input \"key\" is expected to have 3, 4, or 5 dimensions');\n }\n if (query.dims[0] !== key.dims[0]) {\n throw new Error('Input \"query\" and \"key\" shall have same dim 0 (batch size)');\n }\n\n if (key.dims.length === 3) {\n if (query.dims[2] % key.dims[2] !== 0) {\n throw new Error('Dimension 2 of \"query\" should be a multiple of \"key\"');\n }\n qkvFormat = AttentionQkvFormat.qkvBSNH;\n kvSequenceLength = key.dims[1];\n } else if (key.dims.length === 5) {\n if (key.dims[2] !== attributes.numHeads || key.dims[3] !== 2 || key.dims[4] !== headSize) {\n throw new Error('Expect \"key\" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');\n }\n if (value) {\n throw new Error('Expect \"value\" be none when \"key\" has packed kv format.');\n }\n qkvFormat = AttentionQkvFormat.qKvBSNHxBSN2H;\n kvSequenceLength = key.dims[1];\n } else { // key_dims.size() == 4 (cross-attention with past_key)\n if (key.dims[1] !== attributes.numHeads || key.dims[3] !== headSize) {\n throw new Error('Expect \"key\" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');\n }\n\n qkvFormat = AttentionQkvFormat.unknown;\n kvSequenceLength = key.dims[2];\n }\n } else { // packed QKV\n if (query.dims.length !== 3 && query.dims.length !== 5) {\n throw new Error('Input \"query\" is expected to have 3 or 5 dimensions when key is empty');\n }\n if (query.dims.length === 5 && (query.dims[2] !== attributes.numHeads || query.dims[3] !== 3)) {\n throw new Error('Expect \"query\" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');\n }\n\n qkvFormat = AttentionQkvFormat.qkvBSN3H;\n }\n\n const maskType: AttentionMaskType = AttentionMaskType.none;\n let passPastInKv = false;\n let vHiddenSize = hiddenSize;\n if (value) {\n if (value.dims.length !== 3 && value.dims.length !== 4) {\n throw new Error('Input \"value\" is expected to have 3 or 4 dimensions');\n }\n\n if (query.dims[0] !== value.dims[0]) {\n throw new Error('Input \"query\" and \"value\" shall have same dim 0 (batch_size)');\n }\n\n if (value.dims.length === 3) {\n if (kvSequenceLength !== value.dims[1]) {\n throw new Error('Input \"key\" and \"value\" shall have the same dim 1 (kv_sequence_length)');\n }\n vHiddenSize = value.dims[2];\n } else {\n if (kvSequenceLength !== value.dims[2]) {\n throw new Error('Input \"past_key\" and \"past_value\" shall have the same dim 2 (kv_sequence_length)');\n }\n vHiddenSize = value.dims[1] * value.dims[3];\n passPastInKv = true;\n }\n }\n const totalSequenceLength = pastSequenceLength + kvSequenceLength;\n const broadcastResPosBias = false;\n\n return {\n batchSize,\n sequenceLength,\n pastSequenceLength,\n kvSequenceLength,\n totalSequenceLength,\n maxSequenceLength,\n inputHiddenSize: 0,\n hiddenSize,\n vHiddenSize,\n headSize,\n vHeadSize: Math.floor(vHiddenSize / attributes.kvNumHeads!),\n numHeads: attributes.numHeads,\n kvNumHeads: attributes.kvNumHeads,\n nReps: attributes.numHeads / attributes.kvNumHeads!,\n pastPresentShareBuffer: false,\n maskType,\n scale: attributes.scale,\n broadcastResPosBias,\n passPastInKv,\n qkvFormat,\n isPastkvBSNH,\n };\n};\n\nconst createConcatProgramInfo =\n (a: TensorView, b: TensorView|undefined, dataType: DataType, params: AttentionParameters): ProgramInfo => {\n const outputShape = [params.batchSize, params.totalSequenceLength, params.kvNumHeads!, params.headSize];\n const component = 4;\n const outputSize = ShapeUtil.size(outputShape) / component;\n const presentSequenceLength = params.totalSequenceLength;\n const output = outputVariable('present_kv', dataType, outputShape.length, component);\n const inputA = inputVariable('new_kv', a.dataType, a.dims.length, component);\n const inputB = b ? inputVariable('past_kv', b.dataType, b.dims.length, component) : undefined;\n\n const H = Math.ceil(params.headSize / component);\n const dispatch = {x: presentSequenceLength, y: a.dims[0], z: 1};\n\n const inputDependencies: ProgramInputTensorInfoDependency[] = b ? ['rank', 'rank'] : ['rank'];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: params.pastSequenceLength},\n {type: DataType.uint32, data: params.kvSequenceLength},\n {type: DataType.uint32, data: params.totalSequenceLength}\n ];\n\n const inputs = [inputA];\n if (inputB) {\n programUniforms.push(\n ...createTensorShapeVariables(a.dims), ...createTensorShapeVariables(b!.dims),\n ...createTensorShapeVariables(outputShape));\n inputs.push(inputB);\n } else {\n programUniforms.push(...createTensorShapeVariables(a.dims), ...createTensorShapeVariables(outputShape));\n }\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'past_seqlen', type: 'u32'}, {name: 'new_seqlen', type: 'u32'},\n {name: 'present_seqlen', type: 'u32'}\n ];\n\n const pastStr = ` let past_batch_stride = uniforms.past_seqlen * num_heads * H;\n var past_head_stride = uniforms.past_seqlen * H;\n if (is_bsnh) {\n past_head_stride = H;\n }\n let in_offset = b * past_batch_stride + s * row_stride + n * past_head_stride + h;\n present_kv[out_offset] = past_kv[in_offset];`;\n const newStr = ` let new_batch_stride = uniforms.new_seqlen * num_heads * H;\n let new_row_stride = num_heads * H;\n let new_head_stride = H;\n let in_offset = b * new_batch_stride + (s - past_seqlen) * new_row_stride + n * new_head_stride + h;\n present_kv[out_offset] = new_kv[in_offset];`;\n const concatStr = b ? `if (s < past_seqlen) {\n ${pastStr}\n } else if (s < past_seqlen + uniforms.new_seqlen) {\n ${newStr}\n }` :\n `if (s < past_seqlen + uniforms.new_seqlen) {\n ${newStr}\n }`;\n\n // TODO: handle H * params.kvNumHeads greater than maxComputeInvocationsPerWorkgroup limit.\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputs, output)}\n ${shaderHelper.mainStart([\n H, params.kvNumHeads!, 1\n ])}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n var indices = ${output.offsetToIndices('global_idx')};\n let h = local_id.x;\n let n = local_id.y;\n let s = workgroup_id.x;\n let b = workgroup_id.y;\n let num_heads = ${params.kvNumHeads!}u;\n let H = ${H}u;\n\n let present_seqlen = uniforms.present_seqlen;\n let present_batch_stride = present_seqlen * num_heads * H;\n var row_stride = H;\n let is_bsnh = ${params.isPastkvBSNH};\n\n if (is_bsnh) {\n row_stride = num_heads * H;\n }\n var present_head_stride = present_seqlen * H;\n if (is_bsnh) {\n present_head_stride = H;\n }\n\n let past_seqlen = uniforms.past_seqlen;\n\n let out_offset = b * present_batch_stride + s * row_stride + n * present_head_stride + h;\n ${concatStr}\n }`;\n\n return {\n name: 'ConcatPastNew',\n shaderCache: {hint: `${params.kvNumHeads!}${H}${!!b}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType}],\n dispatchGroup: dispatch,\n programUniforms,\n }),\n getShaderSource,\n };\n };\n\nexport const parseGroupQueryAttentionAttributes = (attributes: AttentionAttrs): AttentionAttrs =>\n createAttributeWithCacheKey({...attributes});\n\nconst weightTransposeAttribute: TransposeAttributes = createAttributeWithCacheKey({perm: [0, 2, 1, 3]});\n\nconst maybeExpandAndTransposeToBNSH =\n (context: ComputeContext, input: TensorView, pastKV: TensorView|undefined, params: AttentionParameters,\n outputIndex: number) => {\n let reshapedInput = input;\n const numHeads = params.kvNumHeads!;\n const nReps = params.nReps!;\n if (input.dims.length === 3 && params.kvSequenceLength !== 0) {\n reshapedInput = input.reshape([params.batchSize, params.kvSequenceLength, numHeads, params.headSize]);\n }\n\n if (pastKV) {\n reshapedInput = context.compute(\n createConcatProgramInfo(reshapedInput, pastKV, reshapedInput.dataType, params),\n {inputs: [reshapedInput, pastKV], outputs: [params.isPastkvBSNH ? outputIndex : -1]})[0];\n } else {\n reshapedInput = context.compute(\n createConcatProgramInfo(reshapedInput, undefined, reshapedInput.dataType, params),\n {inputs: [reshapedInput], outputs: [params.isPastkvBSNH ? outputIndex : -1]})[0];\n }\n if (nReps !== 1) {\n reshapedInput = context.compute(\n createTileProgramInfo([reshapedInput], [1, 1, 1, nReps]), {inputs: [reshapedInput], outputs: [-1]})[0];\n reshapedInput =\n reshapedInput.reshape([params.batchSize, params.totalSequenceLength, numHeads * nReps, params.headSize]);\n }\n\n return context.compute(\n createTransposeProgramInfo(reshapedInput, weightTransposeAttribute.perm),\n {inputs: [reshapedInput], outputs: [-1]})[0];\n };\n\nexport const groupQueryAttention = (context: ComputeContext, attributes: AttentionAttrs): void => {\n const params = validateInputs(context.inputs, attributes);\n if (context.inputs[0].dims.length === 5) {\n throw new Error('Packed QKV is not implemented');\n }\n\n if (context.inputs[1]?.dims.length === 5) {\n throw new Error('Packed KV is not implemented');\n }\n\n const Q = maybeTransposeToBNSHAndAddBias(\n context, params.batchSize, params.numHeads, params.sequenceLength, params.headSize, context.inputs[0], undefined,\n 0);\n const pastKey = context.inputs[3] && context.inputs[3].dims.length !== 0 ? context.inputs[3] : undefined;\n const pastValue = context.inputs[4] && context.inputs[4].dims.length !== 0 ? context.inputs[4] : undefined;\n const K = maybeExpandAndTransposeToBNSH(context, context.inputs[1], pastKey, params, 1);\n const V = maybeExpandAndTransposeToBNSH(context, context.inputs[2], pastValue, params, 2);\n applyAttention(context, Q, K, V, undefined, undefined, undefined, undefined, undefined, params, attributes);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, fillVector, getMaxComponents, inputVariable, outputVariable, ShaderHelper, sumVector, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\n\nexport interface InstanceNormAttributes {\n epsilon: number;\n format: 'NHWC'|'NCHW';\n}\n\nconst createInstanceNormProgramInfo =\n (inputs: readonly TensorView[], attributes: InstanceNormAttributes): ProgramInfo => {\n const xShape = inputs[0].dims;\n const outputShape = xShape;\n const axis = 2;\n const normCount = ShapeUtil.sizeToDimension(xShape, axis);\n const normSize = ShapeUtil.sizeFromDimension(xShape, axis);\n const components = getMaxComponents(normSize);\n const normPackedSize = normSize / components;\n const inputShape = [xShape[0], xShape[1], normPackedSize];\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'type', 'type'];\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: normSize}, {type: DataType.uint32, data: normPackedSize}];\n programUniforms.push(...createTensorShapeVariables(inputShape, inputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const x = inputVariable('x', inputs[0].dataType, inputShape.length, components);\n const scale = inputVariable('scale', inputs[1].dataType, inputs[1].dims);\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims);\n const output = outputVariable('output', inputs[0].dataType, inputShape.length, components);\n const variables = [x, scale, bias, output];\n const dataType = x.type.value;\n const f32Type = components === 1 ? 'f32' : `vec${components}`;\n const workgroupSize = 64;\n\n const uniforms: UniformsArrayType = [{name: 'normSize', type: 'u32'}, {name: 'normPackedSize', type: 'u32'}];\n return `\n var meanShared : f32;\n var squaredNormShared : f32;\n var workgroupShared : array<${f32Type}, ${workgroupSize}>;\n const workgroupSize = ${workgroupSize}u;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...variables)}\n ${shaderHelper.mainStart(workgroupSize)}\n let norm = global_idx / workgroupSize;\n let batch = norm / uniforms.x_shape[1];\n let channel = norm % uniforms.x_shape[1];\n let localIndex = local_id.x;\n\n // initialize workgroup memory\n var initial = ${f32Type}(0);\n for (var h = localIndex; h < uniforms.normPackedSize; h += workgroupSize) {\n initial = initial + ${f32Type}(${x.get('batch', 'channel', 'h')});\n }\n workgroupShared[localIndex] = initial;\n workgroupBarrier();\n\n // Calculate the mean of current channel data.\n for (var currSize = workgroupSize >> 1; currSize > 0; currSize = currSize >> 1) {\n if (localIndex < currSize) {\n workgroupShared[localIndex] = workgroupShared[localIndex] + workgroupShared[localIndex + currSize];\n }\n workgroupBarrier();\n }\n if (localIndex == 0) {\n meanShared = ${sumVector('workgroupShared[0]', components)} / f32(uniforms.normSize);\n }\n workgroupBarrier();\n\n // reinitialize workgroup memory.\n initial = ${f32Type}(0);\n for (var h = localIndex; h < uniforms.normPackedSize; h += workgroupSize) {\n let deviation = ${f32Type}(${x.get('batch', 'channel', 'h')}) - ${f32Type}(meanShared);\n initial = initial + deviation * deviation;\n }\n workgroupShared[localIndex] = initial;\n workgroupBarrier();\n\n // Calculate the sum of square of deviation of current channel data.\n for (var currSize = workgroupSize >> 1; currSize > 0; currSize = currSize >> 1) {\n if (localIndex < currSize) {\n workgroupShared[localIndex] = workgroupShared[localIndex] + workgroupShared[localIndex + currSize];\n }\n workgroupBarrier();\n }\n if (localIndex == 0) {\n squaredNormShared = ${sumVector('workgroupShared[0]', components)};\n }\n workgroupBarrier();\n\n let invStdDev = inverseSqrt(squaredNormShared / f32(uniforms.normSize) + f32(${attributes.epsilon}));\n let channelScale = invStdDev * f32(${scale.getByOffset('channel')});\n let channelShift = f32(${bias.getByOffset('channel')}) - meanShared * channelScale;\n for (var h = localIndex; h < uniforms.normPackedSize; h += workgroupSize) {\n let value = ${x.get('batch', 'channel', 'h')} * ${dataType}(${f32Type}(channelScale)) + ${dataType}(${\n f32Type}(channelShift));\n ${output.set('batch', 'channel', 'h', 'value')};\n }\n }`;\n };\n return {\n ...{name: 'InstanceNormalization'},\n // TODO: use epsilon as uniform. Currently epsilon as uniform fails test_instancenorm_epsilon.\n shaderCache: {hint: `${attributes.epsilon};${components}`, inputDependencies},\n getRunData: () => ({\n outputs: [\n {dims: outputShape, dataType: inputs[0].dataType},\n ],\n dispatchGroup: {x: normCount},\n programUniforms\n }),\n getShaderSource,\n };\n };\n\nconst computeMean =\n (context: ComputeContext, input: TensorView, scale: TensorView, bias: TensorView, n: number, h: number, c: number,\n epsilon: number) => {\n const components = getMaxComponents(c);\n const WG = 64;\n // we will store channel scale and channel shift in [2, components] matrix\n // or in vec2 when components == 1\n const outputType = components === 1 ? 'vec2f' : `mat2x${components}f`;\n const sumCastType = components === 1 ? 'f32' : `vec${components}f`;\n const setOutputValue = (var1: string, var2: string) => `${outputType}(${var1}, ${var2})`;\n const unitsOfWork = n * c / components;\n const wgSize = Math.ceil(h / WG);\n\n const meanInputDependencies: ProgramInputTensorInfoDependency[] = ['type'];\n const meanProgramUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: wgSize}, {type: DataType.uint32, data: h},\n {type: DataType.uint32, data: Math.floor(c / components)},\n {type: DataType.uint32, data: Math.floor(h * c / components)}\n ];\n\n const getMeanShaderSource = (shaderHelper: ShaderHelper) => {\n const inputHelper = inputVariable('input', input.dataType, input.dims, components);\n return `\n ${shaderHelper.declareVariables(inputHelper)}\n @group(0) @binding(1) var output : array<${outputType}>;\n struct Uniforms {wg_size:u32, H:u32, C:u32, image_size:u32};\n @group(0) @binding(2) var uniforms: Uniforms;\n\n ${shaderHelper.mainStart(WG)}\n let currentImageNumber = global_idx / ${WG} / uniforms.C;\n let currentChannelNumber = (global_idx / ${WG}) % uniforms.C;\n let wgOffset = local_id.x * uniforms.wg_size;\n if (wgOffset >= uniforms.H) {\n return;\n }\n let wgMax = min(wgOffset + uniforms.wg_size, uniforms.H);\n\n let offset = currentImageNumber * uniforms.image_size + currentChannelNumber;\n var sum = ${fillVector('f32', components)};\n var squaredSum = ${fillVector('f32', components)};\n for (var i: u32 = wgOffset; i < wgMax; i++) {\n let value = ${sumCastType}(input[offset + i * uniforms.C]);\n sum += value;\n squaredSum += value * value;\n }\n output[global_idx] = ${setOutputValue('sum', 'squaredSum')};\n }`;\n };\n\n const meanValues = context.compute(\n {\n name: 'InstanceNormComputeMean',\n shaderCache: {hint: `${components}`, inputDependencies: meanInputDependencies},\n getRunData: () => ({\n outputs: [\n {dims: [n, c, WG, 2], dataType: DataType.float},\n ],\n dispatchGroup: {x: n * c / components},\n programUniforms: meanProgramUniforms\n }),\n getShaderSource: getMeanShaderSource,\n },\n {inputs: [input], outputs: [-1]})[0];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: unitsOfWork}, {type: DataType.uint32, data: h},\n {type: DataType.uint32, data: Math.floor(c / components)},\n {type: DataType.uint32, data: Math.floor(WG * c / components)}\n ];\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type', 'type'];\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const scaleHelper = inputVariable('scale', scale.dataType, scale.dims, components);\n const biasHelper = inputVariable('bias', bias.dataType, bias.dims, components);\n return `\n @group(0) @binding(0) var input : array<${outputType}>;\n @group(0) @binding(1) var scale : array<${scaleHelper.type.storage}>;\n @group(0) @binding(2) var bias : array<${biasHelper.type.storage}>;\n @group(0) @binding(3) var output : array<${outputType}>;\n struct Uniforms {units_of_work : u32, H: u32, C : u32, image_size : u32};\n @group(0) @binding(4) var uniforms: Uniforms;\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.units_of_work')}\n let currentImageNumber = global_idx / uniforms.C;\n let currentChannelNumber = global_idx % uniforms.C;\n\n let offset = currentImageNumber * uniforms.image_size;\n var sum = ${fillVector('f32', components)};\n var squaredSum = ${fillVector('f32', components)};\n for (var i: u32 = 0; i < min(${WG}, uniforms.H); i++) {\n let value = input[offset + i + currentChannelNumber * ${WG}];\n sum += value[0];\n squaredSum += value[1];\n }\n sum = sum / f32(uniforms.H);\n squaredSum = squaredSum / f32(uniforms.H);\n let invStdDev = inverseSqrt(squaredSum - sum * sum + f32(${epsilon}));\n let channelScale = invStdDev * ${sumCastType}(scale[currentChannelNumber]);\n let channelShift = ${sumCastType}(bias[currentChannelNumber]) - sum * channelScale;\n\n output[global_idx] = ${setOutputValue('channelScale', 'channelShift')};\n }`;\n };\n return context.compute(\n {\n name: 'InstanceNormComputeChannelScaleShift',\n // TODO: use epsilon as uniform. Currently epsilon as uniform fails test_instancenorm_epsilon.\n shaderCache: {hint: `${components};${epsilon}`, inputDependencies},\n getRunData: () => ({\n outputs: [\n {dims: [n, c, 2], dataType: DataType.float},\n ],\n dispatchGroup: {x: Math.ceil(unitsOfWork / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n },\n {inputs: [meanValues, scale, bias], outputs: [-1]})[0];\n };\n\nconst createInstanceNormNHWCProgramInfo =\n (context: ComputeContext, inputs: readonly TensorView[], attributes: InstanceNormAttributes) => {\n const xShape = inputs[0].dims;\n const outputShape = xShape;\n const N = xShape[0];\n const C = xShape[xShape.length - 1];\n const H = ShapeUtil.sizeFromDimension(xShape, 1) / C;\n const components = getMaxComponents(C);\n const outputSize = ShapeUtil.size(outputShape) / components;\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: H}, {type: DataType.uint32, data: Math.floor(C / components)}];\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type'];\n // first compute mean\n const channelScaleShift = computeMean(context, inputs[0], inputs[1], inputs[2], N, H, C, attributes.epsilon);\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n const scaleType = components === 1 ? 'vec2f' : `mat2x${components}f`;\n const scaleCastType = components === 1 ? dataType : `vec${components}<${dataType}>`;\n\n const inputHelper = inputVariable('input', inputs[0].dataType, inputs[0].dims, components);\n const outputHelper = outputVariable('output', inputs[0].dataType, outputShape, components);\n\n return `\n @group(0) @binding(0) var input : array<${inputHelper.type.storage}>;\n @group(0) @binding(1) var scaleInput : array<${scaleType}>;\n @group(0) @binding(2) var output : array<${outputHelper.type.storage}>;\n struct Uniforms {H: u32, C : u32};\n @group(0) @binding(3) var uniforms: Uniforms;\n\n ${shaderHelper.mainStart()}\n let currentImageNumber = global_idx / (uniforms.C * uniforms.H);\n let currentChannelNumber = global_idx % uniforms.C;\n\n let scaleOffset = currentImageNumber * uniforms.C + currentChannelNumber;\n let scale = scaleInput[scaleOffset];\n output[global_idx] = fma(input[global_idx], ${scaleCastType}(scale[0]), ${scaleCastType}(scale[1]));\n }`;\n };\n context.compute(\n {\n name: 'InstanceNormalizationNHWC',\n shaderCache: {hint: `${components}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n },\n {inputs: [inputs[0], channelScaleShift]});\n };\n\nexport const instanceNorm = (context: ComputeContext, attributes: InstanceNormAttributes): void => {\n if (attributes.format === 'NHWC') {\n createInstanceNormNHWCProgramInfo(context, context.inputs, attributes);\n } else {\n context.compute(createInstanceNormProgramInfo(context.inputs, attributes));\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {castToF32, fillVector, getMaxComponents, inputVariable, outputVariable, ShaderHelper, sumVector, tensorTypeToWsglStorageType, UniformsArrayType,} from './common';\n\ninterface LayerNormAttributes {\n simplified: boolean;\n axis: number;\n epsilon: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length < 2) {\n throw new Error('layerNorm requires at least 2 inputs.');\n }\n};\n\nconst createLayerNormProgramInfo =\n (inputs: readonly TensorView[], attributes: LayerNormAttributes, outputCount: number): ProgramInfo => {\n const simplified = attributes.simplified;\n\n const xShape = inputs[0].dims;\n const scale = inputs[1];\n const bias = !simplified && inputs[2];\n\n const outputShape = xShape;\n const axis = ShapeUtil.normalizeAxis(attributes.axis, xShape.length);\n const normCount = ShapeUtil.sizeToDimension(xShape, axis);\n const normSize = ShapeUtil.sizeFromDimension(xShape, axis);\n\n const scaleSize = ShapeUtil.size(scale.dims);\n const biasSize = bias ? ShapeUtil.size(bias.dims) : 0;\n if (scaleSize !== normSize || (bias && biasSize !== normSize)) {\n throw new Error(`Size of X.shape()[axis:] == ${normSize}.\n Size of scale and bias (if provided) must match this.\n Got scale size of ${scaleSize} and bias size of ${biasSize}`);\n }\n\n const meanInvStdDevDim: number[] = [];\n for (let i = 0; i < xShape.length; ++i) {\n if (i < axis) {\n meanInvStdDevDim.push(xShape[i]);\n } else {\n meanInvStdDevDim.push(1);\n }\n }\n const components = getMaxComponents(normSize);\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type'];\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: normCount}, {type: DataType.float, data: normSize},\n {type: DataType.uint32, data: Math.floor(normSize / components)},\n {type: DataType.float, data: attributes.epsilon}\n ];\n if (bias) {\n inputDependencies.push('type');\n }\n const hasMeanDataOutput = outputCount > 1;\n const hasInvStdOutput = outputCount > 2;\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n const variables = [\n inputVariable('x', inputs[0].dataType, inputs[0].dims, components),\n inputVariable('scale', scale.dataType, scale.dims, components),\n ];\n if (bias) {\n variables.push(inputVariable('bias', bias.dataType, bias.dims, components));\n }\n variables.push(outputVariable('output', inputs[0].dataType, outputShape, components));\n if (hasMeanDataOutput) {\n variables.push(outputVariable('mean_data_output', DataType.float, meanInvStdDevDim));\n }\n if (hasInvStdOutput) {\n variables.push(outputVariable('inv_std_output', DataType.float, meanInvStdDevDim));\n }\n\n const uniforms: UniformsArrayType = [\n {name: 'norm_count', type: 'u32'}, {name: 'norm_size', type: 'f32'},\n {name: 'norm_size_vectorized', type: 'u32'}, {name: 'epsilon', type: 'f32'}\n ];\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...variables)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.norm_count')}\n let offset = global_idx * uniforms.norm_size_vectorized;\n var mean_vector = ${fillVector('f32', components)};\n var mean_square_vector = ${fillVector('f32', components)};\n\n for (var h: u32 = 0u; h < uniforms.norm_size_vectorized; h++) {\n let value = ${castToF32(dataType, components, 'x[h + offset]')};\n mean_vector += value;\n mean_square_vector += value * value;\n }\n let mean = ${sumVector('mean_vector', components)} / uniforms.norm_size;\n let inv_std_dev = inverseSqrt(${sumVector('mean_square_vector', components)} / uniforms.norm_size ${\n simplified ? '' : '- mean * mean'} + uniforms.epsilon);\n\n for (var j: u32 = 0; j < uniforms.norm_size_vectorized; j++) {\n let f32input = ${castToF32(dataType, components, 'x[j + offset]')};\n let f32scale = ${castToF32(dataType, components, 'scale[j]')};\n output[j + offset] = ${variables[0].type.value}((f32input ${simplified ? '' : '- mean'}) * inv_std_dev * f32scale\n ${bias ? `+ ${castToF32(dataType, components, 'bias[j]')}` : ''}\n );\n }\n\n ${hasMeanDataOutput ? 'mean_data_output[global_idx] = mean' : ''};\n ${hasInvStdOutput ? 'inv_std_output[global_idx] = inv_std_dev' : ''};\n }`;\n };\n const outputs = [{dims: outputShape, dataType: inputs[0].dataType}];\n if (hasMeanDataOutput) {\n outputs.push({dims: meanInvStdDevDim, dataType: DataType.float});\n }\n if (hasInvStdOutput) {\n outputs.push({dims: meanInvStdDevDim, dataType: DataType.float});\n }\n\n return {\n name: 'LayerNormalization',\n shaderCache: {hint: `${components};${outputCount};${simplified}`, inputDependencies},\n getRunData: () =>\n ({outputs, dispatchGroup: {x: Math.ceil(normCount / 64 /* workgroup size */)}, programUniforms}),\n getShaderSource,\n };\n };\n\nexport const layerNorm = (context: ComputeContext, attributes: LayerNormAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createLayerNormProgramInfo(context.inputs, attributes, context.outputCount));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType, getTensorElementSize} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, getMaxComponents, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\n\n// TODO support quantization bits not equal to 4\nexport interface MatMulNBitsAttributes extends AttributeWithCacheKey {\n k: number;\n n: number;\n accuracyLevel: number;\n bits: number;\n blockSize: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: MatMulNBitsAttributes): void => {\n if (inputs.length < 3 || inputs.length > 4) {\n throw new Error('MatMulNBits requires 3 or 4 inputs');\n }\n const a = inputs[0];\n const aRank = a.dims.length;\n if (a.dims[aRank - 1] !== attributes.k) {\n throw new Error('The last dim of input shape does not match the k value');\n }\n const nBlocksPerCol = Math.floor((attributes.k + attributes.blockSize - 1) / attributes.blockSize);\n const blobSize = attributes.blockSize / 8 * attributes.bits;\n const b = inputs[1];\n if (!ShapeUtil.areEqual(b.dims, [attributes.n, nBlocksPerCol, blobSize])) {\n throw new Error('The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize');\n }\n const scales = inputs[2];\n const scalesShape = scales.dims;\n if (ShapeUtil.size(scalesShape) !== attributes.n * nBlocksPerCol) {\n throw new Error('scales input size error.');\n }\n if (inputs.length === 4) {\n const zeroPoints = inputs[3];\n const zeroPointsShape = zeroPoints.dims;\n const expectedZeroPointsSize =\n attributes.bits > 4 ? (attributes.n * nBlocksPerCol) : attributes.n * Math.floor((nBlocksPerCol + 1) / 2);\n if (ShapeUtil.size(zeroPointsShape) !== expectedZeroPointsSize) {\n throw new Error('zeroPoints input size error.');\n }\n }\n};\n\nexport const createMatMulNBitsProgramInfo =\n (inputs: readonly TensorView[], attributes: MatMulNBitsAttributes,\n maxComputeWorkgroupSizes: [number, number, number], maxComputeWorkgroupStorageSize: number): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const aRank = inputShape.length;\n const nBlocksPerCol = Math.floor((attributes.k + attributes.blockSize - 1) / attributes.blockSize);\n const dimAOuter = inputShape[aRank - 2];\n const dimInner = attributes.k;\n const dimBOuter = attributes.n;\n const batchDims = inputShape.slice(0, aRank - 2);\n const batchSize = ShapeUtil.size(batchDims);\n const blobSize = attributes.blockSize / 8 * attributes.bits;\n const blobSizeInWords = blobSize / 4;\n const dataType = inputs[0].dataType;\n const outputNumber = getMaxComponents(dimAOuter);\n const aComponents = getMaxComponents(attributes.k);\n const bComponents = getMaxComponents(blobSizeInWords);\n const elementSize = getTensorElementSize(dataType)!;\n const workgroupOutputSize = dimAOuter * nBlocksPerCol * elementSize;\n const maxNumberOfComponents = Math.floor(maxComputeWorkgroupStorageSize / workgroupOutputSize);\n const useBlockwiseMatMulNBits = nBlocksPerCol <= maxComputeWorkgroupSizes[0] && maxNumberOfComponents > 0;\n const components = (!useBlockwiseMatMulNBits || maxNumberOfComponents >= 4) ? getMaxComponents(dimBOuter) :\n ((maxNumberOfComponents >= 2) && getMaxComponents(dimBOuter) >= 2) ? 2 :\n 1;\n const outputShape = batchDims.concat([dimAOuter, dimBOuter]);\n const outputSize = ShapeUtil.size(outputShape) / components / outputNumber;\n\n const programUniforms: ProgramUniform[] = useBlockwiseMatMulNBits ?\n [] :\n [{type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: attributes.blockSize}];\n const inputShapeTemp = [batchSize, dimAOuter, dimInner / aComponents];\n const bShape = ShapeUtil.convertShape(inputs[1].dims).slice();\n bShape.splice(-1, 1, blobSizeInWords / bComponents);\n programUniforms.push(...createTensorShapeVariables(inputShapeTemp));\n programUniforms.push(...createTensorShapeVariables(bShape));\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n if (inputs.length === 4) {\n programUniforms.push(...createTensorShapeVariables(ShapeUtil.convertShape(inputs[3].dims)));\n }\n const outputShapeTemp = [batchSize, dimAOuter, dimBOuter / components];\n programUniforms.push(...createTensorShapeVariables(outputShapeTemp));\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const inputRank = inputShapeTemp.length;\n const a = inputVariable('a', inputs[0].dataType, inputRank, aComponents);\n const b = inputVariable('b', DataType.uint32, bShape.length, bComponents);\n const scales = inputVariable('scales', inputs[2].dataType, inputs[2].dims.length);\n const inputVariables = [a, b, scales];\n const zeroPoints =\n inputs.length === 4 ? inputVariable('zero_points', DataType.uint32, inputs[3].dims.length) : undefined;\n if (zeroPoints) {\n inputVariables.push(zeroPoints);\n }\n const outputRank = outputShapeTemp.length;\n const output = outputVariable('output', inputs[0].dataType, outputRank, components);\n const uniforms: UniformsArrayType = [{name: 'output_size', type: 'u32'}, {name: 'block_size', type: 'u32'}];\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n\n const qDqDataType = (() => {\n switch (aComponents) {\n case 1:\n return `array<${dataType}, 8>`;\n case 2:\n return `mat4x2<${dataType}>`;\n case 4:\n return `mat2x4<${dataType}>`;\n default:\n throw new Error(`${aComponents}-component is not supported.`);\n }\n })();\n\n const processOneBlock = `\n for (var word: u32 = 0; word < ${blobSizeInWords}; word += ${bComponents}) {\n ${b.indicesSet('b_indices', '2', 'word')};\n let b_data = ${b.getByIndices('b_indices')};\n for (var i: u32 = 0; i < ${bComponents}; i++) {\n let b_value: u32 = ${bComponents === 1 ? 'b_data' : 'b_data[word + i]'};\n let b_mask: u32 = 0x0F0F0F0Fu;\n let b_value_lower: vec4 = unpack4xU8(b_value & b_mask);\n let b_value_upper: vec4 = unpack4xU8((b_value >> 4) & b_mask);\n let b_quantized_values = ${qDqDataType}(${\n Array.from({length: 4}, (_, i) => `${dataType}(b_value_lower[${i}]), ${dataType}(b_value_upper[${i}])`)\n .join(', ')});\n let b_dequantized_values = ${(() => {\n if (aComponents === 1) {\n return `${qDqDataType}(${\n Array.from({length: 8}, (_, i) => `(b_quantized_values[${i}] - zero_point) * scale`).join(', ')});`;\n } else {\n return `(b_quantized_values - ${qDqDataType}(${Array(8).fill('zero_point').join(',')})) * scale;`;\n }\n })()};\n // Number of B elements per 32-bit word is 32/bits = 32/4 = 8\n for (var m: u32 = 0; m < ${useBlockwiseMatMulNBits ? dimAOuter : outputNumber}u; m++) {\n ${a.indicesSet('a_indices', inputRank - 2, useBlockwiseMatMulNBits ? 'm' : `row * ${outputNumber} + m`)};\n ${a.indicesSet('a_indices', inputRank - 1, 'word_offset')};\n var input_offset = ${a.indicesToOffset('a_indices')};\n var a_data: ${qDqDataType};\n for (var j: u32 = 0; j < ${8 / aComponents}; j++) {\n a_data[j] = ${a.getByOffset('input_offset')};\n input_offset++;\n }\n ${useBlockwiseMatMulNBits ? 'workgroup_shared[workgroup_shared_offset + m]' : 'output_values[m]'}${\n components > 1 ? '[c]' : ''} += ${\n Array\n .from(\n {length: 8 / aComponents},\n (_, i) => `${\n aComponents === 1 ? `a_data[${i}] * b_dequantized_values[${i}]` :\n `dot(a_data[${i}], b_dequantized_values[${i}])`}`)\n .join(' + ')};\n }\n word_offset += ${8 / aComponents};\n }\n }`;\n const updateZeroPointIndex = zeroPoints ? `\n zero_point_offset += 4;\n if (zero_point_offset == 32) {\n zero_point_offset = 0;\n zero_point_index++;\n zero_point_word = ${zeroPoints.getByOffset('zero_point_index')};\n }` :\n '';\n\n return useBlockwiseMatMulNBits ? `\n var workgroup_shared: array<${output.type.value}, ${dimAOuter * nBlocksPerCol}>;\n ${shaderHelper.declareVariables(...inputVariables, output)}\n ${shaderHelper.mainStart([\n nBlocksPerCol, 1, 1\n ])}\n var a_indices: ${a.type.indices};\n var block = local_id.x;\n var col = workgroup_id.y;\n var batch = workgroup_id.z;\n ${a.indicesSet('a_indices', '0', 'batch')};\n // Two zero points are packed into one byte when uniforms.bits is 4.\n for (var c: u32 = 0; c < ${components}; c++) {\n let col_times_components_plus_c = col * ${components} + c;\n ${\n zeroPoints ? `\n var zero_point_bytes_per_col: u32 = (${nBlocksPerCol} + 1) / 2;\n var zero_point_byte_count: u32 = col_times_components_plus_c * zero_point_bytes_per_col + (block >> 0x1u);\n var zero_point_word_index: u32 = zero_point_byte_count >> 0x2u;\n var zero_point_byte_offset: u32 = zero_point_byte_count & 0x3u;\n var zero_point_nibble_offset: u32 = block & 0x1u;\n var zero_point_bits_offset: u32 = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2);\n var zero_point_word: u32 = ${zeroPoints.getByOffset('zero_point_word_index')} >> zero_point_bits_offset;` :\n ''}\n var b_indices: ${b.type.indices};\n ${b.indicesSet('b_indices', '0', 'col_times_components_plus_c')};\n // The scale and zero points are computed per block.\n var scales_index = col_times_components_plus_c * ${nBlocksPerCol} + block;\n let scale = ${scales.getByOffset('scales_index')};\n // The default zero point is 8 for unsigned 4-bit quantization.\n let zero_point = ${dataType}(${zeroPoints ? '(zero_point_word) & 0xFu' : 8.0});\n ${b.indicesSet('b_indices', '1', 'block')};\n var word_offset: u32 = block * ${attributes.blockSize / aComponents};\n var workgroup_shared_offset: u32 = block * ${dimAOuter};\n ${processOneBlock}\n }\n workgroupBarrier();\n var output_indices: ${output.type.indices};\n var elements_per_thread: u32 = ${Math.ceil(dimAOuter / nBlocksPerCol)};\n ${output.indicesSet('output_indices', '0', 'batch')};\n ${output.indicesSet('output_indices', outputRank - 1, 'col')};\n ${output.indicesSet('output_indices', outputRank - 2, 'local_id.x * elements_per_thread')};\n var output_offset = ${output.indicesToOffset('output_indices')};\n for (var m: u32 = 0u; m < elements_per_thread; m++) {\n var row = m + local_id.x * elements_per_thread;\n if (row < ${dimAOuter}) {\n var output_value: ${output.type.value} = ${output.type.value}(0);\n var workgroup_shared_offset: u32 = row;\n for (var b: u32 = 0u; b < ${nBlocksPerCol}u; b++) {\n output_value += workgroup_shared[workgroup_shared_offset];\n workgroup_shared_offset += ${dimAOuter};\n }\n ${output.setByOffset('output_offset', 'output_value')};\n output_offset += ${dimBOuter / components};\n }\n }\n }` :\n `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n var output_values: array<${output.type.value}, ${outputNumber}>;\n var output_indices = ${output.offsetToIndices('global_idx')};\n var col = ${output.indicesGet('output_indices', outputRank - 1)};\n var row = ${output.indicesGet('output_indices', outputRank - 2)};\n var a_indices: ${a.type.indices} = output_indices;\n // Two zero points are packed into one byte because uniforms.bits <= 4.\n // zero_point_offset is either 0 or 4. It is bit offset within one byte.\n // TODO support zero_point_offset for bits > 4\n ${\n zeroPoints ? `\n var zero_point_abs_offset = col * ${components} * ((${nBlocksPerCol} + 1) / 2);\n var zero_point_index: u32 = zero_point_abs_offset / 4;\n var zero_point_word: u32 = ${zeroPoints.getByOffset('zero_point_index')};\n var zero_point_offset: u32 = (zero_point_abs_offset % 4) * 8;` :\n ''}\n var scale_index = col * ${nBlocksPerCol * components};\n var b_indices: ${b.type.indices};\n for (var c: u32 = 0; c < ${components}; c++) {\n ${b.indicesSet('b_indices', '0', `col * ${components} + c`)};\n var block_offset: u32 = 0;\n for (var block: u32 = 0; block < ${nBlocksPerCol}; block++) {\n // The scale and zero points are computed per block.\n let scale = ${scales.getByOffset('scale_index')};\n // The default zero point is 8 for unsigned 4-bit quantization.\n let zero_point = ${dataType}(${zeroPoints ? 'extractBits(zero_point_word, zero_point_offset, 4)' : 8.0});\n ${b.indicesSet('b_indices', '1', 'block')};\n var word_offset: u32 = block_offset;\n ${processOneBlock}\n scale_index++;\n ${updateZeroPointIndex}\n block_offset += uniforms.block_size / ${aComponents};\n }\n // Drop the trailing 4 bits if the zero_poit_offset is not a byte boundary to align with the next byte.\n ${\n zeroPoints ? `if (zero_point_offset % 8 > 0) {\n ${updateZeroPointIndex}\n }` :\n ''}\n }\n for (var k: u32 = 0u; k < ${outputNumber}u; k++) {\n ${output.indicesSet('output_indices', outputRank - 2, `${outputNumber} * row + k`)};\n ${output.setByIndices('output_indices', 'output_values[k]')}\n }\n }`;\n };\n return {\n name: useBlockwiseMatMulNBits ? 'BlockwiseMatMulNBits' : 'MatMulNBits',\n shaderCache: {\n hint: `${attributes.cacheKey};${dimAOuter};${dataType};${inputs.length}`,\n inputDependencies: Array(inputs.length).fill('rank')\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType}],\n name: useBlockwiseMatMulNBits ? 'BlockwiseMatMulNBits' : 'MatMulNBits',\n dispatchGroup: useBlockwiseMatMulNBits ? {x: 1, y: Math.ceil(dimBOuter / components), z: batchSize} :\n {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource\n };\n };\n\nexport const matMulNBits = (context: ComputeContext, attributes: MatMulNBitsAttributes): void => {\n validateInputs(context.inputs, attributes);\n const maxComputeWorkgroupSizes: [number, number, number] = context.getMaxComputeWorkgroupSizes();\n const maxComputeWorkgroupStorageSize = context.getMaxComputeWorkgroupStoragesize();\n context.compute(createMatMulNBitsProgramInfo(\n context.inputs, attributes, maxComputeWorkgroupSizes, maxComputeWorkgroupStorageSize));\n};\n\nexport const parseMatMulNBitsAttributes = (attributes: Record): MatMulNBitsAttributes =>\n createAttributeWithCacheKey(attributes as Omit);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper, UniformDataElementType, UniformsArrayType} from './common';\n\ninterface PadAttributes {\n // 0-constant, 1-reflect, 2-edge, 3-wrap\n readonly mode: number;\n readonly value: number;\n readonly pads: number[];\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('Too few inputs');\n }\n if (inputs[0].dataType !== DataType.float && inputs[0].dataType !== DataType.float16) {\n throw new Error('Input type must be float or float16.');\n }\n\n if (inputs.length >= 2) {\n let validPads = inputs[0].dims.length * 2 === inputs[1].dims[0];\n if (inputs.length === 4) {\n validPads = inputs[3].dims[0] * 2 === inputs[1].dims[0];\n }\n if (!validPads) {\n throw new Error('The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].');\n }\n }\n};\n\nconst getPadConstant = (output: IndicesHelper, inputRank: number, padsLength: number): string => {\n let block = '';\n for (let i = inputRank - 1; i >= 0; --i) {\n block += `\n k = i32(${output.indicesGet('indices', i)}) - ${getElementAt('uniforms.pads', i, padsLength)};\n if (k < 0) {\n break;\n }\n if (k >= i32(${getElementAt('uniforms.x_shape', i, inputRank)})) {\n break;\n }\n offset += k * i32(${getElementAt('uniforms.x_strides', i, inputRank)});\n `;\n }\n\n return `\n value = ${output.type.value}(uniforms.constant_value);\n for (var i = 0; i < 1; i++) {\n var offset = 0;\n var k = 0;\n ${block}\n value = x[offset];\n }\n `;\n};\n\nconst getPadReflect = (output: IndicesHelper, inputRank: number, padsLength: number): string => {\n let block = '';\n for (let i = inputRank - 1; i >= 0; --i) {\n block += `\n k = i32(${output.indicesGet('indices', i)}) - ${getElementAt('uniforms.pads', i, padsLength)};\n if (k < 0) {\n k = -k;\n }\n {\n let _2n_1 = 2 * (i32(${getElementAt('uniforms.x_shape', i, inputRank)}) - 1);\n k = k % _2n_1;\n if(k >= i32(${getElementAt('uniforms.x_shape', i, inputRank)})) {\n k = _2n_1 - k;\n }\n }\n offset += k * i32(${getElementAt('uniforms.x_strides', i, inputRank)});\n `;\n }\n\n return `\n var offset = 0;\n var k = 0;\n ${block}\n value = x[offset];\n `;\n};\n\nconst getPadEdge = (output: IndicesHelper, inputRank: number, padsLength: number): string => {\n let block = '';\n for (let i = inputRank - 1; i >= 0; --i) {\n block += `\n k = i32(${output.indicesGet('indices', i)}) - ${getElementAt('uniforms.pads', i, padsLength)};\n if (k < 0) {\n k = 0;\n }\n if (k >= i32(${getElementAt('uniforms.x_shape', i, inputRank)})) {\n k = i32(${getElementAt('uniforms.x_shape', i, inputRank)}) - 1;\n }\n offset += k * i32(${getElementAt('uniforms.x_strides', i, inputRank)});\n `;\n }\n\n return `\n var offset = 0;\n var k = 0;\n ${block}\n value = x[offset];\n `;\n};\n\nconst getPadWrap = (output: IndicesHelper, inputRank: number, padsLength: number): string => {\n let block = '';\n for (let i = inputRank - 1; i >= 0; --i) {\n block += `\n k = i32(${output.indicesGet('indices', i)}) - ${getElementAt('uniforms.pads', i, padsLength)};\n if (k < 0) {\n k += i32(${getElementAt('uniforms.x_shape', i, inputRank)}]);\n }\n if (k >= i32(${getElementAt('uniforms.x_shape', i, inputRank)})) {\n k -= i32(${getElementAt('uniforms.x_shape', i, inputRank)});\n }\n offset += k * i32(${getElementAt('uniforms.x_strides', i, inputRank)});\n `;\n }\n\n return `\n var offset = 0;\n var k = 0;\n ${block}\n value = x[offset];\n `;\n};\n\nconst getPadSnippet = (output: IndicesHelper, inputRank: number, attributes: PadAttributes): string => {\n switch (attributes.mode) {\n case 0:\n return getPadConstant(output, inputRank, attributes.pads.length);\n case 1:\n return getPadReflect(output, inputRank, attributes.pads.length);\n case 2:\n return getPadEdge(output, inputRank, attributes.pads.length);\n case 3:\n return getPadWrap(output, inputRank, attributes.pads.length);\n default:\n throw new Error('Invalid mode');\n }\n};\n\nconst createPadProgramInfo = (inputs: readonly TensorView[], attributes: PadAttributes): ProgramInfo => {\n const outputShape = ShapeUtil.padShape(inputs[0].dims.slice(), attributes.pads);\n const inputDims = inputs[0].dims;\n const outputSize = ShapeUtil.size(outputShape);\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: outputSize}, {type: DataType.int32, data: attributes.pads}];\n if (attributes.mode === 0) {\n programUniforms.push({type: inputs[0].dataType, data: attributes.value});\n }\n\n programUniforms.push(...createTensorShapeVariables(inputs[0].dims, outputShape));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank'];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('output', inputs[0].dataType, outputShape.length);\n const input = inputVariable('x', inputs[0].dataType, inputDims.length);\n const dataType = input.type.value;\n const padSnippet = getPadSnippet(output, inputDims.length, attributes);\n const uniforms: UniformsArrayType =\n [{name: 'output_size', type: 'u32'}, {name: 'pads', type: 'i32', length: attributes.pads.length}];\n if (attributes.mode === 0) {\n uniforms.push({name: 'constant_value', type: dataType as UniformDataElementType});\n }\n\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let indices = ${output.offsetToIndices('global_idx')};\n\n var value = ${dataType}(0);\n ${padSnippet}\n output[global_idx] = value;\n }`;\n };\n\n return {\n name: 'Pad',\n shaderCache: {hint: `${attributes.mode}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(ShapeUtil.size(outputShape) / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n};\n\nconst createPadAttributesFromInputs = (inputs: readonly TensorView[], attributes: PadAttributes): PadAttributes => {\n if (inputs.length > 1) {\n const bigInt64Pads = inputs[1].getBigInt64Array();\n const value = (inputs.length >= 3 && inputs[2].data) ? inputs[2].getFloat32Array()[0] : 0.0;\n\n const inputRank = inputs[0].dims.length;\n const updatePads = new Int32Array(2 * inputRank).fill(0);\n if (inputs.length >= 4) {\n const axes = inputs[3].getBigInt64Array();\n for (let i = 0; i < axes.length; i++) {\n updatePads[Number(axes[i])] = Number(bigInt64Pads[i]);\n updatePads[Number(axes[i]) + inputRank] = Number(bigInt64Pads[i + axes.length]);\n }\n } else {\n bigInt64Pads.forEach((v, i) => updatePads[Number(i)] = (Number(v)));\n }\n\n const pads: number[] = [];\n updatePads.forEach(v => pads.push(v));\n\n return {mode: attributes.mode, value, pads};\n } else {\n return attributes;\n }\n};\n\nexport const pad = (context: ComputeContext, attributes: PadAttributes): void => {\n validateInputs(context.inputs);\n const updatedAttributes = createPadAttributesFromInputs(context.inputs, attributes);\n context.compute(createPadProgramInfo(context.inputs, updatedAttributes), {inputs: [0]});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {PoolConvUtil, ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\n\n// TODO: support:\n// - ceil_mode \"test_maxpool_2d_ceil\"\n// - storage_order \"test_maxpool_with_argmax_2d_precomputed_strides\"\n// - [MaxPool] dilations \"test_maxpool_2d_dilations\"\n// - [MaxPool] output[1] \"test_maxpool_with_argmax_2d_precomputed_pads\"\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (env.webgpu.validateInputContent && (!inputs || inputs.length !== 1)) {\n throw new Error('Pool ops requires 1 input.');\n }\n};\n\nconst getAdjustedPoolAttributesAndOutputShape = (\n input: TensorView, attributes: AttributeType, isGlobalOperator: boolean): [AttributeType, number[]] => {\n const isChannelsLast = attributes.format === 'NHWC';\n const inputShapeAsChannelFirst = input.dims.slice();\n if (isChannelsLast) {\n inputShapeAsChannelFirst.splice(1, 0, inputShapeAsChannelFirst.pop()!); // Move channel to the second position.\n }\n const hasDilations = Object.hasOwnProperty.call(attributes, 'dilations');\n const kernelShape = attributes.kernelShape.slice();\n const strides = attributes.strides.slice();\n const dilations: number[] = hasDilations ? (attributes as MaxPoolAttributes).dilations.slice() : [];\n const pads = attributes.pads.slice();\n PoolConvUtil.adjustPoolAttributes(isGlobalOperator, inputShapeAsChannelFirst, kernelShape, strides, dilations, pads);\n\n const outputShapeAsChannelFirst = PoolConvUtil.computePoolOutputShape(\n isGlobalOperator, inputShapeAsChannelFirst, strides, dilations, kernelShape, pads, attributes.autoPad);\n\n const newAttributes = Object.assign({}, attributes);\n if (hasDilations) {\n Object.assign(newAttributes, {kernelShape, strides, pads, dilations, cacheKey: attributes.cacheKey});\n } else {\n Object.assign(newAttributes, {kernelShape, strides, pads, cacheKey: attributes.cacheKey});\n }\n const outputShapeAsChannelLast = outputShapeAsChannelFirst.slice();\n outputShapeAsChannelLast.push(outputShapeAsChannelLast.splice(1, 1)[0]);\n return [newAttributes, isChannelsLast ? outputShapeAsChannelLast : outputShapeAsChannelFirst];\n};\n\nconst getUniformAndPadInfo = (\n outputShape: readonly number[],\n attributes: AttributeType): [ProgramUniform[], UniformsArrayType, boolean, boolean, boolean] => {\n const isChannelsLast = attributes.format === 'NHWC';\n const outputSize = ShapeUtil.size(outputShape);\n const kernelSize = ShapeUtil.size(attributes.kernelShape);\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: kernelSize}];\n const uniforms: UniformsArrayType = [{name: 'outputSize', type: 'u32'}, {name: 'kernelSize', type: 'u32'}];\n if (attributes.kernelShape.length <= 2) {\n const kw = attributes.kernelShape[attributes.kernelShape.length - 1];\n const sw = attributes.strides[attributes.strides.length - 1];\n const pwStart = attributes.pads[attributes.pads.length / 2 - 1];\n const pwEnd = attributes.pads[attributes.pads.length - 1];\n const pwStartEndNotZero = !!(pwStart + pwEnd);\n programUniforms.push(\n {type: DataType.uint32, data: kw},\n {type: DataType.uint32, data: sw},\n {type: DataType.uint32, data: pwStart},\n {type: DataType.uint32, data: pwEnd},\n );\n uniforms.push(\n {name: 'kw', type: 'u32'}, {name: 'sw', type: 'u32'}, {name: 'pwStart', type: 'u32'},\n {name: 'pwEnd', type: 'u32'});\n\n let phStartEndNotZero = false;\n if (attributes.kernelShape.length === 2) {\n const kh = attributes.kernelShape[attributes.kernelShape.length - 2];\n const sh = attributes.strides[attributes.strides.length - 2];\n const phStart = attributes.pads[attributes.pads.length / 2 - 2];\n const phEnd = attributes.pads[attributes.pads.length - 2];\n phStartEndNotZero = !!(phStart + phEnd);\n programUniforms.push(\n {type: DataType.uint32, data: kh}, {type: DataType.uint32, data: sh}, {type: DataType.uint32, data: phStart},\n {type: DataType.uint32, data: phEnd});\n\n uniforms.push(\n {name: 'kh', type: 'u32'}, {name: 'sh', type: 'u32'}, {name: 'phStart', type: 'u32'},\n {name: 'phEnd', type: 'u32'});\n }\n return [programUniforms, uniforms, true, pwStartEndNotZero, phStartEndNotZero];\n } else {\n if (isChannelsLast) {\n throw new Error('Pooling with kernelShape.length > 2 is not supported for NHWC format.');\n }\n const kernelStrides = ShapeUtil.computeStrides(attributes.kernelShape);\n programUniforms.push(\n {type: DataType.uint32, data: kernelStrides}, {type: DataType.uint32, data: attributes.pads},\n {type: DataType.uint32, data: attributes.strides});\n uniforms.push(\n {name: 'kernelStrides', type: 'u32', length: kernelStrides.length},\n {name: 'pads', type: 'u32', length: attributes.pads.length},\n {name: 'strides', type: 'u32', length: attributes.strides.length});\n\n const hasPads = attributes.pads.reduce((sum, cur) => sum + cur);\n return [programUniforms, uniforms, !!hasPads, false, false];\n }\n};\n\nconst generatePoolingCode = (\n shaderHelper: ShaderHelper, x: IndicesHelper, rank: number, outputShapeRank: number, attributes: AttributeType,\n op1: string, op2: string, start: number, uniforms: UniformsArrayType, hasPads: boolean, pwStartEndNotZero: boolean,\n phStartEndNotZero: boolean): string => {\n const isChannelsLast = attributes.format === 'NHWC';\n const dataType = x.type.value;\n const output = outputVariable('output', x.type.tensor, outputShapeRank);\n\n if (attributes.kernelShape.length <= 2) {\n let codeW = '';\n let codeH = '';\n let codeHEnd = '';\n const dimIdxW = rank - (isChannelsLast ? 2 : 1);\n if (pwStartEndNotZero) {\n codeW = `\n for (var i: u32 = 0u; i < uniforms.kw; i++) {\n xIndices[${dimIdxW}] = indices[${dimIdxW}] * uniforms.sw - uniforms.pwStart + i;\n if (xIndices[${dimIdxW}] < 0 || xIndices[${dimIdxW}]\n >= uniforms.x_shape[${dimIdxW}]) {\n pad++;\n continue;\n }\n let x_val = x[${x.indicesToOffset('xIndices')}];\n ${op1}\n }`;\n } else {\n codeW = `\n for (var i: u32 = 0u; i < uniforms.kw; i++) {\n xIndices[${dimIdxW}] = indices[${dimIdxW}] * uniforms.sw - uniforms.pwStart + i;\n let x_val = x[${x.indicesToOffset('xIndices')}];\n ${op1}\n }`;\n }\n\n if (attributes.kernelShape.length === 2) {\n const dimIdxH = rank - (isChannelsLast ? 3 : 2);\n if (phStartEndNotZero) {\n codeH = `\n for (var j: u32 = 0u; j < uniforms.kh; j++) {\n xIndices[${dimIdxH}] = indices[${dimIdxH}] * uniforms.sh - uniforms.phStart + j;\n if (xIndices[${dimIdxH}] < 0 || xIndices[${dimIdxH}] >= uniforms.x_shape[${dimIdxH}]) {\n pad += i32(uniforms.kw);\n continue;\n }\n `;\n } else {\n codeH = `\n for (var j: u32 = 0u; j < uniforms.kh; j++) {\n xIndices[${dimIdxH}] = indices[${dimIdxH}] * uniforms.sh - uniforms.phStart + j;\n `;\n }\n codeHEnd = `\n }\n `;\n }\n\n const poolingCode = `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(x, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n\n let indices = ${output.offsetToIndices('global_idx')};\n var xIndices = ${output.offsetToIndices('global_idx')};\n\n var value = ${dataType}(${start});\n var pad = 0;\n ${codeH}\n ${codeW}\n ${codeHEnd}\n ${op2}\n\n output[global_idx] = value;\n }`;\n return poolingCode;\n } else {\n if (isChannelsLast) {\n throw new Error('Pooling with kernelShape.length > 2 is not supported for NHWC format.');\n }\n const stridesRank = attributes.kernelShape.length;\n const padsRank = attributes.pads.length;\n let padCode = '';\n if (hasPads) {\n padCode = `\n if (xIndices[j] >= uniforms.x_shape[j]) {\n pad++;\n isPad = true;\n break;\n }\n }\n if (!isPad) {\n let x_val = x[${x.indicesToOffset('xIndices')}];\n ${op1}\n }`;\n } else {\n padCode = `\n }\n let x_val = x[${x.indicesToOffset('xIndices')}];\n ${op1}\n `;\n }\n const poolingCode = `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(x, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n let indices = ${output.offsetToIndices('global_idx')};\n var xIndices = ${output.offsetToIndices('global_idx')};\n\n var offsets: array;\n\n var value = ${dataType}(${start});\n var pad = 0;\n var isPad = false;\n\n for (var i: u32 = 0u; i < uniforms.kernelSize; i++) {\n var offset = i;\n for (var j = 0u; j < ${stridesRank - 1}u; j++) {\n offsets[j] = offset / ${getElementAt('uniforms.kernelStrides', 'j', stridesRank)};\n offset -= offsets[j] * ${getElementAt('uniforms.kernelStrides', 'j', stridesRank)};\n }\n offsets[${stridesRank - 1}] = offset;\n\n isPad = false;\n for (var j = ${rank - stridesRank}u; j < ${rank}u; j++) {\n xIndices[j] = indices[j] * ${\n getElementAt('uniforms.strides', `j - ${rank - stridesRank}u`, stridesRank)}\n + offsets[j - ${rank - stridesRank}u] - ${getElementAt('uniforms.pads', 'j - 2u', padsRank)};\n ${padCode}\n }\n ${op2}\n\n output[global_idx] = value;\n }`;\n return poolingCode;\n }\n};\n\nexport interface FormatAttributes {\n readonly format: 'NHWC'|'NCHW';\n}\n\nexport interface PoolCommonAttributes extends FormatAttributes {\n readonly autoPad: string;\n readonly ceilMode: number;\n readonly kernelShape: readonly number[];\n readonly strides: readonly number[];\n readonly pads: readonly number[];\n}\n\nconst createShaderKeyFromAttributes = (attributes: PoolCommonAttributes): string =>\n (`${attributes.format};${attributes.ceilMode};${attributes.autoPad};${attributes.kernelShape.length}`);\n\nconst createAveragePoolShaderKeyFromAttributes = (attributes: AveragePoolAttributes): string =>\n (`${createShaderKeyFromAttributes(attributes)};${attributes.countIncludePad}`);\n\nconst createMaxPoolShaderKeyFromAttributes = (attributes: MaxPoolAttributes): string =>\n (`${createShaderKeyFromAttributes(attributes)};${attributes.storageOrder};${attributes.dilations}`);\n\nconst parsePoolCommonAttributes = (attributes: Record): PoolCommonAttributes => ({\n format: attributes.format as FormatAttributes['format'],\n autoPad: ['NOTSET', 'VALID', 'SAME_UPPER', 'SAME_LOWER'][attributes.auto_pad as number],\n ceilMode: attributes.ceil_mode as number,\n kernelShape: attributes.kernel_shape as [number, number],\n strides: attributes.strides as [number, number],\n pads: attributes.pads as [number, number, number, number]\n});\n\nexport interface AveragePoolAttributes extends PoolCommonAttributes, AttributeWithCacheKey {\n readonly countIncludePad: boolean;\n}\n\nconst createAveragePoolProgramInfo =\n (name: string, input: TensorView, isGlobalOperator: boolean, attributes: AveragePoolAttributes): ProgramInfo => {\n const [adjustedAttributes, outputShape] =\n getAdjustedPoolAttributesAndOutputShape(input, attributes, isGlobalOperator);\n const x = inputVariable('x', input.dataType, input.dims.length);\n const dataType = x.type.value;\n\n const op1 = 'value += x_val;';\n let op2 = '';\n if (adjustedAttributes.countIncludePad) {\n op2 += `value /= ${dataType}(uniforms.kernelSize);`;\n } else {\n op2 += `value /= ${dataType}(i32(uniforms.kernelSize) - pad);`;\n }\n const [programUniforms, uniforms, hasPads, pwStartEndNotZero, phStartEndNotZero] =\n getUniformAndPadInfo(outputShape, adjustedAttributes);\n programUniforms.push(...createTensorShapeVariables(input.dims, outputShape));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank'];\n return {\n name,\n shaderCache:\n {hint: `${attributes.cacheKey};${hasPads};${pwStartEndNotZero};${phStartEndNotZero}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: input.dataType}],\n dispatchGroup: {x: Math.ceil(ShapeUtil.size(outputShape) / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource: shaderHelper => generatePoolingCode(\n shaderHelper, x, input.dims.length, outputShape.length, adjustedAttributes, op1, op2, 0.0, uniforms,\n hasPads, pwStartEndNotZero, phStartEndNotZero),\n };\n };\n\nexport const parseAveragePoolAttributes = (attributes: Record): AveragePoolAttributes => {\n const countIncludePad = (attributes.count_include_pad as number) === 0 ? false : true;\n\n const attr = parsePoolCommonAttributes(attributes);\n // TODO: support attribute 'ceil_mode'\n if (attr.ceilMode !== 0) {\n throw new Error('using ceil() in shape computation is not yet supported for AveragePool');\n }\n const averagePoolAttributes = {countIncludePad, ...attr, cacheKey: ''};\n return {...averagePoolAttributes, cacheKey: createAveragePoolShaderKeyFromAttributes(averagePoolAttributes)};\n};\n\nexport const averagePool = (context: ComputeContext, attributes: AveragePoolAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createAveragePoolProgramInfo('AveragePool', context.inputs[0], false, attributes));\n};\n\nconst globalPoolAttributes = {\n autoPad: '',\n ceilMode: 0,\n countIncludePad: false,\n kernelShape: [],\n strides: [],\n pads: [],\n storageOrder: 0,\n dilations: []\n};\n\nexport const parseGlobalAveragePoolAttributes = (attributes: Record): AveragePoolAttributes => {\n const format = attributes.format as FormatAttributes['format'];\n return {format, ...globalPoolAttributes, cacheKey: format};\n};\n\nexport const globalAveragePool = (context: ComputeContext, attributes: AveragePoolAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createAveragePoolProgramInfo('GlobalAveragePool', context.inputs[0], true, attributes));\n};\n\nexport interface MaxPoolAttributes extends PoolCommonAttributes, AttributeWithCacheKey {\n readonly storageOrder: number;\n readonly dilations: number[];\n}\n\nconst createMaxPoolProgramInfo =\n (name: string, input: TensorView, isGlobalOperator: boolean, attributes: MaxPoolAttributes): ProgramInfo => {\n const [adjustedAttributes, outputShape] =\n getAdjustedPoolAttributesAndOutputShape(input, attributes, isGlobalOperator);\n const op1 = `\n value = max(x_val, value);\n `;\n const op2 = '';\n const x = inputVariable('x', input.dataType, input.dims.length);\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank'];\n const [programUniforms, uniforms, hasPads, pwStartEndNotZero, phStartEndNotZero] =\n getUniformAndPadInfo(outputShape, adjustedAttributes);\n programUniforms.push(...createTensorShapeVariables(input.dims, outputShape));\n return {\n name,\n shaderCache:\n {hint: `${attributes.cacheKey};${hasPads};${pwStartEndNotZero};${phStartEndNotZero}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: input.dataType}],\n dispatchGroup: {x: Math.ceil(ShapeUtil.size(outputShape) / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource: shaderHelper => generatePoolingCode(\n shaderHelper, x, input.dims.length, outputShape.length, adjustedAttributes, op1, op2,\n (input.dataType === DataType.float16) ? -65504 : -1e5, uniforms, hasPads, pwStartEndNotZero,\n phStartEndNotZero),\n };\n };\n\nexport const maxPool = (context: ComputeContext, attributes: MaxPoolAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createMaxPoolProgramInfo('MaxPool', context.inputs[0], false, attributes));\n};\n\nexport const parseMaxPoolAttributes = (attributes: Record): MaxPoolAttributes => {\n const storageOrder = attributes.storage_order as number;\n const dilations = attributes.dilations as [number, number];\n\n const attr = parsePoolCommonAttributes(attributes);\n // TODO: support attribute 'ceil_mode' and 'storage_order'\n if (storageOrder !== 0) {\n throw new Error('column major storage order is not yet supported for MaxPool');\n }\n if (attr.ceilMode !== 0) {\n throw new Error('using ceil() in shape computation is not yet supported for MaxPool');\n }\n const maxPoolAttributes = {storageOrder, dilations, ...attr, cacheKey: ''};\n return {...maxPoolAttributes, cacheKey: createMaxPoolShaderKeyFromAttributes(maxPoolAttributes)};\n};\n\nexport const parseGlobalMaxPoolAttributes = (attributes: Record): MaxPoolAttributes => {\n const format = attributes.format as FormatAttributes['format'];\n return {format, ...globalPoolAttributes, cacheKey: format};\n};\n\nexport const globalMaxPool = (context: ComputeContext, attributes: MaxPoolAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createMaxPoolProgramInfo('GlobalMaxPool', context.inputs[0], true, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport {DataType} from '../../../wasm-common';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, outputVariable, ShaderHelper, UniformDataElementType, UniformsArrayType} from './common';\n\nconst validateInputsContent = (start: number, limit: number, delta: number): void => {\n const sameStartLimit = start === limit;\n const increasingRangeNegativeStep = start < limit && delta < 0;\n const decreasingRangePositiveStep = start > limit && delta > 0;\n\n if (sameStartLimit || increasingRangeNegativeStep || decreasingRangePositiveStep) {\n throw new Error('Range these inputs\\' contents are invalid.');\n }\n};\n\nconst createRangeProgramInfo = (start: number, limit: number, delta: number, dataType: DataType): ProgramInfo => {\n const numElements = Math.abs(Math.ceil((limit - start) / delta));\n const outputShape: number[] = [numElements];\n const outputSize = numElements;\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: dataType, data: start}, {type: dataType, data: delta},\n ...createTensorShapeVariables(outputShape)\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('output', dataType, outputShape.length);\n const wgslType = output.type.value;\n const uniforms: UniformsArrayType = [\n {name: 'outputSize', type: 'u32'}, {name: 'start', type: wgslType as UniformDataElementType},\n {name: 'delta', type: wgslType as UniformDataElementType}\n ];\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n output[global_idx] = uniforms.start + ${wgslType}(global_idx) * uniforms.delta;\n }`;\n };\n\n return {\n name: 'Range',\n shaderCache: {hint: `${dataType}`},\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n })\n };\n};\n\nexport const range = (context: ComputeContext): void => {\n let start = 0;\n let limit = 0;\n let delta = 0;\n if (context.inputs[0].dataType === DataType.int32) {\n start = context.inputs[0].getInt32Array()[0];\n limit = context.inputs[1].getInt32Array()[0];\n delta = context.inputs[2].getInt32Array()[0];\n } else if (context.inputs[0].dataType === DataType.float) {\n start = context.inputs[0].getFloat32Array()[0];\n limit = context.inputs[1].getFloat32Array()[0];\n delta = context.inputs[2].getFloat32Array()[0];\n }\n if (env.webgpu.validateInputContent) {\n validateInputsContent(start, limit, delta);\n }\n\n context.compute(createRangeProgramInfo(start, limit, delta, context.inputs[0].dataType), {inputs: []});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\ntype CoordinateTransformMode = 'half_pixel'|'asymmetric'|'pytorch_half_pixel'|'tf_half_pixel_for_nn'|'align_corners'|\n 'tf_crop_and_resize'|'half_pixel_symmetric';\n\ntype KeepAspectRatioPolicy = 'stretch'|'not_smaller'|'not_larger';\n\ntype Mode = 'nearest'|'linear'|'cubic';\n\ntype NearestMode = 'round_prefer_floor'|'round_prefer_ceil'|'floor'|'ceil'|'simple';\n\nexport interface ResizeAttributes extends AttributeWithCacheKey {\n antialias: number;\n axes: number[];\n coordinateTransformMode: CoordinateTransformMode;\n cubicCoeffA: number;\n excludeOutside: boolean;\n extrapolationValue: number;\n keepAspectRatioPolicy: KeepAspectRatioPolicy;\n mode: Mode;\n nearestMode: NearestMode;\n}\n\nconst validateScales = (scales: number[], attributes: ResizeAttributes): void => {\n scales.every((value) => value > 0 || (() => {\n throw new Error('Resize requires scales input values to be positive');\n }));\n // Check scales dims based on mode: LINEAR, CUBIC\n if (scales.length > 0) {\n if (attributes.mode === 'linear') {\n if (!(scales.length === 2 || scales.length === 3 || (scales.length === 4 && scales[0] === 1 && scales[1] === 1) ||\n (scales.length === 4 && scales[0] === 1 && scales[3] === 1) ||\n (scales.length === 5 && scales[0] === 1 && scales[1] === 1))) {\n throw new Error(\n `For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and\n one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`);\n }\n } else if (attributes.mode === 'cubic') {\n if (!(scales.length === 2 || (scales.length === 4 && scales[0] === 1 && scales[1] === 1) ||\n (scales.length === 4 && scales[0] === 1 && scales[3] === 1))) {\n throw new Error('Resize requires scales input size to be 2 or 4 for cubic mode');\n }\n }\n }\n};\n\nconst updateScales = (scales: readonly number[], axes: readonly number[], rank: number): number[] => {\n axes.every((value) => value >= 0 && value < rank || (() => {\n throw new Error('Resize requires axes input values to be positive and less than rank');\n }));\n const newScales = new Array(rank).fill(1.0);\n axes.forEach((value, index) => newScales[value] = scales[index]);\n return newScales;\n};\n\nconst validateInputs =\n (inputs: readonly TensorView[], attributes: ResizeAttributes, opsetVersion: number, scales: number[],\n sizes: number[], roi: number[]): void => {\n const [roiInputIndex, scalesInputIndex, sizesInputIndex] =\n (opsetVersion > 10) ? [1, 2, 3] : [-1, (inputs.length > 1) ? 1 : -1, -1];\n const rank = inputs[0].dims.length;\n if (roiInputIndex > 0 && inputs.length > roiInputIndex && inputs[roiInputIndex].dims.length > 0) {\n inputs[roiInputIndex].getFloat32Array().forEach((value) => roi.push(value));\n } else if (attributes.coordinateTransformMode === 'tf_crop_and_resize') {\n throw new Error('Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize');\n }\n\n if (scalesInputIndex > 0 && inputs.length > scalesInputIndex && inputs[scalesInputIndex].dims.length > 0) {\n inputs[scalesInputIndex].getFloat32Array().forEach((value) => scales.push(value));\n if (scales.length !== 0 &&\n (scales.length !== rank && (opsetVersion >= 18 && scales.length !== attributes.axes.length))) {\n throw new Error(\n 'Resize requires scales input size to be same as input rank or axes size for opset 18 and up');\n }\n validateScales(scales, attributes);\n if (attributes.axes.length > 0) {\n updateScales(scales, attributes.axes, rank).forEach((value, index) => scales[index] = value);\n }\n }\n if (sizesInputIndex > 0 && inputs.length > sizesInputIndex) {\n inputs[sizesInputIndex].getBigInt64Array().forEach((value) => sizes.push(Number(value)));\n if (sizes.length !== rank || (opsetVersion >= 18 && sizes.length === attributes.axes.length)) {\n throw new Error('Resize requires sizes input size to be same as input rank or axes size for opset 18 and up');\n }\n }\n\n if (attributes.axes.length > 0) {\n if (scales.length !== attributes.axes.length) {\n throw new Error('Resize requires \"scales\" input size to be of axes rank when axes attributes is specified');\n }\n if (sizes.length !== attributes.axes.length) {\n throw new Error(\n 'Resize requires \"sizes\" input size to be of rank axes rank when axes attributes is specified');\n }\n }\n if (typeof scales !== 'undefined' && typeof sizes !== 'undefined' && scales.length > 0 && sizes.length > rank) {\n throw new Error('Resize requires only of scales or sizes to be specified');\n }\n };\n\nconst getOriginalCoordinateFromResizedCoordinate =\n (coordinateTransferMode: CoordinateTransformMode, dType: string): string =>\n `fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32,\n lengthOriginal: u32, roiStart: f32, roiEnd: f32) -> ${dType} { ` +\n (() => {\n switch (coordinateTransferMode) {\n case 'asymmetric':\n return `return ${dType}(xResized) / ${dType}(xScale);`;\n case 'pytorch_half_pixel':\n return `if (lengthResized > 1) {\n return (${dType}(xResized) + 0.5) / ${dType}(xScale) - 0.5;\n } else {\n return 0.0;\n }`;\n case 'tf_half_pixel_for_nn':\n return `return (${dType}(xResized) + 0.5) / ${dType}(xScale);`;\n case 'align_corners':\n return `if (lengthResized == 1) {\n return 0.0;\n } else {\n // The whole part and the fractional part are calculated separately due to inaccuracy of floating\n // point division. As an example, f32(21) / f32(7) may evaluate to 2.99... instead of 3, causing an\n // offset-by-one error later in floor().\n let whole = ${dType}(xResized * (lengthOriginal - 1) / (lengthResized - 1));\n let fract =\n ${dType}(xResized * (lengthOriginal - 1) % (lengthResized - 1)) / ${dType}(lengthResized - 1);\n return whole + fract;\n }`;\n case 'tf_crop_and_resize':\n return `if (lengthResized > 1) {\n return ${dType}(roiStart) * ${dType}(lengthOriginal - 1) +\n (${dType}(xResized) * ${dType}(roiEnd - roiStart) * ${dType}(lengthOriginal - 1)) /\n ${dType}(lengthResized - 1);\n } else {\n return 0.5 * ${dType}(roiStart + roiEnd) * ${dType}(lengthOriginal - 1);\n }`;\n case 'half_pixel_symmetric':\n return `const outputWidth = ${dType}xScale * ${dType}(lengthResized);\n const adjustment = ${dType}(lengthResized) / outputWidth;\n const center = ${dType}(lengthOriginal) / 2;\n const offset = center * (1 - adjustment);\n return offset + ((${dType}(xResized) + 0.5) / ${dType}(xScale)) - 0.5;`;\n case 'half_pixel':\n return `return ((${dType}(xResized) + 0.5) / ${dType}(xScale)) - 0.5;`;\n default:\n throw new Error(`Coordinate transform mode ${coordinateTransferMode} is not supported`);\n }\n })() +\n '}';\n\nconst getNearestPixelFromOriginal = (nearestMode: NearestMode, opsetVersion: number, dType: string): string =>\n `fn getNearestPixelFromOriginal(xOriginal: ${dType}, isDownSample: bool) -> ${dType} {` + (() => {\n switch (nearestMode) {\n case 'round_prefer_ceil':\n return 'if (fract(xOriginal) == 0.5) { \\\n return ceil(xOriginal); \\\n } else { \\\n return round(xOriginal); \\\n }';\n case 'floor':\n return 'return floor(xOriginal);';\n case 'ceil':\n return 'return ceil(xOriginal);';\n case 'round_prefer_floor':\n return 'if (fract(xOriginal) == 0.5) { \\\n return floor(xOriginal); \\\n } else { \\\n return round(xOriginal); \\\n }';\n case 'simple':\n default:\n if (opsetVersion < 11) {\n return 'if (isDownSample) \\\n { \\\n return ceil(xOriginal); \\\n } else { \\\n return xOriginal; \\\n }';\n }\n throw new Error(`Nearest mode ${nearestMode} is not supported`);\n }\n })() +\n '}';\n\nconst updateRoI = (roi: readonly number[], axes: readonly number[], rank: number): number[] => {\n const roiTmp = new Array(rank).fill(0).concat(new Array(rank).fill(1));\n const roiLocal = roi.length === 0 ? roiTmp : roi.slice();\n if (axes.length > 0) {\n axes.forEach((v, i) => {\n roiTmp[v] = roiLocal[i];\n roiTmp[i + rank] = roiLocal[axes.length + i];\n });\n return roiTmp;\n }\n return roiLocal;\n};\n\nconst initOutputShape =\n (inputShape: readonly number[], scales: readonly number[], sizes: readonly number[], axes: readonly number[]):\n number[] => {\n let outputShape: number[] = [];\n if (sizes.length > 0) {\n if (axes.length > 0) {\n inputShape.forEach((v) => outputShape.push(v));\n if (Math.max(...axes) > inputShape.length) {\n throw new Error('axes is out of bound');\n }\n axes.forEach((v, i) => outputShape[v] = sizes[i]);\n } else {\n sizes.forEach((v) => outputShape.push(v));\n }\n } else {\n if (scales.length === 0) {\n throw new Error('Resize requires either scales or sizes.');\n } else {\n outputShape = inputShape.map((value, index) => Math.round(value * scales[index]));\n }\n }\n return outputShape;\n };\n\nconst adjustOutputShape = (inputShape: readonly number[], scales: number[], attributes: ResizeAttributes) => {\n const scaleInPolicy = (() => {\n switch (attributes.keepAspectRatioPolicy) {\n case 'not_larger':\n return attributes.axes.length > 0 ? Math.min(...attributes.axes.map(i => scales[i]), Number.MAX_VALUE) :\n Math.min(...scales, Number.MAX_VALUE);\n case 'not_smaller':\n return attributes.axes.length > 0 ? Math.max(...attributes.axes.map(i => scales[i]), Number.MIN_VALUE) :\n Math.max(...scales, Number.MIN_VALUE);\n default:\n throw new Error(`Keep aspect ratio policy ${attributes.keepAspectRatioPolicy} is not supported`);\n }\n })();\n scales.fill(1.0, 0, scales.length);\n const adjustedOutputShape = inputShape.slice();\n if (attributes.axes.length > 0) {\n attributes.axes.forEach((v) => scales[v] = scaleInPolicy);\n attributes.axes.forEach((v) => adjustedOutputShape[v] = Math.round(inputShape[v] * scales[v]));\n } else {\n scales.fill(scaleInPolicy, 0, scales.length);\n adjustedOutputShape.forEach((v, i) => adjustedOutputShape[i] = Math.round(v * scales[i]));\n }\n return adjustedOutputShape;\n};\n\nconst calculateOriginalIndicesFromOutputIndices =\n (output: IndicesHelper, inputShape: readonly number[], outputShape: readonly number[], scalesLength: number,\n roiLength: number): string => `\n fn calculateOriginalIndicesFromOutputIndices(output_indices: ${output.type.indices}) -> array<${\n output.type.value}, ${outputShape.length}> {\n var original_indices: array<${output.type.value}, ${outputShape.length}>;\n for (var i:u32 = 0; i < ${outputShape.length}; i++) {\n var output_index = ${output.indicesGet('output_indices', 'i')};\n var scale = ${getElementAt('uniforms.scales', 'i', scalesLength)};\n var roi_low = ${getElementAt('uniforms.roi', 'i', roiLength)};\n var roi_hi = ${getElementAt('uniforms.roi', `i + ${inputShape.length}`, roiLength)};\n if (scale == 1.0) {\n original_indices[i] = ${output.type.value}(output_index);\n } else {\n var input_shape_i = ${getElementAt('uniforms.input_shape', 'i', inputShape.length)};\n var output_shape_i = ${getElementAt('uniforms.output_shape', 'i', outputShape.length)};\n original_indices[i] = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i,\n input_shape_i, roi_low, roi_hi);\n }\n }\n return original_indices;\n }`;\n\nconst calculateInputIndicesFromOutputIndices =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[], outputShape: readonly number[],\n scalesLength: number, roiLength: number, useExtrapolation: boolean): string => `\n fn calculateInputIndicesFromOutputIndices(output_indices: ${output.type.indices}) -> ${input.type.indices} {\n var input_indices: ${input.type.indices};\n for (var i:u32 = 0; i < ${outputShape.length}; i++) {\n var output_index = ${output.indicesGet('output_indices', 'i')};\n var input_index: u32;\n var scale = ${getElementAt('uniforms.scales', 'i', scalesLength)};\n if (scale == 1.0) {\n input_index = output_index;\n } else {\n var roi_low = ${getElementAt('uniforms.roi', 'i', roiLength)};\n var roi_hi = ${getElementAt('uniforms.roi', `i + ${inputShape.length}`, roiLength)};\n var input_shape_i = ${getElementAt('uniforms.input_shape', 'i', inputShape.length)};\n var output_shape_i = ${getElementAt('uniforms.output_shape', 'i', outputShape.length)};\n var original_idx = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i,\n input_shape_i, roi_low, roi_hi);\n if (!${useExtrapolation} || (original_idx >= 0 && original_idx < ${output.type.value}(input_shape_i))) {\n if (original_idx < 0) {\n input_index = 0;\n } else if (original_idx > ${output.type.value}(input_shape_i - 1)) {\n input_index = input_shape_i - 1;\n } else {\n input_index = u32(getNearestPixelFromOriginal(original_idx, scale < 1));\n }\n } else {\n input_index = u32(original_idx);\n }\n }\n ${input.indicesSet('input_indices', 'i', ' input_index')}\n }\n return input_indices;\n }`;\nconst checkInputIndices = (input: IndicesHelper, inputShape: readonly number[]): string => `\n fn checkInputIndices(input_indices: ${input.type.indices}) -> bool {\n for (var i:u32 = 0; i < ${inputShape.length}; i++) {\n var input_index = ${input.indicesGet('input_indices', 'i')};\n if (input_index < 0 || input_index >= ${getElementAt('uniforms.input_shape', 'i', inputShape.length)}) {\n return false;\n }\n }\n return true;\n }`;\n\nconst setChannelAndBatchIndices =\n (input: IndicesHelper, channelIdx: number, batchIdx: number, spacialDims: number): string =>\n input.rank > spacialDims ? `\n ${input.indicesSet('input_indices', channelIdx, 'channel')};\n ${input.indicesSet('input_indices', batchIdx, 'batch')};\n` :\n '';\n\nconst bilinearInterpolation =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[], useExtrapolation: boolean,\n extrapolationValue: number): string => {\n const isNchw = true;\n const [batchIdx, heightIdx, widthIdx, channelIdx] =\n inputShape.length === 2 ? [-1, 0, 1, -1] : (isNchw ? [0, 2, 3, 1] : [0, 1, 2, 3]);\n const dType = input.type.value;\n return `\n fn getInputValue(batch: u32, channel: u32, row: u32, col: u32) -> ${dType} {\n var input_indices: ${input.type.indices};\n ${input.indicesSet('input_indices', heightIdx, `max(0, min(row, ${inputShape[heightIdx]} - 1))`)};\n ${input.indicesSet('input_indices', widthIdx, `max(0, min(col, ${inputShape[widthIdx]} - 1))`)};\n ${setChannelAndBatchIndices(input, channelIdx, batchIdx, 2)}\n return ${input.getByIndices('input_indices')};\n }\n\n fn bilinearInterpolation(output_indices: ${output.type.indices}) -> ${dType} {\n var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices);\n var row:${dType} = originalIndices[${heightIdx}];\n var col:${dType} = originalIndices[${widthIdx}];\n ${\n useExtrapolation ?\n `if (row < 0 || row > (${inputShape[heightIdx]} - 1) || col < 0 || col > (${inputShape[widthIdx]} - 1)) {\n return ${extrapolationValue};\n }` :\n ''};\n row = max(0, min(row, ${inputShape[heightIdx]} - 1));\n col = max(0, min(col, ${inputShape[widthIdx]} - 1));\n var row1: u32 = u32(row);\n var col1: u32 = u32(col);\n var row2: u32 = u32(row + 1);\n var col2: u32 = u32(col + 1);\n var channel: u32 = ${inputShape.length > 2 ? `u32(originalIndices[${channelIdx}])` : '0'};\n var batch: u32 = ${inputShape.length > 2 ? `u32(originalIndices[${batchIdx}])` : '0'};\n var x11: ${dType} = getInputValue(batch, channel, row1, col1);\n var x12: ${dType} = getInputValue(batch, channel, row1, col2);\n var x21: ${dType} = getInputValue(batch, channel, row2, col1);\n var x22: ${dType} = getInputValue(batch, channel, row2, col2);\n var dx1: ${dType} = abs(row - ${dType}(row1));\n var dx2: ${dType} = abs(${dType}(row2) - row);\n var dy1: ${dType} = abs(col - ${dType}(col1));\n var dy2: ${dType} = abs(${dType}(col2) - col);\n if (row1 == row2) {\n dx1 = 0.5;\n dx2 = 0.5;\n }\n if (col1 == col2) {\n dy1 = 0.5;\n dy2 = 0.5;\n }\n return (x11 * dx2 * dy2 + x12 * dx2 * dy1 + x21 * dx1 * dy2 + x22 * dx1 * dy1);\n }`;\n };\n\nconst bicubicInterpolation =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[], outputShape: readonly number[],\n scales: readonly number[], roi: readonly number[], cubicCoeffA: number, useExtrapolation: boolean,\n extrapolationValue: number, excludeOutside: boolean): string => {\n const is2D = inputShape.length === 2;\n const isNchw = true;\n const [heightIdx, widthIdx] = is2D ? [0, 1] : isNchw ? [2, 3] : [1, 2];\n const dType = input.type.value;\n const createCubicInterpolationFunction = (idx: number): string => {\n const direction = idx === heightIdx ? 'row' : 'col';\n return `\n fn ${direction}CubicInterpolation(input_indices: ${input.type.indices}, output_indices: ${\n output.type.indices}) -> ${dType} {\n var output_index = ${output.indicesGet('output_indices', idx)};\n var originalIdx: ${dType} = getOriginalCoordinateFromResizedCoordinate(output_index, ${scales[idx]},\n ${outputShape[idx]}, ${inputShape[idx]}, ${roi[idx]}, ${roi[idx]} + ${inputShape.length});\n var fractOriginalIdx: ${dType} = originalIdx - floor(originalIdx);\n var coefs = getCubicInterpolationCoefs(fractOriginalIdx);\n\n if (${useExtrapolation} && (originalIdx < 0 || originalIdx > (${inputShape[idx]} - 1))) {\n return ${extrapolationValue};\n }\n var data: array<${dType}, 4> = array<${dType}, 4>(0.0, 0.0, 0.0, 0.0);\n for (var i: i32 = -1; i < 3; i++) {\n var ${direction}: ${dType} = originalIdx + ${dType}(i);\n if (${direction} < 0 || ${direction} >= ${inputShape[idx]}) {\n ${(() => {\n if (excludeOutside) {\n return `coefs[i + 1] = 0.0;\n continue;`;\n } else if (useExtrapolation) {\n return `return ${extrapolationValue};`;\n } else {\n return `${direction} = max(0, min(${direction}, ${inputShape[idx]} - 1));`;\n }\n })()};\n }\n var input_indices_copy: ${input.type.indices} = input_indices;\n ${input.indicesSet('input_indices_copy', idx, `u32(${direction})`)};\n data[i + 1] = ${\n idx === heightIdx ? input.getByIndices('input_indices_copy') :\n 'rowCubicInterpolation(input_indices_copy, output_indices)'};\n }\n return cubicInterpolation1D(data, coefs);\n }`;\n };\n\n return `\n ${createCubicInterpolationFunction(heightIdx)};\n ${createCubicInterpolationFunction(widthIdx)};\n fn getCubicInterpolationCoefs(s: ${dType}) -> array<${dType}, 4> {\n var absS = abs(s);\n var coeffs: array<${dType}, 4> = array<${dType}, 4>(0.0, 0.0, 0.0, 0.0);\n var oneMinusAbsS: ${dType} = 1.0 - absS;\n var twoMinusAbsS: ${dType} = 2.0 - absS;\n var onePlusAbsS: ${dType} = 1.0 + absS;\n coeffs[0] = ((${cubicCoeffA} * onePlusAbsS - 5 * ${cubicCoeffA}) * onePlusAbsS + 8 * ${\n cubicCoeffA}) * onePlusAbsS - 4 * ${cubicCoeffA};\n coeffs[1] = ((${cubicCoeffA} + 2) * absS - (${cubicCoeffA} + 3)) * absS * absS + 1;\n coeffs[2] = ((${cubicCoeffA} + 2) * oneMinusAbsS - (${cubicCoeffA} + 3)) * oneMinusAbsS * oneMinusAbsS + 1;\n coeffs[3] = ((${cubicCoeffA} * twoMinusAbsS - 5 * ${cubicCoeffA}) * twoMinusAbsS + 8 * ${\n cubicCoeffA}) * twoMinusAbsS - 4 * ${cubicCoeffA};\n return coeffs;\n }\n\n fn cubicInterpolation1D(x: array<${dType}, 4>, coefs: array<${dType}, 4>) -> ${dType} {\n var coefsSum: ${dType} = coefs[0] + coefs[1] + coefs[2] + coefs[3];\n return (x[0] * coefs[0] + x[1] * coefs[1]+ x[2] * coefs[2]+ x[3] * coefs[3]) / coefsSum;\n }\n\n fn bicubicInterpolation(output_indices: ${output.type.indices}) -> ${dType} {\n var input_indices: ${input.type.indices} = output_indices;\n return colCubicInterpolation(input_indices, output_indices);\n }\n `;\n };\n\nconst trilinearInterpolation =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[], useExtrapolation: boolean,\n extrapolationValue: number): string => {\n const isNchw = true;\n const [batchIdx, depthIdx, heightIdx, widthIdx, channelIdx] =\n inputShape.length === 3 ? [-1, 0, 1, 2, -1] : (isNchw ? [0, 2, 3, 4, 1] : [0, 1, 2, 3, 4]);\n const dType = input.type.value;\n return `\n fn getInputValue(batch: u32, channel: u32, depth:u32, height: u32, width: u32) -> ${dType} {\n var input_indices: ${input.type.indices};\n ${input.indicesSet('input_indices', depthIdx, `max(0, min(depth, ${inputShape[depthIdx]} - 1))`)};\n ${input.indicesSet('input_indices', heightIdx, `max(0, min(height, ${inputShape[heightIdx]} - 1))`)};\n ${input.indicesSet('input_indices', widthIdx, `max(0, min(width, ${inputShape[widthIdx]} - 1))`)};\n ${setChannelAndBatchIndices(input, channelIdx, batchIdx, 3)}\n return ${input.getByIndices('input_indices')};\n }\n\n fn trilinearInterpolation(output_indices: ${output.type.indices}) -> ${dType} {\n var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices);\n var depth:${dType} = originalIndices[${depthIdx}];\n var height:${dType} = originalIndices[${heightIdx}];\n var width:${dType} = originalIndices[${widthIdx}];\n ${\n useExtrapolation ? `if (depth < 0 || depth > (${inputShape[depthIdx]} - 1) || height < 0 || height > (${\n inputShape[heightIdx]} - 1) || width < 0 || (width > ${inputShape[widthIdx]} - 1)) {\n return ${extrapolationValue};\n }` :\n ''};\n\n depth = max(0, min(depth, ${inputShape[depthIdx]} - 1));\n height = max(0, min(height, ${inputShape[heightIdx]} - 1));\n width = max(0, min(width, ${inputShape[widthIdx]} - 1));\n var depth1: u32 = u32(depth);\n var height1: u32 = u32(height);\n var width1: u32 = u32(width);\n var depth2: u32 = u32(depth + 1);\n var height2: u32 = u32(height + 1);\n var width2: u32 = u32(width + 1);\n var channel: u32 = ${inputShape.length > 3 ? `u32(originalIndices[${channelIdx}])` : '0'};\n var batch: u32 = ${inputShape.length > 3 ? `u32(originalIndices[${batchIdx}])` : '0'};\n\n var x111: ${dType} = getInputValue(batch, channel, depth1, height1, width1);\n var x112: ${dType} = getInputValue(batch, channel, depth1, height1, width2);\n var x121: ${dType} = getInputValue(batch, channel, depth1, height2, width1);\n var x122: ${dType} = getInputValue(batch, channel, depth1, height2, width2);\n var x211: ${dType} = getInputValue(batch, channel, depth2, height1, width1);\n var x212: ${dType} = getInputValue(batch, channel, depth2, height1, width2);\n var x221: ${dType} = getInputValue(batch, channel, depth2, height2, width1);\n var x222: ${dType} = getInputValue(batch, channel, depth2, height2, width2);\n var dx1: ${dType} = abs(depth - ${dType}(depth1));\n var dx2: ${dType} = abs(${dType}(depth2) - depth);\n var dy1: ${dType} = abs(height - ${dType}(height1));\n var dy2: ${dType} = abs(${dType}(height2) - height);\n var dz1: ${dType} = abs(width - ${dType}(width1));\n var dz2: ${dType} = abs(${dType}(width2) - width);\n if (depth1 == depth2) {\n dx1 = 0.5;\n dx2 = 0.5;\n }\n if (height1 == height2) {\n dy1 = 0.5;\n dy2 = 0.5;\n }\n if (width1 == width2) {\n dz1 = 0.5;\n dz2 = 0.5;\n }\n return (x111 * dx2 * dy2 * dz2 + x112 * dx2 * dy2 * dz1 + x121 * dx2 * dy1 *dz2 + x122 * dx2 * dy1 * dz1 +\n x211 * dx1 * dy2 * dz2 + x212 * dx1 * dy2 * dz1 + x221 * dx1 * dy1 *dz2 + x222 * dx1 * dy1 * dz1);\n }`;\n };\n\nconst createResizeProgramInfo =\n (inputTensor: TensorView, attributes: ResizeAttributes, opsetVersion: number, scalesInput: readonly number[],\n sizes: readonly number[], roiInput: readonly number[]): ProgramInfo => {\n const inputShape = inputTensor.dims;\n const roi = updateRoI(roiInput, attributes.axes, inputShape.length);\n\n let outputShape = initOutputShape(inputShape, scalesInput, sizes, attributes.axes);\n let scales = scalesInput.slice();\n if (scalesInput.length === 0) {\n scales = inputShape.map((value, index) => value === 0 ? 1.0 : outputShape[index] / value);\n if (attributes.keepAspectRatioPolicy !== 'stretch') {\n outputShape = adjustOutputShape(inputShape, scales, attributes);\n }\n }\n const output = outputVariable('output', inputTensor.dataType, outputShape.length);\n const input = inputVariable('input', inputTensor.dataType, inputShape.length);\n const outputSize = ShapeUtil.size(outputShape);\n const noScale = inputShape.length === outputShape.length && inputShape.every((d, i) => d === outputShape[i]);\n const useExtrapolation = attributes.coordinateTransformMode === 'tf_crop_and_resize';\n const extrapolationValue = attributes.extrapolationValue;\n const dataType = input.type.value;\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${noScale ? '' : `\n ${getOriginalCoordinateFromResizedCoordinate(attributes.coordinateTransformMode, dataType)};\n ${(() => {\n switch (attributes.mode) {\n case 'nearest':\n return `\n ${checkInputIndices(input, inputShape)};\n ${getNearestPixelFromOriginal(attributes.nearestMode, opsetVersion, dataType)};\n ${\n calculateInputIndicesFromOutputIndices(\n input, output, inputShape, outputShape, scales.length, roi.length, useExtrapolation)};\n `;\n case 'linear':\n return `\n ${calculateOriginalIndicesFromOutputIndices(output, inputShape, outputShape, scales.length, roi.length)};\n ${(() => {\n if (inputShape.length === 2 || inputShape.length === 4) {\n return `${bilinearInterpolation(input, output, inputShape, useExtrapolation, extrapolationValue)}`;\n } else if (inputShape.length === 3 || inputShape.length === 5) {\n return `${trilinearInterpolation(input, output, inputShape, useExtrapolation, extrapolationValue)}`;\n } else {\n throw Error('Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.');\n }\n })()};\n `;\n case 'cubic':\n return `\n ${(() => {\n if (inputShape.length === 2 || inputShape.length === 4) {\n return `${\n bicubicInterpolation(\n input, output, inputShape, outputShape, scales, roi, attributes.cubicCoeffA, useExtrapolation,\n attributes.extrapolationValue, attributes.excludeOutside)}`;\n } else {\n throw Error('Cubic mode only supports input dims 2 and 4 are supported in linear mode.');\n }\n })()};\n `;\n default:\n throw Error('Invalid resize mode');\n }\n })()};\n `}\n ${\n shaderHelper.registerUniform('output_size', 'u32')\n .registerUniform('scales', 'f32', scales.length)\n .registerUniform('roi', 'f32', roi.length)\n .declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n ${noScale ? 'output[global_idx] = input[global_idx];' : `\n let output_indices = ${output.offsetToIndices('global_idx')};\n var input_indices: ${input.type.indices};\n ${(() => {\n switch (attributes.mode) {\n case 'nearest':\n return `input_indices = calculateInputIndicesFromOutputIndices(output_indices);\n if (checkInputIndices(input_indices)) {\n output[global_idx] = ${input.getByIndices('input_indices')};\n } else {\n output[global_idx] = ${attributes.extrapolationValue};\n }`;\n case 'linear':\n return `output[global_idx] = ${\n (inputShape.length === 2 || inputShape.length === 4) ? 'bilinearInterpolation' :\n 'trilinearInterpolation'}(output_indices);`;\n case 'cubic':\n return 'output[global_idx] = bicubicInterpolation(output_indices);';\n default:\n throw Error(`Unsupported resize mode: ${attributes.mode}`);\n }\n })()};\n`}\n }`;\n\n return {\n name: 'Resize',\n shaderCache: {\n hint: `${attributes.cacheKey}|${opsetVersion}|${scales.length > 0 ? scales : ''}|${\n sizes.length > 0 ? sizes : ''}|${roi.length > 0 ? roi : ''}|${noScale}|${inputShape}`,\n inputDependencies: ['rank']\n },\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputTensor.dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms: [\n {type: DataType.uint32, data: outputSize}, {type: DataType.float, data: scales},\n {type: DataType.float, data: roi}, ...createTensorShapeVariables(inputShape, outputShape)\n ]\n })\n };\n };\n\nconst getOpsetVersionFromCustomDataBuffer = (context: ComputeContext): number => {\n const customDataBuffer = context.customDataBuffer;\n const customDataBuffer32 = new Uint32Array(customDataBuffer, customDataBuffer.byteOffset, 1);\n const opsetVersion = customDataBuffer32[0];\n return opsetVersion;\n};\n\nexport const resize = (context: ComputeContext, attributes: ResizeAttributes): void => {\n const scales: number[] = [];\n const sizes: number[] = [];\n const roi: number[] = [];\n\n // Note that scales in resize are always f32. roi can be f32 or f16.\n // TODO: Currently this code does not support f16 for roi when passed as optional input.\n\n const opsetVersion = getOpsetVersionFromCustomDataBuffer(context);\n if (attributes.antialias !== 0) {\n throw Error('Only default value (0) for Antialias attribute is supported');\n }\n validateInputs(context.inputs, attributes, opsetVersion, scales, sizes, roi);\n context.compute(\n createResizeProgramInfo(context.inputs[0], attributes, opsetVersion, scales, sizes, roi), {inputs: [0]});\n};\n\nexport const parseResizeAttributes = (attributes: Record): ResizeAttributes => {\n const antialias = attributes.antialias as number;\n const axes = attributes.axes as number[];\n const coordinateTransformMode: CoordinateTransformMode =\n attributes.coordinateTransformMode as CoordinateTransformMode;\n const cubicCoeffA = attributes.cubicCoeffA as number;\n const excludeOutside = attributes.excludeOutside as number !== 0;\n const extrapolationValue = attributes.extrapolationValue as number;\n const keepAspectRatioPolicy: KeepAspectRatioPolicy = attributes.keepAspectRatioPolicy as KeepAspectRatioPolicy;\n const mode: Mode = attributes.mode as Mode;\n // If nearestMode is not specified, use simple mode.\n const nearestMode: NearestMode = (attributes.nearestMode === '' ? 'simple' : attributes.nearestMode) as NearestMode;\n return createAttributeWithCacheKey({\n antialias,\n axes,\n coordinateTransformMode,\n cubicCoeffA,\n excludeOutside,\n extrapolationValue,\n keepAspectRatioPolicy,\n mode,\n nearestMode\n });\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, WORKGROUP_SIZE} from './common';\n\nexport interface RotaryEmbeddingAttributes {\n readonly interleaved: boolean;\n readonly numHeads: number;\n readonly rotaryEmbeddingDim: number;\n readonly scale: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: RotaryEmbeddingAttributes): void => {\n const [input, positionIds, cosCache, sinCache] = inputs;\n const {numHeads, rotaryEmbeddingDim} = attributes;\n\n if (input.dims.length !== 3 && input.dims.length !== 4) {\n throw new Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${input.dims.length}`);\n }\n if (!ShapeUtil.areEqual(positionIds.dims, []) && !ShapeUtil.areEqual(positionIds.dims, [1]) &&\n positionIds.dims.length !== 2) {\n throw new Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${positionIds.dims.length}`);\n }\n if (cosCache.dims.length !== 2) {\n throw new Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${cosCache.dims.length}`);\n }\n if (sinCache.dims.length !== 2) {\n throw new Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${sinCache.dims.length}`);\n }\n if (!ShapeUtil.areEqual(cosCache.dims, sinCache.dims)) {\n throw new Error('Inputs \\'cos_cache\\' and \\'sin_cache\\' are expected to have the same shape');\n }\n\n if (rotaryEmbeddingDim > 0 && numHeads === 0) {\n throw new Error('num_heads must be provided if rotary_embedding_dim is specified');\n }\n\n const batchSize = input.dims[0];\n const sequenceLength = input.dims[input.dims.length - 2];\n const maxSequenceLength = cosCache.dims[0];\n const hiddenSize = ShapeUtil.sizeFromDimension(input.dims, 1) / sequenceLength;\n const headSize = rotaryEmbeddingDim === 0 ? cosCache.dims[1] * 2 : hiddenSize / numHeads;\n if (rotaryEmbeddingDim > headSize) {\n throw new Error('rotary_embedding_dim must be less than or equal to head_size');\n }\n\n if (positionIds.dims.length === 2) {\n if (batchSize !== positionIds.dims[0]) {\n throw new Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${positionIds.dims[0]}`);\n }\n if (sequenceLength !== positionIds.dims[1]) {\n throw new Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${positionIds.dims[1]}`);\n }\n }\n\n if (headSize / 2 !== cosCache.dims[1] && rotaryEmbeddingDim / 2 !== cosCache.dims[1]) {\n throw new Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${\n cosCache.dims[1]}`);\n }\n\n if (sequenceLength > maxSequenceLength) {\n throw new Error('Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported');\n }\n};\n\nconst createRotaryEmbeddingProgramInfo =\n (inputs: readonly TensorView[], attributes: RotaryEmbeddingAttributes): ProgramInfo => {\n const {interleaved, numHeads, rotaryEmbeddingDim, scale} = attributes;\n const batchSize = inputs[0].dims[0];\n const batchStride = ShapeUtil.sizeFromDimension(inputs[0].dims, 1);\n const sequenceLength = inputs[0].dims[inputs[0].dims.length - 2];\n const hiddenSize = batchStride / sequenceLength;\n const halfRotaryEmbeddingDim = inputs[2].dims[1];\n const headSize = rotaryEmbeddingDim === 0 ? halfRotaryEmbeddingDim * 2 : hiddenSize / numHeads;\n\n // Rotary embeddings will be calculated in a pair-wise fashion. In accordance, use the shape\n // [batch size, sequence length, num of heads, num of pairs to rotate + num of dims to copy]\n // to unfold the global index in shader.\n const globalShape =\n new Array(batchSize, sequenceLength, hiddenSize / headSize, headSize - halfRotaryEmbeddingDim);\n const globalStrides = ShapeUtil.computeStrides(globalShape);\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.float, data: scale},\n {type: DataType.uint32, data: globalShape},\n {type: DataType.uint32, data: globalStrides},\n\n // strides for addressing the input/output tensor, in permutated order to align with the unfolded global index,\n // i.e. BSNH\n ...(inputs[0].dims.length === 3 ?\n new Array({type: DataType.uint32, data: [batchStride, hiddenSize, headSize, 1]}) :\n []),\n ...(inputs[0].dims.length === 4 ?\n new Array(\n {type: DataType.uint32, data: [batchStride, headSize, sequenceLength * headSize, 1]}) :\n []),\n\n ...createTensorShapeVariables(inputs[0].dims, inputs[1].dims, inputs[2].dims, inputs[3].dims, inputs[0].dims),\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const input = inputVariable('input', inputs[0].dataType, inputs[0].dims.length);\n const positionIds = inputVariable('position_ids', inputs[1].dataType, inputs[1].dims.length);\n const cosCache = inputVariable('cos_cache', inputs[2].dataType, inputs[2].dims.length);\n const sinCache = inputVariable('sin_cache', inputs[3].dataType, inputs[3].dims.length);\n const output = outputVariable('output', inputs[0].dataType, inputs[0].dims.length);\n\n shaderHelper.registerUniforms([\n {name: 'scale', type: 'f32'},\n {name: 'global_shape', type: 'u32', length: globalShape.length},\n {name: 'global_strides', type: 'u32', length: globalStrides.length},\n {name: 'input_output_strides', type: 'u32', length: globalStrides.length},\n ]);\n\n return `\n ${shaderHelper.declareVariables(input, positionIds, cosCache, sinCache, output)}\n\n ${shaderHelper.mainStart(WORKGROUP_SIZE)}\n let half_rotary_emb_dim = uniforms.${cosCache.name}_shape[1];\n let bsnh = global_idx / uniforms.global_strides % uniforms.global_shape;\n let size = uniforms.global_shape[0] * uniforms.global_strides[0];\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('size')}\n\n if (bsnh[3] < half_rotary_emb_dim) {\n let position_ids_idx =\n ${positionIds.broadcastedIndicesToOffset('bsnh.xy', outputVariable('', positionIds.type.tensor, 2))};\n let position_id =\n u32(${positionIds.getByOffset('position_ids_idx')}) + select(0, bsnh[1], position_ids_idx == 0);\n let i = dot(bsnh, uniforms.input_output_strides) + select(0, bsnh[3], ${interleaved});\n let j = i + select(half_rotary_emb_dim, 1, ${interleaved});\n let re = ${input.getByOffset('i')} * ${cosCache.get('position_id', 'bsnh[3]')} -\n ${input.getByOffset('j')} * ${sinCache.get('position_id', 'bsnh[3]')};\n ${output.setByOffset('i', 're')}\n let im = ${input.getByOffset('i')} * ${sinCache.get('position_id', 'bsnh[3]')} +\n ${input.getByOffset('j')} * ${cosCache.get('position_id', 'bsnh[3]')};\n ${output.setByOffset('j', 'im')}\n } else {\n let k = dot(bsnh, uniforms.input_output_strides) + half_rotary_emb_dim;\n ${output.setByOffset('k', input.getByOffset('k'))}\n }\n }`;\n };\n\n return {\n name: 'RotaryEmbedding',\n shaderCache: {\n hint: createAttributeWithCacheKey({\n interleaved,\n }).cacheKey,\n inputDependencies: ['rank', 'rank', 'rank', 'rank'],\n },\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: inputs[0].dims, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(ShapeUtil.size(globalShape) / WORKGROUP_SIZE)},\n programUniforms,\n }),\n };\n };\n\nexport const rotaryEmbedding = (context: ComputeContext, attributes: RotaryEmbeddingAttributes): void => {\n validateInputs(context.inputs, attributes);\n context.compute(createRotaryEmbeddingProgramInfo(context.inputs, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {castToF32, getMaxComponents, inputVariable, outputVariable, ShaderHelper, sumVector, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\n\nexport interface SkipLayerNormAttributes {\n simplified: boolean;\n epsilon: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length < 3) {\n throw new Error('layerNorm requires at least 3 inputs.');\n }\n\n const input: TensorView = inputs[0];\n const skip: TensorView = inputs[1];\n const gamma: TensorView = inputs[2];\n\n if (input.dataType !== skip.dataType || input.dataType !== gamma.dataType) {\n throw new Error('All inputs must have the same data type');\n }\n\n if (input.dims.length !== 3 && input.dims.length !== 2) {\n throw new Error('Input must be 2D or 3D');\n }\n\n if (skip.dims.length !== 3 && skip.dims.length !== 2) {\n throw new Error('Skip must be 2D or 3D');\n }\n\n const hiddenSize = input.dims[input.dims.length - 1];\n const sequenceLength = input.dims[input.dims.length - 2];\n if (skip.dims[skip.dims.length - 1] !== hiddenSize) {\n throw new Error('Skip must have the same hidden size as input');\n }\n if (skip.dims[skip.dims.length - 2] !== sequenceLength) {\n throw new Error('Skip must have the same sequence length as input');\n }\n\n if (gamma.dims.length !== 1) {\n throw new Error('Gamma must be 1D');\n }\n if (gamma.dims[gamma.dims.length - 1] !== hiddenSize) {\n throw new Error('Gamma must have the same hidden size as input');\n }\n if (inputs.length > 3) {\n const beta: TensorView = inputs[3];\n if (beta.dims.length !== 1) {\n throw new Error('Beta must be 1D');\n }\n if (beta.dims[beta.dims.length - 1] !== hiddenSize) {\n throw new Error('Beta must have the same hidden size as input');\n }\n }\n if (inputs.length > 4) {\n const bias: TensorView = inputs[4];\n if (bias.dims.length !== 1) {\n throw new Error('Bias must be 1D');\n }\n if (bias.dims[bias.dims.length - 1] !== hiddenSize) {\n throw new Error('Bias must have the same hidden size as input');\n }\n }\n};\n\nconst createSkipLayerNormProgramInfo =\n (inputs: readonly TensorView[], attributes: SkipLayerNormAttributes, outputCount: number, isTraining: boolean):\n ProgramInfo => {\n const simplified = attributes.simplified;\n\n const inputShape = inputs[0].dims;\n const inputSize = ShapeUtil.size(inputShape);\n const outputShape = inputShape;\n const outputSize = inputSize;\n const hiddenSize = inputShape.slice(-1)[0];\n const meanInvStdDevDim = isTraining ? inputShape.slice(0, -1).concat(1) : [];\n const hasBetaInput = !simplified && inputs.length > 3;\n const hasBiasInput = inputs.length > 4;\n const hasMeanOutput = isTraining && outputCount > 1;\n const hasInvStdDevOutput = isTraining && outputCount > 2;\n const hasInputSkipBiasSumOutput = outputCount > 3;\n const workgroupSize = 64;\n\n const components = getMaxComponents(hiddenSize);\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize},\n {type: DataType.uint32, data: components},\n {type: DataType.uint32, data: hiddenSize},\n {type: DataType.float, data: attributes.epsilon},\n ];\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const uniformsArray: UniformsArrayType = [\n {name: 'output_size', type: 'u32'},\n {name: 'components', type: 'u32'},\n {name: 'hidden_size', type: 'u32'},\n {name: 'epsilon', type: 'f32'},\n ];\n const variables = [\n inputVariable('x', inputs[0].dataType, inputs[0].dims, components),\n inputVariable('skip', inputs[1].dataType, inputs[1].dims, components),\n inputVariable('gamma', inputs[2].dataType, inputs[2].dims, components),\n ];\n if (hasBetaInput) {\n variables.push(inputVariable('beta', inputs[3].dataType, inputs[3].dims, components));\n }\n if (hasBiasInput) {\n variables.push(inputVariable('bias', inputs[4].dataType, inputs[4].dims, components));\n }\n variables.push(outputVariable('output', inputs[0].dataType, outputShape, components));\n if (hasMeanOutput) {\n variables.push(outputVariable('mean_output', DataType.float, meanInvStdDevDim));\n }\n if (hasInvStdDevOutput) {\n variables.push(outputVariable('inv_std_output', DataType.float, meanInvStdDevDim));\n }\n if (hasInputSkipBiasSumOutput) {\n variables.push(outputVariable('input_skip_bias_sum', inputs[0].dataType, outputShape, components));\n }\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n const vecDataType = tensorTypeToWsglStorageType(DataType.float, components);\n return `\n\n ${shaderHelper.registerUniforms(uniformsArray).declareVariables(...variables)}\n var sum_shared : array<${vecDataType}, ${workgroupSize}>;\n var sum_squared_shared : array<${vecDataType}, ${workgroupSize}>;\n\n ${shaderHelper.mainStart([\n workgroupSize, 1, 1\n ])}\n let ix = local_id.x;\n let iy = global_id.x / ${workgroupSize};\n\n let hidden_size_vectorized: u32 = uniforms.hidden_size / uniforms.components;\n var stride = hidden_size_vectorized / ${workgroupSize};\n let offset = ix * stride + iy * hidden_size_vectorized;\n let offset1d = stride * ix;\n if (ix == ${workgroupSize - 1}) {\n stride = hidden_size_vectorized - stride * ix;\n }\n for (var i: u32 = 0; i < stride; i++) {\n let skip_value = skip[offset + i];\n let bias_value = ${hasBiasInput ? 'bias[offset1d + i]' : dataType + '(0.0)'};\n let input_value = x[offset + i];\n let value = input_value + skip_value + bias_value;\n ${hasInputSkipBiasSumOutput ? 'input_skip_bias_sum[offset + i] = value;' : ''}\n output[offset + i] = value;\n let f32_value = ${castToF32(dataType, components, 'value')};\n sum_shared[ix] += f32_value;\n sum_squared_shared[ix] += f32_value * f32_value;\n }\n workgroupBarrier();\n\n var reduce_size : u32 = ${workgroupSize};\n for (var curr_size = reduce_size >> 1; curr_size > 0; curr_size = reduce_size >> 1) {\n reduce_size = curr_size + (reduce_size & 1);\n if (ix < curr_size) {\n sum_shared[ix] += sum_shared[ix + reduce_size];\n sum_squared_shared[ix] += sum_squared_shared[ix + reduce_size];\n }\n workgroupBarrier();\n }\n\n let sum = sum_shared[0];\n let square_sum = sum_squared_shared[0];\n let mean = ${sumVector('sum', components)} / f32(uniforms.hidden_size);\n let inv_std_dev = inverseSqrt(${sumVector('square_sum', components)} / f32(uniforms.hidden_size) ${\n simplified ? '' : '- mean * mean'} + uniforms.epsilon);\n ${hasMeanOutput ? 'mean_output[global_idx] = mean;' : ''}\n ${hasInvStdDevOutput ? 'inv_std_output[global_idx] = inv_std_dev;' : ''}\n\n for (var i: u32 = 0; i < stride; i++) {\n output[offset + i] = (output[offset + i] ${simplified ? '' : `- ${dataType}(mean)`}) *\n ${dataType}(inv_std_dev) * gamma[offset1d + i]\n ${hasBetaInput ? '+ beta[offset1d + i]' : ''};\n }\n }`;\n };\n const outputs = [{dims: outputShape, dataType: inputs[0].dataType}];\n if (outputCount > 1) {\n outputs.push({dims: meanInvStdDevDim, dataType: DataType.float});\n }\n if (outputCount > 2) {\n outputs.push({dims: meanInvStdDevDim, dataType: DataType.float});\n }\n if (outputCount > 3) {\n outputs.push({dims: inputShape, dataType: inputs[0].dataType});\n }\n return {\n name: 'SkipLayerNormalization',\n shaderCache: {\n hint: `${components};${hasMeanOutput};${hasInvStdDevOutput};${hasInputSkipBiasSumOutput}`,\n inputDependencies: inputs.map((_input, _index) => 'type')\n },\n getShaderSource,\n getRunData: () => ({\n outputs,\n dispatchGroup: {\n x: Math.ceil(outputSize / hiddenSize),\n },\n programUniforms\n }),\n };\n };\n\nexport const skipLayerNorm = (context: ComputeContext, attributes: SkipLayerNormAttributes): void => {\n // TODO: initialize isTraining from ComputeContext\n const isTraining = false;\n validateInputs(context.inputs);\n // Mean and InvStdDev are only used in training mode and are not required for inference.\n // They are added here for completeness only.\n const outputs = [0];\n if (context.outputCount > 1) {\n outputs.push(isTraining ? 1 : -3);\n }\n if (context.outputCount > 2) {\n outputs.push(isTraining ? 2 : -3);\n }\n if (context.outputCount > 3) {\n outputs.push(3);\n }\n context.compute(\n createSkipLayerNormProgramInfo(context.inputs, attributes, context.outputCount, isTraining), {outputs});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform, TensorInfo} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\n\nexport interface SliceAttributes extends AttributeWithCacheKey {\n readonly starts: number[];\n readonly ends: number[];\n readonly axes: number[];\n}\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: SliceAttributes): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('too few inputs');\n }\n if (attributes.axes.length !== 0) {\n if (attributes.axes.length !== attributes.starts.length || attributes.axes.length !== attributes.ends.length) {\n throw new Error('axes, starts and ends must have the same length');\n }\n } else if (attributes.starts.length !== attributes.ends.length) {\n throw new Error('starts and ends must have the same length');\n }\n inputs.slice(1).forEach((_, idx) => {\n if (inputs[idx + 1].dataType !== DataType.int32 && inputs[idx + 1].dataType !== DataType.int64) {\n throw new Error(`Input ${idx} must be an array of int32 or int64`);\n }\n });\n};\n\nconst readInput = (inputs: readonly TensorView[], idx: number): number[] => {\n const input: number[] = [];\n if (inputs.length > idx) {\n if (inputs[idx].dataType === DataType.int64) {\n inputs[idx].getBigInt64Array().forEach(v => input.push(Number(v)));\n } else if (inputs[idx].dataType === DataType.int32) {\n inputs[idx].getInt32Array().forEach(v => input.push(Number(v)));\n } else {\n throw new Error(`Input ${idx} must be an array of int32 or int64`);\n }\n }\n return input;\n};\n\nconst createSliceAttributesFromInputs =\n (inputs: readonly TensorView[], attributes: SliceAttributes): SliceAttributes => {\n if (inputs.length > 1) {\n const starts: number[] = readInput(inputs, 1);\n const ends: number[] = readInput(inputs, 2);\n let axes: number[] = readInput(inputs, 3);\n if (axes.length === 0) {\n axes = [...Array(inputs[0].dims.length).keys()];\n }\n return createAttributeWithCacheKey({starts, ends, axes});\n } else {\n return attributes;\n }\n };\n\nconst fixStartEndValues =\n (value: number, index: number, inputShape: readonly number[], axes: readonly number[], steps: readonly number[]):\n number => {\n let newValue = value;\n if (value < 0) {\n newValue += inputShape[axes[index]];\n }\n if (steps[index] < 0) {\n return Math.max(0, Math.min(newValue, inputShape[axes[index]] - 1));\n } else {\n return Math.max(0, Math.min(newValue, inputShape[axes[index]]));\n }\n };\n\nconst calculateInputIndicesImpl =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[]): string =>\n `fn calculateInputIndices(output_indices: ${output.type.indices}) -> ${input.type.indices} {\n var input_indices: ${input.type.indices};\n var carry = 0u;\n for (var i = ${inputShape.length}; i >= 0; i--) {\n let input_shape_i = ${getElementAt('uniforms.input_shape', 'i', inputShape.length)};\n let steps_i = ${getElementAt('uniforms.steps', 'i', inputShape.length)};\n let signs_i = ${getElementAt('uniforms.signs', 'i', inputShape.length)};\n let starts_i = ${getElementAt('uniforms.starts', 'i', inputShape.length)};\n var output_index = ${output.indicesGet('output_indices', 'i')};\n var input_index = output_index * steps_i + starts_i + carry;\n carry = input_index / input_shape_i;\n input_index = input_index % input_shape_i;\n if (signs_i < 0) {\n input_index = input_shape_i - input_index - 1u + starts_i;\n }\n ${input.indicesSet('input_indices', 'i', 'input_index')};\n }\n return input_indices;\n }`;\n\nconst createSliceProgramInfo = (inputs: readonly TensorView[], attributes: SliceAttributes): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const inputSize = ShapeUtil.size(inputShape);\n const axes = (attributes.axes.length > 0) ? ShapeUtil.normalizeAxes(attributes.axes, inputShape.length) :\n [...Array(inputShape.length).keys()];\n let steps = readInput(inputs, 4);\n steps.forEach((step) => step !== 0 || (() => {\n throw new Error('step cannot be 0');\n }));\n if (steps.length === 0) {\n steps = Array(axes.length).fill(1);\n }\n const starts = attributes.starts.map((start, i) => fixStartEndValues(start, i, inputShape, axes, steps));\n\n const ends = attributes.ends.map((end, i) => fixStartEndValues(end, i, inputShape, axes, steps));\n\n if (axes.length !== starts.length || axes.length !== ends.length) {\n throw new Error('start, ends and axes should have the same number of elements');\n }\n\n if (axes.length !== inputShape.length) {\n for (let i = 0; i < inputShape.length; ++i) {\n if (!axes.includes(i)) {\n starts.splice(i, 0, 0);\n ends.splice(i, 0, inputShape[i]);\n steps.splice(i, 0, 1);\n }\n }\n }\n const signs = steps.map(step => Math.sign(step));\n // Convert negative steps to positive steps and reverse starts and ends\n steps.forEach((step, i, array) => {\n if (step < 0) {\n const numSteps = (ends[i] - starts[i]) / step;\n const newEnd = starts[i];\n const newStart = newEnd + numSteps * steps[i];\n starts[i] = newStart;\n ends[i] = newEnd;\n array[i] = -step;\n }\n });\n // Output rank is expected to be less than or equal to the input rank.\n const outputShape = inputShape.slice(0);\n axes.forEach((axis, _) => {\n outputShape[axis] = Math.ceil((ends[axis] - starts[axis]) / steps[axis]);\n });\n const outputTensorInfo: TensorInfo = {dims: outputShape, dataType: inputs[0].dataType};\n\n const output = outputVariable('output', inputs[0].dataType, outputShape.length);\n const input = inputVariable('input', inputs[0].dataType, inputs[0].dims.length);\n const outputSize = ShapeUtil.size(outputShape);\n const uniforms: UniformsArrayType = [\n {name: 'outputSize', type: 'u32'}, {name: 'starts', type: 'u32', length: starts.length},\n {name: 'signs', type: 'i32', length: signs.length}, {name: 'steps', type: 'u32', length: steps.length}\n ];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: starts},\n {type: DataType.int32, data: signs}, {type: DataType.uint32, data: steps},\n ...createTensorShapeVariables(inputs[0].dims, outputShape)\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(input, output)}\n ${calculateInputIndicesImpl(input, output, inputShape)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n let output_indices = ${output.offsetToIndices('global_idx')};\n let input_indices = calculateInputIndices(output_indices);\n ${output.setByOffset('global_idx', input.getByIndices('input_indices'))}\n }`;\n return {\n name: 'Slice',\n shaderCache: {hint: `${signs.length}_${starts.length}_${steps.length}`, inputDependencies: ['rank']},\n getShaderSource,\n getRunData: () => ({\n outputs: [outputTensorInfo],\n dispatchGroup: {x: Math.ceil(inputSize / 64 /* workgroup size */)},\n programUniforms\n })\n };\n};\n\nexport const slice = (context: ComputeContext, attributes: SliceAttributes): void => {\n validateInputs(context.inputs, attributes);\n const updatedAttributes = createSliceAttributesFromInputs(context.inputs, attributes);\n context.compute(createSliceProgramInfo(context.inputs, updatedAttributes), {inputs: [0]});\n // if (ShapeUtil.size(program.outputs[0].dims) > 0) {\n // context.compute(programInfoLoader, {inputs: [0]});\n // } else {\n // // TODO: support empty output\n // throw new Error('slice: output size is 0');\n // }\n};\n\nexport const parseSliceAttributes = (attributes: Record): SliceAttributes => {\n const starts = attributes.starts as number[];\n const ends = attributes.ends as number[];\n const axes = attributes.axes as number[];\n return createAttributeWithCacheKey({starts, ends, axes});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// TODO: this is the same naive implementation we use for reduce that has\n// performance limitations when the reduced axis is long. Need to add\n// a optimized codepath for this.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {getMaxComponents, inputVariable, outputVariable, ShaderHelper, sumVector, tensorTypeToWsglStorageType} from './common';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Softmax op requires 1 input.');\n }\n};\n\nexport interface SoftmaxAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n}\n\nconst createSoftmaxProgramInfo = (input: TensorView, attributes: SoftmaxAttributes): ProgramInfo => {\n const shape = input.dims;\n const outputSize = ShapeUtil.size(shape);\n const WG = 64;\n let axis = attributes.axis;\n if (axis < 0) {\n axis = shape.length + axis;\n }\n if (axis < shape.length - 1) {\n throw new Error('softmax only supports last axis for now.');\n }\n\n const cols = shape[axis];\n const rows = outputSize / cols;\n const components = getMaxComponents(cols);\n const packedCols = cols / components;\n\n const maxVector = (name: string, components: number) => {\n if (components === 4) {\n return `max(max(${name}.x, ${name}.y), max(${name}.z, ${name}.w))`;\n } else if (components === 2) {\n return `max(${name}.x, ${name}.y)`;\n } else if (components === 3) {\n return `max(max(${name}.x, ${name}.y), ${name}.z)`;\n }\n\n return name;\n };\n const x = inputVariable('x', input.dataType, input.dims, components);\n const output = outputVariable('result', input.dataType, input.dims, components);\n const valueType = x.type.value;\n // 6.2.4 in wgsl spec\n const threadMaxDecl = tensorTypeToWsglStorageType(input.dataType) === 'f32' ?\n `var threadMax = ${valueType}(-3.402823e+38f);` :\n `var threadMax = ${valueType}(-65504.0h);`;\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n var rowMaxShared : ${valueType};\n var rowSumShared : ${valueType};\n var threadShared : array<${valueType}, ${WG}>;\n\n fn getValue(row: i32, col: i32, row_stride: i32) -> ${valueType} {\n let index = row * row_stride + col;\n return x[index];\n }\n\n fn setValue(row: i32, col: i32, row_stride: i32, value: ${valueType}) {\n let index = row * row_stride + col;\n result[index] = value;\n }\n ${shaderHelper.registerUniform('packedCols', 'i32').declareVariables(x, output)}\n ${shaderHelper.mainStart()}\n let gindex = i32(global_idx);\n let lindex = i32(local_idx);\n const wg = ${WG};\n let row = gindex / wg;\n let cols = uniforms.packedCols;\n let row_stride : i32 = uniforms.packedCols;\n\n // find the rows max\n ${threadMaxDecl}\n for (var col = lindex; col < cols; col += wg) {\n let value = getValue(row, col, row_stride);\n threadMax = max(threadMax, value);\n }\n if (lindex < cols) {\n threadShared[lindex] = threadMax;\n }\n workgroupBarrier();\n\n var reduceSize = min(cols, wg);\n for (var currSize = reduceSize >> 1; currSize > 0; currSize = reduceSize >> 1) {\n reduceSize = currSize + (reduceSize & 1);\n if (lindex < currSize) {\n threadShared[lindex] = max(threadShared[lindex], threadShared[lindex + reduceSize]);\n }\n workgroupBarrier();\n }\n if (lindex == 0) {\n rowMaxShared = ${valueType}(${maxVector('threadShared[0]', components)});\n }\n workgroupBarrier();\n\n // find the rows sum\n var threadSum = ${valueType}(0.0);\n for (var col = lindex; col < cols; col += wg) {\n let subExp = exp(getValue(row, col, row_stride) - rowMaxShared);\n threadSum += subExp;\n }\n threadShared[lindex] = threadSum;\n workgroupBarrier();\n\n for (var currSize = wg >> 1; currSize > 0; currSize = currSize >> 1) {\n if (lindex < currSize) {\n threadShared[lindex] = threadShared[lindex] + threadShared[lindex + currSize];\n }\n workgroupBarrier();\n }\n if (lindex == 0) {\n rowSumShared = ${valueType}(${sumVector('threadShared[0]', components)});\n }\n workgroupBarrier();\n\n // calculate final value for each element in the row\n for (var col = lindex; col < cols; col += wg) {\n let value = exp(getValue(row, col, row_stride) - rowMaxShared) / rowSumShared;\n setValue(row, col, row_stride, value);\n }\n }`;\n return {\n name: 'Softmax',\n shaderCache: {hint: `${components}`, inputDependencies: ['type']},\n getRunData: () => ({\n outputs: [{dims: shape, dataType: input.dataType}],\n dispatchGroup: {x: rows},\n programUniforms: [{type: DataType.int32, data: packedCols}]\n }),\n getShaderSource,\n };\n};\n\nexport const softmax = (context: ComputeContext, attributes: SoftmaxAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createSoftmaxProgramInfo(context.inputs[0], attributes));\n};\n\nexport const parseSoftmaxAttributes = (attributes: Record): SoftmaxAttributes =>\n createAttributeWithCacheKey({axis: attributes.axis as number});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform, TensorInfo} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface SplitAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n readonly numOutputs: number;\n readonly splitSizes: number[];\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('too few inputs');\n }\n};\n\nconst createSplitAttributesFromInputs =\n (inputs: readonly TensorView[], attributes: SplitAttributes): SplitAttributes => {\n const splitSizes: number[] = [];\n let numOutputs: number = attributes.numOutputs;\n if (inputs[1].dims[0] > 0) {\n inputs[1].getBigInt64Array().forEach(v => splitSizes.push(Number(v)));\n numOutputs = splitSizes.length;\n }\n return createAttributeWithCacheKey({numOutputs, axis: attributes.axis, splitSizes});\n };\n\nconst calculateOutputIndexImpl = (numberOfTensors: number): string => `\nfn calculateOutputIndex(index: u32) -> u32 {\n for (var i: u32 = 0u; i < ${numberOfTensors}u; i += 1u ) {\n if (index < ${getElementAt('uniforms.size_in_split_axis', 'i', numberOfTensors)}) {\n return i;\n }\n }\n return ${numberOfTensors}u;\n}`;\nconst writeBufferDataImpl = (outputs: readonly IndicesHelper[]) => {\n const numberOfTensors = outputs.length;\n const codeLines: string[] = [];\n for (let i = 0; i < numberOfTensors; ++i) {\n const returnSnippet = outputs[i].setByIndices('indices', 'input[global_idx]');\n if (numberOfTensors === 1) {\n codeLines.push(returnSnippet);\n } else if (i === 0) {\n codeLines.push(`if (output_number == ${i}u) { ${returnSnippet} }`);\n } else if (i === numberOfTensors - 1) {\n codeLines.push(`else { ${returnSnippet} }`);\n } else {\n codeLines.push(`else if (output_number == ${i}) { ${returnSnippet} }`);\n }\n }\n return `\n fn writeBufferData(output_number: u32, indices: ${outputs[0].type.indices}, global_idx: u32) {\n ${codeLines.join('\\n')}\n }`;\n};\n\nconst createSplitProgramInfo = (inputs: readonly TensorView[], attributes: SplitAttributes): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const inputSize = ShapeUtil.size(inputShape);\n const dataType = inputs[0].dataType;\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputShape.length);\n const outputs = new Array(attributes.numOutputs);\n const input = inputVariable('input', dataType, inputShape.length);\n const sizeInSplitAxis = new Array(attributes.numOutputs);\n const outputsTensorInfo: TensorInfo[] = [];\n const outputShapes: number[][] = [];\n let previousSum = 0;\n const programUniforms: ProgramUniform[] = [{type: DataType.uint32, data: inputSize}];\n for (let i = 0; i < attributes.numOutputs; i++) {\n previousSum += attributes.splitSizes[i];\n sizeInSplitAxis[i] = previousSum;\n const outputShape = inputShape.slice();\n outputShape[attributes.axis] = attributes.splitSizes[i];\n outputShapes.push(outputShape);\n outputs[i] = outputVariable(`output${i}`, dataType, outputShape.length);\n outputsTensorInfo.push({dims: outputShapes[i], dataType: inputs[0].dataType});\n }\n programUniforms.push(\n {type: DataType.uint32, data: sizeInSplitAxis}, ...createTensorShapeVariables(inputShape, ...outputShapes));\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${\n shaderHelper.registerUniform('input_size', 'u32')\n .registerUniform('size_in_split_axis', 'u32', sizeInSplitAxis.length)\n .declareVariables(input, ...outputs)}\n ${calculateOutputIndexImpl(sizeInSplitAxis.length)}\n ${writeBufferDataImpl(outputs)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.input_size')}\n\n var indices = ${input.offsetToIndices('global_idx')};\n var index = ${input.indicesGet('indices', axis)};\n let output_number = calculateOutputIndex(index);\n if (output_number != 0) {\n index -= ${getElementAt('uniforms.size_in_split_axis', 'output_number - 1u', sizeInSplitAxis.length)};\n ${input.indicesSet('indices', axis, 'index')};\n }\n writeBufferData(output_number, indices, global_idx);\n }`;\n return {\n name: 'Split',\n shaderCache: {hint: attributes.cacheKey, inputDependencies: ['rank']},\n getShaderSource,\n getRunData: () => ({\n outputs: outputsTensorInfo,\n dispatchGroup: {x: Math.ceil(inputSize / 64 /* workgroup size */)},\n programUniforms\n })\n };\n};\n\nexport const split = (context: ComputeContext, attributes: SplitAttributes): void => {\n validateInputs(context.inputs);\n const updatedAttributes =\n context.inputs.length === 1 ? attributes : createSplitAttributesFromInputs(context.inputs, attributes);\n context.compute(createSplitProgramInfo(context.inputs, updatedAttributes), {inputs: [0]});\n};\n\nexport const parseSplitAttributes = (attributes: Record): SplitAttributes => {\n const axis = attributes.axis as number;\n const splitSizes: number[] = attributes.splitSizes as number[];\n const numOutputs = attributes.numOutputs as number < 0 ? splitSizes.length : attributes.numOutputs as number;\n if (numOutputs !== splitSizes.length) {\n throw new Error('numOutputs and splitSizes lengh must be equal');\n }\n return createAttributeWithCacheKey({axis, numOutputs, splitSizes});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {BroadcastUtil, ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nconst createWhereOpProgramShader =\n (shaderHelper: ShaderHelper, inputs: readonly TensorView[], dimsOutput: readonly number[], isBroadcast: boolean,\n typeOutput: number) => {\n const output = outputVariable('output_data', typeOutput, dimsOutput.length, 4);\n const a = inputVariable('a_data', inputs[1].dataType, inputs[1].dims.length, 4);\n const b = inputVariable('b_data', inputs[2].dataType, inputs[2].dims.length, 4);\n const c = inputVariable('c_data', inputs[0].dataType, inputs[0].dims.length, 4);\n\n let assignment: string;\n const expression = (a: string, b: string, c: string) => `select(${b}, ${a}, ${c})`;\n if (!isBroadcast) {\n assignment = output.setByOffset(\n 'global_idx',\n expression(a.getByOffset('global_idx'), b.getByOffset('global_idx'), c.getByOffset('global_idx')));\n } else {\n const singleAssignment = (resStr: string, x: number, typeCast = '') => {\n const expressionA = `a_data[index_a${x}][component_a${x}]`;\n const expressionB = `b_data[index_b${x}][component_b${x}]`;\n // eslint-disable-next-line no-bitwise\n const expressionC = `bool(c_data[index_c${x}] & (0xffu << (component_c${x} * 8)))`;\n return `\n let output_indices${x} = ${output.offsetToIndices(`global_idx * 4u + ${x}u`)};\n let offset_a${x} = ${a.broadcastedIndicesToOffset(`output_indices${x}`, output)};\n let offset_b${x} = ${b.broadcastedIndicesToOffset(`output_indices${x}`, output)};\n let offset_c${x} = ${c.broadcastedIndicesToOffset(`output_indices${x}`, output)};\n let index_a${x} = offset_a${x} / 4u;\n let index_b${x} = offset_b${x} / 4u;\n let index_c${x} = offset_c${x} / 4u;\n let component_a${x} = offset_a${x} % 4u;\n let component_b${x} = offset_b${x} % 4u;\n let component_c${x} = offset_c${x} % 4u;\n ${resStr}[${x}] = ${typeCast}(${expression(expressionA, expressionB, expressionC)});\n `;\n };\n if (typeOutput === DataType.bool) {\n assignment = `\n var data = vec4(0);\n ${singleAssignment('data', 0, 'u32')}\n ${singleAssignment('data', 1, 'u32')}\n ${singleAssignment('data', 2, 'u32')}\n ${singleAssignment('data', 3, 'u32')}\n output_data[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`;\n } else {\n assignment = `\n ${singleAssignment('output_data[global_idx]', 0)}\n ${singleAssignment('output_data[global_idx]', 1)}\n ${singleAssignment('output_data[global_idx]', 2)}\n ${singleAssignment('output_data[global_idx]', 3)}\n `;\n }\n }\n\n return `\n ${shaderHelper.registerUniform('vec_size', 'u32').declareVariables(c, a, b, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.vec_size')}\n ${assignment}\n }`;\n };\n\nconst createWhereOpProgramInfo = (inputs: readonly TensorView[]): ProgramInfo => {\n const dimsA = inputs[1].dims;\n const dimsB = inputs[2].dims;\n const dimsC = inputs[0].dims;\n const outputDataType = inputs[1].dataType;\n\n const isBroadcast = !(ShapeUtil.areEqual(dimsA, dimsB) && ShapeUtil.areEqual(dimsB, dimsC));\n let outputShape = dimsA;\n let outputSize = ShapeUtil.size(dimsA);\n // TODO: deal with zero-sized tensors (eg. dims=[1,0])\n\n if (isBroadcast) {\n const calculatedShape = BroadcastUtil.calcShape(BroadcastUtil.calcShape(dimsA, dimsB, false)!, dimsC, false);\n if (!calculatedShape) {\n throw new Error('Can\\'t perform where op on the given tensors');\n }\n outputShape = calculatedShape;\n outputSize = ShapeUtil.size(outputShape);\n }\n\n const vecSize = Math.ceil(outputSize / 4);\n\n return {\n name: 'Where',\n shaderCache: {inputDependencies: ['rank', 'rank', 'rank']},\n getShaderSource: (shaderHelper) =>\n createWhereOpProgramShader(shaderHelper, inputs, outputShape, isBroadcast, outputDataType),\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: outputDataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */ / 4 /* vec size */)},\n programUniforms:\n [{type: DataType.uint32, data: vecSize}, ...createTensorShapeVariables(dimsC, dimsA, dimsB, outputShape)],\n }),\n };\n};\n\nexport const where = (context: ComputeContext): void => {\n context.compute(createWhereOpProgramInfo(context.inputs));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {argMax, argMin, parseArgMinMaxAttributes} from './ops/argminmax';\nimport {attention} from './ops/attention';\nimport {batchNorm} from './ops/batch-norm';\nimport {biasAdd} from './ops/bias-add';\nimport {biasSplitGelu} from './ops/bias-split-gelu';\nimport * as binaryOps from './ops/binary-op';\nimport {concat, parseConcatAttributes} from './ops/concat';\nimport {conv, parseConvAttributes} from './ops/conv';\nimport {convTranspose, parseConvTransposeAttributes} from './ops/conv-transpose';\nimport {cumsum, parseCumSumAttributes} from './ops/cumsum';\nimport {depthToSpace, parseDepthToSpaceAttributes} from './ops/depth-to-space';\nimport {einsum, parseEinsumAttributes} from './ops/einsum';\nimport {expand} from './ops/expand';\nimport {fastGelu} from './ops/fast-gelu';\nimport {gather, parseGatherAttributes} from './ops/gather';\nimport {gatherElements, parseGatherElementsAttributes} from './ops/gather-elements';\nimport {gemm, parseGemmAttributes} from './ops/gemm';\nimport {groupQueryAttention, parseGroupQueryAttentionAttributes} from './ops/group-query-attention';\nimport {instanceNorm} from './ops/instance-norm';\nimport {layerNorm} from './ops/layer-norm';\nimport {matMul} from './ops/matmul';\nimport {matMulNBits, parseMatMulNBitsAttributes} from './ops/matmulnbits';\nimport {multiHeadAttention, parseMultiHeadAttentionAttributes} from './ops/multihead-attention';\nimport {pad} from './ops/pad';\nimport * as pool from './ops/pool';\nimport {range} from './ops/range';\nimport {reduceL1, reduceL2, reduceLogSum, reduceLogSumExp, reduceMax, reduceMean, reduceMin, reduceProd, reduceSum, reduceSumSquare} from './ops/reduce';\nimport {parseResizeAttributes, resize} from './ops/resize';\nimport {rotaryEmbedding} from './ops/rotary-embedding';\nimport {skipLayerNorm} from './ops/skip-layer-norm';\nimport {parseSliceAttributes, slice} from './ops/slice';\nimport {parseSoftmaxAttributes, softmax} from './ops/softmax';\nimport {parseSplitAttributes, split} from './ops/split';\nimport {tile} from './ops/tile';\nimport {parseTransposeAttributes, transpose} from './ops/transpose';\nimport * as unaryOps from './ops/unary-op';\nimport {where} from './ops/where';\nimport {ComputeContext} from './types';\n\nexport type RunFunction = (context: ComputeContext, attribute?: unknown) => void;\nexport type ParseAttributeFunction = (attributeRaw: unknown) => unknown;\nexport type OperatorImplementation = [RunFunction]|[RunFunction, ParseAttributeFunction];\n\nexport const WEBGPU_OP_RESOLVE_RULES: Map = new Map([\n ['Abs', [unaryOps.abs]],\n ['Acos', [unaryOps.acos]],\n ['Acosh', [unaryOps.acosh]],\n ['Add', [binaryOps.add]],\n ['ArgMax', [argMax, parseArgMinMaxAttributes]],\n ['ArgMin', [argMin, parseArgMinMaxAttributes]],\n ['Asin', [unaryOps.asin]],\n ['Asinh', [unaryOps.asinh]],\n ['Atan', [unaryOps.atan]],\n ['Atanh', [unaryOps.atanh]],\n ['Attention', [attention]],\n // TODO: support new attributes for AveragePool-10\n ['AveragePool', [pool.averagePool, pool.parseAveragePoolAttributes]],\n ['BatchNormalization', [batchNorm]],\n ['BiasAdd', [biasAdd]],\n ['BiasSplitGelu', [biasSplitGelu]],\n ['Cast', [unaryOps.cast, unaryOps.parseCastAttributes]],\n ['Ceil', [unaryOps.ceil]],\n ['Clip', [unaryOps.clip]],\n ['Concat', [concat, parseConcatAttributes]],\n ['Conv', [conv, parseConvAttributes]],\n ['ConvTranspose', [convTranspose, parseConvTransposeAttributes]],\n ['Cos', [unaryOps.cos]],\n ['Cosh', [unaryOps.cosh]],\n ['CumSum', [cumsum, parseCumSumAttributes]],\n ['DepthToSpace', [depthToSpace, parseDepthToSpaceAttributes]],\n ['Div', [binaryOps.div]],\n ['Einsum', [einsum, parseEinsumAttributes]],\n ['Elu', [unaryOps.elu, unaryOps.parseAlphaAttributes]],\n ['Equal', [binaryOps.equal]],\n ['Erf', [unaryOps.erf]],\n ['Exp', [unaryOps.exp]],\n ['Expand', [expand]],\n ['FastGelu', [fastGelu]],\n ['Floor', [unaryOps.floor]],\n ['FusedConv', [conv, parseConvAttributes]],\n ['Gather', [gather, parseGatherAttributes]],\n ['GatherElements', [gatherElements, parseGatherElementsAttributes]],\n ['Gelu', [unaryOps.gelu]],\n ['Gemm', [gemm, parseGemmAttributes]],\n ['GlobalAveragePool', [pool.globalAveragePool, pool.parseGlobalAveragePoolAttributes]],\n ['GlobalMaxPool', [pool.globalMaxPool, pool.parseGlobalMaxPoolAttributes]],\n ['Greater', [binaryOps.greater]],\n ['GreaterOrEqual', [binaryOps.greaterOrEqual]],\n ['GroupQueryAttention', [groupQueryAttention, parseGroupQueryAttentionAttributes]],\n ['HardSigmoid', [unaryOps.hardSigmoid, unaryOps.parseHardSigmoidAttributes]],\n ['InstanceNormalization', [instanceNorm]],\n ['LayerNormalization', [layerNorm]],\n ['LeakyRelu', [unaryOps.leakyRelu, unaryOps.parseAlphaAttributes]],\n ['Less', [binaryOps.less]],\n ['LessOrEqual', [binaryOps.lessOrEqual]],\n ['Log', [unaryOps.log]],\n ['MatMul', [matMul]],\n ['MatMulNBits', [matMulNBits, parseMatMulNBitsAttributes]],\n // TODO: support new attributes for MaxPool-8 and MaxPool-10\n ['MaxPool', [pool.maxPool, pool.parseMaxPoolAttributes]],\n ['Mul', [binaryOps.mul]],\n ['MultiHeadAttention', [multiHeadAttention, parseMultiHeadAttentionAttributes]],\n ['Neg', [unaryOps.neg]],\n ['Not', [unaryOps.not]],\n ['Pad', [pad]],\n ['Pow', [binaryOps.pow]],\n ['QuickGelu', [unaryOps.quickgelu, unaryOps.parseAlphaAttributes]],\n ['Range', [range]],\n ['Reciprocal', [unaryOps.reciprocal]],\n ['ReduceMin', [reduceMin]],\n ['ReduceMean', [reduceMean]],\n ['ReduceMax', [reduceMax]],\n ['ReduceSum', [reduceSum]],\n ['ReduceProd', [reduceProd]],\n ['ReduceL1', [reduceL1]],\n ['ReduceL2', [reduceL2]],\n ['ReduceLogSum', [reduceLogSum]],\n ['ReduceLogSumExp', [reduceLogSumExp]],\n ['ReduceSumSquare', [reduceSumSquare]],\n ['Relu', [unaryOps.relu]],\n ['Resize', [resize, parseResizeAttributes]],\n ['RotaryEmbedding', [rotaryEmbedding]],\n ['Sigmoid', [unaryOps.sigmoid]],\n ['Sin', [unaryOps.sin]],\n ['Sinh', [unaryOps.sinh]],\n ['Slice', [slice, parseSliceAttributes]],\n ['SkipLayerNormalization', [skipLayerNorm]],\n ['Split', [split, parseSplitAttributes]],\n ['Sqrt', [unaryOps.sqrt]],\n ['Softmax', [softmax, parseSoftmaxAttributes]],\n ['Sub', [binaryOps.sub]],\n ['Tan', [unaryOps.tan]],\n ['Tanh', [unaryOps.tanh]],\n ['ThresholdedRelu', [unaryOps.thresholdedRelu, unaryOps.parseAlphaAttributes]],\n ['Tile', [tile]],\n ['Transpose', [transpose, parseTransposeAttributes]],\n ['Where', [where]],\n]);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TRACE_FUNC_BEGIN, TRACE_FUNC_END} from 'onnxruntime-common';\n\nimport {WebGpuBackend} from '../backend-webgpu';\nimport {LOG_DEBUG} from '../log';\n\nimport {createShaderHelper} from './ops/common';\nimport {Artifact, GpuData, ProgramInfo} from './types';\n\n/**\n * ProgramManager is the main class behind running computations\n * It builds ProgramInfo's into Artifacts\n * It compiles given ProgramInfo's into WebGL Prorams (cached as Artifacts)\n * Uses the artifact to run the computation by calling Draw on\n * the WebGL drawing buffer\n * ProgramManager automatically maps (binds) input variables to their\n * corresponding Location's in the binary program\n */\nexport class ProgramManager {\n repo: Map; // this should be per-session object\n attributesBound: boolean;\n\n constructor(private backend: WebGpuBackend) {\n this.repo = new Map();\n this.attributesBound = false;\n }\n getArtifact(key: unknown): Artifact|undefined {\n return this.repo.get(key);\n }\n setArtifact(key: unknown, artifact: Artifact): void {\n this.repo.set(key, artifact);\n }\n run(buildArtifact: Artifact, inputs: GpuData[], outputs: GpuData[], dispatchGroup: [number, number, number],\n uniformBufferBinding: GPUBindingResource|undefined): void {\n TRACE_FUNC_BEGIN(buildArtifact.programInfo.name);\n const device = this.backend.device;\n const computePassEncoder = this.backend.getComputePassEncoder();\n this.backend.writeTimestamp(this.backend.pendingDispatchNumber * 2);\n const entries = [];\n for (const input of inputs) {\n entries.push({binding: entries.length, resource: {buffer: input.buffer}});\n }\n for (const output of outputs) {\n entries.push({binding: entries.length, resource: {buffer: output.buffer}});\n }\n if (uniformBufferBinding) {\n entries.push({binding: entries.length, resource: uniformBufferBinding});\n }\n const bindGroup = device.createBindGroup(\n {layout: buildArtifact.computePipeline.getBindGroupLayout(0), entries, label: buildArtifact.programInfo.name});\n\n if (this.backend.sessionStatus === 'capturing') {\n const commandInfo = {\n kernelId: this.backend.currentKernelId!,\n computePipeline: buildArtifact.computePipeline,\n bindGroup,\n dispatchGroup\n };\n const sessionCommandList = this.backend.capturedCommandList.get(this.backend.currentSessionId!);\n sessionCommandList!.push(commandInfo);\n }\n\n computePassEncoder.setPipeline(buildArtifact.computePipeline);\n computePassEncoder.setBindGroup(0, bindGroup);\n computePassEncoder.dispatchWorkgroups(...dispatchGroup);\n this.backend.writeTimestamp(this.backend.pendingDispatchNumber * 2 + 1);\n this.backend.pendingDispatchNumber++;\n\n if (this.backend.pendingDispatchNumber >= this.backend.maxDispatchNumber ||\n this.backend.queryType === 'at-passes') {\n this.backend.endComputePass();\n }\n if (this.backend.pendingDispatchNumber >= this.backend.maxDispatchNumber) {\n this.backend.flush();\n }\n TRACE_FUNC_END(buildArtifact.programInfo.name);\n }\n dispose(): void {\n // this.repo.forEach(a => this.glContext.deleteProgram(a.program));\n }\n build(programInfo: ProgramInfo, normalizedDispatchGroupSize: [number, number, number]): Artifact {\n TRACE_FUNC_BEGIN(programInfo.name);\n const device = this.backend.device;\n const extensions: string[] = [];\n if (device.features.has('shader-f16')) {\n extensions.push('enable f16;');\n }\n const shaderHelper = createShaderHelper(normalizedDispatchGroupSize, this.backend.device.limits);\n const userCode = programInfo.getShaderSource(shaderHelper);\n const code = `${extensions.join('\\n')}\\n${shaderHelper.additionalImplementations}\\n${userCode}`;\n const shaderModule = device.createShaderModule({code, label: programInfo.name});\n LOG_DEBUG('verbose', () => `[WebGPU] ${programInfo.name} shader code: ${code}`);\n\n const computePipeline = device.createComputePipeline(\n {compute: {module: shaderModule, entryPoint: 'main'}, layout: 'auto', label: programInfo.name});\n\n TRACE_FUNC_END(programInfo.name);\n return {programInfo, computePipeline, uniformVariablesInfo: shaderHelper.variablesInfo};\n }\n\n normalizeDispatchGroupSize(dispatchGroup: ReturnType['dispatchGroup']):\n [number, number, number] {\n const x = typeof dispatchGroup === 'number' ? dispatchGroup : dispatchGroup.x;\n const y = typeof dispatchGroup === 'number' ? 1 : (dispatchGroup.y || 1);\n const z = typeof dispatchGroup === 'number' ? 1 : (dispatchGroup.z || 1);\n const limitPerDimension = this.backend.device.limits.maxComputeWorkgroupsPerDimension;\n if (x <= limitPerDimension && y <= limitPerDimension && z <= limitPerDimension) {\n return [x, y, z];\n }\n const size = x * y * z;\n let dispatchAverage = Math.ceil(Math.sqrt(size));\n if (dispatchAverage > limitPerDimension) {\n dispatchAverage = Math.ceil(Math.cbrt(size));\n if (dispatchAverage > limitPerDimension) {\n throw new Error('Total dispatch size exceeds WebGPU maximum.');\n }\n return [dispatchAverage, dispatchAverage, dispatchAverage];\n } else {\n return [dispatchAverage, dispatchAverage, 1];\n }\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env, Tensor, TRACE, TRACE_FUNC_BEGIN, TRACE_FUNC_END} from 'onnxruntime-common';\n\nimport {DataType, tensorDataTypeEnumToString} from '../wasm-common';\n\nimport {configureLogger, LOG_DEBUG} from './log';\nimport {createView, TensorView} from './tensor-view';\nimport {createGpuDataManager, downloadGpuData, GpuDataManager} from './webgpu/gpu-data-manager';\nimport {RunFunction, WEBGPU_OP_RESOLVE_RULES} from './webgpu/op-resolve-rules';\nimport {ProgramManager} from './webgpu/program-manager';\nimport {AdapterInfo, ComputeContext, GpuArchitecture, GpuData, GpuVendor, ProgramInfo, ProgramInputTensorInfoDependency, SessionState, TimestampQuery} from './webgpu/types';\n\ninterface CommandInfo {\n readonly kernelId: number;\n readonly computePipeline: GPUComputePipeline;\n readonly bindGroup: GPUBindGroup;\n readonly dispatchGroup: [number, number, number];\n}\n\ninterface KernelInfo {\n readonly kernelType: string;\n readonly kernelName: string;\n readonly kernelEntry: RunFunction;\n readonly attributes: [((attribute: unknown) => unknown)|undefined, unknown];\n}\n\ninterface PendingKernelInfo {\n readonly kernelId: number;\n readonly programName: string;\n readonly inputTensorViews: readonly TensorView[];\n readonly outputTensorViews: readonly TensorView[];\n}\n\nconst getProgramInputTensorInfoDependencyKey =\n (inputTensors: readonly TensorView[], inputDependencies: readonly ProgramInputTensorInfoDependency[]): string => {\n if (inputDependencies.length !== inputTensors.length) {\n throw new Error(`inputDependencies length ${inputDependencies.length} is not equal to inputTensors length ${\n inputTensors.length}.`);\n }\n\n const inputInfos: string[] = [];\n for (let i = 0; i < inputTensors.length; ++i) {\n const type = inputTensors[i].dataType;\n switch (inputDependencies[i]) {\n case 'none': {\n inputInfos.push('');\n break;\n }\n case 'type': {\n inputInfos.push(`${type}`);\n break;\n }\n case 'rank': {\n const rank = inputTensors[i].dims.length;\n inputInfos.push(`${type};${rank}`);\n break;\n }\n case 'dims': {\n const dims = inputTensors[i].dims.join(',');\n inputInfos.push(`${type};${dims}`);\n break;\n }\n default:\n throw new Error(`unsupported input dependency: ${inputDependencies[i]}`);\n }\n }\n\n return inputInfos.join('|');\n };\n\n/**\n * get a unique key representing the program from the program info, input shapes and types.\n *\n * @returns a unique key is a shorter string than the shader source, which contains all the information to identify a\n * program. if the key is the same, the program shader source should be the same, so we can reuse the program.\n *\n */\nconst getProgramInfoUniqueKey =\n (programInfo: ProgramInfo, inputTensors: readonly TensorView[], is1DimensionDispatch: boolean): string => {\n // final key format:\n // []:is1DimensionDispatch:||...\n let key = programInfo.name;\n if (programInfo.shaderCache?.hint) {\n key += '[' + programInfo.shaderCache.hint + ']';\n }\n key += ':' + is1DimensionDispatch +\n `:${\n getProgramInputTensorInfoDependencyKey(\n inputTensors,\n programInfo.shaderCache?.inputDependencies ??\n new Array(inputTensors.length).fill('dims'))}`;\n return key;\n };\n\nclass AdapterInfoImpl implements AdapterInfo {\n readonly architecture?: string;\n readonly vendor?: string;\n\n constructor(adapterInfo: GPUAdapterInfo) {\n if (adapterInfo) {\n this.architecture = adapterInfo.architecture;\n this.vendor = adapterInfo.vendor;\n }\n }\n\n isArchitecture(architecture: GpuArchitecture): boolean {\n return this.architecture === architecture;\n }\n\n isVendor(vendor: GpuVendor): boolean {\n return this.vendor === vendor;\n }\n}\n\n/**\n * this class is designed to store status and being used as a singleton for JSEP. It will be passed to jsepInit() as\n * the first parameter so that it is stored for future use.\n */\nexport class WebGpuBackend {\n adapterInfo: AdapterInfoImpl;\n device: GPUDevice;\n /**\n * an instance of GpuDataManager to manage a GpuDataId -> GpuBuffer mapping\n */\n gpuDataManager: GpuDataManager;\n /**\n * an instance of ProgramManager to build and run WebGPU compute shader program, and manage a ProgramKey -> Program\n * artifacts mapping\n */\n programManager: ProgramManager;\n\n /**\n * representing the session ID of which is currently being run.\n * `null` means no session is being run.\n * only valid when session.run is executed.\n */\n currentSessionId: number|null = null;\n\n /**\n * representing the kernel ID of which is currently being computed (CPU code perspective).\n * `null` means no kernel is being computed.\n * only one kernel can be computed at a moment.\n */\n currentKernelId: number|null = null;\n /**\n * a list of temporary GPU data for the current kernel. should release when the kernel done computation.\n */\n private temporaryData: GpuData[];\n /**\n * a KernelID -> a GPU data list, which stores persistent GPU data owned by the specific kernel.\n */\n private kernelPersistentData: Map;\n /**\n * a KernelID -> a custom data, which stores custom data owned by the specific kernel.\n */\n private kernelCustomData: Map;\n /**\n * get the custom data of the current kernel\n */\n get currentKernelCustomData(): {[key: string]: unknown} {\n if (this.currentKernelId === null) {\n throw new Error('currentKernelCustomData(): currentKernelId is null. (should not happen)');\n }\n\n let data = this.kernelCustomData.get(this.currentKernelId);\n if (!data) {\n data = {};\n this.kernelCustomData.set(this.currentKernelId, data);\n }\n\n return data;\n }\n\n // KernelID -> kernelInfo mapping\n kernels: Map;\n private commandEncoder: GPUCommandEncoder|null = null;\n private computePassEncoder: GPUComputePassEncoder|null = null;\n maxDispatchNumber = 16;\n pendingDispatchNumber = 0;\n\n // info of kernels pending submission for a single batch\n private pendingKernels: PendingKernelInfo[] = [];\n // queryReadBuffer -> pendingKernels mapping for all the batches\n private pendingQueries: Map = new Map();\n private queryResolveBuffer?: GPUBuffer;\n private querySet?: GPUQuerySet;\n private queryTimeBase?: bigint;\n queryType: TimestampQuery;\n\n env: Env;\n sessionStatus: SessionState = 'default';\n /**\n * a SessionID -> CommandInfo[] mapping. It's used to record all GPU commands for corresponding session.\n */\n capturedCommandList: Map = new Map();\n\n /**\n * a SessionID -> PendingKernelInfo[] mapping for profiling.\n */\n private capturedPendingKernels: Map = new Map();\n\n /**\n * a SessionID -> a Map of (InputOutputIndex -> [ID, GPUBuffer]) mapping.\n */\n sessionExternalDataMapping: Map> = new Map();\n\n async initialize(env: Env, adapter: GPUAdapter): Promise {\n this.env = env;\n const requiredFeatures: GPUFeatureName[] = [];\n const deviceDescriptor: GPUDeviceDescriptor = {\n requiredLimits: {\n maxComputeWorkgroupStorageSize: adapter.limits.maxComputeWorkgroupStorageSize,\n maxComputeWorkgroupsPerDimension: adapter.limits.maxComputeWorkgroupsPerDimension,\n maxStorageBufferBindingSize: adapter.limits.maxStorageBufferBindingSize,\n maxBufferSize: adapter.limits.maxBufferSize,\n maxComputeInvocationsPerWorkgroup: adapter.limits.maxComputeInvocationsPerWorkgroup,\n maxComputeWorkgroupSizeX: adapter.limits.maxComputeWorkgroupSizeX,\n maxComputeWorkgroupSizeY: adapter.limits.maxComputeWorkgroupSizeY,\n maxComputeWorkgroupSizeZ: adapter.limits.maxComputeWorkgroupSizeZ,\n },\n requiredFeatures,\n };\n\n if (adapter.features.has('chromium-experimental-timestamp-query-inside-passes')) {\n requiredFeatures.push('chromium-experimental-timestamp-query-inside-passes' as GPUFeatureName);\n } else if (adapter.features.has('timestamp-query')) {\n requiredFeatures.push('timestamp-query');\n }\n if (adapter.features.has('shader-f16')) {\n requiredFeatures.push('shader-f16');\n }\n\n this.device = await adapter.requestDevice(deviceDescriptor);\n this.adapterInfo = new AdapterInfoImpl(adapter.info || await adapter.requestAdapterInfo());\n this.gpuDataManager = createGpuDataManager(this);\n this.programManager = new ProgramManager(this);\n this.kernels = new Map();\n this.kernelPersistentData = new Map();\n this.kernelCustomData = new Map();\n\n // set up flags for logger\n configureLogger(env.logLevel!, !!env.debug);\n\n // TODO: set up flags\n\n this.device.onuncapturederror = ev => {\n if (ev.error instanceof GPUValidationError) {\n // eslint-disable-next-line no-console\n console.error(`An uncaught WebGPU validation error was raised: ${ev.error.message}`);\n }\n };\n\n Object.defineProperty(\n this.env.webgpu, 'device', {value: this.device, writable: false, enumerable: true, configurable: false});\n Object.defineProperty(\n this.env.webgpu, 'adapter', {value: adapter, writable: false, enumerable: true, configurable: false});\n\n // init queryType, which is necessary for InferenceSession.create\n this.setQueryType();\n }\n\n dispose(): void {\n if (typeof this.querySet !== 'undefined') {\n this.querySet.destroy();\n }\n this.gpuDataManager.dispose();\n }\n\n getCommandEncoder(): GPUCommandEncoder {\n if (!this.commandEncoder) {\n this.commandEncoder = this.device.createCommandEncoder();\n }\n return this.commandEncoder;\n }\n\n getComputePassEncoder(): GPUComputePassEncoder {\n if (!this.computePassEncoder) {\n const commandEncoder = this.getCommandEncoder();\n const computePassDescriptor: GPUComputePassDescriptor = {};\n\n if (this.queryType === 'at-passes') {\n computePassDescriptor.timestampWrites = {\n querySet: this.querySet!,\n beginningOfPassWriteIndex: this.pendingDispatchNumber * 2,\n endOfPassWriteIndex: this.pendingDispatchNumber * 2 + 1,\n };\n }\n\n this.computePassEncoder = commandEncoder.beginComputePass(computePassDescriptor);\n }\n return this.computePassEncoder;\n }\n\n endComputePass(): void {\n if (this.computePassEncoder) {\n this.computePassEncoder.end();\n this.computePassEncoder = null;\n }\n }\n\n flush(): void {\n if (!this.commandEncoder) {\n return;\n }\n\n TRACE_FUNC_BEGIN();\n\n this.endComputePass();\n let queryReadBuffer: GPUBuffer;\n if (this.queryType !== 'none') {\n this.commandEncoder.resolveQuerySet(\n this.querySet!, 0, this.pendingDispatchNumber * 2, this.queryResolveBuffer!, 0);\n\n queryReadBuffer = this.device.createBuffer(\n // eslint-disable-next-line no-bitwise\n {size: this.pendingDispatchNumber * 2 * 8, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST});\n\n this.pendingQueries.set(queryReadBuffer, this.pendingKernels);\n this.pendingKernels = [];\n this.commandEncoder.copyBufferToBuffer(\n this.queryResolveBuffer!, 0, queryReadBuffer, 0, this.pendingDispatchNumber * 2 * 8);\n }\n\n this.device.queue.submit([this.commandEncoder.finish()]);\n this.gpuDataManager.refreshPendingBuffers();\n this.commandEncoder = null;\n this.pendingDispatchNumber = 0;\n\n if (this.queryType !== 'none') {\n void queryReadBuffer!.mapAsync(GPUMapMode.READ).then(() => {\n const mappedData = new BigUint64Array(queryReadBuffer.getMappedRange());\n const pendingKernels = this.pendingQueries.get(queryReadBuffer)!;\n for (let i = 0; i < mappedData.length / 2; i++) {\n const pendingKernelInfo = pendingKernels[i];\n const kernelId = pendingKernelInfo.kernelId;\n const kernelInfo = this.kernels.get(kernelId)!;\n const kernelType = kernelInfo.kernelType;\n const kernelName = kernelInfo.kernelName;\n const programName = pendingKernelInfo.programName;\n const inputTensorViews = pendingKernelInfo.inputTensorViews;\n const outputTensorViews = pendingKernelInfo.outputTensorViews;\n const startTimeU64 = mappedData[i * 2];\n const endTimeU64 = mappedData[i * 2 + 1];\n\n if (typeof this.queryTimeBase === 'undefined') {\n this.queryTimeBase = startTimeU64;\n }\n\n const startTime = Number(startTimeU64 - this.queryTimeBase);\n const endTime = Number(endTimeU64 - this.queryTimeBase);\n\n if (!Number.isSafeInteger(startTime) || !Number.isSafeInteger(endTime)) {\n throw new RangeError('incorrect timestamp range');\n }\n\n if (this.env.webgpu.profiling?.ondata) {\n this.env.webgpu.profiling.ondata({\n version: 1,\n inputsMetadata: inputTensorViews.map(\n value => ({dims: value.dims, dataType: tensorDataTypeEnumToString(value.dataType)})),\n outputsMetadata: outputTensorViews.map(\n value => ({dims: value.dims, dataType: tensorDataTypeEnumToString(value.dataType)})),\n kernelId,\n kernelType,\n kernelName,\n programName,\n startTime,\n endTime,\n });\n } else {\n // if no callback is provided, print the profiling message to console\n let inputShapes = '';\n inputTensorViews.forEach((value, i) => {\n inputShapes += `input[${i}]: [${value.dims}] | ${tensorDataTypeEnumToString(value.dataType)}, `;\n });\n let outputShapes = '';\n outputTensorViews.forEach((value, i) => {\n outputShapes += `output[${i}]: [${value.dims}] | ${tensorDataTypeEnumToString(value.dataType)}, `;\n });\n // eslint-disable-next-line no-console\n console.log(`[profiling] kernel \"${kernelId}|${kernelType}|${kernelName}|${programName}\" ${inputShapes}${\n outputShapes}execution time: ${endTime - startTime} ns`);\n }\n TRACE('GPU', `${programName}::${startTimeU64}::${endTimeU64}`);\n }\n queryReadBuffer.unmap();\n this.pendingQueries.delete(queryReadBuffer);\n });\n }\n TRACE_FUNC_END();\n }\n\n /**\n * run a WebGPU program.\n * @param program a ProgramInfo instance\n * @param inputTensorViews a TensorView array. each element represents a value already exists in GPU.\n * @param outputIndices an indices array. each element can be either -1 (temporary data), -2 (persistent data) or an\n * index to the kernel's output.\n * @param createKernelOutput a callback function that create a value to kernel's output with the given index\n * @param createIntermediateOutput a callback function that create a value as a intermediate value, either temporary\n * or persistent (owned by the current kernel)\n * @returns a TensorView array representing the result.\n */\n run(program: ProgramInfo, inputTensorViews: readonly TensorView[], outputIndices: readonly number[],\n createKernelOutput: (index: number, dataType: number, dims: readonly number[]) => TensorView,\n createIntermediateOutput: (dataType: number, dims: readonly number[]) => TensorView,\n outputCount: number): TensorView[] {\n TRACE_FUNC_BEGIN(program.name);\n // create info for inputs\n const inputDatas: GpuData[] = [];\n for (let i = 0; i < inputTensorViews.length; ++i) {\n const data = inputTensorViews[i].data;\n // if tensor view data is 0, it means the output is zero-sized tensor, and there is no GPU data for it.\n if (data === 0) {\n continue;\n }\n const gpuData = this.gpuDataManager.get(data);\n if (!gpuData) {\n throw new Error(`no GPU data for input: ${data}`);\n }\n inputDatas.push(gpuData);\n }\n\n const {outputs, dispatchGroup, programUniforms} = program.getRunData(inputTensorViews);\n\n // check output indices\n const validatedOutputIndices = outputIndices.length === 0 ? outputs.map((_, i) => i) : outputIndices;\n if (validatedOutputIndices.length !== outputs.length) {\n throw new Error(`Output size ${validatedOutputIndices.length} must be equal to ${outputs.length}.`);\n }\n\n // create info for outputs\n const outputTensorViews: TensorView[] = [];\n const outputDatas: GpuData[] = [];\n for (let i = 0; i < outputs.length; ++i) {\n // value -1 and -2 are used for creating temporary and persistent outputs.\n // value -3 is used for placeholder output. So -3, -2, -1 and 0, 1, 2, ... are valid\n // output indices. see type definition of ComputeContextInputsOutputsMapping for more details.\n if (!Number.isInteger(validatedOutputIndices[i]) || validatedOutputIndices[i] < -3 ||\n validatedOutputIndices[i] >= outputCount) {\n throw new Error(`Invalid output index: ${validatedOutputIndices[i]}`);\n }\n if (validatedOutputIndices[i] === -3) {\n continue;\n }\n const isTemporary = validatedOutputIndices[i] === -1;\n const isPersistent = validatedOutputIndices[i] === -2;\n const tensorView = (isTemporary || isPersistent) ?\n createIntermediateOutput(outputs[i].dataType, outputs[i].dims) :\n createKernelOutput(validatedOutputIndices[i], outputs[i].dataType, outputs[i].dims);\n outputTensorViews.push(tensorView);\n // if tensor view data is 0, it means the output is zero-sized tensor, and there is no GPU data for it.\n if (tensorView.data === 0) {\n continue;\n }\n const gpuData = this.gpuDataManager.get(tensorView.data);\n if (!gpuData) {\n throw new Error(`no GPU data for output: ${tensorView.data}`);\n }\n if (isTemporary) {\n this.temporaryData.push(gpuData);\n }\n if (isPersistent) {\n let persistentData = this.kernelPersistentData.get(this.currentKernelId!);\n if (!persistentData) {\n persistentData = [];\n this.kernelPersistentData.set(this.currentKernelId!, persistentData);\n }\n persistentData.push(gpuData);\n }\n outputDatas.push(gpuData);\n }\n\n // when there are any zero-sized tensor in the inputs or outputs, we should report error unless all outputs are\n // zero-sized tensors.\n if (inputDatas.length !== inputTensorViews.length || outputDatas.length !== outputTensorViews.length) {\n // if all outputs are zero-sized tensors, there is no need to run the program.\n if (outputDatas.length === 0) {\n TRACE_FUNC_END(program.name);\n return outputTensorViews;\n }\n // if some outputs are zero-sized tensors, report an error.\n //\n // TODO: so far we don't see any use case that outputs include both zero-sized tensors and non-zero-sized tensors.\n // If we see such use case, we need to make a change here to support it.\n throw new Error(\n `Program ${program.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`);\n }\n\n // load uniforms\n // TODO: add cache for uniform (is it necessary?)\n //\n let uniformBufferBinding: GPUBindingResource|undefined;\n if (programUniforms) {\n let currentOffset = 0;\n const offsets: number[] = [];\n\n programUniforms.forEach(v => {\n const data = typeof v.data === 'number' ? [v.data] : v.data;\n if (data.length === 0) {\n return;\n }\n // https://www.w3.org/TR/WGSL/#alignof\n const sizeOfElement = v.type === DataType.float16 ? 2 : 4;\n let sizeOfVecOrMat;\n let baseAlignment;\n if (v.type === DataType.float16) {\n baseAlignment = data.length > 4 ? 16 : (data.length > 2 ? 8 : data.length * sizeOfElement);\n sizeOfVecOrMat = data.length > 4 ? 16 : sizeOfElement * data.length;\n } else {\n baseAlignment = data.length <= 2 ? data.length * sizeOfElement : 16;\n sizeOfVecOrMat = 16;\n }\n currentOffset = Math.ceil(currentOffset / baseAlignment) * baseAlignment;\n offsets.push(currentOffset);\n // For non-float16 type, when data.length > 4, the uniform variable is of type array,N>, where\n // N = Math.ceil(data.length / 4) and SizeOf(vec4) = 16. The total byte length is N *\n // SizeOf(vec4). For float16 type, when data.length > 4, the uniform variable is of type\n // array,N>, where N = Math.ceil(data.length / 8) and SizeOf(mat2x4) = 16. The total byte\n // length is N * SizeOf(mat2x4).\n const elementPerVecOrMat = v.type === DataType.float16 ? 8 : 4;\n currentOffset += data.length > 4 ? Math.ceil(data.length / elementPerVecOrMat) * sizeOfVecOrMat :\n data.length * sizeOfElement;\n });\n\n // Meet alignment of struct here: https://www.w3.org/TR/WGSL/#alignment-and-size. For simplicity, set\n // maxAlignmentOfField to 16 since the underlying buffer has been rounded up to 16.\n const maxAlignmentOfField = 16;\n currentOffset = Math.ceil(currentOffset / maxAlignmentOfField) * maxAlignmentOfField;\n const arrayBuffer = new ArrayBuffer(currentOffset);\n programUniforms.forEach((v, i) => {\n const offset = offsets[i];\n const data = typeof v.data === 'number' ? [v.data] : v.data;\n if (v.type === DataType.int32) {\n new Int32Array(arrayBuffer, offset, data.length).set(data);\n } else if (v.type === DataType.uint32) {\n new Uint32Array(arrayBuffer, offset, data.length).set(data);\n } else if (v.type === DataType.float16) {\n // TODO: use Float16Array.\n new Uint16Array(arrayBuffer, offset, data.length).set(data);\n } else if (v.type === DataType.float) {\n new Float32Array(arrayBuffer, offset, data.length).set(data);\n } else {\n throw new Error(`Unsupported uniform type: ${tensorDataTypeEnumToString(v.type)}`);\n }\n });\n\n const uniformBufferData =\n // eslint-disable-next-line no-bitwise\n this.gpuDataManager.create(currentOffset, GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM);\n this.device.queue.writeBuffer(uniformBufferData.buffer, 0, arrayBuffer, 0, currentOffset);\n this.gpuDataManager.release(uniformBufferData.id);\n uniformBufferBinding = {offset: 0, size: currentOffset, buffer: uniformBufferData.buffer};\n }\n\n const normalizedDispatchGroup = this.programManager.normalizeDispatchGroupSize(dispatchGroup);\n const is1DimensionDispatch = normalizedDispatchGroup[1] === 1 && normalizedDispatchGroup[2] === 1;\n // get program info\n const key = getProgramInfoUniqueKey(program, inputTensorViews, is1DimensionDispatch);\n let artifact = this.programManager.getArtifact(key);\n if (!artifact) {\n artifact = this.programManager.build(program, normalizedDispatchGroup);\n this.programManager.setArtifact(key, artifact);\n LOG_DEBUG('info', () => `[artifact] key: ${key}, programName: ${program.name}`);\n }\n\n // validate uniform variables\n if (programUniforms && artifact.uniformVariablesInfo) {\n if (programUniforms.length !== artifact.uniformVariablesInfo.length) {\n throw new Error(`Uniform variables count mismatch: expect ${artifact.uniformVariablesInfo.length}, got ${\n programUniforms.length} in program \"${artifact.programInfo.name}\".`);\n }\n for (let i = 0; i < programUniforms.length; i++) {\n const uniform = programUniforms[i];\n const actualType = uniform.type;\n const actualLength = typeof uniform.data === 'number' ? 1 : uniform.data.length;\n const [type, length] = artifact.uniformVariablesInfo[i];\n if (actualType !== type || actualLength !== length) {\n throw new Error(`Uniform variable ${i} mismatch: expect type ${type} with size ${length}, got type ${\n actualType} with size ${actualLength} in program \"${artifact.programInfo.name}\".`);\n }\n }\n }\n\n LOG_DEBUG(\n 'info',\n () => `[ProgramManager] run \"${program.name}\" (key=${key}) with ${normalizedDispatchGroup[0]}x${\n normalizedDispatchGroup[1]}x${normalizedDispatchGroup[2]}`);\n\n if (this.queryType !== 'none' || this.sessionStatus === 'capturing') {\n const pendingKernelInfo: PendingKernelInfo = {\n kernelId: this.currentKernelId!,\n programName: artifact.programInfo.name,\n inputTensorViews,\n outputTensorViews,\n };\n this.pendingKernels.push(pendingKernelInfo);\n\n if (this.sessionStatus === 'capturing') {\n const sessionPendingKernels = this.capturedPendingKernels.get(this.currentSessionId!);\n sessionPendingKernels!.push(pendingKernelInfo);\n }\n }\n\n this.programManager.run(artifact, inputDatas, outputDatas, normalizedDispatchGroup, uniformBufferBinding);\n\n TRACE_FUNC_END(program.name);\n return outputTensorViews;\n }\n\n upload(gpuDataId: number, data: Uint8Array): void {\n this.gpuDataManager.upload(gpuDataId, data);\n }\n\n memcpy(src: number, dst: number): void {\n this.gpuDataManager.memcpy(src, dst);\n }\n\n async download(gpuDataId: number, getTargetBuffer: () => Uint8Array): Promise {\n // the underlying buffer may be changed after the async function is called. so we use a getter function to make sure\n // the buffer is up-to-date.\n await this.gpuDataManager.download(gpuDataId, getTargetBuffer);\n }\n\n alloc(size: number): number {\n return this.gpuDataManager.create(size).id;\n }\n\n free(ptr: number): number {\n return this.gpuDataManager.release(ptr);\n }\n\n createKernel(kernelType: string, kernelId: number, attribute: unknown, kernelName: string): void {\n const op = WEBGPU_OP_RESOLVE_RULES.get(kernelType);\n if (!op) {\n throw new Error(`kernel not implemented: ${kernelType}`);\n }\n\n const kernelInfo: KernelInfo = {\n kernelType,\n kernelName,\n kernelEntry: op[0],\n attributes: [op[1], attribute],\n };\n this.kernels.set(kernelId, kernelInfo);\n }\n\n releaseKernel(kernelId: number): void {\n const persistentData = this.kernelPersistentData.get(kernelId);\n if (persistentData) {\n for (const data of persistentData) {\n this.gpuDataManager.release(data.id);\n }\n this.kernelPersistentData.delete(kernelId);\n }\n\n this.kernelCustomData.delete(kernelId);\n this.kernels.delete(kernelId);\n }\n\n computeKernel(kernelId: number, context: ComputeContext, errors: Array>): number {\n const kernel = this.kernels.get(kernelId);\n if (!kernel) {\n throw new Error(`kernel not created: ${kernelId}`);\n }\n const kernelType = kernel.kernelType;\n const kernelName = kernel.kernelName;\n const kernelEntry = kernel.kernelEntry;\n const attributes = kernel.attributes;\n if (this.currentKernelId !== null) {\n throw new Error(`kernel \"[${kernelType}] ${kernelName}\" is not allowed to be called recursively`);\n }\n this.currentKernelId = kernelId;\n\n // parse attributes if necessary\n if (attributes[0]) {\n attributes[1] = attributes[0](attributes[1]);\n attributes[0] = undefined;\n }\n\n LOG_DEBUG('info', () => `[WebGPU] Start to run kernel \"[${kernelType}] ${kernelName}\"...`);\n\n const useErrorScope = this.env.debug;\n\n this.temporaryData = [];\n try {\n if (useErrorScope) {\n this.device.pushErrorScope('validation');\n }\n\n kernelEntry(context, attributes[1]);\n return 0; // ORT_OK\n } catch (e) {\n errors.push(Promise.resolve(`[WebGPU] Kernel \"[${kernelType}] ${kernelName}\" failed. ${e}`));\n return 1; // ORT_FAIL\n } finally {\n if (useErrorScope) {\n errors.push(this.device.popErrorScope().then(\n err => err ? `GPU validation error for kernel \"[${kernelType}] ${kernelName}\": ${err.message}` : null));\n }\n\n for (const data of this.temporaryData) {\n this.gpuDataManager.release(data.id);\n }\n this.temporaryData = [];\n this.currentKernelId = null;\n }\n }\n\n // #region external buffer\n registerBuffer(sessionId: number, index: number, buffer: GPUBuffer, size: number): number {\n let sessionInputOutputMapping = this.sessionExternalDataMapping.get(sessionId);\n if (!sessionInputOutputMapping) {\n sessionInputOutputMapping = new Map();\n this.sessionExternalDataMapping.set(sessionId, sessionInputOutputMapping);\n }\n\n const previousBuffer = sessionInputOutputMapping.get(index);\n const id = this.gpuDataManager.registerExternalBuffer(buffer, size, previousBuffer?.[1]);\n sessionInputOutputMapping.set(index, [id, buffer]);\n return id;\n }\n unregisterBuffers(sessionId: number): void {\n const sessionInputOutputMapping = this.sessionExternalDataMapping.get(sessionId);\n if (sessionInputOutputMapping) {\n sessionInputOutputMapping.forEach(bufferInfo => this.gpuDataManager.unregisterExternalBuffer(bufferInfo[1]));\n this.sessionExternalDataMapping.delete(sessionId);\n }\n }\n getBuffer(gpuDataId: number): GPUBuffer {\n const gpuData = this.gpuDataManager.get(gpuDataId);\n if (!gpuData) {\n throw new Error(`no GPU data for buffer: ${gpuDataId}`);\n }\n return gpuData.buffer;\n }\n createDownloader(gpuBuffer: GPUBuffer, size: number, type: Tensor.GpuBufferDataTypes):\n () => Promise {\n return async () => {\n const data = await downloadGpuData(this, gpuBuffer, size);\n return createView(data.buffer, type);\n };\n }\n // #endregion\n writeTimestamp(index: number): void {\n if (this.queryType !== 'inside-passes') {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.computePassEncoder as any).writeTimestamp(this.querySet, index);\n }\n setQueryType(): void {\n this.queryType = 'none';\n if (this.env.webgpu.profiling?.mode === 'default' ||\n (typeof this.env.trace === 'undefined' ? this.env.wasm.trace : this.env.trace)) {\n if (this.device.features.has('chromium-experimental-timestamp-query-inside-passes')) {\n this.queryType = 'inside-passes';\n } else if (this.device.features.has('timestamp-query')) {\n this.queryType = 'at-passes';\n }\n\n if (this.queryType !== 'none' && typeof this.querySet === 'undefined') {\n this.querySet = this.device.createQuerySet({\n type: 'timestamp',\n count: this.maxDispatchNumber * 2,\n });\n this.queryResolveBuffer = this.device.createBuffer(\n // eslint-disable-next-line no-bitwise\n {size: this.maxDispatchNumber * 2 * 8, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE});\n }\n }\n }\n\n captureBegin(): void {\n LOG_DEBUG('info', 'captureBegin');\n if (!this.capturedCommandList.get(this.currentSessionId!)) {\n this.capturedCommandList.set(this.currentSessionId!, []);\n }\n if (!this.capturedPendingKernels.get(this.currentSessionId!)) {\n this.capturedPendingKernels.set(this.currentSessionId!, []);\n }\n // flush the left commands before we change the status.\n this.flush();\n this.sessionStatus = 'capturing';\n }\n captureEnd(): void {\n LOG_DEBUG('info', 'captureEnd');\n // flush the left commands before we change the status.\n this.flush();\n this.sessionStatus = 'default';\n }\n replay(): void {\n LOG_DEBUG('info', 'replay');\n this.sessionStatus = 'replaying';\n const sessionCommandList = this.capturedCommandList.get(this.currentSessionId!);\n const sessionPendingKernels = this.capturedPendingKernels.get(this.currentSessionId!);\n const length = sessionCommandList!.length;\n this.pendingKernels = [];\n for (let i = 0; i < length; i++) {\n const computePassEncoder = this.getComputePassEncoder();\n const command = sessionCommandList![i];\n this.writeTimestamp(this.pendingDispatchNumber * 2);\n computePassEncoder.setPipeline(command.computePipeline);\n computePassEncoder.setBindGroup(0, command.bindGroup);\n computePassEncoder.dispatchWorkgroups(...command.dispatchGroup);\n this.writeTimestamp(this.pendingDispatchNumber * 2 + 1);\n this.pendingDispatchNumber++;\n if (this.queryType !== 'none') {\n this.pendingKernels.push(sessionPendingKernels![i]);\n }\n if (this.pendingDispatchNumber >= this.maxDispatchNumber || this.queryType === 'at-passes') {\n this.endComputePass();\n }\n if (this.pendingDispatchNumber >= this.maxDispatchNumber) {\n this.flush();\n }\n }\n // flush the left commands before we change the status.\n this.flush();\n this.sessionStatus = 'default';\n }\n\n onReleaseSession(sessionId: number): void {\n this.unregisterBuffers(sessionId);\n if (this.capturedCommandList.has(sessionId)) {\n this.capturedCommandList.delete(sessionId);\n }\n if (this.capturedPendingKernels.has(sessionId)) {\n this.capturedPendingKernels.delete(sessionId);\n }\n this.gpuDataManager.onReleaseSession(sessionId);\n }\n\n onRunStart(sessionId: number): void {\n this.currentSessionId = sessionId;\n this.setQueryType();\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from 'onnxruntime-common';\n\nimport type {OrtWasmModule} from '../wasm-types';\nimport {DataType, getTensorElementSize} from '../wasm-common';\n\nimport {WebGpuBackend} from './backend-webgpu';\nimport {LOG_DEBUG} from './log';\nimport {TensorView} from './tensor-view';\nimport {ShapeUtil} from './util';\nimport {AdapterInfo, ComputeContext, ComputeContextInputsOutputsMapping, ProgramInfo} from './webgpu/types';\n\n/* eslint-disable no-bitwise */\n\nclass TensorViewImpl implements TensorView {\n constructor(\n private module: OrtWasmModule, public readonly dataType: number, public readonly data: number,\n public readonly dims: readonly number[]) {}\n\n getFloat32Array(): Float32Array {\n if (this.dataType !== DataType.float) {\n throw new Error('Invalid data type');\n }\n const elementCount = ShapeUtil.size(this.dims);\n return elementCount === 0 ? new Float32Array() :\n new Float32Array(this.module.HEAP8.buffer, this.data, elementCount);\n }\n\n getBigInt64Array(): BigInt64Array {\n if (this.dataType !== DataType.int64) {\n throw new Error('Invalid data type');\n }\n const elementCount = ShapeUtil.size(this.dims);\n return elementCount === 0 ? new BigInt64Array() :\n new BigInt64Array(this.module.HEAP8.buffer, this.data, elementCount);\n }\n\n getInt32Array(): Int32Array {\n if (this.dataType !== DataType.int32) {\n throw new Error('Invalid data type');\n }\n const elementCount = ShapeUtil.size(this.dims);\n return elementCount === 0 ? new Int32Array() : new Int32Array(this.module.HEAP8.buffer, this.data, elementCount);\n }\n\n reshape(newDims: readonly number[]): TensorView {\n if (ShapeUtil.size(newDims) !== ShapeUtil.size(this.dims)) {\n throw new Error('Invalid new shape');\n }\n return new TensorViewImpl(this.module, this.dataType, this.data, newDims);\n }\n}\n\nclass ComputeContextImpl implements ComputeContext {\n readonly adapterInfo: AdapterInfo;\n readonly opKernelContext: number;\n readonly inputs: readonly TensorView[];\n readonly outputCount: number;\n get kernelCustomData(): {[key: string]: unknown} {\n return this.backend.currentKernelCustomData;\n }\n get customDataBuffer(): Uint8Array {\n return this.module.HEAPU8.subarray(this.customDataOffset, this.customDataOffset + this.customDataSize);\n }\n private customDataOffset = 0;\n private customDataSize = 0;\n constructor(private module: OrtWasmModule, private backend: WebGpuBackend, contextDataOffset: number) {\n this.adapterInfo = backend.adapterInfo;\n const heapU32 = module.HEAPU32;\n\n // extract context data\n let dataIndex = (contextDataOffset >>> 2);\n this.opKernelContext = heapU32[dataIndex++];\n const inputCount = heapU32[dataIndex++];\n this.outputCount = heapU32[dataIndex++];\n this.customDataOffset = heapU32[dataIndex++];\n this.customDataSize = heapU32[dataIndex++];\n\n const inputs: TensorView[] = [];\n for (let i = 0; i < inputCount; i++) {\n const dataType = heapU32[dataIndex++];\n const data = heapU32[dataIndex++];\n const dim = heapU32[dataIndex++];\n const dims: number[] = [];\n for (let d = 0; d < dim; d++) {\n dims.push(heapU32[dataIndex++]);\n }\n inputs.push(new TensorViewImpl(module, dataType, data, dims));\n }\n this.inputs = inputs;\n }\n\n getMaxComputeWorkgroupSizes(): [number, number, number] {\n return [\n this.backend.device.limits.maxComputeWorkgroupSizeX, this.backend.device.limits.maxComputeWorkgroupSizeY,\n this.backend.device.limits.maxComputeWorkgroupSizeZ\n ];\n }\n\n getMaxComputeWorkgroupStoragesize(): number {\n return this.backend.device.limits.maxComputeWorkgroupStorageSize;\n }\n\n compute(program: ProgramInfo, inputsOutputsMapping?: ComputeContextInputsOutputsMapping): TensorView[] {\n // prepare inputs. inputs should always be valid data.\n const mappedInputs =\n inputsOutputsMapping?.inputs?.map(i => typeof i === 'number' ? this.inputs[i] : i) ?? this.inputs;\n // prepare outputs.\n const outputIndices = inputsOutputsMapping?.outputs ?? [];\n const createKernelOutput = (index: number, dataType: number, dims: readonly number[]): TensorView =>\n new TensorViewImpl(this.module, dataType, this.output(index, dims), dims);\n const createTemporaryOutput = (dataType: number, dims: readonly number[]): TensorView => {\n const elementSize = getTensorElementSize(dataType);\n if (!elementSize) {\n throw new Error(`Unsupported data type: ${dataType}`);\n }\n const bufferSize = elementSize * ShapeUtil.size(dims);\n const gpuDataId = bufferSize > 0 ? this.backend.gpuDataManager.create(bufferSize).id : 0;\n return new TensorViewImpl(this.module, dataType, gpuDataId, dims);\n };\n return this.backend.run(\n program, mappedInputs, outputIndices, createKernelOutput, createTemporaryOutput, this.outputCount);\n }\n\n output(index: number, dims: readonly number[]): number {\n const stack = this.module.stackSave();\n try {\n const data = this.module.stackAlloc((1 + dims.length) * 4 /* sizeof(size_t) */);\n let offset = data >> 2;\n this.module.HEAPU32[offset++] = dims.length;\n for (let i = 0; i < dims.length; i++) {\n this.module.HEAPU32[offset++] = dims[i];\n }\n return this.module._JsepOutput!(this.opKernelContext, index, data);\n } catch (e) {\n throw new Error(\n `Failed to generate kernel's output[${index}] with dims [${dims}]. ` +\n 'If you are running with pre-allocated output, please make sure the output type/dims are correct. ' +\n `Error: ${e}`);\n } finally {\n this.module.stackRestore(stack);\n }\n }\n}\n\n/**\n * Initialize JSEP with WebGPU backend.\n *\n * This function will be called after the WebAssembly module is loaded and initialized (\"_OrtInit\" is called), once for\n * each of the following EPs if they are specified:\n * - \"webgpu\"\n * - \"webnn\"\n *\n * For WebGPU, this function expects:\n * - WebGPU is enabled in build (BUILD_DEFS.DISABLE_JSEP === false).\n * - WebGPU is available in current environment. (a valid GPUAdapter is passed in)\n *\n * For WebNN, this function expects:\n * - WebNN is enabled in build (BUILD_DEFS.DISABLE_JSEP === false).\n * - WebNN is available in current environment. (navigator.ml is not undefined)\n *\n * If the WebAssembly module is not built with JSEP support, this function will throw an error. This will invalidate\n * 'webgpu'/'webnn' backend.\n *\n * @param name - the name of the EP, either \"webgpu\" or \"webnn\"\n * @param module - the ORT WebAssembly module\n * @param env - the ORT environment variable (ort.env)\n * @param gpuAdapter - the pre-created GPU adapter\n */\nexport const init =\n async(name: 'webgpu'|'webnn', module: OrtWasmModule, env: Env, gpuAdapter?: GPUAdapter): Promise => {\n const jsepInit = module.jsepInit;\n if (!jsepInit) {\n throw new Error('Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.');\n }\n\n if (name === 'webgpu') {\n const backend = new WebGpuBackend();\n await backend.initialize(env, gpuAdapter!);\n\n jsepInit('webgpu', [\n // backend\n backend,\n\n // jsepAlloc()\n (size: number) => backend.alloc(size),\n\n // jsepFree()\n (ptr: number) => backend.free(ptr),\n\n // jsepCopy(src, dst, size, isSourceGpu)\n (src: number, dst: number, size: number, isSourceGpu = false) => {\n if (isSourceGpu) {\n LOG_DEBUG('verbose', () => `[WebGPU] jsepCopyGpuToGpu: src=${src}, dst=${dst}, size=${size}`);\n backend.memcpy(src, dst);\n } else {\n LOG_DEBUG('verbose', () => `[WebGPU] jsepCopyCpuToGpu: dataOffset=${src}, gpuDataId=${dst}, size=${size}`);\n const data = module.HEAPU8.subarray(src >>> 0, (src >>> 0) + size);\n backend.upload(dst, data);\n }\n },\n\n // jsepCopyAsync(src, dst, size)\n async(gpuDataId: number, dataOffset: number, size: number):\n Promise => {\n LOG_DEBUG(\n 'verbose',\n () => `[WebGPU] jsepCopyGpuToCpu: gpuDataId=${gpuDataId}, dataOffset=${dataOffset}, size=${size}`);\n\n await backend.download(\n gpuDataId, () => module.HEAPU8.subarray(dataOffset >>> 0, (dataOffset >>> 0) + size));\n },\n\n // jsepCreateKernel\n (kernelType: string, kernelId: number, attribute: unknown) => backend.createKernel(\n kernelType, kernelId, attribute, module.UTF8ToString(module._JsepGetNodeName!(kernelId))),\n\n // jsepReleaseKernel\n (kernel: number) => backend.releaseKernel(kernel),\n\n // jsepRun\n (kernel: number, contextDataOffset: number, sessionHandle: number, errors: Array>) => {\n LOG_DEBUG(\n 'verbose',\n () => `[WebGPU] jsepRun: sessionHandle=${sessionHandle}, kernel=${kernel}, contextDataOffset=${\n contextDataOffset}`);\n const context = new ComputeContextImpl(module, backend, contextDataOffset);\n return backend.computeKernel(kernel, context, errors);\n },\n // jsepCaptureBegin\n () => backend.captureBegin(),\n // jsepCaptureEnd\n () => backend.captureEnd(),\n // jsepReplay\n () => backend.replay()\n ]);\n } else {\n jsepInit('webnn');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// WebNN API currently does not have a TypeScript definition file. This file is a workaround with types generated from\n// WebNN API specification.\n// https://github.com/webmachinelearning/webnn/issues/677\n/// \n\nimport {Env, InferenceSession, Tensor} from 'onnxruntime-common';\n\nimport {SerializableInternalBuffer, SerializableSessionMetadata, SerializableTensorMetadata, TensorMetadata} from './proxy-messages';\nimport {setRunOptions} from './run-options';\nimport {setSessionOptions} from './session-options';\nimport {dataLocationStringToEnum, getTensorElementSize, isGpuBufferSupportedType, logLevelStringToEnum, tensorDataTypeEnumToString, tensorDataTypeStringToEnum, tensorTypeToTypedArrayConstructor} from './wasm-common';\nimport {getInstance} from './wasm-factory';\nimport {allocWasmString, checkLastError} from './wasm-utils';\nimport {loadFile} from './wasm-utils-load-file';\n\n// #region Initializations\n\n/**\n * There are 4 different \"initialization\" steps for ORT. They happen in different places and different time.\n *\n * 1. JavaScript initialization for onnxruntime-common and onnxruntime-web.\n * This is the first initialization step. In this step, onnxruntime-web calls onnxruntime-common's registerBackend()\n * function multiple times to register all the available backends. The backend registration is very fast. It only\n * registers the backend name with the uninitialized backend object. No heavy initialization is done in this step.\n * Refer to web/lib/index.ts for the backend registration.\n *\n * 2. WebAssembly artifact initialization.\n * This happens when any registered wasm backend is used for the first time (ie. `ort.InferenceSession.create()` or\n * `ort.TrainingSession.create()` is called). In this step, onnxruntime-web does the followings:\n * - create a proxy worker and make sure the proxy worker is ready to receive messages, if proxy is enabled.\n * - perform feature detection, locate correct WebAssembly artifact path and call the Emscripten generated\n * JavaScript code to initialize the WebAssembly runtime.\n * - if proxy is enabled, this step happens in the proxy worker using message 'init-wasm'.\n * - downloading the 'ort-wasm{...}.wasm' file is done in this step.\n * - if multi-thread is enabled, one or more webworker will be created to initialize the PThread threadpool.\n *\n * 3. ORT environment initialization.\n * This happens after step 2. In this step, onnxruntime-web performs ONNX Runtime environment initialization.\n * Function `_OrtInit()` is called in this step.\n * - if proxy is enabled, this step happens in the proxy worker using message 'init-ort'.\n * - logging level (ort.env.logLevel) and thread number (ort.env.wasm.numThreads) are set in this step.\n *\n * 4. Session initialization.\n * This happens when `ort.InferenceSession.create()` or `ort.TrainingSession.create()` is called. Unlike the first 3\n * steps (they only called once), this step will be done for each session. In this step, onnxruntime-web does the\n * followings:\n * If the parameter is a URL:\n * - download the model data from the URL.\n * - copy the model data to the WASM heap. (proxy: 'copy-from')\n * - dereference the model buffer. This step allows the original ArrayBuffer to be garbage collected.\n * - call `_OrtCreateSession()` to create the session. (proxy: 'create')\n *\n * If the parameter is a Uint8Array object:\n * - copy the model data to the WASM heap. (proxy: 'copy-from')\n * - call `_OrtCreateSession()` to create the session. (proxy: 'create')\n *\n *\n */\n\n/**\n * initialize ORT environment.\n *\n * @param numThreads SetGlobalIntraOpNumThreads(numThreads)\n * @param loggingLevel CreateEnv(static_cast(logging_level))\n */\nconst initOrt = (numThreads: number, loggingLevel: number): void => {\n const errorCode = getInstance()._OrtInit(numThreads, loggingLevel);\n if (errorCode !== 0) {\n checkLastError('Can\\'t initialize onnxruntime.');\n }\n};\n\n/**\n * initialize runtime environment.\n * @param env passed in the environment config object.\n */\nexport const initRuntime = async(env: Env): Promise => {\n // init ORT\n initOrt(env.wasm.numThreads!, logLevelStringToEnum(env.logLevel));\n};\n\n/**\n * perform EP specific initialization.\n *\n * @param env\n * @param epName\n */\nexport const initEp = async(env: Env, epName: string): Promise => {\n if (!BUILD_DEFS.DISABLE_JSEP) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires\n const initJsep = require('./jsep/init').init;\n\n if (epName === 'webgpu') {\n // perform WebGPU availability check\n if (typeof navigator === 'undefined' || !navigator.gpu) {\n throw new Error('WebGPU is not supported in current environment');\n }\n\n let adapter = env.webgpu.adapter as GPUAdapter | null;\n if (!adapter) {\n // if adapter is not set, request a new adapter.\n const powerPreference = env.webgpu.powerPreference;\n if (powerPreference !== undefined && powerPreference !== 'low-power' &&\n powerPreference !== 'high-performance') {\n throw new Error(`Invalid powerPreference setting: \"${powerPreference}\"`);\n }\n const forceFallbackAdapter = env.webgpu.forceFallbackAdapter;\n if (forceFallbackAdapter !== undefined && typeof forceFallbackAdapter !== 'boolean') {\n throw new Error(`Invalid forceFallbackAdapter setting: \"${forceFallbackAdapter}\"`);\n }\n adapter = await navigator.gpu.requestAdapter({powerPreference, forceFallbackAdapter});\n if (!adapter) {\n throw new Error(\n 'Failed to get GPU adapter. ' +\n 'You may need to enable flag \"--enable-unsafe-webgpu\" if you are using Chrome.');\n }\n } else {\n // if adapter is set, validate it.\n if (typeof adapter.limits !== 'object' || typeof adapter.features !== 'object' ||\n typeof adapter.requestDevice !== 'function') {\n throw new Error('Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.');\n }\n }\n\n await initJsep('webgpu', getInstance(), env, adapter);\n }\n if (epName === 'webnn') {\n // perform WebNN availability check\n if (typeof navigator === 'undefined' || !(navigator as unknown as {ml: unknown}).ml) {\n throw new Error('WebNN is not supported in current environment');\n }\n\n await initJsep('webnn', getInstance(), env);\n }\n }\n};\n\n// #endregion Initializations\n\n/**\n * valid data locations for input/output tensors.\n */\ntype SupportedTensorDataLocationForInputOutput = 'cpu'|'cpu-pinned'|'gpu-buffer';\n\ntype IOBindingState = {\n /**\n * the handle of IO binding.\n */\n readonly handle: number;\n\n /**\n * the preferred location for each output tensor.\n *\n * value is one of 'cpu', 'cpu-pinned', 'gpu-buffer'.\n */\n readonly outputPreferredLocations: readonly SupportedTensorDataLocationForInputOutput[];\n\n /**\n * enum value of the preferred location for each output tensor.\n */\n readonly outputPreferredLocationsEncoded: readonly number[];\n};\n\n/**\n * tuple elements are: InferenceSession ID; inputNamesUTF8Encoded; outputNamesUTF8Encoded; bindingState\n */\ntype SessionMetadata = [\n inferenceSessionId: number, inputNamesUTF8Encoded: number[], outputNamesUTF8Encoded: number[],\n bindingState: IOBindingState|null, enableGraphCapture: boolean, inputOutputBound: boolean\n];\n\nconst activeSessions = new Map();\n\n/**\n * get the input/output count of the session.\n * @param sessionHandle the handle representing the session. should be non-zero.\n * @returns a tuple including 2 numbers, representing the input count and output count.\n */\nconst getSessionInputOutputCount = (sessionHandle: number): [number, number] => {\n const wasm = getInstance();\n const stack = wasm.stackSave();\n try {\n const dataOffset = wasm.stackAlloc(8);\n const errorCode = wasm._OrtGetInputOutputCount(sessionHandle, dataOffset, dataOffset + 4);\n if (errorCode !== 0) {\n checkLastError('Can\\'t get session input/output count.');\n }\n return [wasm.HEAP32[dataOffset / 4], wasm.HEAP32[dataOffset / 4 + 1]];\n } finally {\n wasm.stackRestore(stack);\n }\n};\n\n/**\n * allocate the memory and memcpy the external buffer.\n *\n * @param model - the external buffer containing the model data. Must not be the same buffer as the WASM heap.\n * @returns a 2-elements tuple - the pointer and size of the allocated buffer\n */\nexport const copyFromExternalBuffer = (model: Uint8Array): [number, number] => {\n const wasm = getInstance();\n const modelDataOffset = wasm._malloc(model.byteLength);\n if (modelDataOffset === 0) {\n throw new Error(`Can't create a session. failed to allocate a buffer of size ${model.byteLength}.`);\n }\n wasm.HEAPU8.set(model, modelDataOffset);\n return [modelDataOffset, model.byteLength];\n};\n\n/**\n * create an inference session from a model data buffer.\n *\n * @param modelData - either a Uint8Array object representing the model data, or a 2-elements tuple containing the\n * pointer and size of the model data buffer.\n * @param options an optional session options object.\n * @returns a 3-elements tuple containing [session handle, input names, output names]\n */\nexport const createSession = async(\n modelData: Uint8Array|SerializableInternalBuffer,\n options?: InferenceSession.SessionOptions): Promise => {\n let modelDataOffset: number, modelDataLength: number;\n const wasm = getInstance();\n\n if (Array.isArray(modelData)) {\n // if model data is an array, it must be a 2-elements tuple containing the pointer and size of the model data\n [modelDataOffset, modelDataLength] = modelData;\n } else if (modelData.buffer === wasm.HEAPU8.buffer) {\n // if model data uses the same buffer as the WASM heap, we don't need to copy it.\n [modelDataOffset, modelDataLength] = [modelData.byteOffset, modelData.byteLength];\n } else {\n // otherwise, copy the model data to the WASM heap.\n [modelDataOffset, modelDataLength] = copyFromExternalBuffer(modelData);\n }\n\n let sessionHandle = 0;\n let sessionOptionsHandle = 0;\n let ioBindingHandle = 0;\n let allocs: number[] = [];\n const inputNamesUTF8Encoded = [];\n const outputNamesUTF8Encoded = [];\n\n try {\n [sessionOptionsHandle, allocs] = setSessionOptions(options);\n\n if (options?.externalData && wasm.mountExternalData) {\n const loadingPromises = [];\n for (const file of options.externalData) {\n const path = typeof file === 'string' ? file : file.path;\n loadingPromises.push(loadFile(typeof file === 'string' ? file : file.data).then(data => {\n wasm.mountExternalData!(path, data);\n }));\n }\n\n // wait for all external data files to be loaded\n await Promise.all(loadingPromises);\n }\n\n for (const provider of options?.executionProviders ?? []) {\n const providerName = typeof provider === 'string' ? provider : provider.name;\n if (providerName === 'webnn') {\n if (wasm.currentContext) {\n throw new Error('WebNN execution provider is already set.');\n }\n if (typeof provider !== 'string') {\n const webnnOptions = provider as InferenceSession.WebNNExecutionProviderOption;\n const context = (webnnOptions as InferenceSession.WebNNOptionsWithMLContext)?.context;\n const gpuDevice = (webnnOptions as InferenceSession.WebNNOptionsWebGpu)?.gpuDevice;\n const deviceType = (webnnOptions as InferenceSession.WebNNContextOptions)?.deviceType;\n const numThreads = (webnnOptions as InferenceSession.WebNNContextOptions)?.numThreads;\n const powerPreference = (webnnOptions as InferenceSession.WebNNContextOptions)?.powerPreference;\n if (context) {\n wasm.currentContext = context as MLContext;\n } else if (gpuDevice) {\n wasm.currentContext = await navigator.ml.createContext(gpuDevice);\n } else {\n wasm.currentContext = await navigator.ml.createContext({deviceType, numThreads, powerPreference});\n }\n } else {\n wasm.currentContext = await navigator.ml.createContext();\n }\n break;\n }\n }\n\n sessionHandle = await wasm._OrtCreateSession(modelDataOffset, modelDataLength, sessionOptionsHandle);\n if (sessionHandle === 0) {\n checkLastError('Can\\'t create a session.');\n }\n\n // clear current MLContext after session creation\n if (wasm.currentContext) {\n wasm.currentContext = undefined;\n }\n\n const [inputCount, outputCount] = getSessionInputOutputCount(sessionHandle);\n\n const enableGraphCapture = !!options?.enableGraphCapture;\n\n const inputNames = [];\n const outputNames = [];\n const outputPreferredLocations: SupportedTensorDataLocationForInputOutput[] = [];\n for (let i = 0; i < inputCount; i++) {\n const name = wasm._OrtGetInputName(sessionHandle, i);\n if (name === 0) {\n checkLastError('Can\\'t get an input name.');\n }\n inputNamesUTF8Encoded.push(name);\n inputNames.push(wasm.UTF8ToString(name));\n }\n for (let i = 0; i < outputCount; i++) {\n const name = wasm._OrtGetOutputName(sessionHandle, i);\n if (name === 0) {\n checkLastError('Can\\'t get an output name.');\n }\n outputNamesUTF8Encoded.push(name);\n const nameString = wasm.UTF8ToString(name);\n outputNames.push(nameString);\n\n if (!BUILD_DEFS.DISABLE_JSEP) {\n if (enableGraphCapture && options?.preferredOutputLocation === undefined) {\n outputPreferredLocations.push('gpu-buffer');\n continue;\n }\n const location = typeof options?.preferredOutputLocation === 'string' ?\n options.preferredOutputLocation :\n options?.preferredOutputLocation?.[nameString] ?? 'cpu';\n if (location !== 'cpu' && location !== 'cpu-pinned' && location !== 'gpu-buffer') {\n throw new Error(`Not supported preferred output location: ${location}.`);\n }\n if (enableGraphCapture && location !== 'gpu-buffer') {\n throw new Error(`Not supported preferred output location: ${\n location}. Only 'gpu-buffer' location is supported when enableGraphCapture is true.`);\n }\n outputPreferredLocations.push(location);\n }\n }\n\n // use IO binding only when at least one output is preffered to be on GPU.\n let bindingState: IOBindingState|null = null;\n if (!BUILD_DEFS.DISABLE_JSEP && outputPreferredLocations.some(l => l === 'gpu-buffer')) {\n ioBindingHandle = wasm._OrtCreateBinding(sessionHandle);\n if (ioBindingHandle === 0) {\n checkLastError('Can\\'t create IO binding.');\n }\n\n bindingState = {\n handle: ioBindingHandle,\n outputPreferredLocations,\n outputPreferredLocationsEncoded: outputPreferredLocations.map(l => dataLocationStringToEnum(l)),\n };\n }\n\n activeSessions.set(\n sessionHandle,\n [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, bindingState, enableGraphCapture, false]);\n return [sessionHandle, inputNames, outputNames];\n } catch (e) {\n inputNamesUTF8Encoded.forEach(buf => wasm._OrtFree(buf));\n outputNamesUTF8Encoded.forEach(buf => wasm._OrtFree(buf));\n\n if (ioBindingHandle !== 0) {\n wasm._OrtReleaseBinding(ioBindingHandle);\n }\n\n if (sessionHandle !== 0) {\n wasm._OrtReleaseSession(sessionHandle);\n }\n throw e;\n } finally {\n wasm._free(modelDataOffset);\n if (sessionOptionsHandle !== 0) {\n wasm._OrtReleaseSessionOptions(sessionOptionsHandle);\n }\n allocs.forEach(alloc => wasm._free(alloc));\n\n // unmount external data if necessary\n wasm.unmountExternalData?.();\n }\n};\n\nexport const releaseSession = (sessionId: number): void => {\n const wasm = getInstance();\n const session = activeSessions.get(sessionId);\n if (!session) {\n throw new Error(`cannot release session. invalid session id: ${sessionId}`);\n }\n const [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, ioBindingState, enableGraphCapture] = session;\n\n if (ioBindingState) {\n if (enableGraphCapture) {\n wasm._OrtClearBoundOutputs(ioBindingState.handle);\n }\n wasm._OrtReleaseBinding(ioBindingState.handle);\n }\n\n wasm.jsepOnReleaseSession?.(sessionId);\n\n inputNamesUTF8Encoded.forEach(buf => wasm._OrtFree(buf));\n outputNamesUTF8Encoded.forEach(buf => wasm._OrtFree(buf));\n wasm._OrtReleaseSession(sessionHandle);\n activeSessions.delete(sessionId);\n};\n\nexport const prepareInputOutputTensor =\n (tensor: TensorMetadata|null, tensorHandles: number[], allocs: number[], sessionId: number, index: number,\n enableGraphCapture = false): void => {\n if (!tensor) {\n tensorHandles.push(0);\n return;\n }\n\n const wasm = getInstance();\n\n const dataType = tensor[0];\n const dims = tensor[1];\n const location = tensor[3];\n\n let rawData: number;\n let dataByteLength: number;\n\n if (dataType === 'string' && location === 'gpu-buffer') {\n throw new Error('String tensor is not supported on GPU.');\n }\n\n if (enableGraphCapture && location !== 'gpu-buffer') {\n throw new Error(\n `External buffer must be provided for input/output index ${index} when enableGraphCapture is true.`);\n }\n\n if (location === 'gpu-buffer') {\n const gpuBuffer = tensor[2].gpuBuffer as GPUBuffer;\n const elementSizeInBytes = getTensorElementSize(tensorDataTypeStringToEnum(dataType))!;\n dataByteLength = dims.reduce((a, b) => a * b, 1) * elementSizeInBytes;\n\n const registerBuffer = wasm.jsepRegisterBuffer;\n if (!registerBuffer) {\n throw new Error('Tensor location \"gpu-buffer\" is not supported without using WebGPU.');\n }\n rawData = registerBuffer(sessionId, index, gpuBuffer, dataByteLength);\n } else {\n const data = tensor[2];\n\n if (Array.isArray(data)) {\n // string tensor\n dataByteLength = 4 * data.length;\n rawData = wasm._malloc(dataByteLength);\n allocs.push(rawData);\n let dataIndex = rawData / 4;\n for (let i = 0; i < data.length; i++) {\n if (typeof data[i] !== 'string') {\n throw new TypeError(`tensor data at index ${i} is not a string`);\n }\n wasm.HEAPU32[dataIndex++] = allocWasmString(data[i], allocs);\n }\n } else {\n dataByteLength = data.byteLength;\n rawData = wasm._malloc(dataByteLength);\n allocs.push(rawData);\n wasm.HEAPU8.set(new Uint8Array(data.buffer, data.byteOffset, dataByteLength), rawData);\n }\n }\n\n const stack = wasm.stackSave();\n const dimsOffset = wasm.stackAlloc(4 * dims.length);\n try {\n let dimIndex = dimsOffset / 4;\n dims.forEach(d => wasm.HEAP32[dimIndex++] = d);\n const tensor = wasm._OrtCreateTensor(\n tensorDataTypeStringToEnum(dataType), rawData, dataByteLength, dimsOffset, dims.length,\n dataLocationStringToEnum(location));\n if (tensor === 0) {\n checkLastError(`Can't create tensor for input/output. session=${sessionId}, index=${index}.`);\n }\n tensorHandles.push(tensor);\n } finally {\n wasm.stackRestore(stack);\n }\n };\n\n/**\n * perform inference run\n */\nexport const run = async(\n sessionId: number, inputIndices: number[], inputTensors: TensorMetadata[], outputIndices: number[],\n outputTensors: Array, options: InferenceSession.RunOptions): Promise => {\n const wasm = getInstance();\n const session = activeSessions.get(sessionId);\n if (!session) {\n throw new Error(`cannot run inference. invalid session id: ${sessionId}`);\n }\n const sessionHandle = session[0];\n const inputNamesUTF8Encoded = session[1];\n const outputNamesUTF8Encoded = session[2];\n const ioBindingState = session[3];\n const enableGraphCapture = session[4];\n const inputOutputBound = session[5];\n\n const inputCount = inputIndices.length;\n const outputCount = outputIndices.length;\n\n let runOptionsHandle = 0;\n let runOptionsAllocs: number[] = [];\n\n const inputTensorHandles: number[] = [];\n const outputTensorHandles: number[] = [];\n const inputOutputAllocs: number[] = [];\n\n const beforeRunStack = wasm.stackSave();\n const inputValuesOffset = wasm.stackAlloc(inputCount * 4);\n const inputNamesOffset = wasm.stackAlloc(inputCount * 4);\n const outputValuesOffset = wasm.stackAlloc(outputCount * 4);\n const outputNamesOffset = wasm.stackAlloc(outputCount * 4);\n\n try {\n [runOptionsHandle, runOptionsAllocs] = setRunOptions(options);\n\n // create input tensors\n for (let i = 0; i < inputCount; i++) {\n prepareInputOutputTensor(\n inputTensors[i], inputTensorHandles, inputOutputAllocs, sessionId, inputIndices[i], enableGraphCapture);\n }\n\n // create output tensors\n for (let i = 0; i < outputCount; i++) {\n prepareInputOutputTensor(\n outputTensors[i], outputTensorHandles, inputOutputAllocs, sessionId, inputCount + outputIndices[i],\n enableGraphCapture);\n }\n\n let inputValuesIndex = inputValuesOffset / 4;\n let inputNamesIndex = inputNamesOffset / 4;\n let outputValuesIndex = outputValuesOffset / 4;\n let outputNamesIndex = outputNamesOffset / 4;\n for (let i = 0; i < inputCount; i++) {\n wasm.HEAPU32[inputValuesIndex++] = inputTensorHandles[i];\n wasm.HEAPU32[inputNamesIndex++] = inputNamesUTF8Encoded[inputIndices[i]];\n }\n for (let i = 0; i < outputCount; i++) {\n wasm.HEAPU32[outputValuesIndex++] = outputTensorHandles[i];\n wasm.HEAPU32[outputNamesIndex++] = outputNamesUTF8Encoded[outputIndices[i]];\n }\n\n if (!BUILD_DEFS.DISABLE_JSEP && ioBindingState && !inputOutputBound) {\n const {handle, outputPreferredLocations, outputPreferredLocationsEncoded} = ioBindingState;\n\n if (inputNamesUTF8Encoded.length !== inputCount) {\n throw new Error(`input count from feeds (${\n inputCount}) is expected to be always equal to model's input count (${inputNamesUTF8Encoded.length}).`);\n }\n\n // process inputs\n for (let i = 0; i < inputCount; i++) {\n const index = inputIndices[i];\n const errorCode = await wasm._OrtBindInput(handle, inputNamesUTF8Encoded[index], inputTensorHandles[i]);\n if (errorCode !== 0) {\n checkLastError(`Can't bind input[${i}] for session=${sessionId}.`);\n }\n }\n\n // process pre-allocated outputs\n for (let i = 0; i < outputCount; i++) {\n const index = outputIndices[i];\n const location = outputTensors[i]?.[3]; // undefined means output is not pre-allocated.\n\n if (location) {\n // output is pre-allocated. bind the tensor.\n const errorCode = wasm._OrtBindOutput(handle, outputNamesUTF8Encoded[index], outputTensorHandles[i], 0);\n if (errorCode !== 0) {\n checkLastError(`Can't bind pre-allocated output[${i}] for session=${sessionId}.`);\n }\n } else {\n // output is not pre-allocated. reset preferred location.\n const errorCode =\n wasm._OrtBindOutput(handle, outputNamesUTF8Encoded[index], 0, outputPreferredLocationsEncoded[index]);\n if (errorCode !== 0) {\n checkLastError(`Can't bind output[${i}] to ${outputPreferredLocations[i]} for session=${sessionId}.`);\n }\n }\n }\n activeSessions.set(\n sessionId,\n [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, ioBindingState, enableGraphCapture, true]);\n }\n\n wasm.jsepOnRunStart?.(sessionHandle);\n let errorCode: number;\n if (!BUILD_DEFS.DISABLE_JSEP && ioBindingState) {\n errorCode = await wasm._OrtRunWithBinding(\n sessionHandle, ioBindingState.handle, outputCount, outputValuesOffset, runOptionsHandle);\n } else {\n errorCode = await wasm._OrtRun(\n sessionHandle, inputNamesOffset, inputValuesOffset, inputCount, outputNamesOffset, outputCount,\n outputValuesOffset, runOptionsHandle);\n }\n\n if (errorCode !== 0) {\n checkLastError('failed to call OrtRun().');\n }\n\n const output: TensorMetadata[] = [];\n\n for (let i = 0; i < outputCount; i++) {\n const tensor = wasm.HEAPU32[outputValuesOffset / 4 + i];\n if (tensor === outputTensorHandles[i]) {\n // output tensor is pre-allocated. no need to copy data.\n output.push(outputTensors[i]!);\n continue;\n }\n\n const beforeGetTensorDataStack = wasm.stackSave();\n // stack allocate 4 pointer value\n const tensorDataOffset = wasm.stackAlloc(4 * 4);\n\n let keepOutputTensor = false;\n let type: Tensor.Type|undefined, dataOffset = 0;\n try {\n const errorCode = wasm._OrtGetTensorData(\n tensor, tensorDataOffset, tensorDataOffset + 4, tensorDataOffset + 8, tensorDataOffset + 12);\n if (errorCode !== 0) {\n checkLastError(`Can't access output tensor data on index ${i}.`);\n }\n let tensorDataIndex = tensorDataOffset / 4;\n const dataType = wasm.HEAPU32[tensorDataIndex++];\n dataOffset = wasm.HEAPU32[tensorDataIndex++];\n const dimsOffset = wasm.HEAPU32[tensorDataIndex++];\n const dimsLength = wasm.HEAPU32[tensorDataIndex++];\n const dims = [];\n for (let i = 0; i < dimsLength; i++) {\n dims.push(wasm.HEAPU32[dimsOffset / 4 + i]);\n }\n wasm._OrtFree(dimsOffset);\n\n const size = dims.reduce((a, b) => a * b, 1);\n type = tensorDataTypeEnumToString(dataType);\n\n const preferredLocation = ioBindingState?.outputPreferredLocations[outputIndices[i]];\n\n if (type === 'string') {\n if (preferredLocation === 'gpu-buffer') {\n throw new Error('String tensor is not supported on GPU.');\n }\n const stringData: string[] = [];\n let dataIndex = dataOffset / 4;\n for (let i = 0; i < size; i++) {\n const offset = wasm.HEAPU32[dataIndex++];\n const maxBytesToRead = i === size - 1 ? undefined : wasm.HEAPU32[dataIndex] - offset;\n stringData.push(wasm.UTF8ToString(offset, maxBytesToRead));\n }\n output.push([type, dims, stringData, 'cpu']);\n } else {\n // If a certain output's preferred location is GPU but the tensor is empty, we still need to create a CPU\n // tensor for it. There is no mapping GPU buffer for an empty tensor.\n if (preferredLocation === 'gpu-buffer' && size > 0) {\n const getBuffer = wasm.jsepGetBuffer;\n if (!getBuffer) {\n throw new Error('preferredLocation \"gpu-buffer\" is not supported without using WebGPU.');\n }\n const gpuBuffer = getBuffer(dataOffset);\n const elementSize = getTensorElementSize(dataType);\n if (elementSize === undefined || !isGpuBufferSupportedType(type)) {\n throw new Error(`Unsupported data type: ${type}`);\n }\n\n // do not release the tensor right now. it will be released when user calls tensor.dispose().\n keepOutputTensor = true;\n\n output.push([\n type, dims, {\n gpuBuffer,\n download: wasm.jsepCreateDownloader!(gpuBuffer, size * elementSize, type),\n dispose: () => {\n wasm._OrtReleaseTensor(tensor);\n }\n },\n 'gpu-buffer'\n ]);\n } else {\n const typedArrayConstructor = tensorTypeToTypedArrayConstructor(type);\n const data = new typedArrayConstructor(size);\n new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n .set(wasm.HEAPU8.subarray(dataOffset, dataOffset + data.byteLength));\n output.push([type, dims, data, 'cpu']);\n }\n }\n } finally {\n wasm.stackRestore(beforeGetTensorDataStack);\n if (type === 'string' && dataOffset) {\n wasm._free(dataOffset);\n }\n if (!keepOutputTensor) {\n wasm._OrtReleaseTensor(tensor);\n }\n }\n }\n\n if (ioBindingState && !enableGraphCapture) {\n wasm._OrtClearBoundOutputs(ioBindingState.handle);\n activeSessions.set(\n sessionId,\n [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, ioBindingState, enableGraphCapture, false]);\n }\n return output;\n } finally {\n wasm.stackRestore(beforeRunStack);\n\n inputTensorHandles.forEach(v => wasm._OrtReleaseTensor(v));\n outputTensorHandles.forEach(v => wasm._OrtReleaseTensor(v));\n inputOutputAllocs.forEach(p => wasm._free(p));\n\n if (runOptionsHandle !== 0) {\n wasm._OrtReleaseRunOptions(runOptionsHandle);\n }\n runOptionsAllocs.forEach(p => wasm._free(p));\n }\n};\n\n/**\n * end profiling\n */\nexport const endProfiling = (sessionId: number): void => {\n const wasm = getInstance();\n const session = activeSessions.get(sessionId);\n if (!session) {\n throw new Error('invalid session id');\n }\n const sessionHandle = session[0];\n\n // profile file name is not used yet, but it must be freed.\n const profileFileName = wasm._OrtEndProfiling(sessionHandle);\n if (profileFileName === 0) {\n checkLastError('Can\\'t get an profile file name.');\n }\n wasm._OrtFree(profileFileName);\n};\n\nexport const extractTransferableBuffers = (tensors: readonly SerializableTensorMetadata[]): ArrayBufferLike[] => {\n const buffers: ArrayBufferLike[] = [];\n for (const tensor of tensors) {\n const data = tensor[2];\n if (!Array.isArray(data) && 'buffer' in data) {\n buffers.push(data.buffer);\n }\n }\n return buffers;\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env, InferenceSession} from 'onnxruntime-common';\n\nimport {OrtWasmMessage, SerializableInternalBuffer, SerializableSessionMetadata, SerializableTensorMetadata, TensorMetadata} from './proxy-messages';\nimport * as core from './wasm-core-impl';\nimport {initializeWebAssembly} from './wasm-factory';\nimport {importProxyWorker} from './wasm-utils-import';\n\nconst isProxy = (): boolean => !!env.wasm.proxy && typeof document !== 'undefined';\nlet proxyWorker: Worker|undefined;\nlet initializing = false;\nlet initialized = false;\nlet aborted = false;\nlet temporaryObjectUrl: string|undefined;\n\ntype PromiseCallbacks = [resolve: (result: T) => void, reject: (reason: unknown) => void];\nlet initWasmCallbacks: PromiseCallbacks;\nconst queuedCallbacks: Map>> = new Map();\n\nconst enqueueCallbacks = (type: OrtWasmMessage['type'], callbacks: PromiseCallbacks): void => {\n const queue = queuedCallbacks.get(type);\n if (queue) {\n queue.push(callbacks);\n } else {\n queuedCallbacks.set(type, [callbacks]);\n }\n};\n\nconst ensureWorker = (): void => {\n if (initializing || !initialized || aborted || !proxyWorker) {\n throw new Error('worker not ready');\n }\n};\n\nconst onProxyWorkerMessage = (ev: MessageEvent): void => {\n switch (ev.data.type) {\n case 'init-wasm':\n initializing = false;\n if (ev.data.err) {\n aborted = true;\n initWasmCallbacks[1](ev.data.err);\n } else {\n initialized = true;\n initWasmCallbacks[0]();\n }\n if (temporaryObjectUrl) {\n URL.revokeObjectURL(temporaryObjectUrl);\n temporaryObjectUrl = undefined;\n }\n break;\n case 'init-ep':\n case 'copy-from':\n case 'create':\n case 'release':\n case 'run':\n case 'end-profiling': {\n const callbacks = queuedCallbacks.get(ev.data.type)!;\n if (ev.data.err) {\n callbacks.shift()![1](ev.data.err);\n } else {\n callbacks.shift()![0](ev.data.out!);\n }\n break;\n }\n default:\n }\n};\n\n\nexport const initializeWebAssemblyAndOrtRuntime = async(): Promise => {\n if (initialized) {\n return;\n }\n if (initializing) {\n throw new Error('multiple calls to \\'initWasm()\\' detected.');\n }\n if (aborted) {\n throw new Error('previous call to \\'initWasm()\\' failed.');\n }\n\n initializing = true;\n\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n return new Promise((resolve, reject) => {\n proxyWorker?.terminate();\n\n void importProxyWorker().then(([objectUrl, worker]) => {\n try {\n proxyWorker = worker;\n proxyWorker.onerror = (ev: ErrorEvent) => reject(ev);\n proxyWorker.onmessage = onProxyWorkerMessage;\n initWasmCallbacks = [resolve, reject];\n const message: OrtWasmMessage = {type: 'init-wasm', in : env};\n proxyWorker.postMessage(message);\n temporaryObjectUrl = objectUrl;\n } catch (e) {\n reject(e);\n }\n }, reject);\n });\n\n } else {\n try {\n await initializeWebAssembly(env.wasm);\n await core.initRuntime(env);\n initialized = true;\n } catch (e) {\n aborted = true;\n throw e;\n } finally {\n initializing = false;\n }\n }\n};\n\nexport const initializeOrtEp = async(epName: string): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('init-ep', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'init-ep', in : {epName, env}};\n proxyWorker!.postMessage(message);\n });\n } else {\n await core.initEp(env, epName);\n }\n};\n\nexport const copyFromExternalBuffer = async(buffer: Uint8Array): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('copy-from', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'copy-from', in : {buffer}};\n proxyWorker!.postMessage(message, [buffer.buffer]);\n });\n } else {\n return core.copyFromExternalBuffer(buffer);\n }\n};\n\nexport const createSession =\n async(model: SerializableInternalBuffer|Uint8Array, options?: InferenceSession.SessionOptions):\n Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n // check unsupported options\n if (options?.preferredOutputLocation) {\n throw new Error('session option \"preferredOutputLocation\" is not supported for proxy.');\n }\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('create', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'create', in : {model, options: {...options}}};\n const transferable: Transferable[] = [];\n if (model instanceof Uint8Array) {\n transferable.push(model.buffer);\n }\n proxyWorker!.postMessage(message, transferable);\n });\n } else {\n return core.createSession(model, options);\n }\n };\n\nexport const releaseSession = async(sessionId: number): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('release', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'release', in : sessionId};\n proxyWorker!.postMessage(message);\n });\n } else {\n core.releaseSession(sessionId);\n }\n};\n\nexport const run = async(\n sessionId: number, inputIndices: number[], inputs: TensorMetadata[], outputIndices: number[],\n outputs: Array, options: InferenceSession.RunOptions): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n // check inputs location\n if (inputs.some(t => t[3] !== 'cpu')) {\n throw new Error('input tensor on GPU is not supported for proxy.');\n }\n // check outputs location\n if (outputs.some(t => t)) {\n throw new Error('pre-allocated output tensor is not supported for proxy.');\n }\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('run', [resolve, reject]);\n const serializableInputs = inputs as SerializableTensorMetadata[]; // every input is on CPU.\n const message: OrtWasmMessage =\n {type: 'run', in : {sessionId, inputIndices, inputs: serializableInputs, outputIndices, options}};\n proxyWorker!.postMessage(message, core.extractTransferableBuffers(serializableInputs));\n });\n } else {\n return core.run(sessionId, inputIndices, inputs, outputIndices, outputs, options);\n }\n};\n\nexport const endProfiling = async(sessionId: number): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('end-profiling', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'end-profiling', in : sessionId};\n proxyWorker!.postMessage(message);\n });\n } else {\n core.endProfiling(sessionId);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession, InferenceSessionHandler, SessionHandler, Tensor, TRACE_FUNC_BEGIN, TRACE_FUNC_END} from 'onnxruntime-common';\n\nimport {SerializableInternalBuffer, TensorMetadata} from './proxy-messages';\nimport {copyFromExternalBuffer, createSession, endProfiling, releaseSession, run} from './proxy-wrapper';\nimport {isGpuBufferSupportedType} from './wasm-common';\nimport {isNode} from './wasm-utils-env';\nimport {loadFile} from './wasm-utils-load-file';\n\nexport const encodeTensorMetadata = (tensor: Tensor, getName: () => string): TensorMetadata => {\n switch (tensor.location) {\n case 'cpu':\n return [tensor.type, tensor.dims, tensor.data, 'cpu'];\n case 'gpu-buffer':\n return [tensor.type, tensor.dims, {gpuBuffer: tensor.gpuBuffer}, 'gpu-buffer'];\n default:\n throw new Error(`invalid data location: ${tensor.location} for ${getName()}`);\n }\n};\n\nexport const decodeTensorMetadata = (tensor: TensorMetadata): Tensor => {\n switch (tensor[3]) {\n case 'cpu':\n return new Tensor(tensor[0], tensor[2], tensor[1]);\n case 'gpu-buffer': {\n const dataType = tensor[0];\n if (!isGpuBufferSupportedType(dataType)) {\n throw new Error(`not supported data type: ${dataType} for deserializing GPU tensor`);\n }\n const {gpuBuffer, download, dispose} = tensor[2];\n return Tensor.fromGpuBuffer(gpuBuffer, {dataType, dims: tensor[1], download, dispose});\n }\n default:\n throw new Error(`invalid data location: ${tensor[3]}`);\n }\n};\n\nexport class OnnxruntimeWebAssemblySessionHandler implements InferenceSessionHandler {\n private sessionId: number;\n\n inputNames: string[];\n outputNames: string[];\n\n async fetchModelAndCopyToWasmMemory(path: string): Promise {\n // fetch model from url and move to wasm heap.\n return copyFromExternalBuffer(await loadFile(path));\n }\n\n async loadModel(pathOrBuffer: string|Uint8Array, options?: InferenceSession.SessionOptions): Promise {\n TRACE_FUNC_BEGIN();\n let model: Parameters[0];\n\n if (typeof pathOrBuffer === 'string') {\n if (isNode) {\n // node\n model = await loadFile(pathOrBuffer);\n } else {\n // browser\n // fetch model and copy to wasm heap.\n model = await this.fetchModelAndCopyToWasmMemory(pathOrBuffer);\n }\n } else {\n model = pathOrBuffer;\n }\n\n [this.sessionId, this.inputNames, this.outputNames] = await createSession(model, options);\n TRACE_FUNC_END();\n }\n\n async dispose(): Promise {\n return releaseSession(this.sessionId);\n }\n\n async run(feeds: SessionHandler.FeedsType, fetches: SessionHandler.FetchesType, options: InferenceSession.RunOptions):\n Promise {\n TRACE_FUNC_BEGIN();\n const inputArray: Tensor[] = [];\n const inputIndices: number[] = [];\n Object.entries(feeds).forEach(kvp => {\n const name = kvp[0];\n const tensor = kvp[1];\n const index = this.inputNames.indexOf(name);\n if (index === -1) {\n throw new Error(`invalid input '${name}'`);\n }\n inputArray.push(tensor);\n inputIndices.push(index);\n });\n\n const outputArray: Array = [];\n const outputIndices: number[] = [];\n Object.entries(fetches).forEach(kvp => {\n const name = kvp[0];\n const tensor = kvp[1];\n const index = this.outputNames.indexOf(name);\n if (index === -1) {\n throw new Error(`invalid output '${name}'`);\n }\n outputArray.push(tensor);\n outputIndices.push(index);\n });\n\n const inputs =\n inputArray.map((t, i) => encodeTensorMetadata(t, () => `input \"${this.inputNames[inputIndices[i]]}\"`));\n const outputs = outputArray.map(\n (t, i) => t ? encodeTensorMetadata(t, () => `output \"${this.outputNames[outputIndices[i]]}\"`) : null);\n\n const results = await run(this.sessionId, inputIndices, inputs, outputIndices, outputs, options);\n\n const resultMap: SessionHandler.ReturnType = {};\n for (let i = 0; i < results.length; i++) {\n resultMap[this.outputNames[outputIndices[i]]] = outputArray[i] ?? decodeTensorMetadata(results[i]);\n }\n TRACE_FUNC_END();\n return resultMap;\n }\n\n startProfiling(): void {\n // TODO: implement profiling\n }\n\n endProfiling(): void {\n void endProfiling(this.sessionId);\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Backend, env, InferenceSession, InferenceSessionHandler} from 'onnxruntime-common';\n\nimport {initializeOrtEp, initializeWebAssemblyAndOrtRuntime} from './wasm/proxy-wrapper';\nimport {OnnxruntimeWebAssemblySessionHandler} from './wasm/session-handler-inference';\nimport {scriptSrc} from './wasm/wasm-utils-import';\n\n/**\n * This function initializes all flags for WebAssembly.\n *\n * Those flags are accessible from `ort.env.wasm`. Users are allow to set those flags before the first inference session\n * being created, to override default value.\n */\nexport const initializeFlags = (): void => {\n if (typeof env.wasm.initTimeout !== 'number' || env.wasm.initTimeout < 0) {\n env.wasm.initTimeout = 0;\n }\n\n if (env.wasm.simd === false) {\n // eslint-disable-next-line no-console\n console.warn(\n 'Deprecated property \"env.wasm.simd\" is set to false. ' +\n 'non-SIMD build is no longer provided, and this setting will be ignored.');\n }\n\n if (typeof env.wasm.proxy !== 'boolean') {\n env.wasm.proxy = false;\n }\n\n if (typeof env.wasm.trace !== 'boolean') {\n env.wasm.trace = false;\n }\n\n if (typeof env.wasm.numThreads !== 'number' || !Number.isInteger(env.wasm.numThreads) || env.wasm.numThreads <= 0) {\n // The following logic only applies when `ort.env.wasm.numThreads` is not set by user. We will always honor user's\n // setting if it is provided.\n\n // Browser: when crossOriginIsolated is false, SharedArrayBuffer is not available so WebAssembly threads will not\n // work. In this case, we will set numThreads to 1.\n //\n // There is an exception: when the browser is configured to force-enable SharedArrayBuffer (e.g. Chromuim with\n // --enable-features=SharedArrayBuffer), it is possible that `self.crossOriginIsolated` is false and\n // SharedArrayBuffer is available at the same time. This is usually for testing. In this case, we will still set\n // numThreads to 1 here. If we want to enable multi-threading in test, we should set `ort.env.wasm.numThreads` to a\n // value greater than 1.\n if (typeof self !== 'undefined' && !self.crossOriginIsolated) {\n env.wasm.numThreads = 1;\n } else {\n const numCpuLogicalCores =\n typeof navigator === 'undefined' ? require('node:os').cpus().length : navigator.hardwareConcurrency;\n env.wasm.numThreads = Math.min(4, Math.ceil((numCpuLogicalCores || 1) / 2));\n }\n }\n\n if (!BUILD_DEFS.DISABLE_DYNAMIC_IMPORT) {\n // overwrite wasm paths override if not set\n if (env.wasm.wasmPaths === undefined && scriptSrc && scriptSrc.indexOf('blob:') !== 0) {\n env.wasm.wasmPaths = scriptSrc.substring(0, scriptSrc.lastIndexOf('/') + 1);\n }\n }\n};\n\nexport class OnnxruntimeWebAssemblyBackend implements Backend {\n /**\n * This function initializes the WebAssembly backend.\n *\n * This function will be called only once for each backend name. It will be called the first time when\n * `ort.InferenceSession.create()` is called with a registered backend name.\n *\n * @param backendName - the registered backend name.\n */\n async init(backendName: string): Promise {\n // populate wasm flags\n initializeFlags();\n\n // init wasm\n await initializeWebAssemblyAndOrtRuntime();\n\n // performe EP specific initialization\n await initializeOrtEp(backendName);\n }\n createInferenceSessionHandler(path: string, options?: InferenceSession.SessionOptions):\n Promise;\n createInferenceSessionHandler(buffer: Uint8Array, options?: InferenceSession.SessionOptions):\n Promise;\n async createInferenceSessionHandler(pathOrBuffer: string|Uint8Array, options?: InferenceSession.SessionOptions):\n Promise {\n const handler = new OnnxruntimeWebAssemblySessionHandler();\n await handler.loadModel(pathOrBuffer, options);\n return Promise.resolve(handler);\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {OnnxruntimeWebAssemblyBackend} from './backend-wasm';\nexport const wasmBackend = new OnnxruntimeWebAssemblyBackend();\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/* eslint-disable @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports */\n\n// We use \"require\" instead of \"import\" here because import statement must be put in top level. Our current code does\n// not allow bundler to tree-shaking code as expected because some codes are treated as having side effects.\n// So we import code inside the if-clause to allow bundler remove the code safely.\n\nexport * from 'onnxruntime-common';\nimport * as ort from 'onnxruntime-common';\nexport default ort;\n\nimport {registerBackend, env} from 'onnxruntime-common';\nimport {version} from './version';\n\nif (!BUILD_DEFS.DISABLE_WEBGL) {\n const onnxjsBackend = require('./backend-onnxjs').onnxjsBackend;\n registerBackend('webgl', onnxjsBackend, -10);\n}\n\nif (!BUILD_DEFS.DISABLE_WASM) {\n const wasmBackend = BUILD_DEFS.DISABLE_TRAINING ? require('./backend-wasm-inference').wasmBackend :\n require('./backend-wasm-training').wasmBackend;\n if (!BUILD_DEFS.DISABLE_JSEP) {\n registerBackend('webgpu', wasmBackend, 5);\n registerBackend('webnn', wasmBackend, 5);\n }\n registerBackend('cpu', wasmBackend, 10);\n registerBackend('wasm', wasmBackend, 10);\n}\n\nObject.defineProperty(env.versions, 'web', {value: version, enumerable: true});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// This file is generated by /js/scripts/update-version.ts\n// Do not modify file content manually.\n\nexport const version = '1.19.0';\n"], - "mappings": "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", - "names": ["backends", "backendsSortedByPriority", "registerBackend", "tryResolveAndInitializeBackend", "resolveBackendAndExecutionProviders", "init_backend_impl", "__esmMin", "name", "backend", "priority", "currentBackend", "i", "backendName", "backendInfo", "isInitializing", "e", "options", "eps", "backendHints", "backendNames", "errors", "availableBackendNames", "resolveResult", "err", "filteredEps", "target", "prop", "init_backend", "__esmMin", "init_backend_impl", "version", "init_version", "__esmMin", "logLevelValue", "env", "init_env_impl", "__esmMin", "init_version", "version", "value", "env", "init_env", "__esmMin", "init_env_impl", "tensorToDataURL", "tensorToImageData", "init_tensor_conversion_impl", "__esmMin", "tensor", "options", "canvas", "pixels2DContext", "width", "height", "inputformat", "norm", "normMean", "normBias", "stride", "rTensorPointer", "gTensorPointer", "bTensorPointer", "aTensorPointer", "i", "j", "R", "G", "B", "A", "image", "channels", "step", "rImagePointer", "gImagePointer", "bImagePointer", "aImagePointer", "bufferToTensor", "tensorFromImage", "tensorFromTexture", "tensorFromGpuBuffer", "tensorFromPinnedBuffer", "init_tensor_factory_impl", "__esmMin", "init_tensor_impl", "buffer", "options", "height", "width", "norm", "normMean", "normBias", "inputformat", "outputformat", "stride", "float32Data", "step", "rImagePointer", "gImagePointer", "bImagePointer", "aImagePointer", "rTensorPointer", "gTensorPointer", "bTensorPointer", "aTensorPointer", "i", "Tensor", "image", "isHTMLImageEle", "isImageDataEle", "isImageBitmap", "isString", "data", "bufferToTensorOptions", "createCanvas", "createCanvasContext", "canvas", "pixels2DContext", "tempCanvas", "resolve", "reject", "context", "newImage", "img", "texture", "download", "dispose", "dims", "gpuBuffer", "dataType", "type", "NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP", "NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP", "isTypedArrayChecked", "checkTypedArray", "init_tensor_impl_type_mapping", "__esmMin", "isBigInt64ArrayAvailable", "isBigUint64ArrayAvailable", "isFloat16ArrayAvailable", "calculateSize", "tensorReshape", "init_tensor_utils_impl", "__esmMin", "init_tensor_impl", "dims", "size", "i", "dim", "tensor", "Tensor", "Tensor", "init_tensor_impl", "__esmMin", "init_tensor_conversion_impl", "init_tensor_factory_impl", "init_tensor_impl_type_mapping", "init_tensor_utils_impl", "arg0", "arg1", "arg2", "checkTypedArray", "type", "dims", "expectedTypedArrayConstructor", "NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP", "data", "maybeDims", "typedArrayConstructor", "firstElementType", "mappedType", "NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP", "size", "calculateSize", "image", "options", "tensorFromImage", "texture", "tensorFromTexture", "gpuBuffer", "tensorFromGpuBuffer", "buffer", "tensorFromPinnedBuffer", "tensorToDataURL", "tensorToImageData", "releaseData", "tensorReshape", "Tensor", "init_tensor", "__esmMin", "init_tensor_impl", "TRACE", "TRACE_FUNC", "TRACE_FUNC_BEGIN", "TRACE_FUNC_END", "init_trace", "__esmMin", "init_env_impl", "deviceType", "label", "env", "msg", "extraMsg", "stack", "hasTraceFunc", "i", "InferenceSession", "init_inference_session_impl", "__esmMin", "init_backend_impl", "init_tensor", "init_trace", "_InferenceSession", "handler", "feeds", "arg1", "arg2", "TRACE_FUNC_BEGIN", "fetches", "options", "Tensor", "isFetchesEmpty", "name", "isFetches", "arg1Keys", "v", "results", "returnValue", "key", "result", "TRACE_FUNC_END", "arg0", "arg3", "filePathOrUint8Array", "buffer", "byteOffset", "byteLength", "backend", "optionsWithValidatedEPs", "resolveBackendAndExecutionProviders", "InferenceSession", "init_inference_session", "__esmMin", "init_inference_session_impl", "init_tensor_conversion", "__esmMin", "init_tensor_factory", "__esmMin", "init_onnx_model", "__esmMin", "init_onnx_value", "__esmMin", "noBackendErrMsg", "TrainingSession", "init_training_session_impl", "__esmMin", "init_backend_impl", "init_tensor", "_TrainingSession", "handler", "hasOptimizerModel", "hasEvalModel", "trainingOptions", "sessionOptions", "evalModel", "optimizerModel", "options", "backend", "optionsWithValidatedEPs", "resolveBackendAndExecutionProviders", "inputNames", "outputNames", "feeds", "arg1", "arg2", "fetches", "Tensor", "isFetchesEmpty", "name", "isFetches", "arg1Keys", "v", "results", "returnValue", "key", "result", "trainableOnly", "array", "paramsSize", "TrainingSession", "init_training_session", "__esmMin", "init_training_session_impl", "esm_exports", "__export", "InferenceSession", "TRACE", "TRACE_FUNC_BEGIN", "TRACE_FUNC_END", "Tensor", "TrainingSession", "env", "registerBackend", "init_esm", "__esmMin", "init_backend", "init_env", "init_inference_session", "init_tensor", "init_tensor_conversion", "init_tensor_factory", "init_trace", "init_onnx_model", "init_onnx_value", "init_training_session", "init_wasm_utils_env", "__esmMin", "main_exports", "__export", "main_default", "WORKER_NAME", "isProxyWorker", "init_main", "__esmMin", "init_wasm_core_impl", "init_wasm_factory", "init_wasm_utils_import", "ev", "type", "message", "initializeWebAssembly", "initRuntime", "err", "epName", "env", "initEp", "buffer", "bufferData", "copyFromExternalBuffer", "model", "options", "createSession", "sessionMetadata", "releaseSession", "sessionId", "inputIndices", "inputs", "outputIndices", "run", "outputs", "o", "extractTransferableBuffers", "endProfiling", "urlOverride", "scriptSrc", "ort_wasm_simd_threaded_jsep_exports", "__export", "ort_wasm_simd_threaded_jsep_default", "r", "e", "init_ort_wasm_simd_threaded_jsep", "__esmMin", "k", "R", "Y", "n", "P", "a", "D", "F", "B", "s", "I", "u", "U", "f", "G", "l", "c", "d", "b", "g", "m", "p", "h", "v", "t", "Ye", "o", "i", "Qe", "y", "w", "A", "_", "C", "O", "T", "S", "E", "Dn", "x", "wn", "He", "Tr", "Ar", "M", "mn", "Sr", "hn", "On", "Re", "An", "or", "N", "H", "j", "$", "z", "L", "V", "q", "J", "X", "Q", "Z", "K", "rr", "er", "tr", "nr", "ar", "sr", "Er", "Mr", "Rr", "Pr", "Ir", "Ur", "jr", "$r", "Gr", "zr", "Yr", "Lr", "Vr", "qr", "Jr", "Zr", "oe", "se", "me", "he", "ve", "ye", "we", "Ee", "xe", "Me", "ke", "Pe", "Fe", "Be", "Ie", "$e", "rt", "tt", "ot", "le", "st", "ct", "dt", "bt", "gt", "mt", "pt", "ht", "vt", "yt", "wt", "At", "_t", "St", "Wt", "Et", "xt", "Mt", "Ht", "Rt", "Pt", "Dt", "Ft", "It", "Ut", "Bt", "jt", "$t", "Lt", "Vt", "Qt", "Zt", "mr", "Kt", "rn", "en", "nn", "un", "fn", "ir", "Hr", "Ke", "ur", "fr", "lr", "pr", "Cr", "_r", "hr", "yr", "cr", "dr", "xn", "En", "_n", "Wn", "br", "gr", "vr", "wr", "Cn", "Or", "Sn", "Mn", "Wr", "xr", "kr", "Nr", "Dr", "Fr", "Br", "Xr", "Qr", "Kr", "re", "ee", "te", "ne", "ae", "ie", "ue", "fe", "ce", "de", "be", "ge", "pe", "yn", "vn", "Ae", "_e", "Ce", "Oe", "Te", "Se", "We", "Ne", "Tn", "De", "dn", "Ue", "gn", "je", "Ge", "ze", "Le", "Ve", "qe", "Je", "Xe", "Ze", "Hn", "bn", "kn", "Rn", "et", "nt", "at", "it", "ut", "ft", "lt", "Ct", "Ot", "Tt", "kt", "Nt", "Gt", "zt", "Yt", "qt", "Jt", "Xt", "tn", "an", "on", "sn", "ln", "cn", "Nn", "pn", "Pn", "scriptSrc", "origin", "isSameOrigin", "preload", "createProxyWorker", "importProxyWorker", "embeddedWasmModule", "importWasmModule", "init_wasm_utils_import", "__esmMin", "init_wasm_utils_env", "filename", "prefixOverride", "baseUrl", "absoluteUrl", "blob", "url", "urlOverride", "isMultiThreaded", "wasm", "initialized", "initializing", "aborted", "isMultiThreadSupported", "isSimdSupported", "initializeWebAssembly", "getInstance", "init_wasm_factory", "__esmMin", "init_wasm_utils_import", "flags", "timeout", "numThreads", "multiThreadSupported", "wasmPaths", "wasmPrefixOverride", "mjsPathOverrideFlag", "mjsPathOverride", "wasmPathOverrideFlag", "wasmPathOverride", "objectUrl", "ortWasmFactory", "importWasmModule", "isTimeout", "tasks", "resolve", "reject", "config", "fileName", "scriptDirectory", "module", "what", "allocWasmString", "iterateExtraOptions", "checkLastError", "init_wasm_utils", "__esmMin", "init_wasm_factory", "data", "allocs", "wasm", "getInstance", "dataLength", "dataOffset", "options", "prefix", "seen", "handler", "key", "value", "name", "message", "stack", "paramsOffset", "errorCode", "errorMessagePointer", "errorMessage", "setRunOptions", "init_run_options", "__esmMin", "init_wasm_factory", "init_wasm_utils", "options", "wasm", "getInstance", "runOptionsHandle", "allocs", "runOptions", "tagDataOffset", "allocWasmString", "checkLastError", "iterateExtraOptions", "key", "value", "keyDataOffset", "valueDataOffset", "e", "alloc", "getGraphOptimzationLevel", "getExecutionMode", "appendDefaultOptions", "setExecutionProviders", "setSessionOptions", "init_session_options", "__esmMin", "init_wasm_factory", "init_wasm_utils", "graphOptimizationLevel", "executionMode", "options", "session", "ep", "sessionOptionsHandle", "executionProviders", "allocs", "epName", "deviceType", "keyDataOffset", "allocWasmString", "valueDataOffset", "getInstance", "checkLastError", "webgpuOptions", "epNameDataOffset", "wasm", "sessionOptions", "logIdDataOffset", "logSeverityLevel", "logVerbosityLevel", "optimizedModelFilePathOffset", "name", "value", "nameOffset", "iterateExtraOptions", "key", "e", "alloc", "tensorDataTypeStringToEnum", "tensorDataTypeEnumToString", "getTensorElementSize", "tensorTypeToTypedArrayConstructor", "logLevelStringToEnum", "isGpuBufferSupportedType", "dataLocationStringToEnum", "init_wasm_common", "__esmMin", "type", "typeProto", "dateType", "logLevel", "location", "loadFile", "init_wasm_utils_load_file", "__esmMin", "init_wasm_utils_env", "file", "readFile", "e", "createReadStream", "stream", "chunks", "chunk", "response", "contentLengthHeader", "fileSize", "reader", "buffer", "pages", "offset", "done", "value", "chunkSize", "logLevelPrefix", "doLog", "configLogLevel", "debug", "configureLogger", "LOG", "LOG_DEBUG", "init_log", "__esmMin", "init_wasm_common", "level", "message", "$configLogLevel", "$debug", "logLevel", "msg", "messageLevel", "logLevelStringToEnum", "configLevel", "args", "createView", "init_tensor_view", "__esmMin", "init_wasm_common", "dataBuffer", "type", "tensorTypeToTypedArrayConstructor", "init_types", "__esmMin", "bucketFreelist", "bucketArr", "calcNormalizedBufferSize", "calcBucketBufferSize", "guid", "createNewGpuDataId", "downloadGpuData", "GpuDataManagerImpl", "createGpuDataManager", "init_gpu_data_manager", "__esmMin", "init_log", "init_types", "size", "idx", "sizeForBucket", "backend", "gpuBuffer", "originalSize", "getTargetBuffer", "bufferSize", "gpuReadBuffer", "commandEncoder", "arrayBuffer", "targetBuffer", "key", "id", "data", "srcArrayBuffer", "srcOffset", "srcLength", "gpuDataCache", "gpuBufferForUploading", "LOG_DEBUG", "sourceId", "destinationId", "sourceGpuDataCache", "destinationGpuDataCache", "buffer", "previousBuffer", "usage", "isStorage", "isUniform", "buffers", "gpuData", "cachedData", "maxInFreeList", "freelist", "capturedBuffers", "storage", "sessionId", "pendingBuffers", "args", "AttributeWithCacheKeyImpl", "createAttributeWithCacheKey", "init_attribute_with_cache_key", "__esmMin", "attribute", "name", "MatMulUtil", "BroadcastUtil", "ShapeUtil", "PoolConvUtil", "GemmUtil", "MIN_CLIP", "MAX_CLIP", "init_util", "__esmMin", "a", "b", "adims", "bdims", "isMatMul", "arank", "brank", "crank", "cdims", "cShapeMatMul", "i", "aLen", "bLen", "max", "shape", "finalShape", "inputRank", "finalRank", "_ShapeUtil", "dims", "size", "rank", "newDims", "axis", "start", "end", "strides", "tensorRank", "axes", "x", "perm", "v", "pad", "shape1", "shape2", "_PoolConvUtil", "isGlobalOperator", "inputDims", "kernelShape", "dilations", "pads", "dim", "isChannelLast", "autoPad", "outputDims", "filterDims", "inSize", "stride", "dilation", "kernel", "padHeadIndex", "padTailIndex", "dkernel", "padNeeded", "leftShape", "transLeft", "rightShape", "transRight", "biasShape", "M", "K", "N", "kDim", "WORKGROUP_SIZE", "getWgslMappedType", "tensorTypeToWsglStorageType", "tensorTypeToWsglValueType", "createTensorShapeVariables", "getMaxComponents", "fillVector", "castToF32", "sumVector", "getElementAt", "createIndicesHelper", "inputVariable", "outputVariable", "internalVariable", "ShaderHelperImpl", "createShaderHelper", "getBroadcastDims", "init_common", "__esmMin", "init_wasm_common", "init_util", "type", "components", "mappedType", "dims", "programUniforms", "dim", "ShapeUtil", "size", "dataType", "value", "name", "index", "length", "tensorType", "shapeOrRank", "usage", "useUniform", "rank", "rankIdentity", "indicesType", "valueType", "storageType", "normalizeDim", "implementationUsed", "uniformPrefix", "shape", "strides", "o2iSnippet", "i", "offsetToIndicesImplementation", "offsetToIndices", "varOffset", "offsets", "indicesToOffsetImplementation", "indicesToOffset", "varIndices", "indices", "init", "indicesGet", "idx", "indicesSet", "broadcastedIndicesToOffsetImplementation", "broadcastedIndicesToOffset", "output", "implKey", "setByOffset", "offset", "getByOffset", "getByIndicesImplementation", "getImplementation", "functionParams", "dimsParams", "get", "normalizedIndices", "getByIndices", "setByIndicesImplementation", "setImplementation", "impls", "needShapeStrides", "impl", "indicesAndValue", "normalizedDispatchGroup", "limits", "workgroupSize", "workgroupSizeX", "workgroupSizeY", "workgroupSizeZ", "is1DimensionDispatch", "paramList", "globalIdxDefinition", "variable", "bindingIndex", "access", "variables", "v", "additionalUniforms", "uniformSnippets", "typeTemp", "uniformWgslTypeToDataType", "u", "dispatchGroup", "inShape", "outShape", "inRank", "validateInputs", "getAdjustedPerm", "getOutputShape", "permFunctionBody", "createTransposeProgramInfo", "transpose", "parseTransposeAttributes", "init_transpose", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "inputRank", "perm", "inputShape", "ShapeUtil", "rank", "input", "output", "reverseFunc", "inputTensor", "permAttr", "inputDataType", "outputShape", "outputVariable", "inputVariable", "getShaderSource", "wgslType", "workgroupSize", "shaderHelper", "outputSize", "createTensorShapeVariables", "context", "attributes", "createAttributeWithCacheKey", "reduceOps", "reduceSharedOps", "reduceInitValues", "reduceOutputValues", "getInnerMostAxes", "computeOutAndReduceShapes", "expandShapeToKeepDim", "areAxesInnerMostDims", "getAxesPermutation", "createReduceSharedProgramInfo", "reduceCommon", "reduceMeanShared", "reduceL1Shared", "reduceL2Shared", "reduceLogSumExpShared", "reduceMaxShared", "reduceMinShared", "reduceProdShared", "reduceSumShared", "reduceSumSquareShared", "reduceLogSumShared", "init_reduce_shared", "__esmMin", "init_wasm_common", "init_util", "init_common", "init_reduce", "init_transpose", "numInnerAxes", "rank", "res", "i", "shape", "axes", "outputShape", "dim", "reduceShape", "expandShape", "shapeIdx", "axis", "name", "shaderCache", "inputs", "reduceType", "outputDataType", "inputShape", "outputSize", "ShapeUtil", "reduceSize", "input", "inputVariable", "output", "outputVariable", "workgroupSize", "sharedMemorySnippet", "shaderHelper", "context", "attributes", "updatedAttributes", "createReduceAttributesFromInputs", "updatedAxes", "_dim", "normalizeAxes", "permutedAxes", "createTransposeProgramInfo", "finalOutputShape", "validateInputs", "noOp", "createReduceProgramInfo", "createReduceAttributesFromInputs", "runReduceProgram", "reduceLogSumNaive", "reduceL1Naive", "reduceL2Naive", "reduceLogSumExpNaive", "reduceMaxNaive", "reduceMeanNaive", "reduceMinNaive", "reduceProdNaive", "reduceSumNaive", "reduceSumSquareNaive", "useNaiveReduceMethod", "reduceMean", "reduceL1", "reduceL2", "reduceLogSumExp", "reduceMax", "reduceMin", "reduceProd", "reduceSum", "reduceSumSquare", "reduceLogSum", "init_reduce", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "init_reduce_shared", "inputs", "input", "name", "shaderCache", "reduceOp", "axesInput", "outputDataType", "keepDims", "noopWithEmptyAxes", "outputShape", "inputShape", "inputRank", "axes", "ShapeUtil", "reduceOnAllAxes", "d", "i", "outputRank", "outputSize", "shaderHelper", "idxCopy", "inputVariable", "output", "outputVariable", "ops", "reduceOps", "k", "l", "createTensorShapeVariables", "attributes", "v", "createAttributeWithCacheKey", "context", "updatedAttributes", "_output", "idxZero", "size", "shape", "reduceSize", "dim", "reduceMeanShared", "reduceL1Shared", "reduceL2Shared", "reduceLogSumExpShared", "reduceMaxShared", "reduceMinShared", "reduceProdShared", "reduceSumShared", "reduceSumSquareShared", "reduceLogSumShared", "validateInputs", "argMin", "argMax", "parseArgMinMaxAttributes", "init_argminmax", "__esmMin", "init_wasm_common", "init_attribute_with_cache_key", "init_reduce", "inputs", "context", "attributes", "argMinMaxOp", "input", "output", "axes", "idxZero", "k", "createReduceProgramInfo", "createAttributeWithCacheKey", "validateAttentionInputs", "createInPlaceSoftmaxProgramInfo", "createAttentionProbsProgramInfo", "createVxAttentionScoreProgramInfo", "applyAttention", "prepare", "attention", "init_attention", "__esmMin", "init_wasm_common", "init_types", "init_common", "inputs", "attributes", "input", "weights", "bias", "maskIndex", "past", "relativePositionBias", "batchSize", "sequenceLength", "inputHiddenSize", "qHiddenSize", "kHiddenSize", "vHiddenSize", "sz", "kvSequenceLength", "pastSequenceLength", "totalSequenceLength", "maxSequenceLength", "maskType", "_context", "n", "d", "components", "getMaxComponents", "WG", "dComp", "elementsPerThread", "programUniforms", "dataType", "tensorTypeToWsglStorageType", "f32Type", "tensorTypeToWsglValueType", "getShaderSource", "shaderHelper", "inputHelper", "outputVariable", "uniforms", "context", "q", "key", "pastKey", "parameters", "probsShape", "presentKey", "presentKeyShape", "alpha", "vectorizedHeadSize", "TILE_SIZE", "dispatch", "inputDependencies", "outputs", "qInput", "inputVariable", "kInput", "inputVars", "pastKeyInput", "output", "outputVars", "probs", "v", "pastValue", "params", "nReps", "repeatedVHiddenSize", "presentValue", "presentValueShape", "outputShape", "probsHelper", "vHelper", "k", "_maskIndex", "_past", "outputCount", "inputsK", "inputsV", "M", "K", "N", "outputQ", "outputK", "outputV", "weight", "validateInputs", "createBatchNormInferenceProgramInfo", "parseBatchNormAttributes", "batchNorm", "init_batch_norm", "__esmMin", "init_esm", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "checkShapeEqual", "actual", "expected", "message", "r", "v", "i", "shape", "epsilon", "spatial", "format", "yShape", "components", "getMaxComponents", "cComponents", "outputSize", "ShapeUtil", "useShapesUniforms", "shapeOrRank", "x", "inputVariable", "scale", "bias", "inputMean", "inputVar", "y", "outputVariable", "calcCOffset", "cOffset", "getInferenceModeShaderSource", "helper", "createTensorShapeVariables", "createAttributeWithCacheKey", "context", "outputCount", "updatedAttributes", "env", "validateInputs", "createBiasAddProgramInfo", "biasAdd", "init_bias_add", "__esmMin", "init_util", "init_common", "inputs", "outputShape", "channels", "outputSize", "ShapeUtil", "dataType", "input", "inputVariable", "bias", "residual", "output", "outputVariable", "shaderHelper", "context", "createElementwiseProgramShader", "createElementwiseProgramInfo", "abs", "acos", "acosh", "asin", "asinh", "atan", "atanh", "parseCastAttributes", "cast", "generateClipAttributesFromInputs", "clip", "ceil", "cos", "cosh", "parseAlphaAttributes", "elu", "erfImpl", "erf", "exp", "floor", "gelu", "leakyRelu", "not", "neg", "reciprocal", "relu", "sigmoid", "parseHardSigmoidAttributes", "hardSigmoid", "sin", "sinh", "sqrt", "tan", "tanhExpression", "tanh", "fastGeluImpl", "fastGeluExpression", "fastGelu", "thresholdedRelu", "log", "quickGeluImpl", "quickGeluExpression", "quickgelu", "init_unary_op", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "shaderHelper", "datasize", "inputDataType", "outputDataType", "funcCall", "additionalImplementation", "vecSize", "expression", "input", "inputVariable", "output", "outputVariable", "name", "cacheKey", "ShapeUtil", "inputTensors", "context", "attributes", "createAttributeWithCacheKey", "func", "inputs", "min", "MIN_CLIP", "max", "MAX_CLIP", "clipAttributes", "dataType", "tensorTypeToWsglValueType", "a", "varType", "x", "alpha", "dType", "validateInputs", "createBiasSplitGeluProgramInfo", "biasSplitGelu", "init_bias_split_gelu", "__esmMin", "init_util", "init_common", "init_unary_op", "inputs", "outputShape", "input", "inputVariable", "bias", "output", "outputVariable", "outputSize", "ShapeUtil", "dataType", "tensorTypeToWsglStorageType", "shaderHelper", "erfImpl", "context", "createBinaryOpProgramShader", "createBinaryOpProgramInfo", "runBinaryOp", "add", "div", "equal", "mul", "pow", "sub", "greater", "less", "greaterOrEqual", "lessOrEqual", "init_binary_op", "__esmMin", "init_wasm_common", "init_util", "init_common", "shaderHelper", "dimsA", "dimsB", "dimsOutput", "vectorize", "doBroadcast", "sharedDimensionDivisibleBy4", "funcCall", "typeA", "typeB", "typeOutput", "additionalImplementation", "expressionScalar", "expressionVector", "a", "b", "output", "outputVariable", "inputVariable", "assignment", "isAOneElement", "ShapeUtil", "isBOneElement", "aLastDimDivisibleBy4", "bLastDimDivisibleBy4", "singleAssignment", "resStr", "x", "typeCast", "expressionA", "expressionB", "name", "cacheKey", "outputDataType", "isBroadcast", "outputShape", "outputSize", "cacheKeyAux", "calculatedShape", "BroadcastUtil", "sharedDimension", "i", "dimA", "dimB", "createTensorShapeVariables", "context", "type", "validateInputs", "calculateInputIndexImpl", "assignOutputData", "createConcatProgramInfo", "concat", "parseConcatAttributes", "init_concat", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "axis", "referenceIndex", "referenceInput", "inputType", "inputRank", "input", "i", "dim", "numberOfTensors", "sizeInConcatAxisStr", "output", "codeLines", "returnSnippet", "adjustedAxis", "outputShape", "dataType", "outputSize", "ShapeUtil", "sizeInConcatAxis", "inputVars", "previousSum", "inputDependencies", "inputRanks", "programUniforms", "inputVariable", "createTensorShapeVariables", "outputVariable", "indicesAxis", "getShaderSource", "shaderHelper", "context", "attributes", "inputShape", "sum", "nonEmptyInputs", "createAttributeWithCacheKey", "getActivationSnippet", "appendActivationUniformsData", "appendActivationUniforms", "parseInternalActivationAttributes", "init_fuse_utils", "__esmMin", "init_wasm_common", "init_util", "attributes", "valueType", "baseType", "programUniform", "uniforms", "activation", "alpha", "beta", "clipMin", "clipMax", "MIN_CLIP", "MAX_CLIP", "typeSnippet", "biasSnippet", "init_activation_util", "__esmMin", "component", "dataType", "hasBias", "utilFunctions", "init_conv_util", "__esmMin", "strideStr", "writeDataToSubAVec4Snippet", "calculateResultSnippet", "makeMatMulPackedVec4Source", "writeDataToSubASnippet", "readDataFromSubASnippet", "makeMatMulPackedSource", "matMulReadWriteFnSource", "createMatmulProgramInfo", "init_matmul_packed_webgpu", "__esmMin", "init_wasm_common", "init_util", "init_common", "init_fuse_utils", "init_activation_util", "transpose", "batchDims", "transposeA", "innerElementSize", "workPerThread", "workgroupSize", "type", "tileInner", "splitK", "splitedDimInner", "tileAOuter", "tileBOuter", "tileAWidth", "tileAHight", "rowPerThreadB", "sequentialAccessByThreads", "rowPerThreadA", "colPerThreadA", "matmulSnippet", "component", "hasBias", "applyActivation", "variables", "batchShapes", "isChannelsLast", "batchAShape", "batchBShape", "batchShape", "batchVariable", "aVariable", "bVariable", "outputVariable", "broadCastADims", "getBroadcastDims", "broadCastBDims", "dataType", "tensorTypeToWsglStorageType", "getAIndices", "aRank", "batchRank", "resStr", "i", "j", "getBIndices", "bRank", "typeSnippet", "inputs", "activationAttributes", "outputShape", "reshapedOutputShape", "aShape", "bShape", "outerDimsA", "outerDimsB", "outerDims", "batchSize", "ShapeUtil", "dimAOuter", "dimInner", "dimBOuter", "isVec4", "elementsPerThread", "dispatch", "components", "aShapeTemp", "bShapeTemp", "outputShapeTemp", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "internalVariable", "A", "inputVariable", "B", "output", "inputVariables", "biasComponents", "uniforms", "appendActivationUniforms", "baseType", "getActivationSnippet", "declareFunctions", "conv2dCommonSnippet", "createConv2DMatMulProgramInfo", "init_conv2d_mm_webgpu", "__esmMin", "init_wasm_common", "init_log", "init_common", "init_fuse_utils", "init_activation_util", "init_conv_util", "init_matmul_packed_webgpu", "isChannelsLast", "fitAOuter", "fitBOuter", "fitInner", "addBias", "attributes", "innerElementSizeX", "innerElementSizeW", "innerElementSize", "dataType", "getXSnippet", "getWSnippet", "coordASnippet", "coordResSnippet", "xHeight", "xWidth", "row", "col", "readXSnippet", "typeSnippet", "sampleX", "sampleW", "resType", "aType", "bType", "applyActivation", "getActivationSnippet", "biasSnippet", "inputs", "outputShape", "dimAOuter", "dimBOuter", "dimInner", "hasBias", "sequentialAccessByThreads", "inChannels", "batchSize", "outWidth", "outHeight", "outChannels", "isVec4", "dispatchX", "dispatchY", "workGroupSize", "elementsPerThread", "dispatch", "LOG_DEBUG", "tileAOuter", "tileBOuter", "tileInner", "elementsSize", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "uniforms", "appendActivationUniforms", "components", "t", "tensorTypeToWsglStorageType", "declareFunctions", "x", "inputVariable", "w", "inputVariables", "output", "outputVariable", "bias", "utilFunctions", "makeMatMulPackedVec4Source", "makeMatMulPackedSource", "arrayProduct", "parse3TupleParam", "getEffectiveFilterSize", "computeDefaultPad", "computeOutputShape4D", "get3DPadAndOutInfo", "computeConv3DInfo", "createConv3DNaiveProgramInfo", "init_conv3d_naive_webgpu", "__esmMin", "init_wasm_common", "init_log", "init_util", "init_common", "arr", "product", "i", "param", "filterSize", "dilation", "inputShape", "fieldSize", "stride", "effectiveFieldSize", "inShape", "filterShape", "outChannels", "strides", "zeroPad", "outShape", "index", "pad", "inDepth", "inHeight", "inWidth", "strideDepth", "strideHeight", "strideWidth", "filterDepth", "filterHeight", "filterWidth", "padInfo", "outDepth", "outHeight", "outWidth", "val", "_", "padAlongDepth", "padAlongHeight", "padAlongWidth", "front", "back", "top", "bottom", "left", "right", "dilations", "depthwise", "dataFormat", "batchSize", "inChannels", "filterChannels", "dilationDepth", "dilationHeight", "dilationWidth", "effectiveFilterDepth", "effectiveFilterHeight", "effectiveFilterWidth", "inputs", "attributes", "outputShape", "filterDims", "pads", "isChannelsLast", "isVec4", "workGroupSize", "dispatchLayout", "dispatch", "d", "LOG_DEBUG", "innerElementSize", "outputSize", "ShapeUtil", "programUniforms", "createTensorShapeVariables", "inputDependencies", "hasBias", "getShaderSource", "shaderHelper", "uniforms", "components", "t", "tensorTypeToWsglStorageType", "x", "inputVariable", "w", "inputVariables", "output", "outputVariable", "declareFunctions", "bias", "getElementAt", "createGroupedConvProgramInfo", "createGroupedConvVectorizeProgramInfo", "init_conv_grouped", "__esmMin", "init_wasm_common", "init_util", "init_common", "init_conv", "init_fuse_utils", "inputs", "attributes", "squeezeOutputShapeFunction", "hasBias", "processBias", "xShape", "wShape", "outputChannelsPerGroup", "isChannelLast", "outputShape", "calculateOutputShape", "outputSize", "ShapeUtil", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "output", "outputVariable", "baseType", "tensorTypeToWsglStorageType", "applyActivation", "getActivationSnippet", "x", "inputVariable", "w", "inputVars", "uniforms", "appendActivationUniforms", "components", "getMaxComponents", "outputNumber", "outputShapeInShader", "xNumber", "createNaiveMatmulProgramInfo", "validateInputs", "matMul", "init_matmul", "__esmMin", "init_wasm_common", "init_util", "init_matmul_packed_webgpu", "init_common", "init_fuse_utils", "inputs", "activationAttributes", "outputShape", "reshapedOutputShape", "isChannelsLast", "aShape", "bShape", "M", "N", "K", "components", "getMaxComponents", "aComponents", "outputNumber", "outputSize", "ShapeUtil", "hasBias", "outerDims", "outputShapeInShader", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "batchDims", "internalVariable", "a", "inputVariable", "b", "output", "outputVariable", "baseType", "tensorTypeToWsglStorageType", "applyActivation", "getActivationSnippet", "inputVariables", "processBias", "biasComponents", "outerDimsA", "outerDimsB", "broadCastADims", "getBroadcastDims", "broadCastBDims", "uniforms", "appendActivationUniforms", "getIndices", "variable", "broadCastDims", "rank", "name", "batchRank", "resStr", "i", "j", "calcResult", "calcStr", "context", "BroadcastUtil", "createMatmulProgramInfo", "calculateOutputShape", "weightTransposeAttribute", "validateInputs", "getAdjustedConvAttributes", "parseConvAttributes", "conv2d", "conv1d", "conv3d", "conv", "init_conv", "__esmMin", "init_util", "init_conv2d_mm_webgpu", "init_conv3d_naive_webgpu", "init_matmul_packed_webgpu", "init_conv_grouped", "init_fuse_utils", "init_matmul", "init_transpose", "inputShape", "kernelShape", "dilations", "adjustPads", "strides", "isChannelLast", "batchSize", "inputSpatialShape", "spatialRank", "outChannels", "dilatedKernelShape", "v", "i", "outputShape", "inputs", "attributes", "dataChannel", "filterInChannel", "pads", "PoolConvUtil", "newAttributes", "activationAttributes", "parseInternalActivationAttributes", "format", "autoPad", "group", "wIsConst", "context", "adjustedAttributes", "isChannelsLast", "transposedWeight", "createTransposeProgramInfo", "convInputs", "createGroupedConvVectorizeProgramInfo", "createGroupedConvProgramInfo", "hasBias", "inputHeight", "inputWidth", "inputChannels", "weightHeight", "weightWidth", "outHeight", "outWidth", "sameSize", "batch", "xReshaped", "wReshaped", "matmulOutputShape", "matmulInputs", "sharedDim", "N", "K", "createNaiveMatmulProgramInfo", "createMatmulProgramInfo", "sequentialAccessByThreads", "dimAOuter", "dimBOuter", "dimInner", "createConv2DMatMulProgramInfo", "convInfo", "computeConv3DInfo", "createConv3DNaiveProgramInfo", "conv2dTransposeCommonSnippet", "createConv2DTransposeMatMulProgramInfo", "init_conv_backprop_mm_webgpu", "__esmMin", "init_wasm_common", "init_log", "init_common", "init_fuse_utils", "init_activation_util", "init_conv_util", "init_matmul_packed_webgpu", "isChannelsLast", "addBias", "attributes", "type", "innerElementSize", "getWSnippet", "coordASnippet", "coordResSnippet", "xHeight", "xWidth", "row", "col", "readASnippet", "sampleA", "sampleW", "applyActivation", "getActivationSnippet", "biasSnippet", "inputs", "outputShape", "dimAOuter", "dimBOuter", "dimInner", "hasBias", "sequentialAccessByThreads", "inChannels", "batchSize", "outWidth", "outHeight", "outChannels", "isVec4", "dispatchX", "dispatchY", "workGroupSize", "elementsPerThread", "dispatch", "LOG_DEBUG", "tileInner", "components", "filterDims", "effectiveFilterDims", "pads", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "x", "inputVariable", "w", "output", "outputVariable", "inputVariables", "declareFunctions", "bias", "uniforms", "appendActivationUniforms", "elemType", "tensorTypeToWsglStorageType", "utilFunctions", "makeMatMulPackedVec4Source", "makeMatMulPackedSource", "createConvTranspose2DOpProgramShaderSource", "createConvTranspose2DProgramInfo", "init_conv_backprop_webgpu", "__esmMin", "init_wasm_common", "init_log", "init_util", "init_common", "shaderHelper", "inputs", "outputShape", "hasBias", "is1DimensionDispatch", "isVec4", "dataType", "uniforms", "isChannelsLast", "rowDim", "colDim", "channelDim", "workPerThread", "declareFunctions", "components", "w", "inputVariable", "dy", "inputVariables", "output", "outputVariable", "codeSnippet4", "codeSnippet", "attributes", "squeezeOutputShapeFunction", "outputSize", "ShapeUtil", "dispatch", "LOG_DEBUG", "inputDependencies", "strides", "filterDims", "dilations", "effectiveFilterDims", "pads", "group", "wShape", "inputChannelsPerGroup", "outputChannelsPerGroup", "programUniforms", "createTensorShapeVariables", "getShaderSource", "tensorTypeToWsglStorageType", "computeTotalPad", "distributePadding", "calculateOutputShapeAndPads", "getAdjustedConvTransposeAttributes", "parseConvTransposeAttributes", "validateInputs", "weightTransposePerm", "convTranspose2d", "convTranspose1d", "convTranspose", "init_conv_transpose", "__esmMin", "init_conv_backprop_mm_webgpu", "init_conv_backprop_webgpu", "init_fuse_utils", "init_transpose", "inDim", "stride", "adj", "kernel", "dilation", "outSize", "totalPad", "autoPad", "pads", "head", "tail", "smallPad", "inputShape", "kernelShape", "dilations", "group", "strides", "isChannelLast", "outputPadding", "outputShape", "spatialRank", "updateOutputShape", "i", "batchSize", "outChannels", "j", "inSize", "attributes", "inputs", "a", "b", "isChannelsLast", "newAttributes", "activationAttributes", "parseInternalActivationAttributes", "format", "wIsConst", "dataChannel", "filterInChannel", "featureMaps", "context", "adjustedAttributes", "inputChannels", "createConvTranspose2DProgramInfo", "outHeight", "outWidth", "weightHeight", "weightWidth", "dimAOuter", "dimBOuter", "dimInner", "sequentialAccessByThreads", "transposedWeight", "createTransposeProgramInfo", "convTransposeInputs", "hasBias", "createConv2DTransposeMatMulProgramInfo", "createCumsumProgramInfo", "cumsum", "parseCumSumAttributes", "init_cumsum", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputType", "inputShape", "axisInput", "attributes", "outputSize", "ShapeUtil", "rank", "input", "inputVariable", "output", "outputVariable", "axisValue", "axis", "getShaderSource", "shaderHelper", "index", "max", "getElementAt", "lowerLimit", "upperLimit", "createTensorShapeVariables", "context", "exclusive", "reverse", "createAttributeWithCacheKey", "validateInputs", "permFunctionBody", "createDepthToSpaceProgramInfo", "depthToSpace", "parseDepthToSpaceAttributes", "init_depth_to_space", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "perm", "rank", "input", "output", "reverseFunc", "inputTensor", "attributes", "n", "h", "w", "c", "shape", "isChannelLast", "blocksize", "isDCRmode", "reshapedInputTensor", "reshapedInputRank", "inputDataType", "reshapedInput", "inputVariable", "permedOutput", "outputVariable", "getShaderSource", "shaderHelper", "outputShape", "outputSize", "ShapeUtil", "shapeBeforePerm", "shapeAfterPerm", "createTensorShapeVariables", "context", "createAttributeWithCacheKey", "symbolPattern", "termPattern", "termPatternOnly", "lhsPattern", "lhsPatternOnly", "EinsumTerm", "EinsumEquation", "appendMax", "createEinsumProgramInfo", "einsum", "parseEinsumAttributes", "init_einsum", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputIndex", "symbol", "index", "value", "inputs", "equation", "lhs", "rhs", "inputTerm", "dims", "einsumTerm", "sym", "info", "dimValue", "term", "isInput", "rank", "ellipsis", "ellipsisDims", "nextDim", "indexSymbols", "i", "ellipsisDimLength", "j", "name", "inputShapes", "dataType", "einsumEquation", "outputShape", "inputVars", "inputVariable", "outputSize", "ShapeUtil", "output", "outputVariable", "uniformsSymbols", "getShaderSource", "shaderHelper", "idxCopy", "initProd", "initSum", "updateSum", "reduceOpsSetIndices", "reduceOpsLoopHeaders", "reduceOpsLoopFooters", "reduceOpCompute", "isReduceOpsWithoutLoop", "outputIndex", "indices", "reduceOps", "inputVar", "_var", "programUniformsInit", "programUniforms", "_", "createTensorShapeVariables", "acc", "inputProgramUniforms", "context", "attributes", "input", "createAttributeWithCacheKey", "validateInputs", "getAdjustedShape", "calculateOutputShape", "createExpandProgramInfo", "expand", "init_expand", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "inputShape", "shape", "shapeIndex", "inputShapeIndex", "shape1", "shape2", "diff", "i", "outputShape", "dataType", "components", "outputSize", "ShapeUtil", "getShaderSource", "shaderHelper", "input", "inputVariable", "output", "outputVariable", "assignment", "singleAssignment", "resStr", "x", "typeCast", "programUniforms", "createTensorShapeVariables", "context", "createFastGeluProgramInfo", "fastGelu", "init_fast_gelu", "__esmMin", "init_wasm_common", "init_util", "init_common", "init_unary_op", "inputTensors", "dataType", "outputSize", "ShapeUtil", "biasLength", "useVec4", "getShaderSource", "shaderHelper", "x", "inputVariable", "bias", "y", "outputVariable", "uniforms", "singleElementBias", "i", "biasGetExpression", "fastGeluImpl", "tensorTypeToWsglValueType", "WORKGROUP_SIZE", "fastGeluExpression", "inputs", "context", "validateInputs", "createGatherProgramInfo", "parseGatherAttributes", "gather", "init_gather", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "inputShape", "indicesShape", "inputRank", "axis", "ShapeUtil", "outputShape", "axisDimLimit", "components", "outputSize", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "data", "inputVariable", "indices", "output", "outputVariable", "calcDataIndices", "x", "indicesRank", "calcStr", "i", "j", "assignment", "singleAssignment", "resStr", "typeCast", "createAttributeWithCacheKey", "context", "validateInputs", "createGatherElementsProgramInfo", "parseGatherElementsAttributes", "gatherElements", "init_gather_elements", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "inputShape", "inputOutputDataType", "inputRank", "indicesShape", "indicesDataType", "axis", "ShapeUtil", "axisDimLimit", "outputShape", "outputSize", "input", "inputVariable", "indices", "output", "outputVariable", "programUniforms", "createTensorShapeVariables", "shaderHelper", "createAttributeWithCacheKey", "context", "validateInputs", "createGemmProgramInfo", "parseGemmAttributes", "gemm", "init_gemm", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "attributes", "aShape", "bShape", "M", "N", "K", "GemmUtil", "outputShape", "outputSize", "ShapeUtil", "programUniforms", "inputDependencies", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "line", "calculateAlpha", "a", "inputVariable", "b", "dataType", "c", "variables", "output", "outputVariable", "uniforms", "transA", "transB", "alpha", "beta", "context", "getInput", "validateInputs", "parseMultiHeadAttentionAttributes", "weightTransposeAttribute", "addBiasTranspose", "maybeTransposeToBNSHAndAddBias", "multiHeadAttention", "init_multihead_attention", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_types", "init_attention", "init_common", "init_transpose", "inputs", "i", "ShapeUtil", "attributes", "query", "key", "value", "bias", "keyPaddingMask", "relativePositionBias", "pastKey", "pastValue", "dmmhaPacking", "batchSize", "sequenceLength", "hiddenSize", "kvSequenceLength", "pastSequenceLength", "maxSequenceLength", "headSize", "qkvFormat", "maskType", "maskDims", "passPastInKv", "vHiddenSize", "totalSequenceLength", "broadcastResPosBias", "createAttributeWithCacheKey", "context", "qkv", "biasOffset", "outputShape", "outputSize", "programUniforms", "getShaderSource", "shaderHelper", "output", "outputVariable", "qkvInput", "inputVariable", "biasInput", "uniforms", "numHeads", "input", "reshapedInput", "createTransposeProgramInfo", "params", "kvBNSH", "Q", "applyAttention", "K", "V", "getRepeats", "validateInputs", "getOutputShape", "createTileProgramInfo", "tile", "init_tile", "__esmMin", "init_wasm_common", "init_util", "init_common", "repeatsTensorView", "inputs", "inputShape", "repeats", "outputShape", "i", "shape", "outputSize", "ShapeUtil", "dataType", "input", "inputVariable", "output", "outputVariable", "getShaderSource", "shaderHelper", "createTensorShapeVariables", "context", "validateInputs", "createConcatProgramInfo", "parseGroupQueryAttentionAttributes", "weightTransposeAttribute", "maybeExpandAndTransposeToBNSH", "groupQueryAttention", "init_group_query_attention", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_attention", "init_common", "init_multihead_attention", "init_tile", "init_transpose", "inputs", "attributes", "query", "key", "value", "pastKey", "pastValue", "dmmhaPacking", "batchSize", "sequenceLength", "hiddenSize", "kvSequenceLength", "pastSequenceLength", "maxSequenceLength", "headSize", "hasPastKey", "hasPastValue", "isPastkvBSNH", "qkvFormat", "maskType", "passPastInKv", "vHiddenSize", "totalSequenceLength", "broadcastResPosBias", "a", "b", "dataType", "params", "outputShape", "component", "outputSize", "ShapeUtil", "presentSequenceLength", "output", "outputVariable", "inputA", "inputVariable", "inputB", "H", "dispatch", "inputDependencies", "programUniforms", "createTensorShapeVariables", "uniforms", "pastStr", "newStr", "concatStr", "getShaderSource", "shaderHelper", "createAttributeWithCacheKey", "context", "input", "pastKV", "outputIndex", "reshapedInput", "numHeads", "nReps", "createTileProgramInfo", "createTransposeProgramInfo", "Q", "maybeTransposeToBNSHAndAddBias", "K", "V", "applyAttention", "createInstanceNormProgramInfo", "computeMean", "createInstanceNormNHWCProgramInfo", "instanceNorm", "init_instance_norm", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "attributes", "xShape", "outputShape", "axis", "normCount", "ShapeUtil", "normSize", "components", "getMaxComponents", "normPackedSize", "inputShape", "inputDependencies", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "x", "inputVariable", "scale", "bias", "output", "outputVariable", "variables", "dataType", "f32Type", "workgroupSize", "uniforms", "sumVector", "context", "input", "n", "h", "c", "epsilon", "WG", "outputType", "sumCastType", "setOutputValue", "var1", "var2", "unitsOfWork", "wgSize", "meanInputDependencies", "meanProgramUniforms", "getMeanShaderSource", "inputHelper", "fillVector", "meanValues", "scaleHelper", "biasHelper", "N", "C", "H", "outputSize", "channelScaleShift", "tensorTypeToWsglStorageType", "scaleType", "scaleCastType", "outputHelper", "validateInputs", "createLayerNormProgramInfo", "layerNorm", "init_layer_norm", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "attributes", "outputCount", "simplified", "xShape", "scale", "bias", "outputShape", "axis", "ShapeUtil", "normCount", "normSize", "scaleSize", "biasSize", "meanInvStdDevDim", "i", "components", "getMaxComponents", "inputDependencies", "programUniforms", "hasMeanDataOutput", "hasInvStdOutput", "getShaderSource", "shaderHelper", "dataType", "tensorTypeToWsglStorageType", "variables", "inputVariable", "outputVariable", "uniforms", "fillVector", "castToF32", "sumVector", "outputs", "context", "validateInputs", "createMatMulNBitsProgramInfo", "matMulNBits", "parseMatMulNBitsAttributes", "init_matmulnbits", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "a", "aRank", "nBlocksPerCol", "blobSize", "b", "ShapeUtil", "scalesShape", "zeroPointsShape", "expectedZeroPointsSize", "maxComputeWorkgroupSizes", "maxComputeWorkgroupStorageSize", "inputShape", "dimAOuter", "dimInner", "dimBOuter", "batchDims", "batchSize", "blobSizeInWords", "dataType", "outputNumber", "getMaxComponents", "aComponents", "bComponents", "elementSize", "getTensorElementSize", "workgroupOutputSize", "maxNumberOfComponents", "useBlockwiseMatMulNBits", "components", "outputShape", "outputSize", "programUniforms", "inputShapeTemp", "bShape", "createTensorShapeVariables", "outputShapeTemp", "getShaderSource", "shaderHelper", "inputRank", "inputVariable", "scales", "inputVariables", "zeroPoints", "outputRank", "output", "outputVariable", "uniforms", "tensorTypeToWsglStorageType", "qDqDataType", "processOneBlock", "_", "i", "updateZeroPointIndex", "context", "createAttributeWithCacheKey", "validateInputs", "getPadConstant", "getPadReflect", "getPadEdge", "getPadWrap", "getPadSnippet", "createPadProgramInfo", "createPadAttributesFromInputs", "pad", "init_pad", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "validPads", "output", "inputRank", "padsLength", "block", "i", "getElementAt", "attributes", "outputShape", "ShapeUtil", "inputDims", "outputSize", "programUniforms", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "outputVariable", "input", "inputVariable", "dataType", "padSnippet", "uniforms", "bigInt64Pads", "value", "updatePads", "axes", "v", "pads", "context", "updatedAttributes", "validateInputs", "getAdjustedPoolAttributesAndOutputShape", "getUniformAndPadInfo", "generatePoolingCode", "createShaderKeyFromAttributes", "createAveragePoolShaderKeyFromAttributes", "createMaxPoolShaderKeyFromAttributes", "parsePoolCommonAttributes", "createAveragePoolProgramInfo", "parseAveragePoolAttributes", "averagePool", "globalPoolAttributes", "parseGlobalAveragePoolAttributes", "globalAveragePool", "createMaxPoolProgramInfo", "maxPool", "parseMaxPoolAttributes", "parseGlobalMaxPoolAttributes", "globalMaxPool", "init_pool", "__esmMin", "init_esm", "init_wasm_common", "init_util", "init_common", "inputs", "env", "input", "attributes", "isGlobalOperator", "isChannelsLast", "inputShapeAsChannelFirst", "hasDilations", "kernelShape", "strides", "dilations", "pads", "PoolConvUtil", "outputShapeAsChannelFirst", "newAttributes", "outputShapeAsChannelLast", "outputShape", "outputSize", "ShapeUtil", "kernelSize", "programUniforms", "uniforms", "kw", "sw", "pwStart", "pwEnd", "pwStartEndNotZero", "phStartEndNotZero", "kh", "sh", "phStart", "phEnd", "kernelStrides", "hasPads", "sum", "cur", "shaderHelper", "x", "rank", "outputShapeRank", "op1", "op2", "start", "dataType", "output", "outputVariable", "codeW", "codeH", "codeHEnd", "dimIdxW", "dimIdxH", "stridesRank", "padsRank", "padCode", "getElementAt", "name", "adjustedAttributes", "inputVariable", "createTensorShapeVariables", "inputDependencies", "countIncludePad", "attr", "averagePoolAttributes", "context", "format", "storageOrder", "maxPoolAttributes", "validateInputsContent", "createRangeProgramInfo", "range", "init_range", "__esmMin", "init_esm", "init_wasm_common", "init_common", "start", "limit", "delta", "sameStartLimit", "increasingRangeNegativeStep", "decreasingRangePositiveStep", "dataType", "numElements", "outputShape", "outputSize", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "output", "outputVariable", "wgslType", "uniforms", "context", "env", "validateScales", "updateScales", "validateInputs", "getOriginalCoordinateFromResizedCoordinate", "getNearestPixelFromOriginal", "updateRoI", "initOutputShape", "adjustOutputShape", "calculateOriginalIndicesFromOutputIndices", "calculateInputIndicesFromOutputIndices", "checkInputIndices", "setChannelAndBatchIndices", "bilinearInterpolation", "bicubicInterpolation", "trilinearInterpolation", "createResizeProgramInfo", "getOpsetVersionFromCustomDataBuffer", "resize", "parseResizeAttributes", "init_resize", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "scales", "attributes", "value", "axes", "rank", "newScales", "index", "inputs", "opsetVersion", "sizes", "roi", "roiInputIndex", "scalesInputIndex", "sizesInputIndex", "coordinateTransferMode", "dType", "nearestMode", "roiTmp", "roiLocal", "v", "i", "inputShape", "outputShape", "scaleInPolicy", "adjustedOutputShape", "output", "scalesLength", "roiLength", "getElementAt", "input", "useExtrapolation", "channelIdx", "batchIdx", "spacialDims", "extrapolationValue", "heightIdx", "widthIdx", "cubicCoeffA", "excludeOutside", "is2D", "isNchw", "createCubicInterpolationFunction", "idx", "direction", "depthIdx", "inputTensor", "scalesInput", "roiInput", "outputVariable", "inputVariable", "outputSize", "ShapeUtil", "noScale", "d", "dataType", "getShaderSource", "shaderHelper", "createTensorShapeVariables", "context", "customDataBuffer", "antialias", "coordinateTransformMode", "keepAspectRatioPolicy", "mode", "createAttributeWithCacheKey", "validateInputs", "createRotaryEmbeddingProgramInfo", "rotaryEmbedding", "init_rotary_embedding", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "input", "positionIds", "cosCache", "sinCache", "numHeads", "rotaryEmbeddingDim", "ShapeUtil", "batchSize", "sequenceLength", "maxSequenceLength", "hiddenSize", "headSize", "interleaved", "scale", "batchStride", "halfRotaryEmbeddingDim", "globalShape", "globalStrides", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "inputVariable", "output", "outputVariable", "WORKGROUP_SIZE", "createAttributeWithCacheKey", "context", "validateInputs", "createSkipLayerNormProgramInfo", "skipLayerNorm", "init_skip_layer_norm", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "input", "skip", "gamma", "hiddenSize", "sequenceLength", "beta", "bias", "attributes", "outputCount", "isTraining", "simplified", "inputShape", "inputSize", "ShapeUtil", "outputShape", "outputSize", "meanInvStdDevDim", "hasBetaInput", "hasBiasInput", "hasMeanOutput", "hasInvStdDevOutput", "hasInputSkipBiasSumOutput", "workgroupSize", "components", "getMaxComponents", "programUniforms", "getShaderSource", "shaderHelper", "uniformsArray", "variables", "inputVariable", "outputVariable", "dataType", "tensorTypeToWsglStorageType", "vecDataType", "castToF32", "sumVector", "outputs", "_input", "_index", "context", "validateInputs", "readInput", "createSliceAttributesFromInputs", "fixStartEndValues", "calculateInputIndicesImpl", "createSliceProgramInfo", "slice", "parseSliceAttributes", "init_slice", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "_", "idx", "input", "v", "starts", "ends", "axes", "createAttributeWithCacheKey", "value", "index", "inputShape", "steps", "newValue", "output", "getElementAt", "inputSize", "ShapeUtil", "step", "start", "i", "end", "signs", "array", "numSteps", "newEnd", "newStart", "outputShape", "axis", "outputTensorInfo", "outputVariable", "inputVariable", "outputSize", "uniforms", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "context", "updatedAttributes", "validateInputs", "createSoftmaxProgramInfo", "softmax", "parseSoftmaxAttributes", "init_softmax", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "input", "attributes", "shape", "outputSize", "ShapeUtil", "WG", "axis", "cols", "rows", "components", "getMaxComponents", "packedCols", "maxVector", "name", "x", "inputVariable", "output", "outputVariable", "valueType", "threadMaxDecl", "tensorTypeToWsglStorageType", "getShaderSource", "shaderHelper", "sumVector", "context", "createAttributeWithCacheKey", "validateInputs", "createSplitAttributesFromInputs", "calculateOutputIndexImpl", "writeBufferDataImpl", "createSplitProgramInfo", "split", "parseSplitAttributes", "init_split", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "splitSizes", "numOutputs", "v", "createAttributeWithCacheKey", "numberOfTensors", "getElementAt", "outputs", "codeLines", "i", "returnSnippet", "inputShape", "inputSize", "ShapeUtil", "dataType", "axis", "input", "inputVariable", "sizeInSplitAxis", "outputsTensorInfo", "outputShapes", "previousSum", "programUniforms", "outputShape", "outputVariable", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "context", "updatedAttributes", "createWhereOpProgramShader", "createWhereOpProgramInfo", "where", "init_where", "__esmMin", "init_wasm_common", "init_util", "init_common", "shaderHelper", "inputs", "dimsOutput", "isBroadcast", "typeOutput", "output", "outputVariable", "inputVariable", "b", "c", "assignment", "expression", "a", "singleAssignment", "resStr", "x", "typeCast", "expressionA", "expressionB", "expressionC", "dimsA", "dimsB", "dimsC", "outputDataType", "ShapeUtil", "outputShape", "outputSize", "calculatedShape", "BroadcastUtil", "vecSize", "createTensorShapeVariables", "context", "WEBGPU_OP_RESOLVE_RULES", "init_op_resolve_rules", "__esmMin", "init_argminmax", "init_attention", "init_batch_norm", "init_bias_add", "init_bias_split_gelu", "init_binary_op", "init_concat", "init_conv", "init_conv_transpose", "init_cumsum", "init_depth_to_space", "init_einsum", "init_expand", "init_fast_gelu", "init_gather", "init_gather_elements", "init_gemm", "init_group_query_attention", "init_instance_norm", "init_layer_norm", "init_matmul", "init_matmulnbits", "init_multihead_attention", "init_pad", "init_pool", "init_range", "init_reduce", "init_resize", "init_rotary_embedding", "init_skip_layer_norm", "init_slice", "init_softmax", "init_split", "init_tile", "init_transpose", "init_unary_op", "init_where", "abs", "acos", "acosh", "add", "argMax", "parseArgMinMaxAttributes", "argMin", "asin", "asinh", "atan", "atanh", "attention", "averagePool", "parseAveragePoolAttributes", "batchNorm", "biasAdd", "biasSplitGelu", "cast", "parseCastAttributes", "ceil", "clip", "concat", "parseConcatAttributes", "conv", "parseConvAttributes", "convTranspose", "parseConvTransposeAttributes", "cos", "cosh", "cumsum", "parseCumSumAttributes", "depthToSpace", "parseDepthToSpaceAttributes", "div", "einsum", "parseEinsumAttributes", "elu", "parseAlphaAttributes", "equal", "erf", "exp", "expand", "fastGelu", "floor", "gather", "parseGatherAttributes", "gatherElements", "parseGatherElementsAttributes", "gelu", "gemm", "parseGemmAttributes", "globalAveragePool", "parseGlobalAveragePoolAttributes", "globalMaxPool", "parseGlobalMaxPoolAttributes", "greater", "greaterOrEqual", "groupQueryAttention", "parseGroupQueryAttentionAttributes", "hardSigmoid", "parseHardSigmoidAttributes", "instanceNorm", "layerNorm", "leakyRelu", "less", "lessOrEqual", "log", "matMul", "matMulNBits", "parseMatMulNBitsAttributes", "maxPool", "parseMaxPoolAttributes", "mul", "multiHeadAttention", "parseMultiHeadAttentionAttributes", "neg", "not", "pad", "pow", "quickgelu", "range", "reciprocal", "reduceMin", "reduceMean", "reduceMax", "reduceSum", "reduceProd", "reduceL1", "reduceL2", "reduceLogSum", "reduceLogSumExp", "reduceSumSquare", "relu", "resize", "parseResizeAttributes", "rotaryEmbedding", "sigmoid", "sin", "sinh", "slice", "parseSliceAttributes", "skipLayerNorm", "split", "parseSplitAttributes", "sqrt", "softmax", "parseSoftmaxAttributes", "sub", "tan", "tanh", "thresholdedRelu", "tile", "transpose", "parseTransposeAttributes", "where", "ProgramManager", "init_program_manager", "__esmMin", "init_esm", "init_log", "init_common", "backend", "key", "artifact", "buildArtifact", "inputs", "outputs", "dispatchGroup", "uniformBufferBinding", "TRACE_FUNC_BEGIN", "device", "computePassEncoder", "entries", "input", "output", "bindGroup", "commandInfo", "TRACE_FUNC_END", "programInfo", "normalizedDispatchGroupSize", "extensions", "shaderHelper", "createShaderHelper", "userCode", "code", "shaderModule", "LOG_DEBUG", "computePipeline", "x", "y", "z", "limitPerDimension", "size", "dispatchAverage", "getProgramInputTensorInfoDependencyKey", "getProgramInfoUniqueKey", "AdapterInfoImpl", "WebGpuBackend", "init_backend_webgpu", "__esmMin", "init_esm", "init_wasm_common", "init_log", "init_tensor_view", "init_gpu_data_manager", "init_op_resolve_rules", "init_program_manager", "inputTensors", "inputDependencies", "inputInfos", "i", "type", "rank", "dims", "programInfo", "is1DimensionDispatch", "key", "adapterInfo", "architecture", "vendor", "data", "env", "adapter", "requiredFeatures", "deviceDescriptor", "createGpuDataManager", "ProgramManager", "configureLogger", "ev", "commandEncoder", "computePassDescriptor", "TRACE_FUNC_BEGIN", "queryReadBuffer", "mappedData", "pendingKernels", "pendingKernelInfo", "kernelId", "kernelInfo", "kernelType", "kernelName", "programName", "inputTensorViews", "outputTensorViews", "startTimeU64", "endTimeU64", "startTime", "endTime", "value", "tensorDataTypeEnumToString", "inputShapes", "outputShapes", "TRACE", "TRACE_FUNC_END", "program", "outputIndices", "createKernelOutput", "createIntermediateOutput", "outputCount", "inputDatas", "gpuData", "outputs", "dispatchGroup", "programUniforms", "validatedOutputIndices", "_", "outputDatas", "isTemporary", "isPersistent", "tensorView", "persistentData", "uniformBufferBinding", "currentOffset", "offsets", "v", "sizeOfElement", "sizeOfVecOrMat", "baseAlignment", "elementPerVecOrMat", "maxAlignmentOfField", "arrayBuffer", "offset", "uniformBufferData", "normalizedDispatchGroup", "artifact", "LOG_DEBUG", "uniform", "actualType", "actualLength", "length", "gpuDataId", "src", "dst", "getTargetBuffer", "size", "ptr", "attribute", "op", "WEBGPU_OP_RESOLVE_RULES", "context", "errors", "kernel", "kernelEntry", "attributes", "useErrorScope", "e", "err", "sessionId", "index", "buffer", "sessionInputOutputMapping", "previousBuffer", "id", "bufferInfo", "gpuBuffer", "downloadGpuData", "createView", "sessionCommandList", "sessionPendingKernels", "computePassEncoder", "command", "init_exports", "__export", "init", "TensorViewImpl", "ComputeContextImpl", "init_init", "__esmMin", "init_wasm_common", "init_backend_webgpu", "init_log", "init_util", "_TensorViewImpl", "module", "dataType", "data", "dims", "elementCount", "ShapeUtil", "newDims", "backend", "contextDataOffset", "heapU32", "dataIndex", "inputCount", "inputs", "i", "dim", "d", "program", "inputsOutputsMapping", "mappedInputs", "outputIndices", "createKernelOutput", "index", "createTemporaryOutput", "elementSize", "getTensorElementSize", "bufferSize", "gpuDataId", "stack", "offset", "e", "name", "env", "gpuAdapter", "jsepInit", "WebGpuBackend", "size", "ptr", "src", "dst", "isSourceGpu", "LOG_DEBUG", "dataOffset", "kernelType", "kernelId", "attribute", "kernel", "sessionHandle", "errors", "context", "initOrt", "initRuntime", "initEp", "activeSessions", "getSessionInputOutputCount", "copyFromExternalBuffer", "createSession", "releaseSession", "prepareInputOutputTensor", "run", "endProfiling", "extractTransferableBuffers", "init_wasm_core_impl", "__esmMin", "init_run_options", "init_session_options", "init_wasm_common", "init_wasm_factory", "init_wasm_utils", "init_wasm_utils_load_file", "numThreads", "loggingLevel", "getInstance", "checkLastError", "env", "logLevelStringToEnum", "epName", "initJsep", "adapter", "powerPreference", "forceFallbackAdapter", "sessionHandle", "wasm", "stack", "dataOffset", "model", "modelDataOffset", "modelData", "options", "modelDataLength", "sessionOptionsHandle", "ioBindingHandle", "allocs", "inputNamesUTF8Encoded", "outputNamesUTF8Encoded", "setSessionOptions", "loadingPromises", "file", "path", "loadFile", "data", "provider", "webnnOptions", "context", "gpuDevice", "deviceType", "inputCount", "outputCount", "enableGraphCapture", "inputNames", "outputNames", "outputPreferredLocations", "i", "name", "nameString", "location", "bindingState", "l", "dataLocationStringToEnum", "e", "buf", "alloc", "sessionId", "session", "ioBindingState", "tensor", "tensorHandles", "index", "dataType", "dims", "rawData", "dataByteLength", "gpuBuffer", "elementSizeInBytes", "getTensorElementSize", "tensorDataTypeStringToEnum", "a", "b", "registerBuffer", "dataIndex", "allocWasmString", "dimsOffset", "dimIndex", "d", "inputIndices", "inputTensors", "outputIndices", "outputTensors", "inputOutputBound", "runOptionsHandle", "runOptionsAllocs", "inputTensorHandles", "outputTensorHandles", "inputOutputAllocs", "beforeRunStack", "inputValuesOffset", "inputNamesOffset", "outputValuesOffset", "outputNamesOffset", "setRunOptions", "inputValuesIndex", "inputNamesIndex", "outputValuesIndex", "outputNamesIndex", "handle", "outputPreferredLocationsEncoded", "errorCode", "output", "beforeGetTensorDataStack", "tensorDataOffset", "keepOutputTensor", "type", "tensorDataIndex", "dimsLength", "size", "tensorDataTypeEnumToString", "preferredLocation", "stringData", "offset", "maxBytesToRead", "getBuffer", "elementSize", "isGpuBufferSupportedType", "typedArrayConstructor", "tensorTypeToTypedArrayConstructor", "v", "p", "profileFileName", "tensors", "buffers", "isProxy", "proxyWorker", "initializing", "initialized", "aborted", "temporaryObjectUrl", "initWasmCallbacks", "queuedCallbacks", "enqueueCallbacks", "ensureWorker", "onProxyWorkerMessage", "initializeWebAssemblyAndOrtRuntime", "initializeOrtEp", "copyFromExternalBuffer", "createSession", "releaseSession", "run", "endProfiling", "init_proxy_wrapper", "__esmMin", "init_esm", "init_wasm_core_impl", "init_wasm_factory", "init_wasm_utils_import", "env", "type", "callbacks", "queue", "ev", "resolve", "reject", "importProxyWorker", "objectUrl", "worker", "message", "e", "initializeWebAssembly", "initRuntime", "epName", "initEp", "buffer", "model", "options", "transferable", "sessionId", "inputIndices", "inputs", "outputIndices", "outputs", "t", "serializableInputs", "extractTransferableBuffers", "encodeTensorMetadata", "decodeTensorMetadata", "OnnxruntimeWebAssemblySessionHandler", "init_session_handler_inference", "__esmMin", "init_esm", "init_proxy_wrapper", "init_wasm_common", "init_wasm_utils_env", "init_wasm_utils_load_file", "tensor", "getName", "Tensor", "dataType", "isGpuBufferSupportedType", "gpuBuffer", "download", "dispose", "path", "copyFromExternalBuffer", "loadFile", "pathOrBuffer", "options", "TRACE_FUNC_BEGIN", "model", "createSession", "TRACE_FUNC_END", "releaseSession", "feeds", "fetches", "inputArray", "inputIndices", "kvp", "name", "index", "outputArray", "outputIndices", "inputs", "t", "i", "outputs", "results", "run", "resultMap", "endProfiling", "initializeFlags", "OnnxruntimeWebAssemblyBackend", "init_backend_wasm", "__esmMin", "init_esm", "init_proxy_wrapper", "init_session_handler_inference", "init_wasm_utils_import", "env", "numCpuLogicalCores", "backendName", "initializeWebAssemblyAndOrtRuntime", "initializeOrtEp", "pathOrBuffer", "options", "handler", "OnnxruntimeWebAssemblySessionHandler", "backend_wasm_inference_exports", "__export", "wasmBackend", "init_backend_wasm_inference", "__esmMin", "init_backend_wasm", "OnnxruntimeWebAssemblyBackend", "init_esm", "version", "lib_default", "esm_exports", "wasmBackend", "registerBackend", "env", "version"] + "sourcesContent": ["// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Backend} from './backend.js';\nimport {InferenceSession} from './inference-session.js';\n\ninterface BackendInfo {\n backend: Backend;\n priority: number;\n\n initPromise?: Promise;\n initialized?: boolean;\n aborted?: boolean;\n error?: string;\n}\n\nconst backends: Map = new Map();\nconst backendsSortedByPriority: string[] = [];\n\n/**\n * Register a backend.\n *\n * @param name - the name as a key to lookup as an execution provider.\n * @param backend - the backend object.\n * @param priority - an integer indicating the priority of the backend. Higher number means higher priority. if priority\n * < 0, it will be considered as a 'beta' version and will not be used as a fallback backend by default.\n *\n * @ignore\n */\nexport const registerBackend = (name: string, backend: Backend, priority: number): void => {\n if (backend && typeof backend.init === 'function' && typeof backend.createInferenceSessionHandler === 'function') {\n const currentBackend = backends.get(name);\n if (currentBackend === undefined) {\n backends.set(name, {backend, priority});\n } else if (currentBackend.priority > priority) {\n // same name is already registered with a higher priority. skip registeration.\n return;\n } else if (currentBackend.priority === priority) {\n if (currentBackend.backend !== backend) {\n throw new Error(`cannot register backend \"${name}\" using priority ${priority}`);\n }\n }\n\n if (priority >= 0) {\n const i = backendsSortedByPriority.indexOf(name);\n if (i !== -1) {\n backendsSortedByPriority.splice(i, 1);\n }\n\n for (let i = 0; i < backendsSortedByPriority.length; i++) {\n if (backends.get(backendsSortedByPriority[i])!.priority <= priority) {\n backendsSortedByPriority.splice(i, 0, name);\n return;\n }\n }\n backendsSortedByPriority.push(name);\n }\n return;\n }\n\n throw new TypeError('not a valid backend');\n};\n\n/**\n * Try to resolve and initialize a backend.\n *\n * @param backendName - the name of the backend.\n * @returns the backend instance if resolved and initialized successfully, or an error message if failed.\n */\nconst tryResolveAndInitializeBackend = async(backendName: string): Promise => {\n const backendInfo = backends.get(backendName);\n if (!backendInfo) {\n return 'backend not found.';\n }\n\n if (backendInfo.initialized) {\n return backendInfo.backend;\n } else if (backendInfo.aborted) {\n return backendInfo.error!;\n } else {\n const isInitializing = !!backendInfo.initPromise;\n try {\n if (!isInitializing) {\n backendInfo.initPromise = backendInfo.backend.init(backendName);\n }\n await backendInfo.initPromise;\n backendInfo.initialized = true;\n return backendInfo.backend;\n } catch (e) {\n if (!isInitializing) {\n backendInfo.error = `${e}`;\n backendInfo.aborted = true;\n }\n return backendInfo.error!;\n } finally {\n delete backendInfo.initPromise;\n }\n }\n};\n\n/**\n * Resolve execution providers from the specific session options.\n *\n * @param options - the session options object.\n * @returns a promise that resolves to a tuple of an initialized backend instance and a session options object with\n * filtered EP list.\n *\n * @ignore\n */\nexport const resolveBackendAndExecutionProviders = async(options: InferenceSession.SessionOptions):\n Promise<[backend: Backend, options: InferenceSession.SessionOptions]> => {\n // extract backend hints from session options\n const eps = options.executionProviders || [];\n const backendHints = eps.map(i => typeof i === 'string' ? i : i.name);\n const backendNames = backendHints.length === 0 ? backendsSortedByPriority : backendHints;\n\n // try to resolve and initialize all requested backends\n let backend: Backend|undefined;\n const errors = [];\n const availableBackendNames = new Set();\n for (const backendName of backendNames) {\n const resolveResult = await tryResolveAndInitializeBackend(backendName);\n if (typeof resolveResult === 'string') {\n errors.push({name: backendName, err: resolveResult});\n } else {\n if (!backend) {\n backend = resolveResult;\n }\n if (backend === resolveResult) {\n availableBackendNames.add(backendName);\n }\n }\n }\n\n // if no backend is available, throw error.\n if (!backend) {\n throw new Error(`no available backend found. ERR: ${errors.map(e => `[${e.name}] ${e.err}`).join(', ')}`);\n }\n\n // for each explicitly requested backend, if it's not available, output warning message.\n for (const {name, err} of errors) {\n if (backendHints.includes(name)) {\n // eslint-disable-next-line no-console\n console.warn(`removing requested execution provider \"${\n name}\" from session options because it is not available: ${err}`);\n }\n }\n\n const filteredEps = eps.filter(i => availableBackendNames.has(typeof i === 'string' ? i : i.name));\n\n return [\n backend, new Proxy(options, {\n get: (target, prop) => {\n if (prop === 'executionProviders') {\n return filteredEps;\n }\n return Reflect.get(target, prop);\n }\n })\n ];\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession} from './inference-session.js';\nimport {OnnxValue} from './onnx-value.js';\nimport {TrainingSession} from './training-session.js';\n\n/**\n * @ignore\n */\nexport declare namespace SessionHandler {\n type FeedsType = {[name: string]: OnnxValue};\n type FetchesType = {[name: string]: OnnxValue | null};\n type ReturnType = {[name: string]: OnnxValue};\n}\n\n/**\n * Represents shared SessionHandler functionality\n *\n * @ignore\n */\ninterface SessionHandler {\n dispose(): Promise;\n\n readonly inputNames: readonly string[];\n readonly outputNames: readonly string[];\n}\n\n/**\n * Represent a handler instance of an inference session.\n *\n * @ignore\n */\nexport interface InferenceSessionHandler extends SessionHandler {\n startProfiling(): void;\n endProfiling(): void;\n\n run(feeds: SessionHandler.FeedsType, fetches: SessionHandler.FetchesType,\n options: InferenceSession.RunOptions): Promise;\n}\n\n/**\n * Represent a handler instance of a training inference session.\n *\n * @ignore\n */\nexport interface TrainingSessionHandler extends SessionHandler {\n readonly evalInputNames: readonly string[];\n readonly evalOutputNames: readonly string[];\n\n lazyResetGrad(): Promise;\n runTrainStep(\n feeds: SessionHandler.FeedsType, fetches: SessionHandler.FetchesType,\n options: InferenceSession.RunOptions): Promise;\n runOptimizerStep(options: InferenceSession.RunOptions): Promise;\n runEvalStep(\n feeds: SessionHandler.FeedsType, fetches: SessionHandler.FetchesType,\n options: InferenceSession.RunOptions): Promise;\n\n getParametersSize(trainableOnly: boolean): Promise;\n loadParametersBuffer(buffer: Uint8Array, trainableOnly: boolean): Promise;\n getContiguousParameters(trainableOnly: boolean): Promise;\n}\n\n/**\n * Represent a backend that provides implementation of model inferencing.\n *\n * @ignore\n */\nexport interface Backend {\n /**\n * Initialize the backend asynchronously. Should throw when failed.\n */\n init(backendName: string): Promise;\n\n createInferenceSessionHandler(uriOrBuffer: string|Uint8Array, options?: InferenceSession.SessionOptions):\n Promise;\n\n createTrainingSessionHandler?\n (checkpointStateUriOrBuffer: TrainingSession.UriOrBuffer, trainModelUriOrBuffer: TrainingSession.UriOrBuffer,\n evalModelUriOrBuffer: TrainingSession.UriOrBuffer, optimizerModelUriOrBuffer: TrainingSession.UriOrBuffer,\n options: InferenceSession.SessionOptions): Promise;\n}\n\nexport {registerBackend} from './backend-impl.js';\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// This file is generated by /js/scripts/update-version.ts\n// Do not modify file content manually.\n\nexport const version = '1.19.0';\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from './env.js';\nimport {version} from './version.js';\n\ntype LogLevelType = Env['logLevel'];\n\nlet logLevelValue: Required = 'warning';\n\nexport const env: Env = {\n wasm: {} as Env.WebAssemblyFlags,\n webgl: {} as Env.WebGLFlags,\n webgpu: {} as Env.WebGpuFlags,\n versions: {common: version},\n\n set logLevel(value: LogLevelType) {\n if (value === undefined) {\n return;\n }\n if (typeof value !== 'string' || ['verbose', 'info', 'warning', 'error', 'fatal'].indexOf(value) === -1) {\n throw new Error(`Unsupported logging level: ${value}`);\n }\n logLevelValue = value;\n },\n get logLevel(): Required {\n return logLevelValue;\n },\n};\n\n// set property 'logLevel' so that they can be correctly transferred to worker by `postMessage()`.\nObject.defineProperty(env, 'logLevel', {enumerable: true});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env as envImpl} from './env-impl.js';\n\nexport declare namespace Env {\n export type WasmPathPrefix = string;\n export interface WasmFilePaths {\n /**\n * Specify the override path for the main .wasm file.\n *\n * This path should be an absolute path.\n *\n * If not modified, the filename of the .wasm file is:\n * - `ort-wasm-simd-threaded.wasm` for default build\n * - `ort-wasm-simd-threaded.jsep.wasm` for JSEP build (with WebGPU and WebNN)\n * - `ort-training-wasm-simd-threaded.wasm` for training build\n */\n wasm?: URL|string;\n /**\n * Specify the override path for the main .mjs file.\n *\n * This path should be an absolute path.\n *\n * If not modified, the filename of the .mjs file is:\n * - `ort-wasm-simd-threaded.mjs` for default build\n * - `ort-wasm-simd-threaded.jsep.mjs` for JSEP build (with WebGPU and WebNN)\n * - `ort-training-wasm-simd-threaded.mjs` for training build\n */\n mjs?: URL|string;\n }\n export type WasmPrefixOrFilePaths = WasmPathPrefix|WasmFilePaths;\n export interface WebAssemblyFlags {\n /**\n * set or get number of thread(s). If omitted or set to 0, number of thread(s) will be determined by system. If set\n * to 1, no worker thread will be spawned.\n *\n * This setting is available only when WebAssembly multithread feature is available in current context.\n *\n * @defaultValue `0`\n */\n numThreads?: number;\n\n /**\n * set or get a boolean value indicating whether to enable SIMD. If set to false, SIMD will be forcely disabled.\n *\n * This setting is available only when WebAssembly SIMD feature is available in current context.\n *\n * @deprecated This property is deprecated. Since SIMD is supported by all major JavaScript engines, non-SIMD\n * build is no longer provided. This property will be removed in future release.\n * @defaultValue `true`\n */\n simd?: boolean;\n\n /**\n * set or get a boolean value indicating whether to enable trace.\n *\n * @deprecated Use `env.trace` instead. If `env.trace` is set, this property will be ignored.\n * @defaultValue `false`\n */\n trace?: boolean;\n\n /**\n * Set or get a number specifying the timeout for initialization of WebAssembly backend, in milliseconds. A zero\n * value indicates no timeout is set.\n *\n * @defaultValue `0`\n */\n initTimeout?: number;\n\n /**\n * Set a custom URL prefix to the .wasm/.mjs files, or an object of overrides for both .wasm/.mjs file. The override\n * path should be an absolute path.\n */\n wasmPaths?: WasmPrefixOrFilePaths;\n\n /**\n * Set or get a boolean value indicating whether to proxy the execution of main thread to a worker thread.\n *\n * @defaultValue `false`\n */\n proxy?: boolean;\n }\n\n export interface WebGLFlags {\n /**\n * Set or get the WebGL Context ID (webgl or webgl2).\n *\n * @defaultValue `'webgl2'`\n */\n contextId?: 'webgl'|'webgl2';\n /**\n * Get the WebGL rendering context.\n */\n readonly context: WebGLRenderingContext;\n /**\n * Set or get the maximum batch size for matmul. 0 means to disable batching.\n *\n * @deprecated\n */\n matmulMaxBatchSize?: number;\n /**\n * Set or get the texture cache mode.\n *\n * @defaultValue `'full'`\n */\n textureCacheMode?: 'initializerOnly'|'full';\n /**\n * Set or get the packed texture mode\n *\n * @defaultValue `false`\n */\n pack?: boolean;\n /**\n * Set or get whether enable async download.\n *\n * @defaultValue `false`\n */\n async?: boolean;\n }\n\n export interface WebGpuProfilingDataV1TensorMetadata {\n dims: readonly number[];\n dataType: string;\n }\n export interface WebGpuProfilingDataV1 {\n version: 1;\n inputsMetadata: readonly WebGpuProfilingDataV1TensorMetadata[];\n outputsMetadata: readonly WebGpuProfilingDataV1TensorMetadata[];\n kernelId: number;\n kernelType: string;\n kernelName: string;\n programName: string;\n startTime: number;\n endTime: number;\n }\n\n export type WebGpuProfilingData = WebGpuProfilingDataV1;\n\n export interface WebGpuFlags {\n /**\n * Set or get the profiling mode.\n *\n * @deprecated Use `env.webgpu.profiling.mode` instead. If `env.webgpu.profiling.mode` is set, this property will be\n * ignored.\n */\n profilingMode?: 'off'|'default';\n /**\n * Set or get the profiling configuration.\n */\n profiling?: {\n /**\n * Set or get the profiling mode.\n *\n * @defaultValue `'off'`\n */\n mode?: 'off'|'default';\n\n /**\n * Set or get a callback function when a profiling data is received. If not set, the profiling data will be\n * printed to console.\n */\n ondata?: (data: WebGpuProfilingData) => void;\n };\n /**\n * Set or get the power preference.\n *\n * Setting this property only has effect before the first WebGPU inference session is created. The value will be\n * used as options for `navigator.gpu.requestAdapter()`.\n *\n * See {@link https://gpuweb.github.io/gpuweb/#dictdef-gpurequestadapteroptions} for more details.\n *\n * @defaultValue `undefined`\n */\n powerPreference?: 'low-power'|'high-performance';\n /**\n * Set or get the force fallback adapter flag.\n *\n * Setting this property only has effect before the first WebGPU inference session is created. The value will be\n * used as options for `navigator.gpu.requestAdapter()`.\n *\n * See {@link https://gpuweb.github.io/gpuweb/#dictdef-gpurequestadapteroptions} for more details.\n *\n * @defaultValue `undefined`\n */\n forceFallbackAdapter?: boolean;\n /**\n * Set or get the adapter for WebGPU.\n *\n * Setting this property only has effect before the first WebGPU inference session is created. The value will be\n * used as the GPU adapter for the underlying WebGPU backend to create GPU device.\n *\n * If this property is not set, it will be available to get after the first WebGPU inference session is created. The\n * value will be the GPU adapter that created by the underlying WebGPU backend.\n *\n * When use with TypeScript, the type of this property is `GPUAdapter` defined in \"@webgpu/types\".\n * Use `const adapter = env.webgpu.adapter as GPUAdapter;` in TypeScript to access this property with correct type.\n *\n * see comments on {@link Tensor.GpuBufferType}\n */\n adapter: unknown;\n /**\n * Get the device for WebGPU.\n *\n * This property is only available after the first WebGPU inference session is created.\n *\n * When use with TypeScript, the type of this property is `GPUDevice` defined in \"@webgpu/types\".\n * Use `const device = env.webgpu.device as GPUDevice;` in TypeScript to access this property with correct type.\n *\n * see comments on {@link Tensor.GpuBufferType} for more details about why not use types defined in \"@webgpu/types\".\n */\n readonly device: unknown;\n /**\n * Set or get whether validate input content.\n *\n * @defaultValue `false`\n */\n validateInputContent?: boolean;\n }\n}\n\nexport interface Env {\n /**\n * set the severity level for logging.\n *\n * @defaultValue `'warning'`\n */\n logLevel?: 'verbose'|'info'|'warning'|'error'|'fatal';\n\n /**\n * Indicate whether run in debug mode.\n *\n * @defaultValue `false`\n */\n debug?: boolean;\n\n /**\n * set or get a boolean value indicating whether to enable trace.\n *\n * @defaultValue `false`\n */\n trace?: boolean;\n\n /**\n * Get version of the current package.\n */\n readonly versions: {\n readonly common: string;\n readonly web?: string;\n readonly node?: string;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n readonly 'react-native'?: string;\n };\n\n /**\n * Represent a set of flags for WebAssembly\n */\n readonly wasm: Env.WebAssemblyFlags;\n\n /**\n * Represent a set of flags for WebGL\n */\n readonly webgl: Env.WebGLFlags;\n\n /**\n * Represent a set of flags for WebGPU\n */\n readonly webgpu: Env.WebGpuFlags;\n\n [name: string]: unknown;\n}\n\n/**\n * Represent a set of flags as a global singleton.\n */\nexport const env: Env = envImpl;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorToDataUrlOptions, TensorToImageDataOptions} from './tensor-conversion.js';\nimport {Tensor} from './tensor.js';\n\n/**\n * implementation of Tensor.toDataURL()\n */\nexport const tensorToDataURL = (tensor: Tensor, options?: TensorToDataUrlOptions): string => {\n const canvas = typeof document !== 'undefined' ? document.createElement('canvas') : (new OffscreenCanvas(1, 1));\n canvas.width = tensor.dims[3];\n canvas.height = tensor.dims[2];\n const pixels2DContext =\n canvas.getContext('2d') as (CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null);\n\n if (pixels2DContext != null) {\n // Default values for height and width & format\n let width: number;\n let height: number;\n if (options?.tensorLayout !== undefined && options.tensorLayout === 'NHWC') {\n width = tensor.dims[2];\n height = tensor.dims[3];\n } else { // Default layout is NCWH\n width = tensor.dims[3];\n height = tensor.dims[2];\n }\n\n const inputformat = options?.format !== undefined ? options.format : 'RGB';\n\n const norm = options?.norm;\n let normMean: [number, number, number, number];\n let normBias: [number, number, number, number];\n if (norm === undefined || norm.mean === undefined) {\n normMean = [255, 255, 255, 255];\n } else {\n if (typeof (norm.mean) === 'number') {\n normMean = [norm.mean, norm.mean, norm.mean, norm.mean];\n } else {\n normMean = [norm.mean[0], norm.mean[1], norm.mean[2], 0];\n if (norm.mean[3] !== undefined) {\n normMean[3] = norm.mean[3];\n }\n }\n }\n if (norm === undefined || norm.bias === undefined) {\n normBias = [0, 0, 0, 0];\n } else {\n if (typeof (norm.bias) === 'number') {\n normBias = [norm.bias, norm.bias, norm.bias, norm.bias];\n } else {\n normBias = [norm.bias[0], norm.bias[1], norm.bias[2], 0];\n if (norm.bias[3] !== undefined) {\n normBias[3] = norm.bias[3];\n }\n }\n }\n\n const stride = height * width;\n // Default pointer assignments\n let rTensorPointer = 0, gTensorPointer = stride, bTensorPointer = stride * 2, aTensorPointer = -1;\n\n // Updating the pointer assignments based on the input image format\n if (inputformat === 'RGBA') {\n rTensorPointer = 0;\n gTensorPointer = stride;\n bTensorPointer = stride * 2;\n aTensorPointer = stride * 3;\n } else if (inputformat === 'RGB') {\n rTensorPointer = 0;\n gTensorPointer = stride;\n bTensorPointer = stride * 2;\n } else if (inputformat === 'RBG') {\n rTensorPointer = 0;\n bTensorPointer = stride;\n gTensorPointer = stride * 2;\n }\n\n for (let i = 0; i < height; i++) {\n for (let j = 0; j < width; j++) {\n const R = ((tensor.data[rTensorPointer++] as number) - normBias[0]) * normMean[0]; // R value\n const G = ((tensor.data[gTensorPointer++] as number) - normBias[1]) * normMean[1]; // G value\n const B = ((tensor.data[bTensorPointer++] as number) - normBias[2]) * normMean[2]; // B value\n const A = aTensorPointer === -1 ?\n 255 :\n ((tensor.data[aTensorPointer++] as number) - normBias[3]) * normMean[3]; // A value\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n pixels2DContext.fillStyle = 'rgba(' + R + ',' + G + ',' + B + ',' + A + ')';\n pixels2DContext.fillRect(j, i, 1, 1);\n }\n }\n if ('toDataURL' in canvas) {\n return canvas.toDataURL();\n } else {\n throw new Error('toDataURL is not supported');\n }\n } else {\n throw new Error('Can not access image data');\n }\n};\n\n/**\n * implementation of Tensor.toImageData()\n */\nexport const tensorToImageData = (tensor: Tensor, options?: TensorToImageDataOptions): ImageData => {\n const pixels2DContext = typeof document !== 'undefined' ?\n document.createElement('canvas').getContext('2d') :\n new OffscreenCanvas(1, 1).getContext('2d') as OffscreenCanvasRenderingContext2D;\n let image: ImageData;\n if (pixels2DContext != null) {\n // Default values for height and width & format\n let width: number;\n let height: number;\n let channels: number;\n if (options?.tensorLayout !== undefined && options.tensorLayout === 'NHWC') {\n width = tensor.dims[2];\n height = tensor.dims[1];\n channels = tensor.dims[3];\n } else { // Default layout is NCWH\n width = tensor.dims[3];\n height = tensor.dims[2];\n channels = tensor.dims[1];\n }\n const inputformat = options !== undefined ? (options.format !== undefined ? options.format : 'RGB') : 'RGB';\n\n const norm = options?.norm;\n let normMean: [number, number, number, number];\n let normBias: [number, number, number, number];\n if (norm === undefined || norm.mean === undefined) {\n normMean = [255, 255, 255, 255];\n } else {\n if (typeof (norm.mean) === 'number') {\n normMean = [norm.mean, norm.mean, norm.mean, norm.mean];\n } else {\n normMean = [norm.mean[0], norm.mean[1], norm.mean[2], 255];\n if (norm.mean[3] !== undefined) {\n normMean[3] = norm.mean[3];\n }\n }\n }\n if (norm === undefined || norm.bias === undefined) {\n normBias = [0, 0, 0, 0];\n } else {\n if (typeof (norm.bias) === 'number') {\n normBias = [norm.bias, norm.bias, norm.bias, norm.bias];\n } else {\n normBias = [norm.bias[0], norm.bias[1], norm.bias[2], 0];\n if (norm.bias[3] !== undefined) {\n normBias[3] = norm.bias[3];\n }\n }\n }\n\n const stride = height * width;\n if (options !== undefined) {\n if (options.format !== undefined && (channels === 4 && options.format !== 'RGBA') ||\n (channels === 3 && (options.format !== 'RGB' && options.format !== 'BGR'))) {\n throw new Error('Tensor format doesn\\'t match input tensor dims');\n }\n }\n\n // Default pointer assignments\n const step = 4;\n let rImagePointer = 0, gImagePointer = 1, bImagePointer = 2, aImagePointer = 3;\n let rTensorPointer = 0, gTensorPointer = stride, bTensorPointer = stride * 2, aTensorPointer = -1;\n\n // Updating the pointer assignments based on the input image format\n if (inputformat === 'RGBA') {\n rTensorPointer = 0;\n gTensorPointer = stride;\n bTensorPointer = stride * 2;\n aTensorPointer = stride * 3;\n } else if (inputformat === 'RGB') {\n rTensorPointer = 0;\n gTensorPointer = stride;\n bTensorPointer = stride * 2;\n } else if (inputformat === 'RBG') {\n rTensorPointer = 0;\n bTensorPointer = stride;\n gTensorPointer = stride * 2;\n }\n\n image = pixels2DContext.createImageData(width, height);\n\n for (let i = 0; i < height * width;\n rImagePointer += step, gImagePointer += step, bImagePointer += step, aImagePointer += step, i++) {\n image.data[rImagePointer] = ((tensor.data[rTensorPointer++] as number) - normBias[0]) * normMean[0]; // R value\n image.data[gImagePointer] = ((tensor.data[gTensorPointer++] as number) - normBias[1]) * normMean[1]; // G value\n image.data[bImagePointer] = ((tensor.data[bTensorPointer++] as number) - normBias[2]) * normMean[2]; // B value\n image.data[aImagePointer] = aTensorPointer === -1 ?\n 255 :\n ((tensor.data[aTensorPointer++] as number) - normBias[3]) * normMean[3]; // A value\n }\n\n } else {\n throw new Error('Can not access image data');\n }\n return image;\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {OptionsDimensions, OptionsFormat, OptionsNormalizationParameters, OptionsTensorFormat, OptionsTensorLayout, TensorFromGpuBufferOptions, TensorFromImageBitmapOptions, TensorFromImageDataOptions, TensorFromImageElementOptions, TensorFromTextureOptions, TensorFromUrlOptions} from './tensor-factory.js';\nimport {Tensor} from './tensor-impl.js';\nimport {Tensor as TensorInterface} from './tensor.js';\n\ninterface BufferToTensorOptions extends OptionsDimensions, OptionsTensorLayout, OptionsNormalizationParameters,\n OptionsFormat, OptionsTensorFormat {}\n\n/**\n * Create a new tensor object from image object\n *\n * @param buffer - Extracted image buffer data - assuming RGBA format\n * @param imageFormat - input image configuration - required configurations height, width, format\n * @param tensorFormat - output tensor configuration - Default is RGB format\n */\nexport const bufferToTensor = (buffer: Uint8ClampedArray|undefined, options: BufferToTensorOptions): Tensor => {\n if (buffer === undefined) {\n throw new Error('Image buffer must be defined');\n }\n if (options.height === undefined || options.width === undefined) {\n throw new Error('Image height and width must be defined');\n }\n if (options.tensorLayout === 'NHWC') {\n throw new Error('NHWC Tensor layout is not supported yet');\n }\n\n const {height, width} = options;\n\n const norm = options.norm ?? {mean: 255, bias: 0};\n let normMean: [number, number, number, number];\n let normBias: [number, number, number, number];\n\n if (typeof (norm.mean) === 'number') {\n normMean = [norm.mean, norm.mean, norm.mean, norm.mean];\n } else {\n normMean = [norm.mean![0], norm.mean![1], norm.mean![2], norm.mean![3] ?? 255];\n }\n\n if (typeof (norm.bias) === 'number') {\n normBias = [norm.bias, norm.bias, norm.bias, norm.bias];\n } else {\n normBias = [norm.bias![0], norm.bias![1], norm.bias![2], norm.bias![3] ?? 0];\n }\n\n const inputformat = options.format !== undefined ? options.format : 'RGBA';\n // default value is RGBA since imagedata and HTMLImageElement uses it\n\n const outputformat =\n options.tensorFormat !== undefined ? (options.tensorFormat !== undefined ? options.tensorFormat : 'RGB') : 'RGB';\n const stride = height * width;\n const float32Data = outputformat === 'RGBA' ? new Float32Array(stride * 4) : new Float32Array(stride * 3);\n\n // Default pointer assignments\n let step = 4, rImagePointer = 0, gImagePointer = 1, bImagePointer = 2, aImagePointer = 3;\n let rTensorPointer = 0, gTensorPointer = stride, bTensorPointer = stride * 2, aTensorPointer = -1;\n\n // Updating the pointer assignments based on the input image format\n if (inputformat === 'RGB') {\n step = 3;\n rImagePointer = 0;\n gImagePointer = 1;\n bImagePointer = 2;\n aImagePointer = -1;\n }\n\n // Updating the pointer assignments based on the output tensor format\n if (outputformat === 'RGBA') {\n aTensorPointer = stride * 3;\n } else if (outputformat === 'RBG') {\n rTensorPointer = 0;\n bTensorPointer = stride;\n gTensorPointer = stride * 2;\n } else if (outputformat === 'BGR') {\n bTensorPointer = 0;\n gTensorPointer = stride;\n rTensorPointer = stride * 2;\n }\n\n for (let i = 0; i < stride;\n i++, rImagePointer += step, bImagePointer += step, gImagePointer += step, aImagePointer += step) {\n float32Data[rTensorPointer++] = (buffer[rImagePointer] + normBias[0]) / normMean[0];\n float32Data[gTensorPointer++] = (buffer[gImagePointer] + normBias[1]) / normMean[1];\n float32Data[bTensorPointer++] = (buffer[bImagePointer] + normBias[2]) / normMean[2];\n if (aTensorPointer !== -1 && aImagePointer !== -1) {\n float32Data[aTensorPointer++] = (buffer[aImagePointer] + normBias[3]) / normMean[3];\n }\n }\n\n // Float32Array -> ort.Tensor\n const outputTensor = outputformat === 'RGBA' ? new Tensor('float32', float32Data, [1, 4, height, width]) :\n new Tensor('float32', float32Data, [1, 3, height, width]);\n return outputTensor;\n};\n\n/**\n * implementation of Tensor.fromImage().\n */\nexport const tensorFromImage = async(\n image: ImageData|HTMLImageElement|ImageBitmap|string,\n options?: TensorFromImageDataOptions|TensorFromImageElementOptions|TensorFromImageBitmapOptions|\n TensorFromUrlOptions): Promise => {\n // checking the type of image object\n const isHTMLImageEle = typeof (HTMLImageElement) !== 'undefined' && image instanceof HTMLImageElement;\n const isImageDataEle = typeof (ImageData) !== 'undefined' && image instanceof ImageData;\n const isImageBitmap = typeof (ImageBitmap) !== 'undefined' && image instanceof ImageBitmap;\n const isString = typeof image === 'string';\n\n let data: Uint8ClampedArray|undefined;\n let bufferToTensorOptions: BufferToTensorOptions = options ?? {};\n\n const createCanvas = () => {\n if (typeof document !== 'undefined') {\n return document.createElement('canvas');\n } else if (typeof OffscreenCanvas !== 'undefined') {\n return new OffscreenCanvas(1, 1);\n } else {\n throw new Error('Canvas is not supported');\n }\n };\n const createCanvasContext = (canvas: HTMLCanvasElement|OffscreenCanvas) => {\n if (canvas instanceof HTMLCanvasElement) {\n return canvas.getContext('2d');\n } else if (canvas instanceof OffscreenCanvas) {\n return canvas.getContext('2d') as OffscreenCanvasRenderingContext2D;\n } else {\n return null;\n }\n };\n // filling and checking image configuration options\n if (isHTMLImageEle) {\n // HTMLImageElement - image object - format is RGBA by default\n const canvas = createCanvas();\n canvas.width = image.width;\n canvas.height = image.height;\n const pixels2DContext = createCanvasContext(canvas);\n\n if (pixels2DContext != null) {\n let height = image.height;\n let width = image.width;\n if (options !== undefined && options.resizedHeight !== undefined && options.resizedWidth !== undefined) {\n height = options.resizedHeight;\n width = options.resizedWidth;\n }\n\n if (options !== undefined) {\n bufferToTensorOptions = options;\n if (options.tensorFormat !== undefined) {\n throw new Error('Image input config format must be RGBA for HTMLImageElement');\n } else {\n bufferToTensorOptions.tensorFormat = 'RGBA';\n }\n bufferToTensorOptions.height = height;\n bufferToTensorOptions.width = width;\n } else {\n bufferToTensorOptions.tensorFormat = 'RGBA';\n bufferToTensorOptions.height = height;\n bufferToTensorOptions.width = width;\n }\n\n pixels2DContext.drawImage(image, 0, 0);\n data = pixels2DContext.getImageData(0, 0, width, height).data;\n } else {\n throw new Error('Can not access image data');\n }\n } else if (isImageDataEle) {\n let height: number;\n let width: number;\n\n if (options !== undefined && options.resizedWidth !== undefined && options.resizedHeight !== undefined) {\n height = options.resizedHeight;\n width = options.resizedWidth;\n } else {\n height = image.height;\n width = image.width;\n }\n\n if (options !== undefined) {\n bufferToTensorOptions = options;\n }\n bufferToTensorOptions.format = 'RGBA';\n bufferToTensorOptions.height = height;\n bufferToTensorOptions.width = width;\n\n if (options !== undefined) {\n const tempCanvas = createCanvas();\n\n tempCanvas.width = width;\n tempCanvas.height = height;\n\n const pixels2DContext = createCanvasContext(tempCanvas);\n\n if (pixels2DContext != null) {\n pixels2DContext.putImageData(image, 0, 0);\n data = pixels2DContext.getImageData(0, 0, width, height).data;\n } else {\n throw new Error('Can not access image data');\n }\n } else {\n data = image.data;\n }\n } else if (isImageBitmap) {\n // ImageBitmap - image object - format must be provided by user\n if (options === undefined) {\n throw new Error('Please provide image config with format for Imagebitmap');\n }\n\n const canvas = createCanvas();\n canvas.width = image.width;\n canvas.height = image.height;\n const pixels2DContext = createCanvasContext(canvas);\n\n if (pixels2DContext != null) {\n const height = image.height;\n const width = image.width;\n pixels2DContext.drawImage(image, 0, 0, width, height);\n data = pixels2DContext.getImageData(0, 0, width, height).data;\n bufferToTensorOptions.height = height;\n bufferToTensorOptions.width = width;\n return bufferToTensor(data, bufferToTensorOptions);\n } else {\n throw new Error('Can not access image data');\n }\n } else if (isString) {\n return new Promise((resolve, reject) => {\n const canvas = createCanvas();\n const context = createCanvasContext(canvas);\n if (!image || !context) {\n return reject();\n }\n const newImage = new Image();\n newImage.crossOrigin = 'Anonymous';\n newImage.src = image;\n newImage.onload = () => {\n canvas.width = newImage.width;\n canvas.height = newImage.height;\n context.drawImage(newImage, 0, 0, canvas.width, canvas.height);\n const img = context.getImageData(0, 0, canvas.width, canvas.height);\n\n bufferToTensorOptions.height = canvas.height;\n bufferToTensorOptions.width = canvas.width;\n resolve(bufferToTensor(img.data, bufferToTensorOptions));\n };\n });\n } else {\n throw new Error('Input data provided is not supported - aborted tensor creation');\n }\n\n if (data !== undefined) {\n return bufferToTensor(data, bufferToTensorOptions);\n } else {\n throw new Error('Input data provided is not supported - aborted tensor creation');\n }\n};\n\n/**\n * implementation of Tensor.fromTexture().\n */\nexport const tensorFromTexture = (\n texture: TensorInterface.TextureType, options: TensorFromTextureOptions): Tensor => {\n const {width, height, download, dispose} = options;\n // Always assume RGBAF32. TODO: support different texture format\n const dims = [1, height, width, 4];\n return new Tensor({location: 'texture', type: 'float32', texture, dims, download, dispose});\n};\n\n/**\n * implementation of Tensor.fromGpuBuffer().\n */\nexport const tensorFromGpuBuffer = (\n gpuBuffer: TensorInterface.GpuBufferType, options: TensorFromGpuBufferOptions): Tensor => {\n const {dataType, dims, download, dispose} = options;\n return new Tensor({location: 'gpu-buffer', type: dataType ?? 'float32', gpuBuffer, dims, download, dispose});\n};\n\n/**\n * implementation of Tensor.fromPinnedBuffer().\n */\nexport const tensorFromPinnedBuffer = (\n type: T, buffer: TensorInterface.DataTypeMap[T], dims?: readonly number[]): Tensor =>\n new Tensor({location: 'cpu-pinned', type, data: buffer, dims: dims ?? [buffer.length]});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from './tensor.js';\n\nexport type SupportedTypedArrayConstructors = Float32ArrayConstructor|Uint8ArrayConstructor|Int8ArrayConstructor|\n Uint16ArrayConstructor|Int16ArrayConstructor|Int32ArrayConstructor|BigInt64ArrayConstructor|Uint8ArrayConstructor|\n Float64ArrayConstructor|Uint32ArrayConstructor|BigUint64ArrayConstructor;\nexport type SupportedTypedArray = InstanceType;\n\n// a runtime map that maps type string to TypedArray constructor. Should match Tensor.DataTypeMap.\nexport const NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP = new Map([\n ['float32', Float32Array],\n ['uint8', Uint8Array],\n ['int8', Int8Array],\n ['uint16', Uint16Array],\n ['int16', Int16Array],\n ['int32', Int32Array],\n ['bool', Uint8Array],\n ['float64', Float64Array],\n ['uint32', Uint32Array],\n]);\n\n// a runtime map that maps type string to TypedArray constructor. Should match Tensor.DataTypeMap.\nexport const NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP = new Map([\n [Float32Array, 'float32'],\n [Uint8Array, 'uint8'],\n [Int8Array, 'int8'],\n [Uint16Array, 'uint16'],\n [Int16Array, 'int16'],\n [Int32Array, 'int32'],\n [Float64Array, 'float64'],\n [Uint32Array, 'uint32'],\n]);\n\n// a dummy type declaration for Float16Array in case any polyfill is available.\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-explicit-any\n const Float16Array: any;\n}\n\n// the following code allows delaying execution of BigInt/Float16Array checking. This allows lazy initialization for\n// NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP and NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP, which allows BigInt/Float16Array\n// polyfill if available.\nlet isTypedArrayChecked = false;\nexport const checkTypedArray = () => {\n if (!isTypedArrayChecked) {\n isTypedArrayChecked = true;\n const isBigInt64ArrayAvailable = typeof BigInt64Array !== 'undefined' && BigInt64Array.from;\n const isBigUint64ArrayAvailable = typeof BigUint64Array !== 'undefined' && BigUint64Array.from;\n const isFloat16ArrayAvailable = typeof Float16Array !== 'undefined' && Float16Array.from;\n\n if (isBigInt64ArrayAvailable) {\n NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('int64', BigInt64Array);\n NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(BigInt64Array, 'int64');\n }\n if (isBigUint64ArrayAvailable) {\n NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('uint64', BigUint64Array);\n NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(BigUint64Array, 'uint64');\n }\n if (isFloat16ArrayAvailable) {\n NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('float16', Float16Array);\n NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.set(Float16Array, 'float16');\n } else {\n // if Float16Array is not available, use 'Uint16Array' to store the data.\n NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.set('float16', Uint16Array);\n }\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {CpuPinnedConstructorParameters, GpuBufferConstructorParameters, TextureConstructorParameters} from './tensor-factory.js';\nimport {Tensor} from './tensor-impl.js';\n\n/**\n * calculate size from dims.\n *\n * @param dims the dims array. May be an illegal input.\n */\nexport const calculateSize = (dims: readonly unknown[]): number => {\n let size = 1;\n for (let i = 0; i < dims.length; i++) {\n const dim = dims[i];\n if (typeof dim !== 'number' || !Number.isSafeInteger(dim)) {\n throw new TypeError(`dims[${i}] must be an integer, got: ${dim}`);\n }\n if (dim < 0) {\n throw new RangeError(`dims[${i}] must be a non-negative integer, got: ${dim}`);\n }\n size *= dim;\n }\n return size;\n};\n\n/**\n * implementation of Tensor.reshape()\n */\nexport const tensorReshape = (tensor: Tensor, dims: readonly number[]): Tensor => {\n switch (tensor.location) {\n case 'cpu':\n return new Tensor(tensor.type, tensor.data, dims);\n case 'cpu-pinned':\n return new Tensor({\n location: 'cpu-pinned',\n data: tensor.data as CpuPinnedConstructorParameters['data'],\n type: tensor.type as CpuPinnedConstructorParameters['type'],\n dims,\n });\n case 'texture':\n return new Tensor({\n location: 'texture',\n texture: tensor.texture,\n type: tensor.type as TextureConstructorParameters['type'],\n dims,\n });\n case 'gpu-buffer':\n return new Tensor({\n location: 'gpu-buffer',\n gpuBuffer: tensor.gpuBuffer,\n type: tensor.type as GpuBufferConstructorParameters['type'],\n dims,\n });\n default:\n throw new Error(`tensorReshape: tensor location ${tensor.location} is not supported`);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {tensorToDataURL, tensorToImageData} from './tensor-conversion-impl.js';\nimport {TensorToDataUrlOptions, TensorToImageDataOptions} from './tensor-conversion.js';\nimport {tensorFromGpuBuffer, tensorFromImage, tensorFromPinnedBuffer, tensorFromTexture} from './tensor-factory-impl.js';\nimport {CpuPinnedConstructorParameters, GpuBufferConstructorParameters, TensorFromGpuBufferOptions, TensorFromImageBitmapOptions, TensorFromImageDataOptions, TensorFromImageElementOptions, TensorFromTextureOptions, TensorFromUrlOptions, TextureConstructorParameters} from './tensor-factory.js';\nimport {checkTypedArray, NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP, NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP, SupportedTypedArray, SupportedTypedArrayConstructors} from './tensor-impl-type-mapping.js';\nimport {calculateSize, tensorReshape} from './tensor-utils-impl.js';\nimport {Tensor as TensorInterface} from './tensor.js';\n\n// type aliases for those exported from Tensor interface\n\ntype TensorType = TensorInterface.Type;\ntype TensorDataType = TensorInterface.DataType;\ntype TensorDataLocation = TensorInterface.DataLocation;\ntype TensorTextureType = TensorInterface.TextureType;\ntype TensorGpuBufferType = TensorInterface.GpuBufferType;\n\n/**\n * the implementation of Tensor interface.\n *\n * @ignore\n */\nexport class Tensor implements TensorInterface {\n // #region constructors\n\n /**\n * Construct a new CPU tensor object from the given type, data and dims.\n */\n constructor(\n type: TensorType, data: TensorDataType|readonly string[]|readonly number[]|readonly boolean[],\n dims?: readonly number[]);\n /**\n * Construct a new CPU tensor object from the given data and dims. Type is inferred from data.\n */\n constructor(data: TensorDataType|readonly string[]|readonly boolean[], dims?: readonly number[]);\n /**\n * Construct a new tensor object from the pinned CPU data with the given type and dims.\n *\n * Tensor's location will be set to 'cpu-pinned'.\n *\n * @param params - Specify the parameters to construct the tensor.\n */\n constructor(params: CpuPinnedConstructorParameters);\n /**\n * Construct a new tensor object from the WebGL texture with the given type and dims.\n *\n * Tensor's location will be set to 'texture'.\n *\n * @param params - Specify the parameters to construct the tensor.\n */\n constructor(params: TextureConstructorParameters);\n /**\n * Construct a new tensor object from the WebGPU buffer with the given type and dims.\n *\n * Tensor's location will be set to 'gpu-buffer'.\n *\n * @param params - Specify the parameters to construct the tensor.\n */\n constructor(params: GpuBufferConstructorParameters);\n\n /**\n * implementation.\n */\n constructor(\n arg0: TensorType|TensorDataType|readonly string[]|readonly boolean[]|CpuPinnedConstructorParameters|\n TextureConstructorParameters|GpuBufferConstructorParameters,\n arg1?: TensorDataType|readonly number[]|readonly string[]|readonly boolean[], arg2?: readonly number[]) {\n // perform one-time check for BigInt/Float16Array support\n checkTypedArray();\n\n let type: TensorType;\n let dims: readonly number[];\n\n if (typeof arg0 === 'object' && 'location' in arg0) {\n //\n // constructing tensor from specific location\n //\n this.dataLocation = arg0.location;\n type = arg0.type;\n dims = arg0.dims;\n switch (arg0.location) {\n case 'cpu-pinned': {\n const expectedTypedArrayConstructor = NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.get(type);\n if (!expectedTypedArrayConstructor) {\n throw new TypeError(`unsupported type \"${type}\" to create tensor from pinned buffer`);\n }\n if (!(arg0.data instanceof expectedTypedArrayConstructor)) {\n throw new TypeError(`buffer should be of type ${expectedTypedArrayConstructor.name}`);\n }\n this.cpuData = arg0.data;\n break;\n }\n case 'texture': {\n if (type !== 'float32') {\n throw new TypeError(`unsupported type \"${type}\" to create tensor from texture`);\n }\n this.gpuTextureData = arg0.texture;\n this.downloader = arg0.download;\n this.disposer = arg0.dispose;\n break;\n }\n case 'gpu-buffer': {\n if ((type !== 'float32' && type !== 'float16' && type !== 'int32' && type !== 'int64' && type !== 'uint32' &&\n type !== 'uint8' && type !== 'bool')) {\n throw new TypeError(`unsupported type \"${type}\" to create tensor from gpu buffer`);\n }\n this.gpuBufferData = arg0.gpuBuffer;\n this.downloader = arg0.download;\n this.disposer = arg0.dispose;\n break;\n }\n default:\n throw new Error(`Tensor constructor: unsupported location '${this.dataLocation}'`);\n }\n } else {\n //\n // constructing tensor of location 'cpu'\n //\n let data: TensorDataType;\n let maybeDims: typeof arg1|typeof arg2;\n // check whether arg0 is type or data\n if (typeof arg0 === 'string') {\n //\n // Override: constructor(type, data, ...)\n //\n type = arg0;\n maybeDims = arg2;\n if (arg0 === 'string') {\n // string tensor\n if (!Array.isArray(arg1)) {\n throw new TypeError('A string tensor\\'s data must be a string array.');\n }\n // we don't check whether every element in the array is string; this is too slow. we assume it's correct and\n // error will be populated at inference\n data = arg1;\n } else {\n // numeric tensor\n const typedArrayConstructor = NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP.get(arg0);\n if (typedArrayConstructor === undefined) {\n throw new TypeError(`Unsupported tensor type: ${arg0}.`);\n }\n if (Array.isArray(arg1)) {\n if (arg0 === 'float16' && typedArrayConstructor === Uint16Array) {\n // When no Float16Array polyfill is used, we cannot create 'float16' tensor from number array.\n //\n // Throw error here because when user try to use number array as data,\n // e.g. new Tensor('float16', [1, 2, 3, 4], dims)), it will actually call\n // Uint16Array.from(arg1) which generates wrong data.\n throw new TypeError(\n 'Creating a float16 tensor from number array is not supported. Please use Uint16Array as data.');\n } else if (arg0 === 'uint64' || arg0 === 'int64') {\n // use 'as any' here because:\n // 1. TypeScript's check on type of 'Array.isArray()' does not work with readonly arrays.\n // see https://github.com/microsoft/TypeScript/issues/17002\n // 2. TypeScript's check on union type of '(BigInt64ArrayConstructor|BigUint64ArrayConstructor).from()'\n // does not accept parameter mapFn.\n // 3. parameters of 'SupportedTypedArrayConstructors.from()' does not match the requirement of the union\n // type.\n\n // assume 'arg1' is of type \"readonly number[]|readonly bigint[]\" here.\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data = (typedArrayConstructor as any).from(arg1, BigInt);\n } else {\n // assume 'arg1' is of type \"readonly number[]\" here.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data = (typedArrayConstructor as any).from(arg1);\n }\n } else if (arg1 instanceof typedArrayConstructor) {\n data = arg1;\n } else {\n throw new TypeError(`A ${type} tensor's data must be type of ${typedArrayConstructor}`);\n }\n }\n } else {\n //\n // Override: constructor(data, ...)\n //\n maybeDims = arg1;\n if (Array.isArray(arg0)) {\n // only boolean[] and string[] is supported\n if (arg0.length === 0) {\n throw new TypeError('Tensor type cannot be inferred from an empty array.');\n }\n const firstElementType = typeof arg0[0];\n if (firstElementType === 'string') {\n type = 'string';\n data = arg0;\n } else if (firstElementType === 'boolean') {\n type = 'bool';\n // 'arg0' is of type 'boolean[]'. Uint8Array.from(boolean[]) actually works, but typescript thinks this is\n // wrong type. We use 'as any' to make it happy.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data = Uint8Array.from(arg0 as any[]);\n } else {\n throw new TypeError(`Invalid element type of data array: ${firstElementType}.`);\n }\n } else {\n // get tensor type from TypedArray\n const mappedType =\n NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP.get(arg0.constructor as SupportedTypedArrayConstructors);\n if (mappedType === undefined) {\n throw new TypeError(`Unsupported type for tensor data: ${arg0.constructor}.`);\n }\n type = mappedType;\n data = arg0 as SupportedTypedArray;\n }\n }\n\n // type and data is processed, now processing dims\n if (maybeDims === undefined) {\n // assume 1-D tensor if dims omitted\n maybeDims = [data.length];\n } else if (!Array.isArray(maybeDims)) {\n throw new TypeError('A tensor\\'s dims must be a number array');\n }\n dims = maybeDims as readonly number[];\n\n this.cpuData = data;\n this.dataLocation = 'cpu';\n }\n\n // perform check on dims\n const size = calculateSize(dims);\n // if data is on CPU, check whether data length matches tensor size\n if (this.cpuData && size !== this.cpuData.length) {\n throw new Error(`Tensor's size(${size}) does not match data length(${this.cpuData.length}).`);\n }\n\n this.type = type;\n this.dims = dims;\n this.size = size;\n }\n // #endregion\n\n // #region factory\n static async fromImage(\n image: ImageData|HTMLImageElement|ImageBitmap|string,\n options?: TensorFromImageDataOptions|TensorFromImageElementOptions|TensorFromImageBitmapOptions|\n TensorFromUrlOptions): Promise {\n return tensorFromImage(image, options);\n }\n\n static fromTexture(\n texture: TensorTextureType, options: TensorFromTextureOptions): TensorInterface {\n return tensorFromTexture(texture, options);\n }\n\n static fromGpuBuffer(\n gpuBuffer: TensorGpuBufferType, options: TensorFromGpuBufferOptions): TensorInterface {\n return tensorFromGpuBuffer(gpuBuffer, options);\n }\n\n static fromPinnedBuffer(\n type: T, buffer: TensorInterface.DataTypeMap[T], dims?: readonly number[]): Tensor {\n return tensorFromPinnedBuffer(type, buffer, dims);\n }\n\n // #endregion\n\n // #region conversions\n toDataURL(options?: TensorToDataUrlOptions): string {\n return tensorToDataURL(this, options);\n }\n\n toImageData(options?: TensorToImageDataOptions): ImageData {\n return tensorToImageData(this, options);\n }\n // #endregion\n\n // #region public fields\n readonly dims: readonly number[];\n readonly type: TensorType;\n readonly size: number;\n // #endregion\n\n // #region private fields\n\n /**\n * stores the location of the data.\n */\n private dataLocation: TensorDataLocation;\n\n /**\n * stores the data on CPU, if location is 'cpu' or 'cpu-pinned'. otherwise empty.\n */\n private cpuData?: TensorDataType;\n\n /**\n * stores the underlying texture when location is 'texture'. otherwise empty.\n */\n private gpuTextureData?: TensorTextureType;\n\n /**\n * stores the underlying GPU buffer when location is 'gpu-buffer'. otherwise empty.\n */\n private gpuBufferData?: TensorGpuBufferType;\n\n /**\n * stores an optional downloader function to download data from GPU to CPU.\n */\n private downloader?(): Promise;\n\n /**\n * a flag indicating whether the data is being downloaded from GPU to CPU.\n */\n private isDownloading?: boolean;\n\n /**\n * stores an optional disposer function to dispose the underlying data.\n */\n private disposer?(): void;\n // #endregion\n\n // #region properties\n get data(): TensorDataType {\n this.ensureValid();\n if (!this.cpuData) {\n throw new Error(\n 'The data is not on CPU. Use `getData()` to download GPU data to CPU, ' +\n 'or use `texture` or `gpuBuffer` property to access the GPU data directly.');\n }\n return this.cpuData;\n }\n\n get location(): TensorDataLocation {\n return this.dataLocation;\n }\n\n get texture(): TensorTextureType {\n this.ensureValid();\n if (!this.gpuTextureData) {\n throw new Error('The data is not stored as a WebGL texture.');\n }\n return this.gpuTextureData;\n }\n\n get gpuBuffer(): TensorGpuBufferType {\n this.ensureValid();\n if (!this.gpuBufferData) {\n throw new Error('The data is not stored as a WebGPU buffer.');\n }\n return this.gpuBufferData;\n }\n // #endregion\n\n // #region methods\n\n async getData(releaseData?: boolean): Promise {\n this.ensureValid();\n switch (this.dataLocation) {\n case 'cpu':\n case 'cpu-pinned':\n return this.data;\n case 'texture':\n case 'gpu-buffer': {\n if (!this.downloader) {\n throw new Error('The current tensor is not created with a specified data downloader.');\n }\n if (this.isDownloading) {\n throw new Error('The current tensor is being downloaded.');\n }\n try {\n this.isDownloading = true;\n const data = await this.downloader();\n this.downloader = undefined;\n this.dataLocation = 'cpu';\n this.cpuData = data;\n\n if (releaseData && this.disposer) {\n this.disposer();\n this.disposer = undefined;\n }\n\n return data;\n\n } finally {\n this.isDownloading = false;\n }\n }\n default:\n throw new Error(`cannot get data from location: ${this.dataLocation}`);\n }\n }\n\n dispose(): void {\n if (this.isDownloading) {\n throw new Error('The current tensor is being downloaded.');\n }\n\n if (this.disposer) {\n this.disposer();\n this.disposer = undefined;\n }\n this.cpuData = undefined;\n this.gpuTextureData = undefined;\n this.gpuBufferData = undefined;\n this.downloader = undefined;\n this.isDownloading = undefined;\n\n this.dataLocation = 'none';\n }\n\n // #endregion\n\n // #region tensor utilities\n private ensureValid(): void {\n if (this.dataLocation === 'none') {\n throw new Error('The tensor is disposed.');\n }\n }\n\n reshape(dims: readonly number[]): TensorInterface {\n this.ensureValid();\n if (this.downloader || this.disposer) {\n throw new Error('Cannot reshape a tensor that owns GPU resource.');\n }\n return tensorReshape(this, dims);\n }\n // #endregion\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorFactory} from './tensor-factory.js';\nimport {Tensor as TensorImpl} from './tensor-impl.js';\nimport {TypedTensorUtils} from './tensor-utils.js';\n\n/* eslint-disable @typescript-eslint/no-redeclare */\n\n/**\n * represent a basic tensor with specified dimensions and data type.\n */\ninterface TypedTensorBase {\n /**\n * Get the dimensions of the tensor.\n */\n readonly dims: readonly number[];\n /**\n * Get the data type of the tensor.\n */\n readonly type: T;\n /**\n * Get the buffer data of the tensor.\n *\n * If the data is not on CPU (eg. it's in the form of WebGL texture or WebGPU buffer), throw error.\n */\n readonly data: Tensor.DataTypeMap[T];\n /**\n * Get the location of the data.\n */\n readonly location: Tensor.DataLocation;\n /**\n * Get the WebGL texture that holds the tensor data.\n *\n * If the data is not on GPU as WebGL texture, throw error.\n */\n readonly texture: Tensor.TextureType;\n /**\n * Get the WebGPU buffer that holds the tensor data.\n *\n * If the data is not on GPU as WebGPU buffer, throw error.\n */\n readonly gpuBuffer: Tensor.GpuBufferType;\n\n /**\n * Get the buffer data of the tensor.\n *\n * If the data is on CPU, returns the data immediately.\n * If the data is on GPU, downloads the data and returns the promise.\n *\n * @param releaseData - whether release the data on GPU. Ignore if data is already on CPU.\n */\n getData(releaseData?: boolean): Promise;\n\n /**\n * Dispose the tensor data.\n *\n * If the data is on CPU, remove its internal reference to the underlying data.\n * If the data is on GPU, release the data on GPU.\n *\n * After calling this function, the tensor is considered no longer valid. Its location will be set to 'none'.\n */\n dispose(): void;\n}\n\nexport declare namespace Tensor {\n interface DataTypeMap {\n float32: Float32Array;\n uint8: Uint8Array;\n int8: Int8Array;\n uint16: Uint16Array;\n int16: Int16Array;\n int32: Int32Array;\n int64: BigInt64Array;\n string: string[];\n bool: Uint8Array;\n float16: Uint16Array; // Keep using Uint16Array until we have a concrete solution for float 16.\n float64: Float64Array;\n uint32: Uint32Array;\n uint64: BigUint64Array;\n // complex64: never;\n // complex128: never;\n // bfloat16: never;\n }\n\n interface ElementTypeMap {\n float32: number;\n uint8: number;\n int8: number;\n uint16: number;\n int16: number;\n int32: number;\n int64: bigint;\n string: string;\n bool: boolean;\n float16: number; // Keep using Uint16Array until we have a concrete solution for float 16.\n float64: number;\n uint32: number;\n uint64: bigint;\n // complex64: never;\n // complex128: never;\n // bfloat16: never;\n }\n\n type DataType = DataTypeMap[Type];\n type ElementType = ElementTypeMap[Type];\n\n /**\n * supported data types for constructing a tensor from a pinned CPU buffer\n */\n export type CpuPinnedDataTypes = Exclude;\n\n /**\n * type alias for WebGL texture\n */\n export type TextureType = WebGLTexture;\n\n /**\n * supported data types for constructing a tensor from a WebGL texture\n */\n export type TextureDataTypes = 'float32';\n\n /**\n * type alias for WebGPU buffer\n *\n * The reason why we don't use type \"GPUBuffer\" defined in webgpu.d.ts from @webgpu/types is because \"@webgpu/types\"\n * requires \"@types/dom-webcodecs\" as peer dependency when using TypeScript < v5.1 and its version need to be chosen\n * carefully according to the TypeScript version being used. This means so far there is not a way to keep every\n * TypeScript version happy. It turns out that we will easily broke users on some TypeScript version.\n *\n * for more info see https://github.com/gpuweb/types/issues/127\n */\n export type GpuBufferType = {size: number; mapState: 'unmapped' | 'pending' | 'mapped'};\n\n /**\n * supported data types for constructing a tensor from a WebGPU buffer\n */\n export type GpuBufferDataTypes = 'float32'|'float16'|'int32'|'int64'|'uint32'|'uint8'|'bool';\n\n /**\n * represent where the tensor data is stored\n */\n export type DataLocation = 'none'|'cpu'|'cpu-pinned'|'texture'|'gpu-buffer';\n\n /**\n * represent the data type of a tensor\n */\n export type Type = keyof DataTypeMap;\n}\n\n/**\n * Represent multi-dimensional arrays to feed to or fetch from model inferencing.\n */\nexport interface TypedTensor extends TypedTensorBase, TypedTensorUtils {}\n/**\n * Represent multi-dimensional arrays to feed to or fetch from model inferencing.\n */\nexport interface Tensor extends TypedTensorBase, TypedTensorUtils {}\n\n/**\n * type TensorConstructor defines the constructors of 'Tensor' to create CPU tensor instances.\n */\nexport interface TensorConstructor extends TensorFactory {\n // #region CPU tensor - specify element type\n /**\n * Construct a new string tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(type: 'string', data: Tensor.DataTypeMap['string']|readonly string[],\n dims?: readonly number[]): TypedTensor<'string'>;\n\n /**\n * Construct a new bool tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(type: 'bool', data: Tensor.DataTypeMap['bool']|readonly boolean[], dims?: readonly number[]): TypedTensor<'bool'>;\n\n /**\n * Construct a new 64-bit integer typed tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(\n type: T, data: Tensor.DataTypeMap[T]|readonly bigint[]|readonly number[],\n dims?: readonly number[]): TypedTensor;\n\n /**\n * Construct a new numeric tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new>(\n type: T, data: Tensor.DataTypeMap[T]|readonly number[], dims?: readonly number[]): TypedTensor;\n // #endregion\n\n // #region CPU tensor - infer element types\n\n /**\n * Construct a new float32 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Float32Array, dims?: readonly number[]): TypedTensor<'float32'>;\n\n /**\n * Construct a new int8 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Int8Array, dims?: readonly number[]): TypedTensor<'int8'>;\n\n /**\n * Construct a new uint8 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Uint8Array, dims?: readonly number[]): TypedTensor<'uint8'>;\n\n /**\n * Construct a new uint16 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Uint16Array, dims?: readonly number[]): TypedTensor<'uint16'>;\n\n /**\n * Construct a new int16 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Int16Array, dims?: readonly number[]): TypedTensor<'int16'>;\n\n /**\n * Construct a new int32 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Int32Array, dims?: readonly number[]): TypedTensor<'int32'>;\n\n /**\n * Construct a new int64 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: BigInt64Array, dims?: readonly number[]): TypedTensor<'int64'>;\n\n /**\n * Construct a new string tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: readonly string[], dims?: readonly number[]): TypedTensor<'string'>;\n\n /**\n * Construct a new bool tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: readonly boolean[], dims?: readonly number[]): TypedTensor<'bool'>;\n\n /**\n * Construct a new float64 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Float64Array, dims?: readonly number[]): TypedTensor<'float64'>;\n\n /**\n * Construct a new uint32 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Uint32Array, dims?: readonly number[]): TypedTensor<'uint32'>;\n\n /**\n * Construct a new uint64 tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: BigUint64Array, dims?: readonly number[]): TypedTensor<'uint64'>;\n\n // #endregion\n\n // #region CPU tensor - fall back to non-generic tensor type declaration\n\n /**\n * Construct a new tensor object from the given type, data and dims.\n *\n * @param type - Specify the element type.\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(type: Tensor.Type, data: Tensor.DataType|readonly number[]|readonly string[]|readonly bigint[]|readonly boolean[],\n dims?: readonly number[]): Tensor;\n\n /**\n * Construct a new tensor object from the given data and dims.\n *\n * @param data - Specify the CPU tensor data.\n * @param dims - Specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n */\n new(data: Tensor.DataType, dims?: readonly number[]): Tensor;\n // #endregion\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const Tensor = TensorImpl as TensorConstructor;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from './env-impl.js';\n\n/**\n * @ignore\n */\nexport const TRACE = (deviceType: string, label: string) => {\n if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {\n return;\n }\n // eslint-disable-next-line no-console\n console.timeStamp(`${deviceType}::ORT::${label}`);\n};\n\nconst TRACE_FUNC = (msg: string, extraMsg?: string) => {\n const stack = new Error().stack?.split(/\\r\\n|\\r|\\n/g) || [];\n let hasTraceFunc = false;\n for (let i = 0; i < stack.length; i++) {\n if (hasTraceFunc && !stack[i].includes('TRACE_FUNC')) {\n let label = `FUNC_${msg}::${stack[i].trim().split(' ')[1]}`;\n if (extraMsg) {\n label += `::${extraMsg}`;\n }\n TRACE('CPU', label);\n return;\n }\n if (stack[i].includes('TRACE_FUNC')) {\n hasTraceFunc = true;\n }\n }\n};\n\n/**\n * @ignore\n */\nexport const TRACE_FUNC_BEGIN = (extraMsg?: string) => {\n if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {\n return;\n }\n TRACE_FUNC('BEGIN', extraMsg);\n};\n\n/**\n * @ignore\n */\nexport const TRACE_FUNC_END = (extraMsg?: string) => {\n if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {\n return;\n }\n TRACE_FUNC('END', extraMsg);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {resolveBackendAndExecutionProviders} from './backend-impl.js';\nimport {InferenceSessionHandler} from './backend.js';\nimport {InferenceSession as InferenceSessionInterface} from './inference-session.js';\nimport {OnnxValue} from './onnx-value.js';\nimport {Tensor} from './tensor.js';\nimport {TRACE_FUNC_BEGIN, TRACE_FUNC_END} from './trace.js';\n\ntype SessionOptions = InferenceSessionInterface.SessionOptions;\ntype RunOptions = InferenceSessionInterface.RunOptions;\ntype FeedsType = InferenceSessionInterface.FeedsType;\ntype FetchesType = InferenceSessionInterface.FetchesType;\ntype ReturnType = InferenceSessionInterface.ReturnType;\n\nexport class InferenceSession implements InferenceSessionInterface {\n private constructor(handler: InferenceSessionHandler) {\n this.handler = handler;\n }\n run(feeds: FeedsType, options?: RunOptions): Promise;\n run(feeds: FeedsType, fetches: FetchesType, options?: RunOptions): Promise;\n async run(feeds: FeedsType, arg1?: FetchesType|RunOptions, arg2?: RunOptions): Promise {\n TRACE_FUNC_BEGIN();\n const fetches: {[name: string]: OnnxValue|null} = {};\n let options: RunOptions = {};\n // check inputs\n if (typeof feeds !== 'object' || feeds === null || feeds instanceof Tensor || Array.isArray(feeds)) {\n throw new TypeError(\n '\\'feeds\\' must be an object that use input names as keys and OnnxValue as corresponding values.');\n }\n\n let isFetchesEmpty = true;\n // determine which override is being used\n if (typeof arg1 === 'object') {\n if (arg1 === null) {\n throw new TypeError('Unexpected argument[1]: cannot be null.');\n }\n if (arg1 instanceof Tensor) {\n throw new TypeError('\\'fetches\\' cannot be a Tensor');\n }\n\n if (Array.isArray(arg1)) {\n if (arg1.length === 0) {\n throw new TypeError('\\'fetches\\' cannot be an empty array.');\n }\n isFetchesEmpty = false;\n // output names\n for (const name of arg1) {\n if (typeof name !== 'string') {\n throw new TypeError('\\'fetches\\' must be a string array or an object.');\n }\n if (this.outputNames.indexOf(name) === -1) {\n throw new RangeError(`'fetches' contains invalid output name: ${name}.`);\n }\n fetches[name] = null;\n }\n\n if (typeof arg2 === 'object' && arg2 !== null) {\n options = arg2;\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else {\n // decide whether arg1 is fetches or options\n // if any output name is present and its value is valid OnnxValue, we consider it fetches\n let isFetches = false;\n const arg1Keys = Object.getOwnPropertyNames(arg1);\n for (const name of this.outputNames) {\n if (arg1Keys.indexOf(name) !== -1) {\n const v = (arg1 as InferenceSessionInterface.NullableOnnxValueMapType)[name];\n if (v === null || v instanceof Tensor) {\n isFetches = true;\n isFetchesEmpty = false;\n fetches[name] = v;\n }\n }\n }\n\n if (isFetches) {\n if (typeof arg2 === 'object' && arg2 !== null) {\n options = arg2;\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else {\n options = arg1 as RunOptions;\n }\n }\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('Unexpected argument[1]: must be \\'fetches\\' or \\'options\\'.');\n }\n\n // check if all inputs are in feed\n for (const name of this.inputNames) {\n if (typeof feeds[name] === 'undefined') {\n throw new Error(`input '${name}' is missing in 'feeds'.`);\n }\n }\n\n // if no fetches is specified, we use the full output names list\n if (isFetchesEmpty) {\n for (const name of this.outputNames) {\n fetches[name] = null;\n }\n }\n\n // feeds, fetches and options are prepared\n\n const results = await this.handler.run(feeds, fetches, options);\n const returnValue: {[name: string]: OnnxValue} = {};\n for (const key in results) {\n if (Object.hasOwnProperty.call(results, key)) {\n const result = results[key];\n if (result instanceof Tensor) {\n returnValue[key] = result;\n } else {\n returnValue[key] = new Tensor(result.type, result.data, result.dims);\n }\n }\n }\n TRACE_FUNC_END();\n return returnValue;\n }\n\n async release(): Promise {\n return this.handler.dispose();\n }\n\n static create(path: string, options?: SessionOptions): Promise;\n static create(buffer: ArrayBufferLike, options?: SessionOptions): Promise;\n static create(buffer: ArrayBufferLike, byteOffset: number, byteLength?: number, options?: SessionOptions):\n Promise;\n static create(buffer: Uint8Array, options?: SessionOptions): Promise;\n static async create(\n arg0: string|ArrayBufferLike|Uint8Array, arg1?: SessionOptions|number, arg2?: number,\n arg3?: SessionOptions): Promise {\n TRACE_FUNC_BEGIN();\n // either load from a file or buffer\n let filePathOrUint8Array: string|Uint8Array;\n let options: SessionOptions = {};\n\n if (typeof arg0 === 'string') {\n filePathOrUint8Array = arg0;\n if (typeof arg1 === 'object' && arg1 !== null) {\n options = arg1;\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else if (arg0 instanceof Uint8Array) {\n filePathOrUint8Array = arg0;\n if (typeof arg1 === 'object' && arg1 !== null) {\n options = arg1;\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else if (\n arg0 instanceof ArrayBuffer ||\n (typeof SharedArrayBuffer !== 'undefined' && arg0 instanceof SharedArrayBuffer)) {\n const buffer = arg0;\n let byteOffset = 0;\n let byteLength = arg0.byteLength;\n if (typeof arg1 === 'object' && arg1 !== null) {\n options = arg1;\n } else if (typeof arg1 === 'number') {\n byteOffset = arg1;\n if (!Number.isSafeInteger(byteOffset)) {\n throw new RangeError('\\'byteOffset\\' must be an integer.');\n }\n if (byteOffset < 0 || byteOffset >= buffer.byteLength) {\n throw new RangeError(`'byteOffset' is out of range [0, ${buffer.byteLength}).`);\n }\n byteLength = arg0.byteLength - byteOffset;\n if (typeof arg2 === 'number') {\n byteLength = arg2;\n if (!Number.isSafeInteger(byteLength)) {\n throw new RangeError('\\'byteLength\\' must be an integer.');\n }\n if (byteLength <= 0 || byteOffset + byteLength > buffer.byteLength) {\n throw new RangeError(`'byteLength' is out of range (0, ${buffer.byteLength - byteOffset}].`);\n }\n if (typeof arg3 === 'object' && arg3 !== null) {\n options = arg3;\n } else if (typeof arg3 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'byteLength\\' must be a number.');\n }\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n filePathOrUint8Array = new Uint8Array(buffer, byteOffset, byteLength);\n } else {\n throw new TypeError('Unexpected argument[0]: must be \\'path\\' or \\'buffer\\'.');\n }\n\n // resolve backend, update session options with validated EPs, and create session handler\n const [backend, optionsWithValidatedEPs] = await resolveBackendAndExecutionProviders(options);\n const handler = await backend.createInferenceSessionHandler(filePathOrUint8Array, optionsWithValidatedEPs);\n TRACE_FUNC_END();\n return new InferenceSession(handler);\n }\n\n startProfiling(): void {\n this.handler.startProfiling();\n }\n endProfiling(): void {\n this.handler.endProfiling();\n }\n\n get inputNames(): readonly string[] {\n return this.handler.inputNames;\n }\n get outputNames(): readonly string[] {\n return this.handler.outputNames;\n }\n\n private handler: InferenceSessionHandler;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession as InferenceSessionImpl} from './inference-session-impl.js';\nimport {OnnxModelOptions} from './onnx-model.js';\nimport {OnnxValue, OnnxValueDataLocation} from './onnx-value.js';\n\n/* eslint-disable @typescript-eslint/no-redeclare */\n\nexport declare namespace InferenceSession {\n // #region input/output types\n\n type OnnxValueMapType = {readonly [name: string]: OnnxValue};\n type NullableOnnxValueMapType = {readonly [name: string]: OnnxValue | null};\n\n /**\n * A feeds (model inputs) is an object that uses input names as keys and OnnxValue as corresponding values.\n */\n type FeedsType = OnnxValueMapType;\n\n /**\n * A fetches (model outputs) could be one of the following:\n *\n * - Omitted. Use model's output names definition.\n * - An array of string indicating the output names.\n * - An object that use output names as keys and OnnxValue or null as corresponding values.\n *\n * @remark\n * different from input argument, in output, OnnxValue is optional. If an OnnxValue is present it will be\n * used as a pre-allocated value by the inference engine; if omitted, inference engine will allocate buffer\n * internally.\n */\n type FetchesType = readonly string[]|NullableOnnxValueMapType;\n\n /**\n * A inferencing return type is an object that uses output names as keys and OnnxValue as corresponding values.\n */\n type ReturnType = OnnxValueMapType;\n\n // #endregion\n\n // #region session options\n\n /**\n * A set of configurations for session behavior.\n */\n export interface SessionOptions extends OnnxModelOptions {\n /**\n * An array of execution provider options.\n *\n * An execution provider option can be a string indicating the name of the execution provider,\n * or an object of corresponding type.\n */\n executionProviders?: readonly ExecutionProviderConfig[];\n\n /**\n * The intra OP threads number.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native).\n */\n intraOpNumThreads?: number;\n\n /**\n * The inter OP threads number.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native).\n */\n interOpNumThreads?: number;\n\n /**\n * The free dimension override.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n freeDimensionOverrides?: {readonly [dimensionName: string]: number};\n\n /**\n * The optimization level.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n graphOptimizationLevel?: 'disabled'|'basic'|'extended'|'all';\n\n /**\n * Whether enable CPU memory arena.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n enableCpuMemArena?: boolean;\n\n /**\n * Whether enable memory pattern.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n enableMemPattern?: boolean;\n\n /**\n * Execution mode.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n executionMode?: 'sequential'|'parallel';\n\n /**\n * Optimized model file path.\n *\n * If this setting is specified, the optimized model will be dumped. In browser, a blob will be created\n * with a pop-up window.\n */\n optimizedModelFilePath?: string;\n\n /**\n * Whether enable profiling.\n *\n * This setting is a placeholder for a future use.\n */\n enableProfiling?: boolean;\n\n /**\n * File prefix for profiling.\n *\n * This setting is a placeholder for a future use.\n */\n profileFilePrefix?: string;\n\n /**\n * Log ID.\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n logId?: string;\n\n /**\n * Log severity level. See\n * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/common/logging/severity.h\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n logSeverityLevel?: 0|1|2|3|4;\n\n /**\n * Log verbosity level.\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n */\n logVerbosityLevel?: number;\n\n /**\n * Specify string as a preferred data location for all outputs, or an object that use output names as keys and a\n * preferred data location as corresponding values.\n *\n * This setting is available only in ONNXRuntime Web for WebGL and WebGPU EP.\n */\n preferredOutputLocation?: OnnxValueDataLocation|{readonly [outputName: string]: OnnxValueDataLocation};\n\n /**\n * Whether enable graph capture.\n * This setting is available only in ONNXRuntime Web for WebGPU EP.\n */\n enableGraphCapture?: boolean;\n\n /**\n * Store configurations for a session. See\n * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/session/\n * onnxruntime_session_options_config_keys.h\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n *\n * @example\n * ```js\n * extra: {\n * session: {\n * set_denormal_as_zero: \"1\",\n * disable_prepacking: \"1\"\n * },\n * optimization: {\n * enable_gelu_approximation: \"1\"\n * }\n * }\n * ```\n */\n extra?: Record;\n }\n\n // #region execution providers\n\n // Currently, we have the following backends to support execution providers:\n // Backend Node.js binding: supports 'cpu', 'dml' (win32), 'coreml' (macOS) and 'cuda' (linux).\n // Backend WebAssembly: supports 'cpu', 'wasm', 'webgpu' and 'webnn'.\n // Backend ONNX.js: supports 'webgl'.\n // Backend React Native: supports 'cpu', 'xnnpack', 'coreml' (iOS), 'nnapi' (Android).\n interface ExecutionProviderOptionMap {\n coreml: CoreMLExecutionProviderOption;\n cpu: CpuExecutionProviderOption;\n cuda: CudaExecutionProviderOption;\n dml: DmlExecutionProviderOption;\n nnapi: NnapiExecutionProviderOption;\n tensorrt: TensorRtExecutionProviderOption;\n wasm: WebAssemblyExecutionProviderOption;\n webgl: WebGLExecutionProviderOption;\n webgpu: WebGpuExecutionProviderOption;\n webnn: WebNNExecutionProviderOption;\n qnn: QnnExecutionProviderOption;\n xnnpack: XnnpackExecutionProviderOption;\n }\n\n type ExecutionProviderName = keyof ExecutionProviderOptionMap;\n type ExecutionProviderConfig =\n ExecutionProviderOptionMap[ExecutionProviderName]|ExecutionProviderOption|ExecutionProviderName|string;\n\n export interface ExecutionProviderOption {\n readonly name: string;\n }\n export interface CpuExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'cpu';\n useArena?: boolean;\n }\n export interface CudaExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'cuda';\n deviceId?: number;\n }\n export interface DmlExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'dml';\n deviceId?: number;\n }\n export interface TensorRtExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'tensorrt';\n deviceId?: number;\n }\n export interface WebAssemblyExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'wasm';\n }\n export interface WebGLExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'webgl';\n // TODO: add flags\n }\n export interface XnnpackExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'xnnpack';\n }\n export interface WebGpuExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'webgpu';\n preferredLayout?: 'NCHW'|'NHWC';\n }\n\n // #region WebNN options\n\n interface WebNNExecutionProviderName extends ExecutionProviderOption {\n readonly name: 'webnn';\n }\n\n /**\n * Represents a set of options for creating a WebNN MLContext.\n *\n * @see https://www.w3.org/TR/webnn/#dictdef-mlcontextoptions\n */\n export interface WebNNContextOptions {\n deviceType?: 'cpu'|'gpu'|'npu';\n numThreads?: number;\n powerPreference?: 'default'|'low-power'|'high-performance';\n }\n\n /**\n * Represents a set of options for WebNN execution provider without MLContext.\n */\n export interface WebNNOptionsWithoutMLContext extends WebNNExecutionProviderName, WebNNContextOptions {\n context?: never;\n }\n\n /**\n * Represents a set of options for WebNN execution provider with MLContext.\n *\n * When MLContext is provided, the deviceType is also required so that the WebNN EP can determine the preferred\n * channel layout.\n *\n * @see https://www.w3.org/TR/webnn/#dom-ml-createcontext\n */\n export interface WebNNOptionsWithMLContext extends WebNNExecutionProviderName,\n Omit,\n Required> {\n context: unknown /* MLContext */;\n }\n\n /**\n * Represents a set of options for WebNN execution provider with MLContext which is created from GPUDevice.\n *\n * @see https://www.w3.org/TR/webnn/#dom-ml-createcontext-gpudevice\n */\n export interface WebNNOptionsWebGpu extends WebNNExecutionProviderName {\n context: unknown /* MLContext */;\n gpuDevice: unknown /* GPUDevice */;\n }\n\n /**\n * Options for WebNN execution provider.\n */\n export type WebNNExecutionProviderOption = WebNNOptionsWithoutMLContext|WebNNOptionsWithMLContext|WebNNOptionsWebGpu;\n\n // #endregion\n\n export interface QnnExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'qnn';\n // TODO add flags\n }\n export interface CoreMLExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'coreml';\n /**\n * The bit flags for CoreML execution provider.\n *\n * ```\n * COREML_FLAG_USE_CPU_ONLY = 0x001\n * COREML_FLAG_ENABLE_ON_SUBGRAPH = 0x002\n * COREML_FLAG_ONLY_ENABLE_DEVICE_WITH_ANE = 0x004\n * COREML_FLAG_ONLY_ALLOW_STATIC_INPUT_SHAPES = 0x008\n * COREML_FLAG_CREATE_MLPROGRAM = 0x010\n * ```\n *\n * See include/onnxruntime/core/providers/coreml/coreml_provider_factory.h for more details.\n *\n * This flag is available only in ONNXRuntime (Node.js binding).\n */\n coreMlFlags?: number;\n /**\n * Specify whether to use CPU only in CoreML EP.\n *\n * This setting is available only in ONNXRuntime (react-native).\n */\n useCPUOnly?: boolean;\n /**\n * Specify whether to enable CoreML EP on subgraph.\n *\n * This setting is available only in ONNXRuntime (react-native).\n */\n enableOnSubgraph?: boolean;\n /**\n * Specify whether to only enable CoreML EP for Apple devices with ANE (Apple Neural Engine).\n *\n * This setting is available only in ONNXRuntime (react-native).\n */\n onlyEnableDeviceWithANE?: boolean;\n }\n export interface NnapiExecutionProviderOption extends ExecutionProviderOption {\n readonly name: 'nnapi';\n useFP16?: boolean;\n useNCHW?: boolean;\n cpuDisabled?: boolean;\n cpuOnly?: boolean;\n }\n // #endregion\n\n // #endregion\n\n // #region run options\n\n /**\n * A set of configurations for inference run behavior\n */\n export interface RunOptions {\n /**\n * Log severity level. See\n * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/common/logging/severity.h\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n logSeverityLevel?: 0|1|2|3|4;\n\n /**\n * Log verbosity level.\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n */\n logVerbosityLevel?: number;\n\n /**\n * Terminate all incomplete OrtRun calls as soon as possible if true\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n */\n terminate?: boolean;\n\n /**\n * A tag for the Run() calls using this\n *\n * This setting is available only in ONNXRuntime (Node.js binding and react-native) or WebAssembly backend\n */\n tag?: string;\n\n /**\n * Set a single run configuration entry. See\n * https://github.com/microsoft/onnxruntime/blob/main/include/onnxruntime/core/session/\n * onnxruntime_run_options_config_keys.h\n *\n * This setting is available only in WebAssembly backend. Will support Node.js binding and react-native later\n *\n * @example\n *\n * ```js\n * extra: {\n * memory: {\n * enable_memory_arena_shrinkage: \"1\",\n * }\n * }\n * ```\n */\n extra?: Record;\n }\n\n // #endregion\n\n // #region value metadata\n\n // eslint-disable-next-line @typescript-eslint/no-empty-interface\n interface ValueMetadata {\n // TBD\n }\n\n // #endregion\n}\n\n/**\n * Represent a runtime instance of an ONNX model.\n */\nexport interface InferenceSession {\n // #region run()\n\n /**\n * Execute the model asynchronously with the given feeds and options.\n *\n * @param feeds - Representation of the model input. See type description of `InferenceSession.InputType` for detail.\n * @param options - Optional. A set of options that controls the behavior of model inference.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding values.\n */\n run(feeds: InferenceSession.FeedsType, options?: InferenceSession.RunOptions): Promise;\n\n /**\n * Execute the model asynchronously with the given feeds, fetches and options.\n *\n * @param feeds - Representation of the model input. See type description of `InferenceSession.InputType` for detail.\n * @param fetches - Representation of the model output. See type description of `InferenceSession.OutputType` for\n * detail.\n * @param options - Optional. A set of options that controls the behavior of model inference.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding values.\n */\n run(feeds: InferenceSession.FeedsType, fetches: InferenceSession.FetchesType,\n options?: InferenceSession.RunOptions): Promise;\n\n // #endregion\n\n // #region release()\n\n /**\n * Release the inference session and the underlying resources.\n */\n release(): Promise;\n\n // #endregion\n\n // #region profiling\n\n /**\n * Start profiling.\n */\n startProfiling(): void;\n\n /**\n * End profiling.\n */\n endProfiling(): void;\n\n // #endregion\n\n // #region metadata\n\n /**\n * Get input names of the loaded model.\n */\n readonly inputNames: readonly string[];\n\n /**\n * Get output names of the loaded model.\n */\n readonly outputNames: readonly string[];\n\n // /**\n // * Get input metadata of the loaded model.\n // */\n // readonly inputMetadata: ReadonlyArray>;\n\n // /**\n // * Get output metadata of the loaded model.\n // */\n // readonly outputMetadata: ReadonlyArray>;\n\n // #endregion\n}\n\nexport interface InferenceSessionFactory {\n // #region create()\n\n /**\n * Create a new inference session and load model asynchronously from an ONNX model file.\n *\n * @param uri - The URI or file path of the model to load.\n * @param options - specify configuration for creating a new inference session.\n * @returns A promise that resolves to an InferenceSession object.\n */\n create(uri: string, options?: InferenceSession.SessionOptions): Promise;\n\n /**\n * Create a new inference session and load model asynchronously from an array bufer.\n *\n * @param buffer - An ArrayBuffer representation of an ONNX model.\n * @param options - specify configuration for creating a new inference session.\n * @returns A promise that resolves to an InferenceSession object.\n */\n create(buffer: ArrayBufferLike, options?: InferenceSession.SessionOptions): Promise;\n\n /**\n * Create a new inference session and load model asynchronously from segment of an array bufer.\n *\n * @param buffer - An ArrayBuffer representation of an ONNX model.\n * @param byteOffset - The beginning of the specified portion of the array buffer.\n * @param byteLength - The length in bytes of the array buffer.\n * @param options - specify configuration for creating a new inference session.\n * @returns A promise that resolves to an InferenceSession object.\n */\n create(buffer: ArrayBufferLike, byteOffset: number, byteLength?: number, options?: InferenceSession.SessionOptions):\n Promise;\n\n /**\n * Create a new inference session and load model asynchronously from a Uint8Array.\n *\n * @param buffer - A Uint8Array representation of an ONNX model.\n * @param options - specify configuration for creating a new inference session.\n * @returns A promise that resolves to an InferenceSession object.\n */\n create(buffer: Uint8Array, options?: InferenceSession.SessionOptions): Promise;\n\n // #endregion\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const InferenceSession: InferenceSessionFactory = InferenceSessionImpl;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {OptionsFormat, OptionsNormalizationParameters, OptionsTensorLayout} from './tensor-factory.js';\n\nexport interface TensorToDataUrlOptions extends OptionsTensorLayout, OptionsFormat, OptionsNormalizationParameters {}\n\nexport interface TensorToImageDataOptions extends OptionsTensorLayout, OptionsFormat, OptionsNormalizationParameters {}\n\nexport interface ConversionUtils {\n /**\n * creates a DataURL instance from tensor\n *\n * @param options - An optional object representing options for creating a DataURL instance from the tensor.\n *\n * The following default settings will be applied:\n * - `format`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * @returns a DataURL string representing the image converted from tensor data\n */\n toDataURL(options?: TensorToDataUrlOptions): string;\n\n /**\n * creates an ImageData instance from tensor\n *\n * @param options - An optional object representing options for creating an ImageData instance from the tensor.\n *\n * The following default settings will be applied:\n * - `format`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * @returns an ImageData instance representing the image converted from tensor data\n */\n toImageData(options?: TensorToImageDataOptions): ImageData;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor, TypedTensor} from './tensor.js';\n\nexport type ImageFormat = 'RGB'|'RGBA'|'BGR'|'RBG';\nexport type ImageTensorLayout = 'NHWC'|'NCHW';\n\n// the following region contains type definitions for constructing tensor from a specific location.\n\n// #region types for constructing a tensor from a specific location\n\n/**\n * represent common properties of the parameter for constructing a tensor from a specific location.\n */\ninterface CommonConstructorParameters extends Pick {\n /**\n * Specify the data type of the tensor.\n */\n readonly type: T;\n}\n\n/**\n * represent the parameter for constructing a tensor from a GPU resource.\n */\ninterface GpuResourceConstructorParameters {\n /**\n * an optional callback function to download data from GPU to CPU.\n *\n * If not provided, the tensor treat the GPU data as external resource.\n */\n download?(): Promise;\n\n /**\n * an optional callback function that will be called when the tensor is disposed.\n *\n * If not provided, the tensor treat the GPU data as external resource.\n */\n dispose?(): void;\n}\n\n/**\n * represent the parameter for constructing a tensor from a pinned CPU buffer\n */\nexport interface CpuPinnedConstructorParameters extends\n CommonConstructorParameters {\n /**\n * Specify the location of the data to be 'cpu-pinned'.\n */\n readonly location: 'cpu-pinned';\n /**\n * Specify the CPU pinned buffer that holds the tensor data.\n */\n readonly data: Tensor.DataTypeMap[T];\n}\n\n/**\n * represent the parameter for constructing a tensor from a WebGL texture\n */\nexport interface TextureConstructorParameters extends\n CommonConstructorParameters, GpuResourceConstructorParameters {\n /**\n * Specify the location of the data to be 'texture'.\n */\n readonly location: 'texture';\n /**\n * Specify the WebGL texture that holds the tensor data.\n */\n readonly texture: Tensor.TextureType;\n}\n\n/**\n * represent the parameter for constructing a tensor from a WebGPU buffer\n */\nexport interface GpuBufferConstructorParameters extends\n CommonConstructorParameters, GpuResourceConstructorParameters {\n /**\n * Specify the location of the data to be 'gpu-buffer'.\n */\n readonly location: 'gpu-buffer';\n /**\n * Specify the WebGPU buffer that holds the tensor data.\n */\n readonly gpuBuffer: Tensor.GpuBufferType;\n}\n\n// #endregion\n\n// the following region contains type definitions of each individual options.\n// the tensor factory functions use a composition of those options as the parameter type.\n\n// #region Options fields\n\nexport interface OptionsFormat {\n /**\n * Describes the image format represented in RGBA color space.\n */\n format?: ImageFormat;\n}\n\nexport interface OptionsTensorFormat {\n /**\n * Describes the image format of the tensor.\n *\n * NOTE: this is different from option 'format'. While option 'format' represents the original image, 'tensorFormat'\n * represents the target format of the tensor. A transpose will be performed if they are different.\n */\n tensorFormat?: ImageFormat;\n}\n\nexport interface OptionsTensorDataType {\n /**\n * Describes the data type of the tensor.\n */\n dataType?: 'float32'|'uint8';\n}\n\nexport interface OptionsTensorLayout {\n /**\n * Describes the tensor layout when representing data of one or more image(s).\n */\n tensorLayout?: ImageTensorLayout;\n}\n\nexport interface OptionsDimensions {\n /**\n * Describes the image height in pixel\n */\n height?: number;\n /**\n * Describes the image width in pixel\n */\n width?: number;\n}\n\nexport interface OptionResizedDimensions {\n /**\n * Describes the resized height. If omitted, original height will be used.\n */\n resizedHeight?: number;\n /**\n * Describes resized width - can be accessed via tensor dimensions as well\n */\n resizedWidth?: number;\n}\n\nexport interface OptionsNormalizationParameters {\n /**\n * Describes normalization parameters when preprocessing the image as model input.\n *\n * Data element are ranged from 0 to 255.\n */\n norm?: {\n /**\n * The 'bias' value for image normalization.\n * - If omitted, use default value 0.\n * - If it's a single number, apply to each channel\n * - If it's an array of 3 or 4 numbers, apply element-wise. Number of elements need to match the number of channels\n * for the corresponding image format\n */\n bias?: number|[number, number, number]|[number, number, number, number];\n /**\n * The 'mean' value for image normalization.\n * - If omitted, use default value 255.\n * - If it's a single number, apply to each channel\n * - If it's an array of 3 or 4 numbers, apply element-wise. Number of elements need to match the number of channels\n * for the corresponding image format\n */\n mean?: number | [number, number, number] | [number, number, number, number];\n };\n}\n\n// #endregion\n\n// #region Options composition\n\nexport interface TensorFromImageDataOptions extends OptionResizedDimensions, OptionsTensorFormat, OptionsTensorLayout,\n OptionsTensorDataType, OptionsNormalizationParameters {}\n\nexport interface TensorFromImageElementOptions extends OptionResizedDimensions, OptionsTensorFormat,\n OptionsTensorLayout, OptionsTensorDataType,\n OptionsNormalizationParameters {}\n\nexport interface TensorFromUrlOptions extends OptionsDimensions, OptionResizedDimensions, OptionsTensorFormat,\n OptionsTensorLayout, OptionsTensorDataType,\n OptionsNormalizationParameters {}\n\nexport interface TensorFromImageBitmapOptions extends OptionResizedDimensions, OptionsTensorFormat, OptionsTensorLayout,\n OptionsTensorDataType, OptionsNormalizationParameters {}\n\nexport interface TensorFromTextureOptions extends\n Required, OptionsFormat, GpuResourceConstructorParameters/* TODO: add more */ {}\n\nexport interface TensorFromGpuBufferOptions extends\n Pick, GpuResourceConstructorParameters {\n /**\n * Describes the data type of the tensor.\n */\n dataType?: T;\n}\n\n// #endregion\n\n/**\n * type TensorFactory defines the factory functions of 'Tensor' to create tensor instances from existing data or\n * resources.\n */\nexport interface TensorFactory {\n /**\n * create a tensor from an ImageData object\n *\n * @param imageData - the ImageData object to create tensor from\n * @param options - An optional object representing options for creating tensor from ImageData.\n *\n * The following default settings will be applied:\n * - `tensorFormat`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * - `dataType`: `'float32'`\n * @returns A promise that resolves to a tensor object\n */\n fromImage(imageData: ImageData, options?: TensorFromImageDataOptions):\n Promise|TypedTensor<'uint8'>>;\n\n /**\n * create a tensor from a HTMLImageElement object\n *\n * @param imageElement - the HTMLImageElement object to create tensor from\n * @param options - An optional object representing options for creating tensor from HTMLImageElement.\n *\n * The following default settings will be applied:\n * - `tensorFormat`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * - `dataType`: `'float32'`\n * @returns A promise that resolves to a tensor object\n */\n fromImage(imageElement: HTMLImageElement, options?: TensorFromImageElementOptions):\n Promise|TypedTensor<'uint8'>>;\n\n /**\n * create a tensor from URL\n *\n * @param urlSource - a string as a URL to the image or a data URL containing the image data.\n * @param options - An optional object representing options for creating tensor from URL.\n *\n * The following default settings will be applied:\n * - `tensorFormat`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * - `dataType`: `'float32'`\n * @returns A promise that resolves to a tensor object\n */\n fromImage(urlSource: string, options?: TensorFromUrlOptions): Promise|TypedTensor<'uint8'>>;\n\n /**\n * create a tensor from an ImageBitmap object\n *\n * @param bitmap - the ImageBitmap object to create tensor from\n * @param options - An optional object representing options for creating tensor from URL.\n *\n * The following default settings will be applied:\n * - `tensorFormat`: `'RGB'`\n * - `tensorLayout`: `'NCHW'`\n * - `dataType`: `'float32'`\n * @returns A promise that resolves to a tensor object\n */\n fromImage(bitmap: ImageBitmap, options: TensorFromImageBitmapOptions):\n Promise|TypedTensor<'uint8'>>;\n\n /**\n * create a tensor from a WebGL texture\n *\n * @param texture - the WebGLTexture object to create tensor from\n * @param options - An optional object representing options for creating tensor from WebGL texture.\n *\n * The options include following properties:\n * - `width`: the width of the texture. Required.\n * - `height`: the height of the texture. Required.\n * - `format`: the format of the texture. If omitted, assume 'RGBA'.\n * - `download`: an optional function to download the tensor data from GPU to CPU. If omitted, the GPU data\n * will not be able to download. Usually, this is provided by a GPU backend for the inference outputs. Users don't\n * need to provide this function.\n * - `dispose`: an optional function to dispose the tensor data on GPU. If omitted, the GPU data will not be disposed.\n * Usually, this is provided by a GPU backend for the inference outputs. Users don't need to provide this function.\n *\n * @returns a tensor object\n */\n fromTexture(\n texture: Tensor.TextureType, options: TensorFromTextureOptions): TypedTensor<'float32'>;\n\n /**\n * create a tensor from a WebGPU buffer\n *\n * @param buffer - the GPUBuffer object to create tensor from\n * @param options - An optional object representing options for creating tensor from WebGPU buffer.\n *\n * The options include following properties:\n * - `dataType`: the data type of the tensor. If omitted, assume 'float32'.\n * - `dims`: the dimension of the tensor. Required.\n * - `download`: an optional function to download the tensor data from GPU to CPU. If omitted, the GPU data\n * will not be able to download. Usually, this is provided by a GPU backend for the inference outputs. Users don't\n * need to provide this function.\n * - `dispose`: an optional function to dispose the tensor data on GPU. If omitted, the GPU data will not be disposed.\n * Usually, this is provided by a GPU backend for the inference outputs. Users don't need to provide this function.\n *\n * @returns a tensor object\n */\n fromGpuBuffer(\n buffer: Tensor.GpuBufferType, options: TensorFromGpuBufferOptions): TypedTensor;\n\n /**\n * create a tensor from a pre-allocated buffer. The buffer will be used as a pinned buffer.\n *\n * @param type - the tensor element type.\n * @param buffer - a TypedArray corresponding to the type.\n * @param dims - specify the dimension of the tensor. If omitted, a 1-D tensor is assumed.\n *\n * @returns a tensor object\n */\n fromPinnedBuffer>(\n type: T, buffer: Tensor.DataTypeMap[T], dims?: readonly number[]): TypedTensor;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * A string that represents a file's URL or path.\n *\n * Path is vailable only in onnxruntime-node or onnxruntime-web running in Node.js.\n */\nexport type FileUrlOrPath = string;\n\n/**\n * A Blob object that represents a file.\n */\nexport type FileBlob = Blob;\n\n/**\n * A Uint8Array, ArrayBuffer or SharedArrayBuffer object that represents a file content.\n *\n * When it is an ArrayBuffer or SharedArrayBuffer, the whole buffer is assumed to be the file content.\n */\nexport type FileData = Uint8Array|ArrayBufferLike;\n\n/**\n * Represents a file that can be loaded by the ONNX Runtime JavaScript API.\n */\nexport type FileType = FileUrlOrPath|FileBlob|FileData;\n\n/**\n * Represents an external data file.\n */\nexport interface ExternalDataFileDescription {\n /**\n * Specify the external data file.\n */\n data: FileType;\n /**\n * Specify the file path.\n */\n path: string;\n}\n\n/**\n * Represents an external data file.\n *\n * When using a string, it should be a file URL or path that in the same directory as the model file.\n */\nexport type ExternalDataFileType = ExternalDataFileDescription|FileUrlOrPath;\n\n/**\n * Options for model loading.\n */\nexport interface OnnxModelOptions {\n /**\n * Specifying a list of files that represents the external data.\n */\n externalData?: readonly ExternalDataFileType[];\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from './tensor.js';\n\nexport type NonTensorType = never;\n\n/**\n * Type OnnxValue Represents both tensors and non-tensors value for model's inputs/outputs.\n *\n * NOTE: currently not support non-tensor\n */\nexport type OnnxValue = Tensor|NonTensorType;\n\n/**\n * Type OnnxValueDataLocation represents the location of the data of an OnnxValue.\n */\nexport type OnnxValueDataLocation = Tensor.DataLocation;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {resolveBackendAndExecutionProviders} from './backend-impl.js';\nimport {SessionHandler, TrainingSessionHandler} from './backend.js';\nimport {InferenceSession as InferenceSession} from './inference-session.js';\nimport {OnnxValue} from './onnx-value.js';\nimport {Tensor} from './tensor.js';\nimport {TrainingSession as TrainingSessionInterface, TrainingSessionCreateOptions} from './training-session.js';\n\ntype SessionOptions = InferenceSession.SessionOptions;\ntype FeedsType = InferenceSession.FeedsType;\ntype FetchesType = InferenceSession.FetchesType;\ntype ReturnType = InferenceSession.ReturnType;\ntype RunOptions = InferenceSession.RunOptions;\n\nconst noBackendErrMsg: string = 'Training backend could not be resolved. ' +\n 'Make sure you\\'re using the correct configuration & WebAssembly files.';\n\nexport class TrainingSession implements TrainingSessionInterface {\n private constructor(handler: TrainingSessionHandler, hasOptimizerModel: boolean, hasEvalModel: boolean) {\n this.handler = handler;\n this.hasOptimizerModel = hasOptimizerModel;\n this.hasEvalModel = hasEvalModel;\n }\n private handler: TrainingSessionHandler;\n private hasOptimizerModel: boolean;\n private hasEvalModel: boolean;\n\n get trainingInputNames(): readonly string[] {\n return this.handler.inputNames;\n }\n get trainingOutputNames(): readonly string[] {\n return this.handler.outputNames;\n }\n\n get evalInputNames(): readonly string[] {\n if (this.hasEvalModel) {\n return this.handler.evalInputNames;\n } else {\n throw new Error('This training session has no evalModel loaded.');\n }\n }\n get evalOutputNames(): readonly string[] {\n if (this.hasEvalModel) {\n return this.handler.evalOutputNames;\n } else {\n throw new Error('This training session has no evalModel loaded.');\n }\n }\n\n static async create(trainingOptions: TrainingSessionCreateOptions, sessionOptions?: SessionOptions):\n Promise {\n const evalModel: string|Uint8Array = trainingOptions.evalModel || '';\n const optimizerModel: string|Uint8Array = trainingOptions.optimizerModel || '';\n const options: SessionOptions = sessionOptions || {};\n\n // resolve backend, update session options with validated EPs, and create session handler\n const [backend, optionsWithValidatedEPs] = await resolveBackendAndExecutionProviders(options);\n if (backend.createTrainingSessionHandler) {\n const handler = await backend.createTrainingSessionHandler(\n trainingOptions.checkpointState, trainingOptions.trainModel, evalModel, optimizerModel,\n optionsWithValidatedEPs);\n return new TrainingSession(handler, !!trainingOptions.optimizerModel, !!trainingOptions.evalModel);\n } else {\n throw new Error(noBackendErrMsg);\n }\n }\n\n /**\n * Helper function for runTrainStep and future runStep methods that handles the type-narrowing conversion from\n * the given parameters to SessionHandler.FetchesType and RunOptions.\n *\n * @param inputNames the feeds object is checked that they contain all input names in the provided list of input\n * names.\n * @param outputNames the fetches object is checked that their keys match up with valid names in the list of output\n * names.\n * @param feeds the required input\n * @param arg1 narrowed & converted into the SessionHandler.FetchesType or RunOptions object\n * @param arg2 optional RunOptions object.\n * @returns\n */\n typeNarrowingForRunStep(\n inputNames: readonly string[], outputNames: readonly string[], feeds: FeedsType, arg1?: FetchesType|RunOptions,\n arg2?: RunOptions): [SessionHandler.FetchesType, RunOptions] {\n const fetches: {[name: string]: OnnxValue|null} = {};\n let options: RunOptions = {};\n // check inputs\n if (typeof feeds !== 'object' || feeds === null || feeds instanceof Tensor || Array.isArray(feeds)) {\n throw new TypeError(\n '\\'feeds\\' must be an object that use input names as keys and OnnxValue as corresponding values.');\n }\n\n let isFetchesEmpty = true;\n // determine which override is being used\n if (typeof arg1 === 'object') {\n if (arg1 === null) {\n throw new TypeError('Unexpected argument[1]: cannot be null.');\n }\n if (arg1 instanceof Tensor) {\n throw new TypeError('\\'fetches\\' cannot be a Tensor');\n }\n\n if (Array.isArray(arg1)) {\n if (arg1.length === 0) {\n throw new TypeError('\\'fetches\\' cannot be an empty array.');\n }\n isFetchesEmpty = false;\n // output names\n for (const name of arg1) {\n if (typeof name !== 'string') {\n throw new TypeError('\\'fetches\\' must be a string array or an object.');\n }\n if (outputNames.indexOf(name) === -1) {\n throw new RangeError(`'fetches' contains invalid output name: ${name}.`);\n }\n fetches[name] = null;\n }\n\n if (typeof arg2 === 'object' && arg2 !== null) {\n options = arg2;\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else {\n // decide whether arg1 is fetches or options\n // if any output name is present and its value is valid OnnxValue, we consider it fetches\n let isFetches = false;\n const arg1Keys = Object.getOwnPropertyNames(arg1);\n for (const name of outputNames) {\n if (arg1Keys.indexOf(name) !== -1) {\n const v = (arg1 as InferenceSession.NullableOnnxValueMapType)[name];\n if (v === null || v instanceof Tensor) {\n isFetches = true;\n isFetchesEmpty = false;\n fetches[name] = v;\n }\n }\n }\n\n if (isFetches) {\n if (typeof arg2 === 'object' && arg2 !== null) {\n options = arg2;\n } else if (typeof arg2 !== 'undefined') {\n throw new TypeError('\\'options\\' must be an object.');\n }\n } else {\n options = arg1 as RunOptions;\n }\n }\n } else if (typeof arg1 !== 'undefined') {\n throw new TypeError('Unexpected argument[1]: must be \\'fetches\\' or \\'options\\'.');\n }\n\n // check if all inputs are in feed\n for (const name of inputNames) {\n if (typeof feeds[name] === 'undefined') {\n throw new Error(`input '${name}' is missing in 'feeds'.`);\n }\n }\n\n // if no fetches is specified, we use the full output names list\n if (isFetchesEmpty) {\n for (const name of outputNames) {\n fetches[name] = null;\n }\n }\n\n return [fetches, options];\n }\n\n /**\n * Helper method for runTrainStep and any other runStep methods. Takes the ReturnType result from the SessionHandler\n * and changes it into a map of Tensors.\n *\n * @param results\n * @returns\n */\n convertHandlerReturnTypeToMapOfTensors(results: SessionHandler.ReturnType): ReturnType {\n const returnValue: {[name: string]: OnnxValue} = {};\n for (const key in results) {\n if (Object.hasOwnProperty.call(results, key)) {\n const result = results[key];\n if (result instanceof Tensor) {\n returnValue[key] = result;\n } else {\n returnValue[key] = new Tensor(result.type, result.data, result.dims);\n }\n }\n }\n return returnValue;\n }\n\n async lazyResetGrad(): Promise {\n await this.handler.lazyResetGrad();\n }\n\n runTrainStep(feeds: FeedsType, options?: RunOptions): Promise;\n runTrainStep(feeds: FeedsType, fetches: FetchesType, options?: RunOptions): Promise;\n async runTrainStep(feeds: FeedsType, arg1?: FetchesType|RunOptions, arg2?: RunOptions): Promise {\n const [fetches, options] =\n this.typeNarrowingForRunStep(this.trainingInputNames, this.trainingOutputNames, feeds, arg1, arg2);\n const results = await this.handler.runTrainStep(feeds, fetches, options);\n return this.convertHandlerReturnTypeToMapOfTensors(results);\n }\n\n async runOptimizerStep(options?: InferenceSession.RunOptions|undefined): Promise {\n if (this.hasOptimizerModel) {\n await this.handler.runOptimizerStep(options || {});\n } else {\n throw new Error('This TrainingSession has no OptimizerModel loaded.');\n }\n }\n\n runEvalStep(feeds: FeedsType, options?: RunOptions|undefined): Promise;\n runEvalStep(feeds: FeedsType, fetches: FetchesType, options?: RunOptions|undefined): Promise;\n async runEvalStep(feeds: FeedsType, arg1?: FetchesType|RunOptions, arg2?: RunOptions): Promise {\n if (this.hasEvalModel) {\n const [fetches, options] =\n this.typeNarrowingForRunStep(this.evalInputNames, this.evalOutputNames, feeds, arg1, arg2);\n const results = await this.handler.runEvalStep(feeds, fetches, options);\n return this.convertHandlerReturnTypeToMapOfTensors(results);\n } else {\n throw new Error('This TrainingSession has no EvalModel loaded.');\n }\n }\n\n async getParametersSize(trainableOnly = true): Promise {\n return this.handler.getParametersSize(trainableOnly);\n }\n\n async loadParametersBuffer(array: Uint8Array, trainableOnly = true): Promise {\n const paramsSize = await this.getParametersSize(trainableOnly);\n // checking that the size of the Uint8Array is equivalent to the byte length of a Float32Array of the number\n // of parameters\n if (array.length !== 4 * paramsSize) {\n throw new Error(\n 'Size of the buffer passed into loadParametersBuffer must match the number of parameters in ' +\n 'the model. Please use getParametersSize method to check.');\n }\n return this.handler.loadParametersBuffer(array, trainableOnly);\n }\n\n async getContiguousParameters(trainableOnly = true): Promise {\n return this.handler.getContiguousParameters(trainableOnly);\n }\n\n async release(): Promise {\n return this.handler.dispose();\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession} from './inference-session.js';\nimport {OnnxValue} from './onnx-value.js';\nimport {TrainingSession as TrainingSessionImpl} from './training-session-impl.js';\n\n/* eslint-disable @typescript-eslint/no-redeclare */\n\nexport declare namespace TrainingSession {\n /**\n * Either URI file path (string) or Uint8Array containing model or checkpoint information.\n */\n type UriOrBuffer = string|Uint8Array;\n}\n\n/**\n * Represent a runtime instance of an ONNX training session,\n * which contains a model that can be trained, and, optionally,\n * an eval and optimizer model.\n */\nexport interface TrainingSession {\n // #region run()\n\n /**\n * Lazily resets the gradients of all trainable parameters to zero. Should happen after the invocation of\n * runOptimizerStep.\n */\n lazyResetGrad(): Promise;\n\n /**\n * Run TrainStep asynchronously with the given feeds and options.\n *\n * @param feeds - Representation of the model input. See type description of `InferenceSession.InputType` for\n detail.\n * @param options - Optional. A set of options that controls the behavior of model training.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding values.\n */\n runTrainStep(feeds: InferenceSession.FeedsType, options?: InferenceSession.RunOptions):\n Promise;\n\n /**\n * Run a single train step with the given inputs and options.\n *\n * @param feeds - Representation of the model input.\n * @param fetches - Representation of the model output.\n * detail.\n * @param options - Optional. A set of options that controls the behavior of model training.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding\n values.\n */\n runTrainStep(\n feeds: InferenceSession.FeedsType, fetches: InferenceSession.FetchesType,\n options?: InferenceSession.RunOptions): Promise;\n\n /**\n * Runs a single optimizer step, which performs weight updates for the trainable parameters using the optimizer model.\n *\n * @param options - Optional. A set of options that controls the behavior of model optimizing.\n */\n runOptimizerStep(options?: InferenceSession.RunOptions): Promise;\n\n /**\n * Run a single eval step with the given inputs and options using the eval model.\n *\n * @param feeds - Representation of the model input.\n * @param options - Optional. A set of options that controls the behavior of model eval step.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding\n values.\n */\n runEvalStep(feeds: InferenceSession.FeedsType, options?: InferenceSession.RunOptions):\n Promise;\n\n /**\n * Run a single eval step with the given inputs and options using the eval model.\n *\n * @param feeds - Representation of the model input.\n * @param fetches - Representation of the model output.\n * detail.\n * @param options - Optional. A set of options that controls the behavior of model eval step.\n * @returns A promise that resolves to a map, which uses output names as keys and OnnxValue as corresponding\n values.\n */\n runEvalStep(\n feeds: InferenceSession.FeedsType, fetches: InferenceSession.FetchesType,\n options?: InferenceSession.RunOptions): Promise;\n\n // #endregion\n\n // #region copy parameters\n\n /**\n * Retrieves the size of all parameters for the training state. Calculates the total number of primitive (datatype of\n * the parameters) elements of all the parameters in the training state.\n *\n * @param trainableOnly - When set to true, the size is calculated for trainable params only. Default value is true.\n */\n getParametersSize(trainableOnly: boolean): Promise;\n\n /**\n * Copies parameter values from the given buffer to the training state. Currently, only supporting models with\n * parameters of type Float32.\n *\n * @param buffer - A Uint8Array representation of Float32 parameters.\n * @param trainableOnly - True if trainable parameters only to be modified, false otherwise. Default value is true.\n */\n loadParametersBuffer(buffer: Uint8Array, trainableOnly: boolean): Promise;\n\n /**\n * Copies the model parameters to a contiguous buffer. Usually used in the context of Federated Learning.\n * Currently, only supporting models with parameters of type Float32.\n *\n * @param trainableOnly - When set to true, only trainable parameters are copied. Trainable parameters are parameters\n * for which requires_grad is set to true. Default value is true.\n * @returns A promise that resolves to a Float32 OnnxValue of the requested parameters.\n */\n getContiguousParameters(trainableOnly: boolean): Promise;\n // #endregion\n\n // #region release()\n\n /**\n * Release the inference session and the underlying resources.\n */\n release(): Promise;\n // #endregion\n\n // #region metadata\n\n /**\n * Get input names of the loaded training model.\n */\n readonly trainingInputNames: readonly string[];\n\n /**\n * Get output names of the loaded training model.\n */\n readonly trainingOutputNames: readonly string[];\n\n /**\n * Get input names of the loaded eval model. Is an empty array if no eval model is loaded.\n */\n readonly evalInputNames: readonly string[];\n\n /**\n * Get output names of the loaded eval model. Is an empty array if no eval model is loaded.\n */\n readonly evalOutputNames: readonly string[];\n\n // #endregion\n}\n\n/**\n * Represents the optional parameters that can be passed into the TrainingSessionFactory.\n */\nexport interface TrainingSessionCreateOptions {\n /**\n * URI or buffer for a .ckpt file that contains the checkpoint for the training model.\n */\n checkpointState: TrainingSession.UriOrBuffer;\n /**\n * URI or buffer for the .onnx training file.\n */\n trainModel: TrainingSession.UriOrBuffer;\n /**\n * Optional. URI or buffer for the .onnx optimizer model file.\n */\n optimizerModel?: TrainingSession.UriOrBuffer;\n /**\n * Optional. URI or buffer for the .onnx eval model file.\n */\n evalModel?: TrainingSession.UriOrBuffer;\n}\n\n/**\n * Defines method overload possibilities for creating a TrainingSession.\n */\nexport interface TrainingSessionFactory {\n // #region create()\n\n /**\n * Creates a new TrainingSession and asynchronously loads any models passed in through trainingOptions\n *\n * @param trainingOptions specify models and checkpoints to load into the Training Session\n * @param sessionOptions specify configuration for training session behavior\n *\n * @returns Promise that resolves to a TrainingSession object\n */\n create(trainingOptions: TrainingSessionCreateOptions, sessionOptions?: InferenceSession.SessionOptions):\n Promise;\n\n // #endregion\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const TrainingSession: TrainingSessionFactory = TrainingSessionImpl;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/**\n * # ONNX Runtime JavaScript API\n *\n * ONNX Runtime JavaScript API is a unified API for all JavaScript usages, including the following NPM packages:\n *\n * - [onnxruntime-node](https://www.npmjs.com/package/onnxruntime-node)\n * - [onnxruntime-web](https://www.npmjs.com/package/onnxruntime-web)\n * - [onnxruntime-react-native](https://www.npmjs.com/package/onnxruntime-react-native)\n *\n * See also:\n * - [Get Started](https://onnxruntime.ai/docs/get-started/with-javascript/)\n * - [Inference examples](https://github.com/microsoft/onnxruntime-inference-examples/tree/main/js)\n *\n * @packageDocumentation\n */\n\nexport * from './backend.js';\nexport * from './env.js';\nexport * from './inference-session.js';\nexport * from './tensor.js';\nexport * from './tensor-conversion.js';\nexport * from './tensor-factory.js';\nexport * from './trace.js';\nexport * from './onnx-model.js';\nexport * from './onnx-value.js';\nexport * from './training-session.js';\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nexport const isNode = !!(typeof process !== 'undefined' && process.versions && process.versions.node);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/// \n\n//\n// * type hack for \"HTMLImageElement\"\n//\n// in typescript, the type of \"HTMLImageElement\" is defined in lib.dom.d.ts, which is conflict with lib.webworker.d.ts.\n// when we use webworker, the lib.webworker.d.ts will be used, which does not have HTMLImageElement defined.\n//\n// we will get the following errors complaining that HTMLImageElement is not defined:\n//\n// ====================================================================================================================\n//\n// ../common/dist/cjs/tensor-factory.d.ts:187:29 - error TS2552: Cannot find name 'HTMLImageElement'. Did you mean\n// 'HTMLLIElement'?\n//\n// 187 fromImage(imageElement: HTMLImageElement, options?: TensorFromImageElementOptions):\n// Promise | TypedTensor<'uint8'>>;\n// ~~~~~~~~~~~~~~~~\n//\n// node_modules/@webgpu/types/dist/index.d.ts:83:7 - error TS2552: Cannot find name 'HTMLImageElement'. Did you mean\n// 'HTMLLIElement'?\n//\n// 83 | HTMLImageElement\n// ~~~~~~~~~~~~~~~~\n//\n// ====================================================================================================================\n//\n// `HTMLImageElement` is only used in type declaration and not in real code. So we define it as `unknown` here to\n// bypass the type check.\n\n//\n// * type hack for \"document\"\n//\n// in typescript, the type of \"document\" is defined in lib.dom.d.ts, so it's not available in webworker.\n//\n// we will get the following errors complaining that document is not defined:\n//\n// ====================================================================================================================\n//\n// lib/wasm/wasm-utils-import.ts:7:33 - error TS2584: Cannot find name 'document'. Do you need to change your target\n// library? Try changing the 'lib' compiler option to include 'dom'.\n//\n// 7 export const scriptSrc = typeof document !== 'undefined' ? (document?.currentScript as HTMLScriptElement)?.src :\n// ~~~~~~~~\n//\n// lib/wasm/wasm-utils-import.ts:7:61 - error TS2584: Cannot find name 'document'. Do you need to change your target\n// library? Try changing the 'lib' compiler option to include 'dom'.\n//\n// 7 export const scriptSrc = typeof document !== 'undefined' ? (document?.currentScript as HTMLScriptElement)?.src :\n// ~~~~~~~~\n//\n// lib/wasm/wasm-utils-import.ts:7:88 - error TS2552: Cannot find name 'HTMLScriptElement'. Did you mean\n// 'HTMLLIElement'?\n//\n// 7 export const scriptSrc = typeof document !== 'undefined' ? (document?.currentScript as HTMLScriptElement)?.src :\n// ~~~~~~~~~~~~~~~~~\n// ====================================================================================================================\n//\n// `document` is used to get the current script URL, which is not available in webworker. This file is served as a\n// \"dual\" file for entries of both webworker and the esm module.\n//\ndeclare global {\n type HTMLImageElement = unknown;\n type HTMLScriptElement = {src?: string};\n const document: undefined|{currentScript?: HTMLScriptElement};\n}\n\n/**\n * @summary\n *\n * This file is served as a \"dual\" file for both entries of the following:\n * - The proxy worker itself.\n * - When used as a worker, it listens to the messages from the main thread and performs the corresponding operations.\n * - Should be imported directly using `new Worker()` in the main thread.\n *\n * - The ESM module that creates the proxy worker (as a worker launcher).\n * - When used as a worker launcher, it creates the proxy worker and returns it.\n * - Should be imported using `import()` in the main thread, with the query parameter `import=1`.\n *\n * This file will be always compiling into ESM format.\n */\n\nimport type {OrtWasmMessage, SerializableTensorMetadata} from '../proxy-messages.js';\nimport {createSession, copyFromExternalBuffer, endProfiling, extractTransferableBuffers, initEp, initRuntime, releaseSession, run} from '../wasm-core-impl.js';\nimport {initializeWebAssembly} from '../wasm-factory.js';\nimport {scriptSrc} from '../wasm-utils-import.js';\n\nconst WORKER_NAME = 'ort-wasm-proxy-worker';\nconst isProxyWorker = globalThis.self?.name === WORKER_NAME;\n\nif (isProxyWorker) {\n // Worker thread\n self.onmessage = (ev: MessageEvent): void => {\n const {type, in : message} = ev.data;\n try {\n switch (type) {\n case 'init-wasm':\n initializeWebAssembly(message!.wasm)\n .then(\n () => {\n initRuntime(message!).then(\n () => {\n postMessage({type});\n },\n err => {\n postMessage({type, err});\n });\n },\n err => {\n postMessage({type, err});\n });\n break;\n case 'init-ep': {\n const {epName, env} = message!;\n initEp(env, epName)\n .then(\n () => {\n postMessage({type});\n },\n err => {\n postMessage({type, err});\n });\n break;\n }\n case 'copy-from': {\n const {buffer} = message!;\n const bufferData = copyFromExternalBuffer(buffer);\n postMessage({type, out: bufferData} as OrtWasmMessage);\n break;\n }\n case 'create': {\n const {model, options} = message!;\n createSession(model, options)\n .then(\n sessionMetadata => {\n postMessage({type, out: sessionMetadata} as OrtWasmMessage);\n },\n err => {\n postMessage({type, err});\n });\n break;\n }\n case 'release':\n releaseSession(message!);\n postMessage({type});\n break;\n case 'run': {\n const {sessionId, inputIndices, inputs, outputIndices, options} = message!;\n run(sessionId, inputIndices, inputs, outputIndices, new Array(outputIndices.length).fill(null), options)\n .then(\n outputs => {\n if (outputs.some(o => o[3] !== 'cpu')) {\n postMessage({type, err: 'Proxy does not support non-cpu tensor location.'});\n } else {\n postMessage(\n {type, out: outputs} as OrtWasmMessage,\n extractTransferableBuffers([...inputs, ...outputs] as SerializableTensorMetadata[]));\n }\n },\n err => {\n postMessage({type, err});\n });\n break;\n }\n case 'end-profiling':\n endProfiling(message!);\n postMessage({type});\n break;\n default:\n }\n } catch (err) {\n postMessage({type, err} as OrtWasmMessage);\n }\n };\n}\n\nexport default isProxyWorker ?\n null :\n (urlOverride?: string) =>\n new Worker(urlOverride ?? scriptSrc!, {type: BUILD_DEFS.IS_ESM ? 'module' : 'classic', name: WORKER_NAME});\n", "var e,r=(e=import.meta.url,async function(r={}){function t(){return x.buffer!=R.buffer&&L(),R}function n(){return x.buffer!=R.buffer&&L(),H}function a(){return x.buffer!=R.buffer&&L(),D}function o(){return x.buffer!=R.buffer&&L(),F}function i(){return x.buffer!=R.buffer&&L(),P}function s(){return x.buffer!=R.buffer&&L(),B}function u(){return x.buffer!=R.buffer&&L(),I}function f(){return x.buffer!=R.buffer&&L(),$}var l,c,d=Object.assign({},r),b=new Promise(((e,r)=>{l=e,c=r})),m=\"object\"==typeof window,p=\"function\"==typeof importScripts,h=p&&\"em-pthread\"==self.name;d.mountExternalData=(e,r)=>{(d.Fb||(d.Fb=new Map)).set(e,r)},d.unmountExternalData=()=>{delete d.Fb};var g=globalThis.SharedArrayBuffer??new WebAssembly.Memory({initial:0,maximum:0,shared:!0}).buffer.constructor;let v=()=>{const e=(e,r,t)=>(...n)=>{const a=zr,o=r?.();n=e(...n);const i=r?.();return o!==i&&(e=i,t(o),r=t=null),zr!=a?new Promise(((e,r)=>{Qr={resolve:e,reject:r}})):n},r=e=>async(...r)=>{try{if(d.Eb)throw Error(\"Session already started\");const t=d.Eb={bc:r[0],errors:[]},n=await e(...r);if(d.Eb!==t)throw Error(\"Session mismatch\");d.Mb?.flush();const a=t.errors;if(0e)),0d._OrtCreateSession),(e=>d._OrtCreateSession=e)),d._OrtRun=r(e(d._OrtRun,(()=>d._OrtRun),(e=>d._OrtRun=e))),d._OrtRunWithBinding=r(e(d._OrtRunWithBinding,(()=>d._OrtRunWithBinding),(e=>d._OrtRunWithBinding=e))),d._OrtBindInput=e(d._OrtBindInput,(()=>d._OrtBindInput),(e=>d._OrtBindInput=e)),v=void 0};d.jsepInit=(e,r)=>{if(v?.(),\"webgpu\"===e){[d.Mb,d.Tb,d.Xb,d.Nb,d.Wb,d.jb,d.Yb,d.$b,d.Ub,d.Vb,d.Zb]=r;const e=d.Mb;d.jsepRegisterBuffer=(r,t,n,a)=>e.registerBuffer(r,t,n,a),d.jsepGetBuffer=r=>e.getBuffer(r),d.jsepCreateDownloader=(r,t,n)=>e.createDownloader(r,t,n),d.jsepOnReleaseSession=r=>{e.onReleaseSession(r)},d.jsepOnRunStart=r=>e.onRunStart(r)}};var y,w,A=Object.assign({},d),_=\"./this.program\",C=(e,r)=>{throw r},O=\"\";(m||p)&&(p?O=self.location.href:\"undefined\"!=typeof document&&document.currentScript&&(O=document.currentScript.src),e&&(O=e),O=O.startsWith(\"blob:\")?\"\":O.substr(0,O.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1),e=>{var r=new XMLHttpRequest;return r.open(\"GET\",e,!1),r.send(null),r.responseText},p&&(w=e=>{var r=new XMLHttpRequest;return r.open(\"GET\",e,!1),r.responseType=\"arraybuffer\",r.send(null),new Uint8Array(r.response)}),y=(e,r,t)=>{var n=new XMLHttpRequest;n.open(\"GET\",e,!0),n.responseType=\"arraybuffer\",n.onload=()=>{200==n.status||0==n.status&&n.response?r(n.response):t()},n.onerror=t,n.send(null)});var j=console.log.bind(console),T=console.error.bind(console),S=j,W=T;if(Object.assign(d,A),A=null,h){var E,M=!1;function Pn(e){try{var r=e.data,t=r.cmd;if(\"load\"===t){let e=[];self.onmessage=r=>e.push(r),self.startWorker=()=>{postMessage({cmd:\"loaded\"});for(let r of e)Pn(r);self.onmessage=Pn};for(const e of r.handlers)d[e]&&!d[e].proxy||(d[e]=(...r)=>{postMessage({Lb:\"callHandler\",kc:e,args:r})},\"print\"==e&&(S=d[e]),\"printErr\"==e&&(W=d[e]));x=r.wasmMemory,L(),E(r.wasmModule)}else if(\"run\"===t){_n(r.pthread_ptr,0,0,1,0,0),Rr(r.pthread_ptr),Te(),_e(),M||(gn(),M=!0);try{Se(r.start_routine,r.arg)}catch(e){if(\"unwind\"!=e)throw e}}else\"cancel\"===t?yn()&&Tn(-1):\"setimmediate\"!==r.target&&(\"checkMailbox\"===t?M&&Hr():t&&(W(`worker: received unknown command ${t}`),W(r)))}catch(e){throw Cn(),e}}W=function(...e){e=e.join(\" \"),console.error(e)},self.alert=function(...e){postMessage({Lb:\"alert\",text:e.join(\" \"),mc:yn()})},d.instantiateWasm=(e,r)=>new Promise((e=>{E=t=>{t=new WebAssembly.Instance(t,oe()),r(t),e()}})),self.onunhandledrejection=e=>{throw e.reason||e},self.onmessage=Pn}var x,N,k,R,H,D,F,P,B,I,U,G,$,Y=!1;function L(){var e=x.buffer;d.HEAP8=R=new Int8Array(e),d.HEAP16=D=new Int16Array(e),d.HEAPU8=H=new Uint8Array(e),d.HEAPU16=F=new Uint16Array(e),d.HEAP32=P=new Int32Array(e),d.HEAPU32=B=new Uint32Array(e),d.HEAPF32=I=new Float32Array(e),d.HEAPF64=$=new Float64Array(e),d.HEAP64=U=new BigInt64Array(e),d.HEAPU64=G=new BigUint64Array(e)}if(!h){if(d.wasmMemory)x=d.wasmMemory;else if(!((x=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0})).buffer instanceof g))throw W(\"requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag\"),Error(\"bad memory\");L()}var z=[],V=[],q=[],J=0,X=null,K=null;function Q(){if(0==--J&&(null!==X&&(clearInterval(X),X=null),K)){var e=K;K=null,e()}}function Z(e){throw W(e=\"Aborted(\"+e+\")\"),Y=!0,k=1,e=new WebAssembly.RuntimeError(e+\". Build with -sASSERTIONS for more info.\"),c(e),e}var ee,re=e=>e.startsWith(\"data:application/octet-stream;base64,\"),te=e=>e.startsWith(\"file://\");function ne(e){if(w)return w(e);throw\"both async and sync fetching of the wasm failed\"}function ae(e,r,t){return function(e){if(m||p){if(\"function\"==typeof fetch&&!te(e))return fetch(e,{credentials:\"same-origin\"}).then((r=>{if(!r.ok)throw`failed to load wasm binary file at '${e}'`;return r.arrayBuffer()})).catch((()=>ne(e)));if(y)return new Promise(((r,t)=>{y(e,(e=>r(new Uint8Array(e))),t)}))}return Promise.resolve().then((()=>ne(e)))}(e).then((e=>WebAssembly.instantiate(e,r))).then(t,(e=>{W(`failed to asynchronously prepare wasm: ${e}`),Z(e)}))}function oe(){return{a:{M:ue,za:se,b:Ee,$:xe,z:He,pa:De,X:Ie,Z:Ue,qa:Ge,na:$e,ga:Ye,ma:Le,J:ze,Y:Ve,V:qe,oa:Je,W:Xe,va:Ze,D:ir,P:ur,O:hr,C:vr,s:yr,p:wr,E:Ar,y:Er,Q:Mr,ta:xr,ja:Nr,T:Dr,aa:Pr,F:Br,ia:Rr,sa:Ir,u:$r,B:rt,o:nt,k:it,c:cr,n:ut,j:dt,Aa:bt,r:mt,d:pt,v:ht,m:gt,g:vt,l:yt,i:wt,h:At,e:_t,da:Ct,ea:St,fa:Wt,ba:Et,ca:Mt,S:xt,f:Rt,N:Ht,G:Dt,K:Ft,w:Pt,ra:It,U:Ut,t:Bt,x:Gt,L:$t,R:Yt,ya:qt,xa:Jt,ka:Zt,la:en,_:he,A:rn,I:tn,ha:nn,H:on,a:x,wa:me,ua:ln,q:cn}}}var ie={1337716:(e,r,t,a)=>{if(void 0===d||!d.Fb)return 1;if((e=Re(e>>>0)).startsWith(\"./\")&&(e=e.substring(2)),!(e=d.Fb.get(e)))return 2;if(a>>>=0,(r>>>=0)+(t>>>=0)>e.byteLength)return 3;try{return n().set(e.subarray(r,r+t),a>>>0),0}catch{return 4}},1338217:()=>{d.Ub()},1338248:()=>{d.Vb()},1338277:()=>{d.Zb()},1338302:e=>d.Tb(e),1338335:e=>d.Xb(e),1338367:(e,r,t)=>{d.Nb(e,r,t,!0)},1338406:(e,r,t)=>{d.Nb(e,r,t)},1338439:()=>\"undefined\"!=typeof wasmOffsetConverter,1338496:e=>{d.jb(\"Abs\",e,void 0)},1338547:e=>{d.jb(\"Neg\",e,void 0)},1338598:e=>{d.jb(\"Floor\",e,void 0)},1338651:e=>{d.jb(\"Ceil\",e,void 0)},1338703:e=>{d.jb(\"Reciprocal\",e,void 0)},1338761:e=>{d.jb(\"Sqrt\",e,void 0)},1338813:e=>{d.jb(\"Exp\",e,void 0)},1338864:e=>{d.jb(\"Erf\",e,void 0)},1338915:e=>{d.jb(\"Sigmoid\",e,void 0)},1338970:(e,r,t)=>{d.jb(\"HardSigmoid\",e,{alpha:r,beta:t})},1339049:e=>{d.jb(\"Log\",e,void 0)},1339100:e=>{d.jb(\"Sin\",e,void 0)},1339151:e=>{d.jb(\"Cos\",e,void 0)},1339202:e=>{d.jb(\"Tan\",e,void 0)},1339253:e=>{d.jb(\"Asin\",e,void 0)},1339305:e=>{d.jb(\"Acos\",e,void 0)},1339357:e=>{d.jb(\"Atan\",e,void 0)},1339409:e=>{d.jb(\"Sinh\",e,void 0)},1339461:e=>{d.jb(\"Cosh\",e,void 0)},1339513:e=>{d.jb(\"Asinh\",e,void 0)},1339566:e=>{d.jb(\"Acosh\",e,void 0)},1339619:e=>{d.jb(\"Atanh\",e,void 0)},1339672:e=>{d.jb(\"Tanh\",e,void 0)},1339724:e=>{d.jb(\"Not\",e,void 0)},1339775:(e,r,t)=>{d.jb(\"Clip\",e,{min:r,max:t})},1339844:e=>{d.jb(\"Clip\",e,void 0)},1339896:(e,r)=>{d.jb(\"Elu\",e,{alpha:r})},1339954:e=>{d.jb(\"Relu\",e,void 0)},1340006:(e,r)=>{d.jb(\"LeakyRelu\",e,{alpha:r})},1340070:(e,r)=>{d.jb(\"ThresholdedRelu\",e,{alpha:r})},1340140:(e,r)=>{d.jb(\"Cast\",e,{to:r})},1340198:e=>{d.jb(\"Add\",e,void 0)},1340249:e=>{d.jb(\"Sub\",e,void 0)},1340300:e=>{d.jb(\"Mul\",e,void 0)},1340351:e=>{d.jb(\"Div\",e,void 0)},1340402:e=>{d.jb(\"Pow\",e,void 0)},1340453:e=>{d.jb(\"Equal\",e,void 0)},1340506:e=>{d.jb(\"Greater\",e,void 0)},1340561:e=>{d.jb(\"GreaterOrEqual\",e,void 0)},1340623:e=>{d.jb(\"Less\",e,void 0)},1340675:e=>{d.jb(\"LessOrEqual\",e,void 0)},1340734:(e,r,t,n,a)=>{d.jb(\"ReduceMean\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1340893:(e,r,t,n,a)=>{d.jb(\"ReduceMax\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1341051:(e,r,t,n,a)=>{d.jb(\"ReduceMin\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1341209:(e,r,t,n,a)=>{d.jb(\"ReduceProd\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1341368:(e,r,t,n,a)=>{d.jb(\"ReduceSum\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1341526:(e,r,t,n,a)=>{d.jb(\"ReduceL1\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1341683:(e,r,t,n,a)=>{d.jb(\"ReduceL2\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1341840:(e,r,t,n,a)=>{d.jb(\"ReduceLogSum\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1342001:(e,r,t,n,a)=>{d.jb(\"ReduceSumSquare\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1342165:(e,r,t,n,a)=>{d.jb(\"ReduceLogSumExp\",e,{keepDims:!!r,noopWithEmptyAxes:!!t,axes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1342329:e=>{d.jb(\"Where\",e,void 0)},1342382:(e,r,t)=>{d.jb(\"Transpose\",e,{perm:r?Array.from(i().subarray(r>>>0,t>>>0)):[]})},1342490:(e,r,t,n)=>{d.jb(\"DepthToSpace\",e,{blocksize:r,mode:Re(t),format:n?\"NHWC\":\"NCHW\"})},1342623:(e,r,t,n)=>{d.jb(\"DepthToSpace\",e,{blocksize:r,mode:Re(t),format:n?\"NHWC\":\"NCHW\"})},1342756:(e,r,n,a,o,s,u,f,l,c,b,m,p,h,g)=>{d.jb(\"ConvTranspose\",e,{format:l?\"NHWC\":\"NCHW\",autoPad:r,dilations:[n],group:a,kernelShape:[o],pads:[s,u],strides:[f],wIsConst:()=>!!t()[c>>>0],outputPadding:b?Array.from(i().subarray(b>>>0,m>>>0)):[],outputShape:p?Array.from(i().subarray(p>>>0,h>>>0)):[],activation:Re(g)})},1343157:(e,r,n,a,o,s,u,f,l,c,b,m,p,h)=>{d.jb(\"ConvTranspose\",e,{format:f?\"NHWC\":\"NCHW\",autoPad:r,dilations:Array.from(i().subarray(n>>>0,2+(n>>>0)>>>0)),group:a,kernelShape:Array.from(i().subarray(o>>>0,2+(o>>>0)>>>0)),pads:Array.from(i().subarray(s>>>0,4+(s>>>0)>>>0)),strides:Array.from(i().subarray(u>>>0,2+(u>>>0)>>>0)),wIsConst:()=>!!t()[l>>>0],outputPadding:c?Array.from(i().subarray(c>>>0,b>>>0)):[],outputShape:m?Array.from(i().subarray(m>>>0,p>>>0)):[],activation:Re(h)})},1343722:(e,r,n,a,o,s,u,f,l,c,b,m,p,h,g)=>{d.jb(\"ConvTranspose\",e,{format:l?\"NHWC\":\"NCHW\",autoPad:r,dilations:[n],group:a,kernelShape:[o],pads:[s,u],strides:[f],wIsConst:()=>!!t()[c>>>0],outputPadding:b?Array.from(i().subarray(b>>>0,m>>>0)):[],outputShape:p?Array.from(i().subarray(p>>>0,h>>>0)):[],activation:Re(g)})},1344123:(e,r,n,a,o,s,u,f,l,c,b,m,p,h)=>{d.jb(\"ConvTranspose\",e,{format:f?\"NHWC\":\"NCHW\",autoPad:r,dilations:Array.from(i().subarray(n>>>0,2+(n>>>0)>>>0)),group:a,kernelShape:Array.from(i().subarray(o>>>0,2+(o>>>0)>>>0)),pads:Array.from(i().subarray(s>>>0,4+(s>>>0)>>>0)),strides:Array.from(i().subarray(u>>>0,2+(u>>>0)>>>0)),wIsConst:()=>!!t()[l>>>0],outputPadding:c?Array.from(i().subarray(c>>>0,b>>>0)):[],outputShape:m?Array.from(i().subarray(m>>>0,p>>>0)):[],activation:Re(h)})},1344688:(e,r)=>{d.jb(\"GlobalAveragePool\",e,{format:r?\"NHWC\":\"NCHW\"})},1344779:(e,r,t,n,a,o,i,s,u,f,l,c,b,m,p,h)=>{d.jb(\"AveragePool\",e,{format:h?\"NHWC\":\"NCHW\",auto_pad:r,ceil_mode:t,count_include_pad:n,storage_order:a,dilations:[o,i],kernel_shape:[s,u],pads:[f,l,c,b],strides:[m,p]})},1345063:(e,r)=>{d.jb(\"GlobalAveragePool\",e,{format:r?\"NHWC\":\"NCHW\"})},1345154:(e,r,t,n,a,o,i,s,u,f,l,c,b,m,p,h)=>{d.jb(\"AveragePool\",e,{format:h?\"NHWC\":\"NCHW\",auto_pad:r,ceil_mode:t,count_include_pad:n,storage_order:a,dilations:[o,i],kernel_shape:[s,u],pads:[f,l,c,b],strides:[m,p]})},1345438:(e,r)=>{d.jb(\"GlobalMaxPool\",e,{format:r?\"NHWC\":\"NCHW\"})},1345525:(e,r,t,n,a,o,i,s,u,f,l,c,b,m,p,h)=>{d.jb(\"MaxPool\",e,{format:h?\"NHWC\":\"NCHW\",auto_pad:r,ceil_mode:t,count_include_pad:n,storage_order:a,dilations:[o,i],kernel_shape:[s,u],pads:[f,l,c,b],strides:[m,p]})},1345805:(e,r)=>{d.jb(\"GlobalMaxPool\",e,{format:r?\"NHWC\":\"NCHW\"})},1345892:(e,r,t,n,a,o,i,s,u,f,l,c,b,m,p,h)=>{d.jb(\"MaxPool\",e,{format:h?\"NHWC\":\"NCHW\",auto_pad:r,ceil_mode:t,count_include_pad:n,storage_order:a,dilations:[o,i],kernel_shape:[s,u],pads:[f,l,c,b],strides:[m,p]})},1346172:(e,r,t,n,a)=>{d.jb(\"Gemm\",e,{alpha:r,beta:t,transA:n,transB:a})},1346276:e=>{d.jb(\"MatMul\",e,void 0)},1346330:(e,r,t,n)=>{d.jb(\"ArgMax\",e,{keepDims:!!r,selectLastIndex:!!t,axis:n})},1346438:(e,r,t,n)=>{d.jb(\"ArgMin\",e,{keepDims:!!r,selectLastIndex:!!t,axis:n})},1346546:(e,r)=>{d.jb(\"Softmax\",e,{axis:r})},1346609:(e,r)=>{d.jb(\"Concat\",e,{axis:r})},1346669:(e,r,t,n,a)=>{d.jb(\"Split\",e,{axis:r,numOutputs:t,splitSizes:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1346809:e=>{d.jb(\"Expand\",e,void 0)},1346863:(e,r)=>{d.jb(\"Gather\",e,{axis:Number(r)})},1346934:(e,r)=>{d.jb(\"GatherElements\",e,{axis:Number(r)})},1347013:(e,r,t,n,a,o,s,u,f,l,c)=>{d.jb(\"Resize\",e,{antialias:r,axes:t?Array.from(i().subarray(t>>>0,n>>>0)):[],coordinateTransformMode:Re(a),cubicCoeffA:o,excludeOutside:s,extrapolationValue:u,keepAspectRatioPolicy:Re(f),mode:Re(l),nearestMode:Re(c)})},1347359:(e,r,t,n,a,o,s)=>{d.jb(\"Slice\",e,{starts:r?Array.from(i().subarray(r>>>0,t>>>0)):[],ends:n?Array.from(i().subarray(n>>>0,a>>>0)):[],axes:o?Array.from(i().subarray(o>>>0,s>>>0)):[]})},1347575:e=>{d.jb(\"Tile\",e,void 0)},1347627:(e,r,t)=>{d.jb(\"InstanceNormalization\",e,{epsilon:r,format:t?\"NHWC\":\"NCHW\"})},1347741:(e,r,t)=>{d.jb(\"InstanceNormalization\",e,{epsilon:r,format:t?\"NHWC\":\"NCHW\"})},1347855:e=>{d.jb(\"Range\",e,void 0)},1347908:(e,r)=>{d.jb(\"Einsum\",e,{equation:Re(r)})},1347989:(e,r,t,n,a)=>{d.jb(\"Pad\",e,{mode:r,value:t,pads:n?Array.from(i().subarray(n>>>0,a>>>0)):[]})},1348116:(e,r,t,n,a,o)=>{d.jb(\"BatchNormalization\",e,{epsilon:r,momentum:t,spatial:!!a,trainingMode:!!n,format:o?\"NHWC\":\"NCHW\"})},1348285:(e,r,t,n,a,o)=>{d.jb(\"BatchNormalization\",e,{epsilon:r,momentum:t,spatial:!!a,trainingMode:!!n,format:o?\"NHWC\":\"NCHW\"})},1348454:(e,r,t)=>{d.jb(\"CumSum\",e,{exclusive:Number(r),reverse:Number(t)})},1348551:(e,r,t,n,a,o,s,u,f)=>{d.jb(\"Attention\",e,{numHeads:r,isUnidirectional:t,maskFilterValue:n,scale:a,doRotary:o,qkvHiddenSizes:s?Array.from(i().subarray(Number(u)>>>0,Number(u)+s>>>0)):[],pastPresentShareBuffer:!!f})},1348823:e=>{d.jb(\"BiasAdd\",e,void 0)},1348878:e=>{d.jb(\"BiasSplitGelu\",e,void 0)},1348939:e=>{d.jb(\"FastGelu\",e,void 0)},1348995:(e,r,n,a,o,s,f,l,c,b,m,p,h,g,v,y)=>{d.jb(\"Conv\",e,{format:p?\"NHWC\":\"NCHW\",auto_pad:r,dilations:n?Array.from(i().subarray(n>>>0,a>>>0)):[],group:o,kernel_shape:s?Array.from(i().subarray(s>>>0,f>>>0)):[],pads:l?Array.from(i().subarray(l>>>0,c>>>0)):[],strides:b?Array.from(i().subarray(b>>>0,m>>>0)):[],w_is_const:()=>!!t()[h>>>0],activation:Re(g),activation_params:v?Array.from(u().subarray(v>>>0,y>>>0)):[]})},1349491:e=>{d.jb(\"Gelu\",e,void 0)},1349543:(e,r,t,n)=>{d.jb(\"GroupQueryAttention\",e,{numHeads:r,kvNumHeads:t,scale:n})},1349656:(e,r,t,n)=>{d.jb(\"LayerNormalization\",e,{axis:r,epsilon:t,simplified:!!n})},1349767:(e,r,t,n)=>{d.jb(\"LayerNormalization\",e,{axis:r,epsilon:t,simplified:!!n})},1349878:(e,r,t,n,a,o)=>{d.jb(\"MatMulNBits\",e,{k:r,n:t,accuracyLevel:n,bits:a,blockSize:o})},1350005:(e,r,t,n,a,o)=>{d.jb(\"MultiHeadAttention\",e,{numHeads:r,isUnidirectional:t,maskFilterValue:n,scale:a,doRotary:o})},1350164:(e,r)=>{d.jb(\"QuickGelu\",e,{alpha:r})},1350228:(e,r,t,n,a)=>{d.jb(\"RotaryEmbedding\",e,{interleaved:!!r,numHeads:t,rotaryEmbeddingDim:n,scale:a})},1350367:(e,r,t)=>{d.jb(\"SkipLayerNormalization\",e,{epsilon:r,simplified:!!t})},1350469:e=>{d.Yb(e)},1350503:(e,r)=>d.$b(e,r,d.Eb.bc,d.Eb.errors),1350615:(e,r,t)=>{d.jb(\"SkipLayerNormalization\",e,{epsilon:r,simplified:!!t})}};function se(e,r,t){return et((async()=>{await d.Wb(e,r,t)}))}function ue(){return\"undefined\"!=typeof wasmOffsetConverter}function fe(e){this.name=\"ExitStatus\",this.message=`Program terminated with exit(${e})`,this.status=e}var le=e=>{e.terminate(),e.onmessage=()=>{}},ce=e=>{0==ge.length&&(Oe(),Ce(ge[0]));var r=ge.pop();if(!r)return 6;ve.push(r),we[e.Ab]=r,r.Ab=e.Ab;var t={cmd:\"run\",start_routine:e.cc,arg:e.Pb,pthread_ptr:e.Ab};return r.postMessage(t,e.ic),0},de=0,be=(e,r,...t)=>{for(var n=2*t.length,a=xn(),o=Mn(8*n),i=o>>>3,s=0;s>>0]=u)}return e=On(e,0,n,o,r),En(a),e};function me(e){if(h)return be(0,1,e);if(k=e,!(0{if(k=e,h)throw pe(e),\"unwind\";me(e)},ge=[],ve=[],ye=[],we={},Ae=e=>{var r=e.Ab;delete we[r],ge.push(e),ve.splice(ve.indexOf(e),1),e.Ab=0,jn(r)};function _e(){ye.forEach((e=>e()))}var Ce=e=>new Promise((r=>{e.onmessage=t=>{var n=(t=t.data).cmd;if(t.targetThread&&t.targetThread!=yn()){var a=we[t.targetThread];a?a.postMessage(t,t.transferList):W(`Internal error! Worker sent a message \"${n}\" to target pthread ${t.targetThread}, but that thread no longer exists!`)}else\"checkMailbox\"===n?Hr():\"spawnThread\"===n?ce(t):\"cleanupThread\"===n?Ae(we[t.thread]):\"killThread\"===n?(t=t.thread,n=we[t],delete we[t],le(n),jn(t),ve.splice(ve.indexOf(n),1),n.Ab=0):\"cancelThread\"===n?we[t.thread].postMessage({cmd:\"cancel\"}):\"loaded\"===n?(e.loaded=!0,r(e)):\"alert\"===n?alert(`Thread ${t.threadId}: ${t.text}`):\"setimmediate\"===t.target?e.postMessage(t):\"callHandler\"===n?d[t.handler](...t.args):n&&W(`worker sent an unknown command ${n}`)},e.onerror=e=>{throw W(`worker sent an error! ${e.filename}:${e.lineno}: ${e.message}`),e};var t,n=[];for(t of[\"onExit\"])d.hasOwnProperty(t)&&n.push(t);e.postMessage({cmd:\"load\",handlers:n,wasmMemory:x,wasmModule:N})}));function Oe(){var e=new Worker(new URL(import.meta.url),{type:\"module\",workerData:\"em-pthread\",name:\"em-pthread\"});ge.push(e)}var je=e=>{for(;0{var e=yn(),r=s()[e+52>>>2>>>0];e=s()[e+56>>>2>>>0],Wn(r,r-e),En(r)},Se=(e,r)=>{de=0,e=Nn(e,r),0>>=0);throw r>>>=0,t>>>=0,s()[n.Ib+16>>>2>>>0]=0,s()[n.Ib+4>>>2>>>0]=r,s()[n.Ib+8>>>2>>>0]=t,e}function Me(e,r,t,n){return h?be(2,1,e,r,t,n):xe(e,r,t,n)}function xe(e,r,t,n){if(e>>>=0,r>>>=0,t>>>=0,n>>>=0,void 0===g)return W(\"Current environment does not support SharedArrayBuffer, pthreads are not available!\"),6;var a=[];return h&&0===a.length?Me(e,r,t,n):(e={cc:t,Ab:e,Pb:n,ic:a},h?(e.Lb=\"spawnThread\",postMessage(e,a),0):ce(e))}var Ne=\"undefined\"!=typeof TextDecoder?new TextDecoder(\"utf8\"):void 0,ke=(e,r,t)=>{var n=(r>>>=0)+t;for(t=r;e[t]&&!(t>=n);)++t;if(16(a=224==(240&a)?(15&a)<<12|o<<6|i:(7&a)<<18|o<<12|i<<6|63&e[r++])?n+=String.fromCharCode(a):(a-=65536,n+=String.fromCharCode(55296|a>>10,56320|1023&a))}}else n+=String.fromCharCode(a)}return n},Re=(e,r)=>(e>>>=0)?ke(n(),e,r):\"\";function He(e,r,t){return h?be(3,1,e,r,t):0}function De(e,r){if(h)return be(4,1,e,r)}var Fe=e=>{for(var r=0,t=0;t=n?r++:2047>=n?r+=2:55296<=n&&57343>=n?(r+=4,++t):r+=3}return r},Pe=(e,r,t,n)=>{if(!(0>>=0;n=t+n-1;for(var o=0;o=i&&(i=65536+((1023&i)<<10)|1023&e.charCodeAt(++o)),127>=i){if(t>=n)break;r[t++>>>0]=i}else{if(2047>=i){if(t+1>=n)break;r[t++>>>0]=192|i>>6}else{if(65535>=i){if(t+2>=n)break;r[t++>>>0]=224|i>>12}else{if(t+3>=n)break;r[t++>>>0]=240|i>>18,r[t++>>>0]=128|i>>12&63}r[t++>>>0]=128|i>>6&63}r[t++>>>0]=128|63&i}}return r[t>>>0]=0,t-a},Be=(e,r,t)=>Pe(e,n(),r,t);function Ie(e,r){if(h)return be(5,1,e,r)}function Ue(e,r,t){if(h)return be(6,1,e,r,t)}function Ge(e,r,t){return h?be(7,1,e,r,t):0}function $e(e,r){if(h)return be(8,1,e,r)}function Ye(e,r,t){if(h)return be(9,1,e,r,t)}function Le(e,r,t,n){if(h)return be(10,1,e,r,t,n)}function ze(e,r,t,n){if(h)return be(11,1,e,r,t,n)}function Ve(e,r,t,n){if(h)return be(12,1,e,r,t,n)}function qe(e){if(h)return be(13,1,e)}function Je(e,r){if(h)return be(14,1,e,r)}function Xe(e,r,t){if(h)return be(15,1,e,r,t)}var Ke,Qe,Ze=()=>{Z(\"\")},er=e=>{for(var r=\"\";n()[e>>>0];)r+=Ke[n()[e++>>>0]];return r},rr={},tr={},nr={};function ar(e,r,t={}){if(!(\"argPackAdvance\"in r))throw new TypeError(\"registerType registeredInstance requires argPackAdvance\");return function(e,r,t={}){var n=r.name;if(!e)throw new Qe(`type \"${n}\" must have a positive integer typeid pointer`);if(tr.hasOwnProperty(e)){if(t.Rb)return;throw new Qe(`Cannot register type '${n}' twice`)}tr[e]=r,delete nr[e],rr.hasOwnProperty(e)&&(r=rr[e],delete rr[e],r.forEach((e=>e())))}(e,r,t)}var or=(e,r,u)=>{switch(r){case 1:return u?e=>t()[e>>>0]:e=>n()[e>>>0];case 2:return u?e=>a()[e>>>1>>>0]:e=>o()[e>>>1>>>0];case 4:return u?e=>i()[e>>>2>>>0]:e=>s()[e>>>2>>>0];case 8:return u?e=>U[e>>>3]:e=>G[e>>>3];default:throw new TypeError(`invalid integer width (${r}): ${e}`)}};function ir(e,r,t){t>>>=0,ar(e>>>=0,{name:r=er(r>>>0),fromWireType:e=>e,toWireType:function(e,r){if(\"bigint\"!=typeof r&&\"number\"!=typeof r)throw r=null===r?\"null\":\"object\"==(e=typeof r)||\"array\"===e||\"function\"===e?r.toString():\"\"+r,new TypeError(`Cannot convert \"${r}\" to ${this.name}`);return\"number\"==typeof r&&(r=BigInt(r)),r},argPackAdvance:sr,readValueFromPointer:or(r,t,-1==r.indexOf(\"u\")),Db:null})}var sr=8;function ur(e,r,t,a){ar(e>>>=0,{name:r=er(r>>>0),fromWireType:function(e){return!!e},toWireType:function(e,r){return r?t:a},argPackAdvance:sr,readValueFromPointer:function(e){return this.fromWireType(n()[e>>>0])},Db:null})}var fr=[],lr=[];function cr(e){9<(e>>>=0)&&0==--lr[e+1]&&(lr[e]=void 0,fr.push(e))}var dr=e=>{if(!e)throw new Qe(\"Cannot use deleted val. handle = \"+e);return lr[e]},br=e=>{switch(e){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:const r=fr.pop()||lr.length;return lr[r]=e,lr[r+1]=1,r}};function mr(e){return this.fromWireType(s()[e>>>2>>>0])}var pr={name:\"emscripten::val\",fromWireType:e=>{var r=dr(e);return cr(e),r},toWireType:(e,r)=>br(r),argPackAdvance:sr,readValueFromPointer:mr,Db:null};function hr(e){return ar(e>>>0,pr)}var gr=(e,r)=>{switch(r){case 4:return function(e){return this.fromWireType(u()[e>>>2>>>0])};case 8:return function(e){return this.fromWireType(f()[e>>>3>>>0])};default:throw new TypeError(`invalid float width (${r}): ${e}`)}};function vr(e,r,t){t>>>=0,ar(e>>>=0,{name:r=er(r>>>0),fromWireType:e=>e,toWireType:(e,r)=>r,argPackAdvance:sr,readValueFromPointer:gr(r,t),Db:null})}function yr(e,r,t,n,a){if(e>>>=0,t>>>=0,r=er(r>>>0),-1===a&&(a=4294967295),a=e=>e,0===n){var o=32-8*t;a=e=>e<>>o}var i=r.includes(\"unsigned\")?function(e,r){return r>>>0}:function(e,r){return r};ar(e,{name:r,fromWireType:a,toWireType:i,argPackAdvance:sr,readValueFromPointer:or(r,t,0!==n),Db:null})}function wr(e,r,n){function a(e){var r=s()[e>>>2>>>0];return e=s()[e+4>>>2>>>0],new o(t().buffer,e,r)}var o=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][r];ar(e>>>=0,{name:n=er(n>>>0),fromWireType:a,argPackAdvance:sr,readValueFromPointer:a},{Rb:!0})}function Ar(e,r){e>>>=0;var t=\"std::string\"===(r=er(r>>>0));ar(e,{name:r,fromWireType:function(e){var r=s()[e>>>2>>>0],a=e+4;if(t)for(var o=a,i=0;i<=r;++i){var u=a+i;if(i==r||0==n()[u>>>0]){if(o=Re(o,u-o),void 0===f)var f=o;else f+=String.fromCharCode(0),f+=o;o=u+1}}else{for(f=Array(r),i=0;i>>0]);f=f.join(\"\")}return An(e),f},toWireType:function(e,r){r instanceof ArrayBuffer&&(r=new Uint8Array(r));var a=\"string\"==typeof r;if(!(a||r instanceof Uint8Array||r instanceof Uint8ClampedArray||r instanceof Int8Array))throw new Qe(\"Cannot pass non-string to std::string\");var o=t&&a?Fe(r):r.length,i=wn(4+o+1),u=i+4;if(s()[i>>>2>>>0]=o,t&&a)Be(r,u,o+1);else if(a)for(a=0;a>>0]=f}else for(a=0;a>>0]=r[a];return null!==e&&e.push(An,i),i},argPackAdvance:sr,readValueFromPointer:mr,Db(e){An(e)}})}var _r=\"undefined\"!=typeof TextDecoder?new TextDecoder(\"utf-16le\"):void 0,Cr=(e,r)=>{for(var t=e>>1,i=t+r/2;!(t>=i)&&o()[t>>>0];)++t;if(32<(t<<=1)-e&&_r)return _r.decode(n().slice(e,t));for(t=\"\",i=0;!(i>=r/2);++i){var s=a()[e+2*i>>>1>>>0];if(0==s)break;t+=String.fromCharCode(s)}return t},Or=(e,r,t)=>{if(t??=2147483647,2>t)return 0;var n=r;t=(t-=2)<2*e.length?t/2:e.length;for(var o=0;o>>1>>>0]=i,r+=2}return a()[r>>>1>>>0]=0,r-n},jr=e=>2*e.length,Tr=(e,r)=>{for(var t=0,n=\"\";!(t>=r/4);){var a=i()[e+4*t>>>2>>>0];if(0==a)break;++t,65536<=a?(a-=65536,n+=String.fromCharCode(55296|a>>10,56320|1023&a)):n+=String.fromCharCode(a)}return n},Sr=(e,r,t)=>{if(r>>>=0,t??=2147483647,4>t)return 0;var n=r;t=n+t-4;for(var a=0;a=o&&(o=65536+((1023&o)<<10)|1023&e.charCodeAt(++a)),i()[r>>>2>>>0]=o,(r+=4)+4>t)break}return i()[r>>>2>>>0]=0,r-n},Wr=e=>{for(var r=0,t=0;t=n&&++t,r+=4}return r};function Er(e,r,t){if(e>>>=0,r>>>=0,t=er(t>>>=0),2===r)var n=Cr,a=Or,i=jr,u=e=>o()[e>>>1>>>0];else 4===r&&(n=Tr,a=Sr,i=Wr,u=e=>s()[e>>>2>>>0]);ar(e,{name:t,fromWireType:e=>{for(var t,a=s()[e>>>2>>>0],o=e+4,i=0;i<=a;++i){var f=e+4+i*r;i!=a&&0!=u(f)||(o=n(o,f-o),void 0===t?t=o:(t+=String.fromCharCode(0),t+=o),o=f+r)}return An(e),t},toWireType:(e,n)=>{if(\"string\"!=typeof n)throw new Qe(`Cannot pass non-string to C++ string type ${t}`);var o=i(n),u=wn(4+o+r);return s()[u>>>2>>>0]=o/r,a(n,u+4,o+r),null!==e&&e.push(An,u),u},argPackAdvance:sr,readValueFromPointer:mr,Db(e){An(e)}})}function Mr(e,r){ar(e>>>=0,{Sb:!0,name:r=er(r>>>0),argPackAdvance:0,fromWireType:()=>{},toWireType:()=>{}})}var xr=()=>1;function Nr(e){_n(e>>>0,!p,1,!m,131072,!1),_e()}var kr=e=>{if(!Y)try{if(e(),!(0>>=0,\"function\"==typeof Atomics.jc&&(Atomics.jc(i(),e>>>2,e).value.then(Hr),e+=128,Atomics.store(i(),e>>>2,1))}var Hr=()=>{var e=yn();e&&(Rr(e),kr(Sn))};function Dr(e,r){(e>>>=0)==r>>>0?setTimeout(Hr):h?postMessage({targetThread:e,cmd:\"checkMailbox\"}):(e=we[e])&&e.postMessage({cmd:\"checkMailbox\"})}var Fr=[];function Pr(e,r,t,n,a){for(r>>>=0,n/=2,Fr.length=n,t=a>>>0>>>3,a=0;a>>0];return(r?ie[r]:mn[e])(...Fr)}function Br(e){e>>>=0,h?postMessage({cmd:\"cleanupThread\",thread:e}):Ae(we[e])}function Ir(e){}var Ur=(e,r)=>{var t=tr[e];if(void 0===t)throw e=hn(e),t=er(e),An(e),new Qe(`${r} has unknown type ${t}`);return t},Gr=(e,r,t)=>{var n=[];return e=e.toWireType(n,t),n.length&&(s()[r>>>2>>>0]=br(n)),e};function $r(e,r,t){return r>>>=0,t>>>=0,e=dr(e>>>0),r=Ur(r,\"emval::as\"),Gr(r,t,e)}var Yr=e=>{try{e()}catch(e){Z(e)}},Lr=0,zr=null,Vr=0,qr=[],Jr={},Xr={},Kr=0,Qr=null,Zr=[];function et(e){return function(e){if(!Y){if(0===Lr){var r=!1,t=!1;e(((e=0)=>{if(!Y&&(Vr=e,r=!0,t)){Lr=2,Yr((()=>Hn(zr))),\"undefined\"!=typeof Browser&&Browser.Jb.Qb&&Browser.Jb.resume(),e=!1;try{var n=function(){var e=i()[zr+8>>>2>>>0];return e=pn[Xr[e]],--de,e()}()}catch(r){n=r,e=!0}var a=!1;if(!zr){var o=Qr;o&&(Qr=null,(e?o.reject:o.resolve)(n),a=!0)}if(e&&!a)throw n}})),t=!0,r||(Lr=1,zr=function(){var e=wn(65548),r=e+12;s()[e>>>2>>>0]=r,s()[e+4>>>2>>>0]=r+65536,r=qr[0];var t=Jr[r];return void 0===t&&(t=Kr++,Jr[r]=t,Xr[t]=r),r=t,i()[e+8>>>2>>>0]=r,e}(),\"undefined\"!=typeof Browser&&Browser.Jb.Qb&&Browser.Jb.pause(),Yr((()=>kn(zr))))}else 2===Lr?(Lr=0,Yr(Dn),An(zr),zr=null,Zr.forEach(kr)):Z(`invalid state: ${Lr}`);return Vr}}((r=>{e().then(r)}))}function rt(e){return e>>>=0,et((()=>(e=dr(e)).then(br)))}var tt=[];function nt(e,r,t,n){return t>>>=0,n>>>=0,(e=tt[e>>>0])(null,r=dr(r>>>0),t,n)}var at={},ot=e=>{var r=at[e];return void 0===r?er(e):r};function it(e,r,t,n,a){return t>>>=0,n>>>=0,a>>>=0,(e=tt[e>>>0])(r=dr(r>>>0),r[t=ot(t)],n,a)}var st=()=>\"object\"==typeof globalThis?globalThis:Function(\"return this\")();function ut(e){return 0==(e>>>=0)?br(st()):(e=ot(e),br(st()[e]))}var ft=e=>{var r=tt.length;return tt.push(e),r},lt=(e,r)=>{for(var t=Array(e),n=0;n>>2>>>0],\"parameter \"+n);return t},ct=(e,r)=>Object.defineProperty(r,\"name\",{value:e});function dt(e,r,t){var n=(r=lt(e,r>>>0)).shift();e--;var a=\"return function (obj, func, destructorsRef, args) {\\n\",o=0,i=[];0===t&&i.push(\"obj\");for(var s=[\"retType\"],u=[n],f=0;fe.name)).join(\", \")}) => ${n.name}>`,ft(ct(t,e))}function bt(e){return e=ot(e>>>0),br(d[e])}function mt(e,r){return r>>>=0,e=dr(e>>>0),r=dr(r),br(e[r])}function pt(e){9<(e>>>=0)&&(lr[e+1]+=1)}function ht(){return br([])}function gt(e){e=dr(e>>>0);for(var r=Array(e.length),t=0;t>>0))}function yt(){return br({})}function wt(e){for(var r=dr(e>>>=0);r.length;){var t=r.pop();r.pop()(t)}cr(e)}function At(e,r,t){r>>>=0,t>>>=0,e=dr(e>>>0),r=dr(r),t=dr(t),e[r]=t}function _t(e,r){return r>>>=0,e=(e=Ur(e>>>0,\"_emval_take_value\")).readValueFromPointer(r),br(e)}function Ct(e,r){e=-9007199254740992>e||9007199254740992>>=0,e=new Date(1e3*e),i()[r>>>2>>>0]=e.getUTCSeconds(),i()[r+4>>>2>>>0]=e.getUTCMinutes(),i()[r+8>>>2>>>0]=e.getUTCHours(),i()[r+12>>>2>>>0]=e.getUTCDate(),i()[r+16>>>2>>>0]=e.getUTCMonth(),i()[r+20>>>2>>>0]=e.getUTCFullYear()-1900,i()[r+24>>>2>>>0]=e.getUTCDay(),e=(e.getTime()-Date.UTC(e.getUTCFullYear(),0,1,0,0,0,0))/864e5|0,i()[r+28>>>2>>>0]=e}var Ot=e=>0==e%4&&(0!=e%100||0==e%400),jt=[0,31,60,91,121,152,182,213,244,274,305,335],Tt=[0,31,59,90,120,151,181,212,243,273,304,334];function St(e,r){e=-9007199254740992>e||9007199254740992>>=0,e=new Date(1e3*e),i()[r>>>2>>>0]=e.getSeconds(),i()[r+4>>>2>>>0]=e.getMinutes(),i()[r+8>>>2>>>0]=e.getHours(),i()[r+12>>>2>>>0]=e.getDate(),i()[r+16>>>2>>>0]=e.getMonth(),i()[r+20>>>2>>>0]=e.getFullYear()-1900,i()[r+24>>>2>>>0]=e.getDay();var t=(Ot(e.getFullYear())?jt:Tt)[e.getMonth()]+e.getDate()-1|0;i()[r+28>>>2>>>0]=t,i()[r+36>>>2>>>0]=-60*e.getTimezoneOffset(),t=new Date(e.getFullYear(),6,1).getTimezoneOffset();var n=new Date(e.getFullYear(),0,1).getTimezoneOffset();e=0|(t!=n&&e.getTimezoneOffset()==Math.min(n,t)),i()[r+32>>>2>>>0]=e}function Wt(e){e>>>=0;var r=new Date(i()[e+20>>>2>>>0]+1900,i()[e+16>>>2>>>0],i()[e+12>>>2>>>0],i()[e+8>>>2>>>0],i()[e+4>>>2>>>0],i()[e>>>2>>>0],0),t=i()[e+32>>>2>>>0],n=r.getTimezoneOffset(),a=new Date(r.getFullYear(),6,1).getTimezoneOffset(),o=new Date(r.getFullYear(),0,1).getTimezoneOffset(),s=Math.min(o,a);return 0>t?i()[e+32>>>2>>>0]=Number(a!=o&&s==n):0>>2>>>0]=r.getDay(),t=(Ot(r.getFullYear())?jt:Tt)[r.getMonth()]+r.getDate()-1|0,i()[e+28>>>2>>>0]=t,i()[e>>>2>>>0]=r.getSeconds(),i()[e+4>>>2>>>0]=r.getMinutes(),i()[e+8>>>2>>>0]=r.getHours(),i()[e+12>>>2>>>0]=r.getDate(),i()[e+16>>>2>>>0]=r.getMonth(),i()[e+20>>>2>>>0]=r.getYear(),e=r.getTime(),BigInt(isNaN(e)?-1:e/1e3)}function Et(e,r,t,n,a,o,i){return h?be(16,1,e,r,t,n,a,o,i):-52}function Mt(e,r,t,n,a,o){if(h)return be(17,1,e,r,t,n,a,o)}function xt(e,r,t,n){e>>>=0,r>>>=0,t>>>=0,n>>>=0;var a=(new Date).getFullYear(),o=new Date(a,0,1),u=new Date(a,6,1);a=o.getTimezoneOffset();var f=u.getTimezoneOffset(),l=Math.max(a,f);s()[e>>>2>>>0]=60*l,i()[r>>>2>>>0]=Number(a!=f),o=(e=e=>e.toLocaleTimeString(void 0,{hour12:!1,timeZoneName:\"short\"}).split(\" \")[1])(o),u=e(u),f{Nt.length=0;for(var t;t=n()[e++>>>0];){var a=105!=t;r+=(a&=112!=t)&&r%8?4:0,Nt.push(112==t?s()[r>>>2>>>0]:106==t?U[r>>>3]:105==t?i()[r>>>2>>>0]:f()[r>>>3>>>0]),r+=a?8:4}return Nt};function Rt(e,r,t){return e>>>=0,r=kt(r>>>0,t>>>0),ie[e](...r)}function Ht(e,r,t){return e>>>=0,r=kt(r>>>0,t>>>0),ie[e](...r)}var Dt=()=>{},Ft=()=>Date.now();function Pt(e,r){return W(Re(e>>>0,r>>>0))}var Bt,It=()=>{throw de+=1,\"unwind\"};function Ut(){return 4294901760}Bt=()=>performance.timeOrigin+performance.now();var Gt=()=>navigator.hardwareConcurrency;function $t(){return Z(\"Cannot use emscripten_pc_get_function without -sUSE_OFFSET_CONVERTER\"),0}function Yt(e){e>>>=0;var r=n().length;if(e<=r||4294901760=t;t*=2){var a=r*(1+.2/t);a=Math.min(a,e+100663296);var o=Math;a=Math.max(e,a);e:{o=(o.min.call(o,4294901760,a+(65536-a%65536)%65536)-x.buffer.byteLength+65535)/65536;try{x.grow(o),L();var i=1;break e}catch(e){}i=void 0}if(i)return!0}return!1}var Lt=()=>(Z(\"Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER\"),0),zt={},Vt=e=>{e.forEach((e=>{var r=Lt();r&&(zt[r]=e)}))};function qt(){var e=Error().stack.toString().split(\"\\n\");return\"Error\"==e[0]&&e.shift(),Vt(e),zt.Ob=Lt(),zt.ac=e,zt.Ob}function Jt(e,r,t){if(e>>>=0,r>>>=0,zt.Ob==e)var n=zt.ac;else\"Error\"==(n=Error().stack.toString().split(\"\\n\"))[0]&&n.shift(),Vt(n);for(var a=3;n[a]&&Lt()!=e;)++a;for(e=0;e>>2>>>0]=Lt();return e}var Xt,Kt={},Qt=()=>{if(!Xt){var e,r={USER:\"web_user\",LOGNAME:\"web_user\",PATH:\"/\",PWD:\"/\",HOME:\"/home/web_user\",LANG:(\"object\"==typeof navigator&&navigator.languages&&navigator.languages[0]||\"C\").replace(\"-\",\"_\")+\".UTF-8\",_:_||\"./this.program\"};for(e in Kt)void 0===Kt[e]?delete r[e]:r[e]=Kt[e];var t=[];for(e in r)t.push(`${e}=${r[e]}`);Xt=t}return Xt};function Zt(e,r){if(h)return be(18,1,e,r);e>>>=0,r>>>=0;var n=0;return Qt().forEach(((a,o)=>{var i=r+n;for(o=s()[e+4*o>>>2>>>0]=i,i=0;i>>0]=a.charCodeAt(i);t()[o>>>0]=0,n+=a.length+1})),0}function en(e,r){if(h)return be(19,1,e,r);e>>>=0,r>>>=0;var t=Qt();s()[e>>>2>>>0]=t.length;var n=0;return t.forEach((e=>n+=e.length+1)),s()[r>>>2>>>0]=n,0}function rn(e){return h?be(20,1,e):52}function tn(e,r,t,n){return h?be(21,1,e,r,t,n):52}function nn(e,r,t,n){return h?be(22,1,e,r,t,n):70}var an=[null,[],[]];function on(e,r,t,a){if(h)return be(23,1,e,r,t,a);r>>>=0,t>>>=0,a>>>=0;for(var o=0,i=0;i>>2>>>0],f=s()[r+4>>>2>>>0];r+=8;for(var l=0;l>>0],d=an[e];0===c||10===c?((1===e?S:W)(ke(d,0)),d.length=0):d.push(c)}o+=f}return s()[a>>>2>>>0]=o,0}var sn=[31,29,31,30,31,30,31,31,30,31,30,31],un=[31,28,31,30,31,30,31,31,30,31,30,31],fn=(e,r)=>{t().set(e,r>>>0)};function ln(e,r,t,n){function a(e,r,t){for(e=\"number\"==typeof e?e.toString():e||\"\";e.lengthe?-1:0n-e.getDate())){e.setDate(e.getDate()+r);break}r-=n-e.getDate()+1,e.setDate(1),11>t?e.setMonth(t+1):(e.setMonth(0),e.setFullYear(e.getFullYear()+1))}return t=new Date(e.getFullYear()+1,0,4),r=f(new Date(e.getFullYear(),0,4)),t=f(t),0>=u(r,e)?0>=u(t,e)?e.getFullYear()+1:e.getFullYear():e.getFullYear()-1}e>>>=0,r>>>=0,t>>>=0,n>>>=0;var c=s()[n+40>>>2>>>0];for(var d in n={fc:i()[n>>>2>>>0],ec:i()[n+4>>>2>>>0],Gb:i()[n+8>>>2>>>0],Kb:i()[n+12>>>2>>>0],Hb:i()[n+16>>>2>>>0],Cb:i()[n+20>>>2>>>0],ub:i()[n+24>>>2>>>0],Bb:i()[n+28>>>2>>>0],nc:i()[n+32>>>2>>>0],dc:i()[n+36>>>2>>>0],hc:c?Re(c):\"\"},t=Re(t),c={\"%c\":\"%a %b %d %H:%M:%S %Y\",\"%D\":\"%m/%d/%y\",\"%F\":\"%Y-%m-%d\",\"%h\":\"%b\",\"%r\":\"%I:%M:%S %p\",\"%R\":\"%H:%M\",\"%T\":\"%H:%M:%S\",\"%x\":\"%m/%d/%y\",\"%X\":\"%H:%M:%S\",\"%Ec\":\"%c\",\"%EC\":\"%C\",\"%Ex\":\"%m/%d/%y\",\"%EX\":\"%H:%M:%S\",\"%Ey\":\"%y\",\"%EY\":\"%Y\",\"%Od\":\"%d\",\"%Oe\":\"%e\",\"%OH\":\"%H\",\"%OI\":\"%I\",\"%Om\":\"%m\",\"%OM\":\"%M\",\"%OS\":\"%S\",\"%Ou\":\"%u\",\"%OU\":\"%U\",\"%OV\":\"%V\",\"%Ow\":\"%w\",\"%OW\":\"%W\",\"%Oy\":\"%y\"})t=t.replace(new RegExp(d,\"g\"),c[d]);var b=\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),m=\"January February March April May June July August September October November December\".split(\" \");for(d in c={\"%a\":e=>b[e.ub].substring(0,3),\"%A\":e=>b[e.ub],\"%b\":e=>m[e.Hb].substring(0,3),\"%B\":e=>m[e.Hb],\"%C\":e=>o((e.Cb+1900)/100|0,2),\"%d\":e=>o(e.Kb,2),\"%e\":e=>a(e.Kb,2,\" \"),\"%g\":e=>l(e).toString().substring(2),\"%G\":l,\"%H\":e=>o(e.Gb,2),\"%I\":e=>(0==(e=e.Gb)?e=12:12{for(var r=0,t=0;t<=e.Hb-1;r+=(Ot(e.Cb+1900)?sn:un)[t++]);return o(e.Kb+r,3)},\"%m\":e=>o(e.Hb+1,2),\"%M\":e=>o(e.ec,2),\"%n\":()=>\"\\n\",\"%p\":e=>0<=e.Gb&&12>e.Gb?\"AM\":\"PM\",\"%S\":e=>o(e.fc,2),\"%t\":()=>\"\\t\",\"%u\":e=>e.ub||7,\"%U\":e=>o(Math.floor((e.Bb+7-e.ub)/7),2),\"%V\":e=>{var r=Math.floor((e.Bb+7-(e.ub+6)%7)/7);if(2>=(e.ub+371-e.Bb-2)%7&&r++,r)53==r&&(4==(t=(e.ub+371-e.Bb)%7)||3==t&&Ot(e.Cb)||(r=1));else{r=52;var t=(e.ub+7-e.Bb-1)%7;(4==t||5==t&&Ot(e.Cb%400-1))&&r++}return o(r,2)},\"%w\":e=>e.ub,\"%W\":e=>o(Math.floor((e.Bb+7-(e.ub+6)%7)/7),2),\"%y\":e=>(e.Cb+1900).toString().substring(2),\"%Y\":e=>e.Cb+1900,\"%z\":e=>{var r=0<=(e=e.dc);return e=Math.abs(e)/60,(r?\"+\":\"-\")+String(\"0000\"+(e/60*100+e%60)).slice(-4)},\"%Z\":e=>e.hc,\"%%\":()=>\"%\"},t=t.replace(/%%/g,\"\\0\\0\"),c)t.includes(d)&&(t=t.replace(new RegExp(d,\"g\"),c[d](n)));return d=function(e){var r=Array(Fe(e)+1);return Pe(e,r,0,r.length),r}(t=t.replace(/\\0\\0/g,\"%\")),d.length>r?0:(fn(d,e),d.length-1)}function cn(e,r,t,n){return ln(e>>>0,r>>>0,t>>>0,n>>>0)}h||function(){for(var e=d.numThreads-1;e--;)Oe();z.unshift((()=>{J++,function(e){h?e():Promise.all(ge.map(Ce)).then(e)}((()=>Q()))}))}();for(var dn=Array(256),bn=0;256>bn;++bn)dn[bn]=String.fromCharCode(bn);Ke=dn,Qe=d.BindingError=class extends Error{constructor(e){super(e),this.name=\"BindingError\"}},d.InternalError=class extends Error{constructor(e){super(e),this.name=\"InternalError\"}},lr.push(0,1,void 0,1,null,1,!0,1,!1,1),d.count_emval_handles=()=>lr.length/2-5-fr.length;var mn=[me,pe,Me,He,De,Ie,Ue,Ge,$e,Ye,Le,ze,Ve,qe,Je,Xe,Et,Mt,Zt,en,rn,tn,nn,on],pn=function(){function e(e,r){return pn=e.exports,pn=function(){var e=pn,r={};for(let[t,n]of Object.entries(e))r[t]=\"function\"==typeof n?(...e)=>{qr.push(t);try{return n(...e)}finally{Y||(qr.pop(),zr&&1===Lr&&0===qr.length&&(Lr=0,de+=1,Yr(Rn),\"undefined\"!=typeof Fibers&&Fibers.oc()))}}:n;return r}(),pn=function(){var e=pn,r=e=>r=>e(r)>>>0,t=e=>()=>e()>>>0;return(e=Object.assign({},e)).Ca=r(e.Ca),e.fb=t(e.fb),e.gb=r(e.gb),e.emscripten_main_runtime_thread_id=t(e.emscripten_main_runtime_thread_id),e.sb=r(e.sb),e.tb=t(e.tb),e}(),ye.push(pn.ib),V.unshift(pn.Ba),N=r,Q(),pn}var r=oe();if(J++,d.instantiateWasm)try{return d.instantiateWasm(r,e)}catch(e){W(`Module.instantiateWasm callback failed with error: ${e}`),c(e)}return ee||=d.locateFile?re(\"ort-wasm-simd-threaded.jsep.wasm\")?\"ort-wasm-simd-threaded.jsep.wasm\":d.locateFile?d.locateFile(\"ort-wasm-simd-threaded.jsep.wasm\",O):O+\"ort-wasm-simd-threaded.jsep.wasm\":new URL(\"ort-wasm-simd-threaded.jsep.wasm\",import.meta.url).href,function(e,r){var t=ee;return\"function\"!=typeof WebAssembly.instantiateStreaming||re(t)||te(t)||\"function\"!=typeof fetch?ae(t,e,r):fetch(t,{credentials:\"same-origin\"}).then((n=>WebAssembly.instantiateStreaming(n,e).then(r,(function(n){return W(`wasm streaming compile failed: ${n}`),W(\"falling back to ArrayBuffer instantiation\"),ae(t,e,r)}))))}(r,(function(r){e(r.instance,r.module)})).catch(c),{}}(),hn=e=>(hn=pn.Ca)(e),gn=()=>(gn=pn.Da)();d._OrtInit=(e,r)=>(d._OrtInit=pn.Ea)(e,r),d._OrtGetLastError=(e,r)=>(d._OrtGetLastError=pn.Fa)(e,r),d._OrtCreateSessionOptions=(e,r,t,n,a,o,i,s,u,f)=>(d._OrtCreateSessionOptions=pn.Ga)(e,r,t,n,a,o,i,s,u,f),d._OrtAppendExecutionProvider=(e,r)=>(d._OrtAppendExecutionProvider=pn.Ha)(e,r),d._OrtAddFreeDimensionOverride=(e,r,t)=>(d._OrtAddFreeDimensionOverride=pn.Ia)(e,r,t),d._OrtAddSessionConfigEntry=(e,r,t)=>(d._OrtAddSessionConfigEntry=pn.Ja)(e,r,t),d._OrtReleaseSessionOptions=e=>(d._OrtReleaseSessionOptions=pn.Ka)(e),d._OrtCreateSession=(e,r,t)=>(d._OrtCreateSession=pn.La)(e,r,t),d._OrtReleaseSession=e=>(d._OrtReleaseSession=pn.Ma)(e),d._OrtGetInputOutputCount=(e,r,t)=>(d._OrtGetInputOutputCount=pn.Na)(e,r,t),d._OrtGetInputName=(e,r)=>(d._OrtGetInputName=pn.Oa)(e,r),d._OrtGetOutputName=(e,r)=>(d._OrtGetOutputName=pn.Pa)(e,r),d._OrtFree=e=>(d._OrtFree=pn.Qa)(e),d._OrtCreateTensor=(e,r,t,n,a,o)=>(d._OrtCreateTensor=pn.Ra)(e,r,t,n,a,o),d._OrtGetTensorData=(e,r,t,n,a)=>(d._OrtGetTensorData=pn.Sa)(e,r,t,n,a),d._OrtReleaseTensor=e=>(d._OrtReleaseTensor=pn.Ta)(e),d._OrtCreateRunOptions=(e,r,t,n)=>(d._OrtCreateRunOptions=pn.Ua)(e,r,t,n),d._OrtAddRunConfigEntry=(e,r,t)=>(d._OrtAddRunConfigEntry=pn.Va)(e,r,t),d._OrtReleaseRunOptions=e=>(d._OrtReleaseRunOptions=pn.Wa)(e),d._OrtCreateBinding=e=>(d._OrtCreateBinding=pn.Xa)(e),d._OrtBindInput=(e,r,t)=>(d._OrtBindInput=pn.Ya)(e,r,t),d._OrtBindOutput=(e,r,t,n)=>(d._OrtBindOutput=pn.Za)(e,r,t,n),d._OrtClearBoundOutputs=e=>(d._OrtClearBoundOutputs=pn._a)(e),d._OrtReleaseBinding=e=>(d._OrtReleaseBinding=pn.$a)(e),d._OrtRunWithBinding=(e,r,t,n,a)=>(d._OrtRunWithBinding=pn.ab)(e,r,t,n,a),d._OrtRun=(e,r,t,n,a,o,i,s)=>(d._OrtRun=pn.bb)(e,r,t,n,a,o,i,s),d._OrtEndProfiling=e=>(d._OrtEndProfiling=pn.cb)(e),d._JsepOutput=(e,r,t)=>(d._JsepOutput=pn.db)(e,r,t),d._JsepGetNodeName=e=>(d._JsepGetNodeName=pn.eb)(e);var vn,yn=()=>(yn=pn.fb)(),wn=d._malloc=e=>(wn=d._malloc=pn.gb)(e),An=d._free=e=>(An=d._free=pn.hb)(e),_n=(e,r,t,n,a,o)=>(_n=pn.kb)(e,r,t,n,a,o),Cn=()=>(Cn=pn.lb)(),On=(e,r,t,n,a)=>(On=pn.mb)(e,r,t,n,a),jn=e=>(jn=pn.nb)(e),Tn=e=>(Tn=pn.ob)(e),Sn=()=>(Sn=pn.pb)(),Wn=(e,r)=>(Wn=pn.qb)(e,r),En=e=>(En=pn.rb)(e),Mn=e=>(Mn=pn.sb)(e),xn=()=>(xn=pn.tb)(),Nn=d.dynCall_ii=(e,r)=>(Nn=d.dynCall_ii=pn.vb)(e,r),kn=e=>(kn=pn.wb)(e),Rn=()=>(Rn=pn.xb)(),Hn=e=>(Hn=pn.yb)(e),Dn=()=>(Dn=pn.zb)();function Fn(){if(!(0xn(),d.stackRestore=e=>En(e),d.stackAlloc=e=>Mn(e),d.UTF8ToString=Re,d.stringToUTF8=Be,d.lengthBytesUTF8=Fe,K=function e(){vn||Fn(),vn||(K=e)},Fn(),b});export default r;\"em-pthread\"===globalThis.self?.name&&r();", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport type {OrtWasmModule} from './wasm-types';\nimport {isNode} from './wasm-utils-env';\n\n/**\n * The classic script source URL. This is not always available in non ESModule environments.\n *\n * In Node.js, this is undefined.\n */\nexport const scriptSrc =\n // if Nodejs, return undefined\n isNode ? undefined :\n // if It's ESM, use import.meta.url\n BUILD_DEFS.ESM_IMPORT_META_URL ??\n // use `document.currentScript.src` if available\n (typeof document !== 'undefined' ? (document.currentScript as HTMLScriptElement)?.src :\n // use `self.location.href` if available\n (typeof self !== 'undefined' ? self.location?.href : undefined));\n\n/**\n * The origin of the current location.\n *\n * In Node.js, this is undefined.\n */\nconst origin = isNode || typeof location === 'undefined' ? undefined : location.origin;\n\n/**\n * Check if the given filename with prefix is from the same origin.\n */\nconst isSameOrigin = (filename: string, prefixOverride?: string) => {\n try {\n const baseUrl = prefixOverride ?? scriptSrc;\n const url = baseUrl ? new URL(filename, baseUrl) : new URL(filename);\n return url.origin === origin;\n } catch {\n return false;\n }\n};\n\n/**\n * Normalize the inputs to an absolute URL with the given prefix override. If failed, return undefined.\n */\nconst normalizeUrl = (filename: string, prefixOverride?: string) => {\n const baseUrl = prefixOverride ?? scriptSrc;\n try {\n const url = baseUrl ? new URL(filename, baseUrl) : new URL(filename);\n return url.href;\n } catch {\n return undefined;\n }\n};\n\n/**\n * Create a fallback URL if an absolute URL cannot be created by the normalizeUrl function.\n */\nconst fallbackUrl = (filename: string, prefixOverride?: string) => `${prefixOverride ?? './'}${filename}`;\n\n/**\n * This helper function is used to preload a module from a URL.\n *\n * If the origin of the worker URL is different from the current origin, the worker cannot be loaded directly.\n * See discussions in https://github.com/webpack-contrib/worker-loader/issues/154\n *\n * In this case, we will fetch the worker URL and create a new Blob URL with the same origin as a workaround.\n *\n * @param absoluteUrl - The absolute URL to preload.\n *\n * @returns - A promise that resolves to a new Blob URL\n */\nconst preload = async(absoluteUrl: string): Promise => {\n const response = await fetch(absoluteUrl, {credentials: 'same-origin'});\n const blob = await response.blob();\n return URL.createObjectURL(blob);\n};\n\n/**\n * This helper function is used to dynamically import a module from a URL.\n *\n * The build script has special handling for this function to ensure that the URL is not bundled into the final output.\n *\n * @param url - The URL to import.\n *\n * @returns - A promise that resolves to the default export of the module.\n */\nconst dynamicImportDefault = async(url: string): Promise => (await import(/* webpackIgnore: true */ url)).default;\n\n/**\n * The proxy worker factory imported from the proxy worker module.\n *\n * This is only available when the WebAssembly proxy is not disabled.\n */\nconst createProxyWorker: ((urlOverride?: string) => Worker)|undefined =\n // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires\n BUILD_DEFS.DISABLE_WASM_PROXY ? undefined : require('./proxy-worker/main').default;\n\n/**\n * Import the proxy worker.\n *\n * This function will perform the following steps:\n * 1. If a preload is needed, it will preload the module and return the object URL.\n * 2. Use the proxy worker factory to create the proxy worker.\n *\n * @returns - A promise that resolves to a tuple of 2 elements:\n * - The object URL of the preloaded module, or undefined if no preload is needed.\n * - The proxy worker.\n */\nexport const importProxyWorker = async(): Promise<[undefined | string, Worker]> => {\n if (!scriptSrc) {\n throw new Error('Failed to load proxy worker: cannot determine the script source URL.');\n }\n\n // If the script source is from the same origin, we can use the embedded proxy module directly.\n if (isSameOrigin(scriptSrc)) {\n return [undefined, createProxyWorker!()];\n }\n\n // Otherwise, need to preload\n const url = await preload(scriptSrc);\n return [url, createProxyWorker!(url)];\n};\n\n/**\n * The embedded WebAssembly module.\n *\n * This is only available in ESM and when embedding is not disabled.\n */\nconst embeddedWasmModule: EmscriptenModuleFactory|undefined =\n BUILD_DEFS.IS_ESM && BUILD_DEFS.DISABLE_DYNAMIC_IMPORT ?\n // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires\n require(\n !BUILD_DEFS.DISABLE_TRAINING ? '../../dist/ort-training-wasm-simd-threaded.mjs' :\n !BUILD_DEFS.DISABLE_JSEP ? '../../dist/ort-wasm-simd-threaded.jsep.mjs' :\n '../../dist/ort-wasm-simd-threaded.mjs')\n .default :\n undefined;\n\n/**\n * Import the WebAssembly module.\n *\n * This function will perform the following steps:\n * 1. If BUILD_DEFS.DISABLE_DYNAMIC_IMPORT is true, use the embedded module.\n * 2. If a preload is needed, it will preload the module and return the object URL.\n * 3. Otherwise, it will perform a dynamic import of the module.\n *\n * @returns - A promise that resolves to a tuple of 2 elements:\n * - The object URL of the preloaded module, or undefined if no preload is needed.\n * - The default export of the module, which is a factory function to create the WebAssembly module.\n */\nexport const importWasmModule = async(\n urlOverride: string|undefined, prefixOverride: string|undefined,\n isMultiThreaded: boolean): Promise<[undefined | string, EmscriptenModuleFactory]> => {\n if (BUILD_DEFS.DISABLE_DYNAMIC_IMPORT) {\n return [undefined, embeddedWasmModule!];\n } else {\n const wasmModuleFilename = !BUILD_DEFS.DISABLE_TRAINING ? 'ort-training-wasm-simd-threaded.mjs' :\n !BUILD_DEFS.DISABLE_JSEP ? 'ort-wasm-simd-threaded.jsep.mjs' :\n 'ort-wasm-simd-threaded.mjs';\n const wasmModuleUrl = urlOverride ?? normalizeUrl(wasmModuleFilename, prefixOverride);\n // need to preload if all of the following conditions are met:\n // 1. not in Node.js.\n // - Node.js does not have the same origin policy for creating workers.\n // 2. multi-threaded is enabled.\n // - If multi-threaded is disabled, no worker will be created. So we don't need to preload the module.\n // 3. the absolute URL is available.\n // - If the absolute URL is failed to be created, the origin cannot be determined. In this case, we will not\n // preload the module.\n // 4. the worker URL is not from the same origin.\n // - If the worker URL is from the same origin, we can create the worker directly.\n const needPreload = !isNode && isMultiThreaded && wasmModuleUrl && !isSameOrigin(wasmModuleUrl, prefixOverride);\n const url = needPreload ? (await preload(wasmModuleUrl)) :\n (wasmModuleUrl ?? fallbackUrl(wasmModuleFilename, prefixOverride));\n return [needPreload ? url : undefined, await dynamicImportDefault>(url)];\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from 'onnxruntime-common';\n\nimport type {OrtWasmModule} from './wasm-types';\nimport {importWasmModule} from './wasm-utils-import';\n\nlet wasm: OrtWasmModule|undefined;\nlet initialized = false;\nlet initializing = false;\nlet aborted = false;\n\nconst isMultiThreadSupported = (): boolean => {\n // If 'SharedArrayBuffer' is not available, WebAssembly threads will not work.\n if (typeof SharedArrayBuffer === 'undefined') {\n return false;\n }\n\n try {\n // Test for transferability of SABs (for browsers. needed for Firefox)\n // https://groups.google.com/forum/#!msg/mozilla.dev.platform/IHkBZlHETpA/dwsMNchWEQAJ\n if (typeof MessageChannel !== 'undefined') {\n new MessageChannel().port1.postMessage(new SharedArrayBuffer(1));\n }\n\n // Test for WebAssembly threads capability (for both browsers and Node.js)\n // This typed array is a WebAssembly program containing threaded instructions.\n return WebAssembly.validate(new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 5,\n 4, 1, 3, 1, 1, 10, 11, 1, 9, 0, 65, 0, 254, 16, 2, 0, 26, 11\n ]));\n } catch (e) {\n return false;\n }\n};\n\nconst isSimdSupported = (): boolean => {\n try {\n // Test for WebAssembly SIMD capability (for both browsers and Node.js)\n // This typed array is a WebAssembly program containing SIMD instructions.\n\n // The binary data is generated from the following code by wat2wasm:\n //\n // (module\n // (type $t0 (func))\n // (func $f0 (type $t0)\n // (drop\n // (i32x4.dot_i16x8_s\n // (i8x16.splat\n // (i32.const 0))\n // (v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000)))))\n\n return WebAssembly.validate(new Uint8Array([\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 4, 1, 96, 0, 0, 3, 2, 1, 0, 10, 30, 1, 28, 0, 65, 0,\n 253, 15, 253, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 186, 1, 26, 11\n ]));\n } catch (e) {\n return false;\n }\n};\n\nexport const initializeWebAssembly = async(flags: Env.WebAssemblyFlags): Promise => {\n if (initialized) {\n return Promise.resolve();\n }\n if (initializing) {\n throw new Error('multiple calls to \\'initializeWebAssembly()\\' detected.');\n }\n if (aborted) {\n throw new Error('previous call to \\'initializeWebAssembly()\\' failed.');\n }\n\n initializing = true;\n\n // wasm flags are already initialized\n const timeout = flags.initTimeout!;\n let numThreads = flags.numThreads!;\n\n // ensure SIMD is supported\n if (!isSimdSupported()) {\n throw new Error('WebAssembly SIMD is not supported in the current environment.');\n }\n\n // check if multi-threading is supported\n const multiThreadSupported = isMultiThreadSupported();\n if (numThreads > 1 && !multiThreadSupported) {\n if (typeof self !== 'undefined' && !self.crossOriginIsolated) {\n // eslint-disable-next-line no-console\n console.warn(\n 'env.wasm.numThreads is set to ' + numThreads +\n ', but this will not work unless you enable crossOriginIsolated mode. ' +\n 'See https://web.dev/cross-origin-isolation-guide/ for more info.');\n }\n\n // eslint-disable-next-line no-console\n console.warn(\n 'WebAssembly multi-threading is not supported in the current environment. ' +\n 'Falling back to single-threading.');\n\n // set flags.numThreads to 1 so that OrtInit() will not create a global thread pool.\n flags.numThreads = numThreads = 1;\n }\n\n const wasmPaths = flags.wasmPaths;\n const wasmPrefixOverride = typeof wasmPaths === 'string' ? wasmPaths : undefined;\n const mjsPathOverrideFlag = (wasmPaths as Env.WasmFilePaths)?.mjs;\n const mjsPathOverride = (mjsPathOverrideFlag as URL)?.href ?? mjsPathOverrideFlag;\n const wasmPathOverrideFlag = (wasmPaths as Env.WasmFilePaths)?.wasm;\n const wasmPathOverride = (wasmPathOverrideFlag as URL)?.href ?? wasmPathOverrideFlag;\n\n const [objectUrl, ortWasmFactory] = (await importWasmModule(mjsPathOverride, wasmPrefixOverride, numThreads > 1));\n\n let isTimeout = false;\n\n const tasks: Array> = [];\n\n // promise for timeout\n if (timeout > 0) {\n tasks.push(new Promise((resolve) => {\n setTimeout(() => {\n isTimeout = true;\n resolve();\n }, timeout);\n }));\n }\n\n // promise for module initialization\n tasks.push(new Promise((resolve, reject) => {\n const config: Partial = {\n /**\n * The number of threads. WebAssembly will create (Module.numThreads - 1) workers. If it is 1, no worker will be\n * created.\n */\n numThreads,\n };\n\n if (wasmPathOverride || wasmPrefixOverride) {\n /**\n * A callback function to locate the WebAssembly file. The function should return the full path of the file.\n *\n * Since Emscripten 3.1.58, this function is only called for the .wasm file.\n */\n config.locateFile = (fileName, scriptDirectory) =>\n wasmPathOverride ?? (wasmPrefixOverride ?? scriptDirectory) + fileName;\n }\n\n ortWasmFactory(config).then(\n // wasm module initialized successfully\n module => {\n initializing = false;\n initialized = true;\n wasm = module;\n resolve();\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n }\n },\n // wasm module failed to initialize\n (what) => {\n initializing = false;\n aborted = true;\n reject(what);\n });\n }));\n\n await Promise.race(tasks);\n\n if (isTimeout) {\n throw new Error(`WebAssembly backend initializing failed due to timeout: ${timeout}ms`);\n }\n};\n\nexport const getInstance = (): OrtWasmModule => {\n if (initialized && wasm) {\n return wasm;\n }\n\n throw new Error('WebAssembly is not initialized yet.');\n};\n\nexport const dispose = (): void => {\n if (initialized && !initializing && !aborted) {\n // TODO: currently \"PThread.terminateAllThreads()\" is not exposed in the wasm module.\n // And this function is not yet called by any code.\n // If it is needed in the future, we should expose it in the wasm module and uncomment the following line.\n\n // wasm?.PThread?.terminateAllThreads();\n wasm = undefined;\n\n initializing = false;\n initialized = false;\n aborted = true;\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {getInstance} from './wasm-factory';\n\nexport const allocWasmString = (data: string, allocs: number[]): number => {\n const wasm = getInstance();\n\n const dataLength = wasm.lengthBytesUTF8(data) + 1;\n const dataOffset = wasm._malloc(dataLength);\n wasm.stringToUTF8(data, dataOffset, dataLength);\n allocs.push(dataOffset);\n\n return dataOffset;\n};\n\ninterface ExtraOptionsHandler {\n (name: string, value: string): void;\n}\n\nexport const iterateExtraOptions =\n (options: Record, prefix: string, seen: WeakSet>,\n handler: ExtraOptionsHandler): void => {\n if (typeof options == 'object' && options !== null) {\n if (seen.has(options)) {\n throw new Error('Circular reference in options');\n } else {\n seen.add(options);\n }\n }\n\n Object.entries(options).forEach(([key, value]) => {\n const name = (prefix) ? prefix + key : key;\n if (typeof value === 'object') {\n iterateExtraOptions(value as Record, name + '.', seen, handler);\n } else if (typeof value === 'string' || typeof value === 'number') {\n handler(name, value.toString());\n } else if (typeof value === 'boolean') {\n handler(name, (value) ? '1' : '0');\n } else {\n throw new Error(`Can't handle extra config type: ${typeof value}`);\n }\n });\n };\n\n/**\n * check web assembly API's last error and throw error if any error occurred.\n * @param message a message used when an error occurred.\n */\nexport const checkLastError = (message: string): void => {\n const wasm = getInstance();\n\n const stack = wasm.stackSave();\n try {\n const paramsOffset = wasm.stackAlloc(8);\n wasm._OrtGetLastError(paramsOffset, paramsOffset + 4);\n const errorCode = wasm.HEAP32[paramsOffset / 4];\n const errorMessagePointer = wasm.HEAPU32[paramsOffset / 4 + 1];\n const errorMessage = errorMessagePointer ? wasm.UTF8ToString(errorMessagePointer) : '';\n throw new Error(`${message} ERROR_CODE: ${errorCode}, ERROR_MESSAGE: ${errorMessage}`);\n } finally {\n wasm.stackRestore(stack);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession} from 'onnxruntime-common';\n\nimport {getInstance} from './wasm-factory';\nimport {allocWasmString, checkLastError, iterateExtraOptions} from './wasm-utils';\n\nexport const setRunOptions = (options: InferenceSession.RunOptions): [number, number[]] => {\n const wasm = getInstance();\n let runOptionsHandle = 0;\n const allocs: number[] = [];\n\n const runOptions: InferenceSession.RunOptions = options || {};\n\n try {\n if (options?.logSeverityLevel === undefined) {\n runOptions.logSeverityLevel = 2; // Default to warning\n } else if (\n typeof options.logSeverityLevel !== 'number' || !Number.isInteger(options.logSeverityLevel) ||\n options.logSeverityLevel < 0 || options.logSeverityLevel > 4) {\n throw new Error(`log serverity level is not valid: ${options.logSeverityLevel}`);\n }\n\n if (options?.logVerbosityLevel === undefined) {\n runOptions.logVerbosityLevel = 0; // Default to 0\n } else if (typeof options.logVerbosityLevel !== 'number' || !Number.isInteger(options.logVerbosityLevel)) {\n throw new Error(`log verbosity level is not valid: ${options.logVerbosityLevel}`);\n }\n\n if (options?.terminate === undefined) {\n runOptions.terminate = false;\n }\n\n let tagDataOffset = 0;\n if (options?.tag !== undefined) {\n tagDataOffset = allocWasmString(options.tag, allocs);\n }\n\n runOptionsHandle = wasm._OrtCreateRunOptions(\n runOptions.logSeverityLevel!, runOptions.logVerbosityLevel!, !!runOptions.terminate!, tagDataOffset);\n if (runOptionsHandle === 0) {\n checkLastError('Can\\'t create run options.');\n }\n\n if (options?.extra !== undefined) {\n iterateExtraOptions(options.extra, '', new WeakSet>(), (key, value) => {\n const keyDataOffset = allocWasmString(key, allocs);\n const valueDataOffset = allocWasmString(value, allocs);\n\n if (wasm._OrtAddRunConfigEntry(runOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n checkLastError(`Can't set a run config entry: ${key} - ${value}.`);\n }\n });\n }\n\n return [runOptionsHandle, allocs];\n } catch (e) {\n if (runOptionsHandle !== 0) {\n wasm._OrtReleaseRunOptions(runOptionsHandle);\n }\n allocs.forEach(alloc => wasm._free(alloc));\n throw e;\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession} from 'onnxruntime-common';\n\nimport {getInstance} from './wasm-factory';\nimport {allocWasmString, checkLastError, iterateExtraOptions} from './wasm-utils';\n\nconst getGraphOptimzationLevel = (graphOptimizationLevel: string|unknown): number => {\n switch (graphOptimizationLevel) {\n case 'disabled':\n return 0;\n case 'basic':\n return 1;\n case 'extended':\n return 2;\n case 'all':\n return 99;\n default:\n throw new Error(`unsupported graph optimization level: ${graphOptimizationLevel}`);\n }\n};\n\nconst getExecutionMode = (executionMode: 'sequential'|'parallel'): number => {\n switch (executionMode) {\n case 'sequential':\n return 0;\n case 'parallel':\n return 1;\n default:\n throw new Error(`unsupported execution mode: ${executionMode}`);\n }\n};\n\nconst appendDefaultOptions = (options: InferenceSession.SessionOptions): void => {\n if (!options.extra) {\n options.extra = {};\n }\n if (!options.extra.session) {\n options.extra.session = {};\n }\n const session = options.extra.session as Record;\n if (!session.use_ort_model_bytes_directly) {\n // eslint-disable-next-line camelcase\n session.use_ort_model_bytes_directly = '1';\n }\n\n // if using JSEP with WebGPU, always disable memory pattern\n if (options.executionProviders &&\n options.executionProviders.some(ep => (typeof ep === 'string' ? ep : ep.name) === 'webgpu')) {\n options.enableMemPattern = false;\n }\n};\n\nconst setExecutionProviders =\n (sessionOptionsHandle: number, executionProviders: readonly InferenceSession.ExecutionProviderConfig[],\n allocs: number[]): void => {\n for (const ep of executionProviders) {\n let epName = typeof ep === 'string' ? ep : ep.name;\n\n // check EP name\n switch (epName) {\n case 'webnn':\n epName = 'WEBNN';\n if (typeof ep !== 'string') {\n const webnnOptions = ep as InferenceSession.WebNNExecutionProviderOption;\n // const context = (webnnOptions as InferenceSession.WebNNOptionsWithMLContext)?.context;\n const deviceType = (webnnOptions as InferenceSession.WebNNContextOptions)?.deviceType;\n if (deviceType) {\n const keyDataOffset = allocWasmString('deviceType', allocs);\n const valueDataOffset = allocWasmString(deviceType, allocs);\n if (getInstance()._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !==\n 0) {\n checkLastError(`Can't set a session config entry: 'deviceType' - ${deviceType}.`);\n }\n }\n }\n break;\n case 'webgpu':\n epName = 'JS';\n if (typeof ep !== 'string') {\n const webgpuOptions = ep as InferenceSession.WebGpuExecutionProviderOption;\n if (webgpuOptions?.preferredLayout) {\n if (webgpuOptions.preferredLayout !== 'NCHW' && webgpuOptions.preferredLayout !== 'NHWC') {\n throw new Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${webgpuOptions.preferredLayout}`);\n }\n const keyDataOffset = allocWasmString('preferredLayout', allocs);\n const valueDataOffset = allocWasmString(webgpuOptions.preferredLayout, allocs);\n if (getInstance()._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !==\n 0) {\n checkLastError(\n `Can't set a session config entry: 'preferredLayout' - ${webgpuOptions.preferredLayout}.`);\n }\n }\n }\n break;\n case 'wasm':\n case 'cpu':\n continue;\n default:\n throw new Error(`not supported execution provider: ${epName}`);\n }\n\n const epNameDataOffset = allocWasmString(epName, allocs);\n if (getInstance()._OrtAppendExecutionProvider(sessionOptionsHandle, epNameDataOffset) !== 0) {\n checkLastError(`Can't append execution provider: ${epName}.`);\n }\n }\n };\n\nexport const setSessionOptions = (options?: InferenceSession.SessionOptions): [number, number[]] => {\n const wasm = getInstance();\n let sessionOptionsHandle = 0;\n const allocs: number[] = [];\n\n const sessionOptions: InferenceSession.SessionOptions = options || {};\n appendDefaultOptions(sessionOptions);\n\n try {\n const graphOptimizationLevel = getGraphOptimzationLevel(sessionOptions.graphOptimizationLevel ?? 'all');\n const executionMode = getExecutionMode(sessionOptions.executionMode ?? 'sequential');\n const logIdDataOffset =\n typeof sessionOptions.logId === 'string' ? allocWasmString(sessionOptions.logId, allocs) : 0;\n\n const logSeverityLevel = sessionOptions.logSeverityLevel ?? 2; // Default to 2 - warning\n if (!Number.isInteger(logSeverityLevel) || logSeverityLevel < 0 || logSeverityLevel > 4) {\n throw new Error(`log serverity level is not valid: ${logSeverityLevel}`);\n }\n\n const logVerbosityLevel = sessionOptions.logVerbosityLevel ?? 0; // Default to 0 - verbose\n if (!Number.isInteger(logVerbosityLevel) || logVerbosityLevel < 0 || logVerbosityLevel > 4) {\n throw new Error(`log verbosity level is not valid: ${logVerbosityLevel}`);\n }\n\n const optimizedModelFilePathOffset = typeof sessionOptions.optimizedModelFilePath === 'string' ?\n allocWasmString(sessionOptions.optimizedModelFilePath, allocs) :\n 0;\n\n sessionOptionsHandle = wasm._OrtCreateSessionOptions(\n graphOptimizationLevel, !!sessionOptions.enableCpuMemArena, !!sessionOptions.enableMemPattern, executionMode,\n !!sessionOptions.enableProfiling, 0, logIdDataOffset, logSeverityLevel, logVerbosityLevel,\n optimizedModelFilePathOffset);\n if (sessionOptionsHandle === 0) {\n checkLastError('Can\\'t create session options.');\n }\n\n if (sessionOptions.executionProviders) {\n setExecutionProviders(sessionOptionsHandle, sessionOptions.executionProviders, allocs);\n }\n\n if (sessionOptions.enableGraphCapture !== undefined) {\n if (typeof sessionOptions.enableGraphCapture !== 'boolean') {\n throw new Error(`enableGraphCapture must be a boolean value: ${sessionOptions.enableGraphCapture}`);\n }\n const keyDataOffset = allocWasmString('enableGraphCapture', allocs);\n const valueDataOffset = allocWasmString(sessionOptions.enableGraphCapture.toString(), allocs);\n if (wasm._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n checkLastError(\n `Can't set a session config entry: 'enableGraphCapture' - ${sessionOptions.enableGraphCapture}.`);\n }\n }\n\n if (sessionOptions.freeDimensionOverrides) {\n for (const [name, value] of Object.entries(sessionOptions.freeDimensionOverrides)) {\n if (typeof name !== 'string') {\n throw new Error(`free dimension override name must be a string: ${name}`);\n }\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {\n throw new Error(`free dimension override value must be a non-negative integer: ${value}`);\n }\n const nameOffset = allocWasmString(name, allocs);\n if (wasm._OrtAddFreeDimensionOverride(sessionOptionsHandle, nameOffset, value) !== 0) {\n checkLastError(`Can't set a free dimension override: ${name} - ${value}.`);\n }\n }\n }\n\n if (sessionOptions.extra !== undefined) {\n iterateExtraOptions(sessionOptions.extra, '', new WeakSet>(), (key, value) => {\n const keyDataOffset = allocWasmString(key, allocs);\n const valueDataOffset = allocWasmString(value, allocs);\n\n if (wasm._OrtAddSessionConfigEntry(sessionOptionsHandle, keyDataOffset, valueDataOffset) !== 0) {\n checkLastError(`Can't set a session config entry: ${key} - ${value}.`);\n }\n });\n }\n\n return [sessionOptionsHandle, allocs];\n } catch (e) {\n if (sessionOptionsHandle !== 0) {\n wasm._OrtReleaseSessionOptions(sessionOptionsHandle);\n }\n allocs.forEach(alloc => wasm._free(alloc));\n throw e;\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from 'onnxruntime-common';\n\n// a dummy type declaration for Float16Array in case any polyfill is available.\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-explicit-any\n const Float16Array: any;\n}\n\n// This file includes common definitions. They do NOT have dependency on the WebAssembly instance.\n\n/**\n * Copied from ONNX definition. Use this to drop dependency 'onnx_proto' to decrease compiled .js file size.\n */\nexport const enum DataType {\n undefined = 0,\n float = 1,\n uint8 = 2,\n int8 = 3,\n uint16 = 4,\n int16 = 5,\n int32 = 6,\n int64 = 7,\n string = 8,\n bool = 9,\n float16 = 10,\n double = 11,\n uint32 = 12,\n uint64 = 13,\n complex64 = 14,\n complex128 = 15,\n bfloat16 = 16\n}\n\n/**\n * Map string tensor data to enum value\n */\nexport const tensorDataTypeStringToEnum = (type: string): DataType => {\n switch (type) {\n case 'int8':\n return DataType.int8;\n case 'uint8':\n return DataType.uint8;\n case 'bool':\n return DataType.bool;\n case 'int16':\n return DataType.int16;\n case 'uint16':\n return DataType.uint16;\n case 'int32':\n return DataType.int32;\n case 'uint32':\n return DataType.uint32;\n case 'float16':\n return DataType.float16;\n case 'float32':\n return DataType.float;\n case 'float64':\n return DataType.double;\n case 'string':\n return DataType.string;\n case 'int64':\n return DataType.int64;\n case 'uint64':\n return DataType.uint64;\n\n default:\n throw new Error(`unsupported data type: ${type}`);\n }\n};\n\n/**\n * Map enum value to string tensor data\n */\nexport const tensorDataTypeEnumToString = (typeProto: DataType): Tensor.Type => {\n switch (typeProto) {\n case DataType.int8:\n return 'int8';\n case DataType.uint8:\n return 'uint8';\n case DataType.bool:\n return 'bool';\n case DataType.int16:\n return 'int16';\n case DataType.uint16:\n return 'uint16';\n case DataType.int32:\n return 'int32';\n case DataType.uint32:\n return 'uint32';\n case DataType.float16:\n return 'float16';\n case DataType.float:\n return 'float32';\n case DataType.double:\n return 'float64';\n case DataType.string:\n return 'string';\n case DataType.int64:\n return 'int64';\n case DataType.uint64:\n return 'uint64';\n\n default:\n throw new Error(`unsupported data type: ${typeProto}`);\n }\n};\n\n/**\n * get tensor element size in bytes by the given data type\n * @returns size in integer or undefined if the data type is not supported\n */\nexport const getTensorElementSize = (dateType: number): number|\n undefined => [undefined, 4, 1, 1, 2, 2, 4, 8, undefined, 1, 2, 8, 4, 8, undefined, undefined, undefined][dateType];\n\n/**\n * get typed array constructor by the given tensor type\n */\nexport const tensorTypeToTypedArrayConstructor = (type: Tensor.Type): Float32ArrayConstructor|Uint8ArrayConstructor|\n Int8ArrayConstructor|Uint16ArrayConstructor|Int16ArrayConstructor|Int32ArrayConstructor|BigInt64ArrayConstructor|\n Uint8ArrayConstructor|Float64ArrayConstructor|Uint32ArrayConstructor|BigUint64ArrayConstructor => {\n switch (type) {\n case 'float16':\n // allow Float16Array polyfill.\n return typeof Float16Array !== 'undefined' && Float16Array.from ? Float16Array : Uint16Array;\n case 'float32':\n return Float32Array;\n case 'uint8':\n return Uint8Array;\n case 'int8':\n return Int8Array;\n case 'uint16':\n return Uint16Array;\n case 'int16':\n return Int16Array;\n case 'int32':\n return Int32Array;\n case 'bool':\n return Uint8Array;\n case 'float64':\n return Float64Array;\n case 'uint32':\n return Uint32Array;\n case 'int64':\n return BigInt64Array;\n case 'uint64':\n return BigUint64Array;\n default:\n throw new Error(`unsupported type: ${type}`);\n }\n };\n\n/**\n * Map string log level to integer value\n */\nexport const logLevelStringToEnum = (logLevel?: 'verbose'|'info'|'warning'|'error'|'fatal'): number => {\n switch (logLevel) {\n case 'verbose':\n return 0;\n case 'info':\n return 1;\n case 'warning':\n return 2;\n case 'error':\n return 3;\n case 'fatal':\n return 4;\n default:\n throw new Error(`unsupported logging level: ${logLevel}`);\n }\n};\n\n/**\n * Check whether the given tensor type is supported by GPU buffer\n */\nexport const isGpuBufferSupportedType = (type: Tensor.Type): type is Tensor.GpuBufferDataTypes => type === 'float32' ||\n type === 'float16' || type === 'int32' || type === 'int64' || type === 'uint32' || type === 'uint8' ||\n type === 'bool';\n\n/**\n * Map string data location to integer value\n */\nexport const dataLocationStringToEnum = (location: Tensor.DataLocation): number => {\n switch (location) {\n case 'none':\n return 0;\n case 'cpu':\n return 1;\n case 'cpu-pinned':\n return 2;\n case 'texture':\n return 3;\n case 'gpu-buffer':\n return 4;\n default:\n throw new Error(`unsupported data location: ${location}`);\n }\n};\n\n/**\n * Map integer data location to string value\n */\nexport const dataLocationEnumToString = (location: number): Tensor.DataLocation|undefined =>\n (['none', 'cpu', 'cpu-pinned', 'texture', 'gpu-buffer'] as const)[location];\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {isNode} from './wasm-utils-env';\n\n/**\n * Load a file into a Uint8Array.\n *\n * @param file - the file to load. Can be a URL/path, a Blob, an ArrayBuffer, or a Uint8Array.\n * @returns a Uint8Array containing the file data.\n */\nexport const loadFile = async(file: string|Blob|ArrayBufferLike|Uint8Array): Promise => {\n if (typeof file === 'string') {\n if (isNode) {\n // load file into ArrayBuffer in Node.js\n try {\n const {readFile} = require('node:fs/promises');\n return new Uint8Array(await readFile(file));\n } catch (e) {\n if (e.code === 'ERR_FS_FILE_TOO_LARGE') {\n // file is too large, use fs.createReadStream instead\n const {createReadStream} = require('node:fs');\n const stream = createReadStream(file);\n const chunks: Uint8Array[] = [];\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n return new Uint8Array(Buffer.concat(chunks));\n }\n throw e;\n }\n } else {\n // load file into ArrayBuffer in browsers\n const response = await fetch(file);\n if (!response.ok) {\n throw new Error(`failed to load external data file: ${file}`);\n }\n const contentLengthHeader = response.headers.get('Content-Length');\n const fileSize = contentLengthHeader ? parseInt(contentLengthHeader, 10) : 0;\n if (fileSize < 1073741824 /* 1GB */) {\n // when Content-Length header is not set, we cannot determine the file size. We assume it is small enough to\n // load into memory.\n return new Uint8Array(await response.arrayBuffer());\n } else {\n // file is too large, use stream instead\n if (!response.body) {\n throw new Error(`failed to load external data file: ${file}, no response body.`);\n }\n const reader = response.body.getReader();\n\n let buffer;\n try {\n // try to create ArrayBuffer directly\n buffer = new ArrayBuffer(fileSize);\n } catch (e) {\n if (e instanceof RangeError) {\n // use WebAssembly Memory to allocate larger ArrayBuffer\n const pages = Math.ceil(fileSize / 65536);\n buffer = new WebAssembly.Memory({initial: pages, maximum: pages}).buffer;\n } else {\n throw e;\n }\n }\n\n let offset = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n const chunkSize = value.byteLength;\n const chunk = new Uint8Array(buffer, offset, chunkSize);\n chunk.set(value);\n offset += chunkSize;\n }\n return new Uint8Array(buffer, 0, fileSize);\n }\n }\n\n } else if (file instanceof Blob) {\n return new Uint8Array(await file.arrayBuffer());\n } else if (file instanceof Uint8Array) {\n return file;\n } else {\n return new Uint8Array(file);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from 'onnxruntime-common';\n\nimport {logLevelStringToEnum} from '../wasm-common';\n\ntype LogLevel = NonNullable;\ntype MessageString = string;\ntype MessageFunction = () => string;\ntype Message = MessageString|MessageFunction;\n\nconst logLevelPrefix = ['V', 'I', 'W', 'E', 'F'];\n\nconst doLog = (level: number, message: string): void => {\n // eslint-disable-next-line no-console\n console.log(`[${logLevelPrefix[level]},${new Date().toISOString()}]${message}`);\n};\n\nlet configLogLevel: LogLevel|undefined;\nlet debug: boolean|undefined;\n\nexport const configureLogger = ($configLogLevel: LogLevel, $debug: boolean): void => {\n configLogLevel = $configLogLevel;\n debug = $debug;\n};\n\n/**\n * A simple logging utility to log messages to the console.\n */\nexport const LOG = (logLevel: LogLevel, msg: Message): void => {\n const messageLevel = logLevelStringToEnum(logLevel);\n const configLevel = logLevelStringToEnum(configLogLevel);\n if (messageLevel >= configLevel) {\n doLog(messageLevel, typeof msg === 'function' ? msg() : msg);\n }\n};\n\n/**\n * A simple logging utility to log messages to the console. Only logs when debug is enabled.\n */\nexport const LOG_DEBUG: typeof LOG = (...args: Parameters) => {\n if (debug) {\n LOG(...args);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Tensor} from 'onnxruntime-common';\n\nimport {tensorTypeToTypedArrayConstructor} from '../wasm-common';\n\nexport const createView = (dataBuffer: ArrayBuffer, type: Tensor.Type): Int32Array|Uint32Array|BigInt64Array|\n BigUint64Array|Uint8Array|Float32Array|Float64Array|Int8Array|Int16Array|Uint16Array =>\n new (tensorTypeToTypedArrayConstructor(type))(dataBuffer);\n\n/**\n * a TensorView does not own the data.\n */\nexport interface TensorView {\n readonly data: number;\n readonly dataType: number;\n readonly dims: readonly number[];\n\n /**\n * get a Float32Array data view of the tensor data. tensor data must be on CPU.\n */\n getFloat32Array(): Float32Array;\n\n /**\n * get a BigInt64Array data view of the tensor data. tensor data must be on CPU.\n */\n getBigInt64Array(): BigInt64Array;\n\n /**\n * get a Int32Array data view of the tensor data. tensor data must be on CPU.\n */\n getInt32Array(): Int32Array;\n\n /**\n * create a new tensor view with the same data but different dimensions.\n */\n reshape(newDims: readonly number[]): TensorView;\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../wasm-common';\nimport {TensorView} from '../tensor-view';\n\nimport {ShaderHelper} from './ops/common';\n\nexport type SessionState = 'default'|'capturing'|'replaying';\n\nexport enum GpuDataType {\n default = 0,\n upload = 1,\n profile = 2\n}\nexport type GpuDataId = number;\n\nexport type GpuArchitecture = 'ampere';\nexport type GpuVendor = 'amd'|'intel'|'nvidia';\nexport interface AdapterInfo {\n isArchitecture: (architecture: GpuArchitecture) => boolean;\n isVendor: (vendor: GpuVendor) => boolean;\n}\n\nexport interface GpuData {\n type: GpuDataType;\n id: GpuDataId;\n buffer: GPUBuffer;\n}\n\nexport interface TensorInfo {\n dims: readonly number[];\n dataType: number;\n}\n\nexport interface ProgramUniform {\n type: DataType;\n data: number|readonly number[];\n}\n\nexport type ProgramUniformVariableInfo = [type: DataType, length: number];\n\n/**\n * Represent the dependency of a program on a specific input tensor.\n *\n * - 'none': the shader/uniform does not depend on this input's info\n * - 'type': the shader/uniform depends on data type of this input\n * - 'rank': the shader/uniform depends on data type and the rank of this input\n * - 'dims': the shader/uniform depends on data type and the dims of this input\n * - 'data': the shader/uniform depends on data type, the dims and the data of this input\n */\nexport type ProgramInputTensorInfoDependency = 'none'|'type'|'rank'|'dims'|'data';\n\n/**\n * Represent information about a program's cache for shader.\n */\nexport interface ProgramShaderCacheInfo {\n /**\n * an optional string as a cache hint in the artifact cache. If this is not specified, the cache hint will be empty.\n *\n * This hint string should only contains initializing-time information, such as the attributes or any information of\n * initializers. It should NOT contain any runtime information, such as the shape of inputs.\n */\n hint?: string;\n\n /**\n * an optional list of dependencies of the program on the input tensors. If this is not specified, the program depends\n * on 'dims' of all inputs.\n */\n inputDependencies?: ProgramInputTensorInfoDependency[];\n}\n\n/**\n * Represent information about a program's cache for uniform.\n */\nexport interface ProgramUniformCacheInfo {\n /**\n * an optional string as a cache hint in the uniform cache. If this is not specified, the cache hint will be empty.\n *\n * This hint string should only contains runtime information, such as the shape of inputs.\n */\n hint?: string;\n\n /**\n * an optional list of dependencies of the program on the input tensors. If this is not specified, the program depends\n * on 'none' of all inputs.\n */\n inputDependencies?: ProgramInputTensorInfoDependency[];\n}\n\n\n/**\n * A set of data that represent a shader program\n */\nexport interface ProgramInfo {\n /**\n * the name of the program. used for debugging and profiling\n */\n name: string;\n\n /**\n * an optional object describing the cache information of the program shader.\n *\n * If this is not specified, assume hint is empty and inputDependencies are ['dims'] for all inputs.\n */\n shaderCache?: ProgramShaderCacheInfo;\n\n /**\n * the shader's processing source code.\n *\n * This function will be called when shader cache missed.\n */\n getShaderSource: (shaderHelper: ShaderHelper) => string;\n\n /**\n * A function to get run data required to run the program.\n *\n * This function will be called every time the program is executed. Should keep this function as simple as possible.\n */\n getRunData: (inputs: readonly TensorView[]) => {\n outputs: readonly TensorInfo[];\n dispatchGroup: {x: number; y?: number; z?: number};\n programUniforms?: readonly ProgramUniform[];\n };\n}\n\nexport interface Artifact {\n programInfo: ProgramInfo;\n computePipeline: GPUComputePipeline;\n uniformVariablesInfo: readonly ProgramUniformVariableInfo[]|undefined;\n}\n\nexport interface ComputeContextInputsOutputsMapping {\n /**\n * specify the mapping to the program's inputs. the value can be a number or a tensor view.\n * - if it's a number, it's the index of the kernel's input\n * - if it's a tensor view, it's an existing tensor view that will be used as the input\n *\n * if inputs is not specified, the mapping will be the kernel's inputs in order.\n */\n readonly inputs?: ReadonlyArray;\n /**\n * specify the mapping to the program's outputs. the value must be a number.\n * - if it's a non-negative number, it's the index of the kernel's output\n * - if it's -1, it's an output that will be created as a temporary value. this value will be released after\n * the kernel is executed.\n * - if it's -2, it's an output that will be created as a persistent value. this value will be released when the\n * kernel is released.\n *\n * if outputs is not specified, the mapping will be the kernel's outputs in order.\n */\n readonly outputs?: readonly number[];\n}\n\n/**\n * A ComputeContext instance carries the states that representing the current running of a kernel.\n */\nexport interface ComputeContext {\n /**\n * gpu adapter info\n */\n readonly adapterInfo: AdapterInfo;\n\n /**\n * stores the pointer to OpKernelContext\n */\n readonly opKernelContext: number;\n\n /**\n * a list of inputs, each input is an instance of TensorView\n */\n readonly inputs: readonly TensorView[];\n\n /**\n * a custom data object that can be used to store any data that is needed by the kernel\n */\n readonly kernelCustomData: {[key: string]: unknown};\n\n /**\n * a buffer that can be used to access custom data created each time the kernel is executed\n */\n readonly customDataBuffer: Uint8Array;\n\n /**\n * a number of outputs for the node\n */\n readonly outputCount: number;\n\n compute(program: ProgramInfo, inputsOutputsMapping?: ComputeContextInputsOutputsMapping): TensorView[];\n output(index: number, dims: readonly number[]): number;\n getMaxComputeWorkgroupSizes(): [number, number, number];\n getMaxComputeWorkgroupStoragesize(): number;\n}\n\nexport type TimestampQuery = 'none'|'inside-passes'|'at-passes';\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {WebGpuBackend} from '../backend-webgpu';\nimport {LOG_DEBUG} from '../log';\n\nimport {GpuData, GpuDataId, GpuDataType} from './types';\n\n/**\n * manages GpuDataId -> GpuBuffer\n */\nexport interface GpuDataManager {\n /**\n * copy data from CPU to GPU.\n */\n upload(id: GpuDataId, data: Uint8Array): void;\n /**\n * copy data from GPU to GPU.\n */\n memcpy(sourceId: GpuDataId, destinationId: GpuDataId): void;\n /**\n * create new data on GPU.\n */\n create(size: number, usage?: number): GpuData;\n /**\n * get GPU data by ID.\n */\n get(id: GpuDataId): GpuData|undefined;\n /**\n * release the data on GPU by ID.\n *\n * @return size of the data released\n */\n release(id: GpuDataId): number;\n /**\n * copy data from GPU to CPU.\n */\n download(id: GpuDataId, getTargetBuffer: () => Uint8Array): Promise;\n\n /**\n * refresh the buffers that marked for release.\n *\n * when release() is called, the buffer is not released immediately. this is because we need to wait for the commands\n * to be submitted to the GPU. this function is called after the commands are submitted so that the buffers can be\n * actually released.\n */\n refreshPendingBuffers(): void;\n\n /**\n * register an external buffer for IO Binding. If the buffer is already registered, return the existing GPU data ID.\n *\n * GPU data manager only manages a mapping between the buffer and the GPU data ID. It will not manage the lifecycle of\n * the external buffer.\n */\n registerExternalBuffer(buffer: GPUBuffer, originalSize: number, previousBuffer?: GPUBuffer): number;\n\n /**\n * unregister an external buffer for IO Binding.\n */\n unregisterExternalBuffer(buffer: GPUBuffer): void;\n\n /**\n * destroy all gpu buffers.\n */\n dispose(): void;\n\n /**\n * release session related data.\n * @param sessionId - specify the session ID.\n */\n onReleaseSession(sessionId: number): void;\n}\n\ninterface StorageCacheValue {\n gpuData: GpuData;\n originalSize: number;\n}\n\nconst bucketFreelist: Map = new Map([\n [64, 250],\n [128, 200],\n [256, 200],\n [512, 200],\n [2048, 230],\n [4096, 200],\n [8192, 50],\n [16384, 50],\n [32768, 50],\n [65536, 50],\n [131072, 50],\n [262144, 50],\n [524288, 50],\n [1048576, 50],\n [2097152, 30],\n [4194304, 20],\n [8388608, 10],\n [12582912, 10],\n [16777216, 10],\n [26214400, 15],\n [33554432, 22],\n [44236800, 2],\n [58982400, 6],\n // we don't want to cache the bucket sizes below but not caching them\n // results in some major performance hits for models like sd-turbo.\n [67108864, 6],\n [134217728, 6],\n [167772160, 6],\n]);\n\nconst bucketArr: number[] = [];\n\n/**\n * normalize the buffer size so that it fits the 128-bits (16 bytes) alignment.\n */\nconst calcNormalizedBufferSize = (size: number) => Math.ceil(size / 16) * 16;\n\n/**\n * calculate the buffer size so that it fits into buckets.\n */\nconst calcBucketBufferSize = (size: number) => {\n for (let idx = 0; idx < bucketArr.length; idx++) {\n const sizeForBucket = bucketArr[idx];\n if (size <= sizeForBucket) {\n return sizeForBucket;\n }\n }\n // not in bucket list -> caller will not cache, round up to 16.\n return Math.ceil(size / 16) * 16;\n};\n\nlet guid = 1;\nconst createNewGpuDataId = () => guid++;\n\n/**\n * exported standard download function. This function is used by the session to download the data from GPU, and also by\n * factory to create GPU tensors with the capacity of downloading data from GPU.\n *\n * @param backend - the WebGPU backend\n * @param gpuBuffer - the GPU buffer to download\n * @param originalSize - the original size of the data\n * @param getTargetBuffer - optional. If provided, the data will be copied to the target buffer. Otherwise, a new buffer\n * will be created and returned.\n */\nexport const downloadGpuData =\n async(backend: WebGpuBackend, gpuBuffer: GPUBuffer, originalSize: number, getTargetBuffer?: () => Uint8Array):\n Promise => {\n const bufferSize = calcNormalizedBufferSize(originalSize);\n const gpuReadBuffer = backend.device.createBuffer(\n // eslint-disable-next-line no-bitwise\n {size: bufferSize, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ});\n try {\n const commandEncoder = backend.getCommandEncoder();\n backend.endComputePass();\n commandEncoder.copyBufferToBuffer(\n gpuBuffer /* source buffer */, 0 /* source offset */, gpuReadBuffer /* destination buffer */,\n 0 /* destination offset */, bufferSize /* size */\n );\n backend.flush();\n\n await gpuReadBuffer.mapAsync(GPUMapMode.READ);\n\n const arrayBuffer = gpuReadBuffer.getMappedRange();\n if (getTargetBuffer) {\n // if we already have a CPU buffer to accept the data, no need to clone the ArrayBuffer.\n const targetBuffer = getTargetBuffer();\n targetBuffer.set(new Uint8Array(arrayBuffer, 0, originalSize));\n return targetBuffer;\n } else {\n // the mapped ArrayBuffer will be released when the GPU buffer is destroyed. Need to clone the\n // ArrayBuffer.\n return new Uint8Array(arrayBuffer.slice(0, originalSize));\n }\n } finally {\n gpuReadBuffer.destroy();\n }\n };\n\nclass GpuDataManagerImpl implements GpuDataManager {\n // GPU Data ID => GPU Data ( storage buffer )\n private storageCache: Map;\n\n // pending buffers for uploading ( data is unmapped )\n private buffersForUploadingPending: GPUBuffer[];\n // pending buffers for computing\n private buffersPending: GPUBuffer[];\n\n // The reusable storage buffers for computing.\n private freeBuffers: Map;\n // The reusable uniform buffers\n private freeUniformBuffers: Map;\n\n // The external buffers registered users for IO Binding.\n private externalBuffers: Map;\n\n // The pendingBuffers for capture graph.\n // a SessionID -> GPUBuffer[] mapping.\n private capturedPendingBuffers: Map;\n\n constructor(private backend: WebGpuBackend) {\n this.storageCache = new Map();\n this.freeBuffers = new Map();\n this.freeUniformBuffers = new Map();\n this.buffersForUploadingPending = [];\n this.buffersPending = [];\n this.externalBuffers = new Map();\n this.capturedPendingBuffers = new Map();\n\n for (const [key, ] of bucketFreelist) {\n bucketArr.push(key);\n this.freeBuffers.set(key, []);\n this.freeUniformBuffers.set(key, []);\n }\n }\n\n upload(id: GpuDataId, data: Uint8Array): void {\n const srcArrayBuffer = data.buffer;\n const srcOffset = data.byteOffset;\n const srcLength = data.byteLength;\n const size = calcNormalizedBufferSize(srcLength);\n\n // get destination gpu buffer\n const gpuDataCache = this.storageCache.get(id);\n if (!gpuDataCache) {\n throw new Error('gpu data for uploading does not exist');\n }\n if (gpuDataCache.originalSize !== srcLength) {\n throw new Error(`inconsistent data size. gpu data size=${gpuDataCache.originalSize}, data size=${srcLength}`);\n }\n\n // create gpu buffer\n const gpuBufferForUploading = this.backend.device.createBuffer(\n // eslint-disable-next-line no-bitwise\n {mappedAtCreation: true, size, usage: GPUBufferUsage.MAP_WRITE | GPUBufferUsage.COPY_SRC});\n\n // copy (upload) data\n const arrayBuffer = gpuBufferForUploading.getMappedRange();\n new Uint8Array(arrayBuffer).set(new Uint8Array(srcArrayBuffer, srcOffset, srcLength));\n gpuBufferForUploading.unmap();\n\n\n // GPU copy\n const commandEncoder = this.backend.getCommandEncoder();\n this.backend.endComputePass();\n commandEncoder.copyBufferToBuffer(gpuBufferForUploading, 0, gpuDataCache.gpuData.buffer, 0, size);\n\n LOG_DEBUG('verbose', () => `[WebGPU] GpuDataManager.upload(id=${id})`);\n\n this.buffersForUploadingPending.push(gpuBufferForUploading);\n }\n\n memcpy(sourceId: GpuDataId, destinationId: GpuDataId): void {\n // get source gpu buffer\n const sourceGpuDataCache = this.storageCache.get(sourceId);\n if (!sourceGpuDataCache) {\n throw new Error('source gpu data for memcpy does not exist');\n }\n // get destination gpu buffer\n const destinationGpuDataCache = this.storageCache.get(destinationId);\n if (!destinationGpuDataCache) {\n throw new Error('destination gpu data for memcpy does not exist');\n }\n if (sourceGpuDataCache.originalSize !== destinationGpuDataCache.originalSize) {\n throw new Error('inconsistent source and destination gpu data size');\n }\n\n const size = calcNormalizedBufferSize(sourceGpuDataCache.originalSize);\n\n // GPU copy\n const commandEncoder = this.backend.getCommandEncoder();\n this.backend.endComputePass();\n commandEncoder.copyBufferToBuffer(\n sourceGpuDataCache.gpuData.buffer, 0, destinationGpuDataCache.gpuData.buffer, 0, size);\n }\n\n registerExternalBuffer(buffer: GPUBuffer, originalSize: number, previousBuffer?: GPUBuffer): number {\n let id: number|undefined;\n if (previousBuffer) {\n id = this.externalBuffers.get(previousBuffer);\n if (id === undefined) {\n throw new Error('previous buffer is not registered');\n }\n if (buffer === previousBuffer) {\n LOG_DEBUG(\n 'verbose',\n () => `[WebGPU] GpuDataManager.registerExternalBuffer(size=${originalSize}) => id=${\n id}, buffer is the same, skip.`);\n return id;\n } else if (this.backend.capturedCommandList.has(this.backend.currentSessionId!)) {\n throw new Error(`Registering a different external buffer under graph capture mode is not supported yet.\n Please use the previous external buffer!`);\n }\n this.externalBuffers.delete(previousBuffer);\n } else {\n id = createNewGpuDataId();\n }\n\n this.storageCache.set(id, {gpuData: {id, type: GpuDataType.default, buffer}, originalSize});\n this.externalBuffers.set(buffer, id);\n LOG_DEBUG(\n 'verbose',\n () => `[WebGPU] GpuDataManager.registerExternalBuffer(size=${originalSize}) => id=${id}, registered.`);\n return id;\n }\n\n unregisterExternalBuffer(buffer: GPUBuffer): void {\n const id = this.externalBuffers.get(buffer);\n if (id !== undefined) {\n this.storageCache.delete(id);\n this.externalBuffers.delete(buffer);\n LOG_DEBUG('verbose', () => `[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${id}`);\n }\n }\n\n // eslint-disable-next-line no-bitwise\n create(size: number, usage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST): GpuData {\n const bufferSize = calcBucketBufferSize(size);\n\n let gpuBuffer;\n // Currently, only storage buffers are reused.\n // eslint-disable-next-line no-bitwise\n const isStorage = (usage & GPUBufferUsage.STORAGE) === GPUBufferUsage.STORAGE;\n // eslint-disable-next-line no-bitwise\n const isUniform = (usage & GPUBufferUsage.UNIFORM) === GPUBufferUsage.UNIFORM;\n if (isStorage || isUniform) {\n const freeBuffers = isStorage ? this.freeBuffers : this.freeUniformBuffers;\n const buffers = freeBuffers.get(bufferSize);\n if (!buffers) {\n // no such bucket/freelist - create gpu buffer\n gpuBuffer = this.backend.device.createBuffer({size: bufferSize, usage});\n } else {\n if (buffers.length > 0) {\n // in freelist, use it\n gpuBuffer = buffers.pop() as GPUBuffer;\n } else {\n // bucket empty, create gpu buffer\n gpuBuffer = this.backend.device.createBuffer({size: bufferSize, usage});\n }\n }\n } else {\n // create gpu buffer\n gpuBuffer = this.backend.device.createBuffer({size: bufferSize, usage});\n }\n\n const gpuData = {id: createNewGpuDataId(), type: GpuDataType.default, buffer: gpuBuffer};\n this.storageCache.set(gpuData.id, {gpuData, originalSize: size});\n\n LOG_DEBUG('verbose', () => `[WebGPU] GpuDataManager.create(size=${size}) => id=${gpuData.id}`);\n return gpuData;\n }\n\n get(id: GpuDataId): GpuData|undefined {\n return this.storageCache.get(id)?.gpuData;\n }\n\n release(id: GpuDataId): number {\n const cachedData = this.storageCache.get(id);\n if (!cachedData) {\n throw new Error('releasing data does not exist');\n }\n\n LOG_DEBUG('verbose', () => `[WebGPU] GpuDataManager.release(id=${id}), gpuDataId=${cachedData.gpuData.id}`);\n\n this.storageCache.delete(id);\n this.buffersPending.push(cachedData.gpuData.buffer);\n // cachedData.gpuData.buffer.destroy();\n\n return cachedData.originalSize;\n }\n\n async download(id: GpuDataId, getTargetBuffer: () => Uint8Array): Promise {\n const cachedData = this.storageCache.get(id);\n if (!cachedData) {\n throw new Error('data does not exist');\n }\n await downloadGpuData(this.backend, cachedData.gpuData.buffer, cachedData.originalSize, getTargetBuffer);\n }\n\n refreshPendingBuffers(): void {\n for (const buffer of this.buffersForUploadingPending) {\n // upload buffer is only useful in the session creation time. So we don't need to reuse them in session running.\n buffer.destroy();\n }\n this.buffersForUploadingPending = [];\n\n if (this.buffersPending.length === 0) {\n return;\n }\n\n if (this.backend.sessionStatus === 'default') {\n for (const buffer of this.buffersPending) {\n const maxInFreeList = bucketFreelist.get(buffer.size);\n\n // eslint-disable-next-line no-bitwise\n if ((buffer.usage & GPUBufferUsage.STORAGE) === GPUBufferUsage.STORAGE) {\n // Put the pending buffer to freeBuffers list instead of really destroying it for buffer reusing.\n const freelist = this.freeBuffers.get(buffer.size) || [];\n if (maxInFreeList === undefined || freelist.length >= maxInFreeList) {\n buffer.destroy();\n } else {\n freelist.push(buffer);\n }\n // eslint-disable-next-line no-bitwise\n } else if ((buffer.usage & GPUBufferUsage.UNIFORM) === GPUBufferUsage.UNIFORM) {\n // Put the pending buffer to freeUniformBuffers list instead of really destroying it for buffer reusing.\n const freelist = this.freeUniformBuffers.get(buffer.size) || [];\n if (maxInFreeList === undefined || freelist.length >= maxInFreeList) {\n buffer.destroy();\n } else {\n freelist.push(buffer);\n }\n } else {\n buffer.destroy();\n }\n }\n this.buffersPending = [];\n } else {\n // Don't release intermediate tensors in non-default mode.\n // TODO: reuse the storage buffers in non-default mode.\n let capturedBuffers = this.capturedPendingBuffers.get(this.backend.currentSessionId!);\n if (!capturedBuffers) {\n capturedBuffers = [];\n this.capturedPendingBuffers.set(this.backend.currentSessionId!, capturedBuffers);\n }\n for (const buffer of this.buffersPending) {\n capturedBuffers.push(buffer);\n }\n this.buffersPending = [];\n }\n }\n\n dispose() {\n this.freeBuffers.forEach((buffers) => {\n buffers.forEach(buffer => {\n buffer.destroy();\n });\n });\n this.freeUniformBuffers.forEach((buffers) => {\n buffers.forEach(buffer => {\n buffer.destroy();\n });\n });\n\n this.storageCache.forEach((storage) => {\n storage.gpuData.buffer.destroy();\n });\n\n this.capturedPendingBuffers.forEach((buffers) => {\n buffers.forEach(buffer => {\n buffer.destroy();\n });\n });\n this.storageCache = new Map();\n this.freeBuffers = new Map();\n this.freeUniformBuffers = new Map();\n this.capturedPendingBuffers = new Map();\n }\n\n onReleaseSession(sessionId: number) {\n // release the captured pending buffers.\n const pendingBuffers = this.capturedPendingBuffers.get(sessionId);\n if (pendingBuffers) {\n pendingBuffers.forEach(buffer => {\n buffer.destroy();\n });\n this.capturedPendingBuffers.delete(sessionId);\n }\n }\n}\n\nexport const createGpuDataManager = (...args: ConstructorParameters): GpuDataManager =>\n new GpuDataManagerImpl(...args);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nclass AttributeWithCacheKeyImpl {\n constructor(attribute: Record) {\n Object.assign(this, attribute);\n }\n\n private key: string;\n public get cacheKey(): string {\n if (!this.key) {\n this.key =\n Object.getOwnPropertyNames(this).sort().map(name => `${(this as Record)[name]}`).join(';');\n }\n return this.key;\n }\n}\n\nexport interface AttributeWithCacheKey {\n readonly cacheKey: string;\n}\n\n/**\n * create a new object from the given attribute, and add a cacheKey property to it\n */\nexport const createAttributeWithCacheKey = >(attribute: T): T&AttributeWithCacheKey =>\n new AttributeWithCacheKeyImpl(attribute) as unknown as T & AttributeWithCacheKey;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/* eslint-disable no-param-reassign */\n\nexport class MatMulUtil {\n /**\n * Calculate the expected shape when matrix multiplication\n * @param a The shape of tensor A. Should be a tuple of 2 positive integers\n * @param b The shape of tensor B. Should be a tuple of 2 positive integers\n * @returns The expected shape of the result, or undefined if N/A\n */\n static calcMatMulShape(a: [number, number], b: [number, number]): [number, number]|undefined {\n return (a[1] !== b[0]) ? undefined : [a[0], b[1]];\n }\n}\n\n\nexport class BroadcastUtil {\n /**\n * Calculate the expected shape when broadcasting 2 tensors\n * @param a The shape of tensor A. Should be an array of positive integers\n * @param b The shape of tensor B. Should be an array of positive integers\n * @param isMatMul Whether the operation is MatMul\n * @returns The expected shape of the result, or undefined if N/A\n */\n static calcShape(adims: readonly number[], bdims: readonly number[], isMatMul = false): readonly number[]|undefined {\n const arank = adims.length;\n const brank = bdims.length;\n if (arank === 0) {\n return bdims;\n }\n if (brank === 0) {\n return adims;\n }\n const crank = Math.max(adims.length, bdims.length);\n const cdims = new Array(crank);\n\n // calculate the last 2 dimension if it is MatMul\n if (isMatMul) {\n if (arank < 2 || brank < 2) {\n return undefined;\n }\n const cShapeMatMul =\n MatMulUtil.calcMatMulShape([adims[arank - 2], adims[arank - 1]], [bdims[brank - 2], bdims[brank - 1]]);\n if (cShapeMatMul === undefined) {\n return undefined;\n }\n [cdims[crank - 2], cdims[crank - 1]] = cShapeMatMul;\n }\n\n for (let i = isMatMul ? 3 : 1; i <= crank; i++) {\n const aLen = arank - i < 0 ? 1 : adims[arank - i];\n const bLen = brank - i < 0 ? 1 : bdims[brank - i];\n\n if (aLen !== bLen && aLen > 1 && bLen > 1) {\n return undefined;\n }\n const max = Math.max(aLen, bLen);\n if (aLen && bLen) {\n cdims[crank - i] = Math.max(aLen, bLen);\n } else {\n // when either aLen or bLen is 0, the other should be either 0 or 1, otherwise it is not broadcastable.\n if (max > 1) {\n return undefined;\n }\n cdims[crank - i] = 0;\n }\n }\n\n return cdims;\n }\n\n /**\n * Determine if a shape is unidirectional broadcastable to another shape\n * @param shape The input shape\n * @param finalShape The desired shape after broadcasting\n */\n static isValidBroadcast(shape: readonly number[], finalShape: readonly number[]): boolean {\n // align shape to the right\n const inputRank = shape.length;\n const finalRank = finalShape.length;\n if (inputRank > finalRank) {\n return false;\n }\n for (let i = 1; i <= inputRank; i++) {\n if (shape[inputRank - i] !== 1 && shape[inputRank - i] !== finalShape[finalRank - i]) {\n return false;\n }\n }\n return true;\n }\n}\n\n\nexport class ShapeUtil {\n /**\n * calculate the size (number of elements)\n */\n static size(dims: readonly number[]): number {\n return ShapeUtil.getSizeFromDimensionRange(dims, 0, dims.length);\n }\n\n /**\n * convert dims corresponding to type change to pack. ex. uint8 data to uint32\n */\n static convertShape(dims: readonly number[], size = 4): readonly number[] {\n const rank = dims.length;\n if (rank === 0) {\n return [];\n }\n const newDims = new Array(rank);\n let i = rank - 1;\n while (i >= 0) {\n if (dims[i] % size === 0) {\n newDims[i] = dims[i] / size;\n break;\n }\n if (size % dims[i] !== 0) {\n throw new Error('cannot convert shape');\n }\n newDims[i] = 1;\n size /= dims[i];\n i--;\n }\n for (i--; i >= 0; i--) {\n newDims[i] = dims[i];\n }\n return newDims;\n }\n\n /**\n * calculate the size (number of elements) from the given axis (inclusive)\n */\n static sizeFromDimension(dims: readonly number[], axis: number): number {\n if (axis < 0 || axis > dims.length) {\n throw new Error(`invalid dimension of ${axis} for sizeFromDimension as Tensor has ${dims.length} dimensions.`);\n }\n return ShapeUtil.getSizeFromDimensionRange(dims, axis, dims.length);\n }\n\n /**\n * calculate the size (number of elements) to the given axis (exclusive)\n */\n static sizeToDimension(dims: readonly number[], axis: number): number {\n if (axis < 0 || axis > dims.length) {\n throw new Error(`invalid dimension of ${axis} for sizeToDimension as Tensor has ${dims.length} dimensions.`);\n }\n return ShapeUtil.getSizeFromDimensionRange(dims, 0, axis);\n }\n\n /**\n * calculate the size (number of elements) from and to the given axis [start, end)\n */\n static getSizeFromDimensionRange(dims: readonly number[], start: number, end: number): number {\n let size = 1;\n for (let i = start; i < end; i++) {\n // safety check as this method is called by multiple other methods requiring size.\n // size cannot be negative.\n if (dims[i] < 0) {\n throw new Error(\n // eslint-disable-next-line max-len\n 'cannot get valid size from specified dimension range. Most likely the range contains negative values in them.');\n }\n size *= dims[i];\n }\n return size;\n }\n\n static computeStrides(dims: readonly number[]): readonly number[] {\n const rank = dims.length;\n if (rank === 0) {\n return [];\n } else if (rank === 1) {\n return [1];\n }\n const strides = new Array(rank);\n strides[rank - 1] = 1;\n strides[rank - 2] = dims[rank - 1];\n for (let i = rank - 3; i >= 0; --i) {\n strides[i] = strides[i + 1] * dims[i + 1];\n }\n return strides;\n }\n\n /**\n * normailze axis of range [-r, r) into [0, r).\n */\n static normalizeAxis(axis: number, tensorRank: number): number {\n if (axis < -tensorRank && axis >= tensorRank) {\n throw new Error('unsupported axis for this operation.');\n }\n return axis < 0 ? axis + tensorRank : axis;\n }\n\n static normalizeAxes(axes: readonly number[], tensorRank?: number): number[] {\n return axes.map(x => this.normalizeAxis(x, tensorRank ?? axes.length));\n }\n\n /**\n * Sorts a given array based on the indices in the Perm array\n * Used in Transpose\n * @param a Array to be sorted such as dims or strides\n * @param perm Perm given; if null a will be reversed\n */\n static sortBasedOnPerm(a: readonly number[], perm?: readonly number[]): readonly number[] {\n if (perm) {\n return perm.map((v) => a[v]);\n } else {\n return a.slice().reverse();\n }\n }\n\n /**\n * Pads a given shape according to the padding values\n * @param dims shape of the Tensor to be padded\n * @param pad pad values\n */\n static padShape(dims: readonly number[], pad: readonly number[]): readonly number[] {\n const rank = dims.length;\n return dims.map((v, i) => v + pad[i] + pad[i + rank]);\n }\n\n /**\n * Determines if the two shapes are identical\n * @param shape1\n * @param shape2\n */\n static areEqual(shape1: readonly number[], shape2: readonly number[]): boolean {\n if (shape1.length !== shape2.length) {\n return false;\n }\n return shape1.every((v, i) => v === shape2[i]);\n }\n}\n\nexport class PoolConvUtil {\n /**\n * Adjust the kernel, strides, pads to correct rank. Set to default value if not present\n * @param isGlobalOperator If true, perform global pooling.\n * @param inputDims The input tensor dimension.\n * @param kernelShape The size of the kernel along each axis.\n * @param strides Stride along each axis.\n * @param dilations Dilation along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n */\n static adjustPoolAttributes(\n isGlobalOperator: boolean, inputDims: readonly number[], kernelShape: number[], strides: number[],\n dilations: number[], pads: number[]): void {\n if (!isGlobalOperator && kernelShape.length !== inputDims.length - 2) {\n throw new Error('length of specified kernel shapes should be 2 less than length of input dimensions');\n }\n\n if (isGlobalOperator) {\n // adjust kernel shape to cover the input dims\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n if (dim >= kernelShape.length) {\n kernelShape.push(inputDims[dim + 2]);\n } else {\n kernelShape[dim] = inputDims[dim + 2];\n }\n }\n }\n\n // adjust strides length to match kernel shape length\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (dim < strides.length) {\n if (strides[dim] < 0) {\n throw new Error('strides should be greater than or equal to 1');\n }\n } else {\n strides.push(1);\n }\n }\n\n // adjust dilation value\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (dim < dilations.length) {\n if (dilations[dim] < 0) {\n throw new Error('dilations should be greater than or equal to 1');\n }\n } else {\n dilations.push(1);\n }\n }\n\n // adjust pads length to match 2 * kernel shape length\n for (let dim = 0; dim < kernelShape.length * 2; dim++) {\n if (dim < pads.length) {\n if (pads[dim] < 0) {\n throw new Error('pad should be greater than or equal to 1');\n }\n } else {\n pads.push(0);\n }\n }\n\n // sanity checks for values in kernel shapes and pads\n for (let dim = 0; dim < kernelShape.length; dim++) {\n if (kernelShape[dim] <= 0) {\n throw new Error('kernel shapes need to be greater than 0');\n }\n\n if (pads[dim] >= kernelShape[dim] || pads[dim + kernelShape.length] >= kernelShape[dim]) {\n throw new Error('pads should be smaller than kernel');\n }\n }\n }\n\n // adjust pad values based on 'autoPad' attribute\n static adjustPadsBasedOnAutoPad(\n inputDims: readonly number[], strides: readonly number[], dilations: readonly number[],\n kernelShape: readonly number[], pads: number[], isChannelLast: boolean, autoPad?: string): void {\n if (!autoPad) {\n return;\n }\n\n if (pads.length !== 2 * (inputDims.length - 2)) {\n throw new Error('length of pads should be twice the length of data dimensions');\n }\n\n if (strides.length !== (inputDims.length - 2)) {\n throw new Error('length of strides should be the length of data dimensions');\n }\n\n if (kernelShape.length !== (inputDims.length - 2)) {\n throw new Error('length of kernel shapes should be the length of data dimensions');\n }\n\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n PoolConvUtil.adjustPadAndReturnShape(\n inputDims[dim + (isChannelLast ? 1 : 2)], strides[dim], dilations[dim], kernelShape[dim], pads, dim,\n dim + inputDims.length - 2, autoPad);\n }\n }\n\n /**\n * Calculate the output shape for Pool ops based on input attributes. (Should be used only for Pool ops)\n * @param isGlobalOperator If true, perform global pooling.\n * @param inputDims The input tensor dimension. (inputs[0].dims)\n * @param strides Stride along each axis.\n * @param dilations Dilation along each axis.\n * @param kernelShape The size of the kernel along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n * @param autoPad DEPRECATED attribute supported for legacy models. Specifies how to implicitly calculate pads in each\n * dimension. Can take values NOTSET, SAME_UPPER, SAME_LOWER, or VALID.\n */\n static computePoolOutputShape(\n isGlobalOperator: boolean, inputDims: readonly number[], strides: number[], dilations: number[],\n kernelShape: number[], pads: number[], autoPad?: string): number[] {\n if (inputDims.length <= 0) {\n throw new Error('input shape must be of size greater than 0');\n }\n\n // Add batch size and number of channels of output\n const outputDims = [inputDims[0], inputDims[1]];\n\n PoolConvUtil.computeShapeHelper(\n isGlobalOperator, inputDims, outputDims, strides, dilations, kernelShape, pads, autoPad);\n return outputDims;\n }\n\n /**\n * Calculate the output shape for Conv op based on input attributes. (Should be used only for Conv op)\n * @param inputDims The input tensor dimension. (inputs[0].dims)\n * @param filterDims The filter tensor dimension. (inputs[1].dims)\n * @param strides Stride along each axis.\n * @param kernelShape The size of the kernel along each axis.\n * @param pads Padding for the beginning and ending along each axis.\n * @param autoPad DEPRECATED attribute supported for legacy models. Specifies how to implicitly calculate pads in each\n * dimension. Can take values NOTSET, SAME_UPPER, SAME_LOWER, or VALID.\n */\n static computeConvOutputShape(\n inputDims: readonly number[], filterDims: readonly number[], strides: number[], dilations: number[],\n kernelShape: number[], pads: number[], autoPad?: string): number[] {\n if (inputDims.length <= 0 || filterDims.length <= 0) {\n throw new Error('invalid input tensor dims or invalid filter tensor dims');\n }\n\n // Add batch size and number of channels of output\n const outputDims = [inputDims[0], filterDims[0]];\n\n PoolConvUtil.computeShapeHelper(false, inputDims, outputDims, strides, dilations, kernelShape, pads, autoPad);\n return outputDims;\n }\n\n // will compute output shapes for data dimensions ONLY (i.e.) no batch size and channels\n // called by computePoolOutputShape() and computeConvOutputShape()\n // adjust pads based on 'autoPad' attribute prior to shape computation\n private static computeShapeHelper(\n isGlobalOperator: boolean, inputDims: readonly number[], outputDims: number[], strides: readonly number[],\n dilations: readonly number[], kernelShape: readonly number[], pads: number[], autoPad?: string) {\n if (isGlobalOperator) {\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n outputDims.push(1);\n }\n } else {\n for (let dim = 0; dim < inputDims.length - 2; dim++) {\n outputDims.push(PoolConvUtil.adjustPadAndReturnShape(\n inputDims[dim + 2], strides[dim], dilations[dim], kernelShape[dim], pads, dim, dim + inputDims.length - 2,\n autoPad));\n }\n }\n }\n\n // helper for computeShapeHelper() and adjustPadsBasedOnAutoPad()\n // adjusts pad value for given 'autoPad' string and computes output shape along a particular dimension\n private static adjustPadAndReturnShape(\n inSize: number, stride: number, dilation: number, kernel: number, pads: number[], padHeadIndex: number,\n padTailIndex: number, autoPad?: string): number {\n const dkernel = dilation * (kernel - 1) + 1;\n if (autoPad && autoPad !== 'NOTSET') {\n switch (autoPad) {\n case 'VALID':\n pads[padHeadIndex] = 0;\n pads[padTailIndex] = 0;\n return Math.floor(((inSize - dkernel) / stride) + 1);\n case 'SAME_LOWER':\n case 'SAME_UPPER':\n if (dilation !== 1) {\n throw new Error('Dilation not supported for SAME_UPPER or SAME_LOWER');\n } else {\n const legacyTargetSize = (inSize + stride - 1) / stride;\n const padNeeded = (legacyTargetSize - 1) * stride + kernel - inSize;\n pads[padHeadIndex] =\n (autoPad === 'SAME_LOWER') ? Math.floor((padNeeded + 1) / 2) : Math.floor(padNeeded / 2);\n pads[padTailIndex] = padNeeded - pads[padHeadIndex];\n return Math.floor(((inSize + padNeeded - kernel) / stride) + 1);\n }\n default:\n throw new Error('Unsupported AutoPad type');\n }\n } else {\n return Math.floor(((inSize + pads[padHeadIndex] + pads[padTailIndex] - dkernel) / stride) + 1);\n }\n }\n}\n\nexport class GemmUtil {\n // will make sure input shapes are compatible for this op\n // and return back the shape of the output in the form of a tuple\n // will throw exception if the input shapes are not compatible\n static getShapeOfGemmResult(\n leftShape: readonly number[], transLeft: boolean, rightShape: readonly number[], transRight: boolean,\n biasShape?: readonly number[]): readonly number[] {\n if (leftShape.length !== 2 || rightShape.length !== 2) {\n throw new Error('shape need to be of size 2');\n }\n\n let M: number;\n let K: number;\n let N: number;\n\n if (transLeft) {\n M = leftShape[1];\n K = leftShape[0];\n } else {\n M = leftShape[0];\n K = leftShape[1];\n }\n\n let kDim = -1;\n\n if (transRight) {\n N = rightShape[0];\n kDim = 1;\n } else {\n N = rightShape[1];\n kDim = 0;\n }\n\n if (rightShape[kDim] !== K) {\n throw new Error('dimension mismatch');\n }\n\n if (M <= 0 || N <= 0 || K <= 0) {\n throw new Error('invalid shape specified');\n }\n\n if (biasShape && !BroadcastUtil.isValidBroadcast(biasShape, [M, N])) {\n throw new Error('gemm: invalid bias shape for broadcast');\n }\n\n return [M, N, K];\n }\n}\n\n\nexport const MIN_CLIP = -3.4028234663852886e+38;\nexport const MAX_CLIP = 3.4028234663852886e+38;\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {ShapeUtil} from '../../util';\nimport {ProgramUniform, ProgramUniformVariableInfo} from '../types';\n\n/**\n * constant value for a workgroup size.\n *\n * We definitely can do further optimization in future, but for now we use 64.\n *\n * rule of thumb: Use [a workgroup size of] 64 unless you know what GPU you are targeting or that your workload\n * needs something different.\n *\n * from: https://surma.dev/things/webgpu/\n **/\nexport const WORKGROUP_SIZE = 64;\n\ninterface IndicesHelperTypes {\n /**\n * WGSL type of indices expression\n */\n readonly indices: string;\n\n /**\n * WGSL type of a value\n */\n readonly value: string;\n\n /**\n * WGSL type of storage type representing a value\n *\n * This is usually the same to `value`, but for some type (eg. bool), we need to use `u32` as storage type for\n * value type `vec4`\n */\n readonly storage: string;\n\n /**\n * tensor type as represented in TensorView\n */\n readonly tensor: number;\n}\n\n/**\n * A helper class for generating WGSL code for manipulating indices and data for a shader's input or output.\n *\n * This class is designed to offer a unified way to generate WGSL code for manipulating indices and data for a shader's\n * input or output.\n *\n * The following is a list of terminologies used in this class:\n * - `offset`: a uint32 value representing the offset of an element in the data buffer.\n * - `indices`: an abstraction of a multi-dimensional array's indices representing the data's index on each dimension.\n * - `value`: a value of a data element.\n *\n * Users are expected to create an instance of this class for each shader's input or output, and use the instance to\n * generate WGSL code for manipulating indices and data. The following 2 exported functions are for users to call to\n * create an instance of an indices helper:\n * - `inputVariable()`: create an indices helper instance for an input.\n * - `outputVariable()`: create an indices helper instance for an output.\n * - `internalVariable()`: create an indices helper instance for an internal variable.\n *\n * An indices helper instance contains helper functions for the following operations:\n * - access readonly basic information, including: `name`(the name of the input or output), `usage`(whether it's an\n * input, an output or an internal variable) and `shape`(the passed in shape).\n * - `type`: access readonly type information, including: `indices`(the type of indices), `value`(the type of value at\n * runtime), `storage`(the type of value at storage) and `tensor`(the tensor type as represented in TensorView).\n * - generate WGSL code for getting indices from offset. Use `offsetToIndices()` for WGSL code snippet to calculate\n * indices from offset, and use `indicesToOffset()` for WGSL code snippet to calculate offset from indices.\n * - to manipulate an instance of indices, use `setIndices()` and `getIndices()` to set and get the indices on an\n * indices variable.\n * - to manipulate data, use `set()`/`get()` to access data at the given indices from parameter list, use\n * `setByIndices()`/`getByIndices()` to access data at the given indices from an indices variable, and use\n * `setByOffset()`/`getByOffset()` to access data at the given offset.\n * - `impl`: get WGSL code of function implementation for the util functions mentioned above.\n */\nexport interface IndicesHelper {\n /**\n * get WGSL code of function implementation for the util functions.\n *\n */\n readonly impl: () => string;\n\n /**\n * get type info\n */\n readonly type: IndicesHelperTypes;\n\n /**\n * WGSL code of a expression for getting indices from offset.\n *\n * @param varOffset - a u32 expression representing the offset.\n *\n * @returns an `type.indices` expression\n */\n readonly offsetToIndices: (varOffset: string) => string;\n\n /**\n * WGSL code of an `u32` expression for getting offset from indices.\n *\n * @param varIndices - a `type.indices` expression representing the indices.\n *\n * @returns an `u32` expression\n */\n readonly indicesToOffset: (varIndices: string) => string;\n\n /**\n * WGSL code of an `u32` expression for getting original offset from broadcasted indices.\n *\n * @param varIndices - a `type.indices` expression representing the output indices.\n * @param output - output IndicesHelper.\n *\n * @returns an `u32` expression\n */\n readonly broadcastedIndicesToOffset: (varIndices: string, output: IndicesHelper) => string;\n\n /**\n * WGSL code of generating an indices literal\n *\n * @param init - initial value.\n */\n readonly indices: (...init: ReadonlyArray) => string;\n\n /**\n * WGSL code of a statement for setting indices.\n *\n * @param varIndices - a variable name for the indices.\n * @param idx - the index of the indices to set. can be a number or a string (WGSL `u32` expression).\n * @param value - the value to set. can be a number or a string (WGSL `u32` expression).\n *\n * @returns a WGSL statement\n */\n readonly indicesSet: (varIndices: string, idx: number|string, value: number|string) => void;\n\n /**\n * WGSL code of an `u32` expression for getting indices.\n *\n * @param varIndices - a variable name for the indices.\n * @param idx - the index of the indices to get. can be a number or a string (WGSL `u32` expression).\n *\n * @returns an `u32` expression\n */\n readonly indicesGet: (varIndices: string, idx: number|string) => string;\n\n /**\n * WGSL code for a statement for setting data at the given indices.\n *\n * @param indicesAndValue - an array of numbers or strings (WGSL `u32` expression) representing the indices, followed\n * by the value to set. This array should have exactly `shape.length + 1` elements.\n */\n readonly set: (...indicesAndValue: ReadonlyArray) => string;\n\n /**\n * WGSL code for a statement for setting data at the given indices variable.\n *\n * @param varIndices - a variable name for the indices.\n * @param value - the value to set. should be a WGSL expression.\n */\n readonly setByIndices: (varIndices: string, value: string) => string;\n\n /**\n * WGSL code for a statement for setting data at the given offset.\n *\n * @param offset - a number or a string (WGSL `u32` expression) representing the offset.\n * @param value - the value to set. should be a WGSL expression.\n */\n readonly setByOffset: (offset: number|string, value: string) => string;\n\n /**\n * WGSL code for an expression for getting data at the given indices.\n *\n * @param indices - an array of numbers or strings (WGSL `u32` expression) representing the indices.\n */\n readonly get: (...indices: ReadonlyArray) => string;\n\n /**\n * WGSL code for an expression for getting data at the given indices variable.\n *\n * @param varIndices - a variable name for the indices.\n */\n readonly getByIndices: (varIndices: string) => string;\n\n /**\n * WGSL code for an expression for getting data at the given offset.\n *\n * @param offset - a number or a string (WGSL `u32` expression) representing the offset.\n */\n readonly getByOffset: (offset: number|string) => string;\n\n /**\n * name of the data variable\n */\n readonly name: string;\n\n /**\n * whether the helper is for an input, an output or an internal variable.\n */\n readonly usage: 'input'|'output'|'internal';\n\n /**\n * the rank of the input or output.\n */\n readonly rank: number;\n\n /**\n * a string representing the variable name for the shape of the input or output.\n */\n readonly shape: string;\n\n /**\n * a string representing the variable name for the strides of the input or output.\n */\n readonly strides: string;\n}\n\nconst getWgslMappedType = (type: number, components: 1|2|3|4): string|[string, string] => {\n if (components === 3) {\n throw new Error('vec3 has same alignment as vec4, use vec4 instead');\n }\n\n // return type is [ storage type, runtime type ] or a single string for both\n switch (type) {\n case DataType.float16:\n return components > 1 ? `vec${components}` : 'f16';\n case DataType.float:\n return components > 1 ? `vec${components}` : 'f32';\n case DataType.int32:\n return components > 1 ? `vec${components}` : 'i32';\n case DataType.uint32:\n return components > 1 ? `vec${components}` : 'u32';\n case DataType.int64:\n if (components > 1) {\n throw new Error('currently not supported vecX of uint64 yet');\n }\n return ['vec2', 'i32'];\n case DataType.uint64:\n if (components > 1) {\n throw new Error('currently not supported vecX of uint64 yet');\n }\n return ['vec2', 'u32'];\n case DataType.bool:\n if (components !== 4) {\n throw new Error('bool must be vec4');\n }\n return ['u32', 'vec4'];\n\n default:\n throw new Error(`Unknown data type: ${type}`);\n }\n};\n\nexport const tensorTypeToWsglStorageType = (type: DataType, components: 1|2|3|4 = 1) => {\n const mappedType = getWgslMappedType(type, components);\n return typeof mappedType === 'string' ? mappedType : mappedType[0];\n};\n\nexport const tensorTypeToWsglValueType = (type: DataType, components: 1|2|3|4 = 1) => {\n const mappedType = getWgslMappedType(type, components);\n return typeof mappedType === 'string' ? mappedType : mappedType[1];\n};\n\nexport const createTensorShapeVariables = (...dims: ReadonlyArray): ProgramUniform[] => {\n const programUniforms: ProgramUniform[] = [];\n dims.forEach(dim => {\n if (dim.length !== 0) {\n programUniforms.push(\n {type: DataType.uint32, data: dim}, {type: DataType.uint32, data: ShapeUtil.computeStrides(dim)});\n }\n });\n return programUniforms;\n};\n\n/**\n * A helper function to get maximum vector size for specified data length\n * @param size\n */\nexport const getMaxComponents = (size: number) => {\n // we cannot use vec3 type since it has alignment of 16 bytes\n if (size % 4 === 0) {\n return 4;\n } else if (size % 2 === 0) {\n return 2;\n }\n\n return 1;\n};\n\n/**\n * A helper function that initializes variable as a scalar or vector. e.g. f32(0) or vec4f(0,0,0,0)\n * @param dataType\n * @param components\n * @param value\n */\nexport const fillVector = (dataType = 'f32', components?: number, value = '0') => {\n if (!components || components === 1) {\n return `${dataType}(${value})`;\n }\n\n return `vec${components}<${dataType}>(${value})`;\n};\n\n/**\n * A helper function that casts value or vector to f32\n * @param dataType\n * @param components\n * @param value\n */\nexport const castToF32 = (dataType: string, components: number, value: string) => {\n if (dataType === 'f32') {\n return value;\n }\n if (components === 1) {\n return `f32(${value})`;\n }\n\n return `vec${components}(${value})`;\n};\n\n/**\n * A helper function that returns scalar or sums all components of a vector\n * @param name\n * @param components\n */\nexport const sumVector = (name: string, components: number) => {\n if (components === 4) {\n return `(${name}.x + ${name}.y + ${name}.z + ${name}.w)`;\n } else if (components === 2) {\n return `(${name}.x + ${name}.y)`;\n } else if (components === 3) {\n return `(${name}.x + ${name}.y + ${name}.z)`;\n }\n\n return name;\n};\n\n/**\n * A helper function that returns variable element at index.\n * @param name - the name of variable.\n * @param index - the index of variable element.\n * @param length - the length of variable.\n * @param type - the type of variable, optional.\n */\nexport const getElementAt =\n (name: string, index: number|string, length: number, type?: UniformDataElementType): string => {\n if (name.startsWith('uniforms.') && length > 4) {\n if (typeof (index) === 'string') {\n if (type === 'f16') {\n return `${name}[(${index}) / 8][(${index}) % 8 / 4][(${index}) % 8 % 4]`;\n } else {\n return `${name}[(${index}) / 4][(${index}) % 4]`;\n }\n } else {\n if (type === 'f16') {\n return `${name}[${Math.floor(index / 8)}][${Math.floor(index % 8 / 4)}][${index % 8 % 4}]`;\n } else {\n return `${name}[${Math.floor(index / 4)}][${index % 4}]`;\n }\n }\n } else {\n return length > 1 ? `${name}[${index}]` : name;\n }\n };\n\n/**\n * A helper function to get a IndicesHelper for a given input or output.\n *\n * @param name - the name of the input or output.\n * @param tensorType - the tensor type of the input or output.\n * @param shapeOrRank - the tensor shape or the rank of the input or output.\n * @param usage - the usage of the indices helper.\n * @param components - indicates the number of components of each element. 1 for scalar, 2 for vec2, 3 for vec3, 4 for\n * vec4.\n */\nconst createIndicesHelper =\n (name: string, tensorType: number, shapeOrRank: number|readonly number[], usage: IndicesHelper['usage'],\n components: 1|2|3|4): IndicesHelper => {\n const useUniform = typeof shapeOrRank === 'number';\n const rank = useUniform ? shapeOrRank : shapeOrRank.length;\n const rankIdentity = [...new Array(rank).keys()];\n const indicesType = rank < 2 ? 'u32' : rank <= 4 ? `vec${rank}` : `array`;\n const mappedType = getWgslMappedType(tensorType, components);\n const valueType = typeof mappedType === 'string' ? mappedType : mappedType[1];\n const storageType = typeof mappedType === 'string' ? mappedType : mappedType[0];\n const type = {indices: indicesType, value: valueType, storage: storageType, tensor: tensorType};\n\n const normalizeDim = (dim: number|string): string => typeof dim === 'string' ? dim : `${dim}u`;\n\n const implementationUsed = {\n offsetToIndices: false,\n indicesToOffset: false,\n broadcastedIndicesToOffset: false,\n set: false,\n setByIndices: false,\n get: false,\n getByIndices: false,\n };\n\n const uniformPrefix = useUniform ? 'uniforms.' : '';\n const shape = `${uniformPrefix}${name}_shape`;\n const strides = `${uniformPrefix}${name}_strides`;\n\n let o2iSnippet = '';\n for (let i = 0; i < rank - 1; i++) {\n o2iSnippet += `\n let dim${i} = current / ${getElementAt(strides, i, rank)};\n let rest${i} = current % ${getElementAt(strides, i, rank)};\n indices[${i}] = dim${i};\n current = rest${i};\n `;\n }\n o2iSnippet += `indices[${rank - 1}] = current;`;\n\n const offsetToIndicesImplementation = rank < 2 ? '' : `\n fn o2i_${name}(offset: u32) -> ${type.indices} {\n var indices: ${type.indices};\n var current = offset;\n ${o2iSnippet}\n return indices;\n }`;\n\n const offsetToIndices = (varOffset: string) => {\n implementationUsed.offsetToIndices = true;\n return rank < 2 ? varOffset : `o2i_${name}(${varOffset})`;\n };\n\n const offsets: string[] = [];\n if (rank >= 2) {\n for (let i = rank - 1; i >= 0; i--) {\n offsets.push(`${getElementAt(strides, i, rank)} * (indices[${i}])`);\n }\n }\n\n const indicesToOffsetImplementation = rank < 2 ? '' : `\n fn i2o_${name}(indices: ${type.indices}) -> u32 {\n return ${offsets.join('+')};\n }`;\n\n const indicesToOffset = (varIndices: string) => {\n implementationUsed.indicesToOffset = true;\n return rank < 2 ? varIndices : `i2o_${name}(${varIndices})`;\n };\n\n const indices = (...init: ReadonlyArray) =>\n rank === 0 ? '0u' : `${type.indices}(${init.map(normalizeDim).join(',')})`;\n\n const indicesGet = (varIndices: string, idx: number|string) => {\n if (rank < 2) {\n return `${varIndices}`;\n } else {\n return `${getElementAt(varIndices, idx, rank)}`;\n }\n };\n\n const indicesSet = (varIndices: string, idx: number|string, value: string) => {\n if (rank < 2) {\n return `${varIndices}=${value};`;\n } else {\n return `${getElementAt(varIndices, idx, rank)}=${value};`;\n }\n };\n\n const broadcastedIndicesToOffsetImplementation: {[key: string]: string} = {};\n const broadcastedIndicesToOffset = (varIndices: string, output: IndicesHelper) => {\n implementationUsed.broadcastedIndicesToOffset = true;\n const implKey = `${output.name}broadcastedIndicesTo${name}Offset`;\n if (implKey in broadcastedIndicesToOffsetImplementation) {\n return `${implKey}(${varIndices})`;\n }\n const offsets = [];\n for (let i = rank - 1; i >= 0; i--) {\n const idx = output.indicesGet('outputIndices', i + output.rank - rank);\n offsets.push(`${indicesGet(strides, i)} * (${idx} % ${indicesGet(shape, i)})`);\n }\n broadcastedIndicesToOffsetImplementation[implKey] =\n `fn ${implKey}(outputIndices: ${output.type.indices}) -> u32 {\n return ${offsets.length > 0 ? offsets.join('+') : '0u'};\n }`;\n\n return `${implKey}(${varIndices})`;\n };\n\n const setByOffset = (offset: number|string, value: string) => (() => {\n if (type.storage === type.value) {\n return `${name}[${offset}]=${value};`;\n } else if (type.storage === 'vec2' && type.value === 'i32') {\n // int64, components === 1\n return `${name}[${offset}]=vec2(u32(${value}), select(0u, 0xFFFFFFFFu, ${value} < 0));`;\n } else if (type.storage === 'vec2' && type.value === 'u32') {\n // uint64, components === 1\n return `${name}[${offset}]=vec2(u32(${value}), 0u);`;\n } else if (type.storage === 'u32' && type.value === 'vec4') {\n // bool, components === 4\n return `${name}[${offset}]=dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(${value}));`;\n } else {\n throw new Error(`not supported combination of storage type ${type.storage} and value type ${type.value} yet`);\n }\n })();\n\n const getByOffset = (offset: number|string) => (() => {\n if (type.storage === type.value) {\n return `${name}[${offset}]`;\n } else if (type.storage === 'vec2' && type.value === 'i32') {\n // int64, components === 1\n return `i32(${name}[${offset}].x)`;\n } else if (type.storage === 'vec2' && type.value === 'u32') {\n // uint64, components === 1\n return `u32(${name}[${offset}].x)`;\n } else if (type.storage === 'u32' && type.value === 'vec4') {\n // bool, components === 4\n return `vec4(bool(${name}[${offset}] & 0xFFu), bool(${name}[${offset}] & 0xFF00u), bool(${name}[${\n offset}] & 0xFF0000u), bool(${name}[${offset}] & 0xFF000000u))`;\n } else {\n throw new Error(`not supported combination of storage type ${type.storage} and value type ${type.value} yet`);\n }\n })();\n\n const getByIndicesImplementation = rank < 2 ? '' : `\n fn get_${name}ByIndices(indices: ${type.indices}) -> ${valueType} {\n return ${getByOffset(`i2o_${name}(indices)`)};\n }`;\n\n const getImplementation = rank < 2 ? '' : (() => {\n const functionParams = rankIdentity.map(i => `d${i}: u32`).join(', ');\n const dimsParams = rankIdentity.map(i => `d${i}`).join(', ');\n return `\n fn get_${name}(${functionParams}) -> ${valueType} {\n return get_${name}ByIndices(${indices(dimsParams)});\n }`;\n })();\n\n const get = (...indices: ReadonlyArray) => {\n if (indices.length !== rank) {\n throw new Error(`indices length must be ${rank}`);\n }\n\n const normalizedIndices = indices.map(normalizeDim).join(',');\n\n if (rank === 0) {\n return getByOffset('0u');\n } else if (rank === 1) {\n return getByOffset(normalizedIndices[0]);\n } else {\n implementationUsed.get = true;\n implementationUsed.getByIndices = true;\n implementationUsed.indicesToOffset = true;\n return `get_${name}(${normalizedIndices})`;\n }\n };\n\n const getByIndices = (varIndices: string) => {\n if (rank < 2) {\n return getByOffset(varIndices);\n } else {\n implementationUsed.getByIndices = true;\n implementationUsed.indicesToOffset = true;\n return `get_${name}ByIndices(${varIndices})`;\n }\n };\n\n const setByIndicesImplementation = rank < 2 ? '' : `\n fn set_${name}ByIndices(indices: ${type.indices}, value: ${valueType}) {\n ${setByOffset(`i2o_${name}(indices)`, 'value')}\n }`;\n\n const setImplementation = rank < 2 ? '' : (() => {\n const functionParams = rankIdentity.map(i => `d${i}: u32`).join(', ');\n const dimsParams = rankIdentity.map(i => `d${i}`).join(', ');\n return `\n fn set_${name}(${functionParams}, value: ${valueType}) {\n set_${name}ByIndices(${indices(dimsParams)}, value);\n }`;\n })();\n\n const set = (...indicesAndValue: ReadonlyArray) => {\n if (indicesAndValue.length !== rank + 1) {\n throw new Error(`indices length must be ${rank}`);\n }\n const value = indicesAndValue[rank];\n if (typeof value !== 'string') {\n throw new Error('value must be string');\n }\n\n const normalizedIndices = indicesAndValue.slice(0, rank).map(normalizeDim).join(',');\n\n if (rank === 0) {\n return setByOffset('0u', value);\n } else if (rank === 1) {\n return setByOffset(normalizedIndices[0], value);\n } else {\n implementationUsed.set = true;\n implementationUsed.setByIndices = true;\n implementationUsed.indicesToOffset = true;\n return `set_${name}(${normalizedIndices}, ${value})`;\n }\n };\n\n const setByIndices = (varIndices: string, value: string) => {\n if (rank < 2) {\n return setByOffset(varIndices, value);\n } else {\n implementationUsed.setByIndices = true;\n implementationUsed.indicesToOffset = true;\n return `set_${name}ByIndices(${varIndices}, ${value});`;\n }\n };\n\n const impl = () => {\n const impls = [];\n let needShapeStrides = false;\n if (implementationUsed.offsetToIndices) {\n impls.push(offsetToIndicesImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.indicesToOffset) {\n impls.push(indicesToOffsetImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.broadcastedIndicesToOffset) {\n Object.values(broadcastedIndicesToOffsetImplementation).forEach(impl => impls.push(impl));\n needShapeStrides = true;\n }\n if (implementationUsed.set) {\n impls.push(setImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.setByIndices) {\n impls.push(setByIndicesImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.get) {\n impls.push(getImplementation);\n needShapeStrides = true;\n }\n if (implementationUsed.getByIndices) {\n impls.push(getByIndicesImplementation);\n needShapeStrides = true;\n }\n if (!useUniform && needShapeStrides) {\n impls.unshift(\n `const ${shape} = ${type.indices}(${shapeOrRank.join(',')});`,\n `const ${strides} = ${type.indices}(${ShapeUtil.computeStrides(shapeOrRank).join(',')});`);\n }\n return impls.join('\\n');\n };\n\n return {\n impl,\n type,\n offsetToIndices,\n indicesToOffset,\n broadcastedIndicesToOffset,\n indices,\n indicesGet,\n indicesSet,\n set,\n setByOffset,\n setByIndices,\n get,\n getByOffset,\n getByIndices,\n // isVec4,\n usage,\n name,\n strides,\n shape,\n rank\n };\n };\n\n/**\n * Create a IndicesHelper for an input.\n *\n * @param name - the name of the input.\n * @param type - the tensor type of the input.\n * @param shapeOrRank - the tensor shape or the rank of the input.\n * @param components - the number of components of the input. available values are 1, 2, 3, 4. default is 1.\n * @returns an IndicesHelper for the input.\n */\nexport const inputVariable =\n (name: string, type: number, shapeOrRank: number|readonly number[], components: 1|2|3|4 = 1): IndicesHelper =>\n createIndicesHelper(name, type, shapeOrRank, 'input', components);\n\n/**\n * Create a IndicesHelper for an output.\n *\n * @param name - the name of the output.\n * @param type - the tensor type of the output.\n * @param shapeOrRank - the tensor shape or the rank of the output.\n * @param components - the number of components of the output. available values are 1, 2, 3, 4. default is 1.\n * @returns an IndicesHelper for the output.\n */\nexport const outputVariable =\n (name: string, type: number, shapeOrRank: number|readonly number[], components: 1|2|3|4 = 1): IndicesHelper =>\n createIndicesHelper(name, type, shapeOrRank, 'output', components);\n\n/**\n * Create a IndicesHelper for an internal variable.\n *\n * @param name - the name of the variable.\n * @param type - the tensor type of the variable.\n * @param shapeOrRank - the tensor shape or the rank of the variable.\n * @param components - the number of components of the variable. available values are 1, 2, 3, 4. default is 1.\n * @returns an IndicesHelper for the variable.\n */\nexport const internalVariable =\n (name: string, type: number, shapeOrRank: number|readonly number[], components: 1|2|3|4 = 1): IndicesHelper =>\n createIndicesHelper(name, type, shapeOrRank, 'internal', components);\n\nexport type UniformDataElementType = 'u32'|'f16'|'f32'|'i32';\nexport type UniformsArrayType = Array<{name: string; type: UniformDataElementType; length?: number}>;\n\n/**\n * A ShaderHelper is a helper class for generating WGSL code.\n */\nexport interface ShaderHelper {\n /**\n * A helper function to generate the start of main function in WGSL source code.\n *\n * @example\n * const getShaderSource = (shaderHelper: ShaderHelper) => `\n * ...\n *\n * ${shaderHelper.mainStart()}\n * // your code here inside main() function\n * ...\n * }\n * `;\n *\n * @param workgroupSize - an optional workgroup size. default is WORKGROUP_SIZE.\n */\n mainStart(workgroupSize?: number|[number, number, number]): string;\n\n /**\n * A helper function to generate the code snippet for guarding against out-of-bounds size.\n *\n * @example\n * const getShaderSource = (shaderHelper: ShaderHelper) => `\n * ...\n *\n * ${shaderHelper.mainStart()}\n * ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes(outputSize)}\n *\n * // your code here inside main() function\n * ...\n * }\n * `;\n *\n * @param size - the size of the data to guard against. can be a number or a string (WGSL `u32` expression).\n */\n guardAgainstOutOfBoundsWorkgroupSizes(size: unknown): string;\n\n /**\n * A helper function to generate the code snippet for declaring multiple inputs or outputs.\n *\n * @param variables - an array of IndicesHelper for the variables.\n */\n declareVariables(...variables: IndicesHelper[]): string;\n\n /**\n * A helper function to register one uniform. Can be called multiple times to register multiple uniforms.\n *\n * @param name - the name of the uniform.\n * @param type - the type of the uniform.\n * @param length - the length of the uniform, default to 1 when it is not provided.\n */\n registerUniform(name: string, type: string, length?: number): ShaderHelper;\n\n /**\n * A helper function to register multiple uniforms. Can be called multiple times to register multiple uniforms.\n *\n * @param uniforms - an array of uniforms. Each element of the array is an object with 2 properties: `name` and\n * `type`.\n */\n registerUniforms(uniforms: UniformsArrayType): ShaderHelper;\n\n /**\n * A helper function to register multiple internal variables. Can be called multiple times to register multiple\n * internal variables.\n *\n * @param variables - an array of IndicesHelper for the variables.\n */\n registerInternalVariables(...variables: IndicesHelper[]): ShaderHelper;\n}\n\nclass ShaderHelperImpl implements ShaderHelper {\n constructor(private normalizedDispatchGroup: [number, number, number], private limits: GPUSupportedLimits) {}\n\n guardAgainstOutOfBoundsWorkgroupSizes(size: number|string): string {\n // Guard against out-of-bounds work group sizes\n const sizeInCode = typeof size === 'number' ? `${size}u` : size;\n return `if (global_idx >= ${sizeInCode}) { return; }`;\n }\n\n mainStart(workgroupSize: number|[number, number, number] = WORKGROUP_SIZE) {\n const workgroupSizeX = typeof workgroupSize === 'number' ? workgroupSize : workgroupSize[0];\n const workgroupSizeY = typeof workgroupSize === 'number' ? 1 : workgroupSize[1];\n const workgroupSizeZ = typeof workgroupSize === 'number' ? 1 : workgroupSize[2];\n\n if (workgroupSizeX > this.limits.maxComputeWorkgroupSizeX ||\n workgroupSizeY > this.limits.maxComputeWorkgroupSizeY ||\n workgroupSizeZ > this.limits.maxComputeWorkgroupSizeZ) {\n throw new Error(`workgroup size [${workgroupSizeX}, ${workgroupSizeY}, ${\n workgroupSizeZ}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${\n this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);\n }\n\n if (workgroupSizeX * workgroupSizeY * workgroupSizeZ > this.limits.maxComputeInvocationsPerWorkgroup) {\n throw new Error(`workgroup size [${workgroupSizeX}, ${workgroupSizeY}, ${\n workgroupSizeZ}] exceeds the maximum workgroup invocations ${\n this.limits.maxComputeInvocationsPerWorkgroup}.`);\n }\n\n const is1DimensionDispatch = this.normalizedDispatchGroup[1] === 1 && this.normalizedDispatchGroup[2] === 1;\n const paramList = is1DimensionDispatch ? `@builtin(global_invocation_id) global_id : vec3,\n @builtin(workgroup_id) workgroup_id : vec3,\n @builtin(local_invocation_id) local_id : vec3` :\n `@builtin(global_invocation_id) global_id : vec3,\n @builtin(local_invocation_id) local_id : vec3,\n @builtin(local_invocation_index) local_idx : u32,\n @builtin(workgroup_id) workgroup_id : vec3,\n @builtin(num_workgroups) num_workgroups : vec3`;\n const globalIdxDefinition = is1DimensionDispatch ?\n 'let global_idx = global_id.x; let local_idx = local_id.x;' :\n `let global_idx = (workgroup_id.z * num_workgroups[0] * num_workgroups[1] +\n workgroup_id.y * num_workgroups[0] + workgroup_id.x) * ${\n workgroupSizeX * workgroupSizeY * workgroupSizeZ}u + local_idx;`;\n\n return `@compute @workgroup_size(${workgroupSizeX}, ${workgroupSizeY}, ${workgroupSizeZ})\n fn main(${paramList}) {\n ${globalIdxDefinition}\n `;\n }\n\n private appendVariableUniforms(variable: IndicesHelper): void {\n if (variable.rank !== 0) {\n if (variable.shape.startsWith('uniforms.')) {\n this.uniforms.push({name: variable.shape.replace('uniforms.', ''), type: 'u32', length: variable.rank});\n }\n if (variable.strides.startsWith('uniforms.')) {\n this.uniforms.push({name: variable.strides.replace('uniforms.', ''), type: 'u32', length: variable.rank});\n }\n }\n }\n\n private declareVariable(variable: IndicesHelper, bindingIndex: number): string {\n if (variable.usage === 'internal') {\n throw new Error('cannot use internal variable with declareVariable(). use registerInternalVariables() instead.');\n }\n this.variables.push(variable);\n this.appendVariableUniforms(variable);\n\n const access = variable.usage === 'input' ? 'read' : 'read_write';\n const storageType = variable.type.storage;\n return `@group(0) @binding(${bindingIndex}) var ${variable.name}: array<${storageType}>;`;\n }\n\n declareVariables(...variables: IndicesHelper[]): string {\n return variables.map(v => this.declareVariable(v, this.variableIndex++)).join('\\n');\n }\n\n private registerInternalVariable(variable: IndicesHelper): void {\n if (variable.usage !== 'internal') {\n throw new Error(\n 'cannot use input or output variable with registerInternalVariable(). use declareVariables() instead.');\n }\n\n this.internalVariables.push(variable);\n this.appendVariableUniforms(variable);\n }\n\n registerInternalVariables(...variables: IndicesHelper[]): ShaderHelper {\n variables.forEach(v => this.registerInternalVariable(v));\n return this;\n }\n\n registerUniform(name: string, type: UniformDataElementType, length = 1): ShaderHelper {\n this.uniforms.push({name, type, length});\n return this;\n }\n\n registerUniforms(additionalUniforms: UniformsArrayType): ShaderHelper {\n this.uniforms = this.uniforms.concat(additionalUniforms);\n return this;\n }\n\n private internalVariables: IndicesHelper[] = [];\n private variables: IndicesHelper[] = [];\n private uniforms: UniformsArrayType = [];\n private uniformDeclaration(): string {\n if (this.uniforms.length === 0) {\n return '';\n }\n\n const uniformSnippets: string[] = [];\n for (const {name, type, length} of this.uniforms) {\n if (length && length > 4) {\n if (type === 'f16') {\n uniformSnippets.push(`@align(16) ${name}:array, ${Math.ceil(length / 8)}>`);\n } else {\n uniformSnippets.push(`${name}:array, ${Math.ceil(length / 4)}>`);\n }\n } else {\n const typeTemp = length == null || length === 1 ? type : `vec${length}<${type}>`;\n uniformSnippets.push(`${name}:${typeTemp}`);\n }\n }\n\n return `\n struct Uniforms { ${uniformSnippets.join(', ')} };\n @group(0) @binding(${this.variableIndex}) var uniforms: Uniforms;`;\n }\n private variableIndex = 0;\n\n /**\n * Get additional implementation that needs to be added to the shader source.\n */\n get additionalImplementations(): string {\n return this.uniformDeclaration() + this.variables.map(i => i.impl()).join('\\n') +\n this.internalVariables.map(i => i.impl()).join('\\n');\n }\n\n /**\n * Get the variable info of the shader program.\n */\n get variablesInfo(): ProgramUniformVariableInfo[]|undefined {\n if (this.uniforms.length === 0) {\n return undefined;\n }\n\n const uniformWgslTypeToDataType = (type: UniformDataElementType) =>\n ([DataType.uint32, DataType.float16, DataType.float,\n DataType.int32][['u32', 'f16', 'f32', 'i32'].indexOf(type)]);\n return this.uniforms.map(u => ([uniformWgslTypeToDataType(u.type), u.length ?? 1]));\n }\n}\n\nexport const createShaderHelper = (dispatchGroup: [number, number, number], limits: GPUSupportedLimits) =>\n new ShaderHelperImpl(dispatchGroup, limits);\n\n/**\n * This function comes from https://github.com/tensorflow/tfjs/blob/master/tfjs-core/src/ops/broadcast_util.ts#L18-L40\n * Returns the dimensions in the input shape that are broadcasted to\n * produce the provided output shape.\n *\n * The returned dimensions are 0-indexed and sorted. An example:\n * inShape = [4, 1, 3]\n * outShape = [5, 4, 3, 3]\n * result = [1]. Dimension 1 (2nd dimension of input) gets broadcasted 1 => 3.\n */\nexport const getBroadcastDims = (inShape: readonly number[], outShape: readonly number[]): number[] => {\n const inRank = inShape.length;\n const dims: number[] = [];\n for (let i = 0; i < inRank; i++) {\n const dim = inRank - 1 - i;\n const a = inShape[dim] || 1;\n const b = outShape[outShape.length - 1 - i] || 1;\n if (b > 1 && a === 1) {\n dims.unshift(dim);\n }\n }\n return dims;\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface TransposeAttributes extends AttributeWithCacheKey {\n readonly perm: number[];\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Transpose requires 1 input.');\n }\n};\n\nconst getAdjustedPerm = (inputRank: number, perm: number[]): number[] =>\n (perm && perm.length !== inputRank) ? [...(new Array(inputRank).keys())].reverse() : perm;\n\nconst getOutputShape = (inputShape: readonly number[], perm: number[]): readonly number[] =>\n ShapeUtil.sortBasedOnPerm(inputShape, getAdjustedPerm(inputShape.length, perm));\n\nconst permFunctionBody = (perm: number[], rank: number, input: IndicesHelper, output: IndicesHelper): string => {\n const reverseFunc = [];\n reverseFunc.push(`fn perm(i: ${output.type.indices}) -> ${input.type.indices} {\n var a: ${input.type.indices};`);\n for (let i = 0; i < rank; ++i) {\n reverseFunc.push(input.indicesSet('a', perm[i], `i[${i}]`));\n }\n reverseFunc.push('return a;}');\n return reverseFunc.join('\\n');\n};\n\nexport const createTransposeProgramInfo = (inputTensor: TensorView, permAttr: number[]): ProgramInfo => {\n const inputDataType = inputTensor.dataType;\n const inputRank = inputTensor.dims.length;\n const perm = getAdjustedPerm(inputRank, permAttr);\n const outputShape = getOutputShape(inputTensor.dims, perm);\n const output = outputVariable('output', inputDataType, outputShape.length);\n const input = inputVariable('a', inputDataType, inputRank);\n let getShaderSource;\n if (perm.length === 2 && perm[0] === 1 && perm[1] === 0) {\n const wgslType = output.type.value;\n const workgroupSize: [number, number, number] = [16, 16, 1];\n getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(input, output)}\n var tile : array, ${workgroupSize[0]}>;\n ${shaderHelper.mainStart(workgroupSize)}\n var x = workgroup_id.x * ${workgroupSize[0]}u + local_id.x;\n var y = workgroup_id.y * ${workgroupSize[0]}u + local_id.y;\n let width = uniforms.output_shape[0];\n let height = uniforms.output_shape[1];\n if (x < width && y < height) {\n tile[local_id.y][local_id.x] = ${input.getByOffset('y * width + x')};\n }\n workgroupBarrier();\n x = workgroup_id.y * ${workgroupSize[0]}u + local_id.x;\n y = workgroup_id.x * ${workgroupSize[0]}u + local_id.y;\n if (x < height && y < width) {\n ${output.setByOffset('y * height + x', 'tile[local_id.x][local_id.y]')}\n }\n }`;\n } else {\n getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(input, output)}\n\n ${permFunctionBody(perm, inputRank, input, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let indices = ${output.offsetToIndices('global_idx')};\n let aIndices = perm(indices);\n\n ${output.setByOffset('global_idx', input.getByIndices('aIndices'))}\n }`;\n }\n return {\n name: 'Transpose',\n shaderCache: {hint: `${permAttr}`, inputDependencies: ['rank']},\n getRunData: (inputs) => {\n const outputSize = ShapeUtil.size(outputShape);\n return {\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms:\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(inputs[0].dims, outputShape)],\n };\n },\n getShaderSource,\n };\n};\n\nexport const transpose = (context: ComputeContext, attributes: TransposeAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createTransposeProgramInfo(context.inputs[0], attributes.perm));\n};\n\nexport const parseTransposeAttributes = (attributes: Record): TransposeAttributes =>\n createAttributeWithCacheKey({perm: attributes.perm as number[]});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramShaderCacheInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper} from './common';\nimport {createReduceAttributesFromInputs, ReduceAttributes} from './reduce';\nimport {createTransposeProgramInfo} from './transpose';\n\nconst reduceOps: {[key: string]: string} = {\n max: 'select(bestValue, candidate, candidate > bestValue)',\n min: 'select(bestValue, candidate, candidate < bestValue)',\n mean: 'bestValue + candidate',\n sum: 'bestValue + candidate',\n prod: 'bestValue * candidate',\n sumSquare: 'bestValue + candidate * candidate',\n logSumExp: 'bestValue + exp(candidate)',\n l1: 'bestValue + abs(candidate)',\n l2: 'bestValue + candidate * candidate',\n logSum: 'bestValue + candidate'\n};\n\nconst reduceSharedOps: {[key: string]: string} = {\n max: 'select(bestValue, candidate, candidate > bestValue)',\n min: 'select(bestValue, candidate, candidate < bestValue)',\n mean: 'bestValue + candidate',\n sum: 'bestValue + candidate',\n prod: 'bestValue * candidate',\n sumSquare: 'bestValue + candidate',\n logSumExp: 'bestValue + candidate',\n l1: 'bestValue + candidate',\n l2: 'bestValue + candidate',\n logSum: 'bestValue + candidate'\n};\n\nconst reduceInitValues: {[key: string]: string} = {\n max: '_A[offset]',\n min: '_A[offset]',\n mean: '0',\n sum: '0',\n prod: '1',\n sumSquare: '0',\n logSumExp: '0',\n l1: '0',\n l2: '0',\n logSum: '0'\n};\n\nconst reduceOutputValues: {[key: string]: string} = {\n max: 'bestValue',\n min: 'bestValue',\n sum: 'bestValue',\n prod: 'bestValue',\n sumSquare: 'bestValue',\n logSumExp: 'log(bestValue)',\n l1: 'bestValue',\n l2: 'sqrt(bestValue)',\n logSum: 'log(bestValue)'\n};\n\nconst getInnerMostAxes = (numInnerAxes: number, rank: number): number[] => {\n const res = [];\n for (let i = rank - numInnerAxes; i < rank; ++i) {\n res.push(i);\n }\n return res;\n};\n\nconst computeOutAndReduceShapes = (shape: readonly number[], axes: readonly number[]): [number[], number[]] => {\n const outputShape = [];\n const rank = shape.length;\n for (let dim = 0; dim < rank; dim++) {\n if (axes.indexOf(dim) === -1) {\n outputShape.push(shape[dim]);\n }\n }\n const reduceShape = axes.map(dim => shape[dim]);\n return [outputShape, reduceShape];\n};\n\nconst expandShapeToKeepDim = (shape: number[], axes: number[]): number[] => {\n const rank = shape.length + axes.length;\n const expandShape = [];\n let shapeIdx = 0;\n for (let dim = 0; dim < rank; dim++) {\n if (axes.indexOf(dim) === -1) {\n expandShape.push(shape[shapeIdx++]);\n } else {\n expandShape.push(1);\n }\n }\n return expandShape;\n};\n\nconst areAxesInnerMostDims = (axes: number[], rank: number): boolean => {\n for (let i = 0; i < axes.length; ++i) {\n if (axes[axes.length - i - 1] !== rank - 1 - i) {\n return false;\n }\n }\n return true;\n};\n\nconst getAxesPermutation = (axes: number[], rank: number): number[] => {\n const res = [];\n if (!areAxesInnerMostDims(axes, rank)) {\n for (let i = 0; i < rank; ++i) {\n if (axes.indexOf(i) === -1) {\n res.push(i);\n }\n }\n axes.forEach(axis => res.push(axis));\n }\n return res;\n};\n\nexport const createReduceSharedProgramInfo =\n (name: string, shaderCache: ProgramShaderCacheInfo, inputs: readonly TensorView[], reduceType: string,\n outputDataType: DataType, outputShape: number[], reduceShape: number[]): ProgramInfo => {\n const inputShape = inputs[0].dims;\n\n const outputSize = ShapeUtil.size(outputShape);\n const reduceSize = ShapeUtil.size(reduceShape);\n\n const input = inputVariable('_A', inputs[0].dataType, inputShape);\n const output = outputVariable('output', outputDataType, outputShape);\n\n const workgroupSize = 32;\n\n const sharedMemorySnippet = `\n var aBestValues : array;\n `;\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniform('reduceSize', 'u32').declareVariables(input, output)}\n ${sharedMemorySnippet}\n fn DIV_CEIL(a : u32, b : u32) -> u32 {\n return ((a - 1u) / b + 1u);\n }\n ${shaderHelper.mainStart(workgroupSize)}\n\n let outputIndex = global_idx / ${workgroupSize};\n let offset = outputIndex * uniforms.reduceSize;\n\n var bestValue = f32(${reduceInitValues[reduceType]});\n let Length = uniforms.reduceSize;\n for (var k = local_idx; k < Length; k = k + ${workgroupSize}) {\n let candidate = f32(${input.getByOffset('offset + k')});\n bestValue = ${reduceOps[reduceType]};\n }\n aBestValues[local_idx] = bestValue;\n workgroupBarrier();\n\n var reduceSize = min(Length, ${workgroupSize}u);\n for (var currentSize = reduceSize / 2u; reduceSize > 1u;\n currentSize = reduceSize / 2u) {\n let interval = DIV_CEIL(reduceSize, 2u);\n if (local_idx < currentSize) {\n let candidate = aBestValues[local_idx + interval];\n bestValue = ${reduceSharedOps[reduceType]};\n aBestValues[local_idx] = bestValue;\n }\n reduceSize = interval;\n workgroupBarrier();\n }\n\n if (local_idx == 0u) {\n ${\n output.setByOffset(\n 'outputIndex',\n `${\n reduceType === 'mean' ? `${output.type.storage}(bestValue / f32(uniforms.reduceSize))` :\n `${output.type.storage}(${reduceOutputValues[reduceType]})`}`)};\n }\n }`;\n\n // One work group is responsible for only one element of output.\n return {\n name,\n shaderCache,\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: outputDataType}],\n dispatchGroup: {x: outputSize},\n programUniforms: [{type: DataType.uint32, data: reduceSize}]\n }),\n };\n };\n\nconst reduceCommon =\n (context: ComputeContext, name: string, attributes: ReduceAttributes,\n reduceType: 'sum'|'sumSquare'|'prod'|'min'|'max'|'mean'|'logSumExp'|'l1'|'l2'|'logSum'): void => {\n const updatedAttributes: ReduceAttributes =\n context.inputs.length === 1 ? attributes : createReduceAttributesFromInputs(context.inputs, attributes);\n\n let updatedAxes = updatedAttributes.axes;\n if (updatedAxes.length === 0 && !updatedAttributes.noopWithEmptyAxes) {\n updatedAxes = context.inputs[0].dims.map((_dim, i) => i);\n }\n const normalizeAxes = ShapeUtil.normalizeAxes(updatedAxes, context.inputs[0].dims.length);\n\n let axes = normalizeAxes;\n let input = context.inputs[0];\n const permutedAxes = getAxesPermutation(axes, context.inputs[0].dims.length);\n if (permutedAxes.length > 0) {\n input = context.compute(\n createTransposeProgramInfo(context.inputs[0], permutedAxes), {inputs: [0], outputs: [-1]})[0];\n axes = getInnerMostAxes(axes.length, input.dims.length);\n }\n\n const [outputShape, reduceShape] = computeOutAndReduceShapes(input.dims, axes);\n let finalOutputShape = outputShape;\n if (updatedAttributes.keepDims) {\n finalOutputShape = expandShapeToKeepDim(outputShape, normalizeAxes);\n }\n\n context.compute(\n createReduceSharedProgramInfo(\n name, {hint: updatedAttributes.cacheKey, inputDependencies: ['type']}, [input], reduceType,\n context.inputs[0].dataType, finalOutputShape, reduceShape),\n {inputs: [input]});\n };\n\nexport const reduceMeanShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceMeanShared', attributes, 'mean');\n};\n\nexport const reduceL1Shared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceL1Shared', attributes, 'l1');\n};\n\nexport const reduceL2Shared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceL2Shared', attributes, 'l2');\n};\n\nexport const reduceLogSumExpShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceLogSumExpShared', attributes, 'logSumExp');\n};\n\nexport const reduceMaxShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceMaxShared', attributes, 'max');\n};\n\nexport const reduceMinShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceMinShared', attributes, 'min');\n};\n\nexport const reduceProdShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceProdShared', attributes, 'prod');\n};\n\nexport const reduceSumShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceSumShared', attributes, 'sum');\n};\n\nexport const reduceSumSquareShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceSumSquareShared', attributes, 'sumSquare');\n};\n\nexport const reduceLogSumShared = (context: ComputeContext, attributes: ReduceAttributes): void => {\n reduceCommon(context, 'ReduceLogSumShared', attributes, 'logSum');\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramShaderCacheInfo} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\nimport {reduceL1Shared, reduceL2Shared, reduceLogSumExpShared, reduceLogSumShared, reduceMaxShared, reduceMeanShared, reduceMinShared, reduceProdShared, reduceSumShared, reduceSumSquareShared} from './reduce-shared';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length === 0 || inputs.length > 2) {\n throw new Error('Reduce op requires 1 or 2 inputs.');\n }\n\n if (inputs.length === 2 && inputs[1].dims.length !== 1) {\n throw new Error('Invalid axes input dims.');\n }\n};\n\nexport interface ReduceAttributes extends AttributeWithCacheKey {\n keepDims: boolean;\n noopWithEmptyAxes: boolean;\n axes: number[];\n}\n\nexport type ReduceOp =\n (input: IndicesHelper, output: IndicesHelper,\n axes: readonly number[]) => [string, string, string, string, ...string[]];\n\nconst noOp: ReduceOp = (input) => ['', '', `var value = ${input.getByIndices('input_indices')};`, ''];\nexport const createReduceProgramInfo =\n (name: string, shaderCache: ProgramShaderCacheInfo, inputs: readonly TensorView[], reduceOp: ReduceOp,\n axesInput: number[], outputDataType: DataType, keepDims = false, noopWithEmptyAxes = false): ProgramInfo => {\n const outputShape: number[] = [];\n const inputShape = inputs[0].dims;\n const inputRank = inputShape.length;\n const axes = ShapeUtil.normalizeAxes(axesInput, inputRank);\n const reduceOnAllAxes = !noopWithEmptyAxes && axes.length === 0;\n inputShape.forEach((d, i) => {\n if (reduceOnAllAxes || axes.indexOf(i) >= 0) {\n if (keepDims) {\n outputShape.push(1);\n } // else { // skip this axis}\n } else {\n outputShape.push(d);\n }\n });\n const outputRank = outputShape.length;\n const outputSize = ShapeUtil.size(outputShape);\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const idxCopy: string[] = []; // copy output indexes to input indexes\n\n const input = inputVariable('_A', inputs[0].dataType, inputRank);\n const output = outputVariable('output', outputDataType, outputRank);\n const ops = reduceOp(input, output, axes);\n let reduceOps = ops[2];\n\n for (let k = 0, l = 0; k < inputRank; k++) {\n // if this axis is reduced\n if (reduceOnAllAxes || axes.indexOf(k) >= 0) {\n if (keepDims) {\n l++;\n }\n // loop over the d-th axis\n reduceOps = `for(var j${k}: u32 = 0; j${k} < ${inputShape[k]}; j${k}++) {\n ${ops[2].includes('last_index') ? `let last_index = j${k};` : ''}\n ${input.indicesSet('input_indices', k, `j${k}`)}\n ${reduceOps}\n }`;\n } else {\n idxCopy.push(`${input.indicesSet('input_indices', k, output.indicesGet('output_indices', l))};`);\n l++;\n }\n }\n return `\n\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(input, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n var input_indices: ${input.type.indices};\n let output_indices = ${output.offsetToIndices('global_idx')};\n\n ${idxCopy.join('\\n')}\n ${ops[0]} // init ops for reduce max/min\n ${ops[1]}\n ${reduceOps}\n ${ops[3]}\n ${ops.length === 4 ? output.setByOffset('global_idx', 'value') : ops.slice(4).join('\\n')}\n }`;\n };\n\n return {\n name,\n shaderCache,\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: outputDataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms:\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(inputShape, outputShape)]\n }),\n };\n };\n\nexport const createReduceAttributesFromInputs =\n (inputs: readonly TensorView[], attributes: ReduceAttributes): ReduceAttributes => {\n const axes: number[] = [];\n if (inputs[1].dims[0] > 0) {\n inputs[1].getBigInt64Array().forEach(v => axes.push(Number(v)));\n }\n return createAttributeWithCacheKey(\n {axes, keepDims: attributes.keepDims, noopWithEmptyAxes: attributes.noopWithEmptyAxes});\n };\n\nconst runReduceProgram =\n (context: ComputeContext, name: string, attributes: ReduceAttributes, reduceOp: ReduceOp): void => {\n const inputs = context.inputs;\n const updatedAttributes: ReduceAttributes =\n inputs.length === 1 ? attributes : createReduceAttributesFromInputs(inputs, attributes);\n\n context.compute(\n createReduceProgramInfo(\n name, {hint: updatedAttributes.cacheKey, inputDependencies: ['rank']}, [inputs[0]],\n updatedAttributes.noopWithEmptyAxes && updatedAttributes.axes.length === 0 ? noOp : reduceOp,\n updatedAttributes.axes, inputs[0].dataType, updatedAttributes.keepDims,\n updatedAttributes.noopWithEmptyAxes),\n {inputs: [0]});\n };\n\nconst reduceLogSumNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(0);`,\n '',\n `value += ${input.getByIndices('input_indices')};`,\n 'value = log(value);',\n ];\n runReduceProgram(context, 'ReduceLogSum', attributes, reduceOp);\n};\n\nconst reduceL1Naive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(0);`,\n '',\n `value += abs(${input.getByIndices('input_indices')});`,\n '',\n ];\n runReduceProgram(context, 'ReduceL1', attributes, reduceOp);\n};\n\nconst reduceL2Naive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var t = ${output.type.value}(0); var value = ${output.type.value}(0);`,\n '',\n `t = ${input.getByIndices('input_indices')}; value += (t * t);`,\n 'value = sqrt(value);',\n ];\n runReduceProgram(context, 'ReduceL2', attributes, reduceOp);\n};\n\nconst reduceLogSumExpNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(0);`,\n '',\n `value += exp(${input.getByIndices('input_indices')});`,\n 'value = log(value);',\n ];\n runReduceProgram(context, 'ReduceLogSumExp', attributes, reduceOp);\n};\n\nconst reduceMaxNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, _output, axes) => {\n const idxZero = [];\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(input.indicesSet('input_indices', k, 0));\n }\n }\n\n return [\n `${idxZero.join('\\n')}`,\n `var value = ${input.getByIndices('input_indices')};`,\n `value = max(value, ${input.getByIndices('input_indices')});`,\n '',\n ];\n };\n runReduceProgram(context, 'ReduceMax', attributes, reduceOp);\n};\n\nconst reduceMeanNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output, axes) => {\n let size = 1.0;\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n // TODO: this depends on the input dims. If we want to use uniform, this need to be updated.\n size *= context.inputs[0].dims[k];\n }\n }\n\n return [\n 'var sum = f32(0);',\n '',\n `sum += f32(${input.getByIndices('input_indices')});`,\n `let value = ${output.type.value}(sum / ${size});`,\n ];\n };\n runReduceProgram(context, 'ReduceMean', attributes, reduceOp);\n};\n\nconst reduceMinNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, _output, axes) => {\n const idxZero = [];\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(`input_indices[${k}] = 0;`); // first element\n }\n }\n\n return [\n `${idxZero.join('\\n')}`,\n `var value = ${input.getByIndices('input_indices')};`,\n `value = min(value, ${input.getByIndices('input_indices')});`,\n '',\n ];\n };\n runReduceProgram(context, 'ReduceMin', attributes, reduceOp);\n};\n\nconst reduceProdNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(1);`,\n '',\n `value *= ${input.getByIndices('input_indices')};`,\n '',\n ];\n runReduceProgram(context, 'ReduceProd', attributes, reduceOp);\n};\n\nconst reduceSumNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var value = ${output.type.storage}(0);`,\n '',\n `value += ${input.getByIndices('input_indices')};`,\n '',\n ];\n runReduceProgram(context, 'ReduceSum', attributes, reduceOp);\n};\n\nconst reduceSumSquareNaive = (context: ComputeContext, attributes: ReduceAttributes): void => {\n validateInputs(context.inputs);\n const reduceOp: ReduceOp = (input, output) =>\n [`var t = ${output.type.value}(0); var value = ${output.type.value}(0);`,\n '',\n `t = ${input.getByIndices('input_indices')}; value += t * t;`,\n '',\n ];\n runReduceProgram(context, 'ReduceSumSquare', attributes, reduceOp);\n};\n\nconst useNaiveReduceMethod =\n (shape: readonly number[], axes: readonly number[], noopWithEmptyAxes: boolean): boolean => {\n if (axes.length === 0) {\n return noopWithEmptyAxes;\n }\n\n let outputSize = 1;\n let reduceSize = 1;\n for (let dim = 0; dim < axes.length; dim++) {\n if (axes.indexOf(dim) === -1) {\n outputSize *= shape[dim];\n } else {\n reduceSize *= shape[dim];\n }\n }\n\n // The condition data is very rough, although considering the count of Execution Unit (EU), the potential\n // work groups in a EU and the counts of loops in the naive and shared methods, also doing experiments\n // on some machines.\n return reduceSize < 32 && outputSize > 1024;\n };\n\nexport const reduceMean = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceMeanNaive(context, attributes);\n } else {\n reduceMeanShared(context, attributes);\n }\n};\n\nexport const reduceL1 = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceL1Naive(context, attributes);\n } else {\n reduceL1Shared(context, attributes);\n }\n};\n\nexport const reduceL2 = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceL2Naive(context, attributes);\n } else {\n reduceL2Shared(context, attributes);\n }\n};\n\nexport const reduceLogSumExp = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceLogSumExpNaive(context, attributes);\n } else {\n reduceLogSumExpShared(context, attributes);\n }\n};\n\nexport const reduceMax = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceMaxNaive(context, attributes);\n } else {\n reduceMaxShared(context, attributes);\n }\n};\n\nexport const reduceMin = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceMinNaive(context, attributes);\n } else {\n reduceMinShared(context, attributes);\n }\n};\n\nexport const reduceProd = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceProdNaive(context, attributes);\n } else {\n reduceProdShared(context, attributes);\n }\n};\n\nexport const reduceSum = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceSumNaive(context, attributes);\n } else {\n reduceSumShared(context, attributes);\n }\n};\n\nexport const reduceSumSquare = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceSumSquareNaive(context, attributes);\n } else {\n reduceSumSquareShared(context, attributes);\n }\n};\n\nexport const reduceLogSum = (context: ComputeContext, attributes: ReduceAttributes): void => {\n if (useNaiveReduceMethod(context.inputs[0].dims, attributes.axes, attributes.noopWithEmptyAxes)) {\n reduceLogSumNaive(context, attributes);\n } else {\n reduceLogSumShared(context, attributes);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// TODO: this is the same naive implementation we use for reduce that has\n// performance limitations when the reduced axis is long. Need to add\n// a optimized codepath for this.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext} from '../types';\n\nimport {createReduceProgramInfo, ReduceOp} from './reduce';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length === 0 || inputs.length > 2) {\n throw new Error('ArgMinMaxOp op requires 1 or 2 inputs.');\n }\n if (inputs[0].dataType !== DataType.float) {\n throw new Error('Invalid input type.');\n }\n};\n\nexport interface ArgMinMaxAttributes extends AttributeWithCacheKey {\n keepDims: boolean;\n axis: number;\n selectLastIndex: number;\n}\n\nexport const argMin = (context: ComputeContext, attributes: ArgMinMaxAttributes): void => {\n validateInputs(context.inputs);\n const argMinMaxOp: ReduceOp = (input, output, axes) => {\n const idxZero = [];\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(`input_indices[${k}] = 0;`); // first element\n }\n }\n return [\n `${idxZero.join('\\n')}`, `var value = ${input.getByIndices('input_indices')};\\nvar best_index : i32 = 0;`,\n `if (${input.getByIndices('input_indices')} ${attributes.selectLastIndex > 0 ? '<=' : '<'} value) {\n value = ${input.getByIndices('input_indices')};\n best_index = i32(last_index);\n }`,\n '', output.setByOffset('global_idx', 'best_index')\n ];\n };\n\n context.compute(\n createReduceProgramInfo(\n 'ArgMin', {hint: attributes.cacheKey, inputDependencies: ['rank']}, [context.inputs[0]], argMinMaxOp,\n [attributes.axis], DataType.int64, attributes.keepDims),\n {inputs: [0]});\n};\n\nexport const argMax = (context: ComputeContext, attributes: ArgMinMaxAttributes): void => {\n validateInputs(context.inputs);\n const argMinMaxOp: ReduceOp = (input, output, axes) => {\n const idxZero = [];\n for (let k = 0; k < input.rank; k++) {\n if (axes.indexOf(k) >= 0 || axes.length === 0) {\n idxZero.push(`input_indices[${k}] = 0;`); // first element\n }\n }\n return [\n `${idxZero.join('\\n')}`, `var value = ${input.getByIndices('input_indices')};\\nvar best_index : i32 = 0;`,\n `if (${input.getByIndices('input_indices')} ${attributes.selectLastIndex > 0 ? '>=' : '>'} value) {\n value = ${input.getByIndices('input_indices')};\n best_index = i32(last_index);\n }`,\n '', output.setByOffset('global_idx', 'best_index')\n ];\n };\n\n context.compute(\n createReduceProgramInfo(\n 'argMax', {hint: attributes.cacheKey, inputDependencies: ['rank']}, [context.inputs[0]], argMinMaxOp,\n [attributes.axis], DataType.int64, attributes.keepDims),\n {inputs: [0]});\n};\n\nexport const parseArgMinMaxAttributes = (attributes: Record): ArgMinMaxAttributes =>\n createAttributeWithCacheKey(attributes as Omit);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ComputeContext, GpuDataType, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {getMaxComponents, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, tensorTypeToWsglValueType, UniformDataElementType, UniformsArrayType} from './common';\n\nexport const enum AttentionQkvFormat {\n unknown, // enum value not set, or depends on qkv projection implementation details\n qkvBNSH, // for non-packed qkv, permuted\n qkvBSNH, // for non-packed qkv, not permuted, used by memory efficient attention or MultiHeadAttention\n qkvBSN3H, // for TRT fused attention, qkv are packed\n qkvBNSHqkvBS3NH, // for TRT fused causal attention, data has two formats (qkv is 3BNSH, gemm_buffer is BS3NH)\n qKvBSNHxBSN2H, // for TRT fused cross attention, kv are packed\n qkvTNH, // for memory efficient attention, qkv are not packed, and paddings are removed.\n qkvTN3H, // for TRT fused attention, qkv are packed and paddings are removed\n}\n\nexport const enum AttentionMaskType {\n none, // No mask\n mask1dKeySeqLen, // [batch_size], key sequence length\n mask1dEndStart, // [2 * batch_size] with end positions and start positions\n mask1DKeySeqLenStart, // [3 * batch_size + 2] with [key_len[0], ..., key_len[batch_size - 1], query_start[0],\n // ..., query_start[batch_size - 1], query_end[batch_size - 1], key_start[0], ...,\n // key_start[batch_size - 1], key_end[batch_size - 1]]\n mask2dDummy, // dummy mask with shape [1, 1] or [batch_size, 1]. It has same effect as no mask.\n mask2dKeyPadding, // [batch_size, total_sequence_length]\n mask3dAttention, // [batch_size, sequence_length, total_sequence_length]\n mask4dMegatron, // Megatron causal mask with shape [batch_size, 1, max_sequence_length, max_sequence_length]\n maskUnknown\n}\n\nexport interface AttentionParameters {\n batchSize: number;\n sequenceLength: number;\n pastSequenceLength: number;\n kvSequenceLength: number;\n totalSequenceLength: number;\n maxSequenceLength: number;\n inputHiddenSize: number;\n hiddenSize: number;\n vHiddenSize: number;\n headSize: number;\n vHeadSize: number;\n numHeads: number;\n kvNumHeads?: number;\n nReps?: number;\n isUnidirectional?: boolean;\n pastPresentShareBuffer: boolean;\n maskFilterValue?: number;\n maskType: AttentionMaskType;\n scale: number;\n broadcastResPosBias: boolean;\n passPastInKv: boolean;\n qkvFormat: AttentionQkvFormat;\n isPastkvBSNH?: boolean;\n}\n\nexport interface AttentionAttrs {\n numHeads: number;\n kvNumHeads?: number;\n isUnidirectional?: number;\n maskFilterValue?: number;\n scale: number;\n doRotary: number;\n qkvHiddenSizes: number[];\n pastPresentShareBuffer: boolean;\n}\n\nconst validateAttentionInputs = (inputs: readonly TensorView[], attributes: AttentionAttrs): AttentionParameters => {\n // Abbreviation and Meanings:\n // B: batch_size\n // S: sequence_length (input sequence length of query)\n // P: past_sequence_length (past sequence length of key or value)\n // L: kv_sequence_length (input sequence length of key or value)\n // M: max_sequence_length\n // T: total_sequence_length = past_sequence_length + kv_sequence_length\n // N: num_heads\n // H: head size for Q and K, aka q_head_size or k_head_size or qk_head_size\n // H_v: v_head_size\n // D_i: input hidden size\n // D: hidden size for Q and K (D = N * H), aka q_hidden_size or k_hidden_size or qk_hidden_size\n // D_v: v_hidden_size = num_heads * v_head_size\n\n // When past state is used, Q, K and V should have same hidden size (unless we split it into past_key and past_value).\n\n // Input shapes:\n // input (Q/K/V) : (B, S, D_i)\n // weights (Q/K/V) : (D_i, D + D + D_v)\n // bias (Q/K/V) : (D + D + D_v)\n // mask_index : see below\n // past (K/V) : (2, B, N, P, H) or NULL\n // relative_position_bias : (B, N, S, T) or NULL\n\n // For mask_index, the following shapes are supported:\n // NULL, (B, 1), (1, 1)\n // (B), (2 * B), (3 * B + 2)\n // (B, T)\n // (B, S, T)\n // (B, 1, M, M)\n //\n // When a model is pruned (like some attention heads are removed in Q/K/V), input_hidden_size could be larger\n // than hidden dimension of Q, K and V.\n\n const input = inputs[0];\n const weights = inputs[1];\n const bias = inputs[2];\n const maskIndex = inputs[3];\n const past = inputs[4];\n const relativePositionBias = inputs[5];\n\n if (past && relativePositionBias) {\n throw new Error('Attention cannot have both past and relative_position_bias');\n }\n\n if (input.dims.length !== 3) {\n throw new Error('Input \"input\" must have 3 dimensions');\n }\n\n const batchSize = input.dims[0];\n const sequenceLength = input.dims[1];\n const inputHiddenSize = input.dims[2];\n\n if (bias.dims.length !== 1) {\n throw new Error('Input \"bias\" is expected to have 1 dimensions');\n }\n\n if (weights.dims.length !== 2) {\n throw new Error('Input \"weights\" is expected to have 2 dimensions');\n }\n\n if (weights.dims[0] !== inputHiddenSize) {\n throw new Error('Input 1 dimension 0 should have same length as dimension 2 of input 0');\n }\n\n if (bias.dims[0] !== weights.dims[1]) {\n throw new Error('Input \"bias\" dimension 0 should have same length as dimension 1 of input \"weights\"');\n }\n\n let qHiddenSize = bias.dims[0] / 3;\n let kHiddenSize = qHiddenSize;\n let vHiddenSize = kHiddenSize;\n if (attributes.qkvHiddenSizes.length > 0) {\n if (attributes.qkvHiddenSizes.length !== 3) {\n throw new Error('qkv_hidden_sizes attribute should have 3 elements');\n }\n for (const sz of attributes.qkvHiddenSizes) {\n if (sz % attributes.numHeads !== 0) {\n throw new Error('qkv_hidden_sizes should be divisible by num_heads');\n }\n }\n\n qHiddenSize = attributes.qkvHiddenSizes[0];\n kHiddenSize = attributes.qkvHiddenSizes[1];\n vHiddenSize = attributes.qkvHiddenSizes[2];\n }\n\n const kvSequenceLength = sequenceLength;\n\n if (qHiddenSize !== kHiddenSize) {\n throw new Error('qkv_hidden_sizes first element should be same as the second');\n }\n\n if (bias.dims[0] !== qHiddenSize + kHiddenSize + vHiddenSize) {\n throw new Error('Input \"bias\" dimension 0 should have same length as sum of Q/K/V hidden sizes');\n }\n\n let pastSequenceLength = 0;\n if (past) {\n if (kHiddenSize !== vHiddenSize) {\n throw new Error('Input \"past\" expect k_hidden_size == v_hidden_size');\n }\n if (past.dims.length !== 5) {\n throw new Error('Input \"past\" must have 5 dimensions');\n }\n if (past.dims[0] !== 2) {\n throw new Error('Input \"past\" first dimension must be 2');\n }\n if (past.dims[1] !== batchSize) {\n throw new Error('Input \"past\" second dimension must be batch_size');\n }\n if (past.dims[2] !== attributes.numHeads) {\n throw new Error('Input \"past\" third dimension must be num_heads');\n }\n if (past.dims[4] !== kHiddenSize / attributes.numHeads) {\n throw new Error('Input \"past\" fifth dimension must be k_hidden_size / num_heads');\n }\n\n if (!attributes.pastPresentShareBuffer) {\n pastSequenceLength = past.dims[3];\n }\n // TODO: handle past_seq_len\n }\n\n const totalSequenceLength = kvSequenceLength + pastSequenceLength;\n const maxSequenceLength = -1;\n\n const maskType = AttentionMaskType.none;\n if (maskIndex) {\n // maskType = AttentionMaskType.MASK_UNKNOWN;\n // TODO: handle mask\n throw new Error('Mask not supported');\n }\n\n if (past) {\n throw new Error('past is not supported');\n }\n\n return {\n batchSize,\n sequenceLength,\n pastSequenceLength,\n kvSequenceLength,\n totalSequenceLength,\n maxSequenceLength,\n inputHiddenSize,\n hiddenSize: qHiddenSize,\n vHiddenSize,\n headSize: Math.floor(qHiddenSize / attributes.numHeads),\n vHeadSize: Math.floor(vHiddenSize / attributes.numHeads),\n numHeads: attributes.numHeads,\n isUnidirectional: false,\n pastPresentShareBuffer: false,\n maskFilterValue: attributes.maskFilterValue,\n maskType,\n scale: attributes.scale,\n broadcastResPosBias: false,\n passPastInKv: false,\n qkvFormat: AttentionQkvFormat.qkvBNSH,\n };\n};\n\nconst createInPlaceSoftmaxProgramInfo = (_context: ComputeContext, input: TensorView, n: number, d: number) => {\n const components = getMaxComponents(d);\n let WG = 64;\n const dComp = d / components;\n if (dComp < WG) {\n WG = 1;\n } else if (dComp / 8 < 64) {\n WG = Math.ceil(dComp / 8);\n }\n const elementsPerThread = Math.ceil(d / components / WG);\n const programUniforms: ProgramUniform[] = [\n {type: input.dataType, data: 1 / d}, {type: DataType.uint32, data: dComp},\n {type: DataType.uint32, data: elementsPerThread}\n ];\n const dataType = tensorTypeToWsglStorageType(input.dataType, components);\n const f32Type = tensorTypeToWsglValueType(DataType.float, components);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const inputHelper = outputVariable('x', input.dataType, input.dims, components);\n const elemValueType = tensorTypeToWsglValueType(input.dataType);\n const uniforms: UniformsArrayType = [\n {name: 'd_inv', type: elemValueType as UniformDataElementType}, {name: 'd_comp', type: 'u32'},\n {name: 'elements_per_thread', type: 'u32'}\n ];\n\n return `\n var thread_max: array;\n var thread_sum: array;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(inputHelper)}\n ${shaderHelper.mainStart([\n WG, 1, 1\n ])}\n let local_offset = local_idx * uniforms.elements_per_thread;\n let offset = workgroup_id.x * uniforms.d_comp + local_offset;\n\n var thread_max_vector = ${f32Type}(-3.402823e+38f);\n for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < uniforms.d_comp; i++) {\n thread_max_vector = max(${f32Type}(x[offset + i]), thread_max_vector);\n }\n thread_max[local_idx] = ${(() => {\n switch (components) {\n case 1:\n return 'thread_max_vector';\n case 2:\n return 'max(thread_max_vector.x, thread_max_vector.y)';\n case 4:\n return 'max(max(thread_max_vector.x, thread_max_vector.y), max(thread_max_vector.z, thread_max_vector.w))';\n default:\n throw new Error(`Unsupported components: ${components}`);\n }\n })()};\n workgroupBarrier();\n\n var max_value = f32(-3.402823e+38f);\n for (var i = 0u; i < ${WG}; i++) {\n max_value = max(thread_max[i], max_value);\n }\n\n var sum_vector = ${f32Type}(0);\n for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < uniforms.d_comp; i++) {\n sum_vector += exp(${f32Type}(x[offset + i]) - max_value);\n }\n thread_sum[local_idx] = ${(() => {\n switch (components) {\n case 1:\n return 'sum_vector';\n case 2:\n return 'sum_vector.x + sum_vector.y';\n case 4:\n return 'sum_vector.x + sum_vector.y + sum_vector.z + sum_vector.w';\n default:\n throw new Error(`Unsupported components: ${components}`);\n }\n })()};\n workgroupBarrier();\n\n var sum: f32 = 0;\n for (var i = 0u; i < ${WG}; i++) {\n sum += thread_sum[i];\n }\n\n if (sum == 0) {\n for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < uniforms.d_comp; i++) {\n x[offset + i] = ${inputHelper.type.value}(uniforms.d_inv);\n }\n } else {\n for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < uniforms.d_comp; i++) {\n var f32input = ${f32Type}(x[offset + i]);\n x[offset + i] = ${inputHelper.type.value}(exp(f32input - max_value) / sum);\n }\n }\n }`;\n };\n\n return {\n name: 'AttentionProbsSoftmax',\n shaderCache: {hint: `${WG};${dataType};${components}`},\n getShaderSource,\n getRunData: () => ({outputs: [], dispatchGroup: {x: n}, programUniforms}),\n };\n};\n\nconst createAttentionProbsProgramInfo =\n (context: ComputeContext, q: TensorView, key: TensorView, pastKey: TensorView|undefined,\n relativePositionBias: TensorView|undefined, parameters: AttentionParameters, attributes: AttentionAttrs,\n pastSequenceLength: number) => {\n const totalSequenceLength = pastSequenceLength + parameters.kvSequenceLength;\n const probsShape = [parameters.batchSize, parameters.numHeads, parameters.sequenceLength, totalSequenceLength];\n const presentKey = parameters.kvNumHeads === undefined && context.outputCount > 1;\n const presentKeyShape = presentKey ?\n [parameters.batchSize, parameters.numHeads, totalSequenceLength, parameters.headSize] :\n undefined;\n\n // TODO: handle mask\n\n const alpha = attributes.scale === 0 ? 1.0 / Math.sqrt(parameters.headSize) : attributes.scale;\n const components = getMaxComponents(parameters.headSize);\n const vectorizedHeadSize = parameters.headSize / components;\n const TILE_SIZE = 12;\n const dispatch = {\n x: Math.ceil(totalSequenceLength / TILE_SIZE),\n y: Math.ceil(parameters.sequenceLength / TILE_SIZE),\n z: parameters.batchSize * parameters.numHeads\n };\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: parameters.sequenceLength}, {type: DataType.uint32, data: vectorizedHeadSize},\n {type: DataType.uint32, data: totalSequenceLength}, {type: DataType.uint32, data: parameters.numHeads},\n {type: DataType.float, data: alpha}, {type: DataType.uint32, data: pastSequenceLength},\n {type: DataType.uint32, data: parameters.kvSequenceLength}\n ];\n\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type'];\n if (pastKey) {\n inputDependencies.push('type');\n }\n if (relativePositionBias) {\n inputDependencies.push('type');\n }\n const outputs = [{dims: probsShape, dataType: q.dataType, gpuDataType: GpuDataType.default}];\n if (presentKey) {\n outputs.push({dims: presentKeyShape!, dataType: q.dataType, gpuDataType: GpuDataType.default});\n }\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const qInput = inputVariable('q', q.dataType, q.dims, components);\n const kInput = inputVariable('key', key.dataType, key.dims, components);\n const inputVars = [qInput, kInput];\n if (pastKey) {\n const pastKeyInput = inputVariable('past_key', pastKey.dataType, pastKey.dims, components);\n inputVars.push(pastKeyInput);\n }\n if (relativePositionBias) {\n inputVars.push(\n inputVariable('relative_position_bias', relativePositionBias.dataType, relativePositionBias.dims));\n }\n const output = outputVariable('output', q.dataType, probsShape);\n const outputVars = [output];\n if (presentKey) {\n outputVars.push(outputVariable('present_key', q.dataType, presentKeyShape!, components));\n }\n const f32Type = tensorTypeToWsglValueType(DataType.float, components);\n\n const uniforms: UniformsArrayType = [\n {name: 'M', type: 'u32'}, {name: 'K', type: 'u32'}, {name: 'N', type: 'u32'},\n {name: 'num_heads', type: 'u32'}, {name: 'alpha', type: 'f32' as UniformDataElementType},\n {name: 'past_sequence_length', type: 'u32'}, {name: 'kv_sequence_length', type: 'u32'}\n ];\n return `\n const TILE_SIZE = ${TILE_SIZE}u;\n\n var tileQ: array<${qInput.type.storage}, ${TILE_SIZE * TILE_SIZE}>;\n var tileK: array<${qInput.type.storage}, ${TILE_SIZE * TILE_SIZE}>;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVars, ...outputVars)}\n ${shaderHelper.mainStart([\n TILE_SIZE, TILE_SIZE, 1\n ])}\n // x holds the N and y holds the M\n let headIdx = workgroup_id.z;\n let m = workgroup_id.y * TILE_SIZE;\n let n = workgroup_id.x * TILE_SIZE;\n let qOffset = uniforms.M * uniforms.K * headIdx + m * uniforms.K;\n ${(() => {\n if (pastKey && presentKey) {\n return `\n let kOffset = uniforms.kv_sequence_length * uniforms.K * headIdx;\n let pastKeyOffset = uniforms.past_sequence_length * uniforms.K * headIdx;`;\n } else {\n return `\n let kOffset = uniforms.N * uniforms.K * headIdx + n * uniforms.K;`;\n }\n })()}\n ${presentKey ? 'let presentKeyOffset = headIdx * uniforms.N * uniforms.K;' : ''}\n var value = ${f32Type}(0);\n for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) {\n if (global_id.y < uniforms.M && w + local_id.x < uniforms.K) {\n tileQ[TILE_SIZE * local_id.y + local_id.x] = q[qOffset + local_id.y * uniforms.K + w + local_id.x];\n }\n if (n + local_id.y < uniforms.N && w + local_id.x < uniforms.K) {\n var idx = TILE_SIZE * local_id.y + local_id.x;\n ${(() => {\n if (pastKey && presentKey) {\n return `\n if (n + local_id.y < uniforms.past_sequence_length) {\n tileK[idx] = past_key[pastKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x];\n } else {\n tileK[idx] =\n key[kOffset + (n + local_id.y - uniforms.past_sequence_length) * uniforms.K + w + local_id.x];\n }`;\n } else {\n return 'tileK[idx] = key[kOffset + local_id.y * uniforms.K + w + local_id.x];';\n }\n })()}\n ${\n presentKey ?\n 'present_key[presentKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x] = tileK[idx];' :\n ''}\n }\n workgroupBarrier();\n\n for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) {\n value += ${f32Type}(tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * local_id.x + k]);\n }\n\n workgroupBarrier();\n }\n\n let headOffset = headIdx * uniforms.M * uniforms.N;\n if (global_id.y < uniforms.M && global_id.x < uniforms.N) {\n let outputIdx = headOffset + global_id.y * uniforms.N + global_id.x;\n var sum: f32 = ${(() => {\n switch (components) {\n case 1:\n return 'value';\n case 2:\n return 'value.x + value.y';\n case 4:\n return 'value.x + value.y + value.z + value.w';\n default:\n throw new Error(`Unsupported components: ${components}`);\n }\n })()};\n output[outputIdx] = ${output.type.value} (sum * uniforms.alpha) + ${\n relativePositionBias ? 'relative_position_bias[outputIdx]' : '0.0'};\n }\n }`;\n };\n return {\n name: 'AttentionProbs',\n shaderCache: {\n hint: `${components};${relativePositionBias !== undefined};${pastKey !== undefined};${context.outputCount}`,\n inputDependencies\n },\n getRunData: () => ({outputs, dispatchGroup: dispatch, programUniforms}),\n getShaderSource,\n };\n };\n\n\nconst createVxAttentionScoreProgramInfo =\n (context: ComputeContext, probs: TensorView, v: TensorView, pastValue: TensorView|undefined,\n params: AttentionParameters, pastSequenceLength: number) => {\n const totalSequenceLength = pastSequenceLength + params.kvSequenceLength;\n const nReps = params.nReps ? params.nReps : 1;\n const repeatedVHiddenSize = params.vHiddenSize * nReps;\n const presentValue = params.kvNumHeads == null && context.outputCount > 1;\n const presentValueShape =\n presentValue ? [params.batchSize, params.numHeads, totalSequenceLength, params.headSize] : undefined;\n const outputShape = [params.batchSize, params.sequenceLength, repeatedVHiddenSize];\n const TILE_SIZE = 12;\n const dispatch = {\n x: Math.ceil(params.vHeadSize / TILE_SIZE),\n y: Math.ceil(params.sequenceLength / TILE_SIZE),\n z: params.batchSize * params.numHeads\n };\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: params.sequenceLength}, {type: DataType.uint32, data: totalSequenceLength},\n {type: DataType.uint32, data: params.vHeadSize}, {type: DataType.uint32, data: params.numHeads},\n {type: DataType.uint32, data: repeatedVHiddenSize}, {type: DataType.uint32, data: pastSequenceLength},\n {type: DataType.uint32, data: params.kvSequenceLength}\n ];\n const inputDependencies: ProgramInputTensorInfoDependency[] =\n pastValue ? ['type', 'type', 'type'] : ['type', 'type'];\n const outputs = [{dims: outputShape, dataType: probs.dataType, gpuDataType: GpuDataType.default}];\n if (presentValue) {\n outputs.push({dims: presentValueShape!, dataType: probs.dataType, gpuDataType: GpuDataType.default});\n }\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const probsHelper = inputVariable('probs', probs.dataType, probs.dims);\n const vHelper = inputVariable('v', v.dataType, v.dims);\n const inputVars = [probsHelper, vHelper];\n if (pastValue) {\n inputVars.push(inputVariable('past_value', pastValue.dataType, pastValue.dims));\n }\n const output = outputVariable('output', probs.dataType, outputShape);\n const outputVars = [output];\n if (presentValue) {\n outputVars.push(outputVariable('present_value', probs.dataType, presentValueShape!));\n }\n const uniforms: UniformsArrayType = [\n {name: 'M', type: 'u32'}, {name: 'K', type: 'u32'}, {name: 'N', type: 'u32'},\n {name: 'num_heads', type: 'u32'}, {name: 'v_hidden_size', type: 'u32'},\n {name: 'past_sequence_length', type: 'u32'}, {name: 'kv_sequence_length', type: 'u32'}\n ];\n return `\n const TILE_SIZE = ${TILE_SIZE}u;\n var tileQ: array<${probsHelper.type.value}, ${TILE_SIZE * TILE_SIZE}>;\n var tileK: array<${probsHelper.type.value}, ${TILE_SIZE * TILE_SIZE}>;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVars, ...outputVars)}\n ${shaderHelper.mainStart([\n TILE_SIZE, TILE_SIZE, 1\n ])}\n let headIdx = workgroup_id.z;\n let m = global_id.y;\n let n = global_id.x;\n\n let offsetA = headIdx * (uniforms.M * uniforms.K) + m * uniforms.K;\n ${(() => {\n if (pastValue && presentValue) {\n return `\n let pastValueOffset = headIdx * uniforms.N * uniforms.past_sequence_length + n;\n let vOffset = headIdx * uniforms.N * uniforms.kv_sequence_length + n;\n `;\n } else {\n return `\n let offsetB = headIdx * uniforms.N * uniforms.K + n;\n `;\n }\n })()}\n ${presentValue ? 'let presentValueOffset = headIdx * uniforms.N * uniforms.K + n;' : ''}\n var value = ${probsHelper.type.storage}(0);\n for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) {\n if (m < uniforms.M && w + local_id.x < uniforms.K) {\n tileQ[TILE_SIZE * local_id.y + local_id.x] = probs[offsetA + w + local_id.x];\n }\n if (n < uniforms.N && w + local_id.y < uniforms.K) {\n var idx = TILE_SIZE * local_id.y + local_id.x;\n ${(() => {\n if (pastValue && presentValue) {\n return `\n if (w + local_id.y < uniforms.past_sequence_length) {\n tileK[idx] = past_value[pastValueOffset + (w + local_id.y) * uniforms.N];\n } else {\n tileK[idx] = v[vOffset + (w + local_id.y - uniforms.past_sequence_length) * uniforms.N];\n }\n `;\n } else {\n return `\n tileK[idx] = v[offsetB + (w + local_id.y) * uniforms.N];\n `;\n }\n })()}\n ${presentValue ? 'present_value[presentValueOffset + (w + local_id.y) * uniforms.N] = tileK[idx];' : ''}\n }\n workgroupBarrier();\n for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) {\n value += tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * k + local_id.x];\n }\n workgroupBarrier();\n }\n\n // we need to transpose output from BNSH_v to BSND_v\n let batchIdx = workgroup_id.z / uniforms.num_heads;\n let currentBatchHeadNumber = workgroup_id.z % uniforms.num_heads;\n if (m < uniforms.M && n < uniforms.N) {\n let outputIdx = batchIdx * uniforms.M * uniforms.v_hidden_size + m * uniforms.v_hidden_size\n + currentBatchHeadNumber * uniforms.N + n;\n output[outputIdx] = value;\n }\n }`;\n };\n\n return {\n name: 'AttentionScore',\n shaderCache: {hint: `${pastValue !== undefined};${context.outputCount}`, inputDependencies},\n getRunData: () => ({outputs, dispatchGroup: dispatch, programUniforms}),\n getShaderSource,\n };\n };\n\nexport const applyAttention =\n (context: ComputeContext, q: TensorView, k: TensorView, v: TensorView, _maskIndex: TensorView|undefined,\n _past: TensorView|undefined, pastKey: TensorView|undefined, pastValue: TensorView|undefined,\n relativePositionBias: TensorView|undefined, parameters: AttentionParameters, attributes: AttentionAttrs) => {\n const outputCount = context.outputCount;\n const pastSequenceLength =\n parameters.kvNumHeads !== undefined || outputCount > 1 ? parameters.pastSequenceLength : 0;\n const totalSequenceLength = pastSequenceLength + parameters.kvSequenceLength;\n\n const inputsK = (parameters.kvNumHeads === undefined && outputCount > 1 && pastKey) ? [q, k, pastKey] : [q, k];\n if (relativePositionBias) {\n inputsK.push(relativePositionBias);\n }\n\n // Run AttentionProbs\n const probs = context.compute(\n createAttentionProbsProgramInfo(\n context, q, k, outputCount > 1 ? pastKey : undefined, relativePositionBias, parameters, attributes,\n pastSequenceLength),\n {inputs: inputsK, outputs: (parameters.kvNumHeads === undefined && outputCount > 1) ? [-1, 1] : [-1]})[0];\n\n // Run Softmax\n context.compute(\n createInPlaceSoftmaxProgramInfo(\n context, probs, parameters.batchSize * parameters.numHeads * parameters.sequenceLength,\n totalSequenceLength),\n {inputs: [probs], outputs: []});\n\n // Run AttrionScore\n const inputsV =\n (parameters.kvNumHeads === undefined && outputCount > 1 && pastValue) ? [probs, v, pastValue] : [probs, v];\n context.compute(\n createVxAttentionScoreProgramInfo(\n context, probs, v, outputCount > 1 && pastValue ? pastValue : undefined, parameters, pastSequenceLength),\n {inputs: inputsV, outputs: (parameters.kvNumHeads === undefined && outputCount > 1) ? [0, 2] : [0]});\n };\n\nconst prepare = (context: ComputeContext, parameters: AttentionParameters) => {\n const outputShape = [\n parameters.batchSize,\n parameters.numHeads,\n parameters.sequenceLength,\n parameters.headSize,\n ];\n const M = parameters.sequenceLength;\n const K = parameters.inputHiddenSize;\n const N = parameters.headSize;\n const TILE_SIZE = 12;\n const dispatch = {\n x: Math.ceil(parameters.headSize / TILE_SIZE),\n y: Math.ceil(parameters.sequenceLength / TILE_SIZE),\n z: parameters.batchSize * parameters.numHeads\n };\n const inputs = [context.inputs[0], context.inputs[1], context.inputs[2]];\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: M}, {type: DataType.uint32, data: K}, {type: DataType.uint32, data: N},\n {type: DataType.uint32, data: parameters.numHeads}, {type: DataType.uint32, data: parameters.headSize},\n {type: DataType.uint32, data: parameters.hiddenSize},\n {type: DataType.uint32, data: parameters.hiddenSize + parameters.hiddenSize + parameters.vHiddenSize}\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const outputQ = outputVariable('output_q', inputs[0].dataType, outputShape);\n const outputK = outputVariable('output_k', inputs[0].dataType, outputShape);\n const outputV = outputVariable('output_v', inputs[0].dataType, outputShape);\n const input = inputVariable('input', inputs[0].dataType, inputs[0].dims);\n const weight = inputVariable('weight', inputs[1].dataType, inputs[1].dims);\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims);\n const dataType = input.type.storage;\n\n const uniforms: UniformsArrayType = [\n {name: 'M', type: 'u32'}, {name: 'K', type: 'u32'}, {name: 'N', type: 'u32'}, {name: 'num_heads', type: 'u32'},\n {name: 'head_size', type: 'u32'}, {name: 'hidden_size', type: 'u32'}, {name: 'ldb', type: 'u32'}\n ];\n return `\n const TILE_SIZE = ${TILE_SIZE}u;\n var tileInput: array<${dataType}, ${TILE_SIZE * TILE_SIZE}>;\n var tileWeightQ: array<${dataType}, ${TILE_SIZE * TILE_SIZE}>;\n var tileWeightK: array<${dataType}, ${TILE_SIZE * TILE_SIZE}>;\n var tileWeightV: array<${dataType}, ${TILE_SIZE * TILE_SIZE}>;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(input, weight, bias, outputQ, outputK, outputV)}\n ${shaderHelper.mainStart([\n TILE_SIZE, TILE_SIZE, 1\n ])}\n let batchIndex = workgroup_id.z / uniforms.num_heads;\n let headNumber = workgroup_id.z % uniforms.num_heads;\n let m = global_id.y;\n let n = global_id.x;\n\n let inputOffset = batchIndex * (uniforms.M * uniforms.K) + m * uniforms.K;\n let biasOffsetQ = headNumber * uniforms.head_size;\n let biasOffsetK = uniforms.hidden_size + biasOffsetQ;\n let biasOffsetV = uniforms.hidden_size + biasOffsetK;\n\n var valueQ = ${dataType}(0);\n var valueK = ${dataType}(0);\n var valueV = ${dataType}(0);\n for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) {\n if (m < uniforms.M && w + local_id.x < uniforms.K) {\n tileInput[TILE_SIZE * local_id.y + local_id.x] = input[inputOffset + w + local_id.x];\n }\n if (n < uniforms.N && w + local_id.y < uniforms.K) {\n let offset = n + (w + local_id.y) * uniforms.ldb;\n tileWeightQ[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetQ + offset];\n tileWeightK[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetK + offset];\n tileWeightV[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetV + offset];\n }\n workgroupBarrier();\n for (var k: u32 = 0u; k ({\n outputs: [\n {dims: outputShape, dataType: context.inputs[0].dataType, gpuDataType: GpuDataType.default},\n {dims: outputShape, dataType: context.inputs[0].dataType, gpuDataType: GpuDataType.default},\n {dims: outputShape, dataType: context.inputs[0].dataType, gpuDataType: GpuDataType.default},\n ],\n dispatchGroup: dispatch,\n programUniforms\n }),\n getShaderSource,\n },\n {inputs, outputs: [-1, -1, -1]});\n};\n\nexport const attention = (context: ComputeContext, attributes: AttentionAttrs): void => {\n const params = validateAttentionInputs(context.inputs, attributes);\n\n const [q, k, v] = prepare(context, params);\n\n return applyAttention(\n context, q, k, v, context.inputs[4], undefined, undefined, undefined, context.inputs[5], params, attributes);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, getMaxComponents, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface BatchNormAttributes extends AttributeWithCacheKey {\n readonly epsilon: number;\n readonly momentum: number;\n readonly spatial: boolean;\n readonly trainingMode: boolean;\n readonly format: 'NHWC'|'NCHW';\n readonly outputCount: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: BatchNormAttributes): void => {\n if (!inputs || inputs.length !== 5) {\n throw new Error('BatchNormalization requires 5 inputs');\n }\n\n const checkShapeEqual = (actual: readonly number[], expected: readonly number[], message: string) => {\n const r = expected.length;\n if (r !== actual.length) {\n throw new Error(`${message}: num dimensions != ${r}`);\n }\n expected.forEach((v, i) => {\n if (v !== actual[i]) {\n throw new Error(`${message}: dim[${i}] do not match`);\n }\n });\n };\n\n if (inputs[0].dims.length > 1) {\n const shape = attributes.format === 'NHWC' ?\n (attributes.spatial ? inputs[0].dims.slice(-1) :\n inputs[0].dims.slice(-1).concat(inputs[0].dims.slice(1, inputs[0].dims.length - 1))) :\n inputs[0].dims.slice(1, attributes.spatial ? 2 : undefined);\n checkShapeEqual(inputs[1].dims, shape, 'Invalid input scale');\n checkShapeEqual(inputs[2].dims, shape, 'Invalid input B');\n checkShapeEqual(inputs[3].dims, shape, 'Invalid input mean');\n checkShapeEqual(inputs[4].dims, shape, 'Invalid input var');\n } else {\n checkShapeEqual(inputs[1].dims, [1], 'Invalid input scale');\n checkShapeEqual(inputs[2].dims, [1], 'Invalid input B');\n checkShapeEqual(inputs[3].dims, [1], 'Invalid input mean');\n checkShapeEqual(inputs[4].dims, [1], 'Invalid input var');\n }\n};\n\nconst createBatchNormInferenceProgramInfo =\n (inputs: readonly TensorView[], attributes: BatchNormAttributes): ProgramInfo => {\n const {epsilon, spatial, format} = attributes;\n const yShape = inputs[0].dims;\n const components = spatial ? getMaxComponents(yShape[yShape.length - 1]) : 1;\n const cComponents = format === 'NHWC' && yShape.length > 1 ? components : 1;\n const outputSize = ShapeUtil.size(yShape) / components;\n // Only support uniforms for opset version >= 9 (spatial = true).\n const useShapesUniforms = spatial;\n const shapeOrRank = useShapesUniforms ? yShape.length : yShape;\n const x = inputVariable('x', inputs[0].dataType, inputs[0].dims, components);\n const scale = inputVariable('scale', inputs[1].dataType, inputs[1].dims, cComponents);\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims, cComponents);\n const inputMean = inputVariable('inputMean', inputs[3].dataType, inputs[3].dims, cComponents);\n const inputVar = inputVariable('inputVar', inputs[4].dataType, inputs[4].dims, cComponents);\n const y = outputVariable('y', inputs[0].dataType, shapeOrRank, components);\n // TODO: support inputs with different data type. Current we need to make sure all inputs have the same data type.\n // Otherwise, the shader compilation will fail.\n const calcCOffset = (): string => {\n let cOffset = '';\n if (spatial) {\n cOffset = `let cOffset = ${\n yShape.length === 1 ? '0u' :\n format === 'NHWC' ? `outputIndices[${yShape.length - 1}] / ${components}` :\n 'outputIndices[1]'};`;\n } else {\n if (format === 'NCHW') {\n cOffset = `\n ${y.indicesSet('outputIndices', '0', '0')}\n let cOffset = ${y.indicesToOffset('outputIndices')};`;\n } else {\n // update C channel.\n cOffset = `var cIndices = ${scale.type.indices}(0);\n cIndices[0] = outputIndices[${yShape.length - 1}];`;\n // update D1 x ... x Dn channels.\n for (let i = 1; i < scale.rank; i++) {\n cOffset += `cIndices[${i}] = outputIndices[${i}];`;\n }\n cOffset += `let cOffset = ${scale.indicesToOffset('cIndices')};`;\n }\n }\n return cOffset;\n };\n const getInferenceModeShaderSource = (helper: ShaderHelper) => `\n const epsilon = ${epsilon};\n ${helper.registerUniform('outputSize', 'u32').declareVariables(x, scale, bias, inputMean, inputVar, y)}\n ${helper.mainStart()}\n ${helper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n var outputIndices = ${y.offsetToIndices(`global_idx * ${components}`)};\n ${calcCOffset()}\n let scale = ${scale.getByOffset('cOffset')};\n let bias = ${bias.getByOffset('cOffset')};\n let inputMean = ${inputMean.getByOffset('cOffset')};\n let inputVar = ${inputVar.getByOffset('cOffset')};\n let x = ${x.getByOffset('global_idx')};\n let value = (x - inputMean) * inverseSqrt(inputVar + epsilon) * scale + bias;\n ${y.setByOffset('global_idx', 'value')}\n }`;\n return {\n name: 'BatchNormalization',\n shaderCache: {\n hint: `${attributes.epsilon}_${attributes.format}_${spatial}_${components}`,\n inputDependencies: useShapesUniforms ? ['rank', 'type', 'type', 'type', 'type'] : undefined,\n },\n getShaderSource: getInferenceModeShaderSource,\n getRunData: () => ({\n outputs: [{dims: inputs[0].dims, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms: useShapesUniforms ?\n [\n {type: DataType.uint32, data: outputSize},\n ...createTensorShapeVariables(yShape),\n ] :\n [\n {type: DataType.uint32, data: outputSize},\n ],\n }),\n };\n };\n\nexport const parseBatchNormAttributes = (attributes: Record): BatchNormAttributes =>\n createAttributeWithCacheKey(attributes as Omit);\n\nexport const batchNorm = (context: ComputeContext, attributes: Record): void => {\n const {inputs, outputCount} = context;\n const updatedAttributes = parseBatchNormAttributes({...attributes, outputCount});\n if (env.webgpu.validateInputContent) {\n validateInputs(inputs, updatedAttributes);\n }\n if (attributes.trainingMode) {\n throw new Error('BatchNormalization trainingMode is not supported yet.');\n } else {\n context.compute(createBatchNormInferenceProgramInfo(inputs, updatedAttributes));\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper} from './common';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (inputs[0].dims.length !== 3) {\n throw new Error('input should have 3 dimensions');\n }\n\n if (![320, 640, 1280].includes(inputs[0].dims[2])) {\n throw new Error('number of channels should be 320, 640 or 1280');\n }\n\n if (inputs[1].dims.length !== 1) {\n throw new Error('bias is expected to have 1 dimensions');\n }\n\n if (inputs[0].dims[2] !== inputs[1].dims[0]) {\n throw new Error('last dimension of input and bias are not the same');\n }\n};\n\nconst createBiasAddProgramInfo = (inputs: readonly TensorView[]): ProgramInfo => {\n const outputShape = inputs[0].dims;\n\n const channels = inputs[0].dims[2];\n // since channel number can be only 320/640/1280, it's always divisable by 4\n const outputSize = ShapeUtil.size(outputShape) / 4;\n\n const dataType = inputs[0].dataType;\n const input = inputVariable('input', dataType, outputShape, 4);\n const bias = inputVariable('bias', dataType, [channels], 4);\n const residual = inputVariable('residual', dataType, outputShape, 4);\n const output = outputVariable('output', dataType, outputShape, 4);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n const channels = ${channels}u / 4;\n ${shaderHelper.declareVariables(input, bias, residual, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes(outputSize)}\n let value = ${input.getByOffset('global_idx')}\n + ${bias.getByOffset('global_idx % channels')} + ${residual.getByOffset('global_idx')};\n ${output.setByOffset('global_idx', 'value')}\n }`;\n\n return {\n name: 'BiasAdd',\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)}\n }),\n getShaderSource,\n };\n};\n\nexport const biasAdd = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n context.compute(createBiasAddProgramInfo(context.inputs));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {MAX_CLIP, MIN_CLIP, ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglValueType} from './common';\n\ntype BuiltinFunctionName = string;\ntype ElementwiseCustomExpression = (expression: string) => string;\ntype ElementwiseFunctionCall = BuiltinFunctionName|ElementwiseCustomExpression;\n\nconst createElementwiseProgramShader =\n (shaderHelper: ShaderHelper, datasize: number, inputDataType: number, outputDataType: number,\n funcCall: ElementwiseFunctionCall, additionalImplementation?: string): string => {\n const vecSize = Math.ceil(datasize / 4);\n\n let expression = '';\n if (typeof funcCall === 'string') {\n expression = `${funcCall}(a)`;\n } else {\n expression = funcCall('a');\n }\n\n const input = inputVariable('inputData', inputDataType, [vecSize], 4);\n const output = outputVariable('outputData', outputDataType, [vecSize], 4);\n\n return `\n ${shaderHelper.registerUniform('vec_size', 'u32').declareVariables(input, output)}\n\n ${additionalImplementation ?? ''}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.vec_size')}\n\n let a = ${input.getByOffset('global_idx')};\n ${output.setByOffset('global_idx', expression)}\n }`;\n };\n\nconst createElementwiseProgramInfo =\n (input: TensorView, name: string, funcCall: ElementwiseFunctionCall, additionalImplementation?: string,\n cacheKey?: string, outputDataType: number = input.dataType): ProgramInfo => ({\n name,\n shaderCache: {hint: cacheKey, inputDependencies: ['type']},\n getShaderSource: shaderHelper => createElementwiseProgramShader(\n shaderHelper, ShapeUtil.size(input.dims), input.dataType, outputDataType, funcCall, additionalImplementation),\n getRunData: (inputTensors) => ({\n outputs: [{dims: input.dims, dataType: outputDataType}],\n dispatchGroup:\n {x: Math.ceil(ShapeUtil.size(inputTensors[0].dims) / 64 /* workgroup size */ / 4 /* vec size */)},\n programUniforms: [\n {type: DataType.uint32, data: Math.ceil(ShapeUtil.size(input.dims) / 4)},\n ],\n })\n });\n\nexport const abs = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Abs', 'abs'));\n};\n\nexport const acos = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Acos', 'acos'));\n};\n\nexport const acosh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Acosh', 'acosh'));\n};\n\nexport const asin = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Asin', 'asin'));\n};\n\nexport const asinh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Asinh', 'asinh'));\n};\n\nexport const atan = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Atan', 'atan'));\n};\nexport const atanh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Atanh', 'atanh'));\n};\n\nexport interface CastAttributes extends AttributeWithCacheKey {\n readonly to: number;\n readonly saturate?: boolean;\n}\n\nexport const parseCastAttributes = (attributes: Record): CastAttributes =>\n createAttributeWithCacheKey(attributes as {to: number});\n\n\nexport const cast = (context: ComputeContext, attributes: CastAttributes): void => {\n let func: ElementwiseFunctionCall;\n switch (attributes.to) {\n case DataType.float16:\n func = 'vec4';\n break;\n case DataType.float:\n func = 'vec4';\n break;\n case DataType.uint32:\n func = 'vec4';\n break;\n case DataType.int32:\n func = 'vec4';\n break;\n case DataType.bool:\n func = 'vec4';\n break;\n default:\n throw new RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${attributes.to}`);\n }\n context.compute(\n createElementwiseProgramInfo(context.inputs[0], 'Cast', func, undefined, attributes.cacheKey, attributes.to));\n};\n\nexport interface ClipAttributes extends AttributeWithCacheKey {\n readonly min: number;\n readonly max: number;\n}\n\nconst generateClipAttributesFromInputs = (inputs: readonly TensorView[]): ClipAttributes => {\n const min = (inputs.length >= 2 && inputs[1].data !== 0) ? inputs[1].getFloat32Array()[0] : MIN_CLIP;\n const max = (inputs.length >= 3 && inputs[2].data !== 0) ? inputs[2].getFloat32Array()[0] : MAX_CLIP;\n return createAttributeWithCacheKey({min, max});\n};\n\nexport const clip = (context: ComputeContext, clipAttributes: ClipAttributes): void => {\n const attributes = context.inputs.length === 1 ? clipAttributes : generateClipAttributesFromInputs(context.inputs);\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(\n createElementwiseProgramInfo(\n context.inputs[0], 'Clip', a => `clamp(${a}, clip_min_, clip_max_)`, `\n const clip_min_: vec4<${dataType}> = vec4(${dataType}(${attributes.min}));\n const clip_max_: vec4<${dataType}> = vec4(${dataType}(${attributes.max}));\n`,\n attributes.cacheKey),\n {inputs: [0]});\n};\n\nexport const ceil = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Ceil', 'ceil'));\n};\n\nexport const cos = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Cos', 'cos'));\n};\n\nexport const cosh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Cosh', 'cosh'));\n};\n\nexport interface AlphaAttributes extends AttributeWithCacheKey {\n readonly alpha: number;\n}\n\nexport const parseAlphaAttributes = (attributes: Record): AlphaAttributes =>\n createAttributeWithCacheKey(attributes as {alpha: number});\n\nexport const elu = (context: ComputeContext, attributes: AlphaAttributes): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'Elu', a => `elu_vf32(${a})`, `\n const elu_alpha_ = ${dataType}(${attributes.alpha});\n\n fn elu_f32(a: ${dataType}) -> ${dataType} {\n return select((exp(a) - 1.0) * elu_alpha_, a, a >= 0.0);\n }\n\n fn elu_vf32(v: vec4<${dataType}>) -> vec4<${dataType}> {\n return vec4(elu_f32(v.x), elu_f32(v.y), elu_f32(v.z), elu_f32(v.w));\n }`,\n attributes.cacheKey));\n};\n\nexport const erfImpl = (varType = 'f32') => `\nconst r0: ${varType} = 0.3275911;\nconst r1: ${varType} = 0.254829592;\nconst r2: ${varType} = -0.284496736;\nconst r3: ${varType} = 1.421413741;\nconst r4: ${varType} = -1.453152027;\nconst r5: ${varType} = 1.061405429;\n\nfn erf_vf32(v: vec4<${varType}>) -> vec4<${varType}> {\n let absv = abs(v);\n let x = 1.0 / (1.0 + r0 * absv);\n return sign(v) * (1.0 - ((((r5 * x + r4) * x + r3) * x + r2) * x + r1) * x * exp(-absv * absv));\n}`;\n\nexport const erf = (context: ComputeContext): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Erf', a => `erf_vf32(${a})`, erfImpl(dataType)));\n};\n\nexport const exp = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Exp', 'exp'));\n};\n\nexport const floor = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Floor', 'floor'));\n};\n\nexport const gelu = (context: ComputeContext): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'Gelu', a => `0.5 * ${a} * (1.0 + erf_vf32(${a} * 0.7071067811865475))`, erfImpl(dataType)));\n};\n\nexport const leakyRelu = (context: ComputeContext, attributes: AlphaAttributes): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'LeakyRelu', a => `select(leaky_relu_alpha_ * ${a}, ${a}, ${a} >= vec4<${dataType}>(0.0))`,\n `const leaky_relu_alpha_ = ${dataType}(${attributes.alpha});`, attributes.cacheKey));\n};\n\nexport const not = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Not', a => `!${a}`));\n};\n\nexport const neg = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Neg', a => `-${a}`));\n};\n\nexport const reciprocal = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Reciprocal', a => `1.0/${a}`));\n};\n\nexport const relu = (context: ComputeContext): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'Relu', a => `select(vec4<${dataType}>(0.0), ${a}, ${a} > vec4<${dataType}>(0.0))`));\n};\n\nexport const sigmoid = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Sigmoid', a => `(1.0 / (1.0 + exp(-${a})))`));\n};\n\nexport interface HardSigmoidAttributes extends AttributeWithCacheKey {\n readonly alpha: number;\n readonly beta: number;\n}\n\nexport const parseHardSigmoidAttributes = (attributes: Record): HardSigmoidAttributes =>\n createAttributeWithCacheKey(attributes as {\n alpha: number;\n beta: number;\n });\n\nexport const hardSigmoid = (context: ComputeContext, attributes: HardSigmoidAttributes): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'HardSigmoid',\n a => `max(vec4<${dataType}>(0.0), min(vec4<${dataType}>(1.0), ${attributes.alpha} * ${a} + vec4<${dataType}>(${\n attributes.beta})))`,\n undefined, attributes.cacheKey));\n};\n\nexport const sin = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Sin', 'sin'));\n};\n\nexport const sinh = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Sinh', 'sinh'));\n};\n\nexport const sqrt = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Sqrt', 'sqrt'));\n};\n\nexport const tan = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Tan', 'tan'));\n};\n\nexport const tanhExpression = (a: string) => `sign(${a}) * (1 - exp(-2 * abs(${a}))) / (1 + exp(-2 * abs(${a})))`;\n\nexport const tanh = (context: ComputeContext): void => {\n // TODO: revisit after https://github.com/gpuweb/gpuweb/issues/4458 is resolved\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Tanh', tanhExpression));\n};\n\nexport const fastGeluImpl = (varType = 'f32') => `\nconst fast_gelu_a: ${varType} = 0.5;\nconst fast_gelu_b: ${varType} = 0.7978845608028654;\nconst fast_gelu_c: ${varType} = 0.035677408136300125;\n\nfn tanh_v(v: vec4<${varType}>) -> vec4<${varType}> {\n return ${tanhExpression('v')};\n}\n`;\n\nexport const fastGeluExpression = (x: string) =>\n `(fast_gelu_a + fast_gelu_a * tanh_v(${x} * (fast_gelu_c * ${x} * ${x} + fast_gelu_b))) * ${x}`;\n\nexport const fastGelu = (context: ComputeContext): void => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'FastGelu', fastGeluExpression, fastGeluImpl(dataType), undefined,\n context.inputs[0].dataType));\n};\n\nexport const thresholdedRelu = (context: ComputeContext, attributes: AlphaAttributes): number => {\n const dataType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'ThresholdedRelu', a => `select(vec4<${dataType}>(0.0), ${a}, ${a} > thresholded_relu_alpha_)`,\n `const thresholded_relu_alpha_ = vec4<${dataType}>(${attributes.alpha});`, attributes.cacheKey));\n return 0;\n};\n\nexport const log = (context: ComputeContext): void => {\n context.compute(createElementwiseProgramInfo(context.inputs[0], 'Log', 'log'));\n};\n\nexport const quickGeluImpl = (varType: string, alpha: number) => `\nconst alpha = vec4<${varType}>(${alpha});\nconst one = ${varType}(1.0);\nconst zero = ${varType}(0.0);\n\nfn quick_gelu_impl(x: vec4<${varType}>) -> vec4<${varType}> {\n let v = x *alpha;\n var x1 : vec4<${varType}>;\n for (var i = 0; i < 4; i = i + 1) {\n if (v[i] >= zero) {\n x1[i] = one / (one + exp(-v[i]));\n } else {\n x1[i] = one - one / (one + exp(v[i]));\n }\n }\n return x * x1;\n}\n`;\n\nexport const quickGeluExpression = (x: string) => `quick_gelu_impl(${x})`;\n\nexport const quickgelu = (context: ComputeContext, attributes: AlphaAttributes): void => {\n const dType = tensorTypeToWsglValueType(context.inputs[0].dataType);\n context.compute(createElementwiseProgramInfo(\n context.inputs[0], 'QuickGelu', quickGeluExpression, quickGeluImpl(dType, attributes.alpha), attributes.cacheKey,\n context.inputs[0].dataType));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType} from './common';\nimport {erfImpl} from './unary-op';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (inputs[0].dims.length !== 3) {\n throw new Error('input should have 3 dimensions');\n }\n\n if (![2560, 5120, 10240].includes(inputs[0].dims[2])) {\n throw new Error('hidden state should be 2560, 5120 or 10240');\n }\n\n if (inputs[1].dims.length !== 1) {\n throw new Error('bias is expected to have 1 dimensions');\n }\n\n if (inputs[0].dims[2] !== inputs[1].dims[0]) {\n throw new Error('last dimension of input and bias are not the same');\n }\n};\n\nconst createBiasSplitGeluProgramInfo = (inputs: readonly TensorView[]): ProgramInfo => {\n const outputShape = inputs[0].dims.slice();\n outputShape[2] = outputShape[2] / 2;\n\n const input = inputVariable('input', inputs[0].dataType, inputs[0].dims, 4);\n const bias = inputVariable('bias', inputs[0].dataType, [inputs[0].dims[2]], 4);\n const output = outputVariable('output', inputs[0].dataType, outputShape, 4);\n\n const outputSize = ShapeUtil.size(outputShape) / 4;\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n const M_SQRT2 = sqrt(2.0);\n const halfChannels = ${inputs[0].dims[2] / 4 / 2}u;\n\n ${shaderHelper.declareVariables(input, bias, output)}\n\n ${erfImpl(dataType)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes(outputSize)}\n let biasIdx = global_idx % halfChannels;\n let batchIndex = global_idx / halfChannels;\n let inputOffset = biasIdx + batchIndex * halfChannels * 2;\n let valueLeft = input[inputOffset] + bias[biasIdx];\n let valueRight = input[inputOffset + halfChannels] + bias[biasIdx + halfChannels];\n let geluRight = valueRight * 0.5 * (erf_vf32(valueRight / M_SQRT2) + 1);\n\n ${output.setByOffset('global_idx', 'valueLeft * geluRight')}\n }`;\n\n return {\n name: 'BiasSplitGelu',\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)}\n }),\n getShaderSource,\n };\n};\n\nexport const biasSplitGelu = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n context.compute(createBiasSplitGeluProgramInfo(context.inputs));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {BroadcastUtil, ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\ntype BuiltinFunctionName = string;\ntype BinaryCustomExpression = (expressionA: string, expressionB: string) => string;\ntype BinaryFunctionCall = BuiltinFunctionName|BinaryCustomExpression|{\n scalar: BinaryCustomExpression;\n vector: BinaryCustomExpression;\n};\n\nconst createBinaryOpProgramShader =\n (shaderHelper: ShaderHelper, dimsA: readonly number[], dimsB: readonly number[], dimsOutput: readonly number[],\n vectorize: boolean, doBroadcast: boolean, sharedDimensionDivisibleBy4: boolean, funcCall: BinaryFunctionCall,\n typeA: number, typeB: number, typeOutput: number, additionalImplementation?: string) => {\n let expressionScalar: BinaryCustomExpression;\n let expressionVector: BinaryCustomExpression;\n if (typeof funcCall === 'string') {\n expressionScalar = expressionVector = (a, b) => `${funcCall}((${a}),(${b}))`;\n } else if (typeof funcCall === 'function') {\n expressionScalar = expressionVector = funcCall;\n } else {\n expressionScalar = funcCall.scalar;\n expressionVector = funcCall.vector;\n }\n\n const output = outputVariable('outputData', typeOutput, dimsOutput.length, 4);\n const a = inputVariable('aData', typeA, dimsA.length, 4);\n const b = inputVariable('bData', typeB, dimsB.length, 4);\n\n let assignment: string;\n if (vectorize) {\n if (doBroadcast) {\n const isAOneElement = ShapeUtil.size(dimsA) === 1;\n const isBOneElement = ShapeUtil.size(dimsB) === 1;\n const aLastDimDivisibleBy4 = dimsA.length > 0 && dimsA[dimsA.length - 1] % 4 === 0;\n const bLastDimDivisibleBy4 = dimsB.length > 0 && dimsB[dimsB.length - 1] % 4 === 0;\n if (isAOneElement || isBOneElement) {\n assignment = output.setByOffset(\n 'global_idx',\n expressionVector(\n isAOneElement ? `${a.type.value}(${a.getByOffset('0')}.x)` : a.getByOffset('global_idx'),\n isBOneElement ? `${b.type.value}(${b.getByOffset('0')}.x)` : b.getByOffset('global_idx')));\n } else {\n assignment = `\n let outputIndices = ${output.offsetToIndices('global_idx * 4u')};\n let offsetA = ${a.broadcastedIndicesToOffset('outputIndices', output)};\n let offsetB = ${b.broadcastedIndicesToOffset('outputIndices', output)};\n ${\n output.setByOffset(\n 'global_idx',\n expressionVector(\n sharedDimensionDivisibleBy4 || aLastDimDivisibleBy4 ?\n a.getByOffset('offsetA / 4u') :\n `${a.type.value}(${a.getByOffset('offsetA / 4u')}[offsetA % 4u])`,\n sharedDimensionDivisibleBy4 || bLastDimDivisibleBy4 ?\n b.getByOffset('offsetB / 4u') :\n `${b.type.value}(${b.getByOffset('offsetB / 4u')}[offsetB % 4u])`))}\n `;\n }\n } else {\n assignment = output.setByOffset(\n 'global_idx', expressionVector(a.getByOffset('global_idx'), b.getByOffset('global_idx')));\n }\n } else {\n if (!doBroadcast) {\n throw new Error('no necessary to use scalar implementation for element-wise binary op implementation.');\n }\n\n const singleAssignment = (resStr: string, x: number, typeCast = '') => {\n const expressionA = `aData[indexA${x}][componentA${x}]`;\n const expressionB = `bData[indexB${x}][componentB${x}]`;\n return `\n let outputIndices${x} = ${output.offsetToIndices(`global_idx * 4u + ${x}u`)};\n let offsetA${x} = ${a.broadcastedIndicesToOffset(`outputIndices${x}`, output)};\n let offsetB${x} = ${b.broadcastedIndicesToOffset(`outputIndices${x}`, output)};\n let indexA${x} = offsetA${x} / 4u;\n let indexB${x} = offsetB${x} / 4u;\n let componentA${x} = offsetA${x} % 4u;\n let componentB${x} = offsetB${x} % 4u;\n ${resStr}[${x}] = ${typeCast}(${expressionScalar(expressionA, expressionB)});\n `;\n };\n if (typeOutput === DataType.bool) {\n assignment = `\n var data = vec4(0);\n ${singleAssignment('data', 0, 'u32')}\n ${singleAssignment('data', 1, 'u32')}\n ${singleAssignment('data', 2, 'u32')}\n ${singleAssignment('data', 3, 'u32')}\n outputData[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`;\n } else {\n assignment = `\n ${singleAssignment('outputData[global_idx]', 0)}\n ${singleAssignment('outputData[global_idx]', 1)}\n ${singleAssignment('outputData[global_idx]', 2)}\n ${singleAssignment('outputData[global_idx]', 3)}\n `;\n }\n }\n\n return `\n ${shaderHelper.registerUniform('vec_size', 'u32').declareVariables(a, b, output)}\n\n ${additionalImplementation ?? ''}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.vec_size')}\n ${assignment}\n }`;\n };\n\nconst createBinaryOpProgramInfo =\n (name: string, cacheKey: string, a: TensorView, b: TensorView, funcCall: BinaryFunctionCall,\n additionalImplementation?: string, outputDataType: number = a.dataType): ProgramInfo => {\n const isBroadcast = !ShapeUtil.areEqual(a.dims, b.dims);\n let outputShape = a.dims;\n let outputSize = ShapeUtil.size(a.dims);\n\n let vectorize = false;\n let sharedDimensionDivisibleBy4 = false;\n\n // TODO: deal with zero-sized tensors (eg. dims=[1,0])\n const cacheKeyAux = [isBroadcast];\n if (isBroadcast) {\n const calculatedShape = BroadcastUtil.calcShape(a.dims, b.dims, false);\n if (!calculatedShape) {\n throw new Error('Can\\'t perform binary op on the given tensors');\n }\n outputShape = calculatedShape;\n outputSize = ShapeUtil.size(outputShape);\n const isAOneElement = ShapeUtil.size(a.dims) === 1;\n const isBOneElement = ShapeUtil.size(b.dims) === 1;\n const aLastDimDivisibleBy4 = a.dims.length > 0 && a.dims[a.dims.length - 1] % 4 === 0;\n const bLastDimDivisibleBy4 = b.dims.length > 0 && b.dims[b.dims.length - 1] % 4 === 0;\n cacheKeyAux.push(isAOneElement);\n cacheKeyAux.push(isBOneElement);\n cacheKeyAux.push(aLastDimDivisibleBy4);\n cacheKeyAux.push(bLastDimDivisibleBy4);\n // check whether vectorize can be enabled\n let sharedDimension = 1;\n for (let i = 1; i < outputShape.length; i++) {\n const dimA = a.dims[a.dims.length - i] ?? 1;\n const dimB = b.dims[b.dims.length - i] ?? 1;\n if (dimA === dimB) {\n sharedDimension *= dimA;\n } else {\n break;\n }\n }\n if (sharedDimension % 4 === 0) {\n sharedDimensionDivisibleBy4 = true;\n vectorize = true;\n } else if (isAOneElement || isBOneElement || aLastDimDivisibleBy4 || bLastDimDivisibleBy4) {\n vectorize = true;\n }\n } else {\n // element-wise\n vectorize = true;\n }\n cacheKeyAux.push(vectorize);\n\n return {\n name,\n shaderCache: {\n hint: cacheKey + cacheKeyAux.map((x) => x.toString()).join('_'),\n inputDependencies: ['rank', 'rank'],\n },\n getShaderSource: (shaderHelper) => createBinaryOpProgramShader(\n shaderHelper, a.dims, b.dims, outputShape, vectorize, isBroadcast, sharedDimensionDivisibleBy4, funcCall,\n a.dataType, b.dataType, outputDataType, additionalImplementation),\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: outputDataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */ / 4 /* component size */)},\n programUniforms: [\n {type: DataType.uint32, data: Math.ceil(ShapeUtil.size(outputShape) / 4)},\n ...createTensorShapeVariables(a.dims, b.dims, outputShape)\n ],\n }),\n };\n };\n\nconst runBinaryOp =\n (context: ComputeContext, name: string, funcCall: BinaryFunctionCall, additionalImplementation?: string,\n cacheKey?: string, outputDataType?: number): void => {\n context.compute(createBinaryOpProgramInfo(\n name, cacheKey ?? '', context.inputs[0], context.inputs[1], funcCall, additionalImplementation,\n outputDataType));\n };\n\nexport const add = (context: ComputeContext): void => {\n runBinaryOp(context, 'Add', (a, b) => `${a}+${b}`);\n};\n\nexport const div = (context: ComputeContext): void => {\n runBinaryOp(context, 'Div', (a, b) => `${a}/${b}`);\n};\n\nexport const equal = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'Equal', ({scalar: (a, b) => `u32(${a}==${b})`, vector: (a, b) => `vec4(${a}==${b})`}), undefined,\n undefined, DataType.bool);\n};\n\nexport const mul = (context: ComputeContext): void => {\n runBinaryOp(context, 'Mul', (a, b) => `${a}*${b}`);\n};\n\nexport const pow = (context: ComputeContext): void => {\n const type = inputVariable('input', context.inputs[0].dataType, context.inputs[0].dims).type.value;\n const roundStr = type === 'i32' ? 'round' : '';\n runBinaryOp(\n context, 'Pow', ({scalar: (a, b) => `pow_custom(${a},${b})`, vector: (a, b) => `pow_vector_custom(${a},${b})`}),\n `\n fn pow_custom(a : ${type}, b : ${type}) -> ${type} {\n if (b == ${type}(0.0)) {\n return ${type}(1.0);\n } else if (a < ${type}(0.0) && f32(b) != floor(f32(b))) {\n return ${type}(pow(f32(a), f32(b))); // NaN\n }\n return select(sign(a), ${type}(1.0), round(f32(abs(b) % ${type}(2.0))) != 1.0) * ${type}(${\n roundStr}(pow(f32(abs(a)), f32(b))));\n }\n fn pow_vector_custom(a : vec4<${type}>, b : vec4<${type}>) -> vec4<${type}> {\n // TODO: implement vectorized pow\n return vec4<${type}>(pow_custom(a.x, b.x), pow_custom(a.y, b.y), pow_custom(a.z, b.z), pow_custom(a.w, b.w));\n }\n `);\n};\n\nexport const sub = (context: ComputeContext): void => {\n runBinaryOp(context, 'Sub', (a, b) => `${a}-${b}`);\n};\n\nexport const greater = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'Greater', ({scalar: (a, b) => `u32(${a}>${b})`, vector: (a, b) => `vec4(${a}>${b})`}), undefined,\n undefined, DataType.bool);\n};\n\nexport const less = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'Less', ({scalar: (a, b) => `u32(${a}<${b})`, vector: (a, b) => `vec4(${a}<${b})`}), undefined,\n undefined, DataType.bool);\n};\n\nexport const greaterOrEqual = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'GreaterOrEqual', ({scalar: (a, b) => `u32(${a}>=${b})`, vector: (a, b) => `vec4(${a}>=${b})`}),\n undefined, undefined, DataType.bool);\n};\n\nexport const lessOrEqual = (context: ComputeContext): void => {\n runBinaryOp(\n context, 'LessOrEqual', ({scalar: (a, b) => `u32(${a}<=${b})`, vector: (a, b) => `vec4(${a}<=${b})`}),\n undefined, undefined, DataType.bool);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface ConcatAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[], axis: number): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('too few inputs');\n }\n const referenceIndex = 0;\n const referenceInput = inputs[referenceIndex];\n const inputType = referenceInput.dataType;\n const inputRank = referenceInput.dims.length;\n inputs.forEach((input, i) => {\n if (i === referenceIndex) {\n return;\n }\n // make sure types of all inputs match\n if (input.dataType !== inputType) {\n throw new Error('input tensors should be one type');\n }\n // make sure the dimensionality of all inputs are the same\n if (input.dims.length !== inputRank) {\n throw new Error('input tensors should have the same shape');\n }\n input.dims.forEach((dim, i) => {\n if (i !== axis && dim !== referenceInput.dims[i]) {\n throw new Error('non concat dimensions must match');\n }\n });\n });\n};\n\nconst calculateInputIndexImpl = (numberOfTensors: number, sizeInConcatAxisStr: string): string => `\n fn calculateInputIndex(index: u32) -> u32 {\n let sizeInConcatAxis = array(${sizeInConcatAxisStr});\n for (var i: u32 = 0u; i < ${numberOfTensors}; i += 1u ) {\n if (index < sizeInConcatAxis[i]) {\n return i;\n }\n }\n return ${numberOfTensors}u;\n }`;\n\nconst assignOutputData = (inputs: readonly IndicesHelper[], output: IndicesHelper) => {\n const numberOfTensors = inputs.length;\n\n const codeLines: string[] = [];\n for (let i = 0; i < numberOfTensors; ++i) {\n const returnSnippet = output.setByOffset('global_idx', inputs[i].getByIndices('indices'));\n if (numberOfTensors === 1) {\n codeLines.push(returnSnippet);\n } else if (i === 0) {\n codeLines.push(`if (inputIndex == ${i}u) { ${returnSnippet} }`);\n } else if (i === numberOfTensors - 1) {\n codeLines.push(`else { ${returnSnippet} }`);\n } else {\n codeLines.push(`else if (inputIndex == ${i}) { ${returnSnippet} }`);\n }\n }\n return codeLines.join('\\n');\n};\n\nconst createConcatProgramInfo =\n (inputs: readonly TensorView[], adjustedAxis: number, outputShape: number[], dataType: DataType): ProgramInfo => {\n const outputSize = ShapeUtil.size(outputShape);\n\n const sizeInConcatAxis = new Array(inputs.length);\n const inputVars = new Array(inputs.length);\n\n let previousSum = 0;\n const inputDependencies: ProgramInputTensorInfoDependency[] = [];\n const inputRanks = [];\n const programUniforms: ProgramUniform[] = [{type: DataType.uint32, data: outputSize}];\n for (let i = 0; i < inputs.length; ++i) {\n previousSum += inputs[i].dims[adjustedAxis];\n sizeInConcatAxis[i] = previousSum;\n inputRanks.push(inputs[i].dims.length);\n inputVars[i] = inputVariable(`input${i}`, dataType, inputRanks[i]);\n inputDependencies.push('rank');\n programUniforms.push({type: DataType.uint32, data: sizeInConcatAxis[i]});\n }\n for (let i = 0; i < inputs.length; ++i) {\n programUniforms.push(...createTensorShapeVariables(inputs[i].dims));\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const output = outputVariable('output', dataType, outputShape.length);\n const indicesAxis = output.indicesGet('indices', adjustedAxis);\n const sizeInConcatAxisStr =\n Array.from(Array(sizeInConcatAxis.length).keys()).map(i => `uniforms.sizeInConcatAxis${i}`).join(',');\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n\n ${(() => {\n shaderHelper.registerUniform('outputSize', 'u32');\n for (let i = 0; i < inputs.length; i++) {\n shaderHelper.registerUniform(`sizeInConcatAxis${i}`, 'u32');\n }\n return shaderHelper.declareVariables(...inputVars, output);\n })()}\n\n ${calculateInputIndexImpl(sizeInConcatAxis.length, sizeInConcatAxisStr)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n\n var indices = ${output.offsetToIndices('global_idx')};\n\n let inputIndex = calculateInputIndex(${indicesAxis});\n if (inputIndex != 0u) {\n let sizeInConcatAxis = array(${sizeInConcatAxisStr});\n ${indicesAxis} -= sizeInConcatAxis[inputIndex - 1u];\n }\n\n ${assignOutputData(inputVars, output)}\n }`;\n\n return {\n name: 'Concat',\n shaderCache: {hint: `${adjustedAxis}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms,\n }),\n getShaderSource,\n };\n };\n\nexport const concat = (context: ComputeContext, attributes: ConcatAttributes): void => {\n const inputs = context.inputs;\n const inputShape = inputs[0].dims;\n const adjustedAxis = ShapeUtil.normalizeAxis(attributes.axis, inputShape.length);\n validateInputs(inputs, adjustedAxis);\n const outputShape = inputShape.slice();\n outputShape[adjustedAxis] =\n inputs.reduce((sum, input) => sum + (input.dims.length > adjustedAxis ? input.dims[adjustedAxis] : 0), 0);\n // 0 length tensors are valid for concat, remove them\n const nonEmptyInputs = inputs.filter(input => ShapeUtil.size(input.dims) > 0);\n context.compute(\n createConcatProgramInfo(nonEmptyInputs, adjustedAxis, outputShape, inputs[0].dataType), {inputs: nonEmptyInputs});\n};\n\nexport const parseConcatAttributes = (attributes: Record): ConcatAttributes =>\n createAttributeWithCacheKey({axis: attributes.axis as number});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {MAX_CLIP, MIN_CLIP} from '../../util';\nimport {ProgramUniform} from '../types';\n\nimport {UniformsArrayType} from './common';\n\nexport interface InternalActivationAttributes {\n readonly activation: string;\n readonly clipMin?: number;\n readonly clipMax?: number;\n readonly alpha?: number;\n readonly beta?: number;\n}\n\nexport const getActivationSnippet =\n (attributes: InternalActivationAttributes, valueType: string, baseType = 'f32'): string => {\n switch (attributes.activation) {\n case 'Relu':\n return `value = max(value, ${valueType}(0.0));`;\n case 'Sigmoid':\n return `value = (${valueType}(1.0) / (${valueType}(1.0) + exp(-value)));`;\n case 'Clip':\n return `value = clamp(value, ${valueType}(${baseType}(uniforms.clip_min)), ${valueType}(${\n baseType}(uniforms.clip_max)));`;\n case 'HardSigmoid':\n return `value = max(${valueType}(0.0), min(${valueType}(1.0), ${baseType}(uniforms.alpha) * value + ${\n baseType}(uniforms.beta)));`;\n case 'LeakyRelu':\n return `value = select(${baseType}(uniforms.alpha) * value, value, value >= ${valueType}(0.0));`;\n case '':\n return '';\n // TODO: adding other activations that can be fused.\n default:\n throw new Error(`Unsupported activation ${attributes.activation}`);\n }\n };\n\nexport const appendActivationUniformsData =\n (attributes: InternalActivationAttributes, programUniform: ProgramUniform[]) => {\n if (attributes.activation === 'Clip') {\n programUniform.push(\n {type: DataType.float, data: attributes.clipMax!}, {type: DataType.float, data: attributes.clipMin!});\n } else if (attributes.activation === 'HardSigmoid') {\n programUniform.push(\n {type: DataType.float, data: attributes.alpha!}, {type: DataType.float, data: attributes.beta!});\n } else if (attributes.activation === 'LeakyRelu') {\n programUniform.push({type: DataType.float, data: attributes.alpha!});\n }\n };\n\nexport const appendActivationUniforms = (attributes: InternalActivationAttributes, uniforms: UniformsArrayType) => {\n if (attributes.activation === 'Clip') {\n uniforms.push({name: 'clip_max', type: 'f32'}, {name: 'clip_min', type: 'f32'});\n } else if (attributes.activation === 'HardSigmoid') {\n uniforms.push({name: 'alpha', type: 'f32'}, {name: 'beta', type: 'f32'});\n } else if (attributes.activation === 'LeakyRelu') {\n uniforms.push({name: 'alpha', type: 'f32'});\n }\n};\n\nexport const parseInternalActivationAttributes =\n (attributes: Record|undefined): InternalActivationAttributes => {\n const activation = attributes?.activation as string || '';\n if (activation === 'HardSigmoid') {\n const [alpha, beta] = attributes?.activation_params as [number, number] || [0.2, 0.5];\n return {activation, alpha, beta};\n } else if (activation === 'Clip') {\n const [clipMin, clipMax] = attributes?.activation_params as [number, number] || [MIN_CLIP, MAX_CLIP];\n return {activation, clipMax, clipMin};\n } else if (activation === 'LeakyRelu') {\n const [alpha] = attributes?.activation_params as [number] || [0.01];\n return {activation, alpha};\n }\n return {activation};\n };\n", "/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/activation_util.ts\n//\n// modified to fit the needs of the project\n\nexport const typeSnippet = (component: number, dataType: string) => {\n switch (component) {\n case 1:\n return dataType;\n case 2:\n return `vec2<${dataType}>`;\n case 3:\n return `vec3<${dataType}>`;\n case 4:\n return `vec4<${dataType}>`;\n default:\n throw new Error(`${component}-component is not supported.`);\n }\n};\n\nexport const biasSnippet = (hasBias: boolean): string => `\n ${hasBias ? 'value = value + getBiasByOutputCoords(coords);' : ''}\n `;\n", "/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-core/src/ops/conv_util.ts\n//\n// modified to fit the needs of the project\n\nexport const utilFunctions = (strideStr: string) => (`\nfn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 {\n return dot(coords, vec4(\n shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1));\n}\nfn getOutputIndexFromCoords(coords : vec4) -> i32 {\n return dot(coords, vec4(\n i32(${strideStr}.x), i32(${strideStr}.y), i32(${strideStr}.z), 1));\n}\n`);\n", "/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/matmul_packed_webgpu.ts\n//\n// modified to fit the needs of the project\n\nimport {DataType} from '../../../../wasm-common';\nimport {TensorView} from '../../../tensor-view';\nimport {ShapeUtil} from '../../../util';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, getBroadcastDims, IndicesHelper, inputVariable, internalVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet, InternalActivationAttributes} from '../fuse-utils';\n\nimport {typeSnippet} from './activation_util';\n\nconst writeDataToSubAVec4Snippet = (transpose: boolean, batchDims?: IndicesHelper) => {\n if (transpose) {\n return `\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n kStart + inputRow,\n globalRowStart / innerElementSize + inputCol${batchDims ? ', batchIndices' : ''});\n `;\n\n } else {\n return `\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n globalRow + innerRow,\n kStart / innerElementSize + inputCol${batchDims ? ', batchIndices' : ''});\n `;\n }\n};\n\nconst calculateResultSnippet = (transposeA: boolean, innerElementSize: number) => {\n if (transposeA) {\n return `\n let ACached0 = mm_Asub[k * innerElementSize][localRow];\n let ACached1 = mm_Asub[k * innerElementSize + 1][localRow];\n let ACached2 = mm_Asub[k * innerElementSize + 2][localRow];\n ${innerElementSize === 3 ? '' : 'let ACached3 = mm_Asub[k * innerElementSize + 3][localRow];'}\n for (var i = 0; i < rowPerThread; i = i + 1) {\n acc[i] = BCached0 * ACached0[i] + acc[i];\n acc[i] = BCached1 * ACached1[i] + acc[i];\n acc[i] = BCached2 * ACached2[i] + acc[i];\n ${innerElementSize === 3 ? '' : 'acc[i] = BCached3 * ACached3[i] + acc[i];'}\n }`;\n } else {\n return `\n for (var i = 0; i < rowPerThread; i = i + 1) {\n let ACached = mm_Asub[tileRow + i][k];\n acc[i] = BCached0 * ACached.x + acc[i];\n acc[i] = BCached1 * ACached.y + acc[i];\n acc[i] = BCached2 * ACached.z + acc[i];\n ${innerElementSize === 3 ? '' : 'acc[i] = BCached3 * ACached.w + acc[i];'}\n }`;\n }\n};\n\nexport const makeMatMulPackedVec4Source =\n (workPerThread: number[], workgroupSize: [number, number, number], type = 'f32', batchDims?: IndicesHelper,\n transposeA = false, tileInner = 32, splitK = false, splitedDimInner = 32): string => {\n const tileAOuter = workgroupSize[1] * workPerThread[1];\n const tileBOuter = workgroupSize[0] * workPerThread[0];\n const tileAWidth = transposeA ? tileAOuter : tileInner;\n const tileAHight = transposeA ? tileInner : tileAOuter;\n const innerElementSize = tileAWidth / workgroupSize[0];\n const rowPerThreadB = tileInner / workgroupSize[1];\n\n if (!(((transposeA && innerElementSize === 4 && workPerThread[1] === 4) ||\n (!transposeA && (innerElementSize === 3 || innerElementSize === 4))) &&\n tileAWidth % workgroupSize[0] === 0 && tileInner % workgroupSize[1] === 0 && workPerThread[0] === 4)) {\n throw new Error(`If transposeA ${transposeA} is true, innerElementSize ${\n innerElementSize} and workPerThread[1] ${workPerThread[1]} must be 4.\n Otherwise, innerElementSize ${innerElementSize} must be 3 or 4.\n tileAWidth ${tileAWidth} must be divisible by workgroupSize[0]${workgroupSize[0]}. tileInner ${\n tileInner} must be divisible by workgroupSize[1] ${workgroupSize[1]}. colPerThread ${\n workPerThread[0]} must be 4.`);\n }\n return `\nvar mm_Asub: array, ${tileAWidth / innerElementSize}>, ${tileAHight}>;\nvar mm_Bsub: array, ${tileBOuter / workPerThread[0]}>, ${tileInner}>;\n\nconst rowPerThread = ${workPerThread[1]};\nconst colPerThread = ${workPerThread[0]};\nconst innerElementSize = ${innerElementSize};\nconst tileInner = ${tileInner};\n\n@compute @workgroup_size(${workgroupSize[0]}, ${workgroupSize[1]}, ${workgroupSize[2]})\nfn main(@builtin(local_invocation_id) localId : vec3,\n @builtin(global_invocation_id) globalId : vec3,\n @builtin(workgroup_id) workgroupId : vec3) {\n let localRow = i32(localId.y);\n let tileRow = localRow * rowPerThread;\n let tileCol = i32(localId.x);\n\n let globalRow =i32(globalId.y) * rowPerThread;\n let globalCol = i32(globalId.x);\n let batch = ${splitK ? '0' : 'i32(globalId.z)'};\n ${batchDims ? `let batchIndices = ${batchDims.offsetToIndices('u32(batch)')};` : ''}\n let globalRowStart = i32(workgroupId.y) * ${tileAOuter};\n\n let num_tiles = ${splitK ? `${Math.ceil(splitedDimInner / tileInner)}` : '(uniforms.dim_inner - 1) / tileInner + 1'};\n var kStart = ${splitK ? `i32(globalId.z) * ${splitedDimInner}` : '0'};\n\n var acc: array, rowPerThread>;\n\n // Loop over shared dimension.\n let tileRowB = localRow * ${rowPerThreadB};\n for (var t = 0; t < num_tiles; t = t + 1) {\n // Load one tile of A into local memory.\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n let inputRow = tileRow + innerRow;\n let inputCol = tileCol;\n ${writeDataToSubAVec4Snippet(transposeA, batchDims)}\n }\n\n // Load one tile of B into local memory.\n for (var innerRow = 0; innerRow < ${rowPerThreadB}; innerRow = innerRow + 1) {\n let inputRow = tileRowB + innerRow;\n let inputCol = tileCol;\n mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol${\n batchDims ? ', batchIndices' : ''});\n }\n kStart = kStart + tileInner;\n workgroupBarrier();\n\n // Compute acc values for a single thread.\n for (var k = 0; k < tileInner / innerElementSize; k = k + 1) {\n let BCached0 = mm_Bsub[k * innerElementSize][tileCol];\n let BCached1 = mm_Bsub[k * innerElementSize + 1][tileCol];\n let BCached2 = mm_Bsub[k * innerElementSize + 2][tileCol];\n ${innerElementSize === 3 ? '' : 'let BCached3 = mm_Bsub[k * innerElementSize + 3][tileCol];'}\n\n ${calculateResultSnippet(transposeA, innerElementSize)}\n }\n\n workgroupBarrier();\n }\n\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]);\n }\n}`;\n };\n\nconst writeDataToSubASnippet = (transpose: boolean, batchDims?: IndicesHelper) => {\n if (transpose) {\n return `\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n kStart + inputRow,\n globalRowStart + inputCol${batchDims ? ', batchIndices' : ''});\n `;\n\n } else {\n return `\n mm_Asub[inputRow][inputCol] = mm_readA(batch,\n globalRowStart + inputRow,\n kStart + inputCol${batchDims ? ', batchIndices' : ''});\n `;\n }\n};\n\nconst readDataFromSubASnippet = (transposeA: boolean) =>\n transposeA ? 'let ACached = mm_Asub[k][tileRow + innerRow];' : 'let ACached = mm_Asub[tileRow + innerRow][k];';\n\n// sequentialAccessByThreads means sequential data in memory is accessed by\n// threads, instead of a single thread (default behavior).\nexport const makeMatMulPackedSource =\n (workPerThread: number[], workgroupSize: [number, number, number], type = 'f32', batchDims?: IndicesHelper,\n transposeA = false, tileInner = 32, splitK = false, splitedDimInner = 32,\n sequentialAccessByThreads = false): string => {\n const tileAOuter = workPerThread[1] * workgroupSize[1];\n const tileBOuter = workPerThread[0] * workgroupSize[0];\n const tileAWidth = transposeA ? tileAOuter : tileInner;\n const tileAHight = transposeA ? tileInner : tileAOuter;\n\n if (!(tileAHight % workgroupSize[1] === 0 && tileAWidth % workgroupSize[0] === 0 &&\n tileInner % workgroupSize[1] === 0)) {\n throw new Error(`tileAHight ${tileAHight} must be divisible by workgroupSize[1]${\n workgroupSize[1]}, tileAWidth ${tileAWidth} must be divisible by workgroupSize[0]${\n workgroupSize[0]}, tileInner ${tileInner} must be divisible by workgroupSize[1]${workgroupSize[1]}`);\n }\n const rowPerThreadA = tileAHight / workgroupSize[1];\n const colPerThreadA = tileAWidth / workgroupSize[0];\n const rowPerThreadB = tileInner / workgroupSize[1];\n const matmulSnippet = sequentialAccessByThreads ?\n `\n let localRow = i32(localId.y);\n let localCol = i32(localId.x);\n let globalRowStart = i32(workgroupId.y) * ${tileAOuter};\n let globalColStart = i32(workgroupId.x) * ${tileBOuter};\n\n // Loop over shared dimension.\n for (var t = 0; t < num_tiles; t = t + 1) {\n // Load one tile of A into local memory.\n for (var inputRow = localRow; inputRow < ${tileAHight}; inputRow = inputRow + ${workgroupSize[1]}) {\n for (var inputCol = localCol; inputCol < ${tileAWidth}; inputCol = inputCol + ${workgroupSize[0]}) {\n ${writeDataToSubASnippet(transposeA, batchDims)}\n }\n }\n // Load one tile of B into local memory.\n for (var inputRow = localRow; inputRow < ${tileInner}; inputRow = inputRow + ${workgroupSize[1]}) {\n for (var inputCol = localCol; inputCol < ${tileBOuter}; inputCol = inputCol + ${workgroupSize[0]}) {\n mm_Bsub[inputRow][inputCol] = mm_readB(batch,\n kStart + inputRow,\n globalColStart + inputCol${batchDims ? ', batchIndices' : ''});\n }\n }\n kStart = kStart + tileInner;\n workgroupBarrier();\n\n // Compute acc values for a single thread.\n var BCached : array<${type}, colPerThread>;\n for (var k = 0; k < tileInner; k = k + 1) {\n for (var inner = 0; inner < colPerThread; inner = inner + 1) {\n BCached[inner] = mm_Bsub[k][localCol + inner * ${workgroupSize[0]}];\n }\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n let ACached = ${\n transposeA ? `mm_Asub[k][localRow + innerRow * ${workgroupSize[1]}];` :\n `mm_Asub[localRow + innerRow * ${workgroupSize[1]}][k];`}\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n acc[innerRow][innerCol] = acc[innerRow][innerCol] +\n ACached * BCached[innerCol];\n }\n }\n }\n workgroupBarrier();\n }\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n let gRow = globalRowStart + localRow + innerRow * ${workgroupSize[1]};\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n let gCol = globalColStart + localCol + innerCol * ${workgroupSize[0]};\n mm_write(batch, gRow, gCol, acc[innerRow][innerCol]);\n }\n }\n ` :\n `\nlet tileRow = i32(localId.y) * rowPerThread;\nlet tileCol = i32(localId.x) * colPerThread;\n\nlet globalRow = i32(globalId.y) * rowPerThread;\nlet globalCol = i32(globalId.x) * colPerThread;\nlet globalRowStart = i32(workgroupId.y) * ${tileAOuter};\n\nlet tileRowA = i32(localId.y) * ${rowPerThreadA};\nlet tileColA = i32(localId.x) * ${colPerThreadA};\nlet tileRowB = i32(localId.y) * ${rowPerThreadB};\n// Loop over shared dimension.\nfor (var t = 0; t < num_tiles; t = t + 1) {\n // Load one tile of A into local memory.\n for (var innerRow = 0; innerRow < ${rowPerThreadA}; innerRow = innerRow + 1) {\n for (var innerCol = 0; innerCol < ${colPerThreadA}; innerCol = innerCol + 1) {\n let inputRow = tileRowA + innerRow;\n let inputCol = tileColA + innerCol;\n ${writeDataToSubASnippet(transposeA, batchDims)}\n }\n }\n\n // Load one tile of B into local memory.\n for (var innerRow = 0; innerRow < ${rowPerThreadB}; innerRow = innerRow + 1) {\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n let inputRow = tileRowB + innerRow;\n let inputCol = tileCol + innerCol;\n mm_Bsub[inputRow][inputCol] = mm_readB(batch,\n kStart + inputRow,\n globalCol + innerCol${batchDims ? ', batchIndices' : ''});\n }\n }\n kStart = kStart + tileInner;\n workgroupBarrier();\n\n // Compute acc values for a single thread.\n var BCached : array<${type}, colPerThread>;\n for (var k = 0; k < tileInner; k = k + 1) {\n for (var inner = 0; inner < colPerThread; inner = inner + 1) {\n BCached[inner] = mm_Bsub[k][tileCol + inner];\n }\n\n for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n ${readDataFromSubASnippet(transposeA)}\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol];\n }\n }\n }\n\n workgroupBarrier();\n}\n\nfor (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) {\n for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) {\n mm_write(batch, globalRow + innerRow, globalCol + innerCol,\n acc[innerRow][innerCol]);\n }\n}\n`;\n\n return `\n var mm_Asub : array, ${tileAHight}>;\n var mm_Bsub : array, ${tileInner}>;\n const rowPerThread = ${workPerThread[1]};\n const colPerThread = ${workPerThread[0]};\n const tileInner = ${tileInner};\n\n@compute @workgroup_size(${workgroupSize[0]}, ${workgroupSize[1]}, ${workgroupSize[2]})\nfn main(@builtin(local_invocation_id) localId : vec3,\n @builtin(global_invocation_id) globalId : vec3,\n @builtin(workgroup_id) workgroupId : vec3) {\n let batch = ${splitK ? '0' : 'i32(globalId.z)'};\n ${batchDims ? `let batchIndices = ${batchDims.offsetToIndices('u32(batch)')};` : ''}\n let num_tiles = ${\n splitK ? `${Math.ceil(splitedDimInner / tileInner)}` : '(uniforms.dim_inner - 1) / tileInner + 1'};\n var kStart = ${splitK ? `i32(globalId.z) * ${splitedDimInner}` : '0'};\n\n var acc : array, rowPerThread>;\n ${matmulSnippet}\n }\n`;\n };\n\nconst matMulReadWriteFnSource =\n (component: number, hasBias: boolean, applyActivation: string, variables: IndicesHelper[],\n batchShapes: Array, isChannelsLast = false): string => {\n const [batchAShape, batchBShape, batchShape] = batchShapes;\n const [batchVariable, aVariable, bVariable, outputVariable] = variables;\n const broadCastADims = getBroadcastDims(batchAShape, batchShape);\n const broadCastBDims = getBroadcastDims(batchBShape, batchShape);\n const dataType = tensorTypeToWsglStorageType(variables[0].type.tensor);\n const getAIndices = () => {\n const aRank = aVariable.rank;\n const batchRank = batchVariable.rank;\n let resStr = `var aIndices: ${aVariable.type.indices};`;\n for (let i = aRank - 2 - 1, j = batchRank - 1; i >= 0; i--, j--) {\n resStr += `\\naIndices[${i}] = ${batchRank > 1 ? `batchIndices[${j}]` : 'batchIndices'};`;\n }\n broadCastADims.forEach(i => {\n resStr += `\\naIndices[${i}] = 0;`;\n });\n resStr += `\\naIndices[${aRank - 2}] = u32(row);\n aIndices[${aRank - 1}] = u32(colIn);`;\n return resStr;\n };\n const getBIndices = () => {\n const bRank = bVariable.rank;\n const batchRank = batchVariable.rank;\n let resStr = `var bIndices: ${bVariable.type.indices};`;\n for (let i = bRank - 2 - 1, j = batchRank - 1; i >= 0; i--, j--) {\n resStr += `\\nbIndices[${i}] = ${batchRank > 1 ? `batchIndices[${j}]` : 'batchIndices'};`;\n }\n broadCastBDims.forEach(i => {\n resStr += `\\nbIndices[${i}] = 0;`;\n });\n resStr += `\\nbIndices[${bRank - 2}] = u32(row);\n bIndices[${bRank - 1}] = u32(colIn);`;\n return resStr;\n };\n const source = `\n fn mm_readA(batch: i32, row: i32, colIn: i32, batchIndices: ${batchVariable.type.indices}) -> ${\n typeSnippet(component, dataType)} {\n var value = ${typeSnippet(component, dataType)}(0.0);\n let col = colIn * ${component};\n if(row < uniforms.dim_a_outer && col < uniforms.dim_inner)\n {\n ${getAIndices()}\n value = ${aVariable.getByIndices('aIndices')};\n }\n return value;\n }\n\n fn mm_readB(batch: i32, row: i32, colIn: i32, batchIndices: ${batchVariable.type.indices}) -> ${\n typeSnippet(component, dataType)} {\n var value = ${typeSnippet(component, dataType)}(0.0);\n let col = colIn * ${component};\n if(row < uniforms.dim_inner && col < uniforms.dim_b_outer)\n {\n ${getBIndices()}\n value = ${bVariable.getByIndices('bIndices')};\n }\n return value;\n }\n\n fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${typeSnippet(component, dataType)}) {\n let col = colIn * ${component};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) {\n var value = valueIn;\n let coords = vec3(batch, row, colIn);\n ${\n hasBias ?\n `value = value + ${isChannelsLast ? 'bias[colIn]' : `${typeSnippet(component, dataType)}(bias[row])`};` :\n '' }\n ${applyActivation}\n ${outputVariable.setByIndices('vec3(coords)', 'value')}\n }\n }\n `;\n return source;\n };\n\nexport const createMatmulProgramInfo =\n (inputs: readonly TensorView[], activationAttributes: InternalActivationAttributes, outputShape: readonly number[],\n reshapedOutputShape?: readonly number[],\n isChannelsLast = false /* only used for conv2dByMatMul*/): ProgramInfo => {\n const aShape = inputs[0].dims;\n const bShape = inputs[1].dims;\n const outerDimsA = aShape.slice(0, -2);\n const outerDimsB = bShape.slice(0, -2);\n const outerDims = reshapedOutputShape ? reshapedOutputShape.slice(0, -2) : outputShape.slice(0, -2);\n const batchSize = ShapeUtil.size(outerDims);\n const dimAOuter = aShape[aShape.length - 2];\n const dimInner = aShape[aShape.length - 1];\n const dimBOuter = bShape[bShape.length - 1];\n const isVec4 = dimInner % 4 === 0 && dimBOuter % 4 === 0;\n\n // TODO: fine tune size\n const elementsPerThread = dimAOuter <= 8 ? [4, 1, 1] : [4, 4, 1];\n const workgroupSize: [number, number, number] = [8, 8, 1];\n const dispatch = [\n Math.ceil(dimBOuter / workgroupSize[0] / elementsPerThread[0]),\n Math.ceil(dimAOuter / workgroupSize[1] / elementsPerThread[1]),\n Math.ceil(batchSize / workgroupSize[2] / elementsPerThread[2])\n ];\n\n const components = isVec4 ? 4 : 1;\n const aShapeTemp = [...outerDimsA, dimAOuter, dimInner / components];\n const aRank = aShapeTemp.length;\n const bShapeTemp = [...outerDimsB, dimInner, dimBOuter / components];\n const bRank = bShapeTemp.length;\n const outputShapeTemp = [batchSize, dimAOuter, dimBOuter / components];\n const programUniforms: ProgramUniform[] = [\n {type: DataType.int32, data: dimAOuter}, {type: DataType.int32, data: dimBOuter},\n {type: DataType.int32, data: dimInner}\n ];\n appendActivationUniformsData(activationAttributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(outerDims, aShapeTemp, bShapeTemp));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n\n const hasBias = inputs.length > 2;\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShapeTemp));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const batchRank = outerDims.length;\n const batchDims = internalVariable('batchDims', inputs[0].dataType, batchRank, 1);\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n\n const A = inputVariable('a', inputs[0].dataType, aRank, components);\n const B = inputVariable('b', inputs[1].dataType, bRank, components);\n const output = outputVariable('result', inputs[0].dataType, outputShapeTemp.length, components);\n const inputVariables = [A, B];\n if (hasBias) {\n const biasComponents = isChannelsLast ? components : 1;\n inputVariables.push(inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, biasComponents));\n }\n const uniforms: UniformsArrayType =\n [{name: 'dim_a_outer', type: 'i32'}, {name: 'dim_b_outer', type: 'i32'}, {name: 'dim_inner', type: 'i32'}];\n appendActivationUniforms(activationAttributes, uniforms);\n const baseType = tensorTypeToWsglStorageType(output.type.tensor);\n const applyActivation = getActivationSnippet(activationAttributes, output.type.value, baseType);\n const declareFunctions = matMulReadWriteFnSource(\n components, hasBias, applyActivation, [batchDims, A, B, output], [outerDimsA, outerDimsB, outerDims],\n isChannelsLast);\n return `\n ${\n shaderHelper.registerUniforms(uniforms).registerInternalVariables(batchDims).declareVariables(\n ...inputVariables, output)}\n ${declareFunctions}\n ${\n isVec4 ? makeMatMulPackedVec4Source(elementsPerThread, workgroupSize, dataType, batchDims) :\n makeMatMulPackedSource(elementsPerThread, workgroupSize, dataType, batchDims)}\n `;\n };\n return {\n name: 'MatMul',\n shaderCache: {\n hint: `${elementsPerThread};${activationAttributes.activation};${isVec4};${isChannelsLast}`,\n inputDependencies\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n programUniforms\n }),\n getShaderSource,\n };\n };\n", "/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/conv2d_mm_webgpu.ts\n//\n// modified to fit the needs of the project\n\nimport {DataType} from '../../../../wasm-common';\nimport {LOG_DEBUG} from '../../../log';\nimport {TensorView} from '../../../tensor-view';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {ConvAttributes} from '../conv';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet} from '../fuse-utils';\n\nimport {biasSnippet, typeSnippet} from './activation_util';\nimport {utilFunctions} from './conv_util';\nimport {makeMatMulPackedSource, makeMatMulPackedVec4Source} from './matmul_packed_webgpu';\n\nconst conv2dCommonSnippet =\n (isChannelsLast: boolean, fitAOuter: boolean, fitBOuter: boolean, fitInner: boolean, addBias = false,\n attributes: ConvAttributes, innerElementSizeX = 4, innerElementSizeW = 4, innerElementSize = 4,\n dataType = 'f32'): string => {\n const getXSnippet = (innerElementSize: number) => {\n switch (innerElementSize) {\n case 1:\n return 'resData = x[xIndex];';\n case 3:\n return `resData = vec3<${dataType}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;\n case 4:\n return 'resData = x[xIndex / 4];';\n default:\n throw new Error(`innerElementSize ${innerElementSize} is not supported.`);\n }\n };\n const getWSnippet = (innerElementSize: number) => {\n switch (innerElementSize) {\n case 1:\n return 'return w[row * i32(uniforms.w_shape[3]) + colIn];';\n case 4:\n return 'return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];';\n default:\n throw new Error(`innerElementSize ${innerElementSize} is not supported.`);\n }\n };\n const coordASnippet = isChannelsLast ? `\n let coord = vec4(batch, xRow, xCol, xCh);\n ` :\n `\n let coord = vec4(batch, xCh, xRow, xCol);\n `;\n\n const coordResSnippet = isChannelsLast ? `\n let coords = vec4(\n batch,\n row / outWidth,\n row % outWidth,\n col);\n ` :\n `\n let coords = vec4(\n batch,\n row,\n col / outWidth,\n col % outWidth);\n `;\n\n const xHeight = isChannelsLast ? 'i32(uniforms.x_shape[1])' : 'i32(uniforms.x_shape[2])';\n const xWidth = isChannelsLast ? 'i32(uniforms.x_shape[2])' : 'i32(uniforms.x_shape[3])';\n const row = isChannelsLast ? 'row' : 'col';\n const col = isChannelsLast ? 'col' : 'row';\n const readXSnippet = `\n let inChannels = i32(uniforms.w_shape[2]);\n let outWidth = ${isChannelsLast ? 'i32(uniforms.result_shape[2])' : 'i32(uniforms.result_shape[3])'};\n let outRow = ${row} / outWidth;\n let outCol = ${row} % outWidth;\n\n let WRow = ${col} / (i32(uniforms.w_shape[1]) * inChannels);\n let WCol = ${col} / inChannels % i32(uniforms.w_shape[1]);\n let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0];\n let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1];\n let xCh = ${col} % inChannels;\n var resData = ${typeSnippet(innerElementSizeX, dataType)}(0.0);\n // The bounds checking is always needed since we use it to pad zero for\n // the 'same' padding type.\n if (xRow >= 0 && xRow < ${xHeight} && xCol >= 0 && xCol < ${xWidth}) {\n ${coordASnippet}\n let xIndex = getIndexFromCoords4D(coord, vec4(uniforms.x_shape));\n ${getXSnippet(innerElementSizeX)}\n }\n return resData;`;\n\n const sampleX = isChannelsLast ? (fitAOuter && fitInner ? `\n let col = colIn * ${innerElementSizeX};\n ${readXSnippet}` :\n `\n let col = colIn * ${innerElementSizeX};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) {\n ${readXSnippet}\n }\n return ${typeSnippet(innerElementSizeX, dataType)}(0.0);`) :\n (fitInner && fitBOuter ? `\n let col = colIn * ${innerElementSizeX};\n ${readXSnippet}` :\n `\n let col = colIn * ${innerElementSizeX};\n if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) {\n ${readXSnippet}\n }\n return ${typeSnippet(innerElementSizeX, dataType)}(0.0);`);\n\n const sampleW = `${getWSnippet(innerElementSizeW)}`;\n\n const resType = typeSnippet(innerElementSize, dataType);\n const aType =\n isChannelsLast ? typeSnippet(innerElementSizeX, dataType) : typeSnippet(innerElementSizeW, dataType);\n const bType =\n isChannelsLast ? typeSnippet(innerElementSizeW, dataType) : typeSnippet(innerElementSizeX, dataType);\n const applyActivation = getActivationSnippet(attributes, resType, dataType);\n const userCode = `\n fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${aType} {\n ${isChannelsLast ? sampleX : sampleW}\n }\n\n fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${bType} {\n ${isChannelsLast ? sampleW : sampleX}\n }\n\n fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${resType}) {\n let col = colIn * ${innerElementSize};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer)\n {\n var value = valueIn;\n let outWidth = ${isChannelsLast ? 'i32(uniforms.result_shape[2])' : 'i32(uniforms.result_shape[3])'};\n ${coordResSnippet}\n ${biasSnippet(addBias)}\n ${applyActivation}\n setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value);\n }\n }`;\n return userCode;\n };\n\nexport const createConv2DMatMulProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvAttributes, outputShape: readonly number[], dimAOuter: number,\n dimBOuter: number, dimInner: number, hasBias: boolean, sequentialAccessByThreads: boolean): ProgramInfo => {\n const isChannelsLast = attributes.format === 'NHWC';\n const inChannels = isChannelsLast ? inputs[0].dims[3] : inputs[0].dims[1];\n const batchSize = outputShape[0];\n const outWidth = isChannelsLast ? outputShape[2] : outputShape[3];\n const outHeight = isChannelsLast ? outputShape[1] : outputShape[2];\n const outChannels = isChannelsLast ? outputShape[3] : outputShape[1];\n // TODO: enable vec4 for NCHW\n const isVec4 = isChannelsLast && (inChannels % 4 === 0 || inChannels % 3 === 0) && outChannels % 4 === 0;\n\n // TODO: fine tune size\n const dispatchX = isChannelsLast ? outChannels : outWidth * outHeight;\n const dispatchY = isChannelsLast ? outWidth * outHeight : outChannels;\n const workGroupSize: [number, number, number] = [8, 8, 1];\n const elementsPerThread = dimAOuter <= 8 ? [4, 1, 1] : [4, 4, 1];\n const dispatch = [\n Math.ceil(dispatchX / workGroupSize[0] / elementsPerThread[0]),\n Math.ceil(dispatchY / workGroupSize[1] / elementsPerThread[1]),\n Math.ceil(batchSize / workGroupSize[2] / elementsPerThread[2])\n ];\n\n LOG_DEBUG('verbose', () => `[conv2d_mm_webgpu] dispatch = ${dispatch}`);\n\n const innerElementSize = isVec4 ? (isChannelsLast && inChannels % 4 !== 0 ? 3 : 4) : 1;\n const tileAOuter = workGroupSize[1] * elementsPerThread[1];\n const tileBOuter = workGroupSize[0] * elementsPerThread[0];\n const tileInner = Math.max(workGroupSize[0] * innerElementSize, workGroupSize[1]);\n const fitAOuter = dimAOuter % tileAOuter === 0;\n const fitBOuter = dimBOuter % tileBOuter === 0;\n const fitInner = dimInner % tileInner === 0;\n const elementsSize = isVec4 ? [innerElementSize, 4, 4] : [1, 1, 1];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.int32, data: dimAOuter}, {type: DataType.int32, data: dimBOuter},\n {type: DataType.int32, data: dimInner}, {type: DataType.int32, data: [attributes.pads[0], attributes.pads[1]]},\n {type: DataType.int32, data: attributes.strides}, {type: DataType.int32, data: attributes.dilations}\n ];\n appendActivationUniformsData(attributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(inputs[0].dims, inputs[1].dims));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const uniforms: UniformsArrayType = [\n {name: 'dim_a_outer', type: 'i32'}, {name: 'dim_b_outer', type: 'i32'}, {name: 'dim_inner', type: 'i32'},\n {name: 'pad', type: 'i32', length: 2}, {name: 'stride', type: 'i32', length: 2},\n {name: 'dilation', type: 'i32', length: 2}\n ];\n appendActivationUniforms(attributes, uniforms);\n\n // TODO: support component 2, 3.\n const components = isVec4 ? 4 : 1;\n const t = tensorTypeToWsglStorageType(inputs[0].dataType);\n let declareFunctions = `\n fn setOutputAtIndex(flatIndex : i32, value : ${isVec4 ? `vec4<${t}>` : t}) {\n result[flatIndex] = ${isVec4 ? `vec4<${t}>` : t}(value);\n }\n fn setOutputAtCoords(d0 : i32, d1 : i32, d2 : i32, d3 : i32, value : ${isVec4 ? `vec4<${t}>` : t}) {\n let flatIndex = getOutputIndexFromCoords(vec4(d0, d1, d2, d3));\n setOutputAtIndex(flatIndex ${isVec4 ? '/ 4' : ''}, value);\n }`;\n const x = inputVariable(\n 'x', inputs[0].dataType, inputs[0].dims.length, innerElementSize === 3 ? 1 : innerElementSize);\n const w = inputVariable('w', inputs[1].dataType, inputs[1].dims.length, components);\n const inputVariables = [x, w];\n const output = outputVariable('result', inputs[0].dataType, outputShape.length, components);\n if (hasBias) {\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, components);\n inputVariables.push(bias);\n declareFunctions += `\n fn getBiasByOutputCoords(coords : vec4) -> ${isVec4 ? `vec4<${t}>` : t} {\n return bias[coords.${isChannelsLast ? 'w' : 'y'}${isVec4 ? '/ 4' : ''}];\n }`;\n }\n\n return `\n ${utilFunctions('uniforms.result_strides')}\n //struct Uniforms { xShape : vec4, wShape : vec4, outShape : vec4,\n // outShapeStrides: vec3, filterDims : vec2, pad : vec2, stride : vec2,\n // dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32 };\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)}\n ${declareFunctions}\n ${\n conv2dCommonSnippet(\n isChannelsLast, fitAOuter, fitBOuter, fitInner, hasBias, attributes, elementsSize[0], elementsSize[1],\n elementsSize[2], t)}\n ${\n isVec4 ?\n makeMatMulPackedVec4Source(elementsPerThread, workGroupSize, t, undefined, !isChannelsLast, tileInner) :\n makeMatMulPackedSource(\n elementsPerThread, workGroupSize, t, undefined, !isChannelsLast, tileInner, false, undefined,\n sequentialAccessByThreads)}`;\n };\n return {\n name: 'Conv2DMatMul',\n shaderCache: {\n hint: `${attributes.cacheKey};${innerElementSize};${isVec4};${fitAOuter};${fitBOuter};${fitInner};${\n tileAOuter};${tileBOuter};${tileInner}`,\n inputDependencies\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n programUniforms,\n }),\n getShaderSource\n };\n };\n", "/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/conv3d_naive_webgpu.ts\n//\n// modified to fit the needs of the project\n\nimport {DataType} from '../../../../wasm-common';\nimport {LOG_DEBUG} from '../../../log';\nimport {TensorView} from '../../../tensor-view';\nimport {ShapeUtil} from '../../../util';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, getElementAt, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {ConvAttributes} from '../conv';\n\nconst arrayProduct = (arr: number[]) => {\n let product = 1;\n for (let i = 0; i < arr.length; i++) {\n product *= arr[i];\n }\n return product;\n};\n\nconst parse3TupleParam = (param: number|[number, number, number]): [number, number, number] =>\n typeof param === 'number' ? [param, param, param] : param;\n\nconst getEffectiveFilterSize = (filterSize: number, dilation: number): number => {\n if (dilation <= 1) {\n return filterSize;\n }\n\n return filterSize + (filterSize - 1) * (dilation - 1);\n};\n\nconst computeDefaultPad =\n (inputShape: [number, number]|[number, number, number, number], fieldSize: number, stride: number, dilation = 1):\n number => {\n const effectiveFieldSize = getEffectiveFilterSize(fieldSize, dilation);\n return Math.floor((inputShape[0] * (stride - 1) - stride + effectiveFieldSize) / 2);\n };\n\nconst computeOutputShape4D =\n (inShape: [number, number, number, number], filterShape: [number, number, number], outChannels: number,\n strides: [number, number, number], zeroPad?: number): [number, number, number, number] => {\n if (zeroPad == null) {\n // eslint-disable-next-line no-param-reassign\n zeroPad = computeDefaultPad(inShape, filterShape[0], strides[0]);\n }\n const outShape: [number, number, number, number] = [0, 0, 0, outChannels];\n for (let index = 0; index < 3; index++) {\n if (inShape[index] + 2 * zeroPad >= filterShape[index]) {\n outShape[index] = Math.trunc((inShape[index] - filterShape[index] + 2 * zeroPad) / strides[index] + 1);\n }\n }\n return outShape;\n };\n\nconst get3DPadAndOutInfo =\n (pad: number|string|number[], inDepth: number, inHeight: number, inWidth: number, strideDepth: number,\n strideHeight: number, strideWidth: number, filterDepth: number, filterHeight: number,\n filterWidth: number): {padInfo: PadInfo3D; outDepth: number; outHeight: number; outWidth: number} => {\n let padInfo: PadInfo3D;\n let outDepth: number;\n let outHeight: number;\n let outWidth: number;\n\n if (pad === 'VALID') {\n // eslint-disable-next-line no-param-reassign\n pad = 0;\n }\n\n if (typeof pad === 'number') {\n padInfo = {top: pad, bottom: pad, left: pad, right: pad, front: pad, back: pad};\n const outShape = computeOutputShape4D(\n [inDepth, inHeight, inWidth, 1], [filterDepth, filterHeight, filterWidth], 1,\n [strideDepth, strideHeight, strideWidth], pad);\n outDepth = outShape[0];\n outHeight = outShape[1];\n outWidth = outShape[2];\n } else if (Array.isArray(pad)) {\n if (!pad.every((val, _, arr) => val === arr[0])) {\n throw Error(`Unsupported padding parameter: ${pad}`);\n }\n padInfo = {top: pad[0], bottom: pad[1], left: pad[2], right: pad[3], front: pad[4], back: pad[5]};\n const outShape = computeOutputShape4D(\n [inDepth, inHeight, inWidth, 1], [filterDepth, filterHeight, filterWidth], 1,\n [strideDepth, strideHeight, strideWidth], pad[0]);\n outDepth = outShape[0];\n outHeight = outShape[1];\n outWidth = outShape[2];\n } else if (pad === 'SAME_UPPER') {\n // TODO: support 'SAME_LOWER'.\n outDepth = Math.ceil(inDepth / strideDepth);\n outHeight = Math.ceil(inHeight / strideHeight);\n outWidth = Math.ceil(inWidth / strideWidth);\n const padAlongDepth = (outDepth - 1) * strideDepth + filterDepth - inDepth;\n const padAlongHeight = (outHeight - 1) * strideHeight + filterHeight - inHeight;\n const padAlongWidth = (outWidth - 1) * strideWidth + filterWidth - inWidth;\n const front = Math.floor(padAlongDepth / 2);\n const back = padAlongDepth - front;\n const top = Math.floor(padAlongHeight / 2);\n const bottom = padAlongHeight - top;\n const left = Math.floor(padAlongWidth / 2);\n const right = padAlongWidth - left;\n\n padInfo = {top, bottom, left, right, front, back};\n } else {\n throw Error(`Unknown padding parameter: ${pad}`);\n }\n return {padInfo, outDepth, outHeight, outWidth};\n };\n\ntype PadInfo3D = {\n top: number; left: number; right: number; bottom: number; front: number; back: number;\n};\n\nexport type Conv3DInfo = {\n batchSize: number; inDepth: number; inHeight: number; inWidth: number; inChannels: number; outDepth: number;\n outHeight: number;\n outWidth: number;\n outChannels: number;\n dataFormat: 'channelsFirst' | 'channelsLast';\n strideDepth: number;\n strideHeight: number;\n strideWidth: number;\n dilationDepth: number;\n dilationHeight: number;\n dilationWidth: number;\n filterDepth: number;\n filterHeight: number;\n filterWidth: number;\n effectiveFilterDepth: number;\n effectiveFilterHeight: number;\n effectiveFilterWidth: number;\n padInfo: PadInfo3D;\n inShape: [number, number, number, number, number];\n outShape: [number, number, number, number, number];\n filterShape: [number, number, number, number, number];\n};\n\nexport const computeConv3DInfo =\n (inShape: [number, number, number, number, number], filterShape: [number, number, number, number, number],\n strides: number|[number, number, number], dilations: number|[number, number, number], pad: number|string|number[],\n depthwise = false, dataFormat: 'channelsFirst'|'channelsLast' = 'channelsLast'): Conv3DInfo => {\n let batchSize, inDepth, inHeight, inWidth, inChannels;\n if (dataFormat === 'channelsLast') {\n [batchSize, inDepth, inHeight, inWidth, inChannels] = inShape;\n } else if (dataFormat === 'channelsFirst') {\n [batchSize, inChannels, inDepth, inHeight, inWidth] = inShape;\n } else {\n throw new Error(`Unknown dataFormat ${dataFormat}`);\n }\n const [filterChannels, , filterDepth, filterHeight, filterWidth] = filterShape;\n\n const [strideDepth, strideHeight, strideWidth] = parse3TupleParam(strides);\n const [dilationDepth, dilationHeight, dilationWidth] = parse3TupleParam(dilations);\n\n const effectiveFilterDepth = getEffectiveFilterSize(filterDepth, dilationDepth);\n const effectiveFilterHeight = getEffectiveFilterSize(filterHeight, dilationHeight);\n const effectiveFilterWidth = getEffectiveFilterSize(filterWidth, dilationWidth);\n const {padInfo, outDepth, outHeight, outWidth} = get3DPadAndOutInfo(\n pad, inDepth, inHeight, inWidth, strideDepth, strideHeight, strideWidth, effectiveFilterDepth,\n effectiveFilterHeight, effectiveFilterWidth);\n\n const outChannels = depthwise ? filterChannels * inChannels : filterChannels;\n\n let outShape: [number, number, number, number, number] = [0, 0, 0, 0, 0];\n if (dataFormat === 'channelsFirst') {\n outShape = [batchSize, outChannels, outDepth, outHeight, outWidth];\n } else if (dataFormat === 'channelsLast') {\n outShape = [batchSize, outDepth, outHeight, outWidth, outChannels];\n }\n\n return {\n batchSize,\n dataFormat,\n inDepth,\n inHeight,\n inWidth,\n inChannels,\n outDepth,\n outHeight,\n outWidth,\n outChannels,\n padInfo,\n strideDepth,\n strideHeight,\n strideWidth,\n filterDepth,\n filterHeight,\n filterWidth,\n effectiveFilterDepth,\n effectiveFilterHeight,\n effectiveFilterWidth,\n dilationDepth,\n dilationHeight,\n dilationWidth,\n inShape,\n outShape,\n filterShape\n };\n };\n\nexport const createConv3DNaiveProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvAttributes, outputShape: readonly number[],\n filterDims: readonly number[], pads: readonly number[], dataFormat: string): ProgramInfo => {\n const isChannelsLast = dataFormat === 'channelsLast';\n const inChannels = isChannelsLast ? inputs[0].dims[3] : inputs[0].dims[1];\n // TODO: enable vec4.\n const isVec4 = false;\n const workGroupSize: [number, number, number] = [64, 1, 1];\n const dispatchLayout = {x: outputShape.map((_, i) => i)};\n const dispatch = [Math.ceil(arrayProduct(dispatchLayout.x.map(d => outputShape[d])) / (workGroupSize[0])), 1, 1];\n\n LOG_DEBUG('verbose', () => `[conv3d_naive_webgpu] dispatch = ${dispatch}`);\n\n const innerElementSize = isVec4 ? (isChannelsLast && inChannels % 4 !== 0 ? 3 : 4) : 1;\n const outputSize = ShapeUtil.size(outputShape);\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: filterDims},\n {type: DataType.uint32, data: pads}, {type: DataType.uint32, data: attributes.strides},\n {type: DataType.uint32, data: attributes.dilations}\n ];\n programUniforms.push(...createTensorShapeVariables(inputs[0].dims, inputs[1].dims));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n const hasBias = inputs.length === 3;\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'filter_dims', type: 'u32', length: filterDims.length},\n {name: 'pads', type: 'u32', length: pads.length},\n {name: 'strides', type: 'u32', length: attributes.strides.length},\n {name: 'dilations', type: 'u32', length: attributes.dilations.length}\n ];\n // TODO: support component 2, 3.\n const components = isVec4 ? 4 : 1;\n const t = tensorTypeToWsglStorageType(inputs[0].dataType);\n\n const x = inputVariable(\n 'x', inputs[0].dataType, inputs[0].dims.length, innerElementSize === 3 ? 1 : innerElementSize);\n const w = inputVariable('W', inputs[1].dataType, inputs[1].dims.length, components);\n const inputVariables = [x, w];\n const output = outputVariable('result', inputs[0].dataType, outputShape.length, components);\n let declareFunctions = '';\n if (hasBias) {\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, components);\n inputVariables.push(bias);\n declareFunctions += `\n fn getBiasByOutputCoords(coords : array) -> ${isVec4 ? `vec4<${t}>` : t} {\n return bias[${isChannelsLast ? getElementAt('coords', 4, 5) : getElementAt('coords', 1, 5)}${\n isVec4 ? '/ 4' : ''}];\n }`;\n }\n\n return `\n ${declareFunctions}\n fn getX(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 {\n let aIndices = array(d0, d1, d2, d3, d4);\n return ${x.getByIndices('aIndices')};\n }\n fn getW(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 {\n let aIndices = array(d0, d1, d2, d3, d4);\n return ${w.getByIndices('aIndices')};\n }\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let coords = ${output.offsetToIndices('global_idx')};\n let batch = ${getElementAt('coords', 0, x.rank)};\n let d2 = ${\n isChannelsLast ? getElementAt('coords', x.rank - 1, x.rank) : getElementAt('coords', 1, x.rank)};\n let xFRCCorner = vec3(${\n isChannelsLast ? getElementAt('coords', 1, x.rank) : getElementAt('coords', 2, x.rank)},\n ${isChannelsLast ? getElementAt('coords', 2, x.rank) : getElementAt('coords', 3, x.rank)},\n ${\n isChannelsLast ? getElementAt('coords', 3, x.rank) :\n getElementAt('coords', 4, x.rank)}) * uniforms.strides - uniforms.pads;\n let xFCorner = xFRCCorner.x;\n let xRCorner = xFRCCorner.y;\n let xCCorner = xFRCCorner.z;\n let xShapeY = ${\n isChannelsLast ? getElementAt('uniforms.x_shape', 1, x.rank) : getElementAt('uniforms.x_shape', 2, x.rank)};\n let xShapeZ = ${\n isChannelsLast ? getElementAt('uniforms.x_shape', 2, x.rank) : getElementAt('uniforms.x_shape', 3, x.rank)};\n let xShapeW = ${\n isChannelsLast ? getElementAt('uniforms.x_shape', 3, x.rank) : getElementAt('uniforms.x_shape', 4, x.rank)};\n let xShapeU = ${\n isChannelsLast ? getElementAt('uniforms.x_shape', 4, x.rank) : getElementAt('uniforms.x_shape', 1, x.rank)};\n let inputDepthNearestVec4 = (xShapeU / 4) * 4;\n let inputDepthVec4Remainder = xShapeU % 4;\n\n var dotProd = 0.0;\n for (var wF = 0u; wF < uniforms.filter_dims[0]; wF++) {\n let xF = xFCorner + wF * uniforms.dilations[0];\n if (xF < 0 || xF >= xShapeY) {\n continue;\n }\n\n for (var wR = 0u; wR < uniforms.filter_dims[1]; wR++) {\n let xR = xRCorner + wR * uniforms.dilations[1];\n if (xR < 0 || xR >= xShapeZ) {\n continue;\n }\n\n for (var wC = 0u; wC < uniforms.filter_dims[2]; wC++) {\n let xC = xCCorner + wC * uniforms.dilations[2];\n if (xC < 0 || xC >= xShapeW) {\n continue;\n }\n\n for (var d1 = 0u; d1 < inputDepthNearestVec4; d1 += 4) {\n ${\n isChannelsLast ? `let xValues = vec4(\n getX(batch, xF, xR, xC, d1),\n getX(batch, xF, xR, xC, d1 + 1),\n getX(batch, xF, xR, xC, d1 + 2),\n getX(batch, xF, xR, xC, d1 + 3));\n ` :\n `let xValues = vec4(\n getX(batch, d1, xF, xR, xC),\n getX(batch, d1 + 1, xF, xR, xC),\n getX(batch, d1 + 2, xF, xR, xC),\n getX(batch, d1 + 3, xF, xR, xC));\n `}\n let wValues = vec4(\n getW(d2, d1, wF, wR, wC),\n getW(d2, d1 + 1, wF, wR, wC),\n getW(d2, d1 + 2, wF, wR, wC),\n getW(d2, d1 + 3, wF, wR, wC));\n dotProd += dot(xValues, wValues);\n }\n if (inputDepthVec4Remainder == 1) {\n ${\n isChannelsLast ? `dotProd += getX(batch, xF, xR, xC, inputDepthNearestVec4)\n * getW(d2, inputDepthNearestVec4, wF, wR, wC);` :\n `dotProd += getX(batch, inputDepthNearestVec4, xF, xR, xC)\n * getW(d2, inputDepthNearestVec4, wF, wR, wC);`}\n } else if (inputDepthVec4Remainder == 2) {\n ${\n isChannelsLast ? `let xValues = vec2(\n getX(batch, xF, xR, xC, inputDepthNearestVec4),\n getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1));\n ` :\n `let xValues = vec2(\n getX(batch, inputDepthNearestVec4, xF, xR, xC),\n getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC));\n `}\n let wValues = vec2(\n getW(d2, inputDepthNearestVec4, wF, wR, wC),\n getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC));\n dotProd += dot(xValues, wValues);\n } else if (inputDepthVec4Remainder == 3) {\n ${\n isChannelsLast ? `let xValues = vec3(\n getX(batch, xF, xR, xC, inputDepthNearestVec4),\n getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1),\n getX(batch, xF, xR, xC, inputDepthNearestVec4 + 2));\n ` :\n `let xValues = vec3(\n getX(batch, inputDepthNearestVec4, xF, xR, xC),\n getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC),\n getX(batch, inputDepthNearestVec4 + 2, xF, xR, xC));\n `}\n let wValues = vec3(\n getW(d2, inputDepthNearestVec4, wF, wR, wC),\n getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC),\n getW(d2, inputDepthNearestVec4 + 2, wF, wR, wC));\n dotProd += dot(xValues, wValues);\n }\n }\n }\n }\n ${hasBias ? 'dotProd = dotProd + getBiasByOutputCoords(coords)' : ''};\n result[global_idx] = f32(dotProd);\n }`;\n };\n return {\n name: 'Conv3DNaive',\n shaderCache:\n {hint: `${attributes.cacheKey};${isChannelsLast};${innerElementSize};${hasBias}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n programUniforms,\n }),\n getShaderSource\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, getMaxComponents, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\nimport {calculateOutputShape, ConvAttributes} from './conv';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet} from './fuse-utils';\n\n/**\n * naive grouped conv implementation, supports 1d/2d conv\n * @param squeezeOutputShapeFunction - an optional function to squeeze the output shape, only used in conv1d\n */\nexport const createGroupedConvProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvAttributes,\n squeezeOutputShapeFunction?: (shape: readonly number[]) => number[]): ProgramInfo => {\n const hasBias = inputs.length > 2;\n const processBias = hasBias ? 'value += b[output_channel];' : '';\n const xShape = inputs[0].dims;\n const wShape = inputs[1].dims;\n const outputChannelsPerGroup = wShape[0] / attributes.group;\n\n const isChannelLast = attributes.format === 'NHWC';\n const outputShape = calculateOutputShape(\n xShape, wShape, attributes.dilations, attributes.pads, attributes.strides, isChannelLast);\n const outputSize = ShapeUtil.size(outputShape);\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: attributes.dilations},\n {type: DataType.uint32, data: [attributes.strides[0], attributes.strides[1]]},\n {type: DataType.uint32, data: [attributes.pads[0], attributes.pads[1]]},\n {type: DataType.uint32, data: outputChannelsPerGroup}\n ];\n appendActivationUniformsData(attributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(xShape, wShape));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('output', inputs[0].dataType, outputShape.length);\n const baseType = tensorTypeToWsglStorageType(output.type.tensor);\n const applyActivation = getActivationSnippet(attributes, output.type.value, baseType);\n const x = inputVariable('x', inputs[0].dataType, xShape.length);\n const w = inputVariable('w', inputs[1].dataType, wShape.length);\n const inputVars = [x, w];\n if (hasBias) {\n inputVars.push(inputVariable('b', inputs[2].dataType, inputs[2].dims.length));\n }\n\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'dilations', type: 'u32', length: attributes.dilations.length},\n {name: 'strides', type: 'u32', length: 2}, {name: 'pads', type: 'u32', length: 2},\n {name: 'output_channels_per_group', type: 'u32'}\n ];\n appendActivationUniforms(attributes, uniforms);\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVars, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let outputIndices = ${output.offsetToIndices('global_idx')};\n let batch: u32 = outputIndices[0];\n let output_channel: u32 = outputIndices[${isChannelLast ? 3 : 1}];\n let xRCCorner: vec2 = vec2(outputIndices[${isChannelLast ? 1 : 2}], outputIndices[${\n isChannelLast ? 2 : 3}]) * uniforms.strides - uniforms.pads;\n let group_id: u32 = output_channel / uniforms.output_channels_per_group;\n\n var value: ${output.type.value} = ${output.type.value}(0);\n for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[1]; wInChannel++) {\n let input_channel = group_id * uniforms.w_shape[1] + wInChannel;\n for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[2]; wHeight++) {\n let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0];\n\n if (xHeight < 0u || xHeight >= uniforms.x_shape[${isChannelLast ? 1 : 2}]) {\n continue;\n }\n\n for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[3]; wWidth++) {\n let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1];\n if (xWidth < 0u || xWidth >= uniforms.x_shape[${isChannelLast ? 2 : 3}]) {\n continue;\n }\n\n let xVal = ${\n isChannelLast ? x.get('batch', 'xHeight', 'xWidth', 'input_channel') :\n x.get('batch', 'input_channel', 'xHeight', 'xWidth')};\n let wVal = ${w.get('output_channel', 'wInChannel', 'wHeight', 'wWidth')};\n value += xVal*wVal;\n }\n }\n }\n ${processBias}\n ${applyActivation}\n ${output.setByOffset('global_idx', 'value')}\n }`;\n };\n return {\n name: 'GroupedConv',\n shaderCache: {hint: attributes.cacheKey, inputDependencies},\n getRunData: () => ({\n outputs: [{\n dims: squeezeOutputShapeFunction ? squeezeOutputShapeFunction(outputShape) : outputShape,\n dataType: inputs[0].dataType\n }],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n };\n\nexport const createGroupedConvVectorizeProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvAttributes, outputShape: readonly number[]): ProgramInfo => {\n const hasBias = inputs.length > 2;\n const components = getMaxComponents(outputShape[3]);\n const outputNumber = getMaxComponents(outputShape[2]);\n const outputSize = ShapeUtil.size(outputShape) / components / outputNumber;\n const xShape = [inputs[0].dims[0], inputs[0].dims[1], inputs[0].dims[2], inputs[0].dims[3] / components];\n const wShape = [inputs[1].dims[0], inputs[1].dims[1], inputs[1].dims[2], inputs[1].dims[3] / components];\n const outputShapeInShader = [outputShape[0], outputShape[1], outputShape[2], outputShape[3] / components];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize},\n {type: DataType.int32, data: [attributes.strides[0], attributes.strides[1]]},\n {type: DataType.int32, data: [attributes.pads[0], attributes.pads[1]]}\n ];\n appendActivationUniformsData(attributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(xShape, wShape, outputShapeInShader));\n const xNumber = (outputNumber - 1) * attributes.strides[1] + wShape[1];\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('output', inputs[0].dataType, outputShapeInShader.length, components);\n const baseType = tensorTypeToWsglStorageType(output.type.tensor);\n const applyActivation = getActivationSnippet(attributes, output.type.value, baseType);\n const x = inputVariable('x', inputs[0].dataType, xShape.length, components);\n const w = inputVariable('w', inputs[1].dataType, wShape.length, components);\n const inputVars = [x, w];\n if (hasBias) {\n inputVars.push(inputVariable('b', inputs[2].dataType, inputs[2].dims, components));\n }\n const processBias = hasBias ? 'value += b[output_channel];' : '';\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'},\n {name: 'strides', type: 'i32', length: 2},\n {name: 'pads', type: 'i32', length: 2},\n ];\n appendActivationUniforms(attributes, uniforms);\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVars, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let width0 = uniforms.output_shape[3];\n let output_channel = global_idx % width0;\n var index1 = global_idx / width0;\n let width1 = uniforms.output_shape[2] / ${outputNumber}u;\n let col = (index1 % width1) * ${outputNumber}u;\n index1 = index1 / width1;\n let row = index1 % uniforms.output_shape[1];\n let batch = index1 / uniforms.output_shape[1];\n\n let x_corner = vec2(i32(row), i32(col)) * uniforms.strides - uniforms.pads;\n\n var x_vals: array<${x.type.value}, ${xNumber}>;\n var values: array<${output.type.value}, ${outputNumber}>;\n let input_channel = output_channel;\n // Use constant instead of uniform can give better performance for w's height/width.\n for (var w_height: u32 = 0u; w_height < ${wShape[0]}; w_height++) {\n let x_height = x_corner.x + i32(w_height);\n if (x_height >= 0 && u32(x_height) < uniforms.x_shape[1]) {\n for (var i = 0; i < ${xNumber}; i++) {\n let x_width = x_corner.y + i;\n if (x_width >= 0 && u32(x_width) < uniforms.x_shape[2]) {\n x_vals[i] = ${x.get('batch', 'u32(x_height)', 'u32(x_width)', 'input_channel')};\n } else {\n x_vals[i] = ${x.type.value}(0);\n }\n }\n for (var w_width: u32 = 0u; w_width < ${wShape[1]}; w_width++) {\n let w_val = ${w.get('w_height', 'w_width', '0', 'output_channel')};\n for (var i = 0u; i < ${outputNumber}u; i++) {\n values[i] = fma(x_vals[i * u32(uniforms.strides[1]) + w_width], w_val, values[i]);\n }\n }\n }\n }\n\n for (var i = 0u; i < ${outputNumber}u; i++) {\n var value = values[i];\n ${processBias}\n ${applyActivation}\n ${output.set('batch', 'row', 'col + i', 'output_channel', 'value')};\n }\n }`;\n };\n\n return {\n name: 'GroupedConv-Vectorize',\n shaderCache: {\n hint: `${attributes.cacheKey};${components};${outputNumber};${xNumber};${wShape[0]};${wShape[1]}`,\n inputDependencies: hasBias ? ['rank', 'rank', 'type'] : ['rank', 'rank']\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {BroadcastUtil, ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createMatmulProgramInfo} from './3rd-party/matmul_packed_webgpu';\nimport {createTensorShapeVariables, getBroadcastDims, getMaxComponents, IndicesHelper, inputVariable, internalVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet, InternalActivationAttributes} from './fuse-utils';\n\nexport const createNaiveMatmulProgramInfo =\n (inputs: readonly TensorView[], activationAttributes: InternalActivationAttributes, outputShape: readonly number[],\n reshapedOutputShape?: readonly number[],\n isChannelsLast = false /* only used for conv2dByMatMul*/): ProgramInfo => {\n const aShape = inputs[0].dims;\n const bShape = inputs[1].dims;\n\n const M = aShape[aShape.length - 2];\n const N = bShape[bShape.length - 1];\n const K = aShape[aShape.length - 1];\n const components = getMaxComponents(N);\n const aComponents = getMaxComponents(K);\n const outputNumber = getMaxComponents(M);\n const outputSize = ShapeUtil.size(outputShape) / components / outputNumber;\n const hasBias = inputs.length > 2;\n const outerDims = reshapedOutputShape ? reshapedOutputShape.slice(0, -2) : outputShape.slice(0, -2);\n const batchSize = ShapeUtil.size(outerDims);\n const outputShapeInShader = [batchSize, M, N];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: M}, {type: DataType.uint32, data: N},\n {type: DataType.uint32, data: K}\n ];\n appendActivationUniformsData(activationAttributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(outerDims, aShape, bShape));\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n }\n programUniforms.push(...createTensorShapeVariables(outputShapeInShader));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const batchDims = internalVariable('batch_dims', inputs[0].dataType, outerDims.length);\n const a = inputVariable('a', inputs[0].dataType, aShape.length, aComponents);\n const b = inputVariable('b', inputs[1].dataType, bShape.length, components);\n const output = outputVariable('output', inputs[0].dataType, outputShapeInShader.length, components);\n const baseType = tensorTypeToWsglStorageType(output.type.tensor);\n const applyActivation = getActivationSnippet(activationAttributes, output.type.value, baseType);\n const inputVariables = [a, b];\n let processBias = '';\n if (hasBias) {\n const biasComponents = isChannelsLast ? components : 1;\n inputVariables.push(inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, biasComponents));\n processBias = `${\n isChannelsLast ? `value += bias[col / ${biasComponents}];` :\n `value += ${output.type.value}(bias[row + i]);`}`;\n }\n\n const outerDimsA = aShape.slice(0, -2);\n const outerDimsB = bShape.slice(0, -2);\n const broadCastADims = getBroadcastDims(outerDimsA, outerDims);\n const broadCastBDims = getBroadcastDims(outerDimsB, outerDims);\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'M', type: 'u32'}, {name: 'N', type: 'u32'},\n {name: 'K', type: 'u32'}\n ];\n appendActivationUniforms(activationAttributes, uniforms);\n\n const getIndices = (variable: IndicesHelper, broadCastDims: number[]) => {\n const rank = variable.rank;\n const name = variable.name;\n if (rank === 2) {\n return `var ${name}_indices = ${variable.type.indices}(0u, 0u);`;\n }\n const batchRank = batchDims.rank;\n let resStr = `var ${name}_indices: ${variable.type.indices};`;\n for (let i = rank - 2 - 1, j = batchRank - 1; i >= 0; i--, j--) {\n resStr += `\\n${name}_indices[${i}] = ${batchRank > 1 ? `batch_indices[${j}]` : 'batch_indices'};`;\n }\n broadCastDims.forEach(i => {\n resStr += `\\n${name}_indices[${i}] = 0;`;\n });\n resStr += `${name}_indices[${rank - 2}] = 0u;\n ${name}_indices[${rank - 1}] = 0u;`;\n return resStr;\n };\n\n const calcResult = (): string => {\n let calcStr = `var a_data: ${a.type.value};`;\n for (let i = 0; i < aComponents; i++) {\n calcStr += `\n let b_data${i} = b[(b_offset + (k + ${i}) * uniforms.N + col) / ${components}];`;\n }\n for (let i = 0; i < outputNumber; i++) {\n calcStr += `a_data = a[(a_offset + (row + ${i}) * uniforms.K + k) / ${aComponents}];`;\n\n for (let j = 0; j < aComponents; j++) {\n calcStr += `\n values[${i}] = fma(${b.type.value}(a_data${aComponents === 1 ? '' : `[${j}]`}), b_data${j}, values[${\n i}]);\\n`;\n }\n }\n return calcStr;\n };\n\n return `\n ${\n shaderHelper.registerUniforms(uniforms).registerInternalVariables(batchDims).declareVariables(\n ...inputVariables, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let col = (global_idx % (uniforms.N / ${components})) * ${components};\n var index1 = global_idx / (uniforms.N / ${components});\n let stride1 = uniforms.M / ${outputNumber};\n let row = (index1 % stride1) * ${outputNumber};\n let batch = index1 / stride1;\n\n ${outputShape.length === 2 ? '' : `let batch_indices = ${batchDims.offsetToIndices('batch')};`}\n ${getIndices(a, broadCastADims)}\n let a_offset = ${a.indicesToOffset('a_indices')};\n ${getIndices(b, broadCastBDims)}\n let b_offset = ${b.indicesToOffset('b_indices')};\n var values: array<${output.type.value}, ${outputNumber}>;\n for (var k: u32 = 0u; k < uniforms.K; k = k + ${aComponents}) {\n ${calcResult()}\n }\n for (var i = 0u; i < ${outputNumber}u; i++) {\n var value = values[i];\n ${processBias}\n ${applyActivation}\n let cur_indices = ${output.type.indices}(batch, row + i, col);\n let offset = ${output.indicesToOffset('cur_indices')};\n ${output.setByOffset(`offset / ${components}`, 'value')};\n }\n }\n `;\n };\n return {\n name: 'MatMulNaive',\n shaderCache: {\n hint: `${activationAttributes.activation};${components};${aComponents};${outputNumber};${isChannelsLast}`,\n inputDependencies: hasBias ? ['rank', 'rank', 'rank'] : ['rank', 'rank']\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource\n };\n };\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('MatMul requires 2 inputs.');\n }\n\n if (inputs[0].dims[inputs[0].dims.length - 1] !== inputs[1].dims[inputs[1].dims.length - 2]) {\n throw new Error('shared dimension does not match.');\n }\n};\n\nexport const matMul = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n const outputShape = BroadcastUtil.calcShape(context.inputs[0].dims, context.inputs[1].dims, true);\n if (!outputShape) {\n throw new Error('Can\\'t use matmul on the given tensors');\n }\n const N = outputShape[outputShape.length - 1];\n const K = context.inputs[0].dims[context.inputs[0].dims.length - 1];\n if (N < 8 && K < 8) {\n context.compute(createNaiveMatmulProgramInfo(context.inputs, {activation: ''}, outputShape));\n } else {\n context.compute(createMatmulProgramInfo(context.inputs, {activation: ''}, outputShape));\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorView} from '../../tensor-view';\nimport {PoolConvUtil} from '../../util';\nimport {AttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext} from '../types';\n\nimport {createConv2DMatMulProgramInfo} from './3rd-party/conv2d_mm_webgpu';\nimport {computeConv3DInfo, createConv3DNaiveProgramInfo} from './3rd-party/conv3d_naive_webgpu';\nimport {createMatmulProgramInfo} from './3rd-party/matmul_packed_webgpu';\nimport {createGroupedConvProgramInfo, createGroupedConvVectorizeProgramInfo} from './conv-grouped';\nimport {InternalActivationAttributes, parseInternalActivationAttributes} from './fuse-utils';\nimport {createNaiveMatmulProgramInfo} from './matmul';\nimport {createTransposeProgramInfo} from './transpose';\n\nexport const calculateOutputShape =\n (inputShape: readonly number[], kernelShape: readonly number[], dilations: readonly number[],\n adjustPads: readonly number[], strides: readonly number[], isChannelLast: boolean): number[] => {\n const batchSize = inputShape[0];\n const inputSpatialShape = inputShape.slice(isChannelLast ? 1 : 2, isChannelLast ? 3 : 4);\n const spatialRank = inputSpatialShape.length;\n const outChannels = kernelShape[0];\n const kernelSpatialShape = kernelShape.slice(2);\n const dilatedKernelShape = kernelSpatialShape.map((v, i) => v + (v - 1) * (dilations[i] - 1));\n const inputSpatialShapeWithPad = inputSpatialShape.map((v, i) => v + adjustPads[i] + adjustPads[i + spatialRank]);\n const outputShape =\n inputSpatialShapeWithPad.map((v, i) => Math.floor((v - dilatedKernelShape[i] + strides[i]) / strides[i]));\n outputShape.splice(0, 0, batchSize);\n outputShape.splice(isChannelLast ? 3 : 1, 0, outChannels);\n return outputShape;\n };\n\nexport interface ConvAttributes extends InternalActivationAttributes, AttributeWithCacheKey {\n readonly autoPad: string;\n readonly dilations: readonly number[];\n readonly format: 'NHWC'|'NCHW';\n readonly group: number;\n readonly kernelShape: readonly number[];\n readonly pads: readonly number[];\n readonly strides: readonly number[];\n readonly wIsConst: boolean;\n}\n\n// for transposing weight tensor from [M, C/group, KH, KW] to [KH, KW, C/group, M]\nconst weightTransposeAttribute = [2, 3, 1, 0];\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: ConvAttributes): void => {\n // Refer to the below link for all input checks\n // https://github.com/onnx/onnx/blob/master/docs/Operators.md#Conv\n if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n throw new Error('Conv requires 2 or 3 inputs');\n }\n\n if (inputs[0].dims.length > 5) {\n throw new Error('greater than 5D is not supported');\n }\n\n if (inputs[0].dims.length !== inputs[1].dims.length) {\n throw new Error('filter does not have same dimension as input');\n }\n\n // FILTER_IN_CHANNEL should be equal to DATA_CHANNEL\n const dataChannel = inputs[0].dims[attributes.format === 'NHWC' ? inputs[0].dims.length - 1 : 1];\n const filterInChannel = inputs[1].dims[1] * attributes.group;\n if (dataChannel !== filterInChannel) {\n throw new Error('FILTER_IN_CHANNEL should be equal to DATA_CHANNEL');\n }\n\n // if bias is provided it should be 1D and the number of elements should be equal to the number of feature maps\n if (inputs.length === 3 && (inputs[2].dims.length !== 1 || inputs[1].dims[0] !== inputs[2].dims[0])) {\n throw new Error('invalid bias');\n }\n\n const spatialRank = inputs[0].dims.length - 2;\n // wrong dilations dimension\n if (attributes.dilations.length !== spatialRank) {\n throw new Error(`dilations should be ${spatialRank}D`);\n }\n\n // Wrong strides dimension\n if (attributes.strides.length !== spatialRank) {\n throw new Error(`strides should be ${spatialRank}D`);\n }\n\n // Wrong pads dimension\n if (attributes.pads.length !== spatialRank * 2) {\n throw new Error(`pads should be ${spatialRank * 2}D`);\n }\n\n // if kernelShape is specified, it's data length must be 2 less than dims length of the weights tensor\n // (the first 2 dims are batch_size and channels)\n if (attributes.kernelShape.length !== 0 && attributes.kernelShape.length !== inputs[1].dims.length - 2) {\n throw new Error('invalid kernel shape');\n }\n};\n\nconst getAdjustedConvAttributes = (attributes: T, inputs: readonly TensorView[]): T => {\n const kernelShape = attributes.kernelShape.slice();\n // if kernelShape is not specified in the attributes of this op, infer it from the weight tensor dims\n for (let i = 2; i < inputs[1].dims.length; ++i) {\n if (kernelShape[i - 2] === 0) {\n kernelShape[i - 2] = inputs[1].dims[i];\n }\n }\n const pads = attributes.pads.slice();\n PoolConvUtil.adjustPadsBasedOnAutoPad(\n inputs[0].dims, attributes.strides, attributes.dilations, kernelShape, pads, attributes.format === 'NHWC',\n attributes.autoPad);\n\n // always return a new object so does not modify the original attributes\n const newAttributes: T = Object.assign({}, attributes);\n Object.assign(newAttributes, {kernelShape, pads});\n return newAttributes;\n};\n\nexport const parseConvAttributes = (attributes: Record): ConvAttributes => {\n const activationAttributes = parseInternalActivationAttributes(attributes);\n // TODO : Make this generic enough to compute default attributes for multi-dimensional conv\n const format = attributes.format as 'NHWC' | 'NCHW';\n const autoPad = ['NOTSET', 'VALID', 'SAME_UPPER', 'SAME_LOWER'][attributes.auto_pad as number];\n const dilations = attributes.dilations as number[];\n const group = attributes.group as number;\n const kernelShape = attributes.kernel_shape as number[];\n const pads = attributes.pads as number[];\n const strides = attributes.strides as number[];\n const wIsConst = (attributes.w_is_const as () => boolean)();\n\n return {\n autoPad,\n format,\n dilations,\n group,\n kernelShape,\n pads,\n strides,\n wIsConst,\n ...activationAttributes,\n cacheKey: `${attributes.format};${activationAttributes.activation};`\n };\n};\n\nconst conv2d = (context: ComputeContext, inputs: readonly TensorView[], attributes: ConvAttributes): void => {\n const adjustedAttributes = getAdjustedConvAttributes(attributes, inputs);\n\n // check attributes\n\n // const hasPreluActivationWeights = false; /* TODO: add support for prelu activation weights */\n const isChannelsLast = attributes.format === 'NHWC';\n if (attributes.group !== 1) {\n // NVIDIA GPU with ampere architecture fails with below 2 cases, but we couldn't repro them with any other\n // GPUs. So just disable vectorize on NVIDIA ampere to ensure always correct outputs.\n // [webgpu]Conv - conv - vectorize group - B\n // [webgpu]Conv - conv - vectorize group - D\n const enableGroupedConvVectorize = !context.adapterInfo.isArchitecture('ampere');\n if (enableGroupedConvVectorize && isChannelsLast && inputs[1].dims[0] === attributes.group &&\n inputs[1].dims[1] === 1 && attributes.dilations[0] === 1 && attributes.dilations[1] === 1) {\n const outputShape = calculateOutputShape(\n inputs[0].dims, inputs[1].dims, attributes.dilations, adjustedAttributes.pads, attributes.strides,\n isChannelsLast);\n const transposedWeight = (context.kernelCustomData.wT as TensorView | undefined) ??\n context.compute(\n createTransposeProgramInfo(inputs[1], weightTransposeAttribute),\n {inputs: [1], outputs: [attributes.wIsConst ? -2 : -1]})[0];\n if (attributes.wIsConst && !context.kernelCustomData.wT) {\n context.kernelCustomData.wT = transposedWeight;\n }\n const convInputs = [inputs[0], transposedWeight];\n if (inputs.length === 3) {\n convInputs.push(inputs[2]);\n }\n context.compute(\n createGroupedConvVectorizeProgramInfo(convInputs, adjustedAttributes, outputShape), {inputs: convInputs});\n } else {\n context.compute(createGroupedConvProgramInfo(inputs, adjustedAttributes));\n }\n return;\n }\n\n const hasBias = inputs.length === 3;\n const inputHeight = inputs[0].dims[isChannelsLast ? 1 : 2];\n const inputWidth = inputs[0].dims[isChannelsLast ? 2 : 3];\n const inputChannels = inputs[0].dims[isChannelsLast ? 3 : 1];\n const weightHeight = inputs[1].dims[2];\n const weightWidth = inputs[1].dims[3];\n\n const outputShape = calculateOutputShape(\n inputs[0].dims, inputs[1].dims, attributes.dilations, adjustedAttributes.pads, attributes.strides,\n isChannelsLast);\n const outHeight = outputShape[isChannelsLast ? 1 : 2];\n const outWidth = outputShape[isChannelsLast ? 2 : 3];\n const outChannels = outputShape[isChannelsLast ? 3 : 1];\n\n const sameSize = isChannelsLast && weightHeight === inputHeight && weightWidth === inputWidth &&\n attributes.pads[0] === 0 && attributes.pads[1] === 0;\n if (sameSize ||\n (weightHeight === 1 && weightWidth === 1 && attributes.dilations[0] === 1 && attributes.dilations[1] === 1 &&\n attributes.strides[0] === 1 && attributes.strides[1] === 1 && attributes.pads[0] === 0 &&\n attributes.pads[1] === 0)) {\n // conv2dByMatMul\n const batch = outputShape[0];\n let xReshaped, wReshaped, matmulOutputShape;\n const matmulInputs = [];\n if (isChannelsLast) {\n const transposedWeight = (context.kernelCustomData.wT as TensorView | undefined) ??\n context.compute(\n createTransposeProgramInfo(inputs[1], weightTransposeAttribute),\n {inputs: [1], outputs: [attributes.wIsConst ? -2 : -1]})[0];\n if (attributes.wIsConst && !context.kernelCustomData.wT) {\n context.kernelCustomData.wT = transposedWeight;\n }\n if (sameSize) {\n const sharedDim = inputHeight * inputWidth * inputChannels;\n xReshaped = inputs[0].reshape([1, batch, sharedDim]);\n wReshaped = transposedWeight.reshape([1, sharedDim, outChannels]);\n matmulOutputShape = [1, batch, outChannels];\n } else {\n xReshaped = inputs[0].reshape([batch, inputHeight * inputWidth, inputChannels]);\n wReshaped = transposedWeight.reshape([1, inputChannels, outChannels]);\n matmulOutputShape = [batch, outHeight * outWidth, outChannels];\n }\n matmulInputs.push(xReshaped);\n matmulInputs.push(wReshaped);\n } else {\n xReshaped = inputs[0].reshape([batch, inputChannels, inputHeight * inputWidth]);\n wReshaped = inputs[1].reshape([1, outChannels, inputChannels]);\n matmulOutputShape = [batch, outChannels, outHeight * outWidth];\n matmulInputs.push(wReshaped);\n matmulInputs.push(xReshaped);\n }\n if (hasBias) {\n matmulInputs.push(inputs[2]);\n }\n const N = matmulOutputShape[2];\n const K = matmulInputs[0].dims[matmulInputs[0].dims.length - 1];\n // Tune the threshold.\n if (N < 8 && K < 8) {\n context.compute(\n createNaiveMatmulProgramInfo(\n matmulInputs, adjustedAttributes, outputShape, matmulOutputShape, isChannelsLast),\n {inputs: matmulInputs});\n } else {\n context.compute(\n createMatmulProgramInfo(matmulInputs, adjustedAttributes, outputShape, matmulOutputShape, isChannelsLast),\n {inputs: matmulInputs});\n }\n return;\n }\n\n // TODO: implement conv2dWithIm2Col()\n\n const sequentialAccessByThreads = /* backend.adapterInfo.isIntel() */ true;\n\n // STEP.1: transpose weight\n const transposedWeight = (context.kernelCustomData.wT as TensorView | undefined) ??\n context.compute(\n createTransposeProgramInfo(inputs[1], weightTransposeAttribute),\n {inputs: [1], outputs: [attributes.wIsConst ? -2 : -1]})[0];\n if (attributes.wIsConst && !context.kernelCustomData.wT) {\n context.kernelCustomData.wT = transposedWeight;\n }\n\n // STEP.2: prepare reshaped inputs\n const convInputs = [inputs[0], transposedWeight];\n if (hasBias) {\n convInputs.push(inputs[2]);\n }\n\n // STEP.3: compute matmul\n const dimAOuter = isChannelsLast ? outHeight * outWidth : outChannels;\n const dimBOuter = isChannelsLast ? outChannels : outHeight * outWidth;\n const dimInner = weightHeight * weightWidth * inputChannels;\n context.compute(\n createConv2DMatMulProgramInfo(\n convInputs, adjustedAttributes, outputShape, dimAOuter, dimBOuter, dimInner, hasBias,\n sequentialAccessByThreads),\n {inputs: convInputs});\n};\n\nconst conv1d = (context: ComputeContext, attributes: ConvAttributes): void => {\n // extend the input to 2D by adding H dimension\n const isChannelLast = attributes.format === 'NHWC';\n const inputs = [\n context.inputs[0].reshape(\n isChannelLast ?\n // [N, W, C] -> [N, H=1, W, C]\n [context.inputs[0].dims[0], 1, context.inputs[0].dims[1], context.inputs[0].dims[2]] :\n // [N, C, W] -> [N, C, H=1, W]\n [context.inputs[0].dims[0], context.inputs[0].dims[1], 1, context.inputs[0].dims[2]]),\n //[FILTER_OUT_CHANNEL, FILTER_IN_CHANNEL, kW] -> [FILTER_OUT_CHANNEL, FILTER_IN_CHANNEL, kH=1, kW]\n context.inputs[1].reshape([context.inputs[1].dims[0], context.inputs[1].dims[1], 1, context.inputs[1].dims[2]])\n ];\n if (context.inputs.length === 3) {\n inputs.push(context.inputs[2]);\n }\n const pads = [0, attributes.pads[0], 0, attributes.pads[1]];\n const strides = [1].concat(attributes.strides);\n const dilations = [1].concat(attributes.dilations);\n const kernelShape = [1].concat(attributes.kernelShape);\n const adjustedAttributes = getAdjustedConvAttributes({...attributes, pads, strides, dilations, kernelShape}, inputs);\n context.compute(createGroupedConvProgramInfo(\n inputs, adjustedAttributes,\n outputShape => isChannelLast ? [outputShape[0], outputShape[2], outputShape[3]] : []));\n};\n\nconst conv3d = (context: ComputeContext, inputs: readonly TensorView[], attributes: ConvAttributes): void => {\n const format = attributes.format === 'NHWC' ? 'channelsLast' : 'channelsFirst';\n const adjustedAttributes = getAdjustedConvAttributes(attributes, inputs);\n const pads = attributes.autoPad === 'NOTSET' ? attributes.pads : attributes.autoPad;\n const convInfo = computeConv3DInfo(\n inputs[0].dims as [number, number, number, number, number],\n inputs[1].dims as [number, number, number, number, number],\n attributes.strides as number | [number, number, number],\n attributes.dilations as number | [number, number, number], pads as string | number[], false, format);\n context.compute(createConv3DNaiveProgramInfo(\n inputs, adjustedAttributes, convInfo.outShape,\n [convInfo.filterDepth, convInfo.filterHeight, convInfo.filterWidth],\n [convInfo.padInfo.front, convInfo.padInfo.top, convInfo.padInfo.left], format));\n};\n\nexport const conv = (context: ComputeContext, attributes: ConvAttributes): void => {\n validateInputs(context.inputs, attributes);\n if (context.inputs[0].dims.length === 3) {\n conv1d(context, attributes);\n } else if (context.inputs[0].dims.length === 5) {\n conv3d(context, context.inputs, attributes);\n } else {\n conv2d(context, context.inputs, attributes);\n }\n};\n", "/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/conv_backprop_mm_webgpu.ts\n//\n// modified to fit the needs of the project\n\nimport {DataType} from '../../../../wasm-common';\nimport {LOG_DEBUG} from '../../../log';\nimport {TensorView} from '../../../tensor-view';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {ConvTransposeAttributes} from '../conv-transpose';\nimport {appendActivationUniforms, appendActivationUniformsData, getActivationSnippet} from '../fuse-utils';\n\nimport {biasSnippet} from './activation_util';\nimport {utilFunctions} from './conv_util';\nimport {makeMatMulPackedSource, makeMatMulPackedVec4Source} from './matmul_packed_webgpu';\n\nconst conv2dTransposeCommonSnippet =\n (isChannelsLast: boolean, addBias = false, attributes: ConvTransposeAttributes, type: string,\n innerElementSize = 4): string => {\n const getWSnippet = (innerElementSize: number) => {\n switch (innerElementSize) {\n case 1:\n return 'return w[getIndexFromCoords4D(coord, vec4(uniforms.w_shape))];';\n case 4:\n return `\n let coord1 = vec4(coordX, coordY, col + 1, rowInner);\n let coord2 = vec4(coordX, coordY, col + 2, rowInner);\n let coord3 = vec4(coordX, coordY, col + 3, rowInner);\n let v0 = w[getIndexFromCoords4D(coord, vec4(uniforms.w_shape))];\n let v1 = w[getIndexFromCoords4D(coord1, vec4(uniforms.w_shape))];\n let v2 = w[getIndexFromCoords4D(coord2, vec4(uniforms.w_shape))];\n let v3 = w[getIndexFromCoords4D(coord3, vec4(uniforms.w_shape))];\n return ${type}(v0, v1, v2, v3);\n `;\n default:\n throw new Error(`innerElementSize ${innerElementSize} is not supported.`);\n }\n };\n const coordASnippet = isChannelsLast ? `\n let coord = vec4(batch, iXR, iXC, xCh);\n ` :\n `\n let coord = vec4(batch, xCh, iXR, iXC);\n `;\n\n const coordResSnippet = isChannelsLast ? `\n let coords = vec4(\n batch,\n row / outWidth,\n row % outWidth,\n col);\n ` :\n `\n let coords = vec4(\n batch,\n row,\n col / outWidth,\n col % outWidth);\n `;\n\n const xHeight = isChannelsLast ? 'i32(uniforms.x_shape[1])' : 'i32(uniforms.x_shape[2])';\n const xWidth = isChannelsLast ? 'i32(uniforms.x_shape[2])' : 'i32(uniforms.x_shape[3])';\n const row = isChannelsLast ? 'row' : 'col';\n const col = isChannelsLast ? 'col' : 'row';\n\n const readASnippet = `\n let inChannels = ${isChannelsLast ? 'i32(uniforms.x_shape[3])' : 'i32(uniforms.x_shape[1])'};\n let outWidth = ${isChannelsLast ? 'i32(uniforms.result_shape[2])' : 'i32(uniforms.result_shape[3])'};\n let outRow = ${row} / outWidth;\n let outCol = ${row} % outWidth;\n\n let WRow = ${col} / (uniforms.filter_dims[1] * inChannels);\n let WCol = ${col} / inChannels % uniforms.filter_dims[1];\n let xR = f32(outRow - uniforms.pads[0] + uniforms.dilations[0] * WRow) / f32(uniforms.strides[0]);\n let xC = f32(outCol - uniforms.pads[1] + uniforms.dilations[1] * WCol) / f32(uniforms.strides[1]);\n if (xR < 0.0 || xR >= f32(${xHeight}) || fract(xR) > 0.0) {\n return ${type}(0.0);\n }\n if (xC < 0.0 || xC >= f32(${xWidth}) || fract(xC) > 0.0) {\n return ${type}(0.0);\n }\n let iXR = i32(xR);\n let iXC = i32(xC);\n let xCh = ${col} % inChannels;\n ${coordASnippet}\n return x[getIndexFromCoords4D(coord, vec4(uniforms.x_shape))/${innerElementSize}];`;\n\n const sampleA = isChannelsLast ? `\n let col = colIn * ${innerElementSize};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) {\n ${readASnippet}\n }\n return ${type}(0.0);` :\n `\n let col = colIn * ${innerElementSize};\n if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) {\n ${readASnippet}\n }\n return ${type}(0.0);`;\n\n const sampleW = `\n let col = colIn * ${innerElementSize};\n let inChannels = ${isChannelsLast ? 'i32(uniforms.x_shape[3])' : 'i32(uniforms.x_shape[1])'};\n let coordX = uniforms.filter_dims[0] - 1 - row / (uniforms.filter_dims[1] * inChannels);\n let coordY = uniforms.filter_dims[1] - 1 - (row / inChannels) % uniforms.filter_dims[1];\n if (${\n isChannelsLast ? 'row < uniforms.dim_inner && col < uniforms.dim_b_outer' :\n 'row < uniforms.dim_inner && col < uniforms.dim_a_outer'} && coordX >= 0 && coordY >= 0) {\n let rowInner = row % inChannels;\n let coord = vec4(coordX, coordY, col, rowInner);\n ${getWSnippet(innerElementSize)}\n }\n return ${type}(0.0);\n `;\n\n const applyActivation = getActivationSnippet(attributes, type);\n const userCode = `\n fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${type} {\n ${isChannelsLast ? sampleA : sampleW}\n }\n\n fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${type} {\n ${isChannelsLast ? sampleW : sampleA}\n }\n\n fn mm_write(batch: i32, row : i32, colIn : i32, valueInput : ${type}) {\n let col = colIn * ${innerElementSize};\n if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) {\n var value = valueInput;\n let outWidth = ${isChannelsLast ? 'i32(uniforms.result_shape[2])' : 'i32(uniforms.result_shape[3])'};\n ${coordResSnippet}\n ${biasSnippet(addBias)}\n ${applyActivation}\n result[getIndexFromCoords4D(coords, vec4(uniforms.result_shape))/${innerElementSize}] = value;\n }\n }`;\n return userCode;\n };\n\nexport const createConv2DTransposeMatMulProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvTransposeAttributes, outputShape: readonly number[],\n dimAOuter: number, dimBOuter: number, dimInner: number, hasBias: boolean,\n sequentialAccessByThreads: boolean): ProgramInfo => {\n const isChannelsLast = attributes.format === 'NHWC';\n const inChannels = isChannelsLast ? inputs[0].dims[3] : inputs[0].dims[1];\n const batchSize = outputShape[0];\n const outWidth = isChannelsLast ? outputShape[2] : outputShape[3];\n const outHeight = isChannelsLast ? outputShape[1] : outputShape[2];\n const outChannels = isChannelsLast ? outputShape[3] : outputShape[1];\n // TODO: enable vec4 for NCHW\n const isVec4 = isChannelsLast && (inChannels % 4 === 0 && inChannels % 3) && outChannels % 4 === 0;\n\n // TODO: fine tune size\n const dispatchX = isChannelsLast ? outChannels : outWidth * outHeight;\n const dispatchY = isChannelsLast ? outWidth * outHeight : outChannels;\n const workGroupSize: [number, number, number] = [8, 8, 1];\n const elementsPerThread = dimAOuter <= 8 ? [4, 1, 1] : [4, 4, 1];\n const dispatch = [\n Math.ceil(dispatchX / workGroupSize[0] / elementsPerThread[0]),\n Math.ceil(dispatchY / workGroupSize[1] / elementsPerThread[1]),\n Math.ceil(batchSize / workGroupSize[2] / elementsPerThread[2])\n ];\n\n LOG_DEBUG('verbose', () => `[conv_backprop_mm_webgpu] dispatch = ${dispatch}`);\n\n const innerElementSize = isVec4 ? 4 : 1;\n const tileInner = Math.max(workGroupSize[0] * innerElementSize, workGroupSize[1]);\n const components = isVec4 ? 4 : 1;\n const filterDims =\n [attributes.kernelShape[isChannelsLast ? 1 : 2], attributes.kernelShape[isChannelsLast ? 2 : 3]];\n const effectiveFilterDims = [\n filterDims[0] + (attributes.dilations[0] <= 1 ? 0 : (filterDims[0] - 1) * (attributes.dilations[0] - 1)),\n filterDims[1] + (attributes.dilations[1] <= 1 ? 0 : (filterDims[1] - 1) * (attributes.dilations[1] - 1))\n ];\n const pads = [\n effectiveFilterDims[0] - 1 - Math.floor((attributes.pads[0] + attributes.pads[2]) / 2),\n effectiveFilterDims[1] - 1 - Math.floor((attributes.pads[1] + attributes.pads[3]) / 2)\n ];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.int32, data: dimAOuter}, {type: DataType.int32, data: dimBOuter},\n {type: DataType.int32, data: dimInner}, {type: DataType.int32, data: attributes.strides},\n {type: DataType.int32, data: attributes.dilations}, {type: DataType.int32, data: filterDims},\n {type: DataType.int32, data: pads}\n ];\n appendActivationUniformsData(attributes, programUniforms);\n programUniforms.push(...createTensorShapeVariables(inputs[0].dims, inputs[1].dims));\n\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const x = inputVariable('x', inputs[0].dataType, inputs[0].dims.length, components);\n const w = inputVariable('w', inputs[1].dataType, inputs[1].dims.length, 1);\n const output = outputVariable('result', inputs[0].dataType, outputShape.length, components);\n const inputVariables = [x, w];\n\n let declareFunctions = '';\n if (hasBias) {\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims.length, components);\n inputVariables.push(bias);\n declareFunctions += `\n fn getBiasByOutputCoords(coords : vec4) -> ${bias.type.value} {\n return bias[coords.${isChannelsLast ? 'w' : 'y'}${isVec4 ? '/ 4' : ''}];\n }`;\n }\n\n const uniforms: UniformsArrayType = [\n {name: 'dim_a_outer', type: 'i32'}, {name: 'dim_b_outer', type: 'i32'}, {name: 'dim_inner', type: 'i32'},\n {name: 'strides', type: 'i32', length: 2}, {name: 'dilations', type: 'i32', length: 2},\n {name: 'filter_dims', type: 'i32', length: filterDims.length},\n {name: 'pads', type: 'i32', length: pads.length}\n ];\n appendActivationUniforms(attributes, uniforms);\n const elemType = tensorTypeToWsglStorageType(inputs[0].dataType, 1);\n if (elemType !== 'f16' && elemType !== 'f32') {\n throw new Error(`elemType ${elemType} is not supported.`);\n }\n return `\n ${utilFunctions('uniforms.result_strides')}\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)};\n ${declareFunctions}\n ${conv2dTransposeCommonSnippet(isChannelsLast, hasBias, attributes, x.type.value, innerElementSize)}\n ${\n isVec4 ? makeMatMulPackedVec4Source(\n elementsPerThread, workGroupSize, elemType, undefined, !isChannelsLast, tileInner) :\n makeMatMulPackedSource(\n elementsPerThread, workGroupSize, elemType, undefined, !isChannelsLast, tileInner, false,\n undefined, sequentialAccessByThreads)}`;\n };\n\n return {\n name: 'Conv2DTransposeMatMul',\n shaderCache:\n {hint: `${attributes.cacheKey};${elementsPerThread};${workGroupSize};${isVec4}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n programUniforms\n }),\n getShaderSource\n };\n };\n", "/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n\n// sampled from [@tensorflow/tfjs] tfjs-backend-webgpu/src/conv_backprop_webgpu.ts\n\nimport {DataType} from '../../../../wasm-common';\nimport {LOG_DEBUG} from '../../../log';\nimport {TensorView} from '../../../tensor-view';\nimport {ShapeUtil} from '../../../util';\nimport {ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../../types';\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from '../common';\nimport {ConvTransposeAttributes} from '../conv-transpose';\n\nconst createConvTranspose2DOpProgramShaderSource =\n (shaderHelper: ShaderHelper, inputs: readonly TensorView[], outputShape: readonly number[], hasBias: boolean,\n is1DimensionDispatch: boolean, isVec4 = false, dataType: string, uniforms: UniformsArrayType,\n isChannelsLast = false): string => {\n const rowDim = isChannelsLast ? 1 : 2;\n const colDim = isChannelsLast ? 2 : 3;\n const channelDim = isChannelsLast ? 3 : 1;\n const workPerThread = isVec4 ? 2 : 1;\n\n let declareFunctions = `\n fn setOutputAtIndex(flatIndex : u32, value : ${isVec4 ? `vec4<${dataType}>` : dataType}) {\n result[flatIndex] = ${isVec4 ? `vec4<${dataType}>` : dataType}(value);\n }`;\n if (hasBias) {\n declareFunctions += `\n fn getBiasByOutputCoords(coords : vec4) -> ${isVec4 ? `vec4<${dataType}>` : dataType} {\n return bias[coords.${isChannelsLast ? 'w' : 'y'}${isVec4 ? '/ 4' : ''}];\n }`;\n }\n const components = isVec4 ? 4 : 1;\n const w = inputVariable('W', inputs[1].dataType, inputs[1].dims.length, components);\n const dy = inputVariable('Dy', inputs[0].dataType, inputs[0].dims.length, components);\n const inputVariables = [dy, w];\n if (hasBias) {\n inputVariables.push(inputVariable('bias', inputs[2].dataType, [outputShape[channelDim]].length, components));\n }\n const output = outputVariable('result', inputs[0].dataType, outputShape.length, components);\n\n const codeSnippet4 = `{\n let batch: u32 = ${is1DimensionDispatch ? 'global_id.z' : 'workgroup_id.z'} / uniforms.result_shape[1];\n let r = ${is1DimensionDispatch ? 'global_id.z' : 'workgroup_id.z'} % uniforms.result_shape[1];\n let c = ${is1DimensionDispatch ? 'global_id.y' : 'workgroup_id.y'} * ${workPerThread};\n let d1: u32 = ${is1DimensionDispatch ? 'global_id.x' : 'workgroup_id.x'} * 4;\n\n let dyCorner = vec2(i32(r), i32(c)) - vec2(uniforms.pads);\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n var dotProd: array, ${workPerThread}>;\n for (var i = 0; i < ${workPerThread}; i++) {\n dotProd[i] = vec4<${dataType}>(0.0);\n }\n for (var wR: u32 = 0; wR < uniforms.filter_dims[0]; wR = wR + 1) {\n var dyR = (${dataType}(dyCorner.x) + ${dataType}(wR)) / ${dataType}(uniforms.strides.x);\n let wRPerm = uniforms.filter_dims[0] - 1 - wR;\n if (dyR < 0.0 || dyR >= ${dataType}(uniforms.Dy_shape[1]) ||\n fract(dyR) > 0.0 || wRPerm < 0) {\n continue;\n }\n let idyR: u32 = u32(dyR);\n\n for (var wC: u32 = 0; wC < uniforms.filter_dims[1]; wC = wC + 1) {\n let dyC = (${dataType}(dyCorner.y) + ${dataType}(wC)) / ${dataType}(uniforms.strides.y);\n let dyC2 = (${dataType}(dyCorner.y) + 1.0 + ${dataType}(wC)) / ${dataType}(uniforms.strides.y);\n let wCPerm = uniforms.filter_dims[1] - 1 - wC;\n if (wCPerm < 0) {\n continue;\n }\n var bDyCVal = true;\n var bDyCVal2 = true;\n if (dyC < 0.0 || dyC >= ${dataType}(uniforms.Dy_shape[2]) ||\n fract(dyC) > 0.0) {\n bDyCVal = false;\n }\n if (dyC2 < 0.0 || dyC2 >= ${dataType}(uniforms.Dy_shape[2]) ||\n fract(dyC2) > 0.0) {\n bDyCVal2 = false;\n }\n\n let idyC: u32 = u32(dyC);\n let idyC2: u32 = u32(dyC2);\n if (bDyCVal && bDyCVal2) {\n let d2Length = uniforms.Dy_shape[3];\n for (var d2 :u32 = 0; d2 < d2Length; d2 = d2 + 4) {\n let wValue0 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1', 'd2')};\n let wValue1 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 1', 'd2')};\n let wValue2 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 2', 'd2')};\n let wValue3 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 3', 'd2')};\n\n var xValue = ${dy.get('batch', 'idyR', 'idyC', 'd2')};\n let tmpval = vec4<${dataType}>(dot(xValue, wValue0),\n dot(xValue, wValue1),\n dot(xValue, wValue2),\n dot(xValue, wValue3));\n dotProd[0] = dotProd[0] + tmpval;\n\n xValue = ${dy.get('batch', 'idyR', 'idyC2', 'd2')};\n\n dotProd[1] = dotProd[1] + vec4<${dataType}>(dot(xValue, wValue0),\n dot(xValue, wValue1),\n dot(xValue, wValue2),\n dot(xValue, wValue3));\n }\n } else if (bDyCVal) {\n let d2Length = uniforms.Dy_shape[${channelDim}];\n for (var d2: u32 = 0; d2 < d2Length; d2 = d2 + 4) {\n let wValue0 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1', 'd2')};\n let wValue1 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 1', 'd2')};\n let wValue2 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 2', 'd2')};\n let wValue3 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 3', 'd2')};\n\n var xValue = ${dy.get('batch', 'idyR', 'idyC', 'd2')};\n let tmpval = vec4<${dataType}>(dot(xValue, wValue0),\n dot(xValue, wValue1),\n dot(xValue, wValue2),\n dot(xValue, wValue3));\n dotProd[0] = dotProd[0] + tmpval;\n }\n } else if (bDyCVal2) {\n let d2Length = uniforms.Dy_shape[3];\n for (var d2: u32 = 0; d2 < d2Length; d2 = d2 + 4) {\n let wValue0 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1', 'd2')};\n let wValue1 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 1', 'd2')};\n let wValue2 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 2', 'd2')};\n let wValue3 = ${w.get('u32(wRPerm)', 'u32(wCPerm)', 'd1 + 3', 'd2')};\n\n var xValue = ${dy.get('batch', 'idyR', 'idyC2', 'd2')};\n let tmpval = vec4<${dataType}>(dot(xValue, wValue0),\n dot(xValue, wValue1),\n dot(xValue, wValue2),\n dot(xValue, wValue3));\n dotProd[1] = dotProd[1] + tmpval;\n }\n }\n }\n }\n\n for (var i: u32 = 0; i < ${workPerThread}; i = i + 1) {\n let value = dotProd[i] + ${hasBias ? 'bias[c+i]' : `vec4<${dataType}>(0.0)`};\n ${output.set('batch', 'r', 'c + i', 'd1', 'value')};\n }\n }`;\n const codeSnippet = `\n let outputIndices = ${output.offsetToIndices('global_idx')};\n let batch = ${output.indicesGet('outputIndices', 0)};\n let d1 = ${output.indicesGet('outputIndices', channelDim)};\n let r = ${output.indicesGet('outputIndices', rowDim)};\n let c = ${output.indicesGet('outputIndices', colDim)};\n let dyCorner = vec2(i32(r), i32(c)) - uniforms.pads;\n let dyRCorner = dyCorner.x;\n let dyCCorner = dyCorner.y;\n let groupId = d1 / uniforms.output_channels_per_group;\n let wOutChannel = d1 - groupId * uniforms.output_channels_per_group;\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n var dotProd = ${dataType}(0.0);\n for (var wR: u32 = 0; wR < uniforms.effective_filter_dims.x; wR = wR + 1) {\n if (wR % uniforms.dilations.x != 0) {\n continue;\n }\n let dyR = (${dataType}(dyRCorner) + ${dataType}(wR)) / ${dataType}(uniforms.strides[0]);\n let wRPerm = uniforms.filter_dims.x - 1 - wR / uniforms.dilations.x;\n if (dyR < 0.0 || dyR >= ${dataType}(uniforms.Dy_shape[${rowDim}]) || fract(dyR) > 0.0 ||\n wRPerm < 0) {\n continue;\n }\n let idyR: u32 = u32(dyR);\n\n for (var wC: u32 = 0; wC < uniforms.effective_filter_dims.y; wC = wC + 1) {\n if (wC % uniforms.dilations.y != 0) {\n continue;\n }\n let dyC = (${dataType}(dyCCorner) + ${dataType}(wC)) / ${dataType}(uniforms.strides.y);\n let wCPerm = uniforms.filter_dims.y - 1 - wC / uniforms.dilations.y;\n if (dyC < 0.0 || dyC >= ${dataType}(uniforms.Dy_shape[${colDim}]) ||\n fract(dyC) > 0.0 || wCPerm < 0) {\n continue;\n }\n let idyC: u32 = u32(dyC);\n var inputChannel = groupId * uniforms.input_channels_per_group;\n for (var d2: u32 = 0; d2 < uniforms.input_channels_per_group; d2 = d2 + 1) {\n let xValue = ${\n isChannelsLast ? dy.get('batch', 'idyR', 'idyC', 'inputChannel') :\n dy.get('batch', 'inputChannel', 'idyR', 'idyC')};\n let wValue = ${w.get('inputChannel', 'wOutChannel', 'u32(wRPerm)', 'u32(wCPerm)')};\n dotProd = dotProd + xValue * wValue;\n inputChannel = inputChannel + 1;\n }\n }\n }\n let value = dotProd + ${hasBias ? 'bias[d1]' : `${dataType}(0.0)`};\n ${output.setByOffset('global_idx', 'value')};\n `;\n\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)}\n ${declareFunctions}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')};\n ${isVec4 ? codeSnippet4 : codeSnippet}}`;\n };\n\nexport const createConvTranspose2DProgramInfo =\n (inputs: readonly TensorView[], attributes: ConvTransposeAttributes,\n squeezeOutputShapeFunction?: (shape: readonly number[]) => number[]): ProgramInfo => {\n const hasBias = inputs.length > 2;\n // const isChannelsLast = attributes.format === 'NHWC';\n const outputShape = attributes.outputShape;\n const outputSize = ShapeUtil.size(outputShape);\n\n // const inChannels = inputs[0].dims[isChannelsLast ? 3 : 1];\n // TODO Enable isVec4 for performance\n // Disabled due to weight matrix layout issue\n // const isVec4 = attributes.group === 1 && isChannelsLast && inChannels % 4 === 0 && outChannels % 4 === 0;\n const dispatch = [\n Math.ceil(outputSize / 64),\n 1,\n 1,\n ];\n LOG_DEBUG('verbose', () => `[conv2d_backprop_webgpu] dispatch = ${dispatch}`);\n\n const isChannelsLast = attributes.format === 'NHWC';\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n const strides = [attributes.strides[0], attributes.strides[1]];\n const filterDims =\n [attributes.kernelShape[isChannelsLast ? 1 : 2], attributes.kernelShape[isChannelsLast ? 2 : 3]];\n const dilations = [attributes.dilations[0], attributes.dilations[1]];\n const effectiveFilterDims = [\n filterDims[0] +\n (attributes.dilations[0] <= 1 ?\n 0 :\n (attributes.kernelShape[isChannelsLast ? 1 : 2] - 1) * (attributes.dilations[0] - 1)),\n filterDims[1] +\n (attributes.dilations[1] <= 1 ?\n 0 :\n (attributes.kernelShape[isChannelsLast ? 2 : 3] - 1) * (attributes.dilations[1] - 1))\n ];\n const pads = [\n effectiveFilterDims[0] - 1 - Math.floor((attributes.pads[0] + attributes.pads[2]) / 2),\n effectiveFilterDims[1] - 1 - Math.floor(attributes.pads[1] + attributes.pads[3]) / 2\n ];\n\n const isVec4 = false;\n const group = attributes.group;\n const wShape = inputs[1].dims;\n const inputChannelsPerGroup = wShape[0] / group;\n const outputChannelsPerGroup = wShape[1];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: strides},\n {type: DataType.uint32, data: filterDims}, {type: DataType.uint32, data: dilations},\n {type: DataType.uint32, data: effectiveFilterDims}, {type: DataType.int32, data: pads},\n {type: DataType.uint32, data: inputChannelsPerGroup}, {type: DataType.uint32, data: outputChannelsPerGroup},\n ...createTensorShapeVariables(inputs[0].dims, inputs[1].dims)\n ];\n if (hasBias) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const is1DimensionDispatch = dispatch[1] === 1 && dispatch[2] === 1;\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'strides', type: 'u32', length: strides.length},\n {name: 'filter_dims', type: 'u32', length: filterDims.length},\n {name: 'dilations', type: 'u32', length: filterDims.length},\n {name: 'effective_filter_dims', type: 'u32', length: effectiveFilterDims.length},\n {name: 'pads', type: 'i32', length: pads.length}, {name: 'input_channels_per_group', type: 'u32'},\n {name: 'output_channels_per_group', type: 'u32'}\n ];\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n return `${\n createConvTranspose2DOpProgramShaderSource(\n shaderHelper, inputs, outputShape, hasBias, is1DimensionDispatch, isVec4, dataType, uniforms,\n isChannelsLast)}`;\n };\n return {\n name: 'ConvTranspose2D',\n shaderCache: {hint: `${attributes.cacheKey};`, inputDependencies},\n getRunData: () => ({\n dispatchGroup: {x: dispatch[0], y: dispatch[1], z: dispatch[2]},\n outputs: [{\n dims: squeezeOutputShapeFunction ? squeezeOutputShapeFunction(outputShape) : outputShape,\n dataType: inputs[0].dataType\n }],\n programUniforms\n }),\n getShaderSource\n };\n };\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TensorView} from '../../tensor-view';\nimport {ComputeContext} from '../types';\n\nimport {createConv2DTransposeMatMulProgramInfo} from './3rd-party/conv_backprop_mm_webgpu';\nimport {createConvTranspose2DProgramInfo} from './3rd-party/conv_backprop_webgpu';\nimport {ConvAttributes} from './conv';\nimport {parseInternalActivationAttributes} from './fuse-utils';\nimport {createTransposeProgramInfo} from './transpose';\n\nconst computeTotalPad =\n (inDim: number, stride: number, adj: number, kernel: number, dilation: number, outSize: number) =>\n (inDim - 1) * stride + adj + (kernel - 1) * dilation + 1 - outSize;\n\nconst distributePadding = (totalPad: number, autoPad: string, pads: number[], head: number, tail: number) => {\n const smallPad = Math.floor(totalPad / 2);\n if (autoPad === 'SAME_UPPER') {\n pads[head] = smallPad;\n pads[tail] = totalPad - smallPad;\n } else if (autoPad === 'SAME_LOWER') {\n pads[head] = totalPad - smallPad;\n pads[tail] = smallPad;\n }\n};\n\nconst calculateOutputShapeAndPads =\n (inputShape: readonly number[], kernelShape: readonly number[], dilations: readonly number[], autoPad: string,\n group: number, pads: number[], strides: readonly number[], isChannelLast: boolean, outputPadding: number[],\n outputShape: number[]) => {\n const spatialRank = inputShape.length - 2;\n const updateOutputShape = outputShape.length === 0;\n if (outputPadding.length === 0) {\n for (let i = 0; i < spatialRank; ++i) {\n outputPadding.push(0);\n }\n }\n const batchSize = inputShape[0];\n const outChannels = kernelShape[isChannelLast ? 3 : 1] * group;\n for (let i = 0, j = inputShape.length - spatialRank - (isChannelLast ? 1 : 0); i < spatialRank; ++i, ++j) {\n const inSize = inputShape[j];\n const outSize = updateOutputShape ? inSize * strides[i] : outputShape[i];\n const totalPad = computeTotalPad(inSize, strides[i], pads[i], kernelShape[j], dilations[i], outSize);\n distributePadding(totalPad, autoPad, pads, i, i + spatialRank);\n if (updateOutputShape) {\n outputShape.push(\n strides[i] * (inSize - 1) + outputPadding[i] + (kernelShape[j] - 1) * dilations[i] + 1 - pads[i] -\n pads[i + spatialRank]);\n }\n }\n outputShape.splice(0, 0, batchSize);\n outputShape.splice(isChannelLast ? 3 : 1, 0, outChannels);\n };\n\nexport interface ConvTransposeAttributes extends ConvAttributes {\n readonly outputPadding: readonly number[];\n readonly outputShape: readonly number[];\n}\n\nconst getAdjustedConvTransposeAttributes =\n (attributes: T, inputs: readonly TensorView[]): T => {\n const kernelShape = attributes.kernelShape.slice();\n // if kernelShape is not specified in the attributes of this op, infer it from the weight tensor dims\n if (attributes.kernelShape.length === 0 || attributes.kernelShape.reduce((a, b) => a * b, 1) === 0) {\n kernelShape.length = 0;\n for (let i = 2; i < inputs[1].dims.length; ++i) {\n kernelShape.push(inputs[1].dims[i]);\n }\n }\n const isChannelsLast = attributes.format === 'NHWC';\n kernelShape.splice(0, 0, inputs[1].dims[0]);\n kernelShape.splice(isChannelsLast ? 3 : 1, 0, inputs[1].dims[1]);\n\n const pads = attributes.pads.slice();\n const outputShape = attributes.outputShape.slice();\n const outputPadding = attributes.outputPadding.slice();\n const inputShape = inputs[0].dims;\n let dilations = attributes.dilations.slice();\n if (dilations.reduce((a, b) => a + b, 0) === 0) {\n const spatialRank = inputs[0].dims.length - 2;\n dilations = new Array(spatialRank).fill(1);\n }\n let strides = attributes.strides.slice();\n if (strides.reduce((a, b) => a + b, 0) === 0) {\n const spatialRank = inputs[0].dims.length - 2;\n strides = new Array(spatialRank).fill(1);\n }\n // If outputShape is not specified in the attributes of this op, infer it from the parameters\n // Similarly, automatically infer pads if not specified\n calculateOutputShapeAndPads(\n inputShape, kernelShape, dilations, attributes.autoPad, attributes.group, pads, strides, isChannelsLast,\n outputPadding, outputShape);\n\n // always return a new object so does not modify the original attributes\n const newAttributes: T = Object.assign({}, attributes);\n Object.assign(newAttributes, {kernelShape, pads, outputPadding, outputShape, dilations, strides});\n return newAttributes;\n };\n\nexport const parseConvTransposeAttributes = (attributes: Record): ConvTransposeAttributes => {\n const activationAttributes = parseInternalActivationAttributes(attributes);\n // TODO : Make this generic enough to compute default attributes for multi-dimensional conv\n const format = attributes.format as 'NHWC' | 'NCHW';\n const autoPad =\n ['NOTSET', 'VALID', 'SAME_UPPER',\n 'SAME_LOWER'][typeof attributes.autoPad == 'undefined' ? 0 : attributes.autoPad as number];\n const dilations = attributes.dilations as [number, number];\n const group = attributes.group as number;\n const kernelShape = attributes.kernelShape as [number, number];\n const pads = attributes.pads as [number, number, number, number];\n const strides = attributes.strides as [number, number];\n const wIsConst = (attributes.wIsConst as () => boolean)();\n const outputPadding = attributes.outputPadding as [number, number, number, number];\n const outputShape = attributes.outputShape as [number, number];\n return {\n autoPad,\n format,\n dilations,\n group,\n kernelShape,\n outputPadding,\n outputShape,\n pads,\n strides,\n wIsConst,\n ...activationAttributes,\n cacheKey: `${attributes.format};${activationAttributes.activation};`\n };\n};\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: ConvTransposeAttributes): void => {\n // Refer to the below link for all input checks\n // https://github.com/onnx/onnx/blob/main/docs/Operators.md#ConvTranspose\n if (!inputs || (inputs.length !== 2 && inputs.length !== 3)) {\n throw new Error('Conv requires 2 or 3 inputs');\n }\n\n // TODO : Need to add support for multi-dimensional conv\n if (inputs[0].dims.length !== 4 && inputs[0].dims.length !== 3) {\n throw new Error('currently only support 2-dimensional conv');\n }\n\n if (inputs[0].dims.length !== inputs[1].dims.length) {\n throw new Error('filter does not have same dimension as input');\n }\n\n // FILTER_IN_CHANNEL should be equal to DATA_CHANNEL\n const dataChannel = inputs[0].dims[attributes.format === 'NHWC' ? inputs[0].dims.length - 1 : 1];\n const filterInChannel = inputs[1].dims[0];\n if (dataChannel !== filterInChannel) {\n throw new Error('FILTER_IN_CHANNEL should be equal to DATA_CHANNEL');\n }\n\n const featureMaps = inputs[1].dims[1] * attributes.group;\n\n // if bias is provided it should be 1D and the number of elements should be equal to the number of feature maps\n if (inputs.length === 3 && (inputs[2].dims.length !== 1 || inputs[2].dims[0] !== featureMaps)) {\n throw new Error('invalid bias');\n }\n\n const spatialRank = inputs[0].dims.length - 2;\n const dilationsSet = attributes.dilations.reduce((a, b) => a + b, 0) > 0;\n // wrong dilations dimension\n if (dilationsSet && attributes.dilations.length !== spatialRank) {\n throw new Error(`dilations should be ${spatialRank}D`);\n }\n\n const stridesSet = attributes.strides.reduce((a, b) => a + b, 0) > 0;\n // Wrong strides dimension\n if (stridesSet && attributes.strides.length !== spatialRank) {\n throw new Error(`strides should be ${spatialRank}D`);\n }\n\n // Wrong pads dimension\n const padsSet = attributes.pads.reduce((a, b) => a + b, 0) > 0;\n if (padsSet && attributes.pads.length !== spatialRank * 2) {\n throw new Error(`pads should be ${spatialRank * 2}D`);\n }\n\n // Wrong output padding dimension\n if (attributes.outputPadding.length !== spatialRank && attributes.outputPadding.length !== 0) {\n throw new Error(`output_padding should be ${spatialRank}D`);\n }\n\n // if kernelShape is specified, it's data length must be 2 less than dims length of the weights tensor\n // (the first 2 dims are batch_size and channels)\n const kernelShapeSet = attributes.kernelShape.reduce((a, b) => a + b, 0) > 0;\n if (kernelShapeSet && attributes.kernelShape.length !== 0 &&\n attributes.kernelShape.length !== inputs[1].dims.length - 2) {\n throw new Error('invalid kernel shape');\n }\n\n // as with kernelShape, must have same number of spatial dims as input\n if (attributes.outputShape.length !== 0 && attributes.outputShape.length !== inputs[0].dims.length - 2) {\n throw new Error('invalid output shape');\n }\n};\n\n// for transposing weight tensor from [C, M/group, KH, KW] to [KH, KW, M/group, C]\nconst weightTransposePerm = [2, 3, 1, 0];\n\nconst convTranspose2d =\n (context: ComputeContext, inputs: readonly TensorView[], attributes: ConvTransposeAttributes): void => {\n const adjustedAttributes = getAdjustedConvTransposeAttributes(attributes, inputs);\n const isChannelsLast = attributes.format === 'NHWC';\n const outputShape = adjustedAttributes.outputShape;\n const outChannels = outputShape[isChannelsLast ? 3 : 1];\n const inputChannels = inputs[0].dims[isChannelsLast ? 3 : 1];\n // Switch to naive method when outChannels and inputChannels are very small. It's because that in this case it's\n // not suitable for matmul version since matmul uses tile size 32x32 resulting the underlying execution unit\n // utilization rate is very low.\n if (adjustedAttributes.group !== 1 || (outChannels === 1 && inputChannels === 1)) {\n context.compute(createConvTranspose2DProgramInfo(inputs, adjustedAttributes));\n return;\n }\n const outHeight = outputShape[isChannelsLast ? 1 : 2];\n const outWidth = outputShape[isChannelsLast ? 2 : 3];\n const weightHeight = inputs[1].dims[2];\n const weightWidth = inputs[1].dims[3];\n\n const dimAOuter = isChannelsLast ? outHeight * outWidth : outChannels;\n const dimBOuter = isChannelsLast ? outChannels : outHeight * outWidth;\n const dimInner = weightHeight * weightWidth * inputChannels;\n\n const sequentialAccessByThreads = /* backend.adapterInfo.isIntel() */ true;\n\n\n // STEP.1: transpose weight\n const transposedWeight = (context.kernelCustomData.wT as TensorView | undefined) ??\n context.compute(\n createTransposeProgramInfo(inputs[1], weightTransposePerm),\n {inputs: [1], outputs: [attributes.wIsConst ? -2 : -1]})[0];\n if (attributes.wIsConst && !context.kernelCustomData.wT) {\n context.kernelCustomData.wT = transposedWeight;\n }\n\n // STEP.2: prepare reshaped inputs\n const convTransposeInputs = [inputs[0], transposedWeight];\n const hasBias = inputs.length === 3;\n if (hasBias) {\n if (!isChannelsLast && inputs[2].dims.length === 1) {\n convTransposeInputs.push(inputs[2].reshape([inputs[2].dims[0], 1, 1]));\n } else {\n convTransposeInputs.push(inputs[2]);\n }\n }\n\n // STEP.3: compute matmul\n context.compute(\n createConv2DTransposeMatMulProgramInfo(\n convTransposeInputs, adjustedAttributes, outputShape, dimAOuter, dimBOuter, dimInner, hasBias,\n sequentialAccessByThreads),\n {inputs: convTransposeInputs});\n };\n\nconst convTranspose1d = (context: ComputeContext, attributes: ConvTransposeAttributes): void => {\n // extend the input to 2D by adding H dimension\n const isChannelLast = attributes.format === 'NHWC';\n\n const inputs = [\n context.inputs[0].reshape(\n isChannelLast ?\n // [N, W, C] -> [N, H=1, W, C]\n [context.inputs[0].dims[0], 1, context.inputs[0].dims[1], context.inputs[0].dims[2]] :\n // [N, C, W] -> [N, C, H=1, W]\n [context.inputs[0].dims[0], context.inputs[0].dims[1], 1, context.inputs[0].dims[2]]),\n //[FILTER_OUT_CHANNEL, FILTER_IN_CHANNEL, kW] -> [FILTER_OUT_CHANNEL, FILTER_IN_CHANNEL, kH=1, kW]\n context.inputs[1].reshape([context.inputs[1].dims[0], context.inputs[1].dims[1], 1, context.inputs[1].dims[2]])\n ];\n if (context.inputs.length === 3) {\n inputs.push(context.inputs[2]);\n }\n let kernelShape = attributes.kernelShape;\n if (kernelShape.length === 0 || kernelShape[0] === 0) {\n kernelShape = [context.inputs[1].dims[2]];\n }\n let dilations = attributes.dilations;\n if (dilations.length === 0 || dilations[0] === 0) {\n dilations = [1];\n }\n let strides = attributes.strides;\n if (strides.length === 0 || strides[0] === 0) {\n strides = [1];\n }\n let pads = attributes.pads;\n if (pads.length === 0) {\n pads = [0, 0];\n }\n pads = [0, pads[0], 0, pads[1]];\n strides = [1].concat(strides);\n dilations = [1].concat(dilations);\n kernelShape = [1].concat(kernelShape);\n const adjustedAttributes =\n getAdjustedConvTransposeAttributes({...attributes, pads, strides, dilations, kernelShape}, inputs);\n context.compute(createConvTranspose2DProgramInfo(\n inputs, adjustedAttributes,\n outputShape => isChannelLast ? [outputShape[0], outputShape[2], outputShape[3]] :\n [outputShape[0], outputShape[1], outputShape[3]]));\n};\n\nexport const convTranspose = (context: ComputeContext, attributes: ConvTransposeAttributes): void => {\n validateInputs(context.inputs, attributes);\n if (context.inputs[0].dims.length === 3) {\n convTranspose1d(context, attributes);\n } else {\n convTranspose2d(context, context.inputs, attributes);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, inputVariable, outputVariable, ShaderHelper} from './common';\n\n\nexport interface CumSumAttributes extends AttributeWithCacheKey {\n readonly exclusive: boolean;\n readonly reverse: boolean;\n}\nconst createCumsumProgramInfo =\n (inputType: number, inputShape: readonly number[], axisInput: TensorView, attributes: CumSumAttributes):\n ProgramInfo => {\n const outputSize = ShapeUtil.size(inputShape); // outputShape is same as inputShape.\n const rank = inputShape.length; // input/output rank\n const input = inputVariable('input', inputType, rank);\n const output = outputVariable('output', inputType, rank);\n const axisValue = axisInput.dataType === DataType.int32 ? axisInput.getInt32Array()[0] :\n Number(axisInput.getBigInt64Array()[0]);\n const axis = ShapeUtil.normalizeAxis(axisValue, rank);\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const index = ` i32(${input.indicesGet('inputIndices', 'uniforms.axis')}) `;\n const max = getElementAt('uniforms.input_shape', 'uniforms.axis', rank);\n const lowerLimit = attributes.reverse ? index + (attributes.exclusive ? ' + 1' : '') : '0';\n const upperLimit = attributes.reverse ? max : index + (attributes.exclusive ? '' : ' + 1');\n return `\n ${\n shaderHelper.registerUniform('outputSize', 'u32')\n .registerUniform('axis', 'u32')\n .declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n var inputIndices = ${output.offsetToIndices('global_idx')};\n var sum = ${output.type.value}(0);\n let first : i32 = ${lowerLimit};\n let last : i32 = ${upperLimit};\n for (var i : i32 = first; i < last; i++) {\n ${input.indicesSet('inputIndices', 'uniforms.axis', 'u32(i)')};\n sum = sum + ${input.getByIndices('inputIndices')};\n }\n ${output.setByOffset('global_idx', 'sum')};\n }`;\n };\n return {\n name: 'CumSum',\n shaderCache: {hint: attributes.cacheKey, inputDependencies: ['rank']},\n getRunData: () => ({\n outputs: [{dims: inputShape, dataType: inputType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms: [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: axis},\n ...createTensorShapeVariables(inputShape, inputShape)\n ]\n\n }),\n getShaderSource\n };\n };\n\n\nexport const cumsum = (context: ComputeContext, attributes: CumSumAttributes): void => {\n const inputShape = context.inputs[0].dims;\n const inputType = context.inputs[0].dataType;\n const axis = context.inputs[1];\n context.compute(createCumsumProgramInfo(inputType, inputShape, axis, attributes), {inputs: [0]});\n};\n\nexport const parseCumSumAttributes = (attributes: Record): CumSumAttributes => {\n const exclusive = attributes.exclusive as number === 1;\n const reverse = attributes.reverse as number === 1;\n return createAttributeWithCacheKey({exclusive, reverse});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface FormatAttributes {\n readonly format: 'NHWC'|'NCHW';\n}\n\nexport interface DepthToSpaceAttributes extends FormatAttributes, AttributeWithCacheKey {\n readonly blocksize: number;\n readonly mode: string;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('DepthToSpace requires 1 input.');\n }\n if (inputs[0].dims.length !== 4) {\n throw new Error('DepthToSpace requires 4D input.');\n }\n};\n\nconst permFunctionBody = (perm: number[], rank: number, input: IndicesHelper, output: IndicesHelper): string => {\n const reverseFunc = [];\n reverseFunc.push(`fn perm(i: ${output.type.indices}) -> ${input.type.indices} {\n var a: ${input.type.indices};`);\n for (let i = 0; i < rank; ++i) {\n reverseFunc.push(input.indicesSet('a', perm[i], `i[${i}]`));\n }\n reverseFunc.push('return a;}');\n return reverseFunc.join('\\n');\n};\n\nconst createDepthToSpaceProgramInfo = (inputTensor: TensorView, attributes: DepthToSpaceAttributes): ProgramInfo => {\n let n: number, h: number, w: number, c: number;\n let shape: number[];\n let perm: number[];\n const isChannelLast = attributes.format === 'NHWC';\n const blocksize = attributes.blocksize;\n const isDCRmode = attributes.mode === 'DCR';\n if (isChannelLast) {\n [n, h, w, c] = inputTensor.dims;\n shape = isDCRmode ? [n, h, w, blocksize, blocksize, c / (blocksize ** 2)] :\n [n, h, w, c / (blocksize ** 2), blocksize, blocksize];\n perm = isDCRmode ? [0, 1, 3, 2, 4, 5] : [0, 1, 4, 2, 5, 3];\n } else {\n [n, h, w, c] = [inputTensor.dims[0], inputTensor.dims[2], inputTensor.dims[3], inputTensor.dims[1]];\n shape = isDCRmode ? [n, blocksize, blocksize, c / (blocksize ** 2), h, w] :\n [n, c / (blocksize ** 2), blocksize, blocksize, h, w];\n perm = isDCRmode ? [0, 3, 4, 1, 5, 2] : [0, 1, 4, 2, 5, 3];\n }\n const reshapedInputTensor = inputTensor.reshape(shape);\n const reshapedInputRank = reshapedInputTensor.dims.length;\n const inputDataType = inputTensor.dataType;\n\n const reshapedInput = inputVariable('a', inputDataType, reshapedInputRank);\n const permedOutput = outputVariable('output', inputDataType, reshapedInputRank);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(reshapedInput, permedOutput)}\n\n ${permFunctionBody(perm, reshapedInputRank, reshapedInput, permedOutput)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let indices = ${permedOutput.offsetToIndices('global_idx')};\n let aIndices = perm(indices);\n\n ${permedOutput.setByOffset('global_idx', reshapedInput.getByIndices('aIndices'))}\n }`;\n\n return {\n name: 'DepthToSpace',\n shaderCache: {hint: `${inputTensor.dims};${attributes.blocksize};${attributes.mode}`, inputDependencies: ['rank']},\n getRunData: (inputs) => {\n const outputShape = isChannelLast ? [n, h * blocksize, w * blocksize, c / (blocksize ** 2)] :\n [n, c / (blocksize ** 2), h * blocksize, w * blocksize];\n const outputSize = ShapeUtil.size(outputShape);\n const shapeBeforePerm = reshapedInputTensor.dims;\n const shapeAfterPerm = ShapeUtil.sortBasedOnPerm(shapeBeforePerm, perm);\n return {\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms:\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(shapeBeforePerm, shapeAfterPerm)],\n };\n },\n getShaderSource,\n };\n};\n\nexport const depthToSpace = (context: ComputeContext, attributes: DepthToSpaceAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createDepthToSpaceProgramInfo(context.inputs[0], attributes));\n};\n\nexport const parseDepthToSpaceAttributes = (attributes: Record): DepthToSpaceAttributes =>\n createAttributeWithCacheKey({\n blocksize: attributes.blocksize as number,\n mode: attributes.mode as string,\n format: attributes.format as 'NHWC' | 'NCHW'\n });\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface EinsumAttributes extends AttributeWithCacheKey {\n readonly equation: string;\n}\n// The equation attribute value is a string which consists of left hand side (LHS) and optionally right hand side (RHS)\n// separated by '->'. Ex. \"ij,jk -> ik\" expresses matrix multiplication\n// \"ij->ji\" expresses matrix transpose\n// \"ii->i\" diagonal elements of a square matrix\n// LHS consists of a sequence of terms separated by commas. Each term corresponds to an input variable.\n// Each symbol corresponds to a dimension in the input variable. The symbol can be either a letter, 'a' to 'z' or 'A' to\n// 'Z' or '...' to represent arbitrary dimensions.\n\nconst symbolPattern =\n '[a-zA-Z]|\\\\.\\\\.\\\\.'; // The pattern each symbol in each term in the symbolic equation should match\nconst termPattern = '(' + symbolPattern + ')+'; // The pattern each term in the symbolic equation should match\nconst termPatternOnly = '^' + termPattern + '$'; // The patterns only matchs a term begin to end.\nconst lhsPattern = '(' + termPattern + ',)*' + termPattern; // The pattern the LHS should match\nconst lhsPatternOnly = '^' + lhsPattern + '$'; // The patterns only matchs a LHS begin to end.\n\ninterface SymbolInfo {\n count: number; // Symbol corresponding to a dimmension of an input\n inputIndices: number[]; // Number of input variables the symbol corresponds to\n dimValue: number; // Number of dimensions the symbol corresponds to\n}\n\nclass EinsumTerm {\n constructor(inputIndex = -1) {\n this.symbolToIndices = new Map();\n this.inputIndex = inputIndex;\n }\n\n // Add a symbol to the term\n addSymbol(symbol: string, index: number) {\n let value = this.symbolToIndices.get(symbol);\n if (value === undefined) {\n value = [index];\n } else {\n value.push(index);\n }\n this.symbolToIndices.set(symbol, value);\n }\n\n symbolToIndices: Map; // Map from symbol to dimensions of the input corresponding to the term\n inputIndex: number; // -1 for output and 0, 1, 2, ... for inputs\n}\n\nclass EinsumEquation {\n constructor(inputs: readonly TensorView[], public readonly equation: string) {\n this.hasEllipsis = false;\n this.symbolToInfo = new Map();\n this.lhs = new Array();\n this.outputDims = [];\n // As rhs needs to be updated allow using let instead of const for both lhs and rhs.\n // eslint-disable-next-line prefer-const\n let [lhs, rhs] = equation.includes('->') ? equation.split('->', 2) : [equation, ''];\n if (!lhs.match(RegExp(lhsPatternOnly))) {\n throw new Error('Invalid LHS term');\n }\n const inputTerms = lhs.split(',');\n inputTerms.forEach((inputTerm, index) => {\n const dims = inputs[index].dims.slice();\n if (!inputTerm.match(RegExp(termPatternOnly))) {\n throw new Error('Invalid LHS term');\n }\n const einsumTerm = this.processTerm(inputTerm, true, dims, index);\n this.lhs.push(einsumTerm);\n });\n\n // Initialize the RHS if not specified\n if (rhs === '') {\n // Construct RHS from LHS terms/symbols\n rhs += [...this.symbolToInfo.entries()]\n .filter(([sym, info]) => (info.count === 1 || sym === '...'))\n .map(([sym]) => sym)\n .join('');\n } else {\n if (!rhs.match(RegExp(termPattern))) {\n throw new Error('Invalid RHS');\n }\n }\n\n // Compute output dims\n const rhsSymbols = rhs.match(RegExp(symbolPattern, 'g'));\n rhsSymbols?.forEach((symbol) => {\n if (symbol === '...') {\n this.outputDims = this.outputDims.concat(this.ellipsisDims);\n } else {\n const info = this.symbolToInfo.get(symbol);\n if (info === undefined) {\n throw new Error('Invalid RHS symbol');\n }\n this.outputDims.push(info.dimValue);\n }\n });\n this.rhs = this.processTerm(rhs, false, this.outputDims);\n } // End of EinsumEqation constructor\n\n // Add a symbol to the equation\n addSymbol(symbol: string, dimValue: number, inputIndex: number) {\n let info = this.symbolToInfo.get(symbol);\n if (info !== undefined) {\n if (info.dimValue !== dimValue && info.count !== 1) {\n throw new Error('Dimension mismatch');\n } else {\n info.count++;\n info.inputIndices.push(inputIndex);\n }\n } else {\n info = {count: 1, dimValue, inputIndices: [inputIndex]};\n }\n this.symbolToInfo.set(symbol, info);\n }\n\n // Process one input/output term\n processTerm(term: string, isInput: boolean, dims: readonly number[], index = -1): EinsumTerm {\n const rank = dims.length;\n let ellipsis = false;\n let ellipsisDims = [];\n let nextDim = 0;\n // For output empty string is allowed because the output may be reduced to a scalar value\n if (!term.match(RegExp(termPatternOnly)) && (!isInput && term !== '')) {\n throw new Error('Invalid LHS term');\n }\n const indexSymbols = term.match(RegExp(symbolPattern, 'g'));\n const einsumTerm = new EinsumTerm(index);\n // symbol can be either a lettre, 'a' to 'z' or 'A' to 'Z', or '...'\n indexSymbols?.forEach((symbol: string, i: number) => {\n if (symbol === '...') {\n if (ellipsis) {\n throw new Error('Only one ellipsis is allowed per input term');\n }\n ellipsis = true;\n const ellipsisDimLength = rank - indexSymbols.length + 1;\n if (ellipsisDimLength < 0) {\n throw new Error('Ellipsis out of bounds');\n }\n ellipsisDims = dims.slice(nextDim, nextDim + ellipsisDimLength);\n if (this.hasEllipsis) {\n if (this.ellipsisDims.length !== ellipsisDims.length ||\n this.ellipsisDims.toString() !== ellipsisDims.toString()) {\n throw new Error('Ellipsis dimensions mismatch');\n }\n } else if (isInput) {\n this.hasEllipsis = true;\n this.ellipsisDims = ellipsisDims;\n } else {\n throw new Error('Ellipsis must be specified in the LHS');\n }\n // Add '0', '1', '2', '3', '4', etc to represent ellipsis dimensions to avoid special handling\n for (let j = 0; j < ellipsisDims.length; j++) {\n const symbol = String.fromCharCode('0'.charCodeAt(0) + j);\n einsumTerm.addSymbol(symbol, i + j);\n this.addSymbol(symbol, dims[nextDim++], index);\n }\n } else {\n einsumTerm.addSymbol(symbol, i + (this.hasEllipsis ? this.ellipsisDims.length - 1 : 0));\n this.addSymbol(symbol, dims[nextDim++], index);\n }\n });\n return einsumTerm;\n }\n\n symbolToInfo: Map; // All symbols in the equation\n hasEllipsis: boolean; // The equation has ellipsis or not\n ellipsisDims: number[]; // The dimensions of the equation ellipsis corresponds to.\n lhs: EinsumTerm[]; // Terms on the left-hand side of the equation\n rhs: EinsumTerm; // Term on the right-hand side of the equation\n outputDims: number[]; // Output dimensions of the equation\n} // End of class EinsumEquation\n\nconst appendMax = (name: string): string => name + '_max';\n\nconst createEinsumProgramInfo =\n (inputShapes: Array, dataType: number, einsumEquation: EinsumEquation,\n outputShape: readonly number[]): ProgramInfo => {\n const ranks = inputShapes.map((dims) => dims.length);\n const inputVars = ranks.map((rank, index) => inputVariable(`input${index}`, dataType, rank));\n const outputSize = ShapeUtil.size(outputShape);\n const output = outputVariable('output', dataType, outputShape.length);\n const uniformsSymbols =\n [...einsumEquation.symbolToInfo.keys()].filter((symbol) => !einsumEquation.rhs.symbolToIndices.has(symbol));\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const idxCopy: string[] = [];\n const initProd = 'var prod = 1.0;';\n const initSum = 'var sum = 0.0;';\n const updateSum = 'sum += prod;';\n const reduceOpsSetIndices: string[] = [];\n const reduceOpsLoopHeaders: string[] = [];\n const reduceOpsLoopFooters: string[] = [];\n const reduceOpCompute: string[] = [];\n const isReduceOpsWithoutLoop = einsumEquation.symbolToInfo.size === einsumEquation.rhs.symbolToIndices.size;\n einsumEquation.symbolToInfo.forEach((info, symbol) => {\n if (einsumEquation.rhs.symbolToIndices.has(symbol)) {\n const outputIndex = einsumEquation.rhs.symbolToIndices.get(symbol)?.[0];\n if (outputIndex !== undefined) {\n einsumEquation.lhs.forEach((term, i) => {\n if (info.inputIndices.includes(i)) {\n const indices = term.symbolToIndices.get(symbol);\n if (indices === undefined) {\n throw new Error('Invalid symbol error');\n }\n indices.forEach((index) => {\n idxCopy.push(`${\n inputVars[i].indicesSet(\n `input${i}Indices`, index, output.indicesGet('outputIndices', outputIndex))}`);\n });\n }\n });\n }\n } else {\n einsumEquation.lhs.forEach((term, i) => {\n if (info.inputIndices.includes(i)) {\n const indices = term.symbolToIndices.get(symbol);\n if (indices === undefined) {\n throw new Error('Invalid symbol error');\n }\n indices.forEach((index) => {\n reduceOpsSetIndices.push(`${inputVars[i].indicesSet(`input${i}Indices`, index, `${symbol}`)}`);\n });\n reduceOpCompute.push(`prod *= ${inputVars[i].getByIndices(`input${i}Indices`)};`);\n }\n });\n reduceOpsLoopHeaders.push(\n `for(var ${symbol}: u32 = 0; ${symbol} < uniforms.${appendMax(symbol)}; ${symbol}++) {`);\n reduceOpsLoopFooters.push('}');\n }\n });\n const reduceOps = isReduceOpsWithoutLoop ?\n [\n ...idxCopy,\n `let sum = ${inputVars.map((inputVar, i) => inputVar.getByIndices(`input${i}Indices`)).join(' * ')};`\n ] :\n [\n ...idxCopy,\n initSum,\n ...reduceOpsLoopHeaders,\n ...reduceOpsSetIndices,\n initProd,\n ...reduceOpCompute,\n updateSum,\n ...reduceOpsLoopFooters,\n ];\n return `\n ${\n shaderHelper\n .registerUniforms(uniformsSymbols.map((symbol) => ({name: `${appendMax(symbol)}`, type: 'u32'})))\n .registerUniform('outputSize', 'u32')\n .declareVariables(...inputVars, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n var outputIndices = ${output.offsetToIndices('global_idx')};\n ${inputVars.map((_var, i) => `var input${i}Indices: ${inputVars[i].type.indices};`).join('\\n')}\n ${reduceOps.join('\\n')};\n ${output.setByOffset('global_idx', 'sum')};\n }`;\n };\n return {\n name: 'Einsum',\n shaderCache: {hint: einsumEquation.equation, inputDependencies: inputShapes.map(() => 'rank')},\n getRunData: () => {\n // The symbols from uniformSymbols array are guaranteed to exist in einsumEquations.symbolToInfo map. The\n // filter is added to make sure that dimValue is never 0.\n const programUniformsInit: ProgramUniform[] =\n uniformsSymbols.filter((symbol) => einsumEquation.symbolToInfo.has(symbol))\n .map(\n (symbol) =>\n ({type: DataType.uint32, data: einsumEquation.symbolToInfo.get(symbol)?.dimValue || 0}));\n programUniformsInit.push({type: DataType.uint32, data: outputSize});\n const programUniforms: ProgramUniform[] =\n inputShapes.map((dims, _) => [...createTensorShapeVariables(dims)])\n .reduce((acc, inputProgramUniforms) => acc.concat(inputProgramUniforms), programUniformsInit);\n programUniforms.push(...createTensorShapeVariables(outputShape));\n return ({\n outputs: [{dims: outputShape, dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n });\n },\n getShaderSource,\n };\n };\n\nexport const einsum = (context: ComputeContext, attributes: EinsumAttributes): void => {\n const einsumEquation = new EinsumEquation(context.inputs, attributes.equation);\n const outputShape = einsumEquation.outputDims;\n const inputShapes = context.inputs.map((input, _) => input.dims);\n context.compute(createEinsumProgramInfo(inputShapes, context.inputs[0].dataType, einsumEquation, outputShape));\n};\n\nexport const parseEinsumAttributes = (attributes: Record): EinsumAttributes => {\n const equation = (attributes.equation as string).replace(/\\s+/g, '');\n return createAttributeWithCacheKey({equation});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Expand requires 2 input.');\n }\n const inputShape = inputs[0].dims;\n const shape = Array.from(inputs[1].getBigInt64Array(), Number);\n\n let shapeIndex = shape.length < inputShape.length ? 0 : shape.length - inputShape.length;\n let inputShapeIndex = inputShape.length < shape.length ? 0 : inputShape.length - shape.length;\n for (; shapeIndex < shape.length && inputShapeIndex < inputShape.length; ++shapeIndex, ++inputShapeIndex) {\n if (shape[shapeIndex] !== inputShape[inputShapeIndex] && shape[shapeIndex] !== 1 &&\n inputShape[inputShapeIndex] !== 1) {\n throw new Error('Expand requires shape to be broadcastable to input');\n }\n }\n};\n\nconst getAdjustedShape = (shape1: readonly number[], shape2: readonly number[]): number[] => {\n const diff = shape1.length - shape2.length;\n const shape: number[] = [];\n for (let i = 0; i < diff; ++i) {\n shape.push(shape1[i]);\n }\n for (let i = 0; i < shape2.length; ++i) {\n shape.push(shape2[i] === 1 ? shape1[i + diff] : shape2[i]);\n }\n return shape;\n};\n\nconst calculateOutputShape = (inputShape: readonly number[], shape: readonly number[]): number[] =>\n (inputShape.length > shape.length) ? getAdjustedShape(inputShape, shape) : getAdjustedShape(shape, inputShape);\n\n\nconst createExpandProgramInfo = (inputs: readonly TensorView[]): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const shape = Array.from(inputs[1].getBigInt64Array(), Number);\n const outputShape: number[] = calculateOutputShape(inputShape, shape);\n const dataType = inputs[0].dataType;\n const components = dataType === DataType.bool ? 4 : 1;\n const outputSize = Math.ceil(ShapeUtil.size(outputShape) / components);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const input = inputVariable('input', dataType, inputShape.length, components);\n const output = outputVariable('output', dataType, outputShape.length, components);\n let assignment: string;\n if (dataType === DataType.bool) {\n const singleAssignment = (resStr: string, x: number, typeCast = '') => `\n let outputIndices${x} = ${output.offsetToIndices(`outputOffset + ${x}u`)};\n let offset${x} = ${input.broadcastedIndicesToOffset(`outputIndices${x}`, output)};\n let index${x} = offset${x} / 4u;\n let component${x} = offset${x} % 4u;\n ${resStr}[${x}] = ${typeCast}(${input.getByOffset(`index${x}`)}[component${x}]);\n `;\n assignment = `\n let outputOffset = global_idx * ${components};\n var data = vec4(0);\n ${singleAssignment('data', 0, 'u32')}\n ${singleAssignment('data', 1, 'u32')}\n ${singleAssignment('data', 2, 'u32')}\n ${singleAssignment('data', 3, 'u32')}\n ${output.setByOffset('global_idx', 'data')}\n }`;\n } else {\n assignment = `\n let outputIndices = ${output.offsetToIndices('global_idx')};\n let inputOffset = ${input.broadcastedIndicesToOffset('outputIndices', output)};\n ${output.setByOffset('global_idx', input.getByOffset('inputOffset'))}\n }`;\n }\n return `\n ${shaderHelper.registerUniform('vec_size', 'u32').declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.vec_size')}\n ${assignment}`;\n };\n\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(inputShape, outputShape)];\n return {\n name: 'Expand',\n shaderCache: {hint: `${outputShape.length}`, inputDependencies: ['rank']},\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n })\n };\n};\n\nexport const expand = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n context.compute(createExpandProgramInfo(context.inputs), {inputs: [0]});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglValueType, UniformsArrayType, WORKGROUP_SIZE} from './common';\nimport * as unary from './unary-op';\n\n// GELU is defined as Y=0.5*X*(1+tanh(0.797885*X+0.035677*X*X*X)), where X may pre-add a bias.\n\nconst createFastGeluProgramInfo = (inputTensors: readonly TensorView[]): ProgramInfo => {\n const dataType = inputTensors[0].dataType;\n const outputSize = ShapeUtil.size(inputTensors[0].dims);\n const biasLength = ShapeUtil.size(inputTensors[1].dims);\n // can only use vec4 when bias length is multiple of 4\n const useVec4 = biasLength % 4 === 0;\n const getShaderSource = (shaderHelper: ShaderHelper): string => {\n const x = inputVariable('x', dataType, [1], 4);\n const bias = inputVariable('bias', dataType, [1], 4);\n const y = outputVariable('y', dataType, [1], 4);\n\n const uniforms: UniformsArrayType = [{name: 'output_vec_size', type: 'u32'}, {name: 'bias_size', type: 'u32'}];\n\n const singleElementBias = (i: 0|1|2|3) => `\n let bias${i}_offset: u32 = (global_idx * 4 + ${i}) % uniforms.bias_size;\n let bias${i} = ${bias.getByOffset(`bias${i}_offset / 4`)}[bias${i}_offset % 4];`;\n const biasGetExpression = useVec4 ?\n `\n let bias = ${bias.getByOffset('global_idx % (uniforms.bias_size / 4)')};` :\n `${singleElementBias(0)}${singleElementBias(1)}${singleElementBias(2)}${singleElementBias(3)}\n let bias = ${x.type.value}(bias0, bias1, bias2, bias3);`;\n\n return `${shaderHelper.registerUniforms(uniforms).declareVariables(x, bias, y)}\n\n ${unary.fastGeluImpl(tensorTypeToWsglValueType(dataType))}\n\n ${shaderHelper.mainStart(WORKGROUP_SIZE)}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_vec_size')}\n\n let x = ${x.getByOffset('global_idx')};\n ${biasGetExpression}\n let x_in = x + bias;\n ${y.setByOffset('global_idx', unary.fastGeluExpression('x_in'))}\n }`;\n };\n\n return {\n name: 'FastGeluWithBias',\n shaderCache: {hint: `${useVec4}`, inputDependencies: ['type', 'type']},\n getShaderSource,\n getRunData: (inputs) => ({\n outputs: [{dims: inputs[0].dims, dataType: inputs[0].dataType}],\n programUniforms:\n [{type: DataType.uint32, data: Math.ceil(outputSize / 4)}, {type: DataType.uint32, data: biasLength}],\n dispatchGroup: {x: Math.ceil(outputSize / WORKGROUP_SIZE / 4)}\n })\n };\n};\n\nexport const fastGelu = (context: ComputeContext): void => {\n if (context.inputs.length < 2 || ShapeUtil.size(context.inputs[1].dims) === 0) {\n unary.fastGelu(context);\n } else {\n context.compute(createFastGeluProgramInfo(context.inputs));\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface GatherAttributes extends AttributeWithCacheKey {\n axis: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Gather requires 2 inputs.');\n }\n};\n\nconst createGatherProgramInfo = (inputs: readonly TensorView[], attributes: GatherAttributes): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const indicesShape = inputs[1].dims;\n\n const inputRank = inputShape.length;\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputRank);\n\n const outputShape = inputShape.slice(0);\n outputShape.splice(axis, 1, ...indicesShape);\n\n const axisDimLimit = inputShape[axis];\n const components = inputs[0].dataType === DataType.bool ? 4 : 1;\n const outputSize = Math.ceil(ShapeUtil.size(outputShape) / components);\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.int32, data: axisDimLimit},\n {type: DataType.uint32, data: axis}, ...createTensorShapeVariables(inputs[0].dims, inputs[1].dims, outputShape)\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const data = inputVariable('data', inputs[0].dataType, inputs[0].dims.length, components);\n const indices = inputVariable('inputIndices', inputs[1].dataType, inputs[1].dims.length);\n const output = outputVariable('output', inputs[0].dataType, outputShape.length, components);\n\n const calcDataIndices = (x: number|string): string => {\n const indicesRank = indicesShape.length;\n let calcStr = `var indicesIndices${x} = ${indices.type.indices}(0);`;\n for (let i = 0; i < indicesRank; i++) {\n calcStr += `${indicesRank > 1 ? `indicesIndices${x}[${i}]` : `indicesIndices${x}`} = ${\n outputShape.length > 1 ? `outputIndices${x}[uniforms.axis + ${i}]` : `outputIndices${x}`};`;\n }\n calcStr += `\n var idx${x} = ${indices.getByIndices(`indicesIndices${x}`)};\n if (idx${x} < 0) {\n idx${x} = idx${x} + uniforms.axisDimLimit;\n }\n var dataIndices${x} : ${data.type.indices};\n `;\n for (let i = 0, j = 0; i < inputRank; i++) {\n if (i === axis) {\n calcStr += `${inputRank > 1 ? `dataIndices${x}[${i}]` : `dataIndices${x}`} = u32(idx${x});`;\n j += indicesRank;\n } else {\n calcStr += `${inputRank > 1 ? `dataIndices${x}[${i}]` : `dataIndices${x}`} = ${\n outputShape.length > 1 ? `outputIndices${x}[${j}]` : `outputIndices${x}`};`;\n j++;\n }\n }\n return calcStr;\n };\n let assignment: string;\n if (inputs[0].dataType === DataType.bool) {\n const singleAssignment = (resStr: string, x: number, typeCast = '') => `\n let outputIndices${x} = ${output.offsetToIndices(`outputOffset + ${x}u`)};\n ${calcDataIndices(x)};\n let offset${x} = ${data.indicesToOffset(`dataIndices${x}`)};\n let index${x} = offset${x} / 4u;\n let component${x} = offset${x} % 4u;\n ${resStr}[${x}] = ${typeCast}(${data.getByOffset(`index${x}`)}[component${x}]);\n `;\n assignment = `\n let outputOffset = global_idx * ${components};\n var value = vec4(0);\n ${singleAssignment('value', 0, 'u32')}\n ${singleAssignment('value', 1, 'u32')}\n ${singleAssignment('value', 2, 'u32')}\n ${singleAssignment('value', 3, 'u32')}\n ${output.setByOffset('global_idx', 'value')}\n `;\n } else {\n assignment = `\n let outputIndices = ${output.offsetToIndices('global_idx')};\n ${calcDataIndices('')};\n let value = ${data.getByIndices('dataIndices')};\n ${output.setByOffset('global_idx', 'value')};\n `;\n }\n return `\n ${\n shaderHelper.registerUniform('outputSize', 'u32')\n .registerUniform('axisDimLimit', 'i32')\n .registerUniform('axis', 'u32')\n .declareVariables(data, indices, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n ${assignment}\n }`;\n };\n return {\n name: 'Gather',\n shaderCache: {hint: attributes.cacheKey, inputDependencies: ['rank', 'rank']},\n getRunData: () => ({\n outputs: [\n {dims: outputShape, dataType: inputs[0].dataType},\n ],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n};\n\nexport const parseGatherAttributes = (attributes: Record): GatherAttributes =>\n createAttributeWithCacheKey({axis: attributes.axis as number});\n\nexport const gather = (context: ComputeContext, attributes: GatherAttributes): void => {\n const inputs = context.inputs;\n validateInputs(inputs);\n context.compute(createGatherProgramInfo(context.inputs, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface GatherElementsAttributes extends AttributeWithCacheKey {\n axis: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('GatherElements requires 2 inputs.');\n }\n\n if (inputs[0].dims.length < 1) {\n throw new Error('GatherElements requires that the data input be rank >= 1.');\n }\n\n if (inputs[0].dims.length !== inputs[1].dims.length) {\n throw new Error(`GatherElements requires that the data input and\n indices input tensors be of same rank.`);\n }\n};\n\nconst createGatherElementsProgramInfo =\n (inputs: readonly TensorView[], attributes: GatherElementsAttributes): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const inputOutputDataType = inputs[0].dataType;\n const inputRank = inputShape.length;\n\n const indicesShape = inputs[1].dims;\n const indicesDataType = inputs[1].dataType;\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputRank);\n const axisDimLimit = inputShape[axis];\n\n const outputShape = indicesShape.slice(0);\n const outputSize = ShapeUtil.size(outputShape);\n\n const input = inputVariable('input', inputOutputDataType, inputRank);\n const indices = inputVariable('indicesInput', indicesDataType, indicesShape.length);\n const output = outputVariable('output', inputOutputDataType, outputShape.length);\n\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.int32, data: axisDimLimit},\n {type: DataType.uint32, data: axis}\n ];\n programUniforms.push(...createTensorShapeVariables(inputShape, indicesShape, outputShape));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'rank'];\n\n // int64 indices would be treated as little endian i32 with assumption they fall in i32 limits\n // That assumption is safe as it's not possible to allocate >2gb buffer for input tensor\n // Input data will be treated as u32 or two u32 for 8-byte tensors\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${\n shaderHelper.registerUniform('outputSize', 'u32')\n .registerUniform('axisDimLimit', 'i32')\n .registerUniform('axis', 'u32')\n .declareVariables(input, indices, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n\n let outputIndices = ${output.offsetToIndices('global_idx')};\n\n var idx = ${indices.getByOffset('global_idx')};\n if (idx < 0) {\n idx = idx + uniforms.axisDimLimit;\n }\n var inputIndices = ${input.type.indices}(outputIndices);\n ${input.indicesSet('inputIndices', 'uniforms.axis', 'u32(idx)')};\n let value = ${input.getByIndices('inputIndices')};\n\n ${output.setByOffset('global_idx', 'value')};\n }`;\n\n return {\n name: 'GatherElements',\n shaderCache: {inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n };\n\nexport const parseGatherElementsAttributes = (attributes: Record): GatherElementsAttributes =>\n createAttributeWithCacheKey({axis: attributes.axis as number});\n\nexport const gatherElements = (context: ComputeContext, attributes: GatherElementsAttributes): void => {\n const inputs = context.inputs;\n validateInputs(inputs);\n context.compute(createGatherElementsProgramInfo(context.inputs, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {GemmUtil, ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, IndicesHelper, inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs) {\n throw new Error('Input is missing');\n }\n if (inputs.length < 2 || inputs.length > 3) {\n throw new Error('Invaid input number.');\n }\n\n // 'C' can be of dimensionality 0, 1 or 2 only\n if (inputs.length === 3 && inputs[2].dims.length > 2) {\n throw new Error('Invalid input shape of C');\n }\n\n if ((inputs[0].dataType !== inputs[1].dataType) ||\n (inputs.length === 3 && inputs[0].dataType !== inputs[2].dataType)) {\n throw new Error('Input types are mismatched');\n }\n};\n\nexport interface GemmAttributes extends AttributeWithCacheKey {\n transA: boolean;\n transB: boolean;\n alpha: number;\n beta: number;\n}\n\nconst createGemmProgramInfo = (inputs: readonly TensorView[], attributes: GemmAttributes): ProgramInfo => {\n const aShape = inputs[0].dims.slice();\n const bShape = inputs[1].dims.slice();\n const [M, N, K] = GemmUtil.getShapeOfGemmResult(\n aShape, attributes.transA, bShape, attributes.transB, inputs.length === 3 ? inputs[2].dims : undefined);\n const outputShape = [M, N];\n if (!outputShape) {\n throw new Error('Can\\'t use gemm on the given tensors');\n }\n const outputSize = ShapeUtil.size(outputShape);\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: M}, {type: DataType.uint32, data: N},\n {type: DataType.uint32, data: K}, {type: DataType.float, data: attributes.alpha},\n {type: DataType.float, data: attributes.beta}\n ];\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type'];\n if (inputs.length === 3) {\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n inputDependencies.push('rank');\n }\n programUniforms.push(...createTensorShapeVariables(outputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n let line = '';\n if (attributes.transA && attributes.transB) {\n line = 'value += a[k * uniforms.M + m] * b[n * uniforms.K + k];';\n } else if (attributes.transA && !attributes.transB) {\n line = 'value += a[k * uniforms.M + m] * b[k * uniforms.N + n];';\n } else if (!attributes.transA && attributes.transB) {\n line = 'value += a[m * uniforms.K + k] * b[n * uniforms.K + k];';\n } else if (!attributes.transA && !attributes.transB) {\n line = 'value += a[m * uniforms.K + k] * b[k * uniforms.N + n];';\n }\n\n const calculateAlpha = attributes.alpha === 1 ? '' : 'value *= uniforms.alpha;';\n const a = inputVariable('a', inputs[0].dataType, inputs[0].dims);\n const b = inputVariable('b', inputs[1].dataType, inputs[1].dims);\n const dataType = a.type.value;\n let c: IndicesHelper|null = null;\n const variables = [a, b];\n if (inputs.length === 3) {\n c = inputVariable('c', inputs[2].dataType, inputs[2].dims.length);\n variables.push(c);\n }\n const output = outputVariable('output', inputs[0].dataType, outputShape.length);\n variables.push(output);\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'M', type: 'u32'}, {name: 'N', type: 'u32'}, {name: 'K', type: 'u32'},\n {name: 'alpha', type: 'f32'}, {name: 'beta', type: 'f32'}\n ];\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...variables)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let m = global_idx / uniforms.N;\n let n = global_idx % uniforms.N;\n\n var value = ${dataType}(0);\n for (var k: u32 = 0u; k < uniforms.K; k++) {\n ${line}\n }\n\n ${calculateAlpha}\n ${(() => {\n if (c != null) {\n return `let cOffset = ${c.broadcastedIndicesToOffset('vec2(m, n)', output)}; value += ${\n dataType}(uniforms.beta) * ${c.getByOffset('cOffset')};`;\n }\n return '';\n })()}\n output[global_idx] = value;\n }`;\n };\n\n return {\n name: 'Gemm',\n shaderCache: {hint: `${attributes.cacheKey}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n};\n\nexport const parseGemmAttributes = (attributes: Record): GemmAttributes => {\n const transA = attributes.transA as boolean;\n const transB = attributes.transB as boolean;\n const alpha = attributes.alpha as number;\n const beta = attributes.beta as number;\n return {transA, transB, alpha, beta, cacheKey: `${attributes.transA};${attributes.transB};${attributes.alpha === 1}`};\n};\n\nexport const gemm = (context: ComputeContext, attributes: GemmAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createGemmProgramInfo(context.inputs, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, GpuDataType, ProgramUniform} from '../types';\n\nimport {applyAttention, AttentionAttrs, AttentionMaskType, AttentionParameters, AttentionQkvFormat} from './attention';\nimport {inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\nimport {createTransposeProgramInfo, TransposeAttributes} from './transpose';\n\nconst getInput = (inputs: readonly TensorView[], i: number) =>\n (inputs.length > i) && (inputs[i].dims.length > 0) && (ShapeUtil.size(inputs[i].dims)) > 0 ? inputs[i] : undefined;\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: AttentionAttrs): AttentionParameters => {\n const query = inputs[0];\n const key = getInput(inputs, 1);\n const value = getInput(inputs, 2);\n const bias = getInput(inputs, 3);\n const keyPaddingMask = getInput(inputs, 4);\n const relativePositionBias = getInput(inputs, 5);\n const pastKey = getInput(inputs, 6);\n const pastValue = getInput(inputs, 7);\n\n // Abbreviation and Meanings:\n // B: batch_size\n // S: sequence_length (input sequence length of query)\n // P: past_sequence_length (past sequence length of key or value)\n // L: kv_sequence_length (input sequence length of key or value)\n // M: max_sequence_length\n // T: total_sequence_length = past_sequence_length + kv_sequence_length\n // N: num_heads\n // H: head size for Q and K, aka q_head_size or k_head_size or qk_head_size\n // H_v: v_head_size\n // D_i: input hidden size\n // D: hidden size for Q and K (D = N * H), aka q_hidden_size or k_hidden_size or qk_hidden_size\n // D_v: v_hidden_size = num_heads * v_head_size\n\n // key_padding_mask (K/V) : (B) or (2*B + 1) or (B, L) or None\n // relative_position_bias : (B, 1, S, L)\n // past_key : (B, N, S*, H)\n // past_value : (B, N, S*, H)\n // When no packing for q/k/v:\n // query (Q) : (B, S, D)\n // key (K) : (B, L, D) or (B, N, S*, H)\n // value (V) : (B, L, D_v) or (B, N, S*, H)\n // bias (Q/K/V) : (D + D + D_v)\n // When packed kv is used:\n // query (Q) : (B, S, D)\n // key (K) : (B, L, N, 2, H)\n // value (V) : None\n // bias (Q/K/V) : None\n // When packed qkv is used:\n // query (Q) : (B, L, N, 3, H) or (B, S, 3*D)\n // key (K) : None\n // value (V) : None\n // bias (Q/K/V) : None or (D + D + D_v)\n\n if (query.dims.length !== 3 && query.dims.length !== 5) {\n throw new Error('Input query is expected to have 3 or 5 dimensions');\n }\n\n const dmmhaPacking = false;\n const batchSize = query.dims[0];\n const sequenceLength = query.dims[1];\n const hiddenSize = query.dims.length === 3 ? (dmmhaPacking ? query.dims[2] / 3 : query.dims[2]) :\n attributes.numHeads * query.dims[4];\n let kvSequenceLength = sequenceLength;\n\n let pastSequenceLength = 0;\n let maxSequenceLength = 0;\n const headSize = Math.floor(hiddenSize / attributes.numHeads);\n if (pastKey && pastValue) {\n if (pastKey.dims.length !== 4) {\n throw new Error('Input \"past_key\" is expected to have 4 dimensions');\n }\n if (pastKey.dims[0] !== batchSize || pastKey.dims[1] !== attributes.numHeads || pastKey.dims[3] !== headSize) {\n throw new Error('Input \"past_key\" shape (batch_size, num_heads, past_sequence_length, head_size)');\n }\n if (pastValue.dims[0] !== batchSize || pastValue.dims[1] !== attributes.numHeads ||\n pastValue.dims[3] !== headSize) {\n throw new Error('Input \"past_value\" shape (batch_size, num_heads, past_sequence_length, head_size)');\n }\n if (pastKey.dims[2] !== pastValue.dims[2]) {\n throw new Error('Input \"past_key\" and \"past_value\" shall have same dim 2 (past_sequence_length)');\n }\n if (pastValue.dims.length !== 4) {\n throw new Error('Input \"past_value\" is expected to have 4 dimensions');\n }\n pastSequenceLength = pastKey.dims[2];\n maxSequenceLength = pastKey.dims[2];\n } else if (pastKey || pastValue) {\n throw new Error('Input \"past_key\" and \"past_value\" shall be both present or both absent');\n }\n\n let qkvFormat: AttentionQkvFormat;\n if (key) {\n if (query.dims.length !== 3) {\n throw new Error('Input \"query\" is expected to have 3 dimensions when key is given');\n }\n if (key.dims.length < 3 || key.dims.length > 5) {\n throw new Error('Input \"key\" is expected to have 3, 4, or 5 dimensions');\n }\n if (query.dims[0] !== key.dims[0]) {\n throw new Error('Input \"query\" and \"key\" shall have same dim 0 (batch size)');\n }\n\n if (key.dims.length === 3) {\n if (key.dims[2] !== query.dims[2]) {\n throw new Error('Input \"query\" and \"key\" shall have same dim 2 (hidden_size)');\n }\n qkvFormat = AttentionQkvFormat.qkvBSNH;\n kvSequenceLength = key.dims[1];\n } else if (key.dims.length === 5) {\n if (key.dims[2] !== attributes.numHeads || key.dims[3] !== 2 || key.dims[4] !== headSize) {\n throw new Error('Expect \"key\" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');\n }\n if (value) {\n throw new Error('Expect \"value\" be none when \"key\" has packed kv format.');\n }\n qkvFormat = AttentionQkvFormat.qKvBSNHxBSN2H;\n kvSequenceLength = key.dims[1];\n } else { // key_dims.size() == 4 (cross-attention with past_key)\n if (key.dims[1] !== attributes.numHeads || key.dims[3] !== headSize) {\n throw new Error('Expect \"key\" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');\n }\n\n qkvFormat = AttentionQkvFormat.unknown;\n kvSequenceLength = key.dims[2];\n }\n } else { // packed QKV\n if (query.dims.length !== 3 && query.dims.length !== 5) {\n throw new Error('Input \"query\" is expected to have 3 or 5 dimensions when key is empty');\n }\n if (query.dims.length === 5 && (query.dims[2] !== attributes.numHeads || query.dims[3] !== 3)) {\n throw new Error('Expect \"query\" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');\n }\n\n qkvFormat = AttentionQkvFormat.qkvBSN3H;\n }\n\n if (bias) {\n if (bias.dims.length !== 1) {\n throw new Error('Input \"bias\" is expected to have 1 dimension');\n }\n\n if (value) {\n if (query.dims.length === 5 && query.dims[3] === 2) {\n throw new Error('bias is not allowed for packed kv.');\n }\n }\n }\n\n let maskType: AttentionMaskType = AttentionMaskType.none;\n if (keyPaddingMask) {\n maskType = AttentionMaskType.maskUnknown;\n const maskDims = keyPaddingMask.dims;\n if (maskDims.length === 1) {\n if (maskDims[0] === batchSize) {\n maskType = AttentionMaskType.mask1dKeySeqLen;\n } else if (maskDims[0] === 3 * batchSize + 2) {\n maskType = AttentionMaskType.mask1DKeySeqLenStart;\n }\n } else if (maskDims.length === 2 && maskDims[0] === batchSize && maskDims[1] === kvSequenceLength) {\n maskType = AttentionMaskType.mask2dKeyPadding;\n }\n if (maskType === AttentionMaskType.maskUnknown) {\n throw new Error('Input \"key_padding_mask\" shape shall be (batch_size) or (batch_size, kv_sequence_length)');\n }\n throw new Error('Mask not supported');\n }\n\n let passPastInKv = false;\n let vHiddenSize = hiddenSize;\n if (value) {\n if (value.dims.length !== 3 && value.dims.length !== 4) {\n throw new Error('Input \"value\" is expected to have 3 or 4 dimensions');\n }\n\n if (query.dims[0] !== value.dims[0]) {\n throw new Error('Input \"query\" and \"value\" shall have same dim 0 (batch_size)');\n }\n\n if (value.dims.length === 3) {\n if (kvSequenceLength !== value.dims[1]) {\n throw new Error('Input \"key\" and \"value\" shall have the same dim 1 (kv_sequence_length)');\n }\n vHiddenSize = value.dims[2];\n } else {\n if (kvSequenceLength !== value.dims[2]) {\n throw new Error('Input \"past_key\" and \"past_value\" shall have the same dim 2 (kv_sequence_length)');\n }\n vHiddenSize = value.dims[1] * value.dims[3];\n passPastInKv = true;\n }\n }\n\n const totalSequenceLength = pastSequenceLength + kvSequenceLength;\n const broadcastResPosBias = false;\n\n if (keyPaddingMask) {\n throw new Error('Key padding mask is not supported');\n }\n\n if (relativePositionBias) {\n if (relativePositionBias.dims.length !== 4) {\n throw new Error('Input \"relative_position_bias\" is expected to have 4 dimensions');\n }\n if ((relativePositionBias.dims[0] !== batchSize && relativePositionBias.dims[0] !== 1) ||\n relativePositionBias.dims[1] !== attributes.numHeads || relativePositionBias.dims[2] !== sequenceLength ||\n relativePositionBias.dims[3] !== totalSequenceLength) {\n throw new Error('Input \"relative_position_bias\" shape (batch_size, 1, sequence_length, kv_sequence_length)');\n }\n }\n\n return {\n batchSize,\n sequenceLength,\n pastSequenceLength,\n kvSequenceLength,\n totalSequenceLength,\n maxSequenceLength,\n inputHiddenSize: 0,\n hiddenSize,\n vHiddenSize,\n headSize,\n vHeadSize: Math.floor(vHiddenSize / attributes.numHeads),\n numHeads: attributes.numHeads,\n isUnidirectional: false,\n pastPresentShareBuffer: false,\n maskFilterValue: attributes.maskFilterValue,\n maskType,\n scale: attributes.scale,\n broadcastResPosBias,\n passPastInKv,\n qkvFormat,\n };\n};\n\nexport const parseMultiHeadAttentionAttributes = (attributes: AttentionAttrs): AttentionAttrs =>\n createAttributeWithCacheKey({...attributes});\n\nconst weightTransposeAttribute: TransposeAttributes = createAttributeWithCacheKey({perm: [0, 2, 1, 3]});\n\nconst addBiasTranspose =\n (context: ComputeContext, qkv: TensorView, bias: TensorView, batchSize: number, sequenceLength: number,\n hiddenSize: number, biasOffset: number) => {\n const outputShape = [batchSize, sequenceLength, hiddenSize];\n const outputSize = ShapeUtil.size(outputShape);\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: biasOffset},\n {type: DataType.uint32, data: hiddenSize}\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('qkv_with_bias', qkv.dataType, outputShape);\n const qkvInput = inputVariable('qkv', qkv.dataType, outputShape);\n const biasInput = inputVariable('bias', bias.dataType, outputShape);\n\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'bias_offset', type: 'u32'}, {name: 'hidden_size', type: 'u32'}\n ];\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(qkvInput, biasInput, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let bias_offset_idx = (global_idx % uniforms.hidden_size) + uniforms.bias_offset;\n\n qkv_with_bias[global_idx] = qkv[global_idx] + bias[bias_offset_idx];\n }`;\n };\n\n return context.compute(\n {\n name: 'MultiHeadAttentionAddBias',\n shaderCache: {inputDependencies: ['type', 'type']},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: qkv.dataType, gpuDataType: GpuDataType.default}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n },\n {inputs: [qkv, bias], outputs: [-1]})[0];\n };\n\nexport const maybeTransposeToBNSHAndAddBias =\n (context: ComputeContext, batchSize: number, numHeads: number, sequenceLength: number, headSize: number,\n input: TensorView, bias?: TensorView, biasOffset?: number) => {\n // const newDims = [];\n\n let reshapedInput = input;\n if (!bias) {\n if (input.dims.length === 3) {\n reshapedInput = input.reshape([batchSize, sequenceLength, numHeads, headSize]);\n }\n return context.compute(\n createTransposeProgramInfo(reshapedInput, weightTransposeAttribute.perm),\n {inputs: [reshapedInput], outputs: [-1]})[0];\n } else {\n if (sequenceLength === 1) {\n throw new Error('AddBiasReshape is not implemented. Please export your model with packed QKV or KV');\n } else {\n reshapedInput =\n addBiasTranspose(context, input, bias, batchSize, sequenceLength, numHeads * headSize, biasOffset!);\n reshapedInput = reshapedInput.reshape([batchSize, sequenceLength, numHeads, headSize]);\n return context.compute(\n createTransposeProgramInfo(reshapedInput, weightTransposeAttribute.perm),\n {inputs: [reshapedInput], outputs: [-1]})[0];\n }\n }\n };\n\nexport const multiHeadAttention = (context: ComputeContext, attributes: AttentionAttrs): void => {\n const params = validateInputs(context.inputs, attributes);\n const query = context.inputs[0];\n const key = getInput(context.inputs, 1);\n const value = getInput(context.inputs, 2);\n const bias = getInput(context.inputs, 3);\n const keyPaddingMask = getInput(context.inputs, 4);\n const relativePositionBias = getInput(context.inputs, 5);\n const pastKey = getInput(context.inputs, 6);\n const pastValue = getInput(context.inputs, 7);\n if (query.dims.length === 5) {\n throw new Error('Packed QKV is not implemented');\n }\n\n if (key?.dims.length === 5) {\n throw new Error('Packed KV is not implemented');\n }\n\n // applyAttention expects BNSH inputs\n const kvBNSH = key && value && key.dims.length === 4 && value.dims.length === 4;\n\n const Q = maybeTransposeToBNSHAndAddBias(\n context, params.batchSize, params.numHeads, params.sequenceLength, params.headSize, query, bias, 0);\n\n if (kvBNSH) {\n return applyAttention(\n context, Q, key, value, keyPaddingMask, undefined, pastKey, pastValue, relativePositionBias, params,\n attributes);\n }\n if (!key || !value) {\n throw new Error('key and value must be provided');\n }\n const K = maybeTransposeToBNSHAndAddBias(\n context, params.batchSize, params.numHeads, params.kvSequenceLength, params.headSize, key, bias,\n params.hiddenSize);\n\n const V = maybeTransposeToBNSHAndAddBias(\n context, params.batchSize, params.numHeads, params.kvSequenceLength, params.vHeadSize, value, bias,\n 2 * params.hiddenSize);\n\n applyAttention(\n context, Q, K, V, keyPaddingMask, undefined, pastKey, pastValue, relativePositionBias, params, attributes);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nconst getRepeats = (repeatsTensorView: TensorView): readonly number[] =>\n Array.from(repeatsTensorView.getBigInt64Array(), Number);\n\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 2) {\n throw new Error('Tile requires 2 inputs.');\n }\n\n if (inputs[0].dataType !== DataType.float && inputs[0].dataType !== DataType.float16 &&\n inputs[0].dataType !== DataType.int32 && inputs[0].dataType !== DataType.uint32) {\n throw new Error('Tile only support float, float16, int32, and uint32 data types');\n }\n\n if (inputs[1].dataType !== DataType.int64) {\n throw new Error('Tile `repeats` input should be of int64 data type');\n }\n\n if (inputs[1].dims.length !== 1) {\n throw new Error('Tile `repeats` input should be 1-D');\n }\n\n const repeats: readonly number[] = getRepeats(inputs[1]);\n\n if (repeats.length !== inputs[0].dims.length) {\n throw new Error('Tile `repeats` input should have same number of elements as rank of input data tensor');\n }\n};\n\nconst getOutputShape = (inputShape: readonly number[], repeats: readonly number[]): readonly number[] => {\n const outputShape: number[] = [];\n\n for (let i = 0; i < inputShape.length; ++i) {\n outputShape.push(inputShape[i] * repeats[i]);\n }\n\n return outputShape;\n};\n\nexport const createTileProgramInfo = (inputs: readonly TensorView[], shape?: number[]): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const repeats: readonly number[] = shape == null ? getRepeats(inputs[1]) : shape;\n const outputShape = getOutputShape(inputShape, repeats);\n const outputSize = ShapeUtil.size(outputShape);\n\n const dataType = inputs[0].dataType;\n const input = inputVariable('input', dataType, inputShape.length);\n const output = outputVariable('output', dataType, outputShape.length);\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n const inputShape = ${input.indices(...inputShape)};\n ${shaderHelper.registerUniform('output_size', 'u32').declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n let output_indices = ${output.offsetToIndices('global_idx')};\n var input_indices: ${input.type.indices};\n for (var i = 0; i < ${inputShape.length}; i++) {\n let input_dim_i = ${input.indicesGet('uniforms.input_shape', 'i')};\n let input_dim_value = ${output.indicesGet('output_indices', 'i')} % input_dim_i;\n\n ${input.indicesSet('input_indices', 'i', 'input_dim_value')}\n }\n ${output.setByOffset('global_idx', input.getByIndices('input_indices'))}\n }`;\n\n return {\n name: 'Tile',\n shaderCache: {hint: `${repeats}`, inputDependencies: ['rank']},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms:\n [{type: DataType.uint32, data: outputSize}, ...createTensorShapeVariables(inputs[0].dims, outputShape)],\n }),\n getShaderSource,\n };\n};\n\nexport const tile = (context: ComputeContext): void => {\n validateInputs(context.inputs);\n context.compute(createTileProgramInfo(context.inputs), {inputs: [0]});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {applyAttention, AttentionAttrs, AttentionMaskType, AttentionParameters, AttentionQkvFormat} from './attention';\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\nimport {maybeTransposeToBNSHAndAddBias} from './multihead-attention';\nimport {createTileProgramInfo} from './tile';\nimport {createTransposeProgramInfo, TransposeAttributes} from './transpose';\n\nexport const validateInputs = (inputs: readonly TensorView[], attributes: AttentionAttrs): AttentionParameters => {\n const query = inputs[0];\n const key = inputs[1];\n const value = inputs[2];\n const pastKey = inputs[3];\n const pastValue = inputs[4];\n\n // Abbreviation and Meanings:\n // B: batch_size\n // S: sequence_length (input sequence length of query)\n // P: past_sequence_length (past sequence length of key or value)\n // L: kv_sequence_length (input sequence length of key or value)\n // M: max_sequence_length\n // T: total_sequence_length = past_sequence_length + kv_sequence_length\n // N: num_heads\n // H: head size for Q and K, aka q_head_size or k_head_size or qk_head_size\n // H_v: v_head_size\n // D_i: input hidden size\n // D: hidden size for Q and K (D = N * H), aka q_hidden_size or k_hidden_size or qk_hidden_size\n // D_v: v_hidden_size = num_heads * v_head_size\n\n // past_key : (B, N, S*, H)\n // past_value : (B, N, S*, H)\n // When no packing for q/k/v:\n // query (Q) : (B, S, D)\n // key (K) : (B, L, D) or (B, N, S*, H)\n // value (V) : (B, L, D_v) or (B, N, S*, H)\n // When packed kv is used:\n // query (Q) : (B, S, D)\n // key (K) : (B, L, N, 2, H)\n // value (V) : None\n // When packed qkv is used:\n // query (Q) : (B, L, N, 3, H) or (B, S, 3*D)\n // key (K) : None\n // value (V) : None\n\n if (query.dims.length !== 3 && query.dims.length !== 5) {\n throw new Error('Input query is expected to have 3 or 5 dimensions');\n }\n\n const dmmhaPacking = false;\n const batchSize = query.dims[0];\n const sequenceLength = query.dims[1];\n const hiddenSize = query.dims.length === 3 ? (dmmhaPacking ? query.dims[2] / 3 : query.dims[2]) :\n attributes.numHeads * query.dims[4];\n let kvSequenceLength = sequenceLength;\n\n let pastSequenceLength = 0;\n let maxSequenceLength = 0;\n const headSize = Math.floor(hiddenSize / attributes.numHeads);\n const hasPastKey = pastKey && pastKey.dims.length !== 0;\n const hasPastValue = pastValue && pastValue.dims.length !== 0;\n // TODO : this should be from attributes.\n const isPastkvBSNH = true;\n if (hasPastKey && hasPastValue) {\n if (pastKey.dims.length !== 4) {\n throw new Error('Input \"past_key\" is expected to have 4 dimensions');\n }\n if (pastValue.dims.length !== 4) {\n throw new Error('Input \"past_value\" is expected to have 4 dimensions');\n }\n if (isPastkvBSNH) {\n // For BSNH\n pastSequenceLength = pastKey.dims[1];\n maxSequenceLength = pastKey.dims[1];\n } else {\n // For BNSH\n pastSequenceLength = pastKey.dims[2];\n maxSequenceLength = pastKey.dims[2];\n }\n } else if (hasPastKey || hasPastValue) {\n throw new Error('Input \"past_key\" and \"past_value\" shall be both present or both absent');\n }\n\n let qkvFormat: AttentionQkvFormat;\n if (key) {\n if (query.dims.length !== 3) {\n throw new Error('Input \"query\" is expected to have 3 dimensions when key is given');\n }\n if (key.dims.length < 3 || key.dims.length > 5) {\n throw new Error('Input \"key\" is expected to have 3, 4, or 5 dimensions');\n }\n if (query.dims[0] !== key.dims[0]) {\n throw new Error('Input \"query\" and \"key\" shall have same dim 0 (batch size)');\n }\n\n if (key.dims.length === 3) {\n if (query.dims[2] % key.dims[2] !== 0) {\n throw new Error('Dimension 2 of \"query\" should be a multiple of \"key\"');\n }\n qkvFormat = AttentionQkvFormat.qkvBSNH;\n kvSequenceLength = key.dims[1];\n } else if (key.dims.length === 5) {\n if (key.dims[2] !== attributes.numHeads || key.dims[3] !== 2 || key.dims[4] !== headSize) {\n throw new Error('Expect \"key\" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');\n }\n if (value) {\n throw new Error('Expect \"value\" be none when \"key\" has packed kv format.');\n }\n qkvFormat = AttentionQkvFormat.qKvBSNHxBSN2H;\n kvSequenceLength = key.dims[1];\n } else { // key_dims.size() == 4 (cross-attention with past_key)\n if (key.dims[1] !== attributes.numHeads || key.dims[3] !== headSize) {\n throw new Error('Expect \"key\" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');\n }\n\n qkvFormat = AttentionQkvFormat.unknown;\n kvSequenceLength = key.dims[2];\n }\n } else { // packed QKV\n if (query.dims.length !== 3 && query.dims.length !== 5) {\n throw new Error('Input \"query\" is expected to have 3 or 5 dimensions when key is empty');\n }\n if (query.dims.length === 5 && (query.dims[2] !== attributes.numHeads || query.dims[3] !== 3)) {\n throw new Error('Expect \"query\" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');\n }\n\n qkvFormat = AttentionQkvFormat.qkvBSN3H;\n }\n\n const maskType: AttentionMaskType = AttentionMaskType.none;\n let passPastInKv = false;\n let vHiddenSize = hiddenSize;\n if (value) {\n if (value.dims.length !== 3 && value.dims.length !== 4) {\n throw new Error('Input \"value\" is expected to have 3 or 4 dimensions');\n }\n\n if (query.dims[0] !== value.dims[0]) {\n throw new Error('Input \"query\" and \"value\" shall have same dim 0 (batch_size)');\n }\n\n if (value.dims.length === 3) {\n if (kvSequenceLength !== value.dims[1]) {\n throw new Error('Input \"key\" and \"value\" shall have the same dim 1 (kv_sequence_length)');\n }\n vHiddenSize = value.dims[2];\n } else {\n if (kvSequenceLength !== value.dims[2]) {\n throw new Error('Input \"past_key\" and \"past_value\" shall have the same dim 2 (kv_sequence_length)');\n }\n vHiddenSize = value.dims[1] * value.dims[3];\n passPastInKv = true;\n }\n }\n const totalSequenceLength = pastSequenceLength + kvSequenceLength;\n const broadcastResPosBias = false;\n\n return {\n batchSize,\n sequenceLength,\n pastSequenceLength,\n kvSequenceLength,\n totalSequenceLength,\n maxSequenceLength,\n inputHiddenSize: 0,\n hiddenSize,\n vHiddenSize,\n headSize,\n vHeadSize: Math.floor(vHiddenSize / attributes.kvNumHeads!),\n numHeads: attributes.numHeads,\n kvNumHeads: attributes.kvNumHeads,\n nReps: attributes.numHeads / attributes.kvNumHeads!,\n pastPresentShareBuffer: false,\n maskType,\n scale: attributes.scale,\n broadcastResPosBias,\n passPastInKv,\n qkvFormat,\n isPastkvBSNH,\n };\n};\n\nconst createConcatProgramInfo =\n (a: TensorView, b: TensorView|undefined, dataType: DataType, params: AttentionParameters): ProgramInfo => {\n const outputShape = [params.batchSize, params.totalSequenceLength, params.kvNumHeads!, params.headSize];\n const component = 4;\n const outputSize = ShapeUtil.size(outputShape) / component;\n const presentSequenceLength = params.totalSequenceLength;\n const output = outputVariable('present_kv', dataType, outputShape.length, component);\n const inputA = inputVariable('new_kv', a.dataType, a.dims.length, component);\n const inputB = b ? inputVariable('past_kv', b.dataType, b.dims.length, component) : undefined;\n\n const H = Math.ceil(params.headSize / component);\n const dispatch = {x: presentSequenceLength, y: a.dims[0], z: 1};\n\n const inputDependencies: ProgramInputTensorInfoDependency[] = b ? ['rank', 'rank'] : ['rank'];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: params.pastSequenceLength},\n {type: DataType.uint32, data: params.kvSequenceLength},\n {type: DataType.uint32, data: params.totalSequenceLength}\n ];\n\n const inputs = [inputA];\n if (inputB) {\n programUniforms.push(\n ...createTensorShapeVariables(a.dims), ...createTensorShapeVariables(b!.dims),\n ...createTensorShapeVariables(outputShape));\n inputs.push(inputB);\n } else {\n programUniforms.push(...createTensorShapeVariables(a.dims), ...createTensorShapeVariables(outputShape));\n }\n const uniforms: UniformsArrayType = [\n {name: 'output_size', type: 'u32'}, {name: 'past_seqlen', type: 'u32'}, {name: 'new_seqlen', type: 'u32'},\n {name: 'present_seqlen', type: 'u32'}\n ];\n\n const pastStr = ` let past_batch_stride = uniforms.past_seqlen * num_heads * H;\n var past_head_stride = uniforms.past_seqlen * H;\n if (is_bsnh) {\n past_head_stride = H;\n }\n let in_offset = b * past_batch_stride + s * row_stride + n * past_head_stride + h;\n present_kv[out_offset] = past_kv[in_offset];`;\n const newStr = ` let new_batch_stride = uniforms.new_seqlen * num_heads * H;\n let new_row_stride = num_heads * H;\n let new_head_stride = H;\n let in_offset = b * new_batch_stride + (s - past_seqlen) * new_row_stride + n * new_head_stride + h;\n present_kv[out_offset] = new_kv[in_offset];`;\n const concatStr = b ? `if (s < past_seqlen) {\n ${pastStr}\n } else if (s < past_seqlen + uniforms.new_seqlen) {\n ${newStr}\n }` :\n `if (s < past_seqlen + uniforms.new_seqlen) {\n ${newStr}\n }`;\n\n // TODO: handle H * params.kvNumHeads greater than maxComputeInvocationsPerWorkgroup limit.\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputs, output)}\n ${shaderHelper.mainStart([\n H, params.kvNumHeads!, 1\n ])}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n var indices = ${output.offsetToIndices('global_idx')};\n let h = local_id.x;\n let n = local_id.y;\n let s = workgroup_id.x;\n let b = workgroup_id.y;\n let num_heads = ${params.kvNumHeads!}u;\n let H = ${H}u;\n\n let present_seqlen = uniforms.present_seqlen;\n let present_batch_stride = present_seqlen * num_heads * H;\n var row_stride = H;\n let is_bsnh = ${params.isPastkvBSNH};\n\n if (is_bsnh) {\n row_stride = num_heads * H;\n }\n var present_head_stride = present_seqlen * H;\n if (is_bsnh) {\n present_head_stride = H;\n }\n\n let past_seqlen = uniforms.past_seqlen;\n\n let out_offset = b * present_batch_stride + s * row_stride + n * present_head_stride + h;\n ${concatStr}\n }`;\n\n return {\n name: 'ConcatPastNew',\n shaderCache: {hint: `${params.kvNumHeads!}${H}${!!b}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType}],\n dispatchGroup: dispatch,\n programUniforms,\n }),\n getShaderSource,\n };\n };\n\nexport const parseGroupQueryAttentionAttributes = (attributes: AttentionAttrs): AttentionAttrs =>\n createAttributeWithCacheKey({...attributes});\n\nconst weightTransposeAttribute: TransposeAttributes = createAttributeWithCacheKey({perm: [0, 2, 1, 3]});\n\nconst maybeExpandAndTransposeToBNSH =\n (context: ComputeContext, input: TensorView, pastKV: TensorView|undefined, params: AttentionParameters,\n outputIndex: number) => {\n let reshapedInput = input;\n const numHeads = params.kvNumHeads!;\n const nReps = params.nReps!;\n if (input.dims.length === 3 && params.kvSequenceLength !== 0) {\n reshapedInput = input.reshape([params.batchSize, params.kvSequenceLength, numHeads, params.headSize]);\n }\n\n if (pastKV) {\n reshapedInput = context.compute(\n createConcatProgramInfo(reshapedInput, pastKV, reshapedInput.dataType, params),\n {inputs: [reshapedInput, pastKV], outputs: [params.isPastkvBSNH ? outputIndex : -1]})[0];\n } else {\n reshapedInput = context.compute(\n createConcatProgramInfo(reshapedInput, undefined, reshapedInput.dataType, params),\n {inputs: [reshapedInput], outputs: [params.isPastkvBSNH ? outputIndex : -1]})[0];\n }\n if (nReps !== 1) {\n reshapedInput = context.compute(\n createTileProgramInfo([reshapedInput], [1, 1, 1, nReps]), {inputs: [reshapedInput], outputs: [-1]})[0];\n reshapedInput =\n reshapedInput.reshape([params.batchSize, params.totalSequenceLength, numHeads * nReps, params.headSize]);\n }\n\n return context.compute(\n createTransposeProgramInfo(reshapedInput, weightTransposeAttribute.perm),\n {inputs: [reshapedInput], outputs: [-1]})[0];\n };\n\nexport const groupQueryAttention = (context: ComputeContext, attributes: AttentionAttrs): void => {\n const params = validateInputs(context.inputs, attributes);\n if (context.inputs[0].dims.length === 5) {\n throw new Error('Packed QKV is not implemented');\n }\n\n if (context.inputs[1]?.dims.length === 5) {\n throw new Error('Packed KV is not implemented');\n }\n\n const Q = maybeTransposeToBNSHAndAddBias(\n context, params.batchSize, params.numHeads, params.sequenceLength, params.headSize, context.inputs[0], undefined,\n 0);\n const pastKey = context.inputs[3] && context.inputs[3].dims.length !== 0 ? context.inputs[3] : undefined;\n const pastValue = context.inputs[4] && context.inputs[4].dims.length !== 0 ? context.inputs[4] : undefined;\n const K = maybeExpandAndTransposeToBNSH(context, context.inputs[1], pastKey, params, 1);\n const V = maybeExpandAndTransposeToBNSH(context, context.inputs[2], pastValue, params, 2);\n applyAttention(context, Q, K, V, undefined, undefined, undefined, undefined, undefined, params, attributes);\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, fillVector, getMaxComponents, inputVariable, outputVariable, ShaderHelper, sumVector, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\n\nexport interface InstanceNormAttributes {\n epsilon: number;\n format: 'NHWC'|'NCHW';\n}\n\nconst createInstanceNormProgramInfo =\n (inputs: readonly TensorView[], attributes: InstanceNormAttributes): ProgramInfo => {\n const xShape = inputs[0].dims;\n const outputShape = xShape;\n const axis = 2;\n const normCount = ShapeUtil.sizeToDimension(xShape, axis);\n const normSize = ShapeUtil.sizeFromDimension(xShape, axis);\n const components = getMaxComponents(normSize);\n const normPackedSize = normSize / components;\n const inputShape = [xShape[0], xShape[1], normPackedSize];\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank', 'type', 'type'];\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: normSize}, {type: DataType.uint32, data: normPackedSize}];\n programUniforms.push(...createTensorShapeVariables(inputShape, inputShape));\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const x = inputVariable('x', inputs[0].dataType, inputShape.length, components);\n const scale = inputVariable('scale', inputs[1].dataType, inputs[1].dims);\n const bias = inputVariable('bias', inputs[2].dataType, inputs[2].dims);\n const output = outputVariable('output', inputs[0].dataType, inputShape.length, components);\n const variables = [x, scale, bias, output];\n const dataType = x.type.value;\n const f32Type = components === 1 ? 'f32' : `vec${components}`;\n const workgroupSize = 64;\n\n const uniforms: UniformsArrayType = [{name: 'normSize', type: 'u32'}, {name: 'normPackedSize', type: 'u32'}];\n return `\n var meanShared : f32;\n var squaredNormShared : f32;\n var workgroupShared : array<${f32Type}, ${workgroupSize}>;\n const workgroupSize = ${workgroupSize}u;\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...variables)}\n ${shaderHelper.mainStart(workgroupSize)}\n let norm = global_idx / workgroupSize;\n let batch = norm / uniforms.x_shape[1];\n let channel = norm % uniforms.x_shape[1];\n let localIndex = local_id.x;\n\n // initialize workgroup memory\n var initial = ${f32Type}(0);\n for (var h = localIndex; h < uniforms.normPackedSize; h += workgroupSize) {\n initial = initial + ${f32Type}(${x.get('batch', 'channel', 'h')});\n }\n workgroupShared[localIndex] = initial;\n workgroupBarrier();\n\n // Calculate the mean of current channel data.\n for (var currSize = workgroupSize >> 1; currSize > 0; currSize = currSize >> 1) {\n if (localIndex < currSize) {\n workgroupShared[localIndex] = workgroupShared[localIndex] + workgroupShared[localIndex + currSize];\n }\n workgroupBarrier();\n }\n if (localIndex == 0) {\n meanShared = ${sumVector('workgroupShared[0]', components)} / f32(uniforms.normSize);\n }\n workgroupBarrier();\n\n // reinitialize workgroup memory.\n initial = ${f32Type}(0);\n for (var h = localIndex; h < uniforms.normPackedSize; h += workgroupSize) {\n let deviation = ${f32Type}(${x.get('batch', 'channel', 'h')}) - ${f32Type}(meanShared);\n initial = initial + deviation * deviation;\n }\n workgroupShared[localIndex] = initial;\n workgroupBarrier();\n\n // Calculate the sum of square of deviation of current channel data.\n for (var currSize = workgroupSize >> 1; currSize > 0; currSize = currSize >> 1) {\n if (localIndex < currSize) {\n workgroupShared[localIndex] = workgroupShared[localIndex] + workgroupShared[localIndex + currSize];\n }\n workgroupBarrier();\n }\n if (localIndex == 0) {\n squaredNormShared = ${sumVector('workgroupShared[0]', components)};\n }\n workgroupBarrier();\n\n let invStdDev = inverseSqrt(squaredNormShared / f32(uniforms.normSize) + f32(${attributes.epsilon}));\n let channelScale = invStdDev * f32(${scale.getByOffset('channel')});\n let channelShift = f32(${bias.getByOffset('channel')}) - meanShared * channelScale;\n for (var h = localIndex; h < uniforms.normPackedSize; h += workgroupSize) {\n let value = ${x.get('batch', 'channel', 'h')} * ${dataType}(${f32Type}(channelScale)) + ${dataType}(${\n f32Type}(channelShift));\n ${output.set('batch', 'channel', 'h', 'value')};\n }\n }`;\n };\n return {\n ...{name: 'InstanceNormalization'},\n // TODO: use epsilon as uniform. Currently epsilon as uniform fails test_instancenorm_epsilon.\n shaderCache: {hint: `${attributes.epsilon};${components}`, inputDependencies},\n getRunData: () => ({\n outputs: [\n {dims: outputShape, dataType: inputs[0].dataType},\n ],\n dispatchGroup: {x: normCount},\n programUniforms\n }),\n getShaderSource,\n };\n };\n\nconst computeMean =\n (context: ComputeContext, input: TensorView, scale: TensorView, bias: TensorView, n: number, h: number, c: number,\n epsilon: number) => {\n const components = getMaxComponents(c);\n const WG = 64;\n // we will store channel scale and channel shift in [2, components] matrix\n // or in vec2 when components == 1\n const outputType = components === 1 ? 'vec2f' : `mat2x${components}f`;\n const sumCastType = components === 1 ? 'f32' : `vec${components}f`;\n const setOutputValue = (var1: string, var2: string) => `${outputType}(${var1}, ${var2})`;\n const unitsOfWork = n * c / components;\n const wgSize = Math.ceil(h / WG);\n\n const meanInputDependencies: ProgramInputTensorInfoDependency[] = ['type'];\n const meanProgramUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: wgSize}, {type: DataType.uint32, data: h},\n {type: DataType.uint32, data: Math.floor(c / components)},\n {type: DataType.uint32, data: Math.floor(h * c / components)}\n ];\n\n const getMeanShaderSource = (shaderHelper: ShaderHelper) => {\n const inputHelper = inputVariable('input', input.dataType, input.dims, components);\n return `\n ${shaderHelper.declareVariables(inputHelper)}\n @group(0) @binding(1) var output : array<${outputType}>;\n struct Uniforms {wg_size:u32, H:u32, C:u32, image_size:u32};\n @group(0) @binding(2) var uniforms: Uniforms;\n\n ${shaderHelper.mainStart(WG)}\n let currentImageNumber = global_idx / ${WG} / uniforms.C;\n let currentChannelNumber = (global_idx / ${WG}) % uniforms.C;\n let wgOffset = local_id.x * uniforms.wg_size;\n if (wgOffset >= uniforms.H) {\n return;\n }\n let wgMax = min(wgOffset + uniforms.wg_size, uniforms.H);\n\n let offset = currentImageNumber * uniforms.image_size + currentChannelNumber;\n var sum = ${fillVector('f32', components)};\n var squaredSum = ${fillVector('f32', components)};\n for (var i: u32 = wgOffset; i < wgMax; i++) {\n let value = ${sumCastType}(input[offset + i * uniforms.C]);\n sum += value;\n squaredSum += value * value;\n }\n output[global_idx] = ${setOutputValue('sum', 'squaredSum')};\n }`;\n };\n\n const meanValues = context.compute(\n {\n name: 'InstanceNormComputeMean',\n shaderCache: {hint: `${components}`, inputDependencies: meanInputDependencies},\n getRunData: () => ({\n outputs: [\n {dims: [n, c, WG, 2], dataType: DataType.float},\n ],\n dispatchGroup: {x: n * c / components},\n programUniforms: meanProgramUniforms\n }),\n getShaderSource: getMeanShaderSource,\n },\n {inputs: [input], outputs: [-1]})[0];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: unitsOfWork}, {type: DataType.uint32, data: h},\n {type: DataType.uint32, data: Math.floor(c / components)},\n {type: DataType.uint32, data: Math.floor(WG * c / components)}\n ];\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type', 'type'];\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const scaleHelper = inputVariable('scale', scale.dataType, scale.dims, components);\n const biasHelper = inputVariable('bias', bias.dataType, bias.dims, components);\n return `\n @group(0) @binding(0) var input : array<${outputType}>;\n @group(0) @binding(1) var scale : array<${scaleHelper.type.storage}>;\n @group(0) @binding(2) var bias : array<${biasHelper.type.storage}>;\n @group(0) @binding(3) var output : array<${outputType}>;\n struct Uniforms {units_of_work : u32, H: u32, C : u32, image_size : u32};\n @group(0) @binding(4) var uniforms: Uniforms;\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.units_of_work')}\n let currentImageNumber = global_idx / uniforms.C;\n let currentChannelNumber = global_idx % uniforms.C;\n\n let offset = currentImageNumber * uniforms.image_size;\n var sum = ${fillVector('f32', components)};\n var squaredSum = ${fillVector('f32', components)};\n for (var i: u32 = 0; i < min(${WG}, uniforms.H); i++) {\n let value = input[offset + i + currentChannelNumber * ${WG}];\n sum += value[0];\n squaredSum += value[1];\n }\n sum = sum / f32(uniforms.H);\n squaredSum = squaredSum / f32(uniforms.H);\n let invStdDev = inverseSqrt(squaredSum - sum * sum + f32(${epsilon}));\n let channelScale = invStdDev * ${sumCastType}(scale[currentChannelNumber]);\n let channelShift = ${sumCastType}(bias[currentChannelNumber]) - sum * channelScale;\n\n output[global_idx] = ${setOutputValue('channelScale', 'channelShift')};\n }`;\n };\n return context.compute(\n {\n name: 'InstanceNormComputeChannelScaleShift',\n // TODO: use epsilon as uniform. Currently epsilon as uniform fails test_instancenorm_epsilon.\n shaderCache: {hint: `${components};${epsilon}`, inputDependencies},\n getRunData: () => ({\n outputs: [\n {dims: [n, c, 2], dataType: DataType.float},\n ],\n dispatchGroup: {x: Math.ceil(unitsOfWork / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n },\n {inputs: [meanValues, scale, bias], outputs: [-1]})[0];\n };\n\nconst createInstanceNormNHWCProgramInfo =\n (context: ComputeContext, inputs: readonly TensorView[], attributes: InstanceNormAttributes) => {\n const xShape = inputs[0].dims;\n const outputShape = xShape;\n const N = xShape[0];\n const C = xShape[xShape.length - 1];\n const H = ShapeUtil.sizeFromDimension(xShape, 1) / C;\n const components = getMaxComponents(C);\n const outputSize = ShapeUtil.size(outputShape) / components;\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: H}, {type: DataType.uint32, data: Math.floor(C / components)}];\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type'];\n // first compute mean\n const channelScaleShift = computeMean(context, inputs[0], inputs[1], inputs[2], N, H, C, attributes.epsilon);\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n const scaleType = components === 1 ? 'vec2f' : `mat2x${components}f`;\n const scaleCastType = components === 1 ? dataType : `vec${components}<${dataType}>`;\n\n const inputHelper = inputVariable('input', inputs[0].dataType, inputs[0].dims, components);\n const outputHelper = outputVariable('output', inputs[0].dataType, outputShape, components);\n\n return `\n @group(0) @binding(0) var input : array<${inputHelper.type.storage}>;\n @group(0) @binding(1) var scaleInput : array<${scaleType}>;\n @group(0) @binding(2) var output : array<${outputHelper.type.storage}>;\n struct Uniforms {H: u32, C : u32};\n @group(0) @binding(3) var uniforms: Uniforms;\n\n ${shaderHelper.mainStart()}\n let currentImageNumber = global_idx / (uniforms.C * uniforms.H);\n let currentChannelNumber = global_idx % uniforms.C;\n\n let scaleOffset = currentImageNumber * uniforms.C + currentChannelNumber;\n let scale = scaleInput[scaleOffset];\n output[global_idx] = fma(input[global_idx], ${scaleCastType}(scale[0]), ${scaleCastType}(scale[1]));\n }`;\n };\n context.compute(\n {\n name: 'InstanceNormalizationNHWC',\n shaderCache: {hint: `${components}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n },\n {inputs: [inputs[0], channelScaleShift]});\n };\n\nexport const instanceNorm = (context: ComputeContext, attributes: InstanceNormAttributes): void => {\n if (attributes.format === 'NHWC') {\n createInstanceNormNHWCProgramInfo(context, context.inputs, attributes);\n } else {\n context.compute(createInstanceNormProgramInfo(context.inputs, attributes));\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {castToF32, fillVector, getMaxComponents, inputVariable, outputVariable, ShaderHelper, sumVector, tensorTypeToWsglStorageType, UniformsArrayType,} from './common';\n\ninterface LayerNormAttributes {\n simplified: boolean;\n axis: number;\n epsilon: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length < 2) {\n throw new Error('layerNorm requires at least 2 inputs.');\n }\n};\n\nconst createLayerNormProgramInfo =\n (inputs: readonly TensorView[], attributes: LayerNormAttributes, outputCount: number): ProgramInfo => {\n const simplified = attributes.simplified;\n\n const xShape = inputs[0].dims;\n const scale = inputs[1];\n const bias = !simplified && inputs[2];\n\n const outputShape = xShape;\n const axis = ShapeUtil.normalizeAxis(attributes.axis, xShape.length);\n const normCount = ShapeUtil.sizeToDimension(xShape, axis);\n const normSize = ShapeUtil.sizeFromDimension(xShape, axis);\n\n const scaleSize = ShapeUtil.size(scale.dims);\n const biasSize = bias ? ShapeUtil.size(bias.dims) : 0;\n if (scaleSize !== normSize || (bias && biasSize !== normSize)) {\n throw new Error(`Size of X.shape()[axis:] == ${normSize}.\n Size of scale and bias (if provided) must match this.\n Got scale size of ${scaleSize} and bias size of ${biasSize}`);\n }\n\n const meanInvStdDevDim: number[] = [];\n for (let i = 0; i < xShape.length; ++i) {\n if (i < axis) {\n meanInvStdDevDim.push(xShape[i]);\n } else {\n meanInvStdDevDim.push(1);\n }\n }\n const components = getMaxComponents(normSize);\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['type', 'type'];\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: normCount}, {type: DataType.float, data: normSize},\n {type: DataType.uint32, data: Math.floor(normSize / components)},\n {type: DataType.float, data: attributes.epsilon}\n ];\n if (bias) {\n inputDependencies.push('type');\n }\n const hasMeanDataOutput = outputCount > 1;\n const hasInvStdOutput = outputCount > 2;\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n const variables = [\n inputVariable('x', inputs[0].dataType, inputs[0].dims, components),\n inputVariable('scale', scale.dataType, scale.dims, components),\n ];\n if (bias) {\n variables.push(inputVariable('bias', bias.dataType, bias.dims, components));\n }\n variables.push(outputVariable('output', inputs[0].dataType, outputShape, components));\n if (hasMeanDataOutput) {\n variables.push(outputVariable('mean_data_output', DataType.float, meanInvStdDevDim));\n }\n if (hasInvStdOutput) {\n variables.push(outputVariable('inv_std_output', DataType.float, meanInvStdDevDim));\n }\n\n const uniforms: UniformsArrayType = [\n {name: 'norm_count', type: 'u32'}, {name: 'norm_size', type: 'f32'},\n {name: 'norm_size_vectorized', type: 'u32'}, {name: 'epsilon', type: 'f32'}\n ];\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...variables)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.norm_count')}\n let offset = global_idx * uniforms.norm_size_vectorized;\n var mean_vector = ${fillVector('f32', components)};\n var mean_square_vector = ${fillVector('f32', components)};\n\n for (var h: u32 = 0u; h < uniforms.norm_size_vectorized; h++) {\n let value = ${castToF32(dataType, components, 'x[h + offset]')};\n mean_vector += value;\n mean_square_vector += value * value;\n }\n let mean = ${sumVector('mean_vector', components)} / uniforms.norm_size;\n let inv_std_dev = inverseSqrt(${sumVector('mean_square_vector', components)} / uniforms.norm_size ${\n simplified ? '' : '- mean * mean'} + uniforms.epsilon);\n\n for (var j: u32 = 0; j < uniforms.norm_size_vectorized; j++) {\n let f32input = ${castToF32(dataType, components, 'x[j + offset]')};\n let f32scale = ${castToF32(dataType, components, 'scale[j]')};\n output[j + offset] = ${variables[0].type.value}((f32input ${simplified ? '' : '- mean'}) * inv_std_dev * f32scale\n ${bias ? `+ ${castToF32(dataType, components, 'bias[j]')}` : ''}\n );\n }\n\n ${hasMeanDataOutput ? 'mean_data_output[global_idx] = mean' : ''};\n ${hasInvStdOutput ? 'inv_std_output[global_idx] = inv_std_dev' : ''};\n }`;\n };\n const outputs = [{dims: outputShape, dataType: inputs[0].dataType}];\n if (hasMeanDataOutput) {\n outputs.push({dims: meanInvStdDevDim, dataType: DataType.float});\n }\n if (hasInvStdOutput) {\n outputs.push({dims: meanInvStdDevDim, dataType: DataType.float});\n }\n\n return {\n name: 'LayerNormalization',\n shaderCache: {hint: `${components};${outputCount};${simplified}`, inputDependencies},\n getRunData: () =>\n ({outputs, dispatchGroup: {x: Math.ceil(normCount / 64 /* workgroup size */)}, programUniforms}),\n getShaderSource,\n };\n };\n\nexport const layerNorm = (context: ComputeContext, attributes: LayerNormAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createLayerNormProgramInfo(context.inputs, attributes, context.outputCount));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType, getTensorElementSize} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, getMaxComponents, inputVariable, outputVariable, ShaderHelper, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\n\n// TODO support quantization bits not equal to 4\nexport interface MatMulNBitsAttributes extends AttributeWithCacheKey {\n k: number;\n n: number;\n accuracyLevel: number;\n bits: number;\n blockSize: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: MatMulNBitsAttributes): void => {\n if (inputs.length < 3 || inputs.length > 4) {\n throw new Error('MatMulNBits requires 3 or 4 inputs');\n }\n const a = inputs[0];\n const aRank = a.dims.length;\n if (a.dims[aRank - 1] !== attributes.k) {\n throw new Error('The last dim of input shape does not match the k value');\n }\n const nBlocksPerCol = Math.floor((attributes.k + attributes.blockSize - 1) / attributes.blockSize);\n const blobSize = attributes.blockSize / 8 * attributes.bits;\n const b = inputs[1];\n if (!ShapeUtil.areEqual(b.dims, [attributes.n, nBlocksPerCol, blobSize])) {\n throw new Error('The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize');\n }\n const scales = inputs[2];\n const scalesShape = scales.dims;\n if (ShapeUtil.size(scalesShape) !== attributes.n * nBlocksPerCol) {\n throw new Error('scales input size error.');\n }\n if (inputs.length === 4) {\n const zeroPoints = inputs[3];\n const zeroPointsShape = zeroPoints.dims;\n const expectedZeroPointsSize =\n attributes.bits > 4 ? (attributes.n * nBlocksPerCol) : attributes.n * Math.floor((nBlocksPerCol + 1) / 2);\n if (ShapeUtil.size(zeroPointsShape) !== expectedZeroPointsSize) {\n throw new Error('zeroPoints input size error.');\n }\n }\n};\n\nexport const createMatMulNBitsProgramInfo =\n (inputs: readonly TensorView[], attributes: MatMulNBitsAttributes,\n maxComputeWorkgroupSizes: [number, number, number], maxComputeWorkgroupStorageSize: number): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const aRank = inputShape.length;\n const nBlocksPerCol = Math.floor((attributes.k + attributes.blockSize - 1) / attributes.blockSize);\n const dimAOuter = inputShape[aRank - 2];\n const dimInner = attributes.k;\n const dimBOuter = attributes.n;\n const batchDims = inputShape.slice(0, aRank - 2);\n const batchSize = ShapeUtil.size(batchDims);\n const blobSize = attributes.blockSize / 8 * attributes.bits;\n const blobSizeInWords = blobSize / 4;\n const dataType = inputs[0].dataType;\n const outputNumber = getMaxComponents(dimAOuter);\n const aComponents = getMaxComponents(attributes.k);\n const bComponents = getMaxComponents(blobSizeInWords);\n const elementSize = getTensorElementSize(dataType)!;\n const workgroupOutputSize = dimAOuter * nBlocksPerCol * elementSize;\n const maxNumberOfComponents = Math.floor(maxComputeWorkgroupStorageSize / workgroupOutputSize);\n const useBlockwiseMatMulNBits = nBlocksPerCol <= maxComputeWorkgroupSizes[0] && maxNumberOfComponents > 0;\n const components = (!useBlockwiseMatMulNBits || maxNumberOfComponents >= 4) ? getMaxComponents(dimBOuter) :\n ((maxNumberOfComponents >= 2) && getMaxComponents(dimBOuter) >= 2) ? 2 :\n 1;\n const outputShape = batchDims.concat([dimAOuter, dimBOuter]);\n const outputSize = ShapeUtil.size(outputShape) / components / outputNumber;\n\n const programUniforms: ProgramUniform[] = useBlockwiseMatMulNBits ?\n [] :\n [{type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: attributes.blockSize}];\n const inputShapeTemp = [batchSize, dimAOuter, dimInner / aComponents];\n const bShape = ShapeUtil.convertShape(inputs[1].dims).slice();\n bShape.splice(-1, 1, blobSizeInWords / bComponents);\n programUniforms.push(...createTensorShapeVariables(inputShapeTemp));\n programUniforms.push(...createTensorShapeVariables(bShape));\n programUniforms.push(...createTensorShapeVariables(inputs[2].dims));\n if (inputs.length === 4) {\n programUniforms.push(...createTensorShapeVariables(ShapeUtil.convertShape(inputs[3].dims)));\n }\n const outputShapeTemp = [batchSize, dimAOuter, dimBOuter / components];\n programUniforms.push(...createTensorShapeVariables(outputShapeTemp));\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const inputRank = inputShapeTemp.length;\n const a = inputVariable('a', inputs[0].dataType, inputRank, aComponents);\n const b = inputVariable('b', DataType.uint32, bShape.length, bComponents);\n const scales = inputVariable('scales', inputs[2].dataType, inputs[2].dims.length);\n const inputVariables = [a, b, scales];\n const zeroPoints =\n inputs.length === 4 ? inputVariable('zero_points', DataType.uint32, inputs[3].dims.length) : undefined;\n if (zeroPoints) {\n inputVariables.push(zeroPoints);\n }\n const outputRank = outputShapeTemp.length;\n const output = outputVariable('output', inputs[0].dataType, outputRank, components);\n const uniforms: UniformsArrayType = [{name: 'output_size', type: 'u32'}, {name: 'block_size', type: 'u32'}];\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n\n const qDqDataType = (() => {\n switch (aComponents) {\n case 1:\n return `array<${dataType}, 8>`;\n case 2:\n return `mat4x2<${dataType}>`;\n case 4:\n return `mat2x4<${dataType}>`;\n default:\n throw new Error(`${aComponents}-component is not supported.`);\n }\n })();\n\n const processOneBlock = `\n for (var word: u32 = 0; word < ${blobSizeInWords}; word += ${bComponents}) {\n ${b.indicesSet('b_indices', '2', 'word')};\n let b_data = ${b.getByIndices('b_indices')};\n for (var i: u32 = 0; i < ${bComponents}; i++) {\n let b_value: u32 = ${bComponents === 1 ? 'b_data' : 'b_data[word + i]'};\n let b_mask: u32 = 0x0F0F0F0Fu;\n let b_value_lower: vec4 = unpack4xU8(b_value & b_mask);\n let b_value_upper: vec4 = unpack4xU8((b_value >> 4) & b_mask);\n let b_quantized_values = ${qDqDataType}(${\n Array.from({length: 4}, (_, i) => `${dataType}(b_value_lower[${i}]), ${dataType}(b_value_upper[${i}])`)\n .join(', ')});\n let b_dequantized_values = ${(() => {\n if (aComponents === 1) {\n return `${qDqDataType}(${\n Array.from({length: 8}, (_, i) => `(b_quantized_values[${i}] - zero_point) * scale`).join(', ')});`;\n } else {\n return `(b_quantized_values - ${qDqDataType}(${Array(8).fill('zero_point').join(',')})) * scale;`;\n }\n })()};\n // Number of B elements per 32-bit word is 32/bits = 32/4 = 8\n for (var m: u32 = 0; m < ${useBlockwiseMatMulNBits ? dimAOuter : outputNumber}u; m++) {\n ${a.indicesSet('a_indices', inputRank - 2, useBlockwiseMatMulNBits ? 'm' : `row * ${outputNumber} + m`)};\n ${a.indicesSet('a_indices', inputRank - 1, 'word_offset')};\n var input_offset = ${a.indicesToOffset('a_indices')};\n var a_data: ${qDqDataType};\n for (var j: u32 = 0; j < ${8 / aComponents}; j++) {\n a_data[j] = ${a.getByOffset('input_offset')};\n input_offset++;\n }\n ${useBlockwiseMatMulNBits ? 'workgroup_shared[workgroup_shared_offset + m]' : 'output_values[m]'}${\n components > 1 ? '[c]' : ''} += ${\n Array\n .from(\n {length: 8 / aComponents},\n (_, i) => `${\n aComponents === 1 ? `a_data[${i}] * b_dequantized_values[${i}]` :\n `dot(a_data[${i}], b_dequantized_values[${i}])`}`)\n .join(' + ')};\n }\n word_offset += ${8 / aComponents};\n }\n }`;\n const updateZeroPointIndex = zeroPoints ? `\n zero_point_offset += 4;\n if (zero_point_offset == 32) {\n zero_point_offset = 0;\n zero_point_index++;\n zero_point_word = ${zeroPoints.getByOffset('zero_point_index')};\n }` :\n '';\n\n return useBlockwiseMatMulNBits ? `\n var workgroup_shared: array<${output.type.value}, ${dimAOuter * nBlocksPerCol}>;\n ${shaderHelper.declareVariables(...inputVariables, output)}\n ${shaderHelper.mainStart([\n nBlocksPerCol, 1, 1\n ])}\n var a_indices: ${a.type.indices};\n var block = local_id.x;\n var col = workgroup_id.y;\n var batch = workgroup_id.z;\n ${a.indicesSet('a_indices', '0', 'batch')};\n // Two zero points are packed into one byte when uniforms.bits is 4.\n for (var c: u32 = 0; c < ${components}; c++) {\n let col_times_components_plus_c = col * ${components} + c;\n ${\n zeroPoints ? `\n var zero_point_bytes_per_col: u32 = (${nBlocksPerCol} + 1) / 2;\n var zero_point_byte_count: u32 = col_times_components_plus_c * zero_point_bytes_per_col + (block >> 0x1u);\n var zero_point_word_index: u32 = zero_point_byte_count >> 0x2u;\n var zero_point_byte_offset: u32 = zero_point_byte_count & 0x3u;\n var zero_point_nibble_offset: u32 = block & 0x1u;\n var zero_point_bits_offset: u32 = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2);\n var zero_point_word: u32 = ${zeroPoints.getByOffset('zero_point_word_index')} >> zero_point_bits_offset;` :\n ''}\n var b_indices: ${b.type.indices};\n ${b.indicesSet('b_indices', '0', 'col_times_components_plus_c')};\n // The scale and zero points are computed per block.\n var scales_index = col_times_components_plus_c * ${nBlocksPerCol} + block;\n let scale = ${scales.getByOffset('scales_index')};\n // The default zero point is 8 for unsigned 4-bit quantization.\n let zero_point = ${dataType}(${zeroPoints ? '(zero_point_word) & 0xFu' : 8.0});\n ${b.indicesSet('b_indices', '1', 'block')};\n var word_offset: u32 = block * ${attributes.blockSize / aComponents};\n var workgroup_shared_offset: u32 = block * ${dimAOuter};\n ${processOneBlock}\n }\n workgroupBarrier();\n var output_indices: ${output.type.indices};\n var elements_per_thread: u32 = ${Math.ceil(dimAOuter / nBlocksPerCol)};\n ${output.indicesSet('output_indices', '0', 'batch')};\n ${output.indicesSet('output_indices', outputRank - 1, 'col')};\n ${output.indicesSet('output_indices', outputRank - 2, 'local_id.x * elements_per_thread')};\n var output_offset = ${output.indicesToOffset('output_indices')};\n for (var m: u32 = 0u; m < elements_per_thread; m++) {\n var row = m + local_id.x * elements_per_thread;\n if (row < ${dimAOuter}) {\n var output_value: ${output.type.value} = ${output.type.value}(0);\n var workgroup_shared_offset: u32 = row;\n for (var b: u32 = 0u; b < ${nBlocksPerCol}u; b++) {\n output_value += workgroup_shared[workgroup_shared_offset];\n workgroup_shared_offset += ${dimAOuter};\n }\n ${output.setByOffset('output_offset', 'output_value')};\n output_offset += ${dimBOuter / components};\n }\n }\n }` :\n `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(...inputVariables, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n var output_values: array<${output.type.value}, ${outputNumber}>;\n var output_indices = ${output.offsetToIndices('global_idx')};\n var col = ${output.indicesGet('output_indices', outputRank - 1)};\n var row = ${output.indicesGet('output_indices', outputRank - 2)};\n var a_indices: ${a.type.indices} = output_indices;\n // Two zero points are packed into one byte because uniforms.bits <= 4.\n // zero_point_offset is either 0 or 4. It is bit offset within one byte.\n // TODO support zero_point_offset for bits > 4\n ${\n zeroPoints ? `\n var zero_point_abs_offset = col * ${components} * ((${nBlocksPerCol} + 1) / 2);\n var zero_point_index: u32 = zero_point_abs_offset / 4;\n var zero_point_word: u32 = ${zeroPoints.getByOffset('zero_point_index')};\n var zero_point_offset: u32 = (zero_point_abs_offset % 4) * 8;` :\n ''}\n var scale_index = col * ${nBlocksPerCol * components};\n var b_indices: ${b.type.indices};\n for (var c: u32 = 0; c < ${components}; c++) {\n ${b.indicesSet('b_indices', '0', `col * ${components} + c`)};\n var block_offset: u32 = 0;\n for (var block: u32 = 0; block < ${nBlocksPerCol}; block++) {\n // The scale and zero points are computed per block.\n let scale = ${scales.getByOffset('scale_index')};\n // The default zero point is 8 for unsigned 4-bit quantization.\n let zero_point = ${dataType}(${zeroPoints ? 'extractBits(zero_point_word, zero_point_offset, 4)' : 8.0});\n ${b.indicesSet('b_indices', '1', 'block')};\n var word_offset: u32 = block_offset;\n ${processOneBlock}\n scale_index++;\n ${updateZeroPointIndex}\n block_offset += uniforms.block_size / ${aComponents};\n }\n // Drop the trailing 4 bits if the zero_poit_offset is not a byte boundary to align with the next byte.\n ${\n zeroPoints ? `if (zero_point_offset % 8 > 0) {\n ${updateZeroPointIndex}\n }` :\n ''}\n }\n for (var k: u32 = 0u; k < ${outputNumber}u; k++) {\n ${output.indicesSet('output_indices', outputRank - 2, `${outputNumber} * row + k`)};\n ${output.setByIndices('output_indices', 'output_values[k]')}\n }\n }`;\n };\n return {\n name: useBlockwiseMatMulNBits ? 'BlockwiseMatMulNBits' : 'MatMulNBits',\n shaderCache: {\n hint: `${attributes.cacheKey};${dimAOuter};${dataType};${inputs.length}`,\n inputDependencies: Array(inputs.length).fill('rank')\n },\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType}],\n name: useBlockwiseMatMulNBits ? 'BlockwiseMatMulNBits' : 'MatMulNBits',\n dispatchGroup: useBlockwiseMatMulNBits ? {x: 1, y: Math.ceil(dimBOuter / components), z: batchSize} :\n {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource\n };\n };\n\nexport const matMulNBits = (context: ComputeContext, attributes: MatMulNBitsAttributes): void => {\n validateInputs(context.inputs, attributes);\n const maxComputeWorkgroupSizes: [number, number, number] = context.getMaxComputeWorkgroupSizes();\n const maxComputeWorkgroupStorageSize = context.getMaxComputeWorkgroupStoragesize();\n context.compute(createMatMulNBitsProgramInfo(\n context.inputs, attributes, maxComputeWorkgroupSizes, maxComputeWorkgroupStorageSize));\n};\n\nexport const parseMatMulNBitsAttributes = (attributes: Record): MatMulNBitsAttributes =>\n createAttributeWithCacheKey(attributes as Omit);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper, UniformDataElementType, UniformsArrayType} from './common';\n\ninterface PadAttributes {\n // 0-constant, 1-reflect, 2-edge, 3-wrap\n readonly mode: number;\n readonly value: number;\n readonly pads: number[];\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('Too few inputs');\n }\n if (inputs[0].dataType !== DataType.float && inputs[0].dataType !== DataType.float16) {\n throw new Error('Input type must be float or float16.');\n }\n\n if (inputs.length >= 2) {\n let validPads = inputs[0].dims.length * 2 === inputs[1].dims[0];\n if (inputs.length === 4) {\n validPads = inputs[3].dims[0] * 2 === inputs[1].dims[0];\n }\n if (!validPads) {\n throw new Error('The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].');\n }\n }\n};\n\nconst getPadConstant = (output: IndicesHelper, inputRank: number, padsLength: number): string => {\n let block = '';\n for (let i = inputRank - 1; i >= 0; --i) {\n block += `\n k = i32(${output.indicesGet('indices', i)}) - ${getElementAt('uniforms.pads', i, padsLength)};\n if (k < 0) {\n break;\n }\n if (k >= i32(${getElementAt('uniforms.x_shape', i, inputRank)})) {\n break;\n }\n offset += k * i32(${getElementAt('uniforms.x_strides', i, inputRank)});\n `;\n }\n\n return `\n value = ${output.type.value}(uniforms.constant_value);\n for (var i = 0; i < 1; i++) {\n var offset = 0;\n var k = 0;\n ${block}\n value = x[offset];\n }\n `;\n};\n\nconst getPadReflect = (output: IndicesHelper, inputRank: number, padsLength: number): string => {\n let block = '';\n for (let i = inputRank - 1; i >= 0; --i) {\n block += `\n k = i32(${output.indicesGet('indices', i)}) - ${getElementAt('uniforms.pads', i, padsLength)};\n if (k < 0) {\n k = -k;\n }\n {\n let _2n_1 = 2 * (i32(${getElementAt('uniforms.x_shape', i, inputRank)}) - 1);\n k = k % _2n_1;\n if(k >= i32(${getElementAt('uniforms.x_shape', i, inputRank)})) {\n k = _2n_1 - k;\n }\n }\n offset += k * i32(${getElementAt('uniforms.x_strides', i, inputRank)});\n `;\n }\n\n return `\n var offset = 0;\n var k = 0;\n ${block}\n value = x[offset];\n `;\n};\n\nconst getPadEdge = (output: IndicesHelper, inputRank: number, padsLength: number): string => {\n let block = '';\n for (let i = inputRank - 1; i >= 0; --i) {\n block += `\n k = i32(${output.indicesGet('indices', i)}) - ${getElementAt('uniforms.pads', i, padsLength)};\n if (k < 0) {\n k = 0;\n }\n if (k >= i32(${getElementAt('uniforms.x_shape', i, inputRank)})) {\n k = i32(${getElementAt('uniforms.x_shape', i, inputRank)}) - 1;\n }\n offset += k * i32(${getElementAt('uniforms.x_strides', i, inputRank)});\n `;\n }\n\n return `\n var offset = 0;\n var k = 0;\n ${block}\n value = x[offset];\n `;\n};\n\nconst getPadWrap = (output: IndicesHelper, inputRank: number, padsLength: number): string => {\n let block = '';\n for (let i = inputRank - 1; i >= 0; --i) {\n block += `\n k = i32(${output.indicesGet('indices', i)}) - ${getElementAt('uniforms.pads', i, padsLength)};\n if (k < 0) {\n k += i32(${getElementAt('uniforms.x_shape', i, inputRank)}]);\n }\n if (k >= i32(${getElementAt('uniforms.x_shape', i, inputRank)})) {\n k -= i32(${getElementAt('uniforms.x_shape', i, inputRank)});\n }\n offset += k * i32(${getElementAt('uniforms.x_strides', i, inputRank)});\n `;\n }\n\n return `\n var offset = 0;\n var k = 0;\n ${block}\n value = x[offset];\n `;\n};\n\nconst getPadSnippet = (output: IndicesHelper, inputRank: number, attributes: PadAttributes): string => {\n switch (attributes.mode) {\n case 0:\n return getPadConstant(output, inputRank, attributes.pads.length);\n case 1:\n return getPadReflect(output, inputRank, attributes.pads.length);\n case 2:\n return getPadEdge(output, inputRank, attributes.pads.length);\n case 3:\n return getPadWrap(output, inputRank, attributes.pads.length);\n default:\n throw new Error('Invalid mode');\n }\n};\n\nconst createPadProgramInfo = (inputs: readonly TensorView[], attributes: PadAttributes): ProgramInfo => {\n const outputShape = ShapeUtil.padShape(inputs[0].dims.slice(), attributes.pads);\n const inputDims = inputs[0].dims;\n const outputSize = ShapeUtil.size(outputShape);\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: outputSize}, {type: DataType.int32, data: attributes.pads}];\n if (attributes.mode === 0) {\n programUniforms.push({type: inputs[0].dataType, data: attributes.value});\n }\n\n programUniforms.push(...createTensorShapeVariables(inputs[0].dims, outputShape));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank'];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('output', inputs[0].dataType, outputShape.length);\n const input = inputVariable('x', inputs[0].dataType, inputDims.length);\n const dataType = input.type.value;\n const padSnippet = getPadSnippet(output, inputDims.length, attributes);\n const uniforms: UniformsArrayType =\n [{name: 'output_size', type: 'u32'}, {name: 'pads', type: 'i32', length: attributes.pads.length}];\n if (attributes.mode === 0) {\n uniforms.push({name: 'constant_value', type: dataType as UniformDataElementType});\n }\n\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n\n let indices = ${output.offsetToIndices('global_idx')};\n\n var value = ${dataType}(0);\n ${padSnippet}\n output[global_idx] = value;\n }`;\n };\n\n return {\n name: 'Pad',\n shaderCache: {hint: `${attributes.mode}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(ShapeUtil.size(outputShape) / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource,\n };\n};\n\nconst createPadAttributesFromInputs = (inputs: readonly TensorView[], attributes: PadAttributes): PadAttributes => {\n if (inputs.length > 1) {\n const bigInt64Pads = inputs[1].getBigInt64Array();\n const value = (inputs.length >= 3 && inputs[2].data) ? inputs[2].getFloat32Array()[0] : 0.0;\n\n const inputRank = inputs[0].dims.length;\n const updatePads = new Int32Array(2 * inputRank).fill(0);\n if (inputs.length >= 4) {\n const axes = inputs[3].getBigInt64Array();\n for (let i = 0; i < axes.length; i++) {\n updatePads[Number(axes[i])] = Number(bigInt64Pads[i]);\n updatePads[Number(axes[i]) + inputRank] = Number(bigInt64Pads[i + axes.length]);\n }\n } else {\n bigInt64Pads.forEach((v, i) => updatePads[Number(i)] = (Number(v)));\n }\n\n const pads: number[] = [];\n updatePads.forEach(v => pads.push(v));\n\n return {mode: attributes.mode, value, pads};\n } else {\n return attributes;\n }\n};\n\nexport const pad = (context: ComputeContext, attributes: PadAttributes): void => {\n validateInputs(context.inputs);\n const updatedAttributes = createPadAttributesFromInputs(context.inputs, attributes);\n context.compute(createPadProgramInfo(context.inputs, updatedAttributes), {inputs: [0]});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {PoolConvUtil, ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramInputTensorInfoDependency, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\n\n// TODO: support:\n// - ceil_mode \"test_maxpool_2d_ceil\"\n// - storage_order \"test_maxpool_with_argmax_2d_precomputed_strides\"\n// - [MaxPool] dilations \"test_maxpool_2d_dilations\"\n// - [MaxPool] output[1] \"test_maxpool_with_argmax_2d_precomputed_pads\"\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (env.webgpu.validateInputContent && (!inputs || inputs.length !== 1)) {\n throw new Error('Pool ops requires 1 input.');\n }\n};\n\nconst getAdjustedPoolAttributesAndOutputShape = (\n input: TensorView, attributes: AttributeType, isGlobalOperator: boolean): [AttributeType, number[]] => {\n const isChannelsLast = attributes.format === 'NHWC';\n const inputShapeAsChannelFirst = input.dims.slice();\n if (isChannelsLast) {\n inputShapeAsChannelFirst.splice(1, 0, inputShapeAsChannelFirst.pop()!); // Move channel to the second position.\n }\n const hasDilations = Object.hasOwnProperty.call(attributes, 'dilations');\n const kernelShape = attributes.kernelShape.slice();\n const strides = attributes.strides.slice();\n const dilations: number[] = hasDilations ? (attributes as MaxPoolAttributes).dilations.slice() : [];\n const pads = attributes.pads.slice();\n PoolConvUtil.adjustPoolAttributes(isGlobalOperator, inputShapeAsChannelFirst, kernelShape, strides, dilations, pads);\n\n const outputShapeAsChannelFirst = PoolConvUtil.computePoolOutputShape(\n isGlobalOperator, inputShapeAsChannelFirst, strides, dilations, kernelShape, pads, attributes.autoPad);\n\n const newAttributes = Object.assign({}, attributes);\n if (hasDilations) {\n Object.assign(newAttributes, {kernelShape, strides, pads, dilations, cacheKey: attributes.cacheKey});\n } else {\n Object.assign(newAttributes, {kernelShape, strides, pads, cacheKey: attributes.cacheKey});\n }\n const outputShapeAsChannelLast = outputShapeAsChannelFirst.slice();\n outputShapeAsChannelLast.push(outputShapeAsChannelLast.splice(1, 1)[0]);\n return [newAttributes, isChannelsLast ? outputShapeAsChannelLast : outputShapeAsChannelFirst];\n};\n\nconst getUniformAndPadInfo = (\n outputShape: readonly number[],\n attributes: AttributeType): [ProgramUniform[], UniformsArrayType, boolean, boolean, boolean] => {\n const isChannelsLast = attributes.format === 'NHWC';\n const outputSize = ShapeUtil.size(outputShape);\n const kernelSize = ShapeUtil.size(attributes.kernelShape);\n const programUniforms: ProgramUniform[] =\n [{type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: kernelSize}];\n const uniforms: UniformsArrayType = [{name: 'outputSize', type: 'u32'}, {name: 'kernelSize', type: 'u32'}];\n if (attributes.kernelShape.length <= 2) {\n const kw = attributes.kernelShape[attributes.kernelShape.length - 1];\n const sw = attributes.strides[attributes.strides.length - 1];\n const pwStart = attributes.pads[attributes.pads.length / 2 - 1];\n const pwEnd = attributes.pads[attributes.pads.length - 1];\n const pwStartEndNotZero = !!(pwStart + pwEnd);\n programUniforms.push(\n {type: DataType.uint32, data: kw},\n {type: DataType.uint32, data: sw},\n {type: DataType.uint32, data: pwStart},\n {type: DataType.uint32, data: pwEnd},\n );\n uniforms.push(\n {name: 'kw', type: 'u32'}, {name: 'sw', type: 'u32'}, {name: 'pwStart', type: 'u32'},\n {name: 'pwEnd', type: 'u32'});\n\n let phStartEndNotZero = false;\n if (attributes.kernelShape.length === 2) {\n const kh = attributes.kernelShape[attributes.kernelShape.length - 2];\n const sh = attributes.strides[attributes.strides.length - 2];\n const phStart = attributes.pads[attributes.pads.length / 2 - 2];\n const phEnd = attributes.pads[attributes.pads.length - 2];\n phStartEndNotZero = !!(phStart + phEnd);\n programUniforms.push(\n {type: DataType.uint32, data: kh}, {type: DataType.uint32, data: sh}, {type: DataType.uint32, data: phStart},\n {type: DataType.uint32, data: phEnd});\n\n uniforms.push(\n {name: 'kh', type: 'u32'}, {name: 'sh', type: 'u32'}, {name: 'phStart', type: 'u32'},\n {name: 'phEnd', type: 'u32'});\n }\n return [programUniforms, uniforms, true, pwStartEndNotZero, phStartEndNotZero];\n } else {\n if (isChannelsLast) {\n throw new Error('Pooling with kernelShape.length > 2 is not supported for NHWC format.');\n }\n const kernelStrides = ShapeUtil.computeStrides(attributes.kernelShape);\n programUniforms.push(\n {type: DataType.uint32, data: kernelStrides}, {type: DataType.uint32, data: attributes.pads},\n {type: DataType.uint32, data: attributes.strides});\n uniforms.push(\n {name: 'kernelStrides', type: 'u32', length: kernelStrides.length},\n {name: 'pads', type: 'u32', length: attributes.pads.length},\n {name: 'strides', type: 'u32', length: attributes.strides.length});\n\n const hasPads = attributes.pads.reduce((sum, cur) => sum + cur);\n return [programUniforms, uniforms, !!hasPads, false, false];\n }\n};\n\nconst generatePoolingCode = (\n shaderHelper: ShaderHelper, x: IndicesHelper, rank: number, outputShapeRank: number, attributes: AttributeType,\n op1: string, op2: string, start: number, uniforms: UniformsArrayType, hasPads: boolean, pwStartEndNotZero: boolean,\n phStartEndNotZero: boolean): string => {\n const isChannelsLast = attributes.format === 'NHWC';\n const dataType = x.type.value;\n const output = outputVariable('output', x.type.tensor, outputShapeRank);\n\n if (attributes.kernelShape.length <= 2) {\n let codeW = '';\n let codeH = '';\n let codeHEnd = '';\n const dimIdxW = rank - (isChannelsLast ? 2 : 1);\n if (pwStartEndNotZero) {\n codeW = `\n for (var i: u32 = 0u; i < uniforms.kw; i++) {\n xIndices[${dimIdxW}] = indices[${dimIdxW}] * uniforms.sw - uniforms.pwStart + i;\n if (xIndices[${dimIdxW}] < 0 || xIndices[${dimIdxW}]\n >= uniforms.x_shape[${dimIdxW}]) {\n pad++;\n continue;\n }\n let x_val = x[${x.indicesToOffset('xIndices')}];\n ${op1}\n }`;\n } else {\n codeW = `\n for (var i: u32 = 0u; i < uniforms.kw; i++) {\n xIndices[${dimIdxW}] = indices[${dimIdxW}] * uniforms.sw - uniforms.pwStart + i;\n let x_val = x[${x.indicesToOffset('xIndices')}];\n ${op1}\n }`;\n }\n\n if (attributes.kernelShape.length === 2) {\n const dimIdxH = rank - (isChannelsLast ? 3 : 2);\n if (phStartEndNotZero) {\n codeH = `\n for (var j: u32 = 0u; j < uniforms.kh; j++) {\n xIndices[${dimIdxH}] = indices[${dimIdxH}] * uniforms.sh - uniforms.phStart + j;\n if (xIndices[${dimIdxH}] < 0 || xIndices[${dimIdxH}] >= uniforms.x_shape[${dimIdxH}]) {\n pad += i32(uniforms.kw);\n continue;\n }\n `;\n } else {\n codeH = `\n for (var j: u32 = 0u; j < uniforms.kh; j++) {\n xIndices[${dimIdxH}] = indices[${dimIdxH}] * uniforms.sh - uniforms.phStart + j;\n `;\n }\n codeHEnd = `\n }\n `;\n }\n\n const poolingCode = `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(x, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n\n let indices = ${output.offsetToIndices('global_idx')};\n var xIndices = ${output.offsetToIndices('global_idx')};\n\n var value = ${dataType}(${start});\n var pad = 0;\n ${codeH}\n ${codeW}\n ${codeHEnd}\n ${op2}\n\n output[global_idx] = value;\n }`;\n return poolingCode;\n } else {\n if (isChannelsLast) {\n throw new Error('Pooling with kernelShape.length > 2 is not supported for NHWC format.');\n }\n const stridesRank = attributes.kernelShape.length;\n const padsRank = attributes.pads.length;\n let padCode = '';\n if (hasPads) {\n padCode = `\n if (xIndices[j] >= uniforms.x_shape[j]) {\n pad++;\n isPad = true;\n break;\n }\n }\n if (!isPad) {\n let x_val = x[${x.indicesToOffset('xIndices')}];\n ${op1}\n }`;\n } else {\n padCode = `\n }\n let x_val = x[${x.indicesToOffset('xIndices')}];\n ${op1}\n `;\n }\n const poolingCode = `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(x, output)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n let indices = ${output.offsetToIndices('global_idx')};\n var xIndices = ${output.offsetToIndices('global_idx')};\n\n var offsets: array;\n\n var value = ${dataType}(${start});\n var pad = 0;\n var isPad = false;\n\n for (var i: u32 = 0u; i < uniforms.kernelSize; i++) {\n var offset = i;\n for (var j = 0u; j < ${stridesRank - 1}u; j++) {\n offsets[j] = offset / ${getElementAt('uniforms.kernelStrides', 'j', stridesRank)};\n offset -= offsets[j] * ${getElementAt('uniforms.kernelStrides', 'j', stridesRank)};\n }\n offsets[${stridesRank - 1}] = offset;\n\n isPad = false;\n for (var j = ${rank - stridesRank}u; j < ${rank}u; j++) {\n xIndices[j] = indices[j] * ${\n getElementAt('uniforms.strides', `j - ${rank - stridesRank}u`, stridesRank)}\n + offsets[j - ${rank - stridesRank}u] - ${getElementAt('uniforms.pads', 'j - 2u', padsRank)};\n ${padCode}\n }\n ${op2}\n\n output[global_idx] = value;\n }`;\n return poolingCode;\n }\n};\n\nexport interface FormatAttributes {\n readonly format: 'NHWC'|'NCHW';\n}\n\nexport interface PoolCommonAttributes extends FormatAttributes {\n readonly autoPad: string;\n readonly ceilMode: number;\n readonly kernelShape: readonly number[];\n readonly strides: readonly number[];\n readonly pads: readonly number[];\n}\n\nconst createShaderKeyFromAttributes = (attributes: PoolCommonAttributes): string =>\n (`${attributes.format};${attributes.ceilMode};${attributes.autoPad};${attributes.kernelShape.length}`);\n\nconst createAveragePoolShaderKeyFromAttributes = (attributes: AveragePoolAttributes): string =>\n (`${createShaderKeyFromAttributes(attributes)};${attributes.countIncludePad}`);\n\nconst createMaxPoolShaderKeyFromAttributes = (attributes: MaxPoolAttributes): string =>\n (`${createShaderKeyFromAttributes(attributes)};${attributes.storageOrder};${attributes.dilations}`);\n\nconst parsePoolCommonAttributes = (attributes: Record): PoolCommonAttributes => ({\n format: attributes.format as FormatAttributes['format'],\n autoPad: ['NOTSET', 'VALID', 'SAME_UPPER', 'SAME_LOWER'][attributes.auto_pad as number],\n ceilMode: attributes.ceil_mode as number,\n kernelShape: attributes.kernel_shape as [number, number],\n strides: attributes.strides as [number, number],\n pads: attributes.pads as [number, number, number, number]\n});\n\nexport interface AveragePoolAttributes extends PoolCommonAttributes, AttributeWithCacheKey {\n readonly countIncludePad: boolean;\n}\n\nconst createAveragePoolProgramInfo =\n (name: string, input: TensorView, isGlobalOperator: boolean, attributes: AveragePoolAttributes): ProgramInfo => {\n const [adjustedAttributes, outputShape] =\n getAdjustedPoolAttributesAndOutputShape(input, attributes, isGlobalOperator);\n const x = inputVariable('x', input.dataType, input.dims.length);\n const dataType = x.type.value;\n\n const op1 = 'value += x_val;';\n let op2 = '';\n if (adjustedAttributes.countIncludePad) {\n op2 += `value /= ${dataType}(uniforms.kernelSize);`;\n } else {\n op2 += `value /= ${dataType}(i32(uniforms.kernelSize) - pad);`;\n }\n const [programUniforms, uniforms, hasPads, pwStartEndNotZero, phStartEndNotZero] =\n getUniformAndPadInfo(outputShape, adjustedAttributes);\n programUniforms.push(...createTensorShapeVariables(input.dims, outputShape));\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank'];\n return {\n name,\n shaderCache:\n {hint: `${attributes.cacheKey};${hasPads};${pwStartEndNotZero};${phStartEndNotZero}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: input.dataType}],\n dispatchGroup: {x: Math.ceil(ShapeUtil.size(outputShape) / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource: shaderHelper => generatePoolingCode(\n shaderHelper, x, input.dims.length, outputShape.length, adjustedAttributes, op1, op2, 0.0, uniforms,\n hasPads, pwStartEndNotZero, phStartEndNotZero),\n };\n };\n\nexport const parseAveragePoolAttributes = (attributes: Record): AveragePoolAttributes => {\n const countIncludePad = (attributes.count_include_pad as number) === 0 ? false : true;\n\n const attr = parsePoolCommonAttributes(attributes);\n // TODO: support attribute 'ceil_mode'\n if (attr.ceilMode !== 0) {\n throw new Error('using ceil() in shape computation is not yet supported for AveragePool');\n }\n const averagePoolAttributes = {countIncludePad, ...attr, cacheKey: ''};\n return {...averagePoolAttributes, cacheKey: createAveragePoolShaderKeyFromAttributes(averagePoolAttributes)};\n};\n\nexport const averagePool = (context: ComputeContext, attributes: AveragePoolAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createAveragePoolProgramInfo('AveragePool', context.inputs[0], false, attributes));\n};\n\nconst globalPoolAttributes = {\n autoPad: '',\n ceilMode: 0,\n countIncludePad: false,\n kernelShape: [],\n strides: [],\n pads: [],\n storageOrder: 0,\n dilations: []\n};\n\nexport const parseGlobalAveragePoolAttributes = (attributes: Record): AveragePoolAttributes => {\n const format = attributes.format as FormatAttributes['format'];\n return {format, ...globalPoolAttributes, cacheKey: format};\n};\n\nexport const globalAveragePool = (context: ComputeContext, attributes: AveragePoolAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createAveragePoolProgramInfo('GlobalAveragePool', context.inputs[0], true, attributes));\n};\n\nexport interface MaxPoolAttributes extends PoolCommonAttributes, AttributeWithCacheKey {\n readonly storageOrder: number;\n readonly dilations: number[];\n}\n\nconst createMaxPoolProgramInfo =\n (name: string, input: TensorView, isGlobalOperator: boolean, attributes: MaxPoolAttributes): ProgramInfo => {\n const [adjustedAttributes, outputShape] =\n getAdjustedPoolAttributesAndOutputShape(input, attributes, isGlobalOperator);\n const op1 = `\n value = max(x_val, value);\n `;\n const op2 = '';\n const x = inputVariable('x', input.dataType, input.dims.length);\n const inputDependencies: ProgramInputTensorInfoDependency[] = ['rank'];\n const [programUniforms, uniforms, hasPads, pwStartEndNotZero, phStartEndNotZero] =\n getUniformAndPadInfo(outputShape, adjustedAttributes);\n programUniforms.push(...createTensorShapeVariables(input.dims, outputShape));\n return {\n name,\n shaderCache:\n {hint: `${attributes.cacheKey};${hasPads};${pwStartEndNotZero};${phStartEndNotZero}`, inputDependencies},\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: input.dataType}],\n dispatchGroup: {x: Math.ceil(ShapeUtil.size(outputShape) / 64 /* workgroup size */)},\n programUniforms\n }),\n getShaderSource: shaderHelper => generatePoolingCode(\n shaderHelper, x, input.dims.length, outputShape.length, adjustedAttributes, op1, op2,\n (input.dataType === DataType.float16) ? -65504 : -1e5, uniforms, hasPads, pwStartEndNotZero,\n phStartEndNotZero),\n };\n };\n\nexport const maxPool = (context: ComputeContext, attributes: MaxPoolAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createMaxPoolProgramInfo('MaxPool', context.inputs[0], false, attributes));\n};\n\nexport const parseMaxPoolAttributes = (attributes: Record): MaxPoolAttributes => {\n const storageOrder = attributes.storage_order as number;\n const dilations = attributes.dilations as [number, number];\n\n const attr = parsePoolCommonAttributes(attributes);\n // TODO: support attribute 'ceil_mode' and 'storage_order'\n if (storageOrder !== 0) {\n throw new Error('column major storage order is not yet supported for MaxPool');\n }\n if (attr.ceilMode !== 0) {\n throw new Error('using ceil() in shape computation is not yet supported for MaxPool');\n }\n const maxPoolAttributes = {storageOrder, dilations, ...attr, cacheKey: ''};\n return {...maxPoolAttributes, cacheKey: createMaxPoolShaderKeyFromAttributes(maxPoolAttributes)};\n};\n\nexport const parseGlobalMaxPoolAttributes = (attributes: Record): MaxPoolAttributes => {\n const format = attributes.format as FormatAttributes['format'];\n return {format, ...globalPoolAttributes, cacheKey: format};\n};\n\nexport const globalMaxPool = (context: ComputeContext, attributes: MaxPoolAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createMaxPoolProgramInfo('GlobalMaxPool', context.inputs[0], true, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env} from 'onnxruntime-common';\n\nimport {DataType} from '../../../wasm-common';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, outputVariable, ShaderHelper, UniformDataElementType, UniformsArrayType} from './common';\n\nconst validateInputsContent = (start: number, limit: number, delta: number): void => {\n const sameStartLimit = start === limit;\n const increasingRangeNegativeStep = start < limit && delta < 0;\n const decreasingRangePositiveStep = start > limit && delta > 0;\n\n if (sameStartLimit || increasingRangeNegativeStep || decreasingRangePositiveStep) {\n throw new Error('Range these inputs\\' contents are invalid.');\n }\n};\n\nconst createRangeProgramInfo = (start: number, limit: number, delta: number, dataType: DataType): ProgramInfo => {\n const numElements = Math.abs(Math.ceil((limit - start) / delta));\n const outputShape: number[] = [numElements];\n const outputSize = numElements;\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: dataType, data: start}, {type: dataType, data: delta},\n ...createTensorShapeVariables(outputShape)\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const output = outputVariable('output', dataType, outputShape.length);\n const wgslType = output.type.value;\n const uniforms: UniformsArrayType = [\n {name: 'outputSize', type: 'u32'}, {name: 'start', type: wgslType as UniformDataElementType},\n {name: 'delta', type: wgslType as UniformDataElementType}\n ];\n return `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n output[global_idx] = uniforms.start + ${wgslType}(global_idx) * uniforms.delta;\n }`;\n };\n\n return {\n name: 'Range',\n shaderCache: {hint: `${dataType}`},\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms\n })\n };\n};\n\nexport const range = (context: ComputeContext): void => {\n let start = 0;\n let limit = 0;\n let delta = 0;\n if (context.inputs[0].dataType === DataType.int32) {\n start = context.inputs[0].getInt32Array()[0];\n limit = context.inputs[1].getInt32Array()[0];\n delta = context.inputs[2].getInt32Array()[0];\n } else if (context.inputs[0].dataType === DataType.float) {\n start = context.inputs[0].getFloat32Array()[0];\n limit = context.inputs[1].getFloat32Array()[0];\n delta = context.inputs[2].getFloat32Array()[0];\n }\n if (env.webgpu.validateInputContent) {\n validateInputsContent(start, limit, delta);\n }\n\n context.compute(createRangeProgramInfo(start, limit, delta, context.inputs[0].dataType), {inputs: []});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\ntype CoordinateTransformMode = 'half_pixel'|'asymmetric'|'pytorch_half_pixel'|'tf_half_pixel_for_nn'|'align_corners'|\n 'tf_crop_and_resize'|'half_pixel_symmetric';\n\ntype KeepAspectRatioPolicy = 'stretch'|'not_smaller'|'not_larger';\n\ntype Mode = 'nearest'|'linear'|'cubic';\n\ntype NearestMode = 'round_prefer_floor'|'round_prefer_ceil'|'floor'|'ceil'|'simple';\n\nexport interface ResizeAttributes extends AttributeWithCacheKey {\n antialias: number;\n axes: number[];\n coordinateTransformMode: CoordinateTransformMode;\n cubicCoeffA: number;\n excludeOutside: boolean;\n extrapolationValue: number;\n keepAspectRatioPolicy: KeepAspectRatioPolicy;\n mode: Mode;\n nearestMode: NearestMode;\n}\n\nconst validateScales = (scales: number[], attributes: ResizeAttributes): void => {\n scales.every((value) => value > 0 || (() => {\n throw new Error('Resize requires scales input values to be positive');\n }));\n // Check scales dims based on mode: LINEAR, CUBIC\n if (scales.length > 0) {\n if (attributes.mode === 'linear') {\n if (!(scales.length === 2 || scales.length === 3 || (scales.length === 4 && scales[0] === 1 && scales[1] === 1) ||\n (scales.length === 4 && scales[0] === 1 && scales[3] === 1) ||\n (scales.length === 5 && scales[0] === 1 && scales[1] === 1))) {\n throw new Error(\n `For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and\n one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`);\n }\n } else if (attributes.mode === 'cubic') {\n if (!(scales.length === 2 || (scales.length === 4 && scales[0] === 1 && scales[1] === 1) ||\n (scales.length === 4 && scales[0] === 1 && scales[3] === 1))) {\n throw new Error('Resize requires scales input size to be 2 or 4 for cubic mode');\n }\n }\n }\n};\n\nconst updateScales = (scales: readonly number[], axes: readonly number[], rank: number): number[] => {\n axes.every((value) => value >= 0 && value < rank || (() => {\n throw new Error('Resize requires axes input values to be positive and less than rank');\n }));\n const newScales = new Array(rank).fill(1.0);\n axes.forEach((value, index) => newScales[value] = scales[index]);\n return newScales;\n};\n\nconst validateInputs =\n (inputs: readonly TensorView[], attributes: ResizeAttributes, opsetVersion: number, scales: number[],\n sizes: number[], roi: number[]): void => {\n const [roiInputIndex, scalesInputIndex, sizesInputIndex] =\n (opsetVersion > 10) ? [1, 2, 3] : [-1, (inputs.length > 1) ? 1 : -1, -1];\n const rank = inputs[0].dims.length;\n if (roiInputIndex > 0 && inputs.length > roiInputIndex && inputs[roiInputIndex].dims.length > 0) {\n inputs[roiInputIndex].getFloat32Array().forEach((value) => roi.push(value));\n } else if (attributes.coordinateTransformMode === 'tf_crop_and_resize') {\n throw new Error('Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize');\n }\n\n if (scalesInputIndex > 0 && inputs.length > scalesInputIndex && inputs[scalesInputIndex].dims.length > 0) {\n inputs[scalesInputIndex].getFloat32Array().forEach((value) => scales.push(value));\n if (scales.length !== 0 &&\n (scales.length !== rank && (opsetVersion >= 18 && scales.length !== attributes.axes.length))) {\n throw new Error(\n 'Resize requires scales input size to be same as input rank or axes size for opset 18 and up');\n }\n validateScales(scales, attributes);\n if (attributes.axes.length > 0) {\n updateScales(scales, attributes.axes, rank).forEach((value, index) => scales[index] = value);\n }\n }\n if (sizesInputIndex > 0 && inputs.length > sizesInputIndex) {\n inputs[sizesInputIndex].getBigInt64Array().forEach((value) => sizes.push(Number(value)));\n if (sizes.length !== rank || (opsetVersion >= 18 && sizes.length === attributes.axes.length)) {\n throw new Error('Resize requires sizes input size to be same as input rank or axes size for opset 18 and up');\n }\n }\n\n if (attributes.axes.length > 0) {\n if (scales.length !== attributes.axes.length) {\n throw new Error('Resize requires \"scales\" input size to be of axes rank when axes attributes is specified');\n }\n if (sizes.length !== attributes.axes.length) {\n throw new Error(\n 'Resize requires \"sizes\" input size to be of rank axes rank when axes attributes is specified');\n }\n }\n if (typeof scales !== 'undefined' && typeof sizes !== 'undefined' && scales.length > 0 && sizes.length > rank) {\n throw new Error('Resize requires only of scales or sizes to be specified');\n }\n };\n\nconst getOriginalCoordinateFromResizedCoordinate =\n (coordinateTransferMode: CoordinateTransformMode, dType: string): string =>\n `fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32,\n lengthOriginal: u32, roiStart: f32, roiEnd: f32) -> ${dType} { ` +\n (() => {\n switch (coordinateTransferMode) {\n case 'asymmetric':\n return `return ${dType}(xResized) / ${dType}(xScale);`;\n case 'pytorch_half_pixel':\n return `if (lengthResized > 1) {\n return (${dType}(xResized) + 0.5) / ${dType}(xScale) - 0.5;\n } else {\n return 0.0;\n }`;\n case 'tf_half_pixel_for_nn':\n return `return (${dType}(xResized) + 0.5) / ${dType}(xScale);`;\n case 'align_corners':\n return `if (lengthResized == 1) {\n return 0.0;\n } else {\n // The whole part and the fractional part are calculated separately due to inaccuracy of floating\n // point division. As an example, f32(21) / f32(7) may evaluate to 2.99... instead of 3, causing an\n // offset-by-one error later in floor().\n let whole = ${dType}(xResized * (lengthOriginal - 1) / (lengthResized - 1));\n let fract =\n ${dType}(xResized * (lengthOriginal - 1) % (lengthResized - 1)) / ${dType}(lengthResized - 1);\n return whole + fract;\n }`;\n case 'tf_crop_and_resize':\n return `if (lengthResized > 1) {\n return ${dType}(roiStart) * ${dType}(lengthOriginal - 1) +\n (${dType}(xResized) * ${dType}(roiEnd - roiStart) * ${dType}(lengthOriginal - 1)) /\n ${dType}(lengthResized - 1);\n } else {\n return 0.5 * ${dType}(roiStart + roiEnd) * ${dType}(lengthOriginal - 1);\n }`;\n case 'half_pixel_symmetric':\n return `const outputWidth = ${dType}xScale * ${dType}(lengthResized);\n const adjustment = ${dType}(lengthResized) / outputWidth;\n const center = ${dType}(lengthOriginal) / 2;\n const offset = center * (1 - adjustment);\n return offset + ((${dType}(xResized) + 0.5) / ${dType}(xScale)) - 0.5;`;\n case 'half_pixel':\n return `return ((${dType}(xResized) + 0.5) / ${dType}(xScale)) - 0.5;`;\n default:\n throw new Error(`Coordinate transform mode ${coordinateTransferMode} is not supported`);\n }\n })() +\n '}';\n\nconst getNearestPixelFromOriginal = (nearestMode: NearestMode, opsetVersion: number, dType: string): string =>\n `fn getNearestPixelFromOriginal(xOriginal: ${dType}, isDownSample: bool) -> ${dType} {` + (() => {\n switch (nearestMode) {\n case 'round_prefer_ceil':\n return 'if (fract(xOriginal) == 0.5) { \\\n return ceil(xOriginal); \\\n } else { \\\n return round(xOriginal); \\\n }';\n case 'floor':\n return 'return floor(xOriginal);';\n case 'ceil':\n return 'return ceil(xOriginal);';\n case 'round_prefer_floor':\n return 'if (fract(xOriginal) == 0.5) { \\\n return floor(xOriginal); \\\n } else { \\\n return round(xOriginal); \\\n }';\n case 'simple':\n default:\n if (opsetVersion < 11) {\n return 'if (isDownSample) \\\n { \\\n return ceil(xOriginal); \\\n } else { \\\n return xOriginal; \\\n }';\n }\n throw new Error(`Nearest mode ${nearestMode} is not supported`);\n }\n })() +\n '}';\n\nconst updateRoI = (roi: readonly number[], axes: readonly number[], rank: number): number[] => {\n const roiTmp = new Array(rank).fill(0).concat(new Array(rank).fill(1));\n const roiLocal = roi.length === 0 ? roiTmp : roi.slice();\n if (axes.length > 0) {\n axes.forEach((v, i) => {\n roiTmp[v] = roiLocal[i];\n roiTmp[i + rank] = roiLocal[axes.length + i];\n });\n return roiTmp;\n }\n return roiLocal;\n};\n\nconst initOutputShape =\n (inputShape: readonly number[], scales: readonly number[], sizes: readonly number[], axes: readonly number[]):\n number[] => {\n let outputShape: number[] = [];\n if (sizes.length > 0) {\n if (axes.length > 0) {\n inputShape.forEach((v) => outputShape.push(v));\n if (Math.max(...axes) > inputShape.length) {\n throw new Error('axes is out of bound');\n }\n axes.forEach((v, i) => outputShape[v] = sizes[i]);\n } else {\n sizes.forEach((v) => outputShape.push(v));\n }\n } else {\n if (scales.length === 0) {\n throw new Error('Resize requires either scales or sizes.');\n } else {\n outputShape = inputShape.map((value, index) => Math.round(value * scales[index]));\n }\n }\n return outputShape;\n };\n\nconst adjustOutputShape = (inputShape: readonly number[], scales: number[], attributes: ResizeAttributes) => {\n const scaleInPolicy = (() => {\n switch (attributes.keepAspectRatioPolicy) {\n case 'not_larger':\n return attributes.axes.length > 0 ? Math.min(...attributes.axes.map(i => scales[i]), Number.MAX_VALUE) :\n Math.min(...scales, Number.MAX_VALUE);\n case 'not_smaller':\n return attributes.axes.length > 0 ? Math.max(...attributes.axes.map(i => scales[i]), Number.MIN_VALUE) :\n Math.max(...scales, Number.MIN_VALUE);\n default:\n throw new Error(`Keep aspect ratio policy ${attributes.keepAspectRatioPolicy} is not supported`);\n }\n })();\n scales.fill(1.0, 0, scales.length);\n const adjustedOutputShape = inputShape.slice();\n if (attributes.axes.length > 0) {\n attributes.axes.forEach((v) => scales[v] = scaleInPolicy);\n attributes.axes.forEach((v) => adjustedOutputShape[v] = Math.round(inputShape[v] * scales[v]));\n } else {\n scales.fill(scaleInPolicy, 0, scales.length);\n adjustedOutputShape.forEach((v, i) => adjustedOutputShape[i] = Math.round(v * scales[i]));\n }\n return adjustedOutputShape;\n};\n\nconst calculateOriginalIndicesFromOutputIndices =\n (output: IndicesHelper, inputShape: readonly number[], outputShape: readonly number[], scalesLength: number,\n roiLength: number): string => `\n fn calculateOriginalIndicesFromOutputIndices(output_indices: ${output.type.indices}) -> array<${\n output.type.value}, ${outputShape.length}> {\n var original_indices: array<${output.type.value}, ${outputShape.length}>;\n for (var i:u32 = 0; i < ${outputShape.length}; i++) {\n var output_index = ${output.indicesGet('output_indices', 'i')};\n var scale = ${getElementAt('uniforms.scales', 'i', scalesLength)};\n var roi_low = ${getElementAt('uniforms.roi', 'i', roiLength)};\n var roi_hi = ${getElementAt('uniforms.roi', `i + ${inputShape.length}`, roiLength)};\n if (scale == 1.0) {\n original_indices[i] = ${output.type.value}(output_index);\n } else {\n var input_shape_i = ${getElementAt('uniforms.input_shape', 'i', inputShape.length)};\n var output_shape_i = ${getElementAt('uniforms.output_shape', 'i', outputShape.length)};\n original_indices[i] = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i,\n input_shape_i, roi_low, roi_hi);\n }\n }\n return original_indices;\n }`;\n\nconst calculateInputIndicesFromOutputIndices =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[], outputShape: readonly number[],\n scalesLength: number, roiLength: number, useExtrapolation: boolean): string => `\n fn calculateInputIndicesFromOutputIndices(output_indices: ${output.type.indices}) -> ${input.type.indices} {\n var input_indices: ${input.type.indices};\n for (var i:u32 = 0; i < ${outputShape.length}; i++) {\n var output_index = ${output.indicesGet('output_indices', 'i')};\n var input_index: u32;\n var scale = ${getElementAt('uniforms.scales', 'i', scalesLength)};\n if (scale == 1.0) {\n input_index = output_index;\n } else {\n var roi_low = ${getElementAt('uniforms.roi', 'i', roiLength)};\n var roi_hi = ${getElementAt('uniforms.roi', `i + ${inputShape.length}`, roiLength)};\n var input_shape_i = ${getElementAt('uniforms.input_shape', 'i', inputShape.length)};\n var output_shape_i = ${getElementAt('uniforms.output_shape', 'i', outputShape.length)};\n var original_idx = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i,\n input_shape_i, roi_low, roi_hi);\n if (!${useExtrapolation} || (original_idx >= 0 && original_idx < ${output.type.value}(input_shape_i))) {\n if (original_idx < 0) {\n input_index = 0;\n } else if (original_idx > ${output.type.value}(input_shape_i - 1)) {\n input_index = input_shape_i - 1;\n } else {\n input_index = u32(getNearestPixelFromOriginal(original_idx, scale < 1));\n }\n } else {\n input_index = u32(original_idx);\n }\n }\n ${input.indicesSet('input_indices', 'i', ' input_index')}\n }\n return input_indices;\n }`;\nconst checkInputIndices = (input: IndicesHelper, inputShape: readonly number[]): string => `\n fn checkInputIndices(input_indices: ${input.type.indices}) -> bool {\n for (var i:u32 = 0; i < ${inputShape.length}; i++) {\n var input_index = ${input.indicesGet('input_indices', 'i')};\n if (input_index < 0 || input_index >= ${getElementAt('uniforms.input_shape', 'i', inputShape.length)}) {\n return false;\n }\n }\n return true;\n }`;\n\nconst setChannelAndBatchIndices =\n (input: IndicesHelper, channelIdx: number, batchIdx: number, spacialDims: number): string =>\n input.rank > spacialDims ? `\n ${input.indicesSet('input_indices', channelIdx, 'channel')};\n ${input.indicesSet('input_indices', batchIdx, 'batch')};\n` :\n '';\n\nconst bilinearInterpolation =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[], useExtrapolation: boolean,\n extrapolationValue: number): string => {\n const isNchw = true;\n const [batchIdx, heightIdx, widthIdx, channelIdx] =\n inputShape.length === 2 ? [-1, 0, 1, -1] : (isNchw ? [0, 2, 3, 1] : [0, 1, 2, 3]);\n const dType = input.type.value;\n return `\n fn getInputValue(batch: u32, channel: u32, row: u32, col: u32) -> ${dType} {\n var input_indices: ${input.type.indices};\n ${input.indicesSet('input_indices', heightIdx, `max(0, min(row, ${inputShape[heightIdx]} - 1))`)};\n ${input.indicesSet('input_indices', widthIdx, `max(0, min(col, ${inputShape[widthIdx]} - 1))`)};\n ${setChannelAndBatchIndices(input, channelIdx, batchIdx, 2)}\n return ${input.getByIndices('input_indices')};\n }\n\n fn bilinearInterpolation(output_indices: ${output.type.indices}) -> ${dType} {\n var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices);\n var row:${dType} = originalIndices[${heightIdx}];\n var col:${dType} = originalIndices[${widthIdx}];\n ${\n useExtrapolation ?\n `if (row < 0 || row > (${inputShape[heightIdx]} - 1) || col < 0 || col > (${inputShape[widthIdx]} - 1)) {\n return ${extrapolationValue};\n }` :\n ''};\n row = max(0, min(row, ${inputShape[heightIdx]} - 1));\n col = max(0, min(col, ${inputShape[widthIdx]} - 1));\n var row1: u32 = u32(row);\n var col1: u32 = u32(col);\n var row2: u32 = u32(row + 1);\n var col2: u32 = u32(col + 1);\n var channel: u32 = ${inputShape.length > 2 ? `u32(originalIndices[${channelIdx}])` : '0'};\n var batch: u32 = ${inputShape.length > 2 ? `u32(originalIndices[${batchIdx}])` : '0'};\n var x11: ${dType} = getInputValue(batch, channel, row1, col1);\n var x12: ${dType} = getInputValue(batch, channel, row1, col2);\n var x21: ${dType} = getInputValue(batch, channel, row2, col1);\n var x22: ${dType} = getInputValue(batch, channel, row2, col2);\n var dx1: ${dType} = abs(row - ${dType}(row1));\n var dx2: ${dType} = abs(${dType}(row2) - row);\n var dy1: ${dType} = abs(col - ${dType}(col1));\n var dy2: ${dType} = abs(${dType}(col2) - col);\n if (row1 == row2) {\n dx1 = 0.5;\n dx2 = 0.5;\n }\n if (col1 == col2) {\n dy1 = 0.5;\n dy2 = 0.5;\n }\n return (x11 * dx2 * dy2 + x12 * dx2 * dy1 + x21 * dx1 * dy2 + x22 * dx1 * dy1);\n }`;\n };\n\nconst bicubicInterpolation =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[], outputShape: readonly number[],\n scales: readonly number[], roi: readonly number[], cubicCoeffA: number, useExtrapolation: boolean,\n extrapolationValue: number, excludeOutside: boolean): string => {\n const is2D = inputShape.length === 2;\n const isNchw = true;\n const [heightIdx, widthIdx] = is2D ? [0, 1] : isNchw ? [2, 3] : [1, 2];\n const dType = input.type.value;\n const createCubicInterpolationFunction = (idx: number): string => {\n const direction = idx === heightIdx ? 'row' : 'col';\n return `\n fn ${direction}CubicInterpolation(input_indices: ${input.type.indices}, output_indices: ${\n output.type.indices}) -> ${dType} {\n var output_index = ${output.indicesGet('output_indices', idx)};\n var originalIdx: ${dType} = getOriginalCoordinateFromResizedCoordinate(output_index, ${scales[idx]},\n ${outputShape[idx]}, ${inputShape[idx]}, ${roi[idx]}, ${roi[idx]} + ${inputShape.length});\n var fractOriginalIdx: ${dType} = originalIdx - floor(originalIdx);\n var coefs = getCubicInterpolationCoefs(fractOriginalIdx);\n\n if (${useExtrapolation} && (originalIdx < 0 || originalIdx > (${inputShape[idx]} - 1))) {\n return ${extrapolationValue};\n }\n var data: array<${dType}, 4> = array<${dType}, 4>(0.0, 0.0, 0.0, 0.0);\n for (var i: i32 = -1; i < 3; i++) {\n var ${direction}: ${dType} = originalIdx + ${dType}(i);\n if (${direction} < 0 || ${direction} >= ${inputShape[idx]}) {\n ${(() => {\n if (excludeOutside) {\n return `coefs[i + 1] = 0.0;\n continue;`;\n } else if (useExtrapolation) {\n return `return ${extrapolationValue};`;\n } else {\n return `${direction} = max(0, min(${direction}, ${inputShape[idx]} - 1));`;\n }\n })()};\n }\n var input_indices_copy: ${input.type.indices} = input_indices;\n ${input.indicesSet('input_indices_copy', idx, `u32(${direction})`)};\n data[i + 1] = ${\n idx === heightIdx ? input.getByIndices('input_indices_copy') :\n 'rowCubicInterpolation(input_indices_copy, output_indices)'};\n }\n return cubicInterpolation1D(data, coefs);\n }`;\n };\n\n return `\n ${createCubicInterpolationFunction(heightIdx)};\n ${createCubicInterpolationFunction(widthIdx)};\n fn getCubicInterpolationCoefs(s: ${dType}) -> array<${dType}, 4> {\n var absS = abs(s);\n var coeffs: array<${dType}, 4> = array<${dType}, 4>(0.0, 0.0, 0.0, 0.0);\n var oneMinusAbsS: ${dType} = 1.0 - absS;\n var twoMinusAbsS: ${dType} = 2.0 - absS;\n var onePlusAbsS: ${dType} = 1.0 + absS;\n coeffs[0] = ((${cubicCoeffA} * onePlusAbsS - 5 * ${cubicCoeffA}) * onePlusAbsS + 8 * ${\n cubicCoeffA}) * onePlusAbsS - 4 * ${cubicCoeffA};\n coeffs[1] = ((${cubicCoeffA} + 2) * absS - (${cubicCoeffA} + 3)) * absS * absS + 1;\n coeffs[2] = ((${cubicCoeffA} + 2) * oneMinusAbsS - (${cubicCoeffA} + 3)) * oneMinusAbsS * oneMinusAbsS + 1;\n coeffs[3] = ((${cubicCoeffA} * twoMinusAbsS - 5 * ${cubicCoeffA}) * twoMinusAbsS + 8 * ${\n cubicCoeffA}) * twoMinusAbsS - 4 * ${cubicCoeffA};\n return coeffs;\n }\n\n fn cubicInterpolation1D(x: array<${dType}, 4>, coefs: array<${dType}, 4>) -> ${dType} {\n var coefsSum: ${dType} = coefs[0] + coefs[1] + coefs[2] + coefs[3];\n return (x[0] * coefs[0] + x[1] * coefs[1]+ x[2] * coefs[2]+ x[3] * coefs[3]) / coefsSum;\n }\n\n fn bicubicInterpolation(output_indices: ${output.type.indices}) -> ${dType} {\n var input_indices: ${input.type.indices} = output_indices;\n return colCubicInterpolation(input_indices, output_indices);\n }\n `;\n };\n\nconst trilinearInterpolation =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[], useExtrapolation: boolean,\n extrapolationValue: number): string => {\n const isNchw = true;\n const [batchIdx, depthIdx, heightIdx, widthIdx, channelIdx] =\n inputShape.length === 3 ? [-1, 0, 1, 2, -1] : (isNchw ? [0, 2, 3, 4, 1] : [0, 1, 2, 3, 4]);\n const dType = input.type.value;\n return `\n fn getInputValue(batch: u32, channel: u32, depth:u32, height: u32, width: u32) -> ${dType} {\n var input_indices: ${input.type.indices};\n ${input.indicesSet('input_indices', depthIdx, `max(0, min(depth, ${inputShape[depthIdx]} - 1))`)};\n ${input.indicesSet('input_indices', heightIdx, `max(0, min(height, ${inputShape[heightIdx]} - 1))`)};\n ${input.indicesSet('input_indices', widthIdx, `max(0, min(width, ${inputShape[widthIdx]} - 1))`)};\n ${setChannelAndBatchIndices(input, channelIdx, batchIdx, 3)}\n return ${input.getByIndices('input_indices')};\n }\n\n fn trilinearInterpolation(output_indices: ${output.type.indices}) -> ${dType} {\n var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices);\n var depth:${dType} = originalIndices[${depthIdx}];\n var height:${dType} = originalIndices[${heightIdx}];\n var width:${dType} = originalIndices[${widthIdx}];\n ${\n useExtrapolation ? `if (depth < 0 || depth > (${inputShape[depthIdx]} - 1) || height < 0 || height > (${\n inputShape[heightIdx]} - 1) || width < 0 || (width > ${inputShape[widthIdx]} - 1)) {\n return ${extrapolationValue};\n }` :\n ''};\n\n depth = max(0, min(depth, ${inputShape[depthIdx]} - 1));\n height = max(0, min(height, ${inputShape[heightIdx]} - 1));\n width = max(0, min(width, ${inputShape[widthIdx]} - 1));\n var depth1: u32 = u32(depth);\n var height1: u32 = u32(height);\n var width1: u32 = u32(width);\n var depth2: u32 = u32(depth + 1);\n var height2: u32 = u32(height + 1);\n var width2: u32 = u32(width + 1);\n var channel: u32 = ${inputShape.length > 3 ? `u32(originalIndices[${channelIdx}])` : '0'};\n var batch: u32 = ${inputShape.length > 3 ? `u32(originalIndices[${batchIdx}])` : '0'};\n\n var x111: ${dType} = getInputValue(batch, channel, depth1, height1, width1);\n var x112: ${dType} = getInputValue(batch, channel, depth1, height1, width2);\n var x121: ${dType} = getInputValue(batch, channel, depth1, height2, width1);\n var x122: ${dType} = getInputValue(batch, channel, depth1, height2, width2);\n var x211: ${dType} = getInputValue(batch, channel, depth2, height1, width1);\n var x212: ${dType} = getInputValue(batch, channel, depth2, height1, width2);\n var x221: ${dType} = getInputValue(batch, channel, depth2, height2, width1);\n var x222: ${dType} = getInputValue(batch, channel, depth2, height2, width2);\n var dx1: ${dType} = abs(depth - ${dType}(depth1));\n var dx2: ${dType} = abs(${dType}(depth2) - depth);\n var dy1: ${dType} = abs(height - ${dType}(height1));\n var dy2: ${dType} = abs(${dType}(height2) - height);\n var dz1: ${dType} = abs(width - ${dType}(width1));\n var dz2: ${dType} = abs(${dType}(width2) - width);\n if (depth1 == depth2) {\n dx1 = 0.5;\n dx2 = 0.5;\n }\n if (height1 == height2) {\n dy1 = 0.5;\n dy2 = 0.5;\n }\n if (width1 == width2) {\n dz1 = 0.5;\n dz2 = 0.5;\n }\n return (x111 * dx2 * dy2 * dz2 + x112 * dx2 * dy2 * dz1 + x121 * dx2 * dy1 *dz2 + x122 * dx2 * dy1 * dz1 +\n x211 * dx1 * dy2 * dz2 + x212 * dx1 * dy2 * dz1 + x221 * dx1 * dy1 *dz2 + x222 * dx1 * dy1 * dz1);\n }`;\n };\n\nconst createResizeProgramInfo =\n (inputTensor: TensorView, attributes: ResizeAttributes, opsetVersion: number, scalesInput: readonly number[],\n sizes: readonly number[], roiInput: readonly number[]): ProgramInfo => {\n const inputShape = inputTensor.dims;\n const roi = updateRoI(roiInput, attributes.axes, inputShape.length);\n\n let outputShape = initOutputShape(inputShape, scalesInput, sizes, attributes.axes);\n let scales = scalesInput.slice();\n if (scalesInput.length === 0) {\n scales = inputShape.map((value, index) => value === 0 ? 1.0 : outputShape[index] / value);\n if (attributes.keepAspectRatioPolicy !== 'stretch') {\n outputShape = adjustOutputShape(inputShape, scales, attributes);\n }\n }\n const output = outputVariable('output', inputTensor.dataType, outputShape.length);\n const input = inputVariable('input', inputTensor.dataType, inputShape.length);\n const outputSize = ShapeUtil.size(outputShape);\n const noScale = inputShape.length === outputShape.length && inputShape.every((d, i) => d === outputShape[i]);\n const useExtrapolation = attributes.coordinateTransformMode === 'tf_crop_and_resize';\n const extrapolationValue = attributes.extrapolationValue;\n const dataType = input.type.value;\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${noScale ? '' : `\n ${getOriginalCoordinateFromResizedCoordinate(attributes.coordinateTransformMode, dataType)};\n ${(() => {\n switch (attributes.mode) {\n case 'nearest':\n return `\n ${checkInputIndices(input, inputShape)};\n ${getNearestPixelFromOriginal(attributes.nearestMode, opsetVersion, dataType)};\n ${\n calculateInputIndicesFromOutputIndices(\n input, output, inputShape, outputShape, scales.length, roi.length, useExtrapolation)};\n `;\n case 'linear':\n return `\n ${calculateOriginalIndicesFromOutputIndices(output, inputShape, outputShape, scales.length, roi.length)};\n ${(() => {\n if (inputShape.length === 2 || inputShape.length === 4) {\n return `${bilinearInterpolation(input, output, inputShape, useExtrapolation, extrapolationValue)}`;\n } else if (inputShape.length === 3 || inputShape.length === 5) {\n return `${trilinearInterpolation(input, output, inputShape, useExtrapolation, extrapolationValue)}`;\n } else {\n throw Error('Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.');\n }\n })()};\n `;\n case 'cubic':\n return `\n ${(() => {\n if (inputShape.length === 2 || inputShape.length === 4) {\n return `${\n bicubicInterpolation(\n input, output, inputShape, outputShape, scales, roi, attributes.cubicCoeffA, useExtrapolation,\n attributes.extrapolationValue, attributes.excludeOutside)}`;\n } else {\n throw Error('Cubic mode only supports input dims 2 and 4 are supported in linear mode.');\n }\n })()};\n `;\n default:\n throw Error('Invalid resize mode');\n }\n })()};\n `}\n ${\n shaderHelper.registerUniform('output_size', 'u32')\n .registerUniform('scales', 'f32', scales.length)\n .registerUniform('roi', 'f32', roi.length)\n .declareVariables(input, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.output_size')}\n ${noScale ? 'output[global_idx] = input[global_idx];' : `\n let output_indices = ${output.offsetToIndices('global_idx')};\n var input_indices: ${input.type.indices};\n ${(() => {\n switch (attributes.mode) {\n case 'nearest':\n return `input_indices = calculateInputIndicesFromOutputIndices(output_indices);\n if (checkInputIndices(input_indices)) {\n output[global_idx] = ${input.getByIndices('input_indices')};\n } else {\n output[global_idx] = ${attributes.extrapolationValue};\n }`;\n case 'linear':\n return `output[global_idx] = ${\n (inputShape.length === 2 || inputShape.length === 4) ? 'bilinearInterpolation' :\n 'trilinearInterpolation'}(output_indices);`;\n case 'cubic':\n return 'output[global_idx] = bicubicInterpolation(output_indices);';\n default:\n throw Error(`Unsupported resize mode: ${attributes.mode}`);\n }\n })()};\n`}\n }`;\n\n return {\n name: 'Resize',\n shaderCache: {\n hint: `${attributes.cacheKey}|${opsetVersion}|${scales.length > 0 ? scales : ''}|${\n sizes.length > 0 ? sizes : ''}|${roi.length > 0 ? roi : ''}|${noScale}|${inputShape}`,\n inputDependencies: ['rank']\n },\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: inputTensor.dataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */)},\n programUniforms: [\n {type: DataType.uint32, data: outputSize}, {type: DataType.float, data: scales},\n {type: DataType.float, data: roi}, ...createTensorShapeVariables(inputShape, outputShape)\n ]\n })\n };\n };\n\nconst getOpsetVersionFromCustomDataBuffer = (context: ComputeContext): number => {\n const customDataBuffer = context.customDataBuffer;\n const customDataBuffer32 = new Uint32Array(customDataBuffer, customDataBuffer.byteOffset, 1);\n const opsetVersion = customDataBuffer32[0];\n return opsetVersion;\n};\n\nexport const resize = (context: ComputeContext, attributes: ResizeAttributes): void => {\n const scales: number[] = [];\n const sizes: number[] = [];\n const roi: number[] = [];\n\n // Note that scales in resize are always f32. roi can be f32 or f16.\n // TODO: Currently this code does not support f16 for roi when passed as optional input.\n\n const opsetVersion = getOpsetVersionFromCustomDataBuffer(context);\n if (attributes.antialias !== 0) {\n throw Error('Only default value (0) for Antialias attribute is supported');\n }\n validateInputs(context.inputs, attributes, opsetVersion, scales, sizes, roi);\n context.compute(\n createResizeProgramInfo(context.inputs[0], attributes, opsetVersion, scales, sizes, roi), {inputs: [0]});\n};\n\nexport const parseResizeAttributes = (attributes: Record): ResizeAttributes => {\n const antialias = attributes.antialias as number;\n const axes = attributes.axes as number[];\n const coordinateTransformMode: CoordinateTransformMode =\n attributes.coordinateTransformMode as CoordinateTransformMode;\n const cubicCoeffA = attributes.cubicCoeffA as number;\n const excludeOutside = attributes.excludeOutside as number !== 0;\n const extrapolationValue = attributes.extrapolationValue as number;\n const keepAspectRatioPolicy: KeepAspectRatioPolicy = attributes.keepAspectRatioPolicy as KeepAspectRatioPolicy;\n const mode: Mode = attributes.mode as Mode;\n // If nearestMode is not specified, use simple mode.\n const nearestMode: NearestMode = (attributes.nearestMode === '' ? 'simple' : attributes.nearestMode) as NearestMode;\n return createAttributeWithCacheKey({\n antialias,\n axes,\n coordinateTransformMode,\n cubicCoeffA,\n excludeOutside,\n extrapolationValue,\n keepAspectRatioPolicy,\n mode,\n nearestMode\n });\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper, WORKGROUP_SIZE} from './common';\n\nexport interface RotaryEmbeddingAttributes {\n readonly interleaved: boolean;\n readonly numHeads: number;\n readonly rotaryEmbeddingDim: number;\n readonly scale: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: RotaryEmbeddingAttributes): void => {\n const [input, positionIds, cosCache, sinCache] = inputs;\n const {numHeads, rotaryEmbeddingDim} = attributes;\n\n if (input.dims.length !== 3 && input.dims.length !== 4) {\n throw new Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${input.dims.length}`);\n }\n if (!ShapeUtil.areEqual(positionIds.dims, []) && !ShapeUtil.areEqual(positionIds.dims, [1]) &&\n positionIds.dims.length !== 2) {\n throw new Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${positionIds.dims.length}`);\n }\n if (cosCache.dims.length !== 2) {\n throw new Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${cosCache.dims.length}`);\n }\n if (sinCache.dims.length !== 2) {\n throw new Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${sinCache.dims.length}`);\n }\n if (!ShapeUtil.areEqual(cosCache.dims, sinCache.dims)) {\n throw new Error('Inputs \\'cos_cache\\' and \\'sin_cache\\' are expected to have the same shape');\n }\n\n if (rotaryEmbeddingDim > 0 && numHeads === 0) {\n throw new Error('num_heads must be provided if rotary_embedding_dim is specified');\n }\n\n const batchSize = input.dims[0];\n const sequenceLength = input.dims[input.dims.length - 2];\n const maxSequenceLength = cosCache.dims[0];\n const hiddenSize = ShapeUtil.sizeFromDimension(input.dims, 1) / sequenceLength;\n const headSize = rotaryEmbeddingDim === 0 ? cosCache.dims[1] * 2 : hiddenSize / numHeads;\n if (rotaryEmbeddingDim > headSize) {\n throw new Error('rotary_embedding_dim must be less than or equal to head_size');\n }\n\n if (positionIds.dims.length === 2) {\n if (batchSize !== positionIds.dims[0]) {\n throw new Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${positionIds.dims[0]}`);\n }\n if (sequenceLength !== positionIds.dims[1]) {\n throw new Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${positionIds.dims[1]}`);\n }\n }\n\n if (headSize / 2 !== cosCache.dims[1] && rotaryEmbeddingDim / 2 !== cosCache.dims[1]) {\n throw new Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${\n cosCache.dims[1]}`);\n }\n\n if (sequenceLength > maxSequenceLength) {\n throw new Error('Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported');\n }\n};\n\nconst createRotaryEmbeddingProgramInfo =\n (inputs: readonly TensorView[], attributes: RotaryEmbeddingAttributes): ProgramInfo => {\n const {interleaved, numHeads, rotaryEmbeddingDim, scale} = attributes;\n const batchSize = inputs[0].dims[0];\n const batchStride = ShapeUtil.sizeFromDimension(inputs[0].dims, 1);\n const sequenceLength = inputs[0].dims[inputs[0].dims.length - 2];\n const hiddenSize = batchStride / sequenceLength;\n const halfRotaryEmbeddingDim = inputs[2].dims[1];\n const headSize = rotaryEmbeddingDim === 0 ? halfRotaryEmbeddingDim * 2 : hiddenSize / numHeads;\n\n // Rotary embeddings will be calculated in a pair-wise fashion. In accordance, use the shape\n // [batch size, sequence length, num of heads, num of pairs to rotate + num of dims to copy]\n // to unfold the global index in shader.\n const globalShape =\n new Array(batchSize, sequenceLength, hiddenSize / headSize, headSize - halfRotaryEmbeddingDim);\n const globalStrides = ShapeUtil.computeStrides(globalShape);\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.float, data: scale},\n {type: DataType.uint32, data: globalShape},\n {type: DataType.uint32, data: globalStrides},\n\n // strides for addressing the input/output tensor, in permutated order to align with the unfolded global index,\n // i.e. BSNH\n ...(inputs[0].dims.length === 3 ?\n new Array({type: DataType.uint32, data: [batchStride, hiddenSize, headSize, 1]}) :\n []),\n ...(inputs[0].dims.length === 4 ?\n new Array(\n {type: DataType.uint32, data: [batchStride, headSize, sequenceLength * headSize, 1]}) :\n []),\n\n ...createTensorShapeVariables(inputs[0].dims, inputs[1].dims, inputs[2].dims, inputs[3].dims, inputs[0].dims),\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const input = inputVariable('input', inputs[0].dataType, inputs[0].dims.length);\n const positionIds = inputVariable('position_ids', inputs[1].dataType, inputs[1].dims.length);\n const cosCache = inputVariable('cos_cache', inputs[2].dataType, inputs[2].dims.length);\n const sinCache = inputVariable('sin_cache', inputs[3].dataType, inputs[3].dims.length);\n const output = outputVariable('output', inputs[0].dataType, inputs[0].dims.length);\n\n shaderHelper.registerUniforms([\n {name: 'scale', type: 'f32'},\n {name: 'global_shape', type: 'u32', length: globalShape.length},\n {name: 'global_strides', type: 'u32', length: globalStrides.length},\n {name: 'input_output_strides', type: 'u32', length: globalStrides.length},\n ]);\n\n return `\n ${shaderHelper.declareVariables(input, positionIds, cosCache, sinCache, output)}\n\n ${shaderHelper.mainStart(WORKGROUP_SIZE)}\n let half_rotary_emb_dim = uniforms.${cosCache.name}_shape[1];\n let bsnh = global_idx / uniforms.global_strides % uniforms.global_shape;\n let size = uniforms.global_shape[0] * uniforms.global_strides[0];\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('size')}\n\n if (bsnh[3] < half_rotary_emb_dim) {\n let position_ids_idx =\n ${positionIds.broadcastedIndicesToOffset('bsnh.xy', outputVariable('', positionIds.type.tensor, 2))};\n let position_id =\n u32(${positionIds.getByOffset('position_ids_idx')}) + select(0, bsnh[1], position_ids_idx == 0);\n let i = dot(bsnh, uniforms.input_output_strides) + select(0, bsnh[3], ${interleaved});\n let j = i + select(half_rotary_emb_dim, 1, ${interleaved});\n let re = ${input.getByOffset('i')} * ${cosCache.get('position_id', 'bsnh[3]')} -\n ${input.getByOffset('j')} * ${sinCache.get('position_id', 'bsnh[3]')};\n ${output.setByOffset('i', 're')}\n let im = ${input.getByOffset('i')} * ${sinCache.get('position_id', 'bsnh[3]')} +\n ${input.getByOffset('j')} * ${cosCache.get('position_id', 'bsnh[3]')};\n ${output.setByOffset('j', 'im')}\n } else {\n let k = dot(bsnh, uniforms.input_output_strides) + half_rotary_emb_dim;\n ${output.setByOffset('k', input.getByOffset('k'))}\n }\n }`;\n };\n\n return {\n name: 'RotaryEmbedding',\n shaderCache: {\n hint: createAttributeWithCacheKey({\n interleaved,\n }).cacheKey,\n inputDependencies: ['rank', 'rank', 'rank', 'rank'],\n },\n getShaderSource,\n getRunData: () => ({\n outputs: [{dims: inputs[0].dims, dataType: inputs[0].dataType}],\n dispatchGroup: {x: Math.ceil(ShapeUtil.size(globalShape) / WORKGROUP_SIZE)},\n programUniforms,\n }),\n };\n };\n\nexport const rotaryEmbedding = (context: ComputeContext, attributes: RotaryEmbeddingAttributes): void => {\n validateInputs(context.inputs, attributes);\n context.compute(createRotaryEmbeddingProgramInfo(context.inputs, attributes));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo, ProgramUniform} from '../types';\n\nimport {castToF32, getMaxComponents, inputVariable, outputVariable, ShaderHelper, sumVector, tensorTypeToWsglStorageType, UniformsArrayType} from './common';\n\nexport interface SkipLayerNormAttributes {\n simplified: boolean;\n epsilon: number;\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length < 3) {\n throw new Error('layerNorm requires at least 3 inputs.');\n }\n\n const input: TensorView = inputs[0];\n const skip: TensorView = inputs[1];\n const gamma: TensorView = inputs[2];\n\n if (input.dataType !== skip.dataType || input.dataType !== gamma.dataType) {\n throw new Error('All inputs must have the same data type');\n }\n\n if (input.dims.length !== 3 && input.dims.length !== 2) {\n throw new Error('Input must be 2D or 3D');\n }\n\n if (skip.dims.length !== 3 && skip.dims.length !== 2) {\n throw new Error('Skip must be 2D or 3D');\n }\n\n const hiddenSize = input.dims[input.dims.length - 1];\n const sequenceLength = input.dims[input.dims.length - 2];\n if (skip.dims[skip.dims.length - 1] !== hiddenSize) {\n throw new Error('Skip must have the same hidden size as input');\n }\n if (skip.dims[skip.dims.length - 2] !== sequenceLength) {\n throw new Error('Skip must have the same sequence length as input');\n }\n\n if (gamma.dims.length !== 1) {\n throw new Error('Gamma must be 1D');\n }\n if (gamma.dims[gamma.dims.length - 1] !== hiddenSize) {\n throw new Error('Gamma must have the same hidden size as input');\n }\n if (inputs.length > 3) {\n const beta: TensorView = inputs[3];\n if (beta.dims.length !== 1) {\n throw new Error('Beta must be 1D');\n }\n if (beta.dims[beta.dims.length - 1] !== hiddenSize) {\n throw new Error('Beta must have the same hidden size as input');\n }\n }\n if (inputs.length > 4) {\n const bias: TensorView = inputs[4];\n if (bias.dims.length !== 1) {\n throw new Error('Bias must be 1D');\n }\n if (bias.dims[bias.dims.length - 1] !== hiddenSize) {\n throw new Error('Bias must have the same hidden size as input');\n }\n }\n};\n\nconst createSkipLayerNormProgramInfo =\n (inputs: readonly TensorView[], attributes: SkipLayerNormAttributes, outputCount: number, isTraining: boolean):\n ProgramInfo => {\n const simplified = attributes.simplified;\n\n const inputShape = inputs[0].dims;\n const inputSize = ShapeUtil.size(inputShape);\n const outputShape = inputShape;\n const outputSize = inputSize;\n const hiddenSize = inputShape.slice(-1)[0];\n const meanInvStdDevDim = isTraining ? inputShape.slice(0, -1).concat(1) : [];\n const hasBetaInput = !simplified && inputs.length > 3;\n const hasBiasInput = inputs.length > 4;\n const hasMeanOutput = isTraining && outputCount > 1;\n const hasInvStdDevOutput = isTraining && outputCount > 2;\n const hasInputSkipBiasSumOutput = outputCount > 3;\n const workgroupSize = 64;\n\n const components = getMaxComponents(hiddenSize);\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize},\n {type: DataType.uint32, data: components},\n {type: DataType.uint32, data: hiddenSize},\n {type: DataType.float, data: attributes.epsilon},\n ];\n const getShaderSource = (shaderHelper: ShaderHelper) => {\n const uniformsArray: UniformsArrayType = [\n {name: 'output_size', type: 'u32'},\n {name: 'components', type: 'u32'},\n {name: 'hidden_size', type: 'u32'},\n {name: 'epsilon', type: 'f32'},\n ];\n const variables = [\n inputVariable('x', inputs[0].dataType, inputs[0].dims, components),\n inputVariable('skip', inputs[1].dataType, inputs[1].dims, components),\n inputVariable('gamma', inputs[2].dataType, inputs[2].dims, components),\n ];\n if (hasBetaInput) {\n variables.push(inputVariable('beta', inputs[3].dataType, inputs[3].dims, components));\n }\n if (hasBiasInput) {\n variables.push(inputVariable('bias', inputs[4].dataType, inputs[4].dims, components));\n }\n variables.push(outputVariable('output', inputs[0].dataType, outputShape, components));\n if (hasMeanOutput) {\n variables.push(outputVariable('mean_output', DataType.float, meanInvStdDevDim));\n }\n if (hasInvStdDevOutput) {\n variables.push(outputVariable('inv_std_output', DataType.float, meanInvStdDevDim));\n }\n if (hasInputSkipBiasSumOutput) {\n variables.push(outputVariable('input_skip_bias_sum', inputs[0].dataType, outputShape, components));\n }\n const dataType = tensorTypeToWsglStorageType(inputs[0].dataType);\n const vecDataType = tensorTypeToWsglStorageType(DataType.float, components);\n return `\n\n ${shaderHelper.registerUniforms(uniformsArray).declareVariables(...variables)}\n var sum_shared : array<${vecDataType}, ${workgroupSize}>;\n var sum_squared_shared : array<${vecDataType}, ${workgroupSize}>;\n\n ${shaderHelper.mainStart([\n workgroupSize, 1, 1\n ])}\n let ix = local_id.x;\n let iy = global_id.x / ${workgroupSize};\n\n let hidden_size_vectorized: u32 = uniforms.hidden_size / uniforms.components;\n var stride = hidden_size_vectorized / ${workgroupSize};\n let offset = ix * stride + iy * hidden_size_vectorized;\n let offset1d = stride * ix;\n if (ix == ${workgroupSize - 1}) {\n stride = hidden_size_vectorized - stride * ix;\n }\n for (var i: u32 = 0; i < stride; i++) {\n let skip_value = skip[offset + i];\n let bias_value = ${hasBiasInput ? 'bias[offset1d + i]' : dataType + '(0.0)'};\n let input_value = x[offset + i];\n let value = input_value + skip_value + bias_value;\n ${hasInputSkipBiasSumOutput ? 'input_skip_bias_sum[offset + i] = value;' : ''}\n output[offset + i] = value;\n let f32_value = ${castToF32(dataType, components, 'value')};\n sum_shared[ix] += f32_value;\n sum_squared_shared[ix] += f32_value * f32_value;\n }\n workgroupBarrier();\n\n var reduce_size : u32 = ${workgroupSize};\n for (var curr_size = reduce_size >> 1; curr_size > 0; curr_size = reduce_size >> 1) {\n reduce_size = curr_size + (reduce_size & 1);\n if (ix < curr_size) {\n sum_shared[ix] += sum_shared[ix + reduce_size];\n sum_squared_shared[ix] += sum_squared_shared[ix + reduce_size];\n }\n workgroupBarrier();\n }\n\n let sum = sum_shared[0];\n let square_sum = sum_squared_shared[0];\n let mean = ${sumVector('sum', components)} / f32(uniforms.hidden_size);\n let inv_std_dev = inverseSqrt(${sumVector('square_sum', components)} / f32(uniforms.hidden_size) ${\n simplified ? '' : '- mean * mean'} + uniforms.epsilon);\n ${hasMeanOutput ? 'mean_output[global_idx] = mean;' : ''}\n ${hasInvStdDevOutput ? 'inv_std_output[global_idx] = inv_std_dev;' : ''}\n\n for (var i: u32 = 0; i < stride; i++) {\n output[offset + i] = (output[offset + i] ${simplified ? '' : `- ${dataType}(mean)`}) *\n ${dataType}(inv_std_dev) * gamma[offset1d + i]\n ${hasBetaInput ? '+ beta[offset1d + i]' : ''};\n }\n }`;\n };\n const outputs = [{dims: outputShape, dataType: inputs[0].dataType}];\n if (outputCount > 1) {\n outputs.push({dims: meanInvStdDevDim, dataType: DataType.float});\n }\n if (outputCount > 2) {\n outputs.push({dims: meanInvStdDevDim, dataType: DataType.float});\n }\n if (outputCount > 3) {\n outputs.push({dims: inputShape, dataType: inputs[0].dataType});\n }\n return {\n name: 'SkipLayerNormalization',\n shaderCache: {\n hint: `${components};${hasMeanOutput};${hasInvStdDevOutput};${hasInputSkipBiasSumOutput}`,\n inputDependencies: inputs.map((_input, _index) => 'type')\n },\n getShaderSource,\n getRunData: () => ({\n outputs,\n dispatchGroup: {\n x: Math.ceil(outputSize / hiddenSize),\n },\n programUniforms\n }),\n };\n };\n\nexport const skipLayerNorm = (context: ComputeContext, attributes: SkipLayerNormAttributes): void => {\n // TODO: initialize isTraining from ComputeContext\n const isTraining = false;\n validateInputs(context.inputs);\n // Mean and InvStdDev are only used in training mode and are not required for inference.\n // They are added here for completeness only.\n const outputs = [0];\n if (context.outputCount > 1) {\n outputs.push(isTraining ? 1 : -3);\n }\n if (context.outputCount > 2) {\n outputs.push(isTraining ? 2 : -3);\n }\n if (context.outputCount > 3) {\n outputs.push(3);\n }\n context.compute(\n createSkipLayerNormProgramInfo(context.inputs, attributes, context.outputCount, isTraining), {outputs});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform, TensorInfo} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper, UniformsArrayType} from './common';\n\nexport interface SliceAttributes extends AttributeWithCacheKey {\n readonly starts: number[];\n readonly ends: number[];\n readonly axes: number[];\n}\n\nconst validateInputs = (inputs: readonly TensorView[], attributes: SliceAttributes): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('too few inputs');\n }\n if (attributes.axes.length !== 0) {\n if (attributes.axes.length !== attributes.starts.length || attributes.axes.length !== attributes.ends.length) {\n throw new Error('axes, starts and ends must have the same length');\n }\n } else if (attributes.starts.length !== attributes.ends.length) {\n throw new Error('starts and ends must have the same length');\n }\n inputs.slice(1).forEach((_, idx) => {\n if (inputs[idx + 1].dataType !== DataType.int32 && inputs[idx + 1].dataType !== DataType.int64) {\n throw new Error(`Input ${idx} must be an array of int32 or int64`);\n }\n });\n};\n\nconst readInput = (inputs: readonly TensorView[], idx: number): number[] => {\n const input: number[] = [];\n if (inputs.length > idx) {\n if (inputs[idx].dataType === DataType.int64) {\n inputs[idx].getBigInt64Array().forEach(v => input.push(Number(v)));\n } else if (inputs[idx].dataType === DataType.int32) {\n inputs[idx].getInt32Array().forEach(v => input.push(Number(v)));\n } else {\n throw new Error(`Input ${idx} must be an array of int32 or int64`);\n }\n }\n return input;\n};\n\nconst createSliceAttributesFromInputs =\n (inputs: readonly TensorView[], attributes: SliceAttributes): SliceAttributes => {\n if (inputs.length > 1) {\n const starts: number[] = readInput(inputs, 1);\n const ends: number[] = readInput(inputs, 2);\n let axes: number[] = readInput(inputs, 3);\n if (axes.length === 0) {\n axes = [...Array(inputs[0].dims.length).keys()];\n }\n return createAttributeWithCacheKey({starts, ends, axes});\n } else {\n return attributes;\n }\n };\n\nconst fixStartEndValues =\n (value: number, index: number, inputShape: readonly number[], axes: readonly number[], steps: readonly number[]):\n number => {\n let newValue = value;\n if (value < 0) {\n newValue += inputShape[axes[index]];\n }\n if (steps[index] < 0) {\n return Math.max(0, Math.min(newValue, inputShape[axes[index]] - 1));\n } else {\n return Math.max(0, Math.min(newValue, inputShape[axes[index]]));\n }\n };\n\nconst calculateInputIndicesImpl =\n (input: IndicesHelper, output: IndicesHelper, inputShape: readonly number[]): string =>\n `fn calculateInputIndices(output_indices: ${output.type.indices}) -> ${input.type.indices} {\n var input_indices: ${input.type.indices};\n var carry = 0u;\n for (var i = ${inputShape.length}; i >= 0; i--) {\n let input_shape_i = ${getElementAt('uniforms.input_shape', 'i', inputShape.length)};\n let steps_i = ${getElementAt('uniforms.steps', 'i', inputShape.length)};\n let signs_i = ${getElementAt('uniforms.signs', 'i', inputShape.length)};\n let starts_i = ${getElementAt('uniforms.starts', 'i', inputShape.length)};\n var output_index = ${output.indicesGet('output_indices', 'i')};\n var input_index = output_index * steps_i + starts_i + carry;\n carry = input_index / input_shape_i;\n input_index = input_index % input_shape_i;\n if (signs_i < 0) {\n input_index = input_shape_i - input_index - 1u + starts_i;\n }\n ${input.indicesSet('input_indices', 'i', 'input_index')};\n }\n return input_indices;\n }`;\n\nconst createSliceProgramInfo = (inputs: readonly TensorView[], attributes: SliceAttributes): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const inputSize = ShapeUtil.size(inputShape);\n const axes = (attributes.axes.length > 0) ? ShapeUtil.normalizeAxes(attributes.axes, inputShape.length) :\n [...Array(inputShape.length).keys()];\n let steps = readInput(inputs, 4);\n steps.forEach((step) => step !== 0 || (() => {\n throw new Error('step cannot be 0');\n }));\n if (steps.length === 0) {\n steps = Array(axes.length).fill(1);\n }\n const starts = attributes.starts.map((start, i) => fixStartEndValues(start, i, inputShape, axes, steps));\n\n const ends = attributes.ends.map((end, i) => fixStartEndValues(end, i, inputShape, axes, steps));\n\n if (axes.length !== starts.length || axes.length !== ends.length) {\n throw new Error('start, ends and axes should have the same number of elements');\n }\n\n if (axes.length !== inputShape.length) {\n for (let i = 0; i < inputShape.length; ++i) {\n if (!axes.includes(i)) {\n starts.splice(i, 0, 0);\n ends.splice(i, 0, inputShape[i]);\n steps.splice(i, 0, 1);\n }\n }\n }\n const signs = steps.map(step => Math.sign(step));\n // Convert negative steps to positive steps and reverse starts and ends\n steps.forEach((step, i, array) => {\n if (step < 0) {\n const numSteps = (ends[i] - starts[i]) / step;\n const newEnd = starts[i];\n const newStart = newEnd + numSteps * steps[i];\n starts[i] = newStart;\n ends[i] = newEnd;\n array[i] = -step;\n }\n });\n // Output rank is expected to be less than or equal to the input rank.\n const outputShape = inputShape.slice(0);\n axes.forEach((axis, _) => {\n outputShape[axis] = Math.ceil((ends[axis] - starts[axis]) / steps[axis]);\n });\n const outputTensorInfo: TensorInfo = {dims: outputShape, dataType: inputs[0].dataType};\n\n const output = outputVariable('output', inputs[0].dataType, outputShape.length);\n const input = inputVariable('input', inputs[0].dataType, inputs[0].dims.length);\n const outputSize = ShapeUtil.size(outputShape);\n const uniforms: UniformsArrayType = [\n {name: 'outputSize', type: 'u32'}, {name: 'starts', type: 'u32', length: starts.length},\n {name: 'signs', type: 'i32', length: signs.length}, {name: 'steps', type: 'u32', length: steps.length}\n ];\n\n const programUniforms: ProgramUniform[] = [\n {type: DataType.uint32, data: outputSize}, {type: DataType.uint32, data: starts},\n {type: DataType.int32, data: signs}, {type: DataType.uint32, data: steps},\n ...createTensorShapeVariables(inputs[0].dims, outputShape)\n ];\n\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${shaderHelper.registerUniforms(uniforms).declareVariables(input, output)}\n ${calculateInputIndicesImpl(input, output, inputShape)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.outputSize')}\n let output_indices = ${output.offsetToIndices('global_idx')};\n let input_indices = calculateInputIndices(output_indices);\n ${output.setByOffset('global_idx', input.getByIndices('input_indices'))}\n }`;\n return {\n name: 'Slice',\n shaderCache: {hint: `${signs.length}_${starts.length}_${steps.length}`, inputDependencies: ['rank']},\n getShaderSource,\n getRunData: () => ({\n outputs: [outputTensorInfo],\n dispatchGroup: {x: Math.ceil(inputSize / 64 /* workgroup size */)},\n programUniforms\n })\n };\n};\n\nexport const slice = (context: ComputeContext, attributes: SliceAttributes): void => {\n validateInputs(context.inputs, attributes);\n const updatedAttributes = createSliceAttributesFromInputs(context.inputs, attributes);\n context.compute(createSliceProgramInfo(context.inputs, updatedAttributes), {inputs: [0]});\n // if (ShapeUtil.size(program.outputs[0].dims) > 0) {\n // context.compute(programInfoLoader, {inputs: [0]});\n // } else {\n // // TODO: support empty output\n // throw new Error('slice: output size is 0');\n // }\n};\n\nexport const parseSliceAttributes = (attributes: Record): SliceAttributes => {\n const starts = attributes.starts as number[];\n const ends = attributes.ends as number[];\n const axes = attributes.axes as number[];\n return createAttributeWithCacheKey({starts, ends, axes});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// TODO: this is the same naive implementation we use for reduce that has\n// performance limitations when the reduced axis is long. Need to add\n// a optimized codepath for this.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {getMaxComponents, inputVariable, outputVariable, ShaderHelper, sumVector, tensorTypeToWsglStorageType} from './common';\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length !== 1) {\n throw new Error('Softmax op requires 1 input.');\n }\n};\n\nexport interface SoftmaxAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n}\n\nconst createSoftmaxProgramInfo = (input: TensorView, attributes: SoftmaxAttributes): ProgramInfo => {\n const shape = input.dims;\n const outputSize = ShapeUtil.size(shape);\n const WG = 64;\n let axis = attributes.axis;\n if (axis < 0) {\n axis = shape.length + axis;\n }\n if (axis < shape.length - 1) {\n throw new Error('softmax only supports last axis for now.');\n }\n\n const cols = shape[axis];\n const rows = outputSize / cols;\n const components = getMaxComponents(cols);\n const packedCols = cols / components;\n\n const maxVector = (name: string, components: number) => {\n if (components === 4) {\n return `max(max(${name}.x, ${name}.y), max(${name}.z, ${name}.w))`;\n } else if (components === 2) {\n return `max(${name}.x, ${name}.y)`;\n } else if (components === 3) {\n return `max(max(${name}.x, ${name}.y), ${name}.z)`;\n }\n\n return name;\n };\n const x = inputVariable('x', input.dataType, input.dims, components);\n const output = outputVariable('result', input.dataType, input.dims, components);\n const valueType = x.type.value;\n // 6.2.4 in wgsl spec\n const threadMaxDecl = tensorTypeToWsglStorageType(input.dataType) === 'f32' ?\n `var threadMax = ${valueType}(-3.402823e+38f);` :\n `var threadMax = ${valueType}(-65504.0h);`;\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n var rowMaxShared : ${valueType};\n var rowSumShared : ${valueType};\n var threadShared : array<${valueType}, ${WG}>;\n\n fn getValue(row: i32, col: i32, row_stride: i32) -> ${valueType} {\n let index = row * row_stride + col;\n return x[index];\n }\n\n fn setValue(row: i32, col: i32, row_stride: i32, value: ${valueType}) {\n let index = row * row_stride + col;\n result[index] = value;\n }\n ${shaderHelper.registerUniform('packedCols', 'i32').declareVariables(x, output)}\n ${shaderHelper.mainStart()}\n let gindex = i32(global_idx);\n let lindex = i32(local_idx);\n const wg = ${WG};\n let row = gindex / wg;\n let cols = uniforms.packedCols;\n let row_stride : i32 = uniforms.packedCols;\n\n // find the rows max\n ${threadMaxDecl}\n for (var col = lindex; col < cols; col += wg) {\n let value = getValue(row, col, row_stride);\n threadMax = max(threadMax, value);\n }\n if (lindex < cols) {\n threadShared[lindex] = threadMax;\n }\n workgroupBarrier();\n\n var reduceSize = min(cols, wg);\n for (var currSize = reduceSize >> 1; currSize > 0; currSize = reduceSize >> 1) {\n reduceSize = currSize + (reduceSize & 1);\n if (lindex < currSize) {\n threadShared[lindex] = max(threadShared[lindex], threadShared[lindex + reduceSize]);\n }\n workgroupBarrier();\n }\n if (lindex == 0) {\n rowMaxShared = ${valueType}(${maxVector('threadShared[0]', components)});\n }\n workgroupBarrier();\n\n // find the rows sum\n var threadSum = ${valueType}(0.0);\n for (var col = lindex; col < cols; col += wg) {\n let subExp = exp(getValue(row, col, row_stride) - rowMaxShared);\n threadSum += subExp;\n }\n threadShared[lindex] = threadSum;\n workgroupBarrier();\n\n for (var currSize = wg >> 1; currSize > 0; currSize = currSize >> 1) {\n if (lindex < currSize) {\n threadShared[lindex] = threadShared[lindex] + threadShared[lindex + currSize];\n }\n workgroupBarrier();\n }\n if (lindex == 0) {\n rowSumShared = ${valueType}(${sumVector('threadShared[0]', components)});\n }\n workgroupBarrier();\n\n // calculate final value for each element in the row\n for (var col = lindex; col < cols; col += wg) {\n let value = exp(getValue(row, col, row_stride) - rowMaxShared) / rowSumShared;\n setValue(row, col, row_stride, value);\n }\n }`;\n return {\n name: 'Softmax',\n shaderCache: {hint: `${components}`, inputDependencies: ['type']},\n getRunData: () => ({\n outputs: [{dims: shape, dataType: input.dataType}],\n dispatchGroup: {x: rows},\n programUniforms: [{type: DataType.int32, data: packedCols}]\n }),\n getShaderSource,\n };\n};\n\nexport const softmax = (context: ComputeContext, attributes: SoftmaxAttributes): void => {\n validateInputs(context.inputs);\n context.compute(createSoftmaxProgramInfo(context.inputs[0], attributes));\n};\n\nexport const parseSoftmaxAttributes = (attributes: Record): SoftmaxAttributes =>\n createAttributeWithCacheKey({axis: attributes.axis as number});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {ShapeUtil} from '../../util';\nimport {AttributeWithCacheKey, createAttributeWithCacheKey} from '../attribute-with-cache-key';\nimport {ComputeContext, ProgramInfo, ProgramUniform, TensorInfo} from '../types';\n\nimport {createTensorShapeVariables, getElementAt, IndicesHelper, inputVariable, outputVariable, ShaderHelper} from './common';\n\nexport interface SplitAttributes extends AttributeWithCacheKey {\n readonly axis: number;\n readonly numOutputs: number;\n readonly splitSizes: number[];\n}\n\nconst validateInputs = (inputs: readonly TensorView[]): void => {\n if (!inputs || inputs.length < 1) {\n throw new Error('too few inputs');\n }\n};\n\nconst createSplitAttributesFromInputs =\n (inputs: readonly TensorView[], attributes: SplitAttributes): SplitAttributes => {\n const splitSizes: number[] = [];\n let numOutputs: number = attributes.numOutputs;\n if (inputs[1].dims[0] > 0) {\n inputs[1].getBigInt64Array().forEach(v => splitSizes.push(Number(v)));\n numOutputs = splitSizes.length;\n }\n return createAttributeWithCacheKey({numOutputs, axis: attributes.axis, splitSizes});\n };\n\nconst calculateOutputIndexImpl = (numberOfTensors: number): string => `\nfn calculateOutputIndex(index: u32) -> u32 {\n for (var i: u32 = 0u; i < ${numberOfTensors}u; i += 1u ) {\n if (index < ${getElementAt('uniforms.size_in_split_axis', 'i', numberOfTensors)}) {\n return i;\n }\n }\n return ${numberOfTensors}u;\n}`;\nconst writeBufferDataImpl = (outputs: readonly IndicesHelper[]) => {\n const numberOfTensors = outputs.length;\n const codeLines: string[] = [];\n for (let i = 0; i < numberOfTensors; ++i) {\n const returnSnippet = outputs[i].setByIndices('indices', 'input[global_idx]');\n if (numberOfTensors === 1) {\n codeLines.push(returnSnippet);\n } else if (i === 0) {\n codeLines.push(`if (output_number == ${i}u) { ${returnSnippet} }`);\n } else if (i === numberOfTensors - 1) {\n codeLines.push(`else { ${returnSnippet} }`);\n } else {\n codeLines.push(`else if (output_number == ${i}) { ${returnSnippet} }`);\n }\n }\n return `\n fn writeBufferData(output_number: u32, indices: ${outputs[0].type.indices}, global_idx: u32) {\n ${codeLines.join('\\n')}\n }`;\n};\n\nconst createSplitProgramInfo = (inputs: readonly TensorView[], attributes: SplitAttributes): ProgramInfo => {\n const inputShape = inputs[0].dims;\n const inputSize = ShapeUtil.size(inputShape);\n const dataType = inputs[0].dataType;\n const axis = ShapeUtil.normalizeAxis(attributes.axis, inputShape.length);\n const outputs = new Array(attributes.numOutputs);\n const input = inputVariable('input', dataType, inputShape.length);\n const sizeInSplitAxis = new Array(attributes.numOutputs);\n const outputsTensorInfo: TensorInfo[] = [];\n const outputShapes: number[][] = [];\n let previousSum = 0;\n const programUniforms: ProgramUniform[] = [{type: DataType.uint32, data: inputSize}];\n for (let i = 0; i < attributes.numOutputs; i++) {\n previousSum += attributes.splitSizes[i];\n sizeInSplitAxis[i] = previousSum;\n const outputShape = inputShape.slice();\n outputShape[attributes.axis] = attributes.splitSizes[i];\n outputShapes.push(outputShape);\n outputs[i] = outputVariable(`output${i}`, dataType, outputShape.length);\n outputsTensorInfo.push({dims: outputShapes[i], dataType: inputs[0].dataType});\n }\n programUniforms.push(\n {type: DataType.uint32, data: sizeInSplitAxis}, ...createTensorShapeVariables(inputShape, ...outputShapes));\n const getShaderSource = (shaderHelper: ShaderHelper) => `\n ${\n shaderHelper.registerUniform('input_size', 'u32')\n .registerUniform('size_in_split_axis', 'u32', sizeInSplitAxis.length)\n .declareVariables(input, ...outputs)}\n ${calculateOutputIndexImpl(sizeInSplitAxis.length)}\n ${writeBufferDataImpl(outputs)}\n\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.input_size')}\n\n var indices = ${input.offsetToIndices('global_idx')};\n var index = ${input.indicesGet('indices', axis)};\n let output_number = calculateOutputIndex(index);\n if (output_number != 0) {\n index -= ${getElementAt('uniforms.size_in_split_axis', 'output_number - 1u', sizeInSplitAxis.length)};\n ${input.indicesSet('indices', axis, 'index')};\n }\n writeBufferData(output_number, indices, global_idx);\n }`;\n return {\n name: 'Split',\n shaderCache: {hint: attributes.cacheKey, inputDependencies: ['rank']},\n getShaderSource,\n getRunData: () => ({\n outputs: outputsTensorInfo,\n dispatchGroup: {x: Math.ceil(inputSize / 64 /* workgroup size */)},\n programUniforms\n })\n };\n};\n\nexport const split = (context: ComputeContext, attributes: SplitAttributes): void => {\n validateInputs(context.inputs);\n const updatedAttributes =\n context.inputs.length === 1 ? attributes : createSplitAttributesFromInputs(context.inputs, attributes);\n context.compute(createSplitProgramInfo(context.inputs, updatedAttributes), {inputs: [0]});\n};\n\nexport const parseSplitAttributes = (attributes: Record): SplitAttributes => {\n const axis = attributes.axis as number;\n const splitSizes: number[] = attributes.splitSizes as number[];\n const numOutputs = attributes.numOutputs as number < 0 ? splitSizes.length : attributes.numOutputs as number;\n if (numOutputs !== splitSizes.length) {\n throw new Error('numOutputs and splitSizes lengh must be equal');\n }\n return createAttributeWithCacheKey({axis, numOutputs, splitSizes});\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {DataType} from '../../../wasm-common';\nimport {TensorView} from '../../tensor-view';\nimport {BroadcastUtil, ShapeUtil} from '../../util';\nimport {ComputeContext, ProgramInfo} from '../types';\n\nimport {createTensorShapeVariables, inputVariable, outputVariable, ShaderHelper} from './common';\n\nconst createWhereOpProgramShader =\n (shaderHelper: ShaderHelper, inputs: readonly TensorView[], dimsOutput: readonly number[], isBroadcast: boolean,\n typeOutput: number) => {\n const output = outputVariable('output_data', typeOutput, dimsOutput.length, 4);\n const a = inputVariable('a_data', inputs[1].dataType, inputs[1].dims.length, 4);\n const b = inputVariable('b_data', inputs[2].dataType, inputs[2].dims.length, 4);\n const c = inputVariable('c_data', inputs[0].dataType, inputs[0].dims.length, 4);\n\n let assignment: string;\n const expression = (a: string, b: string, c: string) => `select(${b}, ${a}, ${c})`;\n if (!isBroadcast) {\n assignment = output.setByOffset(\n 'global_idx',\n expression(a.getByOffset('global_idx'), b.getByOffset('global_idx'), c.getByOffset('global_idx')));\n } else {\n const singleAssignment = (resStr: string, x: number, typeCast = '') => {\n const expressionA = `a_data[index_a${x}][component_a${x}]`;\n const expressionB = `b_data[index_b${x}][component_b${x}]`;\n // eslint-disable-next-line no-bitwise\n const expressionC = `bool(c_data[index_c${x}] & (0xffu << (component_c${x} * 8)))`;\n return `\n let output_indices${x} = ${output.offsetToIndices(`global_idx * 4u + ${x}u`)};\n let offset_a${x} = ${a.broadcastedIndicesToOffset(`output_indices${x}`, output)};\n let offset_b${x} = ${b.broadcastedIndicesToOffset(`output_indices${x}`, output)};\n let offset_c${x} = ${c.broadcastedIndicesToOffset(`output_indices${x}`, output)};\n let index_a${x} = offset_a${x} / 4u;\n let index_b${x} = offset_b${x} / 4u;\n let index_c${x} = offset_c${x} / 4u;\n let component_a${x} = offset_a${x} % 4u;\n let component_b${x} = offset_b${x} % 4u;\n let component_c${x} = offset_c${x} % 4u;\n ${resStr}[${x}] = ${typeCast}(${expression(expressionA, expressionB, expressionC)});\n `;\n };\n if (typeOutput === DataType.bool) {\n assignment = `\n var data = vec4(0);\n ${singleAssignment('data', 0, 'u32')}\n ${singleAssignment('data', 1, 'u32')}\n ${singleAssignment('data', 2, 'u32')}\n ${singleAssignment('data', 3, 'u32')}\n output_data[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`;\n } else {\n assignment = `\n ${singleAssignment('output_data[global_idx]', 0)}\n ${singleAssignment('output_data[global_idx]', 1)}\n ${singleAssignment('output_data[global_idx]', 2)}\n ${singleAssignment('output_data[global_idx]', 3)}\n `;\n }\n }\n\n return `\n ${shaderHelper.registerUniform('vec_size', 'u32').declareVariables(c, a, b, output)}\n ${shaderHelper.mainStart()}\n ${shaderHelper.guardAgainstOutOfBoundsWorkgroupSizes('uniforms.vec_size')}\n ${assignment}\n }`;\n };\n\nconst createWhereOpProgramInfo = (inputs: readonly TensorView[]): ProgramInfo => {\n const dimsA = inputs[1].dims;\n const dimsB = inputs[2].dims;\n const dimsC = inputs[0].dims;\n const outputDataType = inputs[1].dataType;\n\n const isBroadcast = !(ShapeUtil.areEqual(dimsA, dimsB) && ShapeUtil.areEqual(dimsB, dimsC));\n let outputShape = dimsA;\n let outputSize = ShapeUtil.size(dimsA);\n // TODO: deal with zero-sized tensors (eg. dims=[1,0])\n\n if (isBroadcast) {\n const calculatedShape = BroadcastUtil.calcShape(BroadcastUtil.calcShape(dimsA, dimsB, false)!, dimsC, false);\n if (!calculatedShape) {\n throw new Error('Can\\'t perform where op on the given tensors');\n }\n outputShape = calculatedShape;\n outputSize = ShapeUtil.size(outputShape);\n }\n\n const vecSize = Math.ceil(outputSize / 4);\n\n return {\n name: 'Where',\n shaderCache: {inputDependencies: ['rank', 'rank', 'rank']},\n getShaderSource: (shaderHelper) =>\n createWhereOpProgramShader(shaderHelper, inputs, outputShape, isBroadcast, outputDataType),\n getRunData: () => ({\n outputs: [{dims: outputShape, dataType: outputDataType}],\n dispatchGroup: {x: Math.ceil(outputSize / 64 /* workgroup size */ / 4 /* vec size */)},\n programUniforms:\n [{type: DataType.uint32, data: vecSize}, ...createTensorShapeVariables(dimsC, dimsA, dimsB, outputShape)],\n }),\n };\n};\n\nexport const where = (context: ComputeContext): void => {\n context.compute(createWhereOpProgramInfo(context.inputs));\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {argMax, argMin, parseArgMinMaxAttributes} from './ops/argminmax';\nimport {attention} from './ops/attention';\nimport {batchNorm} from './ops/batch-norm';\nimport {biasAdd} from './ops/bias-add';\nimport {biasSplitGelu} from './ops/bias-split-gelu';\nimport * as binaryOps from './ops/binary-op';\nimport {concat, parseConcatAttributes} from './ops/concat';\nimport {conv, parseConvAttributes} from './ops/conv';\nimport {convTranspose, parseConvTransposeAttributes} from './ops/conv-transpose';\nimport {cumsum, parseCumSumAttributes} from './ops/cumsum';\nimport {depthToSpace, parseDepthToSpaceAttributes} from './ops/depth-to-space';\nimport {einsum, parseEinsumAttributes} from './ops/einsum';\nimport {expand} from './ops/expand';\nimport {fastGelu} from './ops/fast-gelu';\nimport {gather, parseGatherAttributes} from './ops/gather';\nimport {gatherElements, parseGatherElementsAttributes} from './ops/gather-elements';\nimport {gemm, parseGemmAttributes} from './ops/gemm';\nimport {groupQueryAttention, parseGroupQueryAttentionAttributes} from './ops/group-query-attention';\nimport {instanceNorm} from './ops/instance-norm';\nimport {layerNorm} from './ops/layer-norm';\nimport {matMul} from './ops/matmul';\nimport {matMulNBits, parseMatMulNBitsAttributes} from './ops/matmulnbits';\nimport {multiHeadAttention, parseMultiHeadAttentionAttributes} from './ops/multihead-attention';\nimport {pad} from './ops/pad';\nimport * as pool from './ops/pool';\nimport {range} from './ops/range';\nimport {reduceL1, reduceL2, reduceLogSum, reduceLogSumExp, reduceMax, reduceMean, reduceMin, reduceProd, reduceSum, reduceSumSquare} from './ops/reduce';\nimport {parseResizeAttributes, resize} from './ops/resize';\nimport {rotaryEmbedding} from './ops/rotary-embedding';\nimport {skipLayerNorm} from './ops/skip-layer-norm';\nimport {parseSliceAttributes, slice} from './ops/slice';\nimport {parseSoftmaxAttributes, softmax} from './ops/softmax';\nimport {parseSplitAttributes, split} from './ops/split';\nimport {tile} from './ops/tile';\nimport {parseTransposeAttributes, transpose} from './ops/transpose';\nimport * as unaryOps from './ops/unary-op';\nimport {where} from './ops/where';\nimport {ComputeContext} from './types';\n\nexport type RunFunction = (context: ComputeContext, attribute?: unknown) => void;\nexport type ParseAttributeFunction = (attributeRaw: unknown) => unknown;\nexport type OperatorImplementation = [RunFunction]|[RunFunction, ParseAttributeFunction];\n\nexport const WEBGPU_OP_RESOLVE_RULES: Map = new Map([\n ['Abs', [unaryOps.abs]],\n ['Acos', [unaryOps.acos]],\n ['Acosh', [unaryOps.acosh]],\n ['Add', [binaryOps.add]],\n ['ArgMax', [argMax, parseArgMinMaxAttributes]],\n ['ArgMin', [argMin, parseArgMinMaxAttributes]],\n ['Asin', [unaryOps.asin]],\n ['Asinh', [unaryOps.asinh]],\n ['Atan', [unaryOps.atan]],\n ['Atanh', [unaryOps.atanh]],\n ['Attention', [attention]],\n // TODO: support new attributes for AveragePool-10\n ['AveragePool', [pool.averagePool, pool.parseAveragePoolAttributes]],\n ['BatchNormalization', [batchNorm]],\n ['BiasAdd', [biasAdd]],\n ['BiasSplitGelu', [biasSplitGelu]],\n ['Cast', [unaryOps.cast, unaryOps.parseCastAttributes]],\n ['Ceil', [unaryOps.ceil]],\n ['Clip', [unaryOps.clip]],\n ['Concat', [concat, parseConcatAttributes]],\n ['Conv', [conv, parseConvAttributes]],\n ['ConvTranspose', [convTranspose, parseConvTransposeAttributes]],\n ['Cos', [unaryOps.cos]],\n ['Cosh', [unaryOps.cosh]],\n ['CumSum', [cumsum, parseCumSumAttributes]],\n ['DepthToSpace', [depthToSpace, parseDepthToSpaceAttributes]],\n ['Div', [binaryOps.div]],\n ['Einsum', [einsum, parseEinsumAttributes]],\n ['Elu', [unaryOps.elu, unaryOps.parseAlphaAttributes]],\n ['Equal', [binaryOps.equal]],\n ['Erf', [unaryOps.erf]],\n ['Exp', [unaryOps.exp]],\n ['Expand', [expand]],\n ['FastGelu', [fastGelu]],\n ['Floor', [unaryOps.floor]],\n ['FusedConv', [conv, parseConvAttributes]],\n ['Gather', [gather, parseGatherAttributes]],\n ['GatherElements', [gatherElements, parseGatherElementsAttributes]],\n ['Gelu', [unaryOps.gelu]],\n ['Gemm', [gemm, parseGemmAttributes]],\n ['GlobalAveragePool', [pool.globalAveragePool, pool.parseGlobalAveragePoolAttributes]],\n ['GlobalMaxPool', [pool.globalMaxPool, pool.parseGlobalMaxPoolAttributes]],\n ['Greater', [binaryOps.greater]],\n ['GreaterOrEqual', [binaryOps.greaterOrEqual]],\n ['GroupQueryAttention', [groupQueryAttention, parseGroupQueryAttentionAttributes]],\n ['HardSigmoid', [unaryOps.hardSigmoid, unaryOps.parseHardSigmoidAttributes]],\n ['InstanceNormalization', [instanceNorm]],\n ['LayerNormalization', [layerNorm]],\n ['LeakyRelu', [unaryOps.leakyRelu, unaryOps.parseAlphaAttributes]],\n ['Less', [binaryOps.less]],\n ['LessOrEqual', [binaryOps.lessOrEqual]],\n ['Log', [unaryOps.log]],\n ['MatMul', [matMul]],\n ['MatMulNBits', [matMulNBits, parseMatMulNBitsAttributes]],\n // TODO: support new attributes for MaxPool-8 and MaxPool-10\n ['MaxPool', [pool.maxPool, pool.parseMaxPoolAttributes]],\n ['Mul', [binaryOps.mul]],\n ['MultiHeadAttention', [multiHeadAttention, parseMultiHeadAttentionAttributes]],\n ['Neg', [unaryOps.neg]],\n ['Not', [unaryOps.not]],\n ['Pad', [pad]],\n ['Pow', [binaryOps.pow]],\n ['QuickGelu', [unaryOps.quickgelu, unaryOps.parseAlphaAttributes]],\n ['Range', [range]],\n ['Reciprocal', [unaryOps.reciprocal]],\n ['ReduceMin', [reduceMin]],\n ['ReduceMean', [reduceMean]],\n ['ReduceMax', [reduceMax]],\n ['ReduceSum', [reduceSum]],\n ['ReduceProd', [reduceProd]],\n ['ReduceL1', [reduceL1]],\n ['ReduceL2', [reduceL2]],\n ['ReduceLogSum', [reduceLogSum]],\n ['ReduceLogSumExp', [reduceLogSumExp]],\n ['ReduceSumSquare', [reduceSumSquare]],\n ['Relu', [unaryOps.relu]],\n ['Resize', [resize, parseResizeAttributes]],\n ['RotaryEmbedding', [rotaryEmbedding]],\n ['Sigmoid', [unaryOps.sigmoid]],\n ['Sin', [unaryOps.sin]],\n ['Sinh', [unaryOps.sinh]],\n ['Slice', [slice, parseSliceAttributes]],\n ['SkipLayerNormalization', [skipLayerNorm]],\n ['Split', [split, parseSplitAttributes]],\n ['Sqrt', [unaryOps.sqrt]],\n ['Softmax', [softmax, parseSoftmaxAttributes]],\n ['Sub', [binaryOps.sub]],\n ['Tan', [unaryOps.tan]],\n ['Tanh', [unaryOps.tanh]],\n ['ThresholdedRelu', [unaryOps.thresholdedRelu, unaryOps.parseAlphaAttributes]],\n ['Tile', [tile]],\n ['Transpose', [transpose, parseTransposeAttributes]],\n ['Where', [where]],\n]);\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {TRACE_FUNC_BEGIN, TRACE_FUNC_END} from 'onnxruntime-common';\n\nimport {WebGpuBackend} from '../backend-webgpu';\nimport {LOG_DEBUG} from '../log';\n\nimport {createShaderHelper} from './ops/common';\nimport {Artifact, GpuData, ProgramInfo} from './types';\n\n/**\n * ProgramManager is the main class behind running computations\n * It builds ProgramInfo's into Artifacts\n * It compiles given ProgramInfo's into WebGL Prorams (cached as Artifacts)\n * Uses the artifact to run the computation by calling Draw on\n * the WebGL drawing buffer\n * ProgramManager automatically maps (binds) input variables to their\n * corresponding Location's in the binary program\n */\nexport class ProgramManager {\n repo: Map; // this should be per-session object\n attributesBound: boolean;\n\n constructor(private backend: WebGpuBackend) {\n this.repo = new Map();\n this.attributesBound = false;\n }\n getArtifact(key: unknown): Artifact|undefined {\n return this.repo.get(key);\n }\n setArtifact(key: unknown, artifact: Artifact): void {\n this.repo.set(key, artifact);\n }\n run(buildArtifact: Artifact, inputs: GpuData[], outputs: GpuData[], dispatchGroup: [number, number, number],\n uniformBufferBinding: GPUBindingResource|undefined): void {\n TRACE_FUNC_BEGIN(buildArtifact.programInfo.name);\n const device = this.backend.device;\n const computePassEncoder = this.backend.getComputePassEncoder();\n this.backend.writeTimestamp(this.backend.pendingDispatchNumber * 2);\n const entries = [];\n for (const input of inputs) {\n entries.push({binding: entries.length, resource: {buffer: input.buffer}});\n }\n for (const output of outputs) {\n entries.push({binding: entries.length, resource: {buffer: output.buffer}});\n }\n if (uniformBufferBinding) {\n entries.push({binding: entries.length, resource: uniformBufferBinding});\n }\n const bindGroup = device.createBindGroup(\n {layout: buildArtifact.computePipeline.getBindGroupLayout(0), entries, label: buildArtifact.programInfo.name});\n\n if (this.backend.sessionStatus === 'capturing') {\n const commandInfo = {\n kernelId: this.backend.currentKernelId!,\n computePipeline: buildArtifact.computePipeline,\n bindGroup,\n dispatchGroup\n };\n const sessionCommandList = this.backend.capturedCommandList.get(this.backend.currentSessionId!);\n sessionCommandList!.push(commandInfo);\n }\n\n computePassEncoder.setPipeline(buildArtifact.computePipeline);\n computePassEncoder.setBindGroup(0, bindGroup);\n computePassEncoder.dispatchWorkgroups(...dispatchGroup);\n this.backend.writeTimestamp(this.backend.pendingDispatchNumber * 2 + 1);\n this.backend.pendingDispatchNumber++;\n\n if (this.backend.pendingDispatchNumber >= this.backend.maxDispatchNumber ||\n this.backend.queryType === 'at-passes') {\n this.backend.endComputePass();\n }\n if (this.backend.pendingDispatchNumber >= this.backend.maxDispatchNumber) {\n this.backend.flush();\n }\n TRACE_FUNC_END(buildArtifact.programInfo.name);\n }\n dispose(): void {\n // this.repo.forEach(a => this.glContext.deleteProgram(a.program));\n }\n build(programInfo: ProgramInfo, normalizedDispatchGroupSize: [number, number, number]): Artifact {\n TRACE_FUNC_BEGIN(programInfo.name);\n const device = this.backend.device;\n const extensions: string[] = [];\n if (device.features.has('shader-f16')) {\n extensions.push('enable f16;');\n }\n const shaderHelper = createShaderHelper(normalizedDispatchGroupSize, this.backend.device.limits);\n const userCode = programInfo.getShaderSource(shaderHelper);\n const code = `${extensions.join('\\n')}\\n${shaderHelper.additionalImplementations}\\n${userCode}`;\n const shaderModule = device.createShaderModule({code, label: programInfo.name});\n LOG_DEBUG('verbose', () => `[WebGPU] ${programInfo.name} shader code: ${code}`);\n\n const computePipeline = device.createComputePipeline(\n {compute: {module: shaderModule, entryPoint: 'main'}, layout: 'auto', label: programInfo.name});\n\n TRACE_FUNC_END(programInfo.name);\n return {programInfo, computePipeline, uniformVariablesInfo: shaderHelper.variablesInfo};\n }\n\n normalizeDispatchGroupSize(dispatchGroup: ReturnType['dispatchGroup']):\n [number, number, number] {\n const x = typeof dispatchGroup === 'number' ? dispatchGroup : dispatchGroup.x;\n const y = typeof dispatchGroup === 'number' ? 1 : (dispatchGroup.y || 1);\n const z = typeof dispatchGroup === 'number' ? 1 : (dispatchGroup.z || 1);\n const limitPerDimension = this.backend.device.limits.maxComputeWorkgroupsPerDimension;\n if (x <= limitPerDimension && y <= limitPerDimension && z <= limitPerDimension) {\n return [x, y, z];\n }\n const size = x * y * z;\n let dispatchAverage = Math.ceil(Math.sqrt(size));\n if (dispatchAverage > limitPerDimension) {\n dispatchAverage = Math.ceil(Math.cbrt(size));\n if (dispatchAverage > limitPerDimension) {\n throw new Error('Total dispatch size exceeds WebGPU maximum.');\n }\n return [dispatchAverage, dispatchAverage, dispatchAverage];\n } else {\n return [dispatchAverage, dispatchAverage, 1];\n }\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env, Tensor, TRACE, TRACE_FUNC_BEGIN, TRACE_FUNC_END} from 'onnxruntime-common';\n\nimport {DataType, tensorDataTypeEnumToString} from '../wasm-common';\n\nimport {configureLogger, LOG_DEBUG} from './log';\nimport {createView, TensorView} from './tensor-view';\nimport {createGpuDataManager, downloadGpuData, GpuDataManager} from './webgpu/gpu-data-manager';\nimport {RunFunction, WEBGPU_OP_RESOLVE_RULES} from './webgpu/op-resolve-rules';\nimport {ProgramManager} from './webgpu/program-manager';\nimport {AdapterInfo, ComputeContext, GpuArchitecture, GpuData, GpuVendor, ProgramInfo, ProgramInputTensorInfoDependency, SessionState, TimestampQuery} from './webgpu/types';\n\ninterface CommandInfo {\n readonly kernelId: number;\n readonly computePipeline: GPUComputePipeline;\n readonly bindGroup: GPUBindGroup;\n readonly dispatchGroup: [number, number, number];\n}\n\ninterface KernelInfo {\n readonly kernelType: string;\n readonly kernelName: string;\n readonly kernelEntry: RunFunction;\n readonly attributes: [((attribute: unknown) => unknown)|undefined, unknown];\n}\n\ninterface PendingKernelInfo {\n readonly kernelId: number;\n readonly programName: string;\n readonly inputTensorViews: readonly TensorView[];\n readonly outputTensorViews: readonly TensorView[];\n}\n\nconst getProgramInputTensorInfoDependencyKey =\n (inputTensors: readonly TensorView[], inputDependencies: readonly ProgramInputTensorInfoDependency[]): string => {\n if (inputDependencies.length !== inputTensors.length) {\n throw new Error(`inputDependencies length ${inputDependencies.length} is not equal to inputTensors length ${\n inputTensors.length}.`);\n }\n\n const inputInfos: string[] = [];\n for (let i = 0; i < inputTensors.length; ++i) {\n const type = inputTensors[i].dataType;\n switch (inputDependencies[i]) {\n case 'none': {\n inputInfos.push('');\n break;\n }\n case 'type': {\n inputInfos.push(`${type}`);\n break;\n }\n case 'rank': {\n const rank = inputTensors[i].dims.length;\n inputInfos.push(`${type};${rank}`);\n break;\n }\n case 'dims': {\n const dims = inputTensors[i].dims.join(',');\n inputInfos.push(`${type};${dims}`);\n break;\n }\n default:\n throw new Error(`unsupported input dependency: ${inputDependencies[i]}`);\n }\n }\n\n return inputInfos.join('|');\n };\n\n/**\n * get a unique key representing the program from the program info, input shapes and types.\n *\n * @returns a unique key is a shorter string than the shader source, which contains all the information to identify a\n * program. if the key is the same, the program shader source should be the same, so we can reuse the program.\n *\n */\nconst getProgramInfoUniqueKey =\n (programInfo: ProgramInfo, inputTensors: readonly TensorView[], is1DimensionDispatch: boolean): string => {\n // final key format:\n // []:is1DimensionDispatch:||...\n let key = programInfo.name;\n if (programInfo.shaderCache?.hint) {\n key += '[' + programInfo.shaderCache.hint + ']';\n }\n key += ':' + is1DimensionDispatch +\n `:${\n getProgramInputTensorInfoDependencyKey(\n inputTensors,\n programInfo.shaderCache?.inputDependencies ??\n new Array(inputTensors.length).fill('dims'))}`;\n return key;\n };\n\nclass AdapterInfoImpl implements AdapterInfo {\n readonly architecture?: string;\n readonly vendor?: string;\n\n constructor(adapterInfo: GPUAdapterInfo) {\n if (adapterInfo) {\n this.architecture = adapterInfo.architecture;\n this.vendor = adapterInfo.vendor;\n }\n }\n\n isArchitecture(architecture: GpuArchitecture): boolean {\n return this.architecture === architecture;\n }\n\n isVendor(vendor: GpuVendor): boolean {\n return this.vendor === vendor;\n }\n}\n\n/**\n * this class is designed to store status and being used as a singleton for JSEP. It will be passed to jsepInit() as\n * the first parameter so that it is stored for future use.\n */\nexport class WebGpuBackend {\n adapterInfo: AdapterInfoImpl;\n device: GPUDevice;\n /**\n * an instance of GpuDataManager to manage a GpuDataId -> GpuBuffer mapping\n */\n gpuDataManager: GpuDataManager;\n /**\n * an instance of ProgramManager to build and run WebGPU compute shader program, and manage a ProgramKey -> Program\n * artifacts mapping\n */\n programManager: ProgramManager;\n\n /**\n * representing the session ID of which is currently being run.\n * `null` means no session is being run.\n * only valid when session.run is executed.\n */\n currentSessionId: number|null = null;\n\n /**\n * representing the kernel ID of which is currently being computed (CPU code perspective).\n * `null` means no kernel is being computed.\n * only one kernel can be computed at a moment.\n */\n currentKernelId: number|null = null;\n /**\n * a list of temporary GPU data for the current kernel. should release when the kernel done computation.\n */\n private temporaryData: GpuData[];\n /**\n * a KernelID -> a GPU data list, which stores persistent GPU data owned by the specific kernel.\n */\n private kernelPersistentData: Map;\n /**\n * a KernelID -> a custom data, which stores custom data owned by the specific kernel.\n */\n private kernelCustomData: Map;\n /**\n * get the custom data of the current kernel\n */\n get currentKernelCustomData(): {[key: string]: unknown} {\n if (this.currentKernelId === null) {\n throw new Error('currentKernelCustomData(): currentKernelId is null. (should not happen)');\n }\n\n let data = this.kernelCustomData.get(this.currentKernelId);\n if (!data) {\n data = {};\n this.kernelCustomData.set(this.currentKernelId, data);\n }\n\n return data;\n }\n\n // KernelID -> kernelInfo mapping\n kernels: Map;\n private commandEncoder: GPUCommandEncoder|null = null;\n private computePassEncoder: GPUComputePassEncoder|null = null;\n maxDispatchNumber = 16;\n pendingDispatchNumber = 0;\n\n // info of kernels pending submission for a single batch\n private pendingKernels: PendingKernelInfo[] = [];\n // queryReadBuffer -> pendingKernels mapping for all the batches\n private pendingQueries: Map = new Map();\n private queryResolveBuffer?: GPUBuffer;\n private querySet?: GPUQuerySet;\n private queryTimeBase?: bigint;\n queryType: TimestampQuery;\n\n env: Env;\n sessionStatus: SessionState = 'default';\n /**\n * a SessionID -> CommandInfo[] mapping. It's used to record all GPU commands for corresponding session.\n */\n capturedCommandList: Map = new Map();\n\n /**\n * a SessionID -> PendingKernelInfo[] mapping for profiling.\n */\n private capturedPendingKernels: Map = new Map();\n\n /**\n * a SessionID -> a Map of (InputOutputIndex -> [ID, GPUBuffer]) mapping.\n */\n sessionExternalDataMapping: Map> = new Map();\n\n async initialize(env: Env, adapter: GPUAdapter): Promise {\n this.env = env;\n const requiredFeatures: GPUFeatureName[] = [];\n const deviceDescriptor: GPUDeviceDescriptor = {\n requiredLimits: {\n maxComputeWorkgroupStorageSize: adapter.limits.maxComputeWorkgroupStorageSize,\n maxComputeWorkgroupsPerDimension: adapter.limits.maxComputeWorkgroupsPerDimension,\n maxStorageBufferBindingSize: adapter.limits.maxStorageBufferBindingSize,\n maxBufferSize: adapter.limits.maxBufferSize,\n maxComputeInvocationsPerWorkgroup: adapter.limits.maxComputeInvocationsPerWorkgroup,\n maxComputeWorkgroupSizeX: adapter.limits.maxComputeWorkgroupSizeX,\n maxComputeWorkgroupSizeY: adapter.limits.maxComputeWorkgroupSizeY,\n maxComputeWorkgroupSizeZ: adapter.limits.maxComputeWorkgroupSizeZ,\n },\n requiredFeatures,\n };\n\n if (adapter.features.has('chromium-experimental-timestamp-query-inside-passes')) {\n requiredFeatures.push('chromium-experimental-timestamp-query-inside-passes' as GPUFeatureName);\n } else if (adapter.features.has('timestamp-query')) {\n requiredFeatures.push('timestamp-query');\n }\n if (adapter.features.has('shader-f16')) {\n requiredFeatures.push('shader-f16');\n }\n\n this.device = await adapter.requestDevice(deviceDescriptor);\n this.adapterInfo = new AdapterInfoImpl(adapter.info || await adapter.requestAdapterInfo());\n this.gpuDataManager = createGpuDataManager(this);\n this.programManager = new ProgramManager(this);\n this.kernels = new Map();\n this.kernelPersistentData = new Map();\n this.kernelCustomData = new Map();\n\n // set up flags for logger\n configureLogger(env.logLevel!, !!env.debug);\n\n // TODO: set up flags\n\n this.device.onuncapturederror = ev => {\n if (ev.error instanceof GPUValidationError) {\n // eslint-disable-next-line no-console\n console.error(`An uncaught WebGPU validation error was raised: ${ev.error.message}`);\n }\n };\n\n Object.defineProperty(\n this.env.webgpu, 'device', {value: this.device, writable: false, enumerable: true, configurable: false});\n Object.defineProperty(\n this.env.webgpu, 'adapter', {value: adapter, writable: false, enumerable: true, configurable: false});\n\n // init queryType, which is necessary for InferenceSession.create\n this.setQueryType();\n }\n\n dispose(): void {\n if (typeof this.querySet !== 'undefined') {\n this.querySet.destroy();\n }\n this.gpuDataManager.dispose();\n }\n\n getCommandEncoder(): GPUCommandEncoder {\n if (!this.commandEncoder) {\n this.commandEncoder = this.device.createCommandEncoder();\n }\n return this.commandEncoder;\n }\n\n getComputePassEncoder(): GPUComputePassEncoder {\n if (!this.computePassEncoder) {\n const commandEncoder = this.getCommandEncoder();\n const computePassDescriptor: GPUComputePassDescriptor = {};\n\n if (this.queryType === 'at-passes') {\n computePassDescriptor.timestampWrites = {\n querySet: this.querySet!,\n beginningOfPassWriteIndex: this.pendingDispatchNumber * 2,\n endOfPassWriteIndex: this.pendingDispatchNumber * 2 + 1,\n };\n }\n\n this.computePassEncoder = commandEncoder.beginComputePass(computePassDescriptor);\n }\n return this.computePassEncoder;\n }\n\n endComputePass(): void {\n if (this.computePassEncoder) {\n this.computePassEncoder.end();\n this.computePassEncoder = null;\n }\n }\n\n flush(): void {\n if (!this.commandEncoder) {\n return;\n }\n\n TRACE_FUNC_BEGIN();\n\n this.endComputePass();\n let queryReadBuffer: GPUBuffer;\n if (this.queryType !== 'none') {\n this.commandEncoder.resolveQuerySet(\n this.querySet!, 0, this.pendingDispatchNumber * 2, this.queryResolveBuffer!, 0);\n\n queryReadBuffer = this.device.createBuffer(\n // eslint-disable-next-line no-bitwise\n {size: this.pendingDispatchNumber * 2 * 8, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST});\n\n this.pendingQueries.set(queryReadBuffer, this.pendingKernels);\n this.pendingKernels = [];\n this.commandEncoder.copyBufferToBuffer(\n this.queryResolveBuffer!, 0, queryReadBuffer, 0, this.pendingDispatchNumber * 2 * 8);\n }\n\n this.device.queue.submit([this.commandEncoder.finish()]);\n this.gpuDataManager.refreshPendingBuffers();\n this.commandEncoder = null;\n this.pendingDispatchNumber = 0;\n\n if (this.queryType !== 'none') {\n void queryReadBuffer!.mapAsync(GPUMapMode.READ).then(() => {\n const mappedData = new BigUint64Array(queryReadBuffer.getMappedRange());\n const pendingKernels = this.pendingQueries.get(queryReadBuffer)!;\n for (let i = 0; i < mappedData.length / 2; i++) {\n const pendingKernelInfo = pendingKernels[i];\n const kernelId = pendingKernelInfo.kernelId;\n const kernelInfo = this.kernels.get(kernelId)!;\n const kernelType = kernelInfo.kernelType;\n const kernelName = kernelInfo.kernelName;\n const programName = pendingKernelInfo.programName;\n const inputTensorViews = pendingKernelInfo.inputTensorViews;\n const outputTensorViews = pendingKernelInfo.outputTensorViews;\n const startTimeU64 = mappedData[i * 2];\n const endTimeU64 = mappedData[i * 2 + 1];\n\n if (typeof this.queryTimeBase === 'undefined') {\n this.queryTimeBase = startTimeU64;\n }\n\n const startTime = Number(startTimeU64 - this.queryTimeBase);\n const endTime = Number(endTimeU64 - this.queryTimeBase);\n\n if (!Number.isSafeInteger(startTime) || !Number.isSafeInteger(endTime)) {\n throw new RangeError('incorrect timestamp range');\n }\n\n if (this.env.webgpu.profiling?.ondata) {\n this.env.webgpu.profiling.ondata({\n version: 1,\n inputsMetadata: inputTensorViews.map(\n value => ({dims: value.dims, dataType: tensorDataTypeEnumToString(value.dataType)})),\n outputsMetadata: outputTensorViews.map(\n value => ({dims: value.dims, dataType: tensorDataTypeEnumToString(value.dataType)})),\n kernelId,\n kernelType,\n kernelName,\n programName,\n startTime,\n endTime,\n });\n } else {\n // if no callback is provided, print the profiling message to console\n let inputShapes = '';\n inputTensorViews.forEach((value, i) => {\n inputShapes += `input[${i}]: [${value.dims}] | ${tensorDataTypeEnumToString(value.dataType)}, `;\n });\n let outputShapes = '';\n outputTensorViews.forEach((value, i) => {\n outputShapes += `output[${i}]: [${value.dims}] | ${tensorDataTypeEnumToString(value.dataType)}, `;\n });\n // eslint-disable-next-line no-console\n console.log(`[profiling] kernel \"${kernelId}|${kernelType}|${kernelName}|${programName}\" ${inputShapes}${\n outputShapes}execution time: ${endTime - startTime} ns`);\n }\n TRACE('GPU', `${programName}::${startTimeU64}::${endTimeU64}`);\n }\n queryReadBuffer.unmap();\n this.pendingQueries.delete(queryReadBuffer);\n });\n }\n TRACE_FUNC_END();\n }\n\n /**\n * run a WebGPU program.\n * @param program a ProgramInfo instance\n * @param inputTensorViews a TensorView array. each element represents a value already exists in GPU.\n * @param outputIndices an indices array. each element can be either -1 (temporary data), -2 (persistent data) or an\n * index to the kernel's output.\n * @param createKernelOutput a callback function that create a value to kernel's output with the given index\n * @param createIntermediateOutput a callback function that create a value as a intermediate value, either temporary\n * or persistent (owned by the current kernel)\n * @returns a TensorView array representing the result.\n */\n run(program: ProgramInfo, inputTensorViews: readonly TensorView[], outputIndices: readonly number[],\n createKernelOutput: (index: number, dataType: number, dims: readonly number[]) => TensorView,\n createIntermediateOutput: (dataType: number, dims: readonly number[]) => TensorView,\n outputCount: number): TensorView[] {\n TRACE_FUNC_BEGIN(program.name);\n // create info for inputs\n const inputDatas: GpuData[] = [];\n for (let i = 0; i < inputTensorViews.length; ++i) {\n const data = inputTensorViews[i].data;\n // if tensor view data is 0, it means the output is zero-sized tensor, and there is no GPU data for it.\n if (data === 0) {\n continue;\n }\n const gpuData = this.gpuDataManager.get(data);\n if (!gpuData) {\n throw new Error(`no GPU data for input: ${data}`);\n }\n inputDatas.push(gpuData);\n }\n\n const {outputs, dispatchGroup, programUniforms} = program.getRunData(inputTensorViews);\n\n // check output indices\n const validatedOutputIndices = outputIndices.length === 0 ? outputs.map((_, i) => i) : outputIndices;\n if (validatedOutputIndices.length !== outputs.length) {\n throw new Error(`Output size ${validatedOutputIndices.length} must be equal to ${outputs.length}.`);\n }\n\n // create info for outputs\n const outputTensorViews: TensorView[] = [];\n const outputDatas: GpuData[] = [];\n for (let i = 0; i < outputs.length; ++i) {\n // value -1 and -2 are used for creating temporary and persistent outputs.\n // value -3 is used for placeholder output. So -3, -2, -1 and 0, 1, 2, ... are valid\n // output indices. see type definition of ComputeContextInputsOutputsMapping for more details.\n if (!Number.isInteger(validatedOutputIndices[i]) || validatedOutputIndices[i] < -3 ||\n validatedOutputIndices[i] >= outputCount) {\n throw new Error(`Invalid output index: ${validatedOutputIndices[i]}`);\n }\n if (validatedOutputIndices[i] === -3) {\n continue;\n }\n const isTemporary = validatedOutputIndices[i] === -1;\n const isPersistent = validatedOutputIndices[i] === -2;\n const tensorView = (isTemporary || isPersistent) ?\n createIntermediateOutput(outputs[i].dataType, outputs[i].dims) :\n createKernelOutput(validatedOutputIndices[i], outputs[i].dataType, outputs[i].dims);\n outputTensorViews.push(tensorView);\n // if tensor view data is 0, it means the output is zero-sized tensor, and there is no GPU data for it.\n if (tensorView.data === 0) {\n continue;\n }\n const gpuData = this.gpuDataManager.get(tensorView.data);\n if (!gpuData) {\n throw new Error(`no GPU data for output: ${tensorView.data}`);\n }\n if (isTemporary) {\n this.temporaryData.push(gpuData);\n }\n if (isPersistent) {\n let persistentData = this.kernelPersistentData.get(this.currentKernelId!);\n if (!persistentData) {\n persistentData = [];\n this.kernelPersistentData.set(this.currentKernelId!, persistentData);\n }\n persistentData.push(gpuData);\n }\n outputDatas.push(gpuData);\n }\n\n // when there are any zero-sized tensor in the inputs or outputs, we should report error unless all outputs are\n // zero-sized tensors.\n if (inputDatas.length !== inputTensorViews.length || outputDatas.length !== outputTensorViews.length) {\n // if all outputs are zero-sized tensors, there is no need to run the program.\n if (outputDatas.length === 0) {\n TRACE_FUNC_END(program.name);\n return outputTensorViews;\n }\n // if some outputs are zero-sized tensors, report an error.\n //\n // TODO: so far we don't see any use case that outputs include both zero-sized tensors and non-zero-sized tensors.\n // If we see such use case, we need to make a change here to support it.\n throw new Error(\n `Program ${program.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`);\n }\n\n // load uniforms\n // TODO: add cache for uniform (is it necessary?)\n //\n let uniformBufferBinding: GPUBindingResource|undefined;\n if (programUniforms) {\n let currentOffset = 0;\n const offsets: number[] = [];\n\n programUniforms.forEach(v => {\n const data = typeof v.data === 'number' ? [v.data] : v.data;\n if (data.length === 0) {\n return;\n }\n // https://www.w3.org/TR/WGSL/#alignof\n const sizeOfElement = v.type === DataType.float16 ? 2 : 4;\n let sizeOfVecOrMat;\n let baseAlignment;\n if (v.type === DataType.float16) {\n baseAlignment = data.length > 4 ? 16 : (data.length > 2 ? 8 : data.length * sizeOfElement);\n sizeOfVecOrMat = data.length > 4 ? 16 : sizeOfElement * data.length;\n } else {\n baseAlignment = data.length <= 2 ? data.length * sizeOfElement : 16;\n sizeOfVecOrMat = 16;\n }\n currentOffset = Math.ceil(currentOffset / baseAlignment) * baseAlignment;\n offsets.push(currentOffset);\n // For non-float16 type, when data.length > 4, the uniform variable is of type array,N>, where\n // N = Math.ceil(data.length / 4) and SizeOf(vec4) = 16. The total byte length is N *\n // SizeOf(vec4). For float16 type, when data.length > 4, the uniform variable is of type\n // array,N>, where N = Math.ceil(data.length / 8) and SizeOf(mat2x4) = 16. The total byte\n // length is N * SizeOf(mat2x4).\n const elementPerVecOrMat = v.type === DataType.float16 ? 8 : 4;\n currentOffset += data.length > 4 ? Math.ceil(data.length / elementPerVecOrMat) * sizeOfVecOrMat :\n data.length * sizeOfElement;\n });\n\n // Meet alignment of struct here: https://www.w3.org/TR/WGSL/#alignment-and-size. For simplicity, set\n // maxAlignmentOfField to 16 since the underlying buffer has been rounded up to 16.\n const maxAlignmentOfField = 16;\n currentOffset = Math.ceil(currentOffset / maxAlignmentOfField) * maxAlignmentOfField;\n const arrayBuffer = new ArrayBuffer(currentOffset);\n programUniforms.forEach((v, i) => {\n const offset = offsets[i];\n const data = typeof v.data === 'number' ? [v.data] : v.data;\n if (v.type === DataType.int32) {\n new Int32Array(arrayBuffer, offset, data.length).set(data);\n } else if (v.type === DataType.uint32) {\n new Uint32Array(arrayBuffer, offset, data.length).set(data);\n } else if (v.type === DataType.float16) {\n // TODO: use Float16Array.\n new Uint16Array(arrayBuffer, offset, data.length).set(data);\n } else if (v.type === DataType.float) {\n new Float32Array(arrayBuffer, offset, data.length).set(data);\n } else {\n throw new Error(`Unsupported uniform type: ${tensorDataTypeEnumToString(v.type)}`);\n }\n });\n\n const uniformBufferData =\n // eslint-disable-next-line no-bitwise\n this.gpuDataManager.create(currentOffset, GPUBufferUsage.COPY_DST | GPUBufferUsage.UNIFORM);\n this.device.queue.writeBuffer(uniformBufferData.buffer, 0, arrayBuffer, 0, currentOffset);\n this.gpuDataManager.release(uniformBufferData.id);\n uniformBufferBinding = {offset: 0, size: currentOffset, buffer: uniformBufferData.buffer};\n }\n\n const normalizedDispatchGroup = this.programManager.normalizeDispatchGroupSize(dispatchGroup);\n const is1DimensionDispatch = normalizedDispatchGroup[1] === 1 && normalizedDispatchGroup[2] === 1;\n // get program info\n const key = getProgramInfoUniqueKey(program, inputTensorViews, is1DimensionDispatch);\n let artifact = this.programManager.getArtifact(key);\n if (!artifact) {\n artifact = this.programManager.build(program, normalizedDispatchGroup);\n this.programManager.setArtifact(key, artifact);\n LOG_DEBUG('info', () => `[artifact] key: ${key}, programName: ${program.name}`);\n }\n\n // validate uniform variables\n if (programUniforms && artifact.uniformVariablesInfo) {\n if (programUniforms.length !== artifact.uniformVariablesInfo.length) {\n throw new Error(`Uniform variables count mismatch: expect ${artifact.uniformVariablesInfo.length}, got ${\n programUniforms.length} in program \"${artifact.programInfo.name}\".`);\n }\n for (let i = 0; i < programUniforms.length; i++) {\n const uniform = programUniforms[i];\n const actualType = uniform.type;\n const actualLength = typeof uniform.data === 'number' ? 1 : uniform.data.length;\n const [type, length] = artifact.uniformVariablesInfo[i];\n if (actualType !== type || actualLength !== length) {\n throw new Error(`Uniform variable ${i} mismatch: expect type ${type} with size ${length}, got type ${\n actualType} with size ${actualLength} in program \"${artifact.programInfo.name}\".`);\n }\n }\n }\n\n LOG_DEBUG(\n 'info',\n () => `[ProgramManager] run \"${program.name}\" (key=${key}) with ${normalizedDispatchGroup[0]}x${\n normalizedDispatchGroup[1]}x${normalizedDispatchGroup[2]}`);\n\n if (this.queryType !== 'none' || this.sessionStatus === 'capturing') {\n const pendingKernelInfo: PendingKernelInfo = {\n kernelId: this.currentKernelId!,\n programName: artifact.programInfo.name,\n inputTensorViews,\n outputTensorViews,\n };\n this.pendingKernels.push(pendingKernelInfo);\n\n if (this.sessionStatus === 'capturing') {\n const sessionPendingKernels = this.capturedPendingKernels.get(this.currentSessionId!);\n sessionPendingKernels!.push(pendingKernelInfo);\n }\n }\n\n this.programManager.run(artifact, inputDatas, outputDatas, normalizedDispatchGroup, uniformBufferBinding);\n\n TRACE_FUNC_END(program.name);\n return outputTensorViews;\n }\n\n upload(gpuDataId: number, data: Uint8Array): void {\n this.gpuDataManager.upload(gpuDataId, data);\n }\n\n memcpy(src: number, dst: number): void {\n this.gpuDataManager.memcpy(src, dst);\n }\n\n async download(gpuDataId: number, getTargetBuffer: () => Uint8Array): Promise {\n // the underlying buffer may be changed after the async function is called. so we use a getter function to make sure\n // the buffer is up-to-date.\n await this.gpuDataManager.download(gpuDataId, getTargetBuffer);\n }\n\n alloc(size: number): number {\n return this.gpuDataManager.create(size).id;\n }\n\n free(ptr: number): number {\n return this.gpuDataManager.release(ptr);\n }\n\n createKernel(kernelType: string, kernelId: number, attribute: unknown, kernelName: string): void {\n const op = WEBGPU_OP_RESOLVE_RULES.get(kernelType);\n if (!op) {\n throw new Error(`kernel not implemented: ${kernelType}`);\n }\n\n const kernelInfo: KernelInfo = {\n kernelType,\n kernelName,\n kernelEntry: op[0],\n attributes: [op[1], attribute],\n };\n this.kernels.set(kernelId, kernelInfo);\n }\n\n releaseKernel(kernelId: number): void {\n const persistentData = this.kernelPersistentData.get(kernelId);\n if (persistentData) {\n for (const data of persistentData) {\n this.gpuDataManager.release(data.id);\n }\n this.kernelPersistentData.delete(kernelId);\n }\n\n this.kernelCustomData.delete(kernelId);\n this.kernels.delete(kernelId);\n }\n\n computeKernel(kernelId: number, context: ComputeContext, errors: Array>): number {\n const kernel = this.kernels.get(kernelId);\n if (!kernel) {\n throw new Error(`kernel not created: ${kernelId}`);\n }\n const kernelType = kernel.kernelType;\n const kernelName = kernel.kernelName;\n const kernelEntry = kernel.kernelEntry;\n const attributes = kernel.attributes;\n if (this.currentKernelId !== null) {\n throw new Error(`kernel \"[${kernelType}] ${kernelName}\" is not allowed to be called recursively`);\n }\n this.currentKernelId = kernelId;\n\n // parse attributes if necessary\n if (attributes[0]) {\n attributes[1] = attributes[0](attributes[1]);\n attributes[0] = undefined;\n }\n\n LOG_DEBUG('info', () => `[WebGPU] Start to run kernel \"[${kernelType}] ${kernelName}\"...`);\n\n const useErrorScope = this.env.debug;\n\n this.temporaryData = [];\n try {\n if (useErrorScope) {\n this.device.pushErrorScope('validation');\n }\n\n kernelEntry(context, attributes[1]);\n return 0; // ORT_OK\n } catch (e) {\n errors.push(Promise.resolve(`[WebGPU] Kernel \"[${kernelType}] ${kernelName}\" failed. ${e}`));\n return 1; // ORT_FAIL\n } finally {\n if (useErrorScope) {\n errors.push(this.device.popErrorScope().then(\n err => err ? `GPU validation error for kernel \"[${kernelType}] ${kernelName}\": ${err.message}` : null));\n }\n\n for (const data of this.temporaryData) {\n this.gpuDataManager.release(data.id);\n }\n this.temporaryData = [];\n this.currentKernelId = null;\n }\n }\n\n // #region external buffer\n registerBuffer(sessionId: number, index: number, buffer: GPUBuffer, size: number): number {\n let sessionInputOutputMapping = this.sessionExternalDataMapping.get(sessionId);\n if (!sessionInputOutputMapping) {\n sessionInputOutputMapping = new Map();\n this.sessionExternalDataMapping.set(sessionId, sessionInputOutputMapping);\n }\n\n const previousBuffer = sessionInputOutputMapping.get(index);\n const id = this.gpuDataManager.registerExternalBuffer(buffer, size, previousBuffer?.[1]);\n sessionInputOutputMapping.set(index, [id, buffer]);\n return id;\n }\n unregisterBuffers(sessionId: number): void {\n const sessionInputOutputMapping = this.sessionExternalDataMapping.get(sessionId);\n if (sessionInputOutputMapping) {\n sessionInputOutputMapping.forEach(bufferInfo => this.gpuDataManager.unregisterExternalBuffer(bufferInfo[1]));\n this.sessionExternalDataMapping.delete(sessionId);\n }\n }\n getBuffer(gpuDataId: number): GPUBuffer {\n const gpuData = this.gpuDataManager.get(gpuDataId);\n if (!gpuData) {\n throw new Error(`no GPU data for buffer: ${gpuDataId}`);\n }\n return gpuData.buffer;\n }\n createDownloader(gpuBuffer: GPUBuffer, size: number, type: Tensor.GpuBufferDataTypes):\n () => Promise {\n return async () => {\n const data = await downloadGpuData(this, gpuBuffer, size);\n return createView(data.buffer, type);\n };\n }\n // #endregion\n writeTimestamp(index: number): void {\n if (this.queryType !== 'inside-passes') {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.computePassEncoder as any).writeTimestamp(this.querySet, index);\n }\n setQueryType(): void {\n this.queryType = 'none';\n if (this.env.webgpu.profiling?.mode === 'default' ||\n (typeof this.env.trace === 'undefined' ? this.env.wasm.trace : this.env.trace)) {\n if (this.device.features.has('chromium-experimental-timestamp-query-inside-passes')) {\n this.queryType = 'inside-passes';\n } else if (this.device.features.has('timestamp-query')) {\n this.queryType = 'at-passes';\n }\n\n if (this.queryType !== 'none' && typeof this.querySet === 'undefined') {\n this.querySet = this.device.createQuerySet({\n type: 'timestamp',\n count: this.maxDispatchNumber * 2,\n });\n this.queryResolveBuffer = this.device.createBuffer(\n // eslint-disable-next-line no-bitwise\n {size: this.maxDispatchNumber * 2 * 8, usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.QUERY_RESOLVE});\n }\n }\n }\n\n captureBegin(): void {\n LOG_DEBUG('info', 'captureBegin');\n if (!this.capturedCommandList.get(this.currentSessionId!)) {\n this.capturedCommandList.set(this.currentSessionId!, []);\n }\n if (!this.capturedPendingKernels.get(this.currentSessionId!)) {\n this.capturedPendingKernels.set(this.currentSessionId!, []);\n }\n // flush the left commands before we change the status.\n this.flush();\n this.sessionStatus = 'capturing';\n }\n captureEnd(): void {\n LOG_DEBUG('info', 'captureEnd');\n // flush the left commands before we change the status.\n this.flush();\n this.sessionStatus = 'default';\n }\n replay(): void {\n LOG_DEBUG('info', 'replay');\n this.sessionStatus = 'replaying';\n const sessionCommandList = this.capturedCommandList.get(this.currentSessionId!);\n const sessionPendingKernels = this.capturedPendingKernels.get(this.currentSessionId!);\n const length = sessionCommandList!.length;\n this.pendingKernels = [];\n for (let i = 0; i < length; i++) {\n const computePassEncoder = this.getComputePassEncoder();\n const command = sessionCommandList![i];\n this.writeTimestamp(this.pendingDispatchNumber * 2);\n computePassEncoder.setPipeline(command.computePipeline);\n computePassEncoder.setBindGroup(0, command.bindGroup);\n computePassEncoder.dispatchWorkgroups(...command.dispatchGroup);\n this.writeTimestamp(this.pendingDispatchNumber * 2 + 1);\n this.pendingDispatchNumber++;\n if (this.queryType !== 'none') {\n this.pendingKernels.push(sessionPendingKernels![i]);\n }\n if (this.pendingDispatchNumber >= this.maxDispatchNumber || this.queryType === 'at-passes') {\n this.endComputePass();\n }\n if (this.pendingDispatchNumber >= this.maxDispatchNumber) {\n this.flush();\n }\n }\n // flush the left commands before we change the status.\n this.flush();\n this.sessionStatus = 'default';\n }\n\n onReleaseSession(sessionId: number): void {\n this.unregisterBuffers(sessionId);\n if (this.capturedCommandList.has(sessionId)) {\n this.capturedCommandList.delete(sessionId);\n }\n if (this.capturedPendingKernels.has(sessionId)) {\n this.capturedPendingKernels.delete(sessionId);\n }\n this.gpuDataManager.onReleaseSession(sessionId);\n }\n\n onRunStart(sessionId: number): void {\n this.currentSessionId = sessionId;\n this.setQueryType();\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Env} from 'onnxruntime-common';\n\nimport type {OrtWasmModule} from '../wasm-types';\nimport {DataType, getTensorElementSize} from '../wasm-common';\n\nimport {WebGpuBackend} from './backend-webgpu';\nimport {LOG_DEBUG} from './log';\nimport {TensorView} from './tensor-view';\nimport {ShapeUtil} from './util';\nimport {AdapterInfo, ComputeContext, ComputeContextInputsOutputsMapping, ProgramInfo} from './webgpu/types';\n\n/* eslint-disable no-bitwise */\n\nclass TensorViewImpl implements TensorView {\n constructor(\n private module: OrtWasmModule, public readonly dataType: number, public readonly data: number,\n public readonly dims: readonly number[]) {}\n\n getFloat32Array(): Float32Array {\n if (this.dataType !== DataType.float) {\n throw new Error('Invalid data type');\n }\n const elementCount = ShapeUtil.size(this.dims);\n return elementCount === 0 ? new Float32Array() :\n new Float32Array(this.module.HEAP8.buffer, this.data, elementCount);\n }\n\n getBigInt64Array(): BigInt64Array {\n if (this.dataType !== DataType.int64) {\n throw new Error('Invalid data type');\n }\n const elementCount = ShapeUtil.size(this.dims);\n return elementCount === 0 ? new BigInt64Array() :\n new BigInt64Array(this.module.HEAP8.buffer, this.data, elementCount);\n }\n\n getInt32Array(): Int32Array {\n if (this.dataType !== DataType.int32) {\n throw new Error('Invalid data type');\n }\n const elementCount = ShapeUtil.size(this.dims);\n return elementCount === 0 ? new Int32Array() : new Int32Array(this.module.HEAP8.buffer, this.data, elementCount);\n }\n\n reshape(newDims: readonly number[]): TensorView {\n if (ShapeUtil.size(newDims) !== ShapeUtil.size(this.dims)) {\n throw new Error('Invalid new shape');\n }\n return new TensorViewImpl(this.module, this.dataType, this.data, newDims);\n }\n}\n\nclass ComputeContextImpl implements ComputeContext {\n readonly adapterInfo: AdapterInfo;\n readonly opKernelContext: number;\n readonly inputs: readonly TensorView[];\n readonly outputCount: number;\n get kernelCustomData(): {[key: string]: unknown} {\n return this.backend.currentKernelCustomData;\n }\n get customDataBuffer(): Uint8Array {\n return this.module.HEAPU8.subarray(this.customDataOffset, this.customDataOffset + this.customDataSize);\n }\n private customDataOffset = 0;\n private customDataSize = 0;\n constructor(private module: OrtWasmModule, private backend: WebGpuBackend, contextDataOffset: number) {\n this.adapterInfo = backend.adapterInfo;\n const heapU32 = module.HEAPU32;\n\n // extract context data\n let dataIndex = (contextDataOffset >>> 2);\n this.opKernelContext = heapU32[dataIndex++];\n const inputCount = heapU32[dataIndex++];\n this.outputCount = heapU32[dataIndex++];\n this.customDataOffset = heapU32[dataIndex++];\n this.customDataSize = heapU32[dataIndex++];\n\n const inputs: TensorView[] = [];\n for (let i = 0; i < inputCount; i++) {\n const dataType = heapU32[dataIndex++];\n const data = heapU32[dataIndex++];\n const dim = heapU32[dataIndex++];\n const dims: number[] = [];\n for (let d = 0; d < dim; d++) {\n dims.push(heapU32[dataIndex++]);\n }\n inputs.push(new TensorViewImpl(module, dataType, data, dims));\n }\n this.inputs = inputs;\n }\n\n getMaxComputeWorkgroupSizes(): [number, number, number] {\n return [\n this.backend.device.limits.maxComputeWorkgroupSizeX, this.backend.device.limits.maxComputeWorkgroupSizeY,\n this.backend.device.limits.maxComputeWorkgroupSizeZ\n ];\n }\n\n getMaxComputeWorkgroupStoragesize(): number {\n return this.backend.device.limits.maxComputeWorkgroupStorageSize;\n }\n\n compute(program: ProgramInfo, inputsOutputsMapping?: ComputeContextInputsOutputsMapping): TensorView[] {\n // prepare inputs. inputs should always be valid data.\n const mappedInputs =\n inputsOutputsMapping?.inputs?.map(i => typeof i === 'number' ? this.inputs[i] : i) ?? this.inputs;\n // prepare outputs.\n const outputIndices = inputsOutputsMapping?.outputs ?? [];\n const createKernelOutput = (index: number, dataType: number, dims: readonly number[]): TensorView =>\n new TensorViewImpl(this.module, dataType, this.output(index, dims), dims);\n const createTemporaryOutput = (dataType: number, dims: readonly number[]): TensorView => {\n const elementSize = getTensorElementSize(dataType);\n if (!elementSize) {\n throw new Error(`Unsupported data type: ${dataType}`);\n }\n const bufferSize = elementSize * ShapeUtil.size(dims);\n const gpuDataId = bufferSize > 0 ? this.backend.gpuDataManager.create(bufferSize).id : 0;\n return new TensorViewImpl(this.module, dataType, gpuDataId, dims);\n };\n return this.backend.run(\n program, mappedInputs, outputIndices, createKernelOutput, createTemporaryOutput, this.outputCount);\n }\n\n output(index: number, dims: readonly number[]): number {\n const stack = this.module.stackSave();\n try {\n const data = this.module.stackAlloc((1 + dims.length) * 4 /* sizeof(size_t) */);\n let offset = data >> 2;\n this.module.HEAPU32[offset++] = dims.length;\n for (let i = 0; i < dims.length; i++) {\n this.module.HEAPU32[offset++] = dims[i];\n }\n return this.module._JsepOutput!(this.opKernelContext, index, data);\n } catch (e) {\n throw new Error(\n `Failed to generate kernel's output[${index}] with dims [${dims}]. ` +\n 'If you are running with pre-allocated output, please make sure the output type/dims are correct. ' +\n `Error: ${e}`);\n } finally {\n this.module.stackRestore(stack);\n }\n }\n}\n\n/**\n * Initialize JSEP with WebGPU backend.\n *\n * This function will be called after the WebAssembly module is loaded and initialized (\"_OrtInit\" is called), once for\n * each of the following EPs if they are specified:\n * - \"webgpu\"\n * - \"webnn\"\n *\n * For WebGPU, this function expects:\n * - WebGPU is enabled in build (BUILD_DEFS.DISABLE_JSEP === false).\n * - WebGPU is available in current environment. (a valid GPUAdapter is passed in)\n *\n * For WebNN, this function expects:\n * - WebNN is enabled in build (BUILD_DEFS.DISABLE_JSEP === false).\n * - WebNN is available in current environment. (navigator.ml is not undefined)\n *\n * If the WebAssembly module is not built with JSEP support, this function will throw an error. This will invalidate\n * 'webgpu'/'webnn' backend.\n *\n * @param name - the name of the EP, either \"webgpu\" or \"webnn\"\n * @param module - the ORT WebAssembly module\n * @param env - the ORT environment variable (ort.env)\n * @param gpuAdapter - the pre-created GPU adapter\n */\nexport const init =\n async(name: 'webgpu'|'webnn', module: OrtWasmModule, env: Env, gpuAdapter?: GPUAdapter): Promise => {\n const jsepInit = module.jsepInit;\n if (!jsepInit) {\n throw new Error('Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.');\n }\n\n if (name === 'webgpu') {\n const backend = new WebGpuBackend();\n await backend.initialize(env, gpuAdapter!);\n\n jsepInit('webgpu', [\n // backend\n backend,\n\n // jsepAlloc()\n (size: number) => backend.alloc(size),\n\n // jsepFree()\n (ptr: number) => backend.free(ptr),\n\n // jsepCopy(src, dst, size, isSourceGpu)\n (src: number, dst: number, size: number, isSourceGpu = false) => {\n if (isSourceGpu) {\n LOG_DEBUG('verbose', () => `[WebGPU] jsepCopyGpuToGpu: src=${src}, dst=${dst}, size=${size}`);\n backend.memcpy(src, dst);\n } else {\n LOG_DEBUG('verbose', () => `[WebGPU] jsepCopyCpuToGpu: dataOffset=${src}, gpuDataId=${dst}, size=${size}`);\n const data = module.HEAPU8.subarray(src >>> 0, (src >>> 0) + size);\n backend.upload(dst, data);\n }\n },\n\n // jsepCopyAsync(src, dst, size)\n async(gpuDataId: number, dataOffset: number, size: number):\n Promise => {\n LOG_DEBUG(\n 'verbose',\n () => `[WebGPU] jsepCopyGpuToCpu: gpuDataId=${gpuDataId}, dataOffset=${dataOffset}, size=${size}`);\n\n await backend.download(\n gpuDataId, () => module.HEAPU8.subarray(dataOffset >>> 0, (dataOffset >>> 0) + size));\n },\n\n // jsepCreateKernel\n (kernelType: string, kernelId: number, attribute: unknown) => backend.createKernel(\n kernelType, kernelId, attribute, module.UTF8ToString(module._JsepGetNodeName!(kernelId))),\n\n // jsepReleaseKernel\n (kernel: number) => backend.releaseKernel(kernel),\n\n // jsepRun\n (kernel: number, contextDataOffset: number, sessionHandle: number, errors: Array>) => {\n LOG_DEBUG(\n 'verbose',\n () => `[WebGPU] jsepRun: sessionHandle=${sessionHandle}, kernel=${kernel}, contextDataOffset=${\n contextDataOffset}`);\n const context = new ComputeContextImpl(module, backend, contextDataOffset);\n return backend.computeKernel(kernel, context, errors);\n },\n // jsepCaptureBegin\n () => backend.captureBegin(),\n // jsepCaptureEnd\n () => backend.captureEnd(),\n // jsepReplay\n () => backend.replay()\n ]);\n } else {\n jsepInit('webnn');\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// WebNN API currently does not have a TypeScript definition file. This file is a workaround with types generated from\n// WebNN API specification.\n// https://github.com/webmachinelearning/webnn/issues/677\n/// \n\nimport {Env, InferenceSession, Tensor} from 'onnxruntime-common';\n\nimport {SerializableInternalBuffer, SerializableSessionMetadata, SerializableTensorMetadata, TensorMetadata} from './proxy-messages';\nimport {setRunOptions} from './run-options';\nimport {setSessionOptions} from './session-options';\nimport {dataLocationStringToEnum, getTensorElementSize, isGpuBufferSupportedType, logLevelStringToEnum, tensorDataTypeEnumToString, tensorDataTypeStringToEnum, tensorTypeToTypedArrayConstructor} from './wasm-common';\nimport {getInstance} from './wasm-factory';\nimport {allocWasmString, checkLastError} from './wasm-utils';\nimport {loadFile} from './wasm-utils-load-file';\n\n// #region Initializations\n\n/**\n * There are 4 different \"initialization\" steps for ORT. They happen in different places and different time.\n *\n * 1. JavaScript initialization for onnxruntime-common and onnxruntime-web.\n * This is the first initialization step. In this step, onnxruntime-web calls onnxruntime-common's registerBackend()\n * function multiple times to register all the available backends. The backend registration is very fast. It only\n * registers the backend name with the uninitialized backend object. No heavy initialization is done in this step.\n * Refer to web/lib/index.ts for the backend registration.\n *\n * 2. WebAssembly artifact initialization.\n * This happens when any registered wasm backend is used for the first time (ie. `ort.InferenceSession.create()` or\n * `ort.TrainingSession.create()` is called). In this step, onnxruntime-web does the followings:\n * - create a proxy worker and make sure the proxy worker is ready to receive messages, if proxy is enabled.\n * - perform feature detection, locate correct WebAssembly artifact path and call the Emscripten generated\n * JavaScript code to initialize the WebAssembly runtime.\n * - if proxy is enabled, this step happens in the proxy worker using message 'init-wasm'.\n * - downloading the 'ort-wasm{...}.wasm' file is done in this step.\n * - if multi-thread is enabled, one or more webworker will be created to initialize the PThread threadpool.\n *\n * 3. ORT environment initialization.\n * This happens after step 2. In this step, onnxruntime-web performs ONNX Runtime environment initialization.\n * Function `_OrtInit()` is called in this step.\n * - if proxy is enabled, this step happens in the proxy worker using message 'init-ort'.\n * - logging level (ort.env.logLevel) and thread number (ort.env.wasm.numThreads) are set in this step.\n *\n * 4. Session initialization.\n * This happens when `ort.InferenceSession.create()` or `ort.TrainingSession.create()` is called. Unlike the first 3\n * steps (they only called once), this step will be done for each session. In this step, onnxruntime-web does the\n * followings:\n * If the parameter is a URL:\n * - download the model data from the URL.\n * - copy the model data to the WASM heap. (proxy: 'copy-from')\n * - dereference the model buffer. This step allows the original ArrayBuffer to be garbage collected.\n * - call `_OrtCreateSession()` to create the session. (proxy: 'create')\n *\n * If the parameter is a Uint8Array object:\n * - copy the model data to the WASM heap. (proxy: 'copy-from')\n * - call `_OrtCreateSession()` to create the session. (proxy: 'create')\n *\n *\n */\n\n/**\n * initialize ORT environment.\n *\n * @param numThreads SetGlobalIntraOpNumThreads(numThreads)\n * @param loggingLevel CreateEnv(static_cast(logging_level))\n */\nconst initOrt = (numThreads: number, loggingLevel: number): void => {\n const errorCode = getInstance()._OrtInit(numThreads, loggingLevel);\n if (errorCode !== 0) {\n checkLastError('Can\\'t initialize onnxruntime.');\n }\n};\n\n/**\n * initialize runtime environment.\n * @param env passed in the environment config object.\n */\nexport const initRuntime = async(env: Env): Promise => {\n // init ORT\n initOrt(env.wasm.numThreads!, logLevelStringToEnum(env.logLevel));\n};\n\n/**\n * perform EP specific initialization.\n *\n * @param env\n * @param epName\n */\nexport const initEp = async(env: Env, epName: string): Promise => {\n if (!BUILD_DEFS.DISABLE_JSEP) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires\n const initJsep = require('./jsep/init').init;\n\n if (epName === 'webgpu') {\n // perform WebGPU availability check\n if (typeof navigator === 'undefined' || !navigator.gpu) {\n throw new Error('WebGPU is not supported in current environment');\n }\n\n let adapter = env.webgpu.adapter as GPUAdapter | null;\n if (!adapter) {\n // if adapter is not set, request a new adapter.\n const powerPreference = env.webgpu.powerPreference;\n if (powerPreference !== undefined && powerPreference !== 'low-power' &&\n powerPreference !== 'high-performance') {\n throw new Error(`Invalid powerPreference setting: \"${powerPreference}\"`);\n }\n const forceFallbackAdapter = env.webgpu.forceFallbackAdapter;\n if (forceFallbackAdapter !== undefined && typeof forceFallbackAdapter !== 'boolean') {\n throw new Error(`Invalid forceFallbackAdapter setting: \"${forceFallbackAdapter}\"`);\n }\n adapter = await navigator.gpu.requestAdapter({powerPreference, forceFallbackAdapter});\n if (!adapter) {\n throw new Error(\n 'Failed to get GPU adapter. ' +\n 'You may need to enable flag \"--enable-unsafe-webgpu\" if you are using Chrome.');\n }\n } else {\n // if adapter is set, validate it.\n if (typeof adapter.limits !== 'object' || typeof adapter.features !== 'object' ||\n typeof adapter.requestDevice !== 'function') {\n throw new Error('Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.');\n }\n }\n\n await initJsep('webgpu', getInstance(), env, adapter);\n }\n if (epName === 'webnn') {\n // perform WebNN availability check\n if (typeof navigator === 'undefined' || !(navigator as unknown as {ml: unknown}).ml) {\n throw new Error('WebNN is not supported in current environment');\n }\n\n await initJsep('webnn', getInstance(), env);\n }\n }\n};\n\n// #endregion Initializations\n\n/**\n * valid data locations for input/output tensors.\n */\ntype SupportedTensorDataLocationForInputOutput = 'cpu'|'cpu-pinned'|'gpu-buffer';\n\ntype IOBindingState = {\n /**\n * the handle of IO binding.\n */\n readonly handle: number;\n\n /**\n * the preferred location for each output tensor.\n *\n * value is one of 'cpu', 'cpu-pinned', 'gpu-buffer'.\n */\n readonly outputPreferredLocations: readonly SupportedTensorDataLocationForInputOutput[];\n\n /**\n * enum value of the preferred location for each output tensor.\n */\n readonly outputPreferredLocationsEncoded: readonly number[];\n};\n\n/**\n * tuple elements are: InferenceSession ID; inputNamesUTF8Encoded; outputNamesUTF8Encoded; bindingState\n */\ntype SessionMetadata = [\n inferenceSessionId: number, inputNamesUTF8Encoded: number[], outputNamesUTF8Encoded: number[],\n bindingState: IOBindingState|null, enableGraphCapture: boolean, inputOutputBound: boolean\n];\n\nconst activeSessions = new Map();\n\n/**\n * get the input/output count of the session.\n * @param sessionHandle the handle representing the session. should be non-zero.\n * @returns a tuple including 2 numbers, representing the input count and output count.\n */\nconst getSessionInputOutputCount = (sessionHandle: number): [number, number] => {\n const wasm = getInstance();\n const stack = wasm.stackSave();\n try {\n const dataOffset = wasm.stackAlloc(8);\n const errorCode = wasm._OrtGetInputOutputCount(sessionHandle, dataOffset, dataOffset + 4);\n if (errorCode !== 0) {\n checkLastError('Can\\'t get session input/output count.');\n }\n return [wasm.HEAP32[dataOffset / 4], wasm.HEAP32[dataOffset / 4 + 1]];\n } finally {\n wasm.stackRestore(stack);\n }\n};\n\n/**\n * allocate the memory and memcpy the external buffer.\n *\n * @param model - the external buffer containing the model data. Must not be the same buffer as the WASM heap.\n * @returns a 2-elements tuple - the pointer and size of the allocated buffer\n */\nexport const copyFromExternalBuffer = (model: Uint8Array): [number, number] => {\n const wasm = getInstance();\n const modelDataOffset = wasm._malloc(model.byteLength);\n if (modelDataOffset === 0) {\n throw new Error(`Can't create a session. failed to allocate a buffer of size ${model.byteLength}.`);\n }\n wasm.HEAPU8.set(model, modelDataOffset);\n return [modelDataOffset, model.byteLength];\n};\n\n/**\n * create an inference session from a model data buffer.\n *\n * @param modelData - either a Uint8Array object representing the model data, or a 2-elements tuple containing the\n * pointer and size of the model data buffer.\n * @param options an optional session options object.\n * @returns a 3-elements tuple containing [session handle, input names, output names]\n */\nexport const createSession = async(\n modelData: Uint8Array|SerializableInternalBuffer,\n options?: InferenceSession.SessionOptions): Promise => {\n let modelDataOffset: number, modelDataLength: number;\n const wasm = getInstance();\n\n if (Array.isArray(modelData)) {\n // if model data is an array, it must be a 2-elements tuple containing the pointer and size of the model data\n [modelDataOffset, modelDataLength] = modelData;\n } else if (modelData.buffer === wasm.HEAPU8.buffer) {\n // if model data uses the same buffer as the WASM heap, we don't need to copy it.\n [modelDataOffset, modelDataLength] = [modelData.byteOffset, modelData.byteLength];\n } else {\n // otherwise, copy the model data to the WASM heap.\n [modelDataOffset, modelDataLength] = copyFromExternalBuffer(modelData);\n }\n\n let sessionHandle = 0;\n let sessionOptionsHandle = 0;\n let ioBindingHandle = 0;\n let allocs: number[] = [];\n const inputNamesUTF8Encoded = [];\n const outputNamesUTF8Encoded = [];\n\n try {\n [sessionOptionsHandle, allocs] = setSessionOptions(options);\n\n if (options?.externalData && wasm.mountExternalData) {\n const loadingPromises = [];\n for (const file of options.externalData) {\n const path = typeof file === 'string' ? file : file.path;\n loadingPromises.push(loadFile(typeof file === 'string' ? file : file.data).then(data => {\n wasm.mountExternalData!(path, data);\n }));\n }\n\n // wait for all external data files to be loaded\n await Promise.all(loadingPromises);\n }\n\n for (const provider of options?.executionProviders ?? []) {\n const providerName = typeof provider === 'string' ? provider : provider.name;\n if (providerName === 'webnn') {\n if (wasm.currentContext) {\n throw new Error('WebNN execution provider is already set.');\n }\n if (typeof provider !== 'string') {\n const webnnOptions = provider as InferenceSession.WebNNExecutionProviderOption;\n const context = (webnnOptions as InferenceSession.WebNNOptionsWithMLContext)?.context;\n const gpuDevice = (webnnOptions as InferenceSession.WebNNOptionsWebGpu)?.gpuDevice;\n const deviceType = (webnnOptions as InferenceSession.WebNNContextOptions)?.deviceType;\n const numThreads = (webnnOptions as InferenceSession.WebNNContextOptions)?.numThreads;\n const powerPreference = (webnnOptions as InferenceSession.WebNNContextOptions)?.powerPreference;\n if (context) {\n wasm.currentContext = context as MLContext;\n } else if (gpuDevice) {\n wasm.currentContext = await navigator.ml.createContext(gpuDevice);\n } else {\n wasm.currentContext = await navigator.ml.createContext({deviceType, numThreads, powerPreference});\n }\n } else {\n wasm.currentContext = await navigator.ml.createContext();\n }\n break;\n }\n }\n\n sessionHandle = await wasm._OrtCreateSession(modelDataOffset, modelDataLength, sessionOptionsHandle);\n if (sessionHandle === 0) {\n checkLastError('Can\\'t create a session.');\n }\n\n // clear current MLContext after session creation\n if (wasm.currentContext) {\n wasm.currentContext = undefined;\n }\n\n const [inputCount, outputCount] = getSessionInputOutputCount(sessionHandle);\n\n const enableGraphCapture = !!options?.enableGraphCapture;\n\n const inputNames = [];\n const outputNames = [];\n const outputPreferredLocations: SupportedTensorDataLocationForInputOutput[] = [];\n for (let i = 0; i < inputCount; i++) {\n const name = wasm._OrtGetInputName(sessionHandle, i);\n if (name === 0) {\n checkLastError('Can\\'t get an input name.');\n }\n inputNamesUTF8Encoded.push(name);\n inputNames.push(wasm.UTF8ToString(name));\n }\n for (let i = 0; i < outputCount; i++) {\n const name = wasm._OrtGetOutputName(sessionHandle, i);\n if (name === 0) {\n checkLastError('Can\\'t get an output name.');\n }\n outputNamesUTF8Encoded.push(name);\n const nameString = wasm.UTF8ToString(name);\n outputNames.push(nameString);\n\n if (!BUILD_DEFS.DISABLE_JSEP) {\n if (enableGraphCapture && options?.preferredOutputLocation === undefined) {\n outputPreferredLocations.push('gpu-buffer');\n continue;\n }\n const location = typeof options?.preferredOutputLocation === 'string' ?\n options.preferredOutputLocation :\n options?.preferredOutputLocation?.[nameString] ?? 'cpu';\n if (location !== 'cpu' && location !== 'cpu-pinned' && location !== 'gpu-buffer') {\n throw new Error(`Not supported preferred output location: ${location}.`);\n }\n if (enableGraphCapture && location !== 'gpu-buffer') {\n throw new Error(`Not supported preferred output location: ${\n location}. Only 'gpu-buffer' location is supported when enableGraphCapture is true.`);\n }\n outputPreferredLocations.push(location);\n }\n }\n\n // use IO binding only when at least one output is preffered to be on GPU.\n let bindingState: IOBindingState|null = null;\n if (!BUILD_DEFS.DISABLE_JSEP && outputPreferredLocations.some(l => l === 'gpu-buffer')) {\n ioBindingHandle = wasm._OrtCreateBinding(sessionHandle);\n if (ioBindingHandle === 0) {\n checkLastError('Can\\'t create IO binding.');\n }\n\n bindingState = {\n handle: ioBindingHandle,\n outputPreferredLocations,\n outputPreferredLocationsEncoded: outputPreferredLocations.map(l => dataLocationStringToEnum(l)),\n };\n }\n\n activeSessions.set(\n sessionHandle,\n [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, bindingState, enableGraphCapture, false]);\n return [sessionHandle, inputNames, outputNames];\n } catch (e) {\n inputNamesUTF8Encoded.forEach(buf => wasm._OrtFree(buf));\n outputNamesUTF8Encoded.forEach(buf => wasm._OrtFree(buf));\n\n if (ioBindingHandle !== 0) {\n wasm._OrtReleaseBinding(ioBindingHandle);\n }\n\n if (sessionHandle !== 0) {\n wasm._OrtReleaseSession(sessionHandle);\n }\n throw e;\n } finally {\n wasm._free(modelDataOffset);\n if (sessionOptionsHandle !== 0) {\n wasm._OrtReleaseSessionOptions(sessionOptionsHandle);\n }\n allocs.forEach(alloc => wasm._free(alloc));\n\n // unmount external data if necessary\n wasm.unmountExternalData?.();\n }\n};\n\nexport const releaseSession = (sessionId: number): void => {\n const wasm = getInstance();\n const session = activeSessions.get(sessionId);\n if (!session) {\n throw new Error(`cannot release session. invalid session id: ${sessionId}`);\n }\n const [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, ioBindingState, enableGraphCapture] = session;\n\n if (ioBindingState) {\n if (enableGraphCapture) {\n wasm._OrtClearBoundOutputs(ioBindingState.handle);\n }\n wasm._OrtReleaseBinding(ioBindingState.handle);\n }\n\n wasm.jsepOnReleaseSession?.(sessionId);\n\n inputNamesUTF8Encoded.forEach(buf => wasm._OrtFree(buf));\n outputNamesUTF8Encoded.forEach(buf => wasm._OrtFree(buf));\n wasm._OrtReleaseSession(sessionHandle);\n activeSessions.delete(sessionId);\n};\n\nexport const prepareInputOutputTensor =\n (tensor: TensorMetadata|null, tensorHandles: number[], allocs: number[], sessionId: number, index: number,\n enableGraphCapture = false): void => {\n if (!tensor) {\n tensorHandles.push(0);\n return;\n }\n\n const wasm = getInstance();\n\n const dataType = tensor[0];\n const dims = tensor[1];\n const location = tensor[3];\n\n let rawData: number;\n let dataByteLength: number;\n\n if (dataType === 'string' && location === 'gpu-buffer') {\n throw new Error('String tensor is not supported on GPU.');\n }\n\n if (enableGraphCapture && location !== 'gpu-buffer') {\n throw new Error(\n `External buffer must be provided for input/output index ${index} when enableGraphCapture is true.`);\n }\n\n if (location === 'gpu-buffer') {\n const gpuBuffer = tensor[2].gpuBuffer as GPUBuffer;\n const elementSizeInBytes = getTensorElementSize(tensorDataTypeStringToEnum(dataType))!;\n dataByteLength = dims.reduce((a, b) => a * b, 1) * elementSizeInBytes;\n\n const registerBuffer = wasm.jsepRegisterBuffer;\n if (!registerBuffer) {\n throw new Error('Tensor location \"gpu-buffer\" is not supported without using WebGPU.');\n }\n rawData = registerBuffer(sessionId, index, gpuBuffer, dataByteLength);\n } else {\n const data = tensor[2];\n\n if (Array.isArray(data)) {\n // string tensor\n dataByteLength = 4 * data.length;\n rawData = wasm._malloc(dataByteLength);\n allocs.push(rawData);\n let dataIndex = rawData / 4;\n for (let i = 0; i < data.length; i++) {\n if (typeof data[i] !== 'string') {\n throw new TypeError(`tensor data at index ${i} is not a string`);\n }\n wasm.HEAPU32[dataIndex++] = allocWasmString(data[i], allocs);\n }\n } else {\n dataByteLength = data.byteLength;\n rawData = wasm._malloc(dataByteLength);\n allocs.push(rawData);\n wasm.HEAPU8.set(new Uint8Array(data.buffer, data.byteOffset, dataByteLength), rawData);\n }\n }\n\n const stack = wasm.stackSave();\n const dimsOffset = wasm.stackAlloc(4 * dims.length);\n try {\n let dimIndex = dimsOffset / 4;\n dims.forEach(d => wasm.HEAP32[dimIndex++] = d);\n const tensor = wasm._OrtCreateTensor(\n tensorDataTypeStringToEnum(dataType), rawData, dataByteLength, dimsOffset, dims.length,\n dataLocationStringToEnum(location));\n if (tensor === 0) {\n checkLastError(`Can't create tensor for input/output. session=${sessionId}, index=${index}.`);\n }\n tensorHandles.push(tensor);\n } finally {\n wasm.stackRestore(stack);\n }\n };\n\n/**\n * perform inference run\n */\nexport const run = async(\n sessionId: number, inputIndices: number[], inputTensors: TensorMetadata[], outputIndices: number[],\n outputTensors: Array, options: InferenceSession.RunOptions): Promise => {\n const wasm = getInstance();\n const session = activeSessions.get(sessionId);\n if (!session) {\n throw new Error(`cannot run inference. invalid session id: ${sessionId}`);\n }\n const sessionHandle = session[0];\n const inputNamesUTF8Encoded = session[1];\n const outputNamesUTF8Encoded = session[2];\n const ioBindingState = session[3];\n const enableGraphCapture = session[4];\n const inputOutputBound = session[5];\n\n const inputCount = inputIndices.length;\n const outputCount = outputIndices.length;\n\n let runOptionsHandle = 0;\n let runOptionsAllocs: number[] = [];\n\n const inputTensorHandles: number[] = [];\n const outputTensorHandles: number[] = [];\n const inputOutputAllocs: number[] = [];\n\n const beforeRunStack = wasm.stackSave();\n const inputValuesOffset = wasm.stackAlloc(inputCount * 4);\n const inputNamesOffset = wasm.stackAlloc(inputCount * 4);\n const outputValuesOffset = wasm.stackAlloc(outputCount * 4);\n const outputNamesOffset = wasm.stackAlloc(outputCount * 4);\n\n try {\n [runOptionsHandle, runOptionsAllocs] = setRunOptions(options);\n\n // create input tensors\n for (let i = 0; i < inputCount; i++) {\n prepareInputOutputTensor(\n inputTensors[i], inputTensorHandles, inputOutputAllocs, sessionId, inputIndices[i], enableGraphCapture);\n }\n\n // create output tensors\n for (let i = 0; i < outputCount; i++) {\n prepareInputOutputTensor(\n outputTensors[i], outputTensorHandles, inputOutputAllocs, sessionId, inputCount + outputIndices[i],\n enableGraphCapture);\n }\n\n let inputValuesIndex = inputValuesOffset / 4;\n let inputNamesIndex = inputNamesOffset / 4;\n let outputValuesIndex = outputValuesOffset / 4;\n let outputNamesIndex = outputNamesOffset / 4;\n for (let i = 0; i < inputCount; i++) {\n wasm.HEAPU32[inputValuesIndex++] = inputTensorHandles[i];\n wasm.HEAPU32[inputNamesIndex++] = inputNamesUTF8Encoded[inputIndices[i]];\n }\n for (let i = 0; i < outputCount; i++) {\n wasm.HEAPU32[outputValuesIndex++] = outputTensorHandles[i];\n wasm.HEAPU32[outputNamesIndex++] = outputNamesUTF8Encoded[outputIndices[i]];\n }\n\n if (!BUILD_DEFS.DISABLE_JSEP && ioBindingState && !inputOutputBound) {\n const {handle, outputPreferredLocations, outputPreferredLocationsEncoded} = ioBindingState;\n\n if (inputNamesUTF8Encoded.length !== inputCount) {\n throw new Error(`input count from feeds (${\n inputCount}) is expected to be always equal to model's input count (${inputNamesUTF8Encoded.length}).`);\n }\n\n // process inputs\n for (let i = 0; i < inputCount; i++) {\n const index = inputIndices[i];\n const errorCode = await wasm._OrtBindInput(handle, inputNamesUTF8Encoded[index], inputTensorHandles[i]);\n if (errorCode !== 0) {\n checkLastError(`Can't bind input[${i}] for session=${sessionId}.`);\n }\n }\n\n // process pre-allocated outputs\n for (let i = 0; i < outputCount; i++) {\n const index = outputIndices[i];\n const location = outputTensors[i]?.[3]; // undefined means output is not pre-allocated.\n\n if (location) {\n // output is pre-allocated. bind the tensor.\n const errorCode = wasm._OrtBindOutput(handle, outputNamesUTF8Encoded[index], outputTensorHandles[i], 0);\n if (errorCode !== 0) {\n checkLastError(`Can't bind pre-allocated output[${i}] for session=${sessionId}.`);\n }\n } else {\n // output is not pre-allocated. reset preferred location.\n const errorCode =\n wasm._OrtBindOutput(handle, outputNamesUTF8Encoded[index], 0, outputPreferredLocationsEncoded[index]);\n if (errorCode !== 0) {\n checkLastError(`Can't bind output[${i}] to ${outputPreferredLocations[i]} for session=${sessionId}.`);\n }\n }\n }\n activeSessions.set(\n sessionId,\n [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, ioBindingState, enableGraphCapture, true]);\n }\n\n wasm.jsepOnRunStart?.(sessionHandle);\n let errorCode: number;\n if (!BUILD_DEFS.DISABLE_JSEP && ioBindingState) {\n errorCode = await wasm._OrtRunWithBinding(\n sessionHandle, ioBindingState.handle, outputCount, outputValuesOffset, runOptionsHandle);\n } else {\n errorCode = await wasm._OrtRun(\n sessionHandle, inputNamesOffset, inputValuesOffset, inputCount, outputNamesOffset, outputCount,\n outputValuesOffset, runOptionsHandle);\n }\n\n if (errorCode !== 0) {\n checkLastError('failed to call OrtRun().');\n }\n\n const output: TensorMetadata[] = [];\n\n for (let i = 0; i < outputCount; i++) {\n const tensor = wasm.HEAPU32[outputValuesOffset / 4 + i];\n if (tensor === outputTensorHandles[i]) {\n // output tensor is pre-allocated. no need to copy data.\n output.push(outputTensors[i]!);\n continue;\n }\n\n const beforeGetTensorDataStack = wasm.stackSave();\n // stack allocate 4 pointer value\n const tensorDataOffset = wasm.stackAlloc(4 * 4);\n\n let keepOutputTensor = false;\n let type: Tensor.Type|undefined, dataOffset = 0;\n try {\n const errorCode = wasm._OrtGetTensorData(\n tensor, tensorDataOffset, tensorDataOffset + 4, tensorDataOffset + 8, tensorDataOffset + 12);\n if (errorCode !== 0) {\n checkLastError(`Can't access output tensor data on index ${i}.`);\n }\n let tensorDataIndex = tensorDataOffset / 4;\n const dataType = wasm.HEAPU32[tensorDataIndex++];\n dataOffset = wasm.HEAPU32[tensorDataIndex++];\n const dimsOffset = wasm.HEAPU32[tensorDataIndex++];\n const dimsLength = wasm.HEAPU32[tensorDataIndex++];\n const dims = [];\n for (let i = 0; i < dimsLength; i++) {\n dims.push(wasm.HEAPU32[dimsOffset / 4 + i]);\n }\n wasm._OrtFree(dimsOffset);\n\n const size = dims.reduce((a, b) => a * b, 1);\n type = tensorDataTypeEnumToString(dataType);\n\n const preferredLocation = ioBindingState?.outputPreferredLocations[outputIndices[i]];\n\n if (type === 'string') {\n if (preferredLocation === 'gpu-buffer') {\n throw new Error('String tensor is not supported on GPU.');\n }\n const stringData: string[] = [];\n let dataIndex = dataOffset / 4;\n for (let i = 0; i < size; i++) {\n const offset = wasm.HEAPU32[dataIndex++];\n const maxBytesToRead = i === size - 1 ? undefined : wasm.HEAPU32[dataIndex] - offset;\n stringData.push(wasm.UTF8ToString(offset, maxBytesToRead));\n }\n output.push([type, dims, stringData, 'cpu']);\n } else {\n // If a certain output's preferred location is GPU but the tensor is empty, we still need to create a CPU\n // tensor for it. There is no mapping GPU buffer for an empty tensor.\n if (preferredLocation === 'gpu-buffer' && size > 0) {\n const getBuffer = wasm.jsepGetBuffer;\n if (!getBuffer) {\n throw new Error('preferredLocation \"gpu-buffer\" is not supported without using WebGPU.');\n }\n const gpuBuffer = getBuffer(dataOffset);\n const elementSize = getTensorElementSize(dataType);\n if (elementSize === undefined || !isGpuBufferSupportedType(type)) {\n throw new Error(`Unsupported data type: ${type}`);\n }\n\n // do not release the tensor right now. it will be released when user calls tensor.dispose().\n keepOutputTensor = true;\n\n output.push([\n type, dims, {\n gpuBuffer,\n download: wasm.jsepCreateDownloader!(gpuBuffer, size * elementSize, type),\n dispose: () => {\n wasm._OrtReleaseTensor(tensor);\n }\n },\n 'gpu-buffer'\n ]);\n } else {\n const typedArrayConstructor = tensorTypeToTypedArrayConstructor(type);\n const data = new typedArrayConstructor(size);\n new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n .set(wasm.HEAPU8.subarray(dataOffset, dataOffset + data.byteLength));\n output.push([type, dims, data, 'cpu']);\n }\n }\n } finally {\n wasm.stackRestore(beforeGetTensorDataStack);\n if (type === 'string' && dataOffset) {\n wasm._free(dataOffset);\n }\n if (!keepOutputTensor) {\n wasm._OrtReleaseTensor(tensor);\n }\n }\n }\n\n if (ioBindingState && !enableGraphCapture) {\n wasm._OrtClearBoundOutputs(ioBindingState.handle);\n activeSessions.set(\n sessionId,\n [sessionHandle, inputNamesUTF8Encoded, outputNamesUTF8Encoded, ioBindingState, enableGraphCapture, false]);\n }\n return output;\n } finally {\n wasm.stackRestore(beforeRunStack);\n\n inputTensorHandles.forEach(v => wasm._OrtReleaseTensor(v));\n outputTensorHandles.forEach(v => wasm._OrtReleaseTensor(v));\n inputOutputAllocs.forEach(p => wasm._free(p));\n\n if (runOptionsHandle !== 0) {\n wasm._OrtReleaseRunOptions(runOptionsHandle);\n }\n runOptionsAllocs.forEach(p => wasm._free(p));\n }\n};\n\n/**\n * end profiling\n */\nexport const endProfiling = (sessionId: number): void => {\n const wasm = getInstance();\n const session = activeSessions.get(sessionId);\n if (!session) {\n throw new Error('invalid session id');\n }\n const sessionHandle = session[0];\n\n // profile file name is not used yet, but it must be freed.\n const profileFileName = wasm._OrtEndProfiling(sessionHandle);\n if (profileFileName === 0) {\n checkLastError('Can\\'t get an profile file name.');\n }\n wasm._OrtFree(profileFileName);\n};\n\nexport const extractTransferableBuffers = (tensors: readonly SerializableTensorMetadata[]): ArrayBufferLike[] => {\n const buffers: ArrayBufferLike[] = [];\n for (const tensor of tensors) {\n const data = tensor[2];\n if (!Array.isArray(data) && 'buffer' in data) {\n buffers.push(data.buffer);\n }\n }\n return buffers;\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {env, InferenceSession} from 'onnxruntime-common';\n\nimport {OrtWasmMessage, SerializableInternalBuffer, SerializableSessionMetadata, SerializableTensorMetadata, TensorMetadata} from './proxy-messages';\nimport * as core from './wasm-core-impl';\nimport {initializeWebAssembly} from './wasm-factory';\nimport {importProxyWorker} from './wasm-utils-import';\n\nconst isProxy = (): boolean => !!env.wasm.proxy && typeof document !== 'undefined';\nlet proxyWorker: Worker|undefined;\nlet initializing = false;\nlet initialized = false;\nlet aborted = false;\nlet temporaryObjectUrl: string|undefined;\n\ntype PromiseCallbacks = [resolve: (result: T) => void, reject: (reason: unknown) => void];\nlet initWasmCallbacks: PromiseCallbacks;\nconst queuedCallbacks: Map>> = new Map();\n\nconst enqueueCallbacks = (type: OrtWasmMessage['type'], callbacks: PromiseCallbacks): void => {\n const queue = queuedCallbacks.get(type);\n if (queue) {\n queue.push(callbacks);\n } else {\n queuedCallbacks.set(type, [callbacks]);\n }\n};\n\nconst ensureWorker = (): void => {\n if (initializing || !initialized || aborted || !proxyWorker) {\n throw new Error('worker not ready');\n }\n};\n\nconst onProxyWorkerMessage = (ev: MessageEvent): void => {\n switch (ev.data.type) {\n case 'init-wasm':\n initializing = false;\n if (ev.data.err) {\n aborted = true;\n initWasmCallbacks[1](ev.data.err);\n } else {\n initialized = true;\n initWasmCallbacks[0]();\n }\n if (temporaryObjectUrl) {\n URL.revokeObjectURL(temporaryObjectUrl);\n temporaryObjectUrl = undefined;\n }\n break;\n case 'init-ep':\n case 'copy-from':\n case 'create':\n case 'release':\n case 'run':\n case 'end-profiling': {\n const callbacks = queuedCallbacks.get(ev.data.type)!;\n if (ev.data.err) {\n callbacks.shift()![1](ev.data.err);\n } else {\n callbacks.shift()![0](ev.data.out!);\n }\n break;\n }\n default:\n }\n};\n\n\nexport const initializeWebAssemblyAndOrtRuntime = async(): Promise => {\n if (initialized) {\n return;\n }\n if (initializing) {\n throw new Error('multiple calls to \\'initWasm()\\' detected.');\n }\n if (aborted) {\n throw new Error('previous call to \\'initWasm()\\' failed.');\n }\n\n initializing = true;\n\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n return new Promise((resolve, reject) => {\n proxyWorker?.terminate();\n\n void importProxyWorker().then(([objectUrl, worker]) => {\n try {\n proxyWorker = worker;\n proxyWorker.onerror = (ev: ErrorEvent) => reject(ev);\n proxyWorker.onmessage = onProxyWorkerMessage;\n initWasmCallbacks = [resolve, reject];\n const message: OrtWasmMessage = {type: 'init-wasm', in : env};\n proxyWorker.postMessage(message);\n temporaryObjectUrl = objectUrl;\n } catch (e) {\n reject(e);\n }\n }, reject);\n });\n\n } else {\n try {\n await initializeWebAssembly(env.wasm);\n await core.initRuntime(env);\n initialized = true;\n } catch (e) {\n aborted = true;\n throw e;\n } finally {\n initializing = false;\n }\n }\n};\n\nexport const initializeOrtEp = async(epName: string): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('init-ep', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'init-ep', in : {epName, env}};\n proxyWorker!.postMessage(message);\n });\n } else {\n await core.initEp(env, epName);\n }\n};\n\nexport const copyFromExternalBuffer = async(buffer: Uint8Array): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('copy-from', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'copy-from', in : {buffer}};\n proxyWorker!.postMessage(message, [buffer.buffer]);\n });\n } else {\n return core.copyFromExternalBuffer(buffer);\n }\n};\n\nexport const createSession =\n async(model: SerializableInternalBuffer|Uint8Array, options?: InferenceSession.SessionOptions):\n Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n // check unsupported options\n if (options?.preferredOutputLocation) {\n throw new Error('session option \"preferredOutputLocation\" is not supported for proxy.');\n }\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('create', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'create', in : {model, options: {...options}}};\n const transferable: Transferable[] = [];\n if (model instanceof Uint8Array) {\n transferable.push(model.buffer);\n }\n proxyWorker!.postMessage(message, transferable);\n });\n } else {\n return core.createSession(model, options);\n }\n };\n\nexport const releaseSession = async(sessionId: number): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('release', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'release', in : sessionId};\n proxyWorker!.postMessage(message);\n });\n } else {\n core.releaseSession(sessionId);\n }\n};\n\nexport const run = async(\n sessionId: number, inputIndices: number[], inputs: TensorMetadata[], outputIndices: number[],\n outputs: Array, options: InferenceSession.RunOptions): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n // check inputs location\n if (inputs.some(t => t[3] !== 'cpu')) {\n throw new Error('input tensor on GPU is not supported for proxy.');\n }\n // check outputs location\n if (outputs.some(t => t)) {\n throw new Error('pre-allocated output tensor is not supported for proxy.');\n }\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('run', [resolve, reject]);\n const serializableInputs = inputs as SerializableTensorMetadata[]; // every input is on CPU.\n const message: OrtWasmMessage =\n {type: 'run', in : {sessionId, inputIndices, inputs: serializableInputs, outputIndices, options}};\n proxyWorker!.postMessage(message, core.extractTransferableBuffers(serializableInputs));\n });\n } else {\n return core.run(sessionId, inputIndices, inputs, outputIndices, outputs, options);\n }\n};\n\nexport const endProfiling = async(sessionId: number): Promise => {\n if (!BUILD_DEFS.DISABLE_WASM_PROXY && isProxy()) {\n ensureWorker();\n return new Promise((resolve, reject) => {\n enqueueCallbacks('end-profiling', [resolve, reject]);\n const message: OrtWasmMessage = {type: 'end-profiling', in : sessionId};\n proxyWorker!.postMessage(message);\n });\n } else {\n core.endProfiling(sessionId);\n }\n};\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {InferenceSession, InferenceSessionHandler, SessionHandler, Tensor, TRACE_FUNC_BEGIN, TRACE_FUNC_END} from 'onnxruntime-common';\n\nimport {SerializableInternalBuffer, TensorMetadata} from './proxy-messages';\nimport {copyFromExternalBuffer, createSession, endProfiling, releaseSession, run} from './proxy-wrapper';\nimport {isGpuBufferSupportedType} from './wasm-common';\nimport {isNode} from './wasm-utils-env';\nimport {loadFile} from './wasm-utils-load-file';\n\nexport const encodeTensorMetadata = (tensor: Tensor, getName: () => string): TensorMetadata => {\n switch (tensor.location) {\n case 'cpu':\n return [tensor.type, tensor.dims, tensor.data, 'cpu'];\n case 'gpu-buffer':\n return [tensor.type, tensor.dims, {gpuBuffer: tensor.gpuBuffer}, 'gpu-buffer'];\n default:\n throw new Error(`invalid data location: ${tensor.location} for ${getName()}`);\n }\n};\n\nexport const decodeTensorMetadata = (tensor: TensorMetadata): Tensor => {\n switch (tensor[3]) {\n case 'cpu':\n return new Tensor(tensor[0], tensor[2], tensor[1]);\n case 'gpu-buffer': {\n const dataType = tensor[0];\n if (!isGpuBufferSupportedType(dataType)) {\n throw new Error(`not supported data type: ${dataType} for deserializing GPU tensor`);\n }\n const {gpuBuffer, download, dispose} = tensor[2];\n return Tensor.fromGpuBuffer(gpuBuffer, {dataType, dims: tensor[1], download, dispose});\n }\n default:\n throw new Error(`invalid data location: ${tensor[3]}`);\n }\n};\n\nexport class OnnxruntimeWebAssemblySessionHandler implements InferenceSessionHandler {\n private sessionId: number;\n\n inputNames: string[];\n outputNames: string[];\n\n async fetchModelAndCopyToWasmMemory(path: string): Promise {\n // fetch model from url and move to wasm heap.\n return copyFromExternalBuffer(await loadFile(path));\n }\n\n async loadModel(pathOrBuffer: string|Uint8Array, options?: InferenceSession.SessionOptions): Promise {\n TRACE_FUNC_BEGIN();\n let model: Parameters[0];\n\n if (typeof pathOrBuffer === 'string') {\n if (isNode) {\n // node\n model = await loadFile(pathOrBuffer);\n } else {\n // browser\n // fetch model and copy to wasm heap.\n model = await this.fetchModelAndCopyToWasmMemory(pathOrBuffer);\n }\n } else {\n model = pathOrBuffer;\n }\n\n [this.sessionId, this.inputNames, this.outputNames] = await createSession(model, options);\n TRACE_FUNC_END();\n }\n\n async dispose(): Promise {\n return releaseSession(this.sessionId);\n }\n\n async run(feeds: SessionHandler.FeedsType, fetches: SessionHandler.FetchesType, options: InferenceSession.RunOptions):\n Promise {\n TRACE_FUNC_BEGIN();\n const inputArray: Tensor[] = [];\n const inputIndices: number[] = [];\n Object.entries(feeds).forEach(kvp => {\n const name = kvp[0];\n const tensor = kvp[1];\n const index = this.inputNames.indexOf(name);\n if (index === -1) {\n throw new Error(`invalid input '${name}'`);\n }\n inputArray.push(tensor);\n inputIndices.push(index);\n });\n\n const outputArray: Array = [];\n const outputIndices: number[] = [];\n Object.entries(fetches).forEach(kvp => {\n const name = kvp[0];\n const tensor = kvp[1];\n const index = this.outputNames.indexOf(name);\n if (index === -1) {\n throw new Error(`invalid output '${name}'`);\n }\n outputArray.push(tensor);\n outputIndices.push(index);\n });\n\n const inputs =\n inputArray.map((t, i) => encodeTensorMetadata(t, () => `input \"${this.inputNames[inputIndices[i]]}\"`));\n const outputs = outputArray.map(\n (t, i) => t ? encodeTensorMetadata(t, () => `output \"${this.outputNames[outputIndices[i]]}\"`) : null);\n\n const results = await run(this.sessionId, inputIndices, inputs, outputIndices, outputs, options);\n\n const resultMap: SessionHandler.ReturnType = {};\n for (let i = 0; i < results.length; i++) {\n resultMap[this.outputNames[outputIndices[i]]] = outputArray[i] ?? decodeTensorMetadata(results[i]);\n }\n TRACE_FUNC_END();\n return resultMap;\n }\n\n startProfiling(): void {\n // TODO: implement profiling\n }\n\n endProfiling(): void {\n void endProfiling(this.sessionId);\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {Backend, env, InferenceSession, InferenceSessionHandler} from 'onnxruntime-common';\n\nimport {initializeOrtEp, initializeWebAssemblyAndOrtRuntime} from './wasm/proxy-wrapper';\nimport {OnnxruntimeWebAssemblySessionHandler} from './wasm/session-handler-inference';\nimport {scriptSrc} from './wasm/wasm-utils-import';\n\n/**\n * This function initializes all flags for WebAssembly.\n *\n * Those flags are accessible from `ort.env.wasm`. Users are allow to set those flags before the first inference session\n * being created, to override default value.\n */\nexport const initializeFlags = (): void => {\n if (typeof env.wasm.initTimeout !== 'number' || env.wasm.initTimeout < 0) {\n env.wasm.initTimeout = 0;\n }\n\n if (env.wasm.simd === false) {\n // eslint-disable-next-line no-console\n console.warn(\n 'Deprecated property \"env.wasm.simd\" is set to false. ' +\n 'non-SIMD build is no longer provided, and this setting will be ignored.');\n }\n\n if (typeof env.wasm.proxy !== 'boolean') {\n env.wasm.proxy = false;\n }\n\n if (typeof env.wasm.trace !== 'boolean') {\n env.wasm.trace = false;\n }\n\n if (typeof env.wasm.numThreads !== 'number' || !Number.isInteger(env.wasm.numThreads) || env.wasm.numThreads <= 0) {\n // The following logic only applies when `ort.env.wasm.numThreads` is not set by user. We will always honor user's\n // setting if it is provided.\n\n // Browser: when crossOriginIsolated is false, SharedArrayBuffer is not available so WebAssembly threads will not\n // work. In this case, we will set numThreads to 1.\n //\n // There is an exception: when the browser is configured to force-enable SharedArrayBuffer (e.g. Chromuim with\n // --enable-features=SharedArrayBuffer), it is possible that `self.crossOriginIsolated` is false and\n // SharedArrayBuffer is available at the same time. This is usually for testing. In this case, we will still set\n // numThreads to 1 here. If we want to enable multi-threading in test, we should set `ort.env.wasm.numThreads` to a\n // value greater than 1.\n if (typeof self !== 'undefined' && !self.crossOriginIsolated) {\n env.wasm.numThreads = 1;\n } else {\n const numCpuLogicalCores =\n typeof navigator === 'undefined' ? require('node:os').cpus().length : navigator.hardwareConcurrency;\n env.wasm.numThreads = Math.min(4, Math.ceil((numCpuLogicalCores || 1) / 2));\n }\n }\n\n if (!BUILD_DEFS.DISABLE_DYNAMIC_IMPORT) {\n // overwrite wasm paths override if not set\n if (env.wasm.wasmPaths === undefined && scriptSrc && scriptSrc.indexOf('blob:') !== 0) {\n env.wasm.wasmPaths = scriptSrc.substring(0, scriptSrc.lastIndexOf('/') + 1);\n }\n }\n};\n\nexport class OnnxruntimeWebAssemblyBackend implements Backend {\n /**\n * This function initializes the WebAssembly backend.\n *\n * This function will be called only once for each backend name. It will be called the first time when\n * `ort.InferenceSession.create()` is called with a registered backend name.\n *\n * @param backendName - the registered backend name.\n */\n async init(backendName: string): Promise {\n // populate wasm flags\n initializeFlags();\n\n // init wasm\n await initializeWebAssemblyAndOrtRuntime();\n\n // performe EP specific initialization\n await initializeOrtEp(backendName);\n }\n createInferenceSessionHandler(path: string, options?: InferenceSession.SessionOptions):\n Promise;\n createInferenceSessionHandler(buffer: Uint8Array, options?: InferenceSession.SessionOptions):\n Promise;\n async createInferenceSessionHandler(pathOrBuffer: string|Uint8Array, options?: InferenceSession.SessionOptions):\n Promise {\n const handler = new OnnxruntimeWebAssemblySessionHandler();\n await handler.loadModel(pathOrBuffer, options);\n return Promise.resolve(handler);\n }\n}\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nimport {OnnxruntimeWebAssemblyBackend} from './backend-wasm';\nexport const wasmBackend = new OnnxruntimeWebAssemblyBackend();\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n/* eslint-disable @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports */\n\n// We use \"require\" instead of \"import\" here because import statement must be put in top level. Our current code does\n// not allow bundler to tree-shaking code as expected because some codes are treated as having side effects.\n// So we import code inside the if-clause to allow bundler remove the code safely.\n\nexport * from 'onnxruntime-common';\nimport * as ort from 'onnxruntime-common';\nexport default ort;\n\nimport {registerBackend, env} from 'onnxruntime-common';\nimport {version} from './version';\n\nif (!BUILD_DEFS.DISABLE_WEBGL) {\n const onnxjsBackend = require('./backend-onnxjs').onnxjsBackend;\n registerBackend('webgl', onnxjsBackend, -10);\n}\n\nif (!BUILD_DEFS.DISABLE_WASM) {\n const wasmBackend = BUILD_DEFS.DISABLE_TRAINING ? require('./backend-wasm-inference').wasmBackend :\n require('./backend-wasm-training').wasmBackend;\n if (!BUILD_DEFS.DISABLE_JSEP) {\n registerBackend('webgpu', wasmBackend, 5);\n registerBackend('webnn', wasmBackend, 5);\n }\n registerBackend('cpu', wasmBackend, 10);\n registerBackend('wasm', wasmBackend, 10);\n}\n\nObject.defineProperty(env.versions, 'web', {value: version, enumerable: true});\n", "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\n// This file is generated by /js/scripts/update-version.ts\n// Do not modify file content manually.\n\nexport const version = '1.19.0';\n"], + "mappings": "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", + "names": ["backends", "backendsSortedByPriority", "registerBackend", "tryResolveAndInitializeBackend", "resolveBackendAndExecutionProviders", "init_backend_impl", "__esmMin", "name", "backend", "priority", "currentBackend", "i", "backendName", "backendInfo", "isInitializing", "e", "options", "eps", "backendHints", "backendNames", "errors", "availableBackendNames", "resolveResult", "err", "filteredEps", "target", "prop", "init_backend", "__esmMin", "init_backend_impl", "version", "init_version", "__esmMin", "logLevelValue", "env", "init_env_impl", "__esmMin", "init_version", "version", "value", "env", "init_env", "__esmMin", "init_env_impl", "tensorToDataURL", "tensorToImageData", "init_tensor_conversion_impl", "__esmMin", "tensor", "options", "canvas", "pixels2DContext", "width", "height", "inputformat", "norm", "normMean", "normBias", "stride", "rTensorPointer", "gTensorPointer", "bTensorPointer", "aTensorPointer", "i", "j", "R", "G", "B", "A", "image", "channels", "step", "rImagePointer", "gImagePointer", "bImagePointer", "aImagePointer", "bufferToTensor", "tensorFromImage", "tensorFromTexture", "tensorFromGpuBuffer", "tensorFromPinnedBuffer", "init_tensor_factory_impl", "__esmMin", "init_tensor_impl", "buffer", "options", "height", "width", "norm", "normMean", "normBias", "inputformat", "outputformat", "stride", "float32Data", "step", "rImagePointer", "gImagePointer", "bImagePointer", "aImagePointer", "rTensorPointer", "gTensorPointer", "bTensorPointer", "aTensorPointer", "i", "Tensor", "image", "isHTMLImageEle", "isImageDataEle", "isImageBitmap", "isString", "data", "bufferToTensorOptions", "createCanvas", "createCanvasContext", "canvas", "pixels2DContext", "tempCanvas", "resolve", "reject", "context", "newImage", "img", "texture", "download", "dispose", "dims", "gpuBuffer", "dataType", "type", "NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP", "NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP", "isTypedArrayChecked", "checkTypedArray", "init_tensor_impl_type_mapping", "__esmMin", "isBigInt64ArrayAvailable", "isBigUint64ArrayAvailable", "isFloat16ArrayAvailable", "calculateSize", "tensorReshape", "init_tensor_utils_impl", "__esmMin", "init_tensor_impl", "dims", "size", "i", "dim", "tensor", "Tensor", "Tensor", "init_tensor_impl", "__esmMin", "init_tensor_conversion_impl", "init_tensor_factory_impl", "init_tensor_impl_type_mapping", "init_tensor_utils_impl", "arg0", "arg1", "arg2", "checkTypedArray", "type", "dims", "expectedTypedArrayConstructor", "NUMERIC_TENSOR_TYPE_TO_TYPEDARRAY_MAP", "data", "maybeDims", "typedArrayConstructor", "firstElementType", "mappedType", "NUMERIC_TENSOR_TYPEDARRAY_TO_TYPE_MAP", "size", "calculateSize", "image", "options", "tensorFromImage", "texture", "tensorFromTexture", "gpuBuffer", "tensorFromGpuBuffer", "buffer", "tensorFromPinnedBuffer", "tensorToDataURL", "tensorToImageData", "releaseData", "tensorReshape", "Tensor", "init_tensor", "__esmMin", "init_tensor_impl", "TRACE", "TRACE_FUNC", "TRACE_FUNC_BEGIN", "TRACE_FUNC_END", "init_trace", "__esmMin", "init_env_impl", "deviceType", "label", "env", "msg", "extraMsg", "stack", "hasTraceFunc", "i", "InferenceSession", "init_inference_session_impl", "__esmMin", "init_backend_impl", "init_tensor", "init_trace", "_InferenceSession", "handler", "feeds", "arg1", "arg2", "TRACE_FUNC_BEGIN", "fetches", "options", "Tensor", "isFetchesEmpty", "name", "isFetches", "arg1Keys", "v", "results", "returnValue", "key", "result", "TRACE_FUNC_END", "arg0", "arg3", "filePathOrUint8Array", "buffer", "byteOffset", "byteLength", "backend", "optionsWithValidatedEPs", "resolveBackendAndExecutionProviders", "InferenceSession", "init_inference_session", "__esmMin", "init_inference_session_impl", "init_tensor_conversion", "__esmMin", "init_tensor_factory", "__esmMin", "init_onnx_model", "__esmMin", "init_onnx_value", "__esmMin", "noBackendErrMsg", "TrainingSession", "init_training_session_impl", "__esmMin", "init_backend_impl", "init_tensor", "_TrainingSession", "handler", "hasOptimizerModel", "hasEvalModel", "trainingOptions", "sessionOptions", "evalModel", "optimizerModel", "options", "backend", "optionsWithValidatedEPs", "resolveBackendAndExecutionProviders", "inputNames", "outputNames", "feeds", "arg1", "arg2", "fetches", "Tensor", "isFetchesEmpty", "name", "isFetches", "arg1Keys", "v", "results", "returnValue", "key", "result", "trainableOnly", "array", "paramsSize", "TrainingSession", "init_training_session", "__esmMin", "init_training_session_impl", "esm_exports", "__export", "InferenceSession", "TRACE", "TRACE_FUNC_BEGIN", "TRACE_FUNC_END", "Tensor", "TrainingSession", "env", "registerBackend", "init_esm", "__esmMin", "init_backend", "init_env", "init_inference_session", "init_tensor", "init_tensor_conversion", "init_tensor_factory", "init_trace", "init_onnx_model", "init_onnx_value", "init_training_session", "init_wasm_utils_env", "__esmMin", "main_exports", "__export", "main_default", "WORKER_NAME", "isProxyWorker", "init_main", "__esmMin", "init_wasm_core_impl", "init_wasm_factory", "init_wasm_utils_import", "ev", "type", "message", "initializeWebAssembly", "initRuntime", "err", "epName", "env", "initEp", "buffer", "bufferData", "copyFromExternalBuffer", "model", "options", "createSession", "sessionMetadata", "releaseSession", "sessionId", "inputIndices", "inputs", "outputIndices", "run", "outputs", "o", "extractTransferableBuffers", "endProfiling", "urlOverride", "scriptSrc", "ort_wasm_simd_threaded_jsep_exports", "__export", "ort_wasm_simd_threaded_jsep_default", "e", "r", "init_ort_wasm_simd_threaded_jsep", "__esmMin", "x", "R", "L", "n", "H", "a", "D", "F", "P", "s", "B", "u", "I", "f", "$", "l", "c", "d", "b", "m", "p", "h", "g", "v", "t", "zr", "o", "i", "Qr", "y", "w", "A", "_", "C", "O", "j", "T", "S", "W", "Pn", "E", "_n", "Rr", "Te", "_e", "M", "gn", "Se", "yn", "Tn", "Hr", "Cn", "oe", "N", "k", "U", "G", "Y", "z", "V", "q", "J", "X", "K", "Q", "Z", "ee", "re", "te", "ne", "ae", "ue", "se", "Ee", "xe", "He", "De", "Ie", "Ue", "Ge", "$e", "Ye", "Le", "ze", "Ve", "qe", "Je", "Xe", "Ze", "ir", "ur", "hr", "vr", "yr", "wr", "Ar", "Er", "Mr", "xr", "Nr", "Dr", "Pr", "Br", "Ir", "$r", "rt", "nt", "it", "cr", "ut", "dt", "bt", "mt", "pt", "ht", "gt", "vt", "yt", "wt", "At", "_t", "Ct", "St", "Wt", "Et", "Mt", "xt", "Rt", "Ht", "Dt", "Ft", "Pt", "It", "Ut", "Bt", "Gt", "$t", "Yt", "qt", "Jt", "Zt", "en", "he", "rn", "tn", "nn", "on", "me", "ln", "cn", "ie", "Re", "et", "fe", "le", "ce", "ge", "Oe", "Ce", "ve", "we", "de", "be", "xn", "Mn", "On", "En", "pe", "ye", "Ae", "jn", "je", "Wn", "Nn", "We", "Me", "Ne", "ke", "Fe", "Pe", "Be", "Ke", "Qe", "er", "rr", "tr", "nr", "ar", "or", "sr", "fr", "lr", "dr", "br", "mr", "pr", "gr", "An", "wn", "_r", "Cr", "Or", "jr", "Tr", "Sr", "Wr", "kr", "Sn", "Fr", "mn", "Ur", "hn", "Gr", "Yr", "Lr", "Vr", "qr", "Jr", "Xr", "Kr", "Zr", "Hn", "pn", "kn", "Dn", "tt", "at", "ot", "st", "ft", "lt", "ct", "Ot", "jt", "Tt", "Nt", "kt", "Lt", "zt", "Vt", "Xt", "Kt", "Qt", "an", "sn", "un", "fn", "dn", "bn", "Rn", "vn", "Fn", "scriptSrc", "origin", "isSameOrigin", "preload", "createProxyWorker", "importProxyWorker", "embeddedWasmModule", "importWasmModule", "init_wasm_utils_import", "__esmMin", "init_wasm_utils_env", "filename", "prefixOverride", "baseUrl", "absoluteUrl", "blob", "url", "urlOverride", "isMultiThreaded", "wasm", "initialized", "initializing", "aborted", "isMultiThreadSupported", "isSimdSupported", "initializeWebAssembly", "getInstance", "init_wasm_factory", "__esmMin", "init_wasm_utils_import", "flags", "timeout", "numThreads", "multiThreadSupported", "wasmPaths", "wasmPrefixOverride", "mjsPathOverrideFlag", "mjsPathOverride", "wasmPathOverrideFlag", "wasmPathOverride", "objectUrl", "ortWasmFactory", "importWasmModule", "isTimeout", "tasks", "resolve", "reject", "config", "fileName", "scriptDirectory", "module", "what", "allocWasmString", "iterateExtraOptions", "checkLastError", "init_wasm_utils", "__esmMin", "init_wasm_factory", "data", "allocs", "wasm", "getInstance", "dataLength", "dataOffset", "options", "prefix", "seen", "handler", "key", "value", "name", "message", "stack", "paramsOffset", "errorCode", "errorMessagePointer", "errorMessage", "setRunOptions", "init_run_options", "__esmMin", "init_wasm_factory", "init_wasm_utils", "options", "wasm", "getInstance", "runOptionsHandle", "allocs", "runOptions", "tagDataOffset", "allocWasmString", "checkLastError", "iterateExtraOptions", "key", "value", "keyDataOffset", "valueDataOffset", "e", "alloc", "getGraphOptimzationLevel", "getExecutionMode", "appendDefaultOptions", "setExecutionProviders", "setSessionOptions", "init_session_options", "__esmMin", "init_wasm_factory", "init_wasm_utils", "graphOptimizationLevel", "executionMode", "options", "session", "ep", "sessionOptionsHandle", "executionProviders", "allocs", "epName", "deviceType", "keyDataOffset", "allocWasmString", "valueDataOffset", "getInstance", "checkLastError", "webgpuOptions", "epNameDataOffset", "wasm", "sessionOptions", "logIdDataOffset", "logSeverityLevel", "logVerbosityLevel", "optimizedModelFilePathOffset", "name", "value", "nameOffset", "iterateExtraOptions", "key", "e", "alloc", "tensorDataTypeStringToEnum", "tensorDataTypeEnumToString", "getTensorElementSize", "tensorTypeToTypedArrayConstructor", "logLevelStringToEnum", "isGpuBufferSupportedType", "dataLocationStringToEnum", "init_wasm_common", "__esmMin", "type", "typeProto", "dateType", "logLevel", "location", "loadFile", "init_wasm_utils_load_file", "__esmMin", "init_wasm_utils_env", "file", "readFile", "e", "createReadStream", "stream", "chunks", "chunk", "response", "contentLengthHeader", "fileSize", "reader", "buffer", "pages", "offset", "done", "value", "chunkSize", "logLevelPrefix", "doLog", "configLogLevel", "debug", "configureLogger", "LOG", "LOG_DEBUG", "init_log", "__esmMin", "init_wasm_common", "level", "message", "$configLogLevel", "$debug", "logLevel", "msg", "messageLevel", "logLevelStringToEnum", "configLevel", "args", "createView", "init_tensor_view", "__esmMin", "init_wasm_common", "dataBuffer", "type", "tensorTypeToTypedArrayConstructor", "init_types", "__esmMin", "bucketFreelist", "bucketArr", "calcNormalizedBufferSize", "calcBucketBufferSize", "guid", "createNewGpuDataId", "downloadGpuData", "GpuDataManagerImpl", "createGpuDataManager", "init_gpu_data_manager", "__esmMin", "init_log", "init_types", "size", "idx", "sizeForBucket", "backend", "gpuBuffer", "originalSize", "getTargetBuffer", "bufferSize", "gpuReadBuffer", "commandEncoder", "arrayBuffer", "targetBuffer", "key", "id", "data", "srcArrayBuffer", "srcOffset", "srcLength", "gpuDataCache", "gpuBufferForUploading", "LOG_DEBUG", "sourceId", "destinationId", "sourceGpuDataCache", "destinationGpuDataCache", "buffer", "previousBuffer", "usage", "isStorage", "isUniform", "buffers", "gpuData", "cachedData", "maxInFreeList", "freelist", "capturedBuffers", "storage", "sessionId", "pendingBuffers", "args", "AttributeWithCacheKeyImpl", "createAttributeWithCacheKey", "init_attribute_with_cache_key", "__esmMin", "attribute", "name", "MatMulUtil", "BroadcastUtil", "ShapeUtil", "PoolConvUtil", "GemmUtil", "MIN_CLIP", "MAX_CLIP", "init_util", "__esmMin", "a", "b", "adims", "bdims", "isMatMul", "arank", "brank", "crank", "cdims", "cShapeMatMul", "i", "aLen", "bLen", "max", "shape", "finalShape", "inputRank", "finalRank", "_ShapeUtil", "dims", "size", "rank", "newDims", "axis", "start", "end", "strides", "tensorRank", "axes", "x", "perm", "v", "pad", "shape1", "shape2", "_PoolConvUtil", "isGlobalOperator", "inputDims", "kernelShape", "dilations", "pads", "dim", "isChannelLast", "autoPad", "outputDims", "filterDims", "inSize", "stride", "dilation", "kernel", "padHeadIndex", "padTailIndex", "dkernel", "padNeeded", "leftShape", "transLeft", "rightShape", "transRight", "biasShape", "M", "K", "N", "kDim", "WORKGROUP_SIZE", "getWgslMappedType", "tensorTypeToWsglStorageType", "tensorTypeToWsglValueType", "createTensorShapeVariables", "getMaxComponents", "fillVector", "castToF32", "sumVector", "getElementAt", "createIndicesHelper", "inputVariable", "outputVariable", "internalVariable", "ShaderHelperImpl", "createShaderHelper", "getBroadcastDims", "init_common", "__esmMin", "init_wasm_common", "init_util", "type", "components", "mappedType", "dims", "programUniforms", "dim", "ShapeUtil", "size", "dataType", "value", "name", "index", "length", "tensorType", "shapeOrRank", "usage", "useUniform", "rank", "rankIdentity", "indicesType", "valueType", "storageType", "normalizeDim", "implementationUsed", "uniformPrefix", "shape", "strides", "o2iSnippet", "i", "offsetToIndicesImplementation", "offsetToIndices", "varOffset", "offsets", "indicesToOffsetImplementation", "indicesToOffset", "varIndices", "indices", "init", "indicesGet", "idx", "indicesSet", "broadcastedIndicesToOffsetImplementation", "broadcastedIndicesToOffset", "output", "implKey", "setByOffset", "offset", "getByOffset", "getByIndicesImplementation", "getImplementation", "functionParams", "dimsParams", "get", "normalizedIndices", "getByIndices", "setByIndicesImplementation", "setImplementation", "impls", "needShapeStrides", "impl", "indicesAndValue", "normalizedDispatchGroup", "limits", "workgroupSize", "workgroupSizeX", "workgroupSizeY", "workgroupSizeZ", "is1DimensionDispatch", "paramList", "globalIdxDefinition", "variable", "bindingIndex", "access", "variables", "v", "additionalUniforms", "uniformSnippets", "typeTemp", "uniformWgslTypeToDataType", "u", "dispatchGroup", "inShape", "outShape", "inRank", "validateInputs", "getAdjustedPerm", "getOutputShape", "permFunctionBody", "createTransposeProgramInfo", "transpose", "parseTransposeAttributes", "init_transpose", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "inputRank", "perm", "inputShape", "ShapeUtil", "rank", "input", "output", "reverseFunc", "inputTensor", "permAttr", "inputDataType", "outputShape", "outputVariable", "inputVariable", "getShaderSource", "wgslType", "workgroupSize", "shaderHelper", "outputSize", "createTensorShapeVariables", "context", "attributes", "createAttributeWithCacheKey", "reduceOps", "reduceSharedOps", "reduceInitValues", "reduceOutputValues", "getInnerMostAxes", "computeOutAndReduceShapes", "expandShapeToKeepDim", "areAxesInnerMostDims", "getAxesPermutation", "createReduceSharedProgramInfo", "reduceCommon", "reduceMeanShared", "reduceL1Shared", "reduceL2Shared", "reduceLogSumExpShared", "reduceMaxShared", "reduceMinShared", "reduceProdShared", "reduceSumShared", "reduceSumSquareShared", "reduceLogSumShared", "init_reduce_shared", "__esmMin", "init_wasm_common", "init_util", "init_common", "init_reduce", "init_transpose", "numInnerAxes", "rank", "res", "i", "shape", "axes", "outputShape", "dim", "reduceShape", "expandShape", "shapeIdx", "axis", "name", "shaderCache", "inputs", "reduceType", "outputDataType", "inputShape", "outputSize", "ShapeUtil", "reduceSize", "input", "inputVariable", "output", "outputVariable", "workgroupSize", "sharedMemorySnippet", "shaderHelper", "context", "attributes", "updatedAttributes", "createReduceAttributesFromInputs", "updatedAxes", "_dim", "normalizeAxes", "permutedAxes", "createTransposeProgramInfo", "finalOutputShape", "validateInputs", "noOp", "createReduceProgramInfo", "createReduceAttributesFromInputs", "runReduceProgram", "reduceLogSumNaive", "reduceL1Naive", "reduceL2Naive", "reduceLogSumExpNaive", "reduceMaxNaive", "reduceMeanNaive", "reduceMinNaive", "reduceProdNaive", "reduceSumNaive", "reduceSumSquareNaive", "useNaiveReduceMethod", "reduceMean", "reduceL1", "reduceL2", "reduceLogSumExp", "reduceMax", "reduceMin", "reduceProd", "reduceSum", "reduceSumSquare", "reduceLogSum", "init_reduce", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "init_reduce_shared", "inputs", "input", "name", "shaderCache", "reduceOp", "axesInput", "outputDataType", "keepDims", "noopWithEmptyAxes", "outputShape", "inputShape", "inputRank", "axes", "ShapeUtil", "reduceOnAllAxes", "d", "i", "outputRank", "outputSize", "shaderHelper", "idxCopy", "inputVariable", "output", "outputVariable", "ops", "reduceOps", "k", "l", "createTensorShapeVariables", "attributes", "v", "createAttributeWithCacheKey", "context", "updatedAttributes", "_output", "idxZero", "size", "shape", "reduceSize", "dim", "reduceMeanShared", "reduceL1Shared", "reduceL2Shared", "reduceLogSumExpShared", "reduceMaxShared", "reduceMinShared", "reduceProdShared", "reduceSumShared", "reduceSumSquareShared", "reduceLogSumShared", "validateInputs", "argMin", "argMax", "parseArgMinMaxAttributes", "init_argminmax", "__esmMin", "init_wasm_common", "init_attribute_with_cache_key", "init_reduce", "inputs", "context", "attributes", "argMinMaxOp", "input", "output", "axes", "idxZero", "k", "createReduceProgramInfo", "createAttributeWithCacheKey", "validateAttentionInputs", "createInPlaceSoftmaxProgramInfo", "createAttentionProbsProgramInfo", "createVxAttentionScoreProgramInfo", "applyAttention", "prepare", "attention", "init_attention", "__esmMin", "init_wasm_common", "init_types", "init_common", "inputs", "attributes", "input", "weights", "bias", "maskIndex", "past", "relativePositionBias", "batchSize", "sequenceLength", "inputHiddenSize", "qHiddenSize", "kHiddenSize", "vHiddenSize", "sz", "kvSequenceLength", "pastSequenceLength", "totalSequenceLength", "maxSequenceLength", "maskType", "_context", "n", "d", "components", "getMaxComponents", "WG", "dComp", "elementsPerThread", "programUniforms", "dataType", "tensorTypeToWsglStorageType", "f32Type", "tensorTypeToWsglValueType", "getShaderSource", "shaderHelper", "inputHelper", "outputVariable", "uniforms", "context", "q", "key", "pastKey", "parameters", "probsShape", "presentKey", "presentKeyShape", "alpha", "vectorizedHeadSize", "TILE_SIZE", "dispatch", "inputDependencies", "outputs", "qInput", "inputVariable", "kInput", "inputVars", "pastKeyInput", "output", "outputVars", "probs", "v", "pastValue", "params", "nReps", "repeatedVHiddenSize", "presentValue", "presentValueShape", "outputShape", "probsHelper", "vHelper", "k", "_maskIndex", "_past", "outputCount", "inputsK", "inputsV", "M", "K", "N", "outputQ", "outputK", "outputV", "weight", "validateInputs", "createBatchNormInferenceProgramInfo", "parseBatchNormAttributes", "batchNorm", "init_batch_norm", "__esmMin", "init_esm", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "checkShapeEqual", "actual", "expected", "message", "r", "v", "i", "shape", "epsilon", "spatial", "format", "yShape", "components", "getMaxComponents", "cComponents", "outputSize", "ShapeUtil", "useShapesUniforms", "shapeOrRank", "x", "inputVariable", "scale", "bias", "inputMean", "inputVar", "y", "outputVariable", "calcCOffset", "cOffset", "getInferenceModeShaderSource", "helper", "createTensorShapeVariables", "createAttributeWithCacheKey", "context", "outputCount", "updatedAttributes", "env", "validateInputs", "createBiasAddProgramInfo", "biasAdd", "init_bias_add", "__esmMin", "init_util", "init_common", "inputs", "outputShape", "channels", "outputSize", "ShapeUtil", "dataType", "input", "inputVariable", "bias", "residual", "output", "outputVariable", "shaderHelper", "context", "createElementwiseProgramShader", "createElementwiseProgramInfo", "abs", "acos", "acosh", "asin", "asinh", "atan", "atanh", "parseCastAttributes", "cast", "generateClipAttributesFromInputs", "clip", "ceil", "cos", "cosh", "parseAlphaAttributes", "elu", "erfImpl", "erf", "exp", "floor", "gelu", "leakyRelu", "not", "neg", "reciprocal", "relu", "sigmoid", "parseHardSigmoidAttributes", "hardSigmoid", "sin", "sinh", "sqrt", "tan", "tanhExpression", "tanh", "fastGeluImpl", "fastGeluExpression", "fastGelu", "thresholdedRelu", "log", "quickGeluImpl", "quickGeluExpression", "quickgelu", "init_unary_op", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "shaderHelper", "datasize", "inputDataType", "outputDataType", "funcCall", "additionalImplementation", "vecSize", "expression", "input", "inputVariable", "output", "outputVariable", "name", "cacheKey", "ShapeUtil", "inputTensors", "context", "attributes", "createAttributeWithCacheKey", "func", "inputs", "min", "MIN_CLIP", "max", "MAX_CLIP", "clipAttributes", "dataType", "tensorTypeToWsglValueType", "a", "varType", "x", "alpha", "dType", "validateInputs", "createBiasSplitGeluProgramInfo", "biasSplitGelu", "init_bias_split_gelu", "__esmMin", "init_util", "init_common", "init_unary_op", "inputs", "outputShape", "input", "inputVariable", "bias", "output", "outputVariable", "outputSize", "ShapeUtil", "dataType", "tensorTypeToWsglStorageType", "shaderHelper", "erfImpl", "context", "createBinaryOpProgramShader", "createBinaryOpProgramInfo", "runBinaryOp", "add", "div", "equal", "mul", "pow", "sub", "greater", "less", "greaterOrEqual", "lessOrEqual", "init_binary_op", "__esmMin", "init_wasm_common", "init_util", "init_common", "shaderHelper", "dimsA", "dimsB", "dimsOutput", "vectorize", "doBroadcast", "sharedDimensionDivisibleBy4", "funcCall", "typeA", "typeB", "typeOutput", "additionalImplementation", "expressionScalar", "expressionVector", "a", "b", "output", "outputVariable", "inputVariable", "assignment", "isAOneElement", "ShapeUtil", "isBOneElement", "aLastDimDivisibleBy4", "bLastDimDivisibleBy4", "singleAssignment", "resStr", "x", "typeCast", "expressionA", "expressionB", "name", "cacheKey", "outputDataType", "isBroadcast", "outputShape", "outputSize", "cacheKeyAux", "calculatedShape", "BroadcastUtil", "sharedDimension", "i", "dimA", "dimB", "createTensorShapeVariables", "context", "type", "validateInputs", "calculateInputIndexImpl", "assignOutputData", "createConcatProgramInfo", "concat", "parseConcatAttributes", "init_concat", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "axis", "referenceIndex", "referenceInput", "inputType", "inputRank", "input", "i", "dim", "numberOfTensors", "sizeInConcatAxisStr", "output", "codeLines", "returnSnippet", "adjustedAxis", "outputShape", "dataType", "outputSize", "ShapeUtil", "sizeInConcatAxis", "inputVars", "previousSum", "inputDependencies", "inputRanks", "programUniforms", "inputVariable", "createTensorShapeVariables", "outputVariable", "indicesAxis", "getShaderSource", "shaderHelper", "context", "attributes", "inputShape", "sum", "nonEmptyInputs", "createAttributeWithCacheKey", "getActivationSnippet", "appendActivationUniformsData", "appendActivationUniforms", "parseInternalActivationAttributes", "init_fuse_utils", "__esmMin", "init_wasm_common", "init_util", "attributes", "valueType", "baseType", "programUniform", "uniforms", "activation", "alpha", "beta", "clipMin", "clipMax", "MIN_CLIP", "MAX_CLIP", "typeSnippet", "biasSnippet", "init_activation_util", "__esmMin", "component", "dataType", "hasBias", "utilFunctions", "init_conv_util", "__esmMin", "strideStr", "writeDataToSubAVec4Snippet", "calculateResultSnippet", "makeMatMulPackedVec4Source", "writeDataToSubASnippet", "readDataFromSubASnippet", "makeMatMulPackedSource", "matMulReadWriteFnSource", "createMatmulProgramInfo", "init_matmul_packed_webgpu", "__esmMin", "init_wasm_common", "init_util", "init_common", "init_fuse_utils", "init_activation_util", "transpose", "batchDims", "transposeA", "innerElementSize", "workPerThread", "workgroupSize", "type", "tileInner", "splitK", "splitedDimInner", "tileAOuter", "tileBOuter", "tileAWidth", "tileAHight", "rowPerThreadB", "sequentialAccessByThreads", "rowPerThreadA", "colPerThreadA", "matmulSnippet", "component", "hasBias", "applyActivation", "variables", "batchShapes", "isChannelsLast", "batchAShape", "batchBShape", "batchShape", "batchVariable", "aVariable", "bVariable", "outputVariable", "broadCastADims", "getBroadcastDims", "broadCastBDims", "dataType", "tensorTypeToWsglStorageType", "getAIndices", "aRank", "batchRank", "resStr", "i", "j", "getBIndices", "bRank", "typeSnippet", "inputs", "activationAttributes", "outputShape", "reshapedOutputShape", "aShape", "bShape", "outerDimsA", "outerDimsB", "outerDims", "batchSize", "ShapeUtil", "dimAOuter", "dimInner", "dimBOuter", "isVec4", "elementsPerThread", "dispatch", "components", "aShapeTemp", "bShapeTemp", "outputShapeTemp", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "internalVariable", "A", "inputVariable", "B", "output", "inputVariables", "biasComponents", "uniforms", "appendActivationUniforms", "baseType", "getActivationSnippet", "declareFunctions", "conv2dCommonSnippet", "createConv2DMatMulProgramInfo", "init_conv2d_mm_webgpu", "__esmMin", "init_wasm_common", "init_log", "init_common", "init_fuse_utils", "init_activation_util", "init_conv_util", "init_matmul_packed_webgpu", "isChannelsLast", "fitAOuter", "fitBOuter", "fitInner", "addBias", "attributes", "innerElementSizeX", "innerElementSizeW", "innerElementSize", "dataType", "getXSnippet", "getWSnippet", "coordASnippet", "coordResSnippet", "xHeight", "xWidth", "row", "col", "readXSnippet", "typeSnippet", "sampleX", "sampleW", "resType", "aType", "bType", "applyActivation", "getActivationSnippet", "biasSnippet", "inputs", "outputShape", "dimAOuter", "dimBOuter", "dimInner", "hasBias", "sequentialAccessByThreads", "inChannels", "batchSize", "outWidth", "outHeight", "outChannels", "isVec4", "dispatchX", "dispatchY", "workGroupSize", "elementsPerThread", "dispatch", "LOG_DEBUG", "tileAOuter", "tileBOuter", "tileInner", "elementsSize", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "uniforms", "appendActivationUniforms", "components", "t", "tensorTypeToWsglStorageType", "declareFunctions", "x", "inputVariable", "w", "inputVariables", "output", "outputVariable", "bias", "utilFunctions", "makeMatMulPackedVec4Source", "makeMatMulPackedSource", "arrayProduct", "parse3TupleParam", "getEffectiveFilterSize", "computeDefaultPad", "computeOutputShape4D", "get3DPadAndOutInfo", "computeConv3DInfo", "createConv3DNaiveProgramInfo", "init_conv3d_naive_webgpu", "__esmMin", "init_wasm_common", "init_log", "init_util", "init_common", "arr", "product", "i", "param", "filterSize", "dilation", "inputShape", "fieldSize", "stride", "effectiveFieldSize", "inShape", "filterShape", "outChannels", "strides", "zeroPad", "outShape", "index", "pad", "inDepth", "inHeight", "inWidth", "strideDepth", "strideHeight", "strideWidth", "filterDepth", "filterHeight", "filterWidth", "padInfo", "outDepth", "outHeight", "outWidth", "val", "_", "padAlongDepth", "padAlongHeight", "padAlongWidth", "front", "back", "top", "bottom", "left", "right", "dilations", "depthwise", "dataFormat", "batchSize", "inChannels", "filterChannels", "dilationDepth", "dilationHeight", "dilationWidth", "effectiveFilterDepth", "effectiveFilterHeight", "effectiveFilterWidth", "inputs", "attributes", "outputShape", "filterDims", "pads", "isChannelsLast", "isVec4", "workGroupSize", "dispatchLayout", "dispatch", "d", "LOG_DEBUG", "innerElementSize", "outputSize", "ShapeUtil", "programUniforms", "createTensorShapeVariables", "inputDependencies", "hasBias", "getShaderSource", "shaderHelper", "uniforms", "components", "t", "tensorTypeToWsglStorageType", "x", "inputVariable", "w", "inputVariables", "output", "outputVariable", "declareFunctions", "bias", "getElementAt", "createGroupedConvProgramInfo", "createGroupedConvVectorizeProgramInfo", "init_conv_grouped", "__esmMin", "init_wasm_common", "init_util", "init_common", "init_conv", "init_fuse_utils", "inputs", "attributes", "squeezeOutputShapeFunction", "hasBias", "processBias", "xShape", "wShape", "outputChannelsPerGroup", "isChannelLast", "outputShape", "calculateOutputShape", "outputSize", "ShapeUtil", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "output", "outputVariable", "baseType", "tensorTypeToWsglStorageType", "applyActivation", "getActivationSnippet", "x", "inputVariable", "w", "inputVars", "uniforms", "appendActivationUniforms", "components", "getMaxComponents", "outputNumber", "outputShapeInShader", "xNumber", "createNaiveMatmulProgramInfo", "validateInputs", "matMul", "init_matmul", "__esmMin", "init_wasm_common", "init_util", "init_matmul_packed_webgpu", "init_common", "init_fuse_utils", "inputs", "activationAttributes", "outputShape", "reshapedOutputShape", "isChannelsLast", "aShape", "bShape", "M", "N", "K", "components", "getMaxComponents", "aComponents", "outputNumber", "outputSize", "ShapeUtil", "hasBias", "outerDims", "outputShapeInShader", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "batchDims", "internalVariable", "a", "inputVariable", "b", "output", "outputVariable", "baseType", "tensorTypeToWsglStorageType", "applyActivation", "getActivationSnippet", "inputVariables", "processBias", "biasComponents", "outerDimsA", "outerDimsB", "broadCastADims", "getBroadcastDims", "broadCastBDims", "uniforms", "appendActivationUniforms", "getIndices", "variable", "broadCastDims", "rank", "name", "batchRank", "resStr", "i", "j", "calcResult", "calcStr", "context", "BroadcastUtil", "createMatmulProgramInfo", "calculateOutputShape", "weightTransposeAttribute", "validateInputs", "getAdjustedConvAttributes", "parseConvAttributes", "conv2d", "conv1d", "conv3d", "conv", "init_conv", "__esmMin", "init_util", "init_conv2d_mm_webgpu", "init_conv3d_naive_webgpu", "init_matmul_packed_webgpu", "init_conv_grouped", "init_fuse_utils", "init_matmul", "init_transpose", "inputShape", "kernelShape", "dilations", "adjustPads", "strides", "isChannelLast", "batchSize", "inputSpatialShape", "spatialRank", "outChannels", "dilatedKernelShape", "v", "i", "outputShape", "inputs", "attributes", "dataChannel", "filterInChannel", "pads", "PoolConvUtil", "newAttributes", "activationAttributes", "parseInternalActivationAttributes", "format", "autoPad", "group", "wIsConst", "context", "adjustedAttributes", "isChannelsLast", "transposedWeight", "createTransposeProgramInfo", "convInputs", "createGroupedConvVectorizeProgramInfo", "createGroupedConvProgramInfo", "hasBias", "inputHeight", "inputWidth", "inputChannels", "weightHeight", "weightWidth", "outHeight", "outWidth", "sameSize", "batch", "xReshaped", "wReshaped", "matmulOutputShape", "matmulInputs", "sharedDim", "N", "K", "createNaiveMatmulProgramInfo", "createMatmulProgramInfo", "sequentialAccessByThreads", "dimAOuter", "dimBOuter", "dimInner", "createConv2DMatMulProgramInfo", "convInfo", "computeConv3DInfo", "createConv3DNaiveProgramInfo", "conv2dTransposeCommonSnippet", "createConv2DTransposeMatMulProgramInfo", "init_conv_backprop_mm_webgpu", "__esmMin", "init_wasm_common", "init_log", "init_common", "init_fuse_utils", "init_activation_util", "init_conv_util", "init_matmul_packed_webgpu", "isChannelsLast", "addBias", "attributes", "type", "innerElementSize", "getWSnippet", "coordASnippet", "coordResSnippet", "xHeight", "xWidth", "row", "col", "readASnippet", "sampleA", "sampleW", "applyActivation", "getActivationSnippet", "biasSnippet", "inputs", "outputShape", "dimAOuter", "dimBOuter", "dimInner", "hasBias", "sequentialAccessByThreads", "inChannels", "batchSize", "outWidth", "outHeight", "outChannels", "isVec4", "dispatchX", "dispatchY", "workGroupSize", "elementsPerThread", "dispatch", "LOG_DEBUG", "tileInner", "components", "filterDims", "effectiveFilterDims", "pads", "programUniforms", "appendActivationUniformsData", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "x", "inputVariable", "w", "output", "outputVariable", "inputVariables", "declareFunctions", "bias", "uniforms", "appendActivationUniforms", "elemType", "tensorTypeToWsglStorageType", "utilFunctions", "makeMatMulPackedVec4Source", "makeMatMulPackedSource", "createConvTranspose2DOpProgramShaderSource", "createConvTranspose2DProgramInfo", "init_conv_backprop_webgpu", "__esmMin", "init_wasm_common", "init_log", "init_util", "init_common", "shaderHelper", "inputs", "outputShape", "hasBias", "is1DimensionDispatch", "isVec4", "dataType", "uniforms", "isChannelsLast", "rowDim", "colDim", "channelDim", "workPerThread", "declareFunctions", "components", "w", "inputVariable", "dy", "inputVariables", "output", "outputVariable", "codeSnippet4", "codeSnippet", "attributes", "squeezeOutputShapeFunction", "outputSize", "ShapeUtil", "dispatch", "LOG_DEBUG", "inputDependencies", "strides", "filterDims", "dilations", "effectiveFilterDims", "pads", "group", "wShape", "inputChannelsPerGroup", "outputChannelsPerGroup", "programUniforms", "createTensorShapeVariables", "getShaderSource", "tensorTypeToWsglStorageType", "computeTotalPad", "distributePadding", "calculateOutputShapeAndPads", "getAdjustedConvTransposeAttributes", "parseConvTransposeAttributes", "validateInputs", "weightTransposePerm", "convTranspose2d", "convTranspose1d", "convTranspose", "init_conv_transpose", "__esmMin", "init_conv_backprop_mm_webgpu", "init_conv_backprop_webgpu", "init_fuse_utils", "init_transpose", "inDim", "stride", "adj", "kernel", "dilation", "outSize", "totalPad", "autoPad", "pads", "head", "tail", "smallPad", "inputShape", "kernelShape", "dilations", "group", "strides", "isChannelLast", "outputPadding", "outputShape", "spatialRank", "updateOutputShape", "i", "batchSize", "outChannels", "j", "inSize", "attributes", "inputs", "a", "b", "isChannelsLast", "newAttributes", "activationAttributes", "parseInternalActivationAttributes", "format", "wIsConst", "dataChannel", "filterInChannel", "featureMaps", "context", "adjustedAttributes", "inputChannels", "createConvTranspose2DProgramInfo", "outHeight", "outWidth", "weightHeight", "weightWidth", "dimAOuter", "dimBOuter", "dimInner", "sequentialAccessByThreads", "transposedWeight", "createTransposeProgramInfo", "convTransposeInputs", "hasBias", "createConv2DTransposeMatMulProgramInfo", "createCumsumProgramInfo", "cumsum", "parseCumSumAttributes", "init_cumsum", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputType", "inputShape", "axisInput", "attributes", "outputSize", "ShapeUtil", "rank", "input", "inputVariable", "output", "outputVariable", "axisValue", "axis", "getShaderSource", "shaderHelper", "index", "max", "getElementAt", "lowerLimit", "upperLimit", "createTensorShapeVariables", "context", "exclusive", "reverse", "createAttributeWithCacheKey", "validateInputs", "permFunctionBody", "createDepthToSpaceProgramInfo", "depthToSpace", "parseDepthToSpaceAttributes", "init_depth_to_space", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "perm", "rank", "input", "output", "reverseFunc", "inputTensor", "attributes", "n", "h", "w", "c", "shape", "isChannelLast", "blocksize", "isDCRmode", "reshapedInputTensor", "reshapedInputRank", "inputDataType", "reshapedInput", "inputVariable", "permedOutput", "outputVariable", "getShaderSource", "shaderHelper", "outputShape", "outputSize", "ShapeUtil", "shapeBeforePerm", "shapeAfterPerm", "createTensorShapeVariables", "context", "createAttributeWithCacheKey", "symbolPattern", "termPattern", "termPatternOnly", "lhsPattern", "lhsPatternOnly", "EinsumTerm", "EinsumEquation", "appendMax", "createEinsumProgramInfo", "einsum", "parseEinsumAttributes", "init_einsum", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputIndex", "symbol", "index", "value", "inputs", "equation", "lhs", "rhs", "inputTerm", "dims", "einsumTerm", "sym", "info", "dimValue", "term", "isInput", "rank", "ellipsis", "ellipsisDims", "nextDim", "indexSymbols", "i", "ellipsisDimLength", "j", "name", "inputShapes", "dataType", "einsumEquation", "outputShape", "inputVars", "inputVariable", "outputSize", "ShapeUtil", "output", "outputVariable", "uniformsSymbols", "getShaderSource", "shaderHelper", "idxCopy", "initProd", "initSum", "updateSum", "reduceOpsSetIndices", "reduceOpsLoopHeaders", "reduceOpsLoopFooters", "reduceOpCompute", "isReduceOpsWithoutLoop", "outputIndex", "indices", "reduceOps", "inputVar", "_var", "programUniformsInit", "programUniforms", "_", "createTensorShapeVariables", "acc", "inputProgramUniforms", "context", "attributes", "input", "createAttributeWithCacheKey", "validateInputs", "getAdjustedShape", "calculateOutputShape", "createExpandProgramInfo", "expand", "init_expand", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "inputShape", "shape", "shapeIndex", "inputShapeIndex", "shape1", "shape2", "diff", "i", "outputShape", "dataType", "components", "outputSize", "ShapeUtil", "getShaderSource", "shaderHelper", "input", "inputVariable", "output", "outputVariable", "assignment", "singleAssignment", "resStr", "x", "typeCast", "programUniforms", "createTensorShapeVariables", "context", "createFastGeluProgramInfo", "fastGelu", "init_fast_gelu", "__esmMin", "init_wasm_common", "init_util", "init_common", "init_unary_op", "inputTensors", "dataType", "outputSize", "ShapeUtil", "biasLength", "useVec4", "getShaderSource", "shaderHelper", "x", "inputVariable", "bias", "y", "outputVariable", "uniforms", "singleElementBias", "i", "biasGetExpression", "fastGeluImpl", "tensorTypeToWsglValueType", "WORKGROUP_SIZE", "fastGeluExpression", "inputs", "context", "validateInputs", "createGatherProgramInfo", "parseGatherAttributes", "gather", "init_gather", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "inputShape", "indicesShape", "inputRank", "axis", "ShapeUtil", "outputShape", "axisDimLimit", "components", "outputSize", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "data", "inputVariable", "indices", "output", "outputVariable", "calcDataIndices", "x", "indicesRank", "calcStr", "i", "j", "assignment", "singleAssignment", "resStr", "typeCast", "createAttributeWithCacheKey", "context", "validateInputs", "createGatherElementsProgramInfo", "parseGatherElementsAttributes", "gatherElements", "init_gather_elements", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "inputShape", "inputOutputDataType", "inputRank", "indicesShape", "indicesDataType", "axis", "ShapeUtil", "axisDimLimit", "outputShape", "outputSize", "input", "inputVariable", "indices", "output", "outputVariable", "programUniforms", "createTensorShapeVariables", "shaderHelper", "createAttributeWithCacheKey", "context", "validateInputs", "createGemmProgramInfo", "parseGemmAttributes", "gemm", "init_gemm", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "attributes", "aShape", "bShape", "M", "N", "K", "GemmUtil", "outputShape", "outputSize", "ShapeUtil", "programUniforms", "inputDependencies", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "line", "calculateAlpha", "a", "inputVariable", "b", "dataType", "c", "variables", "output", "outputVariable", "uniforms", "transA", "transB", "alpha", "beta", "context", "getInput", "validateInputs", "parseMultiHeadAttentionAttributes", "weightTransposeAttribute", "addBiasTranspose", "maybeTransposeToBNSHAndAddBias", "multiHeadAttention", "init_multihead_attention", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_types", "init_attention", "init_common", "init_transpose", "inputs", "i", "ShapeUtil", "attributes", "query", "key", "value", "bias", "keyPaddingMask", "relativePositionBias", "pastKey", "pastValue", "dmmhaPacking", "batchSize", "sequenceLength", "hiddenSize", "kvSequenceLength", "pastSequenceLength", "maxSequenceLength", "headSize", "qkvFormat", "maskType", "maskDims", "passPastInKv", "vHiddenSize", "totalSequenceLength", "broadcastResPosBias", "createAttributeWithCacheKey", "context", "qkv", "biasOffset", "outputShape", "outputSize", "programUniforms", "getShaderSource", "shaderHelper", "output", "outputVariable", "qkvInput", "inputVariable", "biasInput", "uniforms", "numHeads", "input", "reshapedInput", "createTransposeProgramInfo", "params", "kvBNSH", "Q", "applyAttention", "K", "V", "getRepeats", "validateInputs", "getOutputShape", "createTileProgramInfo", "tile", "init_tile", "__esmMin", "init_wasm_common", "init_util", "init_common", "repeatsTensorView", "inputs", "inputShape", "repeats", "outputShape", "i", "shape", "outputSize", "ShapeUtil", "dataType", "input", "inputVariable", "output", "outputVariable", "getShaderSource", "shaderHelper", "createTensorShapeVariables", "context", "validateInputs", "createConcatProgramInfo", "parseGroupQueryAttentionAttributes", "weightTransposeAttribute", "maybeExpandAndTransposeToBNSH", "groupQueryAttention", "init_group_query_attention", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_attention", "init_common", "init_multihead_attention", "init_tile", "init_transpose", "inputs", "attributes", "query", "key", "value", "pastKey", "pastValue", "dmmhaPacking", "batchSize", "sequenceLength", "hiddenSize", "kvSequenceLength", "pastSequenceLength", "maxSequenceLength", "headSize", "hasPastKey", "hasPastValue", "isPastkvBSNH", "qkvFormat", "maskType", "passPastInKv", "vHiddenSize", "totalSequenceLength", "broadcastResPosBias", "a", "b", "dataType", "params", "outputShape", "component", "outputSize", "ShapeUtil", "presentSequenceLength", "output", "outputVariable", "inputA", "inputVariable", "inputB", "H", "dispatch", "inputDependencies", "programUniforms", "createTensorShapeVariables", "uniforms", "pastStr", "newStr", "concatStr", "getShaderSource", "shaderHelper", "createAttributeWithCacheKey", "context", "input", "pastKV", "outputIndex", "reshapedInput", "numHeads", "nReps", "createTileProgramInfo", "createTransposeProgramInfo", "Q", "maybeTransposeToBNSHAndAddBias", "K", "V", "applyAttention", "createInstanceNormProgramInfo", "computeMean", "createInstanceNormNHWCProgramInfo", "instanceNorm", "init_instance_norm", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "attributes", "xShape", "outputShape", "axis", "normCount", "ShapeUtil", "normSize", "components", "getMaxComponents", "normPackedSize", "inputShape", "inputDependencies", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "x", "inputVariable", "scale", "bias", "output", "outputVariable", "variables", "dataType", "f32Type", "workgroupSize", "uniforms", "sumVector", "context", "input", "n", "h", "c", "epsilon", "WG", "outputType", "sumCastType", "setOutputValue", "var1", "var2", "unitsOfWork", "wgSize", "meanInputDependencies", "meanProgramUniforms", "getMeanShaderSource", "inputHelper", "fillVector", "meanValues", "scaleHelper", "biasHelper", "N", "C", "H", "outputSize", "channelScaleShift", "tensorTypeToWsglStorageType", "scaleType", "scaleCastType", "outputHelper", "validateInputs", "createLayerNormProgramInfo", "layerNorm", "init_layer_norm", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "attributes", "outputCount", "simplified", "xShape", "scale", "bias", "outputShape", "axis", "ShapeUtil", "normCount", "normSize", "scaleSize", "biasSize", "meanInvStdDevDim", "i", "components", "getMaxComponents", "inputDependencies", "programUniforms", "hasMeanDataOutput", "hasInvStdOutput", "getShaderSource", "shaderHelper", "dataType", "tensorTypeToWsglStorageType", "variables", "inputVariable", "outputVariable", "uniforms", "fillVector", "castToF32", "sumVector", "outputs", "context", "validateInputs", "createMatMulNBitsProgramInfo", "matMulNBits", "parseMatMulNBitsAttributes", "init_matmulnbits", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "a", "aRank", "nBlocksPerCol", "blobSize", "b", "ShapeUtil", "scalesShape", "zeroPointsShape", "expectedZeroPointsSize", "maxComputeWorkgroupSizes", "maxComputeWorkgroupStorageSize", "inputShape", "dimAOuter", "dimInner", "dimBOuter", "batchDims", "batchSize", "blobSizeInWords", "dataType", "outputNumber", "getMaxComponents", "aComponents", "bComponents", "elementSize", "getTensorElementSize", "workgroupOutputSize", "maxNumberOfComponents", "useBlockwiseMatMulNBits", "components", "outputShape", "outputSize", "programUniforms", "inputShapeTemp", "bShape", "createTensorShapeVariables", "outputShapeTemp", "getShaderSource", "shaderHelper", "inputRank", "inputVariable", "scales", "inputVariables", "zeroPoints", "outputRank", "output", "outputVariable", "uniforms", "tensorTypeToWsglStorageType", "qDqDataType", "processOneBlock", "_", "i", "updateZeroPointIndex", "context", "createAttributeWithCacheKey", "validateInputs", "getPadConstant", "getPadReflect", "getPadEdge", "getPadWrap", "getPadSnippet", "createPadProgramInfo", "createPadAttributesFromInputs", "pad", "init_pad", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "validPads", "output", "inputRank", "padsLength", "block", "i", "getElementAt", "attributes", "outputShape", "ShapeUtil", "inputDims", "outputSize", "programUniforms", "createTensorShapeVariables", "inputDependencies", "getShaderSource", "shaderHelper", "outputVariable", "input", "inputVariable", "dataType", "padSnippet", "uniforms", "bigInt64Pads", "value", "updatePads", "axes", "v", "pads", "context", "updatedAttributes", "validateInputs", "getAdjustedPoolAttributesAndOutputShape", "getUniformAndPadInfo", "generatePoolingCode", "createShaderKeyFromAttributes", "createAveragePoolShaderKeyFromAttributes", "createMaxPoolShaderKeyFromAttributes", "parsePoolCommonAttributes", "createAveragePoolProgramInfo", "parseAveragePoolAttributes", "averagePool", "globalPoolAttributes", "parseGlobalAveragePoolAttributes", "globalAveragePool", "createMaxPoolProgramInfo", "maxPool", "parseMaxPoolAttributes", "parseGlobalMaxPoolAttributes", "globalMaxPool", "init_pool", "__esmMin", "init_esm", "init_wasm_common", "init_util", "init_common", "inputs", "env", "input", "attributes", "isGlobalOperator", "isChannelsLast", "inputShapeAsChannelFirst", "hasDilations", "kernelShape", "strides", "dilations", "pads", "PoolConvUtil", "outputShapeAsChannelFirst", "newAttributes", "outputShapeAsChannelLast", "outputShape", "outputSize", "ShapeUtil", "kernelSize", "programUniforms", "uniforms", "kw", "sw", "pwStart", "pwEnd", "pwStartEndNotZero", "phStartEndNotZero", "kh", "sh", "phStart", "phEnd", "kernelStrides", "hasPads", "sum", "cur", "shaderHelper", "x", "rank", "outputShapeRank", "op1", "op2", "start", "dataType", "output", "outputVariable", "codeW", "codeH", "codeHEnd", "dimIdxW", "dimIdxH", "stridesRank", "padsRank", "padCode", "getElementAt", "name", "adjustedAttributes", "inputVariable", "createTensorShapeVariables", "inputDependencies", "countIncludePad", "attr", "averagePoolAttributes", "context", "format", "storageOrder", "maxPoolAttributes", "validateInputsContent", "createRangeProgramInfo", "range", "init_range", "__esmMin", "init_esm", "init_wasm_common", "init_common", "start", "limit", "delta", "sameStartLimit", "increasingRangeNegativeStep", "decreasingRangePositiveStep", "dataType", "numElements", "outputShape", "outputSize", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "output", "outputVariable", "wgslType", "uniforms", "context", "env", "validateScales", "updateScales", "validateInputs", "getOriginalCoordinateFromResizedCoordinate", "getNearestPixelFromOriginal", "updateRoI", "initOutputShape", "adjustOutputShape", "calculateOriginalIndicesFromOutputIndices", "calculateInputIndicesFromOutputIndices", "checkInputIndices", "setChannelAndBatchIndices", "bilinearInterpolation", "bicubicInterpolation", "trilinearInterpolation", "createResizeProgramInfo", "getOpsetVersionFromCustomDataBuffer", "resize", "parseResizeAttributes", "init_resize", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "scales", "attributes", "value", "axes", "rank", "newScales", "index", "inputs", "opsetVersion", "sizes", "roi", "roiInputIndex", "scalesInputIndex", "sizesInputIndex", "coordinateTransferMode", "dType", "nearestMode", "roiTmp", "roiLocal", "v", "i", "inputShape", "outputShape", "scaleInPolicy", "adjustedOutputShape", "output", "scalesLength", "roiLength", "getElementAt", "input", "useExtrapolation", "channelIdx", "batchIdx", "spacialDims", "extrapolationValue", "heightIdx", "widthIdx", "cubicCoeffA", "excludeOutside", "is2D", "isNchw", "createCubicInterpolationFunction", "idx", "direction", "depthIdx", "inputTensor", "scalesInput", "roiInput", "outputVariable", "inputVariable", "outputSize", "ShapeUtil", "noScale", "d", "dataType", "getShaderSource", "shaderHelper", "createTensorShapeVariables", "context", "customDataBuffer", "antialias", "coordinateTransformMode", "keepAspectRatioPolicy", "mode", "createAttributeWithCacheKey", "validateInputs", "createRotaryEmbeddingProgramInfo", "rotaryEmbedding", "init_rotary_embedding", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "input", "positionIds", "cosCache", "sinCache", "numHeads", "rotaryEmbeddingDim", "ShapeUtil", "batchSize", "sequenceLength", "maxSequenceLength", "hiddenSize", "headSize", "interleaved", "scale", "batchStride", "halfRotaryEmbeddingDim", "globalShape", "globalStrides", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "inputVariable", "output", "outputVariable", "WORKGROUP_SIZE", "createAttributeWithCacheKey", "context", "validateInputs", "createSkipLayerNormProgramInfo", "skipLayerNorm", "init_skip_layer_norm", "__esmMin", "init_wasm_common", "init_util", "init_common", "inputs", "input", "skip", "gamma", "hiddenSize", "sequenceLength", "beta", "bias", "attributes", "outputCount", "isTraining", "simplified", "inputShape", "inputSize", "ShapeUtil", "outputShape", "outputSize", "meanInvStdDevDim", "hasBetaInput", "hasBiasInput", "hasMeanOutput", "hasInvStdDevOutput", "hasInputSkipBiasSumOutput", "workgroupSize", "components", "getMaxComponents", "programUniforms", "getShaderSource", "shaderHelper", "uniformsArray", "variables", "inputVariable", "outputVariable", "dataType", "tensorTypeToWsglStorageType", "vecDataType", "castToF32", "sumVector", "outputs", "_input", "_index", "context", "validateInputs", "readInput", "createSliceAttributesFromInputs", "fixStartEndValues", "calculateInputIndicesImpl", "createSliceProgramInfo", "slice", "parseSliceAttributes", "init_slice", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "_", "idx", "input", "v", "starts", "ends", "axes", "createAttributeWithCacheKey", "value", "index", "inputShape", "steps", "newValue", "output", "getElementAt", "inputSize", "ShapeUtil", "step", "start", "i", "end", "signs", "array", "numSteps", "newEnd", "newStart", "outputShape", "axis", "outputTensorInfo", "outputVariable", "inputVariable", "outputSize", "uniforms", "programUniforms", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "context", "updatedAttributes", "validateInputs", "createSoftmaxProgramInfo", "softmax", "parseSoftmaxAttributes", "init_softmax", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "input", "attributes", "shape", "outputSize", "ShapeUtil", "WG", "axis", "cols", "rows", "components", "getMaxComponents", "packedCols", "maxVector", "name", "x", "inputVariable", "output", "outputVariable", "valueType", "threadMaxDecl", "tensorTypeToWsglStorageType", "getShaderSource", "shaderHelper", "sumVector", "context", "createAttributeWithCacheKey", "validateInputs", "createSplitAttributesFromInputs", "calculateOutputIndexImpl", "writeBufferDataImpl", "createSplitProgramInfo", "split", "parseSplitAttributes", "init_split", "__esmMin", "init_wasm_common", "init_util", "init_attribute_with_cache_key", "init_common", "inputs", "attributes", "splitSizes", "numOutputs", "v", "createAttributeWithCacheKey", "numberOfTensors", "getElementAt", "outputs", "codeLines", "i", "returnSnippet", "inputShape", "inputSize", "ShapeUtil", "dataType", "axis", "input", "inputVariable", "sizeInSplitAxis", "outputsTensorInfo", "outputShapes", "previousSum", "programUniforms", "outputShape", "outputVariable", "createTensorShapeVariables", "getShaderSource", "shaderHelper", "context", "updatedAttributes", "createWhereOpProgramShader", "createWhereOpProgramInfo", "where", "init_where", "__esmMin", "init_wasm_common", "init_util", "init_common", "shaderHelper", "inputs", "dimsOutput", "isBroadcast", "typeOutput", "output", "outputVariable", "inputVariable", "b", "c", "assignment", "expression", "a", "singleAssignment", "resStr", "x", "typeCast", "expressionA", "expressionB", "expressionC", "dimsA", "dimsB", "dimsC", "outputDataType", "ShapeUtil", "outputShape", "outputSize", "calculatedShape", "BroadcastUtil", "vecSize", "createTensorShapeVariables", "context", "WEBGPU_OP_RESOLVE_RULES", "init_op_resolve_rules", "__esmMin", "init_argminmax", "init_attention", "init_batch_norm", "init_bias_add", "init_bias_split_gelu", "init_binary_op", "init_concat", "init_conv", "init_conv_transpose", "init_cumsum", "init_depth_to_space", "init_einsum", "init_expand", "init_fast_gelu", "init_gather", "init_gather_elements", "init_gemm", "init_group_query_attention", "init_instance_norm", "init_layer_norm", "init_matmul", "init_matmulnbits", "init_multihead_attention", "init_pad", "init_pool", "init_range", "init_reduce", "init_resize", "init_rotary_embedding", "init_skip_layer_norm", "init_slice", "init_softmax", "init_split", "init_tile", "init_transpose", "init_unary_op", "init_where", "abs", "acos", "acosh", "add", "argMax", "parseArgMinMaxAttributes", "argMin", "asin", "asinh", "atan", "atanh", "attention", "averagePool", "parseAveragePoolAttributes", "batchNorm", "biasAdd", "biasSplitGelu", "cast", "parseCastAttributes", "ceil", "clip", "concat", "parseConcatAttributes", "conv", "parseConvAttributes", "convTranspose", "parseConvTransposeAttributes", "cos", "cosh", "cumsum", "parseCumSumAttributes", "depthToSpace", "parseDepthToSpaceAttributes", "div", "einsum", "parseEinsumAttributes", "elu", "parseAlphaAttributes", "equal", "erf", "exp", "expand", "fastGelu", "floor", "gather", "parseGatherAttributes", "gatherElements", "parseGatherElementsAttributes", "gelu", "gemm", "parseGemmAttributes", "globalAveragePool", "parseGlobalAveragePoolAttributes", "globalMaxPool", "parseGlobalMaxPoolAttributes", "greater", "greaterOrEqual", "groupQueryAttention", "parseGroupQueryAttentionAttributes", "hardSigmoid", "parseHardSigmoidAttributes", "instanceNorm", "layerNorm", "leakyRelu", "less", "lessOrEqual", "log", "matMul", "matMulNBits", "parseMatMulNBitsAttributes", "maxPool", "parseMaxPoolAttributes", "mul", "multiHeadAttention", "parseMultiHeadAttentionAttributes", "neg", "not", "pad", "pow", "quickgelu", "range", "reciprocal", "reduceMin", "reduceMean", "reduceMax", "reduceSum", "reduceProd", "reduceL1", "reduceL2", "reduceLogSum", "reduceLogSumExp", "reduceSumSquare", "relu", "resize", "parseResizeAttributes", "rotaryEmbedding", "sigmoid", "sin", "sinh", "slice", "parseSliceAttributes", "skipLayerNorm", "split", "parseSplitAttributes", "sqrt", "softmax", "parseSoftmaxAttributes", "sub", "tan", "tanh", "thresholdedRelu", "tile", "transpose", "parseTransposeAttributes", "where", "ProgramManager", "init_program_manager", "__esmMin", "init_esm", "init_log", "init_common", "backend", "key", "artifact", "buildArtifact", "inputs", "outputs", "dispatchGroup", "uniformBufferBinding", "TRACE_FUNC_BEGIN", "device", "computePassEncoder", "entries", "input", "output", "bindGroup", "commandInfo", "TRACE_FUNC_END", "programInfo", "normalizedDispatchGroupSize", "extensions", "shaderHelper", "createShaderHelper", "userCode", "code", "shaderModule", "LOG_DEBUG", "computePipeline", "x", "y", "z", "limitPerDimension", "size", "dispatchAverage", "getProgramInputTensorInfoDependencyKey", "getProgramInfoUniqueKey", "AdapterInfoImpl", "WebGpuBackend", "init_backend_webgpu", "__esmMin", "init_esm", "init_wasm_common", "init_log", "init_tensor_view", "init_gpu_data_manager", "init_op_resolve_rules", "init_program_manager", "inputTensors", "inputDependencies", "inputInfos", "i", "type", "rank", "dims", "programInfo", "is1DimensionDispatch", "key", "adapterInfo", "architecture", "vendor", "data", "env", "adapter", "requiredFeatures", "deviceDescriptor", "createGpuDataManager", "ProgramManager", "configureLogger", "ev", "commandEncoder", "computePassDescriptor", "TRACE_FUNC_BEGIN", "queryReadBuffer", "mappedData", "pendingKernels", "pendingKernelInfo", "kernelId", "kernelInfo", "kernelType", "kernelName", "programName", "inputTensorViews", "outputTensorViews", "startTimeU64", "endTimeU64", "startTime", "endTime", "value", "tensorDataTypeEnumToString", "inputShapes", "outputShapes", "TRACE", "TRACE_FUNC_END", "program", "outputIndices", "createKernelOutput", "createIntermediateOutput", "outputCount", "inputDatas", "gpuData", "outputs", "dispatchGroup", "programUniforms", "validatedOutputIndices", "_", "outputDatas", "isTemporary", "isPersistent", "tensorView", "persistentData", "uniformBufferBinding", "currentOffset", "offsets", "v", "sizeOfElement", "sizeOfVecOrMat", "baseAlignment", "elementPerVecOrMat", "maxAlignmentOfField", "arrayBuffer", "offset", "uniformBufferData", "normalizedDispatchGroup", "artifact", "LOG_DEBUG", "uniform", "actualType", "actualLength", "length", "gpuDataId", "src", "dst", "getTargetBuffer", "size", "ptr", "attribute", "op", "WEBGPU_OP_RESOLVE_RULES", "context", "errors", "kernel", "kernelEntry", "attributes", "useErrorScope", "e", "err", "sessionId", "index", "buffer", "sessionInputOutputMapping", "previousBuffer", "id", "bufferInfo", "gpuBuffer", "downloadGpuData", "createView", "sessionCommandList", "sessionPendingKernels", "computePassEncoder", "command", "init_exports", "__export", "init", "TensorViewImpl", "ComputeContextImpl", "init_init", "__esmMin", "init_wasm_common", "init_backend_webgpu", "init_log", "init_util", "_TensorViewImpl", "module", "dataType", "data", "dims", "elementCount", "ShapeUtil", "newDims", "backend", "contextDataOffset", "heapU32", "dataIndex", "inputCount", "inputs", "i", "dim", "d", "program", "inputsOutputsMapping", "mappedInputs", "outputIndices", "createKernelOutput", "index", "createTemporaryOutput", "elementSize", "getTensorElementSize", "bufferSize", "gpuDataId", "stack", "offset", "e", "name", "env", "gpuAdapter", "jsepInit", "WebGpuBackend", "size", "ptr", "src", "dst", "isSourceGpu", "LOG_DEBUG", "dataOffset", "kernelType", "kernelId", "attribute", "kernel", "sessionHandle", "errors", "context", "initOrt", "initRuntime", "initEp", "activeSessions", "getSessionInputOutputCount", "copyFromExternalBuffer", "createSession", "releaseSession", "prepareInputOutputTensor", "run", "endProfiling", "extractTransferableBuffers", "init_wasm_core_impl", "__esmMin", "init_run_options", "init_session_options", "init_wasm_common", "init_wasm_factory", "init_wasm_utils", "init_wasm_utils_load_file", "numThreads", "loggingLevel", "getInstance", "checkLastError", "env", "logLevelStringToEnum", "epName", "initJsep", "adapter", "powerPreference", "forceFallbackAdapter", "sessionHandle", "wasm", "stack", "dataOffset", "model", "modelDataOffset", "modelData", "options", "modelDataLength", "sessionOptionsHandle", "ioBindingHandle", "allocs", "inputNamesUTF8Encoded", "outputNamesUTF8Encoded", "setSessionOptions", "loadingPromises", "file", "path", "loadFile", "data", "provider", "webnnOptions", "context", "gpuDevice", "deviceType", "inputCount", "outputCount", "enableGraphCapture", "inputNames", "outputNames", "outputPreferredLocations", "i", "name", "nameString", "location", "bindingState", "l", "dataLocationStringToEnum", "e", "buf", "alloc", "sessionId", "session", "ioBindingState", "tensor", "tensorHandles", "index", "dataType", "dims", "rawData", "dataByteLength", "gpuBuffer", "elementSizeInBytes", "getTensorElementSize", "tensorDataTypeStringToEnum", "a", "b", "registerBuffer", "dataIndex", "allocWasmString", "dimsOffset", "dimIndex", "d", "inputIndices", "inputTensors", "outputIndices", "outputTensors", "inputOutputBound", "runOptionsHandle", "runOptionsAllocs", "inputTensorHandles", "outputTensorHandles", "inputOutputAllocs", "beforeRunStack", "inputValuesOffset", "inputNamesOffset", "outputValuesOffset", "outputNamesOffset", "setRunOptions", "inputValuesIndex", "inputNamesIndex", "outputValuesIndex", "outputNamesIndex", "handle", "outputPreferredLocationsEncoded", "errorCode", "output", "beforeGetTensorDataStack", "tensorDataOffset", "keepOutputTensor", "type", "tensorDataIndex", "dimsLength", "size", "tensorDataTypeEnumToString", "preferredLocation", "stringData", "offset", "maxBytesToRead", "getBuffer", "elementSize", "isGpuBufferSupportedType", "typedArrayConstructor", "tensorTypeToTypedArrayConstructor", "v", "p", "profileFileName", "tensors", "buffers", "isProxy", "proxyWorker", "initializing", "initialized", "aborted", "temporaryObjectUrl", "initWasmCallbacks", "queuedCallbacks", "enqueueCallbacks", "ensureWorker", "onProxyWorkerMessage", "initializeWebAssemblyAndOrtRuntime", "initializeOrtEp", "copyFromExternalBuffer", "createSession", "releaseSession", "run", "endProfiling", "init_proxy_wrapper", "__esmMin", "init_esm", "init_wasm_core_impl", "init_wasm_factory", "init_wasm_utils_import", "env", "type", "callbacks", "queue", "ev", "resolve", "reject", "importProxyWorker", "objectUrl", "worker", "message", "e", "initializeWebAssembly", "initRuntime", "epName", "initEp", "buffer", "model", "options", "transferable", "sessionId", "inputIndices", "inputs", "outputIndices", "outputs", "t", "serializableInputs", "extractTransferableBuffers", "encodeTensorMetadata", "decodeTensorMetadata", "OnnxruntimeWebAssemblySessionHandler", "init_session_handler_inference", "__esmMin", "init_esm", "init_proxy_wrapper", "init_wasm_common", "init_wasm_utils_env", "init_wasm_utils_load_file", "tensor", "getName", "Tensor", "dataType", "isGpuBufferSupportedType", "gpuBuffer", "download", "dispose", "path", "copyFromExternalBuffer", "loadFile", "pathOrBuffer", "options", "TRACE_FUNC_BEGIN", "model", "createSession", "TRACE_FUNC_END", "releaseSession", "feeds", "fetches", "inputArray", "inputIndices", "kvp", "name", "index", "outputArray", "outputIndices", "inputs", "t", "i", "outputs", "results", "run", "resultMap", "endProfiling", "initializeFlags", "OnnxruntimeWebAssemblyBackend", "init_backend_wasm", "__esmMin", "init_esm", "init_proxy_wrapper", "init_session_handler_inference", "init_wasm_utils_import", "env", "numCpuLogicalCores", "backendName", "initializeWebAssemblyAndOrtRuntime", "initializeOrtEp", "pathOrBuffer", "options", "handler", "OnnxruntimeWebAssemblySessionHandler", "backend_wasm_inference_exports", "__export", "wasmBackend", "init_backend_wasm_inference", "__esmMin", "init_backend_wasm", "OnnxruntimeWebAssemblyBackend", "init_esm", "version", "lib_default", "esm_exports", "wasmBackend", "registerBackend", "env", "version"] }

  2. F!-1Ys0Z&RFN$kjQ1|^^zB=w$WauQ1LINAw;{;k9-kw}8K8{ApD(aK z!L;Geoa3fQTEX6e<_^~zbL22{1$qFJsYivGUvuQPU<{BxX{o-6m#d;yaDZ>WAe_jesXtV#**x!Io8i2+?qRUmk{SQ8~G*KTUt1bB}P;rp#pn5Pf&{C))qM z`~ny$BQrhr1zl`EQ67d`Y?@)ofJ|S1+Uej#m@G3a(lhIzXHFOP+o)}H zT~EJt5QTt7Mgb9?jcSpYN`*F3h=v~4n@+8WCIEg&jbJ0jYf3C@=l&FHwGyL?S*X?GG*@Tw+%FFzU*IX zk-I#!$Xy;<@=xpw<;a=EPrB2PL8m&wJP&2^$c6HU z9PcaF`*UhyStK`nn2-pe4n)NUg?iZ@LoIkj9pyCwX>bg==LQ4SqbN?8F#z@Ufypoxc^vf%3k_D&Mp^oyv>L~IY9mbE*w5wuz#>5L3Rym#d#- z@GOwH+v4Zc5?^k|YRW5$MY+RAYT}m=`BLf3m-1A@U!@V2FKFmexvK%b?v|;vWvM(w zI7SVZ$t*B>^fEaCq|N~Hd_IsiFO%!y%1BpQj}4%zWpaI7!GqM?6rnH6;meRhXBgQW zw_FbJa2greMkrh^2l;a|Vj@7|X2f{>0X5X#<#MoJZRV$URTf_+ zpA~XfJ*vXvAY`j9tqw*%Wd$33QN;=@KIq>Yy`h7(_T5!-knX3sgtF<4b#vT5OoAHX z%qlq$f0MQUq9B|}mp-u8I+NJW&3myv5_qhZy{z9Z;yN#WCPCcCGv!aDZ5Yg+ZTU{e z+i{C2dsZM^uLE{w9((wE-lLtC555K0boOlRW1Z$)pWsjCpUOS_49eO^yQQ*VGl-2d zD}ak)RF*#0L;4yy(z@iariB9AL_J4&*j$vVSv4TBQ$Ppojc5>QYYYvXsB-}G(65O) z7GoJY2!}m$#MdjT=?+$2J{w4=w3Qif%X=)cVBoY4e-tSe|Y=u_$aFG@67CGH)S{3B%4C&?h+s%9fX}3+9(|Y1QAe?BIqO4 zM9O196BHB`6r>!b1r!jJD#)TpiGqkoiHJxqii&~|u+!e}xigalpKX)fZ9R;|PdwyipHV zXz%;MUOY2*z0Mi2jy8N8!GXz`A{E>xBizUaoOI#$H+csf)HiT1#r{so(jD~E2FTls z=#dYD4Q+oy%l-7)PpgDBei;0QZD$v33ZB8^rOhlMQ=J{*DK=KSl@82Er0^}lFM-Yx zG|C8JtK+Zedp_7S8)bJ zK&c07CD5cVgTS7H*s8B-;X!fNh?C8*ML5?T#5S&>eutodSpysWV0Y;Qx_Btqlbh*y zSd4Dg;owqKY<(nnJ4T01$jmiHN6U|({K}a}Q5k_*jzX3GA)P&ncN?hXF{2GSCffM^ zm}q0_anVKwbvuDY!3;+rhC}WN)L%i9PXudOK^8qiv1u5`cf(oMN8?g*Ik=z*I*8zc zeuMg0K7s#eYHx-lv`p>IuuQ0G-loCS{{E9e5omGD$>1H1ufC1c*UzC%CqeJJQ}(Ig z9dZ0BNB`ki25dd=#(1hzg9Z(~^wOzdrt|qMhqTg<&gWAktW3*vb6wa9Ky9Ufz!()DC`Ydgb`g)Z))YDk878b)g$(~i@@t_btc#OS{w)MrznqhcAe zX>o%%FBJA2zJo~{w{_+>o8A~M6h+^`8lXGoq)^FA30}I#F*TMtoeD4Z3$Kts~_R?;Z^S;afKy_$fFk{$3{3IDB>s zfS~2bJv_T;^x2?@57?q~ctfUDrDubID%MSi>@v!WXq90ct@7$hrAAiy&(U(B+=~Ba z=>n2LZ8#>PP}cQ)_;{Uu&{4eQ?ktI$FYenqOUj^r*YlmU>s&CAd;0cV@GSUB>CfUS zZQ=Rgy9i3%>jE%c-X8_;{r=$KWgzm%V*Lh=8R-|H2*wYq>&{MeInCfyMLwJv?!O3S z-YlAS5qhZoRC*CwsV>O-bpSUNmx3;Q9(F0%9*_4f1+zeVBB`va$4ft5GFK2yHhTu) zk$(yP0FpakTD1f^^lR`=+)KNtpu0brn*J8-hI&wUo=HokzfR`eN!`{IRi*l6O{-AV z--GYU8z6C1xeaap9(Y+n8Rkt@E<+Q)kD6Z&HpPHOUj}S+=TzxUspG25sF-u7BJ~rvZJy5F zB6o|B2QFM08(|vlp5b)vwYt*QQ+Sum9u`-+`|8o24h zE5Y}|H%bAi4M_v+knFDp6Q!9{d^Om{iTLb#Bsl#~S22q9RP`Eeq8_KX-YXMn!L{HW zSk7;+0os<*?bmUmctr{gydM0PZ#-?Z+;cdY21tq*!$uIPWST4~wcI@H7<~yDquweh zx516#f~2H5-!6{FOnOn@6;hRyn@C-RF)wHkr>u~AlV?U^3@w$FG%$yqJjElzI|I;!wKE$ape;!4+>D*2suK7p8A}%kOznqH$+0C(V51 zsGXWS6*cF?`_)*24n%5FGZ>*bbZL}szSATXZ*TzNH&pCY8f96f!!@aeC_SfeSODVj z5VKI3Q^`R5&)5j1w)6rui%{4{%u!r6Iu6ugT7;5`uTX6L2KT>DBa}h%`;o;f#|5O6 z2npME8OC8WuJ^SB8W5?RqOGzbBF6!&8d0%LIp-+aSi(VsUbQQ~(4A4rM3y#oMJfN~ zXWM9{HsjZ*Xr)>7l;e?l6Mflw$uodf7t6`fGT%mGe)^9y>1ebv7;27^K0OfN)ur@@ z%qP!0d?ArSaY}QFbt@ihv(K$eM4|K7`&TKxZ#%3lsoT7uhmN?F=olkH?R*%y2Fzn5J2}(+NLgRsSZ1j0?Qv$E?bi^b6Iho#$QKFo? z*4p(Z(C}}FQEG*cgauFp9On8b(A5|vAGk3hR$)8K(tWiPis%1UOR64So`hJBE-uBJ znlyLT3#=Th?@_9-GfXFs(ow8Rb8}VZdla8+EXMtm6{ol`+1hc+NId+9ajIJzr*s3Q zg`*2p7w{xlm4^sb&D=_Vw~<*G`vqU7uJm%e(&APNQpagV1(KkEdBC!dDEG~{#kvSP z`~(cw2%2E7$14d~kBNulM9_oz2}&(#B-K4vE1B0KfqqR;?!zqeyb9ZCCX;{krQ7KP zeMgj>s~49}kH8WA#Pd;h+I#<@*vRsLWw`nTT>YFbo}l?>;@W7*81)OA~X2wbbj#6mqphiVs}KupD2 zlrB!vxUvw;nXg--JOTle>7`U930U|>>J3=cvDLu{n6lMxw zgPxsqSGsau+8MetLkUWtnp69vRiPP~N)|r9m#MS`R!w~Xu}WjJl>2dP7@nmxl>fwW zB}=J;OVvGD3dzq`p$m8P!1Y(SX9E0vlIy`A(}xCf=>wmV>wNI+?YP$#PbAf~Vz z>48J&$$&C|zROYO$iLa>Q$Da0gze9&r3e1cR#4iduf}Or+iQl%}|c zhs`@RsHY^6ufEcNW9AiG1>UN!G)2YZ^_5QYtJO$q1t+xp*{)df#T3+|q6TJlhf#fL zc9ffrH^830QjN;K2uJ>bn1VL6y!oS5X5QY&PER#dRQU~=N`9=C5UKACV)%MZhkq#>vcUXh{uw7SJ2z4s{PPn%?6oPr zG4^{ZwQ8)?;&;OuD}C^FTwFmqoo=ku2b3h;uK49~ZrXbwJtdTPyAmNu6DThuJcZhy zYf>%RW?q)UXjAMC=Ml&y|Gz`C=&c8A3dBL16|*DJH=%yw5i|G$>6hnXwR0Ycxtg=NjfFARK77q z*SG^ay`i{P$^)z(DNBg=h9>F?bT7XFsFk0v7@yy%JjRRP;QQm=(7mmddu1d9e6Ow2 z0_96`5VYUfPH7C;uUR{V6{dQ}zD$~m+bOIYh}$?ep}5w6>q*&^-dqr6WYrGkE=V++(&-J%cQF|qo&m{v~<1;;mah!QBaY7LE7qs*B6y``ckC=Ye|LWKj zVZ>&(&LgI7zw)t(T6Ivwx$&M3it5<3Btk#cj{G8p31=HEwzQ&dOg6Bqx8 zU_S@Hbby^7>8Moojk3(@tib>qcg(5UM4kk`q#xNvS)G6#MU>Y`se#RYyp!?_xO@_# zpZ|gD!2f19r*56a(qz=GXMoR`&I+p@7Tg6Fi;bNXRzRl~>j;90z*jRy#?h8;X)eml zRl1?jBe{azq*LC2^G#{^wV`}z3iG;dWl6=W*42|@;V5rdhO@zT$^6f}bY~Z37XU1- zE95`4(7YRZTS5ihl(u4a6Rg>N+)b(KAEj3W@fRNLH_UF`w?O_*N`PwSDKYjUNzbMR z??06^vt2JoWHoWH^x|~TKTk}#I+YHBgx=!6*)6I^=;c=1dJW@jXI{2IQy--!He_@kr4ZBh*LWR4m{<05M?wk3^J5}E z_2u57vG*$T3V*Lh5WVjq zWj=~rdkCx?MG_xYj=>_q3^*K4nGY*Tp@hN8OhHQe=HQO$U|%P79o;sAQtxiY*gxX6 z-wciGg0+VdD0Qe(hL-~lp{uN63N*C$l5GUKyq9jnBYXq1SURqrNTq@iN;=cF7p^7K zq7h1_zv%1gL%{CC^$k<)(WbqiLpS&vhi!XkqReasW3q?a1&QbW)hZ)uDIpmJj5FJ(Wa3K zr-3kSk<1_!(5zb``+sTNkt~r0!ng}@!XT%tdSWtFAEoq3TN;UDDoi$(ofK*&eUE+))rSb7^%CM3Xu(N=ddu4~EPC;J&W3Wek*-lLu~dQoqs4B_YR$6%Tk18I?mr z$0#dU&z$<0@+N9;dJGHP57z*Yviea2ejozHdbSWXa%p{`k^u^VPLJ53x-EoE zii(#DmH(o-kwpqyG%YPsTBFsUi!*?cv(0>$;F6vO#n}}QNnYgNXO?C6~9e*PGQB& z?&ok!N9$S7E6+MUt%h+{r`6YyQ)np4cClmNLW4|P)hB`=!Y7Vo1^UR8FZvGes_PNH|F35Yl`O{wbK zH3PYapm&LyuJlDOgQp8_Ja@Ws2TGrqj(%*EHACs-z>N-!$Ecv>izIq(28cEyz|Bx5 zqg0ETN_U3M>ld#lhnCI+AOr18!NXL9V$Wj*yNdAShQ1}Gi3}2xHVcXaP@e(!ASB)W zvjpGsTy%Kp)mcg=x?Md>Vcorr3P!g}pewT=p3Br^wgA5svy}(Ygm;dz7z5cb2janJ zDhE>+qZ!>dmxXUAio-o_yUmx^zTNgRG#*^h6l-vO`B4SoI&R)=Xs*X7DN`yQOr zNSbicOFdSAdLg#!jGq&V_hL&NP_8MFTyXXZtGz<*hwiY6oDcp7HDVKa819Xun#hmgJAQ@TCKH@{ zRx4w8mr7SdX21b-ZqG#O^RCj9AyAK=1hv?^N_G5j{$1!|Y&39y-EK+Y=$B zzWgT)+n<4AeoKgd3jG+u_G6ncMDj2H526yiuOKl)7h3syA80T?P(DTPGQ2r(!hL#H z8V3_8i;YaAz5Z@>L+@_@Ns#Z+NjkJK0o$KHMTF__Y{XFKFV3ILS6NMRa-^3-MVpkd z5%%vRU~^a6CMS*3wnO@UB^1*#XOa|p_fzE&8D`_-cIM~UXUdG-yYr{g@tw*-`zF?X zi7GF)&WV!03oow!X#iFb{dX#j=~(NWesuRPWeN^*yW60nS)th7ta~^_3-;vaNE1T^ zd!UY$)>8lWIh?;>a{C-TX4|(BNKmQoq70}U@1`T|bF#uO{pIlVpV=WNE&BXcSSa8U z3I>W))*?Ic@0wZR+5>^`WbdqGno^2Grf`FY%X6mRN6S0pM2Rk5tmr~`_;mXsKRSF( zDf*%QU*xAbUt29Yq6S|8Eug7>WJ7*3T58cTr;5AsIdUh>8nKDRCdL?-_c0 z9|+TnRI;UAA}!yicx_8$7%2O;c9G6dS)a@V+B>PbPVUEJ(rrN;1^kYz6xg}EL0iUN zt4cLbD%;px{K82^4ZpCa8sezbJEgRc@%tmEl#!wMFIhg2LnZr_hgdkwIiNJOUrz!O zjr#+!*a{8+(C(!kUn|curX2km67Y8vb5Lmxpy_-Nr>+_F^g)pAi&Sz@(9%-}mD3j4 zF8S_C3eEXGKazev1TNK+57z+^%r=q+JbnkLMkKUqPaamH>dp^E=zoOi7cXS6z8^&2 zl%T>n!m43DVnt_hLi^u!)c7P9{Ou%t{^of2bo45|=BO!&mA!CSNwnkq=qCRKGzv6sF>C~GdoL=Ix&)FPbmFLDmzMzYBj90w^{CR(F_TaK zHi~n={<8luMK@m9Y21g1*!RIPrK)@#3YTsD66u#?idUW~&5U^^nM>NK+HoZj3!)uY z9sz2+UnEFcn1?7&pOh+Q+gGy{n4(wJ@>l9UCwAd%nv6X{rZG(-Gx_n zm&1BhjP&4fcx7{iTd!8*75J}PW~WV~;=Jb|q~eu?bgbs9KaOk-V|LcYEl2BuDC&QG zDtp%1+*n3%H){Qz5=VjWmHMf#%|tQ_QJag3kyt!_*!M~m9P*$0Ub&20pl5ziIAZa* z!%tSB!$077{3SWhK$9g?%QFxhyOXEv58&3DUckkC+yh-5AEi%6D1)yAT+md9%S-3Z z01JoHpJ#Bbvg9I%%<4t;UyA(OwTjb-U*~y-%GQA+w(1a*OBc4hffQ?eFVyJZbB&S7 z!I4EvegISEAkuPD@y0IxXjtuKBjYy!DeWD{ndoC*RK={y^r49Ep z;%|PZ;W>O=zO3OkNqS*M7d1_O0R(SF!##N0e`Uj$xX{^E4OPmztStPWD!wQxzIf}3 zl1)9p=kal!QnRcSz_JG^fMbjlz_RB{DxDWTn9KM(r+!Xt!`1reHST=u0LLHW#hD(8 zROC-NAL|N94)qb>4M*VrRdQ^OTz&_tAsEkuPG$0=Pske`6xYC06ne<3 z#<7C)u|%~&_|(gZAjm5c)zcsV)05QMc+^i;TY*&DL07TVxhk%qi&{MFr@cS6^V8-LcU7I~kBOq1 z8&A5UBG}doDqgS(X&9U!pWg^?vfdf$Qt3UCGu21sx1;&`**kA~G%iYB&Qv+ndRCUY zA94d*(Kl$^FCpaesk@j?<@KtafM7#v0G|;e5~)Og$ahf9fa<|OPewIEx}N4x=nmtH zP3yM)Tss8H8Vn3P9#G$v$2pDl0n+jM&@0*M1bJE{n*!WLgR5Z$jcu(JYF%9&!rGXX zHPrX;crZsD4OM1w>7pzt(_^G@GIg1-v!*;-US{toTB+>O_BP7ix=;!Voi_^kb#5@!RabwJG3M5-)rO)=z8K^YVUVrW8Zi^xqAz~O zBU_JRF*B3P-|^7?Xsv2)9+Od(2hyqyCNQ-+Pk?K3w@jC@+f2Hvo!T3}Eo)ak1YXZ{H1$h6(MF)X zTGLf|!KhbzwUyWooaj*2g|Z9Viw!%`UTj!g2X!_t$?{I(?U_z$eX*K+knlx|5gS!` zks5SX>ta;>JO59Gc-58|g$|$)mOLU??au^ba2It3faiJ_HBpjwg%Z1|bDVJk5Wuco z$mS>jgFfn|Zbc8z_g0%o`$L<0tI!p8WkVB$DLdt})3B&FA`v)Ejiw3rs*g*=sWua7 z%jzuTXy~I>rxy3AE_pVX;lehs#cR+tJJQhZaoU}i?^B;dV|sKi7{uSNRw1>I`Z&_Q zz$XS8{BHf#8g3)5P`ED=&^CMK{puYc3HxH{x5hYcajV%? zrHD!+itKANw;;c<(Ok4))-IZ(*zYbTQs4X38s_~sTaHH4l>5{~s@YE+1P`$KN%e6? z6C>NyPko$2HMptdV~lopAGMmt$RBBrjg@Cz?o*r6rv55lop0}t)!0J%0CgS~<-`EB z6IP*E_g0tSZUas3oe!vu?NlAyb@w1OgI;?;{TRgGORFEmwk(R)`QfJ@N}^9LR!{YQ17F?MT698=xFC4^&8Y&`JlQPk4GL-N1)YI8rSkE#B_W} z{Yic;nWn}!tbut|w&Z-|Vf7MLarLf)2{dM~+7q8ktHwhyI9N@wc;U6dYE|d7I3FTG z*QZt^W~R~|L)6jIG+IAIeNz4~mh!*JO{UI6RUb}n!-uNlSYdr(sQO>|z4H{77PvxcjxV+u}}3--~W;cAcv2z8;E#Ws$ww|IOW zBcMY$OK_JDFdjyMrl#m$j!meMEPh}H2dzA|n~VY-M#On$6qiR-3|4ytoP9EleMBwd zrM~uv+79M-ZSz$&W%U-H{8W;llgn3G=kr0ns^f9Rc$7_R<_&c(Q1?jT(DB%Hn!+yX z>PU5ke5o4j&xd>I+DO%F-R!x9lHM3^H)=6Tt%VtzR_F+gVuVfpr`^EGz4C6D%(Eh@ z3WsPG>MhF*GQwn;m~rVSbH-D*QQT|V*d(w8VGf#6I?V3_C%g1)hy?)EB&0GmYO`N za(=y{_mdOjtiaxqzWXyDC$}vwiK{MUhWlI|1h||(2T=o$KdDALzd_RMXw)rxQuTA_ z%d*E_#C?ys72r3&f1Ri|!td%>wa#s0baQ#j=PQ+8l~kI!m`!N`%pu+ztHwiTYdR;H z=!Djdco;IWRIZ+w=BcVo?ojw-G>SxyKchgGv2x|7MTBUZbZpJDr zH(G{z+`3t-w5(#$#yzXv-YQqGZlJHF-M22dBR&7c5X~!YF+?kFym8ANE#L+bIoPHy zay+E8Txv63&B3)aZn{&|L7X+R3VGtX+v(}A99hT!kF;WoZi*?J+OOKbjVW7=&e_^K z5de4ib1LV%yfJL<=I7L0ymUXWW&(4K)r_tR!P4zIh0?5Kk|T z4rRQcekFlX{qmw(kLmN?&(%zqh*)5;l&&wSwVDmG@(frxy#JBGyG&zdgTd2#FR3{= z>>hgw2Za44PWB%}0H+9jR|#cKf@JhKxj%m(jrvVe`$D$aG)cW1yXKvYgH#a}PF6GJ zcjr;@WHraWO9ng1E2*9u?J_wCgWZM6>KK4s6fH>a<(*l#WeeKyvKj?yW6~%KhFqpg z8e2k~d>JP%wtzl)re6}(dj)bT97A7Gf5xL|irUS!^7}}AV}kzWIy)PtOi`<_Mdj~P z)c<0Hk4#m^;PKs5^&w0v_f>T=z8!v5ZD~@HuVr79;0-y`)asxli3Ti3S(c+wCM6N& zaB=;}G+^;SnmP@=fc&3)1Tiww=c;jZaGL6Io_))wCj(9{OoQl$tLo_>5U>2<6IPSM zr>ouYZWF(oInOT$#JAJY+LPp*q230A%0@HP=dqd_X5jdlOW`wxq|t7s$`&zC&Qyn` zckxGCHYri5zUWF6?8E}Hky;I^fN0=!!E_aBHGIcXSEJP($v}>le%xTVHR^-?x739I^F{jWJ0}XP&4H9JL%X00Qs(&Z-C}@p^P`wvB1DtZ>Y`fxkye%1Ews*MfDqMhw!=8IVIV+ zr#dFYh20ALGNFD}ofZsEepAfvb8~+GO6+v$yKb1@u8PX#U`Vco#{8-;tTewbXy`&v zzhN|WA+#9q=2)mUNOppVEnp_eXonsFvP_*Sx%?2B%omWg!lBDEuCzG#ukIb5$U zQWr@ubzH0-Vtw7yOVkcAXRmNXpREuQ^{=n&ru|FQdQ~4lVlo3R%QK8e>02ubu0p{Y zOI3dc!{ov8q96__CK#u%cq2e`+)_0gW{r!N0uyFa*F)U=pWVuPSHiGl#Li=-6-YBE=-g;=|J zD))Bg|b|8Z5N=>}F~U{k5(YV}Tx=-Jg!A6=w(S7X+Ta7nCY z(Y4j8D;xvyEThnd`(gGC}pit12*^-)9M%c zBbn;RJQp33y2Vq!cX7hVpZAS}#;;N9{Bwz4)<7|JfbL$a-i5}Ou2pM>zsVlbbYLx% z$%|;*dpNHip}cjFGgr{7>(r*nn5DQmw?GS1PiL?>u@34v*x`gQ+5b|L5Y}Nd^$w}k zv^+6Q`Z9^TniWZn#jwXSot3h(FdE< z+LZNy8VlRmdLM`l?)-uJ6zY8Tf!N@r4eDn=j*}bINEzM#v{CJ9AEqNNnEqJbWV(Bk zS`*>L3OA|sT%VV>yK4itt5uydTgJ^Q$Jv;= zS@d~yv&tS=c~mDM#aadv-mx?}z64&6vMtcw;vmg9&i?d;cRbvKlrhlE&q}bdg)_`YNFYcTkT?EG%i_}4831D{z1CG!E@u5b*Vl3yx79G$0@n5Fi~? zIgxO;gKC2;3=EN;0u7snW#JhA_hHRHhCb~|KBSE!0M)+3kx}Ci?i6qrct~x5 z^*(n9vf62?a#+l_$zja?Fx`6?1br^Oa2S2%(%1Z3F8z8~sLg{%#N){$Vmc+p!+8|c zbUn2{sw#Lqb5w1M3OkO9BC*G?J?jzS2b${jHvMN>J-DlvW*<}8Zgl4{^;_v3T6G*~ z(uD#iAnkXdo+s36QkT%(C)GTb4&FMYZo$`wzfrUJ>%?!N1{+2{e5*bTF)QyhGM&$+ zNvG8{FtKU%ovOHwY>d+1wCfWlhvPsr;X5daa3EUpogjBH-{X3=D?RK_7tf}=zyF~6g+yFLz8_VuU1YC)YWpDA z<)2ZLQu6(7lfaELOqBg#?rxBn!ZWHrdchx=2)t%xmsCUME^om3OQr73pHA)P;pwR+aM&E!9=U^asFZLp<5QjSZX zWt8Gfx1jB2Cc$_<1qy8&^jH#esFIW8>eJ6izicz>9=uU13-zrKy$zonWp^GDv|#B1^4#7$n~q5ntqe}u1jAk2BB{aLxSWx ze#M?JW*iUG7e8wxRh#y!T2~*gzhh3oIQ3)j%Z$N?VNIv6PiOyNOmkUzDNIwSvasl3 zI_4t(2IPO8?)(kNk3^)uso9xF?Y>4&-SLC7&?nWjeeD?A6o2^R1&6t@|)T_v2mEb%Iwv;A3){7zpGXG1orap#z|$#@9NO3h3o8fILXHa2|^Z< zJ6z%?zL)WH&N^!N2gW#wM*g8LhTbIgPqm+r0#18Py~%_>!8KOU@;}wO)#fcr(mxLK z+?A@YH+we@A6S|9jg^V?jGXxwh~jIM@t1mA_}pZDgUoI{Fl%hP*iHF=sWIi^$#-6e zCola45n>%J{|gdQPdfh>IDU8XURK-2@WFl!M5EU;eGZ`8!WkvU9g8E@K}@GIb^*qSTG)?86v#SVF{ zssq7hJ~3-q-T*FrySeXRGgGgsoY4AHD)qp$>8UaGnulVqK`afQ23dL^9lMUJYJAiu z@}Drz;>c zc{HQU>GS#J=^1;qG||y#?_JOivgzb!vbGJ6DK>2%jva&ST66oUa9=Flc5+mJw%fG~ zyghB#G;lkAxK`Ep@w1bodeXdbtto!&eQH!a3U_Gi#rf8$QEUuz?$oI2u=w2W()u)US*XOJedmPLUK8ZBa(f+)RhLCTkJ1<|y}=TE)+IFz2d?r@ z%dAi4%nZp$)XLLoLFR8*Pq(*T2G<45`Xh9%!Ji_L00EGxD>viTk>Z9>5HN13EBhy--o`-tMx$MQfe^V znG(ez|JVrN#G9mScLeC6WNijpeoFUCYWTNn+457`9G+Hu@JJol-V{!(5u0)1O$6@- z@$q3d?B<;qS}?)^QQWohjmWp$ksLadqTOznwud|!TB%*$dIElPz0&ErUvoINo)CLf z|JtbZ2iD^=k0MN;Q~qf!KIty>qOamlZvM24KgIB;CHyItKW*Vp3>5l8>yy}3hjAUI zi+=LpWDHY+IRPy~-g1H#2ehO1-D7MSMnKJ;@iAu-8Hh1ML7{c;N=y8`{9B1#hMo9^rmHP2{uu zTwl?z<))>VZI9A_28l&olM2~VeQ-(;iyLWP7)m;hS>ghyJXqNcr3`0t07kgyNi~St2`=)aR3$liOUdXb~!SxYi9LKM2t=8 zxkd@u?3GvOv-!f|UdENo6y973uc9&cwK%kYmEyHumv9|0xtdnHFwtl08i-=kRos~S zfc7wIZUk1YRx$4%t zYK_D6BCEWs*hs$97VBpfv%>6E?5cUmdP6DWo;6ILY3!=$?~5XZ5#)(gTN28|-C}<6 z0@lLx`Cp5>ZIp_?MJY3Lmi{vOWAQ%1y1u=kKO>_7QtBAp@x^W7&Fg9AW3AMmd3|$3 zOU9*bnEt_EKE5?af2QS6MJYyP1WzbOKQnt4uv^SE*_cJAiV8SwauV}G$bV+Yb2OV$ zG1+qHA5t|k%?}dO1~sh67r=!oFdXQUQY8$!&}fim+Y-=vK@j=TIuJw2Ia+36Or0<( z-~||Ad^TTVJ1F3RGi)2qI!vj+4G&J8&Gq<88lDK5+Ab~HAMbM`{So|L96oo)G=Bmr z%R^y{Ci{|x_}$z^vw+7JRy*v@fGrS(3*NBy0b80siCagOCF_40k@HSWVG=r*-O)am zFR23_VR~>#K*p6P+u)}8Z8G8}qCN_tdS@69+PIS_pW83nFlumhA1CDt*md8dfmkud zlCYsTRu<@~9n$z|O$**VGKLLO%|nt9>Yx*X`xS;oa~vp}&+SWsA-hWqgeQaVn2atX z(qufQjRC|UsFdHskIsI%s^Fdr!!f5QPz~^cwBD;7@XZ0T)Zv~1z~jR znPa%ATI~yvXOXu=D6X*F_88fQ6zrJP5-bvG`5b9}XEdV440xq>f((l5uBByUGwtP# zK!&8SA=p;~292~GfEdqCKkV7cb}vsTY#)f?Fp5|vA0&eLU|BxM19SK()x_O)c2nCF z{t{giF9X$@+EVZZFFhDS$`F4n9*8s=gU4Iw5#ulK%}9RVQdVnfv z2CBp`&ntBD*sy<2H~gP4_2@d-D`pA+Rf9bQobE_8&l3`bflTRw);I;pEerQt2}i5x zm0FF7MsG2?T_7O%5+k6or$I`xDz#)5Db#)DTq@|M@9)Ko zz=0V3%IAG1kM`eO3X2#82RXkOBPJX$8b+cEmJb3q7e@(LgfLlmR-&P1)PozAB-MT4b8r}F{AIC^1ek71gwS8w`o;!L!(B1J7-~~zRmmT8;Tj>5}f+Hc|KTOGyOJg zN-9bjeS1wi9RxZw=N%>Hol|M3h9ys=5yQ|I;{h#}Y8Fe?>q&`)0{juWLV*9o%HUsQ zg8xJT{y_u$>jNT#jA7AweFF;&@Mj`w?0qdUj2O_fSYRorjRpSZ&AFSwKML1hzNj`; zBPn5RL|ox5fIq4n_^r{4yL3=}mLexO4B)@*hFPL77}-|_ej`FeW#F$}sfGovg>}rG zt^j^B*y0VVEr1`y%?|93Vc?Hp;E!iS_r<4`!$4hgA7TyQuX~FQ>zVzTuwRJnt#^xJ zB39!Kz;CAGyLnixE5pBt;aCoXW+cao8i0QzMO_8>7e?r2)W#c%H8Mw80soC|9wcCp zc{fDl^657&pFX3XXV=u$=~Iy9-hPKHUnNll8C!l~}If^w3t5vL-;6H-GgT+7;Vute=x)96<>?R+d@$eaFm%}4N z7rsh3hp*s;wFD2!so)WYp+yt}fM7p>O@sZYRC;ZpH`a}u&R{THjad%$uQo8L5S$9) zz~32;X6^ywT(OCBnl&5X@vRt6GqX+w!)aEjhJ|y&sspesP_9r=xaO6L{a-Si7NXB` zhSQ=_OIC+1&0$sWo0jFJaLBNV83rXcAl(-8w0r~H-N156j0=1V>MZ+{iV6Tb!^-3a zrt^{2a3Rw~YXl#gjp-G5_pw#5yxh%ITFU5b1US$QiAy!{iR5fiS@Y zmYM*$!)!@#mN52o2{X9>u5nld`pl>$>62cQ*i;R4>9fjpq&g<=+G#e=v|(p?3I5R? z&GELOwSe?b1EL=E7J@27`4aUaUnfY<5BM2 zOVFjxcoXG^71M~)xtYE~$@PHWlFdmi^+8>`Ggg(qNXnTAHooIzsY1xVeWbdTA`rYd)}RHSBT#(D9bT4#Fbu=Xwvr4A-3}Tzp$_OTV5!`?izu&-_ck|eSEQD3iiQVRs zi%J$c>@g-$Su))Nql?AACKUclhP>Bo0aBSb+3vknH>FlL706L~t8!mhk>nRAK*3<*0D+ui?BXH}K=HZXCo{H&qf_ zc))7BVh{&zRqku6Tm@mUEVZmX6NAu=K~!+%gEtPsve~jKi9wk8>10N}LlpO3^@Ku3 zkXSg6Gdv4DK$6eVCSY?rtv41r0gi!H?ZDfhEn{{H#V2bgSCHKa0;rEa@HlvWVSzY4Q;H5EAW=YJk^NR6&hKPx0)7XR5sC?3sxaVW zTswrPMpY;)IMfptartdr7$hY}E_4NKIBX-0I=JVX2utf?6VD&S88wS;;b8jMG=Q1SZM0)Mh@!{j`= zt#cX|iWuro_r(zBYn04yum)(^!lzs zOd-wZ)jeZ|`B*iB1&-!Tho(txi+V1-K0mxjq*D;6inB+{f=9VM7q@K3GE{EZ4$T#> zb%GAr&yG?7pWl~$B`S=|7eOV&>Ie)ED;lrck%!yo>U1^EpL5kEhlPdN@XwBa;rQpT zj`7)Tt#qHS`qi|sQCH)PPtvHX>5}nL#z)!sXv0UFFNYSi(2@t#KzWFIXq@-L7c+$S zE+X28_c#;Y^d4#_ya#UZd!MKw%7=;fHsgKP4ezT{+1h$Zh1Gq@cx?yl0L}mgJSSgr zTPy(f#O1S((S0}dg;I&A!nz%<0wofUjBzv7=f+}H1w-}Oc!^}$SVOV!V%=_BHSg89 z4*$3y@xtH#M~IIjz1Naa;S{Fh4a|9RB{E@R!i4rYg=md3VAv<(CQ%p92e|ZLS!o)5^%A;DlCBbOhA38 zbfboHOt={AOT?o$mxUoid0DBvET(PD17ie=M1l1HM$m-S9Z0hsg6adUv@CZFc*+oP zlvrO>zy?zV&D;A%q581FoDHG+XH$SXZ1R6t7w`=XMt+k}eZ;6G=^NnL%)Vn0`jMH* zb-gi1&E}YoA4N9q9?nFcd%4fG{0`r9tZ4bE80zlbpl;H7!47Gjq z(LkIU=3~l>w{A5ofQJp*>i{ku9#zBqXiM@XFyHQ+h9_D8n zxXg7H_~StgdBeaQ11@n_?Q>mqQS!#2355|p@g@ayvx1O9me6elf%rDu97f`*Xuzn> z1XR#k7o$I>=@meXVdMaQr6I%gmP5d-hC_kQ%6qvhuY(vv`RVhR*gX&s*bPVM$7t&L zdfx63c$&!dF=2=_wZX0+JFxiSHd^VzR2g5SQD_(P3b-S#Jlt3S&^W)#Jd7MSz``Zk zJx=xCxZushLN<|uXcx^l#yEfvXxFT8LR8R;9HPbv6CNWN9))!sHWs#_P|4uQ?KHzd z3nqp3#KP=5!tMg4vl+Y1q!3ysvhUGObaAZJ7T&F-B01t(-am|9qZ9c!3cgDwhal6koWT@u_ zTfp8Xkj#sX@47U!b{NEtwt-|?)>=z#FFJ@rDRI`~!%`YX%czf4VKRXNm^J3>syN-9 zG!_&qk6>aUKX&UR4LEZt!Ht_M8zfXdg!-IRyN%W;DN;9m43J3-7kr}hDdP-Cw{^{k ztpS*4j!+pN0`@c(lW+$I3WVz~UQOEAM$3tf)W0$MhC2^FBJ_n;4KKf~c=>G@Ww#YC zPglG=9Y#Iz(iI6O23E#+hUwo?!Mx*DXkJ?_=_aCNxHW+2@Tu}wlPG=vzY(P$%--|^ zAWG?iDE%Oa(i!82FeXZ845CzM^Fx02yC8HIK^k>}L^`2h1D}KmVi?0W_5son%efI? zgHFaV2#R``CVBbM1at~%gPO>=WMl=bb?pAp90YES*ZK7y%`umIB0KfQNCE3}W}?~3 z)qXOn;o6d`{X_+S-kso$2*lyy(uY4m;MWlT(3-Bb(;CLX8P%u|CGg{H7!6qYYeEh# zXWD}yI2j|_1B9%DyKz=OXH`LjoDqcyg_wmJmTye$VPn3Xjc=Gekc5FK9Ml)E2kINu z26L1R91_w#gNz%!W&5i!S^y0@F&}aRSOgsoBoD!zt02DFZ~3Bz1QK%t@l1K0hV@FJ zybAYYruoWayryax$f3Rp7>oEZ`W46>mUYO_#?TG>m7mQ;Eq7T&f?Z+KDcUm(SkRtj z_V9<*$a$j?HYknI&xg?)zxPhC3mekBv!3)qT>l{!8Jsrw$wwEf-UYLszH4*23Co4@ zF@Pdj1qByqry3*IeX6d?_c6#8zvUtWp(*ESGN8+AmxVR+svb<&vHu z!2Xv?!WaPI#3v17*)}{Albcz#AFzR zK;m&0=(eGLkB~%#cme6b6JwXdB5aVG|98-5vj--0miPTQV~iL)47|okRqqrwRn`?1 z3jZtEf5vFVCP4ogTCnoXBz9Z8HJP)ze%7p18StMqeIdkUhE;I9Rj>l^$KR^l1gqR! zy8y`vT*znH9$2kCXO%JmpBBt|Gcg$e{k-+VyPx~?Y(dwa=c#zRfZ-w>BwL9XjBO&9 zWUD+`^fR&2U=XyV67@5c)-M<>3uWUA5;b_URbo3FqgddPI|n?F=Kwatz`SHWr-Pq? z&Eq_1h>wuS$KXm(D!(Pf&wSLzPSy#_r-ElA5(=vTEm-dX@vJR0mJ*xSpcqS=9Ilc@ zO#oBC&XOk_&-r{{7%Ty&?B%j20F`A=h?$T*nZ=6vpjAPuv|Ua{n%frqR3z zESU0Ya?U}vnljgeNdT7w_B;&akebMaz-(~_bs5D6ah?9qq4Bdfj=*^I2-t_}&QTZy z(*YljE3UM*qH6$&xNR`@_C;f_Qao$@>+6_Y4| zDFZ_*nJSB!4ddpav>he%db|QGLSnCVL6-2Ni^(c>%_rB*wHNAzfX+J5ACz}H$(Sri z7om z`!sq)#}5Ni&>PAzY_rM(^c8a*(heg8+E`?tv7=+2ruX4ig{>SMqDKKJpw4hHxFA57 zFOg+NdIBDr@7i^h2Ij)x$jq5)C~FrkqIW-LGEuE zVGrmh&}Hv{o$t#m#9;XtY{r-Ku(B_T@f;Y>%K(~St^j6epjr<|yw*$R+JgXwQ9xvQG%LsumM?fIiCT5871bb8 zpIR}fspg;%^2BVBSFH!DWp4&WdT zI=A;kmD_~)!3!_ezefO~CnE)pZaxghHUuh6UTd`8o3z!Zs=zpxFD<84jA@$K!SMDh zDvGgZwij9f1Jes-oOz~@t z+FYC0s5Z1{H&Qm!xtR--C=9Y~7S8@#;nynqea&2h^005{phz~9e7LiL77k! zEzNDd8&!U<8*Le<>&xcp`gN&lSFyB+XLW0x-z;+o`Y$+M<03s(pJk53INf4lXPYgv zOv#ZOhadOS&YoIkY7(ng!hK1;aKx=ax z;FnRGJtq+Y`QDm#C(C#FPx3e(imfFG}$y(XsorkX@vPA8?=MrR9CKb^H}kz4~^7GjTs{ooqw) zwJAsn+rB?HF>`<>a>*x=sL;88-8*U0!*%`C;Q_5XS4}ahu6aNVDsBU!@jpFKbQqU~ zoJb!AGuqLV3t4_@p4cvx@`D*}>ZD|3(Vv4f7uU};QWs2CGFnsr2epy>4&k#noxy!- z26DsRo&mS4hm0Qrw0g+syXmiow9%MR{(rQcT)aBPDM&-oZ`f#^ra!Db%I|P(#7$%j z*4Dspv~;jmL$V{Bd0i^KJ@GC&@loxV(EUTTo-$mD*ACY%%CitL9{~VEACAx#*yKMV zso$g8N517Y-3<6=>!|J4d)_`VK!LQ4(bhO$ej=!x=b2cF<+)ci^9EIi+8jnx)OuZQ-I)k+-lwbanG zXSFY6ynpC9tr!o-^V(A=JpOqtm&az><(7}lu(E{(i0Gv3d318VGzDX8KT+#}5zL*a z-GxM>WfRMLZ~ub!kS$mD)9RUUwch%IRtMj(%KXjwqWD(T_|_5M(Dh?4YDnQ0dh11P zwJiM@x@WTXxP%a3HH#N$K16Bw;bmupUz5j z#Togn3_s6#Q?)iR8$JxzSIYY0xggwdDlD6-RfoS}%BvMWl^|9!|1|VfjAA&w{;HN1 zy`{+T^>pctXu+aUi4m4VDZ24%q2y^=N;tv|)PGG=97m!N0ZgLRpCb{=Gp}iW$CXsP zkc}4~z6L~li(+2~2(Kq8^o^HV&C(Fg{&lUBeZ35aJ88C-Ol@ZwU*S!|Uzg2-XWM$Z zHcK0dNB#Ijv)1_8S{~PmFp6C;zeXBg`^?eq;a{VSuY2cc56bIhS}-yl=|bnC({6K( zUR;!4tR>NVbG6P~9$uRKHEo{pHOBZlZl3ly|B5K2#TZgzvDOP?@g-p_Xe>PRT(LIX zDfKLF^%=(+)J<3kF#Cl5vr@YNheeLO zw!nsLsE@4DYPm~3hGDn<+^5ENBKTS&ZCIs6g|E9D4~Oid=iW$*Uh*A83pk28k--BM zIkz?W+n?z}xecm2Lqk?;K@RkvcQz@7HoU9#g@Y=RSm#mwW_B+XuF=ZmKeiR0*q#rPH7)#4G=9k_XA)x z;yru-q@O@@jc=Pi&~B3+qaX3WQVTCej9mEb7>n4A^bNOO?D}q9IO~{;t(&eo2>oJ8 zRdB!iy%`1w6)+h8s^95@4cZ`HpMq%xnbhJ#?57cmmO6eY7AMt^sbVcV*nf%?;?{+S zgB8`xq@Jky_r)>vm~O*wffwiKhvwo;pGX-SHIBO1cB6LIfDks`!96G-q}3*X{y3Vx zNxK`#S$^Dv^%cIi!xmglZ}%1xP{XbwQA zX^m_|@Bu3Q^Ck!jV`~#k3*&MKs0^XjCJ4h|-h|1YR6yviPc&a8@DsMX7Wh@!erxap zm>MzJOkB_3u6aFc|1tosh>a4L{nd=7Z?6D3k1)P95faPVl2#A(BQx!~r(A`G!7ZZV zZ!tB6{}MwDn_FuEN-8S<&tPZt&wASasn$T?>%r4>?NhBLs8-GnExw#; zSuolDGmT@pJ@}b+&H&dK0j_ZX*Zw=TmH^lJJ3;u1>5rY-YQX8+pKBcM#=lEzV%viC zxObO!hcvdh+Z|9d(!0B~$pFY!yFmgG?6F2{0=>Rl;Z+O66sn!gAcP!O90&!-P zYIVXvJr9O4`HXezrllPpI}Rc0*4p0_skrT85v-aCM7&`TP_bQyQK)>sjC+6VmlZMX zU+$M-7GUky(SNgF#$B|4WuLiU$LRYnD)uXLpY}6P_e*R|?*F0gJp-#Mwy~X>pj5A*C@msL5dsQX^bioGN`lBiY9feqh)8dVpjc1= zQIz^VGqXAwCntN)%$hZ`XJ(a|c^1|GI`ce!f)DejhKF&L-dOSi#g?4W zB1$}x$zTG1GI)3(n7}||yUp2vi|)d%0Y?jtWOA6m^+z&grwq7$B$J`L{z|3PE1X&$ z%?yN6*6wI#tDs9WE&54-qU>S{SXY{J6tZ#_Z90l^;-EW6GZ_j`$78%PFCWX?Z|Q>Z z`X@qlox!Tt<#=YA2WAT^KlL~UP#!`bK`(m(S#R*HT<+gFo*B)H->gPewKZP6b|l{} zfP+H6hmnCNI3v?eWM+Fi;G2LYv(*|(Kc2`8;6%p2tXonK!L(0irrq0!4kvlpfhRMY zpqYzLX12XI$Dblc%&E+F4MBapVL$@6mGvW*Ps8a8KdC+jU^5JdBmgh(S5Ajh&C{7Z zD7fFyS4|gB(YSs?yThE}hMv>riKZ4W4P{2okfwlJext9jgrdpvGJngBzp&Qv*>rPq zfDfH|dFac?%gw-E{fDl_|J)3$H()5tAL3?UhrX#Qr41a~oY_GEEQ_$zvL)G^Wl!1hN3Bx!1!I>2%|i zj~yjdnR6K?kA5N%$oXj@fzo1-^}y@H5QeY%93jak-fQJkYoPM%vUATN`xzpZV=|Eb35}4tFk!0Jd)xi*$2cC z_$Y!d?HJv*@E55Dy*aTX@WCW`leEe)*d&LW|4r`tWII+p$dPH0cS`0B-Z~9_zEcFn z`N$2tR9fe9>2D_^NX@~m(O$I1M~;^^I1c*AHpUEMz$8jIF09wbLfqVHH&I?99PHc-eNJ|QyPKMqIr2svNERGbkhcVML><%>Xb*&iiO$4_3g z9EE8e#6yER-iwxD8RM%2Q$m~^?Kl!6w~|mrY@FOnGOdBRa#x&XPh3sBM zNo6Sr29?tsX#Uo8+1G+PLYlD-qKszpaFkflOm2doO7RokToeqUgE^OYxrXT4H=4^{ z-i*2|r{kwYmLHKe(RKW=O5&(=@%eB^4@Exf=k-}6+zHMvM`x) zYpA~5`+3AudPMeNbE_d$jI{vK_v^=ArI(Yt1yTB=a+-7q&|e5!SXp?kCE4?u`_bU~ z1H9-!Kw%nnZqgylg*7Fx?*rS*N%m)SW2tt9{&hlnX8}(KU{ihC)@I0_eID(?;f*=E zy{%7k8$h!M1y^UF*?Dnoqv&FLIRd=q>(PlwDb}MI?)By1>Zt%TPO?=`l7>;pGtEOI zoY+$CTC5DDYWmE^43}&0GtFZFD>*&BZ46)~b04WakRg5t6{Yn@$T;e8rS<^RmZd-i zY#RpvE4`!qtE)+7c20tnPBMf3F1_9;)CHNvz{;tQ+&ID?fvVZ$#+JdeB)xG8fc;*q z?mp2qv4?{rQu@LriGX(Zq5W|+BdmC^GnDqU;J_$~?JP%_PWn*(M+xDy{zjt!)}Gzn z-0d+N8;_vQXiELgr1%P;4TfBw(W)h&5O=q$6ACDniCMas>U=Y}o+G=UwF@zx#e zA0Pbl&a%QT7%o#Oql^4ofGd6B#Y7qs*QmDXcX;tk34>|pWAb|uH!fS!s^Q2D^L~#B z%ap3)_qWRk-YvJ6CQ|;2M=|rClG{^US1dAEKU)uFG0C#J%DMQNK5SZ)*#->mRbA!u zp!Mr4K+bDk&4S&EHS6f7uJYp`k=0G^3t%J{_J@!|2qMCJlDV8=lfEy<(Kp>>0AUu5 zYGapR+fwHf=OU@H_0Z^`17%LkaFhOJ8Eq=ybVH`eeZfNdlQM&t4xoys1CeUGM4YIW#+R|6R zS0IR5;d|)q96In6Z*Ed|IR>_oMGvLYuHd*wciCq9sLaan0{xm-!>LGpb{T~{GPD(y zAqkDI=+2pJ`7~!Tf-^~(@5%LO!PA_}vi3uxtWh>bG)fR%`W_f9*>2%5>1=~^;r7BF zyu|}M46V)iqx~I*vX8N)2PYfL`mZgiIYWIKi(9Z1p7^5p!7hdxSKxp@gR^I7?G(_XJ4=^P6(I^a3E5Az{s_#-A< ztx)f#6!pA37fQ(5=j91-#VRkz%Ooa|5r8d$32PpCjR{xkoMsK7p?&2;ravT_w$wYS zsGeUfDZnwXpIl#(3W|#G^KRjd;xKyXW%;%=o-*E$lkxL(f4QMl#e7e1NNeck8(7J! zC}#i$RuvTuKyPiQsyF5ScXu9+z^-Qf7A7nFpA3R?!!p+NS0Lur7hf|NXGc}{HfC{IT&NM_bmBemT6wN=VdPH*t5QrK!41V?UpU62Di8ET@&oJf}+8i&0Cyo!F-Zzi*UGzs^&?L z(~ooIE#^0LoXED1#s+py0fpJR2ok|WofpZC zy?cR*l{%*{h@b_FmIt)iW&^L{46u4h((oOI4YdGyoj~x>ic7diXk?TMs^3p>n|MSVAbYO|x9W_>`jOVfOF|ba&Ok+NjeNe3t zPRWQXhOZ~UxLCD)@=kt?k%JzoKC!+Q3Y6>6aENeLXrX*c(^p*ya{H((0wBQ^@FAfc&o?9~CITR&c^d zS8Sb%3Kk^8h>L9yulNd#6&9#6XSE!IZZ@_F+@Dr#6R>VZ=;xm!B53YvIoVXah__~4(eNy5Z`U(&a*4=NHV%az$#wwi<*)O=VD?Gcuz|vrRsZ{Xvv2c27jT~S( z5D9`BUEYw3?ZGv2wD+maW^6UiUjuV=JZ)VgXM)MksUkEef_hJi4x*D8@zwnVmIZ*; zw^4;(Wn59pj1-9nZJhpgtAy$Tw8H6U_QF;+&Q6|ApiQ61zQC_Hz$pMH$R@*o*bwp7 z1!{%UKfA*)`i+$zr9C$7#FmJ+E-))R9L!#LB_u}C_b=9vf++EA=<2=K%E8sIFS6*D z&zbZ?I64_(WmiPl(%pup?aZiMIR5eKRMPreEKZH%gJ|3bn=`0vO=2zc_LUVd)t`=% zZc_0(jj=bqzk53Vm~E8wsXWCrGm!e!u8OLQ!#kPM+h#ieM}Lsnp|@)64CNTHx9CJ2 zWumyx$?cJ3T_;D|PQUBTtU7D+YQb2f_rFW&>*VCn;l_TX#ktJmqd&h+u7#;H$Pb}M zQ8WsdL+&aRF+5pfL2;SPf)*mg1IkTnzC4U<4!NH99Ea7mi;@oeM^N4}>EXhq*Whw_ z>U^MMsY5Q1Ab6&KZHlA=z2liq9U>zMY&yJ5 zj^)LGNSJ_gPi$jTErXi6kw%qaYImffGCA36@A0x~G}*UXk|hi$5_c}3i)C^r9A1&j z<+UcZfr0p;aTK&2{1|(-aoc6Kp>2RsKG1eyxXxiJos+{rsQfqEh2c6!tYq7TtGCN7 zEv(NsY^7hf%MVM-0Dz)I(xYFYGk3OB4WgGHYmoJ9j1@_{y3!Ua^MlSM;u^Nhme z+H)7vH(cm)jK#S-+$^5l0rPV?bqr7vN&ixQ0x=?He<_y)uofJW&&Dtq9@*0CH^>p@?qv6!)tA^hG;R2G5i30jsvgJjM&Z#}C0f>a{vV zS48YH`(dah&e7BPuzU3MIxN@6;%a~&J>aJio3zeveOWRo!Tr-1$uhoo%Bm>I+edn!3HvX{`WqO!r+ z`vP}IzHxz#QTq6T%#K}Lx*)%epP}EwV~cx--^)5wg)k}}6&y)<8H$Y>{vi8tg}U@h z?{G)QALJJ#Hgvh$g5$@Ef!CQTf8=A=IIZG5MEq|LO4$DPw2BdO@$a+(o9na+ydHel z8Ru8T=fYk1z$BXZlU&n}^(7mgi2oGVL}`Fda5^GqIez|0e#K%mz!g4l@)f=!HV~A= zS;POJ(%6h>fJQ_f1G&&pApf3q4rIty#Dw3lA_^v{*KhJVtPtT>Y-Rc({n&m8Sgd={pH})ZRb;!Q zG?s864;LSCu1>)=xLHXJIy1pnUnuF@4hWs3y;*V2$~VnQtksy6G~cX5vx9i+&C0J# z*GTNzDz0UO5wBXP8zAg028n-+JzU@#!U+-FIyo4d%zvYXP@K17=qkBX-&>J|(h+Qr z2kcEGl#W-u6{d8o^@bhPkq&z+$)>%>=`U}kjtS~UvPH>(x-rC}{ z`ES*Yi2qjIh;XYLXML5H7S^3mHxm66U8ox$Ib~T;#NC=k6Mv;X!n^-BnnuKb)HLX0 zeogMmWurk$h(1bBon|22%@l?yE z6a=saRykFpGMmCwBLhFy6%H{>2!?lYiHxa6<`AV3qTeGU z7Ap8yM$}BEpy~<>cGb7K@(9ulG*qM=jYsgi7P#HW-tj z_~ZP*y9r7uR17sy$;B!-Em2{b&8LaVeVUEct}xA}o?YRZO@+{GB6I;nCp4RBcI7_J z=37zDnxtegjp#7bY;d|iNeT2f_`>2aie67r$~|8=S|=+XF_q@$8VXlwj@D9yO7jC( zX{dJ{C9sC`U{1IT-Tz@UZRRaALX+EiG(sb1ceGUUMxW)k8d2r_SiDXgWCK zg@h+Vgt>!*cmIw06Y?L`AKKbjtaZm4W8r08i-k9;iSiH>&n``rmR8rw8{(;tbf)#0 zTrL>rXCFwTao$-l7B^!t_%|9&h*%()M$=w)vo~2*)?+njr6_&P?7YggArUmD=!G;Y zdB44tY`!BNDV)*Xk2>hehf=rqt1hNmPk(4JHyG_r8M^{Pi+)XQDESwScr{k4OSV(Z z`w*dDv{D)=pYSZn z-Xc`^iiuv#9h26)8X_UGi|YY)fVVS54BJl@5wjZ36>&I&g>-DvS{WH!wg=9hy|_kN z*L2V;Igm;_KN&_}w^oLkw!@QFQw^owZIq|k?x~q7-%x7Nxi*Ss+Bt{vpH=$Nl(q`L z`r|FqK5wgN=Cz9yN*RH5{e?G`M)X)ar8X;V6*(5QL+Q%*C}gCPK#z`48dKg##fw@z zq9n6iz9QGyM?h!Re3?4^209b3C>gY|t{OurkBaL2MYd-iMYi=0g*w+m;+97RpMfGV zyFF^USWKHoqo(5a%2SMfut=-X0R<~JDs=02n7yMrC`|%yT5wCjaA&lj^5>KYQ{@yo z)nmoS@EIA zJ1K0t{8A^SoF&D2B%SE2%x3T6J>JdB74H(=?;O3lC_T(L*SoQ+QqPzK2>~45+-Z;4 zx^ek#DD^EL#7}AQoJ6@!S&5>CkMlk+rA2ot^-g=l>O8alP>kK0L;*3XFO~FGa1x0- z32^fd{=@ut{q(A{bgr9{Y?&8`{!OF3)0LWzv?r7dN$Th5^Q2OP{f>J|c>=$5y1Q}& zLwoJhO1iY0zI|HxMA}8OdnnIgH|KT_Ncmor*i&hNrzd+V%e^LB;2q{4WW=jVcN*GD zsVz;WdA*cWXHQZ5>xHhs)z^9{4OMqw?g#8C86D~eGa^i}4um!~{muI;DHgS5_lNhy*rRxiJ-)OUV?>H?6-7_1lqKxL9*R67mmuUH2> zr+;gBAs%|LaVtQZoIarM+=c&n?VrgbhGlR#q9ebq$AfB_IU z7>pkcRA2-4a~v3?Jk17WgCWWZ3`)x@P&RkdL$4?f49d%|DDV%^lmEiV?gb)$0Qty< zwX#`H^!(C)DS=2__b+9oH^wNAOY;wcL7I>8dHYo*&DlGYGgPtq3q>7Nt{Z(b8gHSp zJAqdoux|t;i?eTTK1kn))7KtqyVV8QLLbGb@u5z17CxPgQQdSHAJy*-{y$uRbMs(4*G60g@gsN-+S zOVn!=ucH4bP=F-pR8Nhi-$p4tQEl#MyqobMlMbBf3{kxI7!?10IoipWOIAw}mAs?iTCZ!`HW~+`cn^&khxxjF@%OR$FXC&GK9^{7Vj&G?DxqT%HwQ?u9^v@-b9gw3JcuavQTM>r=f+)08G?# zg=pMyI0>P93r}3}7TPhd#KPpk z`dP}?2!uOjwtIaHIqX5IGuD8^R7FZs>m$xCKH?_+pEn>a`cV&Zxzurv68U%H>X^ud zH8FpVB8Ld}EPAQ2t$3Ubj0l?Wp%O&T9aK`uK356HA@pW*m0z$^UTYo{(b%7bh!90bCtApbj6-G z;rt8(7bq*RqQ?{|wXmXR6)8V>->~T4OEl<=VyCjhn4ZQ^3H-sM`pz_Np~7OC|7dWb zK3Efe@}QBc|Ku+08Z7s0Dp~Z4_c!69QI67!mHI|Y9C^j~F5br?^5l32^J1kn)`7+!C|Pir zzWRYO6=sfkiK4K%rhllU;3oE<50#G6QOA}K6)y=RdfP`z6P$N|^q|X&vBcSyD$m0| zKWwSez{SlT#?8k|m0Z&e3rWiqCD_U5aps!H#|`eKSYY;_Q6e0}m!TFcb{{Q=tz&j% zu261EQd4TVN;&B&HP(z$6GbUU%a4_gUhvgST%**JaL{2U3l;!?4nwC!I}62`qj1|! z$H7nF*I`P`Y?OWs-qSm4m6xS29WQ^1!noeHK)iOWSf?bg=VBvUr30o+j=qRL;`GpZ zr4}9+8>!vbL;b{=y!BYMaTt2N!mfi|#E*3jQ!@}Y8EQrxHTX=K&z9z8w0Z;9?<=1{ zO2C@pB5}b6F0WQ@fIxAI#AX|nJ}mz#k-vN+@8fE_m}$v$ff_^!P_ zorOY3zm8S>X~`y~4J%th_Hqx=vV^@`bN4%3Jlf2~P5mvPxpW#6H_y<tn2syNTr;taxcL{lvxQEN5iF>#_TDgbIqYHbuJnFhvnHO+8Qa^4m z(wst~v?L2Kc+gd?>KEOGUEO@&(*E=P4g1+BM=+-eVUY~St$ z2A&Y&W#vgOUQV1u!6S}(r-XP(Jq-s96E71C2p5GGj#3{ZZIK!hG|?&O0Q6vdT`%b#~yu4sB;nG)(ae@2L(>Xlsl zd{`;O&ysJHldg6$@#C0sPI-ZeovRlhIk4O({Gh~n?ex`)sq|-v!3&=#>GakQ%0af| zeIVYw^dpxwM}Fib)?I|11Xt`zk=Xucr8b^ciKqDWO1$64qIqm%d-czX%w)>XT*9>c zMTvu?D>b^Lg>hWdqOTDp{B1<9{-T^=f^Mx@_!ma}>LG3FUJ|zdIwP_7B_uk<4lJ>! zSjqK9;=`AbD6FuTgEoj7oEF-h%aB*X6zf-g(_LxR^i2i<|KC7B7-p|A!dr~@zq0pE z<1FW@(vu~Y8HrzCWr+@ErM(>V`CXK0+V7}Um};-HGTV(Z3;sZv5^kpP_dAUDW3P$# zFw+ufULCbDZGKCM3EFu#Rqan^%xxlAZLzfDPr=S^gGA0>AhGasn)a8{naSO6{(|cT zmYn4}x8%lL7qadE^|^@w$GwDuZYZ5##BIHSc{^=7{c?jFalLK|bM0%Evo_`25(e23 z@fdzv2+3pO@#JlhdO|!dz9Sw_@yD4jt6ZR-5s4X+$|UrDN&S-b$v0-^AFJiqYEo-@ z2ju(cmyFTUoJyzEOmwa!laDU?+D#UlL{+qk-Kd*^b zMG?=%{;E+}PrX&=zS7&XKAIF6$+YIRBantqH`)d2CqEczT~`8ADG^I(S- z#;M#6U1n4Vu?1dXpDi~!1$L+@UhM%>vv<78?9e6gDzihsi&vQ)Iy6D;C|Pl5#HyEi zkxj!qJ(H-0b0_Q?{vv{c?P{{Lgc{k^PJ97aYrLOtSI1$yyGD}Qn!(L5Wjkb@XpuPE z1ET9#pT-31_nz$u>5v%c@W`7>za*)x1PDtA!+FHrW?%*-b0!ZYt1~4g^EXp^ZM8OT zNT^ODkNYaOiq}JG;k8rXepO3l$Pp>ERro3$%)Uz?M{SimAh(J9nRSpK5|8hlL4xtL zFGQNXuBw|$HW@o+`E^xpG=3=(1L~n5w}T~Fm(2Ak`t!x@{qNooK#^XjYf z!NTqOD%&R*+CWV)UE(6^nUDkG>#zvnULh!PfXdTR0vacmJ{988oT75K<00|5Cq<+l z7LU_YRkp2=o~Ckt=W+2iDVJT9R?bI=Q#UGs_%z6VKFktlCJQ1tf z+XgwYQvAp7IL?D;u0GCP*l2^0EccmZFM9wlPqE?Jz^UzK+!A(aAQDd_i$)aO8YZikbR%$&^8laG7%O5y*sDl=!I1%uM-FwFh7J zi+LME>9u&Zrr#n?0w-p$PxL4kDE9VztzO+8g`v6K?x3b&(xv983S>wB9JLcf(54)9 zAtXl6j&6w&xKc1b6Fr~8G)8=V*fkNW1QTw#|(12-Q;dEa)P_G$3bqhi@S1zT%-HQ4SJlDoA|gvZm*l%smDQ% z*0B3w!CgUaVWqRNUl`;v?jzT!E0*CdG`Xum?j4isQ=I7va*Oz<2)oJlKzNMa<#Jf+qRWPqPX z40h^L#gl5I$fIH!nfN?h<<36~`N2T>Q${VN?xcwBJW1>BW?<40!P^XxwAq;i2AoON zpXQ}9pEgRNE@#p-k@T4}33WM>f_m^$&3hO$*V=_lxH4>g9J zgTB#2orrljuBU337SV@2)pkOyL)beOumEb^&7N3U`cZT*l*^~gURXZ>>)1wnKXLQ5(3F;yX}^9ff_=7fh~K zQ{Yk}-{;i!0nq&aG&(+s@)s#}BmWZ1iRThHk9nXLKBwZ8f|+hUudp>u}j{X>gWi-dpWU!iM!rSLw zQ3rs#uU=7Gut)!)DtD7Dz!f$%>?3Wc%9@ZhOnnQxFx!Ty^_WZSL!Rg`zpf^*M_l+q zUV?`#-fy{uyZrcNkKw9})D{{yehFaUJn_glmob*gM&3{An^~M#2Qe0j+J}#2{da6%S%$v~3uyOn*A0)lrRNFP+ zC;MH4#H6n^YKn52G@pu!OtyYh@ur$&)>8+r)cCO>(SBb zv-gaw4f$$&w$ZuWLN~gOuv5VqC72$1OZ9hsNIs%+-x4Eg)mT2F^tZ)`${K&~h^qSz zMilzQYm)jVhR&Etd<0#X#7B_tWIlpAPG&ZoW5#5tD6VSwcCx*|DWFripU*6-x=hyeux4gde1<0W^ z8z*s&4^s!yA2ZY?7#&x5M#4~fnc@r8PtffZg(~x<1`!`V*F*+Bd`1x;J`(^Hl$oRd zWpEPi8a~%u!$-evB!;;XZ-_)6TOrwI@&0&i7J6VRZJx!Ij@z@i(lKSW+D5`O`Fal5 zD7Vc;UmS8=pQ{GAoERbRaO@}H>tQO}JJe^ZnlyR>e+^}Af>msBqVfk()+Tz8%he~k z3;(mSHc1rmRMsZZ(fLr;jFUh?3)FM$1_|G`dROE&?yDvgK`;87iz2}meTqlMTzaiY z%@&tM7|1CMY1?YYmqn^g@`nGZz)F4o3Jj;q3)S_Q2g{4qrffMa7R%`(tl!SPkoP^B z*O`_qQrSlR45O8i57tF9J!s_WGu?&%xr+)#5zj6vG|Exu#V~)2o*J`QeTJ>-vy8-W zn%?Ha#JjfrW_#4$nbZ%s1u@6X#Djd~xgIof^||iCt`^Yd4}=AA^aEHB26xd*)XP|a z{XfL2Zg#x?p;~1M5J?vOFD9q*m#M4Fm@a9n)Q!?k$4{$NfEL0$UqfkYU~$K;R$s!( zJ$^NoDXjV%OZYEcD&=!5Wexv%N&I}YhR>@l25;3}Q)esZ9pKzK`c@+m7e5%|@D7!U z#6a6zO8Z28f!oyOq;G&k`1lhnnfY|;6F$M>*YXLraxErUkb~_7erXU3qN+J+2kNj+ zof!b|f?clH`{$|&6zX#b| zeZRY~`zuwf7hmb8_3p2f@|k*+O!@n}BLX3zaH6#3x zNMy5=!w8GX_uU3#@_h}&$ippgSj{@w7p$ z`h63TI&XD*w|j2o)9|dj?gyEMm3J{-=`QSIoK9^OANY^0?ho9ej8DV*Q%o4eI| z0T7XY8I%KQ`f7C;)!w6i0x5Zu=X6}!gYS#E9=uPLalB;=a1aL-LRn<0)#!byFW%)F z?~3-RwIQwF@)43Kh)UO}E$fWs*sgYVpK7d;VgR#aBEKyXnevsfAIjG}>bPIc!0n?k z`=JQDMT_uMe}F#0Cedoh+@Zo(;S8=%7O|^^q~y(htP!ku+S{}B%WW~OiDcf zBZA=zAFigCj$@;|D~&w>bAJ|nazN$y!c%;x_|;$pSUIQ$`2XcdWMGkA`h*Qs>mby# z-zo2)ni5dF#{%p>R&jw34H?zexYt~AP-VczR(+ZeC8;9;%JQUIJ94^U*u;U2Jt|JD z;1zeOP#MDVdw5D+wcZQ35i^V?Bc6_E@=SM=SAXL)UT69s=Ep=1s66;9H7=;oSxx?U z5TW$1)cAlERnFYxLt_T_cjm6;z4Uu4GR;9I>udo=L0i63W0LNHl7q|M-F;{nBC7Q1 z+cA^^4ykFOcXuRG=OW%pqjsUx=a3p{oyEMG^MK&l@LVXpcL=JygEk#f69b&LwXFIA z^tBNSqU!C-11ay#z!b;qui%s6ME%6qiGN08 zDpdx31VBe=*OPRvQeDbG3PX-J!tJIiwT5Zl2ehL~O$eNJ@hjY(Ifyfj`m~F5xk`-< zcOFv?!#iusYKi#4VdbQ6)W@WSH1r#_Ppur?I6vWpBC_aW$B+ejF!m&^H2S=n?#rE} zc5jU2imp|m)b<=UAQ8-Bq;DjRI;TbliOV_cYK~c7F_D&>x<;_U? z5Jyy+d|qvcRu_MIIh6LCSHr@cmw!As#T6iM8cx37sw&uR_bnqt%fD3__~ww=kA>5T zZ#fm~cWMLEBrn>!70}9$eus1*qRiS8Nh7{f>vJE|KAb;W6OXuZU1{xiC^LYnzEflU z-@YLLO1ywgRs3rTA2$gX)F@n-^U^~}uMGt5ju+GvPUDc9#>5M11JKABIVsjU<0Oa6 zCavqBN?Dq3IcZoP+7@rsh%Q z21^h%`9a+dJq766QPl5NTpc=7gJ>Jw~= zApJM>VRVTZ!zKR_YZ%S{P4&r~Hpd%Sxyh!?YAvu>Png3Yf`Xe@OUKinv%NiluD*9Y z!5yR@o9)eku7DpbU|-m+$UDEOnSe?IK1tUhP(2Qe@}eJS4~VBRK&96dsOHUn1y=xIDa36}dDI(Svp@PTc=tM-&DI~WRAGFVDOwdZztVs9OCJu#NH z?Qmgl2?z*=y=BH_$RVG797fk`#|P8m-_NzPXLSJnwmvHf2cmqu|D0)jetgD zjJlv4oCs?IUzRbN^N0F`WrZ2FBotNFuZ1C8_J_(KFAn~p+7rvCGmzh8Q!^}G@Z(Ll z8okMwT{PY5>^}~k#?fI?ukrp%aDc?5+x~&f^Xvl$DZpd0{~3r^%bUSDmA>J`oVRSc5j^=fQ^kOz_0aL{$?np+)~5* z1^gOQcQT4Xk`pnz7Ti#qn|_5I)O2TY0;Foi+R0n-Bj5H-exW?;_%d*^jDii&@;ENS@GF)T6PQjK^N%2 zEu+m3xodd}&28zTOq*}>=4Rg8TpoypH&=F56h;AexcF7*=k@JtQsx~s(==u}y?%$+ zw%`ud6+p4wQConcGLm{UjhJcElD%(@MNp`j&2iKfsBmV0w3T{k4FbirIj$;ht48G+ z{UT+G`fW0F?a>wQ3^73Du$U4n`sY00KFg|tr6 zYNNHM@hFWiH1RUH?VdmKwN(_8B-i z_>}vM`f8cABv#*kqrRSI)HlA6^37Tb>RXLRLE@kwQQ;>tbP#E=`_oyF@w`$DSt-anA0oc$jW-$=vn4d_-fD{@K z!xz+BAR1e9AFVz^Q~9n|ByEX_WT_E0E?Nr* zOb(+JzM6lH0eXNK$U=OBexR5)pgLnibxt+0&f^>cW%ahJT`0@1GLm}wX(LTDuF@$# zjVWSWn~e9@9*5qLdjk;}C-`d<*!uwOIj1V|Zh*EIugX8&38?Hqje%?FTiS<$TLIKd zrvo*nsQS=>_&X7FJ5URO(os49VA@%a1Zk9B!vw(6ev%gr2m&VSNk7Rtn)<{A#L&DT zZLtBl-wMIT8RUM4U@h7HjPAm05|$(qMIdgL4fy+0gEbaKV0Ex2q6oBjE{;b1m1uix zFrwN9=m9SYC>I1c;RkvV4~@lXe=N!0sr3Ru!QTb+%fY^WP zuf&AN!LHzAVlcqEf?D|)mcB$5lR&?on1Db9dDj!ey;(IDD!&2Lh3hsg5~&{|HP%hR zFl7V)+C>LNf~s{sXX zm=jXLL&tN*OmO#U5Q{OO_l5eTeFEUsGu1U4KJu^CH5NT#{>?-N>pzs%-%OlEXQN-J zP6tA@cObx~myL)wvuT(c*es4pc8&o=fAuzBT8{n5=Auv!<$}>nJuH1C<0VI{2<>yp zw8@{6nqLc_*>P^T;nj?z&QY2R0;gA$#vpJE^TY|3^>1;fg2fkeo)AE%`v?Tt8Xob*&-yf#(p=qQNSEX=P^n4lFSON&J9HPfGn5s;|q$ogBN zb{t)|&yJ-Lmu-`@ji!0yXM zYHDoB`K+d<2QkJ^;Og=%HdMQkPc1Fc`_>j_{5Gtm#ae%x5era+C#YjBEjs2N<2P7O zWJ62$vUQ<+q}ROo9baN`_~01+)6Fi#^rJKf2rMw1MKrfJ8&55Vw4GgkY8j+&)p_qmm)3jj!3#BHDMmE$K z?y>LPst1BB^17HpT-;D&(AfSYJ<>RmE;iJfnzqkpwb%oBghjR(Va2&Xom0?BFy&G( zRy$EeR?g$3rfN)&3%-}S0nZG1W~1^IFNe}gO|>wZlBzN6-txNDBWYDCTC?muUJu<# z)i@Y%b*8$-1P8h86ZBZ9Xxi*F-ZZ!%oK3r##+w#?Z{-F&Gn!^k=U=z;{?U=tFI{5* zsRij+xqn|u%f;itbWKKw3F`t{pch>l(XJ)F1&@Bn^d{<`p)q9NdrXQT-3VEMHUeVe zT0#VE$k3Y9zrG^@uBHURlUPH5vd0HJ#POu(HiWW&XnrLa>w~3{v zHRb7@n)399LNQ#>6#C@O8~dRRWnpMDnVHwRDeUH^S^xy6fe_yfGrE~( zk9!vE8E`O&J{>5;9$?Q*ObiU!*T_yq$-aIxx|wDR_+fnr&>0{)0|9Drna!Dxn`u7Q zxgP+V2jXvYGc16s=pxAauMqE$vk{wJ5tPzg3$v_Zoza*V4HY`SS)c66*+k?V>&n?w zR8rC$m0Vj9q6eaqt<8BQzu>3-FlXdOR|{D{o(iTLdbE|bq$rotAkk(IU+j;8#3MLj z{@^@A3oh2E1v+;qIa)xW8BagA;C-whEI{W7QXbM2?=#yh_y(gN;@_a?AR1n66x>hZXSuI}K5sB@T!Z2i-dUK~ds61%vbQJ~kU-RBpD& zs`e1J!iK3@ycEw?)~^lKEr5+IZ$o|a)=U4S5)EAm17FirEL_1^FmQ78qtz&DX7w=Y zl%;j$<&PQV0m$cB{`*-}p2f>oW%2TM9p4~_9?`WYK(tubVodq7XtU1qoYr}sxNKg> z*=l6_7m)jVW^1{~yE+?r=>qM^hOlHTS5cL&HKf>wwID1)-%vuf79V&{G#+kG{hU$$ z<%eOjZU2D{ivTo4I zK%Q14o^}t^hC?0vrHeMw{1jqiU+SX8(%C^;cRU4&rzZw$d3XvIPop2#x}!k)5N#xW zJ|4m~&C^3Luy<43D_S~~$(&cTW_U{N#-Dn3(^}%`(kogAFroZQV^JZ7{7Yk@BR2dC zYE&;e`7f;oqNd*Ym-ag*LeZ1j7O1`n+f8}{Dm{5UjHdR~Y6Nav@2ji&_B#RGW51=R*3f(FbhiBc+7rs`{_(MR z{{)5fg6;rIxnVDjdF)LPOci@>0Qt1176-Hy%_oS_DZ@=UgV5AoAhi7q+c(u8`8~A&TJWYp?Q=J^UcEu>&uNUUg5IFE#9*tmw_s~; zZ-cGoG`(G2Pig~47}U1Asio$D+OMY>Z@u$CZLz^yex9H}Pt(qaNU4GTy9Gq9CR6E4oINRA7za!<|# zY+%_sQ~GmSLd2<`zN(g8t+@%o&Rzdq`U$vZfzd5*i8s}N4UhkH#HkbhASaG4r<3d4 z)i5@;VBviG6X|Wng*rOs1Y<6IeTsg0K}(=@9fN}q!&-kqTVbj^%icA_V^OEzVWvyp z@GQYjL*2q$HMS8{_M$cjmREXTSYB^`?ydh|)!)C!j!t%^(S5ZB-s8@*QL(x&I{hz- z<72F%ujur_xxvNKKAPH3J8#-&rRg7cgNO04-~zmx_gL`9|F17O2ku&O4&1fm9QgnL zk~3|3;QwaHaT5C9EICeU|C=SpN$r2Q*K? zM$^VO4gWp8c$6`bNrEyv}1mG(lr`0sw0Di-ve?`%qaS-6ssQY+G(k+e! z&$tXE(&4ZMr?@C7Gn)dp7o;7epOwrb}dmsmS%&d?Y-Y%uki$qd;UTq`L*>mN$L%z%0YxAz@WI4!?p zO7`~=sM^fHqTVy%x`Spk6KWj-=cb*(!H0TJA*u?KaD8@u7g@cU?kVG#^Ne!01m;r7 zp4cGjz0o(tvA9rsL4sSncuhE66cq7K{mWUW57Cqvlz+TTCL$&vLB-Amxo$XpK#OMN;1tXx~Q1@)cUSi9HYaSeuCCYahe^nL}+>YpwC~ z?rNqFi4~G%eWyqiPm?+~eUE__p~edbvvj{J4n8i{YeBBbae{X(hzdd;`a z)?zc;(w3T4v)X<2^~KD02>@Gu1`3mq`2lqnb?DNGW0*~whx?{X+RVM3Qf4)q-A}*1 z$?4y8mJwJbEL<#GhR$9c9z~VwHLuu}_vPdsO&k9wBwSe@xKlKpZ}UheFlA!F@X~tX#)|mZR>FF2L3Sc ze*4tj}bwK6ILfMx}()+qkE55wX83UyoG`nq*>jU}NZTefq zR0WzCM}H!*);6O$i#oCwy{l|Q*7ptOE%xgAlzSS&J-K}6a$%iiamh8X znvSh>b`s)4>sQY@zp@Qa=g(5vMx%4FS$bu7RD&o)%PFfAZMWh7l1gU*Cp&!ehYuzD zCe0pn@~p@l1T6V|X91yQ&PbPkRaDIh5Tq%7&%;_u^ z81kKHm3TTPe#~2WmQ?Zcl=yjjD?AtoXR%d_j&+^yF!n#a#HNEi6f5>wWI(>k^cN!I ztHa{2B^<%7oWd&`f}AO3oK&5AGSuaM`Cw$|gA5?`rpRZU!Eg~0M=%1AZ#6PBb>Z>5 zGH^U$yFYj^JhQG80U#WKqPGNX;~0i3gE)oZiwqg%TBg^6C_RI)%M?a$muvA}>&;}uUSYp}f6)Tq5jAq>uD69E$ zKU%O`YYkVSnTjJ*Bk1OC$Zvom?ZL$8LfRfp54?5J2L}LleHhP;!zp{T@6l}A-5T0FV!Cp-d zVbl{ibsX_UEMnIfRte{7^c9~a=xi6=3ink;F3!o`Muphkj@+*$ zS|^`Lz#8}%Df>0HHC^1KP8b#K*Zi$NZHY$o=EtaXzm@{`y%7%0#fr)0zIQVvv5koG zykiageZ?LWdNGI81Ke?+ky;Pu5Dvh7G!&eKv#%0L(~xFeb=ksg?$QIo=1zIIK_pZb zs~*YE64$#|M{{j(`sz_!7HqF(W7!dVy+-TMnX4c7CiS3Ji+{`{*T)=uP)qiAeauNa zX#PPhm3_t-I(Wz@j($3*1z5{gi31q74+>VIE41$J-79B=T;IEPuhcsY5MM7dLoXp>ared-MLwuLCI(z%oUhE z4YEuBfx-sdL0$VFDG(^+(U-@ym(8cHHK&VtIt%k&npi)awtkw;!oL^46dzu=E_*Qk z9kMR_QT*sW&xe_B{@I)gPD1(3A?fk>a7wE=E{Rq>qqF_WilOFkN`Gc-5?wT2Jc}H* zDOvT9SnkN~>-hGRRw!Y|zU;GXyJ-oI_k5P!2oY^6&S*X0aH8q+C)BhUzNUE_vj6XV zO@{fS8@?t3I>LxU=khg0(7YG)CXN9cvjOk<6V2U}jbpctg7>oKu*Z@u**)+RxHY>C z;|sQui?7jJ|23S)o1~u{o#ti%qQrq%oY~AOD)?D@9zQL1p->k(yCADo(7G$$`sZf-m+8TLsAUvo zX;J|VDax|Pu{F&I9~5-o#qUeMaL1$-2Tzk~j1MLIuUZNxwn-3Uezpa>vm1I>ZV!c@ z?ZEEr_2|_Jd$ONny;|`;=J}{aS&gMKYOyc7EslKgxO%3~c!-yQYL=3k(0$W-~@c9?tFn9(EtjUW|eRk7REI5A}~` z!_cShN3&~S$041hvpBG)uFLYH-Zyd73IN5c7%|E_mVFC9y^d!;Y94b3-^h^_hnbYk zKh)OSoWa$rvx>oBZb?=tvQ9ji{jhoaTMyBJli8U@Gip-$sq7%MMLU&^wtRHH6d9+r8q8BZ6WTl$tUE(e2%IV(L zYEpqUD;UI!tXWGye8RcxPeDLEpRJfHf8!q{jc%XJ4sbQ+?D=e#|JU>AQ!{n;%laJ6 zIk+)vBklLk%0j0H2V^~tL7TKWYcifL1!O6B8uER1TVsYL1d8*8V&ZnD-dnN~|DCh> z?un-TkR2XtOtd4e4bFRJ+W%qiyW^uOy1#QbofLLcNCA>fs0IXr^p>5yHzHCOk)~3t z6e+PQDv3Y<36LmoP>}>gMWh5Nix40|5LA>zc@&kBNK{HFQB+jQ`<(7y-#3W8%8N%s0#%| znC(&(JAHV<9_Pzv+Tq;cwd0jq{IUcuP~bjcVvxTxF5I@%yZwwz3-dP*uALANtOQxP z1srZK18XOm*w*uA*!~RWF@P13%W%BJoo2!BBAwXF>|tuY%htgEK&6?(fI`L|?f>p? zW)_S;N`J8rR}NBqv~3XP#)7l<2#h@E>R;_4P+B;*{$?M-M`GMLbR=$|>Y%%}Q?K*( z(J&Ov&4qXSTQ1m9ktW93(v@EG;%yq{TOgIaKO&MQUbH{1Os1S-+hk?(+^2B>|77km zm6tBFqQ85+8J}QNa45GX+Fnr(&>@rhy|SE!@3l=(mOHKWZP`4o%E!($LmUDWbdl)cGix{e^9ehydAGFPUj_mCR|3l7)04K%E89PY0?C!Bp)UYHbDe zOTM;!i9apDY7*zMQ;7N@{#hD~5AC9H0cR=2ZpLX=Ga^wV+yXkL3sN0&{E8^=~2)yZG#uC;8FAV2Mxt#;y9t3)l(+er$( zv9Z?JOWns*wzqLeHx}sl-*Q7rFA$Jc6tFt}n^sCjiVK+Vp;1x5xYwDyAX|7GrK zcWh?OK=$*SSzZ4VdbO3CS!|ul_}?L}v}FSnb<`m(cSCBwML-&{1(4p#mjq;Oxe}xg zszA!^q(fTahP3*GjnhCGdbP3?Sk2x@M#H5Z-mj=TQsZKD2`ZK(h06p41LP1e6))IR`o z5!7$-9+UOgxa*I3Pt;%V9_r7~>leN!`+om>qVKbR(A#-~yIS|{qS{m2QEkIyiFV<3 z78`R}-+wE5%siAzwzC9msKs{d!hB|ZPm5Ge)DE4fZEomec1WUj0QyTgdRy+e5_H{w zWGEG@HXh?H`hC5Lk4k9#A>5evS$kzOv7c;-SYJMTUow~eldTadgzjWge*49Zepmyw z3$k*JtPAd}$_6S^3SgOHOGb%{KkLHZB=>6O_{GL6XaAySO?PMA(nw{dO(E1QIJOo& z+tn5b!QwX>UeT)-<;lNbH!`VBEt+^1`)Xg>(^ZG@nuNibNw~$<0~a|tA2QBN&MmU1 zi$7$wu(@XZin9Ui1wN82-uMx#kIB%y8;0b|FY*w01IYZFsNo#f4Qr-S?p%GV?J2&@ z<}}a7lbjy5IP;rA*_IgJ)++>$2VO3voTh45(>c7(>w@Q6CqF^g;Az&2_DHJP)0Tv) zckN*(|LIC8exOEd@+ku zdgT^L$i9>nsF-1ikTe*D7^*l-X*N1S*r7R zg_@|a?hu$!yK1$a&+ZTLDEw<#NVjbt>0n>RC<$i(Hh__j+q-mTVcyKGReW1jqUt0_MhVRqK zuOo}j--n`Z1-1`YU>EFTDfD|AwK1?O190mAe!c{Dsl?_gY#*qwX<}Oe5gv|ti9-Xx zvD91h=eIswYaKsOaJ=j*QDSHyVC+50ZslasM!Z}s5i)>`HSp6^w9xk4n20vB;dBRfVr%tM0+Ex2LoDy*3m7^Hd~T#FwgC z>|wwwqKuK)Zid`%tBb_kn^hiMGyi@eB(9EP&!NZ;sg`%gS=goP#bIE_z@6vp^CXhz?vPyILM->(!!}zH?;-I?Uo>hjkLufXW~el zFMHDXSjI*CJu)wJl*sFItI7}V@wHhh@;;S$TSVTx?jmasvQVPr;s7ZB8elmcHyQ#5 z@O4*t`l33b<~~`|_8=t6o|N4~R2^DZ*k7R>=EN=EXlO@`m3g@>qS5_p{8~Bl9f%L|$cmLFccsm$M(S zapDUf5tRKdE2P{mC_5+r3T+4h8hvoPXpr#@#SRtIU+owyhcKEZHd$6m_aI+HL?e(LYU1N z%I>6q!Rk5%9!Rd?a{BDgZTaOiU(Wf>G{rw{t0Aa*Z*~Al7FH`hVA5asgVs7|G(A92HtB`BOCRv zTa9c0x;izoQS18E$OfdVR3jVJu3wF8K)QZ4vH|Iu)W}BVYf>W{m9J8bY*f2eHL_9v zTGhx#{i{?X8`b_hYGecY-=jw6(5_02Y@ok_8rjJDV>Pl-;tFbHBkOw9$Q;JMYUF>_ z$p5O5|5YRZ4Qk}9Nzg+mAsgYOyd=+YBqj0s<$VTC6sgaGs{~y%I zrX}SRawp7?s%nv^ecOgVa?-WPIn~!9&)*`S!~TU9+39G`%=~JpO!+v9o@~J$Hl3_b zCtKhqZ3!hjx+#^0c{gn3T#(G(S4{mGmCPAhi}J0J0p9%KT-wh`(IJ<-o1>GjMs%X| z_PD-ywKe<-O#C7xka9b)8|hqY)|6~hY-SqUntkwxTIqAM<(q+oKQ?X_I%TKUmTjm$ zNluXTM<&%Ui2gOFdRUd0orgN%P7e(x%nQaRWxC7@YP-z~K7sjb+>7>RuyiZzB5b!{ zUC@X&vp-nSe8a4!|<+dT{ z%Bwi$+Ibats?w|Y(#pAZGwN-fYj0^@E?x#D>ev<>B4wVvD+nuKoUnOz#tj}E%`#j5 zskuPDZZ5FNFc&CjmMP2yPTIxwY_sM7;9)K>ws|JMxX)KvL{#<(lem_i#_Qu+dItZU zc7l`^nS+$+bVrNK(O7dAX}Iz3Nd+3K2ck+fTzp^2q~OlvOm0%JGC7l9xwLp0R+-$A z02T#wB9-y1l$*uXd3sAw*DmQ~)x8P)`{XQVAbEqbP_fVoFj zF}DIt4}*d}tupW9chxz!h{h=4MLg^XEUkg|OLBD6Z@%Lx`Bs=gtZbcmnH>R&Mo?il zfi!oao%49(tyi!k_!9h@bM2hp-`j|$IL(WB7!$PU&iIvkL0eH`b@$7S2`am@G;aA( znP(4=Ub979u`B7^ZXi9Pqw*a8czX-Y?!oQ^rivb-;cjf7*&@{aOwI?-NEBc5bIk?%t%OoD7@$ z;Ks4%yv~^nY4A_WC&-r9VIq$U+`A@oqnr3QV0q2`(F%yi9l{jI)+LiCwigxVy(wNh zTTlkJY%V_U+-UTilC!PU$E-sn#+%SBq{M z9X@XmOW?Rx*!d0fe38zfu(0M``_lw%K5D&7Jc^Hy9HP7Kp5? z?3~%*-N#4JiNTCt`NiKME}##{Iuq^?bqc#?+TlM6zMV>5fcLAqw`2yRXimPJ_e{n> zm<6QYlG)gGiTs@xu6k$RDK3$h->KgVf9HjO^ucgI3=`nHs$3#}&kL8Vw(}e3;dkkU zzjqhj-!0R9iHxV}&mtycCNJFS)=YVqeZ*Zj=hiBPkMhDRhX^t%jlxIWg{?!u@iscN z#-0cZZa)Nh%J}URH{f>So_V0c!}(VG9#lMXzV_EN3+`c4l*9}k6-~Ez7cVwya;p`* znv?F7Oy*Uj-iN{Z7Cn9+yX=|G#rxRb`OHQSq65ox>C&Z^6VGfORFo4GID$P1TkA<9 z80@M~kaZN+n-lcRD0bNkn^U9yoTN()|F7`E20@l|!=1}t*sL1Oz5(7B9%L=O_rKqU zzp#m-gAcMqeoti@1G9*^&gNq{ip659z`~Ok9*Tc^>9GPd&`|!;t9@!y3q&nmoez8?!jMAKLIum(OXZjR>s?l zVCiX8e|r`9**)x+|Z=9^sbV?6HCWnFRjg#}eCm9UwVIA`nyBP$uo51Rr&XrLA z39L15{+Sc-3T>`)%LI12;{71ROZLQ&D7x_()&&FS!Dm3r~go9hS-aCXRt?Wz^%Gu1VMQQ{1{IiXR+FW(z`l;=Q!&*_7to@Pi?$GspX8H z#DW!NhqLKq_6lci*A#Xu7Krdn_8PV}XC~v1iyodTR`1uQvMdaV7Sq^3!Ag4z2!V+4P&2A3oc0vW-ta5|6rAM#q_M)Mu@S0tBVrXLW3D_+;EK$6h z`GnH?w~nBvKY*R>t2rZ<~n}3}zgy#R@BqpR?4Xdq2pf}@RiJk*?i zTY_VvctI3LC9ku)@Qr6gan7D^u!lU~5`8^iIs$XQC2Bxpm$HXZ2M>zk*1yGidp;^M zs<>~18_A#lU&rhji*RhpAQg=Q3yWScZ z$glO1*rt8SFNuw6*MCWDK)U`*Vgu4OT@o9Wuj!K5sC<=| z#74Diy(Bj3U+X2YQU5A0iH&Oiol9Z^`rmU&%%NS?C9#2i*iMLJm%cSJvMP77KX_|o zl)xpimA=@8X+S%!27UohC{=plhPasqX{b1zPJwf^ePkgrTVTnGI;mF`RpCB#cz&01-<<(>= zEf$)}KYxZ)!n$(2|J7$mwdjLSnXOuHkv@Zx>}uX3?G;M3KYWX{m;LoyBs{hM4{Hpp zSMwk#h2HrbmHz5gQVKo#1#4XGr%7K3a;y0?iF5X6uadqL!2bMIQVL~!C3yeyr%BzZ z&)2N+RliSS^ew7^%xXPS+Arv>)+40@(12deBPCwGnvawYvg$rkI)o!NRG98ZN=>L| z8SC?peyMaA!Zuzi9mc`yl9x(#>F{B8FMqC74yk-6Ucjogokz-+L8n}WZF6Q!nHkPGR@g>`Tg_R9aZn27gYcL`Rrdh*%ZFt))m`7G~tEg zE8g}R-cSK3^M?3E(q=zA|(2b6m2SEWdciQLhLeKffiL1%k2w zdlKBvtSShKjulA`rbjt;*W0j}$_j$&`)$yxMEE3`js=jVjy)>LbnJNRQPgX=!tVnaPSkF3z1(cB$QQxmn)+s*gour(m zVTEXJk>p@?J*%AAOpYj^IU}3l!3GJS{p@ik}*k>)TSPP;4a)`!IDHNk#q=VtCB7{Lqq7nH-J5YiQ%hTwD%PzS`j{ zOMJD$R{TI<=<81AGE5-mBv9O zD?_-MhxwLYYfWV5J}@TTWI5?tx#rw;%%$p1rT9OcOX*@RWt!60!P{MMqF?$t*Y2#O z!H*d>LXqS!fv)y=%SPuXpKHuwN_hP{~i;(Xk@w3fpzXTDe_Utd)#myT+x{sa3!tlCH2@ zuU#*9>$MV#*sW($i=V!UjulB)*sag5le_g<*?fGrR=%e5`M@HQuCQ5`iz>!uT`nu~ z%^L4fzln(z30K&v3)ac4xgBQ`->Q{aRIm=riKHv+)P=I1zEc;N9BiHYUDRPexXpWx9Yv(OKjCg#3$dXmxwBStKN@U)W*cO>J1`|Z`J2SIlfhAi!{DfpBCl3Sn&sP ztL|Li-jf^36z{q<+VAWR(O>XlP$#q;-|WZ>BKpLU9i&)#)TN33@d2`sgVH*FmqJ|{ z*bm``Ev}&*h9&U#F{35|8KyM|p_Ps7jo<~MlHE7PsW!H!{eg#E_}Klq_%B@>{DpIb zQ=k4N1nC?hzPbG=)BcY{e55)RAA!I0^z?JyT*&fg`|&rAN9WJ-R#0(sd#niylvsJ? z0+m}docjdt)yf`B=4larrrDUMScU!MVnrG6j6sy={cGvr7Iqd1lLkGoF5DLjk3kFz zxi|yJpaJ@F-eMvy;#;)0oBe(H(ZHNWamj!wS9VGthCnB$*ODXIeiH}jFU3?BNPT_= zi_l9T0??BKuAfJ)fZ!tBWOh3TH1p-7G!Y$ z*DfqeK{(D;HI`yHnfoMobD!7k?N-XJWA`&%P+(>VibW)-1sKTSP;APT4nsYJK6<{a{z6dby6|xQ-;;gK8|T90`rx`m!4O6J2C_ta{hS5)FEyI1TOAGKmw+VF#0jE z>d?r>4v7IhubsrHhbwS(8m>S94U1<$+qFVK4ff2HN9h^gYW$uRYw<@Tw!P3 zb9IA`t2w6$f!1_fdNc$Vi;xjGE`4v)C51!%&PZepg!z>DkiwE(JthaJ^xh@K2r7$s z5G&el9pg=xV$^+lxiIP?MzHkWC1s4<@vTgXMA@-5uWml#!&-ZwY$IA%mq6OMGF>C6 zRL9@;Qv7W_S{EXR;JBRtrwbmlJKB?4!!KQX7g)(=2X`R{>)^_C;XI?`?06~8jvhF5 zktMj30H@0=!#V-yY+u&d1yy^i|Uz_2yeCkG2654jcH3~dvGlb(D!unGglw#5)obK zZ1=Ar1tLJ+E+A8jE_VNVGkw_(y_Rcwye}z{!V>p<*4Z9z%9q^KGvf3b19hh-&b_+y zHui&`0|JE%29&!b%DfML_J>z!OA1)o%kvzRoMMkOZI{4lT#7w}GxCuq&?AOOm}2+$ zJ0hUc<`no`pFzg}EI=eV7)&@ht^1smV6(U4koI^&Iwv7nWOQG4&Y-YZP?%IAn>!;E zHgc{mmHqvxY!*?&!M(C^R26!&d?qs8^Y=4PyxAMXa1Plkp=56mg4s9*9@1$60}mp} z0fTV?IDLcM!+&G4Nxtv|xI_Z9?2`bO2!LqneX^;?*zNua8^YL^o@{(orM!bO?ra_I z|k+&PPuN3w?R^#pn`HI^-@8(NOCZ^jpI$SRHuBoDk(qYN%?LG zkWQ!=mAehPOC{a$n%&>DK8!4%{2UV?G98FXEC3fs!1eUl#ICjSuqT32y=lrNtEC2t za)Ba1cS5^vUMhy6$aIi36~nMtr+i4Nr2KnNz-Km4MykC*jWY(sBXZOn6^P7h!`M;J z<~}BA5H%d!za4L)avf3In}o*evKrG|sSCm(OIJc+N~FCxn(zVav)^r>-`>XPL7_~7BWOKjsmA{#UK{B4yxH5 zgLuErPtWd>pGkUzL)WH|zEO-Vn$;cCFMXpvvL*|-REWfStHSX1!DIEylyr#l4wgxl z?&y`%IyX~Arn^_Bdg7cTaayKHD02*~(Hed~bB|g>d$gCmSzUDeqt}OKf{3w$N8D zVT028p!?72lrNAK&q~Ty_W|X{=wKgEE|MHB|*-v z!QS%ZWSJyF)Nrt6velO8h<4s45xwn+XqV2ya#?$qfp59Qw?g9kA(XA~#J93a4F_8( z@omuY<@J;JR(aw>;8re~hvduJ`vpEa*$>_RCe^+j-7b>UYkw+`^h+aK=QH46CkeLIY3K+1SoFXxq1clzz8iI zfC2nt0F3QD2Jn_DIVo<*roc_ZrmVD$WmMsiV3-0^3w;2^)?0J5tIi%?@LNVc?S*< zf}djC9q}2t(}SO#o;YzsE?RMygd#7>#Ti2Ed>=@DDk*s|W~96_C&ysS$OU@;%pNTJ z=Oa(ZxJT!ZsdzB<3jH$uz+iOuX{vDt8b`lO|3ng;4=?O@=%)xzNc#1^rC8D^@Bcw# zu^h4`lE#w(ti-czKCM!NpCUxt?30w&`%GlIhwNvbc%`XAT*zJtMYmX(eJ6N0MFn?) z2i;)da|w96-XyVi$tL;26QFL+Vc91EN`nqCvQKvL%)8LV#{<}xo@{(orMv?#c?27C zWEY2ieF+<+48d@ouTQr9vZ8Kw!iIqIA870lbfvU7A!X0A{6sQMr+oJiN%w8Z9R_}+RSVgMVQ4Ou80gtylAG^6A;Vr{(J+3pFy`11Ig*Y_kVgX8 zQBPKmNg{M}j$@LQavjlt;S$ktPei(vhowT+mUbRsp+e$2A@O||z)pDLJ6WX$KUs(_ zKda+waks>G$`c=KJb06ZoR+n9Q;%owM!#>Qx9`S?)h#`KkN~r`$VE2r9trSAPk_1s zh~FB_qFk0@MvlEaxOZX;}hB&Iv}S*?kzo&LDQ)lZ^{i z%JXxDU}Klg#zhY{E_!0Eko{pvm%%+NU~3}Q^mIxa!Os;U*_=l;?*~UB*TJ5nqK6?; z=?smz-yXu1=aWnxqEtGqK9E?Kmfvp=tdYLeb*|uWsq}tu^D532dL@^#DO1uR%JXwY z^8HvWPD@mYQ$?n`Q>J>NoFh<%D{PtsGsi$XO|mmxvNMZ{9>9zgxeh9OfFCTj%5fGy zLUJ?16ZBHa&5#lHK)NzfrDbnLHsCi@DlYH z1r9_KKUD~*g?f7|8ztL=JfW2vY|NKLl^bl#7i>`7(dgm%VeBPOCSI;mo*yd&y1f!z z=qr~nK{=!C;mTQosiwjf$eL#*?Ioi@JJE&Fpj{;KbA1v@DT8@(iR) zK&dn{O4Yd~EpN77po>hv)7 zmM1gIBpsp#KUr{QV5l!}eXrws+Y=YGwrIAv<+AQB1KV;JaI1HM7mZh9e8i1s(h7-x zY8YGLD#F#_xW8Ii1qMH92>cr){=#vR*HxbQ_Y3?X`LgbQfuBOhV;E#o$MF~jB8i_f z1UNYJ;7#|^cnNNeC%DtHOV&zorww-2%EntKiJub2)_D@YzDf;#%n;a01-3+|$aBv^ zrzh6QRJK@)3uPN5kjX`S_)%dRxR^{Q(!hmCa^vo7x2PZfrK|- zz{9ptAgAG$hcKL<3uBu-nb=aLJU?V`CQQ?c#44D$)q{(zo>-UbSPLbT+{2^TeA?mF?{DA$ui|>}_JSu6i6S zd<9PzU_m7DYYG83eVg1yJ3Jv9;IGYqR-Cu=}<(dFkuK zm$F}A|ug&Vw72y+-V2NhUWy0Bu&!?!fC#idj7llBJkQmGH!`J}yR zn=F6!wN8z%FxkK|v|oakcTf0BN-)Tlw{{E{QCpt0NAnA*eNWosyKoE$4w~SjlXpy4b#kd^Q*DqcEFfaDTWe8d>k}ll*9XwrC#>HOVL`!)Sos&(p*40G%6`JL+1TQbq0PipjdlG_Q zxkxt8pu!3E*w*@e+P9ZA&_3Lkp+Op(%rc-P+VndK5SMN>p9ZaKw^56y?J-cH-1;xuHx{WfPmLvYCC;PkQNI53K?H25VzGHI0AD8s~VqwQUTfL%64F?V~Vqg~N zt$spex(ECTPqd}7)lW(wrLxucJcIj!pDc9#8Qd3$GzZ-B3Bbkrh#&l{9PyQ&0MAH1 zevkmq7<~L7_@IxU#fo;uf?(txN|Q5H$~$nH5y;9Vve2I{;eyyi?B3HTCj~S0XIXFB zdt$g`OvFq*MJp$w=|z%*ot2=@>U0OEOS*scqRcbgGjw~GAE*;(YNfO<3 zPjm?7&inm&S-C=>qb-xr?`3p+68c>vIT!*!b9no8c-91O=9j_HEuTtK@ zaGC)Z%6x$=@g)x?Uh+hWmpP*GUY0-#45Tj$qyevpWb@b5dn$&o$aT=TsgU!ROKw(7 zmE64Q2^fK90hmrqg;Z2*KwT(Vu}%XkUs+hLCo6f93Q^v{@+2!TBtg3+F7jYyktfD- zot4EBNV$P@v1H{n$;x_Crh^rc3rn==U}djlW$1Lt%Ilth&q`Kur$Z(>E1=Sf>FDKk z^c6q_h$IKY8HP7JZq#`%w|ia!d&?6Tf}HoX$6J<3BC~{jD+cQ_L1fa~lE}5u>}}7s zSze`vgDscXaEHs=W`)RekJS~PSn~wdkd+cfp0uhRIs;6sqO2KULL@m@z5r{=-XW!; zV>2Wdt3BbZm0Y|d;jJ~ec!zTVsc0z@s!By`WH~MsrDa`7Dq4aHY;v}cit_O-r6TBh zaIez9PbzsRcqXKxJe+TIYFtv$dI?_F_N;ej>r&DFEi`r}q$2!In+d6iW2h<>Z4mVh zsc3^<-?gf~TZKypdsjBm64^wF8(np!RJ75vsSsWf9Uiht0@(%Bkc!65f}~NfgR*Do zQW2Ca7>aJGsPScj;|AVDXJiv?cQujJSw$#pvxM)`TW$8H;ZNGF0b4}6`BfS}8*-7Z zrrLU06P<=0%|k9Kln|lI+BzH5Zr?$rvxQvr8z2P;M)(;?ESej3@Iz87_yM~=+uqa{ zZm_m{Q<^h2idJUZH!D}?I#&%XcmUAY85QTvWLh-?^N!&5VJvf1T(4>pb`W ziu2s%|2oh8*Lm(0oafHl7gT-cxklk?InOl;SIc>>QTVT%=N@_EDxBx$Ki{6N#d)r? z$Z5ZzC>d1vuHC9UL1pjSTf#eT$-$J%yyGs|X#YFCR*4$A zT}BOkvl>xDO|bMg+{&h$N#TB2o4;=3PIvdbZab;$mqA0{tY*;Amw0DC^B;Q;WxEU* z`sQ^64E5f%5nbf8)%oj)p(b2h8=hjpMSW_q-_AV^r|h?bl{XLVxAXUOr3dWY;i{tx znSa_6InUcxUwEd4U#ymG;7s zDeG+s-a`?dJZ)fh40Ty=<9?7UeG$&R7iE{(pYY>ue0O=dK>ARg)7H$p{B6O>?E>xv z&^O!PRujN;{cW!U__V|JbpX(%+}_!=bk(JvkOe!3%I&=Psd77~rB4mpHn3B?$+n3; z39{MH<~4(D{ct&&u-P^Pf1M7tb;e(5N9~vCtEM2RO6*Wm#XB_Oxcw&1 z{Hw>|^L{SvIc_gUaO*USEdf!V`)so{5T0}o z7c9l6?6q3%vjm%haC-7$(WCHR3;y3OuTfB~MvpeX9UZJ(l9^~S7dWF&+ea(PKIi00 z`+dIcXJlHKzj<)&gaBUFgmZ}1WDTsHXkuH>o0+$Ha4Hx7%x@!ZAX_;7VOW>MV;_3!d9Yv8?B53@%7>-I2f0J=I4 zvqr7!_b_Wfx=IhTMz!nrFl#`%eh;$-q-*jpYgE1_53@$)tMo8yRJ&FWvqt@E^)PGH zze*3YMz#Nrhgk#q-{WDHL%S*uvj+MrgdsJu{x}S&QQ`_=NR6!P2}8R)@1=IrLUlx1{d^}KXm$9t{ebsasn}WDfDtE~G zXMSVb3W$I1H+D9x?g^yUKdiaRV;O=4V>QrT?6YgOZzJ{&3#|F=^PI!hj@ju}eb`e&J ze;va9>k#%I>kzi=^Q#C$Y80-PLs+A5wH(44g{$ch_D%{ItggF8H?Wi6xZDlwkvG~@ z2}8P~`fgy?lt`cZe-Vb1-e{QAk2|0p7TzQROM~O2<>t$6!m|18=bYK%f_Q=J_7hJK zR)4BC@D+~$ct}$2)RH}FLKk5JR0*!%ht+)hPNdR#&{wWt|ilV%N71FC3JeBmq@p-LkuJ=Q-I>J-KI z=6GcQ!MR-wSD56!&@Ga(7kUr$UF`22Fp(VZ-hvQQErWZK^^`fpx&LnUX|7QV^7Cs> z)9zIVg7va{)eoT4Q6BP(bQa#H#_{~*xTFXwrRSok#sg|15*CfB8%bk2)v8J9j}7&s zyu=`1y7K|m!n3xti=-1zH;fN5F>!foRS=MB_*Ws3wCw@)29!|xq4EQVgW}0LLal*> zl1IHG$u>e{mfVBPiSoPbOmHM^k>5qf8bs20`JFLHfeV&%Fd6#HQa`YUa1Fwdu=+QI zll8*b4rKl@z~aNaf<7Qizw~f;YOB?hN=F^Cku7kW5A`0U^6;c3uZ@hN$499#H=eBY zYwYFK#>*d}Ccm%ryTQw=t(OZo+W_bb2B=27Zk9vvWNw0fKW zE5DkVpLsAnJX-A>a&eM{Yl>x(nWZI}-o{WUm@8jMw=LU_?g_F7S0D<3S~#;OUX zZ3=xn>w&019$FJ>F7p6#Jgr3e@JLUzsLmniKp(3aPZ8tP0jBi7m=otXpuwBu3r4x}bLrgp=Rn0x7uiHRg;+*bL`I>kkpFkdR?L$(w1Eu6CVr`%3+9#=nA zcGK_$Y9uxPzJ6VL`w4ShTK|Nqn&zw_W#@0TsB}PI)#cw=gT6f&kb33(Uzn2 zLuu+$>Ijr`Rz9WHR07l2d;(W-UP0wFG&m`WtWT@!Igo@+eZ%Sa(`s+i3xQPm;8?`V zyX`)I8vKkpglDfFe|s%w@iS^I#Z~zCXVo8pETdK+RLEljHEPoPp-}3xP%ThQG^}G* ztsw4+jeC0XF%O}f)S22LIrdBIcm6tln4}zfgj)Sn#jCG}d$z;sYWee;WT#9j5wN*twt*SojKX+J7SaIO||odKW?i3yeL$(8H-iMiRW9$ zfjQ^^w4OFpj8ClRe0(}y6N_HLTjs8`X|9@qq`$6|@ba|V=pGWK7riY|Bm^XJOgU!` z*Q2cYYOHBqFl8*dDS`^-V_(A>eCf1^dr6=zt{2pv@&a3i!mIstK*OenfV3gLHk$Q{ zG07ehOq$r*}Urt z|KZuL&dTL#JRj(mm8w%L2V?PvdnI^n)zyK97^Dx7`&X-H;a`8`jQbL4Ps1!fGS^6I zM_b=fC+OqlYYLrtpC8p-3z+~?z*_YK(+?I(8#6f`f98yt+=X6Vr|vcVuF&}P>NEZ; zi~Ots<`UX7r#y;+oa#+H$L3TM`R~0>%;%lX6;AaR#WLMH(Kj_QAjD+#wFX*)AjhnG zS1nTBpvO0=)`0gv@HT&-FeP{Oor)4e8#byllsBB(CQNY@d7?nQ;PZwb6n91a5z2Yy zX0@-MtU+bpHHe~fo7Dg#Az|+5T2AX0btXS|Pb`U#aqirzBIqXqE+9B+Lo3xu9TY@Q z^s>~X>>@Q1=~(Gg2PKfr(a)cXiy(A92!s8gNE#Ls(v{M?O}c@LcUx#tt|gA@{a7=c zdOpyk2EE$A6hvFz=nG-jYQo;)-GIh-^s7N*&jkepDUD67*hTzP(&nxXj8v5yy=pO~ zE136TyME`JR}Xxx6<-nfg7jy`&u*_#2|Olv^eBjR{2`uiD&Kqjpl-dJhT9H@2k&21 zqF3Ivifp&`trg^}Z&2RmdnhG8HX2XES5ZlS-#QK30g}0m=@$G%xBxO~iJ8Q6$ zUgq0qRgKiTf!^%HJr<_mPxJgXk)gg!I7x-fHpkyQfr>AdMTA*>nQ)Pc#Gh6rFcZq= zJvvsT`-v?QLDb($U?E5!y7qX~{b+;6iTKaUs#uk#UO|Zv0B=e3tDO*NMXC=rB77^7 zP38{>6RrLj8K419`CX1yttMY9E=j@3sCt1YFIt5Of2$~ZQK8~S84+Zi7~lD$ zD2f)Ek6)`-Tl9_i;l9T>h(!3BU7%RK?AB>-Civ;Ng_l+kiHcS~T(^Qw^IK6MB9KaM zdm+5OPh)^%Vcj_F#;EQh+I1X&b~holYm^C+c-c*X4QbW!xEj>Fu?feHt#Ll|&{Jvz z{b&8py-ax2BRtybF7Yzf3~ykX;V+$u>u-4UHy3Vc6%Tb5`Ny}XQ#&xGdr?AUix?_s zJT#C?SqX<)i!)?Mn`zW#r&`mLzmt0JR1;7xZ6_rCpAQ?S4PSQZFs<6Dj`lf+!%}Xa z0dWe};akjggZ%Zr=D~dL+NIuud0w;&2Z#Q|rxIB|ifs-(8_<;{dO-6z|l@Cb&05-Fm*#AE2lTPtT&N?!54_s&Hc{n2#E#_A^c1 z_UD3mI^OQEyo>dDB!nz{OTipigIgnBK6|8|>4Jrnec#1+Z&=-$nt#?{kyOg;`U~c^ zbLL9V3FeAj%z>oJaZt)gk_2xciSrh#lXThf3nYoLhToFsJsEYz?Nc8yDTACZex>$T zU{7`IYxN=g+_hgN{QR_E9fn)C{s+L#e%g9Kor9l#2Sws14YerReNg?}r#yfK(AF2i zBK<-_0$K4IVg-J6=)fWDlf`Ra@mqM1&`bL_q5me zw^%B}SP)<60Zxn*q+#y~afi9zzJ{J{tVNmlZ>ieBFMCD+J9pH%rBuyTltDD)8+D=g zAb6P`_6^p<@WWWn2GOF!Fyk0RwsLhEELT1#R|nyz-nZC=SJBPis#awRJ@BnaERu=k zGST-tG|p@NjAPj z1CN5iDKz0I1js40_$bcX2dT|5!Dsd{^yO-*Jf?0_-lw(4)du+a>Nu_u(W#AT_1a$| zau0TBu2_6UR|t-1Sg_`2^z4%rYSPGineHgLnrsN)$wtpMxttCCxx|Qs5Pc{#6?}ug z;1h1XdYn*4g4*>b)SEfA&2ke8Z-jMLvtTXE)%e15vc%K}jo(}}{zMV32aT`Cny)6+ z!jG~+weCx~YU5u&CFx5U9WkTQ-4P#Es=GK*eArGKcmJ#Z++hxC`8?%=FQMOt~#S~lfU7ewFKy> zE9+{p&`~?BKdGN7F8`V3Cd!U`-WNJ>u_H>4*;1f6;zK3h{~Ya$pbc<&T)84R z9Hsas;{5Svbt~3pTJx(~0gKhV-_&og{MOR6_EhjYhRS}Lu4#2C{2a91`ymu+^(f+k znj9j<>2T|f)(G=Psyrta@8hW``uKVENffO-&sT6~-wSF74&T~Mi(fULV=L60fVxB^+e6)dBd1m@(d`;ahe}4DT#G2Zcuc;woO&#p3i8Xb& zpXOduqut|{PwQwJAFNsX$M954YuyolHMbe*re7axdU&-XeJs$>Q(D z8s#bzn<|m?T#(ii92Ey?V$p3(#XV17y5?T8JvSQ{760$>! znpzlkIJtC(gjR0_6aMp!y+Ze%kE)liU&an6J?Ud%ojK6W!p8%(I0`gt%d4!e(&fFr zx|W$WE?4O*cS!YUlWVv>;B|lasOqAPIuDiuzW-pIlygUE-e4_}KDTJ;xV#w_5 z;V`X>DSs8EM`#g^@>jJUmF(qZH)mSS44MdLBt&OUo}73q5~CkO8Vw28Y6tE0bIos> z9IoB39H!&p+KX2WY*U1`tAmaR7|f4df;k{Fu?JEEE={dMAZ?D+>a{lrMMlUa^+7pO zE(6LF1uxE+T3Sm#@BVP6sZ459E7-LO`QXNCd>t*eVb%TPBgBX?dwGdwwuZ57(%xO% zZspg}s%|M3Y$+x8LAbWm)oObWgG+uEhQO||_iMq}fBMwbI*0Pvxd)>2&JZgv{YqV} zneWG0wamllle$=)U7HYL6UujPj?+$gL&jf`h&h1eU#YKg8UK;`8kg~d8)#g{AJae^ zg}?SS(7230rlClLjDJG;mI@kab&Me>nJ~eia zN67gNoaY*AxaS>2PbP_dD!PgG8vcTmkITX)+Vl8^s2@S&nre?=X)bRHo(@v#jbi^A zaidrXrr#(MkIBT4W+Jg!GmXppQ<{mrsX+ex*bIBqDc{5{?VwMJw01C`boOnI#Srb2 z*Fx@1@waPn!Bypb`l*GOpntQJKQ38L&}qr;wPIH?*qTDelQk~ohqV;D(HkuVcm6lw zXElwuN!x^|()C+ujq%g76*i@B4Jn_Nw-TFD?xKBBxNtexN^>3FDq2-t!>cJQUug}$ zqOcsQO9rkrd}3=iQ(IeWqd{tuHrQ=Isv+V}ZzDu}No!abyF|(lfs}u`6~ux6j+9TV zt!(_kZQXRf+*Z3!**UKrwwj&vL_0_}Q>dh!7)w92)2a&Ye27F<72Fd-m>%6EXkM}w z(_gIb5MusbL7qNv@VofIy#*4&fO9;F^q|5 zC7|v9zce4hifCU)ExC#mKT;Rqu_nISN%MGRqYLW?I%!%JVVyrvYt~sagmpZ_2|@Ic zvQAorun}CVJ(Ef&6i8a+I+c$n9Y~V=TbGU5`k3Bm&^2< zd7`uIX6%Tl4}qG?&0D*P^$1dQ1U-JMkgtQO2*Nf+cL&IWG^4wip1MR`vxgWkkf`}G zmD58@^pkQlRd(0HX?G7T0K@7(J;d77w5Qg_Z?yv9H=1<(_ht>d05A zT9BYmI)Ck{b>pklKTd+?>lNf@zFw{CBi5^K4#E2}{(qZqc&@3hQ-<(N7jJXVq?CTz7*M*RpIoPOsW|9%sfhrkRm930 zX#8!Ob)twfg}J0_PX2Du*dW(fR-uEaDUZc6`Y~19t|f`tgwsr&{@Mc|e{z5AN&H;s zFV?RC1H^EIsNCfrFC~9ytYA<-{O<(hmz8~#e1|p_Kkwe5wd`z2mO>B>xq={inY=kU zvAZE%QsX~aT9xiip%9@gIs!U z$fa^~_+@f)_?6`5a9wUbI7I9GcgW4@_g%KSLvC()C6T!o*J$7!{2*GYx7Vp@0pJxbDwoIQ!KgW z-cEavnD^Ouom`gPOo{eIC8*kaeH|Y|y*`~ELSbWYLg>i?b2DDW;JUB^`q0{wH8qRB&2E0mDkCUh8_7u+)*-b>KPOi zMY(BO1oq=aT`W;FJ18g-K1{U$%Xc67vKW@XIhb4Op|CG~7!=fqZhS}!@L!N&g`wUj z)afCtHUsFchqRd3b1O@{aOGLyF!uS1CUqsQY;GiHND|!P*rH|5Z zJZ<{077)Ubg&4?)J*+kHeRUo`8Kpgpljq{RFm4wJB0^}9?LaMMC1oexq|r+uK^F3U zL>p=10e3q*Ur(sx^ee|h3RxJq1@A>{fP@Z#P}2UMS6_C z%kGO1;ZNKbJ-(s#grG^&tvn{FFDsjd^JB|K%6nAyxKsDA=>&5$+*6K{j@QG4mIa6m!50ZEpQwWhLm>SXjmM1V_a>gXb<7f5reP){$wWgd` zlOIGEu6`)_n<|-Ol4p7E&8wO_it^L7pM8fU;Ho^ga#tdhPlXwp1|zTH$fyX4c}}zV zEc0RBxkbN3!N}9Z6*xJQap59EuIeXLAJ}o^416Ji;uG5j_m^Q;?`6L7)aqXyg^4c{ z76*nh$In&OtuQ(9oE8=6Qaw}N_}?NZukUjfv#()1fZKjAmYz%YNm^5AqsC3ro`qS| z$w}HGzH@erlP(5;MR@DdU(O6N{MXpO9XxKx@ z$gDUV^qQh|FoDYFr$865f_|E!byVOEIuobdAv7^lvqLW3mI;Av86C~khPLl%1WDEJ z3@~(sW)>!QJz2CQTG!emOQ>h90oEGW%QB{Fu@L(fOx0`votFnQzMrN7+d)d6Cg2a8 zCg8_;0ulFS0=|Bx4wRe$zPKFI;h&zy;X8w-Lkj>m3O=kMB|IM+j#08^Ax5IsKqNMz zj3K2Fbn1ENaC_srE9cpVqH~A+)LiLQ{|4TORxj{zgCs%s0}DJta)UicPntCYSbEZ1 zGqA|?1(K$elUyU5@;{IBrRItG7BXdNQDLX&`myhEm-|5-{*n>JZlt2X=C!Evy$1s@ zLYfIoig~^XS9o%RLf+2z zWi?pAs=D%(XJW%zbm(A@5DI>-Wq>k<9ElBU`@is|;FTPGKNHsf8S7Iz)5N2x5p*cA z;j?t)1t%o4Ql;0++8laiB>*F`t>c%O zRd)^A>zx`CtB0+7nBTE0Xozmui#X&64oG#N{$Z;AHz4mMYhllgxuCr)sZtC$8c zQoh<8PMelsUth)dbws^>2j#OsAsOR)=k%_eMb?m$I zD|}f4Rz4?GnB!ZX+6yD+SG6F0^GztosD*Il7`P?5Vd!eU1H)J{+9U?%*q@P-!eyQ8o+w)5OKwA%i^ZRO@_1Go$zMh5osmQ?zM zcNkgU)C#IOD0aR2w+{-Rcl^EmC?~ru+%R_z3!<$dzQL6KeR2(|{fhSKCG8A9NGFzP z{i@Zv`@Rz*6#dPuYk>W)wC>pje|zi7DTf%=Lfn$ktEFTzRYqx#)k9QYHti6gnom2^ zM}AZ`=42|hSm}@Dx_85R)TdRCh!ANl2^&amElFvudL&ryX8P5zT!XPE_%Uf0$-iJ1 zIlOB_t8xzwzqN0S3C57azmLZ9Ht6n9%2}?(C=+N{ovzLBlU=84oHCvkv6x8ZHnOaM zP<|UFn8Om3$H;Pb+wfYugs~+z3N*m`bK}aKxi_`u>(Sk9W0l7#r!GzoHO!Baqg%tV zWSx{5O)sz1dYI0xlWieGhRe42T9?v9+7(Q#5F=cOt>t=MJ+661(u{@>O@!1cW0zkp z@gj~nZ${^v`C1xm=$*6P(|lk7>x^5Y-Nh|oD|cvxkkdM^!|vWQcl8gA6uebBs!hNt zB4oW#jV0{T-a)~kPAtZUoO_(uA+P|P-=Nt;a`p$X7VLwvVBt@y=tE>3q*EVib^MRL zEQEJ@^<6pJZ~RDWh9JKs`?a>H9KTVo9OPF~L=DlxXu|Y{QG`Vj(pD2PoqwG|}J_@l$hzKcA}o5tXu{8s&5PI3>d8&&`K}YD zs6s7Mtjh_-Jnag5W1+q`7U+9pL6y3n>vcui73waRnKcL_+o&AN<2wmDIaTb95T#RG~3nr%|L`fyT)?jjc_o-A(B_fOIziB~1zdBIyeCPp_4- zL&aJtcT}u(x9w~lw@AA}-TiB&cF5+F>N=jzXcQCbc|7$l*wKnAH#B$vr?s3XZ;qnz z?>4vvJFNS-8B4YsV)))Gj+ql~h>1t*xR04E;=8o@sMrYYE;q)=uG}z^a;V^#>S=yL_0}Tn8;IH zPfWy18swWl3!)Q~%&oC~vq>YOsdG?j0^K>;91!}&-T?NQ5Bqc>o`692jCV2dIPMnJ zjfo24ua_$_{h@q-9Y>8+aj?mWjlsi{pj00~${t=0-;P14jRlasZXoRW;}O(-iaDs> z7~@R~UUppahy|b*K39i>p4Vg&hwLl~N?q!stfi;SscZ1l%#!*pVuT#Ar1nx~IopP% z-k>Pcox{UZ{e57TI5H|V89%Q?rS=P(?hgySKs>Mtum)R$pptc*0Y31Xze2U5c+u!)oeypxnBQk1W-+AXz^1cPsWSfC>!|Lpw@gvd}$v6ZAL z?wF>={cM`#Yep*9m)c5K!R6oENxRIe1%P4tQ{iDK+a7K&eE?t;M+fP4Fz_h*mq+tE zNFC7@pLYNQ7QY1j@!G=*$NJXoD2Ev)W!ou%FeKuo0HBh3)z(zo|W)9}kSQo55~ z5vBg{F8@rFMjH;82nv^Q+R#^eOgKP^_euRwciJ6NSNuafJyT*_zK{PC+aVyY_x(}} z+{(P4zff|&)JW*-F1%AJ5ez??C~1^AnnuXdi>R^VgQ%*lBHfFsCMnWrlx|a{`|)w{ zL;U0O521B>&}o(bYUX4`;jDW{ANRS3r7$M{Z*WNyP|~CUQfC_7UAhM)B@X08q~66p z8g`e&lr0nQk{SY&0ii!pWQ}X(hjPSe&qTOWGbDgX_N36HNs;v6BNEr>XsRpnXmqdy zJ|s7zl9jJCB*)9L$z&0yW|Q?%sa3?>eP*u5azJzC-@&IY{>|P;A-yDK2!S;QalXAI z239bqm((tzShtr%<28%+_UbR`+g?&1(|AENY9>LSg^E|zr zd9U;i4E29#2hU?2JQKD2Cw)7Q^=%Fc`7^q8%as3{-TJPlTlwS-disx_yzgq0ck9sq zc=Epcr%&GRC;#8<YdPkhC%1o4~M!44yJd%zMoZCF4s60#02v&UN|PK^U*2he5&6PMP6 zM*@H#L4~pANpxsb&my|`_OBJVGZQEo|9XK6-Lk-ag81&`fPb;TZ)Qq!b=Bvcy6Q7_ zb7Jyus6N?iP<=kMIgzP8iv|bQQhmBZ{ptP9i5BCqB!3F&@ItiFA3@p~v#|kAg|Q>C z2lSrjL&6}=mnJr*{E|dwd|6nMSSMcEta(Z_=72O|XqH-}NfL_g& zf?%ASkSiracUtvB;xBclcfv74)1B6(fkXR-p@xc%FT@&NjHTW|L!yj<(4bm6y^u*I z{i7^2GZk=BJFfe!*ki1r z-`A`AH8c9fCj|!;vDbT0YK4(0fU8o?(MCVp3+{{p31Kk+dx~>l$axHVB*Z%w3JXYl zN3t8s#oy;Ol`qhG33LjtF-xT2qhV7j4KwRrr1DC`w%< z`P0tDlFfR)%-{upI$cKT^QF6)VC75V66qegGGFqG?;+||b=^#jW@a(^-O&9&^jg3P z^P{Uvq*xlc078GyBr^o}w8!EA9>(ffy8!iklIzRCuKaMu*^x{87HIVZX!VR*DETGy z5OEq}VWc(n1bONafuZtqC32Z8lj_kCyp8iluvVwANQy#J4{6LF=r*b7Aw5Tek`CY4@ZBHaN}yDpVdW5+JlN{IxOnfkR2*VRjC z{8C5=W9j%(USii}yu>(fiA=YhyG%;Ae013)1^_+d`(;u~9Ge;~mzoES|It_c2su~J znr#_0uy1^n$s~R|onBoo4FjO&+2zu6u%#zb*KxNc(C8J?ot#Anr9ZehoQ|!KhU2B) zMN${5W^5^7PzcQ0l3OIzPkKa5);h@JnSqCzIfTE5xmRGYF&GLSHHBmBqxq>X0>gt@ zUUFvMmO|Z&C0mQb#fgZHu-%POqC10HVjX5ZCn>CyytRD9HQy$RyBH|NgkmYtLYKnC zF#ISgmYVoJhff<);p@S6n*Bh0B&}FI*O#m-agxD|c_}ZP+Dk2LG24<^zZ?dUWeEq?_)0^1*sP`smong9xj<1(uJe9sgz2cfi{aU5w`GzE{gOv8pz;NnQ zA`SCa?pYC_(<|&i?NYXw@MFF!Yg01#n^PC$BRXWVqqSODIZJe z7^|aDD&{qo>HLh5a7-lIs_`b;@G+L*?`qX`ir00IVLUXODMmYO`bg?dleS81c@&qh zlQb){cq=c{SO#rNtur!R60r{rJJcJF1h2|2_oXr@8iEQ=`itj$#I;`-u=*5tMyGe% zE`=mMF9NKEt?WkKM+y?kw%oc5`o=6?KS4vbOQ}L835q>xMc;5r+1Qt@h$TUFqNsBDh%h?7L+Xde782Kv=o}36 z1HPg_&jjbpir_lo`I#}PLNaxHt|7yHDi5yHkWTNE*mda90kQ7TT~LC+#+trcO0CcQ z+jQD}V;v?hP>cqhW4677=LSm4pAeqE`SoPMmp1K|67ccS-Pq0hQ((E2=*!;mrHrLm zm~JnZp2X87|W_U8|$Y10OvT4O#*dKe#{eVIm3jHR5cN#S%fdV9bX zo~I=66R3|cqj**$J4EwNV}h#%NL86M>;NBcCfI{LwBA4cpcDjplQ_N950I49=gPOoB`@_h`(RIhI*QGNMeJvfp)9c=Tc-~L+@t|^FvoQ z!aVx&kkpeia@fO2mrtd-=nUPx&AZ{&>WrdAtTWiWDgIRFqiGEv!9278$z&L-y{PA5 zsXeGj;f(lePHn6kwjYKHu?O||OmgBeoYg$7j*Lj0?zCETbHoH}>pjHVC}&@JB-KA6 zwc~^7vzo!wQX5Q}N2DOf^J1&oBZP^JHG|2$K7z77g~ol?5y=WJjvUdsXj8)l4LZuZ zqb=`_K)#Q00@`Uka{4H5@AkCwu=ElQJ;r}^;C+$b>2M2yiHRL+n1TS%$=mjwYB-}7 z$N86?HMV*mms<1QIO6Gzoa0hmaHB_7-Ksaf-V&v8bMd$oQWtZ>gNvZOjLD&6AZW9r z)JJ2oTcz~4sTbl+IfKC;^0-sZ;fFpNi}6*Gzo`c>5Ezej>8>j2Au#n3RlU{-u(OAx z6gq`BaO>mz;l43gaoL=ql+UF=+}o<(!?0tZZ9_kYfQKXV=h7X)Yz=@E@{=Yrqdbk12M!T?xN89bL{z>uOtYLXkT%+MztWa zGTV5|^#78V+4f7Rj%D<5USR%|dzuNcaW}b;`-&C31Y2LRf(oY%jD+9iUVev(0jO^; zWsI60d82!UcnR*5iC;+vv6pfu%AxJI`_?*ZrG1;#k}09BRPv9nEj09Nth_xbZ|c|4 zRQS zX~jv&FM8@lUoli13*k@m8THe*H#)x?I`O<~hyBgsd!xf($`WHI$5|#E4q)z}l+$oB z*FdCw1G#SXYjoE)(%-PDLeUS1xpj$mP~f-HBIBWJEvaXKoC-QP?&{TVA=zR}ybMwI zdVuW4b(P&7NxK5&v3TeG(^7+|Q}BbxmVfL!?Rkd2EpU0iA{bI^bJ0c810MG4?GIR_5)&RyG?G-Zl9N$fOqDu>0W+b z>SGAmQn}aXT9}VdvX3YXPcl;m{mmXP&cod#I9>&7Fn9sXcqg(~kxRJi_fow&1)diS z+?W=if#7*w$^2e&j9Q0Rv|MGm-mBHP5`%C;7K_+bFuPjHuB_~8A-f7;S0(I<8O1my z{7SEf%K%zEUPCGb9QG8=Z;${IXJmf_cj84U+GN;LN$r1<9EqGGlb0h)Esh|w`A|jS z5Iep3lN6+}#@^Iev)stq8Wi@(AHkYMtj(Ic?a$Hy0fWwZMQX#+u#NmjY7{+uMY0;E zA@pKaS73WzfjMO~1ip_6=^n=P(yNjqPVYuR??z)SrYZDM97?WT zm4ZEeDd-FvZ)CV4ykR(Xye0*!|1GX5`3o}e!rey&8BhW+I2z@y!T|Shqg;nM@ck#C?(R;$a)__-%1{4`YZIgD4_ccDYtwFe zVbZ9V**;V9N*!Y(DACe`+rW>sEE6Y=FnO!F>{3fC5I|6FokE?ajB3r+HReL{54$We z1cZ_Zxd;dk!z1NmLQvIFUvZBhuFH+b8R@}jnF$s;EZnV*M+dQ?4Bajz()-b}4Pw&n zXgL<^ws5d64tAasQZITSMz%t3HP;-I0QRP->6pNV!;pSfN~XgxGCS;4F6kRZU7zk7 zOOdg1I)nv(8hQG7U78dtGbr0(Qj4~9Dwe-`ektCv#mP~4D~PWCP?q5DF9tJ7%GTGN z9tVPcqj66Dc+1A2ehKnae1?F%LLmE}B`+ ziyxL9blo8jzzc;_9Z^)!O;&L~b%e|#_wv)^Nk*{5FM%DHhDJns{gCpR<8RW z=k|IP6q8Ua{a3ghQ~1Bm?VR7=w{G-pu^x8%i&4C8{Qo$opDz6UoNA+Z+j!w0l+sC# z$8->98$>HJyaBAae7p@VM)y+oY(sOH-AbP|YGyZ_Ay^~|p9|@+w;`Q}BwziNNnduE zsz&}VPx^N!{;SjA$GS7`LvJLH{t)7_Nnju z>Fxe=?tiJ>7Z(2Mv>#gVU!r|o!Jkh1tO?pW{2z~*viv`t_UzaGOSEU_{pqw%(RYOZ zxZPLJ`O|5isju(9hjzjmIoo|VHBPYrd4z5P+;M)5GUkiOPk)8JPs~Q?$Y>#+Tj%67{(%zKYK$gnL zD!JJvJZ|S}Zrda%F!4BXiY!{Uec=a)~)Z^4hGxP(MBK0d#G^f?%pzk86LIY`KZhCttW&7qn#J2QPh>R=Nqh{<>_rsqdHN z790UjX3Gp>xH2|?3%o17UaC;R>Vy~?CjMBL7Usx5Ana1ie$XD|&{b?uvR49|U7jnH z(W7t6tqj+Lsm0@wk<*{=z)`Z(iu)!6@qm2|;G#F3d0S?Xtu-Dw{~W8`qUixV5E*(t zjo-kWuxKVzz%^6mRJnthwdcBADw!&i@BB}EfLi>}G`SV*m^str0s5VbxWg=#W(Ha_ zYf(5YnkGlmvBfPdG+?@%Anc=&(`B9t=AG$sOVcMYqK!j?M3{}i92|tR8p?DEI;;6v zTbQ%Os85>(_YLE^hQ~ah#U2C9Z$i{tL=I={VY|kxsVQg~cSoOV#bNh~sfNq*B)^Ho zQzK`{ifOhWLb-4O3HvH%$W0+qoPYK12&(>gltSG~zidLbLtzMnpDCX~zb1{pW~b_J zp9)}Ix_p-WlBp~ZqdILFFcvz`mYcAy&2E(tNuy@Vyl)vA%8h-S_TcVXeQVZj<-f_K z?uzAMQtw-Q>Sgj5cp}^Yz_{<7Tf=pBuD5TS&Eb8UF-IN{zp4`~59_B1EL%#7GmBOsZ$okyH|b zYWFdTRq=2W+523;C|~iWPX3+z->Q>;lYcuOV_rNMFvrZ;^wmeNhSJbnIV6l*v7sko zpfLK--=8n{K=%vniy~;4GU*O-)CFGEo`*X*rs`1wPbjGM!;GcM9lr7%(ZUm|_HWl?wPtCMj$XnAOW1RH7VTdo_lQ3j?FvCQH=csigxuWvKE4NGv}@M#P!Z}4VAmgfo{t4n2fJkN&*e*irn9=qBnEDI6> zZ%017*OtjG^sHu4?j6fOCdw?;Qm1uxcUd7j*vV!RV)=D|0iMNoVIL>5WPX5zdzyj8z}%lr2`lA(ri*sCo#Z$8De4Yx z`|=p31c$%vT4IuBQZjj>u&@)o?(l3Yo~g$@C6J@b_HiPuX!J!Con9&T0@FfpRwPYW zEr&ZiEDK(i1#x4(#7NJFTQxGrvAENR^Agn;#Ye(9Rdpr3#}JPv8!P?9=Jxf_;R9X&>FcOa7A<0Kr-n` zOV>bi{4MQSBPW_ybE5N$%_dk_{nyGN@t|0DjPX*eImUouYPA-hena=K#R-(Hu0{09 zT3&SFTA4X*8Q}|4S}MnPzE#Uko$hJbg&*)MZizIB8c2Q_FORiftk!neGQMkPr$KJHanoB>nVD0&qB^{}(2-Q)misi`W33-KPgy4iq0w{K=`EAYTc+Ku z$XrOCmbr98$r^tDA+4oD*30!+@91u)-rnIZr=lNvr`LMfam$v^p6MySa!YN>HN4T2 zUdkJ2ly6?oDc`wXr@YaxQ=U7+Q*zlywM*s@S7N0`dDjgZ>?2 zW|pV?qK|8ruR)Jidns?GQGRX%r~JwWKG4M{E&;52t?cXPV;k*2B<)h#xLS^(&hNt* zcx_53QY@suFW0kih-a)l2HW-k42c$$HU}ZWMeoT0t+v7S0ZWrO|H~MM1#6jYYXCEk z!z|v+$FGBrUmza)KP?`_+R2|M``WOsy(ibN$8Om!2%bDJx+9HA?0 z;hV6aEZ_?Y6%2pEPK!6mA(#OhHpy{(ZRooY=&UVw)Qh87y$Ae}bV7Bcv zX|vq2rH5MH)`nVrAzlZP*bP0wo+ew+6GuLf~HnadMUe94hGkGr7&Cf z1XO^WbW4s`ul8_!iF5p-nGe40lveO?1Woxsj{SEzuIKL=dppQcBFBgA)G6n~l#R)q z)U!mcM-P5j(=bneSko{wKJ+v|c})W}GH+#~^d3qomF<+UMfOJvG}o0pow?59+|U9Q8PpWTk5LpcTP!1Kmi}M;d zXSYJCT1o|5Y%r84lc9i)EDY78_Tlw^-G$w^;64Pm7hUXD#+3 zrtpAmyqQ*QtKCe<5B486Q$x>`cwoC6e`C`yrnYa#G3kZ|NzvNk#I4)nxgESM3U^?x z?Pja%H&pR;A3L4efd)TLAv<}i+_qD0S~HVQ>oaM@PCk>y@6;RUENh@hqYs>4x9pS~ z!)yQSPWfx|w}~jWnm;q_+fCo?l1CbL=TL)kIXURO*5x(;$6cU;-Ey>H=XTn#8>aOO z^!aZ2cEhQ+*o!G~m=zavG%m0F=qrBdBaYusL(2L4)63=72EuY!j??r7`l(z_WIto~ z@Ta%$fh>HAp523o^C@o+tc+Xfy*(iF6n&-L46Wcdn^*9g_gBbG6Xu)5YkIZbZSlHB zvl$Cbq4w$yyjmBpX6eq{-d9I!Ilb{Jo13F)xZ}E=QufL*mNRzTcnxqFAqHg3-75#y zU%iBlAwL{BPA=x7Nf*Dy@G`_1+Mvwd%Lk=VXxc>tsei0 z{I%s9*6QQ5r-s$#C=6366=L4`{d5}*|sOXHX{!~uWmXKN0?G0FtuYW3s0&61l zupDlwW?eH|@0u=$(KSbwdAcT>Uukh~CNWp*ngXqBh8&g~)P(>z=jKt6r@f|$#Cg0+ z;)80-nRNWHoFJY|6!UNRlnF9o?h4P+vaY!Huqe<9UC8TZ4NxHP{mojaH6SD(2uvGj zz-MwiA1UwLs^UeTX%)}?WyR}?JQXipS-awSTE#`)isxw+Q``~095gM))bX|F*v1>=i;qn>poo_dblP|sqmfXsLK zA*stzxj{Yj+>)E?S;}8?glqG6DHu(`1kOE*&GlWHe^hp2AFMtqC)e@rgUj_IylHi9 zQw((e>mj0h*fIGi{2T?5hJP+0nDDaIOoJ=sMg|PEs#ER5X>q08Scig)pl>T>x8ZmU zAUN-}yOCU?hk<{ZZfzAwEiPLvRPRg7_1V=8eyuc2}H} zXPIuIsVwK#pYwVzW&g&*g}?Ri(3D$$$yxoCXBw-MYkl}M{d650dEa-3D*{jgpB0pT zhVNo%m!LE?RL9WIf^r*FHYo;$`;K)=;Ca@o4xX$>{VywK4zynJf)QTyZ`c+3%AkCP zji%J7OcPGI?=vYDffZILU+qG9zREJg`55Y9R$@@%^-lev-83sh@qV?Ly-#B;%3wUH zN!;F^h7Ee$>h9~Od}M%YY1!tFlDEYjHOI zS{s`(+HfI;HrNz~8zTnZ7e!4&6$iUlSbD`y)|}g0Q0nY~?WinNdB?D984U_k8k!cG z0LC49E)i+di^7!khAY+Xp+70_35IH4LgM!b>KvieH%zt?XM4nDh549QJPH7s&DwQR zV&e#!*|TvhWjFBm3pCcmPEqN%^`Vf=InlshPm+!3k*t0~xRJS;SA|TeN6W7$%xO-n z*EpQApIqD%D&cH{y8MsQi;keo)A3CCSz9kUEz=gog1T$zMWO!8hylvyGRlZ;_luzP ze?bd++*h3ok4UA^%aMje8r;3pzllU@%V=u@14BbtSh|Kqx`47oAZ2;6ND+)5%_8d~ zLBGQm#_0c-07+v79gehjvBjF-Vo+m@4KYEPi}5EmPC_oJO>Ybdq@YAhl>rpG7rE{o zpU1VQZq^5FhTTzA71SURo!MbHl{AX57~4V9z+r!SIgr7=Ca@h|oAESk*?7PFZQJ4m z8x4KS0q`S-(!;p#TpEQuiolhWBqasM8m0(NKbaCv!xAR?(u+xo-MV$0MGp-(iJQmK z%p~P*h)8FW6z1!h_V}v^n@d*Sz^(1ce3G@Rt2`j|m{u}MOVhBtE}!OAb(H~F>&1GC z618is28hj|viE4$J`JHi&3L$*J-=W?L%~GudP-ds`B^>X?+82(()0nIz;hU}bVV17 zGB2vDM9`D(FHiEl=l%N186e} zJ?k4zjb}P+RCIkoZ1CmL2wN6+Zqe}0)P_pahJ$akXuy92Ug zU}!r#Ef@;9`|y1f`(7^;@hEnh{8LZ=Fca4jgAR@qkAR%$e8H~)G@Ek{rCX!S8cIC3 zj4*CyUNiwyU?iPwq{MQfVrQo{6tJK+R+?~jZJZQlCcUq*k|KOSuQyg42tD={>(KDV zleEy|#yUp{aOVBO4kKB#$s2SN7NH02iLAb4FK3OK@YZu^{ifrnnZ+dDZ4Aiz%qs4Q zi<**{bI9_mFqdOMP%(dCqyb^uMoxb|3@4{4 zU9gEGKv@SD&#r1cf{M1?5ktq?D-0>`R)sD-`v(*X@4x>(rDOhxLW@rSo0Pi$(OHQ# z7>aa|q(VyGt*LD6Pg z69Y0#7n?#N<3yfz+8aq$Gf0v1CdWT0fkK{r!E8Rl(%kf>9CJ_;9JM!^gQ8>kt#prB zwB|b?hqCX2v;-+SerUx*XQC<95)=jyQDJJ+s8}6DRF7b+`5HMBc&)vsHZ_}hqJ-Yl z&u1r-<1xjL9?yF(ltz`>{5&ZXFxxQIf@?k>`>7LvvHQ&u}^J=F*u9(d;v~Rn9c_5j}{et`qQ+%oLTF`U$j>>ch+QPpnO@PQaH~`(EBhczOt82ak8a(e79@H*snDEnbdNnb8W|;PV zuc%lZ5x&mN%mK}nf2UMGnT>oB9W#!aY>51{Lb~ybW&t5SaD6!s<0P zbASe14<$fDD)tLPx{tLsGjxBpU^J1AV6O+c*EG>;%#x>+dS*SXQRr6I9R}*W)fN@2 zr!~^@qX&dOHKvy2g51h86{=Z7@+sIF)(e>I!xd; zhEBMe$FJJqY9D{v3RflkDiv2(_*FAp9RYlA8$%;po#gkJRJ)X4IdD~kA=}0PQBln0 zR}3g~9KW*T>U&;?je%@t^UEMyRr3N_2C|*}o(Wf#Ysu!eIjQd;WvsS1#?bXy3I4T0 zvk>%l2kl8r_oruOC){q>bA;v(Rx%(l`3+H?!1kz1Ovup^K?Oq;4#8iB1iwGzCdB?y zcB+2;M3^wmT|QLt6%0RwQF{4?2tO$q0itkbqKu$12|=0$NKd9+XSl+WY3oTNewPQB zpXO`gagNf1?C_~RF}AGAzuvBqz+J$KhASP+AG!URqg(ZG`+YW5@{x8QJ)G+c2|CT`Xwg8H4b-6|1OZQ5>f-0~B>iJ;CrUqfrk3(CVD z;%v2ip?brM2*_1!`r2vt3rZMTPWMUh=;nXZt;|n{^3c=lpvO zG2{QPM?VdU$}-+xHcH~fb%2@;wfKnj;S!b@L3Kwc?Evax0n|s; zZEfuI{0PO)e>c>A7miT6B3DM$2&E+kSHvsINuj^{+AE4x5YAHYNC>>I3)J(FDT=y{ z#N_EigGVZNT5F}JV%Scb*`pbBdZdzuHxfqO_y&tY88(W)F=v$0vA#|zw9F$t8H+UNVtam63beiMzBWn;5QH=2pQXeHvdmQs`N1M~<^ahob5+%t^D0frQtksNS?KE> z!l`oh!yVuq7M$+Ygjh76H%lFk$ya5r@p-c_pSOWkX6EyjRb}QrZ|SFP&6wBPXU&=3 zsXn-Ff)HP;jE3RLxvu0K8=RHu6$)!Y^36!eeLx0SY;bFwN`IHm$ukA z{mmRZoqj_h+!`}Z86-@n^W&7phU$G3KOUWT&fR;w(oPU^Y5WBI>`CuWP+pAh<;knA zry_%Cz=x&o@?pzaalxVl8ZuGwE*)kukg6^Ww@-KU4xrqL3d_r`D+?t#-liHF1zOar-$Eq26nJELA_PueaadAIG>=wZ(@SxObrmP9;Y5}DnFXf8sViI zO2zBHLVA=*N}8c)^|XrQcv?D1@e3&8Sn+rvOnYI-!;1sy2%g+k0p)~NjkdtS45qnK z@=v@%Rm~DsfTG|=(8v&^JDd6It4hIYN}a4UfHuf1Mr!DKLnbRW!AL7)~@@%EaU8NQ={wDgkyOPLXN*8s3s)oL@U(%<^ zR%NTHUXD&*;xFjyMIYuU&l~U(h%urZ-x$ajO zq_3Iq(&ykvV+35iRZ4AULTt^XjG0h*^rTm2Dp~Nzx6tqxr$^EQtrkU5$}B7qQ0+QD z52x<46b6syPsOEY8&lWgBQ3OameL!Kug+2!iclaGZ&u;-d@wqhM$T3k`cV+O6-DpN zR-*CVd$W~9^C1J)7%PR&P{RFu#TCnZ#rKxc<=G1JeXxij`~jurDg*4N%tIvE%lWuJri7l)R~iT_ zX?DIc8qJkZpv;8l_PPS4x#8?yI*I@By9^#l-|kr{xhhO#{-w7SDz7sC(n79r{Gt%5 z|FiV+J2>}mrHr}CRlwd4n5P(7$2|J3lFkZU`>vA03e~qBEs->qUu~OVgbiceTmMQn5u(Qkf3f4v|48w%A zH&!rThq;YGWh+?La>bhj(*j(-2Cx#tmPOnJ5=p!o37EBAB>TLc{yEj-azeO8BV90N3QD>i018L9N2lf#>A? z_?Ikc`49X=4eW_C>kwG>Zwqc|-%)0<(u8wabsU(N%0O@#x)MFugPN~Y7#KnNN~N=v zP4(9d;+XF+kFoXVu7rv`?=)BUu2kv-esw%R-^;gC>4PI9* zctERika&P{goDwvaSi0oNpxwA@;9{TfVI3~UsH zv^PzP6^~G{8%BZm=b!SU?rufKcSrT_^gS5g9jp0ng`1as{1@+3*1S`1opLuuaTQe^ z{0`dqbxITb`keoAm#wF_cailB*5ff<=$ZGFXDxfS?!YO~hlW-A z1JvW}R5OsGy80ufMuxC6oDw#|><1fQ;nT1IKClt`>K-Iq2M*@tjY=ETV$9Eap&s=1 zGxuVrNxY1$st2uDTdvtxU@MHEPj^;E)6gV?8BUhU6VyAnD>L-AKG-E*)pXi_5LQ9NgC-t+Y{+%%arBrqN1|UR#A(6 zN<-`f&;kHT3>`9bpVALH)oSwcx+Mx-M?Rn#|(im z^mwlbdUHSItg{q!Kq&>myALQMP+$<{C%zKN)D}#Pwn8hw_bOd)G3B7r1l!5Kk|Y}9 zPfZEw;%_C1_5g!6|}+IE5<@#Zvqc zC5-kTQ8EqZ{OP`iu%dP!6-iH4 zD(6{I^;uC-R92}VwxmiK!-}$ft`+6{TseiJ(%%0untFVpY%p&N1B;C*}8$|jVtWhMxHZ69B-Rn_(+WKn0w&2$}@stT{Z1Gh1FsOT{*=>=KQ1%shH%=Pb&{# zJQ%1js(B<8o>myKB0mFVHMSqX=-9Yod=O=@$-z#mQFu49b6b5L(i^_`#Zd`N`OIA-ha8Vfo(Mb9M zyJ0WN`T?^?AHz2BhA6#?ANUv!(+0%vI-uHa8GTv%fa=w}Xk*x>pC-BHg^yvYM`dM- zby$<=A3s7|V8a)J-@G3c2KaR5N4^qAQSl2nE7iHA_@S$!xrY^{&d)Sckr?9V?r{k% zVfcRQ|4UyOioU9R2M3??Ic;#Li!cRF@ApDy`r9?dqe5Xx5g5?=mTM62ZU`G>PoP4n z+z!ny(i+r+4aU>Jq~}6t@O8xx*%>@1NiDVvYF>f1!<%*&@n3p|T#rM|osOEY z!U92!z=8r%xR#L!`U7n*46waO6@m)YjQg~p_7S{FC9Oq{@ACiG0x6N(BAAAb?GSAV zw$%!zOoeL@bdEO$Q@&_YS*qU~dH+w{g%~Gr7P`Y=xDY_~{M0A#KVM9%Cq%jD`Kf(< zA--P@R&TeSI^hd(Q!M#H%PZO4sy2g1h_1`g^t6sJQ4dkW#(m-oO`Z?Mx%s$5dFDKJ5SO7_|$0A`i!?FW_JAST&v9og1qb7zaSt zG5m-rA}~w??Y9lW8lH0m3d~pI)Ok>kCC965(YYsH9f9>_PrMq#w7lX*b9`8s*raBQ z>kT>q$G;*Fp4W9$rmJr1-Fp7{*(*%cLYZ`3wQd-yQS(3*Hl>crRbdP3s2%tc@^!KM zWF7S-28x)Gh@N1}N~TeK>un7Uw>VL4cKgI4#Poa2KDx>)Of&mHvnPmI-rl&)L#-oJ zOJl%vf6Q4Y(V;SDolvnQT@O~<#I|BQ<5N~0eD#)n&#S}pR@BRiE?MeO{d_^oixi#&mz-1Clp~yG5!XTk!sY@zM^kB^8wADF>dQiRpa|~n!Z5@qe|argK2AH z6~V+*G3{cwdvX&sPY@LbM+nkDsHYixTf8hUpyubJK;CY)fx81A3{WJ23Mv_V{y?47oY!3(^{yvJLbfC z6k@vjyPt-k&vZOEU;0wP^9>WIAWdyXVyapfTe^Ar;S|iGRK#IJn=CyJ1P2{g9xhUT zNYm0aiuR?d?IO;yN`Y3ZRmy6wxSU8yX{s2HTK%o#6q z*OqEq%y=7;a$92Q{J&mhZf5n)=Ir>7;Vb0++Pplwl2*$UV+CAE7Q~Pi2)D9tRUY&T| zBW>e_F;PCv;m+A_BbgsQxWVjekg&ovJ zUS_nW^fF`3ujmmEb;+~mt`fVq*gTJTI7t)Y{i|df9v+Bg8p4wT>f%dUM7j+{xnJ>Di5p2c! zsjJ!<`v#oJbV_7xrZh4UL=HnbK| z1Ta4RL+vy`RQ<7BC2Nu%J~Yu-QH_MUV~(gYpYJ`Qnu&kux2q{w7)RaC*0a%6k%5Hp zWp}D|FzRXei1rb57}%%>DO2sO3adD=2__!xwD&jfaQU-}+(c z-)2q`;OXFXO}e?%vZ7l*9KOLd1(8I*{^7a>zwxm8o!@x4Fz;6%P7!9_`WcU4n0D)D z!d>bVsL5(becJt8hWd~oxZQgmQL_c%ead)D-Hv}%qBDY`=0mI*w;!HKuL9Qhan;W} zZa;Th+Vr^kcSH7m_qh`oU50}F?g7>65g~C5o{HJ{gB6)Cy*7OV;h&|GAUoj~KW0A- zcuH-6$?(u()nQop9gSS9E)-s&^rzLIQT1KVV08AS-b>YS_?34?jiLBK>YKP8wM^~j zrN=S2hMw}Xx1y)@E$GqKFO43L^1(ZY9actM`7lo0&SH(Yv&Eda(&6eA;UIPU9%AF- zRcc>IeZp#W0y`2%P{q%15bu2v)3z@xcQ_zpMZBm6V7ipAR&T;(%DN+Es(aiTHNjwb za~&;otFkbe&bcAyZ>NBDYR~wUu^w*@?HJ*(>)0USwrP}6i52;cb?S$hx82vP7qQKY z8zASvEo1qSXj=ZV$^e#BDW|bu^u~E+KyQAsqW;KR! zGYY-mpN5W7n+y9XZxqCyAKbe~aVg%tDNBX6U?F8Z>U+~8kJRt+Wzp-{ z!TKYgkJ=l*0=KHo@T=WcwHt4Nae;aZEFa5TK!<1WxJ!U!>QYTG~2H6 z{F_EJe81Y*p93MVlo&Vys|%n28Mi}yjI)~UVfE4u&Z;i@2YRfWzht!@4zwyuHZo)< z@9~m}yvJKm@#-Iux_gk5=^kI%#rwMSP2ShH>D)|u(%HbDyLE9|LU;2{-!zF+kGxz% zoX|i_MqhxXa&!7I5> zAMUK5^t|_|aLX}sijSFkl)G0AK|?Oxt2Ra!h_}?Srd~)qck^gD_Ll08rr7j}3fonF zR<~%3i|n2QEL5~hwFj4J)(-|yUIwF%K0+E$uYD@Zd9n=>+;_Jj>EAwe2nsp2PwkGO zw1b8Rzly|C`_&Zu+Nu4je99Rau*+KH)t74v@+6R!Sa4w(-B9fsnLclt7z8&wUehKLJq1=n%=dF z`$+U_6~QR06QcEzS)3IJH=X@HR1_5p$z(bjZms*sLDg4)GF^Dd>445VWd{6-bKJu} zRgW2jPu;zbu*3hSR60jxDK#pNvGX8_d8&k#IYt$^=ff#CPmRE8eVi)ZtL#tJp{Vuh zakUDoO7YpoQRFDVcK87Vcr`Za%ApUO?^jn!~8%w6#aHeF$pwzF>f6L;1zAK$REZn|M--BfF5-Sq!pX9aP!ch)0+ z=*|j!1-7%U{cC6aYiIpyXZ>qu{cC4s!tihGtjBM;vmV!X*5iNP&ibYMmpg0X7ixdO zFcVoTA5rb@x4(o=L)gr=*LX_(8k*qEY>$1)drd$7vdj|uTj+htSWg)`{!raTb-$EpJC~N z?;yhVBz{`eNPC(>EYoG(|s4zlR_2ST?c7L)=2vBd-eJMhQonR_Yw67{l6*yT6KMgt|Qb> z*}vgeZ`DycAr8l1)z2kMSGXU#sur4{5JVo-BREj|^-2t-{Q{1SoeWMmIl3P-I1K{A zC;JF*?Gp7FOuek(_Mm&ToL zT`9`FZO#Te#o()MmICmT9L-|X$?9w&45UF;XCe@w-?Tcpy(Yi&oe$G}4g>fmhumsaC1tp=N{e`z(?g7}wKp9F9?bUfkNB+Zm>IwnYgZuo%WdN$0tAU9WFA0H38u-y%1TfhK)45L0ILp{mW@d>( z#%gUps#6f{aNpJ0nQAbc_N^^dmei6eOa4fy(zxe*3+j1F&AmaaEcq?5vP2UrOa5@N z(nH%*zmzLa{+HxRf<5G6%1(FYd!3v#458tz?)o<|go^q-awj~Pa;#<+JvV&)y(~U1 zJ03A28io*H;V~{Ky=z#wpNXNm3btXCKGeZpOR|NrFuH#UP$=3MV5@-?YUuX8*9otp zni>V82w0X;W!8G7CXCSQ3&%EXwgNN0x;fURz62>??3ghU3 zG0s7zcZ_fV%Xs3M2s%E-*$K{|@vq}F-qStdb!WWb`#Bk*pja~2**D;0b}1y85H?dZ z)*0b;yx~k@ewnwAb4tOlPYV!RiQ5;k%pCX9)N#&c!eA;L=Zs66#ygvajJafjx2KLM6BtXAci&}+ z;2CMSv**NePjz9Gb?qlaV!|DBXLS}LeCW)0=N-JrF5V(LPjEK%-B@LZBj?}=5X4UB zhB0bs$^=aiE3{v*8*GE9WP&r9lNe2f>&&qFO>j02U3mdsPvYDKK$1rQoC*HA>2WZP zJ1083!F6K7L}$F^#8C@1EkkT@dC{XpWNwFO2MGj|L!e z4>5oER|1?5XXT)0VZi(z()QsTX9QX`U4SETWXc2P;rzNs~3?TI@ z65expP@3Gq0hx@4+&M=nw=9O8_ zJ3_BcH6tZ-#bhnhjS58xf{`K5=F^4a#*!!}z_5$@5ilV4To-@`madsFY-tMCzdD_?=pNBPMB3bjDX;^c*(?898ET3d{+$I{4{tsGVNl9WK!Hi=R4yJ!b11Nh0ZvCFNj^* z4Ip;o0Akl&O7;mB#D9)rm-ahQ?4}=aW|8thPb+<}67zi*jXLUl!u{GRr^_I`?cTk{ zIW__G0mv?%hVOGG(VvnZozQr{IoJxllT+J#ijXI=$_NTdV?^}X{+F3p3|9vi{*UEdN&}7$_3X` zU3(@4c~sg+O%tT0rokiw#?nV-_{d)g@L@{?5?`>m6bbp0_!7f?z=Ple{;JW{)XH6& zab_3rfenHG1{Z^Pu+aH?;Q4me;Hr;B#BOvsnyviUeAUOt=W3u2!)|)V`^$k}Z+U;& z@N4wPG|=dZ#)mH(U7bL=aO8Qoxa?}=9~>+O^7A`$q6#FTU-wA5Xms_DXRPSpAP9x3 z&C12IG}Po`Z~&7{u1;{*vQqhizOjM9S_C1BS$2PCa=k1>tS>dE_<&gl+`jxf_|(O} z;!=PZyV3yQB=+nSP8~Y7xC<>PN-snsK>!xxc~S(8dg4A`Iy=KqC(u`S&SNuTs0Ez& z$sbml2*+GoX`OJ&jEV`N-4>T$FqQa!aHkgjX0h;E7#8O)Q(7bc zQeh91<=m-wO*ye+7FU*MG`&5B65AUZ0b1y(6k6%$Vt{%TaSl8^L`lb6+wt@K`kg8~ z^Bu4+%}%q@ka$O9I`8jlCR9+Vsg2#ZdUFdZZ5)wGnXRq_(a1A98*6gRL(_k9Sjjig zH6C8NSxa1iGENBV?fx#%C9|l!_Q9@wYz?xyUQC4KqJvD;_)GdVGNeMa<0n?Hq`@c!(?BP`!|@hPe6|GMBp3ZLSUmIPDbXG>q~O)RHh_ zXDr3f&_EqonHhmtmdeSrFU*yW=5G-0!ouW!G8`if6itbA%`r_Bu>Xj6P7HV75#<^x zu-^s}>LrBJwrE$TFwyObam5($_G5AA>WP$90;uNmajvg%eJI|Qg?|s!alMDqBNJTr z;op!17xPS8l;Da_JOC(~8zxtT9+qWs*lh>Qlof4PN?5c=cx@bf|B_v!;o5DWq_yZP#NzoO+g8=(7f{2Id2?D9Vr0VxA4B z*oLmZfzGUkoX({UT`WsxmG&#B5&tDN;?D+YzY4WqI~%!r2c2IMAbtp)-Z}xmEsYwx z>P9~Afd>xtxHKB!y-693v2bKkUSk)_7-kmjRMpb;_h3D5Au|5>Vy)`d#MKdNRU~C} zOADti?OYA~`5wxtFKOZ$gNM>jpXE$?oa%2jg>|okMEIJ&{moKtr_?$AjX>f`w2uqiP z&a`!<(Xtd?X;KZ{fgJgZ(ak*m+qwSX&$D`Aed$4?n!A`!U_H8ib{=rDTe}kdb@>zz zgIl*=pqEXxav`xRF^d# z?C1%&yzFQRxY#~4FxAEUWt(v>0yzpHCpo2t5$d1Dd27zO2=qd=AYT^i2WoK}f1Fyw zOrVzQim?tDZS;vhhaKd7xcoNPedZ+$%c&)6M>{39bR}^Hw|W@7t0iYp&vtc71~+L8 zHsKkt5HyPTaSR`Ds$;=;Ic>`YFvjW8mYmaeoKt@dM~rP41+83npf5Ub?r30Z&P+#* zwWZoGxDV_7)DUlW)>!JohaW4UX&VnqUA-*DL})lI*gDw++2-MGdmHRQ&r@|9mpzDk zH1qz-G zTxlLRRfcW>H&qV@iS%lF7jte+zZM%#i7i|)0o!XFP~UHlLi*929bD^$p6+WMTqBrC z`X8NK8}PGrXYFTk7gsT#!F#BEXIGMYTvyiv?6ohtxt8Iz9MLtJ{j}eKHGCFLzr$6| z*8ctUrsQfxbMAD-;qLl7UFBHd$4gifXVDqSRe@idWfU}vVio@ETgBxxh9Xc?!qNlznesZ?{YOYjWdW}(a`R$)>Ltq>uvVR*WOnWXl4)B zWiwm2knt#K*5Ytl)|1!uVlTesSNC#d`C=FT)`!x|x`aob#JL_*v3lihtmF4Pj4YdF zZwD1G9vVe!dtBP z*Brcm3lz>I{#2`sbo|mbcHK#zyN7$D?lq&7N&H#+1dbU4`no!q*&LgFoC^E8<~sJr zidSkJn|b{XD@+LN++t$h)Qob^t)WzO~^jS*B0HGE(#{;hJ7+6SHoi=r2IHf%3Vy-S(i@ryw#e*((YAt-w)edh=L1LW7m4KA^ z|Hymq_$sQcZ=9K&lH{bE)RRVX5_(Ca3qmp|f>RC&9Yi3A3J3x!b|4fH5h0;u0Rkb4 zfC>T^^-u&71x0%3NDGK`Nuo5V?|1K+lLYkM_dfS|?)%)|=f@w+oXO1Id#&BpUgf)< zlHpIjpKkP)lRT{sHA%TuYRteu&K2}Iu=B;iw%#U5&-jFh$LR(k|76F`s8VdEG^6rk zV=#lN;-_`0E3wA@uvKPP_SHW# zN#;DzsyUS(SG4L+lVq;`3CE_W#_(0(Q)qlg1AEHVLq6m$K=5SZrZI=E_pKbCAr+~p z^qGPJAjkET!)VuwgMDd8KiLO_c=A&HljFq5T4l_e1xADZ(hJKo+w=cSh$o{Jb$h%t zfNXu_zz{uiRTXM5&TD4LOn*2$OMVRF38|{e4{Sg}@cwcwD$9~txW>oED75#N6Y!HI zox+eKxj!F)p9nN|!UjG@Ytn}P{0rot;?Iuvmy_`Y@>%nr;a`2|pq9_bHXMYWcm`)> z2>X2p$a|s8Z1gNP?w+*%S$PXQy~aL=F^-M$%jYrfEqUJH>I%lyP`W)(u7}pv8U&d; zhk6adW&jl0L2@%xvl@v&`~$*h&j)fKRUa%D2sdccV7a9w$BF{JqQdbgAmjy3Zr>O9 zCvJfX2BwG5vKQpqC}9mUnN36AU3vjqrA7^h$P6QB9i?ugaCg=aIf%9R<)QK(wD|EC zA!_%OHqz8#vV*q2CO=0VhRKhi^;3r7B!Jeths$*YKrfse!Ao<#BsbBU@*QP9*C>pJ zy(G)1W!+0S1VL@{lKcZ2y!K@r;d1Ee%bc>FukgR+ydpn}=50f|D*v7#v}l^#)_1!; zGMTWPJW@s!j$0im2eJnCew8;c@im!61O4qa`CBw<OY$P2Q-0w>*tH zK!3a}ccTSw$v&X@AU*Yp97FkFrSBoVCZ-@b`4(^FlDFlSR?gKU=-LPkiHlwV6GBFD zxxD=--ssVzc%zRAG`uT#x_FwL?t8ql(bY%uMzGXsy`Dq&KS@AY1JEYdpbJ~hyFZTKb})~XFMM& zsT1S@pzAz6Im)2R??MG#NWFM!XUlL37>to)A1`~8^JUpeUhl}c=#p9Q@GjZ&jywPw z%*#e)Hp(0&*YN$dq7WJ~5vm$Zx_pa?-PG;SAJ!F<+Hq}M&Q^q8D4Jh<^ zk5f4HJ>E;1lcDlJFO7a5y=3JB{|0ibZN<93X$l@`bZ!bKC*}h_KE{5)hw<&ok-q{B z&Ymi_z!+LPRc82tQPX&LWKP535+~qkauzOS(^#{}KSxd$=Z&Q{Ib4Dqo+Bp!3wTD3 zTodZ^H92yO^=l?iP86x=ow86W&5>(>!grziz*MT2D<|XEB>mSg{6dNOxiSkC9UuWgUlDB8bQ4B?6_6#`|5mD1=L|scb?Vces07Q#4gUXL4 zh0@g-a-BbwHd8NcrcqiosIT9ish3tXvQhhddxjub-DhWlAD}Jsetid>2tCjGfkW=~ z&Eu<4(Bpl%(l~ct5VLk$Eg4dnSV74?&o6DtzZ|BM{A}dnr zhjKr}cp7fKmGA57P%F+s7RsF~*Y(k1|GZE@$%pdu__D)1{-ptQQTZiDx?t)^nECK! zI31gZbsdMSo(NI%o{!T?Cz@KlK@5$VFW2&4y^L8@_LndtS65m!UyiHuP6{2+BAL+wbULJL03?C7NUk4nZJQZ8k+k&lXwIg07J*GerOHGe zkcFH+hDnI2x=WYDIK4Tvw+|~NEbbwg79RtTgc(^-l`q5p=2azx8G32yL8s>@Kap#| z>3QnT2!}tbpqf#JCEO%uX3|UL%8hpBm`Ktw}1h_x6;6NtL->GZl=YAawe7=?!1Z};|PV4DdmSFJ2oj2VpZ(be9X5}XuSAxTvn4L5Cly|I`)&2~X|Ja76-HsqCtNnx;3#@Bi_oc3IAZl(|1veR0ACQ7p4v0$ndn!mzUTkxfO_x%FHhR1tz z9j(Rifiy#x;tVSy^lYJZhZU5~58m^W2m%v%kN`5IKxu)i<$kp?oDfXu7Sna#6kQ0)kl zk9}km6)z74-djoIK9rFy1kmBNT*G0QpE*j!YLEFjt7-8Ir0vgCfyYjJw#pF}9gCgD zuFk3@7GvfIw{_^xGHKN#TAH{xGQTj^B!s$4*UJ{BA0Hbr-AR2G@AZX}Jbr`R3Xh)N zz}3x@Hb7u@xm_D&ClmdKZIW{YEw4~+hcUx(N>20!7<{4J;34k=Gc?-;3m$>wTPUYN z;c>YTdp(904hQ}la{M@)5uilELjF7lcvhR@n zO!LM%o8=2#Q?PWcw}kn`LtpA^KLQ^FU0tUr=iZ)hWBp zzIFv^1I~r}BxrXm_`Ptj*2;8<< zbiJmFRt~&urJMteB5C*_A;5iL7X)Rm-vcDd+JWOl@E&;-Mqkbz`7SJKQ;X%N1o8I( zy0lk*T=Vt`(4@QQjrRi7c z;sLoc=1ZG{d?V?3kW=vCL7Y8tKszYcg=sRi`BVp;T++ZBQb;DdPdg<0Vo5MbA#geO zeMkzCZpL<{oyA@OwD*ualENm$4)xle9Z$vEfK$4fiuU%(q<$ymV0XsP@>gs@IQ6(C zf?|Kcj|tS#nKX%k|Mo=M>s@qe?2Fair9ExE1$ybEya4Y8mBa899u{Ar%|t?uK_zmH6yvMG+|I|pgp$%J@ZY9~etY9LeN!Sg@WNM=E!B3| z85WE%IKkB3AHiPI)%_H7N>1`L1tOmK%3$`i<0-k7h>r_S%TW;)PqBk}h6`q3gglME zZaf9I0S_6~_*=9pt7AA79{tUd$_zP%ak&x-wG5>4ru%t$kal^X9`F=-w&?J1Ph|{` ze*^*xj1~<)jZ>N4qL^?G6Dr$dHri92%1+Du7#hadoxp5k$y?m*&&xBA7I;71+3SZr z7Ye}(^3RA(J9<%Gjmxx4kkS}*GQ&_i8$#PI;TYMGG6$>=b%55o(oMai7~jOz@qyBv z{giyr?>Q>GEXVpz5aP`?Fb>6^zbx0a885G9Z*Vz7{`6~;AAPCxceyJJ>g74dVfyyok>P!Q zX)R?UrJU@+A+-4_`~)z6<-XB= zD}@&lOf>=f%E}Px1u!>^;V<`%rkAhD<6{j%eOV8fFp&;y(3AN-hWjIV6nb6m5wKT( z#-+gndGzLWIh~6K07`zoGkizx%4RxrU2bfjx!8=;Y=Y2AcpaZlSxiwkAgD1(!mG-w z-EYWYP4s#atj(%1toL0Tto86=Nb_p^9MZCy4c}kCxvd)ad6~>+_|==+XyFZcj!;T1 zZ$g|dr9t{-_Du-xrLejo4dmAAPKK1?rS z{^*ej{z#L<54!C9jD$H1C+EpKazhmD(0{$J|B7J0A}D75$?8;kNA_(7u-Avo7~sU0 zXDmG5a&z2UTUKj~%a334UIR*|2|3{?`7V_5tIp7qcV)Oq<`+Mk3_l-qQ)Ixw@n$f( zc{PaFQt^0Na#!vMR@}JD8Cv@u^m?V#>mDZ{wxVe@ZF&-4)_mmC@ift9k(?f~$a!C0 zYC0nTZz@?(YEbEYxh*sn2FjFS3c?DjTmDhdEKSjn1o}fI2VzG%TPy>M6?BP#5$c2ZPWE|CU$GsE6$6->3g6ox$b zsFxBY-twj%UdkiZ;_;Afab}zCrLcrGX5{Os9LsyXlu+@|K05EEF!Z-TlQK$JL?4)x zHYjF?Nl8ZqskFzUIH3vH6_IeU}DW z6~%PN1e1LOAEha+D9fl`+Xz3v*+-KegqH&QAFW_$vbVxcvm?Bfn!Ktu4^dfDqby)=_$mV# z&wuw-S~Eq74YjcY%N8o!>o5?&4*GM2z=}X65>A2(7I-0F^YB~m={yMkN$&_jVihD-G%(VxB%05;S?(Iejz&)3 zpnJ>@v+Ip~->yXRu0Kx2+aa#s-;r2@PTCb8-q6~fa?pem)u`3Z#JEN$^@>FMP@EO? zRj@*DXrx_X+}*N_yVB#s5?-AW;7qbI183O)l13wg;ItHlsQ^Q8M3%;lLaOOhrFOWU@=B1_e}gPp zqO^FvjgRvyDPVsm3QJYm1sH!Sa_duIV5*YXW~e7wn}MwurNis<0aci-52z3iz`hXW z40$ki;)U^}R=USGQWkp&V+rIpbN6e8eg_W-Jcx47Y@sClnGpm=yy#xi8Y>)_l)GO< zhM9CFMm!7gF>Q;O~&8N#Ve>&v~U6i-TP8N-q}f81R^q zBrX>yXe57{GLk=yZN}3Nx|$`$0!H79&p(fQCS*bc5Ok(KbCo31Oc96oqLw3p^Y^&Y zTXP^r`tRW{nMA{XI`=1FWDS@@B+ksBZ_wM=U%g z*L}K&KdC$_U0KzM!J{)xQ#>Jc?$+ zCEL$XG>i7v$?3utHIpW~l)=I{cezVhA&9rXp^q|@`lg>uI8&sq9TiUY&WeRDXDHr& zu6Umc+XUtAt{X$c170@M<(^6c4eg9wvR9_UJOq&|6 z{4t67RHl*&R)=&_hK3gY63No-dP{T8;-&@j;r)hYc2fGA?gZl)?`cW^w%@qU3UejT z?W`~#(6Y{;6v&@lcv)IVkC3P~ySw|7%LRa!LXW zO1g4N9!&58LED(~jFPT8CEc)m&n2mw@)jo6s!M_4Rvd%8rLR7spSmdx;nQsGt~i-f z7ji68Q0NdKX?9l_Sb4wh%0*iR5773mJ(LXLC@t>cc^}e4aoun_-2=l|qx(ISgi4G#B>kMOG;~lzw+FR+)**N7Z<4@ z4>p6NTv0ED8O!6Sc<9NnIB)6REv6j?EftM?sM0uU{FL$-tJ#@f*d3=XDYu^Y^^?0GE38f|zU z(jihCK96!LWlm9o%-MRNk|o|1Y2iRFtDYKY$f}`KbSO8B!Uic0COan$Ql5dBJAIHM zfp#Mt$TQb1MmP{l{#82Y0hw83GIQc!B?})<8_Z?Y;=xJ^mr4&m3lVqW zN&f&k@QPv&(_NxXp^QAFJR$zAG5l}PLD zPt1}p{`4#RF=vBSvf+pS1pZ#>?uZ(cF+q9Eilvqt;d}3ih{aK=y!>eg?U|q;+07hp z=?jbW+j)Hr%zP~>9MIVje&WR&bOkS)kk1!cXEweZLk)`~>;QZ_6=~*nrow~v$H^J< zNG!m%%e|g>g_^tv{SItcmbfax%rv#{W8PH&9;7}o$pI|6*sY)O( z)MqjdRX5*Jeh}Rw3X~RJDDSgHiWI=CV9ULv8Jl^aIQ_9mY0zt^$Go6BJwuk%^~h|C z$=|Fm)mD$_Y>RSQA2{|s;80-*)cTTRm8jo<)KGfza%Ve$c$DC9UG*$VtQGf7(ht+B zLwnhkwtd3ab3*~GJF=n`x}y+lMc()Nc^kY3=uj$G6*OL~JQ-YQHspA2I&=D9-<-Nw zS#0^<3(hD$lzQ<~IHN348i}`~XzUWDv;GGg6%2bal&&mM9udB$x=WR(nZXh{7+Ln; za4J};REHsR(^6%w{(c~3&p}q;mp@e;0APCmQ>6($EBsVh2CfeM%;4%yFX`}HovYt` z#_0*wH$X$3ToX77sm0kD%4kkpXIbuG|*9-0{nlW&%$1RtU}9nP%8>46iEI zOUAJ!%lW=w$Q8zMy+VEl$Cx#f?L8-FmKu9ce1{9qQ1+2^VKnIrrN4-cz0Ci`aO!uo zm!JE?$&k~;`@!_v`$|R(%O+^JeIXNMfSyPjM+cL%w3PZxQJ%3*Ds6>;pSNl26y-<3 z<(~e5(uFk{2#-|s3{r01n`+F6iK2AZ4A1Q@xRhCQnHS*WLAyJ`CJD4JIGcdt=0wD5Sa0 zQ<(X?RUUSF#(jUDfX2iV&^(+v)`Q;3wVSzl21P$tmROR9rE+KvkrwJN|3}yMwM{<0|Df zaa{mS?eJ8%iTmPY{*7xY5Y`-6J)9NKbR^|Z+8h+TT2cP*C5~FH3=`JTudDf~)rNg3 z_sbVUS?gJ9VPt+bibcS;endj6|MsQwV)$RR6)kM`6?A0dso*PJ8)L)1wPuY{--kmV zbM48kuaq84=hWqErLC}*=xdzNC(@d)x%!~&Yo-@+$GVkR0ea*R8W9rbu$kH=2>y%( zP!DCTQBo4F2_8+avH1CUHZTd24EF7bw0aFM@X{Kkf0efKR&&0h1<$Ny`aIgTmbajE zt-?~vMbfGt%-DJ+NBWbx4pXojWerLS%dg%iR>-9MpI-rb^*ZGixXg7gCF`-haNUc8 z)Nhn`@jRX>T`qp3WO@`Zoi;$z2rK;0$Td{9LFtI+Md#wesoO?{DP{`3f@{>J;~&Ew z@1JI;o|~Y~MCoOT9^dK&%IP$nd5W#v1jQ)w7Wt9XVqZsExWwN|Wr;HWPE$ZlQD|j*B*9L}926#go=p8V zr=zRKiB0m;->D(Q(27E6j9nx>77-DcAV}GUr+_z8l^K8y+*2T|s33^OEQ|1?l%fI~ z1r{_2Km?aE(ko|9GG$Gl;&dl}3oTg{wH3F_cKnX3t(Jes)mHwSxylJ!8nb`5-VC*; zMuRtF$8^!O%}@fZ-=?c{0kvba4S zGNw^-O&{G~-GbR$vPF5EYmXplR(LDy`B5?D2i8p#>{Zlc%+5*Ae9zTn*&X{LwCj7W znz`JuFH3T<9<-mczO1}F0WEuh8*$l=51A;G2Ip6P|)i~r5VlNs(3>kW+Y;U zjL$`8tC4Ft0_w1$tx5{?XZh>v!`XlwKPqWZgmwQ>k(`<*3t;7E+^ax>77a=P$jVj8 z3k|KbLj!e*+oTih`5PM~3b7QvO-VB?65)NoTQzN)!aQ4MZ^PPnhP<~c1MzFbcCKZd zvRz?roM*Qyk6Xrvpq}cyp8RFAL!bszb}0QHR)ekIq15r^YA|oS9!vdpDzW6dQ&A0t z*i$=|4=v+ZQO^AMLrIvlfx8rzA87P0g+-`s+ojBfqVn0@ycxT8^JZMw&ATFfkJ1*N z+jVq7(?+YpN|D=Y4{!d`JzRAbTC6aijrx2raG#9?n^od*{@gudLa~yJrM6*yK`SRr zD%*>>&5k($6m52d(3N5+m%d(Mmcpci8+DKC+IzXQoczEM!YZZc8w3Vxr4B7cw@1T_ zoL@e;o}ofZrJyV3P%7N3)aNBfRFr%}FS)T^vXP_KD(PuvnP9uU#G{>S!U_q|Ba{2> zGgMbiD-6_no1-gA-nx&sxw&4lA>mu478Px-RLixf)caBDexu|^xZ02GuY6{v6_b5} zDfXb^7uJ%0E=Y_&H7n|xv!B;xI2#z!zt!+HU{n~&H}v?UTm|^Ba?C2Vu2}r=Qfn%H z<+F$?)#?BPdbKGP)eb(OH1HiNrRgM^@<)8#Pzdpxi&YSZEfiCzo3bDF4Y0yrp`tb_ zJ)k_!JEcWMx#W2I0p-`sO+XY@p7ZGF5>F}%*(MeA z*u@AscT(w$A2WuZi=ZwgN@H<-0Hqf+4yE}ekdMBnh3ifsPA%@7i4K;)2s|;Gidt6> zBl9UGj+K%1?ib;d{et8IN?3% z2`FK^(gL$|$?)VIGnB&M7Nq9|w*tnvWZdCs>q;mttl0XBN)J_PSr#Tdoj_xLR^I-{ zbZ`CW0lL5aMR`g5W+^p0%jJzpXO$P2ty9Q9RiAnEMfbYuPmXi&_sONib4ndC*F;4h zoC>AE=agXfBiFZiC{4!?yx_dnFO1e1e^|H;Z}p1K@ukb>;K7nh*Uu?+afv(6FCFyD z2>mh_7gkzXAEdlKd>#T!E?w52<)1RKAdLDK_`^0A_}93tTiFNB zi~NHo7x@QIU*vmD{zZkQB#fAq1={XigwPEOlLhy!FTuJ3QRRCUWSj*X7h2yl3bTN??rA>eyKe9-`>kKjPg>t19f=6=8l@Na&B#-|I4gssm6{q%X1oJ)%CK>#j5@&tqpi^p$A349lN9ipp z!ZX|EGN%*`96fLNZDh@ciT>ViPy@V05x?VuwfGkr80OQ`%0@Nn(vIGBGrQ^YL{k|osU76$su zH29YC9(Z&07M}z4s<5udZSHiJeOm!MP~JA2-?rWc^?k9a$4`hA9Qh}&#tLRL*L+gn zJJ63X&iznLI`Ik9>~y6s?m+k)N=NTN+jA<1N%Gz4?j0raVMU9t#PNIdf>Q6Ipl_#H zr2V2aZ$8_XyTYeZX=vU$%K_EVs=HWgyHoL9g{^V!%Xcwun6BP(Uuou}8z|y^CF&R& z5H_Y=f(Wa?zr#{tdq8RLQ61vcXmpOLFdiqyl_hlazS6_DqFG)f32M}se@}}zsJ*0{ z5j>E7h83J^GVco`&?wkwW*t1cvFhrfd7ktHz}3P*6QOt~yyL9D?+oH|x4^s*cxv9N zLwIXJTg0@H8rj@ty|y_>^24kBI_`j{vybX9zlFlRDd?nkNT3dO3ROK`3buF7FF%E7 zT}tV9!%S0r)L^Wp3w_i$E5M;70cA*2mw+H2wK_0abNyb#GU}_si;GS*+aF3#`KmVS zymNN`=E5P